OSDN Git Service

update for Java SE 6.
[stigmata/stigmata.git] / src / main / java / jp / sourceforge / stigmata / ui / swing / PairComparisonResultSetPane.java
1 package jp.sourceforge.stigmata.ui.swing;
2
3 /*
4  * $Id$
5  */
6
7 import java.awt.BorderLayout;
8 import java.awt.GridLayout;
9 import java.awt.event.ActionEvent;
10 import java.awt.event.ActionListener;
11 import java.awt.event.MouseAdapter;
12 import java.awt.event.MouseEvent;
13 import java.io.File;
14 import java.io.IOException;
15 import java.io.PrintWriter;
16 import java.util.ArrayList;
17 import java.util.Iterator;
18 import java.util.List;
19
20 import javax.swing.Box;
21 import javax.swing.JButton;
22 import javax.swing.JComponent;
23 import javax.swing.JLabel;
24 import javax.swing.JOptionPane;
25 import javax.swing.JPanel;
26 import javax.swing.JScrollPane;
27 import javax.swing.JTable;
28 import javax.swing.border.TitledBorder;
29 import javax.swing.table.DefaultTableModel;
30
31 import jp.sourceforge.stigmata.BirthmarkContext;
32 import jp.sourceforge.stigmata.BirthmarkSet;
33 import jp.sourceforge.stigmata.ComparisonPair;
34 import jp.sourceforge.stigmata.ComparisonResultSet;
35 import jp.sourceforge.stigmata.printer.PrinterManager;
36 import jp.sourceforge.stigmata.result.CertainPairComparisonResultSet;
37 import jp.sourceforge.stigmata.spi.ResultPrinterSpi;
38 import jp.sourceforge.stigmata.ui.swing.actions.SaveAction;
39 import jp.sourceforge.stigmata.ui.swing.actions.UpdateBirthmarkCellColorAction;
40 import jp.sourceforge.stigmata.utils.AsciiDataWritable;
41
42 /**
43  * 
44  * 
45  * @author Haruaki TAMADA
46  * @version $Revision$ $Date$
47  */
48 public class PairComparisonResultSetPane extends JPanel{
49     private static final long serialVersionUID = 3298346465652354302L;
50
51     private StigmataFrame frame;
52     private ComparisonResultSet comparison;
53     private DefaultTableModel model = new PairComparisonResultSetTableModel();
54     private JTable table = new JTable(model);
55     private JLabel averageLabel, maximumLabel, minimumLabel;
56     private double average, maximum, minimum;
57
58     public PairComparisonResultSetPane(StigmataFrame frame, ComparisonResultSet resultset){
59         this.frame = frame;
60         this.comparison = resultset;
61
62         initComponent();
63         initData(model, resultset);
64     }
65
66     private void obfuscateClassNames(){
67         ClassNameObfuscator obfuscator = new ClassNameObfuscator();
68         List<ComparisonPair> newList = new ArrayList<ComparisonPair>();
69         BirthmarkContext context = comparison.getContext();
70
71         for(Iterator<ComparisonPair> i = comparison.iterator(); i.hasNext(); ){
72             ComparisonPair pair = i.next();
73             BirthmarkSet set1 = obfuscator.obfuscateClassName(pair.getTarget1());
74             BirthmarkSet set2 = obfuscator.obfuscateClassName(pair.getTarget2());
75
76             context = comparison.getContext();
77             newList.add(new ComparisonPair(set1, set2, context));
78         }
79
80         try{
81             File file = frame.getSaveFile(frame.getMessages().getArray("obfuscationmapping.extension"),
82                 frame.getMessages().get("obfuscationmapping.description"));
83             if(file == null){
84                 return;
85             }
86             obfuscator.outputNameMappings(file);
87         }catch(IOException e){
88             JOptionPane.showMessageDialog(
89                 this, e.getMessage(), frame.getMessages().get("error.dialog.title"),
90                 JOptionPane.ERROR_MESSAGE
91             );
92             return;
93         }
94
95         DefaultTableModel newModel = new PairComparisonResultSetTableModel();
96         initData(newModel, new CertainPairComparisonResultSet(newList.toArray(new ComparisonPair[newList.size()]), context));
97         model = newModel;
98         table.setModel(newModel);
99     }
100
101     private void initData(DefaultTableModel model, ComparisonResultSet comparison){
102         maximum = 0d;
103         minimum = 1d;
104         average = 0d;
105         model.setColumnIdentifiers(frame.getMessages().getArray("comparepair.table.columns"));
106
107         for(Iterator<ComparisonPair> i = comparison.iterator(); i.hasNext(); ){
108             ComparisonPair pair = i.next();
109             double similarity = pair.calculateSimilarity();
110             if(similarity > maximum) maximum = similarity;
111             if(similarity < minimum) minimum = similarity;
112             average += similarity;
113
114             model.addRow(new Object[] { pair.getTarget1().getName(),
115                          pair.getTarget2().getName(), new Double(similarity) });
116         }
117         average = average / comparison.getPairCount();
118         
119         averageLabel.setText(Double.toString(average));
120         maximumLabel.setText(Double.toString(maximum));
121         minimumLabel.setText(Double.toString(minimum));
122     }
123
124     private void initComponent(){
125         JComponent buttonPanel = Box.createHorizontalBox();
126         JPanel similarityPane = new JPanel(new GridLayout(1, 3));
127         JComponent southPanel = Box.createVerticalBox();
128         JButton saveButton = GUIUtility.createButton(
129             frame.getMessages(), "savecomparison", new SaveAction(frame, new AsciiDataWritable(){
130                 public void writeAsciiData(PrintWriter out, String format) throws IOException{
131                     ResultPrinterSpi service = PrinterManager.getInstance().getService(format);
132                     if(service == null){
133                         service = PrinterManager.getDefaultFormatService();
134                     }
135                     service.getComparisonResultSetPrinter().printResult(out, comparison);
136                 }
137             })
138         );
139         JButton updateColorButton = GUIUtility.createButton(
140             frame.getMessages(), "updatecellcolor", new UpdateBirthmarkCellColorAction(frame, comparison.getEnvironment())
141         );
142         JButton obfuscateButton = GUIUtility.createButton(frame.getMessages(), "obfuscate");
143         JScrollPane scroll = new JScrollPane();
144         averageLabel = new JLabel(Double.toString(average), JLabel.RIGHT);
145         maximumLabel = new JLabel(Double.toString(maximum), JLabel.RIGHT);
146         minimumLabel = new JLabel(Double.toString(minimum), JLabel.RIGHT);
147
148         scroll.setViewportView(table);
149         table.setDefaultRenderer(Double.class, new CompareTableCellRenderer(comparison.getEnvironment()));
150         similarityPane.setBorder(new TitledBorder(frame.getMessages().get("similarity.border")));
151         averageLabel.setBorder(new TitledBorder(frame.getMessages().get("average.border")));
152         maximumLabel.setBorder(new TitledBorder(frame.getMessages().get("maximum.border")));
153         minimumLabel.setBorder(new TitledBorder(frame.getMessages().get("minimum.border")));
154
155         setLayout(new BorderLayout());
156         add(scroll, BorderLayout.CENTER);
157         add(southPanel, BorderLayout.SOUTH);
158         similarityPane.add(averageLabel);
159         similarityPane.add(maximumLabel);
160         similarityPane.add(minimumLabel);
161         southPanel.add(similarityPane);
162         southPanel.add(buttonPanel);
163         buttonPanel.add(Box.createHorizontalGlue());
164         buttonPanel.add(saveButton);
165         buttonPanel.add(Box.createHorizontalGlue());
166         buttonPanel.add(updateColorButton);
167         buttonPanel.add(Box.createHorizontalGlue());
168         buttonPanel.add(obfuscateButton);
169         buttonPanel.add(Box.createHorizontalGlue());
170
171         table.addMouseListener(new MouseAdapter(){
172             public void mouseClicked(MouseEvent e){
173                 if(e.getClickCount() == 2){
174                     int row = table.rowAtPoint(e.getPoint());
175                     int col = table.columnAtPoint(e.getPoint());
176                     if(col >= 1 && col < table.getColumnCount() && row >= 0
177                             && row < table.getRowCount()){
178                         ComparisonPair pair = comparison.getPairAt(row);
179
180                         frame.compareDetails(pair.getTarget1(), pair.getTarget2(), comparison.getContext());
181                     }
182                 }
183             }
184         });
185
186         obfuscateButton.addActionListener(new ActionListener(){
187             public void actionPerformed(ActionEvent e){
188                 obfuscateClassNames();
189             }
190         });
191     }
192
193     private static class PairComparisonResultSetTableModel extends DefaultTableModel{
194         private static final long serialVersionUID = 93457234571623497L;
195
196         @Override
197         public boolean isCellEditable(int row, int column){
198             return false;
199         }
200
201         @Override
202         public Class<?> getColumnClass(int column){
203             if(column == 2){
204                 return Double.class;
205             }
206             else{
207                 return String.class;
208             }
209         }
210     }
211 }