public static Node constructSemiLogicalView()

in remoting/ide/usages/src/org/netbeans/modules/jackpot30/ide/usages/Nodes.java [98:198]


    public static Node constructSemiLogicalView(Iterable<? extends FileObject> filesWithOccurrences, Map<RemoteIndex, List<String>> unmappable, ElementHandle<?> eh, Set<RemoteUsages.SearchOptions> options) {
        Map<Project, Collection<FileObject>> projects = new HashMap<Project, Collection<FileObject>>();

        for (FileObject file : filesWithOccurrences) {
            Project project = FileOwnerQuery.getOwner(file);

            if (project == null) {
                Logger.getLogger(Nodes.class.getName()).log(Level.WARNING, "Cannot find project for: {0}", FileUtil.getFileDisplayName(file));
            }

            Collection<FileObject> projectFiles = projects.get(project);

            if (projectFiles == null) {
                projects.put(project, projectFiles = new ArrayList<FileObject>());
            }

            projectFiles.add(file);

            //XXX: workarounding NbProject's Evaluator, which is too stupid to fire meaningfull property events, which leads to PackageView rebuilding inadvertedly itself due to virtual CONTAINERSHIP change:
            ClassPath.getClassPath(file, ClassPath.COMPILE).getRoots();
        }

        final Collection<FileObject> outsideProjects = projects.remove(null);

        List<Node> nodes = new ArrayList<Node>(projects.size());

        for (Project p : projects.keySet()) {
            nodes.add(constructSemiLogicalView(p, projects.get(p), eh, options));
        }

        Collections.sort(nodes, new Comparator<Node>() {
            @Override public int compare(Node o1, Node o2) {
                return o1.getDisplayName().compareToIgnoreCase(o2.getDisplayName());
            }
        });

        if (outsideProjects != null) {
            AbstractNode outsideProjectsNode = new AbstractNode(Children.create(new ChildFactory<FileObject>() {
                @Override protected boolean createKeys(List<FileObject> toPopulate) {
                    toPopulate.addAll(outsideProjects);
                    return true;
                }
                @Override protected Node createNodeForKey(FileObject file) {
                    try {
                        DataObject od = DataObject.find(file);
                        return od.getNodeDelegate();
                    } catch (DataObjectNotFoundException ex) {
                        Exceptions.printStackTrace(ex);
                        return null;
                    }
                }
            }, true));

            outsideProjectsNode.setDisplayName("Occurrences outside locally recognized projects");
            nodes.add(outsideProjectsNode);
        }
        
        if (!unmappable.isEmpty()) {
            List<Node> localNodes = new ArrayList<Node>(unmappable.size());

            for (final Entry<RemoteIndex, List<String>> e : unmappable.entrySet()) {
                AbstractNode localNode = new AbstractNode(Children.create(new ChildFactory<String>() {
                    @Override protected boolean createKeys(List<String> toPopulate) {
                        Collections.sort(e.getValue());
                        toPopulate.addAll(e.getValue());
                        return true;
                    }
                    @Override protected Node createNodeForKey(final String rel) {
                        OpenCookie open = new OpenCookie() {
                            @Override public void open() {
                                UiUtils.open(e.getKey().getFile(rel), 0);
                            }
                        };
                        AbstractNode fileNode = new AbstractNode(Children.LEAF, Lookups.singleton(open)) {
                            @Override public Action[] getActions(boolean context) {
                                return new Action[] {
                                    OpenAction.get(OpenAction.class)
                                };
                            }
                            @Override public Action getPreferredAction() {
                                return OpenAction.get(OpenAction.class);
                            }
                        };

                        fileNode.setDisplayName(rel);
                        return fileNode;
                    }
                }, true));

                localNode.setDisplayName("Index: " + e.getKey().remote.toExternalForm() + ", segment: " + e.getKey().remoteSegment);
                localNodes.add(localNode);
            }

            AbstractNode notExisting = new AbstractNode(new DirectChildren(localNodes));

            notExisting.setDisplayName("Occurrences in files that are not locally available");
            nodes.add(notExisting);
        }

        return new AbstractNode(new DirectChildren(nodes));
    }