GnuCash  5.6-150-g038405b370+
Files | Data Structures | Macros | Typedefs | Enumerations | Functions | Variables
Main Window functions.

Files

file  gnc-main-window.h
 Functions for adding content to a window.
 

Data Structures

struct  GncMainWindow
 The instance data structure for a main window object. More...
 
struct  GncMainWindowPrivate
 The instance private data structure for an embedded window object. More...
 
struct  GncMainWindowSaveData
 
struct  menu_update
 This data structure is used to describe the requested state of a GAction, and is used to pass data among several functions. More...
 
struct  TabWidth
 This data structure allows the passing of the tab width and whether the tab layout is on the left or right. More...
 
struct  GncMenuUpdate
 
struct  GncMainWindowClass
 The class data structure for a main window object. More...
 
struct  GncMainWindowActionData
 
struct  GncToolBarShortNames
 A structure for defining alternate action names for use in the toolbar. More...
 

Macros

#define PLUGIN_PAGE_LABEL   "plugin-page"
 This label is used to provide a mapping from a visible page widget back to the corresponding GncPluginPage object. More...
 
#define PLUGIN_PAGE_CLOSE_BUTTON   "close-button"
 
#define PLUGIN_PAGE_TAB_LABEL   "label"
 
#define GNC_PREF_SHOW_CLOSE_BUTTON   "tab-close-buttons"
 
#define GNC_PREF_TAB_NEXT_RECENT   "tab-next-recent"
 
#define GNC_PREF_TAB_POSITION_TOP   "tab-position-top"
 
#define GNC_PREF_TAB_POSITION_BOTTOM   "tab-position-bottom"
 
#define GNC_PREF_TAB_POSITION_LEFT   "tab-position-left"
 
#define GNC_PREF_TAB_POSITION_RIGHT   "tab-position-right"
 
#define GNC_PREF_TAB_WIDTH   "tab-width"
 
#define GNC_PREF_TAB_COLOR   "show-account-color-tabs"
 
#define GNC_PREF_SAVE_CLOSE_EXPIRES   "save-on-close-expires"
 
#define GNC_PREF_SAVE_CLOSE_WAIT_TIME   "save-on-close-wait-time"
 
#define GNC_PREF_TAB_OPEN_ADJACENT   "tab-open-adjacent"
 
#define GNC_MAIN_WINDOW_NAME   "GncMainWindow"
 
#define DIALOG_BOOK_OPTIONS_CM_CLASS   "dialog-book-options"
 
#define MSG_AUTO_SAVE   _("Changes will be saved automatically in %u seconds")
 
#define WINDOW_COUNT   "WindowCount"
 
#define WINDOW_STRING   "Window %d"
 
#define WINDOW_GEOMETRY   "WindowGeometry"
 
#define WINDOW_POSITION   "WindowPosition"
 
#define WINDOW_MAXIMIZED   "WindowMaximized"
 
#define TOOLBAR_VISIBLE   "ToolbarVisible"
 
#define STATUSBAR_VISIBLE   "StatusbarVisible"
 
#define SUMMARYBAR_VISIBLE   "SummarybarVisible"
 
#define WINDOW_FIRSTPAGE   "FirstPage"
 
#define WINDOW_PAGECOUNT   "PageCount"
 
#define WINDOW_PAGEORDER   "PageOrder"
 
#define PAGE_TYPE   "PageType"
 
#define PAGE_NAME   "PageName"
 
#define PAGE_STRING   "Page %d"
 
#define GNC_TYPE_MAIN_WINDOW   (gnc_main_window_get_type ())
 
#define GNC_MAIN_WINDOW(obj)   (G_TYPE_CHECK_INSTANCE_CAST ((obj), GNC_TYPE_MAIN_WINDOW, GncMainWindow))
 
#define GNC_MAIN_WINDOW_CLASS(klass)   (G_TYPE_CHECK_CLASS_CAST ((klass), GNC_TYPE_MAIN_WINDOW, GncMainWindowClass))
 
#define GNC_IS_MAIN_WINDOW(obj)   (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GNC_TYPE_MAIN_WINDOW))
 
#define GNC_IS_MAIN_WINDOW_CLASS(klass)   (G_TYPE_CHECK_CLASS_TYPE ((klass), GNC_TYPE_MAIN_WINDOW))
 
#define GNC_MAIN_WINDOW_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS ((obj), GNC_TYPE_MAIN_WINDOW, GncMainWindowClass))
 
#define PLUGIN_PAGE_IMMUTABLE   "page-immutable"
 

Typedefs

typedef void(* GncMainWindowFunc) (GncMainWindow *window, GncPluginPage *page)
 
typedef void(* GncMainWindowPageFunc) (GncPluginPage *page, gpointer user_data)
 

Enumerations

enum  { PAGE_ADDED, PAGE_CHANGED, MENU_CHANGED, LAST_SIGNAL }
 Names of signals generated by the main window. More...
 

Functions

gboolean gnc_book_options_dialog_apply_helper (GncOptionDB *options)
 Processes selected options in the Book Options dialog: checks book_currency and use_split_action_for_num to see if features kvp should be set. More...
 
 G_DEFINE_TYPE_WITH_CODE (GncMainWindow, gnc_main_window, GTK_TYPE_APPLICATION_WINDOW, G_IMPLEMENT_INTERFACE(GNC_TYPE_WINDOW, gnc_window_main_window_init)) static guint main_window_signals[LAST_SIGNAL]
 A holding place for all the signals generated by the main window code. More...
 
gboolean gnc_main_window_is_restoring_pages (GncMainWindow *window)
 Check if the main window is restoring the plugin pages. More...
 
void gnc_main_window_foreach_page (GncMainWindowPageFunc fn, gpointer user_data)
 Iterator function to walk all pages in all windows, calling the specified function for each page. More...
 
void gnc_main_window_restore_all_windows (const GKeyFile *keyfile)
 Restore the persistent state of all windows. More...
 
void gnc_main_window_restore_default_state (GncMainWindow *window)
 Restore the persistent state of one window to a sane default.
 
void gnc_main_window_save_all_windows (GKeyFile *keyfile)
 Save the persistent state of all windows. More...
 
gboolean gnc_main_window_finish_pending (GncMainWindow *window)
 Tell a window to finish any outstanding activities. More...
 
gboolean gnc_main_window_all_finish_pending (void)
 Tell all pages in all windows to finish any outstanding activities. More...
 
void main_window_update_page_long_name (GncPluginPage *page, const gchar *long_name_in)
 Update the long name of the page in the main window. More...
 
void main_window_update_page_name (GncPluginPage *page, const gchar *name_in)
 Update the name of the page in the main window. More...
 
void main_window_update_page_color (GncPluginPage *page, const gchar *color_in)
 Update the color on the page tabs in the main window. More...
 
void main_window_update_page_set_read_only_icon (GncPluginPage *page, gboolean read_only)
 Update the icon on the page tabs in the main window. More...
 
GncMainWindow * gnc_main_window_new (void)
 Create a new gnc main window plugin. More...
 
void gnc_main_window_display_page (GncPluginPage *page)
 Bring the window containing the specified page to the top of the window stack, then switch the notebook to show the specified page. More...
 
void gnc_main_window_open_page (GncMainWindow *window, GncPluginPage *page)
 Display a data plugin page in a window. More...
 
void gnc_main_window_close_page (GncPluginPage *page)
 Remove a data plugin page from a window and display the previous page. More...
 
GncPluginPagegnc_main_window_get_current_page (GncMainWindow *window)
 Retrieve a pointer to the page that is currently at the front of the specified window. More...
 
void gnc_main_window_manual_merge_actions (GncMainWindow *window, const gchar *group_name, GSimpleActionGroup *group)
 Manually add a set of actions to the specified window. More...
 
void gnc_main_window_merge_actions (GncMainWindow *window, const gchar *group_name, GActionEntry *entries, guint n_entries, const gchar **ui_updates, const gchar *ui_filename, gpointer user_data)
 Add a set of actions to the specified window. More...
 
void gnc_main_window_unmerge_actions (GncMainWindow *window, const gchar *group_name)
 Remove a set of actions from the specified window. More...
 
GAction * gnc_main_window_find_action (GncMainWindow *window, const gchar *action_name)
 Find the GAction in the main window. More...
 
GAction * gnc_main_window_find_action_in_group (GncMainWindow *window, const gchar *group_name, const gchar *action_name)
 Find the GAction in a specific action group for window. More...
 
GSimpleActionGroup * gnc_main_window_get_action_group (GncMainWindow *window, const gchar *group_name)
 Retrieve a specific set of user interface actions from a window. More...
 
GtkWidget * gnc_main_window_toolbar_find_tool_item (GncMainWindow *window, const gchar *action_name)
 Find the toolbar item with the given action name for the window specified. More...
 
GtkWidget * gnc_main_window_menu_find_menu_item (GncMainWindow *window, const gchar *action_name)
 Find the menu item with the given action name for the window specified. More...
 
void gnc_main_window_menu_add_accelerator_keys (GncMainWindow *window)
 Scan the main window menu and add accelerator keys to main window accelerator group. More...
 
gboolean gnc_main_window_update_menu_for_action (GncMainWindow *window, const gchar *action_name, const gchar *label, const gchar *tooltip)
 Find the GMenuModel item given the action name for the window specified. More...
 
void gnc_main_window_set_vis_of_items_by_action (GncMainWindow *window, const gchar **action_names, gboolean vis)
 Show or hide menu and toolbar items based on a NULL terminated list of action names. More...
 
void gnc_main_window_init_short_names (GncMainWindow *window, GncToolBarShortNames *toolbar_labels)
 Update the labels of the toolbar items with short names. More...
 
void gnc_main_window_update_menu_and_toolbar (GncMainWindow *window, GncPluginPage *page, const gchar **ui_updates)
 Update the main window menu with the placeholders listed in ui_updates and load the page specific toolbar. More...
 
void gnc_book_option_num_field_source_change_cb (gboolean num_action)
 Calls gnc_book_option_num_field_source_change to initiate registered callbacks when num_field_source book option changes so that registers/reports can update themselves; sets feature flag.
 
GtkWidget * gnc_book_options_dialog_cb (gboolean modal, gchar *title, GtkWindow *parent)
 Opens the Book Options dialog. More...
 
void gnc_main_window_show_all_windows (void)
 Shows all main windows.
 
GtkWindow * gnc_ui_get_gtk_window (GtkWidget *widget)
 Get a pointer to the widget's immediate top level GtkWindow. More...
 
GtkWindow * gnc_ui_get_main_window (GtkWidget *widget)
 Get a pointer to the final GncMainWindow widget is rooted in. More...
 
void gnc_main_window_set_progressbar_window (GncMainWindow *window)
 Set the window where all progressbar updates should occur. More...
 
gboolean gnc_main_window_popup_menu_cb (GtkWidget *widget, GncPluginPage *page)
 Callback function invoked when the user requests that Gnucash popup the contextual menu via the keyboard context-menu request key combination (Shift-F10 by default). More...
 
gboolean gnc_main_window_button_press_cb (GtkWidget *whatever, GdkEventButton *event, GncPluginPage *page)
 Callback function invoked when the user clicks in the content of any Gnucash window. More...
 
void gnc_main_window_all_action_set_sensitive (const gchar *action_name, gboolean sensitive)
 Change the sensitivity of a command in all windows. More...
 
GMenuModel * gnc_main_window_get_menu_model (GncMainWindow *window)
 Return the GMenuModel for the main window menu bar. More...
 
gboolean gnc_main_window_just_plugin_prefs (GncMainWindow *window)
 
GType gnc_main_window_get_type (void)
 Get the type of a gnc main window. More...
 

Variables

constexpr auto gnc_main_window_max_number {10}
 Max number of windows allowed.
 

Detailed Description

Macro Definition Documentation

◆ PLUGIN_PAGE_LABEL

#define PLUGIN_PAGE_LABEL   "plugin-page"

This label is used to provide a mapping from a visible page widget back to the corresponding GncPluginPage object.

Definition at line 101 of file gnc-main-window.cpp.

Enumeration Type Documentation

◆ anonymous enum

anonymous enum

Names of signals generated by the main window.

Definition at line 91 of file gnc-main-window.cpp.

92 {
93  PAGE_ADDED,
94  PAGE_CHANGED,
95  MENU_CHANGED,
96  LAST_SIGNAL
97 };

Function Documentation

◆ G_DEFINE_TYPE_WITH_CODE()

G_DEFINE_TYPE_WITH_CODE ( GncMainWindow  ,
gnc_main_window  ,
GTK_TYPE_APPLICATION_WINDOW  ,
G_IMPLEMENT_INTERFACE(GNC_TYPE_WINDOW, gnc_window_main_window_init)   
)

A holding place for all the signals generated by the main window code.

◆ gnc_book_options_dialog_apply_helper()

gboolean gnc_book_options_dialog_apply_helper ( GncOptionDB options)

Processes selected options in the Book Options dialog: checks book_currency and use_split_action_for_num to see if features kvp should be set.

To be used where ever a new book situation requires book option selection (e.g., not just in Book Options dialog opened from main window but also in new-file assistant).

Parameters
GncOptionDB* options.
Returns
TRUE if gnc_gui_refresh_all should be called; otherwise FALSE.

Definition at line 4626 of file gnc-main-window.cpp.

4627 {
4628  QofBook *book = gnc_get_current_book ();
4629  gboolean use_split_action_for_num_before =
4631  gint use_read_only_threshold_before =
4633  gboolean use_split_action_for_num_after;
4634  gint use_read_only_threshold_after;
4635  gboolean return_val = FALSE;
4636  GList *results = nullptr, *iter;
4637 
4638  if (!options) return return_val;
4639 
4640  results = gnc_option_db_commit (options);
4641  for (iter = results; iter; iter = iter->next)
4642  {
4643  GtkWidget *dialog = gtk_message_dialog_new(gnc_ui_get_main_window (nullptr),
4644  (GtkDialogFlags)0,
4645  GTK_MESSAGE_ERROR,
4646  GTK_BUTTONS_OK,
4647  "%s",
4648  (char*)iter->data);
4649  gtk_dialog_run(GTK_DIALOG(dialog));
4650  gtk_widget_destroy(dialog);
4651  g_free (iter->data);
4652  }
4653  g_list_free (results);
4654  qof_book_begin_edit (book);
4655  qof_book_save_options (book, gnc_option_db_save, options, TRUE);
4656  use_split_action_for_num_after =
4658 
4659  // mark cached value as invalid so we get new value
4660  book->cached_num_days_autoreadonly_isvalid = FALSE;
4661  use_read_only_threshold_after = qof_book_get_num_days_autoreadonly (book);
4662 
4663  if (use_split_action_for_num_before != use_split_action_for_num_after)
4664  {
4666  use_split_action_for_num_after);
4667  return_val = TRUE;
4668  }
4669  if (use_read_only_threshold_before != use_read_only_threshold_after)
4670  return_val = TRUE;
4671 
4672  qof_book_commit_edit (book);
4673  return return_val;
4674 }
GtkWindow * gnc_ui_get_main_window(GtkWidget *widget)
Get a pointer to the final GncMainWindow widget is rooted in.
gint qof_book_get_num_days_autoreadonly(const QofBook *book)
Returns the number of days for auto-read-only transactions.
Definition: qofbook.cpp:968
gboolean qof_book_use_split_action_for_num_field(const QofBook *book)
Returns TRUE if this book uses split action field as the 'Num' field, FALSE if it uses transaction nu...
void gnc_option_db_save(GncOptionDB *odb, QofBook *book, gboolean clear_options)
Save the GncOptionDB contents into a book's options store.
void gnc_book_option_num_field_source_change_cb(gboolean num_action)
Calls gnc_book_option_num_field_source_change to initiate registered callbacks when num_field_source ...
void qof_book_save_options(QofBook *book, GncOptionSave save_cb, GncOptionDB *odb, gboolean clear)
Save a GncOptionsDB back to the book's KVP.
Definition: qofbook.cpp:1322
GList * gnc_option_db_commit(GncOptionDB *odb)
Write all changed ui_item values to their options.

◆ gnc_book_options_dialog_cb()

GtkWidget * gnc_book_options_dialog_cb ( gboolean  modal,
gchar *  title,
GtkWindow *  parent 
)

Opens the Book Options dialog.

Parameters
modalTrue to open in modal mode, false otherwise.
titleTitle of the dialog; "Book Options" if NULL.
parentThe toplevel GdkWindow with which the dialog will be transient for.
Returns
A pointer to the GtkWidget for the dialog that can be used when started in modal mode.

Definition at line 4732 of file gnc-main-window.cpp.

4733 {
4734  auto book = gnc_get_current_book ();
4735 
4736  auto options = gnc_option_db_new();
4737  gnc_option_db_book_options(options);
4738  qof_book_load_options (book, gnc_option_db_load, options);
4739  gnc_option_db_clean (options);
4740 
4741  /* Only allow one Book Options dialog if called from file->properties
4742  menu */
4743  if (gnc_forall_gui_components(DIALOG_BOOK_OPTIONS_CM_CLASS,
4744  show_handler, nullptr))
4745  {
4746  return nullptr;
4747  }
4748  auto optionwin = new GncOptionsDialog (modal,
4749  (title ? title : _( "Book Options")),
4750  DIALOG_BOOK_OPTIONS_CM_CLASS, parent);
4751  optionwin->build_contents(options);
4752  optionwin->set_book_help_cb();
4753  optionwin->set_apply_cb(gnc_book_options_dialog_apply_cb,
4754  (gpointer)options);
4755  optionwin->set_close_cb ( gnc_book_options_dialog_close_cb,
4756  (gpointer)options);
4757  if (modal)
4759  return optionwin->get_widget();
4760 }
void gnc_option_db_clean(GncOptionDB *odb)
Reset all ui_items to the option value.
void qof_book_load_options(QofBook *book, GncOptionLoad load_cb, GncOptionDB *odb)
Load a GncOptionsDB from KVP data.
Definition: qofbook.cpp:1316
void gnc_options_dialog_set_new_book_option_values(GncOptionDB *odb)
Set the initial values of new book options to values specified in user preferences.
void gnc_option_db_load(GncOptionDB *odb, QofBook *book)
Load a book's options into the GncOptionDB.
void gnc_option_db_book_options(GncOptionDB *odb)
Register the standard option set for a QofBook.
GncOptionDB * gnc_option_db_new(void)
Create an empty option database.

◆ gnc_main_window_all_action_set_sensitive()

void gnc_main_window_all_action_set_sensitive ( const gchar *  action_name,
gboolean  sensitive 
)

Change the sensitivity of a command in all windows.

This can be used to serialize access to a command so that in cannot be reinvoked until the current invocation is finished.

Parameters
action_nameThe name of the command to modity.
sensitiveWhether or not the user should be able to invoke this action.

Definition at line 5731 of file gnc-main-window.cpp.

5733 {
5734  for (auto tmp = active_windows; tmp; tmp = g_list_next(tmp))
5735  {
5736  auto action{gnc_main_window_find_action (static_cast<GncMainWindow*>(tmp->data), action_name)};
5737  g_simple_action_set_enabled (G_SIMPLE_ACTION(action), sensitive);
5738  }
5739 }
GAction * gnc_main_window_find_action(GncMainWindow *window, const gchar *action_name)
Find the GAction in the main window.

◆ gnc_main_window_all_finish_pending()

gboolean gnc_main_window_all_finish_pending ( void  )

Tell all pages in all windows to finish any outstanding activities.

This function will call gnc_plugin_page_finish_pending for each installed page. If any page returns a failure indication, then the function stops walking pages and immediately returns a failure.

Returns
FALSE if any page could not or would not comply, which should cancel the pending operation. TRUE otherwise

Definition at line 1114 of file gnc-main-window.cpp.

1115 {
1116  const GList *windows, *item;
1117 
1118  windows = gnc_gobject_tracking_get_list(GNC_MAIN_WINDOW_NAME);
1119  for (item = windows; item; item = g_list_next(item))
1120  {
1121  if (!gnc_main_window_finish_pending(static_cast<GncMainWindow*>(item->data)))
1122  {
1123  return FALSE;
1124  }
1125  }
1126  if (gnc_gui_refresh_suspended ())
1127  {
1128  gnc_warning_dialog (nullptr, "%s", "An operation is still running, wait for it to complete before quitting.");
1129  return FALSE;
1130  }
1131  return TRUE;
1132 }
const GList * gnc_gobject_tracking_get_list(const gchar *name)
Get a list of all known objects of a specified type.
gboolean gnc_main_window_finish_pending(GncMainWindow *window)
Tell a window to finish any outstanding activities.

◆ gnc_main_window_button_press_cb()

gboolean gnc_main_window_button_press_cb ( GtkWidget *  whatever,
GdkEventButton *  event,
GncPluginPage page 
)

Callback function invoked when the user clicks in the content of any Gnucash window.

If this was a "right-click" then Gnucash will popup the contextual menu.

Parameters
whateverWhatever widget had focus when the user issued the keyboard context-menu request.
eventThe event parameter describing where on the screen the mouse was pointing when clicked, type of click, modifiers, etc.
pageThis is the GncPluginPage corresponding to the visible page.
Returns
Returns TRUE if this was a right-click, meaning Gnucash handled the click.

Definition at line 5711 of file gnc-main-window.cpp.

5714 {
5715  g_return_val_if_fail(GNC_IS_PLUGIN_PAGE(page), FALSE);
5716 
5717  ENTER("widget %p, event %p, page %p", whatever, event, page);
5718  /* Ignore double-clicks and triple-clicks */
5719  if (event->button == 3 && event->type == GDK_BUTTON_PRESS)
5720  {
5721  do_popup_menu(page, event);
5722  LEAVE("menu shown");
5723  return TRUE;
5724  }
5725 
5726  LEAVE("other click");
5727  return FALSE;
5728 }
#define ENTER(format, args...)
Print a function entry debugging message.
Definition: qoflog.h:272
#define LEAVE(format, args...)
Print a function exit debugging message.
Definition: qoflog.h:282

◆ gnc_main_window_close_page()

void gnc_main_window_close_page ( GncPluginPage page)

Remove a data plugin page from a window and display the previous page.

If the page removed was the last page in the window, and there is more than one window open, then the entire window will be destroyed.

Parameters
pageThe page of data to be removed.

Definition at line 3445 of file gnc-main-window.cpp.

3446 {
3447  GncMainWindow *window;
3448  GncMainWindowPrivate *priv;
3449 
3450  if (!page || !page->notebook_page)
3451  return;
3452 
3453  if (!gnc_plugin_page_finish_pending(page))
3454  return;
3455 
3456  if (!GNC_IS_MAIN_WINDOW (page->window))
3457  return;
3458 
3459  window = GNC_MAIN_WINDOW (page->window);
3460  if (!window)
3461  {
3462  g_warning("Page is not in a window.");
3463  return;
3464  }
3465 
3466  gnc_main_window_disconnect(window, page);
3468  g_object_unref(page);
3469 
3470  /* If this isn't the last window, go ahead and destroy the window. */
3471  priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
3472  if (priv->installed_pages == nullptr)
3473  {
3474  if (window->window_quitting)
3475  {
3476  GncPluginManager *manager = gnc_plugin_manager_get ();
3477  GList *plugins = gnc_plugin_manager_get_plugins (manager);
3478 
3479  /* remove only the preference callbacks from the window plugins */
3480  window->just_plugin_prefs = TRUE;
3481  g_list_foreach (plugins, gnc_main_window_remove_plugin, window);
3482  window->just_plugin_prefs = FALSE;
3483  g_list_free (plugins);
3484 
3485  /* remove the preference callbacks from the main window */
3486  gnc_main_window_remove_prefs (window);
3487  }
3488  if (window && (gnc_list_length_cmp (active_windows, 1) > 0))
3489  gtk_widget_destroy (GTK_WIDGET(window));
3490  }
3491 }
gboolean gnc_plugin_page_finish_pending(GncPluginPage *page)
Tell a page to finish any outstanding activities.
void gnc_plugin_page_destroy_widget(GncPluginPage *plugin_page)
Destroy the display widget that corresponds to this plugin.
GtkWidget * window
The window that contains the display widget for this plugin.
The instance private data structure for an embedded window object.
GncPluginManager * gnc_plugin_manager_get(void)
Retrieve a pointer to the plugin manager.
GList * gnc_plugin_manager_get_plugins(GncPluginManager *manager)
Get a list of all plugins being held by the plugin manager.
GList * installed_pages
A list of all pages that are installed in this window.
gint gnc_list_length_cmp(const GList *list, size_t len)
Scans the GList elements the minimum number of iterations required to test it against a specified siz...
GtkWidget * notebook_page
The display widget for this plugin.

◆ gnc_main_window_display_page()

void gnc_main_window_display_page ( GncPluginPage page)

Bring the window containing the specified page to the top of the window stack, then switch the notebook to show the specified page.

Parameters
pageThe existing page to be displayed.

Definition at line 3243 of file gnc-main-window.cpp.

3244 {
3245  GncMainWindow *window;
3246  GncMainWindowPrivate *priv;
3247  GtkNotebook *notebook;
3248  gint page_num;
3249 
3250  window = GNC_MAIN_WINDOW (page->window);
3251  priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
3252  notebook = GTK_NOTEBOOK (priv->notebook);
3253  page_num = gtk_notebook_page_num(notebook, page->notebook_page);
3254  gtk_notebook_set_current_page (notebook, page_num);
3255  gtk_window_present(GTK_WINDOW(window));
3256 }
GtkWidget * window
The window that contains the display widget for this plugin.
GtkWidget * notebook
The notebook containing all the pages in this window.
The instance private data structure for an embedded window object.
GtkWidget * notebook_page
The display widget for this plugin.

◆ gnc_main_window_find_action()

GAction * gnc_main_window_find_action ( GncMainWindow *  window,
const gchar *  action_name 
)

Find the GAction in the main window.

Parameters
windowThe window which should be checked for the action.
action_nameThe name of the command to be retrieved.
Returns
A pointer to a GAction that was added with the specified name. If the name cannot be found, then NULL will be returned.

Definition at line 3636 of file gnc-main-window.cpp.

3637 {
3638  GAction *action = nullptr;
3639 
3640  g_return_val_if_fail (GNC_IS_MAIN_WINDOW(window), nullptr);
3641  g_return_val_if_fail (action_name != nullptr, nullptr);
3642 
3643  action = g_action_map_lookup_action (G_ACTION_MAP(window),
3644  action_name);
3645 
3646  return action;
3647 }

◆ gnc_main_window_find_action_in_group()

GAction * gnc_main_window_find_action_in_group ( GncMainWindow *  window,
const gchar *  group_name,
const gchar *  action_name 
)

Find the GAction in a specific action group for window.

Parameters
windowThe window which should be checked for the action.
group_nameThe name of the action group to search.
nameThe name of the command to be retrieved.
Returns
A pointer to the GAction if found or NULL will be returned.

Definition at line 3650 of file gnc-main-window.cpp.

3653 {
3654  GAction *action = nullptr;
3655 
3656  g_return_val_if_fail (GNC_IS_MAIN_WINDOW(window), nullptr);
3657  g_return_val_if_fail (group_name != nullptr, nullptr);
3658  g_return_val_if_fail (action_name != nullptr, nullptr);
3659 
3660  auto action_group = gtk_widget_get_action_group (GTK_WIDGET(window), group_name);
3661 
3662  if (action_group)
3663  action = g_action_map_lookup_action (G_ACTION_MAP(action_group), action_name);
3664 
3665  return action;
3666 }

◆ gnc_main_window_finish_pending()

gboolean gnc_main_window_finish_pending ( GncMainWindow *  window)

Tell a window to finish any outstanding activities.

This function will call gnc_plugin_page_finish_pending for each installed page. If any page returns a failure indication, then the function stops walking pages and immediately returns a failure.

Parameters
windowThe window whose pages should be checked.
Returns
FALSE if any page could not or would not comply, which should cancel the pending operation. TRUE otherwise

Definition at line 1094 of file gnc-main-window.cpp.

1095 {
1096  GncMainWindowPrivate *priv;
1097  GList *item;
1098 
1099  g_return_val_if_fail(GNC_IS_MAIN_WINDOW(window), TRUE);
1100 
1101  priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
1102  for (item = priv->installed_pages; item; item = g_list_next(item))
1103  {
1104  if (!gnc_plugin_page_finish_pending(static_cast<GncPluginPage*>(item->data)))
1105  {
1106  return FALSE;
1107  }
1108  }
1109  return TRUE;
1110 }
gboolean gnc_plugin_page_finish_pending(GncPluginPage *page)
Tell a page to finish any outstanding activities.
The instance private data structure for an embedded window object.
GList * installed_pages
A list of all pages that are installed in this window.

◆ gnc_main_window_foreach_page()

void gnc_main_window_foreach_page ( GncMainWindowPageFunc  fn,
gpointer  user_data 
)

Iterator function to walk all pages in all windows, calling the specified function for each page.

Parameters
entryA pointer to the function to be called.
user_dataA data pointer passed to each call of the function.

Definition at line 417 of file gnc-main-window.cpp.

418 {
419  ENTER(" ");
420  for (auto w = active_windows; w; w = g_list_next(w))
421  {
422  auto window{static_cast<GncMainWindow*>(w->data)};
423  auto priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
424  for (auto p = priv->installed_pages; p; p = g_list_next(p))
425  {
426  auto page{static_cast<GncPluginPage*>(p->data)};
427  fn(page, user_data);
428  }
429  }
430  LEAVE(" ");
431 }
The instance data structure for a content plugin.
#define ENTER(format, args...)
Print a function entry debugging message.
Definition: qoflog.h:272
#define LEAVE(format, args...)
Print a function exit debugging message.
Definition: qoflog.h:282

◆ gnc_main_window_get_action_group()

GSimpleActionGroup * gnc_main_window_get_action_group ( GncMainWindow *  window,
const gchar *  group_name 
)

Retrieve a specific set of user interface actions from a window.

This function can be used to get an group of action to be manipulated when the front page of a window has changed.

Parameters
windowThe window to check when looking for the action group.
group_nameThe name of a set of actions. This must be a name provided when the actions were installed.
Returns
A pointer to a GSimpleActionGroup that was added with the specified name. If the name cannot be found, then NULL will be returned.

Definition at line 3674 of file gnc-main-window.cpp.

3676 {
3677  g_return_val_if_fail (GNC_IS_MAIN_WINDOW(window), nullptr);
3678  g_return_val_if_fail (group_name != nullptr, nullptr);
3679 
3680  auto action_group = gtk_widget_get_action_group (GTK_WIDGET(window), group_name);
3681  return (GSimpleActionGroup*)action_group;
3682 }

◆ gnc_main_window_get_current_page()

GncPluginPage * gnc_main_window_get_current_page ( GncMainWindow *  window)

Retrieve a pointer to the page that is currently at the front of the specified window.

Any plugin that needs to manipulate its menus based upon the currently selected menu page should connect to the "page_changed" signal on a window. The callback function from that signal can then call this function to obtain a pointer to the current page.

Parameters
windowA pointer to the window whose front page should be returned.
Returns
A pointer to the GncPluginPage currently at the front of the specified window. If the window pointer is invalid or the window is empty, this function will return NULL.

Definition at line 3502 of file gnc-main-window.cpp.

3503 {
3504  GncMainWindowPrivate *priv;
3505 
3506  priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
3507  return priv->current_page;
3508 }
The instance private data structure for an embedded window object.
GncPluginPage * current_page
The currently selected page.

◆ gnc_main_window_get_menu_model()

GMenuModel * gnc_main_window_get_menu_model ( GncMainWindow *  window)

Return the GMenuModel for the main window menu bar.

Parameters
windowThe window for the menu bar.
Returns
The GMenuModel or NULL.

Definition at line 5742 of file gnc-main-window.cpp.

5743 {
5744  GncMainWindowPrivate *priv;
5745 
5746  g_return_val_if_fail (GNC_IS_MAIN_WINDOW(window), nullptr);
5747 
5748  priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
5749 
5750  return priv->menubar_model;
5751 }
GMenuModel * menubar_model
The menubar_model.
The instance private data structure for an embedded window object.

◆ gnc_main_window_get_type()

GType gnc_main_window_get_type ( void  )

Get the type of a gnc main window.

Returns
A GType.

◆ gnc_main_window_init_short_names()

void gnc_main_window_init_short_names ( GncMainWindow *  window,
GncToolBarShortNames toolbar_labels 
)

Update the labels of the toolbar items with short names.

Parameters
windowThe window that conatins a tool bar to update.
toolbar_labelsA pointer to a NULL terminated array of data GncToolBarShortNames items.

Definition at line 3799 of file gnc-main-window.cpp.

3801 {
3802  GncMainWindowPrivate *priv;
3803 
3804  g_return_if_fail (GNC_IS_MAIN_WINDOW(window));
3805  g_return_if_fail (toolbar_labels != nullptr);
3806 
3807  priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
3808 
3809  gnc_plugin_init_short_names (priv->toolbar, toolbar_labels);
3810 }
GtkWidget * toolbar
The toolbar.
The instance private data structure for an embedded window object.
void gnc_plugin_init_short_names(GtkWidget *toolbar, GncToolBarShortNames *toolbar_labels)
Add "short" labels to existing actions.
Definition: gnc-plugin.c:229

◆ gnc_main_window_is_restoring_pages()

gboolean gnc_main_window_is_restoring_pages ( GncMainWindow *  window)

Check if the main window is restoring the plugin pages.

This is used on report pages to delay the creation of the report till the page is focused.

Parameters
windowThe window whose pages should be checked.
Returns
TRUE if pages are being restored

Definition at line 407 of file gnc-main-window.cpp.

408 {
409  GncMainWindowPrivate *priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
410  return priv->restoring_pages;
411 }
gboolean restoring_pages
Set when restoring plugin pages.
The instance private data structure for an embedded window object.

◆ gnc_main_window_manual_merge_actions()

void gnc_main_window_manual_merge_actions ( GncMainWindow *  window,
const gchar *  group_name,
GSimpleActionGroup *  group 
)

Manually add a set of actions to the specified window.

Plugins whose user interface is not hard coded (e.g. the menu-additions * plugin) must create their actions at run time, then use this * function to install them into the window.

Parameters
windowA pointer to the window whose user interface should be updated.
group_nameThe name for this set of actions. This name should be unique among all groups added to the window, and will be needed to remove the actions from this window.
groupA pointer to the GSimpleActionGroup.

Definition at line 3517 of file gnc-main-window.cpp.

3520 {
3521  g_return_if_fail (GNC_IS_MAIN_WINDOW(window));
3522  g_return_if_fail (group_name != nullptr);
3523  g_return_if_fail (G_IS_SIMPLE_ACTION_GROUP(group));
3524 
3525  gtk_widget_insert_action_group (GTK_WIDGET(window), group_name,
3526  G_ACTION_GROUP(group));
3527 }

◆ gnc_main_window_menu_add_accelerator_keys()

void gnc_main_window_menu_add_accelerator_keys ( GncMainWindow *  window)

Scan the main window menu and add accelerator keys to main window accelerator group.

Parameters
windowA pointer to the window whose user interface should be updated.

Definition at line 3721 of file gnc-main-window.cpp.

3722 {
3723  GncMainWindowPrivate *priv;
3724 
3725  g_return_if_fail (GNC_IS_MAIN_WINDOW(window));
3726 
3727  priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
3728 
3730 }
GtkAccelGroup * accel_group
The accelerator group for the window.
GMenuModel * menubar_model
The menubar_model.
The instance private data structure for an embedded window object.
GtkWidget * menubar
The menubar.
void gnc_add_accelerator_keys_for_menu(GtkWidget *menu, GMenuModel *model, GtkAccelGroup *accel_group)
Add accelerator keys for menu item widgets.

◆ gnc_main_window_menu_find_menu_item()

GtkWidget * gnc_main_window_menu_find_menu_item ( GncMainWindow *  window,
const gchar *  action_name 
)

Find the menu item with the given action name for the window specified.

Parameters
windowA pointer to the window whose user interface should be updated.
action_nameThe action name of the tool item to find.
Returns
The found menu item widget or NULL.

Definition at line 3698 of file gnc-main-window.cpp.

3699 {
3700  GncMainWindowPrivate *priv;
3701  GtkWidget *menu_item;
3702 
3703  g_return_val_if_fail (GNC_IS_MAIN_WINDOW(window), nullptr);
3704  g_return_val_if_fail (action_name != nullptr, nullptr);
3705 
3706  priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
3707 
3708  menu_item = GTK_WIDGET(g_hash_table_lookup (priv->display_item_hash, action_name));
3709 
3710  if (!menu_item)
3711  {
3712  menu_item = gnc_menubar_model_find_menu_item (priv->menubar_model, priv->menubar, action_name);
3713 
3714  g_hash_table_insert (priv->display_item_hash, g_strdup (action_name), menu_item);
3715  }
3716  return menu_item;
3717 }
GMenuModel * menubar_model
The menubar_model.
The instance private data structure for an embedded window object.
GtkWidget * gnc_menubar_model_find_menu_item(GMenuModel *menu_model, GtkWidget *menu, const gchar *action_name)
Find a GtkMenu item from the action name.
GtkWidget * menubar
The menubar.

◆ gnc_main_window_merge_actions()

void gnc_main_window_merge_actions ( GncMainWindow *  window,
const gchar *  group_name,
GActionEntry *  entries,
guint  n_entries,
const gchar **  ui_updates,
const gchar *  ui_filename,
gpointer  user_data 
)

Add a set of actions to the specified window.

This function should not need to be called directly by plugin implementors. Correctly assigning values to the GncPluginClass fields during plugin initialization will cause this routine to be automatically called.

Parameters
windowA pointer to the window whose user interface should be updated.
group_nameThe name for this set of actions. This name should be unique among all groups added to the window, and will be needed to remove the actions from this window.
entriesA pointer to an array of GActionEntry. These are the actions that will be added to the user interface.
n_entriesThe number of actions in the array.
filenameThe filename containing the user interface definition that goes with this set of actions.
user_dataThe data to be provided to all callback functions.

Definition at line 3585 of file gnc-main-window.cpp.

3592 {
3594  GSimpleActionGroup *simple_action_group;
3595 
3596  g_return_if_fail (GNC_IS_MAIN_WINDOW(window));
3597  g_return_if_fail (group_name != nullptr);
3598  g_return_if_fail (actions != nullptr);
3599  g_return_if_fail (n_actions > 0);
3600 
3601  data = g_new0 (GncMainWindowActionData, 1);
3602  data->window = window;
3603  data->data = user_data;
3604 
3605  simple_action_group = g_simple_action_group_new ();
3606 
3607  g_action_map_add_action_entries (G_ACTION_MAP(simple_action_group),
3608  actions,
3609  n_actions,
3610  data);
3611 
3612  gtk_widget_insert_action_group (GTK_WIDGET(window), group_name,
3613  G_ACTION_GROUP(simple_action_group));
3614 
3615  if (ui_filename)
3616  update_menu_model (window, ui_filename, ui_updates);
3617 }

◆ gnc_main_window_new()

GncMainWindow * gnc_main_window_new ( void  )

Create a new gnc main window plugin.

Returns
A pointer to the new object.

Definition at line 3041 of file gnc-main-window.cpp.

3042 {
3043  auto window{static_cast<GncMainWindow*>(g_object_new (GNC_TYPE_MAIN_WINDOW, nullptr))};
3044  gtk_window_set_default_size(GTK_WINDOW(window), 800, 600);
3045 
3046  auto old_window = gnc_ui_get_main_window (nullptr);
3047  if (old_window)
3048  {
3049  gint width, height;
3050  gtk_window_get_size (old_window, &width, &height);
3051  gtk_window_resize (GTK_WINDOW (window), width, height);
3052  if ((gdk_window_get_state((gtk_widget_get_window (GTK_WIDGET(old_window))))
3053  & GDK_WINDOW_STATE_MAXIMIZED) != 0)
3054  {
3055  gtk_window_maximize (GTK_WINDOW (window));
3056  }
3057  }
3058  active_windows = g_list_append (active_windows, window);
3059  gnc_main_window_update_title(window);
3060  window->window_quitting = FALSE;
3061  window->just_plugin_prefs = FALSE;
3062 #ifdef MAC_INTEGRATION
3063  gnc_quartz_set_menu(window);
3064 #else
3065  gnc_main_window_update_all_menu_items();
3066 #endif
3067  gnc_engine_add_commit_error_callback( gnc_main_window_engine_commit_error_callback, window );
3068 
3069  // set up a callback for notebook navigation
3070  g_signal_connect (G_OBJECT(window), "key-press-event",
3071  G_CALLBACK(gnc_main_window_key_press_event),
3072  NULL);
3073 
3074  return window;
3075 }
GtkWindow * gnc_ui_get_main_window(GtkWidget *widget)
Get a pointer to the final GncMainWindow widget is rooted in.
void gnc_engine_add_commit_error_callback(EngineCommitErrorCallback cb, gpointer data)
Set a callback function to be called in case an engine commit fails.
Definition: gnc-engine.cpp:166

◆ gnc_main_window_open_page()

void gnc_main_window_open_page ( GncMainWindow *  window,
GncPluginPage page 
)

Display a data plugin page in a window.

If the page already exists in any window, then that window will be brought to the front and the notebook switch to display the specified page. If the page is new then it will be added to the specified window (unless the page itself requests otherwise.). If the window is NULL, the new page will be added to the first window.

Parameters
windowThe window to display a new page in.
pageThe new page of data to be displayed, or the existing page of data the should be brought to the top and displayed.

Definition at line 3267 of file gnc-main-window.cpp.

3269 {
3270  GncMainWindowPrivate *priv;
3271  GtkWidget *tab_container, *tab_clickable_area;
3272  GtkWidget *label, *entry;
3273  const gchar *icon, *text, *color_string, *lab_text;
3274  GtkWidget *image;
3275  GList *tmp;
3276  TabWidth *tw;
3277 
3278  ENTER("window %p, page %p", window, page);
3279  if (window)
3280  g_return_if_fail (GNC_IS_MAIN_WINDOW (window));
3281  g_return_if_fail (GNC_IS_PLUGIN_PAGE (page));
3282  g_return_if_fail (gnc_plugin_page_has_books(page));
3283 
3284  if (gnc_main_window_page_exists(page))
3285  {
3287  return;
3288  }
3289 
3290  /* Does the page want to be in a new window? */
3292  {
3293  /* See if there's a blank window. If so, use that. */
3294  for (tmp = active_windows; tmp; tmp = g_list_next(tmp))
3295  {
3296  window = GNC_MAIN_WINDOW(tmp->data);
3297  priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
3298  if (priv->installed_pages == nullptr)
3299  {
3300  break;
3301  }
3302  }
3303  if (tmp == nullptr)
3304  window = gnc_main_window_new ();
3305  gtk_widget_show(GTK_WIDGET(window));
3306  }
3307  else if ((window == nullptr) && active_windows)
3308  {
3309  window = static_cast<GncMainWindow*>(active_windows->data);
3310  }
3311 
3312  page->window = GTK_WIDGET(window);
3314  g_object_set_data (G_OBJECT (page->notebook_page),
3315  PLUGIN_PAGE_LABEL, page);
3316 
3317  /*
3318  * The page tab.
3319  * Component structure:
3320  *
3321  * tab_container (GtkBox)
3322  * ├── tab_clickable_area (GtkEventBox)
3323  * │ └── tab_content (GtkBox)
3324  * │ ├── image (GtkImage, optional)
3325  * │ ├── label (GtkLabel)
3326  * │ └── entry (GtkEntry, hidden)
3327  * └── close_button (GtkButton, if not immutable)
3328  */
3329  icon = GNC_PLUGIN_PAGE_GET_CLASS(page)->tab_icon;
3330  lab_text = gnc_plugin_page_get_page_name(page);
3331  label = gtk_label_new (lab_text);
3332  g_object_set_data (G_OBJECT (page), PLUGIN_PAGE_TAB_LABEL, label);
3333 
3334  tw = populate_tab_width_struct ();
3335  gnc_main_window_update_tab_width_one_page (page, tw);
3336  g_free (tw);
3337 
3338  gtk_widget_show (label);
3339 
3340  tab_container = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
3341 
3343  if (text)
3344  {
3345  gtk_widget_set_tooltip_text(tab_container, text);
3346  }
3347 
3348  if (g_strcmp0 (gnc_plugin_page_get_plugin_name (page), "GncPluginPageAccountTree") == 0)
3349  gtk_widget_set_name (GTK_WIDGET(tab_container), "gnc-id-account-page-tab-box");
3350 
3351  gtk_box_set_homogeneous (GTK_BOX (tab_container), FALSE);
3352  gtk_widget_show (tab_container);
3353 
3354  // Create a custom clickable area for the tab to support middle-clicking
3355  tab_clickable_area = gtk_event_box_new();
3356  gtk_widget_show(tab_clickable_area);
3357  gtk_box_pack_start (GTK_BOX (tab_container), tab_clickable_area, TRUE, TRUE, 0);
3358 
3359  // Create a box for the tab's content
3360  // Give it a name so we can find it later (see main_window_find_tab_items)
3361  GtkWidget *tab_content = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 6);
3362  gtk_widget_set_name(tab_content, "tab-content");
3363  gtk_container_add(GTK_CONTAINER(tab_clickable_area), tab_content);
3364  gtk_widget_show(tab_content);
3365 
3366  if (icon != nullptr)
3367  {
3368  image = gtk_image_new_from_icon_name (icon, GTK_ICON_SIZE_MENU);
3369  gtk_widget_show (image);
3370  gtk_box_pack_start (GTK_BOX (tab_content), image, FALSE, FALSE, 0);
3371  gtk_widget_set_margin_start (GTK_WIDGET(image), 5);
3372  gtk_box_pack_start (GTK_BOX (tab_content), label, TRUE, TRUE, 0);
3373  }
3374  else
3375  gtk_box_pack_start (GTK_BOX (tab_content), label, TRUE, TRUE, 0);
3376 
3377  entry = gtk_entry_new();
3378  gtk_widget_hide (entry);
3379  gtk_box_pack_start (GTK_BOX (tab_content), entry, TRUE, TRUE, 0);
3380  g_signal_connect(G_OBJECT(entry), "activate",
3381  G_CALLBACK(gnc_main_window_tab_entry_activate), page);
3382  g_signal_connect(G_OBJECT(entry), "focus-out-event",
3383  G_CALLBACK(gnc_main_window_tab_entry_focus_out_event),
3384  page);
3385  g_signal_connect(G_OBJECT(entry), "key-press-event",
3386  G_CALLBACK(gnc_main_window_tab_entry_key_press_event),
3387  page);
3388  g_signal_connect(G_OBJECT(entry), "editing-done",
3389  G_CALLBACK(gnc_main_window_tab_entry_editing_done),
3390  page);
3391 
3392  /* Add close button - Not for immutable pages */
3393  if (!g_object_get_data (G_OBJECT (page), PLUGIN_PAGE_IMMUTABLE))
3394  {
3395  GtkWidget *close_image, *close_button;
3396  GtkRequisition requisition;
3397 
3398  close_button = gtk_button_new();
3399  gtk_button_set_relief(GTK_BUTTON(close_button), GTK_RELIEF_NONE);
3400  close_image = gtk_image_new_from_icon_name ("window-close", GTK_ICON_SIZE_MENU);
3401  gtk_widget_show(close_image);
3402  gtk_widget_get_preferred_size (close_image, &requisition, nullptr);
3403  gtk_widget_set_size_request(close_button, requisition.width + 4,
3404  requisition.height + 2);
3405  gtk_container_add(GTK_CONTAINER(close_button), close_image);
3406  if (gnc_prefs_get_bool(GNC_PREFS_GROUP_GENERAL, GNC_PREF_SHOW_CLOSE_BUTTON))
3407  gtk_widget_show (close_button);
3408  else
3409  gtk_widget_hide (close_button);
3410 
3411  // Custom handler to close on middle-clicks
3412  g_signal_connect(G_OBJECT(tab_clickable_area), "button-press-event",
3413  G_CALLBACK(gnc_tab_clicked_cb), page);
3414 
3415  g_signal_connect_swapped (G_OBJECT (close_button), "clicked",
3416  G_CALLBACK(gnc_main_window_close_page), page);
3417 
3418  gtk_box_pack_start (GTK_BOX (tab_container), close_button, FALSE, FALSE, 0);
3419  gtk_widget_set_margin_end (GTK_WIDGET(close_button), 5);
3420  g_object_set_data (G_OBJECT (page), PLUGIN_PAGE_CLOSE_BUTTON, close_button);
3421  }
3422 
3423  /*
3424  * The popup menu
3425  */
3426  label = gtk_label_new (gnc_plugin_page_get_page_name(page));
3427 
3428  /*
3429  * Now install it all in the window.
3430  */
3431  gnc_main_window_connect(window, page, tab_container, label);
3432 
3433  color_string = gnc_plugin_page_get_page_color(page);
3434  main_window_update_page_color (page, color_string);
3435  LEAVE("");
3436 }
gboolean gnc_plugin_page_has_books(GncPluginPage *page)
Query a page to see if it has a reference to any book.
gboolean gnc_plugin_page_get_use_new_window(GncPluginPage *page)
Retrieve the "use new window" setting associated with this page.
const gchar * gnc_plugin_page_get_page_long_name(GncPluginPage *page)
Retrieve the long name of this page.
This data structure allows the passing of the tab width and whether the tab layout is on the left or ...
const gchar * gnc_plugin_page_get_page_name(GncPluginPage *page)
Retrieve the name of this page.
GtkWidget * window
The window that contains the display widget for this plugin.
const gchar * gnc_plugin_page_get_page_color(GncPluginPage *page)
Retrieve the color of this page.
#define ENTER(format, args...)
Print a function entry debugging message.
Definition: qoflog.h:272
void gnc_main_window_display_page(GncPluginPage *page)
Bring the window containing the specified page to the top of the window stack, then switch the notebo...
void main_window_update_page_color(GncPluginPage *page, const gchar *color_in)
Update the color on the page tabs in the main window.
The instance private data structure for an embedded window object.
#define PLUGIN_PAGE_LABEL
This label is used to provide a mapping from a visible page widget back to the corresponding GncPlugi...
GncMainWindow * gnc_main_window_new(void)
Create a new gnc main window plugin.
gboolean gnc_prefs_get_bool(const gchar *group, const gchar *pref_name)
Get a boolean value from the preferences backend.
void gnc_main_window_close_page(GncPluginPage *page)
Remove a data plugin page from a window and display the previous page.
#define LEAVE(format, args...)
Print a function exit debugging message.
Definition: qoflog.h:282
GList * installed_pages
A list of all pages that are installed in this window.
GtkWidget * notebook_page
The display widget for this plugin.
GtkWidget * gnc_plugin_page_create_widget(GncPluginPage *plugin_page)
Create the display widget that corresponds to this plugin.
const gchar * gnc_plugin_page_get_plugin_name(GncPluginPage *plugin_page)
Retrieve the textual name of a plugin.

◆ gnc_main_window_popup_menu_cb()

gboolean gnc_main_window_popup_menu_cb ( GtkWidget *  widget,
GncPluginPage page 
)

Callback function invoked when the user requests that Gnucash popup the contextual menu via the keyboard context-menu request key combination (Shift-F10 by default).

Parameters
pageThis is the GncPluginPage corresponding to the visible page.
widgetWhatever widget had focus when the user issued the keyboard context-menu request.
Returns
Always returns TRUE to indicate that the menu request was handled.

Definition at line 5696 of file gnc-main-window.cpp.

5698 {
5699  ENTER("widget %p, page %p", widget, page);
5700  do_popup_menu(page, nullptr);
5701  LEAVE(" ");
5702  return TRUE;
5703 }
#define ENTER(format, args...)
Print a function entry debugging message.
Definition: qoflog.h:272
#define LEAVE(format, args...)
Print a function exit debugging message.
Definition: qoflog.h:282

◆ gnc_main_window_restore_all_windows()

void gnc_main_window_restore_all_windows ( const GKeyFile *  keyfile)

Restore the persistent state of all windows.

Parameters
keyfileThe GKeyFile containing persistent window state.

Definition at line 877 of file gnc-main-window.cpp.

878 {
879  gint i, window_count;
880  GError *error = nullptr;
882 
883  /* We use the same struct for reading and for writing, so we cast
884  away the const. */
885  data.key_file = (GKeyFile *) keyfile;
886  window_count = g_key_file_get_integer(data.key_file, STATE_FILE_TOP,
887  WINDOW_COUNT, &error);
888  if (error)
889  {
890  g_warning("error reading group %s key %s: %s",
891  STATE_FILE_TOP, WINDOW_COUNT, error->message);
892  g_error_free(error);
893  LEAVE("can't read count");
894  return;
895  }
896 
897  /* Restore all state information on the open windows. Window
898  numbers in state file are 1-based. GList indices are 0-based. */
899  gnc_set_busy_cursor (nullptr, TRUE);
900  for (i = 0; i < window_count; i++)
901  {
902  data.window_num = i;
903  auto window{static_cast<GncMainWindow*>(g_list_nth_data(active_windows,
904  i))};
905  gnc_main_window_restore_window(window, &data);
906  }
907  gnc_unset_busy_cursor (nullptr);
908 
909  statusbar_notification_lastmodified();
910 }
#define LEAVE(format, args...)
Print a function exit debugging message.
Definition: qoflog.h:282

◆ gnc_main_window_save_all_windows()

void gnc_main_window_save_all_windows ( GKeyFile *  keyfile)

Save the persistent state of all windows.

Parameters
keyfileThe GKeyFile to contain persistent window state.

Definition at line 1076 of file gnc-main-window.cpp.

1077 {
1078  GncMainWindowSaveData data;
1079 
1080  /* Set up the iterator data structures */
1081  data.key_file = keyfile;
1082  data.window_num = 1;
1083  data.page_num = 1;
1084 
1085  g_key_file_set_integer(data.key_file,
1086  STATE_FILE_TOP, WINDOW_COUNT,
1087  g_list_length(active_windows));
1088  /* Dump all state information on the open windows */
1089  g_list_foreach(active_windows, (GFunc)gnc_main_window_save_window, &data);
1090 }

◆ gnc_main_window_set_progressbar_window()

void gnc_main_window_set_progressbar_window ( GncMainWindow *  window)

Set the window where all progressbar updates should occur.

This is a wrapper around the gnc_window_set_progressbar_window() function.

Parameters
windowThe window to use for all progressbar updates.

Definition at line 5600 of file gnc-main-window.cpp.

5601 {
5602  GncWindow *gncwin;
5603  gncwin = GNC_WINDOW(window);
5604  gnc_window_set_progressbar_window(gncwin);
5605 }

◆ gnc_main_window_set_vis_of_items_by_action()

void gnc_main_window_set_vis_of_items_by_action ( GncMainWindow *  window,
const gchar **  action_names,
gboolean  vis 
)

Show or hide menu and toolbar items based on a NULL terminated list of action names.

Parameters
windowA pointer to the window whose user interface should be updated.
action_namesA NULL terminated list of actions names that should be modified.
visWhether to show or hide the widget items

Definition at line 3760 of file gnc-main-window.cpp.

3763 {
3764  GncMainWindowPrivate *priv;
3765 
3766  g_return_if_fail (GNC_IS_MAIN_WINDOW(window));
3767 
3768  priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
3769 
3770  for (gint i = 0; action_names[i]; i++)
3771  {
3772  GtkWidget *tool_item = gnc_find_toolbar_item (priv->toolbar, action_names[i]);
3773  GtkWidget *menu_item = gnc_main_window_menu_find_menu_item (window, action_names[i]);
3774 
3775  if (menu_item)
3776  {
3777  PINFO("Found menu_item %p with action name '%s', seting vis to '%s'",
3778  menu_item, action_names[i], vis ? "true" : "false");
3779  gtk_widget_set_visible (menu_item, vis);
3780  }
3781  else
3782  PINFO("Did not find menu_item with action name '%s' to set vis '%s'",
3783  action_names[i], vis ? "true" : "false");
3784 
3785  if (tool_item)
3786  {
3787  PINFO("Found tool_item %p with action name '%s', seting vis to '%s'",
3788  tool_item, action_names[i], vis ? "true" : "false");
3789  gtk_widget_set_visible (tool_item, vis);
3790  }
3791  else
3792  PINFO("Did not find tool_item with action name '%s' to set vis '%s'",
3793  action_names[i], vis ? "true" : "false");
3794  }
3795 }
#define PINFO(format, args...)
Print an informational note.
Definition: qoflog.h:256
GtkWidget * toolbar
The toolbar.
GtkWidget * gnc_main_window_menu_find_menu_item(GncMainWindow *window, const gchar *action_name)
Find the menu item with the given action name for the window specified.
The instance private data structure for an embedded window object.
GtkWidget * gnc_find_toolbar_item(GtkWidget *toolbar, const gchar *action_name)
Search the toolbar for the tool item based on the action name.

◆ gnc_main_window_toolbar_find_tool_item()

GtkWidget * gnc_main_window_toolbar_find_tool_item ( GncMainWindow *  window,
const gchar *  action_name 
)

Find the toolbar item with the given action name for the window specified.

Parameters
windowA pointer to the window whose user interface should be updated.
action_nameThe action name of the tool item to find.
Returns
The found tool item widget or NULL.

Definition at line 3685 of file gnc-main-window.cpp.

3686 {
3687  GncMainWindowPrivate *priv;
3688 
3689  g_return_val_if_fail (GNC_IS_MAIN_WINDOW(window), nullptr);
3690  g_return_val_if_fail (action_name != nullptr, nullptr);
3691 
3692  priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
3693 
3694  return gnc_find_toolbar_item (priv->toolbar, action_name);
3695 }
GtkWidget * toolbar
The toolbar.
The instance private data structure for an embedded window object.
GtkWidget * gnc_find_toolbar_item(GtkWidget *toolbar, const gchar *action_name)
Search the toolbar for the tool item based on the action name.

◆ gnc_main_window_unmerge_actions()

void gnc_main_window_unmerge_actions ( GncMainWindow *  window,
const gchar *  group_name 
)

Remove a set of actions from the specified window.

This function should not need to be called directly by plugin implementors. It will automatically be called when a plugin is removed from a window.

Parameters
windowA pointer to the window whose user interface should be updated.
group_nameThe name for this set of actions. This must be the same name provided when the actions were installed.

Definition at line 3626 of file gnc-main-window.cpp.

3628 {
3629  g_return_if_fail (GNC_IS_MAIN_WINDOW (window));
3630  g_return_if_fail (group_name != nullptr);
3631 
3632  gtk_widget_insert_action_group (GTK_WIDGET(window), group_name, nullptr);
3633 }

◆ gnc_main_window_update_menu_and_toolbar()

void gnc_main_window_update_menu_and_toolbar ( GncMainWindow *  window,
GncPluginPage page,
const gchar **  ui_updates 
)

Update the main window menu with the placeholders listed in ui_updates and load the page specific toolbar.

Parameters
windowThe window which should be checked for the action.
pageThe plugin page calling this function.
ui_updatesA NULL terminated list of placeholders to load

Definition at line 3863 of file gnc-main-window.cpp.

3866 {
3867  GncMainWindowPrivate *priv;
3868  const gchar *plugin_page_actions_group_name;
3869  GtkBuilder *builder;
3870  const gchar *menu_qualifier;
3871 
3872  GMenuModel *menu_model_part;
3873 #ifdef MAC_INTEGRATION
3874  auto theApp{static_cast<GtkosxApplication *>(g_object_new(GTKOSX_TYPE_APPLICATION, nullptr))};
3875 #endif
3876  g_return_if_fail (GNC_IS_MAIN_WINDOW(window));
3877  g_return_if_fail (page != nullptr);
3878  g_return_if_fail (ui_updates != nullptr);
3879 
3880  priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
3881 
3882  builder = gnc_plugin_page_get_builder (page);
3883 
3884  if (!builder)
3885  return;
3886 
3887  menu_qualifier = gnc_plugin_page_get_menu_qualifier (page);
3888 
3889  plugin_page_actions_group_name = gnc_plugin_page_get_simple_action_group_name (page);
3890 
3891  if (!plugin_page_actions_group_name)
3892  return;
3893 
3894  gtk_widget_insert_action_group (GTK_WIDGET(window), gnc_plugin_page_get_simple_action_group_name (page),
3895  G_ACTION_GROUP(gnc_plugin_page_get_action_group (page)));
3896 
3897  if ((g_strcmp0 (priv->previous_plugin_page_name,
3898  plugin_page_actions_group_name) == 0) &&
3899  (g_strcmp0 (priv->previous_menu_qualifier,
3900  menu_qualifier) == 0))
3901  return;
3902 
3903  priv->previous_plugin_page_name = plugin_page_actions_group_name;
3904  priv->previous_menu_qualifier = menu_qualifier;
3905 
3906  gnc_main_window_update_toolbar (window, page, menu_qualifier);
3907 
3908  // reset hash table and remove added menu items
3909  g_hash_table_remove_all (priv->display_item_hash);
3911  GNC_MENU_ATTRIBUTE_TEMPORARY);
3912 
3913  GncMenuModelSearch *gsm = g_new0 (GncMenuModelSearch, 1);
3914  for (gint i = 0; ui_updates[i]; i++)
3915  {
3916  gchar *menu_name;
3917 
3918  if (menu_qualifier)
3919  menu_name = g_strconcat (ui_updates[i], "-", menu_qualifier, nullptr);
3920  else
3921  menu_name = g_strdup (ui_updates[i]);
3922 
3923  menu_model_part = (GMenuModel *)gtk_builder_get_object (builder, menu_name);
3924 
3925  if (!menu_model_part)
3926  menu_model_part = (GMenuModel *)gtk_builder_get_object (builder, ui_updates[i]);
3927 
3928  gsm->search_action_label = nullptr;
3929  gsm->search_action_name = ui_updates[i];
3930  gsm->search_action_target = nullptr;
3931 
3932  if (gnc_menubar_model_find_item (priv->menubar_model, gsm))
3933  g_menu_insert_section (G_MENU(gsm->model), gsm->index,
3934  nullptr, G_MENU_MODEL(menu_model_part));
3935  else
3936  PERR("Could not find '%s' in menu model", ui_updates[i]);
3937 
3938  g_free (menu_name);
3939  }
3940 
3941  // add tooltip redirect call backs
3943 
3944  // need to add the accelerator keys
3946 #ifdef MAC_INTEGRATION
3947  gtkosx_application_sync_menubar (theApp);
3948  g_object_unref (theApp);
3949 #endif
3950  // need to signal menu has been changed
3951  g_signal_emit_by_name (window, "menu_changed", page);
3952 
3953  g_free (gsm);
3954 }
GtkWidget * statusbar
A pointer to the status bar at the bottom edge of the window.
void gnc_menubar_model_remove_items_with_attrib(GMenuModel *menu_model, const gchar *attrib)
Remove GMenuModel entries based on having an attribute value equal to attrib, it does not matter what...
GtkAccelGroup * accel_group
The accelerator group for the window.
gboolean gnc_menubar_model_find_item(GMenuModel *menu_model, GncMenuModelSearch *gsm)
Find a GtkMenu item from the action name.
GMenuModel * menubar_model
The menubar_model.
GSimpleActionGroup * gnc_plugin_page_get_action_group(GncPluginPage *page)
Retrieve the GSimpleActionGroup object associated with this page.
GtkBuilder * gnc_plugin_page_get_builder(GncPluginPage *page)
Retrieve the GtkBuilder object associated with this page.
const gchar * gnc_plugin_page_get_menu_qualifier(GncPluginPage *page)
Retrieve the menu qualifier for this page.
#define PERR(format, args...)
Log a serious error.
Definition: qoflog.h:244
void gnc_plugin_add_menu_tooltip_callbacks(GtkWidget *menubar, GMenuModel *menubar_model, GtkWidget *statusbar)
This function adds the tooltip callbacks to make the tooltips appear in the status bar...
Definition: gnc-plugin.c:268
The instance private data structure for an embedded window object.
const gchar * gnc_plugin_page_get_simple_action_group_name(GncPluginPage *page)
Retrieve the simple action group name associated with this plugin page.
GtkWidget * menubar
The menubar.
void gnc_add_accelerator_keys_for_menu(GtkWidget *menu, GMenuModel *model, GtkAccelGroup *accel_group)
Add accelerator keys for menu item widgets.

◆ gnc_main_window_update_menu_for_action()

gboolean gnc_main_window_update_menu_for_action ( GncMainWindow *  window,
const gchar *  action_name,
const gchar *  label,
const gchar *  tooltip 
)

Find the GMenuModel item given the action name for the window specified.

Parameters
windowA pointer to the window whose user interface should be updated.
action_nameThe action name of the menu item to find.
labelThe new label for the menu item.
tooltipThe new tooltip for the menu item, optional.
Returns
TRUE if menu item found and updated or FALSE.

Definition at line 3734 of file gnc-main-window.cpp.

3738 {
3739  GncMainWindowPrivate *priv;
3740  gboolean found = false;
3741 
3742  g_return_val_if_fail (GNC_IS_MAIN_WINDOW(window), false);
3743  g_return_val_if_fail (action_name != nullptr, false);
3744  g_return_val_if_fail (label != nullptr, false);
3745 
3746  priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
3747 
3748  found = gnc_menubar_model_update_item (priv->menubar_model, action_name,
3749  nullptr, _(label), nullptr, _(tooltip));
3750 
3751  // add tooltip redirect call backs
3753  priv->menubar_model,
3754  priv->statusbar);
3755 
3756  return found;
3757 }
GtkWidget * statusbar
A pointer to the status bar at the bottom edge of the window.
GMenuModel * menubar_model
The menubar_model.
void gnc_plugin_add_menu_tooltip_callbacks(GtkWidget *menubar, GMenuModel *menubar_model, GtkWidget *statusbar)
This function adds the tooltip callbacks to make the tooltips appear in the status bar...
Definition: gnc-plugin.c:268
The instance private data structure for an embedded window object.
GtkWidget * menubar
The menubar.
gboolean gnc_menubar_model_update_item(GMenuModel *menu_model, const gchar *action_name, const gchar *target, const gchar *label, const gchar *accel_name, const gchar *tooltip)
Update the GMenuModel item based on the action name by copying existing item, removing it and inserti...

◆ gnc_ui_get_gtk_window()

GtkWindow* gnc_ui_get_gtk_window ( GtkWidget *  widget)

Get a pointer to the widget's immediate top level GtkWindow.

This can be a dialog window or a GncMainWindow. If the widget is not a child of a GtkWindow (yet), NULL is returned.

Parameters
widgetthe widget to find a GtkWindow for.
Returns
A pointer to a GtkWindow object or NULL if no toplevel was found.

Definition at line 5421 of file gnc-main-window.cpp.

5422 {
5423  GtkWidget *toplevel;
5424 
5425  if (!widget)
5426  return nullptr;
5427 
5428  toplevel = gtk_widget_get_toplevel (widget);
5429  if (toplevel && GTK_IS_WINDOW (toplevel))
5430  return GTK_WINDOW (toplevel);
5431  else
5432  return nullptr;
5433 }

◆ gnc_ui_get_main_window()

GtkWindow* gnc_ui_get_main_window ( GtkWidget *  widget)

Get a pointer to the final GncMainWindow widget is rooted in.

If widget is a child of a GncMainWindow return that window. If it's a child of a dialog window recursively query the dialog's transient parent until the first parent that's a GncMainWindow and return that. If widget is NULL or not part of any GtkWindow, get a pointer to the first active top level window. If there is none, return the first mapped window. If there's no mapped window return NULL.

An example of why searching for a GncMainWindow makes sense: suppose a user has opened a search dialog for vendors and in that dialog has clicked "View vendor invoices". This opens another search window in which the user can click "View/Edit bill". Clicking that button should open a new tab in the GncMainWindow from which the first search dialog was opened.

Parameters
widgetthe widget to find a GncMainWindow for.
Returns
A pointer to a GtkWindow object.

Definition at line 5436 of file gnc-main-window.cpp.

5437 {
5438  GList *window;
5439 
5440  GtkWindow *toplevel = gnc_ui_get_gtk_window (widget);
5441  while (toplevel && !GNC_IS_MAIN_WINDOW (toplevel))
5442  toplevel = gtk_window_get_transient_for(toplevel);
5443 
5444  if (toplevel)
5445  return toplevel;
5446 
5447  for (window = active_windows; window; window = window->next)
5448  if (gtk_window_is_active (GTK_WINDOW (window->data)))
5449  return static_cast<GtkWindow*>(window->data);
5450 
5451  for (window = active_windows; window; window = window->next)
5452  if (gtk_widget_get_mapped (GTK_WIDGET(window->data)))
5453  return static_cast<GtkWindow*>(window->data);
5454 
5455  return nullptr;
5456 }
GtkWindow * gnc_ui_get_gtk_window(GtkWidget *widget)
Get a pointer to the widget&#39;s immediate top level GtkWindow.

◆ main_window_update_page_color()

void main_window_update_page_color ( GncPluginPage page,
const gchar *  color_in 
)

Update the color on the page tabs in the main window.

Parameters
pageThe page to be updated.
color_inThe new color string for the page tab.

Definition at line 2474 of file gnc-main-window.cpp.

2476 {
2477  GncMainWindow *window;
2478  GncMainWindowPrivate *priv;
2479  GtkWidget *tab_widget;
2480  GdkRGBA tab_color;
2481  gchar *color_string = nullptr;
2482  gboolean want_color = FALSE;
2483 
2484  ENTER(" ");
2485  if (color_in)
2486  color_string = g_strstrip(g_strdup(color_in));
2487 
2488  if (color_string && *color_string != '\0')
2489  want_color = TRUE;
2490 
2491  /* Update the plugin */
2492  window = GNC_MAIN_WINDOW(page->window);
2493  if (want_color)
2494  gnc_plugin_page_set_page_color(page, color_string);
2495  else
2496  gnc_plugin_page_set_page_color(page, nullptr);
2497 
2498  /* Update the notebook tab */
2499  main_window_find_tab_widget (window, page, &tab_widget);
2500  priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
2501 
2502  if (want_color && gdk_rgba_parse(&tab_color, color_string) && priv->show_color_tabs)
2503  {
2504  GtkCssProvider *provider = gtk_css_provider_new();
2505  GtkStyleContext *stylectxt;
2506  gchar *col_str, *widget_css;
2507 
2508  if (!GTK_IS_EVENT_BOX (tab_widget))
2509  {
2510  GtkWidget *event_box = gtk_event_box_new ();
2511  g_object_ref (tab_widget);
2512  gtk_notebook_set_tab_label (GTK_NOTEBOOK(priv->notebook),
2513  page->notebook_page, event_box);
2514  gtk_container_add (GTK_CONTAINER(event_box), tab_widget);
2515  g_object_unref (tab_widget);
2516  tab_widget = event_box;
2517  }
2518 
2519  stylectxt = gtk_widget_get_style_context (GTK_WIDGET (tab_widget));
2520  col_str = gdk_rgba_to_string (&tab_color);
2521  widget_css = g_strconcat ("*{\n background-color:", col_str, ";\n}\n", nullptr);
2522 
2523  gtk_css_provider_load_from_data (provider, widget_css, -1, nullptr);
2524  gtk_style_context_add_provider (stylectxt, GTK_STYLE_PROVIDER (provider),
2525  GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
2526  g_object_unref (provider);
2527  g_free (col_str);
2528  g_free (widget_css);
2529  }
2530  else
2531  {
2532  if (GTK_IS_EVENT_BOX (tab_widget))
2533  {
2534  GtkWidget *tab_hbox = gtk_bin_get_child(GTK_BIN(tab_widget));
2535  g_object_ref (tab_hbox);
2536  gtk_container_remove (GTK_CONTAINER(tab_widget), tab_hbox);
2537  gtk_notebook_set_tab_label (GTK_NOTEBOOK(priv->notebook),
2538  page->notebook_page, tab_hbox);
2539  g_object_unref (tab_hbox);
2540  }
2541  }
2542  g_free(color_string);
2543  LEAVE("done");
2544 }
GtkWidget * window
The window that contains the display widget for this plugin.
#define ENTER(format, args...)
Print a function entry debugging message.
Definition: qoflog.h:272
GtkWidget * notebook
The notebook containing all the pages in this window.
The instance private data structure for an embedded window object.
gboolean show_color_tabs
Show account color as background on tabs.
void gnc_plugin_page_set_page_color(GncPluginPage *page, const char *color)
Set the color of this page.
#define LEAVE(format, args...)
Print a function exit debugging message.
Definition: qoflog.h:282
GtkWidget * notebook_page
The display widget for this plugin.

◆ main_window_update_page_long_name()

void main_window_update_page_long_name ( GncPluginPage page,
const gchar *  long_name_in 
)

Update the long name of the page in the main window.

Parameters
pageThe page to be updated.
long_name_inThe new long name for the page.

Definition at line 2369 of file gnc-main-window.cpp.

2371 {
2372  GtkWidget *tab_widget;
2373 
2374  ENTER(" ");
2375 
2376  if ((long_name_in == nullptr) || (*long_name_in == '\0'))
2377  {
2378  LEAVE("no string");
2379  return;
2380  }
2381  gchar *long_name = g_strstrip (g_strdup (long_name_in));
2382  const gchar *old_long_name = gnc_plugin_page_get_page_long_name (page);
2383 
2384  /* Optimization, if the long_name hasn't changed, don't update X. */
2385  if (*long_name == '\0' || strcmp (long_name, old_long_name) == 0)
2386  {
2387  g_free (long_name);
2388  LEAVE("empty string or name unchanged");
2389  return;
2390  }
2391 
2392  gnc_plugin_page_set_page_long_name (page, long_name);
2393 
2394  GncMainWindow *window = GNC_MAIN_WINDOW(page->window);
2395  if (!window)
2396  {
2397  g_free (long_name);
2398  LEAVE("no window widget available");
2399  return;
2400  }
2401 
2402  /* Update the notebook tab tooltip */
2403  if (main_window_find_tab_widget (window, page, &tab_widget))
2404  gtk_widget_set_tooltip_text (tab_widget, long_name);
2405 
2406  g_free (long_name);
2407  LEAVE("");
2408 }
const gchar * gnc_plugin_page_get_page_long_name(GncPluginPage *page)
Retrieve the long name of this page.
GtkWidget * window
The window that contains the display widget for this plugin.
void gnc_plugin_page_set_page_long_name(GncPluginPage *page, const char *name)
Set the long name of this page.
#define ENTER(format, args...)
Print a function entry debugging message.
Definition: qoflog.h:272
#define LEAVE(format, args...)
Print a function exit debugging message.
Definition: qoflog.h:282

◆ main_window_update_page_name()

void main_window_update_page_name ( GncPluginPage page,
const gchar *  name_in 
)

Update the name of the page in the main window.

Parameters
pageThe page to be updated.
name_inThe new name for the page.

Definition at line 2411 of file gnc-main-window.cpp.

2413 {
2414  GncMainWindow *window;
2415  GncMainWindowPrivate *priv;
2416  GtkWidget *label, *entry;
2417  gchar *name;
2418  TabWidth *tw;
2419 
2420  ENTER(" ");
2421 
2422  if ((name_in == nullptr) || (*name_in == '\0'))
2423  {
2424  LEAVE("no string");
2425  return;
2426  }
2427  name = g_strstrip(g_strdup(name_in));
2428 
2429  /* Optimization, if the name hasn't changed, don't update X. */
2430  if (*name == '\0' || 0 == strcmp(name, gnc_plugin_page_get_page_name(page)))
2431  {
2432  g_free(name);
2433  LEAVE("empty string or name unchanged");
2434  return;
2435  }
2436 
2437  /* Update the plugin */
2438  gnc_plugin_page_set_page_name(page, name);
2439 
2440  /* Update the notebook tab */
2441  window = GNC_MAIN_WINDOW(page->window);
2442  if (!window)
2443  {
2444  g_free(name);
2445  LEAVE("no window widget available");
2446  return;
2447  }
2448 
2449  if (main_window_find_tab_items(window, page, &label, &entry))
2450  gtk_label_set_text(GTK_LABEL(label), name);
2451 
2452  /* Adjust the label width for new text */
2453  tw = populate_tab_width_struct ();
2454  gnc_main_window_update_tab_width_one_page (page, tw);
2455  g_free (tw);
2456 
2457  /* Update the notebook menu */
2458  if (page->notebook_page)
2459  {
2460  priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
2461  label = gtk_notebook_get_menu_label (GTK_NOTEBOOK(priv->notebook),
2462  page->notebook_page);
2463  gtk_label_set_text(GTK_LABEL(label), name);
2464  }
2465 
2466  /* Force an update of the window title */
2467  gnc_main_window_update_title(window);
2468  g_free(name);
2469  LEAVE("done");
2470 }
This data structure allows the passing of the tab width and whether the tab layout is on the left or ...
const gchar * gnc_plugin_page_get_page_name(GncPluginPage *page)
Retrieve the name of this page.
GtkWidget * window
The window that contains the display widget for this plugin.
#define ENTER(format, args...)
Print a function entry debugging message.
Definition: qoflog.h:272
GtkWidget * notebook
The notebook containing all the pages in this window.
The instance private data structure for an embedded window object.
#define LEAVE(format, args...)
Print a function exit debugging message.
Definition: qoflog.h:282
void gnc_plugin_page_set_page_name(GncPluginPage *page, const char *name)
Set the name of this page.
GtkWidget * notebook_page
The display widget for this plugin.

◆ main_window_update_page_set_read_only_icon()

void main_window_update_page_set_read_only_icon ( GncPluginPage page,
gboolean  read_only 
)

Update the icon on the page tabs in the main window.

Parameters
pageThe page to be updated.
read_onlyIf set a padlock icon will be displayed for the page tab icon if it had one.

Definition at line 2548 of file gnc-main-window.cpp.

2550 {
2551  GncMainWindow *window;
2552  GtkWidget *tab_widget;
2553  GtkWidget *image = NULL;
2554  GList *children;
2555  gchar *image_name = NULL;
2556  const gchar *icon_name;
2557 
2558  ENTER(" ");
2559 
2560  g_return_if_fail (page && page->window);
2561 
2562  if (!GNC_IS_MAIN_WINDOW (page->window))
2563  return;
2564 
2565  window = GNC_MAIN_WINDOW(page->window);
2566 
2567  /* Get the notebook tab widget */
2568  main_window_find_tab_widget (window, page, &tab_widget);
2569 
2570  if (!tab_widget)
2571  {
2572  LEAVE("no tab widget");
2573  return;
2574  }
2575 
2576  if (GTK_IS_EVENT_BOX(tab_widget))
2577  tab_widget = gtk_bin_get_child (GTK_BIN(tab_widget));
2578 
2579  children = gtk_container_get_children (GTK_CONTAINER(tab_widget));
2580  /* For each, walk the list of container children to get image widget */
2581  for (GList *child = children; child; child = g_list_next (child))
2582  {
2583  GtkWidget *widget = static_cast<GtkWidget*>(child->data);
2584  if (GTK_IS_IMAGE(widget))
2585  image = widget;
2586  }
2587  g_list_free (children);
2588 
2589  if (!image)
2590  {
2591  LEAVE("no image to replace");
2592  return;
2593  }
2594 
2595  g_object_get (image, "icon-name", &image_name, NULL);
2596 
2597  if (read_only)
2598  icon_name = "changes-prevent-symbolic";
2599  else
2600  icon_name = GNC_PLUGIN_PAGE_GET_CLASS(page)->tab_icon;
2601 
2602  if (g_strcmp0 (icon_name, image_name) == 0)
2603  {
2604  LEAVE("page icon the same, no need to replace");
2605  g_free (image_name);
2606  return;
2607  }
2608  gtk_container_remove (GTK_CONTAINER(tab_widget), image);
2609  image = gtk_image_new_from_icon_name (icon_name, GTK_ICON_SIZE_MENU);
2610  gtk_widget_show (image);
2611 
2612  gtk_container_add (GTK_CONTAINER(tab_widget), image);
2613  gtk_widget_set_margin_start (GTK_WIDGET(image), 5);
2614  gtk_box_reorder_child (GTK_BOX(tab_widget), image, 0);
2615 
2616  g_free (image_name);
2617  LEAVE("done");
2618 }
GtkWidget * window
The window that contains the display widget for this plugin.
#define ENTER(format, args...)
Print a function entry debugging message.
Definition: qoflog.h:272
#define LEAVE(format, args...)
Print a function exit debugging message.
Definition: qoflog.h:282