/* * Copyright 2000-2009 JetBrains s.r.o. * * 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 org.napile.idea.thermit.config.actions; import java.util.ArrayList; import java.util.List; import java.util.Set; import org.jetbrains.annotations.Nullable; import org.napile.idea.thermit.config.AntBuildFile; import org.napile.idea.thermit.config.AntBuildModelBase; import org.napile.idea.thermit.config.AntBuildTarget; import org.napile.idea.thermit.config.AntBuildTargetBase; import org.napile.idea.thermit.config.ThermitConfiguration; import org.napile.idea.thermit.config.ThermitConfigurationBase; import org.napile.idea.thermit.config.impl.MetaTarget; import com.intellij.openapi.actionSystem.ActionGroup; import com.intellij.openapi.actionSystem.ActionManager; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.DefaultActionGroup; import com.intellij.openapi.actionSystem.PlatformDataKeys; import com.intellij.openapi.actionSystem.Presentation; import com.intellij.openapi.project.DumbAware; import com.intellij.openapi.project.Project; import com.intellij.util.StringSetSpinAllocator; public final class AntBuildGroup extends ActionGroup implements DumbAware { public void update(AnActionEvent event) { Project project = PlatformDataKeys.PROJECT.getData(event.getDataContext()); Presentation presentation = event.getPresentation(); presentation.setEnabled(project != null); presentation.setVisible(project != null); } public AnAction[] getChildren(@Nullable AnActionEvent e) { if(e == null) return AnAction.EMPTY_ARRAY; Project project = PlatformDataKeys.PROJECT.getData(e.getDataContext()); if(project == null) return AnAction.EMPTY_ARRAY; final List<AnAction> children = new ArrayList<AnAction>(); final ThermitConfigurationBase antConfiguration = ThermitConfigurationBase.getInstance(project); for(final AntBuildFile buildFile : antConfiguration.getBuildFiles()) { final String name = buildFile.getPresentableName(); DefaultActionGroup subgroup = new DefaultActionGroup(); subgroup.getTemplatePresentation().setText(name, false); subgroup.setPopup(true); fillGroup(buildFile, subgroup, antConfiguration); if(subgroup.getChildrenCount() > 0) { children.add(subgroup); } } return children.toArray(new AnAction[children.size()]); } private static void fillGroup(final AntBuildFile buildFile, final DefaultActionGroup group, final ThermitConfiguration thermitConfiguration) { final AntBuildModelBase model = (AntBuildModelBase) buildFile.getModel(); if(model.getDefaultTargetName() != null) { DefaultActionGroup subgroup = new DefaultActionGroup(); subgroup.add(getOrCreateAction(buildFile, TargetAction.DEFAULT_TARGET_NAME, new String[]{TargetAction.DEFAULT_TARGET_NAME}, null, model.getDefaultTargetActionId())); group.add(subgroup); } final Set<String> addedTargetNames = StringSetSpinAllocator.alloc(); try { addGroupOfTargets(buildFile, model.getFilteredTargets(), addedTargetNames, group); addGroupOfTargets(buildFile, thermitConfiguration.getMetaTargets(buildFile), addedTargetNames, group); } finally { StringSetSpinAllocator.dispose(addedTargetNames); } } private static void addGroupOfTargets(final AntBuildFile buildFile, final AntBuildTarget[] targets, final Set<String> addedTargetNames, final DefaultActionGroup group) { final DefaultActionGroup subgroup = new DefaultActionGroup(); for(final AntBuildTarget target : targets) { final String displayName = target.getName(); if(addedTargetNames.contains(displayName)) { continue; } addedTargetNames.add(displayName); final String[] targetsToRun = (target instanceof MetaTarget) ? ((MetaTarget) target).getTargetNames() : new String[]{displayName}; subgroup.add(getOrCreateAction(buildFile, displayName, targetsToRun, target.getNotEmptyDescription(), ((AntBuildTargetBase) target).getActionId())); } if(subgroup.getChildrenCount() > 0) { group.add(subgroup); } } private static AnAction getOrCreateAction(final AntBuildFile buildFile, final String displayName, final String[] targets, final String targetDescription, final String actionId) { AnAction action = null; if(actionId != null) { action = ActionManager.getInstance().getAction(actionId); } if(action == null) { action = new TargetAction(buildFile, displayName, targets, targetDescription); } return action; } }