1 package jp.naist.se.stigmata.ui.swing;
\r
7 import java.awt.BorderLayout;
\r
8 import java.awt.GridLayout;
\r
9 import java.awt.event.ActionEvent;
\r
10 import java.awt.event.ActionListener;
\r
11 import java.awt.event.MouseAdapter;
\r
12 import java.awt.event.MouseEvent;
\r
13 import java.io.File;
\r
14 import java.io.IOException;
\r
15 import java.io.PrintWriter;
\r
16 import java.util.ArrayList;
\r
17 import java.util.List;
\r
19 import javax.swing.Box;
\r
20 import javax.swing.JButton;
\r
21 import javax.swing.JComponent;
\r
22 import javax.swing.JLabel;
\r
23 import javax.swing.JOptionPane;
\r
24 import javax.swing.JPanel;
\r
25 import javax.swing.JScrollPane;
\r
26 import javax.swing.JTable;
\r
27 import javax.swing.border.TitledBorder;
\r
28 import javax.swing.table.DefaultTableModel;
\r
30 import jp.naist.se.stigmata.BirthmarkEnvironment;
\r
31 import jp.naist.se.stigmata.BirthmarkSet;
\r
32 import jp.naist.se.stigmata.CertainPairComparisonResultSet;
\r
33 import jp.naist.se.stigmata.ComparisonPair;
\r
34 import jp.naist.se.stigmata.ComparisonResultSet;
\r
35 import jp.naist.se.stigmata.format.FormatManager;
\r
36 import jp.naist.se.stigmata.spi.ResultFormatSpi;
\r
37 import jp.naist.se.stigmata.ui.swing.actions.SaveAction;
\r
38 import jp.naist.se.stigmata.ui.swing.actions.UpdateBirthmarkCellColorAction;
\r
39 import jp.naist.se.stigmata.utils.AsciiDataWritable;
\r
44 * @author Haruaki TAMADA
\r
45 * @version $Revision$ $Date$
\r
47 public class PairComparisonResultSetPane extends JPanel{
\r
48 private static final long serialVersionUID = 3298346465652354302L;
\r
50 private StigmataFrame frame;
\r
51 private BirthmarkEnvironment context;
\r
52 private DefaultTableModel model = new PairComparisonResultSetTableModel();
\r
53 private JTable table = new JTable(model);
\r
54 private JLabel averageLabel, maximumLabel, minimumLabel;
\r
55 private List<ComparisonPair> list = new ArrayList<ComparisonPair>();
\r
56 private double average, maximum, minimum;
\r
58 public PairComparisonResultSetPane(StigmataFrame frame, ComparisonResultSet resultset){
\r
60 this.context = resultset.getContext();
\r
62 for(ComparisonPair pair: resultset){
\r
67 initData(model, list);
\r
70 private void obfuscateClassNames(){
\r
71 ClassNameObfuscator obfuscator = new ClassNameObfuscator();
\r
72 List<ComparisonPair> newList = new ArrayList<ComparisonPair>();
\r
73 for(ComparisonPair pair: list){
\r
74 BirthmarkSet set1 = obfuscator.obfuscateClassName(pair.getTarget1());
\r
75 BirthmarkSet set2 = obfuscator.obfuscateClassName(pair.getTarget2());
\r
77 newList.add(new ComparisonPair(set1, set2, context));
\r
81 File file = frame.getSaveFile(Messages.getStringArray("obfuscationmapping.extension"),
\r
82 Messages.getString("obfuscationmapping.description"));
\r
86 obfuscator.outputNameMappings(file);
\r
87 }catch(IOException e){
\r
88 JOptionPane.showMessageDialog(
\r
89 this, e.getMessage(), Messages.getString("error.dialog.title"),
\r
90 JOptionPane.ERROR_MESSAGE
\r
95 DefaultTableModel newModel = new PairComparisonResultSetTableModel();
\r
96 initData(newModel, newList);
\r
99 table.setModel(newModel);
\r
102 private void initData(DefaultTableModel model, List<ComparisonPair> list){
\r
106 model.setColumnIdentifiers(Messages.getStringArray("comparepair.table.columns"));
\r
108 for(ComparisonPair pair: list){
\r
109 double similarity = pair.calculateSimilarity();
\r
110 if(similarity > maximum) maximum = similarity;
\r
111 if(similarity < minimum) minimum = similarity;
\r
112 average += similarity;
\r
114 model.addRow(new Object[] { pair.getTarget1().getName(),
\r
115 pair.getTarget2().getName(), new Double(similarity) });
\r
117 average = average / list.size();
\r
119 averageLabel.setText(Double.toString(average));
\r
120 maximumLabel.setText(Double.toString(maximum));
\r
121 minimumLabel.setText(Double.toString(minimum));
\r
124 private void initComponent(){
\r
125 JComponent buttonPanel = Box.createHorizontalBox();
\r
126 JPanel similarityPane = new JPanel(new GridLayout(1, 3));
\r
127 JComponent southPanel = Box.createVerticalBox();
\r
128 JButton saveButton = Utility.createButton(
\r
129 "savecomparison", new SaveAction(frame, new AsciiDataWritable(){
\r
130 public void writeAsciiData(PrintWriter out, String format) throws IOException{
\r
131 ResultFormatSpi service = FormatManager.getInstance().getService(format);
\r
132 if(service == null){
\r
133 service = FormatManager.getDefaultFormatService();
\r
135 service.getComparisonResultFormat().printResult(
\r
136 out, new CertainPairComparisonResultSet(
\r
137 list.toArray(new ComparisonPair[list.size()]), context
\r
143 JButton updateColorButton = Utility.createButton(
\r
144 "updatecellcolor", new UpdateBirthmarkCellColorAction(this, context)
\r
146 JButton obfuscateButton = Utility.createButton("obfuscate");
\r
147 JScrollPane scroll = new JScrollPane();
\r
148 averageLabel = new JLabel(Double.toString(average), JLabel.RIGHT);
\r
149 maximumLabel = new JLabel(Double.toString(maximum), JLabel.RIGHT);
\r
150 minimumLabel = new JLabel(Double.toString(minimum), JLabel.RIGHT);
\r
152 scroll.setViewportView(table);
\r
153 table.setDefaultRenderer(Double.class, new CompareTableCellRenderer(context));
\r
154 similarityPane.setBorder(new TitledBorder(Messages.getString("similarity.border")));
\r
155 averageLabel.setBorder(new TitledBorder(Messages.getString("average.border")));
\r
156 maximumLabel.setBorder(new TitledBorder(Messages.getString("maximum.border")));
\r
157 minimumLabel.setBorder(new TitledBorder(Messages.getString("minimum.border")));
\r
159 setLayout(new BorderLayout());
\r
160 add(scroll, BorderLayout.CENTER);
\r
161 add(southPanel, BorderLayout.SOUTH);
\r
162 similarityPane.add(averageLabel);
\r
163 similarityPane.add(maximumLabel);
\r
164 similarityPane.add(minimumLabel);
\r
165 southPanel.add(similarityPane);
\r
166 southPanel.add(buttonPanel);
\r
167 buttonPanel.add(Box.createHorizontalGlue());
\r
168 buttonPanel.add(saveButton);
\r
169 buttonPanel.add(Box.createHorizontalGlue());
\r
170 buttonPanel.add(updateColorButton);
\r
171 buttonPanel.add(Box.createHorizontalGlue());
\r
172 buttonPanel.add(obfuscateButton);
\r
173 buttonPanel.add(Box.createHorizontalGlue());
\r
175 table.addMouseListener(new MouseAdapter(){
\r
176 public void mouseClicked(MouseEvent e){
\r
177 if(e.getClickCount() == 2){
\r
178 int row = table.rowAtPoint(e.getPoint());
\r
179 int col = table.columnAtPoint(e.getPoint());
\r
180 if(col >= 1 && col < table.getColumnCount() && row >= 0
\r
181 && row < table.getRowCount()){
\r
182 ComparisonPair pair = list.get(row);
\r
184 frame.compareDetails(pair.getTarget1(), pair.getTarget2(), context);
\r
190 obfuscateButton.addActionListener(new ActionListener(){
\r
191 public void actionPerformed(ActionEvent e){
\r
192 obfuscateClassNames();
\r
197 private static class PairComparisonResultSetTableModel extends DefaultTableModel{
\r
198 private static final long serialVersionUID = 93457234571623497L;
\r
201 public boolean isCellEditable(int row, int column){
\r
206 public Class<?> getColumnClass(int column){
\r
208 return Double.class;
\r
211 return String.class;
\r