package name.admitriev.jhelper.actions; import com.intellij.execution.RunManager; import com.intellij.execution.configurations.RunConfiguration; import com.intellij.ide.DataManager; import com.intellij.notification.NotificationType; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.CommonDataKeys; import com.intellij.openapi.actionSystem.DefaultActionGroup; import com.intellij.openapi.actionSystem.Presentation; import com.intellij.openapi.actionSystem.ex.ComboBoxAction; import com.intellij.openapi.project.Project; import com.jetbrains.cidr.cpp.cmake.model.CMakeConfiguration; import com.jetbrains.cidr.cpp.cmake.model.CMakeTarget; import com.jetbrains.cidr.cpp.execution.CMakeAppRunConfiguration; import com.jetbrains.cidr.cpp.execution.CMakeBuildConfigurationHelper; import com.jetbrains.cidr.execution.BuildTargetAndConfigurationData; import name.admitriev.jhelper.configuration.TaskRunner; import name.admitriev.jhelper.ui.Notificator; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.util.List; public class SwitchCMakeConfigurationAction extends ComboBoxAction { @NotNull @Override public DefaultActionGroup createPopupActionGroup(JComponent button) { DefaultActionGroup actions = new DefaultActionGroup(); Project project = CommonDataKeys.PROJECT.getData(DataManager.getInstance().getDataContext(button)); if (!isProjectValid(project)) { return actions; } CMakeAppRunConfiguration testRunner = getTestRunner(project); if (testRunner == null) { Notificator.showNotification( "No configuration named " + TaskRunner.RUN_CONFIGURATION_NAME + " found", NotificationType.ERROR ); return actions; } CMakeTarget target = testRunner.getBuildAndRunConfigurations().buildConfiguration.getTarget(); List<CMakeConfiguration> configurations = new CMakeBuildConfigurationHelper(project).getConfigurations(target); for (CMakeConfiguration configuration : configurations) { actions.add( new AnAction(configuration.getName()) { @Override public void actionPerformed(AnActionEvent e) { testRunner.setTargetAndConfigurationData( new BuildTargetAndConfigurationData( target, configuration ) ); } } ); } return actions; } @Override public void update(AnActionEvent e) { Presentation presentation = e.getPresentation(); Project project = e.getProject(); String buildConfigurationName = getBuildConfigurationName(project); if (buildConfigurationName == null) { presentation.setEnabled(false); presentation.setText(""); } else { presentation.setEnabled(true); presentation.setText(buildConfigurationName); } } @Nullable private static String getBuildConfigurationName(@Nullable Project project) { if (!isProjectValid(project)) { return null; } CMakeAppRunConfiguration testRunner = getTestRunner(project); if (testRunner == null) { return null; } CMakeAppRunConfiguration.BuildAndRunConfigurations configurations = testRunner.getBuildAndRunConfigurations(); if (configurations == null) { return null; } CMakeConfiguration buildConfiguration = configurations.buildConfiguration; return buildConfiguration.getName(); } private static boolean isProjectValid(Project project) { return project != null && !project.isDisposed() && project.isInitialized(); } @Nullable private static CMakeAppRunConfiguration getTestRunner(@NotNull Project project) { for (RunConfiguration configuration : RunManager.getInstance(project).getAllConfigurationsList()) { if (configuration.getName().equals(TaskRunner.RUN_CONFIGURATION_NAME)) { return (CMakeAppRunConfiguration) configuration; } } return null; } }