+ g_return_val_if_fail (label && GL_IS_LABEL (label), FALSE);
+
+ selection_list = gl_label_get_selection_list (label);
+
+ for (p = selection_list; p != NULL; p = p->next)
+ {
+ object = GL_LABEL_OBJECT (p->data);
+
+ if (gl_label_object_can_line_width (object))
+ {
+ g_list_free (selection_list);
+ return TRUE;
+ }
+
+ }
+
+ g_list_free (selection_list);
+ return FALSE;
+}
+
+
+/*****************************************************************************/
+/* Delete selection from label. */
+/*****************************************************************************/
+void
+gl_label_delete_selection (glLabel *label)
+{
+ GList *selection_list;
+ GList *p;
+ glLabelObject *object;
+
+ gl_debug (DEBUG_LABEL, "START");
+
+ g_return_if_fail (label && GL_IS_LABEL (label));
+
+ gl_label_checkpoint (label, _("Delete"));
+
+ begin_selection_op (label);
+
+ selection_list = gl_label_get_selection_list (label);
+
+ for ( p = selection_list; p != NULL; p = p->next )
+ {
+ object = GL_LABEL_OBJECT (p->data);
+
+ gl_label_delete_object (label, object);
+ }
+
+ g_list_free (selection_list);
+
+ end_selection_op (label);
+
+ gl_debug (DEBUG_LABEL, "END");
+}
+
+
+/****************************************************************************/
+/* Bring selection object to front/top. */
+/****************************************************************************/
+void
+gl_label_raise_selection_to_top (glLabel *label)
+{
+ GList *selection_list;
+ GList *p;
+ glLabelObject *object;
+
+ gl_debug (DEBUG_LABEL, "START");
+
+ gl_label_checkpoint (label, _("Bring to front"));
+
+ begin_selection_op (label);
+
+ selection_list = gl_label_get_selection_list (label);
+
+ for ( p = selection_list; p != NULL; p = p->next )
+ {
+ object = GL_LABEL_OBJECT (p->data);
+
+ label->priv->object_list = g_list_remove (label->priv->object_list, object);
+ }
+
+ /* Move to end of list, representing front most object */
+ label->priv->object_list = g_list_concat (label->priv->object_list, selection_list);
+
+ do_modify (label);
+
+ end_selection_op (label);
+
+ gl_debug (DEBUG_LABEL, "END");
+}
+
+
+/****************************************************************************/
+/* Send selection to rear/bottom. */
+/****************************************************************************/
+void
+gl_label_lower_selection_to_bottom (glLabel *label)
+{
+ GList *selection_list;
+ GList *p;
+ glLabelObject *object;
+
+ gl_debug (DEBUG_LABEL, "START");
+
+ gl_label_checkpoint (label, _("Send to back"));
+
+ begin_selection_op (label);
+
+ selection_list = gl_label_get_selection_list (label);
+
+ for ( p = selection_list; p != NULL; p = p->next )
+ {
+ object = GL_LABEL_OBJECT (p->data);
+
+ label->priv->object_list = g_list_remove (label->priv->object_list, object);
+ }
+
+ /* Move to front of list, representing rear most object */
+ label->priv->object_list = g_list_concat (selection_list, label->priv->object_list);
+
+ do_modify (label);
+
+ end_selection_op (label);
+
+ gl_debug (DEBUG_LABEL, "END");
+}
+
+
+/*****************************************************************************/
+/* Rotate selected objects by given angle. */
+/*****************************************************************************/
+void
+gl_label_rotate_selection (glLabel *label,
+ gdouble theta_degs)
+{
+ GList *selection_list;
+ GList *p;
+ glLabelObject *object;
+
+ gl_debug (DEBUG_LABEL, "START");
+
+ g_return_if_fail (label && GL_IS_LABEL (label));
+
+ begin_selection_op (label);
+
+ gl_label_checkpoint (label, _("Rotate"));
+
+ selection_list = gl_label_get_selection_list (label);
+
+ for ( p = selection_list; p != NULL; p = p->next )
+ {
+ object = GL_LABEL_OBJECT (p->data);
+
+ gl_label_object_rotate (object, theta_degs);
+ }
+
+ g_list_free (selection_list);
+
+ end_selection_op (label);
+
+ gl_debug (DEBUG_LABEL, "END");
+}
+
+
+/*****************************************************************************/
+/* Rotate selected objects 90 degrees left. */
+/*****************************************************************************/
+void
+gl_label_rotate_selection_left (glLabel *label)
+{
+ GList *selection_list;
+ GList *p;
+ glLabelObject *object;
+
+ gl_debug (DEBUG_LABEL, "START");
+
+ g_return_if_fail (label && GL_IS_LABEL (label));
+
+ begin_selection_op (label);
+
+ gl_label_checkpoint (label, _("Rotate left"));
+
+ selection_list = gl_label_get_selection_list (label);
+
+ for ( p = selection_list; p != NULL; p = p->next )
+ {
+ object = GL_LABEL_OBJECT (p->data);
+
+ gl_label_object_rotate (object, -90.0);
+ }
+
+ g_list_free (selection_list);
+
+ end_selection_op (label);
+
+ gl_debug (DEBUG_LABEL, "END");
+}
+
+
+/*****************************************************************************/
+/* Rotate selected objects 90 degrees right. */
+/*****************************************************************************/
+void
+gl_label_rotate_selection_right (glLabel *label)
+{
+ GList *selection_list;
+ GList *p;
+ glLabelObject *object;
+
+ gl_debug (DEBUG_LABEL, "START");
+
+ g_return_if_fail (label && GL_IS_LABEL (label));
+
+ gl_label_checkpoint (label, _("Rotate right"));
+
+ begin_selection_op (label);
+
+ selection_list = gl_label_get_selection_list (label);
+
+ for ( p = selection_list; p != NULL; p = p->next )
+ {
+ object = GL_LABEL_OBJECT (p->data);
+
+ gl_label_object_rotate (object, 90.0);
+ }
+
+ g_list_free (selection_list);
+
+ end_selection_op (label);
+
+ gl_debug (DEBUG_LABEL, "END");
+}
+
+
+/*****************************************************************************/
+/* Flip selected objects horizontally. */
+/*****************************************************************************/
+void
+gl_label_flip_selection_horiz (glLabel *label)
+{
+ GList *selection_list;
+ GList *p;
+ glLabelObject *object;
+
+ gl_debug (DEBUG_LABEL, "START");
+
+ g_return_if_fail (label && GL_IS_LABEL (label));
+
+ gl_label_checkpoint (label, _("Flip horizontally"));
+
+ begin_selection_op (label);
+
+ selection_list = gl_label_get_selection_list (label);
+
+ for ( p = selection_list; p != NULL; p = p->next )
+ {
+ object = GL_LABEL_OBJECT (p->data);
+
+ gl_label_object_flip_horiz (object);
+ }
+
+ g_list_free (selection_list);
+
+ end_selection_op (label);
+
+ gl_debug (DEBUG_LABEL, "END");
+}
+
+
+/*****************************************************************************/
+/* Flip selected objects vertically. */
+/*****************************************************************************/
+void
+gl_label_flip_selection_vert (glLabel *label)
+{
+ GList *selection_list;
+ GList *p;
+ glLabelObject *object;
+
+ gl_debug (DEBUG_LABEL, "START");
+
+ g_return_if_fail (label && GL_IS_LABEL (label));
+
+ gl_label_checkpoint (label, _("Flip vertically"));
+
+ begin_selection_op (label);
+
+ selection_list = gl_label_get_selection_list (label);
+
+ for ( p = selection_list; p != NULL; p = p->next )
+ {
+ object = GL_LABEL_OBJECT (p->data);
+
+ gl_label_object_flip_vert (object);
+ }
+
+ g_list_free (selection_list);
+
+ end_selection_op (label);
+
+ gl_debug (DEBUG_LABEL, "END");
+}
+
+
+/*****************************************************************************/
+/* Align selected objects to left most edge. */
+/*****************************************************************************/
+void
+gl_label_align_selection_left (glLabel *label)
+{
+ GList *selection_list;
+ GList *p;
+ glLabelObject *object;
+ gdouble dx, x1_min;
+ glLabelRegion obj_extent;
+
+ gl_debug (DEBUG_LABEL, "START");
+
+ g_return_if_fail (label && GL_IS_LABEL (label));
+
+ g_return_if_fail (!gl_label_is_selection_empty (label) &&
+ !gl_label_is_selection_atomic (label));
+
+ gl_label_checkpoint (label, _("Align left"));
+
+ begin_selection_op (label);
+
+ selection_list = gl_label_get_selection_list (label);
+
+ /* find left most edge */
+ p = selection_list;
+ object = GL_LABEL_OBJECT (p->data);
+
+ gl_label_object_get_extent (object, &obj_extent);
+ x1_min = obj_extent.x1;
+ for (p = p->next; p != NULL; p = p->next)
+ {
+ object = GL_LABEL_OBJECT (p->data);
+
+ gl_label_object_get_extent (object, &obj_extent);
+ if ( obj_extent.x1 < x1_min ) x1_min = obj_extent.x1;
+ }
+
+ /* now adjust the object positions to line up the left edges */
+ for (p = selection_list; p != NULL; p = p->next)
+ {
+ object = GL_LABEL_OBJECT (p->data);
+
+ gl_label_object_get_extent (object, &obj_extent);
+ dx = x1_min - obj_extent.x1;
+ gl_label_object_set_position_relative (object, dx, 0.0, FALSE);
+ }
+
+ g_list_free (selection_list);
+
+ end_selection_op (label);
+
+ gl_debug (DEBUG_LABEL, "END");
+}
+
+
+/*****************************************************************************/
+/* Align selected objects to right most edge. */
+/*****************************************************************************/
+void
+gl_label_align_selection_right (glLabel *label)
+{
+ GList *selection_list;
+ GList *p;
+ glLabelObject *object;
+ gdouble dx, x2_max;
+ glLabelRegion obj_extent;
+
+ gl_debug (DEBUG_LABEL, "START");
+
+ g_return_if_fail (label && GL_IS_LABEL (label));
+
+ g_return_if_fail (!gl_label_is_selection_empty (label) &&
+ !gl_label_is_selection_atomic (label));
+
+ gl_label_checkpoint (label, _("Align right"));
+
+ begin_selection_op (label);
+
+ selection_list = gl_label_get_selection_list (label);
+
+ /* find left most edge */
+ p = selection_list;
+ object = GL_LABEL_OBJECT (p->data);
+
+ gl_label_object_get_extent (object, &obj_extent);
+ x2_max = obj_extent.x2;
+ for (p = p->next; p != NULL; p = p->next)
+ {
+ object = GL_LABEL_OBJECT (p->data);
+
+ gl_label_object_get_extent (object, &obj_extent);
+ if ( obj_extent.x2 > x2_max ) x2_max = obj_extent.x2;
+ }
+
+ /* now adjust the object positions to line up the left edges */
+ for (p = selection_list; p != NULL; p = p->next)
+ {
+ object = GL_LABEL_OBJECT (p->data);
+
+ gl_label_object_get_extent (object, &obj_extent);
+ dx = x2_max - obj_extent.x2;
+ gl_label_object_set_position_relative (object, dx, 0.0, FALSE);
+ }
+
+ g_list_free (selection_list);
+
+ end_selection_op (label);
+
+ gl_debug (DEBUG_LABEL, "END");
+}
+
+
+/*****************************************************************************/
+/* Align selected objects to horizontal center of objects. */
+/*****************************************************************************/
+void
+gl_label_align_selection_hcenter (glLabel *label)
+{
+ GList *selection_list;
+ GList *p;
+ glLabelObject *object;
+ gdouble dx;
+ gdouble dxmin;
+ gdouble xsum, xavg;
+ glLabelRegion obj_extent;
+ gdouble xcenter;
+ gint n;
+
+ gl_debug (DEBUG_LABEL, "START");
+
+ g_return_if_fail (label && GL_IS_LABEL (label));
+
+ g_return_if_fail (!gl_label_is_selection_empty (label) &&
+ !gl_label_is_selection_atomic (label));
+
+ gl_label_checkpoint (label, _("Align horizontal center"));
+
+ begin_selection_op (label);
+
+ selection_list = gl_label_get_selection_list (label);
+
+ /* find average center of objects */
+ xsum = 0.0;
+ n = 0;
+ for (p = selection_list; p != NULL; p = p->next)
+ {
+ object = GL_LABEL_OBJECT (p->data);
+
+ gl_label_object_get_extent (object, &obj_extent);
+ xsum += (obj_extent.x1 + obj_extent.x2) / 2.0;
+ n++;
+ }
+ xavg = xsum / n;
+
+ /* find center of object closest to average center */
+ p = selection_list;
+ object = GL_LABEL_OBJECT (p->data);
+
+ gl_label_object_get_extent (object, &obj_extent);
+ dxmin = fabs (xavg - (obj_extent.x1 + obj_extent.x2)/2.0);
+ xcenter = (obj_extent.x1 + obj_extent.x2)/2.0;
+ for (p = p->next; p != NULL; p = p->next)
+ {
+ object = GL_LABEL_OBJECT (p->data);
+
+ gl_label_object_get_extent (object, &obj_extent);
+ dx = fabs (xavg - (obj_extent.x1 + obj_extent.x2)/2.0);
+ if ( dx < dxmin )
+ {
+ dxmin = dx;
+ xcenter = (obj_extent.x1 + obj_extent.x2)/2.0;
+ }
+ }
+
+ /* now adjust the object positions to line up this center */
+ for (p = selection_list; p != NULL; p = p->next)
+ {
+ object = GL_LABEL_OBJECT (p->data);
+
+ gl_label_object_get_extent (object, &obj_extent);
+ dx = xcenter - (obj_extent.x1 + obj_extent.x2)/2.0;
+ gl_label_object_set_position_relative (object, dx, 0.0, FALSE);
+ }
+
+ g_list_free (selection_list);
+
+ end_selection_op (label);
+
+ gl_debug (DEBUG_LABEL, "END");
+}
+
+
+/*****************************************************************************/
+/* Align selected objects to top most edge. */
+/*****************************************************************************/
+void
+gl_label_align_selection_top (glLabel *label)
+{
+ GList *selection_list;
+ GList *p;
+ glLabelObject *object;
+ gdouble dy, y1_min;
+ glLabelRegion obj_extent;
+
+ gl_debug (DEBUG_LABEL, "START");
+
+ g_return_if_fail (label && GL_IS_LABEL (label));
+
+ g_return_if_fail (!gl_label_is_selection_empty (label) &&
+ !gl_label_is_selection_atomic (label));
+
+ gl_label_checkpoint (label, _("Align tops"));
+
+ begin_selection_op (label);
+
+ selection_list = gl_label_get_selection_list (label);
+
+ /* find top most edge */
+ p = selection_list;
+ object = GL_LABEL_OBJECT (p->data);
+
+ gl_label_object_get_extent (object, &obj_extent);
+ y1_min = obj_extent.y1;
+ for (p = p->next; p != NULL; p = p->next)
+ {
+ object = GL_LABEL_OBJECT (p->data);
+
+ gl_label_object_get_extent (object, &obj_extent);
+ if ( obj_extent.y1 < y1_min ) y1_min = obj_extent.y1;
+ }
+
+ /* now adjust the object positions to line up the top edges */
+ for (p = selection_list; p != NULL; p = p->next)
+ {
+ object = GL_LABEL_OBJECT (p->data);
+
+ gl_label_object_get_extent (object, &obj_extent);
+ dy = y1_min - obj_extent.y1;
+ gl_label_object_set_position_relative (object, 0.0, dy, FALSE);
+ }
+
+ g_list_free (selection_list);
+
+ end_selection_op (label);
+
+ gl_debug (DEBUG_LABEL, "END");
+}
+
+
+/*****************************************************************************/
+/* Align selected objects to bottom most edge. */
+/*****************************************************************************/
+void
+gl_label_align_selection_bottom (glLabel *label)
+{
+ GList *selection_list;
+ GList *p;
+ glLabelObject *object;
+ gdouble dy, y2_max;
+ glLabelRegion obj_extent;
+
+ gl_debug (DEBUG_LABEL, "START");
+
+ g_return_if_fail (label && GL_IS_LABEL (label));
+
+ g_return_if_fail (!gl_label_is_selection_empty (label) &&
+ !gl_label_is_selection_atomic (label));
+
+ gl_label_checkpoint (label, _("Align bottoms"));
+
+ begin_selection_op (label);
+
+ selection_list = gl_label_get_selection_list (label);
+
+ /* find bottom most edge */
+ p = selection_list;
+ object = GL_LABEL_OBJECT (p->data);
+
+ gl_label_object_get_extent (object, &obj_extent);
+ y2_max = obj_extent.y2;
+ for (p = p->next; p != NULL; p = p->next)
+ {
+ object = GL_LABEL_OBJECT (p->data);
+
+ gl_label_object_get_extent (object, &obj_extent);
+ if ( obj_extent.y2 > y2_max ) y2_max = obj_extent.y2;
+ }
+
+ /* now adjust the object positions to line up the bottom edges */
+ for (p = selection_list; p != NULL; p = p->next)
+ {
+ object = GL_LABEL_OBJECT (p->data);
+
+ gl_label_object_get_extent (object, &obj_extent);
+ dy = y2_max - obj_extent.y2;
+ gl_label_object_set_position_relative (object, 0.0, dy, FALSE);
+ }
+
+ g_list_free (selection_list);
+
+ end_selection_op (label);
+
+ gl_debug (DEBUG_LABEL, "END");
+}
+
+
+/*****************************************************************************/
+/* Align selected objects to viertical center of objects. */
+/*****************************************************************************/
+void
+gl_label_align_selection_vcenter (glLabel *label)
+{
+ GList *selection_list;
+ GList *p;
+ glLabelObject *object;
+ gdouble dy;
+ gdouble dymin;
+ gdouble ysum, yavg;
+ glLabelRegion obj_extent;
+ gdouble ycenter;
+ gint n;
+
+ gl_debug (DEBUG_LABEL, "START");
+
+ g_return_if_fail (label && GL_IS_LABEL (label));
+
+ g_return_if_fail (!gl_label_is_selection_empty (label) &&
+ !gl_label_is_selection_atomic (label));
+
+ gl_label_checkpoint (label, _("Align vertical center"));
+
+ begin_selection_op (label);
+
+ selection_list = gl_label_get_selection_list (label);
+
+ /* find average center of objects */
+ ysum = 0.0;
+ n = 0;
+ for (p = selection_list; p != NULL; p = p->next)
+ {
+ object = GL_LABEL_OBJECT (p->data);
+
+ gl_label_object_get_extent (object, &obj_extent);
+ ysum += (obj_extent.y1 + obj_extent.y2) / 2.0;
+ n++;
+ }
+ yavg = ysum / n;
+
+ /* find center of object closest to average center */
+ p = selection_list;
+ object = GL_LABEL_OBJECT (p->data);
+
+ gl_label_object_get_extent (object, &obj_extent);
+ dymin = fabs (yavg - (obj_extent.y1 + obj_extent.y2)/2.0);
+ ycenter = (obj_extent.y1 + obj_extent.y2)/2.0;
+ for (p = p->next; p != NULL; p = p->next)
+ {
+ object = GL_LABEL_OBJECT (p->data);
+
+ gl_label_object_get_extent (object, &obj_extent);
+ dy = fabs (yavg - (obj_extent.y1 + obj_extent.y2)/2.0);
+ if ( dy < dymin )
+ {
+ dymin = dy;
+ ycenter = (obj_extent.y1 + obj_extent.y2)/2.0;
+ }
+ }
+
+ /* now adjust the object positions to line up this center */
+ for (p = selection_list; p != NULL; p = p->next)
+ {
+ object = GL_LABEL_OBJECT (p->data);
+
+ gl_label_object_get_extent (object, &obj_extent);
+ dy = ycenter - (obj_extent.y1 + obj_extent.y2)/2.0;
+ gl_label_object_set_position_relative (object, 0.0, dy, FALSE);
+ }
+
+ g_list_free (selection_list);
+
+ end_selection_op (label);
+
+ gl_debug (DEBUG_LABEL, "END");
+}
+
+
+/*****************************************************************************/
+/* Center selected objects to in center of label. */
+/*****************************************************************************/
+void
+gl_label_center_selection_horiz (glLabel *label)
+{
+ GList *selection_list;
+ GList *p;
+ glLabelObject *object;
+ gdouble dx;
+ gdouble x_label_center;
+ gdouble x_obj_center;
+ glLabelRegion obj_extent;
+ gdouble w, h;
+
+ gl_debug (DEBUG_LABEL, "START");
+
+ g_return_if_fail (label && GL_IS_LABEL (label));
+
+ g_return_if_fail (!gl_label_is_selection_empty (label));
+
+ gl_label_checkpoint (label, _("Center horizontally"));
+
+ begin_selection_op (label);
+
+ gl_label_get_size (label, &w, &h);
+ x_label_center = w / 2.0;
+
+ /* adjust the object positions */
+ selection_list = gl_label_get_selection_list (label);
+ for (p = selection_list; p != NULL; p = p->next)
+ {
+ object = GL_LABEL_OBJECT (p->data);
+
+ gl_label_object_get_extent (object, &obj_extent);
+ x_obj_center = (obj_extent.x1 + obj_extent.x2) / 2.0;
+ dx = x_label_center - x_obj_center;
+ gl_label_object_set_position_relative (object, dx, 0.0, FALSE);
+ }
+ g_list_free (selection_list);
+
+ end_selection_op (label);
+
+ gl_debug (DEBUG_LABEL, "END");
+}
+
+
+/*****************************************************************************/
+/* Center selected objects to in center of label. */
+/*****************************************************************************/
+void
+gl_label_center_selection_vert (glLabel *label)
+{
+ GList *selection_list;
+ GList *p;
+ glLabelObject *object;
+ gdouble dy;
+ gdouble y_label_center;
+ gdouble y_obj_center;
+ glLabelRegion obj_extent;
+ gdouble w, h;
+
+ gl_debug (DEBUG_LABEL, "START");
+
+ g_return_if_fail (label && GL_IS_LABEL (label));
+
+ g_return_if_fail (!gl_label_is_selection_empty (label));
+
+ gl_label_checkpoint (label, _("Center vertically"));
+
+ begin_selection_op (label);
+
+ gl_label_get_size (label, &w, &h);
+ y_label_center = h / 2.0;
+
+ /* adjust the object positions */
+ selection_list = gl_label_get_selection_list (label);
+ for (p = selection_list; p != NULL; p = p->next)
+ {
+ object = GL_LABEL_OBJECT (p->data);
+
+ gl_label_object_get_extent (object, &obj_extent);
+ y_obj_center = (obj_extent.y1 + obj_extent.y2) / 2.0;
+ dy = y_label_center - y_obj_center;
+ gl_label_object_set_position_relative (object, 0.0, dy, FALSE);
+ }
+ g_list_free (selection_list);
+
+ end_selection_op (label);
+
+ gl_debug (DEBUG_LABEL, "END");
+}
+
+
+/*****************************************************************************/
+/* Move selected objects */
+/*****************************************************************************/
+void
+gl_label_move_selection (glLabel *label,
+ gdouble dx,
+ gdouble dy)
+{
+ GList *selection_list;
+ GList *p;
+ glLabelObject *object;
+
+ gl_debug (DEBUG_LABEL, "START");
+
+ g_return_if_fail (label && GL_IS_LABEL (label));
+
+ begin_selection_op (label);
+
+ selection_list = gl_label_get_selection_list (label);
+
+ for (p = selection_list; p != NULL; p = p->next)
+ {
+ object = GL_LABEL_OBJECT (p->data);
+
+ gl_label_object_set_position_relative (object, dx, dy, TRUE);
+ }
+
+ g_list_free (selection_list);
+
+ end_selection_op (label);
+
+ gl_debug (DEBUG_LABEL, "END");
+}
+
+
+/*****************************************************************************/
+/* Set font family for all text contained in selected objects. */
+/*****************************************************************************/
+void
+gl_label_set_selection_font_family (glLabel *label,
+ const gchar *font_family)
+{
+ GList *selection_list;
+ GList *p;
+ glLabelObject *object;
+
+ gl_debug (DEBUG_LABEL, "START");
+
+ g_return_if_fail (label && GL_IS_LABEL (label));
+
+ begin_selection_op (label);
+
+ selection_list = gl_label_get_selection_list (label);
+
+ for (p = selection_list; p != NULL; p = p->next)
+ {
+ object = GL_LABEL_OBJECT (p->data);
+ gl_label_object_set_font_family (object, font_family, TRUE);
+ }
+
+ g_list_free (selection_list);
+
+ end_selection_op (label);
+
+ gl_debug (DEBUG_LABEL, "END");
+}
+
+
+/*****************************************************************************/
+/* Set font size for all text contained in selected objects. */
+/*****************************************************************************/
+void
+gl_label_set_selection_font_size (glLabel *label,
+ gdouble font_size)
+{
+ GList *selection_list;
+ GList *p;
+ glLabelObject *object;
+
+ gl_debug (DEBUG_LABEL, "START");
+
+ g_return_if_fail (label && GL_IS_LABEL (label));
+
+ begin_selection_op (label);
+
+ selection_list = gl_label_get_selection_list (label);
+
+ for (p = selection_list; p != NULL; p = p->next)
+ {
+ object = GL_LABEL_OBJECT (p->data);
+ gl_label_object_set_font_size (object, font_size, TRUE);
+ }
+
+ g_list_free (selection_list);
+
+ end_selection_op (label);
+
+ gl_debug (DEBUG_LABEL, "END");
+}
+
+
+/*****************************************************************************/
+/* Set font weight for all text contained in selected objects. */
+/*****************************************************************************/
+void
+gl_label_set_selection_font_weight (glLabel *label,
+ PangoWeight font_weight)
+{
+ GList *selection_list;
+ GList *p;
+ glLabelObject *object;
+
+ gl_debug (DEBUG_LABEL, "START");
+
+ g_return_if_fail (label && GL_IS_LABEL (label));
+
+ begin_selection_op (label);
+
+ selection_list = gl_label_get_selection_list (label);
+
+ for (p = selection_list; p != NULL; p = p->next)
+ {
+ object = GL_LABEL_OBJECT (p->data);
+ gl_label_object_set_font_weight (object, font_weight, TRUE);
+ }
+
+ g_list_free (selection_list);
+
+ end_selection_op (label);
+
+ gl_debug (DEBUG_LABEL, "END");
+}
+
+
+/*****************************************************************************/
+/* Set font italic flag for all text contained in selected objects. */
+/*****************************************************************************/
+void
+gl_label_set_selection_font_italic_flag (glLabel *label,
+ gboolean font_italic_flag)
+{
+ GList *selection_list;
+ GList *p;
+ glLabelObject *object;
+
+ gl_debug (DEBUG_LABEL, "START");
+
+ g_return_if_fail (label && GL_IS_LABEL (label));
+
+ begin_selection_op (label);
+
+ selection_list = gl_label_get_selection_list (label);
+
+ for (p = selection_list; p != NULL; p = p->next)
+ {
+ object = GL_LABEL_OBJECT (p->data);
+ gl_label_object_set_font_italic_flag (object, font_italic_flag, TRUE);
+ }
+
+ g_list_free (selection_list);
+
+ end_selection_op (label);
+
+ gl_debug (DEBUG_LABEL, "END");
+}
+
+
+/*****************************************************************************/
+/* Set text alignment for all text contained in selected objects. */
+/*****************************************************************************/
+void
+gl_label_set_selection_text_alignment (glLabel *label,
+ PangoAlignment text_alignment)
+{
+ GList *selection_list;
+ GList *p;
+ glLabelObject *object;
+
+ gl_debug (DEBUG_LABEL, "START");
+
+ g_return_if_fail (label && GL_IS_LABEL (label));
+
+ begin_selection_op (label);
+
+ selection_list = gl_label_get_selection_list (label);
+
+ for (p = selection_list; p != NULL; p = p->next)
+ {
+ object = GL_LABEL_OBJECT (p->data);
+ gl_label_object_set_text_alignment (object, text_alignment, TRUE);
+ }
+
+ g_list_free (selection_list);
+
+ end_selection_op (label);
+
+ gl_debug (DEBUG_LABEL, "END");
+}
+
+
+/*****************************************************************************/
+/* Set text line spacing for all text contained in selected objects. */
+/*****************************************************************************/
+void
+gl_label_set_selection_text_line_spacing (glLabel *label,
+ gdouble text_line_spacing)
+{
+ GList *selection_list;
+ GList *p;
+ glLabelObject *object;
+
+ gl_debug (DEBUG_LABEL, "START");
+
+ g_return_if_fail (label && GL_IS_LABEL (label));
+
+ begin_selection_op (label);
+
+ selection_list = gl_label_get_selection_list (label);
+
+ for (p = selection_list; p != NULL; p = p->next)
+ {
+ object = GL_LABEL_OBJECT (p->data);
+ gl_label_object_set_text_line_spacing (object, text_line_spacing, TRUE);
+ }
+
+ g_list_free (selection_list);
+
+ end_selection_op (label);
+
+ gl_debug (DEBUG_LABEL, "END");
+}
+
+
+/*****************************************************************************/
+/* Set text color for all text contained in selected objects. */
+/*****************************************************************************/
+void
+gl_label_set_selection_text_color (glLabel *label,
+ glColorNode *text_color_node)
+{
+ GList *selection_list;
+ GList *p;
+ glLabelObject *object;
+
+ gl_debug (DEBUG_LABEL, "START");
+
+ g_return_if_fail (label && GL_IS_LABEL (label));
+
+ begin_selection_op (label);
+
+ selection_list = gl_label_get_selection_list (label);
+
+ for (p = selection_list; p != NULL; p = p->next)
+ {
+ object = GL_LABEL_OBJECT (p->data);
+ gl_label_object_set_text_color (object, text_color_node, TRUE);
+ }
+
+ g_list_free (selection_list);
+
+ end_selection_op (label);
+
+ gl_debug (DEBUG_LABEL, "END");
+}
+
+
+/*****************************************************************************/
+/* Set fill color for all selected objects. */
+/*****************************************************************************/
+void
+gl_label_set_selection_fill_color (glLabel *label,
+ glColorNode *fill_color_node)
+{
+ GList *selection_list;
+ GList *p;
+ glLabelObject *object;
+
+ gl_debug (DEBUG_LABEL, "START");
+
+ g_return_if_fail (label && GL_IS_LABEL (label));
+
+ begin_selection_op (label);
+
+ selection_list = gl_label_get_selection_list (label);
+
+ for (p = selection_list; p != NULL; p = p->next)
+ {
+ object = GL_LABEL_OBJECT (p->data);
+ gl_label_object_set_fill_color (object, fill_color_node, TRUE);
+ }
+
+ g_list_free (selection_list);
+
+ end_selection_op (label);
+
+ gl_debug (DEBUG_LABEL, "END");
+}
+
+
+/*****************************************************************************/
+/* Set line color for all selected objects. */
+/*****************************************************************************/
+void
+gl_label_set_selection_line_color (glLabel *label,
+ glColorNode *line_color_node)
+{
+ GList *selection_list;
+ GList *p;
+ glLabelObject *object;
+
+ gl_debug (DEBUG_LABEL, "START");
+
+ g_return_if_fail (label && GL_IS_LABEL (label));
+
+ begin_selection_op (label);
+
+ selection_list = gl_label_get_selection_list (label);
+
+ for (p = selection_list; p != NULL; p = p->next)
+ {
+ object = GL_LABEL_OBJECT (p->data);
+ gl_label_object_set_line_color (object, line_color_node, TRUE);
+ }
+
+ g_list_free (selection_list);
+
+ end_selection_op (label);
+
+ gl_debug (DEBUG_LABEL, "END");
+}
+
+
+/*****************************************************************************/
+/* Set line width for all selected objects. */
+/*****************************************************************************/
+void
+gl_label_set_selection_line_width (glLabel *label,
+ gdouble line_width)
+{
+ GList *selection_list;
+ GList *p;
+ glLabelObject *object;
+
+ gl_debug (DEBUG_LABEL, "START");
+
+ g_return_if_fail (label && GL_IS_LABEL (label));
+
+ begin_selection_op (label);
+
+ selection_list = gl_label_get_selection_list (label);
+
+ for (p = selection_list; p != NULL; p = p->next)
+ {
+ object = GL_LABEL_OBJECT (p->data);
+ gl_label_object_set_line_width (object, line_width, TRUE);
+ }
+
+ g_list_free (selection_list);
+
+ end_selection_op (label);
+
+ gl_debug (DEBUG_LABEL, "END");
+}
+
+
+/*****************************************************************************/
+/* "Cut" selected items and place on clipboard. */
+/*****************************************************************************/
+void
+gl_label_cut_selection (glLabel *label)
+{
+ gl_debug (DEBUG_LABEL, "START");
+
+ g_return_if_fail (label && GL_IS_LABEL (label));
+
+ gl_label_copy_selection (label);
+ gl_label_delete_selection (label);
+
+ gl_debug (DEBUG_LABEL, "END");
+}
+
+
+/*****************************************************************************/
+/* "Copy" selected items to clipboard. */
+/*****************************************************************************/
+void
+gl_label_copy_selection (glLabel *label)
+{
+ GtkClipboard *clipboard;
+ GList *selection_list;
+ glLabel *label_copy;
+ GList *p;
+ glLabelObject *object;
+ glXMLLabelStatus status;
+
+ ClipboardData *data;
+
+ static GtkTargetEntry glabels_targets[] = { { "application/glabels", 0, 0 },
+ { "text/xml", 0, 0 },
+ };
+
+ GtkTargetList *target_list;
+ GtkTargetEntry *target_table;
+ gint n_targets;
+
+ gl_debug (DEBUG_LABEL, "START");
+
+ g_return_if_fail (label && GL_IS_LABEL (label));
+
+ clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
+
+ selection_list = gl_label_get_selection_list (label);
+
+ if (selection_list)
+ {
+
+ data = g_new0 (ClipboardData, 1);
+
+ target_list = gtk_target_list_new (glabels_targets, G_N_ELEMENTS(glabels_targets));
+
+ /*
+ * Serialize selection by encoding as an XML label document.
+ */
+ label_copy = GL_LABEL(gl_label_new ());
+
+ gl_label_set_template (label_copy, label->priv->template, FALSE);
+ gl_label_set_rotate_flag (label_copy, label->priv->rotate_flag, FALSE);
+
+ for (p = selection_list; p != NULL; p = p->next)
+ {
+ object = GL_LABEL_OBJECT (p->data);
+
+ gl_label_add_object (label_copy, gl_label_object_dup (object, label_copy));
+ }
+
+ data->xml_buffer = gl_xml_label_save_buffer (label_copy, &status);
+
+ g_object_unref (G_OBJECT (label_copy));
+
+
+ /*
+ * Is it an atomic text selection? If so, also make available as text.
+ */
+ if ( gl_label_is_selection_atomic (label) &&
+ GL_IS_LABEL_TEXT (selection_list->data) )
+ {
+ glLabelText *text_object = GL_LABEL_TEXT (selection_list->data);
+
+ gtk_target_list_add_text_targets (target_list, 1);
+
+ data->text = gl_label_text_get_text (text_object);
+ }
+
+
+ /*
+ * Is it an atomic image selection? If so, also make available as pixbuf.
+ */
+ if ( gl_label_is_selection_atomic (label) &&
+ GL_IS_LABEL_IMAGE (selection_list->data) )
+ {
+ glLabelImage *image_object = GL_LABEL_IMAGE (selection_list->data);
+ GdkPixbuf *pixbuf = gl_label_image_get_pixbuf (image_object, NULL);
+
+ if (pixbuf)
+ {
+ gtk_target_list_add_image_targets (target_list, 2, TRUE);
+ data->pixbuf = pixbuf;
+ }
+ }
+
+
+ target_table = gtk_target_table_new_from_list (target_list, &n_targets);
+
+ gtk_clipboard_set_with_data (clipboard,
+ target_table, n_targets,
+ (GtkClipboardGetFunc)clipboard_get_cb,
+ (GtkClipboardClearFunc)clipboard_clear_cb,
+ data);
+
+ gtk_target_table_free (target_table, n_targets);
+ gtk_target_list_unref (target_list);
+ }
+
+
+ g_list_free (selection_list);
+
+ gl_debug (DEBUG_LABEL, "END");
+}
+
+
+/*****************************************************************************/
+/* "Paste" from clipboard. */
+/*****************************************************************************/
+void
+gl_label_paste (glLabel *label)
+{
+ GtkClipboard *clipboard;
+
+ gl_debug (DEBUG_LABEL, "START");
+
+ g_return_if_fail (label && GL_IS_LABEL (label));
+
+ clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
+
+ gtk_clipboard_request_targets (clipboard,
+ (GtkClipboardTargetsReceivedFunc)receive_targets_cb,
+ label);
+
+ gl_debug (DEBUG_LABEL, "END");
+}
+
+
+/*****************************************************************************/
+/* Is there anything that can be pasted? */
+/*****************************************************************************/
+gboolean
+gl_label_can_paste (glLabel *label)
+{
+ GtkClipboard *clipboard;
+ gboolean can_flag;
+
+ gl_debug (DEBUG_LABEL, "START");
+
+ clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
+
+ can_flag = gtk_clipboard_wait_is_target_available (clipboard,
+ gdk_atom_intern("application/glabels", TRUE))
+ || gtk_clipboard_wait_is_text_available (clipboard)
+ || gtk_clipboard_wait_is_image_available (clipboard);
+
+ gl_debug (DEBUG_LABEL, "END");
+ return can_flag;
+}
+
+
+/****************************************************************************/
+/* Clipboard "Get" function. */
+/****************************************************************************/
+static void
+clipboard_get_cb (GtkClipboard *clipboard,
+ GtkSelectionData *selection_data,
+ guint info,
+ ClipboardData *data)
+{
+ gl_debug (DEBUG_LABEL, "START");
+
+ switch (info)
+ {
+
+ case 0:
+ gtk_selection_data_set (selection_data,
+ gtk_selection_data_get_target (selection_data),
+ 8,
+ (guchar *)data->xml_buffer, strlen (data->xml_buffer));
+ break;
+
+ case 1:
+ gtk_selection_data_set_text (selection_data, data->text, -1);
+ break;
+
+ case 2:
+ gtk_selection_data_set_pixbuf (selection_data, data->pixbuf);
+ break;
+
+ default:
+ g_assert_not_reached ();
+ break;
+
+ }
+
+ gl_debug (DEBUG_LABEL, "END");
+}
+
+
+/****************************************************************************/
+/* Clipboard "Clear" function. */
+/****************************************************************************/
+static void
+clipboard_clear_cb (GtkClipboard *clipboard,
+ ClipboardData *data)
+{
+ gl_debug (DEBUG_LABEL, "START");
+
+ g_free (data->xml_buffer);
+ g_free (data->text);
+ if (data->pixbuf)
+ {
+ g_object_unref (data->pixbuf);
+ }
+
+ g_free (data);
+
+ gl_debug (DEBUG_LABEL, "END");
+}
+
+
+/****************************************************************************/
+/* Deal with clipboard data. */
+/****************************************************************************/
+static void
+receive_targets_cb (GtkClipboard *clipboard,
+ GdkAtom *targets,
+ gint n_targets,
+ glLabel *label)
+{
+ gint i;
+
+ /*
+ * Application/glabels
+ */
+ for ( i = 0; i < n_targets; i++ )
+ {
+ if ( strcmp(gdk_atom_name(targets[i]), "application/glabels") == 0 )
+ {
+ gtk_clipboard_request_contents (clipboard,
+ gdk_atom_intern("application/glabels", TRUE),
+ (GtkClipboardReceivedFunc)paste_xml_received_cb,
+ label);
+ return;
+ }
+ }
+
+ /*
+ * Text
+ */
+ if ( gtk_targets_include_text (targets, n_targets) )
+ {
+ gtk_clipboard_request_text (clipboard,
+ (GtkClipboardTextReceivedFunc)paste_text_received_cb,
+ label);
+ return;
+ }
+
+ /*
+ * Image
+ */
+ if ( gtk_targets_include_image (targets, n_targets, TRUE) )
+ {
+ gtk_clipboard_request_image (clipboard,
+ (GtkClipboardImageReceivedFunc)paste_image_received_cb,
+ label);
+ return;
+ }
+}
+
+
+/****************************************************************************/
+/* Paste received glabels XML callback. */
+/****************************************************************************/
+static void
+paste_xml_received_cb (GtkClipboard *clipboard,
+ GtkSelectionData *selection_data,
+ glLabel *label)
+{
+ gchar *xml_buffer;
+ glLabel *label_copy;
+ glXMLLabelStatus status;
+ GList *p;
+ glLabelObject *object, *newobject;
+
+ gl_debug (DEBUG_LABEL, "START");
+
+ gl_label_checkpoint (label, _("Paste"));
+
+ xml_buffer = (gchar *)gtk_selection_data_get_data (selection_data);
+
+ /*
+ * Deserialize XML label document and extract objects.
+ */
+ label_copy = gl_xml_label_open_buffer (xml_buffer, &status);
+ if ( label_copy )
+ {
+ gl_label_unselect_all (label);
+
+ for (p = label_copy->priv->object_list; p != NULL; p = p->next)
+ {
+ object = (glLabelObject *) p->data;
+ newobject = gl_label_object_dup (object, label);
+ gl_label_add_object( label, newobject );
+
+ gl_label_select_object (label, newobject);
+
+ gl_debug (DEBUG_LABEL, "object pasted");
+ }
+
+ g_object_unref (G_OBJECT (label_copy));
+ }
+
+ gl_debug (DEBUG_LABEL, "END");
+}
+
+
+/****************************************************************************/
+/* Paste received text callback. */
+/****************************************************************************/
+static void
+paste_text_received_cb (GtkClipboard *clipboard,
+ const gchar *text,
+ glLabel *label)
+{
+ glLabelObject *object;
+
+ gl_debug (DEBUG_LABEL, "START");
+
+ gl_label_checkpoint (label, _("Paste"));
+
+ gl_label_unselect_all (label);
+
+ object = GL_LABEL_OBJECT (gl_label_text_new (label, FALSE));
+ gl_label_text_set_text (GL_LABEL_TEXT (object), text, FALSE);
+ gl_label_object_set_position (object, 18, 18, FALSE);
+
+ gl_label_select_object (label, object);
+
+ gl_debug (DEBUG_LABEL, "END");
+}
+
+
+/****************************************************************************/
+/* Paste received image callback. */
+/****************************************************************************/
+static void
+paste_image_received_cb (GtkClipboard *clipboard,
+ GdkPixbuf *pixbuf,
+ glLabel *label)
+{
+ glLabelObject *object;
+
+ gl_debug (DEBUG_LABEL, "START");
+
+ gl_label_checkpoint (label, _("Paste"));
+
+ gl_label_unselect_all (label);
+
+ object = GL_LABEL_OBJECT (gl_label_image_new (label, FALSE));
+ gl_label_image_set_pixbuf (GL_LABEL_IMAGE (object), pixbuf, FALSE);
+ gl_label_object_set_position (object, 18, 18, FALSE);
+
+ gl_label_select_object (label, object);
+
+ gl_debug (DEBUG_LABEL, "END");
+}
+
+
+/****************************************************************************/
+/* Set default font family. */
+/****************************************************************************/
+void
+gl_label_set_default_font_family (glLabel *label,
+ const gchar *font_family)
+{
+ gl_debug (DEBUG_LABEL, "START");
+
+ g_return_if_fail (label && GL_IS_LABEL (label));
+
+ g_free (label->priv->default_font_family);
+ label->priv->default_font_family = g_strdup (font_family);
+
+ gl_debug (DEBUG_LABEL, "END");
+}
+
+
+/****************************************************************************/
+/* Set default font size. */
+/****************************************************************************/
+void
+gl_label_set_default_font_size (glLabel *label,
+ gdouble font_size)
+{
+ gl_debug (DEBUG_LABEL, "START");
+
+ g_return_if_fail (label && GL_IS_LABEL (label));
+
+ label->priv->default_font_size = font_size;
+
+ gl_debug (DEBUG_LABEL, "END");
+}
+
+
+/****************************************************************************/
+/* Set default font weight. */
+/****************************************************************************/
+void
+gl_label_set_default_font_weight (glLabel *label,
+ PangoWeight font_weight)
+{
+ gl_debug (DEBUG_LABEL, "START");
+
+ g_return_if_fail (label && GL_IS_LABEL (label));
+
+ label->priv->default_font_weight = font_weight;
+
+ gl_debug (DEBUG_LABEL, "END");
+}
+
+
+/****************************************************************************/
+/* Set default font italic flag. */
+/****************************************************************************/
+void
+gl_label_set_default_font_italic_flag (glLabel *label,
+ gboolean font_italic_flag)
+{
+ gl_debug (DEBUG_LABEL, "START");
+
+ g_return_if_fail (label && GL_IS_LABEL (label));
+
+ label->priv->default_font_italic_flag = font_italic_flag;
+
+ gl_debug (DEBUG_LABEL, "END");
+}
+
+
+/****************************************************************************/
+/* Set default text color. */
+/****************************************************************************/
+void
+gl_label_set_default_text_color (glLabel *label,
+ guint text_color)
+{
+ gl_debug (DEBUG_LABEL, "START");
+
+ g_return_if_fail (label && GL_IS_LABEL (label));
+
+ label->priv->default_text_color = text_color;
+
+ gl_debug (DEBUG_LABEL, "END");
+}
+
+
+/****************************************************************************/
+/* Set default text alignment. */
+/****************************************************************************/
+void
+gl_label_set_default_text_alignment (glLabel *label,
+ PangoAlignment text_alignment)
+{
+ gl_debug (DEBUG_LABEL, "START");
+
+ g_return_if_fail (label && GL_IS_LABEL (label));
+
+ label->priv->default_text_alignment = text_alignment;
+ gl_debug (DEBUG_LABEL, "END");
+}
+
+
+/****************************************************************************/
+/* Set default text line spacing. */
+/****************************************************************************/
+void
+gl_label_set_default_text_line_spacing (glLabel *label,
+ gdouble text_line_spacing)
+{
+ gl_debug (DEBUG_LABEL, "START");
+
+ g_return_if_fail (label && GL_IS_LABEL (label));
+
+ label->priv->default_text_line_spacing = text_line_spacing;
+
+ gl_debug (DEBUG_LABEL, "END");
+}
+
+
+/****************************************************************************/
+/* Set default line width. */
+/****************************************************************************/
+void
+gl_label_set_default_line_width (glLabel *label,
+ gdouble line_width)
+{
+ gl_debug (DEBUG_LABEL, "START");
+
+ g_return_if_fail (label && GL_IS_LABEL (label));
+
+ label->priv->default_line_width = line_width;
+
+ gl_debug (DEBUG_LABEL, "END");
+}
+
+
+/****************************************************************************/
+/* Set default line color. */
+/****************************************************************************/
+void
+gl_label_set_default_line_color (glLabel *label,
+ guint line_color)
+{
+ gl_debug (DEBUG_LABEL, "START");
+
+ g_return_if_fail (label && GL_IS_LABEL (label));
+
+ label->priv->default_line_color = line_color;
+
+ gl_debug (DEBUG_LABEL, "END");
+}
+
+
+/****************************************************************************/
+/* Set default fill color. */
+/****************************************************************************/
+void
+gl_label_set_default_fill_color (glLabel *label,
+ guint fill_color)
+{
+ gl_debug (DEBUG_LABEL, "START");
+
+ g_return_if_fail (label && GL_IS_LABEL (label));
+
+ label->priv->default_fill_color = fill_color;
+
+ gl_debug (DEBUG_LABEL, "END");
+}
+
+
+/****************************************************************************/
+/* Get default font family. */
+/****************************************************************************/
+gchar *
+gl_label_get_default_font_family (glLabel *label)
+{
+ gl_debug (DEBUG_LABEL, "START");
+
+ g_return_val_if_fail (label && GL_IS_LABEL (label), NULL);
+
+ gl_debug (DEBUG_LABEL, "END");
+
+ return g_strdup (label->priv->default_font_family);
+}
+
+
+/****************************************************************************/
+/* Get default font size. */
+/****************************************************************************/
+gdouble
+gl_label_get_default_font_size (glLabel *label)
+{
+ gl_debug (DEBUG_LABEL, "START");
+
+ g_return_val_if_fail (label && GL_IS_LABEL (label), 12.0);
+
+ gl_debug (DEBUG_LABEL, "END");
+
+ return label->priv->default_font_size;
+}
+
+
+/****************************************************************************/
+/* Get default font weight. */
+/****************************************************************************/
+PangoWeight
+gl_label_get_default_font_weight (glLabel *label)
+{
+ gl_debug (DEBUG_LABEL, "START");
+
+ g_return_val_if_fail (label && GL_IS_LABEL (label), PANGO_WEIGHT_NORMAL);
+
+ gl_debug (DEBUG_LABEL, "END");
+
+ return label->priv->default_font_weight;
+}
+
+
+/****************************************************************************/
+/* Get default font italic flag. */
+/****************************************************************************/
+gboolean
+gl_label_get_default_font_italic_flag (glLabel *label)
+{
+ gl_debug (DEBUG_LABEL, "START");
+
+ g_return_val_if_fail (label && GL_IS_LABEL (label), FALSE);
+
+ gl_debug (DEBUG_LABEL, "END");
+
+ return label->priv->default_font_italic_flag;
+}
+
+
+/****************************************************************************/
+/* Get default text color. */
+/****************************************************************************/
+guint
+gl_label_get_default_text_color (glLabel *label)
+{
+ gl_debug (DEBUG_LABEL, "START");
+
+ g_return_val_if_fail (label && GL_IS_LABEL (label), 0);
+
+ gl_debug (DEBUG_LABEL, "END");
+
+ return label->priv->default_text_color;
+}
+
+
+/****************************************************************************/
+/* Get default text alignment. */
+/****************************************************************************/
+PangoAlignment
+gl_label_get_default_text_alignment (glLabel *label)
+{
+ gl_debug (DEBUG_LABEL, "START");
+
+ g_return_val_if_fail (label && GL_IS_LABEL (label), PANGO_ALIGN_LEFT);
+
+ gl_debug (DEBUG_LABEL, "END");
+
+ return label->priv->default_text_alignment;
+}
+
+
+/****************************************************************************/
+/* Get default text line spacing. */
+/****************************************************************************/
+gdouble
+gl_label_get_default_text_line_spacing (glLabel *label)
+{
+ gl_debug (DEBUG_LABEL, "START");
+
+ g_return_val_if_fail (label && GL_IS_LABEL (label), 1.0);
+
+ gl_debug (DEBUG_LABEL, "END");
+
+ return label->priv->default_text_line_spacing;
+}
+
+
+/****************************************************************************/
+/* Get default line width. */
+/****************************************************************************/
+gdouble
+gl_label_get_default_line_width (glLabel *label)
+{
+ gl_debug (DEBUG_LABEL, "START");
+
+ g_return_val_if_fail (label && GL_IS_LABEL (label), 1.0);
+
+ gl_debug (DEBUG_LABEL, "END");
+
+ return label->priv->default_line_width;