diff options
Diffstat (limited to 'calendar/gui/gncal-todo.c')
-rw-r--r-- | calendar/gui/gncal-todo.c | 234 |
1 files changed, 234 insertions, 0 deletions
diff --git a/calendar/gui/gncal-todo.c b/calendar/gui/gncal-todo.c new file mode 100644 index 0000000000..7b39aef35b --- /dev/null +++ b/calendar/gui/gncal-todo.c @@ -0,0 +1,234 @@ +/* To-do widget for gncal + * + * Copyright (C) 1998 The Free Software Foundation + * + * Author: Federico Mena <quartic@gimp.org> + */ + +#include <string.h> +#include "gncal-todo.h" + + +static void gncal_todo_init (GncalTodo *todo); + + +guint +gncal_todo_get_type (void) +{ + static guint todo_type = 0; + + if (!todo_type) { + GtkTypeInfo todo_info = { + "GncalTodo", + sizeof (GncalTodo), + sizeof (GncalTodoClass), + (GtkClassInitFunc) NULL, + (GtkObjectInitFunc) gncal_todo_init, + (GtkArgSetFunc) NULL, + (GtkArgGetFunc) NULL + }; + + todo_type = gtk_type_unique (gtk_vbox_get_type (), &todo_info); + } + + return todo_type; +} + +static void +add_todo (GncalTodo *todo) +{ + /* FIXME */ +} + +static void +edit_todo (GncalTodo *todo) +{ + /* FIXME */ +} + +static void +delete_todo (GncalTodo *todo) +{ + /* FIXME */ +} + +static void +clist_row_selected (GtkCList *clist, gint row, gint column, GdkEventButton *event, GncalTodo *todo) +{ + if (!event) + return; + + switch (event->button) { + case 1: + if (event->type == GDK_2BUTTON_PRESS) + edit_todo (todo); + break; + + case 3: + /* FIXME: popup menu */ + break; + + default: + break; + } +} + +static void +add_button_clicked (GtkWidget *widget, GncalTodo *todo) +{ + add_todo (todo); +} + +static void +edit_button_clicked (GtkWidget *widget, GncalTodo *todo) +{ + edit_todo (todo); +} + +static void +delete_button_clicked (GtkWidget *widget, GncalTodo *todo) +{ + delete_todo (todo); +} + +static void +gncal_todo_init (GncalTodo *todo) +{ + char *titles[] = { _("Done"), _("Pri"), _("Summary") }; + GtkWidget *w; + GtkWidget *hbox; + + gtk_box_set_spacing (GTK_BOX (todo), 4); + + /* Label */ + + w = gtk_label_new (_("To-do list")); + gtk_misc_set_alignment (GTK_MISC (w), 0.0, 0.5); + gtk_box_pack_start (GTK_BOX (todo), w, FALSE, FALSE, 0); + gtk_widget_show (w); + + /* Clist */ + + w = gtk_clist_new_with_titles (3, titles); + todo->clist = GTK_CLIST (w); + + gtk_clist_set_column_width (todo->clist, 0, 30); /* eek */ + gtk_clist_set_column_width (todo->clist, 1, 20); /* eek */ + gtk_clist_set_policy (todo->clist, GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + gtk_clist_set_selection_mode (todo->clist, GTK_SELECTION_BROWSE); + + gtk_signal_connect (GTK_OBJECT (todo->clist), "select_row", + (GtkSignalFunc) clist_row_selected, + todo); + + gtk_box_pack_start (GTK_BOX (todo), w, TRUE, TRUE, 0); + gtk_widget_show (w); + + /* Box for buttons */ + + hbox = gtk_hbox_new (TRUE, 4); + gtk_box_pack_start (GTK_BOX (todo), hbox, FALSE, FALSE, 0); + gtk_widget_show (hbox); + + /* Add */ + + w = gtk_button_new_with_label (_("Add...")); + gtk_signal_connect (GTK_OBJECT (w), "clicked", + (GtkSignalFunc) add_button_clicked, + todo); + gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0); + gtk_widget_show (w); + + /* Edit */ + + w = gtk_button_new_with_label (_("Edit...")); + todo->edit_button = w; + gtk_widget_set_sensitive (w, FALSE); + gtk_signal_connect (GTK_OBJECT (w), "clicked", + (GtkSignalFunc) edit_button_clicked, + todo); + gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0); + gtk_widget_show (w); + + /* Delete */ + + w = gtk_button_new_with_label (_("Delete")); + todo->delete_button = w; + gtk_widget_set_sensitive (w, FALSE); + gtk_signal_connect (GTK_OBJECT (w), "clicked", + (GtkSignalFunc) delete_button_clicked, + todo); + gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0); + gtk_widget_show (w); +} + +GtkWidget * +gncal_todo_new (GnomeCalendar *calendar) +{ + GncalTodo *todo; + + g_return_val_if_fail (calendar != NULL, NULL); + + todo = gtk_type_new (gncal_todo_get_type ()); + + todo->calendar = calendar; + + gncal_todo_update (todo, NULL, 0); + + return GTK_WIDGET (todo); +} + +static void +insert_in_clist (GncalTodo *todo, iCalObject *ico) +{ + int i; + char buf[20]; + char *text[3] = { NULL, NULL, ico->summary }; + iCalObject *row_ico; + + if (ico->priority == 0) { + strcpy (buf, "?"); /* undefined priority */ + text[1] = buf; + + i = gtk_clist_append (todo->clist, text); + } else { + sprintf (buf, "%d", ico->priority); + text[1] = buf; + + /* Find proper place in clist to insert object. Objects are sorted by priority. */ + + for (i = 0; i < todo->clist->rows; i++) { + row_ico = gtk_clist_get_row_data (todo->clist, i); + + if (ico->priority >= row_ico->priority) + break; + } + + gtk_clist_insert (todo->clist, i, text); + } + + /* Set the appropriate "done" icon and hook the object to the row */ + + gtk_clist_set_row_data (todo->clist, i, ico); +} + +void +gncal_todo_update (GncalTodo *todo, iCalObject *ico, int flags) +{ + GList *list; + + g_return_if_fail (todo != NULL); + g_return_if_fail (GNCAL_IS_TODO (todo)); + + gtk_clist_freeze (todo->clist); + + gtk_clist_clear (todo->clist); + + for (list = todo->calendar->cal->todo; list; list = list->next) + insert_in_clist (todo, list->data); + + gtk_clist_thaw (todo->clist); + + gtk_widget_set_sensitive (todo->edit_button, (todo->clist->rows > 0)); + gtk_widget_set_sensitive (todo->delete_button, (todo->clist->rows > 0)); +} |