You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
186 lines
4.9 KiB
186 lines
4.9 KiB
package com.fr.design.designer.creator; |
|
|
|
import java.awt.Cursor; |
|
import java.awt.Point; |
|
import java.awt.Rectangle; |
|
import java.awt.Toolkit; |
|
|
|
import javax.swing.JComponent; |
|
|
|
import com.fr.base.BaseUtils; |
|
import com.fr.design.mainframe.BaseJForm; |
|
import com.fr.design.mainframe.FormDesigner; |
|
import com.fr.design.designer.beans.location.Direction; |
|
import com.fr.form.ui.Connector; |
|
import com.fr.design.form.util.XCreatorConstants; |
|
|
|
//这个类仅仅是对Connector包装下,使得表单设计页面逻辑更清晰 |
|
public class XConnector implements XComponent { |
|
|
|
private XWAbsoluteLayout parent; |
|
private Connector connector; |
|
public static Cursor connectorCursor; |
|
public static Cursor moveCursor; |
|
|
|
static { |
|
connectorCursor = Toolkit.getDefaultToolkit().createCustomCursor( |
|
BaseUtils.readImage("/com/fr/design/images/form/designer/cursor/connectorcursor.png"), new Point(0, 0), |
|
"connector"); |
|
moveCursor = Toolkit.getDefaultToolkit().createCustomCursor( |
|
BaseUtils.readImage("/com/fr/design/images/form/designer/cursor/move.png"), new Point(16, 16), |
|
"move"); |
|
} |
|
|
|
public XConnector(Connector connector, XWAbsoluteLayout xWAbsoluteLayout) { |
|
this.connector = connector; |
|
this.parent = xWAbsoluteLayout; |
|
} |
|
|
|
private boolean near(int x1, int x2) { |
|
return x1 - x2 >= -XCreatorConstants.RESIZE_BOX_SIZ && x1 - x2 <= XCreatorConstants.RESIZE_BOX_SIZ; |
|
} |
|
|
|
private Rectangle createRectangle(Point A, Point B) { |
|
return new Rectangle(Math.min(A.x, B.x), Math.min(A.y, B.y), Math.abs(A.x - B.x), Math.abs(A.y - B.y)); |
|
} |
|
|
|
public XLayoutContainer getParentXLayoutContainer() { |
|
return parent; |
|
} |
|
|
|
public Connector getConnector() { |
|
return connector; |
|
} |
|
|
|
@Override |
|
public Rectangle getBounds() { |
|
return createRectangle(connector.getStartPoint(), connector.getEndPoint()); |
|
} |
|
|
|
@Override |
|
public void setBounds(Rectangle oldbounds) { |
|
|
|
} |
|
|
|
public JComponent createToolPane(BaseJForm jform, FormDesigner formEditor) { |
|
return jform.getEditingPane(); |
|
} |
|
|
|
public ConnectorDirection getDirection(int x, int y) { |
|
|
|
Point pS = connector.getStartPoint(); |
|
if (near(x, pS.x) && near(y, pS.y)) { |
|
return new ConnectorDirection(pS, null); |
|
} |
|
Point pE = connector.getEndPoint(); |
|
if (near(x, pE.x) && near(y, pE.y)) { |
|
return new ConnectorDirection(null, pE); |
|
} |
|
|
|
Point p1 = pS; |
|
Point p2; |
|
Point p; |
|
int size = connector.getPointCount(); |
|
for (int i = 0; i < size - 1; i++) { |
|
p2 = connector.getPointIndex(i + 1); |
|
p = connector.getMidPoint(p1, p2); |
|
if (near(p.x, x) && near(p.y, y)) { |
|
return new ConnectorDirection(p1, p2); |
|
} |
|
p1 = p2; |
|
} |
|
return new ConnectorDirection(); |
|
} |
|
|
|
public class ConnectorDirection implements Direction { |
|
|
|
private Point A; |
|
private Point B; |
|
private Rectangle oldbounds; |
|
|
|
private ConnectorDirection() { |
|
|
|
} |
|
|
|
private ConnectorDirection(Point A, Point B) { |
|
this.A = A; |
|
this.B = B; |
|
} |
|
|
|
private Cursor getCursor() { |
|
if (A == null || B == null) { |
|
return A == B ? Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR) : moveCursor; |
|
} |
|
if (A.x == B.x) { |
|
return Cursor.getPredefinedCursor(Cursor.W_RESIZE_CURSOR); |
|
} else if (A.y == B.y) { |
|
return Cursor.getPredefinedCursor(Cursor.S_RESIZE_CURSOR); |
|
} else { |
|
return Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR); |
|
} |
|
} |
|
|
|
private void setXY(Point p1, Point p2, int dx, int dy, Rectangle oldbounds) { |
|
if (p1.x == p2.x) { |
|
p1.x = p2.x = oldbounds.x + dx; |
|
} else { |
|
p1.y = p2.y = oldbounds.y + dy; |
|
} |
|
} |
|
|
|
@Override |
|
public void drag(int dx, int dy, FormDesigner designer) { |
|
if (A == null || B == null) { |
|
if (A != null) { |
|
A.x = oldbounds.x + dx; |
|
A.y = oldbounds.y + dy; |
|
} else if (B != null) { |
|
B.x = oldbounds.x + dx; |
|
B.y = oldbounds.y + dy; |
|
} else { |
|
setBounds(new Rectangle(oldbounds.x + dx, oldbounds.y + dy, oldbounds.width, oldbounds.height)); |
|
} |
|
designer.getDrawLineHelper().resetConnector(connector); |
|
return; |
|
} |
|
if (A == connector.getStartPoint()) { |
|
this.A = new Point(A.x, A.y); |
|
connector.addPoint(1, A); |
|
} |
|
if (connector.getEndPoint() == B) { |
|
this.B = new Point(B.x, B.y); |
|
connector.addPoint(connector.getPointCount() - 1, B); |
|
} |
|
setXY(A, B, dx, dy, oldbounds); |
|
|
|
} |
|
|
|
public Rectangle getBounds() { |
|
if (A == null || B == null) { |
|
if (A != null) { |
|
return new Rectangle(A.x, A.y, 0, 0); |
|
} else if (B != null) { |
|
return new Rectangle(B.x, B.y, 0, 0); |
|
} else { |
|
return XConnector.this.getBounds(); |
|
} |
|
} |
|
return createRectangle(A, B); |
|
} |
|
|
|
@Override |
|
public int getActual() { |
|
return 0; |
|
} |
|
|
|
@Override |
|
public void updateCursor(FormDesigner formEditor) { |
|
formEditor.setCursor(getCursor()); |
|
} |
|
|
|
@Override |
|
public void backupBounds(FormDesigner formEditor) { |
|
oldbounds = getBounds(); |
|
} |
|
} |
|
} |