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