1 package jp.sourceforge.stigmata.ui.swing;
3 import java.awt.BorderLayout;
4 import java.awt.GridLayout;
5 import java.awt.event.ActionEvent;
6 import java.awt.event.ActionListener;
7 import java.awt.event.MouseAdapter;
8 import java.awt.event.MouseEvent;
10 import java.io.IOException;
11 import java.io.PrintWriter;
12 import java.util.ArrayList;
13 import java.util.Iterator;
14 import java.util.List;
16 import javax.swing.Box;
17 import javax.swing.JButton;
18 import javax.swing.JComponent;
19 import javax.swing.JLabel;
20 import javax.swing.JOptionPane;
21 import javax.swing.JPanel;
22 import javax.swing.JScrollPane;
23 import javax.swing.JTable;
24 import javax.swing.border.TitledBorder;
25 import javax.swing.table.DefaultTableModel;
27 import jp.sourceforge.stigmata.BirthmarkContext;
28 import jp.sourceforge.stigmata.BirthmarkSet;
29 import jp.sourceforge.stigmata.ComparisonPair;
30 import jp.sourceforge.stigmata.ComparisonResultSet;
31 import jp.sourceforge.stigmata.printer.PrinterManager;
32 import jp.sourceforge.stigmata.result.CertainPairComparisonResultSet;
33 import jp.sourceforge.stigmata.spi.ResultPrinterService;
34 import jp.sourceforge.stigmata.ui.swing.actions.SaveAction;
35 import jp.sourceforge.stigmata.ui.swing.actions.UpdateBirthmarkCellColorAction;
36 import jp.sourceforge.stigmata.utils.AsciiDataWritable;
41 * @author Haruaki TAMADA
43 public class PairComparisonResultSetPane extends JPanel{
44 private static final long serialVersionUID = 3298346465652354302L;
46 private StigmataFrame frame;
47 private ComparisonResultSet comparison;
48 private DefaultTableModel model = new PairComparisonResultSetTableModel();
49 private JTable table = new JTable(model);
50 private JLabel averageLabel, maximumLabel, minimumLabel;
51 private double average, maximum, minimum;
53 public PairComparisonResultSetPane(StigmataFrame frame, ComparisonResultSet resultset){
55 this.comparison = resultset;
58 initData(model, resultset);
61 private void obfuscateClassNames(){
62 ClassNameObfuscator obfuscator = new ClassNameObfuscator();
63 List<ComparisonPair> newList = new ArrayList<ComparisonPair>();
64 BirthmarkContext context = comparison.getContext();
66 for(Iterator<ComparisonPair> i = comparison.iterator(); i.hasNext(); ){
67 ComparisonPair pair = i.next();
68 BirthmarkSet set1 = obfuscator.obfuscateClassName(pair.getTarget1());
69 BirthmarkSet set2 = obfuscator.obfuscateClassName(pair.getTarget2());
71 context = comparison.getContext();
72 newList.add(new ComparisonPair(set1, set2, context));
76 File file = frame.getSaveFile(frame.getMessages().getArray("obfuscationmapping.extension"),
77 frame.getMessages().get("obfuscationmapping.description"));
81 obfuscator.outputNameMappings(file);
82 }catch(IOException e){
83 JOptionPane.showMessageDialog(
84 this, e.getMessage(), frame.getMessages().get("error.dialog.title"),
85 JOptionPane.ERROR_MESSAGE
90 DefaultTableModel newModel = new PairComparisonResultSetTableModel();
91 initData(newModel, new CertainPairComparisonResultSet(newList.toArray(new ComparisonPair[newList.size()]), context));
93 table.setModel(newModel);
96 private void initData(DefaultTableModel model, ComparisonResultSet comparison){
100 model.setColumnIdentifiers(frame.getMessages().getArray("comparepair.table.columns"));
102 for(Iterator<ComparisonPair> i = comparison.iterator(); i.hasNext(); ){
103 ComparisonPair pair = i.next();
104 double similarity = pair.calculateSimilarity();
105 if(similarity > maximum) maximum = similarity;
106 if(similarity < minimum) minimum = similarity;
107 average += similarity;
109 model.addRow(new Object[] { pair.getTarget1().getName(),
110 pair.getTarget2().getName(), new Double(similarity) });
112 average = average / comparison.getPairCount();
114 averageLabel.setText(Double.toString(average));
115 maximumLabel.setText(Double.toString(maximum));
116 minimumLabel.setText(Double.toString(minimum));
119 private void initComponent(){
120 JComponent buttonPanel = Box.createHorizontalBox();
121 JPanel similarityPane = new JPanel(new GridLayout(1, 3));
122 JComponent southPanel = Box.createVerticalBox();
123 JButton saveButton = GUIUtility.createButton(
124 frame.getMessages(), "savecomparison", new SaveAction(frame, new AsciiDataWritable(){
126 public void writeAsciiData(PrintWriter out, String format) throws IOException{
127 ResultPrinterService service = PrinterManager.getInstance().getService(format);
129 service = PrinterManager.getDefaultFormatService();
131 service.getComparisonResultSetPrinter().printResult(out, comparison);
135 JButton updateColorButton = GUIUtility.createButton(
136 frame.getMessages(), "updatecellcolor", new UpdateBirthmarkCellColorAction(frame, comparison.getEnvironment())
138 JButton obfuscateButton = GUIUtility.createButton(frame.getMessages(), "obfuscate");
139 JScrollPane scroll = new JScrollPane();
140 averageLabel = new JLabel(Double.toString(average), JLabel.RIGHT);
141 maximumLabel = new JLabel(Double.toString(maximum), JLabel.RIGHT);
142 minimumLabel = new JLabel(Double.toString(minimum), JLabel.RIGHT);
144 scroll.setViewportView(table);
145 table.setDefaultRenderer(Double.class, new CompareTableCellRenderer(comparison.getEnvironment()));
146 similarityPane.setBorder(new TitledBorder(frame.getMessages().get("similarity.border")));
147 averageLabel.setBorder(new TitledBorder(frame.getMessages().get("average.border")));
148 maximumLabel.setBorder(new TitledBorder(frame.getMessages().get("maximum.border")));
149 minimumLabel.setBorder(new TitledBorder(frame.getMessages().get("minimum.border")));
151 setLayout(new BorderLayout());
152 add(scroll, BorderLayout.CENTER);
153 add(southPanel, BorderLayout.SOUTH);
154 similarityPane.add(averageLabel);
155 similarityPane.add(maximumLabel);
156 similarityPane.add(minimumLabel);
157 southPanel.add(similarityPane);
158 southPanel.add(buttonPanel);
159 buttonPanel.add(Box.createHorizontalGlue());
160 buttonPanel.add(saveButton);
161 buttonPanel.add(Box.createHorizontalGlue());
162 buttonPanel.add(updateColorButton);
163 buttonPanel.add(Box.createHorizontalGlue());
164 buttonPanel.add(obfuscateButton);
165 buttonPanel.add(Box.createHorizontalGlue());
167 table.addMouseListener(new MouseAdapter(){
169 public void mouseClicked(MouseEvent e){
170 if(e.getClickCount() == 2){
171 int row = table.rowAtPoint(e.getPoint());
172 int col = table.columnAtPoint(e.getPoint());
173 if(col >= 1 && col < table.getColumnCount() && row >= 0
174 && row < table.getRowCount()){
175 ComparisonPair pair = comparison.getPairAt(row);
177 frame.compareDetails(pair.getTarget1(), pair.getTarget2(), comparison.getContext());
183 obfuscateButton.addActionListener(new ActionListener(){
185 public void actionPerformed(ActionEvent e){
186 obfuscateClassNames();
191 private static class PairComparisonResultSetTableModel extends DefaultTableModel{
192 private static final long serialVersionUID = 93457234571623497L;
195 public boolean isCellEditable(int row, int column){
200 public Class<?> getColumnClass(int column){