Blame gladeui/glade-widget-action.c

Packit 1e8aac
/*
Packit 1e8aac
 * Copyright (C) 2007 Juan Pablo Ugarte.
Packit 1e8aac
 *
Packit 1e8aac
 * This program is free software; you can redistribute it and/or modify
Packit 1e8aac
 * it under the terms of the GNU General Public License as
Packit 1e8aac
 * published by the Free Software Foundation; either version 2 of the
Packit 1e8aac
 * License, or (at your option) any later version.
Packit 1e8aac
 *
Packit 1e8aac
 * This program is distributed in the hope that it will be useful,
Packit 1e8aac
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 1e8aac
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit 1e8aac
 * GNU General Public License for more details.
Packit 1e8aac
 *
Packit 1e8aac
 * You should have received a copy of the GNU General Public License
Packit 1e8aac
 * 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
 * Authors:
Packit 1e8aac
 *   Juan Pablo Ugarte <juanpablougarte@gmail.com>
Packit 1e8aac
 */
Packit 1e8aac
Packit 1e8aac
/**
Packit 1e8aac
 * SECTION:glade-widget-action
Packit 1e8aac
 * @Title: GladeWidgetAction
Packit 1e8aac
 * @Short_Description: Context menu and toolbar actions.
Packit 1e8aac
 *
Packit 1e8aac
 * Use #GladeWidgetAction to create custom routines to operate
Packit 1e8aac
 * on widgets you add to glade, when running #GladeActionActivateFunc functions
Packit 1e8aac
 * you should make sure to use #GladeCommand. 
Packit 1e8aac
 */
Packit 1e8aac
Packit 1e8aac
#include "glade-widget-action.h"
Packit 1e8aac
#include "config.h"
Packit 1e8aac
#include <glib/gi18n-lib.h>
Packit 1e8aac
Packit 1e8aac
enum
Packit 1e8aac
{
Packit 1e8aac
  PROP_0,
Packit 1e8aac
Packit 1e8aac
  PROP_CLASS,
Packit 1e8aac
  PROP_SENSITIVE,
Packit 1e8aac
  PROP_VISIBLE,
Packit 1e8aac
  N_PROPERTIES
Packit 1e8aac
};
Packit 1e8aac
Packit 1e8aac
struct _GladeWidgetActionPrivate
Packit 1e8aac
{
Packit 1e8aac
  GWActionClass *klass;     /* The action class */
Packit 1e8aac
  GList         *actions;   /* List of actions */
Packit 1e8aac
  guint          sensitive : 1; /* If this action is sensitive or not */
Packit 1e8aac
  guint          visible   : 1; /* If this action is visible or not */
Packit 1e8aac
};
Packit 1e8aac
Packit 1e8aac
static GParamSpec *properties[N_PROPERTIES];
Packit 1e8aac
Packit 1e8aac
G_DEFINE_TYPE_WITH_PRIVATE (GladeWidgetAction, glade_widget_action, G_TYPE_OBJECT);
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_widget_action_init (GladeWidgetAction *object)
Packit 1e8aac
{
Packit 1e8aac
  object->priv = glade_widget_action_get_instance_private (object);
Packit 1e8aac
Packit 1e8aac
  object->priv->sensitive = TRUE;
Packit 1e8aac
  object->priv->visible   = TRUE;
Packit 1e8aac
  object->priv->actions = NULL;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_widget_action_finalize (GObject *object)
Packit 1e8aac
{
Packit 1e8aac
  GladeWidgetAction *action = GLADE_WIDGET_ACTION (object);
Packit 1e8aac
Packit 1e8aac
  if (action->priv->actions)
Packit 1e8aac
    {
Packit 1e8aac
      g_list_foreach (action->priv->actions, (GFunc) g_object_unref, NULL);
Packit 1e8aac
      g_list_free (action->priv->actions);
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  G_OBJECT_CLASS (glade_widget_action_parent_class)->finalize (object);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static GObject *
Packit 1e8aac
glade_widget_action_constructor (GType                  type,
Packit 1e8aac
                                 guint                  n_construct_properties,
Packit 1e8aac
                                 GObjectConstructParam *construct_properties)
Packit 1e8aac
{
Packit 1e8aac
  GladeWidgetAction *action;
Packit 1e8aac
  GObject *object;
Packit 1e8aac
  GList *l;
Packit 1e8aac
Packit 1e8aac
  object = G_OBJECT_CLASS (glade_widget_action_parent_class)->constructor
Packit 1e8aac
      (type, n_construct_properties, construct_properties);
Packit 1e8aac
Packit 1e8aac
  action = GLADE_WIDGET_ACTION (object);
Packit 1e8aac
Packit 1e8aac
  if (action->priv->klass == NULL)
Packit 1e8aac
    {
Packit 1e8aac
      g_warning ("GladeWidgetAction constructed without class property");
Packit 1e8aac
      return object;
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  for (l = action->priv->klass->actions; l; l = g_list_next (l))
Packit 1e8aac
    {
Packit 1e8aac
      GWActionClass *action_class = l->data;
Packit 1e8aac
      GObject *obj = g_object_new (GLADE_TYPE_WIDGET_ACTION,
Packit 1e8aac
                                   "class", action_class,
Packit 1e8aac
                                   NULL);
Packit 1e8aac
Packit 1e8aac
      action->priv->actions = g_list_prepend (action->priv->actions,
Packit 1e8aac
					      GLADE_WIDGET_ACTION (obj));
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  action->priv->actions = g_list_reverse (action->priv->actions);
Packit 1e8aac
Packit 1e8aac
  return object;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_widget_action_set_property (GObject      *object,
Packit 1e8aac
                                  guint         prop_id,
Packit 1e8aac
                                  const GValue *value,
Packit 1e8aac
                                  GParamSpec   *pspec)
Packit 1e8aac
{
Packit 1e8aac
  GladeWidgetAction *action = GLADE_WIDGET_ACTION (object);
Packit 1e8aac
Packit 1e8aac
  g_return_if_fail (GLADE_IS_WIDGET_ACTION (object));
Packit 1e8aac
Packit 1e8aac
  switch (prop_id)
Packit 1e8aac
    {
Packit 1e8aac
      case PROP_CLASS:
Packit 1e8aac
        action->priv->klass = g_value_get_pointer (value);
Packit 1e8aac
        break;
Packit 1e8aac
      case PROP_SENSITIVE:
Packit 1e8aac
        glade_widget_action_set_sensitive (action, g_value_get_boolean (value));
Packit 1e8aac
        break;
Packit 1e8aac
      case PROP_VISIBLE:
Packit 1e8aac
        glade_widget_action_set_visible (action, g_value_get_boolean (value));
Packit 1e8aac
        break;
Packit 1e8aac
      default:
Packit 1e8aac
        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
Packit 1e8aac
        break;
Packit 1e8aac
    }
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_widget_action_get_property (GObject    *object,
Packit 1e8aac
                                  guint       prop_id,
Packit 1e8aac
                                  GValue     *value,
Packit 1e8aac
                                  GParamSpec *pspec)
Packit 1e8aac
{
Packit 1e8aac
  GladeWidgetAction *action = GLADE_WIDGET_ACTION (object);
Packit 1e8aac
Packit 1e8aac
  g_return_if_fail (GLADE_IS_WIDGET_ACTION (object));
Packit 1e8aac
Packit 1e8aac
  switch (prop_id)
Packit 1e8aac
    {
Packit 1e8aac
      case PROP_CLASS:
Packit 1e8aac
        g_value_set_pointer (value, action->priv->klass);
Packit 1e8aac
        break;
Packit 1e8aac
      case PROP_SENSITIVE:
Packit 1e8aac
        g_value_set_boolean (value, action->priv->sensitive);
Packit 1e8aac
        break;
Packit 1e8aac
      case PROP_VISIBLE:
Packit 1e8aac
        g_value_set_boolean (value, action->priv->visible);
Packit 1e8aac
        break;
Packit 1e8aac
      default:
Packit 1e8aac
        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
Packit 1e8aac
        break;
Packit 1e8aac
    }
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_widget_action_class_init (GladeWidgetActionClass *klass)
Packit 1e8aac
{
Packit 1e8aac
  GObjectClass *object_class = G_OBJECT_CLASS (klass);
Packit 1e8aac
Packit 1e8aac
  object_class->constructor = glade_widget_action_constructor;
Packit 1e8aac
  object_class->finalize = glade_widget_action_finalize;
Packit 1e8aac
  object_class->set_property = glade_widget_action_set_property;
Packit 1e8aac
  object_class->get_property = glade_widget_action_get_property;
Packit 1e8aac
Packit 1e8aac
  properties[PROP_CLASS] =
Packit 1e8aac
    g_param_spec_pointer ("class",
Packit 1e8aac
                          _("class"),
Packit 1e8aac
                          _("GladeWidgetActionClass structure pointer"),
Packit 1e8aac
                          G_PARAM_CONSTRUCT_ONLY | G_PARAM_WRITABLE);
Packit 1e8aac
Packit 1e8aac
  properties[PROP_SENSITIVE] =
Packit 1e8aac
    g_param_spec_boolean ("sensitive",
Packit 1e8aac
                          _("Sensitive"),
Packit 1e8aac
                          _("Whether this action is sensitive"),
Packit 1e8aac
                          TRUE,
Packit 1e8aac
                          G_PARAM_READWRITE);
Packit 1e8aac
Packit 1e8aac
  properties[PROP_VISIBLE] =
Packit 1e8aac
    g_param_spec_boolean ("visible",
Packit 1e8aac
                          _("Visible"),
Packit 1e8aac
                          _("Whether this action is visible"),
Packit 1e8aac
                          TRUE,
Packit 1e8aac
                          G_PARAM_READWRITE);
Packit 1e8aac
Packit 1e8aac
  /* Install all properties */
Packit 1e8aac
  g_object_class_install_properties (object_class, N_PROPERTIES, properties);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
/**
Packit 1e8aac
 * glade_widget_action_set_sensitive:
Packit 1e8aac
 * @action: a #GladeWidgetAction
Packit 1e8aac
 * @sensitive:
Packit 1e8aac
 *
Packit 1e8aac
 * Set whether or not this action is sensitive.
Packit 1e8aac
 *
Packit 1e8aac
 */
Packit 1e8aac
void
Packit 1e8aac
glade_widget_action_set_sensitive (GladeWidgetAction *action,
Packit 1e8aac
                                   gboolean           sensitive)
Packit 1e8aac
{
Packit 1e8aac
  g_return_if_fail (GLADE_IS_WIDGET_ACTION (action));
Packit 1e8aac
Packit 1e8aac
  action->priv->sensitive = sensitive;
Packit 1e8aac
  g_object_notify_by_pspec (G_OBJECT (action), properties[PROP_SENSITIVE]);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
gboolean
Packit 1e8aac
glade_widget_action_get_sensitive (GladeWidgetAction *action)
Packit 1e8aac
{
Packit 1e8aac
  g_return_val_if_fail (GLADE_IS_WIDGET_ACTION (action), FALSE);
Packit 1e8aac
Packit 1e8aac
  return action->priv->sensitive;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
void
Packit 1e8aac
glade_widget_action_set_visible (GladeWidgetAction *action,
Packit 1e8aac
				 gboolean           visible)
Packit 1e8aac
{
Packit 1e8aac
  g_return_if_fail (GLADE_IS_WIDGET_ACTION (action));
Packit 1e8aac
Packit 1e8aac
  action->priv->visible = visible;
Packit 1e8aac
  g_object_notify_by_pspec (G_OBJECT (action), properties[PROP_VISIBLE]);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
gboolean
Packit 1e8aac
glade_widget_action_get_visible (GladeWidgetAction *action)
Packit 1e8aac
{
Packit 1e8aac
  g_return_val_if_fail (GLADE_IS_WIDGET_ACTION (action), FALSE);
Packit 1e8aac
Packit 1e8aac
  return action->priv->visible;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
GList *
Packit 1e8aac
glade_widget_action_get_children (GladeWidgetAction *action)
Packit 1e8aac
{
Packit 1e8aac
  g_return_val_if_fail (GLADE_IS_WIDGET_ACTION (action), NULL);
Packit 1e8aac
Packit 1e8aac
  return action->priv->actions;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
GWActionClass *
Packit 1e8aac
glade_widget_action_get_class (GladeWidgetAction *action)
Packit 1e8aac
{
Packit 1e8aac
  g_return_val_if_fail (GLADE_IS_WIDGET_ACTION (action), NULL);
Packit 1e8aac
Packit 1e8aac
  return action->priv->klass;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
/***************************************************************
Packit 1e8aac
 *                         GWActionClass                       *
Packit 1e8aac
 ***************************************************************/
Packit 1e8aac
static const gchar *
Packit 1e8aac
gwa_action_path_get_id (const gchar *action_path)
Packit 1e8aac
{
Packit 1e8aac
  const gchar *id;
Packit 1e8aac
Packit 1e8aac
  if ((id = g_strrstr (action_path, "/")) && id[1] != '\0')
Packit 1e8aac
    return &id[1];
Packit 1e8aac
  else
Packit 1e8aac
    return action_path;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
/**
Packit 1e8aac
 * glade_widget_action_class_new:
Packit 1e8aac
 * @path: the action path
Packit 1e8aac
 *
Packit 1e8aac
 * Returns: a newlly created #GWActionClass for @path.
Packit 1e8aac
 */
Packit 1e8aac
GWActionClass *
Packit 1e8aac
glade_widget_action_class_new (const gchar *path)
Packit 1e8aac
{
Packit 1e8aac
  GWActionClass *action;
Packit 1e8aac
Packit 1e8aac
  action = g_slice_new0 (GWActionClass);
Packit 1e8aac
  action->path = g_strdup (path);
Packit 1e8aac
  action->id   = gwa_action_path_get_id (action->path);
Packit 1e8aac
Packit 1e8aac
  return action;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
/**
Packit 1e8aac
 * glade_widget_action_class_clone:
Packit 1e8aac
 * @action: a GWActionClass
Packit 1e8aac
 *
Packit 1e8aac
 * Returns: a newlly allocated copy of @action.
Packit 1e8aac
 */
Packit 1e8aac
GWActionClass *
Packit 1e8aac
glade_widget_action_class_clone (GWActionClass *action)
Packit 1e8aac
{
Packit 1e8aac
  GWActionClass *copy;
Packit 1e8aac
  GList *l;
Packit 1e8aac
Packit 1e8aac
  g_return_val_if_fail (action != NULL, NULL);
Packit 1e8aac
Packit 1e8aac
  copy = glade_widget_action_class_new (action->path);
Packit 1e8aac
  copy->label = g_strdup (action->label);
Packit 1e8aac
  copy->stock = g_strdup (action->stock);
Packit 1e8aac
  copy->important = action->important;
Packit 1e8aac
Packit 1e8aac
  for (l = action->actions; l; l = g_list_next (l))
Packit 1e8aac
    {
Packit 1e8aac
      GWActionClass *child = glade_widget_action_class_clone (l->data);
Packit 1e8aac
      copy->actions = g_list_prepend (copy->actions, child);
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  copy->actions = g_list_reverse (copy->actions);
Packit 1e8aac
Packit 1e8aac
  return copy;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
/**
Packit 1e8aac
 * glade_widegt_action_class_free:
Packit 1e8aac
 * @action: a GWActionClass
Packit 1e8aac
 *
Packit 1e8aac
 * Frees a GWActionClass.
Packit 1e8aac
 */
Packit 1e8aac
void
Packit 1e8aac
glade_widget_action_class_free (GWActionClass *action)
Packit 1e8aac
{
Packit 1e8aac
  if (action->actions)
Packit 1e8aac
    g_list_foreach (action->actions, (GFunc) glade_widget_action_class_free,
Packit 1e8aac
                    NULL);
Packit 1e8aac
Packit 1e8aac
  /* Dont free id since it points into path directly */
Packit 1e8aac
  g_free (action->path);
Packit 1e8aac
  g_free (action->label);
Packit 1e8aac
  g_free (action->stock);
Packit 1e8aac
Packit 1e8aac
  g_slice_free (GWActionClass, action);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
void
Packit 1e8aac
glade_widget_action_class_set_label (GWActionClass *action,
Packit 1e8aac
				     const gchar   *label)
Packit 1e8aac
{
Packit 1e8aac
  g_free (action->label);
Packit 1e8aac
  action->label = g_strdup (label);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
void
Packit 1e8aac
glade_widget_action_class_set_stock (GWActionClass *action,
Packit 1e8aac
				     const gchar   *stock)
Packit 1e8aac
{
Packit 1e8aac
  g_free (action->stock);
Packit 1e8aac
  action->stock = g_strdup (stock);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
void
Packit 1e8aac
glade_widget_action_class_set_important (GWActionClass *action,
Packit 1e8aac
					 gboolean       important)
Packit 1e8aac
{
Packit 1e8aac
  action->important = important;
Packit 1e8aac
}