#ifndef __DW_STYLE_H__
#define __DW_STYLE_H__
#include <gdk/gdktypes.h>
#include "dw_tooltip.h"
#define DW_STYLE_ALIGN_LEFT 1
#define DW_STYLE_ALIGN_RIGHT 2
typedef enum {
DW_STYLE_BORDER_NONE,
DW_STYLE_BORDER_HIDDEN,
DW_STYLE_BORDER_DOTTED,
DW_STYLE_BORDER_DASHED,
DW_STYLE_BORDER_SOLID,
DW_STYLE_BORDER_DOUBLE,
DW_STYLE_BORDER_GROOVE,
DW_STYLE_BORDER_RIDGE,
DW_STYLE_BORDER_INSET,
DW_STYLE_BORDER_OUTSET
} DwStyleBorderStyle;
typedef enum {
DW_STYLE_TEXT_ALIGN_LEFT,
DW_STYLE_TEXT_ALIGN_RIGHT,
DW_STYLE_TEXT_ALIGN_CENTER,
DW_STYLE_TEXT_ALIGN_JUSTIFY,
DW_STYLE_TEXT_ALIGN_STRING
} DwStyleTextAlignType;
typedef enum {
DW_STYLE_VALIGN_TOP,
DW_STYLE_VALIGN_BOTTOM,
DW_STYLE_VALIGN_MIDDLE,
DW_STYLE_VALIGN_BASELINE,
DW_STYLE_VALIGN_SUB,
DW_STYLE_VALIGN_SUPER
} DwStyleVAlignType;
typedef enum {
/* todo: incomplete */
DW_STYLE_DISPLAY_BLOCK,
DW_STYLE_DISPLAY_INLINE,
DW_STYLE_DISPLAY_LIST_ITEM,
DW_STYLE_DISPLAY_TABLE,
DW_STYLE_DISPLAY_TABLE_ROW_GROUP,
DW_STYLE_DISPLAY_TABLE_HEADER_GROUP,
DW_STYLE_DISPLAY_TABLE_FOOTER_GROUP,
DW_STYLE_DISPLAY_TABLE_ROW,
DW_STYLE_DISPLAY_TABLE_CELL,
DW_STYLE_DISPLAY_LAST
} DwStyleDisplayType;
typedef enum {
DW_STYLE_LIST_STYLE_TYPE_DISC,
DW_STYLE_LIST_STYLE_TYPE_CIRCLE,
DW_STYLE_LIST_STYLE_TYPE_SQUARE,
DW_STYLE_LIST_STYLE_TYPE_DECIMAL,
DW_STYLE_LIST_STYLE_TYPE_DECIMAL_LEADING_ZERO,
DW_STYLE_LIST_STYLE_TYPE_LOWER_ROMAN,
DW_STYLE_LIST_STYLE_TYPE_UPPER_ROMAN,
DW_STYLE_LIST_STYLE_TYPE_LOWER_GREEK,
DW_STYLE_LIST_STYLE_TYPE_LOWER_ALPHA,
DW_STYLE_LIST_STYLE_TYPE_LOWER_LATIN,
DW_STYLE_LIST_STYLE_TYPE_UPPER_ALPHA,
DW_STYLE_LIST_STYLE_TYPE_UPPER_LATIN,
DW_STYLE_LIST_STYLE_TYPE_HEBREW,
DW_STYLE_LIST_STYLE_TYPE_ARMENIAN,
DW_STYLE_LIST_STYLE_TYPE_GEORGIAN,
DW_STYLE_LIST_STYLE_TYPE_CJK_IDEOGRAPHIC,
DW_STYLE_LIST_STYLE_TYPE_HIRAGANA,
DW_STYLE_LIST_STYLE_TYPE_KATAKANA,
DW_STYLE_LIST_STYLE_TYPE_HIRAGANA_IROHA,
DW_STYLE_LIST_STYLE_TYPE_KATAKANA_IROHA,
DW_STYLE_LIST_STYLE_TYPE_NONE
} DwStyleListStyleType;
typedef enum {
DW_STYLE_FONT_STYLE_NORMAL,
DW_STYLE_FONT_STYLE_ITALIC,
DW_STYLE_FONT_STYLE_OBLIQUE
} DwStyleFontStyle;
typedef enum {
DW_STYLE_TEXT_DECORATION_UNDERLINE = 1 << 0,
DW_STYLE_TEXT_DECORATION_OVERLINE = 1 << 1,
DW_STYLE_TEXT_DECORATION_LINE_THROUGH = 1 << 2,
DW_STYLE_TEXT_DECORATION_BLINK = 1 << 3
} DwStyleTextDecoration;
typedef enum {
DW_STYLE_WHITE_SPACE_NORMAL,
DW_STYLE_WHITE_SPACE_PRE,
DW_STYLE_WHITE_SPACE_NOWRAP
} DwStyleWhiteSpace;
typedef struct _DwStyle DwStyle;
typedef struct _DwStyleFont DwStyleFont;
typedef struct _DwStyleColor DwStyleColor;
typedef struct _DwStyleShadedColor DwStyleShadedColor;
typedef struct _DwStyleBox DwStyleBox;
/*
* Lengths are gint's. Absolute lengths are represented in the following way:
*
* +---+ - - - - - - - - - -+---+---+
* | pixel value (integer) | 0 | 1 |
* +---+ - - - - - - - - - -+---+---+
*
* Percentages:
*
* +---+ - - - +---+---+- - - - - -+---+---+---+
* | integer part | decimal fraction | 1 | 0 |
* +---+ - - - +---+---+- - - - - -+---+---+---+
* n-1 18 17 2 1 0
*
* | <------ fixed point value ------> |
*
* Relative lengths (only used in HTML):
*
* +---+ - - - +---+---+- - - - - -+---+---+---+
* | integer part | decimal fraction | 1 | 1 |
* +---+ - - - +---+---+- - - - - -+---+---+---+
* n-1 18 17 2 1 0
*
* | <------ fixed point value ------> |
*
* "auto" lenghths are represented as DW_STYLE_LENGTH_AUTO.
*/
typedef gint DwStyleLength;
#define DW_STYLE_CREATE_ABS_LENGTH(n) (((n) << 2) | 1)
#define DW_STYLE_CREATE_PER_LENGTH(v) ( ( (gint)((v) * (1 << 18)) & ~3 ) | 2 )
#define DW_STYLE_CREATE_REL_LENGTH(v) ( ( (gint)((v) * (1 << 18)) & ~3 ) | 3 )
#define DW_STYLE_IS_ABS_LENGTH(l) (((l) & 3) == 1)
#define DW_STYLE_IS_PER_LENGTH(l) (((l) & 3) == 2)
#define DW_STYLE_IS_REL_LENGTH(l) (((l) & 3) == 3)
#define DW_STYLE_ABS_LENGTH_VAL(l) ((l) >> 2)
#define DW_STYLE_PER_LENGTH_VAL(l) ( ( (gfloat)((l) & ~3) ) / (1 << 18) )
#define DW_STYLE_REL_LENGTH_VAL(l) ( ( (gfloat)((l) & ~3) ) / (1 << 18) )
#define DW_STYLE_LENGTH_AUTO 0
struct _DwStyleBox
{
/* in future also percentages */
gint32 top, right, bottom, left;
};
struct _DwStyle
{
gint ref_count;
DwStyleFont *font;
DwStyleTextDecoration text_decoration;
DwStyleColor *color, *background_color;
DwStyleTextAlignType text_align;
DwStyleVAlignType valign;
gchar text_align_char; /* In future, strings will be supported. */
gint32 border_spacing;
DwStyleLength width, height;
DwStyleBox margin, border_width, padding;
struct { DwStyleShadedColor *top, *right, *bottom, *left; } border_color;
struct { DwStyleBorderStyle top, right, bottom, left; } border_style;
DwStyleDisplayType display;
DwStyleWhiteSpace white_space;
DwStyleListStyleType list_style_type;
gint x_link;
DwTooltip *x_tooltip;
};
struct _DwStyleFont
{
gint ref_count;
char *name;
gint32 size;
gint weight;
DwStyleFontStyle style;
#ifdef USE_TYPE1
gint t1fontid;
#else
GdkFont *font;
#endif
gint space_width;
gint x_height;
};
struct _DwStyleColor
{
gint ref_count;
gint color_val;
GdkColor color, inverse_color;
GdkGC *gc, *inverse_gc;
};
struct _DwStyleShadedColor
{
gint ref_count;
gint color_val;
GdkColor color, inverse_color, color_dark, color_light;
GdkGC *gc, *inverse_gc, *gc_dark, *gc_light;
};
void a_Dw_style_init (void);
void a_Dw_style_freeall (void);
void a_Dw_style_init_values (DwStyle *style_attrs,
GdkWindow *window);
void a_Dw_style_reset_values (DwStyle *style_attrs,
GdkWindow *window);
DwStyle* a_Dw_style_new (DwStyle *style_attrs,
GdkWindow *window);
DwStyleFont* a_Dw_style_font_new (DwStyleFont *font_attrs);
DwStyleFont* a_Dw_style_font_new_from_list (DwStyleFont *font_attrs,
gchar *default_family);
DwStyleColor* a_Dw_style_color_new (gint color_val,
GdkWindow *window);
DwStyleShadedColor* a_Dw_style_shaded_color_new (gint color_val,
GdkWindow *window);
gboolean a_Dw_style_size_diffs (DwStyle *style1,
DwStyle *style2);
#define a_Dw_style_ref(style) ((style)->ref_count++)
#define a_Dw_style_unref(style) if (--((style)->ref_count) == 0) \
Dw_style_remove (style)
/* Don't use this function directly! */
void Dw_style_remove (DwStyle *style);
#define a_Dw_style_box_set_val(box, val) \
((box)->top = (box)->right = (box)->bottom = (box)->left = (val))
#define a_Dw_style_box_set_border_color(style, val) \
((style)->border_color.top = (style)->border_color.right = \
(style)->border_color.bottom = (style)->border_color.left = (val))
#define a_Dw_style_box_set_border_style(style, val) \
((style)->border_style.top = (style)->border_style.right = \
(style)->border_style.bottom = (style)->border_style.left = (val))
/* For use of widgets */
#define DW_INFINITY 1000000 /* random */
void p_Dw_style_draw_border (GdkWindow *window,
GdkRectangle *area,
gint32 vx,
gint32 vy,
gint32 x,
gint32 y,
gint32 width,
gint32 height,
DwStyle *style,
gboolean inverse);
void p_Dw_style_draw_background (GdkWindow *window,
GdkRectangle *area,
gint32 vx,
gint32 vy,
gint32 x,
gint32 y,
gint32 width,
gint32 height,
DwStyle *style,
gboolean inverse);
void a_Dw_style_numtostr (gint num,
gchar *buf,
gint buflen,
DwStyleListStyleType list_style_tyle);
#define p_Dw_style_box_offset_x(style) ((style)->margin.left + \
(style)->border_width.left + \
(style)->padding.left)
#define p_Dw_style_box_rest_width(style) ((style)->margin.right + \
(style)->border_width.right + \
(style)->padding.right)
#define p_Dw_style_box_diff_width(style) (p_Dw_style_box_offset_x(style) + \
p_Dw_style_box_rest_width(style))
#define p_Dw_style_box_offset_y(style) ((style)->margin.top + \
(style)->border_width.top + \
(style)->padding.top)
#define p_Dw_style_box_rest_height(style) ((style)->margin.bottom + \
(style)->border_width.bottom + \
(style)->padding.bottom)
#define p_Dw_style_box_diff_height(style) (p_Dw_style_box_offset_y(style) + \
p_Dw_style_box_rest_height(style))
#endif /* __DW_STYLE_H__ */