package org.argeo.cms.swt.dialogs;
+import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
private String message;
private Throwable exception;
+ private Text stack;
+
private CmsFeedback(Shell parentShell, String message, Throwable e) {
super(parentShell);
this.message = message;
log.error(message, e);
try {
+ Display display = LightweightDialog.findDisplay();
+
+ CmsFeedback current = (CmsFeedback) display.getData(CmsFeedback.class.getName());
+ if (current != null) {// already one open
+ current.append("");
+ if (message != null)
+ current.append(message);
+ if (e != null)
+ current.append(e);
+ // FIXME set a limit to the size of the text
+ return current;
+ }
+
CmsFeedback cmsFeedback = new CmsFeedback(null, message, e);
cmsFeedback.setBlockOnOpen(false);
cmsFeedback.open();
+ cmsFeedback.getDisplay().setData(CmsFeedback.class.getName(), cmsFeedback);
return cmsFeedback;
} catch (Throwable e1) {
log.error("Cannot open error feedback (" + e.getMessage() + "), original error below", e);
return cmsFeedback;
}
- /** Tries to find a display */
- // private static Display getDisplay() {
- // try {
- // Display display = Display.getCurrent();
- // if (display != null)
- // return display;
- // else
- // return Display.getDefault();
- // } catch (Exception e) {
- // return Display.getCurrent();
- // }
- // }
-
protected Control createDialogArea(Composite parent) {
parent.setLayout(new GridLayout(2, false));
Label messageLbl = new Label(parent, SWT.WRAP);
+ messageLbl.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
if (message != null)
messageLbl.setText(message);
else if (exception != null)
close.setLayoutData(new GridData(SWT.END, SWT.TOP, false, false));
close.addSelectionListener((Selected) (e) -> closeShell(OK));
- // Composite composite = new Composite(dialogarea, SWT.NONE);
- // composite.setLayout(new GridLayout(2, false));
- // composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
-
if (exception != null) {
- Text stack = new Text(parent, SWT.MULTI | SWT.LEAD | SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);
+ stack = new Text(parent, SWT.MULTI | SWT.LEAD | SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);
stack.setEditable(false);
stack.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1));
- StringWriter sw = new StringWriter();
+ append(exception);
+ }
+ return messageLbl;
+ }
+
+ protected void append(String message) {
+ stack.append(message);
+ stack.append("\n");
+ }
+
+ protected void append(Throwable exception) {
+ try (StringWriter sw = new StringWriter()) {
exception.printStackTrace(new PrintWriter(sw));
- stack.setText(sw.toString());
+ stack.append(sw.toString());
+ } catch (IOException e) {
+ // ignore
}
- // parent.pack();
- return messageLbl;
+ }
+
+ @Override
+ protected void onClose() {
+ getDisplay().setData(CmsFeedback.class.getName(), null);
}
}
private Shell backgroundShell;
private Shell foregoundShell;
+ private Display display;
+
private Integer returnCode = null;
private boolean block = true;
private String title;
/** Tries to find a display */
- private static Display getDisplay() {
+ static Display findDisplay() {
try {
Display display = Display.getCurrent();
if (display != null)
}
public int open() {
+ display = findDisplay();
if (foregoundShell != null)
throw new EclipseUiException("There is already a shell");
backgroundShell = new Shell(parentShell, SWT.ON_TOP);
// } else
// backgroundShell.setMaximized(true);
backgroundShell.setAlpha(128);
- backgroundShell.setBackground(getDisplay().getSystemColor(SWT.COLOR_BLACK));
+ backgroundShell.setBackground(display.getSystemColor(SWT.COLOR_BLACK));
foregoundShell = new Shell(backgroundShell, SWT.NO_TRIM | SWT.ON_TOP);
if (title != null)
setTitle(title);
// shell.pack();
// shell.layout();
- Rectangle shellBounds = parentShell != null ? parentShell.getBounds() : Display.getCurrent().getBounds();// RAP
+ Rectangle shellBounds = parentShell != null ? parentShell.getBounds() : display.getBounds();// RAP
Point dialogSize = foregoundShell.getSize();
int x = shellBounds.x + (shellBounds.width - dialogSize.x) / 2;
int y = shellBounds.y + (shellBounds.height - dialogSize.y) / 2;
closeShell(CANCEL);
}
});
+ backgroundShell.addDisposeListener((event) -> onClose());
if (block) {
block();
return foregoundShell.getShells().length != 0;
}
+ protected void onClose() {
+
+ }
+
// public synchronized int openAndWait() {
// open();
// while (returnCode == null)
return returnCode;
}
+ Display getDisplay() {
+ return display;
+ }
+
}
\ No newline at end of file