blob: 54c3a27a7929537891fe56518015dc62b23f2b8c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006 Sybase, Inc. and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Sybase, Inc. - initial API and implementation
*******************************************************************************/
package org.eclipse.jst.jsf.common.ui.internal.guiutils;
import java.lang.reflect.InvocationTargetException;
import java.text.MessageFormat;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.MultiStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.dialogs.IInputValidator;
import org.eclipse.jface.dialogs.InputDialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.plugin.AbstractUIPlugin;
/**
* This class will provide UI alert dialogs to the user. These will
* automatically get the message from the plugin's resource bundle.
*
* NOTE: there are some generic exception methods included in this file. They
* need resource bundles also, and they make the alerts bettern when the
* exception is caught at a later stage.
*
* @author mengbo
*/
public class Alerts {
// this is used for junit testing to turn off all alerts and return the
// default on yes/no dialogs.
private static boolean _noAlerts = false;
private ResourceBundle _rb;
private String _pluginId;
/**
* Construct a alerts with the provided attributes. This constructor should
* be used from the root plugin that has access to the resource bundle for
* this plugin.
*
* @param plugin
* @param rb
* the resource bundle to use.
*/
public Alerts(AbstractUIPlugin plugin, ResourceBundle rb) {
_rb = rb;
if (_rb == null) {
throw new NullPointerException(
"No resource bundle was provided to the Alerts."); //$NON-NLS-1$
}
if (plugin == null) {
throw new NullPointerException(
"No plugin was provided to the Alerts."); //$NON-NLS-1$
}
_pluginId = plugin.getBundle().getSymbolicName();
}
/**
* Returns the text entered by a user in a simple request dialog.
*
* @param titleKey -
* the title resource bundle key for the message
* @param msgKey -
* message resource bundle key for the message displayed to the
* user
* @param initialValue -
* initial value in the text area.
* @param validator -
* something that checks for validity on the name.
* @return null is returned if the user hits cancel, otherwise it is the
* text they entered.
*/
public String getInput(String titleKey, String msgKey, String initialValue,
IInputValidator validator) {
if (_noAlerts) {
return null;
}
InputDialog inDialog = new InputDialog(PlatformUI.getWorkbench()
.getActiveWorkbenchWindow().getShell(),
getResourceString(titleKey), getResourceString(msgKey),
initialValue, validator);
inDialog.open();
return inDialog.getValue();
}
/**
* Displays an Error message to the user.
*
* @param titleKey -
* the title resource bundle key for the message
* @param msgKey -
* message resource bundle key for the message displayed to the
* user
*/
public void error(String titleKey, String msgKey) {
if (_noAlerts) {
return;
}
MessageDialog.openError(PlatformUI.getWorkbench()
.getActiveWorkbenchWindow().getShell(),
getResourceString(titleKey), getResourceString(msgKey));
}
/**
* Displays an Error message to the user.
*
* @param titleKey -
* the title resource bundle key for the message
* @param msgKey -
* message resource bundle key for the message displayed to the
* user
* @param arg0 -
* arg to place into the resource bundle message.
*/
public void error(String titleKey, String msgKey, Object arg0) {
if (_noAlerts) {
return;
}
Object[] args = new Object[1];
args[0] = arg0;
MessageFormat formatter = new MessageFormat(getResourceString(msgKey));
MessageDialog.openError(PlatformUI.getWorkbench()
.getActiveWorkbenchWindow().getShell(),
getResourceString(titleKey), formatter.format(args));
}
/**
* Displays an Error message to the user.
*
* @param titleKey -
* the title resource bundle key for the message
* @param msgKey -
* message resource bundle key for the message displayed to the
* user
* @param arg0 -
* arg to place into the resource bundle message.
* @param arg1 -
* arg to place into the resource bundle message.
*/
public void error(String titleKey, String msgKey, Object arg0, Object arg1) {
if (_noAlerts) {
return;
}
Object[] args = new Object[2];
args[0] = arg0;
args[1] = arg1;
MessageFormat formatter = new MessageFormat(getResourceString(msgKey));
MessageDialog.openError(PlatformUI.getWorkbench()
.getActiveWorkbenchWindow().getShell(),
getResourceString(titleKey), formatter.format(args));
}
/**
* Displays an Error message to the user.
*
* @param titleKey -
* the title resource bundle key for the message
* @param msgKey -
* message resource bundle key for the message displayed to the
* user
* @param arg0 -
* arg to place into the resource bundle message.
* @param arg1 -
* arg to place into the resource bundle message.
* @param arg2 -
* arg to place into the resource bundle message.
*/
public void error(String titleKey, String msgKey, Object arg0, Object arg1,
Object arg2) {
if (_noAlerts) {
return;
}
Object[] args = new Object[3];
args[0] = arg0;
args[1] = arg1;
args[2] = arg2;
MessageFormat formatter = new MessageFormat(getResourceString(msgKey));
MessageDialog.openError(PlatformUI.getWorkbench()
.getActiveWorkbenchWindow().getShell(),
getResourceString(titleKey), formatter.format(args));
}
/**
* Displays an Error message to the user.
*
* @param titleKey -
* the title resource bundle key for the message
* @param msgKey -
* message resource bundle key for the message displayed to the
* user
* @param arg0 -
* arg to place into the resource bundle message.
* @param arg1 -
* arg to place into the resource bundle message.
* @param arg2 -
* arg to place into the resource bundle message.
* @param arg3 -
* arg to place into the resource bundle message.
*/
public void error(String titleKey, String msgKey, Object arg0, Object arg1,
Object arg2, Object arg3) {
if (_noAlerts) {
return;
}
Object[] args = new Object[4];
args[0] = arg0;
args[1] = arg1;
args[2] = arg2;
args[3] = arg3;
MessageFormat formatter = new MessageFormat(getResourceString(msgKey));
MessageDialog.openError(PlatformUI.getWorkbench()
.getActiveWorkbenchWindow().getShell(),
getResourceString(titleKey), formatter.format(args));
}
/**
* Displays an Error message to the user.
*
* @param shell -
* the shell for the error dialog
* @param titleKey -
* the title resource bundle key for the message
* @param msgKey -
* message resource bundle key for the message displayed to the
* user
*/
public void error(Shell shell, String titleKey, String msgKey) {
if (_noAlerts) {
return;
}
MessageDialog.openError(shell, getResourceString(titleKey),
getResourceString(msgKey));
}
/**
* Displays an Error message to the user with a status using the Display
* background thread.
*
* @param titleKey -
* the title resource bundle key for the message
* @param msgKey -
* message resource bundle key for the message displayed to the
* user
*/
public void detailError(String titleKey, String msgKey) {
if (_noAlerts) {
return;
}
final IStatus fstatus = new Status(IStatus.ERROR, _pluginId,
IStatus.OK, getResourceString(msgKey), null);
final String ftitle = getResourceString(titleKey);
Display display = getStandardDisplay();
display.asyncExec(new Runnable() {
public void run() {
ErrorDialog.openError(null, ftitle, null, fstatus);
}
});
}
/**
* Displays an Error message to the user with a status using the Display
* background thread. This will give the details button.
*
* @param titleKey -
* the title resource bundle key for the message
* @param msgKey -
* message resource bundle key for the message displayed to the
* user
* @param tt -
* exception to place in the details.
*/
public void detailError(String titleKey, String msgKey, Throwable tt) {
if (_noAlerts) {
return;
}
internalDetailError(getResourceString(titleKey),
getResourceString(msgKey), tt);
}
/**
* Displays an Error message to the user with a status using the Display
* background thread. This will give the details button.
*
* @param titleKey -
* the title resource bundle key for the message
* @param msgKey -
* message resource bundle key for the message displayed to the
* user
* @param arg0 -
* arg to place into the resource bundle message.
* @param tt -
* exception to place in the details.
*/
public void detailError(String titleKey, String msgKey, Object arg0,
Throwable tt) {
if (_noAlerts) {
return;
}
Object[] args = new Object[1];
args[0] = arg0;
MessageFormat formatter = new MessageFormat(getResourceString(msgKey));
internalDetailError(getResourceString(titleKey),
formatter.format(args), tt);
}
/**
* Displays an Error message to the user with a status using the Display
* background thread. This will give the details button.
*
* @param titleKey -
* the title resource bundle key for the message
* @param msgKey -
* message resource bundle key for the message displayed to the
* user
* @param arg0 -
* arg to place into the resource bundle message.
* @param arg1 -
* arg to place into the resource bundle message.
* @param tt -
* exception to place in the details.
*/
public void detailError(String titleKey, String msgKey, Object arg0,
Object arg1, Throwable tt) {
if (_noAlerts) {
return;
}
Object[] args = new Object[1];
args[0] = arg0;
args[1] = arg1;
MessageFormat formatter = new MessageFormat(getResourceString(msgKey));
internalDetailError(getResourceString(titleKey),
formatter.format(args), tt);
}
/**
* Displays an Error message to the user with a status using the Display
* background thread. This will give the details button.
*
* @param title -
* the title message
* @param message -
* message displayed to the user
*/
private void internalDetailError(String title, String msg, Throwable tt) {
if (_noAlerts) {
return;
}
if (tt instanceof InvocationTargetException) {
tt = ((InvocationTargetException) tt).getTargetException();
}
IStatus status = null;
if (tt instanceof CoreException) {
status = ((CoreException) tt).getStatus();
if ((status instanceof MultiStatus) == false) {
// convert to a multistatus to show the exception details.
Throwable th = status.getException();
if (th == null) {
th = tt;
}
status = buildStackTraceStatus(IStatus.ERROR, status
.getPlugin(), status.getMessage(), th);
}
} else {
status = buildStackTraceStatus(IStatus.ERROR, _pluginId, tt
.getMessage(), tt);
}
final String ftitle = title;
final IStatus fstatus = status;
final String fmsg = msg;
Display display = getStandardDisplay();
display.asyncExec(new Runnable() {
public void run() {
ErrorDialog.openError(null, ftitle, fmsg, fstatus);
}
});
}
/**
* Builds a multistatus, so that the stack trace shows up in the alery
* message for detailed alerts.
*
* @param code
* @param pluginId
* @param message
* @param tt
* @return the result of the operation
*/
public IStatus buildStackTraceStatus(int code, String pluginId,
String message, Throwable tt) {
if (tt == null) {
return new Status(code, pluginId, IStatus.OK, message, tt);
}
MultiStatus mstat = new MultiStatus(pluginId, code, message, tt);
StackTraceElement[] trace = tt.getStackTrace();
mstat.add(new Status(code, pluginId, IStatus.OK, tt.toString(), null));
for (int ii = 0; ii < trace.length; ii++) {
mstat.add(new Status(code, pluginId, IStatus.OK, trace[ii]
.toString(), null));
}
return mstat;
}
/**
* Displays an Error message to the user with a status using the Display
* background thread. This will give the details button.
*
* @param status -
* the status
* @param title -
* the title of the message
*/
public void detailError(String title, IStatus status) {
if (_noAlerts) {
return;
}
final IStatus fstatus = status;
final String ftitle = title;
Display display = getStandardDisplay();
display.asyncExec(new Runnable() {
public void run() {
ErrorDialog.openError(null, ftitle, null, fstatus);
}
});
}
/**
* Displays an information message to the user.
*
* @param titleKey -
* the title resource bundle key for the message
* @param msgKey -
* message resource bundle key for the message displayed to the
* user
*/
public void info(String titleKey, String msgKey) {
if (_noAlerts) {
return;
}
MessageDialog.openInformation(PlatformUI.getWorkbench()
.getActiveWorkbenchWindow().getShell(),
getResourceString(titleKey), getResourceString(msgKey));
}
/**
* Displays an information message to the user.
*
* @param titleKey -
* the title resource bundle key for the message
* @param msgKey -
* message resource bundle key for the message displayed to the
* user
* @param arg0 -
* arg to place into the resource bundle message.
*/
public void info(String titleKey, String msgKey, Object arg0) {
if (_noAlerts) {
return;
}
Object[] args = new Object[1];
args[0] = arg0;
MessageFormat formatter = new MessageFormat(getResourceString(msgKey));
MessageDialog.openInformation(PlatformUI.getWorkbench()
.getActiveWorkbenchWindow().getShell(),
getResourceString(titleKey), formatter.format(args));
}
/**
* Displays an confirmation message to the user.
*
* @param titleKey -
* the title resource bundle key for the message
* @param msgKey -
* message resource bundle key for the message displayed to the
* user
* @return true if the user presses the OK button, false otherwise
*/
public boolean confirm(String titleKey, String msgKey) {
if (_noAlerts) {
return true;
}
return MessageDialog.openConfirm(PlatformUI.getWorkbench()
.getActiveWorkbenchWindow().getShell(),
getResourceString(titleKey), getResourceString(msgKey));
}
/**
* Displays an confirmation message to the user.
*
* @param titleKey -
* the title resource bundle key for the message
* @param msgKey -
* message resource bundle key for the message displayed to the
* user
* @param arg0 -
* arg to place into the resource bundle message.
* @return true if the user presses the OK button, false otherwise
*/
public boolean confirm(String titleKey, String msgKey, Object arg0) {
if (_noAlerts) {
return true;
}
Object[] args = new Object[1];
args[0] = arg0;
MessageFormat formatter = new MessageFormat(getResourceString(msgKey));
return MessageDialog.openConfirm(PlatformUI.getWorkbench()
.getActiveWorkbenchWindow().getShell(),
getResourceString(titleKey), formatter.format(args));
}
/**
* Displays an question message to the user.
*
* @param titleKey -
* the title resource bundle key for the message
* @param msgKey -
* message resource bundle key for the message displayed to the
* user
* @return true if the user presses the "yes" button, false otherwise
*/
public boolean question(String titleKey, String msgKey) {
if (_noAlerts) {
return true;
}
return MessageDialog.openQuestion(PlatformUI.getWorkbench()
.getActiveWorkbenchWindow().getShell(),
getResourceString(titleKey), getResourceString(msgKey));
}
/**
* Displays an question message to the user.
*
* @param titleKey -
* the title resource bundle key for the message
* @param msgKey -
* message resource bundle key for the message displayed to the
* user
* @param arg0 -
* arg to place into the resource bundle message.
* @return true if the user presses the "yes" button, false otherwise
*/
public boolean question(String titleKey, String msgKey, Object arg0) {
if (_noAlerts) {
return true;
}
Object[] args = new Object[1];
args[0] = arg0;
MessageFormat formatter = new MessageFormat(getResourceString(msgKey));
return MessageDialog.openQuestion(PlatformUI.getWorkbench()
.getActiveWorkbenchWindow().getShell(),
getResourceString(titleKey), formatter.format(args));
}
/**
* Displays an warning message to the user.
*
* @param titleKey -
* the title resource bundle key for the message
* @param msgKey -
* message resource bundle key for the message displayed to the
* user
*/
public void warning(String titleKey, String msgKey) {
if (_noAlerts) {
return;
}
MessageDialog.openWarning(PlatformUI.getWorkbench()
.getActiveWorkbenchWindow().getShell(),
getResourceString(titleKey), getResourceString(msgKey));
}
/**
* Displays an warning message to the user.
*
* @param titleKey -
* the title resource bundle key for the message
* @param msgKey -
* message resource bundle key for the message displayed to the
* user
* @param arg0 -
* arg to place into the resource bundle message.
*/
public void warning(String titleKey, String msgKey, Object arg0) {
if (_noAlerts) {
return;
}
Object[] args = new Object[1];
args[0] = arg0;
MessageFormat formatter = new MessageFormat(getResourceString(msgKey));
MessageDialog.openWarning(PlatformUI.getWorkbench()
.getActiveWorkbenchWindow().getShell(),
getResourceString(titleKey), formatter.format(args));
}
/**
* Returns the standard display to be used. The method first checks, if the
* thread calling this method has an associated dispaly. If so, this display
* is returned. Otherwise the method returns the default display.
*
* TODO: should probably use the workbench display
*/
private Display getStandardDisplay() {
Display display = Display.getCurrent();
if (display == null) {
display = Display.getDefault();
}
return display;
}
/**
* Returns the string from the resource bundle, or 'key' if not found.
*/
private String getResourceString(String key) {
if (key == null) {
return null;
}
try {
return _rb.getString(key);
} catch (MissingResourceException ee) {
return key;
}
}
/**
* Throw a core exception built around the message with the correct plugin
* id and resource bundle string.
*
* @param msgKey -
* message resource bundle key for the message displayed to the
* user
* @throws CoreException
*/
public void throwCoreException(String msgKey) throws CoreException {
IStatus status = new Status(IStatus.ERROR, _pluginId, IStatus.OK,
getResourceString(msgKey), null);
throw new CoreException(status);
}
/**
* Throw a core exception built around the message with the correct plugin
* id and resource bundle string.
*
* @param ee -
* the real exception.
* @throws CoreException
*/
public void throwCoreException(Throwable ee) throws CoreException {
IStatus status = new Status(IStatus.ERROR, _pluginId, IStatus.OK, ee
.getMessage(), ee);
throw new CoreException(status);
}
/**
* Throw a core exception built around the message with the correct plugin
* id and resource bundle string.
*
* @param msgKey -
* message resource bundle key for the message displayed to the
* user
* @param ee -
* the real exception.
* @throws CoreException
*/
public void throwCoreException(String msgKey, Throwable ee)
throws CoreException {
IStatus status = new Status(IStatus.ERROR, _pluginId, IStatus.OK,
getResourceString(msgKey), ee);
throw new CoreException(status);
}
/**
* Throw a core exception built around the message with the correct plugin
* id and resource bundle string.
*
* @param msgKey -
* message resource bundle key for the message displayed to the
* user
* @param arg0 -
* arg to place into the resource bundle message.
* @throws CoreException
*/
public void throwCoreException(String msgKey, Object arg0)
throws CoreException {
Object[] args = new Object[1];
args[0] = arg0;
MessageFormat formatter = new MessageFormat(getResourceString(msgKey));
IStatus status = new Status(IStatus.ERROR, _pluginId, IStatus.OK,
formatter.format(args), null);
throw new CoreException(status);
}
/**
* Throw a core exception built around the message with the correct plugin
* id and resource bundle string.
*
* @param msgKey -
* message resource bundle key for the message displayed to the
* user
* @param arg0 -
* arg to place into the resource bundle message.
* @param ee -
* the real exception.
* @throws CoreException
*/
public void throwCoreException(String msgKey, Object arg0, Throwable ee)
throws CoreException {
Object[] args = new Object[1];
args[0] = arg0;
MessageFormat formatter = new MessageFormat(getResourceString(msgKey));
IStatus status = new Status(IStatus.ERROR, _pluginId, IStatus.OK,
formatter.format(args), ee);
throw new CoreException(status);
}
/**
* Throw a core exception built around the message with the correct plugin
* id and resource bundle string.
*
* @param msgKey -
* message resource bundle key for the message displayed to the
* user
* @param arg0 -
* arg to place into the resource bundle message.
* @param arg1 -
* arg to place into the resource bundle message.
* @throws CoreException
*/
public void throwCoreException(String msgKey, Object arg0, Object arg1)
throws CoreException {
Object[] args = new Object[2];
args[0] = arg0;
args[1] = arg1;
MessageFormat formatter = new MessageFormat(getResourceString(msgKey));
IStatus status = new Status(IStatus.ERROR, _pluginId, IStatus.OK,
formatter.format(args), null);
throw new CoreException(status);
}
/**
* Throw a core exception built around the message with the correct plugin
* id and resource bundle string.
*
* @param msgKey -
* message resource bundle key for the message displayed to the
* user
* @param arg0 -
* arg to place into the resource bundle message.
* @param arg1 -
* arg to place into the resource bundle message.
* @param ee -
* the real exception.
* @throws CoreException
*/
public void throwCoreException(String msgKey, Object arg0, Object arg1,
Throwable ee) throws CoreException {
Object[] args = new Object[2];
args[0] = arg0;
args[1] = arg1;
MessageFormat formatter = new MessageFormat(getResourceString(msgKey));
IStatus status = new Status(IStatus.ERROR, _pluginId, IStatus.OK,
formatter.format(args), ee);
throw new CoreException(status);
}
}