Merge branch 'hotfix/3.12.3' into develop
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / model / CdmErrorDialog.java
index 792386b585b7ef11ad73b42bc7cdf0651b3dcbb3..8e39946ecd94d5e2ef9b35b8907a82e32766c52a 100644 (file)
@@ -5,7 +5,13 @@ import org.eclipse.jface.dialogs.ErrorDialog;
 import org.eclipse.jface.dialogs.IDialogConstants;
 import org.eclipse.jface.resource.JFaceResources;
 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.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.widgets.Button;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.List;
 import org.eclipse.swt.widgets.Shell;
@@ -22,14 +28,56 @@ public      class CdmErrorDialog extends ErrorDialog {
 
        private static final int DIALOG_MAX_HEIGHT = 500;
 
-       public CdmErrorDialog(Shell parentShell, String dialogTitle,
-                       String message, IStatus status) {
-               super(parentShell,
-                               dialogTitle,
-                               message, status,
-                               IStatus.OK| IStatus.INFO | IStatus.WARNING | IStatus.ERROR);
-       }
+       private Button copyButton;
+       private final String stackTrace;
+
+        /**
+     * The current clipboard. To be disposed when closing the dialog.
+     */
+    private Clipboard clipboard;
+
+    /**
+     * @param parentShell
+     * @param dialogTitle
+     * @param message
+     * @param status
+     * @param stackTrace
+     */
+    public CdmErrorDialog(Shell parentShell,
+            String dialogTitle,
+            String message,
+            IStatus status,
+            String stackTrace,
+            boolean showStatusMessage) {
+        super(parentShell,
+                dialogTitle,
+                message, status,
+                IStatus.OK| IStatus.INFO | IStatus.WARNING | IStatus.ERROR);
+        this.stackTrace = stackTrace;
+        String statusMessage = "";
+        if(showStatusMessage) {
+            statusMessage = status.getMessage();
+        }
+        this.message = message == null ? statusMessage : message + "\n " + statusMessage;
+    }
+
 
+    /**
+     * @param parentShell
+     * @param dialogTitle
+     * @param message
+     * @param status
+     */
+    public CdmErrorDialog(Shell parentShell,
+            String dialogTitle,
+            String message,
+            IStatus status) {
+        this(parentShell, dialogTitle, message, status, "", true);
+    }
+
+       /* (non-Javadoc)
+        * @see org.eclipse.jface.dialogs.ErrorDialog#buttonPressed(int)
+        */
        @Override
        protected void buttonPressed(int id) {
                super.buttonPressed(id);
@@ -45,10 +93,56 @@ public      class CdmErrorDialog extends ErrorDialog {
 
        }
 
+       /* (non-Javadoc)
+        * @see org.eclipse.jface.dialogs.ErrorDialog#createDropDownList(org.eclipse.swt.widgets.Composite)
+        */
        @Override
        protected List createDropDownList(Composite parent) {
            List list = super.createDropDownList(parent);
            list.getMenu().getItem(0).setText(JFaceResources.getString("copy all"));
            return list;
        }
+
+       /* (non-Javadoc)
+        * @see org.eclipse.jface.dialogs.ErrorDialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite)
+        */
+       @Override
+       protected void createButtonsForButtonBar(Composite parent) {
+           copyButton = createButton(parent, 2000,"Copy Error", false);
+           copyButton.addSelectionListener(new SelectionListener() {
+               /*
+                * @see SelectionListener.widgetSelected (SelectionEvent)
+                */
+               @Override
+            public void widgetSelected(SelectionEvent e) {
+                   copyStackTraceToClipboard();
+               }
+               /*
+                * @see SelectionListener.widgetDefaultSelected(SelectionEvent)
+                */
+               @Override
+            public void widgetDefaultSelected(SelectionEvent e) {
+                   copyStackTraceToClipboard();
+               }
+           });
+           super.createButtonsForButtonBar(parent);
+       }
+
+
+       /**
+        * Copies the stack trace to the clipboard
+        *
+        */
+       private void copyStackTraceToClipboard() {
+           if(stackTrace != null && !stackTrace.isEmpty()) {
+               if (clipboard != null) {
+                   clipboard.dispose();
+               }
+               clipboard = new Clipboard(copyButton.getDisplay());
+               clipboard.setContents(new Object[] { stackTrace },
+                       new Transfer[] { TextTransfer.getInstance() });
+           }
+       }
+
+
 }