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