📄 eventdispatcher.java
字号:
/**
* $Id:EventDispatcher.java $
*
* Copyright 2004 ~ 2005 JingFei International Cooperation LTD. All rights reserved. *
*/
package com.jfimagine.jfdraw.draw;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Color;
import java.awt.event.MouseEvent;
import java.awt.event.InputEvent;
import java.awt.geom.GeneralPath;
import java.awt.Dimension;
import java.awt.BasicStroke;
import java.awt.Cursor;
import java.awt.event.KeyEvent;
import java.awt.event.ActionEvent;
import javax.swing.JPopupMenu;
import javax.swing.JFrame;
import javax.swing.JApplet;
import com.jfimagine.jfgraph.event.*;
import com.jfimagine.jfdraw.draw.AbstractDrawEvent;
import com.jfimagine.jfdraw.draw.EventFactory;
import com.jfimagine.jfdraw.draw.DrawConst;
import com.jfimagine.jfdraw.gui.DrawAdapter;
import com.jfimagine.jfdraw.gui.DrawCanvas;
import com.jfimagine.jfdraw.gui.CADPane;
import com.jfimagine.jfdraw.gui.GUIUtils;
import com.jfimagine.jfdraw.gui.ToolFactory;
import com.jfimagine.jfgraph.geom.JFPoint;
import com.jfimagine.jfgraph.geom.Rect;
import com.jfimagine.jfgraph.shape.base.AbstractObject;
import com.jfimagine.jfgraph.shape.base.AbstractShape;
import com.jfimagine.jfgraph.shape.base.ObjectList;
import com.jfimagine.jfgraph.shape.union.JFPage;
import com.jfimagine.jfgraph.shape.base.Node;
import com.jfimagine.jfgraph.shape.base.Port;
import com.jfimagine.jfgraph.shape.base.Label;
import com.jfimagine.jfgraph.shape.base.ShapeConst;
import com.jfimagine.jfgraph.shape.decorate.GridFormat;
/**
* Draw event dispatcher. It's a main class to receive and dispatch drawing canvas mouse events to proper routines.
*
* @author CookieMaker
*
* @version $Revision: 1.00 $
*/
public class EventDispatcher {
/** A Draw Adapter reference*/
private DrawAdapter m_drawAdapter;
/** A Draw canvas reference to dispatch events */
private DrawCanvas m_drawCanvas;
/** A draw state of current draw canvas */
private DrawState m_drawState;
/** A drawing page*/
private JFPage m_page;
/** A CAD selection for current shape objects.*/
protected Selection m_selection;
/** This startPick flag is used to indicate that a rectangle-range pick is started*/
private boolean m_startPick =false;
//x,y coordinates of the point to start a new rectangle-range pick.
private JFPoint m_pickStartPoint =new JFPoint();
private JFPoint m_pickEndPoint =new JFPoint();
/** A last mouse position that represents an useful last mouse position
* 'Useful' means a last drag,mouse down or other positions, but not a simple mouse move position.
*/
private JFPoint m_lastMousePos =new JFPoint();
/** The last bounds of current selection.
*/
private Rect m_lastSelectionBounds =new Rect();
/** This startDraggingNode flag is used to indicate that node is started to be dragged*/
private boolean m_startDraggingNode =false;
/** This startMoveLabel flag is used to indicate that the internal label is started to be moved*/
private boolean m_startMoveLabel =false;
/** This startRotation flag is used to indicate that the objects in selection is started to be rotated*/
private boolean m_startRotation =false;
/** This startMove flag is used to indicate that the objects in selection is started to be moved*/
private boolean m_startMove =false;
/** Graph event dispatcher**/
private GraphEventDispatcher m_graphEventDispatcher;
/** Constructor */
public EventDispatcher(DrawAdapter drawAdapter,DrawCanvas drawCanvas){
this.m_drawAdapter =drawAdapter;
this.m_drawCanvas =drawCanvas;
//draw state
this.m_drawState =drawCanvas.getDrawState();
//drawing page
this.m_page =drawCanvas.getDrawPage();
this.m_selection =drawCanvas.getSelection();
//graph event dispatcher.
m_graphEventDispatcher =new GraphEventDispatcher(drawAdapter);
}
/** test if a left mouse button is pressed down */
private boolean isLeftDown(MouseEvent e){
return e.getModifiers()==InputEvent.BUTTON1_MASK;
}
/** test if a right mouse button is pressed down */
private boolean isRightDown(MouseEvent e){
return e.isMetaDown();
}
/** fire an mouse event*/
public void fireEvent(MouseEvent e){
if (m_drawState.getDrawState()==DrawConst.DRAWSTATE_DRAW){
m_startPick =false;
m_startMove =false;
dispatchEvent(e);
}else{
doAlteration(e);
}
}
/** draw a rectangle range that pick to
* @param x,y The other point of the pick range.
*/
private void drawRectTo(float x, float y){
float startX =(float)m_pickStartPoint.getX();
float startY =(float)m_pickStartPoint.getY();
if (startX==x && startY==y)
return;
double zoom =m_drawCanvas.getZoomScale();
x =(float)(x * zoom);
y =(float)(y * zoom);
startX =(float)(startX * zoom);
startY =(float)(startY * zoom);
GeneralPath rect= new GeneralPath(GeneralPath.WIND_EVEN_ODD);
rect.moveTo(startX,startY);
rect.lineTo(x,startY);
rect.lineTo(x,y);
rect.lineTo(startX,y);
rect.closePath();
Graphics2D g2 =(Graphics2D)m_drawCanvas.getGraphics();
BasicStroke s=new BasicStroke(1,
BasicStroke.CAP_SQUARE,
BasicStroke.JOIN_MITER,
10.0f,
new float[] {2,4},
0.0f);
g2.setStroke(s);
g2.setXORMode(Color.gray);
g2.draw(rect);
}
/** draw a rectangle range that pick to
* @param x,y The other point of the pick range.
*/
private void rangePickTo(float x, float y){
//eliminate last xor rectangle.
drawRectTo((float)m_pickEndPoint.getX(),(float)m_pickEndPoint.getY());
//draw new xor rectangle.
m_pickEndPoint.setValue(x,y);
drawRectTo((float)m_pickEndPoint.getX(),(float)m_pickEndPoint.getY());
}
/** Finish a rectangle-range pick operation.
* @param x,y The other point of the pick range.
*/
private void finishRangePick(float x, float y){
//eliminate last xor rectangle.
drawRectTo((float)m_pickEndPoint.getX(),(float)m_pickEndPoint.getY());
m_startPick =false;
m_pickEndPoint.setValue(x,y);
double x1 =Math.min(m_pickStartPoint.getX(),m_pickEndPoint.getX());
double y1 =Math.min(m_pickStartPoint.getY(),m_pickEndPoint.getY());
double w =Math.abs(m_pickStartPoint.getX()-m_pickEndPoint.getX());
double h =Math.abs(m_pickStartPoint.getY()-m_pickEndPoint.getY());
if (w==0 || h==0)
return;
Graphics g =m_drawCanvas.getGraphics();
ObjectList objList=m_page.pickBy(g,new Rect(x1,y1,w,h));
g.dispose();
if (objList.size()>0){
m_selection.add(objList);
m_drawAdapter.notifyObjectSelected(m_selection.getList());
m_drawCanvas.repaint();
}
}
/** last port caught.*/
private Port lastPort=null;
/** Try to catch a port in current layer of current page.
* @param x,y The point to be measured.
*/
private boolean catchPort(float x, float y){
//if this page is disabled in port snapping?
JFPage page =m_drawCanvas.getDrawPage();
if (page.isDisablePortSnapping()){
return false;
}
int drawState =m_drawState.getDrawState();
if (!m_startDraggingNode && drawState!=DrawConst.DRAWSTATE_DRAW)
return false;
AbstractObject parent;
if (m_startDraggingNode){
//look for current dragging node's parent shape
if (!m_selection.isDraggingPortAlso())
return false;
Node dragNode = m_selection.getDraggingNode();
parent =dragNode.getParent();
}else{
//look for current drawing shape.
parent =m_drawState.getCurrentShape();
}
if (parent==null)
return false;
//only allow opened shape:line,curve,arc,etc. to catch port while drawing.
if (!((AbstractShape)parent).isOpenShape())
return false;
Graphics g =m_drawCanvas.getGraphics();
Port port =m_page.portIntersects(new JFPoint(x,y),parent);
if (lastPort!=port){
//clear last port's hight light hint
if (lastPort!=null)
lastPort.draw(g,true);
lastPort =port;
if (lastPort!=null)
lastPort.draw(g,true);
}
return lastPort!=null;
}
/** Clear port caught.
*/
private void clearPort(boolean hidePort){
//clear last port's hight light hint
if (hidePort){
if (lastPort!=null){
Graphics g =m_drawCanvas.getGraphics();
lastPort.draw(g,true);
}
}else{
lastPort =null;
}
}
/**A temporary moving point for mouse move event*/
private JFPoint m_movingPoint =new JFPoint();
/** do some alterration of shapes, e.g. move, rotate, etc.*/
private void doAlteration(MouseEvent e){
//get a mouse event type
int eventType =e.getID();
double zoom =m_drawCanvas.getZoomScale();
int mouseX =(int)(e.getX()/zoom);
int mouseY =(int)(e.getY()/zoom);
Dimension d =m_drawCanvas.getOriginalSize();
if (mouseX<0) mouseX =0;
if (mouseY<0) mouseY =0;
//we used page bounds to restrict mouse area.
if (m_drawCanvas.isUsePageBounds()){
if (mouseX>d.getWidth()) mouseX =(int)d.getWidth();
if (mouseY>d.getHeight()) mouseY =(int)d.getHeight();
}
GridFormat gridFormat =m_drawCanvas.getGridFormat();
JFPoint snapPos;
int actualMouseX =mouseX;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -