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 7db6c71a..6e6f225b 100644
--- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/config.xml
+++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/config.xml
@@ -1,14 +1,14 @@
\ No newline at end of file
diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/library/main.jar b/ diy-layout-creator --username bancika@gmail.com/DIYLC/library/main.jar
index 8d0dbb07..c479bf4b 100644
Binary files a/ diy-layout-creator --username bancika@gmail.com/DIYLC/library/main.jar and b/ diy-layout-creator --username bancika@gmail.com/DIYLC/library/main.jar differ
diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/common/EventType.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/common/EventType.java
index 5ddf73d3..5820402f 100644
--- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/common/EventType.java
+++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/common/EventType.java
@@ -75,5 +75,7 @@ public enum EventType {
* Called when mouse cursor is moved. Point object is passed, containing the
* current cursor location (not taking zoom into account).
*/
- MOUSE_MOVED;
+ MOUSE_MOVED,
+ LAYER_STATE_CHANGED;
+ ;
}
diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/common/IPlugInPort.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/common/IPlugInPort.java
index 3809ca05..6309534d 100644
--- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/common/IPlugInPort.java
+++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/common/IPlugInPort.java
@@ -34,6 +34,8 @@ import com.diyfever.gui.update.VersionNumber;
* @see EventType
*/
public interface IPlugInPort {
+
+ public static final String CHECK_BOX_MENU_ITEM = "org.diylc.checkBoxMenuItem";
/**
* Returns size of the canvas that takes project dimensions into account as
@@ -349,4 +351,6 @@ public interface IPlugInPort {
* Ungroups all selected components.
*/
void ungroupSelectedComponents();
+
+ void setLayerLocked(int layerZOrder, boolean locked);
}
diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/common/ObjectCache.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/common/ObjectCache.java
index c56ef114..b72e10cb 100644
--- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/common/ObjectCache.java
+++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/common/ObjectCache.java
@@ -1,26 +1,33 @@
package org.diylc.common;
+import java.awt.AlphaComposite;
import java.awt.BasicStroke;
import java.awt.Stroke;
import java.util.HashMap;
import java.util.Map;
+/**
+ * Repository for object that may be reused, such as {@link Stroke} or
+ * {@link AlphaComposite}.
+ *
+ * @author Branislav Stojkovic
+ */
public class ObjectCache {
private static ObjectCache instance;
-
+
public static ObjectCache getInstance() {
if (instance == null) {
instance = new ObjectCache();
}
return instance;
}
-
+
private ObjectCache() {
}
-
+
private Map basicStrokeMap = new HashMap();
-
+
public Stroke fetchBasicStroke(int width) {
if (basicStrokeMap.containsKey(width)) {
return basicStrokeMap.get(width);
diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/core/Project.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/core/Project.java
index 3f0f926d..2b54b590 100644
--- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/core/Project.java
+++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/core/Project.java
@@ -34,10 +34,12 @@ public class Project implements Serializable {
private Size gridSpacing;
private List> components;
private Set>> groups;
+ private Set lockedLayers;
public Project() {
components = new ArrayList>();
groups = new HashSet>>();
+ lockedLayers = new HashSet();
title = DEFAULT_TITLE;
author = System.getProperty("user.name");
width = DEFAULT_WIDTH;
@@ -45,19 +47,6 @@ public class Project implements Serializable {
gridSpacing = DEFAULT_GRID_SPACING;
}
- public Project(String title, String author, String description, Size width, Size height,
- Size gridSpacing, List> components, Set>> groups) {
- super();
- this.title = title;
- this.author = author;
- this.description = description;
- this.width = width;
- this.height = height;
- this.gridSpacing = gridSpacing;
- this.components = components;
- this.groups = groups;
- }
-
@EditableProperty(defaultable = false)
public String getTitle() {
return title;
@@ -129,6 +118,10 @@ public class Project implements Serializable {
public Set>> getGroups() {
return groups;
}
+
+ public Set getLockedLayers() {
+ return lockedLayers;
+ }
@Override
public int hashCode() {
@@ -184,6 +177,11 @@ public class Project implements Serializable {
return false;
return true;
}
+
+ @Override
+ public String toString() {
+ return title;
+ }
// @Override
// public Project clone() throws CloneNotSupportedException {
diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/gui/MainFrame.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/gui/MainFrame.java
index 3ca6cad5..e5378dde 100644
--- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/gui/MainFrame.java
+++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/gui/MainFrame.java
@@ -15,6 +15,7 @@ import java.util.Map;
import javax.swing.Action;
import javax.swing.BoxLayout;
import javax.swing.Icon;
+import javax.swing.JCheckBoxMenuItem;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JMenu;
@@ -33,6 +34,7 @@ import org.diylc.plugins.canvas.CanvasPlugin;
import org.diylc.plugins.clipboard.EditMenuPlugin;
import org.diylc.plugins.file.FileMenuPlugin;
import org.diylc.plugins.help.HelpMenuPlugin;
+import org.diylc.plugins.layers.LayersMenuPlugin;
import org.diylc.plugins.statusbar.StatusBar;
import org.diylc.plugins.toolbox.ToolBox;
import org.diylc.presenter.Presenter;
@@ -69,6 +71,7 @@ public class MainFrame extends JFrame implements IView {
presenter.installPlugin(new ToolBox());
presenter.installPlugin(new FileMenuPlugin());
presenter.installPlugin(new EditMenuPlugin());
+ presenter.installPlugin(new LayersMenuPlugin());
// presenter.installPlugin(new OnlineManager());
presenter.installPlugin(new HelpMenuPlugin());
@@ -195,7 +198,12 @@ public class MainFrame extends JFrame implements IView {
if (action == null) {
menu.addSeparator();
} else {
- menu.add(action);
+ Boolean isCheckBox = (Boolean) action.getValue(IPlugInPort.CHECK_BOX_MENU_ITEM);
+ if (isCheckBox != null && isCheckBox) {
+ menu.add(new JCheckBoxMenuItem(action));
+ } else {
+ menu.add(action);
+ }
}
}
diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/gui/editor/FontEditor.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/gui/editor/FontEditor.java
new file mode 100644
index 00000000..60842d10
--- /dev/null
+++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/gui/editor/FontEditor.java
@@ -0,0 +1,51 @@
+package org.diylc.gui.editor;
+
+import java.awt.Color;
+import java.awt.Cursor;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+
+import javax.swing.BorderFactory;
+import javax.swing.JColorChooser;
+import javax.swing.JLabel;
+import javax.swing.SwingConstants;
+
+import org.diylc.common.PropertyWrapper;
+
+
+public class FontEditor extends JLabel {
+
+ private static final long serialVersionUID = 1L;
+
+ public FontEditor(final PropertyWrapper property) {
+ super("Click to edit");
+ setOpaque(true);
+ setHorizontalAlignment(SwingConstants.CENTER);
+ setBorder(BorderFactory.createEtchedBorder());
+ setBackground((Color) property.getValue());
+ setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
+ addMouseListener(new MouseAdapter() {
+
+ @Override
+ public void mouseClicked(MouseEvent e) {
+// JFo
+ Color newColor = JColorChooser.showDialog(FontEditor.this, "Choose Color",
+ getBackground());
+ if (newColor != null) {
+ property.setValue(newColor);
+ setBackground(newColor);
+ }
+ }
+ });
+ }
+
+ @Override
+ public void setBackground(Color bg) {
+ if (bg.getRed() < 127 || bg.getBlue() < 127 || bg.getGreen() < 127) {
+ setForeground(Color.white);
+ } else {
+ setForeground(Color.black);
+ }
+ super.setBackground(bg);
+ }
+}
diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/plugins/layers/LayersMenuPlugin.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/plugins/layers/LayersMenuPlugin.java
new file mode 100644
index 00000000..3b564185
--- /dev/null
+++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/plugins/layers/LayersMenuPlugin.java
@@ -0,0 +1,89 @@
+package org.diylc.plugins.layers;
+
+import java.awt.event.ActionEvent;
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+import javax.swing.AbstractAction;
+import javax.swing.Action;
+
+import org.diylc.common.EventType;
+import org.diylc.common.IPlugIn;
+import org.diylc.common.IPlugInPort;
+import org.diylc.core.IDIYComponent;
+
+public class LayersMenuPlugin implements IPlugIn {
+
+ private static final String LOCK_LAYERS_TITLE = "Lock Layers";
+
+ private IPlugInPort plugInPort;
+ private Map lockActionMap;
+
+ public LayersMenuPlugin() {
+ }
+
+ @Override
+ public void connect(IPlugInPort plugInPort) {
+ this.plugInPort = plugInPort;
+
+ lockActionMap = new HashMap();
+ for (Layer layer : Layer.values()) {
+ final int zOrder = layer.getZOrder();
+ AbstractAction action = new AbstractAction(layer.getTitle()) {
+
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ LayersMenuPlugin.this.plugInPort.setLayerLocked(zOrder, true);
+ }
+ };
+ action.putValue(IPlugInPort.CHECK_BOX_MENU_ITEM, true);
+ lockActionMap.put(layer, action);
+ plugInPort.injectMenuAction(action, LOCK_LAYERS_TITLE);
+ }
+ }
+
+ @Override
+ public EnumSet getSubscribedEventTypes() {
+ return EnumSet.of(EventType.LAYER_STATE_CHANGED);
+ }
+
+ @Override
+ public void processMessage(EventType eventType, Object... params) {
+ if (eventType == EventType.LAYER_STATE_CHANGED) {
+ Set lockedLayers = (Set) params[0];
+ for (Layer layer : Layer.values()) {
+ lockActionMap.get(layer).putValue(Action.SELECTED_KEY,
+ lockedLayers.contains(layer.getZOrder()));
+ }
+ }
+ }
+
+ static enum Layer {
+ BELOW_CHASSIS("Below Chassis", IDIYComponent.BELOW_CHASSIS), CHASSIS("Chassis",
+ IDIYComponent.CHASSIS), ABOVE_CHASSIS("Above Chassis", IDIYComponent.ABOVE_CHASSIS), BELOW_BOARD(
+ "Below Board", IDIYComponent.BELOW_BOARD), BOARD("Board", IDIYComponent.BOARD), ABOVE_BOARD(
+ "Above Board", IDIYComponent.ABOVE_BOARD), COMPONENT("Component",
+ IDIYComponent.COMPONENT), ABOVE_COMPONENT("Above Component",
+ IDIYComponent.ABOVE_COMPONENT);
+
+ String title;
+ int zOrder;
+
+ private Layer(String title, int order) {
+ this.title = title;
+ zOrder = order;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public int getZOrder() {
+ return zOrder;
+ }
+ }
+}
diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/DrawingManager.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/DrawingManager.java
index 16dd53d3..c2a1af3a 100644
--- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/DrawingManager.java
+++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/DrawingManager.java
@@ -10,7 +10,6 @@ import java.awt.Point;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.geom.Area;
-import java.awt.geom.Point2D;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
@@ -58,9 +57,10 @@ public class DrawingManager {
private Map, ComponentState> lastDrawnStateMap;
private Composite slotComposite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.3f);
+ private Composite lockedComposite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.3f);
private double zoomLevel = 1d;// ConfigurationManager.getInstance().readDouble(ZOOM_KEY,
- // 1d);
+ // 1d);
private MessageDispatcher messageDispatcher;
@@ -73,8 +73,8 @@ public class DrawingManager {
public void drawProject(Graphics2D g2d, Project project, Set drawOptions,
IComponentFiler filter, Rectangle selectionRect, ComponentSelection selectedComponents,
- Set> groupedComponents, List controlPointSlot,
- IDIYComponent> componentSlot, boolean dragInProgress) {
+ Set> lockedComponents, Set> groupedComponents,
+ List controlPointSlot, IDIYComponent> componentSlot, boolean dragInProgress) {
if (project == null) {
return;
}
@@ -155,6 +155,10 @@ public class DrawingManager {
if (!trackArea) {
g2dWrapper.stopTracking();
}
+ // Draw locked components in a new composite.
+ if (lockedComponents.contains(component)) {
+ g2d.setComposite(lockedComposite);
+ }
// Draw the component through the g2dWrapper.
component.draw(g2dWrapper, state, project, g2dWrapper);
Area area = g2dWrapper.finishedDrawingComponent();
@@ -277,15 +281,6 @@ public class DrawingManager {
return componentAreaMap.get(component);
}
- public boolean isCursorOverArea(Point2D cursorPosition) {
- for (Map.Entry, Area> entry : componentAreaMap.entrySet()) {
- if (entry.getValue().contains(cursorPosition)) {
- return true;
- }
- }
- return false;
- }
-
public List> findComponentsAt(Point point, Project project) {
List> components = new ArrayList>();
for (Map.Entry, Area> entry : componentAreaMap.entrySet()) {
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 970833d2..ba405b64 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
@@ -56,7 +56,7 @@ public class Presenter implements IPlugInPort {
private static final Logger LOG = Logger.getLogger(Presenter.class);
- public static final VersionNumber CURRENT_VERSION = new VersionNumber(3, 0, 1);
+ public static final VersionNumber CURRENT_VERSION = new VersionNumber(3, 0, 3);
public static final String DEFAULTS_KEY_PREFIX = "default.";
public static final String METRIC_KEY = "metric";
@@ -72,6 +72,7 @@ public class Presenter implements IPlugInPort {
// Maps components that have at least one dragged point to set of indices
// that designate which of their control points are being dragged.
private Map, Set> controlPointMap;
+ private Set> lockedComponents;
// Utilities
private Cloner cloner;
@@ -103,6 +104,7 @@ public class Presenter implements IPlugInPort {
plugIns = new ArrayList();
messageDispatcher = new MessageDispatcher();
selectedComponents = new ComponentSelection();
+ lockedComponents = new HashSet>();
currentProject = new Project();
cloner = new Cloner();
drawingManager = new DrawingManager(messageDispatcher);
@@ -153,12 +155,17 @@ public class Presenter implements IPlugInPort {
if (instantiationManager.getComponentTypeSlot() == null) {
// Scale point to remove zoom factor.
Point2D scaledPoint = scalePoint(point);
- if (drawingManager.isCursorOverArea(scaledPoint)) {
- return Cursor.getPredefinedCursor(Cursor.HAND_CURSOR);
- }
if (controlPointMap != null && !controlPointMap.isEmpty()) {
return Cursor.getPredefinedCursor(Cursor.HAND_CURSOR);
}
+ for (IDIYComponent> component : currentProject.getComponents()) {
+ if (!isComponentLocked(component)) {
+ Area area = drawingManager.getComponentArea(component);
+ if (area != null && area.contains(scaledPoint)) {
+ return Cursor.getPredefinedCursor(Cursor.HAND_CURSOR);
+ }
+ }
+ }
}
return Cursor.getDefaultCursor();
}
@@ -181,6 +188,8 @@ public class Presenter implements IPlugInPort {
updateSelection(ComponentSelection.EMPTY_SELECTION);
messageDispatcher.dispatchMessage(EventType.PROJECT_LOADED, project, freshStart);
messageDispatcher.dispatchMessage(EventType.REPAINT);
+ messageDispatcher.dispatchMessage(EventType.LAYER_STATE_CHANGED, currentProject
+ .getLockedLayers());
}
@Override
@@ -296,9 +305,9 @@ public class Presenter implements IPlugInPort {
componentSlotToDraw = instantiationManager.getComponentSlot();
}
drawingManager.drawProject(g2d, currentProject, drawOptions, filter, selectionRect,
- selectedComponents, groupedComponents, Arrays.asList(instantiationManager
- .getFirstControlPoint(), instantiationManager.getPotentialControlPoint()),
- componentSlotToDraw, dragInProgress);
+ selectedComponents, getLockedComponents(), groupedComponents, Arrays.asList(
+ instantiationManager.getFirstControlPoint(), instantiationManager
+ .getPotentialControlPoint()), componentSlotToDraw, dragInProgress);
}
@Override
@@ -323,12 +332,20 @@ public class Presenter implements IPlugInPort {
/**
* Finds all components whose areas include the specified {@link Point}.
- * Point is not scaled by the zoom factor.
+ * Point is not scaled by the zoom factor. Components that belong to
+ * locked layers are ignored.
*
* @return
*/
private List> findComponentsAt(Point point) {
- return drawingManager.findComponentsAt(point, currentProject);
+ List> components = drawingManager.findComponentsAt(point, currentProject);
+ Iterator> iterator = components.iterator();
+ while (iterator.hasNext()) {
+ if (isComponentLocked(iterator.next())) {
+ iterator.remove();
+ }
+ }
+ return components;
}
@Override
@@ -350,12 +367,12 @@ public class Presenter implements IPlugInPort {
componentTypeSlot, scaledPoint, currentProject);
addComponent(component, componentTypeSlot);
// Select the new component
- updateSelection(ComponentSelection.of(component));
// messageDispatcher.dispatchMessage(EventType.SELECTION_CHANGED,
// selectedComponents);
// messageDispatcher.dispatchMessage(EventType.SELECTION_SIZE_CHANGED,
// calculateSelectionDimension());
messageDispatcher.dispatchMessage(EventType.REPAINT);
+ updateSelection(ComponentSelection.of(component));
} catch (Exception e) {
LOG.error("Error instatiating component of type: "
+ componentTypeSlot.getInstanceClass().getName(), e);
@@ -384,8 +401,9 @@ public class Presenter implements IPlugInPort {
IDIYComponent> componentSlot = instantiationManager.getComponentSlot();
componentSlot.setControlPoint(scaledPoint, 1);
addComponent(componentSlot, componentTypeSlot);
- // Select the new component
- updateSelection(ComponentSelection.of(componentSlot));
+ // Select the new component if it's not locked.
+ updateSelection(isComponentLocked(componentSlot) ? ComponentSelection.EMPTY_SELECTION
+ : ComponentSelection.of(componentSlot));
messageDispatcher.dispatchMessage(EventType.REPAINT);
setNewComponentTypeSlot(null);
}
@@ -685,7 +703,7 @@ public class Presenter implements IPlugInPort {
// Update all points.
for (Map.Entry, Set> entry : controlPointMap.entrySet()) {
IDIYComponent> c = entry.getKey();
- drawingManager.invalidateComponent(c);
+ // drawingManager.invalidateComponent(c);
for (Integer index : entry.getValue()) {
Point p = new Point(c.getControlPoint(index));
p.translate(dx, dy);
@@ -739,9 +757,11 @@ public class Presenter implements IPlugInPort {
}
ComponentSelection newSelection = new ComponentSelection();
for (IDIYComponent> component : currentProject.getComponents()) {
- Area area = drawingManager.getComponentArea(component);
- if ((area != null) && (selectionRect != null) && area.intersects(selectionRect)) {
- newSelection.addAll(findAllGroupedComponents(component));
+ if (!isComponentLocked(component)) {
+ Area area = drawingManager.getComponentArea(component);
+ if ((area != null) && (selectionRect != null) && area.intersects(selectionRect)) {
+ newSelection.addAll(findAllGroupedComponents(component));
+ }
}
}
selectionRect = null;
@@ -864,6 +884,19 @@ public class Presenter implements IPlugInPort {
}
}
+ @Override
+ public void setLayerLocked(int layerZOrder, boolean locked) {
+ if (locked) {
+ currentProject.getLockedLayers().add(layerZOrder);
+ } else {
+ currentProject.getLockedLayers().remove(layerZOrder);
+ }
+ updateSelection(ComponentSelection.EMPTY_SELECTION);
+ messageDispatcher.dispatchMessage(EventType.REPAINT);
+ messageDispatcher.dispatchMessage(EventType.LAYER_STATE_CHANGED, currentProject
+ .getLockedLayers());
+ }
+
/**
* Updates the selection with the specified {@link ComponentSelection}.
* Also, updates control point map with all components that are stuck to the
@@ -945,6 +978,8 @@ public class Presenter implements IPlugInPort {
Area componentArea = drawingManager.getComponentArea(component);
if (componentArea != null) {
area.add(componentArea);
+ } else {
+ LOG.warn("No area found for: " + component.getName());
}
}
double width = area.getBounds2D().getWidth();
@@ -1081,6 +1116,22 @@ public class Presenter implements IPlugInPort {
}
}
+ private Set> getLockedComponents() {
+ lockedComponents.clear();
+ for (IDIYComponent> component : currentProject.getComponents()) {
+ if (isComponentLocked(component)) {
+ lockedComponents.add(component);
+ }
+ }
+ return lockedComponents;
+ }
+
+ private boolean isComponentLocked(IDIYComponent> component) {
+ ComponentType componentType = componentTypeMap.get(component.getClass().getName());
+ return currentProject.getLockedLayers().contains(
+ (int) Math.round(componentType.getZOrder()));
+ }
+
/**
* Scales point from display base to actual base.
*
diff --git a/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/boards/AbstractBoard.java b/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/boards/AbstractBoard.java
index 777aa1a7..5f3664c4 100644
--- a/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/boards/AbstractBoard.java
+++ b/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/boards/AbstractBoard.java
@@ -23,7 +23,7 @@ public abstract class AbstractBoard extends AbstractTransparentComponent
public static Color BOARD_COLOR = Color.decode("#F8EBB3");
public static Color BORDER_COLOR = BOARD_COLOR.darker();
public static Size DEFAULT_WIDTH = new Size(1.5d, SizeUnit.in);
- public static Size DEFAULT_HEIGHT = new Size(1d, SizeUnit.in);
+ public static Size DEFAULT_HEIGHT = new Size(1.2d, SizeUnit.in);
protected String value = "";
protected Point[] controlPoints = new Point[] { new Point(0, 0),
diff --git a/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/boards/EyeletBoard.java b/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/boards/EyeletBoard.java
new file mode 100644
index 00000000..59ded63b
--- /dev/null
+++ b/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/boards/EyeletBoard.java
@@ -0,0 +1,100 @@
+package org.diylc.components.boards;
+
+import java.awt.AlphaComposite;
+import java.awt.Color;
+import java.awt.Graphics2D;
+import java.awt.Point;
+
+import org.diylc.core.ComponentState;
+import org.diylc.core.IDIYComponent;
+import org.diylc.core.IDrawingObserver;
+import org.diylc.core.Project;
+import org.diylc.core.annotations.ComponentDescriptor;
+import org.diylc.core.annotations.EditableProperty;
+import org.diylc.core.measures.Size;
+import org.diylc.core.measures.SizeUnit;
+import org.diylc.utils.Constants;
+
+@ComponentDescriptor(name = "Eyelet Board", category = "Boards", author = "Branislav Stojkovic", zOrder = IDIYComponent.BOARD, instanceNamePrefix = "Board", description = "Perforated board with eyelets")
+public class EyeletBoard extends AbstractBoard {
+
+ private static final long serialVersionUID = 1L;
+
+ public static Color EYELET_COLOR = Color.decode("#C3E4ED");
+
+ public static Size SPACING = new Size(0.3d, SizeUnit.in);
+ public static Size EYELET_SIZE = new Size(1/8d, SizeUnit.in);
+ public static Size HOLE_SIZE = new Size(2d, SizeUnit.mm);
+
+ // private Area copperArea;
+ protected Size spacing = SPACING;
+ protected Color eyeletColor = EYELET_COLOR;
+
+ @Override
+ public void draw(Graphics2D g2d, ComponentState componentState, Project project,
+ IDrawingObserver drawingObserver) {
+ super.draw(g2d, componentState, project, drawingObserver);
+ if (componentState != ComponentState.DRAGGING) {
+ if (alpha < MAX_ALPHA) {
+ g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1f * alpha
+ / MAX_ALPHA));
+ }
+ Point p = new Point(firstPoint);
+ int diameter = getClosestOdd(EYELET_SIZE.convertToPixels());
+ int holeDiameter = getClosestOdd(HOLE_SIZE.convertToPixels());
+ int spacing = this.spacing.convertToPixels();
+
+ while (p.y < secondPoint.y - spacing) {
+ p.x = firstPoint.x;
+ p.y += spacing;
+ while (p.x < secondPoint.x - spacing) {
+ p.x += spacing;
+ g2d.setColor(eyeletColor);
+ g2d.fillOval(p.x - diameter / 2, p.y - diameter / 2, diameter, diameter);
+ g2d.setColor(eyeletColor.darker());
+ g2d.drawOval(p.x - diameter / 2, p.y - diameter / 2, diameter, diameter);
+ g2d.setColor(Constants.CANVAS_COLOR);
+ g2d.fillOval(p.x - holeDiameter / 2, p.y - holeDiameter / 2, holeDiameter,
+ holeDiameter);
+ g2d.setColor(eyeletColor.darker());
+ g2d.drawOval(p.x - holeDiameter / 2, p.y - holeDiameter / 2, holeDiameter,
+ holeDiameter);
+ }
+ }
+ }
+ }
+
+ @EditableProperty(name = "Eyelet color")
+ public Color getEyeletColor() {
+ return eyeletColor;
+ }
+
+ public void setEyeletColor(Color padColor) {
+ this.eyeletColor = padColor;
+ }
+
+ @EditableProperty
+ public Size getSpacing() {
+ return spacing;
+ }
+
+ public void setSpacing(Size spacing) {
+ this.spacing = spacing;
+ }
+
+ @Override
+ public void drawIcon(Graphics2D g2d, int width, int height) {
+ g2d.setColor(BOARD_COLOR);
+ g2d.fillRect(2, 2, width - 4, height - 4);
+ g2d.setColor(BORDER_COLOR);
+ g2d.drawRect(2, 2, width - 4, height - 4);
+ g2d.setColor(EYELET_COLOR);
+ g2d.fillOval(width / 4, width / 4, width / 2, width / 2);
+ g2d.setColor(EYELET_COLOR.darker());
+ g2d.drawOval(width / 4, width / 4, width / 2, width / 2);
+ g2d.setColor(Constants.CANVAS_COLOR);
+ g2d.fillOval(width / 2 - 2, width / 2 - 2, 5, 5);
+ g2d.setColor(EYELET_COLOR.darker());
+ g2d.drawOval(width / 2 - 2, width / 2 - 2, 5, 5);
+ }
+}
diff --git a/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/boards/PerfBoard.java b/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/boards/PerfBoard.java
index c019534b..a0005d70 100644
--- a/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/boards/PerfBoard.java
+++ b/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/boards/PerfBoard.java
@@ -64,7 +64,7 @@ public class PerfBoard extends AbstractBoard {
}
}
- @EditableProperty(name = "Pad")
+ @EditableProperty(name = "Pad color")
public Color getPadColor() {
return padColor;
}
diff --git a/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/boards/VeroBoard.java b/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/boards/VeroBoard.java
index c5a5e11a..7765da5b 100644
--- a/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/boards/VeroBoard.java
+++ b/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/boards/VeroBoard.java
@@ -21,7 +21,7 @@ public class VeroBoard extends AbstractBoard {
private static final long serialVersionUID = 1L;
- public static Color COPPER_COLOR = Color.decode("#DA8A67");
+ public static Color STRIP_COLOR = Color.decode("#DA8A67");
public static Color BORDER_COLOR = BOARD_COLOR.darker();
public static Size SPACING = new Size(0.1d, SizeUnit.in);
@@ -29,7 +29,7 @@ public class VeroBoard extends AbstractBoard {
public static Size HOLE_SIZE = new Size(0.7d, SizeUnit.mm);
protected Size spacing = SPACING;
- protected Color padColor = COPPER_COLOR;
+ protected Color stripColor = STRIP_COLOR;
@Override
public void draw(Graphics2D g2d, ComponentState componentState, Project project,
@@ -50,17 +50,17 @@ public class VeroBoard extends AbstractBoard {
while (p.y < secondPoint.y - spacing) {
p.x = firstPoint.x;
p.y += spacing;
- g2d.setColor(padColor);
+ g2d.setColor(stripColor);
g2d.fillRect(p.x + SPACING.convertToPixels() / 2, p.y - stripSize / 2,
secondPoint.x - spacing - p.x, stripSize);
- g2d.setColor(padColor.darker());
+ g2d.setColor(stripColor.darker());
g2d.drawRect(p.x + SPACING.convertToPixels() / 2, p.y - stripSize / 2,
secondPoint.x - spacing - p.x, stripSize);
while (p.x < secondPoint.x - spacing) {
p.x += spacing;
g2d.setColor(Constants.CANVAS_COLOR);
g2d.fillOval(p.x - holeSize / 2, p.y - holeSize / 2, holeSize, holeSize);
- g2d.setColor(padColor.darker());
+ g2d.setColor(stripColor.darker());
g2d.drawOval(p.x - holeSize / 2, p.y - holeSize / 2, holeSize, holeSize);
}
}
@@ -68,13 +68,13 @@ public class VeroBoard extends AbstractBoard {
}
}
- @EditableProperty(name = "Pad")
- public Color getPadColor() {
- return padColor;
+ @EditableProperty(name = "Strip color")
+ public Color getStripColor() {
+ return stripColor;
}
- public void setPadColor(Color padColor) {
- this.padColor = padColor;
+ public void setStripColor(Color padColor) {
+ this.stripColor = padColor;
}
@EditableProperty
@@ -92,14 +92,14 @@ public class VeroBoard extends AbstractBoard {
g2d.fillRect(2, 2, width - 4, height - 4);
g2d.setColor(BORDER_COLOR);
g2d.drawRect(2, 2, width - 4, height - 4);
- g2d.setColor(COPPER_COLOR);
+ g2d.setColor(STRIP_COLOR);
g2d.fillRect(4, width / 4, width - 8, width / 2);
- g2d.setColor(COPPER_COLOR.darker());
+ g2d.setColor(STRIP_COLOR.darker());
g2d.drawRect(4, width / 4, width - 8, width / 2);
g2d.setColor(Constants.CANVAS_COLOR);
g2d.fillOval(width / 3 - 2, width / 2 - 2, 5, 5);
g2d.fillOval(2 * width / 3 - 2, width / 2 - 2, 5, 5);
- g2d.setColor(COPPER_COLOR.darker());
+ g2d.setColor(STRIP_COLOR.darker());
g2d.drawOval(width / 3 - 2, width / 2 - 2, 5, 5);
g2d.drawOval(2 * width / 3 - 2, width / 2 - 2, 5, 5);
}