package org.xmind.ui.internal.editor; import java.io.ByteArrayOutputStream; import java.io.PrintStream; import org.eclipse.core.runtime.Platform; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.jface.util.Util; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.StyledText; import org.eclipse.swt.dnd.Clipboard; import org.eclipse.swt.dnd.TextTransfer; import org.eclipse.swt.dnd.Transfer; import org.eclipse.swt.events.TraverseEvent; import org.eclipse.swt.events.TraverseListener; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.xmind.ui.internal.MindMapMessages; import org.xmind.ui.resources.FontUtils; public class ErrorDetailsDialog extends Dialog { private Throwable error; private String title; private long time; private String text; public ErrorDetailsDialog(Throwable error, String title, long time) { super((Shell) null); this.error = error; this.title = title; this.time = time; setShellStyle(SWT.DIALOG_TRIM | SWT.MAX | SWT.RESIZE | getDefaultOrientation()); setBlockOnOpen(false); } @Override protected void configureShell(Shell newShell) { super.configureShell(newShell); // newShell.setText("Details of Error"); newShell.setText(MindMapMessages.ErrorDetailDialog_title); newShell.addTraverseListener(new TraverseListener() { public void keyTraversed(TraverseEvent e) { if (e.detail == SWT.TRAVERSE_ESCAPE) { setReturnCode(CANCEL); close(); } } }); } @Override protected Control createDialogArea(Composite parent) { Composite composite = (Composite) super.createDialogArea(parent); createErrorLogArea(composite); return composite; } private void createErrorLogArea(Composite parent) { StyledText logControl = new StyledText(parent, SWT.READ_ONLY | SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER); logControl.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); logControl.setText(getLogText()); if (Util.isMac()) { logControl.setFont(FontUtils.getRelativeHeight( JFaceResources.DIALOG_FONT, 1)); } } @Override protected boolean isResizable() { return true; } @Override protected void createButtonsForButtonBar(Composite parent) { createButton(parent, IDialogConstants.FINISH_ID, MindMapMessages.Finish_button_text, false); createButton(parent, IDialogConstants.CLOSE_ID, IDialogConstants.CLOSE_LABEL, true); } @Override protected void buttonPressed(int buttonId) { if (buttonId == IDialogConstants.FINISH_ID) { copyToClipboard(); } else if (buttonId == IDialogConstants.CLOSE_ID) { okPressed(); } else { super.buttonPressed(buttonId); } } private void copyToClipboard() { Clipboard clipboard = new Clipboard(Display.getCurrent()); try { clipboard.setContents(new Object[] { getLogText() }, new Transfer[] { TextTransfer.getInstance() }); } finally { clipboard.dispose(); } } @Override protected Point getInitialSize() { return new Point(500, 420); } private String getLogText() { if (text != null) return text; ByteArrayOutputStream out = new ByteArrayOutputStream(); PrintStream ps = new PrintStream(out); ps.println(title); ps.println("-----------------------------"); //$NON-NLS-1$ ps.println("Time: " + String.format("%1$tF %1$tT", time)); //$NON-NLS-1$ //$NON-NLS-2$ ps.print("XMind: 3.3.0"); //$NON-NLS-1$ if (isPro()) { ps.println(" Pro"); //$NON-NLS-1$ } else { ps.println(); } ps.println("Java Version: " + System.getProperty("java.version")); //$NON-NLS-1$ //$NON-NLS-2$ ps.println("Java Vendor: " + System.getProperty("java.vendor")); //$NON-NLS-1$ //$NON-NLS-2$ ps.println("Java Runtime: " + System.getProperty("java.runtime.name")); //$NON-NLS-1$ //$NON-NLS-2$ ps.println(" Version: " + System.getProperty("java.runtime.version")); //$NON-NLS-1$ //$NON-NLS-2$ ps.println("Java VM: " + System.getProperty("java.vm.name")); //$NON-NLS-1$ //$NON-NLS-2$ ps.println(" Version: " + System.getProperty("java.vm.version")); //$NON-NLS-1$ //$NON-NLS-2$ ps.println(" Vendor: " + System.getProperty("java.vm.vendor")); //$NON-NLS-1$ //$NON-NLS-2$ ps.println(" Info: " + System.getProperty("java.vm.info")); //$NON-NLS-1$ //$NON-NLS-2$ ps.println("Operating System: " + System.getProperty("os.name") //$NON-NLS-1$ //$NON-NLS-2$ + " " + System.getProperty("os.version") //$NON-NLS-1$ //$NON-NLS-2$ + " (" + System.getProperty("os.arch") //$NON-NLS-1$ //$NON-NLS-2$ + ")"); //$NON-NLS-1$ ps.println("Language: " + System.getProperty("user.language")); //$NON-NLS-1$ //$NON-NLS-2$ ps.println("Country: " + System.getProperty("user.country")); //$NON-NLS-1$ //$NON-NLS-2$ ps.println("XMind Distribution Pack: " + System.getProperty("org.xmind.product.distribution.id")); //$NON-NLS-1$ //$NON-NLS-2$ ps.println("-----------------------------"); //$NON-NLS-1$ error.printStackTrace(ps); ps.close(); text = out.toString();//.replaceAll("\\r\\n|\\r", "\\n"); return text; } private static boolean isPro() { return Platform.getBundle("org.xmind.meggy") != null; //$NON-NLS-1$ } }