Blame gladeui/glade-popup.c

Packit 1e8aac
/*
Packit 1e8aac
 * Copyright (C) 2001 Ximian, Inc.
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
 *   Chema Celorio <chema@celorio.com>
Packit 1e8aac
 *   Tristan Van Berkom <tvb@gnome.org>
Packit 1e8aac
 */
Packit 1e8aac
Packit 1e8aac
#ifdef HAVE_CONFIG_H
Packit 1e8aac
#include <config.h>
Packit 1e8aac
#endif
Packit 1e8aac
Packit 1e8aac
#include <glib/gi18n-lib.h>
Packit 1e8aac
Packit 1e8aac
#include "glade.h"
Packit 1e8aac
#include "glade-widget.h"
Packit 1e8aac
#include "glade-widget-adaptor.h"
Packit 1e8aac
#include "glade-popup.h"
Packit 1e8aac
#include "glade-placeholder.h"
Packit 1e8aac
#include "glade-clipboard.h"
Packit 1e8aac
#include "glade-command.h"
Packit 1e8aac
#include "glade-project.h"
Packit 1e8aac
#include "glade-app.h"
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_popup_docs_cb (GtkMenuItem *item, GladeWidgetAdaptor *adaptor)
Packit 1e8aac
{
Packit 1e8aac
  g_return_if_fail (GLADE_IS_WIDGET_ADAPTOR (adaptor));
Packit 1e8aac
Packit 1e8aac
  glade_app_search_docs (glade_widget_adaptor_get_book (adaptor),
Packit 1e8aac
                         glade_widget_adaptor_get_name (adaptor),
Packit 1e8aac
                         NULL);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
/********************************************************
Packit 1e8aac
                      WIDGET POPUP
Packit 1e8aac
 *******************************************************/
Packit 1e8aac
static void
Packit 1e8aac
glade_popup_select_cb (GtkMenuItem *item, GladeWidget *widget)
Packit 1e8aac
{
Packit 1e8aac
  glade_project_selection_set (glade_widget_get_project (widget),
Packit 1e8aac
			       glade_widget_get_object (widget), TRUE);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
typedef struct {
Packit 1e8aac
  GladeWidgetAdaptor *adaptor;
Packit 1e8aac
  GladeProject       *project;
Packit 1e8aac
  GladeWidget        *parent;
Packit 1e8aac
  GladePlaceholder   *placeholder;
Packit 1e8aac
} RootAddData;
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_popup_widget_add_cb (GtkMenuItem *item, RootAddData *data)
Packit 1e8aac
{
Packit 1e8aac
  g_return_if_fail (data->adaptor != NULL);
Packit 1e8aac
Packit 1e8aac
  if (glade_command_create (data->adaptor, data->parent,
Packit 1e8aac
                            data->placeholder, data->project))
Packit 1e8aac
Packit 1e8aac
    glade_project_set_add_item (data->project, NULL);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_popup_root_add_cb (GtkMenuItem *item, RootAddData *data)
Packit 1e8aac
{
Packit 1e8aac
  glade_command_create (data->adaptor, NULL, NULL, data->project);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_popup_cut_cb (GtkMenuItem *item, GladeWidget *widget)
Packit 1e8aac
{
Packit 1e8aac
  GladeProject *project = glade_widget_get_project (widget);
Packit 1e8aac
Packit 1e8aac
  /* Assign selection first only if its not already assigned (it may be a delete
Packit 1e8aac
   * of multiple widgets) */
Packit 1e8aac
  if (!glade_project_is_selected (project, glade_widget_get_object (widget)))
Packit 1e8aac
    glade_project_selection_set (project, glade_widget_get_object (widget), FALSE);
Packit 1e8aac
Packit 1e8aac
  glade_project_command_cut (project);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_popup_copy_cb (GtkMenuItem *item, GladeWidget *widget)
Packit 1e8aac
{
Packit 1e8aac
  GladeProject *project = glade_widget_get_project (widget);
Packit 1e8aac
Packit 1e8aac
  /* Assign selection first */
Packit 1e8aac
  if (!glade_project_is_selected (project, glade_widget_get_object (widget)))
Packit 1e8aac
    glade_project_selection_set (project, glade_widget_get_object (widget), FALSE);
Packit 1e8aac
Packit 1e8aac
  glade_project_copy_selection (project);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_popup_paste_cb (GtkMenuItem *item, gpointer data)
Packit 1e8aac
{
Packit 1e8aac
  GladeWidget  *widget = NULL;
Packit 1e8aac
  GladeProject *project;
Packit 1e8aac
Packit 1e8aac
  if (GLADE_IS_WIDGET (data))
Packit 1e8aac
    {
Packit 1e8aac
      widget  = GLADE_WIDGET (data);
Packit 1e8aac
      project = glade_widget_get_project (widget);
Packit 1e8aac
    }
Packit 1e8aac
  else if (GLADE_IS_PROJECT (data))
Packit 1e8aac
    project = GLADE_PROJECT (data);
Packit 1e8aac
  else
Packit 1e8aac
    g_return_if_reached ();
Packit 1e8aac
Packit 1e8aac
  /* The selected widget is the paste destination */
Packit 1e8aac
  if (widget)
Packit 1e8aac
    glade_project_selection_set (project, glade_widget_get_object (widget), FALSE);
Packit 1e8aac
  else
Packit 1e8aac
    glade_project_selection_clear (project, FALSE);
Packit 1e8aac
Packit 1e8aac
  glade_project_command_paste (project, NULL);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_popup_delete_cb (GtkMenuItem *item, GladeWidget *widget)
Packit 1e8aac
{
Packit 1e8aac
  GladeProject *project = glade_widget_get_project (widget);
Packit 1e8aac
Packit 1e8aac
  /* Assign selection first */
Packit 1e8aac
  if (glade_project_is_selected
Packit 1e8aac
      (project, glade_widget_get_object (widget)) == FALSE)
Packit 1e8aac
    glade_project_selection_set (project, glade_widget_get_object (widget), FALSE);
Packit 1e8aac
Packit 1e8aac
  glade_project_command_delete (project);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
/********************************************************
Packit 1e8aac
                  PLACEHOLDER POPUP
Packit 1e8aac
 *******************************************************/
Packit 1e8aac
static void
Packit 1e8aac
glade_popup_placeholder_paste_cb (GtkMenuItem      *item, 
Packit 1e8aac
                                  GladePlaceholder *placeholder)
Packit 1e8aac
{
Packit 1e8aac
  GladeProject *project;
Packit 1e8aac
Packit 1e8aac
  project = glade_placeholder_get_project (placeholder);
Packit 1e8aac
Packit 1e8aac
  glade_project_selection_clear (project, FALSE);
Packit 1e8aac
Packit 1e8aac
  glade_project_command_paste (project, placeholder);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
/********************************************************
Packit 1e8aac
                    POPUP BUILDING
Packit 1e8aac
 *******************************************************/
Packit 1e8aac
static GtkWidget *
Packit 1e8aac
glade_popup_append_item (GtkWidget   *popup_menu,
Packit 1e8aac
                         const gchar *label,
Packit 1e8aac
                         gboolean     sensitive,
Packit 1e8aac
                         gpointer     callback,
Packit 1e8aac
                         gpointer     data)
Packit 1e8aac
{
Packit 1e8aac
  GtkWidget *menu_item = gtk_menu_item_new_with_mnemonic (label);
Packit 1e8aac
Packit 1e8aac
  if (callback)
Packit 1e8aac
    g_signal_connect (G_OBJECT (menu_item), "activate",
Packit 1e8aac
                      G_CALLBACK (callback), data);
Packit 1e8aac
Packit 1e8aac
  gtk_widget_set_sensitive (menu_item, sensitive);
Packit 1e8aac
  gtk_widget_show (menu_item);
Packit 1e8aac
  gtk_menu_shell_append (GTK_MENU_SHELL (popup_menu), menu_item);
Packit 1e8aac
Packit 1e8aac
  return menu_item;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_popup_menuitem_activated (GtkMenuItem *item, const gchar *action_path)
Packit 1e8aac
{
Packit 1e8aac
  GladeWidget *widget;
Packit 1e8aac
Packit 1e8aac
  if ((widget = g_object_get_data (G_OBJECT (item), "gwa-data")))
Packit 1e8aac
    glade_widget_adaptor_action_activate (glade_widget_get_adaptor (widget),
Packit 1e8aac
                                          glade_widget_get_object (widget), action_path);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_popup_menuitem_packing_activated (GtkMenuItem *item,
Packit 1e8aac
                                        const gchar *action_path)
Packit 1e8aac
{
Packit 1e8aac
  GladeWidget *widget, *parent;
Packit 1e8aac
Packit 1e8aac
  if ((widget = g_object_get_data (G_OBJECT (item), "gwa-data")))
Packit 1e8aac
    {
Packit 1e8aac
      parent = glade_widget_get_parent (widget);
Packit 1e8aac
      glade_widget_adaptor_child_action_activate (glade_widget_get_adaptor (parent),
Packit 1e8aac
						  glade_widget_get_object (parent),
Packit 1e8aac
						  glade_widget_get_object (widget), action_path);
Packit 1e8aac
    }
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_popup_menuitem_ph_packing_activated (GtkMenuItem *item,
Packit 1e8aac
                                           const gchar *action_path)
Packit 1e8aac
{
Packit 1e8aac
  GladePlaceholder *ph;
Packit 1e8aac
  GladeWidget *parent;
Packit 1e8aac
Packit 1e8aac
  if ((ph = g_object_get_data (G_OBJECT (item), "gwa-data")))
Packit 1e8aac
    {
Packit 1e8aac
      parent = glade_placeholder_get_parent (ph);
Packit 1e8aac
      glade_widget_adaptor_child_action_activate (glade_widget_get_adaptor (parent),
Packit 1e8aac
                                                  glade_widget_get_object (parent),
Packit 1e8aac
                                                  G_OBJECT (ph), action_path);
Packit 1e8aac
    }
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static gint
Packit 1e8aac
glade_popup_action_populate_menu_real (GtkWidget   *menu,
Packit 1e8aac
                                       GladeWidget *gwidget,
Packit 1e8aac
                                       GList       *actions,
Packit 1e8aac
                                       GCallback    callback,
Packit 1e8aac
                                       gpointer     data)
Packit 1e8aac
{
Packit 1e8aac
  GtkWidget *item;
Packit 1e8aac
  GList *list;
Packit 1e8aac
  gint n = 0;
Packit 1e8aac
Packit 1e8aac
  for (list = actions; list; list = g_list_next (list))
Packit 1e8aac
    {
Packit 1e8aac
      GladeWidgetAction *action = list->data;
Packit 1e8aac
      GWActionClass     *aclass = glade_widget_action_get_class (action);
Packit 1e8aac
      GList             *children = glade_widget_action_get_children (action);
Packit 1e8aac
      GtkWidget         *submenu = NULL;
Packit 1e8aac
Packit 1e8aac
      if (!glade_widget_action_get_visible (action))
Packit 1e8aac
	continue;
Packit 1e8aac
Packit 1e8aac
      if (children)
Packit 1e8aac
        {
Packit 1e8aac
          submenu = gtk_menu_new ();
Packit 1e8aac
          n += glade_popup_action_populate_menu_real (submenu,
Packit 1e8aac
                                                      gwidget,
Packit 1e8aac
                                                      children,
Packit 1e8aac
                                                      callback, data);
Packit 1e8aac
        }
Packit 1e8aac
      else
Packit 1e8aac
        submenu = glade_widget_adaptor_action_submenu (glade_widget_get_adaptor (gwidget),
Packit 1e8aac
                                                       glade_widget_get_object (gwidget),
Packit 1e8aac
                                                       aclass->path);
Packit 1e8aac
Packit 1e8aac
Packit 1e8aac
      item = glade_popup_append_item (menu, aclass->label, TRUE,
Packit 1e8aac
                                      (children) ? NULL : callback,
Packit 1e8aac
                                      (children) ? NULL : aclass->path);
Packit 1e8aac
Packit 1e8aac
      g_object_set_data (G_OBJECT (item), "gwa-data", data);
Packit 1e8aac
Packit 1e8aac
      gtk_widget_set_sensitive (item, glade_widget_action_get_sensitive (action));
Packit 1e8aac
Packit 1e8aac
      if (submenu)
Packit 1e8aac
        gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), submenu);
Packit 1e8aac
Packit 1e8aac
      n++;
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  return n;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
/*
Packit 1e8aac
 * glade_popup_action_populate_menu:
Packit 1e8aac
 * @menu: a GtkMenu to put the actions menu items.
Packit 1e8aac
 * @widget: A #GladeWidget
Packit 1e8aac
 * @action: a @widget subaction or NULL to include all actions.
Packit 1e8aac
 * @packing: TRUE to include packing actions
Packit 1e8aac
 *
Packit 1e8aac
 * Populate a GtkMenu with widget's actions
Packit 1e8aac
 *
Packit 1e8aac
 * Returns the number of action appended to the menu.
Packit 1e8aac
 */
Packit 1e8aac
gint
Packit 1e8aac
glade_popup_action_populate_menu (GtkWidget         *menu,
Packit 1e8aac
                                  GladeWidget       *widget,
Packit 1e8aac
                                  GladeWidgetAction *action,
Packit 1e8aac
                                  gboolean           packing)
Packit 1e8aac
{
Packit 1e8aac
  gint n;
Packit 1e8aac
Packit 1e8aac
  g_return_val_if_fail (GTK_IS_MENU (menu), 0);
Packit 1e8aac
  g_return_val_if_fail (GLADE_IS_WIDGET (widget), 0);
Packit 1e8aac
Packit 1e8aac
  g_return_val_if_fail (action == NULL || GLADE_IS_WIDGET_ACTION (action), 0);
Packit 1e8aac
Packit 1e8aac
  if (action)
Packit 1e8aac
    {
Packit 1e8aac
      GWActionClass *aclass = glade_widget_action_get_class (action);
Packit 1e8aac
      GList         *children = glade_widget_action_get_children (action);
Packit 1e8aac
      
Packit 1e8aac
      if (glade_widget_get_action (widget, aclass->path) &&
Packit 1e8aac
	  glade_widget_action_get_visible (action))
Packit 1e8aac
        return glade_popup_action_populate_menu_real (menu,
Packit 1e8aac
                                                      widget,
Packit 1e8aac
                                                      children,
Packit 1e8aac
                                                      G_CALLBACK
Packit 1e8aac
                                                      (glade_popup_menuitem_activated),
Packit 1e8aac
                                                      widget);
Packit 1e8aac
Packit 1e8aac
      if (glade_widget_get_pack_action (widget, aclass->path) &&
Packit 1e8aac
	  glade_widget_action_get_visible (action))
Packit 1e8aac
        return glade_popup_action_populate_menu_real (menu,
Packit 1e8aac
                                                      glade_widget_get_parent
Packit 1e8aac
                                                      (widget), children,
Packit 1e8aac
                                                      G_CALLBACK
Packit 1e8aac
                                                      (glade_popup_menuitem_packing_activated),
Packit 1e8aac
                                                      widget);
Packit 1e8aac
Packit 1e8aac
      return 0;
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  n = glade_popup_action_populate_menu_real (menu,
Packit 1e8aac
                                             widget,
Packit 1e8aac
                                             glade_widget_get_actions (widget),
Packit 1e8aac
                                             G_CALLBACK
Packit 1e8aac
                                             (glade_popup_menuitem_activated),
Packit 1e8aac
                                             widget);
Packit 1e8aac
Packit 1e8aac
  if (packing && glade_widget_get_pack_actions (widget))
Packit 1e8aac
    {
Packit 1e8aac
      if (n)
Packit 1e8aac
        {
Packit 1e8aac
          GtkWidget *separator = gtk_separator_menu_item_new ();
Packit 1e8aac
          gtk_menu_shell_append (GTK_MENU_SHELL (menu), separator);
Packit 1e8aac
          gtk_widget_show (separator);
Packit 1e8aac
        }
Packit 1e8aac
Packit 1e8aac
      n += glade_popup_action_populate_menu_real 
Packit 1e8aac
	(menu, glade_widget_get_parent (widget),
Packit 1e8aac
	 glade_widget_get_pack_actions (widget),
Packit 1e8aac
	 G_CALLBACK (glade_popup_menuitem_packing_activated), widget);
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  return n;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static GtkWidget *
Packit 1e8aac
glade_popup_create_menu (GladeWidget      *widget,
Packit 1e8aac
                         GladePlaceholder *placeholder, 
Packit 1e8aac
			 GladeProject     *project,
Packit 1e8aac
			 gboolean          packing)
Packit 1e8aac
{
Packit 1e8aac
  GtkWidget          *popup_menu;
Packit 1e8aac
  GtkWidget          *separator;
Packit 1e8aac
  gboolean            sensitive;
Packit 1e8aac
  GladeWidgetAdaptor *adaptor;
Packit 1e8aac
Packit 1e8aac
  popup_menu = gtk_menu_new ();
Packit 1e8aac
Packit 1e8aac
  adaptor = glade_project_get_add_item (project);
Packit 1e8aac
Packit 1e8aac
  if (adaptor)
Packit 1e8aac
    {
Packit 1e8aac
      RootAddData *data = g_new (RootAddData, 1);
Packit 1e8aac
      
Packit 1e8aac
      data->adaptor = adaptor;
Packit 1e8aac
      data->project = project;
Packit 1e8aac
      data->parent = placeholder ? glade_placeholder_get_parent (placeholder) : widget;
Packit 1e8aac
      data->placeholder = placeholder;
Packit 1e8aac
      
Packit 1e8aac
      g_object_set_data_full (G_OBJECT (popup_menu), "root-data-destroy-me", 
Packit 1e8aac
			      data, (GDestroyNotify)g_free);
Packit 1e8aac
Packit 1e8aac
      glade_popup_append_item (popup_menu, _("_Add widget here"),
Packit 1e8aac
                               data->parent != NULL,
Packit 1e8aac
			       glade_popup_widget_add_cb,
Packit 1e8aac
			       data);
Packit 1e8aac
Packit 1e8aac
      glade_popup_append_item (popup_menu, _("Add widget as _toplevel"), TRUE,
Packit 1e8aac
                               glade_popup_root_add_cb, data);
Packit 1e8aac
Packit 1e8aac
      separator = gtk_separator_menu_item_new ();
Packit 1e8aac
      gtk_menu_shell_append (GTK_MENU_SHELL (popup_menu), separator);
Packit 1e8aac
      gtk_widget_show (separator);
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  sensitive = (widget != NULL);
Packit 1e8aac
Packit 1e8aac
  glade_popup_append_item (popup_menu, _("_Select"), sensitive,
Packit 1e8aac
                           glade_popup_select_cb, widget);
Packit 1e8aac
  glade_popup_append_item (popup_menu, _("Cu_t"), sensitive,
Packit 1e8aac
                           glade_popup_cut_cb, widget);
Packit 1e8aac
  glade_popup_append_item (popup_menu, _("_Copy"), sensitive,
Packit 1e8aac
                           glade_popup_copy_cb, widget);
Packit 1e8aac
Packit 1e8aac
  /* paste is placholder specific when the popup is on a placeholder */
Packit 1e8aac
  sensitive = glade_clipboard_get_has_selection (glade_app_get_clipboard ());
Packit 1e8aac
Packit 1e8aac
  if (placeholder)
Packit 1e8aac
    glade_popup_append_item (popup_menu, _("_Paste"), sensitive,
Packit 1e8aac
                             glade_popup_placeholder_paste_cb, placeholder);
Packit 1e8aac
  else if (widget)
Packit 1e8aac
    glade_popup_append_item (popup_menu, _("_Paste"), sensitive,
Packit 1e8aac
                             glade_popup_paste_cb, widget);
Packit 1e8aac
  else
Packit 1e8aac
    glade_popup_append_item (popup_menu, _("_Paste"), sensitive,
Packit 1e8aac
                             glade_popup_paste_cb, NULL);
Packit 1e8aac
Packit 1e8aac
Packit 1e8aac
  glade_popup_append_item (popup_menu, _("_Delete"), (widget != NULL),
Packit 1e8aac
                           glade_popup_delete_cb, widget);
Packit 1e8aac
Packit 1e8aac
Packit 1e8aac
  /* packing actions are a little different on placholders */
Packit 1e8aac
  if (placeholder)
Packit 1e8aac
    {
Packit 1e8aac
      if (widget && glade_widget_get_actions (widget))
Packit 1e8aac
        {
Packit 1e8aac
          GtkWidget *separator = gtk_separator_menu_item_new ();
Packit 1e8aac
          gtk_menu_shell_append (GTK_MENU_SHELL (popup_menu), separator);
Packit 1e8aac
          gtk_widget_show (separator);
Packit 1e8aac
Packit 1e8aac
          glade_popup_action_populate_menu_real
Packit 1e8aac
              (popup_menu,
Packit 1e8aac
               widget,
Packit 1e8aac
               glade_widget_get_actions (widget),
Packit 1e8aac
               G_CALLBACK (glade_popup_menuitem_activated), widget);
Packit 1e8aac
        }
Packit 1e8aac
Packit 1e8aac
      if (glade_placeholder_packing_actions (placeholder))
Packit 1e8aac
        {
Packit 1e8aac
          GtkWidget *separator = gtk_separator_menu_item_new ();
Packit 1e8aac
          gtk_menu_shell_append (GTK_MENU_SHELL (popup_menu), separator);
Packit 1e8aac
          gtk_widget_show (separator);
Packit 1e8aac
Packit 1e8aac
          glade_popup_action_populate_menu_real
Packit 1e8aac
              (popup_menu,
Packit 1e8aac
               widget,
Packit 1e8aac
               glade_placeholder_packing_actions (placeholder),
Packit 1e8aac
               G_CALLBACK (glade_popup_menuitem_ph_packing_activated),
Packit 1e8aac
               placeholder);
Packit 1e8aac
        }
Packit 1e8aac
    }
Packit 1e8aac
  else if (widget && (glade_widget_get_actions (widget) || 
Packit 1e8aac
		      (packing && glade_widget_get_pack_actions (widget))))
Packit 1e8aac
    {
Packit 1e8aac
      GtkWidget *separator = gtk_separator_menu_item_new ();
Packit 1e8aac
      gtk_menu_shell_append (GTK_MENU_SHELL (popup_menu), separator);
Packit 1e8aac
      gtk_widget_show (separator);
Packit 1e8aac
Packit 1e8aac
      glade_popup_action_populate_menu (popup_menu, widget, NULL, packing);
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  return popup_menu;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
void
Packit 1e8aac
glade_popup_widget_pop (GladeWidget    *widget,
Packit 1e8aac
                        GdkEventButton *event,
Packit 1e8aac
                        gboolean        packing)
Packit 1e8aac
{
Packit 1e8aac
  GtkWidget *popup_menu;
Packit 1e8aac
  gint button;
Packit 1e8aac
  gint event_time;
Packit 1e8aac
Packit 1e8aac
  g_return_if_fail (GLADE_IS_WIDGET (widget) || widget == NULL);
Packit 1e8aac
Packit 1e8aac
  popup_menu = glade_popup_create_menu (widget, NULL, glade_widget_get_project (widget), packing);
Packit 1e8aac
Packit 1e8aac
  if (event)
Packit 1e8aac
    {
Packit 1e8aac
      button = event->button;
Packit 1e8aac
      event_time = event->time;
Packit 1e8aac
    }
Packit 1e8aac
  else
Packit 1e8aac
    {
Packit 1e8aac
      button = 0;
Packit 1e8aac
      event_time = gtk_get_current_event_time ();
Packit 1e8aac
    }
Packit 1e8aac
  gtk_menu_popup (GTK_MENU (popup_menu), NULL, NULL,
Packit 1e8aac
                  NULL, NULL, button, event_time);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
void
Packit 1e8aac
glade_popup_placeholder_pop (GladePlaceholder *placeholder,
Packit 1e8aac
                             GdkEventButton   *event)
Packit 1e8aac
{
Packit 1e8aac
  GladeWidget *widget;
Packit 1e8aac
  GtkWidget *popup_menu;
Packit 1e8aac
  gint button;
Packit 1e8aac
  gint event_time;
Packit 1e8aac
Packit 1e8aac
  g_return_if_fail (GLADE_IS_PLACEHOLDER (placeholder));
Packit 1e8aac
Packit 1e8aac
  widget = glade_placeholder_get_parent (placeholder);
Packit 1e8aac
Packit 1e8aac
  popup_menu = glade_popup_create_menu (widget, placeholder, 
Packit 1e8aac
					glade_widget_get_project (widget), TRUE);
Packit 1e8aac
Packit 1e8aac
  if (event)
Packit 1e8aac
    {
Packit 1e8aac
      button = event->button;
Packit 1e8aac
      event_time = event->time;
Packit 1e8aac
    }
Packit 1e8aac
  else
Packit 1e8aac
    {
Packit 1e8aac
      button = 0;
Packit 1e8aac
      event_time = gtk_get_current_event_time ();
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  gtk_menu_popup (GTK_MENU (popup_menu), NULL, NULL,
Packit 1e8aac
                  NULL, NULL, button, event_time);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
void
Packit 1e8aac
glade_popup_palette_pop (GladePalette       *palette, 
Packit 1e8aac
			 GladeWidgetAdaptor *adaptor, 
Packit 1e8aac
			 GdkEventButton     *event)
Packit 1e8aac
{
Packit 1e8aac
  GladeProject *project;
Packit 1e8aac
  GtkWidget *popup_menu;
Packit 1e8aac
  gint button;
Packit 1e8aac
  gint event_time;
Packit 1e8aac
  RootAddData *data;
Packit 1e8aac
Packit 1e8aac
  g_return_if_fail (GLADE_IS_WIDGET_ADAPTOR (adaptor));
Packit 1e8aac
Packit 1e8aac
  popup_menu = gtk_menu_new ();
Packit 1e8aac
Packit 1e8aac
  project = glade_palette_get_project (palette);
Packit 1e8aac
Packit 1e8aac
  data = g_new (RootAddData, 1);
Packit 1e8aac
  data->adaptor = adaptor;
Packit 1e8aac
  data->project = project;
Packit 1e8aac
  g_object_set_data_full (G_OBJECT (popup_menu), "root-data-destroy-me", 
Packit 1e8aac
			  data, (GDestroyNotify)g_free);
Packit 1e8aac
Packit 1e8aac
  glade_popup_append_item (popup_menu, _("Add widget as _toplevel"), TRUE,
Packit 1e8aac
                           glade_popup_root_add_cb, data);
Packit 1e8aac
Packit 1e8aac
  if (glade_widget_adaptor_get_book (adaptor) && glade_util_have_devhelp ())
Packit 1e8aac
    glade_popup_append_item (popup_menu, _("Read _documentation"), TRUE,
Packit 1e8aac
                             glade_popup_docs_cb, adaptor);
Packit 1e8aac
Packit 1e8aac
  if (event)
Packit 1e8aac
    {
Packit 1e8aac
      button = event->button;
Packit 1e8aac
      event_time = event->time;
Packit 1e8aac
    }
Packit 1e8aac
  else
Packit 1e8aac
    {
Packit 1e8aac
      button = 0;
Packit 1e8aac
      event_time = gtk_get_current_event_time ();
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  gtk_menu_popup (GTK_MENU (popup_menu), NULL, NULL,
Packit 1e8aac
                  NULL, NULL, button, event_time);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_popup_clear_property_cb (GtkMenuItem *item, GladeProperty *property)
Packit 1e8aac
{
Packit 1e8aac
  GValue value = { 0, };
Packit 1e8aac
Packit 1e8aac
  glade_property_get_default (property, &value);
Packit 1e8aac
  glade_command_set_property_value (property, &value);
Packit 1e8aac
  g_value_unset (&value);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_popup_property_docs_cb (GtkMenuItem *item, GladeProperty *property)
Packit 1e8aac
{
Packit 1e8aac
  GladeWidgetAdaptor *adaptor, *prop_adaptor;
Packit 1e8aac
  GladePropertyClass *pclass;
Packit 1e8aac
  GParamSpec         *pspec;
Packit 1e8aac
  gchar              *search;
Packit 1e8aac
Packit 1e8aac
  pclass       = glade_property_get_class (property);
Packit 1e8aac
  pspec        = glade_property_class_get_pspec (pclass);
Packit 1e8aac
  prop_adaptor = glade_property_class_get_adaptor (pclass);
Packit 1e8aac
  adaptor      = glade_widget_adaptor_from_pspec (prop_adaptor, pspec);
Packit 1e8aac
  search       = g_strdup_printf ("The \"%s\" property", glade_property_class_id (pclass));
Packit 1e8aac
Packit 1e8aac
  glade_app_search_docs (glade_widget_adaptor_get_book (adaptor),
Packit 1e8aac
                         g_type_name (pspec->owner_type), search);
Packit 1e8aac
Packit 1e8aac
  g_free (search);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
void
Packit 1e8aac
glade_popup_property_pop (GladeProperty *property, GdkEventButton *event)
Packit 1e8aac
{
Packit 1e8aac
Packit 1e8aac
  GladeWidgetAdaptor *adaptor, *prop_adaptor;
Packit 1e8aac
  GladePropertyClass *pclass;
Packit 1e8aac
  GParamSpec         *pspec;
Packit 1e8aac
  GtkWidget *popup_menu;
Packit 1e8aac
  gint button;
Packit 1e8aac
  gint event_time;
Packit 1e8aac
Packit 1e8aac
  pclass       = glade_property_get_class (property);
Packit 1e8aac
  pspec        = glade_property_class_get_pspec (pclass);
Packit 1e8aac
  prop_adaptor = glade_property_class_get_adaptor (pclass);
Packit 1e8aac
  adaptor      = glade_widget_adaptor_from_pspec (prop_adaptor, pspec);
Packit 1e8aac
Packit 1e8aac
  g_return_if_fail (GLADE_IS_WIDGET_ADAPTOR (adaptor));
Packit 1e8aac
Packit 1e8aac
  popup_menu = gtk_menu_new ();
Packit 1e8aac
Packit 1e8aac
  glade_popup_append_item (popup_menu, _("Set default value"), TRUE,
Packit 1e8aac
                           glade_popup_clear_property_cb, property);
Packit 1e8aac
Packit 1e8aac
  if (!glade_property_class_get_virtual (pclass) &&
Packit 1e8aac
      glade_widget_adaptor_get_book (adaptor) &&
Packit 1e8aac
      glade_util_have_devhelp ())
Packit 1e8aac
    {
Packit 1e8aac
      glade_popup_append_item (popup_menu, _("Read _documentation"), TRUE,
Packit 1e8aac
                               glade_popup_property_docs_cb, property);
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  if (event)
Packit 1e8aac
    {
Packit 1e8aac
      button = event->button;
Packit 1e8aac
      event_time = event->time;
Packit 1e8aac
    }
Packit 1e8aac
  else
Packit 1e8aac
    {
Packit 1e8aac
      button = 0;
Packit 1e8aac
      event_time = gtk_get_current_event_time ();
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  gtk_menu_popup (GTK_MENU (popup_menu), NULL, NULL,
Packit 1e8aac
                  NULL, NULL, button, event_time);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
void
Packit 1e8aac
glade_popup_simple_pop (GladeProject *project, GdkEventButton *event)
Packit 1e8aac
{
Packit 1e8aac
  GtkWidget *popup_menu;
Packit 1e8aac
  gint button;
Packit 1e8aac
  gint event_time;
Packit 1e8aac
Packit 1e8aac
  popup_menu = glade_popup_create_menu (NULL, NULL, project, FALSE);
Packit 1e8aac
  if (!popup_menu)
Packit 1e8aac
    return;
Packit 1e8aac
Packit 1e8aac
  if (event)
Packit 1e8aac
    {
Packit 1e8aac
      button = event->button;
Packit 1e8aac
      event_time = event->time;
Packit 1e8aac
    }
Packit 1e8aac
  else
Packit 1e8aac
    {
Packit 1e8aac
      button = 0;
Packit 1e8aac
      event_time = gtk_get_current_event_time ();
Packit 1e8aac
    }
Packit 1e8aac
  gtk_menu_popup (GTK_MENU (popup_menu), NULL, NULL,
Packit 1e8aac
                  NULL, NULL, button, event_time);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
gboolean
Packit 1e8aac
glade_popup_is_popup_event (GdkEventButton *event)
Packit 1e8aac
{
Packit 1e8aac
  g_return_val_if_fail (event, FALSE);
Packit 1e8aac
Packit 1e8aac
#ifdef MAC_INTEGRATION
Packit 1e8aac
  return (event->type == GDK_BUTTON_PRESS && event->button == 1 &&
Packit 1e8aac
          ((event->state & GDK_MOD1_MASK) != 0));
Packit 1e8aac
#else
Packit 1e8aac
  return (event->type == GDK_BUTTON_PRESS && event->button == 3);
Packit 1e8aac
#endif
Packit 1e8aac
}