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/30 17:28:29 UTC

svn commit: r730167 - 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: Tue Dec 30 08:28:28 2008
New Revision: 730167

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

patch #3 from Olga. Getting closer, just some minor visual OS X specific issues remain

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=730167&r1=730166&r2=730167&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 Tue Dec 30 08:28:28 2008
@@ -25,11 +25,8 @@
 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;
@@ -45,7 +42,6 @@
 import org.apache.cayenne.modeler.dialog.FindDialog;
 import org.apache.cayenne.modeler.editor.EditorView;
 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 {

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=730167&r1=730166&r2=730167&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 Tue Dec 30 08:28:28 2008
@@ -25,14 +25,16 @@
 import java.awt.event.ActionListener;
 import java.awt.event.KeyEvent;
 import java.awt.event.KeyListener;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
 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.JLabel;
+import javax.swing.JTable;
 import javax.swing.tree.TreePath;
 
 import org.apache.cayenne.access.DataDomain;
@@ -62,10 +64,18 @@
 
     private FindDialogView view;
     private List paths;
-    private Integer selectedButton;
-    private Map EntityButtonsIdListAndButtonId;
-    private Font font;
-    private Font fontSelected;
+    private static Font font;
+    private static Font fontSelected;
+
+
+    public static Font getFont() {
+        return font;
+    }
+
+    
+    public static Font getFontSelected() {
+        return fontSelected;
+    }
 
     public FindDialog(CayenneController parent, java.util.List paths) {
         super(parent);
@@ -89,8 +99,7 @@
             if (path[path.length - 1] instanceof Attribute) {
                 Object parentObject = ((Attribute) path[path.length - 1]).getParent(); 
                 attrNames.put(new Integer(index++), getParentName(path, parentObject) +"."+ ((Attribute) path[path.length - 1]).getName());
-           
-            }
+             }
 
             if (path[path.length - 1] instanceof Relationship) {
                 Object parentObject = ((Relationship) path[path.length - 1]).getParent(); 
@@ -126,21 +135,15 @@
         });
 
         font = view.getOkButton().getFont();
-        fontSelected = new Font(font.getFamily(), font.BOLD, font.getSize() + 2);
+        fontSelected = new Font(font.getFamily(), font.BOLD, font.getSize()+2 ); 
 
         Color color = view.getOkButton().getBackground();        
-        EntityButtonsIdListAndButtonId = new HashMap<Integer, Integer>();
-        Integer idEntityButtons = 0;
-        for (JButton b : view.getEntityButtons()) {
-            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);            
-        }
+  
+        JTable table = view.getTable();
+        
+        table.addKeyListener(new JumpToResultsKeyListener());
+        table.addMouseListener(new JumpToResultActionListener());       
+        table.getSelectionModel().setSelectionInterval(0, 0);
     }
 
     public static void jumpToResult(Object[] path, EditorView editor) {
@@ -219,54 +222,49 @@
         }
     }
 
-    private class JumpToResultsKeyListener implements KeyListener {
+    
+private class JumpToResultActionListener implements MouseListener {
+       private EditorView editor = ((CayenneModelerFrame) application.getFrameController().getView()).getView();
+       
+                public void mouseClicked(MouseEvent e) {
+                    JTable table = (JTable) e.getSource();  
+                    Integer selectedLine = table.getSelectionModel().getLeadSelectionIndex();
+                    JLabel label = (JLabel) table.getModel().getValueAt(selectedLine, 0);                   
+                    Integer index = (Integer) FindDialogView.getLabelAndObjectIndex().get(label);
+                     
+                    Object[] path = (Object[]) paths.get(index);
+                    jumpToResult(path, editor);
+                }
+
+                public void mouseEntered(MouseEvent e) {
+                }
+
+                public void mouseExited(MouseEvent e) {
+                }
+
+                public void mousePressed(MouseEvent e) {
+                }
+
+                public void mouseReleased(MouseEvent e) {
+                }
+    }
+
+private class JumpToResultsKeyListener implements KeyListener {
 
         private EditorView editor = ((CayenneModelerFrame) application
                 .getFrameController().getView()).getView();
-        
+     
         public void keyPressed(KeyEvent e) { 
-            if (e.getKeyCode() == KeyEvent.VK_PAGE_UP) {
-                if (view.getEntityButtons().size() > 0 && selectedButton - 1 >= 0) {
-                    if(selectedButton - 13 >= 0){
-                        setSelectedButton(selectedButton-13);
-                    } else {
-                        setSelectedButton(0);
-                    }
-               }
-            }
-            if (e.getKeyCode() == KeyEvent.VK_PAGE_DOWN) {
-                    if (view.getEntityButtons().size() > 0 && selectedButton + 2 <= view.getEntityButtons().size()) {
-                    if(selectedButton + 14 <= view.getEntityButtons().size()) {   
-                        setSelectedButton(selectedButton+13);
-                    } else {
-                        setSelectedButton(view.getEntityButtons().size()-1); 
-                    }
-               }
-            }
-            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_HOME) {
-                setSelectedButton(0);               
-            }
-            if (e.getKeyCode() == KeyEvent.VK_END) {
-                setSelectedButton(view.getEntityButtons().size()-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());
-
-                jumpToResult(path, editor);
+                JTable table = (JTable) e.getSource();  
+                Integer selectedLine = table.getSelectionModel().getLeadSelectionIndex();
+                JLabel label = (JLabel) table.getModel().getValueAt(selectedLine, 0);                   
+                Integer index = (Integer) FindDialogView.getLabelAndObjectIndex().get(label);
+                 
+                Object[] path = (Object[]) paths.get(index);
+                jumpToResult(path, editor);          
             }
         }
 
@@ -276,18 +274,6 @@
         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.
@@ -312,14 +298,8 @@
                     .getModel()).getNodeForObjectPath(helper);
         }
         return new TreePath(mutableTreeNodes);
-    }
-    
-    private void setSelectedButton(Integer newSelectedButton) {
-        ((JButton) view.getEntityButtons().get(selectedButton)).setFont(font);        
-        selectedButton = newSelectedButton;
-        FindDialogView.scrollPaneToPosition((selectedButton)*((JButton) view.getEntityButtons().get(selectedButton)).getHeight());        
-        ((JButton) view.getEntityButtons().get(selectedButton)).setFont(fontSelected);       
-    }    
+    }   
+  
     
     private String getParentName(Object[] path, Object  parentObject) {
         String nameParent = null;
@@ -334,5 +314,5 @@
         }
         return nameParent;
     }  
-
+   
 }

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=730167&r1=730166&r2=730167&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 Tue Dec 30 08:28:28 2008
@@ -19,25 +19,34 @@
 package org.apache.cayenne.modeler.dialog;
 
 import java.awt.BorderLayout;
+import java.awt.Color;
 import java.awt.Component;
 import java.awt.Dimension;
 import java.awt.FlowLayout;
-import java.util.ArrayList;
+import java.awt.event.KeyEvent;
+import java.util.Comparator;
 import java.util.HashMap;
 import java.util.Iterator;
+import java.util.LinkedHashMap;
 import java.util.Map;
+import java.util.TreeMap;
+import java.util.Map.Entry;
 
+import javax.swing.BorderFactory;
 import javax.swing.BoxLayout;
-import javax.swing.DefaultButtonModel;
 import javax.swing.Icon;
+import javax.swing.ImageIcon;
+import javax.swing.InputMap;
 import javax.swing.JButton;
 import javax.swing.JComponent;
 import javax.swing.JDialog;
 import javax.swing.JLabel;
 import javax.swing.JPanel;
 import javax.swing.JScrollPane;
-import javax.swing.SwingUtilities;
-import javax.swing.border.EmptyBorder;
+import javax.swing.JTable;
+import javax.swing.KeyStroke;
+import javax.swing.ListSelectionModel;
+import javax.swing.table.DefaultTableCellRenderer;
 
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.ObjAttribute;
@@ -51,31 +60,69 @@
 public class FindDialogView extends JDialog {
 
     private JButton okButton;
-    private java.util.List<JButton> entityButtons;
     private static JScrollPane scrollPane;
+    private JTable table;
+    private static Map LabelAndObjectIndex;
+    
+    
+    public static Map getLabelAndObjectIndex() {
+        return LabelAndObjectIndex;
+    }
+
+    public JTable getTable() {
+        return table;
+    }
 
     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()) {
             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())));
-        }
+            
+            int curentLineInTable = 0;
+            int sizeDataVector = objEntityNames.size() + dbEntityNames.size() + attrNames.size() + relatNames.size();
+            
+            Object[][] dataVector = new Object[sizeDataVector][];
+                      
+           TableModel tableModel = new TableModel();
+        
+           LabelAndObjectIndex = new HashMap<JLabel, Integer>();
+           
+           dataVector =  createResultTable(objEntityNames, CellRenderers
+                    .iconForObject(new ObjEntity()), dataVector, curentLineInTable);
+           curentLineInTable = objEntityNames.size();
+           dataVector =  createResultTable(dbEntityNames, CellRenderers
+                 .iconForObject(new DbEntity()), dataVector, curentLineInTable);
+          
+           curentLineInTable = curentLineInTable + dbEntityNames.size();
+           dataVector =  createResultTable(attrNames, CellRenderers
+                 .iconForObject(new ObjAttribute()), dataVector, curentLineInTable);
+           
+           curentLineInTable = curentLineInTable + attrNames.size();
+           dataVector =  createResultTable(relatNames, CellRenderers
+                 .iconForObject(new ObjRelationship()), dataVector, curentLineInTable);
+
+           tableModel.setDataVector(dataVector, new Object[]{""});
+            
+            table = new JTable(tableModel);
+             
+            table.getColumnModel().getColumn(0).setCellRenderer(new ImageRenderer());
+            table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
+            
+            InputMap im       = table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
+            InputMap imParent = im.getParent(); 
+            imParent.remove(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER,0));
+            im.setParent(imParent);
+            im.remove(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER,0));
+            table.setInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT,im);
+       }
 
             JPanel okPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
             okButton = new JButton("OK");
@@ -85,8 +132,8 @@
             
             contentPane.setLayout(new BorderLayout());
             
-            scrollPane = new JScrollPane(
-                    panel,
+            scrollPane = new JScrollPane( //panel
+                    table,
                     JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
                     JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
             
@@ -97,73 +144,83 @@
             setTitle("Search results"); 
     }
 
-    private JPanel createResultPanel(Map names, Icon icon) {
-        JPanel panel = new JPanel();
-        panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
-
-        Iterator it = names.keySet().iterator();
-        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.setModel(new EntityButtonModel(index));
-            panel.add(b);
+    private Object[][] createResultTable(Map names, Icon icon, Object[][] dataVector, int curentLineInTable){
+        
+        Comparator<String> comparer = new Comparator<String>() {
+            public int compare(String o1, String o2) {
+                    return o1.compareTo(o2);
+            }};
 
-            entityButtons.add(b);
+        Map sortedByNameMap = sortMapByValue(names, comparer);
+        
+        Iterator it = sortedByNameMap.keySet().iterator();
+        Object[] objectHelper = new Object[]{};
+         
+        while (it.hasNext()) {           
+            Integer index = (Integer) it.next(); 
+            JLabel labelIcon = new JLabel(); 
+            labelIcon.setIcon(icon);  
+            labelIcon.setVisible(true);
+            labelIcon.setText((String) sortedByNameMap.get(index));
+            objectHelper = new Object[]{labelIcon};  
+            dataVector[curentLineInTable] = objectHelper;            
+            LabelAndObjectIndex.put(labelIcon, index);
+            curentLineInTable++;            
         }
-
-        return panel;
+         
+        return dataVector;
     }
 
     public JButton getOkButton() {
         return okButton;
     }
-
-    public java.util.List<JButton> getEntityButtons() {
-        return entityButtons;
-    }
-
-    public class EntityButtonModel extends DefaultButtonModel {
-
-        private Integer index;
-
-        EntityButtonModel(Integer index) {
-            super();
-            this.index = index;
+    
+    public  <K, V> Map<K,V> sortMapByValue(Map<K, V> in, Comparator<? super V> compare) {
+        Map<V, K> swapped = new TreeMap<V, K>(compare);
+        for(Entry<K,V> entry: in.entrySet()) {
+                if (entry.getValue() != null) {
+                        swapped.put(entry.getValue(), entry.getKey());
+                }
         }
-
-        public Integer getIndex() {
-            return index;
+        LinkedHashMap<K, V> result = new LinkedHashMap<K, V>();
+        for(Entry<V,K> entry: swapped.entrySet()) {
+                if (entry.getValue() != null) {
+                        result.put(entry.getValue(), entry.getKey());
+                }
         }
+        return result;
     }
 
+}
+
+class ImageRenderer extends DefaultTableCellRenderer {
+    JLabel lbl = new JLabel();
+    ImageIcon icon = null;
     
-    public static void scrollPaneToBottom() {
-        
-        SwingUtilities.invokeLater(new Runnable() {
-            public void run() {
-                scrollPane.getVerticalScrollBar().setValue(
-                        scrollPane.getVerticalScrollBar().getMaximum());
-            }
-        });
+    ImageRenderer() {
+        super();
     }
     
-    public static void scrollPaneToUp() {
+    public Component getTableCellRendererComponent(JTable table, Object value,
+                                                   boolean isSelected, boolean hasFocus, 
+                                                   int row, int column) {   
+        lbl.setOpaque(true);
+        lbl.setText(((JLabel)value).getText().toString());
+        lbl.setIcon(((JLabel)value).getIcon());
+        int thickness;
+        lbl.setBorder( BorderFactory.createLineBorder(Color.LIGHT_GRAY,thickness =0));
         
-        SwingUtilities.invokeLater(new Runnable() {
-            public void run() {
-                scrollPane.getVerticalScrollBar().setValue(
-                        scrollPane.getVerticalScrollBar().getMinimum());
-            }
-        });
-    }
-  
-    public static void scrollPaneToPosition(final int position) {
-      
-      SwingUtilities.invokeLater(new Runnable() {
-          public void run() {
-              scrollPane.getVerticalScrollBar().setValue(position);
-          }
-      });
-   }
+        lbl.setHorizontalAlignment(JLabel.LEFT);
+        {             
+            lbl.setFont(isSelected ? FindDialog.getFontSelected() :  FindDialog.getFont());   
+        }
+         return lbl;
+    }        
+} 
+
+
+class TableModel extends javax.swing.table.DefaultTableModel {
+    public boolean isCellEditable(int row, int col) {
+        return false;
+    } 
 }