jfisoscelestriangle.java
来自「用Java开发的、实现类似Visio功能的应用程序源码」· Java 代码 · 共 292 行
JAVA
292 行
/**
* $Id:JFIsoscelesTriangle.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.IsoscelesTriangle;
/**
* JFIsoscelesTriangle class.
* A rectangle class used to represents an isosceles triangle
*
* @author CookieMaker
*
* @version $Revision: 1.00 $
*/
public class JFIsoscelesTriangle extends AbstractRectangle{
/**
* A XML string tag represents a isosceles triangle.
*/
public static final String XML_ISOSCELESTRIANGLE ="JFIsoscelesTriangle";
/**
* Constructor for isosceles triangle.
*/
public JFIsoscelesTriangle(){
m_rect =new IsoscelesTriangle();
setObjectType(ShapeConst.SHAPETYPE_ISOSCELESTRIANGLE);
setXMLTag(XML_ISOSCELESTRIANGLE);
}
/**
* Constructor for isosceles triangle.
*
* @param x X coordiate.
*
* @param y Y coordiate.
*
* @param w Width of this isosceles triangle.
*
* @param h Height of this isosceles triangle.
*
*/
public JFIsoscelesTriangle(double x, double y, double w, double h){
m_rect =new IsoscelesTriangle();
setObjectType(ShapeConst.SHAPETYPE_ISOSCELESTRIANGLE);
setXMLTag(XML_ISOSCELESTRIANGLE);
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 JFIsoscelesTriangle();
}
/**
* 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);
IsoscelesTriangle triangle =(IsoscelesTriangle)m_rect;
JFPoint top =triangle.getTriangleVertex(IsoscelesTriangle.TRIANGLEVERTEX_TOP);
JFPoint left =triangle.getTriangleVertex(IsoscelesTriangle.TRIANGLEVERTEX_LEFT);
JFPoint right =triangle.getTriangleVertex(IsoscelesTriangle.TRIANGLEVERTEX_RIGHT);
path.moveTo((float)(top.getX()*zoom),(float)(top.getY()*zoom));
path.lineTo((float)(right.getX()*zoom),(float)(right.getY()*zoom));
path.lineTo((float)(left.getX()*zoom),(float)(left.getY()*zoom));
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{
IsoscelesTriangle triangle =(IsoscelesTriangle)m_rect;
JFPoint top =triangle.getTriangleVertex(IsoscelesTriangle.TRIANGLEVERTEX_TOP);
JFPoint left =triangle.getTriangleVertex(IsoscelesTriangle.TRIANGLEVERTEX_LEFT);
JFPoint right =triangle.getTriangleVertex(IsoscelesTriangle.TRIANGLEVERTEX_RIGHT);
Port port;
//left
port =new Port();
port.setFirstPoint(top);
port.setSecondPoint(left);
port.setPortPoint(top.midPoint(left));
port.setParent(this);
m_portList.add(port);
//right
port =new Port();
port.setFirstPoint(top);
port.setSecondPoint(right);
port.setPortPoint(top.midPoint(right));
port.setParent(this);
m_portList.add(port);
//bottom
port =new Port();
port.setFirstPoint(left);
port.setSecondPoint(right);
port.setPortPoint(left.midPoint(right));
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 IsoscelesTriangle((IsoscelesTriangle)m_rect);
startMoveLabel();
}
/**
* finish move/adjust a node of current object.
*
* @param node Currently moving node.
*
* @param x, y Moving offsets.
*
* @param g current drawing canvas.
*
*/
public void finishMoveNode(Node node, double x, double y,Graphics g){
finishMoveLabel();
IsoscelesTriangle originalTriangle =(IsoscelesTriangle)m_originalRect;
IsoscelesTriangle triangle =(IsoscelesTriangle)m_rect;
JFPoint originalTop =originalTriangle.getTriangleVertex(IsoscelesTriangle.TRIANGLEVERTEX_TOP);
JFPoint originalLeft =originalTriangle.getTriangleVertex(IsoscelesTriangle.TRIANGLEVERTEX_LEFT);
JFPoint originalRight =originalTriangle.getTriangleVertex(IsoscelesTriangle.TRIANGLEVERTEX_RIGHT);
JFPoint top =triangle.getTriangleVertex(IsoscelesTriangle.TRIANGLEVERTEX_TOP);
JFPoint left =triangle.getTriangleVertex(IsoscelesTriangle.TRIANGLEVERTEX_LEFT);
JFPoint right =triangle.getTriangleVertex(IsoscelesTriangle.TRIANGLEVERTEX_RIGHT);
m_portList.movePort(originalTop,originalLeft,top,left);
m_portList.movePort(originalTop,originalRight,top,right);
m_portList.movePort(originalLeft,originalRight,left,right);
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?