package com.redhat.ceylon.eclipse.code.select; import static com.redhat.ceylon.eclipse.ui.CeylonResources.PACKAGE; import java.util.ArrayList; import java.util.List; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IPackageFragment; import org.eclipse.jdt.core.IPackageFragmentRoot; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.ILabelProviderListener; import org.eclipse.jface.window.Window; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.dialogs.ElementListSelectionDialog; public class PackageSelectionDialog extends ElementListSelectionDialog { private final IPackageFragmentRoot sourceDir; private PackageSelectionDialog(Shell parent, //IProject project, IPackageFragmentRoot sourceDir) { super(parent, new ILabelProvider() { @Override public void removeListener(ILabelProviderListener listener) {} @Override public boolean isLabelProperty(Object element, String property) { return false; } @Override public void dispose() {} @Override public void addListener(ILabelProviderListener listener) {} @Override public String getText(Object element) { String name = ((IPackageFragment) element).getElementName(); if (name.isEmpty()) { return "(default package)"; } else { return name; } } @Override public Image getImage(Object element) { return PACKAGE; } }); this.sourceDir = sourceDir; } @Override public int open() { List<IPackageFragment> elements = new ArrayList<IPackageFragment>(); try { addChildren(elements, sourceDir.getChildren()); } catch (JavaModelException jme) { jme.printStackTrace(); } /*Collections.sort(elements, new Comparator<IPackageFragment>() { @Override public int compare(IPackageFragment pf1, IPackageFragment pf2) { return pf1.getElementName().compareTo(pf2.getElementName()); } });*/ setElements(elements.toArray()); return super.open(); } private void addChildren(List<IPackageFragment> elements, IJavaElement[] children) throws JavaModelException { for (IJavaElement je: children) { if (je instanceof IPackageFragment) { IPackageFragment pf = (IPackageFragment) je; elements.add(pf); addChildren(elements, pf.getChildren()); } } } public static IPackageFragment selectPackage(Shell shell, IPackageFragmentRoot sourceDir) { PackageSelectionDialog dialog = new PackageSelectionDialog(shell, sourceDir); dialog.setMultipleSelection(false); dialog.setTitle("Package Selection"); dialog.setMessage("Select a package:"); if (dialog.open() == Window.OK) { return (IPackageFragment) dialog.getFirstResult(); } else { return null; } } }