/* * Copyright (c) 2007 BUSINESS OBJECTS SOFTWARE LIMITED * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * * Neither the name of Business Objects nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * CALDocGenerationDialog.java * Creation date: Oct 17, 2005. * By: Joseph Wong */ package org.openquark.gems.client; import java.awt.BorderLayout; import java.awt.Container; import java.awt.Dimension; import java.awt.Frame; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.GridLayout; import java.awt.HeadlessException; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.logging.Logger; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.ButtonGroup; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JComponent; import javax.swing.JDialog; import javax.swing.JFileChooser; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.JScrollPane; import javax.swing.JTextField; import javax.swing.JTextPane; import javax.swing.JToggleButton; import javax.swing.WindowConstants; import javax.swing.border.Border; import javax.swing.text.JTextComponent; import org.openquark.cal.caldoc.FileSystemFileGenerator; import org.openquark.cal.caldoc.HTMLDocumentationGeneratorConfiguration; import org.openquark.cal.filter.CompositeModuleFilter; import org.openquark.cal.filter.CompositeScopedEntityFilter; import org.openquark.cal.filter.ExcludeTestModulesFilter; import org.openquark.cal.filter.ModuleFilter; import org.openquark.cal.filter.PublicEntitiesOnlyFilter; import org.openquark.cal.filter.QualifiedNameBasedScopedEntityFilter; import org.openquark.cal.filter.RegExpBasedModuleFilter; import org.openquark.cal.filter.RegExpBasedQualifiedNameFilter; import org.openquark.cal.filter.ScopedEntityFilter; import org.openquark.cal.services.CALWorkspace; import org.openquark.cal.services.WorkspaceManager; /** * This class implements the dialog box for specifying the options for the CALDoc HTML Documentation Generator. * * @author Joseph Wong */ final class CALDocGenerationDialog extends JDialog { private static final long serialVersionUID = -7063140314098167541L; //// /// Preference Keys // private static final String CALDOC_GENERATION_BOTTOM_PREF_KEY = "CALDocGenerationBottom"; private static final String CALDOC_GENERATION_FOOTER_PREF_KEY = "CALDocGenerationFooter"; private static final String CALDOC_GENERATION_HEADER_PREF_KEY = "CALDocGenerationHeader"; private static final String CALDOC_GENERATION_DOC_TITLE_PREF_KEY = "CALDocGenerationDocTitle"; private static final String CALDOC_GENERATION_WINDOW_TITLE_PREF_KEY = "CALDocGenerationWindowTitle"; private static final String CALDOC_GENERATION_GENERATE_USAGE_INDICES_PREF_KEY = "CALDocGenerationGenerateUsageIndices"; private static final String CALDOC_GENERATION_SEPARATE_INSTANCE_DOC_PREF_KEY = "CALDocGenerationSeparateInstanceDoc"; private static final String CALDOC_GENERATION_DISPLAY_PRELUDE_NAMES_AS_UNQUALIFIED_PREF_KEY = "CALDocGenerationDisplayPreludeNamesAsUnqualified"; private static final String CALDOC_GENERATION_GENERATE_VERSION_INFO_PREF_KEY = "CALDocGenerationGenerateVersionInfo"; private static final String CALDOC_GENERATION_GENERATE_AUTHOR_INFO_PREF_KEY = "CALDocGenerationGenerateAuthorInfo"; private static final String CALDOC_GENERATION_HIDE_OVERRIDEN_CALDOC_PREF_KEY = "CALDocGenerationHideOverridenCALDoc"; private static final String CALDOC_GENERATION_GENERATE_METADATA_PREF_KEY = "CALDocGenerationGenerateMetadata"; private static final String CALDOC_GENERATION_EXCLUDE_TEST_MODULES_PREF_KEY = "CALDocGenerationExcludeTestModules"; private static final String CALDOC_GENERATION_EXCLUDE_SCOPED_ENTITY_FILTER_REG_EXP_PREF_KEY = "CALDocGenerationExcludeScopedEntityFilterRegExp"; private static final String CALDOC_GENERATION_INCLUDE_ONLY_SCOPED_ENTITY_FILTER_REG_EXP_PREF_KEY = "CALDocGenerationIncludeOnlyScopedEntityFilterRegExp"; private static final String CALDOC_GENERATION_EXCLUDE_MODULE_FILTER_REG_EXP_PREF_KEY = "CALDocGenerationExcludeModuleFilterRegExp"; private static final String CALDOC_GENERATION_INCLUDE_ONLY_MODULE_FILTER_REG_EXP_PREF_KEY = "CALDocGenerationIncludeOnlyModuleFilterRegExp"; private static final String CALDOC_GENERATION_EXCLUDE_SCOPED_ENTITY_FILTER_PREF_KEY = "CALDocGenerationExcludeScopedEntityFilter"; private static final String CALDOC_GENERATION_INCLUDE_ONLY_SCOPED_ENTITY_FILTER_PREF_KEY = "CALDocGenerationIncludeOnlyScopedEntityFilter"; private static final String CALDOC_GENERATION_EXCLUDE_MODULE_FILTER_PREF_KEY = "CALDocGenerationExcludeModuleFilter"; private static final String CALDOC_GENERATION_INCLUDE_ONLY_MODULE_FILTER_PREF_KEY = "CALDocGenerationIncludeOnlyModuleFilter"; private static final String CALDOC_GENERATION_PUBLIC_ENTRIES_ONLY_PREF_KEY = "CALDocGenerationPublicEntriesOnly"; private static final String CALDOC_GENERATION_OUTPUT_DIRECTORY_PREF_KEY = "CALDocGenerationOutputDirectory"; /** The CAL workspace associated with the owner of this dialog. */ private final CALWorkspace workspace; /** Text field for specifying the output directory. (command line: -d) */ private final JTextField outputDirectoryField = new JTextField(); /** Button for launching a directory chooser for the output directory. */ private final JButton browseOutputDirectoryButton = new JButton(GemCutter.getResourceString("CALDoc_BrowseOutputDirectoryButton")); /** The button group for the two radio buttons for choosing the generation scope. */ private final ButtonGroup scopeOptionGroup = new ButtonGroup(); /** Radio button for specifying the generation of public entities only. (command line: -public) */ private final JRadioButton publicEntitiesOnlyRadioButton = new JRadioButton(GemCutter.getResourceString("CALDoc_PublicEntitiesOnlyOption")); /** Radio button for specifying the generation of all entities. (command line: -private) */ private final JRadioButton allEntitiesRadioButton = new JRadioButton(GemCutter.getResourceString("CALDoc_AllEntitiesOption")); /** Check box for enabling the include-only module filter. */ private final JCheckBox includeOnlyModuleFilterCheckBox = new JCheckBox(GemCutter.getResourceString("CALDoc_IncludeOnlyModuleFilterOption")); /** Combo box for specifying that only the modules matching the given regexp should have documentation generated. (command line: -modules) */ private final JComboBox includeOnlyModuleFilterField = new JComboBox(); /** Check box for enabling the exclude module filter. */ private final JCheckBox excludeModuleFilterCheckBox = new JCheckBox(GemCutter.getResourceString("CALDoc_ExcludeModuleFilterOption")); /** Combo box for specifying that the modules matching the given regexp should not have documentation generated. (command line: -excludeModules) */ private final JComboBox excludeModuleFilterField = new JComboBox(); /** Check box for enabling the include-only scoped entity filter. */ private final JCheckBox includeOnlyScopedEntityFilterCheckBox = new JCheckBox(GemCutter.getResourceString("CALDoc_IncludeOnlyScopedEntityFilterOption")); /** Combo box for specifying that only the scoped entities matching the given regexp should have documentation generated. (command line: -entities) */ private final JComboBox includeOnlyScopedEntityFilterField = new JComboBox(); /** Check box for enabling the exclude scoped entity filter. */ private final JCheckBox excludeScopedEntityFilterCheckBox = new JCheckBox(GemCutter.getResourceString("CALDoc_ExcludeScopedEntityFilterOption")); /** Combo box for specifying that the scoped entities matching the given regexp should not have documentation generated. (command line: -excludeEntities) */ private final JComboBox excludeScopedEntityFilterField = new JComboBox(); /** Check box for enabling the exclude test modules filter. (command line: -XexcludeTestModules) */ private final JCheckBox excludeTestModulesCheckBox = new JCheckBox(GemCutter.getResourceString("CALDoc_ExcludeTestModulesOption")); /** Check box for including metadata in the generated documentation (command line: -metadata). */ private final JCheckBox generateMetadataCheckBox = new JCheckBox(GemCutter.getResourceString("CALDoc_GenerateMetadataOption")); /** Check box for excluding CALDoc for which there is metadata (command line: -metadata override). */ private final JCheckBox hideOverridenCALDocCheckBox = new JCheckBox(GemCutter.getResourceString("CALDoc_HideOverridenCALDocOption")); /** Check box for enabling the generation of author info. (command line: -author) */ private final JCheckBox generateAuthorInfoCheckBox = new JCheckBox(GemCutter.getResourceString("CALDoc_GenerateAuthorInfoOption")); /** Check box for enabling the generation of version info. (command line: -version) */ private final JCheckBox generateVersionInfoCheckBox = new JCheckBox(GemCutter.getResourceString("CALDoc_GenerateVersionInfoOption")); /** Check box for specifying that Prelude names should always be unqualified. (command line [for disabling]: -qualifyPreludeNames) */ private final JCheckBox displayPreludeNamesAsUnqualifiedCheckBox = new JCheckBox(GemCutter.getResourceString("CALDoc_DisplayPreludeNamesAsUnqualifiedOption")); /** Check box for enabling the generation of usage indices. (command line: -use) */ private final JCheckBox generateUsageIndicesCheckBox = new JCheckBox(GemCutter.getResourceString("CALDoc_GenerateUsageIndicesOption")); /** Check box for enabling the separation of instance documentation from the main documentation pages. (command line [for disabling]: -doNotSeparateInstanceDoc) */ private final JCheckBox separateInstanceDocCheckBox = new JCheckBox(GemCutter.getResourceString("CALDoc_SeparateInstanceDocOption")); /** Text field for specifying the window title text. (command line: -windowTitle) */ private final JTextField windowTitleField = new JTextField(); /** Text field for specifying the documentation title in HTML. (command line: -docTitle) */ private final JTextPane docTitleField = new JTextPane(); /** Text field for specifying the header in HTML. (command line: -header) */ private final JTextPane headerField = new JTextPane(); /** Text field for specifying the footer in HTML. (command line: -footer) */ private final JTextPane footerField = new JTextPane(); /** Text field for specifying the fine print at the bottom of a page in HTML. (command line: -bottom) */ private final JTextPane bottomField = new JTextPane(); /** The OK button. */ private final JButton okButton = new JButton(GemCutter.getResourceString("LOC_OK")); /** The Cancel button. */ private final JButton cancelButton = new JButton(GemCutter.getResourceString("LOC_Cancel")); /** Whether OK was selected at the closing of the dialog. */ private boolean okSelected = false; /** * Constructs a CALDocGenerationDialog. * @param owner the owner of the dialog. * @param workspace the CAL workspace of the owner. * @throws HeadlessException if GraphicsEnvironment.isHeadless() returns true. */ CALDocGenerationDialog(Frame owner, CALWorkspace workspace) throws HeadlessException { super(owner); this.workspace = workspace; loadExistingValuesAndMakeEditable(); initialize(); setupUI(); } /** * Loads the existing values of the fields from the GemCutter preferences and make the fields editable. */ private void loadExistingValuesAndMakeEditable() { loadStringToTextComponent(outputDirectoryField, CALDOC_GENERATION_OUTPUT_DIRECTORY_PREF_KEY, ""); boolean publicEntriesOnly = GemCutter.getPreferences().getBoolean(CALDOC_GENERATION_PUBLIC_ENTRIES_ONLY_PREF_KEY, true); if (publicEntriesOnly) { publicEntitiesOnlyRadioButton.setSelected(true); } else { allEntitiesRadioButton.setSelected(true); } loadBooleanToCheckBox(includeOnlyModuleFilterCheckBox, CALDOC_GENERATION_INCLUDE_ONLY_MODULE_FILTER_PREF_KEY, false); loadBooleanToCheckBox(excludeModuleFilterCheckBox, CALDOC_GENERATION_EXCLUDE_MODULE_FILTER_PREF_KEY, false); loadBooleanToCheckBox(includeOnlyScopedEntityFilterCheckBox, CALDOC_GENERATION_INCLUDE_ONLY_SCOPED_ENTITY_FILTER_PREF_KEY, false); loadBooleanToCheckBox(excludeScopedEntityFilterCheckBox, CALDOC_GENERATION_EXCLUDE_SCOPED_ENTITY_FILTER_PREF_KEY, false); loadStringToComboBoxAndMakeEditable(includeOnlyModuleFilterField, CALDOC_GENERATION_INCLUDE_ONLY_MODULE_FILTER_REG_EXP_PREF_KEY, ""); loadStringToComboBoxAndMakeEditable(excludeModuleFilterField, CALDOC_GENERATION_EXCLUDE_MODULE_FILTER_REG_EXP_PREF_KEY, ""); loadStringToComboBoxAndMakeEditable(includeOnlyScopedEntityFilterField, CALDOC_GENERATION_INCLUDE_ONLY_SCOPED_ENTITY_FILTER_REG_EXP_PREF_KEY, ""); loadStringToComboBoxAndMakeEditable(excludeScopedEntityFilterField, CALDOC_GENERATION_EXCLUDE_SCOPED_ENTITY_FILTER_REG_EXP_PREF_KEY, ""); loadBooleanToCheckBox(excludeTestModulesCheckBox, CALDOC_GENERATION_EXCLUDE_TEST_MODULES_PREF_KEY, false); loadBooleanToCheckBox(generateMetadataCheckBox, CALDOC_GENERATION_GENERATE_METADATA_PREF_KEY, false); loadBooleanToCheckBox(hideOverridenCALDocCheckBox, CALDOC_GENERATION_HIDE_OVERRIDEN_CALDOC_PREF_KEY, false); loadBooleanToCheckBox(generateAuthorInfoCheckBox, CALDOC_GENERATION_GENERATE_AUTHOR_INFO_PREF_KEY, false); loadBooleanToCheckBox(generateVersionInfoCheckBox, CALDOC_GENERATION_GENERATE_VERSION_INFO_PREF_KEY, false); loadBooleanToCheckBox(displayPreludeNamesAsUnqualifiedCheckBox, CALDOC_GENERATION_DISPLAY_PRELUDE_NAMES_AS_UNQUALIFIED_PREF_KEY, true); loadBooleanToCheckBox(generateUsageIndicesCheckBox, CALDOC_GENERATION_GENERATE_USAGE_INDICES_PREF_KEY, false); loadBooleanToCheckBox(separateInstanceDocCheckBox, CALDOC_GENERATION_SEPARATE_INSTANCE_DOC_PREF_KEY, true); loadStringToTextComponent(windowTitleField, CALDOC_GENERATION_WINDOW_TITLE_PREF_KEY, ""); loadStringToTextComponent(docTitleField, CALDOC_GENERATION_DOC_TITLE_PREF_KEY, ""); loadStringToTextComponent(headerField, CALDOC_GENERATION_HEADER_PREF_KEY, ""); loadStringToTextComponent(footerField, CALDOC_GENERATION_FOOTER_PREF_KEY, ""); loadStringToTextComponent(bottomField, CALDOC_GENERATION_BOTTOM_PREF_KEY, ""); } /** * Loads the preference value specified by its key into a combo box, and make it editable. * @param comboBox the combo box. * @param prefKey the preference key. * @param defaultValue the default value to use if the key is not found in the preferences. */ private void loadStringToComboBoxAndMakeEditable(JComboBox comboBox, String prefKey, String defaultValue) { comboBox.setEditable(true); comboBox.getEditor().setItem(GemCutter.getPreferences().get(prefKey, defaultValue)); } /** * Loads the preference value specified by its key into a text component. * @param textComponent the text component. * @param prefKey the preference key. * @param defaultValue the default value to use if the key is not found in the preferences. */ private void loadStringToTextComponent(JTextComponent textComponent, String prefKey, String defaultValue) { textComponent.setText(GemCutter.getPreferences().get(prefKey, defaultValue)); } /** * Loads the preference value specified by its key into a check box. * @param checkBox the check box. * @param prefKey the preference key. * @param defaultValue the default value to use if the key is not found in the preferences. */ private void loadBooleanToCheckBox(JCheckBox checkBox, String prefKey, boolean defaultValue) { checkBox.setSelected(GemCutter.getPreferences().getBoolean(prefKey, defaultValue)); } /** * Saves the values of the dialog fields into GemCutter's preferences. */ private void saveValuesToPreferences() { saveStringFromTextComponent(outputDirectoryField, CALDOC_GENERATION_OUTPUT_DIRECTORY_PREF_KEY); GemCutter.getPreferences().putBoolean(CALDOC_GENERATION_PUBLIC_ENTRIES_ONLY_PREF_KEY, shouldGeneratePublicEntriesOnly()); saveBooleanFromCheckBox(includeOnlyModuleFilterCheckBox, CALDOC_GENERATION_INCLUDE_ONLY_MODULE_FILTER_PREF_KEY); saveBooleanFromCheckBox(excludeModuleFilterCheckBox, CALDOC_GENERATION_EXCLUDE_MODULE_FILTER_PREF_KEY); saveBooleanFromCheckBox(includeOnlyScopedEntityFilterCheckBox, CALDOC_GENERATION_INCLUDE_ONLY_SCOPED_ENTITY_FILTER_PREF_KEY); saveBooleanFromCheckBox(excludeScopedEntityFilterCheckBox, CALDOC_GENERATION_EXCLUDE_SCOPED_ENTITY_FILTER_PREF_KEY); saveStringFromComboBox(includeOnlyModuleFilterField, CALDOC_GENERATION_INCLUDE_ONLY_MODULE_FILTER_REG_EXP_PREF_KEY); saveStringFromComboBox(excludeModuleFilterField, CALDOC_GENERATION_EXCLUDE_MODULE_FILTER_REG_EXP_PREF_KEY); saveStringFromComboBox(includeOnlyScopedEntityFilterField, CALDOC_GENERATION_INCLUDE_ONLY_SCOPED_ENTITY_FILTER_REG_EXP_PREF_KEY); saveStringFromComboBox(excludeScopedEntityFilterField, CALDOC_GENERATION_EXCLUDE_SCOPED_ENTITY_FILTER_REG_EXP_PREF_KEY); saveBooleanFromCheckBox(excludeTestModulesCheckBox, CALDOC_GENERATION_EXCLUDE_TEST_MODULES_PREF_KEY); saveBooleanFromCheckBox(generateMetadataCheckBox, CALDOC_GENERATION_GENERATE_METADATA_PREF_KEY); saveBooleanFromCheckBox(hideOverridenCALDocCheckBox, CALDOC_GENERATION_HIDE_OVERRIDEN_CALDOC_PREF_KEY); saveBooleanFromCheckBox(generateAuthorInfoCheckBox, CALDOC_GENERATION_GENERATE_AUTHOR_INFO_PREF_KEY); saveBooleanFromCheckBox(generateVersionInfoCheckBox, CALDOC_GENERATION_GENERATE_VERSION_INFO_PREF_KEY); saveBooleanFromCheckBox(displayPreludeNamesAsUnqualifiedCheckBox, CALDOC_GENERATION_DISPLAY_PRELUDE_NAMES_AS_UNQUALIFIED_PREF_KEY); saveBooleanFromCheckBox(generateUsageIndicesCheckBox, CALDOC_GENERATION_GENERATE_USAGE_INDICES_PREF_KEY); saveBooleanFromCheckBox(separateInstanceDocCheckBox, CALDOC_GENERATION_SEPARATE_INSTANCE_DOC_PREF_KEY); saveStringFromTextComponent(windowTitleField, CALDOC_GENERATION_WINDOW_TITLE_PREF_KEY); saveStringFromTextComponent(docTitleField, CALDOC_GENERATION_DOC_TITLE_PREF_KEY); saveStringFromTextComponent(headerField, CALDOC_GENERATION_HEADER_PREF_KEY); saveStringFromTextComponent(footerField, CALDOC_GENERATION_FOOTER_PREF_KEY); saveStringFromTextComponent(bottomField, CALDOC_GENERATION_BOTTOM_PREF_KEY); } /** * Saves the value of the combo box using the given preference key into GemCutter's preferences. * @param comboBox the combo box. * @param prefKey the preference key. */ private void saveStringFromComboBox(JComboBox comboBox, String prefKey) { String selectedItem = (String)comboBox.getSelectedItem(); if (selectedItem != null) { GemCutter.getPreferences().put(prefKey, selectedItem.trim()); } } /** * Saves the value of the text component using the given preference key into GemCutter's preferences. * @param textComponent the text component. * @param prefKey the preference key. */ private void saveStringFromTextComponent(JTextComponent textComponent, String prefKey) { GemCutter.getPreferences().put(prefKey, textComponent.getText().trim()); } /** * Saves the value of the check box using the given preference key into GemCutter's preferences. * @param checkBox the check box. * @param prefKey the preference key. */ private void saveBooleanFromCheckBox(JCheckBox checkBox, String prefKey) { GemCutter.getPreferences().putBoolean(prefKey, checkBox.isSelected()); } /** * Initializes the various member fields, e.g. hooking up listeners and actions, * but does not setup or layout the UI. */ private void initialize() { // group together the scope-related radio buttons scopeOptionGroup.add(publicEntitiesOnlyRadioButton); scopeOptionGroup.add(allEntitiesRadioButton); // link the two metadata-related check boxes linkToggleWithField(generateMetadataCheckBox, hideOverridenCALDocCheckBox); // link up check boxes to the fields they enable/disable linkToggleWithField(includeOnlyModuleFilterCheckBox, includeOnlyModuleFilterField); linkToggleWithField(excludeModuleFilterCheckBox, excludeModuleFilterField); linkToggleWithField(includeOnlyScopedEntityFilterCheckBox, includeOnlyScopedEntityFilterField); linkToggleWithField(excludeScopedEntityFilterCheckBox, excludeScopedEntityFilterField); // put in the standard exclude filter for entity filtering if (!excludeScopedEntityFilterField.getEditor().getItem().equals(GemCutter.EXCLUDE_FUNCTIONS_BY_REGEXP_ARGUMENT_DEFAULT)) { excludeScopedEntityFilterField.addItem(GemCutter.EXCLUDE_FUNCTIONS_BY_REGEXP_ARGUMENT_DEFAULT); } // set up the action for the browse button browseOutputDirectoryButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { JFileChooser fileChooser = new JFileChooser(getBaseDirectory()); fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); int result = fileChooser.showDialog(CALDocGenerationDialog.this, GemCutter.getResourceString("CALDoc_SelectOutputDirectory")); if (result == JFileChooser.APPROVE_OPTION) { outputDirectoryField.setText(fileChooser.getSelectedFile().getAbsolutePath()); } }}); // set up the ok and cancel buttons' actions okButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { okSelected = true; saveValuesToPreferences(); CALDocGenerationDialog.this.dispose(); }}); cancelButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { okSelected = false; CALDocGenerationDialog.this.dispose(); }}); } /** * Setup and layout the UI. */ private void setupUI() { setTitle(GemCutter.getResourceString("CALDocGenerationDialog")); setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); // the output directory JPanel outputDirPanel = new JPanel(new BorderLayout()); { outputDirPanel.add(outputDirectoryField, BorderLayout.CENTER); outputDirPanel.add(browseOutputDirectoryButton, BorderLayout.EAST); } outputDirPanel.setBorder(BorderFactory.createTitledBorder(GemCutter.getResourceString("CALDoc_OutputDirectoryLabel"))); // the scope options Box scopeBox = Box.createHorizontalBox(); { scopeBox.add(publicEntitiesOnlyRadioButton); scopeBox.add(allEntitiesRadioButton); scopeBox.setBorder(BorderFactory.createTitledBorder(GemCutter.getResourceString("CALDoc_ScopeTitle"))); } // the filter panel JPanel filterPanel = new JPanel(new GridBagLayout()); { addGridBagRow(filterPanel, includeOnlyModuleFilterCheckBox, includeOnlyModuleFilterField); addGridBagRow(filterPanel, excludeModuleFilterCheckBox, excludeModuleFilterField); addGridBagRow(filterPanel, includeOnlyScopedEntityFilterCheckBox, includeOnlyScopedEntityFilterField); addGridBagRow(filterPanel, excludeScopedEntityFilterCheckBox, excludeScopedEntityFilterField); GridBagConstraints constraints = new GridBagConstraints(); constraints.gridx = 0; constraints.gridwidth = GridBagConstraints.REMAINDER; constraints.anchor = GridBagConstraints.LINE_START; filterPanel.add(excludeTestModulesCheckBox, constraints); filterPanel.setBorder(BorderFactory.createTitledBorder(GemCutter.getResourceString("CALDoc_FilterTitle"))); } // the options panel JPanel optionsPanel = new JPanel(new GridBagLayout()); { GridBagConstraints constraints = new GridBagConstraints(); constraints.gridx = 0; constraints.gridwidth = GridBagConstraints.REMAINDER; constraints.anchor = GridBagConstraints.LINE_START; constraints.fill = GridBagConstraints.HORIZONTAL; constraints.weightx = 1; constraints.weighty = 0; optionsPanel.add(generateMetadataCheckBox, constraints); optionsPanel.add(hideOverridenCALDocCheckBox, constraints); optionsPanel.add(generateAuthorInfoCheckBox, constraints); optionsPanel.add(generateVersionInfoCheckBox, constraints); optionsPanel.add(displayPreludeNamesAsUnqualifiedCheckBox, constraints); optionsPanel.add(generateUsageIndicesCheckBox, constraints); optionsPanel.add(separateInstanceDocCheckBox, constraints); JPanel windowTitlePanel = new JPanel(new GridLayout(0, 1)); windowTitlePanel.add(windowTitleField); windowTitlePanel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEmptyBorder(), GemCutter.getResourceString("CALDoc_WindowTitleLabel"))); optionsPanel.add(windowTitlePanel, constraints); } // the main panel - contains: output directory, scope options, filter panel, options panel JPanel mainPanel = new JPanel(new GridBagLayout()); { GridBagConstraints constraints = new GridBagConstraints(); constraints.gridx = 0; constraints.gridwidth = GridBagConstraints.REMAINDER; constraints.anchor = GridBagConstraints.LINE_START; constraints.fill = GridBagConstraints.HORIZONTAL; constraints.weightx = 1; constraints.weighty = 0; mainPanel.add(outputDirPanel, constraints); mainPanel.add(scopeBox, constraints); mainPanel.add(filterPanel, constraints); mainPanel.add(optionsPanel, constraints); } // the panel for the text panes JPanel textPanesPanel = new JPanel(new GridLayout(0, 1)); { textPanesPanel.add(titledScrollPaneForTextPane(docTitleField, GemCutter.getResourceString("CALDoc_DocTitleLabel"))); textPanesPanel.add(titledScrollPaneForTextPane(headerField, GemCutter.getResourceString("CALDoc_HeaderLabel"))); textPanesPanel.add(titledScrollPaneForTextPane(footerField, GemCutter.getResourceString("CALDoc_FooterLabel"))); textPanesPanel.add(titledScrollPaneForTextPane(bottomField, GemCutter.getResourceString("CALDoc_BottomLabel"))); } // the box for the OK and cancel buttons Box okCancelBox = Box.createHorizontalBox(); okCancelBox.add(Box.createGlue()); okCancelBox.add(okButton); okCancelBox.add(cancelButton); // the content pane: main panel in north, text panes in center (expands with the dialog), OK/Cancel buttons in south Container contentPane = this.getContentPane(); contentPane.setLayout(new BorderLayout()); contentPane.add(mainPanel, BorderLayout.NORTH); contentPane.add(textPanesPanel, BorderLayout.CENTER); contentPane.add(okCancelBox, BorderLayout.SOUTH); // set a good size for the dialog ((JComponent)contentPane).setMinimumSize(new Dimension(640, 700)); ((JComponent)contentPane).setPreferredSize(new Dimension(640, 700)); setModal(true); pack(); } /** * Creates a scroll pane with a titled border for a text pane. * @param textPane the text pane. * @param title the title. * @return the scroll pane. */ private JScrollPane titledScrollPaneForTextPane(JTextPane textPane, String title) { JScrollPane scrollPane = new JScrollPane(textPane); Border oldBorder = scrollPane.getBorder(); scrollPane.setBorder( BorderFactory.createCompoundBorder(BorderFactory.createTitledBorder(BorderFactory.createEmptyBorder(), title), oldBorder)); return scrollPane; } /** * Adds a row of two cells into the filter panel. * @param filterPanel the filter panel. * @param cell1 the first cell. * @param cell2 the second cell. */ private void addGridBagRow(JPanel filterPanel, JCheckBox cell1, JComboBox cell2) { GridBagConstraints constraints = new GridBagConstraints(); constraints.gridx = 0; constraints.gridwidth = 1; constraints.anchor = GridBagConstraints.LINE_START; filterPanel.add(cell1, constraints); constraints.gridx = 1; constraints.gridwidth = GridBagConstraints.REMAINDER; constraints.anchor = GridBagConstraints.LINE_START; constraints.fill = GridBagConstraints.HORIZONTAL; constraints.weightx = 1; filterPanel.add(cell2, constraints); } /** * Links a toggle button with a field so that the toggle activates/deactivates the field. * @param toggle the toggle button. * @param field the field to be linked to the toggle button. */ private void linkToggleWithField(final JToggleButton toggle, final JComponent field) { field.setEnabled(toggle.isSelected()); toggle.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { field.setEnabled(toggle.isSelected()); }}); } /** * @return whether OK was selected at the closing of the dialog. */ boolean isOKSelected() { return okSelected; } /** * Constructs a configuration object for the documentation generation based on the values of the dialog fields. * @param logger the logger to be included with the configuration object. * @param workspaceManager the workspace manager. * @return the configuration object. */ HTMLDocumentationGeneratorConfiguration getConfiguration(Logger logger, WorkspaceManager workspaceManager) { return new HTMLDocumentationGeneratorConfiguration( new FileSystemFileGenerator(getBaseDirectory(), logger), getModuleFilter(), getScopedEntityFilter(), shouldGenerateFromMetadata(), shouldAlwaysGenerateFromCALDoc(), shouldGenerateAuthorInfo(), shouldGenerateVersionInfo(), shouldDisplayPreludeNamesAsUnqualified(), shouldGenerateUsageIndices(), shouldSeparateInstanceDoc(), getWindowTitle(), getDocTitle(), getHeader(), getFooter(), getBottom(), GemCutter.getLocaleFromPreferences(), logger); } /** * @return the base directory specified by the user. */ private File getBaseDirectory() { String directory = outputDirectoryField.getText().trim(); if (directory.length() > 0) { return new File(directory); } else { return new File("."); } } /** * @return the module filter specified by the user. */ private ModuleFilter getModuleFilter() { List<ModuleFilter> moduleFilterList = new ArrayList<ModuleFilter>(); // Include the include-only filter if specified if (includeOnlyModuleFilterCheckBox.isSelected()) { Object includeOnlyModuleFilterFieldValue = includeOnlyModuleFilterField.getEditor().getItem(); if (includeOnlyModuleFilterFieldValue != null) { moduleFilterList.add(new RegExpBasedModuleFilter(includeOnlyModuleFilterFieldValue.toString().trim(), false)); } } // Include the exclude filter if specified if (excludeModuleFilterCheckBox.isSelected()) { Object excludeModuleFilterFieldValue = excludeModuleFilterField.getEditor().getItem(); if (excludeModuleFilterFieldValue != null) { moduleFilterList.add(new RegExpBasedModuleFilter(excludeModuleFilterFieldValue.toString().trim(), true)); } } // Include the exclude test modules filter if specified if (excludeTestModulesCheckBox.isSelected()) { moduleFilterList.add(new ExcludeTestModulesFilter(workspace)); } return CompositeModuleFilter.make(moduleFilterList); } /** * @return the scoped entity filter specified by the user. */ private ScopedEntityFilter getScopedEntityFilter() { List<ScopedEntityFilter> scopedEntityFilterList = new ArrayList<ScopedEntityFilter>(); if (shouldGeneratePublicEntriesOnly()) { scopedEntityFilterList.add(new PublicEntitiesOnlyFilter()); } // Include the include-only filter if specified if (includeOnlyScopedEntityFilterCheckBox.isSelected()) { Object includeOnlyScopedEntityFilterFieldValue = includeOnlyScopedEntityFilterField.getEditor().getItem(); if (includeOnlyScopedEntityFilterFieldValue != null) { scopedEntityFilterList.add( new QualifiedNameBasedScopedEntityFilter( new RegExpBasedQualifiedNameFilter(includeOnlyScopedEntityFilterFieldValue.toString().trim(), false))); } } // Include the exclude filter if specified if (excludeScopedEntityFilterCheckBox.isSelected()) { Object excludeScopedEntityFilterFieldValue = excludeScopedEntityFilterField.getEditor().getItem(); if (excludeScopedEntityFilterFieldValue != null) { scopedEntityFilterList.add( new QualifiedNameBasedScopedEntityFilter( new RegExpBasedQualifiedNameFilter(excludeScopedEntityFilterFieldValue.toString().trim(), true))); } } return CompositeScopedEntityFilter.make(scopedEntityFilterList); } /** * @return whether documentation generation should be done for public entries only. */ private boolean shouldGeneratePublicEntriesOnly() { return publicEntitiesOnlyRadioButton.isSelected(); } /** * @return whether the documentation should include metadata. */ private boolean shouldGenerateFromMetadata() { return generateMetadataCheckBox.isSelected(); } /** * @return whether CALDoc should always be included in the documentation regardless of whether metadata is included or not. */ private boolean shouldAlwaysGenerateFromCALDoc() { return !shouldGenerateFromMetadata() || !hideOverridenCALDocCheckBox.isSelected(); } /** * @return whether author info should be generated. */ private boolean shouldGenerateAuthorInfo() { return generateAuthorInfoCheckBox.isSelected(); } /** * @return whether version info should be generated. */ private boolean shouldGenerateVersionInfo() { return generateVersionInfoCheckBox.isSelected(); } /** * @return whether Prelude names should always be displayed as unqualified. */ private boolean shouldDisplayPreludeNamesAsUnqualified() { return displayPreludeNamesAsUnqualifiedCheckBox.isSelected(); } /** * @return whether the usage indices should be generated. */ private boolean shouldGenerateUsageIndices() { return generateUsageIndicesCheckBox.isSelected(); } /** * @return whether instance documentation should be separated from the main documentation pages. */ private boolean shouldSeparateInstanceDoc() { return separateInstanceDocCheckBox.isSelected(); } /** * @return the window title text. */ private String getWindowTitle() { return windowTitleField.getText().trim(); } /** * @return the documentation title HTML. */ private String getDocTitle() { return docTitleField.getText().trim(); } /** * @return the header HTML. */ private String getHeader() { return headerField.getText().trim(); } /** * @return the footer HTML. */ private String getFooter() { return footerField.getText().trim(); } /** * @return the HTML for the fine print at the bottom of a page. */ private String getBottom() { return bottomField.getText().trim(); } }