diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src.library/com/diyfever/diylc/components/ResistorInstance.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src.library/com/diyfever/diylc/components/ResistorInstance.java index dcb5a17c..12a98402 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src.library/com/diyfever/diylc/components/ResistorInstance.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src.library/com/diyfever/diylc/components/ResistorInstance.java @@ -57,7 +57,7 @@ public class ResistorInstance implements IComponentInstance { this.name = name; } - @ControlPoint(visibilityPolicy = VisibilityPolicy.WHEN_SELECTED) + @ControlPoint(visibilityPolicy = VisibilityPolicy.ALWAYS) public Point getLeftTopCorner() { return leftTopCorner; } @@ -66,7 +66,7 @@ public class ResistorInstance implements IComponentInstance { this.leftTopCorner = leftTopCorner; } - @ControlPoint(visibilityPolicy = VisibilityPolicy.WHEN_SELECTED) + @ControlPoint(visibilityPolicy = VisibilityPolicy.ALWAYS) public Point getOtherCorner() { return otherCorner; } diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/com/diyfever/diylc/common/IPlugInPort.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/com/diyfever/diylc/common/IPlugInPort.java index 6ca139ed..4b34f784 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/com/diyfever/diylc/common/IPlugInPort.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/com/diyfever/diylc/common/IPlugInPort.java @@ -139,13 +139,22 @@ public interface IPlugInPort { void setZoomLevel(double zoomLevel); /** - * Note: point coordinates are scaled for zoom factor. + * Notifies the presenter that mouse is clicked. + * + * Note: point coordinates are display based, i.e. scaled for zoom factor. * * @param point */ void mouseClicked(Point point, boolean ctrlDown, boolean shiftDown, boolean altDown); - void mouseMoved(Point point); + /** + * Notifies the presenter that mouse is moved. + * + * Note: point coordinates are display based, i.e. scaled for zoom factor. + * + * @param point + */ + void mouseMoved(Point point, boolean ctrlDown, boolean shiftDown, boolean altDown); /** * Returns the current {@link ComponentSelection}. diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/com/diyfever/diylc/plugins/canvas/CanvasPanel.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/com/diyfever/diylc/plugins/canvas/CanvasPanel.java index ff2fca21..28ff5b6a 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/com/diyfever/diylc/plugins/canvas/CanvasPanel.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/com/diyfever/diylc/plugins/canvas/CanvasPanel.java @@ -144,7 +144,8 @@ class CanvasPanel extends JComponent implements Autoscroll { @Override public void mouseMoved(MouseEvent e) { setCursor(plugInPort.getCursorAt(e.getPoint())); - plugInPort.mouseMoved(e.getPoint()); + plugInPort.mouseMoved(e.getPoint(), e.isControlDown(), e.isShiftDown(), e + .isAltDown()); } }); addMouseListener(new MouseAdapter() { diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/com/diyfever/diylc/plugins/statusbar/StatusBar.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/com/diyfever/diylc/plugins/statusbar/StatusBar.java index ede259da..b11c102e 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/com/diyfever/diylc/plugins/statusbar/StatusBar.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/com/diyfever/diylc/plugins/statusbar/StatusBar.java @@ -5,8 +5,10 @@ import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.util.ArrayList; import java.util.EnumSet; import java.util.List; +import java.util.Map; import javax.swing.BorderFactory; import javax.swing.JComboBox; @@ -15,6 +17,7 @@ import javax.swing.JPanel; import javax.swing.SwingUtilities; import com.diyfever.diylc.common.BadPositionException; +import com.diyfever.diylc.common.ControlPointWrapper; import com.diyfever.diylc.common.EventType; import com.diyfever.diylc.common.IPlugIn; import com.diyfever.diylc.common.IPlugInPort; @@ -159,7 +162,8 @@ public class StatusBar extends JPanel implements IPlugIn { refreshStatusText(); break; case AVAILABLE_CTRL_POINTS_CHANGED: - componentsUnderCursor = (List) params[0]; + componentsUnderCursor = new ArrayList( + ((Map) params[0]).keySet()); refreshStatusText(); break; } @@ -170,16 +174,34 @@ public class StatusBar extends JPanel implements IPlugIn { if ((componentsUnderCursor == null) || (componentsUnderCursor.isEmpty())) { getStatusLabel().setText(""); } else { - String formattedNames = ""; - int n = 1; - for (IComponentInstance component : componentsUnderCursor) { - if (n > 1) { - formattedNames += ", "; - } - formattedNames += ComponentProcessor.getInstance().extractBomName(component) - + " (" + n++ + ")"; + // String formattedNames = ""; + // int n = 1; + // for (IComponentInstance component : componentsUnderCursor) { + // if (n > 1) { + // formattedNames += ", "; + // } + // formattedNames += + // ComponentProcessor.getInstance().extractBomName(component);// + // + + // // " (" + // // + + // // n++ + // // + + // // ")"; + // } + if (componentsUnderCursor.size() == 1) { + getStatusLabel().setText( + "Drag \"" + + ComponentProcessor.getInstance().extractBomName( + componentsUnderCursor.get(0)) + "\""); + } else { + getStatusLabel().setText( + "Hold CTRL key to drag all " + + componentsUnderCursor.size() + + " components under the cursor or drag only \"" + + ComponentProcessor.getInstance().extractBomName( + componentsUnderCursor.get(0)) + "\""); } - getStatusLabel().setText("" + "Edit: " + formattedNames + ""); } } else { getStatusLabel().setText( diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/com/diyfever/diylc/presenter/Presenter.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/com/diyfever/diylc/presenter/Presenter.java index ace0dd02..ce158e5f 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/com/diyfever/diylc/presenter/Presenter.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/com/diyfever/diylc/presenter/Presenter.java @@ -19,6 +19,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.Map.Entry; import javax.swing.Action; import javax.swing.JComponent; @@ -70,7 +71,7 @@ public class Presenter implements IPlugInPort { private ComponentSelection selectedComponents; // List of component names that have at least one of their control points // under the last recorded mouse position. - private List componentsUnderCursor; + private Map componentsUnderCursor; private Cloner cloner; @@ -141,6 +142,9 @@ public class Presenter implements IPlugInPort { return Cursor.getPredefinedCursor(Cursor.HAND_CURSOR); } } + if (componentsUnderCursor != null && !componentsUnderCursor.isEmpty()) { + return Cursor.getPredefinedCursor(Cursor.HAND_CURSOR); + } return Cursor.getDefaultCursor(); } @@ -376,8 +380,8 @@ public class Presenter implements IPlugInPort { } @Override - public void mouseMoved(Point point) { - List components = new ArrayList(); + public void mouseMoved(Point point, boolean ctrlDown, boolean shiftDown, boolean altDown) { + Map components = new HashMap(); Point scaledPoint = scalePoint(point); for (IComponentInstance component : currentProject.getComponents()) { List currentPoints = ComponentProcessor.getInstance() @@ -387,7 +391,7 @@ public class Presenter implements IPlugInPort { try { controlPoint.readFrom(component); if (scaledPoint.distance(controlPoint.getValue()) < CONTROL_POINT_SENSITIVITY) { - components.add(component); + components.put(component, controlPoint); break; } } catch (Exception e) { @@ -425,8 +429,10 @@ public class Presenter implements IPlugInPort { dragStartPoint = point; Point scaledPoint = scalePoint(point); List components = findComponentsAt(scaledPoint); - // If no components are under the cursor, reset selection. - if (components.isEmpty()) { + if (!componentsUnderCursor.isEmpty()) { + // If there are control points under the cursor, drag them. + } else if (components.isEmpty()) { + // If no components are under the cursor, reset selection. selectedComponents.clear(); messageDispatcher.dispatchMessage(EventType.SELECTION_CHANGED, selectedComponents); messageDispatcher.dispatchMessage(EventType.REPAINT); @@ -445,18 +451,35 @@ public class Presenter implements IPlugInPort { @Override public boolean dragOver(Point point) { - // If there's no selection, the only thing to do is update the selection - // rectangle and refresh. - if (selectedComponents.isEmpty()) { + if (!componentsUnderCursor.isEmpty()) { + int dx = (int) ((point.x - dragStartPoint.x) / zoomLevel); + int dy = (int) ((point.y - dragStartPoint.y) / zoomLevel); + for (Entry entry : componentsUnderCursor + .entrySet()) { + try { + ControlPointWrapper controlPoint = entry.getValue(); + IComponentInstance component = entry.getKey(); + controlPoint.readFrom(component); + if (controlPoint.isEditable()) { + controlPoint.getValue().translate(dx, dy); + } + controlPoint.writeTo(component); + } catch (Exception e) { + + } + } + dragStartPoint = point; + } else if (selectedComponents.isEmpty()) { + // If there's no selection, the only thing to do is update the + // selection rectangle and refresh. this.selectionRect = Utils.createRectangle(point, dragStartPoint); messageDispatcher.dispatchMessage(EventType.SELECTION_RECT_CHANGED, selectionRect); - messageDispatcher.dispatchMessage(EventType.REPAINT); } else { // If there are components selected translate their control points. - translateSelection(dragStartPoint, point); + translateSelectedComponents(dragStartPoint, point); dragStartPoint = point; - messageDispatcher.dispatchMessage(EventType.REPAINT); } + messageDispatcher.dispatchMessage(EventType.REPAINT); return true; } @@ -490,7 +513,7 @@ public class Presenter implements IPlugInPort { Project oldProject = cloner.deepClone(currentProject); // If there are components selected translate their control points. - translateSelection(dragStartPoint, point); + translateSelectedComponents(dragStartPoint, point); if (!oldProject.equals(currentProject)) { messageDispatcher.dispatchMessage(EventType.PROJECT_MODIFIED, oldProject, cloner .deepClone(currentProject), "Move"); @@ -500,7 +523,7 @@ public class Presenter implements IPlugInPort { dragInProgress = false; } - private void translateSelection(Point fromPoint, Point toPoint) { + private void translateSelectedComponents(Point fromPoint, Point toPoint) { if (toPoint == null) { LOG.debug("Drag ended outside the drawing area."); return; @@ -668,6 +691,12 @@ public class Presenter implements IPlugInPort { messageDispatcher.dispatchMessage(EventType.SLOT_CHANGED, componentSlot); } + /** + * Scales point from display base to actual base. + * + * @param point + * @return + */ private Point scalePoint(Point point) { return new Point((int) (point.x / zoomLevel), (int) (point.y / zoomLevel)); }