1 #include "../Common/Common.h"
5 #include "DasherTypes.h"
6 #include "GtkDasherControl.h"
8 #include <glib/gi18n.h>
10 #include <libgnomeui/libgnomeui.h>
11 #include <libgnome/libgnome.h>
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
);
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
));
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
);
55 gtk_file_chooser_set_local_only(GTK_FILE_CHOOSER(filesel
), FALSE
);
58 if(gtk_dialog_run(GTK_DIALOG(filesel
)) == GTK_RESPONSE_ACCEPT
) {
60 char *filename
= gtk_file_chooser_get_uri(GTK_FILE_CHOOSER(filesel
));
62 char *filename
= gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(filesel
));
64 dasher_editor_open(g_pEditor
, filename
);
67 gtk_widget_destroy(filesel
);
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
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
));
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
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
);
111 gtk_file_chooser_set_local_only(GTK_FILE_CHOOSER(filesel
), FALSE
);
114 if(gtk_dialog_run(GTK_DIALOG(filesel
)) == GTK_RESPONSE_ACCEPT
) {
116 char *filename
= gtk_file_chooser_get_uri(GTK_FILE_CHOOSER(filesel
));
118 char *filename
= gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(filesel
));
120 dasher_editor_save_as(g_pEditor
, filename
,FALSE
);
123 gtk_widget_destroy(filesel
);
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?
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
);
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
));
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
);
169 gtk_file_chooser_set_local_only(GTK_FILE_CHOOSER(filesel
), FALSE
);
172 if(gtk_dialog_run(GTK_DIALOG(filesel
)) == GTK_RESPONSE_ACCEPT
) {
174 char *filename
= gtk_file_chooser_get_uri(GTK_FILE_CHOOSER(filesel
));
176 char *filename
= gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(filesel
));
178 // dasher_editor_save_as(g_pEditor, filename,TRUE);// FIXME - REIMPLEMENT
181 gtk_widget_destroy(filesel
);
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
));
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
);
212 gtk_file_chooser_set_local_only(GTK_FILE_CHOOSER(filesel
), FALSE
);
215 if(gtk_dialog_run(GTK_DIALOG(filesel
)) == GTK_RESPONSE_ACCEPT
) {
217 char *filename
= gtk_file_chooser_get_uri(GTK_FILE_CHOOSER(filesel
));
219 char *filename
= gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(filesel
));
222 gtk_dasher_control_train(GTK_DASHER_CONTROL(pDasherWidget
), filename
);
227 gtk_widget_destroy(filesel
);
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
));
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
);
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
));
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) {
279 select_save_file_as(NULL
, NULL
);
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
305 case GTK_RESPONSE_CANCEL
:
306 gtk_widget_destroy(GTK_WIDGET(dialog
));
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
);
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
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
);
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
);
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
[] = {
410 // Yeah, should really do some Gnome documentation for it...
411 const gchar
*documenters
[] = {
418 #if GTK_CHECK_VERSION(2,6,0)
419 gtk_show_about_dialog(GTK_WINDOW(window
),
421 "comments", _("Dasher is a predictive text entry application"),
422 "copyright", "Copyright \xC2\xA9 1998-2006 The Dasher Project",
423 "documenters", documenters
,
425 "logo-icon-name", "dasher",
426 "translator-credits", _("translator-credits"),
428 "website", "http://www.dasher.org.uk/",
429 "wrap-license", true,
432 gchar
*translator_credits
= _("translator-credits");
434 GtkWidget
*about
= gnome_about_new (_("Dasher"),
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
,
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
);
450 // EAT UGLY ABOUT BOX, PHILISTINE
451 GtkWidget
*label
, *button
;
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
);
481 // TODO: Need to hide menu item if GNOME_LIBS not defined
482 extern "C" void show_help(GtkWidget
*widget
, gpointer user_data
) {
484 gnome_help_display_desktop(NULL
, "dasher", "dasher", NULL
, NULL
);