OSDN Git Service

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