package org.archstudio.bna.demo;
import java.awt.geom.Point2D;
import java.util.List;
import java.util.Random;
import org.archstudio.bna.BNACanvas;
import org.archstudio.bna.IBNAModel;
import org.archstudio.bna.IBNAView;
import org.archstudio.bna.IBNAWorld;
import org.archstudio.bna.IThingLogicManager;
import org.archstudio.bna.constants.StickyMode;
import org.archstudio.bna.facets.IHasAnchorPoint;
import org.archstudio.bna.facets.IHasBoundingBox;
import org.archstudio.bna.facets.IHasEndpoints;
import org.archstudio.bna.facets.IHasMutableReferencePoint;
import org.archstudio.bna.facets.IHasMutableSelected;
import org.archstudio.bna.facets.IHasMutableSize;
import org.archstudio.bna.facets.IHasStickyShape;
import org.archstudio.bna.keys.IThingKey;
import org.archstudio.bna.keys.ThingKey;
import org.archstudio.bna.logics.coordinating.MirrorValueLogic;
import org.archstudio.bna.logics.coordinating.StickPointLogic;
import org.archstudio.bna.logics.editing.ClickSelectionLogic;
import org.archstudio.bna.logics.editing.DragMovableLogic;
import org.archstudio.bna.logics.editing.MarqueeSelectionLogic;
import org.archstudio.bna.logics.navigating.PanAndZoomLogic;
import org.archstudio.bna.things.labels.AnchoredLabelThing;
import org.archstudio.bna.things.shapes.EllipseThing;
import org.archstudio.bna.things.shapes.PolygonThing;
import org.archstudio.bna.things.shapes.SplineThing;
import org.archstudio.bna.things.utility.GridThing;
import org.archstudio.bna.things.utility.ShadowThing;
import org.archstudio.bna.utils.Assemblies;
import org.archstudio.bna.utils.BNARenderingSettings;
import org.archstudio.bna.utils.DefaultBNAModel;
import org.archstudio.bna.utils.DefaultBNAWorld;
import org.archstudio.bna.utils.UserEditableUtils;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import com.google.common.base.Function;
import com.google.common.collect.Lists;
public class StickySplineDemo {
public static void main(String args[]) {
final Display display = new Display();
final Shell shell = new Shell(display);
shell.setLayout(new FillLayout());
final IBNAModel model = new DefaultBNAModel();
final IBNAWorld world = new DefaultBNAWorld("top view", model);
final BNACanvas canvas = new BNACanvas(shell, SWT.V_SCROLL | SWT.H_SCROLL, world);
BNARenderingSettings.setAntialiasGraphics(canvas, true);
BNARenderingSettings.setAntialiasText(canvas, true);
BNARenderingSettings.setDecorativeGraphics(canvas, true);
BNARenderingSettings.setDisplayShadows(canvas, true);
canvas.setSize(500, 500);
canvas.setBackground(display.getSystemColor(SWT.COLOR_WHITE));
shell.setSize(400, 400);
shell.open();
GridThing.createIn(world);
ShadowThing.createIn(world);
populateModel(canvas.getBNAView());
addLogics(canvas.getBNAView());
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
System.exit(0);
}
private static void addLogics(IBNAView view) {
IThingLogicManager tlm = view.getBNAWorld().getThingLogicManager();
tlm.addThingLogic(PanAndZoomLogic.class);
tlm.addThingLogic(MarqueeSelectionLogic.class);
tlm.addThingLogic(ClickSelectionLogic.class);
tlm.addThingLogic(DragMovableLogic.class);
}
static void populateModel(IBNAView view) {
IBNAWorld world = view.getBNAWorld();
IBNAModel model = world.getBNAModel();
StickPointLogic spl = world.getThingLogicManager().addThingLogic(StickPointLogic.class);
MirrorValueLogic mvl = world.getThingLogicManager().addThingLogic(MirrorValueLogic.class);
List<IHasStickyShape> shapeThings = Lists.newArrayList();
IThingKey<StickyMode> shapeStickyMode = ThingKey.create("stickyMode");
Random r = new Random();
for (StickyMode stickyMode : StickyMode.values()) {
PolygonThing p = Assemblies.createPolygon(world, null, null);
p.setColor(null);
List<Point2D> points = Lists.newArrayList();
points.add(new Point2D.Double(-50, -50));
points.add(new Point2D.Double(-50, 50));
points.add(new Point2D.Double(50, 50));
for (int i = 0; i < 5; i++) {
points.add(new Point2D.Double(r.nextInt(100) - 50, r.nextInt(100) - 50));
}
p.setPoints(points);
Point rp = p.getReferencePoint();
rp.x += 50 + stickyMode.ordinal() * 150;
rp.y += 100;
p.setReferencePoint(rp);
UserEditableUtils.addEditableQualities(p, IHasMutableSelected.USER_MAY_SELECT,
IHasMutableReferencePoint.USER_MAY_MOVE, IHasMutableSize.USER_MAY_RESIZE);
p.set(shapeStickyMode, stickyMode);
AnchoredLabelThing label = model.addThing(new AnchoredLabelThing(null));
label.setText(stickyMode.name());
mvl.mirrorValue(p, IHasBoundingBox.BOUNDING_BOX_KEY, label, IHasAnchorPoint.ANCHOR_POINT_KEY,
new Function<Rectangle, Point2D>() {
@Override
public Point2D apply(Rectangle input) {
return new Point2D.Double(input.x + input.width / 2, input.y + input.height / 2);
}
});
shapeThings.add(p);
}
EllipseThing e = Assemblies.createEllipse(world, null, null);
e.setColor(new RGB(192, 0, 0));
e.setSecondaryColor(new RGB(128, 32, 32));
e.setBoundingBox(new Rectangle(300, 200, 30, 30));
e.set(shapeStickyMode, StickyMode.CENTER);
shapeThings.add(e);
UserEditableUtils.addEditableQualities(e, IHasMutableSelected.USER_MAY_SELECT,
IHasMutableReferencePoint.USER_MAY_MOVE, IHasMutableSize.USER_MAY_RESIZE);
for (int f = 0; f < shapeThings.size(); f++) {
for (int t = f + 1; t < shapeThings.size(); t++) {
IHasStickyShape ft = shapeThings.get(f);
StickyMode fsm = ft.get(shapeStickyMode);
IHasStickyShape tt = shapeThings.get(t);
StickyMode tsm = tt.get(shapeStickyMode);
SplineThing s = Assemblies.createSpline(world, null, null);
spl.stick(s, IHasEndpoints.ENDPOINT_1_KEY, fsm, ft);
spl.stick(s, IHasEndpoints.ENDPOINT_2_KEY, tsm, tt);
//StickRelativeMovablesLogic.stickPoint(fa.getPart("glass"), IHasEndpoints.ENDPOINT_1_KEY,
// fromStickyMode, s.getSplineGlassThing());
//if (toStickyMode != fromStickyMode) {
// StickRelativeMovablesLogic.stickPoint(ta.getPart("glass"), IHasEndpoints.ENDPOINT_2_KEY,
// toStickyMode, s.getSplineGlassThing());
//}
//else {
// s.getSplineGlassThing().setEndpoint2(new Point(10 + r.nextInt(430), 10 + r.nextInt(430)));
//}
//ToolTipLogic.setToolTip(s.getSplineGlassThing(), fromStickyMode.name().replace("_", " ") + " - to - "
// + toStickyMode.name().replace("_", " "));
//UserEditableUtils.addEditableQuality(s.getSplineGlassThing(), IHasSelected.USER_MAY_SELECT,
// IHasReferencePoint.USER_MAY_MOVE, IHasEndpoints.USER_MAY_MOVE_ENDPOINT1,
// IHasEndpoints.USER_MAY_MOVE_ENDPOINT2, IHasMidpoints.USER_MAY_ADD_MIDPOINTS,
// IHasMidpoints.USER_MAY_MOVE_MIDPOINTS, IHasMidpoints.USER_MAY_REMOVE_MIDPOINTS);
//UserEditableUtils.addEditableQuality(s.getSplineGlassThing(),
// IHasEndpoints.USER_MAY_RESTICK_ENDPOINT1,
// IHasEndpoints.USER_MAY_RESTICK_ENDPOINT2);
}
}
}
}