1 package jp.sourceforge.stigmata.ui.swing;
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;
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;
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;
39 * @author Haruaki TAMADA
41 public class BirthmarkDefinitionPane extends JPanel{
42 private static final long serialVersionUID = 3932637653297802978L;
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>();
53 public BirthmarkDefinitionPane(StigmataFrame stigmata){
54 this.stigmata = stigmata;
62 public void addBirthmarkServiceListener(BirthmarkServiceListener listener){
63 listeners.add(listener);
66 public void removeBirthmarkServiceListener(BirthmarkServiceListener listener){
67 listeners.remove(listener);
71 for(BirthmarkSpi service: addedService){
72 model.removeElement(service);
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);
82 environment.addService(service);
87 private void initData(){
88 information.initData();
89 model.addElement(stigmata.getMessages().get("newservice.definition.label"));
91 for(BirthmarkSpi service: stigmata.getEnvironment().findServices()){
92 model.addElement(service);
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);
103 scroll.setBorder(new TitledBorder(messages.get("servicelist.border")));
104 serviceList.setToolTipText(messages.get("servicelist.tooltip"));
106 panel.add(scroll, BorderLayout.WEST);
107 panel.add(information = new InformationPane(stigmata, this), BorderLayout.CENTER);
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());
118 setLayout(new BorderLayout());
119 add(panel, BorderLayout.CENTER);
120 add(buttonPanel, BorderLayout.SOUTH);
122 removeService.setEnabled(false);
124 serviceList.addListSelectionListener(new ListSelectionListener(){
126 public void valueChanged(ListSelectionEvent e){
131 newService.addActionListener(new ActionListener(){
133 public void actionPerformed(ActionEvent e){
138 removeService.addActionListener(new ActionListener(){
140 public void actionPerformed(ActionEvent e){
146 private void removeService(){
147 int index = serviceList.getSelectedIndex();
149 BirthmarkSpi service = (BirthmarkSpi)model.getElementAt(index);
150 if(service != null && service.isUserDefined()){
152 for(BirthmarkServiceListener listener: listeners){
153 listener.serviceRemoved(service);
157 stigmata.setNeedToSaveSettings(true);
161 private void addNewService(){
162 BirthmarkService service = information.createService();
163 model.addElement(service);
164 addedService.add(service);
166 for(BirthmarkServiceListener listener: listeners){
167 listener.serviceAdded(service);
169 stigmata.setNeedToSaveSettings(true);
173 private void listValueChanged(ListSelectionEvent e){
174 int index = serviceList.getSelectedIndex();
176 BirthmarkSpi service = (BirthmarkSpi)model.getElementAt(index);
178 information.setService(service);
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.
192 private void updateView(){
193 int index = serviceList.getSelectedIndex();
194 ListModel model = serviceList.getModel();
195 BirthmarkSpi service = null;
197 service = (BirthmarkSpi)model.getElementAt(index);
199 newService.setEnabled(
200 (index <= 0 || service.isUserDefined()) &&
201 information.isAvailableService() &&
202 isAvailableServiceName(information.getType())
204 removeService.setEnabled(index > 0 && service.isUserDefined());
205 information.setEnabled(index <= 0 || service.isUserDefined());
208 private boolean isAvailableServiceName(String name){
209 for(BirthmarkSpi service: addedService){
210 if(service.getType().equals(name)){
217 private static class InformationPane extends JPanel{
218 private static final long serialVersionUID = 37906542932362L;
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;
230 public InformationPane(StigmataFrame stigmata, BirthmarkDefinitionPane thisPane){
231 this.stigmata = stigmata;
232 this.thisPane = thisPane;
236 public String getType(){
237 return type.getText();
241 public void setEnabled(boolean flag){
242 super.setEnabled(flag);
244 type.setEnabled(flag);
245 displayType.setEnabled(flag);
246 description.setEnabled(flag);
247 extractor.setEnabled(flag);
248 comparator.setEnabled(flag);
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);
265 displayType.setText("");
266 description.setText("");
267 extractor.getModel().setSelectedItem(null);
268 comparator.getModel().setSelectedItem(null);
269 userDefined.setSelected(true);
270 experimental.setSelected(true);
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();
280 Object selectedComparator = comparator.getSelectedItem();
281 String comparatorClass = "";
282 if(selectedComparator != null){
283 comparatorClass = selectedComparator.toString();
285 BirthmarkEnvironment environment = stigmata.getEnvironment();
287 boolean flag = newType.length() > 0
288 && displayType.getText().length() > 0
289 && extractorClass.length() > 0
290 && comparatorClass.length() > 0;
292 // check inputed type is free
293 flag = flag && environment.getService(newType) == null;
295 // check extractor/comparator classes are available
297 && environment.getClasspathContext().findEntry(extractorClass) != null
298 && environment.getClasspathContext().findEntry(comparatorClass) != null;
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());
312 setEnabled(service.isUserDefined());
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());
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());
328 private void selectComboBoxItem(JComboBox box, String item){
329 box.getModel().setSelectedItem(item);
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);
343 displayType.setColumns(20);
344 description.setColumns(40);
345 description.setRows(10);
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);
352 JPanel box1 = new JPanel(new BorderLayout());
353 box1.add(typePane, BorderLayout.WEST);
354 box1.add(displayTypePane, BorderLayout.CENTER);
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());
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);
368 Box panel = Box.createVerticalBox();
370 panel.add(extractorPane);
371 panel.add(comparatorPane);
374 setLayout(new BorderLayout());
375 add(panel, BorderLayout.NORTH);
376 add(scroll, BorderLayout.CENTER);
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");
386 userDefined.setEnabled(false);
387 experimental.setEnabled(false);
388 userDefined.setSelected(true);
389 experimental.setSelected(true);
391 extractor.setEditable(true);
392 comparator.setEditable(true);
394 DocumentListener listener = new DocumentListener(){
396 public void insertUpdate(DocumentEvent e){
397 thisPane.updateView();
401 public void removeUpdate(DocumentEvent e){
402 thisPane.updateView();
406 public void changedUpdate(DocumentEvent e){
407 thisPane.updateView();
411 type.getDocument().addDocumentListener(listener);
412 displayType.getDocument().addDocumentListener(listener);
413 description.getDocument().addDocumentListener(listener);
414 ItemListener itemListener = new ItemListener(){
416 public void itemStateChanged(ItemEvent e){
417 thisPane.updateView();
420 comparator.addItemListener(itemListener);
421 extractor.addItemListener(itemListener);
422 ActionListener actionListener = new ActionListener(){
424 public void actionPerformed(ActionEvent e){
425 thisPane.updateView();
428 comparator.getEditor().addActionListener(actionListener);
429 extractor.getEditor().addActionListener(actionListener);