diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/build.xml b/ diy-layout-creator --username bancika@gmail.com/DIYLC/build.xml index d811e041..ae556a0f 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/build.xml +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/build.xml @@ -35,6 +35,11 @@ + + + + + @@ -43,6 +48,7 @@ + diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/components/AbstractLeadedComponent.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/components/AbstractLeadedComponent.java index e5bb6e53..f84013cf 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/components/AbstractLeadedComponent.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/components/AbstractLeadedComponent.java @@ -200,10 +200,7 @@ public abstract class AbstractLeadedComponent extends AbstractTransparentComp @Override public void setControlPoint(Point point, int index) { - // Only accept the change if ending points are not the same. - if (!point.equals(points[1 - index])) { - points[index].setLocation(point); - } + points[index].setLocation(point); } @EditableProperty(name = "Color") diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/plugins/canvas/CanvasPanel.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/plugins/canvas/CanvasPanel.java index fc58cc96..e058d25b 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/plugins/canvas/CanvasPanel.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/plugins/canvas/CanvasPanel.java @@ -185,20 +185,25 @@ class CanvasPanel extends JComponent implements Autoscroll { List properties = plugInPort .getMutualSelectionProperties(); if (properties == null || properties.isEmpty()) { - properties = plugInPort.getProjectProperties(); - PropertyEditorDialog editor = DialogFactory.getInstance() - .createPropertyEditorDialog(properties, "Edit Project"); - editor.setVisible(true); - if (ButtonDialog.OK.equals(editor.getSelectedButtonCaption())) { - plugInPort.applyPropertiesToProject(properties); - // Save default values. - for (PropertyWrapper property : editor.getDefaultedProperties()) { - if (property.getValue() != null) { - plugInPort.setProjectDefaultPropertyValue(property.getName(), - property.getValue()); - } - } - } + // properties = plugInPort.getProjectProperties(); + // PropertyEditorDialog editor = + // DialogFactory.getInstance() + // .createPropertyEditorDialog(properties, + // "Edit Project"); + // editor.setVisible(true); + // if + // (ButtonDialog.OK.equals(editor.getSelectedButtonCaption())) + // { + // plugInPort.applyPropertiesToProject(properties); + // // Save default values. + // for (PropertyWrapper property : + // editor.getDefaultedProperties()) { + // if (property.getValue() != null) { + // plugInPort.setProjectDefaultPropertyValue(property.getName(), + // property.getValue()); + // } + // } + // } } else { PropertyEditorDialog editor = DialogFactory.getInstance() .createPropertyEditorDialog(properties, "Edit Selection"); diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/plugins/file/FileMenuPlugin.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/plugins/file/FileMenuPlugin.java index d09c25c5..48f945e1 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/plugins/file/FileMenuPlugin.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/plugins/file/FileMenuPlugin.java @@ -12,9 +12,12 @@ import javax.swing.AbstractAction; import org.diylc.common.EventType; import org.diylc.common.IPlugIn; import org.diylc.common.IPlugInPort; +import org.diylc.common.PropertyWrapper; import org.diylc.gui.DialogFactory; +import org.diylc.gui.editor.PropertyEditorDialog; import org.diylc.images.IconLoader; +import com.diyfever.gui.ButtonDialog; import com.diyfever.gui.IDrawingProvider; import com.diyfever.gui.export.DrawingExporter; import com.lowagie.text.DocumentException; @@ -74,6 +77,19 @@ public class FileMenuPlugin implements IPlugIn { return; } plugInPort.createNewProject(); + List properties = plugInPort.getProjectProperties(); + PropertyEditorDialog editor = DialogFactory.getInstance().createPropertyEditorDialog( + properties, "Edit Project"); + editor.setVisible(true); + if (ButtonDialog.OK.equals(editor.getSelectedButtonCaption())) { + plugInPort.applyPropertiesToProject(properties); + } + // Save default values. + for (PropertyWrapper property : editor.getDefaultedProperties()) { + if (property.getValue() != null) { + plugInPort.setProjectDefaultPropertyValue(property.getName(), property.getValue()); + } + } } } diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/Presenter.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/Presenter.java index feccef78..d82b41ba 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/Presenter.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/Presenter.java @@ -98,7 +98,8 @@ public class Presenter implements IPlugInPort { private Project preDragProject = null; // Component creation - private ComponentType componentSlot; + private ComponentType componentTypeSlot; + private IDIYComponent componentSlot; private Point controlPointSlot; private Point potentialControlPoint; @@ -159,7 +160,7 @@ public class Presenter implements IPlugInPort { @Override public Cursor getCursorAt(Point point) { // Only change the cursor if we're not making a new component. - if (componentSlot == null) { + if (componentTypeSlot == null) { // Scale point to remove zoom factor. Point2D scaledPoint = scalePoint(point); if (projectPainter.isCursorOverArea(scaledPoint)) { @@ -288,14 +289,22 @@ public class Presenter implements IPlugInPort { } Set> groupedComponents = new HashSet>(); for (IDIYComponent component : currentProject.getComponents()) { - // Only try to draw control points of ungrouped + // Only try to draw control points of ungrouped components. if (findAllGroupedComponents(component).size() > 1) { groupedComponents.add(component); } } + // Don't draw the component in the slot if both control points match. + IDIYComponent componentSlotToDraw; + if (controlPointSlot != null && potentialControlPoint != null + && potentialControlPoint.equals(controlPointSlot)) { + componentSlotToDraw = null; + } else { + componentSlotToDraw = componentSlot; + } projectPainter.drawProject(g2d, currentProject, drawOptions, filter, selectionRect, selectedComponents, groupedComponents, Arrays.asList(controlPointSlot, - potentialControlPoint), dragInProgress, zoomLevel); + potentialControlPoint), componentSlotToDraw, dragInProgress, zoomLevel); } @Override @@ -333,43 +342,74 @@ public class Presenter implements IPlugInPort { LOG.debug(String .format("mouseClicked(%s, %s, %s, %s)", point, ctrlDown, shiftDown, altDown)); Point scaledPoint = scalePoint(point); - if (componentSlot != null) { - switch (componentSlot.getCreationMethod()) { + if (componentTypeSlot != null) { + // Keep the reference to component type for later. + ComponentType componentType = componentTypeSlot; + Project oldProject = cloner.deepClone(currentProject); + switch (componentTypeSlot.getCreationMethod()) { case SINGLE_CLICK: try { - instantiateComponent(componentSlot, scaledPoint); + IDIYComponent component = instantiateComponent(componentTypeSlot, + scaledPoint); + addComponent(component, componentTypeSlot); + // Select the new component + selectedComponents.clear(); + selectedComponents.add(component); + + fireSelectionChanged(); + // messageDispatcher.dispatchMessage(EventType.SELECTION_CHANGED, + // selectedComponents); + // messageDispatcher.dispatchMessage(EventType.SELECTION_SIZE_CHANGED, + // calculateSelectionDimension()); + messageDispatcher.dispatchMessage(EventType.REPAINT); } catch (Exception e) { LOG.error("Error instatiating component of type: " - + componentSlot.getInstanceClass().getName(), e); + + componentTypeSlot.getInstanceClass().getName(), e); } setNewComponentSlot(null); break; case POINT_BY_POINT: - if (controlPointSlot != null) { + // First click is just to set the controlPointSlot and + // componentSlot. + if (snapToGrid) { snapPointToGrid(scaledPoint); - if (scaledPoint.equals(controlPointSlot)) { - String message = "Cannot create the component because both controls points match. Choose the second control point."; - LOG.warn(message); - view.showMessage(message, "Error", JOptionPane.ERROR_MESSAGE); - return; - } - try { - instantiateComponent(componentSlot, controlPointSlot, scaledPoint); - } catch (Exception e) { - LOG.error("Error instatiating component of type: " - + componentSlot.getInstanceClass().getName(), e); - } - setNewComponentSlot(null); - } else { + } + if (controlPointSlot == null) { controlPointSlot = scaledPoint; - snapPointToGrid(controlPointSlot); - messageDispatcher.dispatchMessage(EventType.SLOT_CHANGED, componentSlot, + try { + componentSlot = instantiateComponent(componentTypeSlot, controlPointSlot); + } catch (Exception e) { + view.showMessage("Could not create component. Check log for details.", + "Error", JOptionPane.ERROR_MESSAGE); + LOG.error("Could not create component", e); + } + // Set the other control point to the same location, we'll + // move it later when mouse moves. + componentSlot.setControlPoint(controlPointSlot, 0); + componentSlot.setControlPoint(controlPointSlot, 1); + messageDispatcher.dispatchMessage(EventType.SLOT_CHANGED, componentTypeSlot, controlPointSlot); messageDispatcher.dispatchMessage(EventType.REPAINT); + } else { + // On the second click, add the component to the project. + componentSlot.setControlPoint(scaledPoint, 1); + addComponent(componentSlot, componentTypeSlot); + // Select the new component + selectedComponents.clear(); + selectedComponents.add(componentSlot); + fireSelectionChanged(); + messageDispatcher.dispatchMessage(EventType.REPAINT); + setNewComponentSlot(null); } break; default: - LOG.error("Unknown creation method: " + componentSlot.getCreationMethod()); + LOG.error("Unknown creation method: " + componentTypeSlot.getCreationMethod()); + } + // Notify the listeners. + if (!oldProject.equals(currentProject)) { + messageDispatcher.dispatchMessage(EventType.PROJECT_MODIFIED, oldProject, cloner + .deepClone(currentProject), "Add " + componentType.getName()); + projectFileManager.notifyFileChange(); } } else { List> components = findComponentsAt(scaledPoint); @@ -405,9 +445,44 @@ public class Presenter implements IPlugInPort { public void mouseMoved(Point point, boolean ctrlDown, boolean shiftDown, boolean altDown) { Map, Set> components = new HashMap, Set>(); Point scaledPoint = scalePoint(point); - if (componentSlot != null) { - potentialControlPoint = scaledPoint; - snapPointToGrid(potentialControlPoint); + if (componentTypeSlot != null) { + if (snapToGrid) { + snapPointToGrid(scaledPoint); + } + switch (componentTypeSlot.getCreationMethod()) { + case POINT_BY_POINT: + potentialControlPoint = scaledPoint; + if (componentSlot != null) { + componentSlot.setControlPoint(scaledPoint, 1); + } + break; + case SINGLE_CLICK: + if (potentialControlPoint == null) { + potentialControlPoint = new Point(0, 0); + } + int dx = scaledPoint.x - potentialControlPoint.x; + int dy = scaledPoint.y - potentialControlPoint.y; + if (snapToGrid) { + dx = roundToGrid(dx); + dy = roundToGrid(dy); + } + // Only repaint if there's an actual change. + if (dx == 0 && dy == 0) { + return; + } + potentialControlPoint.translate(dx, dy); + if (componentSlot == null) { + LOG.error("Component slot should not be null!"); + } else { + Point p = new Point(); + for (int i = 0; i < componentSlot.getControlPointCount(); i++) { + p.setLocation(componentSlot.getControlPoint(i)); + p.translate(dx, dy); + componentSlot.setControlPoint(p, i); + } + } + break; + } messageDispatcher.dispatchMessage(EventType.REPAINT); } else { // Go backwards so we take the highest z-order components first. @@ -767,6 +842,10 @@ public class Presenter implements IPlugInPort { Project oldProject = cloner.deepClone(currentProject); // Remove selected components from any groups. ungroupComponents(selectedComponents); + // Remove from area map. + for (IDIYComponent component : selectedComponents) { + projectPainter.invalidateComponent(component); + } currentProject.getComponents().removeAll(selectedComponents); this.selectedComponents.clear(); messageDispatcher.dispatchMessage(EventType.PROJECT_MODIFIED, oldProject, cloner @@ -779,7 +858,7 @@ public class Presenter implements IPlugInPort { @Override public void setSelectionDefaultPropertyValue(String propertyName, Object value) { LOG.info(String.format("setSelectionDefaultPropertyValue(%s, %s)", propertyName, value)); - for (IDIYComponent component : selectedComponents) { + for (IDIYComponent component : selectedComponents) { String className = component.getClass().getName(); LOG.debug("Default property value set for " + className + ":" + propertyName); ConfigurationManager.getInstance().writeValue( @@ -936,14 +1015,12 @@ public class Presenter implements IPlugInPort { } } - private void instantiateComponent(ComponentType componentType, Point... points) + private IDIYComponent instantiateComponent(ComponentType componentType, Point point) throws Exception { LOG.info("Instatiating component of type: " + componentType.getInstanceClass().getName()); - Project oldProject = cloner.deepClone(currentProject); - // Instantiate the component. - IDIYComponent component = componentType.getInstanceClass().newInstance(); + IDIYComponent component = componentType.getInstanceClass().newInstance(); // Find the next available componentName for the component. int i = 0; @@ -952,7 +1029,7 @@ public class Presenter implements IPlugInPort { i++; String name = componentType.getNamePrefix() + i; exists = false; - for (IDIYComponent c : currentProject.getComponents()) { + for (IDIYComponent c : currentProject.getComponents()) { if (c.getName().equals(name)) { exists = true; break; @@ -961,48 +1038,19 @@ public class Presenter implements IPlugInPort { } component.setName(componentType.getNamePrefix() + i); - // Add it to the project taking z-order into account. - addComponent(component, componentType); - // Select the new component - selectedComponents.clear(); - selectedComponents.add(component); - // Translate them to the desired location. - if (points != null) { - switch (componentType.getCreationMethod()) { - case SINGLE_CLICK: - for (int j = 0; j < component.getControlPointCount(); j++) { - Point controlPoint = new Point(component.getControlPoint(j)); - controlPoint.translate(points[0].x, points[0].y); - snapPointToGrid(controlPoint); - component.setControlPoint(controlPoint, j); - } - break; - case POINT_BY_POINT: - for (int j = 0; j < points.length; j++) { - Point point = points[j]; - snapPointToGrid(point); - component.setControlPoint(point, j); - } - break; + if (point != null) { + for (int j = 0; j < component.getControlPointCount(); j++) { + Point controlPoint = new Point(component.getControlPoint(j)); + controlPoint.translate(point.x, point.y); + snapPointToGrid(controlPoint); + component.setControlPoint(controlPoint, j); } } setDefaultProperties(component); - // Notify the listeners. - if (!oldProject.equals(currentProject)) { - messageDispatcher.dispatchMessage(EventType.PROJECT_MODIFIED, oldProject, cloner - .deepClone(currentProject), "Add " + componentType.getName()); - projectFileManager.notifyFileChange(); - } - - fireSelectionChanged(); - // messageDispatcher.dispatchMessage(EventType.SELECTION_CHANGED, - // selectedComponents); - // messageDispatcher.dispatchMessage(EventType.SELECTION_SIZE_CHANGED, - // calculateSelectionDimension()); - messageDispatcher.dispatchMessage(EventType.REPAINT); + return component; } /** @@ -1116,7 +1164,24 @@ public class Presenter implements IPlugInPort { public void setNewComponentSlot(ComponentType componentType) { LOG.info(String.format("setNewComponentSlot(%s)", componentType == null ? null : componentType.getName())); - this.componentSlot = componentType; + this.componentTypeSlot = componentType; + if (componentTypeSlot == null) { + this.componentSlot = null; + } else { + switch (componentTypeSlot.getCreationMethod()) { + case POINT_BY_POINT: + this.componentSlot = null; + break; + case SINGLE_CLICK: + try { + this.componentSlot = instantiateComponent(componentTypeSlot, new Point(0, 0)); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + break; + } + } this.controlPointSlot = null; this.potentialControlPoint = null; selectedComponents.clear(); @@ -1126,7 +1191,8 @@ public class Presenter implements IPlugInPort { // selectedComponents); // messageDispatcher.dispatchMessage(EventType.SELECTION_SIZE_CHANGED, // calculateSelectionDimension()); - messageDispatcher.dispatchMessage(EventType.SLOT_CHANGED, componentSlot, controlPointSlot); + messageDispatcher.dispatchMessage(EventType.SLOT_CHANGED, componentTypeSlot, + controlPointSlot); } /** diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/ProjectPainter.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/ProjectPainter.java index 5ba649a0..1d56a8d4 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/ProjectPainter.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/ProjectPainter.java @@ -1,7 +1,9 @@ package org.diylc.presenter; +import java.awt.AlphaComposite; import java.awt.BasicStroke; import java.awt.Color; +import java.awt.Composite; import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.Point; @@ -50,6 +52,8 @@ public class ProjectPainter { // determine which components are invalidated when they are not in the map. private Map, ComponentState> lastDrawnStateMap; + private Composite slotComposite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.3f); + public ProjectPainter() { super(); componentAreaMap = new HashMap, Area>(); @@ -59,7 +63,7 @@ public class ProjectPainter { public void drawProject(Graphics2D g2d, Project project, Set drawOptions, IComponentFiler filter, Rectangle selectionRect, ComponentSelection selectedComponents, Set> groupedComponents, List controlPointSlot, - boolean dragInProgress, double zoomLevel) { + IDIYComponent componentSlot, boolean dragInProgress, double zoomLevel) { if (project == null) { return; } @@ -149,21 +153,6 @@ public class ProjectPainter { } } - // Draw control points of the component in the slot. - if (controlPointSlot != null) { - for (Point point : controlPointSlot) { - if (point != null) { - g2dWrapper.setColor(SELECTED_CONTROL_POINT_COLOR.darker()); - g2dWrapper.fillOval(point.x - CONTROL_POINT_SIZE / 2, point.y - - CONTROL_POINT_SIZE / 2, CONTROL_POINT_SIZE, CONTROL_POINT_SIZE); - g2dWrapper.setColor(SELECTED_CONTROL_POINT_COLOR); - g2dWrapper.fillOval(point.x - CONTROL_POINT_SIZE / 2 + 1, point.y - - CONTROL_POINT_SIZE / 2 + 1, CONTROL_POINT_SIZE - 2, - CONTROL_POINT_SIZE - 2); - } - } - } - // Draw control points. if (drawOptions.contains(DrawOption.CONTROL_POINTS)) { // Draw unselected points first to make sure they are below. @@ -208,6 +197,29 @@ public class ProjectPainter { } } + // Draw component slot in a separate composite. + if (componentSlot != null) { + g2dWrapper.startedDrawingComponent(); + g2dWrapper.setComposite(slotComposite); + componentSlot.draw(g2dWrapper, ComponentState.NORMAL, project, g2dWrapper); + g2dWrapper.finishedDrawingComponent(); + } + + // Draw control points of the component in the slot. + if (controlPointSlot != null) { + for (Point point : controlPointSlot) { + if (point != null) { + g2dWrapper.setColor(SELECTED_CONTROL_POINT_COLOR.darker()); + g2dWrapper.fillOval(point.x - CONTROL_POINT_SIZE / 2, point.y + - CONTROL_POINT_SIZE / 2, CONTROL_POINT_SIZE, CONTROL_POINT_SIZE); + g2dWrapper.setColor(SELECTED_CONTROL_POINT_COLOR); + g2dWrapper.fillOval(point.x - CONTROL_POINT_SIZE / 2 + 1, point.y + - CONTROL_POINT_SIZE / 2 + 1, CONTROL_POINT_SIZE - 2, + CONTROL_POINT_SIZE - 2); + } + } + } + // Go back to the original transformation and zoom in to draw the // selection rectangle and other similar elements. // g2d.setTransform(initialTx); @@ -236,6 +248,7 @@ public class ProjectPainter { } public void invalidateComponent(IDIYComponent component) { + componentAreaMap.remove(component); lastDrawnStateMap.remove(component); }