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 <shestakalexa...@mail.ru> Authored: Mon Dec 14 16:15:13 2015 +0300 Committer: AlexandrShestak <shestakalexa...@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; + } + } + } }