org.eclipse.jface.util.SafeRunnableDialog Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of org.eclipse.jface Show documentation
Show all versions of org.eclipse.jface Show documentation
This is org.eclipse.jface jar used by Scout SDK
The newest version!
/*******************************************************************************
* Copyright (c) 2000, 2015 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
* Jan-Ove Weichel - Bug 475879
*******************************************************************************/
package org.eclipse.jface.util;
import java.util.ArrayList;
import java.util.Collection;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.viewers.CellLabelProvider;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
/**
* SafeRunnableDialog is a dialog that can show the results of multiple safe
* runnable errors.
*
*/
class SafeRunnableDialog extends ErrorDialog {
private TableViewer statusListViewer;
private Collection statuses = new ArrayList<>();
/**
* Create a new instance of the receiver on a status.
*
* @param status
* The status to display.
*/
SafeRunnableDialog(IStatus status) {
super(null, JFaceResources.getString("error"), status.getMessage(), //$NON-NLS-1$
status, IStatus.ERROR);
setShellStyle(SWT.DIALOG_TRIM | SWT.MODELESS | SWT.RESIZE | SWT.MIN | SWT.MAX
| getDefaultOrientation());
setStatus(status);
statuses.add(status);
setBlockOnOpen(false);
String reason = JFaceResources
.getString("SafeRunnableDialog_checkDetailsMessage"); //$NON-NLS-1$
if (status.getException() != null) {
reason = status.getException().getMessage() == null ? status
.getException().toString() : status.getException()
.getMessage();
}
this.message = JFaceResources.format("SafeRunnableDialog_reason", //$NON-NLS-1$
status.getMessage(), reason);
}
/**
* Method which should be invoked when new errors become available for
* display
*/
void refresh() {
if (AUTOMATED_MODE)
return;
createStatusList((Composite) dialogArea);
updateEnablements();
}
@Override
protected Control createDialogArea(Composite parent) {
Control area = super.createDialogArea(parent);
createStatusList((Composite) area);
return area;
}
/**
* Create the status list if required.
*
* @param parent
* the Control to create it in.
*/
private void createStatusList(Composite parent) {
if (isMultipleStatusDialog()) {
if (statusListViewer == null) {
// The job list doesn't exist so create it.
setMessage(JFaceResources
.getString("SafeRunnableDialog_MultipleErrorsMessage")); //$NON-NLS-1$
getShell()
.setText(
JFaceResources
.getString("SafeRunnableDialog_MultipleErrorsTitle")); //$NON-NLS-1$
createStatusListArea(parent);
showDetailsArea();
}
refreshStatusList();
}
}
/*
* Update the button enablements
*/
private void updateEnablements() {
Button details = getButton(IDialogConstants.DETAILS_ID);
if (details != null) {
details.setEnabled(true);
}
}
/**
* This method sets the message in the message label.
*
* @param messageString -
* the String for the message area
*/
private void setMessage(String messageString) {
// must not set null text in a label
message = messageString == null ? "" : messageString; //$NON-NLS-1$
if (messageLabel == null || messageLabel.isDisposed()) {
return;
}
messageLabel.setText(message);
}
/**
* Create an area that allow the user to select one of multiple jobs that
* have reported errors
*
* @param parent -
* the parent of the area
*/
private void createStatusListArea(Composite parent) {
// Display a list of jobs that have reported errors
statusListViewer = new TableViewer(parent, SWT.SINGLE | SWT.H_SCROLL
| SWT.V_SCROLL | SWT.BORDER);
statusListViewer.setComparator(getViewerComparator());
Control control = statusListViewer.getControl();
GridData data = new GridData(GridData.FILL_BOTH
| GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL);
data.heightHint = convertHeightInCharsToPixels(10);
data.horizontalSpan = 2;
control.setLayoutData(data);
statusListViewer.setContentProvider(getStatusContentProvider());
statusListViewer.setLabelProvider(getStatusListLabelProvider());
statusListViewer
.addSelectionChangedListener(event -> handleSelectionChange());
applyDialogFont(parent);
statusListViewer.setInput(this);
}
/**
* Return the label provider for the status list.
*
* @return CellLabelProvider
*/
private CellLabelProvider getStatusListLabelProvider() {
return new CellLabelProvider() {
@Override
public void update(ViewerCell cell) {
cell.setText(((IStatus) cell.getElement()).getMessage());
}
};
}
/**
* Return the content provider for the statuses.
*
* @return IStructuredContentProvider
*/
private IStructuredContentProvider getStatusContentProvider() {
return new IStructuredContentProvider() {
@Override
public Object[] getElements(Object inputElement) {
return statuses.toArray();
}
@Override
public void dispose() {
}
@Override
public void inputChanged(Viewer viewer, Object oldInput,
Object newInput) {
}
};
}
/*
* Return whether there are multiple errors to be displayed
*/
private boolean isMultipleStatusDialog() {
return statuses.size() > 1;
}
/**
* Return a viewer sorter for looking at the jobs.
*
* @return ViewerSorter
*/
private ViewerComparator getViewerComparator() {
return new ViewerComparator() {
@Override
public int compare(Viewer testViewer, Object e1, Object e2) {
String message1 = ((IStatus) e1).getMessage();
String message2 = ((IStatus) e2).getMessage();
if (message1 == null)
return 1;
if (message2 == null)
return -1;
return message1.compareTo(message2);
}
};
}
/**
* Refresh the contents of the viewer.
*/
void refreshStatusList() {
if (statusListViewer != null
&& !statusListViewer.getControl().isDisposed()) {
statusListViewer.refresh();
Point newSize = getShell().computeSize(SWT.DEFAULT, SWT.DEFAULT);
getShell().setSize(newSize);
}
}
/**
* Get the single selection. Return null if the selection is not just one
* element.
*
* @return IStatus or null
.
*/
private IStatus getSingleSelection() {
ISelection rawSelection = statusListViewer.getSelection();
if (rawSelection != null
&& rawSelection instanceof IStructuredSelection) {
IStructuredSelection selection = (IStructuredSelection) rawSelection;
if (selection.size() == 1) {
return (IStatus) selection.getFirstElement();
}
}
return null;
}
/**
* The selection in the multiple job list has changed. Update widget
* enablements and repopulate the list.
*/
void handleSelectionChange() {
IStatus newSelection = getSingleSelection();
setStatus(newSelection);
updateEnablements();
showDetailsArea();
}
@Override
protected boolean shouldShowDetailsButton() {
return true;
}
/**
* Add the status to the receiver.
* @param status
*/
public void addStatus(IStatus status) {
statuses.add(status);
refresh();
}
}