From 602bd81bb42e8223f0b01676b1cf868796ee225f Mon Sep 17 00:00:00 2001 From: bancika Date: Mon, 3 Jan 2011 18:33:18 +0000 Subject: [PATCH] fixed d&d alignment issues --- .../DIYLC/config.xml | 8 +- .../diylc/components/ResistorInstance.java | 3 +- .../src/com/diyfever/diylc/gui/MainFrame.java | 30 +++-- .../diyfever/diylc/presenter/Presenter.java | 103 ++++++++++++------ 4 files changed, 98 insertions(+), 46 deletions(-) diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/config.xml b/ diy-layout-creator --username bancika@gmail.com/DIYLC/config.xml index 90fffbf5..5a1e99f0 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/config.xml +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/config.xml @@ -20,12 +20,12 @@ - - metric - false - lastPath C:\Documents and Settings\Branislav Stojkovic\Desktop + + metric + true + \ No newline at end of file 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 12a98402..dd023ec0 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 @@ -18,6 +18,7 @@ import com.diyfever.diylc.model.measures.Resistance; import com.diyfever.diylc.model.measures.ResistanceUnit; import com.diyfever.diylc.model.measures.Size; import com.diyfever.diylc.model.measures.SizeUnit; +import com.diyfever.diylc.utils.Constants; public class ResistorInstance implements IComponentInstance { @@ -29,7 +30,7 @@ public class ResistorInstance implements IComponentInstance { private Size s = new Size(1d, SizeUnit.cm); private Color color = Color.green; private Point leftTopCorner = new Point(0, 0); - private Point otherCorner = new Point(100, 100); + private Point otherCorner = new Point((int) (Constants.GRID * 10), (int) (Constants.GRID * 10)); private String name = "something"; public ResistorInstance(String testField, Capacitance c, Resistance r, Size s, Color color, diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/com/diyfever/diylc/gui/MainFrame.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/com/diyfever/diylc/gui/MainFrame.java index a20a34e4..1c0c1217 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/com/diyfever/diylc/gui/MainFrame.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/com/diyfever/diylc/gui/MainFrame.java @@ -3,6 +3,8 @@ package com.diyfever.diylc.gui; import java.awt.BorderLayout; import java.awt.Container; import java.awt.Dimension; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.util.HashMap; @@ -17,7 +19,7 @@ import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JPanel; import javax.swing.SwingConstants; -import javax.swing.SwingUtilities; +import javax.swing.Timer; import com.diyfever.diylc.common.BadPositionException; import com.diyfever.diylc.model.Project; @@ -95,14 +97,24 @@ public class MainFrame extends JFrame implements IView { super.setVisible(b); // TODO: hack to prevent painting issues in the scroll bar rulers. Find // a better fix if possible. - if (b) { - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - canvasPlugin.refresh(); - } - }); - } + Timer timer = new Timer(50, new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + canvasPlugin.refresh(); + } + + }); + timer.setRepeats(false); + timer.start(); + // if (b) { + // SwingUtilities.invokeLater(new Runnable() { + // @Override + // public void run() { + // + // } + // }); + // } } private void createBasePanels() { 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 23fb5574..975fd7c0 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 @@ -87,7 +87,8 @@ public class Presenter implements IPlugInPort { // D&D private boolean dragInProgress = false; - private Point dragStartPoint = null; + // Previous mouse location, not scaled for zoom factor. + private Point previousDragPoint = null; private Project preDragProject = null; private IComponentType componentSlot; @@ -136,16 +137,19 @@ public class Presenter implements IPlugInPort { @Override public Cursor getCursorAt(Point point) { - // Scale point to remove zoom factor. - Point2D scaledPoint = new Point2D.Double(point.getX() / zoomLevel, point.getY() / zoomLevel); - for (Map.Entry entry : componentAreaMap.entrySet()) { - if (entry.getValue().contains(scaledPoint)) { + // Only change the cursor if we're not making a new component. + if (componentSlot == null) { + // Scale point to remove zoom factor. + Point2D scaledPoint = scalePoint(point); + for (Map.Entry entry : componentAreaMap.entrySet()) { + if (entry.getValue().contains(scaledPoint)) { + return Cursor.getPredefinedCursor(Cursor.HAND_CURSOR); + } + } + if (componentsUnderCursor != null && !componentsUnderCursor.isEmpty()) { return Cursor.getPredefinedCursor(Cursor.HAND_CURSOR); } } - if (componentsUnderCursor != null && !componentsUnderCursor.isEmpty()) { - return Cursor.getPredefinedCursor(Cursor.HAND_CURSOR); - } return Cursor.getDefaultCursor(); } @@ -297,17 +301,23 @@ public class Presenter implements IPlugInPort { } g2d.setTransform(initialTx); + if ((drawOptions.contains(DrawOption.ZOOM)) && (Math.abs(1.0 - zoomLevel) > 1e-4)) { + g2d.scale(zoomLevel, zoomLevel); + } // At the end draw selection rectangle. if (drawOptions.contains(DrawOption.SELECTION) && (selectionRect != null)) { g2d.setColor(Color.white); - g2d.drawRect(selectionRect.x, selectionRect.y, selectionRect.width, - selectionRect.height); + g2d.draw(selectionRect); g2d.setColor(Color.black); g2d.setStroke(Constants.dashedStroke); - g2d.drawRect(selectionRect.x, selectionRect.y, selectionRect.width, - selectionRect.height); + g2d.draw(selectionRect); } + + // g2d.setColor(Color.red); + // for (Area area : componentAreaMap.values()) { + // g2d.draw(area); + // } } @Override @@ -431,9 +441,9 @@ public class Presenter implements IPlugInPort { public void dragStarted(Point point) { LOG.debug(String.format("dragStarted(%s)", point)); dragInProgress = true; - dragStartPoint = point; preDragProject = cloner.deepClone(currentProject); Point scaledPoint = scalePoint(point); + previousDragPoint = scaledPoint; List components = findComponentsAt(scaledPoint); if (!componentsUnderCursor.isEmpty()) { // If there are control points under the cursor, drag them. @@ -457,33 +467,53 @@ public class Presenter implements IPlugInPort { @Override public boolean dragOver(Point point) { + Point scaledPoint = scalePoint(point); if (!componentsUnderCursor.isEmpty()) { - int dx = (int) ((point.x - dragStartPoint.x) / zoomLevel); - int dy = (int) ((point.y - dragStartPoint.y) / zoomLevel); + // We're dragging control point(s). + // int dx = (int) ((point.x - dragStartPoint.x) / zoomLevel); + // int dy = (int) ((point.y - dragStartPoint.y) / zoomLevel); + // + IComponentInstance firstComponent = componentsUnderCursor.keySet().iterator().next(); + ControlPointWrapper controlPoint = componentsUnderCursor.get(firstComponent); + // Re-read the value just in case. + try { + controlPoint.readFrom(firstComponent); + } catch (Exception e) { + e.printStackTrace(); + } + int x = (int) (Math + .round((controlPoint.getValue().x + scaledPoint.x - previousDragPoint.x) + / Constants.GRID) * Constants.GRID); + int y = (int) (Math + .round((controlPoint.getValue().y + scaledPoint.y - previousDragPoint.y) + / Constants.GRID) * Constants.GRID); + previousDragPoint.setLocation(x, y); + for (Entry entry : componentsUnderCursor .entrySet()) { try { - ControlPointWrapper controlPoint = entry.getValue(); + controlPoint = entry.getValue(); IComponentInstance component = entry.getKey(); controlPoint.readFrom(component); if (controlPoint.isEditable()) { - controlPoint.getValue().translate(dx, dy); + controlPoint.getValue().setLocation(x, y); } controlPoint.writeTo(component); } catch (Exception e) { } } - dragStartPoint = point; + // 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); + this.selectionRect = Utils.createRectangle(scaledPoint, previousDragPoint); + // messageDispatcher.dispatchMessage(EventType.SELECTION_RECT_CHANGED, + // selectionRect); } else { // If there are components selected translate their control points. - translateSelectedComponents(dragStartPoint, point); - dragStartPoint = point; + translateSelectedComponents(previousDragPoint, scaledPoint); + // dragStartPoint = point; } messageDispatcher.dispatchMessage(EventType.REPAINT); return true; @@ -495,19 +525,17 @@ public class Presenter implements IPlugInPort { if (!dragInProgress) { return; } + Point scaledPoint = scalePoint(point); if (selectedComponents.isEmpty()) { // If there's no selection finalize selectionRect and see which // components intersect with it. - if (point != null) { - this.selectionRect = Utils.createRectangle(point, dragStartPoint); + if (scaledPoint != null) { + this.selectionRect = Utils.createRectangle(scaledPoint, previousDragPoint); } selectedComponents.clear(); for (IComponentInstance component : currentProject.getComponents()) { Area area = componentAreaMap.get(component); - if ((area != null) - && area.intersects(selectionRect.x / zoomLevel, - selectionRect.y / zoomLevel, selectionRect.width / zoomLevel, - selectionRect.height / zoomLevel)) { + if ((area != null) && area.intersects(selectionRect)) { selectedComponents.add(component); } } @@ -530,8 +558,9 @@ public class Presenter implements IPlugInPort { LOG.debug("Drag ended outside the drawing area."); return; } - int dx = (int) ((toPoint.x - fromPoint.x) / zoomLevel); - int dy = (int) ((toPoint.y - fromPoint.y) / zoomLevel); + int dx = (int) (Math.round((toPoint.x - fromPoint.x) / zoomLevel / Constants.GRID) * Constants.GRID); + int dy = (int) (Math.round((toPoint.y - fromPoint.y) / zoomLevel / Constants.GRID) * Constants.GRID); + fromPoint.translate(dx, dy); for (IComponentInstance component : selectedComponents) { List controlPoints = ComponentProcessor.getInstance() .extractControlPoints(component.getClass()); @@ -539,7 +568,7 @@ public class Presenter implements IPlugInPort { try { controlPoint.readFrom(component); if (controlPoint.isEditable()) { - controlPoint.getValue().translate(dx, dy); + translateControlPoint(controlPoint, dx, dy); } controlPoint.writeTo(component); } catch (Exception e) { @@ -549,6 +578,12 @@ public class Presenter implements IPlugInPort { } } + private void translateControlPoint(ControlPointWrapper controlPoint, int dx, int dy) { + int x = controlPoint.getValue().x + dx; + int y = controlPoint.getValue().y + dy; + controlPoint.getValue().setLocation(x, y); + } + @Override public void addComponents(List components, Point preferredPoint) { LOG.debug(String.format("addComponents(%s)", components)); @@ -628,7 +663,11 @@ public class Presenter implements IPlugInPort { if (point != null) { for (ControlPointWrapper controlPoint : controlPoints) { controlPoint.readFrom(component); - controlPoint.getValue().translate(point.x, point.y); + int x = controlPoint.getValue().x + point.x; + int y = controlPoint.getValue().y + point.y; + x = (int) (Math.round(x / Constants.GRID) * Constants.GRID); + y = (int) (Math.round(y / Constants.GRID) * Constants.GRID); + controlPoint.getValue().setLocation(x, y); controlPoint.writeTo(component); } }