OSDN Git Service

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