From: <si...@us...> - 2008-05-31 15:53:04
|
Revision: 442 http://osmo-pim.svn.sourceforge.net/osmo-pim/?rev=442&view=rev Author: silloz Date: 2008-05-31 08:53:09 -0700 (Sat, 31 May 2008) Log Message: ----------- * Task reminder framework, part 2 Modified Paths: -------------- trunk/src/check_events.c trunk/src/gui.h trunk/src/main.c trunk/src/tasks.h Modified: trunk/src/check_events.c =================================================================== --- trunk/src/check_events.c 2008-05-31 15:04:46 UTC (rev 441) +++ trunk/src/check_events.c 2008-05-31 15:53:09 UTC (rev 442) @@ -56,57 +56,115 @@ TASK_NTF *a; guint i; - for (i = 0, node = appGUI->tsk->notifications; node != NULL; node = node->next, i++) { + for (i = 0, node = appGUI->tsk->notifications; node != NULL; node = node->next, i++) { a = g_slist_nth_data (appGUI->tsk->notifications, i); notify_notification_close (a->notify, NULL); } - for (i = 0, node = appGUI->tsk->notifications; node != NULL; node = node->next, i++) { - a = g_slist_nth_data (appGUI->tsk->notifications, i); - if (a->item != NULL) { - g_free (a->item); - } - } + for (i = 0, node = appGUI->tsk->notifications; node != NULL; node = node->next, i++) { + a = g_slist_nth_data (appGUI->tsk->notifications, i); + if (a->item != NULL) { + g_free (a->item); + } + } - if (appGUI->tsk->notifications != NULL) { - g_slist_free (appGUI->tsk->notifications); - appGUI->tsk->notifications = NULL; - } + if (appGUI->tsk->notifications != NULL) { + g_slist_free (appGUI->tsk->notifications); + appGUI->tsk->notifications = NULL; + } } /*------------------------------------------------------------------------------*/ +void +tsk_show_info_dialog (GUI *appGUI) +{ +gchar tmpbuf[BUFFER_SIZE]; + sprintf (tmpbuf, "%s\n%s", _("Cannot perform selected operation."), _("Task has been modified or removed.")); + gui_create_dialog (GTK_MESSAGE_INFO, tmpbuf, GTK_WINDOW (appGUI->main_window)); + +} + +/*------------------------------------------------------------------------------*/ void +calculate_task_new_date (TASK_ITEM *item, GUI *appGUI, guint32 *new_date, gint *new_time) +{ +gboolean flag; +gint i; + + *new_date = item->due_date_julian; + *new_time = item->due_time; + + flag = TRUE; + if (item->repeat_time_start < item->repeat_time_end && item->repeat_time_end != 0 && item->repeat_time_interval != 0) { + + for (i = item->repeat_time_start; i <= item->repeat_time_end; i = i + item->repeat_time_interval) { + if (i * 60 > item->due_time) { + *new_time = i * 60; + flag = FALSE; + break; + } + } + + if (flag == TRUE) { + *new_time = item->repeat_time_start * 60; + } + } + + /* FIXME + month_interval + day of week */ + if (flag == TRUE) { + *new_date = item->due_date_julian + item->repeat_day_interval; + } + +} + +/*------------------------------------------------------------------------------*/ + +void tsk_done_callback (NotifyNotification *n, const char *action, gpointer user_data) { GtkTreeIter *iter; GSList *tnode; TASK_NTF *a; guint i; -gchar tmpbuf[BUFFER_SIZE]; +guint32 new_date; +gint new_time; - GUI *appGUI = (GUI *)user_data; + GUI *appGUI = (GUI *)user_data; - for (i = 0, tnode = appGUI->tsk->notifications; tnode != NULL; tnode = tnode->next, i++) { + for (i = 0, tnode = appGUI->tsk->notifications; tnode != NULL; tnode = tnode->next, i++) { a = g_slist_nth_data (appGUI->tsk->notifications, i); if (a->notify == n) { iter = task_get_iter (a->id, appGUI); if (iter != NULL) { - if (a->item->repeat == TRUE) { + if (a->item->repeat == TRUE && a->item->repeat_counter != 1) { + + if (a->item->repeat_counter > 1) { + gtk_list_store_set (appGUI->tsk->tasks_list_store, iter, + TA_COLUMN_REPEAT_COUNTER, a->item->repeat_counter - 1, -1); + } + + calculate_task_new_date (a->item, appGUI, &new_date, &new_time); + gtk_list_store_set (appGUI->tsk->tasks_list_store, iter, - TA_COLUMN_DUE_DATE_JULIAN, a->item->due_date_julian + 1, - TA_COLUMN_DUE_DATE, get_date_time_full_str (a->item->due_date_julian + 1, a->item->due_time), - TA_COLUMN_ACTIVE, TRUE, - -1); + TA_COLUMN_COLOR, get_date_color (new_date, new_time, FALSE), + TA_COLUMN_DUE_DATE_JULIAN, new_date, + TA_COLUMN_DUE_DATE, get_date_time_full_str (new_date, new_time), + TA_COLUMN_DUE_TIME, new_time, + TA_COLUMN_ACTIVE, TRUE, + TA_COLUMN_ACTIVE_WARNING, TRUE, + TA_COLUMN_DONE, FALSE, -1); + } else { gtk_list_store_set (appGUI->tsk->tasks_list_store, iter, - TA_COLUMN_DONE, TRUE, -1); + TA_COLUMN_COLOR, get_date_color (a->item->due_date_julian, a->item->due_time, TRUE), + TA_COLUMN_DONE, TRUE, -1); } + } else { - sprintf (tmpbuf, "%s\n%s", _("Cannot perform selected operation."), _("Task has been modified or removed.")); - gui_create_dialog (GTK_MESSAGE_INFO, tmpbuf, GTK_WINDOW(appGUI->main_window)); + tsk_show_info_dialog (appGUI); } break; @@ -130,11 +188,10 @@ GSList *tnode; TASK_NTF *a; guint i; -gchar tmpbuf[BUFFER_SIZE]; - GUI *appGUI = (GUI *)user_data; + GUI *appGUI = (GUI *)user_data; - for (i = 0, tnode = appGUI->tsk->notifications; tnode != NULL; tnode = tnode->next, i++) { + for (i = 0, tnode = appGUI->tsk->notifications; tnode != NULL; tnode = tnode->next, i++) { a = g_slist_nth_data (appGUI->tsk->notifications, i); if (a->notify == n) { @@ -142,10 +199,9 @@ if (iter != NULL) { gtk_list_store_set (appGUI->tsk->tasks_list_store, iter, - TA_COLUMN_ACTIVE, TRUE, -1); + TA_COLUMN_ACTIVE, TRUE, -1); } else { - sprintf (tmpbuf, "%s\n%s", _("Cannot perform selected operation."), _("Task has been modified or removed.")); - gui_create_dialog (GTK_MESSAGE_INFO, tmpbuf, GTK_WINDOW(appGUI->main_window)); + tsk_show_info_dialog (appGUI); } break; @@ -162,15 +218,129 @@ /*------------------------------------------------------------------------------*/ -void +void /* FIXME + sort path + filter path*/ tsk_show_callback (NotifyNotification *n, const char *action, gpointer user_data) { +GtkTreeIter *iter; +GSList *tnode; +GtkTreePath *path; +TASK_NTF *a; +guint i; + GUI *appGUI = (GUI *)user_data; + + for (i = 0, tnode = appGUI->tsk->notifications; tnode != NULL; tnode = tnode->next, i++) { + a = g_slist_nth_data (appGUI->tsk->notifications, i); + if (a->notify == n) { + iter = task_get_iter (a->id, appGUI); + + if (iter != NULL) { + path = gtk_tree_model_get_path (GTK_TREE_MODEL (appGUI->tsk->tasks_list_store), iter); + + if (path != NULL) { + gtk_tree_view_set_cursor (GTK_TREE_VIEW (appGUI->tsk->tasks_list), path, NULL, FALSE); + gtk_tree_path_free (path); + } + } else { + tsk_show_info_dialog (appGUI); + } + + break; + } + } + + notify_notification_close (a->notify, NULL); + if (a->item != NULL) { + g_free (a->item); + } + appGUI->tsk->notifications = g_slist_remove (appGUI->tsk->notifications, a); + } /*------------------------------------------------------------------------------*/ +void +subtract_from_date (guint32 date, gint time, gint days, gint seconds, guint32 *new_date, gint *new_time) +{ + *new_date = date - days; + if (time >= 0) { + *new_time = time - seconds; + + if (*new_time < 0) { + *new_time = (*new_time) + 24 * 3600; + *new_date = (*new_date) - 1; + } + } else { + *new_time = -1; + } +} + +/*------------------------------------------------------------------------------*/ + gboolean +tsk_show_warning_notification (TASK_ITEM *item, GtkTreeIter *iter, GUI *appGUI) +{ +guint32 current_date, warning_date; +gint current_time, warning_time; + + if (item->active_warning == TRUE && (item->warning_days != 0 || item->warning_time != 0)) { + + current_date = get_julian_for_today (); + current_time = get_seconds_for_today (); + subtract_from_date (item->due_date_julian, item->due_time, + item->warning_days, item->warning_time, &warning_date, &warning_time); + + if (warning_date < current_date || (warning_date == current_date && warning_time < current_time)) { + if (item->repeat == TRUE && item->offline_ignore == TRUE) { + if (warning_date < appGUI->run_date || + (warning_date == appGUI->run_date && warning_time < appGUI->run_time)) { + gtk_list_store_set (appGUI->tsk->tasks_list_store, iter, + TA_COLUMN_ACTIVE_WARNING, FALSE, -1); + return FALSE; + } + } + return TRUE; + } + } + + return FALSE; +} + +/*------------------------------------------------------------------------------*/ + +gboolean +tsk_show_task_notification (TASK_ITEM *item, GtkTreeIter *iter, GUI *appGUI) +{ +guint32 current_date; +gint current_time; + + current_date = get_julian_for_today (); + current_time = get_seconds_for_today (); + + if (item->due_date_julian < current_date || + (item->due_date_julian == current_date && item->due_time <= current_time)) { + + if (item->repeat == TRUE && item->offline_ignore == TRUE) { + if (item->due_date_julian < appGUI->run_date || + (item->due_date_julian == appGUI->run_date && item->due_time < appGUI->run_time)) { + gtk_list_store_set (appGUI->tsk->tasks_list_store, iter, + TA_COLUMN_DUE_DATE, get_date_time_full_str (item->due_date_julian + 1, item->due_time), + TA_COLUMN_COLOR, get_date_color (item->due_date_julian + 1, item->due_time, item->done), + TA_COLUMN_DUE_DATE_JULIAN, item->due_date_julian + 1, + TA_COLUMN_ACTIVE, TRUE, + TA_COLUMN_ACTIVE_WARNING, TRUE, -1); + return FALSE; + } + } + return TRUE; + } + + return FALSE; +} + +/*------------------------------------------------------------------------------*/ + +gboolean notify_tasks (GUI *appGUI) { gchar tmpbuf[BUFFER_SIZE]; @@ -183,97 +353,101 @@ TASK_NTF *a; gint i; - current_date = get_julian_for_today (); - current_time = get_seconds_for_today (); + current_date = get_julian_for_today (); + current_time = get_seconds_for_today (); - i = 0; + i = 0; - while (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (appGUI->tsk->tasks_list_store), &iter, NULL, i++)) { + while (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (appGUI->tsk->tasks_list_store), &iter, NULL, i++)) { - item = get_task_item (&iter, appGUI); - if (item != NULL) { + item = get_task_item (&iter, appGUI); + if (item != NULL) { if (item->active == TRUE && item->done == FALSE) { - if (item->due_date_julian < current_date || - (item->due_date_julian == current_date && item->due_time < current_time)) { + if (tsk_show_task_notification (item, &iter, appGUI) == TRUE) { - if (item->offline_ignore == FALSE || item->due_date_julian > config.lastrun_date || - (item->due_date_julian == config.lastrun_date && item->due_time > config.lastrun_time)) { + if (strlen (item->alarm_command)) { + gui_save_data_and_run_command (item->alarm_command, appGUI); + } - sprintf (tmpbuf2, "<i>%s</i>", get_date_time_full_str (item->due_date_julian, item->due_time)); - strncpy (tmpbuf, tmpbuf2, BUFFER_SIZE); - if (item->desc != NULL) { - if (strlen (item->desc)) { - sprintf (tmpbuf, "%s\n%.100s", tmpbuf2, item->desc); - } + sprintf (tmpbuf2, "<i>%s</i>", get_date_time_full_str (item->due_date_julian, item->due_time)); + strncpy (tmpbuf, tmpbuf2, BUFFER_SIZE); + if (item->desc != NULL) { + if (strlen (item->desc)) { + sprintf (tmpbuf, "%s\n%.100s", tmpbuf2, item->desc); } + } - a = g_malloc (sizeof (TASK_NTF)); - g_assert (a != NULL); + a = g_malloc (sizeof (TASK_NTF)); + g_assert (a != NULL); - gtk_tree_model_get (GTK_TREE_MODEL (appGUI->tsk->tasks_list_store), &iter, TA_COLUMN_ID, &(a->id), -1); - a->item = get_task_item (&iter, appGUI); - a->notify = notify_notification_new (item->summary, tmpbuf, GTK_STOCK_DIALOG_WARNING, NULL); + gtk_tree_model_get (GTK_TREE_MODEL (appGUI->tsk->tasks_list_store), &iter, TA_COLUMN_ID, &(a->id), -1); + a->item = get_task_item (&iter, appGUI); + a->notify = notify_notification_new (item->summary, tmpbuf, GTK_STOCK_DIALOG_WARNING, NULL); - notify_notification_set_timeout (a->notify, NOTIFY_EXPIRES_NEVER); - switch (get_priority_index (item->priority)) { - case 0: notify_notification_set_urgency (a->notify, NOTIFY_URGENCY_LOW); break; - case 1: notify_notification_set_urgency (a->notify, NOTIFY_URGENCY_NORMAL); break; - case 2: notify_notification_set_urgency (a->notify, NOTIFY_URGENCY_CRITICAL); break; - } + notify_notification_set_timeout (a->notify, NOTIFY_EXPIRES_NEVER); + switch (get_priority_index (item->priority)) { + case 0: notify_notification_set_urgency (a->notify, NOTIFY_URGENCY_LOW); break; + case 1: notify_notification_set_urgency (a->notify, NOTIFY_URGENCY_NORMAL); break; + case 2: notify_notification_set_urgency (a->notify, NOTIFY_URGENCY_CRITICAL); break; + } + if (item->due_time != -1) { notify_notification_add_action (a->notify, "postpone", "Postpone", - (NotifyActionCallback)tsk_postpone_callback, appGUI, NULL); - notify_notification_add_action (a->notify, "show_task", "Show task", - (NotifyActionCallback)tsk_show_callback, appGUI, NULL); - notify_notification_add_action (a->notify, "done", "Done", - (NotifyActionCallback)tsk_done_callback, appGUI, NULL); + (NotifyActionCallback)tsk_postpone_callback, appGUI, NULL); + } + notify_notification_add_action (a->notify, "show_task", "Show task", + (NotifyActionCallback)tsk_show_callback, appGUI, NULL); + notify_notification_add_action (a->notify, "done", "Done", + (NotifyActionCallback)tsk_done_callback, appGUI, NULL); - if (!notify_notification_show (a->notify, NULL)) { - g_warning ("Failed to send notification"); - return FALSE; - } + if (!notify_notification_show (a->notify, NULL)) { + g_warning ("Failed to send notification"); + return FALSE; + } - appGUI->tsk->notifications = g_slist_append (appGUI->tsk->notifications, a); + appGUI->tsk->notifications = g_slist_append (appGUI->tsk->notifications, a); - gtk_list_store_set (appGUI->tsk->tasks_list_store, &iter, - TA_COLUMN_ACTIVE, FALSE, -1); - } + gtk_list_store_set (appGUI->tsk->tasks_list_store, &iter, + TA_COLUMN_ACTIVE, FALSE, + TA_COLUMN_ACTIVE_WARNING, FALSE, -1); - } else if (item->warning_days != 0) { -/* } else if (item->warning_date != 0 && (item->warning_date < current_date || - (item->warning_date == current_date && item->warning_time < current_time))) { - message.iter = iter; - message.item = get_task_item (&iter, appGUI); - message.appGUI = appGUI; + } else if (tsk_show_warning_notification (item, &iter, appGUI)) { - sprintf (tmpbuf2, "<b>%s</b>\n<i>%s</i>", - item->summary, get_date_time_full_str (item->due_date_julian, item->due_time)); - strncpy (tmpbuf, tmpbuf2, BUFFER_SIZE); - if (item->desc != NULL) { - if (strlen (item->desc)) { - sprintf (tmpbuf, "%s\n%.100s", tmpbuf2, item->desc); - } + sprintf (tmpbuf2, "<b>%s</b>\n<i>%s</i>", + item->summary, get_date_time_full_str (item->due_date_julian, item->due_time)); + strncpy (tmpbuf, tmpbuf2, BUFFER_SIZE); + if (item->desc != NULL) { + if (strlen (item->desc)) { + sprintf (tmpbuf, "%s\n%.100s", tmpbuf2, item->desc); } + } - n = notify_notification_new (_("Alarm warning!"), tmpbuf, GTK_STOCK_DIALOG_INFO, NULL); - notify_notification_set_timeout (n, NOTIFY_EXPIRES_NEVER); - notify_notification_set_urgency (n, NOTIFY_URGENCY_NORMAL); - notify_notification_add_action (n, "show_task", "Show task", - (NotifyActionCallback)tsk_show_callback, &message, NULL); + a = g_malloc (sizeof (TASK_NTF)); + g_assert (a != NULL); - if (!notify_notification_show (n, NULL)) { - g_warning ("Failed to send notification"); - return FALSE; - } - gtk_list_store_set (appGUI->tsk->tasks_list_store, &iter, - TA_COLUMN_WARNING_DAYS, 0, -1); -*/ + gtk_tree_model_get (GTK_TREE_MODEL (appGUI->tsk->tasks_list_store), &iter, TA_COLUMN_ID, &(a->id), -1); + a->item = get_task_item (&iter, appGUI); + a->notify = notify_notification_new (_("Alarm warning!"), tmpbuf, GTK_STOCK_DIALOG_INFO, NULL); + + notify_notification_set_timeout (a->notify, NOTIFY_EXPIRES_NEVER); + notify_notification_set_urgency (a->notify, NOTIFY_URGENCY_NORMAL); + notify_notification_add_action (a->notify, "show_task", "Show task", + (NotifyActionCallback)tsk_show_callback, appGUI, NULL); + + if (!notify_notification_show (a->notify, NULL)) { + g_warning ("Failed to send notification"); + return FALSE; + } + + appGUI->tsk->notifications = g_slist_append (appGUI->tsk->notifications, a); + + gtk_list_store_set (appGUI->tsk->tasks_list_store, &iter, + TA_COLUMN_ACTIVE_WARNING, FALSE, -1); } } - - task_item_free (item); + task_item_free (item); } } @@ -282,7 +456,7 @@ /*------------------------------------------------------------------------------*/ -gboolean +gboolean time_handler (GUI *appGUI) { static gint counter = 0; Modified: trunk/src/gui.h =================================================================== --- trunk/src/gui.h 2008-05-31 15:04:46 UTC (rev 441) +++ trunk/src/gui.h 2008-05-31 15:53:09 UTC (rev 442) @@ -708,6 +708,10 @@ GtkTextIter about_entry_iter; GtkTextBuffer *about_entry_buffer; + /* miscellaneous */ + guint32 run_date; + gint run_time; + /* modules */ CALENDAR *cal; TASKS *tsk; Modified: trunk/src/main.c =================================================================== --- trunk/src/main.c 2008-05-31 15:04:46 UTC (rev 441) +++ trunk/src/main.c 2008-05-31 15:53:09 UTC (rev 442) @@ -89,6 +89,9 @@ appGUI->nte = nte; appGUI->opt = opt; + appGUI->run_date = get_julian_for_today (); + appGUI->run_time = get_seconds_for_today (); + /* default values */ appGUI->hovering_over_link = FALSE; appGUI->hand_cursor = NULL; Modified: trunk/src/tasks.h =================================================================== --- trunk/src/tasks.h 2008-05-31 15:04:46 UTC (rev 441) +++ trunk/src/tasks.h 2008-05-31 15:53:09 UTC (rev 442) @@ -66,6 +66,7 @@ void apply_task_attributes (GUI *appGUI); void refresh_tasks (GUI *appGUI); void add_item_to_list (TASK_ITEM *item, GUI *appGUI); +gchar* get_date_color (guint32 julian_day, gint time, gboolean done); #endif /* _TASKS_H */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |