public void setImage(Image image) { checkWidget(); if ((style & SWT.SEPARATOR) != 0) return; super.setImage(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); } long /*int*/ pixbuf = imageList.getPixbuf(imageIndex); OS.gtk_image_set_from_pixbuf(imageHandle, pixbuf); } else { OS.gtk_image_set_from_pixbuf(imageHandle, 0); } /* * If Text/Image of a tool-item changes, then it is * required to reset the proxy menu. Otherwise, the * old menuItem appears in the overflow menu. */ if ((style & SWT.DROP_DOWN) != 0) { proxyMenuItem = 0; proxyMenuItem = OS.gtk_tool_item_retrieve_proxy_menu_item(handle); OS.g_signal_connect( proxyMenuItem, OS.activate, ToolBar.menuItemSelectedFunc.getAddress(), handle); } parent.relayout(); }
/** * Sets the receiver's image at a column. * * @param index the column index * @param image the new image * @exception IllegalArgumentException * <ul> * <li>ERROR_INVALID_ARGUMENT - if the image has been disposed * </ul> * * @exception SWTException * <ul> * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver * </ul> */ public void setImage(int index, Image image) { checkWidget(); if (image != null && image.isDisposed()) { error(SWT.ERROR_INVALID_ARGUMENT); } if (image != null && image.type == SWT.ICON) { if (image.equals(_getImage(index))) return; } int count = Math.max(1, parent.getColumnCount()); if (0 > index || index > count - 1) return; int /*long*/ pixbuf = 0; 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); pixbuf = imageList.getPixbuf(imageIndex); } int modelIndex = parent.columnCount == 0 ? Table.FIRST_COLUMN : parent.columns[index].modelIndex; OS.gtk_list_store_set(parent.modelHandle, handle, modelIndex + Table.CELL_PIXBUF, pixbuf, -1); /* * Bug in GTK. When using fixed-height-mode, * row changes do not cause the row to be repainted. The fix is to * invalidate the row when it is cleared. */ if ((parent.style & SWT.VIRTUAL) != 0) { if (OS.GTK_VERSION >= OS.VERSION(2, 3, 2) && OS.GTK_VERSION < OS.VERSION(2, 6, 3)) { redraw(); } } /* * Bug in GTK. When in fixed height mode, GTK does not recalculate the cell renderer width * when the image is changed in the model. The fix is to force it to recalculate the width if * more space is required. */ if ((parent.style & SWT.VIRTUAL) != 0 && parent.currentItem == null) { if (OS.GTK_VERSION >= OS.VERSION(2, 3, 2)) { if (image != null) { int /*long*/ parentHandle = parent.handle; int /*long*/ column = OS.gtk_tree_view_get_column(parentHandle, index); int[] w = new int[1]; int /*long*/ pixbufRenderer = parent.getPixbufRenderer(column); OS.gtk_tree_view_column_cell_get_position(column, pixbufRenderer, null, w); if (w[0] < image.getBounds().width) { /* * There is no direct way to clear the cell renderer width so we * are relying on the fact that it is done as part of modifying * the style. */ int /*long*/ style = OS.gtk_widget_get_modifier_style(parentHandle); parent.modifyStyle(parentHandle, style); } } } } cached = true; }
Image _getImage(int index) { int count = Math.max(1, parent.getColumnCount()); if (0 > index || index > count - 1) return null; int /*long*/[] ptr = new int /*long*/[1]; int modelIndex = parent.columnCount == 0 ? Table.FIRST_COLUMN : parent.columns[index].modelIndex; OS.gtk_tree_model_get(parent.modelHandle, handle, modelIndex + Table.CELL_PIXBUF, ptr, -1); if (ptr[0] == 0) return null; ImageList imageList = parent.imageList; int imageIndex = imageList.indexOf(ptr[0]); if (imageIndex == -1) return null; return imageList.get(imageIndex); }
long /*int*/ gtk_enter_notify_event(long /*int*/ widget, long /*int*/ event) { parent.gtk_enter_notify_event(widget, event); drawHotImage = (parent.style & SWT.FLAT) != 0 && hotImage != null; if (drawHotImage) { ImageList imageList = parent.imageList; if (imageList != null) { int index = imageList.indexOf(hotImage); if (index != -1 && imageHandle != 0) { long /*int*/ pixbuf = imageList.getPixbuf(index); OS.gtk_image_set_from_pixbuf(imageHandle, pixbuf); } } } return 0; }
/** * Sets the receiver's hot image to the argument, which may be null indicating that no hot image * should be displayed. * * <p>The hot image is displayed when the mouse enters the receiver. * * @param image the hot image to display on the receiver (may be null) * @exception IllegalArgumentException * <ul> * <li>ERROR_INVALID_ARGUMENT - if the image has been disposed * </ul> * * @exception SWTException * <ul> * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver * </ul> */ public void setHotImage(Image image) { checkWidget(); if ((style & SWT.SEPARATOR) != 0) return; hotImage = 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); } } }
void releaseWidget() { super.releaseWidget(); if (imageList != null) imageList.dispose(); if (parent.lastFocus == this) parent.lastFocus = null; imageList = null; control = null; }
long /*int*/ gtk_leave_notify_event(long /*int*/ widget, long /*int*/ event) { parent.gtk_leave_notify_event(widget, event); if (drawHotImage) { drawHotImage = false; if (image != null) { ImageList imageList = parent.imageList; if (imageList != null) { int index = imageList.indexOf(image); if (index != -1 && imageHandle != 0) { long /*int*/ pixbuf = imageList.getPixbuf(index); OS.gtk_image_set_from_pixbuf(imageHandle, pixbuf); } } } } return 0; }
public void setImage(Image image) { super.setImage(image); if (imageList != null) imageList.dispose(); imageList = null; if (image != null) { if (image.isDisposed()) error(SWT.ERROR_INVALID_ARGUMENT); imageList = new ImageList(); int imageIndex = imageList.add(image); long /*int*/ pixbuf = imageList.getPixbuf(imageIndex); OS.gtk_image_set_from_pixbuf(imageHandle, pixbuf); if (text.length() == 0) OS.gtk_widget_hide(labelHandle); OS.gtk_widget_show(imageHandle); } else { OS.gtk_image_set_from_pixbuf(imageHandle, 0); OS.gtk_widget_show(labelHandle); OS.gtk_widget_hide(imageHandle); } }
/** * This implementation of <code>javaToNative</code> converts an ImageData object represented by * java <code>ImageData</code> to a platform specific representation. * * @param object a java <code>ImageData</code> containing the ImageData to be converted * @param transferData an empty <code>TransferData</code> object that will be filled in on return * with the platform specific format of the data * @see Transfer#nativeToJava */ public void javaToNative(Object object, TransferData transferData) { if (!checkImage(object) || !isSupportedType(transferData)) { DND.error(DND.ERROR_INVALID_DATA); } if (OS.GTK_VERSION < OS.VERSION(2, 4, 0)) return; ImageData imgData = (ImageData) object; if (imgData == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); Image image = new Image(Display.getCurrent(), imgData); long /*int*/ pixbuf = ImageList.createPixbuf(image); if (pixbuf != 0) { String typeStr = ""; if (transferData.type == JPEG_ID) typeStr = "jpeg"; else if (transferData.type == PNG_ID) typeStr = "png"; else if (transferData.type == BMP_ID) typeStr = "bmp"; else if (transferData.type == EPS_ID) typeStr = "eps"; else if (transferData.type == PCX_ID) typeStr = "pcx"; else if (transferData.type == PPM_ID) typeStr = "ppm"; else if (transferData.type == RGB_ID) typeStr = "rgb"; else if (transferData.type == TGA_ID) typeStr = "tga"; else if (transferData.type == XBM_ID) typeStr = "xbm"; else if (transferData.type == XPM_ID) typeStr = "xpm"; else if (transferData.type == XV_ID) typeStr = "xv"; byte[] type = Converter.wcsToMbcs(null, typeStr, true); long /*int*/[] buffer = new long /*int*/[1]; long /*int*/[] len = new long /*int*/[1]; if (type == null) return; OS.gdk_pixbuf_save_to_bufferv(pixbuf, buffer, len, type, null, null, null); OS.g_object_unref(pixbuf); transferData.pValue = buffer[0]; transferData.length = (int) (len[0] + 3) / 4 * 4; transferData.result = 1; transferData.format = 32; } image.dispose(); }
void releaseWidget() { super.releaseWidget(); if (imageList != null) imageList.dispose(); imageList = null; }
long /*int*/ gtk_create_menu_proxy(long /*int*/ widget) { /* * Feature in GTK. If the item is a radio/check button * with only image, then that image does not appear in * the overflow menu. * The fix is to create and use the proxy menu for the * items appearing in the overflow menu. */ byte[] buffer = Converter.wcsToMbcs(null, "menu-id", true); // $NON-NLS-1$ if (proxyMenuItem != 0) { /* * The menuItem to appear in the overflow menu is cached * for the tool-item. If the text/image of the item changes, * then the proxyMenu is reset. */ OS.gtk_tool_item_set_proxy_menu_item(widget, buffer, proxyMenuItem); return 1; } if (image != null) { ImageList imageList = parent.imageList; if (imageList != null) { int index = imageList.indexOf(image); if (index != -1) { long /*int*/ pixbuf = imageList.getPixbuf(index); byte[] label = null; int[] showImages = new int[] {1}; long /*int*/ settings = OS.gtk_settings_get_default(); if (settings != 0) { long /*int*/ property = OS.g_object_class_find_property( OS.G_OBJECT_GET_CLASS(settings), OS.gtk_menu_images); if (property != 0) OS.g_object_get(settings, OS.gtk_menu_images, showImages, 0); } /* * GTK tool items with only image appear as blank items * in overflow menu when the system property "gtk-menu-images" * is set to false. To avoid that, display the tooltip text * if available, in the overflow menu. * Feature in GTK. When the menuItem is initialised only * with the image, the overflow menu appears very sloppy. * The fix is to initialise menu item with empty string. */ if (text == null || text.length() == 0) { if ((showImages[0] == 0) && (toolTipText != null)) label = Converter.wcsToMbcs(null, toolTipText, true); else label = new byte[] {0}; } else { label = Converter.wcsToMbcs(null, text, true); } long /*int*/ menuItem = OS.gtk_image_menu_item_new_with_label(label); long /*int*/ menuImage = OS.gtk_image_new_from_pixbuf(pixbuf); OS.gtk_image_menu_item_set_image(menuItem, menuImage); OS.gtk_tool_item_set_proxy_menu_item(widget, buffer, menuItem); /* * Since the arrow button does not appear in the drop_down * item, we request the menu-item and then, hook the * activate signal to send the Arrow selection signal. */ proxyMenuItem = OS.gtk_tool_item_get_proxy_menu_item(widget, buffer); OS.g_signal_connect( menuItem, OS.activate, ToolBar.menuItemSelectedFunc.getAddress(), handle); return 1; } } } return 0; }