OSDN Git Service

update for Java SE 6.
[stigmata/stigmata.git] / src / main / java / jp / sourceforge / stigmata / ui / swing / ControlPane.java
1 package jp.sourceforge.stigmata.ui.swing;
2
3 /*
4  * $Id$
5  */
6
7 import java.awt.BorderLayout;
8 import java.awt.event.ActionEvent;
9 import java.awt.event.ActionListener;
10 import java.io.File;
11 import java.io.FileWriter;
12 import java.io.IOException;
13 import java.io.PrintWriter;
14 import java.util.HashMap;
15 import java.util.Map;
16
17 import javax.swing.Box;
18 import javax.swing.BoxLayout;
19 import javax.swing.JButton;
20 import javax.swing.JComboBox;
21 import javax.swing.JComponent;
22 import javax.swing.JMenuItem;
23 import javax.swing.JOptionPane;
24 import javax.swing.JPanel;
25 import javax.swing.JTabbedPane;
26 import javax.swing.border.TitledBorder;
27
28 import jp.sourceforge.stigmata.BirthmarkContext;
29 import jp.sourceforge.stigmata.BirthmarkEnvironment;
30 import jp.sourceforge.stigmata.BirthmarkStoreTarget;
31 import jp.sourceforge.stigmata.ComparisonMethod;
32 import jp.sourceforge.stigmata.ExtractionUnit;
33 import jp.sourceforge.stigmata.Stigmata;
34 import jp.sourceforge.stigmata.filter.ComparisonPairFilterManager;
35 import jp.sourceforge.stigmata.reader.ClasspathContext;
36 import jp.sourceforge.stigmata.utils.ConfigFileExporter;
37 import jp.sourceforge.stigmata.utils.WellknownClassManager;
38
39 /**
40  * 
41  * @author Haruaki TAMADA
42  * @version $Revision$ $Date$
43  */
44 public class ControlPane extends JPanel{
45     private static final long serialVersionUID = 983547612346543645L;
46
47     private StigmataFrame stigmata;
48     private BirthmarkSelectablePane birthmarks;
49     private TargetSelectionPane targetX;
50     private TargetSelectionPane targetY;
51     private ClasspathSettingsPane classpath;
52     private WellknownClassesSettingsPane wellknownClassses;
53     private BirthmarkDefinitionPane definition;
54     private PropertyEditPane properties;
55     private FilterManagementPane filters;
56     private ExtractedHistoryPane history;
57     private JTabbedPane controlTab;
58     private JButton compareButton;
59     private JButton extractButton;
60     private JButton resetButton;
61     private PopupButton comparePopup;
62     private JComboBox unitBox;
63     private Map<String, String> unitLabels = new HashMap<String, String>();
64     private boolean expertmode = false;
65
66     public ControlPane(StigmataFrame stigmata){
67         this.stigmata = stigmata;
68     }
69
70     void inititalize(){
71         definition = new BirthmarkDefinitionPane(stigmata);
72         birthmarks = new BirthmarkSelectionCheckSetPane(stigmata);
73         properties = new PropertyEditPane(stigmata);
74         JComponent control = createControlPane();
75         wellknownClassses = new WellknownClassesSettingsPane(stigmata);
76         classpath = new ClasspathSettingsPane(stigmata);
77         filters = new FilterManagementPane(stigmata);
78         history = new ExtractedHistoryPane(stigmata);
79         initComponents();
80
81         GUIUtility.addNewTab(stigmata.getMessages(), "targets", controlTab, control);
82         GUIUtility.addNewTab(stigmata.getMessages(), "wellknown", controlTab, wellknownClassses);
83         GUIUtility.addNewTab(stigmata.getMessages(), "classpath", controlTab, classpath);
84         GUIUtility.addNewTab(stigmata.getMessages(), "property", controlTab, properties);
85         reset();
86     }
87
88     public void addBirthmarkServiceListener(BirthmarkServiceListener listener){
89         definition.addBirthmarkServiceListener(listener);
90     }
91
92     public void removeBirthmarkServiceListener(BirthmarkServiceListener listener){
93         definition.removeBirthmarkServiceListener(listener);
94     }
95
96     public void reset(){
97         this.expertmode = false;
98         definition.reset();
99         birthmarks.reset();
100         stigmata.setExpertMode(false);
101         targetX.removeAllElements();
102         targetY.removeAllElements();
103
104         classpath.reset();
105         wellknownClassses.reset();
106         filters.reset();
107         updateEnable();
108
109         int definitionTabIndex = controlTab.indexOfTab(stigmata.getMessages().get("definition.tab.label"));
110         if(definitionTabIndex >= 0){
111             controlTab.removeTabAt(definitionTabIndex);
112         }
113         int filterTabIndex = controlTab.indexOfTab(stigmata.getMessages().get("filter.tab.label"));
114         if(filterTabIndex >= 0){
115             controlTab.removeTabAt(filterTabIndex);
116         }
117     }
118
119     public void saveSettings(File file){
120         BirthmarkEnvironment environment = generateEnvironment();
121         ConfigFileExporter bce = new ConfigFileExporter(environment);
122         try{
123             PrintWriter out = new PrintWriter(new FileWriter(file));
124             bce.export(out);
125             out.close();
126         } catch(IOException e){
127             JOptionPane.showMessageDialog(
128                 stigmata,
129                 stigmata.getMessages().get("error.io", e.getMessage()),
130                 stigmata.getMessages().get("error.dialog.title"),
131                 JOptionPane.ERROR_MESSAGE
132             );
133         }
134     }
135
136     public void exportSettings(){
137         File file = stigmata.getSaveFile(
138             stigmata.getMessages().getArray("export.extensions"), 
139             stigmata.getMessages().get("export.description")
140         );
141
142         if(file != null){
143             if(!file.getName().endsWith(".xml")){
144                 file = new File(file.getParent(), file.getName() + ".xml");
145             }
146             saveSettings(file);
147         }
148     }
149
150     public void setExpertMode(boolean expertmode){
151         this.expertmode = expertmode;
152         birthmarks.setExpertMode(expertmode);
153         stigmata.setExpertMode(expertmode);
154
155         if(expertmode){
156             GUIUtility.addNewTab(stigmata.getMessages(), "definition", controlTab, definition);
157             GUIUtility.addNewTab(stigmata.getMessages(), "filter", controlTab, filters);
158             GUIUtility.addNewTab(stigmata.getMessages(), "history", controlTab, history);
159         }
160         else{
161             removeTabByName(stigmata.getMessages().get("definition.tab.label"));
162             removeTabByName(stigmata.getMessages().get("filter.tab.label"));
163             removeTabByName(stigmata.getMessages().get("history.tab.label"));
164         }
165         updateEnable();
166     }
167
168     public boolean isExpertMode(){
169         return expertmode;
170     }
171
172     private void removeTabByName(String tabname){
173         int index = controlTab.indexOfTab(tabname);
174         if(index >= 0){
175             controlTab.removeTabAt(index);
176         }
177     }
178
179     private JComponent createControlPane(){
180         JComponent mainPane = new Box(BoxLayout.X_AXIS);
181         JPanel center = new JPanel(new BorderLayout());
182         targetX = new TargetSelectionPane(stigmata);
183         targetY = new TargetSelectionPane(stigmata);
184
185         birthmarks.setBorder(new TitledBorder(stigmata.getMessages().get("birthmarkspane.border")));
186
187         targetX.addTargetExtensions(stigmata.getMessages().getArray("targets.extensions"));
188         targetX.setDescription(stigmata.getMessages().get("targets.description"));
189         targetX.setBorder(new TitledBorder(stigmata.getMessages().get("targetx.border")));
190
191         targetY.addTargetExtensions(stigmata.getMessages().getArray("targets.extensions"));
192         targetY.setDescription(stigmata.getMessages().get("targets.description"));
193         targetY.setBorder(new TitledBorder(stigmata.getMessages().get("targety.border")));
194
195         center.add(mainPane, BorderLayout.CENTER);
196         center.add(birthmarks, BorderLayout.SOUTH);
197
198         mainPane.add(Box.createHorizontalGlue());
199         mainPane.add(targetX);
200         mainPane.add(Box.createHorizontalGlue());
201         mainPane.add(targetY);
202         mainPane.add(Box.createHorizontalGlue());
203
204         DataChangeListener dcl = new DataChangeListener(){
205             public void valueChanged(Object source){
206                 updateEnable();
207             }
208         };
209         targetX.addDataChangeListener(dcl);
210         targetY.addDataChangeListener(dcl);
211         birthmarks.addDataChangeListener(dcl);
212
213         return center;
214     }
215
216     private void updateEnable(){
217         String[] valueX = targetX.getValues();
218         String[] valueY = targetY.getValues();
219         String[] targets = birthmarks.getSelectedServiceTypes();
220
221         extractButton.setEnabled(
222             ((valueX != null && valueX.length > 0) || (valueY != null && valueY.length > 0))
223             && (targets != null && targets.length > 0)
224         );
225
226         comparePopup.setEnabled(
227             (valueX != null && valueX.length > 0) &&
228             (valueY != null && valueY.length > 0) &&
229             (targets != null && targets.length > 0)
230         );
231     }
232
233     private void extractButtonActionPerformed(ActionEvent e){
234         BirthmarkContext context = generateContext();
235         context.setComparisonMethod(ComparisonMethod.ROUND_ROBIN_XY);
236
237         String[] fileX = targetX.getValues();
238         String[] fileY = targetY.getValues();
239
240         stigmata.extract(fileX, fileY, context);
241     }
242
243     private void compareRoundRobinWithFiltering(){
244         BirthmarkContext context = generateContext();
245         context.setComparisonMethod(ComparisonMethod.ROUND_ROBIN_XY);
246         FilterSelectionPane pane = new FilterSelectionPane(
247             stigmata, context.getEnvironment().getFilterManager()
248         );
249         int returnValue = JOptionPane.showConfirmDialog(
250             stigmata, pane, stigmata.getMessages().get("filterselection.dialog.title"),
251             JOptionPane.OK_CANCEL_OPTION,
252             JOptionPane.QUESTION_MESSAGE
253         );
254         if(returnValue == JOptionPane.OK_OPTION){
255             String[] filterSetList = pane.getSelectedFilters();
256             context.setFilterTypes(filterSetList);
257
258             String[] fileX = targetX.getValues();
259             String[] fileY = targetY.getValues();
260             stigmata.compareRoundRobinFilter(fileX, fileY, context);
261         }
262     }
263
264     private void compareRoundRobin(){
265         BirthmarkContext context = generateContext();
266         context.setComparisonMethod(ComparisonMethod.ROUND_ROBIN_XY);
267         String[] fileX = targetX.getValues();
268         String[] fileY = targetY.getValues();
269
270         stigmata.compareRoundRobin(fileX, fileY, context);
271     }
272
273     private void compareSpecifiedPair(){
274         BirthmarkContext context = generateContext();
275         context.setComparisonMethod(ComparisonMethod.SPECIFIED_PAIR);
276         String[] fileX = targetX.getValues();
277         String[] fileY = targetY.getValues();
278         stigmata.compareSpecifiedPair(fileX, fileY, context);
279     }
280
281     private void compareGuessedPair(){
282         BirthmarkContext context = generateContext();
283         context.setComparisonMethod(ComparisonMethod.GUESSED_PAIR);
284         String[] fileX = targetX.getValues();
285         String[] fileY = targetY.getValues();
286
287         stigmata.compareGuessedPair(fileX, fileY, context);
288     }
289
290     private BirthmarkContext generateContext(){
291         BirthmarkContext context = new BirthmarkContext(generateEnvironment());
292         context.setBirthmarkTypes(birthmarks.getSelectedServiceTypes());
293         context.setExtractionUnit(parseExtractionUnit());
294         BirthmarkStoreTarget bst = BirthmarkStoreTarget.MEMORY;
295         if(context.getEnvironment().getProperty("birthmark.store.target") != null){
296             bst = BirthmarkStoreTarget.valueOf(context.getEnvironment().getProperty("birthmark.store.target"));
297         }
298         if(bst == null){
299             bst = BirthmarkStoreTarget.MEMORY;
300         }
301         context.setStoreTarget(bst);
302         
303         return context;
304     }
305
306     private BirthmarkEnvironment generateEnvironment(){
307         BirthmarkEnvironment environment = Stigmata.getInstance().createEnvironment();
308         ClasspathContext bytecode = environment.getClasspathContext();
309         WellknownClassManager manager = environment.getWellknownClassManager();
310         ComparisonPairFilterManager filterManager = environment.getFilterManager();
311
312         // environment.setExtractionUnit(parseExtractionUnit());
313         classpath.updateClasspathContext(bytecode);
314         wellknownClassses.setWellknownClasses(manager);
315         filters.updateFilterManager(filterManager);
316         definition.updateEnvironment(environment);
317         properties.updateEnvironment(environment);
318
319         return environment;
320     }
321
322     private ExtractionUnit parseExtractionUnit(){
323         String label = (String)unitBox.getSelectedItem();
324         String key = unitLabels.get(label);
325         ExtractionUnit unit = ExtractionUnit.CLASS;
326
327         if(key.equals("unit.archive")){
328             unit = ExtractionUnit.ARCHIVE;
329         }
330         else if(key.equals("unit.package")){
331             unit = ExtractionUnit.PACKAGE;
332         }
333         else{
334             unit = ExtractionUnit.CLASS;
335         }
336         return unit;
337     }
338
339     private void initComponents(){
340         controlTab = new JTabbedPane();
341         resetButton = GUIUtility.createButton(stigmata.getMessages(), "reset");
342         extractButton = GUIUtility.createButton(stigmata.getMessages(), "extract");
343         compareButton = GUIUtility.createButton(stigmata.getMessages(), "roundrobin");
344         comparePopup = new PopupButton(compareButton);
345         unitBox = new JComboBox();
346
347         Box south = Box.createHorizontalBox();
348         south.add(Box.createHorizontalGlue());
349         south.add(resetButton);
350         south.add(Box.createHorizontalGlue());
351         south.add(extractButton);
352         south.add(Box.createHorizontalGlue());
353         south.add(comparePopup);
354         south.add(Box.createHorizontalGlue());
355         south.add(unitBox);
356         south.add(Box.createHorizontalGlue());
357
358         setLayout(new BorderLayout());
359         add(south, BorderLayout.SOUTH);
360         add(controlTab, BorderLayout.CENTER);
361
362         extractButton.setEnabled(false);
363         comparePopup.setEnabled(false);
364
365         resetButton.addActionListener(new ActionListener(){
366             public void actionPerformed(ActionEvent e){
367                 reset();
368             }
369         });
370
371         extractButton.addActionListener(new ActionListener(){
372             public void actionPerformed(ActionEvent e){
373                 extractButtonActionPerformed(e);
374             }
375         });
376
377         ActionListener compareListener = new ActionListener(){
378             public void actionPerformed(ActionEvent e){
379                 String command = e.getActionCommand();
380
381                 if(command.equals("roundrobin")){
382                     compareRoundRobin();
383                 }
384                 else if(command.equals("guessedpair")){
385                     compareGuessedPair();
386                 }
387                 else if(command.equals("specifiedpair")){
388                     compareSpecifiedPair();
389                 }
390                 else if(command.equals("roundrobin.filtering")){
391                     compareRoundRobinWithFiltering();
392                 }
393             }
394         };
395         compareButton.addActionListener(compareListener);
396
397         String[] comparisonMethods = stigmata.getMessages().getArray("comparison.methods");
398         for(int i = 1; i < comparisonMethods.length; i++){
399             JMenuItem item = GUIUtility.createJMenuItem(stigmata.getMessages(), comparisonMethods[i]);
400             comparePopup.addMenuItem(item);
401             item.addActionListener(compareListener);
402         }
403
404         String[] extractionUnits = stigmata.getMessages().getArray("extraction.units");
405         for(int i = 0; i < extractionUnits.length; i++){
406             String label = stigmata.getMessages().get(extractionUnits[i]);
407             unitLabels.put(label, extractionUnits[i]);
408             unitBox.addItem(label);
409         }
410     }
411 }