1802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye/*
2802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye * Copyright (C) 2012 The Android Open Source Project
3802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye *
4802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye * Licensed under the Eclipse Public License, Version 1.0 (the "License");
5802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye * you may not use this file except in compliance with the License.
6802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye * You may obtain a copy of the License at
7802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye *
8802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye *      http://www.eclipse.org/org/documents/epl-v10.php
9802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye *
10802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye * Unless required by applicable law or agreed to in writing, software
11802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye * distributed under the License is distributed on an "AS IS" BASIS,
12802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye * See the License for the specific language governing permissions and
14802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye * limitations under the License.
15802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye */
16802de810020fba3f86282cd1d66597a2a41698e3Tor Norbyepackage com.android.ide.eclipse.adt.internal.wizards.templates;
17802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye
18802de810020fba3f86282cd1d66597a2a41698e3Tor Norbyeimport static org.eclipse.core.resources.IResource.DEPTH_INFINITE;
19802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye
20802de810020fba3f86282cd1d66597a2a41698e3Tor Norbyeimport com.android.annotations.NonNull;
21802de810020fba3f86282cd1d66597a2a41698e3Tor Norbyeimport com.android.ide.eclipse.adt.AdtPlugin;
22279445ad4561895db41309681de8dd1544d0ae22Tor Norbyeimport com.android.ide.eclipse.adt.internal.assetstudio.ConfigureAssetSetPage;
23279445ad4561895db41309681de8dd1544d0ae22Tor Norbyeimport com.android.ide.eclipse.adt.internal.assetstudio.CreateAssetSetWizardState;
24802de810020fba3f86282cd1d66597a2a41698e3Tor Norbyeimport com.android.ide.eclipse.adt.internal.editors.IconFactory;
25802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye
26802de810020fba3f86282cd1d66597a2a41698e3Tor Norbyeimport org.eclipse.core.resources.IProject;
27802de810020fba3f86282cd1d66597a2a41698e3Tor Norbyeimport org.eclipse.core.runtime.CoreException;
28802de810020fba3f86282cd1d66597a2a41698e3Tor Norbyeimport org.eclipse.core.runtime.IProgressMonitor;
29802de810020fba3f86282cd1d66597a2a41698e3Tor Norbyeimport org.eclipse.core.runtime.NullProgressMonitor;
30802de810020fba3f86282cd1d66597a2a41698e3Tor Norbyeimport org.eclipse.jface.operation.IRunnableWithProgress;
31802de810020fba3f86282cd1d66597a2a41698e3Tor Norbyeimport org.eclipse.jface.resource.ImageDescriptor;
32802de810020fba3f86282cd1d66597a2a41698e3Tor Norbyeimport org.eclipse.jface.viewers.IStructuredSelection;
33802de810020fba3f86282cd1d66597a2a41698e3Tor Norbyeimport org.eclipse.jface.wizard.IWizardPage;
34802de810020fba3f86282cd1d66597a2a41698e3Tor Norbyeimport org.eclipse.jface.wizard.Wizard;
35802de810020fba3f86282cd1d66597a2a41698e3Tor Norbyeimport org.eclipse.jface.wizard.WizardPage;
36802de810020fba3f86282cd1d66597a2a41698e3Tor Norbyeimport org.eclipse.ltk.core.refactoring.Change;
37802de810020fba3f86282cd1d66597a2a41698e3Tor Norbyeimport org.eclipse.ltk.core.refactoring.CompositeChange;
38802de810020fba3f86282cd1d66597a2a41698e3Tor Norbyeimport org.eclipse.ui.INewWizard;
39802de810020fba3f86282cd1d66597a2a41698e3Tor Norbyeimport org.eclipse.ui.IWorkbench;
40802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye
41802de810020fba3f86282cd1d66597a2a41698e3Tor Norbyeimport java.lang.reflect.InvocationTargetException;
42802de810020fba3f86282cd1d66597a2a41698e3Tor Norbyeimport java.util.List;
43802de810020fba3f86282cd1d66597a2a41698e3Tor Norbyeimport java.util.concurrent.atomic.AtomicBoolean;
44802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye
45802de810020fba3f86282cd1d66597a2a41698e3Tor Norbyeabstract class TemplateWizard extends Wizard implements INewWizard {
46802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye    private static final String PROJECT_LOGO_LARGE = "android-64"; //$NON-NLS-1$
47802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye    protected IWorkbench mWorkbench;
48802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye    private UpdateToolsPage mUpdatePage;
49802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye    private InstallDependencyPage mDependencyPage;
50802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye    private TemplatePreviewPage mPreviewPage;
51279445ad4561895db41309681de8dd1544d0ae22Tor Norbye    protected ConfigureAssetSetPage mIconPage;
52802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye
53802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye    protected TemplateWizard() {
54802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye    }
55802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye
56279445ad4561895db41309681de8dd1544d0ae22Tor Norbye    /** Should this wizard add an icon page? */
57279445ad4561895db41309681de8dd1544d0ae22Tor Norbye    protected boolean shouldAddIconPage() {
58279445ad4561895db41309681de8dd1544d0ae22Tor Norbye        return false;
59279445ad4561895db41309681de8dd1544d0ae22Tor Norbye    }
60279445ad4561895db41309681de8dd1544d0ae22Tor Norbye
61802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye    @Override
62802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye    public void init(IWorkbench workbench, IStructuredSelection selection) {
63802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye        mWorkbench = workbench;
64802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye
65802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye        setHelpAvailable(false);
66802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye        ImageDescriptor desc = IconFactory.getInstance().getImageDescriptor(PROJECT_LOGO_LARGE);
67802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye        setDefaultPageImageDescriptor(desc);
68802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye
69802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye        if (!UpdateToolsPage.isUpToDate()) {
70802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye            mUpdatePage = new UpdateToolsPage();
71802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye        }
72802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye
73802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye        setNeedsProgressMonitor(true);
7486f78976ed9cd29c76dea973b6a2b6262f7cd98dRaphael Moll
7586f78976ed9cd29c76dea973b6a2b6262f7cd98dRaphael Moll        // Trigger a check to see if the SDK needs to be reloaded (which will
7686f78976ed9cd29c76dea973b6a2b6262f7cd98dRaphael Moll        // invoke onSdkLoaded asynchronously as needed).
7786f78976ed9cd29c76dea973b6a2b6262f7cd98dRaphael Moll        AdtPlugin.getDefault().refreshSdk();
78802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye    }
79802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye
80802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye    @Override
81802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye    public void addPages() {
82802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye        super.addPages();
83802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye        if (mUpdatePage != null) {
84802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye            addPage(mUpdatePage);
85802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye        }
86802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye    }
87802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye
88802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye    @Override
89802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye    public IWizardPage getStartingPage() {
90802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye        if (mUpdatePage != null && mUpdatePage.isPageComplete()) {
91802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye            return getNextPage(mUpdatePage);
92802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye        }
93802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye
94802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye        return super.getStartingPage();
95802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye    }
96802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye
97802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye    protected WizardPage getPreviewPage(NewTemplateWizardState values) {
98802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye        if (mPreviewPage == null) {
99802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye            mPreviewPage = new TemplatePreviewPage(values);
100802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye            addPage(mPreviewPage);
101802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye        }
102802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye
103802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye        return mPreviewPage;
104802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye    }
105802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye
106279445ad4561895db41309681de8dd1544d0ae22Tor Norbye    protected WizardPage getIconPage(CreateAssetSetWizardState iconState) {
107279445ad4561895db41309681de8dd1544d0ae22Tor Norbye        if (mIconPage == null) {
108279445ad4561895db41309681de8dd1544d0ae22Tor Norbye            mIconPage = new ConfigureAssetSetPage(iconState);
109279445ad4561895db41309681de8dd1544d0ae22Tor Norbye            mIconPage.setTitle("Configure Icon");
110279445ad4561895db41309681de8dd1544d0ae22Tor Norbye            addPage(mIconPage);
111279445ad4561895db41309681de8dd1544d0ae22Tor Norbye        }
112279445ad4561895db41309681de8dd1544d0ae22Tor Norbye
113279445ad4561895db41309681de8dd1544d0ae22Tor Norbye        return mIconPage;
114279445ad4561895db41309681de8dd1544d0ae22Tor Norbye    }
115279445ad4561895db41309681de8dd1544d0ae22Tor Norbye
116802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye    protected WizardPage getDependencyPage(TemplateMetadata template, boolean create) {
117802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye        if (!create) {
118802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye            return mDependencyPage;
119802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye        }
120802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye
121802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye        if (mDependencyPage == null) {
122802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye            mDependencyPage = new InstallDependencyPage();
123802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye            addPage(mDependencyPage);
124802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye        }
125802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye        mDependencyPage.setTemplate(template);
126802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye        return mDependencyPage;
127802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye    }
128802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye
129802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye    /**
130802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye     * Returns the project where the template is being inserted
131802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye     *
132802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye     * @return the project to insert the template into
133802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye     */
134802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye    @NonNull
135802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye    protected abstract IProject getProject();
136802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye
137802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye    /**
138802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye     * Returns the list of files to open, which might be empty. This method will
139802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye     * only be called <b>after</b> {@link #computeChanges()} has been called.
140802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye     *
141802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye     * @return a list of files to open
142802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye     */
143802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye    @NonNull
144802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye    protected abstract List<String> getFilesToOpen();
145802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye
146802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye    /**
147802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye     * Computes the changes to the {@link #getProject()} this template should
148802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye     * perform
149802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye     *
150802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye     * @return the changes to perform
151802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye     */
152802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye    protected abstract List<Change> computeChanges();
153802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye
154802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye    protected boolean performFinish(IProgressMonitor monitor) throws InvocationTargetException {
155802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye        List<Change> changes = computeChanges();
156802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye        if (!changes.isEmpty()) {
157802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye            monitor.beginTask("Creating template...", changes.size());
158802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye            try {
159802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye                CompositeChange composite = new CompositeChange("",
160802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye                        changes.toArray(new Change[changes.size()]));
161802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye                composite.perform(monitor);
162802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye            } catch (CoreException e) {
163802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye                AdtPlugin.log(e, null);
164802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye                throw new InvocationTargetException(e);
165802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye            } finally {
166802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye                monitor.done();
167802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye            }
168802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye        }
169802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye
170802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye        // TBD: Is this necessary now that we're using IFile objects?
171802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye        try {
172802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye            getProject().refreshLocal(DEPTH_INFINITE, new NullProgressMonitor());
173802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye        } catch (CoreException e) {
174802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye            AdtPlugin.log(e, null);
175802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye        }
176802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye
177802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye        return true;
178802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye    }
179802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye
180802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye    @Override
181802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye    public boolean performFinish() {
182802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye        final AtomicBoolean success = new AtomicBoolean();
183802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye        try {
184802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye            getContainer().run(true, false, new IRunnableWithProgress() {
185802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye                @Override
186802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye                public void run(IProgressMonitor monitor) throws InvocationTargetException,
187802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye                        InterruptedException {
188802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye                    boolean ok = performFinish(monitor);
189802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye                    success.set(ok);
190802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye                }
191802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye            });
192802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye        } catch (InvocationTargetException e) {
193802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye            AdtPlugin.log(e, null);
194802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye            return false;
195802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye        } catch (InterruptedException e) {
196802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye            AdtPlugin.log(e, null);
197802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye            return false;
198802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye        }
199802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye
200802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye        if (success.get()) {
201802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye            // Open the primary file/files
202802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye            NewTemplateWizard.openFiles(getProject(), getFilesToOpen(), mWorkbench);
203802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye
204802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye            return true;
205802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye        } else {
206802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye            return false;
207802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye        }
208802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye    }
209802de810020fba3f86282cd1d66597a2a41698e3Tor Norbye}
210