1 --- gtk+-2.6.4/gtk/gtkcalendar.c 2004-11-12 19:51:58.000000000 +0200
2 +++ gtk+-2.6.4/gtk/gtkcalendar.c 2005-04-06 16:19:36.267024936 +0300
5 /*** END OF lib_date routines ********************************************/
7 +/* HILDON: Spacings modified */
9 +#define HILDON_ARROW_WIDTH 20
10 +#define HILDON_ARROW_HEIGHT 27
11 +#define HILDON_ARROW_SEP 5 /* Space between arrows and data */
13 +#define HILDON_DAY_WIDTH 26
14 +#define HILDON_DAY_HEIGHT 25
16 /* Spacing around day/week headers and main area, inside those windows */
17 #define CALENDAR_MARGIN 0
18 /* Spacing around day/week headers and main area, outside those windows */
19 -#define INNER_BORDER 4
20 +#define INNER_BORDER 0 /* 4 */
21 /* Separation between day headers and main area */
22 -#define CALENDAR_YSEP 4
23 +#define CALENDAR_YSEP 3 /* 4 */
24 /* Separation between week headers and main area */
25 -#define CALENDAR_XSEP 4
26 +#define CALENDAR_XSEP 6 /* 4 */
28 #define DAY_XSEP 0 /* not really good for small calendar */
29 #define DAY_YSEP 0 /* not really good for small calendar */
31 #define BACKGROUND_COLOR(widget) (& (widget)->style->base[GTK_WIDGET_STATE (widget)])
32 #define HIGHLIGHT_BACK_COLOR(widget) (& (widget)->style->mid[GTK_WIDGET_STATE (widget)])
34 +/* Default Min/Max years for hildon calendar */
35 +#define HILDON_MIN_YEAR 0
36 +#define HILDON_MAX_YEAR 2999
45 + ERRONEOUS_DATE_SIGNAL,
46 + SELECTED_DATE_SIGNAL,
51 struct _GtkCalendarPrivateData
53 GdkWindow *header_win;
54 + GdkWindow *footer_win; /* HILDON: Added below calendar */
55 GdkWindow *day_name_win;
58 GdkWindow *arrow_win[4];
66 + /* guint arrow_width; This is now defined constant. Even normal Gtk don't allow to change this */
68 guint max_month_width;
74 - guint year_before : 1;
75 +/* guint year_before : 1;*/
83 + /* Following variables are for current date */
85 + guint current_month;
88 + /* Keep track of day and month
89 + * where mouse button was pressed
92 + guint pressed_month;
94 + /* Boolean value to indicate if
95 + * out of bound day was selected
97 + gboolean is_bad_day;
99 + /* Must check if we are sliding stylus */
100 + gboolean slide_stylus;
108 static void gtk_calendar_style_set (GtkWidget *widget,
109 GtkStyle *previous_style);
110 static void gtk_calendar_paint_header (GtkWidget *widget);
111 +static void gtk_calendar_paint_footer (GtkWidget *widget);
113 static void gtk_calendar_paint_day_names (GtkWidget *widget);
114 static void gtk_calendar_paint_week_numbers (GtkWidget *widget);
115 static void gtk_calendar_paint_main (GtkWidget *widget);
122 +/* This function was added because we need to mark current day according to
126 +gtk_calendar_check_current_date (GtkCalendar *calendar, gint x, gint y);
128 static char *default_abbreviated_dayname[7];
129 static char *default_monthname[12];
132 class->next_month = NULL;
133 class->prev_year = NULL;
134 class->next_year = NULL;
135 + class->erroneous_date = NULL;
136 + class->selected_date = NULL;
138 g_object_class_install_property (gobject_class,
144 + gtk_widget_class_install_style_property (widget_class,
145 + g_param_spec_int ("min-year",
146 + P_("Minimum year for calendar"),
147 + P_("Set minimum year calendar accepts"),
151 + G_PARAM_READWRITE));
153 + gtk_widget_class_install_style_property (widget_class,
154 + g_param_spec_int ("max-year",
155 + P_("Maximum year for calendar"),
156 + P_("Set max year that calendar accepts"),
160 + G_PARAM_READWRITE));
162 + gtk_widget_class_install_style_property (widget_class,
163 + g_param_spec_boolean ("hildonlike",
165 + _("Size allocate"),
167 + G_PARAM_READABLE));
169 gtk_calendar_signals[MONTH_CHANGED_SIGNAL] =
170 g_signal_new ("month_changed",
171 G_OBJECT_CLASS_TYPE (gobject_class),
174 _gtk_marshal_VOID__VOID,
176 + gtk_calendar_signals[ERRONEOUS_DATE_SIGNAL] =
177 + g_signal_new ("erroneous_date",
178 + G_OBJECT_CLASS_TYPE(gobject_class),
179 + G_SIGNAL_RUN_FIRST,
180 + G_STRUCT_OFFSET (GtkCalendarClass, erroneous_date),
182 + _gtk_marshal_VOID__VOID,
184 + gtk_calendar_signals[SELECTED_DATE_SIGNAL] =
185 + g_signal_new ("selected_date",
186 + G_OBJECT_CLASS_TYPE(gobject_class),
187 + G_SIGNAL_RUN_FIRST,
188 + G_STRUCT_OFFSET (GtkCalendarClass, selected_date),
190 + _gtk_marshal_VOID__VOID,
198 GtkCalendarPrivateData *private_data;
199 - gchar *year_before;
200 +/* gchar *year_before;*/
205 widget = GTK_WIDGET (calendar);
206 GTK_WIDGET_SET_FLAGS (widget, GTK_CAN_FOCUS);
207 @@ -645,16 +737,29 @@
209 calendar->marked_date[i] = FALSE;
210 calendar->num_marked_dates = 0;
211 - calendar->selected_day = tm->tm_mday;
213 + calendar->selected_day = tm->tm_mday;
215 calendar->display_flags = ( GTK_CALENDAR_SHOW_HEADING |
216 GTK_CALENDAR_SHOW_DAY_NAMES );
218 + /* Hildon: we should mark current day and we need to store current date */
219 + private_data->current_day = tm->tm_mday;
220 + private_data->current_month = tm->tm_mon;
221 + private_data->current_year = tm->tm_year + 1900;
223 + /* Hildon: following lines are for stylus sliding */
224 + private_data->slide_stylus = FALSE;
225 + private_data->prev_row = -1;
226 + private_data->prev_col = -1;
228 + /* Hildon: is_bad_day indicate if day was selected out of legal range */
229 + private_data->is_bad_day = FALSE;
231 calendar->highlight_row = -1;
232 - calendar->highlight_col = -1;
233 + calendar->highlight_col = -1;
235 calendar->focus_row = -1;
236 - calendar->focus_col = -1;
237 + calendar->focus_col = -1;
238 calendar->xor_gc = NULL;
240 private_data->max_year_width = 0;
242 private_data->max_label_char_ascent = 0;
243 private_data->max_label_char_descent = 0;
245 - private_data->arrow_width = 10;
246 +/* private_data->arrow_width = 10;*/
248 private_data->freeze_count = 0;
251 gtk_drag_dest_set (widget, 0, NULL, 0, GDK_ACTION_COPY);
252 gtk_drag_dest_add_text_targets (widget);
255 private_data->year_before = 0;
257 /* Translate to calendar:YM if you want years to be displayed
258 @@ -702,11 +808,13 @@
259 private_data->year_before = 1;
260 else if (strcmp (year_before, "calendar:MY") != 0)
261 g_warning ("Whoever translated calendar:MY did so wrongly.\n");
264 /* Translate to calendar:week_start:0 if you want Sunday to be the
265 * first day of the week to calendar:week_start:1 if you want Monday
266 * to be the first day of the week, and so on.
269 week_start = _("calendar:week_start:0");
271 if (strncmp (week_start, "calendar:week_start:", 20) == 0)
279 row_height (GtkCalendar *calendar)
282 - ((calendar->display_flags & GTK_CALENDAR_SHOW_DAY_NAMES)
283 ? CALENDAR_YSEP : CALENDAR_MARGIN)) / 6;
288 /* row_from_y: returns the row 0-5 that the
289 * y pixel of the xwindow is in */
290 @@ -769,16 +877,15 @@
296 gint y_top, y_bottom;
298 - height = row_height (calendar);
301 for (r = 0; r < 6; r++)
303 y_top = top_y_for_row (calendar, r);
304 - y_bottom = y_top + height;
305 + y_bottom = y_top + HILDON_DAY_HEIGHT /*height*/;
307 if (event_y >= y_top && event_y < y_bottom)
309 @@ -796,16 +903,16 @@
315 if (gtk_widget_get_direction (GTK_WIDGET (calendar)) == GTK_TEXT_DIR_RTL)
319 width = GTK_CALENDAR_PRIVATE_DATA (calendar)->day_width;
320 if (calendar->display_flags & GTK_CALENDAR_SHOW_WEEK_NUMBERS)
321 x_left = CALENDAR_XSEP + (width + DAY_XSEP) * column;
323 x_left = CALENDAR_MARGIN + (width + DAY_XSEP) * column;
329 @@ -818,25 +925,41 @@
331 return (GTK_CALENDAR_PRIVATE_DATA (calendar)->main_h
332 - (CALENDAR_MARGIN + (6 - row)
333 - * row_height (calendar)));
334 + * HILDON_DAY_HEIGHT));
338 gtk_calendar_set_month_prev (GtkCalendar *calendar)
343 + gboolean hildonlike;
345 + gtk_widget_style_get (GTK_WIDGET (calendar), "hildonlike", &hildonlike,
346 + "min-year", &min_year, NULL);
348 if (calendar->display_flags & GTK_CALENDAR_NO_MONTH_CHANGE)
351 if (calendar->month == 0)
353 - calendar->month = 11;
362 + if (calendar->year > min_year)
364 + calendar->month = 11;
370 + calendar->month = 11;
377 month_len = month_length[leap (calendar->year)][calendar->month + 1];
379 gtk_calendar_freeze (calendar);
380 @@ -870,17 +993,32 @@
381 gtk_calendar_set_month_next (GtkCalendar *calendar)
385 + gboolean hildonlike;
387 g_return_if_fail (GTK_IS_WIDGET (calendar));
389 + gtk_widget_style_get (GTK_WIDGET (calendar), "hildonlike", &hildonlike,
390 + "max-year", &max_year, NULL);
392 if (calendar->display_flags & GTK_CALENDAR_NO_MONTH_CHANGE)
396 if (calendar->month == 11)
398 - calendar->month = 0;
402 + if (calendar->year < max_year)
404 + calendar->month = 0;
410 + calendar->month = 0;
416 @@ -912,10 +1050,22 @@
417 gtk_calendar_set_year_prev (GtkCalendar *calendar)
422 + gboolean hildonlike;
424 g_return_if_fail (GTK_IS_WIDGET (calendar));
427 + gtk_widget_style_get (GTK_WIDGET (calendar), "hildonlike", &hildonlike,
428 + "min-year", &min_year, NULL);
432 + if (calendar->year > min_year)
438 gtk_calendar_freeze (calendar);
439 gtk_calendar_compute_days (calendar);
440 g_signal_emit (calendar,
441 @@ -944,14 +1094,26 @@
446 + gboolean hildonlike;
448 g_return_if_fail (GTK_IS_WIDGET (calendar));
450 widget = GTK_WIDGET (calendar);
452 + gtk_widget_style_get(widget, "hildonlike", &hildonlike,
453 + "max-year", &max_year, NULL);
455 gtk_calendar_freeze (calendar);
460 + if (calendar->year < max_year)
466 gtk_calendar_compute_days (calendar);
467 g_signal_emit (calendar,
468 gtk_calendar_signals[NEXT_YEAR_SIGNAL],
472 gtk_calendar_select_day (calendar, calendar->selected_day);
474 gtk_widget_queue_draw (GTK_WIDGET (calendar));
475 gtk_calendar_thaw (calendar);
481 + gint max_year, min_year;
482 + gboolean hildonlike;
484 calendar = GTK_CALENDAR (widget);
485 private_data = GTK_CALENDAR_PRIVATE_DATA (widget);
486 @@ -997,20 +1160,36 @@
487 /* If row or column isn't found, just return. */
488 if (row == -1 || col == -1)
491 - day_month = calendar->day_month[row][col];
493 - if (event->type == GDK_BUTTON_PRESS)
494 + gtk_widget_style_get (GTK_WIDGET (calendar), "hildonlike", &hildonlike,
495 + "max-year", &max_year, "min-year", &min_year, NULL);
496 + day_month = calendar->day_month[row][col];
500 + if ((calendar->year == min_year && calendar->month == 0 && day_month == MONTH_PREV)
501 + || (calendar->year == max_year && calendar->month == 11 && day_month == MONTH_NEXT))
503 + private_data->is_bad_day = TRUE;
504 + g_signal_emit (calendar, gtk_calendar_signals[ERRONEOUS_DATE_SIGNAL], 0);
508 + if (event->type == (hildonlike ? GDK_BUTTON_RELEASE : GDK_BUTTON_PRESS))
510 day = calendar->day[row][col];
512 if (day_month == MONTH_PREV)
513 - gtk_calendar_set_month_prev (calendar);
515 + gtk_calendar_set_month_prev (calendar);
517 else if (day_month == MONTH_NEXT)
518 - gtk_calendar_set_month_next (calendar);
520 + gtk_calendar_set_month_next (calendar);
523 if (!GTK_WIDGET_HAS_FOCUS (widget))
524 - gtk_widget_grab_focus (widget);
525 + gtk_widget_grab_focus (widget);
527 if (event->button == 1)
529 @@ -1025,9 +1204,8 @@
531 private_data->in_drag = 0;
532 if (day_month == MONTH_CURRENT)
533 - g_signal_emit (calendar,
534 - gtk_calendar_signals[DAY_SELECTED_DOUBLE_CLICK_SIGNAL],
536 + g_signal_emit (calendar,
537 + gtk_calendar_signals[DAY_SELECTED_DOUBLE_CLICK_SIGNAL], 0);
541 @@ -1039,18 +1217,18 @@
542 GdkWindowAttr attributes;
543 gint attributes_mask;
545 - gboolean year_left;
546 + /*gboolean year_left;*/
548 g_return_if_fail (GTK_IS_CALENDAR (widget));
550 calendar = GTK_CALENDAR (widget);
551 private_data = GTK_CALENDAR_PRIVATE_DATA (widget);
554 if (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_LTR)
555 year_left = private_data->year_before;
557 year_left = !private_data->year_before;
560 /* Arrow windows ------------------------------------- */
561 if (! (calendar->display_flags & GTK_CALENDAR_NO_MONTH_CHANGE)
562 && (calendar->display_flags & GTK_CALENDAR_SHOW_HEADING))
563 @@ -1063,10 +1241,26 @@
564 | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK
565 | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK);
566 attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;
568 - attributes.width = private_data->arrow_width;
569 - attributes.height = private_data->header_h - 7;
570 - for (i = 0; i < 4; i++)
572 + attributes.width = HILDON_ARROW_WIDTH;
573 + attributes.height = HILDON_ARROW_HEIGHT;
575 + attributes.x = (widget->allocation.width - private_data->max_year_width) / 2 - HILDON_ARROW_WIDTH - HILDON_ARROW_SEP;
576 + private_data->arrow_win[ARROW_YEAR_LEFT] = gdk_window_new (private_data->header_win,
577 + &attributes, attributes_mask);
579 + attributes.x = (widget->allocation.width + private_data->max_year_width) / 2 + HILDON_ARROW_SEP;
580 + private_data->arrow_win[ARROW_YEAR_RIGHT] = gdk_window_new (private_data->header_win,
581 + &attributes, attributes_mask);
582 + attributes.x = (widget->allocation.width - private_data->max_month_width) / 2 - HILDON_ARROW_WIDTH - HILDON_ARROW_SEP;
583 + private_data->arrow_win[ARROW_MONTH_LEFT] = gdk_window_new (private_data->footer_win,
584 + &attributes, attributes_mask);
585 + attributes.x = (widget->allocation.width + private_data->max_month_width) / 2 + HILDON_ARROW_SEP;
586 + private_data->arrow_win[ARROW_MONTH_RIGHT] = gdk_window_new (private_data->footer_win,
587 + &attributes, attributes_mask);
590 +for (i = 0; i < 4; i++)
594 @@ -1105,7 +1299,10 @@
596 private_data->arrow_win[i] = gdk_window_new (private_data->header_win,
599 + attributes_mask);*/
601 + for (i = 0; i < 4; i++)
603 if (GTK_WIDGET_IS_SENSITIVE (widget))
604 private_data->arrow_state[i] = GTK_STATE_NORMAL;
606 @@ -1145,23 +1342,33 @@
607 attributes.colormap = gtk_widget_get_colormap (widget);
608 attributes.event_mask = gtk_widget_get_events (widget) | GDK_EXPOSURE_MASK;
609 attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;
610 - attributes.x = widget->style->xthickness;
611 - attributes.y = widget->style->ythickness;
612 - attributes.width = widget->allocation.width - 2 * attributes.x;
613 - attributes.height = private_data->header_h - 2 * attributes.y;
614 + attributes.x = 0 /*widget->style->xthickness*/;
615 + attributes.y = 0 /*widget->style->ythickness*/;
616 + attributes.width = widget->allocation.width; /* - 2 * attributes.x */;
617 + attributes.height = HILDON_ARROW_HEIGHT /*private_data->header_h - 2 * attributes.y*/;
618 private_data->header_win = gdk_window_new (widget->window,
619 &attributes, attributes_mask);
622 + attributes.y = HILDON_ARROW_HEIGHT + 2 * CALENDAR_YSEP + private_data->main_h + private_data->day_name_h;
624 + private_data->footer_win = gdk_window_new(widget->window,
625 + &attributes, attributes_mask);
627 gdk_window_set_background (private_data->header_win,
628 - HEADER_BG_COLOR (GTK_WIDGET (calendar)));
629 + HEADER_BG_COLOR (widget));
630 + gdk_window_set_background (private_data->footer_win,
631 + HEADER_BG_COLOR (widget));
633 gdk_window_show (private_data->header_win);
634 + gdk_window_show (private_data->footer_win);
635 gdk_window_set_user_data (private_data->header_win, widget);
637 + gdk_window_set_user_data (private_data->footer_win, widget);
641 private_data->header_win = NULL;
643 + private_data->footer_win = NULL;
645 gtk_calendar_realize_arrows (widget);
648 @@ -1172,7 +1379,7 @@
649 GtkCalendarPrivateData *private_data;
650 GdkWindowAttr attributes;
651 gint attributes_mask;
654 g_return_if_fail (GTK_IS_CALENDAR (widget));
656 calendar = GTK_CALENDAR (widget);
657 @@ -1187,18 +1394,16 @@
658 attributes.colormap = gtk_widget_get_colormap (widget);
659 attributes.event_mask = gtk_widget_get_events (widget) | GDK_EXPOSURE_MASK;
660 attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;
661 - attributes.x = (widget->style->xthickness + INNER_BORDER);
662 - attributes.y = private_data->header_h + (widget->style->ythickness
664 - attributes.width = (widget->allocation.width
665 - - (widget->style->xthickness + INNER_BORDER)
667 + attributes.x = /*private_data->week_width*/ (widget->style->xthickness + INNER_BORDER);
668 + attributes.y = private_data->header_h;
669 + attributes.width = widget->allocation.width - attributes.x;
670 attributes.height = private_data->day_name_h;
671 private_data->day_name_win = gdk_window_new (widget->window,
674 gdk_window_set_background (private_data->day_name_win,
675 - BACKGROUND_COLOR ( GTK_WIDGET ( calendar)));
676 + BACKGROUND_COLOR ( GTK_WIDGET (calendar)));
678 gdk_window_show (private_data->day_name_win);
679 gdk_window_set_user_data (private_data->day_name_win, widget);
681 @@ -1215,7 +1420,7 @@
682 GtkCalendarPrivateData *private_data;
683 GdkWindowAttr attributes;
684 gint attributes_mask;
687 g_return_if_fail (GTK_IS_CALENDAR (widget));
689 calendar = GTK_CALENDAR (widget);
690 @@ -1231,15 +1436,15 @@
691 attributes.event_mask = gtk_widget_get_events (widget) | GDK_EXPOSURE_MASK;
693 attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;
694 - attributes.x = widget->style->xthickness + INNER_BORDER;
695 - attributes.y = (private_data->header_h + private_data->day_name_h
696 - + (widget->style->ythickness + INNER_BORDER));
697 - attributes.width = private_data->week_width;
698 - attributes.height = private_data->main_h;
699 + attributes.x = 0 /*widget->style->xthickness + INNER_BORDER*/;
700 + attributes.y = private_data->header_h;
701 + /*+ (widget->style->ythickness + INNER_BORDER))*/;
702 + attributes.width = HILDON_DAY_WIDTH;
703 + attributes.height = private_data->main_h + private_data->day_name_h;
704 private_data->week_win = gdk_window_new (widget->window,
705 - &attributes, attributes_mask);
706 + &attributes, attributes_mask);
707 gdk_window_set_background (private_data->week_win,
708 - BACKGROUND_COLOR (GTK_WIDGET (calendar)));
709 + BACKGROUND_COLOR (GTK_WIDGET (calendar)));
710 gdk_window_show (private_data->week_win);
711 gdk_window_set_user_data (private_data->week_win, widget);
713 @@ -1318,7 +1523,6 @@
719 gtk_calendar_unrealize (GtkWidget *widget)
721 @@ -1343,7 +1547,10 @@
722 gdk_window_set_user_data (private_data->header_win, NULL);
723 gdk_window_destroy (private_data->header_win);
724 private_data->header_win = NULL;
726 + gdk_window_set_user_data (private_data->footer_win, NULL);
727 + gdk_window_destroy (private_data->footer_win);
728 + private_data->footer_win = NULL;
731 if (private_data->week_win)
733 @@ -1382,10 +1589,10 @@
735 PangoRectangle logical_rect;
741 - gint calendar_margin = CALENDAR_MARGIN;
742 + /*gint calendar_margin = CALENDAR_MARGIN;*/
743 gint header_width, main_width;
744 gint max_header_height = 0;
746 @@ -1401,20 +1608,20 @@
747 layout = gtk_widget_create_pango_layout (widget, NULL);
750 - * Calculate the requisition width for the widget.
751 + * Calculate the requisition width for the widget.
757 if (calendar->display_flags & GTK_CALENDAR_SHOW_HEADING)
760 private_data->max_month_width = 0;
761 for (i = 0; i < 12; i++)
763 pango_layout_set_text (layout, default_monthname[i], -1);
764 pango_layout_get_pixel_extents (layout, NULL, &logical_rect);
765 private_data->max_month_width = MAX (private_data->max_month_width,
766 - logical_rect.width + 8);
767 + logical_rect.width +8 );
768 max_header_height = MAX (max_header_height, logical_rect.height);
770 private_data->max_year_width = 0;
771 @@ -1427,13 +1634,13 @@
772 logical_rect.width + 8);
773 max_header_height = MAX (max_header_height, logical_rect.height);
779 private_data->max_month_width = 0;
780 private_data->max_year_width = 0;
784 if (calendar->display_flags & GTK_CALENDAR_NO_MONTH_CHANGE)
785 header_width = (private_data->max_month_width
786 + private_data->max_year_width
787 @@ -1494,45 +1701,30 @@
788 + (private_data->max_week_char_width
789 ? private_data->max_week_char_width * 2 + (focus_padding + focus_width) * 2 + CALENDAR_XSEP * 2
794 requisition->width = MAX (header_width, main_width + INNER_BORDER * 2) + widget->style->xthickness * 2;
795 + /* FIXME: header_width is broken, when Calendar is themed !
796 + * Next line is workaround for this bug
798 + requisition->width = (main_width + INNER_BORDER * 2) + widget->style->xthickness * 2;
801 * Calculate the requisition height for the widget.
802 + * This is Hildon calculation
806 if (calendar->display_flags & GTK_CALENDAR_SHOW_HEADING)
808 - private_data->header_h = (max_header_height + CALENDAR_YSEP * 2);
810 + private_data->header_h = HILDON_ARROW_HEIGHT + CALENDAR_YSEP;
813 private_data->header_h = 0;
817 if (calendar->display_flags & GTK_CALENDAR_SHOW_DAY_NAMES)
819 - private_data->day_name_h = (private_data->max_label_char_ascent
820 - + private_data->max_label_char_descent
821 - + 2 * (focus_padding + focus_width) + calendar_margin);
822 - calendar_margin = CALENDAR_YSEP;
824 + private_data->day_name_h = HILDON_DAY_HEIGHT;
827 private_data->day_name_h = 0;
830 - private_data->main_h = (CALENDAR_MARGIN + calendar_margin
831 - + 6 * (private_data->max_day_char_ascent
832 - + private_data->max_day_char_descent
833 - + 2 * (focus_padding + focus_width))
836 - height = (private_data->header_h + private_data->day_name_h
837 - + private_data->main_h);
839 - requisition->height = height + (widget->style->ythickness + INNER_BORDER) * 2;
840 + private_data->main_h = 6 * HILDON_DAY_HEIGHT;
841 + requisition->height = 2 * private_data->header_h + private_data->day_name_h + private_data->main_h;
843 g_object_unref (layout);
845 @@ -1544,7 +1736,7 @@
846 GtkCalendar *calendar;
847 GtkCalendarPrivateData *private_data;
848 gint xthickness = widget->style->xthickness;
849 - gint ythickness = widget->style->xthickness;
850 + /*gint ythickness = widget->style->xthickness;*/
853 widget->allocation = *allocation;
854 @@ -1569,58 +1761,24 @@
858 - private_data->day_width = (allocation->width
859 + private_data->day_width = (allocation->width
860 - (xthickness + INNER_BORDER) * 2
861 - (CALENDAR_MARGIN * 2)
863 private_data->week_width = 0;
867 if (GTK_WIDGET_REALIZED (widget))
869 gdk_window_move_resize (widget->window,
870 - allocation->x, allocation->y,
871 - allocation->width, allocation->height);
872 + widget->allocation.x, widget->allocation.y,
873 + widget->allocation.width, widget->allocation.height);
874 if (private_data->header_win)
875 gdk_window_move_resize (private_data->header_win,
876 - xthickness, ythickness,
877 - allocation->width - 2 * xthickness, private_data->header_h);
878 - if (private_data->arrow_win[ARROW_MONTH_LEFT])
881 - gdk_window_move_resize (private_data->arrow_win[ARROW_MONTH_LEFT],
882 - (allocation->width - 2 * xthickness
883 - - (3 + 2*private_data->arrow_width
884 - + private_data->max_month_width)),
886 - private_data->arrow_width,
887 - private_data->header_h - 7);
889 - gdk_window_move_resize (private_data->arrow_win[ARROW_MONTH_LEFT],
891 - private_data->arrow_width,
892 - private_data->header_h - 7);
894 - if (private_data->arrow_win[ARROW_MONTH_RIGHT])
897 - gdk_window_move_resize (private_data->arrow_win[ARROW_MONTH_RIGHT],
898 - (allocation->width - 2 * xthickness
899 - - 3 - private_data->arrow_width),
901 - private_data->arrow_width,
902 - private_data->header_h - 7);
904 - gdk_window_move_resize (private_data->arrow_win[ARROW_MONTH_RIGHT],
905 - (private_data->arrow_width
906 - + private_data->max_month_width),
908 - private_data->arrow_width,
909 - private_data->header_h - 7);
911 + 0, 0, widget->allocation.width, HILDON_ARROW_HEIGHT);
912 if (private_data->arrow_win[ARROW_YEAR_LEFT])
916 gdk_window_move_resize (private_data->arrow_win[ARROW_YEAR_LEFT],
918 private_data->arrow_width,
919 @@ -1632,11 +1790,14 @@
920 + private_data->max_year_width)),
922 private_data->arrow_width,
923 - private_data->header_h - 7);
924 + private_data->header_h - 7);*/
926 + gdk_window_move (private_data->arrow_win[ARROW_YEAR_LEFT],
927 + (widget->allocation.width - private_data->max_year_width) / 2 - HILDON_ARROW_WIDTH - HILDON_ARROW_SEP, 0);
929 if (private_data->arrow_win[ARROW_YEAR_RIGHT])
933 gdk_window_move_resize (private_data->arrow_win[ARROW_YEAR_RIGHT],
934 (private_data->arrow_width
935 + private_data->max_year_width),
936 @@ -1649,55 +1810,102 @@
937 - 3 - private_data->arrow_width),
939 private_data->arrow_width,
940 + private_data->header_h - 7);*/
941 + gdk_window_move (private_data->arrow_win[ARROW_YEAR_RIGHT],
942 + (widget->allocation.width + private_data->max_year_width) / 2 + HILDON_ARROW_SEP, 0);
944 + if (private_data->footer_win)
945 + gdk_window_move_resize (private_data->footer_win,
946 + 0, private_data->header_h + private_data->day_name_h + private_data->main_h + CALENDAR_YSEP,
947 + widget->allocation.width, HILDON_ARROW_HEIGHT);
949 + if (private_data->arrow_win[ARROW_MONTH_LEFT])
952 + gdk_window_move_resize (private_data->arrow_win[ARROW_MONTH_LEFT],
953 + (allocation->width - 2 * xthickness
954 + - (3 + 2*private_data->arrow_width
955 + + private_data->max_month_width)),
957 + private_data->arrow_width,
958 private_data->header_h - 7);
960 + gdk_window_move_resize (private_data->arrow_win[ARROW_MONTH_LEFT],
962 + private_data->arrow_width,
963 + private_data->header_h - 7);
966 + gdk_window_move (private_data->arrow_win[ARROW_MONTH_LEFT],
967 + (widget->allocation.width - private_data->max_month_width) / 2 - HILDON_ARROW_WIDTH - HILDON_ARROW_SEP, 0);
969 + if (private_data->arrow_win[ARROW_MONTH_RIGHT])
972 + gdk_window_move_resize (private_data->arrow_win[ARROW_MONTH_RIGHT],
973 + (allocation->width - 2 * xthickness
974 + - 3 - private_data->arrow_width),
976 + private_data->arrow_width,
977 + private_data->header_h - 7);
979 + gdk_window_move_resize (private_data->arrow_win[ARROW_MONTH_RIGHT],
980 + (private_data->arrow_width
981 + + private_data->max_month_width),
983 + private_data->arrow_width,
984 + private_data->header_h - 7);*/
985 + gdk_window_move (private_data->arrow_win[ARROW_MONTH_RIGHT],
986 + (widget->allocation.width + private_data->max_month_width) / 2 + HILDON_ARROW_SEP, 0);
990 if (private_data->day_name_win)
991 gdk_window_move_resize (private_data->day_name_win,
992 - xthickness + INNER_BORDER,
993 - private_data->header_h + (widget->style->ythickness + INNER_BORDER),
994 - allocation->width - (xthickness + INNER_BORDER) * 2,
995 + private_data->week_width, /*xthickness + INNER_BORDER*/
996 + private_data->header_h /*+ (widget->style->ythickness + INNER_BORDER)*/,
997 + widget->allocation.width - private_data->week_width /*- (xthickness + INNER_BORDER) * 2*/,
998 private_data->day_name_h);
999 if (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_LTR)
1001 if (private_data->week_win)
1002 gdk_window_move_resize (private_data->week_win,
1003 - (xthickness + INNER_BORDER),
1004 - private_data->header_h + private_data->day_name_h
1005 - + (widget->style->ythickness + INNER_BORDER),
1006 - private_data->week_width,
1007 - private_data->main_h);
1008 + 0 /*(xthickness + INNER_BORDER)*/,
1009 + private_data->header_h /*+ (widget->style->ythickness + INNER_BORDER)*/,
1011 + private_data->main_h + private_data->day_name_h);
1012 gdk_window_move_resize (private_data->main_win,
1013 - private_data->week_width + (xthickness + INNER_BORDER),
1014 + private_data->week_width /* + (xthickness + INNER_BORDER)*/,
1015 private_data->header_h + private_data->day_name_h
1016 - + (widget->style->ythickness + INNER_BORDER),
1018 - - private_data->week_width
1019 - - (xthickness + INNER_BORDER) * 2,
1020 + /*+ (widget->style->ythickness + INNER_BORDER)*/,
1021 + widget->allocation.width - private_data->week_width
1022 + /*- (xthickness + INNER_BORDER) * 2*/,
1023 private_data->main_h);
1027 gdk_window_move_resize (private_data->main_win,
1028 - (xthickness + INNER_BORDER),
1029 + 0 /*(xthickness + INNER_BORDER)*/,
1030 private_data->header_h + private_data->day_name_h
1031 - + (widget->style->ythickness + INNER_BORDER),
1033 + /*+ (widget->style->ythickness + INNER_BORDER)*/,
1034 + widget->allocation.width
1035 - private_data->week_width
1036 - - (xthickness + INNER_BORDER) * 2,
1037 + /*- (xthickness + INNER_BORDER) * 2*/,
1038 private_data->main_h);
1039 if (private_data->week_win)
1040 gdk_window_move_resize (private_data->week_win,
1042 + widget->allocation.width
1043 - private_data->week_width
1044 - - (xthickness + INNER_BORDER),
1045 + /*- (xthickness + INNER_BORDER)*/,
1046 private_data->header_h + private_data->day_name_h
1047 - + (widget->style->ythickness + INNER_BORDER),
1048 + /*+ (widget->style->ythickness + INNER_BORDER)*/,
1049 private_data->week_width,
1050 private_data->main_h);
1057 gtk_calendar_expose (GtkWidget *widget,
1058 GdkEventExpose *event)
1059 @@ -1711,22 +1919,24 @@
1060 if (GTK_WIDGET_DRAWABLE (widget))
1062 if (event->window == private_data->main_win)
1063 - gtk_calendar_paint_main (widget);
1064 + gtk_calendar_paint_main (widget);
1066 if (event->window == private_data->header_win)
1067 - gtk_calendar_paint_header (widget);
1069 - if (event->window == private_data->day_name_win)
1070 - gtk_calendar_paint_day_names (widget);
1072 - if (event->window == private_data->week_win)
1073 - gtk_calendar_paint_week_numbers (widget);
1074 - if (event->window == widget->window)
1075 + gtk_calendar_paint_header (widget);
1076 + if (event->window == private_data->footer_win)
1077 + gtk_calendar_paint_footer(widget);
1079 + if (event->window == private_data->day_name_win)
1080 + gtk_calendar_paint_day_names (widget);
1082 + if (event->window == private_data->week_win)
1083 + gtk_calendar_paint_week_numbers (widget);
1084 +/* if (event->window == widget->window)
1086 gtk_paint_shadow (widget->style, widget->window, GTK_WIDGET_STATE (widget),
1087 GTK_SHADOW_IN, NULL, widget, "calendar",
1088 0, 0, widget->allocation.width, widget->allocation.height);
1094 @@ -1740,12 +1950,12 @@
1097 gint header_width, cal_height;
1098 - gint max_month_width;
1099 +/* gint max_month_width;*/
1100 gint max_year_width;
1101 GtkCalendarPrivateData *private_data;
1102 PangoLayout *layout;
1103 PangoRectangle logical_rect;
1104 - gboolean year_left;
1105 +/* gboolean year_left;*/
1107 calendar = GTK_CALENDAR (widget);
1108 private_data = GTK_CALENDAR_PRIVATE_DATA (widget);
1109 @@ -1755,29 +1965,29 @@
1110 private_data->dirty_header = 1;
1115 if (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_LTR)
1116 year_left = private_data->year_before;
1118 year_left = !private_data->year_before;
1121 private_data->dirty_header = 0;
1125 gdk_window_clear (private_data->header_win);
1127 - header_width = widget->allocation.width - 2 * widget->style->xthickness;
1128 + header_width = widget->allocation.width /*- 2 * widget->style->xthickness*/;
1129 cal_height = widget->allocation.height;
1131 - max_month_width = private_data->max_month_width;
1132 + /*max_month_width = private_data->max_month_width;*/
1133 max_year_width = private_data->max_year_width;
1135 - gdk_gc_set_foreground (gc, BACKGROUND_COLOR (GTK_WIDGET (calendar)));
1136 - gtk_paint_shadow (widget->style, private_data->header_win,
1137 +/* gdk_gc_set_foreground (gc, BACKGROUND_COLOR (GTK_WIDGET (calendar)));*/
1138 + /*gtk_paint_shadow (widget->style, private_data->header_win,
1139 GTK_STATE_NORMAL, GTK_SHADOW_OUT,
1140 NULL, widget, "calendar",
1141 - 0, 0, header_width, private_data->header_h);
1142 + 0, 0, header_width, private_data->header_h);*/
1145 g_snprintf (buffer, sizeof (buffer), "%d", calendar->year);
1146 @@ -1785,55 +1995,118 @@
1147 pango_layout_get_pixel_extents (layout, NULL, &logical_rect);
1150 - y = (private_data->header_h - logical_rect.height) / 2;
1152 + y = (HILDON_ARROW_HEIGHT /*private_data->header_h*/ - logical_rect.height) / 2;
1153 + x = (widget->allocation.width - logical_rect.width) / 2;
1155 /* Draw year and its arrows */
1158 if (calendar->display_flags & GTK_CALENDAR_NO_MONTH_CHANGE)
1160 - x = 3 + (max_year_width - logical_rect.width)/2;
1162 +/* if (year_left) */
1163 + x = /*3+*/(widget->allocation.width - logical_rect.width)/2;
1165 x = header_width - (3 + max_year_width
1166 - - (max_year_width - logical_rect.width)/2);
1167 + - (max_year_width - logical_rect.width)/2);*/
1170 - x = 3 + private_data->arrow_width + (max_year_width - logical_rect.width)/2;
1172 +/* if (year_left)*/
1173 + x = 3 + HILDON_ARROW_WIDTH /*private_data->arrow_width*/ + (max_year_width - logical_rect.width)/2;
1175 x = header_width - (3 + private_data->arrow_width + max_year_width
1176 - (max_year_width - logical_rect.width)/2);
1179 + gdk_gc_set_foreground (gc, HEADER_FG_COLOR (GTK_WIDGET (calendar)));
1180 + gdk_draw_layout (private_data->header_win, gc, x, y, layout);
1182 + gtk_calendar_paint_arrow (widget, ARROW_YEAR_LEFT);
1183 + gtk_calendar_paint_arrow (widget, ARROW_YEAR_RIGHT);
1185 + g_object_unref (layout);
1189 +gtk_calendar_paint_footer (GtkWidget *widget)
1191 +GtkCalendar *calendar;
1195 + gint header_width, cal_height;
1196 +/* gint max_month_width;
1197 + gint max_year_width;*/
1198 + GtkCalendarPrivateData *private_data;
1199 + PangoLayout *layout;
1200 + PangoRectangle logical_rect;
1201 +/* gboolean year_left;*/
1203 + calendar = GTK_CALENDAR (widget);
1204 + private_data = GTK_CALENDAR_PRIVATE_DATA (widget);
1206 + if (private_data->freeze_count)
1208 + private_data->dirty_header = 1;
1212 + if (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_LTR)
1213 + year_left = private_data->year_before;
1215 + year_left = !private_data->year_before;
1217 + private_data->dirty_header = 0;
1218 + gc = calendar->gc;
1220 + /* Clear window */
1221 + gdk_window_clear (private_data->footer_win);
1223 + header_width = widget->allocation.width - 2 * widget->style->xthickness;
1224 + cal_height = widget->allocation.height;
1226 + /*max_month_width = private_data->max_month_width;*/
1227 + /*max_year_width = private_data->max_year_width;*/
1229 + /*gdk_gc_set_foreground (gc, BACKGROUND_COLOR (GTK_WIDGET (calendar)));*/
1230 + /*gtk_paint_shadow (widget->style, private_data->footer_win,
1231 + GTK_STATE_NORMAL, GTK_SHADOW_OUT,
1232 + NULL, widget, "calendar",
1233 + 0, 0, header_width, private_data->header_h);*/
1235 - gdk_gc_set_foreground (gc, HEADER_FG_COLOR (GTK_WIDGET (calendar)));
1236 - gdk_draw_layout (private_data->header_win, gc, x, y, layout);
1238 + /*g_snprintf (buffer, sizeof (buffer), "%d", calendar->year);*/
1240 +/* pango_layout_get_pixel_extents (layout, NULL, &logical_rect);*/
1246 g_snprintf (buffer, sizeof (buffer), "%s", default_monthname[calendar->month]);
1247 - pango_layout_set_text (layout, buffer, -1);
1248 + layout = gtk_widget_create_pango_layout (widget, buffer);
1249 pango_layout_get_pixel_extents (layout, NULL, &logical_rect);
1252 if (calendar->display_flags & GTK_CALENDAR_NO_MONTH_CHANGE)
1254 +/* if (year_left)*/
1255 x = header_width - (3 + max_month_width
1256 - (max_month_width - logical_rect.width)/2);
1258 - x = 3 + (max_month_width - logical_rect.width) / 2;
1260 + x = 3 + (max_month_width - logical_rect.width) / 2;*/
1263 - x = header_width - (3 + private_data->arrow_width + max_month_width
1264 +/* if (year_left)*/
1265 + x = header_width - (3 + HILDON_ARROW_WIDTH /*private_data->arrow_width*/ + max_month_width
1266 - (max_month_width - logical_rect.width)/2);
1269 x = 3 + private_data->arrow_width + (max_month_width - logical_rect.width)/2;
1272 + x = (widget->allocation.width - logical_rect.width) / 2;
1273 + y = (HILDON_ARROW_HEIGHT - logical_rect.height) / 2;
1275 + gdk_gc_set_foreground (gc, HEADER_FG_COLOR(GTK_WIDGET (calendar)));
1276 + gdk_draw_layout (private_data->footer_win, gc, x, y, layout);
1278 - gdk_draw_layout (private_data->header_win, gc, x, y, layout);
1280 - gdk_gc_set_foreground (gc, BACKGROUND_COLOR (GTK_WIDGET (calendar)));
1282 gtk_calendar_paint_arrow (widget, ARROW_MONTH_LEFT);
1283 gtk_calendar_paint_arrow (widget, ARROW_MONTH_RIGHT);
1284 - gtk_calendar_paint_arrow (widget, ARROW_YEAR_LEFT);
1285 - gtk_calendar_paint_arrow (widget, ARROW_YEAR_RIGHT);
1287 - g_object_unref (layout);
1288 + g_object_unref(layout);
1292 @@ -1851,15 +2124,17 @@
1293 GtkCalendarPrivateData *private_data;
1296 + gboolean hildonlike;
1298 g_return_if_fail (GTK_IS_CALENDAR (widget));
1299 calendar = GTK_CALENDAR (widget);
1300 private_data = GTK_CALENDAR_PRIVATE_DATA (widget);
1304 gtk_widget_style_get (GTK_WIDGET (widget),
1305 "focus-line-width", &focus_width,
1306 "focus-padding", &focus_padding,
1307 + "hildonlike", &hildonlike,
1310 * Handle freeze/thaw functionality
1311 @@ -1887,18 +2162,22 @@
1312 * Draw rectangles as inverted background for the labels.
1315 - gdk_gc_set_foreground (gc, SELECTED_BG_COLOR (widget));
1316 - gdk_draw_rectangle (private_data->day_name_win, gc, TRUE,
1317 - CALENDAR_MARGIN, CALENDAR_MARGIN,
1318 - cal_width-CALENDAR_MARGIN * 2,
1319 - private_data->day_name_h - CALENDAR_MARGIN);
1321 - if (calendar->display_flags & GTK_CALENDAR_SHOW_WEEK_NUMBERS)
1322 - gdk_draw_rectangle (private_data->day_name_win, gc, TRUE,
1324 - private_data->day_name_h - CALENDAR_YSEP,
1325 - private_data->week_width - CALENDAR_YSEP - CALENDAR_MARGIN,
1327 + /* Hildon: don't paint dayname window */
1330 + gdk_gc_set_foreground (gc, SELECTED_BG_COLOR (widget));
1331 + gdk_draw_rectangle (private_data->day_name_win, gc, TRUE,
1332 + CALENDAR_MARGIN, CALENDAR_MARGIN,
1333 + cal_width-CALENDAR_MARGIN * 2,
1334 + private_data->day_name_h - CALENDAR_MARGIN);
1336 + if (calendar->display_flags & GTK_CALENDAR_SHOW_WEEK_NUMBERS)
1337 + gdk_draw_rectangle (private_data->day_name_win, gc, TRUE,
1339 + private_data->day_name_h - CALENDAR_YSEP,
1340 + private_data->week_width - CALENDAR_YSEP - CALENDAR_MARGIN,
1346 @@ -1908,28 +2187,43 @@
1348 gdk_gc_set_foreground (gc, SELECTED_FG_COLOR (widget));
1349 for (i = 0; i < 7; i++)
1352 if (gtk_widget_get_direction (GTK_WIDGET (calendar)) == GTK_TEXT_DIR_RTL)
1357 - day = (day + private_data->week_start) % 7;
1358 - g_snprintf (buffer, sizeof (buffer), "%s", default_abbreviated_dayname[day]);
1360 + day = (day + private_data->week_start) % 7;
1361 + g_snprintf (buffer, sizeof (buffer), "%s", default_abbreviated_dayname[day]);
1363 + pango_layout_set_text (layout, buffer, -1);
1364 + pango_layout_get_pixel_extents (layout, NULL, &logical_rect);
1366 - pango_layout_set_text (layout, buffer, -1);
1367 - pango_layout_get_pixel_extents (layout, NULL, &logical_rect);
1368 + /* Hildon: draw passive focus for day name */
1369 + if (hildonlike && calendar->focus_col == i)
1371 + guint x = left_x_for_column (calendar, calendar->focus_col);
1373 - gdk_draw_layout (private_data->day_name_win, gc,
1374 - (CALENDAR_MARGIN +
1375 - + (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_LTR ?
1376 - (private_data->week_width + (private_data->week_width ? CALENDAR_XSEP : 0))
1379 - + (day_width - logical_rect.width)/2),
1380 - CALENDAR_MARGIN + focus_width + focus_padding + logical_rect.y,
1382 + gtk_paint_box( GTK_WIDGET (calendar)->style,
1383 + private_data->day_name_win,
1385 + GTK_SHADOW_OUT, NULL,
1386 + GTK_WIDGET (calendar), "passive-focus",
1387 + (x + 4) + HILDON_DAY_WIDTH, 0,
1389 + HILDON_DAY_HEIGHT);
1391 + gdk_draw_layout (private_data->day_name_win, gc,
1392 + (CALENDAR_MARGIN +
1393 + + (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_LTR ?
1394 + (private_data->week_width + (private_data->week_width ? CALENDAR_XSEP : 0))
1397 + + (day_width - logical_rect.width)/2),
1398 + CALENDAR_MARGIN + focus_width + focus_padding + logical_rect.y,
1404 g_object_unref (layout);
1407 @@ -1940,14 +2234,15 @@
1409 gint row, week = 0, year;
1412 - gint y_loc, day_height;
1414 + gint y_loc /*, day_height*/;
1415 GtkCalendarPrivateData *private_data;
1416 PangoLayout *layout;
1417 PangoRectangle logical_rect;
1421 + gboolean hildonlike;
1423 g_return_if_fail (GTK_IS_CALENDAR (widget));
1424 g_return_if_fail (widget->window != NULL);
1425 calendar = GTK_CALENDAR (widget);
1426 @@ -1968,6 +2263,7 @@
1427 gtk_widget_style_get (GTK_WIDGET (widget),
1428 "focus-line-width", &focus_width,
1429 "focus-padding", &focus_padding,
1430 + "hildonlike", &hildonlike,
1434 @@ -1981,18 +2277,23 @@
1437 gdk_gc_set_foreground (gc, SELECTED_BG_COLOR (widget));
1438 - if (private_data->day_name_win)
1439 - gdk_draw_rectangle (private_data->week_win, gc, TRUE,
1442 - private_data->week_width - CALENDAR_MARGIN,
1443 - private_data->main_h - CALENDAR_MARGIN);
1445 - gdk_draw_rectangle (private_data->week_win, gc, TRUE,
1448 - private_data->week_width - CALENDAR_MARGIN,
1449 - private_data->main_h - 2 * CALENDAR_MARGIN);
1451 + /* Hildon: don't paint background for weekday window */
1454 + if (private_data->day_name_win)
1455 + gdk_draw_rectangle (private_data->week_win, gc, TRUE,
1458 + private_data->week_width - CALENDAR_MARGIN,
1459 + private_data->main_h + private_data->day_name_h- CALENDAR_MARGIN);
1461 + gdk_draw_rectangle (private_data->week_win, gc, TRUE,
1464 + private_data->week_width - CALENDAR_MARGIN,
1465 + private_data->main_h - 2 * CALENDAR_MARGIN);
1470 @@ -2001,10 +2302,13 @@
1471 layout = gtk_widget_create_pango_layout (widget, NULL);
1473 gdk_gc_set_foreground (gc, SELECTED_FG_COLOR (widget));
1474 - day_height = row_height (calendar);
1475 + gdk_draw_line(private_data->week_win, gc,
1476 + HILDON_DAY_WIDTH - 1, 0, HILDON_DAY_WIDTH - 1, private_data->main_h + private_data->day_name_h);
1478 + /*day_height = row_height (calendar)*/;
1479 for (row = 0; row < 6; row++)
1481 - year = calendar->year;
1482 + year = calendar->year;
1483 if (calendar->day[row][6] < 15 && row > 3 && calendar->month == 11)
1486 @@ -2012,15 +2316,30 @@
1487 ((calendar->day[row][6] < 15 && row > 3 ? 1 : 0)
1488 + calendar->month) % 12 + 1, calendar->day[row][6]));
1490 - g_snprintf (buffer, sizeof (buffer), "%d", week);
1491 - pango_layout_set_text (layout, buffer, -1);
1492 - pango_layout_get_pixel_extents (layout, NULL, &logical_rect);
1494 - y_loc = top_y_for_row (calendar, row) + (day_height - logical_rect.height) / 2;
1496 - x_loc = (private_data->week_width
1497 + g_snprintf (buffer, sizeof (buffer), "%d", week);
1498 + pango_layout_set_text (layout, buffer, -1);
1499 + pango_layout_get_pixel_extents (layout, NULL, &logical_rect);
1501 + /* Hildon: draw passive focus for week */
1502 + if (hildonlike && calendar->focus_row == row)
1504 + guint y = top_y_for_row (calendar, calendar->focus_row + 1);
1506 + gtk_paint_box( GTK_WIDGET (calendar)->style,
1507 + private_data->week_win,
1509 + GTK_SHADOW_OUT, NULL,
1510 + GTK_WIDGET (calendar), "passive-focus",
1512 + private_data->week_width - 4,
1513 + HILDON_DAY_HEIGHT);
1516 + y_loc = private_data->day_name_h + top_y_for_row (calendar, row) + (HILDON_DAY_HEIGHT - logical_rect.height) / 2;
1517 + x_loc = (HILDON_DAY_WIDTH - logical_rect.width) / 2;
1518 + /*(private_data->week_width
1519 - logical_rect.width
1520 - - CALENDAR_XSEP - focus_padding - focus_width);
1521 + - CALENDAR_XSEP - focus_padding - focus_width);*/
1523 gdk_draw_layout (private_data->week_win, gc, x_loc, y_loc, layout);
1525 @@ -2034,11 +2353,13 @@
1527 GtkCalendar *calendar;
1528 gint r, c, row, col;
1530 + GtkCalendarPrivateData *private_data;
1531 g_return_if_fail (GTK_IS_CALENDAR (widget));
1533 calendar = GTK_CALENDAR (widget);
1536 + private_data = GTK_CALENDAR_PRIVATE_DATA (widget);
1540 for (r = 0; r < 6; r++)
1541 @@ -2054,6 +2375,7 @@
1542 g_return_if_fail (col != -1);
1544 gtk_calendar_paint_day (widget, row, col);
1549 @@ -2065,13 +2387,14 @@
1554 + /*gint day_height;*/
1560 + /*gint day_xspace;*/
1562 + gboolean hildonlike;
1564 GtkCalendarPrivateData *private_data;
1565 PangoLayout *layout;
1566 @@ -2083,6 +2406,8 @@
1567 calendar = GTK_CALENDAR (widget);
1568 private_data = GTK_CALENDAR_PRIVATE_DATA (widget);
1570 + if (private_data->main_win == NULL) return;
1573 * Handle freeze/thaw functionality
1575 @@ -2092,25 +2417,25 @@
1576 private_data->dirty_main = 1;
1580 - gtk_widget_style_get (widget, "focus-line-width", &focus_width, NULL);
1582 - day_height = row_height (calendar);
1584 - day_xspace = private_data->day_width - private_data->max_day_char_width*2;
1585 + gtk_widget_style_get (widget, "focus-line-width", &focus_width,
1586 + "hildonlike", &hildonlike, NULL);
1588 + /*day_height = row_height (calendar)*/;
1589 + /*day_xspace = HILDON_DAY_WIDTH private_data->day_width - private_data->max_day_char_width*2*/;
1591 day = calendar->day[row][col];
1594 x_left = left_x_for_column (calendar, col);
1595 - x_loc = x_left + private_data->day_width / 2 + private_data->max_day_char_width;
1596 + /*x_loc = x_left + private_data->day_width / 2 + private_data->max_day_char_width;*/
1598 y_top = top_y_for_row (calendar, row);
1600 gdk_window_clear_area (private_data->main_win, x_left, y_top,
1601 - private_data->day_width, day_height);
1602 + HILDON_DAY_WIDTH, HILDON_DAY_HEIGHT);
1607 if (calendar->day_month[row][col] == MONTH_PREV)
1609 gdk_gc_set_foreground (gc, PREV_MONTH_COLOR (GTK_WIDGET (calendar)));
1610 @@ -2123,44 +2448,43 @@
1613 if (calendar->highlight_row == row && calendar->highlight_col == col)
1615 - gdk_gc_set_foreground (gc, HIGHLIGHT_BACK_COLOR (GTK_WIDGET (calendar)));
1616 - gdk_draw_rectangle (private_data->main_win, gc, TRUE, x_left, y_top,
1618 + gdk_gc_set_foreground (gc, HIGHLIGHT_BACK_COLOR (GTK_WIDGET (calendar)));
1619 + gdk_draw_rectangle (private_data->main_win, gc, TRUE, x_left, y_top,
1620 private_data->day_width, day_height);
1624 if (calendar->selected_day == day)
1626 - gdk_gc_set_foreground (gc, SELECTED_BG_COLOR (GTK_WIDGET (calendar)));
1627 - gdk_draw_rectangle (private_data->main_win, gc, TRUE, x_left, y_top,
1628 - private_data->day_width, day_height);
1632 + /* Hildon: use custom graphics */
1635 + gtk_paint_box( GTK_WIDGET (calendar)->style,
1636 + private_data->main_win,
1638 + GTK_SHADOW_NONE, NULL,
1639 + GTK_WIDGET (calendar), "active-day",
1642 + HILDON_DAY_HEIGHT);
1646 + gdk_gc_set_foreground (gc, SELECTED_BG_COLOR (GTK_WIDGET (calendar)));
1647 + gdk_draw_rectangle (private_data->main_win, gc, TRUE, x_left, y_top,
1648 + HILDON_DAY_WIDTH, HILDON_DAY_HEIGHT);
1651 if (calendar->marked_date[day-1])
1652 - gdk_gc_set_foreground (gc, MARKED_COLOR (GTK_WIDGET (calendar)));
1653 + gdk_gc_set_foreground (gc, MARKED_COLOR (GTK_WIDGET (calendar)));
1655 - gdk_gc_set_foreground (gc, NORMAL_DAY_COLOR (GTK_WIDGET (calendar)));
1657 + gdk_gc_set_foreground (gc, NORMAL_DAY_COLOR (GTK_WIDGET (calendar)));
1658 if (calendar->selected_day == day)
1659 - gdk_gc_set_foreground (gc, SELECTED_FG_COLOR (GTK_WIDGET (calendar)));
1660 + gdk_gc_set_foreground (gc, SELECTED_FG_COLOR (GTK_WIDGET (calendar)));
1662 - gdk_gc_set_foreground (gc, & (GTK_WIDGET (calendar)->style->fg[GTK_WIDGET_STATE (calendar)]));
1666 - g_snprintf (buffer, sizeof (buffer), "%d", day);
1667 - layout = gtk_widget_create_pango_layout (widget, buffer);
1668 - pango_layout_get_pixel_extents (layout, NULL, &logical_rect);
1669 + gdk_gc_set_foreground (gc, & (GTK_WIDGET (calendar)->style->fg[GTK_WIDGET_STATE (calendar)]));
1671 - x_loc -= logical_rect.width;
1673 - y_loc = y_top + (day_height - logical_rect.height) / 2;
1674 - gdk_draw_layout (private_data->main_win, gc,
1675 - x_loc, y_loc, layout);
1676 - if (calendar->marked_date[day-1]
1677 - && calendar->day_month[row][col] == MONTH_CURRENT)
1678 - gdk_draw_layout (private_data->main_win, gc,
1679 - x_loc-1, y_loc, layout);
1682 if (GTK_WIDGET_HAS_FOCUS (calendar)
1683 && calendar->focus_row == row && calendar->focus_col == col)
1684 @@ -2168,9 +2492,9 @@
1687 if (calendar->selected_day == day)
1688 - state = GTK_WIDGET_HAS_FOCUS (widget) ? GTK_STATE_SELECTED : GTK_STATE_ACTIVE;
1689 + state = GTK_WIDGET_HAS_FOCUS (widget) ? GTK_STATE_SELECTED : GTK_STATE_ACTIVE;
1691 - state = GTK_STATE_NORMAL;
1692 + state = GTK_STATE_NORMAL;
1694 gtk_paint_focus (widget->style,
1695 private_data->main_win,
1696 @@ -2178,10 +2502,29 @@
1697 ? GTK_STATE_SELECTED : GTK_STATE_NORMAL,
1698 NULL, widget, "calendar-day",
1700 - private_data->day_width,
1703 + HILDON_DAY_HEIGHT);
1706 + /* Hildon: paint green indicator for current day */
1707 + if (hildonlike && (day == private_data->current_day && calendar->selected_day !=
1708 + private_data->current_day) && (calendar->day_month[row][col] == MONTH_CURRENT))
1709 + gtk_calendar_check_current_date (calendar, x_left, y_top);
1711 + g_snprintf (buffer, sizeof (buffer), "%d", day);
1712 + layout = gtk_widget_create_pango_layout (widget, buffer);
1713 + pango_layout_get_pixel_extents (layout, NULL, &logical_rect);
1715 + x_loc = x_left + (HILDON_DAY_WIDTH - logical_rect.width) / 2;
1716 + y_loc = y_top + (HILDON_DAY_HEIGHT - logical_rect.height) / 2;
1718 + gdk_draw_layout (private_data->main_win, gc,
1719 + x_loc, y_loc, layout);
1720 + if (calendar->marked_date[day-1]
1721 + && calendar->day_month[row][col] == MONTH_CURRENT)
1722 + gdk_draw_layout (private_data->main_win, gc,
1723 + x_loc-1, y_loc, layout);
1725 g_object_unref (layout);
1728 @@ -2195,7 +2538,7 @@
1730 g_return_if_fail (GTK_IS_CALENDAR (widget));
1731 g_return_if_fail (widget->window != NULL);
1734 calendar = GTK_CALENDAR (widget);
1735 private_data = GTK_CALENDAR_PRIVATE_DATA (widget);
1737 @@ -2208,7 +2551,7 @@
1738 gdk_window_clear (private_data->main_win);
1740 /* gtk_calendar_compute_days (calendar); */ /* REMOVE later */
1743 for (col = 0; col < 7; col++)
1744 for (row = 0; row < 6; row++)
1745 gtk_calendar_paint_day (widget, row, col);
1746 @@ -2453,9 +2796,24 @@
1750 + gboolean hildonlike;
1751 + guint min_year, max_year;
1753 g_return_val_if_fail (GTK_IS_CALENDAR (calendar), FALSE);
1754 g_return_val_if_fail (month <= 11, FALSE);
1756 + gtk_widget_style_get(GTK_WIDGET (calendar), "hildonlike", &hildonlike,
1757 + "max-year", &max_year, "min-year",
1762 + if (year >= max_year)
1764 + else if (year <= min_year)
1768 calendar->month = month;
1769 calendar->year = year;
1771 @@ -2478,12 +2836,30 @@
1772 gtk_calendar_select_day (GtkCalendar *calendar,
1775 - g_return_if_fail (GTK_IS_CALENDAR (calendar));
1776 - g_return_if_fail (day <= 31);
1778 - /* gtk_calendar_compute_days (calendar); */
1780 - /* Deselect the old day */
1782 + GtkCalendarPrivateData *priv;
1783 + g_return_if_fail (GTK_IS_CALENDAR (calendar));
1784 + g_return_if_fail (day <= 31);
1785 + priv = GTK_CALENDAR_PRIVATE_DATA (calendar);
1787 + for (row = 0; row < 6; row ++)
1788 + for (col = 0; col < 7; col++)
1790 + if (calendar->day_month[row][col] == MONTH_CURRENT
1791 + && calendar->day[row][col] == day)
1793 + calendar->focus_row = row;
1794 + calendar->focus_col = col;
1798 + /* gtk_calendar_compute_days (calendar); */
1800 + if (calendar->month != priv->current_month ||
1801 + calendar->year != priv->current_year)
1802 + gtk_calendar_unmark_day (calendar, priv->current_day);
1804 + /* Deselect the old day */
1805 if (calendar->selected_day > 0)
1808 @@ -2491,20 +2867,25 @@
1809 selected_day = calendar->selected_day;
1810 calendar->selected_day = 0;
1811 if (GTK_WIDGET_DRAWABLE (GTK_WIDGET (calendar)))
1812 - gtk_calendar_paint_day_num (GTK_WIDGET (calendar), selected_day);
1814 + gtk_calendar_paint_day_num (GTK_WIDGET (calendar), selected_day);
1818 calendar->selected_day = day;
1820 + /*printf("Selected day = %d\n", day);*/
1822 /* Select the new day */
1825 if (GTK_WIDGET_DRAWABLE (GTK_WIDGET (calendar)))
1826 - gtk_calendar_paint_day_num (GTK_WIDGET (calendar), day);
1828 + gtk_calendar_paint_day_num (GTK_WIDGET (calendar), day);
1833 g_object_notify (G_OBJECT (calendar), "day");
1835 g_signal_emit (calendar,
1836 gtk_calendar_signals[DAY_SELECTED_SIGNAL],
1838 @@ -2560,17 +2941,16 @@
1839 gtk_calendar_mark_day (GtkCalendar *calendar,
1842 - g_return_val_if_fail (GTK_IS_CALENDAR (calendar), FALSE);
1844 - if (day >= 1 && day <= 31 && calendar->marked_date[day-1] == FALSE)
1846 - calendar->marked_date[day - 1] = TRUE;
1847 - calendar->num_marked_dates++;
1849 - if (GTK_WIDGET_DRAWABLE (GTK_WIDGET (calendar)))
1851 - gtk_calendar_paint_main (GTK_WIDGET (calendar));
1853 + g_return_val_if_fail (GTK_IS_CALENDAR (calendar), FALSE);
1854 + if (day >= 1 && day <= 31 && calendar->marked_date[day-1] == FALSE)
1856 + calendar->marked_date[day - 1] = TRUE;
1857 + calendar->num_marked_dates++;
1859 + if (GTK_WIDGET_DRAWABLE (GTK_WIDGET (calendar)))
1861 + gtk_calendar_paint_main (GTK_WIDGET (calendar));
1866 @@ -2629,14 +3009,15 @@
1867 gtk_calendar_set_year_next (calendar);
1869 case ARROW_MONTH_LEFT:
1870 - gtk_calendar_set_month_prev (calendar);
1872 + gtk_calendar_set_month_prev (calendar);
1874 case ARROW_MONTH_RIGHT:
1875 gtk_calendar_set_month_next (calendar);
1880 + gtk_calendar_select_and_focus_day(calendar, calendar->selected_day);
1884 @@ -2645,6 +3026,11 @@
1885 GtkCalendar *calendar = data;
1886 GtkCalendarPrivateData *private_data = GTK_CALENDAR_PRIVATE_DATA (calendar);
1887 gboolean retval = FALSE;
1888 + GtkSettings *settings;
1891 + settings = gtk_settings_get_default ();
1892 + g_object_get (settings, "gtk-update-timeout", &timeout, NULL);
1894 GDK_THREADS_ENTER ();
1896 @@ -2655,7 +3041,7 @@
1897 if (private_data->need_timer)
1899 private_data->need_timer = FALSE;
1900 - private_data->timer = g_timeout_add (CALENDAR_TIMER_DELAY,
1901 + private_data->timer = g_timeout_add (/*CALENDAR_TIMER_DELAY*/timeout,
1902 (GSourceFunc) calendar_timer,
1903 (gpointer) calendar);
1905 @@ -2673,13 +3059,18 @@
1908 GtkCalendarPrivateData *private_data = GTK_CALENDAR_PRIVATE_DATA (widget);
1909 + GtkSettings *settings;
1912 + settings = gtk_settings_get_default ();
1913 + g_object_get (settings, "gtk-initial-timeout", &timeout, NULL);
1915 private_data->click_child = click_child;
1917 if (!private_data->timer)
1919 private_data->need_timer = TRUE;
1920 - private_data->timer = g_timeout_add (CALENDAR_INITIAL_TIMER_DELAY,
1921 + private_data->timer = g_timeout_add (/*CALENDAR_INITIAL_TIMER_DELAY*/timeout,
1925 @@ -2738,12 +3129,38 @@
1926 GtkCalendar *calendar;
1927 GtkCalendarPrivateData *private_data;
1930 + gboolean hildonlike;
1931 + gint min_year, max_year;
1933 calendar = GTK_CALENDAR (widget);
1934 private_data = GTK_CALENDAR_PRIVATE_DATA (widget);
1936 + gtk_widget_style_get(widget, "hildonlike", &hildonlike,
1937 + "min-year", &min_year, "max-year", &max_year, NULL);
1939 - if (event->window == private_data->main_win)
1940 - gtk_calendar_main_button (widget, event);
1943 + if (event->window == private_data->main_win)
1944 + gtk_calendar_main_button (widget, event);
1946 + else if (hildonlike && (event->window == private_data->main_win))
1948 + gint x = (gint) (event->x);
1949 + gint y = (gint) (event->y);
1950 + gint row = row_from_y (calendar, y);
1951 + gint col = column_from_x (calendar, x);
1952 + private_data->pressed_day = calendar->day[row][col];
1954 + if ((calendar->year == min_year && calendar->month == 0 && calendar->day_month[row][col] == MONTH_PREV) ||
1955 + (calendar->year == max_year && calendar->month == 11 && calendar->day_month[row][col] == MONTH_NEXT))
1957 + else if (calendar->day_month[row][col] == MONTH_CURRENT)
1958 + gtk_calendar_select_and_focus_day (calendar, private_data->pressed_day);
1960 + /* Remember month where button was pressed */
1961 + private_data->pressed_month = calendar->month;
1962 + private_data->slide_stylus = TRUE;
1965 if (!GTK_WIDGET_HAS_FOCUS (widget))
1966 gtk_widget_grab_focus (widget);
1967 @@ -2766,7 +3183,7 @@
1976 @@ -2775,16 +3192,45 @@
1978 GtkCalendar *calendar;
1979 GtkCalendarPrivateData *private_data;
1980 + gboolean hildonlike;
1982 calendar = GTK_CALENDAR (widget);
1983 private_data = GTK_CALENDAR_PRIVATE_DATA (widget);
1985 + gtk_widget_style_get(widget, "hildonlike", &hildonlike,
1988 + if (hildonlike && (event->window == private_data->main_win))
1990 + gtk_calendar_main_button (widget, event);
1991 + gint x = (gint) (event->x);
1992 + gint y = (gint) (event->y);
1993 + gint row = row_from_y (calendar, y);
1994 + gint col = column_from_x (calendar, x);
1995 + private_data->prev_col = -1;
1996 + private_data->prev_row = -1;
1998 + if ((private_data->pressed_day == calendar->day[row][col]) &&
1999 + (private_data->pressed_month == calendar->month))
2001 + if (!private_data->is_bad_day)
2003 + g_signal_emit (calendar, gtk_calendar_signals[SELECTED_DATE_SIGNAL], 0);
2007 + private_data->is_bad_day = FALSE;
2010 + private_data->slide_stylus = FALSE;
2013 if (event->button == 1)
2015 stop_spinning (widget);
2017 if (private_data->in_drag)
2018 - private_data->in_drag = 0;
2019 + private_data->in_drag = 0;
2023 @@ -2799,15 +3245,42 @@
2024 gint event_x, event_y;
2026 gint old_row, old_col;
2027 + gboolean hildonlike;
2029 calendar = GTK_CALENDAR (widget);
2030 private_data = GTK_CALENDAR_PRIVATE_DATA (widget);
2031 event_x = (gint) (event->x);
2032 event_y = (gint) (event->y);
2035 + gtk_widget_style_get(widget, "hildonlike", &hildonlike,
2038 if (event->window == private_data->main_win)
2043 + /* Hildon: make active day to move, when stylus is slided */
2044 + if (private_data->slide_stylus)
2046 + gint c_row = row_from_y (calendar, event_y);
2047 + gint c_col = column_from_x (calendar, event_x);
2049 + if (calendar->day_month[c_row][c_col] == MONTH_PREV ||
2050 + calendar->day_month[c_row][c_col] == MONTH_NEXT)
2052 + else if ((private_data->prev_row != c_row || private_data->prev_col != c_col) &&
2053 + (calendar->highlight_row != -1 && calendar->highlight_col != -1))
2055 + gtk_calendar_select_and_focus_day (calendar,
2056 + calendar->day[c_row][c_col]);
2057 + /* Update passive focus indicators work weekday number and name */
2058 + gtk_calendar_paint_week_numbers (GTK_WIDGET (calendar));
2059 + gtk_calendar_paint_day_names (GTK_WIDGET (calendar));
2061 + private_data->prev_col = c_col;
2062 + private_data->prev_row = c_row;
2065 if (private_data->in_drag)
2067 if (gtk_drag_check_threshold (widget,
2068 @@ -2847,7 +3320,7 @@
2069 calendar->highlight_col = col;
2071 if (row > -1 && col > -1)
2072 - gtk_calendar_paint_day (widget, row, col);
2073 + gtk_calendar_paint_day (widget, row, col);
2077 @@ -2863,7 +3336,7 @@
2079 calendar = GTK_CALENDAR (widget);
2080 private_data = GTK_CALENDAR_PRIVATE_DATA (widget);
2083 if (event->window == private_data->arrow_win[ARROW_MONTH_LEFT])
2085 private_data->arrow_state[ARROW_MONTH_LEFT] = GTK_STATE_PRELIGHT;
2086 @@ -2902,7 +3375,7 @@
2088 calendar = GTK_CALENDAR (widget);
2089 private_data = GTK_CALENDAR_PRIVATE_DATA (widget);
2092 if (event->window == private_data->main_win)
2094 row = calendar->highlight_row;
2095 @@ -2910,7 +3383,7 @@
2096 calendar->highlight_row = -1;
2097 calendar->highlight_col = -1;
2098 if (row > -1 && col > -1)
2099 - gtk_calendar_paint_day (widget, row, col);
2100 + gtk_calendar_paint_day (widget, row, col);
2103 if (event->window == private_data->arrow_win[ARROW_MONTH_LEFT])
2104 @@ -2949,10 +3422,14 @@
2106 GtkCalendar *calendar;
2108 - gint width, height;
2109 + gint max_year, min_year;
2110 + gboolean hildonlike;
2111 +/* gint width, height;*/
2113 calendar = GTK_CALENDAR (widget);
2114 private_data = GTK_CALENDAR_PRIVATE_DATA (widget);
2115 + gtk_widget_style_get (widget, "hildonlike", &hildonlike, "max-year",
2116 + &max_year, "min-year", &min_year, NULL);
2118 if (private_data->freeze_count)
2120 @@ -2965,23 +3442,81 @@
2121 state = private_data->arrow_state[arrow];
2124 - gdk_window_clear (window);
2125 +/* gdk_window_clear (window);*/
2126 gdk_window_set_background (window, &(widget)->style->bg[state]);
2127 - gdk_drawable_get_size (window, &width, &height);
2128 - gdk_window_clear_area (window,
2129 +/* gdk_drawable_get_size (window, &width, &height);*/
2130 +/* gdk_window_clear_area (window,
2133 - if (arrow == ARROW_MONTH_LEFT || arrow == ARROW_YEAR_LEFT)
2134 - gtk_paint_arrow (widget->style, window, state,
2137 + gdk_window_clear(window);
2139 + /* Hildon: added support for dimmed arrows */
2140 + if (hildonlike && (calendar->year <= min_year || calendar->year >= max_year))
2142 + if (calendar->year <= min_year)
2144 + if (arrow == ARROW_YEAR_LEFT)
2145 + gtk_paint_arrow (widget->style, window, GTK_STATE_INSENSITIVE,
2146 + GTK_SHADOW_OUT, NULL, widget, "calendar",
2147 + GTK_ARROW_LEFT, TRUE,
2148 + 0, 0, HILDON_ARROW_WIDTH, HILDON_ARROW_HEIGHT);
2149 + else if (arrow == ARROW_YEAR_RIGHT || arrow == ARROW_MONTH_RIGHT)
2150 + gtk_paint_arrow (widget->style, window, state,
2151 + GTK_SHADOW_OUT, NULL, widget, "calendar",
2152 + GTK_ARROW_RIGHT, TRUE,
2153 + 0, 0, HILDON_ARROW_WIDTH, HILDON_ARROW_HEIGHT);
2154 + else if (arrow == ARROW_MONTH_LEFT && calendar->month != 0)
2155 + gtk_paint_arrow (widget->style, window, state,
2156 + GTK_SHADOW_OUT, NULL, widget, "calendar",
2157 + GTK_ARROW_LEFT, TRUE,
2158 + 0, 0, HILDON_ARROW_WIDTH, HILDON_ARROW_HEIGHT);
2159 + else if (arrow == ARROW_MONTH_LEFT && !calendar->month)
2160 + gtk_paint_arrow (widget->style, window, GTK_STATE_INSENSITIVE,
2161 + GTK_SHADOW_OUT, NULL, widget, "calendar",
2162 + GTK_ARROW_LEFT, TRUE,
2163 + 0, 0, HILDON_ARROW_WIDTH, HILDON_ARROW_HEIGHT);
2165 + else if (calendar->year >= max_year)
2167 + if (arrow == ARROW_YEAR_RIGHT)
2168 + gtk_paint_arrow (widget->style, window, GTK_STATE_INSENSITIVE,
2169 + GTK_SHADOW_OUT, NULL, widget, "calendar",
2170 + GTK_ARROW_RIGHT, TRUE,
2171 + 0, 0, HILDON_ARROW_WIDTH, HILDON_ARROW_HEIGHT);
2172 + else if (arrow == ARROW_YEAR_LEFT || arrow == ARROW_MONTH_LEFT)
2173 + gtk_paint_arrow (widget->style, window, state,
2174 GTK_SHADOW_OUT, NULL, widget, "calendar",
2175 GTK_ARROW_LEFT, TRUE,
2176 - width/2 - 3, height/2 - 4, 8, 8);
2178 - gtk_paint_arrow (widget->style, window, state,
2179 + 0, 0, HILDON_ARROW_WIDTH, HILDON_ARROW_HEIGHT);
2180 + else if (arrow == ARROW_MONTH_RIGHT && calendar->month != 11)
2181 + gtk_paint_arrow (widget->style, window, state,
2182 + GTK_SHADOW_OUT, NULL, widget, "calendar",
2183 + GTK_ARROW_RIGHT, TRUE,
2184 + 0, 0, HILDON_ARROW_WIDTH, HILDON_ARROW_HEIGHT);
2185 + else if (arrow == ARROW_MONTH_RIGHT && calendar->month == 11)
2186 + gtk_paint_arrow (widget->style, window, GTK_STATE_INSENSITIVE,
2187 + GTK_SHADOW_OUT, NULL, widget, "calendar",
2188 + GTK_ARROW_RIGHT, TRUE,
2189 + 0, 0, HILDON_ARROW_WIDTH, HILDON_ARROW_HEIGHT);
2194 + if (arrow == ARROW_MONTH_LEFT || arrow == ARROW_YEAR_LEFT)
2195 + gtk_paint_arrow (widget->style, window, state,
2196 + GTK_SHADOW_OUT, NULL, widget, "calendar",
2197 + GTK_ARROW_LEFT, TRUE,
2198 + /* width/2 - 3, height/2 - 4, 8, 8);*/
2199 + 0, 0, HILDON_ARROW_WIDTH, HILDON_ARROW_HEIGHT);
2201 + gtk_paint_arrow (widget->style, window, state,
2202 GTK_SHADOW_OUT, NULL, widget, "calendar",
2203 GTK_ARROW_RIGHT, TRUE,
2204 - width/2 - 2, height/2 - 4, 8, 8);
2206 + /* width/2 - 2, height/2 - 4, 8, 8);*/
2207 + 0, 0, HILDON_ARROW_WIDTH, HILDON_ARROW_HEIGHT);
2213 @@ -3159,17 +3694,26 @@
2216 GtkCalendar *calendar;
2217 + GtkSettings *settings;
2223 + gint min_year, max_year;
2226 calendar = GTK_CALENDAR (widget);
2229 old_focus_row = calendar->focus_row;
2230 old_focus_col = calendar->focus_col;
2232 + gtk_widget_style_get (widget, "max-year", &max_year,
2233 + "min-year", &min_year, NULL);
2235 + settings = gtk_settings_get_default ();
2236 + g_object_get (settings, "hildon-keyboard-navigation", &knav, NULL);
2238 switch (event->keyval)
2241 @@ -3179,10 +3723,41 @@
2242 gtk_calendar_set_month_prev (calendar);
2245 - move_focus (calendar, -1);
2246 - gtk_calendar_paint_day (widget, old_focus_row, old_focus_col);
2247 - gtk_calendar_paint_day (widget, calendar->focus_row,
2248 - calendar->focus_col);
2249 + /* if we are at the first allowed day of the minimum year/month then do nothing */
2250 + if (calendar->year == min_year && calendar->month == 0 && calendar->day_month[old_focus_row][old_focus_col-1] == MONTH_PREV)
2252 + g_signal_emit (calendar, gtk_calendar_signals[ERRONEOUS_DATE_SIGNAL], 0);
2255 + else /* else normal */
2257 + move_focus (calendar, -1);
2260 + gtk_calendar_paint_day (widget, old_focus_row, old_focus_col);
2261 + gtk_calendar_paint_day (widget, calendar->focus_row,
2262 + calendar->focus_col);
2266 + gint day_month = calendar->day_month[calendar->focus_row][calendar->focus_col];
2267 + if (day_month == MONTH_CURRENT && calendar->selected_day != 1)
2269 + gtk_calendar_select_day(calendar, calendar->selected_day - 1);
2273 + if (calendar->month != 0) {
2274 + calendar->selected_day = month_length[leap (calendar->year)][calendar->month];
2276 + calendar->selected_day = month_length[leap (calendar->year -1)][12];
2278 + gtk_calendar_set_month_prev (calendar);
2280 + gtk_calendar_paint_week_numbers (GTK_WIDGET (calendar));
2281 + gtk_calendar_paint_day_names (GTK_WIDGET (calendar));
2287 @@ -3192,10 +3767,36 @@
2288 gtk_calendar_set_month_next (calendar);
2291 - move_focus (calendar, 1);
2292 - gtk_calendar_paint_day (widget, old_focus_row, old_focus_col);
2293 - gtk_calendar_paint_day (widget, calendar->focus_row,
2294 - calendar->focus_col);
2295 + if (calendar->year == max_year && calendar->month == 11 && calendar->day_month[old_focus_row][old_focus_col+1] == MONTH_NEXT)
2297 + g_signal_emit (calendar, gtk_calendar_signals[ERRONEOUS_DATE_SIGNAL], 0);
2302 + move_focus (calendar, 1);
2305 + gtk_calendar_paint_day (widget, old_focus_row, old_focus_col);
2306 + gtk_calendar_paint_day (widget, calendar->focus_row,
2307 + calendar->focus_col);
2311 + gint day_month = calendar->day_month[calendar->focus_row][calendar->focus_col];
2312 + if (day_month == MONTH_CURRENT)
2314 + gtk_calendar_select_day (calendar, calendar->selected_day + 1);
2318 + calendar->selected_day = 1;
2319 + gtk_calendar_set_month_next (calendar);
2321 + gtk_calendar_paint_week_numbers (GTK_WIDGET (calendar));
2322 + gtk_calendar_paint_day_names (GTK_WIDGET (calendar));
2328 @@ -3205,11 +3806,48 @@
2329 gtk_calendar_set_year_prev (calendar);
2332 - if (calendar->focus_row > 0)
2333 - calendar->focus_row--;
2334 - gtk_calendar_paint_day (widget, old_focus_row, old_focus_col);
2335 - gtk_calendar_paint_day (widget, calendar->focus_row,
2336 - calendar->focus_col);
2337 + if (calendar->year == min_year && calendar->month == 0 && calendar->day_month[old_focus_row-1][old_focus_col] == MONTH_PREV)
2339 + g_signal_emit (calendar, gtk_calendar_signals[ERRONEOUS_DATE_SIGNAL], 0);
2344 + if (calendar->focus_row > 0)
2345 + calendar->focus_row--;
2348 + gtk_calendar_paint_day (widget, old_focus_row, old_focus_col);
2349 + gtk_calendar_paint_day (widget, calendar->focus_row,
2350 + calendar->focus_col);
2354 + gint day_month = calendar->day_month[calendar->focus_row][calendar->focus_col];
2355 + if (day_month == MONTH_CURRENT)
2357 + if ((calendar->selected_day - 7) <= 0)
2359 + if (calendar->month != 0)
2360 + calendar->selected_day = month_length[leap (calendar->year)][calendar->month];
2362 + calendar->selected_day = month_length[leap (calendar->year - 1)][12];
2363 + gtk_calendar_set_month_prev (calendar);
2367 + gtk_calendar_select_day (calendar, calendar->selected_day - 7);
2372 + calendar->selected_day = calendar->day[calendar->focus_row][calendar->focus_col];
2373 + gtk_calendar_set_month_prev (calendar);
2375 + gtk_calendar_paint_week_numbers (GTK_WIDGET (calendar));
2376 + gtk_calendar_paint_day_names (GTK_WIDGET (calendar));
2382 @@ -3219,12 +3857,49 @@
2383 gtk_calendar_set_year_next (calendar);
2386 - if (calendar->focus_row < 5)
2387 - calendar->focus_row++;
2388 - gtk_calendar_paint_day (widget, old_focus_row, old_focus_col);
2389 - gtk_calendar_paint_day (widget, calendar->focus_row,
2390 - calendar->focus_col);
2391 + if (calendar->year == max_year && calendar->month == 11 && calendar->day_month[old_focus_row+1][old_focus_col] == MONTH_NEXT)
2393 + g_signal_emit (calendar, gtk_calendar_signals[ERRONEOUS_DATE_SIGNAL], 0);
2399 + if (calendar->focus_row < 5)
2400 + calendar->focus_row++;
2403 + gtk_calendar_paint_day (widget, old_focus_row, old_focus_col);
2404 + gtk_calendar_paint_day (widget, calendar->focus_row,
2405 + calendar->focus_col);
2409 + gint day_month = calendar->day_month[calendar->focus_row][calendar->focus_col];
2410 + if (day_month == MONTH_CURRENT)
2412 + if ((calendar->selected_day + 7) >
2413 + month_length[leap (calendar->year)][calendar->month + 1])
2415 + calendar->selected_day = 1;
2416 + gtk_calendar_set_month_next (calendar);
2420 + gtk_calendar_select_day (calendar, calendar->selected_day + 7);
2425 + calendar->selected_day = calendar->day[calendar->focus_row][calendar->focus_col];
2426 + gtk_calendar_set_month_next (calendar);
2428 + gtk_calendar_paint_week_numbers (GTK_WIDGET (calendar));
2429 + gtk_calendar_paint_day_names (GTK_WIDGET (calendar));
2437 @@ -3545,3 +4220,27 @@
2438 gtk_calendar_select_day (calendar, day);
2439 g_object_thaw_notify (G_OBJECT (calendar));
2442 +/* This function return TRUE if we should mark date and FALSE
2446 +gtk_calendar_check_current_date (GtkCalendar *calendar, gint x, gint y)
2448 + GtkCalendarPrivateData *private_data;
2450 + private_data = GTK_CALENDAR_PRIVATE_DATA (calendar);
2452 + if (calendar->month == private_data->current_month &&
2453 + calendar->year == private_data->current_year)
2455 + gtk_paint_box( GTK_WIDGET (calendar)->style,
2456 + private_data->main_win,
2458 + GTK_SHADOW_NONE, NULL,
2459 + GTK_WIDGET (calendar), "current-day",
2462 + HILDON_DAY_HEIGHT);