예제 #1
0
 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();
 }
예제 #2
0
 /**
  * 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;
 }
예제 #3
0
 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);
 }
예제 #4
0
 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;
 }
예제 #5
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);
     }
   }
 }
예제 #6
0
 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;
 }
예제 #7
0
  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;
  }