diff options
-rw-r--r-- | calendar/ChangeLog | 18 | ||||
-rw-r--r-- | calendar/gui/e-calendar-view.c | 168 | ||||
-rw-r--r-- | calendar/gui/e-calendar-view.h | 8 | ||||
-rw-r--r-- | calendar/gui/e-day-view.c | 48 | ||||
-rw-r--r-- | calendar/gui/e-week-view.c | 90 | ||||
-rw-r--r-- | calendar/gui/e-week-view.h | 1 | ||||
-rw-r--r-- | calendar/gui/misc.c | 52 | ||||
-rw-r--r-- | calendar/gui/misc.h | 3 |
8 files changed, 379 insertions, 9 deletions
diff --git a/calendar/ChangeLog b/calendar/ChangeLog index 13b683a4de..8d6a674924 100644 --- a/calendar/ChangeLog +++ b/calendar/ChangeLog @@ -1,3 +1,21 @@ +2005-11-23 Srinivasa Ragavan <sragavan@novell.com> + + * gui/e-calendar-view.c (tooltip_grab), (get_label), + (e_calendar_view_get_tooltips): Added a function to get tooltip + tooltip widget + * gui/e-calendar-view.h: + * gui/e-day-view.c (e_day_view_add_event), + (e_day_view_reshape_long_event), (e_day_view_reshape_day_event), + (e_day_view_on_text_item_event): Added tooltip for day/work week + view. + * gui/e-week-view.c (e_week_view_add_event), (tooltip_event_cb), + (e_week_view_reshape_event_span), (e_week_view_on_text_item_event): + Added tooltip for week/month view. + * gui/e-week-view.h: + * gui/misc.c (get_position_in_array), (calculate_time): Added a + function for converting time to string. + * gui/misc.h: + 2005-11-22 Boby Wang <boby.wang@sun.com> Fixes #321237 * gui/dialogs/event-page.glade: Add the categories' name diff --git a/calendar/gui/e-calendar-view.c b/calendar/gui/e-calendar-view.c index f2324da1f7..d9b624f5f9 100644 --- a/calendar/gui/e-calendar-view.c +++ b/calendar/gui/e-calendar-view.c @@ -31,9 +31,14 @@ #include <gtk/gtkstock.h> #include <gdk/gdkkeysyms.h> #include <gtk/gtkbindings.h> +#include <gtk/gtklabel.h> +#include <gtk/gtkbox.h> +#include <gtk/gtkcontainer.h> +#include <gtk/gtkwindow.h> #include <libgnome/gnome-i18n.h> #include <e-util/e-dialog-utils.h> #include <e-util/e-icon-factory.h> +#include <e-util/e-time-utils.h> #include "e-calendar-marshal.h" #include <libecal/e-cal-time-util.h> #include <libecal/e-cal-component.h> @@ -59,6 +64,7 @@ #include "goto.h" #include "ea-calendar.h" #include "e-cal-popup.h" +#include "misc.h" /* Used for the status bar messages */ #define EVOLUTION_CALENDAR_PROGRESS_IMAGE "stock_calendar" @@ -1851,3 +1857,165 @@ e_calendar_view_modify_and_send (ECalComponent *comp, g_message (G_STRLOC ": Could not update the object!"); } } + +static gboolean +tooltip_grab (GtkWidget *tooltip, GdkEventKey *event, ECalendarViewEvent *pevent) +{ + gdk_keyboard_ungrab(GDK_CURRENT_TIME); + + gtk_widget_destroy (pevent->tooltip); + pevent->tooltip = NULL; + pevent->timeout = -1; + + return FALSE; +} + +static char * +get_label (struct icaltimetype *tt) +{ + char buffer[1000]; + struct tm tmp_tm; + + tmp_tm = icaltimetype_to_tm (tt); + e_time_format_date_and_time (&tmp_tm, + calendar_config_get_24_hour_format (), + FALSE, FALSE, + buffer, 1000); + + return g_strdup (buffer); +} + + +gboolean +e_calendar_view_get_tooltips (ECalendarViewEvent *pevent) +{ + GtkWidget *label, *box, *hbox, *ebox, *frame; + const char *str; + char *tmp, *tmp1, *tmp2; + ECalComponentOrganizer organiser; + ECalComponentDateTime dtstart, dtend; + icalcomponent *clone_comp; + time_t t_start, t_end; + + ECalComponent *newcomp = e_cal_component_new (); + icaltimezone *zone; + GdkColor color, outer_color; + + gdk_color_parse ("PeachPuff2", &color); + gdk_color_parse ("antique white", &outer_color); + + clone_comp = icalcomponent_new_clone (pevent->comp_data->icalcomp); + if (!e_cal_component_set_icalcomponent (newcomp, clone_comp)) + g_warning ("couldn't update calendar component with modified data from backend\n"); + + box = gtk_vbox_new (FALSE, 0); + + str = icalcomponent_get_summary (pevent->comp_data->icalcomp); + tmp = g_strdup_printf ("<b>%s</b>", str); + label = gtk_label_new (NULL); + gtk_label_set_line_wrap ((GtkLabel *)label, TRUE); + gtk_label_set_markup ((GtkLabel *)label, tmp); + + hbox = gtk_hbox_new (FALSE, 0); + gtk_box_pack_start ((GtkBox *)hbox, label, FALSE, FALSE, 0); + ebox = gtk_event_box_new (); + gtk_container_add ((GtkContainer *)ebox, hbox); + gtk_widget_modify_bg (ebox, GTK_STATE_NORMAL, &color); + gtk_widget_modify_bg (ebox, GTK_STATE_ACTIVE, &color); + gtk_widget_modify_bg (ebox, GTK_STATE_SELECTED, &color); + gtk_widget_modify_bg (ebox, GTK_STATE_PRELIGHT, &color); + + gtk_box_pack_start ((GtkBox *)box, ebox, FALSE, FALSE, 0); + g_free (tmp); + + e_cal_component_get_organizer (newcomp, &organiser); + if (organiser.cn) { + char *ptr ; + GtkWidget *hbox = gtk_hbox_new (FALSE, 0); + ptr = strchr(organiser.value, ':'); + ptr++; + tmp = g_strdup_printf ("Organiser: %s <%s>", organiser.cn, ptr); + label = gtk_label_new (tmp); + gtk_box_pack_start ((GtkBox *)hbox, label, FALSE, FALSE, 0); + ebox = gtk_event_box_new (); + gtk_container_add ((GtkContainer *)ebox, hbox); + gtk_widget_modify_bg (ebox, GTK_STATE_NORMAL, &outer_color); + gtk_widget_modify_bg (ebox, GTK_STATE_ACTIVE, &outer_color); + gtk_widget_modify_bg (ebox, GTK_STATE_SELECTED, &outer_color); + gtk_widget_modify_bg (ebox, GTK_STATE_PRELIGHT, &outer_color); + gtk_box_pack_start ((GtkBox *)box, ebox, FALSE, FALSE, 0); + + g_free (tmp); + } + + e_cal_component_get_location (newcomp, &str); + + if (str) { + tmp = g_strdup_printf ("Location: %s", str); + label = gtk_label_new (NULL); + gtk_label_set_markup ((GtkLabel *)label, tmp); + hbox = gtk_hbox_new (FALSE, 0); + gtk_box_pack_start ((GtkBox *)hbox, label, FALSE, FALSE, 0); + ebox = gtk_event_box_new (); + gtk_container_add ((GtkContainer *)ebox, hbox); + gtk_widget_modify_bg (ebox, GTK_STATE_NORMAL, &outer_color); + gtk_widget_modify_bg (ebox, GTK_STATE_ACTIVE, &outer_color); + gtk_widget_modify_bg (ebox, GTK_STATE_SELECTED, &outer_color); + gtk_widget_modify_bg (ebox, GTK_STATE_PRELIGHT, &outer_color); + gtk_box_pack_start ((GtkBox *)box, ebox, FALSE, FALSE, 0); + g_free (tmp); + } + e_cal_component_get_dtstart (newcomp, &dtstart); + e_cal_component_get_dtend (newcomp, &dtend); + + if (dtstart.tzid) { + zone = icalcomponent_get_timezone (e_cal_component_get_icalcomponent (newcomp), dtstart.tzid); + } else { + zone = NULL; + } + t_start = icaltime_as_timet_with_zone (*dtstart.value, zone); + + if (dtend.tzid) { + zone = icalcomponent_get_timezone (e_cal_component_get_icalcomponent (newcomp), dtend.tzid); + } else { + zone = NULL; + } + t_end = icaltime_as_timet_with_zone (*dtend.value, zone); + + tmp1 = get_label(dtstart.value); + tmp = calculate_time (t_start, t_end); + + tmp2 = g_strdup_printf("Time: %s %s", tmp1, tmp); + hbox = gtk_hbox_new (FALSE, 0); + gtk_box_pack_start ((GtkBox *)hbox, gtk_label_new_with_mnemonic (tmp2), FALSE, FALSE, 0); + ebox = gtk_event_box_new (); + gtk_container_add ((GtkContainer *)ebox, hbox); + gtk_widget_modify_bg (ebox, GTK_STATE_NORMAL, &outer_color); + gtk_widget_modify_bg (ebox, GTK_STATE_ACTIVE, &outer_color); + gtk_widget_modify_bg (ebox, GTK_STATE_SELECTED, &outer_color); + gtk_widget_modify_bg (ebox, GTK_STATE_PRELIGHT, &outer_color); + gtk_box_pack_start ((GtkBox *)box, ebox, FALSE, FALSE, 0); + + g_free (tmp); + g_free (tmp2); + g_free (tmp1); + + pevent->tooltip = gtk_window_new (GTK_WINDOW_POPUP); + frame = gtk_frame_new (NULL); + gtk_frame_set_shadow_type ((GtkFrame *)frame, GTK_SHADOW_IN); + + gtk_window_move ((GtkWindow *)pevent->tooltip, pevent->x +16, pevent->y+16); + gtk_container_add ((GtkContainer *)frame, box); + gtk_container_add ((GtkContainer *)pevent->tooltip, frame); + + gtk_widget_show_all (pevent->tooltip); + gdk_keyboard_grab (pevent->tooltip->window, FALSE, GDK_CURRENT_TIME); + g_signal_connect (pevent->tooltip, "key-press-event", G_CALLBACK (tooltip_grab), pevent); + pevent->timeout = -1; + + g_object_unref (newcomp); + + return FALSE; +} + + diff --git a/calendar/gui/e-calendar-view.h b/calendar/gui/e-calendar-view.h index 17778e3a2b..8e2d67c477 100644 --- a/calendar/gui/e-calendar-view.h +++ b/calendar/gui/e-calendar-view.h @@ -66,7 +66,11 @@ typedef enum { time_t end; \ guint16 start_minute; \ guint16 end_minute; \ - guint different_timezone : 1; + guint different_timezone : 1; \ + GtkWidget *tooltip; \ + gint timeout; \ + GdkColor *color; \ + gint x,y; typedef struct { E_CALENDAR_VIEW_EVENT_FIELDS @@ -154,7 +158,7 @@ void e_calendar_view_modify_and_send (ECalComponent *comp, GtkWindow *toplevel, gboolean new); - +gboolean e_calendar_view_get_tooltips (ECalendarViewEvent *pevent); G_END_DECLS #endif diff --git a/calendar/gui/e-day-view.c b/calendar/gui/e-day-view.c index a7092f8f91..1c655ad7f2 100644 --- a/calendar/gui/e-day-view.c +++ b/calendar/gui/e-day-view.c @@ -4224,6 +4224,9 @@ e_day_view_add_event (ECalComponent *comp, } event.start = start; + event.tooltip = NULL; + event.color = NULL; + event.timeout = -1; event.end = end; event.canvas_item = NULL; event.comp_data->instance_start = start; @@ -4465,6 +4468,7 @@ e_day_view_reshape_long_event (EDayView *day_view, NULL); g_signal_connect (event->canvas_item, "event", G_CALLBACK (e_day_view_on_text_item_event), day_view); + g_object_set_data ((GObject *)event->canvas_item, "event", (gpointer)event); g_signal_emit_by_name (G_OBJECT(day_view), "event_added", event); @@ -4646,6 +4650,7 @@ e_day_view_reshape_day_event (EDayView *day_view, NULL); g_signal_connect (event->canvas_item, "event", G_CALLBACK (e_day_view_on_text_item_event), day_view); + g_object_set_data ((GObject *)event->canvas_item, "event", (gpointer)event); g_signal_emit_by_name (G_OBJECT(day_view), "event_added", event); @@ -5765,7 +5770,6 @@ cancel_editing (EDayView *day_view) e_day_view_stop_editing_event (day_view); } - static gboolean e_day_view_on_text_item_event (GnomeCanvasItem *item, GdkEvent *event, @@ -5825,10 +5829,50 @@ e_day_view_on_text_item_event (GnomeCanvasItem *item, e_day_view_on_editing_stopped (day_view, item); return FALSE; + case GDK_ENTER_NOTIFY: + { + EDayViewEvent *pevent = (EDayViewEvent *)g_object_get_data ((GObject *)item, "event"); + + pevent->x = ((GdkEventCrossing *)event)->x_root; + pevent->y = ((GdkEventCrossing *)event)->y_root; + pevent->tooltip = NULL; + pevent->timeout = g_timeout_add (500, (GSourceFunc)e_calendar_view_get_tooltips, pevent); + + return TRUE; + } + case GDK_LEAVE_NOTIFY: + { + EDayViewEvent *pevent = (EDayViewEvent *)g_object_get_data ((GObject *)item, "event"); + + if (pevent && pevent->tooltip) { + gtk_widget_destroy (pevent->tooltip); + pevent->tooltip = NULL; + } + + if (pevent && pevent->timeout != -1) { + g_source_remove (pevent->timeout); + pevent->timeout = -1; + } + + return TRUE; + } + case GDK_MOTION_NOTIFY: + { + EDayViewEvent *pevent = (EDayViewEvent *)g_object_get_data ((GObject *)item, "event"); + + pevent->x = ((GdkEventMotion *)event)->x_root; + pevent->y = ((GdkEventMotion *)event)->y_root; + + if (pevent->tooltip) { + gtk_window_move ((GtkWindow *)pevent->tooltip, ((int)((GdkEventMotion *)event)->x_root)+16, ((int)((GdkEventMotion *)event)->y_root) +16); + } + + return TRUE; + } default: break; } - + return FALSE; } diff --git a/calendar/gui/e-week-view.c b/calendar/gui/e-week-view.c index a3cd52bba3..d6a0aba123 100644 --- a/calendar/gui/e-week-view.c +++ b/calendar/gui/e-week-view.c @@ -2391,6 +2391,9 @@ e_week_view_add_event (ECalComponent *comp, } event.start = start; event.end = end; + event.tooltip = NULL; + event.timeout = -1; + event.color = NULL; event.spans_index = 0; event.num_spans = 0; event.comp_data->instance_start = start; @@ -2547,6 +2550,50 @@ e_week_view_reshape_events (EWeekView *week_view) } +static gboolean +tooltip_event_cb (GnomeCanvasItem *item, + GdkEvent *event, + EWeekView *view) +{ + EWeekViewEvent *pevent = g_object_get_data ((GObject *)item, "event"); + + switch (event->type) { + case GDK_ENTER_NOTIFY: + + pevent->x = ((GdkEventCrossing *)event)->x_root; + pevent->y = ((GdkEventCrossing *)event)->y_root; + pevent->tooltip = NULL; + pevent->timeout = g_timeout_add (500, (GSourceFunc)e_calendar_view_get_tooltips, pevent); + + return TRUE; + + case GDK_LEAVE_NOTIFY: + if (pevent && pevent->tooltip) { + gtk_widget_destroy (pevent->tooltip); + pevent->tooltip = NULL; + } + + if (pevent && pevent->timeout != -1) { + g_source_remove (pevent->timeout); + pevent->timeout = -1; + } + return TRUE; + case GDK_MOTION_NOTIFY: + pevent->x = ((GdkEventMotion *)event)->x_root; + pevent->y = ((GdkEventMotion *)event)->y_root; + + if (pevent->tooltip) { + gtk_window_move ((GtkWindow *)pevent->tooltip, ((int)((GdkEventMotion *)event)->x_root)+16, ((int)((GdkEventMotion *)event)->y_root) +16); + } + + return TRUE; + default: + return FALSE; + } + + return FALSE; +} + static void e_week_view_reshape_event_span (EWeekView *week_view, gint event_num, @@ -2640,7 +2687,12 @@ e_week_view_reshape_event_span (EWeekView *week_view, e_week_view_event_item_get_type (), NULL); } - + + g_object_set_data ((GObject *)span->background_item, "event", event); + g_signal_connect (span->background_item, "event", + G_CALLBACK (tooltip_event_cb), + week_view); + gnome_canvas_item_set (span->background_item, "event_num", event_num, "span_num", span_num, @@ -2671,7 +2723,7 @@ e_week_view_reshape_event_span (EWeekView *week_view, && e_cal_util_component_has_attendee (event->comp_data->icalcomp)) { set_text_as_bold (event, span); } */ - + g_object_set_data ((GObject *)span->text_item, "event", event); g_signal_connect (span->text_item, "event", G_CALLBACK (e_week_view_on_text_item_event), week_view); @@ -2940,11 +2992,12 @@ e_week_view_on_text_item_event (GnomeCanvasItem *item, { EWeekViewEvent *event; gint event_num, span_num; - + EWeekViewEvent *pevent = g_object_get_data ((GObject *)item, "event"); + #if 0 g_print ("In e_week_view_on_text_item_event\n"); #endif - + switch (gdkevent->type) { case GDK_KEY_PRESS: if (gdkevent && gdkevent->key.keyval == GDK_Return) { @@ -3055,6 +3108,35 @@ e_week_view_on_text_item_event (GnomeCanvasItem *item, } week_view->pressed_event_num = -1; break; + case GDK_ENTER_NOTIFY: + + pevent->x = ((GdkEventCrossing *)gdkevent)->x_root; + pevent->y = ((GdkEventCrossing *)gdkevent)->y_root; + pevent->tooltip = NULL; + pevent->timeout = g_timeout_add (500, (GSourceFunc)e_calendar_view_get_tooltips, pevent); + + return TRUE; + + case GDK_LEAVE_NOTIFY: + if (pevent && pevent->tooltip) { + gtk_widget_destroy (pevent->tooltip); + pevent->tooltip = NULL; + } + + if (pevent && pevent->timeout != -1) { + g_source_remove (pevent->timeout); + pevent->timeout = -1; + } + return TRUE; + case GDK_MOTION_NOTIFY: + pevent->x = ((GdkEventMotion *)gdkevent)->x_root; + pevent->y = ((GdkEventMotion *)gdkevent)->y_root; + + if (pevent->tooltip) { + gtk_window_move ((GtkWindow *)pevent->tooltip, ((int)((GdkEventMotion *)gdkevent)->x_root)+16, ((int)((GdkEventMotion *)gdkevent)->y_root) +16); + } + + return TRUE; case GDK_FOCUS_CHANGE: if (gdkevent->focus_change.in) { e_week_view_on_editing_started (week_view, item); diff --git a/calendar/gui/e-week-view.h b/calendar/gui/e-week-view.h index 58ff08aa22..888d88bccb 100644 --- a/calendar/gui/e-week-view.h +++ b/calendar/gui/e-week-view.h @@ -143,6 +143,7 @@ struct _EWeekViewEventSpan { typedef struct _EWeekViewEvent EWeekViewEvent; struct _EWeekViewEvent { E_CALENDAR_VIEW_EVENT_FIELDS + gint spans_index; guint8 num_spans; }; diff --git a/calendar/gui/misc.c b/calendar/gui/misc.c index 026cd8417e..5ab2739525 100644 --- a/calendar/gui/misc.c +++ b/calendar/gui/misc.c @@ -24,7 +24,10 @@ #endif #include <ctype.h> +#include <time.h> #include <libedataserver/e-url.h> +#include "e-util/e-i18n.h" + #include "misc.h" @@ -91,3 +94,52 @@ get_position_in_array (GPtrArray *objects, gpointer item) return -1; } + +char * +calculate_time (time_t start, time_t end) +{ + time_t difference = end - start; + char *str; + + if (difference < 60) {/* Can't be zero */ + str = g_strdup_printf (_("(%d seconds)"), difference); + } else if (difference > 60 && difference < 3600) { /* It will be x minutes y seconds*/ + int minutes, seconds; + minutes = difference / 60; + seconds = difference % 60; + if (seconds) + str = g_strdup_printf (_("(%d %s %d %s)"), minutes, ngettext(_("minute"), _("minutes"), minutes), seconds, ngettext(_("second"), _("seconds"), seconds)); + else + str = g_strdup_printf (_("(%d %s)"), minutes, ngettext(_("minute"), _("minutes"), minutes)); + } else { + guint hours, minutes, seconds; + char *s_hours = NULL, *s_minutes = NULL, *s_seconds = NULL; + + hours = difference / 3600; + minutes = (difference % 3600)/60; + seconds = difference % 60; + + + if (seconds) + s_seconds = g_strdup_printf (ngettext(_(" %u second"), _(" %u seconds"), seconds), seconds); + if (minutes) + s_minutes = g_strdup_printf (ngettext(_(" %u minute"), _(" %u minutes"), minutes), minutes); + if (hours) + s_hours = g_strdup_printf (ngettext(_("%u hour"),_("%u hours"), hours), hours); + + if (s_minutes && s_seconds) + str = g_strconcat ("(", s_hours, s_minutes, s_seconds, ")", NULL); + else if (s_minutes) + str = g_strconcat ("(", s_hours, s_minutes, ")", NULL); + else if (s_seconds) + str = g_strconcat ("(", s_hours, s_seconds, ")", NULL); + else + str = g_strconcat ("(", s_hours, ")", NULL); + + g_free (s_hours); + g_free (s_minutes); + g_free (s_seconds); + } + + return g_strchug(str); +} diff --git a/calendar/gui/misc.h b/calendar/gui/misc.h index 7f89788f2c..c48dbaffa1 100644 --- a/calendar/gui/misc.h +++ b/calendar/gui/misc.h @@ -23,9 +23,10 @@ #define MISC_H #include <glib.h> +#include <time.h> gboolean string_is_empty (const char *value); char *get_uri_without_password (const char *uri); gint get_position_in_array (GPtrArray *objects, gpointer item); - +char * calculate_time (time_t start, time_t end); #endif |