⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gpmarqueehandler.java

📁 用JGraph编的软件
💻 JAVA
📖 第 1 页 / 共 3 页
字号:

package org.jgraph.pad;

import java.awt.Color;
import java.awt.Container;
import java.awt.Cursor;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Polygon;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JPopupMenu;
import javax.swing.JToggleButton;
import javax.swing.JViewport;
import javax.swing.SwingUtilities;

import org.jgraph.GPGraphpad;
import org.jgraph.graph.BasicMarqueeHandler;
import org.jgraph.graph.CellView;
import org.jgraph.graph.ConnectionSet;
import org.jgraph.graph.GraphConstants;
import org.jgraph.graph.GraphModel;
import org.jgraph.graph.PortView;
import org.jgraph.pad.resources.Translator;

import org.jgpd.UI.utils.*;
import org.jgpd.jgraph.*;

/**
 * MarqueeHandler that can insert cells.
 *
 * @author sven.luzar
 * @version 1.0
 *
 */
public class GPMarqueeHandler
    extends BasicMarqueeHandler {

  int m_XDifference, m_YDifference, dx, dy;
  boolean m_dragging;
  Container c;

  /** A reference to the graphpad object
   */
  protected GPGraphpad graphpad;

  /** The default color for borders
   */
  protected transient Color defaultBorderColor = Color.black;

  protected transient JToggleButton buttonSelect = new JToggleButton();
  protected transient JToggleButton buttonText = new JToggleButton();
  protected transient JToggleButton buttonLine = new JToggleButton();
  protected transient JToggleButton buttonEdge = new JToggleButton();
  protected transient JToggleButton buttonZoomArea = new JToggleButton();
  protected transient JToggleButton buttonActivity = new JToggleButton();
  protected transient JToggleButton buttonDecision = new JToggleButton();
  protected transient JToggleButton buttonStart = new JToggleButton();
  protected transient JToggleButton buttonInter = new JToggleButton();
  protected transient JToggleButton buttonPool = new JToggleButton();
  protected transient JToggleButton buttonLane = new JToggleButton();

  /////////
  protected transient JToggleButton buttonSequence = new JToggleButton();
  protected transient JToggleButton buttonMessage = new JToggleButton();
  protected transient JToggleButton buttonAssociate = new JToggleButton();
  protected transient JToggleButton buttonInclusiveGateway = new JToggleButton();
  protected transient JToggleButton buttonParallelGateway = new JToggleButton();
  protected transient JToggleButton buttonComplexGateway = new JToggleButton();
  protected transient JToggleButton buttonSubProcess = new JToggleButton();
  protected transient JToggleButton buttonDataObj = new JToggleButton();
  protected transient JToggleButton buttonTextAnnotation = new JToggleButton();

  //////////
  protected transient JToggleButton buttonEnd = new JToggleButton();
  protected transient JToggleButton buttonSplit = new JToggleButton();
  protected transient JToggleButton buttonJoin = new JToggleButton();

  protected Point start, current;

  protected Rectangle bounds;

  protected PortView port, firstPort, lastPort;

  /**
   * Constructor for GPMarqueeHandler.
   */
  public GPMarqueeHandler(GPGraphpad graphpad) {
    super();
    this.graphpad = graphpad;
    ButtonGroup grp = new ButtonGroup();
    grp.add(buttonSelect);
    grp.add(buttonActivity);
    grp.add(buttonDecision);
    grp.add(buttonInter);
    grp.add(buttonPool);
    grp.add(buttonLane);
    grp.add(buttonSubProcess);
    grp.add(buttonDataObj);
    grp.add(buttonTextAnnotation);
    grp.add(buttonStart);
    grp.add(buttonEnd);
    grp.add(buttonSplit);
    grp.add(buttonJoin);
    grp.add(buttonText);
    grp.add(buttonLine);
    grp.add(buttonSequence);
    grp.add(buttonMessage);
    grp.add(buttonAssociate);
    grp.add(buttonEdge);
    grp.add(buttonZoomArea);
    grp.add(buttonInclusiveGateway);
    grp.add(buttonParallelGateway);
    grp.add(buttonComplexGateway);
  }

  /* Return true if this handler should be preferred over other handlers. */
  public boolean isForceMarqueeEvent(MouseEvent e) {
    return!buttonSelect.isSelected()
        || isPopupTrigger(e)
        || super.isForceMarqueeEvent(e);
  }

  protected boolean isPopupTrigger(MouseEvent e) {
    if (e == null) {
      return false;
    }
    return SwingUtilities.isRightMouseButton(e) && !e.isShiftDown();
  }

  public void mousePressed(MouseEvent event) {
    m_XDifference = event.getX();
    m_YDifference = event.getY();
    dx = 0;
    dy = 0;
    if (!isPopupTrigger(event)
        && !event.isConsumed()
        && !buttonSelect.isSelected()) {
      start = graphpad.getCurrentGraph().snap(event.getPoint());
      firstPort = port;
      if (buttonEdge.isSelected() && firstPort != null) {
        start =
            graphpad.getCurrentGraph().toScreen(
            firstPort.getLocation(null));
      }
      event.consume();
    }
    if (!isPopupTrigger(event)) {
      super.mousePressed(event);
    }
    else {
      boolean selected = false;
      Object[] cells = graphpad.getCurrentGraph().getSelectionCells();
      for (int i = 0; i < cells.length && !selected; i++) {
        selected =
            graphpad.getCurrentGraph().getCellBounds(
            cells[i]).contains(
            event.getPoint());
      }
      if (!selected) {
        graphpad.getCurrentGraph().setSelectionCell(
            graphpad.getCurrentGraph().getFirstCellForLocation(
            event.getX(),
            event.getY()));
      }
      event.consume();
    }
  }

  public void mouseDragged(MouseEvent event) {
    if (!event.isConsumed() && !buttonSelect.isSelected()) {
      Graphics g = graphpad.getCurrentGraph().getGraphics();

      Color bg = graphpad.getCurrentGraph().getBackground();
      Color fg = Color.black;
      g.setColor(fg);
      g.setXORMode(bg);
      overlay(g);
      current = graphpad.getCurrentGraph().snap(event.getPoint());
      if (buttonEdge.isSelected() || buttonSequence.isSelected() ||
          buttonMessage.isSelected() || buttonAssociate.isSelected()) {
        port =
            getPortViewAt(
            event.getX(),
            event.getY(),
            !event.isShiftDown());
        if (port != null) {
          current =
              graphpad.getCurrentGraph().toScreen(
              port.getLocation(null));
        }
      }

      bounds = new Rectangle(start).union(new Rectangle(current));
      // If any of the circle ( not ellipse ) drawing button actions
      // are being dragged, ensure we are drawing a circle by making
      // the smaller of the
      if (buttonStart.isSelected() || buttonEnd.isSelected() ||
          buttonMessage.isSelected()) {
        if (bounds.width > bounds.height) {
          bounds.setSize(bounds.width, bounds.width);
        }
        else {
          bounds.setSize(bounds.height, bounds.height);
        }
      }
      g.setColor(bg);
      g.setXORMode(fg);
      overlay(g);
      event.consume();
    }
    else if (
        !event.isConsumed()
        && isForceMarqueeEvent(event)
        && isPopupTrigger(event)) {
      c = graphpad.getCurrentGraph().getParent();
      if (c instanceof JViewport) {
        JViewport jv = (JViewport) c;
        Point p = jv.getViewPosition();
        int newX = p.x - (event.getX() - m_XDifference);
        int newY = p.y - (event.getY() - m_YDifference);
        dx += (event.getX() - m_XDifference);
        dy += (event.getY() - m_YDifference);

        int maxX =
            graphpad.getCurrentGraph().getWidth() - jv.getWidth();
        int maxY =
            graphpad.getCurrentGraph().getHeight() - jv.getHeight();
        if (newX < 0) {
          newX = 0;
        }
        if (newX > maxX) {
          newX = maxX;
        }
        if (newY < 0) {
          newY = 0;
        }
        if (newY > maxY) {
          newY = maxY;

        }
        jv.setViewPosition(new Point(newX, newY));
        event.consume();
      }
    }
    super.mouseDragged(event);
  }

  // Default Port is at index 0
  public PortView getPortViewAt(int x, int y, boolean jump) {
    Point sp = graphpad.getCurrentGraph().fromScreen(new Point(x, y));
    PortView port = graphpad.getCurrentGraph().getPortViewAt(sp.x, sp.y);
    // Shift Jumps to "Default" Port (child index 0)
    if (port == null && jump) {
      Object cell =
          graphpad.getCurrentGraph().getFirstCellForLocation(x, y);
      if (graphpad.getCurrentGraph().isVertex(cell)) {
        Object firstChild =
            graphpad.getCurrentGraph().getModel().getChild(cell, 0);
        CellView firstChildView =
            graphpad
            .getCurrentGraph()
            .getGraphLayoutCache()
            .getMapping(
            firstChild,
            false);
        if (firstChildView instanceof PortView) {
          port = (PortView) firstChildView;
        }
      }
    }
    return port;
  }

  public void mouseReleased(MouseEvent event) {

    // precondition test
    /* we don't want to have a
     * Default Esc Action

       if (event == null) {
     Action a =
      graphpad.getCurrentActionMap().get(
       Utilities.getClassNameWithoutPackage(FileClose.class));
     if (a != null)
      a.actionPerformed(new ActionEvent(this, 0, "FileClose"));
     return;

       }
     */

    GraphModelProvider gmp = graphpad.getCurrentGraphModelProvider();
    GraphModel model = graphpad.getCurrentGraph().getModel();


    if (isPopupTrigger(event)) {
      if (Math.abs(dx) < graphpad.getCurrentGraph().getTolerance()
          && Math.abs(dy) < graphpad.getCurrentGraph().getTolerance()) {
        Object cell =
            graphpad.getCurrentGraph().getFirstCellForLocation(
            event.getX(),
            event.getY());
        if (cell == null) {
          graphpad.getCurrentGraph().clearSelection();
        }
        Container parent = graphpad.getCurrentGraph();
        do {
          parent = parent.getParent();
        }
        while (parent != null && ! (parent instanceof GPGraphpad));

        GPGraphpad pad = (GPGraphpad) parent;
        if (pad != null) {
          JPopupMenu pop = pad.getBarFactory().createGraphPopupMenu();

          pop.show(
              graphpad.getCurrentGraph(),
              event.getX(),
              event.getY());
        }
      }
      event.consume();
    }
    else if (
        event != null
        && !event.isConsumed()
        && !buttonSelect.isSelected()) {
      if (bounds == null) {
        // if no bounds have been set this might be because
        // the user wants a default size
        if (buttonActivity.isSelected()) {
          bounds = new Rectangle(event.getX(),
                                 event.getY(),
                                 ActivityView.default_width,
                                 ActivityView.default_height);
        }
        else if (buttonDecision.isSelected()) {
          bounds = new Rectangle(event.getX(),
                                 event.getY(),
                                 DecisionView.default_width,
                                 DecisionView.default_height);
        }
        //inclusive selected
        else if (buttonInclusiveGateway.isSelected()) {
          bounds = new Rectangle(event.getX(),
                                 event.getY(),
                                 InclusiveGatewayView.default_width,
                                 InclusiveGatewayView.default_height);
        }
        //buttonParallelGateway selected
        else if (buttonParallelGateway.isSelected()) {
          bounds = new Rectangle(event.getX(),
                                 event.getY(),
                                 ParallelGatewayView.default_width,
                                 ParallelGatewayView.default_height);
        }
        //buttonComplexGateway selected
        else if (buttonComplexGateway.isSelected()) {
          bounds = new Rectangle(event.getX(),
                                 event.getY(),
                                 ComplexGatewayView.default_width,
                                 ComplexGatewayView.default_height);
        }

        else if (buttonPool.isSelected()) {
          bounds = new Rectangle(event.getX(),
                                 event.getY(),
                                 PoolView.default_width,
                                 PoolView.default_height);
        }
        else if (buttonLane.isSelected()) {
          bounds = new Rectangle(event.getX(),
                                 event.getY(),
                                 LaneView.default_width,
                                 LaneView.default_height);
        }
        //buttonSubProcess
        else if (buttonSubProcess.isSelected()) {
          bounds = new Rectangle(event.getX(),
                                 event.getY(),
                                 SubProcessView.default_width,
                                 SubProcessView.default_height);
        }
        //buttonDataObj
        else if (buttonDataObj.isSelected()) {
          bounds = new Rectangle(event.getX(),
                                 event.getY(),
                                 DataObjView.default_width,
                                 DataObjView.default_height);
        }
        //buttonTextAnnotation
        else if (buttonTextAnnotation.isSelected()) {
          bounds = new Rectangle(event.getX(),
                                 event.getY(),
                                 TextAnnotationView.default_width,
                                 TextAnnotationView.default_height);
        }

        else if (buttonInter.isSelected()) {
          bounds = new Rectangle(event.getX(),
                                 event.getY(),
                                 InterView.defaultWidth,
                                 InterView.defaultHeight);
        }

        else if (buttonStart.isSelected()) {
          bounds = new Rectangle(event.getX(),
                                 event.getY(),
                                 StartView.defaultWidth,
                                 StartView.defaultHeight);
        }
        else if (buttonEnd.isSelected()) {
          bounds = new Rectangle(event.getX(),
                                 event.getY(),
                                 EndView.defaultWidth,
                                 EndView.defaultHeight);
        }
        else if (buttonSplit.isSelected()) {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -