package jqian.util.eclipse;
import java.util.*;
import org.eclipse.jface.viewers.*;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.*;
import org.eclipse.jdt.core.*;
import org.eclipse.jdt.ui.*;
public class ProjectSourceViewer extends TreeViewer {
private Text _selectionDisplay;
public ProjectSourceViewer(Composite parent,Text text,IJavaProject project,JavaElementFilter filter) {
super(parent, SWT.FULL_SELECTION | SWT.LINE_DASH | SWT.BORDER);
this._selectionDisplay = text;
//ITreeContentProvider contentProvider = new StandardJavaElementContentProvider(true);
ITreeContentProvider contentProvider = new MyTreeContenetProvider();
setContentProvider(contentProvider);
ILabelProvider labelProvider= new JavaElementLabelProvider(
JavaElementLabelProvider.SHOW_DEFAULT |
JavaElementLabelProvider.SHOW_BASICS );
setLabelProvider(labelProvider);
setInput(project);
addDbClickListener();
//expandAll();
}
/** Listen to Double-Clicks */
private void addDbClickListener() {
getTree().addListener(SWT.MouseDoubleClick, new Listener() {
public void handleEvent(Event e) {
TreeItem[] selection = getTree().getSelection();
if (selection.length == 0)
return;
TreeItem item = selection[0];
Object data = item.getData();
if(data instanceof IMethod){
try{
IMethod method = (IMethod)data;
String sig = JDTUtils.getMethodSootSignature(method);
_selectionDisplay.setText(sig);
}catch(Exception except){
_selectionDisplay.setText("");
}
}else{
_selectionDisplay.setText("");
}
}
});
}
class MyTreeContenetProvider implements ITreeContentProvider {
public Object[] getChildren(Object parentElement) {
try{
if (parentElement instanceof IJavaProject) {
IJavaProject prj = (IJavaProject) parentElement;
IPackageFragmentRoot[] roots = prj.getPackageFragmentRoots();
LinkedList<IPackageFragmentRoot> displayedRoots = new LinkedList<IPackageFragmentRoot>();
for (int i = 0; i < roots.length; i++) {
if (roots[i].getKind() == IPackageFragmentRoot.K_SOURCE) {
displayedRoots.add(roots[i]);
}
}
return displayedRoots.toArray();
} else if (parentElement instanceof IPackageFragmentRoot) {
IPackageFragmentRoot pkgRoot = (IPackageFragmentRoot) parentElement;
return pkgRoot.getChildren();
} else if (parentElement instanceof IPackageFragment) {
IPackageFragment pkg = (IPackageFragment) parentElement;
ICompilationUnit[] cunits = pkg.getCompilationUnits();
LinkedList<IType> types = new LinkedList<IType>();
int length = cunits.length;
for (int i = 0; i < length; i++) {
IType[] unitTypes = cunits[i].getAllTypes();
int cnt = unitTypes.length;
for (int j = 0; j < cnt; j++) {
IMethod[] methods = getConcreteMethods(unitTypes[j]);
if(methods.length>0){
types.add(unitTypes[j]);
}
}
}
return types.toArray();
} else if(parentElement instanceof IType){
return getConcreteMethods((IType)parentElement);
}
return new Object[0];
}
catch(Exception e){
return null;
}
}
private IMethod[] getConcreteMethods(IType type)throws Exception{
if(type.isInterface() || type.isAnnotation())
return new IMethod[0];
IMethod[] methods = type.getMethods();
return methods;
}
public Object getParent(Object element) {
if (element instanceof IJavaElement) {
IJavaElement javaElmt = (IJavaElement)element;
return javaElmt.getParent();
} else {
return null;
}
}
public boolean hasChildren(Object element) {
return getChildren(element).length>0;
}
public Object[] getElements(Object inputElement) {
return getChildren(inputElement);
}
public void dispose() {
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
}
/*class MyTableLableProvider extends LabelProvider implements ITableLabelProvider {
public Image getColumnImage(Object element, int columnIndex) {
if(element instanceof Wrapper){
return SWTResourceManager.getImage(SliceViewer.class, "/img/javaproject.PNG");
}
String imageKey = ISharedImages.IMG_OBJ_ELEMENT;
if(TVContentProvider.isLeaf(obj))
imageKey = ISharedImages.IMG_DEF_VIEW ;
return PlatformUI.getWorkbench().getSharedImages().getImage(imageKey);
else if (element instanceof File){
File file = (File)element;
if(file.isDirectory()){
return SWTResourceManager.getImage(SliceViewer.class, "/img/directory.PNG");
}
else{
return SWTResourceManager.getImage(SliceViewer.class, "/img/javafile.PNG");
}
}
else{
return null;
}
}
public String getColumnText(Object element, int columnIndex) {
if(element instanceof File){
switch(columnIndex){
case 0:{
File file = (File)element;
return file.getName();
}
case 1:{
int count = _distributionBar.getFileLineCount(element);
if(count==0)
return "";
else
return ""+count;
}
case 2:{
int count = _distributionBar.getSliceLineCount(element);
if(count==0)
return "";
else
return ""+count;
}
default: return "";
}
}
else
return element.toString();
}
public void addListener(ILabelProviderListener listener) {}
public void dispose() {}
public boolean isLabelProperty(Object element, String property) {
return true;
}
public void removeListener(ILabelProviderListener listener) {}
}*/
}