void gnc_frequency_setup(GncFrequency *gf, GList *recurrences, const GDate *start_date) { gboolean made_changes = FALSE; // setup start-date, if present if (start_date != NULL && g_date_valid(start_date)) { gnc_date_edit_set_gdate(gf->startDate, start_date); made_changes = TRUE; } if (recurrences == NULL) { goto maybe_signal; // return... } if (g_list_length(recurrences) > 1) { if (recurrenceListIsWeeklyMultiple(recurrences)) { for (; recurrences != NULL; recurrences = recurrences->next) { _setup_weekly_recurrence(gf, (Recurrence*)recurrences->data); } gtk_notebook_set_current_page(gf->nb, PAGE_WEEKLY); gtk_combo_box_set_active(gf->freqComboBox, PAGE_WEEKLY); } else if (recurrenceListIsSemiMonthly(recurrences)) { Recurrence *first, *second; GtkWidget *multiplier_spin; GtkWidget *dom_combobox; first = (Recurrence*)g_list_nth_data(recurrences, 0); second = (Recurrence*)g_list_nth_data(recurrences, 1); multiplier_spin = glade_xml_get_widget(gf->gxml, "semimonthly_spin"); gtk_spin_button_set_value(GTK_SPIN_BUTTON(multiplier_spin), recurrenceGetMultiplier(first)); dom_combobox = glade_xml_get_widget(gf->gxml, "semimonthly_first"); gtk_combo_box_set_active(GTK_COMBO_BOX(dom_combobox), _get_monthly_combobox_index(first)); dom_combobox = glade_xml_get_widget(gf->gxml, "semimonthly_first_weekend"); gtk_combo_box_set_active(GTK_COMBO_BOX(dom_combobox), recurrenceGetWeekendAdjust(first)); dom_combobox = glade_xml_get_widget(gf->gxml, "semimonthly_second"); gtk_combo_box_set_active(GTK_COMBO_BOX(dom_combobox), _get_monthly_combobox_index(second)); dom_combobox = glade_xml_get_widget(gf->gxml, "semimonthly_second_weekend"); gtk_combo_box_set_active(GTK_COMBO_BOX(dom_combobox), recurrenceGetWeekendAdjust(second)); gtk_notebook_set_current_page(gf->nb, PAGE_SEMI_MONTHLY); gtk_combo_box_set_active(gf->freqComboBox, PAGE_SEMI_MONTHLY); } else { g_error("unknown composite recurrence with [%d] entries", g_list_length(recurrences)); } } else { Recurrence *r = (Recurrence*)recurrences->data; g_debug("recurrence period [%d]", recurrenceGetPeriodType(r)); switch (recurrenceGetPeriodType(r)) { case PERIOD_ONCE: { GDate recurrence_date = recurrenceGetDate(r); if (g_date_compare(start_date, &recurrence_date) != 0) { char start_date_str[128], recur_date_str[128]; g_date_strftime(start_date_str, 127, "%x", start_date); g_date_strftime(recur_date_str, 127, "%x", &recurrence_date); g_critical("start_date [%s] != recurrence_date [%s]", start_date_str, recur_date_str); } gtk_notebook_set_current_page(gf->nb, PAGE_ONCE); gtk_combo_box_set_active(gf->freqComboBox, PAGE_ONCE); } break; case PERIOD_DAY: { guint multiplier; GtkWidget *spin_button; multiplier = recurrenceGetMultiplier(r); spin_button = glade_xml_get_widget(gf->gxml, "daily_spin"); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin_button), multiplier); made_changes = TRUE; gtk_notebook_set_current_page(gf->nb, PAGE_DAILY); gtk_combo_box_set_active(gf->freqComboBox, PAGE_DAILY); } break; case PERIOD_WEEK: { _setup_weekly_recurrence(gf, r); gtk_notebook_set_current_page(gf->nb, PAGE_WEEKLY); gtk_combo_box_set_active(gf->freqComboBox, PAGE_WEEKLY); } break; case PERIOD_END_OF_MONTH: case PERIOD_MONTH: case PERIOD_YEAR: case PERIOD_LAST_WEEKDAY: case PERIOD_NTH_WEEKDAY: { guint multiplier; GtkWidget *multipler_spin, *day_of_month, *weekend_mode; multipler_spin = glade_xml_get_widget(gf->gxml, "monthly_spin"); multiplier = recurrenceGetMultiplier(r); if (recurrenceGetPeriodType(r) == PERIOD_YEAR) multiplier *= 12; gtk_spin_button_set_value(GTK_SPIN_BUTTON(multipler_spin), multiplier); day_of_month = glade_xml_get_widget(gf->gxml, "monthly_day"); gtk_combo_box_set_active(GTK_COMBO_BOX(day_of_month), _get_monthly_combobox_index(r)); weekend_mode = glade_xml_get_widget(gf->gxml, "monthly_weekend"); gtk_combo_box_set_active(GTK_COMBO_BOX(weekend_mode), recurrenceGetWeekendAdjust(r)); gtk_notebook_set_current_page(gf->nb, PAGE_MONTHLY); gtk_combo_box_set_active(gf->freqComboBox, PAGE_MONTHLY); } break; default: g_error("unknown recurrence period type [%d]", recurrenceGetPeriodType(r)); break; } } maybe_signal: if (made_changes) g_signal_emit_by_name(gf, "changed"); }
void gnc_ui_payment_window_set_date (PaymentWindow *pw, const GDate *date) { g_assert(pw); g_assert(date); gnc_date_edit_set_gdate (GNC_DATE_EDIT (pw->date_edit), date); }