You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by nt...@apache.org on 2017/02/21 08:33:02 UTC

cayenne git commit: CAY-2207 Modeler: “Java Type” and "DbAttribute Path" are not saved with using TAB to move forward plus related code cleanup

Repository: cayenne
Updated Branches:
  refs/heads/master 5502c691d -> e1823c3e2


CAY-2207 Modeler: \u201cJava Type\u201d and "DbAttribute Path" are not saved with using TAB to move forward
plus related code cleanup


Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/e1823c3e
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/e1823c3e
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/e1823c3e

Branch: refs/heads/master
Commit: e1823c3e2bdd8ee998077e49e7de3d1a2a3aae5f
Parents: 5502c69
Author: Nikita Timofeev <st...@gmail.com>
Authored: Tue Feb 21 11:32:45 2017 +0300
Committer: Nikita Timofeev <st...@gmail.com>
Committed: Tue Feb 21 11:32:45 2017 +0300

----------------------------------------------------------------------
 .../modeler/editor/ObjAttributeTableModel.java  |  3 +-
 .../modeler/editor/ObjEntityAttributePanel.java | 44 ++++----------
 .../editor/ObjEntityRelationshipPanel.java      |  4 +-
 .../editor/ObjRelationshipTableModel.java       | 49 +++++----------
 .../cayenne/modeler/util/CayenneTable.java      | 15 ++---
 .../cayenne/modeler/util/CayenneTableModel.java | 63 +++++---------------
 .../modeler/util/DefaultWidgetFactory.java      |  3 +-
 .../modeler/util/combo/AutoCompletion.java      | 18 ++----
 .../modeler/util/combo/ComboBoxCellEditor.java  | 15 +----
 .../util/combo/CustomTypeComboBoxEditor.java    | 14 ++---
 .../modeler/util/combo/EditorTextField.java     | 41 ++++++++++++-
 .../modeler/util/combo/SuggestionList.java      |  7 +--
 12 files changed, 102 insertions(+), 174 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/e1823c3e/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjAttributeTableModel.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjAttributeTableModel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjAttributeTableModel.java
index 8881829..41739ac 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjAttributeTableModel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjAttributeTableModel.java
@@ -339,8 +339,7 @@ public class ObjAttributeTableModel extends CayenneTableModel<ObjAttributeWrappe
     }
 
     private void setColumnLocking(ObjAttributeWrapper attribute, Object value) {
-        attribute.setUsedForLocking((value instanceof Boolean)
-                && ((Boolean) value).booleanValue());
+        attribute.setUsedForLocking((value instanceof Boolean) && (Boolean) value);
     }
 
     private void setDbAttribute(ObjAttributeWrapper attribute, Object value) {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e1823c3e/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjEntityAttributePanel.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjEntityAttributePanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjEntityAttributePanel.java
index 1d6645a..7c03193 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjEntityAttributePanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjEntityAttributePanel.java
@@ -127,9 +127,7 @@ public class ObjEntityAttributePanel extends JPanel implements ObjEntityDisplayL
                 ObjAttributeTableModel.class,
                 "objEntity/attributeTable");
 
-        /**
-         * Create and install a popup
-         */
+        // Create and install a popup
         Icon ico = ModelerUtil.buildIcon("icon-info.gif");
         resolveMenu = new JMenuItem("Database Mapping", ico);
 
@@ -164,13 +162,10 @@ public class ObjEntityAttributePanel extends JPanel implements ObjEntityDisplayL
                 // ... show dialog...
                 new ObjAttributeInfoDialog(mediator, row, model).startupAction();
 
-                /**
-                 * This is required for a table to be updated properly
-                 */
+                // This is required for a table to be updated properly
                 table.cancelEditing();
 
-                // need to refresh selected row... do this by unselecting/selecting the
-                // row
+                // need to refresh selected row... do this by unselecting/selecting the row
                 table.getSelectionModel().clearSelection();
                 table.select(row);
                 enabledResolve = false;
@@ -188,14 +183,10 @@ public class ObjEntityAttributePanel extends JPanel implements ObjEntityDisplayL
     }
 
     public void initComboBoxes() {
-        List<String> embeddableNames = new ArrayList<String>();
-        List<String> typeNames = new ArrayList<String>();
-
-        Iterator it = ((DataChannelDescriptor) mediator.getProject().getRootNode())
-                .getDataMaps()
-                .iterator();
-        while (it.hasNext()) {
-            DataMap dataMap = (DataMap) it.next();
+        List<String> embeddableNames = new ArrayList<>();
+        List<String> typeNames = new ArrayList<>();
+
+        for (DataMap dataMap : ((DataChannelDescriptor) mediator.getProject().getRootNode()).getDataMaps()) {
             for (Embeddable emb : dataMap.getEmbeddables()) {
                 embeddableNames.add(emb.getClassName());
             }
@@ -205,15 +196,11 @@ public class ObjEntityAttributePanel extends JPanel implements ObjEntityDisplayL
         Collections.addAll(typeNames, registeredTypes);
         typeNames.addAll(embeddableNames);
 
-        TableColumn typeColumn = table.getColumnModel().getColumn(
-                ObjAttributeTableModel.OBJ_ATTRIBUTE_TYPE);
+        TableColumn typeColumn = table.getColumnModel().getColumn(ObjAttributeTableModel.OBJ_ATTRIBUTE_TYPE);
 
-        JComboBox javaTypesCombo = Application.getWidgetFactory().createComboBox(
-                typeNames.toArray(),
-                false);
+        JComboBox javaTypesCombo = Application.getWidgetFactory().createComboBox(typeNames.toArray(), false);
         AutoCompletion.enable(javaTypesCombo, false, true);
-        typeColumn.setCellEditor(Application.getWidgetFactory().createCellEditor(
-                javaTypesCombo));
+        typeColumn.setCellEditor(Application.getWidgetFactory().createCellEditor(javaTypesCombo));
     }
 
     /**
@@ -399,13 +386,7 @@ public class ObjEntityAttributePanel extends JPanel implements ObjEntityDisplayL
                 int row,
                 int column) {
 
-            super.getTableCellRendererComponent(
-                    table,
-                    value,
-                    isSelected,
-                    hasFocus,
-                    row,
-                    column);
+            super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
 
             ObjAttributeTableModel model = (ObjAttributeTableModel) table.getModel();
             column = table.getColumnModel().getColumn(column).getModelIndex();
@@ -415,8 +396,7 @@ public class ObjEntityAttributePanel extends JPanel implements ObjEntityDisplayL
                 if (!model.isCellEditable(row, column)) {
                     setForeground(Color.GRAY);
                 } else {
-                    setForeground(isSelected && !hasFocus ? table
-                            .getSelectionForeground() : table.getForeground());
+                    setForeground(isSelected && !hasFocus ? table.getSelectionForeground() : table.getForeground());
                 }
 
                 if (attribute.isInherited()) {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e1823c3e/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjEntityRelationshipPanel.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjEntityRelationshipPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjEntityRelationshipPanel.java
index 7a4c2af..d2ee56d 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjEntityRelationshipPanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjEntityRelationshipPanel.java
@@ -277,8 +277,8 @@ public class ObjEntityRelationshipPanel extends JPanel implements ObjEntityDispl
 
     public void objRelationshipRemoved(RelationshipEvent e) {
         ObjRelationshipTableModel model = (ObjRelationshipTableModel) table.getModel();
-        int ind = model.getObjectList().indexOf(e.getRelationship());
-        model.removeRow(e.getRelationship());
+        int ind = model.getObjectList().indexOf((ObjRelationship)e.getRelationship());
+        model.removeRow((ObjRelationship) e.getRelationship());
         table.select(ind);
     }
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e1823c3e/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjRelationshipTableModel.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjRelationshipTableModel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjRelationshipTableModel.java
index e05608d..db7668a 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjRelationshipTableModel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjRelationshipTableModel.java
@@ -34,7 +34,7 @@ import java.util.Comparator;
  * Table model to display ObjRelationships.
  * 
  */
-public class ObjRelationshipTableModel extends CayenneTableModel {
+public class ObjRelationshipTableModel extends CayenneTableModel<ObjRelationship> {
 
     // Columns
     public static final int REL_NAME = 0;
@@ -47,20 +47,14 @@ public class ObjRelationshipTableModel extends CayenneTableModel {
 
     private ObjEntity entity;
 
-    public ObjRelationshipTableModel(ObjEntity entity, ProjectController mediator,
-            Object eventSource) {
-        super(mediator, eventSource, new ArrayList(entity.getRelationships()));
+    public ObjRelationshipTableModel(ObjEntity entity, ProjectController mediator, Object eventSource) {
+        super(mediator, eventSource, new ArrayList<>(entity.getRelationships()));
         this.entity = entity;
 
         // order using local comparator
         Collections.sort(objectList, new RelationshipComparator());
     }
 
-    @Override
-    protected void orderList() {
-        // NOOP
-    }
-
     public ObjEntity getEntity() {
         return entity;
     }
@@ -110,8 +104,7 @@ public class ObjRelationshipTableModel extends CayenneTableModel {
     }
 
     public ObjRelationship getRelationship(int row) {
-        return (row >= 0 && row < objectList.size()) ? (ObjRelationship) objectList
-                .get(row) : null;
+        return (row >= 0 && row < objectList.size()) ?  objectList.get(row) : null;
     }
 
     public Object getValueAt(int row, int column) {
@@ -150,7 +143,7 @@ public class ObjRelationshipTableModel extends CayenneTableModel {
                         .toLowerCase();
             }
 
-            semantics.append(", " + collection);
+            semantics.append(", ").append(collection);
         }
         return semantics.toString();
     }
@@ -169,9 +162,7 @@ public class ObjRelationshipTableModel extends CayenneTableModel {
             ObjEntity target = (ObjEntity) value;
             relationship.setTargetEntityName(target);
 
-            /**
-             * Clear existing relationships, otherwise addDbRelationship() might fail
-             */
+            // Clear existing relationships, otherwise addDbRelationship() might fail
             relationship.clearDbRelationships();
 
             // now try to connect DbEntities if we can do it in one step
@@ -192,8 +183,7 @@ public class ObjRelationshipTableModel extends CayenneTableModel {
             relationship.setDeleteRule(DeleteRule.deleteRuleForName((String) value));
             fireTableCellUpdated(row, column);
         } else if (column == REL_LOCKING) {
-            relationship.setUsedForLocking((value instanceof Boolean)
-                    && ((Boolean) value).booleanValue());
+            relationship.setUsedForLocking((value instanceof Boolean) && (Boolean) value);
             fireTableCellUpdated(row, column);
         } else if (column == REL_TARGET_PATH) {
             relationship.setDbRelationshipPath((String) value);
@@ -223,20 +213,13 @@ public class ObjRelationshipTableModel extends CayenneTableModel {
 
     @Override
     public boolean isCellEditable(int row, int col) {
-        return !isInherited(row) && col != REL_SEMANTICS
-                && col != REL_TARGET;
+        return !isInherited(row) && col != REL_SEMANTICS && col != REL_TARGET;
     }
 
-    final class RelationshipComparator implements Comparator {
-
-        public int compare(Object o1, Object o2) {
-            ObjRelationship r1 = (ObjRelationship) o1;
-            ObjRelationship r2 = (ObjRelationship) o2;
-
-            int delta = getWeight(r1) - getWeight(r2);
-
-            return (delta != 0) ? delta : Util.nullSafeCompare(true, r1.getName(), r2
-                    .getName());
+    final class RelationshipComparator implements Comparator<ObjRelationship> {
+        public int compare(ObjRelationship o1, ObjRelationship o2) {
+            int delta = getWeight(o1) - getWeight(o2);
+            return (delta != 0) ? delta : Util.nullSafeCompare(true, o1.getName(), o2.getName());
         }
 
         private int getWeight(ObjRelationship r) {
@@ -278,18 +261,16 @@ public class ObjRelationshipTableModel extends CayenneTableModel {
 
         private int sortCol;
 
-        public ObjRelationshipTableComparator(int sortCol) {
+        ObjRelationshipTableComparator(int sortCol) {
             this.sortCol = sortCol;
         }
 
         public int compare(ObjRelationship o1, ObjRelationship o2) {
             if ((o1 == null && o2 == null) || o1 == o2) {
                 return 0;
-            }
-            else if (o1 == null && o2 != null) {
+            } else if (o1 == null) {
                 return -1;
-            }
-            else if (o1 != null && o2 == null) {
+            } else if (o2 == null) {
                 return 1;
             }
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e1823c3e/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CayenneTable.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CayenneTable.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CayenneTable.java
index bbbbfa0..b73026f 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CayenneTable.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CayenneTable.java
@@ -59,16 +59,14 @@ public class CayenneTable extends JTable {
 
     @Override
     public void setModel(TableModel dataModel) {
-
         super.setModel(dataModel);
+
         if (!(dataModel instanceof DefaultTableModel)) {
             TableColumnModel model = getColumnModel();
 
             for (int i = 0; i < getColumnCount(); i++) {
                 model.getColumn(i).setHeaderRenderer(renderer);
-
             }
-
         }
     }
 
@@ -77,9 +75,7 @@ public class CayenneTable extends JTable {
         super.createDefaultEditors();
 
         JTextField textField = new JTextField(20);
-        final DefaultCellEditor textEditor = Application
-                .getWidgetFactory()
-                .createCellEditor(textField);
+        final DefaultCellEditor textEditor = Application.getWidgetFactory().createCellEditor(textField);
         textEditor.setClickCountToStart(1);
 
         setDefaultEditor(Object.class, textEditor);
@@ -161,8 +157,7 @@ public class CayenneTable extends JTable {
     }
 
     /**
-     * ListSelectionModel for Cayenne table. Has a method to set multiple rows selection
-     * at once.
+     * ListSelectionModel for Cayenne table. Has a method to set multiple rows selection at once.
      */
     class CayenneListSelectionModel extends DefaultListSelectionModel {
 
@@ -173,9 +168,7 @@ public class CayenneTable extends JTable {
          * ListSelectionEvent
          */
         public void setSelection(int[] rows) {
-            /**
-             * First check if we must do anything at all
-             */
+            // First check if we must do anything at all
             boolean selectionChanged = false;
             for (int row : rows) {
                 if (!isRowSelected(row)) {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e1823c3e/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CayenneTableModel.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CayenneTableModel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CayenneTableModel.java
index 6ba39fb..01c4354 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CayenneTableModel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CayenneTableModel.java
@@ -41,7 +41,6 @@ import org.apache.commons.logging.LogFactory;
 
 /**
  * Superclass of CayenneModeler table model classes.
- * 
  */
 public abstract class CayenneTableModel<T> extends AbstractTableModel {
 
@@ -54,15 +53,11 @@ public abstract class CayenneTableModel<T> extends AbstractTableModel {
     /**
      * Constructor for CayenneTableModel.
      */
-    public CayenneTableModel(ProjectController mediator, Object eventSource,
-            java.util.List<T> objectList) {
-        
+    public CayenneTableModel(ProjectController mediator, Object eventSource, List<T> objectList) {
         super();
         this.eventSource = eventSource;
         this.mediator = mediator;
         this.objectList = objectList;
-
-        //orderList();
     }
 
     public void setValueAt(Object newVal, int row, int col) {
@@ -70,14 +65,12 @@ public abstract class CayenneTableModel<T> extends AbstractTableModel {
             
             Object oldValue = getValueAt(row, col);
             if (!Util.nullSafeEquals(newVal, oldValue)) {
-                
                 setUpdatedValueAt(newVal, row, col);
                 
                 this.mediator.getApplication().getUndoManager().addEdit(
                         new CayenneTableModelUndoableEdit(this, oldValue, newVal, row, col));
             }
-        }
-        catch (IllegalArgumentException e) {
+        } catch (IllegalArgumentException e) {
             logObj.error("Error setting table model value", e);
             JOptionPane.showMessageDialog(
                     Application.getFrame(),
@@ -94,32 +87,11 @@ public abstract class CayenneTableModel<T> extends AbstractTableModel {
     public abstract void setUpdatedValueAt(Object newVal, int row, int col);
 
     /**
-     * Orders internal object list. Key returned by <code>getOrderingKey</code> is used
-     * for comparison.
-     */
-    protected void orderList() {
-        String key = getOrderingKey();
-        if (key != null) {
-            Collections.sort(objectList, new PropertyComparator(
-                    getOrderingKey(),
-                    getElementsClass()));
-        }
-    }
-
-    /**
      * Returns Java class of the internal list elements.
      */
     public abstract Class<?> getElementsClass();
 
     /**
-     * Returns the key by which to order elements in the object list. Default value is
-     * "name".
-     */
-    public String getOrderingKey() {
-        return "name";
-    }
-
-    /**
      * Returns the number of objects on the list.
      */
     public int getRowCount() {
@@ -152,7 +124,7 @@ public abstract class CayenneTableModel<T> extends AbstractTableModel {
         fireTableDataChanged();
     }
 
-    public void removeRow(Object row) {
+    public void removeRow(T row) {
         objectList.remove(row);
         fireTableDataChanged();
     }
@@ -160,7 +132,7 @@ public abstract class CayenneTableModel<T> extends AbstractTableModel {
     /**
      * Moves a row up, jumping down if row is already at the top.
      */
-    public int moveRowUp(Object row) {
+    public int moveRowUp(T row) {
         int len = objectList.size();
         if (len < 2) {
             return -1;
@@ -183,7 +155,7 @@ public abstract class CayenneTableModel<T> extends AbstractTableModel {
     /**
      * Moves a row down, jumping up if row is already at the bottom.
      */
-    public int moveRowDown(Object row) {
+    public int moveRowDown(T row) {
         int len = objectList.size();
         if (len < 2) {
             return -1;
@@ -220,21 +192,19 @@ public abstract class CayenneTableModel<T> extends AbstractTableModel {
 		return true;
 	}
 
-    protected class PropertyComparator implements Comparator {
+    protected class PropertyComparator<C> implements Comparator<C> {
 
         Method getter;
 
         PropertyComparator(String propertyName, Class beanClass) {
             try {
                 getter = findGetter(beanClass, propertyName);
-            }
-            catch (IntrospectionException e) {
+            } catch (IntrospectionException e) {
                 throw new CayenneRuntimeException("Introspection error", e);
             }
         }
 
-        Method findGetter(Class beanClass, String propertyName)
-                throws IntrospectionException {
+        Method findGetter(Class beanClass, String propertyName) throws IntrospectionException {
             BeanInfo info = Introspector.getBeanInfo(beanClass);
             PropertyDescriptor[] descriptors = info.getPropertyDescriptors();
 
@@ -247,25 +217,22 @@ public abstract class CayenneTableModel<T> extends AbstractTableModel {
             throw new IntrospectionException("No getter found for " + propertyName);
         }
 
-        public int compare(Object o1, Object o2) {
+        @SuppressWarnings("unchecked")
+        public int compare(C o1, C o2) {
 
             if ((o1 == null && o2 == null) || o1 == o2) {
                 return 0;
-            }
-            else if (o1 == null && o2 != null) {
+            } else if (o1 == null) {
                 return -1;
-            }
-            else if (o1 != null && o2 == null) {
+            } else if (o2 == null) {
                 return 1;
             }
 
             try {
                 Comparable p1 = (Comparable) getter.invoke(o1);
                 Comparable p2 = (Comparable) getter.invoke(o2);
-                
                 return (p1 == null) ? -1 : (p2 == null)? 1 : p1.compareTo(p2);
-            }
-            catch (Exception ex) {
+            } catch (Exception ex) {
                 throw new CayenneRuntimeException("Error reading property.", ex);
             }
         }
@@ -276,9 +243,7 @@ public abstract class CayenneTableModel<T> extends AbstractTableModel {
     public abstract boolean isColumnSortable(int sortCol);
     
     public void sortByElementProperty(String string, boolean isAscent) {
-        Collections.sort(objectList, new PropertyComparator(
-                string,
-                getElementsClass()));
+        Collections.sort(objectList, new PropertyComparator<>(string, getElementsClass()));
         if(!isAscent){
             Collections.reverse(objectList);
         }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e1823c3e/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/DefaultWidgetFactory.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/DefaultWidgetFactory.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/DefaultWidgetFactory.java
index e4fea78..1fa56a7 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/DefaultWidgetFactory.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/DefaultWidgetFactory.java
@@ -97,8 +97,7 @@ public class DefaultWidgetFactory implements WidgetFactory {
      */
     public TableCellEditor createCellEditor(JComboBox<?> combo) {
         combo.setBorder(BorderFactory.createEmptyBorder(0,5,0,0));
-        if (Boolean.TRUE.equals(combo
-                .getClientProperty(AutoCompletion.AUTOCOMPLETION_PROPERTY))) {
+        if (Boolean.TRUE.equals(combo.getClientProperty(AutoCompletion.AUTOCOMPLETION_PROPERTY))) {
             return new ComboBoxCellEditor(combo);
         }
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e1823c3e/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/combo/AutoCompletion.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/combo/AutoCompletion.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/combo/AutoCompletion.java
index e5839da..30b85ad 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/combo/AutoCompletion.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/combo/AutoCompletion.java
@@ -55,14 +55,10 @@ public class AutoCompletion implements FocusListener, KeyListener, Runnable {
     protected AutoCompletion(final JComboBox comboBox, boolean strict, boolean allowsUserValues) {
         this.comboBox = comboBox;
         textEditor = ((JTextComponent)comboBox.getEditor().getEditorComponent());
-
         this.allowsUserValues = allowsUserValues;
-        
         suggestionList = new SuggestionList(comboBox, strict);
-        
-        /**
-         * Marking combobox as auto-completing
-         */
+
+        // Marking combobox as auto-completing
         comboBox.putClientProperty(AUTOCOMPLETION_PROPERTY, Boolean.TRUE);
     }
 
@@ -108,9 +104,7 @@ public class AutoCompletion implements FocusListener, KeyListener, Runnable {
     }
 
     public void keyReleased(KeyEvent e) {
-        if (e.getKeyCode() == KeyEvent.VK_BACK_SPACE ||
-                e.getKeyCode() == KeyEvent.VK_ENTER) {
-
+        if (e.getKeyCode() == KeyEvent.VK_BACK_SPACE || e.getKeyCode() == KeyEvent.VK_ENTER) {
             String text = textEditor.getText();
             if (comboBox.isShowing()) {
                 suggestionList.hide();
@@ -147,8 +141,7 @@ public class AutoCompletion implements FocusListener, KeyListener, Runnable {
 
         if (suggest) {
             processKeyPressedWhenSuggestionListIsVisible(e);
-        }
-        else {
+        } else {
             processKeyPressedWhenSuggestionListIsInvisible(e);
         }
 
@@ -156,7 +149,7 @@ public class AutoCompletion implements FocusListener, KeyListener, Runnable {
         suggestionListScrolling();
     }
 
-    private void   processKeyPressedWhenSuggestionListIsInvisible(KeyEvent e){
+    private void processKeyPressedWhenSuggestionListIsInvisible(KeyEvent e){
         int sel = comboBox.getSelectedIndex();
         int max = comboBox.getItemCount() - 1;
 
@@ -183,7 +176,6 @@ public class AutoCompletion implements FocusListener, KeyListener, Runnable {
                 next = max;
                 break;
             case KeyEvent.VK_ENTER:
-                return;
             case KeyEvent.VK_ESCAPE:
                 return;
             default:

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e1823c3e/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/combo/ComboBoxCellEditor.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/combo/ComboBoxCellEditor.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/combo/ComboBoxCellEditor.java
index 5ce8f38..2429ce0 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/combo/ComboBoxCellEditor.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/combo/ComboBoxCellEditor.java
@@ -22,8 +22,6 @@ package org.apache.cayenne.modeler.util.combo;
 import java.awt.Component;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
-import java.awt.event.FocusEvent;
-import java.awt.event.FocusListener;
 import java.awt.event.MouseEvent;
 import java.io.Serializable;
 import java.util.EventObject;
@@ -40,7 +38,7 @@ import javax.swing.table.TableCellEditor;
  *
  */
 public class ComboBoxCellEditor extends AbstractCellEditor 
-    implements ActionListener, TableCellEditor, FocusListener, Serializable {
+    implements ActionListener, TableCellEditor, Serializable {
     
     static final String IS_TABLE_CELL_EDITOR_PROPERTY = "JComboBox.isTableCellEditor";
     
@@ -57,7 +55,7 @@ public class ComboBoxCellEditor extends AbstractCellEditor
         //  otherwise the value may get lost (e.g. see CAY-1104)
         //  LATER: this turned out to be the wrong fix, so I commented 
         //  out the code in focusLost to fix CAY-1719 and fixed CAY-1104 differently.
-        this.comboBox.getEditor().getEditorComponent().addFocusListener(this);
+        // this.comboBox.getEditor().getEditorComponent().addFocusListener(this);
 
         // remove the editor's border - the cell itself already has one
         ((JComponent) comboBox.getEditor().getEditorComponent()).setBorder(null);
@@ -109,13 +107,4 @@ public class ComboBoxCellEditor extends AbstractCellEditor
         
         return true;
     }
-
-    public void focusGained(FocusEvent e) {
-    }
-
-    public void focusLost(FocusEvent e) {
-        if (e.getOppositeComponent() != null) {
-            //stopCellEditing(); // Commented out to fix CAY-1719
-        }
-    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e1823c3e/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/combo/CustomTypeComboBoxEditor.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/combo/CustomTypeComboBoxEditor.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/combo/CustomTypeComboBoxEditor.java
index 74369e6..7fb36b6 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/combo/CustomTypeComboBoxEditor.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/combo/CustomTypeComboBoxEditor.java
@@ -84,8 +84,7 @@ public class CustomTypeComboBoxEditor extends BasicComboBoxEditor {
             // original type.
             if (newValue.equals(localOldValue.toString())) {
                 return localOldValue;
-            }
-            else {
+            } else {
                 // Must take the value from the editor and get the value and cast it to the new type.
                 Class cls = localOldValue.getClass();
                 try {
@@ -121,22 +120,21 @@ public class CustomTypeComboBoxEditor extends BasicComboBoxEditor {
      * 
      * @return value of classTo type, or null if conversion is impossible
      */
-    protected Object convert(String value, Class classTo) {
+    protected Object convert(String value, Class<?> classTo) {
         if (classTo == String.class) {
             return value;
         }
         
-        /**
+        /*
          * We still try to it in BasicComboBox's way, so that primary object
          * types (such as numbers) would still be supported 
          */
         try {
-            Method method = classTo.getMethod("valueOf", new Class[]{String.class});
+            Method method = classTo.getMethod("valueOf", String.class);
             return method.invoke(null, value);
-        }
-        catch (Exception ignored) {}
+        } catch (Exception ignored) {}
         
-        /**
+        /*
          * We could manually convert strings to dbentities, attrs and other, but
          * in this implementation we use reverse operation instead, and convert 
          * combobox model's items to String.

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e1823c3e/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/combo/EditorTextField.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/combo/EditorTextField.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/combo/EditorTextField.java
index 88e4ce9..1d1d978 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/combo/EditorTextField.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/combo/EditorTextField.java
@@ -22,13 +22,19 @@ import java.awt.Color;
 import java.awt.Component;
 import java.awt.Graphics;
 import java.awt.Insets;
+import java.awt.event.ActionEvent;
 import java.awt.event.FocusEvent;
 import java.awt.event.FocusListener;
 
+import javax.swing.AbstractAction;
 import javax.swing.CellRendererPane;
+import javax.swing.InputMap;
 import javax.swing.JComboBox;
+import javax.swing.JComponent;
 import javax.swing.JList;
+import javax.swing.JTable;
 import javax.swing.JTextField;
+import javax.swing.KeyStroke;
 import javax.swing.ListCellRenderer;
 
 /**
@@ -63,6 +69,36 @@ public class EditorTextField extends JTextField implements FocusListener {
         rendererPane = new CellRendererPane();
 
         addFocusListener(this);
+        // hook up to TAB handler to keep entered value after TAB is pressed
+        initTabHandler();
+    }
+
+    private void initTabHandler() {
+        this.combo.setFocusTraversalKeysEnabled(false);
+        this.combo.getActionMap().put("tab-action", new AbstractAction() {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                combo.setSelectedItem(getText());
+                Component component = getParent().getParent();
+                if(component instanceof JTable) {
+                    JTable table = (JTable)component;
+                    if((e.getModifiers() & ActionEvent.SHIFT_MASK) > 0) {
+                        table.changeSelection(table.getEditingRow(), table.getEditingColumn()-1, false, false);
+                    } else {
+                        table.changeSelection(table.getEditingRow(), table.getEditingColumn()+1, false, false);
+                    }
+                } else {
+                    if((e.getModifiers() & ActionEvent.SHIFT_MASK) > 0) {
+                        transferFocusBackward();
+                    } else {
+                        transferFocus();
+                    }
+                }
+            }
+        });
+        InputMap inputMap = this.combo.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
+        inputMap.put(KeyStroke.getKeyStroke("TAB"), "tab-action");
+        inputMap.put(KeyStroke.getKeyStroke("shift TAB"), "tab-action");
     }
 
     @Override
@@ -73,8 +109,8 @@ public class EditorTextField extends JTextField implements FocusListener {
             list.setEnabled(combo.isEnabled());
 
             ListCellRenderer renderer = combo.getRenderer();
-            Component c = renderer.getListCellRendererComponent(list, combo
-                    .getSelectedItem(), -1, false, false);
+            Component c = renderer.getListCellRendererComponent(list, combo.getSelectedItem(),
+                    -1, false, false);
             
             //fill background first
             Color oldColor = g.getColor();
@@ -90,7 +126,6 @@ public class EditorTextField extends JTextField implements FocusListener {
 
     public void focusGained(FocusEvent e) {
         hasFocus = true;
-
         combo.repaint();
     }
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e1823c3e/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/combo/SuggestionList.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/combo/SuggestionList.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/combo/SuggestionList.java
index 9d4e6ba..b384759 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/combo/SuggestionList.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/combo/SuggestionList.java
@@ -85,8 +85,7 @@ public class SuggestionList extends BasicComboPopup {
     protected boolean matches(String item, String pattern) {
         if (strict) {
             return item.toLowerCase().startsWith(pattern.toLowerCase());
-        }
-        else {
+        } else {
             return item.toLowerCase().contains(pattern.toLowerCase());
         }
     }
@@ -99,9 +98,7 @@ public class SuggestionList extends BasicComboPopup {
      */
     @Override
     protected int getPopupHeightForRowCount(int maxRowCount) {
-        int h = super.getPopupHeightForRowCount(Math.min(maxRowCount, list.getModel().getSize()));
-
-        return h;
+        return super.getPopupHeightForRowCount(Math.min(maxRowCount, list.getModel().getSize()));
     }
 
     /**