1 package jp.sourceforge.stigmata.ui.swing;
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;
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;
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;
43 * @author Haruaki TAMADA
46 public class BirthmarkDefinitionPane extends JPanel{
47 private static final long serialVersionUID = 3932637653297802978L;
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>();
58 public BirthmarkDefinitionPane(StigmataFrame stigmata){
59 this.stigmata = stigmata;
67 public void addBirthmarkServiceListener(BirthmarkServiceListener listener){
68 listeners.add(listener);
71 public void removeBirthmarkServiceListener(BirthmarkServiceListener listener){
72 listeners.remove(listener);
76 for(BirthmarkSpi service: addedService){
77 model.removeElement(service);
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);
87 environment.addService(service);
92 private void initData(){
93 information.initData();
94 model.addElement(stigmata.getMessages().get("newservice.definition.label"));
96 for(BirthmarkSpi service: stigmata.getEnvironment().findServices()){
97 model.addElement(service);
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);
108 scroll.setBorder(new TitledBorder(messages.get("servicelist.border")));
109 serviceList.setToolTipText(messages.get("servicelist.tooltip"));
111 panel.add(scroll, BorderLayout.WEST);
112 panel.add(information = new InformationPane(stigmata, this), BorderLayout.CENTER);
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());
123 setLayout(new BorderLayout());
124 add(panel, BorderLayout.CENTER);
125 add(buttonPanel, BorderLayout.SOUTH);
127 removeService.setEnabled(false);
129 serviceList.addListSelectionListener(new ListSelectionListener(){
131 public void valueChanged(ListSelectionEvent e){
136 newService.addActionListener(new ActionListener(){
138 public void actionPerformed(ActionEvent e){
143 removeService.addActionListener(new ActionListener(){
145 public void actionPerformed(ActionEvent e){
151 private void removeService(){
152 int index = serviceList.getSelectedIndex();
154 BirthmarkSpi service = (BirthmarkSpi)model.getElementAt(index);
155 if(service != null && service.isUserDefined()){
157 for(BirthmarkServiceListener listener: listeners){
158 listener.serviceRemoved(service);
162 stigmata.setNeedToSaveSettings(true);
166 private void addNewService(){
167 BirthmarkService service = information.createService();
168 model.addElement(service);
169 addedService.add(service);
171 for(BirthmarkServiceListener listener: listeners){
172 listener.serviceAdded(service);
174 stigmata.setNeedToSaveSettings(true);
178 private void listValueChanged(ListSelectionEvent e){
179 int index = serviceList.getSelectedIndex();
181 BirthmarkSpi service = (BirthmarkSpi)model.getElementAt(index);
183 information.setService(service);
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.
197 private void updateView(){
198 int index = serviceList.getSelectedIndex();
199 ListModel model = serviceList.getModel();
200 BirthmarkSpi service = null;
202 service = (BirthmarkSpi)model.getElementAt(index);
204 newService.setEnabled(
205 (index <= 0 || service.isUserDefined()) &&
206 information.isAvailableService() &&
207 isAvailableServiceName(information.getType())
209 removeService.setEnabled(index > 0 && service.isUserDefined());
210 information.setEnabled(index <= 0 || service.isUserDefined());
213 private boolean isAvailableServiceName(String name){
214 for(BirthmarkSpi service: addedService){
215 if(service.getType().equals(name)){
222 private static class InformationPane extends JPanel{
223 private static final long serialVersionUID = 37906542932362L;
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;
235 public InformationPane(StigmataFrame stigmata, BirthmarkDefinitionPane thisPane){
236 this.stigmata = stigmata;
237 this.thisPane = thisPane;
241 public String getType(){
242 return type.getText();
246 public void setEnabled(boolean flag){
247 super.setEnabled(flag);
249 type.setEnabled(flag);
250 displayType.setEnabled(flag);
251 description.setEnabled(flag);
252 extractor.setEnabled(flag);
253 comparator.setEnabled(flag);
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);
270 displayType.setText("");
271 description.setText("");
272 extractor.getModel().setSelectedItem(null);
273 comparator.getModel().setSelectedItem(null);
274 userDefined.setSelected(true);
275 experimental.setSelected(true);
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();
285 Object selectedComparator = comparator.getSelectedItem();
286 String comparatorClass = "";
287 if(selectedComparator != null){
288 comparatorClass = selectedComparator.toString();
290 BirthmarkEnvironment environment = stigmata.getEnvironment();
292 boolean flag = newType.length() > 0
293 && displayType.getText().length() > 0
294 && extractorClass.length() > 0
295 && comparatorClass.length() > 0;
297 // check inputed type is free
298 flag = flag && environment.getService(newType) == null;
300 // check extractor/comparator classes are available
302 && environment.getClasspathContext().findEntry(extractorClass) != null
303 && environment.getClasspathContext().findEntry(comparatorClass) != null;
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());
317 setEnabled(service.isUserDefined());
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());
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());
333 private void selectComboBoxItem(JComboBox box, String item){
334 box.getModel().setSelectedItem(item);
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);
348 displayType.setColumns(20);
349 description.setColumns(40);
350 description.setRows(10);
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);
357 JPanel box1 = new JPanel(new BorderLayout());
358 box1.add(typePane, BorderLayout.WEST);
359 box1.add(displayTypePane, BorderLayout.CENTER);
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());
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);
373 Box panel = Box.createVerticalBox();
375 panel.add(extractorPane);
376 panel.add(comparatorPane);
379 setLayout(new BorderLayout());
380 add(panel, BorderLayout.NORTH);
381 add(scroll, BorderLayout.CENTER);
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");
391 userDefined.setEnabled(false);
392 experimental.setEnabled(false);
393 userDefined.setSelected(true);
394 experimental.setSelected(true);
396 extractor.setEditable(true);
397 comparator.setEditable(true);
399 DocumentListener listener = new DocumentListener(){
401 public void insertUpdate(DocumentEvent e){
402 thisPane.updateView();
406 public void removeUpdate(DocumentEvent e){
407 thisPane.updateView();
411 public void changedUpdate(DocumentEvent e){
412 thisPane.updateView();
416 type.getDocument().addDocumentListener(listener);
417 displayType.getDocument().addDocumentListener(listener);
418 description.getDocument().addDocumentListener(listener);
419 ItemListener itemListener = new ItemListener(){
421 public void itemStateChanged(ItemEvent e){
422 thisPane.updateView();
425 comparator.addItemListener(itemListener);
426 extractor.addItemListener(itemListener);
427 ActionListener actionListener = new ActionListener(){
429 public void actionPerformed(ActionEvent e){
430 thisPane.updateView();
433 comparator.getEditor().addActionListener(actionListener);
434 extractor.getEditor().addActionListener(actionListener);