1 /* Fo
2  * fo-property-border-color.c: 'border-color' property
3  *
4  * Copyright (C) 2001 Sun Microsystems
5  * Copyright (C) 2007 Menteith Consulting Ltd
6  *
7  * See COPYING for the status of this software.
8  */
9 
10 #include <string.h>
11 #include "fo-utils.h"
12 #include "fo-context.h"
13 #include "datatype/fo-datatype.h"
14 #include "property/fo-property-private.h"
15 #include "property/fo-property-font-size.h"
16 #include "property/fo-property-border-color.h"
17 #include "property/fo-property-util.h"
18 
19 /* border-color */
20 /* Inherited: FALSE */
21 /* Shorthand: TRUE */
22 /* [ <color> | transparent ]{1,4} | inherit */
23 /* Initial value: see individual properties */
24 
25 struct _FoPropertyBorderColor
26 {
27   FoProperty parent_instance;
28 };
29 
30 struct _FoPropertyBorderColorClass
31 {
32   FoPropertyClass parent_class;
33 };
34 
35 static void fo_property_border_color_init         (FoPropertyBorderColor      *property_border_color);
36 static void fo_property_border_color_class_init   (FoPropertyBorderColorClass *klass);
37 static void fo_property_border_color_finalize     (GObject       *object);
38 
39 static FoDatatype * fo_property_border_color_validate (FoDatatype *datatype,
40 						       FoContext  *context,
41 						       GError    **error);
42 
43 static const gchar class_name[] = "border-color";
44 static gpointer parent_class;
45 
46 /**
47  * fo_property_border_color_get_type:
48  *
49  * Register the #FoPropertyBorderColor type if not already registered and
50  * return its #GType value.
51  *
52  * Return value: #GType of #FoPropertyBorderColor.
53  **/
54 GType
fo_property_border_color_get_type(void)55 fo_property_border_color_get_type (void)
56 {
57   static GType object_type = 0;
58 
59   if (!object_type)
60     {
61       static const GTypeInfo object_info =
62       {
63         sizeof (FoPropertyBorderColorClass),
64         NULL,           /* base_init */
65         NULL,           /* base_finalize */
66         (GClassInitFunc) fo_property_border_color_class_init,
67         NULL,           /* class_finalize */
68         NULL,           /* class_data */
69         sizeof (FoPropertyBorderColor),
70         0,              /* n_preallocs */
71         (GInstanceInitFunc) fo_property_border_color_init,
72 	NULL		/* value_table */
73       };
74 
75       object_type = g_type_register_static (FO_TYPE_PROPERTY,
76                                             class_name,
77                                             &object_info, 0);
78     }
79 
80   return object_type;
81 }
82 
83 /**
84  * fo_property_border_color_init:
85  * @border_color: #FoPropertyBorderColor object to initialise.
86  *
87  * Implements #GInstanceInitFunc for #FoPropertyBorderColor.
88  **/
89 void
fo_property_border_color_init(FoPropertyBorderColor * border_color)90 fo_property_border_color_init (FoPropertyBorderColor *border_color)
91 {
92   FO_PROPERTY (border_color)->value =
93       NULL;
94 }
95 
96 /**
97  * fo_property_border_color_class_init:
98  * @klass: #FoPropertyBorderColorClass object to initialise.
99  *
100  * Implements #GClassInitFunc for #FoPropertyBorderColorClass.
101  **/
102 void
fo_property_border_color_class_init(FoPropertyBorderColorClass * klass)103 fo_property_border_color_class_init (FoPropertyBorderColorClass *klass)
104 {
105   GObjectClass *object_class = G_OBJECT_CLASS (klass);
106   FoPropertyClass *property_class = FO_PROPERTY_CLASS (klass);
107 
108   parent_class = g_type_class_peek_parent (klass);
109 
110   object_class->finalize = fo_property_border_color_finalize;
111 
112   property_class->expr_eval = fo_expr_border_color_eval;
113   property_class->is_inherited = FALSE;
114   property_class->is_shorthand = TRUE;
115   property_class->resolve_enum =
116     fo_property_util_resolve_color_transparent_enum;
117   property_class->validate =
118     fo_property_border_color_validate;
119   property_class->get_initial =
120     fo_property_border_color_get_initial;
121 }
122 
123 /**
124  * fo_property_border_color_finalize:
125  * @object: #FoPropertyBorderColor object to finalize.
126  *
127  * Implements #GObjectFinalizeFunc for #FoPropertyBorderColor.
128  **/
129 void
fo_property_border_color_finalize(GObject * object)130 fo_property_border_color_finalize (GObject *object)
131 {
132   FoPropertyBorderColor *border_color;
133 
134   border_color = FO_PROPERTY_BORDER_COLOR (object);
135 
136   G_OBJECT_CLASS (parent_class)->finalize (object);
137 }
138 
139 
140 /**
141  * fo_property_border_color_new:
142  *
143  * Creates a new #FoPropertyBorderColor initialized to default value.
144  *
145  * Return value: the new #FoPropertyBorderColor.
146  **/
147 FoProperty*
fo_property_border_color_new(void)148 fo_property_border_color_new (void)
149 {
150   FoProperty* border_color;
151 
152   border_color =
153     FO_PROPERTY (g_object_new (fo_property_border_color_get_type (),
154                                NULL));
155 
156   return border_color;
157 }
158 
159 /**
160  * fo_property_border_color_validate:
161  * @datatype: #FoDatatype to be validated against allowed datatypes and
162  *            values for current property.
163  * @context:  #FoContext object from which to possibly inherit values.
164  * @error:    Information about any error that has occurred.
165  *
166  * Validates @datatype against allowed values.  Returns @datatype, a
167  * replacement datatype value, or NULL if validation failed.
168  *
169  * Return value: Valid datatype value or NULL.
170  **/
171 FoDatatype*
fo_property_border_color_validate(FoDatatype * datatype,FoContext * context,GError ** error)172 fo_property_border_color_validate (FoDatatype *datatype,
173 				   FoContext  *context,
174 				   GError    **error)
175 {
176   g_return_val_if_fail (datatype != NULL, NULL);
177   g_return_val_if_fail (FO_IS_DATATYPE (datatype), NULL);
178   g_return_val_if_fail (context != NULL, NULL);
179   g_return_val_if_fail (FO_IS_CONTEXT (context), NULL);
180   g_return_val_if_fail (error == NULL || *error == NULL, NULL);
181 
182   if (FO_IS_TBLR (datatype))
183     {
184       return datatype;
185     }
186   else
187     {
188       gchar *datatype_sprintf = fo_object_sprintf (datatype);
189 
190       g_set_error (error,
191 		   FO_FO_ERROR,
192 		   FO_FO_ERROR_DATATYPE,
193 		   _(fo_fo_error_messages[FO_FO_ERROR_DATATYPE]),
194 		   class_name,
195 		   datatype_sprintf,
196 		   g_type_name (G_TYPE_FROM_INSTANCE (datatype)));
197 
198       g_object_unref (datatype);
199 
200       g_free (datatype_sprintf);
201 
202       return NULL;
203     }
204 }
205 
206 /**
207  * fo_property_border_color_get_initial:
208  *
209  * Get an instance of the property with the correct initial value.
210  *
211  * Return value: An instance of the property.
212  **/
213 FoProperty*
fo_property_border_color_get_initial(void)214 fo_property_border_color_get_initial (void)
215 {
216   static FoProperty *border_color = NULL;
217 
218   if (border_color == NULL)
219     {
220       border_color =
221 	fo_property_border_color_new ();
222     }
223 
224   return border_color;
225 }
226