package com.intellij.lang.javascript.flex.run;
import com.intellij.lang.javascript.flex.FlexModuleType;
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.module.Module;
import com.intellij.openapi.module.ModuleManager;
import com.intellij.openapi.module.ModuleType;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Pair;
import com.intellij.ui.ColoredListCellRendererWrapper;
import com.intellij.ui.SimpleColoredText;
import com.intellij.ui.SimpleTextAttributes;
import gnu.trove.THashMap;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Map;
public class BCCombo extends JComboBox {
private final Project myProject;
private FlexBuildConfiguration[] myAllConfigs;
private boolean mySingleModuleProject;
private Map<FlexBuildConfiguration, Module> myBCToModuleMap = new THashMap<>();
public BCCombo(final Project project) {
myProject = project;
initCombo();
}
private void initCombo() {
setMinimumSize(new Dimension(150, getMinimumSize().height));
final Collection<FlexBuildConfiguration> allConfigs = new ArrayList<>();
final Module[] modules = ModuleManager.getInstance(myProject).getModules();
mySingleModuleProject = modules.length == 1;
for (final Module module : modules) {
if (ModuleType.get(module) instanceof FlexModuleType) {
for (final FlexBuildConfiguration config : FlexBuildConfigurationManager.getInstance(module).getBuildConfigurations()) {
allConfigs.add(config);
myBCToModuleMap.put(config, module);
}
}
}
myAllConfigs = allConfigs.toArray(new FlexBuildConfiguration[allConfigs.size()]);
setRenderer(new ColoredListCellRendererWrapper() {
@Override
protected void doCustomize(final JList list, final Object value, final int index, final boolean selected, final boolean hasFocus) {
if (value instanceof Pair) {
final String moduleName = (String)((Pair)value).first;
final String configName = (String)((Pair)value).second;
//setIcon(PlatformIcons.ERROR_INTRODUCTION_ICON);
if (moduleName.isEmpty() || configName.isEmpty()) {
append(new SimpleColoredText("[none]", SimpleTextAttributes.ERROR_ATTRIBUTES));
}
else {
append(BCUtils.renderMissingBuildConfiguration(configName, moduleName));
}
}
else {
assert value instanceof FlexBuildConfiguration : value;
final FlexBuildConfiguration bc = (FlexBuildConfiguration)value;
setIcon(bc.getIcon());
append(BCUtils.renderBuildConfiguration(bc, mySingleModuleProject ? null : myBCToModuleMap.get(bc).getName()));
}
}
});
addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
// remove invalid entry
final Object selectedItem = getSelectedItem();
final Object firstItem = getItemAt(0);
if (selectedItem instanceof FlexBuildConfiguration && !(firstItem instanceof FlexBuildConfiguration)) {
setModel(new DefaultComboBoxModel(myAllConfigs));
setSelectedItem(selectedItem);
}
}
});
}
public void resetFrom(final BCBasedRunnerParameters params) {
final Module module = ModuleManager.getInstance(myProject).findModuleByName(params.getModuleName());
final FlexBuildConfiguration config = module != null && (ModuleType.get(module) instanceof FlexModuleType)
? FlexBuildConfigurationManager.getInstance(module).findConfigurationByName(params.getBCName())
: null;
if (config == null) {
final Object[] model = new Object[myAllConfigs.length + 1];
model[0] = Pair.create(params.getModuleName(), params.getBCName());
System.arraycopy(myAllConfigs, 0, model, 1, myAllConfigs.length);
setModel(new DefaultComboBoxModel(model));
setSelectedIndex(0);
}
else {
setModel(new DefaultComboBoxModel(myAllConfigs));
setSelectedItem(config);
}
}
public void applyTo(final BCBasedRunnerParameters params) {
final Object selectedItem = getSelectedItem();
if (selectedItem instanceof Pair) {
params.setModuleName((String)((Pair)selectedItem).first);
params.setBCName((String)((Pair)selectedItem).second);
}
else {
assert selectedItem instanceof FlexBuildConfiguration : selectedItem;
params.setModuleName(myBCToModuleMap.get(((FlexBuildConfiguration)selectedItem)).getName());
params.setBCName(((FlexBuildConfiguration)selectedItem).getName());
}
}
public void dispose() {
myAllConfigs = null;
myBCToModuleMap = null;
}
@Nullable
public FlexBuildConfiguration getBC() {
final Object selectedItem = getSelectedItem();
return selectedItem instanceof FlexBuildConfiguration ? (FlexBuildConfiguration)selectedItem : null;
}
@Nullable
public Module getModule() {
final Object selectedItem = getSelectedItem();
return selectedItem instanceof FlexBuildConfiguration ? myBCToModuleMap.get((FlexBuildConfiguration)selectedItem) : null;
}
private static String getPresentableText(final String moduleName, final String configName, final boolean singleModuleProject) {
if (moduleName.isEmpty() || configName.isEmpty()) return "[none]";
return singleModuleProject ? configName : configName + " (" + moduleName + ")";
}
}