lock free findChildById
[idea/community.git] / platform / lang-impl / src / com / intellij / execution / console / ConsoleFoldingConfigurable.java
1 package com.intellij.execution.console;
2
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;
14
15 import javax.swing.*;
16 import java.awt.*;
17 import java.util.ArrayList;
18 import java.util.Arrays;
19 import java.util.List;
20
21 /**
22  * @author peter
23  */
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();
29
30   @Override
31   public JComponent createComponent() {
32     if (myMainComponent == null) {
33       myMainComponent = new JPanel(new BorderLayout());
34       Splitter splitter = new Splitter(true);
35       myMainComponent.add(splitter);
36       myPositivePanel =
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);
41
42       myPositivePanel.getEmptyText().setText("Fold nothing");
43       myNegativePanel.getEmptyText().setText("No exceptions");
44     }
45     return myMainComponent;
46   }
47
48   public void addRule(@NotNull String rule) {
49     myPositivePanel.addRule(rule);
50   }
51
52   @Override
53   public boolean isModified() {
54     return !Arrays.asList(myNegativePanel.getListItems()).equals(mySettings.getNegativePatterns()) ||
55            !Arrays.asList(myPositivePanel.getListItems()).equals(mySettings.getPositivePatterns());
56
57   }
58
59   @Override
60   public void apply() throws ConfigurationException {
61     myNegativePanel.applyTo(mySettings.getNegativePatterns());
62     myPositivePanel.applyTo(mySettings.getPositivePatterns());
63   }
64
65   @Override
66   public void reset() {
67     myNegativePanel.resetFrom(mySettings.getNegativePatterns());
68     myPositivePanel.resetFrom(mySettings.getPositivePatterns());
69   }
70
71   @Override
72   public void disposeUIResources() {
73     myMainComponent = null;
74     myNegativePanel = null;
75     myPositivePanel = null;
76   }
77
78   @Override
79   @NotNull
80   public String getId() {
81     return getDisplayName();
82   }
83
84   @Override
85   public Runnable enableSearch(String option) {
86     return null;
87   }
88
89   @Override
90   @Nls
91   public String getDisplayName() {
92     return "Console Folding";
93   }
94
95   @Override
96   public String getHelpTopic() {
97     return "reference.idesettings.console.folding";
98   }
99
100   private static class MyAddDeleteListPanel extends AddEditDeleteListPanel<String> {
101     private final String myQuery;
102
103     public MyAddDeleteListPanel(String title, String query) {
104       super(title, new ArrayList<String>());
105       myQuery = query;
106     }
107
108     @Override
109     @Nullable
110     protected String findItemToAdd() {
111       return showEditDialog("");
112     }
113
114     @Nullable
115     private String showEditDialog(final String initialValue) {
116       return Messages.showInputDialog(this, myQuery, "Folding Pattern", Messages.getQuestionIcon(), initialValue, new InputValidatorEx() {
117         @Override
118         public boolean checkInput(String inputString) {
119            return !StringUtil.isEmpty(inputString);
120         }
121
122         @Override
123         public boolean canClose(String inputString) {
124           return !StringUtil.isEmpty(inputString);
125         }
126
127         @Nullable
128         @Override
129         public String getErrorText(String inputString) {
130           if (!checkInput(inputString)) {
131             return "Console folding rule string cannot be empty";
132           }
133           return null;
134         }
135       });
136     }
137
138     void resetFrom(List<String> patterns) {
139       myListModel.clear();
140       for (String pattern : patterns) {
141         myListModel.addElement(pattern);
142       }
143     }
144
145     void applyTo(List<String> patterns) {
146       patterns.clear();
147       for (Object o : getListItems()) {
148         patterns.add((String)o);
149       }
150     }
151
152     public void addRule(String rule) {
153       addElement(rule);
154     }
155
156     @Override
157     public void setBounds(int x, int y, int width, int height) {
158       super.setBounds(x, y, width, height);
159     }
160
161     @Override
162     protected String editSelectedItem(String item) {
163       return showEditDialog(item);
164     }
165   }
166 }