blob: 968af5f2ebf8a16cb3b225a27658297950d35ad6 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.openide;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Window;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.lang.reflect.InvocationTargetException;
import javax.swing.BorderFactory;
import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.LayoutStyle;
import javax.swing.UIManager;
import org.openide.awt.Mnemonics;
import org.openide.util.NbBundle;
/**
* This class provides a description of a user notification to be displayed.
* <p>Simple example of usage:
* <pre>
* NotifyDescriptor d =
* new NotifyDescriptor.Message("Hello...", NotifyDescriptor.INFORMATION_MESSAGE);
* DialogDisplayer.getDefault().notify(d);
* </pre>
* or to get a result:
* <pre>
* NotifyDescriptor d =
* new NotifyDescriptor.Confirmation("Really do this?!", "Dialog Title",
* NotifyDescriptor.OK_CANCEL_OPTION);
* if (DialogDisplayer.getDefault().notify(d) == NotifyDescriptor.OK_OPTION) {
* // really do it...
* }
* </pre>
* @see DialogDisplayer#notify
* @author David Peroutka, Jaroslav Tulach
*/
public class NotifyDescriptor extends Object {
// Property constants
/** Name of property for the message to be displayed. */
public static final String PROP_MESSAGE = "message"; // NOI18N
/** Name of property for the type of message to use. */
public static final String PROP_MESSAGE_TYPE = "messageType"; // NOI18N
/** Name of property for the style of options available. */
public static final String PROP_OPTION_TYPE = "optionType"; // NOI18N
/** Name of property for the exact list of options. */
public static final String PROP_OPTIONS = "options"; // NOI18N
/** Name of property for the value the user selected. */
public static final String PROP_VALUE = "value"; // NOI18N
/** Name of property for the dialog title. */
public static final String PROP_TITLE = "title"; // NOI18N
/** Name of property for the detail message reported. */
public static final String PROP_DETAIL = "detail"; // NOI18N
/** Name of property for the OK button validation. */
public static final String PROP_VALID = "valid"; // NOI18N
/**
* Name of property for toggling the ESC key and title frame button closing.
* @since 7.35
*/
public static final String PROP_NO_DEFAULT_CLOSE = "noDefaultClose"; // NOI18N
/** Name of property for the error message at the bottom of the wizard.
* To set such message use {@link #createNotificationLineSupport}
*
* @since 7.10
*/
public static final String PROP_ERROR_NOTIFICATION = "errorNotification"; // NOI18N
/** Name of property for the error message at the bottom of the wizard.
* To set such message use {@link #createNotificationLineSupport}
*
* @since 7.10
*/
public static final String PROP_WARNING_NOTIFICATION = "warningNotification"; // NOI18N
/** Name of property for the error message at the bottom of the wizard.
* To set such message use {@link #createNotificationLineSupport}
*
* @since 7.10
*/
public static final String PROP_INFO_NOTIFICATION = "infoNotification"; // NOI18N
//
// Return values
//
/** Return value if YES is chosen. */
public static final Object YES_OPTION = new Integer(JOptionPane.YES_OPTION);
/** Return value if NO is chosen. */
public static final Object NO_OPTION = new Integer(JOptionPane.NO_OPTION);
/** Return value if CANCEL is chosen. */
public static final Object CANCEL_OPTION = new Integer(JOptionPane.CANCEL_OPTION);
/** Return value if OK is chosen. */
public static final Object OK_OPTION = new Integer(JOptionPane.OK_OPTION);
/** Return value if user closes the window without pressing any button. */
public static final Object CLOSED_OPTION = new Integer(JOptionPane.CLOSED_OPTION);
//
// Option types
//
/** Option type used by default. */
public static final int DEFAULT_OPTION = JOptionPane.DEFAULT_OPTION;
/** Option type used for negatable confirmations. */
public static final int YES_NO_OPTION = JOptionPane.YES_NO_OPTION;
/** Option type used for negatable and cancellable confirmations. */
public static final int YES_NO_CANCEL_OPTION = JOptionPane.YES_NO_CANCEL_OPTION;
/** Option type used for cancellable confirmations. */
public static final int OK_CANCEL_OPTION = JOptionPane.OK_CANCEL_OPTION;
//
// Message types
//
/** Message type for error messages. */
public static final int ERROR_MESSAGE = JOptionPane.ERROR_MESSAGE;
/** Message type for information messages. */
public static final int INFORMATION_MESSAGE = JOptionPane.INFORMATION_MESSAGE;
/** Message type for warning messages. */
public static final int WARNING_MESSAGE = JOptionPane.WARNING_MESSAGE;
/** Message type for questions. */
public static final int QUESTION_MESSAGE = JOptionPane.QUESTION_MESSAGE;
/** Plain message type using no icon. */
public static final int PLAIN_MESSAGE = JOptionPane.PLAIN_MESSAGE;
/** Maximum text width to which the text is wrapped */
private static final int MAXIMUM_TEXT_WIDTH = 100;
/** preferred width of text area */
private static final int SIZE_PREFERRED_WIDTH = 300;
/** preferred height of text area */
private static final int SIZE_PREFERRED_HEIGHT = 100;
private Object message;
/** The message type. */
private int messageType = PLAIN_MESSAGE;
/** The option type specifying the user-selectable options. */
private int optionType;
/** The option object specifying the user-selectable options. */
private Object[] options;
/** The option object specifying the additional user-selectable options. */
private Object[] adOptions;
/** The user's choice value object. */
private Object value;
/** The default initial value. */
private Object defaultValue;
/** The title string for the report. */
private String title;
/** Is OK button valid (enabled). */
private boolean valid = true;
private NotificationLineSupport notificationLineSupport = null;
private String infoMsg;
private String warnMsg;
private String errMsg;
/** The object specifying the detail object. */
// private Object detail;
/** Property change support. */
private PropertyChangeSupport changeSupport;
/**
* When true the dialog can be closed only using one of its closing options,
* ESC key and the close button in its frame will not work.
*/
private boolean noDefaultClose = false;
/**
* Creates a new notify descriptor with specified information to report.
*
* If <code>optionType</code> is {@link #YES_NO_OPTION} or {@link #YES_NO_CANCEL_OPTION}
* and the <code>options</code> parameter is <code>null</code>, then the options are
* supplied by the look and feel.
*
* The <code>messageType</code> parameter is primarily used to supply a
* default icon from the look and feel.
*
* @param message the object to display
* @param title the title string for the dialog
* @param optionType indicates which options are available
* @param messageType indicates what type of message should be displayed
* @param options an array of objects indicating the possible choices
* @param initialValue the object that represents the default value
*
* @see #getMessage
* @see #getMessageType
* @see #getOptions
* @see #getOptionType
* @see #getValue
*/
public NotifyDescriptor(
Object message, String title, int optionType, int messageType, Object[] options, Object initialValue
) {
checkMessageValidity(message);
this.message = message;
this.messageType = messageType;
this.options = options;
this.optionType = optionType;
this.title = title;
this.value = initialValue;
this.defaultValue = initialValue;
}
/** Method that is called before a value is returned from any of
* getter methods in this object.
*
* Allows subclasses to do some additional initialization actions.
*/
protected void initialize() {
}
/** Checks for initialization.
*/
final void getterCalled() {
boolean init = false;
synchronized (this) {
if (changeSupport == null) {
changeSupport = new java.beans.PropertyChangeSupport(this);
init = true;
}
}
if (init) {
initialize();
}
}
//
// Getters/setters for properties.
//
/**
* Return true if OK button is valid (enabled), otherwise return false.
* @see #setValid
*
* @return validity status of OK button.
*/
public final boolean isValid() {
getterCalled();
return valid;
}
/** Set validity of OK button.
* @see #isValid
* @param newValid validity status of OK button
*/
public final void setValid(boolean newValid) {
boolean oldValid = valid;
valid = newValid;
firePropertyChange(
PROP_VALID, oldValid ? Boolean.TRUE : Boolean.FALSE, newValid ? Boolean.TRUE : Boolean.FALSE
);
}
/**
* Define a descriptive message to be reported. In the most common
* usage, the message is just a <code>String</code>. However, the type
* of this parameter is actually <code>Object</code>. Its interpretation depends on
* its type:
* <dl compact>
* <dt><code>Object[]</code><dd> A recursively interpreted series of messages.
* <dt>{@link Component}<dd> The <code>Component</code> is displayed in the dialog.
* <dt>{@link javax.swing.Icon}<dd> The <code>Icon</code> is wrapped in a {@link JLabel} and displayed in the dialog.
* <dt>anything else<dd> The {@link Object#toString string representation} of the object.
* </dl>
*
* @param newMessage the <code>Object</code> to report
* @see #getMessage
*/
public void setMessage(Object newMessage) {
checkMessageValidity(newMessage);
Object oldMessage = message;
if (newMessage instanceof String) {
// bugfix #25457, use JTextArea for word-wrapping
JTextArea area = new JTextArea((String) newMessage);
area.setPreferredSize(new Dimension(SIZE_PREFERRED_WIDTH, SIZE_PREFERRED_HEIGHT));
area.setBackground(UIManager.getColor("Label.background")); // NOI18N
area.setBorder(BorderFactory.createEmptyBorder());
area.setLineWrap(true);
area.setWrapStyleWord(true);
area.setEditable(false);
area.setFocusable(true);
area.getAccessibleContext().setAccessibleName(NbBundle.getMessage(NotifyDescriptor.class, "ACN_NotifyDescriptor_MessageJTextArea")); // NOI18N
area.getAccessibleContext().setAccessibleDescription(NbBundle.getMessage(NotifyDescriptor.class, "ACD_NotifyDescriptor_MessageJTextArea")); // NOI18N
newMessage = area;
}
message = newMessage;
firePropertyChange(PROP_MESSAGE, oldMessage, newMessage);
}
private void checkMessageValidity(Object message) {
if (message instanceof Window) {
// See https://netbeans.org/bugzilla/show_bug.cgi?id=267337
throw new IllegalArgumentException("The message must not be a window. message = "+message);
}
}
/**
* Get the message object.
* @see #setMessage
*
* @return the <code>Object</code> that is to be reported
*/
public Object getMessage() {
getterCalled();
return message;
}
/**
* Define the style of the message. The look and feel manager may lay out
* the dialog differently depending on this value, and will often provide
* a default icon. The possible values are:
* <ul>
* <li>{@link #ERROR_MESSAGE}
* <li>{@link #INFORMATION_MESSAGE}
* <li>{@link #WARNING_MESSAGE}
* <li>{@link #QUESTION_MESSAGE}
* <li>{@link #PLAIN_MESSAGE}
* </ul>
*
* @param newType the kind of message
*
* @see #getMessageType
*/
public void setMessageType(int newType) {
if (
(newType != ERROR_MESSAGE) && (newType != INFORMATION_MESSAGE) && (newType != WARNING_MESSAGE) &&
(newType != QUESTION_MESSAGE) && (newType != PLAIN_MESSAGE)
) {
throw new IllegalArgumentException(
"Message type must be one of the following:" // NOI18N
+" ERROR_MESSAGE, INFORMATION_MESSAGE," // NOI18N
+" WARNING_MESSAGE, QUESTION_MESSAGE or PLAIN_MESSAGE." // NOI18N
);
}
int oldType = messageType;
messageType = newType;
firePropertyChange(PROP_MESSAGE_TYPE, new Integer(oldType), new Integer(messageType));
}
/**
* Get the message type.
*
* @return the message type
*
* @see #setMessageType
*/
public int getMessageType() {
getterCalled();
return messageType;
}
/**
* Define the set of options. The option type is used by the look and
* feel to determine what options to show (unless explicit options are supplied):
* <ul>
* <li>{@link #DEFAULT_OPTION}
* <li>{@link #YES_NO_OPTION}
* <li>{@link #YES_NO_CANCEL_OPTION}
* <li>{@link #OK_CANCEL_OPTION}
* </ul>
*
* @param newType the options the look and feel is to display
*
* @see #getOptionType
* @see #setOptions
*/
public void setOptionType(int newType) {
if (
(newType != DEFAULT_OPTION) && (newType != YES_NO_OPTION) && (newType != YES_NO_CANCEL_OPTION) &&
(newType != OK_CANCEL_OPTION)
) {
throw new IllegalArgumentException(
"Option type must be one of the following:" // NOI18N
+" DEFAULT_OPTION, YES_NO_OPTION," // NOI18N
+" YES_NO_CANCEL_OPTION or OK_CANCEL_OPTION." // NOI18N
);
}
int oldType = optionType;
optionType = newType;
firePropertyChange(PROP_OPTION_TYPE, new Integer(oldType), new Integer(optionType));
}
/**
* Get the type of options that are to be displayed.
*
* @return the option type
*
* @see #setOptionType
*/
public int getOptionType() {
getterCalled();
return optionType;
}
/**
* Define an explicit description of the set of user-selectable options.
* The usual value for the options parameter is an array of
* <code>String</code>s. But the parameter type is an array of <code>Object</code>s. Its
* interpretation depends on its type:
* <dl compact>
* <dt>{@link Component}<dd>The component is added to the button row directly.
* <dt>{@link javax.swing.Icon}<dd>A {@link javax.swing.JButton} is created with this icon as its label.
* <dt>anything else<dd>The <code>Object</code> is {@link Object#toString converted} to a string and the result is used to
* label a <code>JButton</code>.
* </dl>
*
* @param newOptions an array of user-selectable options
*
* @see #getOptions
*/
public void setOptions(Object[] newOptions) {
Object[] oldOptions = options;
options = newOptions;
firePropertyChange(PROP_OPTIONS, oldOptions, newOptions);
}
/**
* Get the explicit choices the user can make.
* @return the array of <code>Object</code>s that give the user's choices
*
* @see #setOptions
*/
public Object[] getOptions() {
getterCalled();
if (options != null) {
return options.clone ();
}
return options;
}
/**
* Define an explicit description of the set of additional user-selectable options.
* Additional options are supposed to be used for help button, etc.
* <P>
* The usual value for the options parameter is an array of
* <code>String</code>s. But the parameter type is an array of <code>Object</code>s. Its
* interpretation depends on its type:
* <dl compact>
* <dt>{@link Component}<dd>The component is added to the button row directly.
* <dt>{@link javax.swing.Icon}<dd>A {@link javax.swing.JButton} is created with this icon as its label.
* <dt>anything else<dd>The <code>Object</code> is {@link Object#toString converted} to a string and the result is used to
* label a <code>JButton</code>.
* </dl>
*
* @param newOptions an array of user-selectable options
*
* @see #getOptions
*/
public void setAdditionalOptions(Object[] newOptions) {
Object[] oldOptions = adOptions;
adOptions = newOptions;
firePropertyChange(PROP_OPTIONS, oldOptions, newOptions);
}
/**
* Get the explicit additional choices the user can make.
* @return the array of <code>Object</code>s that give the user's choices
*
* @see #setOptions
*/
public Object[] getAdditionalOptions() {
getterCalled();
if (adOptions != null) {
return adOptions.clone ();
}
return null;
}
/**
* Sets the value w/o firing property change. The caller this is responsible
* to notify this change.
*/
void setValueWithoutPCH(Object newValue) {
value = newValue;
}
/**
* Set the value the user has chosen and fires appropriate property change.
* You probably do not want to call this yourself, of course.
*
* @param newValue the chosen value
*
* @see #getValue
*/
public void setValue(Object newValue) {
Object oldValue = value;
setValueWithoutPCH(newValue);
firePropertyChange(PROP_VALUE, oldValue, newValue);
}
/**
* Get the value the user has selected.
*
* @return an <code>Object</code> indicating the option selected by the user
*
* @see #setValue
*/
public Object getValue() {
getterCalled();
return value;
}
/**
* Get the default value of descriptor.
*
* @return an <code>Object</code> that represents the default value
* @since 5.9
*/
public Object getDefaultValue() {
return defaultValue;
}
/**
* Set the title string for this report description.
*
* @param newTitle the title of this description
*
* @see #getTitle
*/
public void setTitle(String newTitle) {
Object oldTitle = title;
title = newTitle;
firePropertyChange(PROP_TITLE, oldTitle, newTitle);
}
/**
* Get the title string for this report description.
*
* @return the title of this description
*
* @see #setTitle
*/
public String getTitle() {
getterCalled();
return title;
}
/** Create {@link NotificationLineSupport} if you want to notify users
* using info/warning/error messages in designed line at the bottom
* of your dialog. These message will be labelled with appropriate icons.
* <br>
* Note: Call this method <b>before</b> you call {@link DialogDisplayer#createDialog}
*
* @return NotificationLineSupport
* @since 7.10
*/
public final NotificationLineSupport createNotificationLineSupport() {
notificationLineSupport = new NotificationLineSupport (this);
return notificationLineSupport;
}
/** Returns NotificationLineSupport if it was created or <code>null</code> if doesn't.
* <br>
* Note: NotificationLineSupport will not be created by default, API client
* has to create this support purposely with the exception {@link WizardDescriptor}
* which has such capability longer.
*
* @see #createNotificationLineSupport()
* @return NotificationLineSupport or null if was not created yet
* @since 7.10
*/
public final NotificationLineSupport getNotificationLineSupport() {
return notificationLineSupport;
}
void setInformationMessage (String msg) {
if (notificationLineSupport == null) {
throw new IllegalStateException ("NotificationLineSupport wasn't created yet.");
}
infoMsg = msg;
warnMsg = null;
errMsg = null;
firePropertyChange (PROP_INFO_NOTIFICATION, null, msg);
}
void setWarningMessage (String msg) {
if (notificationLineSupport == null) {
throw new IllegalStateException ("NotificationLineSupport wasn't created yet.");
}
infoMsg = null;
warnMsg = msg;
errMsg = null;
firePropertyChange (PROP_WARNING_NOTIFICATION, null, msg);
}
void setErrorMessage (String msg) {
if (notificationLineSupport == null) {
throw new IllegalStateException ("NotificationLineSupport wasn't created yet.");
}
infoMsg = null;
warnMsg = null;
errMsg = msg;
firePropertyChange (PROP_ERROR_NOTIFICATION, null, msg);
}
String getInformationMessage () {
if (notificationLineSupport == null) {
throw new IllegalStateException ("NotificationLineSupport wasn't created yet.");
}
return infoMsg;
}
String getWarningMessage () {
if (notificationLineSupport == null) {
throw new IllegalStateException ("NotificationLineSupport wasn't created yet.");
}
return warnMsg;
}
String getErrorMessage () {
if (notificationLineSupport == null) {
throw new IllegalStateException ("NotificationLineSupport wasn't created yet.");
}
return errMsg;
}
void clearMessages () {
if (notificationLineSupport == null) {
throw new IllegalStateException ("NotificationLineSupport wasn't created yet.");
}
infoMsg = null;
warnMsg = null;
errMsg = null;
firePropertyChange (PROP_INFO_NOTIFICATION, null, null);
}
/**
* Define a detail message to be reported. In the most common usage,
* this message is just a <code>String</code>. However, the type of this
* parameter is actually <code>Object</code>. Its interpretation depends on its type:
* <dl compact>
* <dt><code>Object[]</code><dd> A recursively interpreted series of messages.
* <dt><code>Throwable</code><dd> A stack trace is displayed.
* <dt>anything else<dd> The {@link Object#toString string representation} of the object is used.
* </dl>
*
* @param newDetail the detail object of this description
*
* @see #getDetail
*
public void setDetail(Object newDetail) {
Object oldDetail = detail;
detail = newDetail;
firePropertyChange(PROP_DETAIL, oldDetail, newDetail);
}
/**
* Get the detail object for this description.
*
* @return details of this description
*
* @see #setTitle
*
public Object getDetail() {
return detail;
}
*/
//
// Support for reporting bound property changes.
//
/**
* Add a {@link PropertyChangeListener} to the listener list.
*
* @param listener the <code>PropertyChangeListener</code> to be added
*/
public void addPropertyChangeListener(PropertyChangeListener listener) {
getterCalled();
changeSupport.addPropertyChangeListener(listener);
}
/**
* Remove a {@link PropertyChangeListener} from the listener list.
*
* @param listener the <code>PropertyChangeListener</code> to be removed
*/
public void removePropertyChangeListener(PropertyChangeListener listener) {
if (changeSupport != null) {
changeSupport.removePropertyChangeListener(listener);
}
}
/**
* Fire a {@link PropertyChangeEvent} to each listener.
*
* @param propertyName the programmatic name of the property that was changed
* @param oldValue the old value of the property
* @param newValue the new value of the property
*/
protected void firePropertyChange(String propertyName, Object oldValue, Object newValue) {
if (changeSupport != null) {
changeSupport.firePropertyChange(propertyName, oldValue, newValue);
}
}
/**
* Disable or enabled the closing of dialog window using ESC and the close button
* in dialog's title bar.
* @param noDefaultClose True to disabled ESC closing and to disable the close
* button in dialog's title bar.
* @since 7.35
* @see javax.swing.JDialog#DO_NOTHING_ON_CLOSE
*/
public void setNoDefaultClose( boolean noDefaultClose ) {
boolean oldValue = this.noDefaultClose;
this.noDefaultClose = noDefaultClose;
firePropertyChange(PROP_NO_DEFAULT_CLOSE, oldValue, noDefaultClose);
}
/**
* @return True if ESC key closing and close button in dialog's title bar are disabled,
* false otherwise.
* @since 7.35
*/
public boolean isNoDefaultClose() {
return noDefaultClose;
}
/**
* Get the title to use for the indicated type.
* @param messageType the type of message
* @return the title to use
*/
protected static String getTitleForType(int messageType) {
switch (messageType) {
case ERROR_MESSAGE:
return NbBundle.getMessage(NotifyDescriptor.class, "NTF_ErrorTitle");
case WARNING_MESSAGE:
return NbBundle.getMessage(NotifyDescriptor.class, "NTF_WarningTitle");
case QUESTION_MESSAGE:
return NbBundle.getMessage(NotifyDescriptor.class, "NTF_QuestionTitle");
case INFORMATION_MESSAGE:
return NbBundle.getMessage(NotifyDescriptor.class, "NTF_InformationTitle");
case PLAIN_MESSAGE:
return NbBundle.getMessage(NotifyDescriptor.class, "NTF_PlainTitle");
}
return ""; // NOI18N
}
/**
* Provides information about the results of a command. Offers
* no user choices; the user can only acknowledge the message.
*/
public static class Message extends NotifyDescriptor {
/**
* Create an informational report about the results of a command.
*
* @param message the message object
* @see NotifyDescriptor#NotifyDescriptor
*/
public Message(Object message) {
this(message, INFORMATION_MESSAGE);
}
/**
* Create a report about the results of a command.
*
* @param message the message object
* @param messageType the type of message to be displayed
* @see NotifyDescriptor#NotifyDescriptor
*/
public Message(Object message, int messageType) {
super(
message, NotifyDescriptor.getTitleForType(messageType), DEFAULT_OPTION, messageType,
new Object[] { OK_OPTION }, OK_OPTION
);
}
}
/**
* Provides a description of a possible action and requests confirmation from the user before proceeding.
* This should be used to alert the user to a condition
* or situation that requires the user's decision before proceeding, such
* as an impending action with potentially destructive or irreversible
* consequences. It is conventionally in the form of a question: for example,
* "Save changes to TestForm?"
*/
public static class Confirmation extends NotifyDescriptor {
/**
* Create a yes/no/cancel question with default title.
*
* @param message the message object
* @see NotifyDescriptor#NotifyDescriptor
*/
public Confirmation(Object message) {
this(message, YES_NO_CANCEL_OPTION);
}
/**
* Create a yes/no/cancel question.
*
* @param message the message object
* @param title the dialog title
* @see NotifyDescriptor#NotifyDescriptor
*/
public Confirmation(Object message, String title) {
this(message, title, YES_NO_CANCEL_OPTION);
}
/**
* Create a question with default title.
*
* @param message the message object
* @param optionType the type of options to display to the user
* @see NotifyDescriptor#NotifyDescriptor
*/
public Confirmation(Object message, int optionType) {
this(message, optionType, QUESTION_MESSAGE);
}
/**
* Create a question.
*
* @param message the message object
* @param title the dialog title
* @param optionType the type of options to display to the user
* @see NotifyDescriptor#NotifyDescriptor
*/
public Confirmation(Object message, String title, int optionType) {
this(message, title, optionType, QUESTION_MESSAGE);
}
/**
* Create a confirmation with default title.
*
* @param message the message object
* @param optionType the type of options to display to the user
* @param messageType the type of message to use
* @see NotifyDescriptor#NotifyDescriptor
*/
public Confirmation(Object message, int optionType, int messageType) {
super(
message, NotifyDescriptor.getTitleForType(messageType), optionType, messageType,
(optionType == DEFAULT_OPTION) ? new Object[] { OK_OPTION } : null, OK_OPTION
);
}
/**
* Create a confirmation.
*
* @param message the message object
* @param title the dialog title
* @param optionType the type of options to display to the user
* @param messageType the type of message to use
* @see NotifyDescriptor#NotifyDescriptor
*/
public Confirmation(Object message, String title, int optionType, int messageType) {
super(
message, title, optionType, messageType,
(optionType == DEFAULT_OPTION) ? new Object[] { OK_OPTION } : null, OK_OPTION
);
}
}
/**
* Provides a description of an exception that occurred during
* execution of the IDE. The best is to use this class together with
* {@link DialogDisplayer#notifyLater} as that allows an exception
* to be notified from any thread.
* @deprecated No longer used. Try {@link java.util.logging} or {@link org.openide.util.Exceptions}.
*/
@Deprecated
public static final class Exception extends Confirmation {
static final long serialVersionUID = -3387516993124229948L;
/**
* Create an exception report with default message.
*
* @param detail the detail object
*/
public Exception(Throwable detail) {
this(detail, detail.getMessage());
// handle InvocationTargetExceptions
if (detail instanceof InvocationTargetException) {
Throwable target = ((InvocationTargetException) detail).getTargetException();
this.setMessage(target);
Object msgObj = this.getMessage();
if ((msgObj == null) || "".equals(msgObj)) { // NOI18N
String msg = target.getMessage();
msg = org.openide.util.Utilities.wrapString(
msg, MAXIMUM_TEXT_WIDTH, java.text.BreakIterator.getCharacterInstance(), false
);
this.setMessage(msg);
}
}
Object obj = this.getMessage();
// emphasize user-non-friendly exceptions
if ((obj == null) || "".equals(obj)) { // NOI18N
this.setMessage(
NbBundle.getMessage(
NotifyDescriptor.class, "NTF_ExceptionalException", detail.getClass().getName(),
System.getProperty("netbeans.user") + java.io.File.separator + "system"
)
); // NOI18N
this.setTitle(NbBundle.getMessage(NotifyDescriptor.class, "NTF_ExceptionalExceptionTitle"));
}
}
/**
* Create an exception report.
*
* @param detail the detail object
* @param message the message object
*/
public Exception(Throwable detail, Object message) {
super(message, DEFAULT_OPTION, ERROR_MESSAGE);
// customize descriptor
// this.setDetail(detail);
this.setTitle(NbBundle.getMessage(NotifyDescriptor.class, "NTF_ExceptionTitle"));
}
}
/** Notification providing for a line of text input.
* @author Dafe Simonek
*/
public static class InputLine extends NotifyDescriptor {
/**
* The text field used to enter the input.
*/
protected JTextField textField;
/** Construct dialog with the specified title and label text.
* @param text label text
* @param title title of the dialog
*/
public InputLine(final String text, final String title) {
this(text, title, OK_CANCEL_OPTION, PLAIN_MESSAGE);
}
/** Construct dialog with the specified title, label text, option and
* message types.
* @param text label text
* @param title title of the dialog
* @param optionType option type (ok, cancel, ...)
* @param messageType message type (question, ...)
*/
public InputLine(final String text, final String title, final int optionType, final int messageType) {
super(null, title, optionType, messageType, null, null);
super.setMessage(createDesign(text));
}
/**
* Get the text which the user typed into the input line.
* @return the text entered by the user
*/
public String getInputText() {
return textField.getText();
}
/**
* Set the text on the input line.
* @param text the new text
*/
public void setInputText(final String text) {
textField.setText(text);
textField.selectAll();
}
/** Make a component representing the input line.
* @param text a label for the input line
* @return the component
*/
protected Component createDesign(final String text) {
JPanel panel = new JPanel();
panel.setOpaque (false);
JLabel textLabel = new JLabel();
Mnemonics.setLocalizedText(textLabel, text);
boolean longText = text.length () > 80;
textField = new JTextField(25);
textLabel.setLabelFor(textField);
textField.requestFocus();
GroupLayout layout = new GroupLayout(panel);
panel.setLayout(layout);
if (longText) {
layout.setHorizontalGroup(
layout.createParallelGroup(Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(textLabel, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGap(32, 32, 32))
.addComponent(textField))
.addContainerGap())
);
} else {
layout.setHorizontalGroup(
layout.createParallelGroup(Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(textLabel)
.addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
.addComponent(textField, GroupLayout.DEFAULT_SIZE, 207, Short.MAX_VALUE)
.addContainerGap())
);
}
if (longText) {
layout.setVerticalGroup(
layout.createParallelGroup(Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(textLabel)
.addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
.addComponent(textField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
.addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
} else {
layout.setVerticalGroup(
layout.createParallelGroup(Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(Alignment.BASELINE)
.addComponent(textLabel)
.addComponent(textField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
.addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
}
javax.swing.KeyStroke enter = javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_ENTER, 0);
javax.swing.text.Keymap map = textField.getKeymap();
map.removeKeyStrokeBinding(enter);
/*
textField.addActionListener (new java.awt.event.ActionListener () {
public void actionPerformed (java.awt.event.ActionEvent evt) {
System.out.println("action: " + evt);
InputLine.this.setValue (OK_OPTION);
}
}
);
*/
panel.getAccessibleContext().setAccessibleDescription(
NbBundle.getMessage(NotifyDescriptor.class, "ACSD_InputPanel")
);
textField.getAccessibleContext().setAccessibleDescription(
NbBundle.getMessage(NotifyDescriptor.class, "ACSD_InputField")
);
return panel;
}
}
// end of InputLine
}