From 5adbc2c6ca248b14123a1e75d13449fae044e114 Mon Sep 17 00:00:00 2001 From: bancika Date: Tue, 21 Aug 2012 11:06:19 +0000 Subject: [PATCH] Some components can be placed in any layer using Send to Back/Bring to Front --- .../src/org/diylc/common/ComponentType.java | 8 +- .../core/annotations/ComponentDescriptor.java | 13 ++- .../diylc/presenter/ComponentProcessor.java | 79 +++++++++++-------- .../src/org/diylc/presenter/Presenter.java | 46 ++++++----- 4 files changed, 87 insertions(+), 59 deletions(-) diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/common/ComponentType.java b/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/common/ComponentType.java index 1e1082c4..19c546b4 100644 --- a/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/common/ComponentType.java +++ b/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/common/ComponentType.java @@ -24,12 +24,13 @@ public class ComponentType { private Icon icon; private Class> instanceClass; private double zOrder; + private boolean flexibleZOrder; private boolean stretchable; private BomPolicy bomPolicy; public ComponentType(String name, String description, CreationMethod creationMethod, String category, String namePrefix, String author, Icon icon, - Class> instanceClass, double zOrder, + Class> instanceClass, double zOrder, boolean flexibleZOrder, boolean stretchable, BomPolicy bomPolicy) { super(); this.name = name; @@ -41,6 +42,7 @@ public class ComponentType { this.icon = icon; this.instanceClass = instanceClass; this.zOrder = zOrder; + this.flexibleZOrder = flexibleZOrder; this.stretchable = stretchable; this.bomPolicy = bomPolicy; } @@ -80,6 +82,10 @@ public class ComponentType { public double getZOrder() { return zOrder; } + + public boolean isFlexibleZOrder() { + return flexibleZOrder; + } public boolean isStretchable() { return stretchable; diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/core/annotations/ComponentDescriptor.java b/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/core/annotations/ComponentDescriptor.java index ad6b1f17..b85357a0 100644 --- a/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/core/annotations/ComponentDescriptor.java +++ b/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/core/annotations/ComponentDescriptor.java @@ -14,7 +14,7 @@ import org.diylc.core.IDIYComponent; */ @Retention(RetentionPolicy.RUNTIME) public @interface ComponentDescriptor { - + /** * @return component type name. */ @@ -53,14 +53,21 @@ public @interface ComponentDescriptor { */ double zOrder(); + /** + * @return true if the component may go beyond it's predefined layer. In + * that case, zOrder is used as initial z order of the + * component. + */ + boolean flexibleZOrder() default false; + /** * @return when false, moving one control point will cause all the others to * move together with it. */ boolean stretchable() default true; - + /** - * @return controls what should be shown the BOM + * @return controls what should be shown the BOM */ BomPolicy bomPolicy() default BomPolicy.SHOW_ALL_NAMES; diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/presenter/ComponentProcessor.java b/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/presenter/ComponentProcessor.java index b32009e4..d99018da 100644 --- a/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/presenter/ComponentProcessor.java +++ b/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/presenter/ComponentProcessor.java @@ -33,7 +33,8 @@ import com.rits.cloning.Cloner; */ public class ComponentProcessor { - private static final Logger LOG = Logger.getLogger(ComponentProcessor.class); + private static final Logger LOG = Logger + .getLogger(ComponentProcessor.class); private static ComponentProcessor instance; @@ -58,7 +59,8 @@ public class ComponentProcessor { this.propertyValidatorCache = new HashMap(); } - public ComponentType extractComponentTypeFrom(Class> clazz) { + public ComponentType extractComponentTypeFrom( + Class> clazz) { if (componentTypeMap.containsKey(clazz.getName())) { return componentTypeMap.get(clazz.getName()); } @@ -70,10 +72,12 @@ public class ComponentProcessor { String author; Icon icon; double zOrder; + boolean flexibleZOrder; boolean stretchable; BomPolicy bomPolicy; if (clazz.isAnnotationPresent(ComponentDescriptor.class)) { - ComponentDescriptor annotation = clazz.getAnnotation(ComponentDescriptor.class); + ComponentDescriptor annotation = clazz + .getAnnotation(ComponentDescriptor.class); name = annotation.name(); description = annotation.description(); creationMethod = annotation.creationMethod(); @@ -81,6 +85,7 @@ public class ComponentProcessor { namePrefix = annotation.instanceNamePrefix(); author = annotation.author(); zOrder = annotation.zOrder(); + flexibleZOrder = annotation.flexibleZOrder(); stretchable = annotation.stretchable(); bomPolicy = annotation.bomPolicy(); } else { @@ -91,28 +96,30 @@ public class ComponentProcessor { namePrefix = "Unknown"; author = "Unknown"; zOrder = IDIYComponent.COMPONENT; + flexibleZOrder = false; stretchable = true; bomPolicy = BomPolicy.SHOW_ALL_NAMES; } icon = null; // Draw component icon. try { - IDIYComponent componentInstance = (IDIYComponent) clazz.newInstance(); - Image image = new BufferedImage(Presenter.ICON_SIZE, Presenter.ICON_SIZE, + IDIYComponent componentInstance = (IDIYComponent) clazz + .newInstance(); + Image image = new BufferedImage(Presenter.ICON_SIZE, + Presenter.ICON_SIZE, java.awt.image.BufferedImage.TYPE_INT_ARGB); Graphics2D g2d = (Graphics2D) image.getGraphics(); - g2d - .setRenderingHint(RenderingHints.KEY_ANTIALIASING, - RenderingHints.VALUE_ANTIALIAS_ON); - componentInstance.drawIcon(g2d, Presenter.ICON_SIZE, Presenter.ICON_SIZE); + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, + RenderingHints.VALUE_ANTIALIAS_ON); + componentInstance.drawIcon(g2d, Presenter.ICON_SIZE, + Presenter.ICON_SIZE); icon = new ImageIcon(image); - } catch (InstantiationException e) { - e.printStackTrace(); - } catch (IllegalAccessException e) { - e.printStackTrace(); + } catch (Exception e) { + throw new RuntimeException(e); } - ComponentType componentType = new ComponentType(name, description, creationMethod, - category, namePrefix, author, icon, clazz, zOrder, stretchable, bomPolicy); + ComponentType componentType = new ComponentType(name, description, + creationMethod, category, namePrefix, author, icon, clazz, + zOrder, flexibleZOrder, stretchable, bomPolicy); componentTypeMap.put(clazz.getName(), componentType); return componentType; } @@ -133,7 +140,8 @@ public class ComponentProcessor { try { if (method.isAnnotationPresent(EditableProperty.class) && !method.isAnnotationPresent(Deprecated.class)) { - EditableProperty annotation = method.getAnnotation(EditableProperty.class); + EditableProperty annotation = method + .getAnnotation(EditableProperty.class); String name; if (annotation.name().equals("")) { name = method.getName().substring(3); @@ -142,16 +150,18 @@ public class ComponentProcessor { } IPropertyValidator validator = getPropertyValidator(annotation .validatorClass()); - Method setter = clazz.getMethod("set" + method.getName().substring(3), - method.getReturnType()); + Method setter = clazz.getMethod("set" + + method.getName().substring(3), method + .getReturnType()); PropertyWrapper property = new PropertyWrapper(name, - method.getReturnType(), method.getName(), setter.getName(), - annotation.defaultable(), validator); + method.getReturnType(), method.getName(), + setter.getName(), annotation.defaultable(), + validator); properties.add(property); } } catch (NoSuchMethodException e) { - LOG.debug("No matching setter found for \"" + method.getName() - + "\". Skipping..."); + LOG.debug("No matching setter found for \"" + + method.getName() + "\". Skipping..."); } } } @@ -181,7 +191,8 @@ public class ComponentProcessor { } for (int i = 1; i < selectedComponents.size(); i++) { IDIYComponent component = selectedComponents.get(i); - List newProperties = extractProperties(component.getClass()); + List newProperties = extractProperties(component + .getClass()); for (PropertyWrapper property : newProperties) { property.readFrom(component); } @@ -190,11 +201,14 @@ public class ComponentProcessor { // their values match. for (PropertyWrapper oldProperty : properties) { if (newProperties.contains(oldProperty)) { - PropertyWrapper newProperty = newProperties.get(newProperties - .indexOf(oldProperty)); - if ((newProperty.getValue() != null && newProperty.getValue() == null) - || !newProperty.getValue().equals(oldProperty.getValue())) { - // Values don't match, so the property is not unique valued. + PropertyWrapper newProperty = newProperties + .get(newProperties.indexOf(oldProperty)); + if ((newProperty.getValue() != null && newProperty + .getValue() == null) + || !newProperty.getValue().equals( + oldProperty.getValue())) { + // Values don't match, so the property is not unique + // valued. oldProperty.setUnique(false); } } @@ -208,11 +222,13 @@ public class ComponentProcessor { // } // } } - Collections.sort(properties, ComparatorFactory.getInstance().getPropertyNameComparator()); + Collections.sort(properties, ComparatorFactory.getInstance() + .getPropertyNameComparator()); return properties; } - private IPropertyValidator getPropertyValidator(Class clazz) { + private IPropertyValidator getPropertyValidator( + Class clazz) { if (propertyValidatorCache.containsKey(clazz.getName())) { return propertyValidatorCache.get(clazz.getName()); } @@ -220,7 +236,8 @@ public class ComponentProcessor { try { validator = clazz.newInstance(); } catch (Exception e) { - LOG.error("Could not instantiate validator for " + clazz.getName(), e); + LOG.error("Could not instantiate validator for " + clazz.getName(), + e); return null; } propertyValidatorCache.put(clazz.getName(), validator); diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/presenter/Presenter.java b/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/presenter/Presenter.java index 0dea3240..61e7f4fb 100644 --- a/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/presenter/Presenter.java +++ b/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/presenter/Presenter.java @@ -56,8 +56,8 @@ public class Presenter implements IPlugInPort { private static final Logger LOG = Logger.getLogger(Presenter.class); - public static final VersionNumber CURRENT_VERSION = new VersionNumber(3, 10, - 0); + public static final VersionNumber CURRENT_VERSION = new VersionNumber(3, + 11, 0); public static final String DEFAULTS_KEY_PREFIX = "default."; public static final List> EMPTY_SELECTION = Collections @@ -77,7 +77,7 @@ public class Presenter implements IPlugInPort { private Set> lockedComponents; // Utilities - //private Cloner cloner; + // private Cloner cloner; private DrawingManager drawingManager; private ProjectFileManager projectFileManager; private InstantiationManager instantiationManager; @@ -107,7 +107,7 @@ public class Presenter implements IPlugInPort { selectedComponents = new ArrayList>(); lockedComponents = new HashSet>(); currentProject = new Project(); - //cloner = new Cloner(); + // cloner = new Cloner(); drawingManager = new DrawingManager(messageDispatcher); projectFileManager = new ProjectFileManager(messageDispatcher); instantiationManager = new InstantiationManager(); @@ -503,7 +503,8 @@ public class Presenter implements IPlugInPort { // Notify the listeners. if (!oldProject.equals(currentProject)) { messageDispatcher.dispatchMessage( - EventType.PROJECT_MODIFIED, oldProject, currentProject.clone(), "Add " + EventType.PROJECT_MODIFIED, oldProject, + currentProject.clone(), "Add " + componentTypeSlot.getName()); projectFileManager.notifyFileChange(); } @@ -1222,8 +1223,9 @@ public class Presenter implements IPlugInPort { .extractComponentTypeFrom( (Class>) componentBefore .getClass()); - if (componentBeforeType.getZOrder() < componentType - .getZOrder()) + if (!componentType.isFlexibleZOrder() + && componentBeforeType.getZOrder() < componentType + .getZOrder()) break; Collections.swap(currentProject.getComponents(), index, index - 1); @@ -1232,8 +1234,7 @@ public class Presenter implements IPlugInPort { } if (!oldProject.equals(currentProject)) { messageDispatcher.dispatchMessage(EventType.PROJECT_MODIFIED, - oldProject, currentProject.clone(), - "Send to Back"); + oldProject, currentProject.clone(), "Send to Back"); projectFileManager.notifyFileChange(); messageDispatcher.dispatchMessage(EventType.REPAINT); } @@ -1261,8 +1262,9 @@ public class Presenter implements IPlugInPort { .extractComponentTypeFrom( (Class>) componentAfter .getClass()); - if (componentAfterType.getZOrder() > componentType - .getZOrder()) + if (!componentType.isFlexibleZOrder() + && componentAfterType.getZOrder() > componentType + .getZOrder()) break; Collections.swap(currentProject.getComponents(), index, index + 1); @@ -1271,8 +1273,7 @@ public class Presenter implements IPlugInPort { } if (!oldProject.equals(currentProject)) { messageDispatcher.dispatchMessage(EventType.PROJECT_MODIFIED, - oldProject, currentProject.clone(), - "Bring to Front"); + oldProject, currentProject.clone(), "Bring to Front"); projectFileManager.notifyFileChange(); messageDispatcher.dispatchMessage(EventType.REPAINT); } @@ -1366,8 +1367,7 @@ public class Presenter implements IPlugInPort { } messageDispatcher.dispatchMessage(EventType.PROJECT_MODIFIED, - oldProject, currentProject.clone(), - "Renumber selection"); + oldProject, currentProject.clone(), "Renumber selection"); projectFileManager.notifyFileChange(); messageDispatcher.dispatchMessage(EventType.REPAINT); } @@ -1535,15 +1535,15 @@ public class Presenter implements IPlugInPort { */ private void addComponent(IDIYComponent component, ComponentType componentType, boolean canCreatePads) { - int index = 0; - while (index < currentProject.getComponents().size() - && componentType.getZOrder() >= ComponentProcessor + int index = currentProject.getComponents().size(); + while (index > 0 + && componentType.getZOrder() < ComponentProcessor .getInstance() .extractComponentTypeFrom( (Class>) currentProject - .getComponents().get(index).getClass()) + .getComponents().get(index - 1).getClass()) .getZOrder()) { - index++; + index--; } if (index < currentProject.getComponents().size()) { currentProject.getComponents().add(index, component); @@ -1610,8 +1610,7 @@ public class Presenter implements IPlugInPort { // Notify the listeners. if (!oldProject.equals(currentProject)) { messageDispatcher.dispatchMessage(EventType.PROJECT_MODIFIED, - oldProject, currentProject.clone(), - "Edit Selection"); + oldProject, currentProject.clone(), "Edit Selection"); projectFileManager.notifyFileChange(); } messageDispatcher.dispatchMessage(EventType.REPAINT); @@ -1653,8 +1652,7 @@ public class Presenter implements IPlugInPort { // Notify the listeners. if (!oldProject.equals(currentProject)) { messageDispatcher.dispatchMessage(EventType.PROJECT_MODIFIED, - oldProject, currentProject.clone(), - "Edit Project"); + oldProject, currentProject.clone(), "Edit Project"); projectFileManager.notifyFileChange(); } drawingManager.fireZoomChanged();