## GOStyledObject GOStyledObject — Objects with style |

## Synopsis

    #include <goffice/utils/go-styled-object.h>

                        GOStyledObject;
                        GOStyledObjectClass;
    GOStyle *           go_styled_object_get_style          (GOStyledObject *gso);
    GOStyle *           go_styled_object_get_auto_style     (GOStyledObject *gso);
    gboolean            go_styled_object_set_style          (GOStyledObject *gso,
                                                             GOStyle *style);
    void                go_styled_object_apply_theme        (GOStyledObject *gso,
                                                             GOStyle *style);
    void                go_styled_object_style_changed      (GOStyledObject *gso);
    GODoc *             go_styled_object_get_document       (GOStyledObject *gso);
    gboolean            go_styled_object_set_cairo_fill     (GOStyledObject const *so,
                                                             cairo_t *cr);
    gboolean            go_styled_object_set_cairo_line     (GOStyledObject const *so,
                                                             cairo_t *cr);

## Object Hierarchy

      GInterface
       +----GOStyledObject

## Known Implementations

GOStyledObject is implemented by GocPolygon, GogAxisBase, GogOutlinedObject, GogSeriesLines, GogRegEqn, GogRegCurve, GogChart, GogAxis, GogTrendLine, GogLegend, GocPolyline, GocArc, GocStyledItem, GogStyledObject, GocCircle, GocText, GocLine, GogLabel, GogGraph, GogGridLine, GogSeries, GocEllipse, GocRectangle, GogSmoothedCurve, GogText, GogAxisLine and GogGrid.

## Description

The common GInterface for all objects owning a GOStyle.

## Details

### GOStyledObject

    typedef struct _GOStyledObject GOStyledObject;

### GOStyledObjectClass

    typedef struct {
    	GTypeInterface		   base;

    	gboolean  (*set_style) 	    (GOStyledObject *gso, GOStyle *style);
    	GOStyle	 *(*get_style)	    (GOStyledObject *gso);
    	GOStyle	 *(*get_auto_style) (GOStyledObject *gso);
    	void	  (*style_changed)  (GOStyledObject *gso);
    	void	  (*apply_theme)	(GOStyledObject *gso, GOStyle *style);
    	GODoc    *(*get_document)   (GOStyledObject *gso);
    } GOStyledObjectClass;

GTypeInterface `base`; |
`set_style` () | sets the object style.
`get_style` () | returns the object current style.
`get_auto_style` () | returns the default style for the object.
`style_changed` () | called when the style changed.
`apply_theme` () | apply the current theme if any to the object style.
`get_document` () | returns the GODoc associated to the object if any.

### go_styled_object_get_style ()

    GOStyle *           go_styled_object_get_style          (GOStyledObject *gso);

Simply an accessor function that returns `gso->style`, without referencing it.

`gso` : | a GOStyledObject
Returns : | the styled object's GOStyle

### go_styled_object_get_auto_style ()

    GOStyle *           go_styled_object_get_auto_style     (GOStyledObject *gso);

This function returns a new style that is initialized with the auto values for `gso`. Caller is responsible for the result.

`gso` : | a GOStyledObject
Returns : | a new GOStyle

### go_styled_object_set_style ()

    gboolean            go_styled_object_set_style          (GOStyledObject *gso,
                                                             GOStyle *style);

Sets a new style for `gso`, and emits "style-changed" signal. This function does not take ownership of `style`.

The best way to change the style is to set the "style" property.

This function will fail if the new style and the previous style are the same. In that case, the function will always return false:

         style = go_styled_object_get_style (gso);
         style->line.width = 2;
         size_changed = go_styled_object_set_style (gso, style);

In this sample, the call to `go_styled_object_set_style()` is just useless. You need to check yourself if you really change the size, call `go_styled_object_style_changed()` to trigger the "style-changed" event. So the following code is much better:

         style = go_styled_object_get_style (gso);
         if (style->line.width != 2.) {
          style->line.width = 2;
          go_styled_object_style_changed (gso);
          size_changed = true;
         } else
          size_changed = FALSE;

or even better:

         style = go_style_dup (go_styled_object_get_style (gso));
         style->line.width = 2;
         size_changed = go_styled_object_set_style (gso, style);
         g_object_unref (style);

`gso` : | a GOStyledObject
`style` : | a GOStyle
Returns : | `TRUE` if new style may lead to change of object size, which happens when changing font size for example.

### go_styled_object_apply_theme ()

    void                go_styled_object_apply_theme        (GOStyledObject *gso,
                                                             GOStyle *style);

Apply appropriate theme `style` if meaningful, i.e. properties with auto flag set to `TRUE` should be changed to default theme value.

`gso` : | a GOStyledObject
`style` : | a GOStyle that will be themed

### go_styled_object_style_changed ()

    void                go_styled_object_style_changed      (GOStyledObject *gso);

Called when the style changed. Might emit a signal if meaningful.

`gso` : | a GOStyledObject

### go_styled_object_get_document ()

    GODoc *             go_styled_object_get_document       (GOStyledObject *gso);

A GODoc is necessary to store images. If no GODoc is associated with the object, image filling will not be supported.

`gso` : | a GOStyledObject
Returns : | the GODoc associated with the object if any.

### go_styled_object_set_cairo_fill ()

    gboolean            go_styled_object_set_cairo_fill     (GOStyledObject const *so,
                                                             cairo_t *cr);

Prepares the cairo context `cr` to fill a shape according to the item style and canvas scale.

`so` : | GOStyledObject
`cr` : | cairo_t
Returns : | `TRUE` if the filling is not invisible

### go_styled_object_set_cairo_line ()

    gboolean            go_styled_object_set_cairo_line     (GOStyledObject const *so,
                                                             cairo_t *cr);

Prepares the cairo context `cr` to draw a line according to the item style and canvas scale.

`so` : | GOStyledObject
`cr` : | cairo_t
Returns : | `TRUE` if the line is not invisible