OSDN Git Service

a6cbb78b2d3ba8d4a29a51670102b8e4dc352a92
[stigmata/stigmata.git] / src / main / java / jp / sourceforge / stigmata / ui / swing / filter / FilterSetDefinitionPane.java
1 package jp.sourceforge.stigmata.ui.swing.filter;
2
3 import java.awt.BorderLayout;
4 import java.awt.GridLayout;
5 import java.awt.event.ActionEvent;
6 import java.awt.event.ActionListener;
7
8 import javax.swing.Box;
9 import javax.swing.ButtonGroup;
10 import javax.swing.DefaultListModel;
11 import javax.swing.JButton;
12 import javax.swing.JList;
13 import javax.swing.JPanel;
14 import javax.swing.JRadioButton;
15 import javax.swing.JScrollPane;
16 import javax.swing.JTextField;
17 import javax.swing.ListSelectionModel;
18 import javax.swing.event.DocumentEvent;
19 import javax.swing.event.DocumentListener;
20 import javax.swing.event.ListSelectionEvent;
21 import javax.swing.event.ListSelectionListener;
22
23 import jp.sourceforge.stigmata.ComparisonPairFilter;
24 import jp.sourceforge.stigmata.ComparisonPairFilterSet;
25 import jp.sourceforge.stigmata.ui.swing.GUIUtility;
26 import jp.sourceforge.stigmata.ui.swing.StigmataFrame;
27 import jp.sourceforge.talisman.i18n.Messages;
28
29 /**
30  * 
31  * @author Haruaki TAMADA
32  */
33 public class FilterSetDefinitionPane extends JPanel implements ComparisonPairFilterListener{
34     private static final long serialVersionUID = 7519306603672717119L;
35
36     private ComparisonPairFilterRetainable manager;
37     private StigmataFrame stigmata;
38
39     private JTextField name;
40     private JRadioButton matchall, matchany;
41     private JList list;
42     private DefaultListModel model;
43     private ComparisonPairFilterSet filterset;
44     private boolean buttonShown = true;
45
46     private JButton addfilter;
47     private JButton updatefilter;
48     private JButton removefilter;
49     private JButton upButton;
50     private JButton downButton;
51     
52     public FilterSetDefinitionPane(StigmataFrame frame, ComparisonPairFilterRetainable manager){
53         this(frame, manager, true);
54     }
55
56     public FilterSetDefinitionPane(StigmataFrame frame, ComparisonPairFilterRetainable manager, boolean showButtons){
57         this.stigmata = frame;
58         this.manager = manager;
59         
60         initLayouts(showButtons);
61     }
62
63     public void reset(){
64         // nothing to do...
65     }
66
67     public void setFilterSet(ComparisonPairFilterSet filterset){
68         this.filterset = filterset;
69         if(filterset != null){
70             model.removeAllElements();
71
72             name.setText(filterset.getName());
73             matchall.setSelected(filterset.isMatchAll());
74             matchany.setSelected(filterset.isMatchAny());
75             for(ComparisonPairFilter filter: filterset){
76                 model.addElement(filter);
77             }
78         }
79     }
80
81     @Override
82     public void filterAdded(ComparisonPairFilter filter){
83         model.addElement(filter);
84         list.setSelectedIndex(model.getSize() - 1);
85         updateButtonEnabled();
86     }
87
88     @Override
89     public void filterRemoved(ComparisonPairFilter filter){
90         model.removeElement(filter);
91         list.clearSelection();
92         updateButtonEnabled();
93     }
94
95     @Override
96     public void filterUpdated(ComparisonPairFilter oldfilter, ComparisonPairFilter newfilter){
97         int index = model.indexOf(oldfilter);
98         if(index >= 0){
99             model.setElementAt(newfilter, index);
100         }
101         updateButtonEnabled();
102     }
103
104     @Override
105     public void setEnabled(boolean flag){
106         super.setEnabled(flag);
107
108         matchall.setEnabled(flag);
109         matchany.setEnabled(flag);
110         name.setEnabled(flag);
111         list.setEnabled(flag);
112     }
113
114     private void initLayouts(boolean showButtons){
115         Messages messages = stigmata.getMessages();
116         this.buttonShown = showButtons;
117
118         ButtonGroup group = new ButtonGroup();
119         matchall = new JRadioButton(messages.get("matchall.button.label"), true);
120         matchall.setToolTipText(messages.get("matchall.button.tooltip"));
121         group.add(matchall);
122         matchany = new JRadioButton(messages.get("matchany.button.label"), false);
123         matchany.setToolTipText(messages.get("matchany.button.tooltip"));
124         group.add(matchany);
125         
126         JPanel north = new JPanel(new GridLayout(3, 1));
127         north.add(name = new JTextField());
128         north.add(matchall);
129         north.add(matchany);
130
131         addfilter = GUIUtility.createButton(messages, "newfilterset");
132         updatefilter = GUIUtility.createButton(messages, "updatefilterset");
133         removefilter = GUIUtility.createButton(messages, "removefilterset");
134         upButton = GUIUtility.createButton(messages, "moveup");
135         downButton = GUIUtility.createButton(messages, "movedown");
136         
137         Box south = Box.createHorizontalBox();
138         south.add(Box.createHorizontalGlue());
139         south.add(addfilter);
140         south.add(Box.createHorizontalGlue());
141         south.add(updatefilter);
142         south.add(Box.createHorizontalGlue());
143         south.add(removefilter);
144         south.add(Box.createHorizontalGlue());
145         south.add(upButton);
146         south.add(Box.createHorizontalGlue());
147         south.add(downButton);
148         south.add(Box.createHorizontalGlue());
149
150         model = new DefaultListModel();
151         list = new JList(model);
152         list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
153
154         list.getSelectionModel().addListSelectionListener(new ListSelectionListener(){
155             @Override
156             public void valueChanged(ListSelectionEvent e){
157                 manager.filterSelected((ComparisonPairFilter)list.getSelectedValue());
158                 updateButtonEnabled();
159             }
160         });
161
162         addfilter.addActionListener(new ActionListener(){
163             @Override
164             public void actionPerformed(ActionEvent e){
165                 ComparisonPairFilterSet current = createCurrentFilterSet();
166                 filterset = current;
167                 manager.addFilterSet(filterset);
168                 list.clearSelection();
169                 manager.filterSelected(null);
170
171                 updateButtonEnabled();
172             }
173         });
174
175         removefilter.addActionListener(new ActionListener(){
176             @Override
177             public void actionPerformed(ActionEvent e){
178                 manager.removeFilterSet(filterset.getName());
179                 filterset = null;
180                 name.setText("");
181                 matchall.setSelected(true);
182                 matchany.setSelected(false);
183                 model.removeAllElements();
184                 manager.filterSelected(null);
185
186                 updateButtonEnabled();
187             }
188         });
189
190         updatefilter.addActionListener(new ActionListener(){
191             @Override
192             public void actionPerformed(ActionEvent e){
193                 ComparisonPairFilterSet current = createCurrentFilterSet();
194                 manager.updateFilterSet(filterset.getName(), current);
195                 filterset = current;
196                 list.clearSelection();
197                 manager.filterSelected(null);
198                 updateButtonEnabled();
199             }
200         });
201
202         ActionListener listener = new ActionListener(){
203             @Override
204             public void actionPerformed(ActionEvent e){
205                 int index = list.getSelectedIndex();
206                 int step = 1;
207                 if(e.getActionCommand().equals("moveup")) step = -1;
208                 Object element1 = model.get(index);
209                 Object element2 = model.get(index + step);
210                 model.setElementAt(element1, index + step);
211                 model.setElementAt(element2, index);
212                 list.setSelectedIndex(index + step);
213             }
214         };
215         name.getDocument().addDocumentListener(new DocumentListener(){
216             @Override
217             public void changedUpdate(DocumentEvent e){
218                 updateButtonEnabled();
219             }
220
221             @Override
222             public void insertUpdate(DocumentEvent e){
223                 updateButtonEnabled();
224             }
225
226             @Override
227             public void removeUpdate(DocumentEvent e){
228                 updateButtonEnabled();
229             }
230         });
231         upButton.addActionListener(listener);
232         downButton.addActionListener(listener);
233
234         JScrollPane listpane = new JScrollPane(list);
235         setLayout(new BorderLayout());
236         add(north, BorderLayout.NORTH);
237         add(listpane, BorderLayout.CENTER);
238         if(showButtons){
239             add(south, BorderLayout.SOUTH);
240         }
241
242         GUIUtility.decorateJComponent(messages, name, "filtername");
243         GUIUtility.decorateJComponent(messages, listpane, "filterorder");
244
245         setEnabled(buttonShown);
246
247         updateButtonEnabled();
248     }
249
250     private void updateButtonEnabled(){
251         if(buttonShown){
252             int index = list.getSelectedIndex();
253             int size = model.getSize();
254
255             upButton.setEnabled(size > 1 && index > 0);
256             downButton.setEnabled(size > 1 && index < (size - 1));
257             updatefilter.setEnabled(filterset != null);
258             addfilter.setEnabled(size > 0 && name.getText().length() > 0 && manager.getFilterSet(name.getText()) == null);
259             removefilter.setEnabled(filterset != null);
260         }
261     }
262
263     private ComparisonPairFilterSet createCurrentFilterSet(){
264         ComparisonPairFilterSet current = new ComparisonPairFilterSet();
265         current.setName(name.getText());
266         if(matchall.isSelected())       current.setMatchAll();
267         else if(matchany.isSelected()) current.setMatchAny();
268         current.removeAllFilters();
269
270         for(int i = 0; i < model.getSize(); i++){
271             current.addFilter((ComparisonPairFilter)model.get(i));
272         }
273         return current;
274     }
275 }