Updated Traditional Chinese translation(Hong Kong and Taiwan)
[evolution.git] / calendar / gui / e-week-view-titles-item.c
blob2a5056d7f43c6e701d5dd8b59954fe65a324d6c8
1 /*
2 * EWeekViewTitlesItem - displays the 'Monday', 'Tuesday' etc. at the top of
3 * the Month calendar view.
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) version 3.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with the program; if not, see <http://www.gnu.org/licenses/>
18 * Authors:
19 * Damon Chaplin <damon@ximian.com>
21 * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
24 #ifdef HAVE_CONFIG_H
25 #include <config.h>
26 #endif
28 #include <string.h>
29 #include <e-util/e-util.h>
30 #include "e-week-view-titles-item.h"
32 #define E_WEEK_VIEW_TITLES_ITEM_GET_PRIVATE(obj) \
33 (G_TYPE_INSTANCE_GET_PRIVATE \
34 ((obj), E_TYPE_WEEK_VIEW_TITLES_ITEM, EWeekViewTitlesItemPrivate))
36 struct _EWeekViewTitlesItemPrivate {
37 EWeekView *week_view;
40 enum {
41 PROP_0,
42 PROP_WEEK_VIEW
45 static gpointer parent_class;
47 static void
48 week_view_titles_item_set_property (GObject *object,
49 guint property_id,
50 const GValue *value,
51 GParamSpec *pspec)
53 switch (property_id) {
54 case PROP_WEEK_VIEW:
55 e_week_view_titles_item_set_week_view (
56 E_WEEK_VIEW_TITLES_ITEM (object),
57 g_value_get_object (value));
58 return;
61 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
64 static void
65 week_view_titles_item_get_property (GObject *object,
66 guint property_id,
67 GValue *value,
68 GParamSpec *pspec)
70 switch (property_id) {
71 case PROP_WEEK_VIEW:
72 g_value_set_object (
73 value,
74 e_week_view_titles_item_get_week_view (
75 E_WEEK_VIEW_TITLES_ITEM (object)));
76 return;
79 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
82 static void
83 week_view_titles_item_dispose (GObject *object)
85 EWeekViewTitlesItemPrivate *priv;
87 priv = E_WEEK_VIEW_TITLES_ITEM_GET_PRIVATE (object);
89 if (priv->week_view != NULL) {
90 g_object_unref (priv->week_view);
91 priv->week_view = NULL;
94 /* Chain up to parent's dispose() method. */
95 G_OBJECT_CLASS (parent_class)->dispose (object);
98 static void
99 week_view_titles_item_update (GnomeCanvasItem *item,
100 const cairo_matrix_t *i2c,
101 gint flags)
103 GnomeCanvasItemClass *canvas_item_class;
105 /* Chain up to parent's update() method. */
106 canvas_item_class = GNOME_CANVAS_ITEM_CLASS (parent_class);
107 canvas_item_class->update (item, i2c, flags);
109 /* The item covers the entire canvas area. */
110 item->x1 = 0;
111 item->y1 = 0;
112 item->x2 = INT_MAX;
113 item->y2 = INT_MAX;
116 static void
117 week_view_titles_item_draw (GnomeCanvasItem *canvas_item,
118 GdkDrawable *drawable,
119 gint x,
120 gint y,
121 gint width,
122 gint height)
124 EWeekViewTitlesItem *titles_item;
125 EWeekView *week_view;
126 GtkStyle *style;
127 gint col_width, col, date_width, date_x;
128 gchar buffer[128];
129 GtkAllocation allocation;
130 gboolean abbreviated;
131 gint weekday;
132 PangoLayout *layout;
133 cairo_t *cr;
135 titles_item = E_WEEK_VIEW_TITLES_ITEM (canvas_item);
136 week_view = e_week_view_titles_item_get_week_view (titles_item);
137 g_return_if_fail (week_view != NULL);
139 cr = gdk_cairo_create (drawable);
140 cairo_set_line_width (cr, 1.0);
142 gtk_widget_get_allocation (
143 GTK_WIDGET (canvas_item->canvas), &allocation);
145 style = gtk_widget_get_style (GTK_WIDGET (week_view));
146 layout = gtk_widget_create_pango_layout (GTK_WIDGET (week_view), NULL);
148 /* Draw the shadow around the dates. */
149 gdk_cairo_set_source_color (cr, &style->light[GTK_STATE_NORMAL]);
150 cairo_move_to (cr, 1.5 - x, 1.5 - y);
151 cairo_rel_line_to (cr, allocation.width - 1, 0);
152 cairo_move_to (cr, 1.5 - x, 2.5 - y);
153 cairo_rel_line_to (cr, 0, allocation.height - 1);
154 cairo_stroke (cr);
156 gdk_cairo_set_source_color (cr, &style->dark[GTK_STATE_NORMAL]);
157 cairo_rectangle (cr, 0.5 - x, 0.5 - y, allocation.width - 1, allocation.height);
158 cairo_stroke (cr);
160 /* Determine the format to use. */
161 col_width = allocation.width / week_view->columns;
162 abbreviated = (week_view->max_day_width + 2 >= col_width);
164 /* Shift right one pixel to account for the shadow around the main
165 canvas. */
166 x--;
168 /* Draw the date. Set a clipping rectangle so we don't draw over the
169 next day. */
170 weekday = week_view->display_start_day;
171 for (col = 0; col < week_view->columns; col++) {
172 if (weekday == 5 && week_view->compress_weekend)
173 g_snprintf (
174 buffer, sizeof (buffer), "%s/%s",
175 e_get_weekday_name (G_DATE_SATURDAY, TRUE),
176 e_get_weekday_name (G_DATE_SUNDAY, TRUE));
177 else
178 g_snprintf (
179 buffer, sizeof (buffer), "%s",
180 e_get_weekday_name (weekday + 1, abbreviated));
182 cairo_save (cr);
184 cairo_rectangle (cr,
185 week_view->col_offsets[col] - x, 2 - y,
186 week_view->col_widths[col], allocation.height - 2);
187 cairo_clip (cr);
189 if (weekday == 5 && week_view->compress_weekend)
190 date_width = week_view->abbr_day_widths[5]
191 + week_view->slash_width
192 + week_view->abbr_day_widths[6];
193 else if (abbreviated)
194 date_width = week_view->abbr_day_widths[weekday];
195 else
196 date_width = week_view->day_widths[weekday];
198 date_x = week_view->col_offsets[col]
199 + (week_view->col_widths[col] - date_width) / 2;
200 date_x = MAX (date_x, week_view->col_offsets[col]);
202 pango_layout_set_text (layout, buffer, -1);
203 cairo_move_to (cr, date_x - x, 3 - y);
204 pango_cairo_show_layout (cr, layout);
206 cairo_restore (cr);
208 /* Draw the lines down the left and right of the date cols. */
209 if (col != 0) {
210 gdk_cairo_set_source_color (cr, &style->light[GTK_STATE_NORMAL]);
211 cairo_move_to (cr, week_view->col_offsets[col] - x + 0.5, 4.5 - y);
212 cairo_rel_line_to (cr, 0, allocation.height - 8);
213 cairo_stroke (cr);
215 gdk_cairo_set_source_color (cr, &style->dark[GTK_STATE_NORMAL]);
216 cairo_move_to (cr, week_view->col_offsets[col] - x - 0.5, 4.5 - y);
217 cairo_rel_line_to (cr, 0, allocation.height - 8);
218 cairo_stroke (cr);
221 /* Draw the lines between each column. */
222 if (col != 0) {
223 cairo_set_source_rgb (cr, 0, 0, 0);
224 cairo_rectangle (cr, week_view->col_offsets[col] - x, allocation.height - y, 1, 1);
225 cairo_fill (cr);
228 if (weekday == 5 && week_view->compress_weekend)
229 weekday += 2;
230 else
231 weekday++;
233 weekday = weekday % 7;
236 g_object_unref (layout);
237 cairo_destroy (cr);
240 static GnomeCanvasItem *
241 week_view_titles_item_point (GnomeCanvasItem *item,
242 gdouble x,
243 gdouble y,
244 gint cx,
245 gint cy)
247 return item;
250 static void
251 week_view_titles_item_class_init (EWeekViewTitlesItemClass *class)
253 GObjectClass *object_class;
254 GnomeCanvasItemClass *item_class;
256 parent_class = g_type_class_peek_parent (class);
257 g_type_class_add_private (class, sizeof (EWeekViewTitlesItemPrivate));
259 object_class = G_OBJECT_CLASS (class);
260 object_class->set_property = week_view_titles_item_set_property;
261 object_class->get_property = week_view_titles_item_get_property;
262 object_class->dispose = week_view_titles_item_dispose;
264 item_class = GNOME_CANVAS_ITEM_CLASS (class);
265 item_class->update = week_view_titles_item_update;
266 item_class->draw = week_view_titles_item_draw;
267 item_class->point = week_view_titles_item_point;
269 g_object_class_install_property (
270 object_class,
271 PROP_WEEK_VIEW,
272 g_param_spec_object (
273 "week-view",
274 "Week View",
275 NULL,
276 E_TYPE_WEEK_VIEW,
277 G_PARAM_READWRITE));
280 static void
281 week_view_titles_item_init (EWeekViewTitlesItem *titles_item)
283 titles_item->priv = E_WEEK_VIEW_TITLES_ITEM_GET_PRIVATE (titles_item);
286 GType
287 e_week_view_titles_item_get_type (void)
289 static GType type = 0;
291 if (G_UNLIKELY (type == 0)) {
292 const GTypeInfo type_info = {
293 sizeof (EWeekViewTitlesItemClass),
294 (GBaseInitFunc) NULL,
295 (GBaseFinalizeFunc) NULL,
296 (GClassInitFunc) week_view_titles_item_class_init,
297 (GClassFinalizeFunc) NULL,
298 NULL, /* class_data */
299 sizeof (EWeekViewTitlesItem),
300 0, /* n_preallocs */
301 (GInstanceInitFunc) week_view_titles_item_init,
302 NULL /* value_table */
305 type = g_type_register_static (
306 GNOME_TYPE_CANVAS_ITEM, "EWeekViewTitlesItem",
307 &type_info, 0);
310 return type;
313 EWeekView *
314 e_week_view_titles_item_get_week_view (EWeekViewTitlesItem *titles_item)
316 g_return_val_if_fail (E_IS_WEEK_VIEW_TITLES_ITEM (titles_item), NULL);
318 return titles_item->priv->week_view;
321 void
322 e_week_view_titles_item_set_week_view (EWeekViewTitlesItem *titles_item,
323 EWeekView *week_view)
325 g_return_if_fail (E_IS_WEEK_VIEW_TITLES_ITEM (titles_item));
326 g_return_if_fail (E_IS_WEEK_VIEW (week_view));
328 if (titles_item->priv->week_view != NULL)
329 g_object_unref (titles_item->priv->week_view);
331 titles_item->priv->week_view = g_object_ref (week_view);
333 g_object_notify (G_OBJECT (titles_item), "week-view");