diff options
Diffstat (limited to 'calendar/gui')
-rw-r--r-- | calendar/gui/gncal-full-day.c | 188 | ||||
-rw-r--r-- | calendar/gui/year-view.c | 55 | ||||
-rw-r--r-- | calendar/gui/year-view.h | 10 |
3 files changed, 202 insertions, 51 deletions
diff --git a/calendar/gui/gncal-full-day.c b/calendar/gui/gncal-full-day.c index eac1d3fddc..3e6ae677af 100644 --- a/calendar/gui/gncal-full-day.c +++ b/calendar/gui/gncal-full-day.c @@ -9,6 +9,7 @@ #include <gdk/gdkkeysyms.h> #include <gtk/gtkdrawingarea.h> #include <gtk/gtktext.h> +#include "eventedit.h" #include "gncal-full-day.h" #include "view-utils.h" @@ -55,6 +56,12 @@ struct drag_info { guint32 click_time; }; +struct menu_item { + char *text; + GtkSignalFunc callback; + gpointer data; +}; + enum { RANGE_ACTIVATED, @@ -1141,16 +1148,23 @@ gncal_full_day_size_allocate (GtkWidget *widget, GtkAllocation *allocation) } static Child * -find_child_by_window (GncalFullDay *fullday, GdkWindow *window) +find_child_by_window (GncalFullDay *fullday, GdkWindow *window, int *on_text) { GList *children; Child *child; + *on_text = FALSE; + for (children = fullday->children; children; children = children->next) { child = children->data; if (child->window == window) return child; + + if (child->widget->window == window) { + *on_text = TRUE; + return child; + } } return NULL; @@ -1223,21 +1237,12 @@ get_row_from_y (GncalFullDay *fullday, int y, int round) return y; } -static void +static int button_1 (GncalFullDay *fullday, GdkEventButton *event) { -} - -static void -button_3 (GncalFullDay *fullday, GdkEventButton *event) -{ -} - -static gint -gncal_full_day_button_press (GtkWidget *widget, GdkEventButton *event) -{ - GncalFullDay *fullday; + GtkWidget *widget; Child *child; + int on_text; struct drag_info *di; gint y; int row_height; @@ -1245,24 +1250,7 @@ gncal_full_day_button_press (GtkWidget *widget, GdkEventButton *event) int old_max; int paint_start_row, paint_rows_used; - g_return_val_if_fail (widget != NULL, FALSE); - g_return_val_if_fail (GNCAL_IS_FULL_DAY (widget), FALSE); - g_return_val_if_fail (event != NULL, FALSE); - - fullday = GNCAL_FULL_DAY (widget); - - switch (event->button) { - case 1: - button_1 (fullday, event); - break; - - case 3: - button_3 (fullday, event); - break; - - default: - break; - } + widget = GTK_WIDGET (fullday); if (event->window == widget->window) { /* Clicked on main window */ @@ -1306,9 +1294,9 @@ gncal_full_day_button_press (GtkWidget *widget, GdkEventButton *event) } else { /* Clicked on a child? */ - child = find_child_by_window (fullday, event->window); + child = find_child_by_window (fullday, event->window, &on_text); - if (!child) + if (!child || on_text) return FALSE; /* Prepare for drag */ @@ -1344,6 +1332,140 @@ gncal_full_day_button_press (GtkWidget *widget, GdkEventButton *event) } static void +popup_menu (struct menu_item *items, int nitems, guint32 time) +{ + GtkWidget *menu; + GtkWidget *item; + int i; + + menu = gtk_menu_new (); /* FIXME: this baby is never freed */ + + for (i = 0; i < nitems; i++) { + if (items[i].text) { + item = gtk_menu_item_new_with_label (_(items[i].text)); + gtk_signal_connect (GTK_OBJECT (item), "activate", + items[i].callback, + items[i].data); + } else + item = gtk_menu_item_new (); + + gtk_widget_show (item); + gtk_menu_append (GTK_MENU (menu), item); + } + + gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL, 3, time); +} + +static void +new_appointment (GtkWidget *widget, gpointer data) +{ + GncalFullDay *fullday; + + fullday = GNCAL_FULL_DAY (data); + + /* FIXME: this should set up the start/end times in the event + * editor to whatever the selection range is. If there is no + * selection, then default to something sensible, like the row + * at which the button was clicked on when popping up the menu. + */ + + event_editor_new (fullday->calendar, NULL); +} + +static void +edit_appointment (GtkWidget *widget, gpointer data) +{ + Child *child; + + child = data; + + event_editor_new (GNCAL_FULL_DAY (child->widget->parent)->calendar, child->ico); +} + +static void +delete_appointment (GtkWidget *widget, gpointer data) +{ + Child *child; + + child = data; + + /* FIXME */ + + printf ("Yay! delete_appointment() not yet implemented\n"); +} + +static int +button_3 (GncalFullDay *fullday, GdkEventButton *event) +{ + static struct menu_item main_items[] = { + { N_("New appointment..."), (GtkSignalFunc) new_appointment, NULL } + }; + + static struct menu_item child_items[] = { + { N_("Properties..."), (GtkSignalFunc) edit_appointment, NULL }, + { N_("Delete this appointment"), (GtkSignalFunc) delete_appointment, NULL }, + { NULL, NULL, NULL }, + { N_("New appointment..."), (GtkSignalFunc) new_appointment, NULL } + }; + + GtkWidget *widget; + Child *child; + int on_text; + + widget = GTK_WIDGET (fullday); + + if (event->window == widget->window) { + /* Clicked on main window */ + + if (!GTK_WIDGET_HAS_FOCUS (widget)) + gtk_widget_grab_focus (widget); + + main_items[0].data = fullday; + + popup_menu (main_items, sizeof (main_items) / sizeof (main_items[0]), event->time); + } else { + child = find_child_by_window (fullday, event->window, &on_text); + + if (!child) + return FALSE; + + child_items[0].data = child; + child_items[1].data = child; + child_items[3].data = fullday; + + popup_menu (child_items, sizeof (child_items) / sizeof (child_items[0]), event->time); + return TRUE; + } + + return FALSE; +} + +static gint +gncal_full_day_button_press (GtkWidget *widget, GdkEventButton *event) +{ + GncalFullDay *fullday; + + g_return_val_if_fail (widget != NULL, FALSE); + g_return_val_if_fail (GNCAL_IS_FULL_DAY (widget), FALSE); + g_return_val_if_fail (event != NULL, FALSE); + + fullday = GNCAL_FULL_DAY (widget); + + switch (event->button) { + case 1: + return button_1 (fullday, event); + + case 3: + return button_3 (fullday, event); + + default: + break; + } + + return FALSE; +} + +static void recompute_motion (GncalFullDay *fullday, int y) { struct drag_info *di; diff --git a/calendar/gui/year-view.c b/calendar/gui/year-view.c index a3ae3ce647..c3d6057086 100644 --- a/calendar/gui/year-view.c +++ b/calendar/gui/year-view.c @@ -8,8 +8,6 @@ * */ -#include <time.h> - #include "gncal-year-view.h" static void gncal_year_view_init (GncalYearView *yview); @@ -68,29 +66,41 @@ gncal_year_view_init (GncalYearView *yview) yview->calendar[i] = NULL; yview->handler [i] = 0; } + + yview->year_label = NULL; + yview->year = 0; } GtkWidget * -gncal_year_view_new (int year) +gncal_year_view_new (time_t date) { struct tm my_tm = { 0, 0, 0, 0, 0, 0, 0, 0, 0 }; char monthbuff[40]; GncalYearView *yview; GtkWidget *frame, *vbox, *label; + struct tm *tmptm; int i, x, y; yview = gtk_type_new (gncal_year_view_get_type ()); - gtk_table_set_homogeneous (GTK_TABLE (yview), TRUE); - - yview->year = year; - + tmptm = localtime(&date); + yview->year = tmptm->tm_year; + my_tm.tm_mon = tmptm->tm_year; + yview->year_label = gtk_label_new(""); + gtk_table_attach (GTK_TABLE (yview), + GTK_WIDGET (yview->year_label), + 1, 2, + 0, 1, + 0, 0, 0, 5); + gtk_widget_show(GTK_WIDGET(yview->year_label)); + for (x = 0; x < 3; x++) for (y = 0; y < 4; y++) { i = y * 3 + x; yview->calendar[i] = gtk_calendar_new(); + gtk_calendar_display_options(GTK_CALENDAR(yview->calendar[i]), GTK_CALENDAR_SHOW_DAY_NAMES); frame = gtk_frame_new(NULL); vbox = gtk_vbox_new(0,0); @@ -101,8 +111,7 @@ gncal_year_view_new (int year) (gpointer *) yview); my_tm.tm_mon = i; - my_tm.tm_year = year; - strftime(monthbuff, sizeof (monthbuff)-1, "%B", &my_tm); + strftime(monthbuff, 40, "%B", &my_tm); label = gtk_label_new(monthbuff); gtk_container_add(GTK_CONTAINER(frame), vbox); @@ -110,9 +119,9 @@ gncal_year_view_new (int year) gtk_box_pack_start(GTK_BOX(vbox), yview->calendar[i], 0, 0, 0); gtk_table_attach (GTK_TABLE (yview), - GTK_WIDGET (vbox), + GTK_WIDGET (frame), x, x + 1, - y, y + 1, + y + 1, y + 2, 0, 0, 0, 0); gtk_widget_show (frame); @@ -120,17 +129,33 @@ gncal_year_view_new (int year) gtk_widget_show (GTK_WIDGET (yview->calendar[i])); } - gncal_year_view_set (yview, year); + gncal_year_view_set (yview, date); return GTK_WIDGET (yview); } -void gncal_year_view_set (GncalYearView *yview, int year) +void gncal_year_view_set (GncalYearView *yview, time_t date) { int i; + char buff[10]; + struct tm *tmptm; + + tmptm = localtime(&date); + yview->year = tmptm->tm_year; + + snprintf(buff, 10, "%d", yview->year + 1900); + gtk_label_set(GTK_LABEL(yview->year_label), buff); for (i = 0; i < 12; i++) { - yview->year = year; - gtk_calendar_select_month (GTK_CALENDAR(yview->calendar[i]), i + 1, year); + gtk_calendar_select_month (GTK_CALENDAR(yview->calendar[i]), i, yview->year); } } + +/*void +gncal_week_view_update (GncalWeekView *wview, iCalObject *ico, int flags) +{ + g_return_if_fail (wview != NULL); + g_return_if_fail (GNCAL_IS_YEAR_VIEW (wview)); + + update (wview, TRUE, ico, flags); +}*/ diff --git a/calendar/gui/year-view.h b/calendar/gui/year-view.h index 1aedf41299..bdd542abda 100644 --- a/calendar/gui/year-view.h +++ b/calendar/gui/year-view.h @@ -11,10 +11,12 @@ #ifndef YEAR_VIEW_H #define YEAR_VIEW_H - +#include <time.h> #include <gtk/gtktable.h> #include <libgnome/gnome-defs.h> #include <libgnomeui/gtkcalendar.h> + +#include "calendar.h" #include "gnome-cal.h" BEGIN_GNOME_DECLS @@ -33,6 +35,8 @@ struct _GncalYearView { GtkWidget *calendar[12]; /* one calendar per month */ guint handler[12]; /* for (un)blocking the calendars */ + + GtkWidget *year_label; gint year; }; @@ -42,9 +46,9 @@ struct _GncalYearViewClass { guint gncal_year_view_get_type (void); -GtkWidget *gncal_year_view_new (int year); +GtkWidget *gncal_year_view_new (time_t date); -void gncal_year_view_set (GncalYearView *yview, int year); +void gncal_year_view_set (GncalYearView *yview, time_t date); END_GNOME_DECLS |