Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Williams2018-01-11 18:40:58 +0000
committerEric Williams2018-01-17 16:05:23 +0000
commitbf4f51d091c1ca54883063f9567fd83cddafeb63 (patch)
tree66187284e35f133830ea90f959ec2fb91303253e
parent247d7f9a4fdc740d6f8a82838c37cd93fd029b14 (diff)
downloadeclipse.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>
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os.c10
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_stats.c1
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_stats.h1
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk/OS.java9
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Button.java8
-rw-r--r--tests/org.eclipse.swt.tests.gtk/Bug Snippets/org/eclipse/swt/tests/gtk/snippets/Bug528284_TCFToolBarIssue.java79
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

Back to the top