Image getDragSourceImage(DragSourceEvent event) { if (dragSourceImage != null) dragSourceImage.dispose(); dragSourceImage = null; Table table = (Table) control; if (OS.GTK_VERSION < OS.VERSION(2, 2, 0)) return null; // TEMPORARY CODE if (table.isListening(SWT.EraseItem) || table.isListening(SWT.PaintItem)) return null; /* * 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 /*int*/ handle = table.handle; long /*int*/ selection = OS.gtk_tree_view_get_selection(handle); long /*int*/[] model = OS.GTK_VERSION < OS.VERSION(2, 2, 4) ? new long /*int*/[1] : null; long /*int*/ list = OS.gtk_tree_selection_get_selected_rows(selection, model); if (list == 0) return null; int count = Math.min(10, OS.g_list_length(list)); Display display = table.getDisplay(); if (count == 1) { long /*int*/ path = OS.g_list_nth_data(list, 0); long /*int*/ pixmap = OS.gtk_tree_view_create_row_drag_icon(handle, path); dragSourceImage = Image.gtk_new(display, SWT.ICON, pixmap, 0); } 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 /*int*/[] pixmaps = new long /*int*/[count]; GdkRectangle rect = new GdkRectangle(); for (int i = 0; i < count; i++) { long /*int*/ path = OS.g_list_nth_data(list, i); OS.gtk_tree_view_get_cell_area(handle, path, 0, rect); pixmaps[i] = OS.gtk_tree_view_create_row_drag_icon(handle, path); OS.gdk_drawable_get_size(pixmaps[i], w, h); width = Math.max(width, w[0]); height = rect.y + h[0] - yy[0]; yy[i] = rect.y; hh[i] = h[0]; } long /*int*/ source = OS.gdk_pixmap_new(OS.GDK_ROOT_PARENT(), width, height, -1); long /*int*/ gcSource = OS.gdk_gc_new(source); long /*int*/ mask = OS.gdk_pixmap_new(OS.GDK_ROOT_PARENT(), width, height, 1); long /*int*/ gcMask = OS.gdk_gc_new(mask); GdkColor color = new GdkColor(); color.pixel = 0; OS.gdk_gc_set_foreground(gcMask, color); OS.gdk_draw_rectangle(mask, gcMask, 1, 0, 0, width, height); color.pixel = 1; OS.gdk_gc_set_foreground(gcMask, color); for (int i = 0; i < count; i++) { OS.gdk_draw_drawable(source, gcSource, pixmaps[i], 0, 0, 0, yy[i] - yy[0], -1, -1); OS.gdk_draw_rectangle(mask, gcMask, 1, 0, yy[i] - yy[0], width, hh[i]); OS.g_object_unref(pixmaps[i]); } OS.g_object_unref(gcSource); OS.g_object_unref(gcMask); dragSourceImage = Image.gtk_new(display, SWT.ICON, source, mask); } OS.g_list_free(list); return dragSourceImage; }
int /*long*/ gtk_preedit_changed(int /*long*/ imcontext) { if (!isInlineEnabled()) return 0; ranges = null; styles = null; commitCount = 0; int /*long*/ imHandle = imHandle(); int /*long*/[] preeditString = new int /*long*/[1]; int /*long*/[] pangoAttrs = new int /*long*/[1]; int[] cursorPos = new int[1]; OS.gtk_im_context_get_preedit_string(imHandle, preeditString, pangoAttrs, cursorPos); caretOffset = cursorPos[0]; char[] chars = null; if (preeditString[0] != 0) { int length = OS.strlen(preeditString[0]); byte[] buffer = new byte[length]; OS.memmove(buffer, preeditString[0], length); chars = Converter.mbcsToWcs(null, buffer); if (pangoAttrs[0] != 0) { int count = 0; int /*long*/ iterator = OS.pango_attr_list_get_iterator(pangoAttrs[0]); while (OS.pango_attr_iterator_next(iterator)) count++; OS.pango_attr_iterator_destroy(iterator); ranges = new int[count * 2]; styles = new TextStyle[count]; iterator = OS.pango_attr_list_get_iterator(pangoAttrs[0]); PangoAttrColor attrColor = new PangoAttrColor(); PangoAttrInt attrInt = new PangoAttrInt(); int[] start = new int[1]; int[] end = new int[1]; for (int i = 0; i < count; i++) { OS.pango_attr_iterator_range(iterator, start, end); ranges[i * 2] = (int) /*64*/ OS.g_utf16_pointer_to_offset(preeditString[0], preeditString[0] + start[0]); ranges[i * 2 + 1] = (int) /*64*/ OS.g_utf16_pointer_to_offset(preeditString[0], preeditString[0] + end[0]) - 1; styles[i] = new TextStyle(null, null, null); int /*long*/ attr = OS.pango_attr_iterator_get(iterator, OS.PANGO_ATTR_FOREGROUND); if (attr != 0) { OS.memmove(attrColor, attr, PangoAttrColor.sizeof); GdkColor color = new GdkColor(); color.red = attrColor.color_red; color.green = attrColor.color_green; color.blue = attrColor.color_blue; styles[i].foreground = Color.gtk_new(display, color); } attr = OS.pango_attr_iterator_get(iterator, OS.PANGO_ATTR_BACKGROUND); if (attr != 0) { OS.memmove(attrColor, attr, PangoAttrColor.sizeof); GdkColor color = new GdkColor(); color.red = attrColor.color_red; color.green = attrColor.color_green; color.blue = attrColor.color_blue; styles[i].background = Color.gtk_new(display, color); } attr = OS.pango_attr_iterator_get(iterator, OS.PANGO_ATTR_UNDERLINE); if (attr != 0) { OS.memmove(attrInt, attr, PangoAttrInt.sizeof); styles[i].underline = attrInt.value != OS.PANGO_UNDERLINE_NONE; ; styles[i].underlineStyle = SWT.UNDERLINE_SINGLE; switch (attrInt.value) { case OS.PANGO_UNDERLINE_DOUBLE: styles[i].underlineStyle = SWT.UNDERLINE_DOUBLE; break; case OS.PANGO_UNDERLINE_ERROR: styles[i].underlineStyle = SWT.UNDERLINE_ERROR; break; } if (styles[i].underline) { attr = OS.pango_attr_iterator_get(iterator, OS.PANGO_ATTR_UNDERLINE_COLOR); if (attr != 0) { OS.memmove(attrColor, attr, PangoAttrColor.sizeof); GdkColor color = new GdkColor(); color.red = attrColor.color_red; color.green = attrColor.color_green; color.blue = attrColor.color_blue; styles[i].underlineColor = Color.gtk_new(display, color); } } } OS.pango_attr_iterator_next(iterator); } OS.pango_attr_iterator_destroy(iterator); OS.pango_attr_list_unref(pangoAttrs[0]); } OS.g_free(preeditString[0]); } if (chars != null) { if (text.length() == 0) { /* * Bug in GTK. In Solaris, the IME sends multiple * preedit_changed signals with an empty text. * This behavior is not correct for SWT and can * cause the editor to replace its current selection * with an empty string. The fix is to ignore any * preedit_changed signals with an empty text when * the preedit buffer is already empty. */ if (chars.length == 0) return 0; startOffset = -1; } int end = startOffset + text.length(); if (startOffset == -1) { Event event = new Event(); event.detail = SWT.COMPOSITION_SELECTION; sendEvent(SWT.ImeComposition, event); startOffset = event.start; end = event.end; } inComposition = true; Event event = new Event(); event.detail = SWT.COMPOSITION_CHANGED; event.start = startOffset; event.end = end; event.text = text = chars != null ? new String(chars) : ""; sendEvent(SWT.ImeComposition, event); } return 1; }