diff options
author | Eric Williams | 2018-01-11 18:40:58 +0000 |
---|---|---|
committer | Eric Williams | 2018-01-17 16:05:23 +0000 |
commit | bf4f51d091c1ca54883063f9567fd83cddafeb63 (patch) | |
tree | 66187284e35f133830ea90f959ec2fb91303253e | |
parent | 247d7f9a4fdc740d6f8a82838c37cd93fd029b14 (diff) | |
download | eclipse.platform.swt-bf4f51d091c1ca54883063f9567fd83cddafeb63.tar.gz eclipse.platform.swt-bf4f51d091c1ca54883063f9567fd83cddafeb63.tar.xz eclipse.platform.swt-bf4f51d091c1ca54883063f9567fd83cddafeb63.zip |
Bug 528284: [GTK3] Toolbar: TCF dropdown control is cutoff
Still testing, DO NOT MERGE.
PART 1/2: SWT fix (other fix is for TCF UI code)
Use gtk_button_set_image() instead of gtk_container_add() to prevent
smaller buttons from having trimmed arrow icons when SWT.ARROW is
specified. This change in logic is due to GTK3 using an actual GtkImage
for icons, where GTK2 uses GtkArrow which is its own widget.
Tested with ControlExample and the TCF Target Explorer ToolBar
contribution. No AllNonBrowser JUnit tests fail.
Change-Id: I3c4c33acb689ac36c4567cc8d7bbb5b3ff4e4c19
Signed-off-by: Eric Williams <ericwill@redhat.com>
6 files changed, 107 insertions, 1 deletions
diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os.c b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os.c index 526464acbc..282f8fd346 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os.c +++ b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os.c @@ -7741,6 +7741,16 @@ JNIEXPORT jintLong JNICALL OS_NATIVE(_1gtk_1button_1new) } #endif +#ifndef NO__1gtk_1button_1set_1image +JNIEXPORT void JNICALL OS_NATIVE(_1gtk_1button_1set_1image) + (JNIEnv *env, jclass that, jintLong arg0, jintLong arg1) +{ + OS_NATIVE_ENTER(env, that, _1gtk_1button_1set_1image_FUNC); + gtk_button_set_image(arg0, arg1); + OS_NATIVE_EXIT(env, that, _1gtk_1button_1set_1image_FUNC); +} +#endif + #ifndef NO__1gtk_1calendar_1clear_1marks JNIEXPORT void JNICALL OS_NATIVE(_1gtk_1calendar_1clear_1marks) (JNIEnv *env, jclass that, jintLong arg0) diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_stats.c b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_stats.c index 209d6b4c39..f5bc1cc4c0 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_stats.c +++ b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_stats.c @@ -633,6 +633,7 @@ char * OS_nativeFunctionNames[] = { "_1gtk_1box_1set_1spacing", "_1gtk_1button_1clicked", "_1gtk_1button_1new", + "_1gtk_1button_1set_1image", "_1gtk_1calendar_1clear_1marks", "_1gtk_1calendar_1get_1date", "_1gtk_1calendar_1mark_1day", diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_stats.h b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_stats.h index 7b36883b7f..41480bd6d2 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_stats.h +++ b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_stats.h @@ -643,6 +643,7 @@ typedef enum { _1gtk_1box_1set_1spacing_FUNC, _1gtk_1button_1clicked_FUNC, _1gtk_1button_1new_FUNC, + _1gtk_1button_1set_1image_FUNC, _1gtk_1calendar_1clear_1marks_FUNC, _1gtk_1calendar_1get_1date_FUNC, _1gtk_1calendar_1mark_1day_FUNC, diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk/OS.java b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk/OS.java index 1a35dee7c9..3fa2ede5c6 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk/OS.java +++ b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk/OS.java @@ -6180,6 +6180,15 @@ public static final long /*int*/ gtk_button_new() { lock.unlock(); } } +public static final native void /*int*/ _gtk_button_set_image(long /*int*/ handle, long /*int*/ image); +public static final void /*int*/ gtk_button_set_image(long /*int*/ handle, long /*int*/ image) { + lock.lock(); + try { + _gtk_button_set_image(handle, image); + } finally { + lock.unlock(); + } +} public static final native long /*int*/ _gtk_calendar_new(); public static final long /*int*/ gtk_calendar_new() { lock.lock(); diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Button.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Button.java index ad13b3ec5f..267b3730d8 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Button.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Button.java @@ -347,7 +347,13 @@ void createHandle (int index) { break; } if ((style & SWT.ARROW) != 0) { - OS.gtk_container_add (handle, arrowHandle); + // Use gtk_button_set_image() on GTK3 to prevent icons from being + // trimmed with smaller sized buttons; see bug 528284. + if (OS.GTK3) { + OS.gtk_button_set_image(handle, arrowHandle); + } else { + OS.gtk_container_add (handle, arrowHandle); + } } else { boxHandle = gtk_box_new (OS.GTK_ORIENTATION_HORIZONTAL, false, 4); if (boxHandle == 0) error (SWT.ERROR_NO_HANDLES); diff --git a/tests/org.eclipse.swt.tests.gtk/Bug Snippets/org/eclipse/swt/tests/gtk/snippets/Bug528284_TCFToolBarIssue.java b/tests/org.eclipse.swt.tests.gtk/Bug Snippets/org/eclipse/swt/tests/gtk/snippets/Bug528284_TCFToolBarIssue.java new file mode 100644 index 0000000000..e2f6a6853b --- /dev/null +++ b/tests/org.eclipse.swt.tests.gtk/Bug Snippets/org/eclipse/swt/tests/gtk/snippets/Bug528284_TCFToolBarIssue.java @@ -0,0 +1,79 @@ +package org.eclipse.swt.tests.gtk.snippets; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.ToolBar; +import org.eclipse.swt.widgets.ToolItem; + +/* + * Title: Bug 528284: [GTK3] Toolbar: TCF dropdown control is cutoff + * How to run: launch snippet and observe ToolBar inside the Shell + * Bug description: the Label and Button are cut off on the bottom + * Expected results: the Label and Button should be displayed as expected + * GTK Version(s): GTK3 + */ +public class Bug528284_TCFToolBarIssue { + public static void main(String[] args) { + Display display = new Display(); + Shell shell = new Shell(display); + ToolBar bar = new ToolBar (shell, SWT.HORIZONTAL); + + Composite panel = new Composite(bar, SWT.NONE); + GridLayout layout = new GridLayout(); + layout.marginHeight = 1; layout.marginWidth = 1; + panel.setLayout(layout); + + + Composite labelPanel = new Composite(panel, SWT.BORDER); + labelPanel.setBackground(display.getSystemColor(SWT.COLOR_WHITE)); + GridData layoutData = new GridData(SWT.FILL, SWT.CENTER, true, false); + labelPanel.setLayoutData(layoutData); + layout = new GridLayout(3, false); + layout.marginHeight = 0; + layout.marginWidth = 0; + layout.horizontalSpacing = 0; + labelPanel.setLayout(layout); + + Label image = new Label(labelPanel, SWT.NONE); + layoutData = new GridData(SWT.LEAD, SWT.CENTER, false, true); + layoutData.horizontalIndent = 1; + layoutData.minimumWidth=20; + layoutData.widthHint=20; + image.setLayoutData(layoutData); + + Label text = new Label(labelPanel, SWT.NONE); + layoutData = new GridData(SWT.FILL, SWT.CENTER, true, true); + layoutData.minimumWidth = 25; + text.setLayoutData(layoutData); + + Button button = new Button(labelPanel, SWT.ARROW | SWT.DOWN | SWT.FLAT | SWT.NO_FOCUS); + layoutData = new GridData(SWT.TRAIL, SWT.CENTER, false, true); + layoutData.minimumWidth=20; + layoutData.widthHint = 20; + button.setLayoutData(layoutData); + + text.setText("this is a test"); + + + ToolItem item = new ToolItem(bar, SWT.SEPARATOR); + item.setControl(panel); + item.setWidth(panel.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x); + + bar.pack(); + shell.pack(); + shell.open(); + while (!shell.isDisposed()) { + if (!display.readAndDispatch()) { + display.sleep(); + } + } + display.dispose(); + + } +}
\ No newline at end of file |