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(){
130 public void valueChanged(ListSelectionEvent e){
135 newService.addActionListener(new ActionListener(){
136 public void actionPerformed(ActionEvent e){
141 removeService.addActionListener(new ActionListener(){
142 public void actionPerformed(ActionEvent e){
148 private void removeService(){
149 int index = serviceList.getSelectedIndex();
151 BirthmarkSpi service = (BirthmarkSpi)model.getElementAt(index);
152 if(service != null && service.isUserDefined()){
154 for(BirthmarkServiceListener listener: listeners){
155 listener.serviceRemoved(service);
159 stigmata.setNeedToSaveSettings(true);
163 private void addNewService(){
164 BirthmarkService service = information.createService();
165 model.addElement(service);
166 addedService.add(service);
168 for(BirthmarkServiceListener listener: listeners){
169 listener.serviceAdded(service);
171 stigmata.setNeedToSaveSettings(true);
175 private void listValueChanged(ListSelectionEvent e){
176 int index = serviceList.getSelectedIndex();
178 BirthmarkSpi service = (BirthmarkSpi)model.getElementAt(index);
180 information.setService(service);
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.
194 private void updateView(){
195 int index = serviceList.getSelectedIndex();
196 ListModel model = serviceList.getModel();
197 BirthmarkSpi service = null;
199 service = (BirthmarkSpi)model.getElementAt(index);
201 newService.setEnabled(
202 (index <= 0 || service.isUserDefined()) &&
203 information.isAvailableService() &&
204 isAvailableServiceName(information.getType())
206 removeService.setEnabled(index > 0 && service.isUserDefined());
207 information.setEnabled(index <= 0 || service.isUserDefined());
210 private boolean isAvailableServiceName(String name){
211 for(BirthmarkSpi service: addedService){
212 if(service.getType().equals(name)){
219 private static class InformationPane extends JPanel{
220 private static final long serialVersionUID = 37906542932362L;
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;
232 public InformationPane(StigmataFrame stigmata, BirthmarkDefinitionPane thisPane){
233 this.stigmata = stigmata;
234 this.thisPane = thisPane;
238 public String getType(){
239 return type.getText();
242 public void setEnabled(boolean flag){
243 super.setEnabled(flag);
245 type.setEnabled(flag);
246 displayType.setEnabled(flag);
247 description.setEnabled(flag);
248 extractor.setEnabled(flag);
249 comparator.setEnabled(flag);
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);
266 displayType.setText("");
267 description.setText("");
268 extractor.getModel().setSelectedItem(null);
269 comparator.getModel().setSelectedItem(null);
270 userDefined.setSelected(true);
271 expert.setSelected(true);
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();
281 Object selectedComparator = comparator.getSelectedItem();
282 String comparatorClass = "";
283 if(selectedComparator != null){
284 comparatorClass = selectedComparator.toString();
286 BirthmarkEnvironment environment = stigmata.getEnvironment();
288 boolean flag = newType.length() > 0
289 && displayType.getText().length() > 0
290 && extractorClass.length() > 0
291 && comparatorClass.length() > 0;
293 // check inputed type is free
294 flag = flag && environment.getService(newType) == null;
296 // check extractor/comparator classes are available
298 && environment.getClasspathContext().findEntry(extractorClass) != null
299 && environment.getClasspathContext().findEntry(comparatorClass) != null;
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());
313 setEnabled(service.isUserDefined());
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());
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());
329 private void selectComboBoxItem(JComboBox box, String item){
330 box.getModel().setSelectedItem(item);
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);
344 displayType.setColumns(20);
345 description.setColumns(40);
346 description.setRows(10);
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);
353 JPanel box1 = new JPanel(new BorderLayout());
354 box1.add(typePane, BorderLayout.WEST);
355 box1.add(displayTypePane, BorderLayout.CENTER);
357 Box box2 = Box.createHorizontalBox();
358 box2.add(Box.createHorizontalGlue());
360 box2.add(Box.createHorizontalGlue());
361 box2.add(userDefined);
362 box2.add(Box.createHorizontalGlue());
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);
369 Box panel = Box.createVerticalBox();
371 panel.add(extractorPane);
372 panel.add(comparatorPane);
375 setLayout(new BorderLayout());
376 add(panel, BorderLayout.NORTH);
377 add(scroll, BorderLayout.CENTER);
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");
387 userDefined.setEnabled(false);
388 expert.setEnabled(false);
389 userDefined.setSelected(true);
390 expert.setSelected(true);
392 extractor.setEditable(true);
393 comparator.setEditable(true);
395 DocumentListener listener = new DocumentListener(){
396 public void insertUpdate(DocumentEvent e){
397 thisPane.updateView();
400 public void removeUpdate(DocumentEvent e){
401 thisPane.updateView();
404 public void changedUpdate(DocumentEvent e){
405 thisPane.updateView();
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();
417 comparator.addItemListener(itemListener);
418 extractor.addItemListener(itemListener);
419 ActionListener actionListener = new ActionListener(){
420 public void actionPerformed(ActionEvent e){
421 thisPane.updateView();
424 comparator.getEditor().addActionListener(actionListener);
425 extractor.getEditor().addActionListener(actionListener);