package krasa.grepconsole.gui;
import com.intellij.ide.DefaultTreeExpander;
import com.intellij.ui.CheckedTreeNode;
import com.intellij.ui.ColoredTreeCellRenderer;
import com.intellij.ui.treeStructure.treetable.TreeColumnInfo;
import com.intellij.util.PlatformIcons;
import com.intellij.util.ui.ColumnInfo;
import krasa.grepconsole.gui.table.CheckboxTreeCellRendererBase;
import krasa.grepconsole.gui.table.CheckboxTreeTable;
import krasa.grepconsole.gui.table.TableRowTransferHandler;
import krasa.grepconsole.gui.table.column.*;
import krasa.grepconsole.model.GrepExpressionGroup;
import krasa.grepconsole.model.GrepExpressionItem;
import org.apache.commons.lang.StringUtils;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.util.ArrayList;
import java.util.List;
/**
* @author Vojtech Krasa
*/
public class SettingsTableBuilder {
public static final String STATUS_BAR_COUNT = "StatusBar count";
public static final String CONSOLE_COUNT = "Console count";
private CheckboxTreeTable table;
public SettingsTableBuilder(final SettingsDialog settingsDialog) {
List<ColumnInfo> columns = new ArrayList<>();
columns.add(new TreeColumnInfo("") {
@Nullable
@Override
public String getPreferredStringValue() {
return "________________";
}
@Override
public int getWidth(JTable table) {
return 64;
}
});
columns.add(new GroupNameAdapter(new JavaBeanColumnInfo<GrepExpressionItem, String>("Expression",
"grepExpression").preferedStringValue("___________________________________")));
JavaBeanColumnInfo<GrepExpressionItem, String> unless = new JavaBeanColumnInfo<>(
"Unless expression", "unlessGrepExpression");
columns.add(new FolderColumnInfoWrapper(unless.preferedStringValue("______________")));
unless.addListener(new ValueChangedListener<GrepExpressionItem, String>() {
@Override
public void onValueChanged(GrepExpressionItem grepExpressionItem, String newValue) {
if (!StringUtils.isEmpty(newValue)) {
grepExpressionItem.setWholeLine(true);
}
}
});
CheckBoxJavaBeanColumnInfo<GrepExpressionItem> inputFilter = new CheckBoxJavaBeanColumnInfo<>(
"Filter out", "inputFilter");
inputFilter.addListener(new ValueChangedListener<GrepExpressionItem, Boolean>() {
@Override
public void onValueChanged(GrepExpressionItem grepExpressionItem, Boolean newValue) {
if (newValue && !settingsDialog.getProfile().isEnabledInputFiltering()) {
settingsDialog.getProfile().setEnabledInputFiltering(true);
settingsDialog.setData(settingsDialog.getProfile());
}
}
});
columns.add(new FolderColumnInfoWrapper(inputFilter));
CheckBoxJavaBeanColumnInfo<GrepExpressionItem> fold = new CheckBoxJavaBeanColumnInfo<>(
"Fold", "fold");
fold.addListener(new ValueChangedListener<GrepExpressionItem, Boolean>() {
@Override
public void onValueChanged(GrepExpressionItem grepExpressionItem, Boolean newValue) {
if (newValue && !settingsDialog.getProfile().isEnableFoldings()) {
settingsDialog.getProfile().setEnableFoldings(true);
settingsDialog.setData(settingsDialog.getProfile());
}
}
});
columns.add(new FolderColumnInfoWrapper(fold));
columns.add(new FolderColumnInfoWrapper(new CheckBoxJavaBeanColumnInfo<GrepExpressionItem>(
"Whole line", "wholeLine").tooltipText("Match a whole line, otherwise find a matching substrings - 'Unless expression' works only for whole lines.")));
columns.add(new FolderColumnInfoWrapper(
new CheckBoxJavaBeanColumnInfo<GrepExpressionItem>("Continue matching", "continueMatching").tooltipText("If true, match a line against next configured items to apply multiple styles")));
columns.add(new FolderColumnInfoWrapper(new CheckBoxJavaBeanColumnInfo<GrepExpressionItem>("Case insensitive",
"caseInsensitive")));
columns.add(new FolderColumnInfoWrapper(
new CheckBoxJavaBeanColumnInfo<GrepExpressionItem>("Bold", "style.bold")));
columns.add(new FolderColumnInfoWrapper(new CheckBoxJavaBeanColumnInfo<GrepExpressionItem>("Italic",
"style.italic")));
columns.add(new FolderColumnInfoWrapper(new ColorChooserJavaBeanColumnInfo<GrepExpressionItem>("Background",
"style.backgroundColor")));
columns.add(new FolderColumnInfoWrapper(new ColorChooserJavaBeanColumnInfo<GrepExpressionItem>("Foreground",
"style.foregroundColor")));
columns.add(new FolderColumnInfoWrapper(
new CheckBoxJavaBeanColumnInfo<GrepExpressionItem>(STATUS_BAR_COUNT, "showCountInStatusBar").tooltipText("Show count of occurrences in Status Bar statistics panel\n(the number may not be right for test executions)")));
columns.add(new FolderColumnInfoWrapper(
new CheckBoxJavaBeanColumnInfo<GrepExpressionItem>(CONSOLE_COUNT, "showCountInConsole").tooltipText("Show count of occurrences in Console statistics panel\n(the number may not be right for test executions)")));
columns.add(new FolderColumnInfoWrapper(new SoundColumn("Sound", settingsDialog)));
CheckboxTreeCellRendererBase renderer = new CheckboxTreeCellRendererBase() {
@Override
public void customizeRenderer(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf,
int row, boolean hasFocus) {
if (value instanceof CheckedTreeNode) {
CheckedTreeNode checkedTreeNode = (CheckedTreeNode) value;
Object userObject = checkedTreeNode.getUserObject();
if (userObject instanceof GrepExpressionGroup) {
Icon icon = PlatformIcons.DIRECTORY_CLOSED_ICON;
final ColoredTreeCellRenderer textRenderer = getTextRenderer();
textRenderer.setIcon(icon);
}
}
}
};
table = new CheckboxTreeTable(createRoot(), renderer, columns.toArray(new ColumnInfo[columns.size()]));
table.setDragEnabled(true);
table.setDropMode(DropMode.INSERT_ROWS);
table.setTransferHandler(new TableRowTransferHandler(table, settingsDialog));
table.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
final DefaultTreeExpander treeExpander = new DefaultTreeExpander(table.getTree());
treeExpander.expandAll();
}
private CheckedTreeNode createRoot() {
CheckedTreeNode root = new CheckedTreeNode(null);
return root;
}
public CheckboxTreeTable getTable() {
return table;
}
}