From 171ebf44734f92a9a315aa4b92c3322f850b6dd0 Mon Sep 17 00:00:00 2001 From: bancika Date: Thu, 25 Apr 2013 14:37:19 +0000 Subject: [PATCH] Ability to rotate selection --- .../diylc-core/library/main.jar | Bin 268852 -> 269303 bytes .../src/org/diylc/common/ComponentType.java | 8 +- .../org/diylc/common/ISelectionProcessor.java | 14 +- .../core/annotations/ComponentDescriptor.java | 6 + .../diylc/presenter/ComponentProcessor.java | 5 +- .../diylc/presenter/InstantiationManager.java | 2 +- .../src/org/diylc/presenter/Presenter.java | 187 ++++++++++++++---- 7 files changed, 181 insertions(+), 41 deletions(-) diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-core/library/main.jar b/ diy-layout-creator --username bancika@gmail.com/diylc-core/library/main.jar index 229c37b416002664255df428f8b5043d8742dfcd..9c31d5861bc80d0d431b980710f2c0c491dc2231 100644 GIT binary patch delta 24703 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 delta 24107 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 DE<%#g diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/common/ComponentType.java b/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/common/ComponentType.java index effcd692..a20fd58c 100644 --- a/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/common/ComponentType.java +++ b/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/common/ComponentType.java @@ -28,11 +28,12 @@ public class ComponentType { private boolean stretchable; private BomPolicy bomPolicy; private boolean autoEdit; + private boolean rotatable; public ComponentType(String name, String description, CreationMethod creationMethod, String category, String namePrefix, String author, Icon icon, Class> instanceClass, double zOrder, boolean flexibleZOrder, - boolean stretchable, BomPolicy bomPolicy, boolean autoEdit) { + boolean stretchable, BomPolicy bomPolicy, boolean autoEdit, boolean rotatable) { super(); this.name = name; this.description = description; @@ -47,6 +48,7 @@ public class ComponentType { this.stretchable = stretchable; this.bomPolicy = bomPolicy; this.autoEdit = autoEdit; + this.rotatable = rotatable; } public String getName() { @@ -100,6 +102,10 @@ public class ComponentType { public boolean isAutoEdit() { return autoEdit; } + + public boolean isRotatable() { + return rotatable; + } @Override public String toString() { diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/common/ISelectionProcessor.java b/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/common/ISelectionProcessor.java index 2f0716c4..5a332b2e 100644 --- a/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/common/ISelectionProcessor.java +++ b/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/common/ISelectionProcessor.java @@ -34,8 +34,8 @@ public interface ISelectionProcessor { List> findComponentsAt(Point point); /** - * Expands the current selection to include surrounding components. - * Options are controlled with expansionMode flag. + * Expands the current selection to include surrounding components. Options + * are controlled with expansionMode flag. * * @param expansionMode */ @@ -44,5 +44,13 @@ public interface ISelectionProcessor { /** * Selects all components in the project. */ - void selectAll(); + void selectAll(); + + /** + * Rotates selection for 90 degrees. + * + * @param direction + * 1 for clockwise, -1 for counter-clockwise + */ + void rotateSelection(int direction); } diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/core/annotations/ComponentDescriptor.java b/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/core/annotations/ComponentDescriptor.java index a4fa6880..c2927ec0 100644 --- a/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/core/annotations/ComponentDescriptor.java +++ b/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/core/annotations/ComponentDescriptor.java @@ -76,5 +76,11 @@ public @interface ComponentDescriptor { * mode. */ boolean autoEdit() default true; + + /** + * @return true if component may be rotated, false otherwise + * @return + */ + boolean rotatable() default true; } diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/presenter/ComponentProcessor.java b/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/presenter/ComponentProcessor.java index 6b809bb2..28bbc0b9 100644 --- a/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/presenter/ComponentProcessor.java +++ b/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/presenter/ComponentProcessor.java @@ -69,6 +69,7 @@ public class ComponentProcessor { boolean stretchable; BomPolicy bomPolicy; boolean autoEdit; + boolean rotatable; if (clazz.isAnnotationPresent(ComponentDescriptor.class)) { ComponentDescriptor annotation = clazz.getAnnotation(ComponentDescriptor.class); name = annotation.name(); @@ -82,6 +83,7 @@ public class ComponentProcessor { stretchable = annotation.stretchable(); bomPolicy = annotation.bomPolicy(); autoEdit = annotation.autoEdit(); + rotatable = annotation.rotatable(); } else { name = clazz.getSimpleName(); description = ""; @@ -94,6 +96,7 @@ public class ComponentProcessor { stretchable = true; bomPolicy = BomPolicy.SHOW_ALL_NAMES; autoEdit = true; + rotatable = true; } icon = null; // Draw component icon. @@ -115,7 +118,7 @@ public class ComponentProcessor { } ComponentType componentType = new ComponentType(name, description, creationMethod, category, namePrefix, author, icon, clazz, zOrder, flexibleZOrder, stretchable, - bomPolicy, autoEdit); + bomPolicy, autoEdit, rotatable); componentTypeMap.put(clazz.getName(), componentType); return componentType; } diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/presenter/InstantiationManager.java b/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/presenter/InstantiationManager.java index 8663aee8..d352dffa 100644 --- a/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/presenter/InstantiationManager.java +++ b/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/presenter/InstantiationManager.java @@ -42,7 +42,7 @@ public class InstantiationManager { private static final ComponentType clipboardType = new ComponentType( "Clipboard contents", "Components from the clipboard", CreationMethod.SINGLE_CLICK, "Multi", "", "", null, null, 0, false, - false, null, false); + false, null, false, true); public InstantiationManager() { } diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/presenter/Presenter.java b/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/presenter/Presenter.java index 02f15083..6f6834d2 100644 --- a/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/presenter/Presenter.java +++ b/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/presenter/Presenter.java @@ -6,6 +6,7 @@ import java.awt.Graphics2D; import java.awt.Point; import java.awt.Rectangle; import java.awt.dnd.DnDConstants; +import java.awt.geom.AffineTransform; import java.awt.geom.Area; import java.awt.geom.Point2D; import java.io.BufferedInputStream; @@ -40,6 +41,8 @@ import org.diylc.common.IComponentFiler; import org.diylc.common.IKeyProcessor; import org.diylc.common.IPlugIn; import org.diylc.common.IPlugInPort; +import org.diylc.common.Orientation; +import org.diylc.common.OrientationHV; import org.diylc.common.PropertyWrapper; import org.diylc.components.connectivity.SolderPad; import org.diylc.core.ExpansionMode; @@ -625,6 +628,28 @@ public class Presenter implements IPlugInPort { return false; } + boolean snapToGrid = ConfigurationManager.getInstance().readBoolean( + IPlugInPort.SNAP_TO_GRID_KEY, true); + if (shiftDown) { + snapToGrid = !snapToGrid; + } + + if (altDown) { + Project oldProject = null; + if (key == IKeyProcessor.VK_RIGHT) { + oldProject = currentProject.clone(); + rotateComponents(this.selectedComponents, 1, snapToGrid); + } else if (key == IKeyProcessor.VK_LEFT) { + oldProject = currentProject.clone(); + rotateComponents(this.selectedComponents, -1, snapToGrid); + } else + return false; + messageDispatcher.dispatchMessage(EventType.PROJECT_MODIFIED, + oldProject, currentProject.clone(), "Rotate Selection"); + messageDispatcher.dispatchMessage(EventType.REPAINT); + return true; + } + // Expand control points to include all stuck components. boolean sticky = ConfigurationManager.getInstance().readBoolean( IPlugInPort.STICKY_POINTS_KEY, true); @@ -636,12 +661,6 @@ public class Presenter implements IPlugInPort { includeStuckComponents(controlPointMap); } - boolean snapToGrid = ConfigurationManager.getInstance().readBoolean( - IPlugInPort.SNAP_TO_GRID_KEY, true); - if (shiftDown) { - snapToGrid = !snapToGrid; - } - int d; if (snapToGrid) { d = (int) currentProject.getGridSpacing().convertToPixels(); @@ -1025,35 +1044,6 @@ public class Presenter implements IPlugInPort { int height = (int) currentProject.getHeight().convertToPixels(); if (controlPointMap.size() == 1) { - // Determine how much we should move the components by trying to - // move the center point of the affected rectangle to preserve - // spacing. - // int minX = Integer.MAX_VALUE; - // int minY = Integer.MAX_VALUE; - // int maxX = Integer.MIN_VALUE; - // int maxY = Integer.MIN_VALUE; - // for (Map.Entry, Set> entry : - // controlPointMap - // .entrySet()) { - // for (int i : entry.getValue()) { - // Point p = entry.getKey().getControlPoint(i); - // if (minX > p.x) { - // minX = p.x; - // } - // if (maxX < p.x) { - // maxX = p.x; - // } - // if (minY > p.y) { - // minY = p.y; - // } - // if (maxY < p.y) { - // maxY = p.y; - // } - // } - // } - // int centerX = (maxX + minX) / 2; - // int centerY = (maxY + minY) / 2; - Map.Entry, Set> entry = controlPointMap .entrySet().iterator().next(); @@ -1133,6 +1123,133 @@ public class Presenter implements IPlugInPort { return new Point(actualDx, actualDy); } + @Override + public void rotateSelection(int direction) { + if (!selectedComponents.isEmpty()) { + Project oldProject = currentProject.clone(); + rotateComponents(this.selectedComponents, direction, isSnapToGrid()); + messageDispatcher.dispatchMessage(EventType.PROJECT_MODIFIED, + oldProject, currentProject.clone(), "Rotate Selection"); + messageDispatcher.dispatchMessage(EventType.REPAINT); + } + } + + /** + * + * @param direction + * 1 for clockwise, -1 for counter-clockwise + */ + private void rotateComponents(List> components, + int direction, boolean snapToGrid) { + Point center = getCenterOf(components, snapToGrid); + + AffineTransform rotate = AffineTransform.getRotateInstance(Math.PI / 2 + * direction, center.x, center.y); + + // Update all points to new location. + for (IDIYComponent component : components) { + drawingManager.invalidateComponent(component); + ComponentType type = ComponentProcessor.getInstance() + .extractComponentTypeFrom( + (Class>) component + .getClass()); + if (type.isRotatable()) { + for (int index = 0; index < component.getControlPointCount(); index++) { + Point p = new Point(component.getControlPoint(index)); + rotate.transform(p, p); + component.setControlPoint(p, index); + } + // If component has orientation, change it too + List newProperties = ComponentProcessor + .getInstance().extractProperties(component.getClass()); + for (PropertyWrapper property : newProperties) { + if (property.getType() == Orientation.class) { + try { + property.readFrom(component); + Orientation orientation = (Orientation) property + .getValue(); + Orientation[] values = Orientation.values(); + int newIndex = orientation.ordinal() + direction; + if (newIndex < 0) + newIndex = values.length - 1; + else if (newIndex >= values.length) + newIndex = 0; + property.setValue(values[newIndex]); + property.writeTo(component); + } catch (Exception e) { + LOG.error( + "Could not change component orientation for " + + component.getName(), e); + } + } else if (property.getType() == OrientationHV.class) { + try { + property.readFrom(component); + OrientationHV orientation = (OrientationHV) property + .getValue(); + property + .setValue(OrientationHV.values()[1 - orientation + .ordinal()]); + property.writeTo(component); + } catch (Exception e) { + LOG.error( + "Could not change component orientation for " + + component.getName(), e); + } + } + } + } else { + // Non-rotatable + Point componentCenter = getCenterOf(Arrays + .asList(new IDIYComponent[] { component }), false); + Point rotatedComponentCenter = new Point(); + rotate.transform(componentCenter, rotatedComponentCenter); + for (int index = 0; index < component.getControlPointCount(); index++) { + Point p = new Point(component.getControlPoint(index)); + p.translate(rotatedComponentCenter.x - componentCenter.x, + rotatedComponentCenter.y - componentCenter.y); + component.setControlPoint(p, index); + } + } + } + } + + private Point getCenterOf(List> components, + boolean snapToGrid) { + // Determine center of rotation + int minX = Integer.MAX_VALUE; + int minY = Integer.MAX_VALUE; + int maxX = Integer.MIN_VALUE; + int maxY = Integer.MIN_VALUE; + for (IDIYComponent component : components) { + for (int i = 0; i < component.getControlPointCount(); i++) { + Point p = component.getControlPoint(i); + if (minX > p.x) { + minX = p.x; + } + if (maxX < p.x) { + maxX = p.x; + } + if (minY > p.y) { + minY = p.y; + } + if (maxY < p.y) { + maxY = p.y; + } + } + } + int centerX = (maxX + minX) / 2; + int centerY = (maxY + minY) / 2; + + if (snapToGrid) { + CalcUtils + .roundToGrid(centerX, this.currentProject.getGridSpacing()); + CalcUtils + .roundToGrid(centerY, this.currentProject.getGridSpacing()); + } + + return new Point(centerX, centerY); + } + @Override public void dragEnded(Point point) { LOG.debug(String.format("dragEnded(%s)", point));