Revision: 3492
Author: [email protected]
Date: Tue May  4 14:48:14 2010
Log: Updated the SQLColumn editor panel. Now users can easily see when they are overriding default values on domains and types. Users can also now remove an override on a domain or type by un-checking the override check box associated with the field.
http://code.google.com/p/power-architect/source/detail?r=3492

Modified:
 /trunk/regress/ca/sqlpower/architect/swingui/TestColumnEditPanel.java
 /trunk/src/main/java/ca/sqlpower/architect/swingui/ColumnEditPanel.java

=======================================
--- /trunk/regress/ca/sqlpower/architect/swingui/TestColumnEditPanel.java Mon May 3 06:53:28 2010 +++ /trunk/regress/ca/sqlpower/architect/swingui/TestColumnEditPanel.java Tue May 4 14:48:14 2010
@@ -22,6 +22,7 @@
 import java.sql.DatabaseMetaData;

 import junit.framework.TestCase;
+import ca.sqlpower.architect.swingui.ColumnEditPanel.YesNoEnum;
 import ca.sqlpower.architect.swingui.event.SelectionEvent;
 import ca.sqlpower.sqlobject.SQLColumn;
 import ca.sqlpower.sqlobject.SQLDatabase;
@@ -87,9 +88,9 @@
assertEquals("Wrong Precision",col3.getPrecision(),((Integer) panel.getColPrec().getValue()).intValue()); assertEquals("Wrong type",col3.getType(),((UserDefinedSQLType)panel.getColType().getSelectedItem()).getType().intValue()); assertEquals("Wrong Scale",col3.getScale(),((Integer) (panel.getColScale().getValue())).intValue()); - assertEquals(col3.isAutoIncrement(), panel.getColAutoInc().getModel().isSelected()); + assertEquals(col3.isAutoIncrement(), ((YesNoEnum) panel.getColAutoInc().getSelectedItem()).getValue()); assertEquals(col3.isPrimaryKey(), panel.getColInPK().getModel().isSelected()); - assertEquals(col3.getNullable() == DatabaseMetaData.columnNullable, panel.getColNullable().getModel().isSelected()); + assertEquals(col3.getNullable() == DatabaseMetaData.columnNullable, ((YesNoEnum) panel.getColNullable().getSelectedItem()).getValue());
                assertEquals("None Specified",panel.getSourceLabel().getText());

col2.getUserDefinedSQLType().setUpstreamType(session.getSQLTypes().get(1));
@@ -99,9 +100,9 @@
assertEquals("Wrong Precision",col2.getPrecision(),((Integer) panel.getColPrec().getValue()).intValue()); assertEquals("Wrong type",col2.getType(),((UserDefinedSQLType)panel.getColType().getSelectedItem()).getType().intValue()); assertEquals("Wrong Scale",col2.getScale(),((Integer) (panel.getColScale().getValue())).intValue()); - assertEquals(col2.isAutoIncrement(), panel.getColAutoInc().getModel().isSelected()); + assertEquals(col2.isAutoIncrement(), ((YesNoEnum) panel.getColAutoInc().getSelectedItem()).getValue()); assertEquals(col2.isPrimaryKey(), panel.getColInPK().getModel().isSelected()); - assertEquals(col2.getNullable() == DatabaseMetaData.columnNullable, panel.getColNullable().getModel().isSelected()); + assertEquals(col2.getNullable() == DatabaseMetaData.columnNullable, ((YesNoEnum) panel.getColNullable().getSelectedItem()).getValue());
         assertEquals("None Specified",panel.getSourceLabel().getText());
        }

@@ -111,15 +112,19 @@
                panel.getColLogicalName().setText("Easier Use Column Name");
                panel.getColType().setSelectedIndex(1);
                panel.getColPrec().setValue(new Integer(1234));
+               
panel.getTypeOverrideMap().get(panel.getColPrec()).setSelected(true);
                panel.getColScale().setValue(new Integer(5432));
+               
panel.getTypeOverrideMap().get(panel.getColScale()).setSelected(true);


                panel.getColInPK().getModel().setSelected(true);
-               panel.getColAutoInc().getModel().setSelected(true);
-               panel.getColNullable().getModel().setSelected(true);
+               panel.getColAutoInc().setSelectedItem(YesNoEnum.YES);
+               
panel.getTypeOverrideMap().get(panel.getColAutoInc()).setSelected(true);
+               panel.getColNullable().setSelectedItem(YesNoEnum.YES);
+               
panel.getTypeOverrideMap().get(panel.getColNullable()).setSelected(true);

                panel.applyChanges();
- assertEquals("Panel check boxes borked",true,panel.getColAutoInc().getModel().isSelected()); + assertEquals("Panel check boxes borked",true, ((YesNoEnum) panel.getColAutoInc().getSelectedItem()).getValue()); assertEquals("Wrong column physical name","CHANGED",col2.getPhysicalName()); assertEquals("Wrong column logical name","Easier Use Column Name",col2.getName());
                assertEquals("Wrong Precision",1234,col2.getPrecision());
@@ -138,9 +143,9 @@
                panel.getColLogicalName().setText("Easier Use Column Name");
                panel.getColPrec().setValue(new Integer(1234));
                panel.getColScale().setValue(new Integer(5432));
-               panel.getColAutoInc().getModel().setSelected(true);
+               panel.getColAutoInc().setSelectedItem(YesNoEnum.YES);
                panel.getColInPK().getModel().setSelected(true);
-               panel.getColNullable().getModel().setSelected(true);
+               panel.getColNullable().setSelectedItem(YesNoEnum.YES);
                panel.discardChanges();

assertEquals("Wrong column physical name","Physical Name 2",col2.getPhysicalName());
=======================================
--- /trunk/src/main/java/ca/sqlpower/architect/swingui/ColumnEditPanel.java Mon May 3 06:53:28 2010 +++ /trunk/src/main/java/ca/sqlpower/architect/swingui/ColumnEditPanel.java Tue May 4 14:48:14 2010
@@ -35,6 +35,7 @@
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;

@@ -70,7 +71,7 @@
 import ca.sqlpower.sqlobject.SQLObject;
 import ca.sqlpower.sqlobject.SQLObjectException;
 import ca.sqlpower.sqlobject.SQLObjectUtils;
-import ca.sqlpower.sqlobject.SQLTypePhysicalProperties;
+import ca.sqlpower.sqlobject.SQLTypePhysicalPropertiesProvider;
 import ca.sqlpower.sqlobject.UserDefinedSQLType;
import ca.sqlpower.sqlobject.SQLTypePhysicalPropertiesProvider.PropertyType;
 import ca.sqlpower.swingui.ChangeListeningDataEntryPanel;
@@ -93,6 +94,44 @@
private static final Logger logger = Logger.getLogger(ColumnEditPanel.class);

private static final Font TITLE_FONT = UIManager.getFont("Label.font").deriveFont(Font.BOLD, 10f);
+
+    /**
+ * A simple enum that gives a nicer name to true and false for combo boxes.
+     * <p>
+     * Used in testing
+     */
+    static enum YesNoEnum {
+        YES("yes", true),
+        NO("no", false);
+
+        private final String displayName;
+        private final boolean value;
+
+        private YesNoEnum(String displayName, boolean value) {
+            this.displayName = displayName;
+            this.value = value;
+        }
+
+        @Override
+        public String toString() {
+            return displayName;
+        }
+
+        public boolean getValue() {
+            return value;
+        }
+
+        public static YesNoEnum valueOf(Boolean bool) {
+            if (bool == null) {
+                return null;
+            } else if (bool) {
+                return YES;
+            } else {
+                return NO;
+            }
+
+        }
+    }

     /**
      * The column we're editing.
@@ -106,6 +145,14 @@
      * or not the value should be applied.
      */
private final Map<JComponent, JCheckBox> componentEnabledMap = new HashMap<JComponent, JCheckBox>();
+
+    /**
+     * Mapping of data entry components specific to data types to the check
+ * boxes that say if the value in the column editor window should override + * the value from the underlying type or if the underlying type should be
+     * used instead.
+     */
+ private final Map<JComponent, JCheckBox> typeOverrideMap = new HashMap<JComponent, JCheckBox>();

     /**
      * Label that shows where the column was reverse engineered from, or
@@ -123,7 +170,7 @@

     private final JSpinner colPrec;

-    private final JCheckBox colNullable;
+    private final JComboBox colNullable;

     private final JTextArea colRemarks;

@@ -131,7 +178,7 @@

     private final JCheckBox colInPK;

-    private final JCheckBox colAutoInc;
+    private final JComboBox colAutoInc;

     /**
* Text field for the name of the sequence that will generate this column's
@@ -182,30 +229,31 @@
 //        }

         FormLayout layout = new FormLayout(
-                "pref, pref:grow, 4dlu, pref, pref:grow",
+                "pref, pref, pref:grow, 4dlu, pref, pref:grow",
                 "");
-        layout.setColumnGroups(new int[][] { { 2, 5 } } );
+        layout.setColumnGroups(new int[][] { { 3, 6 } } );
         panel = new JPanel(layout);
         CellConstraints cc = new CellConstraints();

         JCheckBox cb;
         int row = 1;
+        int width = 5;
         layout.appendRow(RowSpec.decode("p"));
- panel.add(makeTitle(Messages.getString("ColumnEditPanel.source")), cc.xyw(2, row++, 4)); //$NON-NLS-1$ + panel.add(makeTitle(Messages.getString("ColumnEditPanel.source")), cc.xyw(2, row++, width)); //$NON-NLS-1$
         layout.appendRow(RowSpec.decode("p"));
-        panel.add(sourceLabel = new JLabel(), cc.xyw(2, row++, 4));
+        panel.add(sourceLabel = new JLabel(), cc.xyw(2, row++, width));

         layout.appendRow(RowSpec.decode("5dlu"));
         row++;

         layout.appendRow(RowSpec.decode("p"));
- panel.add(makeTitle(Messages.getString("ColumnEditPanel.logicalName")), cc.xyw(2, row++, 4)); //$NON-NLS-1$ + panel.add(makeTitle(Messages.getString("ColumnEditPanel.logicalName")), cc.xyw(2, row++, width)); //$NON-NLS-1$
         layout.appendRow(RowSpec.decode("p"));
         cb = new JCheckBox();
         if (cols.size() > 1) {
             panel.add(cb, cc.xy(1, row));
         }
-        panel.add(colLogicalName = new JTextField(), cc.xyw(2, row++, 4));
+ panel.add(colLogicalName = new JTextField(), cc.xyw(2, row++, width));
         componentEnabledMap.put(colLogicalName, cb);
colLogicalName.getDocument().addDocumentListener(new DocumentCheckboxEnabler(cb));
         colLogicalName.addComponentListener(new ComponentAdapter() {
@@ -227,13 +275,13 @@
         row++;

         layout.appendRow(RowSpec.decode("p"));
- panel.add(makeTitle(Messages.getString("ColumnEditPanel.physicalName")), cc.xyw(2, row++, 4)); //$NON-NLS-1$ + panel.add(makeTitle(Messages.getString("ColumnEditPanel.physicalName")), cc.xyw(2, row++, width)); //$NON-NLS-1$
         layout.appendRow(RowSpec.decode("p"));
         cb = new JCheckBox();
         if (cols.size() > 1) {
             panel.add(cb, cc.xy(1, row));
         }
-        panel.add(colPhysicalName = new JTextField(), cc.xyw(2, row++, 4));
+ panel.add(colPhysicalName = new JTextField(), cc.xyw(2, row++, width));
         componentEnabledMap.put(colPhysicalName, cb);
colPhysicalName.getDocument().addDocumentListener(new DocumentCheckboxEnabler(cb));
         colPhysicalName.addComponentListener(new ComponentAdapter() {
@@ -251,17 +299,30 @@
             }
         });

+        layout.appendRow(RowSpec.decode("5dlu"));
+        row++;
+
+        layout.appendRow(RowSpec.decode("p"));
+        cb = new JCheckBox();
+        if (cols.size() > 1) {
+            panel.add(cb, cc.xy(1, row));
+        }
+ panel.add(colInPK = new JCheckBox(Messages.getString("ColumnEditPanel.inPrimaryKey")), cc.xyw(2, row++, width)); //$NON-NLS-1$
+        componentEnabledMap.put(colInPK, cb);
+        colInPK.addActionListener(this);
+        colInPK.addActionListener(checkboxEnabler);
+
         layout.appendRow(RowSpec.decode("5dlu"));
         row++;

         layout.appendRow(RowSpec.decode("p"));
- panel.add(makeTitle(Messages.getString("ColumnEditPanel.type")), cc.xyw(2, row++, 4)); //$NON-NLS-1$ + panel.add(makeTitle(Messages.getString("ColumnEditPanel.type")), cc.xyw(2, row++, width)); //$NON-NLS-1$
         layout.appendRow(RowSpec.decode("p"));
         cb = new JCheckBox();
         if (cols.size() > 1) {
             panel.add(cb, cc.xy(1, row));
         }
- panel.add(colType = new JComboBox(session.getSQLTypes().toArray()), cc.xyw(2, row++, 4)); + panel.add(colType = new JComboBox(session.getSQLTypes().toArray()), cc.xyw(2, row++, width));
         componentEnabledMap.put(colType, cb);
         colType.setSelectedItem(null);
         colType.addActionListener(this);
@@ -270,78 +331,148 @@
         row++;

         layout.appendRow(RowSpec.decode("p"));
- panel.add(makeTitle(Messages.getString("ColumnEditPanel.precision")), cc.xy(2, row)); //$NON-NLS-1$ - panel.add(makeTitle(Messages.getString("ColumnEditPanel.scale")), cc.xy(5, row++)); //$NON-NLS-1$ + panel.add(makeTitle(Messages.getString("ColumnEditPanel.precision")), cc.xy(3, row)); //$NON-NLS-1$ + panel.add(makeTitle(Messages.getString("ColumnEditPanel.scale")), cc.xy(6, row++)); //$NON-NLS-1$

         layout.appendRow(RowSpec.decode("p"));
-        cb = new JCheckBox();
-        if (cols.size() > 1) {
-            panel.add(cb, cc.xy(1, row));
-        }
-        panel.add(colPrec = createPrecisionEditor(), cc.xy(2, row));
-        componentEnabledMap.put(colPrec, cb);
+        panel.add(colPrec = createPrecisionEditor(), cc.xy(3, row));
         colPrec.addChangeListener(checkboxEnabler);
         SPSUtils.makeJSpinnerSelectAllTextOnFocus(colPrec);
-
-        cb = new JCheckBox();
-        if (cols.size() > 1) {
-            panel.add(cb, cc.xy(4, row));
-        }
-        panel.add(colScale = createScaleEditor(), cc.xy(5, row++));
-        componentEnabledMap.put(colScale, cb);
+        final JCheckBox colPrecCB = new JCheckBox();
+        panel.add(colPrecCB, cc.xy(2, row));
+        typeOverrideMap.put(colPrec, colPrecCB);
+        colPrecCB.addChangeListener(new ChangeListener() {
+            public void stateChanged(ChangeEvent e) {
+                if (colPrecCB.isSelected()) {
+                    colPrec.setEnabled(true);
+                } else {
+                    colPrec.setEnabled(false);
+                    if (colType.getSelectedItem() != null) {
+ colPrec.setValue(((UserDefinedSQLType) colType.getSelectedItem()).getPrecision( + SQLTypePhysicalPropertiesProvider.GENERIC_PLATFORM));
+                    }
+                }
+            }
+        });
+        colPrec.setEnabled(false);
+
+        final JCheckBox colScaleCB = new JCheckBox();
+        panel.add(colScaleCB, cc.xy(5, row));
+        panel.add(colScale = createScaleEditor(), cc.xy(6, row++));
+        typeOverrideMap.put(colScale, colScaleCB);
         colScale.addChangeListener(checkboxEnabler);
         SPSUtils.makeJSpinnerSelectAllTextOnFocus(colScale);
+        colScaleCB.addChangeListener(new ChangeListener() {
+            public void stateChanged(ChangeEvent e) {
+                if (colScaleCB.isSelected()) {
+                    colScale.setEnabled(true);
+                } else {
+                    colScale.setEnabled(false);
+                    if (colType.getSelectedItem() != null) {
+ colScale.setValue(((UserDefinedSQLType) colType.getSelectedItem()).getScale( + SQLTypePhysicalPropertiesProvider.GENERIC_PLATFORM));
+                    }
+                }
+            }
+        });
+        colScale.setEnabled(false);

         layout.appendRow(RowSpec.decode("5dlu"));
         row++;

         layout.appendRow(RowSpec.decode("p"));
-        cb = new JCheckBox();
-        if (cols.size() > 1) {
-            panel.add(cb, cc.xy(1, row));
-        }
- panel.add(colInPK = new JCheckBox(Messages.getString("ColumnEditPanel.inPrimaryKey")), cc.xyw(2, row++, 4)); //$NON-NLS-1$
-        componentEnabledMap.put(colInPK, cb);
-        colInPK.addActionListener(this);
-        colInPK.addActionListener(checkboxEnabler);
-
-        layout.appendRow(RowSpec.decode("3dlu"));
-        row++;
-
+ panel.add(makeTitle(Messages.getString("ColumnEditPanel.allowsNulls")), cc.xyw(3, row++, width - 1)); //$NON-NLS-1$
+
         layout.appendRow(RowSpec.decode("p"));
-        cb = new JCheckBox();
-        if (cols.size() > 1) {
-            panel.add(cb, cc.xy(1, row));
-        }
- panel.add(colNullable = new JCheckBox(Messages.getString("ColumnEditPanel.allowsNulls")), cc.xyw(2, row++, 4)); //$NON-NLS-1$
-        componentEnabledMap.put(colNullable, cb);
+        final JCheckBox colNullCB = new JCheckBox();
+        panel.add(colNullCB, cc.xy(2, row));
+ panel.add(colNullable = new JComboBox(YesNoEnum.values()), cc.xy(3, row++)); //$NON-NLS-1$
+        typeOverrideMap.put(colNullable, colNullCB);
         colNullable.addActionListener(this);
         colNullable.addActionListener(checkboxEnabler);
+        colNullCB.addChangeListener(new ChangeListener() {
+            public void stateChanged(ChangeEvent e) {
+                if (colNullCB.isSelected()) {
+                    colNullable.setEnabled(true);
+                } else {
+                    colNullable.setEnabled(false);
+                    if (colType.getSelectedItem() != null) {
+                        colNullable.setSelectedItem(YesNoEnum.valueOf(
+ ((UserDefinedSQLType) colType.getSelectedItem()).getNullability() == DatabaseMetaData.columnNullable));
+                    }
+                }
+                updateComponents();
+            }
+        });
+        colNullable.setEnabled(false);

         layout.appendRow(RowSpec.decode("3dlu"));
         row++;

         layout.appendRow(RowSpec.decode("p"));
-        cb = new JCheckBox();
-        if (cols.size() > 1) {
-            panel.add(cb, cc.xy(1, row));
-        }
- panel.add(colAutoInc = new JCheckBox(Messages.getString("ColumnEditPanel.autoIncrement")), cc.xyw(2, row++, 4)); //$NON-NLS-1$
-        componentEnabledMap.put(colAutoInc, cb);
+ panel.add(makeTitle(Messages.getString("ColumnEditPanel.autoIncrement")), cc.xyw(3, row++, width - 1)); //$NON-NLS-1$
+
+        layout.appendRow(RowSpec.decode("p"));
+        final JCheckBox colAutoIncCB = new JCheckBox();
+        panel.add(colAutoIncCB, cc.xy(2, row));
+ panel.add(colAutoInc = new JComboBox(YesNoEnum.values()), cc.xy(3, row++)); //$NON-NLS-1$
+        typeOverrideMap.put(colAutoInc, colAutoIncCB);
         colAutoInc.addActionListener(this);
         colAutoInc.addActionListener(checkboxEnabler);
+        colAutoIncCB.addChangeListener(new ChangeListener() {
+            public void stateChanged(ChangeEvent e) {
+                if (colAutoIncCB.isSelected()) {
+                    colAutoInc.setEnabled(true);
+                } else {
+                    colAutoInc.setEnabled(false);
+                    if (colType.getSelectedItem() != null) {
+                        colAutoInc.setSelectedItem(YesNoEnum.valueOf(
+ ((UserDefinedSQLType) colType.getSelectedItem()).getAutoIncrement()));
+                    }
+                }
+            }
+        });
+        colAutoInc.setEnabled(false);
+
+        layout.appendRow(RowSpec.decode("5dlu"));
+        row++;
+
+        layout.appendRow(RowSpec.decode("p"));
+ panel.add(makeTitle(Messages.getString("ColumnEditPanel.defaultValue")), cc.xyw(3, row++, width - 1)); //$NON-NLS-1$
+        layout.appendRow(RowSpec.decode("p"));
+        final JCheckBox colDefaultCB = new JCheckBox();
+        panel.add(colDefaultCB, cc.xy(2, row));
+ panel.add(colDefaultValue = new JTextField(), cc.xyw(3, row++, width - 1));
+        colDefaultValue.setEnabled(false);
+
+        typeOverrideMap.put(colDefaultValue, colDefaultCB);
+        colDefaultValue.addActionListener(this);
+        colDefaultCB.addChangeListener(new ChangeListener() {
+            public void stateChanged(ChangeEvent e) {
+                if (colDefaultCB.isSelected()) {
+                    colDefaultValue.setEnabled(true);
+                } else {
+                    colDefaultValue.setEnabled(false);
+                    if (colType.getSelectedItem() != null) {
+ colDefaultValue.setText(((UserDefinedSQLType) colType.getSelectedItem()).getDefaultValue( + SQLTypePhysicalPropertiesProvider.GENERIC_PLATFORM));
+                    }
+                }
+                updateComponents();
+            }
+        });

         layout.appendRow(RowSpec.decode("6dlu"));
         row++;

         layout.appendRow(RowSpec.decode("p"));
- panel.add(makeTitle(Messages.getString("ColumnEditPanel.sequenceName")), cc.xyw(2, row++, 4)); //$NON-NLS-1$ + panel.add(makeTitle(Messages.getString("ColumnEditPanel.sequenceName")), cc.xyw(2, row++, width)); //$NON-NLS-1$
         layout.appendRow(RowSpec.decode("p"));
         cb = new JCheckBox();
         if (cols.size() > 1) {
             panel.add(cb, cc.xy(1, row));
         }
- panel.add(colAutoIncSequenceName = new JTextField(), cc.xyw(2, row++, 4)); + panel.add(colAutoIncSequenceName = new JTextField(), cc.xyw(2, row++, width));
         componentEnabledMap.put(colAutoIncSequenceName, cb);
colAutoIncSequenceName.getDocument().addDocumentListener(new DocumentCheckboxEnabler(cb));

@@ -393,40 +524,45 @@
         row++;

         layout.appendRow(RowSpec.decode("p"));
- panel.add(makeTitle(Messages.getString("ColumnEditPanel.remarks")), cc.xyw(2, row++, 4)); //$NON-NLS-1$ + panel.add(makeTitle(Messages.getString("ColumnEditPanel.remarks")), cc.xyw(2, row++, width)); //$NON-NLS-1$
         layout.appendRow(RowSpec.decode("pref:grow"));
         cb = new JCheckBox();
         if (cols.size() > 1) {
             panel.add(cb, cc.xy(1, row, "center, top"));
         }
- panel.add(new JScrollPane(colRemarks = new JTextArea()), cc.xyw(2, row++, 4, "fill, fill")); + panel.add(new JScrollPane(colRemarks = new JTextArea()), cc.xyw(2, row++, width, "fill, fill"));
         componentEnabledMap.put(colRemarks, cb);
colRemarks.getDocument().addDocumentListener(new DocumentCheckboxEnabler(cb));
         colRemarks.setRows(5);
         colRemarks.setLineWrap(true);
         colRemarks.setWrapStyleWord(true);

-        layout.appendRow(RowSpec.decode("5dlu"));
-        row++;
-
-        layout.appendRow(RowSpec.decode("p"));
- panel.add(makeTitle(Messages.getString("ColumnEditPanel.defaultValue")), cc.xyw(2, row++, 4)); //$NON-NLS-1$
-        layout.appendRow(RowSpec.decode("p"));
-        cb = new JCheckBox();
-        if (cols.size() > 1) {
-            panel.add(cb, cc.xy(1, row));
-        }
-        panel.add(colDefaultValue = new JTextField(), cc.xyw(2, row++, 4));
- colDefaultValue.getDocument().addDocumentListener(new DocumentCheckboxEnabler(cb));
-        componentEnabledMap.put(colDefaultValue, cb);
-        colDefaultValue.addActionListener(this);
-
         // start with all components enabled; if there are multiple columns
         // to edit, these checkboxes will be turned off selectively for the
         // mismatching values
         for (JCheckBox checkbox : componentEnabledMap.values()) {
             checkbox.setSelected(true);
         }
+
+ //The type covers multiple fields and needs a different check to see if + //it should start enabled. All type info must match across the objects
+        //for the checkbox to start selected
+        if (cols.size() > 1) {
+            Iterator<SQLColumn> colIterator = cols.iterator();
+            SQLColumn firstCol = colIterator.next();
+            while (colIterator.hasNext()) {
+                SQLColumn nextCol = colIterator.next();
+ if (!firstCol.getTypeName().equals(nextCol.getTypeName()) | | + firstCol.getPrecision() != nextCol.getPrecision() | |
+                        firstCol.getScale() != nextCol.getScale() ||
+                        firstCol.getNullable() != nextCol.getNullable() ||
+ firstCol.isAutoIncrement() != nextCol.isAutoIncrement() || + !firstCol.getDefaultValue().equals(nextCol.getDefaultValue())) {
+                    componentEnabledMap.get(colType).setSelected(false);
+                    break;
+                }
+            }
+        }

         for (SQLColumn col : cols) {
             logger.debug("Updating component state for column " + col);
@@ -442,9 +578,9 @@
         panel.addAncestorListener(cleanupListener);
         colType.addItemListener(new ItemListener() {
             public void itemStateChanged(ItemEvent e) {
-                if (e.getItem() instanceof UserDefinedSQLType) {
+ if (e.getItem() instanceof UserDefinedSQLType && e.getStateChange() == ItemEvent.SELECTED) { UserDefinedSQLType sqlType = (UserDefinedSQLType) e.getItem();
-                    updateSQLTypeComponents(sqlType);
+                    updateSQLTypeComponents(sqlType, false);
                 }
             }
         });
@@ -494,14 +630,10 @@
         updateComponent(colLogicalName, col.getName());
         updateComponent(colPhysicalName, col.getPhysicalName());
updateComponent(colType, col.getUserDefinedSQLType().getUpstreamType());
-
-        updateComponent(colScale, col.getScale(), col.getScaleType());
- updateComponent(colPrec, col.getPrecision(), col.getPrecisionType());
-
- updateComponent(colNullable, col.getNullable() == DatabaseMetaData.columnNullable);
+
+        updateSQLTypeComponents(col.getUserDefinedSQLType(), true);

         updateComponent(colRemarks, col.getRemarks());
-        updateComponent(colDefaultValue, col.getDefaultValue());

         boolean inPk;
         if (col.getParent() == null) {
@@ -514,7 +646,6 @@
         updateComponent(colInPK, inPk);
         logger.debug("Selected" + colInPK.isSelected());

-        updateComponent(colAutoInc, col.isAutoIncrement());

updateComponent(colAutoIncSequenceName, col.getAutoIncrementSequenceName());

@@ -548,20 +679,7 @@
             componentEnabledMap.get(comp).setSelected(false);
         }
     }
-
-    /** Subroutine of {...@link #updateComponents(SQLColumn)}. */
- private void updateComponent(JSpinner comp, int expectedValue, PropertyType propertyType) {
-        boolean unvisited = comp.getValue().equals(Integer.valueOf(0));
-        if (componentEnabledMap.get(comp).isSelected() &&
-                (unvisited || comp.getValue().equals(expectedValue)) &&
-                    propertyType != PropertyType.NOT_APPLICABLE) {
-            comp.setValue(expectedValue);
-        } else {
-            componentEnabledMap.get(comp).setSelected(false);
-        }
-        comp.setEnabled(propertyType == PropertyType.VARIABLE);
-    }
-
+
     /** Subroutine of {...@link #updateComponents(SQLColumn)}. */
     private void updateComponent(JCheckBox comp, boolean expectedValue) {
// Checking if a checkbox was visited is not possible just by examining its value,
@@ -625,33 +743,34 @@
      */
     private void updateComponents() {
         // allow nulls is free unless column is in PK
-        if (colInPK.isSelected()) {
+ if (colInPK.isSelected() | | !typeOverrideMap.get(colNullable).isSelected()) {
             colNullable.setEnabled(false);
         } else {
             colNullable.setEnabled(true);
         }

         // primary key is free unless column allows nulls
-        if (colNullable.isSelected()) {
+        if (((YesNoEnum) colNullable.getSelectedItem()).getValue()) {
             colInPK.setEnabled(false);
         } else {
             colInPK.setEnabled(true);
         }

-        if (colInPK.isSelected() && colNullable.isSelected()) {
+ if (colInPK.isSelected() && ((YesNoEnum) colNullable.getSelectedItem()).getValue()) {
             // this should not be physically possible
-            colNullable.setSelected(false);
+            colNullable.setSelectedItem(false);
             colNullable.setEnabled(false);
         }

-        if (colAutoInc.isSelected()) {
+        if (((YesNoEnum) colAutoInc.getSelectedItem()).getValue() ||
+                !typeOverrideMap.get(colDefaultValue).isSelected()) {
             colDefaultValue.setText(""); //$NON-NLS-1$
             colDefaultValue.setEnabled(false);
         } else {
             colDefaultValue.setEnabled(true);
         }

-        colAutoIncSequenceName.setEnabled(colAutoInc.isSelected());
+ colAutoIncSequenceName.setEnabled(((YesNoEnum) colAutoInc.getSelectedItem()).getValue());
     }

     /**
@@ -683,34 +802,57 @@
column.getUserDefinedSQLType().setUpstreamType((UserDefinedSQLType) colType.getSelectedItem());
                 }

-                if (componentEnabledMap.get(colScale).isSelected()) {
- column.setScale(((Integer) colScale.getValue()).intValue());
+                if (componentEnabledMap.get(colType).isSelected()) {
+                    if (typeOverrideMap.get(colScale).isSelected()) {
+ column.setScale(((Integer) colScale.getValue()).intValue());
+                    } else {
+                        column.getUserDefinedSQLType().setScale(
+ SQLTypePhysicalPropertiesProvider.GENERIC_PLATFORM, null);
+                    }
                 }

-                if (componentEnabledMap.get(colPrec).isSelected()) {
- column.setPrecision(((Integer) colPrec.getValue()).intValue());
+                if (componentEnabledMap.get(colType).isSelected()) {
+                    if (typeOverrideMap.get(colPrec).isSelected()) {
+ column.setPrecision(((Integer) colPrec.getValue()).intValue());
+                    } else {
+                        column.getUserDefinedSQLType().setPrecision(
+ SQLTypePhysicalPropertiesProvider.GENERIC_PLATFORM, null);
+                    }
                 }

-                if (componentEnabledMap.get(colNullable).isSelected()) {
- column.setNullable(colNullable.isSelected() ? DatabaseMetaData.columnNullable
+                if (componentEnabledMap.get(colType).isSelected()) {
+                    if (typeOverrideMap.get(colNullable).isSelected()) {
+ column.setNullable(((YesNoEnum) colNullable.getSelectedItem()).getValue() ? DatabaseMetaData.columnNullable
                             : DatabaseMetaData.columnNoNulls);
+                    } else {
+ column.getUserDefinedSQLType().setMyNullability(null);
+                    }
                 }

                 if (componentEnabledMap.get(colRemarks).isSelected()) {
                     column.setRemarks(colRemarks.getText());
                 }

- if (componentEnabledMap.get(colDefaultValue).isSelected()) {
-                    // avoid setting default value to empty string
- if (!(column.getDefaultValue() == null && colDefaultValue.getText().equals(""))) { //$NON-NLS-1$
-                        column.setDefaultValue(colDefaultValue.getText());
+                if (componentEnabledMap.get(colType).isSelected()) {
+ if (typeOverrideMap.get(colDefaultValue).isSelected()) {
+                        // avoid setting default value to empty string
+ if (!(column.getDefaultValue() == null && colDefaultValue.getText().equals(""))) { //$NON-NLS-1$ + column.setDefaultValue(colDefaultValue.getText());
+                        }
+                    } else {
+                        column.getUserDefinedSQLType().setDefaultValue(
+ SQLTypePhysicalPropertiesProvider.GENERIC_PLATFORM, null);
                     }
                 }

                 // Autoincrement has to go before the primary key or
                 // this column will never allow nulls
-                if (componentEnabledMap.get(colAutoInc).isSelected()) {
-                    column.setAutoIncrement(colAutoInc.isSelected());
+                if (componentEnabledMap.get(colType).isSelected()) {
+                    if (typeOverrideMap.get(colAutoInc).isSelected()) {
+ column.setAutoIncrement(((YesNoEnum) colAutoInc.getSelectedItem()).getValue());
+                    } else {
+ column.getUserDefinedSQLType().setMyAutoIncrement(null);
+                    }
                 }

                 if (componentEnabledMap.get(colInPK).isSelected()) {
@@ -763,7 +905,7 @@
     }

/** Only for testing. Normal client code should not need to call this. */
-    public JCheckBox getColAutoInc() {
+    public JComboBox getColAutoInc() {
         return colAutoInc;
     }

@@ -787,7 +929,7 @@
     }

/** Only for testing. Normal client code should not need to call this. */
-    public JCheckBox getColNullable() {
+    public JComboBox getColNullable() {
         return colNullable;
     }

@@ -983,13 +1125,77 @@
      * 'Cancel' button.
      *
      * @param sqlType
+     *            The data type to update all of the type fields to.
+     * @param overrideIfNotNull
+ * If true the override check boxes will be checked and the field + * enabled if the value in the type given is not null. If false + * the override checkboxes will never be checked to start and
+     *            just use the defaults given by the data type.
      */
-    private void updateSQLTypeComponents(UserDefinedSQLType sqlType) {
- SQLTypePhysicalProperties properties = sqlType.getDefaultPhysicalProperties(); - updateComponent(colScale, properties.getScale(), properties.getScaleType()); - updateComponent(colPrec, properties.getPrecision(), properties.getPrecisionType()); - updateComponent(colNullable, sqlType.getNullability() == DatabaseMetaData.columnNullable);
-        updateComponent(colDefaultValue, properties.getDefaultValue());
-        updateComponent(colAutoInc, sqlType.getAutoIncrement());
+ private void updateSQLTypeComponents(UserDefinedSQLType sqlType, boolean overrideIfNotNull) {
+
+        if (!componentEnabledMap.get(colType).isSelected()) {
+            //not editing any of these fields, setting to defaults
+            colScale.setValue(0);
+            colPrec.setValue(0);
+            colNullable.setSelectedItem(YesNoEnum.NO);
+            colAutoInc.setSelectedItem(YesNoEnum.NO);
+            colDefaultValue.setText("");
+            return;
+        }
+
+ if (sqlType.getScaleType(SQLTypePhysicalPropertiesProvider.GENERIC_PLATFORM) == PropertyType.NOT_APPLICABLE) {
+            typeOverrideMap.get(colScale).setSelected(false);
+            typeOverrideMap.get(colScale).setEnabled(false);
+ } else if (sqlType.getDefaultPhysicalProperties().getScale() == null || !overrideIfNotNull) {
+            typeOverrideMap.get(colScale).setSelected(false);
+            typeOverrideMap.get(colScale).setEnabled(true);
+        } else {
+            typeOverrideMap.get(colScale).setSelected(true);
+            typeOverrideMap.get(colScale).setEnabled(true);
+        }
+ colScale.setValue(sqlType.getScale(SQLTypePhysicalPropertiesProvider.GENERIC_PLATFORM));
+
+
+ if (sqlType.getPrecisionType(SQLTypePhysicalPropertiesProvider.GENERIC_PLATFORM) == PropertyType.NOT_APPLICABLE) {
+            typeOverrideMap.get(colPrec).setSelected(false);
+            typeOverrideMap.get(colPrec).setEnabled(false);
+ } else if (sqlType.getDefaultPhysicalProperties().getPrecision() == null || !overrideIfNotNull) {
+            typeOverrideMap.get(colPrec).setSelected(false);
+            typeOverrideMap.get(colPrec).setEnabled(true);
+        } else {
+            typeOverrideMap.get(colPrec).setSelected(true);
+            typeOverrideMap.get(colPrec).setEnabled(true);
+        }
+ colPrec.setValue(sqlType.getPrecision(SQLTypePhysicalPropertiesProvider.GENERIC_PLATFORM));
+
+        if (sqlType.getMyNullability() == null || !overrideIfNotNull) {
+            typeOverrideMap.get(colNullable).setSelected(false);
+        } else {
+            typeOverrideMap.get(colNullable).setSelected(true);
+        }
+        colNullable.setSelectedItem(YesNoEnum.valueOf(
+ sqlType.getNullability() == DatabaseMetaData.columnNullable));
+
+ if (sqlType.getDefaultPhysicalProperties().getDefaultValue() == null || !overrideIfNotNull) {
+            typeOverrideMap.get(colDefaultValue).setSelected(false);
+        } else {
+            typeOverrideMap.get(colDefaultValue).setSelected(true);
+        }
+ colDefaultValue.setText(sqlType.getDefaultValue(SQLTypePhysicalPropertiesProvider.GENERIC_PLATFORM));
+
+        if (sqlType.getMyAutoIncrement() == null || !overrideIfNotNull) {
+            typeOverrideMap.get(colAutoInc).setSelected(false);
+        } else {
+            typeOverrideMap.get(colAutoInc).setSelected(true);
+        }
+ colAutoInc.setSelectedItem(YesNoEnum.valueOf(sqlType.getAutoIncrement()));
+    }
+
+    /**
+     * For testing purposes only.
+     */
+    Map<JComponent, JCheckBox> getTypeOverrideMap() {
+        return typeOverrideMap;
     }
 }

Reply via email to