diff options
Diffstat (limited to 'eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/ProjectChooserHelper.java')
-rw-r--r-- | eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/ProjectChooserHelper.java | 304 |
1 files changed, 304 insertions, 0 deletions
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/ProjectChooserHelper.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/ProjectChooserHelper.java new file mode 100644 index 000000000..9de8ad06e --- /dev/null +++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/ProjectChooserHelper.java @@ -0,0 +1,304 @@ +/* + * Copyright (C) 2008 The Android Open Source Project + * + * Licensed under the Eclipse Public License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.eclipse.org/org/documents/epl-v10.php + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.ide.eclipse.adt.internal.project; + +import com.android.ide.eclipse.adt.internal.project.BaseProjectHelper.IProjectFilter; +import com.android.ide.eclipse.adt.internal.sdk.ProjectState; +import com.android.ide.eclipse.adt.internal.sdk.Sdk; + +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IWorkspaceRoot; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.jdt.core.IJavaModel; +import org.eclipse.jdt.core.IJavaProject; +import org.eclipse.jdt.core.JavaCore; +import org.eclipse.jdt.ui.JavaElementLabelProvider; +import org.eclipse.jface.viewers.ILabelProvider; +import org.eclipse.jface.window.Window; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.widgets.Combo; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.ui.dialogs.ElementListSelectionDialog; + +/** + * Helper class to deal with displaying a project choosing dialog that lists only the + * projects with the Android nature. + */ +public class ProjectChooserHelper { + + private final Shell mParentShell; + private final IProjectChooserFilter mFilter; + + /** + * List of current android projects. Since the dialog is modal, we'll just get + * the list once on-demand. + */ + private IJavaProject[] mAndroidProjects; + + /** + * Interface to filter out some project displayed by {@link ProjectChooserHelper}. + * + * @see IProjectFilter + */ + public interface IProjectChooserFilter extends IProjectFilter { + /** + * Whether the Project Chooser can compute the project list once and cache the result. + * </p>If false the project list is recomputed every time the dialog is opened. + */ + boolean useCache(); + } + + /** + * An implementation of {@link IProjectChooserFilter} that only displays non-library projects. + */ + public final static class NonLibraryProjectOnlyFilter implements IProjectChooserFilter { + @Override + public boolean accept(IProject project) { + ProjectState state = Sdk.getProjectState(project); + if (state != null) { + return state.isLibrary() == false; + } + + return false; + } + + @Override + public boolean useCache() { + return true; + } + } + + /** + * An implementation of {@link IProjectChooserFilter} that only displays library projects. + */ + public final static class LibraryProjectOnlyFilter implements IProjectChooserFilter { + @Override + public boolean accept(IProject project) { + ProjectState state = Sdk.getProjectState(project); + if (state != null ) { + return state.isLibrary(); + } + + return false; + } + + @Override + public boolean useCache() { + return true; + } + } + + /** + * Creates a new project chooser. + * @param parentShell the parent {@link Shell} for the dialog. + * @param filter a filter to only accept certain projects. Can be null. + */ + public ProjectChooserHelper(Shell parentShell, IProjectChooserFilter filter) { + mParentShell = parentShell; + mFilter = filter; + } + + /** + * Displays a project chooser dialog which lists all available projects with the Android nature. + * <p/> + * The list of project is built from Android flagged projects currently opened in the workspace. + * + * @param projectName If non null and not empty, represents the name of an Android project + * that will be selected by default. + * @param message Message for the dialog box. Can be null in which case a default message + * is displayed. + * @return the project chosen by the user in the dialog, or null if the dialog was canceled. + */ + public IJavaProject chooseJavaProject(String projectName, String message) { + ILabelProvider labelProvider = new JavaElementLabelProvider( + JavaElementLabelProvider.SHOW_DEFAULT); + ElementListSelectionDialog dialog = new ElementListSelectionDialog( + mParentShell, labelProvider); + dialog.setTitle("Project Selection"); + if (message == null) { + message = "Please select a project"; + } + dialog.setMessage(message); + + IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot(); + IJavaModel javaModel = JavaCore.create(workspaceRoot); + + // set the elements in the dialog. These are opened android projects. + dialog.setElements(getAndroidProjects(javaModel)); + + // look for the project matching the given project name + IJavaProject javaProject = null; + if (projectName != null && projectName.length() > 0) { + javaProject = javaModel.getJavaProject(projectName); + } + + // if we found it, we set the initial selection in the dialog to this one. + if (javaProject != null) { + dialog.setInitialSelections(new Object[] { javaProject }); + } + + // open the dialog and return the object selected if OK was clicked, or null otherwise + if (dialog.open() == Window.OK) { + return (IJavaProject) dialog.getFirstResult(); + } + return null; + } + + /** + * Returns the list of Android projects. + * <p/> + * Because this list can be time consuming, this class caches the list of project. + * It is recommended to call this method instead of + * {@link BaseProjectHelper#getAndroidProjects()}. + * + * @param javaModel the java model. Can be null. + */ + public IJavaProject[] getAndroidProjects(IJavaModel javaModel) { + // recompute only if we don't have the projects already or the filter is dynamic + // and prevent usage of a cache. + if (mAndroidProjects == null || (mFilter != null && mFilter.useCache() == false)) { + if (javaModel == null) { + mAndroidProjects = BaseProjectHelper.getAndroidProjects(mFilter); + } else { + mAndroidProjects = BaseProjectHelper.getAndroidProjects(javaModel, mFilter); + } + } + + return mAndroidProjects; + } + + /** + * Helper method to get the Android project with the given name + * + * @param projectName the name of the project to find + * @return the {@link IProject} for the Android project. <code>null</code> if not found. + */ + public IProject getAndroidProject(String projectName) { + IProject iproject = null; + IJavaProject[] javaProjects = getAndroidProjects(null); + if (javaProjects != null) { + for (IJavaProject javaProject : javaProjects) { + if (javaProject.getElementName().equals(projectName)) { + iproject = javaProject.getProject(); + break; + } + } + } + return iproject; + } + + /** + * A selector combo for showing the currently selected project and for + * changing the selection + */ + public static class ProjectCombo extends Combo implements SelectionListener { + /** Currently chosen project, or null when no project has been initialized or selected */ + private IProject mProject; + private IJavaProject[] mAvailableProjects; + + /** + * Creates a new project selector combo + * + * @param helper associated {@link ProjectChooserHelper} for looking up + * projects + * @param parent parent composite to add the combo to + * @param initialProject the initial project to select, or null (which + * will show a "Please Choose Project..." label instead.) + */ + public ProjectCombo(ProjectChooserHelper helper, Composite parent, + IProject initialProject) { + super(parent, SWT.BORDER | SWT.FLAT | SWT.READ_ONLY); + mProject = initialProject; + + mAvailableProjects = helper.getAndroidProjects(null); + String[] items = new String[mAvailableProjects.length + 1]; + items[0] = "--- Choose Project ---"; + + ILabelProvider labelProvider = new JavaElementLabelProvider( + JavaElementLabelProvider.SHOW_DEFAULT); + int selectionIndex = 0; + for (int i = 0, n = mAvailableProjects.length; i < n; i++) { + IProject project = mAvailableProjects[i].getProject(); + items[i + 1] = labelProvider.getText(project); + if (project == initialProject) { + selectionIndex = i + 1; + } + } + setItems(items); + select(selectionIndex); + + addSelectionListener(this); + } + + /** + * Returns the project selected by this chooser (or the initial project + * passed to the constructor if the user did not change it) + * + * @return the selected project + */ + public IProject getSelectedProject() { + return mProject; + } + + /** + * Sets the project selected by this chooser + * + * @param project the selected project + */ + public void setSelectedProject(IProject project) { + mProject = project; + + int selectionIndex = 0; + for (int i = 0, n = mAvailableProjects.length; i < n; i++) { + if (project == mAvailableProjects[i].getProject()) { + selectionIndex = i + 1; // +1: Slot 0 is reserved for "Choose Project" + select(selectionIndex); + break; + } + } + } + + /** + * Click handler for the button: Open the {@link ProjectChooserHelper} + * dialog for selecting a new project. + */ + @Override + public void widgetSelected(SelectionEvent e) { + int selectionIndex = getSelectionIndex(); + if (selectionIndex > 0 && mAvailableProjects != null + && selectionIndex <= mAvailableProjects.length) { + // selection index 0 is "Choose Project", all other projects are offset + // by 1 from the selection index + mProject = mAvailableProjects[selectionIndex - 1].getProject(); + } else { + mProject = null; + } + } + + @Override + public void widgetDefaultSelected(SelectionEvent e) { + } + + @Override + protected void checkSubclass() { + // Disable the check that prevents subclassing of SWT components + } + } +} |