blob: 21ceee877227cc133b99b79ebb53ddd4958b57db [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 2009 IBM Corporation 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:
* IBM Corporation - initial API and implementation
******************************************************************************/
package org.eclipse.ui.statushandlers;
import org.eclipse.ui.internal.statushandlers.IStatusDialogConstants;
import java.util.Collection;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.QualifiedName;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.dialogs.ErrorSupportProvider;
import org.eclipse.jface.util.Policy;
import org.eclipse.jface.viewers.ILabelDecorator;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.internal.statushandlers.WorkbenchStatusDialogManagerImpl;
import org.eclipse.ui.progress.IProgressConstants;
/**
* <p>
* The {@link WorkbenchStatusDialogManager} is a utility class for displaying
* one or more messages (errors, warnings or infos) to the user. The dialog
* supplied has a Details button that opens/closes the details area. The default
* {@link AbstractStatusAreaProvider} displays a tree of {@link StatusAdapter}s
* related to the selected item on the messages list. The dialog also hasa
* Support button that opens/closes the support area which contains the provided
* {@link AbstractStatusAreaProvider}. The Support button is disabled and not
* visible unless
* {@link WorkbenchStatusDialogManager#enableDefaultSupportArea(boolean)} is
* invoked.
* </p>
*
* <p>
* The default details area can be replaced using
* {@link WorkbenchStatusDialogManager#setDetailsAreaProvider(AbstractStatusAreaProvider)}
* </p>
*
* <p>
* The default support area can be replaced using
* {@link WorkbenchStatusDialogManager#setSupportAreaProvider(AbstractStatusAreaProvider)}
* or {@link Policy#setErrorSupportProvider(ErrorSupportProvider)}.
* </p>
*
* <p>
* The manager can switch from a non-modal dialog to a modal dialog. See
* {@link #addStatusAdapter(StatusAdapter, boolean)}
* </p>
*
* @see Policy#setErrorSupportProvider(ErrorSupportProvider)
* @see ErrorSupportProvider
* @see AbstractStatusAreaProvider
*
* @since 3.4
* @noextend This class is not intended to be subclassed by clients.
*/
public class WorkbenchStatusDialogManager {
static final QualifiedName HINT = new QualifiedName(
IStatusAdapterConstants.PROPERTY_PREFIX, "hint"); //$NON-NLS-1$
private WorkbenchStatusDialogManagerImpl manager;
/**
* Creates workbench status dialog.
*
* @param displayMask
* the mask used to filter the handled <code>StatusAdapter</code>
* objects, the mask is a logical sum of status severities
* @param dialogTitle
* the title of the dialog. If null, than default will be used.
*/
public WorkbenchStatusDialogManager(int displayMask, String dialogTitle) {
manager = new WorkbenchStatusDialogManagerImpl(displayMask, dialogTitle);
}
/**
* Creates workbench status dialog.
*
* @param parentShell
* the parent shell for the dialog. It may be null.
* @param displayMask
* the mask used to filter the handled <code>StatusAdapter</code>
* objects, the mask is a logical sum of status severities
* @param dialogTitle
* the title of the dialog. If null, than default will be used.
* @deprecated As of 3.4 the <code>parentShell<code> is ignored
* @see #WorkbenchStatusDialogManager(int, String)
*/
public WorkbenchStatusDialogManager(Shell parentShell, int displayMask,
String dialogTitle) {
this(displayMask, dialogTitle);
}
/**
* Creates workbench status dialog.
*
* @param dialogTitle
* the title of the dialog. If null, than default will be used.
*/
public WorkbenchStatusDialogManager(String dialogTitle) {
this(IStatus.INFO | IStatus.WARNING | IStatus.ERROR | IStatus.CANCEL,
dialogTitle);
}
/**
* Creates workbench status dialog.
*
* @param parentShell
* the parent shell for the dialog. It may be null.
* @param dialogTitle
* the title of the dialog. If null, than default will be used.
* @deprecated As of 3.4 the <code>parentShell<code> is ignored
* @see #WorkbenchStatusDialogManager(String)
*/
public WorkbenchStatusDialogManager(Shell parentShell, String dialogTitle) {
this(dialogTitle);
}
/**
* <p>
* Adds a new {@link StatusAdapter} to the status adapters list in the
* dialog.
* </p>
* <p>
* If the dialog is already visible, the status adapter will be shown
* immediately. Otherwise, the dialog with the added status adapter will
* show up, if all conditions below are false.
* <ul>
* <li>the status adapter has
* {@link IProgressConstants#NO_IMMEDIATE_ERROR_PROMPT_PROPERTY} set to true</li>
* </ul>
* </p>
* <p>
* All not shown status adapters will be displayed as soon as the dialog
* shows up.
* </p>
*
* @param modal
* <code>true</code> if the dialog should be modal,
* <code>false</code> otherwise
* @param statusAdapter
* the status adapter
*/
public void addStatusAdapter(final StatusAdapter statusAdapter,
final boolean modal) {
manager.addStatusAdapter(statusAdapter, modal);
}
/**
* Enables the default support area that shows stack trace of the exception
* contained in the selected status.
*
* @param enable
* true enables, false disables default support
*/
public void enableDefaultSupportArea(boolean enable) {
manager.getDialogState().put(
IStatusDialogConstants.ENABLE_DEFAULT_SUPPORT_AREA,
Boolean.valueOf(enable));
}
/**
* Gets a collection of status adapters that were passed to the dialog.
*
* @return collection of {@link StatusAdapter} objects
*/
public Collection getStatusAdapters() {
return manager.getStatusAdapters();
}
/**
* Sets the details area provider. If null is set, the default area provider
* will be used.
*
* @param provider
* A details area provider to be set.
*/
public void setDetailsAreaProvider(AbstractStatusAreaProvider provider) {
manager.setProperty(IStatusDialogConstants.CUSTOM_DETAILS_PROVIDER,
provider);
}
/**
* Sets new label provider for the status list. This label provider is used
* also to display the second message on the dialog if only one status is
* available.
*
* <p>
* This method is no longer recommended to use as it is impossible to
* achieve consistent behavior after changing only one label provider.
* </p>
*
* @deprecated As of 3.5 {@link #setMessageDecorator} is recommended.
*
* @param labelProvider
* a label provider to be used when displaying status adapters.
*/
public void setStatusListLabelProvider(ITableLabelProvider labelProvider) {
manager.setStatusListLabelProvider(labelProvider);
}
/**
* Sets the support provider.
*
* The policy for choosing support provider is:
* <ol>
* <li>use the support provider set by this method, if set</li>
* <li>use the support provider set in JFace Policy, if set</li>
* <li>use the default support area, if enabled</li>
* </ol>
*
* @param provider
* Support provider to be set.
*/
public void setSupportAreaProvider(AbstractStatusAreaProvider provider) {
manager.setProperty(IStatusDialogConstants.CUSTOM_SUPPORT_PROVIDER,
provider);
}
/**
* <p>
* This methods sets up the decorator, which is used to modify displayed
* strings extracted from StatusAdapter. The decorator should be used to
* remove technical codes from the dialog, f.e. following message
* "<i>ERR2008 Invalid password</i>" can be translated into
* "<i>Invalid password</i>".
* </p>
* <p>
* The decorator will be applied only to messages extracted from
* StatusAdapter (predefined messages like
* "This status has children statuses. See 'Details' for more information."
* are not affected.
* </p>
* <p>
* This method should not be used together with
* {@link #setStatusListLabelProvider(ITableLabelProvider)}.
* </p>
*
* @param decorator
* - the decorator to be set. Only
* {@link ILabelDecorator#decorateText(String, Object)} method
* will be used. This method should return <code>null</code> if
* and only if the first argument is null. StatusAdapter is
* passed as second parameter. Other methods should have default
* behavior as they may be used in future versions of the dialog.
* @since 3.5
*/
public void setMessageDecorator(ILabelDecorator decorator){
manager.setMessageDecorator(decorator);
}
/**
* This method sets various properties on the manager.
*
* @param key
* a key of the property to be set.
* @param value
* a value of the property to be set. The value must be of type
* specified by the property key. <code>null</code> should never
* be passed unless the property key javadoc allows for that.
* @since 3.5
*/
public void setProperty(Object key, Object value){
manager.setProperty(key, value);
}
/**
* This method gets various dialog properties.
*
* @param key
* a key of the property to be get.
* @return a value of the property. The value will be of type specified by
* the property key. <code>null</code> can be returned.
* @since 3.5
*/
public Object getProperty(Object key){
return manager.getProperty(key);
}
/**
* This method makes the dialog to be similar to the JFace ErrorDialog. The
* dialog handles {@link StatusAdapter}s wrapping {@link IStatus} with
* severity {@link IStatus#OK}, does not display the link to the error log,
* does not display the link to the support area but always opens it.
*
* @see ErrorDialog
* @since 3.5
*/
public void enableErrorDialogCompatibility(){
manager.enableErrorDialogCompatibility();
}
}