package org.celllife.idart.misc; import org.eclipse.core.runtime.IStatus; import org.eclipse.swt.SWT; import org.eclipse.swt.dnd.Clipboard; import org.eclipse.swt.dnd.TextTransfer; import org.eclipse.swt.dnd.Transfer; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.List; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; import org.eclipse.swt.widgets.Shell; public class iDARTErrorDialog extends org.eclipse.jface.dialogs.ErrorDialog { private List list; private Clipboard clipboard; private IStatus status; public iDARTErrorDialog(Shell parentShell, String dialogTitle, String message, IStatus status, int displayMask) { super(parentShell, dialogTitle, message, status, displayMask); this.status = status; } /** * Create this dialog's drop-down list component. * * @param parent * the parent composite * @return the drop-down list component */ @Override protected List createDropDownList(Composite parent) { list = new List(parent, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.MULTI); GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL | GridData.VERTICAL_ALIGN_FILL | GridData.GRAB_VERTICAL); data.heightHint = list.getItemHeight() * 10; data.horizontalSpan = 2; list.setLayoutData(data); list.setFont(parent.getFont()); list.addDisposeListener(new DisposeListener() { @Override public void widgetDisposed(DisposeEvent e) { if (clipboard != null) { clipboard.dispose(); } } }); list.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { list.selectAll(); super.widgetSelected(e); } }); list.removeAll(); populateList(status.getException()); createCopyAction(parent); return list; } private void createCopyAction(final Composite parent) { Menu menu = new Menu(parent.getShell(), SWT.POP_UP); MenuItem copyAction = new MenuItem(menu, SWT.PUSH); copyAction.setText("&Copy"); //$NON-NLS-1$ copyAction.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { clipboard = new Clipboard(parent.getDisplay()); clipboard.setContents(new Object[] { prepareCopyString() }, new Transfer[] { TextTransfer.getInstance() }); super.widgetSelected(e); } }); list.setMenu(menu); } private String prepareCopyString() { if (list == null || list.isDisposed()) { return ""; //$NON-NLS-1$ } StringBuffer sb = new StringBuffer(); String newLine = System.getProperty("line.separator"); //$NON-NLS-1$ for (int i = 0; i < list.getItemCount(); i++) { sb.append(list.getItem(i)); sb.append(newLine); } return sb.toString(); } private void populateList(Throwable t) { if (t == null) { list.add("No stack trace"); return; } list.add(t.toString()); StackTraceElement[] ste = t.getStackTrace(); for (int i = 0; i < ste.length; i++) { list.add(ste[i].toString()); } if (t.getCause() != null) { list.add("Caused by:"); populateList(t.getCause()); } } }