Bug 559771 - [GTK] SWT.CHECK and SWT.MULTI Table space checks only first
selected item

Added ability to press space & have all selected table items checked.

Change-Id: I8f874ed3706d7b934d3ea81c75a3d680d92613a8
Signed-off-by: Paul D'Pong <sdamrong@redhat.com>
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Table.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Table.java
index aeeab7b..f589b6e 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Table.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Table.java
@@ -2150,27 +2150,41 @@
 long gtk_key_press_event (long widget, long event) {
 	int [] key = new int[1];
 	GDK.gdk_event_get_keyval(event, key);
-	keyPressDefaultSelectionHandler (event, key[0]);
-	return super.gtk_key_press_event (widget, event);
-}
 
-/**
- * Used to emulate DefaultSelection event. See Bug 312568.
- * @param event the gtk key press event that was fired.
- */
-void keyPressDefaultSelectionHandler (long event, int key) {
-	int keymask = gdk_event_get_state (event);
-	switch (key) {
+	switch (key[0]) {
 		case GDK.GDK_Return:
 			// Send DefaultSelectionEvent when:
 			// when    : Enter, Shift+Enter, Ctrl+Enter are pressed.
 			// Not when: Alt+Enter, (Meta|Super|Hyper)+Enter, reason is stateMask is not provided on Gtk.
 			// Note: alt+Enter creates a selection on GTK, but we filter it out to be a bit more consitent Win32 (521387)
+			int keymask = gdk_event_get_state (event);
 			if ((keymask & (GDK.GDK_SUPER_MASK | GDK.GDK_META_MASK | GDK.GDK_HYPER_MASK | GDK.GDK_MOD1_MASK)) == 0) {
 				sendTreeDefaultSelection ();
 			}
 			break;
+		case GDK.GDK_space:
+			if ((style & SWT.CHECK) != 0) {
+				TableItem[] selected = getSelection();
+				for (int i = 0; i < selected.length; i++) {
+					toggleItemAndSendEvent(selected[i]);
+				}
+
+				// Maintain current selection by stopping additional handling to GDK_space event
+				return 1;
+			}
+			break;
 	}
+
+	return super.gtk_key_press_event (widget, event);
+}
+
+private void toggleItemAndSendEvent(TableItem item) {
+	item.setChecked (!item.getChecked ());
+
+	Event event = new Event ();
+	event.detail = SWT.CHECK;
+	event.item = item;
+	sendSelectionEvent (SWT.Selection, event, false);
 }
 
 /**
@@ -2360,11 +2374,7 @@
 		int [] index = new int [1];
 		C.memmove (index, indices, 4);
 		TableItem item = _getItem (index [0]);
-		item.setChecked (!item.getChecked ());
-		Event event = new Event ();
-		event.detail = SWT.CHECK;
-		event.item = item;
-		sendSelectionEvent (SWT.Selection, event, false);
+		toggleItemAndSendEvent(item);
 	}
 	GTK.gtk_tree_path_free (path);
 	return 0;