OSDN Git Service

change internal process method, which introducing ExtractionResultSet
[stigmata/stigmata.git] / src / main / java / jp / naist / se / stigmata / ui / swing / PairComparisonResultSetPane.java
1 package jp.naist.se.stigmata.ui.swing;\r
2 \r
3 /*\r
4  * $Id$\r
5  */\r
6 \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
19 \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
30 \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
41 \r
42 /**\r
43  * \r
44  * \r
45  * @author Haruaki TAMADA\r
46  * @version $Revision$ $Date$\r
47  */\r
48 public class PairComparisonResultSetPane extends JPanel{\r
49     private static final long serialVersionUID = 3298346465652354302L;\r
50 \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
57 \r
58     public PairComparisonResultSetPane(StigmataFrame frame, ComparisonResultSet resultset){\r
59         this.frame = frame;\r
60         this.comparison = resultset;\r
61 \r
62         initComponent();\r
63         initData(model, resultset);\r
64     }\r
65 \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
70 \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
75 \r
76             context = comparison.getContext();\r
77             newList.add(new ComparisonPair(set1, set2, context));\r
78         }\r
79 \r
80         try{\r
81             File file = frame.getSaveFile(Messages.getStringArray("obfuscationmapping.extension"),\r
82                     Messages.getString("obfuscationmapping.description"));\r
83             if(file == null){\r
84                 return;\r
85             }\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
91             );\r
92             return;\r
93         }\r
94 \r
95         DefaultTableModel newModel = new PairComparisonResultSetTableModel();\r
96         initData(newModel, new CertainPairComparisonResultSet(newList.toArray(new ComparisonPair[newList.size()]), context));\r
97         model = newModel;\r
98         table.setModel(newModel);\r
99     }\r
100 \r
101     private void initData(DefaultTableModel model, ComparisonResultSet comparison){\r
102         maximum = 0d;\r
103         minimum = 1d;\r
104         average = 0d;\r
105         model.setColumnIdentifiers(Messages.getStringArray("comparepair.table.columns"));\r
106 \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
113 \r
114             model.addRow(new Object[] { pair.getTarget1().getName(),\r
115                          pair.getTarget2().getName(), new Double(similarity) });\r
116         }\r
117         average = average / comparison.getPairCount();\r
118         \r
119         averageLabel.setText(Double.toString(average));\r
120         maximumLabel.setText(Double.toString(maximum));\r
121         minimumLabel.setText(Double.toString(minimum));\r
122     }\r
123 \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
134                     }\r
135                     service.getComparisonResultFormat().printResult(out, comparison);\r
136                 }\r
137             })\r
138         );\r
139         JButton updateColorButton = Utility.createButton(\r
140             "updatecellcolor", new UpdateBirthmarkCellColorAction(this, comparison.getEnvironment())\r
141         );\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
147 \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
154 \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
170 \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
179 \r
180                         frame.compareDetails(pair.getTarget1(), pair.getTarget2(), comparison.getContext());\r
181                     }\r
182                 }\r
183             }\r
184         });\r
185 \r
186         obfuscateButton.addActionListener(new ActionListener(){\r
187             public void actionPerformed(ActionEvent e){\r
188                 obfuscateClassNames();\r
189             }\r
190         });\r
191     }\r
192 \r
193     private static class PairComparisonResultSetTableModel extends DefaultTableModel{\r
194         private static final long serialVersionUID = 93457234571623497L;\r
195 \r
196         @Override\r
197         public boolean isCellEditable(int row, int column){\r
198             return false;\r
199         }\r
200 \r
201         @Override\r
202         public Class<?> getColumnClass(int column){\r
203             if(column == 2){\r
204                 return Double.class;\r
205             }\r
206             else{\r
207                 return String.class;\r
208             }\r
209         }\r
210     }\r
211 }\r