Sorry - big commit since I've been holding off until it worked again Fixed
[dasher.git] / Src / Gtk2 / Menu.cc
blobe8ea03504e75ca2b7a1c347a021e61518f0a2685
1 #include "../Common/Common.h"
3 #include "Menu.h"
4 #include "dasher.h"
5 #include "DasherTypes.h"
6 #include "GtkDasherControl.h"
8 #include <glib/gi18n.h>
9 #ifdef GNOME_LIBS
10 #include <libgnomeui/libgnomeui.h>
11 #include <libgnome/libgnome.h>
12 #endif
14 #include <iostream>
16 extern GladeXML *widgets;
18 extern GtkWidget *open_filesel;
19 extern GtkWidget *save_filesel;
20 extern GtkWidget *save_and_quit_filesel;
21 extern GtkWidget *import_filesel;
22 extern GtkWidget *append_filesel;
23 extern GtkWidget *window;
24 extern GtkWidget *file_selector;
26 extern "C" void select_save_file_as(GtkWidget * widget, gpointer user_data);
28 // 'File' Menu
30 #if GTK_CHECK_VERSION(2,3,0)
32 extern "C" void select_new_file(GtkWidget *widget, gpointer user_data) {
33 //FIXME - confirm this. We should check whether the user wants to lose their work.
35 // TODO: Should just call a 'new' method in DasherEditor
36 dasher_editor_generate_filename(g_pEditor);
37 dasher_editor_clear(g_pEditor, false);
39 // gtk_dasher_control_set_context(GTK_DASHER_CONTROL(pDasherWidget), "");
40 gtk_dasher_control_invalidate_context(GTK_DASHER_CONTROL(pDasherWidget), true);
42 // Starting a new file indicates a new user trial in detailed logging
43 gtk_dasher_user_log_new_trial(GTK_DASHER_CONTROL(pDasherWidget));
47 #endif
49 #if GTK_CHECK_VERSION(2,3,0)
51 extern "C" void select_open_file(GtkWidget *widget, gpointer user_data) {
52 GtkWidget *filesel = gtk_file_chooser_dialog_new(_("Select File"), GTK_WINDOW(window), GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL);
54 #ifdef GNOME_LIBS
55 gtk_file_chooser_set_local_only(GTK_FILE_CHOOSER(filesel), FALSE);
56 #endif
58 if(gtk_dialog_run(GTK_DIALOG(filesel)) == GTK_RESPONSE_ACCEPT) {
59 #ifdef GNOME_LIBS
60 char *filename = gtk_file_chooser_get_uri(GTK_FILE_CHOOSER(filesel));
61 #else
62 char *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(filesel));
63 #endif
64 dasher_editor_open(g_pEditor, filename);
65 g_free(filename);
67 gtk_widget_destroy(filesel);
70 #else
72 extern "C" void filesel_hide(GtkWidget *widget, gpointer user_data) {
73 // FIXME - uh. Yes. This works, but is it in any way guaranteed to?
74 // Of course, if glade let us set user_data stuff properly, this would
75 // be a lot easier
76 gtk_widget_hide(gtk_widget_get_parent(gtk_widget_get_parent(gtk_widget_get_parent(widget))));
79 extern "C" void open_file_from_filesel(GtkWidget *selector2, GtkFileSelection *selector) {
80 filename = gtk_file_selection_get_filename(GTK_FILE_SELECTION(selector));
81 filesel_hide(GTK_WIDGET(selector->ok_button), NULL);
82 dasher_editor_open(g_pEditor, filename);
85 extern "C" void select_open_file(GtkWidget *widget, gpointer user_data) {
86 if(open_filesel == NULL) {
87 open_filesel = glade_xml_get_widget(widgets, "open_fileselector");
88 g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(open_filesel)->ok_button), "clicked", G_CALLBACK(open_file_from_filesel), (gpointer) open_filesel);
90 gtk_window_set_transient_for(GTK_WINDOW(open_filesel), GTK_WINDOW(window));
91 gtk_window_present(GTK_WINDOW(open_filesel));
94 #endif
96 extern "C" void save_file(GtkWidget *widget, gpointer user_data) {
97 if(filename != NULL) {
98 dasher_editor_save_as(g_pEditor, filename,FALSE); // FIXME - REIMPLEMENT
100 else {
101 select_save_file_as(NULL, NULL);
105 #if GTK_CHECK_VERSION(2,3,0)
107 extern "C" void select_save_file_as(GtkWidget *widget, gpointer user_data) {
108 GtkWidget *filesel = gtk_file_chooser_dialog_new(_("Select File"), GTK_WINDOW(window), GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL);
110 #ifdef GNOME_LIBS
111 gtk_file_chooser_set_local_only(GTK_FILE_CHOOSER(filesel), FALSE);
112 #endif
114 if(gtk_dialog_run(GTK_DIALOG(filesel)) == GTK_RESPONSE_ACCEPT) {
115 #ifdef GNOME_LIBS
116 char *filename = gtk_file_chooser_get_uri(GTK_FILE_CHOOSER(filesel));
117 #else
118 char *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(filesel));
119 #endif
120 dasher_editor_save_as(g_pEditor, filename,FALSE);
121 g_free(filename);
123 gtk_widget_destroy(filesel);
126 #else
128 extern "C" void save_file_from_filesel_and_quit(GtkWidget *selector2, GtkFileSelection *selector) {
129 filename = gtk_file_selection_get_filename(GTK_FILE_SELECTION(selector));
130 if(dasher_editor_save_as(g_pEditor, filename, FALSE) == false) {
132 // FIXME - do we really just want to fail silently if the save operation fails?
134 return;
136 else {
137 exiting = TRUE;
138 gtk_main_quit();
140 return;
143 extern "C" void save_file_from_filesel(GtkWidget *selector2, GtkFileSelection *selector) {
144 filename = gtk_file_selection_get_filename(GTK_FILE_SELECTION(selector));
145 filesel_hide(GTK_WIDGET(selector->ok_button), NULL);
146 dasher_editor_save_as(g_pEditor, filename, FALSE);
149 extern "C" void select_save_file_as(GtkWidget *widget, gpointer user_data) {
150 if(save_filesel == NULL) {
151 save_filesel = glade_xml_get_widget(widgets, "save_fileselector");
152 g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(save_filesel)->ok_button), "clicked", G_CALLBACK(save_file_from_filesel), (gpointer) save_filesel);
155 if(filename != NULL)
156 gtk_file_selection_set_filename(GTK_FILE_SELECTION(save_filesel), filename);
157 gtk_window_set_transient_for(GTK_WINDOW(save_filesel), GTK_WINDOW(window));
158 gtk_window_present(GTK_WINDOW(save_filesel));
161 #endif
163 #if GTK_CHECK_VERSION(2,3,0)
165 extern "C" void select_append_file(GtkWidget *widget, gpointer user_data) {
166 GtkWidget *filesel = gtk_file_chooser_dialog_new(_("Select File"), GTK_WINDOW(window), GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL);
168 #ifdef GNOME_LIBS
169 gtk_file_chooser_set_local_only(GTK_FILE_CHOOSER(filesel), FALSE);
170 #endif
172 if(gtk_dialog_run(GTK_DIALOG(filesel)) == GTK_RESPONSE_ACCEPT) {
173 #ifdef GNOME_LIBS
174 char *filename = gtk_file_chooser_get_uri(GTK_FILE_CHOOSER(filesel));
175 #else
176 char *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(filesel));
177 #endif
178 // dasher_editor_save_as(g_pEditor, filename,TRUE);// FIXME - REIMPLEMENT
179 g_free(filename);
181 gtk_widget_destroy(filesel);
184 #else
186 extern "C" void append_file_from_filesel(GtkWidget *selector2, GtkFileSelection *selector) {
187 filename = gtk_file_selection_get_filename(GTK_FILE_SELECTION(selector));
189 dasher_editor_save_as(g_pEditor, filename, TRUE);
191 filesel_hide(GTK_WIDGET(selector->ok_button), NULL);
194 extern "C" void select_append_file(GtkWidget *widget, gpointer user_data) {
195 if(append_filesel == NULL) {
196 append_filesel = glade_xml_get_widget(widgets, "append_fileselector");
197 g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(append_filesel)->ok_button), "clicked", G_CALLBACK(append_file_from_filesel), (gpointer) append_filesel);
200 gtk_window_set_transient_for(GTK_WINDOW(append_filesel), GTK_WINDOW(window));
201 gtk_window_present(GTK_WINDOW(append_filesel));
204 #endif
206 #if GTK_CHECK_VERSION(2,3,0)
208 extern "C" void select_import_file(GtkWidget *widget, gpointer user_data) {
209 GtkWidget *filesel = gtk_file_chooser_dialog_new(_("Select File"), GTK_WINDOW(window), GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL);
211 #ifdef GNOME_LIBS
212 gtk_file_chooser_set_local_only(GTK_FILE_CHOOSER(filesel), FALSE);
213 #endif
215 if(gtk_dialog_run(GTK_DIALOG(filesel)) == GTK_RESPONSE_ACCEPT) {
216 #ifdef GNOME_LIBS
217 char *filename = gtk_file_chooser_get_uri(GTK_FILE_CHOOSER(filesel));
218 #else
219 char *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(filesel));
220 #endif
222 gtk_dasher_control_train(GTK_DASHER_CONTROL(pDasherWidget), filename);
224 g_free(filename);
227 gtk_widget_destroy(filesel);
230 #else
232 extern "C" void import_file_from_filesel(GtkWidget *selector2, GtkFileSelection *selector) {
233 filename = gtk_file_selection_get_filename(GTK_FILE_SELECTION(selector));
234 gtk_dasher_control_train(GTK_DASHER_CONTROL(pDasherWidget), filename);
235 filesel_hide(GTK_WIDGET(selector->ok_button), NULL);
238 extern "C" void select_import_file(GtkWidget *widget, gpointer user_data) {
239 if(import_filesel == NULL) {
240 import_filesel = glade_xml_get_widget(widgets, "import_fileselector");
242 g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(import_filesel)->ok_button), "clicked", G_CALLBACK(import_file_from_filesel), (gpointer) import_filesel);
245 gtk_window_set_transient_for(GTK_WINDOW(import_filesel), GTK_WINDOW(window));
246 gtk_window_present(GTK_WINDOW(import_filesel));
249 #endif
251 #if !GTK_CHECK_VERSION(2,3,0)
253 // FIXME - I believe that this doesn't ever get called
255 extern "C" void select_save_file_as_and_quit(GtkWidget *widget, gpointer user_data) {
256 if(save_and_quit_filesel == NULL) {
257 save_and_quit_filesel = glade_xml_get_widget(widgets, "save_and_quit_fileselector");
258 g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(save_and_quit_filesel)->ok_button), "clicked", G_CALLBACK(save_file_from_filesel_and_quit), (gpointer) save_and_quit_filesel);
261 if(filename != NULL)
262 gtk_file_selection_set_filename(GTK_FILE_SELECTION(save_and_quit_filesel), filename);
263 gtk_window_set_transient_for(GTK_WINDOW(save_and_quit_filesel), GTK_WINDOW(window));
264 gtk_window_present(GTK_WINDOW(save_and_quit_filesel));
267 #endif
269 extern "C" void save_file_and_quit(GtkWidget *widget, gpointer user_data) {
270 if(filename != NULL) {
271 if (dasher_editor_save_as(g_pEditor, filename,FALSE)==true) {
272 // exiting=TRUE;
273 gtk_main_quit();
274 } else {
275 return;
278 else {
279 select_save_file_as(NULL, NULL);
280 gtk_main_quit();
284 extern "C" bool ask_save_before_exit(GtkWidget *widget, gpointer data) {
285 GtkWidget *dialog = NULL;
287 dasher_main_save_state(g_pDasherMain);
289 if(file_modified != FALSE) {
290 // Ask whether to save the modified file, insert filename if it exists.
291 if(filename != NULL) {
292 dialog = gtk_message_dialog_new(GTK_WINDOW(window), GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE, _("Do you want to save your changes to %s?\n\nYour changes will be lost if you don't save them."), filename);
294 else if(filename == NULL) {
295 dialog = gtk_message_dialog_new(GTK_WINDOW(window), GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE, _("Do you want to save your changes?\n\nYour changes will be lost if you don't save them."));
298 gtk_dialog_add_buttons(GTK_DIALOG(dialog), _("Don't save"), GTK_RESPONSE_REJECT, _("Don't quit"), GTK_RESPONSE_CANCEL, _("Save and quit"), GTK_RESPONSE_ACCEPT, NULL);
300 switch (gtk_dialog_run(GTK_DIALOG(dialog))) {
301 case GTK_RESPONSE_REJECT:
302 // write_to_file(); // FIXME - REIMPLEMENT
303 gtk_main_quit();
304 break;
305 case GTK_RESPONSE_CANCEL:
306 gtk_widget_destroy(GTK_WIDGET(dialog));
307 return true;
308 break;
309 case GTK_RESPONSE_ACCEPT:
310 gtk_widget_destroy(GTK_WIDGET(dialog));
311 // write_to_file(); // FIXME - REIMPLEMENT
312 save_file_and_quit(NULL, NULL);
315 else {
316 // It should be noted that write_to_file merely saves the new text to the training
317 // file rather than saving it to a file of the user's choice
319 // FIXME - REIMPLEMENT
321 // write_to_file();
323 g_message("Foo");
325 gtk_main_quit();
327 g_message("Bar");
329 return true;
332 // 'Edit' menu
334 extern "C" void clipboard_cut(void) {
335 dasher_editor_clipboard(g_pEditor, CLIPBOARD_CUT); // FIXME - give this a better name
338 extern "C" void clipboard_copy(void) {
339 dasher_editor_clipboard(g_pEditor, CLIPBOARD_COPY);
342 extern "C" void clipboard_paste(void) {
343 dasher_editor_clipboard(g_pEditor, CLIPBOARD_PASTE);
346 extern "C" void clipboard_copy_all(void) {
347 dasher_editor_clipboard(g_pEditor, CLIPBOARD_COPYALL);
350 extern "C" void on_menututorial_activate() {
351 dasher_editor_start_tutorial(g_pEditor);
354 // Not actually on the menu, but should be?
356 extern "C" void clipboard_select_all(void) {
357 dasher_editor_clipboard(g_pEditor, CLIPBOARD_SELECTALL);
360 // 'Options' Menu
362 // 'Preferences' item is in Preferences.cpp
364 // Font selector options will be in their own file
366 extern "C" void set_dasher_fontsize(GtkWidget *widget, gpointer user_data) {
367 if(GTK_TOGGLE_BUTTON(widget)->active == TRUE) {
368 if(!strcmp(gtk_widget_get_name(GTK_WIDGET(widget)), "fontsizenormal")) {
369 gtk_dasher_control_set_parameter_long(GTK_DASHER_CONTROL(pDasherWidget), LP_DASHER_FONTSIZE, Dasher::Opts::Normal);
371 else if(!strcmp(gtk_widget_get_name(GTK_WIDGET(widget)), "fontsizelarge")) {
372 gtk_dasher_control_set_parameter_long(GTK_DASHER_CONTROL(pDasherWidget), LP_DASHER_FONTSIZE, Dasher::Opts::Big);
374 else if(!strcmp(gtk_widget_get_name(GTK_WIDGET(widget)), "fontsizevlarge")) {
375 gtk_dasher_control_set_parameter_long(GTK_DASHER_CONTROL(pDasherWidget), LP_DASHER_FONTSIZE, Dasher::Opts::VBig);
380 extern "C" void reset_fonts(GtkWidget *widget, gpointer user_data) {
381 dasher_app_settings_reset(g_pDasherAppSettings, SP_DASHER_FONT);
382 dasher_app_settings_reset(g_pDasherAppSettings, APP_SP_EDIT_FONT);
385 // 'Help' Menu
387 extern "C" void about_dasher(GtkWidget *widget, gpointer user_data) {
389 #if (defined GNOME_LIBS) || (GTK_CHECK_VERSION(2,6,0))
391 // In alphabetical order
392 const gchar *authors[] = {
393 "Chris Ball",
394 "Phil Cowans",
395 "Frederik Eaton",
396 "Behdad Esfahbod",
397 "Matthew Garrett",
398 "Chris Hack",
399 "David MacKay",
400 "Iain Murray",
401 "Takashi Kaburagi",
402 "Keith Vertanen",
403 "Hanna Wallach",
404 "David Ward",
405 "Brian Williams",
406 "Seb Wills",
407 NULL
410 // Yeah, should really do some Gnome documentation for it...
411 const gchar *documenters[] = {
412 "Chris Ball",
413 "Matthew Garrett",
414 "David MacKay",
415 NULL
418 #if GTK_CHECK_VERSION(2,6,0)
419 gtk_show_about_dialog(GTK_WINDOW(window),
420 "authors", authors,
421 "comments", _("Dasher is a predictive text entry application"),
422 "copyright", "Copyright \xC2\xA9 1998-2006 The Dasher Project",
423 "documenters", documenters,
424 "license", "GPL 2+",
425 "logo-icon-name", "dasher",
426 "translator-credits", _("translator-credits"),
427 "version", VERSION,
428 "website", "http://www.dasher.org.uk/",
429 "wrap-license", true,
430 NULL);
431 #else
432 gchar *translator_credits = _("translator-credits");
434 GtkWidget *about = gnome_about_new (_("Dasher"),
435 PACKAGE_VERSION,
436 "Copyright The Dasher Project\n",
437 _("Dasher is a predictive text entry application"),
438 (const char **)authors,
439 (const char **)documenters,
440 strcmp (translator_credits, "translator-credits") != 0 ? (const char *)translator_credits : NULL,
441 NULL);
443 gtk_window_set_transient_for (GTK_WINDOW(about), GTK_WINDOW (window));
444 // g_signal_connect (G_OBJECT (about), "destory", G_CALLBACK (gtk_widget_destroyed), &about);
445 gtk_widget_show(about);
447 #endif
449 #else
450 // EAT UGLY ABOUT BOX, PHILISTINE
451 GtkWidget *label, *button;
452 char *tmp;
454 GtkWidget *about = gtk_dialog_new();
456 gtk_dialog_set_has_separator(GTK_DIALOG(about), FALSE);
457 gtk_window_set_title(GTK_WINDOW(about), "About Dasher");
459 tmp = g_strdup_printf("Dasher Version %s ", VERSION);
460 label = gtk_label_new(tmp);
461 gtk_widget_show(label);
462 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(about)->vbox), label, FALSE, FALSE, 0);
464 label = gtk_label_new("http://www.dasher.org.uk/");
465 gtk_widget_show(label);
466 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(about)->vbox), label, FALSE, FALSE, 0);
468 label = gtk_label_new("Copyright The Dasher Project");
469 gtk_widget_show(label);
470 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(about)->vbox), label, TRUE, TRUE, 0);
472 button = gtk_button_new_from_stock(GTK_STOCK_OK);
473 gtk_widget_show(button);
474 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(about)->vbox), button, FALSE, FALSE, 0);
475 g_signal_connect_swapped(G_OBJECT(button), "clicked", G_CALLBACK(gtk_widget_destroy), G_OBJECT(about));
477 gtk_widget_show(about);
478 #endif
481 // TODO: Need to hide menu item if GNOME_LIBS not defined
482 extern "C" void show_help(GtkWidget *widget, gpointer user_data) {
483 #ifdef GNOME_LIBS
484 gnome_help_display_desktop(NULL, "dasher", "dasher", NULL, NULL);
485 #endif