*/\r
\r
import java.awt.BorderLayout;\r
+import java.awt.Color;\r
+import java.awt.Component;\r
+import java.awt.Dimension;\r
+import java.awt.SystemColor;\r
import java.awt.event.ActionEvent;\r
import java.awt.event.ActionListener;\r
import java.awt.event.ItemEvent;\r
import java.io.IOException;\r
import java.io.PrintWriter;\r
import java.util.ArrayList;\r
-import java.util.HashMap;\r
import java.util.Iterator;\r
import java.util.List;\r
-import java.util.Map;\r
\r
import javax.imageio.spi.ServiceRegistry;\r
+import javax.swing.BorderFactory;\r
import javax.swing.Box;\r
import javax.swing.DefaultListModel;\r
import javax.swing.JButton;\r
import javax.swing.JCheckBox;\r
import javax.swing.JComboBox;\r
+import javax.swing.JLabel;\r
import javax.swing.JList;\r
import javax.swing.JPanel;\r
import javax.swing.JScrollPane;\r
import javax.swing.JTextArea;\r
import javax.swing.JTextField;\r
+import javax.swing.ListCellRenderer;\r
import javax.swing.ListModel;\r
import javax.swing.border.TitledBorder;\r
import javax.swing.event.DocumentEvent;\r
private static final long serialVersionUID = 3932637653297802978L;\r
\r
private StigmataFrame stigmata;\r
- private JList serviceList;\r
private DefaultListModel model;\r
private InformationPane information;\r
+ private JList serviceList;\r
private JButton newService;\r
private JButton removeService;\r
- private Map<String, BirthmarkSpi> services = new HashMap<String, BirthmarkSpi>();\r
private List<BirthmarkSpi> addedService = new ArrayList<BirthmarkSpi>();\r
+ private List<BirthmarkServiceHolder> holders = new ArrayList<BirthmarkServiceHolder>();\r
\r
public BirthmarkDefinitionPane(StigmataFrame stigmata){\r
this.stigmata = stigmata;\r
updateView();\r
}\r
\r
+ public void addServiceHolder(BirthmarkServiceHolder holder){\r
+ holders.add(holder);\r
+ }\r
+\r
+ public void removeServiceHolder(BirthmarkServiceHolder holder){\r
+ holders.remove(holder);\r
+ }\r
+\r
public void reset(){\r
- BirthmarkContext context = stigmata.getContext();\r
for(BirthmarkSpi service: addedService){\r
- context.removeService(service.getType());\r
- model.removeElement(service.getDisplayType());\r
+ model.removeElement(service);\r
+ }\r
+ }\r
+\r
+ public void updateContext(BirthmarkContext context){\r
+ for(BirthmarkSpi service: addedService){\r
+ if(context.getService(service.getType()) == null){\r
+ if(service instanceof BirthmarkService){\r
+ ((BirthmarkService)service).setBirthmarkContext(context);\r
+ }\r
+ context.addService(service);\r
+ }\r
}\r
}\r
\r
public void exportSettings(PrintWriter out) throws IOException{\r
out.println(" <services>");\r
- for(String key: services.keySet()){\r
- BirthmarkSpi service = services.get(key);\r
+ for(int i = 0; i < model.getSize(); i++){\r
+ BirthmarkSpi service = (BirthmarkSpi)model.getElementAt(i);\r
// not expert birthmarks are defined as class.\r
if(service.isExpert()){\r
out.println(" <service>");\r
model.addElement(Messages.getString("newservice.definition.label"));\r
\r
for(BirthmarkSpi service: stigmata.getContext().findServices()){\r
- model.addElement(service.getDisplayType());\r
- services.put(service.getDisplayType(), service);\r
+ model.addElement(service);\r
}\r
}\r
\r
private void initLayouts(){\r
JPanel panel = new JPanel(new BorderLayout());\r
serviceList = new JList(model = new DefaultListModel());\r
+ serviceList.setCellRenderer(new BirthmarkServiceListCellRenderer(new Dimension(250, 20), 60));\r
JScrollPane scroll = new JScrollPane(serviceList);\r
\r
scroll.setBorder(new TitledBorder(Messages.getString("servicelist.border")));\r
});\r
}\r
\r
- private BirthmarkSpi getService(String displayType){\r
- return services.get(displayType);\r
- }\r
-\r
private void removeService(){\r
int index = serviceList.getSelectedIndex();\r
if(index > 0){\r
- String label = (String)model.getElementAt(index);\r
- BirthmarkSpi service = services.get(label);\r
+ BirthmarkSpi service = (BirthmarkSpi)model.getElementAt(index);\r
if(service != null && service.isUserDefined()){\r
- stigmata.getContext().removeService(service.getType());\r
model.remove(index);\r
+ for(BirthmarkServiceHolder holder: holders){\r
+ holder.removeService(service.getType());\r
+ }\r
}\r
}\r
- stigmata.updateService();\r
updateView();\r
}\r
\r
private void addNewService(){\r
BirthmarkService service = information.createService();\r
- stigmata.getContext().addService(service);\r
- services.put(service.getDisplayType(), service);\r
- model.addElement(service.getDisplayType());\r
+ model.addElement(service);\r
addedService.add(service);\r
\r
- stigmata.updateService();\r
+ for(BirthmarkServiceHolder holder: holders){\r
+ holder.addService(service);\r
+ }\r
updateView();\r
}\r
\r
private void listValueChanged(ListSelectionEvent e){\r
int index = serviceList.getSelectedIndex();\r
if(index > 0){\r
- String label = (String)model.getElementAt(index);\r
- if(label != null){\r
- information.setService(services.get(label));\r
+ BirthmarkSpi service = (BirthmarkSpi)model.getElementAt(index);\r
+ if(service != null){\r
+ information.setService(service);\r
}\r
}\r
else if(index == 0){\r
ListModel model = serviceList.getModel();\r
BirthmarkSpi service = null;\r
if(index > 0){\r
- service = services.get(model.getElementAt(index)); \r
+ service = (BirthmarkSpi)model.getElementAt(index); \r
}\r
newService.setEnabled(\r
(index <= 0 || service.isUserDefined()) && \r
}\r
\r
public BirthmarkService createService(){\r
- BirthmarkService service = new BirthmarkService(stigmata.getContext());\r
+ BirthmarkService service = new BirthmarkService();\r
service.setType(type.getText());\r
service.setDisplayType(displayType.getText());\r
service.setDescription(description.getText());\r
\r
// check inputed type is free\r
flag = flag && context.getService(newType) == null;\r
- // check display type is free\r
- flag = flag && thisPane.getService(displayType.getText()) == null;\r
\r
// check extractor/comparator classes are available\r
try{\r
\r
private void initLayouts(){\r
setLayout(new BorderLayout());\r
- Box box = Box.createVerticalBox();\r
+ type = new JTextField();\r
+ displayType = new JTextField();\r
+ extractor = new JComboBox();\r
+ comparator = new JComboBox();\r
+ expert = new JCheckBox(Messages.getString("define.expert.label"));\r
+ userDefined = new JCheckBox(Messages.getString("define.userdef.label"));\r
+\r
+ Box panel = Box.createVerticalBox();\r
+\r
Box box1 = Box.createHorizontalBox();\r
- box1.add(type = new JTextField());\r
- box1.add(displayType = new JTextField());\r
+ box1.add(Box.createHorizontalGlue());\r
+ box1.add(type);\r
+ box1.add(Box.createHorizontalGlue());\r
+ box1.add(displayType);\r
+ box1.add(Box.createHorizontalGlue());\r
\r
Box box2 = Box.createHorizontalBox();\r
- box2.add(extractor = new JComboBox());\r
+ box2.add(Box.createHorizontalGlue());\r
+ box2.add(extractor);\r
+ box2.add(Box.createHorizontalGlue());\r
\r
Box box3 = Box.createHorizontalBox();\r
- box3.add(comparator = new JComboBox());\r
+ box3.add(Box.createHorizontalGlue());\r
+ box3.add(comparator);\r
+ box3.add(Box.createHorizontalGlue());\r
\r
Box box4 = Box.createHorizontalBox();\r
- box4.add(description = new JTextArea());\r
-\r
- Box box5 = Box.createHorizontalBox();\r
- box5.add(Box.createHorizontalGlue());\r
- box5.add(expert = new JCheckBox(Messages\r
- .getString("define.expert.label")));\r
- box5.add(Box.createHorizontalGlue());\r
- box5.add(userDefined = new JCheckBox(Messages\r
- .getString("define.userdef.label")));\r
- box5.add(Box.createHorizontalGlue());\r
-\r
- box.add(box1);\r
- box.add(box2);\r
- box.add(box3);\r
- box.add(box5);\r
- add(box, BorderLayout.NORTH);\r
- add(box4, BorderLayout.CENTER);\r
+ box4.add(Box.createHorizontalGlue());\r
+ box4.add(expert);\r
+ box4.add(Box.createHorizontalGlue());\r
+ box4.add(userDefined);\r
+ box4.add(Box.createHorizontalGlue());\r
+\r
+ panel.add(box1);\r
+ panel.add(box2);\r
+ panel.add(box3);\r
+ panel.add(box4);\r
+ add(panel, BorderLayout.NORTH);\r
+ add(new JScrollPane(description = new JTextArea()));\r
\r
Utility.decorateJComponent(type, "define.type");\r
Utility.decorateJComponent(displayType, "define.displaytype");\r
};\r
comparator.addItemListener(itemListener);\r
extractor.addItemListener(itemListener);\r
+ ActionListener actionListener = new ActionListener(){\r
+ public void actionPerformed(ActionEvent e){\r
+ thisPane.updateView();\r
+ }\r
+ };\r
+ comparator.getEditor().addActionListener(actionListener);\r
+ extractor.getEditor().addActionListener(actionListener);\r
+ }\r
+ }\r
+\r
+ private static class BirthmarkServiceListCellRenderer extends JPanel implements ListCellRenderer{\r
+ private static final long serialVersionUID = 3254763527508235L;\r
+\r
+ private final JLabel leftLabel = new JLabel();\r
+ private final JLabel rightLabel = new JLabel();\r
+\r
+ public BirthmarkServiceListCellRenderer(Dimension dim, int rightw){\r
+ super(new BorderLayout());\r
+ leftLabel.setOpaque(true);\r
+ rightLabel.setOpaque(true);\r
+ this.setOpaque(true);\r
+ leftLabel.setBorder(BorderFactory.createEmptyBorder(0,2,0,0));\r
+ rightLabel.setPreferredSize(new Dimension(rightw, 0));\r
+ rightLabel.setBorder(BorderFactory.createEmptyBorder(0,5,0,0));\r
+ this.add(leftLabel, BorderLayout.CENTER);\r
+ this.add(rightLabel, BorderLayout.EAST);\r
+ this.setPreferredSize(dim); \r
+ }\r
+\r
+ public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean hasFocus){\r
+ if(value instanceof BirthmarkSpi){\r
+ BirthmarkSpi service = (BirthmarkSpi)value;\r
+ leftLabel.setText(service.getDisplayType());\r
+ rightLabel.setText("(" + service.getType() + ")");\r
+ }\r
+ else{\r
+ leftLabel.setText(String.valueOf(value));\r
+ rightLabel.setText("");\r
+ }\r
+ setBackground(isSelected ? SystemColor.textHighlight: Color.white);\r
+ leftLabel.setBackground(isSelected ? SystemColor.textHighlight: Color.white);\r
+ leftLabel.setForeground(isSelected ? Color.white: Color.black);\r
+ rightLabel.setBackground(isSelected ? SystemColor.textHighlight: Color.white);\r
+ rightLabel.setForeground(isSelected ? Color.gray.brighter(): Color.gray);\r
+\r
+ return this;\r
}\r
}\r
}\r
* @author Haruaki TAMADA\r
* @version $Revision$ $Date$\r
*/\r
-public class BirthmarkSelectionPane extends JPanel{\r
+public class BirthmarkSelectionPane extends JPanel implements BirthmarkServiceHolder{\r
private static final long serialVersionUID = 3209854654743223453L;\r
\r
private StigmataFrame stigmata;\r
return services;\r
}\r
\r
- public void updateService(){\r
- Map<BirthmarkSpi, JCheckBox> newChecks = new HashMap<BirthmarkSpi, JCheckBox>();\r
- BirthmarkSpi[] services = stigmata.getContext().getServices();\r
- for(BirthmarkSpi service: services){\r
- if(checks.get(service) == null){ // added service is found\r
- JCheckBox check = new JCheckBox(new BirthmarkSelectAction(service, this));\r
- check.setToolTipText(service.getDescription());\r
- check.setSelected(true);\r
- newChecks.put(service, check);\r
- selectedServices.add(service.getType());\r
- serviceList.add(service);\r
+ public void addService(BirthmarkSpi service){\r
+ if(checks.get(service) == null){\r
+ JCheckBox check = new JCheckBox(new BirthmarkSelectAction(service, this));\r
+ check.setToolTipText(service.getDescription());\r
+ check.setSelected(true);\r
+ checks.put(service, check);\r
+ selectedServices.add(service.getType());\r
+ serviceList.add(service);\r
+ }\r
+ updateLayouts();\r
+ fireEvent();\r
+ }\r
+\r
+ public BirthmarkSpi getService(String type){\r
+ for(BirthmarkSpi service: serviceList){\r
+ if(service.getType().equals(type)){\r
+ return service;\r
}\r
- else{ // unchanged services\r
- newChecks.put(service, checks.get(service));\r
- checks.remove(service);\r
+ }\r
+ return null;\r
+ }\r
+\r
+ public boolean hasService(String type){\r
+ for(BirthmarkSpi service: serviceList){\r
+ if(service.getType().equals(type)){\r
+ return true;\r
}\r
}\r
- for(BirthmarkSpi remainService: checks.keySet()){\r
- JCheckBox check = checks.get(remainService);\r
- selectedServices.remove(remainService.getType());\r
- serviceList.remove(remainService);\r
+ return false;\r
+ }\r
+\r
+ public void removeService(String type){\r
+ BirthmarkSpi target = null;\r
+ for(BirthmarkSpi service: serviceList){\r
+ if(service.getType().equals(type)){\r
+ target = service;\r
+ break;\r
+ }\r
+ }\r
+ if(target != null){\r
+ JCheckBox check = checks.get(target);\r
remove(check);\r
+ selectedServices.remove(target.getType());\r
+ serviceList.remove(target);\r
+ checks.remove(target);\r
}\r
- this.checks = newChecks;\r
- updateLayouts();\r
+ fireEvent();\r
}\r
\r
private void fireEvent(){\r