You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2008/12/22 13:06:46 UTC

svn commit: r728657 - in /cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler: action/FindAction.java dialog/FindDialog.java dialog/FindDialogView.java

Author: aadamchik
Date: Mon Dec 22 04:06:46 2008
New Revision: 728657

URL: http://svn.apache.org/viewvc?rev=728657&view=rev
Log:
CAY-1156 Modeler search improvement

Modified:
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/FindAction.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/FindDialog.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/FindDialogView.java

Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/FindAction.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/FindAction.java?rev=728657&r1=728656&r2=728657&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/FindAction.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/FindAction.java Mon Dec 22 04:06:46 2008
@@ -24,16 +24,32 @@
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
+import javax.swing.JButton;
 import javax.swing.JTextField;
+import javax.swing.tree.TreePath;
 
+import org.apache.cayenne.access.DataDomain;
 import org.apache.cayenne.map.Attribute;
+import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbEntity;
+import org.apache.cayenne.map.DbRelationship;
 import org.apache.cayenne.map.Entity;
+import org.apache.cayenne.map.ObjAttribute;
 import org.apache.cayenne.map.ObjEntity;
+import org.apache.cayenne.map.ObjRelationship;
 import org.apache.cayenne.map.Relationship;
 import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.CayenneModelerFrame;
+import org.apache.cayenne.modeler.ProjectTreeModel;
 import org.apache.cayenne.modeler.dialog.FindDialog;
+import org.apache.cayenne.modeler.dialog.FindDialogView;
+import org.apache.cayenne.modeler.editor.EditorView;
+import org.apache.cayenne.modeler.event.AttributeDisplayEvent;
+import org.apache.cayenne.modeler.event.EntityDisplayEvent;
+import org.apache.cayenne.modeler.event.RelationshipDisplayEvent;
 import org.apache.cayenne.modeler.util.CayenneAction;
+import org.apache.cayenne.modeler.util.CayenneController;
 import org.apache.cayenne.project.ProjectPath;
 
 public class FindAction extends CayenneAction {
@@ -61,7 +77,7 @@
             Iterator it = getProjectController().getProject().treeNodes();
             while(it.hasNext()) {
                 ProjectPath path = (ProjectPath) it.next();
-
+                
                 Object o = path.getObject();
                 if ((o instanceof ObjEntity || o instanceof DbEntity) && matchFound(((Entity) o).getName(), pattern))
                     paths.add(path.getPath());
@@ -71,10 +87,19 @@
                     paths.add(path.getPath());
             }
         }
-
-        source.setText("");
-
-        new FindDialog(getApplication().getFrameController(), paths).startupAction();
+     
+        if(paths.size()!=1){
+            new FindDialog(getApplication().getFrameController(), paths).startupAction();
+        } else {
+            
+            Iterator it = paths.iterator();
+            int index = 0;
+            if (it.hasNext()) {
+                Object[] path = (Object[]) it.next();
+                EditorView editor =  ((CayenneModelerFrame) getApplication().getFrameController().getView()).getView();
+                FindDialog.jumpToResult(path, editor);
+            }   
+        }
     }
 
     private boolean matchFound(String entityName, Pattern pattern) {
@@ -82,4 +107,5 @@
 
         return m.find();
     }
+
 }

Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/FindDialog.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/FindDialog.java?rev=728657&r1=728656&r2=728657&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/FindDialog.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/FindDialog.java Mon Dec 22 04:06:46 2008
@@ -18,14 +18,20 @@
  ****************************************************************/
 package org.apache.cayenne.modeler.dialog;
 
+import java.awt.Color;
 import java.awt.Component;
+import java.awt.Font;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
+import java.awt.event.KeyEvent;
+import java.awt.event.KeyListener;
+import java.awt.image.ColorModel;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 
+import javax.swing.BorderFactory;
 import javax.swing.JButton;
 import javax.swing.JDialog;
 import javax.swing.tree.TreePath;
@@ -50,12 +56,17 @@
 import org.apache.cayenne.modeler.util.CayenneController;
 
 /**
- * An instance of this class is responsible for displaying search results
- * and navigating to the selected entity's representation.
+ * An instance of this class is responsible for displaying search results and navigating
+ * to the selected entity's representation.
  */
 public class FindDialog extends CayenneController {
+
     private FindDialogView view;
     private List paths;
+    private Integer selectedButton;
+    private Map EntityButtonsIdListAndButtonId;
+    private Font font;
+    private Font fontSelected;
 
     public FindDialog(CayenneController parent, java.util.List paths) {
         super(parent);
@@ -83,11 +94,9 @@
             if (path[path.length - 1] instanceof Relationship) {
                 relatNames.put(new Integer(index++), ((Relationship) path[path.length - 1]).getName());
             }
-
         }
 
         view = new FindDialogView(objEntityNames, dbEntityNames, attrNames, relatNames);
-
         initBindings();
     }
 
@@ -108,121 +117,186 @@
 
     protected void initBindings() {
         view.getOkButton().addActionListener(new ActionListener() {
+
             public void actionPerformed(ActionEvent e) {
                 view.dispose();
             }
         });
 
+        font = view.getOkButton().getFont();
+        fontSelected = new Font(font.getFamily(), font.BOLD, font.getSize() + 2);
+
+        Color color = view.getOkButton().getBackground();        
+        EntityButtonsIdListAndButtonId = new HashMap<Integer, Integer>();
+        Integer idEntityButtons = 0;
         Iterator it = view.getEntityButtons().iterator();
         while (it.hasNext()) {
             JButton b = (JButton) it.next();
             b.addActionListener(new JumpToResultActionListener());
+            b.addKeyListener(new JumpToResultsKeyListener());  
+            EntityButtonsIdListAndButtonId.put(((FindDialogView.EntityButtonModel) b.getModel()).getIndex().intValue(), idEntityButtons);
+            idEntityButtons++;
+        }
+        
+        if (view.getEntityButtons().size() > 0) {
+            selectedButton = 0;
+            ((JButton) view.getEntityButtons().get(selectedButton)).setFont(fontSelected);
+            
         }
     }
 
-    private class JumpToResultActionListener implements ActionListener {
-        private EditorView editor = ((CayenneModelerFrame) application.getFrameController().getView()).getView();
+    public static void jumpToResult(Object[] path, EditorView editor) {
+        
+        if (path[path.length - 1] instanceof Entity) {
+
+            /** Make selection in a project tree, open correspondent entity tab */
+            editor.getProjectTreeView().getSelectionModel().setSelectionPath(
+                    buildTreePath(path, editor));
+            EntityDisplayEvent event = new EntityDisplayEvent(
+                    editor.getProjectTreeView(),
+                    (Entity) path[path.length - 1],
+                    (DataMap) path[path.length - 2],
+                    (DataDomain) path[path.length - 3]);
+            event.setMainTabFocus(true);
+
+            if (path[path.length - 1] instanceof ObjEntity)
+                editor.getObjDetailView().currentObjEntityChanged(event);
+            if (path[path.length - 1] instanceof DbEntity)
+                editor.getDbDetailView().currentDbEntityChanged(event);
+        }
 
-        public void actionPerformed(ActionEvent e) {
-            JButton source = (JButton) e.getSource();
+        if (path[path.length - 1] instanceof Attribute
+                || path[path.length - 1] instanceof Relationship) {
 
-            Object[] path = (Object[]) paths.get(((FindDialogView.EntityButtonModel) source.getModel()).getIndex().intValue());
+            /** Make selection in a project tree, open correspondent attributes tab */
+            Object[] o = new Object[path.length - 1];
+            for (int i = 0; i < path.length - 1; i++)
+                o[i] = path[i];
+            editor.getProjectTreeView().getSelectionModel().setSelectionPath(
+                    buildTreePath(o, editor));
 
-            if(path[path.length - 1] instanceof Entity) {
+            if (path[path.length - 1] instanceof DbAttribute) {
+                AttributeDisplayEvent event = new AttributeDisplayEvent(
+                        editor.getProjectTreeView(),
+                        (Attribute) path[path.length - 1],
+                        (Entity) path[path.length - 2],
+                        (DataMap) path[path.length - 3],
+                        (DataDomain) path[path.length - 4]);
+                event.setMainTabFocus(true);
+                editor.getDbDetailView().currentDbAttributeChanged(event);
+            }
 
-                /** Make selection in a project tree, open correspondent entity tab */
-                editor.getProjectTreeView().getSelectionModel().setSelectionPath(buildTreePath(path));
-                EntityDisplayEvent event = new EntityDisplayEvent(
+            if (path[path.length - 1] instanceof ObjAttribute) {
+                AttributeDisplayEvent event = new AttributeDisplayEvent(
                         editor.getProjectTreeView(),
-                        (Entity) path[path.length - 1],
-                        (DataMap) path[path.length - 2],
-                        (DataDomain) path[path.length - 3]);
+                        (Attribute) path[path.length - 1],
+                        (Entity) path[path.length - 2],
+                        (DataMap) path[path.length - 3],
+                        (DataDomain) path[path.length - 4]);
                 event.setMainTabFocus(true);
+                editor.getObjDetailView().currentObjAttributeChanged(event);
+            }
 
-                if (path[path.length - 1] instanceof ObjEntity)
-                    editor.getObjDetailView().currentObjEntityChanged(event);
-                if (path[path.length - 1] instanceof DbEntity)
-                    editor.getDbDetailView().currentDbEntityChanged(event);
-            }
-
-            if(path[path.length - 1] instanceof Attribute || path[path.length - 1] instanceof Relationship) {
-
-                /** Make selection in a project tree, open correspondent attributes tab */
-                Object[] o = new Object[path.length - 1];
-                for(int i = 0; i < path.length - 1; i++)
-                    o[i] = path[i];
-                editor.getProjectTreeView().getSelectionModel().setSelectionPath(buildTreePath(o));
-
-
-                if (path[path.length - 1] instanceof DbAttribute) {
-                    AttributeDisplayEvent event = new AttributeDisplayEvent(
-                            editor.getProjectTreeView(),
-                            (Attribute) path[path.length - 1],
-                            (Entity) path[path.length - 2],
-                            (DataMap) path[path.length - 3],
-                            (DataDomain) path[path.length - 4]);
-                    event.setMainTabFocus(true);
-                    editor.getDbDetailView().currentDbAttributeChanged(event);
-                }
+            if (path[path.length - 1] instanceof DbRelationship) {
+                RelationshipDisplayEvent event = new RelationshipDisplayEvent(
+                        editor.getProjectTreeView(),
+                        (Relationship) path[path.length - 1],
+                        (Entity) path[path.length - 2],
+                        (DataMap) path[path.length - 3],
+                        (DataDomain) path[path.length - 4]);
+                event.setMainTabFocus(true);
+                editor.getDbDetailView().currentDbRelationshipChanged(event);
+            }
+        }
 
-                if (path[path.length - 1] instanceof ObjAttribute) {
-                    AttributeDisplayEvent event = new AttributeDisplayEvent(
-                            editor.getProjectTreeView(),
-                            (Attribute) path[path.length - 1],
-                            (Entity) path[path.length - 2],
-                            (DataMap) path[path.length - 3],
-                            (DataDomain) path[path.length - 4]);
-                    event.setMainTabFocus(true);
-                    editor.getObjDetailView().currentObjAttributeChanged(event);
-                }
+        if (path[path.length - 1] instanceof ObjRelationship) {
+            RelationshipDisplayEvent event = new RelationshipDisplayEvent(
+                    editor.getProjectTreeView(),
+                    (Relationship) path[path.length - 1],
+                    (Entity) path[path.length - 2],
+                    (DataMap) path[path.length - 3],
+                    (DataDomain) path[path.length - 4]);
+            event.setMainTabFocus(true);
+            editor.getObjDetailView().currentObjRelationshipChanged(event);
+        }
+    }
+
+    private class JumpToResultsKeyListener implements KeyListener {
 
-                if (path[path.length - 1] instanceof DbRelationship) {
-                    RelationshipDisplayEvent event = new RelationshipDisplayEvent(
-                            editor.getProjectTreeView(),
-                            (Relationship) path[path.length - 1],
-                            (Entity) path[path.length - 2],
-                            (DataMap) path[path.length - 3],
-                            (DataDomain) path[path.length - 4]
-                    );
-                    event.setMainTabFocus(true);
-                    editor.getDbDetailView().currentDbRelationshipChanged(event);
+        private EditorView editor = ((CayenneModelerFrame) application
+                .getFrameController().getView()).getView();
+        
+        public void keyPressed(KeyEvent e) { 
+            
+            if (e.getKeyCode() == KeyEvent.VK_UP) {
+                if (view.getEntityButtons().size() > 0 && selectedButton - 1 >= 0) {
+                    setSelectedButton(selectedButton-1);
+                  }
+            }
+            if (e.getKeyCode() == KeyEvent.VK_DOWN) {
+                    if (view.getEntityButtons().size() > 0 && selectedButton + 2 <= view.getEntityButtons().size()) {
+                    setSelectedButton(selectedButton+1);
                 }
             }
+            if (e.getKeyCode() == KeyEvent.VK_ENTER) {
+                JButton source = (JButton) view.getEntityButtons().get(selectedButton);
+                
+                setSelectedButton((Integer) EntityButtonsIdListAndButtonId.get(((FindDialogView.EntityButtonModel) source.getModel()).getIndex().intValue()));
+                Object[] path = (Object[]) paths.get(((FindDialogView.EntityButtonModel) source.getModel()).getIndex().intValue());
 
-                if (path[path.length - 1] instanceof ObjRelationship) {
-                    RelationshipDisplayEvent event = new RelationshipDisplayEvent(
-                            editor.getProjectTreeView(),
-                            (Relationship) path[path.length - 1],
-                            (Entity) path[path.length - 2],
-                            (DataMap) path[path.length - 3],
-                            (DataDomain) path[path.length - 4]
-                    );
-                    event.setMainTabFocus(true);
-                    editor.getObjDetailView().currentObjRelationshipChanged(event);
-                }
+                jumpToResult(path, editor);
+            }
         }
 
-        /**
-         * Builds a tree path for a given path. Urgent for later selection.
-         * @param path
-         * @return tree path
-         */
-        private TreePath buildTreePath(Object[] path) {
-            Object[] mutableTreeNodes = new Object[path.length];
-            mutableTreeNodes[0] = ((ProjectTreeModel) editor.getProjectTreeView().getModel()).getRootNode();
-
-            Object[] helper;
-            for(int i = 1; i < path.length; i++) {
-                helper = new Object[i];
-                for(int j = 0; j < i;) {
-                    helper[j] = path[++j];
-                }
-                mutableTreeNodes[i] = ((ProjectTreeModel) editor.getProjectTreeView().getModel()).getNodeForObjectPath(helper);
-            }
+        public void keyReleased(KeyEvent e) {
+        }
 
-            return new TreePath(mutableTreeNodes);
+        public void keyTyped(KeyEvent e) {
         }
 
     }
 
+    private class JumpToResultActionListener implements ActionListener {
+
+        private EditorView editor = ((CayenneModelerFrame) application.getFrameController().getView()).getView();
+
+        public void actionPerformed(ActionEvent e) {
+            JButton source = (JButton) e.getSource();
+            setSelectedButton((Integer) EntityButtonsIdListAndButtonId.get(((FindDialogView.EntityButtonModel) source.getModel()).getIndex().intValue()));
+            Object[] path = (Object[]) paths.get(((FindDialogView.EntityButtonModel) source.getModel()).getIndex().intValue());
+            jumpToResult(path, editor);   
+        }
+    }
+    
+    /**
+     * Builds a tree path for a given path. Urgent for later selection.
+     * 
+     * @param path
+     * @return tree path
+     */
+    private static TreePath buildTreePath(Object[] path, EditorView editor) {
+        Object[] mutableTreeNodes = new Object[path.length];
+        mutableTreeNodes[0] = ((ProjectTreeModel) editor
+                .getProjectTreeView()
+                .getModel()).getRootNode();
+
+        Object[] helper;
+        for (int i = 1; i < path.length; i++) {
+            helper = new Object[i];
+            for (int j = 0; j < i;) {
+                helper[j] = path[++j];
+            }
+            mutableTreeNodes[i] = ((ProjectTreeModel) editor
+                    .getProjectTreeView()
+                    .getModel()).getNodeForObjectPath(helper);
+        }
+        return new TreePath(mutableTreeNodes);
+    }
+    
+    private void setSelectedButton(Integer newSelectedButton) {
+        ((JButton) view.getEntityButtons().get(selectedButton)).setFont(font);
+        selectedButton = newSelectedButton;
+        ((JButton) view.getEntityButtons().get(selectedButton)).setFont(fontSelected);
+    }    
+
 }

Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/FindDialogView.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/FindDialogView.java?rev=728657&r1=728656&r2=728657&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/FindDialogView.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/FindDialogView.java Mon Dec 22 04:06:46 2008
@@ -19,9 +19,11 @@
 package org.apache.cayenne.modeler.dialog;
 
 import java.awt.BorderLayout;
+import java.awt.Component;
 import java.awt.Dimension;
 import java.awt.FlowLayout;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
 
@@ -46,38 +48,48 @@
  * Swing component displaying results produced by search feature.
  */
 public class FindDialogView extends JDialog {
+
     private JButton okButton;
     private java.util.List entityButtons;
 
-    public FindDialogView(Map objEntityNames, Map dbEntityNames, Map attrNames, Map relatNames) {
+    public FindDialogView(Map objEntityNames, Map dbEntityNames, Map attrNames,
+            Map relatNames) {
         entityButtons = new ArrayList();
 
         JPanel panel = new JPanel();
         panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
-        if (objEntityNames.isEmpty() && dbEntityNames.isEmpty() && attrNames.isEmpty() && relatNames.isEmpty()) {
+
+        if (objEntityNames.isEmpty()
+                && dbEntityNames.isEmpty()
+                && attrNames.isEmpty()
+                && relatNames.isEmpty()) {
             panel.add(new JLabel("Nothing found!"));
         } else {
-            panel.add(createResultPanel(
-                    objEntityNames, CellRenderers.iconForObject(new ObjEntity())));
-            panel.add(createResultPanel(
-                    dbEntityNames, CellRenderers.iconForObject(new DbEntity())));
-            panel.add(createResultPanel(
-                    attrNames, CellRenderers.iconForObject(new ObjAttribute())));
-            panel.add(createResultPanel(
-                    relatNames, CellRenderers.iconForObject(new ObjRelationship())));
+            panel.add(createResultPanel(objEntityNames, CellRenderers
+                    .iconForObject(new ObjEntity())));
+            panel.add(createResultPanel(dbEntityNames, CellRenderers
+                    .iconForObject(new DbEntity())));
+            panel.add(createResultPanel(attrNames, CellRenderers
+                    .iconForObject(new ObjAttribute())));
+            panel.add(createResultPanel(relatNames, CellRenderers
+                    .iconForObject(new ObjRelationship())));
         }
 
-        JPanel okPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
-        okButton = new JButton("OK");
-        okPanel.add(okButton);
-
-        JComponent contentPane = (JComponent) getContentPane();
-        contentPane.setLayout(new BorderLayout());
-        contentPane.add(new JScrollPane(panel, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED));
-        contentPane.add(okPanel, BorderLayout.SOUTH);
+            JPanel okPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
+            okButton = new JButton("OK");
+            okPanel.add(okButton);  
+            
+            JComponent contentPane = (JComponent) getContentPane();
+            
+            contentPane.setLayout(new BorderLayout());
+            contentPane.add(new JScrollPane(
+                    panel,
+                    JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
+                    JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED));
+            contentPane.add(okPanel, BorderLayout.SOUTH);
 
-        contentPane.setPreferredSize(new Dimension(400, 325));
-        setTitle("Search results");
+            contentPane.setPreferredSize(new Dimension(400, 325));            
+            setTitle("Search results"); 
     }
 
     private JPanel createResultPanel(Map names, Icon icon) {
@@ -85,10 +97,10 @@
         panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
 
         Iterator it = names.keySet().iterator();
-        while(it.hasNext()) {
+        while (it.hasNext()) {
             Integer index = (Integer) it.next();
             JButton b = new JButton((String) names.get(index), icon);
-            b.setBorder(new EmptyBorder(2, 10, 2, 10));       // top, left, bottom, right
+            b.setBorder(new EmptyBorder(2, 10, 2, 10)); // top, left, bottom, right
             b.setModel(new EntityButtonModel(index));
             panel.add(b);
 
@@ -107,6 +119,7 @@
     }
 
     public class EntityButtonModel extends DefaultButtonModel {
+
         private Integer index;
 
         EntityButtonModel(Integer index) {