From 3c39fa12ef2bad8ba21a273f6bb2fd5c024c42b0 Mon Sep 17 00:00:00 2001 From: David Hampton Date: Mon, 29 Sep 2003 03:06:33 +0000 Subject: [PATCH] Derive the GncPluginPage widget from a GObject instead of a GInterface. git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/branches/gnucash-gnome2-dev@9429 57a11ea4-9604-0410-9ed3-97b8803252fd --- ChangeLog | 8 + src/gnome/gnc-main-window.c | 17 +- src/gnome/gnc-plugin-page-account-tree.c | 103 +++-------- src/gnome/gnc-plugin-page-account-tree.h | 8 +- src/gnome/gnc-plugin-page-register.c | 123 +++++-------- src/gnome/gnc-plugin-page-register.h | 8 +- src/gnome/gnc-plugin-page.c | 221 +++++++++++------------ src/gnome/gnc-plugin-page.h | 47 +++-- 8 files changed, 220 insertions(+), 315 deletions(-) diff --git a/ChangeLog b/ChangeLog index 039c86970f..70bc503534 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2003-09-28 David Hampton + + * src/gnome/gnc-main-window.c: + * src/gnome/gnc-plugin-page-account-tree.[ch]: + * src/gnome/gnc-plugin-page-register.[ch]: + * src/gnome/gnc-plugin-page.[ch]: Derive the GncPluginPage widget + from a GObject instead of a GInterface. + 2003-09-27 David Hampton * lib/egg/egg-action-group.[ch]: diff --git a/src/gnome/gnc-main-window.c b/src/gnome/gnc-main-window.c index cccd0c42e4..808014116a 100644 --- a/src/gnome/gnc-main-window.c +++ b/src/gnome/gnc-main-window.c @@ -2,8 +2,8 @@ * gnc-main-window.c -- GtkWindow which represents the * GnuCash main window. * - * Copyright (C) 2003 Jan Arne Petersen - * Author: Jan Arne Petersen + * Copyright (C) 2003 Jan Arne Petersen + * Copyright (C) 2003 David Hampton * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as @@ -304,7 +304,6 @@ gnc_main_window_open_page (GncMainWindow *window, GtkWidget *label_box; GtkWidget *label; const gchar *icon; - gchar *tab_name; GtkWidget *image; GtkNotebook *notebook; @@ -313,15 +312,13 @@ gnc_main_window_open_page (GncMainWindow *window, g_return_if_fail (GNC_IS_MAIN_WINDOW (window)); g_return_if_fail (GNC_IS_PLUGIN_PAGE (page)); - gnc_plugin_page_set_window (page, GTK_WIDGET(window)); + page->window = GTK_WIDGET(window); child = gnc_plugin_page_create_widget (page); g_object_set_data (G_OBJECT (child), "page-plugin", page); - icon = gnc_plugin_page_get_tab_icon (page); - tab_name = gnc_plugin_page_get_tab_name (page); - label = gtk_label_new (tab_name); + icon = GNC_PLUGIN_PAGE_GET_CLASS(page)->tab_icon; + label = gtk_label_new (page->tab_name); gtk_widget_show (label); - g_free(tab_name); if (icon != NULL) { /* FIXME */ @@ -715,8 +712,8 @@ gnc_main_window_cmd_file_open_new_window (EggAction *action, GncMainWindow *wind new_window = gnc_main_window_new (); if (window->priv->current_page != NULL) { - name = gnc_plugin_page_get_plugin_name (window->priv->current_page); - uri = gnc_plugin_page_get_uri (window->priv->current_page); + name = GNC_PLUGIN_PAGE_GET_CLASS (window->priv->current_page)->plugin_name; + uri = window->priv->current_page->uri; plugin = gnc_plugin_manager_get_plugin (gnc_plugin_manager_get (), name); page = gnc_plugin_create_page (plugin, uri); diff --git a/src/gnome/gnc-plugin-page-account-tree.c b/src/gnome/gnc-plugin-page-account-tree.c index 9e0115859a..c06212681b 100644 --- a/src/gnome/gnc-plugin-page-account-tree.c +++ b/src/gnome/gnc-plugin-page-account-tree.c @@ -1,8 +1,8 @@ /* * gnc-plugin-page-account-tree.c -- * - * Copyright (C) 2003 Jan Arne Petersen - * Author: Jan Arne Petersen + * Copyright (C) 2003 Jan Arne Petersen + * Copyright (C) 2003 David Hampton * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as @@ -69,17 +69,10 @@ static void gnc_plugin_page_account_tree_finalize (GObject *object); static Account *gnc_plugin_page_account_tree_get_current_account (GncPluginPageAccountTree *page); -static void gnc_plugin_page_account_tree_plugin_page_init (GncPluginPageIface *iface); - static GtkWidget *gnc_plugin_page_account_tree_create_widget (GncPluginPage *plugin_page); static void gnc_plugin_page_account_tree_destroy_widget (GncPluginPage *plugin_page); static void gnc_plugin_page_account_tree_merge_actions (GncPluginPage *plugin_page, EggMenuMerge *ui_merge); static void gnc_plugin_page_account_tree_unmerge_actions (GncPluginPage *plugin_page, EggMenuMerge *ui_merge); -static gchar *gnc_plugin_page_account_tree_get_title (GncPluginPage *plugin_page); -static gchar *gnc_plugin_page_account_tree_get_tab_name (GncPluginPage *plugin_page); -static G_CONST_RETURN gchar *gnc_plugin_page_account_tree_get_tab_icon (GncPluginPage *plugin_page); -static G_CONST_RETURN gchar *gnc_plugin_page_account_tree_get_plugin_name (GncPluginPage *plugin_page); -static G_CONST_RETURN gchar *gnc_plugin_page_account_tree_get_uri (GncPluginPage *plugin_page); /* Callbacks */ static gboolean gnc_plugin_page_account_tree_button_press_cb (GtkWidget *widget, @@ -212,19 +205,9 @@ gnc_plugin_page_account_tree_get_type (void) (GInstanceInitFunc) gnc_plugin_page_account_tree_init }; - static const GInterfaceInfo plugin_page_info = { - (GInterfaceInitFunc) gnc_plugin_page_account_tree_plugin_page_init, - NULL, - NULL - }; - - gnc_plugin_page_account_tree_type = g_type_register_static (G_TYPE_OBJECT, + gnc_plugin_page_account_tree_type = g_type_register_static (GNC_TYPE_PLUGIN_PAGE, "GncPluginPageAccountTree", &our_info, 0); - - g_type_add_interface_static (gnc_plugin_page_account_tree_type, - GNC_TYPE_PLUGIN_PAGE, - &plugin_page_info); } return gnc_plugin_page_account_tree_type; @@ -247,10 +230,18 @@ static void gnc_plugin_page_account_tree_class_init (GncPluginPageAccountTreeClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); + GncPluginPageClass *gnc_plugin_class = GNC_PLUGIN_PAGE_CLASS(klass); parent_class = g_type_class_peek_parent (klass); object_class->finalize = gnc_plugin_page_account_tree_finalize; + + gnc_plugin_class->tab_icon = GNC_STOCK_ACCOUNT; + gnc_plugin_class->plugin_name = GNC_PLUGIN_ACCOUNT_TREE_NAME; + gnc_plugin_class->create_widget = gnc_plugin_page_account_tree_create_widget; + gnc_plugin_class->destroy_widget = gnc_plugin_page_account_tree_destroy_widget; + gnc_plugin_class->merge_actions = gnc_plugin_page_account_tree_merge_actions; + gnc_plugin_class->unmerge_actions = gnc_plugin_page_account_tree_unmerge_actions; } /* DRH - Suggest this be added to libegg */ @@ -302,6 +293,7 @@ gnc_plugin_page_account_tree_init (GncPluginPageAccountTree *plugin_page) { EggActionGroup *action_group; GncPluginPageAccountTreePrivate *priv; + GncPluginPage *parent; const gchar *url = NULL; int options_id; SCM find_options; @@ -311,6 +303,12 @@ gnc_plugin_page_account_tree_init (GncPluginPageAccountTree *plugin_page) ENTER("page %p", plugin_page); priv = plugin_page->priv = g_new0 (GncPluginPageAccountTreePrivate, 1); + /* Init parent declared variables */ + parent = GNC_PLUGIN_PAGE(plugin_page); + parent->title = g_strdup(_("Accounts")); + parent->tab_name = g_strdup(_("Accounts")); + parent->uri = g_strdup("default:"); + /* Create menu and toolbar information */ action_group = egg_action_group_new ("GncPluginPageAccountTreeActions"); priv->action_group = action_group; @@ -429,32 +427,15 @@ gnc_plugin_page_account_tree_get_current_account (GncPluginPageAccountTree *page } -/* Virtual table */ -static void -gnc_plugin_page_account_tree_plugin_page_init (GncPluginPageIface *iface) -{ - ENTER(" "); - iface->create_widget = gnc_plugin_page_account_tree_create_widget; - iface->destroy_widget = gnc_plugin_page_account_tree_destroy_widget; - iface->merge_actions = gnc_plugin_page_account_tree_merge_actions; - iface->unmerge_actions = gnc_plugin_page_account_tree_unmerge_actions; - iface->get_title = gnc_plugin_page_account_tree_get_title; - iface->get_tab_name = gnc_plugin_page_account_tree_get_tab_name; - iface->get_tab_icon = gnc_plugin_page_account_tree_get_tab_icon; - iface->get_plugin_name = gnc_plugin_page_account_tree_get_plugin_name; - iface->get_uri = gnc_plugin_page_account_tree_get_uri; - LEAVE(" "); -} +/* Virtual Functions */ static void gnc_plugin_page_account_tree_close_cb (gpointer user_data) { - GncPluginPageAccountTree *page; - GtkWidget *window; + GncPluginPage *page; - page = GNC_PLUGIN_PAGE_ACCOUNT_TREE(user_data); - window = gnc_plugin_page_get_window(GNC_PLUGIN_PAGE (page)); - gnc_main_window_close_page (GNC_MAIN_WINDOW(window), GNC_PLUGIN_PAGE(page)); + page = GNC_PLUGIN_PAGE(user_data); + gnc_main_window_close_page (GNC_MAIN_WINDOW(page->window), page); } static GtkWidget * @@ -581,36 +562,6 @@ gnc_plugin_page_account_tree_unmerge_actions (GncPluginPage *plugin_page, LEAVE(" "); } -static gchar * -gnc_plugin_page_account_tree_get_title (GncPluginPage *plugin_page) -{ - return g_strdup(_("Accounts")); -} - -static gchar * -gnc_plugin_page_account_tree_get_tab_name (GncPluginPage *plugin_page) -{ - return g_strdup(_("Accounts")); -} - -static G_CONST_RETURN gchar * -gnc_plugin_page_account_tree_get_tab_icon (GncPluginPage *plugin_page) -{ - return GNC_STOCK_ACCOUNT; -} - -static G_CONST_RETURN gchar * -gnc_plugin_page_account_tree_get_plugin_name (GncPluginPage *plugin_page) -{ - return GNC_PLUGIN_ACCOUNT_TREE_NAME; -} - -static G_CONST_RETURN gchar * -gnc_plugin_page_account_tree_get_uri (GncPluginPage *plugin_page) -{ - return "default:"; -} - /* Callbacks */ static gboolean gnc_plugin_page_account_tree_button_press_cb (GtkWidget *widget, @@ -677,7 +628,8 @@ gnc_plugin_page_account_tree_cmd_new_account (EggAction *action, GncPluginPageAc } static void -gnc_plugin_page_account_tree_cmd_open_account (EggAction *action, GncPluginPageAccountTree *page) +gnc_plugin_page_account_tree_cmd_open_account (EggAction *action, + GncPluginPageAccountTree *page) { GtkWidget *window; GncPluginPage *new_page; @@ -688,13 +640,14 @@ gnc_plugin_page_account_tree_cmd_open_account (EggAction *action, GncPluginPageA if (account == NULL) return; - window = gnc_plugin_page_get_window(GNC_PLUGIN_PAGE (page)); + window = GNC_PLUGIN_PAGE (page)->window; new_page = gnc_plugin_page_register_new (account, FALSE); gnc_main_window_open_page (GNC_MAIN_WINDOW(window), new_page); } static void -gnc_plugin_page_account_tree_cmd_open_subaccounts (EggAction *action, GncPluginPageAccountTree *page) +gnc_plugin_page_account_tree_cmd_open_subaccounts (EggAction *action, + GncPluginPageAccountTree *page) { GtkWidget *window; GncPluginPage *new_page; @@ -705,7 +658,7 @@ gnc_plugin_page_account_tree_cmd_open_subaccounts (EggAction *action, GncPluginP if (account == NULL) return; - window = gnc_plugin_page_get_window(GNC_PLUGIN_PAGE (page)); + window = GNC_PLUGIN_PAGE (page)->window; new_page = gnc_plugin_page_register_new (account, TRUE); gnc_main_window_open_page (GNC_MAIN_WINDOW(window), new_page); } diff --git a/src/gnome/gnc-plugin-page-account-tree.h b/src/gnome/gnc-plugin-page-account-tree.h index 54905e4075..527cc50d40 100644 --- a/src/gnome/gnc-plugin-page-account-tree.h +++ b/src/gnome/gnc-plugin-page-account-tree.h @@ -1,8 +1,8 @@ /* * gnc-plugin_page-account-tree.h -- * - * Copyright (C) 2003 Jan Arne Petersen - * Author: Jan Arne Petersen + * Copyright (C) 2003 Jan Arne Petersen + * Copyright (C) 2003 David Hampton * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as @@ -45,13 +45,13 @@ G_BEGIN_DECLS typedef struct GncPluginPageAccountTreePrivate GncPluginPageAccountTreePrivate; typedef struct { - GObject parent; + GncPluginPage parent; GncPluginPageAccountTreePrivate *priv; } GncPluginPageAccountTree; typedef struct { - GObjectClass parent; + GncPluginPageClass parent; } GncPluginPageAccountTreeClass; /* function prototypes */ diff --git a/src/gnome/gnc-plugin-page-register.c b/src/gnome/gnc-plugin-page-register.c index 899769a527..fca6b11066 100644 --- a/src/gnome/gnc-plugin-page-register.c +++ b/src/gnome/gnc-plugin-page-register.c @@ -1,8 +1,8 @@ /* * gnc-plugin-page-register.c -- * - * Copyright (C) 2003 Jan Arne Petersen - * Author: Jan Arne Petersen + * Copyright (C) 2003 Jan Arne Petersen + * Copyright (C) 2003 David Hampton * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as @@ -43,17 +43,12 @@ static void gnc_plugin_page_register_finalize (GObject *object); /* static Account *gnc_plugin_page_register_get_current_account (GncPluginPageRegister *page); */ -static void gnc_plugin_page_register_plugin_page_init (GncPluginPageIface *iface); - static GtkWidget *gnc_plugin_page_register_create_widget (GncPluginPage *plugin_page); static void gnc_plugin_page_register_destroy_widget (GncPluginPage *plugin_page); static void gnc_plugin_page_register_merge_actions (GncPluginPage *plugin_page, EggMenuMerge *ui_merge); static void gnc_plugin_page_register_unmerge_actions (GncPluginPage *plugin_page, EggMenuMerge *ui_merge); -static gchar *gnc_plugin_page_register_get_title (GncPluginPage *plugin_page); + static gchar *gnc_plugin_page_register_get_tab_name (GncPluginPage *plugin_page); -static G_CONST_RETURN gchar *gnc_plugin_page_register_get_tab_icon (GncPluginPage *plugin_page); -static G_CONST_RETURN gchar *gnc_plugin_page_register_get_plugin_name (GncPluginPage *plugin_page); -static G_CONST_RETURN gchar *gnc_plugin_page_register_get_uri (GncPluginPage *plugin_page); /* Callbacks */ #if 0 @@ -133,76 +128,74 @@ gnc_plugin_page_register_get_type (void) (GInstanceInitFunc) gnc_plugin_page_register_init }; - static const GInterfaceInfo plugin_page_info = { - (GInterfaceInitFunc) gnc_plugin_page_register_plugin_page_init, - NULL, - NULL - }; - - gnc_plugin_page_register_type = g_type_register_static (G_TYPE_OBJECT, - "GncPluginPageRegister", - &our_info, 0); - - g_type_add_interface_static (gnc_plugin_page_register_type, - GNC_TYPE_PLUGIN_PAGE, - &plugin_page_info); + gnc_plugin_page_register_type = g_type_register_static (GNC_TYPE_PLUGIN_PAGE, + "GncPluginPageRegister", + &our_info, 0); } return gnc_plugin_page_register_type; } +static GncPluginPage * +gnc_plugin_page_register_new_common (GNCLedgerDisplay *ld) +{ + GncPluginPageRegister *register_page; + GncPluginPage *plugin_page; + + register_page = g_object_new (GNC_TYPE_PLUGIN_PAGE_REGISTER, NULL); + register_page->priv->ld = ld; + + plugin_page = GNC_PLUGIN_PAGE(register_page); + plugin_page->title = gnc_plugin_page_register_get_tab_name(plugin_page); + plugin_page->tab_name = gnc_plugin_page_register_get_tab_name(plugin_page); + + return plugin_page; +} + GncPluginPage * gnc_plugin_page_register_new (Account *account, gboolean subaccounts) { - GncPluginPageRegister *plugin_page; GNCLedgerDisplay *ld; - plugin_page = g_object_new (GNC_TYPE_PLUGIN_PAGE_REGISTER, - NULL); - if (subaccounts) ld = gnc_ledger_display_subaccounts (account); else ld = gnc_ledger_display_simple (account); - plugin_page->priv->ld = ld; - - return GNC_PLUGIN_PAGE (plugin_page); + + return gnc_plugin_page_register_new_common(ld); } GncPluginPage * gnc_plugin_page_register_new_gl (void) { - GncPluginPageRegister *plugin_page; GNCLedgerDisplay *ld; - plugin_page = g_object_new (GNC_TYPE_PLUGIN_PAGE_REGISTER, - NULL); - ld = gnc_ledger_display_gl (); - plugin_page->priv->ld = ld; - - return GNC_PLUGIN_PAGE (plugin_page); + return gnc_plugin_page_register_new_common(ld); } GncPluginPage * gnc_plugin_page_register_new_ledger (GNCLedgerDisplay *ledger) { - GncPluginPageRegister *plugin_page; - - plugin_page = g_object_new (GNC_TYPE_PLUGIN_PAGE_REGISTER, NULL); - plugin_page->priv->ld = ledger; - - return GNC_PLUGIN_PAGE (plugin_page); + return gnc_plugin_page_register_new_common(ledger); } static void gnc_plugin_page_register_class_init (GncPluginPageRegisterClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); + GncPluginPageClass *gnc_plugin_class = GNC_PLUGIN_PAGE_CLASS(klass); parent_class = g_type_class_peek_parent (klass); object_class->finalize = gnc_plugin_page_register_finalize; + + gnc_plugin_class->tab_icon = GNC_STOCK_ACCOUNT; + gnc_plugin_class->plugin_name = GNC_PLUGIN_REGISTER_NAME; + gnc_plugin_class->create_widget = gnc_plugin_page_register_create_widget; + gnc_plugin_class->destroy_widget = gnc_plugin_page_register_destroy_widget; + gnc_plugin_class->merge_actions = gnc_plugin_page_register_merge_actions; + gnc_plugin_class->unmerge_actions = gnc_plugin_page_register_unmerge_actions; } /* DRH - Suggest this be added to libegg */ @@ -236,11 +229,18 @@ static void gnc_plugin_page_register_init (GncPluginPageRegister *plugin_page) { GncPluginPageRegisterPrivate *priv; + GncPluginPage *parent; EggActionGroup *action_group; priv = g_new0 (GncPluginPageRegisterPrivate, 1); plugin_page->priv = priv; + /* Init parent declared variables */ + parent = GNC_PLUGIN_PAGE(plugin_page); + parent->title = g_strdup(_("General Ledger")); + parent->tab_name = g_strdup(_("General Ledger")); + parent->uri = g_strdup("default:"); + /* Create menu and toolbar information */ action_group = egg_action_group_new ("GncPluginPageRegisterActions"); priv->action_group = action_group; @@ -281,20 +281,7 @@ gnc_plugin_page_register_get_current_account (GncPluginPageRegister *page) } */ -/* Virtual table */ -static void -gnc_plugin_page_register_plugin_page_init (GncPluginPageIface *iface) -{ - iface->create_widget = gnc_plugin_page_register_create_widget; - iface->destroy_widget = gnc_plugin_page_register_destroy_widget; - iface->merge_actions = gnc_plugin_page_register_merge_actions; - iface->unmerge_actions = gnc_plugin_page_register_unmerge_actions; - iface->get_title = gnc_plugin_page_register_get_title; - iface->get_tab_name = gnc_plugin_page_register_get_tab_name; - iface->get_tab_icon = gnc_plugin_page_register_get_tab_icon; - iface->get_plugin_name = gnc_plugin_page_register_get_plugin_name; - iface->get_uri = gnc_plugin_page_register_get_uri; -} +/* Virtual Functions */ static GtkWidget * gnc_plugin_page_register_create_widget (GncPluginPage *plugin_page) @@ -386,14 +373,6 @@ gnc_plugin_page_register_unmerge_actions (GncPluginPage *plugin_page, plugin_page_register->priv->ui_merge = NULL; } - -static gchar * -gnc_plugin_page_register_get_title (GncPluginPage *plugin_page) -{ - return g_strdup(_("General Ledger")); -} - - static gchar * gnc_plugin_page_register_get_tab_name (GncPluginPage *plugin_page) { @@ -436,24 +415,6 @@ gnc_plugin_page_register_get_tab_name (GncPluginPage *plugin_page) return g_strdup(_("unknown")); } -static G_CONST_RETURN gchar * -gnc_plugin_page_register_get_tab_icon (GncPluginPage *plugin_page) -{ - return GNC_STOCK_ACCOUNT; -} - -static G_CONST_RETURN gchar * -gnc_plugin_page_register_get_plugin_name (GncPluginPage *plugin_page) -{ - return GNC_PLUGIN_REGISTER_NAME; -} - -static G_CONST_RETURN gchar * -gnc_plugin_page_register_get_uri (GncPluginPage *plugin_page) -{ - return "default:"; -} - /* Callbacks */ #if 0 static gboolean diff --git a/src/gnome/gnc-plugin-page-register.h b/src/gnome/gnc-plugin-page-register.h index 059fb6b01c..0167efe1c7 100644 --- a/src/gnome/gnc-plugin-page-register.h +++ b/src/gnome/gnc-plugin-page-register.h @@ -1,8 +1,8 @@ /* * gnc-plugin-page-register.h -- * - * Copyright (C) 2003 Jan Arne Petersen - * Author: Jan Arne Petersen + * Copyright (C) 2003 Jan Arne Petersen + * Copyright (C) 2003 David Hampton * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as @@ -47,13 +47,13 @@ G_BEGIN_DECLS typedef struct GncPluginPageRegisterPrivate GncPluginPageRegisterPrivate; typedef struct { - GObject parent; + GncPluginPage parent; GncPluginPageRegisterPrivate *priv; } GncPluginPageRegister; typedef struct { - GObjectClass parent; + GncPluginPageClass parent; } GncPluginPageRegisterClass; /* function prototypes */ diff --git a/src/gnome/gnc-plugin-page.c b/src/gnome/gnc-plugin-page.c index 5171ea0083..7c3229babe 100644 --- a/src/gnome/gnc-plugin-page.c +++ b/src/gnome/gnc-plugin-page.c @@ -26,7 +26,11 @@ #include "gnc-plugin-page.h" -static void gnc_plugin_page_base_init (gpointer klass); +static gpointer parent_class = NULL; + +static void gnc_plugin_page_class_init (GncPluginPageClass *klass); +static void gnc_plugin_page_init (GncPluginPage *plugin_page); +static void gnc_plugin_page_finalize (GObject *object); enum { INSERTED, @@ -45,21 +49,21 @@ gnc_plugin_page_get_type (void) if (gnc_plugin_page_type == 0) { static const GTypeInfo our_info = { - sizeof (GncPluginPageIface), - gnc_plugin_page_base_init, - NULL, - NULL, - NULL, - NULL, - 0, - 0, - NULL + + sizeof (GncPluginPageClass), + NULL, /* base_init */ + NULL, /* base_finalize */ + (GClassInitFunc) gnc_plugin_page_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GncPluginPage), + 0, /* n_preallocs */ + (GInstanceInitFunc) gnc_plugin_page_init, }; - gnc_plugin_page_type = g_type_register_static (G_TYPE_INTERFACE, + gnc_plugin_page_type = g_type_register_static (G_TYPE_OBJECT, "GncPluginPage", &our_info, 0); - g_type_interface_add_prerequisite (gnc_plugin_page_type, G_TYPE_OBJECT); } return gnc_plugin_page_type; @@ -68,12 +72,16 @@ gnc_plugin_page_get_type (void) GtkWidget * gnc_plugin_page_create_widget (GncPluginPage *plugin_page) { + GncPluginPageClass *klass; GtkWidget *widget; g_return_val_if_fail (GNC_IS_PLUGIN_PAGE (plugin_page), NULL); - g_return_val_if_fail (GNC_PLUGIN_PAGE_GET_IFACE (plugin_page)->create_widget != NULL, NULL); - widget = GNC_PLUGIN_PAGE_GET_IFACE (plugin_page)->create_widget (plugin_page); + klass = GNC_PLUGIN_PAGE_GET_CLASS (plugin_page); + g_return_val_if_fail (klass != NULL, NULL); + g_return_val_if_fail (klass->create_widget != NULL, NULL); + + widget = klass->create_widget (plugin_page); /* * If there is a destroy function, add a ref so that the @@ -81,7 +89,7 @@ gnc_plugin_page_create_widget (GncPluginPage *plugin_page) * Otherwise it will be destroyed when it is removed from the * main notebook for the window. */ - if (GNC_PLUGIN_PAGE_GET_IFACE (plugin_page)->destroy_widget) + if (klass->destroy_widget) g_object_ref(widget); return widget; @@ -90,75 +98,45 @@ gnc_plugin_page_create_widget (GncPluginPage *plugin_page) void gnc_plugin_page_destroy_widget (GncPluginPage *plugin_page) { - g_return_if_fail (GNC_IS_PLUGIN_PAGE (plugin_page)); - g_return_if_fail (GNC_PLUGIN_PAGE_GET_IFACE (plugin_page)->destroy_widget != NULL); + GncPluginPageClass *klass; - return GNC_PLUGIN_PAGE_GET_IFACE (plugin_page)->destroy_widget (plugin_page); + g_return_if_fail (GNC_IS_PLUGIN_PAGE (plugin_page)); + + klass = GNC_PLUGIN_PAGE_GET_CLASS (plugin_page); + g_return_if_fail (klass != NULL); + g_return_if_fail (klass->destroy_widget != NULL); + + return klass->destroy_widget (plugin_page); } void gnc_plugin_page_merge_actions (GncPluginPage *plugin_page, EggMenuMerge *ui_merge) { - g_return_if_fail (GNC_IS_PLUGIN_PAGE (plugin_page)); - g_return_if_fail (GNC_PLUGIN_PAGE_GET_IFACE (plugin_page)->merge_actions != NULL); + GncPluginPageClass *klass; - GNC_PLUGIN_PAGE_GET_IFACE (plugin_page)->merge_actions (plugin_page, ui_merge); + g_return_if_fail (GNC_IS_PLUGIN_PAGE (plugin_page)); + + klass = GNC_PLUGIN_PAGE_GET_CLASS (plugin_page); + g_return_if_fail (klass != NULL); + g_return_if_fail (klass->merge_actions != NULL); + + klass->merge_actions (plugin_page, ui_merge); } void gnc_plugin_page_unmerge_actions (GncPluginPage *plugin_page, EggMenuMerge *ui_merge) { + GncPluginPageClass *klass; + g_return_if_fail (GNC_IS_PLUGIN_PAGE (plugin_page)); - g_return_if_fail (GNC_PLUGIN_PAGE_GET_IFACE (plugin_page)->unmerge_actions != NULL); - GNC_PLUGIN_PAGE_GET_IFACE (plugin_page)->unmerge_actions (plugin_page, ui_merge); -} + klass = GNC_PLUGIN_PAGE_GET_CLASS (plugin_page); + g_return_if_fail (klass != NULL); + g_return_if_fail (klass->unmerge_actions != NULL); -gchar * -gnc_plugin_page_get_title (GncPluginPage *plugin_page) -{ - g_return_val_if_fail (GNC_IS_PLUGIN_PAGE (plugin_page), NULL); - g_return_val_if_fail (GNC_PLUGIN_PAGE_GET_IFACE (plugin_page)->get_title != NULL, NULL); - - return GNC_PLUGIN_PAGE_GET_IFACE (plugin_page)->get_title (plugin_page); -} - -gchar * -gnc_plugin_page_get_tab_name (GncPluginPage *plugin_page) -{ - g_return_val_if_fail (GNC_IS_PLUGIN_PAGE (plugin_page), NULL); - g_return_val_if_fail (GNC_PLUGIN_PAGE_GET_IFACE (plugin_page)->get_tab_name != NULL, NULL); - - return GNC_PLUGIN_PAGE_GET_IFACE (plugin_page)->get_tab_name (plugin_page); -} - -G_CONST_RETURN gchar * -gnc_plugin_page_get_tab_icon (GncPluginPage *plugin_page) -{ - g_return_val_if_fail (GNC_IS_PLUGIN_PAGE (plugin_page), NULL); - g_return_val_if_fail (GNC_PLUGIN_PAGE_GET_IFACE (plugin_page)->get_tab_icon != NULL, NULL); - - return GNC_PLUGIN_PAGE_GET_IFACE (plugin_page)->get_tab_icon (plugin_page); -} - -G_CONST_RETURN gchar * -gnc_plugin_page_get_plugin_name (GncPluginPage *plugin_page) -{ - g_return_val_if_fail (GNC_IS_PLUGIN_PAGE (plugin_page), NULL); - g_return_val_if_fail (GNC_PLUGIN_PAGE_GET_IFACE (plugin_page)->get_plugin_name != NULL, NULL); - - return GNC_PLUGIN_PAGE_GET_IFACE (plugin_page)->get_plugin_name (plugin_page); -} - -G_CONST_RETURN gchar * -gnc_plugin_page_get_uri (GncPluginPage *plugin_page) -{ - g_return_val_if_fail (GNC_IS_PLUGIN_PAGE (plugin_page), NULL); - g_return_val_if_fail (GNC_PLUGIN_PAGE_GET_IFACE (plugin_page)->get_uri != NULL, NULL); - - return GNC_PLUGIN_PAGE_GET_IFACE (plugin_page)->get_uri (plugin_page); + klass->unmerge_actions (plugin_page, ui_merge); } /* Signals */ @@ -194,61 +172,74 @@ gnc_plugin_page_unselected (GncPluginPage *plugin_page) g_signal_emit (G_OBJECT (plugin_page), signals[UNSELECTED], 0); } -GtkWidget * -gnc_plugin_page_get_window (GncPluginPage *plugin_page) +static void +gnc_plugin_page_class_init (GncPluginPageClass *klass) { - g_return_val_if_fail (GNC_IS_PLUGIN_PAGE (plugin_page), NULL); + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - return GNC_PLUGIN_PAGE_GET_IFACE (plugin_page)->window; -} + parent_class = g_type_class_peek_parent (klass); + gobject_class->finalize = gnc_plugin_page_finalize; -void -gnc_plugin_page_set_window (GncPluginPage *plugin_page, GtkWidget *window) -{ - g_return_if_fail (GNC_IS_PLUGIN_PAGE (plugin_page)); + klass->tab_icon = NULL; + klass->plugin_name = NULL; - GNC_PLUGIN_PAGE_GET_IFACE (plugin_page)->window = window; + signals[INSERTED] = g_signal_new ("inserted", + G_OBJECT_CLASS_TYPE (klass), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (GncPluginPageClass, inserted), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, + 0); + signals[REMOVED] = g_signal_new ("removed", + G_OBJECT_CLASS_TYPE (klass), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (GncPluginPageClass, removed), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, + 0); + signals[SELECTED] = g_signal_new ("selected", + G_OBJECT_CLASS_TYPE (klass), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (GncPluginPageClass, inserted), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, + 0); + signals[UNSELECTED] = g_signal_new ("unselected", + G_OBJECT_CLASS_TYPE (klass), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (GncPluginPageClass, removed), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, + 0); } static void -gnc_plugin_page_base_init (gpointer klass) +gnc_plugin_page_init (GncPluginPage *plugin_page) { - static gboolean initialized = FALSE; + plugin_page->title = NULL; + plugin_page->tab_name = NULL; + plugin_page->uri = NULL; - if (!initialized) { - initialized = TRUE; - - signals[INSERTED] = g_signal_new ("inserted", - G_OBJECT_CLASS_TYPE (klass), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (GncPluginPageIface, inserted), - NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, - 0); - signals[REMOVED] = g_signal_new ("removed", - G_OBJECT_CLASS_TYPE (klass), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (GncPluginPageIface, removed), - NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, - 0); - signals[SELECTED] = g_signal_new ("selected", - G_OBJECT_CLASS_TYPE (klass), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (GncPluginPageIface, inserted), - NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, - 0); - signals[UNSELECTED] = g_signal_new ("unselected", - G_OBJECT_CLASS_TYPE (klass), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (GncPluginPageIface, removed), - NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, - 0); - } + plugin_page->window = NULL; +} + +static void +gnc_plugin_page_finalize (GObject *object) +{ + GncPluginPage *page = GNC_PLUGIN_PAGE (object); + + if (page->title) + g_free(page->title); + if (page->tab_name) + g_free(page->tab_name); + if (page->uri) + g_free(page->uri); + + page->window = NULL; // Don't need to free it. + + G_OBJECT_CLASS (parent_class)->finalize (object); } diff --git a/src/gnome/gnc-plugin-page.h b/src/gnome/gnc-plugin-page.h index fb3901a1f5..781d1355b0 100644 --- a/src/gnome/gnc-plugin-page.h +++ b/src/gnome/gnc-plugin-page.h @@ -2,8 +2,8 @@ * gnc-plugin-page.h -- A page, which can be added to the * GnuCash main window. * - * Copyright (C) 2003 Jan Arne Petersen - * Author: Jan Arne Petersen + * Copyright (C) 2003 Jan Arne Petersen + * Copyright (C) 2003 David Hampton * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as @@ -32,16 +32,28 @@ G_BEGIN_DECLS /* type macros */ -#define GNC_TYPE_PLUGIN_PAGE (gnc_plugin_page_get_type ()) -#define GNC_PLUGIN_PAGE(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GNC_TYPE_PLUGIN_PAGE, GncPluginPage)) -#define GNC_IS_PLUGIN_PAGE(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GNC_TYPE_PLUGIN_PAGE)) -#define GNC_PLUGIN_PAGE_GET_IFACE(o) (G_TYPE_INSTANCE_GET_INTERFACE ((o), GNC_TYPE_PLUGIN_PAGE, GncPluginPageIface)) +#define GNC_TYPE_PLUGIN_PAGE (gnc_plugin_page_get_type ()) +#define GNC_PLUGIN_PAGE(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GNC_TYPE_PLUGIN_PAGE, GncPluginPage)) +#define GNC_PLUGIN_PAGE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GNC_TYPE_PLUGIN_PAGE, GncPluginPageClass)) +#define GNC_IS_PLUGIN_PAGE(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GNC_TYPE_PLUGIN_PAGE)) +#define GNC_IS_PLUGIN_PAGE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GNC_TYPE_PLUGIN_PAGE)) +#define GNC_PLUGIN_PAGE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GNC_PLUGIN_PAGE, GncPluginPageClass)) /* typedefs & structures */ -typedef struct GncPluginPage GncPluginPage; /* dummy typedef */ +typedef struct GncPluginPage { + GObject parent; + + gchar *title; + gchar *tab_name; + gchar *uri; + GtkWidget *window; +} GncPluginPage; typedef struct { - GTypeInterface parent; + GObjectClass parent; + + const gchar *tab_icon; + const gchar *plugin_name; /* Signals */ void (* inserted) (GncPluginPage *plugin_page); @@ -55,17 +67,7 @@ typedef struct { void (* merge_actions) (GncPluginPage *plugin_page, EggMenuMerge *merge); void (* unmerge_actions) (GncPluginPage *plugin_page, EggMenuMerge *merge); - - gchar *(* get_title) (GncPluginPage *plugin_page); - gchar *(* get_tab_name) (GncPluginPage *plugin_page); - G_CONST_RETURN gchar *(* get_tab_icon) (GncPluginPage *plugin_page); - - G_CONST_RETURN gchar *(* get_plugin_name) (GncPluginPage *plugin_page); - G_CONST_RETURN gchar *(* get_uri) (GncPluginPage *plugin_page); - - /* Variables */ - GtkWidget *window; -} GncPluginPageIface; +} GncPluginPageClass; /* function prototypes */ GType gnc_plugin_page_get_type (void); @@ -78,13 +80,6 @@ void gnc_plugin_page_merge_actions (GncPluginPage *plugin_pag void gnc_plugin_page_unmerge_actions (GncPluginPage *plugin_page, EggMenuMerge *merge); -gchar *gnc_plugin_page_get_title (GncPluginPage *plugin_page); -gchar *gnc_plugin_page_get_tab_name (GncPluginPage *plugin_page); -G_CONST_RETURN gchar *gnc_plugin_page_get_tab_icon (GncPluginPage *plugin_page); - -G_CONST_RETURN gchar *gnc_plugin_page_get_plugin_name (GncPluginPage *plugin_page); -G_CONST_RETURN gchar *gnc_plugin_page_get_uri (GncPluginPage *plugin_page); - /* Signals */ void gnc_plugin_page_inserted (GncPluginPage *plugin_page); void gnc_plugin_page_removed (GncPluginPage *plugin_page);