예제 #1
0
static void
gtk_image_menu_item_get_preferred_width (GtkWidget        *widget,
        gint             *minimum,
        gint             *natural)
{
    GtkImageMenuItem *image_menu_item = GTK_IMAGE_MENU_ITEM (widget);
    GtkImageMenuItemPrivate *priv = image_menu_item->priv;
    GtkPackDirection pack_dir;
    GtkWidget *parent;

    parent = gtk_widget_get_parent (widget);

    if (GTK_IS_MENU_BAR (parent))
        pack_dir = gtk_menu_bar_get_child_pack_direction (GTK_MENU_BAR (parent));
    else
        pack_dir = GTK_PACK_DIRECTION_LTR;

    GTK_WIDGET_CLASS (gtk_image_menu_item_parent_class)->get_preferred_width (widget, minimum, natural);

    if ((pack_dir == GTK_PACK_DIRECTION_TTB || pack_dir == GTK_PACK_DIRECTION_BTT) &&
            priv->image &&
            gtk_widget_get_visible (priv->image))
    {
        gint child_minimum, child_natural;

        gtk_widget_get_preferred_width (priv->image, &child_minimum, &child_natural);

        *minimum = MAX (*minimum, child_minimum);
        *natural = MAX (*natural, child_natural);
    }
}
예제 #2
0
static void
gtk_image_menu_item_get_preferred_height (GtkWidget        *widget,
        gint             *minimum,
        gint             *natural)
{
    GtkImageMenuItem *image_menu_item = GTK_IMAGE_MENU_ITEM (widget);
    GtkImageMenuItemPrivate *priv = image_menu_item->priv;
    gint child_height = 0;
    GtkPackDirection pack_dir;
    GtkWidget *parent;

    parent = gtk_widget_get_parent (widget);

    if (GTK_IS_MENU_BAR (parent))
        pack_dir = gtk_menu_bar_get_child_pack_direction (GTK_MENU_BAR (parent));
    else
        pack_dir = GTK_PACK_DIRECTION_LTR;

    if (priv->image && gtk_widget_get_visible (priv->image))
    {
        GtkRequisition child_requisition;

        gtk_widget_get_preferred_size (priv->image, &child_requisition, NULL);

        child_height = child_requisition.height;
    }

    GTK_WIDGET_CLASS (gtk_image_menu_item_parent_class)->get_preferred_height (widget, minimum, natural);

    if (pack_dir == GTK_PACK_DIRECTION_RTL || pack_dir == GTK_PACK_DIRECTION_LTR)
    {
        *minimum = MAX (*minimum, child_height);
        *natural = MAX (*natural, child_height);
    }
}
예제 #3
0
JNIEXPORT jint JNICALL
Java_org_gnome_gtk_GtkMenuBar_gtk_1menu_1bar_1get_1child_1pack_1direction
(
	JNIEnv* env,
	jclass cls,
	jlong _self
)
{
	GtkPackDirection result;
	jint _result;
	GtkMenuBar* self;

	// convert parameter self
	self = (GtkMenuBar*) _self;

	// call function
	result = gtk_menu_bar_get_child_pack_direction(self);

	// cleanup parameter self

	// translate return value to JNI type
	_result = (jint) result;

	// and finally
	return _result;
}
예제 #4
0
static void
gtk_image_menu_item_size_request (GtkWidget      *widget,
                                  GtkRequisition *requisition)
{
  GtkImageMenuItem *image_menu_item;
  gint child_width = 0;
  gint child_height = 0;
  GtkPackDirection pack_dir;
  
  if (GTK_IS_MENU_BAR (widget->parent))
    pack_dir = gtk_menu_bar_get_child_pack_direction (GTK_MENU_BAR (widget->parent));
  else
    pack_dir = GTK_PACK_DIRECTION_LTR;

  image_menu_item = GTK_IMAGE_MENU_ITEM (widget);

  if (image_menu_item->image && gtk_widget_get_visible (image_menu_item->image))
    {
      GtkRequisition child_requisition;
      
      gtk_widget_size_request (image_menu_item->image,
                               &child_requisition);

      child_width = child_requisition.width;
      child_height = child_requisition.height;
    }

  GTK_WIDGET_CLASS (gtk_image_menu_item_parent_class)->size_request (widget, requisition);

  /* not done with height since that happens via the
   * toggle_size_request
   */
  if (pack_dir == GTK_PACK_DIRECTION_LTR || pack_dir == GTK_PACK_DIRECTION_RTL)
    requisition->height = MAX (requisition->height, child_height);
  else
    requisition->width = MAX (requisition->width, child_width);
    
  
  /* Note that GtkMenuShell always size requests before
   * toggle_size_request, so toggle_size_request will be able to use
   * image_menu_item->image->requisition
   */
}
예제 #5
0
static void
gtk_image_menu_item_toggle_size_request (GtkMenuItem *menu_item,
        gint        *requisition)
{
    GtkImageMenuItem *image_menu_item = GTK_IMAGE_MENU_ITEM (menu_item);
    GtkImageMenuItemPrivate *priv = image_menu_item->priv;
    GtkPackDirection pack_dir;
    GtkWidget *parent;
    GtkWidget *widget = GTK_WIDGET (menu_item);

    parent = gtk_widget_get_parent (widget);

    if (GTK_IS_MENU_BAR (parent))
        pack_dir = gtk_menu_bar_get_child_pack_direction (GTK_MENU_BAR (parent));
    else
        pack_dir = GTK_PACK_DIRECTION_LTR;

    *requisition = 0;

    if (priv->image && gtk_widget_get_visible (priv->image))
    {
        GtkRequisition image_requisition;
        guint toggle_spacing;

        gtk_widget_get_preferred_size (priv->image, &image_requisition, NULL);

        gtk_widget_style_get (GTK_WIDGET (menu_item),
                              "toggle-spacing", &toggle_spacing,
                              NULL);

        if (pack_dir == GTK_PACK_DIRECTION_LTR || pack_dir == GTK_PACK_DIRECTION_RTL)
        {
            if (image_requisition.width > 0)
                *requisition = image_requisition.width + toggle_spacing;
        }
        else
        {
            if (image_requisition.height > 0)
                *requisition = image_requisition.height + toggle_spacing;
        }
    }
}
예제 #6
0
파일: gtkimagemenuitem.c 프로젝트: krh/gtk
static void
gtk_image_menu_item_toggle_size_request (GtkMenuItem *menu_item,
        gint        *requisition)
{
    GtkImageMenuItem *image_menu_item = GTK_IMAGE_MENU_ITEM (menu_item);
    GtkPackDirection pack_dir;

    if (GTK_IS_MENU_BAR (GTK_WIDGET (menu_item)->parent))
        pack_dir = gtk_menu_bar_get_child_pack_direction (GTK_MENU_BAR (GTK_WIDGET (menu_item)->parent));
    else
        pack_dir = GTK_PACK_DIRECTION_LTR;

    *requisition = 0;

    if (image_menu_item->image && GTK_WIDGET_VISIBLE (image_menu_item->image))
    {
        GtkRequisition image_requisition;
        guint toggle_spacing;
        gtk_widget_get_child_requisition (image_menu_item->image,
                                          &image_requisition);

        gtk_widget_style_get (GTK_WIDGET (menu_item),
                              "toggle-spacing", &toggle_spacing,
                              NULL);

        if (pack_dir == GTK_PACK_DIRECTION_LTR || pack_dir == GTK_PACK_DIRECTION_RTL)
        {
            if (image_requisition.width > 0)
                *requisition = image_requisition.width + toggle_spacing;
        }
        else
        {
            if (image_requisition.height > 0)
                *requisition = image_requisition.height + toggle_spacing;
        }
    }
}
예제 #7
0
static void
gtk_image_menu_item_size_allocate (GtkWidget     *widget,
                                   GtkAllocation *allocation)
{
    GtkImageMenuItem *image_menu_item = GTK_IMAGE_MENU_ITEM (widget);
    GtkImageMenuItemPrivate *priv = image_menu_item->priv;
    GtkAllocation widget_allocation;
    GtkPackDirection pack_dir;
    GtkWidget *parent;

    parent = gtk_widget_get_parent (widget);

    if (GTK_IS_MENU_BAR (parent))
        pack_dir = gtk_menu_bar_get_child_pack_direction (GTK_MENU_BAR (parent));
    else
        pack_dir = GTK_PACK_DIRECTION_LTR;

    GTK_WIDGET_CLASS (gtk_image_menu_item_parent_class)->size_allocate (widget, allocation);

    if (priv->image && gtk_widget_get_visible (priv->image))
    {
        gint x, y, offset;
        GtkStyleContext *context;
        GtkStateFlags state;
        GtkBorder padding;
        GtkRequisition child_requisition;
        GtkAllocation child_allocation;
        guint horizontal_padding, toggle_spacing;
        gint toggle_size;

        toggle_size = GTK_MENU_ITEM (image_menu_item)->priv->toggle_size;
        gtk_widget_style_get (widget,
                              "horizontal-padding", &horizontal_padding,
                              "toggle-spacing", &toggle_spacing,
                              NULL);

        /* Man this is lame hardcoding action, but I can't
         * come up with a solution that's really better.
         */

        gtk_widget_get_preferred_size (priv->image, &child_requisition, NULL);

        gtk_widget_get_allocation (widget, &widget_allocation);

        context = gtk_widget_get_style_context (widget);
        state = gtk_widget_get_state_flags (widget);
        gtk_style_context_get_padding (context, state, &padding);
        offset = gtk_container_get_border_width (GTK_CONTAINER (image_menu_item));

        if (pack_dir == GTK_PACK_DIRECTION_LTR ||
                pack_dir == GTK_PACK_DIRECTION_RTL)
        {
            if ((gtk_widget_get_direction (widget) == GTK_TEXT_DIR_LTR) ==
                    (pack_dir == GTK_PACK_DIRECTION_LTR))
                x = offset + horizontal_padding + padding.left +
                    (toggle_size - toggle_spacing - child_requisition.width) / 2;
            else
                x = widget_allocation.width - offset - horizontal_padding - padding.right -
                    toggle_size + toggle_spacing +
                    (toggle_size - toggle_spacing - child_requisition.width) / 2;

            y = (widget_allocation.height - child_requisition.height) / 2;
        }
        else
        {
            if ((gtk_widget_get_direction (widget) == GTK_TEXT_DIR_LTR) ==
                    (pack_dir == GTK_PACK_DIRECTION_TTB))
                y = offset + horizontal_padding + padding.top +
                    (toggle_size - toggle_spacing - child_requisition.height) / 2;
            else
                y = widget_allocation.height - offset - horizontal_padding - padding.bottom -
                    toggle_size + toggle_spacing +
                    (toggle_size - toggle_spacing - child_requisition.height) / 2;

            x = (widget_allocation.width - child_requisition.width) / 2;
        }

        child_allocation.width = child_requisition.width;
        child_allocation.height = child_requisition.height;
        child_allocation.x = widget_allocation.x + MAX (x, 0);
        child_allocation.y = widget_allocation.y + MAX (y, 0);

        gtk_widget_size_allocate (priv->image, &child_allocation);
    }
}
예제 #8
0
static void
gtk_image_menu_item_size_allocate (GtkWidget     *widget,
                                   GtkAllocation *allocation)
{
  GtkImageMenuItem *image_menu_item;
  GtkPackDirection pack_dir;
  
  if (GTK_IS_MENU_BAR (widget->parent))
    pack_dir = gtk_menu_bar_get_child_pack_direction (GTK_MENU_BAR (widget->parent));
  else
    pack_dir = GTK_PACK_DIRECTION_LTR;
  
  image_menu_item = GTK_IMAGE_MENU_ITEM (widget);  

  GTK_WIDGET_CLASS (gtk_image_menu_item_parent_class)->size_allocate (widget, allocation);

  if (image_menu_item->image && gtk_widget_get_visible (image_menu_item->image))
    {
      gint x, y, offset;
      GtkRequisition child_requisition;
      GtkAllocation child_allocation;
      guint horizontal_padding, toggle_spacing;

      gtk_widget_style_get (widget,
			    "horizontal-padding", &horizontal_padding,
			    "toggle-spacing", &toggle_spacing,
			    NULL);
      
      /* Man this is lame hardcoding action, but I can't
       * come up with a solution that's really better.
       */

      gtk_widget_get_child_requisition (image_menu_item->image,
                                        &child_requisition);

      if (pack_dir == GTK_PACK_DIRECTION_LTR ||
	  pack_dir == GTK_PACK_DIRECTION_RTL)
	{
	  offset = GTK_CONTAINER (image_menu_item)->border_width +
	    widget->style->xthickness;
	  
	  if ((gtk_widget_get_direction (widget) == GTK_TEXT_DIR_LTR) ==
	      (pack_dir == GTK_PACK_DIRECTION_LTR))
	    x = offset + horizontal_padding +
	      (GTK_MENU_ITEM (image_menu_item)->toggle_size -
	       toggle_spacing - child_requisition.width) / 2;
	  else
	    x = widget->allocation.width - offset - horizontal_padding -
	      GTK_MENU_ITEM (image_menu_item)->toggle_size + toggle_spacing +
	      (GTK_MENU_ITEM (image_menu_item)->toggle_size -
	       toggle_spacing - child_requisition.width) / 2;
	  
	  y = (widget->allocation.height - child_requisition.height) / 2;
	}
      else
	{
	  offset = GTK_CONTAINER (image_menu_item)->border_width +
	    widget->style->ythickness;
	  
	  if ((gtk_widget_get_direction (widget) == GTK_TEXT_DIR_LTR) ==
	      (pack_dir == GTK_PACK_DIRECTION_TTB))
	    y = offset + horizontal_padding +
	      (GTK_MENU_ITEM (image_menu_item)->toggle_size -
	       toggle_spacing - child_requisition.height) / 2;
	  else
	    y = widget->allocation.height - offset - horizontal_padding -
	      GTK_MENU_ITEM (image_menu_item)->toggle_size + toggle_spacing +
	      (GTK_MENU_ITEM (image_menu_item)->toggle_size -
	       toggle_spacing - child_requisition.height) / 2;

	  x = (widget->allocation.width - child_requisition.width) / 2;
	}
      
      child_allocation.width = child_requisition.width;
      child_allocation.height = child_requisition.height;
      child_allocation.x = widget->allocation.x + MAX (x, 0);
      child_allocation.y = widget->allocation.y + MAX (y, 0);

      gtk_widget_size_allocate (image_menu_item->image, &child_allocation);
    }
}