Blame gladeui/glade-clipboard.c

Packit 1e8aac
/*
Packit 1e8aac
 * glade-clipboard.c - An object for handling Cut/Copy/Paste.
Packit 1e8aac
 *
Packit 1e8aac
 * Copyright (C) 2001 The GNOME Foundation.
Packit 1e8aac
 *
Packit 1e8aac
 * Author(s):
Packit 1e8aac
 *      Archit Baweja <bighead@users.sourceforge.net>
Packit 1e8aac
 *
Packit 1e8aac
 * This program is free software; you can redistribute it and/or
Packit 1e8aac
 * modify it under the terms of the GNU General Public License
Packit 1e8aac
 * as published by the Free Software Foundation; either version 2
Packit 1e8aac
 * of the 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., 59 Temple Place - Suite 330, Boston, MA  02111-1307,
Packit 1e8aac
 * USA.
Packit 1e8aac
 */
Packit 1e8aac
Packit 1e8aac
#include "config.h"
Packit 1e8aac
Packit 1e8aac
/**
Packit 1e8aac
 * SECTION:glade-clipboard
Packit 1e8aac
 * @Short_Description: A list of #GladeWidget objects not in any #GladeProject.
Packit 1e8aac
 *
Packit 1e8aac
 * The #GladeClipboard is a singleton and is an accumulative shelf
Packit 1e8aac
 * of all cut or copied #GladeWidget in the application. A #GladeWidget
Packit 1e8aac
 * can be cut from one #GladeProject and pasted to another.
Packit 1e8aac
 */
Packit 1e8aac
Packit 1e8aac
#include <glib/gi18n-lib.h>
Packit 1e8aac
#include "glade.h"
Packit 1e8aac
#include "glade-clipboard.h"
Packit 1e8aac
#include "glade-widget.h"
Packit 1e8aac
#include "glade-placeholder.h"
Packit 1e8aac
#include "glade-project.h"
Packit 1e8aac
Packit 1e8aac
struct _GladeClipboardPrivate
Packit 1e8aac
{
Packit 1e8aac
  GList     *widgets;       /* A list of GladeWidget's on the clipboard */
Packit 1e8aac
  gboolean   has_selection; /* TRUE if clipboard has selection */
Packit 1e8aac
};
Packit 1e8aac
Packit 1e8aac
enum
Packit 1e8aac
{
Packit 1e8aac
  PROP_0,
Packit 1e8aac
  PROP_HAS_SELECTION,
Packit 1e8aac
  N_PROPERTIES
Packit 1e8aac
};
Packit 1e8aac
Packit 1e8aac
static GParamSpec *properties[N_PROPERTIES];
Packit 1e8aac
Packit 1e8aac
G_DEFINE_TYPE_WITH_PRIVATE (GladeClipboard, glade_clipboard, G_TYPE_OBJECT);
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_project_get_property (GObject    *object,
Packit 1e8aac
                            guint       prop_id,
Packit 1e8aac
                            GValue     *value,
Packit 1e8aac
                            GParamSpec *pspec)
Packit 1e8aac
{
Packit 1e8aac
  GladeClipboard *clipboard = GLADE_CLIPBOARD (object);
Packit 1e8aac
Packit 1e8aac
  switch (prop_id)
Packit 1e8aac
    {
Packit 1e8aac
      case PROP_HAS_SELECTION:
Packit 1e8aac
        g_value_set_boolean (value, clipboard->priv->has_selection);
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_clipboard_class_init (GladeClipboardClass * klass)
Packit 1e8aac
{
Packit 1e8aac
  GObjectClass *object_class;
Packit 1e8aac
Packit 1e8aac
  object_class = G_OBJECT_CLASS (klass);
Packit 1e8aac
Packit 1e8aac
  object_class->get_property = glade_project_get_property;
Packit 1e8aac
Packit 1e8aac
  properties[PROP_HAS_SELECTION] =
Packit 1e8aac
    g_param_spec_boolean ("has-selection",
Packit 1e8aac
                          "Has Selection",
Packit 1e8aac
                          "Whether clipboard has a selection of items to paste",
Packit 1e8aac
                          FALSE,
Packit 1e8aac
                          G_PARAM_READABLE);
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
static void
Packit 1e8aac
glade_clipboard_init (GladeClipboard *clipboard)
Packit 1e8aac
{
Packit 1e8aac
  clipboard->priv = glade_clipboard_get_instance_private (clipboard);
Packit 1e8aac
Packit 1e8aac
  clipboard->priv->widgets = NULL;
Packit 1e8aac
  clipboard->priv->has_selection = FALSE;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_clipboard_set_has_selection (GladeClipboard *clipboard,
Packit 1e8aac
                                   gboolean        has_selection)
Packit 1e8aac
{
Packit 1e8aac
  if (clipboard->priv->has_selection != has_selection)
Packit 1e8aac
    {
Packit 1e8aac
      clipboard->priv->has_selection = has_selection;
Packit 1e8aac
      g_object_notify_by_pspec (G_OBJECT (clipboard), properties[PROP_HAS_SELECTION]);
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
/**
Packit 1e8aac
 * glade_clipboard_get_has_selection:
Packit 1e8aac
 * @clipboard: a #GladeClipboard
Packit 1e8aac
 * 
Packit 1e8aac
 * Returns: TRUE if this clipboard has selected items to paste.
Packit 1e8aac
 */
Packit 1e8aac
gboolean
Packit 1e8aac
glade_clipboard_get_has_selection (GladeClipboard *clipboard)
Packit 1e8aac
{
Packit 1e8aac
  g_return_val_if_fail (GLADE_IS_CLIPBOARD (clipboard), FALSE);
Packit 1e8aac
Packit 1e8aac
  return clipboard->priv->has_selection;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
GList *
Packit 1e8aac
glade_clipboard_widgets (GladeClipboard *clipboard)
Packit 1e8aac
{
Packit 1e8aac
  g_return_val_if_fail (GLADE_IS_CLIPBOARD (clipboard), NULL);
Packit 1e8aac
Packit 1e8aac
Packit 1e8aac
  return clipboard->priv->widgets;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
/**
Packit 1e8aac
 * glade_clipboard_new:
Packit 1e8aac
 * 
Packit 1e8aac
 * Returns: a new #GladeClipboard object
Packit 1e8aac
 */
Packit 1e8aac
GladeClipboard *
Packit 1e8aac
glade_clipboard_new (void)
Packit 1e8aac
{
Packit 1e8aac
  return GLADE_CLIPBOARD (g_object_new (GLADE_TYPE_CLIPBOARD, NULL));
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
/**
Packit 1e8aac
 * glade_clipboard_add:
Packit 1e8aac
 * @clipboard: a #GladeClipboard
Packit 1e8aac
 * @widgets: a #GList of #GladeWidgets
Packit 1e8aac
 * 
Packit 1e8aac
 * Adds @widgets to @clipboard.
Packit 1e8aac
 * This increases the reference count of each #GladeWidget in @widgets.
Packit 1e8aac
 */
Packit 1e8aac
void
Packit 1e8aac
glade_clipboard_add (GladeClipboard *clipboard, GList *widgets)
Packit 1e8aac
{
Packit 1e8aac
  GladeWidget *widget;
Packit 1e8aac
  GList *list;
Packit 1e8aac
Packit 1e8aac
  g_return_if_fail (GLADE_IS_CLIPBOARD (clipboard));
Packit 1e8aac
Packit 1e8aac
  glade_clipboard_clear (clipboard);
Packit 1e8aac
Packit 1e8aac
  /*
Packit 1e8aac
   * Add the widgets to the list of children.
Packit 1e8aac
   */
Packit 1e8aac
  for (list = widgets; list && list->data; list = list->next)
Packit 1e8aac
    {
Packit 1e8aac
      widget = list->data;
Packit 1e8aac
      clipboard->priv->widgets =
Packit 1e8aac
          g_list_prepend (clipboard->priv->widgets, g_object_ref_sink (G_OBJECT (widget)));
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  glade_clipboard_set_has_selection (clipboard, TRUE);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
/**
Packit 1e8aac
 * glade_clipboard_clear:
Packit 1e8aac
 * @clipboard: a #GladeClipboard
Packit 1e8aac
 * 
Packit 1e8aac
 * Removes all widgets from the @clipboard.
Packit 1e8aac
 */
Packit 1e8aac
void
Packit 1e8aac
glade_clipboard_clear (GladeClipboard *clipboard)
Packit 1e8aac
{
Packit 1e8aac
  GladeWidget *widget;
Packit 1e8aac
  GList *list;
Packit 1e8aac
Packit 1e8aac
  g_return_if_fail (GLADE_IS_CLIPBOARD (clipboard));
Packit 1e8aac
Packit 1e8aac
  for (list = clipboard->priv->widgets; list && list->data; list = list->next)
Packit 1e8aac
    {
Packit 1e8aac
      widget = list->data;
Packit 1e8aac
Packit 1e8aac
      g_object_unref (G_OBJECT (widget));
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  clipboard->priv->widgets = 
Packit 1e8aac
    (g_list_free (clipboard->priv->widgets), NULL);
Packit 1e8aac
Packit 1e8aac
  glade_clipboard_set_has_selection (clipboard, FALSE);
Packit 1e8aac
}