OSDN Git Service

enable update table cell color
authortama3 <tama3@acee48c3-7b26-0410-bdac-b3d0e5314bbc>
Thu, 14 Jun 2007 09:52:41 +0000 (09:52 +0000)
committertama3 <tama3@acee48c3-7b26-0410-bdac-b3d0e5314bbc>
Thu, 14 Jun 2007 09:52:41 +0000 (09:52 +0000)
git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/stigmata/trunk@132 acee48c3-7b26-0410-bdac-b3d0e5314bbc

20 files changed:
pom.xml
src/main/java/jp/naist/se/stigmata/BirthmarkContext.java
src/main/java/jp/naist/se/stigmata/Main.java
src/main/java/jp/naist/se/stigmata/Stigmata.java
src/main/java/jp/naist/se/stigmata/birthmarks/BirthmarkService.java
src/main/java/jp/naist/se/stigmata/birthmarks/is/InheritanceStructureBirthmarkExtractVisitor.java
src/main/java/jp/naist/se/stigmata/ui/swing/BirthmarkDefinitionPane.java
src/main/java/jp/naist/se/stigmata/ui/swing/ClasspathSettingsPane.java
src/main/java/jp/naist/se/stigmata/ui/swing/CompareTableCellRenderer.java
src/main/java/jp/naist/se/stigmata/ui/swing/ControlPane.java
src/main/java/jp/naist/se/stigmata/ui/swing/FileIOManager.java
src/main/java/jp/naist/se/stigmata/ui/swing/PairComparisonResultSetPane.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/actions/UpdateBirthmarkCellColorAction.java [new file with mode: 0755]
src/main/java/jp/naist/se/stigmata/utils/ConfigFileExporter.java
src/main/java/jp/naist/se/stigmata/utils/ConfigFileImporter.java
src/main/resources/resources/messages.properties
src/main/resources/resources/messages_ja.source

diff --git a/pom.xml b/pom.xml
index 9e1996f..4800c03 100755 (executable)
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
   <modelVersion>4.0.0</modelVersion>
   <groupId>jp.naist.se</groupId>
   <artifactId>stigmata</artifactId>
-  <version>1.0.0</version>
+  <version>1.0.1</version>
   <name>stigmata</name>
   <description>Java birthmark toolkit</description>
   <url>http://stigmata.sourceforge.jp/</url>
index 46134d0..3230e0e 100644 (file)
@@ -4,6 +4,8 @@ package jp.naist.se.stigmata;
  * $Id$\r
  */\r
 \r
+import java.beans.PropertyChangeEvent;\r
+import java.beans.PropertyChangeListener;\r
 import java.util.ArrayList;\r
 import java.util.Arrays;\r
 import java.util.HashMap;\r
@@ -58,6 +60,11 @@ public class BirthmarkContext{
     private Map<String, String> properties = new HashMap<String, String>();\r
 \r
     /**\r
+     * listeners for updating properties.\r
+     */\r
+    private List<PropertyChangeListener> propertyListeners = new ArrayList<PropertyChangeListener>();\r
+\r
+    /**\r
      * filter manager.\r
      */\r
     private ComparisonPairFilterManager filterManager;\r
@@ -85,7 +92,7 @@ public class BirthmarkContext{
     public BirthmarkContext(BirthmarkContext parent){\r
         this.parent = parent;\r
         this.manager = new WellknownClassManager(parent.getWellknownClassManager());\r
-        this.bytecodeContext = new ClasspathContext(parent.getBytecodeContext());\r
+        this.bytecodeContext = new ClasspathContext(parent.getClasspathContext());\r
         this.filterManager = new ComparisonPairFilterManager(parent.getFilterManager());\r
     }\r
 \r
@@ -96,18 +103,26 @@ public class BirthmarkContext{
         return DEFAULT_CONTEXT;\r
     }\r
 \r
+    public BirthmarkContext getParent(){\r
+        return parent;\r
+    }\r
+\r
     /**\r
      * remove property mapped given key.\r
      */\r
     public void removeProperty(String key){\r
+        String old = properties.get(key);\r
         properties.remove(key);\r
+        firePropertyEvent(new PropertyChangeEvent(this, key, old, null));\r
     }\r
 \r
     /**\r
      * add given property.\r
      */\r
     public void addProperty(String key, String value){\r
+        String old = getProperty(key);\r
         properties.put(key, value);\r
+        firePropertyEvent(new PropertyChangeEvent(this, key, old, value));\r
     }\r
 \r
     /**\r
@@ -121,6 +136,30 @@ public class BirthmarkContext{
         return value;\r
     }\r
 \r
+    /**\r
+     * fire property change event to listeners.\r
+     * @param e Event object.\r
+     */\r
+    private void firePropertyEvent(PropertyChangeEvent e){\r
+        for(PropertyChangeListener listener: propertyListeners){\r
+            listener.propertyChange(e);\r
+        }\r
+    }\r
+\r
+    /**\r
+     * add listener for updating properties.\r
+     */\r
+    public void addPropertyListener(PropertyChangeListener listener){\r
+        propertyListeners.add(listener);\r
+    }\r
+\r
+    /**\r
+     * remove specified listener.\r
+     */\r
+    public void removePropertyListener(PropertyChangeListener listener){\r
+        propertyListeners.remove(listener);\r
+    }\r
+\r
     public void clearProperties(){\r
         properties.clear();\r
     }\r
@@ -139,7 +178,7 @@ public class BirthmarkContext{
     /**\r
      * returns the classpath context.\r
      */\r
-    public ClasspathContext getBytecodeContext(){\r
+    public ClasspathContext getClasspathContext(){\r
         return bytecodeContext;\r
     }\r
 \r
index 17a9ecd..640c071 100644 (file)
@@ -60,7 +60,7 @@ public final class Main{
         stigmata.configuration(commandLine.getOptionValue("config-file"));\r
         context = stigmata.createContext();\r
 \r
-        addClasspath(context.getBytecodeContext(), commandLine);\r
+        addClasspath(context.getClasspathContext(), commandLine);\r
 \r
         String[] birthmarks = getTargetBirthmarks(commandLine);\r
         String[] arguments = commandLine.getArgs();\r
index 2972ad6..71cda04 100644 (file)
@@ -121,7 +121,7 @@ public final class Stigmata{
     private BirthmarkSet[] extractImpl(String[] birthmarks, String[] files, BirthmarkContext context) throws IOException, BirthmarkExtractionException{\r
         List<ClassFileArchive> archives = new ArrayList<ClassFileArchive>();\r
         List<BirthmarkSet> list = new ArrayList<BirthmarkSet>();\r
-        ClasspathContext bytecode = context.getBytecodeContext();\r
+        ClasspathContext bytecode = context.getClasspathContext();\r
 \r
         for(int i = 0; i < files.length; i++){\r
             if(files[i].endsWith(".class")){\r
index d7b1fbe..bf5adda 100644 (file)
@@ -47,7 +47,7 @@ public class BirthmarkService extends AbstractBirthmarkService implements Birthm
                 c = Class.forName(extractor);\r
             }\r
             else{\r
-                c = context.getBytecodeContext().findClass(extractor);\r
+                c = context.getClasspathContext().findClass(extractor);\r
             }\r
             extractorClass = c.asSubclass(BirthmarkExtractor.class);\r
             extractorObject = null;\r
@@ -63,7 +63,7 @@ public class BirthmarkService extends AbstractBirthmarkService implements Birthm
                 c = Class.forName(comparator);\r
             }\r
             else{\r
-                c = context.getBytecodeContext().findClass(comparator);\r
+                c = context.getClasspathContext().findClass(comparator);\r
             }\r
             comparatorClass = c.asSubclass(BirthmarkComparator.class);\r
             comparatorObject = null;\r
index 247e329..a801877 100644 (file)
@@ -28,7 +28,7 @@ public class InheritanceStructureBirthmarkExtractVisitor extends BirthmarkExtrac
     public void visit(int version, int access, String name, String signature,\r
                       String superName, String[] interfaces){\r
         try {\r
-            Class c = getContext().getBytecodeContext().findClass(name.replace('/', '.'));\r
+            Class c = getContext().getClasspathContext().findClass(name.replace('/', '.'));\r
             if(c != null && !c.isInterface()){\r
                 addISBirthmark(c);\r
             }\r
index 94a68fb..162b106 100644 (file)
@@ -295,8 +295,8 @@ public class BirthmarkDefinitionPane extends JPanel{
             // check extractor/comparator classes are available\r
             try{\r
                 flag = flag\r
-                    && context.getBytecodeContext().find(extractorClass) != null\r
-                    && context.getBytecodeContext().find(comparatorClass) != null;\r
+                    && context.getClasspathContext().find(extractorClass) != null\r
+                    && context.getClasspathContext().find(comparatorClass) != null;\r
             } catch(ClassNotFoundException e){\r
                 flag = false;\r
             }\r
index 5446c65..60462ba 100644 (file)
@@ -74,7 +74,7 @@ public class ClasspathSettingsPane extends JPanel{
 \r
     private boolean findClass(String className){\r
         try{\r
-            ClasspathContext b = stigmata.getStigmata().createContext().getBytecodeContext();\r
+            ClasspathContext b = stigmata.getStigmata().createContext().getClasspathContext();\r
             ClasspathContext bytecode = new ClasspathContext(b);\r
             String[] path = classpath.getValues();\r
             for(String cp: path){\r
index e83fade..4615385 100644 (file)
@@ -10,34 +10,91 @@ import java.awt.Component;
 import javax.swing.JTable;\r
 import javax.swing.table.DefaultTableCellRenderer;\r
 \r
+import jp.naist.se.stigmata.BirthmarkContext;\r
+\r
 /**\r
- * \r
- * \r
  *\r
  * @author Haruaki TAMADA\r
  * @version $Revision$ $Date$\r
  */\r
 public class CompareTableCellRenderer extends DefaultTableCellRenderer{\r
     private static final long serialVersionUID = 234557758658567345L;\r
+    private static final double EPSILON = 1E-8d;\r
+\r
+    private BirthmarkContext context;\r
+\r
+    public CompareTableCellRenderer(BirthmarkContext context){\r
+        this.context = context;\r
+    }\r
 \r
-    public Component getTableCellRendererComponent(JTable table, Object obj,\r
-            boolean isSelected, boolean hasForcus, int row, int cols){\r
-        Object value = table.getValueAt(row, cols);\r
-        Component c = super.getTableCellRendererComponent(table, obj, isSelected, hasForcus,\r
-                row, cols);\r
+    public Component getTableCellRendererComponent(JTable table, Object obj, boolean isSelected,\r
+                                                    boolean hasForcus, int row, int col){\r
+        Object value = table.getValueAt(row, col);\r
+        Component c = super.getTableCellRendererComponent(\r
+            table, obj, isSelected, hasForcus, row, col\r
+        );\r
         if(value instanceof Double && !isSelected){\r
             double d = ((Double)value).doubleValue();\r
-            if(Math.abs(d - 1) < 1E-8){\r
-                c.setBackground(Color.red);\r
-            }\r
-            else{\r
-                c.setBackground(Color.white);\r
-            }\r
-            float ratio = Math.round(d * 10) / 10f;\r
-            int color = Math.round(255 - (200 * ratio));\r
-            c.setForeground(new Color(color, color, color));\r
+            int rank = 0;\r
+            if(d < EPSILON)       rank = 0;\r
+            else if((d - 0.2d) < EPSILON) rank = 1;\r
+            else if((d - 0.4d) < EPSILON) rank = 2;\r
+            else if((d - 0.6d) < EPSILON) rank = 3;\r
+            else if((d - 0.8d) < EPSILON) rank = 4;\r
+            else if((d - 1.0d) < EPSILON) rank = 5;\r
+\r
+            c.setBackground(getBackgroundColor(rank, context));\r
+            c.setForeground(getForegroundColor(rank, context));\r
         }\r
 \r
         return c;\r
     }\r
+\r
+    public static Color getDefaultForegroundColor(int rank){\r
+        int c = 180 - ((180 / 5) * rank);\r
+        return new Color(c, c, c);\r
+    }\r
+\r
+    public static Color getDefaultBackgroundColor(int rank){\r
+        Color c;\r
+        switch(rank){\r
+        case 5:\r
+            c = Color.RED;\r
+            break;\r
+        case 0: case 1: case 2: case 3: case 4:\r
+        default:\r
+            c = Color.WHITE;\r
+            break;\r
+        }\r
+        return c;\r
+    }\r
+\r
+    public static Color getBackgroundColor(int rank, BirthmarkContext context){\r
+        Color c = getColor("backcolor_" + rank, context);\r
+        if(c == null){\r
+            return getDefaultBackgroundColor(rank);\r
+        }\r
+        return c;\r
+    }\r
+\r
+    public static Color getForegroundColor(int rank, BirthmarkContext context){\r
+        Color c = getColor("forecolor_" + rank, context);\r
+        if(c == null){\r
+            c = getDefaultForegroundColor(rank);\r
+        }\r
+        return c;\r
+    }\r
+\r
+    private static Color getColor(String key, BirthmarkContext context){\r
+        String v = context.getProperty(key);\r
+        try{\r
+            int color = Integer.parseInt(v, 16);\r
+\r
+            return new Color(\r
+                (color >>> 16) & 0xff, (color >>> 8) & 0xff, color & 0xff\r
+            );\r
+        } catch(NumberFormatException e){\r
+            return null;\r
+        }\r
+    }\r
 }
\ No newline at end of file
index 2194953..0a5630a 100644 (file)
@@ -286,7 +286,7 @@ public class ControlPane extends JPanel{
     private BirthmarkContext generateContext(){\r
         BirthmarkContext context = stigmata.getStigmata().createContext();\r
         // BirthmarkContext context2 = stigmata.getContext();\r
-        ClasspathContext bytecode = context.getBytecodeContext();\r
+        ClasspathContext bytecode = context.getClasspathContext();\r
         WellknownClassManager manager = context.getWellknownClassManager();\r
 \r
         classpath.updateClasspathContext(bytecode);\r
index ee862e1..6c6c2b8 100644 (file)
@@ -9,7 +9,6 @@ import java.io.File;
 import java.text.MessageFormat;\r
 \r
 import javax.swing.JFileChooser;\r
-import javax.swing.JOptionPane;\r
 import javax.swing.SwingUtilities;\r
 import javax.swing.filechooser.FileFilter;\r
 \r
@@ -31,25 +30,26 @@ public class FileIOManager{
         return currentDirectory;\r
     }\r
 \r
-    public void setCurrentDirectory(File directory){\r
+    public void setCurrentDirectory(File directory) throws IllegalArgumentException{\r
         if(!directory.isDirectory()){\r
-            JOptionPane.showMessageDialog(\r
-                parent, \r
-                Messages.getString("notdirectory.dialog.message", directory.getName()),\r
-                Messages.getString("notdirectory.dialog.title"),\r
-                JOptionPane.ERROR_MESSAGE\r
-            );\r
-            return;\r
+            throw new IllegalArgumentException(directory.getName() + " is not directory");\r
         }\r
         this.currentDirectory = directory;\r
     }\r
 \r
+    public File findFile(boolean open){\r
+        return findFile(open, new String[0], "");\r
+    }\r
+\r
     public File findFile(boolean open, String[] exts, String desc){\r
         JFileChooser chooser = new JFileChooser(getCurrentDirectory());\r
-        for(int i = 0; i < exts.length; i++){\r
-            chooser.addChoosableFileFilter(\r
-                new ExtensionFilter(exts[i], MessageFormat.format(desc, exts[i]))\r
-            );\r
+        if(exts != null){\r
+            MessageFormat formatter = new MessageFormat(desc);\r
+            for(int i = 0; i < exts.length; i++){\r
+                chooser.addChoosableFileFilter(\r
+                    new ExtensionFilter(exts[i], formatter.format(exts[i]))\r
+                );\r
+            }\r
         }\r
         int returnValue = -1;\r
         if(open){\r
index 578a4eb..809a5e3 100644 (file)
@@ -35,6 +35,7 @@ import jp.naist.se.stigmata.ComparisonResultSet;
 import jp.naist.se.stigmata.format.FormatManager;\r
 import jp.naist.se.stigmata.spi.ResultFormatSpi;\r
 import jp.naist.se.stigmata.ui.swing.actions.SaveAction;\r
+import jp.naist.se.stigmata.ui.swing.actions.UpdateBirthmarkCellColorAction;\r
 \r
 /**\r
  * \r
@@ -138,6 +139,9 @@ public class PairComparisonResultSetPane extends JPanel{
                 }\r
             })\r
         );\r
+        JButton updateColorButton = Utility.createButton(\r
+            "updatecellcolor", new UpdateBirthmarkCellColorAction(this, context)\r
+        );\r
         JButton obfuscateButton = Utility.createButton("obfuscate");\r
         JScrollPane scroll = new JScrollPane();\r
         averageLabel = new JLabel(Double.toString(average), JLabel.RIGHT);\r
@@ -145,7 +149,7 @@ public class PairComparisonResultSetPane extends JPanel{
         minimumLabel = new JLabel(Double.toString(minimum), JLabel.RIGHT);\r
 \r
         scroll.setViewportView(table);\r
-        table.setDefaultRenderer(Double.class, new CompareTableCellRenderer());\r
+        table.setDefaultRenderer(Double.class, new CompareTableCellRenderer(context));\r
         similarityPane.setBorder(new TitledBorder(Messages.getString("similarity.border")));\r
         averageLabel.setBorder(new TitledBorder(Messages.getString("average.border")));\r
         maximumLabel.setBorder(new TitledBorder(Messages.getString("maximum.border")));\r
@@ -162,6 +166,8 @@ public class PairComparisonResultSetPane extends JPanel{
         buttonPanel.add(Box.createHorizontalGlue());\r
         buttonPanel.add(saveButton);\r
         buttonPanel.add(Box.createHorizontalGlue());\r
+        buttonPanel.add(updateColorButton);\r
+        buttonPanel.add(Box.createHorizontalGlue());\r
         buttonPanel.add(obfuscateButton);\r
         buttonPanel.add(Box.createHorizontalGlue());\r
 \r
index 13d165f..2242b92 100644 (file)
@@ -10,6 +10,8 @@ import java.awt.GridBagLayout;
 import java.awt.Insets;\r
 import java.awt.event.ActionEvent;\r
 import java.awt.event.ActionListener;\r
+import java.beans.PropertyChangeEvent;\r
+import java.beans.PropertyChangeListener;\r
 import java.util.Iterator;\r
 \r
 import javax.swing.Box;\r
@@ -58,12 +60,51 @@ public class PropertyEditPane extends JPanel{
 \r
     private void initData(){\r
         BirthmarkContext context = stigmata.getContext();\r
+        context.addPropertyListener(new PropertyChangeListener(){\r
+            public void propertyChange(PropertyChangeEvent evt){\r
+                String name = evt.getPropertyName();\r
+                String value = (String)evt.getNewValue();\r
+                if(value == null){\r
+                    removeProperty(name);\r
+                }\r
+                else{\r
+                    addOrUpdateProperty(name, value);\r
+                }\r
+            }\r
+        });\r
         for(Iterator<String> i = context.propertyKeys(); i.hasNext(); ){\r
             String key = i.next();\r
             model.addRow(new Object[] { key, context.getProperty(key), });\r
         }\r
     }\r
 \r
+    private void removeProperty(String name){\r
+        int index = findIndex(name);\r
+        if(index >= 0){\r
+            model.removeRow(index);\r
+        }\r
+    }\r
+\r
+    private void addOrUpdateProperty(String name, String value){\r
+        int index = findIndex(name);\r
+        if(index >= 0){\r
+            model.setValueAt(value, index, 1);\r
+        }\r
+        else{\r
+            model.addRow(new Object[] { name, value, });\r
+        }\r
+    }\r
+\r
+    private int findIndex(String name){\r
+        for(int i = 0; i < model.getRowCount(); i++){\r
+            String v = (String)model.getValueAt(i, 0);\r
+            if(v.equals(name)){\r
+                return i;\r
+            }\r
+        }\r
+        return -1;\r
+    }\r
+\r
     private void addNewProperty(){\r
         GridBagLayout layout = new GridBagLayout();\r
         JPanel panel = new JPanel(layout);\r
index 7982e22..54b1146 100644 (file)
@@ -43,6 +43,7 @@ import jp.naist.se.stigmata.filter.FilteredComparisonResultSet;
 import jp.naist.se.stigmata.format.FormatManager;\r
 import jp.naist.se.stigmata.spi.ResultFormatSpi;\r
 import jp.naist.se.stigmata.ui.swing.actions.SaveAction;\r
+import jp.naist.se.stigmata.ui.swing.actions.UpdateBirthmarkCellColorAction;\r
 \r
 /**\r
  * \r
@@ -136,7 +137,7 @@ public class RoundRobinComparisonResultPane extends JPanel{
 \r
         model = new RoundRobinComparisonResultSetTableModel();\r
         table = new JTable(model);\r
-        table.setDefaultRenderer(Double.class, new CompareTableCellRenderer());\r
+        table.setDefaultRenderer(Double.class, new CompareTableCellRenderer(context));\r
         table.addMouseListener(new MouseAdapter(){\r
             public void mouseClicked(MouseEvent e){\r
                 if(e.getClickCount() == 2){\r
@@ -165,7 +166,7 @@ public class RoundRobinComparisonResultPane extends JPanel{
         box1.add(distinctionRatio = new JLabel());\r
         south.add(box1);\r
         JPanel box2 = new JPanel(new GridLayout(1, 3));\r
-        box2.setBorder(new TitledBorder(Messages.getString("similarity.border"))); //$NON-NLS-1$\r
+        box2.setBorder(new TitledBorder(Messages.getString("similarity.border")));\r
         box2.add(average = new JLabel());\r
         box2.add(minimum = new JLabel());\r
         box2.add(maximum = new JLabel());\r
@@ -239,6 +240,9 @@ public class RoundRobinComparisonResultPane extends JPanel{
         JButton graph = Utility.createButton("showgraph");\r
         JButton obfuscate = Utility.createButton("obfuscate");\r
         JButton compare = Utility.createButton("guessedpair");\r
+        JButton updateColor = Utility.createButton(\r
+            "updatecellcolor", new UpdateBirthmarkCellColorAction(this, context)\r
+        );\r
         JMenuItem mdsMenu = Utility.createJMenuItem("mdsmap");\r
 \r
         PopupButton comparePopup = new PopupButton(compare);\r
@@ -252,6 +256,8 @@ public class RoundRobinComparisonResultPane extends JPanel{
         southPanel.add(Box.createHorizontalGlue());\r
         southPanel.add(save);\r
         southPanel.add(Box.createHorizontalGlue());\r
+        southPanel.add(updateColor);\r
+        southPanel.add(Box.createHorizontalGlue());\r
         southPanel.add(graphPopup);\r
         southPanel.add(Box.createHorizontalGlue());\r
         southPanel.add(obfuscate);\r
index 7fcba6c..2b37ac6 100644 (file)
@@ -13,9 +13,7 @@ import java.io.FileReader;
 import java.io.IOException;\r
 import java.io.PrintWriter;\r
 import java.io.StringWriter;\r
-import java.util.ArrayList;\r
 import java.util.HashMap;\r
-import java.util.List;\r
 import java.util.Map;\r
 \r
 import javax.swing.JCheckBoxMenuItem;\r
@@ -61,7 +59,6 @@ import jp.naist.se.stigmata.ui.swing.tab.EditableTabbedPane;
 public class StigmataFrame extends JFrame implements CurrentDirectoryHolder{\r
     private static final long serialVersionUID = 92345543665342134L;\r
 \r
-    private static List<JFrame> frameList = new ArrayList<JFrame>();\r
     private JTabbedPane tabPane;\r
     private JMenuItem closeTabMenu;\r
     private JCheckBoxMenuItem expertmodeMenu;\r
@@ -69,12 +66,7 @@ public class StigmataFrame extends JFrame implements CurrentDirectoryHolder{
     private BirthmarkContext context;\r
     private ControlPane control;\r
     private FileIOManager fileio;\r
-    private int extractCount = 0;\r
-    private int compareCount = 0;\r
-    private int compareDetail = 0;\r
-    private int similarityGraphCount = 0;\r
-    private int mappingGraphCount = 0;\r
-    private int comparePair = 0;\r
+    private Map<String, Integer> countmap = new HashMap<String, Integer>();\r
 \r
     public StigmataFrame(){\r
         stigmata = Stigmata.getInstance();\r
@@ -109,7 +101,18 @@ public class StigmataFrame extends JFrame implements CurrentDirectoryHolder{
     }\r
 \r
     public void setCurrentDirectory(File file){\r
-        fileio.setCurrentDirectory(file);\r
+        try{\r
+            fileio.setCurrentDirectory(file);\r
+        } catch(IllegalArgumentException e){\r
+            JOptionPane.showMessageDialog(\r
+                this,\r
+                Messages.getString("notdirectory.dialog.message", file.getName()),\r
+                Messages.getString("notdirectory.dialog.title"),\r
+                JOptionPane.ERROR_MESSAGE\r
+            );\r
+        } catch(Exception e){\r
+            showExceptionMessage(e);\r
+        }\r
     }\r
 \r
     /**\r
@@ -139,7 +142,7 @@ public class StigmataFrame extends JFrame implements CurrentDirectoryHolder{
         PairComparisonPane detail = new PairComparisonPane(\r
             this, new ComparisonPair(target1, target2, context)\r
         );\r
-        compareDetail++;\r
+        int compareDetail = getNextCount("compare_detail");\r
 \r
         Utility.addNewTab("comparedetail", tabPane, detail,\r
             new Object[] { new Integer(compareDetail), },\r
@@ -159,7 +162,7 @@ public class StigmataFrame extends JFrame implements CurrentDirectoryHolder{
             BirthmarkSet[] y = stigmata.extract(birthmarks, targetY, context);\r
 \r
             RoundRobinComparisonResultPane compare = new RoundRobinComparisonResultPane(this, context, x, y);\r
-            compareCount++;\r
+            int compareCount = getNextCount("compare");\r
             Utility.addNewTab(\r
                 "compare", tabPane, compare,\r
                 new Object[] { new Integer(compareCount), },\r
@@ -184,7 +187,7 @@ public class StigmataFrame extends JFrame implements CurrentDirectoryHolder{
 \r
             ComparisonResultSet resultset = stigmata.compare(x, y, context);\r
             FilteredComparisonResultSet fcrs = new FilteredComparisonResultSet(resultset, filters);\r
-            compareCount++;\r
+            int compareCount = getNextCount("compare");\r
             Utility.addNewTab(\r
                 "compare", tabPane, new PairComparisonResultSetPane(this, fcrs),\r
                 new Object[] { new Integer(compareCount), },\r
@@ -205,7 +208,7 @@ public class StigmataFrame extends JFrame implements CurrentDirectoryHolder{
         try{\r
             BirthmarkSet[] x = stigmata.extract(birthmarks, targetX, context);\r
             BirthmarkSet[] y = stigmata.extract(birthmarks, targetY, context);\r
-            comparePair++;\r
+            int comparePair = getNextCount("compare_pair");\r
 \r
             ComparisonResultSet resultset = new CertainPairComparisonResultSet(x, y, context);\r
             Utility.addNewTab("comparepair", tabPane,\r
@@ -234,7 +237,7 @@ public class StigmataFrame extends JFrame implements CurrentDirectoryHolder{
             try{\r
                 BirthmarkSet[] x = stigmata.extract(birthmarks, targetX, context);\r
                 BirthmarkSet[] y = stigmata.extract(birthmarks, targetY, context);\r
-                comparePair++;\r
+                int comparePair = getNextCount("compare_pair");\r
                 ComparisonResultSet resultset = new CertainPairComparisonResultSet(x, y, mapping, context);\r
 \r
                 Utility.addNewTab(\r
@@ -255,7 +258,7 @@ public class StigmataFrame extends JFrame implements CurrentDirectoryHolder{
     }\r
 \r
     public void showComparisonResultSet(ComparisonResultSet resultset){\r
-        comparePair++;\r
+        int comparePair = getNextCount("compare_pair");\r
         Utility.addNewTab(\r
             "comparisonresultset", tabPane,\r
             new PairComparisonResultSetPane(this, resultset),\r
@@ -265,22 +268,26 @@ public class StigmataFrame extends JFrame implements CurrentDirectoryHolder{
     }\r
 \r
     public void showMDSGraph(BirthmarkSet[] set){\r
-        MDSGraphPanel panel = new MDSGraphPanel(this, set, context);\r
-        mappingGraphCount++;\r
-        Utility.addNewTab("mappinggraph", tabPane, panel, new Object[] { new Integer(mappingGraphCount), }, null);\r
-        tabPane.setSelectedIndex(tabPane.getTabCount() - 1);\r
+        try{\r
+            MDSGraphPanel panel = new MDSGraphPanel(this, set, context);\r
+            int mappingGraphCount = getNextCount("mds_graph");\r
+            Utility.addNewTab("mappinggraph", tabPane, panel, new Object[] { new Integer(mappingGraphCount), }, null);\r
+            tabPane.setSelectedIndex(tabPane.getTabCount() - 1);\r
+        } catch(Exception e){\r
+            showExceptionMessage(e);\r
+        }\r
     }\r
 \r
     public void showSimilarityDistributionGraph(Map<Integer, Integer> distributions){\r
         SimilarityDistributionGraphPane graph = new SimilarityDistributionGraphPane(this, distributions);\r
 \r
-        similarityGraphCount++;\r
+        int similarityGraphCount = getNextCount("similarity_graph");\r
         Utility.addNewTab("similaritygraph", tabPane, graph, new Object[] { new Integer(similarityGraphCount), }, null);\r
         tabPane.setSelectedIndex(tabPane.getTabCount() - 1);\r
     }\r
 \r
     public void showExtractionResult(BirthmarkSet[] set, BirthmarkContext context){\r
-        extractCount++;\r
+        int extractCount = getNextCount("extract");\r
         BirthmarkExtractionResultPane viewer = new BirthmarkExtractionResultPane(this, context, set);\r
         Utility.addNewTab(\r
             "extract", tabPane, viewer,\r
@@ -338,7 +345,6 @@ public class StigmataFrame extends JFrame implements CurrentDirectoryHolder{
         tabPane.setSelectedIndex(tabPane.getTabCount() - 1);\r
 \r
         setSize(900, 600);\r
-        frameList.add(this);\r
     }\r
 \r
     private void initComponents(){\r
@@ -381,7 +387,8 @@ public class StigmataFrame extends JFrame implements CurrentDirectoryHolder{
 \r
         newFrameMenu.addActionListener(new ActionListener(){\r
             public void actionPerformed(ActionEvent evt){\r
-                newFrameMenuActionPerformed(evt);\r
+                StigmataFrame frame = new StigmataFrame(stigmata, context);\r
+                frame.setVisible(true);\r
             }\r
         });\r
         exportMenu.addActionListener(new ActionListener(){\r
@@ -398,7 +405,8 @@ public class StigmataFrame extends JFrame implements CurrentDirectoryHolder{
 \r
         closeMenu.addActionListener(new ActionListener(){\r
             public void actionPerformed(ActionEvent evt){\r
-                closeMenuActionPerformed(evt);\r
+                setVisible(false);\r
+                dispose();\r
             }\r
         });\r
 \r
@@ -516,18 +524,13 @@ public class StigmataFrame extends JFrame implements CurrentDirectoryHolder{
         }\r
     }\r
 \r
-    private void closeMenuActionPerformed(ActionEvent evt){\r
-        setVisible(false);\r
-        dispose();\r
-\r
-        frameList.remove(this);\r
-        if(frameList.size() == 0){\r
-            System.exit(1);\r
+    private int getNextCount(String label){\r
+        Integer i = countmap.get(label);\r
+        if(i == null){\r
+            i = new Integer(0);\r
         }\r
-    }\r
-\r
-    private void newFrameMenuActionPerformed(ActionEvent evt){\r
-        StigmataFrame frame = new StigmataFrame(stigmata, context);\r
-        frame.setVisible(true);\r
+        i = i + 1;\r
+        countmap.put(label, i);\r
+        return i;\r
     }\r
 }\r
diff --git a/src/main/java/jp/naist/se/stigmata/ui/swing/actions/UpdateBirthmarkCellColorAction.java b/src/main/java/jp/naist/se/stigmata/ui/swing/actions/UpdateBirthmarkCellColorAction.java
new file mode 100755 (executable)
index 0000000..3cd1d9c
--- /dev/null
@@ -0,0 +1,134 @@
+package jp.naist.se.stigmata.ui.swing.actions;\r
+\r
+import java.awt.Color;\r
+import java.awt.Component;\r
+import java.awt.GridLayout;\r
+import java.awt.event.ActionEvent;\r
+import java.awt.event.ActionListener;\r
+\r
+import javax.swing.AbstractAction;\r
+import javax.swing.Box;\r
+import javax.swing.JButton;\r
+import javax.swing.JColorChooser;\r
+import javax.swing.JComponent;\r
+import javax.swing.JLabel;\r
+import javax.swing.JOptionPane;\r
+import javax.swing.JPanel;\r
+\r
+import jp.naist.se.stigmata.BirthmarkContext;\r
+import jp.naist.se.stigmata.ui.swing.CompareTableCellRenderer;\r
+import jp.naist.se.stigmata.ui.swing.Messages;\r
+import jp.naist.se.stigmata.ui.swing.Utility;\r
+\r
+public class UpdateBirthmarkCellColorAction extends AbstractAction{\r
+    private static final long serialVersionUID = 2390797591047570440L;\r
+\r
+    private Component parent;\r
+    private BirthmarkContext context;\r
+    private JColorChooser chooser;\r
+\r
+    public UpdateBirthmarkCellColorAction(Component parent, BirthmarkContext context){\r
+        this.parent = parent;\r
+        this.context = context;\r
+    }\r
+\r
+    public UpdateBirthmarkCellColorAction(Component parent){\r
+        this(parent, BirthmarkContext.getDefaultContext());\r
+    }\r
+\r
+    public void actionPerformed(ActionEvent e){\r
+        JComponent c = createPanel();\r
+        JOptionPane.showMessageDialog(\r
+            parent, c, Messages.getString("updatecellcolor.dialog.title"),\r
+            JOptionPane.INFORMATION_MESSAGE\r
+        );\r
+    }\r
+\r
+    private JComponent createPanel(){\r
+        Box panel = Box.createVerticalBox();\r
+        for(int i = 0; i <= 5; i++){\r
+            Color fore = CompareTableCellRenderer.getForegroundColor(i, context);\r
+            Color back = CompareTableCellRenderer.getBackgroundColor(i, context);\r
+\r
+            UpdateColorPane pane = new UpdateColorPane(i, fore, back);\r
+            panel.add(pane);\r
+        }\r
+\r
+        return panel;\r
+    }\r
+\r
+    private Color updateColor(Color c, int rank, boolean foreground){\r
+        if(chooser == null){\r
+            chooser = new JColorChooser();\r
+        }\r
+        chooser.setColor(c);\r
+        String l = Messages.getString((foreground? "forecolor_": "backcolor_") + rank + ".label");\r
+        int returnValue = JOptionPane.showConfirmDialog(\r
+            parent, chooser, Messages.getString("updatecell.title", l),\r
+            JOptionPane.INFORMATION_MESSAGE\r
+        );\r
+        if(returnValue == JOptionPane.OK_OPTION){\r
+            c = chooser.getColor();\r
+        }\r
+\r
+        return c;\r
+    }\r
+\r
+    private class UpdateColorPane extends JPanel{\r
+        private static final long serialVersionUID = 8271684478406307685L;\r
+\r
+        private int rank;\r
+        private JLabel label;\r
+\r
+        public UpdateColorPane(int rank, Color fore, Color back){\r
+            this.rank = rank;\r
+            initLayouts();\r
+\r
+            label.setForeground(fore);\r
+            label.setBackground(back);\r
+        }\r
+\r
+        public int getRank(){\r
+            return rank;\r
+        }\r
+\r
+        private void initLayouts(){\r
+            label = new JLabel(Messages.getString("rank_" + rank + ".label"));\r
+            label.setOpaque(true);\r
+            JButton fore = Utility.createButton("updatecellfore");\r
+            JButton back = Utility.createButton("updatecellback");\r
+\r
+            ActionListener listener = new ActionListener(){\r
+                public void actionPerformed(ActionEvent e){\r
+                    String command = e.getActionCommand();\r
+                    boolean foreground = command.equals("updatecellfore");\r
+\r
+                    Color c = label.getBackground();\r
+                    if(foreground){\r
+                        c = label.getForeground();\r
+                    }\r
+                    c = updateColor(c, getRank(), foreground);\r
+                    if(foreground){\r
+                        label.setForeground(c);\r
+                        context.addProperty(\r
+                            "forecolor_" + getRank(), String.format("%06x", c.getRGB() & 0xffffff)\r
+                        );\r
+                    }\r
+                    else{\r
+                        label.setBackground(c);\r
+                        context.addProperty(\r
+                            "backcolor_" + getRank(), String.format("%06x", c.getRGB() & 0xffffff)\r
+                        );\r
+                    }\r
+                }\r
+            };\r
+            fore.addActionListener(listener);\r
+            back.addActionListener(listener);\r
+\r
+            setLayout(new GridLayout(1, 3));\r
+            add(label);\r
+            add(fore);\r
+            add(back);\r
+        }\r
+    }\r
+}\r
index d904e92..d2e2381 100644 (file)
@@ -63,7 +63,7 @@ public class ConfigFileExporter{
 \r
     private void exportClasspath(PrintWriter out) throws IOException{\r
         out.println("  <classpath-list>");\r
-        for(URL location: context.getBytecodeContext()){\r
+        for(URL location: context.getClasspathContext()){\r
             out.printf("    <classpath>%s</classpath>%n", location.toString());\r
         }\r
         out.println("  </classpath-list>");\r
index 8fc1168..7fda4b0 100644 (file)
@@ -173,7 +173,7 @@ public class ConfigFileImporter{
                 }\r
                 else if(part == Part.CLASSPATH && qname.equals("classpath")){\r
                     try{\r
-                        context.getBytecodeContext().addClasspath(\r
+                        context.getClasspathContext().addClasspath(\r
                                 new URL(value));\r
                     }catch(MalformedURLException e){\r
                         throw new SAXException(e);\r
index 699807a..5edbb26 100755 (executable)
@@ -492,3 +492,42 @@ both.button.label=${target.BOTH} birthmarks
 target1.name.button.label=${target.TARGET1} class name\r
 target2.name.button.label=${target.TARGET2} class name\r
 both.name.button.label=${target.BOTH} class name\r
+\r
+################################################\r
+# update table cell color\r
+################################################\r
+\r
+updatecellcolor.button.label=Update Cell Color\r
+updatecellcolor.button.tooltip=Update table cell colors\r
+updatecellcolor.button.icon=color_swatch.png\r
+\r
+updatecellcolor.dialog.title=Update Color\r
+updatecellfore.button.label=Foreground...\r
+updatecellfore.button.tooltip=Update foreground color\r
+updatecellfore.button.icon=color_swatch.png\r
+updatecellback.button.label=Background...\r
+updatecellback.button.tooltip=Update background color\r
+updatecellback.button.icon=color_swatch.png\r
+\r
+forecolor_0.label=Foreground (similarity=0)\r
+backcolor_0.label=Background (similarity=0)\r
+forecolor_1.label=Foreground (0 < similarity <= 0.2)\r
+backcolor_1.label=Background (0 < similarity <= 0.2)\r
+forecolor_2.label=Foreground (0.2 < similarity <= 0.4)\r
+backcolor_2.label=Background (0.2 < similarity <= 0.4)\r
+forecolor_3.label=Foreground (0.4 < similarity <= 0.6)\r
+backcolor_3.label=Background (0.4 < similarity <= 0.6)\r
+forecolor_4.label=Foreground (0.6 < similarity <= 0.8)\r
+backcolor_4.label=Background (0.6 < similarity <= 0.8)\r
+forecolor_5.label=Foreground (0.8 < similarity <= 1.0)\r
+backcolor_5.label=Background (0.8 < similarity <= 1.0)\r
+\r
+updatecell.title=Update Color ({0})\r
+\r
+rank_0.label=Similarity: 0.0\r
+rank_1.label=Similarity: (0.0, 0.2]\r
+rank_2.label=Similarity: (0.2, 0.4]\r
+rank_3.label=Similarity: (0.4, 0.6]\r
+rank_4.label=Similarity: (0.6, 0.8]\r
+rank_5.label=Similarity: (0.8, 1.0]\r
+\r
index 588348c..584ee5b 100755 (executable)
@@ -387,3 +387,39 @@ both.button.label=${target.BOTH}
 target1.name.button.label=${target.TARGET1}\83N\83\89\83X\96¼\r
 target2.name.button.label=${target.TARGET2}\83N\83\89\83X\96¼\r
 both.name.button.label=${target.BOTH}\83N\83\89\83X\96¼\r
+\r
+################################################\r
+# update table cell color\r
+################################################\r
+\r
+updatecellcolor.button.label=\83Z\83\8b\90F\95Ï\8dX...\r
+updatecellcolor.button.tooltip=\95\\82Ì\83Z\83\8b\90F\82ð\95Ï\8dX\82µ\82Ü\82·\81D\r
+\r
+updatecellcolor.dialog.title=\90F\82Ì\95Ï\8dX\r
+updatecellfore.button.label=\95\8e\9a\90F...\r
+updatecellfore.button.tooltip=\95\8e\9a\90F\82ð\95Ï\8dX\82µ\82Ü\82·\81D\r
+updatecellback.button.label=\94w\8ci\90F...\r
+updatecellback.button.tooltip=\94w\8ci\90F\82ð\95Ï\8dX\82µ\82Ü\82·\81D\r
+\r
+forecolor_0.label=\95\8e\9a\90F (\97Þ\8e\97\93x=0)\r
+backcolor_0.label=\94w\8ci\90F (\97Þ\8e\97\93x=0)\r
+forecolor_1.label=\95\8e\9a\90F (0 < \97Þ\8e\97\93x <= 0.2)\r
+backcolor_1.label=\94w\8ci\90F (0 < \97Þ\8e\97\93x <= 0.2)\r
+forecolor_2.label=\95\8e\9a\90F (0.2 < \97Þ\8e\97\93x <= 0.4)\r
+backcolor_2.label=\94w\8ci\90F (0.2 < \97Þ\8e\97\93x <= 0.4)\r
+forecolor_3.label=\95\8e\9a\90F (0.4 < \97Þ\8e\97\93x <= 0.6)\r
+backcolor_3.label=\94w\8ci\90F (0.4 < \97Þ\8e\97\93x <= 0.6)\r
+forecolor_4.label=\95\8e\9a\90F (0.6 < \97Þ\8e\97\93x <= 0.8)\r
+backcolor_4.label=\94w\8ci\90F (0.6 < \97Þ\8e\97\93x <= 0.8)\r
+forecolor_5.label=\95\8e\9a\90F (0.8 < \97Þ\8e\97\93x <= 1.0)\r
+backcolor_5.label=\94w\8ci\90F (0.8 < \97Þ\8e\97\93x <= 1.0)\r
+\r
+updatecell.title=\90F\82Ì\8dX\90V ({0})\r
+\r
+rank_0.label=\97Þ\8e\97\93x: 0.0\r
+rank_1.label=\97Þ\8e\97\93x: (0.0, 0.2]\r
+rank_2.label=\97Þ\8e\97\93x: (0.2, 0.4]\r
+rank_3.label=\97Þ\8e\97\93x: (0.4, 0.6]\r
+rank_4.label=\97Þ\8e\97\93x: (0.6, 0.8]\r
+rank_5.label=\97Þ\8e\97\93x: (0.8, 1.0]\r
+\r