From 02cf98d65c798d368fcec43ed64a001d513bdd4f Mon Sep 17 00:00:00 2001 From: Tor Norbye Date: Tue, 19 Aug 2014 12:53:10 -0700 Subject: Snapshot idea/138.1503 from git://git.jetbrains.org/idea/community.git Change-Id: Ie01af1d8710ec0ff51d90301bda1a18b0b5c0faf --- .../maven/project/actions/ToggleProfileAction.java | 112 ++++++++++++++++----- 1 file changed, 85 insertions(+), 27 deletions(-) (limited to 'plugins/maven/src/main/java/org/jetbrains/idea/maven/project/actions/ToggleProfileAction.java') diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/actions/ToggleProfileAction.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/actions/ToggleProfileAction.java index 3e9bf7f92ddd..af0fbd091aad 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/actions/ToggleProfileAction.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/actions/ToggleProfileAction.java @@ -16,15 +16,15 @@ package org.jetbrains.idea.maven.project.actions; import com.intellij.openapi.actionSystem.AnActionEvent; +import org.jetbrains.idea.maven.model.MavenExplicitProfiles; +import org.jetbrains.idea.maven.model.MavenProfileKind; import org.jetbrains.idea.maven.project.MavenProjectsManager; import org.jetbrains.idea.maven.project.ProjectBundle; import org.jetbrains.idea.maven.utils.MavenDataKeys; import org.jetbrains.idea.maven.utils.actions.MavenAction; import org.jetbrains.idea.maven.utils.actions.MavenActionUtil; -import java.util.Collection; -import java.util.HashSet; -import java.util.List; +import java.util.Map; import java.util.Set; public class ToggleProfileAction extends MavenAction { @@ -32,47 +32,105 @@ public class ToggleProfileAction extends MavenAction { super.update(e); if (!isAvailable(e)) return; - MavenProjectsManager projectsManager = MavenActionUtil.getProjectsManager(e.getDataContext()); - List profiles = e.getData(MavenDataKeys.MAVEN_PROFILES); - - e.getPresentation().setText(isActive(projectsManager, profiles) - ? ProjectBundle.message("maven.profile.deactivate") - : ProjectBundle.message("maven.profile.activate")); + MavenProfileKind targetState = getTargetState(e); + String text; + switch (targetState) { + case NONE: + text = ProjectBundle.message("maven.profile.deactivate"); + break; + case EXPLICIT: + text = ProjectBundle.message("maven.profile.activate"); + break; + case IMPLICIT: + default: + text = ProjectBundle.message("maven.profile.default"); + break; + } + e.getPresentation().setText(text); } @Override protected boolean isAvailable(AnActionEvent e) { if (!super.isAvailable(e)) return false; - List selectedProfiles = e.getData(MavenDataKeys.MAVEN_PROFILES); - if (selectedProfiles == null || selectedProfiles.isEmpty()) return false; + return getTargetState(e) != null; + } + + private static MavenProfileKind getTargetState(AnActionEvent e) { + Map selectedProfiles = e.getData(MavenDataKeys.MAVEN_PROFILES); + if (selectedProfiles == null || selectedProfiles.isEmpty()) return null; - Collection activeProfiles = MavenActionUtil.getProjectsManager(e.getDataContext()).getExplicitProfiles(); - int activeCount = 0; - for (String profile : selectedProfiles) { - if (activeProfiles.contains(profile)) { - activeCount++; + MavenProjectsManager projectsManager = MavenActionUtil.getProjectsManager(e.getDataContext()); + return getTargetState(projectsManager, selectedProfiles); + } + + private static MavenProfileKind getTargetState(MavenProjectsManager projectsManager, Map profiles) { + MavenExplicitProfiles explicitProfiles = projectsManager.getExplicitProfiles(); + MavenProfileKind targetState = null; + // all profiles should target to the same state + for (Map.Entry profile : profiles.entrySet()) { + MavenProfileKind profileTargetState = getTargetState(profile, explicitProfiles); + if (targetState == null) { + targetState = profileTargetState; + } + else if (!targetState.equals(profileTargetState)) { + targetState = null; + break; } } - return activeCount == 0 || activeCount == selectedProfiles.size(); + return targetState; } - private static boolean isActive(MavenProjectsManager projectsManager, List profiles) { - return projectsManager.getExplicitProfiles().contains(profiles.get(0)); + private static MavenProfileKind getTargetState(Map.Entry profile, MavenExplicitProfiles explicitProfiles) { + MavenProfileKind targetState; + if (explicitProfiles.getDisabledProfiles().contains(profile.getKey())) { + // explicitly disabled -> explicitly enabled + targetState = MavenProfileKind.EXPLICIT; + } + else if (explicitProfiles.getEnabledProfiles().contains(profile.getKey())) { + // explicitly enabled -> default + targetState = MavenProfileKind.IMPLICIT; + } + else { + // default + if (MavenProfileKind.NONE.equals(profile.getValue())) { + // default inactive -> explicitly enabled + targetState = MavenProfileKind.EXPLICIT; + } + else { + // default active -> explicitly disabled + targetState = MavenProfileKind.NONE; + } + } + return targetState; } @Override public void actionPerformed(AnActionEvent e) { MavenProjectsManager manager = MavenActionUtil.getProjectsManager(e.getDataContext()); - List selectedProfiles = e.getData(MavenDataKeys.MAVEN_PROFILES); + Map selectedProfiles = e.getData(MavenDataKeys.MAVEN_PROFILES); + Set selectedProfileIds = selectedProfiles.keySet(); - Set activeProfiles = new HashSet(manager.getExplicitProfiles()); - if (isActive(manager, selectedProfiles)) { - activeProfiles.removeAll(selectedProfiles); - } - else { - activeProfiles.addAll(selectedProfiles); + MavenProfileKind targetState = getTargetState(manager, selectedProfiles); + MavenExplicitProfiles newExplicitProfiles = manager.getExplicitProfiles().clone(); + switch (targetState) { + case NONE: + // disable explicitly + newExplicitProfiles.getEnabledProfiles().removeAll(selectedProfileIds); + newExplicitProfiles.getDisabledProfiles().addAll(selectedProfileIds); + break; + case EXPLICIT: + // enable explicitly + newExplicitProfiles.getDisabledProfiles().removeAll(selectedProfileIds); + newExplicitProfiles.getEnabledProfiles().addAll(selectedProfileIds); + break; + case IMPLICIT: + default: + // reset to default state + newExplicitProfiles.getEnabledProfiles().removeAll(selectedProfileIds); + newExplicitProfiles.getDisabledProfiles().removeAll(selectedProfileIds); + break; } - manager.setExplicitProfiles(activeProfiles); + manager.setExplicitProfiles(newExplicitProfiles); } } -- cgit v1.2.3