Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.

Bug 340752

Summary: [GTK3] Control getSize() behaves different in Linux and Windows. Getting wrong value on linux
Product: [Eclipse Project] Platform Reporter: Daniel Galdames <daniel.galdames.dev>
Component: SWTAssignee: Xi Yan <xixiyan>
Status: VERIFIED FIXED QA Contact:
Severity: normal    
Priority: P3 CC: eclipse.felipe, ericwill, geoff.bache
Version: 4.1Keywords: triaged
Target Milestone: 4.9 M2   
Hardware: PC   
OS: Linux-GTK   
See Also: https://git.eclipse.org/r/125833
https://git.eclipse.org/c/platform/eclipse.platform.swt.git/commit/?id=d5742ec2221f97fc3bd39b8b87463c655a3a1271
Whiteboard:

Description Daniel Galdames CLA 2011-03-23 08:53:35 EDT
Calling getSize() from a button contained in a ExpandItem returns (0,0) on Linux. Doing the same on Windows returns (x,y) where x,y = preferred size.
Because getSize() should return the actual size of the control, it seems to be a bug on linux.

An example to reproduce the bug:

import org.eclipse.swt.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.graphics.*;

public class Snippet {
static ExpandBar bar;
static Image image;
static MenuItem item;

public static void main(String[] args) {
Shell shell = new Shell();
Display display = shell.getDisplay();
shell.setLayout(new FillLayout());
shell.setText("ExpandBar Example");

Menu menubar = new Menu(shell, SWT.BAR);
shell.setMenuBar(menubar);
MenuItem fileItem = new MenuItem(menubar, SWT.CASCADE);
fileItem.setText("&File");
Menu submenu = new Menu(shell, SWT.DROP_DOWN);
fileItem.setMenu(submenu);
item = new MenuItem(submenu, SWT.PUSH);
item.setText("New ExpandItem");

bar = new ExpandBar(shell, SWT.V_SCROLL);
image = display.getSystemImage(SWT.ICON_QUESTION);

// First item
Composite composite = new Composite(bar, SWT.NONE);
Menu popupmenu = new Menu(shell, SWT.POP_UP);
MenuItem popupItem = new MenuItem(popupmenu, SWT.PUSH);
popupItem.setText("Popup");
composite.setMenu(popupmenu);

GridLayout layout = new GridLayout(2, false);
layout.marginLeft = layout.marginTop = layout.marginRight = layout.marginBottom = 10;
layout.verticalSpacing = 10;
composite.setLayout(layout);
Label label = new Label(composite, SWT.NONE);
label.setImage(display.getSystemImage(SWT.ICON_ERROR));
label = new Label(composite, SWT.NONE);
label.setText("SWT.ICON_ERROR");
label = new Label(composite, SWT.NONE);
label.setImage(display.getSystemImage(SWT.ICON_INFORMATION)) ;
label = new Label(composite, SWT.NONE);
label.setText("SWT.ICON_INFORMATION");
label = new Label(composite, SWT.NONE);
label.setImage(display.getSystemImage(SWT.ICON_WARNING));
label = new Label(composite, SWT.NONE);
label.setText("SWT.ICON_WARNING");
label = new Label(composite, SWT.NONE);
label.setImage(display.getSystemImage(SWT.ICON_QUESTION));
label = new Label(composite, SWT.NONE);
label.setText("SWT.ICON_QUESTION");
ExpandItem item1 = new ExpandItem(bar, SWT.NONE);
item1.setText("What is your favorite icon");
item1.setHeight(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT).y);
item1.setControl(composite);
item1.setImage(image);

// Second item
composite = new Composite(bar, SWT.NONE);
layout = new GridLayout(2, true);
layout.marginLeft = layout.marginTop = layout.marginRight = layout.marginBottom = 10;
layout.verticalSpacing = 10;
composite.setLayout(layout);
Button button1 = new Button(composite, SWT.PUSH);
button1.setText("Button 1");
Button button2 = new Button(composite, SWT.PUSH);
button2.setText("Button 2");

ExpandItem item0 = new ExpandItem(bar, SWT.NONE);
item0.setText("What is your favorite button");
item0.setHeight(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT).y);
item0.setControl(composite);
item0.setImage(image);
item0.setExpanded(true);

item.addListener(SWT.Selection, new Listener(){
@Override
public void handleEvent(Event e) {
ExpandItem item2 = new ExpandItem(bar, SWT.NONE);
Composite composite = new Composite(bar, SWT.NONE);
GridLayout layout = new GridLayout(2, false);
composite.setLayout(layout);
Label label = new Label(composite, SWT.NONE);
label.setText("What is your name?");
Composite pcomposite = new Composite(composite, SWT.NONE);
Text text = new Text(pcomposite, SWT.NONE);
item2.setText("New Question");
text.pack();
composite.pack();
Point size = composite.computeSize(SWT.DEFAULT, SWT.DEFAULT);
item2.setHeight(size.y);
item2.setControl(composite);
item2.setImage(image);
item2.setExpanded(true);
}
});

bar.setSpacing(8);
shell.setSize(400, 550);
shell.open();
System.out.println("------------------------------");
System.out.println("getSize: " + button1.getSize());
System.out.println("getBounds: " + button1.getBounds());
System.out.println("computeSize: "
+ button1.computeSize(SWT.DEFAULT, SWT.DEFAULT));
System.out.println("getLocation: " + button1.getLocation());

while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
image.dispose();
display.dispose();
}

}
Comment 1 Felipe Heidrich CLA 2011-03-24 10:31:53 EDT
I don't see the problem, I ran your snippet and this is what I got in the console:
------------------------------
getSize: Point {73, 29}
getBounds: Rectangle {15, 15, 73, 29}
computeSize: Point {73, 29}
getLocation: Point {15, 15}

everything seems to work fine.

I'm running with SWT from HEAD.
Comment 2 Daniel Galdames CLA 2011-03-24 14:26:49 EDT
I running with SWT from Hellios(v3.6.2). I think I forgot an important point in my description and even the snippet fails to reproduce it. The problem only seems to appear when the ExpandItem is unexpanded. To reproduce it, please set item0.setExpanded to false in the snippet.
Comment 3 Eric Williams CLA 2016-10-18 16:46:53 EDT
This issue is still reproducible.
Comment 4 Eric Williams CLA 2018-07-06 15:49:27 EDT
Xi, please investigate.
Comment 5 Eclipse Genie CLA 2018-07-09 12:08:57 EDT
New Gerrit change created: https://git.eclipse.org/r/125833
Comment 7 Eric Williams CLA 2018-07-09 13:35:22 EDT
(In reply to Eclipse Genie from comment #6)
> Gerrit change https://git.eclipse.org/r/125833 was merged to [master].
> Commit:
> http://git.eclipse.org/c/platform/eclipse.platform.swt.git/commit/
> ?id=d5742ec2221f97fc3bd39b8b87463c655a3a1271

Patch in master, thanks Xi.