You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by nt...@apache.org on 2017/01/23 15:08:17 UTC

cayenne git commit: CAY-2185 partial fix plus refactoring and cleanup of FindAction and related classes

Repository: cayenne
Updated Branches:
  refs/heads/master 0cd154d42 -> c24bb767e


CAY-2185 partial fix plus refactoring and cleanup of FindAction and related classes


Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/c24bb767
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/c24bb767
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/c24bb767

Branch: refs/heads/master
Commit: c24bb767ecdab5860bc3606711f73f7ee805d31e
Parents: 0cd154d
Author: Nikita Timofeev <st...@gmail.com>
Authored: Mon Jan 23 18:07:37 2017 +0300
Committer: Nikita Timofeev <st...@gmail.com>
Committed: Mon Jan 23 18:07:37 2017 +0300

----------------------------------------------------------------------
 .../cayenne/modeler/ProjectTreeFactory.java     |   2 +-
 .../cayenne/modeler/action/FindAction.java      | 418 +++++++++++++------
 .../cayenne/modeler/dialog/FindDialog.java      | 389 ++---------------
 .../cayenne/modeler/dialog/FindDialogView.java  | 189 ++-------
 .../modeler/event/AttributeDisplayEvent.java    |  20 +-
 .../cayenne/modeler/graph/BaseGraphBuilder.java |   6 +-
 .../graph/action/EntityDisplayAction.java       |  28 +-
 .../cayenne/swing/ImageRendererColumn.java      |  26 +-
 8 files changed, 384 insertions(+), 694 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/c24bb767/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ProjectTreeFactory.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ProjectTreeFactory.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ProjectTreeFactory.java
index 4fec9c6..88aabba 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ProjectTreeFactory.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ProjectTreeFactory.java
@@ -51,7 +51,7 @@ public class ProjectTreeFactory {
         private LinkedList<DefaultMutableTreeNode> stack;
 
         TreeWrapper() {
-            stack = new LinkedList<DefaultMutableTreeNode>();
+            stack = new LinkedList<>();
         }
 
         private <T extends Comparable<T>> Collection<T> sort(Collection<T> unsorted) {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/c24bb767/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/FindAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/FindAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/FindAction.java
index 05ca95d..068c737 100755
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/FindAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/FindAction.java
@@ -19,30 +19,61 @@
 package org.apache.cayenne.modeler.action;
 
 import org.apache.cayenne.configuration.DataChannelDescriptor;
+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.Embeddable;
 import org.apache.cayenne.map.EmbeddableAttribute;
+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.ProjectTreeView;
 import org.apache.cayenne.modeler.dialog.FindDialog;
+import org.apache.cayenne.modeler.editor.EditorView;
+import org.apache.cayenne.modeler.event.AttributeDisplayEvent;
+import org.apache.cayenne.modeler.event.EmbeddableAttributeDisplayEvent;
+import org.apache.cayenne.modeler.event.EmbeddableDisplayEvent;
+import org.apache.cayenne.modeler.event.EntityDisplayEvent;
+import org.apache.cayenne.modeler.event.QueryDisplayEvent;
+import org.apache.cayenne.modeler.event.RelationshipDisplayEvent;
 import org.apache.cayenne.modeler.util.CayenneAction;
 import org.apache.cayenne.map.QueryDescriptor;
 
 import javax.swing.JTextField;
+import javax.swing.tree.DefaultMutableTreeNode;
+import javax.swing.tree.TreePath;
 import java.awt.Color;
 import java.awt.event.ActionEvent;
 import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.regex.Matcher;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 import java.util.regex.Pattern;
 
 public class FindAction extends CayenneAction {
-    private java.util.List<Object> paths;
+
+    /**
+     * Result sort priority based on result type
+     */
+    private static final Map<Class<?>, Integer> PRIORITY_BY_TYPE = new HashMap<>();
+    static {
+        PRIORITY_BY_TYPE.put(ObjEntity.class,         1);
+        PRIORITY_BY_TYPE.put(DbEntity.class,          2);
+        PRIORITY_BY_TYPE.put(ObjAttribute.class,      5);
+        PRIORITY_BY_TYPE.put(DbAttribute.class,       6);
+        PRIORITY_BY_TYPE.put(ObjRelationship.class,   7);
+        PRIORITY_BY_TYPE.put(DbRelationship.class,    8);
+        PRIORITY_BY_TYPE.put(QueryDescriptor.class,   9);
+        PRIORITY_BY_TYPE.put(Embeddable.class,        10);
+    }
 
     public static String getActionName() {
         return "Find";
@@ -54,144 +85,277 @@ public class FindAction extends CayenneAction {
 
     /**
      * All entities that contain a pattern substring (case-indifferent) in the name are produced.
-     * @param e
      */
     public void performAction(ActionEvent e) {
         JTextField source = (JTextField) e.getSource();
-        String sourceStr = source.getText().trim();
+        String searchStr = source.getText().trim();
+        if (searchStr.startsWith("*")) {
+            searchStr = searchStr.substring(1);
+        }
+
+        if(searchStr.isEmpty()) {
+            markEmptySearch(source);
+            return;
+        }
+
+        List<SearchResultEntry> searchResults = search(searchStr);
+        if(searchResults.isEmpty()){
+            markEmptySearch(source);
+        } else if(searchResults.size() == 1){
+            jumpToResult(searchResults.iterator().next());
+        } else {
+            new FindDialog(getApplication().getFrameController(), searchResults).startupAction();
+        }
+    }
+
+    private void markEmptySearch(JTextField source) {
+        source.setBackground(Color.pink);
+    }
+
+    /**
+     * Navigate to search result
+     * Used also in {@link org.apache.cayenne.modeler.graph.action.EntityDisplayAction}
+     */
+    public static void jumpToResult(FindAction.SearchResultEntry searchResultEntry) {
+        EditorView editor = ((CayenneModelerFrame) Application.getInstance().getFrameController().getView()).getView();
+        DataChannelDescriptor domain = (DataChannelDescriptor) Application.getInstance().getProject().getRootNode();
+
+        if (searchResultEntry.getObject() instanceof Entity) {
+            jumpToEntityResult((Entity) searchResultEntry.getObject(), editor, domain);
+        } else if (searchResultEntry.getObject() instanceof QueryDescriptor) {
+            jumpToQueryResult((QueryDescriptor)searchResultEntry.getObject(), editor, domain);
+        } else if (searchResultEntry.getObject() instanceof Embeddable) {
+            jumpToEmbeddableResult((Embeddable)searchResultEntry.getObject(), editor, domain);
+        } else if (searchResultEntry.getObject() instanceof EmbeddableAttribute) {
+            jumpToEmbeddableAttributeResult((EmbeddableAttribute)searchResultEntry.getObject(), editor, domain);
+        } else if (searchResultEntry.getObject() instanceof Attribute || searchResultEntry.getObject() instanceof Relationship) {
+            jumpToAttributeResult(searchResultEntry, editor, domain);
+        }
+    }
+
+    private List<SearchResultEntry> search(String searchStr) {
+        Pattern pattern = Pattern.compile(searchStr, Pattern.CASE_INSENSITIVE);
+        List<SearchResultEntry> result = new ArrayList<>();
+        for (DataMap dataMap : ((DataChannelDescriptor) getProjectController().getProject().getRootNode()).getDataMaps()) {
+            searchInQueryDescriptors(pattern, result, dataMap);
+            searchInEmbeddables(pattern, result, dataMap);
+            searchInDbEntities(pattern, result, dataMap);
+            searchInObjEntities(pattern, result, dataMap);
+        }
+        Collections.sort(result);
+        return result;
+    }
+
+    private void searchInQueryDescriptors(Pattern pattern, List<SearchResultEntry> result, DataMap dataMap) {
+        for (QueryDescriptor q : dataMap.getQueryDescriptors()) {
+            if (match(q.getName(), pattern)) {
+                result.add(new SearchResultEntry(q, q.getName()));
+            }
+        }
+    }
 
-        paths = new ArrayList<>();
-        if (sourceStr != null && !sourceStr.isEmpty()) {
+    private void searchInEmbeddables(Pattern pattern, List<SearchResultEntry> result, DataMap dataMap) {
+        for (Embeddable emb : dataMap.getEmbeddables()) {
+            if (match(emb.getClassName(), pattern)) {
+                result.add(new SearchResultEntry(emb, emb.getClassName()));
+            }
+            for (EmbeddableAttribute attr : emb.getAttributes()) {
+                if (match(attr.getName(), pattern)) {
+                    result.add(new SearchResultEntry(attr, emb.getClassName() + "." + attr.getName()));
+                }
+            }
+        }
+    }
 
-            if (sourceStr.startsWith("*")) {
-                sourceStr = sourceStr.substring(1);
+    private void searchInObjEntities(Pattern pattern, List<SearchResultEntry> result, DataMap dataMap) {
+        for (ObjEntity ent : dataMap.getObjEntities()) {
+            if (match(ent.getName(), pattern)) {
+                result.add(new SearchResultEntry(ent, ent.getName()));
             }
+            for (ObjAttribute attr : ent.getAttributes()) {
+                if (match(attr.getName(), pattern)) {
+                    result.add(new SearchResultEntry(attr, ent.getName() + "." + attr.getName()));
+                }
+            }
+            for (ObjRelationship rel : ent.getRelationships()) {
+                if (match(rel.getName(), pattern)) {
+                    result.add(new SearchResultEntry(rel, ent.getName() + "." + rel.getName()));
+                }
+            }
+        }
+    }
 
-            Pattern pattern = Pattern.compile(sourceStr, Pattern.CASE_INSENSITIVE);
-
-            Iterator<DataMap> it = ((DataChannelDescriptor)getProjectController().getProject().getRootNode()).getDataMaps().iterator();
-            
-            while(it.hasNext()) {
-                
-                  DataMap dm = it.next();
-                 
-                  Iterator<QueryDescriptor> querIterator = dm.getQueryDescriptors().iterator();
-                  
-                  while(querIterator.hasNext()) {
-                      QueryDescriptor q = querIterator.next();
-                      if(matchFound(q.getName(), pattern)){
-                          paths.add(q);
-                      }
-                  }
-                  
-                  Iterator<Embeddable> embIterator = dm.getEmbeddables().iterator();
-                  
-                  while(embIterator.hasNext()) {
-                      Embeddable emb = embIterator.next();
-                      if(matchFound(emb.getClassName(), pattern)){
-                          paths.add(emb);
-                      }
-                      
-                      Iterator<EmbeddableAttribute> attrIterator = emb.getAttributes().iterator();
-                      
-                      while(attrIterator.hasNext()) {
-                          EmbeddableAttribute attr = attrIterator.next();
-                          if(matchFound(attr.getName(), pattern)){
-                              paths.add(attr);
-                          }
-                      }
-                  }
-                  
-                  
-                  Iterator<DbEntity> dbEntIterator = dm.getDbEntities().iterator();
-                  
-                  while(dbEntIterator.hasNext()) {
-                      DbEntity ent = dbEntIterator.next();
-                      if(matchFound(ent.getName(), pattern)){
-                          paths.add(ent);
-                      }
-                      
-                      Iterator<DbAttribute> attrIterator = ent.getAttributes().iterator();
-                      
-                      while(attrIterator.hasNext()) {
-                          DbAttribute attr = attrIterator.next();
-                          if(matchFound(attr.getName(), pattern)){
-                              paths.add(attr);
-                          }
-                      }
-                      
-                      Iterator<DbRelationship> relIterator = ent.getRelationships().iterator();
-                      
-                      while(relIterator.hasNext()) {
-                          DbRelationship rel = relIterator.next();
-                          if(matchFound(rel.getName(), pattern)){
-                              paths.add(rel);
-                          }
-                      }
-
-                      String catalog = ent.getCatalog();
-                      if (catalog != null && !catalog.isEmpty()) {
-                          if(matchFound(catalog, pattern) && !paths.contains(ent)){
-                              paths.add(ent);
-                          }
-                      }
-
-                      String schema = ent.getSchema();
-                      if (schema != null && !schema.isEmpty()) {
-                          if(matchFound(schema, pattern) && !paths.contains(ent)){
-                              paths.add(ent);
-                          }
-                      }
-
-                  }
-                  
-                  Iterator<ObjEntity> entIterator = dm.getObjEntities().iterator();
-                  
-                  while(entIterator.hasNext()) {
-                      ObjEntity ent = entIterator.next();
-                      if(matchFound(ent.getName(), pattern)){
-                          paths.add(ent);
-                      }
-                      
-                      Iterator<ObjAttribute> attrIterator = ent.getAttributes().iterator();
-                      
-                      while(attrIterator.hasNext()) {
-                          ObjAttribute attr = attrIterator.next();
-                          if(matchFound(attr.getName(), pattern)){
-                              paths.add(attr);
-                          }
-                      }
-                      
-                      Iterator<ObjRelationship> relIterator = ent.getRelationships().iterator();
-                      
-                      while(relIterator.hasNext()) {
-                          ObjRelationship rel = relIterator.next();
-                          if(matchFound(rel.getName(), pattern)){
-                              paths.add(rel);
-                          }
-                      }
-                  }
+    private void searchInDbEntities(Pattern pattern, List<SearchResultEntry> result, DataMap dataMap) {
+        for (DbEntity ent : dataMap.getDbEntities()) {
+            if (match(ent.getName(), pattern)) {
+                result.add(new SearchResultEntry(ent, ent.getName()));
+            }
+            for (DbAttribute attr : ent.getAttributes()) {
+                if (match(attr.getName(), pattern)) {
+                    result.add(new SearchResultEntry(attr, ent.getName() + "." + attr.getName()));
+                }
             }
+            for (DbRelationship rel : ent.getRelationships()) {
+                if (match(rel.getName(), pattern)) {
+                    result.add(new SearchResultEntry(rel, ent.getName() + "." + rel.getName()));
+                }
+            }
+
+            checkCatalogOrSchema(pattern, result, ent, ent.getCatalog());
+            checkCatalogOrSchema(pattern, result, ent, ent.getSchema());
         }
-     
-        if(paths.size()==0){
-            source.setBackground(Color.pink);
-        } else if(paths.size()!=1){
-            new FindDialog(getApplication().getFrameController(), paths).startupAction();
+    }
+
+    private void checkCatalogOrSchema(Pattern pattern, List<SearchResultEntry> paths, DbEntity ent, String catalogOrSchema) {
+        if (catalogOrSchema != null && !catalogOrSchema.isEmpty()) {
+            if (match(catalogOrSchema, pattern)) {
+                SearchResultEntry entry = new SearchResultEntry(ent, ent.getName());
+                if(!paths.contains(entry)) {
+                    paths.add(entry);
+                }
+            }
+        }
+    }
+
+    private boolean match(String entityName, Pattern pattern) {
+        return pattern.matcher(entityName).find();
+    }
+
+    private static void jumpToAttributeResult(SearchResultEntry searchResultEntry, EditorView editor, DataChannelDescriptor domain) {
+        DataMap map;
+        Entity entity;
+        if (searchResultEntry.getObject() instanceof Attribute) {
+            map = ((Attribute) searchResultEntry.getObject()).getEntity().getDataMap();
+            entity = ((Attribute) searchResultEntry.getObject()).getEntity();
         } else {
-           
-            Iterator it = paths.iterator();
-            if (it.hasNext()) {
-                Object path = it.next();
-                FindDialog.jumpToResult(path);
-            }   
+            map = ((Relationship) searchResultEntry.getObject()).getSourceEntity().getDataMap();
+            entity = ((Relationship) searchResultEntry.getObject()).getSourceEntity();
         }
+        buildAndSelectTreePath(map, entity, editor);
+
+        if (searchResultEntry.getObject() instanceof Attribute) {
+            AttributeDisplayEvent event = new AttributeDisplayEvent(editor.getProjectTreeView(),
+                    (Attribute) searchResultEntry.getObject(), entity, map, domain);
+            event.setMainTabFocus(true);
+            if(searchResultEntry.getObject() instanceof DbAttribute) {
+                editor.getDbDetailView().currentDbAttributeChanged(event);
+            } else {
+                editor.getObjDetailView().currentObjAttributeChanged(event);
+            }
+        } else if (searchResultEntry.getObject() instanceof Relationship) {
+            RelationshipDisplayEvent event = new RelationshipDisplayEvent(editor.getProjectTreeView(),
+                    (Relationship) searchResultEntry.getObject(), entity, map, domain);
+            event.setMainTabFocus(true);
+            if(searchResultEntry.getObject() instanceof DbRelationship) {
+                editor.getDbDetailView().currentDbRelationshipChanged(event);
+            } else {
+                editor.getObjDetailView().currentObjRelationshipChanged(event);
+            }
+        }
+    }
+
+    private static void jumpToEmbeddableAttributeResult(EmbeddableAttribute attribute, EditorView editor, DataChannelDescriptor domain) {
+        Embeddable embeddable = attribute.getEmbeddable();
+        DataMap map = embeddable.getDataMap();
+        buildAndSelectTreePath(map, embeddable, editor);
+        EmbeddableAttributeDisplayEvent event = new EmbeddableAttributeDisplayEvent(editor.getProjectTreeView(),
+                embeddable, attribute, map, domain);
+        event.setMainTabFocus(true);
+        editor.getEmbeddableView().currentEmbeddableAttributeChanged(event);
+    }
+
+    private static void jumpToEmbeddableResult(Embeddable embeddable, EditorView editor, DataChannelDescriptor domain) {
+        DataMap map = embeddable.getDataMap();
+        buildAndSelectTreePath(map, embeddable, editor);
+        EmbeddableDisplayEvent event = new EmbeddableDisplayEvent(editor.getProjectTreeView(), embeddable, map, domain);
+        event.setMainTabFocus(true);
+        editor.currentEmbeddableChanged(event);
+    }
+
+    private static void jumpToQueryResult(QueryDescriptor queryDescriptor, EditorView editor, DataChannelDescriptor domain) {
+        DataMap map = queryDescriptor.getDataMap();
+        buildAndSelectTreePath(map, queryDescriptor, editor);
+        QueryDisplayEvent event = new QueryDisplayEvent(editor.getProjectTreeView(), queryDescriptor, map, domain);
+        editor.currentQueryChanged(event);
     }
 
-    private boolean matchFound(String entityName, Pattern pattern) {
-        Matcher m = pattern.matcher(entityName);
+    private static void jumpToEntityResult(Entity entity, EditorView editor, DataChannelDescriptor domain) {
+        DataMap map = entity.getDataMap();
+        buildAndSelectTreePath(map, entity, editor);
+        EntityDisplayEvent event = new EntityDisplayEvent(editor.getProjectTreeView(), entity, map, domain);
+        event.setMainTabFocus(true);
 
-        return m.find();
+        if (entity instanceof ObjEntity) {
+            editor.getObjDetailView().currentObjEntityChanged(event);
+        } else if (entity instanceof DbEntity) {
+            editor.getDbDetailView().currentDbEntityChanged(event);
+        }
     }
 
+    /**
+     * Builds a tree path for a given path and make selection in it
+     */
+    private static TreePath buildAndSelectTreePath(DataMap map, Object object, EditorView editor) {
+        ProjectTreeView projectTreeView = editor.getProjectTreeView();
+        ProjectTreeModel treeModel = (ProjectTreeModel) projectTreeView.getModel();
+
+        DefaultMutableTreeNode[] mutableTreeNodes = new DefaultMutableTreeNode[] {
+            treeModel.getRootNode(),
+            treeModel.getNodeForObjectPath(new Object[]{map}),
+            treeModel.getNodeForObjectPath(new Object[]{map, object})
+        };
+
+        TreePath treePath = new TreePath(mutableTreeNodes);
+        if (!projectTreeView.isExpanded(treePath.getParentPath())) {
+            projectTreeView.expandPath(treePath.getParentPath());
+        }
+        projectTreeView.getSelectionModel().setSelectionPath(treePath);
+        return treePath;
+    }
+
+    /**
+     * Search result holder
+     */
+    public static class SearchResultEntry implements Comparable<SearchResultEntry>{
+        private final Object object;
+        private final String name;
+
+        public SearchResultEntry(Object object, String name) {
+            this.object = object;
+            this.name = name;
+        }
+
+        public String getName() {
+            return name;
+        }
+
+        public Object getObject() {
+            return object;
+        }
+
+        @Override
+        public boolean equals(Object o) {
+            if (this == o) return true;
+            if (o == null || getClass() != o.getClass()) return false;
+            SearchResultEntry entry = (SearchResultEntry) o;
+            return name.equals(entry.name) && object.getClass().equals(entry.object.getClass());
+        }
+
+        @Override
+        public int hashCode() {
+            int result = object.getClass().hashCode();
+            result = 31 * result + name.hashCode();
+            return result;
+        }
+
+        @Override
+        public int compareTo(SearchResultEntry o) {
+            int res = PRIORITY_BY_TYPE.get(getObject().getClass())
+                    - PRIORITY_BY_TYPE.get(o.getObject().getClass());
+            if(res != 0) {
+                return res;
+            }
+            return getName().compareTo(o.getName());
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/c24bb767/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/FindDialog.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/FindDialog.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/FindDialog.java
index 99fc743..e0e30e7 100755
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/FindDialog.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/FindDialog.java
@@ -18,38 +18,20 @@
  ****************************************************************/
 package org.apache.cayenne.modeler.dialog;
 
-import org.apache.cayenne.configuration.DataChannelDescriptor;
-import org.apache.cayenne.map.*;
-import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.CayenneModelerFrame;
-import org.apache.cayenne.modeler.ProjectTreeModel;
-import org.apache.cayenne.modeler.ProjectTreeView;
-import org.apache.cayenne.modeler.editor.EditorView;
-import org.apache.cayenne.modeler.event.AttributeDisplayEvent;
-import org.apache.cayenne.modeler.event.EmbeddableAttributeDisplayEvent;
-import org.apache.cayenne.modeler.event.EmbeddableDisplayEvent;
-import org.apache.cayenne.modeler.event.EntityDisplayEvent;
-import org.apache.cayenne.modeler.event.QueryDisplayEvent;
-import org.apache.cayenne.modeler.event.RelationshipDisplayEvent;
+import org.apache.cayenne.modeler.action.FindAction;
 import org.apache.cayenne.modeler.util.CayenneController;
-import org.apache.cayenne.query.*;
 
 import javax.swing.JDialog;
-import javax.swing.JLabel;
 import javax.swing.JTable;
-import javax.swing.tree.TreePath;
 import java.awt.Component;
-import java.awt.Font;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
+import java.awt.event.InputEvent;
 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;
 
 /**
  * An instance of this class is responsible for displaying search results and navigating
@@ -58,93 +40,13 @@ import java.util.Map;
 public class FindDialog extends CayenneController {
 
     private FindDialogView view;
-    private List paths;
-    private static Font font;
-    private static Font fontSelected;
+    private List<FindAction.SearchResultEntry> searchResults;
 
-    public static Font getFont() {
-        return font;
-    }
-
-    public static Font getFontSelected() {
-        return fontSelected;
-    }
-
-    public FindDialog(CayenneController parent, List paths) {
+    public FindDialog(CayenneController parent, List<FindAction.SearchResultEntry> searchResults) {
         super(parent);
 
-        this.paths = paths;
-
-        Map<Integer, String> objEntityNames = new HashMap<>();
-        Map<Integer, String> dbEntityNames = new HashMap<>();
-        Map<Integer, String> attrNames = new HashMap<>();
-        Map<Integer, String> relatNames = new HashMap<>();
-        Map<Integer, String> queryNames = new HashMap<>();
-        Map<Integer, String> embeddableNames = new HashMap<>();
-        Map<Integer, String> embeddableAttributeNames = new HashMap<>();
-        Iterator it = paths.iterator();
-        int index = 0;
-        while (it.hasNext()) {
-            Object path = it.next();
-
-            if (path instanceof ObjEntity) {
-                objEntityNames.put(new Integer(index++), ((ObjEntity) path).getName());
-            }
-
-            else if (path instanceof DbEntity) {
-                dbEntityNames.put(new Integer(index++), ((DbEntity) path).getName());
-            }
-
-            else if (path instanceof Query) {
-                queryNames.put(new Integer(index++), ((Query) path).getName());
-            }
-
-            else if (path instanceof Embeddable) {
-                String name = ((Embeddable) path).getClassName();
-                embeddableNames.put(new Integer(index++), name);
-            }
-
-            else if (path instanceof EmbeddableAttribute) {
-                Embeddable parentObject = ((EmbeddableAttribute) path).getEmbeddable();
-                embeddableAttributeNames.put(new Integer(index++), parentObject
-                        .getClassName()
-                        + "."
-                        + ((EmbeddableAttribute) path).getName());
-            }
-            else if (path instanceof Attribute) {
-                Object parentObject = ((Attribute) path).getParent();
-                attrNames.put(new Integer(index++), getParentName(parentObject)
-                        + "."
-                        + ((Attribute) path).getName());
-            }
-
-            else if (path instanceof Relationship) {
-                Object parentObject = ((Relationship) path).getParent();
-
-                /*
-                 * relationships are different from attributes in that they do not
-                 * correctly return the owning entity when inheritance is involved.
-                 * Hopefully this will be reconciled in the future relases
-                 */
-                String parentName = getParentName(parentObject);
-                // if (!parentObject.equals(path)) {
-                // parentName = ((ObjEntity) path[path.length - 2]).getName();
-                // }
-
-                relatNames.put(new Integer(index++), parentName
-                        + "."
-                        + ((Relationship) path).getName());
-            }
-        }
-
-        view = new FindDialogView(
-                objEntityNames,
-                dbEntityNames,
-                attrNames,
-                relatNames,
-                queryNames,
-                embeddableNames,
-                embeddableAttributeNames);
+        this.searchResults = searchResults;
+        view = new FindDialogView(searchResults);
         initBindings();
     }
 
@@ -155,7 +57,6 @@ public class FindDialog extends CayenneController {
         makeCloseableOnEscape();
 
         view.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
-        view.setModal(true);
         view.setVisible(true);
     }
 
@@ -171,275 +72,41 @@ public class FindDialog extends CayenneController {
             }
         });
 
-        font = view.getOkButton().getFont();
-        fontSelected = new Font(font.getFamily(), font.BOLD, font.getSize() + 2);
-
         JTable table = view.getTable();
-        table.setRowHeight(fontSelected.getSize() + 6);
-        table.setRowMargin(0);
-        table.addKeyListener(new JumpToResultsKeyListener());
-        table.addMouseListener(new JumpToResultActionListener());
+        table.setRowHeight(24);
+        table.setRowMargin(3);
+        JumpToResultActionListener listener = new JumpToResultActionListener();
+        table.addKeyListener(listener);
+        table.addMouseListener(listener);
         table.getSelectionModel().setSelectionInterval(0, 0);
     }
 
-    public static void jumpToResult(Object path) {
-        EditorView editor = ((CayenneModelerFrame) Application
-                .getInstance()
-                .getFrameController()
-                .getView()).getView();
-        DataChannelDescriptor domain = (DataChannelDescriptor) Application
-                .getInstance()
-                .getProject()
-                .getRootNode();
-        if (path instanceof Entity) {
-
-            Object[] o = new Object[3];
-            o[0] = domain;
-            o[1] = ((Entity) path).getDataMap();
-            o[2] = (Entity) path;
-
-            TreePath treePath = buildTreePath(o, editor);
-            ProjectTreeView projectTreeView = editor.getProjectTreeView();
-            if (!projectTreeView.isExpanded(treePath.getParentPath())) {
-                projectTreeView.expandPath(treePath.getParentPath());
-            }
-
-            /** Make selection in a project tree, open correspondent entity tab */
-            projectTreeView.getSelectionModel().setSelectionPath(treePath);
-            EntityDisplayEvent event = new EntityDisplayEvent(
-                    projectTreeView,
-                    (Entity) path,
-                    ((Entity) path).getDataMap(),
-                    domain);
-            event.setMainTabFocus(true);
-
-            if (path instanceof ObjEntity)
-                editor.getObjDetailView().currentObjEntityChanged(event);
-            if (path instanceof DbEntity)
-                editor.getDbDetailView().currentDbEntityChanged(event);
-        }
-        else if (path instanceof QueryDescriptor) {
-
-            DataMap dmForQuery = null;
-
-            dmForQuery = ((QueryDescriptor) path).getDataMap();
-
-            Object[] o = new Object[3];
-            o[0] = domain;
-            o[1] = dmForQuery;
-            o[2] = path;
-
-            TreePath treePath = buildTreePath(o, editor);
-            ProjectTreeView projectTreeView = editor.getProjectTreeView();
-            if (!projectTreeView.isExpanded(treePath.getParentPath())) {
-                projectTreeView.expandPath(treePath.getParentPath());
-            }
-
-            /** Make selection in a project tree, open correspondent entity tab */
-            editor.getProjectTreeView().getSelectionModel().setSelectionPath(treePath);
-            QueryDisplayEvent event = new QueryDisplayEvent(
-                    projectTreeView,
-                    (QueryDescriptor) path,
-                    dmForQuery,
-                    domain);
-
-            editor.currentQueryChanged(event);
-        }
-
-        else if (path instanceof Embeddable) {
-
-            Object[] o = new Object[3];
-            o[0] = domain;
-            o[1] = ((Embeddable) path).getDataMap();
-            o[2] = (Embeddable) path;
-
-            TreePath treePath = buildTreePath(o, editor);
-            ProjectTreeView projectTreeView = editor.getProjectTreeView();
-            if (!projectTreeView.isExpanded(treePath.getParentPath())) {
-                projectTreeView.expandPath(treePath.getParentPath());
-            }
-
-            /** Make selection in a project tree, open correspondent entity tab */
-            editor.getProjectTreeView().getSelectionModel().setSelectionPath(treePath);
-            EmbeddableDisplayEvent event = new EmbeddableDisplayEvent(projectTreeView, (Embeddable) path, ((Embeddable) path)
-                    .getDataMap(), domain);
-            event.setMainTabFocus(true);
-
-            editor.currentEmbeddableChanged(event);
-        }
-
-        else if (path instanceof EmbeddableAttribute) {
-
-            /** Make selection in a project tree, open correspondent embeddable tab */
-            Object[] o = new Object[3];
-            o[0] = domain;
-            o[1] = ((EmbeddableAttribute) path).getEmbeddable().getDataMap();
-            o[2] = ((EmbeddableAttribute) path).getEmbeddable();
-
-            TreePath treePath = buildTreePath(o, editor);
-            ProjectTreeView projectTreeView = editor.getProjectTreeView();
-            if (!projectTreeView.isExpanded(treePath.getParentPath())) {
-                projectTreeView.expandPath(treePath.getParentPath());
-            }
-
-            editor.getProjectTreeView().getSelectionModel().setSelectionPath(treePath);
-
-            EmbeddableAttributeDisplayEvent event = new EmbeddableAttributeDisplayEvent(
-                    projectTreeView,
-                    ((EmbeddableAttribute) path).getEmbeddable(),
-                    (EmbeddableAttribute) path,
-                    ((EmbeddableAttribute) path).getEmbeddable().getDataMap(),
-                    domain);
-            event.setMainTabFocus(true);
-
-            editor.getEmbeddableView().currentEmbeddableAttributeChanged(event);
-        }
-
-        else if (path instanceof Attribute || path instanceof Relationship) {
-
-            /** Make selection in a project tree, open correspondent attributes tab */
-            Object[] o = new Object[3];
-            o[0] = domain;
-            if (path instanceof Attribute) {
-                o[1] = ((Attribute) path).getEntity().getDataMap();
-                o[2] = ((Attribute) path).getEntity();
-            }
-            else {
-                o[1] = ((Relationship) path).getSourceEntity().getDataMap();
-                o[2] = ((Relationship) path).getSourceEntity();
-            }
-
-            TreePath treePath = buildTreePath(o, editor);
-            ProjectTreeView projectTreeView = editor.getProjectTreeView();
-            if (!projectTreeView.isExpanded(treePath.getParentPath())) {
-                projectTreeView.expandPath(treePath.getParentPath());
-            }
-
-            projectTreeView.getSelectionModel().setSelectionPath(treePath);
-
-            if (path instanceof DbAttribute) {
-                AttributeDisplayEvent event = new AttributeDisplayEvent(projectTreeView, (Attribute) path, ((Attribute) path)
-                        .getEntity(), ((Attribute) path).getEntity().getDataMap(), domain);
-                event.setMainTabFocus(true);
-                editor.getDbDetailView().currentDbAttributeChanged(event);
-            }
-
-            if (path instanceof ObjAttribute) {
-                AttributeDisplayEvent event = new AttributeDisplayEvent(projectTreeView, (Attribute) path, ((Attribute) path)
-                        .getEntity(), ((Attribute) path).getEntity().getDataMap(), domain);
-                event.setMainTabFocus(true);
-                editor.getObjDetailView().currentObjAttributeChanged(event);
-            }
-
-            if (path instanceof DbRelationship) {
-                RelationshipDisplayEvent event = new RelationshipDisplayEvent(projectTreeView, (Relationship) path, ((Relationship) path)
-                        .getSourceEntity(), ((Relationship) path)
-                        .getSourceEntity()
-                        .getDataMap(), domain);
-                event.setMainTabFocus(true);
-                editor.getDbDetailView().currentDbRelationshipChanged(event);
-            }
-            if (path instanceof ObjRelationship) {
-                RelationshipDisplayEvent event = new RelationshipDisplayEvent(projectTreeView, (Relationship) path, ((Relationship) path)
-                        .getSourceEntity(), ((Relationship) path)
-                        .getSourceEntity()
-                        .getDataMap(), domain);
-                event.setMainTabFocus(true);
-                editor.getObjDetailView().currentObjRelationshipChanged(event);
-            }
-        }
-    }
-
-    private class JumpToResultActionListener implements MouseListener {
-
-        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 = paths.get(index);
-            jumpToResult(path);
-        }
-
-        public void mouseEntered(MouseEvent e) {
-        }
-
-        public void mouseExited(MouseEvent e) {
-        }
-
-        public void mousePressed(MouseEvent e) {
-        }
+    private class JumpToResultActionListener implements MouseListener, KeyListener {
 
+        @Override
         public void mouseReleased(MouseEvent e) {
+            openResult(e);
         }
 
-    }
-
-    private class JumpToResultsKeyListener implements KeyListener {
-
+        @Override
         public void keyPressed(KeyEvent e) {
-
-            if (e.getKeyCode() == KeyEvent.VK_ENTER) {
-
-                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);
+            if (e.getKeyCode() != KeyEvent.VK_ENTER) {
+                return;
             }
+            openResult(e);
         }
 
-        public void keyReleased(KeyEvent e) {
-        }
-
-        public void keyTyped(KeyEvent e) {
-        }
-    }
-
-    /**
-     * 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);
+        private void openResult(InputEvent e) {
+            JTable table = (JTable) e.getSource();
+            Integer selectedLine = table.getSelectionModel().getLeadSelectionIndex();
+            FindAction.jumpToResult(searchResults.get(selectedLine));
         }
-        return new TreePath(mutableTreeNodes);
-    }
-
-    private String getParentName(Object parentObject) {
-        String nameParent = null;
 
-        if (parentObject instanceof ObjEntity) {
-            ObjEntity objEntity = (ObjEntity) parentObject;
-            nameParent = objEntity.getName();
-        }
-        if (parentObject instanceof DbEntity) {
-            DbEntity dbEntity = (DbEntity) parentObject;
-            nameParent = dbEntity.getName();
-        }
-        if (parentObject instanceof Embeddable) {
-            Embeddable embeddable = (Embeddable) parentObject;
-            nameParent = embeddable.getClassName();
-        }
-        return nameParent;
+        @Override public void keyReleased(KeyEvent e) {}
+        @Override public void keyTyped(KeyEvent e) {}
+        @Override public void mouseEntered(MouseEvent e) {}
+        @Override public void mouseExited(MouseEvent e) {}
+        @Override public void mousePressed(MouseEvent e) {}
+        @Override public void mouseClicked(MouseEvent e) {}
     }
-
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/c24bb767/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/FindDialogView.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/FindDialogView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/FindDialogView.java
index 07a02a9..753685b 100755
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/FindDialogView.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/FindDialogView.java
@@ -18,25 +18,18 @@
  ****************************************************************/
 package org.apache.cayenne.modeler.dialog;
 
-import org.apache.cayenne.map.DbEntity;
-import org.apache.cayenne.map.Embeddable;
-import org.apache.cayenne.map.ObjAttribute;
-import org.apache.cayenne.map.ObjEntity;
-import org.apache.cayenne.map.ObjRelationship;
+import org.apache.cayenne.modeler.action.FindAction;
 import org.apache.cayenne.modeler.util.CellRenderers;
-import org.apache.cayenne.query.SelectQuery;
 import org.apache.cayenne.swing.ImageRendererColumn;
 
 import javax.swing.*;
-import java.awt.*;
+import javax.swing.table.DefaultTableModel;
+import java.awt.BorderLayout;
+import java.awt.Dimension;
+import java.awt.FlowLayout;
+import java.awt.Frame;
 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.Map.Entry;
-import java.util.TreeMap;
+import java.util.List;
 
 
 /**
@@ -45,145 +38,59 @@ import java.util.TreeMap;
 public class FindDialogView extends JDialog {
 
     private JButton okButton;
-    private static JScrollPane scrollPane;
     private JTable table;
-    private static Map LabelAndObjectIndex;
-
-    public static Map getLabelAndObjectIndex() {
-        return LabelAndObjectIndex;
-    }
+    private int index;
 
     public JTable getTable() {
         return table;
     }
 
-    public FindDialogView(Map objEntityNames, Map dbEntityNames, Map attrNames,
-            Map relatNames, Map queryNames, Map embeddableNames, Map embeddableAttributeNames) {
+    public FindDialogView(List<FindAction.SearchResultEntry> searchResults) {
+        super((Frame) null, "Search results", true);
 
         JPanel panel = new JPanel();
         panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
 
-        if (objEntityNames.isEmpty()
-                && dbEntityNames.isEmpty()
-                && attrNames.isEmpty()
-                && relatNames.isEmpty()
-                && queryNames.isEmpty()
-                && embeddableNames.isEmpty()
-                && embeddableAttributeNames.isEmpty()) {
-            panel.add(new JLabel("Nothing found!"));
-        }
-        else {
-
-            int curentLineInTable = 0;
-            int sizeDataVector = objEntityNames.size()
-                    + dbEntityNames.size()
-                    + attrNames.size()
-                    + relatNames.size()
-                    + queryNames.size()
-                    + embeddableNames.size()
-                    + embeddableAttributeNames.size();
-
-            Object[][] dataVector = new Object[sizeDataVector][];
-
-            TableModel tableModel = new TableModel();
-
-            LabelAndObjectIndex = new HashMap<>();
-
-            dataVector = createResultTable(objEntityNames, CellRenderers
-                    .iconForObject(new ObjEntity()), dataVector, curentLineInTable);
-            
-            curentLineInTable = objEntityNames.size();            
-            dataVector = createResultTable(embeddableNames, CellRenderers
-                    .iconForObject(new Embeddable()), dataVector, curentLineInTable);
-
-            curentLineInTable = curentLineInTable + embeddableNames.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(embeddableAttributeNames, CellRenderers
-                    .iconForObject(new ObjAttribute()), dataVector, curentLineInTable);
-
-            curentLineInTable = curentLineInTable + embeddableAttributeNames.size();
-            dataVector = createResultTable(relatNames, CellRenderers
-                    .iconForObject(new ObjRelationship()), dataVector, curentLineInTable);
-            
-            curentLineInTable = curentLineInTable + relatNames.size();
-            dataVector = createResultTable(queryNames, CellRenderers
-                    .iconForObject(new SelectQuery()), dataVector, curentLineInTable);
-            
-            tableModel.setDataVector(dataVector, new Object[] {
-                ""
-            });
-
-            table = new JTable(tableModel);
-
-            table.getColumnModel().getColumn(0).setCellRenderer(new ImageRendererColumn());
-            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);
-        }
+        DefaultTableModel tableModel = new DefaultTableModel() {
+            @Override
+            public boolean isCellEditable(int row, int col) {
+                return false;
+            }
+        };
+        tableModel.setDataVector(convertToDataVector(searchResults), new Object[] {""});
+
+        table = new JTable(tableModel);
+        table.getColumnModel().getColumn(0).setCellRenderer(new ImageRendererColumn());
+        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");
         okPanel.add(okButton);
 
         JComponent contentPane = (JComponent) getContentPane();
-
         contentPane.setLayout(new BorderLayout());
 
-        scrollPane = new JScrollPane( // panel
-                table,
-                JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
-                JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
-
+        JScrollPane scrollPane = new JScrollPane(table,
+                JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
         contentPane.add(scrollPane);
         contentPane.add(okPanel, BorderLayout.SOUTH);
-
         contentPane.setPreferredSize(new Dimension(400, 325));
-        setTitle("Search results");
     }
 
-    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);
-            }
-        };
-
-        Map sortedByNameMap = sortMapByValue(names, comparer);
-
-        Iterator it = sortedByNameMap.keySet().iterator();
-        Object[] objectHelper = new Object[] {};
-
-        while (it.hasNext()) {
-            Integer index = (Integer) it.next();
+    private JLabel[][] convertToDataVector(List<FindAction.SearchResultEntry> resultEntries) {
+        JLabel[][] dataVector = new JLabel[resultEntries.size()][1];
+        for (FindAction.SearchResultEntry entry : resultEntries) {
             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++;
+            labelIcon.setIcon(CellRenderers.iconForObject(entry.getObject()));
+            labelIcon.setText(entry.getName());
+            dataVector[index++] = new JLabel[]{labelIcon};
         }
 
         return dataVector;
@@ -192,28 +99,4 @@ public class FindDialogView extends JDialog {
     public JButton getOkButton() {
         return okButton;
     }
-
-    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());
-            }
-        }
-        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 TableModel extends javax.swing.table.DefaultTableModel {
-
-    public boolean isCellEditable(int row, int col) {
-        return false;
-    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/c24bb767/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/event/AttributeDisplayEvent.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/event/AttributeDisplayEvent.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/event/AttributeDisplayEvent.java
index 1ab2a1b..ffb2550 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/event/AttributeDisplayEvent.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/event/AttributeDisplayEvent.java
@@ -18,17 +18,14 @@ package org.apache.cayenne.modeler.event;
  *  under the License.
  ****************************************************************/
 
-
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.map.Attribute;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.Entity;
 
-/** 
-  */
 public class AttributeDisplayEvent extends EntityDisplayEvent {
    
-    protected Attribute[] attributes;
+    protected final Attribute[] attributes;
     
     public AttributeDisplayEvent(
             Object src,
@@ -36,18 +33,15 @@ public class AttributeDisplayEvent extends EntityDisplayEvent {
             Entity entity,
             DataMap dataMap,
             DataChannelDescriptor domain) {
-        
-            super(src, entity, dataMap, domain);
-            attributes = new Attribute[] { attribute };
+        this(src, new Attribute[]{attribute}, entity, dataMap, domain);
     }
 
     public AttributeDisplayEvent(
-        Object src,
-        Attribute[] attributes,
-        Entity entity,
-        DataMap dataMap,
-        DataChannelDescriptor domain) {
-
+            Object src,
+            Attribute[] attributes,
+            Entity entity,
+            DataMap dataMap,
+            DataChannelDescriptor domain) {
         super(src, entity, dataMap, domain);
         this.attributes = attributes;
     }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/c24bb767/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/BaseGraphBuilder.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/BaseGraphBuilder.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/BaseGraphBuilder.java
index ccc3b0d..ab1e24e 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/BaseGraphBuilder.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/BaseGraphBuilder.java
@@ -146,7 +146,11 @@ abstract class BaseGraphBuilder implements GraphBuilder, DataMapListener {
         graph.addMouseWheelListener(new MouseWheelListener() {
 
             public void mouseWheelMoved(MouseWheelEvent e) {
-                graph.setScale(graph.getScale() / Math.pow(ZOOM_FACTOR, e.getWheelRotation()));
+                // limit scale
+                double scale = graph.getScale() / Math.pow(ZOOM_FACTOR, e.getWheelRotation());
+                scale = Math.max(scale, 0.1);
+                scale = Math.min(scale, 3);
+                graph.setScale(scale);
             }
         });
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/c24bb767/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/action/EntityDisplayAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/action/EntityDisplayAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/action/EntityDisplayAction.java
index 1c6299e..4d3a56c 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/action/EntityDisplayAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/action/EntityDisplayAction.java
@@ -24,26 +24,23 @@ import javax.swing.Action;
 import javax.swing.Icon;
 
 import org.apache.cayenne.configuration.ConfigurationNode;
-import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.map.Entity;
 import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.ProjectController;
-import org.apache.cayenne.modeler.dialog.FindDialog;
+import org.apache.cayenne.modeler.action.FindAction;
 import org.apache.cayenne.modeler.graph.GraphBuilder;
 import org.apache.cayenne.modeler.util.CayenneAction;
 
 /**
- * Action that displays one of the objects in main tree, and then fires another action (if
- * specified)
+ * Action that displays one of the objects in main tree, and then fires another action (if specified)
  */
 public class EntityDisplayAction extends CayenneAction {
 
     /**
      * Action that will be performed after selection
      */
-    CayenneAction delegate;
+    private CayenneAction delegate;
 
-    GraphBuilder builder;
+    private GraphBuilder builder;
 
     public EntityDisplayAction(GraphBuilder builder) {
         super("Show", Application.getInstance());
@@ -61,9 +58,7 @@ public class EntityDisplayAction extends CayenneAction {
     private void init() {
         setEnabled(true);
 
-        /**
-         * Create icon manually, because at creation of super object delegate is null
-         */
+        // Create icon manually, because at creation of super object delegate is null
         Icon icon = createIcon();
         if (icon != null) {
             super.putValue(Action.SMALL_ICON, icon);
@@ -79,21 +74,14 @@ public class EntityDisplayAction extends CayenneAction {
         }
     }
 
-    boolean display() {
+    private boolean display() {
         Entity entity = builder.getSelectedEntity();
         if (entity == null) {
             return false;
         }
 
-        ProjectController mediator = getProjectController();
-
-        // we're always in same domain
-        FindDialog.jumpToResult(new Object[] {
-                getApplication().getProject(),
-                (DataChannelDescriptor) mediator.getProject().getRootNode(),
-                entity.getDataMap(), entity
-        });
-
+        // reusing logic from FindAction
+        FindAction.jumpToResult(new FindAction.SearchResultEntry(entity, entity.getName()));
         return true;
     }
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/c24bb767/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/swing/ImageRendererColumn.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/swing/ImageRendererColumn.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/swing/ImageRendererColumn.java
index 4a684fd..bab507e 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/swing/ImageRendererColumn.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/swing/ImageRendererColumn.java
@@ -22,38 +22,28 @@ import java.awt.Color;
 import java.awt.Component;
 
 import javax.swing.BorderFactory;
-import javax.swing.ImageIcon;
 import javax.swing.JLabel;
 import javax.swing.JTable;
 import javax.swing.table.DefaultTableCellRenderer;
 
-import org.apache.cayenne.modeler.dialog.FindDialog;
-
 public class ImageRendererColumn extends DefaultTableCellRenderer {
 
-    JLabel lbl = new JLabel();
-    ImageIcon icon = null;
+    private final Color ROLLOVER_BACKGROUND = new Color(223, 223, 223);
+
+    private JLabel lbl = new JLabel();
 
     public ImageRendererColumn() {
         super();
     }
 
-    public Component getTableCellRendererComponent(
-            JTable table,
-            Object value,
-            boolean isSelected,
-            boolean hasFocus,
-            int row,
-            int column) {
+    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.setText(((JLabel) value).getText());
         lbl.setIcon(((JLabel) value).getIcon());
-        lbl.setBorder(BorderFactory.createLineBorder(Color.WHITE, 0));
-        lbl.setBackground(Color.WHITE);
-
+        lbl.setBorder(BorderFactory.createEmptyBorder());
+        lbl.setBackground(isSelected ? ROLLOVER_BACKGROUND : Color.WHITE);
         lbl.setHorizontalAlignment(JLabel.LEFT);
-        lbl.setFont(isSelected ? FindDialog.getFontSelected() : FindDialog.getFont());
-
         return lbl;
     }
 }