/** * Copyright (c) 2005-2011 by Appcelerator, Inc. 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. */ /* * Created on Jan 19, 2006 */ package org.python.pydev.ui.dialogs; import java.util.ArrayList; import java.util.List; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Status; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.dialogs.ElementTreeSelectionDialog; import org.eclipse.ui.dialogs.ISelectionStatusValidator; import org.python.copiedfromeclipsesrc.CopiedWorkbenchLabelProvider; import org.python.pydev.core.IPythonPathNature; import org.python.pydev.core.log.Log; import org.python.pydev.plugin.PydevPlugin; import org.python.pydev.plugin.nature.PythonNature; import org.python.pydev.ui.UIConstants; /** * Dialog to select some source folder (in the workspace) */ public class PythonPackageSelectionDialog extends ElementTreeSelectionDialog { public boolean selectOnlySourceFolders; public PythonPackageSelectionDialog(Shell parent, final boolean selectOnlySourceFolders) { super(parent, new CopiedWorkbenchLabelProvider() { @Override public String getText(Object element) { if (element instanceof Package) { element = ((Package) element).folder; } if (element instanceof SourceFolder) { SourceFolder f = (SourceFolder) element; return f.folder.getProjectRelativePath().toString(); // we want the complete path here... } return super.getText(element); } @Override public Image getImage(Object element) { if (element instanceof Package) { element = ((Package) element).folder; } if (element instanceof SourceFolder) { return PydevPlugin.getImageCache().get(UIConstants.SOURCE_FOLDER_ICON); } return super.getImage(element); } }, new PackageContentProvider(selectOnlySourceFolders)); this.selectOnlySourceFolders = selectOnlySourceFolders; //let's set the validator this.setValidator(new ISelectionStatusValidator() { public IStatus validate(Object selection[]) { if (selection.length > 1) { return new Status(IStatus.ERROR, PydevPlugin.getPluginID(), IStatus.ERROR, "Only one package can be selected", null); } if (selection.length == 1) { if (selection[0] instanceof SourceFolder) { SourceFolder folder = (SourceFolder) selection[0]; return new Status(IStatus.OK, PydevPlugin.getPluginID(), IStatus.OK, "Source Folder: " + folder.folder.getProjectRelativePath().toString() + " selected", null); } if (!selectOnlySourceFolders) { if (selection[0] instanceof Package) { Package folder = (Package) selection[0]; return new Status(IStatus.OK, PydevPlugin.getPluginID(), IStatus.OK, "Package: " + folder.folder.getName() + " selected", null); } } } return new Status(IStatus.ERROR, PydevPlugin.getPluginID(), IStatus.ERROR, "No package selected", null); } }); this.setInput(ResourcesPlugin.getWorkspace().getRoot()); } } class PackageContentProvider implements ITreeContentProvider { private IWorkspaceRoot workspaceRoot; private boolean selectOnlySourceFolders; public PackageContentProvider(boolean selectOnlySourceFolders) { this.selectOnlySourceFolders = selectOnlySourceFolders; } public Object[] getChildren(Object parentElement) { //workspace root if (parentElement instanceof IWorkspaceRoot) { this.workspaceRoot = (IWorkspaceRoot) parentElement; List<IProject> ret = new ArrayList<IProject>(); IProject[] projects = workspaceRoot.getProjects(); for (IProject project : projects) { PythonNature nature = PythonNature.getPythonNature(project); if (nature != null) { ret.add(project); } } return ret.toArray(new IProject[0]); } //project if (parentElement instanceof IProject) { List<Object> ret = new ArrayList<Object>(); IProject project = (IProject) parentElement; IPythonPathNature nature = PythonNature.getPythonPathNature(project); if (nature != null) { try { String[] srcPaths = PythonNature.getStrAsStrItems(nature.getProjectSourcePath(true)); for (String str : srcPaths) { IResource resource = this.workspaceRoot.findMember(new Path(str)); if (resource instanceof IFolder) { IFolder folder = (IFolder) resource; if (folder.exists()) { if (folder != null) { ret.add(new SourceFolder(folder)); } } } if (resource instanceof IProject) { IProject folder = (IProject) resource; if (folder.exists()) { if (folder != null) { ret.add(new SourceFolder(folder)); } } } } return ret.toArray(); } catch (CoreException e) { Log.log(e); } } } //source folder SourceFolder sourceFolder = null; if (parentElement instanceof SourceFolder) { sourceFolder = (SourceFolder) parentElement; parentElement = ((SourceFolder) parentElement).folder; } //package if (parentElement instanceof Package) { sourceFolder = ((Package) parentElement).sourceFolder; parentElement = ((Package) parentElement).folder; } if (parentElement instanceof IFolder) { IFolder f = (IFolder) parentElement; ArrayList<Package> ret = new ArrayList<Package>(); try { IResource[] resources = f.members(); for (IResource resource : resources) { if (resource instanceof IFolder) { ret.add(new Package((IFolder) resource, sourceFolder)); } } } catch (CoreException e) { Log.log(e); } return ret.toArray(); } return new Object[0]; } public Object getParent(Object element) { if (element instanceof Package) { return ((Package) element).sourceFolder; } if (element instanceof IResource) { return ((IResource) element).getParent(); } return null; } public boolean hasChildren(Object element) { if (selectOnlySourceFolders) { if (element instanceof SourceFolder) { return false; } } 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) { } }