OSDN Git Service

update for changing BinaryDataWritable and AsciiDataWritable package
[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.List;\r
18 \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
29 \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
40 \r
41 /**\r
42  * \r
43  * \r
44  * @author Haruaki TAMADA\r
45  * @version $Revision$ $Date$\r
46  */\r
47 public class PairComparisonResultSetPane extends JPanel{\r
48     private static final long serialVersionUID = 3298346465652354302L;\r
49 \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
57 \r
58     public PairComparisonResultSetPane(StigmataFrame frame, ComparisonResultSet resultset){\r
59         this.frame = frame;\r
60         this.context = resultset.getContext();\r
61 \r
62         for(ComparisonPair pair: resultset){\r
63             list.add(pair);\r
64         }\r
65 \r
66         initComponent();\r
67         initData(model, list);\r
68     }\r
69 \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
76 \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, newList);\r
97         list = newList;\r
98         model = newModel;\r
99         table.setModel(newModel);\r
100     }\r
101 \r
102     private void initData(DefaultTableModel model, List<ComparisonPair> list){\r
103         maximum = 0d;\r
104         minimum = 1d;\r
105         average = 0d;\r
106         model.setColumnIdentifiers(Messages.getStringArray("comparepair.table.columns"));\r
107 \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
113 \r
114             model.addRow(new Object[] { pair.getTarget1().getName(),\r
115                          pair.getTarget2().getName(), new Double(similarity) });\r
116         }\r
117         average = average / list.size();\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(\r
136                         out, new CertainPairComparisonResultSet(\r
137                             list.toArray(new ComparisonPair[list.size()]), context\r
138                         )\r
139                     );\r
140                 }\r
141             })\r
142         );\r
143         JButton updateColorButton = Utility.createButton(\r
144             "updatecellcolor", new UpdateBirthmarkCellColorAction(this, context)\r
145         );\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
151 \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
158 \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
174 \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
183 \r
184                         frame.compareDetails(pair.getTarget1(), pair.getTarget2(), context);\r
185                     }\r
186                 }\r
187             }\r
188         });\r
189 \r
190         obfuscateButton.addActionListener(new ActionListener(){\r
191             public void actionPerformed(ActionEvent e){\r
192                 obfuscateClassNames();\r
193             }\r
194         });\r
195     }\r
196 \r
197     private static class PairComparisonResultSetTableModel extends DefaultTableModel{\r
198         private static final long serialVersionUID = 93457234571623497L;\r
199 \r
200         @Override\r
201         public boolean isCellEditable(int row, int column){\r
202             return false;\r
203         }\r
204 \r
205         @Override\r
206         public Class<?> getColumnClass(int column){\r
207             if(column == 2){\r
208                 return Double.class;\r
209             }\r
210             else{\r
211                 return String.class;\r
212             }\r
213         }\r
214     }\r
215 }\r