|
GnuCash 2.4.99
|
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 }
1.7.4