📄 gpmarqueehandler.java
字号:
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 + -