package com.intellij.lang.javascript.flex.projectStructure.ui;
import com.intellij.lang.javascript.flex.FlexBundle;
import com.intellij.lang.javascript.flex.FlexUtils;
import com.intellij.flex.model.bc.CompilerOptionInfo;
import com.intellij.lang.javascript.flex.projectStructure.model.FlexBuildConfiguration;
import com.intellij.lang.javascript.flex.projectStructure.options.BCUtils;
import com.intellij.lang.javascript.psi.ecmal4.JSClass;
import com.intellij.lang.javascript.refactoring.ui.JSReferenceEditor;
import com.intellij.lang.javascript.ui.JSClassChooserDialog;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.DumbService;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.ui.JBColor;
import com.intellij.util.ui.AbstractTableCellEditor;
import javax.swing.*;
import javax.swing.table.DefaultTableCellRenderer;
import java.awt.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public class RLMsDialog extends RepeatableValueDialog {
private final Module myModule;
public RLMsDialog(final Module module, final Collection<FlexBuildConfiguration.RLMInfo> rlms) {
super(module.getProject(), FlexBundle.message("rlms.dialog.title"), toStringBuilderList(rlms), CompilerOptionInfo.RLMS_INFO_FOR_UI);
myModule = module;
setEditAddedRow(false);
myTable.getColumnModel().getColumn(0).setCellRenderer(createMainClassRenderer(module));
myTable.getColumnModel().getColumn(0).setCellEditor(createMainClassEditor(module));
}
private static List<StringBuilder> toStringBuilderList(final Collection<FlexBuildConfiguration.RLMInfo> rlms) {
final List<StringBuilder> result = new ArrayList<>();
for (FlexBuildConfiguration.RLMInfo rlm : rlms) {
result.add(new StringBuilder()
.append(rlm.MAIN_CLASS)
.append(CompilerOptionInfo.LIST_ENTRY_PARTS_SEPARATOR)
.append(rlm.OUTPUT_FILE)
.append(CompilerOptionInfo.LIST_ENTRY_PARTS_SEPARATOR)
.append(rlm.OPTIMIZE));
}
return result;
}
private static DefaultTableCellRenderer createMainClassRenderer(final Module module) {
return new DefaultTableCellRenderer() {
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
int row, int column) {
final Component component = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
final String fqn = String.valueOf(value);
setText(fqn);
setForeground(isSelected
? table.getSelectionForeground()
: FlexUtils.getPathToMainClassFile(fqn, module).isEmpty()
? JBColor.RED
: table.getForeground());
return component;
}
};
}
private static AbstractTableCellEditor createMainClassEditor(final Module module) {
return new AbstractTableCellEditor() {
private JSReferenceEditor mainClassComponent;
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
mainClassComponent =
JSReferenceEditor.forClassName("", module.getProject(), null, module.getModuleScope(false), null, null,
FlexBundle.message("choose.rlm.main.class.title"));
mainClassComponent.setText(String.valueOf(value));
return mainClassComponent;
}
public Object getCellEditorValue() {
return mainClassComponent.getText();
}
};
}
protected boolean addObject() {
if (DumbService.isDumb(myProject)) {
return super.addObject();
}
final JSClassChooserDialog chooser = new JSClassChooserDialog(myProject, FlexBundle.message("choose.rlm.main.class.title"),
myModule.getModuleScope(false), null, null);
if (chooser.showDialog()) {
final JSClass clazz = chooser.getSelectedClass();
if (clazz != null) {
final StringBuilder b = new StringBuilder();
b.append(clazz.getQualifiedName());
b.append(CompilerOptionInfo.LIST_ENTRY_PARTS_SEPARATOR);
b.append(BCUtils.suggestRLMOutputPath(clazz.getQualifiedName()));
b.append(CompilerOptionInfo.LIST_ENTRY_PARTS_SEPARATOR);
b.append("true");
getCurrentList().add(b);
return true;
}
else {
return false;
}
}
else {
return false;
}
}
public Collection<FlexBuildConfiguration.RLMInfo> getRLMs() {
final List<StringBuilder> currentList = getCurrentList();
final Collection<FlexBuildConfiguration.RLMInfo> result = new ArrayList<>(currentList.size());
for (StringBuilder listEntry : currentList) {
final List<String> parts = StringUtil.split(listEntry.toString(), CompilerOptionInfo.LIST_ENTRY_PARTS_SEPARATOR, true, false);
assert parts.size() == 3 : listEntry;
result.add(new FlexBuildConfiguration.RLMInfo(parts.get(0), parts.get(1), Boolean.valueOf(parts.get(2))));
}
return result;
}
protected String getHelpId() {
return "Runtime-Loaded_Modules_dialog";
}
}