aboutsummaryrefslogtreecommitdiffstats
path: root/calendar/gui/e-week-view.c
diff options
context:
space:
mode:
Diffstat (limited to 'calendar/gui/e-week-view.c')
-rw-r--r--calendar/gui/e-week-view.c105
1 files changed, 104 insertions, 1 deletions
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;
+}