Copying an image of the graph view to the system clipboard
Applies to: yFiles for Java 2.9, 2.8, 2.7, 2.6, 2.5, 2.4, 2.3, 2.2 print article email article

Type: Tips & Tricks

Describes how to put a selected region of the graph view as an image to the system clipboard.

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.

Keywords: System clipboard - clipboard - select region - view mode - image

Provide feedback:
How useful was this article?    less 1 2 3 4 5 more
Email address (optional):
COPYRIGHT © 2012 yWorks · ALL RIGHTS RESERVED imprint | terms of use | privacy policy | home