/**
* Copyright (c) 20015 by Brainwy Software Ltda. All Rights Reserved.
* Licensed under the terms of the Eclipse Public License (EPL).
* Please see the license.txt included with this distribution for details.
* Any modifications to this file must keep this entire header intact.
*/
package com.python.pydev.analysis.search_index;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.jface.viewers.TreeViewer;
import org.python.pydev.core.log.Log;
import org.python.pydev.shared_core.structure.TreeNode;
import org.python.pydev.shared_ui.search.AbstractSearchIndexResultPage;
import org.python.pydev.shared_ui.search.AbstractSearchIndexTreeContentProvider;
/**
* This is a content provider that creates a separate structure based on TreeNodes
* so that we can have better control on how to show things.
*/
public class PySearchIndexTreeContentProvider extends AbstractSearchIndexTreeContentProvider {
public PySearchIndexTreeContentProvider(AbstractSearchIndexResultPage searchIndexResultPage, TreeViewer viewer) {
super(viewer);
}
@Override
protected TreeNode<?> obtainTeeNodeElement(final Object object) {
if (object instanceof TreeNode) {
return (TreeNode<?>) object;
}
TreeNode<?> treeNode = elementToTreeNode.get(object);
if (treeNode != null) {
return treeNode;
}
TreeNode<?> ret = null;
if (object instanceof PyModuleLineElement) {
PyModuleLineElement moduleLineElement = (PyModuleLineElement) object;
TreeNode<?> parentNode;
if ((this.groupWith & GROUP_WITH_MODULES) != 0) {
parentNode = obtainTeeNodeElement(new PyCustomModule(moduleLineElement));
ret = new TreeNode<>(parentNode, object);
} else if ((this.groupWith & GROUP_WITH_FOLDERS) != 0) {
IResource parent = moduleLineElement.getParent();
parentNode = obtainTeeNodeElement(parent);
ret = new TreeNode<>(parentNode, object);
} else if ((this.groupWith & GROUP_WITH_PROJECT) != 0) {
parentNode = obtainTeeNodeElement(moduleLineElement.getProject());
ret = new TreeNode<>(parentNode, object);
} else {
// No grouping at all (flat)
ret = new TreeNode<>(root, object);
}
} else if (object instanceof PyCustomModule) {
if ((this.groupWith & GROUP_WITH_FOLDERS) != 0) {
PyCustomModule package1 = (PyCustomModule) object;
TreeNode<?> parentNode = obtainTeeNodeElement(package1.resource.getParent());
ret = new TreeNode<>(parentNode, object);
} else if ((this.groupWith & GROUP_WITH_PROJECT) != 0) {
PyCustomModule package1 = (PyCustomModule) object;
TreeNode<?> parentNode = obtainTeeNodeElement(package1.project);
ret = new TreeNode<>(parentNode, object);
} else {
// Already at root
ret = new TreeNode<>(root, object);
}
} else if (object instanceof IProject) {
// Projects are always beneath root
ret = new TreeNode<>(root, object);
} else if (object instanceof IResource) {
if ((this.groupWith & GROUP_WITH_FOLDERS) != 0) {
// If we got a resource use its parent
IResource resource = (IResource) object;
IContainer parent = resource.getParent();
if (parent instanceof IProject) {
if ((this.groupWith & GROUP_WITH_PROJECT) != 0) {
TreeNode<?> parentNode = obtainTeeNodeElement(parent);
ret = new TreeNode<>(parentNode, object);
} else {
// Already at root
ret = new TreeNode<>(root, object);
}
} else {
TreeNode<?> parentNode = obtainTeeNodeElement(parent);
ret = new TreeNode<>(parentNode, object);
}
} else {
// Already at root
ret = new TreeNode<>(root, object);
}
}
if (ret == null) {
Log.log("Unhandled: " + object + " group by: " + this.groupWith);
return null;
}
elementToTreeNode.put(object, ret);
return ret;
}
}