OSDN Git Service

Remove Date tag of Subversion
[stigmata/stigmata.git] / src / main / java / jp / sourceforge / stigmata / ui / swing / BirthmarkDefinitionPane.java
1 package jp.sourceforge.stigmata.ui.swing;
2
3 /*
4  * $Id$
5  */
6
7 import java.awt.BorderLayout;
8 import java.awt.Dimension;
9 import java.awt.GridLayout;
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.Iterator;
16 import java.util.List;
17
18 import javax.swing.Box;
19 import javax.swing.BoxLayout;
20 import javax.swing.DefaultListModel;
21 import javax.swing.JButton;
22 import javax.swing.JCheckBox;
23 import javax.swing.JComboBox;
24 import javax.swing.JList;
25 import javax.swing.JPanel;
26 import javax.swing.JScrollPane;
27 import javax.swing.JTextArea;
28 import javax.swing.JTextField;
29 import javax.swing.ListModel;
30 import javax.swing.border.TitledBorder;
31 import javax.swing.event.DocumentEvent;
32 import javax.swing.event.DocumentListener;
33 import javax.swing.event.ListSelectionEvent;
34 import javax.swing.event.ListSelectionListener;
35
36 import jp.sourceforge.stigmata.BirthmarkEnvironment;
37 import jp.sourceforge.stigmata.birthmarks.BirthmarkService;
38 import jp.sourceforge.stigmata.spi.BirthmarkComparatorSpi;
39 import jp.sourceforge.stigmata.spi.BirthmarkExtractorSpi;
40 import jp.sourceforge.stigmata.spi.BirthmarkSpi;
41 import jp.sourceforge.talisman.i18n.Messages;
42
43 /**
44  * 
45  * @author Haruaki TAMADA
46  * @version $Revision$ 
47  */
48 public class BirthmarkDefinitionPane extends JPanel{
49     private static final long serialVersionUID = 3932637653297802978L;
50
51     private StigmataFrame stigmata;
52     private DefaultListModel model;
53     private InformationPane information;
54     private JList serviceList;
55     private JButton newService;
56     private JButton removeService;
57     private List<BirthmarkSpi> addedService = new ArrayList<BirthmarkSpi>();
58     private List<BirthmarkServiceListener> listeners = new ArrayList<BirthmarkServiceListener>();
59
60     public BirthmarkDefinitionPane(StigmataFrame stigmata){
61         this.stigmata = stigmata;
62
63         initLayouts();
64         initData();
65
66         updateView();
67     }
68
69     public void addBirthmarkServiceListener(BirthmarkServiceListener listener){
70         listeners.add(listener);
71     }
72
73     public void removeBirthmarkServiceListener(BirthmarkServiceListener listener){
74         listeners.remove(listener);
75     }
76
77     public void reset(){
78         for(BirthmarkSpi service: addedService){
79             model.removeElement(service);
80         }
81     }
82
83     public void updateEnvironment(BirthmarkEnvironment environment){
84         for(BirthmarkSpi service: addedService){
85             if(environment.getService(service.getType()) == null){
86                 if(service instanceof BirthmarkService){
87                     ((BirthmarkService)service).setBirthmarkEnvironment(environment);
88                 }
89                 environment.addService(service);
90             }
91         }
92     }
93
94     private void initData(){
95         information.initData();
96         model.addElement(stigmata.getMessages().get("newservice.definition.label"));
97
98         for(BirthmarkSpi service: stigmata.getEnvironment().findServices()){
99             model.addElement(service);
100         }
101     }
102
103     private void initLayouts(){
104         Messages messages = stigmata.getMessages();
105         JPanel panel = new JPanel(new BorderLayout());
106         serviceList = new JList(model = new DefaultListModel());
107         serviceList.setCellRenderer(new BirthmarkServiceListCellRenderer(new Dimension(250, 20), 60));
108         JScrollPane scroll = new JScrollPane(serviceList);
109
110         scroll.setBorder(new TitledBorder(messages.get("servicelist.border")));
111         serviceList.setToolTipText(messages.get("servicelist.tooltip"));
112
113         panel.add(scroll, BorderLayout.WEST);
114         panel.add(information = new InformationPane(stigmata, this), BorderLayout.CENTER);
115
116         Box buttonPanel = Box.createHorizontalBox();
117         newService = GUIUtility.createButton(messages, "newservice");
118         removeService = GUIUtility.createButton(messages, "removeservice");
119         buttonPanel.add(Box.createHorizontalGlue());
120         buttonPanel.add(newService);
121         buttonPanel.add(Box.createHorizontalGlue());
122         buttonPanel.add(removeService);
123         buttonPanel.add(Box.createHorizontalGlue());
124
125         setLayout(new BorderLayout());
126         add(panel, BorderLayout.CENTER);
127         add(buttonPanel, BorderLayout.SOUTH);
128
129         removeService.setEnabled(false);
130
131         serviceList.addListSelectionListener(new ListSelectionListener(){
132             public void valueChanged(ListSelectionEvent e){
133                 listValueChanged(e);
134             }
135         });
136
137         newService.addActionListener(new ActionListener(){
138             public void actionPerformed(ActionEvent e){
139                 addNewService();
140             }
141         });
142
143         removeService.addActionListener(new ActionListener(){
144             public void actionPerformed(ActionEvent e){
145                 removeService();
146             }
147         });
148     }
149
150     private void removeService(){
151         int index = serviceList.getSelectedIndex();
152         if(index > 0){
153             BirthmarkSpi service = (BirthmarkSpi)model.getElementAt(index);
154             if(service != null && service.isUserDefined()){
155                 model.remove(index);
156                 for(BirthmarkServiceListener listener: listeners){
157                     listener.serviceRemoved(service);
158                 }
159             }
160         }
161         stigmata.setNeedToSaveSettings(true);
162         updateView();
163     }
164
165     private void addNewService(){
166         BirthmarkService service = information.createService();
167         model.addElement(service);
168         addedService.add(service);
169
170         for(BirthmarkServiceListener listener: listeners){
171             listener.serviceAdded(service);
172         }
173         stigmata.setNeedToSaveSettings(true);
174         updateView();
175     }
176
177     private void listValueChanged(ListSelectionEvent e){
178         int index = serviceList.getSelectedIndex();
179         if(index > 0){
180             BirthmarkSpi service = (BirthmarkSpi)model.getElementAt(index);
181             if(service != null){
182                 information.setService(service);
183             }
184         }
185         else if(index == 0){
186             information.clear();
187         }
188         updateView();
189     }
190
191     /**
192      * remove: enabled when selected index is greater than 0 and selected service is defined by user.
193      * new service: enabled when selected index is less equals than 0 or selected service is defined by user and information pane is show available service.
194      *
195      */
196     private void updateView(){
197         int index = serviceList.getSelectedIndex();
198         ListModel model = serviceList.getModel();
199         BirthmarkSpi service = null;
200         if(index > 0){
201             service = (BirthmarkSpi)model.getElementAt(index); 
202         }
203         newService.setEnabled(
204             (index <= 0 || service.isUserDefined()) && 
205             information.isAvailableService() &&
206             isAvailableServiceName(information.getType())
207         );
208         removeService.setEnabled(index > 0 && service.isUserDefined());
209         information.setEnabled(index <= 0 || service.isUserDefined());
210     }
211
212     private boolean isAvailableServiceName(String name){
213         for(BirthmarkSpi service: addedService){
214             if(service.getType().equals(name)){
215                 return false;
216             }
217         }
218         return true;
219     }
220
221     private static class InformationPane extends JPanel{
222         private static final long serialVersionUID = 37906542932362L;
223
224         private StigmataFrame stigmata;
225         private BirthmarkDefinitionPane thisPane;
226         private JTextField type;
227         private JTextField displayType;
228         private JTextArea description;
229         private JComboBox extractor;
230         private JComboBox comparator;
231         private JCheckBox expert;
232         private JCheckBox userDefined;
233
234         public InformationPane(StigmataFrame stigmata, BirthmarkDefinitionPane thisPane){
235             this.stigmata = stigmata;
236             this.thisPane = thisPane;
237             initLayouts();
238         }
239
240         public String getType(){
241             return type.getText();
242         }
243
244         public void setEnabled(boolean flag){
245             super.setEnabled(flag);
246
247             type.setEnabled(flag);
248             displayType.setEnabled(flag);
249             description.setEnabled(flag);
250             extractor.setEnabled(flag);
251             comparator.setEnabled(flag);
252         }
253
254         public BirthmarkService createService(){
255             BirthmarkService service = new BirthmarkService();
256             service.setType(type.getText());
257             service.setDisplayType(displayType.getText());
258             service.setDescription(description.getText());
259             service.setExtractorClassName(extractor.getSelectedItem().toString());
260             service.setComparatorClassName(comparator.getSelectedItem().toString());
261             service.setUserDefined(true);
262
263             return service;
264         }
265
266         public void clear(){
267             type.setText("");
268             displayType.setText("");
269             description.setText("");
270             extractor.getModel().setSelectedItem(null);
271             comparator.getModel().setSelectedItem(null);
272             userDefined.setSelected(true);
273             expert.setSelected(true);
274         }
275
276         public boolean isAvailableService(){
277             String newType = type.getText();
278             Object selectedExtractor = extractor.getSelectedItem();
279             String extractorClass = "";;
280             if(selectedExtractor != null){
281                 extractorClass = selectedExtractor.toString();
282             }
283             Object selectedComparator = comparator.getSelectedItem();
284             String comparatorClass = "";
285             if(selectedComparator != null){
286                 comparatorClass = selectedComparator.toString();
287             }
288             BirthmarkEnvironment environment = stigmata.getEnvironment();
289
290             boolean flag = newType.length() > 0
291                     && displayType.getText().length() > 0
292                     && extractorClass.length() > 0
293                     && comparatorClass.length() > 0;
294
295             // check inputed type is free
296             flag = flag && environment.getService(newType) == null;
297
298             // check extractor/comparator classes are available
299             try{
300                 flag = flag
301                     && environment.getClasspathContext().find(extractorClass) != null
302                     && environment.getClasspathContext().find(comparatorClass) != null;
303             } catch(ClassNotFoundException e){
304                 flag = false;
305             }
306
307             return flag;
308         }
309
310         public void setService(BirthmarkSpi service){
311             type.setText(service.getType());
312             displayType.setText(service.getDisplayType());
313             description.setText(service.getDefaultDescription());
314             selectComboBoxItem(extractor, service.getExtractorClassName());
315             selectComboBoxItem(comparator, service.getComparatorClassName());
316             userDefined.setSelected(service.isUserDefined());
317             expert.setSelected(service.isExpert());
318
319             setEnabled(service.isUserDefined());
320         }
321
322         public void initData(){
323             comparator.addItem("");
324             for(Iterator<BirthmarkComparatorSpi> i = stigmata.getEnvironment().lookupProviders(BirthmarkComparatorSpi.class); i.hasNext();){
325                 BirthmarkComparatorSpi service = i.next();
326                 comparator.addItem(service.getComparatorClassName());
327             }
328             extractor.addItem("");
329             for(Iterator<BirthmarkExtractorSpi> i = stigmata.getEnvironment().lookupProviders(BirthmarkExtractorSpi.class); i.hasNext();){
330                 BirthmarkExtractorSpi service = i.next();
331                 extractor.addItem(service.getExtractorClassName());
332             }
333         }
334
335         private void selectComboBoxItem(JComboBox box, String item){
336             box.getModel().setSelectedItem(item);
337         }
338
339         private void initLayouts(){
340             Messages messages = stigmata.getMessages();
341             type = new JTextField();
342             displayType = new JTextField();
343             extractor = new JComboBox();
344             comparator = new JComboBox();
345             expert = new JCheckBox(messages.get("define.expert.label"));
346             userDefined = new JCheckBox(messages.get("define.userdef.label"));
347             description = new JTextArea();
348             JScrollPane scroll = new JScrollPane(description);
349             type.setColumns(10);
350             displayType.setColumns(20);
351             description.setColumns(40);
352             description.setRows(10);
353
354             Box box1 = Box.createHorizontalBox();
355             box1.add(type);
356             box1.add(displayType);
357
358             Box box2 = Box.createHorizontalBox();
359             box2.add(Box.createHorizontalGlue());
360             box2.add(expert);
361             box2.add(Box.createHorizontalGlue());
362             box2.add(userDefined);
363             box2.add(Box.createHorizontalGlue());
364
365             JPanel panel = new JPanel(new GridLayout(3, 1));
366             panel.add(box1);
367             panel.add(extractor);
368             panel.add(comparator);
369
370             setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
371             add(panel);
372             add(box2);
373             add(scroll);
374             add(Box.createVerticalGlue());
375
376             GUIUtility.decorateJComponent(messages, type, "define.type");
377             GUIUtility.decorateJComponent(messages, displayType, "define.displaytype");
378             GUIUtility.decorateJComponent(messages, scroll, "define.description");
379             GUIUtility.decorateJComponent(messages, extractor, "define.extractor");
380             GUIUtility.decorateJComponent(messages, comparator, "define.comparator");
381             GUIUtility.decorateJComponent(messages, expert, "define.expert");
382             GUIUtility.decorateJComponent(messages, userDefined, "define.userdef");
383
384             userDefined.setEnabled(false);
385             expert.setEnabled(false);
386             userDefined.setSelected(true);
387             expert.setSelected(true);
388
389             extractor.setEditable(true);
390             comparator.setEditable(true);
391
392             DocumentListener listener = new DocumentListener(){
393                 public void insertUpdate(DocumentEvent e){
394                     thisPane.updateView();
395                 }
396
397                 public void removeUpdate(DocumentEvent e){
398                     thisPane.updateView();
399                 }
400
401                 public void changedUpdate(DocumentEvent e){
402                     thisPane.updateView();
403                 }
404             };
405
406             type.getDocument().addDocumentListener(listener);
407             displayType.getDocument().addDocumentListener(listener);
408             description.getDocument().addDocumentListener(listener);
409             ItemListener itemListener = new ItemListener(){
410                 public void itemStateChanged(ItemEvent e){
411                     thisPane.updateView();
412                 }
413             };
414             comparator.addItemListener(itemListener);
415             extractor.addItemListener(itemListener);
416             ActionListener actionListener = new ActionListener(){
417                 public void actionPerformed(ActionEvent e){
418                     thisPane.updateView();
419                 }
420             };
421             comparator.getEditor().addActionListener(actionListener);
422             extractor.getEditor().addActionListener(actionListener);
423         }
424     }
425 }