/*
* 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: */