📄 abstractdrawevent.java
字号:
/**
* $Id:AbstractDrawEvent.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.RenderingHints;
import java.awt.event.MouseEvent;
import java.awt.event.InputEvent;
import com.jfimagine.jfdraw.gui.DrawCanvas;
import com.jfimagine.jfdraw.draw.DrawState;
import com.jfimagine.jfdraw.draw.Selection;
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.union.JFPage;
import com.jfimagine.jfgraph.shape.decorate.LineFormat;
import com.jfimagine.jfgraph.shape.line.JFLine;
import com.jfimagine.jfgraph.shape.line.JFRegularLine;
import com.jfimagine.jfgraph.shape.polygon.JFPolygon;
import com.jfimagine.jfgraph.geom.JFPoint;
import com.jfimagine.jfgraph.geom.LineSeg;
/**
* Abstract draw event class. A base draw event class to spawn sub actual drawing event class.
*
* @author CookieMaker
*
* @version $Revision: 1.00 $
*/
public abstract class AbstractDrawEvent {
/** A Draw canvas reference to dispatch events */
protected DrawCanvas m_drawCanvas;
/** A draw state of current draw canvas */
protected DrawState m_drawState;
/** A drawing page*/
protected JFPage m_page;
/** A CAD selection for current shape objects.*/
protected Selection m_selection;
/** A temporary lineSeg object */
protected LineSeg m_lineSeg = new LineSeg();
/** A temporary line format */
protected LineFormat m_lineFormat = new LineFormat();
/**
* Two possible ports that this line may connect to.
*/
protected Port startPort=null;
protected Port endPort=null;
/** Constructor */
public AbstractDrawEvent(){
}
/** set current draw canvas*/
public void setDrawCanvas(DrawCanvas drawCanvas){
this.m_drawCanvas =drawCanvas;
//draw state
this.m_drawState =drawCanvas.getDrawState();
//drawing page
this.m_page =drawCanvas.getDrawPage();
this.m_selection =drawCanvas.getSelection();
}
/** check if a left mouse button is pressed down */
protected boolean isLeftDown(MouseEvent e){
return e.getModifiers()==InputEvent.BUTTON1_MASK;
}
/** check if a right mouse button is pressed down */
protected boolean isRightDown(MouseEvent e){
return e.isMetaDown();
}
/**
* check if a modifier key, ctrl or shift button is pressed down
*/
protected boolean isModifierDown(MouseEvent e){
return e.isControlDown() || e.isShiftDown();
}
/** Set paint mode dynamicly
* @param g2 A graphics2D object
* @param isXorMode If current paint mode is xor mode or plain paint mode.
*/
protected void setPaintMode(Graphics g,boolean isXorMode){
Graphics2D g2 =(Graphics2D)g;
if (isXorMode){
g2.setXORMode(Color.white);
}else{
g2.setPaintMode();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
}
}
/** draw current shape in xor or paint mode,
* this method will be called while drawing line or other similar shapes.
*/
public void drawCurrentShape(boolean isXorMode){
Graphics g=m_drawCanvas.getGraphics();
drawCurrentShape(g,isXorMode);
g.dispose();
}
/** draw current shape in xor or paint mode
* this method will be overwrited while drawing line or other similar shapes.
*/
public void drawCurrentShape(Graphics g,boolean isXorMode){
}
/** Draw xor line between lastPoint and lastTempPoint
* @param startPoint, endPoint The endpoints of a line segment.
* @param isXorLine If current line is an XOR line.
*/
protected void drawDragLine(JFPoint startPoint,JFPoint endPoint){
double zoom =m_drawCanvas.getZoomScale();
int x1 =(int)(startPoint.getX() * zoom);
int y1 =(int)(startPoint.getY() * zoom);
int x2 =(int)(endPoint.getX() * zoom);
int y2 =(int)(endPoint.getY() * zoom);
Graphics g=m_drawCanvas.getGraphics();
setPaintMode(g,true);
((Graphics2D)g).drawLine(x1,y1,x2,y2);
g.dispose();
}
/** to find if current object has necessary nodes, so can be constructed
* otherwise simply return false.
* @param finishDrawing Stop drawing concurrently.
* @return True if succeed, false otherwise.
*/
protected boolean ifCompleteDrawing(boolean finishDrawing){
AbstractObject obj =m_drawState.getCurrentShape();
if (obj==null)
return false;
AbstractShape drawObj =(AbstractShape)obj;
if (drawObj.ifCompleteDrawing()){
if (!finishDrawing)
return true;
else
return drawObj.finishDrawing();
}
return false;
}
/** Finalize mouse event*/
protected void finalizeMouseEvent(Graphics g){
AbstractObject obj =m_drawState.getCurrentShape();
AbstractShape drawObj =(AbstractShape)obj;
if (drawObj.finishDrawing()){
//add current object to page's current layer.
try{
//add object to shapelist of layer will generate a new valid object id for obj.
//so an attachport action below will have a valid parent id.
if (m_page.isHidePorts())
obj.setShowDesign(false);
else
obj.setShowDesign(true);
m_page.getCurrentLayer().getShapeList().add(obj);
m_selection.add(obj);
if (startPort!=null) drawObj.attachPort(startPort);
if (endPort!=null) drawObj.attachPort(endPort);
//register a new operations to operation manager.
m_drawCanvas.getOperationManager().addNew(obj,startPort,endPort);
m_drawCanvas.getParentDrawPane().notifyObjectSelected(m_selection.getList());
}catch(Exception e){
}
//draw xor shape to eliminate whole the shape
drawCurrentShape(true);
//draw plain paint shape.
drawCurrentShape(false);
m_selection.drawPicked(g,false);
}
//clear drawing state
m_drawState.clearDrawState();
}
/** Terminate previous operations, do some businesses necessary.*/
public void terminateDrawing(){
AbstractObject obj =m_drawState.getCurrentShape();
//for multi nodes AbstractShape, e.g. JFLine, JFPolygon,JFRegularLine, we'll consider to quickly finish drawing action here.
if (obj!=null && ifCompleteDrawing(false) && (obj instanceof JFPolygon || obj instanceof JFLine || obj instanceof JFRegularLine)){
Graphics g =m_drawCanvas.getGraphics();
finalizeMouseEvent(g);
g.dispose();
}else{
//clear drawing state
m_drawState.clearDrawState();
}
startPort=null;
endPort=null;
m_drawCanvas.repaint();
}
/** Do mouse click
* @param e Current mouse event.
* @param lastPort The port can be attached for current object.
*/
public void doMouseClick(MouseEvent e,Port attachPort){
}
/** Do mouse drag*/
public void doMouseDrag(MouseEvent e){
}
/** Do mouse enter*/
public void doMouseEnter(MouseEvent e){
}
/** Do mouse exit*/
public void doMouseExit(MouseEvent e){
}
/** Do mouse move*/
public void doMouseMove(MouseEvent e){
}
/** Do mouse press
* @param e Current mouse event.
* @param lastPort The port can be attached for current object.
*/
public void doMousePress(MouseEvent e,Port attachPort){
}
/** 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){
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -