package com.redhat.ceylon.eclipse.code.select; import static org.eclipse.core.resources.ResourcesPlugin.getWorkspace; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IResource; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.IPackageFragment; import org.eclipse.jdt.core.IPackageFragmentRoot; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.internal.ui.wizards.TypedElementSelectionValidator; import org.eclipse.jdt.internal.ui.wizards.TypedViewerFilter; import org.eclipse.jdt.ui.JavaElementComparator; import org.eclipse.jdt.ui.StandardJavaElementContentProvider; import org.eclipse.jface.viewers.StyledString; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.window.Window; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.dialogs.ElementTreeSelectionDialog; import com.redhat.ceylon.eclipse.code.outline.CeylonLabelProvider; public class SourceFileSelectionDialog extends ElementTreeSelectionDialog { private class PackageAndProjectSelectionValidator extends TypedElementSelectionValidator { public PackageAndProjectSelectionValidator() { super(new Class[]{IFile.class},false); } @Override public boolean isSelectedValid(Object element) { if (element instanceof IFile) { IFile file = (IFile) element; String extension = file.getFileExtension(); String name = file.getName(); return extension!=null && extension.equals("ceylon") && !name.equals("package.ceylon") && !name.equals("module.ceylon"); } else { return false; } } } private class SourceFileViewerFilter extends TypedViewerFilter { public SourceFileViewerFilter() { super(new Class[]{IPackageFragmentRoot.class, IJavaProject.class}); } @Override public boolean select(Viewer viewer, Object parent, Object element) { if (element instanceof IPackageFragmentRoot) { IPackageFragmentRoot fragmentRoot = (IPackageFragmentRoot) element; try { return fragmentRoot.getKind()==IPackageFragmentRoot.K_SOURCE; } catch (Exception e) { return false; } } if (element instanceof IPackageFragment) { try { for (IResource child: ((IFolder) ((IPackageFragment) element).getResource()).members()) { if (child instanceof IFile) { String extension = child.getFileExtension(); if (extension!=null && extension.equals("ceylon")) { return true; } } } } catch (Exception e) { e.printStackTrace(); return false; } } if (element instanceof IFile) { String extension = ((IFile) element).getFileExtension(); return extension!=null && extension.equals("ceylon"); } return super.select(viewer, parent, element); } } private SourceFileSelectionDialog(Shell shell) { super(shell, new CeylonLabelProvider() { @Override public StyledString getStyledText(Object element) { if (element instanceof IPackageFragment) { return new StyledString(super.getStyledText(element).toString()); } else { return super.getStyledText(element); } } }, new StandardJavaElementContentProvider() { @Override protected Object[] getPackageContent(IPackageFragment fragment) throws JavaModelException { if (fragment.isDefaultPackage()) { return concatenate(((IPackageFragmentRoot)fragment.getParent()).getNonJavaResources(), fragment.getNonJavaResources()); } else { return fragment.getNonJavaResources(); } } @Override protected Object[] getPackageFragmentRootContent(IPackageFragmentRoot root) throws JavaModelException { return root.getChildren(); } }); setValidator(new PackageAndProjectSelectionValidator()); setComparator(new JavaElementComparator()); setTitle("Source File Selection"); setMessage("&Choose a source file:"); addFilter(new SourceFileViewerFilter()); } public static IFile selectSourceFile(Shell shell, IJavaElement initElement) { SourceFileSelectionDialog dialog = new SourceFileSelectionDialog(shell); dialog.setInput(JavaCore.create(getWorkspace().getRoot())); dialog.setInitialSelection(initElement); if (dialog.open() == Window.OK) { Object element = dialog.getFirstResult(); if (element instanceof IFile) { return (IFile) element; } } return null; } }