OSDN Git Service

add history viewer
authortama3 <tama3@acee48c3-7b26-0410-bdac-b3d0e5314bbc>
Wed, 10 Oct 2007 08:45:20 +0000 (08:45 +0000)
committertama3 <tama3@acee48c3-7b26-0410-bdac-b3d0e5314bbc>
Wed, 10 Oct 2007 08:45:20 +0000 (08:45 +0000)
git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/stigmata/trunk@247 acee48c3-7b26-0410-bdac-b3d0e5314bbc

37 files changed:
pom.xml
src/main/java/jp/naist/se/stigmata/BirthmarkEnvironment.java
src/main/java/jp/naist/se/stigmata/result/AbstractExtractionResultSet.java
src/main/java/jp/naist/se/stigmata/result/XmlFileExtractionResultSet.java
src/main/java/jp/naist/se/stigmata/result/history/ExtractedBirthmarkHistory.java [new file with mode: 0755]
src/main/java/jp/naist/se/stigmata/result/history/ExtractedBirthmarkHistoryManager.java [new file with mode: 0755]
src/main/java/jp/naist/se/stigmata/result/history/XmlFileExtractedBirthmarkHistory.java [new file with mode: 0755]
src/main/java/jp/naist/se/stigmata/ui/swing/BirthmarkDefinitionPane.java
src/main/java/jp/naist/se/stigmata/ui/swing/BirthmarkExtractionResultPane.java
src/main/java/jp/naist/se/stigmata/ui/swing/BirthmarkSelectionCheckSetPane.java
src/main/java/jp/naist/se/stigmata/ui/swing/BirthmarkSelectionListPane.java
src/main/java/jp/naist/se/stigmata/ui/swing/ClasspathSettingsPane.java
src/main/java/jp/naist/se/stigmata/ui/swing/ControlPane.java
src/main/java/jp/naist/se/stigmata/ui/swing/ExtractedHistoryPane.java [new file with mode: 0755]
src/main/java/jp/naist/se/stigmata/ui/swing/FilterManagementPane.java
src/main/java/jp/naist/se/stigmata/ui/swing/GUIUtility.java [moved from src/main/java/jp/naist/se/stigmata/ui/swing/Utility.java with 91% similarity]
src/main/java/jp/naist/se/stigmata/ui/swing/PairComparisonPane.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/TargetSelectionPane.java
src/main/java/jp/naist/se/stigmata/ui/swing/WellknownClassesSettingsPane.java
src/main/java/jp/naist/se/stigmata/ui/swing/actions/AboutAction.java
src/main/java/jp/naist/se/stigmata/ui/swing/actions/ChangeColorAction.java
src/main/java/jp/naist/se/stigmata/ui/swing/actions/LicenseAction.java
src/main/java/jp/naist/se/stigmata/ui/swing/actions/UpdateBirthmarkCellColorAction.java
src/main/java/jp/naist/se/stigmata/ui/swing/filter/FilterEditingPane.java
src/main/java/jp/naist/se/stigmata/ui/swing/filter/FilterSetDefinitionPane.java
src/main/java/jp/naist/se/stigmata/ui/swing/graph/SimilarityDistributionGraphPane.java
src/main/java/jp/naist/se/stigmata/ui/swing/mds/MDSGraphPanel.java
src/main/java/jp/naist/se/stigmata/utils/Utility.java [new file with mode: 0755]
src/main/resources/resources/images/database_delete.png [new file with mode: 0755]
src/main/resources/resources/images/database_go.png [new file with mode: 0755]
src/main/resources/resources/images/database_refresh.png [new file with mode: 0755]
src/main/resources/resources/messages.properties
src/main/resources/resources/messages_ja.source

diff --git a/pom.xml b/pom.xml
index 16b4035..629a5f8 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.2.0-SNAPSHOT</version>
+  <version>1.2.0</version>
   <name>stigmata</name>
   <description>Java birthmark toolkit</description>
   <url>http://stigmata.sourceforge.jp/</url>
index c9711f1..6f32a99 100644 (file)
@@ -109,7 +109,10 @@ public class BirthmarkEnvironment{
 \r
     public static synchronized final String getStigmataHome(){\r
         if(HOME_DIRECTORY_PATH == null){\r
-            String stigmataHome = System.getenv("STIGMATA_HOME");\r
+            String stigmataHome = System.getProperty("stigmata.home");\r
+            if(stigmataHome == null){\r
+                stigmataHome = System.getenv("STIGMATA_HOME");\r
+            }\r
             if(stigmataHome == null){\r
                 String parent = System.getenv("HOME");\r
                 if(parent == null){\r
@@ -118,6 +121,7 @@ public class BirthmarkEnvironment{
                 if(parent == null){\r
                     parent = ".";\r
                 }\r
+                // for windows\r
                 if(parent.startsWith("C:\\Document and Settings\\")){\r
                     stigmataHome = parent + File.separator + "Application Data" + File.separator + "stigmata";\r
                 }\r
index 91cf545..8ad66af 100755 (executable)
@@ -40,10 +40,16 @@ public abstract class AbstractExtractionResultSet implements ExtractionResultSet
         this.context = context;\r
     }\r
 \r
+    /**\r
+     * returns a birthmark environment.\r
+     */\r
     public BirthmarkEnvironment getEnvironment(){\r
         return context.getEnvironment();\r
     }\r
 \r
+    /**\r
+     * returns a birthmark context.\r
+     */\r
     public BirthmarkContext getContext(){\r
         return context;\r
     }\r
@@ -58,42 +64,79 @@ public abstract class AbstractExtractionResultSet implements ExtractionResultSet
 \r
     public abstract Iterator<BirthmarkSet> birthmarkSets(ExtractionTarget target);\r
 \r
+    /**\r
+     * returns the sum of birthmark set size this instance has.\r
+     * <code>getBirthmarkSetSize(ExtractionTarget.TARGET_BOTH)</code>\r
+     */\r
     public int getBirthmarkSetSize(){\r
         return getBirthmarkSetSize(ExtractionTarget.TARGET_BOTH);\r
     }\r
 \r
+    /**\r
+     * returns an iterator.\r
+     * <code>birthmarkSets(ExtractionTarget.TARGET_BOTH)</code>\r
+     */\r
     public Iterator<BirthmarkSet> iterator(){\r
         return birthmarkSets(ExtractionTarget.TARGET_BOTH);\r
     }\r
 \r
+    /**\r
+     * returns a birthmark set related of given index.\r
+     * <code>getBirthmarkSet(ExtractionTarget.TARGET_BOTH, index)</code>\r
+     */\r
     public BirthmarkSet getBirthmarkSet(int index){\r
         return getBirthmarkSet(ExtractionTarget.TARGET_BOTH, index);\r
     }\r
 \r
+    /**\r
+     * returns a birthmark set related with given name.\r
+     * <code>getBirthmarkSet(ExtractionTarget.TARGET_BOTH, name)</code>\r
+     */\r
     public BirthmarkSet getBirthmarkSet(String name){\r
         return getBirthmarkSet(ExtractionTarget.TARGET_BOTH, name);\r
     }\r
 \r
+    /**\r
+     * returns all of birthmark sets.\r
+     * <code>getBirthmarkSets(ExtractionTarget.TARGET_BOTH)</code>\r
+     */\r
     public BirthmarkSet[] getBirthmarkSets(){\r
         return getBirthmarkSets(ExtractionTarget.TARGET_BOTH);\r
     }\r
 \r
+    /**\r
+     * remove specified birthmark set from this instance.\r
+     * <code>removeBirthmarkSet(ExtractionTarget.TARGET_BOTH, bs)</code>\r
+     */\r
     public void removeBirthmarkSet(BirthmarkSet bs){\r
         removeBirthmarkSet(ExtractionTarget.TARGET_BOTH, bs);\r
     }\r
 \r
+    /**\r
+     * remove all of birthmark sets.\r
+     * <code>removeBirthmarkSet(ExtractionTarget.TARGET_BOTH)</code>\r
+     */\r
     public void removeAllBirthmarkSets(){\r
         removeAllBirthmarkSets(ExtractionTarget.TARGET_BOTH);\r
     }\r
 \r
+    /**\r
+     * returns an array of extracted birthmark types.\r
+     */\r
     public String[] getBirthmarkTypes(){\r
         return context.getBirthmarkTypes();\r
     }\r
 \r
+    /**\r
+     * returns an unit of extraction from.\r
+     */\r
     public ExtractionUnit getExtractionUnit(){\r
         return context.getExtractionUnit();\r
     }\r
 \r
+    /**\r
+     * returns the birthmark set at the specified position in the specified target. \r
+     */\r
     public BirthmarkSet getBirthmarkSet(ExtractionTarget target, int index){\r
         int currentIndex = 0;\r
         for(Iterator<BirthmarkSet> i = birthmarkSets(target); i.hasNext(); ){\r
@@ -106,6 +149,9 @@ public abstract class AbstractExtractionResultSet implements ExtractionResultSet
         return null;\r
     }\r
 \r
+    /**\r
+     * returns the birthmark set related with the specified name in the specified target.\r
+     */\r
     public BirthmarkSet getBirthmarkSet(ExtractionTarget target, String setname){\r
         for(Iterator<BirthmarkSet> i = birthmarkSets(target); i.hasNext(); ){\r
             BirthmarkSet bs = i.next();\r
index e75bc72..48b431d 100755 (executable)
@@ -14,8 +14,10 @@ import java.io.PrintWriter;
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
 
 import javax.xml.namespace.QName;
 import javax.xml.stream.XMLEventReader;
@@ -38,6 +40,8 @@ import jp.naist.se.stigmata.ExtractionUnit;
 import jp.naist.se.stigmata.Stigmata;
 import jp.naist.se.stigmata.printer.xml.ExtractionResultSetXmlPrinter;
 import jp.naist.se.stigmata.spi.BirthmarkSpi;
+import jp.naist.se.stigmata.ui.swing.ExtensionFilter;
+import jp.naist.se.stigmata.utils.MultipleIterator;
 
 /**
  * This class manages extracted birthmarks as xml file.
@@ -47,57 +51,56 @@ import jp.naist.se.stigmata.spi.BirthmarkSpi;
  * @version $Revision$ $Date$
  */
 public class XmlFileExtractionResultSet extends AbstractExtractionResultSet{
-    private List<URL> addList = new ArrayList<URL>();
     private boolean addmode = true;
-    private int size;
-    private ExtractionResultSetXmlPrinter formatter;
-    private File targetFile;
-    private PrintWriter out;
-
-    public XmlFileExtractionResultSet(BirthmarkContext context, boolean tableType){
-        super(context, tableType);
-
-        createTargetFile();
-    }
+    private File baseDirectory;
+    private Map<ExtractionTarget, XmlFile> files = new HashMap<ExtractionTarget, XmlFile>();
 
     public XmlFileExtractionResultSet(BirthmarkContext context){
         super(context);
+    }
 
-        createTargetFile();
+    public XmlFileExtractionResultSet(BirthmarkContext context, boolean tableType){
+        super(context, tableType);
     }
 
-    public XmlFileExtractionResultSet(File file){
+    public XmlFileExtractionResultSet(File directory){
         super(Stigmata.getInstance().createContext());
+
         addmode = false;
-        addList = null;
-        size = -1;
-        targetFile = file;
+        baseDirectory = directory;
 
-        getContext().setStoreTarget(BirthmarkStoreTarget.XMLFILE);
-        getContext().setComparisonMethod(ComparisonMethod.ROUND_ROBIN_SAME_PAIR);
-    }
+        BirthmarkContext context = getContext();
+        context.setStoreTarget(BirthmarkStoreTarget.XMLFILE);
+        if(files.containsKey(ExtractionTarget.TARGET_X) 
+            && files.containsKey(ExtractionTarget.TARGET_Y)){
+            context.setComparisonMethod(ComparisonMethod.ROUND_ROBIN_XY);
+        }
+        else{
+            context.setComparisonMethod(ComparisonMethod.ROUND_ROBIN_SAME_PAIR);
+        }
 
-    public BirthmarkStoreTarget getStoreTarget(){
-        return BirthmarkStoreTarget.XMLFILE;
+        for(File file: baseDirectory.listFiles(new ExtensionFilter("xml"))){
+            String fileName = file.getName();
+            String name = fileName.substring(0, fileName.lastIndexOf('.'));
+            ExtractionTarget et = ExtractionTarget.valueOf(name);
+            if(et != null){
+                files.put(et, new XmlFile(file, context, false));
+            }
+        }
     }
 
     @Override
     public void addBirthmarkSet(ExtractionTarget target, BirthmarkSet set) throws BirthmarkStoreException{
         if(addmode){
-            if(formatter == null){
-                try{
-                    out = new PrintWriter(new FileWriter(targetFile));
-                       formatter = new ExtractionResultSetXmlPrinter();
-                    formatter.printHeader(out);
-                }catch(IOException e){
-                }
+            if(target == ExtractionTarget.TARGET_BOTH){
+                throw new IllegalArgumentException("unknown target: " + target);
             }
-            if(out == null || formatter == null){
-                throw new BirthmarkStoreException("destination is closed on some reason");
+            XmlFile xml = files.get(target);
+            if(xml == null){
+                xml = new XmlFile(new File(getBaseDirectory(), target.name() + ".xml"), getContext());
+                files.put(target, xml);
             }
-            size++;
-            addList.add(set.getLocation());
-            formatter.printBirthmarkSet(out, set);
+            xml.addBirthmarkSet(set);
         }
         else{
             throw new BirthmarkStoreException("destination is already closed.");
@@ -106,48 +109,110 @@ public class XmlFileExtractionResultSet extends AbstractExtractionResultSet{
 
     @Override
     public Iterator<BirthmarkSet> birthmarkSets(ExtractionTarget target){
-        checkMode();
+        closeAllStream();
+
+        XmlFile xml = files.get(target);
+        Iterator<BirthmarkSet> iterator;
+        if(xml != null){
+            iterator = xml.birthmarkSets();
+        }
+        else if(target == ExtractionTarget.TARGET_BOTH){
+            MultipleIterator<BirthmarkSet> mi = new MultipleIterator<BirthmarkSet>();
+            boolean addflag = false;
+            if(files.containsKey(ExtractionTarget.TARGET_X)){
+                addflag = true;
+                mi.add(files.get(ExtractionTarget.TARGET_X).birthmarkSets());
+            }
+            if(files.containsKey(ExtractionTarget.TARGET_Y)){
+                addflag = true;
+                mi.add(files.get(ExtractionTarget.TARGET_Y).birthmarkSets());
+            }
+            if(!addflag && files.containsKey(ExtractionTarget.TARGET_XY)){
+                mi.add(files.get(ExtractionTarget.TARGET_XY).birthmarkSets());
+            }
+            iterator = mi;
+        }
+        else{
+            iterator = null;
+        }
 
-        return new BirthmarkSetStAXIterator(targetFile, addList, getContext());
+        return iterator;
     }
 
     @Override
     public int getBirthmarkSetSize(ExtractionTarget target){
+        int size = 0;
+        XmlFile xml = files.get(target);
+        if(xml != null){
+            size = xml.getBirthmarkSetSize();
+        }
+        else if(target == ExtractionTarget.TARGET_BOTH){
+            if(files.containsKey(ExtractionTarget.TARGET_X)){
+                size += files.get(ExtractionTarget.TARGET_X).getBirthmarkSetSize();
+            }
+            if(files.containsKey(ExtractionTarget.TARGET_Y)){
+                size += files.get(ExtractionTarget.TARGET_Y).getBirthmarkSetSize();
+            }
+            if(size == 0 && files.containsKey(ExtractionTarget.TARGET_XY)){
+                size += files.get(ExtractionTarget.TARGET_XY).getBirthmarkSetSize();
+            }
+        }
         return size;
     }
 
+    public BirthmarkStoreTarget getStoreTarget(){
+        return BirthmarkStoreTarget.XMLFILE;
+    }
+
     @Override
     public void removeAllBirthmarkSets(ExtractionTarget target){
-        targetFile.delete();
-        size = 0;
-        addList.clear();
+        XmlFile xml = files.get(target);
+        if(xml != null){
+            xml.removeAllBirthmarkSets();
+        }
+        else if(target == ExtractionTarget.TARGET_BOTH){
+            for(XmlFile file: files.values()){
+                file.removeAllBirthmarkSets();
+            }
+        }
     }
 
     @Override
     public void removeBirthmarkSet(ExtractionTarget target, BirthmarkSet set){
-        boolean removeFlag = addList.remove(set.getLocation());
-        if(removeFlag){
-            size--;
+        XmlFile xml = files.get(target);
+        if(xml != null){
+            xml.removeBirthmarkSet(set);
+        }
+        else if(target == ExtractionTarget.TARGET_BOTH){
+            throw new IllegalArgumentException("unknown target: " + target);
         }
     }
 
-    private void createTargetFile(){
-        targetFile = new File(BirthmarkEnvironment.getStigmataHome(), "extracted_birthmarks/" + generateId() + ".xml");
-        if(!targetFile.getParentFile().exists()){
-            targetFile.getParentFile().mkdirs();
+    private File getBaseDirectory(){
+        if(baseDirectory == null){
+            baseDirectory = new File(BirthmarkEnvironment.getStigmataHome(), "extracted_birthmarks/" + generateId());
+            if(!baseDirectory.exists()){
+                baseDirectory.mkdirs();
+            }
         }
+        return baseDirectory;
     }
 
-    private synchronized void checkMode(){
+    private void closeAllStream(){
         if(addmode){
             addmode = false;
-            formatter.printFooter(out);
-            out.close();
-            out = null;
-            formatter = null;
+            for(XmlFile file: files.values()){
+                file.closeStream();
+            }
         }
     }
 
+    /**
+     * Iterator class for reading birthmark xml file by StAX.
+     * 
+     * @author Haruaki Tamada
+     * @version $Revision$ $Date$
+     */
     private static class BirthmarkSetStAXIterator implements Iterator<BirthmarkSet>{
         private XMLEventReader reader = null;
         private BirthmarkSet nextObject;
@@ -199,6 +264,14 @@ public class XmlFileExtractionResultSet extends AbstractExtractionResultSet{
         }
 
         private BirthmarkSet findNext() throws XMLStreamException{
+            BirthmarkSet nextObject = null;
+            do{
+                nextObject = findNextImpl();
+            } while(nextObject != null && validItems != null && !validItems.contains(nextObject.getLocation()));
+            return nextObject;
+        }
+
+        private BirthmarkSet findNextImpl() throws XMLStreamException{
             String className = null;
             BirthmarkSet bs = null;
             Birthmark birthmark = null;
@@ -230,16 +303,6 @@ public class XmlFileExtractionResultSet extends AbstractExtractionResultSet{
                         }
                         try{
                             URL url = new URL(location);
-                            if(validItems == null || !validItems.contains(url)){
-                                while(reader.hasNext()){
-                                    XMLEvent xmlevent = reader.nextTag();
-                                    if(xmlevent.isEndElement() &&
-                                        xmlevent.asEndElement().getName().getLocalPart().equals("extracted-birthmark")){
-                                        break;
-                                    }
-                                }
-                                continue;
-                            }
                             bs = new BirthmarkSet(className, url);
                         } catch(MalformedURLException e){
                             e.printStackTrace();
@@ -275,4 +338,94 @@ public class XmlFileExtractionResultSet extends AbstractExtractionResultSet{
             return bs;
         }
     }
+
+    /**
+     * This class represents a xml file about XmlFileExtractionResultSet.
+     * 
+     * @author Haruaki Tamada
+     * @version $Revision$ $Date$
+     */
+    private static class XmlFile{
+        private ExtractionResultSetXmlPrinter formatter;
+        private BirthmarkContext context;
+        private List<URL> addList = new ArrayList<URL>();
+        private int size;
+        private File file;
+        private PrintWriter out;
+
+        public XmlFile(File file, BirthmarkContext context){
+            this.file = file;
+            this.context = context;
+        }
+
+        public XmlFile(File file, BirthmarkContext context, boolean addflag){
+            this.file = file;
+            this.context = context;
+            if(!addflag){
+                addList = null;
+            }
+        }
+
+        public void addBirthmarkSet(BirthmarkSet bs) throws BirthmarkStoreException{
+            if(formatter == null){
+                try{
+                    out = new PrintWriter(new FileWriter(file));
+                    formatter = new ExtractionResultSetXmlPrinter();
+                    formatter.printHeader(out);
+                    out.printf("    <unit>%s</unit>%n", context.getExtractionUnit());
+                    out.printf("    <birthmark-types>%n");
+                    for(String type: context.getBirthmarkTypes()){
+                        out.printf("      <birthmark-type>%s</birthmark-type>%n", type);
+                    }
+                    out.printf("    </birthmark-types>%n");
+                    
+                }catch(IOException e){
+                }
+            }
+            if(out == null || formatter == null){
+                throw new BirthmarkStoreException("destination is closed on some reason");
+            }
+            size++;
+            addList.add(bs.getLocation());
+            formatter.printBirthmarkSet(out, bs);
+        }
+
+        public Iterator<BirthmarkSet> birthmarkSets(){
+            return new BirthmarkSetStAXIterator(file, addList, context);
+        }
+
+        public void closeStream(){
+            if(formatter != null){
+                formatter.printFooter(out);
+                out.close();
+                out = null;
+                formatter = null;
+            }
+        }
+
+        public int getBirthmarkSetSize(){
+            if(size == 0){
+                int s = 0;
+                for(Iterator<BirthmarkSet> i = birthmarkSets(); i.hasNext(); ){
+                    i.next();
+                    s++;
+                }
+                size = s;
+            }
+            return size;
+        }
+
+        public void removeAllBirthmarkSets(){
+            file.delete();
+            size = 0;
+            addList.clear();            
+        }
+
+        public void removeBirthmarkSet(BirthmarkSet set){
+            boolean removeFlag = addList.remove(set.getLocation());
+            if(removeFlag){
+                size--;
+            }
+        }
+    }
 }
diff --git a/src/main/java/jp/naist/se/stigmata/result/history/ExtractedBirthmarkHistory.java b/src/main/java/jp/naist/se/stigmata/result/history/ExtractedBirthmarkHistory.java
new file mode 100755 (executable)
index 0000000..1cce032
--- /dev/null
@@ -0,0 +1,46 @@
+package jp.naist.se.stigmata.result.history;
+
+/*
+ * $Id$
+ */
+
+import java.util.Iterator;
+
+import jp.naist.se.stigmata.ExtractionResultSet;
+
+/**
+ * 
+ * @author Haruaki Tamada
+ * @version $Revision$ $Date$
+ */
+public interface ExtractedBirthmarkHistory extends Iterable<String>{
+    /**
+     * returns a list of histor ids as iterator.
+     */
+    public Iterator<String> iterator();
+
+    /**
+     * returns an array of history ids.
+     */
+    public String[] getIds();
+
+    /**
+     * returns an extraction result set corresponding id.
+     */
+    public ExtractionResultSet getExtractionResultSet(String id);
+
+    /**
+     * deletes all histories this instance is managed.
+     */
+    public void deleteAll();
+
+    /**
+     * deletes an extraction result set corresponding id.
+     */
+    public void delete(String id);
+
+    /**
+     * refreshes histories.
+     */
+    public void refresh();
+}
diff --git a/src/main/java/jp/naist/se/stigmata/result/history/ExtractedBirthmarkHistoryManager.java b/src/main/java/jp/naist/se/stigmata/result/history/ExtractedBirthmarkHistoryManager.java
new file mode 100755 (executable)
index 0000000..4c34690
--- /dev/null
@@ -0,0 +1,95 @@
+package jp.naist.se.stigmata.result.history;
+
+/*
+ * $Id$
+ */
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import jp.naist.se.stigmata.BirthmarkEnvironment;
+import jp.naist.se.stigmata.BirthmarkStoreTarget;
+
+/**
+ * 
+ * @author Haruaki Tamada
+ * @version $Revision$ $Date$
+ */
+public class ExtractedBirthmarkHistoryManager{
+    private static Map<BirthmarkStoreTarget, Class<? extends ExtractedBirthmarkHistory>> TARGETS = new HashMap<BirthmarkStoreTarget, Class<? extends ExtractedBirthmarkHistory>>();
+    private BirthmarkEnvironment env;
+
+    static{
+        TARGETS.put(BirthmarkStoreTarget.XMLFILE, XmlFileExtractedBirthmarkHistory.class);
+    }
+
+    public ExtractedBirthmarkHistoryManager(BirthmarkEnvironment env){
+        this.env = env;    
+    }
+
+    public ExtractedBirthmarkHistory getHistory(String id){
+        int index = id.indexOf(":");
+        String type = id.substring(0, index);
+        BirthmarkStoreTarget bst = BirthmarkStoreTarget.valueOf(type);
+        String path = id.substring(index + 1);
+
+        try{
+            Class<? extends ExtractedBirthmarkHistory> historyClass = TARGETS.get(bst);
+            Constructor<? extends ExtractedBirthmarkHistory> constructor = historyClass.getConstructor(String.class);
+            return constructor.newInstance(path);
+        } catch(IllegalArgumentException e){
+        } catch(InstantiationException e){
+        } catch(IllegalAccessException e){
+        } catch(InvocationTargetException e){
+        } catch(SecurityException e){
+        } catch(NoSuchMethodException e){
+        }
+        return null;
+    }
+
+    public synchronized String[] getHistoryIds(){
+        List<String> values = new ArrayList<String>();
+        addValuesFromProperty(values);
+        addValuesFromSystemFile(values);
+
+        char separator = File.separatorChar;
+        values.add(
+            "XMLFILE:" + BirthmarkEnvironment.getStigmataHome()
+            + separator + "extracted_birthmarks"
+        );
+        return values.toArray(new String[values.size()]);
+    }
+
+    private void addValuesFromSystemFile(List<String> values){
+        File file = new File(BirthmarkEnvironment.getStigmataHome(), "storelocations.txt");
+        if(file.exists()){
+            try{
+                BufferedReader in = new BufferedReader(new FileReader(file));
+                String line;
+                while((line = in.readLine()) != null){
+                    values.add(line);
+                }
+            } catch(IOException e){
+            }
+        }
+    }
+
+    private void addValuesFromProperty(List<String> values){
+        String path = env.getProperty("extracted.birthmark.store.locations");
+        if(path != null){
+            addValuesFromProperty(values);
+            String[] paths = path.split(", *");
+            for(String p: paths){
+                values.add(p);
+            }
+        }
+    }
+}
diff --git a/src/main/java/jp/naist/se/stigmata/result/history/XmlFileExtractedBirthmarkHistory.java b/src/main/java/jp/naist/se/stigmata/result/history/XmlFileExtractedBirthmarkHistory.java
new file mode 100755 (executable)
index 0000000..b1f9907
--- /dev/null
@@ -0,0 +1,90 @@
+package jp.naist.se.stigmata.result.history;
+
+/*
+ * $Id$
+ */
+
+import java.io.File;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import jp.naist.se.stigmata.BirthmarkEnvironment;
+import jp.naist.se.stigmata.ExtractionResultSet;
+import jp.naist.se.stigmata.result.XmlFileExtractionResultSet;
+import jp.naist.se.stigmata.utils.Utility;
+
+/**
+ * 
+ * @author Haruaki Tamada
+ * @version $Revision$ $Date$
+ */
+public class XmlFileExtractedBirthmarkHistory implements ExtractedBirthmarkHistory{
+    private File parent;
+    private Map<String, File> files = new LinkedHashMap<String, File>();
+
+    public XmlFileExtractedBirthmarkHistory(){
+        this(new File(BirthmarkEnvironment.getStigmataHome(), "extracted_birthmarks"));
+    }
+
+    public XmlFileExtractedBirthmarkHistory(String path){
+        this(new File(path));
+    }
+
+    public XmlFileExtractedBirthmarkHistory(File parent){
+        this.parent = parent;
+
+        refresh();
+    }
+
+    public void refresh(){
+        files.clear();
+
+        for(File file: parent.listFiles()){
+            if(isTarget(file)){
+                files.put(file.getName(), file);
+            }
+        }
+    }
+
+    public void deleteAll(){
+        for(File file: parent.listFiles()){
+            if(isTarget(file)){
+                Utility.deleteDirectory(file);
+            }
+        }
+    }
+
+    public void delete(String id){
+        File file = files.get(id);
+        if(file != null){
+            if(file.isDirectory()){
+                Utility.deleteDirectory(file);
+            }
+            else{
+                file.delete();
+            }
+        }
+    }
+
+    public ExtractionResultSet getExtractionResultSet(String id){
+        File file = files.get(id);
+        if(file != null){
+            return new XmlFileExtractionResultSet(file);
+        }
+        return null;
+    }
+
+    public synchronized String[] getIds(){
+        return files.keySet().toArray(new String[files.size()]);
+    }
+
+    public Iterator<String> iterator(){
+        return files.keySet().iterator();
+    }
+
+    private boolean isTarget(File file){
+        return file.isDirectory()
+        && file.getName().matches("\\d\\d\\d\\d\\d\\d\\d\\d-\\d\\d\\d\\d\\d\\d.\\d\\d\\d"); 
+    }
+}
index 5951f34..bfa101c 100644 (file)
@@ -112,8 +112,8 @@ public class BirthmarkDefinitionPane extends JPanel{
         panel.add(information = new InformationPane(stigmata, this), BorderLayout.CENTER);\r
 \r
         Box buttonPanel = Box.createHorizontalBox();\r
-        newService = Utility.createButton("newservice");\r
-        removeService = Utility.createButton("removeservice");\r
+        newService = GUIUtility.createButton("newservice");\r
+        removeService = GUIUtility.createButton("removeservice");\r
         buttonPanel.add(Box.createHorizontalGlue());\r
         buttonPanel.add(newService);\r
         buttonPanel.add(Box.createHorizontalGlue());\r
@@ -370,13 +370,13 @@ public class BirthmarkDefinitionPane extends JPanel{
             add(scroll);\r
             add(Box.createVerticalGlue());\r
 \r
-            Utility.decorateJComponent(type, "define.type");\r
-            Utility.decorateJComponent(displayType, "define.displaytype");\r
-            Utility.decorateJComponent(scroll, "define.description");\r
-            Utility.decorateJComponent(extractor, "define.extractor");\r
-            Utility.decorateJComponent(comparator, "define.comparator");\r
-            Utility.decorateJComponent(expert, "define.expert");\r
-            Utility.decorateJComponent(userDefined, "define.userdef");\r
+            GUIUtility.decorateJComponent(type, "define.type");\r
+            GUIUtility.decorateJComponent(displayType, "define.displaytype");\r
+            GUIUtility.decorateJComponent(scroll, "define.description");\r
+            GUIUtility.decorateJComponent(extractor, "define.extractor");\r
+            GUIUtility.decorateJComponent(comparator, "define.comparator");\r
+            GUIUtility.decorateJComponent(expert, "define.expert");\r
+            GUIUtility.decorateJComponent(userDefined, "define.userdef");\r
 \r
             userDefined.setEnabled(false);\r
             expert.setEnabled(false);\r
index df39400..2f25864 100644 (file)
@@ -5,12 +5,16 @@ package jp.naist.se.stigmata.ui.swing;
  */\r
 \r
 import java.awt.BorderLayout;\r
+import java.awt.event.ActionEvent;\r
 import java.io.PrintWriter;\r
 \r
+import javax.swing.AbstractAction;\r
+import javax.swing.Action;\r
 import javax.swing.Box;\r
 import javax.swing.JButton;\r
 import javax.swing.JComponent;\r
 import javax.swing.JPanel;\r
+import javax.swing.JPopupMenu;\r
 import javax.swing.JScrollPane;\r
 \r
 import jp.naist.se.stigmata.ExtractionResultSet;\r
@@ -18,6 +22,7 @@ import jp.naist.se.stigmata.ExtractionTarget;
 import jp.naist.se.stigmata.printer.ExtractionResultSetPrinter;\r
 import jp.naist.se.stigmata.printer.PrinterManager;\r
 import jp.naist.se.stigmata.spi.ResultPrinterSpi;\r
+import jp.naist.se.stigmata.ui.swing.actions.PopupShowAction;\r
 import jp.naist.se.stigmata.ui.swing.actions.SaveAction;\r
 import jp.naist.se.stigmata.utils.AsciiDataWritable;\r
 \r
@@ -35,8 +40,12 @@ public class BirthmarkExtractionResultPane extends JPanel{
         this.frame = stigmataFrame;\r
         this.extraction = ers;\r
 \r
-        JComponent southPanel = Box.createHorizontalBox(); \r
-        JButton saveButton = Utility.createButton("savebirthmark", new SaveAction(frame, new AsciiDataWritable(){\r
+        initLayouts();\r
+    }\r
+\r
+    private void initLayouts(){\r
+        JComponent southPanel = Box.createHorizontalBox();\r
+        Action saveAction = new SaveAction(frame, new AsciiDataWritable(){\r
             public void writeAsciiData(PrintWriter out, String format){\r
                 ResultPrinterSpi service = PrinterManager.getInstance().getService(format);\r
                 if(service == null){\r
@@ -46,16 +55,34 @@ public class BirthmarkExtractionResultPane extends JPanel{
                 ExtractionResultSetPrinter list = service.getExtractionResultSetPrinter();\r
                 list.printResult(new PrintWriter(out), extraction);\r
             }\r
-        }));\r
-        JScrollPane scroll = new JScrollPane();\r
+        });\r
+        Action compareAction = new AbstractAction(){\r
+            private static final long serialVersionUID = -1938101718384412339L;\r
+\r
+            public void actionPerformed(ActionEvent e){\r
+                frame.compareExtractionResult(extraction);\r
+            }\r
+        };\r
+        JButton saveButton = GUIUtility.createButton("savebirthmark", saveAction);\r
+        JButton compareButton = GUIUtility.createButton("comparebirthmark", compareAction);\r
 \r
-        scroll.setViewportView(new BirthmarkTree(ers.getBirthmarkSets(ExtractionTarget.TARGET_BOTH)));\r
+        JPopupMenu popup = new JPopupMenu();\r
+        popup.add(GUIUtility.createJMenuItem("savebirthmark", saveAction));\r
+        popup.add(GUIUtility.createJMenuItem("comparebirthmark", compareAction));\r
+\r
+        JScrollPane scroll = new JScrollPane();\r
+        scroll.setViewportView(new BirthmarkTree(extraction.getBirthmarkSets(ExtractionTarget.TARGET_BOTH)));\r
 \r
         setLayout(new BorderLayout());\r
+        add(popup);\r
         add(scroll, BorderLayout.CENTER);\r
         add(southPanel, BorderLayout.SOUTH);\r
         southPanel.add(Box.createHorizontalGlue());\r
         southPanel.add(saveButton);\r
         southPanel.add(Box.createHorizontalGlue());\r
+        southPanel.add(compareButton);\r
+        southPanel.add(Box.createHorizontalGlue());\r
+\r
+        addMouseListener(new PopupShowAction(popup));\r
     }\r
 }\r
index 492d4d2..cea2b6e 100644 (file)
@@ -36,8 +36,8 @@ public class BirthmarkSelectionCheckSetPane extends BirthmarkSelectablePane{
         setLayout(new BorderLayout());\r
         add(checks, BorderLayout.CENTER);\r
 \r
-        JButton checkAll = Utility.createButton("checkall");\r
-        JButton uncheckAll = Utility.createButton("uncheckall");\r
+        JButton checkAll = GUIUtility.createButton("checkall");\r
+        JButton uncheckAll = GUIUtility.createButton("uncheckall");\r
 \r
         Box box = Box.createHorizontalBox();\r
         box.add(Box.createHorizontalGlue());\r
index 7eadf4c..264e724 100644 (file)
@@ -56,8 +56,8 @@ public class BirthmarkSelectionListPane extends BirthmarkSelectablePane{
         add(scroll, BorderLayout.CENTER);\r
         list.setCellRenderer(new Renderer());\r
         list.setVisibleRowCount(5);\r
-        JButton checkAll = Utility.createButton("checkall");\r
-        JButton uncheckAll = Utility.createButton("uncheckall");\r
+        JButton checkAll = GUIUtility.createButton("checkall");\r
+        JButton uncheckAll = GUIUtility.createButton("uncheckall");\r
 \r
         Box box = Box.createHorizontalBox();\r
         box.add(Box.createHorizontalGlue());\r
index 50d18d7..4aa6a26 100644 (file)
@@ -108,7 +108,7 @@ public class ClasspathSettingsPane extends JPanel{
         classpath = new TargetSelectionPane(stigmata);\r
         bootClasspath = new TargetSelectionPane(stigmata);\r
         JComponent south = Box.createHorizontalBox();\r
-        final JButton findButton = Utility.createButton("findclass");\r
+        final JButton findButton = GUIUtility.createButton("findclass");\r
         final JTextField text = new JTextField();\r
         final JLabel label = new JLabel();\r
 \r
@@ -124,7 +124,7 @@ public class ClasspathSettingsPane extends JPanel{
 \r
         south.setBorder(new TitledBorder(Messages.getString("classpathchecker.border")));\r
 \r
-        label.setIcon(Utility.getIcon("classpathchecker.default.icon"));\r
+        label.setIcon(GUIUtility.getIcon("classpathchecker.default.icon"));\r
         label.setToolTipText(Messages.getString("classpathchecker.default.tooltip"));\r
 \r
         setLayout(new BorderLayout());\r
@@ -164,10 +164,10 @@ public class ClasspathSettingsPane extends JPanel{
                 boolean flag = findClass(t);\r
                 String message = Messages.getString("classpathchecker.found.tooltip");\r
                 if(flag){\r
-                    label.setIcon(Utility.getIcon("classpathchecker.found.icon"));\r
+                    label.setIcon(GUIUtility.getIcon("classpathchecker.found.icon"));\r
                 }\r
                 else{\r
-                    label.setIcon(Utility.getIcon("classpathchecker.notfound.icon"));\r
+                    label.setIcon(GUIUtility.getIcon("classpathchecker.notfound.icon"));\r
                     message = Messages.getString("classpathchecker.notfound.tooltip");\r
                 }\r
                 label.setToolTipText(message);\r
index 497bc71..4ec5078 100644 (file)
@@ -12,9 +12,7 @@ import java.io.FileWriter;
 import java.io.IOException;\r
 import java.io.PrintWriter;\r
 import java.util.HashMap;\r
-import java.util.HashSet;\r
 import java.util.Map;\r
-import java.util.Set;\r
 \r
 import javax.swing.Box;\r
 import javax.swing.BoxLayout;\r
@@ -55,6 +53,7 @@ public class ControlPane extends JPanel{
     private BirthmarkDefinitionPane definition;\r
     private PropertyEditPane properties;\r
     private FilterManagementPane filters;\r
+    private ExtractedHistoryPane history;\r
     private JTabbedPane controlTab;\r
     private JButton compareButton;\r
     private JButton extractButton;\r
@@ -76,12 +75,13 @@ public class ControlPane extends JPanel{
         wellknownClassses = new WellknownClassesSettingsPane(stigmata);\r
         classpath = new ClasspathSettingsPane(stigmata);\r
         filters = new FilterManagementPane(stigmata);\r
+        history = new ExtractedHistoryPane(stigmata);\r
         initComponents();\r
 \r
-        Utility.addNewTab("targets", controlTab, control);\r
-        Utility.addNewTab("wellknown", controlTab, wellknownClassses);\r
-        Utility.addNewTab("classpath", controlTab, classpath);\r
-        Utility.addNewTab("property", controlTab, properties);\r
+        GUIUtility.addNewTab("targets", controlTab, control);\r
+        GUIUtility.addNewTab("wellknown", controlTab, wellknownClassses);\r
+        GUIUtility.addNewTab("classpath", controlTab, classpath);\r
+        GUIUtility.addNewTab("property", controlTab, properties);\r
         reset();\r
     }\r
 \r
@@ -153,12 +153,14 @@ public class ControlPane extends JPanel{
         stigmata.setExpertMode(expertmode);\r
 \r
         if(expertmode){\r
-            Utility.addNewTab("definition", controlTab, definition);\r
-            Utility.addNewTab("filter", controlTab, filters);\r
+            GUIUtility.addNewTab("definition", controlTab, definition);\r
+            GUIUtility.addNewTab("filter", controlTab, filters);\r
+            GUIUtility.addNewTab("history", controlTab, history);\r
         }\r
         else{\r
             removeTabByName(Messages.getString("definition.tab.label"));\r
             removeTabByName(Messages.getString("filter.tab.label"));\r
+            removeTabByName(Messages.getString("history.tab.label"));\r
         }\r
         updateEnable();\r
     }\r
@@ -230,22 +232,12 @@ public class ControlPane extends JPanel{
 \r
     private void extractButtonActionPerformed(ActionEvent e){\r
         BirthmarkContext context = generateContext();\r
+        context.setComparisonMethod(ComparisonMethod.ROUND_ROBIN_XY);\r
 \r
         String[] fileX = targetX.getValues();\r
         String[] fileY = targetY.getValues();\r
-        Set<String> targets = new HashSet<String>();\r
-        if(fileX != null && fileX.length > 0){\r
-            for(String file: fileX){\r
-                targets.add(file);\r
-            }\r
-        }\r
-        if(fileY != null && fileY.length > 0){\r
-            for(String file: fileY){\r
-                targets.add(file);\r
-            }\r
-        }\r
 \r
-        stigmata.extract(targets.toArray(new String[targets.size()]), context);\r
+        stigmata.extract(fileX, fileY, context);\r
     }\r
 \r
     private void compareRoundRobinWithFiltering(){\r
@@ -346,9 +338,9 @@ public class ControlPane extends JPanel{
 \r
     private void initComponents(){\r
         controlTab = new JTabbedPane();\r
-        resetButton = Utility.createButton("reset");\r
-        extractButton = Utility.createButton("extract");\r
-        compareButton = Utility.createButton("roundrobin");\r
+        resetButton = GUIUtility.createButton("reset");\r
+        extractButton = GUIUtility.createButton("extract");\r
+        compareButton = GUIUtility.createButton("roundrobin");\r
         comparePopup = new PopupButton(compareButton);\r
         unitBox = new JComboBox();\r
 \r
@@ -404,7 +396,7 @@ public class ControlPane extends JPanel{
 \r
         String[] comparisonMethods = Messages.getStringArray("comparison.methods");\r
         for(int i = 1; i < comparisonMethods.length; i++){\r
-            JMenuItem item = Utility.createJMenuItem(comparisonMethods[i]);\r
+            JMenuItem item = GUIUtility.createJMenuItem(comparisonMethods[i]);\r
             comparePopup.addMenuItem(item);\r
             item.addActionListener(compareListener);\r
         }\r
diff --git a/src/main/java/jp/naist/se/stigmata/ui/swing/ExtractedHistoryPane.java b/src/main/java/jp/naist/se/stigmata/ui/swing/ExtractedHistoryPane.java
new file mode 100755 (executable)
index 0000000..044d361
--- /dev/null
@@ -0,0 +1,163 @@
+package jp.naist.se.stigmata.ui.swing;
+
+/*
+ * $Id$
+ */
+
+import java.awt.BorderLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+
+import javax.swing.AbstractAction;
+import javax.swing.Action;
+import javax.swing.Box;
+import javax.swing.DefaultListModel;
+import javax.swing.JButton;
+import javax.swing.JComboBox;
+import javax.swing.JList;
+import javax.swing.JPanel;
+import javax.swing.JPopupMenu;
+import javax.swing.JScrollPane;
+import javax.swing.ListSelectionModel;
+import javax.swing.event.ListSelectionEvent;
+import javax.swing.event.ListSelectionListener;
+
+import jp.naist.se.stigmata.ExtractionResultSet;
+import jp.naist.se.stigmata.result.history.ExtractedBirthmarkHistory;
+import jp.naist.se.stigmata.result.history.ExtractedBirthmarkHistoryManager;
+import jp.naist.se.stigmata.ui.swing.actions.PopupShowAction;
+
+/**
+ * Birthmark extraction history viewer.
+ * 
+ * @author Haruaki Tamada
+ * @version $Revision$ $Date$
+ */
+public class ExtractedHistoryPane extends JPanel{
+    private static final long serialVersionUID = 4070750464486981964L;
+
+    private StigmataFrame stigmata;
+    private JComboBox combo;
+    private JList list;
+    private DefaultListModel model;
+    private ExtractedBirthmarkHistoryManager historyManager;
+    private ExtractedBirthmarkHistory currentHistory;
+
+    public ExtractedHistoryPane(StigmataFrame stigmata){
+        this.stigmata = stigmata;
+
+        initLayouts();
+        initData();
+    }
+
+    private void updateList(){
+        String historyId = (String)combo.getSelectedItem();
+        currentHistory = historyManager.getHistory(historyId);
+        model.clear();
+
+        for(String id: currentHistory){
+            model.addElement(id);
+        }
+    }
+
+    private void initData(){
+        historyManager = new ExtractedBirthmarkHistoryManager(stigmata.getEnvironment());
+
+        for(String id: historyManager.getHistoryIds()){
+            combo.addItem(id);
+        }
+    }
+
+    private void showAction(String id){
+        ExtractionResultSet ers = currentHistory.getExtractionResultSet(id);
+        stigmata.showExtractionResult(ers);
+    }
+
+    private void initLayouts(){
+        setLayout(new BorderLayout());
+
+        final Action showAction = new AbstractAction(){
+            private static final long serialVersionUID = 2156350514762218963L;
+
+            public void actionPerformed(ActionEvent e){
+                showAction((String)model.get(list.getSelectedIndex()));
+            }
+        };
+        final Action refreshAction = new AbstractAction(){
+            private static final long serialVersionUID = 214765021455345371L;
+
+            public void actionPerformed(ActionEvent e){
+                updateList();
+            }
+        };
+        final Action deleteAction = new AbstractAction(){
+            private static final long serialVersionUID = 8145188292702648924L;
+
+            public void actionPerformed(ActionEvent e){
+                int[] indeces = list.getSelectedIndices();
+                for(int i = indeces.length - 1; i >= 0; i--){
+                    String id = (String)model.get(indeces[i]);
+                    currentHistory.delete(id);
+                    model.remove(indeces[i]);
+                }
+                list.clearSelection();
+            }
+        };
+        model = new DefaultListModel();
+        list = new JList(model);
+        combo = new JComboBox();
+        list.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
+        GUIUtility.decorateJComponent(list, "historylist");
+        GUIUtility.decorateJComponent(combo, "historylocation");
+
+        JButton showButton = GUIUtility.createButton("showhistory", showAction);
+        JButton refreshButton = GUIUtility.createButton("refreshhistory", refreshAction);
+        JButton deleteButton = GUIUtility.createButton("deletehistory", deleteAction);
+        deleteAction.setEnabled(false);
+
+        list.getSelectionModel().addListSelectionListener(new ListSelectionListener(){
+            public void valueChanged(ListSelectionEvent e){
+                int[] indeces = list.getSelectedIndices();
+                showAction.setEnabled(currentHistory != null && indeces.length == 1);
+                deleteAction.setEnabled(currentHistory != null && indeces.length > 0);
+            }
+        });
+        list.addMouseListener(new MouseAdapter(){
+            @Override
+            public void mouseClicked(MouseEvent e){
+                int index = list.locationToIndex(e.getPoint());
+                if(index >= 0 && e.getClickCount() == 2){
+                    showAction((String)model.get(index));
+                }
+            }
+        });
+        combo.addActionListener(new ActionListener(){
+            public void actionPerformed(ActionEvent e){
+                updateList();
+            }
+        });
+        JScrollPane scroll = new JScrollPane();
+        scroll.setViewportView(list);
+
+        Box south = Box.createHorizontalBox();
+        south.add(Box.createHorizontalGlue());
+        south.add(showButton);
+        south.add(Box.createHorizontalGlue());
+        south.add(refreshButton);
+        south.add(Box.createHorizontalGlue());
+        south.add(deleteButton);
+        south.add(Box.createHorizontalGlue());
+
+        add(combo, BorderLayout.NORTH);
+        add(scroll, BorderLayout.CENTER);
+        add(south, BorderLayout.SOUTH);
+
+        JPopupMenu popup = new JPopupMenu();
+        popup.add(GUIUtility.createJMenuItem("showhistory"), showAction);
+        popup.add(GUIUtility.createJMenuItem("refreshhistory"), refreshAction);
+        popup.add(GUIUtility.createJMenuItem("deletehistory"), deleteAction);
+        list.addMouseListener(new PopupShowAction(popup));
+    }
+}
index c4cd7b9..937e8bc 100644 (file)
@@ -106,9 +106,9 @@ public class FilterManagementPane extends JPanel implements ComparisonPairFilter
         filterPane.addComparisonPairFilterListener(definition);\r
         JComponent filtersetlist = createFilterSetPane();\r
 \r
-        Utility.decorateJComponent(filtersetlist, "filtersetlist.pane");\r
-        Utility.decorateJComponent(definition, "filterdefinition.pane");\r
-        Utility.decorateJComponent(filterPane, "filter.pane");\r
+        GUIUtility.decorateJComponent(filtersetlist, "filtersetlist.pane");\r
+        GUIUtility.decorateJComponent(definition, "filterdefinition.pane");\r
+        GUIUtility.decorateJComponent(filterPane, "filter.pane");\r
 \r
         setLayout(new GridLayout(1, 3));\r
         add(filtersetlist);\r
@@ -120,8 +120,8 @@ public class FilterManagementPane extends JPanel implements ComparisonPairFilter
         model = new DefaultListModel();\r
         list = new JList(model);\r
 \r
-        final JButton upButton = Utility.createButton("moveup");\r
-        final JButton downButton = Utility.createButton("movedown");\r
+        final JButton upButton = GUIUtility.createButton("moveup");\r
+        final JButton downButton = GUIUtility.createButton("movedown");\r
 \r
         Box south = Box.createHorizontalBox();\r
         south.add(Box.createHorizontalGlue());\r
@@ -28,10 +28,10 @@ import javax.swing.border.TitledBorder;
  * @author Haruaki TAMADA\r
  * @version $Revision$ $Date$\r
  */\r
-public class Utility{\r
+public class GUIUtility{\r
     private static final String iconPath = Messages.getString("icon.directory");\r
 \r
-    private Utility(){\r
+    private GUIUtility(){\r
     }\r
 \r
     public static void decorateJComponent(JComponent component, String label){\r
@@ -150,7 +150,7 @@ public class Utility{
             if(resourcePathPrefix != null){\r
                 resourcePath = resourcePathPrefix + resourcePath;\r
             }\r
-            return Utility.class.getResource(resourcePath);\r
+            return GUIUtility.class.getResource(resourcePath);\r
         }\r
         return null;\r
     }\r
@@ -177,16 +177,6 @@ public class Utility{
         return null;\r
     }\r
 \r
-    public static String array2String(String[] values){\r
-        StringBuilder builder = new StringBuilder();\r
-        for(int i = 0; i < values.length; i++){\r
-            if(i != 0)\r
-                builder.append(", ");\r
-            builder.append(values[i]);\r
-        }\r
-        return new String(builder);\r
-    }\r
-\r
     public static void addNewTab(String key, JTabbedPane tabPane, Component comp){\r
         addNewTab(key, tabPane, comp, null, null);\r
     }\r
index 03e17a1..727bf1d 100644 (file)
@@ -75,7 +75,7 @@ public class PairComparisonPane extends JPanel{
         panel.add(similarityPanel);\r
 \r
         JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));\r
-        JButton saveButton = Utility.createButton(\r
+        JButton saveButton = GUIUtility.createButton(\r
             "savecomparison", new SaveAction(frame, new AsciiDataWritable(){\r
                 public void writeAsciiData(PrintWriter out, String format) throws IOException{\r
                     ResultPrinterSpi service = PrinterManager.getInstance().getService(format);\r
index e5db058..60499bd 100644 (file)
@@ -125,7 +125,7 @@ public class PairComparisonResultSetPane extends JPanel{
         JComponent buttonPanel = Box.createHorizontalBox();\r
         JPanel similarityPane = new JPanel(new GridLayout(1, 3));\r
         JComponent southPanel = Box.createVerticalBox();\r
-        JButton saveButton = Utility.createButton(\r
+        JButton saveButton = GUIUtility.createButton(\r
             "savecomparison", new SaveAction(frame, new AsciiDataWritable(){\r
                 public void writeAsciiData(PrintWriter out, String format) throws IOException{\r
                     ResultPrinterSpi service = PrinterManager.getInstance().getService(format);\r
@@ -136,10 +136,10 @@ public class PairComparisonResultSetPane extends JPanel{
                 }\r
             })\r
         );\r
-        JButton updateColorButton = Utility.createButton(\r
+        JButton updateColorButton = GUIUtility.createButton(\r
             "updatecellcolor", new UpdateBirthmarkCellColorAction(this, comparison.getEnvironment())\r
         );\r
-        JButton obfuscateButton = Utility.createButton("obfuscate");\r
+        JButton obfuscateButton = GUIUtility.createButton("obfuscate");\r
         JScrollPane scroll = new JScrollPane();\r
         averageLabel = new JLabel(Double.toString(average), JLabel.RIGHT);\r
         maximumLabel = new JLabel(Double.toString(maximum), JLabel.RIGHT);\r
index 0a39ebd..5a680f6 100644 (file)
@@ -205,14 +205,14 @@ public class PropertyEditPane extends JPanel{
                 addNewProperty(table.getSelectedRow());\r
             }\r
         };\r
-        JButton addButton = Utility.createButton("propertyadd", addAction);\r
-        JButton changeButton = Utility.createButton("propertychange", changeAction);\r
-        JButton removeButton = Utility.createButton("propertyremove", removeAction);\r
+        JButton addButton = GUIUtility.createButton("propertyadd", addAction);\r
+        JButton changeButton = GUIUtility.createButton("propertychange", changeAction);\r
+        JButton removeButton = GUIUtility.createButton("propertyremove", removeAction);\r
 \r
         final JPopupMenu popup = new JPopupMenu();\r
-        popup.add(Utility.createJMenuItem("propertyadd", addAction));\r
-        popup.add(Utility.createJMenuItem("propertychange", changeAction));\r
-        popup.add(Utility.createJMenuItem("propertyremove", removeAction));\r
+        popup.add(GUIUtility.createJMenuItem("propertyadd", addAction));\r
+        popup.add(GUIUtility.createJMenuItem("propertychange", changeAction));\r
+        popup.add(GUIUtility.createJMenuItem("propertyremove", removeAction));\r
 \r
         setLayout(new BorderLayout());\r
         JScrollPane scroll = new JScrollPane(table);\r
index 6692d30..5a25029 100644 (file)
@@ -58,14 +58,11 @@ public class RoundRobinComparisonResultPane extends JPanel{
     private static final long serialVersionUID = 2134574576543623L;\r
 \r
     private ExtractionResultSet extraction;\r
-    // private List<BirthmarkSet> birthmarksX;\r
-    // private List<BirthmarkSet> birthmarksY;\r
     private JTable table;\r
     private DefaultTableModel model;\r
     private JLabel classCount, comparisonCount, distinctionRatio;\r
     private JLabel average, minimum, maximum;\r
     private StigmataFrame stigmataFrame;\r
-    // private BirthmarkEnvironment environment;\r
 \r
     public RoundRobinComparisonResultPane(StigmataFrame stigmata, ExtractionResultSet resultset){\r
         this.stigmataFrame = stigmata;\r
@@ -74,19 +71,26 @@ public class RoundRobinComparisonResultPane extends JPanel{
         compare(model);\r
     }\r
 \r
-    @Deprecated\r
-    public RoundRobinComparisonResultPane(StigmataFrame stigmata, BirthmarkEnvironment environment,\r
-                                          BirthmarkSet[] birthmarksX, BirthmarkSet[] birthmarksY){\r
-        this.stigmataFrame = stigmata;\r
-\r
-        initialize();\r
-        compare(model);\r
-    }\r
-\r
     private void compare(DefaultTableModel model){\r
-        int countX = extraction.getBirthmarkSetSize(ExtractionTarget.TARGET_X);\r
-        int countY = extraction.getBirthmarkSetSize(ExtractionTarget.TARGET_Y);\r
+        ExtractionTarget targetX = ExtractionTarget.TARGET_X;\r
+        ExtractionTarget targetY = ExtractionTarget.TARGET_Y;\r
+        int countX = extraction.getBirthmarkSetSize(targetX);\r
+        int countY = extraction.getBirthmarkSetSize(targetY);\r
         int comparisonCount = countX * countY;\r
+        if(countX == 0 && countY == 0){\r
+            targetX = ExtractionTarget.TARGET_XY;\r
+            targetY = ExtractionTarget.TARGET_XY;\r
+            countX = extraction.getBirthmarkSetSize(targetX);\r
+            countY = extraction.getBirthmarkSetSize(targetY);\r
+            comparisonCount = countX * (countY - 1) / 2;\r
+        }\r
+        else if(countX == 0 || countY == 0){\r
+            targetX = ExtractionTarget.TARGET_BOTH;\r
+            targetY = ExtractionTarget.TARGET_BOTH;\r
+            countX = extraction.getBirthmarkSetSize(targetX);\r
+            countY = extraction.getBirthmarkSetSize(targetY);\r
+            comparisonCount = countX * (countY - 1) / 2;\r
+        }\r
 \r
         classCount.setText(Integer.toString(countX + countY));\r
         this.comparisonCount.setText(Integer.toString(comparisonCount));\r
@@ -95,18 +99,18 @@ public class RoundRobinComparisonResultPane extends JPanel{
         double max = 0d;\r
         double min = 100d;\r
         model.addColumn("");\r
-        for(Iterator<BirthmarkSet> i = extraction.birthmarkSets(ExtractionTarget.TARGET_X); i.hasNext(); ){\r
+        for(Iterator<BirthmarkSet> i = extraction.birthmarkSets(targetX); i.hasNext(); ){\r
             BirthmarkSet x = i.next();\r
             model.addColumn(x.getName());\r
         }\r
-        int sizeX = extraction.getBirthmarkSetSize(ExtractionTarget.TARGET_X);\r
-        for(Iterator<BirthmarkSet> i = extraction.birthmarkSets(ExtractionTarget.TARGET_Y); i.hasNext(); ){\r
+        int sizeX = extraction.getBirthmarkSetSize(targetX);\r
+        for(Iterator<BirthmarkSet> i = extraction.birthmarkSets(targetY); i.hasNext(); ){\r
             Object[] rows = new Object[sizeX + 1];\r
             BirthmarkSet setY = i.next();\r
             rows[0] = setY.getName();\r
 \r
             int index = 0;\r
-            for(Iterator<BirthmarkSet> j = extraction.birthmarkSets(ExtractionTarget.TARGET_X); j.hasNext(); ){\r
+            for(Iterator<BirthmarkSet> j = extraction.birthmarkSets(targetX); j.hasNext(); ){\r
                 BirthmarkSet setX = j.next();\r
                 double similarity = compare(setX, setY, extraction.getEnvironment());\r
                 rows[index + 1] = new Double(similarity);\r
@@ -240,7 +244,7 @@ public class RoundRobinComparisonResultPane extends JPanel{
     }\r
 \r
     private void initialize(){\r
-        JButton save = Utility.createButton(\r
+        JButton save = GUIUtility.createButton(\r
             "savecomparison", new SaveAction(stigmataFrame, new AsciiDataWritable(){\r
                 public void writeAsciiData(PrintWriter out, String format){\r
                     ResultPrinterSpi service = PrinterManager.getInstance().getService(format);\r
@@ -254,13 +258,13 @@ public class RoundRobinComparisonResultPane extends JPanel{
                 }\r
             }\r
         ));\r
-        JButton graph = Utility.createButton("showgraph");\r
-        JButton obfuscate = Utility.createButton("obfuscate");\r
-        JButton compare = Utility.createButton("guessedpair");\r
-        JButton updateColor = Utility.createButton(\r
+        JButton graph = GUIUtility.createButton("showgraph");\r
+        JButton obfuscate = GUIUtility.createButton("obfuscate");\r
+        JButton compare = GUIUtility.createButton("guessedpair");\r
+        JButton updateColor = GUIUtility.createButton(\r
             "updatecellcolor", new UpdateBirthmarkCellColorAction(this, extraction.getEnvironment())\r
         );\r
-        JMenuItem mdsMenu = Utility.createJMenuItem("mdsmap");\r
+        JMenuItem mdsMenu = GUIUtility.createJMenuItem("mdsmap");\r
 \r
         PopupButton comparePopup = new PopupButton(compare);\r
         PopupButton graphPopup = new PopupButton(graph);\r
@@ -317,7 +321,7 @@ public class RoundRobinComparisonResultPane extends JPanel{
         compare.addActionListener(compareListener);\r
         String[] comparisonMethods = Messages.getStringArray("comparison.methods.inroundrobinresult");\r
         for(int i = 1; i < comparisonMethods.length; i++){\r
-            JMenuItem item = Utility.createJMenuItem(comparisonMethods[i]);\r
+            JMenuItem item = GUIUtility.createJMenuItem(comparisonMethods[i]);\r
             comparePopup.addMenuItem(item);\r
             item.addActionListener(compareListener);\r
         }\r
index 88a9237..da1ee5c 100644 (file)
@@ -61,6 +61,7 @@ import jp.naist.se.stigmata.ui.swing.actions.LicenseAction;
 import jp.naist.se.stigmata.ui.swing.graph.SimilarityDistributionGraphPane;\r
 import jp.naist.se.stigmata.ui.swing.mds.MDSGraphPanel;\r
 import jp.naist.se.stigmata.ui.swing.tab.EditableTabbedPane;\r
+import jp.naist.se.stigmata.utils.Utility;\r
 \r
 import org.apache.commons.cli.ParseException;\r
 \r
@@ -94,7 +95,7 @@ public class StigmataFrame extends JFrame{
         this.stigmata = stigmata;\r
         this.environment = environment;\r
         this.fileio = new FileIOManager(this, environment);\r
-        Image iconImage = Utility.getImage("stigmata.icon");\r
+        Image iconImage = GUIUtility.getImage("stigmata.icon");\r
         if(iconImage != null){\r
             setIconImage(iconImage);\r
         }\r
@@ -177,7 +178,7 @@ public class StigmataFrame extends JFrame{
         );\r
         int compareDetail = getNextCount("compare_detail");\r
 \r
-        Utility.addNewTab("comparedetail", tabPane, detail,\r
+        GUIUtility.addNewTab("comparedetail", tabPane, detail,\r
             new Object[] { new Integer(compareDetail), },\r
             new Object[] {\r
                 Utility.array2String(target1.getBirthmarkTypes()),\r
@@ -196,7 +197,7 @@ public class StigmataFrame extends JFrame{
 \r
             RoundRobinComparisonResultPane compare = new RoundRobinComparisonResultPane(this, ers);\r
             int compareCount = getNextCount("compare");\r
-            Utility.addNewTab(\r
+            GUIUtility.addNewTab(\r
                 "compare", tabPane, compare,\r
                 new Object[] { new Integer(compareCount), },\r
                 new Object[] {\r
@@ -222,7 +223,7 @@ public class StigmataFrame extends JFrame{
                 resultset = engine.filter(resultset);\r
             }\r
             int compareCount = getNextCount("compare");\r
-            Utility.addNewTab(\r
+            GUIUtility.addNewTab(\r
                 "compare", tabPane, new PairComparisonResultSetPane(this, resultset),\r
                 new Object[] { new Integer(compareCount), },\r
                 new Object[] {\r
@@ -244,7 +245,7 @@ public class StigmataFrame extends JFrame{
             int comparePair = getNextCount("compare_pair");\r
 \r
             ComparisonResultSet resultset = new CertainPairComparisonResultSet(extraction);\r
-            Utility.addNewTab("comparepair", tabPane,\r
+            GUIUtility.addNewTab("comparepair", tabPane,\r
                 new PairComparisonResultSetPane(this, resultset),\r
                 new Object[] { new Integer(comparePair), },\r
                 new Object[] {\r
@@ -272,7 +273,7 @@ public class StigmataFrame extends JFrame{
                 ComparisonResultSet crs = engine.compare(targetX, targetY, context);\r
                 int comparePair = getNextCount("compare_pair");\r
 \r
-                Utility.addNewTab(\r
+                GUIUtility.addNewTab(\r
                     "comparepair", tabPane,\r
                     new PairComparisonResultSetPane(this, crs),\r
                     new Object[] { new Integer(comparePair), },\r
@@ -291,7 +292,7 @@ public class StigmataFrame extends JFrame{
 \r
     public void showComparisonResultSet(ComparisonResultSet resultset){\r
         int comparePair = getNextCount("compare_pair");\r
-        Utility.addNewTab(\r
+        GUIUtility.addNewTab(\r
             "comparisonresultset", tabPane,\r
             new PairComparisonResultSetPane(this, resultset),\r
             new Object[] { new Integer(comparePair), }, null\r
@@ -303,7 +304,7 @@ public class StigmataFrame extends JFrame{
         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
+            GUIUtility.addNewTab("mappinggraph", tabPane, panel, new Object[] { new Integer(mappingGraphCount), }, null);\r
             tabPane.setSelectedIndex(tabPane.getTabCount() - 1);\r
         } catch(Exception e){\r
             showExceptionMessage(e);\r
@@ -314,14 +315,29 @@ public class StigmataFrame extends JFrame{
         SimilarityDistributionGraphPane graph = new SimilarityDistributionGraphPane(this, distributions);\r
 \r
         int similarityGraphCount = getNextCount("similarity_graph");\r
-        Utility.addNewTab("similaritygraph", tabPane, graph, new Object[] { new Integer(similarityGraphCount), }, null);\r
+        GUIUtility.addNewTab("similaritygraph", tabPane, graph, new Object[] { new Integer(similarityGraphCount), }, null);\r
+        tabPane.setSelectedIndex(tabPane.getTabCount() - 1);\r
+    }\r
+\r
+    public void compareExtractionResult(ExtractionResultSet ers){\r
+        RoundRobinComparisonResultPane compare = new RoundRobinComparisonResultPane(this, ers);\r
+        int compareCount = getNextCount("compare");\r
+        GUIUtility.addNewTab(\r
+            "compare", tabPane, compare,\r
+            new Object[] { new Integer(compareCount), },\r
+            new Object[] {\r
+                Utility.array2String(ers.getBirthmarkTypes()),\r
+                Utility.array2String(new String[0]),\r
+                Utility.array2String(new String[0]),\r
+            }\r
+        );\r
         tabPane.setSelectedIndex(tabPane.getTabCount() - 1);\r
     }\r
 \r
     public void showExtractionResult(ExtractionResultSet ers){\r
         int extractCount = getNextCount("extract");\r
         BirthmarkExtractionResultPane viewer = new BirthmarkExtractionResultPane(this, ers);\r
-        Utility.addNewTab(\r
+        GUIUtility.addNewTab(\r
             "extract", tabPane, viewer,\r
             new Object[] { new Integer(extractCount), },\r
             new Object[] { Utility.array2String(ers.getBirthmarkTypes()), }\r
@@ -330,10 +346,10 @@ public class StigmataFrame extends JFrame{
         \r
     }\r
 \r
-    public void extract(String[] targets, BirthmarkContext context){\r
+    public void extract(String[] targetX, String[] targetY, BirthmarkContext context){\r
         try{\r
             BirthmarkEngine engine = getStigmata().createEngine(context.getEnvironment());\r
-            ExtractionResultSet ers = engine.extract(targets, context);\r
+            ExtractionResultSet ers = engine.extract(targetX, targetY, context);\r
             showExtractionResult(ers);\r
         }catch(Throwable e){\r
             showExceptionMessage(e);\r
@@ -369,19 +385,6 @@ public class StigmataFrame extends JFrame{
         return mapping;\r
     }\r
 \r
-    private static void deleteDirectory(File dir){\r
-        File[] files = dir.listFiles();\r
-        for(File file: files){\r
-            if(file.isDirectory()){\r
-                deleteDirectory(file);\r
-            }\r
-            else{\r
-                file.delete();\r
-            }\r
-        }\r
-        dir.delete();\r
-    }\r
-\r
     private void reloadSettings(String[] args){\r
         try{\r
             setVisible(false);\r
@@ -392,7 +395,7 @@ public class StigmataFrame extends JFrame{
     }\r
 \r
     private void clearSettings(){\r
-        deleteDirectory(new File(BirthmarkEnvironment.getStigmataHome()));\r
+        Utility.deleteDirectory(new File(BirthmarkEnvironment.getStigmataHome()));\r
         reloadSettings(new String[] { "--reset-config", "--mode", "gui", });\r
     }\r
 \r
@@ -400,7 +403,7 @@ public class StigmataFrame extends JFrame{
         setTitle(Messages.getString("stigmata.frame.title"));\r
         initComponents();\r
 \r
-        Utility.addNewTab("control", tabPane, control = new ControlPane(this), null, null);\r
+        GUIUtility.addNewTab("control", tabPane, control = new ControlPane(this), null, null);\r
         control.inititalize();\r
         tabPane.setSelectedIndex(tabPane.getTabCount() - 1);\r
 \r
@@ -470,15 +473,15 @@ public class StigmataFrame extends JFrame{
     }\r
 \r
     private JMenu createFileMenu(){\r
-        JMenu fileMenu = Utility.createJMenu("fileMenu");\r
-        JMenuItem newFrameMenu = Utility.createJMenuItem("newframe");\r
-        JMenuItem saveMenu = Utility.createJMenuItem("savesetting");\r
-        JMenuItem exportMenu = Utility.createJMenuItem("exportsetting");\r
-        JMenuItem clearMenu = Utility.createJMenuItem("clearsetting");\r
-        JMenuItem refreshMenu = Utility.createJMenuItem("refreshsetting");\r
-        JMenuItem closeTabMenu = Utility.createJMenuItem("closetab");\r
-        JMenuItem closeMenu = Utility.createJMenuItem("closeframe");\r
-        JMenuItem exitMenu = Utility.createJMenuItem("exit");\r
+        JMenu fileMenu = GUIUtility.createJMenu("fileMenu");\r
+        JMenuItem newFrameMenu = GUIUtility.createJMenuItem("newframe");\r
+        JMenuItem saveMenu = GUIUtility.createJMenuItem("savesetting");\r
+        JMenuItem exportMenu = GUIUtility.createJMenuItem("exportsetting");\r
+        JMenuItem clearMenu = GUIUtility.createJMenuItem("clearsetting");\r
+        JMenuItem refreshMenu = GUIUtility.createJMenuItem("refreshsetting");\r
+        JMenuItem closeTabMenu = GUIUtility.createJMenuItem("closetab");\r
+        JMenuItem closeMenu = GUIUtility.createJMenuItem("closeframe");\r
+        JMenuItem exitMenu = GUIUtility.createJMenuItem("exit");\r
         this.closeTabMenu = closeTabMenu;\r
         this.saveMenu = saveMenu;\r
         saveMenu.setEnabled(false);\r
@@ -547,11 +550,11 @@ public class StigmataFrame extends JFrame{
     }\r
 \r
     private JMenu createHelpMenu(){\r
-        JMenu menu = Utility.createJMenu("helpmenu");\r
-        JMenuItem about = Utility.createJMenuItem("about", new AboutAction(this));\r
-        JMenuItem license = Utility.createJMenuItem("license", new LicenseAction(this));\r
-        JMenuItem help = Utility.createJMenuItem("helpmenu");\r
-        expertmodeMenu = Utility.createJCheckBoxMenuItem("expertmenu");\r
+        JMenu menu = GUIUtility.createJMenu("helpmenu");\r
+        JMenuItem about = GUIUtility.createJMenuItem("about", new AboutAction(this));\r
+        JMenuItem license = GUIUtility.createJMenuItem("license", new LicenseAction(this));\r
+        JMenuItem help = GUIUtility.createJMenuItem("helpmenu");\r
+        expertmodeMenu = GUIUtility.createJCheckBoxMenuItem("expertmenu");\r
 \r
         menu.add(about);\r
         menu.add(license);\r
@@ -572,7 +575,7 @@ public class StigmataFrame extends JFrame{
     }\r
 \r
     private JMenu createLookAndFeelMenu(){\r
-        JMenu laf = Utility.createJMenu("lookandfeel");\r
+        JMenu laf = GUIUtility.createJMenu("lookandfeel");\r
         ButtonGroup bg = new ButtonGroup();\r
         UIManager.LookAndFeelInfo[] info = UIManager.getInstalledLookAndFeels();\r
         LookAndFeel lookfeel = UIManager.getLookAndFeel();\r
index d95071d..3d6cbb3 100644 (file)
@@ -240,13 +240,13 @@ public class TargetSelectionPane extends JPanel{
             }\r
         };\r
 \r
-        JButton addButton = Utility.createButton("addpackage", addAction);\r
-        JButton removeButton = Utility.createButton("removepackage", removeAction);\r
+        JButton addButton = GUIUtility.createButton("addpackage", addAction);\r
+        JButton removeButton = GUIUtility.createButton("removepackage", removeAction);\r
         removeAction.setEnabled(false);\r
 \r
         final JPopupMenu popup = new JPopupMenu();\r
-        popup.add(Utility.createJMenuItem("addpackage", addAction));\r
-        popup.add(Utility.createJMenuItem("removepackage", removeAction));\r
+        popup.add(GUIUtility.createJMenuItem("addpackage", addAction));\r
+        popup.add(GUIUtility.createJMenuItem("removepackage", removeAction));\r
 \r
         setLayout(new BorderLayout());\r
 \r
index f908bd1..4ea47a3 100644 (file)
@@ -145,8 +145,8 @@ public class WellknownClassesSettingsPane extends JPanel{
 \r
     private JComponent createCheckPane(){\r
         final JTextField text = new JTextField();\r
-        final JButton checkButton = Utility.createButton("checkwellknown");\r
-        final JLabel label = new JLabel(Utility.getIcon("wellknownclasschecker.default.icon"));\r
+        final JButton checkButton = GUIUtility.createButton("checkwellknown");\r
+        final JLabel label = new JLabel(GUIUtility.getIcon("wellknownclasschecker.default.icon"));\r
         checkButton.setEnabled(false);\r
 \r
         ActionListener listener = new ActionListener(){\r
@@ -155,10 +155,10 @@ public class WellknownClassesSettingsPane extends JPanel{
                 if(t.length() > 0){\r
                     String message = Messages.getString("wellknownclasschecker.wellknown.tooltip");\r
                     if(isWellknownClass(t)){\r
-                        label.setIcon(Utility.getIcon("wellknownclasschecker.wellknown.icon"));\r
+                        label.setIcon(GUIUtility.getIcon("wellknownclasschecker.wellknown.icon"));\r
                     }\r
                     else{\r
-                        label.setIcon(Utility.getIcon("wellknownclasschecker.notwellknown.icon"));\r
+                        label.setIcon(GUIUtility.getIcon("wellknownclasschecker.notwellknown.icon"));\r
                         message = Messages.getString("wellknownclasschecker.notwellknown.tooltip");\r
                     }\r
                     label.setToolTipText(message);\r
@@ -230,9 +230,9 @@ public class WellknownClassesSettingsPane extends JPanel{
                 editRule(list.getSelectedIndex());\r
             }\r
         };\r
-        JButton addButton = Utility.createButton("addwellknown", addAction);\r
-        JButton removeButton = Utility.createButton("removewellknown", removeAction);\r
-        JButton updateButton = Utility.createButton("updatewellknown", updateAction);\r
+        JButton addButton = GUIUtility.createButton("addwellknown", addAction);\r
+        JButton removeButton = GUIUtility.createButton("removewellknown", removeAction);\r
+        JButton updateButton = GUIUtility.createButton("updatewellknown", updateAction);\r
         removeAction.setEnabled(false);\r
         updateAction.setEnabled(false);\r
 \r
@@ -253,9 +253,9 @@ public class WellknownClassesSettingsPane extends JPanel{
             }\r
         });\r
         JPopupMenu popup = new JPopupMenu();\r
-        popup.add(Utility.createJMenuItem("addwellknown", addAction));\r
-        popup.add(Utility.createJMenuItem("updatewellknown", updateAction));\r
-        popup.add(Utility.createJMenuItem("removewellknown", removeAction));\r
+        popup.add(GUIUtility.createJMenuItem("addwellknown", addAction));\r
+        popup.add(GUIUtility.createJMenuItem("updatewellknown", updateAction));\r
+        popup.add(GUIUtility.createJMenuItem("removewellknown", removeAction));\r
 \r
         list.addMouseListener(new PopupShowAction(popup));\r
         list.getSelectionModel().addListSelectionListener(new ListSelectionListener(){\r
@@ -272,9 +272,9 @@ public class WellknownClassesSettingsPane extends JPanel{
     private WellknownClassJudgeRule createOrUpdateRule(WellknownClassJudgeRule rule){\r
         JTextField text = new JTextField();\r
         text.setOpaque(true);\r
-        Utility.decorateJComponent(text, "addwellknown.newrule.pattern");\r
+        GUIUtility.decorateJComponent(text, "addwellknown.newrule.pattern");\r
         JCheckBox excludeCheck = new JCheckBox(Messages.getString("addwellknown.newrule.exclude.label"), false);\r
-        Utility.decorateJComponent(excludeCheck, "addwellknown.newrule.exclude");\r
+        GUIUtility.decorateJComponent(excludeCheck, "addwellknown.newrule.exclude");\r
         JComboBox matchTypeComboBox = new JComboBox();\r
         for(Map.Entry<String, String> entry: matchTypeMap.entrySet()){\r
             matchTypeComboBox.addItem(entry.getValue());\r
index 228bba6..32ae13e 100644 (file)
@@ -11,7 +11,7 @@ import javax.swing.JLabel;
 import javax.swing.JPanel;\r
 \r
 import jp.naist.se.stigmata.ui.swing.Messages;\r
-import jp.naist.se.stigmata.ui.swing.Utility;\r
+import jp.naist.se.stigmata.ui.swing.GUIUtility;\r
 \r
 /**\r
  * \r
@@ -37,7 +37,7 @@ public class AboutAction extends ShowTextAction{
 \r
     @Override\r
     public String getMessage(){\r
-        String aboutMessage = loadStringFromFile(Utility.getResource("about.message.file"));\r
+        String aboutMessage = loadStringFromFile(GUIUtility.getResource("about.message.file"));\r
 \r
         Package p = getClass().getPackage();\r
         aboutMessage = aboutMessage.replace("${implementation.version}", p.getImplementationVersion());\r
@@ -49,7 +49,7 @@ public class AboutAction extends ShowTextAction{
 \r
     @Override\r
     protected void updatePanel(JPanel panel){\r
-        JLabel logo = new JLabel(Utility.getIcon("stigmata.logo"));\r
+        JLabel logo = new JLabel(GUIUtility.getIcon("stigmata.logo"));\r
         panel.add(logo, BorderLayout.NORTH);\r
     }\r
 }\r
index 9683bf0..0ef0120 100644 (file)
@@ -14,7 +14,7 @@ import javax.swing.JColorChooser;
 import javax.swing.JDialog;\r
 \r
 import jp.naist.se.stigmata.ui.swing.Messages;\r
-import jp.naist.se.stigmata.ui.swing.Utility;\r
+import jp.naist.se.stigmata.ui.swing.GUIUtility;\r
 \r
 /**\r
  * \r
@@ -32,7 +32,7 @@ public class ChangeColorAction extends AbstractAction{
 \r
     public ChangeColorAction(String label, Component component, \r
                               Color initialColor, ActionListener listener){\r
-        super(Messages.getString(label + ".label"), Utility.getIcon(label + ".icon"));\r
+        super(Messages.getString(label + ".label"), GUIUtility.getIcon(label + ".icon"));\r
         this.component = component;\r
         this.listener = listener;\r
         this.currentColor = initialColor;\r
index e29c063..b763d31 100644 (file)
@@ -7,7 +7,7 @@ package jp.naist.se.stigmata.ui.swing.actions;
 import java.awt.Component;\r
 \r
 import jp.naist.se.stigmata.ui.swing.Messages;\r
-import jp.naist.se.stigmata.ui.swing.Utility;\r
+import jp.naist.se.stigmata.ui.swing.GUIUtility;\r
 \r
 /**\r
  * @author Haruaki TAMADA\r
@@ -25,6 +25,6 @@ public class LicenseAction extends ShowTextAction{
     }\r
 \r
     public String getMessage(){\r
-        return loadStringFromFile(Utility.getResource("license.file"));\r
+        return loadStringFromFile(GUIUtility.getResource("license.file"));\r
     }\r
 }\r
index 73496b8..e8428a2 100755 (executable)
@@ -18,7 +18,7 @@ import javax.swing.JPanel;
 import jp.naist.se.stigmata.BirthmarkEnvironment;\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
+import jp.naist.se.stigmata.ui.swing.GUIUtility;\r
 \r
 public class UpdateBirthmarkCellColorAction extends AbstractAction{\r
     private static final long serialVersionUID = 2390797591047570440L;\r
@@ -95,8 +95,8 @@ public class UpdateBirthmarkCellColorAction extends AbstractAction{
         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
+            JButton fore = GUIUtility.createButton("updatecellfore");\r
+            JButton back = GUIUtility.createButton("updatecellback");\r
 \r
             ActionListener listener = new ActionListener(){\r
                 public void actionPerformed(ActionEvent e){\r
index 89ce783..1e1e273 100644 (file)
@@ -29,7 +29,7 @@ import jp.naist.se.stigmata.spi.ComparisonPairFilterSpi;
 import jp.naist.se.stigmata.ui.swing.BirthmarkServiceListener;\r
 import jp.naist.se.stigmata.ui.swing.Messages;\r
 import jp.naist.se.stigmata.ui.swing.StigmataFrame;\r
-import jp.naist.se.stigmata.ui.swing.Utility;\r
+import jp.naist.se.stigmata.ui.swing.GUIUtility;\r
 \r
 /**\r
  * \r
@@ -136,9 +136,9 @@ public class FilterEditingPane extends JPanel{
     private void initLayouts(){\r
         cardComponent = new JPanel();\r
         combo = new JComboBox();\r
-        addButton = Utility.createButton("newfilter");\r
-        removeButton = Utility.createButton("removefilter");\r
-        updateButton = Utility.createButton("updatefilter");\r
+        addButton = GUIUtility.createButton("newfilter");\r
+        removeButton = GUIUtility.createButton("removefilter");\r
+        updateButton = GUIUtility.createButton("updatefilter");\r
 \r
         combo.addItemListener(new ItemListener(){\r
             public void itemStateChanged(ItemEvent e){\r
index 55417be..aa00ec9 100644 (file)
@@ -27,7 +27,7 @@ import javax.swing.event.ListSelectionListener;
 import jp.naist.se.stigmata.ComparisonPairFilter;\r
 import jp.naist.se.stigmata.ComparisonPairFilterSet;\r
 import jp.naist.se.stigmata.ui.swing.Messages;\r
-import jp.naist.se.stigmata.ui.swing.Utility;\r
+import jp.naist.se.stigmata.ui.swing.GUIUtility;\r
 \r
 /**\r
  * \r
@@ -125,11 +125,11 @@ public class FilterSetDefinitionPane extends JPanel implements ComparisonPairFil
         north.add(matchall);\r
         north.add(matchany);\r
 \r
-        addfilter = Utility.createButton("newfilterset");\r
-        updatefilter = Utility.createButton("updatefilterset");\r
-        removefilter = Utility.createButton("removefilterset");\r
-        upButton = Utility.createButton("moveup");\r
-        downButton = Utility.createButton("movedown");\r
+        addfilter = GUIUtility.createButton("newfilterset");\r
+        updatefilter = GUIUtility.createButton("updatefilterset");\r
+        removefilter = GUIUtility.createButton("removefilterset");\r
+        upButton = GUIUtility.createButton("moveup");\r
+        downButton = GUIUtility.createButton("movedown");\r
         \r
         Box south = Box.createHorizontalBox();\r
         south.add(Box.createHorizontalGlue());\r
@@ -228,8 +228,8 @@ public class FilterSetDefinitionPane extends JPanel implements ComparisonPairFil
             add(south, BorderLayout.SOUTH);\r
         }\r
 \r
-        Utility.decorateJComponent(name, "filtername");\r
-        Utility.decorateJComponent(listpane, "filterorder");\r
+        GUIUtility.decorateJComponent(name, "filtername");\r
+        GUIUtility.decorateJComponent(listpane, "filterorder");\r
 \r
         setEnabled(buttonShown);\r
 \r
index 142007f..84fc75a 100644 (file)
@@ -30,7 +30,7 @@ import javax.swing.JPanel;
 \r
 import jp.naist.se.stigmata.ui.swing.Messages;\r
 import jp.naist.se.stigmata.ui.swing.StigmataFrame;\r
-import jp.naist.se.stigmata.ui.swing.Utility;\r
+import jp.naist.se.stigmata.ui.swing.GUIUtility;\r
 import jp.naist.se.stigmata.ui.swing.actions.ChangeColorAction;\r
 \r
 /**\r
@@ -148,7 +148,7 @@ public class SimilarityDistributionGraphPane extends JPanel{
         JPanel center = new JPanel(new FlowLayout(FlowLayout.CENTER));\r
         iconLabel = new JLabel();\r
         Box south = Box.createHorizontalBox();\r
-        JButton storeImageButton = Utility.createButton("savegraph");\r
+        JButton storeImageButton = GUIUtility.createButton("savegraph");\r
         JButton switchColorButton = new JButton(new ChangeColorAction(stigmata, new ActionListener(){\r
             public void actionPerformed(ActionEvent e){\r
                 ChangeColorAction action = (ChangeColorAction)e.getSource();\r
index 62b49b3..fdad665 100644 (file)
@@ -32,7 +32,7 @@ import jp.naist.se.stigmata.ui.swing.ClippedLRListCellRenderer;
 import jp.naist.se.stigmata.ui.swing.Messages;\r
 import jp.naist.se.stigmata.ui.swing.PopupButton;\r
 import jp.naist.se.stigmata.ui.swing.StigmataFrame;\r
-import jp.naist.se.stigmata.ui.swing.Utility;\r
+import jp.naist.se.stigmata.ui.swing.GUIUtility;\r
 import jp.naist.se.stigmata.ui.swing.actions.ChangeColorAction;\r
 import jp.naist.se.stigmata.ui.swing.actions.SaveAction;\r
 import jp.naist.se.stigmata.ui.swing.mds.mark.DrawerFactory;\r
@@ -140,16 +140,16 @@ public class MDSGraphPanel extends JPanel{
         saveCoordinate.setDescrpition(Messages.getString("savelocation.description"));\r
 \r
         PopupButton colorButton = new PopupButton(\r
-            Utility.createButton("updatecolor", pointColorAction)\r
+            GUIUtility.createButton("updatecolor", pointColorAction)\r
         );\r
-        colorButton.addMenuItem(Utility.createJMenuItem("updateovercolor", overColorAction));\r
+        colorButton.addMenuItem(GUIUtility.createJMenuItem("updateovercolor", overColorAction));\r
         PopupButton saveButton = new PopupButton(\r
-            Utility.createButton("savemds", saveMDSAction)\r
+            GUIUtility.createButton("savemds", saveMDSAction)\r
         );\r
-        saveButton.addMenuItem(Utility.createJMenuItem("savelocation", saveCoordinate));\r
+        saveButton.addMenuItem(GUIUtility.createJMenuItem("savelocation", saveCoordinate));\r
 \r
         JLabel numberOfDotsLabel = new JLabel(String.valueOf(set.length));\r
-        Utility.decorateJComponent(numberOfDotsLabel, "mdsgraph.count");\r
+        GUIUtility.decorateJComponent(numberOfDotsLabel, "mdsgraph.count");\r
         // set the number of dots of each groups\r
         JComboBox numberOfGroupsLabelCombo = new JComboBox();\r
         GeometoryType[] types = GeometoryType.values();\r
@@ -165,7 +165,7 @@ public class MDSGraphPanel extends JPanel{
         numberOfGroupsLabelCombo.setEditable(false);\r
         Dimension dim = new Dimension(100, numberOfGroupsLabelCombo.getPreferredSize().height);\r
         numberOfGroupsLabelCombo.setRenderer(new ClippedLRListCellRenderer(dim, 50));\r
-        Utility.decorateJComponent(numberOfGroupsLabelCombo, "mdsgraph.group");\r
+        GUIUtility.decorateJComponent(numberOfGroupsLabelCombo, "mdsgraph.group");\r
 \r
         JPanel north = new JPanel(new GridLayout(1, 2));\r
         north.add(numberOfDotsLabel);\r
diff --git a/src/main/java/jp/naist/se/stigmata/utils/Utility.java b/src/main/java/jp/naist/se/stigmata/utils/Utility.java
new file mode 100755 (executable)
index 0000000..b871898
--- /dev/null
@@ -0,0 +1,34 @@
+package jp.naist.se.stigmata.utils;
+
+import java.io.File;
+
+public class Utility{
+    /**
+     * no instance is created
+     */
+    private Utility(){
+    }
+
+    public static void deleteDirectory(File dir){
+        File[] files = dir.listFiles();
+        for(File file: files){
+            if(file.isDirectory()){
+                deleteDirectory(file);
+            }
+            else{
+                file.delete();
+            }
+        }
+        dir.delete();
+    }
+
+    public static String array2String(String[] values){
+        StringBuilder builder = new StringBuilder();
+        for(int i = 0; i < values.length; i++){
+            if(i != 0)
+                builder.append(", ");
+            builder.append(values[i]);
+        }
+        return new String(builder);
+    }
+}
diff --git a/src/main/resources/resources/images/database_delete.png b/src/main/resources/resources/images/database_delete.png
new file mode 100755 (executable)
index 0000000..cce652e
Binary files /dev/null and b/src/main/resources/resources/images/database_delete.png differ
diff --git a/src/main/resources/resources/images/database_go.png b/src/main/resources/resources/images/database_go.png
new file mode 100755 (executable)
index 0000000..61a8556
Binary files /dev/null and b/src/main/resources/resources/images/database_go.png differ
diff --git a/src/main/resources/resources/images/database_refresh.png b/src/main/resources/resources/images/database_refresh.png
new file mode 100755 (executable)
index 0000000..ff803be
Binary files /dev/null and b/src/main/resources/resources/images/database_refresh.png differ
index 1ede780..e11cdcd 100755 (executable)
@@ -289,6 +289,18 @@ savebirthmark.button.label=Save
 savebirthmark.button.tooltip=Save extracted birthmarks to a file.\r
 savebirthmark.button.icon=disk.png\r
 \r
+savebirthmark.menuitem.label=${savebirthmark.button.label}\r
+savebirthmark.menuitem.tooltip=${savebirthmark.button.tooltip}\r
+savebirthmark.menuitem.icon=${savebirthmark.button.icon}\r
+\r
+comparebirthmark.button.label=Compare Round Robin\r
+comparebirthmark.button.tooltip=Compare extracted birthmarks by round robin\r
+comparebirthmark.button.icon=arrow_right_left.png\r
+\r
+comparebirthmark.menuitem.label=${comparebirthmark.button.label}\r
+comparebirthmark.menuitem.tooltip=${comparebirthmark.button.tooltip}\r
+comparebirthmark.menuitem.icon=${comparebirthmark.button.icon}\r
+\r
 birthmarktree.root.label=Birthmark\r
 \r
 ################################################\r
@@ -571,6 +583,43 @@ target1.name.button.label=${target.TARGET1} class name
 target2.name.button.label=${target.TARGET2} class name\r
 both.name.button.label=${target.BOTH} class name\r
 \r
+############################################################\r
+# history pane\r
+############################################################\r
+\r
+history.tab.label=History\r
+history.tab.tooltip=Extracted birthmark history\r
+\r
+historylist.border=History List\r
+historylist.tooltip=Stored histories.\r
+\r
+historylocation.border=Histories Location\r
+historylocation.tooltip=Location list of storing histories\r
+\r
+showhistory.button.label=Show\r
+showhistory.button.tooltip=Show extracted birthmark history on tab.\r
+showhistory.button.icon=database_go.png\r
+\r
+deletehistory.button.label=Delete\r
+deletehistory.button.tooltip=Delete selected history from store target.\r
+deletehistory.button.icon=database_delete.png\r
+\r
+refreshhistory.button.label=Refresh\r
+refreshhistory.button.tooltip=Refresh birthmark history\r
+refreshhistory.button.icon=database_refresh.png\r
+\r
+showhistory.menuitem.label=${showhistory.button.label}\r
+showhistory.menuitem.tooltip=${showhistory.button.tooltip}\r
+showhistory.menuitem.icon=${showhistory.button.icon}\r
+\r
+deletehistory.menuitem.label=${deletehistory.button.label}\r
+deletehistory.menuitem.tooltip=${deletehistory.button.tooltip}\r
+deletehistory.menuitem.icon=${deletehistory.button.icon}\r
+\r
+refreshhistory.menuitem.label=${refreshhistory.button.label}\r
+refreshhistory.menuitem.tooltip=${refreshhistory.button.tooltip}\r
+refreshhistory.menuitem.icon=${refreshhistory.button.icon}\r
+\r
 ################################################\r
 # update table cell color\r
 ################################################\r
index aa2fd3d..130f452 100755 (executable)
@@ -217,8 +217,10 @@ showlabel.button.label=
 savebirthmark.button.label=\95Û\91\r
 savebirthmark.button.tooltip=\92\8a\8fo\82³\82ê\82½\83o\81[\83X\83}\81[\83N\82ð\95Û\91\82µ\82Ü\82·\81D\r
 \r
-birthmarktree.root.label=\83o\81[\83X\83}\81[\83N\r
+comparebirthmark.button.label=\91\8d\93\96\82½\82è\82Å\94ä\8ar\r
+comparebirthmark.button.tooltip=\92\8a\8fo\82³\82ê\82½\83o\81[\83X\83}\81[\83N\82ð\91\8d\93\96\82½\82è\82Å\94ä\8ar\82µ\82Ü\82·\81D\r
 \r
+birthmarktree.root.label=\83o\81[\83X\83}\81[\83N\r
 \r
 ################################################\r
 # graphpane\r
@@ -433,6 +435,28 @@ target1.name.button.label=${target.TARGET1}
 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
+# history pane\r
+############################################################\r
+\r
+history.tab.label=\83o\81[\83X\83}\81[\83N\92\8a\8fo\97\9a\97ð\r
+history.tab.tooltip=\92\8a\8fo\82µ\82½\83o\81[\83X\83}\81[\83N\82Ì\97\9a\97ð\r
+\r
+historylist.border=\92\8a\8fo\97\9a\97ð\r
+historylist.tooltip=\8d¡\82Ü\82Å\82É\83o\81[\83X\83}\81[\83N\82ð\92\8a\8fo\82µ\82½\97\9a\97ð\82Ì\83\8a\83X\83g\r
+\r
+historylocation.border=\92\8a\8fo\97\9a\97ð\82Ì\95Û\91\8fê\8f\8a\r
+historylocation.tooltip=\92\8a\8fo\97\9a\97ð\82Ì\95Û\91\8fê\8f\8a\82Ì\83\8a\83X\83g\r
+\r
+showhistory.button.label=\97\9a\97ð\82Ì\95\\8e¦\r
+showhistory.button.tooltip=\92\8a\8fo\82µ\82½\97\9a\97ð\82ð\95\\8e¦\82µ\82Ü\82·\81D\r
+\r
+refreshhistory.button.label=\83\8a\83t\83\8c\83b\83V\83\85\r
+refreshhistory.button.tooltip=\97\9a\97ð\82ð\8c\9f\8dõ\82µ\82È\82¨\82µ\82Ü\82·\81D\r
+\r
+deletehistory.button.label=\8dí\8f\9c\r
+deletehistory.button.tooltip=\91I\91ð\82³\82ê\82½\97\9a\97ð\82ð\8dí\8f\9c\82µ\82Ü\82·\81i\97\9a\97ð\83t\83@\83C\83\8b\82ð\8dí\8f\9c\82µ\82Ü\82·\81j\81D\r
+\r
 ################################################\r
 # update table cell color\r
 ################################################\r