Copying an image of the graph view to the system clipboard

Tips & Tricks

Summary

Describes how to put a selected region of the graph view as an image to the system clipboard.
For a better user experience, please go to the integrated documentation viewer to read this article.

Description

The following demo shows hows to put a selected region of the graph view as an image to the system clipboard. Additionally this demo shows how to implement a view mode that allows to select a region within the graph view.

package demo.view;

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.datatransfer.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.IOException;

import javax.swing.AbstractAction;
import javax.swing.JToggleButton;
import javax.swing.JToolBar;

import y.view.Drawable;
import y.view.Graph2D;
import y.view.Graph2DView;
import y.view.ViewMode;

/**
 * This demo shows how to copy a selected region of the graph view
 * as an image to the system clipboard. 
 */
public class CopyViewToClipboardDemo extends ViewActionDemo
{
  SelectRegionViewMode selectRegionMode;
  public CopyViewToClipboardDemo()
  {
    selectRegionMode = new SelectRegionViewMode();
  }

  protected JToolBar createToolBar()
  {
    JToolBar bar = super.createToolBar();

    JToggleButton btn = new JToggleButton("Activate Selection Mode");
    btn.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent ev)
      {
        JToggleButton btn = (JToggleButton)ev.getSource();
        if(btn.isSelected())
        {
          view.removeViewMode(editMode);
          view.addViewMode(selectRegionMode);
        }
        else
        {
          selectRegionMode.reactivateParent();
          view.removeViewMode(selectRegionMode);
          view.addViewMode(editMode);
        }
      }});

    bar.add(btn);

    bar.add(new CopyRegionAction());
    return bar;
  }


  /**
   * Simple view mode that allows to select a region of the view for
   * further processing purposes.
   */
  static class SelectRegionViewMode extends ViewMode
  {
    SelectedRegion region = null;
    Point2D pivot;

    public void mousePressedLeft(double x, double y)
    {
      pivot = new Point2D.Double(x,y);
    }

    public void mouseDraggedLeft(double x, double y)
    {
      if(region == null)
      {
        region = new SelectedRegion();
        view.addDrawable(region);
      }
      region.setFrameFromDiagonal(pivot, new Point2D.Double(x,y));
      view.updateView();
    }

    public void mouseReleasedLeft(double x, double y)
    {
      if(region != null)
      {
        region.setFrameFromDiagonal(pivot, new Point2D.Double(x,y));
        view.updateView();        
      }
    }

    public void reactivateParent()
    {
      view.removeDrawable(region);
      region = null;
      view.updateView();
    }
  }

  /**
   * Simple graphical representation of the selected region
   */
  static class SelectedRegion extends Rectangle2D.Double implements Drawable
  {
    public void paint(Graphics2D gfx)
    {
      gfx.setColor(Color.black);
      gfx.draw(this);
    }
  }

  class CopyRegionAction extends AbstractAction 
  {
    CopyRegionAction()
    {
      super("Copy Region to Clipboard");
    }

    public void actionPerformed(ActionEvent ev)
    {
      Rectangle2D region = selectRegionMode.region;
      if(region != null)
      {
        Graph2D graph = view.getGraph2D();
        Graph2DView viewPort = new Graph2DView(graph);
        graph.setCurrentView(viewPort);
        viewPort.setSize((int)region.getWidth(), (int)region.getHeight());
        viewPort.setViewPoint2D(region.getX(), region.getY());

        BufferedImage image = new BufferedImage(viewPort.getWidth(), viewPort.getHeight(), BufferedImage.TYPE_INT_ARGB);
        viewPort.paintVisibleContent((Graphics2D)image.getGraphics());
        ImageTransferable it = new ImageTransferable(image);
        Clipboard clip=Toolkit.getDefaultToolkit().getSystemClipboard();
        clip.setContents(it,it);
        graph.removeView(viewPort);
      }
    }  
  }

  /**
   * Transferable used to communicate with the system clipboard.
   */
  static class ImageTransferable implements Transferable, ClipboardOwner
  {
    Image image;
    ImageTransferable(Image img)
    {
      this.image = img;
    }
    public DataFlavor[] getTransferDataFlavors()
    {
      return new DataFlavor[]{DataFlavor.imageFlavor};
    }
    public boolean isDataFlavorSupported(DataFlavor flavor)
    {
      return DataFlavor.imageFlavor.equals(flavor);
    }
    public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException
    {
      return image;
    }
    //empty ClipBoardOwner implementation
    public void lostOwnership(Clipboard clipboard, Transferable contents) {}
  }

  public static void main(String args[])
  {
    CopyViewToClipboardDemo demo = new CopyViewToClipboardDemo();
    demo.start(demo.getClass().getName());
  }

}

Note that this demo inherits from the yFiles demo class demo.view.ViewActionDemo. Therefore to test this demo it is adviced to place it in the yFiles demo folder demo/view.

Resources

Categories this article belongs to:
yFiles for Java > yFiles Viewer > Displaying and Editing Graphs > Advanced Application Logic
Applies to:
yFiles for Java 2: 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 2.10, 2.11, 2.12, 2.13, 2.14, 2.15, 2.16, 2.17, 2.18
Keywords:
System clipboard - clipboard - select region - view mode - image