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;
+ }
+}