OSDN Git Service

organized imports
[stigmata/stigmata-core.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             public void valueChanged(ListSelectionEvent e){
131                 listValueChanged(e);
132             }
133         });
134
135         newService.addActionListener(new ActionListener(){
136             public void actionPerformed(ActionEvent e){
137                 addNewService();
138             }
139         });
140
141         removeService.addActionListener(new ActionListener(){
142             public void actionPerformed(ActionEvent e){
143                 removeService();
144             }
145         });
146     }
147
148     private void removeService(){
149         int index = serviceList.getSelectedIndex();
150         if(index > 0){
151             BirthmarkSpi service = (BirthmarkSpi)model.getElementAt(index);
152             if(service != null && service.isUserDefined()){
153                 model.remove(index);
154                 for(BirthmarkServiceListener listener: listeners){
155                     listener.serviceRemoved(service);
156                 }
157             }
158         }
159         stigmata.setNeedToSaveSettings(true);
160         updateView();
161     }
162
163     private void addNewService(){
164         BirthmarkService service = information.createService();
165         model.addElement(service);
166         addedService.add(service);
167
168         for(BirthmarkServiceListener listener: listeners){
169             listener.serviceAdded(service);
170         }
171         stigmata.setNeedToSaveSettings(true);
172         updateView();
173     }
174
175     private void listValueChanged(ListSelectionEvent e){
176         int index = serviceList.getSelectedIndex();
177         if(index > 0){
178             BirthmarkSpi service = (BirthmarkSpi)model.getElementAt(index);
179             if(service != null){
180                 information.setService(service);
181             }
182         }
183         else if(index == 0){
184             information.clear();
185         }
186         updateView();
187     }
188
189     /**
190      * remove: enabled when selected index is greater than 0 and selected service is defined by user.
191      * 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.
192      *
193      */
194     private void updateView(){
195         int index = serviceList.getSelectedIndex();
196         ListModel model = serviceList.getModel();
197         BirthmarkSpi service = null;
198         if(index > 0){
199             service = (BirthmarkSpi)model.getElementAt(index); 
200         }
201         newService.setEnabled(
202             (index <= 0 || service.isUserDefined()) && 
203             information.isAvailableService() &&
204             isAvailableServiceName(information.getType())
205         );
206         removeService.setEnabled(index > 0 && service.isUserDefined());
207         information.setEnabled(index <= 0 || service.isUserDefined());
208     }
209
210     private boolean isAvailableServiceName(String name){
211         for(BirthmarkSpi service: addedService){
212             if(service.getType().equals(name)){
213                 return false;
214             }
215         }
216         return true;
217     }
218
219     private static class InformationPane extends JPanel{
220         private static final long serialVersionUID = 37906542932362L;
221
222         private StigmataFrame stigmata;
223         private BirthmarkDefinitionPane thisPane;
224         private JTextField type;
225         private JTextField displayType;
226         private JTextArea description;
227         private JComboBox extractor;
228         private JComboBox comparator;
229         private JCheckBox expert;
230         private JCheckBox userDefined;
231
232         public InformationPane(StigmataFrame stigmata, BirthmarkDefinitionPane thisPane){
233             this.stigmata = stigmata;
234             this.thisPane = thisPane;
235             initLayouts();
236         }
237
238         public String getType(){
239             return type.getText();
240         }
241
242         public void setEnabled(boolean flag){
243             super.setEnabled(flag);
244
245             type.setEnabled(flag);
246             displayType.setEnabled(flag);
247             description.setEnabled(flag);
248             extractor.setEnabled(flag);
249             comparator.setEnabled(flag);
250         }
251
252         public BirthmarkService createService(){
253             BirthmarkService service = new BirthmarkService();
254             service.setType(type.getText());
255             service.setDisplayType(displayType.getText());
256             service.setDescription(description.getText());
257             service.setExtractorClassName(extractor.getSelectedItem().toString());
258             service.setComparatorClassName(comparator.getSelectedItem().toString());
259             service.setUserDefined(true);
260
261             return service;
262         }
263
264         public void clear(){
265             type.setText("");
266             displayType.setText("");
267             description.setText("");
268             extractor.getModel().setSelectedItem(null);
269             comparator.getModel().setSelectedItem(null);
270             userDefined.setSelected(true);
271             expert.setSelected(true);
272         }
273
274         public boolean isAvailableService(){
275             String newType = type.getText();
276             Object selectedExtractor = extractor.getSelectedItem();
277             String extractorClass = "";;
278             if(selectedExtractor != null){
279                 extractorClass = selectedExtractor.toString();
280             }
281             Object selectedComparator = comparator.getSelectedItem();
282             String comparatorClass = "";
283             if(selectedComparator != null){
284                 comparatorClass = selectedComparator.toString();
285             }
286             BirthmarkEnvironment environment = stigmata.getEnvironment();
287
288             boolean flag = newType.length() > 0
289                     && displayType.getText().length() > 0
290                     && extractorClass.length() > 0
291                     && comparatorClass.length() > 0;
292
293             // check inputed type is free
294             flag = flag && environment.getService(newType) == null;
295
296             // check extractor/comparator classes are available
297             flag = flag
298                 && environment.getClasspathContext().findEntry(extractorClass) != null
299                 && environment.getClasspathContext().findEntry(comparatorClass) != null;
300
301             return flag;
302         }
303
304         public void setService(BirthmarkSpi service){
305             type.setText(service.getType());
306             displayType.setText(service.getDisplayType());
307             description.setText(service.getDefaultDescription());
308             selectComboBoxItem(extractor, service.getExtractorClassName());
309             selectComboBoxItem(comparator, service.getComparatorClassName());
310             userDefined.setSelected(service.isUserDefined());
311             expert.setSelected(service.isExpert());
312
313             setEnabled(service.isUserDefined());
314         }
315
316         public void initData(){
317             comparator.addItem("");
318             for(Iterator<BirthmarkComparatorSpi> i = stigmata.getEnvironment().lookupProviders(BirthmarkComparatorSpi.class); i.hasNext();){
319                 BirthmarkComparatorSpi service = i.next();
320                 comparator.addItem(service.getComparatorClassName());
321             }
322             extractor.addItem("");
323             for(Iterator<BirthmarkExtractorSpi> i = stigmata.getEnvironment().lookupProviders(BirthmarkExtractorSpi.class); i.hasNext();){
324                 BirthmarkExtractorSpi service = i.next();
325                 extractor.addItem(service.getExtractorClassName());
326             }
327         }
328
329         private void selectComboBoxItem(JComboBox box, String item){
330             box.getModel().setSelectedItem(item);
331         }
332
333         private void initLayouts(){
334             Messages messages = stigmata.getMessages();
335             type = new JTextField();
336             displayType = new JTextField();
337             extractor = new JComboBox();
338             comparator = new JComboBox();
339             expert = new JCheckBox(messages.get("define.expert.label"));
340             userDefined = new JCheckBox(messages.get("define.userdef.label"));
341             description = new JTextArea();
342             JScrollPane scroll = new JScrollPane(description);
343             type.setColumns(10);
344             displayType.setColumns(20);
345             description.setColumns(40);
346             description.setRows(10);
347
348             JPanel typePane = new JPanel(new BorderLayout());
349             JPanel displayTypePane = new JPanel(new BorderLayout());
350             typePane.add(type, BorderLayout.CENTER);
351             displayTypePane.add(displayType, BorderLayout.CENTER);
352
353             JPanel box1 = new JPanel(new BorderLayout());
354             box1.add(typePane, BorderLayout.WEST);
355             box1.add(displayTypePane, BorderLayout.CENTER);
356
357             Box box2 = Box.createHorizontalBox();
358             box2.add(Box.createHorizontalGlue());
359             box2.add(expert);
360             box2.add(Box.createHorizontalGlue());
361             box2.add(userDefined);
362             box2.add(Box.createHorizontalGlue());
363
364             JPanel extractorPane = new JPanel(new BorderLayout());
365             extractorPane.add(extractor, BorderLayout.CENTER);
366             JPanel comparatorPane = new JPanel(new BorderLayout());
367             comparatorPane.add(comparator, BorderLayout.CENTER);
368
369             Box panel = Box.createVerticalBox();
370             panel.add(box1);
371             panel.add(extractorPane);
372             panel.add(comparatorPane);
373             panel.add(box2);
374
375             setLayout(new BorderLayout());
376             add(panel, BorderLayout.NORTH);
377             add(scroll, BorderLayout.CENTER);
378
379             GUIUtility.decorateJComponent(messages, typePane, "define.type");
380             GUIUtility.decorateJComponent(messages, displayTypePane, "define.displaytype");
381             GUIUtility.decorateJComponent(messages, scroll, "define.description");
382             GUIUtility.decorateJComponent(messages, extractorPane, "define.extractor");
383             GUIUtility.decorateJComponent(messages, comparatorPane, "define.comparator");
384             GUIUtility.decorateJComponent(messages, expert, "define.expert");
385             GUIUtility.decorateJComponent(messages, userDefined, "define.userdef");
386
387             userDefined.setEnabled(false);
388             expert.setEnabled(false);
389             userDefined.setSelected(true);
390             expert.setSelected(true);
391
392             extractor.setEditable(true);
393             comparator.setEditable(true);
394
395             DocumentListener listener = new DocumentListener(){
396                 public void insertUpdate(DocumentEvent e){
397                     thisPane.updateView();
398                 }
399
400                 public void removeUpdate(DocumentEvent e){
401                     thisPane.updateView();
402                 }
403
404                 public void changedUpdate(DocumentEvent e){
405                     thisPane.updateView();
406                 }
407             };
408
409             type.getDocument().addDocumentListener(listener);
410             displayType.getDocument().addDocumentListener(listener);
411             description.getDocument().addDocumentListener(listener);
412             ItemListener itemListener = new ItemListener(){
413                 public void itemStateChanged(ItemEvent e){
414                     thisPane.updateView();
415                 }
416             };
417             comparator.addItemListener(itemListener);
418             extractor.addItemListener(itemListener);
419             ActionListener actionListener = new ActionListener(){
420                 public void actionPerformed(ActionEvent e){
421                     thisPane.updateView();
422                 }
423             };
424             comparator.getEditor().addActionListener(actionListener);
425             extractor.getEditor().addActionListener(actionListener);
426         }
427     }
428 }