/******************************************************************************* * 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); } }