1 /* PSPPIRE - a graphical user interface for PSPP.
2 Copyright (C) 2016 Free Software Foundation
4 This program is free software: you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation, either version 3 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program. If not, see <http://www.gnu.org/licenses/>. */
19 #include "windows-menu.h"
20 #include "psppire-window-register.h"
21 #include "psppire-data-window.h"
24 #define _(msgid) gettext (msgid)
25 #define N_(msgid) msgid
28 minimise (gpointer key, gpointer value, gpointer user_data)
30 PsppireWindow *pw = PSPPIRE_WINDOW (value);
31 gtk_window_iconify (GTK_WINDOW (pw));
35 min_all (GtkWidget *widget, gpointer ud)
37 PsppireWindowRegister *reg = psppire_window_register_new ();
39 psppire_window_register_foreach (reg, minimise, NULL);
43 reset_check_state (GtkWidget *widget, gpointer ud)
45 /* Prevent the state from actually changing */
46 g_signal_handlers_block_by_func (widget, reset_check_state, ud);
47 gboolean state = gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (widget));
48 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (widget), !state);
49 g_signal_handlers_unblock_by_func (widget, reset_check_state, ud);
53 raise_window (GtkWidget *widget, GdkEvent *ev, gpointer ud)
55 GtkWindow *win = GTK_WINDOW (ud);
56 gtk_window_present_with_time (win, ((GdkEventButton *)ev)->time);
63 add_menuitem (gpointer key, gpointer value, gpointer user_data)
65 GtkMenu *menu = GTK_MENU (user_data);
66 PsppireWindow *pw = PSPPIRE_WINDOW (value);
68 GtkWidget *mi = gtk_check_menu_item_new_with_label (key);
70 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (mi),
71 pw == g_object_get_data (G_OBJECT (menu), "toplevel"));
73 g_signal_connect (mi, "toggled", G_CALLBACK (reset_check_state), pw);
75 g_signal_connect (mi, "button-press-event", G_CALLBACK (raise_window), pw);
78 gtk_container_add (GTK_CONTAINER(menu), mi);
82 toggle_split_window (PsppireDataWindow *de, GtkCheckMenuItem *ta)
84 psppire_data_editor_split_window (de->data_editor,
85 gtk_check_menu_item_get_active (ta));
91 repopulate_windows_menu (GObject *inst, gchar *name, gpointer data)
93 PsppireWindowRegister *reg = psppire_window_register_new ();
94 GtkMenuItem *mi = GTK_MENU_ITEM (data);
96 GtkWidget *menu = gtk_menu_new ();
98 GtkWindow *toplevel = g_object_get_data (G_OBJECT (mi), "toplevel");
100 GtkWidget *minimize = gtk_menu_item_new_with_mnemonic (_("_Minimize all Windows"));
101 GtkWidget *split = gtk_check_menu_item_new_with_mnemonic (_("_Split"));
104 GtkWidget *sep = gtk_separator_menu_item_new ();
106 gtk_menu_attach (GTK_MENU (menu), minimize, 0, 1, 0, 1);
108 if (PSPPIRE_DATA_WINDOW_TYPE == G_OBJECT_TYPE (toplevel) )
110 gtk_menu_attach (GTK_MENU (menu), split, 0, 1, 1, 2);
111 g_signal_connect_swapped (split, "toggled",
112 G_CALLBACK (toggle_split_window), toplevel);
115 gtk_container_add (GTK_CONTAINER (menu), sep);
117 gtk_menu_item_set_submenu (GTK_MENU_ITEM (mi), menu);
119 g_object_set_data (G_OBJECT (menu), "toplevel", toplevel);
121 g_hash_table_foreach (reg->name_table, add_menuitem, menu);
123 g_signal_connect (minimize, "activate", G_CALLBACK (min_all), NULL);
125 gtk_widget_show_all (GTK_WIDGET (mi));
129 on_destroy (GtkWindow *w, gpointer data)
131 PsppireWindowRegister *reg = psppire_window_register_new ();
133 g_signal_handlers_disconnect_by_func (reg, repopulate_windows_menu, w);
137 create_windows_menu (GtkWindow *toplevel)
139 PsppireWindowRegister *reg = psppire_window_register_new ();
141 GtkWidget *menuitem = gtk_menu_item_new_with_mnemonic (_("_Windows"));
143 g_object_set_data (G_OBJECT (menuitem), "toplevel", toplevel);
145 g_signal_connect (reg, "removed", G_CALLBACK (repopulate_windows_menu), menuitem);
146 g_signal_connect (reg, "inserted", G_CALLBACK (repopulate_windows_menu), menuitem);
148 g_signal_connect (menuitem, "destroy", G_CALLBACK (on_destroy), NULL);