aboutsummaryrefslogtreecommitdiff
path: root/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newproject/NewProjectWizard.java
blob: ff03b338f2495555963da33e43a64307f3993208 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
/*
 * Copyright (C) 2011 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.wizards.newproject;

import static com.android.SdkConstants.FN_PROJECT_PROGUARD_FILE;
import static com.android.SdkConstants.OS_SDK_TOOLS_LIB_FOLDER;

import com.android.ide.eclipse.adt.AdtPlugin;
import com.android.ide.eclipse.adt.AdtUtils;
import com.android.ide.eclipse.adt.internal.wizards.newproject.NewProjectWizardState.Mode;

import org.eclipse.jdt.ui.actions.OpenJavaPerspectiveAction;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.ui.INewWizard;
import org.eclipse.ui.IWorkbench;

import java.io.File;


/**
 * A "New Android Project" Wizard.
 * <p/>
 * Note: this class is public so that it can be accessed from unit tests.
 * It is however an internal class. Its API may change without notice.
 * It should semantically be considered as a private final class.
 * <p/>
 * Do not derive from this class.
 */
public class NewProjectWizard extends Wizard implements INewWizard {
    private static final String PROJECT_LOGO_LARGE = "icons/android-64.png"; //$NON-NLS-1$

    private NewProjectWizardState mValues;
    private ProjectNamePage mNamePage;
    private SdkSelectionPage mSdkPage;
    private SampleSelectionPage mSamplePage;
    private ApplicationInfoPage mPropertiesPage;
    private final Mode mMode;
    private IStructuredSelection mSelection;

    /** Constructs a new wizard default project wizard */
    public NewProjectWizard() {
        this(Mode.ANY);
    }

    protected NewProjectWizard(Mode mode) {
        mMode = mode;
        switch (mMode) {
            case SAMPLE:
                setWindowTitle("New Android Sample Project");
                break;
            case TEST:
                setWindowTitle("New Android Test Project");
                break;
            default:
                setWindowTitle("New Android Project");
                break;
        }
    }

    @Override
    public void addPages() {
        mValues = new NewProjectWizardState(mMode);

        if (mMode != Mode.SAMPLE) {
            mNamePage = new ProjectNamePage(mValues);

            if (mSelection != null) {
                mNamePage.init(mSelection, AdtUtils.getActivePart());
            }

            addPage(mNamePage);
        }

        if (mMode == Mode.TEST) {
            addPage(new TestTargetPage(mValues));
        }

        mSdkPage = new SdkSelectionPage(mValues);
        addPage(mSdkPage);

        if (mMode != Mode.TEST) {
            // Sample projects can be created when entering the new/existing wizard, or
            // the sample wizard
            mSamplePage = new SampleSelectionPage(mValues);
            addPage(mSamplePage);
        }

        if (mMode != Mode.SAMPLE) {
            // Project properties are entered in all project types except sample projects
            mPropertiesPage = new ApplicationInfoPage(mValues);
            addPage(mPropertiesPage);
        }
    }

    @Override
    public void init(IWorkbench workbench, IStructuredSelection selection) {
        mSelection = selection;

        setHelpAvailable(false); // TODO have help
        ImageDescriptor desc = AdtPlugin.getImageDescriptor(PROJECT_LOGO_LARGE);
        setDefaultPageImageDescriptor(desc);

        // Trigger a check to see if the SDK needs to be reloaded (which will
        // invoke onSdkLoaded asynchronously as needed).
        AdtPlugin.getDefault().refreshSdk();
    }

    @Override
    public boolean performFinish() {
        File file = new File(AdtPlugin.getOsSdkFolder(), OS_SDK_TOOLS_LIB_FOLDER + File.separator
                + FN_PROJECT_PROGUARD_FILE);
        if (!file.exists()) {
            AdtPlugin.displayError("Tools Out of Date?",
            String.format("It looks like you do not have the latest version of the "
                    + "SDK Tools installed. Make sure you update via the SDK Manager "
                    + "first. (Could not find %1$s)", file.getPath()));
            return false;
        }

        NewProjectCreator creator = new NewProjectCreator(mValues, getContainer());
        if (!(creator.createAndroidProjects())) {
            return false;
        }

        // Open the default Java Perspective
        OpenJavaPerspectiveAction action = new OpenJavaPerspectiveAction();
        action.run();
        return true;
    }

    @Override
    public IWizardPage getNextPage(IWizardPage page) {
        if (page == mNamePage) {
            // Skip the test target selection page unless creating a test project
            if (mValues.mode != Mode.TEST) {
                return mSdkPage;
            }
        } else if (page == mSdkPage) {
            if (mValues.mode == Mode.SAMPLE) {
                return mSamplePage;
            } else if (mValues.mode != Mode.TEST) {
                return mPropertiesPage;
            } else {
                // Done with wizard when creating from existing or creating test projects
                return null;
            }
        } else if (page == mSamplePage) {
            // Nothing more to be entered for samples
            return null;
        }

        return super.getNextPage(page);
    }

    /**
     * Returns the package name currently set by the wizard
     *
     * @return the current package name, or null
     */
    public String getPackageName() {
        return mValues.packageName;
    }

    // TBD: Call setDialogSettings etc to store persistent state between wizard invocations.
}