GnuCash 2.4.99
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 /* Command callbacks */
00059 static void gnc_plugin_page_invoice_cmd_new_invoice (GtkAction *action, GncPluginPageInvoice *plugin_page);
00060 static void gnc_plugin_page_invoice_cmd_new_account (GtkAction *action, GncPluginPageInvoice *plugin_page);
00061 static void gnc_plugin_page_invoice_cmd_print (GtkAction *action, GncPluginPageInvoice *plugin_page);
00062 static void gnc_plugin_page_invoice_cmd_cut (GtkAction *action, GncPluginPageInvoice *plugin_page);
00063 static void gnc_plugin_page_invoice_cmd_copy (GtkAction *action, GncPluginPageInvoice *plugin_page);
00064 static void gnc_plugin_page_invoice_cmd_paste (GtkAction *action, GncPluginPageInvoice *plugin_page);
00065 static void gnc_plugin_page_invoice_cmd_edit (GtkAction *action, GncPluginPageInvoice *plugin_page);
00066 static void gnc_plugin_page_invoice_cmd_duplicateInvoice (GtkAction *action, GncPluginPageInvoice *plugin_page);
00067 static void gnc_plugin_page_invoice_cmd_post (GtkAction *action, GncPluginPageInvoice *plugin_page);
00068 static void gnc_plugin_page_invoice_cmd_unpost (GtkAction *action, GncPluginPageInvoice *plugin_page);
00069 
00070 static void gnc_plugin_page_invoice_cmd_sort_changed (GtkAction *action,
00071         GtkRadioAction *current,
00072         GncPluginPageInvoice *plugin_page);
00073 
00074 static void gnc_plugin_page_invoice_cmd_enter (GtkAction *action, GncPluginPageInvoice *plugin_page);
00075 static void gnc_plugin_page_invoice_cmd_cancel (GtkAction *action, GncPluginPageInvoice *plugin_page);
00076 static void gnc_plugin_page_invoice_cmd_delete (GtkAction *action, GncPluginPageInvoice *plugin_page);
00077 static void gnc_plugin_page_invoice_cmd_blank (GtkAction *action, GncPluginPageInvoice *plugin_page);
00078 static void gnc_plugin_page_invoice_cmd_duplicateEntry (GtkAction *action, GncPluginPageInvoice *plugin_page);
00079 static void gnc_plugin_page_invoice_cmd_pay_invoice (GtkAction *action, GncPluginPageInvoice *plugin_page);
00080 static void gnc_plugin_page_invoice_cmd_company_report (GtkAction *action, GncPluginPageInvoice *plugin_page);
00081 
00082 static void gnc_plugin_page_redraw_help_cb( GnucashRegister *gsr, GncPluginPageInvoice *invoice_page );
00083 static void gnc_plugin_page_invoice_refresh_cb (GHashTable *changes, gpointer user_data);
00084 
00085 static void gnc_plugin_page_invoice_cmd_entryUp (GtkAction *action, GncPluginPageInvoice *plugin_page);
00086 static void gnc_plugin_page_invoice_cmd_entryDown (GtkAction *action, GncPluginPageInvoice *plugin_page);
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     {
00100         "FileNewAccountAction", GNC_STOCK_NEW_ACCOUNT, N_("New _Account..."), NULL,
00101         N_("Create a new account"),
00102         G_CALLBACK (gnc_plugin_page_invoice_cmd_new_account)
00103     },
00104     {
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 
00110     /* Edit menu */
00111     {
00112         "EditCutAction", GTK_STOCK_CUT, N_("_Cut"), NULL,
00113         NULL,
00114         G_CALLBACK (gnc_plugin_page_invoice_cmd_cut)
00115     },
00116     {
00117         "EditCopyAction", GTK_STOCK_COPY, N_("Copy"), NULL,
00118         NULL,
00119         G_CALLBACK (gnc_plugin_page_invoice_cmd_copy)
00120     },
00121     {
00122         "EditPasteAction", GTK_STOCK_PASTE, N_("_Paste"), NULL,
00123         NULL,
00124         G_CALLBACK (gnc_plugin_page_invoice_cmd_paste)
00125     },
00126     {
00127         "EditEditInvoiceAction", GNC_STOCK_INVOICE_EDIT, N_("_Edit Invoice"), NULL,
00128         N_("Edit this invoice"),
00129         G_CALLBACK (gnc_plugin_page_invoice_cmd_edit)
00130     },
00131     {
00132         "EditDuplicateInvoiceAction", GNC_STOCK_INVOICE_DUPLICATE, N_("_Duplicate Invoice"),
00133         NULL, N_("Create a new invoice as a duplicate of the current one"),
00134         G_CALLBACK (gnc_plugin_page_invoice_cmd_duplicateInvoice)
00135     },
00136     {
00137         "EditPostInvoiceAction", GNC_STOCK_INVOICE_POST, N_("_Post Invoice"), NULL,
00138         N_("Post this Invoice to your Chart of Accounts"),
00139         G_CALLBACK (gnc_plugin_page_invoice_cmd_post)
00140     },
00141     {
00142         "EditUnpostInvoiceAction", GNC_STOCK_INVOICE_UNPOST, N_("_Unpost Invoice"), NULL,
00143         N_("Unpost this Invoice and make it editable"),
00144         G_CALLBACK (gnc_plugin_page_invoice_cmd_unpost)
00145     },
00146 
00147     /* Actions menu */
00148     {
00149         "RecordEntryAction", GTK_STOCK_ADD, N_("_Enter"), NULL,
00150         N_("Record the current entry"),
00151         G_CALLBACK (gnc_plugin_page_invoice_cmd_enter)
00152     },
00153     {
00154         "CancelEntryAction", GTK_STOCK_CANCEL, N_("_Cancel"), NULL,
00155         N_("Cancel the current entry"),
00156         G_CALLBACK (gnc_plugin_page_invoice_cmd_cancel)
00157     },
00158     {
00159         "DeleteEntryAction", GTK_STOCK_DELETE, N_("_Delete"), NULL,
00160         N_("Delete the current entry"),
00161         G_CALLBACK (gnc_plugin_page_invoice_cmd_delete)
00162     },
00163     {
00164         "BlankEntryAction", GTK_STOCK_GOTO_BOTTOM, N_("_Blank"), NULL,
00165         N_("Move to the blank entry at the bottom of the Invoice"),
00166         G_CALLBACK (gnc_plugin_page_invoice_cmd_blank)
00167     },
00168     {
00169         "DuplicateEntryAction", GTK_STOCK_COPY, N_("Dup_licate Entry"), NULL,
00170         N_("Make a copy of the current entry"),
00171         G_CALLBACK (gnc_plugin_page_invoice_cmd_duplicateEntry)
00172     },
00173     {
00174         "EntryUpAction", GTK_STOCK_GO_UP, N_("Move Entry _Up"), NULL,
00175         N_("Move the current entry one row upwards"),
00176         G_CALLBACK (gnc_plugin_page_invoice_cmd_entryUp)
00177     },
00178     {
00179         "EntryDownAction", GTK_STOCK_GO_DOWN, N_("Move Entry Do_wn"), NULL,
00180         N_("Move the current entry one row downwards"),
00181         G_CALLBACK (gnc_plugin_page_invoice_cmd_entryDown)
00182     },
00183 
00184     /* Business menu */
00185     {
00186         "BusinessNewInvoiceAction", GNC_STOCK_INVOICE_NEW, N_("New _Invoice"), "",
00187         N_("Create a new invoice for the same owner as the current one"),
00188         G_CALLBACK (gnc_plugin_page_invoice_cmd_new_invoice)
00189     },
00190     {
00191         "ToolsProcessPaymentAction", GNC_STOCK_INVOICE_PAY, N_("_Pay Invoice"), NULL,
00192         N_("Enter a payment for the owner of this Invoice"),
00193         G_CALLBACK (gnc_plugin_page_invoice_cmd_pay_invoice)
00194     },
00195 
00196     /* Reports menu */
00197     {
00198         "ReportsCompanyReportAction", NULL, N_("_Company Report"), NULL,
00199         N_("Open a company report window for the owner of this Invoice"),
00200         G_CALLBACK (gnc_plugin_page_invoice_cmd_company_report)
00201     },
00202 };
00203 static guint gnc_plugin_page_invoice_n_actions = G_N_ELEMENTS (gnc_plugin_page_invoice_actions);
00204 
00205 static GtkRadioActionEntry radio_entries [] =
00206 {
00207     { "SortStandardAction", NULL, N_("_Standard"), NULL, N_("Keep normal invoice order"), INVSORT_BY_STANDARD },
00208     { "SortDateAction", NULL, N_("_Date"), NULL, N_("Sort by date"), INVSORT_BY_DATE },
00209     { "SortDateEntryAction", NULL, N_("Date of _Entry"), NULL, N_("Sort by the date of entry"), INVSORT_BY_DATE_ENTERED },
00210     { "SortQuantityAction", NULL, N_("_Quantity"), NULL, N_("Sort by quantity"), INVSORT_BY_QTY },
00211     { "SortPriceAction", NULL, N_("_Price"), NULL, N_("Sort by price"), INVSORT_BY_PRICE },
00212     { "SortDescriptionAction", NULL, N_("Descri_ption"), NULL, N_("Sort by description"), INVSORT_BY_DESC },
00213 };
00214 static guint n_radio_entries = G_N_ELEMENTS (radio_entries);
00215 
00216 static const gchar *invoice_book_readwrite_actions[] =
00217 {
00218     // Only insert actions here which are not yet in posted_actions and unposted_actions!
00219     "FileNewAccountAction",
00220     "EditDuplicateInvoiceAction",
00221     "BusinessNewInvoiceAction",
00222     "ToolsProcessPaymentAction",
00223     NULL
00224 };
00225 
00226 static const gchar *posted_actions[] =
00227 {
00228     NULL
00229 };
00230 
00231 static const gchar *unposted_actions[] =
00232 {
00233     "EditCutAction",
00234     "EditPasteAction",
00235     "EditEditInvoiceAction",
00236     "EditPostInvoiceAction",
00237     "RecordEntryAction",
00238     "CancelEntryAction",
00239     "DeleteEntryAction",
00240     "DuplicateEntryAction",
00241     "EntryUpAction",
00242     "EntryDownAction",
00243     "BlankEntryAction",
00244     NULL
00245 };
00246 
00247 static const gchar *can_unpost_actions[] =
00248 {
00249     "EditUnpostInvoiceAction",
00250     NULL
00251 };
00252 
00254 static action_toolbar_labels toolbar_labels[] =
00255 {
00256     { "RecordEntryAction",        N_("Enter") },
00257     { "CancelEntryAction",        N_("Cancel") },
00258     { "DeleteEntryAction",        N_("Delete") },
00259     { "DuplicateEntryAction",       N_("Duplicate") },
00260     { "EntryUpAction", N_("Up") },
00261     { "EntryDownAction", N_("Down") },
00262     { "BlankEntryAction",           N_("Blank") },
00263     { "EditPostInvoiceAction",      N_("Post") },
00264     { "EditUnpostInvoiceAction",    N_("Unpost") },
00265     { NULL, NULL },
00266 };
00267 
00268 
00269 /************************************************************/
00270 /*                      Data Structures                     */
00271 /************************************************************/
00272 
00273 typedef struct GncPluginPageInvoicePrivate
00274 {
00275     InvoiceWindow *iw;
00276 
00277     GtkWidget *widget;
00278 
00279     gint component_manager_id;
00280 } GncPluginPageInvoicePrivate;
00281 
00282 #define GNC_PLUGIN_PAGE_INVOICE_GET_PRIVATE(o)  \
00283    (G_TYPE_INSTANCE_GET_PRIVATE ((o), GNC_TYPE_PLUGIN_PAGE_INVOICE, GncPluginPageInvoicePrivate))
00284 
00285 static GObjectClass *parent_class = NULL;
00286 
00287 /************************************************************/
00288 /*                      Implementation                      */
00289 /************************************************************/
00290 
00291 GType
00292 gnc_plugin_page_invoice_get_type (void)
00293 {
00294     static GType gnc_plugin_page_invoice_type = 0;
00295 
00296     if (gnc_plugin_page_invoice_type == 0)
00297     {
00298         static const GTypeInfo our_info =
00299         {
00300             sizeof (GncPluginPageInvoiceClass),
00301             NULL,
00302             NULL,
00303             (GClassInitFunc) gnc_plugin_page_invoice_class_init,
00304             NULL,
00305             NULL,
00306             sizeof (GncPluginPageInvoice),
00307             0,
00308             (GInstanceInitFunc) gnc_plugin_page_invoice_init
00309         };
00310 
00311         gnc_plugin_page_invoice_type = g_type_register_static (GNC_TYPE_PLUGIN_PAGE,
00312                                        "GncPluginPageInvoice",
00313                                        &our_info, 0);
00314     }
00315 
00316     return gnc_plugin_page_invoice_type;
00317 }
00318 
00319 GncPluginPage *
00320 gnc_plugin_page_invoice_new (InvoiceWindow *iw)
00321 {
00322     GncPluginPageInvoicePrivate *priv;
00323     GncPluginPageInvoice *invoice_page;
00324     GncPluginPage *plugin_page;
00325     const GList *item;
00326 
00327     /* Is there an existing page? */
00328     item = gnc_gobject_tracking_get_list(GNC_PLUGIN_PAGE_INVOICE_NAME);
00329     for ( ; item; item = g_list_next(item))
00330     {
00331         invoice_page = (GncPluginPageInvoice *)item->data;
00332         priv = GNC_PLUGIN_PAGE_INVOICE_GET_PRIVATE(invoice_page);
00333         if (priv->iw == iw)
00334             return GNC_PLUGIN_PAGE(invoice_page);
00335     }
00336 
00337     invoice_page = g_object_new (GNC_TYPE_PLUGIN_PAGE_INVOICE, (char *)NULL);
00338     priv = GNC_PLUGIN_PAGE_INVOICE_GET_PRIVATE(invoice_page);
00339     priv->iw = iw;
00340 
00341     plugin_page = GNC_PLUGIN_PAGE(invoice_page);
00342     gnc_plugin_page_invoice_update_title(plugin_page);
00343     gnc_plugin_page_set_uri(plugin_page, "default:");
00344 
00345     priv->component_manager_id = 0;
00346     return plugin_page;
00347 }
00348 
00349 static void
00350 gnc_plugin_page_invoice_class_init (GncPluginPageInvoiceClass *klass)
00351 {
00352     GObjectClass *object_class = G_OBJECT_CLASS (klass);
00353     GncPluginPageClass *gnc_plugin_class = GNC_PLUGIN_PAGE_CLASS(klass);
00354 
00355     parent_class = g_type_class_peek_parent (klass);
00356 
00357     object_class->finalize = gnc_plugin_page_invoice_finalize;
00358 
00359     gnc_plugin_class->tab_icon        = NULL;
00360     gnc_plugin_class->plugin_name     = GNC_PLUGIN_PAGE_INVOICE_NAME;
00361     gnc_plugin_class->create_widget   = gnc_plugin_page_invoice_create_widget;
00362     gnc_plugin_class->destroy_widget  = gnc_plugin_page_invoice_destroy_widget;
00363     gnc_plugin_class->save_page       = gnc_plugin_page_invoice_save_page;
00364     gnc_plugin_class->recreate_page   = gnc_plugin_page_invoice_recreate_page;
00365     gnc_plugin_class->window_changed  = gnc_plugin_page_invoice_window_changed;
00366 
00367     g_type_class_add_private(klass, sizeof(GncPluginPageInvoicePrivate));
00368 }
00369 
00370 static void
00371 gnc_plugin_page_invoice_init (GncPluginPageInvoice *plugin_page)
00372 {
00373     GncPluginPageInvoicePrivate *priv;
00374     GncPluginPage *parent;
00375     GtkActionGroup *action_group;
00376     gboolean use_new;
00377 
00378     priv = GNC_PLUGIN_PAGE_INVOICE_GET_PRIVATE(plugin_page);
00379 
00380     /* Init parent declared variables */
00381     parent = GNC_PLUGIN_PAGE(plugin_page);
00382     use_new = gnc_gconf_get_bool(GCONF_SECTION_INVOICE, KEY_USE_NEW, NULL);
00383     g_object_set(G_OBJECT(plugin_page),
00384                  "page-name",      _("Invoice"),
00385                  "page-uri",       "default:",
00386                  "ui-description", "gnc-plugin-page-invoice-ui.xml",
00387                  "use-new-window", use_new,
00388                  (char *)NULL);
00389 
00390     /* change me when the system supports multiple books */
00391     gnc_plugin_page_add_book(parent, gnc_get_current_book());
00392 
00393     /* Create menu and toolbar information */
00394     action_group =
00395         gnc_plugin_page_create_action_group(parent,
00396                                             "GncPluginPageInvoiceActions");
00397     gtk_action_group_add_actions (action_group, gnc_plugin_page_invoice_actions,
00398                                   gnc_plugin_page_invoice_n_actions, plugin_page);
00399     gtk_action_group_add_radio_actions (action_group,
00400                                         radio_entries, n_radio_entries,
00401                                         REG_STYLE_LEDGER,
00402                                         G_CALLBACK(gnc_plugin_page_invoice_cmd_sort_changed),
00403                                         plugin_page);
00404 
00405     gnc_plugin_init_short_names (action_group, toolbar_labels);
00406 }
00407 
00408 static void
00409 gnc_plugin_page_invoice_finalize (GObject *object)
00410 {
00411     GncPluginPageInvoice *page;
00412     GncPluginPageInvoicePrivate *priv;
00413 
00414     g_return_if_fail (GNC_IS_PLUGIN_PAGE_INVOICE (object));
00415 
00416     ENTER("object %p", object);
00417     page = GNC_PLUGIN_PAGE_INVOICE (object);
00418     priv = GNC_PLUGIN_PAGE_INVOICE_GET_PRIVATE(page);
00419 
00420     G_OBJECT_CLASS (parent_class)->finalize (object);
00421     LEAVE(" ");
00422 }
00423 
00424 
00425 void
00426 gnc_plugin_page_invoice_update_menus (GncPluginPage *page, gboolean is_posted, gboolean can_unpost)
00427 {
00428     GtkActionGroup *action_group;
00429     gboolean is_readonly = qof_book_is_readonly(gnc_get_current_book());
00430 
00431     g_return_if_fail(GNC_IS_PLUGIN_PAGE_INVOICE(page));
00432 
00433     if (is_readonly)
00434     {
00435         // Are we readonly? Then don't allow any actions.
00436         is_posted = TRUE;
00437         can_unpost = FALSE;
00438     }
00439 
00440     action_group = gnc_plugin_page_get_action_group(page);
00441     gnc_plugin_update_actions (action_group, posted_actions,
00442                                "sensitive", is_posted);
00443     gnc_plugin_update_actions (action_group, unposted_actions,
00444                                "sensitive", !is_posted);
00445     gnc_plugin_update_actions (action_group, can_unpost_actions,
00446                                "sensitive", can_unpost);
00447     gnc_plugin_update_actions (action_group, invoice_book_readwrite_actions,
00448                                "sensitive", !is_readonly);
00449 }
00450 
00451 
00452 /* Virtual Functions */
00453 
00454 static GtkWidget *
00455 gnc_plugin_page_invoice_create_widget (GncPluginPage *plugin_page)
00456 {
00457     GncPluginPageInvoice *page;
00458     GncPluginPageInvoicePrivate *priv;
00459     GtkWidget *regWidget, *widget;
00460 
00461     ENTER("page %p", plugin_page);
00462     page = GNC_PLUGIN_PAGE_INVOICE (plugin_page);
00463     priv = GNC_PLUGIN_PAGE_INVOICE_GET_PRIVATE(page);
00464     if (priv->widget != NULL)
00465     {
00466         LEAVE("");
00467         return priv->widget;
00468     }
00469 
00470     priv->widget = gtk_vbox_new (FALSE, 0);
00471     gtk_widget_show (priv->widget);
00472 
00473     widget = gnc_invoice_create_page(priv->iw, page);
00474     gtk_widget_show (widget);
00475     gtk_box_pack_start(GTK_BOX (priv->widget), widget, TRUE, TRUE, 0);
00476 
00477     plugin_page->summarybar = gnc_invoice_window_create_summary_bar(priv->iw);
00478     gtk_box_pack_start(GTK_BOX (priv->widget), plugin_page->summarybar, FALSE, FALSE, 0);
00479     gnc_plugin_page_invoice_summarybar_position_changed(NULL, page);
00480     gnc_gconf_general_register_cb(KEY_SUMMARYBAR_POSITION,
00481                                   gnc_plugin_page_invoice_summarybar_position_changed, page);
00482 
00483     regWidget = gnc_invoice_get_register(priv->iw);
00484     if (regWidget)
00485     {
00486         g_signal_connect (G_OBJECT (regWidget), "redraw-help",
00487                           G_CALLBACK (gnc_plugin_page_redraw_help_cb), page);
00488     }
00489 
00490     priv->component_manager_id =
00491         gnc_register_gui_component(GNC_PLUGIN_PAGE_INVOICE_NAME,
00492                                    gnc_plugin_page_invoice_refresh_cb,
00493                                    NULL, page);
00494 
00495     LEAVE("");
00496     return priv->widget;
00497 }
00498 
00499 static void
00500 gnc_plugin_page_invoice_destroy_widget (GncPluginPage *plugin_page)
00501 {
00502     GncPluginPageInvoice *page;
00503     GncPluginPageInvoicePrivate *priv;
00504 
00505     ENTER("page %p", plugin_page);
00506     page = GNC_PLUGIN_PAGE_INVOICE (plugin_page);
00507     priv = GNC_PLUGIN_PAGE_INVOICE_GET_PRIVATE(page);
00508 
00509     gnc_gconf_general_remove_cb(KEY_SUMMARYBAR_POSITION,
00510                                 gnc_plugin_page_invoice_summarybar_position_changed, page);
00511 
00512     if (priv->widget == NULL)
00513     {
00514         LEAVE("");
00515         return;
00516     }
00517 
00518     if (priv->component_manager_id)
00519     {
00520         gnc_unregister_gui_component(priv->component_manager_id);
00521         priv->component_manager_id = 0;
00522     }
00523 
00524     gtk_widget_hide(priv->widget);
00525     gnc_invoice_window_destroy_cb(priv->widget, priv->iw);
00526     priv->widget = NULL;
00527     LEAVE("");
00528 }
00529 
00539 static void
00540 gnc_plugin_page_invoice_save_page (GncPluginPage *plugin_page,
00541                                    GKeyFile *key_file,
00542                                    const gchar *group_name)
00543 {
00544     GncPluginPageInvoice *invoice;
00545     GncPluginPageInvoicePrivate *priv;
00546 
00547     g_return_if_fail (GNC_IS_PLUGIN_PAGE_INVOICE(plugin_page));
00548     g_return_if_fail (key_file != NULL);
00549     g_return_if_fail (group_name != NULL);
00550 
00551     ENTER("page %p, key_file %p, group_name %s", plugin_page, key_file,
00552           group_name);
00553 
00554     invoice = GNC_PLUGIN_PAGE_INVOICE(plugin_page);
00555     priv = GNC_PLUGIN_PAGE_INVOICE_GET_PRIVATE(invoice);
00556 
00557     gnc_invoice_save_page(priv->iw, key_file, group_name);
00558     LEAVE(" ");
00559 }
00560 
00561 
00562 
00572 static GncPluginPage *
00573 gnc_plugin_page_invoice_recreate_page (GtkWidget *window,
00574                                        GKeyFile *key_file,
00575                                        const gchar *group_name)
00576 {
00577     GncPluginPage *page;
00578 
00579     g_return_val_if_fail(GNC_IS_MAIN_WINDOW(window), NULL);
00580     g_return_val_if_fail(key_file, NULL);
00581     g_return_val_if_fail(group_name, NULL);
00582     ENTER("key_file %p, group_name %s", key_file, group_name);
00583 
00584     /* Create the new page. */
00585     page = gnc_invoice_recreate_page(GNC_MAIN_WINDOW(window),
00586                                      key_file, group_name);
00587 
00588     LEAVE(" ");
00589     return page;
00590 }
00591 
00592 
00593 static void
00594 gnc_plugin_page_invoice_window_changed (GncPluginPage *plugin_page,
00595                                         GtkWidget *window)
00596 {
00597     GncPluginPageInvoice *page;
00598     GncPluginPageInvoicePrivate *priv;
00599 
00600     g_return_if_fail (GNC_IS_PLUGIN_PAGE_INVOICE (plugin_page));
00601 
00602     page = GNC_PLUGIN_PAGE_INVOICE(plugin_page);
00603     priv = GNC_PLUGIN_PAGE_INVOICE_GET_PRIVATE(page);
00604     gnc_invoice_window_changed (priv->iw, window);
00605 }
00606 
00607 
00608 static void
00609 gnc_plugin_page_invoice_summarybar_position_changed(GConfEntry *entry,
00610         gpointer user_data)
00611 {
00612     GncPluginPage *plugin_page;
00613     GncPluginPageInvoice *page;
00614     GncPluginPageInvoicePrivate *priv;
00615     GtkPositionType position = GTK_POS_BOTTOM;
00616     gchar *conf_string;
00617 
00618     g_return_if_fail(user_data != NULL);
00619 
00620     plugin_page = GNC_PLUGIN_PAGE(user_data);
00621     page = GNC_PLUGIN_PAGE_INVOICE (user_data);
00622     priv = GNC_PLUGIN_PAGE_INVOICE_GET_PRIVATE(page);
00623 
00624     conf_string = gnc_gconf_get_string (GCONF_GENERAL,
00625                                         KEY_SUMMARYBAR_POSITION, NULL);
00626     if (conf_string)
00627     {
00628         position = gnc_enum_from_nick (GTK_TYPE_POSITION_TYPE,
00629                                        conf_string, GTK_POS_BOTTOM);
00630         g_free (conf_string);
00631     }
00632 
00633     gtk_box_reorder_child(GTK_BOX(priv->widget),
00634                           plugin_page->summarybar,
00635                           (position == GTK_POS_TOP ? 0 : -1) );
00636 }
00637 
00638 
00639 /************************************************************/
00640 /*                     Command callbacks                    */
00641 /************************************************************/
00642 
00643 static void
00644 gnc_plugin_page_invoice_cmd_new_invoice (GtkAction *action,
00645         GncPluginPageInvoice *plugin_page)
00646 {
00647     GncPluginPageInvoicePrivate *priv;
00648 
00649     g_return_if_fail(GNC_IS_PLUGIN_PAGE_INVOICE(plugin_page));
00650 
00651     ENTER("(action %p, plugin_page %p)", action, plugin_page);
00652     priv = GNC_PLUGIN_PAGE_INVOICE_GET_PRIVATE(plugin_page);
00653     gnc_invoice_window_new_invoice_cb(NULL, priv->iw);
00654     LEAVE(" ");
00655 }
00656 
00657 static void
00658 gnc_plugin_page_invoice_cmd_new_account (GtkAction *action,
00659         GncPluginPageInvoice *plugin_page)
00660 {
00661     g_return_if_fail(GNC_IS_PLUGIN_PAGE_INVOICE(plugin_page));
00662 
00663     ENTER("(action %p, plugin_page %p)", action, plugin_page);
00664     gnc_ui_new_account_window (gnc_get_current_book(), NULL);
00665     LEAVE(" ");
00666 }
00667 
00668 static void
00669 gnc_plugin_page_invoice_cmd_print (GtkAction *action,
00670                                    GncPluginPageInvoice *plugin_page)
00671 {
00672     GncPluginPageInvoicePrivate *priv;
00673 
00674     g_return_if_fail(GNC_IS_PLUGIN_PAGE_INVOICE(plugin_page));
00675 
00676     ENTER("(action %p, plugin_page %p)", action, plugin_page);
00677     priv = GNC_PLUGIN_PAGE_INVOICE_GET_PRIVATE(plugin_page);
00678     gnc_invoice_window_printCB(NULL, priv->iw);
00679     LEAVE(" ");
00680 }
00681 
00682 static void
00683 gnc_plugin_page_invoice_cmd_cut (GtkAction *action,
00684                                  GncPluginPageInvoice *plugin_page)
00685 {
00686     GncPluginPageInvoicePrivate *priv;
00687 
00688     g_return_if_fail(GNC_IS_PLUGIN_PAGE_INVOICE(plugin_page));
00689 
00690     ENTER("(action %p, plugin_page %p)", action, plugin_page);
00691     priv = GNC_PLUGIN_PAGE_INVOICE_GET_PRIVATE(plugin_page);
00692     gnc_invoice_window_cut_cb(NULL, priv->iw);
00693     LEAVE(" ");
00694 }
00695 
00696 static void
00697 gnc_plugin_page_invoice_cmd_copy (GtkAction *action,
00698                                   GncPluginPageInvoice *plugin_page)
00699 {
00700     GncPluginPageInvoicePrivate *priv;
00701 
00702     g_return_if_fail(GNC_IS_PLUGIN_PAGE_INVOICE(plugin_page));
00703 
00704     ENTER("(action %p, plugin_page %p)", action, plugin_page);
00705     priv = GNC_PLUGIN_PAGE_INVOICE_GET_PRIVATE(plugin_page);
00706     gnc_invoice_window_copy_cb(NULL, priv->iw);
00707     LEAVE(" ");
00708 }
00709 
00710 static void
00711 gnc_plugin_page_invoice_cmd_paste (GtkAction *action,
00712                                    GncPluginPageInvoice *plugin_page)
00713 {
00714     GncPluginPageInvoicePrivate *priv;
00715 
00716     g_return_if_fail(GNC_IS_PLUGIN_PAGE_INVOICE(plugin_page));
00717 
00718     ENTER("(action %p, plugin_page %p)", action, plugin_page);
00719     priv = GNC_PLUGIN_PAGE_INVOICE_GET_PRIVATE(plugin_page);
00720     gnc_invoice_window_paste_cb(NULL, priv->iw);
00721     LEAVE(" ");
00722 }
00723 
00724 static void
00725 gnc_plugin_page_invoice_cmd_edit (GtkAction *action,
00726                                   GncPluginPageInvoice *plugin_page)
00727 {
00728     GncPluginPageInvoicePrivate *priv;
00729 
00730     g_return_if_fail(GNC_IS_PLUGIN_PAGE_INVOICE(plugin_page));
00731 
00732     ENTER("(action %p, plugin_page %p)", action, plugin_page);
00733     priv = GNC_PLUGIN_PAGE_INVOICE_GET_PRIVATE(plugin_page);
00734     gnc_invoice_window_editCB(NULL, priv->iw);
00735     LEAVE(" ");
00736 }
00737 
00738 static void
00739 gnc_plugin_page_invoice_cmd_duplicateInvoice (GtkAction *action,
00740         GncPluginPageInvoice *plugin_page)
00741 {
00742     GncPluginPageInvoicePrivate *priv;
00743 
00744     g_return_if_fail(GNC_IS_PLUGIN_PAGE_INVOICE(plugin_page));
00745 
00746     ENTER("(action %p, plugin_page %p)", action, plugin_page);
00747     priv = GNC_PLUGIN_PAGE_INVOICE_GET_PRIVATE(plugin_page);
00748     gnc_invoice_window_duplicateInvoiceCB(NULL, priv->iw);
00749     LEAVE(" ");
00750 }
00751 
00752 static void
00753 gnc_plugin_page_invoice_cmd_post (GtkAction *action,
00754                                   GncPluginPageInvoice *plugin_page)
00755 {
00756     GncPluginPageInvoicePrivate *priv;
00757 
00758     g_return_if_fail(GNC_IS_PLUGIN_PAGE_INVOICE(plugin_page));
00759 
00760     ENTER("(action %p, plugin_page %p)", action, plugin_page);
00761     priv = GNC_PLUGIN_PAGE_INVOICE_GET_PRIVATE(plugin_page);
00762     gnc_invoice_window_postCB(NULL, priv->iw);
00763     LEAVE(" ");
00764 }
00765 
00766 static void
00767 gnc_plugin_page_invoice_cmd_unpost (GtkAction *action,
00768                                     GncPluginPageInvoice *plugin_page)
00769 {
00770     GncPluginPageInvoicePrivate *priv;
00771 
00772     g_return_if_fail(GNC_IS_PLUGIN_PAGE_INVOICE(plugin_page));
00773 
00774     ENTER("(action %p, plugin_page %p)", action, plugin_page);
00775     priv = GNC_PLUGIN_PAGE_INVOICE_GET_PRIVATE(plugin_page);
00776     gnc_invoice_window_unpostCB(NULL, priv->iw);
00777     LEAVE(" ");
00778 }
00779 
00780 static void
00781 gnc_plugin_page_invoice_cmd_sort_changed (GtkAction *action,
00782         GtkRadioAction *current,
00783         GncPluginPageInvoice *plugin_page)
00784 {
00785     GncPluginPageInvoicePrivate *priv;
00786     invoice_sort_type_t value;
00787 
00788     ENTER("(action %p, radio action %p, plugin_page %p)",
00789           action, current, plugin_page);
00790     LEAVE("g_return testing...");
00791 
00792     g_return_if_fail(GTK_IS_ACTION(action));
00793     g_return_if_fail(GTK_IS_RADIO_ACTION(current));
00794     g_return_if_fail(GNC_IS_PLUGIN_PAGE_INVOICE(plugin_page));
00795 
00796     ENTER("...passed (action %p, radio action %p, plugin_page %p)",
00797           action, current, plugin_page);
00798     priv = GNC_PLUGIN_PAGE_INVOICE_GET_PRIVATE(plugin_page);
00799     value = gtk_radio_action_get_current_value(current);
00800     gnc_invoice_window_sort (priv->iw, value);
00801     LEAVE(" ");
00802 }
00803 
00804 
00805 static void
00806 gnc_plugin_page_invoice_cmd_enter (GtkAction *action,
00807                                    GncPluginPageInvoice *plugin_page)
00808 {
00809     GncPluginPageInvoicePrivate *priv;
00810 
00811     g_return_if_fail(GNC_IS_PLUGIN_PAGE_INVOICE(plugin_page));
00812 
00813     ENTER("(action %p, plugin_page %p)", action, plugin_page);
00814     priv = GNC_PLUGIN_PAGE_INVOICE_GET_PRIVATE(plugin_page);
00815     gnc_invoice_window_recordCB(NULL, priv->iw);
00816     LEAVE(" ");
00817 }
00818 
00819 static void
00820 gnc_plugin_page_invoice_cmd_cancel (GtkAction *action,
00821                                     GncPluginPageInvoice *plugin_page)
00822 {
00823     GncPluginPageInvoicePrivate *priv;
00824 
00825     g_return_if_fail(GNC_IS_PLUGIN_PAGE_INVOICE(plugin_page));
00826 
00827     ENTER("(action %p, plugin_page %p)", action, plugin_page);
00828     priv = GNC_PLUGIN_PAGE_INVOICE_GET_PRIVATE(plugin_page);
00829     gnc_invoice_window_cancelCB(NULL, priv->iw);
00830     LEAVE(" ");
00831 }
00832 
00833 static void
00834 gnc_plugin_page_invoice_cmd_delete (GtkAction *action,
00835                                     GncPluginPageInvoice *plugin_page)
00836 {
00837     GncPluginPageInvoicePrivate *priv;
00838 
00839     g_return_if_fail(GNC_IS_PLUGIN_PAGE_INVOICE(plugin_page));
00840 
00841     ENTER("(action %p, plugin_page %p)", action, plugin_page);
00842     priv = GNC_PLUGIN_PAGE_INVOICE_GET_PRIVATE(plugin_page);
00843     gnc_invoice_window_deleteCB(NULL, priv->iw);
00844     LEAVE(" ");
00845 }
00846 
00847 static void
00848 gnc_plugin_page_invoice_cmd_blank (GtkAction *action,
00849                                    GncPluginPageInvoice *plugin_page)
00850 {
00851     GncPluginPageInvoicePrivate *priv;
00852 
00853     g_return_if_fail(GNC_IS_PLUGIN_PAGE_INVOICE(plugin_page));
00854 
00855     ENTER("(action %p, plugin_page %p)", action, plugin_page);
00856     priv = GNC_PLUGIN_PAGE_INVOICE_GET_PRIVATE(plugin_page);
00857     gnc_invoice_window_blankCB(NULL, priv->iw);
00858     LEAVE(" ");
00859 }
00860 
00861 static void
00862 gnc_plugin_page_invoice_cmd_duplicateEntry (GtkAction *action,
00863         GncPluginPageInvoice *plugin_page)
00864 {
00865     GncPluginPageInvoicePrivate *priv;
00866 
00867     g_return_if_fail(GNC_IS_PLUGIN_PAGE_INVOICE(plugin_page));
00868 
00869     ENTER("(action %p, plugin_page %p)", action, plugin_page);
00870     priv = GNC_PLUGIN_PAGE_INVOICE_GET_PRIVATE(plugin_page);
00871     gnc_invoice_window_duplicateCB(NULL, priv->iw);
00872     LEAVE(" ");
00873 }
00874 
00875 static void
00876 gnc_plugin_page_invoice_cmd_entryUp (GtkAction *action,
00877                                      GncPluginPageInvoice *plugin_page)
00878 {
00879     GncPluginPageInvoicePrivate *priv;
00880     g_return_if_fail(GNC_IS_PLUGIN_PAGE_INVOICE(plugin_page));
00881 
00882     ENTER("(action %p, plugin_page %p)", action, plugin_page);
00883     priv = GNC_PLUGIN_PAGE_INVOICE_GET_PRIVATE(plugin_page);
00884     gnc_invoice_window_entryUpCB(NULL, priv->iw);
00885     LEAVE(" ");
00886 }
00887 
00888 static void
00889 gnc_plugin_page_invoice_cmd_entryDown (GtkAction *action,
00890                                        GncPluginPageInvoice *plugin_page)
00891 {
00892     GncPluginPageInvoicePrivate *priv;
00893     g_return_if_fail(GNC_IS_PLUGIN_PAGE_INVOICE(plugin_page));
00894 
00895     ENTER("(action %p, plugin_page %p)", action, plugin_page);
00896     priv = GNC_PLUGIN_PAGE_INVOICE_GET_PRIVATE(plugin_page);
00897     gnc_invoice_window_entryDownCB(NULL, priv->iw);
00898     LEAVE(" ");
00899 }
00900 
00901 static void
00902 gnc_plugin_page_invoice_cmd_pay_invoice (GtkAction *action,
00903         GncPluginPageInvoice *plugin_page)
00904 {
00905     GncPluginPageInvoicePrivate *priv;
00906 
00907     g_return_if_fail(GNC_IS_PLUGIN_PAGE_INVOICE(plugin_page));
00908 
00909     ENTER("(action %p, plugin_page %p)", action, plugin_page);
00910     priv = GNC_PLUGIN_PAGE_INVOICE_GET_PRIVATE(plugin_page);
00911     gnc_invoice_window_payment_cb(NULL, priv->iw);
00912     LEAVE(" ");
00913 }
00914 
00915 static void
00916 gnc_plugin_page_invoice_cmd_company_report (GtkAction *action,
00917         GncPluginPageInvoice *plugin_page)
00918 {
00919     GncPluginPageInvoicePrivate *priv;
00920 
00921     g_return_if_fail(GNC_IS_PLUGIN_PAGE_INVOICE(plugin_page));
00922 
00923     ENTER("(action %p, plugin_page %p)", action, plugin_page);
00924     priv = GNC_PLUGIN_PAGE_INVOICE_GET_PRIVATE(plugin_page);
00925     gnc_invoice_window_report_owner_cb(NULL, priv->iw);
00926     LEAVE(" ");
00927 }
00928 
00929 /************************************************************/
00930 /*                    Auxiliary functions                   */
00931 /************************************************************/
00932 
00933 static void
00934 gnc_plugin_page_redraw_help_cb (GnucashRegister *g_reg,
00935                                 GncPluginPageInvoice *invoice_page)
00936 {
00937     GncPluginPageInvoicePrivate *priv;
00938     GncWindow *window;
00939     const char *status;
00940     char *help;
00941 
00942     g_return_if_fail(GNC_IS_PLUGIN_PAGE_INVOICE(invoice_page));
00943 
00944     window = GNC_WINDOW(GNC_PLUGIN_PAGE(invoice_page)->window);
00945 
00946     /* Get the text from the ledger */
00947     priv = GNC_PLUGIN_PAGE_INVOICE_GET_PRIVATE(invoice_page);
00948     help = gnc_invoice_get_help(priv->iw);
00949     status = help ? help : g_strdup("");
00950     gnc_window_set_status(window, GNC_PLUGIN_PAGE(invoice_page), status);
00951     g_free(help);
00952 }
00953 
00954 
00955 void
00956 gnc_plugin_page_invoice_update_title (GncPluginPage *plugin_page)
00957 {
00958     GncPluginPageInvoice *page;
00959     GncPluginPageInvoicePrivate *priv;
00960     gchar *title;
00961 
00962     g_return_if_fail(GNC_IS_PLUGIN_PAGE_INVOICE(plugin_page));
00963 
00964     page = GNC_PLUGIN_PAGE_INVOICE(plugin_page);
00965     priv = GNC_PLUGIN_PAGE_INVOICE_GET_PRIVATE(page);
00966     title = gnc_invoice_get_title(priv->iw);
00967     main_window_update_page_name(plugin_page, title);
00968     g_free(title);
00969 }
00970 
00971 static void
00972 gnc_plugin_page_invoice_refresh_cb (GHashTable *changes, gpointer user_data)
00973 {
00974     GncPluginPageInvoice *page = user_data;
00975     GncPluginPageInvoicePrivate *priv;
00976     GtkWidget *reg;
00977 
00978     g_return_if_fail(GNC_IS_PLUGIN_PAGE_INVOICE(page));
00979 
00980     /* We're only looking for forced updates here. */
00981     if (changes)
00982         return;
00983 
00984     priv = GNC_PLUGIN_PAGE_INVOICE_GET_PRIVATE(page);
00985     reg = gnc_invoice_get_register(priv->iw);
00986     gnucash_register_refresh_from_gconf(GNUCASH_REGISTER(reg));
00987     gtk_widget_queue_draw(priv->widget);
00988 }
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Defines