package com.thoughtworks.testdox; import com.thoughtworks.testdox.Generator; import javax.swing.*; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.HeadlessException; import java.awt.Container; import java.awt.FlowLayout; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.prefs.Preferences; import java.util.prefs.BackingStoreException; /** * Created by IntelliJ IDEA. * User: stevcc * Date: 11-Jun-2003 * Time: 19:08:11 * To change this template use Options | File Templates. */ public class Gui extends JFrame { public static String SELECTED_DIRECTORY_KEY = "selectedDirectory"; static Preferences prefs = Preferences.userNodeForPackage(Gui.class); JButton browseButton; JButton goButton; JFileChooser fileChooser; JTextField path; Generator gen; private List generatorGuis = new ArrayList(); private DocumentListener pathChangeListener = new DocumentListener() { public void insertUpdate(DocumentEvent e) { doPathChange(); } public void removeUpdate(DocumentEvent e) { doPathChange(); } public void changedUpdate(DocumentEvent e) { doPathChange(); } }; private Container contentPane; private void doPathChange() { File f = new File(path.getText()); goButton.setEnabled(f.exists()); if (goButton.isEnabled()) getRootPane().setDefaultButton(goButton); else getRootPane().setDefaultButton(browseButton); } public Gui(String title, Generator gen) throws HeadlessException { super(title); this.gen = gen; setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setupGuiComponents(); try { prefs.sync(); String selectedPath = prefs.get(SELECTED_DIRECTORY_KEY, null); if ( selectedPath!=null) { setSelectedPath(selectedPath); } } catch (BackingStoreException e) { System.err.println("Could not sync preferences"); e.printStackTrace(); } } private ActionListener goActionListener = new ActionListener() { public void actionPerformed(ActionEvent e) { gen.reset(); gen.setInputFile(new File(path.getText())); for (int i = 0; i < generatorGuis.size(); i++) { DocumentGeneratorGui gui = (DocumentGeneratorGui) generatorGuis.get(i); if ( gui.isConfigured() ) { DocumentGenerator documentGenerator = gui.createDocumentGenerator(); if (documentGenerator!=null) { gen.addGenerator(documentGenerator); } } } gen.generate(); } }; private ActionListener browseActionListener = new ActionListener() { public void actionPerformed(ActionEvent e) { doBrowseForFile(); } }; private void setupGuiComponents() { path = new JTextField(40); path.getDocument().addDocumentListener(pathChangeListener); browseButton = new JButton("Browse"); browseButton.addActionListener(browseActionListener); goButton = new JButton("Go"); goButton.setEnabled(false); goButton.addActionListener(goActionListener); contentPane = getContentPane(); contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.Y_AXIS)); contentPane.add(makeBrowsePanel()); addDocumentGeneratorGui(new HtmlSaveAsGui()); addDocumentGeneratorGui(new TextSaveAsGui()); contentPane.add(makeGoButton()); getRootPane().setDefaultButton(browseButton); pack(); } private JComponent makeBrowsePanel() { JPanel panel = new JPanel(); panel.setLayout(new FlowLayout(FlowLayout.LEFT)); panel.add(path); panel.add(browseButton); panel.setBorder(BorderFactory.createTitledBorder("Choose a directory containing JUnit tests")); return panel; } private Box makeGoButton() { Box box = Box.createHorizontalBox(); box.add(Box.createGlue()); box.add(goButton); return box; } private void doBrowseForFile() { initializeFileChooser(); fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); if (fileChooser.showOpenDialog(this) != JFileChooser.CANCEL_OPTION) { try { String canonicalPath = fileChooser.getSelectedFile().getCanonicalPath(); setSelectedPath(canonicalPath); } catch (IOException e) { System.err.println("Could not locate directory"); e.printStackTrace(); } } } void initializeFileChooser() { if (fileChooser == null) { fileChooser = new JFileChooser(); if ( path.getText()!=null ) { fileChooser.setSelectedFile(new File(path.getText())); } } } private void setSelectedPath(String canonicalPath) { try { path.setText(canonicalPath); prefs.put(SELECTED_DIRECTORY_KEY, canonicalPath); prefs.flush(); } catch (BackingStoreException e) { System.err.println("Could not flush preferences"); e.printStackTrace(); } } public void addDocumentGeneratorGui(DocumentGeneratorGui generatorGui) { generatorGuis.add(generatorGui); contentPane.add(generatorGui.getComponent()); } }