OSDN Git Service

f9c696c964dea67e06906e89977193a9adb17605
[stigmata/stigmata.git] / src / main / java / jp / sourceforge / stigmata / ui / swing / FilterManagementPane.java
1 package jp.sourceforge.stigmata.ui.swing;
2
3 /*
4  * $Id$
5  */
6
7 import java.awt.BorderLayout;
8 import java.awt.GridLayout;
9 import java.awt.event.ActionEvent;
10 import java.awt.event.ActionListener;
11 import java.awt.event.MouseAdapter;
12 import java.awt.event.MouseEvent;
13 import java.util.HashMap;
14 import java.util.Map;
15
16 import javax.swing.Box;
17 import javax.swing.DefaultListModel;
18 import javax.swing.JButton;
19 import javax.swing.JComponent;
20 import javax.swing.JList;
21 import javax.swing.JPanel;
22 import javax.swing.JScrollPane;
23 import javax.swing.event.ListSelectionEvent;
24 import javax.swing.event.ListSelectionListener;
25
26 import jp.sourceforge.stigmata.ComparisonPairFilter;
27 import jp.sourceforge.stigmata.ComparisonPairFilterSet;
28 import jp.sourceforge.stigmata.filter.ComparisonPairFilterManager;
29 import jp.sourceforge.stigmata.ui.swing.filter.ComparisonPairFilterRetainable;
30 import jp.sourceforge.stigmata.ui.swing.filter.FilterEditingPane;
31 import jp.sourceforge.stigmata.ui.swing.filter.FilterSetDefinitionPane;
32
33 /**
34  * @author Haruaki TAMADA
35  */
36 public class FilterManagementPane extends JPanel implements ComparisonPairFilterRetainable{
37     private static final long serialVersionUID = 972135792354L;
38
39     private StigmataFrame stigmata;
40     private FilterSetDefinitionPane definition;
41     private FilterEditingPane filterPane;
42     private JList list;
43     private DefaultListModel model;
44     private Map<String, ComparisonPairFilterSet> filters = new HashMap<String, ComparisonPairFilterSet>();
45
46     public FilterManagementPane(StigmataFrame stigmata){
47         this.stigmata = stigmata;
48         
49         initLayouts();
50     }
51
52     public void reset(){
53         definition.reset();
54         filterPane.reset();
55         model.removeAllElements();
56         
57         ComparisonPairFilterManager manager = stigmata.getEnvironment().getFilterManager();
58         for(ComparisonPairFilterSet filterset: manager.getFilterSets()){
59             addFilterSet(filterset);
60         }
61     }
62
63     public void updateFilterManager(ComparisonPairFilterManager manager){
64         for(ComparisonPairFilterSet filterset: filters.values()){
65             manager.addFilterSet(filterset);
66         }
67     }
68
69     @Override
70     public void addFilterSet(ComparisonPairFilterSet filterset){
71         filters.put(filterset.getName(), filterset);
72
73         model.addElement(filterset.getName());
74         list.setSelectedIndex(model.getSize() - 1);
75     }
76
77     @Override
78     public void removeFilterSet(String name){
79         filters.remove(name);
80         model.removeElement(name);
81
82         list.clearSelection();
83     }
84
85     @Override
86     public void updateFilterSet(String oldName, ComparisonPairFilterSet newfilter){
87         for(int i = 0; i < model.getSize(); i++){
88             if(oldName.equals(model.getElementAt(i))){
89                 model.setElementAt(newfilter.getName(), i);
90                 break;
91             }
92         }
93         filters.remove(oldName);
94         filters.put(newfilter.getName(), newfilter);
95     }
96
97     @Override
98     public ComparisonPairFilterSet getFilterSet(String name){
99         return filters.get(name);
100     }
101
102     @Override
103     public void filterSelected(ComparisonPairFilter filter){
104         filterPane.setFilter(filter);
105     }
106
107     private void initLayouts(){
108         definition = new FilterSetDefinitionPane(stigmata, this);
109         filterPane = new FilterEditingPane(stigmata);
110         filterPane.addComparisonPairFilterListener(definition);
111         JComponent filtersetlist = createFilterSetPane();
112
113         GUIUtility.decorateJComponent(stigmata.getMessages(), filtersetlist, "filtersetlist.pane");
114         GUIUtility.decorateJComponent(stigmata.getMessages(), definition, "filterdefinition.pane");
115         GUIUtility.decorateJComponent(stigmata.getMessages(), filterPane, "filter.pane");
116
117         setLayout(new GridLayout(1, 3));
118         add(filtersetlist);
119         add(definition);
120         add(filterPane);
121     }
122
123     private JComponent createFilterSetPane(){
124         model = new DefaultListModel();
125         list = new JList(model);
126
127         final JButton upButton = GUIUtility.createButton(stigmata.getMessages(), "moveup");
128         final JButton downButton = GUIUtility.createButton(stigmata.getMessages(), "movedown");
129
130         Box south = Box.createHorizontalBox();
131         south.add(Box.createHorizontalGlue());
132         south.add(upButton);
133         south.add(Box.createHorizontalGlue());
134         south.add(downButton);
135         south.add(Box.createHorizontalGlue());
136
137         list.addMouseListener(new MouseAdapter(){
138             @Override
139             public void mouseClicked(MouseEvent e){
140                 int index = list.locationToIndex(e.getPoint());
141                 list.setSelectedIndex(index);
142                 updateUI();
143             }
144         });
145         list.getSelectionModel().addListSelectionListener(new ListSelectionListener(){
146             @Override
147             public void valueChanged(ListSelectionEvent e){
148                 int[] indexes = list.getSelectedIndices();
149                 int rows = model.getSize();
150
151                 upButton.setEnabled(indexes.length == 1 && rows > 1 && indexes[0] != 0);
152                 downButton.setEnabled(indexes.length == 1 && rows > 1 && indexes[0] != (rows - 1));
153                 if(indexes.length != 1){
154                     definition.setFilterSet(null);
155                 }
156                 else{
157                     definition.setFilterSet(filters.get(model.getElementAt(indexes[0])));
158                 }
159             }
160         });
161         ActionListener listener = new ActionListener(){
162             @Override
163             public void actionPerformed(ActionEvent e){
164                 int step = 1;
165                 if(e.getActionCommand().equals("moveup")){
166                     step = -1;
167                 }
168                 int index = list.getSelectedIndex();
169                 Object e1 = model.getElementAt(index);
170                 Object e2 = model.getElementAt(index + step);
171                 model.setElementAt(e1, index + step);
172                 model.setElementAt(e2, index);
173                 list.setSelectedIndex(index + step);
174             }
175         };
176         upButton.addActionListener(listener);
177         downButton.addActionListener(listener);
178         upButton.setEnabled(false);
179         downButton.setEnabled(false);
180         
181         JPanel panel = new JPanel(new BorderLayout());
182         panel.add(new JScrollPane(list), BorderLayout.CENTER);
183         panel.add(south, BorderLayout.SOUTH);
184         
185         return panel;
186     }
187 }