/* * Copyright (C) 2012 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.templates; import static com.android.ide.eclipse.adt.internal.wizards.templates.NewProjectWizard.ATTR_BUILD_API; import static com.android.ide.eclipse.adt.internal.wizards.templates.NewProjectWizard.ATTR_COPY_ICONS; import static com.android.ide.eclipse.adt.internal.wizards.templates.NewProjectWizard.ATTR_MIN_API; import static com.android.ide.eclipse.adt.internal.wizards.templates.NewProjectWizard.ATTR_MIN_API_LEVEL; import static com.android.ide.eclipse.adt.internal.wizards.templates.NewProjectWizard.ATTR_PACKAGE_NAME; import static com.android.ide.eclipse.adt.internal.wizards.templates.NewProjectWizard.ATTR_TARGET_API; import static com.android.ide.eclipse.adt.internal.wizards.templates.NewProjectWizard.IS_NEW_PROJECT; import static com.android.ide.eclipse.adt.internal.wizards.templates.NewTemplateWizard.BLANK_ACTIVITY; import com.android.annotations.NonNull; import com.android.annotations.Nullable; import com.android.ide.eclipse.adt.internal.assetstudio.ConfigureAssetSetPage; import com.android.ide.eclipse.adt.internal.assetstudio.CreateAssetSetWizardState; import com.android.ide.eclipse.adt.internal.editors.manifest.ManifestInfo; import com.android.ide.eclipse.adt.internal.sdk.Sdk; import com.android.sdklib.IAndroidTarget; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.ltk.core.refactoring.Change; import org.eclipse.ltk.core.refactoring.NullChange; import java.io.File; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; /** * Value object which holds the current state of the wizard pages for the * {@link NewTemplateWizard} */ public class NewTemplateWizardState { /** Template handler responsible for instantiating templates and reading resources */ private TemplateHandler mTemplateHandler; /** Configured parameters, by id */ public final Map<String, Object> parameters = new HashMap<String, Object>(); /** Configured defaults for the parameters, by id */ public final Map<String, String> defaults = new HashMap<String, String>(); /** Ids for parameters which should be hidden (because the client wizard already * has information for these parameters) */ public final Set<String> hidden = new HashSet<String>(); /** * The chosen project (which may be null if the wizard page is being * embedded in the new project wizard) */ public IProject project; /** The minimum API level to use for this template */ public int minSdkLevel; /** Location of the template being created */ private File mTemplateLocation; /** * State for the asset studio wizard, used to create custom icons provided * the icon requests it with an {@code <icons>} element */ private CreateAssetSetWizardState mIconState; /** * Create a new state object for use by the {@link NewTemplatePage} */ public NewTemplateWizardState() { parameters.put(IS_NEW_PROJECT, false); } @NonNull TemplateHandler getTemplateHandler() { if (mTemplateHandler == null) { File inputPath; if (mTemplateLocation != null) { inputPath = mTemplateLocation; } else { // Default inputPath = TemplateManager.getTemplateLocation(BLANK_ACTIVITY); } mTemplateHandler = TemplateHandler.createFromPath(inputPath); } return mTemplateHandler; } /** Sets the current template */ void setTemplateLocation(File file) { if (!file.equals(mTemplateLocation)) { mTemplateLocation = file; mTemplateHandler = null; } } /** Returns the current template */ File getTemplateLocation() { return mTemplateLocation; } /** Returns the min SDK version to use */ int getMinSdk() { if (project == null) { return -1; } ManifestInfo manifest = ManifestInfo.get(project); return manifest.getMinSdkVersion(); } /** Returns the build API version to use */ int getBuildApi() { if (project == null) { return -1; } IAndroidTarget target = Sdk.getCurrent().getTarget(project); if (target != null) { return target.getVersion().getApiLevel(); } return getMinSdk(); } /** Computes the changes this wizard will make */ @NonNull List<Change> computeChanges() { if (project == null) { return Collections.emptyList(); } ManifestInfo manifest = ManifestInfo.get(project); parameters.put(ATTR_PACKAGE_NAME, manifest.getPackage()); parameters.put(ATTR_MIN_API, manifest.getMinSdkName()); parameters.put(ATTR_MIN_API_LEVEL, manifest.getMinSdkVersion()); parameters.put(ATTR_TARGET_API, manifest.getTargetSdkVersion()); parameters.put(ATTR_BUILD_API, getBuildApi()); parameters.put(ATTR_COPY_ICONS, mIconState == null); List<Change> changes = getTemplateHandler().render(project, parameters); if (mIconState != null) { String title = String.format("Generate icons (res/drawable-<density>/%1$s.png)", mIconState.outputName); changes.add(new NullChange(title) { @Override public Change perform(IProgressMonitor pm) throws CoreException { ConfigureAssetSetPage.generateIcons(mIconState.project, mIconState, false, null); // Not undoable: just return null instead of an undo-change. return null; } }); } return changes; } @NonNull CreateAssetSetWizardState getIconState() { if (mIconState == null) { TemplateHandler handler = getTemplateHandler(); if (handler != null) { TemplateMetadata template = handler.getTemplate(); if (template != null) { mIconState = template.getIconState(project); } } } return mIconState; } /** * Updates the icon state, such as the output name, based on other parameter settings * @param evaluator the string evaluator, or null if none exists */ public void updateIconState(@Nullable StringEvaluator evaluator) { TemplateMetadata template = getTemplateHandler().getTemplate(); if (template != null) { if (evaluator == null) { evaluator = new StringEvaluator(); } template.updateIconName(template.getParameters(), evaluator); } } }