OSDN Git Service

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