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

📄 eventdispatcher.java

📁 用Java开发的、实现类似Visio功能的应用程序源码
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
				  				if (moveLabel!=null && m_selection.size()==1){
				  					m_graphEventDispatcher.fireLabelSelected(moveLabel,mouseX,mouseY);
				  				}

    							}
    						}
    					}

    				}
    				g.dispose();
				
				m_lastMousePos.setValue(mouseX,mouseY);
				//m_drawCanvas.lastMousePos is used to pre-decide a mouse position for menu actions.
				m_drawCanvas.setLastMousePos(mouseX,mouseY);
				m_lastSelectionBounds		=m_selection.getBounds();
				if (isRightDown(e)){
					showPopupMenus(e.getX(),e.getY());
				}
                                
				break;

			case MouseEvent.MOUSE_RELEASED:
				clearPort(true);

				snapPos		=gridFormat.getSnapPos(mouseX,mouseY);
				mouseX		=(int)snapPos.getX();
				mouseY		=(int)snapPos.getY();

				if (m_startPick){
					finishRangePick(mouseX,mouseY);
				  	m_selection.setOriginalPoint();
				  	//first graph event: shape selected 
				  	m_graphEventDispatcher.fireShapeSelected(m_selection.getList(),mouseX,mouseY);
				}else{

    					//Graphics context
    					g	=m_drawCanvas.getGraphics();

					//if there are some shapes in this selection, repaint it.
					if (m_selection.size()>0){

						//finish dragging node.
						if (m_startDraggingNode){
							m_page.setModified(true);
		        				dragNode 		=m_selection.getDraggingNode();
                        				AbstractShape parent	=(AbstractShape)dragNode.getParent();

							if (lastPort!=null){
								mouseX		=(int)lastPort.getXOffset();
								mouseY		=(int)lastPort.getYOffset();
							}else{
                                                        	//get an actual moving position
                                                        	m_movingPoint.setValue(mouseX,mouseY);
                                                        	m_movingPoint		=parent.getMoveNodePos(dragNode,m_movingPoint,moveCase);
                                                        	mouseX			=(int)m_movingPoint.getX();
                                                        	mouseY			=(int)m_movingPoint.getY();
                                                        }
                                                       

							m_selection.finishDragNode(mouseX,mouseY,g);

							
							if (lastPort!=null){
								if (parent!=null){
    		                                                        Port port	=parent.portIntersects(new JFPoint(mouseX,mouseY),null);
								        if (port!=null){
								          	port.attachPort(lastPort);
								        }
								}
							}

    						        //register a finish move node operations to operation manager.
    						        m_drawCanvas.getOperationManager().addFinishMoveNode(	dragNode,lastPort,
    						        						     	m_drawCanvas.getLastMousePos().getX(),
    						        							m_drawCanvas.getLastMousePos().getY(),
    						        							mouseX,mouseY);
				  			//first graph event: node moved
				  			m_graphEventDispatcher.fireNodeMoved(dragNode,m_drawCanvas.getLastMousePos().getX(),m_drawCanvas.getLastMousePos().getY(),mouseX,mouseY);

							m_page.clearAccessTimes();
							m_selection.moveRelationalPorts();
    							m_selection.setDraggingNode(null);
    							m_drawState.setDrawState(DrawConst.DRAWSTATE_NONE,ShapeConst.SHAPETYPE_NONE);
    							m_startDraggingNode	=false; 
    						
    						}else if (m_startMoveLabel){

    						        //register a move label operations to operation manager.
    						        double xOffset	=mouseX - m_drawCanvas.getLastMousePos().getX();
    						        double yOffset	=mouseY - m_drawCanvas.getLastMousePos().getY();
    						        m_drawCanvas.getOperationManager().addMoveLabel(m_selection.getFirstObj(),xOffset,yOffset);
				  			//first graph event: label moved
				  			m_graphEventDispatcher.fireLabelMoved(m_selection.getMoveLabel(),m_drawCanvas.getLastMousePos().getX(),m_drawCanvas.getLastMousePos().getY(),mouseX,mouseY);

							m_page.setModified(true);
    							m_selection.setMoveLabel(null);

    						}else if (m_startRotation){
							m_page.setModified(true);

						        mouseX		=actualMouseX;
							mouseY		=actualMouseY;

    						        //register a rotate operations to operation manager.
    						        JFPoint originalCenter	=m_selection.getOriginalCenter();
    						        JFPoint originalPoint	=m_selection.getOriginalPoint();
    						        m_drawCanvas.getOperationManager().addRotate(m_selection.getList().getList(),originalCenter,originalPoint.getX(),originalPoint.getY(),mouseX,mouseY);
				  			//first graph event: shape rotated
				  			m_graphEventDispatcher.fireShapeRotated(m_selection.getList(),originalPoint.getX(),originalPoint.getY(),mouseX,mouseY);

							m_page.clearAccessTimes();
    						        m_selection.moveRelationalPorts();
    						        m_startRotation =false;
    					        
    					        }else if (m_startMove){
							m_page.setModified(true);

							Rect newBounds		=m_selection.getBounds();

    						        //register a move operations to operation manager.
    						        double xOffset	=newBounds.getX()-m_lastSelectionBounds.getX();
    						        double yOffset	=newBounds.getY()-m_lastSelectionBounds.getY();
    						        m_drawCanvas.getOperationManager().addMove(m_selection.getList().getList(),xOffset,yOffset);

				  			//first graph event: shape moved
				  			m_graphEventDispatcher.fireShapeMoved(m_selection.getList(),m_drawCanvas.getLastMousePos().getX(),m_drawCanvas.getLastMousePos().getY(),mouseX,mouseY);

							m_page.clearAccessTimes();
    						        m_selection.moveRelationalPorts();
    						        m_startMove     =false;
    						        
    					        }

						m_drawCanvas.repaint();
					}
					g.dispose();

				}
				
				m_lastMousePos.setValue(mouseX,mouseY);
				m_drawCanvas.setLastMousePos(mouseX,mouseY);
				m_lastSelectionBounds	=m_selection.getBounds();

				GUIUtils.garbageCollection();
				break;
		}
    	}
    	
    	/** dispatch an mouse event*/
    	private void dispatchEvent(MouseEvent e){

		m_page.setModified(true);
    		
    		//get a mouse event type
    		int eventType		=e.getID();


    		
    		AbstractDrawEvent drawEvent =EventFactory.getEvent(m_drawState.getShapeType(),m_drawCanvas);
    		
    		//store draw event object to m_drawState that can be re-called by DrawCanvas in its repaint event.
    		m_drawState.setCurrentDrawEvent(drawEvent);
    		if (drawEvent==null)
    			return;
    		
    		//do routine for each event type.		
		switch (eventType){
			case MouseEvent.MOUSE_CLICKED:
				drawEvent.doMouseClick(e,lastPort);
				break;
			case MouseEvent.MOUSE_DRAGGED:
				drawEvent.doMouseDrag(e);
				break;
			case MouseEvent.MOUSE_ENTERED:
			 	drawEvent.doMouseEnter(e);
				break;
			case MouseEvent.MOUSE_EXITED:
				drawEvent.doMouseExit(e);
				break;
			case MouseEvent.MOUSE_MOVED:
				Cursor cursor	=m_drawCanvas.getCursor();
				if (cursor.getType()!=Cursor.CROSSHAIR_CURSOR)
					m_drawCanvas.setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR));

    				double zoom	=m_drawCanvas.getZoomScale();
				float	x	=(float)(e.getX()/zoom);
				float	y	=(float)(e.getY()/zoom);
				
				catchPort(x,y);
			  	drawEvent.doMouseMove(e);
				break;
			case MouseEvent.MOUSE_PRESSED:
				if (m_selection.size()>0){
					m_selection.clear();
    					m_drawCanvas.repaint();
    				}   

				drawEvent.doMousePress(e,lastPort);
				break;
			case MouseEvent.MOUSE_RELEASED: 
				clearPort(true);
				drawEvent.doMouseRelease(e,lastPort);
				clearPort(false);  
				GUIUtils.garbageCollection();
				break;
			
		}
    	}

	
	//show popup menus
	private void showPopupMenus(int x,int y){
		
		//if hide popupmenus, return silently.		
		if (m_drawCanvas.isHidePopupMenus()){
			return;
		}
                
                //base position for a JFrame or JApplet.
		int baseX=0;
		int baseY=0;
				
		//try to create and show the popup menus
		JPopupMenu  pMenu;
		JFrame	 f		=GUIUtils.getJFrame(m_drawCanvas);
		if (f!=null){
			baseX	=f.getX();
			baseY	=f.getY();
		}else{
			JApplet applet	=(JApplet)GUIUtils.getParent(m_drawCanvas,".JApplet");
			if (applet!=null){
				baseX	=applet.getX();
				baseY	=applet.getY();
			}
		}
		
		//directly create graph menu
		ToolFactory toolFactory	=new ToolFactory();
		pMenu 		= toolFactory.createGraphMenu(m_drawCanvas.getParentDrawPane(),true);


		//consider to get a proper position to show popupmenu, don't be covered by screen.
		Dimension menuD 	=pMenu.getPreferredSize();
		Dimension screenD	=java.awt.Toolkit.getDefaultToolkit().getScreenSize();

		int x1	=(int)(baseX+x+menuD.getWidth());
		int y1	=(int)(baseY+y+menuD.getHeight());

		if (x1>screenD.getWidth())
			x	=(int)(screenD.getWidth()-menuD.getWidth()-baseX);
		if (y1>screenD.getHeight()-150)
			y	=(int)(screenD.getHeight()-150-menuD.getHeight()-baseY);
		
		pMenu.show(m_drawCanvas,x,y);
	}


	/** 
	 *  When use want to move a selection by keyboard key,
	 *  you can call this method tomove this selection
	 *  @param moveCase A KeyEvent virtual key
	 */
	public void moveSelectionByKeyboard(int keyCode){ 
		if (m_selection.size()==0)
			return;
			
	
		int x		=0;
		int y		=0;
		int step	=1;

		//read a grid size from grid format
		GridFormat gridFormat	=m_drawCanvas.getGridFormat();
		int gridSize		=(int)gridFormat.getSnapSizeInPixels(m_drawCanvas.getZoomScale());
		if (gridFormat.getSnapToGrid()){
			step		=gridSize;
		}


		
		switch (keyCode){
    			case KeyEvent.VK_LEFT:
    				x	=-step;
    				break;
    			case KeyEvent.VK_RIGHT:
    				x	=step;
    				break;
    			case KeyEvent.VK_UP:
    				y	=-step;
    				break;
    			case KeyEvent.VK_DOWN:
    				y	=step;
    				break;
    			default:
    				break;
    		}

	
	    if (x!=0 || y!=0){
		m_page.setModified(true);

		m_selection.moveBy(x,y);		
		
    		m_drawCanvas.getOperationManager().addMove(m_selection.getList().getList(),x,y);

		//first graph event: shape moved
		//set last mouse x and mouse y to the center of m_selection.bounds
		//set current mouse x and mouse y to a relative pos from center of this bounds
		Rect bounds	=m_selection.getBounds();
		JFPoint center	=bounds.getCenter();
		m_graphEventDispatcher.fireShapeMoved(m_selection.getList(),center.getX(),center.getY(),center.getX()+x,center.getY()+y);

		m_page.clearAccessTimes();
    		m_selection.moveRelationalPorts();
    		m_startMove     =false;
    		
    		m_drawCanvas.repaint();
	    }
	}
	
}

⌨️ 快捷键说明

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