d7c543a40e70d7944cc6f381491eb6959d4b06a1
[pspp-builds.git] / src / ui / gui / window-manager.c
1 #include <glib.h>
2 #include "syntax-editor.h"
3 #include "data-editor.h"
4
5 #include <gettext.h>
6 #define _(msgid) gettext (msgid)
7 #define N_(msgid) msgid
8
9
10 #include "window-manager.h"
11
12
13
14 /* A list of struct editor_windows */
15 static GSList *window_list = NULL;
16
17
18 static void
19 deregister_window (GtkWindow *w, gpointer data)
20 {
21   struct editor_window *e = data;
22
23   window_list = g_slist_remove (window_list, e);
24
25   if ( g_slist_length (window_list) == 0 )
26     gtk_main_quit ();
27 };
28
29
30 static void
31 register_window (struct editor_window *e)
32 {
33   window_list = g_slist_prepend (window_list, e);
34 }
35
36
37 static gint
38 next_window_id (void)
39 {
40   return g_slist_length (window_list);
41 }
42
43 void
44 minimise_all_windows (void)
45 {
46   const GSList *i = NULL;
47
48   for (i = window_list; i != NULL ; i = i->next)
49     {
50       struct editor_window *e = i->data;
51       gtk_window_iconify (e->window);
52     }
53 }
54
55 static void set_window_name (struct editor_window *e, const gchar *name );
56
57
58 struct editor_window *
59 window_create (enum window_type type, const gchar *name)
60 {
61   struct editor_window *e;
62   switch (type)
63     {
64     case WINDOW_SYNTAX:
65       e = (struct editor_window *) new_syntax_editor ();
66       break;
67     case WINDOW_DATA:
68       e = (struct editor_window *) new_data_editor ();
69       break;
70     default:
71       g_assert_not_reached ();
72     };
73
74   e->type = type;
75   e->name = NULL;
76
77   set_window_name (e, name);
78
79
80   gtk_window_set_icon_from_file (GTK_WINDOW (e->window),
81                                  PKGDATADIR "/psppicon.png", 0);
82
83   g_signal_connect (e->window, "destroy",
84                     G_CALLBACK (deregister_window), e);
85
86   register_window (e);
87
88   gtk_widget_show (e->window);
89
90   return e;
91 }
92
93
94 static void
95 set_window_name (struct editor_window *e,
96                  const gchar *name )
97 {
98   gchar *title ;
99   g_free (e->name);
100
101
102   if ( name )
103     {
104       e->name = g_strdup (name);
105       return ;
106     }
107
108   switch (e->type )
109     {
110     case WINDOW_SYNTAX:
111       e->name = g_strdup_printf (_("Syntax%d"), next_window_id () );
112       title = g_strdup_printf (_("%s --- PSPP Syntax Editor"), e->name);
113       break;
114     case WINDOW_DATA:
115       e->name = g_strdup_printf (_("Untitled%d"), next_window_id () );
116       title = g_strdup_printf (_("%s --- PSPP Data Editor"), e->name);
117       break;
118     default:
119       g_assert_not_reached ();
120     }
121
122   gtk_window_set_title (GTK_WINDOW (e->window), title);
123
124   g_free (title);
125 }
126
127
128 void
129 window_set_name_from_filename (struct editor_window *e,
130                                const gchar *filename)
131 {
132   gchar *title;
133   gchar *basename = g_path_get_basename (filename);
134
135   set_window_name (e, filename);
136
137   switch (e->type )
138     {
139     case WINDOW_SYNTAX:
140       title = g_strdup_printf (_("%s --- PSPP Syntax Editor"), basename);
141       break;
142     case WINDOW_DATA:
143       title = g_strdup_printf (_("%s --- PSPP Data Editor"), basename);
144       break;
145     default:
146       g_assert_not_reached ();
147     }
148   g_free (basename);
149
150   gtk_window_set_title (GTK_WINDOW (e->window), title);
151
152   g_free (title);
153 }
154
155 const gchar *
156 window_name (const struct editor_window *e)
157 {
158   return e->name;
159 }