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 @@ - metric - false + lastPath + C:\Documents and Settings\Branislav Stojkovic\Desktop zoom 1.0 - 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/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); }