package bndtools.launch.ui.internal; import java.io.ByteArrayOutputStream; import java.io.PrintStream; import java.io.UnsupportedEncodingException; import org.bndtools.core.ui.StatusLabelProvider; import org.bndtools.utils.jface.StatusTreeContentProvider; import org.eclipse.core.runtime.IStatus; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.IMessageProvider; import org.eclipse.jface.dialogs.TitleAreaDialog; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.SashForm; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.Text; public class LaunchStatusDialog extends TitleAreaDialog { private final IStatus status; private Table table; private TableViewer viewer; private Text txtDetails; /** * Create the dialog. * * @param parentShell */ public LaunchStatusDialog(Shell parentShell, IStatus status) { super(parentShell); setShellStyle(SWT.BORDER | SWT.RESIZE | SWT.TITLE); this.status = status; } /** * Create contents of the dialog. * * @param parent */ @Override protected Control createDialogArea(Composite parent) { setTitle(status.getSeverity() <= IStatus.INFO ? "Launch Messages" : "Launch Problems"); if (status.getSeverity() >= IStatus.ERROR) setErrorMessage(status.getMessage()); else if (status.getSeverity() == IStatus.WARNING) setMessage(status.getMessage(), IMessageProvider.WARNING); else if (status.getSeverity() == IStatus.INFO) setMessage(status.getMessage(), IMessageProvider.INFORMATION); else setMessage(status.getMessage(), IMessageProvider.NONE); Composite container = (Composite) super.createDialogArea(parent); container.setLayout(new GridLayout(1, true)); SashForm composite = new SashForm(container, SWT.VERTICAL); composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); Composite left = new Composite(composite, SWT.NONE); left.setLayout(new GridLayout(1, false)); Composite right = new Composite(composite, SWT.NONE); right.setLayout(new GridLayout(1, false)); Label lblProblems = new Label(left, SWT.NONE); lblProblems.setText("Problems:"); Label lblDetails = new Label(right, SWT.NONE); lblDetails.setText("Details:"); table = new Table(left, SWT.BORDER | SWT.FULL_SELECTION); table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); viewer = new TableViewer(table); txtDetails = new Text(right, SWT.BORDER | SWT.READ_ONLY | SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); txtDetails.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); Label lblQuestion = new Label(container, SWT.NONE); GridData gd_lblQuestion = new GridData(SWT.RIGHT, SWT.CENTER, false, false); gd_lblQuestion.horizontalSpan = 2; lblQuestion.setLayoutData(gd_lblQuestion); lblQuestion.setText("Placeholder"); viewer.setContentProvider(new StatusTreeContentProvider()); viewer.setLabelProvider(new StatusLabelProvider()); viewer.setInput(status); viewer.addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { IStatus status = (IStatus) ((IStructuredSelection) event.getSelection()).getFirstElement(); String detail = ""; if (status != null) { ByteArrayOutputStream messageBuffer = new ByteArrayOutputStream(); PrintStream printer = null; try { printer = new PrintStream(messageBuffer, false, "UTF-8"); printer.println(status.toString()); Throwable e = status.getException(); if (e != null) e.printStackTrace(printer); printer.flush(); detail = messageBuffer.toString("UTF-8"); } catch (UnsupportedEncodingException e1) { /* just ignore this, should not happen */ } } txtDetails.setText(detail); } }); if (status.getSeverity() >= IStatus.WARNING) { setMessage("One or more warnings occurred while preparing the runtime environment."); lblQuestion.setText("Continue launching anyway?"); } return container; } /** * Create contents of the button bar. * * @param parent */ @Override protected void createButtonsForButtonBar(Composite parent) { if (status.getSeverity() >= IStatus.WARNING) { createButton(parent, IDialogConstants.OK_ID, IDialogConstants.YES_LABEL, true); createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.NO_LABEL, false); } } /** * Return the initial size of the dialog. */ @Override protected Point getInitialSize() { return new Point(700, 400); } }