OSDN Git Service

77316ae0d2d9fa8e69b81678cffd72b8d802dcf3
[stigmata/stigmata.git] / src / main / java / jp / sourceforge / stigmata / ui / swing / filter / FilterEditingPane.java
1 package jp.sourceforge.stigmata.ui.swing.filter;
2
3 import java.awt.BorderLayout;
4 import java.awt.CardLayout;
5 import java.awt.Dimension;
6 import java.awt.event.ActionEvent;
7 import java.awt.event.ActionListener;
8 import java.awt.event.ItemEvent;
9 import java.awt.event.ItemListener;
10 import java.util.ArrayList;
11 import java.util.HashMap;
12 import java.util.Iterator;
13 import java.util.List;
14 import java.util.Map;
15
16 import javax.swing.Box;
17 import javax.swing.JButton;
18 import javax.swing.JComboBox;
19 import javax.swing.JOptionPane;
20 import javax.swing.JPanel;
21
22 import jp.sourceforge.stigmata.ComparisonPairFilter;
23 import jp.sourceforge.stigmata.spi.BirthmarkSpi;
24 import jp.sourceforge.stigmata.spi.ComparisonPairFilterSpi;
25 import jp.sourceforge.stigmata.ui.swing.BirthmarkServiceListener;
26 import jp.sourceforge.stigmata.ui.swing.GUIUtility;
27 import jp.sourceforge.stigmata.ui.swing.StigmataFrame;
28 import jp.sourceforge.talisman.i18n.Messages;
29
30 /**
31  * 
32  * @author Haruaki TAMADA
33  */
34 public class FilterEditingPane extends JPanel{
35     private static final long serialVersionUID = -2607954525579006086L;
36
37     private StigmataFrame stigmata;
38     private ComparisonPairFilter filter;
39     private JPanel cardComponent;
40     private CardLayout card;
41     private JComboBox combo;
42     private JButton addButton;
43     private JButton updateButton;
44     private JButton removeButton;
45     private ComparisonPairFilterPane currentPane = null;
46     
47     private Map<String, ComparisonPairFilterPane> paneMap = new HashMap<String, ComparisonPairFilterPane>();
48     private List<ComparisonPairFilterListener> listeners = new ArrayList<ComparisonPairFilterListener>();
49
50     public FilterEditingPane(StigmataFrame stigmata){
51         this.stigmata = stigmata;
52
53         initLayouts();
54         initData();
55         updateButtonEnabled();
56     }
57
58     public void reset(){
59         initData();
60     }
61
62     public void addComparisonPairFilterListener(ComparisonPairFilterListener listener){
63         listeners.add(listener);
64     }
65
66     public void removeComparisonPairFilterListener(ComparisonPairFilterListener listener){
67         listeners.remove(listener);
68     }
69
70     public void setFilter(ComparisonPairFilter filter){
71         resetOldComponent();
72         this.filter = filter;
73         if(filter != null && filter.getService() != null){
74             ComparisonPairFilterSpi service = filter.getService();
75             String name = service.getDisplayFilterName();
76
77             combo.setSelectedItem(name);
78             card.show(cardComponent, name);
79             paneMap.get(name).setFilter(filter);
80         }
81         updateButtonEnabled();
82     }
83
84     private void resetOldComponent(){
85         if(filter != null){
86             paneMap.get(filter.getService().getDisplayFilterName()).resetComponents();
87         }
88     }
89
90     private void updateButtonEnabled(){
91         addButton.setEnabled(currentPane != null);
92         removeButton.setEnabled(filter != null);
93         updateButton.setEnabled(filter != null);
94     }
95
96     private void initData(){
97         cardComponent.removeAll();
98         combo.removeAllItems();
99         paneMap.clear();
100
101         JPanel dummyPanel = new JPanel();
102         card.addLayoutComponent(dummyPanel, "");
103         cardComponent.add(dummyPanel, "");
104         combo.addItem("");
105
106         
107         for(Iterator<ComparisonPairFilterComponentService> i = stigmata.getEnvironment().lookupProviders(ComparisonPairFilterComponentService.class); i.hasNext();){
108             ComparisonPairFilterComponentService service = i.next();
109             String name = service.getDisplayFilterName();
110
111             ComparisonPairFilterPane pane = service.createComponent(stigmata, service.getComparisonPairFilterService());
112             if(pane instanceof BirthmarkServiceListener){
113                 for(BirthmarkSpi bs: stigmata.getEnvironment().getServices()){
114                     ((BirthmarkServiceListener)pane).serviceAdded(bs);
115                 }
116                 stigmata.addBirthmarkServiceListener((BirthmarkServiceListener)pane);
117             }
118
119             pane.setMaximumSize(new Dimension(Integer.MAX_VALUE, 500));
120             Box b = Box.createVerticalBox();
121             b.add(pane);
122             b.add(Box.createVerticalGlue());
123
124             combo.addItem(name);
125             card.addLayoutComponent(b, name);
126             cardComponent.add(b, name);
127             paneMap.put(name, pane);
128         }
129     }
130
131     private void initLayouts(){
132         Messages messages = stigmata.getMessages();
133         cardComponent = new JPanel();
134         combo = new JComboBox();
135         addButton = GUIUtility.createButton(messages, "newfilter");
136         removeButton = GUIUtility.createButton(messages, "removefilter");
137         updateButton = GUIUtility.createButton(messages, "updatefilter");
138
139         combo.addItemListener(new ItemListener(){
140             @Override
141             public void itemStateChanged(ItemEvent e){
142                 String item = (String)combo.getSelectedItem();
143                 card.show(cardComponent, item);
144                 if(paneMap.get(item) != null){
145                     if(filter != null){
146                         String oldType = filter.getService().getDisplayFilterName();
147                         if(item.equals(oldType)){
148                             paneMap.get(item).setFilter(filter);
149                         }
150                         else{
151                             currentPane.resetComponents();
152                         }
153                     }
154                     currentPane = paneMap.get(item);
155                 }
156                 else{
157                     currentPane = null;
158                 }
159                 updateButtonEnabled();
160             }
161         });
162         ActionListener listener = new ActionListener(){
163             @Override
164             public void actionPerformed(ActionEvent e){
165                 String command = e.getActionCommand();
166                 ComparisonPairFilter newfilter = currentPane.getFilter();
167                 if(newfilter != null){
168                     for(ComparisonPairFilterListener listener: listeners){
169                         if(command.equals("updatefilter")){
170                             listener.filterUpdated(filter, newfilter);
171                         }
172                         else{
173                             listener.filterAdded(newfilter);
174                         }
175                     }
176                 }
177                 else{
178                     showErrorMessage(currentPane.getErrors());
179                 }
180             }
181         };
182         addButton.addActionListener(listener);
183         updateButton.addActionListener(listener);
184         removeButton.addActionListener(new ActionListener(){
185             @Override
186             public void actionPerformed(ActionEvent e){
187                 for(ComparisonPairFilterListener listener: listeners){
188                     listener.filterRemoved(filter);
189                 }                
190             }
191         });
192
193         Box south = Box.createHorizontalBox();
194         south.add(Box.createHorizontalGlue());
195         south.add(addButton);
196         south.add(Box.createHorizontalGlue());
197         south.add(updateButton);
198         south.add(Box.createHorizontalGlue());
199         south.add(removeButton);
200         south.add(Box.createHorizontalGlue());
201
202         cardComponent.setLayout(card = new CardLayout());
203         cardComponent.setMaximumSize(new Dimension(Integer.MAX_VALUE, cardComponent.getMaximumSize().height));
204         Box center = Box.createVerticalBox();
205         center.add(cardComponent);
206         center.add(Box.createVerticalGlue());
207
208         setLayout(new BorderLayout());
209         add(combo, BorderLayout.NORTH);
210         add(center, BorderLayout.CENTER);
211         add(south, BorderLayout.SOUTH);
212     }
213
214     private void showErrorMessage(String[] messages){
215         StringBuilder sb = new StringBuilder("<html><body>");
216         sb.append("<p>").append(stigmata.getMessages().get("error.filter.cannotcreate")).append("</p>");
217         sb.append("<ul>");
218         for(int i = 0; i < messages.length; i++){
219             sb.append("<li>").append(messages[i]).append("</li>");
220         }
221         sb.append("</ul></body></html>");
222
223         JOptionPane.showMessageDialog(
224             stigmata, new String(sb), stigmata.getMessages().get("error.dialog.title"),
225             JOptionPane.ERROR_MESSAGE
226         );
227     }
228 }