You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by sk...@apache.org on 2015/12/16 13:57:04 UTC

[1/4] cayenne git commit: fix problems: path select autocompletion, autocompletion scroll, make indent in table cells, header renderer. refactor some code

Repository: cayenne
Updated Branches:
  refs/heads/master 9baef19b7 -> 1448a194c


fix problems: path select autocompletion,autocompletion scroll, make indent in table cells, header renderer. refactor some code


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

Branch: refs/heads/master
Commit: 7e8e07c71d5e1fb15d150a08042048f9ee753ab3
Parents: 9baef19
Author: AlexandrShestak <sh...@mail.ru>
Authored: Wed Dec 9 13:30:35 2015 +0300
Committer: AlexandrShestak <sh...@mail.ru>
Committed: Wed Dec 9 13:30:35 2015 +0300

----------------------------------------------------------------------
 .../modeler/editor/ObjAttributeTableModel.java  |   3 +-
 .../modeler/editor/ObjEntityAttributePanel.java |  35 ++-----
 .../editor/ObjEntityRelationshipPanel.java      |  45 ++++----
 .../editor/dbentity/DbEntityAttributePanel.java |   2 +
 .../dbentity/DbEntityRelationshipPanel.java     |   2 +
 .../modeler/util/BoardTableCellRenderer.java    |  34 ++++++
 .../util/CollectionTypeComboBoxEditor.java      |  90 ++++++++++++++++
 .../util/CollectionTypeComboBoxRenderer.java    |  53 ++++++++++
 .../util/DbAttributePathComboBoxRenderer.java   |  48 +++++++++
 .../util/DbRelationshipPathComboBoxEditor.java  |   1 +
 .../modeler/util/DefaultWidgetFactory.java      |  22 ++--
 .../JTableCollectionTypeComboBoxEditor.java     |  84 ---------------
 .../JTableCollectionTypeComboBoxRenderer.java   |  55 ----------
 .../util/JTableMapKeyComboBoxEditor.java        |  99 ------------------
 .../util/JTableMapKeyComboBoxRenderer.java      |  58 -----------
 .../modeler/util/MapKeyComboBoxEditor.java      | 104 +++++++++++++++++++
 .../modeler/util/MapKeyComboBoxRenderer.java    |  57 ++++++++++
 .../util/PathChooserComboBoxCellEditor.java     |   6 +-
 .../modeler/util/SortButtonRenderer.java        |  95 ++++++-----------
 .../modeler/util/combo/AutoCompletion.java      |   4 +-
 20 files changed, 476 insertions(+), 421 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/7e8e07c7/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 8ea39c1..16db808 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
@@ -64,6 +64,7 @@ public class ObjAttributeTableModel extends CayenneTableModel<ObjAttributeWrappe
     public static final int DB_ATTRIBUTE = 3;
     public static final int DB_ATTRIBUTE_TYPE = 4;
     public static final int LOCKING = 5;
+    public static final int COLUMN_COUNT = 6;
 
     private ObjEntity entity;
     private DbEntity dbEntity;
@@ -145,7 +146,7 @@ public class ObjAttributeTableModel extends CayenneTableModel<ObjAttributeWrappe
     }
 
     public int getColumnCount() {
-        return 6;
+        return COLUMN_COUNT;
     }
 
     public String getColumnName(int column) {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7e8e07c7/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 46c4215..6dc7290 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
@@ -20,7 +20,6 @@ package org.apache.cayenne.modeler.editor;
 
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.Embeddable;
 import org.apache.cayenne.map.ObjAttribute;
 import org.apache.cayenne.map.ObjEntity;
@@ -45,16 +44,17 @@ import org.apache.cayenne.modeler.event.TablePopupHandler;
 import org.apache.cayenne.modeler.pref.TableColumnPreferences;
 import org.apache.cayenne.modeler.util.CayenneTable;
 import org.apache.cayenne.modeler.util.CayenneTableModel;
+import org.apache.cayenne.modeler.util.DbAttributePathComboBoxRenderer;
 import org.apache.cayenne.modeler.util.DbAttributePathComboBoxEditor;
 import org.apache.cayenne.modeler.util.ModelerUtil;
 import org.apache.cayenne.modeler.util.PanelFactory;
 import org.apache.cayenne.modeler.util.UIUtil;
 import org.apache.cayenne.modeler.util.combo.AutoCompletion;
 
+import javax.swing.BorderFactory;
 import javax.swing.Icon;
 import javax.swing.ImageIcon;
 import javax.swing.JComboBox;
-import javax.swing.JLabel;
 import javax.swing.JMenuItem;
 import javax.swing.JPanel;
 import javax.swing.JPopupMenu;
@@ -84,6 +84,8 @@ import java.util.Map;
 public class ObjEntityAttributePanel extends JPanel implements ObjEntityDisplayListener,
         ObjEntityListener, ObjAttributeListener, ProjectOnSaveListener {
 
+    private static final int INHERITANCE_COLUMN_WIDTH = 35;
+
     private ProjectController mediator;
     private CayenneTable table;
     private TableColumnPreferences tablePreferences;
@@ -334,17 +336,15 @@ public class ObjEntityAttributePanel extends JPanel implements ObjEntityDisplayL
     }
 
     protected void setUpTableStructure() {
-        int inheritanceColumnWidth = 30;
-
         Map<Integer, Integer> minSizes = new HashMap<Integer, Integer>();
         Map<Integer, Integer> maxSizes = new HashMap<Integer, Integer>();
 
-        minSizes.put(ObjAttributeTableModel.INHERITED, inheritanceColumnWidth);
-        maxSizes.put(ObjAttributeTableModel.INHERITED, inheritanceColumnWidth);
+        minSizes.put(ObjAttributeTableModel.INHERITED, INHERITANCE_COLUMN_WIDTH);
+        maxSizes.put(ObjAttributeTableModel.INHERITED, INHERITANCE_COLUMN_WIDTH);
 
         initComboBoxes();
 
-        table.getColumnModel().getColumn(3).setCellRenderer(new JTableDbAttributeComboBoxRenderer());
+        table.getColumnModel().getColumn(3).setCellRenderer(new DbAttributePathComboBoxRenderer());
         table.getColumnModel().getColumn(3).setCellEditor(new DbAttributePathComboBoxEditor());
 
         tablePreferences.bind(
@@ -432,6 +432,7 @@ public class ObjEntityAttributePanel extends JPanel implements ObjEntityDisplayL
                 }
                 setText("");
             }
+            setBorder(BorderFactory.createEmptyBorder(0,5,0,0));
 
             return this;
         }
@@ -505,24 +506,4 @@ public class ObjEntityAttributePanel extends JPanel implements ObjEntityDisplayL
     }
 
 
-    private static final class JTableDbAttributeComboBoxRenderer extends DefaultTableCellRenderer {
-
-        public JTableDbAttributeComboBoxRenderer() {
-        }
-
-        @Override
-        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
-                                                       boolean hasFocus, int row, int column) {
-            JLabel jLabel = new JLabel("");
-            jLabel.setFont(new Font("Verdana", Font.PLAIN , 12));
-
-            if (value instanceof DbAttribute) {
-                jLabel.setText(ModelerUtil.getObjectName(value));
-            } else if (value != null) {
-                jLabel.setText(value.toString());
-            }
-
-            return jLabel;
-        }
-    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7e8e07c7/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 f417989..fd08bde 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
@@ -41,34 +41,24 @@ import org.apache.cayenne.modeler.pref.TableColumnPreferences;
 import org.apache.cayenne.modeler.util.CayenneTable;
 import org.apache.cayenne.modeler.util.CellRenderers;
 import org.apache.cayenne.modeler.util.DbRelationshipPathComboBoxEditor;
-import org.apache.cayenne.modeler.util.JTableCollectionTypeComboBoxEditor;
-import org.apache.cayenne.modeler.util.JTableCollectionTypeComboBoxRenderer;
-import org.apache.cayenne.modeler.util.JTableMapKeyComboBoxEditor;
-import org.apache.cayenne.modeler.util.JTableMapKeyComboBoxRenderer;
+import org.apache.cayenne.modeler.util.CollectionTypeComboBoxEditor;
+import org.apache.cayenne.modeler.util.CollectionTypeComboBoxRenderer;
+import org.apache.cayenne.modeler.util.MapKeyComboBoxEditor;
+import org.apache.cayenne.modeler.util.MapKeyComboBoxRenderer;
 import org.apache.cayenne.modeler.util.ModelerUtil;
 import org.apache.cayenne.modeler.util.PanelFactory;
 import org.apache.cayenne.modeler.util.UIUtil;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
-import javax.swing.DefaultCellEditor;
-import javax.swing.Icon;
-import javax.swing.JComboBox;
-import javax.swing.JLabel;
-import javax.swing.JMenuItem;
-import javax.swing.JPanel;
-import javax.swing.JPopupMenu;
-import javax.swing.JTable;
-import javax.swing.ListSelectionModel;
+import javax.swing.*;
 import javax.swing.event.ListSelectionEvent;
 import javax.swing.event.ListSelectionListener;
 import javax.swing.event.TableModelEvent;
 import javax.swing.event.TableModelListener;
 import javax.swing.table.DefaultTableCellRenderer;
 import javax.swing.table.TableColumn;
-import java.awt.BorderLayout;
-import java.awt.Color;
-import java.awt.Component;
+import java.awt.*;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.util.Collection;
@@ -326,25 +316,37 @@ public class ObjEntityRelationshipPanel extends JPanel implements ObjEntityDispl
 
         TableColumn col = table.getColumnModel().getColumn(ObjRelationshipTableModel.REL_TARGET_PATH);
         col.setCellEditor(new DbRelationshipPathComboBoxEditor());
+        col.setCellRenderer(new DefaultTableCellRenderer(){
+            @Override
+            public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
+                super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
+                setBorder(BorderFactory.createEmptyBorder(0,5,0,0));
+                setToolTipText("To choose relationship press enter two times. \n To choose next relationship press dot.");
+                return this;
+            }
+        });
 
         col = table.getColumnModel().getColumn(ObjRelationshipTableModel.REL_DELETE_RULE);
         JComboBox deleteRulesCombo = Application.getWidgetFactory().createComboBox(
                 DELETE_RULES,
                 false);
-        deleteRulesCombo.setEditable(false);
+        deleteRulesCombo.setFocusable(false);
+        deleteRulesCombo.setEditable(true);
+        ((JComponent) deleteRulesCombo.getEditor().getEditorComponent()).setBorder(null);
+        deleteRulesCombo.setBorder(BorderFactory.createEmptyBorder(0,5,0,0));
         deleteRulesCombo.setSelectedIndex(0); // Default to the first value
         col.setCellEditor(Application.getWidgetFactory().createCellEditor(
                 deleteRulesCombo));
 
         col = table.getColumnModel().getColumn(ObjRelationshipTableModel.REL_COLLECTION_TYPE);
 
-        col.setCellEditor(new JTableCollectionTypeComboBoxEditor());
-        col.setCellRenderer(new JTableCollectionTypeComboBoxRenderer());
+        col.setCellEditor(new CollectionTypeComboBoxEditor());
+        col.setCellRenderer(new CollectionTypeComboBoxRenderer());
 
         col = table.getColumnModel().getColumn(ObjRelationshipTableModel.REL_MAP_KEY);
 
-        col.setCellEditor(new JTableMapKeyComboBoxEditor());
-        col.setCellRenderer(new JTableMapKeyComboBoxRenderer());
+        col.setCellEditor(new MapKeyComboBoxEditor());
+        col.setCellRenderer(new MapKeyComboBoxRenderer());
 
         tablePreferences.bind(
                 table,
@@ -419,6 +421,7 @@ public class ObjEntityRelationshipPanel extends JPanel implements ObjEntityDispl
                         ? table.getSelectionForeground()
                         : table.getForeground());
             }
+            setBorder(BorderFactory.createEmptyBorder(0,5,0,0));
 
             return this;
         }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7e8e07c7/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/dbentity/DbEntityAttributePanel.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/dbentity/DbEntityAttributePanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/dbentity/DbEntityAttributePanel.java
index 7bb4f44..e84b6bf 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/dbentity/DbEntityAttributePanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/dbentity/DbEntityAttributePanel.java
@@ -34,6 +34,7 @@ import org.apache.cayenne.modeler.event.DbEntityDisplayListener;
 import org.apache.cayenne.modeler.event.EntityDisplayEvent;
 import org.apache.cayenne.modeler.event.TablePopupHandler;
 import org.apache.cayenne.modeler.pref.TableColumnPreferences;
+import org.apache.cayenne.modeler.util.BoardTableCellRenderer;
 import org.apache.cayenne.modeler.util.CayenneTable;
 import org.apache.cayenne.modeler.util.PanelFactory;
 import org.apache.cayenne.modeler.util.UIUtil;
@@ -81,6 +82,7 @@ public class DbEntityAttributePanel extends JPanel implements DbEntityDisplayLis
         tablePreferences = new TableColumnPreferences(
                 DbAttributeTableModel.class,
                 "attributeTable");
+        table.setDefaultRenderer(String.class, new BoardTableCellRenderer());
 
         /**
          * Create and install a popup

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7e8e07c7/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/dbentity/DbEntityRelationshipPanel.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/dbentity/DbEntityRelationshipPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/dbentity/DbEntityRelationshipPanel.java
index 046ddad..bae752d 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/dbentity/DbEntityRelationshipPanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/dbentity/DbEntityRelationshipPanel.java
@@ -38,6 +38,7 @@ import org.apache.cayenne.modeler.event.DbEntityDisplayListener;
 import org.apache.cayenne.modeler.event.EntityDisplayEvent;
 import org.apache.cayenne.modeler.event.TablePopupHandler;
 import org.apache.cayenne.modeler.pref.TableColumnPreferences;
+import org.apache.cayenne.modeler.util.BoardTableCellRenderer;
 import org.apache.cayenne.modeler.util.CayenneTable;
 import org.apache.cayenne.modeler.util.CellRenderers;
 import org.apache.cayenne.modeler.util.ModelerUtil;
@@ -103,6 +104,7 @@ public class DbEntityRelationshipPanel extends JPanel implements DbEntityDisplay
         table = new CayenneTable();
         table.setDefaultRenderer(DbEntity.class, CellRenderers
                 .entityTableRendererWithIcons(mediator));
+        table.setDefaultRenderer(String.class, new BoardTableCellRenderer());
         tablePreferences = new TableColumnPreferences(
                 DbRelationshipTableModel.class,
                 "relationshipTable");

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7e8e07c7/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/BoardTableCellRenderer.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/BoardTableCellRenderer.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/BoardTableCellRenderer.java
new file mode 100644
index 0000000..231f089
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/BoardTableCellRenderer.java
@@ -0,0 +1,34 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+
+package org.apache.cayenne.modeler.util;
+
+import javax.swing.BorderFactory;
+import javax.swing.JTable;
+import javax.swing.table.DefaultTableCellRenderer;
+import java.awt.Component;
+
+public class BoardTableCellRenderer extends DefaultTableCellRenderer {
+
+    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col) {
+        super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col);
+        setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 0));
+        return this;
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7e8e07c7/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CollectionTypeComboBoxEditor.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CollectionTypeComboBoxEditor.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CollectionTypeComboBoxEditor.java
new file mode 100644
index 0000000..1ea13ed
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CollectionTypeComboBoxEditor.java
@@ -0,0 +1,90 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+
+package org.apache.cayenne.modeler.util;
+
+import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.editor.ObjRelationshipTableModel;
+
+import javax.swing.AbstractCellEditor;
+import javax.swing.BorderFactory;
+import javax.swing.JComboBox;
+import javax.swing.JComponent;
+import javax.swing.JLabel;
+import javax.swing.JTable;
+import javax.swing.table.TableCellEditor;
+import java.awt.Component;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+public class CollectionTypeComboBoxEditor extends AbstractCellEditor implements TableCellEditor {
+
+    private static final String COLLECTION_TYPE_MAP = "java.util.Map";
+    private static final String COLLECTION_TYPE_SET = "java.util.Set";
+    private static final String COLLECTION_TYPE_COLLECTION = "java.util.Collection";
+    private static final String DEFAULT_COLLECTION_TYPE = "java.util.List";
+    private static final int REL_COLLECTION_TYPE_COLUMN = 3;
+
+    private ObjRelationshipTableModel model;
+    private int row;
+
+    @Override
+    public Component getTableCellEditorComponent(final JTable table, Object value, boolean isSelected, final int row, final int column) {
+
+        this.model = (ObjRelationshipTableModel) table.getModel();
+        this.row = row;
+
+        final JComboBox collectionTypeCombo = Application.getWidgetFactory().createComboBox(
+                new Object[]{
+                        COLLECTION_TYPE_MAP,
+                        COLLECTION_TYPE_SET,
+                        COLLECTION_TYPE_COLLECTION,
+                        DEFAULT_COLLECTION_TYPE
+                },
+                false);
+        if (model.getRelationship(row).isToMany()) {
+            collectionTypeCombo.setEnabled(true);
+            collectionTypeCombo.setSelectedItem(model.getRelationship(row).getCollectionType());
+        } else {
+            JLabel labelIfToOneRelationship = new JLabel();
+            labelIfToOneRelationship.setEnabled(false);
+            return labelIfToOneRelationship;
+        }
+        collectionTypeCombo.addActionListener(new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                Object selected = collectionTypeCombo.getSelectedItem();
+                model.setUpdatedValueAt(selected, row, REL_COLLECTION_TYPE_COLUMN);
+                table.repaint();
+            }
+        });
+
+        collectionTypeCombo.setFocusable(false);
+        collectionTypeCombo.setEditable(true);
+        ((JComponent) collectionTypeCombo.getEditor().getEditorComponent()).setBorder(null);
+        collectionTypeCombo.setBorder(BorderFactory.createEmptyBorder(0,5,0,0));
+
+        return collectionTypeCombo;
+    }
+
+    @Override
+    public Object getCellEditorValue() {
+        return model.getValueAt(row, REL_COLLECTION_TYPE_COLUMN);
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7e8e07c7/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CollectionTypeComboBoxRenderer.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CollectionTypeComboBoxRenderer.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CollectionTypeComboBoxRenderer.java
new file mode 100644
index 0000000..d1a69b0
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CollectionTypeComboBoxRenderer.java
@@ -0,0 +1,53 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+
+package org.apache.cayenne.modeler.util;
+
+import org.apache.cayenne.modeler.editor.ObjRelationshipTableModel;
+
+import javax.swing.BorderFactory;
+import javax.swing.JTable;
+import javax.swing.table.DefaultTableCellRenderer;
+import java.awt.Component;
+import java.awt.Font;
+
+public class CollectionTypeComboBoxRenderer extends DefaultTableCellRenderer {
+
+    @Override
+    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
+        super.getTableCellRendererComponent(table, value, isSelected,  hasFocus,  row, column);
+
+        setBorder(BorderFactory.createEmptyBorder(0,5,0,0));
+        if (value == null) {
+            setEnabled(false);
+            return this;
+        }
+        if (((ObjRelationshipTableModel) table.getModel()).getRelationship(row).isToMany()) {
+            setFocusable(false);
+            setEnabled(true);
+            setText((String) value);
+            setFont(new Font("Verdana", Font.PLAIN, 12));
+            return this;
+        } else {
+            setEnabled(false);
+            return this;
+        }
+    }
+}
+

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7e8e07c7/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/DbAttributePathComboBoxRenderer.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/DbAttributePathComboBoxRenderer.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/DbAttributePathComboBoxRenderer.java
new file mode 100644
index 0000000..282adff
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/DbAttributePathComboBoxRenderer.java
@@ -0,0 +1,48 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+
+package org.apache.cayenne.modeler.util;
+
+import org.apache.cayenne.map.DbAttribute;
+
+import javax.swing.BorderFactory;
+import javax.swing.JTable;
+import javax.swing.table.DefaultTableCellRenderer;
+import java.awt.Component;
+import java.awt.Font;
+
+public class DbAttributePathComboBoxRenderer extends DefaultTableCellRenderer {
+
+    @Override
+    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
+                                                   boolean hasFocus, int row, int column) {
+        super.getTableCellRendererComponent(table, value, isSelected,  hasFocus,  row, column);
+
+        setText("");
+        setFont(new Font("Verdana", Font.PLAIN , 12));
+
+        if (value instanceof DbAttribute) {
+           setText(ModelerUtil.getObjectName(value));
+        } else if (value != null) {
+            setText(value.toString());
+        }
+        setBorder(BorderFactory.createEmptyBorder(0,5,0,0));
+        return this;
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7e8e07c7/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/DbRelationshipPathComboBoxEditor.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/DbRelationshipPathComboBoxEditor.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/DbRelationshipPathComboBoxEditor.java
index 9aac322..829f874 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/DbRelationshipPathComboBoxEditor.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/DbRelationshipPathComboBoxEditor.java
@@ -70,6 +70,7 @@ public class DbRelationshipPathComboBoxEditor extends PathChooserComboBoxCellEdi
 
         enterPressedCount = 0;
         comboBoxPathChooser.addActionListener(this);
+        comboBoxPathChooser.setToolTipText("To choose relationship press enter two times. \n To choose next relationship press dot.");
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7e8e07c7/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 c0596c7..da6463f 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
@@ -18,22 +18,22 @@
  ****************************************************************/
 package org.apache.cayenne.modeler.util;
 
-import java.awt.Color;
-import java.awt.Font;
-import java.util.Arrays;
-import java.util.Collection;
+import org.apache.cayenne.modeler.ModelerPreferences;
+import org.apache.cayenne.modeler.undo.JComboBoxUndoListener;
+import org.apache.cayenne.modeler.util.combo.AutoCompletion;
+import org.apache.cayenne.modeler.util.combo.ComboBoxCellEditor;
+import org.syntax.jedit.JEditTextArea;
 
+import javax.swing.BorderFactory;
 import javax.swing.DefaultCellEditor;
 import javax.swing.DefaultComboBoxModel;
 import javax.swing.JComboBox;
 import javax.swing.JTextField;
 import javax.swing.table.TableCellEditor;
-
-import org.apache.cayenne.modeler.ModelerPreferences;
-import org.apache.cayenne.modeler.undo.JComboBoxUndoListener;
-import org.apache.cayenne.modeler.util.combo.AutoCompletion;
-import org.apache.cayenne.modeler.util.combo.ComboBoxCellEditor;
-import org.syntax.jedit.JEditTextArea;
+import java.awt.Color;
+import java.awt.Font;
+import java.util.Arrays;
+import java.util.Collection;
 
 public class DefaultWidgetFactory implements WidgetFactory {
 
@@ -85,6 +85,7 @@ public class DefaultWidgetFactory implements WidgetFactory {
      * Creates cell editor for text field
      */
     public DefaultCellEditor createCellEditor(JTextField textField) {
+        textField.setBorder(BorderFactory.createEmptyBorder(0,5,0,0));
         return new CayenneCellEditor(textField);
     }
 
@@ -95,6 +96,7 @@ public class DefaultWidgetFactory implements WidgetFactory {
      * @param combo JComboBox to be used as editor component
      */
     public TableCellEditor createCellEditor(JComboBox combo) {
+        combo.setBorder(BorderFactory.createEmptyBorder(0,5,0,0));
         if (Boolean.TRUE.equals(combo
                 .getClientProperty(AutoCompletion.AUTOCOMPLETION_PROPERTY))) {
             return new ComboBoxCellEditor(combo);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7e8e07c7/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/JTableCollectionTypeComboBoxEditor.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/JTableCollectionTypeComboBoxEditor.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/JTableCollectionTypeComboBoxEditor.java
deleted file mode 100644
index f43b095..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/JTableCollectionTypeComboBoxEditor.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.modeler.util;
-
-import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.editor.ObjRelationshipTableModel;
-
-import javax.swing.AbstractCellEditor;
-import javax.swing.JComboBox;
-import javax.swing.JLabel;
-import javax.swing.JTable;
-import javax.swing.table.TableCellEditor;
-import java.awt.Component;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-
-public class JTableCollectionTypeComboBoxEditor extends AbstractCellEditor implements TableCellEditor {
-
-        private static final String COLLECTION_TYPE_MAP = "java.util.Map";
-        private static final String COLLECTION_TYPE_SET = "java.util.Set";
-        private static final String COLLECTION_TYPE_COLLECTION = "java.util.Collection";
-        private static final String DEFAULT_COLLECTION_TYPE = "java.util.List";
-        private static final int REL_COLLECTION_TYPE_COLUMN = 3;
-
-        private ObjRelationshipTableModel model;
-        private int row;
-
-        public JTableCollectionTypeComboBoxEditor() {
-        }
-
-        @Override
-        public Component getTableCellEditorComponent(final JTable table, Object value, boolean isSelected, final int row, final int column) {
-            this.model = (ObjRelationshipTableModel) table.getModel();
-            this.row = row;
-
-            final JComboBox collectionTypeCombo = Application.getWidgetFactory().createComboBox(
-                    new Object[]{
-                            COLLECTION_TYPE_MAP,
-                            COLLECTION_TYPE_SET,
-                            COLLECTION_TYPE_COLLECTION,
-                            DEFAULT_COLLECTION_TYPE
-                    },
-                    false);
-            if (model.getRelationship(row).isToMany()) {
-                collectionTypeCombo.setEnabled(true);
-                collectionTypeCombo.setSelectedItem(model.getRelationship(row).getCollectionType());
-            } else {
-                JLabel labelIfToOneRelationship = new JLabel();
-                labelIfToOneRelationship.setEnabled(false);
-                return labelIfToOneRelationship;
-            }
-            collectionTypeCombo.addActionListener(new ActionListener() {
-                @Override
-                public void actionPerformed(ActionEvent e) {
-                    Object selected = collectionTypeCombo.getSelectedItem();
-                    model.setUpdatedValueAt(selected, row, REL_COLLECTION_TYPE_COLUMN);
-                    table.repaint();
-                }
-            });
-            return collectionTypeCombo;
-        }
-
-        @Override
-        public Object getCellEditorValue() {
-            return model.getValueAt(row, REL_COLLECTION_TYPE_COLUMN);
-        }
-    }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7e8e07c7/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/JTableCollectionTypeComboBoxRenderer.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/JTableCollectionTypeComboBoxRenderer.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/JTableCollectionTypeComboBoxRenderer.java
deleted file mode 100644
index 8c5d497..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/JTableCollectionTypeComboBoxRenderer.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.modeler.util;
-
-import org.apache.cayenne.modeler.editor.ObjRelationshipTableModel;
-
-import javax.swing.JLabel;
-import javax.swing.JTable;
-import javax.swing.table.TableCellRenderer;
-import java.awt.Component;
-import java.awt.Font;
-
-public class JTableCollectionTypeComboBoxRenderer implements TableCellRenderer {
-
-        private ObjRelationshipTableModel model;
-
-        public JTableCollectionTypeComboBoxRenderer() {
-        }
-
-        @Override
-        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
-            this.model = (ObjRelationshipTableModel) table.getModel();
-            JLabel labelIfToOneRelationship = new JLabel();
-            labelIfToOneRelationship.setEnabled(false);
-            JLabel labelIfToManyRelationship = new JLabel((String) value);
-            labelIfToManyRelationship.setEnabled(true);
-            labelIfToManyRelationship.setFont(new Font("Verdana", Font.PLAIN, 12));
-            if (value == null) {
-                return labelIfToOneRelationship;
-            }
-            if (model.getRelationship(row).isToMany()) {
-                return labelIfToManyRelationship;
-            } else {
-                return labelIfToOneRelationship;
-            }
-
-        }
-    }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7e8e07c7/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/JTableMapKeyComboBoxEditor.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/JTableMapKeyComboBoxEditor.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/JTableMapKeyComboBoxEditor.java
deleted file mode 100644
index 3e1178a..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/JTableMapKeyComboBoxEditor.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.modeler.util;
-
-import org.apache.cayenne.map.ObjAttribute;
-import org.apache.cayenne.map.ObjEntity;
-import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.editor.ObjRelationshipTableModel;
-
-import javax.swing.AbstractCellEditor;
-import javax.swing.JComboBox;
-import javax.swing.JTable;
-import javax.swing.table.TableCellEditor;
-import java.awt.Component;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.util.ArrayList;
-import java.util.List;
-
-public class JTableMapKeyComboBoxEditor extends AbstractCellEditor implements TableCellEditor {
-
-        private static final String DEFAULT_MAP_KEY = "ID (default)";
-        private static final String COLLECTION_TYPE_MAP = "java.util.Map";
-        private static final int REL_MAP_KEY_COLUMN = 4;
-
-        private List<String> mapKeys = new ArrayList<>();
-        private ObjRelationshipTableModel model;
-        private int row;
-
-        public JTableMapKeyComboBoxEditor() {
-        }
-
-        private void initMapKeys() {
-            mapKeys.clear();
-            mapKeys.add(DEFAULT_MAP_KEY);
-            /**
-             * Object target can be null when selected target DbEntity has no
-             * ObjEntities
-             */
-            ObjEntity objectTarget = model.getRelationship(row).getTargetEntity();
-            if (objectTarget == null) {
-                return;
-            }
-            for (ObjAttribute attribute : objectTarget.getAttributes()) {
-                mapKeys.add(attribute.getName());
-            }
-        }
-
-        @Override
-        public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, final int row, final int column) {
-            this.model = (ObjRelationshipTableModel) table.getModel();
-            this.row = row;
-            initMapKeys();
-            final JComboBox mapKeysComboBox = Application.getWidgetFactory().createComboBox(
-                    mapKeys,
-                    false);
-            if ((model.getRelationship(row).getCollectionType() == null)
-                    || (!model.getRelationship(row).getCollectionType().equals(COLLECTION_TYPE_MAP))) {
-                JComboBox jComboBox = new JComboBox();
-                jComboBox.setFocusable(false);
-                jComboBox.setEnabled(false);
-                return jComboBox;
-            } else {
-                mapKeysComboBox.setFocusable(true);
-                mapKeysComboBox.setEnabled(true);
-            }
-            mapKeysComboBox.addActionListener(new ActionListener() {
-                @Override
-                public void actionPerformed(ActionEvent e) {
-                    Object selected = mapKeysComboBox.getSelectedItem();
-                    model.setUpdatedValueAt(selected, row, REL_MAP_KEY_COLUMN);
-                }
-            });
-            mapKeysComboBox.setSelectedItem(model.getRelationship(row).getMapKey());
-            return mapKeysComboBox;
-        }
-
-        @Override
-        public Object getCellEditorValue() {
-            return model.getValueAt(row, REL_MAP_KEY_COLUMN);
-        }
-    }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7e8e07c7/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/JTableMapKeyComboBoxRenderer.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/JTableMapKeyComboBoxRenderer.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/JTableMapKeyComboBoxRenderer.java
deleted file mode 100644
index 6f359a1..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/JTableMapKeyComboBoxRenderer.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.modeler.util;
-
-import org.apache.cayenne.modeler.editor.ObjRelationshipTableModel;
-
-import javax.swing.JComboBox;
-import javax.swing.JLabel;
-import javax.swing.JTable;
-import javax.swing.table.TableCellRenderer;
-import java.awt.Component;
-import java.awt.Font;
-
-public class JTableMapKeyComboBoxRenderer implements TableCellRenderer {
-
-        private static final String DEFAULT_MAP_KEY = "ID (default)";
-        private static final String COLLECTION_TYPE_MAP = "java.util.Map";
-
-        private ObjRelationshipTableModel model;
-
-        public JTableMapKeyComboBoxRenderer() {
-        }
-
-        @Override
-        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
-            this.model = (ObjRelationshipTableModel) table.getModel();
-            if ((model.getRelationship(row).getCollectionType() == null)
-                    || (!model.getRelationship(row).getCollectionType().equals(COLLECTION_TYPE_MAP))) {
-                JComboBox jComboBox = new JComboBox();
-                jComboBox.setFocusable(false);
-                jComboBox.setEnabled(false);
-                return jComboBox;
-            }
-            if (model.getRelationship(row).getMapKey() == null) {
-                model.getRelationship(row).setMapKey(DEFAULT_MAP_KEY);
-            }
-            JLabel jLabel = new JLabel(model.getRelationship(row).getMapKey());
-            jLabel.setFont(new Font("Verdana", Font.PLAIN, 12));
-            return jLabel;
-        }
-    }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7e8e07c7/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/MapKeyComboBoxEditor.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/MapKeyComboBoxEditor.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/MapKeyComboBoxEditor.java
new file mode 100644
index 0000000..2d4d16e
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/MapKeyComboBoxEditor.java
@@ -0,0 +1,104 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+
+package org.apache.cayenne.modeler.util;
+
+import org.apache.cayenne.map.ObjAttribute;
+import org.apache.cayenne.map.ObjEntity;
+import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.editor.ObjRelationshipTableModel;
+
+import javax.swing.AbstractCellEditor;
+import javax.swing.BorderFactory;
+import javax.swing.JComboBox;
+import javax.swing.JComponent;
+import javax.swing.JLabel;
+import javax.swing.JTable;
+import javax.swing.table.TableCellEditor;
+import java.awt.Component;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.ArrayList;
+import java.util.List;
+
+public class MapKeyComboBoxEditor extends AbstractCellEditor implements TableCellEditor {
+
+    private static final String DEFAULT_MAP_KEY = "ID (default)";
+    private static final String COLLECTION_TYPE_MAP = "java.util.Map";
+    private static final int REL_MAP_KEY_COLUMN = 4;
+
+    private List<String> mapKeys = new ArrayList<>();
+    private ObjRelationshipTableModel model;
+    private int row;
+
+    private void initMapKeys() {
+        mapKeys.clear();
+        mapKeys.add(DEFAULT_MAP_KEY);
+        /**
+         * Object target can be null when selected target DbEntity has no
+         * ObjEntities
+         */
+        ObjEntity objectTarget = model.getRelationship(row).getTargetEntity();
+        if (objectTarget == null) {
+            return;
+        }
+        for (ObjAttribute attribute : objectTarget.getAttributes()) {
+            mapKeys.add(attribute.getName());
+        }
+    }
+
+    @Override
+    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, final int row, int column) {
+        this.model = (ObjRelationshipTableModel) table.getModel();
+        this.row = row;
+        initMapKeys();
+        final JComboBox mapKeysComboBox = Application.getWidgetFactory().createComboBox(
+                mapKeys,
+                false);
+        if ((model.getRelationship(row).getCollectionType() == null)
+                || (!model.getRelationship(row).getCollectionType().equals(COLLECTION_TYPE_MAP))) {
+            JLabel labelIfNotMapCollection = new JLabel();
+            labelIfNotMapCollection.setEnabled(false);
+            return labelIfNotMapCollection;
+        }
+        mapKeysComboBox.setFocusable(true);
+        mapKeysComboBox.setEnabled(true);
+
+        mapKeysComboBox.addActionListener(new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                Object selected = mapKeysComboBox.getSelectedItem();
+                model.setUpdatedValueAt(selected, row, REL_MAP_KEY_COLUMN);
+            }
+        });
+        mapKeysComboBox.setSelectedItem(model.getRelationship(row).getMapKey());
+
+        mapKeysComboBox.setFocusable(false);
+        mapKeysComboBox.setEditable(true);
+        ((JComponent) mapKeysComboBox.getEditor().getEditorComponent()).setBorder(null);
+        mapKeysComboBox.setBorder(BorderFactory.createEmptyBorder(0,5,0,0));
+
+        return mapKeysComboBox;
+    }
+
+    @Override
+    public Object getCellEditorValue() {
+        return model.getValueAt(row, REL_MAP_KEY_COLUMN);
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7e8e07c7/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/MapKeyComboBoxRenderer.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/MapKeyComboBoxRenderer.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/MapKeyComboBoxRenderer.java
new file mode 100644
index 0000000..6664a58
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/MapKeyComboBoxRenderer.java
@@ -0,0 +1,57 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+
+package org.apache.cayenne.modeler.util;
+
+import org.apache.cayenne.modeler.editor.ObjRelationshipTableModel;
+
+import javax.swing.BorderFactory;
+import javax.swing.JTable;
+import javax.swing.table.DefaultTableCellRenderer;
+import java.awt.Component;
+import java.awt.Font;
+
+public class MapKeyComboBoxRenderer extends DefaultTableCellRenderer {
+
+    private static final String DEFAULT_MAP_KEY = "ID (default)";
+    private static final String COLLECTION_TYPE_MAP = "java.util.Map";
+
+    @Override
+    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
+        super.getTableCellRendererComponent(table, value, isSelected,  hasFocus,  row, column);
+
+        setBorder(BorderFactory.createEmptyBorder(0,5,0,0));
+        ObjRelationshipTableModel model = (ObjRelationshipTableModel) table.getModel();
+        if ((model.getRelationship(row).getCollectionType() == null)
+                || (!model.getRelationship(row).getCollectionType().equals(COLLECTION_TYPE_MAP))) {
+
+            setEnabled(false);
+            setText("");
+            return this;
+        }
+        if (model.getRelationship(row).getMapKey() == null) {
+            model.getRelationship(row).setMapKey(DEFAULT_MAP_KEY);
+        }
+
+        setText(model.getRelationship(row).getMapKey());
+        setFont(new Font("Verdana", Font.PLAIN, 12));
+        setEnabled(true);
+        return this;
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7e8e07c7/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/PathChooserComboBoxCellEditor.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/PathChooserComboBoxCellEditor.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/PathChooserComboBoxCellEditor.java
index ae4a639..051d8a4 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/PathChooserComboBoxCellEditor.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/PathChooserComboBoxCellEditor.java
@@ -24,8 +24,10 @@ import org.apache.cayenne.modeler.util.combo.AutoCompletion;
 import org.apache.commons.lang.StringUtils;
 
 import javax.swing.AbstractCellEditor;
+import javax.swing.BorderFactory;
 import javax.swing.DefaultComboBoxModel;
 import javax.swing.JComboBox;
+import javax.swing.JComponent;
 import javax.swing.JTable;
 import javax.swing.table.TableCellEditor;
 import javax.swing.text.JTextComponent;
@@ -71,7 +73,9 @@ public abstract class PathChooserComboBoxCellEditor extends AbstractCellEditor i
                 parsePathString(event.getKeyChar());
             }
         });
-        AutoCompletion.enable(comboBoxPathChooser, false, true);
+        AutoCompletion.enable(comboBoxPathChooser, true, true);
+        ((JComponent) comboBoxPathChooser.getEditor().getEditorComponent()).setBorder(null);
+        comboBoxPathChooser.setBorder(BorderFactory.createEmptyBorder(0,5,0,0));
     }
 
     private void setComboModelAccordingToPath(String pathString) {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7e8e07c7/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/SortButtonRenderer.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/SortButtonRenderer.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/SortButtonRenderer.java
index beae1e7..a68998e 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/SortButtonRenderer.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/SortButtonRenderer.java
@@ -19,50 +19,24 @@
 package org.apache.cayenne.modeler.util;
 
 import javax.swing.BorderFactory;
+import javax.swing.ImageIcon;
 import javax.swing.JButton;
+import javax.swing.JLabel;
 import javax.swing.JTable;
-import javax.swing.border.MatteBorder;
-import javax.swing.table.TableCellRenderer;
+import javax.swing.border.CompoundBorder;
+import javax.swing.table.DefaultTableCellRenderer;
 import java.awt.Color;
 import java.awt.Component;
-import java.awt.Insets;
-import java.util.Hashtable;
+import java.awt.Font;
 
-public class SortButtonRenderer extends JButton implements TableCellRenderer {
+public class SortButtonRenderer  extends DefaultTableCellRenderer {
 
     public static final int NONE = 0;
     public static final int DOWN = 1;
     public static final int UP = 2;
 
-    private int pushedColumn;
-    private Hashtable state;
-    private JButton downButton, upButton;
-
-    public SortButtonRenderer() {
-        MatteBorder matteBorder = BorderFactory.createMatteBorder(0, 0, 1, 1, Color.gray);
-        setBorder(matteBorder);
-
-        pushedColumn = -1;
-        state = new Hashtable();
-
-        setMargin(new Insets(0, 0, 0, 0));
-        setHorizontalTextPosition(CENTER);
-        setIcon(new BlankIcon());
-
-        downButton = new JButton();
-
-        downButton.setBorder(matteBorder);
-        downButton.setMargin(new Insets(0, 0, 0, 0));
-        downButton.setHorizontalTextPosition(LEFT);
-        downButton.setIcon(new BevelArrowIcon(BevelArrowIcon.DOWN, false, false));
-        downButton.setPressedIcon(new BevelArrowIcon(BevelArrowIcon.DOWN, false, true));
-
-        upButton = new JButton();
-        upButton.setBorder(matteBorder);
-        upButton.setMargin(new Insets(0, 0, 0, 0));
-        upButton.setHorizontalTextPosition(LEFT);
-        upButton.setIcon(new BevelArrowIcon(BevelArrowIcon.UP, false, false));
-    }
+    private int currentState;
+    private int currentColumn;
 
     public Component getTableCellRendererComponent(
             JTable table,
@@ -71,51 +45,46 @@ public class SortButtonRenderer extends JButton implements TableCellRenderer {
             boolean hasFocus,
             int row,
             int column) {
-        JButton button = this;
-        Object obj = state.get(new Integer(column));
+        super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
 
-        if (obj != null) {
-            if (((Integer) obj).intValue() == DOWN) {
-                button = downButton;
+        if (column == currentColumn) {
+            if (currentState == DOWN) {
+                setIcon(new BevelArrowIcon(BevelArrowIcon.DOWN, false, false));
             } else {
-                button = upButton;
+                setIcon(new BevelArrowIcon(BevelArrowIcon.UP, false, false));
             }
+        }else {
+            setIcon(new ImageIcon());
         }
-        button.setText((value == null) ? "" : value.toString());
-        return button;
-    }
 
-    public void setPressedColumn(int col) {
-        pushedColumn = col;
+        setText( ((value == null) ? "" : value.toString()));
+        setFont(new Font("Verdana", Font.BOLD , 13));
+        setHorizontalTextPosition(JLabel.LEFT);
+        setOpaque(true);
+        setBackground(new JButton().getBackground());
+        CompoundBorder compoundBorder = BorderFactory.createCompoundBorder(BorderFactory.createLineBorder(Color.GRAY, 1),
+                BorderFactory.createEmptyBorder(0, 4, 0, 0));
+        setBorder(compoundBorder);
+        return this;
     }
 
     public void setSelectedColumn(int col, boolean isAscOrder) {
-        if (col < 0)
+        if (col < 0) {
             return;
-        Integer value = null;
+        }
         //shows the direction of ordering
         if (isAscOrder) {
-            value = new Integer(DOWN);
+            currentState = DOWN;
         } else {
-            value = new Integer(UP);
+            currentState = UP;
         }
-
-        state.clear();
-        state.put(new Integer(col), value);
+        currentColumn = col;
     }
 
     public int getState(int col) {
-        int retValue;
-        Object obj = state.get(new Integer(col));
-        if (obj == null) {
-            retValue = NONE;
-        } else {
-            if (((Integer) obj).intValue() == DOWN) {
-                retValue = DOWN;
-            } else {
-                retValue = UP;
-            }
+        if (col == currentColumn){
+            return currentState;
         }
-        return retValue;
+        return NONE;
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7e8e07c7/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 9c8a371..86ec2b5 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
@@ -280,12 +280,12 @@ public class AutoCompletion implements FocusListener, KeyListener, Runnable {
     private void suggestionListScrolling(){
         Component c = suggestionList.getComponent(0);
         if (c instanceof JScrollPane) {
-            double height = suggestionList.getPreferredSize().getHeight();
             int itemCount = suggestionList.getItemCount();
             int selectedIndex = suggestionList.getSelectedIndex();
-            double scrollValue = Math.ceil(height*selectedIndex/itemCount);
             JScrollPane scrollPane = (JScrollPane) c;
             JScrollBar scrollBar = scrollPane.getVerticalScrollBar();
+            double height = scrollBar.getMaximum();
+            double scrollValue = Math.ceil(height*selectedIndex/itemCount);
             scrollBar.setValue((int) scrollValue);
         }
     }


[3/4] cayenne git commit: fix scroll. change tool tip text. fix header renderer. fix autocompletion

Posted by sk...@apache.org.
fix scroll. change tool tip text. fix header renderer. fix autocompletion


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

Branch: refs/heads/master
Commit: 16ee52034887dbd0739df6943fa3f5908b190829
Parents: c52fac6
Author: AlexandrShestak <sh...@mail.ru>
Authored: Tue Dec 15 10:42:20 2015 +0300
Committer: AlexandrShestak <sh...@mail.ru>
Committed: Tue Dec 15 10:42:20 2015 +0300

----------------------------------------------------------------------
 .../editor/ObjEntityRelationshipPanel.java      |  2 +-
 .../util/DbRelationshipPathComboBoxEditor.java  |  2 +-
 .../util/PathChooserComboBoxCellEditor.java     | 14 +++++++++++++-
 .../modeler/util/SortButtonRenderer.java        | 10 ++++------
 .../modeler/util/combo/AutoCompletion.java      | 20 +++++---------------
 5 files changed, 24 insertions(+), 24 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/16ee5203/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 fd08bde..41061e3 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
@@ -321,7 +321,7 @@ public class ObjEntityRelationshipPanel extends JPanel implements ObjEntityDispl
             public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
                 super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
                 setBorder(BorderFactory.createEmptyBorder(0,5,0,0));
-                setToolTipText("To choose relationship press enter two times. \n To choose next relationship press dot.");
+                setToolTipText("To choose relationship press enter two times.To choose next relationship press dot.");
                 return this;
             }
         });

http://git-wip-us.apache.org/repos/asf/cayenne/blob/16ee5203/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/DbRelationshipPathComboBoxEditor.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/DbRelationshipPathComboBoxEditor.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/DbRelationshipPathComboBoxEditor.java
index 8a5ca0a..a3e6935 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/DbRelationshipPathComboBoxEditor.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/DbRelationshipPathComboBoxEditor.java
@@ -69,7 +69,7 @@ public class DbRelationshipPathComboBoxEditor extends PathChooserComboBoxCellEdi
         comboBoxPathChooser.setSelectedItem(((ObjRelationshipTableModel) model).getRelationship(row).getDbRelationshipPath());
 
         enterPressedCount = 0;
-        comboBoxPathChooser.setToolTipText("To choose relationship press enter two times. \n To choose next relationship press dot.");
+        comboBoxPathChooser.setToolTipText("To choose relationship press enter two times.To choose next relationship press dot.");
         JTextComponent textEditor = (JTextComponent) (comboBoxPathChooser).
                 getEditor().getEditorComponent();
         textEditor.addFocusListener(this);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/16ee5203/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/PathChooserComboBoxCellEditor.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/PathChooserComboBoxCellEditor.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/PathChooserComboBoxCellEditor.java
index 07633da..2c5509b 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/PathChooserComboBoxCellEditor.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/PathChooserComboBoxCellEditor.java
@@ -41,6 +41,8 @@ import javax.swing.text.JTextComponent;
 import java.awt.BorderLayout;
 import java.awt.Component;
 import java.awt.Font;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
 import java.awt.event.KeyAdapter;
 import java.awt.event.KeyEvent;
 import java.util.ArrayList;
@@ -51,7 +53,7 @@ import java.util.regex.Pattern;
  * This class used as cell editor, when you need to
  * choose path in comboBox and use autocompletion.
  */
-public abstract class PathChooserComboBoxCellEditor extends AbstractCellEditor implements TableCellEditor {
+public abstract class PathChooserComboBoxCellEditor extends AbstractCellEditor implements TableCellEditor, ActionListener {
 
     protected JComboBox comboBoxPathChooser;
     protected int previousEmbeddedLevel = 0;
@@ -87,6 +89,7 @@ public abstract class PathChooserComboBoxCellEditor extends AbstractCellEditor i
         ((JComponent) comboBoxPathChooser.getEditor().getEditorComponent()).setBorder(null);
         comboBoxPathChooser.setBorder(BorderFactory.createEmptyBorder(0,5,0,0));
         comboBoxPathChooser.setRenderer(new PathChooserComboBoxCellRenderer());
+        comboBoxPathChooser.addActionListener(this);
     }
 
     private void setComboModelAccordingToPath(String pathString) {
@@ -204,6 +207,15 @@ public abstract class PathChooserComboBoxCellEditor extends AbstractCellEditor i
         return currentNodeChildren;
     }
 
+    @Override
+    public void actionPerformed(ActionEvent e) {
+        //for some reason comboBoxPathChooser don't load selected item text, so we made it by hand
+        if (comboBoxPathChooser.getSelectedIndex() != (-1)) {
+            ((JTextComponent) (comboBoxPathChooser).
+                    getEditor().getEditorComponent()).setText(comboBoxPathChooser.getSelectedItem().toString());
+        }
+    }
+
     private final class PathChooserComboBoxCellRenderer extends DefaultListCellRenderer {
 
         private  final ImageIcon rightArrow = ModelerUtil.buildIcon("scroll_right.gif");

http://git-wip-us.apache.org/repos/asf/cayenne/blob/16ee5203/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/SortButtonRenderer.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/SortButtonRenderer.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/SortButtonRenderer.java
index a68998e..1cab21a 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/SortButtonRenderer.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/SortButtonRenderer.java
@@ -20,7 +20,6 @@ package org.apache.cayenne.modeler.util;
 
 import javax.swing.BorderFactory;
 import javax.swing.ImageIcon;
-import javax.swing.JButton;
 import javax.swing.JLabel;
 import javax.swing.JTable;
 import javax.swing.border.CompoundBorder;
@@ -58,12 +57,11 @@ public class SortButtonRenderer  extends DefaultTableCellRenderer {
         }
 
         setText( ((value == null) ? "" : value.toString()));
-        setFont(new Font("Verdana", Font.BOLD , 13));
+        setFont(new Font("Verdana", Font.BOLD, 12));
         setHorizontalTextPosition(JLabel.LEFT);
-        setOpaque(true);
-        setBackground(new JButton().getBackground());
-        CompoundBorder compoundBorder = BorderFactory.createCompoundBorder(BorderFactory.createLineBorder(Color.GRAY, 1),
-                BorderFactory.createEmptyBorder(0, 4, 0, 0));
+        CompoundBorder compoundBorder = BorderFactory.createCompoundBorder(
+                BorderFactory.createMatteBorder(0, 0, 1, 1, Color.GRAY),
+                BorderFactory.createEmptyBorder(0, 5, 0, 0));
         setBorder(compoundBorder);
         return this;
     }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/16ee5203/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 86ec2b5..e5839da 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
@@ -20,11 +20,9 @@
 package org.apache.cayenne.modeler.util.combo;
 
 import javax.swing.JComboBox;
-import javax.swing.JScrollBar;
-import javax.swing.JScrollPane;
+import javax.swing.JList;
 import javax.swing.SwingUtilities;
 import javax.swing.text.JTextComponent;
-import java.awt.Component;
 import java.awt.event.FocusEvent;
 import java.awt.event.FocusListener;
 import java.awt.event.KeyEvent;
@@ -156,8 +154,6 @@ public class AutoCompletion implements FocusListener, KeyListener, Runnable {
 
         //scroll doesn't work in suggestionList..so we will scroll manually
         suggestionListScrolling();
-
-        textEditor.requestFocus();
     }
 
     private void   processKeyPressedWhenSuggestionListIsInvisible(KeyEvent e){
@@ -274,20 +270,14 @@ public class AutoCompletion implements FocusListener, KeyListener, Runnable {
                     comboBox.setSelectedIndex(next);
                 }
             }
+            textEditor.requestFocus();
         }
     }
 
     private void suggestionListScrolling(){
-        Component c = suggestionList.getComponent(0);
-        if (c instanceof JScrollPane) {
-            int itemCount = suggestionList.getItemCount();
-            int selectedIndex = suggestionList.getSelectedIndex();
-            JScrollPane scrollPane = (JScrollPane) c;
-            JScrollBar scrollBar = scrollPane.getVerticalScrollBar();
-            double height = scrollBar.getMaximum();
-            double scrollValue = Math.ceil(height*selectedIndex/itemCount);
-            scrollBar.setValue((int) scrollValue);
-        }
+        JList list = suggestionList.getList();
+        int selectedIndex = suggestionList.getSelectedIndex();
+        list.ensureIndexIsVisible(selectedIndex);
     }
 }
 


[4/4] cayenne git commit: remove map key and collection type from ObjEntityRelationshiPanel

Posted by sk...@apache.org.
remove map key and collection type from ObjEntityRelationshiPanel


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

Branch: refs/heads/master
Commit: 1448a194c6f81b566950d54189d379cd96c45fca
Parents: 16ee520
Author: AlexandrShestak <sh...@mail.ru>
Authored: Tue Dec 15 16:42:29 2015 +0300
Committer: AlexandrShestak <sh...@mail.ru>
Committed: Tue Dec 15 16:42:29 2015 +0300

----------------------------------------------------------------------
 .../editor/ObjEntityRelationshipPanel.java      |  30 +++---
 .../editor/ObjRelationshipTableModel.java       |  47 +++------
 .../util/CollectionTypeComboBoxEditor.java      |  90 ----------------
 .../util/CollectionTypeComboBoxRenderer.java    |  53 ----------
 .../util/DbAttributePathComboBoxEditor.java     |   5 +
 .../modeler/util/MapKeyComboBoxEditor.java      | 104 -------------------
 .../modeler/util/MapKeyComboBoxRenderer.java    |  57 ----------
 7 files changed, 36 insertions(+), 350 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/1448a194/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 41061e3..a9900c4 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
@@ -41,24 +41,32 @@ import org.apache.cayenne.modeler.pref.TableColumnPreferences;
 import org.apache.cayenne.modeler.util.CayenneTable;
 import org.apache.cayenne.modeler.util.CellRenderers;
 import org.apache.cayenne.modeler.util.DbRelationshipPathComboBoxEditor;
-import org.apache.cayenne.modeler.util.CollectionTypeComboBoxEditor;
-import org.apache.cayenne.modeler.util.CollectionTypeComboBoxRenderer;
-import org.apache.cayenne.modeler.util.MapKeyComboBoxEditor;
-import org.apache.cayenne.modeler.util.MapKeyComboBoxRenderer;
 import org.apache.cayenne.modeler.util.ModelerUtil;
 import org.apache.cayenne.modeler.util.PanelFactory;
 import org.apache.cayenne.modeler.util.UIUtil;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
-import javax.swing.*;
+import javax.swing.BorderFactory;
+import javax.swing.DefaultCellEditor;
+import javax.swing.Icon;
+import javax.swing.JComboBox;
+import javax.swing.JComponent;
+import javax.swing.JLabel;
+import javax.swing.JMenuItem;
+import javax.swing.JPanel;
+import javax.swing.JPopupMenu;
+import javax.swing.JTable;
+import javax.swing.ListSelectionModel;
 import javax.swing.event.ListSelectionEvent;
 import javax.swing.event.ListSelectionListener;
 import javax.swing.event.TableModelEvent;
 import javax.swing.event.TableModelListener;
 import javax.swing.table.DefaultTableCellRenderer;
 import javax.swing.table.TableColumn;
-import java.awt.*;
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Component;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.util.Collection;
@@ -338,16 +346,6 @@ public class ObjEntityRelationshipPanel extends JPanel implements ObjEntityDispl
         col.setCellEditor(Application.getWidgetFactory().createCellEditor(
                 deleteRulesCombo));
 
-        col = table.getColumnModel().getColumn(ObjRelationshipTableModel.REL_COLLECTION_TYPE);
-
-        col.setCellEditor(new CollectionTypeComboBoxEditor());
-        col.setCellRenderer(new CollectionTypeComboBoxRenderer());
-
-        col = table.getColumnModel().getColumn(ObjRelationshipTableModel.REL_MAP_KEY);
-
-        col.setCellEditor(new MapKeyComboBoxEditor());
-        col.setCellRenderer(new MapKeyComboBoxRenderer());
-
         tablePreferences.bind(
                 table,
                 null,

http://git-wip-us.apache.org/repos/asf/cayenne/blob/1448a194/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 cfc7596..e05608d 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
@@ -40,12 +40,10 @@ public class ObjRelationshipTableModel extends CayenneTableModel {
     public static final int REL_NAME = 0;
     public static final int REL_TARGET = 1;
     public static final int REL_TARGET_PATH = 2;
-    public static final int REL_COLLECTION_TYPE = 3;
-    public static final int REL_MAP_KEY = 4;
-    public static final int REL_SEMANTICS = 5;
-    public static final int REL_DELETE_RULE = 6;
-    public static final int REL_LOCKING = 7;
-    public static final int COLUMN_COUNT = 8;
+    public static final int REL_SEMANTICS = 3;
+    public static final int REL_DELETE_RULE = 4;
+    public static final int REL_LOCKING = 5;
+    public static final int COLUMN_COUNT = 6;
 
     private ObjEntity entity;
 
@@ -92,10 +90,6 @@ public class ObjRelationshipTableModel extends CayenneTableModel {
                 return "Semantics";
             case REL_DELETE_RULE:
                 return "Delete Rule";
-            case REL_COLLECTION_TYPE:
-                return "Collection Type";
-            case REL_MAP_KEY:
-                return "Map Key";
             case REL_TARGET_PATH:
                 return "DbRelationship Path";
             default:
@@ -133,13 +127,6 @@ public class ObjRelationshipTableModel extends CayenneTableModel {
             return getSemantics(relationship);
         } else if (column == REL_DELETE_RULE) {
             return DeleteRule.deleteRuleName(relationship.getDeleteRule());
-        } else if (column == REL_COLLECTION_TYPE) {
-            if (!relationship.isToMany()) {
-                return null;
-            }
-            return relationship.getCollectionType();
-        } else if (column == REL_MAP_KEY) {
-            return relationship.getMapKey();
         } else if (column == REL_TARGET_PATH) {
             return relationship.getDbRelationshipPath();
         } else {
@@ -153,6 +140,18 @@ public class ObjRelationshipTableModel extends CayenneTableModel {
         if (relationship.isReadOnly()) {
             semantics.append(", read-only");
         }
+        if (relationship.isToMany()) {
+            String collection = "list";
+            if (relationship.getCollectionType() != null) {
+                int dot = relationship.getCollectionType().lastIndexOf('.');
+                collection = relationship
+                        .getCollectionType()
+                        .substring(dot + 1)
+                        .toLowerCase();
+            }
+
+            semantics.append(", " + collection);
+        }
         return semantics.toString();
     }
 
@@ -196,12 +195,6 @@ public class ObjRelationshipTableModel extends CayenneTableModel {
             relationship.setUsedForLocking((value instanceof Boolean)
                     && ((Boolean) value).booleanValue());
             fireTableCellUpdated(row, column);
-        } else if (column == REL_COLLECTION_TYPE) {
-            relationship.setCollectionType((String) value);
-            fireTableCellUpdated(row, column);
-        } else if (column == REL_MAP_KEY) {
-            relationship.setMapKey((String) value);
-            fireTableCellUpdated(row, column);
         } else if (column == REL_TARGET_PATH) {
             relationship.setDbRelationshipPath((String) value);
             fireTableCellUpdated(row, column);
@@ -269,8 +262,6 @@ public class ObjRelationshipTableModel extends CayenneTableModel {
                 sortByElementProperty("usedForLocking", isAscent);
                 break;
             case REL_SEMANTICS:
-            case REL_COLLECTION_TYPE:
-            case REL_MAP_KEY:
             case REL_DELETE_RULE:
             case REL_TARGET_PATH:
                 Collections.sort(objectList, new ObjRelationshipTableComparator(sortCol));
@@ -302,11 +293,7 @@ public class ObjRelationshipTableModel extends CayenneTableModel {
                 return 1;
             }
 
-            switch(sortCol){
-                case REL_COLLECTION_TYPE:
-                    return compareColumnsData(o1.getCollectionType(), o2.getCollectionType());
-                case REL_MAP_KEY:
-                    return compareColumnsData(o1.getMapKey(), o2.getMapKey());
+            switch(sortCol) {
                 case REL_SEMANTICS:
                     return compareColumnsData(getSemantics(o1), getSemantics(o2));
                 case REL_DELETE_RULE:

http://git-wip-us.apache.org/repos/asf/cayenne/blob/1448a194/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CollectionTypeComboBoxEditor.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CollectionTypeComboBoxEditor.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CollectionTypeComboBoxEditor.java
deleted file mode 100644
index 1ea13ed..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CollectionTypeComboBoxEditor.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.modeler.util;
-
-import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.editor.ObjRelationshipTableModel;
-
-import javax.swing.AbstractCellEditor;
-import javax.swing.BorderFactory;
-import javax.swing.JComboBox;
-import javax.swing.JComponent;
-import javax.swing.JLabel;
-import javax.swing.JTable;
-import javax.swing.table.TableCellEditor;
-import java.awt.Component;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-
-public class CollectionTypeComboBoxEditor extends AbstractCellEditor implements TableCellEditor {
-
-    private static final String COLLECTION_TYPE_MAP = "java.util.Map";
-    private static final String COLLECTION_TYPE_SET = "java.util.Set";
-    private static final String COLLECTION_TYPE_COLLECTION = "java.util.Collection";
-    private static final String DEFAULT_COLLECTION_TYPE = "java.util.List";
-    private static final int REL_COLLECTION_TYPE_COLUMN = 3;
-
-    private ObjRelationshipTableModel model;
-    private int row;
-
-    @Override
-    public Component getTableCellEditorComponent(final JTable table, Object value, boolean isSelected, final int row, final int column) {
-
-        this.model = (ObjRelationshipTableModel) table.getModel();
-        this.row = row;
-
-        final JComboBox collectionTypeCombo = Application.getWidgetFactory().createComboBox(
-                new Object[]{
-                        COLLECTION_TYPE_MAP,
-                        COLLECTION_TYPE_SET,
-                        COLLECTION_TYPE_COLLECTION,
-                        DEFAULT_COLLECTION_TYPE
-                },
-                false);
-        if (model.getRelationship(row).isToMany()) {
-            collectionTypeCombo.setEnabled(true);
-            collectionTypeCombo.setSelectedItem(model.getRelationship(row).getCollectionType());
-        } else {
-            JLabel labelIfToOneRelationship = new JLabel();
-            labelIfToOneRelationship.setEnabled(false);
-            return labelIfToOneRelationship;
-        }
-        collectionTypeCombo.addActionListener(new ActionListener() {
-            @Override
-            public void actionPerformed(ActionEvent e) {
-                Object selected = collectionTypeCombo.getSelectedItem();
-                model.setUpdatedValueAt(selected, row, REL_COLLECTION_TYPE_COLUMN);
-                table.repaint();
-            }
-        });
-
-        collectionTypeCombo.setFocusable(false);
-        collectionTypeCombo.setEditable(true);
-        ((JComponent) collectionTypeCombo.getEditor().getEditorComponent()).setBorder(null);
-        collectionTypeCombo.setBorder(BorderFactory.createEmptyBorder(0,5,0,0));
-
-        return collectionTypeCombo;
-    }
-
-    @Override
-    public Object getCellEditorValue() {
-        return model.getValueAt(row, REL_COLLECTION_TYPE_COLUMN);
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/1448a194/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CollectionTypeComboBoxRenderer.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CollectionTypeComboBoxRenderer.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CollectionTypeComboBoxRenderer.java
deleted file mode 100644
index d1a69b0..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CollectionTypeComboBoxRenderer.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.modeler.util;
-
-import org.apache.cayenne.modeler.editor.ObjRelationshipTableModel;
-
-import javax.swing.BorderFactory;
-import javax.swing.JTable;
-import javax.swing.table.DefaultTableCellRenderer;
-import java.awt.Component;
-import java.awt.Font;
-
-public class CollectionTypeComboBoxRenderer extends DefaultTableCellRenderer {
-
-    @Override
-    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
-        super.getTableCellRendererComponent(table, value, isSelected,  hasFocus,  row, column);
-
-        setBorder(BorderFactory.createEmptyBorder(0,5,0,0));
-        if (value == null) {
-            setEnabled(false);
-            return this;
-        }
-        if (((ObjRelationshipTableModel) table.getModel()).getRelationship(row).isToMany()) {
-            setFocusable(false);
-            setEnabled(true);
-            setText((String) value);
-            setFont(new Font("Verdana", Font.PLAIN, 12));
-            return this;
-        } else {
-            setEnabled(false);
-            return this;
-        }
-    }
-}
-

http://git-wip-us.apache.org/repos/asf/cayenne/blob/1448a194/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/DbAttributePathComboBoxEditor.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/DbAttributePathComboBoxEditor.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/DbAttributePathComboBoxEditor.java
index 5eda3d0..f1cca8d 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/DbAttributePathComboBoxEditor.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/DbAttributePathComboBoxEditor.java
@@ -44,6 +44,7 @@ public class DbAttributePathComboBoxEditor extends PathChooserComboBoxCellEditor
 
     private static final int DB_ATTRIBUTE_PATH_COLUMN = 3;
 
+    private String savePath;
     private ObjAttributeTableModel model;
 
     @Override
@@ -70,6 +71,7 @@ public class DbAttributePathComboBoxEditor extends PathChooserComboBoxCellEditor
     protected void initializeCombo(CayenneTableModel model, int row, final JTable table) {
         super.initializeCombo(model, row, table);
         comboBoxPathChooser.setSelectedItem(((ObjAttributeTableModel) model).getAttribute(row).getValue().getDbAttributePath());
+        savePath = this.model.getAttribute(row).getValue().getDbAttributePath();
     }
 
 
@@ -103,6 +105,9 @@ public class DbAttributePathComboBoxEditor extends PathChooserComboBoxCellEditor
 
             if (table.getCellEditor() != null) {
                 table.getCellEditor().stopCellEditing();
+                if (dbAttributePath.equals(savePath)) {
+                    return;
+                }
                 model.setUpdatedValueAt(dbAttributePath, row, DB_ATTRIBUTE_PATH_COLUMN);
                 model.getAttribute(row).getValue().setDbAttributePath(dbAttributePath);
             }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/1448a194/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/MapKeyComboBoxEditor.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/MapKeyComboBoxEditor.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/MapKeyComboBoxEditor.java
deleted file mode 100644
index 2d4d16e..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/MapKeyComboBoxEditor.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.modeler.util;
-
-import org.apache.cayenne.map.ObjAttribute;
-import org.apache.cayenne.map.ObjEntity;
-import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.editor.ObjRelationshipTableModel;
-
-import javax.swing.AbstractCellEditor;
-import javax.swing.BorderFactory;
-import javax.swing.JComboBox;
-import javax.swing.JComponent;
-import javax.swing.JLabel;
-import javax.swing.JTable;
-import javax.swing.table.TableCellEditor;
-import java.awt.Component;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.util.ArrayList;
-import java.util.List;
-
-public class MapKeyComboBoxEditor extends AbstractCellEditor implements TableCellEditor {
-
-    private static final String DEFAULT_MAP_KEY = "ID (default)";
-    private static final String COLLECTION_TYPE_MAP = "java.util.Map";
-    private static final int REL_MAP_KEY_COLUMN = 4;
-
-    private List<String> mapKeys = new ArrayList<>();
-    private ObjRelationshipTableModel model;
-    private int row;
-
-    private void initMapKeys() {
-        mapKeys.clear();
-        mapKeys.add(DEFAULT_MAP_KEY);
-        /**
-         * Object target can be null when selected target DbEntity has no
-         * ObjEntities
-         */
-        ObjEntity objectTarget = model.getRelationship(row).getTargetEntity();
-        if (objectTarget == null) {
-            return;
-        }
-        for (ObjAttribute attribute : objectTarget.getAttributes()) {
-            mapKeys.add(attribute.getName());
-        }
-    }
-
-    @Override
-    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, final int row, int column) {
-        this.model = (ObjRelationshipTableModel) table.getModel();
-        this.row = row;
-        initMapKeys();
-        final JComboBox mapKeysComboBox = Application.getWidgetFactory().createComboBox(
-                mapKeys,
-                false);
-        if ((model.getRelationship(row).getCollectionType() == null)
-                || (!model.getRelationship(row).getCollectionType().equals(COLLECTION_TYPE_MAP))) {
-            JLabel labelIfNotMapCollection = new JLabel();
-            labelIfNotMapCollection.setEnabled(false);
-            return labelIfNotMapCollection;
-        }
-        mapKeysComboBox.setFocusable(true);
-        mapKeysComboBox.setEnabled(true);
-
-        mapKeysComboBox.addActionListener(new ActionListener() {
-            @Override
-            public void actionPerformed(ActionEvent e) {
-                Object selected = mapKeysComboBox.getSelectedItem();
-                model.setUpdatedValueAt(selected, row, REL_MAP_KEY_COLUMN);
-            }
-        });
-        mapKeysComboBox.setSelectedItem(model.getRelationship(row).getMapKey());
-
-        mapKeysComboBox.setFocusable(false);
-        mapKeysComboBox.setEditable(true);
-        ((JComponent) mapKeysComboBox.getEditor().getEditorComponent()).setBorder(null);
-        mapKeysComboBox.setBorder(BorderFactory.createEmptyBorder(0,5,0,0));
-
-        return mapKeysComboBox;
-    }
-
-    @Override
-    public Object getCellEditorValue() {
-        return model.getValueAt(row, REL_MAP_KEY_COLUMN);
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/1448a194/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/MapKeyComboBoxRenderer.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/MapKeyComboBoxRenderer.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/MapKeyComboBoxRenderer.java
deleted file mode 100644
index 6664a58..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/MapKeyComboBoxRenderer.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.modeler.util;
-
-import org.apache.cayenne.modeler.editor.ObjRelationshipTableModel;
-
-import javax.swing.BorderFactory;
-import javax.swing.JTable;
-import javax.swing.table.DefaultTableCellRenderer;
-import java.awt.Component;
-import java.awt.Font;
-
-public class MapKeyComboBoxRenderer extends DefaultTableCellRenderer {
-
-    private static final String DEFAULT_MAP_KEY = "ID (default)";
-    private static final String COLLECTION_TYPE_MAP = "java.util.Map";
-
-    @Override
-    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
-        super.getTableCellRendererComponent(table, value, isSelected,  hasFocus,  row, column);
-
-        setBorder(BorderFactory.createEmptyBorder(0,5,0,0));
-        ObjRelationshipTableModel model = (ObjRelationshipTableModel) table.getModel();
-        if ((model.getRelationship(row).getCollectionType() == null)
-                || (!model.getRelationship(row).getCollectionType().equals(COLLECTION_TYPE_MAP))) {
-
-            setEnabled(false);
-            setText("");
-            return this;
-        }
-        if (model.getRelationship(row).getMapKey() == null) {
-            model.getRelationship(row).setMapKey(DEFAULT_MAP_KEY);
-        }
-
-        setText(model.getRelationship(row).getMapKey());
-        setFont(new Font("Verdana", Font.PLAIN, 12));
-        setEnabled(true);
-        return this;
-    }
-}
\ No newline at end of file


[2/4] cayenne git commit: fix autocompletion problems

Posted by sk...@apache.org.
fix autocompletion problems


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

Branch: refs/heads/master
Commit: c52fac637206fd053c1710bf777ae88d6f3eb9c5
Parents: 7e8e07c
Author: AlexandrShestak <sh...@mail.ru>
Authored: Mon Dec 14 16:15:13 2015 +0300
Committer: AlexandrShestak <sh...@mail.ru>
Committed: Mon Dec 14 16:15:13 2015 +0300

----------------------------------------------------------------------
 .../modeler/editor/ObjAttributeTableModel.java  |  2 +-
 .../editor/ObjRelationshipTableModel.java       |  4 +-
 .../util/DbAttributePathComboBoxEditor.java     | 32 +---------
 .../util/DbRelationshipPathComboBoxEditor.java  | 64 ++++++++++++++------
 .../util/PathChooserComboBoxCellEditor.java     | 60 ++++++++++++++----
 5 files changed, 101 insertions(+), 61 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/c52fac63/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 16db808..8881829 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
@@ -158,7 +158,7 @@ public class ObjAttributeTableModel extends CayenneTableModel<ObjAttributeWrappe
             case OBJ_ATTRIBUTE_TYPE:
                 return "Java Type";
             case DB_ATTRIBUTE:
-                return "DbAttributePath";
+                return "DbAttribute Path";
             case DB_ATTRIBUTE_TYPE:
                 return "DB Type";
             case LOCKING:

http://git-wip-us.apache.org/repos/asf/cayenne/blob/c52fac63/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 eab255b..cfc7596 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
@@ -95,9 +95,9 @@ public class ObjRelationshipTableModel extends CayenneTableModel {
             case REL_COLLECTION_TYPE:
                 return "Collection Type";
             case REL_MAP_KEY:
-                return "Map key";
+                return "Map Key";
             case REL_TARGET_PATH:
-                return "DbRelationshipPath";
+                return "DbRelationship Path";
             default:
                 return null;
         }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/c52fac63/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/DbAttributePathComboBoxEditor.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/DbAttributePathComboBoxEditor.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/DbAttributePathComboBoxEditor.java
index 14cb155..5eda3d0 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/DbAttributePathComboBoxEditor.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/DbAttributePathComboBoxEditor.java
@@ -30,14 +30,10 @@ import org.apache.cayenne.util.CayenneMapEntry;
 import org.apache.commons.lang.StringUtils;
 
 import javax.swing.DefaultComboBoxModel;
-import javax.swing.DefaultListCellRenderer;
 import javax.swing.JLabel;
-import javax.swing.JList;
 import javax.swing.JTable;
 import javax.swing.text.JTextComponent;
-import java.awt.Color;
 import java.awt.Component;
-import java.awt.Font;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Iterator;
@@ -73,29 +69,7 @@ public class DbAttributePathComboBoxEditor extends PathChooserComboBoxCellEditor
     @Override
     protected void initializeCombo(CayenneTableModel model, int row, final JTable table) {
         super.initializeCombo(model, row, table);
-        ((JTextComponent) (comboBoxPathChooser).
-                getEditor().getEditorComponent()).
-                setText(((ObjAttributeTableModel) model).getAttribute(row).getValue().getDbAttributePath());
-        comboBoxPathChooser.setRenderer(new DefaultListCellRenderer() {
-            @Override
-            public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
-                Object currentNode = getCurrentNode((String) value);
-                JLabel jLabel = new JLabel();
-                jLabel.setFont(new Font("Verdana", Font.PLAIN, 13));
-                if (isSelected) {
-                    jLabel.setOpaque(true);
-                    jLabel.setBackground(new Color(0xB4B4B4));
-                }
-                if (currentNode instanceof DbRelationship) {
-                    if (((String) value).charAt(((String) value).length() - 1) != '.') {
-                        jLabel.setText(ModelerUtil.getObjectName(value) + " ->");
-                    }
-                    return jLabel;
-                }
-                jLabel.setText(ModelerUtil.getObjectName(value));
-                return jLabel;
-            }
-        });
+        comboBoxPathChooser.setSelectedItem(((ObjAttributeTableModel) model).getAttribute(row).getValue().getDbAttributePath());
     }
 
 
@@ -129,8 +103,8 @@ public class DbAttributePathComboBoxEditor extends PathChooserComboBoxCellEditor
 
             if (table.getCellEditor() != null) {
                 table.getCellEditor().stopCellEditing();
-                model.getAttribute(row).setDbAttributePath(dbAttributePath);
                 model.setUpdatedValueAt(dbAttributePath, row, DB_ATTRIBUTE_PATH_COLUMN);
+                model.getAttribute(row).getValue().setDbAttributePath(dbAttributePath);
             }
         }else if (ModelerUtil.getObjectName(currentNode).equals(lastStringInPath) &&
                 currentNode instanceof DbRelationship) {
@@ -143,9 +117,9 @@ public class DbAttributePathComboBoxEditor extends PathChooserComboBoxCellEditor
                         getEditor().getEditorComponent()).setText(dbAttributePath);
             }
             List<String> currentNodeChildren = new ArrayList<>();
-            currentNodeChildren.add(dbAttributePath);
             currentNodeChildren.addAll(getChildren(getCurrentNode(dbAttributePath), dbAttributePath));
             comboBoxPathChooser.setModel(new DefaultComboBoxModel(currentNodeChildren.toArray()));
+            comboBoxPathChooser.setSelectedItem(dbAttributePath);
             comboBoxPathChooser.showPopup();
             comboBoxPathChooser.setPopupVisible(true);
         }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/c52fac63/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/DbRelationshipPathComboBoxEditor.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/DbRelationshipPathComboBoxEditor.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/DbRelationshipPathComboBoxEditor.java
index 829f874..8a5ca0a 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/DbRelationshipPathComboBoxEditor.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/DbRelationshipPathComboBoxEditor.java
@@ -28,22 +28,24 @@ import javax.swing.JLabel;
 import javax.swing.JTable;
 import javax.swing.text.JTextComponent;
 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.util.Collection;
 import java.util.regex.Pattern;
 
-public class DbRelationshipPathComboBoxEditor extends PathChooserComboBoxCellEditor implements ActionListener {
+public class DbRelationshipPathComboBoxEditor extends PathChooserComboBoxCellEditor implements  FocusListener {
 
     private static final int REL_TARGET_PATH_COLUMN = 2;
     private static int enterPressedCount = 0;
-
+    private JTable table;
+    private String savePath;
     private ObjRelationshipTableModel model;
 
     @Override
     public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
         this.model = (ObjRelationshipTableModel) table.getModel();
         this.row = row;
+        this.table = table;
         treeModel = createTreeModelForComboBox(row);
         if (treeModel == null) {
             return new JLabel("You should select table for this ObjectEntity");
@@ -64,19 +66,21 @@ public class DbRelationshipPathComboBoxEditor extends PathChooserComboBoxCellEdi
     @Override
     protected void initializeCombo(CayenneTableModel model, int row, final JTable table) {
         super.initializeCombo(model, row, table);
-        ((JTextComponent) (comboBoxPathChooser).
-                getEditor().getEditorComponent()).
-                setText(((ObjRelationshipTableModel) model).getRelationship(row).getDbRelationshipPath());
+        comboBoxPathChooser.setSelectedItem(((ObjRelationshipTableModel) model).getRelationship(row).getDbRelationshipPath());
 
         enterPressedCount = 0;
-        comboBoxPathChooser.addActionListener(this);
         comboBoxPathChooser.setToolTipText("To choose relationship press enter two times. \n To choose next relationship press dot.");
+        JTextComponent textEditor = (JTextComponent) (comboBoxPathChooser).
+                getEditor().getEditorComponent();
+        textEditor.addFocusListener(this);
+        savePath = this.model.getRelationship(row).getDbRelationshipPath();
     }
 
     @Override
     protected void enterPressed(JTable table) {
         String dbRelationshipPath = ((JTextComponent) (comboBoxPathChooser).
                 getEditor().getEditorComponent()).getText();
+        changeObjEntity(dbRelationshipPath);
         Object currentNode = getCurrentNode(dbRelationshipPath);
         String[] pathStrings = dbRelationshipPath.split(Pattern.quote("."));
         String lastStringInPath = pathStrings[pathStrings.length - 1];
@@ -88,7 +92,9 @@ public class DbRelationshipPathComboBoxEditor extends PathChooserComboBoxCellEdi
                 if (table.getCellEditor() != null) {
 
                     table.getCellEditor().stopCellEditing();
-                    model.getRelationship(row).setDbRelationshipPath(dbRelationshipPath);
+                    if (dbRelationshipPath.equals(savePath)) {
+                        return;
+                    }
 
                     //we need object target to save it in model
                     DbEntity lastEntity = ((DbRelationship) currentNode).getTargetEntity();
@@ -96,17 +102,27 @@ public class DbRelationshipPathComboBoxEditor extends PathChooserComboBoxCellEdi
                             getDataMap().getMappedEntities(lastEntity);
                     ObjEntity objectTarget = objEntities.isEmpty() ? null : objEntities.iterator().next();
                     model.getRelationship(row).setTargetEntityName(objectTarget);
+                    model.setUpdatedValueAt(dbRelationshipPath, row, REL_TARGET_PATH_COLUMN);
+                    model.getRelationship(row).setDbRelationshipPath(dbRelationshipPath);
+                    model.getRelationship(row).setMapKey(null);
                 }
                 table.repaint();
-            } else {
-                enterPressedCount = 1;
             }
+            enterPressedCount = 1;
         }
     }
 
     @Override
+    protected void processDotEntered() {
+        super.processDotEntered();
+    }
+
+    @Override
     protected void parsePathString(char lastEnteredCharacter) {
         super.parsePathString(lastEnteredCharacter);
+        String dbRelationshipPath = ((JTextComponent) (comboBoxPathChooser).
+                getEditor().getEditorComponent()).getText();
+        changeObjEntity(dbRelationshipPath);
         enterPressedCount = 0;
     }
 
@@ -138,14 +154,26 @@ public class DbRelationshipPathComboBoxEditor extends PathChooserComboBoxCellEdi
         return pathString.replaceAll(lastStringInPath + '$', "");
     }
 
+    private void changeObjEntity(String path){
+        Object currentNode = getCurrentNode(path);
+        if (currentNode instanceof DbEntity){
+            return;
+        }
+        DbEntity lastEntity = ((DbRelationship) currentNode).getTargetEntity();
+        Collection<ObjEntity> objEntities = ((DbRelationship) currentNode).getTargetEntity().
+                getDataMap().getMappedEntities(lastEntity);
+        ObjEntity objectTarget = objEntities.isEmpty() ? null : objEntities.iterator().next();
+        model.getRelationship(row).setTargetEntityName(objectTarget);
+        table.repaint();
+    }
+
     @Override
-    public void actionPerformed(ActionEvent e) {
-        model.getRelationship(row).setMapKey(null);
+    public void focusGained(FocusEvent focusEvent) {
+    }
 
-        //for some reason dbRelationshipPathCombo don't load selected item text, so we made it by hand
-        if (comboBoxPathChooser.getSelectedIndex() != (-1)) {
-            ((JTextComponent) (comboBoxPathChooser).
-                    getEditor().getEditorComponent()).setText(comboBoxPathChooser.getSelectedItem().toString());
-        }
+    @Override
+    public void focusLost(FocusEvent focusEvent) {
+        String path = model.getRelationship(row).getDbRelationshipPath();
+        changeObjEntity(path);
     }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/c52fac63/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/PathChooserComboBoxCellEditor.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/PathChooserComboBoxCellEditor.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/PathChooserComboBoxCellEditor.java
index 051d8a4..07633da 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/PathChooserComboBoxCellEditor.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/PathChooserComboBoxCellEditor.java
@@ -19,6 +19,7 @@
 
 package org.apache.cayenne.modeler.util;
 
+import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.util.combo.AutoCompletion;
 import org.apache.commons.lang.StringUtils;
@@ -26,11 +27,20 @@ import org.apache.commons.lang.StringUtils;
 import javax.swing.AbstractCellEditor;
 import javax.swing.BorderFactory;
 import javax.swing.DefaultComboBoxModel;
+import javax.swing.DefaultListCellRenderer;
+import javax.swing.ImageIcon;
 import javax.swing.JComboBox;
 import javax.swing.JComponent;
+import javax.swing.JLabel;
+import javax.swing.JList;
+import javax.swing.JPanel;
 import javax.swing.JTable;
+import javax.swing.ListCellRenderer;
 import javax.swing.table.TableCellEditor;
 import javax.swing.text.JTextComponent;
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.Font;
 import java.awt.event.KeyAdapter;
 import java.awt.event.KeyEvent;
 import java.util.ArrayList;
@@ -76,24 +86,24 @@ public abstract class PathChooserComboBoxCellEditor extends AbstractCellEditor i
         AutoCompletion.enable(comboBoxPathChooser, true, true);
         ((JComponent) comboBoxPathChooser.getEditor().getEditorComponent()).setBorder(null);
         comboBoxPathChooser.setBorder(BorderFactory.createEmptyBorder(0,5,0,0));
+        comboBoxPathChooser.setRenderer(new PathChooserComboBoxCellRenderer());
     }
 
     private void setComboModelAccordingToPath(String pathString) {
         List<String> currentNodeChildren = new ArrayList<>();
-        currentNodeChildren.add(pathString);
         currentNodeChildren.addAll(getChildren(getCurrentNode(pathString), pathString));
         comboBoxPathChooser.setModel(new DefaultComboBoxModel(currentNodeChildren.toArray()));
+        comboBoxPathChooser.setSelectedItem(pathString);
         comboBoxPathChooser.showPopup();
         comboBoxPathChooser.setPopupVisible(true);
     }
 
     protected void parsePathString(char lastEnteredCharacter) {
         JTextComponent editorComponent = (JTextComponent) (comboBoxPathChooser).getEditor().getEditorComponent();
-
         String pathString = editorComponent.getText();
         if (pathString != null && pathString.isEmpty()) {
             setComboModelAccordingToPath("");
-            previousEmbeddedLevel = StringUtils.countMatches(pathString, ".");
+            previousEmbeddedLevel = 0;
             return;
         }
 
@@ -106,19 +116,19 @@ public abstract class PathChooserComboBoxCellEditor extends AbstractCellEditor i
         int currentEmbeddedLevel = StringUtils.countMatches(pathString, ".");
         if (previousEmbeddedLevel != currentEmbeddedLevel) {
             previousEmbeddedLevel = currentEmbeddedLevel;
-            List<String> currentNodeChildren = new ArrayList<>();
             String[] pathStrings = pathString.split(Pattern.quote("."));
             String lastStringInPath = pathStrings[pathStrings.length - 1];
             String saveDbAttributePath = pathString;
             pathString = pathString.replaceAll(lastStringInPath + "$", "");
+            List<String> currentNodeChildren = new ArrayList<>();
             currentNodeChildren.addAll(getChildren(getCurrentNode(pathString), pathString));
             comboBoxPathChooser.setModel(new DefaultComboBoxModel(currentNodeChildren.toArray()));
-            editorComponent.setText(saveDbAttributePath);
+            comboBoxPathChooser.setSelectedItem(saveDbAttributePath);
             return;
         }
     }
 
-    private void processDotEntered() {
+    protected void processDotEntered() {
         JTextComponent editorComponent = (JTextComponent) (comboBoxPathChooser).getEditor().getEditorComponent();
 
         String dbAttributePath = editorComponent.getText();
@@ -142,22 +152,22 @@ public abstract class PathChooserComboBoxCellEditor extends AbstractCellEditor i
             //previous root is treeModel.getRoot()
             dbAttributePathForPreviousNode = "";
         } else {
-            dbAttributePathForPreviousNode = dbAttributePath.replace('.' + lastStringInPath, "");
+            dbAttributePathForPreviousNode = dbAttributePath.replaceAll('.' + lastStringInPath + ".$", "");
         }
         List<String> potentialVariantsToChoose = getChildren(getCurrentNode(dbAttributePathForPreviousNode), "");
-        if (potentialVariantsToChoose.contains(lastStringInPath)) {
+        if (potentialVariantsToChoose.contains(lastStringInPath) &&
+                !(getCurrentNode(dbAttributePath) instanceof DbAttribute)) {
             setComboModelAccordingToPath(dbAttributePath);
         } else {
             editorComponent.setText(dbAttributePath.substring(0, dbAttributePath.length() - 1));
         }
-        previousEmbeddedLevel = StringUtils.countMatches(dbAttributePath, ".");
     }
 
     /**
-     * find current node by dbAttributePath
+     * find current node by path
      *
      * @param pathString
-     * @return last node in dbAttributePath which matches DbRelationship or DbAttribute
+     * @return last node in path which matches DbRelationship or DbAttribute
      */
     protected Object getCurrentNode(String pathString) {
         //case for new attribute
@@ -193,4 +203,32 @@ public abstract class PathChooserComboBoxCellEditor extends AbstractCellEditor i
         }
         return currentNodeChildren;
     }
+
+    private final class PathChooserComboBoxCellRenderer extends DefaultListCellRenderer {
+
+        private  final ImageIcon rightArrow = ModelerUtil.buildIcon("scroll_right.gif");
+
+        @Override
+        public Component getListCellRendererComponent(JList<?> list, Object value, int index,
+                                                      boolean isSelected, boolean cellHasFocus) {
+
+            JPanel panel = new JPanel(new BorderLayout());
+            JLabel label = new JLabel((String) value);
+            label.setFont(new Font("Verdana", Font.PLAIN , 12));
+            panel.add(label);
+
+            Object currentNode = getCurrentNode((String) value);
+            if (treeModel.isLeaf(currentNode)) {
+                ListCellRenderer leafRenderer = CellRenderers.listRenderer();
+                return leafRenderer.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
+            } else {
+                DefaultListCellRenderer nonLeafTextRenderer = new DefaultListCellRenderer();
+                Component text = nonLeafTextRenderer.getListCellRendererComponent(list, value, index, isSelected,
+                        cellHasFocus);
+                panel.setBackground(text.getBackground());
+                panel.add(new JLabel(rightArrow), BorderLayout.EAST);
+                return panel;
+            }
+        }
+    }
 }