37 #include <glib/gi18n.h>
38 #include <gdk/gdkkeysyms.h>
44 #include "dialog-options.h"
46 #include "dialog-reset-warnings.h"
47 #include "dialog-transfer.h"
48 #include "dialog-utils.h"
50 #include "gnc-component-manager.h"
57 #include "gnc-gui-query.h"
58 #include "gnc-hooks.h"
59 #include "gnc-session.h"
64 #include "core-utils/gnc-version.h"
67 #include "option-util.h"
70 #include "gnc-autosave.h"
72 #ifdef MAC_INTEGRATION
73 #include <gtkmacintegration/gtkosxapplication.h>
75 #ifdef HAVE_SYS_STAT_H
76 # include <sys/types.h>
77 # include <sys/stat.h>
90 #define PLUGIN_PAGE_LABEL "plugin-page"
92 #define PLUGIN_PAGE_CLOSE_BUTTON "close-button"
93 #define PLUGIN_PAGE_TAB_LABEL "label"
95 #define GNC_PREF_SHOW_CLOSE_BUTTON "tab-close-buttons"
96 #define GNC_PREF_TAB_NEXT_RECENT "tab-next-recent"
97 #define GNC_PREF_TAB_POSITION_TOP "tab-position-top"
98 #define GNC_PREF_TAB_POSITION_BOTTOM "tab-position-bottom"
99 #define GNC_PREF_TAB_POSITION_LEFT "tab-position-left"
100 #define GNC_PREF_TAB_POSITION_RIGHT "tab-position-right"
101 #define GNC_PREF_TAB_WIDTH "tab-width"
102 #define GNC_PREF_TAB_COLOR "show-account-color-tabs"
103 #define GNC_PREF_SAVE_CLOSE_EXPIRES "save-on-close-expires"
104 #define GNC_PREF_SAVE_CLOSE_WAIT_TIME "save-on-close-wait-time"
106 #define GNC_MAIN_WINDOW_NAME "GncMainWindow"
114 static GObjectClass *parent_class = NULL;
116 static GQuark window_type = 0;
119 static GList *active_windows = NULL;
122 static guint secs_to_save = 0;
123 #define MSG_AUTO_SAVE _("Changes will be saved automatically in %u seconds")
128 static void gnc_main_window_finalize (GObject *
object);
129 static void gnc_main_window_destroy (GtkObject *
object);
131 static void gnc_main_window_setup_window (
GncMainWindow *window);
133 #ifndef MAC_INTEGRATION
134 static void gnc_main_window_update_all_menu_items (
void);
138 static void gnc_main_window_add_widget (GtkUIManager *merge, GtkWidget *widget,
GncMainWindow *window);
139 static void gnc_main_window_switch_page (GtkNotebook *notebook, gpointer *notebook_page, gint pos,
GncMainWindow *window);
140 static void gnc_main_window_page_reordered (GtkNotebook *notebook, GtkWidget *child, guint pos,
GncMainWindow *window);
143 static void gnc_main_window_engine_commit_error_callback( gpointer data,
QofBackendError errcode );
146 static void gnc_main_window_cmd_page_setup (GtkAction *action,
GncMainWindow *window);
147 static void gnc_main_window_cmd_file_properties (GtkAction *action,
GncMainWindow *window);
148 static void gnc_main_window_cmd_file_close (GtkAction *action,
GncMainWindow *window);
149 static void gnc_main_window_cmd_file_quit (GtkAction *action,
GncMainWindow *window);
150 static void gnc_main_window_cmd_edit_cut (GtkAction *action,
GncMainWindow *window);
151 static void gnc_main_window_cmd_edit_copy (GtkAction *action,
GncMainWindow *window);
152 static void gnc_main_window_cmd_edit_paste (GtkAction *action,
GncMainWindow *window);
153 static void gnc_main_window_cmd_edit_preferences (GtkAction *action,
GncMainWindow *window);
154 static void gnc_main_window_cmd_view_refresh (GtkAction *action,
GncMainWindow *window);
155 static void gnc_main_window_cmd_view_toolbar (GtkAction *action,
GncMainWindow *window);
156 static void gnc_main_window_cmd_view_summary (GtkAction *action,
GncMainWindow *window);
157 static void gnc_main_window_cmd_view_statusbar (GtkAction *action,
GncMainWindow *window);
158 static void gnc_main_window_cmd_actions_reset_warnings (GtkAction *action,
GncMainWindow *window);
159 static void gnc_main_window_cmd_actions_rename_page (GtkAction *action,
GncMainWindow *window);
160 static void gnc_main_window_cmd_window_new (GtkAction *action,
GncMainWindow *window);
161 static void gnc_main_window_cmd_window_move_page (GtkAction *action,
GncMainWindow *window);
162 #ifndef MAC_INTEGRATION
163 static void gnc_main_window_cmd_window_raise (GtkAction *action, GtkRadioAction *current,
GncMainWindow *window);
165 static void gnc_main_window_cmd_help_tutorial (GtkAction *action,
GncMainWindow *window);
166 static void gnc_main_window_cmd_help_contents (GtkAction *action,
GncMainWindow *window);
167 static void gnc_main_window_cmd_help_about (GtkAction *action,
GncMainWindow *window);
169 static void do_popup_menu(
GncPluginPage *page, GdkEventButton *event);
170 static gboolean gnc_main_window_popup_menu_cb (GtkWidget *widget,
GncPluginPage *page);
171 static GtkWidget *gnc_main_window_get_statusbar (GncWindow *window_in);
172 static void statusbar_notification_lastmodified(
void);
174 #ifdef MAC_INTEGRATION
175 static void gnc_quartz_shutdown(GtkosxApplication *theApp, gpointer data);
176 static gboolean gnc_quartz_should_quit(GtkosxApplication *theApp,
GncMainWindow *window);
231 #define GNC_MAIN_WINDOW_GET_PRIVATE(o) \
232 (G_TYPE_INSTANCE_GET_PRIVATE ((o), GNC_TYPE_MAIN_WINDOW, GncMainWindowPrivate))
248 static guint main_window_signals[LAST_SIGNAL] = { 0 };
255 static GtkActionEntry gnc_menu_actions [] =
259 {
"FileAction", NULL, N_(
"_File"), NULL, NULL, NULL, },
260 {
"EditAction", NULL, N_(
"_Edit"), NULL, NULL, NULL },
261 {
"ViewAction", NULL, N_(
"_View"), NULL, NULL, NULL },
262 {
"ActionsAction", NULL, N_(
"_Actions"), NULL, NULL, NULL },
263 {
"TransactionAction", NULL, N_(
"Tra_nsaction"), NULL, NULL, NULL },
264 {
"ReportsAction", NULL, N_(
"_Reports"), NULL, NULL, NULL },
265 {
"ToolsAction", NULL, N_(
"_Tools"), NULL, NULL, NULL },
266 {
"ExtensionsAction", NULL, N_(
"E_xtensions"), NULL, NULL, NULL },
267 {
"WindowsAction", NULL, N_(
"_Windows"), NULL, NULL, NULL },
268 {
"HelpAction", NULL, N_(
"_Help"), NULL, NULL, NULL },
272 {
"FileImportAction", NULL, N_(
"_Import"), NULL, NULL, NULL },
273 {
"FileExportAction", NULL, N_(
"_Export"), NULL, NULL, NULL },
275 "FilePrintAction", GTK_STOCK_PRINT, N_(
"_Print..."),
"<control>p",
276 N_(
"Print the currently active page"), NULL
278 #ifndef GTK_STOCK_PAGE_SETUP
279 # define GTK_STOCK_PAGE_SETUP NULL
282 "FilePageSetupAction", GTK_STOCK_PAGE_SETUP, N_(
"Pa_ge Setup..."),
"<control><shift>p",
283 N_(
"Specify the page size and orientation for printing"),
284 G_CALLBACK (gnc_main_window_cmd_page_setup)
287 "FilePropertiesAction", GTK_STOCK_PROPERTIES, N_(
"Proper_ties"),
"<Alt>Return",
288 N_(
"Edit the properties of the current file"),
289 G_CALLBACK (gnc_main_window_cmd_file_properties)
292 "FileCloseAction", GTK_STOCK_CLOSE, N_(
"_Close"), NULL,
293 N_(
"Close the currently active page"),
294 G_CALLBACK (gnc_main_window_cmd_file_close)
297 "FileQuitAction", GTK_STOCK_QUIT, N_(
"_Quit"), NULL,
298 N_(
"Quit this application"),
299 G_CALLBACK (gnc_main_window_cmd_file_quit)
305 "EditCutAction", GTK_STOCK_CUT, N_(
"Cu_t"), NULL,
306 N_(
"Cut the current selection and copy it to clipboard"),
307 G_CALLBACK (gnc_main_window_cmd_edit_cut)
310 "EditCopyAction", GTK_STOCK_COPY, N_(
"_Copy"), NULL,
311 N_(
"Copy the current selection to clipboard"),
312 G_CALLBACK (gnc_main_window_cmd_edit_copy)
315 "EditPasteAction", GTK_STOCK_PASTE, N_(
"_Paste"), NULL,
316 N_(
"Paste the clipboard content at the cursor position"),
317 G_CALLBACK (gnc_main_window_cmd_edit_paste)
320 "EditPreferencesAction", GTK_STOCK_PREFERENCES, N_(
"Pr_eferences"), NULL,
321 N_(
"Edit the global preferences of GnuCash"),
322 G_CALLBACK (gnc_main_window_cmd_edit_preferences)
328 "ViewSortByAction", NULL, N_(
"_Sort By..."), NULL,
329 N_(
"Select sorting criteria for this page view"), NULL
332 "ViewFilterByAction", NULL, N_(
"_Filter By..."), NULL,
333 N_(
"Select the account types that should be displayed."), NULL
336 "ViewRefreshAction", GTK_STOCK_REFRESH, N_(
"_Refresh"),
"<control>r",
337 N_(
"Refresh this window"),
338 G_CALLBACK (gnc_main_window_cmd_view_refresh)
343 {
"ScrubMenuAction", NULL, N_(
"_Check & Repair"), NULL, NULL, NULL },
345 "ActionsForgetWarningsAction", NULL, N_(
"Reset _Warnings..."), NULL,
346 N_(
"Reset the state of all warning messages so they will be shown again."),
347 G_CALLBACK (gnc_main_window_cmd_actions_reset_warnings)
350 "ActionsRenamePageAction", NULL, N_(
"Re_name Page"), NULL,
351 N_(
"Rename this page."),
352 G_CALLBACK (gnc_main_window_cmd_actions_rename_page)
358 "WindowNewAction", NULL, N_(
"_New Window"), NULL,
359 N_(
"Open a new top-level GnuCash window."),
360 G_CALLBACK (gnc_main_window_cmd_window_new)
363 "WindowMovePageAction", NULL, N_(
"New Window with _Page"), NULL,
364 N_(
"Move the current page to a new top-level GnuCash window."),
365 G_CALLBACK (gnc_main_window_cmd_window_move_page)
371 "HelpTutorialAction", GTK_STOCK_HELP, N_(
"Tutorial and Concepts _Guide"), NULL,
372 N_(
"Open the GnuCash Tutorial"),
373 G_CALLBACK (gnc_main_window_cmd_help_tutorial)
376 "HelpContentsAction", GTK_STOCK_HELP, N_(
"_Contents"),
"F1",
377 N_(
"Open the GnuCash Help"),
378 G_CALLBACK (gnc_main_window_cmd_help_contents)
381 "HelpAboutAction", GTK_STOCK_ABOUT, N_(
"_About"), NULL,
383 G_CALLBACK (gnc_main_window_cmd_help_about)
387 static guint gnc_menu_n_actions = G_N_ELEMENTS (gnc_menu_actions);
391 static GtkToggleActionEntry toggle_actions [] =
394 "ViewToolbarAction", NULL, N_(
"_Toolbar"), NULL,
395 N_(
"Show/hide the toolbar on this window"),
396 G_CALLBACK (gnc_main_window_cmd_view_toolbar), TRUE
399 "ViewSummaryAction", NULL, N_(
"Su_mmary Bar"), NULL,
400 N_(
"Show/hide the summary bar on this window"),
401 G_CALLBACK (gnc_main_window_cmd_view_summary), TRUE
404 "ViewStatusbarAction", NULL, N_(
"Stat_us Bar"), NULL,
405 N_(
"Show/hide the status bar on this window"),
406 G_CALLBACK (gnc_main_window_cmd_view_statusbar), TRUE
410 static guint n_toggle_actions = G_N_ELEMENTS (toggle_actions);
412 #ifndef MAC_INTEGRATION
415 static GtkRadioActionEntry radio_entries [] =
417 {
"Window0Action", NULL, N_(
"Window _1"), NULL, NULL, 0 },
418 {
"Window1Action", NULL, N_(
"Window _2"), NULL, NULL, 1 },
419 {
"Window2Action", NULL, N_(
"Window _3"), NULL, NULL, 2 },
420 {
"Window3Action", NULL, N_(
"Window _4"), NULL, NULL, 3 },
421 {
"Window4Action", NULL, N_(
"Window _5"), NULL, NULL, 4 },
422 {
"Window5Action", NULL, N_(
"Window _6"), NULL, NULL, 5 },
423 {
"Window6Action", NULL, N_(
"Window _7"), NULL, NULL, 6 },
424 {
"Window7Action", NULL, N_(
"Window _8"), NULL, NULL, 7 },
425 {
"Window8Action", NULL, N_(
"Window _9"), NULL, NULL, 8 },
426 {
"Window9Action", NULL, N_(
"Window _0"), NULL, NULL, 9 },
430 static guint n_radio_entries = G_N_ELEMENTS (radio_entries);
436 static const gchar *gnc_menu_important_actions[] =
447 static const gchar *always_insensitive_actions[] =
457 static const gchar *initially_insensitive_actions[] =
468 static const gchar *always_hidden_actions[] =
471 "ViewFilterByAction",
478 static const gchar *immutable_page_actions[] =
487 static const gchar *multiple_page_actions[] =
489 "WindowMovePageAction",
497 #define WINDOW_COUNT "WindowCount"
498 #define WINDOW_STRING "Window %d"
499 #define WINDOW_GEOMETRY "WindowGeometry"
500 #define WINDOW_POSITION "WindowPosition"
501 #define WINDOW_MAXIMIZED "WindowMaximized"
502 #define TOOLBAR_VISIBLE "ToolbarVisible"
503 #define STATUSBAR_VISIBLE "StatusbarVisible"
504 #define SUMMARYBAR_VISIBLE "SummarybarVisible"
505 #define WINDOW_FIRSTPAGE "FirstPage"
506 #define WINDOW_PAGECOUNT "PageCount"
507 #define WINDOW_PAGEORDER "PageOrder"
508 #define PAGE_TYPE "PageType"
509 #define PAGE_NAME "PageName"
510 #define PAGE_STRING "Page %d"
515 const gchar *group_name;
525 gnc_main_window_foreach_page (GncMainWindowPageFunc fn, gpointer user_data)
533 for (w = active_windows; w; w = g_list_next(w))
536 priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
564 gchar *page_group, *page_type = NULL, *name = NULL;
565 const gchar *class_type;
566 GError *error = NULL;
568 ENTER(
"window %p, data %p (key file %p, window %d, page start %d, page num %d)",
569 window, data, data->key_file, data->window_num, data->page_offset,
572 priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
573 page_group = g_strdup_printf(PAGE_STRING,
574 data->page_offset + data->page_num);
575 page_type = g_key_file_get_string(data->key_file, page_group,
579 g_warning(
"error reading group %s key %s: %s",
580 page_group, PAGE_TYPE, error->message);
588 class_type = GNC_PLUGIN_PAGE_GET_CLASS(page)->plugin_name;
589 if (strcmp(page_type, class_type) != 0)
591 g_warning(
"error: page types don't match: state %s, existing page %s",
592 page_type, class_type);
600 data->key_file, page_group);
611 name = g_key_file_get_string(data->key_file, page_group,
615 g_warning(
"error reading group %s key %s: %s",
616 page_group, PAGE_NAME, error->message);
621 DEBUG(
"updating page name for %p to %s.", page, name);
651 gint *pos, *geom, *order;
653 gboolean max, visible, desired_visibility;
655 gint page_start, page_count, i;
656 GError *error = NULL;
659 ENTER(
"window %p, data %p (key file %p, window %d)",
660 window, data, data->key_file, data->window_num);
661 window_group = g_strdup_printf(WINDOW_STRING, data->window_num + 1);
670 if (!g_key_file_has_group (data->key_file, window_group) ||
671 !g_key_file_has_key (data->key_file, window_group, WINDOW_PAGECOUNT, &error))
676 PINFO (
"saved state had an empty first main window\n"
677 "an account hierarchy page was added automatically to avoid confusion");
680 PINFO (
"saved state had an empty main window, skipping restore");
687 page_count = g_key_file_get_integer(data->key_file,
688 window_group, WINDOW_PAGECOUNT, &error);
691 g_warning(
"error reading group %s key %s: %s",
692 window_group, WINDOW_PAGECOUNT, error->message);
701 page_start = g_key_file_get_integer(data->key_file,
702 window_group, WINDOW_FIRSTPAGE, &error);
705 g_warning(
"error reading group %s key %s: %s",
706 window_group, WINDOW_FIRSTPAGE, error->message);
713 DEBUG(
"Window %d doesn't exist. Creating new window.", data->window_num);
714 DEBUG(
"active_windows %p.", active_windows);
716 DEBUG(
"first window %p.", active_windows->data);
718 gtk_widget_show(GTK_WIDGET(window));
721 priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
724 geom = g_key_file_get_integer_list(data->key_file, window_group,
725 WINDOW_GEOMETRY, &length, &error);
728 g_warning(
"error reading group %s key %s: %s",
729 window_group, WINDOW_GEOMETRY, error->message);
733 else if (length != 2)
735 g_warning(
"invalid number of values for group %s key %s",
736 window_group, WINDOW_GEOMETRY);
740 gtk_window_resize(GTK_WINDOW(window), geom[0], geom[1]);
741 DEBUG(
"window (%p) size %dx%d", window, geom[0], geom[1]);
746 pos = g_key_file_get_integer_list(data->key_file, window_group,
747 WINDOW_POSITION, &length, &error);
750 g_warning(
"error reading group %s key %s: %s",
751 window_group, WINDOW_POSITION, error->message);
755 else if (length != 2)
757 g_warning(
"invalid number of values for group %s key %s",
758 window_group, WINDOW_POSITION);
760 else if ((pos[0] + (geom ? geom[0] : 0) < 0) ||
761 (pos[0] > gdk_screen_width()) ||
762 (pos[1] + (geom ? geom[1] : 0) < 0) ||
763 (pos[1] > gdk_screen_height()))
770 gtk_window_move(GTK_WINDOW(window), pos[0], pos[1]);
771 DEBUG(
"window (%p) position %dx%d", window, pos[0], pos[1]);
782 max = g_key_file_get_boolean(data->key_file, window_group,
783 WINDOW_MAXIMIZED, &error);
786 g_warning(
"error reading group %s key %s: %s",
787 window_group, WINDOW_MAXIMIZED, error->message);
793 gtk_window_maximize(GTK_WINDOW(window));
798 visible = gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(action));
799 desired_visibility = g_key_file_get_boolean(data->key_file, window_group,
800 TOOLBAR_VISIBLE, &error);
803 g_warning(
"error reading group %s key %s: %s",
804 window_group, TOOLBAR_VISIBLE, error->message);
808 else if (visible != desired_visibility)
810 gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action), desired_visibility);
814 visible = gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(action));
815 desired_visibility = g_key_file_get_boolean(data->key_file, window_group,
816 SUMMARYBAR_VISIBLE, &error);
819 g_warning(
"error reading group %s key %s: %s",
820 window_group, TOOLBAR_VISIBLE, error->message);
824 else if (visible != desired_visibility)
826 gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action), desired_visibility);
830 visible = gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(action));
831 desired_visibility = g_key_file_get_boolean(data->key_file, window_group,
832 STATUSBAR_VISIBLE, &error);
835 g_warning(
"error reading group %s key %s: %s",
836 window_group, TOOLBAR_VISIBLE, error->message);
840 else if (visible != desired_visibility)
842 gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action), desired_visibility);
846 for (i = 0; i < page_count; i++)
848 data->page_offset = page_start;
850 gnc_main_window_restore_page(window, data);
853 while (gtk_events_pending ())
854 gtk_main_iteration ();
860 order = g_key_file_get_integer_list(data->key_file, window_group,
861 WINDOW_PAGEORDER, &length, &error);
864 g_warning(
"error reading group %s key %s: %s",
865 window_group, WINDOW_PAGEORDER, error->message);
869 else if (length != page_count)
871 g_warning(
"%s key %s length %" G_GSIZE_FORMAT
" differs from window page count %d",
872 window_group, WINDOW_PAGEORDER, length, page_count);
880 for (i = 0; i < length; i++)
888 gtk_notebook_set_current_page (GTK_NOTEBOOK(priv->
notebook),
896 LEAVE(
"window %p", window);
900 g_free(window_group);
906 gint i, window_count;
907 GError *error = NULL;
913 data.key_file = (GKeyFile *) keyfile;
914 window_count = g_key_file_get_integer(data.key_file, STATE_FILE_TOP,
915 WINDOW_COUNT, &error);
918 g_warning(
"error reading group %s key %s: %s",
919 STATE_FILE_TOP, WINDOW_COUNT, error->message);
921 LEAVE(
"can't read count");
927 gnc_set_busy_cursor (NULL, TRUE);
928 for (i = 0; i < window_count; i++)
931 window = g_list_nth_data(active_windows, i);
932 gnc_main_window_restore_window(window, &data);
934 gnc_unset_busy_cursor (NULL);
936 statusbar_notification_lastmodified();
946 DEBUG(
"no saved state file");
948 window = g_list_nth_data(active_windows, 0);
950 gtk_action_activate(action);
966 const gchar *plugin_name, *page_name;
968 ENTER(
"page %p, data %p (key file %p, window %d, page %d)",
969 page, data, data->key_file, data->window_num, data->page_num);
972 if (!plugin_name || !page_name)
974 LEAVE(
"not saving invalid page");
977 page_group = g_strdup_printf(PAGE_STRING, data->page_num++);
978 g_key_file_set_string(data->key_file, page_group, PAGE_TYPE, plugin_name);
979 g_key_file_set_string(data->key_file, page_group, PAGE_NAME, page_name);
1000 gint i, num_pages, coords[4], *order;
1001 gboolean maximized, visible;
1002 gchar *window_group;
1005 ENTER(
"window %p, data %p (key file %p, window %d)",
1006 window, data, data->key_file, data->window_num);
1007 priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
1010 num_pages = gtk_notebook_get_n_pages(GTK_NOTEBOOK(priv->
notebook));
1013 LEAVE(
"empty window %p", window);
1018 window_group = g_strdup_printf(WINDOW_STRING, data->window_num++);
1019 g_key_file_set_integer(data->key_file, window_group,
1020 WINDOW_PAGECOUNT, num_pages);
1021 g_key_file_set_integer(data->key_file, window_group,
1022 WINDOW_FIRSTPAGE, data->page_num);
1027 order = g_malloc(
sizeof(gint) * num_pages);
1028 for (i = 0; i < num_pages; i++)
1030 gpointer page = g_list_nth_data(priv->
usage_order, i);
1033 g_key_file_set_integer_list(data->key_file, window_group,
1034 WINDOW_PAGEORDER, order, num_pages);
1038 gtk_window_get_position(GTK_WINDOW(window), &coords[0], &coords[1]);
1039 gtk_window_get_size(GTK_WINDOW(window), &coords[2], &coords[3]);
1040 maximized = (gdk_window_get_state((GTK_WIDGET(window))->window)
1041 & GDK_WINDOW_STATE_MAXIMIZED) != 0;
1042 g_key_file_set_integer_list(data->key_file, window_group,
1043 WINDOW_POSITION, &coords[0], 2);
1044 g_key_file_set_integer_list(data->key_file, window_group,
1045 WINDOW_GEOMETRY, &coords[2], 2);
1046 g_key_file_set_boolean(data->key_file, window_group,
1047 WINDOW_MAXIMIZED, maximized);
1048 DEBUG(
"window (%p) position %dx%d, size %dx%d, %s", window, coords[0], coords[1],
1049 coords[2], coords[3],
1050 maximized ?
"maximized" :
"not maximized");
1054 visible = gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(action));
1055 g_key_file_set_boolean(data->key_file, window_group,
1056 TOOLBAR_VISIBLE, visible);
1058 visible = gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(action));
1059 g_key_file_set_boolean(data->key_file, window_group,
1060 SUMMARYBAR_VISIBLE, visible);
1062 visible = gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(action));
1063 g_key_file_set_boolean(data->key_file, window_group,
1064 STATUSBAR_VISIBLE, visible);
1067 g_list_foreach(priv->
installed_pages, (GFunc)gnc_main_window_save_page, data);
1069 g_free(window_group);
1070 LEAVE(
"window %p", window);
1079 data.key_file = keyfile;
1080 data.window_num = 1;
1083 g_key_file_set_integer(data.key_file,
1084 STATE_FILE_TOP, WINDOW_COUNT,
1085 g_list_length(active_windows));
1087 g_list_foreach(active_windows, (GFunc)gnc_main_window_save_window, &data);
1097 g_return_val_if_fail(GNC_IS_MAIN_WINDOW(window), TRUE);
1099 priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
1114 const GList *windows, *item;
1117 for (item = windows; item; item = g_list_next(item))
1145 for (walker = active_windows; walker; walker = g_list_next(walker))
1147 window = walker->data;
1148 priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
1157 static gboolean auto_save_countdown (GtkWidget *dialog)
1160 gchar *timeoutstr = NULL;
1163 if (!GTK_IS_DIALOG (dialog))
1167 label = GTK_WIDGET (g_object_get_data (G_OBJECT (dialog),
"count-down-label"));
1168 if (!GTK_IS_LABEL (label))
1172 DEBUG (
"Counting down: %d seconds", secs_to_save);
1174 timeoutstr = g_strdup_printf (MSG_AUTO_SAVE, secs_to_save);
1175 gtk_label_set_text (GTK_LABEL (label), timeoutstr);
1176 g_free (timeoutstr);
1181 gtk_dialog_response (GTK_DIALOG(dialog), GTK_RESPONSE_APPLY);
1200 gnc_main_window_prompt_for_save (GtkWidget *window)
1204 GtkWidget *dialog, *msg_area, *label;
1206 const gchar *filename, *tmp;
1207 const gchar *title = _(
"Save changes to file %s before closing?");
1209 const gchar *message_hours =
1210 _(
"If you don't save, changes from the past %d hours and %d minutes will be discarded.");
1211 const gchar *message_days =
1212 _(
"If you don't save, changes from the past %d days and %d hours will be discarded.");
1214 gint minutes, hours, days;
1216 session = gnc_get_current_session();
1218 filename = qof_session_get_url(session);
1219 if (filename == NULL)
1220 filename = _(
"<unknown>");
1221 if ((tmp = strrchr(filename,
'/')) != NULL)
1225 gnc_autosave_remove_timer(book);
1227 dialog = gtk_message_dialog_new(GTK_WINDOW(window),
1229 GTK_MESSAGE_WARNING,
1234 minutes = (
gnc_time (NULL) - oldest_change) / 60 + 1;
1235 hours = minutes / 60;
1236 minutes = minutes % 60;
1241 gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),
1242 message_days, days, hours);
1246 gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),
1247 message_hours, hours, minutes);
1251 gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),
1252 ngettext(
"If you don't save, changes from the past %d minute will be discarded.",
1253 "If you don't save, changes from the past %d minutes will be discarded.",
1256 gtk_dialog_add_buttons(GTK_DIALOG(dialog),
1257 _(
"Close _Without Saving"), GTK_RESPONSE_CLOSE,
1258 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
1259 GTK_STOCK_SAVE, GTK_RESPONSE_APPLY,
1261 gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_APPLY);
1268 gchar *timeoutstr = NULL;
1270 secs_to_save =
gnc_prefs_get_int (GNC_PREFS_GROUP_GENERAL, GNC_PREF_SAVE_CLOSE_WAIT_TIME);
1271 timeoutstr = g_strdup_printf (MSG_AUTO_SAVE, secs_to_save);
1272 label = GTK_WIDGET(gtk_label_new (timeoutstr));
1273 g_free (timeoutstr);
1274 gtk_widget_show (label);
1276 msg_area = gtk_message_dialog_get_message_area (GTK_MESSAGE_DIALOG(dialog));
1277 gtk_box_pack_end (GTK_BOX(msg_area), label, TRUE, TRUE, 0);
1278 g_object_set (G_OBJECT (label),
"xalign", 0.0, NULL);
1280 g_object_set_data (G_OBJECT (dialog),
"count-down-label", label);
1281 g_timeout_add_seconds (1, (GSourceFunc)auto_save_countdown, dialog);
1284 response = gtk_dialog_run (GTK_DIALOG (dialog));
1285 gtk_widget_destroy(dialog);
1289 case GTK_RESPONSE_APPLY:
1293 case GTK_RESPONSE_CLOSE:
1304 gnc_main_window_add_plugin (gpointer plugin,
1307 g_return_if_fail (GNC_IS_MAIN_WINDOW (window));
1308 g_return_if_fail (GNC_IS_PLUGIN (plugin));
1312 GNC_MAIN_WINDOW (window),
1318 gnc_main_window_remove_plugin (gpointer plugin,
1321 g_return_if_fail (GNC_IS_MAIN_WINDOW (window));
1322 g_return_if_fail (GNC_IS_PLUGIN (plugin));
1326 GNC_MAIN_WINDOW (window),
1333 gnc_main_window_timed_quit (gpointer dummy)
1335 if (gnc_file_save_in_progress())
1346 gboolean needs_save, do_shutdown;
1348 session = gnc_get_current_session();
1350 !gnc_file_save_in_progress();
1351 do_shutdown = !needs_save ||
1352 (needs_save && !gnc_main_window_prompt_for_save(GTK_WIDGET(window)));
1356 g_timeout_add(250, gnc_main_window_timed_quit, NULL);
1363 gnc_main_window_delete_event (GtkWidget *window,
1367 static gboolean already_dead = FALSE;
1378 if (g_list_length(active_windows) > 1)
1381 already_dead = gnc_main_window_quit(GNC_MAIN_WINDOW(window));
1407 gpointer user_data, gpointer event_data)
1415 g_return_if_fail(GNC_IS_MAIN_WINDOW(user_data));
1420 if (event_type != QOF_EVENT_DESTROY)
1423 ENTER(
"entity %p, event %d, window %p, event data %p",
1424 entity, event_type, user_data, event_data);
1425 window = GNC_MAIN_WINDOW(user_data);
1426 priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
1433 next = g_list_next(item);
1434 page = GNC_PLUGIN_PAGE(item->data);
1465 gchar *filename = NULL;
1466 const gchar *book_id = NULL;
1467 const gchar *dirty =
"";
1468 const gchar *readonly_text = NULL;
1477 gtk_action_set_sensitive(action, FALSE);
1479 if (gnc_current_session_exist())
1481 book_id = qof_session_get_url (gnc_get_current_session ());
1482 book = gnc_get_current_book();
1488 gtk_action_set_sensitive(action, TRUE);
1495 readonly_text = _(
"(read-only)");
1498 readonly = (readonly_text != NULL)
1499 ? g_strdup_printf(
" %s", readonly_text)
1503 filename = g_strdup(_(
"Unsaved Book"));
1511 filename = g_path_get_basename ( path );
1522 priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
1528 title = g_strdup_printf(
"%s%s%s - %s - GnuCash", dirty, filename, readonly,
1533 title = g_strdup_printf(
"%s%s%s - GnuCash", dirty, filename, readonly);
1537 g_object_get_data (G_OBJECT (page), PLUGIN_PAGE_IMMUTABLE);
1539 immutable_page_actions,
1540 "sensitive", !immutable);
1562 title = gnc_main_window_generate_title(window);
1563 gtk_window_set_title(GTK_WINDOW(window), title);
1568 gnc_main_window_update_all_titles (
void)
1570 g_list_foreach(active_windows,
1571 (GFunc)gnc_main_window_update_title,
1576 gnc_main_window_book_dirty_cb (
QofBook *book,
1580 gnc_main_window_update_all_titles();
1583 gnc_autosave_dirty_handler(book, dirty);
1587 gnc_main_window_attach_to_book (
QofSession *session)
1591 g_return_if_fail(session);
1595 gnc_main_window_update_all_titles();
1596 #ifndef MAC_INTEGRATION
1597 gnc_main_window_update_all_menu_items();
1601 static guint gnc_statusbar_notification_messageid = 0;
1603 #ifdef STATUSBAR_NOTIFICATION_AUTOREMOVAL
1606 static gboolean statusbar_notification_off(gpointer user_data_unused)
1610 if (gnc_statusbar_notification_messageid == 0)
1613 if (widget && GNC_IS_MAIN_WINDOW(widget))
1616 GtkWidget *statusbar = gnc_main_window_get_statusbar(GNC_WINDOW(mainwindow));
1617 gtk_statusbar_remove(GTK_STATUSBAR(statusbar), 0, gnc_statusbar_notification_messageid);
1618 gnc_statusbar_notification_messageid = 0;
1622 g_warning(
"oops, no GncMainWindow obtained\n");
1626 #endif // STATUSBAR_NOTIFICATION_AUTOREMOVAL
1630 static gchar *generate_statusbar_lastmodified_message()
1632 gchar *message = NULL;
1633 const gchar *book_id = NULL;
1635 if (gnc_current_session_exist())
1637 book_id = qof_session_get_url (gnc_get_current_session ());
1646 #ifdef HAVE_SYS_STAT_H
1649 gchar *filename = g_path_get_basename ( filepath );
1652 struct stat statbuf;
1653 int r = stat(filepath, &statbuf);
1657 gint64 mtime = statbuf.st_mtime;
1659 gchar *dummy_strftime_has_ampm = g_date_time_format (gdt,
"%P");
1667 gchar *time_string =
1668 g_date_time_format (gdt, (strlen(dummy_strftime_has_ampm) > 0)
1669 ? _(
"Last modified on %a, %b %e, %Y at %I:%M%P")
1670 : _(
"Last modified on %a, %b %e, %Y at %H:%M"));
1672 g_date_time_unref (gdt);
1676 message = g_strdup_printf(_(
"File %s opened. %s"),
1677 filename, time_string);
1678 g_free(time_string);
1679 g_free(dummy_strftime_has_ampm);
1683 g_warning(
"Unable to read mtime for file %s\n", filepath);
1700 statusbar_notification_lastmodified()
1704 GtkWidget *widget = NULL;
1705 for (iter = active_windows; iter && !(widget && GNC_IS_MAIN_WINDOW(widget));
1706 iter = g_list_next(iter))
1708 widget = iter->data;
1710 if (widget && GNC_IS_MAIN_WINDOW(widget))
1714 GtkWidget *statusbar = gnc_main_window_get_statusbar(GNC_WINDOW(mainwindow));
1716 gchar *msg = generate_statusbar_lastmodified_message();
1719 gnc_statusbar_notification_messageid = gtk_statusbar_push(GTK_STATUSBAR(statusbar), 0, msg);
1723 #ifdef STATUSBAR_NOTIFICATION_AUTOREMOVAL
1726 g_timeout_add(10 * 1000, statusbar_notification_off, NULL);
1731 g_warning(
"uh oh, no GNC_IS_MAIN_WINDOW\n");
1751 #ifndef MAC_INTEGRATION
1766 gnc_main_window_update_one_menu_action (
GncMainWindow *window,
1772 ENTER(
"window %p, action %s, label %s, visible %d", window,
1774 priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
1777 g_object_set(G_OBJECT(action),
1778 "label", data->
label,
1800 GtkAction *action, *first_action;
1801 GSList *action_list;
1805 ENTER(
"window %p", window);
1808 index = g_list_index(active_windows, window);
1809 if (index >= n_radio_entries)
1811 LEAVE(
"window %d, only %d actions", index, n_radio_entries);
1815 priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
1816 action_name = g_strdup_printf(
"Window%dAction", index);
1817 action = gtk_action_group_get_action(priv->
action_group, action_name);
1821 action_list = gtk_radio_action_get_group(GTK_RADIO_ACTION(action));
1824 first_action = g_slist_last(action_list)->data;
1825 g_signal_handlers_block_by_func(G_OBJECT(first_action),
1826 G_CALLBACK(gnc_main_window_cmd_window_raise),
1828 DEBUG(
"blocked signal on %p, set %p active, window %p", first_action,
1830 gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action), TRUE);
1831 g_signal_handlers_unblock_by_func(G_OBJECT(first_action),
1832 G_CALLBACK(gnc_main_window_cmd_window_raise),
1835 g_free(action_name);
1856 gchar **strings, *title, *expanded;
1859 ENTER(
"window %p", window);
1860 index = g_list_index(active_windows, window);
1861 if (index > n_radio_entries)
1863 LEAVE(
"skip window %d (only %d entries)", index, n_radio_entries);
1868 title = gnc_main_window_generate_title(window);
1869 strings = g_strsplit(title,
"_", 0);
1871 expanded = g_strjoinv(
"__", strings);
1874 data.label = g_strdup_printf(
"_%d %s", (index + 1) % 10, expanded);
1879 data.label = expanded;
1881 g_strfreev(strings);
1883 data.visible = TRUE;
1884 data.action_name = g_strdup_printf(
"Window%dAction", index);
1885 g_list_foreach(active_windows,
1886 (GFunc)gnc_main_window_update_one_menu_action,
1888 g_free(data.action_name);
1903 #ifndef MAC_INTEGRATION
1905 gnc_main_window_update_all_menu_items (
void)
1913 g_list_foreach(active_windows,
1914 (GFunc)gnc_main_window_update_menu_item,
1916 g_list_foreach(active_windows,
1917 (GFunc)gnc_main_window_update_radio_button,
1921 data.visible = FALSE;
1922 for (i = g_list_length(active_windows); i < n_radio_entries; i++)
1924 data.action_name = g_strdup_printf(
"Window%dAction", i);
1925 label = g_strdup_printf(
"Window _%d", (i - 1) % 10);
1926 data.label = gettext(label);
1928 g_list_foreach(active_windows,
1929 (GFunc)gnc_main_window_update_one_menu_action,
1932 g_free(data.action_name);
1951 gnc_main_window_update_tab_close_one_page (
GncPluginPage *page,
1954 gboolean *new_value = user_data;
1955 GtkWidget * close_button;
1957 ENTER(
"page %p, visible %d", page, *new_value);
1958 close_button = g_object_get_data(G_OBJECT (page), PLUGIN_PAGE_CLOSE_BUTTON);
1961 LEAVE(
"no close button");
1966 gtk_widget_show (close_button);
1968 gtk_widget_hide (close_button);
1986 gnc_main_window_update_tab_close (gpointer prefs, gchar *pref, gpointer user_data)
1991 new_value =
gnc_prefs_get_bool (GNC_PREFS_GROUP_GENERAL, GNC_PREF_SHOW_CLOSE_BUTTON);
1992 gnc_main_window_foreach_page(
1993 gnc_main_window_update_tab_close_one_page,
2008 gnc_main_window_update_tab_color_one_page (
GncPluginPage *page,
2011 const gchar *color_string;
2013 ENTER(
"page %p", page);
2031 gnc_main_window_update_tab_color (gpointer gsettings, gchar *pref, gpointer user_data)
2037 g_return_if_fail(GNC_IS_MAIN_WINDOW(user_data));
2039 priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
2040 if (g_strcmp0 (GNC_PREF_TAB_COLOR, pref) == 0)
2042 gnc_main_window_foreach_page (gnc_main_window_update_tab_color_one_page, window);
2060 gnc_main_window_update_tab_width_one_page (
GncPluginPage *page,
2063 gint *new_value = user_data;
2066 ENTER(
"page %p, visible %d", page, *new_value);
2067 label = g_object_get_data(G_OBJECT (page), PLUGIN_PAGE_TAB_LABEL);
2074 if (*new_value != 0)
2076 gtk_label_set_ellipsize(GTK_LABEL(label), PANGO_ELLIPSIZE_MIDDLE);
2077 gtk_label_set_max_width_chars(GTK_LABEL(label), *new_value);
2081 gtk_label_set_ellipsize(GTK_LABEL(label), PANGO_ELLIPSIZE_NONE);
2082 gtk_label_set_max_width_chars(GTK_LABEL(label), 100);
2101 gnc_main_window_update_tab_width (gpointer prefs, gchar *pref, gpointer user_data)
2107 gnc_main_window_foreach_page(
2108 gnc_main_window_update_tab_width_one_page,
2120 GtkWidget **label_p,
2121 GtkWidget **entry_p)
2124 GtkWidget *tab_hbox, *widget, *tab_widget;
2125 GList *children, *tmp;
2127 ENTER(
"window %p, page %p, label_p %p, entry_p %p",
2128 window, page, label_p, entry_p);
2129 priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
2130 *label_p = *entry_p = NULL;
2134 LEAVE(
"invalid notebook_page");
2138 tab_widget = gtk_notebook_get_tab_label(GTK_NOTEBOOK(priv->
notebook),
2140 if (GTK_IS_EVENT_BOX (tab_widget))
2141 tab_hbox = gtk_bin_get_child(GTK_BIN(tab_widget));
2142 else if (GTK_IS_HBOX (tab_widget))
2143 tab_hbox = tab_widget;
2146 PWARN (
"Unknown widget for tab label %p", tab_widget);
2150 children = gtk_container_get_children(GTK_CONTAINER(tab_hbox));
2151 for (tmp = children; tmp; tmp = g_list_next(tmp))
2154 if (GTK_IS_LABEL(widget))
2158 else if (GTK_IS_ENTRY(widget))
2163 g_list_free(children);
2165 LEAVE(
"label %p, entry %p", *label_p, *entry_p);
2166 return (*label_p && *entry_p);
2172 GtkWidget **widget_p)
2176 ENTER(
"window %p, page %p, widget %p",
2177 window, page, widget_p);
2182 LEAVE(
"invalid notebook_page");
2186 priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
2187 *widget_p = gtk_notebook_get_tab_label(GTK_NOTEBOOK(priv->
notebook),
2190 LEAVE(
"widget %p", *widget_p);
2196 const gchar *name_in)
2200 GtkWidget *
label, *entry;
2201 gchar *name, *old_page_name, *old_page_long_name;
2205 if ((name_in == NULL) || (*name_in ==
'\0'))
2210 name = g_strstrip(g_strdup(name_in));
2216 LEAVE(
"empty string or name unchanged");
2227 window = GNC_MAIN_WINDOW(page->
window);
2230 g_free(old_page_name);
2231 g_free(old_page_long_name);
2233 LEAVE(
"no window widget available");
2237 if (main_window_find_tab_items(window, page, &label, &entry))
2238 gtk_label_set_text(GTK_LABEL(label), name);
2241 if (old_page_long_name && old_page_name
2242 && g_strrstr(old_page_long_name, old_page_name) != NULL)
2244 gchar *new_page_long_name;
2245 gint string_position;
2246 GtkWidget *tab_widget;
2248 string_position = strlen(old_page_long_name) - strlen(old_page_name);
2249 new_page_long_name = g_strconcat(g_strndup(old_page_long_name, string_position), name, NULL);
2253 if (main_window_find_tab_widget(window, page, &tab_widget))
2254 gtk_widget_set_tooltip_text(tab_widget, new_page_long_name);
2256 g_free(new_page_long_name);
2262 priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
2263 label = gtk_notebook_get_menu_label (GTK_NOTEBOOK(priv->
notebook),
2265 gtk_label_set_text(GTK_LABEL(label), name);
2269 gnc_main_window_update_title(window);
2270 g_free(old_page_long_name);
2271 g_free(old_page_name);
2279 const gchar *color_in)
2283 GtkWidget *tab_widget;
2285 gchar *color_string = NULL;
2286 gboolean want_color = FALSE;
2290 color_string = g_strstrip(g_strdup(color_in));
2292 if (color_string && *color_string !=
'\0')
2296 window = GNC_MAIN_WINDOW(page->
window);
2303 main_window_find_tab_widget (window, page, &tab_widget);
2304 priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
2306 if (want_color && gdk_color_parse(color_string, &tab_color) && priv->
show_color_tabs)
2308 if (!GTK_IS_EVENT_BOX (tab_widget))
2310 GtkWidget *event_box = gtk_event_box_new ();
2311 g_object_ref (tab_widget);
2312 gtk_notebook_set_tab_label (GTK_NOTEBOOK(priv->
notebook),
2314 gtk_container_add (GTK_CONTAINER(event_box), tab_widget);
2315 g_object_unref (tab_widget);
2316 tab_widget = event_box;
2318 gtk_widget_modify_bg(tab_widget, GTK_STATE_NORMAL, &tab_color);
2319 gtk_widget_modify_bg(tab_widget, GTK_STATE_ACTIVE, &tab_color);
2323 if (GTK_IS_EVENT_BOX (tab_widget))
2325 GtkWidget *tab_hbox = gtk_bin_get_child(GTK_BIN(tab_widget));
2326 g_object_ref (tab_hbox);
2327 gtk_container_remove (GTK_CONTAINER(tab_widget), tab_hbox);
2328 gtk_notebook_set_tab_label (GTK_NOTEBOOK(priv->
notebook),
2330 g_object_unref (tab_hbox);
2333 g_free(color_string);
2339 gnc_main_window_tab_entry_activate (GtkWidget *entry,
2342 GtkWidget *
label, *entry2;
2344 g_return_if_fail(GTK_IS_ENTRY(entry));
2345 g_return_if_fail(GNC_IS_PLUGIN_PAGE(page));
2348 if (!main_window_find_tab_items(GNC_MAIN_WINDOW(page->
window),
2349 page, &label, &entry2))
2351 LEAVE(
"can't find required widgets");
2357 gtk_widget_hide(entry);
2358 gtk_widget_show(label);
2364 gnc_main_window_tab_entry_editing_done (GtkWidget *entry,
2368 gnc_main_window_tab_entry_activate(entry, page);
2374 gnc_main_window_tab_entry_focus_out_event (GtkWidget *entry,
2379 gtk_cell_editable_editing_done(GTK_CELL_EDITABLE(entry));
2385 gnc_main_window_tab_entry_key_press_event (GtkWidget *entry,
2389 if (event->keyval == GDK_KEY_Escape)
2391 GtkWidget *
label, *entry2;
2393 g_return_val_if_fail(GTK_IS_ENTRY(entry), FALSE);
2394 g_return_val_if_fail(GNC_IS_PLUGIN_PAGE(page), FALSE);
2397 if (!main_window_find_tab_items(GNC_MAIN_WINDOW(page->
window),
2398 page, &label, &entry2))
2400 LEAVE(
"can't find required widgets");
2404 gtk_entry_set_text(GTK_ENTRY(entry), gtk_label_get_text(GTK_LABEL(label)));
2405 gtk_widget_hide(entry);
2406 gtk_widget_show(label);
2421 static GType gnc_main_window_type = 0;
2423 if (gnc_main_window_type == 0)
2425 static const GTypeInfo our_info =
2430 (GClassInitFunc) gnc_main_window_class_init,
2435 (GInstanceInitFunc) gnc_main_window_init
2438 static const GInterfaceInfo plugin_info =
2440 (GInterfaceInitFunc) gnc_window_main_window_init,
2445 gnc_main_window_type = g_type_register_static (GTK_TYPE_WINDOW,
2446 GNC_MAIN_WINDOW_NAME,
2448 g_type_add_interface_static (gnc_main_window_type,
2453 return gnc_main_window_type;
2467 GObjectClass *object_class = G_OBJECT_CLASS (klass);
2468 GtkObjectClass *gtkobject_class = GTK_OBJECT_CLASS(klass);
2470 parent_class = g_type_class_peek_parent (klass);
2472 window_type = g_quark_from_static_string (
"gnc-main-window");
2474 object_class->finalize = gnc_main_window_finalize;
2477 gtkobject_class->destroy = gnc_main_window_destroy;
2492 main_window_signals[PAGE_ADDED] =
2493 g_signal_new (
"page_added",
2494 G_OBJECT_CLASS_TYPE (object_class),
2498 g_cclosure_marshal_VOID__OBJECT,
2512 main_window_signals[PAGE_CHANGED] =
2513 g_signal_new (
"page_changed",
2514 G_OBJECT_CLASS_TYPE (object_class),
2518 g_cclosure_marshal_VOID__OBJECT,
2523 GNC_PREF_SHOW_CLOSE_BUTTON,
2524 gnc_main_window_update_tab_close,
2528 gnc_main_window_update_tab_width,
2531 gnc_hook_add_dangler(HOOK_BOOK_SAVED,
2532 (GFunc)gnc_main_window_update_all_titles, NULL);
2533 gnc_hook_add_dangler(HOOK_BOOK_OPENED,
2534 (GFunc)gnc_main_window_attach_to_book, NULL);
2553 priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
2555 g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
2566 gnc_main_window_update_tab_color,
2569 gnc_main_window_setup_window (window);
2571 G_OBJECT_CLASS(klass));
2586 gnc_main_window_finalize (GObject *
object)
2588 g_return_if_fail (
object != NULL);
2589 g_return_if_fail (GNC_IS_MAIN_WINDOW (
object));
2591 if (active_windows == NULL)
2598 G_OBJECT_CLASS (parent_class)->finalize (
object);
2603 gnc_main_window_destroy (GtkObject *
object)
2610 g_return_if_fail (
object != NULL);
2611 g_return_if_fail (GNC_IS_MAIN_WINDOW (
object));
2613 window = GNC_MAIN_WINDOW (
object);
2615 active_windows = g_list_remove (active_windows, window);
2618 priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
2626 if (gnc_window_get_progressbar_window() == GNC_WINDOW(window))
2627 gnc_window_set_progressbar_window(NULL);
2628 #ifndef MAC_INTEGRATION
2630 gnc_main_window_update_all_menu_items();
2634 gnc_main_window_update_tab_color,
2646 g_list_foreach (plugins, gnc_main_window_remove_plugin, window);
2647 g_list_free (plugins);
2651 GTK_OBJECT_CLASS (parent_class)->destroy (
object);
2661 GtkWidget *old_window;
2663 window = g_object_new (GNC_TYPE_MAIN_WINDOW, NULL);
2664 gtk_window_set_default_size(GTK_WINDOW(window), 800, 600);
2670 gtk_window_get_size (GTK_WINDOW (old_window), &width, &height);
2671 gtk_window_resize (GTK_WINDOW (window), width, height);
2672 if ((gdk_window_get_state((GTK_WIDGET(old_window))->window)
2673 & GDK_WINDOW_STATE_MAXIMIZED) != 0)
2675 gtk_window_maximize (GTK_WINDOW (window));
2678 active_windows = g_list_append (active_windows, window);
2679 gnc_main_window_update_title(window);
2680 #ifdef MAC_INTEGRATION
2681 gnc_quartz_set_menu(window);
2683 gnc_main_window_update_all_menu_items();
2695 gnc_main_window_engine_commit_error_callback( gpointer data,
2700 const gchar *reason = _(
"Unable to save to database.");
2702 reason = _(
"Unable to save to database: Book is marked read-only.");
2703 dialog = gtk_message_dialog_new( GTK_WINDOW(window),
2704 GTK_DIALOG_DESTROY_WITH_PARENT,
2709 gtk_dialog_run(GTK_DIALOG (dialog));
2710 gtk_widget_destroy(dialog);
2734 GtkWidget *tab_hbox,
2735 GtkWidget *menu_label)
2738 GtkNotebook *notebook;
2740 page->
window = GTK_WIDGET(window);
2741 priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
2742 notebook = GTK_NOTEBOOK (priv->
notebook);
2745 gtk_notebook_append_page_menu (notebook, page->
notebook_page,
2746 tab_hbox, menu_label);
2747 gtk_notebook_set_tab_reorderable (notebook, page->
notebook_page, TRUE);
2748 gnc_plugin_page_inserted (page);
2749 gtk_notebook_set_current_page (notebook, -1);
2750 if (GNC_PLUGIN_PAGE_GET_CLASS(page)->window_changed)
2751 (GNC_PLUGIN_PAGE_GET_CLASS(page)->window_changed)(page, GTK_WIDGET(window));
2752 g_signal_emit (window, main_window_signals[PAGE_ADDED], 0, page);
2754 g_signal_connect(G_OBJECT(page->
notebook_page),
"popup-menu",
2755 G_CALLBACK(gnc_main_window_popup_menu_cb), page);
2756 g_signal_connect_after(G_OBJECT(page->
notebook_page),
"button-press-event",
2779 GtkNotebook *notebook;
2784 g_signal_handlers_disconnect_by_func(G_OBJECT(page->
notebook_page),
2785 G_CALLBACK(gnc_main_window_popup_menu_cb), page);
2786 g_signal_handlers_disconnect_by_func(G_OBJECT(page->
notebook_page),
2790 priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
2794 gnc_plugin_page_unselected (page);
2803 notebook = GTK_NOTEBOOK (priv->
notebook);
2806 new_page = g_list_nth_data (priv->
usage_order, 0);
2809 page_num = gtk_notebook_page_num(notebook, new_page->
notebook_page);
2810 gtk_notebook_set_current_page(notebook, page_num);
2815 while (gtk_events_pending())
2816 gtk_main_iteration();
2821 page_num = gtk_notebook_page_num(notebook, page->
notebook_page);
2822 gtk_notebook_remove_page (notebook, page_num);
2824 if ( gtk_notebook_get_current_page(notebook) == -1)
2830 gnc_main_window_switch_page(notebook, NULL, -1, window);
2834 gnc_plugin_page_removed (page);
2836 gtk_ui_manager_ensure_update (window->
ui_merge);
2837 gnc_window_set_status (GNC_WINDOW(window), page, NULL);
2851 GtkNotebook *notebook;
2854 window = GNC_MAIN_WINDOW (page->
window);
2855 priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
2856 notebook = GTK_NOTEBOOK (priv->
notebook);
2857 page_num = gtk_notebook_page_num(notebook, page->
notebook_page);
2858 gtk_notebook_set_current_page (notebook, page_num);
2859 gtk_window_present(GTK_WINDOW(window));
2875 GtkWidget *tab_hbox;
2876 GtkWidget *
label, *entry;
2877 const gchar *icon, *text, *color_string;
2883 ENTER(
"window %p, page %p", window, page);
2885 g_return_if_fail (GNC_IS_MAIN_WINDOW (window));
2886 g_return_if_fail (GNC_IS_PLUGIN_PAGE (page));
2889 if (gnc_main_window_page_exists(page))
2899 for (tmp = active_windows; tmp; tmp = g_list_next(tmp))
2901 window = GNC_MAIN_WINDOW(tmp->data);
2902 priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
2910 gtk_widget_show(GTK_WIDGET(window));
2912 else if ((window == NULL) && active_windows)
2914 window = active_windows->data;
2917 page->
window = GTK_WIDGET(window);
2918 priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
2927 icon = GNC_PLUGIN_PAGE_GET_CLASS(page)->tab_icon;
2931 gtk_label_set_ellipsize(GTK_LABEL(label), PANGO_ELLIPSIZE_MIDDLE);
2932 gtk_label_set_max_width_chars(GTK_LABEL(label), width);
2934 gtk_widget_show (label);
2936 tab_hbox = gtk_hbox_new (FALSE, 6);
2937 gtk_widget_show (tab_hbox);
2941 image = gtk_image_new_from_stock (icon, GTK_ICON_SIZE_MENU);
2942 gtk_widget_show (image);
2943 gtk_box_pack_start (GTK_BOX (tab_hbox), image, FALSE, FALSE, 0);
2944 gtk_box_pack_start (GTK_BOX (tab_hbox), label, TRUE, TRUE, 0);
2947 gtk_box_pack_start (GTK_BOX (tab_hbox), label, TRUE, TRUE, 0);
2952 gtk_widget_set_tooltip_text(tab_hbox, text);
2955 entry = gtk_entry_new();
2956 gtk_widget_hide (entry);
2957 gtk_box_pack_start (GTK_BOX (tab_hbox), entry, TRUE, TRUE, 0);
2958 g_signal_connect(G_OBJECT(entry),
"activate",
2959 G_CALLBACK(gnc_main_window_tab_entry_activate), page);
2960 g_signal_connect(G_OBJECT(entry),
"focus-out-event",
2961 G_CALLBACK(gnc_main_window_tab_entry_focus_out_event),
2963 g_signal_connect(G_OBJECT(entry),
"key-press-event",
2964 G_CALLBACK(gnc_main_window_tab_entry_key_press_event),
2966 g_signal_connect(G_OBJECT(entry),
"editing-done",
2967 G_CALLBACK(gnc_main_window_tab_entry_editing_done),
2971 if (!g_object_get_data (G_OBJECT (page), PLUGIN_PAGE_IMMUTABLE))
2973 GtkWidget *close_image, *close_button;
2974 GtkRequisition requisition;
2976 close_button = gtk_button_new();
2977 gtk_button_set_relief(GTK_BUTTON(close_button), GTK_RELIEF_NONE);
2978 close_image = gtk_image_new_from_stock(GTK_STOCK_CLOSE, GTK_ICON_SIZE_MENU);
2979 gtk_widget_show(close_image);
2980 gtk_widget_size_request(close_image, &requisition);
2981 gtk_widget_set_size_request(close_button, requisition.width + 4,
2982 requisition.height + 2);
2983 gtk_button_set_alignment(GTK_BUTTON(close_button), 0.5, 0.5);
2984 gtk_container_add(GTK_CONTAINER(close_button), close_image);
2986 gtk_widget_show (close_button);
2988 gtk_widget_hide (close_button);
2990 g_signal_connect_swapped (G_OBJECT (close_button),
"clicked",
2993 gtk_box_pack_start (GTK_BOX (tab_hbox), close_button, FALSE, FALSE, 0);
2995 g_object_set_data (G_OBJECT (page), PLUGIN_PAGE_CLOSE_BUTTON, close_button);
3006 gnc_main_window_connect(window, page, tab_hbox, label);
3031 if (!GNC_IS_MAIN_WINDOW (page->
window))
3034 window = GNC_MAIN_WINDOW (page->
window);
3037 g_warning(
"Page is not in a window.");
3041 gnc_main_window_disconnect(window, page);
3043 g_object_unref(page);
3046 priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
3049 if (g_list_length(active_windows) > 1)
3051 gtk_widget_destroy(GTK_WIDGET(window));
3069 priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
3081 const gchar *group_name,
3082 GtkActionGroup *group,
3088 g_return_if_fail (GNC_IS_MAIN_WINDOW (window));
3089 g_return_if_fail (group_name != NULL);
3090 g_return_if_fail (GTK_IS_ACTION_GROUP(group));
3091 g_return_if_fail (merge_id > 0);
3093 priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
3097 gtk_ui_manager_ensure_update (window->
ui_merge);
3110 const gchar *group_name,
3111 GtkActionEntry *actions,
3113 GtkToggleActionEntry *toggle_actions,
3114 guint n_toggle_actions,
3115 const gchar *filename,
3121 GError *error = NULL;
3124 g_return_if_fail (GNC_IS_MAIN_WINDOW (window));
3125 g_return_if_fail (group_name != NULL);
3126 g_return_if_fail (actions != NULL);
3127 g_return_if_fail (n_actions > 0);
3128 g_return_if_fail (filename != NULL);
3131 if (pathname == NULL)
3135 data->window = window;
3136 data->data = user_data;
3138 priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
3140 entry->
action_group = gtk_action_group_new (group_name);
3142 gtk_action_group_add_actions (entry->
action_group, actions, n_actions, data);
3143 if (toggle_actions != NULL && n_toggle_actions > 0)
3145 gtk_action_group_add_toggle_actions (entry->
action_group,
3146 toggle_actions, n_toggle_actions,
3150 entry->
merge_id = gtk_ui_manager_add_ui_from_file (window->
ui_merge, pathname, &error);
3151 g_assert(entry->
merge_id || error);
3154 gtk_ui_manager_ensure_update (window->
ui_merge);
3159 g_critical(
"Failed to load ui file.\n Filename %s\n Error %s",
3160 filename, error->message);
3161 g_error_free(error);
3175 const gchar *group_name)
3180 g_return_if_fail (GNC_IS_MAIN_WINDOW (window));
3181 g_return_if_fail (group_name != NULL);
3183 priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
3193 gtk_ui_manager_ensure_update (window->
ui_merge);
3207 GtkActionGroup *force;
3209 g_return_if_fail (GNC_IS_MAIN_WINDOW (window));
3215 force = gtk_action_group_new(
"force_update");
3216 gtk_ui_manager_insert_action_group (window->
ui_merge, force, 0);
3217 gtk_ui_manager_ensure_update (window->
ui_merge);
3218 gtk_ui_manager_remove_action_group (window->
ui_merge, force);
3219 g_object_unref(force);
3226 GtkAction *action = NULL;
3227 const GList *groups, *tmp;
3229 groups = gtk_ui_manager_get_action_groups(window->
ui_merge);
3230 for (tmp = groups; tmp; tmp = g_list_next(tmp))
3232 action = gtk_action_group_get_action(GTK_ACTION_GROUP(tmp->data), name);
3246 const gchar *group_name)
3251 g_return_val_if_fail (GNC_IS_MAIN_WINDOW (window), NULL);
3252 g_return_val_if_fail (group_name != NULL, NULL);
3254 priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
3266 gnc_main_window_update_tab_position (gpointer prefs, gchar *pref, gpointer user_data)
3269 GtkPositionType position = GTK_POS_TOP;
3272 window = GNC_MAIN_WINDOW(user_data);
3274 ENTER (
"window %p", window);
3276 position = GTK_POS_BOTTOM;
3278 position = GTK_POS_LEFT;
3280 position = GTK_POS_RIGHT;
3282 priv = GNC_MAIN_WINDOW_GET_PRIVATE (window);
3283 gtk_notebook_set_tab_pos (GTK_NOTEBOOK (priv->
notebook), position);
3292 gnc_main_window_update_edit_actions_sensitivity (
GncMainWindow *window, gboolean hide)
3296 GtkWidget *widget = gtk_window_get_focus (GTK_WINDOW (window));
3298 gboolean can_copy = FALSE, can_cut = FALSE, can_paste = FALSE;
3300 priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
3302 if (page && GNC_PLUGIN_PAGE_GET_CLASS(page)->update_edit_menu_actions)
3304 (GNC_PLUGIN_PAGE_GET_CLASS(page)->update_edit_menu_actions)(page, hide);
3308 if (GTK_IS_EDITABLE (widget))
3310 gboolean has_selection;
3312 has_selection = gtk_editable_get_selection_bounds
3313 (GTK_EDITABLE (widget), NULL, NULL);
3315 can_copy = has_selection;
3316 can_cut = has_selection;
3319 else if (GTK_IS_TEXT_VIEW (widget))
3321 gboolean has_selection;
3322 GtkTextBuffer *text_buffer;
3324 text_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW(widget));
3325 has_selection = gtk_text_buffer_get_selection_bounds
3326 (text_buffer, NULL, NULL);
3328 can_copy = has_selection;
3329 can_cut = has_selection;
3334 #ifdef ORIGINAL_EPIPHANY_CODE
3336 can_copy = can_cut = can_paste = TRUE;
3340 can_copy = can_cut = can_paste = FALSE;
3345 gtk_action_set_sensitive (action, can_copy);
3346 gtk_action_set_visible (action, !hide || can_copy);
3348 gtk_action_set_sensitive (action, can_cut);
3349 gtk_action_set_visible (action, !hide || can_cut);
3351 gtk_action_set_sensitive (action, can_paste);
3352 gtk_action_set_visible (action, !hide || can_paste);
3356 gnc_main_window_enable_edit_actions_sensitivity (
GncMainWindow *window)
3361 gtk_action_set_sensitive (action, TRUE);
3362 gtk_action_set_visible (action, TRUE);
3364 gtk_action_set_sensitive (action, TRUE);
3365 gtk_action_set_visible (action, TRUE);
3367 gtk_action_set_sensitive (action, TRUE);
3368 gtk_action_set_visible (action, TRUE);
3372 gnc_main_window_edit_menu_show_cb (GtkWidget *menu,
3375 gnc_main_window_update_edit_actions_sensitivity (window, FALSE);
3379 gnc_main_window_edit_menu_hide_cb (GtkWidget *menu,
3382 gnc_main_window_enable_edit_actions_sensitivity (window);
3388 GtkWidget *edit_menu_item, *edit_menu;
3390 edit_menu_item = gtk_ui_manager_get_widget
3391 (window->
ui_merge,
"/menubar/Edit");
3392 edit_menu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (edit_menu_item));
3394 g_signal_connect (edit_menu,
"show",
3395 G_CALLBACK (gnc_main_window_edit_menu_show_cb), window);
3396 g_signal_connect (edit_menu,
"hide",
3397 G_CALLBACK (gnc_main_window_edit_menu_hide_cb), window);
3409 GtkWidget *statusbar;
3413 action_status_destroy (gpointer data)
3417 g_object_unref (action_status->action);
3418 g_object_unref (action_status->statusbar);
3420 g_free (action_status);
3424 set_tip (GtkWidget *widget)
3429 data = g_object_get_data (G_OBJECT (widget),
"action-status");
3433 g_object_get (data->action,
"tooltip", &tooltip, NULL);
3435 gtk_statusbar_push (GTK_STATUSBAR (data->statusbar), 0,
3436 tooltip ? tooltip :
"");
3443 unset_tip (GtkWidget *widget)
3447 data = g_object_get_data (G_OBJECT (widget),
"action-status");
3450 gtk_statusbar_pop (GTK_STATUSBAR (data->statusbar), 0);
3454 connect_proxy (GtkUIManager *merge,
3457 GtkWidget *statusbar)
3459 if (GTK_IS_MENU_ITEM (proxy))
3463 data = g_object_get_data (G_OBJECT (proxy),
"action-status");
3466 g_object_unref (data->action);
3467 g_object_unref (data->statusbar);
3469 data->action = g_object_ref (action);
3470 data->statusbar = g_object_ref (statusbar);
3476 data->action = g_object_ref (action);
3477 data->statusbar = g_object_ref (statusbar);
3479 g_object_set_data_full (G_OBJECT (proxy),
"action-status",
3480 data, action_status_destroy);
3482 g_signal_connect (proxy,
"select", G_CALLBACK (set_tip), NULL);
3483 g_signal_connect (proxy,
"deselect", G_CALLBACK (unset_tip), NULL);
3493 #ifdef MAC_INTEGRATION
3499 GError *error = NULL;
3501 merge_id = gtk_ui_manager_add_ui_from_file(window->
ui_merge, filename,
3505 #ifndef MAC_INTEGRATION
3506 priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
3507 gtk_action_group_add_radio_actions (priv->
action_group,
3508 radio_entries, n_radio_entries,
3510 G_CALLBACK(gnc_main_window_cmd_window_raise),
3519 GtkWidget *main_vbox;
3523 GError *error = NULL;
3529 g_signal_connect (G_OBJECT (window),
"delete-event",
3530 G_CALLBACK (gnc_main_window_delete_event), window);
3533 main_vbox = gtk_vbox_new (FALSE, 0);
3534 gtk_widget_show (main_vbox);
3535 gtk_container_add (GTK_CONTAINER (window), main_vbox);
3537 priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
3538 priv->
menu_dock = gtk_vbox_new (FALSE, 0);
3540 gtk_box_pack_start (GTK_BOX (main_vbox), priv->
menu_dock,
3543 priv->
notebook = gtk_notebook_new ();
3544 g_object_set(G_OBJECT(priv->
notebook),
3546 "enable-popup", TRUE,
3549 g_signal_connect (G_OBJECT (priv->
notebook),
"switch-page",
3550 G_CALLBACK (gnc_main_window_switch_page), window);
3551 g_signal_connect (G_OBJECT (priv->
notebook),
"page-reordered",
3552 G_CALLBACK (gnc_main_window_page_reordered), window);
3553 gtk_box_pack_start (GTK_BOX (main_vbox), priv->
notebook,
3558 gtk_box_pack_start (GTK_BOX (main_vbox), priv->
statusbar,
3560 gtk_statusbar_set_has_resize_grip( GTK_STATUSBAR(priv->
statusbar), TRUE );
3563 gtk_progress_bar_set_text(GTK_PROGRESS_BAR(priv->
progressbar),
" ");
3567 gtk_progress_bar_set_pulse_step(GTK_PROGRESS_BAR(priv->
progressbar),
3570 window->
ui_merge = gtk_ui_manager_new ();
3573 priv->
action_group = gtk_action_group_new (
"MainWindowActions");
3575 gtk_action_group_add_actions (priv->
action_group, gnc_menu_actions,
3576 gnc_menu_n_actions, window);
3577 gtk_action_group_add_toggle_actions (priv->
action_group,
3578 toggle_actions, n_toggle_actions,
3581 initially_insensitive_actions,
3582 "sensitive", FALSE);
3584 always_insensitive_actions,
3585 "sensitive", FALSE);
3587 always_hidden_actions,
3590 gnc_menu_important_actions);
3593 g_signal_connect (G_OBJECT (window->
ui_merge),
"add_widget",
3594 G_CALLBACK (gnc_main_window_add_widget), window);
3597 g_signal_connect (G_OBJECT (window->
ui_merge),
"connect-proxy",
3598 G_CALLBACK (connect_proxy), priv->
statusbar);
3603 g_assert (filename);
3605 merge_id = gtk_ui_manager_add_ui_from_file (window->
ui_merge,
3607 g_assert(merge_id || error);
3610 gtk_window_add_accel_group (GTK_WINDOW (window),
3611 gtk_ui_manager_get_accel_group(window->
ui_merge));
3612 gtk_ui_manager_ensure_update (window->
ui_merge);
3616 g_critical(
"Failed to load ui file.\n Filename %s\n Error %s",
3617 filename, error->message);
3618 g_error_free(error);
3619 g_assert(merge_id != 0);
3622 gnc_main_window_window_menu(window);
3624 GNC_PREF_TAB_POSITION_TOP,
3625 gnc_main_window_update_tab_position,
3628 GNC_PREF_TAB_POSITION_BOTTOM,
3629 gnc_main_window_update_tab_position,
3632 GNC_PREF_TAB_POSITION_LEFT,
3633 gnc_main_window_update_tab_position,
3636 GNC_PREF_TAB_POSITION_RIGHT,
3637 gnc_main_window_update_tab_position,
3639 gnc_main_window_update_tab_position(NULL, NULL, window);
3641 gnc_main_window_init_menu_updaters(window);
3645 if (!gnc_prefs_is_extra_enabled())
3649 action = gtk_action_group_get_action(priv->
action_group,
3650 "ExtensionsAction");
3651 gtk_action_set_visible(action, FALSE);
3657 g_list_foreach (plugins, gnc_main_window_add_plugin, window);
3658 g_list_free (plugins);
3660 g_signal_connect (G_OBJECT (manager),
"plugin-added",
3661 G_CALLBACK (gnc_main_window_plugin_added), window);
3662 g_signal_connect (G_OBJECT (manager),
"plugin-removed",
3663 G_CALLBACK (gnc_main_window_plugin_removed), window);
3668 #ifdef MAC_INTEGRATION
3677 gnc_quartz_shutdown (GtkosxApplication *theApp, gpointer data)
3689 gnc_quartz_should_quit (GtkosxApplication *theApp,
GncMainWindow *window)
3692 gboolean needs_save;
3695 gnc_file_save_in_progress())
3699 session = gnc_get_current_session();
3701 !gnc_file_save_in_progress();
3702 if (needs_save && gnc_main_window_prompt_for_save(GTK_WIDGET(window)))
3705 g_timeout_add(250, gnc_main_window_timed_quit, NULL);
3712 GtkosxApplication *theApp = g_object_new(GTKOSX_TYPE_APPLICATION, NULL);
3716 menu = gtk_ui_manager_get_widget (window->
ui_merge,
"/menubar");
3717 if (GTK_IS_MENU_ITEM (menu))
3718 menu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (menu));
3719 gtk_widget_hide(menu);
3720 gtkosx_application_set_menu_bar (theApp, GTK_MENU_SHELL (menu));
3722 item = gtk_ui_manager_get_widget (window->
ui_merge,
3723 "/menubar/File/FileQuit");
3724 if (GTK_IS_MENU_ITEM (item))
3725 gtk_widget_hide (GTK_WIDGET (item));
3727 item = gtk_ui_manager_get_widget (window->
ui_merge,
3728 "/menubar/Help/HelpAbout");
3729 if (GTK_IS_MENU_ITEM (item))
3731 gtkosx_application_insert_app_menu_item (theApp, GTK_WIDGET (item), 0);
3734 item = gtk_ui_manager_get_widget (window->
ui_merge,
3735 "/menubar/Edit/EditPreferences");
3736 if (GTK_IS_MENU_ITEM (item))
3738 gtkosx_application_insert_app_menu_item (theApp,
3739 gtk_separator_menu_item_new (), 1);
3740 gtkosx_application_insert_app_menu_item (theApp, GTK_WIDGET (item), 2);
3743 item = gtk_ui_manager_get_widget (window->
ui_merge,
3745 gtkosx_application_set_help_menu(theApp, GTK_MENU_ITEM(item));
3746 item = gtk_ui_manager_get_widget (window->
ui_merge,
3747 "/menubar/Windows");
3748 gtkosx_application_set_window_menu(theApp, GTK_MENU_ITEM(item));
3749 g_signal_connect(theApp,
"NSApplicationBlockTermination",
3750 G_CALLBACK(gnc_quartz_should_quit), window);
3751 gtkosx_application_set_use_quartz_accelerators (theApp, FALSE);
3752 g_object_unref (theApp);
3755 #endif //MAC_INTEGRATION
3759 gnc_main_window_add_widget (GtkUIManager *merge,
3765 priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
3766 if (GTK_IS_TOOLBAR (widget))
3771 gtk_box_pack_start (GTK_BOX (priv->
menu_dock), widget, FALSE, FALSE, 0);
3772 gtk_widget_show (widget);
3788 gnc_main_window_show_summarybar (
GncMainWindow *window, GtkAction *action)
3792 priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
3794 action = gtk_action_group_get_action(priv->
action_group,
3795 "ViewSummaryAction");
3798 return gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(action));
3811 gnc_main_window_switch_page (GtkNotebook *notebook,
3812 gpointer *notebook_page,
3819 gboolean immutable, visible;
3821 ENTER(
"Notebook %p, page, %p, index %d, window %p",
3822 notebook, notebook_page, pos, window);
3823 g_return_if_fail (GNC_IS_MAIN_WINDOW (window));
3825 priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
3830 gnc_plugin_page_unselected (page);
3833 child = gtk_notebook_get_nth_page (notebook, pos);
3849 visible = gnc_main_window_show_summarybar(window, NULL);
3853 gnc_plugin_page_selected (page);
3854 gnc_window_update_status (GNC_WINDOW(window), page);
3862 multiple_page_actions,
3866 gnc_main_window_update_title(window);
3867 #ifndef MAC_INTEGRATION
3868 gnc_main_window_update_menu_item(window);
3870 g_signal_emit (window, main_window_signals[PAGE_CHANGED], 0, page);
3881 gnc_main_window_page_reordered (GtkNotebook *notebook,
3890 ENTER(
"Notebook %p, child %p, index %d, window %p",
3891 notebook, child, pos, window);
3892 g_return_if_fail (GNC_IS_MAIN_WINDOW (window));
3896 priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
3902 if (!old_link)
return;
3913 gnc_main_window_plugin_added (
GncPlugin *manager,
3917 g_return_if_fail (GNC_IS_MAIN_WINDOW (window));
3918 g_return_if_fail (GNC_IS_PLUGIN (plugin));
3924 gnc_main_window_plugin_removed (
GncPlugin *manager,
3928 g_return_if_fail (GNC_IS_MAIN_WINDOW (window));
3929 g_return_if_fail (GNC_IS_PLUGIN (plugin));
3937 gnc_main_window_cmd_page_setup (GtkAction *action,
3940 GtkWindow *gtk_window;
3942 g_return_if_fail(GNC_IS_MAIN_WINDOW(window));
3944 gtk_window = gnc_window_get_gtk_window(GNC_WINDOW(window));
3949 gnc_book_options_dialog_apply_cb(
GNCOptionWin * optionwin,
3953 gboolean use_split_action_for_num_before =
3955 gboolean use_split_action_for_num_after;
3956 QofBook *book = gnc_get_current_book ();
3958 if (!options)
return;
3960 gnc_option_db_commit (options);
3961 qof_book_begin_edit (book);
3962 qof_book_save_options (book, gnc_option_db_save_to_kvp, options, TRUE);
3963 use_split_action_for_num_after =
3965 if (use_split_action_for_num_before != use_split_action_for_num_after)
3967 qof_book_commit_edit (book);
3971 gnc_book_options_dialog_close_cb(
GNCOptionWin * optionwin,
3976 gnc_options_dialog_destroy(optionwin);
3977 gnc_option_db_destroy(options);
3983 QofBook *book = gnc_get_current_book ();
3987 options = gnc_option_db_new_for_type (QOF_ID_BOOK);
3988 qof_book_load_options (book, gnc_option_db_load_from_kvp, options);
3989 gnc_option_db_clean (options);
3991 optionwin = gnc_options_dialog_new_modal (modal,
3992 (title ? title : _(
"Book Options")));
3993 gnc_options_dialog_build_contents (optionwin, options);
3997 gnc_options_dialog_set_apply_cb (optionwin,
3998 gnc_book_options_dialog_apply_cb,
4000 gnc_options_dialog_set_close_cb (optionwin,
4001 gnc_book_options_dialog_close_cb,
4005 return gnc_options_dialog_widget (optionwin);
4009 gnc_main_window_cmd_file_properties (GtkAction *action,
GncMainWindow *window)
4015 gnc_main_window_cmd_file_close (GtkAction *action,
GncMainWindow *window)
4020 g_return_if_fail(GNC_IS_MAIN_WINDOW(window));
4022 priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
4028 gnc_main_window_cmd_file_quit (GtkAction *action,
GncMainWindow *window)
4033 gnc_main_window_quit(window);
4037 gnc_main_window_cmd_edit_cut (GtkAction *action,
GncMainWindow *window)
4039 GtkWidget *widget = gtk_window_get_focus (GTK_WINDOW (window));
4040 GtkTextBuffer *text_buffer;
4041 GtkClipboard *clipboard;
4044 if (GTK_IS_EDITABLE (widget))
4046 gtk_editable_cut_clipboard (GTK_EDITABLE (widget));
4048 else if (GTK_IS_TEXT_VIEW (widget))
4050 text_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW(widget));
4051 clipboard = gtk_widget_get_clipboard (GTK_WIDGET(text_buffer),
4052 GDK_SELECTION_CLIPBOARD);
4053 editable = gtk_text_view_get_editable (GTK_TEXT_VIEW (widget));
4054 gtk_text_buffer_cut_clipboard (text_buffer, clipboard, editable);
4059 gnc_main_window_cmd_edit_copy (GtkAction *action,
GncMainWindow *window)
4061 GtkWidget *widget = gtk_window_get_focus (GTK_WINDOW (window));
4062 GtkTextBuffer *text_buffer;
4063 GtkClipboard *clipboard;
4065 if (GTK_IS_EDITABLE (widget))
4067 gtk_editable_copy_clipboard (GTK_EDITABLE (widget));
4069 else if (GTK_IS_TEXT_VIEW (widget))
4071 text_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW(widget));
4072 clipboard = gtk_widget_get_clipboard (GTK_WIDGET(text_buffer),
4073 GDK_SELECTION_CLIPBOARD);
4074 gtk_text_buffer_copy_clipboard (text_buffer, clipboard);
4079 gnc_main_window_cmd_edit_paste (GtkAction *action,
GncMainWindow *window)
4081 GtkWidget *widget = gtk_window_get_focus (GTK_WINDOW (window));
4082 GtkTextBuffer *text_buffer;
4083 GtkClipboard *clipboard;
4085 if (GTK_IS_EDITABLE (widget))
4087 gtk_editable_paste_clipboard (GTK_EDITABLE (widget));
4089 else if (GTK_IS_TEXT_VIEW (widget))
4091 text_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW(widget));
4092 clipboard = gtk_widget_get_clipboard (GTK_WIDGET(text_buffer),
4093 GDK_SELECTION_CLIPBOARD);
4094 gtk_text_buffer_paste_clipboard (text_buffer, clipboard, NULL, FALSE);
4099 gnc_main_window_cmd_edit_preferences (GtkAction *action,
GncMainWindow *window)
4105 gnc_main_window_cmd_view_refresh (GtkAction *action,
GncMainWindow *window)
4110 gnc_main_window_cmd_actions_reset_warnings (GtkAction *action,
GncMainWindow *window)
4112 gnc_reset_warnings_dialog(GTK_WINDOW(window));
4116 gnc_main_window_cmd_actions_rename_page (GtkAction *action,
GncMainWindow *window)
4120 GtkWidget *label, *entry;
4123 priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
4127 LEAVE(
"No current page");
4131 if (!main_window_find_tab_items(window, page, &label, &entry))
4133 LEAVE(
"can't find required widgets");
4137 gtk_entry_set_text(GTK_ENTRY(entry), gtk_label_get_text(GTK_LABEL(label)));
4138 gtk_editable_select_region(GTK_EDITABLE(entry), 0, -1);
4139 gtk_widget_hide(label);
4140 gtk_widget_show(entry);
4141 gtk_widget_grab_focus(entry);
4142 LEAVE(
"opened for editing");
4146 gnc_main_window_cmd_view_toolbar (GtkAction *action,
GncMainWindow *window)
4150 priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
4151 if (gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(action)))
4153 gtk_widget_show (priv->
toolbar);
4157 gtk_widget_hide (priv->
toolbar);
4162 gnc_main_window_cmd_view_summary (GtkAction *action,
GncMainWindow *window)
4168 priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
4169 visible = gnc_main_window_show_summarybar(window, action);
4177 gnc_main_window_cmd_view_statusbar (GtkAction *action,
GncMainWindow *window)
4181 priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
4182 if (gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(action)))
4193 gnc_main_window_cmd_window_new (GtkAction *action,
GncMainWindow *window)
4200 gtk_widget_show(GTK_WIDGET(new_window));
4205 gnc_main_window_cmd_window_move_page (GtkAction *action,
GncMainWindow *window)
4210 GtkNotebook *notebook;
4211 GtkWidget *tab_widget, *menu_widget;
4213 ENTER(
"action %p,window %p", action, window);
4216 priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
4220 LEAVE(
"invalid page");
4225 LEAVE(
"invalid notebook_page");
4229 notebook = GTK_NOTEBOOK (priv->
notebook);
4230 tab_widget = gtk_notebook_get_tab_label (notebook, page->
notebook_page);
4231 menu_widget = gtk_notebook_get_menu_label (notebook, page->
notebook_page);
4235 g_object_ref(tab_widget);
4236 g_object_ref(menu_widget);
4238 gnc_main_window_disconnect(window, page);
4242 gtk_widget_show(GTK_WIDGET(new_window));
4245 gnc_main_window_connect (new_window, page, tab_widget, menu_widget);
4249 g_object_unref(menu_widget);
4250 g_object_unref(tab_widget);
4251 g_object_unref(page);
4254 DEBUG(
"Moved page %p from window %p to new window %p",
4255 page, window, new_window);
4256 DEBUG(
"Old window current is %p, new window current is %p",
4259 LEAVE(
"page moved");
4262 #ifndef MAC_INTEGRATION
4264 gnc_main_window_cmd_window_raise (GtkAction *action,
4265 GtkRadioAction *current,
4271 g_return_if_fail(GTK_IS_ACTION(action));
4272 g_return_if_fail(GTK_IS_RADIO_ACTION(current));
4273 g_return_if_fail(GNC_IS_MAIN_WINDOW(old_window));
4275 ENTER(
"action %p, current %p, window %p", action, current, old_window);
4276 value = gtk_radio_action_get_current_value(current);
4277 new_window = g_list_nth_data(active_windows, value);
4278 gtk_window_present(GTK_WINDOW(new_window));
4281 g_idle_add((GSourceFunc)gnc_main_window_update_radio_button, old_window);
4287 gnc_main_window_cmd_help_tutorial (GtkAction *action,
GncMainWindow *window)
4293 gnc_main_window_cmd_help_contents (GtkAction *action,
GncMainWindow *window)
4308 get_file (
const gchar *partial)
4310 gchar *filename, *text = NULL;
4314 if (filename && g_file_get_contents(filename, &text, &length, NULL))
4338 get_file_strsplit (
const gchar *partial)
4340 gchar *text, **lines;
4342 text = get_file(partial);
4346 lines = g_strsplit_set(text,
"\r\n", -1);
4357 url_signal_cb (GtkAboutDialog *dialog, gchar *uri, gpointer data)
4370 gnc_main_window_cmd_help_about (GtkAction *action,
GncMainWindow *window)
4374 priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
4378 const gchar *fixed_message = _(
"The GnuCash personal finance manager. "
4379 "The GNU way to manage your money!");
4380 const gchar *copyright = _(
"© 1997-2014 Contributors");
4381 gchar **authors = get_file_strsplit(
"AUTHORS");
4382 gchar **documenters = get_file_strsplit(
"DOCUMENTERS");
4383 gchar *license = get_file(
"LICENSE");
4393 message = g_strdup_printf(_(
"%s\nThis copy was built from %s rev %s on %s."),
4394 fixed_message, GNUCASH_SCM, GNUCASH_SCM_REV,
4395 GNUCASH_BUILD_DATE);
4400 message = g_strdup_printf(_(
"%s\nThis copy was built from rev %s on %s."),
4401 fixed_message, GNUCASH_SCM_REV,
4402 GNUCASH_BUILD_DATE);
4407 "documenters", documenters,
4408 "comments", message,
4409 "copyright", copyright,
4417 "translator-credits", _(
"translator_credits"),
4419 "website",
"http://www.gnucash.org",
4423 if (license) g_free(license);
4424 if (documenters) g_strfreev(documenters);
4425 if (authors) g_strfreev(authors);
4426 g_object_unref (logo);
4428 G_CALLBACK (url_signal_cb), NULL);
4430 G_CALLBACK (gtk_widget_hide), NULL);
4431 gtk_window_set_transient_for (GTK_WINDOW (priv->
about_dialog),
4432 GTK_WINDOW (window));
4446 #ifdef MAC_INTEGRATION
4447 GtkosxApplication *theApp = g_object_new(GTKOSX_TYPE_APPLICATION, NULL);
4449 for (window_iter = active_windows; window_iter != NULL; window_iter = window_iter->next)
4451 gtk_widget_show(GTK_WIDGET(window_iter->data));
4453 #ifdef MAC_INTEGRATION
4454 g_signal_connect(theApp,
"NSApplicationWillTerminate",
4455 G_CALLBACK(gnc_quartz_shutdown), NULL);
4456 gtkosx_application_ready(theApp);
4457 g_object_unref (theApp);
4470 for (window = active_windows; window; window = window->next)
4471 if (gtk_window_is_active (GTK_WINDOW (window->data)))
4472 return window->data;
4484 gnc_main_window_get_gtk_window (GncWindow *window)
4486 g_return_val_if_fail (GNC_IS_MAIN_WINDOW (window), NULL);
4487 return GTK_WINDOW(window);
4497 gnc_main_window_get_statusbar (GncWindow *window_in)
4502 g_return_val_if_fail (GNC_IS_MAIN_WINDOW (window_in), NULL);
4504 window = GNC_MAIN_WINDOW(window_in);
4505 priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
4516 gnc_main_window_get_progressbar (GncWindow *window_in)
4521 g_return_val_if_fail (GNC_IS_MAIN_WINDOW (window_in), NULL);
4523 window = GNC_MAIN_WINDOW(window_in);
4524 priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
4530 gnc_main_window_all_ui_set_sensitive (GncWindow *unused, gboolean sensitive)
4534 GList *groupp, *groups, *winp, *tmp;
4535 GtkWidget *close_button;
4537 for (winp = active_windows; winp; winp = g_list_next(winp))
4539 window = winp->data;
4540 priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
4542 groups = gtk_ui_manager_get_action_groups(window->
ui_merge);
4543 for (groupp = groups; groupp; groupp = g_list_next(groupp))
4545 gtk_action_group_set_sensitive(GTK_ACTION_GROUP(groupp->data), sensitive);
4550 close_button = g_object_get_data(tmp->data, PLUGIN_PAGE_CLOSE_BUTTON);
4553 gtk_widget_set_sensitive (close_button, sensitive);
4566 iface->get_gtk_window = gnc_main_window_get_gtk_window;
4567 iface->get_statusbar = gnc_main_window_get_statusbar;
4568 iface->get_progressbar = gnc_main_window_get_progressbar;
4569 iface->ui_set_sensitive = gnc_main_window_all_ui_set_sensitive;
4581 gncwin = GNC_WINDOW(window);
4582 gnc_window_set_progressbar_window(gncwin);
4601 GtkUIManager *ui_merge;
4603 int button, event_time;
4605 g_return_if_fail(GNC_IS_PLUGIN_PAGE(page));
4607 ENTER(
"page %p, event %p", page, event);
4609 if (ui_merge == NULL)
4611 LEAVE(
"no ui merge");
4615 menu = gtk_ui_manager_get_widget(ui_merge,
"/MainPopup");
4624 button =
event->button;
4625 event_time =
event->time;
4630 event_time = gtk_get_current_event_time ();
4633 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, button, event_time);
4652 gnc_main_window_popup_menu_cb (GtkWidget *widget,
4655 ENTER(
"widget %p, page %p", widget, page);
4656 do_popup_menu(page, NULL);
4668 GdkEventButton *event,
4671 g_return_val_if_fail(GNC_IS_PLUGIN_PAGE(page), FALSE);
4673 ENTER(
"widget %p, event %p, page %p", whatever, event, page);
4675 if (event->button == 3 && event->type == GDK_BUTTON_PRESS)
4677 do_popup_menu(page, event);
4678 LEAVE(
"menu shown");
4682 LEAVE(
"other click");
4689 dgettext_swapped (
const gchar *msgid,
4690 const gchar *domainname)
4694 return (msgid && *msgid) ? dgettext (domainname, msgid) : (gchar*) msgid;
4708 const gchar *domain)
4710 g_return_if_fail (GTK_IS_ACTION_GROUP (action_group));
4712 gtk_action_group_set_translate_func (action_group,
4713 (GtkTranslateFunc)dgettext_swapped,
4726 for (tmp = active_windows; tmp; tmp = g_list_next(tmp))
4729 gtk_action_set_sensitive (action, sensitive);
struct GncMainWindowPrivate GncMainWindowPrivate
gboolean gnc_plugin_page_finish_pending(GncPluginPage *page)
GtkActionGroup * action_group
Functions to load, save and get gui state.
gboolean gnc_plugin_page_has_books(GncPluginPage *page)
gboolean gnc_plugin_page_get_use_new_window(GncPluginPage *page)
void gnc_main_window_restore_all_windows(const GKeyFile *keyfile)
GtkWidget * gnc_book_options_dialog_cb(gboolean modal, gchar *title)
void gnc_plugin_page_destroy_widget(GncPluginPage *plugin_page)
void qof_book_set_dirty_cb(QofBook *book, QofBookDirtyCB cb, gpointer user_data)
const GList * gnc_gobject_tracking_get_list(const gchar *name)
gboolean gnc_main_window_button_press_cb(GtkWidget *whatever, GdkEventButton *event, GncPluginPage *page)
gulong gnc_prefs_register_cb(const char *group, const gchar *pref_name, gpointer func, gpointer user_data)
gboolean gnc_uri_is_file_uri(const gchar *uri)
utility functions for the GnuCash UI
#define PINFO(format, args...)
void gnc_gobject_tracking_remember(GObject *object, GObjectClass *klass)
QofBackendError
The errors that can be reported to the GUI & other front-end users.
const gchar * gnc_plugin_page_get_page_long_name(GncPluginPage *page)
void gnc_gobject_tracking_forget(GObject *object)
time64 qof_book_get_session_dirty_time(const QofBook *book)
#define DEBUG(format, args...)
const gchar * gnc_plugin_page_get_page_name(GncPluginPage *page)
Functions that are supported by all types of windows.
gboolean qof_book_use_split_action_for_num_field(const QofBook *book)
void gnc_plugin_page_merge_actions(GncPluginPage *page, GtkUIManager *ui_merge)
GKeyFile helper routines.
Plugin management functions for the GnuCash UI.
GDateTime * gnc_g_date_time_new_from_unix_local(time64 time)
void gnc_book_option_num_field_source_change_cb(gboolean num_action)
gchar * gnc_uri_get_path(const gchar *uri)
const gchar * gnc_plugin_page_get_page_color(GncPluginPage *page)
void gnc_plugin_page_set_page_long_name(GncPluginPage *page, const char *name)
gchar * gnc_filepath_locate_ui_file(const gchar *name)
void gnc_engine_add_commit_error_callback(EngineCommitErrorCallback cb, gpointer data)
void gnc_shutdown(int exit_status)
void gnc_ui_page_setup(GtkWindow *parent)
void gnc_main_window_unmerge_actions(GncMainWindow *window, const gchar *group_name)
#define ENTER(format, args...)
void gnc_main_window_show_all_windows(void)
void gnc_main_window_merge_actions(GncMainWindow *window, const gchar *group_name, GtkActionEntry *actions, guint n_actions, GtkToggleActionEntry *toggle_actions, guint n_toggle_actions, const gchar *filename, gpointer user_data)
void gnc_main_window_display_page(GncPluginPage *page)
void gnc_main_window_save_all_windows(GKeyFile *keyfile)
GncPluginPage * gnc_main_window_get_current_page(GncMainWindow *window)
void gnc_main_window_open_page(GncMainWindow *window, GncPluginPage *page)
gint gnc_prefs_get_int(const gchar *group, const gchar *pref_name)
Functions for adding content to a window.
gint qof_event_register_handler(QofEventHandler handler, gpointer handler_data)
Register a handler for events.
#define PWARN(format, args...)
void gnc_plugin_page_unmerge_actions(GncPluginPage *page, GtkUIManager *ui_merge)
GtkWidget * gnc_plugin_page_create_widget(GncPluginPage *plugin_page)
void gnc_main_window_all_action_set_sensitive(const gchar *action_name, gboolean sensitive)
QofBook * qof_session_get_book(const QofSession *session)
#define QOF_CHECK_TYPE(obj, type)
void main_window_update_page_color(GncPluginPage *page, const gchar *color_in)
gchar * gnc_uri_normalize_uri(const gchar *uri, gboolean allow_password)
gchar * gnc_filepath_locate_doc_file(const gchar *name)
void qof_book_mark_session_saved(QofBook *book)
void gnc_plugin_page_set_use_new_window(GncPluginPage *page, gboolean use_new)
GType gnc_main_window_get_type(void)
gboolean gnc_plugin_page_has_book(GncPluginPage *page, QofBook *book)
void gnc_options_dialog_set_book_options_help_cb(GNCOptionWin *win)
void qof_event_unregister_handler(gint handler_id)
Unregister an event handler.
GncPluginManager * gnc_plugin_manager_get(void)
Gnome specific utility functions.
void gnc_plugin_page_save_page(GncPluginPage *page, GKeyFile *key_file, const gchar *group_name)
#define PLUGIN_PAGE_LABEL
Dialog for handling user preferences.
gboolean qof_book_session_not_saved(const QofBook *book)
void gnc_gnome_help(const char *file_name, const char *anchor)
All type declarations for the whole Gnucash engine.
struct GncMainWindow GncMainWindow
gboolean gnc_main_window_finish_pending(GncMainWindow *window)
Generic api to store and retrieve preferences.
Utility functions for file access.
void gnc_preferences_dialog(void)
GtkActionGroup * gnc_main_window_get_action_group(GncMainWindow *window, const gchar *group_name)
void gnc_launch_assoc(const char *uri)
gboolean qof_book_is_readonly(const QofBook *book)
GncMainWindow * gnc_main_window_new(void)
void gnc_plugin_page_set_page_color(GncPluginPage *page, const char *color)
void gnc_main_window_manual_merge_actions(GncMainWindow *window, const gchar *group_name, GtkActionGroup *group, guint merge_id)
void gnc_options_dialog_set_new_book_option_values(GNCOptionDB *odb)
GdkPixbuf * gnc_gnome_get_gdkpixbuf(const char *name)
gboolean gnc_prefs_get_bool(const gchar *group, const gchar *pref_name)
GHashTable * merged_actions_table
void gnc_main_window_close_page(GncPluginPage *page)
Functions for adding plugins to a GnuCash window.
GtkActionGroup * action_group
#define LEAVE(format, args...)
GList * gnc_plugin_manager_get_plugins(GncPluginManager *manager)
void gnc_plugin_page_set_page_name(GncPluginPage *page, const char *name)
time64 gnc_time(time64 *tbuf)
get the current local time
Utility functions for convert uri in separate components and back.
GncPluginPage * current_page
GtkWidget * gnc_ui_get_toplevel(void)
GtkUIManager * gnc_plugin_page_get_ui_merge(GncPluginPage *page)
void gnc_main_window_restore_default_state(GncMainWindow *window)
File path resolution utility functions.
gboolean gnc_main_window_all_finish_pending(void)
void gnc_gtk_action_group_set_translation_domain(GtkActionGroup *action_group, const gchar *domain)
void gnc_main_window_actions_updated(GncMainWindow *window)
void main_window_update_page_name(GncPluginPage *page, const gchar *name_in)
GtkWidget * notebook_page
GncPluginPage * gnc_plugin_page_recreate_page(GtkWidget *window, const gchar *page_type, GKeyFile *key_file, const gchar *page_group)
void gnc_plugin_page_show_summarybar(GncPluginPage *page, gboolean visible)
GtkUIManager * gnc_main_window_get_uimanager(GncMainWindow *window)
GtkAction * gnc_main_window_find_action(GncMainWindow *window, const gchar *name)
const gchar * QofLogModule
void gnc_main_window_set_progressbar_window(GncMainWindow *window)
void gnc_prefs_remove_cb_by_func(const gchar *group, const gchar *pref_name, gpointer func, gpointer user_data)
gdouble gnc_prefs_get_float(const gchar *group, const gchar *pref_name)
const gchar * gnc_plugin_page_get_plugin_name(GncPluginPage *plugin_page)