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/>
19 * Damon Chaplin <damon@ximian.com>
21 * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
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
{
45 static gpointer parent_class
;
48 week_view_titles_item_set_property (GObject
*object
,
53 switch (property_id
) {
55 e_week_view_titles_item_set_week_view (
56 E_WEEK_VIEW_TITLES_ITEM (object
),
57 g_value_get_object (value
));
61 G_OBJECT_WARN_INVALID_PROPERTY_ID (object
, property_id
, pspec
);
65 week_view_titles_item_get_property (GObject
*object
,
70 switch (property_id
) {
74 e_week_view_titles_item_get_week_view (
75 E_WEEK_VIEW_TITLES_ITEM (object
)));
79 G_OBJECT_WARN_INVALID_PROPERTY_ID (object
, property_id
, pspec
);
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
);
99 week_view_titles_item_update (GnomeCanvasItem
*item
,
100 const cairo_matrix_t
*i2c
,
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. */
117 week_view_titles_item_draw (GnomeCanvasItem
*canvas_item
,
118 GdkDrawable
*drawable
,
124 EWeekViewTitlesItem
*titles_item
;
125 EWeekView
*week_view
;
127 gint col_width
, col
, date_width
, date_x
;
129 GtkAllocation allocation
;
130 gboolean abbreviated
;
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);
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
);
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
168 /* Draw the date. Set a clipping rectangle so we don't draw over the
170 weekday
= week_view
->display_start_day
;
171 for (col
= 0; col
< week_view
->columns
; col
++) {
172 if (weekday
== 5 && week_view
->compress_weekend
)
174 buffer
, sizeof (buffer
), "%s/%s",
175 e_get_weekday_name (G_DATE_SATURDAY
, TRUE
),
176 e_get_weekday_name (G_DATE_SUNDAY
, TRUE
));
179 buffer
, sizeof (buffer
), "%s",
180 e_get_weekday_name (weekday
+ 1, abbreviated
));
185 week_view
->col_offsets
[col
] - x
, 2 - y
,
186 week_view
->col_widths
[col
], allocation
.height
- 2);
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
];
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
);
208 /* Draw the lines down the left and right of the date cols. */
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);
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);
221 /* Draw the lines between each column. */
223 cairo_set_source_rgb (cr
, 0, 0, 0);
224 cairo_rectangle (cr
, week_view
->col_offsets
[col
] - x
, allocation
.height
- y
, 1, 1);
228 if (weekday
== 5 && week_view
->compress_weekend
)
233 weekday
= weekday
% 7;
236 g_object_unref (layout
);
240 static GnomeCanvasItem
*
241 week_view_titles_item_point (GnomeCanvasItem
*item
,
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 (
272 g_param_spec_object (
281 week_view_titles_item_init (EWeekViewTitlesItem
*titles_item
)
283 titles_item
->priv
= E_WEEK_VIEW_TITLES_ITEM_GET_PRIVATE (titles_item
);
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
),
301 (GInstanceInitFunc
) week_view_titles_item_init
,
302 NULL
/* value_table */
305 type
= g_type_register_static (
306 GNOME_TYPE_CANVAS_ITEM
, "EWeekViewTitlesItem",
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
;
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");