1 package jp.sourceforge.stigmata.ui.swing.filter;
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;
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;
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;
36 * @author Haruaki TAMADA
39 public class FilterEditingPane extends JPanel{
40 private static final long serialVersionUID = -2607954525579006086L;
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;
52 private Map<String, ComparisonPairFilterPane> paneMap = new HashMap<String, ComparisonPairFilterPane>();
53 private List<ComparisonPairFilterListener> listeners = new ArrayList<ComparisonPairFilterListener>();
55 public FilterEditingPane(StigmataFrame stigmata){
56 this.stigmata = stigmata;
60 updateButtonEnabled();
67 public void addComparisonPairFilterListener(ComparisonPairFilterListener listener){
68 listeners.add(listener);
71 public void removeComparisonPairFilterListener(ComparisonPairFilterListener listener){
72 listeners.remove(listener);
75 public void setFilter(ComparisonPairFilter filter){
78 if(filter != null && filter.getService() != null){
79 ComparisonPairFilterSpi service = filter.getService();
80 String name = service.getDisplayFilterName();
82 combo.setSelectedItem(name);
83 card.show(cardComponent, name);
84 paneMap.get(name).setFilter(filter);
86 updateButtonEnabled();
89 private void resetOldComponent(){
91 paneMap.get(filter.getService().getDisplayFilterName()).resetComponents();
95 private void updateButtonEnabled(){
96 addButton.setEnabled(currentPane != null);
97 removeButton.setEnabled(filter != null);
98 updateButton.setEnabled(filter != null);
101 private void initData(){
102 cardComponent.removeAll();
103 combo.removeAllItems();
106 JPanel dummyPanel = new JPanel();
107 card.addLayoutComponent(dummyPanel, "");
108 cardComponent.add(dummyPanel, "");
112 for(Iterator<ComparisonPairFilterComponentService> i = stigmata.getEnvironment().lookupProviders(ComparisonPairFilterComponentService.class); i.hasNext();){
113 ComparisonPairFilterComponentService service = i.next();
114 String name = service.getDisplayFilterName();
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);
121 stigmata.addBirthmarkServiceListener((BirthmarkServiceListener)pane);
124 pane.setMaximumSize(new Dimension(Integer.MAX_VALUE, 500));
125 Box b = Box.createVerticalBox();
127 b.add(Box.createVerticalGlue());
130 card.addLayoutComponent(b, name);
131 cardComponent.add(b, name);
132 paneMap.put(name, pane);
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");
144 combo.addItemListener(new ItemListener(){
146 public void itemStateChanged(ItemEvent e){
147 String item = (String)combo.getSelectedItem();
148 card.show(cardComponent, item);
149 if(paneMap.get(item) != null){
151 String oldType = filter.getService().getDisplayFilterName();
152 if(item.equals(oldType)){
153 paneMap.get(item).setFilter(filter);
156 currentPane.resetComponents();
159 currentPane = paneMap.get(item);
164 updateButtonEnabled();
167 ActionListener listener = new ActionListener(){
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);
178 listener.filterAdded(newfilter);
183 showErrorMessage(currentPane.getErrors());
187 addButton.addActionListener(listener);
188 updateButton.addActionListener(listener);
189 removeButton.addActionListener(new ActionListener(){
191 public void actionPerformed(ActionEvent e){
192 for(ComparisonPairFilterListener listener: listeners){
193 listener.filterRemoved(filter);
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());
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());
213 setLayout(new BorderLayout());
214 add(combo, BorderLayout.NORTH);
215 add(center, BorderLayout.CENTER);
216 add(south, BorderLayout.SOUTH);
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>");
223 for(int i = 0; i < messages.length; i++){
224 sb.append("<li>").append(messages[i]).append("</li>");
226 sb.append("</ul></body></html>");
228 JOptionPane.showMessageDialog(
229 stigmata, new String(sb), stigmata.getMessages().get("error.dialog.title"),
230 JOptionPane.ERROR_MESSAGE