/********************************************************************\ * gnc_stock_split_dialog * * opens up a window to record a stock split * * * * Args: parent - the parent ofthis window * * initial - the initial account to use * * Return: nothing * \********************************************************************/ void gnc_stock_split_dialog (GtkWidget *parent, Account * initial) { StockSplitInfo *info; gint component_id; info = g_new0 (StockSplitInfo, 1); info->acct = NULL; gnc_stock_split_assistant_create (info); component_id = gnc_register_gui_component (ASSISTANT_STOCK_SPLIT_CM_CLASS, refresh_handler, close_handler, info); gnc_gui_component_watch_entity_type (component_id, GNC_ID_ACCOUNT, QOF_EVENT_MODIFY | QOF_EVENT_DESTROY); if (fill_account_list (info, initial) == 0) { gnc_warning_dialog (parent, "%s", _("You don't have any stock accounts with balances!")); gnc_close_gui_component_by_data (ASSISTANT_STOCK_SPLIT_CM_CLASS, info); return; } gtk_widget_show_all (info->window); gnc_window_adjust_for_screen (GTK_WINDOW(info->window)); }
GtkWidget * gnc_main_window_summary_new (void) { GNCMainSummary * retval = g_new0(GNCMainSummary, 1); GtkCellRenderer *textRenderer; int i; retval->datamodel = gtk_list_store_new (N_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); retval->hbox = gtk_hbox_new (FALSE, 5); retval->totals_combo = gtk_combo_box_new_with_model (GTK_TREE_MODEL (retval->datamodel)); g_object_unref (retval->datamodel); retval->component_id = gnc_register_gui_component (WINDOW_SUMMARYBAR_CM_CLASS, summarybar_refresh_handler, NULL, retval); gnc_gui_component_watch_entity_type (retval->component_id, GNC_ID_ACCOUNT, QOF_EVENT_DESTROY | GNC_EVENT_ITEM_CHANGED); // Allows you to get when the popup menu is present g_signal_connect (retval->totals_combo, "notify::popup-shown",G_CALLBACK (summary_combo_popped), retval); retval->combo_popped = FALSE; for (i = 0; i <= N_COLUMNS; i += 2) { textRenderer = GTK_CELL_RENDERER(gtk_cell_renderer_text_new()); gtk_cell_renderer_set_fixed_size (textRenderer, 50, -1); gtk_cell_layout_pack_start (GTK_CELL_LAYOUT(retval->totals_combo), textRenderer, TRUE); g_object_set_data (G_OBJECT(textRenderer), "view_column", GINT_TO_POINTER (i)); gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT(retval->totals_combo), textRenderer, cdf, retval, NULL); } gtk_container_set_border_width (GTK_CONTAINER (retval->hbox), 2); gtk_box_pack_start (GTK_BOX(retval->hbox), retval->totals_combo, TRUE, TRUE, 5); gtk_widget_show (retval->totals_combo); gtk_widget_show (retval->hbox); g_signal_connect_swapped (G_OBJECT (retval->hbox), "destroy", G_CALLBACK (gnc_main_window_summary_destroy_cb), retval); gnc_main_window_summary_refresh(retval); retval->cnxn_id = gnc_prefs_register_cb (GNC_PREFS_GROUP, NULL, prefs_changed_cb, retval); return retval->hbox; }
GtkWidget * gnc_main_window_summary_new (void) { GNCMainSummary * retval = g_new0(GNCMainSummary, 1); GtkCellRenderer *textRenderer; int i; // These options lead to a better looking layout for the combo-box, where // the "Assets: $####.##" and "Profit: $####.##" values are visually next // to each other. gboolean expandOptions[] = { TRUE, FALSE, TRUE, FALSE, TRUE }; retval->datamodel = gtk_list_store_new( N_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING ); retval->hbox = gtk_hbox_new (FALSE, 5); retval->totals_combo = gtk_combo_box_new_with_model (GTK_TREE_MODEL (retval->datamodel)); g_object_unref (retval->datamodel); retval->component_id = gnc_register_gui_component (WINDOW_SUMMARYBAR_CM_CLASS, summarybar_refresh_handler, NULL, retval); gnc_gui_component_watch_entity_type (retval->component_id, GNC_ID_ACCOUNT, QOF_EVENT_DESTROY | GNC_EVENT_ITEM_CHANGED); for ( i = 0; i < N_COLUMNS; i++ ) { textRenderer = GTK_CELL_RENDERER(gtk_cell_renderer_text_new()); gtk_cell_layout_pack_start( GTK_CELL_LAYOUT(retval->totals_combo), textRenderer, expandOptions[i] ); gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(retval->totals_combo), textRenderer, "text", i ); } gtk_container_set_border_width (GTK_CONTAINER (retval->hbox), 2); gtk_box_pack_start (GTK_BOX(retval->hbox), retval->totals_combo, TRUE, TRUE, 5); gtk_widget_show (retval->totals_combo); gtk_widget_show (retval->hbox); g_signal_connect_swapped (G_OBJECT (retval->hbox), "destroy", G_CALLBACK (gnc_main_window_summary_destroy_cb), retval); gnc_main_window_summary_refresh(retval); retval->cnxn_id = gnc_gconf_add_anon_notification(GCONF_SECTION, gconf_client_notify_cb, retval); return retval->hbox; }
static void gnc_simple_combo_make (GtkComboBox *cbox, QofBook *book, gboolean none_ok, QofIdType type_name, GList * (*get_list)(QofBook*), GenericLookup_t get_name, GenericEqual_t is_equal, gpointer initial_choice) { ListStoreData *lsd; lsd = g_object_get_data (G_OBJECT (cbox), "liststore-data"); /* If this is the first time we've been called, then build the * Option Menu Data object, register with the component manager, and * watch for changed items. Then register for deletion, so we can * unregister and free the data when this menu is destroyed. */ if (!lsd) { lsd = g_new0 (ListStoreData, 1); lsd->cbox = cbox; lsd->book = book; lsd->none_ok = none_ok; lsd->get_name = get_name; lsd->get_list = get_list; lsd->is_equal = is_equal; g_object_set_data (G_OBJECT (cbox), "liststore-data", lsd); lsd->component_id = gnc_register_gui_component ("gnc-simple-combo-refresh-hook", gnc_simple_combo_refresh_handler, NULL, lsd); if (type_name) gnc_gui_component_watch_entity_type (lsd->component_id, type_name, QOF_EVENT_MODIFY | QOF_EVENT_DESTROY); g_signal_connect (G_OBJECT (cbox), "destroy", G_CALLBACK (gnc_simple_combo_destroy_cb), lsd); } gnc_simple_combo_generate_liststore (lsd); gnc_simple_combo_set_value (cbox, initial_choice); }
static void gnc_ledger_display_set_watches (GNCLedgerDisplay *ld, GList *splits) { GList *node; gnc_gui_component_clear_watches (ld->component_id); gnc_gui_component_watch_entity_type (ld->component_id, GNC_ID_ACCOUNT, QOF_EVENT_MODIFY | QOF_EVENT_DESTROY | GNC_EVENT_ITEM_CHANGED); for (node = splits; node; node = node->next) { Split *split = node->data; Transaction *trans = xaccSplitGetParent (split); gnc_gui_component_watch_entity (ld->component_id, xaccTransGetGUID (trans), QOF_EVENT_MODIFY); } }
static CustomerWindow * gnc_customer_new_window (QofBook *bookp, GncCustomer *cust) { CustomerWindow *cw; GtkBuilder *builder; GtkWidget *hbox, *edit; gnc_commodity *currency; GNCPrintAmountInfo print_info; /* * Find an existing window for this customer. If found, bring it to * the front. */ if (cust) { GncGUID customer_guid; customer_guid = *gncCustomerGetGUID(cust); cw = gnc_find_first_gui_component (DIALOG_EDIT_CUSTOMER_CM_CLASS, find_handler, &customer_guid); if (cw) { gtk_window_present (GTK_WINDOW(cw->dialog)); return(cw); } } /* Find the default currency */ if (cust) currency = gncCustomerGetCurrency (cust); else currency = gnc_default_currency (); /* * No existing customer window found. Build a new one. */ cw = g_new0 (CustomerWindow, 1); cw->book = bookp; /* Find the dialog */ builder = gtk_builder_new(); gnc_builder_add_from_file (builder, "dialog-customer.glade", "terms_store"); gnc_builder_add_from_file (builder, "dialog-customer.glade", "tax_included_store"); gnc_builder_add_from_file (builder, "dialog-customer.glade", "taxtable_store"); gnc_builder_add_from_file (builder, "dialog-customer.glade", "Customer Dialog"); cw->dialog = GTK_WIDGET (gtk_builder_get_object (builder, "Customer Dialog")); g_object_set_data (G_OBJECT (cw->dialog), "dialog_info", cw); /* Get entry points */ cw->id_entry = GTK_WIDGET (gtk_builder_get_object (builder, "id_entry")); cw->company_entry = GTK_WIDGET (gtk_builder_get_object (builder, "company_entry")); cw->name_entry = GTK_WIDGET (gtk_builder_get_object (builder, "name_entry")); cw->addr1_entry = GTK_WIDGET (gtk_builder_get_object (builder, "addr1_entry")); cw->addr2_entry = GTK_WIDGET (gtk_builder_get_object (builder, "addr2_entry")); cw->addr3_entry = GTK_WIDGET (gtk_builder_get_object (builder, "addr3_entry")); cw->addr4_entry = GTK_WIDGET (gtk_builder_get_object (builder, "addr4_entry")); cw->phone_entry = GTK_WIDGET (gtk_builder_get_object (builder, "phone_entry")); cw->fax_entry = GTK_WIDGET (gtk_builder_get_object (builder, "fax_entry")); cw->email_entry = GTK_WIDGET (gtk_builder_get_object (builder, "email_entry")); cw->shipname_entry = GTK_WIDGET (gtk_builder_get_object (builder, "shipname_entry")); cw->shipaddr1_entry = GTK_WIDGET (gtk_builder_get_object (builder, "shipaddr1_entry")); cw->shipaddr2_entry = GTK_WIDGET (gtk_builder_get_object (builder, "shipaddr2_entry")); cw->shipaddr3_entry = GTK_WIDGET (gtk_builder_get_object (builder, "shipaddr3_entry")); cw->shipaddr4_entry = GTK_WIDGET (gtk_builder_get_object (builder, "shipaddr4_entry")); cw->shipphone_entry = GTK_WIDGET (gtk_builder_get_object (builder, "shipphone_entry")); cw->shipfax_entry = GTK_WIDGET (gtk_builder_get_object (builder, "shipfax_entry")); cw->shipemail_entry = GTK_WIDGET (gtk_builder_get_object (builder, "shipemail_entry")); cw->active_check = GTK_WIDGET (gtk_builder_get_object (builder, "active_check")); cw->taxincluded_menu = GTK_WIDGET (gtk_builder_get_object (builder, "tax_included_menu")); cw->notes_text = GTK_WIDGET (gtk_builder_get_object (builder, "notes_text")); cw->terms_menu = GTK_WIDGET (gtk_builder_get_object (builder, "terms_menu")); cw->taxtable_check = GTK_WIDGET (gtk_builder_get_object (builder, "taxtable_button")); cw->taxtable_menu = GTK_WIDGET (gtk_builder_get_object (builder, "taxtable_menu")); /* Currency */ edit = gnc_currency_edit_new(); gnc_currency_edit_set_currency (GNC_CURRENCY_EDIT(edit), currency); cw->currency_edit = edit; hbox = GTK_WIDGET (gtk_builder_get_object (builder, "currency_box")); gtk_box_pack_start (GTK_BOX (hbox), edit, TRUE, TRUE, 0); /* DISCOUNT: Percentage Value */ edit = gnc_amount_edit_new(); gnc_amount_edit_set_evaluate_on_enter (GNC_AMOUNT_EDIT (edit), TRUE); print_info = gnc_integral_print_info (); print_info.max_decimal_places = 5; gnc_amount_edit_set_print_info (GNC_AMOUNT_EDIT (edit), print_info); gnc_amount_edit_set_fraction (GNC_AMOUNT_EDIT (edit), 100000); cw->discount_amount = edit; gtk_widget_show (edit); hbox = GTK_WIDGET (gtk_builder_get_object (builder, "discount_box")); gtk_box_pack_start (GTK_BOX (hbox), edit, TRUE, TRUE, 0); /* CREDIT: Monetary Value */ edit = gnc_amount_edit_new(); print_info = gnc_commodity_print_info (currency, FALSE); gnc_amount_edit_set_evaluate_on_enter (GNC_AMOUNT_EDIT (edit), TRUE); gnc_amount_edit_set_print_info (GNC_AMOUNT_EDIT (edit), print_info); gnc_amount_edit_set_fraction (GNC_AMOUNT_EDIT (edit), gnc_commodity_get_fraction (currency)); cw->credit_amount = edit; gtk_widget_show (edit); hbox = GTK_WIDGET (gtk_builder_get_object (builder, "credit_box")); gtk_box_pack_start (GTK_BOX (hbox), edit, TRUE, TRUE, 0); /* Setup signals */ gtk_builder_connect_signals_full( builder, gnc_builder_connect_full_func, cw); /* Setup initial values */ if (cust != NULL) { GtkTextBuffer* text_buffer; GncAddress *addr, *shipaddr; const char *string; cw->dialog_type = EDIT_CUSTOMER; cw->customer_guid = *gncCustomerGetGUID (cust); addr = gncCustomerGetAddr (cust); shipaddr = gncCustomerGetShipAddr (cust); gtk_entry_set_text (GTK_ENTRY (cw->id_entry), gncCustomerGetID (cust)); gtk_entry_set_text (GTK_ENTRY (cw->company_entry), gncCustomerGetName (cust)); /* Setup Address */ gtk_entry_set_text (GTK_ENTRY (cw->name_entry), gncAddressGetName (addr)); gtk_entry_set_text (GTK_ENTRY (cw->addr1_entry), gncAddressGetAddr1 (addr)); gtk_entry_set_text (GTK_ENTRY (cw->addr2_entry), gncAddressGetAddr2 (addr)); gtk_entry_set_text (GTK_ENTRY (cw->addr3_entry), gncAddressGetAddr3 (addr)); gtk_entry_set_text (GTK_ENTRY (cw->addr4_entry), gncAddressGetAddr4 (addr)); gtk_entry_set_text (GTK_ENTRY (cw->phone_entry), gncAddressGetPhone (addr)); gtk_entry_set_text (GTK_ENTRY (cw->fax_entry), gncAddressGetFax (addr)); gtk_entry_set_text (GTK_ENTRY (cw->email_entry), gncAddressGetEmail (addr)); /* Setup Ship-to Address */ gtk_entry_set_text (GTK_ENTRY (cw->shipname_entry), gncAddressGetName (shipaddr)); gtk_entry_set_text (GTK_ENTRY (cw->shipaddr1_entry), gncAddressGetAddr1 (shipaddr)); gtk_entry_set_text (GTK_ENTRY (cw->shipaddr2_entry), gncAddressGetAddr2 (shipaddr)); gtk_entry_set_text (GTK_ENTRY (cw->shipaddr3_entry), gncAddressGetAddr3 (shipaddr)); gtk_entry_set_text (GTK_ENTRY (cw->shipaddr4_entry), gncAddressGetAddr4 (shipaddr)); gtk_entry_set_text (GTK_ENTRY (cw->shipphone_entry), gncAddressGetPhone (shipaddr)); gtk_entry_set_text (GTK_ENTRY (cw->shipfax_entry), gncAddressGetFax (shipaddr)); gtk_entry_set_text (GTK_ENTRY (cw->shipemail_entry), gncAddressGetEmail (shipaddr)); /* Set toggle buttons */ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (cw->active_check), gncCustomerGetActive (cust)); string = gncCustomerGetNotes (cust); text_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW(cw->notes_text)); gtk_text_buffer_set_text (text_buffer, string, -1); cw->component_id = gnc_register_gui_component (DIALOG_EDIT_CUSTOMER_CM_CLASS, gnc_customer_window_refresh_handler, gnc_customer_window_close_handler, cw); cw->terms = gncCustomerGetTerms (cust); } else { cust = gncCustomerCreate (bookp); cw->customer_guid = *gncCustomerGetGUID (cust); cw->dialog_type = NEW_CUSTOMER; cw->component_id = gnc_register_gui_component (DIALOG_NEW_CUSTOMER_CM_CLASS, gnc_customer_window_refresh_handler, gnc_customer_window_close_handler, cw); /* XXX: get the global-default terms */ cw->terms = NULL; } /* I know that cust exists here -- either passed in or just created */ cw->taxincluded = gncCustomerGetTaxIncluded (cust); gnc_taxincluded_combo (GTK_COMBO_BOX(cw->taxincluded_menu), cw->taxincluded); gnc_billterms_combo (GTK_COMBO_BOX(cw->terms_menu), bookp, TRUE, cw->terms); cw->taxtable = gncCustomerGetTaxTable (cust); gnc_taxtables_combo (GTK_COMBO_BOX(cw->taxtable_menu), bookp, TRUE, cw->taxtable); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (cw->taxtable_check), gncCustomerGetTaxTableOverride (cust)); gnc_customer_taxtable_check_cb (GTK_TOGGLE_BUTTON (cw->taxtable_check), cw); /* Set up the addr line quickfill */ cw->addr2_quickfill = gnc_get_shared_address_addr2_quickfill(cw->book, ADDR_QUICKFILL); cw->addr3_quickfill = gnc_get_shared_address_addr3_quickfill(cw->book, ADDR_QUICKFILL); cw->addr4_quickfill = gnc_get_shared_address_addr4_quickfill(cw->book, ADDR_QUICKFILL); /* Set the Discount, and Credit amounts */ gnc_amount_edit_set_amount (GNC_AMOUNT_EDIT (cw->discount_amount), gncCustomerGetDiscount (cust)); gnc_amount_edit_set_amount (GNC_AMOUNT_EDIT (cw->credit_amount), gncCustomerGetCredit (cust)); gnc_gui_component_watch_entity_type (cw->component_id, GNC_CUSTOMER_MODULE_NAME, QOF_EVENT_MODIFY | QOF_EVENT_DESTROY); gtk_widget_show_all (cw->dialog); g_object_unref(G_OBJECT(builder)); return cw; }
static PaymentWindow * new_payment_window (GncOwner *owner, QofBook *book, GncInvoice *invoice) { PaymentWindow *pw; GtkBuilder *builder; GtkWidget *box, *label, *credit_box, *debit_box; GtkTreeSelection *selection; GtkTreeViewColumn *column; GtkCellRenderer *renderer; char * cm_class = (gncOwnerGetType (owner) == GNC_OWNER_CUSTOMER ? DIALOG_PAYMENT_CUSTOMER_CM_CLASS : DIALOG_PAYMENT_VENDOR_CM_CLASS); /* * Find an existing payment window. If found, bring it to * the front. If we have an actual owner, then set it in * the window. */ pw = gnc_find_first_gui_component (cm_class, find_handler, NULL); if (pw) { if (gncOwnerIsValid(owner)) gnc_payment_set_owner (pw, owner); // Reset the setting about the pre-existing TXN pw->pre_existing_txn = NULL; gtk_window_present (GTK_WINDOW(pw->dialog)); return(pw); } /* Ok, we need a new window */ pw = g_new0 (PaymentWindow, 1); pw->book = book; gncOwnerCopy (owner, &(pw->owner)); /* Compute the post-to account types */ pw->acct_types = gncOwnerGetAccountTypesList (owner); if (gncOwnerIsValid(owner)) pw->acct_commodities = gncOwnerGetCommoditiesList (owner); /* Open and read the Glade File */ builder = gtk_builder_new(); gnc_builder_add_from_file (builder, "dialog-payment.glade", "docs_list_hor_adj"); gnc_builder_add_from_file (builder, "dialog-payment.glade", "docs_list_vert_adj"); gnc_builder_add_from_file (builder, "dialog-payment.glade", "docs_list_model"); gnc_builder_add_from_file (builder, "dialog-payment.glade", "post_combo_model"); gnc_builder_add_from_file (builder, "dialog-payment.glade", "Payment Dialog"); pw->dialog = GTK_WIDGET (gtk_builder_get_object (builder, "Payment Dialog")); /* Grab the widgets and build the dialog */ pw->payment_warning = GTK_WIDGET (gtk_builder_get_object (builder, "payment_warning")); pw->ok_button = GTK_WIDGET (gtk_builder_get_object (builder, "okbutton")); pw->num_entry = GTK_WIDGET (gtk_builder_get_object (builder, "num_entry")); pw->memo_entry = GTK_WIDGET (gtk_builder_get_object (builder, "memo_entry")); pw->post_combo = GTK_WIDGET (gtk_builder_get_object (builder, "post_combo")); gtk_combo_box_set_entry_text_column( GTK_COMBO_BOX( pw->post_combo ), 0 ); gnc_cbwe_require_list_item(GTK_COMBO_BOX(pw->post_combo)); label = GTK_WIDGET (gtk_builder_get_object (builder, "owner_label")); box = GTK_WIDGET (gtk_builder_get_object (builder, "owner_box")); pw->owner_choice = gnc_owner_select_create (label, box, book, owner); /* Some terminology: * Invoices are paid, credit notes are refunded. * A customer payment is a credit action, paying a vendor is debit * * So depending on the owner the payment amount should be considered * credit (customer) or debit (vendor/employee) and refunds should be * considered debit (customer) or credit (vendor/employee). * For visual consistency, the dialog box will always show a payment and * a refund field. Internally they are treated as credit or debit depending * on the owner type. */ if (gncOwnerGetType (owner) == GNC_OWNER_CUSTOMER) { debit_box = GTK_WIDGET (gtk_builder_get_object (builder, "amount_refund_box")); credit_box = GTK_WIDGET (gtk_builder_get_object (builder, "amount_payment_box")); } else { debit_box = GTK_WIDGET (gtk_builder_get_object (builder, "amount_payment_box")); credit_box = GTK_WIDGET (gtk_builder_get_object (builder, "amount_refund_box")); } pw->amount_debit_edit = gnc_amount_edit_new (); gtk_box_pack_start (GTK_BOX (debit_box), pw->amount_debit_edit, TRUE, TRUE, 0); gnc_amount_edit_set_evaluate_on_enter (GNC_AMOUNT_EDIT (pw->amount_debit_edit), TRUE); gnc_amount_edit_set_amount (GNC_AMOUNT_EDIT (pw->amount_debit_edit), gnc_numeric_zero()); g_signal_connect(G_OBJECT(gnc_amount_edit_gtk_entry(GNC_AMOUNT_EDIT(pw->amount_debit_edit))), "focus-out-event", G_CALLBACK(gnc_payment_leave_amount_cb), pw); pw->amount_credit_edit = gnc_amount_edit_new (); gtk_box_pack_start (GTK_BOX (credit_box), pw->amount_credit_edit, TRUE, TRUE, 0); gnc_amount_edit_set_evaluate_on_enter (GNC_AMOUNT_EDIT (pw->amount_credit_edit), TRUE); gnc_amount_edit_set_amount (GNC_AMOUNT_EDIT (pw->amount_credit_edit), gnc_numeric_zero()); g_signal_connect(G_OBJECT(gnc_amount_edit_gtk_entry(GNC_AMOUNT_EDIT(pw->amount_credit_edit))), "focus-out-event", G_CALLBACK(gnc_payment_leave_amount_cb), pw); box = GTK_WIDGET (gtk_builder_get_object (builder, "date_box")); pw->date_edit = gnc_date_edit_new (time(NULL), FALSE, FALSE); gtk_box_pack_start (GTK_BOX (box), pw->date_edit, TRUE, TRUE, 0); pw->docs_list_tree_view = GTK_WIDGET (gtk_builder_get_object (builder, "docs_list_tree_view")); selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(pw->docs_list_tree_view)); gtk_tree_selection_set_mode (selection, GTK_SELECTION_MULTIPLE); /* Configure date column */ renderer = gtk_cell_renderer_text_new (); column = gtk_tree_view_get_column (GTK_TREE_VIEW (pw->docs_list_tree_view), 0); gtk_tree_view_column_pack_start (column, renderer, TRUE); tree_view_column_set_default_width (GTK_TREE_VIEW (pw->docs_list_tree_view), column, "31-12-2013"); gtk_tree_view_column_set_cell_data_func (column, renderer, (GtkTreeCellDataFunc) print_date, NULL, NULL); /* Configure document number column */ column = gtk_tree_view_get_column (GTK_TREE_VIEW (pw->docs_list_tree_view), 1); tree_view_column_set_default_width (GTK_TREE_VIEW (pw->docs_list_tree_view), column, "INV2013-016"); /* Configure document type column */ column = gtk_tree_view_get_column (GTK_TREE_VIEW (pw->docs_list_tree_view), 2); tree_view_column_set_default_width (GTK_TREE_VIEW (pw->docs_list_tree_view), column, _("Credit Note")); /* Configure debit column */ column = gtk_tree_view_get_column (GTK_TREE_VIEW (pw->docs_list_tree_view), 3); tree_view_column_set_default_width (GTK_TREE_VIEW (pw->docs_list_tree_view), column, "11,999.00"); /* Configure credit column */ column = gtk_tree_view_get_column (GTK_TREE_VIEW (pw->docs_list_tree_view), 4); tree_view_column_set_default_width (GTK_TREE_VIEW (pw->docs_list_tree_view), column, "11,999.00"); gtk_tree_sortable_set_sort_column_id ( GTK_TREE_SORTABLE (gtk_tree_view_get_model (GTK_TREE_VIEW (pw->docs_list_tree_view))), 0, GTK_SORT_ASCENDING); box = GTK_WIDGET (gtk_builder_get_object (builder, "acct_window")); pw->acct_tree = GTK_WIDGET(gnc_tree_view_account_new (FALSE)); gtk_container_add (GTK_CONTAINER (box), pw->acct_tree); gtk_tree_view_set_headers_visible (GTK_TREE_VIEW(pw->acct_tree), FALSE); gnc_payment_set_account_types (GNC_TREE_VIEW_ACCOUNT (pw->acct_tree)); /* Set the dialog for the 'new' owner. * Note that this also sets the post account tree. */ gnc_payment_dialog_owner_changed(pw); /* Set the dialog for the 'new' invoice */ pw->invoice = invoice; if (invoice) { Account *postacct = gncInvoiceGetPostedAcc (invoice); if (postacct) { gchar *acct_string = gnc_account_get_full_name (postacct); gnc_cbwe_set_by_string(GTK_COMBO_BOX(pw->post_combo), acct_string); gnc_payment_dialog_post_to_changed_cb (pw->post_combo, pw); g_free(acct_string); } } /* Setup signals */ gtk_builder_connect_signals_full( builder, gnc_builder_connect_full_func, pw); g_signal_connect (G_OBJECT (pw->owner_choice), "changed", G_CALLBACK (gnc_payment_dialog_owner_changed_cb), pw); g_signal_connect (G_OBJECT (pw->acct_tree), "row-activated", G_CALLBACK (gnc_payment_acct_tree_row_activated_cb), pw); selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(pw->acct_tree)); g_signal_connect (G_OBJECT (selection), "changed", G_CALLBACK (gnc_payment_dialog_xfer_acct_changed_cb), pw); /* Register with the component manager */ pw->component_id = gnc_register_gui_component (cm_class, gnc_payment_window_refresh_handler, gnc_payment_window_close_handler, pw); /* Watch for any new or changed accounts */ gnc_gui_component_watch_entity_type (pw->component_id, GNC_ID_ACCOUNT, QOF_EVENT_CREATE | QOF_EVENT_MODIFY | QOF_EVENT_DESTROY); /* Show it all */ gtk_widget_show_all (pw->dialog); g_object_unref(G_OBJECT(builder)); // The customer choice widget should have keyboard focus if (GNC_IS_GENERAL_SEARCH(pw->owner_choice)) { gnc_general_search_grab_focus(GNC_GENERAL_SEARCH(pw->owner_choice)); } /* Reflect if the payment could complete now */ gnc_payment_window_check_payment (pw); /* Warn the user if they have no valid post-to accounts */ { const gchar *text; const char *acct_type; text = gtk_entry_get_text(GTK_ENTRY (gtk_bin_get_child(GTK_BIN (GTK_COMBO_BOX(pw->post_combo))))); if (!text || g_strcmp0 (text, "") == 0) { /* The code below assumes there will only be one account type. * Let's assert this to protect from potential future changes. */ g_assert (g_list_length (pw->acct_types) == 1); acct_type = xaccAccountGetTypeStr(GPOINTER_TO_INT(pw->acct_types->data)); gnc_warning_dialog(pw->dialog, _("You have no valid \"Post To\" accounts. " "Please create an account of type \"%s\" " "before you continue to process this payment. " "Perhaps you want to create an Invoice or " "Bill first?"), acct_type); } } return pw; }
static void tax_table_window_refresh (TaxTableWindow *ttw) { GList *list, *node; GtkTreeView *view; GtkListStore *store; GtkTreeIter iter; GtkTreePath *path; GtkTreeSelection *selection; GtkTreeRowReference *reference = NULL; g_return_if_fail (ttw); view = GTK_TREE_VIEW (ttw->names_view); store = GTK_LIST_STORE(gtk_tree_view_get_model(view)); /* Clear the list */ gtk_list_store_clear(store); gnc_gui_component_clear_watches (ttw->component_id); /* Add the items to the list */ list = gncTaxTableGetTables (ttw->book); if (list) list = g_list_reverse (g_list_copy (list)); for (node = list; node; node = node->next) { GncTaxTable *table = node->data; gnc_gui_component_watch_entity (ttw->component_id, gncTaxTableGetGUID (table), QOF_EVENT_MODIFY); gtk_list_store_prepend(store, &iter); gtk_list_store_set(store, &iter, TAX_TABLE_COL_NAME, gncTaxTableGetName (table), TAX_TABLE_COL_POINTER, table, -1); if (table == ttw->current_table) { path = gtk_tree_model_get_path(GTK_TREE_MODEL(store), &iter); reference = gtk_tree_row_reference_new(GTK_TREE_MODEL(store), path); gtk_tree_path_free(path); } } if (list) g_list_free (list); gnc_gui_component_watch_entity_type (ttw->component_id, GNC_TAXTABLE_MODULE_NAME, QOF_EVENT_CREATE | QOF_EVENT_DESTROY); if (reference) { path = gtk_tree_row_reference_get_path(reference); gtk_tree_row_reference_free(reference); if (path) { selection = gtk_tree_view_get_selection(view); gtk_tree_selection_select_path(selection, path); gtk_tree_view_scroll_to_cell(view, path, NULL, TRUE, 0.5, 0.0); gtk_tree_path_free(path); } } ;; tax_table_entries_refresh (ttw); /* select_row() above will refresh the entries window */ }
static JobWindow * gnc_job_new_window (QofBook *bookp, GncOwner *owner, GncJob *job) { JobWindow *jw; GtkBuilder *builder; GtkWidget *owner_box, *owner_label; /* * Find an existing window for this job. If found, bring it to * the front. */ if (job) { GncGUID job_guid; job_guid = *gncJobGetGUID (job); jw = gnc_find_first_gui_component (DIALOG_EDIT_JOB_CM_CLASS, find_handler, &job_guid); if (jw) { gtk_window_present (GTK_WINDOW(jw->dialog)); return(jw); } } /* * No existing job window found. Build a new one. */ jw = g_new0 (JobWindow, 1); jw->book = bookp; gncOwnerCopy (owner, &(jw->owner)); /* save it off now, we know it's valid */ /* Load the Glade File */ builder = gtk_builder_new(); gnc_builder_add_from_file (builder, "dialog-job.glade", "Job Dialog"); /* Find the dialog */ jw->dialog = GTK_WIDGET(gtk_builder_get_object (builder, "Job Dialog")); /* Get entry points */ jw->id_entry = GTK_WIDGET(gtk_builder_get_object (builder, "id_entry")); jw->name_entry = GTK_WIDGET(gtk_builder_get_object (builder, "name_entry")); jw->desc_entry = GTK_WIDGET(gtk_builder_get_object (builder, "desc_entry")); jw->active_check = GTK_WIDGET(gtk_builder_get_object (builder, "active_check")); owner_box = GTK_WIDGET(gtk_builder_get_object (builder, "customer_hbox")); owner_label = GTK_WIDGET(gtk_builder_get_object (builder, "owner_label")); /* Setup signals */ gtk_builder_connect_signals_full (builder, gnc_builder_connect_full_func, jw); /* Set initial entries */ if (job != NULL) { jw->job_guid = *gncJobGetGUID (job); jw->dialog_type = EDIT_JOB; jw->cust_edit = gnc_owner_edit_create (owner_label, owner_box, bookp, owner); gtk_entry_set_text (GTK_ENTRY (jw->id_entry), gncJobGetID (job)); gtk_entry_set_text (GTK_ENTRY (jw->name_entry), gncJobGetName (job)); gtk_entry_set_text (GTK_ENTRY (jw->desc_entry), gncJobGetReference (job)); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (jw->active_check), gncJobGetActive (job)); jw->component_id = gnc_register_gui_component (DIALOG_EDIT_JOB_CM_CLASS, gnc_job_window_refresh_handler, gnc_job_window_close_handler, jw); } else { job = gncJobCreate (bookp); gncJobSetOwner (job, owner); jw->job_guid = *gncJobGetGUID (job); jw->dialog_type = NEW_JOB; /* If we are passed a real owner, don't allow the user to change it */ if (owner->owner.undefined) { jw->cust_edit = gnc_owner_edit_create (owner_label, owner_box, bookp, owner); } else { jw->cust_edit = gnc_owner_select_create (owner_label, owner_box, bookp, owner); } jw->component_id = gnc_register_gui_component (DIALOG_NEW_JOB_CM_CLASS, gnc_job_window_refresh_handler, gnc_job_window_close_handler, jw); } gnc_job_name_changed_cb (NULL, jw); gnc_gui_component_watch_entity_type (jw->component_id, GNC_JOB_MODULE_NAME, QOF_EVENT_MODIFY | QOF_EVENT_DESTROY); gtk_widget_show_all (jw->dialog); // The job name should have keyboard focus gtk_widget_grab_focus(jw->name_entry); // Or should the owner field have focus? // if (GNC_IS_GENERAL_SEARCH(jw->cust_edit)) // { // gnc_general_search_grab_focus(GNC_GENERAL_SEARCH(jw->cust_edit)); // } g_object_unref(G_OBJECT(builder)); return jw; }
static void gnc_entry_ledger_set_watches (GncEntryLedger *ledger, GList *entries) { GList *node; QofIdType type = NULL; gnc_gui_component_clear_watches (ledger->component_id); switch (ledger->type) { case GNCENTRY_ORDER_ENTRY: case GNCENTRY_ORDER_VIEWER: type = GNC_ORDER_MODULE_NAME; break; case GNCENTRY_INVOICE_ENTRY: case GNCENTRY_CUST_CREDIT_NOTE_ENTRY: /* Watch the invoice owner to see when items get added via orders */ gnc_gui_component_watch_entity (ledger->component_id, gncOwnerGetGUID (gncInvoiceGetOwner (ledger->invoice)), QOF_EVENT_MODIFY); case GNCENTRY_INVOICE_VIEWER: case GNCENTRY_CUST_CREDIT_NOTE_VIEWER: case GNCENTRY_BILL_ENTRY: case GNCENTRY_BILL_VIEWER: case GNCENTRY_EXPVOUCHER_ENTRY: case GNCENTRY_EXPVOUCHER_VIEWER: case GNCENTRY_VEND_CREDIT_NOTE_ENTRY: case GNCENTRY_VEND_CREDIT_NOTE_VIEWER: case GNCENTRY_EMPL_CREDIT_NOTE_ENTRY: case GNCENTRY_EMPL_CREDIT_NOTE_VIEWER: type = GNC_INVOICE_MODULE_NAME; break; default: g_warning ("Invalid ledger type"); break; } gnc_gui_component_watch_entity_type (ledger->component_id, type, QOF_EVENT_MODIFY | QOF_EVENT_DESTROY); /* To make sure the xfer cell is up to date */ gnc_gui_component_watch_entity_type (ledger->component_id, GNC_ID_ACCOUNT, QOF_EVENT_MODIFY | QOF_EVENT_DESTROY | GNC_EVENT_ITEM_CHANGED); /* To make sure the taxtable cell is up to date */ gnc_gui_component_watch_entity_type (ledger->component_id, GNC_TAXTABLE_MODULE_NAME, QOF_EVENT_MODIFY | QOF_EVENT_DESTROY); /* For expense vouchers, watch the employee and refresh if it's changed */ if (ledger->type == GNCENTRY_EXPVOUCHER_ENTRY) { const GncOwner *owner = gncOwnerGetEndOwner (gncInvoiceGetOwner (ledger->invoice)); GncEmployee *employee = gncOwnerGetEmployee (owner); if (employee) gnc_gui_component_watch_entity (ledger->component_id, gncEmployeeGetGUID (employee), QOF_EVENT_MODIFY); } for (node = entries; node; node = node->next) { GncEntry *entry = node->data; gnc_gui_component_watch_entity (ledger->component_id, gncEntryGetGUID (entry), QOF_EVENT_MODIFY); } }
static EmployeeWindow * gnc_employee_new_window (QofBook *bookp, GncEmployee *employee) { EmployeeWindow *ew; GtkBuilder *builder; GtkWidget *hbox, *edit; gnc_commodity *currency; GNCPrintAmountInfo print_info; GList *acct_types; Account *ccard_acct; /* * Find an existing window for this employee. If found, bring it to * the front. */ if (employee) { GncGUID employee_guid; employee_guid = *gncEmployeeGetGUID (employee); ew = gnc_find_first_gui_component (DIALOG_EDIT_EMPLOYEE_CM_CLASS, find_handler, &employee_guid); if (ew) { gtk_window_present (GTK_WINDOW(ew->dialog)); return(ew); } } /* Find the default currency */ if (employee) currency = gncEmployeeGetCurrency (employee); else currency = gnc_default_currency (); /* * No existing employee window found. Build a new one. */ ew = g_new0 (EmployeeWindow, 1); ew->book = bookp; /* Find the dialog */ builder = gtk_builder_new(); gnc_builder_add_from_file (builder, "dialog-employee.glade", "Employee Dialog"); ew->dialog = GTK_WIDGET(gtk_builder_get_object (builder, "Employee Dialog")); g_object_set_data (G_OBJECT (ew->dialog), "dialog_info", ew); /* Get entry points */ ew->id_entry = GTK_WIDGET(gtk_builder_get_object (builder, "id_entry")); ew->username_entry = GTK_WIDGET(gtk_builder_get_object (builder, "username_entry")); ew->name_entry = GTK_WIDGET(gtk_builder_get_object (builder, "name_entry")); ew->addr1_entry = GTK_WIDGET(gtk_builder_get_object (builder, "addr1_entry")); ew->addr2_entry = GTK_WIDGET(gtk_builder_get_object (builder, "addr2_entry")); ew->addr3_entry = GTK_WIDGET(gtk_builder_get_object (builder, "addr3_entry")); ew->addr4_entry = GTK_WIDGET(gtk_builder_get_object (builder, "addr4_entry")); ew->phone_entry = GTK_WIDGET(gtk_builder_get_object (builder, "phone_entry")); ew->fax_entry = GTK_WIDGET(gtk_builder_get_object (builder, "fax_entry")); ew->email_entry = GTK_WIDGET(gtk_builder_get_object (builder, "email_entry")); ew->language_entry = GTK_WIDGET(gtk_builder_get_object (builder, "language_entry")); ew->active_check = GTK_WIDGET(gtk_builder_get_object (builder, "active_check")); /* Currency */ edit = gnc_currency_edit_new(); gnc_currency_edit_set_currency (GNC_CURRENCY_EDIT(edit), currency); ew->currency_edit = edit; hbox = GTK_WIDGET(gtk_builder_get_object (builder, "currency_box")); gtk_box_pack_start (GTK_BOX (hbox), edit, TRUE, TRUE, 0); /* WORKDAY: Value */ edit = gnc_amount_edit_new(); gnc_amount_edit_set_evaluate_on_enter (GNC_AMOUNT_EDIT (edit), TRUE); print_info = gnc_integral_print_info (); print_info.max_decimal_places = 5; gnc_amount_edit_set_print_info (GNC_AMOUNT_EDIT (edit), print_info); gnc_amount_edit_set_fraction (GNC_AMOUNT_EDIT (edit), 100000); ew->workday_amount = edit; gtk_widget_show (edit); hbox = GTK_WIDGET(gtk_builder_get_object (builder, "hours_hbox")); gtk_box_pack_start (GTK_BOX (hbox), edit, TRUE, TRUE, 0); /* RATE: Monetary Value */ edit = gnc_amount_edit_new(); print_info = gnc_commodity_print_info (currency, FALSE); gnc_amount_edit_set_evaluate_on_enter (GNC_AMOUNT_EDIT (edit), TRUE); gnc_amount_edit_set_print_info (GNC_AMOUNT_EDIT (edit), print_info); gnc_amount_edit_set_fraction (GNC_AMOUNT_EDIT (edit), gnc_commodity_get_fraction (currency)); ew->rate_amount = edit; gtk_widget_show (edit); hbox = GTK_WIDGET(gtk_builder_get_object (builder, "rate_hbox")); gtk_box_pack_start (GTK_BOX (hbox), edit, TRUE, TRUE, 0); /* CCard Account Selection */ ew->ccard_acct_check = GTK_WIDGET(gtk_builder_get_object (builder, "ccard_check")); edit = gnc_account_sel_new(); acct_types = g_list_prepend(NULL, (gpointer)ACCT_TYPE_CREDIT); gnc_account_sel_set_acct_filters (GNC_ACCOUNT_SEL(edit), acct_types, NULL); g_list_free (acct_types); ew->ccard_acct_sel = edit; gtk_widget_show (edit); hbox = GTK_WIDGET(gtk_builder_get_object (builder, "ccard_acct_hbox")); gtk_box_pack_start (GTK_BOX (hbox), edit, TRUE, TRUE, 0); /* Setup signals */ gtk_builder_connect_signals_full (builder, gnc_builder_connect_full_func, ew); /* Setup initial values */ if (employee != NULL) { GncAddress *addr; ew->dialog_type = EDIT_EMPLOYEE; ew->employee_guid = *gncEmployeeGetGUID (employee); addr = gncEmployeeGetAddr (employee); gtk_entry_set_text (GTK_ENTRY (ew->id_entry), gncEmployeeGetID (employee)); gtk_entry_set_text (GTK_ENTRY (ew->username_entry), gncEmployeeGetUsername (employee)); /* Setup Address */ gtk_entry_set_text (GTK_ENTRY (ew->name_entry), gncAddressGetName (addr)); gtk_entry_set_text (GTK_ENTRY (ew->addr1_entry), gncAddressGetAddr1 (addr)); gtk_entry_set_text (GTK_ENTRY (ew->addr2_entry), gncAddressGetAddr2 (addr)); gtk_entry_set_text (GTK_ENTRY (ew->addr3_entry), gncAddressGetAddr3 (addr)); gtk_entry_set_text (GTK_ENTRY (ew->addr4_entry), gncAddressGetAddr4 (addr)); gtk_entry_set_text (GTK_ENTRY (ew->phone_entry), gncAddressGetPhone (addr)); gtk_entry_set_text (GTK_ENTRY (ew->fax_entry), gncAddressGetFax (addr)); gtk_entry_set_text (GTK_ENTRY (ew->email_entry), gncAddressGetEmail (addr)); gtk_entry_set_text (GTK_ENTRY (ew->language_entry), gncEmployeeGetLanguage (employee)); /* Set toggle buttons */ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ew->active_check), gncEmployeeGetActive (employee)); ew->component_id = gnc_register_gui_component (DIALOG_EDIT_EMPLOYEE_CM_CLASS, gnc_employee_window_refresh_handler, gnc_employee_window_close_handler, ew); } else { employee = gncEmployeeCreate (bookp); ew->employee_guid = *gncEmployeeGetGUID (employee); ew->dialog_type = NEW_EMPLOYEE; ew->component_id = gnc_register_gui_component (DIALOG_NEW_EMPLOYEE_CM_CLASS, gnc_employee_window_refresh_handler, gnc_employee_window_close_handler, ew); } /* I know that employee exists here -- either passed in or just created */ /* Set the workday and rate values */ gnc_amount_edit_set_amount (GNC_AMOUNT_EDIT (ew->workday_amount), gncEmployeeGetWorkday (employee)); gnc_amount_edit_set_amount (GNC_AMOUNT_EDIT (ew->rate_amount), gncEmployeeGetRate (employee)); ccard_acct = gncEmployeeGetCCard (employee); if (ccard_acct == NULL) { gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ew->ccard_acct_check), FALSE); gtk_widget_set_sensitive (ew->ccard_acct_sel, FALSE); } else { gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ew->ccard_acct_check), TRUE); gnc_account_sel_set_account (GNC_ACCOUNT_SEL (ew->ccard_acct_sel), ccard_acct, FALSE); } /* XXX: Set the ACL */ gnc_gui_component_watch_entity_type (ew->component_id, GNC_EMPLOYEE_MODULE_NAME, QOF_EVENT_MODIFY | QOF_EVENT_DESTROY); gtk_widget_show_all (ew->dialog); if (ccard_acct == NULL) gtk_widget_hide (ew->ccard_acct_sel); g_object_unref(G_OBJECT(builder)); return ew; }