|
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 |
}
|