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