static void update_inactive_actions(GncPluginPage *plugin_page) { GncMainWindow *window; GtkActionGroup *action_group; // We are readonly - so we have to switch particular actions to inactive. gboolean is_readwrite = !qof_book_is_readonly(gnc_get_current_book()); // We continue only if the current page is a plugin page if (!plugin_page || !GNC_IS_PLUGIN_PAGE(plugin_page)) return; // Check that this is a main window and not embedded sx if (!GNC_IS_MAIN_WINDOW(plugin_page->window)) return; window = GNC_MAIN_WINDOW(plugin_page->window); g_return_if_fail(GNC_IS_MAIN_WINDOW(window)); action_group = gnc_main_window_get_action_group(window, PLUGIN_ACTIONS_NAME); g_return_if_fail(GTK_IS_ACTION_GROUP(action_group)); /* Set the action's sensitivity */ gnc_plugin_update_actions (action_group, readonly_inactive_actions, "sensitive", is_readwrite); }
static void gnc_plugin_page_owner_tree_selection_changed_cb (GtkTreeSelection *selection, GncPluginPageOwnerTree *page) { GtkActionGroup *action_group; GtkTreeView *view; GncOwner *owner = NULL; gboolean sensitive; gboolean is_readwrite = !qof_book_is_readonly(gnc_get_current_book()); g_return_if_fail(GNC_IS_PLUGIN_PAGE_OWNER_TREE(page)); if (!selection) { sensitive = FALSE; } else { g_return_if_fail(GTK_IS_TREE_SELECTION(selection)); view = gtk_tree_selection_get_tree_view (selection); owner = gnc_tree_view_owner_get_selected_owner (GNC_TREE_VIEW_OWNER(view)); sensitive = (owner != NULL); } action_group = gnc_plugin_page_get_action_group(GNC_PLUGIN_PAGE(page)); gnc_plugin_update_actions (action_group, actions_requiring_owner_always, "sensitive", sensitive); gnc_plugin_update_actions (action_group, actions_requiring_owner_rw, "sensitive", sensitive && is_readwrite); g_signal_emit (page, plugin_page_signals[OWNER_SELECTED], 0, owner); }
void gnc_plugin_page_invoice_update_menus (GncPluginPage *page, gboolean is_posted, gboolean can_unpost) { GtkActionGroup *action_group; gboolean is_readonly = qof_book_is_readonly(gnc_get_current_book()); g_return_if_fail(GNC_IS_PLUGIN_PAGE_INVOICE(page)); if (is_readonly) { // Are we readonly? Then don't allow any actions. is_posted = TRUE; can_unpost = FALSE; } action_group = gnc_plugin_page_get_action_group(page); gnc_plugin_update_actions (action_group, posted_actions, "sensitive", is_posted); gnc_plugin_update_actions (action_group, unposted_actions, "sensitive", !is_posted); gnc_plugin_update_actions (action_group, can_unpost_actions, "sensitive", can_unpost); gnc_plugin_update_actions (action_group, invoice_book_readwrite_actions, "sensitive", !is_readonly); }
static void gnc_main_window_cmd_actions_since_last_run (GtkAction *action, GncMainWindowActionData *data) { GtkWindow *window; GncSxInstanceModel *sx_instances; GncSxSummary summary; GList *auto_created_txns = NULL; const char *nothing_to_do_msg = _( "There are no Scheduled Transactions to be entered at this time." ); g_return_if_fail (data != NULL); window = GTK_WINDOW (data->window); if (qof_book_is_readonly(gnc_get_current_book())) { /* Is the book read-only? Then don't change anything here. */ return; } sx_instances = gnc_sx_get_current_instances(); gnc_sx_instance_model_summarize(sx_instances, &summary); gnc_sx_instance_model_effect_change(sx_instances, TRUE, &auto_created_txns, NULL); if (summary.need_dialog) { gnc_ui_sx_since_last_run_dialog (window, sx_instances, auto_created_txns); auto_created_txns = NULL; } else { if (summary.num_auto_create_no_notify_instances == 0) { gnc_info_dialog (window, "%s", nothing_to_do_msg); } else { gnc_info_dialog(window, ngettext /* Translators: %d is the number of transactions. This is a ngettext(3) message. */ ("There are no Scheduled Transactions to be entered at this time. " "(%d transaction automatically created)", "There are no Scheduled Transactions to be entered at this time. " "(%d transactions automatically created)", summary.num_auto_create_no_notify_instances), summary.num_auto_create_no_notify_instances); } } g_list_free(auto_created_txns); g_object_unref(G_OBJECT(sx_instances)); }
/** * @param auto_create_only Will only affect auto-create transactions; the * rest of the state will be left alone. **/ void gnc_sx_slr_model_effect_change(GncSxSlrTreeModelAdapter *model, gboolean auto_create_only, GList **created_transaction_guids, GList **creation_errors) { if (qof_book_is_readonly(gnc_get_current_book())) { /* Is the book read-only? Then don't change anything here. */ return; } g_signal_handler_block(model->instances, model->updated_cb_id); gnc_sx_instance_model_effect_change(model->instances, auto_create_only, created_transaction_guids, creation_errors); g_signal_handler_unblock(model->instances, model->updated_cb_id); }
void gnc_sx_sxsincelast_book_opened(void) { GList *auto_created_txns = NULL; GncSxInstanceModel *inst_model; GncSxSummary summary; if (!gnc_prefs_get_bool (GNC_PREFS_GROUP_STARTUP, GNC_PREF_RUN_AT_FOPEN)) return; if (qof_book_is_readonly(gnc_get_current_book())) { /* Is the book read-only? Then don't change anything here. */ return; } inst_model = gnc_sx_get_current_instances(); gnc_sx_instance_model_summarize(inst_model, &summary); gnc_sx_summary_print(&summary); gnc_sx_instance_model_effect_change(inst_model, TRUE, &auto_created_txns, NULL); if (summary.need_dialog) { gnc_ui_sx_since_last_run_dialog(inst_model, auto_created_txns); auto_created_txns = NULL; } else { if (summary.num_auto_create_no_notify_instances != 0) { if (!gnc_prefs_get_bool(GNC_PREFS_GROUP_STARTUP, GNC_PREF_SHOW_AT_FOPEN)) return; gnc_info_dialog (NULL, ngettext ("There are no Scheduled Transactions to be entered at this time. " "(One transaction automatically created)", "There are no Scheduled Transactions to be entered at this time. " "(%d transactions automatically created)", summary.num_auto_create_no_notify_instances), summary.num_auto_create_no_notify_instances); } } g_list_free(auto_created_txns); g_object_unref(G_OBJECT(inst_model)); }
static void update_inactive_actions(GncPluginPage *plugin_page) { GtkActionGroup *action_group; gboolean is_sensitive = !qof_book_is_readonly(gnc_get_current_book()); // We are readonly - so we have to switch particular actions to inactive. g_return_if_fail(plugin_page); g_return_if_fail(GNC_IS_PLUGIN_PAGE(plugin_page)); /* Get the action group */ action_group = gnc_plugin_page_get_action_group(plugin_page); g_return_if_fail(GTK_IS_ACTION_GROUP (action_group)); /* Set the action's sensitivity */ gnc_plugin_update_actions (action_group, readonly_inactive_actions, "sensitive", is_sensitive); }
/** * Determines whether this register window should be read-only. **/ static void gnc_split_reg2_determine_read_only (GNCSplitReg2 *gsr) //this works { if (qof_book_is_readonly (gnc_get_current_book())) { /* Is the book read-only? Then for sure also make this register read-only. */ gsr->read_only = TRUE; } if (!gsr->read_only) { dialog_args *args = g_malloc (sizeof (dialog_args)); switch (gnc_split_reg2_get_placeholder (gsr)) { case PLACEHOLDER_NONE: /* stay as false. */ g_free (args); return; case PLACEHOLDER_THIS: args->string = _("This account may not be edited. If you want " "to edit transactions in this register, please " "open the account options and turn off the " "placeholder checkbox."); break; default: args->string = _("One of the sub-accounts selected may not be " "edited. If you want to edit transactions in " "this register, please open the sub-account " "options and turn off the placeholder checkbox. " "You may also open an individual account instead " "of a set of accounts."); break; } gsr->read_only = TRUE; /* Put up a warning dialog */ args->gsr = gsr; g_timeout_add (250, gtk_callback_bug_workaround, args); /* 0.25 seconds */ } }
static void gnc_search_dialog_select_buttons_enable (GNCSearchWindow *sw, gint selected) { gint i; gboolean enable, read_only; GList *blist; read_only = qof_book_is_readonly (gnc_get_current_book ()); for (blist = sw->button_list; blist; blist = blist->next) { GNCSearchCallbackButton *button_spec = g_object_get_data (G_OBJECT(blist->data) , "data"); if(selected == 0) { gtk_widget_set_sensitive (GTK_WIDGET(blist->data), FALSE); continue; } if(read_only == TRUE) { if((selected > 1) && (!(button_spec->cb_multiselect_fn == NULL)) && (button_spec->sensitive_if_readonly == TRUE)) enable = TRUE; else enable = FALSE; if((selected == 1) && (button_spec->sensitive_if_readonly == TRUE)) enable = TRUE; } else { if((selected > 1) && (!(button_spec->cb_multiselect_fn == NULL))) enable = TRUE; else enable = FALSE; if(selected == 1) enable = TRUE; } gtk_widget_set_sensitive (GTK_WIDGET(blist->data), enable); } }
/* Commit_edit handler - find the correct backend handler for this object * type and call its commit handler */ void GncSqlBackend::commit_edit (QofInstance* inst) { sql_backend be_data; gboolean is_dirty; gboolean is_destroying; gboolean is_infant; g_return_if_fail (inst != NULL); if (qof_book_is_readonly(m_book)) { qof_backend_set_error (&qof_be, ERR_BACKEND_READONLY); (void)m_conn->rollback_transaction (); return; } /* During initial load where objects are being created, don't commit anything, but do mark the object as clean. */ if (m_loading) { qof_instance_mark_clean (inst); return; } // The engine has a PriceDB object but it isn't in the database if (strcmp (inst->e_type, "PriceDB") == 0) { qof_instance_mark_clean (inst); qof_book_mark_session_saved (m_book); return; } ENTER (" "); is_dirty = qof_instance_get_dirty_flag (inst); is_destroying = qof_instance_get_destroying (inst); is_infant = qof_instance_get_infant (inst); DEBUG ("%s dirty = %d, do_free = %d, infant = %d\n", (inst->e_type ? inst->e_type : "(null)"), is_dirty, is_destroying, is_infant); if (!is_dirty && !is_destroying) { LEAVE ("!dirty OR !destroying"); return; } if (!m_conn->begin_transaction ()) { PERR ("begin_transaction failed\n"); LEAVE ("Rolled back - database transaction begin error"); return; } bool is_ok = true; auto obe = m_backend_registry.get_object_backend(std::string{inst->e_type}); if (obe != nullptr) is_ok = obe->commit(this, inst); else { PERR ("Unknown object type '%s'\n", inst->e_type); (void)m_conn->rollback_transaction (); // Don't let unknown items still mark the book as being dirty qof_book_mark_session_saved(m_book); qof_instance_mark_clean (inst); LEAVE ("Rolled back - unknown object type"); return; } if (!is_ok) { // Error - roll it back (void)m_conn->rollback_transaction(); // This *should* leave things marked dirty LEAVE ("Rolled back - database error"); return; } (void)m_conn->commit_transaction (); qof_book_mark_session_saved(m_book); qof_instance_mark_clean (inst); LEAVE (""); }
static void gnc_search_dialog_display_results (GNCSearchWindow *sw) { gdouble max_count; /* Check if this is the first time this is called for this window. * If so, then build the results sub-window, the scrolled treeview, * and the active buttons. */ if (sw->result_view == NULL) { GtkWidget *scroller, *frame, *button_box, *button; /* Create the view */ gnc_search_dialog_init_result_view (sw); frame = gtk_frame_new(NULL); /* Create the scroller and add the view to the scroller */ scroller = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroller), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_widget_set_size_request(GTK_WIDGET(scroller), 300, 100); gtk_container_add (GTK_CONTAINER (scroller), sw->result_view); gtk_container_add(GTK_CONTAINER(frame), scroller); /* Create the button_box */ button_box = gtk_vbox_new (FALSE, 3); /* ... and add all the buttons */ if (sw->buttons) { int i; button = gtk_button_new_with_label (_("Select")); g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (gnc_search_dialog_select_cb), sw); gtk_box_pack_start (GTK_BOX (button_box), button, FALSE, FALSE, 3); sw->select_button = button; for (i = 0; sw->buttons[i].label; i++) { GNCSearchCallbackButton* button_spec = sw->buttons + i; button = gtk_button_new_with_label (_(button_spec->label)); g_object_set_data (G_OBJECT (button), "data", button_spec); if (qof_book_is_readonly (gnc_get_current_book ())) gtk_widget_set_sensitive (GTK_WIDGET(button), button_spec->sensitive_if_readonly); /* Save the button pointer */ sw->button_list = g_list_append(sw->button_list, button); g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (gnc_search_dialog_result_clicked), sw); gtk_box_pack_start (GTK_BOX (button_box), button, FALSE, FALSE, 3); } } /* Add the scrolled-view and button-box to the results_box */ gtk_box_pack_end (GTK_BOX (sw->result_hbox), button_box, FALSE, FALSE, 3); gtk_box_pack_end (GTK_BOX (sw->result_hbox), frame, TRUE, TRUE, 3); /* And show the results */ gtk_widget_show_all (sw->result_hbox); /* But may be hide the select button */ if (!sw->selected_cb) gtk_widget_hide (sw->select_button); } else /* Update the query in the view */ gnc_query_view_reset_query (GNC_QUERY_VIEW(sw->result_view), sw->q); /* Deselect all the select buttons and any items */ gnc_search_dialog_select_buttons_enable (sw, 0); gnc_query_view_unselect_all (GNC_QUERY_VIEW(sw->result_view)); /* set 'new search' if fewer than max_count items is returned. */ max_count = gnc_prefs_get_float(GNC_PREFS_GROUP_SEARCH_GENERAL, GNC_PREF_NEW_SEARCH_LIMIT); if (gnc_query_view_get_num_entries(GNC_QUERY_VIEW(sw->result_view)) < max_count) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON (sw->new_rb), TRUE); }