All Downloads are FREE. Search and download functionalities are using the official Maven repository.

edu.uci.ics.jung.visualization.annotations.AnnotatingGraphMousePlugin Maven / Gradle / Ivy

/*
 * Copyright (c) 2005, The JUNG Authors
 *
 * All rights reserved.
 *
 * This software is open-source under the BSD license; see either
 * "license.txt" or
 * https://github.com/jrtom/jung/blob/master/LICENSE for a description.
 *
 */
package edu.uci.ics.jung.visualization.annotations;

import edu.uci.ics.jung.visualization.MultiLayerTransformer;
import edu.uci.ics.jung.visualization.RenderContext;
import edu.uci.ics.jung.visualization.VisualizationServer;
import edu.uci.ics.jung.visualization.VisualizationViewer;
import edu.uci.ics.jung.visualization.control.AbstractGraphMousePlugin;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Shape;
import java.awt.event.InputEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.awt.geom.RectangularShape;
import javax.swing.JComponent;
import javax.swing.JOptionPane;

/**
 * AnnotatingGraphMousePlugin can create Shape and Text annotations in a layer of the graph
 * visualization.
 *
 * @author Tom Nelson
 */
public class AnnotatingGraphMousePlugin extends AbstractGraphMousePlugin
    implements MouseListener, MouseMotionListener {

  /** additional modifiers for the action of adding to an existing selection */
  protected int additionalModifiers;

  /** used to draw a Shape annotation */
  protected RectangularShape rectangularShape = new Rectangle2D.Float();

  /** the Paintable for the Shape annotation */
  protected VisualizationServer.Paintable lensPaintable;

  /** a Paintable to store all Annotations */
  protected AnnotationManager annotationManager;

  /** color for annotations */
  protected Color annotationColor = Color.cyan;

  /** layer for annotations */
  protected Annotation.Layer layer = Annotation.Layer.LOWER;

  protected boolean fill;

  /** holds rendering transforms */
  protected MultiLayerTransformer basicTransformer;

  /** holds rendering settings */
  protected RenderContext rc;

  /** set to true when the AnnotationPaintable has been added to the view component */
  protected boolean added = false;

  /**
   * Create an instance with defaults for primary (button 1) and secondary (button 1 + shift)
   * selection.
   *
   * @param rc the RenderContext for which this plugin will be used
   */
  public AnnotatingGraphMousePlugin(RenderContext rc) {
    this(rc, InputEvent.BUTTON1_MASK, InputEvent.BUTTON1_MASK | InputEvent.SHIFT_MASK);
  }

  /**
   * Create an instance with the specified primary and secondary selection mechanisms.
   *
   * @param rc the RenderContext for which this plugin will be used
   * @param selectionModifiers for primary selection
   * @param additionalModifiers for additional selection
   */
  public AnnotatingGraphMousePlugin(
      RenderContext rc, int selectionModifiers, int additionalModifiers) {
    super(selectionModifiers);
    this.rc = rc;
    this.basicTransformer = rc.getMultiLayerTransformer();
    this.additionalModifiers = additionalModifiers;
    this.lensPaintable = new LensPaintable();
    this.annotationManager = new AnnotationManager(rc);
    this.cursor = Cursor.getPredefinedCursor(Cursor.HAND_CURSOR);
  }

  /** @return Returns the lensColor. */
  public Color getAnnotationColor() {
    return annotationColor;
  }

  /** @param lensColor The lensColor to set. */
  public void setAnnotationColor(Color lensColor) {
    this.annotationColor = lensColor;
  }

  /** the Paintable that draws a Shape annotation only while it is being created */
  class LensPaintable implements VisualizationServer.Paintable {

    public void paint(Graphics g) {
      Color oldColor = g.getColor();
      g.setColor(annotationColor);
      ((Graphics2D) g).draw(rectangularShape);
      g.setColor(oldColor);
    }

    public boolean useTransform() {
      return false;
    }
  }

  /**
   * Sets the location for an Annotation. Will either pop up a dialog to prompt for text input for a
   * text annotation, or begin the process of drawing a Shape annotation
   *
   * @param e the event
   */
  @SuppressWarnings("unchecked")
  public void mousePressed(MouseEvent e) {
    VisualizationViewer vv = (VisualizationViewer) e.getSource();
    down = e.getPoint();

    if (added == false) {
      vv.addPreRenderPaintable(annotationManager.getLowerAnnotationPaintable());
      vv.addPostRenderPaintable(annotationManager.getUpperAnnotationPaintable());
      added = true;
    }

    if (e.isPopupTrigger()) {
      String annotationString = JOptionPane.showInputDialog(vv, "Annotation:");
      if (annotationString != null && annotationString.length() > 0) {
        Point2D p = vv.getRenderContext().getMultiLayerTransformer().inverseTransform(down);
        Annotation annotation =
            new Annotation<>(annotationString, layer, annotationColor, fill, p);
        annotationManager.add(layer, annotation);
      }
    } else if (e.getModifiers() == additionalModifiers) {
      Annotation annotation = annotationManager.getAnnotation(down);
      annotationManager.remove(annotation);
    } else if (e.getModifiers() == modifiers) {
      rectangularShape.setFrameFromDiagonal(down, down);
      vv.addPostRenderPaintable(lensPaintable);
    }
    vv.repaint();
  }

  /** Completes the process of adding a Shape annotation and removed the transient paintable */
  @SuppressWarnings("unchecked")
  public void mouseReleased(MouseEvent e) {
    VisualizationViewer vv = (VisualizationViewer) e.getSource();
    if (e.isPopupTrigger()) {
      String annotationString = JOptionPane.showInputDialog(vv, "Annotation:");
      if (annotationString != null && annotationString.length() > 0) {
        Point2D p = vv.getRenderContext().getMultiLayerTransformer().inverseTransform(down);
        Annotation annotation =
            new Annotation(annotationString, layer, annotationColor, fill, p);
        annotationManager.add(layer, annotation);
      }
    } else if (e.getModifiers() == modifiers) {
      if (down != null) {
        Point2D out = e.getPoint();
        RectangularShape arect = (RectangularShape) rectangularShape.clone();
        arect.setFrameFromDiagonal(down, out);
        Shape s = vv.getRenderContext().getMultiLayerTransformer().inverseTransform(arect);
        Annotation annotation = new Annotation<>(s, layer, annotationColor, fill, out);
        annotationManager.add(layer, annotation);
      }
    }
    down = null;
    vv.removePostRenderPaintable(lensPaintable);
    vv.repaint();
  }

  /**
   * Draws the transient Paintable that will become a Shape annotation when the mouse button is
   * released
   */
  @SuppressWarnings("unchecked")
  public void mouseDragged(MouseEvent e) {
    VisualizationViewer vv = (VisualizationViewer) e.getSource();

    Point2D out = e.getPoint();
    if (e.getModifiers() == additionalModifiers) {
      rectangularShape.setFrameFromDiagonal(down, out);

    } else if (e.getModifiers() == modifiers) {
      rectangularShape.setFrameFromDiagonal(down, out);
    }
    rectangularShape.setFrameFromDiagonal(down, out);
    vv.repaint();
  }

  public void mouseClicked(MouseEvent e) {}

  public void mouseEntered(MouseEvent e) {
    JComponent c = (JComponent) e.getSource();
    c.setCursor(cursor);
  }

  public void mouseExited(MouseEvent e) {
    JComponent c = (JComponent) e.getSource();
    c.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
  }

  public void mouseMoved(MouseEvent e) {}

  /** @return the rect */
  public RectangularShape getRectangularShape() {
    return rectangularShape;
  }

  /** @param rect the rect to set */
  public void setRectangularShape(RectangularShape rect) {
    this.rectangularShape = rect;
  }

  /** @return the layer */
  public Annotation.Layer getLayer() {
    return layer;
  }

  /** @param layer the layer to set */
  public void setLayer(Annotation.Layer layer) {
    this.layer = layer;
  }

  /** @return the fill */
  public boolean isFill() {
    return fill;
  }

  /** @param fill the fill to set */
  public void setFill(boolean fill) {
    this.fill = fill;
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy