OSDN Git Service

update layout
[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             flag = flag
300                 && environment.getClasspathContext().findEntry(extractorClass) != null
301                 && environment.getClasspathContext().findEntry(comparatorClass) != null;
302
303             return flag;
304         }
305
306         public void setService(BirthmarkSpi service){
307             type.setText(service.getType());
308             displayType.setText(service.getDisplayType());
309             description.setText(service.getDefaultDescription());
310             selectComboBoxItem(extractor, service.getExtractorClassName());
311             selectComboBoxItem(comparator, service.getComparatorClassName());
312             userDefined.setSelected(service.isUserDefined());
313             expert.setSelected(service.isExpert());
314
315             setEnabled(service.isUserDefined());
316         }
317
318         public void initData(){
319             comparator.addItem("");
320             for(Iterator<BirthmarkComparatorSpi> i = stigmata.getEnvironment().lookupProviders(BirthmarkComparatorSpi.class); i.hasNext();){
321                 BirthmarkComparatorSpi service = i.next();
322                 comparator.addItem(service.getComparatorClassName());
323             }
324             extractor.addItem("");
325             for(Iterator<BirthmarkExtractorSpi> i = stigmata.getEnvironment().lookupProviders(BirthmarkExtractorSpi.class); i.hasNext();){
326                 BirthmarkExtractorSpi service = i.next();
327                 extractor.addItem(service.getExtractorClassName());
328             }
329         }
330
331         private void selectComboBoxItem(JComboBox box, String item){
332             box.getModel().setSelectedItem(item);
333         }
334
335         private void initLayouts(){
336             Messages messages = stigmata.getMessages();
337             type = new JTextField();
338             displayType = new JTextField();
339             extractor = new JComboBox();
340             comparator = new JComboBox();
341             expert = new JCheckBox(messages.get("define.expert.label"));
342             userDefined = new JCheckBox(messages.get("define.userdef.label"));
343             description = new JTextArea();
344             JScrollPane scroll = new JScrollPane(description);
345             type.setColumns(10);
346             displayType.setColumns(20);
347             description.setColumns(40);
348             description.setRows(10);
349
350             JPanel typePane = new JPanel(new BorderLayout());
351             JPanel displayTypePane = new JPanel(new BorderLayout());
352             typePane.add(type, BorderLayout.CENTER);
353             displayTypePane.add(displayType, BorderLayout.CENTER);
354
355             JPanel box1 = new JPanel(new BorderLayout());
356             box1.add(typePane, BorderLayout.WEST);
357             box1.add(displayTypePane, BorderLayout.CENTER);
358
359             Box box2 = Box.createHorizontalBox();
360             box2.add(Box.createHorizontalGlue());
361             box2.add(expert);
362             box2.add(Box.createHorizontalGlue());
363             box2.add(userDefined);
364             box2.add(Box.createHorizontalGlue());
365
366             JPanel extractorPane = new JPanel(new BorderLayout());
367             extractorPane.add(extractor, BorderLayout.CENTER);
368             JPanel comparatorPane = new JPanel(new BorderLayout());
369             comparatorPane.add(comparator, BorderLayout.CENTER);
370
371             Box panel = Box.createVerticalBox();
372             panel.add(box1);
373             panel.add(extractorPane);
374             panel.add(comparatorPane);
375             panel.add(box2);
376
377             setLayout(new BorderLayout());
378             add(panel, BorderLayout.NORTH);
379             add(scroll, BorderLayout.CENTER);
380
381             GUIUtility.decorateJComponent(messages, typePane, "define.type");
382             GUIUtility.decorateJComponent(messages, displayTypePane, "define.displaytype");
383             GUIUtility.decorateJComponent(messages, scroll, "define.description");
384             GUIUtility.decorateJComponent(messages, extractorPane, "define.extractor");
385             GUIUtility.decorateJComponent(messages, comparatorPane, "define.comparator");
386             GUIUtility.decorateJComponent(messages, expert, "define.expert");
387             GUIUtility.decorateJComponent(messages, userDefined, "define.userdef");
388
389             userDefined.setEnabled(false);
390             expert.setEnabled(false);
391             userDefined.setSelected(true);
392             expert.setSelected(true);
393
394             extractor.setEditable(true);
395             comparator.setEditable(true);
396
397             DocumentListener listener = new DocumentListener(){
398                 public void insertUpdate(DocumentEvent e){
399                     thisPane.updateView();
400                 }
401
402                 public void removeUpdate(DocumentEvent e){
403                     thisPane.updateView();
404                 }
405
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                 public void itemStateChanged(ItemEvent e){
416                     thisPane.updateView();
417                 }
418             };
419             comparator.addItemListener(itemListener);
420             extractor.addItemListener(itemListener);
421             ActionListener actionListener = new ActionListener(){
422                 public void actionPerformed(ActionEvent e){
423                     thisPane.updateView();
424                 }
425             };
426             comparator.getEditor().addActionListener(actionListener);
427             extractor.getEditor().addActionListener(actionListener);
428         }
429     }
430 }