1 package jp.sourceforge.stigmata.ui.swing;
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;
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;
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;
45 * @author Haruaki TAMADA
48 public class BirthmarkDefinitionPane extends JPanel{
49 private static final long serialVersionUID = 3932637653297802978L;
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>();
60 public BirthmarkDefinitionPane(StigmataFrame stigmata){
61 this.stigmata = stigmata;
69 public void addBirthmarkServiceListener(BirthmarkServiceListener listener){
70 listeners.add(listener);
73 public void removeBirthmarkServiceListener(BirthmarkServiceListener listener){
74 listeners.remove(listener);
78 for(BirthmarkSpi service: addedService){
79 model.removeElement(service);
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);
89 environment.addService(service);
94 private void initData(){
95 information.initData();
96 model.addElement(stigmata.getMessages().get("newservice.definition.label"));
98 for(BirthmarkSpi service: stigmata.getEnvironment().findServices()){
99 model.addElement(service);
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);
110 scroll.setBorder(new TitledBorder(messages.get("servicelist.border")));
111 serviceList.setToolTipText(messages.get("servicelist.tooltip"));
113 panel.add(scroll, BorderLayout.WEST);
114 panel.add(information = new InformationPane(stigmata, this), BorderLayout.CENTER);
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());
125 setLayout(new BorderLayout());
126 add(panel, BorderLayout.CENTER);
127 add(buttonPanel, BorderLayout.SOUTH);
129 removeService.setEnabled(false);
131 serviceList.addListSelectionListener(new ListSelectionListener(){
132 public void valueChanged(ListSelectionEvent e){
137 newService.addActionListener(new ActionListener(){
138 public void actionPerformed(ActionEvent e){
143 removeService.addActionListener(new ActionListener(){
144 public void actionPerformed(ActionEvent e){
150 private void removeService(){
151 int index = serviceList.getSelectedIndex();
153 BirthmarkSpi service = (BirthmarkSpi)model.getElementAt(index);
154 if(service != null && service.isUserDefined()){
156 for(BirthmarkServiceListener listener: listeners){
157 listener.serviceRemoved(service);
161 stigmata.setNeedToSaveSettings(true);
165 private void addNewService(){
166 BirthmarkService service = information.createService();
167 model.addElement(service);
168 addedService.add(service);
170 for(BirthmarkServiceListener listener: listeners){
171 listener.serviceAdded(service);
173 stigmata.setNeedToSaveSettings(true);
177 private void listValueChanged(ListSelectionEvent e){
178 int index = serviceList.getSelectedIndex();
180 BirthmarkSpi service = (BirthmarkSpi)model.getElementAt(index);
182 information.setService(service);
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.
196 private void updateView(){
197 int index = serviceList.getSelectedIndex();
198 ListModel model = serviceList.getModel();
199 BirthmarkSpi service = null;
201 service = (BirthmarkSpi)model.getElementAt(index);
203 newService.setEnabled(
204 (index <= 0 || service.isUserDefined()) &&
205 information.isAvailableService() &&
206 isAvailableServiceName(information.getType())
208 removeService.setEnabled(index > 0 && service.isUserDefined());
209 information.setEnabled(index <= 0 || service.isUserDefined());
212 private boolean isAvailableServiceName(String name){
213 for(BirthmarkSpi service: addedService){
214 if(service.getType().equals(name)){
221 private static class InformationPane extends JPanel{
222 private static final long serialVersionUID = 37906542932362L;
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;
234 public InformationPane(StigmataFrame stigmata, BirthmarkDefinitionPane thisPane){
235 this.stigmata = stigmata;
236 this.thisPane = thisPane;
240 public String getType(){
241 return type.getText();
244 public void setEnabled(boolean flag){
245 super.setEnabled(flag);
247 type.setEnabled(flag);
248 displayType.setEnabled(flag);
249 description.setEnabled(flag);
250 extractor.setEnabled(flag);
251 comparator.setEnabled(flag);
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);
268 displayType.setText("");
269 description.setText("");
270 extractor.getModel().setSelectedItem(null);
271 comparator.getModel().setSelectedItem(null);
272 userDefined.setSelected(true);
273 expert.setSelected(true);
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();
283 Object selectedComparator = comparator.getSelectedItem();
284 String comparatorClass = "";
285 if(selectedComparator != null){
286 comparatorClass = selectedComparator.toString();
288 BirthmarkEnvironment environment = stigmata.getEnvironment();
290 boolean flag = newType.length() > 0
291 && displayType.getText().length() > 0
292 && extractorClass.length() > 0
293 && comparatorClass.length() > 0;
295 // check inputed type is free
296 flag = flag && environment.getService(newType) == null;
298 // check extractor/comparator classes are available
300 && environment.getClasspathContext().findEntry(extractorClass) != null
301 && environment.getClasspathContext().findEntry(comparatorClass) != null;
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());
315 setEnabled(service.isUserDefined());
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());
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());
331 private void selectComboBoxItem(JComboBox box, String item){
332 box.getModel().setSelectedItem(item);
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);
346 displayType.setColumns(20);
347 description.setColumns(40);
348 description.setRows(10);
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);
355 JPanel box1 = new JPanel(new BorderLayout());
356 box1.add(typePane, BorderLayout.WEST);
357 box1.add(displayTypePane, BorderLayout.CENTER);
359 Box box2 = Box.createHorizontalBox();
360 box2.add(Box.createHorizontalGlue());
362 box2.add(Box.createHorizontalGlue());
363 box2.add(userDefined);
364 box2.add(Box.createHorizontalGlue());
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);
371 Box panel = Box.createVerticalBox();
373 panel.add(extractorPane);
374 panel.add(comparatorPane);
377 setLayout(new BorderLayout());
378 add(panel, BorderLayout.NORTH);
379 add(scroll, BorderLayout.CENTER);
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");
389 userDefined.setEnabled(false);
390 expert.setEnabled(false);
391 userDefined.setSelected(true);
392 expert.setSelected(true);
394 extractor.setEditable(true);
395 comparator.setEditable(true);
397 DocumentListener listener = new DocumentListener(){
398 public void insertUpdate(DocumentEvent e){
399 thisPane.updateView();
402 public void removeUpdate(DocumentEvent e){
403 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(){
415 public void itemStateChanged(ItemEvent e){
416 thisPane.updateView();
419 comparator.addItemListener(itemListener);
420 extractor.addItemListener(itemListener);
421 ActionListener actionListener = new ActionListener(){
422 public void actionPerformed(ActionEvent e){
423 thisPane.updateView();
426 comparator.getEditor().addActionListener(actionListener);
427 extractor.getEditor().addActionListener(actionListener);