r17352 - gnucash/branches/gobject-engine-dev2/src/engine - Convert GncBudget to be a GObject with parameters and private section.

Phil Longstaff plongstaff at cvs.gnucash.org
Sun Jul 20 15:12:44 EDT 2008


Author: plongstaff
Date: 2008-07-20 15:12:44 -0400 (Sun, 20 Jul 2008)
New Revision: 17352
Trac: http://svn.gnucash.org/trac/changeset/17352

Modified:
   gnucash/branches/gobject-engine-dev2/src/engine/gnc-budget.c
   gnucash/branches/gobject-engine-dev2/src/engine/gnc-budget.h
Log:
Convert GncBudget to be a GObject with parameters and private section.



Modified: gnucash/branches/gobject-engine-dev2/src/engine/gnc-budget.c
===================================================================
--- gnucash/branches/gobject-engine-dev2/src/engine/gnc-budget.c	2008-07-20 16:28:36 UTC (rev 17351)
+++ gnucash/branches/gobject-engine-dev2/src/engine/gnc-budget.c	2008-07-20 19:12:44 UTC (rev 17352)
@@ -39,38 +39,196 @@
 
 static QofLogModule log_module = GNC_MOD_ENGINE;
 
-struct gnc_budget_private{
-    QofInstance inst;
+enum {
+  PROP_0,
+  PROP_NAME,
+  PROP_DESCRIPTION,
+  PROP_NUM_PERIODS,
+  PROP_RECURRENCE,
+};
 
+struct budget_s
+{
+  QofInstance inst;
+};
+
+typedef struct {
+    QofInstanceClass parent_class;
+} BudgetClass;
+
+typedef struct BudgetPrivate {
+    /* The name is an arbitrary string assigned by the user. */
     gchar* name;
+
+	/* The description is an arbitrary string assigned by the user. */
     gchar* description;
+
+	/* Recurrence (period info) for the budget */
     Recurrence recurrence;
+
+	/* Number of periods */
     guint  num_periods;
-};
+} BudgetPrivate;
 
+#define GET_PRIVATE(o) \
+  (G_TYPE_INSTANCE_GET_PRIVATE((o), GNC_TYPE_BUDGET, BudgetPrivate))
+
 struct _GncBudgetClass
 {
   QofInstanceClass parent_class;
 };
 
 /* GObject Initialization */
-QOF_GOBJECT_IMPL(gnc_budget, GncBudget, QOF_TYPE_INSTANCE);
+G_DEFINE_TYPE(GncBudget, gnc_budget, QOF_TYPE_INSTANCE)
 
 static void
 gnc_budget_init(GncBudget* budget)
 {
+    BudgetPrivate* priv;
+    GDate date;
+
+	priv = GET_PRIVATE(budget);
+	priv->name = CACHE_INSERT(_("Unnamed Budget"));
+	priv->description = CACHE_INSERT("");
+
+	priv->num_periods = 12;
+    g_date_set_time_t(&date, time(NULL));
+    g_date_subtract_days(&date, g_date_get_day(&date)-1);
+    recurrenceSet(&priv->recurrence, 1, PERIOD_MONTH, &date);
 }
 
 static void
-gnc_budget_dispose_real (GObject *budgetp)
+gnc_budget_dispose (GObject *budgetp)
 {
+    G_OBJECT_CLASS(gnc_budget_parent_class)->dispose(budgetp);
 }
 
 static void
-gnc_budget_finalize_real(GObject* budgetp)
+gnc_budget_finalize(GObject* budgetp)
 {
+    G_OBJECT_CLASS(gnc_budget_parent_class)->finalize(budgetp);
 }
 
+static void
+gnc_budget_get_property( GObject* object,
+						guint prop_id,
+						GValue* value,
+						GParamSpec* pspec)
+{
+    GncBudget* budget;
+	BudgetPrivate* priv;
+
+	g_return_if_fail(GNC_IS_BUDGET(object));
+
+	budget = GNC_BUDGET(object);
+	priv = GET_PRIVATE(budget);
+	switch( prop_id ) {
+	case PROP_NAME:
+		g_value_set_string(value, priv->name);
+		break;
+	case PROP_DESCRIPTION:
+		g_value_set_string(value, priv->description);
+		break;
+	case PROP_NUM_PERIODS:
+		g_value_set_uint(value, priv->num_periods);
+		break;
+	case PROP_RECURRENCE:
+		/* TODO: Make this a BOXED type */
+		g_value_set_pointer(value, &priv->recurrence);
+		break;
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
+		break;
+	}
+}
+
+static void
+gnc_budget_set_property( GObject* object,
+						guint prop_id,
+						const GValue* value,
+						GParamSpec* pspec)
+{
+    GncBudget* budget;
+
+	g_return_if_fail(GNC_IS_BUDGET(object));
+
+	budget = GNC_BUDGET(object);
+	switch( prop_id ) {
+	case PROP_NAME:
+		gnc_budget_set_name(budget, g_value_get_string(value));
+		break;
+	case PROP_DESCRIPTION:
+		gnc_budget_set_description(budget, g_value_get_string(value));
+		break;
+	case PROP_NUM_PERIODS:
+		gnc_budget_set_num_periods(budget, g_value_get_uint(value));
+		break;
+	case PROP_RECURRENCE:
+		gnc_budget_set_recurrence(budget, g_value_get_pointer(value));
+		break;
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
+		break;
+	}
+}
+
+static void
+gnc_budget_class_init(GncBudgetClass* klass)
+{
+    GObjectClass* gobject_class = G_OBJECT_CLASS(klass);
+
+	gobject_class->dispose = gnc_budget_dispose;
+	gobject_class->finalize = gnc_budget_finalize;
+	gobject_class->get_property = gnc_budget_get_property;
+	gobject_class->set_property = gnc_budget_set_property;
+
+	g_type_class_add_private(klass, sizeof(BudgetPrivate));
+
+	g_object_class_install_property(
+		gobject_class,
+		PROP_NAME,
+		g_param_spec_string( "name",
+							"Budget Name",
+							"The name is an arbitrary string "
+							"assigned by the user.  It is intended "
+							"to be a short, 5 to 30 character long string "
+							"that is displayed by the GUI as the "
+							"budget mnemonic",
+							NULL,
+							G_PARAM_READWRITE));
+
+	g_object_class_install_property(
+		gobject_class,
+		PROP_DESCRIPTION,
+		g_param_spec_string( "description",
+							"Budget Description",
+							"The description is an arbitrary string "
+							"assigned by the user.  It is intended "
+							"to be a longer, 1-5 sentence description of "
+							"what the budget is all about.",
+							NULL,
+							G_PARAM_READWRITE));
+
+	g_object_class_install_property(
+		gobject_class,
+		PROP_NUM_PERIODS,
+		g_param_spec_uint( "num-periods",
+							"Number of Periods",
+							"The number of periods for this budget.",
+							0,
+							G_MAXUINT32,
+							12,
+							G_PARAM_READWRITE));
+
+	g_object_class_install_property(
+		gobject_class,
+		PROP_RECURRENCE,
+		g_param_spec_pointer( "recurrence",
+							"Budget Recurrence",
+							"about.",
+							G_PARAM_READWRITE));
+}
+
 static void commit_err (QofInstance *inst, QofBackendError errcode)
 {
   PERR ("Failed to commit: %d", errcode);
@@ -79,19 +237,23 @@
 static void
 gnc_budget_free(QofInstance *inst)
 {
-    GncBudget *budget = GNC_BUDGET(inst);
+    GncBudget *budget;
+	BudgetPrivate* priv;
+
     if (budget == NULL)
         return;
-
     g_return_if_fail(GNC_IS_BUDGET(budget));
 
+	budget = GNC_BUDGET(inst);
+	priv = GET_PRIVATE(budget);
+
     /* We first send the message that this object is about to be
      * destroyed so that any GUI elements can remove it before it is
      * actually gone. */
     qof_event_gen( &budget->inst, QOF_EVENT_DESTROY, NULL);
 
-    CACHE_REMOVE(budget->name);
-    CACHE_REMOVE(budget->description);
+    CACHE_REMOVE(priv->name);
+    CACHE_REMOVE(priv->description);
 
     /* qof_instance_release (&budget->inst); */
     g_object_unref(budget);
@@ -117,23 +279,13 @@
 gnc_budget_new(QofBook *book)
 {
     GncBudget* budget;
-    GDate date;
+
     g_return_val_if_fail(book, NULL);
 
     ENTER(" ");
     budget = g_object_new(GNC_TYPE_BUDGET, NULL);
     qof_instance_init_data (&budget->inst, GNC_ID_BUDGET, book);
 
-    g_date_set_time_t(&date, time(NULL));
-    g_date_subtract_days(&date, g_date_get_day(&date)-1);
-    recurrenceSet(&budget->recurrence, 1, PERIOD_MONTH, &date);
-
-	gnc_budget_begin_edit(budget);
-    gnc_budget_set_name(budget, _("Unnamed Budget"));
-    gnc_budget_set_description(budget, "");
-    gnc_budget_set_num_periods(budget, 12);
-	gnc_budget_commit_edit(budget);
-
     qof_event_gen( &budget->inst, QOF_EVENT_CREATE , NULL);
 
     LEAVE(" ");
@@ -153,10 +305,15 @@
 void
 gnc_budget_set_name(GncBudget* budget, const gchar* name)
 {
+	BudgetPrivate* priv;
+
     g_return_if_fail(GNC_IS_BUDGET(budget) && name);
 
+	priv = GET_PRIVATE(budget);
+	if( name == priv->name ) return;
+
     gnc_budget_begin_edit(budget);
-    CACHE_REPLACE(budget->name, name);
+    CACHE_REPLACE(priv->name, name);
     qof_instance_set_dirty(&budget->inst);
     gnc_budget_commit_edit(budget);
 
@@ -167,17 +324,21 @@
 gnc_budget_get_name(GncBudget* budget)
 {
     g_return_val_if_fail(GNC_IS_BUDGET(budget), NULL);
-    return budget->name;
+    return GET_PRIVATE(budget)->name;
 }
 
 void
 gnc_budget_set_description(GncBudget* budget, const gchar* description)
 {
+	BudgetPrivate* priv;
+
     g_return_if_fail(GNC_IS_BUDGET(budget));
     g_return_if_fail(description);
 
+	priv = GET_PRIVATE(budget);
+	if( description == priv->description ) return;
     gnc_budget_begin_edit(budget);
-    CACHE_REPLACE(budget->description, description);
+    CACHE_REPLACE(priv->description, description);
     qof_instance_set_dirty(&budget->inst);
     gnc_budget_commit_edit(budget);
 
@@ -188,15 +349,19 @@
 gnc_budget_get_description(GncBudget* budget)
 {
     g_return_val_if_fail(GNC_IS_BUDGET(budget), NULL);
-    return budget->description;
+    return GET_PRIVATE(budget)->description;
 }
 
 void
 gnc_budget_set_recurrence(GncBudget *budget, const Recurrence *r)
 {
+	BudgetPrivate* priv;
+
     g_return_if_fail(budget && r);
+	priv = GET_PRIVATE(budget);
+
     gnc_budget_begin_edit(budget);
-    budget->recurrence = *r;
+    priv->recurrence = *r;
     qof_instance_set_dirty(&budget->inst);
     gnc_budget_commit_edit(budget);
 
@@ -207,7 +372,7 @@
 gnc_budget_get_recurrence(GncBudget *budget)
 {
     g_return_val_if_fail(budget, NULL);
-    return (&budget->recurrence);
+    return (&GET_PRIVATE(budget)->recurrence);
 }
 
 const GUID*
@@ -221,10 +386,15 @@
 void
 gnc_budget_set_num_periods(GncBudget* budget, guint num_periods)
 {
+	BudgetPrivate* priv;
+
     g_return_if_fail(GNC_IS_BUDGET(budget));
 
+	priv = GET_PRIVATE(budget);
+	if( priv->num_periods == num_periods ) return;
+
     gnc_budget_begin_edit(budget);
-    budget->num_periods = num_periods;
+    priv->num_periods = num_periods;
     qof_instance_set_dirty(&budget->inst);
     gnc_budget_commit_edit(budget);
 
@@ -235,7 +405,7 @@
 gnc_budget_get_num_periods(GncBudget* budget)
 {
     g_return_val_if_fail(GNC_IS_BUDGET(budget), 0);
-    return budget->num_periods;
+    return GET_PRIVATE(budget)->num_periods;
 }
 
 #define BUF_SIZE (10 + GUID_ENCODING_LENGTH + \
@@ -370,7 +540,7 @@
 {
     Timespec ts;
     timespecFromTime_t(
-        &ts,  recurrenceGetPeriodTime(&budget->recurrence, period_num, FALSE));
+        &ts,  recurrenceGetPeriodTime(&GET_PRIVATE(budget)->recurrence, period_num, FALSE));
     return ts;
 }
 
@@ -380,7 +550,7 @@
 {
     // FIXME: maybe zero is not best error return val.
     g_return_val_if_fail(GNC_IS_BUDGET(budget) && acc, gnc_numeric_zero());
-    return recurrenceGetAccountPeriodValue(&budget->recurrence, 
+    return recurrenceGetAccountPeriodValue(&GET_PRIVATE(budget)->recurrence, 
                                            acc, period_num);
 }
 
@@ -441,11 +611,11 @@
 
 /* Static wrapper getters for the recurrence params */
 static PeriodType gnc_budget_get_rec_pt(const GncBudget *bgt) 
-{ return recurrenceGetPeriodType(&(bgt->recurrence)); }
+{ return recurrenceGetPeriodType(&(GET_PRIVATE(bgt)->recurrence)); }
 static guint gnc_budget_get_rec_mult(const GncBudget *bgt) 
-{ return recurrenceGetMultiplier(&(bgt->recurrence)); }
+{ return recurrenceGetMultiplier(&(GET_PRIVATE(bgt)->recurrence)); }
 static GDate gnc_budget_get_rec_date(const GncBudget *bgt) 
-{ return recurrenceGetDate(&(bgt->recurrence)); }
+{ return recurrenceGetDate(&(GET_PRIVATE(bgt)->recurrence)); }
 
 /* Register ourselves with the engine. */
 gboolean gnc_budget_register (void)

Modified: gnucash/branches/gobject-engine-dev2/src/engine/gnc-budget.h
===================================================================
--- gnucash/branches/gobject-engine-dev2/src/engine/gnc-budget.h	2008-07-20 16:28:36 UTC (rev 17351)
+++ gnucash/branches/gobject-engine-dev2/src/engine/gnc-budget.h	2008-07-20 19:12:44 UTC (rev 17352)
@@ -67,7 +67,7 @@
 #include <glib.h>
 
 /** The budget data.*/
-typedef struct gnc_budget_private GncBudget;
+typedef struct budget_s GncBudget;
 typedef struct _GncBudgetClass GncBudgetClass;
 
 #include "qof.h"



More information about the gnucash-changes mailing list