1 package jp.sourceforge.stigmata.ui.swing;
7 import java.awt.BorderLayout;
8 import java.awt.GridLayout;
9 import java.awt.event.ActionEvent;
10 import java.awt.event.ActionListener;
11 import java.awt.event.MouseAdapter;
12 import java.awt.event.MouseEvent;
14 import java.io.IOException;
15 import java.io.PrintWriter;
16 import java.util.ArrayList;
17 import java.util.Iterator;
18 import java.util.List;
20 import javax.swing.Box;
21 import javax.swing.JButton;
22 import javax.swing.JComponent;
23 import javax.swing.JLabel;
24 import javax.swing.JOptionPane;
25 import javax.swing.JPanel;
26 import javax.swing.JScrollPane;
27 import javax.swing.JTable;
28 import javax.swing.border.TitledBorder;
29 import javax.swing.table.DefaultTableModel;
31 import jp.sourceforge.stigmata.BirthmarkContext;
32 import jp.sourceforge.stigmata.BirthmarkSet;
33 import jp.sourceforge.stigmata.ComparisonPair;
34 import jp.sourceforge.stigmata.ComparisonResultSet;
35 import jp.sourceforge.stigmata.printer.PrinterManager;
36 import jp.sourceforge.stigmata.result.CertainPairComparisonResultSet;
37 import jp.sourceforge.stigmata.spi.ResultPrinterSpi;
38 import jp.sourceforge.stigmata.ui.swing.actions.SaveAction;
39 import jp.sourceforge.stigmata.ui.swing.actions.UpdateBirthmarkCellColorAction;
40 import jp.sourceforge.stigmata.utils.AsciiDataWritable;
45 * @author Haruaki TAMADA
46 * @version $Revision$ $Date$
48 public class PairComparisonResultSetPane extends JPanel{
49 private static final long serialVersionUID = 3298346465652354302L;
51 private StigmataFrame frame;
52 private ComparisonResultSet comparison;
53 private DefaultTableModel model = new PairComparisonResultSetTableModel();
54 private JTable table = new JTable(model);
55 private JLabel averageLabel, maximumLabel, minimumLabel;
56 private double average, maximum, minimum;
58 public PairComparisonResultSetPane(StigmataFrame frame, ComparisonResultSet resultset){
60 this.comparison = resultset;
63 initData(model, resultset);
66 private void obfuscateClassNames(){
67 ClassNameObfuscator obfuscator = new ClassNameObfuscator();
68 List<ComparisonPair> newList = new ArrayList<ComparisonPair>();
69 BirthmarkContext context = comparison.getContext();
71 for(Iterator<ComparisonPair> i = comparison.iterator(); i.hasNext(); ){
72 ComparisonPair pair = i.next();
73 BirthmarkSet set1 = obfuscator.obfuscateClassName(pair.getTarget1());
74 BirthmarkSet set2 = obfuscator.obfuscateClassName(pair.getTarget2());
76 context = comparison.getContext();
77 newList.add(new ComparisonPair(set1, set2, context));
81 File file = frame.getSaveFile(frame.getMessages().getArray("obfuscationmapping.extension"),
82 frame.getMessages().get("obfuscationmapping.description"));
86 obfuscator.outputNameMappings(file);
87 }catch(IOException e){
88 JOptionPane.showMessageDialog(
89 this, e.getMessage(), frame.getMessages().get("error.dialog.title"),
90 JOptionPane.ERROR_MESSAGE
95 DefaultTableModel newModel = new PairComparisonResultSetTableModel();
96 initData(newModel, new CertainPairComparisonResultSet(newList.toArray(new ComparisonPair[newList.size()]), context));
98 table.setModel(newModel);
101 private void initData(DefaultTableModel model, ComparisonResultSet comparison){
105 model.setColumnIdentifiers(frame.getMessages().getArray("comparepair.table.columns"));
107 for(Iterator<ComparisonPair> i = comparison.iterator(); i.hasNext(); ){
108 ComparisonPair pair = i.next();
109 double similarity = pair.calculateSimilarity();
110 if(similarity > maximum) maximum = similarity;
111 if(similarity < minimum) minimum = similarity;
112 average += similarity;
114 model.addRow(new Object[] { pair.getTarget1().getName(),
115 pair.getTarget2().getName(), new Double(similarity) });
117 average = average / comparison.getPairCount();
119 averageLabel.setText(Double.toString(average));
120 maximumLabel.setText(Double.toString(maximum));
121 minimumLabel.setText(Double.toString(minimum));
124 private void initComponent(){
125 JComponent buttonPanel = Box.createHorizontalBox();
126 JPanel similarityPane = new JPanel(new GridLayout(1, 3));
127 JComponent southPanel = Box.createVerticalBox();
128 JButton saveButton = GUIUtility.createButton(
129 frame.getMessages(), "savecomparison", new SaveAction(frame, new AsciiDataWritable(){
130 public void writeAsciiData(PrintWriter out, String format) throws IOException{
131 ResultPrinterSpi service = PrinterManager.getInstance().getService(format);
133 service = PrinterManager.getDefaultFormatService();
135 service.getComparisonResultSetPrinter().printResult(out, comparison);
139 JButton updateColorButton = GUIUtility.createButton(
140 frame.getMessages(), "updatecellcolor", new UpdateBirthmarkCellColorAction(frame, comparison.getEnvironment())
142 JButton obfuscateButton = GUIUtility.createButton(frame.getMessages(), "obfuscate");
143 JScrollPane scroll = new JScrollPane();
144 averageLabel = new JLabel(Double.toString(average), JLabel.RIGHT);
145 maximumLabel = new JLabel(Double.toString(maximum), JLabel.RIGHT);
146 minimumLabel = new JLabel(Double.toString(minimum), JLabel.RIGHT);
148 scroll.setViewportView(table);
149 table.setDefaultRenderer(Double.class, new CompareTableCellRenderer(comparison.getEnvironment()));
150 similarityPane.setBorder(new TitledBorder(frame.getMessages().get("similarity.border")));
151 averageLabel.setBorder(new TitledBorder(frame.getMessages().get("average.border")));
152 maximumLabel.setBorder(new TitledBorder(frame.getMessages().get("maximum.border")));
153 minimumLabel.setBorder(new TitledBorder(frame.getMessages().get("minimum.border")));
155 setLayout(new BorderLayout());
156 add(scroll, BorderLayout.CENTER);
157 add(southPanel, BorderLayout.SOUTH);
158 similarityPane.add(averageLabel);
159 similarityPane.add(maximumLabel);
160 similarityPane.add(minimumLabel);
161 southPanel.add(similarityPane);
162 southPanel.add(buttonPanel);
163 buttonPanel.add(Box.createHorizontalGlue());
164 buttonPanel.add(saveButton);
165 buttonPanel.add(Box.createHorizontalGlue());
166 buttonPanel.add(updateColorButton);
167 buttonPanel.add(Box.createHorizontalGlue());
168 buttonPanel.add(obfuscateButton);
169 buttonPanel.add(Box.createHorizontalGlue());
171 table.addMouseListener(new MouseAdapter(){
172 public void mouseClicked(MouseEvent e){
173 if(e.getClickCount() == 2){
174 int row = table.rowAtPoint(e.getPoint());
175 int col = table.columnAtPoint(e.getPoint());
176 if(col >= 1 && col < table.getColumnCount() && row >= 0
177 && row < table.getRowCount()){
178 ComparisonPair pair = comparison.getPairAt(row);
180 frame.compareDetails(pair.getTarget1(), pair.getTarget2(), comparison.getContext());
186 obfuscateButton.addActionListener(new ActionListener(){
187 public void actionPerformed(ActionEvent e){
188 obfuscateClassNames();
193 private static class PairComparisonResultSetTableModel extends DefaultTableModel{
194 private static final long serialVersionUID = 93457234571623497L;
197 public boolean isCellEditable(int row, int column){
202 public Class<?> getColumnClass(int column){