1 package jp.sourceforge.stigmata.ui.swing;
7 import java.awt.BorderLayout;
8 import java.awt.event.ActionEvent;
9 import java.awt.event.ActionListener;
11 import java.io.FileWriter;
12 import java.io.IOException;
13 import java.io.PrintWriter;
14 import java.util.HashMap;
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;
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;
41 * @author Haruaki TAMADA
42 * @version $Revision$ $Date$
44 public class ControlPane extends JPanel{
45 private static final long serialVersionUID = 983547612346543645L;
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;
66 public ControlPane(StigmataFrame stigmata){
67 this.stigmata = stigmata;
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);
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);
88 public void addBirthmarkServiceListener(BirthmarkServiceListener listener){
89 definition.addBirthmarkServiceListener(listener);
92 public void removeBirthmarkServiceListener(BirthmarkServiceListener listener){
93 definition.removeBirthmarkServiceListener(listener);
97 this.expertmode = false;
100 stigmata.setExpertMode(false);
101 targetX.removeAllElements();
102 targetY.removeAllElements();
105 wellknownClassses.reset();
109 int definitionTabIndex = controlTab.indexOfTab(stigmata.getMessages().get("definition.tab.label"));
110 if(definitionTabIndex >= 0){
111 controlTab.removeTabAt(definitionTabIndex);
113 int filterTabIndex = controlTab.indexOfTab(stigmata.getMessages().get("filter.tab.label"));
114 if(filterTabIndex >= 0){
115 controlTab.removeTabAt(filterTabIndex);
119 public void saveSettings(File file){
120 BirthmarkEnvironment environment = generateEnvironment();
121 ConfigFileExporter bce = new ConfigFileExporter(environment);
123 PrintWriter out = new PrintWriter(new FileWriter(file));
126 } catch(IOException e){
127 JOptionPane.showMessageDialog(
129 stigmata.getMessages().get("error.io", e.getMessage()),
130 stigmata.getMessages().get("error.dialog.title"),
131 JOptionPane.ERROR_MESSAGE
136 public void exportSettings(){
137 File file = stigmata.getSaveFile(
138 stigmata.getMessages().getArray("export.extensions"),
139 stigmata.getMessages().get("export.description")
143 if(!file.getName().endsWith(".xml")){
144 file = new File(file.getParent(), file.getName() + ".xml");
150 public void setExpertMode(boolean expertmode){
151 this.expertmode = expertmode;
152 birthmarks.setExpertMode(expertmode);
153 stigmata.setExpertMode(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);
161 removeTabByName(stigmata.getMessages().get("definition.tab.label"));
162 removeTabByName(stigmata.getMessages().get("filter.tab.label"));
163 removeTabByName(stigmata.getMessages().get("history.tab.label"));
168 public boolean isExpertMode(){
172 private void removeTabByName(String tabname){
173 int index = controlTab.indexOfTab(tabname);
175 controlTab.removeTabAt(index);
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);
185 birthmarks.setBorder(new TitledBorder(stigmata.getMessages().get("birthmarkspane.border")));
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")));
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")));
195 center.add(mainPane, BorderLayout.CENTER);
196 center.add(birthmarks, BorderLayout.SOUTH);
198 mainPane.add(Box.createHorizontalGlue());
199 mainPane.add(targetX);
200 mainPane.add(Box.createHorizontalGlue());
201 mainPane.add(targetY);
202 mainPane.add(Box.createHorizontalGlue());
204 DataChangeListener dcl = new DataChangeListener(){
205 public void valueChanged(Object source){
209 targetX.addDataChangeListener(dcl);
210 targetY.addDataChangeListener(dcl);
211 birthmarks.addDataChangeListener(dcl);
216 private void updateEnable(){
217 String[] valueX = targetX.getValues();
218 String[] valueY = targetY.getValues();
219 String[] targets = birthmarks.getSelectedServiceTypes();
221 extractButton.setEnabled(
222 ((valueX != null && valueX.length > 0) || (valueY != null && valueY.length > 0))
223 && (targets != null && targets.length > 0)
226 comparePopup.setEnabled(
227 (valueX != null && valueX.length > 0) &&
228 (valueY != null && valueY.length > 0) &&
229 (targets != null && targets.length > 0)
233 private void extractButtonActionPerformed(ActionEvent e){
234 BirthmarkContext context = generateContext();
235 context.setComparisonMethod(ComparisonMethod.ROUND_ROBIN_XY);
237 String[] fileX = targetX.getValues();
238 String[] fileY = targetY.getValues();
240 stigmata.extract(fileX, fileY, context);
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()
249 int returnValue = JOptionPane.showConfirmDialog(
250 stigmata, pane, stigmata.getMessages().get("filterselection.dialog.title"),
251 JOptionPane.OK_CANCEL_OPTION,
252 JOptionPane.QUESTION_MESSAGE
254 if(returnValue == JOptionPane.OK_OPTION){
255 String[] filterSetList = pane.getSelectedFilters();
256 context.setFilterTypes(filterSetList);
258 String[] fileX = targetX.getValues();
259 String[] fileY = targetY.getValues();
260 stigmata.compareRoundRobinFilter(fileX, fileY, context);
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();
270 stigmata.compareRoundRobin(fileX, fileY, context);
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);
281 private void compareGuessedPair(){
282 BirthmarkContext context = generateContext();
283 context.setComparisonMethod(ComparisonMethod.GUESSED_PAIR);
284 String[] fileX = targetX.getValues();
285 String[] fileY = targetY.getValues();
287 stigmata.compareGuessedPair(fileX, fileY, context);
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"));
299 bst = BirthmarkStoreTarget.MEMORY;
301 context.setStoreTarget(bst);
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();
312 // environment.setExtractionUnit(parseExtractionUnit());
313 classpath.updateClasspathContext(bytecode);
314 wellknownClassses.setWellknownClasses(manager);
315 filters.updateFilterManager(filterManager);
316 definition.updateEnvironment(environment);
317 properties.updateEnvironment(environment);
322 private ExtractionUnit parseExtractionUnit(){
323 String label = (String)unitBox.getSelectedItem();
324 String key = unitLabels.get(label);
325 ExtractionUnit unit = ExtractionUnit.CLASS;
327 if(key.equals("unit.archive")){
328 unit = ExtractionUnit.ARCHIVE;
330 else if(key.equals("unit.package")){
331 unit = ExtractionUnit.PACKAGE;
334 unit = ExtractionUnit.CLASS;
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();
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());
356 south.add(Box.createHorizontalGlue());
358 setLayout(new BorderLayout());
359 add(south, BorderLayout.SOUTH);
360 add(controlTab, BorderLayout.CENTER);
362 extractButton.setEnabled(false);
363 comparePopup.setEnabled(false);
365 resetButton.addActionListener(new ActionListener(){
366 public void actionPerformed(ActionEvent e){
371 extractButton.addActionListener(new ActionListener(){
372 public void actionPerformed(ActionEvent e){
373 extractButtonActionPerformed(e);
377 ActionListener compareListener = new ActionListener(){
378 public void actionPerformed(ActionEvent e){
379 String command = e.getActionCommand();
381 if(command.equals("roundrobin")){
384 else if(command.equals("guessedpair")){
385 compareGuessedPair();
387 else if(command.equals("specifiedpair")){
388 compareSpecifiedPair();
390 else if(command.equals("roundrobin.filtering")){
391 compareRoundRobinWithFiltering();
395 compareButton.addActionListener(compareListener);
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);
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);