/*
* Copyright (C) 2014 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
*
* 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.tools.idea.wizard;
import com.android.tools.idea.templates.TemplateMetadata;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import com.intellij.ide.util.projectWizard.ModuleWizardStep;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.extensions.Extensions;
import com.intellij.openapi.project.Project;
import icons.AndroidIcons;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.io.File;
import java.text.Collator;
import java.util.*;
import static com.android.tools.idea.templates.Template.CATEGORY_PROJECTS;
/*
* Builder that also supports creating Android modules
*/
public class TemplateWizardModuleBuilder extends ImportWizardModuleBuilder {
protected static final String PROJECT_NAME = "Android Project";
protected static final String MODULE_NAME = "Android Module";
protected static final String APP_TEMPLATE_NAME = "Android Application";
protected static final String LIB_TEMPLATE_NAME = "Android Library";
@Nullable private final String myBuilderId;
private NewAndroidModulePath myNewAndroidModulePath;
public TemplateWizardModuleBuilder(@Nullable File templateLocation,
@Nullable TemplateMetadata metadata,
@Nullable Project project,
@Nullable Icon sidePanelIcon,
@NotNull List<ModuleWizardStep> steps,
@NotNull Disposable disposable,
boolean inGlobalWizard) {
super(templateLocation, project, null, sidePanelIcon, steps, disposable, inGlobalWizard);
myBuilderId = metadata == null ? null : metadata.getTitle();
if (!inGlobalWizard) {
mySteps.add(0, buildChooseModuleStep(project));
}
}
@Override
protected Iterable<WizardPath> setupWizardPaths(Project project, Icon sidePanelIcon, Disposable disposable) {
List<WizardPath> paths = Lists.newArrayList(super.setupWizardPaths(project, sidePanelIcon, disposable));
myNewAndroidModulePath = new NewAndroidModulePath(myWizardState, this, project, sidePanelIcon, disposable);
paths.add(myNewAndroidModulePath);
for (NewModuleWizardPathFactory factory : Extensions.getExtensions(NewModuleWizardPathFactory.EP_NAME)) {
paths.addAll(factory.createWizardPaths(myWizardState, this, project, sidePanelIcon, disposable));
}
return paths;
}
@Override
protected WizardPath getDefaultPath() {
return myNewAndroidModulePath;
}
@Override
public void templateChanged(String templateName) {
myNewAndroidModulePath.templateChanged();
super.templateChanged(templateName);
}
@Nullable
@Override
public String getBuilderId() {
return myBuilderId;
}
/**
* Create a template chooser step populated with the correct templates for the new modules.
*/
private ChooseTemplateStep buildChooseModuleStep(@Nullable Project project) {
// We're going to build up our own list of templates here
// This is a little hacky, we should clean this up later.
ChooseTemplateStep chooseModuleStep =
new ChooseTemplateStep(myWizardState, null, project, null, AndroidIcons.Wizards.NewModuleSidePanel,
this, this);
Set<String> excludedTemplates = Sets.newHashSet();
Set<ChooseTemplateStep.MetadataListItem> builtinTemplateList =
new TreeSet<ChooseTemplateStep.MetadataListItem>(new Comparator<ChooseTemplateStep.MetadataListItem>() {
@Override
public int compare(ChooseTemplateStep.MetadataListItem o1, ChooseTemplateStep.MetadataListItem o2) {
return Collator.getInstance().compare(o1.toString(), o2.toString());
}
});
for (WizardPath path : myPaths) {
excludedTemplates.addAll(path.getExcludedTemplates());
Collection<ChooseTemplateStep.MetadataListItem> templates = path.getBuiltInTemplates();
builtinTemplateList.addAll(templates);
for (ChooseTemplateStep.MetadataListItem template : templates) {
myWizardState.associateTemplateWithPath(template.toString(), path);
}
}
// Get the list of templates to offer, but exclude the NewModule and NewProject template
List<ChooseTemplateStep.MetadataListItem> templateList =
ChooseTemplateStep.getTemplateList(myWizardState, CATEGORY_PROJECTS, excludedTemplates);
List<ChooseTemplateStep.MetadataListItem> list = Lists.newArrayListWithExpectedSize(builtinTemplateList.size() + templateList.size());
list.addAll(builtinTemplateList);
list.addAll(templateList);
chooseModuleStep.setListData(list);
return chooseModuleStep;
}
}