001: /*BEGIN_COPYRIGHT_BLOCK
002: *
003: * Copyright (c) 2001-2007, JavaPLT group at Rice University (javaplt@rice.edu)
004: * All rights reserved.
005: *
006: * Redistribution and use in source and binary forms, with or without
007: * modification, are permitted provided that the following conditions are met:
008: * * Redistributions of source code must retain the above copyright
009: * notice, this list of conditions and the following disclaimer.
010: * * Redistributions in binary form must reproduce the above copyright
011: * notice, this list of conditions and the following disclaimer in the
012: * documentation and/or other materials provided with the distribution.
013: * * Neither the names of DrJava, the JavaPLT group, Rice University, nor the
014: * names of its contributors may be used to endorse or promote products
015: * derived from this software without specific prior written permission.
016: *
017: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
018: * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
019: * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
020: * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
021: * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
022: * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
023: * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
024: * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
025: * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
026: * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
027: * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
028: *
029: * This software is Open Source Initiative approved Open Source Software.
030: * Open Source Initative Approved is a trademark of the Open Source Initiative.
031: *
032: * This file is part of DrJava. Download the current version of this project
033: * from http://www.drjava.org/ or http://sourceforge.net/projects/drjava/
034: *
035: * END_COPYRIGHT_BLOCK*/
036:
037: package edu.rice.cs.drjava.ui;
038:
039: import edu.rice.cs.util.swing.DirectorySelectorComponent;
040: import edu.rice.cs.util.swing.DirectoryChooser;
041: import edu.rice.cs.drjava.DrJava;
042: import edu.rice.cs.drjava.config.Configuration;
043: import edu.rice.cs.drjava.config.OptionConstants;
044: import edu.rice.cs.util.DirectorySelector;
045: import edu.rice.cs.util.OperationCanceledException;
046:
047: import javax.swing.*;
048: import java.io.File;
049:
050: /** Manages a dialog box that can select a destination directory for generating Javadoc. The getDirectory method should
051: * be called to show the dialog, using the suggested location for the Javadoc as the "start" file. If the user
052: * modifies the selection once, the user's choice will be remembered and no further suggestions will be used.
053: *
054: * @version $Id: JavadocDialog.java 4255 2007-08-28 19:17:37Z mgricken $
055: */
056: public class JavadocDialog implements DirectorySelector {
057: /** Parent frame of the dialog. */
058: private final JFrame _frame;
059:
060: /** File field and button. */
061: private final DirectorySelectorComponent _selector;
062:
063: /** Whether to always prompt for destination. */
064: private final JCheckBox _checkBox;
065:
066: /** OptionPane from which to get the results. */
067: private final JOptionPane _optionPane;
068:
069: /** Dialog to show. */
070: private final JDialog _dialog;
071:
072: /** Whether to use the suggested directory each time the dialog is shown. */
073: private boolean _useSuggestion;
074:
075: /** Current suggestion for the destination directory, or null. */
076: private File _suggestedDir;
077:
078: /** Creates a new JavadocDialog to show from the given frame.
079: *
080: * @param frame Parent frame of this dialog
081: */
082: public JavadocDialog(JFrame frame) {
083: _frame = frame;
084: _useSuggestion = true;
085: _suggestedDir = null;
086:
087: // Create file chooser
088: DirectoryChooser chooser = new DirectoryChooser();
089: chooser.setMultiSelectionEnabled(false);
090: chooser.setApproveButtonText("Select");
091: // chooser.setEditable(true);
092:
093: // Create components for dialog
094: String msg = "Select a destination directory for the Javadoc files:";
095: _selector = new DirectorySelectorComponent(_frame, chooser,
096: DirectorySelectorComponent.DEFAULT_NUM_COLS,
097: DirectorySelectorComponent.DEFAULT_FONT_SIZE, false);
098: _checkBox = new JCheckBox("Always Prompt For Destination");
099: Object[] components = new Object[] { msg, _selector, _checkBox };
100:
101: _optionPane = new JOptionPane(components,
102: JOptionPane.QUESTION_MESSAGE,
103: JOptionPane.OK_CANCEL_OPTION);
104: _dialog = _optionPane.createDialog(_frame,
105: "Select Javadoc Destination");
106: chooser.setOwner(_dialog);
107: }
108:
109: public boolean isRecursive() {
110: return false;
111: }
112:
113: /** Shows the dialog prompting the user for a destination directory in which to generate Javadoc.
114: *
115: * This operation must be executed from the event-handling thread!
116: *
117: * @param start The directory to display in the text box. If null,
118: * the most recent suggested directory (passed in via setSuggestedDir)
119: * is displayed, unless the user has modified a previous suggestion.
120: * @return A directory to use for the Javadoc (which might not exist)
121: * @throws OperationCanceledException if the selection request is canceled
122: */
123: public File getDirectory(File start)
124: throws OperationCanceledException {
125: if (start != null) {
126: // We were given a default - use it.
127: _selector.setFileField(start);
128: } else if (_useSuggestion && (_suggestedDir != null)) {
129: // We weren't given one, so we need to use our suggestion.
130: _selector.setFileField(_suggestedDir);
131: }
132:
133: Configuration config = DrJava.getConfig();
134: boolean ask = config.getSetting(
135: OptionConstants.JAVADOC_PROMPT_FOR_DESTINATION)
136: .booleanValue();
137:
138: if (ask) {
139: // The "always prompt" checkbox should be checked
140: _checkBox.setSelected(true);
141:
142: // Prompt the user
143: MainFrame.setPopupLoc(_dialog, _frame);
144: _dialog.setVisible(true);
145:
146: // Get result
147: if (!_isPositiveResult()) {
148: throw new OperationCanceledException();
149: }
150:
151: // See if the user wants to suppress this dialog in the future.
152: if (!_checkBox.isSelected()) {
153: config.setSetting(
154: OptionConstants.JAVADOC_PROMPT_FOR_DESTINATION,
155: Boolean.FALSE);
156: }
157:
158: // Check if the user disagreed with the suggestion
159: if ((start == null)
160: && (_useSuggestion && (_suggestedDir != null))
161: && !_selector.getFileFromField().equals(
162: _suggestedDir)) {
163: _useSuggestion = false;
164: }
165: }
166: return _selector.getFileFromField();
167: }
168:
169: /** Asks the user a yes/no question.
170: * @return true if the user responded affirmatively, false if negatively
171: */
172: public boolean askUser(String message, String title) {
173: int choice = JOptionPane.showConfirmDialog(_frame, message,
174: title, JOptionPane.YES_NO_OPTION);
175: return (choice == JOptionPane.YES_OPTION);
176: }
177:
178: /** Warns the user about an error condition. */
179: public void warnUser(String message, String title) {
180: JOptionPane.showMessageDialog(_frame, message, title,
181: JOptionPane.ERROR_MESSAGE);
182: }
183:
184: /** Sets the suggested destination directory for Javadoc generation. This directory will be displayed
185: * in the file field if the user has not modified the suggestion in the past.
186: * @param dir Suggested destination directory
187: */
188: public void setSuggestedDir(File dir) {
189: _suggestedDir = dir;
190: }
191:
192: /** Sets whether the dialog should use the suggested directory provided
193: * to the getDirectory method as the default location.
194: * @param use Whether to use the suggested directory
195: */
196: public void setUseSuggestion(boolean use) {
197: _useSuggestion = use;
198: }
199:
200: /** Returns whether the JOptionPane currently has the OK_OPTION result. */
201: private boolean _isPositiveResult() {
202: Object result = _optionPane.getValue();
203: if ((result != null) && (result instanceof Integer)) {
204: int rc = ((Integer) result).intValue();
205: return rc == JOptionPane.OK_OPTION;
206: } else
207: return false;
208: }
209: }
|