OSDN Git Service

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