How I can add some properties to object without touching it



Hello.

 I wonder about something like in topic. I have dia-canvas-box.c, but I
want to add one more properties like gchar *name. I want to make gobject
child of dia-canvas-box but i don't know how :( . My konwledge is poor
so i was copy first file, replace such string (like box) into another
(like box_tex) and add gchar *name into header, of course some functions
to set and get this property. But what is the correct way to make that work?

Something happy here: :)

-- 
Przemysław Staniszewski

--- /home/users/p/tmp/diacanvas2-0.14.2/diacanvas/dia-canvas-box.c      2003-11-20 21:48:36.000000000 +0100
+++ /home/users/p/Projekty/new_dyplom/src/dia-canvas-box-tex.c  2005-12-18 23:01:09.000000000 +0100
@@ -1,10 +1,10 @@
 /*
- * DiaCanvasBox
+ * DiaCanvasBoxTex
  *
  * This is LGPL'ed code.
  */
 
-#include "dia-canvas-box.h"
+#include "dia-canvas-box-tex.h"
 #include "dia-shape.h"
 #include <libart_lgpl/art_affine.h>
 #include "dia-canvas-i18n.h"
@@ -15,50 +15,51 @@
        PROP_BORDER_WIDTH,
        /* Depricated: */
        PROP_BG_COLOR,
+       PROP_NAME,
        PROP_LINE_WIDTH
 };
 
-static void dia_canvas_box_class_init (DiaCanvasBoxClass *klass);
-static void dia_canvas_box_init (DiaCanvasBox *item);
-static void dia_canvas_box_set_property (GObject *object,
+static void dia_canvas_box_tex_class_init (DiaCanvasBoxTexClass *klass);
+static void dia_canvas_box_tex_init (DiaCanvasBoxTex *item);
+static void dia_canvas_box_tex_set_property (GObject *object,
                                         guint property_id,
                                         const GValue *value,
                                         GParamSpec *pspec);
-static void dia_canvas_box_get_property (GObject *object,
+static void dia_canvas_box_tex_get_property (GObject *object,
                                         guint property_id,
                                         GValue *value,
                                         GParamSpec *pspec);
-static void dia_canvas_box_dispose     (GObject *object);
-static void dia_canvas_box_update      (DiaCanvasItem *item,
+static void dia_canvas_box_tex_dispose (GObject *object);
+static void dia_canvas_box_tex_update  (DiaCanvasItem *item,
                                         gdouble affine[6]);
-static gboolean dia_canvas_box_get_shape_iter  (DiaCanvasItem *item,
+static gboolean dia_canvas_box_tex_get_shape_iter      (DiaCanvasItem *item,
                                                 DiaCanvasIter *iter);
-static gboolean dia_canvas_box_shape_next      (DiaCanvasItem *item,
+static gboolean dia_canvas_box_tex_shape_next  (DiaCanvasItem *item,
                                                 DiaCanvasIter *iter);
-static DiaShape* dia_canvas_box_shape_value    (DiaCanvasItem *item,
+static DiaShape* dia_canvas_box_tex_shape_value        (DiaCanvasItem *item,
                                                 DiaCanvasIter *iter);
 static DiaCanvasElementClass *parent_class = NULL;
 
 GType
-dia_canvas_box_get_type (void)
+dia_canvas_box_tex_get_type (void)
 {
        static GType object_type = 0;
 
        if (!object_type) {
                static const GTypeInfo object_info = {
-                       sizeof (DiaCanvasBoxClass),
+                       sizeof (DiaCanvasBoxTexClass),
                        (GBaseInitFunc) NULL,
                        (GBaseFinalizeFunc) NULL,
-                       (GClassInitFunc) dia_canvas_box_class_init,
+                       (GClassInitFunc) dia_canvas_box_tex_class_init,
                        (GClassFinalizeFunc) NULL,
                        (gconstpointer) NULL, /* class_data */
-                       sizeof (DiaCanvasBox),
+                       sizeof (DiaCanvasBoxTex),
                        (guint16) 0, /* n_preallocs */
-                       (GInstanceInitFunc) dia_canvas_box_init,
+                       (GInstanceInitFunc) dia_canvas_box_tex_init,
                };
 
                object_type = g_type_register_static (DIA_TYPE_CANVAS_ELEMENT,
-                                                     "DiaCanvasBox",
+                                                     "DiaCanvasBoxTex",
                                                      &object_info, 0);
        }
 
@@ -67,7 +68,7 @@
 
 
 static void
-dia_canvas_box_class_init (DiaCanvasBoxClass *klass)
+dia_canvas_box_tex_class_init (DiaCanvasBoxTexClass *klass)
 {
        GObjectClass *object_class;
        DiaCanvasItemClass *item_class;
@@ -77,15 +78,23 @@
        
        parent_class = g_type_class_peek_parent (klass);
 
-       object_class->get_property = dia_canvas_box_get_property;
-       object_class->set_property = dia_canvas_box_set_property;
-       object_class->dispose = dia_canvas_box_dispose;
-
-       item_class->update = dia_canvas_box_update;
-       item_class->get_shape_iter = dia_canvas_box_get_shape_iter;
-       item_class->shape_next = dia_canvas_box_shape_next;
-       item_class->shape_value = dia_canvas_box_shape_value;
+       object_class->get_property = dia_canvas_box_tex_get_property;
+       object_class->set_property = dia_canvas_box_tex_set_property;
+       object_class->dispose = dia_canvas_box_tex_dispose;
+
+       item_class->update = dia_canvas_box_tex_update;
+       item_class->get_shape_iter = dia_canvas_box_tex_get_shape_iter;
+       item_class->shape_next = dia_canvas_box_tex_shape_next;
+       item_class->shape_value = dia_canvas_box_tex_shape_value;
 
+       g_printf("Instaluje\n");
+       g_object_class_install_property (object_class,
+                                        PROP_NAME,
+                                        g_param_spec_string ("name",
+                                               _("Name"),
+                                               _("Name for tex box"),
+                                               NULL,
+                                               G_PARAM_READWRITE));
        g_object_class_install_property (object_class,
                                         PROP_COLOR,
                                         g_param_spec_ulong ("color",
@@ -126,41 +135,49 @@
 
 
 static void
-dia_canvas_box_init (DiaCanvasBox *item)
+dia_canvas_box_tex_init (DiaCanvasBoxTex *item)
 {
        item->color = DIA_COLOR (0, 0, 0);
        item->fill_color = 0; /* fully transparent */
        item->border_width = 1.0;
        item->border = dia_shape_new (DIA_SHAPE_PATH);
+       item->name = NULL;
 }
 
 
 static void
-dia_canvas_box_set_property (GObject *object, guint property_id,
+dia_canvas_box_tex_set_property (GObject *object, guint property_id,
                             const GValue *value, GParamSpec *pspec)
 {
-       DiaCanvasBox *box = (DiaCanvasBox*) object;
+       DiaCanvasBoxTex *box_tex = (DiaCanvasBoxTex*) object;
 
        switch (property_id) {
        case PROP_COLOR:
-               dia_canvas_item_preserve_property (DIA_CANVAS_ITEM (box), "color");
-               box->color = g_value_get_ulong (value);
+               dia_canvas_item_preserve_property (DIA_CANVAS_ITEM (box_tex), "color");
+               box_tex->color = g_value_get_ulong (value);
                dia_canvas_item_request_update (DIA_CANVAS_ITEM (object));
                break;
        case PROP_BG_COLOR:
                g_warning("Depricated property: bg_color, use fill_color instead");
        case PROP_FILL_COLOR:
-               dia_canvas_item_preserve_property (DIA_CANVAS_ITEM(box), "fill_color");
-               box->fill_color = g_value_get_ulong (value);
+               dia_canvas_item_preserve_property (DIA_CANVAS_ITEM(box_tex), "fill_color");
+               box_tex->fill_color = g_value_get_ulong (value);
                dia_canvas_item_request_update (DIA_CANVAS_ITEM (object));
                break;
        case PROP_LINE_WIDTH:
                g_warning("Depricated property: line_width, use border_width instead");
        case PROP_BORDER_WIDTH:
-               dia_canvas_item_preserve_property (DIA_CANVAS_ITEM(box), "border_width");
-               box->border_width = g_value_get_double (value);
+               dia_canvas_item_preserve_property (DIA_CANVAS_ITEM(box_tex), "border_width");
+               box_tex->border_width = g_value_get_double (value);
                dia_canvas_item_request_update (DIA_CANVAS_ITEM (object));
                break;
+       case PROP_NAME:
+               dia_canvas_item_preserve_property (DIA_CANVAS_ITEM(box_tex), "name");
+               if (box_tex->name) {
+                       g_printf("Juz jest jakas nazwa - trzeba ja zwolnic przez free");
+               }
+               box_tex->name=g_strdup(g_value_get_string (value));
+               break;
        default:
                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
                break;
@@ -168,20 +185,23 @@
 }
 
 static void
-dia_canvas_box_get_property (GObject *object, guint property_id,
+dia_canvas_box_tex_get_property (GObject *object, guint property_id,
                             GValue *value, GParamSpec *pspec)
 {
        switch (property_id) {
        case PROP_COLOR:
-               g_value_set_ulong (value, DIA_CANVAS_BOX (object)->color);
+               g_value_set_ulong (value, DIA_CANVAS_BOX_TEX (object)->color);
                break;
        case PROP_BG_COLOR:
        case PROP_FILL_COLOR:
-               g_value_set_ulong (value, DIA_CANVAS_BOX (object)->fill_color);
+               g_value_set_ulong (value, DIA_CANVAS_BOX_TEX (object)->fill_color);
                break;
        case PROP_LINE_WIDTH:
        case PROP_BORDER_WIDTH:
-               g_value_set_double (value, DIA_CANVAS_BOX (object)->border_width);
+               g_value_set_double (value, DIA_CANVAS_BOX_TEX (object)->border_width);
+               break;
+       case PROP_NAME:
+               g_value_set_string (value, DIA_CANVAS_BOX_TEX (object)->name);
                break;
        default:
                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -190,21 +210,29 @@
 }
 
 static void
-dia_canvas_box_dispose (GObject *object)
+dia_canvas_box_tex_dispose (GObject *object)
 {
-       DiaCanvasBox *box = (DiaCanvasBox*) object;
+       DiaCanvasBoxTex *box_tex = (DiaCanvasBoxTex*) object;
 
-       if (box->border) {
-               dia_shape_free (box->border);
-               box->border = NULL;
+       if (box_tex->border) {
+               dia_shape_free (box_tex->border);
+               box_tex->border = NULL;
        }
 
+       // jesli dispose oznacza destroy
+        if (box_tex->name)
+                     {
+                                   g_free (box_tex->name);
+                                         box_tex->name = NULL;
+                                             }
+         
+
        G_OBJECT_CLASS (parent_class)->dispose (object);
 }
 
 
 static void
-dia_canvas_box_update (DiaCanvasItem *item, gdouble affine[6])
+dia_canvas_box_tex_update (DiaCanvasItem *item, gdouble affine[6])
 {
        DiaShape *border;
        DiaPoint p1 = { 0.0, 0.0 }, p2;
@@ -216,9 +244,9 @@
         if (DIA_CANVAS_ITEM_CLASS (parent_class)->update)
                DIA_CANVAS_ITEM_CLASS (parent_class)->update (item, affine);
        
-       border = DIA_CANVAS_BOX (item)->border;
+       border = DIA_CANVAS_BOX_TEX (item)->border;
 
-       half_w = DIA_CANVAS_BOX (item)->border_width / 2.0;
+       half_w = DIA_CANVAS_BOX_TEX (item)->border_width / 2.0;
        item->bounds.top -= half_w;
        item->bounds.left -= half_w;
        item->bounds.bottom += half_w;
@@ -226,28 +254,28 @@
 
        /* Create the border */
        dia_shape_rectangle (border, &p1, &p2);
-       dia_shape_set_color (border, DIA_CANVAS_BOX (item)->color);
+       dia_shape_set_color (border, DIA_CANVAS_BOX_TEX (item)->color);
        dia_shape_path_set_fill (border, DIA_FILL_SOLID);
-       dia_shape_path_set_fill_color (border, DIA_CANVAS_BOX (item)->fill_color);
-       dia_shape_path_set_line_width (border, DIA_CANVAS_BOX (item)->border_width);
+       dia_shape_path_set_fill_color (border, DIA_CANVAS_BOX_TEX (item)->fill_color);
+       dia_shape_path_set_line_width (border, DIA_CANVAS_BOX_TEX (item)->border_width);
 }
 
 static gboolean
-dia_canvas_box_get_shape_iter (DiaCanvasItem *item, DiaCanvasIter *iter)
+dia_canvas_box_tex_get_shape_iter (DiaCanvasItem *item, DiaCanvasIter *iter)
 {
-       iter->data[0] = DIA_CANVAS_BOX (item)->border;
+       iter->data[0] = DIA_CANVAS_BOX_TEX (item)->border;
        return TRUE;
 }
 
 static gboolean
-dia_canvas_box_shape_next (DiaCanvasItem *item, DiaCanvasIter *iter)
+dia_canvas_box_tex_shape_next (DiaCanvasItem *item, DiaCanvasIter *iter)
 {
        iter->data[0] = NULL;
        return FALSE;
 }
 
 static DiaShape*
-dia_canvas_box_shape_value (DiaCanvasItem *item, DiaCanvasIter *iter)
+dia_canvas_box_tex_shape_value (DiaCanvasItem *item, DiaCanvasIter *iter)
 {
        return iter->data[0];
 }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]