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() {