12c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye/* 22c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye * Copyright (C) 2012 The Android Open Source Project 32c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye * 42c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye * Licensed under the Eclipse Public License, Version 1.0 (the "License"); 52c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye * you may not use this file except in compliance with the License. 62c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye * You may obtain a copy of the License at 72c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye * 82c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye * http://www.eclipse.org/org/documents/epl-v10.php 92c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye * 102c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye * Unless required by applicable law or agreed to in writing, software 112c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye * distributed under the License is distributed on an "AS IS" BASIS, 122c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye * See the License for the specific language governing permissions and 142c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye * limitations under the License. 152c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye */ 162c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbyepackage com.android.ide.eclipse.adt.internal.wizards.newproject; 172c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye 182c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbyeimport com.android.ide.eclipse.adt.AdtPlugin; 192c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbyeimport com.android.tools.lint.detector.api.LintUtils; 202c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye 212c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbyeimport org.eclipse.core.resources.IProject; 222c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbyeimport org.eclipse.core.resources.IWorkspaceRoot; 232c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbyeimport org.eclipse.core.resources.ResourcesPlugin; 242c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbyeimport org.eclipse.core.runtime.IStatus; 252c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbyeimport org.eclipse.core.runtime.Status; 262c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbyeimport org.eclipse.jface.dialogs.IMessageProvider; 272c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbyeimport org.eclipse.jface.viewers.CheckStateChangedEvent; 282c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbyeimport org.eclipse.jface.viewers.CheckboxTableViewer; 292c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbyeimport org.eclipse.jface.viewers.ICheckStateListener; 302c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbyeimport org.eclipse.jface.viewers.IColorProvider; 312c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbyeimport org.eclipse.jface.viewers.ILabelProvider; 322c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbyeimport org.eclipse.jface.viewers.ILabelProviderListener; 332c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbyeimport org.eclipse.jface.viewers.IStructuredContentProvider; 342c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbyeimport org.eclipse.jface.viewers.IStructuredSelection; 352c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbyeimport org.eclipse.jface.viewers.Viewer; 362c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbyeimport org.eclipse.jface.wizard.IWizardPage; 372c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbyeimport org.eclipse.jface.wizard.WizardPage; 382c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbyeimport org.eclipse.swt.SWT; 395dc223e121c6e1dbbd1dc6ba45c695387c914935Tor Norbyeimport org.eclipse.swt.events.KeyEvent; 405dc223e121c6e1dbbd1dc6ba45c695387c914935Tor Norbyeimport org.eclipse.swt.events.KeyListener; 412c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbyeimport org.eclipse.swt.events.SelectionEvent; 422c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbyeimport org.eclipse.swt.events.SelectionListener; 435dc223e121c6e1dbbd1dc6ba45c695387c914935Tor Norbyeimport org.eclipse.swt.events.TraverseEvent; 445dc223e121c6e1dbbd1dc6ba45c695387c914935Tor Norbyeimport org.eclipse.swt.events.TraverseListener; 452c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbyeimport org.eclipse.swt.graphics.Color; 462c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbyeimport org.eclipse.swt.graphics.Image; 472c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbyeimport org.eclipse.swt.layout.GridData; 482c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbyeimport org.eclipse.swt.layout.GridLayout; 492c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbyeimport org.eclipse.swt.widgets.Button; 502c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbyeimport org.eclipse.swt.widgets.Composite; 512c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbyeimport org.eclipse.swt.widgets.DirectoryDialog; 522c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbyeimport org.eclipse.swt.widgets.Display; 532c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbyeimport org.eclipse.swt.widgets.Label; 542c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbyeimport org.eclipse.swt.widgets.Table; 552c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbyeimport org.eclipse.swt.widgets.Text; 562c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbyeimport org.eclipse.ui.IWorkbenchPart; 572c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbyeimport org.eclipse.ui.IWorkingSet; 582c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye 592c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbyeimport java.io.File; 602c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbyeimport java.util.ArrayList; 612c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbyeimport java.util.Collections; 622c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbyeimport java.util.List; 632c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye 642c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye/** WizardPage for importing Android projects */ 652c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbyeclass ImportPage extends WizardPage implements SelectionListener, IStructuredContentProvider, 665dc223e121c6e1dbbd1dc6ba45c695387c914935Tor Norbye ICheckStateListener, ILabelProvider, IColorProvider, KeyListener, TraverseListener { 672c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye private final NewProjectWizardState mValues; 682c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye private List<ImportedProject> mProjectPaths; 692c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye private final IProject[] mExistingProjects; 702c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye 712c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye private Text mDir; 722c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye private Button mBrowseButton; 732c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye private Button mCopyCheckBox; 742c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye private Button mRefreshButton; 752c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye private Button mDeselectAllButton; 762c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye private Button mSelectAllButton; 772c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye private Table mTable; 782c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye private CheckboxTableViewer mCheckboxTableViewer; 792c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye private WorkingSetGroup mWorkingSetGroup; 802c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye 812c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye ImportPage(NewProjectWizardState values) { 822c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye super("importPage"); //$NON-NLS-1$ 832c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye mValues = values; 842c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye setTitle("Import Projects"); 852c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye setDescription("Select a directory to search for existing Android projects"); 862c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye mWorkingSetGroup = new WorkingSetGroup(); 872c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye setWorkingSets(new IWorkingSet[0]); 882c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye 892c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye // Record all projects such that we can ensure that the project names are unique 902c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot(); 912c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye mExistingProjects = workspaceRoot.getProjects(); 922c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye } 932c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye 942c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye public void init(IStructuredSelection selection, IWorkbenchPart activePart) { 952c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye setWorkingSets(WorkingSetHelper.getSelectedWorkingSet(selection, activePart)); 962c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye } 972c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye 982c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye @SuppressWarnings("unused") // SWT constructors have side effects and aren't unused 992c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye @Override 1002c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye public void createControl(Composite parent) { 1012c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye Composite container = new Composite(parent, SWT.NULL); 1022c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye setControl(container); 1032c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye container.setLayout(new GridLayout(3, false)); 1042c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye 1052c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye Label directoryLabel = new Label(container, SWT.NONE); 1062c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye directoryLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1)); 1072c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye directoryLabel.setText("Root Directory:"); 1082c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye 1092c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye mDir = new Text(container, SWT.BORDER); 1102c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye mDir.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); 1115dc223e121c6e1dbbd1dc6ba45c695387c914935Tor Norbye mDir.addKeyListener(this); 1125dc223e121c6e1dbbd1dc6ba45c695387c914935Tor Norbye mDir.addTraverseListener(this); 1132c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye 1142c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye mBrowseButton = new Button(container, SWT.NONE); 1152c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye mBrowseButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1)); 1162c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye mBrowseButton.setText("Browse..."); 1172c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye mBrowseButton.addSelectionListener(this); 1182c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye 1192c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye Label projectsLabel = new Label(container, SWT.NONE); 1202c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye projectsLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 3, 1)); 1212c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye projectsLabel.setText("Projects:"); 1222c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye 1232c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye mCheckboxTableViewer = CheckboxTableViewer.newCheckList(container, 1242c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye SWT.BORDER | SWT.FULL_SELECTION); 1252c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye mTable = mCheckboxTableViewer.getTable(); 1262c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye mTable.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 4)); 1272c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye mTable.addSelectionListener(this); 1282c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye mCheckboxTableViewer.setLabelProvider(this); 1292c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye mCheckboxTableViewer.setContentProvider(this); 1302c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye mCheckboxTableViewer.setInput(this); 1312c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye mCheckboxTableViewer.addCheckStateListener(this); 1322c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye 1332c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye mSelectAllButton = new Button(container, SWT.NONE); 1342c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye mSelectAllButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1)); 1352c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye mSelectAllButton.setText("Select All"); 1362c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye mSelectAllButton.addSelectionListener(this); 1372c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye 1382c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye mDeselectAllButton = new Button(container, SWT.NONE); 1392c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye mDeselectAllButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1)); 1402c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye mDeselectAllButton.setText("Deselect All"); 1412c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye mDeselectAllButton.addSelectionListener(this); 1422c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye 1432c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye mRefreshButton = new Button(container, SWT.NONE); 1442c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye mRefreshButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1)); 1452c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye mRefreshButton.setText("Refresh"); 1462c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye mRefreshButton.addSelectionListener(this); 1472c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye new Label(container, SWT.NONE); 1482c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye 1492c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye mCopyCheckBox = new Button(container, SWT.CHECK); 1502c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye mCopyCheckBox.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 3, 1)); 1512c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye mCopyCheckBox.setText("Copy projects into workspace"); 1522c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye mCopyCheckBox.addSelectionListener(this); 1532c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye 1542c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye Composite group = mWorkingSetGroup.createControl(container); 1552c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye group.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 3, 1)); 1562c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye } 1572c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye 1582c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye @Override 1592c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye public void setVisible(boolean visible) { 1602c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye super.setVisible(visible); 1612c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye validatePage(); 1622c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye } 1632c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye 1642c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye private void refresh() { 1652c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye File root = new File(mDir.getText().trim()); 1662c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye mProjectPaths = searchForProjects(root); 1672c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye mCheckboxTableViewer.refresh(); 1682c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye mCheckboxTableViewer.setAllChecked(true); 1692c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye 1702c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye List<ImportedProject> selected = new ArrayList<ImportedProject>(); 1712c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye List<ImportedProject> disabled = new ArrayList<ImportedProject>(); 1722c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye for (ImportedProject project : mProjectPaths) { 1732c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye String projectName = project.getProjectName(); 1742c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye boolean invalid = false; 1752c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye for (IProject existingProject : mExistingProjects) { 1762c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye if (projectName.equals(existingProject.getName())) { 1772c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye invalid = true; 1782c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye break; 1792c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye } 1802c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye } 1812c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye if (invalid) { 1822c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye disabled.add(project); 1832c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye } else { 1842c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye selected.add(project); 1852c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye } 1862c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye } 1872c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye 1882c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye mValues.importProjects = selected; 1892c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye 1902c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye mCheckboxTableViewer.setGrayedElements(disabled.toArray()); 1912c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye mCheckboxTableViewer.setCheckedElements(selected.toArray()); 1922c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye mCheckboxTableViewer.refresh(); 1932c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye mCheckboxTableViewer.getTable().setFocus(); 1942c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye validatePage(); 1952c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye } 1962c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye 1972c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye private List<ImportedProject> searchForProjects(File dir) { 1982c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye List<ImportedProject> projects = new ArrayList<ImportedProject>(); 1992c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye addProjects(dir, projects); 2002c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye return projects; 2012c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye } 2022c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye 2032c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye /** Finds all project directories under the given directory */ 2042c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye private void addProjects(File dir, List<ImportedProject> projects) { 2052c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye if (dir.isDirectory()) { 2062c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye if (LintUtils.isProjectDir(dir)) { 2072c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye projects.add(new ImportedProject(dir)); 2082c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye } 2092c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye 2102c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye File[] children = dir.listFiles(); 2112c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye if (children != null) { 2122c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye for (File child : children) { 2132c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye addProjects(child, projects); 2142c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye } 2152c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye } 2162c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye } 2172c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye } 2182c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye 2192c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye private void validatePage() { 2202c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye IStatus status = null; 2212c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye 2222c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye // Validate project name -- unless we're creating a sample, in which case 2232c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye // the user will get a chance to pick the name on the Sample page 2242c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye if (mProjectPaths == null || mProjectPaths.isEmpty()) { 2252c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye status = new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID, 2262c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye "Select a directory to search for existing Android projects"); 2272c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye } else if (mValues.importProjects == null || mValues.importProjects.isEmpty()) { 2282c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye status = new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID, 2292c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye "Select at least one project"); 2302c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye } else { 2312c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye for (ImportedProject project : mValues.importProjects) { 2322c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye if (mCheckboxTableViewer.getGrayed(project)) { 2332c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye status = new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID, 2342c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye String.format("Cannot import %1$s because the project name is in use", 2352c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye project.getProjectName())); 2362c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye break; 2372c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye } 2382c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye } 2392c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye } 2402c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye 2412c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye // -- update UI & enable finish if there's no error 2422c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye setPageComplete(status == null || status.getSeverity() != IStatus.ERROR); 2432c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye if (status != null) { 2442c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye setMessage(status.getMessage(), 2452c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye status.getSeverity() == IStatus.ERROR 2462c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye ? IMessageProvider.ERROR : IMessageProvider.WARNING); 2472c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye } else { 2482c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye setErrorMessage(null); 2492c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye setMessage(null); 2502c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye } 2512c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye } 2522c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye 2532c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye /** 2542c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye * Returns the working sets to which the new project should be added. 2552c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye * 2562c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye * @return the selected working sets to which the new project should be added 2572c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye */ 2582c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye private IWorkingSet[] getWorkingSets() { 2592c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye return mWorkingSetGroup.getSelectedWorkingSets(); 2602c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye } 2612c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye 2622c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye /** 2632c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye * Sets the working sets to which the new project should be added. 2642c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye * 2652c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye * @param workingSets the initial selected working sets 2662c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye */ 2672c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye private void setWorkingSets(IWorkingSet[] workingSets) { 2682c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye assert workingSets != null; 2692c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye mWorkingSetGroup.setWorkingSets(workingSets); 2702c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye } 2712c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye 2722c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye @Override 2732c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye public IWizardPage getNextPage() { 2742c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye // Sync working set data to the value object, since the WorkingSetGroup 2752c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye // doesn't let us add listeners to do this lazily 2762c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye mValues.workingSets = getWorkingSets(); 2772c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye 2782c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye return super.getNextPage(); 2792c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye } 2802c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye 2812c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye // ---- Implements SelectionListener ---- 2822c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye 2832c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye @Override 2842c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye public void widgetSelected(SelectionEvent e) { 2852c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye Object source = e.getSource(); 2862c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye if (source == mBrowseButton) { 2872c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye // Choose directory 2882c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye DirectoryDialog dialog = new DirectoryDialog(getShell(), SWT.OPEN); 2892c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye String path = mDir.getText().trim(); 2902c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye if (path.length() > 0) { 2912c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye dialog.setFilterPath(path); 2922c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye } 2932c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye String file = dialog.open(); 2942c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye if (file != null) { 2952c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye mDir.setText(file); 2962c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye refresh(); 2972c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye } 2982c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye } else if (source == mSelectAllButton) { 2992c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye mCheckboxTableViewer.setAllChecked(true); 3002c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye mValues.importProjects = mProjectPaths; 3012c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye } else if (source == mDeselectAllButton) { 3022c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye mCheckboxTableViewer.setAllChecked(false); 3032c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye mValues.importProjects = Collections.emptyList(); 3042c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye } else if (source == mRefreshButton || source == mDir) { 3052c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye refresh(); 3062c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye } else if (source == mCopyCheckBox) { 3072c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye mValues.copyIntoWorkspace = mCopyCheckBox.getSelection(); 3082c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye } 3092c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye 3102c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye validatePage(); 3112c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye } 3122c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye 3132c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye @Override 3142c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye public void widgetDefaultSelected(SelectionEvent e) { 3152c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye } 3162c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye 3175dc223e121c6e1dbbd1dc6ba45c695387c914935Tor Norbye // ---- KeyListener ---- 3185dc223e121c6e1dbbd1dc6ba45c695387c914935Tor Norbye 3195dc223e121c6e1dbbd1dc6ba45c695387c914935Tor Norbye @Override 3205dc223e121c6e1dbbd1dc6ba45c695387c914935Tor Norbye public void keyPressed(KeyEvent e) { 3215dc223e121c6e1dbbd1dc6ba45c695387c914935Tor Norbye if (e.getSource() == mDir) { 3225dc223e121c6e1dbbd1dc6ba45c695387c914935Tor Norbye if (e.keyCode == SWT.CR) { 3235dc223e121c6e1dbbd1dc6ba45c695387c914935Tor Norbye refresh(); 3245dc223e121c6e1dbbd1dc6ba45c695387c914935Tor Norbye } 3255dc223e121c6e1dbbd1dc6ba45c695387c914935Tor Norbye } 3265dc223e121c6e1dbbd1dc6ba45c695387c914935Tor Norbye } 3275dc223e121c6e1dbbd1dc6ba45c695387c914935Tor Norbye 3285dc223e121c6e1dbbd1dc6ba45c695387c914935Tor Norbye @Override 3295dc223e121c6e1dbbd1dc6ba45c695387c914935Tor Norbye public void keyReleased(KeyEvent e) { 3305dc223e121c6e1dbbd1dc6ba45c695387c914935Tor Norbye } 3315dc223e121c6e1dbbd1dc6ba45c695387c914935Tor Norbye 3325dc223e121c6e1dbbd1dc6ba45c695387c914935Tor Norbye // ---- TraverseListener ---- 3335dc223e121c6e1dbbd1dc6ba45c695387c914935Tor Norbye 3345dc223e121c6e1dbbd1dc6ba45c695387c914935Tor Norbye @Override 3355dc223e121c6e1dbbd1dc6ba45c695387c914935Tor Norbye public void keyTraversed(TraverseEvent e) { 3365dc223e121c6e1dbbd1dc6ba45c695387c914935Tor Norbye // Prevent Return from running through the wizard; return is handled by 3375dc223e121c6e1dbbd1dc6ba45c695387c914935Tor Norbye // key listener to refresh project list instead 3385dc223e121c6e1dbbd1dc6ba45c695387c914935Tor Norbye if (SWT.TRAVERSE_RETURN == e.detail) { 3395dc223e121c6e1dbbd1dc6ba45c695387c914935Tor Norbye e.doit = false; 3405dc223e121c6e1dbbd1dc6ba45c695387c914935Tor Norbye } 3415dc223e121c6e1dbbd1dc6ba45c695387c914935Tor Norbye } 3425dc223e121c6e1dbbd1dc6ba45c695387c914935Tor Norbye 3432c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye // ---- Implements IStructuredContentProvider ---- 3442c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye 3452c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye @Override 3462c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { 3472c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye } 3482c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye 3492c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye @Override 3502c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye public Object[] getElements(Object inputElement) { 3512c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye return mProjectPaths != null ? mProjectPaths.toArray() : new Object[0]; 3522c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye } 3532c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye 3542c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye // ---- Implements ICheckStateListener ---- 3552c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye 3562c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye @Override 3572c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye public void checkStateChanged(CheckStateChangedEvent event) { 3582c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye // Try to disable other elements that conflict with this 3592c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye Object[] checked = mCheckboxTableViewer.getCheckedElements(); 3602c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye List<ImportedProject> selected = new ArrayList<ImportedProject>(checked.length); 3612c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye for (Object o : checked) { 3622c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye if (!mCheckboxTableViewer.getGrayed(o)) { 3632c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye selected.add((ImportedProject) o); 3642c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye } 3652c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye } 3662c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye mValues.importProjects = selected; 3672c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye validatePage(); 3682c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye } 3692c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye 3702c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye // ---- Implements ILabelProvider ---- 3712c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye 3722c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye @Override 3732c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye public void addListener(ILabelProviderListener listener) { 3742c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye } 3752c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye 3762c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye @Override 3772c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye public void removeListener(ILabelProviderListener listener) { 3782c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye } 3792c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye 3802c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye @Override 3812c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye public boolean isLabelProperty(Object element, String property) { 3822c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye return false; 3832c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye } 3842c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye 3852c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye @Override 3862c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye public Image getImage(Object element) { 3872c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye return null; 3882c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye } 3892c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye 3902c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye @Override 3912c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye public String getText(Object element) { 3922c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye ImportedProject file = (ImportedProject) element; 3932c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye return String.format("%1$s (%2$s)", file.getProjectName(), file.getLocation().getPath()); 3942c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye } 3952c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye 3962c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye // ---- IColorProvider ---- 3972c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye 3982c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye @Override 3992c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye public Color getForeground(Object element) { 4002c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye Display display = mTable.getDisplay(); 4012c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye if (mCheckboxTableViewer.getGrayed(element)) { 4022c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye return display.getSystemColor(SWT.COLOR_DARK_GRAY); 4032c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye } 4042c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye 4052c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye return display.getSystemColor(SWT.COLOR_LIST_FOREGROUND); 4062c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye } 4072c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye 4082c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye @Override 4092c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye public Color getBackground(Object element) { 4102c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye return mTable.getDisplay().getSystemColor(SWT.COLOR_LIST_BACKGROUND); 4112c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye } 4122c448ea55bab73955c5df9ea4b59e837e6aad339Tor Norbye} 413