Bug 302918: ToolItem setDisabledImage isn't used
Implement ToolItem.setDisabledImage() on GTK. Behaviour
should be in line with Mac/Windows. Attached is a JUnit
test and test snippet.
Tested on GTK3.24 on Fedora 30. No AllNonBrowser JUnit
tests fail.
Change-Id: I8c2d94bed014a7aca4783eb469bf96b62d75cd78
Signed-off-by: Eric Williams <ericwill@redhat.com>
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/ToolItem.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/ToolItem.java
index 663010b..730e92c 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/ToolItem.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/ToolItem.java
@@ -45,11 +45,12 @@
long eventHandle, proxyMenuItem, provider;
ToolBar parent;
Control control;
- Image hotImage, disabledImage;
+ Image hotImage, disabledImage, enabledImage;
String toolTipText;
boolean drawHotImage;
/** True iff map has been hooked for this ToolItem. See bug 546914. */
boolean mapHooked;
+ boolean enabled = true;
/**
* Constructs a new instance of this class given its parent
@@ -856,7 +857,7 @@
if (parent.currentFocusItem == this) parent.currentFocusItem = null;
parent = null;
control = null;
- hotImage = disabledImage = null;
+ hotImage = disabledImage = enabledImage = null;
toolTipText = null;
}
@@ -988,6 +989,19 @@
checkWidget();
if ((style & SWT.SEPARATOR) != 0) return;
disabledImage = image;
+ if (image != null) {
+ ImageList imageList = parent.imageList;
+ if (imageList == null) imageList = parent.imageList = new ImageList ();
+ int imageIndex = imageList.indexOf (image);
+ if (imageIndex == -1) {
+ imageIndex = imageList.add (image);
+ } else {
+ imageList.put (imageIndex, image);
+ }
+ }
+ if (!enabled) {
+ setImage(image);
+ }
}
/**
@@ -1009,7 +1023,10 @@
public void setEnabled (boolean enabled) {
checkWidget();
long topHandle = topHandle ();
- if (GTK.gtk_widget_get_sensitive (topHandle) == enabled) return;
+ if (this.enabled == enabled) return;
+ this.enabled = enabled;
+ if (!enabled && disabledImage != null) setImage (disabledImage);
+ if (enabled && enabledImage != null) setImage (enabledImage);
GTK.gtk_widget_set_sensitive (topHandle, enabled);
}
@@ -1110,6 +1127,11 @@
checkWidget();
if ((style & SWT.SEPARATOR) != 0) return;
super.setImage (image);
+ if (enabled) enabledImage = image;
+ if (!enabled && disabledImage != image) {
+ enabledImage = image;
+ return;
+ }
if (image != null) {
ImageList imageList = parent.imageList;
if (imageList == null) imageList = parent.imageList = new ImageList ();
diff --git a/tests/org.eclipse.swt.tests.gtk/ManualTests/org/eclipse/swt/tests/gtk/snippets/Bug302918_ToolItemDisabled.java b/tests/org.eclipse.swt.tests.gtk/ManualTests/org/eclipse/swt/tests/gtk/snippets/Bug302918_ToolItemDisabled.java
new file mode 100644
index 0000000..49d8380
--- /dev/null
+++ b/tests/org.eclipse.swt.tests.gtk/ManualTests/org/eclipse/swt/tests/gtk/snippets/Bug302918_ToolItemDisabled.java
@@ -0,0 +1,85 @@
+/*******************************************************************************
+ * Copyright (c) 2019 Red Hat and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Red Hat - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.swt.tests.gtk.snippets;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.ImageLoader;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.CoolBar;
+import org.eclipse.swt.widgets.CoolItem;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.ToolBar;
+import org.eclipse.swt.widgets.ToolItem;
+
+public class Bug302918_ToolItemDisabled {
+
+ public static void main(String[] args) {
+ Display display = new Display();
+ Shell shell = new Shell(display);
+ CoolBar bar = new CoolBar(shell, SWT.BORDER);
+ for (int i = 0; i < 2; i++) {
+ CoolItem item = new CoolItem(bar, SWT.NONE);
+ Button button = new Button(bar, SWT.PUSH);
+ button.setText("Button " + i);
+ Point size = button.computeSize(SWT.DEFAULT, SWT.DEFAULT);
+ item.setPreferredSize(item.computeSize(size.x, size.y));
+ item.setControl(button);
+ }
+ ImageLoader loader = new ImageLoader ();
+ loader.load("./images/next_nav.gif");
+ Image nav = new Image (display, loader.data[0]);
+ loader.load("./images/next_nav_dis.gif");
+ Image nav_dis = new Image (display, loader.data[0]);
+
+ ToolBar toolbar = new ToolBar(bar, SWT.NONE);
+ ToolItem item1 = new ToolItem(toolbar, SWT.PUSH);
+ // Image displayed should be nav
+ item1.setImage(nav);
+ item1.setDisabledImage(nav_dis);
+ ToolItem item2 = new ToolItem(toolbar, SWT.PUSH);
+ // Image displayed should be nav_dis
+ item2.setImage(nav_dis);
+ item2.setDisabledImage(nav);
+ ToolItem item3 = new ToolItem(toolbar, SWT.PUSH);
+ // Image displayed should nav_dis
+ item3.setImage(nav);
+ item3.setDisabledImage(nav_dis);
+ item3.setEnabled(false);
+ item3.setImage(nav);
+ ToolItem item4 = new ToolItem(toolbar, SWT.PUSH);
+ // Image displayed should be nav
+ item4.setImage(nav_dis);
+ item4.setDisabledImage(nav);
+ item4.setEnabled(false);
+ toolbar.pack();
+
+ CoolItem citem = new CoolItem(bar, SWT.NONE);
+ Point tsize = toolbar.computeSize(SWT.DEFAULT, SWT.DEFAULT);
+ citem.setPreferredSize(tsize.x+15, tsize.y);
+ citem.setControl(toolbar);
+
+ bar.pack();
+ shell.open();
+ while (!shell.isDisposed()) {
+ if (!display.readAndDispatch())
+ display.sleep();
+ }
+ nav.dispose();
+ nav_dis.dispose();
+ display.dispose();
+ }
+}
diff --git a/tests/org.eclipse.swt.tests.gtk/images/next_nav.gif b/tests/org.eclipse.swt.tests.gtk/images/next_nav.gif
new file mode 100644
index 0000000..ce1e02f
--- /dev/null
+++ b/tests/org.eclipse.swt.tests.gtk/images/next_nav.gif
Binary files differ
diff --git a/tests/org.eclipse.swt.tests.gtk/images/next_nav_dis.gif b/tests/org.eclipse.swt.tests.gtk/images/next_nav_dis.gif
new file mode 100644
index 0000000..954a83c
--- /dev/null
+++ b/tests/org.eclipse.swt.tests.gtk/images/next_nav_dis.gif
Binary files differ
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_ToolItem.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_ToolItem.java
index 2d657c2..89b61c6 100644
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_ToolItem.java
+++ b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_ToolItem.java
@@ -14,6 +14,7 @@
package org.eclipse.swt.tests.junit;
+import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
@@ -62,6 +63,31 @@
public void test_setImageLorg_eclipse_swt_graphics_Image() {
}
+@Test
+public void test_setDisabledImage() {
+ toolItem.setImage(images[0]);
+ toolItem.setDisabledImage(images[1]);
+ toolItem.setEnabled(false);
+ assertEquals(images[1], item.getImage());
+ toolItem.setEnabled(true);
+ assertEquals(images[0], item.getImage());
+ toolItem.setDisabledImage(images[0]);
+ assertEquals(images[0], item.getImage());
+ toolItem.setEnabled(false);
+ assertEquals(images[0], item.getImage());
+ toolItem.setImage(images[0]);
+ toolItem.setEnabled(true);
+ assertEquals(images[0], item.getImage());
+ toolItem.setDisabledImage(images[2]);
+ toolItem.setEnabled(false);
+ assertEquals(images[2], item.getImage());
+ toolItem.setEnabled(true);
+ toolItem.setDisabledImage(null);
+ toolItem.setEnabled(false);
+ assertEquals(images[0], item.getImage());
+
+}
+
@Override
@Test
public void test_setTextLjava_lang_String() {