Bug 577878 - [GTK] Extract common part from TreeDragSourceEffect, TableDragSourceEffect

The function's bodies were identical except for 'tree' vs 'table' variable name.

Change-Id: Iab6c9f973a0a97aacd819557b14ed3949226ac47
Signed-off-by: Alexandr Miloslavskiy <alexandr.miloslavskiy@syntevo.com>
Reviewed-on: https://git.eclipse.org/r/c/platform/eclipse.platform.swt/+/192264
Tested-by: Platform Bot <platform-bot@eclipse.org>
Reviewed-by: Alexander Kurtakov <akurtako@redhat.com>
diff --git a/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/gtk/org/eclipse/swt/dnd/TableDragSourceEffect.java b/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/gtk/org/eclipse/swt/dnd/TableDragSourceEffect.java
index ac4df82..7dc98a6 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/gtk/org/eclipse/swt/dnd/TableDragSourceEffect.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/gtk/org/eclipse/swt/dnd/TableDragSourceEffect.java
@@ -13,10 +13,7 @@
  *******************************************************************************/
 package org.eclipse.swt.dnd;
 
-import org.eclipse.swt.*;
 import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.internal.cairo.*;
-import org.eclipse.swt.internal.gtk.*;
 import org.eclipse.swt.widgets.*;
 
 /**
@@ -83,71 +80,7 @@
 
 	Image getDragSourceImage(DragSourceEvent event) {
 		if (dragSourceImage != null) dragSourceImage.dispose();
-		dragSourceImage = null;
-
-		Table table = (Table) control;
-
-		/*
-		* Bug in GTK.  gtk_tree_selection_get_selected_rows() segmentation faults
-		* in versions smaller than 2.2.4 if the model is NULL.  The fix is
-		* to give a valid pointer instead.
-		*/
-		long handle = table.handle;
-		long selection = GTK.gtk_tree_view_get_selection (handle);
-		long [] model = null;
-		long list = GTK.gtk_tree_selection_get_selected_rows (selection, model);
-		if (list == 0) return null;
-		int count = Math.min(10, OS.g_list_length (list));
-		long originalList = list;
-
-		Display display = table.getDisplay();
-		if (count == 1) {
-			long path = OS.g_list_nth_data (list, 0);
-			long icon = GTK.gtk_tree_view_create_row_drag_icon (handle, path);
-			dragSourceImage =  Image.gtk_new (display, SWT.ICON, icon, 0);
-			GTK.gtk_tree_path_free (path);
-		} else {
-			int width = 0, height = 0;
-			int[] w = new int[1], h = new int[1];
-			int[] yy = new int[count], hh = new int[count];
-			long [] icons = new long [count];
-			GdkRectangle rect = new GdkRectangle ();
-			for (int i=0; i<count; i++) {
-				long path = OS.g_list_data (list);
-				GTK.gtk_tree_view_get_cell_area (handle, path, 0, rect);
-				icons[i] = GTK.gtk_tree_view_create_row_drag_icon(handle, path);
-				switch (Cairo.cairo_surface_get_type(icons[i])) {
-				case Cairo.CAIRO_SURFACE_TYPE_IMAGE:
-					w[0] = Cairo.cairo_image_surface_get_width(icons[i]);
-					h[0] = Cairo.cairo_image_surface_get_height(icons[i]);
-					break;
-				case Cairo.CAIRO_SURFACE_TYPE_XLIB:
-					w[0] = Cairo.cairo_xlib_surface_get_width(icons[i]);
-					h[0] = Cairo.cairo_xlib_surface_get_height(icons[i]);
-					break;
-				}
-				width = Math.max(width, w[0]);
-				height = rect.y + h[0] - yy[0];
-				yy[i] = rect.y;
-				hh[i] = h[0];
-				list = OS.g_list_next (list);
-				GTK.gtk_tree_path_free (path);
-			}
-			long surface  = Cairo.cairo_image_surface_create(Cairo.CAIRO_FORMAT_ARGB32, width, height);
-			if (surface == 0) SWT.error(SWT.ERROR_NO_HANDLES);
-			long cairo = Cairo.cairo_create(surface);
-			if (cairo == 0) SWT.error(SWT.ERROR_NO_HANDLES);
-			Cairo.cairo_set_operator(cairo, Cairo.CAIRO_OPERATOR_SOURCE);
-			for (int i=0; i<count; i++) {
-				Cairo.cairo_set_source_surface (cairo, icons[i], 2, yy[i] - yy[0] + 2);
-				Cairo.cairo_rectangle(cairo, 0, yy[i] - yy[0], width, hh[i]);
-				Cairo.cairo_fill(cairo);
-				Cairo.cairo_surface_destroy(icons[i]);
-			}
-			Cairo.cairo_destroy(cairo);
-			dragSourceImage =  Image.gtk_new (display, SWT.ICON, surface, 0);
-		}
-		OS.g_list_free (originalList);
+		dragSourceImage = TreeTableCommon.getDragSourceImage(control);
 		return dragSourceImage;
 	}
 }
diff --git a/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/gtk/org/eclipse/swt/dnd/TreeDragSourceEffect.java b/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/gtk/org/eclipse/swt/dnd/TreeDragSourceEffect.java
index 9163528..f6eb761 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/gtk/org/eclipse/swt/dnd/TreeDragSourceEffect.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/gtk/org/eclipse/swt/dnd/TreeDragSourceEffect.java
@@ -13,10 +13,7 @@
  *******************************************************************************/
 package org.eclipse.swt.dnd;
 
-import org.eclipse.swt.*;
 import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.internal.cairo.*;
-import org.eclipse.swt.internal.gtk.*;
 import org.eclipse.swt.widgets.*;
 
 /**
@@ -82,71 +79,7 @@
 
 	Image getDragSourceImage(DragSourceEvent event) {
 		if (dragSourceImage != null) dragSourceImage.dispose();
-		dragSourceImage = null;
-
-		Tree tree = (Tree) control;
-
-		/*
-		 * Bug in GTK.  gtk_tree_selection_get_selected_rows() segmentation faults
-		 * in versions smaller than 2.2.4 if the model is NULL.  The fix is
-		 * to give a valid pointer instead.
-		 */
-		long handle = tree.handle;
-		long selection = GTK.gtk_tree_view_get_selection (handle);
-		long [] model =  null;
-		long list = GTK.gtk_tree_selection_get_selected_rows (selection, model);
-		if (list == 0) return null;
-		int count = Math.min(10, OS.g_list_length (list));
-		long originalList = list;
-
-		Display display = tree.getDisplay();
-		if (count == 1) {
-			long path = OS.g_list_nth_data (list, 0);
-			long icon = GTK.gtk_tree_view_create_row_drag_icon (handle, path);
-			dragSourceImage =  Image.gtk_new (display, SWT.ICON, icon, 0);
-			GTK.gtk_tree_path_free (path);
-		} else {
-			int width = 0, height = 0;
-			int[] w = new int[1], h = new int[1];
-			int[] yy = new int[count], hh = new int[count];
-			long [] icons = new long [count];
-			GdkRectangle rect = new GdkRectangle ();
-			for (int i=0; i<count; i++) {
-				long path = OS.g_list_data (list);
-				GTK.gtk_tree_view_get_cell_area (handle, path, 0, rect);
-				icons[i] = GTK.gtk_tree_view_create_row_drag_icon(handle, path);
-				switch (Cairo.cairo_surface_get_type(icons[i])) {
-				case Cairo.CAIRO_SURFACE_TYPE_IMAGE:
-					w[0] = Cairo.cairo_image_surface_get_width(icons[i]);
-					h[0] = Cairo.cairo_image_surface_get_height(icons[i]);
-					break;
-				case Cairo.CAIRO_SURFACE_TYPE_XLIB:
-					w[0] = Cairo.cairo_xlib_surface_get_width(icons[i]);
-					h[0] = Cairo.cairo_xlib_surface_get_height(icons[i]);
-					break;
-				}
-				width = Math.max(width, w[0]);
-				height = rect.y + h[0] - yy[0];
-				yy[i] = rect.y;
-				hh[i] = h[0];
-				list = OS.g_list_next (list);
-				GTK.gtk_tree_path_free (path);
-			}
-			long surface = Cairo.cairo_image_surface_create(Cairo.CAIRO_FORMAT_ARGB32, width, height);
-			if (surface == 0) SWT.error(SWT.ERROR_NO_HANDLES);
-			long cairo = Cairo.cairo_create(surface);
-			if (cairo == 0) SWT.error(SWT.ERROR_NO_HANDLES);
-			Cairo.cairo_set_operator(cairo, Cairo.CAIRO_OPERATOR_SOURCE);
-			for (int i=0; i<count; i++) {
-				Cairo.cairo_set_source_surface (cairo, icons[i], 2, yy[i] - yy[0] + 2);
-				Cairo.cairo_rectangle(cairo, 0, yy[i] - yy[0], width, hh[i]);
-				Cairo.cairo_fill(cairo);
-				Cairo.cairo_surface_destroy(icons[i]);
-			}
-			Cairo.cairo_destroy(cairo);
-			dragSourceImage =  Image.gtk_new (display, SWT.ICON, surface, 0);
-		}
-		OS.g_list_free (originalList);
+		dragSourceImage = TreeTableCommon.getDragSourceImage(control);
 		return dragSourceImage;
 	}
 }
diff --git a/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/gtk/org/eclipse/swt/dnd/TreeTableCommon.java b/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/gtk/org/eclipse/swt/dnd/TreeTableCommon.java
new file mode 100644
index 0000000..2456016
--- /dev/null
+++ b/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/gtk/org/eclipse/swt/dnd/TreeTableCommon.java
@@ -0,0 +1,89 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2022 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.swt.dnd;
+
+import org.eclipse.swt.*;
+import org.eclipse.swt.graphics.*;
+import org.eclipse.swt.internal.cairo.*;
+import org.eclipse.swt.internal.gtk.*;
+import org.eclipse.swt.widgets.*;
+
+class TreeTableCommon {
+	static Image getDragSourceImage(Control control) {
+		Image dragSourceImage;
+
+		/*
+		 * Bug in GTK.  gtk_tree_selection_get_selected_rows() segmentation faults
+		 * in versions smaller than 2.2.4 if the model is NULL.  The fix is
+		 * to give a valid pointer instead.
+		 */
+		long handle = control.handle;
+		long selection = GTK.gtk_tree_view_get_selection (handle);
+		long [] model =  null;
+		long list = GTK.gtk_tree_selection_get_selected_rows (selection, model);
+		if (list == 0) return null;
+		int count = Math.min(10, OS.g_list_length (list));
+		long originalList = list;
+
+		Display display = control.getDisplay();
+		if (count == 1) {
+			long path = OS.g_list_nth_data (list, 0);
+			long icon = GTK.gtk_tree_view_create_row_drag_icon (handle, path);
+			dragSourceImage =  Image.gtk_new (display, SWT.ICON, icon, 0);
+			GTK.gtk_tree_path_free (path);
+		} else {
+			int width = 0, height = 0;
+			int[] w = new int[1], h = new int[1];
+			int[] yy = new int[count], hh = new int[count];
+			long [] icons = new long [count];
+			GdkRectangle rect = new GdkRectangle ();
+			for (int i=0; i<count; i++) {
+				long path = OS.g_list_data (list);
+				GTK.gtk_tree_view_get_cell_area (handle, path, 0, rect);
+				icons[i] = GTK.gtk_tree_view_create_row_drag_icon(handle, path);
+				switch (Cairo.cairo_surface_get_type(icons[i])) {
+				case Cairo.CAIRO_SURFACE_TYPE_IMAGE:
+					w[0] = Cairo.cairo_image_surface_get_width(icons[i]);
+					h[0] = Cairo.cairo_image_surface_get_height(icons[i]);
+					break;
+				case Cairo.CAIRO_SURFACE_TYPE_XLIB:
+					w[0] = Cairo.cairo_xlib_surface_get_width(icons[i]);
+					h[0] = Cairo.cairo_xlib_surface_get_height(icons[i]);
+					break;
+				}
+				width = Math.max(width, w[0]);
+				height = rect.y + h[0] - yy[0];
+				yy[i] = rect.y;
+				hh[i] = h[0];
+				list = OS.g_list_next (list);
+				GTK.gtk_tree_path_free (path);
+			}
+			long surface = Cairo.cairo_image_surface_create(Cairo.CAIRO_FORMAT_ARGB32, width, height);
+			if (surface == 0) SWT.error(SWT.ERROR_NO_HANDLES);
+			long cairo = Cairo.cairo_create(surface);
+			if (cairo == 0) SWT.error(SWT.ERROR_NO_HANDLES);
+			Cairo.cairo_set_operator(cairo, Cairo.CAIRO_OPERATOR_SOURCE);
+			for (int i=0; i<count; i++) {
+				Cairo.cairo_set_source_surface (cairo, icons[i], 2, yy[i] - yy[0] + 2);
+				Cairo.cairo_rectangle(cairo, 0, yy[i] - yy[0], width, hh[i]);
+				Cairo.cairo_fill(cairo);
+				Cairo.cairo_surface_destroy(icons[i]);
+			}
+			Cairo.cairo_destroy(cairo);
+			dragSourceImage = Image.gtk_new (display, SWT.ICON, surface, 0);
+		}
+		OS.g_list_free (originalList);
+		return dragSourceImage;
+	}
+}