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