1 package jp.sourceforge.stigmata.ui.swing.filter;
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;
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;
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;
32 * @author Haruaki TAMADA
34 public class FilterEditingPane extends JPanel{
35 private static final long serialVersionUID = -2607954525579006086L;
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;
47 private Map<String, ComparisonPairFilterPane> paneMap = new HashMap<String, ComparisonPairFilterPane>();
48 private List<ComparisonPairFilterListener> listeners = new ArrayList<ComparisonPairFilterListener>();
50 public FilterEditingPane(StigmataFrame stigmata){
51 this.stigmata = stigmata;
55 updateButtonEnabled();
62 public void addComparisonPairFilterListener(ComparisonPairFilterListener listener){
63 listeners.add(listener);
66 public void removeComparisonPairFilterListener(ComparisonPairFilterListener listener){
67 listeners.remove(listener);
70 public void setFilter(ComparisonPairFilter filter){
73 if(filter != null && filter.getService() != null){
74 ComparisonPairFilterSpi service = filter.getService();
75 String name = service.getDisplayFilterName();
77 combo.setSelectedItem(name);
78 card.show(cardComponent, name);
79 paneMap.get(name).setFilter(filter);
81 updateButtonEnabled();
84 private void resetOldComponent(){
86 paneMap.get(filter.getService().getDisplayFilterName()).resetComponents();
90 private void updateButtonEnabled(){
91 addButton.setEnabled(currentPane != null);
92 removeButton.setEnabled(filter != null);
93 updateButton.setEnabled(filter != null);
96 private void initData(){
97 cardComponent.removeAll();
98 combo.removeAllItems();
101 JPanel dummyPanel = new JPanel();
102 card.addLayoutComponent(dummyPanel, "");
103 cardComponent.add(dummyPanel, "");
107 for(Iterator<ComparisonPairFilterComponentService> i = stigmata.getEnvironment().lookupProviders(ComparisonPairFilterComponentService.class); i.hasNext();){
108 ComparisonPairFilterComponentService service = i.next();
109 String name = service.getDisplayFilterName();
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);
116 stigmata.addBirthmarkServiceListener((BirthmarkServiceListener)pane);
119 pane.setMaximumSize(new Dimension(Integer.MAX_VALUE, 500));
120 Box b = Box.createVerticalBox();
122 b.add(Box.createVerticalGlue());
125 card.addLayoutComponent(b, name);
126 cardComponent.add(b, name);
127 paneMap.put(name, pane);
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");
139 combo.addItemListener(new ItemListener(){
141 public void itemStateChanged(ItemEvent e){
142 String item = (String)combo.getSelectedItem();
143 card.show(cardComponent, item);
144 if(paneMap.get(item) != null){
146 String oldType = filter.getService().getDisplayFilterName();
147 if(item.equals(oldType)){
148 paneMap.get(item).setFilter(filter);
151 currentPane.resetComponents();
154 currentPane = paneMap.get(item);
159 updateButtonEnabled();
162 ActionListener listener = new ActionListener(){
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);
173 listener.filterAdded(newfilter);
178 showErrorMessage(currentPane.getErrors());
182 addButton.addActionListener(listener);
183 updateButton.addActionListener(listener);
184 removeButton.addActionListener(new ActionListener(){
186 public void actionPerformed(ActionEvent e){
187 for(ComparisonPairFilterListener listener: listeners){
188 listener.filterRemoved(filter);
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());
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());
208 setLayout(new BorderLayout());
209 add(combo, BorderLayout.NORTH);
210 add(center, BorderLayout.CENTER);
211 add(south, BorderLayout.SOUTH);
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>");
218 for(int i = 0; i < messages.length; i++){
219 sb.append("<li>").append(messages[i]).append("</li>");
221 sb.append("</ul></body></html>");
223 JOptionPane.showMessageDialog(
224 stigmata, new String(sb), stigmata.getMessages().get("error.dialog.title"),
225 JOptionPane.ERROR_MESSAGE