<modelVersion>4.0.0</modelVersion>
<groupId>jp.naist.se</groupId>
<artifactId>stigmata</artifactId>
- <version>1.0.0</version>
+ <version>1.0.1</version>
<name>stigmata</name>
<description>Java birthmark toolkit</description>
<url>http://stigmata.sourceforge.jp/</url>
* $Id$\r
*/\r
\r
+import java.beans.PropertyChangeEvent;\r
+import java.beans.PropertyChangeListener;\r
import java.util.ArrayList;\r
import java.util.Arrays;\r
import java.util.HashMap;\r
private Map<String, String> properties = new HashMap<String, String>();\r
\r
/**\r
+ * listeners for updating properties.\r
+ */\r
+ private List<PropertyChangeListener> propertyListeners = new ArrayList<PropertyChangeListener>();\r
+\r
+ /**\r
* filter manager.\r
*/\r
private ComparisonPairFilterManager filterManager;\r
public BirthmarkContext(BirthmarkContext parent){\r
this.parent = parent;\r
this.manager = new WellknownClassManager(parent.getWellknownClassManager());\r
- this.bytecodeContext = new ClasspathContext(parent.getBytecodeContext());\r
+ this.bytecodeContext = new ClasspathContext(parent.getClasspathContext());\r
this.filterManager = new ComparisonPairFilterManager(parent.getFilterManager());\r
}\r
\r
return DEFAULT_CONTEXT;\r
}\r
\r
+ public BirthmarkContext getParent(){\r
+ return parent;\r
+ }\r
+\r
/**\r
* remove property mapped given key.\r
*/\r
public void removeProperty(String key){\r
+ String old = properties.get(key);\r
properties.remove(key);\r
+ firePropertyEvent(new PropertyChangeEvent(this, key, old, null));\r
}\r
\r
/**\r
* add given property.\r
*/\r
public void addProperty(String key, String value){\r
+ String old = getProperty(key);\r
properties.put(key, value);\r
+ firePropertyEvent(new PropertyChangeEvent(this, key, old, value));\r
}\r
\r
/**\r
return value;\r
}\r
\r
+ /**\r
+ * fire property change event to listeners.\r
+ * @param e Event object.\r
+ */\r
+ private void firePropertyEvent(PropertyChangeEvent e){\r
+ for(PropertyChangeListener listener: propertyListeners){\r
+ listener.propertyChange(e);\r
+ }\r
+ }\r
+\r
+ /**\r
+ * add listener for updating properties.\r
+ */\r
+ public void addPropertyListener(PropertyChangeListener listener){\r
+ propertyListeners.add(listener);\r
+ }\r
+\r
+ /**\r
+ * remove specified listener.\r
+ */\r
+ public void removePropertyListener(PropertyChangeListener listener){\r
+ propertyListeners.remove(listener);\r
+ }\r
+\r
public void clearProperties(){\r
properties.clear();\r
}\r
/**\r
* returns the classpath context.\r
*/\r
- public ClasspathContext getBytecodeContext(){\r
+ public ClasspathContext getClasspathContext(){\r
return bytecodeContext;\r
}\r
\r
stigmata.configuration(commandLine.getOptionValue("config-file"));\r
context = stigmata.createContext();\r
\r
- addClasspath(context.getBytecodeContext(), commandLine);\r
+ addClasspath(context.getClasspathContext(), commandLine);\r
\r
String[] birthmarks = getTargetBirthmarks(commandLine);\r
String[] arguments = commandLine.getArgs();\r
private BirthmarkSet[] extractImpl(String[] birthmarks, String[] files, BirthmarkContext context) throws IOException, BirthmarkExtractionException{\r
List<ClassFileArchive> archives = new ArrayList<ClassFileArchive>();\r
List<BirthmarkSet> list = new ArrayList<BirthmarkSet>();\r
- ClasspathContext bytecode = context.getBytecodeContext();\r
+ ClasspathContext bytecode = context.getClasspathContext();\r
\r
for(int i = 0; i < files.length; i++){\r
if(files[i].endsWith(".class")){\r
c = Class.forName(extractor);\r
}\r
else{\r
- c = context.getBytecodeContext().findClass(extractor);\r
+ c = context.getClasspathContext().findClass(extractor);\r
}\r
extractorClass = c.asSubclass(BirthmarkExtractor.class);\r
extractorObject = null;\r
c = Class.forName(comparator);\r
}\r
else{\r
- c = context.getBytecodeContext().findClass(comparator);\r
+ c = context.getClasspathContext().findClass(comparator);\r
}\r
comparatorClass = c.asSubclass(BirthmarkComparator.class);\r
comparatorObject = null;\r
public void visit(int version, int access, String name, String signature,\r
String superName, String[] interfaces){\r
try {\r
- Class c = getContext().getBytecodeContext().findClass(name.replace('/', '.'));\r
+ Class c = getContext().getClasspathContext().findClass(name.replace('/', '.'));\r
if(c != null && !c.isInterface()){\r
addISBirthmark(c);\r
}\r
// check extractor/comparator classes are available\r
try{\r
flag = flag\r
- && context.getBytecodeContext().find(extractorClass) != null\r
- && context.getBytecodeContext().find(comparatorClass) != null;\r
+ && context.getClasspathContext().find(extractorClass) != null\r
+ && context.getClasspathContext().find(comparatorClass) != null;\r
} catch(ClassNotFoundException e){\r
flag = false;\r
}\r
\r
private boolean findClass(String className){\r
try{\r
- ClasspathContext b = stigmata.getStigmata().createContext().getBytecodeContext();\r
+ ClasspathContext b = stigmata.getStigmata().createContext().getClasspathContext();\r
ClasspathContext bytecode = new ClasspathContext(b);\r
String[] path = classpath.getValues();\r
for(String cp: path){\r
import javax.swing.JTable;\r
import javax.swing.table.DefaultTableCellRenderer;\r
\r
+import jp.naist.se.stigmata.BirthmarkContext;\r
+\r
/**\r
- * \r
- * \r
*\r
* @author Haruaki TAMADA\r
* @version $Revision$ $Date$\r
*/\r
public class CompareTableCellRenderer extends DefaultTableCellRenderer{\r
private static final long serialVersionUID = 234557758658567345L;\r
+ private static final double EPSILON = 1E-8d;\r
+\r
+ private BirthmarkContext context;\r
+\r
+ public CompareTableCellRenderer(BirthmarkContext context){\r
+ this.context = context;\r
+ }\r
\r
- public Component getTableCellRendererComponent(JTable table, Object obj,\r
- boolean isSelected, boolean hasForcus, int row, int cols){\r
- Object value = table.getValueAt(row, cols);\r
- Component c = super.getTableCellRendererComponent(table, obj, isSelected, hasForcus,\r
- row, cols);\r
+ public Component getTableCellRendererComponent(JTable table, Object obj, boolean isSelected,\r
+ boolean hasForcus, int row, int col){\r
+ Object value = table.getValueAt(row, col);\r
+ Component c = super.getTableCellRendererComponent(\r
+ table, obj, isSelected, hasForcus, row, col\r
+ );\r
if(value instanceof Double && !isSelected){\r
double d = ((Double)value).doubleValue();\r
- if(Math.abs(d - 1) < 1E-8){\r
- c.setBackground(Color.red);\r
- }\r
- else{\r
- c.setBackground(Color.white);\r
- }\r
- float ratio = Math.round(d * 10) / 10f;\r
- int color = Math.round(255 - (200 * ratio));\r
- c.setForeground(new Color(color, color, color));\r
+ int rank = 0;\r
+ if(d < EPSILON) rank = 0;\r
+ else if((d - 0.2d) < EPSILON) rank = 1;\r
+ else if((d - 0.4d) < EPSILON) rank = 2;\r
+ else if((d - 0.6d) < EPSILON) rank = 3;\r
+ else if((d - 0.8d) < EPSILON) rank = 4;\r
+ else if((d - 1.0d) < EPSILON) rank = 5;\r
+\r
+ c.setBackground(getBackgroundColor(rank, context));\r
+ c.setForeground(getForegroundColor(rank, context));\r
}\r
\r
return c;\r
}\r
+\r
+ public static Color getDefaultForegroundColor(int rank){\r
+ int c = 180 - ((180 / 5) * rank);\r
+ return new Color(c, c, c);\r
+ }\r
+\r
+ public static Color getDefaultBackgroundColor(int rank){\r
+ Color c;\r
+ switch(rank){\r
+ case 5:\r
+ c = Color.RED;\r
+ break;\r
+ case 0: case 1: case 2: case 3: case 4:\r
+ default:\r
+ c = Color.WHITE;\r
+ break;\r
+ }\r
+ return c;\r
+ }\r
+\r
+ public static Color getBackgroundColor(int rank, BirthmarkContext context){\r
+ Color c = getColor("backcolor_" + rank, context);\r
+ if(c == null){\r
+ return getDefaultBackgroundColor(rank);\r
+ }\r
+ return c;\r
+ }\r
+\r
+ public static Color getForegroundColor(int rank, BirthmarkContext context){\r
+ Color c = getColor("forecolor_" + rank, context);\r
+ if(c == null){\r
+ c = getDefaultForegroundColor(rank);\r
+ }\r
+ return c;\r
+ }\r
+\r
+ private static Color getColor(String key, BirthmarkContext context){\r
+ String v = context.getProperty(key);\r
+ try{\r
+ int color = Integer.parseInt(v, 16);\r
+\r
+ return new Color(\r
+ (color >>> 16) & 0xff, (color >>> 8) & 0xff, color & 0xff\r
+ );\r
+ } catch(NumberFormatException e){\r
+ return null;\r
+ }\r
+ }\r
}
\ No newline at end of file
private BirthmarkContext generateContext(){\r
BirthmarkContext context = stigmata.getStigmata().createContext();\r
// BirthmarkContext context2 = stigmata.getContext();\r
- ClasspathContext bytecode = context.getBytecodeContext();\r
+ ClasspathContext bytecode = context.getClasspathContext();\r
WellknownClassManager manager = context.getWellknownClassManager();\r
\r
classpath.updateClasspathContext(bytecode);\r
import java.text.MessageFormat;\r
\r
import javax.swing.JFileChooser;\r
-import javax.swing.JOptionPane;\r
import javax.swing.SwingUtilities;\r
import javax.swing.filechooser.FileFilter;\r
\r
return currentDirectory;\r
}\r
\r
- public void setCurrentDirectory(File directory){\r
+ public void setCurrentDirectory(File directory) throws IllegalArgumentException{\r
if(!directory.isDirectory()){\r
- JOptionPane.showMessageDialog(\r
- parent, \r
- Messages.getString("notdirectory.dialog.message", directory.getName()),\r
- Messages.getString("notdirectory.dialog.title"),\r
- JOptionPane.ERROR_MESSAGE\r
- );\r
- return;\r
+ throw new IllegalArgumentException(directory.getName() + " is not directory");\r
}\r
this.currentDirectory = directory;\r
}\r
\r
+ public File findFile(boolean open){\r
+ return findFile(open, new String[0], "");\r
+ }\r
+\r
public File findFile(boolean open, String[] exts, String desc){\r
JFileChooser chooser = new JFileChooser(getCurrentDirectory());\r
- for(int i = 0; i < exts.length; i++){\r
- chooser.addChoosableFileFilter(\r
- new ExtensionFilter(exts[i], MessageFormat.format(desc, exts[i]))\r
- );\r
+ if(exts != null){\r
+ MessageFormat formatter = new MessageFormat(desc);\r
+ for(int i = 0; i < exts.length; i++){\r
+ chooser.addChoosableFileFilter(\r
+ new ExtensionFilter(exts[i], formatter.format(exts[i]))\r
+ );\r
+ }\r
}\r
int returnValue = -1;\r
if(open){\r
import jp.naist.se.stigmata.format.FormatManager;\r
import jp.naist.se.stigmata.spi.ResultFormatSpi;\r
import jp.naist.se.stigmata.ui.swing.actions.SaveAction;\r
+import jp.naist.se.stigmata.ui.swing.actions.UpdateBirthmarkCellColorAction;\r
\r
/**\r
* \r
}\r
})\r
);\r
+ JButton updateColorButton = Utility.createButton(\r
+ "updatecellcolor", new UpdateBirthmarkCellColorAction(this, context)\r
+ );\r
JButton obfuscateButton = Utility.createButton("obfuscate");\r
JScrollPane scroll = new JScrollPane();\r
averageLabel = new JLabel(Double.toString(average), JLabel.RIGHT);\r
minimumLabel = new JLabel(Double.toString(minimum), JLabel.RIGHT);\r
\r
scroll.setViewportView(table);\r
- table.setDefaultRenderer(Double.class, new CompareTableCellRenderer());\r
+ table.setDefaultRenderer(Double.class, new CompareTableCellRenderer(context));\r
similarityPane.setBorder(new TitledBorder(Messages.getString("similarity.border")));\r
averageLabel.setBorder(new TitledBorder(Messages.getString("average.border")));\r
maximumLabel.setBorder(new TitledBorder(Messages.getString("maximum.border")));\r
buttonPanel.add(Box.createHorizontalGlue());\r
buttonPanel.add(saveButton);\r
buttonPanel.add(Box.createHorizontalGlue());\r
+ buttonPanel.add(updateColorButton);\r
+ buttonPanel.add(Box.createHorizontalGlue());\r
buttonPanel.add(obfuscateButton);\r
buttonPanel.add(Box.createHorizontalGlue());\r
\r
import java.awt.Insets;\r
import java.awt.event.ActionEvent;\r
import java.awt.event.ActionListener;\r
+import java.beans.PropertyChangeEvent;\r
+import java.beans.PropertyChangeListener;\r
import java.util.Iterator;\r
\r
import javax.swing.Box;\r
\r
private void initData(){\r
BirthmarkContext context = stigmata.getContext();\r
+ context.addPropertyListener(new PropertyChangeListener(){\r
+ public void propertyChange(PropertyChangeEvent evt){\r
+ String name = evt.getPropertyName();\r
+ String value = (String)evt.getNewValue();\r
+ if(value == null){\r
+ removeProperty(name);\r
+ }\r
+ else{\r
+ addOrUpdateProperty(name, value);\r
+ }\r
+ }\r
+ });\r
for(Iterator<String> i = context.propertyKeys(); i.hasNext(); ){\r
String key = i.next();\r
model.addRow(new Object[] { key, context.getProperty(key), });\r
}\r
}\r
\r
+ private void removeProperty(String name){\r
+ int index = findIndex(name);\r
+ if(index >= 0){\r
+ model.removeRow(index);\r
+ }\r
+ }\r
+\r
+ private void addOrUpdateProperty(String name, String value){\r
+ int index = findIndex(name);\r
+ if(index >= 0){\r
+ model.setValueAt(value, index, 1);\r
+ }\r
+ else{\r
+ model.addRow(new Object[] { name, value, });\r
+ }\r
+ }\r
+\r
+ private int findIndex(String name){\r
+ for(int i = 0; i < model.getRowCount(); i++){\r
+ String v = (String)model.getValueAt(i, 0);\r
+ if(v.equals(name)){\r
+ return i;\r
+ }\r
+ }\r
+ return -1;\r
+ }\r
+\r
private void addNewProperty(){\r
GridBagLayout layout = new GridBagLayout();\r
JPanel panel = new JPanel(layout);\r
import jp.naist.se.stigmata.format.FormatManager;\r
import jp.naist.se.stigmata.spi.ResultFormatSpi;\r
import jp.naist.se.stigmata.ui.swing.actions.SaveAction;\r
+import jp.naist.se.stigmata.ui.swing.actions.UpdateBirthmarkCellColorAction;\r
\r
/**\r
* \r
\r
model = new RoundRobinComparisonResultSetTableModel();\r
table = new JTable(model);\r
- table.setDefaultRenderer(Double.class, new CompareTableCellRenderer());\r
+ table.setDefaultRenderer(Double.class, new CompareTableCellRenderer(context));\r
table.addMouseListener(new MouseAdapter(){\r
public void mouseClicked(MouseEvent e){\r
if(e.getClickCount() == 2){\r
box1.add(distinctionRatio = new JLabel());\r
south.add(box1);\r
JPanel box2 = new JPanel(new GridLayout(1, 3));\r
- box2.setBorder(new TitledBorder(Messages.getString("similarity.border"))); //$NON-NLS-1$\r
+ box2.setBorder(new TitledBorder(Messages.getString("similarity.border")));\r
box2.add(average = new JLabel());\r
box2.add(minimum = new JLabel());\r
box2.add(maximum = new JLabel());\r
JButton graph = Utility.createButton("showgraph");\r
JButton obfuscate = Utility.createButton("obfuscate");\r
JButton compare = Utility.createButton("guessedpair");\r
+ JButton updateColor = Utility.createButton(\r
+ "updatecellcolor", new UpdateBirthmarkCellColorAction(this, context)\r
+ );\r
JMenuItem mdsMenu = Utility.createJMenuItem("mdsmap");\r
\r
PopupButton comparePopup = new PopupButton(compare);\r
southPanel.add(Box.createHorizontalGlue());\r
southPanel.add(save);\r
southPanel.add(Box.createHorizontalGlue());\r
+ southPanel.add(updateColor);\r
+ southPanel.add(Box.createHorizontalGlue());\r
southPanel.add(graphPopup);\r
southPanel.add(Box.createHorizontalGlue());\r
southPanel.add(obfuscate);\r
import java.io.IOException;\r
import java.io.PrintWriter;\r
import java.io.StringWriter;\r
-import java.util.ArrayList;\r
import java.util.HashMap;\r
-import java.util.List;\r
import java.util.Map;\r
\r
import javax.swing.JCheckBoxMenuItem;\r
public class StigmataFrame extends JFrame implements CurrentDirectoryHolder{\r
private static final long serialVersionUID = 92345543665342134L;\r
\r
- private static List<JFrame> frameList = new ArrayList<JFrame>();\r
private JTabbedPane tabPane;\r
private JMenuItem closeTabMenu;\r
private JCheckBoxMenuItem expertmodeMenu;\r
private BirthmarkContext context;\r
private ControlPane control;\r
private FileIOManager fileio;\r
- private int extractCount = 0;\r
- private int compareCount = 0;\r
- private int compareDetail = 0;\r
- private int similarityGraphCount = 0;\r
- private int mappingGraphCount = 0;\r
- private int comparePair = 0;\r
+ private Map<String, Integer> countmap = new HashMap<String, Integer>();\r
\r
public StigmataFrame(){\r
stigmata = Stigmata.getInstance();\r
}\r
\r
public void setCurrentDirectory(File file){\r
- fileio.setCurrentDirectory(file);\r
+ try{\r
+ fileio.setCurrentDirectory(file);\r
+ } catch(IllegalArgumentException e){\r
+ JOptionPane.showMessageDialog(\r
+ this,\r
+ Messages.getString("notdirectory.dialog.message", file.getName()),\r
+ Messages.getString("notdirectory.dialog.title"),\r
+ JOptionPane.ERROR_MESSAGE\r
+ );\r
+ } catch(Exception e){\r
+ showExceptionMessage(e);\r
+ }\r
}\r
\r
/**\r
PairComparisonPane detail = new PairComparisonPane(\r
this, new ComparisonPair(target1, target2, context)\r
);\r
- compareDetail++;\r
+ int compareDetail = getNextCount("compare_detail");\r
\r
Utility.addNewTab("comparedetail", tabPane, detail,\r
new Object[] { new Integer(compareDetail), },\r
BirthmarkSet[] y = stigmata.extract(birthmarks, targetY, context);\r
\r
RoundRobinComparisonResultPane compare = new RoundRobinComparisonResultPane(this, context, x, y);\r
- compareCount++;\r
+ int compareCount = getNextCount("compare");\r
Utility.addNewTab(\r
"compare", tabPane, compare,\r
new Object[] { new Integer(compareCount), },\r
\r
ComparisonResultSet resultset = stigmata.compare(x, y, context);\r
FilteredComparisonResultSet fcrs = new FilteredComparisonResultSet(resultset, filters);\r
- compareCount++;\r
+ int compareCount = getNextCount("compare");\r
Utility.addNewTab(\r
"compare", tabPane, new PairComparisonResultSetPane(this, fcrs),\r
new Object[] { new Integer(compareCount), },\r
try{\r
BirthmarkSet[] x = stigmata.extract(birthmarks, targetX, context);\r
BirthmarkSet[] y = stigmata.extract(birthmarks, targetY, context);\r
- comparePair++;\r
+ int comparePair = getNextCount("compare_pair");\r
\r
ComparisonResultSet resultset = new CertainPairComparisonResultSet(x, y, context);\r
Utility.addNewTab("comparepair", tabPane,\r
try{\r
BirthmarkSet[] x = stigmata.extract(birthmarks, targetX, context);\r
BirthmarkSet[] y = stigmata.extract(birthmarks, targetY, context);\r
- comparePair++;\r
+ int comparePair = getNextCount("compare_pair");\r
ComparisonResultSet resultset = new CertainPairComparisonResultSet(x, y, mapping, context);\r
\r
Utility.addNewTab(\r
}\r
\r
public void showComparisonResultSet(ComparisonResultSet resultset){\r
- comparePair++;\r
+ int comparePair = getNextCount("compare_pair");\r
Utility.addNewTab(\r
"comparisonresultset", tabPane,\r
new PairComparisonResultSetPane(this, resultset),\r
}\r
\r
public void showMDSGraph(BirthmarkSet[] set){\r
- MDSGraphPanel panel = new MDSGraphPanel(this, set, context);\r
- mappingGraphCount++;\r
- Utility.addNewTab("mappinggraph", tabPane, panel, new Object[] { new Integer(mappingGraphCount), }, null);\r
- tabPane.setSelectedIndex(tabPane.getTabCount() - 1);\r
+ try{\r
+ MDSGraphPanel panel = new MDSGraphPanel(this, set, context);\r
+ int mappingGraphCount = getNextCount("mds_graph");\r
+ Utility.addNewTab("mappinggraph", tabPane, panel, new Object[] { new Integer(mappingGraphCount), }, null);\r
+ tabPane.setSelectedIndex(tabPane.getTabCount() - 1);\r
+ } catch(Exception e){\r
+ showExceptionMessage(e);\r
+ }\r
}\r
\r
public void showSimilarityDistributionGraph(Map<Integer, Integer> distributions){\r
SimilarityDistributionGraphPane graph = new SimilarityDistributionGraphPane(this, distributions);\r
\r
- similarityGraphCount++;\r
+ int similarityGraphCount = getNextCount("similarity_graph");\r
Utility.addNewTab("similaritygraph", tabPane, graph, new Object[] { new Integer(similarityGraphCount), }, null);\r
tabPane.setSelectedIndex(tabPane.getTabCount() - 1);\r
}\r
\r
public void showExtractionResult(BirthmarkSet[] set, BirthmarkContext context){\r
- extractCount++;\r
+ int extractCount = getNextCount("extract");\r
BirthmarkExtractionResultPane viewer = new BirthmarkExtractionResultPane(this, context, set);\r
Utility.addNewTab(\r
"extract", tabPane, viewer,\r
tabPane.setSelectedIndex(tabPane.getTabCount() - 1);\r
\r
setSize(900, 600);\r
- frameList.add(this);\r
}\r
\r
private void initComponents(){\r
\r
newFrameMenu.addActionListener(new ActionListener(){\r
public void actionPerformed(ActionEvent evt){\r
- newFrameMenuActionPerformed(evt);\r
+ StigmataFrame frame = new StigmataFrame(stigmata, context);\r
+ frame.setVisible(true);\r
}\r
});\r
exportMenu.addActionListener(new ActionListener(){\r
\r
closeMenu.addActionListener(new ActionListener(){\r
public void actionPerformed(ActionEvent evt){\r
- closeMenuActionPerformed(evt);\r
+ setVisible(false);\r
+ dispose();\r
}\r
});\r
\r
}\r
}\r
\r
- private void closeMenuActionPerformed(ActionEvent evt){\r
- setVisible(false);\r
- dispose();\r
-\r
- frameList.remove(this);\r
- if(frameList.size() == 0){\r
- System.exit(1);\r
+ private int getNextCount(String label){\r
+ Integer i = countmap.get(label);\r
+ if(i == null){\r
+ i = new Integer(0);\r
}\r
- }\r
-\r
- private void newFrameMenuActionPerformed(ActionEvent evt){\r
- StigmataFrame frame = new StigmataFrame(stigmata, context);\r
- frame.setVisible(true);\r
+ i = i + 1;\r
+ countmap.put(label, i);\r
+ return i;\r
}\r
}\r
--- /dev/null
+package jp.naist.se.stigmata.ui.swing.actions;\r
+\r
+import java.awt.Color;\r
+import java.awt.Component;\r
+import java.awt.GridLayout;\r
+import java.awt.event.ActionEvent;\r
+import java.awt.event.ActionListener;\r
+\r
+import javax.swing.AbstractAction;\r
+import javax.swing.Box;\r
+import javax.swing.JButton;\r
+import javax.swing.JColorChooser;\r
+import javax.swing.JComponent;\r
+import javax.swing.JLabel;\r
+import javax.swing.JOptionPane;\r
+import javax.swing.JPanel;\r
+\r
+import jp.naist.se.stigmata.BirthmarkContext;\r
+import jp.naist.se.stigmata.ui.swing.CompareTableCellRenderer;\r
+import jp.naist.se.stigmata.ui.swing.Messages;\r
+import jp.naist.se.stigmata.ui.swing.Utility;\r
+\r
+public class UpdateBirthmarkCellColorAction extends AbstractAction{\r
+ private static final long serialVersionUID = 2390797591047570440L;\r
+\r
+ private Component parent;\r
+ private BirthmarkContext context;\r
+ private JColorChooser chooser;\r
+\r
+ public UpdateBirthmarkCellColorAction(Component parent, BirthmarkContext context){\r
+ this.parent = parent;\r
+ this.context = context;\r
+ }\r
+\r
+ public UpdateBirthmarkCellColorAction(Component parent){\r
+ this(parent, BirthmarkContext.getDefaultContext());\r
+ }\r
+\r
+ public void actionPerformed(ActionEvent e){\r
+ JComponent c = createPanel();\r
+ JOptionPane.showMessageDialog(\r
+ parent, c, Messages.getString("updatecellcolor.dialog.title"),\r
+ JOptionPane.INFORMATION_MESSAGE\r
+ );\r
+ }\r
+\r
+ private JComponent createPanel(){\r
+ Box panel = Box.createVerticalBox();\r
+ for(int i = 0; i <= 5; i++){\r
+ Color fore = CompareTableCellRenderer.getForegroundColor(i, context);\r
+ Color back = CompareTableCellRenderer.getBackgroundColor(i, context);\r
+\r
+ UpdateColorPane pane = new UpdateColorPane(i, fore, back);\r
+ panel.add(pane);\r
+ }\r
+\r
+ return panel;\r
+ }\r
+\r
+ private Color updateColor(Color c, int rank, boolean foreground){\r
+ if(chooser == null){\r
+ chooser = new JColorChooser();\r
+ }\r
+ chooser.setColor(c);\r
+ String l = Messages.getString((foreground? "forecolor_": "backcolor_") + rank + ".label");\r
+ int returnValue = JOptionPane.showConfirmDialog(\r
+ parent, chooser, Messages.getString("updatecell.title", l),\r
+ JOptionPane.INFORMATION_MESSAGE\r
+ );\r
+ if(returnValue == JOptionPane.OK_OPTION){\r
+ c = chooser.getColor();\r
+ }\r
+\r
+ return c;\r
+ }\r
+\r
+ private class UpdateColorPane extends JPanel{\r
+ private static final long serialVersionUID = 8271684478406307685L;\r
+\r
+ private int rank;\r
+ private JLabel label;\r
+\r
+ public UpdateColorPane(int rank, Color fore, Color back){\r
+ this.rank = rank;\r
+ initLayouts();\r
+\r
+ label.setForeground(fore);\r
+ label.setBackground(back);\r
+ }\r
+\r
+ public int getRank(){\r
+ return rank;\r
+ }\r
+\r
+ private void initLayouts(){\r
+ label = new JLabel(Messages.getString("rank_" + rank + ".label"));\r
+ label.setOpaque(true);\r
+ JButton fore = Utility.createButton("updatecellfore");\r
+ JButton back = Utility.createButton("updatecellback");\r
+\r
+ ActionListener listener = new ActionListener(){\r
+ public void actionPerformed(ActionEvent e){\r
+ String command = e.getActionCommand();\r
+ boolean foreground = command.equals("updatecellfore");\r
+\r
+ Color c = label.getBackground();\r
+ if(foreground){\r
+ c = label.getForeground();\r
+ }\r
+ c = updateColor(c, getRank(), foreground);\r
+ if(foreground){\r
+ label.setForeground(c);\r
+ context.addProperty(\r
+ "forecolor_" + getRank(), String.format("%06x", c.getRGB() & 0xffffff)\r
+ );\r
+ }\r
+ else{\r
+ label.setBackground(c);\r
+ context.addProperty(\r
+ "backcolor_" + getRank(), String.format("%06x", c.getRGB() & 0xffffff)\r
+ );\r
+ }\r
+ }\r
+ };\r
+ fore.addActionListener(listener);\r
+ back.addActionListener(listener);\r
+\r
+ setLayout(new GridLayout(1, 3));\r
+ add(label);\r
+ add(fore);\r
+ add(back);\r
+ }\r
+ }\r
+}\r
\r
private void exportClasspath(PrintWriter out) throws IOException{\r
out.println(" <classpath-list>");\r
- for(URL location: context.getBytecodeContext()){\r
+ for(URL location: context.getClasspathContext()){\r
out.printf(" <classpath>%s</classpath>%n", location.toString());\r
}\r
out.println(" </classpath-list>");\r
}\r
else if(part == Part.CLASSPATH && qname.equals("classpath")){\r
try{\r
- context.getBytecodeContext().addClasspath(\r
+ context.getClasspathContext().addClasspath(\r
new URL(value));\r
}catch(MalformedURLException e){\r
throw new SAXException(e);\r
target1.name.button.label=${target.TARGET1} class name\r
target2.name.button.label=${target.TARGET2} class name\r
both.name.button.label=${target.BOTH} class name\r
+\r
+################################################\r
+# update table cell color\r
+################################################\r
+\r
+updatecellcolor.button.label=Update Cell Color\r
+updatecellcolor.button.tooltip=Update table cell colors\r
+updatecellcolor.button.icon=color_swatch.png\r
+\r
+updatecellcolor.dialog.title=Update Color\r
+updatecellfore.button.label=Foreground...\r
+updatecellfore.button.tooltip=Update foreground color\r
+updatecellfore.button.icon=color_swatch.png\r
+updatecellback.button.label=Background...\r
+updatecellback.button.tooltip=Update background color\r
+updatecellback.button.icon=color_swatch.png\r
+\r
+forecolor_0.label=Foreground (similarity=0)\r
+backcolor_0.label=Background (similarity=0)\r
+forecolor_1.label=Foreground (0 < similarity <= 0.2)\r
+backcolor_1.label=Background (0 < similarity <= 0.2)\r
+forecolor_2.label=Foreground (0.2 < similarity <= 0.4)\r
+backcolor_2.label=Background (0.2 < similarity <= 0.4)\r
+forecolor_3.label=Foreground (0.4 < similarity <= 0.6)\r
+backcolor_3.label=Background (0.4 < similarity <= 0.6)\r
+forecolor_4.label=Foreground (0.6 < similarity <= 0.8)\r
+backcolor_4.label=Background (0.6 < similarity <= 0.8)\r
+forecolor_5.label=Foreground (0.8 < similarity <= 1.0)\r
+backcolor_5.label=Background (0.8 < similarity <= 1.0)\r
+\r
+updatecell.title=Update Color ({0})\r
+\r
+rank_0.label=Similarity: 0.0\r
+rank_1.label=Similarity: (0.0, 0.2]\r
+rank_2.label=Similarity: (0.2, 0.4]\r
+rank_3.label=Similarity: (0.4, 0.6]\r
+rank_4.label=Similarity: (0.6, 0.8]\r
+rank_5.label=Similarity: (0.8, 1.0]\r
+\r
target1.name.button.label=${target.TARGET1}\83N\83\89\83X\96¼\r
target2.name.button.label=${target.TARGET2}\83N\83\89\83X\96¼\r
both.name.button.label=${target.BOTH}\83N\83\89\83X\96¼\r
+\r
+################################################\r
+# update table cell color\r
+################################################\r
+\r
+updatecellcolor.button.label=\83Z\83\8b\90F\95Ï\8dX...\r
+updatecellcolor.button.tooltip=\95\\82Ì\83Z\83\8b\90F\82ð\95Ï\8dX\82µ\82Ü\82·\81D\r
+\r
+updatecellcolor.dialog.title=\90F\82Ì\95Ï\8dX\r
+updatecellfore.button.label=\95¶\8e\9a\90F...\r
+updatecellfore.button.tooltip=\95¶\8e\9a\90F\82ð\95Ï\8dX\82µ\82Ü\82·\81D\r
+updatecellback.button.label=\94w\8ci\90F...\r
+updatecellback.button.tooltip=\94w\8ci\90F\82ð\95Ï\8dX\82µ\82Ü\82·\81D\r
+\r
+forecolor_0.label=\95¶\8e\9a\90F (\97Þ\8e\97\93x=0)\r
+backcolor_0.label=\94w\8ci\90F (\97Þ\8e\97\93x=0)\r
+forecolor_1.label=\95¶\8e\9a\90F (0 < \97Þ\8e\97\93x <= 0.2)\r
+backcolor_1.label=\94w\8ci\90F (0 < \97Þ\8e\97\93x <= 0.2)\r
+forecolor_2.label=\95¶\8e\9a\90F (0.2 < \97Þ\8e\97\93x <= 0.4)\r
+backcolor_2.label=\94w\8ci\90F (0.2 < \97Þ\8e\97\93x <= 0.4)\r
+forecolor_3.label=\95¶\8e\9a\90F (0.4 < \97Þ\8e\97\93x <= 0.6)\r
+backcolor_3.label=\94w\8ci\90F (0.4 < \97Þ\8e\97\93x <= 0.6)\r
+forecolor_4.label=\95¶\8e\9a\90F (0.6 < \97Þ\8e\97\93x <= 0.8)\r
+backcolor_4.label=\94w\8ci\90F (0.6 < \97Þ\8e\97\93x <= 0.8)\r
+forecolor_5.label=\95¶\8e\9a\90F (0.8 < \97Þ\8e\97\93x <= 1.0)\r
+backcolor_5.label=\94w\8ci\90F (0.8 < \97Þ\8e\97\93x <= 1.0)\r
+\r
+updatecell.title=\90F\82Ì\8dX\90V ({0})\r
+\r
+rank_0.label=\97Þ\8e\97\93x: 0.0\r
+rank_1.label=\97Þ\8e\97\93x: (0.0, 0.2]\r
+rank_2.label=\97Þ\8e\97\93x: (0.2, 0.4]\r
+rank_3.label=\97Þ\8e\97\93x: (0.4, 0.6]\r
+rank_4.label=\97Þ\8e\97\93x: (0.6, 0.8]\r
+rank_5.label=\97Þ\8e\97\93x: (0.8, 1.0]\r
+\r