帆软报表设计器源代码。
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

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();
}
}
}