/* ================================================================= */ static SchedXaction* load_single_sx (GncSqlBackend* sql_be, GncSqlRow& row) { const GncGUID* guid; SchedXaction* pSx; GList* schedule; GDate start_date; g_return_val_if_fail (sql_be != NULL, NULL); guid = gnc_sql_load_guid (sql_be, row); g_assert (guid != NULL); pSx = xaccSchedXactionMalloc (sql_be->book()); gnc_sx_begin_edit (pSx); gnc_sql_load_object (sql_be, row, GNC_SX_ID, pSx, col_table); schedule = gnc_sql_recurrence_load_list (sql_be, guid); gnc_sx_set_schedule (pSx, schedule); gnc_sx_commit_edit (pSx); gnc_sql_transaction_load_tx_for_account (sql_be, pSx->template_acct); g_object_get (pSx, "start-date", &start_date, NULL); return pSx; }
/********************* * Create the dialog * ********************/ void gnc_sx_create_from_trans( GtkWindow *parent, Transaction *trans ) { #ifndef __MINGW32__ int errno; #endif SXFromTransInfo *sxfti = g_new0( SXFromTransInfo, 1); GtkBuilder *builder; GtkWidget *dialog; builder = gtk_builder_new(); gnc_builder_add_from_file (builder , "dialog-sx.glade", "freq_liststore"); gnc_builder_add_from_file (builder , "dialog-sx.glade", "sx_from_real_trans_dialog"); dialog = GTK_WIDGET(gtk_builder_get_object (builder, "sx_from_real_trans_dialog")); // Set the style context for this dialog so it can be easily manipulated with css gnc_widget_set_style_context (GTK_WIDGET(dialog), "GncSxFromTransDialog"); gtk_window_set_transient_for (GTK_WINDOW (dialog), parent); sxfti->builder = builder; sxfti->dialog = dialog; sxfti->trans = trans; sxfti->sx = xaccSchedXactionMalloc(gnc_get_current_book ()); if ( (errno = sxftd_init( sxfti )) < 0 ) { if ( errno == SXFTD_ERRNO_OPEN_XACTION ) { gnc_error_dialog (NULL, "%s", _( "Cannot create a Scheduled Transaction " "from a Transaction currently " "being edited. Please Enter the " "Transaction before Scheduling." ) ); sxftd_close( sxfti, TRUE ); return; } else { g_error("sxftd_init: %d", errno); } } gtk_widget_show_all(GTK_WIDGET(sxfti->dialog)); gtk_builder_connect_signals(builder, sxfti); g_object_unref(G_OBJECT(builder)); }
/********************* * Create the dialog * ********************/ void gnc_sx_create_from_trans( Transaction *trans ) { int errno; SXFromTransInfo *sxfti = g_new0( SXFromTransInfo, 1); GtkBuilder *builder; GtkWidget *dialog; builder = gtk_builder_new(); gnc_builder_add_from_file (builder , "dialog-sx.glade", "freq_liststore"); gnc_builder_add_from_file (builder , "dialog-sx.glade", "sx_from_real_trans"); dialog = GTK_WIDGET(gtk_builder_get_object (builder, "sx_from_real_trans")); sxfti->builder = builder; sxfti->dialog = dialog; sxfti->trans = trans; sxfti->sx = xaccSchedXactionMalloc(gnc_get_current_book ()); if ( (errno = sxftd_init( sxfti )) < 0 ) { if ( errno == SXFTD_ERRNO_OPEN_XACTION ) { gnc_error_dialog( gnc_ui_get_toplevel(), "%s", _( "Cannot create a Scheduled Transaction " "from a Transaction currently " "being edited. Please Enter the " "Transaction before Scheduling." ) ); sxftd_close( sxfti, TRUE ); return; } else { g_error("sxftd_init: %d", errno); } } gtk_widget_show_all(GTK_WIDGET(sxfti->dialog)); gtk_builder_connect_signals(builder, sxfti); g_object_unref(G_OBJECT(builder)); }
static void gnc_plugin_page_sx_list_cmd_new(GtkAction *action, GncPluginPageSxList *page) { SchedXaction *new_sx; gboolean new_sx_flag = TRUE; new_sx = xaccSchedXactionMalloc(gnc_get_current_book()); { GDate now; Recurrence *r = new Recurrence;//g_new0(Recurrence, 1); g_date_clear(&now, 1); gnc_gdate_set_today (&now); recurrenceSet(r, 1, PERIOD_MONTH, &now, WEEKEND_ADJ_NONE); RecurrenceList_t schedule = gnc_sx_get_schedule(new_sx); schedule.push_back(r); gnc_sx_set_schedule(new_sx, schedule); } gnc_ui_scheduled_xaction_editor_dialog_create(new_sx, new_sx_flag); }
void gnc_sx_create_from_trans( Transaction *trans ) { int errno; SXFromTransInfo *sxfti = g_new0( SXFromTransInfo, 1); sxfti->gxml = gnc_glade_xml_new(SX_GLADE_FILE, SXFTD_DIALOG_GLADE_NAME); sxfti->dialog = glade_xml_get_widget(sxfti->gxml, SXFTD_DIALOG_GLADE_NAME); sxfti->trans = trans; sxfti->sx = xaccSchedXactionMalloc(gnc_get_current_book ()); if ( (errno = sxftd_init( sxfti )) < 0 ) { if ( errno == SXFTD_ERRNO_OPEN_XACTION ) { gnc_error_dialog( gnc_ui_get_toplevel(), "%s", _( "Cannot create a Scheduled Transaction " "from a Transaction currently " "being edited. Please Enter the " "Transaction before Scheduling." ) ); sxftd_close( sxfti, TRUE ); return; } else { g_error("sxftd_init: %d", errno); } } gtk_widget_show_all(GTK_WIDGET(sxfti->dialog)); }
static gboolean gnc_schedXaction_end_handler(gpointer data_for_children, GSList* data_from_children, GSList* sibling_data, gpointer parent_data, gpointer global_data, gpointer *result, const gchar *tag) { SchedXaction *sx; gboolean successful = FALSE; xmlNodePtr tree = (xmlNodePtr)data_for_children; gxpf_data *gdata = (gxpf_data*)global_data; struct sx_pdata sx_pdata; if ( parent_data ) { return TRUE; } if ( !tag ) { return TRUE; } g_return_val_if_fail( tree, FALSE ); sx = xaccSchedXactionMalloc( gdata->bookdata ); memset(&sx_pdata, 0, sizeof(sx_pdata)); sx_pdata.sx = sx; sx_pdata.book = gdata->bookdata; g_assert( sx_dom_handlers != NULL ); successful = dom_tree_generic_parse( tree, sx_dom_handlers, &sx_pdata ); if (!successful) { g_critical("failed to parse scheduled xaction"); xmlElemDump( stdout, NULL, tree ); gnc_sx_begin_edit( sx ); xaccSchedXactionDestroy( sx ); goto done; } if (tree->properties) { gchar *sx_name = xaccSchedXactionGetName(sx); xmlAttr *attr; for (attr = tree->properties; attr != NULL; attr = attr->next) { xmlChar *attr_value = attr->children->content; g_debug("sx attribute name[%s] value[%s]", attr->name, attr_value); if (strcmp((const char *)attr->name, "version") != 0) { g_warning("unknown sx attribute [%s]", attr->name); continue; } // if version == 1.0.0: ensure freqspec, no recurrence // if version == 2.0.0: ensure recurrence, no freqspec. if (strcmp((const char *)attr_value, schedxaction_version_string) == 0) { if (!sx_pdata.saw_freqspec) g_critical("did not see freqspec in version 1 sx [%s]", sx_name); if (sx_pdata.saw_recurrence) g_warning("saw recurrence in supposedly version 1 sx [%s]", sx_name); } if (strcmp((const char *)attr_value, schedxaction_version2_string) == 0) { if (sx_pdata.saw_freqspec) g_warning("saw freqspec in version 2 sx [%s]", sx_name); if (!sx_pdata.saw_recurrence) g_critical("did not find recurrence in version 2 sx [%s]", sx_name); } } } // generic_callback -> book_callback: insert the SX in the book gdata->cb( tag, gdata->parsedata, sx ); /* FIXME: this should be removed somewhere near 1.8 release time. */ if ( sx->template_acct == NULL ) { Account *ra = NULL; const char *id = NULL; Account *acct = NULL; sixtp_gdv2 *sixdata = gdata->parsedata; QofBook *book; book = sixdata->book; /* We're dealing with a pre-200107<near-end-of-month> rgmerk change re: storing template accounts. */ /* Fix: get account with name of our GncGUID from the template accounts. Make that our template_acct pointer. */ /* THREAD-UNSAFE */ id = guid_to_string( xaccSchedXactionGetGUID( sx ) ); ra = gnc_book_get_template_root(book); if ( ra == NULL ) { g_warning( "Error getting template root account from being-parsed Book." ); xmlFreeNode( tree ); return FALSE; } acct = gnc_account_lookup_by_name( ra, id ); if ( acct == NULL ) { g_warning("no template account with name [%s]", id); xmlFreeNode( tree ); return FALSE; } g_debug("template account name [%s] for SX with GncGUID [%s]", xaccAccountGetName( acct ), id ); /* FIXME: free existing template account. * HUH????? We only execute this if there isn't * currently an existing template account, don't we? * <rgmerk> */ sx->template_acct = acct; } done: xmlFreeNode( tree ); return successful; }