Blame plugins/gtk+/glade-gtk-menu-item.c

Packit 1e8aac
/*
Packit 1e8aac
 * glade-gtk-menu-item.c - GladeWidgetAdaptor for GtkMenuItem
Packit 1e8aac
 *
Packit 1e8aac
 * Copyright (C) 2013 Tristan Van Berkom
Packit 1e8aac
 *
Packit 1e8aac
 * Authors:
Packit 1e8aac
 *      Tristan Van Berkom <tristan.van.berkom@gmail.com>
Packit 1e8aac
 *
Packit 1e8aac
 * This library is free software; you can redistribute it and/or modify it
Packit 1e8aac
 * under the terms of the GNU Lesser General Public License as
Packit 1e8aac
 * published by the Free Software Foundation; either version 2.1 of
Packit 1e8aac
 * the License, or (at your option) any later version.
Packit 1e8aac
 *
Packit 1e8aac
 * This library is distributed in the hope that it will be useful, but
Packit 1e8aac
 * WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 1e8aac
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 1e8aac
 * Lesser General Public License for more details.
Packit 1e8aac
 *
Packit 1e8aac
 * You should have received a copy of the GNU Lesser General Public 
Packit 1e8aac
 * License along with this program; if not, write to the Free Software
Packit 1e8aac
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Packit 1e8aac
 */
Packit 1e8aac
Packit 1e8aac
#include <config.h>
Packit 1e8aac
#include <glib/gi18n-lib.h>
Packit 1e8aac
#include <gladeui/glade.h>
Packit 1e8aac
Packit 1e8aac
#include "glade-activatable-editor.h"
Packit 1e8aac
#include "glade-gtk-menu-shell.h"
Packit 1e8aac
#include "glade-gtk.h"
Packit 1e8aac
Packit 1e8aac
void
Packit 1e8aac
glade_gtk_menu_item_action_activate (GladeWidgetAdaptor * adaptor,
Packit 1e8aac
                                     GObject * object,
Packit 1e8aac
                                     const gchar * action_path)
Packit 1e8aac
{
Packit 1e8aac
  GObject *obj = NULL, *shell = NULL;
Packit 1e8aac
  GladeWidget *w = glade_widget_get_from_gobject (object);
Packit 1e8aac
Packit 1e8aac
  while ((w = glade_widget_get_parent (w)))
Packit 1e8aac
    {
Packit 1e8aac
      obj = glade_widget_get_object (w);
Packit 1e8aac
      if (GTK_IS_MENU_SHELL (obj))
Packit 1e8aac
        shell = obj;
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  if (strcmp (action_path, "launch_editor") == 0)
Packit 1e8aac
    {
Packit 1e8aac
      if (shell)
Packit 1e8aac
        object = shell;
Packit 1e8aac
Packit 1e8aac
      if (GTK_IS_MENU_BAR (object))
Packit 1e8aac
        glade_gtk_menu_shell_launch_editor (object, _("Edit Menu Bar"));
Packit 1e8aac
      else if (GTK_IS_MENU (object))
Packit 1e8aac
        glade_gtk_menu_shell_launch_editor (object, _("Edit Menu"));
Packit 1e8aac
    }
Packit 1e8aac
  else
Packit 1e8aac
    GWA_GET_CLASS (GTK_TYPE_CONTAINER)->action_activate (adaptor,
Packit 1e8aac
                                                         object, action_path);
Packit 1e8aac
Packit 1e8aac
  if (shell)
Packit 1e8aac
    gtk_menu_shell_deactivate (GTK_MENU_SHELL (shell));
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
GObject *
Packit 1e8aac
glade_gtk_menu_item_constructor (GType type,
Packit 1e8aac
                                 guint n_construct_properties,
Packit 1e8aac
                                 GObjectConstructParam * construct_properties)
Packit 1e8aac
{
Packit 1e8aac
  GladeWidgetAdaptor *adaptor;
Packit 1e8aac
  GObject *ret_obj;
Packit 1e8aac
Packit 1e8aac
  ret_obj = GWA_GET_OCLASS (GTK_TYPE_CONTAINER)->constructor
Packit 1e8aac
      (type, n_construct_properties, construct_properties);
Packit 1e8aac
Packit 1e8aac
  adaptor = GLADE_WIDGET_ADAPTOR (ret_obj);
Packit 1e8aac
Packit 1e8aac
  glade_widget_adaptor_action_remove (adaptor, "add_parent");
Packit 1e8aac
  glade_widget_adaptor_action_remove (adaptor, "remove_parent");
Packit 1e8aac
Packit 1e8aac
  return ret_obj;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
void
Packit 1e8aac
glade_gtk_menu_item_post_create (GladeWidgetAdaptor * adaptor,
Packit 1e8aac
                                 GObject * object, GladeCreateReason reason)
Packit 1e8aac
{
Packit 1e8aac
  if (GTK_IS_SEPARATOR_MENU_ITEM (object))
Packit 1e8aac
    return;
Packit 1e8aac
Packit 1e8aac
  if (gtk_bin_get_child (GTK_BIN (object)) == NULL)
Packit 1e8aac
    {
Packit 1e8aac
      GtkWidget *label = gtk_label_new ("");
Packit 1e8aac
      gtk_widget_set_halign (label, GTK_ALIGN_START);
Packit 1e8aac
      gtk_container_add (GTK_CONTAINER (object), label);
Packit 1e8aac
    }
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
GList *
Packit 1e8aac
glade_gtk_menu_item_get_children (GladeWidgetAdaptor * adaptor,
Packit 1e8aac
                                  GObject * object)
Packit 1e8aac
{
Packit 1e8aac
  GList *list = NULL;
Packit 1e8aac
  GtkWidget *child;
Packit 1e8aac
Packit 1e8aac
  g_return_val_if_fail (GTK_IS_MENU_ITEM (object), NULL);
Packit 1e8aac
Packit 1e8aac
  if ((child = gtk_menu_item_get_submenu (GTK_MENU_ITEM (object))))
Packit 1e8aac
    list = g_list_append (list, child);
Packit 1e8aac
Packit 1e8aac
  return list;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
gboolean
Packit 1e8aac
glade_gtk_menu_item_add_verify (GladeWidgetAdaptor *adaptor,
Packit 1e8aac
				GtkWidget          *container,
Packit 1e8aac
				GtkWidget          *child,
Packit 1e8aac
				gboolean            user_feedback)
Packit 1e8aac
{
Packit 1e8aac
  if (!GTK_IS_MENU (child))
Packit 1e8aac
    {
Packit 1e8aac
      if (user_feedback)
Packit 1e8aac
	{
Packit 1e8aac
	  GladeWidgetAdaptor *menu_adaptor = 
Packit 1e8aac
	    glade_widget_adaptor_get_by_type (GTK_TYPE_MENU);
Packit 1e8aac
Packit 1e8aac
	  glade_util_ui_message (glade_app_get_window (),
Packit 1e8aac
				 GLADE_UI_INFO, NULL,
Packit 1e8aac
				 ONLY_THIS_GOES_IN_THAT_MSG,
Packit 1e8aac
				 glade_widget_adaptor_get_title (menu_adaptor),
Packit 1e8aac
				 glade_widget_adaptor_get_title (adaptor));
Packit 1e8aac
	}
Packit 1e8aac
Packit 1e8aac
      return FALSE;
Packit 1e8aac
    }
Packit 1e8aac
  else if (GTK_IS_SEPARATOR_MENU_ITEM (container))
Packit 1e8aac
    {
Packit 1e8aac
      if (user_feedback)
Packit 1e8aac
	{
Packit 1e8aac
	  glade_util_ui_message (glade_app_get_window (),
Packit 1e8aac
				 GLADE_UI_INFO, NULL,
Packit 1e8aac
				 _("An object of type %s cannot have any children."),
Packit 1e8aac
				 glade_widget_adaptor_get_title (adaptor));
Packit 1e8aac
	}
Packit 1e8aac
Packit 1e8aac
      return FALSE;
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  return TRUE;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
void
Packit 1e8aac
glade_gtk_menu_item_add_child (GladeWidgetAdaptor * adaptor,
Packit 1e8aac
                               GObject * object, GObject * child)
Packit 1e8aac
{
Packit 1e8aac
  g_return_if_fail (GTK_IS_MENU_ITEM (object));
Packit 1e8aac
  g_return_if_fail (GTK_IS_MENU (child));
Packit 1e8aac
Packit 1e8aac
  if (GTK_IS_SEPARATOR_MENU_ITEM (object))
Packit 1e8aac
    {
Packit 1e8aac
      g_warning
Packit 1e8aac
          ("You shouldn't try to add a GtkMenu to a GtkSeparatorMenuItem");
Packit 1e8aac
      return;
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  g_object_set_data (child, "special-child-type", "submenu");
Packit 1e8aac
Packit 1e8aac
  gtk_menu_item_set_submenu (GTK_MENU_ITEM (object), GTK_WIDGET (child));
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
void
Packit 1e8aac
glade_gtk_menu_item_remove_child (GladeWidgetAdaptor * adaptor,
Packit 1e8aac
                                  GObject * object, GObject * child)
Packit 1e8aac
{
Packit 1e8aac
  g_return_if_fail (GTK_IS_MENU_ITEM (object));
Packit 1e8aac
  g_return_if_fail (GTK_IS_MENU (child));
Packit 1e8aac
Packit 1e8aac
  g_object_set_data (child, "special-child-type", NULL);
Packit 1e8aac
Packit 1e8aac
  gtk_menu_item_set_submenu (GTK_MENU_ITEM (object), NULL);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_gtk_menu_item_set_label (GObject * object, const GValue * value)
Packit 1e8aac
{
Packit 1e8aac
  GladeWidget *gitem;
Packit 1e8aac
  GtkWidget *label;
Packit 1e8aac
  gboolean use_underline;
Packit 1e8aac
Packit 1e8aac
  gitem = glade_widget_get_from_gobject (object);
Packit 1e8aac
Packit 1e8aac
  label = gtk_bin_get_child (GTK_BIN (object));
Packit 1e8aac
  gtk_label_set_text (GTK_LABEL (label), g_value_get_string (value));
Packit 1e8aac
Packit 1e8aac
  /* Update underline incase... */
Packit 1e8aac
  glade_widget_property_get (gitem, "use-underline", &use_underline);
Packit 1e8aac
  gtk_label_set_use_underline (GTK_LABEL (label), use_underline);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_gtk_menu_item_set_use_underline (GObject * object, const GValue * value)
Packit 1e8aac
{
Packit 1e8aac
  GtkWidget *label;
Packit 1e8aac
Packit 1e8aac
  label = gtk_bin_get_child (GTK_BIN (object));
Packit 1e8aac
  gtk_label_set_use_underline (GTK_LABEL (label), g_value_get_boolean (value));
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
Packit 1e8aac
void
Packit 1e8aac
glade_gtk_menu_item_set_property (GladeWidgetAdaptor * adaptor,
Packit 1e8aac
                                  GObject * object,
Packit 1e8aac
                                  const gchar * id, const GValue * value)
Packit 1e8aac
{
Packit 1e8aac
  GladeWidget *gwidget = glade_widget_get_from_gobject (object);
Packit 1e8aac
  GladeProperty *property = glade_widget_get_property (gwidget, id);
Packit 1e8aac
Packit 1e8aac
  if (!strcmp (id, "use-underline"))
Packit 1e8aac
    glade_gtk_menu_item_set_use_underline (object, value);
Packit 1e8aac
  else if (!strcmp (id, "label"))
Packit 1e8aac
    glade_gtk_menu_item_set_label (object, value);
Packit 1e8aac
  else if (GPC_VERSION_CHECK
Packit 1e8aac
           (glade_property_get_class (property), gtk_major_version, gtk_minor_version + 1))
Packit 1e8aac
    GWA_GET_CLASS (GTK_TYPE_CONTAINER)->set_property (adaptor, object, id,
Packit 1e8aac
                                                      value);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
GladeEditable *
Packit 1e8aac
glade_gtk_activatable_create_editable (GladeWidgetAdaptor * adaptor,
Packit 1e8aac
                                       GladeEditorPageType type)
Packit 1e8aac
{
Packit 1e8aac
  if (type == GLADE_PAGE_GENERAL)
Packit 1e8aac
    return (GladeEditable *) glade_activatable_editor_new (adaptor, NULL);
Packit 1e8aac
Packit 1e8aac
  return GWA_GET_CLASS (GTK_TYPE_CONTAINER)->create_editable (adaptor, type);
Packit 1e8aac
}