Note that there are some explanatory texts on larger screens.

plurals
  1. POSWT ExpandListener executes before collapse occurs on Linux
    text
    copied!<p>This is a simple executable snippet that shows the issue. </p> <p>When using the ExpandBar the desired outcome is to resize the window when there is a collapse or expand. It works properly on Mac but does not on Linux.</p> <p>It looks like the <strong>ExpandListener</strong> is called before the collapse/expand actually occurs and therefore the <strong>pack()</strong> resizes incorrectly.</p> <p>The async execution is merely a bandage to have it work on Mac but this does not work on Linux.</p> <pre><code>import org.eclipse.swt.*; import org.eclipse.swt.layout.*; import org.eclipse.swt.widgets.*; import org.eclipse.swt.events.ExpandEvent; import org.eclipse.swt.events.ExpandListener; public class ExpandBarExample { public static void main(String[] args) { Shell shell = new Shell(SWT.DIALOG_TRIM | SWT.MIN | SWT.APPLICATION_MODAL); shell.setLayout(new FormLayout()); shell.setText("Expand Bar"); final ExpandBar bar = new ExpandBar(shell, SWT.NONE); FormData fd = new FormData(); fd.top = new FormAttachment(0); fd.left = new FormAttachment(0); fd.right = new FormAttachment(100); fd.bottom = new FormAttachment(100); bar.setLayoutData(fd); bar.addExpandListener(new ExpandListener() { public void itemCollapsed(ExpandEvent arg0) { Display.getCurrent().asyncExec(new Runnable() { public void run() { bar.getShell().pack(); } }); } public void itemExpanded(ExpandEvent arg0) { bar.getShell().pack(); Display.getCurrent().asyncExec(new Runnable() { public void run() { bar.getShell().pack(); } }); } }); Composite composite = new Composite(bar, SWT.NONE); fd = new FormData(); fd.left = new FormAttachment(0); fd.right = new FormAttachment(100); composite.setLayoutData(fd); FormLayout layout = new FormLayout(); layout.marginLeft = layout.marginTop = layout.marginRight = layout.marginBottom = 8; composite.setLayout(layout); Label label = new Label(composite, SWT.NONE); label.setText("This is Bar 1"); ExpandItem item1 = new ExpandItem(bar, SWT.NONE, 0); item1.setText("Bar 1"); item1.setHeight(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT).y); item1.setControl(composite); item1.setExpanded(true); composite = new Composite(bar, SWT.NONE); fd = new FormData(); fd.left = new FormAttachment(0); fd.right = new FormAttachment(100); composite.setLayoutData(fd); layout = new FormLayout(); layout.marginLeft = layout.marginTop = layout.marginRight = layout.marginBottom = 8; composite.setLayout(layout); label = new Label(composite, SWT.NONE); label.setText("This is Bar2"); ExpandItem item2 = new ExpandItem(bar, SWT.NONE, 1); item2.setText("Bar 2"); item2.setHeight(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT).y); item2.setControl(composite); item2.setExpanded(true); composite = new Composite(bar, SWT.NONE); fd = new FormData(); fd.left = new FormAttachment(0); fd.right = new FormAttachment(100); composite.setLayoutData(fd); layout = new FormLayout(); layout.marginLeft = layout.marginTop = layout.marginRight = layout.marginBottom = 8; composite.setLayout(layout); label = new Label(composite, SWT.NONE); label.setText("This is Bar3"); ExpandItem item3 = new ExpandItem(bar, SWT.NONE, 2); item3.setText("Bar 3"); item3.setHeight(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT).y); item3.setControl(composite); item3.setExpanded(true); bar.setSpacing(6); shell.pack(); shell.open(); Display display = shell.getDisplay(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } display.dispose(); } } </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload