aboutsummaryrefslogtreecommitdiffstats
path: root/calendar/gui/gnome-month-item.h
blob: d117aa85b50bd273cbd20689f30901786e179462 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
/* General-purpose monthly calendar canvas item for GNOME
 *
 * Copyright (C) 1998 Red Hat Software, Inc.
 *
 * Author: Federico Mena <federico@nuclecu.unam.mx>
 */

#ifndef GNOME_MONTH_ITEM_H
#define GNOME_MONTH_ITEM_H

#include <libgnome/gnome-defs.h>
#include <gtk/gtkpacker.h> /* why the hell is GtkAnchorType here and not in gtkenums.h? */
#include <libgnomeui/gnome-canvas.h>


BEGIN_GNOME_DECLS


/* These values are used to identify the canvas items that make up a complete GnomeMonthItem, which
 * is made up of the following "pieces":
 *
 *  Headings line:
 *      - 7 GnomeCanvasGroups:
 *          Each group contains one box (GnomeCanvasRectangle) and one label
 *          (GnomeCanvasText)
 *
 *  Day slots:
 *      - 42 GnomeCanvasGroups:
 *          Each group contains one box (GnomeCanvasRectangle) and one label
 *          (GnomeCanvasText)
 *
 * The headings are organized from left to right.  The day slots are organized as a table in
 * row-major order.
 *
 * If you want to access the individual items of the GnomeMonthItem, you can use these numbers with
 * the gnome_month_item_num2child() function.  If you want to convert a number into the
 * corresponding GnomeCanvasItem, you can use the gnome_month_item_child2num() function.
 */
typedef enum {
    GNOME_MONTH_ITEM_HEAD_GROUP = 0,    /* 7 groups for headings */
    GNOME_MONTH_ITEM_HEAD_BOX   = 7,    /* 7 boxes for headings */
    GNOME_MONTH_ITEM_HEAD_LABEL = 14,   /* 7 labels for headings */
    GNOME_MONTH_ITEM_DAY_GROUP  = 21,   /* 42 groups for days */
    GNOME_MONTH_ITEM_DAY_BOX    = 63,   /* 42 boxes for days */
    GNOME_MONTH_ITEM_DAY_LABEL  = 105,  /* 42 labels for days */
    GNOME_MONTH_ITEM_LAST       = 147   /* total number of items */
} GnomeMonthItemChild;

/* The MonthItem canvas item defines a simple monthly calendar.  It is made out of a number of
 * canvas items, which can be accessed using the functions provided.  The monthly calendar is
 * anchored with respect to a point.  The following arguments are available:
 *
 * name         type        read/write  description
 * ------------------------------------------------------------------------------------------
 * year         uint        RW      Full year (1-9999)
 * month        uint        RW      Number of month (0-11)
 * x            double      RW      X position of anchor point
 * y            double      RW      Y position of anchor point
 * width        double      RW      Width of calendar in canvas units
 * height       double      RW      Height of calendar in canvas units
 * anchor       GtkAnchorType   RW      Anchor side for calendar
 * heading_padding  double      RW      Padding inside heading boxes
 * day_padding      double      RW      Padding inside day boxes
 * day_names        char **     W       Array of strings corresponding to the day names (sun-sat)
 * heading_height   double      RW      Height of headings bar in canvas units
 * heading_anchor   GtkAnchorType   RW      Anchor side for headings inside heading boxes
 * day_anchor       GtkAnchorType   RW      Anchor side for day numbers inside day boxes
 * start_on_monday  boolean     RW      Specifies whether the week starts on Monday or Sunday
 * heading_font     string      W       X logical font descriptor for the headings
 * heading_font_gdk GdkFont *   RW      Pointer to GdkFont for the headings
 * day_font     string      W       X logical font descriptor for the day numbers
 * day_font_gdk     GdkFont *   RW      Pointer to GdkFont for the day numbers
 * heading_color    string      W       X color specification for heading labels
 * heading_color_gdk    GdkColor *  RW      Pointer to an allocated GdkColor for heading labels
 * day_color        string      W       X color specification for day number labels
 * day_color_gdk    GdkColor *  RW      Pointer to an allocated GdkColor for day number labels
 */

#define GNOME_TYPE_MONTH_ITEM            (gnome_month_item_get_type ())
#define GNOME_MONTH_ITEM(obj)            (GTK_CHECK_CAST ((obj), GNOME_TYPE_MONTH_ITEM, GnomeMonthItem))
#define GNOME_MONTH_ITEM_CLASS(klass)    (GTK_CHECK_CLASS_CAST ((klass), GNOME_TYPE_MONTH_ITEM, GnomeMonthItemClass))
#define GNOME_IS_MONTH_ITEM(obj)         (GTK_CHECK_TYPE ((obj), GNOME_TYPE_MONTH_ITEM))
#define GNOME_IS_MONTH_ITEM_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), GNOME_TYPE_MONTH_ITEM))


typedef struct _GnomeMonthItem GnomeMonthItem;
typedef struct _GnomeMonthItemClass GnomeMonthItemClass;

struct _GnomeMonthItem {
    GnomeCanvasGroup group;

    int year;           /* Year to show (full, no two-digit crap) */
    int month;          /* Month to show (0-11) */

    double x, y;            /* Position at anchor */
    double width, height;       /* Size of calendar */
    GtkAnchorType anchor;       /* Anchor side for calendar */

    double head_padding;        /* Padding to use between heading lines and text */
    double day_padding;     /* Padding to use between day number lines and text */

    char *day_names[7];     /* Names to use for the day labels, starting from Sunday */

    double head_height;     /* Height of the headings row */
    GtkAnchorType head_anchor;  /* Anchor side for the heading labels */
    GtkAnchorType day_anchor;   /* Anchor side for the day number labels */

    GnomeCanvasItem **items;    /* All the items that make up the calendar */
    int day_numbers[42];        /* The numbers of the days, as they are shown in the display */

    GdkFont *head_font;     /* Font for the headings */
    GdkFont *day_font;      /* Font for the day numbers */

    gulong head_pixel;      /* Color for heading labels */
    gulong day_pixel;       /* Color for day number labels */

    int start_on_monday : 1;    /* Start the week on Monday?  If false, then start from Sunday */
};

struct _GnomeMonthItemClass {
    GnomeCanvasGroupClass parent_class;
};


/* Standard Gtk function */
GtkType gnome_month_item_get_type (void);

/* Creates a new month item with the specified group as parent */
GnomeCanvasItem *gnome_month_item_new (GnomeCanvasGroup *parent);

/* Constructor function useful for derived classes */
void gnome_month_item_construct (GnomeMonthItem *mitem);

/* Returns the child item defined by the child number (as specified on the GnomeMonthItemChild
 * enumeration above).
 */
GnomeCanvasItem *gnome_month_item_num2child (GnomeMonthItem *mitem, GnomeMonthItemChild child_num);

/* Returns the number of the specified child item, as defined on the GnomeMonthItemChild enumeration
 * above.  If the specified object is not found, it returns -1.
 */
GnomeMonthItemChild gnome_month_item_child2num (GnomeMonthItem *mitem, GnomeCanvasItem *child);

/* Returns the number of the day relevant to the specified child item.  Day numbers are 1-based.  If
 * the specified child is outside the range of displayed days, then it returns 0.
 */
int gnome_month_item_num2day (GnomeMonthItem *mitem, GnomeMonthItemChild child_num);

/* Returns the index (0-41) of the specified date within the table of days.  If the day number is
 * invalid for the current monthly calendar, then -1 is returned.
 */
int gnome_month_item_day2index (GnomeMonthItem *mitem, int day_num);


END_GNOME_DECLS

#endif