/**
* This file is protected by Copyright.
* Please refer to the COPYRIGHT file distributed with this source distribution.
*
* This file is part of REDHAWK IDE.
*
* 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.
*
*/
package gov.redhawk.sca.ui;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Collections;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.MultiStatus;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.TrayDialog;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.statushandlers.StatusManager;
/**
* Displays details about Status.
* Event information is split in three sections: details, stack trace. Details
* contain event message and severity. Stack trace is displayed if an exception is bound
* to event.
* @since 7.0
*/
public class EventDetailsDialog extends TrayDialog {
private final IStatus status;
private static final int SAVE_SELECTED_STATUS = IDialogConstants.CLIENT_ID + 1;
private static final int SAVE_ROOT_STATUS = IDialogConstants.CLIENT_ID;
private Label severityImageLabel;
private Label severityLabel;
private Text msgText;
private Text stackTraceText;
// location configuration
private IStatus selection;
private TreeViewer multiStatusViewer;
/**
*
* @param parentShell shell in which dialog is displayed
* @param selection entry initially selected and to be displayed
* @param provider viewer
* @param comparator comparator used to order all entries
*/
public EventDetailsDialog(final Shell parentShell, final IStatus status) {
super(parentShell);
this.status = status;
setShellStyle(SWT.MODELESS | SWT.MIN | SWT.MAX | SWT.RESIZE | SWT.CLOSE | SWT.BORDER | SWT.TITLE);
}
@Override
public void create() {
super.create();
final int SHELL_WIDTH = 500;
final int SHELL_HEIGHT = 550;
getShell().setSize(SHELL_WIDTH, SHELL_HEIGHT);
getShell().setText("Event Details");
Dialog.applyDialogFont(this.buttonBar);
getButton(IDialogConstants.OK_ID).setFocus();
}
@Override
protected void buttonPressed(final int buttonId) {
if (IDialogConstants.OK_ID == buttonId) {
okPressed();
} else if (IDialogConstants.CANCEL_ID == buttonId) {
cancelPressed();
} else if (EventDetailsDialog.SAVE_ROOT_STATUS == buttonId) {
copyPressed(this.status);
} else if (EventDetailsDialog.SAVE_SELECTED_STATUS == buttonId) {
copyPressed(this.selection);
}
}
protected void copyPressed(final IStatus entry) {
if (entry != null) {
StatusManager.getManager().handle(entry, StatusManager.LOG);
}
}
public void updateProperties() {
if (this.selection != null) {
this.severityImageLabel.setImage(getSeverityImage(this.selection));
this.severityLabel.setText(getSeverityText(this.selection));
this.msgText.setText(this.selection.getMessage());
String stack = null;
if (this.selection.getException() != null) {
final StringWriter writer = new StringWriter();
final PrintWriter pwriter = new PrintWriter(writer);
this.selection.getException().printStackTrace(pwriter);// SUPPRESS CHECKSTYLE LOG
stack = writer.toString();
}
if (stack != null) {
this.stackTraceText.setText(stack);
} else {
this.stackTraceText.setText("No stack");
}
} else {
this.severityImageLabel.setImage(null);
this.severityLabel.setText("");
this.msgText.setText("");
this.stackTraceText.setText("");
}
}
private Image getSeverityImage(final IStatus entry) {
switch (entry.getSeverity()) {
case IStatus.ERROR:
return PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJS_ERROR_TSK);
case IStatus.INFO:
return PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJS_INFO_TSK);
case IStatus.WARNING:
return PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJS_WARN_TSK);
case IStatus.OK:
case IStatus.CANCEL:
default:
break;
}
return null;
}
private String getSeverityText(final IStatus entry) {
switch (entry.getSeverity()) {
case IStatus.ERROR:
return "Error";
case IStatus.INFO:
return "Info";
case IStatus.WARNING:
return "Warning";
case IStatus.OK:
return "Ok";
case IStatus.CANCEL:
return "Cancel";
default:
return "";
}
}
@Override
protected Control createDialogArea(final Composite parent) {
final Composite container = new Composite(parent, SWT.NONE);
final GridLayout layout = new GridLayout();
layout.numColumns = 1;
container.setLayout(layout);
final GridData gd = new GridData(GridData.FILL_BOTH);
container.setLayoutData(gd);
if (this.status.isMultiStatus()) {
createMultiStatusSection(container);
} else {
this.selection = this.status;
}
createDetailsSection(container);
final SashForm sashForm = createSashForm(container);
createStackSection(sashForm);
updateProperties();
Dialog.applyDialogFont(container);
return container;
}
private void createMultiStatusSection(final Composite parent) {
final int MULTISTATUS_MARGIN = 0;
final int MULTISTATUS_PREFERRED_HEIGHT = 50;
final Group container = new Group(parent, SWT.NONE);
final GridLayout layout = new GridLayout();
layout.marginWidth = MULTISTATUS_MARGIN;
layout.marginHeight = MULTISTATUS_MARGIN;
layout.numColumns = 2;
container.setLayout(layout);
container.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
final GridData gd = new GridData(GridData.FILL_BOTH);
gd.heightHint = MULTISTATUS_PREFERRED_HEIGHT;
container.setLayoutData(gd);
container.setText("Multi-Status");
createMultiStatusTreeSection(container);
createToolbarButtonBar(container, SAVE_ROOT_STATUS);
}
private void createMultiStatusTreeSection(final Composite parent) {
this.multiStatusViewer = new TreeViewer(parent, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER | SWT.FULL_SELECTION);
final GridData gd = new GridData(GridData.FILL_BOTH | GridData.GRAB_HORIZONTAL);
gd.grabExcessHorizontalSpace = true;
this.multiStatusViewer.getControl().setLayoutData(gd);
this.multiStatusViewer.setContentProvider(new ITreeContentProvider() {
@Override
public void inputChanged(final Viewer viewer, final Object oldInput, final Object newInput) {
// TODO Auto-generated method stub
}
@Override
public void dispose() {
// TODO Auto-generated method stub
}
@Override
public boolean hasChildren(final Object element) {
if (element instanceof MultiStatus) {
final MultiStatus s = (MultiStatus) element;
return s.getChildren().length > 0;
}
return false;
}
@Override
public Object getParent(final Object element) {
return null;
}
@Override
public Object[] getElements(final Object element) {
if (element instanceof MultiStatus) {
final MultiStatus s = (MultiStatus) element;
return s.getChildren();
} else {
return Collections.emptyList().toArray();
}
}
@Override
public Object[] getChildren(final Object parentElement) {
// TODO Auto-generated method stub
return getElements(parentElement);
}
});
this.multiStatusViewer.setLabelProvider(new LabelProvider() {
@Override
public String getText(final Object element) {
return ((IStatus) element).getMessage();
}
@Override
public Image getImage(final Object element) {
return getSeverityImage((IStatus) element);
}
});
this.multiStatusViewer.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(final SelectionChangedEvent event) {
EventDetailsDialog.this.selection = (IStatus) ((IStructuredSelection) event.getSelection()).getFirstElement();
updateProperties();
}
});
this.multiStatusViewer.setInput(this.status);
}
private SashForm createSashForm(final Composite parent) {
final int SASH_FORM_MARGIN = 0;
final SashForm sashForm = new SashForm(parent, SWT.VERTICAL);
final GridLayout layout = new GridLayout();
layout.marginWidth = SASH_FORM_MARGIN;
layout.marginHeight = SASH_FORM_MARGIN;
sashForm.setLayout(layout);
sashForm.setLayoutData(new GridData(GridData.FILL_BOTH));
return sashForm;
}
private void createToolbarButtonBar(final Composite parent, final int saveId) {
final int TOOLBAR_BUTTON_MARGIN = 0;
final Composite comp = new Composite(parent, SWT.NONE);
final GridLayout layout = new GridLayout();
layout.marginWidth = TOOLBAR_BUTTON_MARGIN;
layout.marginHeight = TOOLBAR_BUTTON_MARGIN;
layout.numColumns = 1;
comp.setLayout(layout);
comp.setLayoutData(new GridData(GridData.FILL_VERTICAL));
((GridData) comp.getLayoutData()).verticalAlignment = SWT.TOP;
final Button saveButton = createButton(comp, saveId, "", false); //$NON-NLS-1$
final GridData gd = new GridData();
saveButton.setLayoutData(gd);
saveButton.setImage(PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_ETOOL_SAVE_EDIT));
saveButton.setToolTipText("Save event details to the log.");
}
@Override
protected void createButtonsForButtonBar(final Composite parent) {
// create OK button only by default
/** RAP DEPENDENCY ISSUE **/
//Static member not available in RAP
createButton(parent, IDialogConstants.OK_ID, /*IDialogConstants.OK_LABEL*/"Ok", true);
}
private void createDetailsSection(final Composite parent) {
final int DETAILS_MARGIN = 0;
final Composite container = new Composite(parent, SWT.NONE);
final GridLayout layout = new GridLayout();
layout.marginWidth = DETAILS_MARGIN;
layout.marginHeight = DETAILS_MARGIN;
layout.numColumns = 2;
container.setLayout(layout);
container.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
createTextSection(container);
createToolbarButtonBar(container, SAVE_SELECTED_STATUS);
}
private void createTextSection(final Composite parent) {
final int TEXT_CONTAINER_MARGIN = 0;
final int TEXT_CONTAINER_COLUMNS = 3;
final Composite textContainer = new Composite(parent, SWT.NONE);
final GridLayout layout = new GridLayout();
layout.numColumns = TEXT_CONTAINER_COLUMNS;
layout.marginWidth = TEXT_CONTAINER_MARGIN;
layout.marginHeight = TEXT_CONTAINER_MARGIN;
textContainer.setLayout(layout);
textContainer.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
Label label = new Label(textContainer, SWT.NONE);
label.setText("Severity:");
this.severityImageLabel = new Label(textContainer, SWT.NULL);
this.severityLabel = new Label(textContainer, SWT.NULL);
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
this.severityLabel.setLayoutData(gd);
label = new Label(textContainer, SWT.NONE);
label.setText("Message:");
gd = new GridData(GridData.VERTICAL_ALIGN_BEGINNING);
label.setLayoutData(gd);
final int MSG_TEXT_PREFERRED_HEIGHT = 44;
this.msgText = new Text(textContainer, SWT.MULTI | SWT.V_SCROLL | SWT.WRAP | SWT.BORDER);
this.msgText.setEditable(false);
gd = new GridData(GridData.FILL_BOTH | GridData.VERTICAL_ALIGN_BEGINNING | GridData.GRAB_VERTICAL);
gd.horizontalSpan = 2;
gd.heightHint = MSG_TEXT_PREFERRED_HEIGHT;
gd.grabExcessVerticalSpace = true;
this.msgText.setLayoutData(gd);
}
private void createStackSection(final Composite parent) {
final int STACK_SECTION_MARGIN_WIDTH = 6;
final int STACK_SECTION_MARGIN_HEIGHT = 0;
final int STACK_SECTION_PREFERRED_HEIGHT = 100;
final Composite container = new Composite(parent, SWT.NONE);
final GridLayout layout = new GridLayout(2, false);
layout.marginHeight = STACK_SECTION_MARGIN_HEIGHT;
layout.marginWidth = STACK_SECTION_MARGIN_WIDTH;
container.setLayout(layout);
GridData gd = new GridData(GridData.FILL_BOTH);
gd.heightHint = STACK_SECTION_PREFERRED_HEIGHT;
container.setLayoutData(gd);
final Label label = new Label(container, SWT.NONE);
label.setText("Exception Stack Trace:");
gd = new GridData();
gd.verticalAlignment = SWT.BOTTOM;
label.setLayoutData(gd);
this.stackTraceText = new Text(container, SWT.MULTI | SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER);
gd = new GridData(GridData.FILL_BOTH | GridData.GRAB_HORIZONTAL);
gd.grabExcessHorizontalSpace = true;
gd.horizontalSpan = 2;
this.stackTraceText.setLayoutData(gd);
this.stackTraceText.setEditable(false);
}
}