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

📄 eventdispatcher.java

📁 用Java开发的、实现类似Visio功能的应用程序源码
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
/**
 *    $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 + -