1 package com.intellij.execution.console;
3 import com.intellij.openapi.options.Configurable;
4 import com.intellij.openapi.options.ConfigurationException;
5 import com.intellij.openapi.options.SearchableConfigurable;
6 import com.intellij.openapi.ui.InputValidatorEx;
7 import com.intellij.openapi.ui.Messages;
8 import com.intellij.openapi.ui.Splitter;
9 import com.intellij.openapi.util.text.StringUtil;
10 import com.intellij.ui.AddEditDeleteListPanel;
11 import org.jetbrains.annotations.Nls;
12 import org.jetbrains.annotations.NotNull;
13 import org.jetbrains.annotations.Nullable;
17 import java.util.ArrayList;
18 import java.util.Arrays;
19 import java.util.List;
24 public class ConsoleFoldingConfigurable implements SearchableConfigurable, Configurable.NoScroll {
25 private JPanel myMainComponent;
26 private MyAddDeleteListPanel myPositivePanel;
27 private MyAddDeleteListPanel myNegativePanel;
28 private final ConsoleFoldingSettings mySettings = ConsoleFoldingSettings.getSettings();
31 public JComponent createComponent() {
32 if (myMainComponent == null) {
33 myMainComponent = new JPanel(new BorderLayout());
34 Splitter splitter = new Splitter(true);
35 myMainComponent.add(splitter);
37 new MyAddDeleteListPanel("Fold console lines that contain", "Enter a substring of a console line you'd like to see folded:");
38 myNegativePanel = new MyAddDeleteListPanel("Exceptions", "Enter a substring of a console line you don't want to fold:");
39 splitter.setFirstComponent(myPositivePanel);
40 splitter.setSecondComponent(myNegativePanel);
42 myPositivePanel.getEmptyText().setText("Fold nothing");
43 myNegativePanel.getEmptyText().setText("No exceptions");
45 return myMainComponent;
48 public void addRule(@NotNull String rule) {
49 myPositivePanel.addRule(rule);
53 public boolean isModified() {
54 return !Arrays.asList(myNegativePanel.getListItems()).equals(mySettings.getNegativePatterns()) ||
55 !Arrays.asList(myPositivePanel.getListItems()).equals(mySettings.getPositivePatterns());
60 public void apply() throws ConfigurationException {
61 myNegativePanel.applyTo(mySettings.getNegativePatterns());
62 myPositivePanel.applyTo(mySettings.getPositivePatterns());
67 myNegativePanel.resetFrom(mySettings.getNegativePatterns());
68 myPositivePanel.resetFrom(mySettings.getPositivePatterns());
72 public void disposeUIResources() {
73 myMainComponent = null;
74 myNegativePanel = null;
75 myPositivePanel = null;
80 public String getId() {
81 return getDisplayName();
85 public Runnable enableSearch(String option) {
91 public String getDisplayName() {
92 return "Console Folding";
96 public String getHelpTopic() {
97 return "reference.idesettings.console.folding";
100 private static class MyAddDeleteListPanel extends AddEditDeleteListPanel<String> {
101 private final String myQuery;
103 public MyAddDeleteListPanel(String title, String query) {
104 super(title, new ArrayList<String>());
110 protected String findItemToAdd() {
111 return showEditDialog("");
115 private String showEditDialog(final String initialValue) {
116 return Messages.showInputDialog(this, myQuery, "Folding Pattern", Messages.getQuestionIcon(), initialValue, new InputValidatorEx() {
118 public boolean checkInput(String inputString) {
119 return !StringUtil.isEmpty(inputString);
123 public boolean canClose(String inputString) {
124 return !StringUtil.isEmpty(inputString);
129 public String getErrorText(String inputString) {
130 if (!checkInput(inputString)) {
131 return "Console folding rule string cannot be empty";
138 void resetFrom(List<String> patterns) {
140 for (String pattern : patterns) {
141 myListModel.addElement(pattern);
145 void applyTo(List<String> patterns) {
147 for (Object o : getListItems()) {
148 patterns.add((String)o);
152 public void addRule(String rule) {
157 public void setBounds(int x, int y, int width, int height) {
158 super.setBounds(x, y, width, height);
162 protected String editSelectedItem(String item) {
163 return showEditDialog(item);