package org.archstudio.bna.demo; import java.awt.geom.Point2D; 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.facets.IHasMutableColor; import org.archstudio.bna.facets.IHasMutableReferencePoint; import org.archstudio.bna.facets.IHasMutableSelected; import org.archstudio.bna.facets.IHasMutableSize; import org.archstudio.bna.facets.IHasMutableText; import org.archstudio.bna.logics.background.RotatingOffsetLogic; import org.archstudio.bna.logics.editing.ClickSelectionLogic; import org.archstudio.bna.logics.editing.DragMovableLogic; import org.archstudio.bna.logics.editing.EditTextLogic; import org.archstudio.bna.logics.editing.KeyNudgerLogic; import org.archstudio.bna.logics.editing.MarqueeSelectionLogic; import org.archstudio.bna.logics.editing.ReshapeRectangleLogic; import org.archstudio.bna.logics.editing.ReshapeSplineLogic; import org.archstudio.bna.logics.editing.StandardCursorLogic; import org.archstudio.bna.logics.events.WorldThingExternalEventsLogic; import org.archstudio.bna.logics.events.WorldThingInternalEventsLogic; import org.archstudio.bna.logics.information.ToolTipLogic; import org.archstudio.bna.logics.navigating.PanAndZoomLogic; import org.archstudio.bna.things.shapes.EndpointThing; import org.archstudio.bna.things.shapes.RectangleThing; 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.AbstractCoordinateMapper; import org.archstudio.bna.utils.Assemblies; import org.archstudio.bna.utils.BNARenderingSettings; import org.archstudio.bna.utils.BNAUtils; import org.archstudio.bna.utils.DefaultBNAModel; import org.archstudio.bna.utils.DefaultBNAView; import org.archstudio.bna.utils.DefaultBNAWorld; import org.archstudio.bna.utils.LinearCoordinateMapper; import org.archstudio.bna.utils.UserEditableUtils; import org.archstudio.swtutils.constants.Flow; import org.archstudio.swtutils.constants.Orientation; import org.archstudio.sysutils.Finally; 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; public class BasicBNADemo { static Rectangle originRectangle = AbstractCoordinateMapper.getDefaultBounds(); static Point origin = new Point(originRectangle.x + originRectangle.width / 2, originRectangle.y + originRectangle.height / 2); public static void main(String args[]) { Display display = new Display(); final Shell shell = new Shell(display); shell.setLayout(new FillLayout()); IBNAModel model; IBNAWorld world; IBNAView view; try (Finally lock = BNAUtils.lock()) { model = new DefaultBNAModel(); world = new DefaultBNAWorld("bna", model); view = new DefaultBNAView(null, world, new LinearCoordinateMapper()); GridThing.createIn(world); ShadowThing.createIn(world); setupTopWorld(world); populateModel(world); IBNAModel iModel = new DefaultBNAModel(); IBNAWorld iWorld = new DefaultBNAWorld("subworld", iModel); setupWorld(iWorld); populateModel(iWorld); populateWithViews(world, view, iWorld); } final BNACanvas bnaComposite = new BNACanvas(shell, SWT.H_SCROLL | SWT.V_SCROLL, view); BNARenderingSettings.setAntialiasGraphics(bnaComposite, true); BNARenderingSettings.setAntialiasText(bnaComposite, true); BNARenderingSettings.setDecorativeGraphics(bnaComposite, true); BNARenderingSettings.setDisplayShadows(bnaComposite, true); bnaComposite.setSize(500, 500); bnaComposite.setBackground(display.getSystemColor(SWT.COLOR_WHITE)); shell.setSize(400, 400); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } display.dispose(); System.exit(0); } static void setupTopWorld(IBNAWorld world) { IThingLogicManager logicManager = world.getThingLogicManager(); logicManager.addThingLogic(PanAndZoomLogic.class); setupWorld(world); } static void setupWorld(IBNAWorld world) { IThingLogicManager logicManager = world.getThingLogicManager(); logicManager.addThingLogic(ClickSelectionLogic.class); logicManager.addThingLogic(DragMovableLogic.class); logicManager.addThingLogic(EditTextLogic.class); logicManager.addThingLogic(KeyNudgerLogic.class); logicManager.addThingLogic(MarqueeSelectionLogic.class); logicManager.addThingLogic(PanAndZoomLogic.class); logicManager.addThingLogic(ReshapeRectangleLogic.class); logicManager.addThingLogic(ReshapeSplineLogic.class); logicManager.addThingLogic(RotatingOffsetLogic.class); logicManager.addThingLogic(StandardCursorLogic.class); logicManager.addThingLogic(ToolTipLogic.class); logicManager.addThingLogic(WorldThingExternalEventsLogic.class); logicManager.addThingLogic(WorldThingInternalEventsLogic.class); } static void populateModel(IBNAWorld world) { final IBNAModel model = world.getBNAModel(); final RectangleThing[] boxes = new RectangleThing[50]; for (int i = 0; i < boxes.length; i++) { RectangleThing box = Assemblies.createRectangle(world, null, null); Assemblies.BOUNDED_TEXT_KEY.get(box, model).setText( "Now is the time for all good men to come to the aid of their country"); ((IHasMutableColor) Assemblies.BOUNDED_TEXT_KEY.get(box, model)).setColor(new RGB(255, 0, 0)); box.setBoundingBox(new Rectangle(origin.x + 20 + i * 10, origin.y + 20 + i * 10, 100, 100)); box.setSelected(i % 2 == 0); box.setColor(new RGB(255, 255, 192)); box.setSecondaryColor(new RGB(192, 192, 128)); UserEditableUtils.addEditableQualities(box, IHasMutableSelected.USER_MAY_SELECT, IHasMutableSize.USER_MAY_RESIZE, IHasMutableReferencePoint.USER_MAY_MOVE); UserEditableUtils.addEditableQualities(Assemblies.BOUNDED_TEXT_KEY.get(box, model), IHasMutableText.USER_MAY_EDIT_TEXT); boxes[i] = box; } EndpointThing endpoint = Assemblies.createEndpoint(world, null, boxes[0]); Assemblies.DIRECTION_KEY.get(endpoint, model).setColor(new RGB(0, 0, 0)); Assemblies.DIRECTION_KEY.get(endpoint, model).setOrientation(Orientation.NORTHWEST); Assemblies.DIRECTION_KEY.get(endpoint, model).setFlow(Flow.INOUT); endpoint.setAnchorPoint(new Point2D.Double(origin.x + 20, origin.y + 20)); SplineThing spline = Assemblies.createSpline(world, null, null); spline.setArrowhead1Color(new RGB(0, 0, 0)); spline.setArrowhead2Color(new RGB(0, 0, 0)); } static void populateWithViews(IBNAWorld world, IBNAView parentView, IBNAWorld internalWorld) { IBNAModel model = world.getBNAModel(); RectangleThing vbox1 = Assemblies.addWorld(world, null, Assemblies.createRectangle(world, null, null)); Assemblies.BOUNDED_TEXT_KEY.get(vbox1, model).setText("View 1"); ((IHasMutableColor) Assemblies.BOUNDED_TEXT_KEY.get(vbox1, model)).setColor(new RGB(255, 0, 0)); vbox1.setBoundingBox(new Rectangle(origin.x + 20 + 200, origin.y + 20 + 100, 200, 200)); Assemblies.WORLD_KEY.get(vbox1, model).setWorld(internalWorld); UserEditableUtils.addEditableQualities(vbox1, IHasMutableSelected.USER_MAY_SELECT, IHasMutableSize.USER_MAY_RESIZE, IHasMutableReferencePoint.USER_MAY_MOVE); UserEditableUtils.addEditableQualities(Assemblies.BOUNDED_TEXT_KEY.get(vbox1, model), IHasMutableText.USER_MAY_EDIT_TEXT); RectangleThing vbox2 = Assemblies.addWorld(world, null, Assemblies.createRectangle(world, null, null)); Assemblies.BOUNDED_TEXT_KEY.get(vbox2, model).setText("View 2"); ((IHasMutableColor) Assemblies.BOUNDED_TEXT_KEY.get(vbox2, model)).setColor(new RGB(255, 0, 0)); vbox2.setBoundingBox(new Rectangle(origin.x + 20 + 400, origin.y + 20 + 100, 200, 200)); Assemblies.WORLD_KEY.get(vbox2, model).setWorld(internalWorld); UserEditableUtils.addEditableQualities(vbox2, IHasMutableSelected.USER_MAY_SELECT, IHasMutableSize.USER_MAY_RESIZE, IHasMutableReferencePoint.USER_MAY_MOVE); UserEditableUtils.addEditableQualities(Assemblies.BOUNDED_TEXT_KEY.get(vbox2, model), IHasMutableText.USER_MAY_EDIT_TEXT); } }