OSDN Git Service

create context when extract/compare button is pressed
authortama3 <tama3@acee48c3-7b26-0410-bdac-b3d0e5314bbc>
Sat, 3 Mar 2007 13:25:32 +0000 (13:25 +0000)
committertama3 <tama3@acee48c3-7b26-0410-bdac-b3d0e5314bbc>
Sat, 3 Mar 2007 13:25:32 +0000 (13:25 +0000)
git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/stigmata/trunk@65 acee48c3-7b26-0410-bdac-b3d0e5314bbc

12 files changed:
src/main/java/jp/naist/se/stigmata/birthmarks/BirthmarkService.java
src/main/java/jp/naist/se/stigmata/ui/swing/BirthmarkDefinitionPane.java
src/main/java/jp/naist/se/stigmata/ui/swing/BirthmarkSelectionPane.java
src/main/java/jp/naist/se/stigmata/ui/swing/BirthmarkServiceHolder.java [new file with mode: 0755]
src/main/java/jp/naist/se/stigmata/ui/swing/ControlPane.java
src/main/java/jp/naist/se/stigmata/ui/swing/PairComparisonPane.java
src/main/java/jp/naist/se/stigmata/ui/swing/PropertyEditPane.java
src/main/java/jp/naist/se/stigmata/ui/swing/RoundRobinComparisonResultPane.java
src/main/java/jp/naist/se/stigmata/ui/swing/StigmataFrame.java
src/main/java/jp/naist/se/stigmata/ui/swing/TargetSelectionPane.java
src/main/resources/resources/messages.properties
src/main/resources/resources/messages_ja.source

index 1ac67f6..48bba53 100755 (executable)
@@ -35,6 +35,10 @@ public class BirthmarkService extends AbstractBirthmarkService implements Birthm
     public BirthmarkService(){\r
     }\r
 \r
+    public void setBirthmarkContext(BirthmarkContext context){\r
+        this.context = context;\r
+    }\r
+\r
     public void setExtractorClassName(String extractor){\r
         try{\r
             Class<?> c;\r
index 2b5a19a..d26f7eb 100755 (executable)
@@ -5,6 +5,10 @@ package jp.naist.se.stigmata.ui.swing;
  */\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
@@ -12,22 +16,23 @@ import java.awt.event.ItemListener;
 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
@@ -50,13 +55,13 @@ public class BirthmarkDefinitionPane extends JPanel{
     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
@@ -67,18 +72,35 @@ public class BirthmarkDefinitionPane extends JPanel{
         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
@@ -108,14 +130,14 @@ public class BirthmarkDefinitionPane extends JPanel{
         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
@@ -158,41 +180,37 @@ public class BirthmarkDefinitionPane extends JPanel{
         });\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
@@ -206,7 +224,7 @@ public class BirthmarkDefinitionPane extends JPanel{
         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
@@ -246,7 +264,7 @@ public class BirthmarkDefinitionPane extends JPanel{
         }\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
@@ -288,8 +306,6 @@ public class BirthmarkDefinitionPane extends JPanel{
 \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
@@ -334,35 +350,45 @@ public class BirthmarkDefinitionPane extends JPanel{
 \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
@@ -404,6 +430,52 @@ public class BirthmarkDefinitionPane extends JPanel{
             };\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
index d09b4d3..4a38869 100755 (executable)
@@ -25,7 +25,7 @@ import jp.naist.se.stigmata.spi.BirthmarkSpi;
  * @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
@@ -90,31 +90,53 @@ public class BirthmarkSelectionPane extends JPanel{
         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
diff --git a/src/main/java/jp/naist/se/stigmata/ui/swing/BirthmarkServiceHolder.java b/src/main/java/jp/naist/se/stigmata/ui/swing/BirthmarkServiceHolder.java
new file mode 100755 (executable)
index 0000000..aaf6ace
--- /dev/null
@@ -0,0 +1,22 @@
+package jp.naist.se.stigmata.ui.swing;\r
+\r
+/*\r
+ * $Id$\r
+ */\r
+\r
+import jp.naist.se.stigmata.spi.BirthmarkSpi;\r
+\r
+/**\r
+ * \r
+ * @author Haruaki Tamada\r
+ * @version $Revision$ $Date$\r
+ */\r
+public interface BirthmarkServiceHolder{\r
+    public void addService(BirthmarkSpi service);\r
+\r
+    public boolean hasService(String type);\r
+\r
+    public BirthmarkSpi getService(String type);\r
+\r
+    public void removeService(String type);\r
+}\r
index 399291e..597e9c6 100755 (executable)
@@ -59,15 +59,11 @@ public class ControlPane extends JPanel{
         Utility.addNewTab("classpath", controlTab, classpath = new ClasspathSettingsPane(stigmata));\r
         definition = new BirthmarkDefinitionPane(stigmata);\r
         properties = new PropertyEditPane(stigmata);\r
+        definition.addServiceHolder(birthmarks);\r
 \r
         reset();\r
     }\r
 \r
-    public void updateService(){\r
-        birthmarks.updateService();\r
-        updateEnable();\r
-    }\r
-\r
     public void reset(){\r
         this.geekmode = false;\r
         definition.reset();\r
@@ -247,6 +243,7 @@ public class ControlPane extends JPanel{
 \r
         classpath.updateClasspathContext(bytecode);\r
         wellknownClassses.setWellknownClasses(manager);\r
+        definition.updateContext(context);\r
         properties.updateContext(context);\r
 \r
         return context;\r
index 9750a75..27b7e04 100755 (executable)
@@ -43,7 +43,6 @@ public class PairComparisonPane extends JPanel implements BirthmarkDataWritable{
     private static final long serialVersionUID = 2342856785474356234L;\r
 \r
     private StigmataFrame frame;\r
-\r
     private ComparisonPair pair;\r
 \r
     public PairComparisonPane(StigmataFrame frame, ComparisonPair pair){\r
index 827c3ff..e68b1a6 100755 (executable)
@@ -1,5 +1,9 @@
 package jp.naist.se.stigmata.ui.swing;\r
 \r
+/*\r
+ * $Id$\r
+ */\r
+\r
 import java.awt.BorderLayout;\r
 import java.awt.GridBagConstraints;\r
 import java.awt.GridBagLayout;\r
@@ -25,6 +29,11 @@ import javax.swing.table.DefaultTableModel;
 \r
 import jp.naist.se.stigmata.BirthmarkContext;\r
 \r
+/**\r
+ * \r
+ * @author Haruaki Tamada\r
+ * @version $Revision$ $Date$\r
+ */\r
 public class PropertyEditPane extends JPanel{\r
     private static final long serialVersionUID = 12397342543653L;\r
 \r
index fd8c0db..c60f4b3 100755 (executable)
@@ -47,19 +47,12 @@ public class RoundRobinComparisonResultPane extends JPanel implements BirthmarkD
     private static final long serialVersionUID = 2134574576543623L;\r
 \r
     private BirthmarkSet[] birthmarksX;\r
-\r
     private BirthmarkSet[] birthmarksY;\r
-\r
     private JTable table;\r
-\r
     private DefaultTableModel model;\r
-\r
     private JLabel classCount, comparisonCount, distinctionRatio;\r
-\r
     private JLabel average, minimum, maximum;\r
-\r
     private StigmataFrame stigmataFrame;\r
-\r
     private BirthmarkContext context;\r
 \r
     public RoundRobinComparisonResultPane(StigmataFrame stigmata, BirthmarkContext context,\r
@@ -87,7 +80,7 @@ public class RoundRobinComparisonResultPane extends JPanel implements BirthmarkD
         double avg = 0d;\r
         double max = 0d;\r
         double min = 100d;\r
-        model.addColumn(""); //$NON-NLS-1$\r
+        model.addColumn("");\r
         for(BirthmarkSet x: birthmarksX){\r
             model.addColumn(x.getClassName());\r
         }\r
index c593d37..772423a 100755 (executable)
@@ -318,10 +318,6 @@ public class StigmataFrame extends JFrame implements CurrentDirectoryHolder{
         return mapping;\r
     }\r
 \r
-    public void updateService(){\r
-        control.updateService();\r
-    }\r
-\r
     private File findFile(boolean open, String[] exts, String desc){\r
         JFileChooser chooser = new JFileChooser(getCurrentDirectory());\r
         chooser.setFileFilter(new ExtensionFilter(exts, desc));\r
@@ -495,10 +491,8 @@ public class StigmataFrame extends JFrame implements CurrentDirectoryHolder{
         panel.add(logo, BorderLayout.NORTH);\r
 \r
         String aboutMessage = loadString("/resources/about.txt");\r
-        aboutMessage = aboutMessage.replace("${implementation.version}", p\r
-                .getImplementationVersion());\r
-        aboutMessage = aboutMessage\r
-                .replace("${implementation.vendor}", p.getImplementationVendor());\r
+        aboutMessage = aboutMessage.replace("${implementation.version}", p.getImplementationVersion());\r
+        aboutMessage = aboutMessage.replace("${implementation.vendor}", p.getImplementationVendor());\r
         aboutMessage = aboutMessage.replace("${implementation.title}", p.getImplementationTitle());\r
 \r
         JTextArea text = new JTextArea(aboutMessage);\r
index 3255481..3f11702 100755 (executable)
@@ -36,8 +36,6 @@ import javax.swing.filechooser.FileFilter;
 \r
 /**\r
  * \r
- * \r
- * \r
  * @author Haruaki TAMADA\r
  * @version $Revision$ $Date$\r
  */\r
index 9109738..215aa22 100755 (executable)
@@ -296,7 +296,7 @@ property.tab.tooltip=Editing properties
 \r
 propertyname.label=Property name\r
 propertyvalue.label=Property value\r
-propertyadd.button.label=Add\r
+propertyadd.button.label=Add...\r
 propertyadd.button.tooltip=Add new property\r
 propertyadd.button.icon=tag_blue_add.png\r
 propertyremove.button.label=Remove\r
index 06be440..a4905bd 100755 (executable)
@@ -249,7 +249,7 @@ property.tab.tooltip=
 \r
 propertyname.label=\83v\83\8d\83p\83e\83B\96¼\r
 propertyvalue.label=\83v\83\8d\83p\83e\83B\92l\r
-propertyadd.button.label=\92Ç\89Á\r
+propertyadd.button.label=\92Ç\89Á...\r
 propertyadd.button.tooltip=\90V\82µ\82¢\83v\83\8d\83p\83e\83B\82ð\92Ç\89Á\82µ\82Ü\82·\81D\r
 propertyremove.button.label=\8dí\8f\9c\r
 propertyremove.button.tooltip=\91I\91ð\82µ\82Ä\82¢\82é\83v\83\8d\83p\83e\83B\82ð\8dí\8f\9c\82µ\82Ü\82·\81D\r