diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/common/PropertyWrapper.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/common/PropertyWrapper.java index 1cab105d..b2582bc7 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/common/PropertyWrapper.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/common/PropertyWrapper.java @@ -20,6 +20,7 @@ public class PropertyWrapper implements Cloneable { private boolean defaultable; private IPropertyValidator validator; private boolean unique = true; + private boolean changed = false; public PropertyWrapper(String name, Class type, String getter, String setter, boolean defaultable, IPropertyValidator validator) { @@ -82,6 +83,14 @@ public class PropertyWrapper implements Cloneable { public void setUnique(boolean unique) { this.unique = unique; } + + public boolean isChanged() { + return changed; + } + + public void setChanged(boolean changed) { + this.changed = changed; + } // @Override // public Object clone() throws CloneNotSupportedException { @@ -103,7 +112,6 @@ public class PropertyWrapper implements Cloneable { result = prime * result + ((name == null) ? 0 : name.hashCode()); result = prime * result + ((setter == null) ? 0 : setter.hashCode()); result = prime * result + ((type == null) ? 0 : type.hashCode()); - result = prime * result + ((value == null) ? 0 : value.hashCode()); return result; } @@ -138,11 +146,6 @@ public class PropertyWrapper implements Cloneable { return false; } else if (!type.equals(other.type)) return false; - if (value == null) { - if (other.value != null) - return false; - } else if (!value.equals(other.value)) - return false; return true; } diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/ComponentProcessor.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/ComponentProcessor.java index d25efcf4..3eb9bee2 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/ComponentProcessor.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/ComponentProcessor.java @@ -182,6 +182,19 @@ public class ComponentProcessor { property.readFrom(component); } properties.retainAll(newProperties); + // Try to find matching properties in old and new lists and see if + // 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. + oldProperty.setUnique(false); + } + } + } // for (PropertyWrapper property : properties) { // try { // property.readUniqueFrom(component); 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 c2ae1c5f..e7171464 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 @@ -1213,7 +1213,9 @@ public class Presenter implements IPlugInPort { for (IDIYComponent component : selectedComponents) { drawingManager.invalidateComponent(component); for (PropertyWrapper property : properties) { - property.writeTo(component); + if (property.isChanged()) { + property.writeTo(component); + } } } } catch (Exception e) { diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/swing/gui/editor/BooleanEditor.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/swing/gui/editor/BooleanEditor.java index 15dff82a..c8842b26 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/swing/gui/editor/BooleanEditor.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/swing/gui/editor/BooleanEditor.java @@ -1,17 +1,20 @@ package org.diylc.swing.gui.editor; +import java.awt.Color; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JCheckBox; import org.diylc.common.PropertyWrapper; - +import org.diylc.utils.Constants; public class BooleanEditor extends JCheckBox { private static final long serialVersionUID = 1L; - + + private Color oldBg = getBackground(); + public BooleanEditor(final PropertyWrapper property) { super(); setSelected((Boolean) property.getValue()); @@ -19,8 +22,13 @@ public class BooleanEditor extends JCheckBox { @Override public void actionPerformed(ActionEvent e) { + property.setChanged(true); + setBackground(oldBg); property.setValue(isSelected()); } }); + if (!property.isUnique()) { + setBackground(Constants.MULTI_VALUE_COLOR); + } } } diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/swing/gui/editor/ByteEditor.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/swing/gui/editor/ByteEditor.java index 8403b42a..05d72207 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/swing/gui/editor/ByteEditor.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/swing/gui/editor/ByteEditor.java @@ -1,15 +1,20 @@ package org.diylc.swing.gui.editor; +import java.awt.Color; + import javax.swing.JSlider; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import org.diylc.common.PropertyWrapper; +import org.diylc.utils.Constants; public class ByteEditor extends JSlider { private static final long serialVersionUID = 1L; + private Color oldBg = getBackground(); + public ByteEditor(final PropertyWrapper property) { super(); setMinimum(0); @@ -19,8 +24,13 @@ public class ByteEditor extends JSlider { @Override public void stateChanged(ChangeEvent e) { + property.setChanged(true); + setBackground(oldBg); property.setValue(new Integer(getValue()).byteValue()); } }); + if (!property.isUnique()) { + setBackground(Constants.MULTI_VALUE_COLOR); + } } } diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/swing/gui/editor/ColorEditor.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/swing/gui/editor/ColorEditor.java index d78a58d5..24e16ef2 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/swing/gui/editor/ColorEditor.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/swing/gui/editor/ColorEditor.java @@ -12,13 +12,14 @@ import javax.swing.SwingConstants; import org.diylc.common.PropertyWrapper; - -public class ColorEditor extends JLabel { +public class ColorEditor extends JLabel { private static final long serialVersionUID = 1L; + private static final String title = "Click to edit"; + public ColorEditor(final PropertyWrapper property) { - super("Click to edit"); + super(property.isUnique() ? title : ("(multi value) " + title)); setOpaque(true); setHorizontalAlignment(SwingConstants.CENTER); setBorder(BorderFactory.createEtchedBorder()); @@ -31,13 +32,14 @@ public class ColorEditor extends JLabel { Color newColor = JColorChooser.showDialog(ColorEditor.this, "Choose Color", getBackground()); if (newColor != null) { + property.setChanged(true); property.setValue(newColor); setBackground(newColor); } } }); } - + @Override public void setBackground(Color bg) { if (bg.getRed() < 127 || bg.getBlue() < 127 || bg.getGreen() < 127) { diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/swing/gui/editor/EnumEditor.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/swing/gui/editor/EnumEditor.java index b9fe5596..d53bf2c6 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/swing/gui/editor/EnumEditor.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/swing/gui/editor/EnumEditor.java @@ -1,5 +1,6 @@ package org.diylc.swing.gui.editor; +import java.awt.Color; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; @@ -7,14 +8,17 @@ import javax.swing.DefaultComboBoxModel; import javax.swing.JComboBox; import org.diylc.common.PropertyWrapper; +import org.diylc.utils.Constants; public class EnumEditor extends JComboBox { private static final long serialVersionUID = 1L; + private Color oldBg = getBackground(); + private final PropertyWrapper property; - public EnumEditor(PropertyWrapper property) { + public EnumEditor(final PropertyWrapper property) { this.property = property; Object[] values = property.getType().getEnumConstants(); setModel(new DefaultComboBoxModel(values)); @@ -24,9 +28,14 @@ public class EnumEditor extends JComboBox { @Override public void itemStateChanged(ItemEvent e) { if (e.getStateChange() == ItemEvent.SELECTED) { + property.setChanged(true); + setBackground(oldBg); EnumEditor.this.property.setValue(e.getItem()); } } }); + if (!property.isUnique()) { + setBackground(Constants.MULTI_VALUE_COLOR); + } } } diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/swing/gui/editor/FontEditor.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/swing/gui/editor/FontEditor.java index 7c181a0d..64471349 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/swing/gui/editor/FontEditor.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/swing/gui/editor/FontEditor.java @@ -1,10 +1,12 @@ package org.diylc.swing.gui.editor; +import java.awt.Color; import java.awt.Font; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import org.diylc.common.PropertyWrapper; +import org.diylc.utils.Constants; import com.diyfever.gui.FontChooserComboBox; @@ -12,9 +14,11 @@ public class FontEditor extends FontChooserComboBox { private static final long serialVersionUID = 1L; + private Color oldBg = getBackground(); + private final PropertyWrapper property; - public FontEditor(PropertyWrapper property) { + public FontEditor(final PropertyWrapper property) { this.property = property; setSelectedItem(((Font) property.getValue()).getName()); addItemListener(new ItemListener() { @@ -22,6 +26,8 @@ public class FontEditor extends FontChooserComboBox { @Override public void itemStateChanged(ItemEvent e) { if (e.getStateChange() == ItemEvent.SELECTED) { + property.setChanged(true); + setBackground(oldBg); Font oldFont = (Font) FontEditor.this.property.getValue(); Font newFont = new Font(getSelectedItem().toString(), oldFont.getStyle(), oldFont.getSize()); @@ -29,5 +35,8 @@ public class FontEditor extends FontChooserComboBox { } } }); + if (!property.isUnique()) { + setBackground(Constants.MULTI_VALUE_COLOR); + } } } diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/swing/gui/editor/ImageEditor.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/swing/gui/editor/ImageEditor.java index 552e519f..11bdb574 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/swing/gui/editor/ImageEditor.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/swing/gui/editor/ImageEditor.java @@ -1,6 +1,5 @@ package org.diylc.swing.gui.editor; -import java.awt.Color; import java.awt.event.ActionListener; import java.io.File; @@ -15,8 +14,10 @@ public class ImageEditor extends JButton { private static final long serialVersionUID = 1L; + private static final String title = "Click to load image file"; + public ImageEditor(final PropertyWrapper property) { - super("Click to load file"); + super(property.isUnique() ? title : ("(multi value) " + title)); addActionListener(new ActionListener() { @Override @@ -25,6 +26,7 @@ public class ImageEditor extends JButton { FileFilterEnum.IMAGES.getFilter(), null, FileFilterEnum.IMAGES.getExtensions()[0], null); if (file != null) { + property.setChanged(true); ImageIcon image = new ImageIcon(file.getAbsolutePath()); property.setValue(image); } @@ -32,13 +34,13 @@ public class ImageEditor extends JButton { }); } - @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); - } + // @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/swing/gui/editor/IntEditor.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/swing/gui/editor/IntEditor.java index 7b3bbbbd..919c7949 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/swing/gui/editor/IntEditor.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/swing/gui/editor/IntEditor.java @@ -1,10 +1,12 @@ package org.diylc.swing.gui.editor; import java.awt.BorderLayout; +import java.awt.Color; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import org.diylc.common.PropertyWrapper; +import org.diylc.utils.Constants; import com.diyfever.gui.DoubleTextField; @@ -12,6 +14,8 @@ public class IntEditor extends DoubleTextField { private static final long serialVersionUID = 1L; + private Color oldBg = getBackground(); + public IntEditor(final PropertyWrapper property) { setLayout(new BorderLayout()); setValue((double) (Integer) property.getValue()); @@ -19,8 +23,13 @@ public class IntEditor extends DoubleTextField { @Override public void propertyChange(PropertyChangeEvent evt) { + property.setChanged(true); + setBackground(oldBg); property.setValue(((Double) evt.getNewValue()).intValue()); } }); + if (!property.isUnique()) { + setBackground(Constants.MULTI_VALUE_COLOR); + } } } diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/swing/gui/editor/MeasureEditor.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/swing/gui/editor/MeasureEditor.java index 2f6e51fc..c16d6bc2 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/swing/gui/editor/MeasureEditor.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/swing/gui/editor/MeasureEditor.java @@ -1,6 +1,7 @@ package org.diylc.swing.gui.editor; import java.awt.BorderLayout; +import java.awt.Color; import java.awt.Container; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; @@ -14,6 +15,7 @@ import javax.swing.JComboBox; import org.diylc.common.PropertyWrapper; import org.diylc.core.measures.AbstractMeasure; import org.diylc.core.measures.Unit; +import org.diylc.utils.Constants; import com.diyfever.gui.DoubleTextField; @@ -21,11 +23,16 @@ public class MeasureEditor extends Container { private static final long serialVersionUID = 1L; + private Color oldBg; + private DoubleTextField valueField; + private JComboBox unitBox; + @SuppressWarnings("unchecked") public MeasureEditor(final PropertyWrapper property) { setLayout(new BorderLayout()); AbstractMeasure measure = ((AbstractMeasure) property.getValue()); - DoubleTextField valueField = new DoubleTextField(measure.getValue()); + valueField = new DoubleTextField(measure.getValue()); + oldBg = valueField.getBackground(); valueField.addPropertyChangeListener(DoubleTextField.VALUE_PROPERTY, new PropertyChangeListener() { @@ -36,6 +43,9 @@ public class MeasureEditor extends Container { .getValue()).clone(); newMeasure.setValue((Double) evt.getNewValue()); property.setValue(newMeasure); + property.setChanged(true); + valueField.setBackground(oldBg); + unitBox.setBackground(oldBg); } catch (CloneNotSupportedException ex) { } } @@ -43,7 +53,7 @@ public class MeasureEditor extends Container { add(valueField, BorderLayout.CENTER); try { Method method = measure.getUnit().getClass().getMethod("values"); - final JComboBox unitBox = new JComboBox((Object[]) method.invoke(measure.getUnit())); + unitBox = new JComboBox((Object[]) method.invoke(measure.getUnit())); unitBox.setSelectedItem(measure.getUnit()); unitBox.addActionListener(new ActionListener() { @@ -54,11 +64,19 @@ public class MeasureEditor extends Container { .getValue()).clone(); newMeasure.setUnit((Enum) unitBox.getSelectedItem()); property.setValue(newMeasure); + property.setChanged(true); + valueField.setBackground(oldBg); + unitBox.setBackground(oldBg); } catch (CloneNotSupportedException ex) { } } }); add(unitBox, BorderLayout.EAST); + + if (!property.isUnique()) { + valueField.setBackground(Constants.MULTI_VALUE_COLOR); + unitBox.setBackground(Constants.MULTI_VALUE_COLOR); + } } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/swing/gui/editor/StringEditor.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/swing/gui/editor/StringEditor.java index c163e6d3..3dbf9e16 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/swing/gui/editor/StringEditor.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/swing/gui/editor/StringEditor.java @@ -1,16 +1,20 @@ package org.diylc.swing.gui.editor; +import java.awt.Color; + import javax.swing.JTextField; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import org.diylc.common.PropertyWrapper; - +import org.diylc.utils.Constants; public class StringEditor extends JTextField { private static final long serialVersionUID = 1L; - + + private Color oldBg = getBackground(); + private final PropertyWrapper property; public StringEditor(PropertyWrapper property) { @@ -33,10 +37,14 @@ public class StringEditor extends JTextField { textChanged(); } }); + if (!property.isUnique()) { + setBackground(Constants.MULTI_VALUE_COLOR); + } } private void textChanged() { + property.setChanged(true); + setBackground(oldBg); property.setValue(getText()); } - } diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/utils/Constants.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/utils/Constants.java index 6a705ddc..da018a1f 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/utils/Constants.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/utils/Constants.java @@ -22,4 +22,6 @@ public class Constants { 240, 240, 240), Color.black); public static final Color TRANSPARENT_COLOR = new Color(0, 0, 0, 0); + + public static final Color MULTI_VALUE_COLOR = Color.yellow; } diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/update.xml b/ diy-layout-creator --username bancika@gmail.com/DIYLC/update.xml index 680e3b80..c4ed1e71 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/update.xml +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/update.xml @@ -322,6 +322,10 @@ BUG_FIX Auto-created solder pads aren't assigned with default settings and name + + IMPROVEMENT + Component edit dialog allows changing property values even when they are not the same. Boxes are marked yellow to designate multi-valued state. + IMPROVEMENT Component edit dialog should show mutual properties when components of different types are selected (e.g. curved trace and straight trace witdth)