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:05 UTC

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

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;
+            }
+        }
+    }
 }