package com.intellij.lang.javascript.flex.projectStructure.ui;
import com.intellij.lang.javascript.flex.FlexBundle;
import com.intellij.lang.javascript.flex.FlexModuleType;
import com.intellij.lang.javascript.flex.projectStructure.FlexBuildConfigurationsExtension;
import com.intellij.lang.javascript.flex.projectStructure.model.FlexBuildConfiguration;
import com.intellij.lang.javascript.flex.projectStructure.model.FlexBuildConfigurationManager;
import com.intellij.lang.javascript.flex.projectStructure.options.BCUtils;
import com.intellij.openapi.actionSystem.*;
import com.intellij.openapi.actionSystem.impl.SimpleDataContext;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleType;
import com.intellij.openapi.options.ShowSettingsUtil;
import com.intellij.openapi.project.DumbAwareAction;
import com.intellij.openapi.roots.ui.configuration.ProjectStructureConfigurable;
import com.intellij.openapi.ui.popup.ListPopup;
import com.intellij.openapi.util.Condition;
import com.intellij.ui.RowIcon;
import com.intellij.ui.SimpleColoredComponent;
import com.intellij.ui.SimpleColoredText;
import com.intellij.ui.SimpleTextAttributes;
import com.intellij.ui.navigation.Place;
import com.intellij.ui.popup.PopupFactoryImpl;
import com.intellij.ui.popup.list.PopupListElementRenderer;
import com.intellij.util.PlatformIcons;
import com.intellij.util.ui.EmptyIcon;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import java.awt.*;
import java.util.Arrays;
import java.util.Comparator;
public class ChooseActiveBuildConfigurationAction extends DumbAwareAction {
private static final Icon ICON_ACTIVE = PlatformIcons.CHECK_ICON;
private static final Icon ICON_ACTIVE_SELECTED = PlatformIcons.CHECK_ICON_SELECTED;
private static final Icon ICON_EMPTY = EmptyIcon.create(ICON_ACTIVE);
public void update(final AnActionEvent e) {
boolean enabled = isEnabled(e.getDataContext());
if (ActionPlaces.isPopupPlace(e.getPlace())) {
e.getPresentation().setVisible(enabled);
e.getPresentation().setEnabled(enabled);
}
else {
//e.getPresentation().setDescription(FlexBundle.message());
e.getPresentation().setVisible(true);
e.getPresentation().setEnabled(enabled);
}
}
private static boolean isEnabled(final DataContext dataContext) {
Module module = LangDataKeys.MODULE.getData(dataContext);
return module != null && ModuleType.get(module) == FlexModuleType.getInstance();
}
public void actionPerformed(final AnActionEvent e) {
Module module = LangDataKeys.MODULE.getData(e.getDataContext());
if (module != null) {
createPopup(module).showInBestPositionFor(e.getDataContext());
}
}
public static ListPopup createPopup(@NotNull Module module) {
final DefaultActionGroup actionGroup = new DefaultActionGroup();
final FlexBuildConfigurationManager manager = FlexBuildConfigurationManager.getInstance(module);
final FlexBuildConfiguration activeBc = manager.getActiveConfiguration();
final FlexBuildConfiguration[] bcs = manager.getBuildConfigurations();
Arrays.sort(bcs, (o1, o2) -> o1.getName().compareToIgnoreCase(o2.getName()));
for (final FlexBuildConfiguration bc : bcs) {
actionGroup.add(new SelectBcAction(bc, manager));
}
actionGroup.addSeparator();
actionGroup.add(new EditBcsAction(module));
final DataContext dataContext = SimpleDataContext.getProjectContext(module.getProject());
return new PopupFactoryImpl.ActionGroupPopup(FlexBundle.message("choose.build.configuration.popup.title", module.getName()),
actionGroup, dataContext, false, false, false, true, null, -1,
anAction -> anAction instanceof SelectBcAction && ((SelectBcAction)anAction).getBC() == activeBc, null) {
@Override
protected ListCellRenderer getListElementRenderer() {
return new PopupListElementRenderer(this) {
{
//myRendererComponent.setBorder(new EmptyBorder(5, 0, 5, 0));
}
@Override
protected JComponent createItemComponent() {
return new MyPanel();
}
@Override
public Component getListCellRendererComponent(final JList list,
final Object value,
final int index,
final boolean isSelected,
final boolean cellHasFocus) {
MyPanel p = (MyPanel)myComponent;
p.clear();
PopupFactoryImpl.ActionItem actionItem = (PopupFactoryImpl.ActionItem)value;
AnAction anAction = actionItem.getAction();
SimpleColoredText text;
Icon icon;
boolean isActive;
if (anAction instanceof SelectBcAction) {
FlexBuildConfiguration bc = ((SelectBcAction)anAction).getBC();
isActive = bc == activeBc;
text = BCUtils.renderBuildConfiguration(bc, null, isActive);
icon = bc.getIcon();
}
else {
text = new SimpleColoredText(anAction.getTemplatePresentation().getText(), SimpleTextAttributes.REGULAR_ATTRIBUTES);
icon = anAction.getTemplatePresentation().getIcon();
isActive = false;
}
RowIcon rowIcon = new RowIcon(2);
rowIcon.setIcon(isActive ? (isSelected ? ICON_ACTIVE_SELECTED : ICON_ACTIVE) : ICON_EMPTY, 0);
rowIcon.setIcon(icon, 1);
p.setIcon(rowIcon);
if (isSelected) {
text = text.derive(SimpleTextAttributes.SELECTED_SIMPLE_CELL_ATTRIBUTES, true);
setSelected(p);
}
else {
setDeselected(p);
}
p.setText(text);
mySeparatorComponent.setVisible(actionItem.isPrependWithSeparator());
return myRendererComponent;
}
};
}
};
}
private static class SelectBcAction extends DumbAwareAction {
private final FlexBuildConfiguration myBc;
private final FlexBuildConfigurationManager myManager;
public SelectBcAction(final FlexBuildConfiguration bc, final FlexBuildConfigurationManager manager) {
super(bc.getName(), getDescription(bc), bc.getIcon());
myBc = bc;
myManager = manager;
}
private static String getDescription(final FlexBuildConfiguration bc) {
return bc.getNature().getPresentableText();
}
public void actionPerformed(final AnActionEvent e) {
myManager.setActiveBuildConfiguration(myBc);
}
public FlexBuildConfiguration getBC() {
return myBc;
}
}
private static class EditBcsAction extends DumbAwareAction {
private final Module myModule;
public EditBcsAction(Module module) {
super(null);
myModule = module;
final AnAction a = ActionManager.getInstance().getAction("ShowProjectStructureSettings");
getTemplatePresentation().copyFrom(a.getTemplatePresentation());
}
@Override
public void actionPerformed(AnActionEvent e) {
final FlexBuildConfiguration activeConfiguration = FlexBuildConfigurationManager.getInstance(myModule).getActiveConfiguration();
final ProjectStructureConfigurable c = ProjectStructureConfigurable.getInstance(myModule.getProject());
ShowSettingsUtil.getInstance().editConfigurable(myModule.getProject(), c, () -> {
Place p = FlexBuildConfigurationsExtension.getInstance().getConfigurator().getPlaceFor(myModule, activeConfiguration.getName());
c.navigateTo(p, true);
});
}
}
private static class MyPanel extends JPanel {
private final SimpleColoredComponent myComponent;
public MyPanel() {
super(new BorderLayout());
setBorder(new EmptyBorder(2, 0, 2, 0));
setOpaque(true);
myComponent = new SimpleColoredComponent();
myComponent.setIconOpaque(false);
myComponent.setOpaque(false);
add(myComponent, BorderLayout.CENTER);
}
public void setText(final SimpleColoredText text) {
text.appendToComponent(myComponent);
}
public void setIcon(final Icon icon) {
myComponent.setIcon(icon);
}
public void clear() {
myComponent.clear();
}
}
}