diff options
Diffstat (limited to 'calendar/gui')
-rw-r--r-- | calendar/gui/calendar-commands.c | 7 | ||||
-rw-r--r-- | calendar/gui/e-day-view.c | 2 | ||||
-rw-r--r-- | calendar/gui/e-week-view.c | 105 | ||||
-rw-r--r-- | calendar/gui/e-week-view.h | 5 | ||||
-rw-r--r-- | calendar/gui/gnome-cal.h | 4 |
5 files changed, 120 insertions, 3 deletions
diff --git a/calendar/gui/calendar-commands.c b/calendar/gui/calendar-commands.c index 0a4d12f93a..730dbdce26 100644 --- a/calendar/gui/calendar-commands.c +++ b/calendar/gui/calendar-commands.c @@ -594,7 +594,7 @@ calendar_control_activate (BonoboControl *control, GnomeUIBuilderData uibdata; BonoboUIHandler *uih = bonobo_control_get_ui_handler (control); gchar *page_name; - gint button; + gint button, i; g_assert (uih); uibdata.connect_func = do_ui_signal_connect; @@ -616,6 +616,9 @@ calendar_control_activate (BonoboControl *control, /*gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));*/ + for (i = 0; i < GNOME_CALENDAR_NUM_VIEWS; i++) + cal->view_toolbar_buttons[i] = gnome_toolbar_view_buttons[i].widget; + /* Note that these indices should correspond with the button indices in gnome_toolbar_view_buttons. */ page_name = gnome_calendar_get_current_view_name (cal); @@ -634,7 +637,7 @@ calendar_control_activate (BonoboControl *control, button = 0; } - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gnome_toolbar_view_buttons[button].widget), TRUE); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (cal->view_toolbar_buttons[i]), TRUE); gtk_widget_show_all (toolbar); diff --git a/calendar/gui/e-day-view.c b/calendar/gui/e-day-view.c index e0e13664f2..ff7753cd54 100644 --- a/calendar/gui/e-day-view.c +++ b/calendar/gui/e-day-view.c @@ -3347,6 +3347,7 @@ e_day_view_reshape_long_event (EDayView *day_view, "clip", TRUE, "max_lines", 1, "editable", TRUE, + "use_ellipsis", TRUE, NULL); gtk_signal_connect (GTK_OBJECT (event->canvas_item), "event", GTK_SIGNAL_FUNC (e_day_view_on_text_item_event), @@ -3703,6 +3704,7 @@ e_day_view_reshape_day_event (EDayView *day_view, "line_wrap", TRUE, "editable", TRUE, "clip", TRUE, + "use_ellipsis", TRUE, NULL); gtk_signal_connect (GTK_OBJECT (event->canvas_item), "event", diff --git a/calendar/gui/e-week-view.c b/calendar/gui/e-week-view.c index 7f5eb7b15f..96eacac213 100644 --- a/calendar/gui/e-week-view.c +++ b/calendar/gui/e-week-view.c @@ -29,6 +29,8 @@ #include <config.h> #include <math.h> #include <gnome.h> +#include <gdk-pixbuf/gdk-pixbuf.h> +#include <gdk-pixbuf/gnome-canvas-pixbuf.h> #include "calendar-commands.h" #include "e-week-view.h" #include "e-week-view-event-item.h" @@ -43,6 +45,8 @@ #include "bell.xpm" #include "recur.xpm" +#include "jump.xpm" + #define E_WEEK_VIEW_SMALL_FONT \ "-adobe-utopia-regular-r-normal-*-*-100-*-*-p-*-iso8859-*" #define E_WEEK_VIEW_SMALL_FONT_FALLBACK \ @@ -53,6 +57,12 @@ reached anyway. */ #define E_WEEK_VIEW_MAX_ROWS_PER_CELL 127 +#define E_WEEK_VIEW_JUMP_BUTTON_WIDTH 16 +#define E_WEEK_VIEW_JUMP_BUTTON_HEIGHT 8 + +#define E_WEEK_VIEW_JUMP_BUTTON_X_PAD 3 +#define E_WEEK_VIEW_JUMP_BUTTON_Y_PAD 3 + static void e_week_view_class_init (EWeekViewClass *class); static void e_week_view_init (EWeekView *week_view); static void e_week_view_destroy (GtkObject *object); @@ -138,6 +148,9 @@ static void e_week_view_foreach_event_with_uid (EWeekView *week_view, static gboolean e_week_view_on_text_item_event (GnomeCanvasItem *item, GdkEvent *event, EWeekView *week_view); +static gboolean e_week_view_on_jump_button_event (GnomeCanvasItem *item, + GdkEvent *event, + EWeekView *week_view); static gint e_week_view_key_press (GtkWidget *widget, GdkEventKey *event); static void e_week_view_on_new_appointment (GtkWidget *widget, gpointer data); @@ -218,6 +231,8 @@ e_week_view_init (EWeekView *week_view) gint nfailed; GnomeCanvasGroup *canvas_group; GtkObject *adjustment; + GdkPixbuf *pixbuf; + gint i; GTK_WIDGET_SET_FLAGS (week_view, GTK_CAN_FOCUS); @@ -329,6 +344,23 @@ e_week_view_init (EWeekView *week_view) GTK_SIGNAL_FUNC (e_week_view_on_motion), week_view); + /* Create the buttons to jump to each days. */ + pixbuf = gdk_pixbuf_new_from_xpm_data ((const char**) jump_xpm); + + for (i = 0; i < E_WEEK_VIEW_MAX_WEEKS * 7; i++) { + week_view->jump_buttons[i] = gnome_canvas_item_new + (canvas_group, + gnome_canvas_pixbuf_get_type (), + "GnomeCanvasPixbuf::pixbuf", pixbuf, + NULL); + + gtk_signal_connect (GTK_OBJECT (week_view->jump_buttons[i]), + "event", + GTK_SIGNAL_FUNC (e_week_view_on_jump_button_event), + week_view); + } + + /* * Scrollbar. */ @@ -1634,7 +1666,7 @@ e_week_view_layout_events (EWeekView *week_view) { EWeekViewEvent *event; EWeekViewEventSpan *span; - gint event_num, span_num; + gint num_days, day, event_num, span_num; guint8 *grid; GArray *spans, *old_spans; @@ -1648,6 +1680,12 @@ e_week_view_layout_events (EWeekView *week_view) /* We create a new array of spans, which will replace the old one. */ spans = g_array_new (FALSE, FALSE, sizeof (EWeekViewEventSpan)); + /* Clear the number of rows used per day. */ + num_days = week_view->display_month ? E_WEEK_VIEW_MAX_WEEKS * 7 : 7; + for (day = 0; day <= num_days; day++) { + week_view->rows_per_day[day] = 0; + } + /* Iterate over the events, finding which weeks they cover, and putting them in the first free row available. */ for (event_num = 0; event_num < week_view->events->len; event_num++) { @@ -1736,6 +1774,7 @@ e_week_view_layout_event (EWeekView *week_view, for (day = span_start_day; day <= span_end_day; day++) { grid[day * rows_per_cell + free_row] = 1; + week_view->rows_per_day[day] = MAX (week_view->rows_per_day[day], free_row + 1); } #if 0 g_print (" Span start:%i end:%i row:%i\n", @@ -1811,6 +1850,8 @@ e_week_view_reshape_events (EWeekView *week_view) { EWeekViewEvent *event; gint event_num, span_num; + gint num_days, day, day_x, day_y, day_w, day_h, max_rows; + gboolean is_weekend; for (event_num = 0; event_num < week_view->events->len; event_num++) { event = &g_array_index (week_view->events, EWeekViewEvent, @@ -1820,6 +1861,42 @@ e_week_view_reshape_events (EWeekView *week_view) span_num); } } + + /* Reshape the jump buttons and show/hide them as appropriate. */ + num_days = week_view->display_month ? E_WEEK_VIEW_MAX_WEEKS * 7 : 7; + for (day = 0; day < num_days; day++) { + + is_weekend = (day % 7 >= 5) ? TRUE : FALSE; + if (!is_weekend || (week_view->display_month + && !week_view->compress_weekend)) + max_rows = week_view->rows_per_cell; + else + max_rows = week_view->rows_per_compressed_cell; + + g_print ("rows in the day:%i max rows:%i\n", + week_view->rows_per_day[day], max_rows); + + /* Determine whether the jump button should be shown. */ + if (week_view->rows_per_day[day] <= max_rows) { + gnome_canvas_item_hide (week_view->jump_buttons[day]); + } else { + e_week_view_get_day_position (week_view, day, + &day_x, &day_y, + &day_w, &day_h); + + gnome_canvas_item_set (week_view->jump_buttons[day], + "GnomeCanvasPixbuf::x", (gdouble) (day_x + day_w - E_WEEK_VIEW_JUMP_BUTTON_X_PAD - E_WEEK_VIEW_JUMP_BUTTON_WIDTH), + "GnomeCanvasPixbuf::y", (gdouble) (day_y + day_h - E_WEEK_VIEW_JUMP_BUTTON_Y_PAD - E_WEEK_VIEW_JUMP_BUTTON_HEIGHT), + NULL); + + gnome_canvas_item_show (week_view->jump_buttons[day]); + gnome_canvas_item_raise_to_top (week_view->jump_buttons[day]); + } + } + + for (day = num_days; day < E_WEEK_VIEW_MAX_WEEKS * 7; day++) { + gnome_canvas_item_hide (week_view->jump_buttons[day]); + } } @@ -1902,6 +1979,7 @@ e_week_view_reshape_event_span (EWeekView *week_view, #endif "editable", TRUE, "text", ico->summary ? ico->summary : "", + "use_ellipsis", TRUE, NULL); gtk_signal_connect (GTK_OBJECT (span->text_item), "event", GTK_SIGNAL_FUNC (e_week_view_on_text_item_event), @@ -2725,3 +2803,28 @@ e_week_view_on_unrecur_appointment (GtkWidget *widget, gpointer data) gnome_calendar_update_object (week_view->calendar, new_ico); ical_object_unref (new_ico); } + + +static gboolean +e_week_view_on_jump_button_event (GnomeCanvasItem *item, + GdkEvent *event, + EWeekView *week_view) +{ + gint day; + + if (event->type == GDK_BUTTON_PRESS) { + for (day = 0; day < E_WEEK_VIEW_MAX_WEEKS * 7; day++) { + if (item == week_view->jump_buttons[day]) { + gnome_calendar_dayjump (week_view->calendar, + week_view->day_starts[day]); + /* A quick hack to make the 'Day' toolbar + button active. */ + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (week_view->calendar->view_toolbar_buttons[0]), TRUE); + return TRUE; + } + } + + } + + return FALSE; +} diff --git a/calendar/gui/e-week-view.h b/calendar/gui/e-week-view.h index 86031d2e58..dbb61a58b7 100644 --- a/calendar/gui/e-week-view.h +++ b/calendar/gui/e-week-view.h @@ -161,6 +161,8 @@ struct _EWeekView GtkWidget *main_canvas; GnomeCanvasItem *main_canvas_item; + GnomeCanvasItem *jump_buttons[E_WEEK_VIEW_MAX_WEEKS * 7]; + GtkWidget *vscrollbar; /* The calendar we are associated with. */ @@ -203,6 +205,9 @@ struct _EWeekView gint rows_per_cell; gint rows_per_compressed_cell; + /* The number of rows we have used for each day (i.e. each cell) */ + gint rows_per_day[E_WEEK_VIEW_MAX_WEEKS * 7]; + /* If the small font is used for displaying the minutes. */ gboolean use_small_font; diff --git a/calendar/gui/gnome-cal.h b/calendar/gui/gnome-cal.h index a6f8a342ff..015de10a65 100644 --- a/calendar/gui/gnome-cal.h +++ b/calendar/gui/gnome-cal.h @@ -24,6 +24,8 @@ BEGIN_GNOME_DECLS #define GNOME_CALENDAR_CLASS(class) GTK_CHECK_CAST_CLASS(class, gnome_calendar_get_type(), GnomeCalendarClass) #define GNOME_IS_CALENDAR(obj) GTK_CHECK_TYPE(obj, gnome_calendar_get_type()) +#define GNOME_CALENDAR_NUM_VIEWS 4 + typedef struct { GtkVBox vbox; @@ -48,6 +50,8 @@ typedef struct { GtkWidget *week_view; GtkWidget *month_view; + GtkWidget *view_toolbar_buttons[GNOME_CALENDAR_NUM_VIEWS]; + void *event_editor; /* The signal handler id for our GtkCalendar "day_selected" handler. */ |