From ba429d344132c088177e853cce8ff7181570b221 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Wed, 10 Apr 2024 19:42:51 +0200 Subject: Adding upstream version 44.2. Signed-off-by: Daniel Baumann --- gedit/gedit-notebook-popup-menu.c | 297 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 297 insertions(+) create mode 100644 gedit/gedit-notebook-popup-menu.c (limited to 'gedit/gedit-notebook-popup-menu.c') diff --git a/gedit/gedit-notebook-popup-menu.c b/gedit/gedit-notebook-popup-menu.c new file mode 100644 index 0000000..95ef458 --- /dev/null +++ b/gedit/gedit-notebook-popup-menu.c @@ -0,0 +1,297 @@ +/* + * gedit-notebook-popup-menu.c + * This file is part of gedit + * + * Copyright (C) 2011 - Ignacio Casal Quinteiro + * + * gedit is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * gedit is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with gedit. If not, see . + */ + +#include "gedit-notebook-popup-menu.h" + +#include + +#include "gedit-app.h" +#include "gedit-app-private.h" +#include "gedit-commands-private.h" +#include "gedit-multi-notebook.h" + +struct _GeditNotebookPopupMenu +{ + GtkMenu parent_instance; + + GeditWindow *window; + GeditTab *tab; + + GSimpleActionGroup *action_group; +}; + +enum +{ + PROP_0, + PROP_WINDOW, + PROP_TAB, + LAST_PROP +}; + +static GParamSpec *properties[LAST_PROP]; + +G_DEFINE_TYPE (GeditNotebookPopupMenu, gedit_notebook_popup_menu, GTK_TYPE_MENU) + +static void +gedit_notebook_popup_menu_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GeditNotebookPopupMenu *menu = GEDIT_NOTEBOOK_POPUP_MENU (object); + + switch (prop_id) + { + case PROP_WINDOW: + menu->window = GEDIT_WINDOW (g_value_get_object (value)); + break; + + case PROP_TAB: + menu->tab = GEDIT_TAB (g_value_get_object (value)); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gedit_notebook_popup_menu_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GeditNotebookPopupMenu *menu = GEDIT_NOTEBOOK_POPUP_MENU (object); + + switch (prop_id) + { + case PROP_WINDOW: + g_value_set_object (value, menu->window); + break; + + case PROP_TAB: + g_value_set_object (value, menu->tab); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +update_sensitivity (GeditNotebookPopupMenu *menu) +{ + GeditTabState state; + GeditMultiNotebook *mnb; + GtkNotebook *notebook; + gint page_num; + gint n_pages; + guint n_tabs; + GAction *action; + + state = gedit_tab_get_state (menu->tab); + + mnb = GEDIT_MULTI_NOTEBOOK (_gedit_window_get_multi_notebook (menu->window)); + + notebook = GTK_NOTEBOOK (gedit_multi_notebook_get_notebook_for_tab (mnb, menu->tab)); + n_pages = gtk_notebook_get_n_pages (notebook); + n_tabs = gedit_multi_notebook_get_n_tabs(mnb); + page_num = gtk_notebook_page_num (notebook, GTK_WIDGET (menu->tab)); + + action = g_action_map_lookup_action (G_ACTION_MAP (menu->action_group), + "close"); + g_simple_action_set_enabled (G_SIMPLE_ACTION (action), + (state != GEDIT_TAB_STATE_CLOSING) && + (state != GEDIT_TAB_STATE_SAVING) && + (state != GEDIT_TAB_STATE_SHOWING_PRINT_PREVIEW) && + (state != GEDIT_TAB_STATE_PRINTING) && + (state != GEDIT_TAB_STATE_SAVING_ERROR)); + + action = g_action_map_lookup_action (G_ACTION_MAP (menu->action_group), + "move-to-new-window"); + g_simple_action_set_enabled (G_SIMPLE_ACTION (action), n_tabs > 1); + + action = g_action_map_lookup_action (G_ACTION_MAP (menu->action_group), + "move-to-new-tab-group"); + g_simple_action_set_enabled (G_SIMPLE_ACTION (action), n_pages > 1); + + action = g_action_map_lookup_action (G_ACTION_MAP (menu->action_group), + "move-left"); + g_simple_action_set_enabled (G_SIMPLE_ACTION (action), page_num > 0); + + action = g_action_map_lookup_action (G_ACTION_MAP (menu->action_group), + "move-right"); + g_simple_action_set_enabled (G_SIMPLE_ACTION (action), page_num < n_pages - 1); +} + +static void +gedit_notebook_popup_menu_constructed (GObject *object) +{ + GeditNotebookPopupMenu *menu = GEDIT_NOTEBOOK_POPUP_MENU (object); + + update_sensitivity (menu); + + G_OBJECT_CLASS (gedit_notebook_popup_menu_parent_class)->constructed (object); +} + +static void +gedit_notebook_popup_menu_class_init (GeditNotebookPopupMenuClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->get_property = gedit_notebook_popup_menu_get_property; + object_class->set_property = gedit_notebook_popup_menu_set_property; + object_class->constructed = gedit_notebook_popup_menu_constructed; + + properties[PROP_WINDOW] = + g_param_spec_object ("window", + "Window", + "The GeditWindow", + GEDIT_TYPE_WINDOW, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS); + + properties[PROP_TAB] = + g_param_spec_object ("tab", + "Tab", + "The GeditTab", + GEDIT_TYPE_TAB, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS); + + g_object_class_install_properties (object_class, LAST_PROP, properties); +} + +static void +on_move_left_activate (GSimpleAction *action, + GVariant *parameter, + gpointer user_data) +{ + GeditNotebookPopupMenu *menu = GEDIT_NOTEBOOK_POPUP_MENU (user_data); + GeditMultiNotebook *mnb; + GtkNotebook *notebook; + gint page_num; + + mnb = GEDIT_MULTI_NOTEBOOK (_gedit_window_get_multi_notebook (menu->window)); + + notebook = GTK_NOTEBOOK (gedit_multi_notebook_get_notebook_for_tab (mnb, menu->tab)); + page_num = gtk_notebook_page_num (notebook, GTK_WIDGET (menu->tab)); + + if (page_num > 0) + { + gtk_notebook_reorder_child (notebook, + GTK_WIDGET (menu->tab), + page_num - 1); + } +} + +static void +on_move_right_activate (GSimpleAction *action, + GVariant *parameter, + gpointer user_data) +{ + GeditNotebookPopupMenu *menu = GEDIT_NOTEBOOK_POPUP_MENU (user_data); + GeditMultiNotebook *mnb; + GtkNotebook *notebook; + gint page_num; + gint n_pages; + + mnb = GEDIT_MULTI_NOTEBOOK (_gedit_window_get_multi_notebook (menu->window)); + + notebook = GTK_NOTEBOOK (gedit_multi_notebook_get_notebook_for_tab (mnb, menu->tab)); + n_pages = gtk_notebook_get_n_pages (notebook); + page_num = gtk_notebook_page_num (notebook, GTK_WIDGET (menu->tab)); + + if (page_num < (n_pages - 1)) + { + gtk_notebook_reorder_child (notebook, + GTK_WIDGET (menu->tab), + page_num + 1); + } +} + +static void +on_move_to_new_window_activate (GSimpleAction *action, + GVariant *parameter, + gpointer user_data) +{ + GeditNotebookPopupMenu *menu = GEDIT_NOTEBOOK_POPUP_MENU (user_data); + + _gedit_window_move_tab_to_new_window (menu->window, menu->tab); +} + +static void +on_move_to_new_tab_group_activate (GSimpleAction *action, + GVariant *parameter, + gpointer user_data) +{ + GeditNotebookPopupMenu *menu = GEDIT_NOTEBOOK_POPUP_MENU (user_data); + + _gedit_window_move_tab_to_new_tab_group (menu->window, menu->tab); +} + +static void +on_close_activate (GSimpleAction *action, + GVariant *parameter, + gpointer user_data) +{ + GeditNotebookPopupMenu *menu = GEDIT_NOTEBOOK_POPUP_MENU (user_data); + + _gedit_cmd_file_close_tab (menu->tab, menu->window); +} + +static GActionEntry action_entries[] = { + { "move-left", on_move_left_activate }, + { "move-right", on_move_right_activate }, + { "move-to-new-window", on_move_to_new_window_activate }, + { "move-to-new-tab-group", on_move_to_new_tab_group_activate }, + { "close", on_close_activate } +}; + +static void +gedit_notebook_popup_menu_init (GeditNotebookPopupMenu *menu) +{ + gtk_menu_shell_bind_model (GTK_MENU_SHELL (menu), + _gedit_app_get_notebook_menu (GEDIT_APP (g_application_get_default ())), + "popup", + TRUE); + + menu->action_group = g_simple_action_group_new (); + g_action_map_add_action_entries (G_ACTION_MAP (menu->action_group), + action_entries, + G_N_ELEMENTS (action_entries), + menu); + + gtk_widget_insert_action_group (GTK_WIDGET (menu), + "popup", + G_ACTION_GROUP (menu->action_group)); +} + +GtkWidget * +gedit_notebook_popup_menu_new (GeditWindow *window, + GeditTab *tab) +{ + return g_object_new (GEDIT_TYPE_NOTEBOOK_POPUP_MENU, + "window", window, + "tab", tab, + NULL); +} + +/* ex:set ts=8 noet: */ -- cgit v1.2.3