gnc-plugin-page-invoice.c

00001 /* 
00002  * gnc-plugin-page-invoice.c -- 
00003  *
00004  * Copyright (C) 2005,2006 David Hampton <hampton@employees.org>
00005  *
00006  * This program is free software; you can redistribute it and/or
00007  * modify it under the terms of the GNU General Public License as
00008  * published by the Free Software Foundation; either version 2 of
00009  * the License, or (at your option) any later version.
00010  *
00011  * This program is distributed in the hope that it will be useful,
00012  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00013  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014  * GNU General Public License for more details.
00015  *
00016  * You should have received a copy of the GNU General Public License
00017  * along with this program; if not, contact:
00018  *
00019  * Free Software Foundation           Voice:  +1-617-542-5942
00020  * 51 Franklin Street, Fifth Floor    Fax:    +1-617-542-2652
00021  * Boston, MA  02110-1301,  USA       gnu@gnu.org
00022  */
00023 
00024 #include "config.h"
00025 
00026 #include <gtk/gtk.h>
00027 #include <glib/gi18n.h>
00028 
00029 #include "gnc-plugin.h"
00030 #include "dialog-invoice.h"
00031 #include "gnc-plugin-page-invoice.h"
00032 
00033 #include "dialog-account.h"
00034 #include "gnc-component-manager.h"
00035 #include "gnc-gconf-utils.h"
00036 #include "gnc-gobject-utils.h"
00037 #include "gnc-gnome-utils.h"
00038 #include "gnc-icons.h"
00039 #include "gnucash-sheet.h"
00040 #include "gnc-ui-util.h"
00041 #include "gnc-window.h"
00042 
00043 /* This static indicates the debugging module that this .o belongs to.  */
00044 static QofLogModule log_module = GNC_MOD_GUI;
00045 
00046 static void gnc_plugin_page_invoice_class_init (GncPluginPageInvoiceClass *klass);
00047 static void gnc_plugin_page_invoice_init (GncPluginPageInvoice *plugin_page);
00048 static void gnc_plugin_page_invoice_finalize (GObject *object);
00049 
00050 static GtkWidget *gnc_plugin_page_invoice_create_widget (GncPluginPage *plugin_page);
00051 static void gnc_plugin_page_invoice_destroy_widget (GncPluginPage *plugin_page);
00052 static void gnc_plugin_page_invoice_save_page (GncPluginPage *plugin_page, GKeyFile *file, const gchar *group);
00053 static GncPluginPage *gnc_plugin_page_invoice_recreate_page (GtkWidget *window, GKeyFile *file, const gchar *group);
00054 static void gnc_plugin_page_invoice_window_changed (GncPluginPage *plugin_page, GtkWidget *window);
00055 
00056 static void gnc_plugin_page_invoice_summarybar_position_changed(GConfEntry *entry, gpointer user_data);
00057 
00058 void gnc_plugin_page_invoice_start_toggle_cb(GtkToggleButton *toggle, gpointer data);
00059 void gnc_plugin_page_invoice_end_toggle_cb(GtkToggleButton *toggle, gpointer data);
00060 void gnc_plugin_page_invoice_today_cb(GtkButton *buttontoggle, gpointer data);
00061 
00062 /* Command callbacks */
00063 static void gnc_plugin_page_invoice_cmd_new_invoice (GtkAction *action, GncPluginPageInvoice *plugin_page);
00064 static void gnc_plugin_page_invoice_cmd_new_account (GtkAction *action, GncPluginPageInvoice *plugin_page);
00065 static void gnc_plugin_page_invoice_cmd_print (GtkAction *action, GncPluginPageInvoice *plugin_page);
00066 static void gnc_plugin_page_invoice_cmd_cut (GtkAction *action, GncPluginPageInvoice *plugin_page);
00067 static void gnc_plugin_page_invoice_cmd_copy (GtkAction *action, GncPluginPageInvoice *plugin_page);
00068 static void gnc_plugin_page_invoice_cmd_paste (GtkAction *action, GncPluginPageInvoice *plugin_page);
00069 static void gnc_plugin_page_invoice_cmd_edit (GtkAction *action, GncPluginPageInvoice *plugin_page);
00070 static void gnc_plugin_page_invoice_cmd_post (GtkAction *action, GncPluginPageInvoice *plugin_page);
00071 static void gnc_plugin_page_invoice_cmd_unpost (GtkAction *action, GncPluginPageInvoice *plugin_page);
00072 
00073 static void gnc_plugin_page_invoice_cmd_sort_changed (GtkAction *action,
00074                                                       GtkRadioAction *current,
00075                                                       GncPluginPageInvoice *plugin_page);
00076 
00077 static void gnc_plugin_page_invoice_cmd_enter (GtkAction *action, GncPluginPageInvoice *plugin_page);
00078 static void gnc_plugin_page_invoice_cmd_cancel (GtkAction *action, GncPluginPageInvoice *plugin_page);
00079 static void gnc_plugin_page_invoice_cmd_delete (GtkAction *action, GncPluginPageInvoice *plugin_page);
00080 static void gnc_plugin_page_invoice_cmd_blank (GtkAction *action, GncPluginPageInvoice *plugin_page);
00081 static void gnc_plugin_page_invoice_cmd_duplicate (GtkAction *action, GncPluginPageInvoice *plugin_page);
00082 static void gnc_plugin_page_invoice_cmd_pay_invoice (GtkAction *action, GncPluginPageInvoice *plugin_page);
00083 static void gnc_plugin_page_invoice_cmd_company_report (GtkAction *action, GncPluginPageInvoice *plugin_page);
00084 
00085 static void gnc_plugin_page_redraw_help_cb( GnucashRegister *gsr, GncPluginPageInvoice *invoice_page );
00086 static void gnc_plugin_page_invoice_refresh_cb (GHashTable *changes, gpointer user_data);
00087 
00088 /************************************************************
00089  *                          Actions                         *
00090  ************************************************************/
00091 
00092 static GtkActionEntry gnc_plugin_page_invoice_actions [] =
00093 {
00094         /* Toplevel */
00095         { "FakeToplevel", NULL, "", NULL, NULL, NULL },
00096         { "SortOrderAction", NULL, N_("Sort _Order"), NULL, NULL, NULL },
00097 
00098         /* File menu */
00099         { "FileNewInvoiceAction", GTK_STOCK_NEW, N_("New _Invoice"), "",
00100           N_("Create a new invoice"),
00101           G_CALLBACK (gnc_plugin_page_invoice_cmd_new_invoice) },
00102         { "FileNewAccountAction", GNC_STOCK_NEW_ACCOUNT, N_("New _Account..."), NULL,
00103           N_("Create a new account"),
00104           G_CALLBACK (gnc_plugin_page_invoice_cmd_new_account) },
00105         { "FilePrintAction", GTK_STOCK_PRINT, N_("Print Invoice"), "<control>p",
00106           N_("Make a printable invoice"),
00107           G_CALLBACK (gnc_plugin_page_invoice_cmd_print) },
00108 
00109         /* Edit menu */
00110         { "EditCutAction", GTK_STOCK_CUT, N_("_Cut"), NULL,
00111           NULL,
00112           G_CALLBACK (gnc_plugin_page_invoice_cmd_cut) },
00113         { "EditCopyAction", GTK_STOCK_COPY, N_("Copy"), NULL,
00114           NULL,
00115           G_CALLBACK (gnc_plugin_page_invoice_cmd_copy) },
00116         { "EditPasteAction", GTK_STOCK_PASTE, N_("_Paste"), NULL,
00117           NULL,
00118           G_CALLBACK (gnc_plugin_page_invoice_cmd_paste) },
00119         { "EditEditInvoiceAction", GNC_STOCK_INVOICE_EDIT, N_("_Edit Invoice"), NULL,
00120           N_("Edit this invoice"),
00121           G_CALLBACK (gnc_plugin_page_invoice_cmd_edit) },
00122         { "EditPostInvoiceAction", GNC_STOCK_INVOICE_POST, N_("_Post Invoice"), NULL,
00123           N_("Post this Invoice to your Chart of Accounts"),
00124           G_CALLBACK (gnc_plugin_page_invoice_cmd_post) },
00125         { "EditUnpostInvoiceAction", GNC_STOCK_INVOICE_UNPOST, N_("_Unpost Invoice"), NULL,
00126           N_("Unpost this Invoice and make it editable"),
00127           G_CALLBACK (gnc_plugin_page_invoice_cmd_unpost) },
00128 
00129         /* Actions menu */
00130         { "RecordEntryAction", GTK_STOCK_ADD, N_("_Enter"), NULL,
00131           N_("Record the current entry"),
00132           G_CALLBACK (gnc_plugin_page_invoice_cmd_enter) },
00133         { "CancelEntryAction", GTK_STOCK_CANCEL, N_("_Cancel"), NULL,
00134           N_("Cancel the current entry"),
00135           G_CALLBACK (gnc_plugin_page_invoice_cmd_cancel) },
00136         { "DeleteEntryAction", GTK_STOCK_DELETE, N_("_Delete"), NULL,
00137           N_("Delete the current entry"),
00138           G_CALLBACK (gnc_plugin_page_invoice_cmd_delete) },
00139         { "BlankEntryAction", GTK_STOCK_GOTO_BOTTOM, N_("_Blank"), NULL,
00140           N_("Move to the blank entry at the bottom of the Invoice"),
00141           G_CALLBACK (gnc_plugin_page_invoice_cmd_blank) },
00142         { "DuplicateEntryAction", GTK_STOCK_COPY, N_("Dup_licate Entry"), NULL,
00143           N_("Make a copy of the current entry"),
00144           G_CALLBACK (gnc_plugin_page_invoice_cmd_duplicate) },
00145 
00146         /* Business menu */
00147         { "ToolsProcessPaymentAction", NULL, N_("_Pay Invoice"), NULL,
00148           N_("Enter a payment for the owner of this Invoice"),
00149           G_CALLBACK (gnc_plugin_page_invoice_cmd_pay_invoice) },
00150 
00151         /* Reports menu */
00152         { "ReportsCompanyReportAction", NULL, N_("_Company Report"), NULL,
00153           N_("Open a company report window for the owner of this Invoice"),
00154           G_CALLBACK (gnc_plugin_page_invoice_cmd_company_report) },
00155 };
00156 static guint gnc_plugin_page_invoice_n_actions = G_N_ELEMENTS (gnc_plugin_page_invoice_actions);
00157 
00158 static GtkRadioActionEntry radio_entries [] =
00159 {
00160         { "SortStandardAction", NULL, N_("_Standard"), NULL, "Keep normal invoice order", BY_STANDARD },
00161         { "SortDateAction", NULL, N_("_Date"), NULL, "Sort by date", BY_DATE },
00162         { "SortDateEntryAction", NULL, N_("Date of _Entry"), NULL, "Sort by the date of entry", BY_DATE_ENTERED },
00163         { "SortQuantityAction", NULL, N_("_Quantity"), NULL, "Sort by quantity", BY_QTY },
00164         { "SortPriceAction", NULL, N_("_Price"), NULL, "Sort by price", BY_PRICE },
00165         { "SortDescriptionAction", NULL, N_("Descri_ption"), NULL, "Sort by description", BY_DESC },
00166 };
00167 static guint n_radio_entries = G_N_ELEMENTS (radio_entries);
00168 
00169 static const gchar *posted_actions[] = {
00170         "FilePrintAction",
00171         NULL
00172 };
00173 
00174 static const gchar *unposted_actions[] = {
00175         "EditCutAction",
00176         "EditPasteAction",
00177         "EditEditInvoiceAction",
00178         "EditPostInvoiceAction",
00179         "RecordEntryAction",
00180         "CancelEntryAction",
00181         "DeleteEntryAction",
00182         "DuplicateEntryAction",
00183         "BlankEntryAction",
00184         NULL
00185 };
00186 
00187 static const gchar *can_unpost_actions[] = {
00188         "EditUnpostInvoiceAction",
00189         NULL
00190 };
00191 
00193 static action_toolbar_labels toolbar_labels[] = {
00194   { "RecordEntryAction",          N_("Enter") },
00195   { "CancelEntryAction",          N_("Cancel") },
00196   { "DeleteEntryAction",          N_("Delete") },
00197   { "DuplicateEntryAction",       N_("Duplicate") },
00198   { "BlankEntryAction",           N_("Blank") },
00199   { "EditPostInvoiceAction",      N_("Post") },
00200   { "EditUnpostInvoiceAction",    N_("Unpost") },
00201   { NULL, NULL },
00202 };
00203 
00204 
00205 /************************************************************/
00206 /*                      Data Structures                     */
00207 /************************************************************/
00208 
00209 typedef struct GncPluginPageInvoicePrivate
00210 {
00211         InvoiceWindow *iw;
00212 
00213         GtkWidget *widget;
00214 
00215         gint component_manager_id;
00216 } GncPluginPageInvoicePrivate;
00217 
00218 #define GNC_PLUGIN_PAGE_INVOICE_GET_PRIVATE(o)  \
00219    (G_TYPE_INSTANCE_GET_PRIVATE ((o), GNC_TYPE_PLUGIN_PAGE_INVOICE, GncPluginPageInvoicePrivate))
00220 
00221 static GObjectClass *parent_class = NULL;
00222 
00223 /************************************************************/
00224 /*                      Implementation                      */
00225 /************************************************************/
00226 
00227 GType
00228 gnc_plugin_page_invoice_get_type (void)
00229 {
00230         static GType gnc_plugin_page_invoice_type = 0;
00231 
00232         if (gnc_plugin_page_invoice_type == 0) {
00233                 static const GTypeInfo our_info = {
00234                         sizeof (GncPluginPageInvoiceClass),
00235                         NULL,
00236                         NULL,
00237                         (GClassInitFunc) gnc_plugin_page_invoice_class_init,
00238                         NULL,
00239                         NULL,
00240                         sizeof (GncPluginPageInvoice),
00241                         0,
00242                         (GInstanceInitFunc) gnc_plugin_page_invoice_init
00243                 };
00244                 
00245                 gnc_plugin_page_invoice_type = g_type_register_static (GNC_TYPE_PLUGIN_PAGE,
00246                                                                         "GncPluginPageInvoice",
00247                                                                         &our_info, 0);
00248         }
00249 
00250         return gnc_plugin_page_invoice_type;
00251 }
00252 
00253 GncPluginPage *
00254 gnc_plugin_page_invoice_new (InvoiceWindow *iw)
00255 {
00256         GncPluginPageInvoicePrivate *priv;
00257         GncPluginPageInvoice *invoice_page;
00258         GncPluginPage *plugin_page;
00259         const GList *item;
00260 
00261         /* Is there an existing page? */
00262         item = gnc_gobject_tracking_get_list(GNC_PLUGIN_PAGE_INVOICE_NAME);
00263         for ( ; item; item = g_list_next(item)) {
00264           invoice_page = (GncPluginPageInvoice *)item->data;
00265           priv = GNC_PLUGIN_PAGE_INVOICE_GET_PRIVATE(invoice_page);
00266           if (priv->iw == iw)
00267             return GNC_PLUGIN_PAGE(invoice_page);
00268         }
00269 
00270         invoice_page = g_object_new (GNC_TYPE_PLUGIN_PAGE_INVOICE, (char *)NULL);
00271         priv = GNC_PLUGIN_PAGE_INVOICE_GET_PRIVATE(invoice_page);
00272         priv->iw = iw;
00273 
00274         plugin_page = GNC_PLUGIN_PAGE(invoice_page);
00275         gnc_plugin_page_invoice_update_title(plugin_page);
00276         gnc_plugin_page_set_uri(plugin_page, "default:");
00277 
00278         priv->component_manager_id = 0;
00279         return plugin_page;
00280 }
00281 
00282 static void
00283 gnc_plugin_page_invoice_class_init (GncPluginPageInvoiceClass *klass)
00284 {
00285         GObjectClass *object_class = G_OBJECT_CLASS (klass);
00286         GncPluginPageClass *gnc_plugin_class = GNC_PLUGIN_PAGE_CLASS(klass);
00287 
00288         parent_class = g_type_class_peek_parent (klass);
00289 
00290         object_class->finalize = gnc_plugin_page_invoice_finalize;
00291 
00292         gnc_plugin_class->tab_icon        = NULL;
00293         gnc_plugin_class->plugin_name     = GNC_PLUGIN_PAGE_INVOICE_NAME;
00294         gnc_plugin_class->create_widget   = gnc_plugin_page_invoice_create_widget;
00295         gnc_plugin_class->destroy_widget  = gnc_plugin_page_invoice_destroy_widget;
00296         gnc_plugin_class->save_page       = gnc_plugin_page_invoice_save_page;
00297         gnc_plugin_class->recreate_page   = gnc_plugin_page_invoice_recreate_page;
00298         gnc_plugin_class->window_changed  = gnc_plugin_page_invoice_window_changed;
00299 
00300         g_type_class_add_private(klass, sizeof(GncPluginPageInvoicePrivate));
00301 }
00302 
00303 static void
00304 gnc_plugin_page_invoice_init (GncPluginPageInvoice *plugin_page)
00305 {
00306         GncPluginPageInvoicePrivate *priv;
00307         GncPluginPage *parent;
00308         GtkActionGroup *action_group;
00309         gboolean use_new;
00310 
00311         priv = GNC_PLUGIN_PAGE_INVOICE_GET_PRIVATE(plugin_page);
00312 
00313         /* Init parent declared variables */
00314         parent = GNC_PLUGIN_PAGE(plugin_page);
00315         use_new = gnc_gconf_get_bool(GCONF_SECTION_INVOICE, KEY_USE_NEW, NULL);
00316         g_object_set(G_OBJECT(plugin_page),
00317                      "page-name",      _("Invoice"),
00318                      "page-uri",       "default:",
00319                      "ui-description", "gnc-plugin-page-invoice-ui.xml",
00320                      "use-new-window", use_new,
00321                      (char *)NULL);
00322 
00323         /* change me when the system supports multiple books */
00324         gnc_plugin_page_add_book(parent, gnc_get_current_book());
00325 
00326         /* Create menu and toolbar information */
00327         action_group =
00328           gnc_plugin_page_create_action_group(parent,
00329                                               "GncPluginPageInvoiceActions");
00330         gtk_action_group_add_actions (action_group, gnc_plugin_page_invoice_actions,
00331                                       gnc_plugin_page_invoice_n_actions, plugin_page);
00332         gtk_action_group_add_radio_actions (action_group,
00333                                             radio_entries, n_radio_entries,
00334                                             REG_STYLE_LEDGER,
00335                                             G_CALLBACK(gnc_plugin_page_invoice_cmd_sort_changed),
00336                                             plugin_page);
00337 
00338         gnc_plugin_init_short_names (action_group, toolbar_labels);
00339 }
00340 
00341 static void
00342 gnc_plugin_page_invoice_finalize (GObject *object)
00343 {
00344         GncPluginPageInvoice *page;
00345         GncPluginPageInvoicePrivate *priv;
00346 
00347         g_return_if_fail (GNC_IS_PLUGIN_PAGE_INVOICE (object));
00348 
00349         ENTER("object %p", object);
00350         page = GNC_PLUGIN_PAGE_INVOICE (object);
00351         priv = GNC_PLUGIN_PAGE_INVOICE_GET_PRIVATE(page);
00352 
00353         G_OBJECT_CLASS (parent_class)->finalize (object);
00354         LEAVE(" ");
00355 }
00356 
00357 
00358 void
00359 gnc_plugin_page_invoice_update_menus (GncPluginPage *page, gboolean is_posted, gboolean can_unpost)
00360 { 
00361   GtkActionGroup *action_group;
00362 
00363   g_return_if_fail(GNC_IS_PLUGIN_PAGE_INVOICE(page));
00364 
00365   action_group = gnc_plugin_page_get_action_group(page);
00366   gnc_plugin_update_actions (action_group, posted_actions,
00367                              "sensitive", is_posted);
00368   gnc_plugin_update_actions (action_group, unposted_actions,
00369                              "sensitive", !is_posted);
00370   gnc_plugin_update_actions (action_group, can_unpost_actions,
00371                              "sensitive", can_unpost);
00372 }
00373 
00374 
00375 /* Virtual Functions */
00376 
00377 static GtkWidget *
00378 gnc_plugin_page_invoice_create_widget (GncPluginPage *plugin_page)
00379 {
00380         GncPluginPageInvoice *page;
00381         GncPluginPageInvoicePrivate *priv;
00382         GtkWidget *regWidget, *widget;
00383 
00384         ENTER("page %p", plugin_page);
00385         page = GNC_PLUGIN_PAGE_INVOICE (plugin_page);
00386         priv = GNC_PLUGIN_PAGE_INVOICE_GET_PRIVATE(page);
00387         if (priv->widget != NULL)
00388     {
00389         LEAVE("");
00390                 return priv->widget;
00391     }
00392 
00393         priv->widget = gtk_vbox_new (FALSE, 0);
00394         gtk_widget_show (priv->widget);
00395         
00396         widget = gnc_invoice_create_page(priv->iw, page);
00397         gtk_widget_show (widget);
00398         gtk_box_pack_start(GTK_BOX (priv->widget), widget, TRUE, TRUE, 0);
00399 
00400         plugin_page->summarybar = gnc_invoice_window_create_summary_bar(priv->iw);
00401         gtk_box_pack_start(GTK_BOX (priv->widget), plugin_page->summarybar, FALSE, FALSE, 0);
00402         gnc_plugin_page_invoice_summarybar_position_changed(NULL, page);
00403         gnc_gconf_general_register_cb(KEY_SUMMARYBAR_POSITION,
00404                 gnc_plugin_page_invoice_summarybar_position_changed, page);
00405 
00406         regWidget = gnc_invoice_get_register(priv->iw);
00407         if (regWidget) {
00408           g_signal_connect (G_OBJECT (regWidget), "redraw-help",
00409                             G_CALLBACK (gnc_plugin_page_redraw_help_cb), page);
00410         }
00411 
00412         priv->component_manager_id =
00413           gnc_register_gui_component(GNC_PLUGIN_PAGE_INVOICE_NAME,
00414                                      gnc_plugin_page_invoice_refresh_cb,
00415                                      NULL, page);
00416 
00417     LEAVE("");
00418         return priv->widget;
00419 }
00420 
00421 static void
00422 gnc_plugin_page_invoice_destroy_widget (GncPluginPage *plugin_page)
00423 {
00424         GncPluginPageInvoice *page;
00425         GncPluginPageInvoicePrivate *priv;
00426 
00427         ENTER("page %p", plugin_page);
00428         page = GNC_PLUGIN_PAGE_INVOICE (plugin_page);
00429         priv = GNC_PLUGIN_PAGE_INVOICE_GET_PRIVATE(page);
00430 
00431         gnc_gconf_general_remove_cb(KEY_SUMMARYBAR_POSITION,
00432                 gnc_plugin_page_invoice_summarybar_position_changed, page);
00433 
00434         if (priv->widget == NULL)
00435     {
00436         LEAVE("");
00437                 return;
00438     }
00439 
00440         if (priv->component_manager_id) {
00441           gnc_unregister_gui_component(priv->component_manager_id);
00442           priv->component_manager_id = 0;
00443         }
00444 
00445         gtk_widget_hide(priv->widget);
00446         gnc_invoice_window_destroy_cb(priv->widget, priv->iw);
00447         priv->widget = NULL;
00448     LEAVE("");
00449 }
00450 
00460 static void
00461 gnc_plugin_page_invoice_save_page (GncPluginPage *plugin_page,
00462                                    GKeyFile *key_file,
00463                                    const gchar *group_name)
00464 {
00465         GncPluginPageInvoice *invoice;
00466         GncPluginPageInvoicePrivate *priv;
00467         
00468         g_return_if_fail (GNC_IS_PLUGIN_PAGE_INVOICE(plugin_page));
00469         g_return_if_fail (key_file != NULL);
00470         g_return_if_fail (group_name != NULL);
00471 
00472         ENTER("page %p, key_file %p, group_name %s", plugin_page, key_file,
00473               group_name);
00474 
00475         invoice = GNC_PLUGIN_PAGE_INVOICE(plugin_page);
00476         priv = GNC_PLUGIN_PAGE_INVOICE_GET_PRIVATE(invoice);
00477 
00478     gnc_invoice_save_page(priv->iw, key_file, group_name);
00479         LEAVE(" ");
00480 }
00481 
00482 
00483 
00493 static GncPluginPage *
00494 gnc_plugin_page_invoice_recreate_page (GtkWidget *window,
00495                                        GKeyFile *key_file,
00496                                        const gchar *group_name)
00497 {
00498         GncPluginPage *page;
00499 
00500         g_return_val_if_fail(GNC_IS_MAIN_WINDOW(window), NULL);
00501         g_return_val_if_fail(key_file, NULL);
00502         g_return_val_if_fail(group_name, NULL);
00503         ENTER("key_file %p, group_name %s", key_file, group_name);
00504 
00505         /* Create the new page. */
00506         page = gnc_invoice_recreate_page(GNC_MAIN_WINDOW(window),
00507                                          key_file, group_name);
00508 
00509         LEAVE(" ");
00510         return page;
00511 }
00512 
00513 
00514 static void
00515 gnc_plugin_page_invoice_window_changed (GncPluginPage *plugin_page,
00516                                         GtkWidget *window)
00517 {
00518         GncPluginPageInvoice *page;
00519         GncPluginPageInvoicePrivate *priv;
00520         
00521         g_return_if_fail (GNC_IS_PLUGIN_PAGE_INVOICE (plugin_page));
00522 
00523         page = GNC_PLUGIN_PAGE_INVOICE(plugin_page);
00524         priv = GNC_PLUGIN_PAGE_INVOICE_GET_PRIVATE(page);
00525         gnc_invoice_window_changed (priv->iw, window);
00526 }
00527 
00528 
00529 static void
00530 gnc_plugin_page_invoice_summarybar_position_changed(GConfEntry *entry,
00531                                                     gpointer user_data)
00532 {
00533         GncPluginPage *plugin_page;
00534         GncPluginPageInvoice *page;
00535         GncPluginPageInvoicePrivate *priv;
00536         GtkPositionType position = GTK_POS_BOTTOM;
00537         gchar *conf_string;
00538         
00539         g_return_if_fail(user_data != NULL);
00540         
00541         plugin_page = GNC_PLUGIN_PAGE(user_data);
00542         page = GNC_PLUGIN_PAGE_INVOICE (user_data);
00543         priv = GNC_PLUGIN_PAGE_INVOICE_GET_PRIVATE(page);
00544         
00545         conf_string = gnc_gconf_get_string (GCONF_GENERAL,
00546                                             KEY_SUMMARYBAR_POSITION, NULL);
00547         if (conf_string) {
00548                 position = gnc_enum_from_nick (GTK_TYPE_POSITION_TYPE,
00549                                                conf_string, GTK_POS_BOTTOM);
00550                 g_free (conf_string);
00551         }
00552 
00553         gtk_box_reorder_child(GTK_BOX(priv->widget),
00554                               plugin_page->summarybar,
00555                               (position == GTK_POS_TOP ? 0 : -1) );
00556 }
00557 
00558 
00559 /************************************************************/
00560 /*                     Command callbacks                    */
00561 /************************************************************/
00562 
00563 static void
00564 gnc_plugin_page_invoice_cmd_new_invoice (GtkAction *action,
00565                                          GncPluginPageInvoice *plugin_page)
00566 {
00567   GncPluginPageInvoicePrivate *priv;
00568 
00569   g_return_if_fail(GNC_IS_PLUGIN_PAGE_INVOICE(plugin_page));
00570 
00571   ENTER("(action %p, plugin_page %p)", action, plugin_page);
00572   priv = GNC_PLUGIN_PAGE_INVOICE_GET_PRIVATE(plugin_page);
00573   gnc_invoice_window_new_invoice_cb(NULL, priv->iw);
00574   LEAVE(" ");
00575 }
00576 
00577 static void
00578 gnc_plugin_page_invoice_cmd_new_account (GtkAction *action,
00579                                          GncPluginPageInvoice *plugin_page)
00580 {
00581   g_return_if_fail(GNC_IS_PLUGIN_PAGE_INVOICE(plugin_page));
00582 
00583   ENTER("(action %p, plugin_page %p)", action, plugin_page);
00584   gnc_ui_new_account_window (gnc_get_current_book(), NULL);
00585   LEAVE(" ");
00586 }
00587 
00588 static void
00589 gnc_plugin_page_invoice_cmd_print (GtkAction *action,
00590                                    GncPluginPageInvoice *plugin_page)
00591 {
00592   GncPluginPageInvoicePrivate *priv;
00593 
00594   g_return_if_fail(GNC_IS_PLUGIN_PAGE_INVOICE(plugin_page));
00595 
00596   ENTER("(action %p, plugin_page %p)", action, plugin_page);
00597   priv = GNC_PLUGIN_PAGE_INVOICE_GET_PRIVATE(plugin_page);
00598   gnc_invoice_window_printCB(NULL, priv->iw);
00599   LEAVE(" ");
00600 }
00601 
00602 static void
00603 gnc_plugin_page_invoice_cmd_cut (GtkAction *action,
00604                                  GncPluginPageInvoice *plugin_page)
00605 {
00606   GncPluginPageInvoicePrivate *priv;
00607 
00608   g_return_if_fail(GNC_IS_PLUGIN_PAGE_INVOICE(plugin_page));
00609 
00610   ENTER("(action %p, plugin_page %p)", action, plugin_page);
00611   priv = GNC_PLUGIN_PAGE_INVOICE_GET_PRIVATE(plugin_page);
00612   gnc_invoice_window_cut_cb(NULL, priv->iw);
00613   LEAVE(" ");
00614 }
00615 
00616 static void
00617 gnc_plugin_page_invoice_cmd_copy (GtkAction *action,
00618                                   GncPluginPageInvoice *plugin_page)
00619 {
00620   GncPluginPageInvoicePrivate *priv;
00621 
00622   g_return_if_fail(GNC_IS_PLUGIN_PAGE_INVOICE(plugin_page));
00623 
00624   ENTER("(action %p, plugin_page %p)", action, plugin_page);
00625   priv = GNC_PLUGIN_PAGE_INVOICE_GET_PRIVATE(plugin_page);
00626   gnc_invoice_window_copy_cb(NULL, priv->iw);
00627   LEAVE(" ");
00628 }
00629 
00630 static void
00631 gnc_plugin_page_invoice_cmd_paste (GtkAction *action,
00632                                    GncPluginPageInvoice *plugin_page)
00633 {
00634   GncPluginPageInvoicePrivate *priv;
00635 
00636   g_return_if_fail(GNC_IS_PLUGIN_PAGE_INVOICE(plugin_page));
00637 
00638   ENTER("(action %p, plugin_page %p)", action, plugin_page);
00639   priv = GNC_PLUGIN_PAGE_INVOICE_GET_PRIVATE(plugin_page);
00640   gnc_invoice_window_paste_cb(NULL, priv->iw);
00641   LEAVE(" ");
00642 }
00643 
00644 static void
00645 gnc_plugin_page_invoice_cmd_edit (GtkAction *action,
00646                                   GncPluginPageInvoice *plugin_page)
00647 {
00648   GncPluginPageInvoicePrivate *priv;
00649 
00650   g_return_if_fail(GNC_IS_PLUGIN_PAGE_INVOICE(plugin_page));
00651 
00652   ENTER("(action %p, plugin_page %p)", action, plugin_page);
00653   priv = GNC_PLUGIN_PAGE_INVOICE_GET_PRIVATE(plugin_page);
00654   gnc_invoice_window_editCB(NULL, priv->iw);
00655   LEAVE(" ");
00656 }
00657 
00658 static void
00659 gnc_plugin_page_invoice_cmd_post (GtkAction *action,
00660                                   GncPluginPageInvoice *plugin_page)
00661 {
00662   GncPluginPageInvoicePrivate *priv;
00663 
00664   g_return_if_fail(GNC_IS_PLUGIN_PAGE_INVOICE(plugin_page));
00665 
00666   ENTER("(action %p, plugin_page %p)", action, plugin_page);
00667   priv = GNC_PLUGIN_PAGE_INVOICE_GET_PRIVATE(plugin_page);
00668   gnc_invoice_window_postCB(NULL, priv->iw);
00669   LEAVE(" ");
00670 }
00671 
00672 static void
00673 gnc_plugin_page_invoice_cmd_unpost (GtkAction *action,
00674                                     GncPluginPageInvoice *plugin_page)
00675 {
00676   GncPluginPageInvoicePrivate *priv;
00677 
00678   g_return_if_fail(GNC_IS_PLUGIN_PAGE_INVOICE(plugin_page));
00679 
00680   ENTER("(action %p, plugin_page %p)", action, plugin_page);
00681   priv = GNC_PLUGIN_PAGE_INVOICE_GET_PRIVATE(plugin_page);
00682   gnc_invoice_window_unpostCB(NULL, priv->iw);
00683   LEAVE(" ");
00684 }
00685 
00686 static void
00687 gnc_plugin_page_invoice_cmd_sort_changed (GtkAction *action,
00688                                           GtkRadioAction *current,
00689                                           GncPluginPageInvoice *plugin_page)
00690 {
00691   GncPluginPageInvoicePrivate *priv;
00692   invoice_sort_type_t value;
00693 
00694   ENTER("(action %p, radio action %p, plugin_page %p)",
00695         action, current, plugin_page);
00696   LEAVE("g_return testing...");
00697 
00698   g_return_if_fail(GTK_IS_ACTION(action));
00699   g_return_if_fail(GTK_IS_RADIO_ACTION(current));
00700   g_return_if_fail(GNC_IS_PLUGIN_PAGE_INVOICE(plugin_page));
00701 
00702   ENTER("...passed (action %p, radio action %p, plugin_page %p)",
00703         action, current, plugin_page);
00704   priv = GNC_PLUGIN_PAGE_INVOICE_GET_PRIVATE(plugin_page);
00705   value = gtk_radio_action_get_current_value(current);
00706   gnc_invoice_window_sort (priv->iw, value);
00707   LEAVE(" ");
00708 }
00709 
00710 
00711 static void
00712 gnc_plugin_page_invoice_cmd_enter (GtkAction *action,
00713                                    GncPluginPageInvoice *plugin_page)
00714 {
00715   GncPluginPageInvoicePrivate *priv;
00716 
00717   g_return_if_fail(GNC_IS_PLUGIN_PAGE_INVOICE(plugin_page));
00718 
00719   ENTER("(action %p, plugin_page %p)", action, plugin_page);
00720   priv = GNC_PLUGIN_PAGE_INVOICE_GET_PRIVATE(plugin_page);
00721   gnc_invoice_window_recordCB(NULL, priv->iw);
00722   LEAVE(" ");
00723 }
00724 
00725 static void
00726 gnc_plugin_page_invoice_cmd_cancel (GtkAction *action,
00727                                     GncPluginPageInvoice *plugin_page)
00728 {
00729   GncPluginPageInvoicePrivate *priv;
00730 
00731   g_return_if_fail(GNC_IS_PLUGIN_PAGE_INVOICE(plugin_page));
00732 
00733   ENTER("(action %p, plugin_page %p)", action, plugin_page);
00734   priv = GNC_PLUGIN_PAGE_INVOICE_GET_PRIVATE(plugin_page);
00735   gnc_invoice_window_cancelCB(NULL, priv->iw);
00736   LEAVE(" ");
00737 }
00738 
00739 static void
00740 gnc_plugin_page_invoice_cmd_delete (GtkAction *action,
00741                                     GncPluginPageInvoice *plugin_page)
00742 {
00743   GncPluginPageInvoicePrivate *priv;
00744 
00745   g_return_if_fail(GNC_IS_PLUGIN_PAGE_INVOICE(plugin_page));
00746 
00747   ENTER("(action %p, plugin_page %p)", action, plugin_page);
00748   priv = GNC_PLUGIN_PAGE_INVOICE_GET_PRIVATE(plugin_page);
00749   gnc_invoice_window_deleteCB(NULL, priv->iw);
00750   LEAVE(" ");
00751 }
00752 
00753 static void
00754 gnc_plugin_page_invoice_cmd_blank (GtkAction *action,
00755                                    GncPluginPageInvoice *plugin_page)
00756 {
00757   GncPluginPageInvoicePrivate *priv;
00758 
00759   g_return_if_fail(GNC_IS_PLUGIN_PAGE_INVOICE(plugin_page));
00760 
00761   ENTER("(action %p, plugin_page %p)", action, plugin_page);
00762   priv = GNC_PLUGIN_PAGE_INVOICE_GET_PRIVATE(plugin_page);
00763   gnc_invoice_window_blankCB(NULL, priv->iw);
00764   LEAVE(" ");
00765 }
00766 
00767 static void
00768 gnc_plugin_page_invoice_cmd_duplicate (GtkAction *action,
00769                                        GncPluginPageInvoice *plugin_page)
00770 {
00771   GncPluginPageInvoicePrivate *priv;
00772 
00773   g_return_if_fail(GNC_IS_PLUGIN_PAGE_INVOICE(plugin_page));
00774 
00775   ENTER("(action %p, plugin_page %p)", action, plugin_page);
00776   priv = GNC_PLUGIN_PAGE_INVOICE_GET_PRIVATE(plugin_page);
00777   gnc_invoice_window_duplicateCB(NULL, priv->iw);
00778   LEAVE(" ");
00779 }
00780 
00781 static void
00782 gnc_plugin_page_invoice_cmd_pay_invoice (GtkAction *action,
00783                                          GncPluginPageInvoice *plugin_page)
00784 {
00785   GncPluginPageInvoicePrivate *priv;
00786 
00787   g_return_if_fail(GNC_IS_PLUGIN_PAGE_INVOICE(plugin_page));
00788 
00789   ENTER("(action %p, plugin_page %p)", action, plugin_page);
00790   priv = GNC_PLUGIN_PAGE_INVOICE_GET_PRIVATE(plugin_page);
00791   gnc_invoice_window_payment_cb(NULL, priv->iw);
00792   LEAVE(" ");
00793 }
00794 
00795 static void
00796 gnc_plugin_page_invoice_cmd_company_report (GtkAction *action,
00797                                             GncPluginPageInvoice *plugin_page)
00798 {
00799   GncPluginPageInvoicePrivate *priv;
00800 
00801   g_return_if_fail(GNC_IS_PLUGIN_PAGE_INVOICE(plugin_page));
00802 
00803   ENTER("(action %p, plugin_page %p)", action, plugin_page);
00804   priv = GNC_PLUGIN_PAGE_INVOICE_GET_PRIVATE(plugin_page);
00805   gnc_invoice_window_report_owner_cb(NULL, priv->iw);
00806   LEAVE(" ");
00807 }
00808 
00809 /************************************************************/
00810 /*                    Auxiliary functions                   */
00811 /************************************************************/
00812 
00813 static void
00814 gnc_plugin_page_redraw_help_cb (GnucashRegister *g_reg,
00815                                 GncPluginPageInvoice *invoice_page)
00816 {
00817   GncPluginPageInvoicePrivate *priv;
00818   GncWindow *window;
00819   const char *status;
00820   char *help;
00821 
00822   g_return_if_fail(GNC_IS_PLUGIN_PAGE_INVOICE(invoice_page));
00823 
00824   window = GNC_WINDOW(GNC_PLUGIN_PAGE(invoice_page)->window);
00825 
00826   /* Get the text from the ledger */
00827   priv = GNC_PLUGIN_PAGE_INVOICE_GET_PRIVATE(invoice_page);
00828   help = gnc_invoice_get_help(priv->iw);
00829   status = help ? help : g_strdup("");
00830   gnc_window_set_status(window, GNC_PLUGIN_PAGE(invoice_page), status);
00831   g_free(help);
00832 }
00833 
00834 
00835 void
00836 gnc_plugin_page_invoice_update_title (GncPluginPage *plugin_page)
00837 {
00838   GncPluginPageInvoice *page;
00839   GncPluginPageInvoicePrivate *priv;
00840   gchar *title;
00841 
00842   g_return_if_fail(GNC_IS_PLUGIN_PAGE_INVOICE(plugin_page));
00843 
00844   page = GNC_PLUGIN_PAGE_INVOICE(plugin_page);
00845   priv = GNC_PLUGIN_PAGE_INVOICE_GET_PRIVATE(page);
00846   title = gnc_invoice_get_title(priv->iw);
00847   gnc_plugin_page_set_page_name(plugin_page, title);
00848   g_free(title);
00849 }
00850 
00851 static void
00852 gnc_plugin_page_invoice_refresh_cb (GHashTable *changes, gpointer user_data)
00853 {
00854   GncPluginPageInvoice *page = user_data;
00855   GncPluginPageInvoicePrivate *priv;
00856   GtkWidget *reg;
00857 
00858   g_return_if_fail(GNC_IS_PLUGIN_PAGE_INVOICE(page));
00859 
00860   /* We're only looking for forced updates here. */
00861   if (changes)
00862     return;
00863 
00864   priv = GNC_PLUGIN_PAGE_INVOICE_GET_PRIVATE(page);
00865   reg = gnc_invoice_get_register(priv->iw);
00866   gnucash_register_refresh_from_gconf(GNUCASH_REGISTER(reg));
00867   gtk_widget_queue_draw(priv->widget);
00868 }

Generated on Thu Aug 28 05:05:42 2008 for GnuCash by  doxygen 1.5.2