aboutsummaryrefslogtreecommitdiff
path: root/eclipse/plugins/com.android.ide.eclipse.pdt/src/com/android/ide/eclipse/pdt/internal/DevTreeProjectProvider.java
diff options
context:
space:
mode:
Diffstat (limited to 'eclipse/plugins/com.android.ide.eclipse.pdt/src/com/android/ide/eclipse/pdt/internal/DevTreeProjectProvider.java')
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.pdt/src/com/android/ide/eclipse/pdt/internal/DevTreeProjectProvider.java140
1 files changed, 140 insertions, 0 deletions
diff --git a/eclipse/plugins/com.android.ide.eclipse.pdt/src/com/android/ide/eclipse/pdt/internal/DevTreeProjectProvider.java b/eclipse/plugins/com.android.ide.eclipse.pdt/src/com/android/ide/eclipse/pdt/internal/DevTreeProjectProvider.java
new file mode 100644
index 000000000..b44d2cb49
--- /dev/null
+++ b/eclipse/plugins/com.android.ide.eclipse.pdt/src/com/android/ide/eclipse/pdt/internal/DevTreeProjectProvider.java
@@ -0,0 +1,140 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
+ *
+ * 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.pdt.internal;
+
+import com.android.ide.eclipse.pdt.PdtPlugin;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.window.Window;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.dialogs.ListDialog;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * Base class providing a {@link #getProject()} method to find the project matching the dev tree.
+ *
+ */
+class DevTreeProjectProvider {
+ protected IProject getProject() {
+ // Get the list of project for the current workspace
+ IWorkspace workspace = ResourcesPlugin.getWorkspace();
+ List<IProject> projects = Arrays.asList(workspace.getRoot().getProjects());
+ if (projects.size() == 0) {
+ return null;
+ }
+
+ // get the location of the Dev tree
+ String devTree = PdtPlugin.getDevTree();
+ IPath devTreePath = null;
+ if (devTree != null) {
+ devTreePath = new Path(devTree);
+ }
+
+ // filter the list of projects in workspace by 2 conditions:
+ // 1. Only look at Java projects
+ // 2. If dev tree location is set, only look at projects within the dev tree
+
+ List<IProject> devTreeProjects = new ArrayList<IProject>(projects.size());
+
+ for (IProject p: projects) {
+ if (!p.isOpen()) {
+ continue;
+ }
+
+ if (!hasJavaNature(p)) {
+ continue;
+ }
+
+ if (devTreePath == null || devTreePath.isPrefixOf(p.getLocation())) {
+ devTreeProjects.add(p);
+ }
+ }
+
+ return selectProject(devTreeProjects);
+ }
+
+ private IProject selectProject(List<IProject> devTreeProjects) {
+ if (devTreeProjects.size() == 0) {
+ return null;
+ }
+
+ if (devTreeProjects.size() == 1) {
+ return devTreeProjects.get(0);
+ }
+
+ // if there are multiple choices, prompt the user
+ IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+ if (window == null) {
+ return null;
+ }
+
+ ListDialog dlg = new ListDialog(window.getShell());
+ dlg.setMessage("Select Project");
+ dlg.setInput(devTreeProjects);
+ dlg.setContentProvider(new IStructuredContentProvider() {
+ @Override
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ }
+
+ @Override
+ public void dispose() {
+ }
+
+ @Override
+ public Object[] getElements(Object inputElement) {
+ return ((List<?>) inputElement).toArray();
+ }
+ });
+ dlg.setLabelProvider(new LabelProvider() {
+ @Override
+ public String getText(Object element) {
+ return ((IProject) element).getName();
+ }
+ });
+ dlg.setHelpAvailable(false);
+
+ if (dlg.open() == Window.OK) {
+ Object[] selectedMatches = dlg.getResult();
+ if (selectedMatches.length > 0) {
+ return (IProject) selectedMatches[0];
+ }
+ }
+
+ return null;
+ }
+
+ private boolean hasJavaNature(IProject p) {
+ try {
+ return p.hasNature(JavaCore.NATURE_ID);
+ } catch (CoreException e) {
+ return false;
+ }
+ }
+}