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

📄 drawrect.java

📁 用Java开发的、实现类似Visio功能的应用程序源码
💻 JAVA
字号:
/**
 *    $Id:DrawRect.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.event.MouseEvent;

import com.jfimagine.jfgraph.geom.JFPoint;

import com.jfimagine.jfgraph.shape.base.AbstractObject;
import com.jfimagine.jfgraph.shape.base.AbstractShape;
import com.jfimagine.jfgraph.shape.base.Port;
import com.jfimagine.jfgraph.shape.base.ShapeConst;
import com.jfimagine.jfgraph.shape.rectangle.AbstractRectangle;
import com.jfimagine.jfgraph.shape.decorate.GridFormat; 

import com.jfimagine.jfdraw.draw.AbstractDrawEvent;
import com.jfimagine.jfdraw.draw.DrawConst;


 
 /**
 * Draw rect class. It's a class to manipulate JFRectangle operations.
 *
 * @author     CookieMaker    
 *
 * @version $Revision: 1.00 $
 */  
 public class DrawRect extends AbstractDrawEvent{


        /**
         *  When a modifier, shift or ctrl button is pressed down. We need to force this line be vertical or horizontal one.
         *
         *  @param e Current mouse event
         *  @param pnt Current mouse position
         */
        private void adjustPointByModifier(MouseEvent e,JFPoint pnt){
        	if (e==null || pnt==null)
        		return;

		int shapeType	=m_drawState.getShapeType();
		boolean isHLabelLine	=shapeType==ShapeConst.SHAPETYPE_HLABELLINE;
		boolean isVLabelLine	=shapeType==ShapeConst.SHAPETYPE_VLABELLINE;
        		
		JFPoint startPoint	=m_drawState.getStartPoint();

    		if (startPoint!=null && (isModifierDown(e) || isHLabelLine || isVLabelLine)){ 
			
			//x,y offsets
    			double x	=pnt.getX()-startPoint.getX();
    			double y	=pnt.getY()-startPoint.getY();

		
    			switch (shapeType){ 
  				
    				//force vertical or horizontal line:
    				case ShapeConst.SHAPETYPE_LABELLINE:
    				case ShapeConst.SHAPETYPE_HLABELLINE:
    				case ShapeConst.SHAPETYPE_VLABELLINE:
				case ShapeConst.SHAPETYPE_ARC:
				case ShapeConst.SHAPETYPE_CHORD:
				case ShapeConst.SHAPETYPE_PIE:
				case ShapeConst.SHAPETYPE_CURVE:
    					if ((Math.abs(x)>Math.abs(y) && !isVLabelLine) || isHLabelLine)
    						pnt.setY(startPoint.getY());
    					else
    						pnt.setX(startPoint.getX());
    					
    					break;
    				
    				//force square:
    				default:
    					if (Math.abs(x)>Math.abs(y))
    						pnt.setY(startPoint.getY()+x);
    					else
    						pnt.setX(startPoint.getX()+y);
    					
    					break;
    			}
		}
	}
	
		
    	/** Do mouse release
    	 *  @param e Current mouse event.
    	 *  @param lastPort The port can be attached for current object.
    	 */
    	public void doMouseRelease(MouseEvent e,Port attachPort){
    		double zoom	=m_drawCanvas.getZoomScale();
    	        JFPoint pnt=new JFPoint(e.getX()/zoom,e.getY()/zoom);
    		
    		//left mouse down, always doing some confirm operations.
    		if (isLeftDown(e) || isModifierDown(e)){
    			//if not a start point assigned, then assign a start point here.
    			if (!m_drawState.getStartPointAssigned()){

    				GridFormat gridFormat	=m_drawCanvas.getGridFormat();
    				JFPoint snapPos	=gridFormat.getSnapPos(pnt.getX(),pnt.getY());
    				pnt.setValue(snapPos);

    				//set start point as current mouse position.
    				
    				m_drawState.setStartPoint(pnt);
    				startPort       =attachPort;	

   				

    			//start point assigned, then process the next step of drawing/dragging/transforming.
    			}else{  
    				adjustPointByModifier(e,pnt);
    				
				GridFormat gridFormat	=m_drawCanvas.getGridFormat();
				JFPoint snapPos		=gridFormat.getSnapPos(pnt.getX(),pnt.getY());
				pnt.setValue(snapPos);
				
    			
    			        //correct current position according to the possible attach port.
                                if (attachPort!=null){
                                        pnt.setValue(attachPort.getXOffset(),attachPort.getYOffset());
                                }
                                    			
    				if (m_drawState.getDrawState()==DrawConst.DRAWSTATE_DRAW){
    					//draw a new xor drag shape to eliminate the last dragging xor shape.
    					drawDragShape();
    					//add a new point for shape.
					m_drawState.setLastPoint(pnt); 
					m_drawState.setLastTempPoint(pnt);
				}
				
				//if a new point of rectangle is settled, then we finish drawing rectangle here.
				if (!m_drawState.getStartPoint().equals(pnt) && ifCompleteDrawing(true)){
				        endPort      =attachPort; 
				        		   
    					//Graphics context
    					Graphics	g	=m_drawCanvas.getGraphics();
					finalizeMouseEvent(g);
					g.dispose();
				}
    			}

    		//right mouse down, always doing some cancel operations.
    		}else if (isRightDown(e)){
    			if (m_drawState.getStartPointAssigned()){
    				if (m_drawState.getDrawState()==DrawConst.DRAWSTATE_DRAW){
    					//draw xor drag shape to eliminate the last xor shape.
    					drawDragShape();
  					
					//cancel last point. 
					m_drawState.cancelLastPoint(pnt);
    				}	
    			}
    		}
    	}

   /** Draw xor rectangle between lastPoint and lastTempPoint
    */
   protected void drawDragShape(){
   	Graphics	g=m_drawCanvas.getGraphics();
   	drawCurrentShape(g,true);
   	g.dispose();
  }


   /** draw current shape in xor or paint mode*/
   public void drawCurrentShape(Graphics g,boolean isXorMode){

		if (!ifCompleteDrawing(false)) return;			

		if (isXorMode)	{
			setPaintMode(g,true);
		}else{
			setPaintMode(g,false);
		}
			
		AbstractObject obj	=m_drawState.getCurrentShape();
    		if (m_page.isHidePorts())
    			obj.setShowDesign(false); 
    		else
    			obj.setShowDesign(true);		
		
		if (obj instanceof AbstractShape){
			((AbstractShape)obj).draw(g,isXorMode);
			if (!isXorMode){
				((AbstractShape)obj).drawPicked(g,false);
			}
		}	
	}

   /**A temporary moving piont for mouse move event*/
   private JFPoint m_movingPoint	=new JFPoint();
		
   /** Do mouse move*/
   public void doMouseMove(MouseEvent e){

    		double zoom	=m_drawCanvas.getZoomScale();
    		m_movingPoint.setValue(e.getX()/zoom,e.getY()/zoom);
		adjustPointByModifier(e,m_movingPoint);

    		if (m_drawState.getStartPointAssigned()){

			GridFormat gridFormat	=m_drawCanvas.getGridFormat();
			JFPoint snapPos		=gridFormat.getSnapPos(m_movingPoint.getX(),m_movingPoint.getY());

    			if (m_drawState.getDrawState()==DrawConst.DRAWSTATE_DRAW){

			 	drawDragShape();

    				//add a new point for shape.
    				//for adding a new point to rectangle,
    				//it's only modifying the second end point for rectangle actually.
				m_drawState.setLastPoint(snapPos.getX(),snapPos.getY()); 

			 	//draw new shape in dragging.
			 	m_drawState.setLastTempPoint(snapPos.getX(),snapPos.getY());
			 	drawDragShape();
			 }
    		}
    	}


 }

⌨️ 快捷键说明

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