1 /* 2 * Copyright (C) 2010 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.ide.eclipse.pdt.internal; 18 19 import com.android.ide.eclipse.pdt.PdtPlugin; 20 21 import org.eclipse.core.resources.IProject; 22 import org.eclipse.core.resources.IWorkspace; 23 import org.eclipse.core.resources.ResourcesPlugin; 24 import org.eclipse.core.runtime.CoreException; 25 import org.eclipse.core.runtime.IPath; 26 import org.eclipse.core.runtime.Path; 27 import org.eclipse.jdt.core.JavaCore; 28 import org.eclipse.jface.viewers.IStructuredContentProvider; 29 import org.eclipse.jface.viewers.LabelProvider; 30 import org.eclipse.jface.viewers.Viewer; 31 import org.eclipse.jface.window.Window; 32 import org.eclipse.ui.IWorkbenchWindow; 33 import org.eclipse.ui.PlatformUI; 34 import org.eclipse.ui.dialogs.ListDialog; 35 36 import java.util.ArrayList; 37 import java.util.Arrays; 38 import java.util.List; 39 40 /** 41 * Base class providing a {@link #getProject()} method to find the project matching the dev tree. 42 * 43 */ 44 class DevTreeProjectProvider { getProject()45 protected IProject getProject() { 46 // Get the list of project for the current workspace 47 IWorkspace workspace = ResourcesPlugin.getWorkspace(); 48 List<IProject> projects = Arrays.asList(workspace.getRoot().getProjects()); 49 if (projects.size() == 0) { 50 return null; 51 } 52 53 // get the location of the Dev tree 54 String devTree = PdtPlugin.getDevTree(); 55 IPath devTreePath = null; 56 if (devTree != null) { 57 devTreePath = new Path(devTree); 58 } 59 60 // filter the list of projects in workspace by 2 conditions: 61 // 1. Only look at Java projects 62 // 2. If dev tree location is set, only look at projects within the dev tree 63 64 List<IProject> devTreeProjects = new ArrayList<IProject>(projects.size()); 65 66 for (IProject p: projects) { 67 if (!p.isOpen()) { 68 continue; 69 } 70 71 if (!hasJavaNature(p)) { 72 continue; 73 } 74 75 if (devTreePath == null || devTreePath.isPrefixOf(p.getLocation())) { 76 devTreeProjects.add(p); 77 } 78 } 79 80 return selectProject(devTreeProjects); 81 } 82 selectProject(List<IProject> devTreeProjects)83 private IProject selectProject(List<IProject> devTreeProjects) { 84 if (devTreeProjects.size() == 0) { 85 return null; 86 } 87 88 if (devTreeProjects.size() == 1) { 89 return devTreeProjects.get(0); 90 } 91 92 // if there are multiple choices, prompt the user 93 IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); 94 if (window == null) { 95 return null; 96 } 97 98 ListDialog dlg = new ListDialog(window.getShell()); 99 dlg.setMessage("Select Project"); 100 dlg.setInput(devTreeProjects); 101 dlg.setContentProvider(new IStructuredContentProvider() { 102 @Override 103 public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { 104 } 105 106 @Override 107 public void dispose() { 108 } 109 110 @Override 111 public Object[] getElements(Object inputElement) { 112 return ((List<?>) inputElement).toArray(); 113 } 114 }); 115 dlg.setLabelProvider(new LabelProvider() { 116 @Override 117 public String getText(Object element) { 118 return ((IProject) element).getName(); 119 } 120 }); 121 dlg.setHelpAvailable(false); 122 123 if (dlg.open() == Window.OK) { 124 Object[] selectedMatches = dlg.getResult(); 125 if (selectedMatches.length > 0) { 126 return (IProject) selectedMatches[0]; 127 } 128 } 129 130 return null; 131 } 132 hasJavaNature(IProject p)133 private boolean hasJavaNature(IProject p) { 134 try { 135 return p.hasNature(JavaCore.NATURE_ID); 136 } catch (CoreException e) { 137 return false; 138 } 139 } 140 } 141