1 /* Dia -- a diagram creation/manipulation program -*- c -*-
2 * Copyright (C) 1998 Alexander Larsson
4 * Property system for dia objects/shapes.
5 * Copyright (C) 2000 James Henstridge
6 * Copyright (C) 2001 Cyrille Chepelov
7 * Major restructuration done in August 2001 by C. Chepelov
9 * Property types for "geometric" types (real, points, rectangles, etc.)
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, write to the Free Software
23 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
32 #define WIDGET GtkWidget
34 #include "properties.h"
35 #include "propinternals.h"
37 #include "connpoint_line.h"
38 #include "prop_geomtypes.h"
40 static void fontsizeprop_reset_widget(FontsizeProperty
*prop
, WIDGET
*widget
);
42 /****************************/
43 /* The REAL property type. */
44 /****************************/
47 realprop_new(const PropDescription
*pdesc
, PropDescToPropPredicate reason
)
49 RealProperty
*prop
= g_new0(RealProperty
,1);
50 initialize_property(&prop
->common
, pdesc
, reason
);
51 prop
->real_data
= 0.0;
56 realprop_copy(RealProperty
*src
)
59 (RealProperty
*)src
->common
.ops
->new_prop(src
->common
.descr
,
61 copy_init_property(&prop
->common
,&src
->common
);
62 prop
->real_data
= src
->real_data
;
67 realprop_get_widget(RealProperty
*prop
, PropDialog
*dialog
)
69 GtkAdjustment
*adj
= GTK_ADJUSTMENT(gtk_adjustment_new(prop
->real_data
,
73 GtkWidget
*ret
= gtk_spin_button_new(adj
, 1.0, 2);
74 gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(ret
),TRUE
);
75 prophandler_connect(&prop
->common
,GTK_OBJECT(adj
),"value_changed");
81 realprop_reset_widget(RealProperty
*prop
, WIDGET
*widget
)
84 if (prop
->common
.extra_data
) {
85 PropNumData
*numdata
= prop
->common
.extra_data
;
86 adj
= GTK_ADJUSTMENT(gtk_adjustment_new(prop
->real_data
,
87 numdata
->min
, numdata
->max
,
90 10.0 * numdata
->step
));
92 adj
= GTK_ADJUSTMENT(gtk_adjustment_new(prop
->real_data
,
93 G_MINFLOAT
, G_MAXFLOAT
,
96 gtk_spin_button_set_adjustment(GTK_SPIN_BUTTON(widget
), adj
);
100 realprop_set_from_widget(RealProperty
*prop
, WIDGET
*widget
)
102 prop
->real_data
= gtk_spin_button_get_value(GTK_SPIN_BUTTON(widget
));
106 realprop_load(RealProperty
*prop
, AttributeNode attr
, DataNode data
)
108 prop
->real_data
= data_real(data
);
112 realprop_save(RealProperty
*prop
, AttributeNode attr
)
114 data_add_real(attr
, prop
->real_data
);
118 realprop_get_from_offset(RealProperty
*prop
,
119 void *base
, guint offset
, guint offset2
)
121 prop
->real_data
= struct_member(base
,offset
,real
);
125 realprop_set_from_offset(RealProperty
*prop
,
126 void *base
, guint offset
, guint offset2
)
128 struct_member(base
,offset
,real
) = prop
->real_data
;
132 realprop_get_data_size(RealProperty
*prop
)
134 return sizeof (prop
->real_data
);
137 static const PropertyOps realprop_ops
= {
138 (PropertyType_New
) realprop_new
,
139 (PropertyType_Free
) noopprop_free
,
140 (PropertyType_Copy
) realprop_copy
,
141 (PropertyType_Load
) realprop_load
,
142 (PropertyType_Save
) realprop_save
,
143 (PropertyType_GetWidget
) realprop_get_widget
,
144 (PropertyType_ResetWidget
) realprop_reset_widget
,
145 (PropertyType_SetFromWidget
) realprop_set_from_widget
,
147 (PropertyType_CanMerge
) noopprop_can_merge
,
148 (PropertyType_GetFromOffset
) realprop_get_from_offset
,
149 (PropertyType_SetFromOffset
) realprop_set_from_offset
,
150 (PropertyType_GetDataSize
) realprop_get_data_size
153 /****************************/
154 /* The LENGTH property type. */
155 /****************************/
157 static LengthProperty
*
158 lengthprop_new(const PropDescription
*pdesc
, PropDescToPropPredicate reason
)
160 LengthProperty
*prop
= g_new0(LengthProperty
,1);
161 initialize_property(&prop
->common
, pdesc
, reason
);
162 prop
->length_data
= 0.0;
166 static LengthProperty
*
167 lengthprop_copy(LengthProperty
*src
)
169 LengthProperty
*prop
=
170 (LengthProperty
*)src
->common
.ops
->new_prop(src
->common
.descr
,
172 copy_init_property(&prop
->common
,&src
->common
);
173 prop
->length_data
= src
->length_data
;
178 lengthprop_get_widget(LengthProperty
*prop
, PropDialog
*dialog
)
180 GtkAdjustment
*adj
= GTK_ADJUSTMENT(gtk_adjustment_new(prop
->length_data
,
184 GtkWidget
*ret
= dia_unit_spinner_new(adj
, 2, DIA_UNIT_MILLIMETER
);
185 /* gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(ret),TRUE);*/
186 prophandler_connect(&prop
->common
,GTK_OBJECT(adj
),"value_changed");
192 lengthprop_reset_widget(LengthProperty
*prop
, WIDGET
*widget
)
196 if (prop->common.extra_data) {
197 PropNumData *numdata = prop->common.extra_data;
198 adj = GTK_ADJUSTMENT(gtk_adjustment_new(prop->length_data,
199 numdata->min, numdata->max,
201 10.0 * numdata->step,
202 10.0 * numdata->step));
204 adj = GTK_ADJUSTMENT(gtk_adjustment_new(prop->length_data,
205 G_MINFLOAT, G_MAXFLOAT,
208 dia_unit_spinner_set_adjustment(GTK_SPIN_BUTTON(widget), adj);
210 dia_unit_spinner_set_value(DIA_UNIT_SPINNER(widget
), prop
->length_data
);
214 lengthprop_set_from_widget(LengthProperty
*prop
, WIDGET
*widget
)
216 prop
->length_data
= dia_unit_spinner_get_value((DiaUnitSpinner
*)
217 GTK_SPIN_BUTTON(widget
));
221 lengthprop_load(LengthProperty
*prop
, AttributeNode attr
, DataNode data
)
223 prop
->length_data
= data_real(data
);
227 lengthprop_save(LengthProperty
*prop
, AttributeNode attr
)
229 data_add_real(attr
, prop
->length_data
);
233 lengthprop_get_from_offset(LengthProperty
*prop
,
234 void *base
, guint offset
, guint offset2
)
236 prop
->length_data
= struct_member(base
,offset
,real
);
240 lengthprop_set_from_offset(LengthProperty
*prop
,
241 void *base
, guint offset
, guint offset2
)
243 struct_member(base
,offset
,real
) = prop
->length_data
;
247 lengthprop_get_data_size(LengthProperty
*prop
)
249 return sizeof (prop
->length_data
);
252 static const PropertyOps lengthprop_ops
= {
253 (PropertyType_New
) lengthprop_new
,
254 (PropertyType_Free
) noopprop_free
,
255 (PropertyType_Copy
) lengthprop_copy
,
256 (PropertyType_Load
) lengthprop_load
,
257 (PropertyType_Save
) lengthprop_save
,
258 (PropertyType_GetWidget
) lengthprop_get_widget
,
259 (PropertyType_ResetWidget
) lengthprop_reset_widget
,
260 (PropertyType_SetFromWidget
) lengthprop_set_from_widget
,
262 (PropertyType_CanMerge
) noopprop_can_merge
,
263 (PropertyType_GetFromOffset
) lengthprop_get_from_offset
,
264 (PropertyType_SetFromOffset
) lengthprop_set_from_offset
,
265 (PropertyType_GetDataSize
) lengthprop_get_data_size
268 /****************************/
269 /* The FONTSIZE property type. */
270 /****************************/
272 static FontsizeProperty
*
273 fontsizeprop_new(const PropDescription
*pdesc
, PropDescToPropPredicate reason
)
275 FontsizeProperty
*prop
= g_new0(FontsizeProperty
,1);
276 initialize_property(&prop
->common
, pdesc
, reason
);
277 prop
->fontsize_data
= 0.0;
281 static FontsizeProperty
*
282 fontsizeprop_copy(FontsizeProperty
*src
)
284 FontsizeProperty
*prop
=
285 (FontsizeProperty
*)src
->common
.ops
->new_prop(src
->common
.descr
,
287 copy_init_property(&prop
->common
,&src
->common
);
288 prop
->fontsize_data
= src
->fontsize_data
;
293 fontsizeprop_get_widget(FontsizeProperty
*prop
, PropDialog
*dialog
)
295 GtkAdjustment
*adj
= GTK_ADJUSTMENT(gtk_adjustment_new(prop
->fontsize_data
,
299 GtkWidget
*ret
= dia_unit_spinner_new(adj
, 2, DIA_UNIT_POINT
);
300 /* gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(ret),TRUE);*/
301 prophandler_connect(&prop
->common
,GTK_OBJECT(adj
),"value_changed");
302 fontsizeprop_reset_widget(prop
, ret
);
307 fontsizeprop_reset_widget(FontsizeProperty
*prop
, WIDGET
*widget
)
311 if (prop->common.extra_data) {
312 PropNumData *numdata = prop->common.extra_data;
313 adj = GTK_ADJUSTMENT(gtk_adjustment_new(prop->fontsize_data,
314 numdata->min, numdata->max,
316 10.0 * numdata->step,
317 10.0 * numdata->step));
319 adj = GTK_ADJUSTMENT(gtk_adjustment_new(prop->fontsize_data,
320 G_MINFLOAT, G_MAXFLOAT,
323 gtk_spin_button_set_adjustment(GTK_SPIN_BUTTON(widget), adj);
325 printf("Resetting\n");
326 dia_unit_spinner_set_value(DIA_UNIT_SPINNER(widget
), prop
->fontsize_data
);
330 fontsizeprop_set_from_widget(FontsizeProperty
*prop
, WIDGET
*widget
)
333 prop
->fontsize_data
= dia_unit_spinner_get_value(DIA_UNIT_SPINNER(widget
));
337 fontsizeprop_load(FontsizeProperty
*prop
, AttributeNode attr
, DataNode data
)
339 prop
->fontsize_data
= data_real(data
);
343 fontsizeprop_save(FontsizeProperty
*prop
, AttributeNode attr
)
345 data_add_real(attr
, prop
->fontsize_data
);
349 fontsizeprop_get_from_offset(FontsizeProperty
*prop
,
350 void *base
, guint offset
, guint offset2
)
352 prop
->fontsize_data
= struct_member(base
,offset
,real
);
356 fontsizeprop_set_from_offset(FontsizeProperty
*prop
,
357 void *base
, guint offset
, guint offset2
)
359 struct_member(base
,offset
,real
) = prop
->fontsize_data
;
363 fontsizeprop_get_data_size(FontsizeProperty
*prop
)
365 return sizeof (prop
->fontsize_data
);
368 static const PropertyOps fontsizeprop_ops
= {
369 (PropertyType_New
) fontsizeprop_new
,
370 (PropertyType_Free
) noopprop_free
,
371 (PropertyType_Copy
) fontsizeprop_copy
,
372 (PropertyType_Load
) fontsizeprop_load
,
373 (PropertyType_Save
) fontsizeprop_save
,
374 (PropertyType_GetWidget
) fontsizeprop_get_widget
,
375 (PropertyType_ResetWidget
) fontsizeprop_reset_widget
,
376 (PropertyType_SetFromWidget
) fontsizeprop_set_from_widget
,
378 (PropertyType_CanMerge
) noopprop_can_merge
,
379 (PropertyType_GetFromOffset
) fontsizeprop_get_from_offset
,
380 (PropertyType_SetFromOffset
) fontsizeprop_set_from_offset
,
381 (PropertyType_GetDataSize
) fontsizeprop_get_data_size
384 /*****************************/
385 /* The POINT property type. */
386 /*****************************/
388 static PointProperty
*
389 pointprop_new(const PropDescription
*pdesc
, PropDescToPropPredicate reason
)
391 PointProperty
*prop
= g_new0(PointProperty
,1);
392 initialize_property(&prop
->common
, pdesc
, reason
);
393 prop
->point_data
.x
= 0.0;
394 prop
->point_data
.y
= 0.0;
398 static PointProperty
*
399 pointprop_copy(PointProperty
*src
)
401 PointProperty
*prop
=
402 (PointProperty
*)src
->common
.ops
->new_prop(src
->common
.descr
,
404 copy_init_property(&prop
->common
,&src
->common
);
405 prop
->point_data
= src
->point_data
;
410 pointprop_load(PointProperty
*prop
, AttributeNode attr
, DataNode data
)
412 data_point(data
,&prop
->point_data
);
416 pointprop_save(PointProperty
*prop
, AttributeNode attr
)
418 data_add_point(attr
, &prop
->point_data
);
422 pointprop_get_from_offset(PointProperty
*prop
,
423 void *base
, guint offset
, guint offset2
)
425 prop
->point_data
= struct_member(base
,offset
,Point
);
429 pointprop_set_from_offset(PointProperty
*prop
,
430 void *base
, guint offset
, guint offset2
)
432 struct_member(base
,offset
,Point
) = prop
->point_data
;
435 static const PropertyOps pointprop_ops
= {
436 (PropertyType_New
) pointprop_new
,
437 (PropertyType_Free
) noopprop_free
,
438 (PropertyType_Copy
) pointprop_copy
,
439 (PropertyType_Load
) pointprop_load
,
440 (PropertyType_Save
) pointprop_save
,
441 (PropertyType_GetWidget
) invalidprop_get_widget
,
442 (PropertyType_ResetWidget
) invalidprop_reset_widget
,
443 (PropertyType_SetFromWidget
) invalidprop_set_from_widget
,
445 (PropertyType_CanMerge
) noopprop_can_merge
,
446 (PropertyType_GetFromOffset
) pointprop_get_from_offset
,
447 (PropertyType_SetFromOffset
) pointprop_set_from_offset
450 /********************************/
451 /* The POINTARRAY property type. */
452 /********************************/
454 static PointarrayProperty
*
455 pointarrayprop_new(const PropDescription
*pdesc
,
456 PropDescToPropPredicate reason
)
458 PointarrayProperty
*prop
= g_new0(PointarrayProperty
,1);
459 initialize_property(&prop
->common
,pdesc
,reason
);
460 prop
->pointarray_data
= g_array_new(FALSE
,TRUE
,sizeof(Point
));
465 pointarrayprop_free(PointarrayProperty
*prop
)
467 g_array_free(prop
->pointarray_data
,TRUE
);
471 static PointarrayProperty
*
472 pointarrayprop_copy(PointarrayProperty
*src
)
475 PointarrayProperty
*prop
=
476 (PointarrayProperty
*)src
->common
.ops
->new_prop(src
->common
.descr
,
478 copy_init_property(&prop
->common
,&src
->common
);
479 g_array_set_size(prop
->pointarray_data
,src
->pointarray_data
->len
);
480 for (i
= 0 ; i
< src
->pointarray_data
->len
; i
++)
481 g_array_index(prop
->pointarray_data
,Point
,i
) =
482 g_array_index(src
->pointarray_data
,Point
,i
);
487 pointarrayprop_load(PointarrayProperty
*prop
, AttributeNode attr
, DataNode data
)
489 guint nvals
= attribute_num_data(attr
);
491 g_array_set_size(prop
->pointarray_data
,nvals
);
492 for (i
=0; (i
< nvals
) && data
; i
++, data
= data_next(data
))
493 data_point(data
,&g_array_index(prop
->pointarray_data
,Point
,i
));
495 g_warning("attribute_num_data() and actual data count mismatch "
496 "(shouldn't happen)");
500 pointarrayprop_save(PointarrayProperty
*prop
, AttributeNode attr
)
503 for (i
= 0; i
< prop
->pointarray_data
->len
; i
++)
504 data_add_point(attr
, &g_array_index(prop
->pointarray_data
,Point
,i
));
508 pointarrayprop_get_from_offset(PointarrayProperty
*prop
,
509 void *base
, guint offset
, guint offset2
)
511 guint nvals
= struct_member(base
,offset2
,guint
);
513 void *ofs_val
= struct_member(base
,offset
,void *);
514 g_array_set_size(prop
->pointarray_data
,nvals
);
515 for (i
= 0; i
< nvals
; i
++)
516 g_array_index(prop
->pointarray_data
,Point
,i
) =
517 struct_member(ofs_val
,i
* sizeof(Point
),Point
);
521 pointarrayprop_set_from_offset(PointarrayProperty
*prop
,
522 void *base
, guint offset
, guint offset2
)
524 guint nvals
= prop
->pointarray_data
->len
;
525 Point
*vals
= g_memdup(&g_array_index(prop
->pointarray_data
,Point
,0),
526 sizeof(Point
) * nvals
);
527 g_free(struct_member(base
,offset
,Point
*));
528 struct_member(base
,offset
,Point
*) = vals
;
529 struct_member(base
,offset2
,guint
) = nvals
;
532 static const PropertyOps pointarrayprop_ops
= {
533 (PropertyType_New
) pointarrayprop_new
,
534 (PropertyType_Free
) pointarrayprop_free
,
535 (PropertyType_Copy
) pointarrayprop_copy
,
536 (PropertyType_Load
) pointarrayprop_load
,
537 (PropertyType_Save
) pointarrayprop_save
,
538 (PropertyType_GetWidget
) invalidprop_get_widget
,
539 (PropertyType_ResetWidget
) invalidprop_reset_widget
,
540 (PropertyType_SetFromWidget
) invalidprop_set_from_widget
,
542 (PropertyType_CanMerge
) noopprop_can_merge
,
543 (PropertyType_GetFromOffset
) pointarrayprop_get_from_offset
,
544 (PropertyType_SetFromOffset
) pointarrayprop_set_from_offset
548 /********************************/
549 /* The BEZPOINT property type. */
550 /********************************/
552 static BezPointProperty
*
553 bezpointprop_new(const PropDescription
*pdesc
,
554 PropDescToPropPredicate reason
)
556 BezPointProperty
*prop
= g_new0(BezPointProperty
,1);
557 initialize_property(&prop
->common
,pdesc
,reason
);
558 memset(&prop
->bezpoint_data
,0,sizeof(prop
->bezpoint_data
));
562 static BezPointProperty
*
563 bezpointprop_copy(BezPointProperty
*src
)
565 BezPointProperty
*prop
=
566 (BezPointProperty
*)src
->common
.ops
->new_prop(src
->common
.descr
,
568 copy_init_property(&prop
->common
,&src
->common
);
569 prop
->bezpoint_data
= src
->bezpoint_data
;
574 bezpointprop_load(BezPointProperty
*prop
, AttributeNode attr
, DataNode data
)
577 data_bezpoint(data
,&prop
->bezpoint_data
);
579 g_error("BezPoint_load() not implemented. Missing data_bezpoint().");
584 bezpointprop_save(BezPointProperty
*prop
, AttributeNode attr
)
587 data_add_bezpoint(attr
, &prop
->bezpoint_data
);
589 g_error("BezPoint_save() not implemented. Missing data_bezpoint().");
594 bezpointprop_get_from_offset(BezPointProperty
*prop
,
595 void *base
, guint offset
, guint offset2
)
597 prop
->bezpoint_data
= struct_member(base
,offset
,BezPoint
);
601 bezpointprop_set_from_offset(BezPointProperty
*prop
,
602 void *base
, guint offset
, guint offset2
)
604 struct_member(base
,offset
,BezPoint
) = prop
->bezpoint_data
;
607 static const PropertyOps bezpointprop_ops
= {
608 (PropertyType_New
) bezpointprop_new
,
609 (PropertyType_Free
) noopprop_free
,
610 (PropertyType_Copy
) bezpointprop_copy
,
611 (PropertyType_Load
) bezpointprop_load
,
612 (PropertyType_Save
) bezpointprop_save
,
613 (PropertyType_GetWidget
) invalidprop_get_widget
,
614 (PropertyType_ResetWidget
) invalidprop_reset_widget
,
615 (PropertyType_SetFromWidget
) invalidprop_set_from_widget
,
617 (PropertyType_CanMerge
) noopprop_can_merge
,
618 (PropertyType_GetFromOffset
) bezpointprop_get_from_offset
,
619 (PropertyType_SetFromOffset
) bezpointprop_set_from_offset
622 /*************************************/
623 /* The BEZPOINTARRAY property type. */
624 /*************************************/
626 static BezPointarrayProperty
*
627 bezpointarrayprop_new(const PropDescription
*pdesc
,
628 PropDescToPropPredicate reason
)
630 BezPointarrayProperty
*prop
= g_new0(BezPointarrayProperty
,1);
631 initialize_property(&prop
->common
,pdesc
,reason
);
632 prop
->bezpointarray_data
= g_array_new(FALSE
,TRUE
,sizeof(BezPoint
));
637 bezpointarrayprop_free(BezPointarrayProperty
*prop
)
639 g_array_free(prop
->bezpointarray_data
,TRUE
);
643 static BezPointarrayProperty
*
644 bezpointarrayprop_copy(BezPointarrayProperty
*src
)
647 BezPointarrayProperty
*prop
=
648 (BezPointarrayProperty
*)src
->common
.ops
->new_prop(src
->common
.descr
,
650 copy_init_property(&prop
->common
,&src
->common
);
651 g_array_set_size(prop
->bezpointarray_data
,src
->bezpointarray_data
->len
);
652 for (i
= 0 ; i
< src
->bezpointarray_data
->len
; i
++)
653 g_array_index(prop
->bezpointarray_data
,BezPoint
,i
) =
654 g_array_index(src
->bezpointarray_data
,BezPoint
,i
);
659 bezpointarrayprop_load(BezPointarrayProperty
*prop
,
660 AttributeNode attr
, DataNode data
)
663 guint nvals
= attribute_num_data(attr
);
666 g_array_set_size(prop
->bezpointarray_data
,nvals
);
668 for (i
=0; (i
< nvals
) && data
; i
++, data
= data_next(data
))
669 data_bezpoint(data
,&g_array_index(prop
->bezpointarray_data
,BezPoint
,i
));
671 g_warning("attribute_num_data() and actual data count mismatch "
672 "(shouldn't happen)");
674 g_error("BezPointArray_load() not implemented. Missing data_bezpoint().");
679 bezpointarrayprop_save(BezPointarrayProperty
*prop
, AttributeNode attr
)
683 for (i
= 0; i
< prop
->bezpointarray_data
->len
; i
++)
684 data_add_bezpoint(attr
,
685 &g_array_index(prop
->bezpointarray_data
,BezPoint
,i
));
687 g_error("BezPointArray_load() not implemented. Missing data_bezpoint().");
692 bezpointarrayprop_get_from_offset(BezPointarrayProperty
*prop
,
693 void *base
, guint offset
, guint offset2
)
695 guint nvals
= struct_member(base
,offset2
,guint
);
697 void *ofs_val
= struct_member(base
,offset
,void *);
698 g_array_set_size(prop
->bezpointarray_data
,nvals
);
699 for (i
= 0; i
< nvals
; i
++)
700 g_array_index(prop
->bezpointarray_data
,BezPoint
,i
) =
701 struct_member(ofs_val
,i
* sizeof(BezPoint
),BezPoint
);
705 bezpointarrayprop_set_from_offset(BezPointarrayProperty
*prop
,
706 void *base
, guint offset
, guint offset2
)
708 guint nvals
= prop
->bezpointarray_data
->len
;
709 BezPoint
*vals
= g_memdup(&g_array_index(prop
->bezpointarray_data
,
711 sizeof(BezPoint
) * nvals
);
712 g_free(struct_member(base
,offset
,gint
*));
713 struct_member(base
,offset
,BezPoint
*) = vals
;
714 struct_member(base
,offset2
,guint
) = nvals
;
717 static const PropertyOps bezpointarrayprop_ops
= {
718 (PropertyType_New
) bezpointarrayprop_new
,
719 (PropertyType_Free
) bezpointarrayprop_free
,
720 (PropertyType_Copy
) bezpointarrayprop_copy
,
721 (PropertyType_Load
) bezpointarrayprop_load
,
722 (PropertyType_Save
) bezpointarrayprop_save
,
723 (PropertyType_GetWidget
) invalidprop_get_widget
,
724 (PropertyType_ResetWidget
) invalidprop_reset_widget
,
725 (PropertyType_SetFromWidget
) invalidprop_set_from_widget
,
727 (PropertyType_CanMerge
) noopprop_can_merge
,
728 (PropertyType_GetFromOffset
) bezpointarrayprop_get_from_offset
,
729 (PropertyType_SetFromOffset
) bezpointarrayprop_set_from_offset
732 /*****************************/
733 /* The RECT property type. */
734 /*****************************/
736 static RectProperty
*
737 rectprop_new(const PropDescription
*pdesc
, PropDescToPropPredicate reason
)
739 RectProperty
*prop
= g_new0(RectProperty
,1);
740 initialize_property(&prop
->common
,pdesc
,reason
);
741 memset(&prop
->rect_data
,0,sizeof(prop
->rect_data
));
745 static RectProperty
*
746 rectprop_copy(RectProperty
*src
)
749 (RectProperty
*)src
->common
.ops
->new_prop(src
->common
.descr
,
751 copy_init_property(&prop
->common
,&src
->common
);
752 prop
->rect_data
= src
->rect_data
;
757 rectprop_load(RectProperty
*prop
, AttributeNode attr
, DataNode data
)
759 data_rectangle(data
,&prop
->rect_data
);
763 rectprop_save(RectProperty
*prop
, AttributeNode attr
)
765 data_add_rectangle(attr
, &prop
->rect_data
);
769 rectprop_get_from_offset(RectProperty
*prop
,
770 void *base
, guint offset
, guint offset2
)
772 prop
->rect_data
= struct_member(base
,offset
,Rectangle
);
776 rectprop_set_from_offset(RectProperty
*prop
,
777 void *base
, guint offset
, guint offset2
)
779 struct_member(base
,offset
,Rectangle
) = prop
->rect_data
;
782 static const PropertyOps rectprop_ops
= {
783 (PropertyType_New
) rectprop_new
,
784 (PropertyType_Free
) noopprop_free
,
785 (PropertyType_Copy
) rectprop_copy
,
786 (PropertyType_Load
) rectprop_load
,
787 (PropertyType_Save
) rectprop_save
,
788 (PropertyType_GetWidget
) invalidprop_get_widget
,
789 (PropertyType_ResetWidget
) invalidprop_reset_widget
,
790 (PropertyType_SetFromWidget
) invalidprop_set_from_widget
,
792 (PropertyType_CanMerge
) noopprop_can_merge
,
793 (PropertyType_GetFromOffset
) rectprop_get_from_offset
,
794 (PropertyType_SetFromOffset
) rectprop_set_from_offset
797 /*********************************/
798 /* The ENDPOINTS property type. */
799 /*********************************/
801 static EndpointsProperty
*
802 endpointsprop_new(const PropDescription
*pdesc
,
803 PropDescToPropPredicate reason
)
805 EndpointsProperty
*prop
= g_new0(EndpointsProperty
,1);
806 initialize_property(&prop
->common
,pdesc
,reason
);
807 memset(&prop
->endpoints_data
,0,sizeof(prop
->endpoints_data
));
811 static EndpointsProperty
*
812 endpointsprop_copy(EndpointsProperty
*src
)
814 EndpointsProperty
*prop
=
815 (EndpointsProperty
*)src
->common
.ops
->new_prop(src
->common
.descr
,
817 copy_init_property(&prop
->common
,&src
->common
);
818 memcpy(&prop
->endpoints_data
,
819 &src
->endpoints_data
,
820 sizeof(prop
->endpoints_data
));
825 endpointsprop_load(EndpointsProperty
*prop
, AttributeNode attr
, DataNode data
)
827 data_point(data
,&prop
->endpoints_data
[0]);
828 data
= data_next(data
);
829 data_point(data
,&prop
->endpoints_data
[1]);
833 endpointsprop_save(EndpointsProperty
*prop
, AttributeNode attr
)
835 data_add_point(attr
, &prop
->endpoints_data
[0]);
836 data_add_point(attr
, &prop
->endpoints_data
[1]);
840 endpointsprop_get_from_offset(EndpointsProperty
*prop
,
841 void *base
, guint offset
, guint offset2
)
843 memcpy(&prop
->endpoints_data
,
844 &struct_member(base
,offset
,Point
),
845 sizeof(prop
->endpoints_data
));
849 endpointsprop_set_from_offset(EndpointsProperty
*prop
,
850 void *base
, guint offset
, guint offset2
)
852 memcpy(&struct_member(base
,offset
,Point
),
853 &prop
->endpoints_data
,
854 sizeof(prop
->endpoints_data
));
857 static const PropertyOps endpointsprop_ops
= {
858 (PropertyType_New
) endpointsprop_new
,
859 (PropertyType_Free
) noopprop_free
,
860 (PropertyType_Copy
) endpointsprop_copy
,
861 (PropertyType_Load
) endpointsprop_load
,
862 (PropertyType_Save
) endpointsprop_save
,
863 (PropertyType_GetWidget
) invalidprop_get_widget
,
864 (PropertyType_ResetWidget
) invalidprop_reset_widget
,
865 (PropertyType_SetFromWidget
) invalidprop_set_from_widget
,
867 (PropertyType_CanMerge
) noopprop_can_merge
,
868 (PropertyType_GetFromOffset
) endpointsprop_get_from_offset
,
869 (PropertyType_SetFromOffset
) endpointsprop_set_from_offset
872 /***************************/
873 /* The CONNPOINT_LINE property type. */
874 /***************************/
876 static Connpoint_LineProperty
*
877 connpoint_lineprop_new(const PropDescription
*pdesc
,
878 PropDescToPropPredicate reason
)
880 Connpoint_LineProperty
*prop
= g_new0(Connpoint_LineProperty
,1);
881 initialize_property(&prop
->common
,pdesc
,reason
);
882 prop
->connpoint_line_data
= 0;
886 static Connpoint_LineProperty
*
887 connpoint_lineprop_copy(Connpoint_LineProperty
*src
)
889 Connpoint_LineProperty
*prop
=
890 (Connpoint_LineProperty
*)src
->common
.ops
->new_prop(src
->common
.descr
,
892 copy_init_property(&prop
->common
,&src
->common
);
893 prop
->connpoint_line_data
= src
->connpoint_line_data
;
898 connpoint_lineprop_load(Connpoint_LineProperty
*prop
, AttributeNode attr
, DataNode data
)
900 prop
->connpoint_line_data
= data_int(data
);
904 connpoint_lineprop_save(Connpoint_LineProperty
*prop
, AttributeNode attr
)
906 data_add_int(attr
, prop
->connpoint_line_data
);
910 connpoint_lineprop_get_from_offset(Connpoint_LineProperty
*prop
,
911 void *base
, guint offset
, guint offset2
)
913 prop
->connpoint_line_data
=
914 struct_member(base
,offset
,ConnPointLine
*)->num_connections
;
918 connpoint_lineprop_set_from_offset(Connpoint_LineProperty
*prop
,
919 void *base
, guint offset
, guint offset2
)
921 connpointline_adjust_count(struct_member(base
,offset
,ConnPointLine
*),
922 prop
->connpoint_line_data
,
923 &struct_member(base
,offset
,ConnPointLine
*)->end
);
926 static const PropertyOps connpoint_lineprop_ops
= {
927 (PropertyType_New
) connpoint_lineprop_new
,
928 (PropertyType_Free
) noopprop_free
,
929 (PropertyType_Copy
) connpoint_lineprop_copy
,
930 (PropertyType_Load
) connpoint_lineprop_load
,
931 (PropertyType_Save
) connpoint_lineprop_save
,
932 (PropertyType_GetWidget
) invalidprop_get_widget
,
933 (PropertyType_ResetWidget
) invalidprop_reset_widget
,
934 (PropertyType_SetFromWidget
) invalidprop_set_from_widget
,
936 (PropertyType_CanMerge
) noopprop_can_merge
,
937 (PropertyType_GetFromOffset
) connpoint_lineprop_get_from_offset
,
938 (PropertyType_SetFromOffset
) connpoint_lineprop_set_from_offset
942 /* ************************************************************** */
945 prop_geomtypes_register(void)
947 prop_type_register(PROP_TYPE_REAL
,&realprop_ops
);
948 prop_type_register(PROP_TYPE_LENGTH
,&lengthprop_ops
);
949 prop_type_register(PROP_TYPE_FONTSIZE
,&fontsizeprop_ops
);
950 prop_type_register(PROP_TYPE_POINT
,&pointprop_ops
);
951 prop_type_register(PROP_TYPE_POINTARRAY
,&pointarrayprop_ops
);
952 prop_type_register(PROP_TYPE_BEZPOINTARRAY
,&bezpointarrayprop_ops
);
953 prop_type_register(PROP_TYPE_RECT
,&rectprop_ops
);
954 prop_type_register(PROP_TYPE_ENDPOINTS
,&endpointsprop_ops
);
955 prop_type_register(PROP_TYPE_CONNPOINT_LINE
,&connpoint_lineprop_ops
);