summaryrefslogtreecommitdiff
path: root/applets/clock/calendar-window.c
diff options
context:
space:
mode:
Diffstat (limited to 'applets/clock/calendar-window.c')
-rw-r--r--applets/clock/calendar-window.c1616
1 files changed, 45 insertions, 1571 deletions
diff --git a/applets/clock/calendar-window.c b/applets/clock/calendar-window.c
index 062e4d7e..c2a723d4 100644
--- a/applets/clock/calendar-window.c
+++ b/applets/clock/calendar-window.c
@@ -25,22 +25,12 @@
* Most of the original code comes from clock.c
*/
- /*
- * Evolution calendar integration TODO:
- * + Fix treeview scrolling and sizing
- * + Tooltips for tasks/appointments
- * + Do everything backwards if the clock is on the bottom
- * + Double clicking appointments/tasks should open them in evo
- * + Consider using different colours for different sources
- * + Consider doing a GtkMenu tearoff type thing
- */
-
#include <config.h>
#include <string.h>
#include <glib/gi18n.h>
-#include <mateconf/mateconf-client.h>
+#include <gio/gio.h>
#define MATE_DESKTOP_USE_UNSTABLE_API
#include <libmate/mate-desktop-utils.h>
@@ -50,30 +40,14 @@
#include "clock.h"
#include "clock-utils.h"
#include "clock-typebuiltins.h"
-#ifdef HAVE_LIBECAL
-#include "calendar-client.h"
-#endif
#define CALENDAR_WINDOW_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), CALENDAR_TYPE_WINDOW, CalendarWindowPrivate))
-#define KEY_LOCATIONS_EXPANDED "expand_locations"
-#ifdef HAVE_LIBECAL
-/* For the following value, take into account the KEY_* that are not inside this #ifdef! */
-# define N_CALENDAR_WINDOW_MATECONF_PREFS 5
-# define KEY_APPOINTMENTS_EXPANDED "expand_appointments"
-# define KEY_BIRTHDAYS_EXPANDED "expand_birthdays"
-# define KEY_TASKS_EXPANDED "expand_tasks"
-# define KEY_WEATHER_EXPANDED "expand_weather"
-
-# define KEY_CALENDAR_APP "/desktop/mate/applications/calendar"
-# define KEY_TASKS_APP "/desktop/mate/applications/tasks"
-#else
-# define N_CALENDAR_WINDOW_MATECONF_PREFS 1
-#endif
+#define KEY_LOCATIONS_EXPANDED "expand-locations"
enum {
- EDIT_LOCATIONS,
- LAST_SIGNAL
+EDIT_LOCATIONS,
+LAST_SIGNAL
};
static guint signals[LAST_SIGNAL];
@@ -81,7 +55,7 @@ static guint signals[LAST_SIGNAL];
struct _CalendarWindowPrivate {
GtkWidget *calendar;
- char *prefs_dir;
+ char *prefs_path;
gboolean invert_order;
gboolean show_weeks;
@@ -89,28 +63,7 @@ struct _CalendarWindowPrivate {
GtkWidget *locations_list;
-#ifdef HAVE_LIBECAL
- ClockFormat time_format;
-
- CalendarClient *client;
-
- GtkWidget *appointment_list;
- GtkWidget *birthday_list;
- GtkWidget *weather_list;
- GtkWidget *task_list;
-
- GtkListStore *appointments_model;
- GtkListStore *tasks_model;
-
- GtkTreeSelection *previous_selection;
-
- GtkTreeModelFilter *appointments_filter;
- GtkTreeModelFilter *birthdays_filter;
- GtkTreeModelFilter *tasks_filter;
- GtkTreeModelFilter *weather_filter;
-#endif /* HAVE_LIBECAL */
-
- MateConfClient *mateconfclient;
+ GSettings *settings;
};
G_DEFINE_TYPE (CalendarWindow, calendar_window, GTK_TYPE_WINDOW)
@@ -119,1409 +72,22 @@ enum {
PROP_0,
PROP_INVERTORDER,
PROP_SHOWWEEKS,
-#ifdef HAVE_LIBECAL
- PROP_TIMEFORMAT,
-#endif
PROP_CURRENTTIMEP,
- PROP_PREFSDIR
+ PROP_PREFSPATH
};
static time_t *calendar_window_get_current_time_p (CalendarWindow *calwin);
static void calendar_window_set_current_time_p (CalendarWindow *calwin,
time_t *current_time);
-static const char *calendar_window_get_prefs_dir (CalendarWindow *calwin);
-static void calendar_window_set_prefs_dir (CalendarWindow *calwin,
- const char *prefs_dir);
+static const char *calendar_window_get_prefs_path (CalendarWindow *calwin);
+static void calendar_window_set_prefs_path (CalendarWindow *calwin,
+ const char *prefs_path);
static GtkWidget * create_hig_frame (CalendarWindow *calwin,
const char *title,
const char *button_label,
const char *key,
GCallback callback);
-#ifdef HAVE_LIBECAL
-
-static void
-clock_launch_calendar_tasks_app (CalendarWindow *calwin,
- const char *key_program,
- const char *argument)
-{
- char **argv;
- int argc;
- char *key;
- char *program;
- gboolean terminal;
- char *command_line;
- GdkScreen *screen;
- GError *error;
- gboolean result;
-
- key = g_strdup_printf ("%s%s", key_program, "/exec");
- program = mateconf_client_get_string (calwin->priv->mateconfclient,
- key, NULL);
- g_free (key);
-
- key = g_strdup_printf ("%s%s", key_program, "/needs_term");
- terminal = mateconf_client_get_bool (calwin->priv->mateconfclient,
- key, NULL);
- g_free (key);
-
- if (program == NULL) {
- g_printerr ("Cannot launch calendar/tasks application: key not set\n");
- return;
- }
-
- command_line = g_find_program_in_path (program);
- if (command_line == NULL) {
- g_printerr ("Cannot launch calendar/tasks application: %s in path\n", program);
- g_free (program);
- return;
- }
- g_free (command_line);
-
- if (argument) {
- argc = 2;
- argv = g_new0 (char *, 3);
- argv[1] = g_strdup (argument);
- } else {
- argc = 1;
- argv = g_new0 (char *, 2);
- }
- argv[0] = program; /* no strdup, and it will get freed for free */
-
- screen = gtk_widget_get_screen (calwin->priv->calendar);
- error = NULL;
-
- if (terminal)
- mate_desktop_prepend_terminal_to_vector (&argc, &argv);
-
- result = gdk_spawn_on_screen (screen,
- NULL, /* working directory */
- argv,
- NULL, /* envp */
- G_SPAWN_SEARCH_PATH,
- NULL, /* child setup func */
- NULL, /* user data */
- NULL, /* child pid */
- &error);
-
- if (!result) {
- g_printerr ("Cannot launch calendar/tasks application: %s\n",
- error->message);
- g_error_free (error);
- }
-
- g_strfreev (argv);
-}
-
-static void
-clock_launch_calendar_app (CalendarWindow *calwin,
- const char *argument)
-{
- clock_launch_calendar_tasks_app (calwin, KEY_CALENDAR_APP, argument);
-}
-
-static void
-clock_launch_tasks_app (CalendarWindow *calwin,
- const char *argument)
-{
- clock_launch_calendar_tasks_app (calwin, KEY_TASKS_APP, argument);
-}
-
-static void
-update_frame_visibility (GtkWidget *frame,
- GtkTreeModel *model)
-{
- GtkTreeIter iter;
- gboolean model_empty;
-
- if (!frame)
- return;
-
- model_empty = !gtk_tree_model_get_iter_first (model, &iter);
-
- if (model_empty)
- gtk_widget_hide (frame);
- else
- gtk_widget_show (frame);
-}
-
-enum {
- APPOINTMENT_COLUMN_UID,
- APPOINTMENT_COLUMN_URI,
- APPOINTMENT_COLUMN_SUMMARY,
- APPOINTMENT_COLUMN_DESCRIPTION,
- APPOINTMENT_COLUMN_START_TIME,
- APPOINTMENT_COLUMN_START_TEXT,
- APPOINTMENT_COLUMN_END_TIME,
- APPOINTMENT_COLUMN_ALL_DAY,
- APPOINTMENT_COLUMN_PIXBUF,
- N_APPOINTMENT_COLUMNS
-};
-
-enum {
- TASK_COLUMN_UID,
- TASK_COLUMN_SUMMARY,
- TASK_COLUMN_DESCRIPTION,
- TASK_COLUMN_START_TIME,
- TASK_COLUMN_DUE_TIME,
- TASK_COLUMN_PERCENT_COMPLETE,
- TASK_COLUMN_PERCENT_COMPLETE_TEXT,
- TASK_COLUMN_COMPLETED,
- TASK_COLUMN_COMPLETED_TIME,
- TASK_COLUMN_OVERDUE_ATTR,
- TASK_COLUMN_COLOR,
- TASK_COLUMN_PRIORITY,
- N_TASK_COLUMNS
-};
-
-static char *
-format_time (ClockFormat format,
- time_t t,
- guint year,
- guint month,
- guint day)
-{
- struct tm *tm;
- char *time_format;
- char result [256] = { 0, };
-
- if (!t)
- return NULL;
-
- tm = localtime (&t);
- if (!tm)
- return NULL;
-
- if (year == (tm->tm_year + 1900) &&
- month == tm->tm_mon &&
- day == tm->tm_mday) {
- if (format == CLOCK_FORMAT_12)
- /* Translators: This is a strftime format string.
- * It is used to display the time in 12-hours format
- * (eg, like in the US: 8:10 am). The %p expands to
- * am/pm. */
- time_format = g_locale_from_utf8 (_("%l:%M %p"), -1, NULL, NULL, NULL);
- else
- /* Translators: This is a strftime format string.
- * It is used to display the time in 24-hours format
- * (eg, like in France: 20:10). */
- time_format = g_locale_from_utf8 (_("%H:%M"), -1, NULL, NULL, NULL);
- }
- else {
- /* Translators: This is a strftime format string.
- * It is used to display the start date of an appointment, in
- * the most abbreviated way possible. */
- time_format = g_locale_from_utf8 (_("%b %d"), -1, NULL, NULL, NULL);
- }
-
- strftime (result, sizeof (result), time_format, tm);
- g_free (time_format);
-
- return g_locale_to_utf8 (result, -1, NULL, NULL, NULL);
-}
-
-static void
-handle_tasks_changed (CalendarWindow *calwin)
-{
- GSList *events, *l;
-
- gtk_list_store_clear (calwin->priv->tasks_model);
-
- events = calendar_client_get_events (calwin->priv->client,
- CALENDAR_EVENT_TASK);
- for (l = events; l; l = l->next) {
- CalendarTask *task = l->data;
- GtkTreeIter iter;
- char *percent_complete_text;
-
- g_assert (CALENDAR_EVENT (task)->type == CALENDAR_EVENT_TASK);
-
- /* FIXME: should this format be locale specific ? */
- percent_complete_text = g_strdup_printf ("%d%%", task->percent_complete);
-
- gtk_list_store_append (calwin->priv->tasks_model, &iter);
- gtk_list_store_set (calwin->priv->tasks_model, &iter,
- TASK_COLUMN_UID, task->uid,
- TASK_COLUMN_SUMMARY, task->summary,
- TASK_COLUMN_DESCRIPTION, task->description,
- TASK_COLUMN_START_TIME, (gint64)task->start_time,
- TASK_COLUMN_DUE_TIME, (gint64)task->due_time,
- TASK_COLUMN_PERCENT_COMPLETE, task->percent_complete,
- TASK_COLUMN_PERCENT_COMPLETE_TEXT, percent_complete_text,
- TASK_COLUMN_COMPLETED, task->percent_complete == 100,
- TASK_COLUMN_COMPLETED_TIME, (gint64)task->completed_time,
- TASK_COLUMN_COLOR, task->color_string,
- TASK_COLUMN_PRIORITY, task->priority,
- -1);
-
- g_free (percent_complete_text);
- calendar_event_free (CALENDAR_EVENT (task));
- }
- g_slist_free (events);
-
- update_frame_visibility (calwin->priv->task_list,
- GTK_TREE_MODEL (calwin->priv->tasks_filter));
-}
-
-static void
-handle_task_completed_toggled (CalendarWindow *calwin,
- const char *path_str,
- GtkCellRendererToggle *cell)
-{
- GtkTreePath *child_path, *path;
- GtkTreeIter iter;
- char *uid;
- gboolean task_completed;
- guint percent_complete;
-
- path = gtk_tree_path_new_from_string (path_str);
- child_path = gtk_tree_model_filter_convert_path_to_child_path (calwin->priv->tasks_filter, path);
- gtk_tree_model_get_iter (GTK_TREE_MODEL (calwin->priv->tasks_model),
- &iter, child_path);
- gtk_tree_model_get (GTK_TREE_MODEL (calwin->priv->tasks_model),
- &iter,
- TASK_COLUMN_UID, &uid,
- TASK_COLUMN_COMPLETED, &task_completed,
- TASK_COLUMN_PERCENT_COMPLETE, &percent_complete,
- -1);
-
- task_completed = !task_completed;
- percent_complete = task_completed ? 100 : 0;
-
- calendar_client_set_task_completed (calwin->priv->client,
- uid,
- task_completed,
- percent_complete);
-
- g_free (uid);
- gtk_tree_path_free (path);
- gtk_tree_path_free (child_path);
-}
-
-static void
-handle_task_percent_complete_edited (CalendarWindow *calwin,
- const char *path_str,
- const char *text,
- GtkCellRendererText *cell)
-{
- GtkTreePath *child_path, *path;
- GtkTreeIter iter;
- char *uid;
- int percent_complete;
- char *error = NULL, *text_copy;
-
- path = gtk_tree_path_new_from_string (path_str);
- child_path = gtk_tree_model_filter_convert_path_to_child_path (calwin->priv->tasks_filter, path);
- gtk_tree_model_get_iter (GTK_TREE_MODEL (calwin->priv->tasks_model),
- &iter, child_path);
- gtk_tree_model_get (GTK_TREE_MODEL (calwin->priv->tasks_model),
- &iter, TASK_COLUMN_UID, &uid,
- -1);
-
- text_copy = g_strdup (text);
- text_copy = g_strdelimit (text_copy, "%", ' ');
- text_copy = g_strstrip (text_copy);
- percent_complete = (int) g_strtod (text_copy, &error);
- if (!error || !error [0]) {
- gboolean task_completed;
-
- percent_complete = CLAMP (percent_complete, 0, 100);
- task_completed = (percent_complete == 100);
-
- calendar_client_set_task_completed (calwin->priv->client,
- uid,
- task_completed,
- percent_complete);
- }
-
- g_free (uid);
- g_free (text_copy);
- gtk_tree_path_free (path);
- gtk_tree_path_free (child_path);
-}
-
-static gboolean
-is_appointment (GtkTreeModel *model,
- GtkTreeIter *iter,
- gpointer data)
-{
- gchar *uri;
-
- gtk_tree_model_get (model, iter, APPOINTMENT_COLUMN_URI, &uri, -1);
- if (uri)
- return (g_ascii_strcasecmp (uri, "file") == 0 ||
- g_ascii_strcasecmp (uri, "webcal") == 0 ||
- g_ascii_strcasecmp (uri, "caldav") == 0 ||
- g_ascii_strcasecmp (uri, "exchange") == 0 ||
- g_ascii_strcasecmp (uri, "groupwise") == 0 ||
- g_ascii_strcasecmp (uri, "google") == 0);
- return FALSE;
-}
-
-static gboolean
-is_birthday (GtkTreeModel *model,
- GtkTreeIter *iter,
- gpointer data)
-{
- gchar *uri;
-
- gtk_tree_model_get (model, iter, APPOINTMENT_COLUMN_URI, &uri, -1);
- if (uri)
- return (g_ascii_strcasecmp (uri, "contacts") == 0);
- return FALSE;
-}
-
-static gboolean
-is_weather (GtkTreeModel *model,
- GtkTreeIter *iter,
- gpointer data)
-{
- gchar *uri;
-
- gtk_tree_model_get (model, iter, APPOINTMENT_COLUMN_URI, &uri, -1);
- if (uri)
- return (g_ascii_strcasecmp (uri, "weather") == 0);
- return FALSE;
-}
-
-static gboolean
-filter_out_tasks (GtkTreeModel *model,
- GtkTreeIter *iter,
- CalendarWindow *calwin)
-{
- gint64 start_time64;
- gint64 completed_time64;
- time_t start_time;
- time_t completed_time;
- time_t one_day_ago;
- gboolean visible;
-
- gtk_tree_model_get (model, iter,
- TASK_COLUMN_START_TIME, &start_time64,
- TASK_COLUMN_COMPLETED_TIME, &completed_time64,
- -1);
- start_time = start_time64;
- completed_time = completed_time64;
-
- one_day_ago = *(calwin->priv->current_time) - (24 * 60 * 60);
-
- visible = !start_time || start_time <= *(calwin->priv->current_time);
- if (visible)
- visible = !completed_time || completed_time >= one_day_ago;
-
- return visible;
-}
-
-static void
-modify_task_text_attributes (GtkTreeModel *model,
- GtkTreeIter *iter,
- GValue *value,
- gint column,
- CalendarWindow *calwin)
-{
- gint64 due_time64;
- time_t due_time;
- PangoAttrList *attr_list;
- PangoAttribute *attr;
- GtkTreeIter child_iter;
-
- gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER (model),
- &child_iter,
- iter);
-
- if (column != TASK_COLUMN_OVERDUE_ATTR) {
- memset (value, 0, sizeof (GValue));
- gtk_tree_model_get_value (GTK_TREE_MODEL (calwin->priv->tasks_model),
- &child_iter, column, value);
-
- return;
- }
-
- gtk_tree_model_get (GTK_TREE_MODEL (calwin->priv->tasks_model),
- &child_iter, TASK_COLUMN_DUE_TIME, &due_time64,
- -1);
- due_time = due_time64;
-
- if (due_time && due_time > *(calwin->priv->current_time))
- return;
-
- attr_list = pango_attr_list_new ();
-
- attr = pango_attr_weight_new (PANGO_WEIGHT_BOLD);
- attr->start_index = 0;
- attr->end_index = G_MAXINT;
- pango_attr_list_insert (attr_list, attr);
-
- g_value_take_boxed (value, attr_list);
-}
-
-static gboolean
-task_activated_cb (GtkTreeView *view,
- GtkTreePath *path,
- GtkTreeViewColumn *column,
- CalendarWindow *calwin)
-{
- GtkTreeIter iter;
- GtkTreePath *child_path;
- char *uid;
- char *argument;
-
- child_path = gtk_tree_model_filter_convert_path_to_child_path (calwin->priv->tasks_filter,
- path);
-
- gtk_tree_model_get_iter (GTK_TREE_MODEL (calwin->priv->tasks_model),
- &iter, child_path);
- gtk_tree_model_get (GTK_TREE_MODEL (calwin->priv->tasks_model),
- &iter, TASK_COLUMN_UID, &uid, -1);
-
- argument = g_strdup_printf ("task:%s", uid);
-
- clock_launch_tasks_app (calwin, argument);
-
- g_free (argument);
- g_free (uid);
- gtk_tree_path_free (child_path);
-
- return TRUE;
-}
-
-static void
-set_renderer_pixbuf_color_by_column (GtkCellRenderer *renderer,
- GtkTreeModel *model,
- GtkTreeIter *iter,
- gint column_number)
-{
- char *color_string;
- GdkPixbuf *pixbuf = NULL;
- GdkColor color;
-
- gtk_tree_model_get (model, iter, column_number, &color_string, -1);
-
- if (color_string && gdk_color_parse (color_string, &color)) {
- pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, FALSE, 8, 16, 16);
- /* GdkColor has 16 bits per color, gdk_pixbuf only uses 8 bits
- * per color. So just drop the least significant parts */
- gdk_pixbuf_fill (pixbuf,
- (color.red & 0xff00) << 16 |
- (color.green & 0xff00) << 8 |
- (color.blue & 0xff00));
-
- g_object_set (renderer, "visible", pixbuf != NULL, "pixbuf", pixbuf, NULL);
-
- if (pixbuf)
- g_object_unref (pixbuf);
-
- g_free (color_string);
- }
-}
-
-static void
-set_renderer_pixbuf_pixmap (GtkCellRenderer *renderer,
- GtkTreeModel *model,
- GtkTreeIter *iter,
- const char *iconpath)
-{
- GdkPixbuf *pixbuf = NULL;
- GError *error = NULL;
-
- if (!g_file_test (iconpath, G_FILE_TEST_IS_REGULAR)) {
- g_printerr ("File '%s' does not exist.\n", iconpath);
- return;
- }
-
- pixbuf = gdk_pixbuf_new_from_file (iconpath, &error);
- if (error) {
- g_printerr ("Cannot load '%s': %s\n",
- iconpath, error->message);
- g_error_free (error);
- return;
- }
-
- g_object_set (renderer,
- "visible", pixbuf != NULL,
- "pixbuf", pixbuf,
- NULL);
-
- if (pixbuf)
- g_object_unref (pixbuf);
-}
-
-static void
-set_renderer_pixbuf_pixmap_for_bday (GtkCellRenderer *renderer,
- GtkTreeModel *model,
- GtkTreeIter *iter,
- gint data_column)
-{
- const gchar *path = NULL;
- gchar *type = NULL;
-
- gtk_tree_model_get (model, iter, data_column, &type, -1);
- if (!type)
- return;
-
- /* type should be in format like this:
- * pas-id-4121A93E00000001-anniversary
- * pas-id-41112AF900000003-birthday
- * ...
- */
- if (g_strrstr (type, "birthday") != NULL)
- path = CLOCK_EDS_ICONDIR G_DIR_SEPARATOR_S "category_birthday_16.png";
- else if (g_strrstr (type, "anniversary") != NULL)
- path = CLOCK_EDS_ICONDIR G_DIR_SEPARATOR_S "category_gifts_16.png";
- else
- path = CLOCK_EDS_ICONDIR G_DIR_SEPARATOR_S "category_miscellaneous_16.png";
-
- g_free (type);
-
- set_renderer_pixbuf_pixmap (renderer, model, iter, path);
-}
-
-static void
-set_renderer_pixbuf_pixmap_for_weather (GtkCellRenderer *renderer,
- GtkTreeModel *model,
- GtkTreeIter *iter)
-{
- set_renderer_pixbuf_pixmap (renderer, model, iter,
- CLOCK_EDS_ICONDIR G_DIR_SEPARATOR_S "category_holiday_16.png");
-}
-
-static void
-task_pixbuf_cell_data_func (GtkTreeViewColumn *column,
- GtkCellRenderer *renderer,
- GtkTreeModel *model,
- GtkTreeIter *iter,
- gpointer data)
-{
- set_renderer_pixbuf_color_by_column (renderer,
- model,
- iter,
- TASK_COLUMN_COLOR);
-}
-
-static void
-appointment_pixbuf_cell_data_func (GtkTreeViewColumn *column,
- GtkCellRenderer *renderer,
- GtkTreeModel *model,
- GtkTreeIter *iter,
- gpointer data)
-{
- set_renderer_pixbuf_color_by_column (renderer,
- model,
- iter,
- APPOINTMENT_COLUMN_PIXBUF);
-}
-static void
-birthday_pixbuf_cell_data_func (GtkTreeViewColumn *column,
- GtkCellRenderer *renderer,
- GtkTreeModel *model,
- GtkTreeIter *iter,
- gpointer data)
-{
-
- /* APPOINTMENT_COLUMN_UID contains data to select between
- * anniversary or birthday
- */
- set_renderer_pixbuf_pixmap_for_bday (renderer,
- model,
- iter,
- APPOINTMENT_COLUMN_UID);
-}
-static void
-weather_pixbuf_cell_data_func (GtkTreeViewColumn *column,
- GtkCellRenderer *renderer,
- GtkTreeModel *model,
- GtkTreeIter *iter,
- gpointer data)
-{
-
- set_renderer_pixbuf_pixmap_for_weather (renderer,
- model,
- iter);
-}
-
-static int
-compare_tasks (GtkTreeModel *model,
- GtkTreeIter *a,
- GtkTreeIter *b,
- gpointer user_data)
-{
- gboolean done_a, done_b;
- int priority_a, priority_b;
-
- gtk_tree_model_get (model, a,
- TASK_COLUMN_COMPLETED, &done_a,
- TASK_COLUMN_PRIORITY, &priority_a,
- -1);
- gtk_tree_model_get (model, b,
- TASK_COLUMN_COMPLETED, &done_b,
- TASK_COLUMN_PRIORITY, &priority_b,
- -1);
-
- /* Always sort completed tasks last */
- if (done_a != done_b)
- return done_a ? -1 : 1;
-
- /* We change undefined priorities so they appear as "Normal" */
- if (priority_a <= 0)
- priority_a = 5;
- if (priority_b <= 0)
- priority_b = 5;
-
- /* We'll just use the ordering of the priority values. */
- if (priority_a < priority_b)
- return -1;
- else if (priority_a > priority_b)
- return 1;
- else {
- gint64 due_time_a64, due_time_b64;
- time_t due_time_a, due_time_b;
-
- gtk_tree_model_get (model, a,
- TASK_COLUMN_DUE_TIME, &due_time_a64, -1);
- gtk_tree_model_get (model, b,
- TASK_COLUMN_DUE_TIME, &due_time_b64, -1);
- due_time_a = due_time_a64;
- due_time_b = due_time_b64;
-
- if (due_time_a < due_time_b)
- return -1;
- else if (due_time_a > due_time_b)
- return 1;
- else {
- char *summary_a, *summary_b;
- int res;
-
- gtk_tree_model_get (model, a, TASK_COLUMN_SUMMARY, &summary_a, -1);
- gtk_tree_model_get (model, b, TASK_COLUMN_SUMMARY, &summary_b, -1);
-
- res = g_utf8_collate (summary_a ? summary_a: "",
- summary_b ? summary_b: "");
-
- g_free (summary_a);
- g_free (summary_b);
-
- return res;
- }
- }
-}
-
-static void
-calendar_window_tree_selection_changed (GtkTreeSelection *selection,
- CalendarWindow *calwin)
-{
- if (selection == calwin->priv->previous_selection)
- return;
-
- if (calwin->priv->previous_selection) {
- g_signal_handlers_block_by_func (calwin->priv->previous_selection,
- calendar_window_tree_selection_changed,
- calwin);
- gtk_tree_selection_unselect_all (calwin->priv->previous_selection);
- g_signal_handlers_unblock_by_func (calwin->priv->previous_selection,
- calendar_window_tree_selection_changed,
- calwin);
- }
-
- calwin->priv->previous_selection = selection;
-}
-
-static void
-edit_tasks (CalendarWindow *calwin)
-{
- clock_launch_tasks_app (calwin, NULL);
-}
-
-static GtkWidget *
-create_task_list (CalendarWindow *calwin,
- GtkWidget **tree_view,
- GtkWidget **scrolled_window)
-{
- GtkWidget *list;
- GtkWidget *view;
- GtkWidget *scrolled;
- GtkCellRenderer *cell;
- GtkTreeViewColumn *column;
- GtkTreeSelection *selection;
-
- list = create_hig_frame (calwin,
- _("Tasks"), _("Edit"),
- KEY_TASKS_EXPANDED,
- G_CALLBACK (edit_tasks));
-
- *scrolled_window = scrolled = gtk_scrolled_window_new (NULL, NULL);
- gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled),
- GTK_SHADOW_IN);
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled),
- GTK_POLICY_NEVER,
- GTK_POLICY_AUTOMATIC);
- /* we show the widget before adding to the container, since adding to
- * the container changes the visibility depending on the state of the
- * expander */
- gtk_widget_show (scrolled);
- gtk_container_add (GTK_CONTAINER (list), scrolled);
-
- g_assert (calwin->priv->tasks_model != NULL);
-
- *tree_view = view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (calwin->priv->tasks_filter));
- gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (view), FALSE);
-
- g_signal_connect (view, "row-activated",
- G_CALLBACK (task_activated_cb), calwin);
-
- /* Source color */
- column = gtk_tree_view_column_new ();
- cell = gtk_cell_renderer_pixbuf_new ();
- gtk_tree_view_column_pack_start (column, cell, TRUE);
- gtk_tree_view_column_set_cell_data_func (column, cell,
- (GtkTreeCellDataFunc) task_pixbuf_cell_data_func,
- NULL, NULL);
- gtk_tree_view_append_column (GTK_TREE_VIEW (view), column);
-
- /* Completed toggle */
- column = gtk_tree_view_column_new ();
- cell = gtk_cell_renderer_toggle_new ();
- g_object_set (cell,
- "activatable", TRUE,
- NULL);
- g_signal_connect_swapped (cell, "toggled",
- G_CALLBACK (handle_task_completed_toggled),
- calwin);
- gtk_tree_view_column_pack_start (column, cell, TRUE);
- gtk_tree_view_column_add_attribute (column, cell,
- "active", TASK_COLUMN_COMPLETED);
- gtk_tree_view_append_column (GTK_TREE_VIEW (view), column);
-
- /* Percent complete */
- column = gtk_tree_view_column_new ();
- cell = gtk_cell_renderer_text_new ();
- g_object_set (cell,
- "editable", TRUE,
- NULL);
- g_signal_connect_swapped (cell, "edited",
- G_CALLBACK (handle_task_percent_complete_edited),
- calwin);
- gtk_tree_view_column_pack_start (column, cell, TRUE);
- gtk_tree_view_column_add_attribute (column, cell,
- "text", TASK_COLUMN_PERCENT_COMPLETE_TEXT);
- gtk_tree_view_append_column (GTK_TREE_VIEW (view), column);
-
- /* Summary */
- column = gtk_tree_view_column_new ();
- cell = gtk_cell_renderer_text_new ();
- g_object_set (cell, "ellipsize", PANGO_ELLIPSIZE_END, NULL);
- gtk_tree_view_column_pack_start (column, cell, TRUE);
- gtk_tree_view_column_set_attributes (column, cell,
- "text", TASK_COLUMN_SUMMARY,
- "strikethrough", TASK_COLUMN_COMPLETED,
- "attributes", TASK_COLUMN_OVERDUE_ATTR,
- NULL);
- gtk_tree_view_append_column (GTK_TREE_VIEW (view), column);
-
- selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (view));
- g_signal_connect (selection, "changed",
- G_CALLBACK (calendar_window_tree_selection_changed),
- calwin);
-
- gtk_container_add (GTK_CONTAINER (scrolled), view);
-
- gtk_widget_show (view);
-
- return list;
-}
-
-static void
-mark_day_on_calendar (CalendarClient *client,
- guint day,
- CalendarWindow *calwin)
-{
- gtk_calendar_mark_day (GTK_CALENDAR (calwin->priv->calendar), day);
-}
-
-static void
-handle_appointments_changed (CalendarWindow *calwin)
-{
- GSList *events, *l;
- guint year, month, day;
-
- if (calwin->priv->calendar) {
- gtk_calendar_clear_marks (GTK_CALENDAR (calwin->priv->calendar));
-
- calendar_client_foreach_appointment_day (calwin->priv->client,
- (CalendarDayIter) mark_day_on_calendar,
- calwin);
- }
-
- gtk_list_store_clear (calwin->priv->appointments_model);
-
- calendar_client_get_date (calwin->priv->client, &year, &month, &day);
-
- events = calendar_client_get_events (calwin->priv->client,
- CALENDAR_EVENT_APPOINTMENT);
- for (l = events; l; l = l->next) {
- CalendarAppointment *appointment = l->data;
- GtkTreeIter iter;
- char *start_text;
-
- g_assert (CALENDAR_EVENT (appointment)->type == CALENDAR_EVENT_APPOINTMENT);
-
- if (appointment->is_all_day)
- start_text = g_strdup (_("All Day"));
- else
- start_text = format_time (calwin->priv->time_format,
- appointment->start_time,
- year, month, day);
-
-
- gtk_list_store_append (calwin->priv->appointments_model,
- &iter);
- gtk_list_store_set (calwin->priv->appointments_model, &iter,
- APPOINTMENT_COLUMN_UID, appointment->uid,
- APPOINTMENT_COLUMN_URI, appointment->uri,
- APPOINTMENT_COLUMN_SUMMARY, appointment->summary,
- APPOINTMENT_COLUMN_DESCRIPTION, appointment->description,
- APPOINTMENT_COLUMN_START_TIME, (gint64)appointment->start_time,
- APPOINTMENT_COLUMN_START_TEXT, start_text,
- APPOINTMENT_COLUMN_END_TIME, (gint64)appointment->end_time,
- APPOINTMENT_COLUMN_ALL_DAY, appointment->is_all_day,
- APPOINTMENT_COLUMN_PIXBUF, appointment->color_string,
- -1);
-
- g_free (start_text);
- calendar_event_free (CALENDAR_EVENT (appointment));
- }
- g_slist_free (events);
-
- update_frame_visibility (calwin->priv->appointment_list,
- GTK_TREE_MODEL (calwin->priv->appointments_filter));
- update_frame_visibility (calwin->priv->birthday_list,
- GTK_TREE_MODEL (calwin->priv->birthdays_filter));
- update_frame_visibility (calwin->priv->weather_list,
- GTK_TREE_MODEL (calwin->priv->weather_filter));
-}
-
-static GtkWidget *
-create_list_for_appointment_model (CalendarWindow *calwin,
- const char *label,
- GtkTreeModelFilter **filter,
- GtkTreeModelFilterVisibleFunc is_for_filter,
- GtkTreeCellDataFunc set_pixbuf_cell,
- gboolean show_start,
- GtkWidget **tree_view,
- GtkWidget **scrolled_window,
- const char *key,
- GCallback callback)
-{
- GtkWidget *list;
- GtkWidget *view;
- GtkWidget *scrolled;
- GtkCellRenderer *cell;
- GtkTreeViewColumn *column;
- GtkTreeSelection *selection;
-
-
- list = create_hig_frame (calwin, label, _("Edit"), key, callback);
-
- *scrolled_window = scrolled = gtk_scrolled_window_new (NULL, NULL);
- gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled),
- GTK_SHADOW_IN);
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled),
- GTK_POLICY_NEVER,
- GTK_POLICY_AUTOMATIC);
- /* we show the widget before adding to the container, since adding to
- * the container changes the visibility depending on the state of the
- * expander */
- gtk_widget_show (scrolled);
- gtk_container_add (GTK_CONTAINER (list), scrolled);
-
- g_assert (calwin->priv->appointments_model != NULL);
-
- if (!*filter) {
- *filter =
- GTK_TREE_MODEL_FILTER (
- gtk_tree_model_filter_new (GTK_TREE_MODEL (calwin->priv->appointments_model),
- NULL));
- gtk_tree_model_filter_set_visible_func (
- *filter,
- (GtkTreeModelFilterVisibleFunc) is_for_filter,
- calwin,
- NULL);
- }
-
- *tree_view = view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (*filter));
- gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (view), FALSE);
-
- /* Icon */
- column = gtk_tree_view_column_new ();
- cell = gtk_cell_renderer_pixbuf_new ();
- gtk_tree_view_column_pack_start (column, cell, TRUE);
- gtk_tree_view_column_set_cell_data_func (column, cell,
- (GtkTreeCellDataFunc) set_pixbuf_cell,
- NULL, NULL);
- gtk_tree_view_append_column (GTK_TREE_VIEW (view), column);
-
- if (show_start) {
- /* Start time */
- column = gtk_tree_view_column_new ();
- cell = gtk_cell_renderer_text_new ();
- gtk_tree_view_column_pack_start (column, cell, TRUE);
- gtk_tree_view_column_add_attribute (column, cell,
- "text", APPOINTMENT_COLUMN_START_TEXT);
- gtk_tree_view_append_column (GTK_TREE_VIEW (view), column);
- }
-
- /* Summary */
- column = gtk_tree_view_column_new ();
- cell = gtk_cell_renderer_text_new ();
- g_object_set (cell, "ellipsize", PANGO_ELLIPSIZE_END, NULL);
- gtk_tree_view_column_pack_start (column, cell, TRUE);
- gtk_tree_view_column_add_attribute (column, cell,
- "text", APPOINTMENT_COLUMN_SUMMARY);
- gtk_tree_view_append_column (GTK_TREE_VIEW (view), column);
-
- selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (view));
- g_signal_connect (selection, "changed",
- G_CALLBACK (calendar_window_tree_selection_changed),
- calwin);
-
- gtk_container_add (GTK_CONTAINER (scrolled), view);
-
- gtk_widget_show (view);
-
- return list;
-}
-
-static void
-edit_appointments (CalendarWindow *calwin)
-{
- clock_launch_calendar_app (calwin, NULL);
-}
-
-static GtkWidget *
-create_appointment_list (CalendarWindow *calwin,
- GtkWidget **tree_view,
- GtkWidget **scrolled_window)
-{
- return create_list_for_appointment_model (
- calwin,
- _("Appointments"),
- &calwin->priv->appointments_filter,
- is_appointment,
- appointment_pixbuf_cell_data_func,
- TRUE,
- tree_view,
- scrolled_window,
- KEY_APPOINTMENTS_EXPANDED,
- G_CALLBACK (edit_appointments));
-}
-
-static void
-edit_birthdays (CalendarWindow *calwin)
-{
- clock_launch_calendar_app (calwin, NULL);
-}
-
-static GtkWidget *
-create_birthday_list (CalendarWindow *calwin,
- GtkWidget **tree_view,
- GtkWidget **scrolled_window)
-{
- /* FIXME: Figure out how to get rid of useless localized message in front of the summary */
- return create_list_for_appointment_model (
- calwin,
- _("Birthdays and Anniversaries"),
- &calwin->priv->birthdays_filter,
- is_birthday,
- birthday_pixbuf_cell_data_func,
- FALSE,
- tree_view,
- scrolled_window,
- KEY_BIRTHDAYS_EXPANDED,
- G_CALLBACK (edit_birthdays));
-}
-
-static void
-edit_weather (CalendarWindow *calwin)
-{
- clock_launch_calendar_app (calwin, NULL);
-}
-
-
-static GtkWidget *
-create_weather_list (CalendarWindow *calwin,
- GtkWidget **tree_view,
- GtkWidget **scrolled_window)
-{
- return create_list_for_appointment_model (
- calwin,
- _("Weather Information"),
- &calwin->priv->weather_filter,
- is_weather,
- weather_pixbuf_cell_data_func,
- FALSE,
- tree_view,
- scrolled_window,
- KEY_WEATHER_EXPANDED,
- G_CALLBACK (edit_weather));
-}
-
-static void
-calendar_window_create_tasks_model (CalendarWindow *calwin)
-{
- GType column_types [N_TASK_COLUMNS] = {
- G_TYPE_STRING, /* uid */
- G_TYPE_STRING, /* summary */
- G_TYPE_STRING, /* description */
- G_TYPE_INT64, /* start time */
- G_TYPE_INT64, /* due time */
- G_TYPE_UINT, /* percent complete */
- G_TYPE_STRING, /* percent complete text */
- G_TYPE_BOOLEAN, /* completed */
- G_TYPE_INT64, /* completed time */
- PANGO_TYPE_ATTR_LIST, /* summary text attributes */
- G_TYPE_STRING, /* color */
- G_TYPE_INT /* priority */
- };
-
- calwin->priv->tasks_model = gtk_list_store_newv (N_TASK_COLUMNS,
- column_types);
-
- gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE (calwin->priv->tasks_model),
- TASK_COLUMN_PRIORITY,
- compare_tasks,
- NULL, NULL);
-
- gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (calwin->priv->tasks_model),
- TASK_COLUMN_PRIORITY,
- GTK_SORT_ASCENDING);
-
- calwin->priv->tasks_filter = GTK_TREE_MODEL_FILTER (
- gtk_tree_model_filter_new (GTK_TREE_MODEL (calwin->priv->tasks_model),
- NULL));
- gtk_tree_model_filter_set_visible_func (
- calwin->priv->tasks_filter,
- (GtkTreeModelFilterVisibleFunc) filter_out_tasks,
- calwin,
- NULL);
- gtk_tree_model_filter_set_modify_func (
- calwin->priv->tasks_filter,
- N_TASK_COLUMNS,
- column_types,
- (GtkTreeModelFilterModifyFunc) modify_task_text_attributes,
- calwin,
- NULL);
-}
-
-static void
-calendar_window_create_appointments_model (CalendarWindow *calwin)
-{
- calwin->priv->appointments_model =
- gtk_list_store_new (N_APPOINTMENT_COLUMNS,
- G_TYPE_STRING, /* uid */
- G_TYPE_STRING, /* uri */
- G_TYPE_STRING, /* summary */
- G_TYPE_STRING, /* description */
- G_TYPE_INT64, /* start time */
- G_TYPE_STRING, /* start time text */
- G_TYPE_INT64, /* end time */
- G_TYPE_BOOLEAN, /* all day */
- G_TYPE_STRING); /* color */
-
- gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (calwin->priv->appointments_model),
- APPOINTMENT_COLUMN_START_TIME,
- GTK_SORT_ASCENDING);
-}
-
-static void
-calendar_day_activated (GtkCalendar *calendar,
- CalendarWindow *calwin)
-{
- unsigned int day;
- unsigned int month;
- unsigned int year;
- time_t date;
- struct tm utc_date_tm;
- struct tm local_date_tm = { 0, };
- char *argument;
-
- gtk_calendar_get_date (calendar, &year, &month, &day);
-
- local_date_tm.tm_mday = (int) day;
- local_date_tm.tm_mon = (int) month;
- local_date_tm.tm_year = (int) year - 1900;
- local_date_tm.tm_isdst = -1;
-
- /* convert the local date picked in the calendar to broken-down UTC */
- date = mktime (&local_date_tm);
- gmtime_r (&date, &utc_date_tm);
-
- /* FIXME: once bug 409200 is fixed, we'll have to make this hh:mm:ss
- * instead of hhmmss */
- argument = g_strdup_printf ("calendar:///?startdate="
- "%.4d%.2d%.2dT%.2d%.2d%.2dZ",
- utc_date_tm.tm_year + 1900,
- utc_date_tm.tm_mon + 1,
- utc_date_tm.tm_mday,
- utc_date_tm.tm_hour,
- utc_date_tm.tm_min,
- 0);
-
- clock_launch_calendar_app (calwin, argument);
-
- g_free (argument);
-}
-
-static void
-calendar_day_selected (GtkCalendar *calendar,
- CalendarWindow *calwin)
-{
- guint day;
-
- gtk_calendar_get_date (calendar, NULL, NULL, &day);
-
- calendar_client_select_day (calwin->priv->client, day);
-
- handle_appointments_changed (calwin);
- handle_tasks_changed (calwin);
-}
-
-static void
-calendar_month_selected (GtkCalendar *calendar,
- CalendarWindow *calwin)
-{
- guint year, month;
-
- gtk_calendar_get_date (calendar, &year, &month, NULL);
-
- calendar_client_select_month (calwin->priv->client, month, year);
-
- handle_appointments_changed (calwin);
- handle_tasks_changed (calwin);
-}
-
-typedef struct
-{
- GtkWidget *calendar;
- GtkWidget *tree;
-} ConstraintData;
-
-static void
-constrain_list_size (GtkWidget *widget,
- GtkRequisition *requisition,
- ConstraintData *constraint)
-{
- GtkRequisition req;
- int screen_h;
- int max_height;
-
- /* constrain width to the calendar width */
- gtk_widget_size_request (constraint->calendar, &req);
- requisition->width = MIN (requisition->width, req.width);
-
- screen_h = gdk_screen_get_height (gtk_widget_get_screen (widget));
- /* constrain height to be the tree height up to a max */
- max_height = (screen_h - req.height) / 3;
- gtk_widget_size_request (constraint->tree, &req);
-
- requisition->height = MIN (req.height, max_height);
- requisition->height += 2 * gtk_widget_get_style (widget)->ythickness;
-}
-
-static void
-setup_list_size_constraint (GtkWidget *widget,
- GtkWidget *calendar,
- GtkWidget *tree)
-{
- ConstraintData *constraint;
-
- constraint = g_new0 (ConstraintData, 1);
- constraint->calendar = calendar;
- constraint->tree = tree;
-
- g_signal_connect_data (widget, "size-request",
- G_CALLBACK (constrain_list_size), constraint,
- (GClosureNotify) g_free, 0);
-}
-#endif /* HAVE_LIBECAL */
-
-static void
-expander_activated (GtkExpander *expander,
- CalendarWindow *calwin)
-{
- const char *key;
-
- key = (const gchar*)g_object_get_data (G_OBJECT (expander), "mateconf-key");
-
- if (mateconf_client_key_is_writable (calwin->priv->mateconfclient,
- key, NULL)) {
- mateconf_client_set_bool (calwin->priv->mateconfclient, key,
- gtk_expander_get_expanded (expander),
- NULL);
- }
-}
-
-static void
-expanded_changed (MateConfClient *client,
- guint cnxn_id,
- MateConfEntry *entry,
- GtkExpander *expander)
-{
- gboolean value;
-
- if (!entry->value || entry->value->type != MATECONF_VALUE_BOOL)
- return;
-
- value = mateconf_value_get_bool (entry->value);
-
- gtk_expander_set_expanded (expander, value);
-}
-
-static void
-remove_listener (gpointer data)
-{
- MateConfClient *client;
-
- client = mateconf_client_get_default ();
- mateconf_client_notify_remove (client, GPOINTER_TO_UINT (data));
- g_object_unref (client);
-}
-
-static void
-connect_expander_with_mateconf (CalendarWindow *calwin,
- GtkWidget *expander,
- const char *relative_key)
-{
- char *key;
- gboolean expanded;
- guint listener;
-
- key = g_strdup_printf ("%s/%s",
- calwin->priv->prefs_dir, relative_key);
-
- g_object_set_data_full (G_OBJECT (expander), "mateconf-key", (gpointer)key, g_free);
-
- expanded = mateconf_client_get_bool (calwin->priv->mateconfclient, key,
- NULL);
- gtk_expander_set_expanded (GTK_EXPANDER (expander), expanded);
-
- g_signal_connect_after (expander, "activate",
- G_CALLBACK (expander_activated),
- calwin);
-
- listener = mateconf_client_notify_add (
- calwin->priv->mateconfclient, key,
- (MateConfClientNotifyFunc) expanded_changed,
- expander, NULL, NULL);
-
- g_object_set_data_full (G_OBJECT (expander), "listener-id",
- GUINT_TO_POINTER (listener), remove_listener);
-}
-
-static void
-calendar_window_pack_pim (CalendarWindow *calwin,
- GtkWidget *vbox)
-{
-#ifdef HAVE_LIBECAL
- GtkWidget *list;
- GtkWidget *tree_view;
- GtkWidget *scrolled_window;
- guint year, month, day;
-
- calendar_window_create_tasks_model (calwin);
- calendar_window_create_appointments_model (calwin);
-
- list = create_task_list (calwin, &tree_view, &scrolled_window);
- setup_list_size_constraint (scrolled_window,
- calwin->priv->calendar, tree_view);
- update_frame_visibility (list,
- GTK_TREE_MODEL (calwin->priv->tasks_model));
- calwin->priv->task_list = list;
-
- list = create_birthday_list (calwin, &tree_view, &scrolled_window);
- setup_list_size_constraint (scrolled_window,
- calwin->priv->calendar, tree_view);
- update_frame_visibility (list,
- GTK_TREE_MODEL (calwin->priv->birthdays_filter));
- calwin->priv->birthday_list = list;
-
- list = create_weather_list (calwin, &tree_view, &scrolled_window);
- setup_list_size_constraint (scrolled_window,
- calwin->priv->calendar, tree_view);
- update_frame_visibility (list,
- GTK_TREE_MODEL (calwin->priv->weather_filter));
- calwin->priv->weather_list = list;
-
- list = create_appointment_list (calwin, &tree_view, &scrolled_window);
- setup_list_size_constraint (scrolled_window,
- calwin->priv->calendar, tree_view);
- update_frame_visibility (list,
- GTK_TREE_MODEL (calwin->priv->appointments_filter));
- calwin->priv->appointment_list = list;
-
- if (!calwin->priv->invert_order) {
- gtk_box_pack_start (GTK_BOX (vbox),
- calwin->priv->task_list,
- TRUE, TRUE, 0);
- gtk_box_pack_start (GTK_BOX (vbox),
- calwin->priv->appointment_list,
- TRUE, TRUE, 0);
- gtk_box_pack_start (GTK_BOX (vbox),
- calwin->priv->birthday_list,
- TRUE, TRUE, 0);
- gtk_box_pack_start (GTK_BOX (vbox),
- calwin->priv->weather_list,
- TRUE, TRUE, 0);
- } else {
- gtk_box_pack_start (GTK_BOX (vbox),
- calwin->priv->weather_list,
- TRUE, TRUE, 0);
- gtk_box_pack_start (GTK_BOX (vbox),
- calwin->priv->birthday_list,
- TRUE, TRUE, 0);
- gtk_box_pack_start (GTK_BOX (vbox),
- calwin->priv->appointment_list,
- TRUE, TRUE, 0);
- gtk_box_pack_start (GTK_BOX (vbox),
- calwin->priv->task_list,
- TRUE, TRUE, 0);
- }
-
- if (!calwin->priv->client) {
- calwin->priv->client = calendar_client_new ();
-
- g_signal_connect_swapped (calwin->priv->client,
- "tasks-changed",
- G_CALLBACK (handle_tasks_changed),
- calwin);
- g_signal_connect_swapped (calwin->priv->client,
- "appointments-changed",
- G_CALLBACK (handle_appointments_changed),
- calwin);
- }
-
- gtk_calendar_get_date (GTK_CALENDAR (calwin->priv->calendar),
- &year, &month, &day);
-
- calendar_client_select_day (calwin->priv->client, day);
- calendar_client_select_month (calwin->priv->client, month, year);
-
- handle_tasks_changed (calwin);
- handle_appointments_changed (calwin);
-
- g_signal_connect (calwin->priv->calendar,
- "day-selected-double-click",
- G_CALLBACK (calendar_day_activated),
- calwin);
- g_signal_connect (calwin->priv->calendar,
- "day-selected",
- G_CALLBACK (calendar_day_selected),
- calwin);
- g_signal_connect (calwin->priv->calendar,
- "month-changed",
- G_CALLBACK (calendar_month_selected),
- calwin);
-#endif /* HAVE_LIBECAL */
-}
-
static GtkWidget *
calendar_window_create_calendar (CalendarWindow *calwin)
{
@@ -1635,7 +201,8 @@ create_hig_frame (CalendarWindow *calwin,
g_signal_connect_swapped (button, "clicked", callback, calwin);
}
- connect_expander_with_mateconf (calwin, expander, key);
+ g_settings_bind (calwin->priv->settings, key, expander, "expanded",
+ G_SETTINGS_BIND_DEFAULT);
return vbox;
}
@@ -1685,11 +252,9 @@ calendar_window_fill (CalendarWindow *calwin)
if (!calwin->priv->invert_order) {
gtk_box_pack_start (GTK_BOX (vbox),
calwin->priv->calendar, TRUE, FALSE, 0);
- calendar_window_pack_pim (calwin, vbox);
calendar_window_pack_locations (calwin, vbox);
} else {
calendar_window_pack_locations (calwin, vbox);
- calendar_window_pack_pim (calwin, vbox);
gtk_box_pack_start (GTK_BOX (vbox),
calwin->priv->calendar, TRUE, FALSE, 0);
}
@@ -1716,7 +281,7 @@ calendar_window_constructor (GType type,
calwin = CALENDAR_WINDOW (obj);
g_assert (calwin->priv->current_time != NULL);
- g_assert (calwin->priv->prefs_dir != NULL);
+ g_assert (calwin->priv->prefs_path != NULL);
calendar_window_fill (calwin);
@@ -1744,19 +309,13 @@ calendar_window_get_property (GObject *object,
g_value_set_boolean (value,
calendar_window_get_show_weeks (calwin));
break;
-#ifdef HAVE_LIBECAL
- case PROP_TIMEFORMAT:
- g_value_set_enum (value,
- calendar_window_get_time_format (calwin));
- break;
-#endif
case PROP_CURRENTTIMEP:
g_value_set_pointer (value,
calendar_window_get_current_time_p (calwin));
break;
- case PROP_PREFSDIR:
+ case PROP_PREFSPATH:
g_value_set_string (value,
- calendar_window_get_prefs_dir (calwin));
+ calendar_window_get_prefs_path (calwin));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -1785,19 +344,13 @@ calendar_window_set_property (GObject *object,
calendar_window_set_show_weeks (calwin,
g_value_get_boolean (value));
break;
-#ifdef HAVE_LIBECAL
- case PROP_TIMEFORMAT:
- calendar_window_set_time_format (calwin,
- g_value_get_enum (value));
- break;
-#endif
case PROP_CURRENTTIMEP:
calendar_window_set_current_time_p (calwin,
g_value_get_pointer (value));
break;
- case PROP_PREFSDIR:
- calendar_window_set_prefs_dir (calwin,
- g_value_get_string (value));
+ case PROP_PREFSPATH:
+ calendar_window_set_prefs_path (calwin,
+ g_value_get_string (value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -1812,39 +365,9 @@ calendar_window_destroy (GtkObject *object)
calwin = CALENDAR_WINDOW (object);
-#ifdef HAVE_LIBECAL
- if (calwin->priv->client)
- g_object_unref (calwin->priv->client);
- calwin->priv->client = NULL;
-
- if (calwin->priv->appointments_model)
- g_object_unref (calwin->priv->appointments_model);
- calwin->priv->appointments_model = NULL;
-
- if (calwin->priv->tasks_model)
- g_object_unref (calwin->priv->tasks_model);
- calwin->priv->tasks_model = NULL;
-
- if (calwin->priv->appointments_filter)
- g_object_unref (calwin->priv->appointments_filter);
- calwin->priv->appointments_filter = NULL;
-
- if (calwin->priv->birthdays_filter)
- g_object_unref (calwin->priv->birthdays_filter);
- calwin->priv->birthdays_filter = NULL;
-
- if (calwin->priv->tasks_filter)
- g_object_unref (calwin->priv->tasks_filter);
- calwin->priv->tasks_filter = NULL;
-
- if (calwin->priv->weather_filter)
- g_object_unref (calwin->priv->weather_filter);
- calwin->priv->weather_filter = NULL;
-#endif /* HAVE_LIBECAL */
-
- if (calwin->priv->mateconfclient)
- g_object_unref (calwin->priv->mateconfclient);
- calwin->priv->mateconfclient = NULL;
+ if (calwin->priv->settings)
+ g_object_unref (calwin->priv->settings);
+ calwin->priv->settings = NULL;
GTK_OBJECT_CLASS (calendar_window_parent_class)->destroy (object);
}
@@ -1890,18 +413,6 @@ calendar_window_class_init (CalendarWindowClass *klass)
FALSE,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
-#ifdef HAVE_LIBECAL
- g_object_class_install_property (
- gobject_class,
- PROP_TIMEFORMAT,
- g_param_spec_enum ("time-format",
- "Time Format",
- "Time format used to display time",
- CLOCK_TYPE_FORMAT,
- clock_locale_format (),
- G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
-#endif
-
g_object_class_install_property (
gobject_class,
PROP_CURRENTTIMEP,
@@ -1912,10 +423,10 @@ calendar_window_class_init (CalendarWindowClass *klass)
g_object_class_install_property (
gobject_class,
- PROP_PREFSDIR,
- g_param_spec_string ("prefs-dir",
- "Preferences Directory",
- "Preferences directory in MateConf",
+ PROP_PREFSPATH,
+ g_param_spec_string ("prefs-path",
+ "Preferences Path",
+ "Preferences path in GSettings",
NULL,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
}
@@ -1934,16 +445,11 @@ calendar_window_init (CalendarWindow *calwin)
gtk_window_stick (window);
gtk_window_set_title (window, _("Calendar"));
gtk_window_set_icon_name (window, CLOCK_ICON);
-
-#ifdef HAVE_LIBECAL
- calwin->priv->previous_selection = NULL;
-#endif
- calwin->priv->mateconfclient = mateconf_client_get_default ();
}
GtkWidget *
calendar_window_new (time_t *static_current_time,
- const char *prefs_dir,
+ const char *prefs_path,
gboolean invert_order)
{
CalendarWindow *calwin;
@@ -1952,7 +458,7 @@ calendar_window_new (time_t *static_current_time,
"type", GTK_WINDOW_TOPLEVEL,
"current-time", static_current_time,
"invert-order", invert_order,
- "prefs-dir", prefs_dir,
+ "prefs-path", prefs_path,
NULL);
return GTK_WIDGET (calwin);
@@ -1962,17 +468,6 @@ void
calendar_window_refresh (CalendarWindow *calwin)
{
g_return_if_fail (CALENDAR_IS_WINDOW (calwin));
-
-#ifdef HAVE_LIBECAL
- if (calwin->priv->appointments_filter && calwin->priv->appointment_list)
- gtk_tree_model_filter_refilter (calwin->priv->appointments_filter);
- if (calwin->priv->birthdays_filter && calwin->priv->birthday_list)
- gtk_tree_model_filter_refilter (calwin->priv->birthdays_filter);
- if (calwin->priv->tasks_filter && calwin->priv->task_list)
- gtk_tree_model_filter_refilter (calwin->priv->tasks_filter);
- if (calwin->priv->weather_filter && calwin->priv->weather_list)
- gtk_tree_model_filter_refilter (calwin->priv->weather_filter);
-#endif
}
gboolean
@@ -2040,33 +535,7 @@ calendar_window_get_time_format (CalendarWindow *calwin)
g_return_val_if_fail (CALENDAR_IS_WINDOW (calwin),
CLOCK_FORMAT_INVALID);
-#ifdef HAVE_LIBECAL
- return calwin->priv->time_format;
-#else
return CLOCK_FORMAT_INVALID;
-#endif
-}
-
-void
-calendar_window_set_time_format (CalendarWindow *calwin,
- ClockFormat time_format)
-{
- g_return_if_fail (CALENDAR_IS_WINDOW (calwin));
-
-#ifdef HAVE_LIBECAL
- if (time_format != CLOCK_FORMAT_12 && time_format != CLOCK_FORMAT_24)
- time_format = clock_locale_format ();
-
- if (time_format == calwin->priv->time_format)
- return;
-
- calwin->priv->time_format = time_format;
- /* Time to display for appointments has changed */
- if (calwin->priv->appointments_model)
- handle_appointments_changed (calwin);
-
- g_object_notify (G_OBJECT (calwin), "time-format");
-#endif
}
static time_t *
@@ -2092,32 +561,37 @@ calendar_window_set_current_time_p (CalendarWindow *calwin,
}
static const char *
-calendar_window_get_prefs_dir (CalendarWindow *calwin)
+calendar_window_get_prefs_path (CalendarWindow *calwin)
{
g_return_val_if_fail (CALENDAR_IS_WINDOW (calwin), NULL);
- return calwin->priv->prefs_dir;
+ return calwin->priv->prefs_path;
}
static void
-calendar_window_set_prefs_dir (CalendarWindow *calwin,
- const char *prefs_dir)
+calendar_window_set_prefs_path (CalendarWindow *calwin,
+ const char *prefs_path)
{
g_return_if_fail (CALENDAR_IS_WINDOW (calwin));
- if (!calwin->priv->prefs_dir && (!prefs_dir || !prefs_dir [0]))
+ if (!calwin->priv->prefs_path && (!prefs_path || !prefs_path [0]))
return;
- if (calwin->priv->prefs_dir && prefs_dir && prefs_dir [0] &&
- !strcmp (calwin->priv->prefs_dir, prefs_dir))
+ if (calwin->priv->prefs_path && prefs_path && prefs_path [0] &&
+ !strcmp (calwin->priv->prefs_path, prefs_path))
return;
- if (calwin->priv->prefs_dir)
- g_free (calwin->priv->prefs_dir);
- calwin->priv->prefs_dir = NULL;
+ if (calwin->priv->prefs_path)
+ g_free (calwin->priv->prefs_path);
+ calwin->priv->prefs_path = NULL;
+
+ if (prefs_path && prefs_path [0])
+ calwin->priv->prefs_path = g_strdup (prefs_path);
+
+ g_object_notify (G_OBJECT (calwin), "prefs-path");
- if (prefs_dir && prefs_dir [0])
- calwin->priv->prefs_dir = g_strdup (prefs_dir);
+ if (calwin->priv->settings)
+ g_object_unref (calwin->priv->settings);
- g_object_notify (G_OBJECT (calwin), "prefs-dir");
+ calwin->priv->settings = g_settings_new_with_path (CLOCK_SCHEMA, calwin->priv->prefs_path);
}