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.Iterator;
\r
18 import java.util.List;
\r
20 import javax.swing.Box;
\r
21 import javax.swing.JButton;
\r
22 import javax.swing.JComponent;
\r
23 import javax.swing.JLabel;
\r
24 import javax.swing.JOptionPane;
\r
25 import javax.swing.JPanel;
\r
26 import javax.swing.JScrollPane;
\r
27 import javax.swing.JTable;
\r
28 import javax.swing.border.TitledBorder;
\r
29 import javax.swing.table.DefaultTableModel;
\r
31 import jp.naist.se.stigmata.BirthmarkContext;
\r
32 import jp.naist.se.stigmata.BirthmarkSet;
\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.result.CertainPairComparisonResultSet;
\r
37 import jp.naist.se.stigmata.spi.ResultFormatSpi;
\r
38 import jp.naist.se.stigmata.ui.swing.actions.SaveAction;
\r
39 import jp.naist.se.stigmata.ui.swing.actions.UpdateBirthmarkCellColorAction;
\r
40 import jp.naist.se.stigmata.utils.AsciiDataWritable;
\r
45 * @author Haruaki TAMADA
\r
46 * @version $Revision$ $Date$
\r
48 public class PairComparisonResultSetPane extends JPanel{
\r
49 private static final long serialVersionUID = 3298346465652354302L;
\r
51 private StigmataFrame frame;
\r
52 private ComparisonResultSet comparison;
\r
53 private DefaultTableModel model = new PairComparisonResultSetTableModel();
\r
54 private JTable table = new JTable(model);
\r
55 private JLabel averageLabel, maximumLabel, minimumLabel;
\r
56 private double average, maximum, minimum;
\r
58 public PairComparisonResultSetPane(StigmataFrame frame, ComparisonResultSet resultset){
\r
60 this.comparison = resultset;
\r
63 initData(model, resultset);
\r
66 private void obfuscateClassNames(){
\r
67 ClassNameObfuscator obfuscator = new ClassNameObfuscator();
\r
68 List<ComparisonPair> newList = new ArrayList<ComparisonPair>();
\r
69 BirthmarkContext context = comparison.getContext();
\r
71 for(Iterator<ComparisonPair> i = comparison.iterator(); i.hasNext(); ){
\r
72 ComparisonPair pair = i.next();
\r
73 BirthmarkSet set1 = obfuscator.obfuscateClassName(pair.getTarget1());
\r
74 BirthmarkSet set2 = obfuscator.obfuscateClassName(pair.getTarget2());
\r
76 context = comparison.getContext();
\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, new CertainPairComparisonResultSet(newList.toArray(new ComparisonPair[newList.size()]), context));
\r
98 table.setModel(newModel);
\r
101 private void initData(DefaultTableModel model, ComparisonResultSet comparison){
\r
105 model.setColumnIdentifiers(Messages.getStringArray("comparepair.table.columns"));
\r
107 for(Iterator<ComparisonPair> i = comparison.iterator(); i.hasNext(); ){
\r
108 ComparisonPair pair = i.next();
\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 / comparison.getPairCount();
\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(out, comparison);
\r
139 JButton updateColorButton = Utility.createButton(
\r
140 "updatecellcolor", new UpdateBirthmarkCellColorAction(this, comparison.getEnvironment())
\r
142 JButton obfuscateButton = Utility.createButton("obfuscate");
\r
143 JScrollPane scroll = new JScrollPane();
\r
144 averageLabel = new JLabel(Double.toString(average), JLabel.RIGHT);
\r
145 maximumLabel = new JLabel(Double.toString(maximum), JLabel.RIGHT);
\r
146 minimumLabel = new JLabel(Double.toString(minimum), JLabel.RIGHT);
\r
148 scroll.setViewportView(table);
\r
149 table.setDefaultRenderer(Double.class, new CompareTableCellRenderer(comparison.getEnvironment()));
\r
150 similarityPane.setBorder(new TitledBorder(Messages.getString("similarity.border")));
\r
151 averageLabel.setBorder(new TitledBorder(Messages.getString("average.border")));
\r
152 maximumLabel.setBorder(new TitledBorder(Messages.getString("maximum.border")));
\r
153 minimumLabel.setBorder(new TitledBorder(Messages.getString("minimum.border")));
\r
155 setLayout(new BorderLayout());
\r
156 add(scroll, BorderLayout.CENTER);
\r
157 add(southPanel, BorderLayout.SOUTH);
\r
158 similarityPane.add(averageLabel);
\r
159 similarityPane.add(maximumLabel);
\r
160 similarityPane.add(minimumLabel);
\r
161 southPanel.add(similarityPane);
\r
162 southPanel.add(buttonPanel);
\r
163 buttonPanel.add(Box.createHorizontalGlue());
\r
164 buttonPanel.add(saveButton);
\r
165 buttonPanel.add(Box.createHorizontalGlue());
\r
166 buttonPanel.add(updateColorButton);
\r
167 buttonPanel.add(Box.createHorizontalGlue());
\r
168 buttonPanel.add(obfuscateButton);
\r
169 buttonPanel.add(Box.createHorizontalGlue());
\r
171 table.addMouseListener(new MouseAdapter(){
\r
172 public void mouseClicked(MouseEvent e){
\r
173 if(e.getClickCount() == 2){
\r
174 int row = table.rowAtPoint(e.getPoint());
\r
175 int col = table.columnAtPoint(e.getPoint());
\r
176 if(col >= 1 && col < table.getColumnCount() && row >= 0
\r
177 && row < table.getRowCount()){
\r
178 ComparisonPair pair = comparison.getPairAt(row);
\r
180 frame.compareDetails(pair.getTarget1(), pair.getTarget2(), comparison.getContext());
\r
186 obfuscateButton.addActionListener(new ActionListener(){
\r
187 public void actionPerformed(ActionEvent e){
\r
188 obfuscateClassNames();
\r
193 private static class PairComparisonResultSetTableModel extends DefaultTableModel{
\r
194 private static final long serialVersionUID = 93457234571623497L;
\r
197 public boolean isCellEditable(int row, int column){
\r
202 public Class<?> getColumnClass(int column){
\r
204 return Double.class;
\r
207 return String.class;
\r