aboutsummaryrefslogtreecommitdiff
path: root/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/ProjectChooserHelper.java
diff options
context:
space:
mode:
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.java304
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
+ }
+ }
+}