jfhexagon.java

来自「用Java开发的、实现类似Visio功能的应用程序源码」· Java 代码 · 共 273 行

JAVA
273
字号
/**
 *    $Id:JFHexagon.java $
 *
 *    Copyright 2004 ~ 2005  JingFei International Cooperation LTD. All rights reserved. *
 */
package com.jfimagine.jfgraph.shape.polygon;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.GeneralPath;

import com.jfimagine.jfgraph.shape.rectangle.AbstractRectangle;
import com.jfimagine.jfgraph.shape.base.Node;
import com.jfimagine.jfgraph.shape.base.Port;
import com.jfimagine.jfgraph.shape.base.AbstractObject;
import com.jfimagine.jfgraph.shape.base.ShapeConst;

import com.jfimagine.jfgraph.geom.JFPoint;
import com.jfimagine.jfgraph.geom.Rect;
import com.jfimagine.jfgraph.geom.Hexagon;
import com.jfimagine.jfgraph.geom.LineSeg;
 
 
 /**
 * JFHexagon class.  
 * A rectangle class used to represents an hexagon
 *
 * @author     CookieMaker    
 *
 * @version $Revision: 1.00 $
 */  
 public class JFHexagon extends AbstractRectangle{

   /**
    *   A XML string tag represents a  hexagon.
    */
   public  static final String	 XML_HEXAGON		="JFHexagon";

   /**
    *   Constructor for hexagon.
    */
   public JFHexagon(){
   	m_rect	=new Hexagon();
   	setObjectType(ShapeConst.SHAPETYPE_HEXAGON);
   	setXMLTag(XML_HEXAGON);
   }	

   /**
    *   Constructor for hexagon.
    *
    *   @param x  X coordiate.
    *
    *   @param y  Y coordiate.
    *
    *   @param w  Width of this hexagon.
    *
    *   @param h  Height of this hexagon.
    *
    */ 	
   public JFHexagon(double x, double y, double w, double h){
   	m_rect	=new Hexagon();

   	setObjectType(ShapeConst.SHAPETYPE_HEXAGON);
   	setXMLTag(XML_HEXAGON);

	addNode(x,y);
	addNode(x+w,y+h);
	   	
   	finishDrawing();
   }
   
   
   /**
    *   Creates a new AbstractObject of the same class and with the same contents as this object.
    *   This method implements the method defined in AbstractObject.
    * 
    *   @return  A clone of this class.
    *
    */ 	
  protected AbstractObject cloneMe() throws CloneNotSupportedException{
  	return new JFHexagon();
  }


   /**
    *   Add a new node for current node list.
    *   here this method will always be called by DrawState class or any drawing class.
    * 
    *   @param x, y Coordinates of a new node.
    *
    */ 	
   public void addNode(double x, double y){
	super.addNode(x,y);
	
	if (m_nodeAdded>1){
   		//left-top point and right-bottom point:
   		JFPoint pnt1	=m_firstNode;
   		JFPoint	pnt2	=new JFPoint(x,y);
		    	
   		m_rect.setVertex(Rect.VERTEXTYPE_LEFTTOP,pnt1.getX(),pnt1.getY());
   		m_rect.setVertex(Rect.VERTEXTYPE_RIGHTTOP,x,pnt1.getY());
   		m_rect.setVertex(Rect.VERTEXTYPE_LEFTBOTTOM,pnt1.getX(),y);
   		m_rect.setVertex(Rect.VERTEXTYPE_RIGHTBOTTOM,x,y);

   		initNodes();
   	}
   }  

   /**
    *   Move/adjust a node of current object.
    * 
    *   @param  node Currently moving node.
    *
    *   @param  x, y Moving offsets.
    *
    *   @param g current drawing canvas.
    *
    */ 	
   public void  moveNode(Node node, double x, double y,Graphics g){
   	super.moveNode(node,x,y,g);

	if (node!=null){
		if (node.getXOffset()!=x || node.getYOffset()!=y){
			//move node and draw a new dragging shape.
			int vertexType	=getVertexTypeByNode(node);
   			m_rect.moveVertex(vertexType,x,y,Rect.VERTEXMOVETYPE_RECTANGLE);

   			//init shape nodes.
			initNodes();
		   		
   			//draw current moving node and its relational lines
   			draw(g,true);
   		}
	}
   }
   
   /**
    *   Draw current object on graphic canvas.
    * 
    *   @param  g  A graphic canvas.	
    *   @param  isXorMode If is in xor mode now.
    *
    */ 	
   public void  draw(Graphics g,boolean isXorMode){
   	if (g==null)
   		return;

   	//if user hide this shape, we'll draw an 'invisible' bounds here.	
   	if (isInvisible()){
   		drawInvisibleBounds(g,isXorMode);
   		return;
   	}	

        if (!isXorMode)
		setTransparencyComposite(g);
   		

  	double zoom	=getZoomScale();
   	GeneralPath path= new GeneralPath(GeneralPath.WIND_EVEN_ODD); 
   	
   	Hexagon hexagon =(Hexagon)m_rect;
   	
   	for (int i=Hexagon.HEXAGONSIDE_LEFTTOP; i<=Hexagon.HEXAGONSIDE_LEFTBOTTOM; i++){
   		LineSeg srcLine =hexagon.getHexagonSide(i);
   		JFPoint start	=srcLine.getPoint1();
   		JFPoint end	=srcLine.getPoint2(); 
   		
   		float  startX	=(float)(start.getX() * zoom);
   		float  startY	=(float)(start.getY() * zoom);
   		float  endX	=(float)(end.getX() * zoom);
   		float  endY	=(float)(end.getY() * zoom);
   		
   		if (i==Hexagon.HEXAGONSIDE_LEFTTOP)
   			path.moveTo(startX,startY);
		path.lineTo(endX,endY);
   	}
   	path.closePath();
                      
   	if (!isXorMode){
   		Rect rect	=getBounds();
   		rect.setValue(rect.getX() * zoom, rect.getY() * zoom, rect.getWidth() * zoom, rect.getHeight() * zoom);
   		m_fillFormat.draw(g,path,rect);
   		m_lineFormat.draw(g,path);
   	}else
   		((Graphics2D)g).draw(path);

        if (!isXorMode)
		restoreTransparencyComposite(g);
   				
	if (!isXorMode){
   		drawPort(g);
   		drawLabel(g);
   	}
   }


   /**
    *   Init all ports of this diamond
    *   An object will always has its one or more stable ports and some customized ports,
    *   for dimond, it will has four stable ports as below,
    *   port1 at middle left,
    *   port2 at middle top,
    *   port3 at middle right,
    *   port4 at middle bottom,
    */ 	
   protected void initPorts(){

   	if (m_portList.size()==0){
   		try{

   			Hexagon hexagon =(Hexagon)m_rect;
   	
   			for (int i=Hexagon.HEXAGONSIDE_LEFTTOP; i<=Hexagon.HEXAGONSIDE_LEFTBOTTOM; i++){
   				LineSeg line =hexagon.getHexagonSide(i);
   				JFPoint start	=line.getPoint1();
   				JFPoint end	=line.getPoint2();
   				
   				Port port=new Port();
   				port.setFirstPoint(start);
   				port.setSecondPoint(end);
   				port.setPortPoint(start.midPoint(end));
   				port.setParent(this);
   				m_portList.add(port);
		   	}
   			
   		}catch(Exception e){
   		}
   	}   
	m_portList.setZoomScale(getZoomScale());
	
   }



   /**
    *   Start move a node.
    * 
    *   @param  node The node will be moved.
    *
    */ 	
   public void  startMoveNode(Node node){
   	m_originalRect	=new Hexagon((Hexagon)m_rect); 
   	startMoveLabel();
   }


   /**
    *   finish move/adjust a node of current object.
    * 
    *   @param  node Currently moving node.
    *
    *   @param  x,&nbsp;y Moving offsets.
    *
    *   @param g current drawing canvas.
    *
    */ 	
   public void  finishMoveNode(Node node, double x, double y,Graphics g){
	finishMoveLabel();
	
   	Hexagon originalHexagon =(Hexagon)m_originalRect;
   	Hexagon hexagon 	=(Hexagon)m_rect;
   	
   	for (int i=Hexagon.HEXAGONSIDE_LEFTTOP; i<=Hexagon.HEXAGONSIDE_LEFTBOTTOM; i++){
   		LineSeg originalLine 	=originalHexagon.getHexagonSide(i);
   		LineSeg line 		=hexagon.getHexagonSide(i);
		m_portList.movePort(originalLine.getPoint1(),originalLine.getPoint2(),line.getPoint1(),line.getPoint2());
	}

   }
	

   
}

⌨️ 快捷键说明

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