📄 eventdispatcher.java
字号:
int actualMouseY =mouseY;
//get a move case of normal, shift down or control down.
int moveCase =ShapeConst.MOVEMENT_NORMAL;
if (e.isShiftDown())
moveCase =ShapeConst.MOVEMENT_SHIFTDOWN;
if (e.isControlDown())
moveCase =ShapeConst.MOVEMENT_CTRLDOWN;
//Graphics context
Graphics g;
AbstractShape drawObj;
Node dragNode;
Label moveLabel;
//do routine for each event type.
switch (eventType){
case MouseEvent.MOUSE_CLICKED:
if (isLeftDown(e)){
if (e.getClickCount()==2){
if (m_selection.size()>0){
if (m_selection.modifyLabel(m_drawCanvas,m_drawCanvas.getOperationManager())){
//first graph event: shape property changed
m_graphEventDispatcher.fireShapePropertyChanged(m_selection.getList());
m_drawCanvas.repaint();
}
}
}
}
break;
case MouseEvent.MOUSE_DRAGGED:
snapPos =gridFormat.getSnapPos(mouseX,mouseY);
mouseX =(int)snapPos.getX();
mouseY =(int)snapPos.getY();
if (m_startPick){
rangePickTo(mouseX,mouseY);
}else{
//Graphics context
g =m_drawCanvas.getGraphics();
//if there are some shapes in selection, drag them here.
if (m_selection.size()>0){
dragNode = m_selection.getDraggingNode();
moveLabel = m_selection.getMoveLabel();
//if current dragging node's parent is rotatable.
boolean parentRotatable =false;
AbstractShape shape =null;
if (dragNode!=null){
AbstractObject parent =dragNode.getParent();
if (parent!=null && parent instanceof AbstractShape){
shape =(AbstractShape)parent;
parentRotatable =((AbstractShape)parent).isRotatable();
}
}
if (m_selection.size()>0 && dragNode!=null && m_drawState.isRotating() && parentRotatable && dragNode.isRotatable()){
if (shape!=null && shape.isDisableMotion()){
//disabled motion here, so clear dragnode
dragNode =null;
}else{
//drag to rotate objects
m_startRotation =true;
mouseX =actualMouseX;
mouseY =actualMouseY;
//first graph event: shape rotating
m_graphEventDispatcher.fireShapeRotating(m_selection.getList(),m_lastMousePos.getX(),m_lastMousePos.getY(),mouseX,mouseY);
m_selection.rotateObjects(mouseX,mouseY,g);
}
}else if (dragNode!=null && m_selection.size()==1 && !m_drawState.isRotating()){
if (shape!=null && shape.isDisableScaling()){
//disabled scaling here, so clear dragnode
dragNode =null;
m_startDraggingNode =false;
//change roate action to move selection action now.
if (!shape.isDisableMotion()){
m_startMove =true;
//first graph event: shape moving
m_graphEventDispatcher.fireShapeMoving(m_selection.getList(),m_lastMousePos.getX(),m_lastMousePos.getY(),mouseX,mouseY);
m_selection.moveTo(mouseX,mouseY,g);
}
}else{
//register a start move node operations to operation manager.
if (!m_startDraggingNode){
m_drawCanvas.getOperationManager().addStartMoveNode(dragNode);
}
//get an actual moving position
m_movingPoint.setValue(mouseX,mouseY);
m_movingPoint =shape.getMoveNodePos(dragNode,m_movingPoint,moveCase);
mouseX =(int)m_movingPoint.getX();
mouseY =(int)m_movingPoint.getY();
m_startDraggingNode =true;
//first graph event: node moving
m_graphEventDispatcher.fireNodeMoving(dragNode,m_lastMousePos.getX(),m_lastMousePos.getY(),mouseX,mouseY);
//dragging node of one shape now.
m_selection.dragNode(mouseX,mouseY,g);
catchPort(actualMouseX,actualMouseY);
}
}else if (moveLabel!=null && m_selection.size()==1 && !m_drawState.isRotating()){
//assume not disabled modifying properties:
if (shape!=null && shape.isDisableModifyingProperties()){
dragNode =null;
//change roate action to move selection action now.
if (!shape.isDisableMotion()){
m_startMove =true;
//first graph event: shape moving
m_graphEventDispatcher.fireShapeMoving(m_selection.getList(),m_lastMousePos.getX(),m_lastMousePos.getY(),mouseX,mouseY);
m_selection.moveTo(mouseX,mouseY,g);
}
}else{
m_startMoveLabel =true;
JFPoint lastMouse =m_lastMousePos;
//first graph event: label moving
m_graphEventDispatcher.fireLabelMoving(m_selection.getMoveLabel(),lastMouse.getX(),lastMouse.getY(),mouseX,mouseY);
m_selection.dragLabel(lastMouse.getX(),lastMouse.getY(),mouseX,mouseY,g);
}
}else{
if (shape!=null && shape.isDisableMotion()){
//disabled motion
dragNode =null;
}else{
//move selection now.
m_startMove =true;
//first graph event: shape moving
m_graphEventDispatcher.fireShapeMoving(m_selection.getList(),m_lastMousePos.getX(),m_lastMousePos.getY(),mouseX,mouseY);
m_selection.moveTo(mouseX,mouseY,g);
}
}
}
g.dispose();
}
m_lastMousePos.setValue(mouseX,mouseY);
break;
case MouseEvent.MOUSE_ENTERED:
break;
case MouseEvent.MOUSE_EXITED:
break;
case MouseEvent.MOUSE_MOVED:
//set current mouse cursor
if (m_selection.size()==0){
Cursor cursor =m_drawCanvas.getCursor();
if (cursor.getType()!=Cursor.DEFAULT_CURSOR)
m_drawCanvas.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
}else{
JFPoint pnt =new JFPoint(mouseX,mouseY);
Node node;
Label aLabel =null;
if (m_drawState.isRotating()){
node =m_selection.nodeIntersects(pnt,Node.NODEUSAGE_ROTATE);
if (node!=null){
AbstractShape shape =(AbstractShape)node.getParent();
if (!node.isRotatable() || !shape.isRotatable())
m_drawCanvas.setCursor(new Cursor(Cursor.MOVE_CURSOR));
else
m_drawCanvas.setCursor(new Cursor(Cursor.HAND_CURSOR));
}else{
g =m_drawCanvas.getGraphics();
aLabel =m_selection.labelIntersects(g,pnt);
}
}else{
node =m_selection.nodeIntersects(pnt,Node.NODEUSAGE_MOVE);
if (node!=null){
if (m_selection.size()==1)
m_drawCanvas.setCursor(new Cursor(Cursor.NW_RESIZE_CURSOR));
else
m_drawCanvas.setCursor(new Cursor(Cursor.MOVE_CURSOR));
}else{
g =m_drawCanvas.getGraphics();
aLabel =m_selection.labelIntersects(g,pnt);
}
}
if (node==null){
if (aLabel!=null){
if (m_selection.size()>1 || m_drawState.isRotating())
m_drawCanvas.setCursor(new Cursor(Cursor.MOVE_CURSOR));
else
m_drawCanvas.setCursor(new Cursor(Cursor.HAND_CURSOR));
}else{
AbstractObject obj =m_selection.intersects(pnt);
if (obj==null)
m_drawCanvas.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
else
m_drawCanvas.setCursor(new Cursor(Cursor.MOVE_CURSOR));
}
}
}
break;
case MouseEvent.MOUSE_PRESSED:
clearPort(false);
//Graphics context
g =m_drawCanvas.getGraphics();
JFPoint pnt =new JFPoint(mouseX,mouseY);
//try to pick up some shapes.
AbstractObject obj;
Node node =null;
Label aLabel=null;
//firstly try to pickup nodes from selection.
if (m_drawState.isRotating())
node =m_selection.nodeIntersects(pnt,Node.NODEUSAGE_ROTATE);
else{
node =m_selection.nodeIntersects(pnt,Node.NODEUSAGE_MOVE);
aLabel =m_selection.labelIntersects(g,pnt);
}
if (node!=null){
obj =node.getParent();
}else if (aLabel!=null){
obj =aLabel.getParent();
}else{
obj =m_selection.intersects(pnt);
if (obj==null)
obj =m_page.pickBy(g,pnt);
}
//no objects selected.
if (obj==null){
if (m_selection.size()>0){
m_selection.clear();
m_drawCanvas.repaint();
}
//try to start a rectangle range start
m_startPick =true;
m_pickStartPoint.setValue(mouseX,mouseY);
m_pickEndPoint.setValue(mouseX,mouseY);
}else{
//if this new object selected is already existed in the selection.
boolean existentObj =false;
//if re-selected an object that is already inside the selection.
boolean reselected =false;
//if ctrl of shift key down.
boolean ctrlDown =e.isControlDown() || e.isShiftDown();
if (m_selection.contains(obj)){
existentObj =true;
//re-select an object while ctrl down will remove it from selection.
if (ctrlDown && (node==null || m_selection.size()>1)){
m_selection.remove(obj);
reselected =true;
m_drawCanvas.repaint();
}
}else{
//obj is not inside the selection,so
//if not CTRL or SHIFT key down, then clear the old selection,
//otherwise we should treat that as a MULTI-CHOOSE operation.
if (!ctrlDown)
m_selection.clear();
m_selection.add(obj);
m_drawAdapter.notifyObjectSelected(m_selection.getList());
if (obj instanceof AbstractShape){
((AbstractShape)obj).drawPicked(g,m_drawState.isRotating());
}
}
if (reselected){
//first graph event: shape selected
m_graphEventDispatcher.fireShapeSelected(m_selection.getList(),mouseX,mouseY);
}else{
//set an original point for selection.
if (node!=null && m_selection.size()==1){
m_selection.setOriginalPoint(new JFPoint(node.getXOffset(),node.getYOffset()));
//first graph event: node selected
m_graphEventDispatcher.fireNodeSelected(node,node.getXOffset(),node.getYOffset());
}else{
m_selection.setOriginalPoint(new JFPoint(mouseX,mouseY));
//first graph event: shape selected
m_graphEventDispatcher.fireShapeSelected(m_selection.getList(),mouseX,mouseY);
}
//if only an object selected, then try to find out if the node of current shape will be dragged.
m_selection.setDraggingNode(null);
m_startDraggingNode =false;
//if only an object selected, then try to find out if the internal label of current shape will be dragged.
m_selection.setMoveLabel(null);
m_startMoveLabel =false;
if (m_selection.size()>=1){
if (obj instanceof AbstractShape && existentObj){
drawObj =(AbstractShape)obj;
moveLabel =null;
node =null;
if (m_drawState.isRotating() && drawObj.isRotatable()){
node =drawObj.nodeIntersects(pnt,Node.NODEUSAGE_ROTATE);
}else{
node =drawObj.nodeIntersects(pnt,Node.NODEUSAGE_MOVE);
drawObj.startMoveNode(node);
if (node==null){
moveLabel =drawObj.labelIntersects(g,pnt);
}
}
m_selection.setDraggingNode(node);
m_selection.setMoveLabel(moveLabel);
//first graph event: label selected
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -