update copyright year
[claws.git] / src / plugins / vcalendar / vcal_meeting_gtk.c
index 2b99c08efcec0033a86dba7507cc194676ed9fb7..96779cfce2100bbe4ef45ff27b56814f29cf6224 100644 (file)
@@ -1,6 +1,6 @@
 /*
- * Claws Mail -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2013 Colin Leroy <colin@colino.net> and 
+ * Claws Mail -- a GTK based, lightweight, and fast e-mail client
+ * Copyright (C) 1999-2022 Colin Leroy <colin@colino.net> and
  * the Claws Mail team
  *
  * This program is free software; you can redistribute it and/or modify
@@ -32,7 +32,7 @@
 #ifdef USE_PTHREAD
 #include <pthread.h>
 #endif
-#include <ical.h>
+#include <libical/ical.h>
 #include <gtk/gtk.h>
 #include <gdk/gdkkeysyms.h>
 #include <curl/curl.h>
@@ -54,6 +54,7 @@
 #include "gtkutils.h"
 #include "log.h"
 #include "utils.h"
+#include "file-utils.h"
 
 struct _VCalMeeting
 {
@@ -118,7 +119,7 @@ VCalAttendee *attendee_add(VCalMeeting *meet, gchar *address, gchar *name, gchar
        if (do_space) {                                                         \
                spacer = gtk_label_new("");                                     \
                gtk_widget_set_size_request(spacer, 18, 16);                            \
-               s_hbox = gtk_hbox_new(FALSE, 6);                                \
+               s_hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 6);                            \
                gtk_box_pack_start(GTK_BOX(s_hbox), spacer, FALSE, FALSE, 0);   \
                gtk_box_pack_start(GTK_BOX(s_hbox), widget, TRUE, TRUE, 0);     \
        }                                                                       \
@@ -126,23 +127,24 @@ VCalAttendee *attendee_add(VCalMeeting *meet, gchar *address, gchar *name, gchar
                label = gtk_label_new(tmpstr);                                  \
                g_free(tmpstr);                                                 \
                gtk_label_set_use_markup (GTK_LABEL (label), TRUE);             \
-               gtk_misc_set_alignment (GTK_MISC(label), 1, 0.5);               \
-               gtk_table_attach (GTK_TABLE (meet->table),                      \
-                                 label, 0, 1, i, i+1,                          \
-                                 GTK_FILL, GTK_FILL, 6, 6);                    \
-               gtk_table_attach (GTK_TABLE (meet->table),                      \
-                                 do_space?s_hbox:widget, 1, 2, i, i+1,         \
-                                 GTK_FILL|GTK_EXPAND, GTK_FILL, 6, 6);         \
+               gtk_label_set_xalign (GTK_LABEL(label), 1.0);                   \
+               gtk_grid_attach(GTK_GRID(meet->table), label, 0, i, 1, 1);      \
+               gtk_grid_attach(GTK_GRID(meet->table), do_space?s_hbox:widget,  \
+                               1, i, 1, 1);                                    \
+               gtk_widget_set_hexpand(do_space?s_hbox:widget, TRUE);           \
+               gtk_widget_set_halign(do_space?s_hbox:widget, GTK_ALIGN_FILL);  \
                if (GTK_IS_LABEL(widget)) {                                     \
                        gtk_label_set_use_markup(GTK_LABEL (widget), TRUE);     \
-                       gtk_misc_set_alignment (GTK_MISC(widget),0, 0);         \
+                       gtk_label_set_xalign(GTK_LABEL(widget), 0.0);           \
+                       gtk_label_set_yalign(GTK_LABEL(widget), 0.0);           \
                        gtk_label_set_line_wrap(GTK_LABEL(widget), TRUE);       \
                }                                                               \
        } else {                                                                \
                g_free(tmpstr);                                                 \
-               gtk_table_attach (GTK_TABLE (meet->table),                      \
-                                 do_space?s_hbox:widget, 0, 2, i, i+1,         \
-                                 GTK_FILL|GTK_EXPAND, GTK_FILL, 6, 6);         \
+               gtk_grid_attach(GTK_GRID(meet->table), do_space?s_hbox:widget,  \
+                               0, i, 1, 1);                                    \
+               gtk_widget_set_hexpand(do_space?s_hbox:widget, TRUE);           \
+               gtk_widget_set_halign(do_space?s_hbox:widget, GTK_ALIGN_FILL);  \
        }                                                                       \
        i++;                                                                    \
 }
@@ -156,7 +158,7 @@ VCalAttendee *attendee_add(VCalMeeting *meet, gchar *address, gchar *name, gchar
        if (do_space) {                                                         \
                spacer = gtk_label_new("");                                     \
                gtk_widget_set_size_request(spacer, 18, 16);                            \
-               s_hbox = gtk_hbox_new(FALSE, 6);                                \
+               s_hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 6);                            \
                gtk_box_pack_start(GTK_BOX(s_hbox), spacer, FALSE, FALSE, 0);   \
                gtk_box_pack_start(GTK_BOX(s_hbox), widget, TRUE, TRUE, 0);     \
        }                                                                       \
@@ -164,43 +166,44 @@ VCalAttendee *attendee_add(VCalMeeting *meet, gchar *address, gchar *name, gchar
                label = gtk_label_new(tmpstr);                                  \
                g_free(tmpstr);                                                 \
                gtk_label_set_use_markup (GTK_LABEL (label), TRUE);             \
-               gtk_misc_set_alignment (GTK_MISC(label), 1, 0.5);               \
+               gtk_label_set_xalign (GTK_LABEL(label), 1.0);                   \
                if(intable1)    {                                               \
-                       gtk_table_attach (GTK_TABLE (meet->table1),             \
-                                         label, 0, 1, i, i+1,                  \
-                                         GTK_FILL, GTK_FILL, 1, 1);            \
+                       gtk_grid_attach(GTK_GRID(meet->table1), label,          \
+                                       0, i, 1, 1);                            \
                }                                                               \
                else    {                                                       \
-                       gtk_table_attach (GTK_TABLE (meet->table2),             \
-                                         label, 0, 1, i, i+1,                  \
-                                         GTK_FILL, GTK_FILL, 1, 1);            \
+                       gtk_grid_attach(GTK_GRID(meet->table2), label,          \
+                                       0, i, 1, 1);                            \
                }                                                               \
                if(intable1)    {                                               \
-                       gtk_table_attach (GTK_TABLE (meet->table1),             \
-                                         do_space?s_hbox:widget, 1, 2, i, i+1, \
-                                         GTK_FILL|GTK_EXPAND, GTK_FILL, 1, 1); \
+                       gtk_grid_attach(GTK_GRID(meet->table1),                 \
+                                       do_space?s_hbox:widget, 1, i, 1, 1);    \
                }                                                               \
                else    {                                                       \
-                       gtk_table_attach (GTK_TABLE (meet->table2),             \
-                                         do_space?s_hbox:widget, 1, 2, i, i+1, \
-                                         GTK_FILL|GTK_EXPAND, GTK_FILL, 1, 1); \
+                       gtk_grid_attach(GTK_GRID(meet->table2),                 \
+                                       do_space?s_hbox:widget, 1, i, 1, 1);    \
                }                                                               \
                if (GTK_IS_LABEL(widget)) {                                     \
                        gtk_label_set_use_markup(GTK_LABEL (widget), TRUE);     \
-                       gtk_misc_set_alignment (GTK_MISC(widget),0, 0);         \
+                       gtk_label_set_xalign(GTK_LABEL(widget), 0.0);           \
+                       gtk_label_set_yalign(GTK_LABEL(widget), 0.0);           \
                        gtk_label_set_line_wrap(GTK_LABEL(widget), TRUE);       \
                }                                                               \
        } else {                                                                \
                g_free(tmpstr);                                                 \
                if(intable1)    {                                               \
-                       gtk_table_attach (GTK_TABLE (meet->table1),             \
-                                         do_space?s_hbox:widget, 0, 2, i, i+1, \
-                                         GTK_FILL|GTK_EXPAND, GTK_FILL, 1, 1); \
+                       gtk_grid_attach(GTK_GRID(meet->table1),                 \
+                                       do_space?s_hbox:widget, 0, i, 1, 1);    \
+                       gtk_widget_set_hexpand(do_space?s_hbox:widget, TRUE);   \
+                       gtk_widget_set_halign(do_space?s_hbox:widget,           \
+                                             GTK_ALIGN_FILL);                  \
                }                                                               \
                else    {                                                       \
-                       gtk_table_attach (GTK_TABLE (meet->table2),             \
-                                         do_space?s_hbox:widget, 0, 2, i, i+1, \
-                                         GTK_FILL|GTK_EXPAND, GTK_FILL, 1, 1); \
+                       gtk_grid_attach(GTK_GRID(meet->table2),                 \
+                                       do_space?s_hbox:widget, 0, i, 1, 1);    \
+                       gtk_widget_set_hexpand(do_space?s_hbox:widget, TRUE);   \
+                       gtk_widget_set_halign(do_space?s_hbox:widget,           \
+                                             GTK_ALIGN_FILL);                  \
                }                                                               \
        }                                                                       \
        i++;                                                                    \
@@ -253,6 +256,16 @@ static gint get_dtdate(const gchar *str, gint field)
 
 }
 
+static void set_watch_cursor(GdkWindow *window)
+{
+       cm_return_if_fail(window != NULL);
+
+       if (!watch_cursor)
+               watch_cursor = gdk_cursor_new_for_display(
+                               gdk_window_get_display(window), GDK_WATCH);
+}
+
+
 static gboolean add_btn_cb(GtkButton *widget, gpointer data)
 {
        VCalAttendee *attendee = (VCalAttendee *)data;
@@ -273,14 +286,14 @@ static gboolean remove_btn_cb(GtkButton *widget, gpointer data)
 
 VCalAttendee *attendee_add(VCalMeeting *meet, gchar *address, gchar *name, gchar *partstat, gchar *cutype, gboolean first)
 {
-       GtkWidget *att_hbox = gtk_hbox_new(FALSE, 6);
+       GtkWidget *att_hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 6);
        VCalAttendee *attendee  = g_new0(VCalAttendee, 1);
 
        attendee->address       = gtk_entry_new();
-       attendee->cutype        = gtk_combo_box_new_text();
+       attendee->cutype        = gtk_combo_box_text_new();
        attendee->avail_evtbox  = gtk_event_box_new();
-       attendee->avail_img     = gtk_image_new_from_stock
-                        (GTK_STOCK_DIALOG_WARNING, GTK_ICON_SIZE_SMALL_TOOLBAR);
+       attendee->avail_img     = gtk_image_new_from_icon_name
+                        ("dialog-warning", GTK_ICON_SIZE_SMALL_TOOLBAR);
 
        gtk_widget_show(attendee->address);
        gtk_widget_show(attendee->cutype);
@@ -304,10 +317,10 @@ VCalAttendee *attendee_add(VCalMeeting *meet, gchar *address, gchar *name, gchar
        if (partstat)
                attendee->status = g_strdup(partstat);
 
-       gtk_combo_box_append_text(GTK_COMBO_BOX(attendee->cutype), _("Individual"));
-       gtk_combo_box_append_text(GTK_COMBO_BOX(attendee->cutype), _("Group"));
-       gtk_combo_box_append_text(GTK_COMBO_BOX(attendee->cutype), _("Resource"));
-       gtk_combo_box_append_text(GTK_COMBO_BOX(attendee->cutype), _("Room"));
+       gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(attendee->cutype), _("Individual"));
+       gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(attendee->cutype), _("Group"));
+       gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(attendee->cutype), _("Resource"));
+       gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(attendee->cutype), _("Room"));
        
        gtk_combo_box_set_active(GTK_COMBO_BOX(attendee->cutype), 0);
        
@@ -384,24 +397,6 @@ static gchar *get_organizer_name(VCalMeeting *meet)
                return g_strdup("");
 }
 
-static void get_time_from_combo(GtkWidget *combo, int *h, int *m)
-{
-       gchar *tmp;
-       gchar **parts;
-
-       if (!h || !m) 
-               return;
-
-       tmp = gtk_editable_get_chars(GTK_EDITABLE(gtk_bin_get_child(GTK_BIN(combo))), 0, -1);
-       parts = g_strsplit(tmp, ":", 2);
-       if (parts[0] && parts[1] && *parts[0] && *parts[1]) {
-               *h = atoi(parts[0]);
-               *m = atoi(parts[1]);
-       }
-       g_strfreev(parts);
-       g_free(tmp);
-}
-
 static int get_current_gmt_offset(void)
 {
        time_t now = time(NULL);
@@ -465,9 +460,9 @@ static gchar *get_date(VCalMeeting *meet, int start)
        lt->tm_sec  = 0;
 
        if (start) {
-               get_time_from_combo(meet->start_time, &lt->tm_hour, &lt->tm_min);
+               gtkut_time_select_get_time(GTK_COMBO_BOX(meet->start_time), &lt->tm_hour, &lt->tm_min);
        } else {
-               get_time_from_combo(meet->end_time, &lt->tm_hour, &lt->tm_min);
+               gtkut_time_select_get_time(GTK_COMBO_BOX(meet->end_time), &lt->tm_hour, &lt->tm_min);
        }
 
        debug_print("%d %d %d, %d:%d\n", lt->tm_mday, lt->tm_mon, lt->tm_year, lt->tm_hour, lt->tm_min);
@@ -477,7 +472,7 @@ static gchar *get_date(VCalMeeting *meet, int start)
        debug_print("DST change offset to apply to time %d\n", dst_offset);
        t += dst_offset;
        debug_print("%s\n", ctime(&t));
-       return g_strdup(icaltime_as_ical_string(icaltime_from_timet(t, FALSE)));
+       return g_strdup(icaltime_as_ical_string(icaltime_from_timet_with_zone(t, FALSE, NULL)));
 }
 
 static gchar *get_location(VCalMeeting *meet)
@@ -529,20 +524,12 @@ static gboolean meeting_key_pressed(GtkWidget *widget,
 {
        VCalMeeting *meet = (VCalMeeting *)data;
        
-       if (event && event->keyval == GDK_Escape) {
+       if (event && event->keyval == GDK_KEY_Escape) {
                vcal_destroy(meet);
        }
        return FALSE;
 }
 
-static int get_list_item_num(int h, int m)
-{
-       if (m % 15 != 0)
-               return -1;
-
-       return (h*4 + m/15);
-}
-
 static void meeting_end_changed(GtkWidget *widget, gpointer data);
 
 static void meeting_start_changed(GtkWidget *widget, gpointer data)
@@ -552,9 +539,8 @@ static void meeting_start_changed(GtkWidget *widget, gpointer data)
        struct tm end_lt;
        time_t start_t, end_t;
        guint d, m, y;
-       int num = -1;
 
-       if (strlen(gtk_entry_get_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(meet->start_time))))) < 5)
+       if (!gtkut_time_select_get_time(GTK_COMBO_BOX(meet->start_time), &start_lt.tm_hour, &start_lt.tm_min))
                return;
        tzset();
 
@@ -571,7 +557,6 @@ static void meeting_start_changed(GtkWidget *widget, gpointer data)
 
        gtk_calendar_get_date(GTK_CALENDAR(meet->start_c), &y, &m, &d);
        start_lt.tm_mday = d; start_lt.tm_mon  = m; start_lt.tm_year = y - 1900;
-       get_time_from_combo(meet->start_time, &start_lt.tm_hour, &start_lt.tm_min);
 
        start_t = mktime(&start_lt);
        debug_print("start %s\n", ctime(&start_t));
@@ -579,7 +564,8 @@ static void meeting_start_changed(GtkWidget *widget, gpointer data)
        gtk_calendar_get_date(GTK_CALENDAR(meet->end_c), &y, &m, &d);
        end_lt.tm_mday = d; end_lt.tm_mon  = m; end_lt.tm_year = y - 1900;
 
-       get_time_from_combo(meet->end_time, &end_lt.tm_hour, &end_lt.tm_min);
+       gtkut_time_select_get_time(GTK_COMBO_BOX(meet->end_time), &end_lt.tm_hour, &end_lt.tm_min);
+
        end_t = mktime(&end_lt);
 
        debug_print("end   %s\n", ctime(&end_t));
@@ -606,19 +592,8 @@ static void meeting_start_changed(GtkWidget *widget, gpointer data)
                                end_lt.tm_mon,
                                end_lt.tm_year + 1900);
 
-       num = get_list_item_num(end_lt.tm_hour, end_lt.tm_min);
-       if (num > -1) {
-               gchar *time_text = g_strdup_printf("%02d:%02d", end_lt.tm_hour, end_lt.tm_min);
-               combobox_select_by_text(GTK_COMBO_BOX(meet->end_time), time_text);
-               g_free(time_text);
-       } else {
-               gchar *tmp = g_strdup_printf("%02d:%02d",
-                               end_lt.tm_hour, 
-                               end_lt.tm_min);
-               gtk_entry_set_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(meet->end_time))),
-                                  tmp);
-               g_free(tmp);
-       }
+       gtkut_time_select_select_by_time(GTK_COMBO_BOX(meet->end_time), end_lt.tm_hour, end_lt.tm_min);
+
        g_signal_handlers_unblock_by_func(gtk_bin_get_child(GTK_BIN(meet->end_time)), meeting_end_changed, meet);
        g_signal_handlers_unblock_by_func(meet->end_c, meeting_end_changed, meet);
 }
@@ -630,9 +605,8 @@ static void meeting_end_changed(GtkWidget *widget, gpointer data)
        struct tm end_lt;
        time_t start_t, end_t;
        guint d, m, y;
-       int num = -1;
 
-       if (strlen(gtk_entry_get_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(meet->end_time))))) < 5)
+       if (!gtkut_time_select_get_time(GTK_COMBO_BOX(meet->end_time), &end_lt.tm_hour, &end_lt.tm_min))
                return;
        start_t = time(NULL);
        end_t = time(NULL);
@@ -650,14 +624,13 @@ static void meeting_end_changed(GtkWidget *widget, gpointer data)
        
        gtk_calendar_get_date(GTK_CALENDAR(meet->start_c), &y, &m, &d);
        start_lt.tm_mday = d; start_lt.tm_mon  = m; start_lt.tm_year = y - 1900;
-       get_time_from_combo(meet->start_time, &start_lt.tm_hour, &start_lt.tm_min);
+       gtkut_time_select_get_time(GTK_COMBO_BOX(meet->start_time), &start_lt.tm_hour, &start_lt.tm_min);
 
        start_t = mktime(&start_lt);
        debug_print("start %s\n", ctime(&start_t));
 
        gtk_calendar_get_date(GTK_CALENDAR(meet->end_c), &y, &m, &d);
        end_lt.tm_mday = d; end_lt.tm_mon  = m; end_lt.tm_year = y - 1900;
-       get_time_from_combo(meet->end_time, &end_lt.tm_hour, &end_lt.tm_min);
 
        end_t = mktime(&end_lt);
 
@@ -687,19 +660,7 @@ static void meeting_end_changed(GtkWidget *widget, gpointer data)
                                start_lt.tm_mon,
                                start_lt.tm_year + 1900);
 
-       num = get_list_item_num(start_lt.tm_hour, start_lt.tm_min);
-       if (num > -1) {
-               gchar *time_text = g_strdup_printf("%02d:%02d", start_lt.tm_hour, start_lt.tm_min);
-               combobox_select_by_text(GTK_COMBO_BOX(meet->start_time), time_text);
-               g_free(time_text);
-       } else {
-               gchar *tmp = g_strdup_printf("%02d:%02d",
-                               start_lt.tm_hour, 
-                               start_lt.tm_min);
-               gtk_entry_set_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(meet->start_time))),
-                                  tmp);
-               g_free(tmp);
-       }
+       gtkut_time_select_select_by_time(GTK_COMBO_BOX(meet->start_time), start_lt.tm_hour, start_lt.tm_min);
 
        g_signal_handlers_unblock_by_func(gtk_bin_get_child(GTK_BIN(meet->start_time)), meeting_start_changed, meet);
        g_signal_handlers_unblock_by_func(meet->start_c, meeting_start_changed, meet);
@@ -707,12 +668,12 @@ static void meeting_end_changed(GtkWidget *widget, gpointer data)
 
 static void att_update_icon(VCalMeeting *meet, VCalAttendee *attendee, gint avail, gchar *text)
 {
-       const gchar *icon = GTK_STOCK_DIALOG_INFO;
+       const gchar *icon = "dialog-information";
 
        switch (avail) {
-               case 0:  icon = GTK_STOCK_DIALOG_WARNING;       break;
-               case 1:  icon = GTK_STOCK_DIALOG_INFO;          break;
-               default: icon = GTK_STOCK_DIALOG_QUESTION;      break;
+               case 0:  icon = "dialog-warning";       break;
+               case 1:  icon = "dialog-information";           break;
+               default: icon = "dialog-question";      break;
        }
        if (!gtk_entry_get_text(GTK_ENTRY(attendee->address)) 
         || strlen(gtk_entry_get_text(GTK_ENTRY(attendee->address)))==0) {
@@ -721,7 +682,7 @@ static void att_update_icon(VCalMeeting *meet, VCalAttendee *attendee, gint avai
                }
                CLAWS_SET_TIP(attendee->avail_evtbox, NULL);
        } else if (attendee->avail_img) {
-               gtk_image_set_from_stock
+               gtk_image_set_from_icon_name
                        (GTK_IMAGE(attendee->avail_img), 
                        icon, 
                        GTK_ICON_SIZE_SMALL_TOOLBAR);
@@ -776,7 +737,7 @@ static gchar *get_avail_msg(const gchar *unavailable_persons, gboolean multiple,
        gchar *msg, *intro = NULL, *outro = NULL, *before = NULL, *after = NULL;
 
        if (multiple)
-               intro = g_strdup(_("The following person(s) are busy at the time of your planned meeting:\n- "));
+               intro = g_strdup(_("The following people are busy at the time of your planned meeting:\n- "));
        else if (!strcmp(unavailable_persons, _("You")))
                intro = g_strdup(_("You are busy at the time of your planned meeting"));
        else
@@ -893,8 +854,8 @@ static gboolean find_availability(const gchar *dtstart, const gchar *dtend, GSLi
        found = FALSE;
        while (!found && offset >= -3600*6) {
                gboolean ok = TRUE;
-               struct icaltimetype new_start = icaltime_from_timet(icaltime_as_timet(start)+offset, FALSE);
-               struct icaltimetype new_end   = icaltime_from_timet(icaltime_as_timet(end)+offset, FALSE);
+               struct icaltimetype new_start = icaltime_from_timet_with_zone(icaltime_as_timet(start)+offset, FALSE, NULL);
+               struct icaltimetype new_end   = icaltime_from_timet_with_zone(icaltime_as_timet(end)+offset, FALSE, NULL);
                for (cur = attendees; cur; cur = cur->next) {
                        VCalAttendee *attendee = (VCalAttendee *)cur->data;
                        debug_print("trying %s - %s (offset %d)\n", 
@@ -919,8 +880,8 @@ static gboolean find_availability(const gchar *dtstart, const gchar *dtend, GSLi
        offset = 1800;
        while (!found && offset <= 3600*6) {
                gboolean ok = TRUE;
-               struct icaltimetype new_start = icaltime_from_timet(icaltime_as_timet(start)+offset, FALSE);
-               struct icaltimetype new_end   = icaltime_from_timet(icaltime_as_timet(end)+offset, FALSE);
+               struct icaltimetype new_start = icaltime_from_timet_with_zone(icaltime_as_timet(start)+offset, FALSE, NULL);
+               struct icaltimetype new_end   = icaltime_from_timet_with_zone(icaltime_as_timet(end)+offset, FALSE, NULL);
                for (cur = attendees; cur; cur = cur->next) {
                        VCalAttendee *attendee = (VCalAttendee *)cur->data;
                        debug_print("trying %s - %s (offset %d)\n", 
@@ -967,15 +928,16 @@ static gboolean find_availability(const gchar *dtstart, const gchar *dtend, GSLi
                msg = get_avail_msg(unavailable_persons, (total > 1), FALSE, offset_before, offset_after);
 
                val = alertpanel_full(_("Not everyone is available"), msg,
-                                       GTK_STOCK_CANCEL, _("Send anyway"), NULL, FALSE,
-                                       NULL, ALERT_QUESTION, G_ALERTDEFAULT);
+                                     NULL, _("_Cancel"), NULL, _("Send anyway"),
+                                     NULL, NULL, ALERTFOCUS_FIRST,
+                                     FALSE, NULL, ALERT_QUESTION);
                g_free(msg);
        }
        msg = get_avail_msg(unavailable_persons, TRUE, TRUE, offset_before, offset_after);
        g_free(unavailable_persons);
-       gtk_image_set_from_stock
+       gtk_image_set_from_icon_name
                (GTK_IMAGE(meet->total_avail_img), 
-               GTK_STOCK_DIALOG_WARNING
+               "dialog-warning"
                GTK_ICON_SIZE_SMALL_TOOLBAR);
        gtk_widget_show(meet->total_avail_img);
        gtk_label_set_text(GTK_LABEL(meet->total_avail_msg), _("Not everyone is available. "
@@ -1003,6 +965,7 @@ static gboolean check_attendees_availability(VCalMeeting *meet, gboolean tell_if
                                "internal.ifb", NULL);
        gboolean local_only = FALSE;
        GSList *attlist;
+       GdkWindow *gdkwin;
 
        if (vcalprefs.freebusy_get_url == NULL
        ||  *vcalprefs.freebusy_get_url == '\0') {
@@ -1018,6 +981,7 @@ static gboolean check_attendees_availability(VCalMeeting *meet, gboolean tell_if
                if (num_format > 2) {
                        g_warning("wrong format in %s!", real_url);
                        g_free(real_url);
+                       g_free(internal_ifb);
                        return FALSE;
                }
 
@@ -1057,8 +1021,11 @@ static gboolean check_attendees_availability(VCalMeeting *meet, gboolean tell_if
        gtk_widget_set_sensitive(meet->save_btn, FALSE);
        gtk_widget_set_sensitive(meet->avail_btn, FALSE);
 
-       if (meet->window->window)
-               gdk_window_set_cursor(meet->window->window, watch_cursor);
+       gdkwin = gtk_widget_get_window(meet->window);
+       if (gdkwin != NULL) {
+               set_watch_cursor(gdkwin);
+               gdk_window_set_cursor(gdkwin, watch_cursor);
+       }
 
        for (cur = attlist; cur && cur->data; cur = cur->next) {
                VCalAttendee *attendee = (VCalAttendee *)cur->data;
@@ -1112,7 +1079,9 @@ static gboolean check_attendees_availability(VCalMeeting *meet, gboolean tell_if
                        && strncmp(tmp, "https://", 8)
                        && strncmp(tmp, "webcal://", 9)
                        && strncmp(tmp, "webcals://", 10)
-                       && strncmp(tmp, "ftp://", 6))
+                       && strncmp(tmp, "ftp://", 6)
+                       && strncmp(tmp, "ftps://", 7)
+                       && strncmp(tmp, "sftp://", 7))
                                contents = file_read_to_str(tmp);
                        else {
                                gchar *label = g_strdup_printf(_("Fetching planning for %s..."), email);
@@ -1157,17 +1126,17 @@ static gboolean check_attendees_availability(VCalMeeting *meet, gboolean tell_if
                        if (for_send)
                                alertpanel_notice(_("Everyone is available."));
                        else if (!uncertain) {
-                               gtk_image_set_from_stock
+                               gtk_image_set_from_icon_name
                                        (GTK_IMAGE(meet->total_avail_img), 
-                                       GTK_STOCK_DIALOG_INFO
+                                       "dialog-information"
                                        GTK_ICON_SIZE_SMALL_TOOLBAR);
                                gtk_widget_show(meet->total_avail_img);
                                gtk_label_set_text(GTK_LABEL(meet->total_avail_msg), _("Everyone is available."));
                                CLAWS_SET_TIP(meet->total_avail_evtbox, NULL);
                        } else {
-                               gtk_image_set_from_stock
+                               gtk_image_set_from_icon_name
                                        (GTK_IMAGE(meet->total_avail_img), 
-                                       GTK_STOCK_DIALOG_QUESTION
+                                       "dialog-question"
                                        GTK_ICON_SIZE_SMALL_TOOLBAR);
                                gtk_widget_show(meet->total_avail_img);
                                gtk_label_set_text(GTK_LABEL(meet->total_avail_msg), _("Everyone is available."));
@@ -1183,8 +1152,9 @@ static gboolean check_attendees_availability(VCalMeeting *meet, gboolean tell_if
        }
        gtk_widget_set_sensitive(meet->save_btn, TRUE);
        gtk_widget_set_sensitive(meet->avail_btn, avail_btn_can_be_sensitive());
-       if (meet->window->window)
-               gdk_window_set_cursor(meet->window->window, NULL);
+
+       if (gdkwin != NULL)
+               gdk_window_set_cursor(gdkwin, NULL);
 
        if (!local_only)
                meet->attendees = g_slist_remove(meet->attendees, dummy_org);
@@ -1221,13 +1191,13 @@ static gboolean send_meeting_cb(GtkButton *widget, gpointer data)
        gchar *summary = NULL;
        gchar *description = NULL;
        VCalEvent *event = NULL;
-       gchar buf[256];
        GSList *cur;
        PrefsAccount *account = NULL;
        gboolean res = FALSE;
        gboolean found_att = FALSE;
-       Folder *folder = folder_find_from_name ("vCalendar", vcal_folder_get_class());
+       Folder *folder = folder_find_from_name (PLUGIN_NAME, vcal_folder_get_class());
        gboolean redisp = FALSE;
+       GdkWindow *gdkwin;
 
        if (meet->uid == NULL && meet->visible && 
            !check_attendees_availability(meet, FALSE, TRUE)) {
@@ -1238,13 +1208,17 @@ static gboolean send_meeting_cb(GtkButton *widget, gpointer data)
                MainWindow *mainwin = mainwindow_get_mainwindow();
                if (mainwin->summaryview->folder_item == folder->inbox) {
                        redisp = TRUE;
-                       summary_show(mainwin->summaryview, NULL);
+                       summary_show(mainwin->summaryview, NULL, FALSE);
                }
        }
        gtk_widget_set_sensitive(meet->save_btn, FALSE);
        gtk_widget_set_sensitive(meet->avail_btn, FALSE);
-       if (meet->window->window)
-               gdk_window_set_cursor(meet->window->window, watch_cursor);
+
+       gdkwin = gtk_widget_get_window(meet->window);
+       if (gdkwin != NULL) {
+               set_watch_cursor(gdkwin);
+               gdk_window_set_cursor(gdkwin, watch_cursor);
+       }
 
        organizer       = get_organizer(meet);
        account         = account_find_from_address(organizer, FALSE);
@@ -1257,22 +1231,10 @@ static gboolean send_meeting_cb(GtkButton *widget, gpointer data)
 
        organizer_name  = get_organizer_name(meet);
 
-       if (account->set_domain && account->domain) {
-               g_snprintf(buf, sizeof(buf), "%s", account->domain); 
-       } else if (!strncmp(get_domain_name(), "localhost", strlen("localhost"))) {
-               g_snprintf(buf, sizeof(buf), "%s", 
-                       strchr(account->address, '@') ?
-                               strchr(account->address, '@')+1 :
-                               account->address);
-       } else {
-               g_snprintf(buf, sizeof(buf), "%s", "");
-       }
-       generate_msgid(buf, 255, account->address);
-
        if (meet->uid) {
                uid     = g_strdup(meet->uid);
        } else {
-               uid     = g_strdup(buf);
+               uid     = prefs_account_generate_msgid(account);
        }
 
        dtstart         = get_date(meet, TRUE);
@@ -1344,8 +1306,8 @@ static gboolean send_meeting_cb(GtkButton *widget, gpointer data)
 
        gtk_widget_set_sensitive(meet->save_btn, TRUE);
        gtk_widget_set_sensitive(meet->avail_btn, avail_btn_can_be_sensitive());
-       if (meet->window->window)
-               gdk_window_set_cursor(meet->window->window, NULL);
+       if (gdkwin != NULL)
+               gdk_window_set_cursor(gdkwin, NULL);
 
        if (res) {
                vcal_destroy(meet);
@@ -1359,25 +1321,12 @@ static gboolean send_meeting_cb(GtkButton *widget, gpointer data)
 
        if (folder && redisp) {
                MainWindow *mainwin = mainwindow_get_mainwindow();
-               summary_show(mainwin->summaryview, folder->inbox);
+               summary_show(mainwin->summaryview, folder->inbox, FALSE);
        }
 
        return res;
 }
 
-static GList *get_predefined_times(void)
-{
-       int h,m;
-       GList *times = NULL;
-       for (h = 0; h < 24; h++) {
-               for (m = 0; m < 60; m += 15) {
-                       gchar *tmp = g_strdup_printf("%02d:%02d", h, m);
-                       times = g_list_append(times, tmp);
-               }
-       }
-       return times;
-}
-
 static VCalMeeting *vcal_meeting_create_real(VCalEvent *event, gboolean visible)
 {
        VCalMeeting *meet = g_new0(VCalMeeting, 1);
@@ -1386,63 +1335,33 @@ static VCalMeeting *vcal_meeting_create_real(VCalEvent *event, gboolean visible)
        gchar *s = NULL;
        int i = 0, num = 0;
        GtkWidget *scrolledwin;
-       GList *times = NULL;
        GList *accounts;
-       gchar *time_text = NULL;
 #ifdef GENERIC_UMPC
        GtkWidget *notebook;
        GtkWidget *maemo_vbox0;
 #endif
 
-       if (!watch_cursor)
-               watch_cursor = gdk_cursor_new(GDK_WATCH);
-
        meet->visible = visible;
 
        meet->window            = gtkut_window_new(GTK_WINDOW_TOPLEVEL, "vcal_meeting_gtk");
 #ifndef GENERIC_UMPC
-       meet->table             = gtk_table_new(7, 2, FALSE);
+       meet->table             = gtk_grid_new();
 #else
-       meet->table1            = gtk_table_new(4, 2, FALSE);
-       meet->table2            = gtk_table_new(2, 2, FALSE);
+       meet->table1            = gtk_grid_new();
+       meet->table2            = gtk_grid_new();
 #endif
-       meet->who               = gtk_combo_box_new_text();
+       meet->who               = gtk_combo_box_text_new();
        
        meet->start_c           = gtk_calendar_new();
        meet->end_c             = gtk_calendar_new();
 
        meet->avail_evtbox  = gtk_event_box_new();
-       meet->avail_img = gtk_image_new_from_stock
-                        (GTK_STOCK_DIALOG_WARNING, GTK_ICON_SIZE_SMALL_TOOLBAR);
-
-       times = get_predefined_times();
+       meet->avail_img = gtk_image_new_from_icon_name
+                        ("dialog-warning", GTK_ICON_SIZE_SMALL_TOOLBAR);
 
-#if !GTK_CHECK_VERSION(2, 24, 0)
-       meet->start_time = gtk_combo_box_entry_new_text();
-#else
-       meet->start_time = gtk_combo_box_text_new_with_entry();
-#endif
-       gtk_combo_box_set_active(GTK_COMBO_BOX(meet->start_time), -1);
-#if !GTK_CHECK_VERSION(2, 24, 0)       
-       combobox_set_popdown_strings(GTK_COMBO_BOX(meet->start_time), times);
-#else  
-       combobox_set_popdown_strings(GTK_COMBO_BOX_TEXT(meet->start_time), times);
-#endif
+       meet->start_time = gtkut_time_select_combo_new();
        
-#if !GTK_CHECK_VERSION(2, 24, 0)
-       meet->end_time = gtk_combo_box_entry_new_text();
-#else
-       meet->end_time = gtk_combo_box_text_new_with_entry();
-#endif
-       gtk_combo_box_set_active(GTK_COMBO_BOX(meet->end_time), -1);
-#if !GTK_CHECK_VERSION(2, 24, 0)       
-       combobox_set_popdown_strings(GTK_COMBO_BOX(meet->end_time), times);
-#else  
-       combobox_set_popdown_strings(GTK_COMBO_BOX_TEXT(meet->end_time), times);
-#endif
-
-       list_free_strings(times);
-       g_list_free(times);
+       meet->end_time = gtkut_time_select_combo_new();
 
        meet->location          = gtk_entry_new();
        meet->summary           = gtk_entry_new();
@@ -1475,8 +1394,8 @@ static VCalMeeting *vcal_meeting_create_real(VCalEvent *event, gboolean visible)
        meet->avail_btn         = gtk_button_new_with_label(_("Check availability"));
 
        meet->total_avail_evtbox  = gtk_event_box_new();
-       meet->total_avail_img   = gtk_image_new_from_stock
-                        (GTK_STOCK_DIALOG_WARNING, GTK_ICON_SIZE_SMALL_TOOLBAR);
+       meet->total_avail_img   = gtk_image_new_from_icon_name
+                        ("dialog-warning", GTK_ICON_SIZE_SMALL_TOOLBAR);
        meet->total_avail_msg = gtk_label_new("");
        
        gtk_widget_set_size_request(meet->total_avail_evtbox, 18, 16);
@@ -1508,9 +1427,7 @@ static VCalMeeting *vcal_meeting_create_real(VCalEvent *event, gboolean visible)
                gtk_calendar_select_month(GTK_CALENDAR(meet->start_c),
                                        lt->tm_mon, lt->tm_year + 1900);
        
-               time_text = g_strdup_printf("%02d:%02d", lt->tm_hour, 0);
-               combobox_select_by_text(GTK_COMBO_BOX(meet->start_time), time_text);
-               g_free(time_text);
+               gtkut_time_select_select_by_time(GTK_COMBO_BOX(meet->start_time), lt->tm_hour, 0);
 
                t += 3600;
                lt = localtime_r(&t, &buft2);
@@ -1520,10 +1437,7 @@ static VCalMeeting *vcal_meeting_create_real(VCalEvent *event, gboolean visible)
                gtk_calendar_select_month(GTK_CALENDAR(meet->end_c),
                                        lt->tm_mon, lt->tm_year + 1900);
 
-               time_text = g_strdup_printf("%02d:%02d", lt->tm_hour, 0);
-               combobox_select_by_text(GTK_COMBO_BOX(meet->end_time), time_text);
-               g_free(time_text);
-
+               gtkut_time_select_select_by_time(GTK_COMBO_BOX(meet->end_time), lt->tm_hour, 0);
        } else {
                gtk_calendar_select_day(GTK_CALENDAR(meet->start_c),
                                        get_dtdate(event->dtstart, DAY));
@@ -1537,37 +1451,13 @@ static VCalMeeting *vcal_meeting_create_real(VCalEvent *event, gboolean visible)
                                        get_dtdate(event->dtend, MONTH)-1,
                                        get_dtdate(event->dtend, YEAR));
 
-               num = get_list_item_num(get_dtdate(event->dtstart, HOUR), 
-                                       get_dtdate(event->dtstart, MINUTE));
-               if (num > -1) {
-                       time_text = g_strdup_printf("%02d:%02d", get_dtdate(event->dtstart, HOUR), 
-                                                                get_dtdate(event->dtstart, MINUTE));
-                       combobox_select_by_text(GTK_COMBO_BOX(meet->start_time), time_text);
-                       g_free(time_text);
-               } else {
-                       gchar *tmp = g_strdup_printf("%02d:%02d",
+               gtkut_time_select_select_by_time(GTK_COMBO_BOX(meet->start_time),
                                        get_dtdate(event->dtstart, HOUR), 
                                        get_dtdate(event->dtstart, MINUTE));
-                       gtk_entry_set_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(meet->start_time))),
-                                          tmp);
-                       g_free(tmp);
-               }
 
-               num = get_list_item_num(get_dtdate(event->dtend, HOUR), 
-                                       get_dtdate(event->dtend, MINUTE));
-               if (num > -1) {
-                       time_text = g_strdup_printf("%02d:%02d", get_dtdate(event->dtend, HOUR), 
-                                                                get_dtdate(event->dtend, MINUTE));
-                       combobox_select_by_text(GTK_COMBO_BOX(meet->end_time), time_text);
-                       g_free(time_text);
-               } else {
-                       gchar *tmp = g_strdup_printf("%02d:%02d",
+               gtkut_time_select_select_by_time(GTK_COMBO_BOX(meet->end_time),
                                        get_dtdate(event->dtend, HOUR), 
                                        get_dtdate(event->dtend, MINUTE));
-                       gtk_entry_set_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(meet->end_time))),
-                                          tmp);
-                       g_free(tmp);
-               }
        }
 
        g_signal_connect(G_OBJECT(meet->start_c), "day-selected",
@@ -1592,17 +1482,17 @@ static VCalMeeting *vcal_meeting_create_real(VCalEvent *event, gboolean visible)
        gtk_widget_set_size_request(meet->end_time, 120, -1);
 #endif
        
-       date_hbox = gtk_hbox_new(FALSE, 6);
-       date_vbox = gtk_vbox_new(FALSE, 6);
-       hbox = gtk_hbox_new(FALSE, 6);
+       date_hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 6);
+       date_vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 6);
+       hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 6);
        label = gtk_label_new(g_strconcat("<b>",_("Starts at:"),"</b> ",NULL));
-       gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
+       gtk_label_set_xalign(GTK_LABEL(label), 0.0);
        gtk_label_set_use_markup(GTK_LABEL(label), TRUE);
        
        gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
        gtk_box_pack_start(GTK_BOX(hbox), meet->start_time, FALSE, FALSE, 0);
        label = gtk_label_new(g_strconcat("<b> ",_("on:"),"</b>",NULL));
-       gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
+       gtk_label_set_xalign(GTK_LABEL(label), 0.0);
        gtk_label_set_use_markup(GTK_LABEL(label), TRUE);
        gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
        gtk_box_pack_start(GTK_BOX(date_vbox), hbox, FALSE, FALSE, 0);
@@ -1614,26 +1504,26 @@ static VCalMeeting *vcal_meeting_create_real(VCalEvent *event, gboolean visible)
 #else
        label = gtk_label_new(""); 
 #endif
-       gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
+       gtk_label_set_xalign(GTK_LABEL(label), 0.0);
        gtk_box_pack_start(GTK_BOX(date_hbox), label, TRUE, TRUE, 0);
 
-       date_vbox = gtk_vbox_new(FALSE, 6);
-       hbox = gtk_hbox_new(FALSE, 6);
+       date_vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 6);
+       hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 6);
        label = gtk_label_new(g_strconcat("<b>",_("Ends at:"),"</b> ", NULL));
-       gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
+       gtk_label_set_xalign(GTK_LABEL(label), 0.0);
        gtk_label_set_use_markup(GTK_LABEL(label), TRUE);
        
        gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
        gtk_box_pack_start(GTK_BOX(hbox), meet->end_time, FALSE, FALSE, 0);
        label = gtk_label_new(g_strconcat("<b> ",_("on:"),"</b>",NULL));
-       gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
+       gtk_label_set_xalign(GTK_LABEL(label), 0.0);
        gtk_label_set_use_markup(GTK_LABEL(label), TRUE);
        gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
        gtk_box_pack_start(GTK_BOX(date_vbox), hbox, FALSE, FALSE, 0);
        gtk_box_pack_start(GTK_BOX(date_vbox), meet->end_c, FALSE, FALSE, 0);
        gtk_box_pack_start(GTK_BOX(date_hbox), date_vbox, FALSE, FALSE, 0);
 
-       meet->attendees_vbox = gtk_vbox_new(FALSE, 6);
+       meet->attendees_vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 6);
        gtk_widget_show_all(meet->attendees_vbox);
        if (!event) {
                attendee_add(meet, NULL, NULL, NULL, NULL, TRUE);
@@ -1694,19 +1584,19 @@ static VCalMeeting *vcal_meeting_create_real(VCalEvent *event, gboolean visible)
                        s = g_strdup_printf("%s: %s",
                                               ac->account_name, ac->address);
 
-               gtk_combo_box_append_text(GTK_COMBO_BOX(meet->who), s);
+               gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(meet->who), s);
                g_free(s);
                i++;
        }
        gtk_combo_box_set_active(GTK_COMBO_BOX(meet->who), num);
        
-       save_hbox = gtk_hbox_new(FALSE, 6);
+       save_hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 6);
        gtk_box_pack_start(GTK_BOX(save_hbox), meet->save_btn, FALSE, FALSE, 0);
        gtk_box_pack_start(GTK_BOX(save_hbox), meet->avail_btn, FALSE, FALSE, 0);
        gtk_box_pack_start(GTK_BOX(save_hbox), meet->total_avail_evtbox, FALSE, FALSE, 0);
        gtk_box_pack_start(GTK_BOX(save_hbox), meet->total_avail_msg, FALSE, FALSE, 0);
        
-       hbox = gtk_hbox_new(FALSE, 6);
+       hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 6);
        gtk_box_pack_start(GTK_BOX(hbox), meet->avail_evtbox, FALSE, FALSE, 0);
        gtk_box_pack_start(GTK_BOX(hbox), meet->who, TRUE, TRUE, 0);
 
@@ -1744,7 +1634,7 @@ static VCalMeeting *vcal_meeting_create_real(VCalEvent *event, gboolean visible)
                        gtk_label_new_with_mnemonic(_("Time:")));
        gtk_widget_show (notebook);
        
-       maemo_vbox0 = gtk_vbox_new(FALSE, 3);
+       maemo_vbox0 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 3);
        gtk_box_pack_start(GTK_BOX(maemo_vbox0), notebook, TRUE, TRUE, 0);
        gtk_box_pack_start(GTK_BOX(maemo_vbox0), save_hbox, FALSE, FALSE, 0);
        
@@ -1763,6 +1653,7 @@ static VCalMeeting *vcal_meeting_create_real(VCalEvent *event, gboolean visible)
                gtk_widget_hide(meet->total_avail_img);
                gtk_widget_set_sensitive(meet->avail_btn, avail_btn_can_be_sensitive());
        }
+
        return meet;
 }
 
@@ -1774,7 +1665,7 @@ VCalMeeting *vcal_meeting_create(VCalEvent *event)
 VCalMeeting *vcal_meeting_create_with_start(VCalEvent *event, struct tm *sdate)
 {
        VCalMeeting *meet = vcal_meeting_create(event);
-       int num = -1;
+
        gtk_calendar_select_day(GTK_CALENDAR(meet->start_c),
                                sdate->tm_mday);
        gtk_calendar_select_day(GTK_CALENDAR(meet->end_c),
@@ -1786,22 +1677,13 @@ VCalMeeting *vcal_meeting_create_with_start(VCalEvent *event, struct tm *sdate)
                                sdate->tm_mon, sdate->tm_year+1900);
 
        if (sdate->tm_hour != 0) {
-               num = get_list_item_num(sdate->tm_hour, 0);
-               if (num > -1) {
-                       gchar *time_text = g_strdup_printf("%02d:%02d", sdate->tm_hour, 0);
-                       combobox_select_by_text(GTK_COMBO_BOX(meet->start_time), time_text);
-                       g_free(time_text);
-               } 
+               gtkut_time_select_select_by_time(GTK_COMBO_BOX(meet->start_time), sdate->tm_hour, 0);
+
                if (sdate->tm_hour < 23) {
-                       num = get_list_item_num(sdate->tm_hour+1, 0);
-                       if (num > -1) {
-                               gchar *time_text = g_strdup_printf("%02d:%02d", sdate->tm_hour+1, 0);
-                               combobox_select_by_text(GTK_COMBO_BOX(meet->end_time), time_text);
-                               g_free(time_text);
-                       } 
+                       gtkut_time_select_select_by_time(GTK_COMBO_BOX(meet->end_time), sdate->tm_hour+1, 0);
                } else {
                        struct tm tm_tomorrow;
-                       gchar *time_text;
+
                        tm_tomorrow.tm_mday = sdate->tm_mday;
                        tm_tomorrow.tm_mon = sdate->tm_mon;
                        tm_tomorrow.tm_wday = sdate->tm_wday;
@@ -1813,9 +1695,7 @@ VCalMeeting *vcal_meeting_create_with_start(VCalEvent *event, struct tm *sdate)
                        gtk_calendar_select_month(GTK_CALENDAR(meet->end_c),
                                                tm_tomorrow.tm_mon, tm_tomorrow.tm_year);
                        
-                       time_text = g_strdup_printf("%02d:%02d", 0, 0);
-                       combobox_select_by_text(GTK_COMBO_BOX(meet->end_time), time_text);
-                       g_free(time_text);
+                       gtkut_time_select_select_by_time(GTK_COMBO_BOX(meet->end_time), 0, 0);
                }
        }
        return meet;
@@ -1910,8 +1790,8 @@ gboolean vcal_meeting_alert_check(gpointer data)
                                                 postpone_min > 1 ? 2:1), 
                                                 postpone_min);
                        aval = alertpanel_full(title, message,
-                                       label, GTK_STOCK_OK, NULL, FALSE,
-                                       NULL, ALERT_NOTICE, G_ALERTDEFAULT);
+                                       NULL, label, NULL, _("_OK"), NULL, NULL,
+                                       ALERTFOCUS_FIRST, FALSE, NULL, ALERT_NOTICE);
                        g_free(label);
 
                        g_free(title);
@@ -1944,8 +1824,7 @@ void multisync_export(void)
                                "multisync", NULL);
        GSList *files = NULL;
        GSList *cur = NULL;
-       gchar *file = NULL;
-       gchar *tmp = NULL;
+       gchar *backup_file;
        gint i = 0;
        icalcomponent *calendar = NULL;
        FILE *fp;
@@ -1961,9 +1840,10 @@ void multisync_export(void)
        
        list = vcal_folder_get_waiting_events();
        for (cur = list; cur; cur = cur->next) {
+               gchar *tmp = NULL;
                VCalEvent *event = (VCalEvent *)cur->data;
-               file = g_strdup_printf("multisync%lld-%d",
-                               (long long)time(NULL), i);
+               gchar *file = g_strdup_printf("multisync%"CM_TIME_FORMAT"-%d",
+                               time(NULL), i);
 
                i++;
 
@@ -1974,11 +1854,11 @@ void multisync_export(void)
                            icalproperty_new_prodid(
                                 "-//Claws Mail//NONSGML Claws Mail Calendar//EN"),
                            icalproperty_new_calscale("GREGORIAN"),
-                           0
+                           (void*)0
                    );  
                vcal_manager_event_dump(event, FALSE, FALSE, calendar, FALSE);
                tmp = g_strconcat(path, G_DIR_SEPARATOR_S, file, NULL);
-               str_write_to_file(icalcomponent_as_ical_string(calendar), tmp);
+               str_write_to_file(icalcomponent_as_ical_string(calendar), tmp, TRUE);
                g_free(tmp);
                files = g_slist_append(files, file);
                vcal_manager_free_event(event);
@@ -1987,21 +1867,21 @@ void multisync_export(void)
 
        g_slist_free(list);
        
-       file = g_strconcat(path, G_DIR_SEPARATOR_S, "backup_entries", NULL);
-       fp = g_fopen(file, "wb");
-       g_free(file);
+       backup_file = g_strconcat(path, G_DIR_SEPARATOR_S, "backup_entries", NULL);
+       fp = claws_fopen(backup_file, "wb");
        if (fp) {
                for (cur = files; cur; cur = cur->next) {
-                       file = (char *)cur->data;
+                       gchar * file = (char *)cur->data;
                        if (fprintf(fp, "1 1 %s\n", file) < 0)
-                               perror(file);
+                               FILE_OP_ERROR(file, "fprintf");
                        g_free(file);
                }
-               if (fclose(fp) == EOF)
-                       perror(file);
+               if (claws_safe_fclose(fp) == EOF)
+                       FILE_OP_ERROR(backup_file, "claws_fclose");
        } else {
-               perror(file);
+               FILE_OP_ERROR(backup_file, "claws_fopen");
        }
+       g_free(backup_file);
        g_free(path);
        g_slist_free(files);
 }
@@ -2014,7 +1894,7 @@ gboolean vcal_meeting_export_calendar(const gchar *path,
        GSList *subs = NULL;
        GSList *cur;
        icalcomponent *calendar = NULL;
-       gchar *file = NULL;
+       gchar *file;
        gchar *tmpfile = get_tmp_file();
        gchar *internal_file = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S,
                                "vcalendar", G_DIR_SEPARATOR_S, 
@@ -2034,11 +1914,13 @@ gboolean vcal_meeting_export_calendar(const gchar *path,
                if (!automatic) {
                        alertpanel_full(_("Empty calendar"),
                                        _("There is nothing to export."),
-                                       GTK_STOCK_OK, NULL, NULL, FALSE,
-                                       NULL, ALERT_NOTICE, G_ALERTDEFAULT);
+                                       NULL, _("_OK"), NULL, NULL, NULL, NULL,
+                                       ALERTFOCUS_FIRST, FALSE, NULL, ALERT_NOTICE);
+                       g_free(tmpfile);
+                       g_free(internal_file);
                        return FALSE;
                } else {
-                       str_write_to_file("", tmpfile);
+                       str_write_to_file("", tmpfile, TRUE);
                        goto putfile;
                }
        }
@@ -2050,7 +1932,7 @@ gboolean vcal_meeting_export_calendar(const gchar *path,
                    icalproperty_new_prodid(
                         "-//Claws Mail//NONSGML Claws Mail Calendar//EN"),
                    icalproperty_new_calscale("GREGORIAN"),
-                   0
+                   (void*)0
             );         
 
        for (cur = list; cur; cur = cur->next) {
@@ -2059,11 +1941,9 @@ gboolean vcal_meeting_export_calendar(const gchar *path,
                vcal_manager_free_event(event);
        }
 
-       if (str_write_to_file(icalcomponent_as_ical_string(calendar), internal_file) < 0) {
+       if (str_write_to_file(icalcomponent_as_ical_string(calendar), internal_file, TRUE) < 0) {
                g_warning("can't export internal cal");
        }
-       
-       g_free(internal_file);
 
        for (cur = subs; cur; cur = cur->next) {
                /* Not to be freed */
@@ -2072,7 +1952,7 @@ gboolean vcal_meeting_export_calendar(const gchar *path,
        }
 
        if (vcalprefs.export_enable || path == NULL) {
-               if (str_write_to_file(icalcomponent_as_ical_string(calendar), tmpfile) < 0) {
+               if (str_write_to_file(icalcomponent_as_ical_string(calendar), tmpfile, TRUE) < 0) {
                        alertpanel_error(_("Could not export the calendar."));
                        g_free(tmpfile);
                        icalcomponent_free(calendar);
@@ -2086,53 +1966,53 @@ gboolean vcal_meeting_export_calendar(const gchar *path,
        icalcomponent_free(calendar);
        
 putfile:
+       g_free(internal_file);
        g_slist_free(list);
        g_slist_free(subs);
 
-       if (!path && !automatic)
-               file = filesel_select_file_save(_("Export calendar to ICS"), NULL);
-       else
-               file = g_strdup(path);
-
        if (automatic && (!path || strlen(path) == 0 || !vcalprefs.export_enable)) {
                g_free(tmpfile);
-               g_free(file);
                return TRUE;
        }
 
+       if (!path && !automatic)
+               file = filesel_select_file_save(_("Export calendar to ICS"), NULL);
+       else
+               file = g_strdup(path);
+
        if (file 
        && strncmp(file, "http://", 7) 
        && strncmp(file, "https://", 8)
        && strncmp(file, "webcal://", 9)
        && strncmp(file, "webcals://", 10)
        && strncmp(file, "ftp://", 6)) {
-               gchar *afile = NULL;
+               gchar *afile;
                if (file[0] != G_DIR_SEPARATOR)
-                       afile=g_strdup_printf("%s%s%s", get_home_dir(), 
+                       afile = g_strdup_printf("%s%s%s", get_home_dir(), 
                                        G_DIR_SEPARATOR_S, file);
                else
-                       afile=g_strdup(file);
+                       afile = g_strdup(file);
                if (move_file(tmpfile, afile, TRUE) != 0) {
                        log_error(LOG_PROTOCOL, _("Couldn't export calendar to '%s'\n"),
                                afile);
                        res = FALSE;
                }
                g_free(afile);
-               g_free(file);
        } else if (file) {
-               FILE *fp = g_fopen(tmpfile, "rb");
+               FILE *fp = claws_fopen(tmpfile, "rb");
                if (!strncmp(file, "webcal", 6)) {
                        gchar *tmp = g_strdup_printf("http%s", file+6);
                        g_free(file);
                        file = tmp;
                }
                if (fp) {
-                       res = vcal_curl_put(file, fp, filesize, user, pass);
-                       fclose(fp);
+                       res = vcal_curl_put(file, fp, filesize, user, (pass != NULL ? pass : ""));
+                       claws_fclose(fp);
                }
-               g_free(file);
        }
        g_free(tmpfile);
+       if (file)
+               g_free(file);
        return res;
 }
 
@@ -2142,7 +2022,7 @@ gboolean vcal_meeting_export_freebusy(const gchar *path, const gchar *user,
        GSList *list = vcal_folder_get_waiting_events();
        GSList *cur;
        icalcomponent *calendar = NULL, *timezone = NULL, *tzc = NULL, *vfreebusy = NULL;
-       gchar *file = NULL;
+       gchar *file;
        gchar *tmpfile = get_tmp_file();
        gchar *internal_file = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S,
                                "vcalendar", G_DIR_SEPARATOR_S, 
@@ -2162,7 +2042,7 @@ gboolean vcal_meeting_export_freebusy(const gchar *path, const gchar *user,
                    icalproperty_new_prodid(
                         "-//Claws Mail//NONSGML Claws Mail Calendar//EN"),
                    icalproperty_new_calscale("GREGORIAN"),
-                   0
+                   (void*)0
             );         
 
        timezone = icalcomponent_new(ICAL_VTIMEZONE_COMPONENT);
@@ -2181,12 +2061,12 @@ gboolean vcal_meeting_export_freebusy(const gchar *path, const gchar *user,
        icalcomponent_add_property(tzc,
                icalproperty_new_tzname("Greenwich meridian time"));
 
-        icalcomponent_add_component(timezone, tzc);
+       icalcomponent_add_component(timezone, tzc);
 
        icalcomponent_add_component(calendar, timezone);
 
-       itt_start = icaltime_from_timet(whole_start, FALSE);
-       itt_end = icaltime_from_timet(whole_end, FALSE);
+       itt_start = icaltime_from_timet_with_zone(whole_start, FALSE, NULL);
+       itt_end = icaltime_from_timet_with_zone(whole_end, FALSE, NULL);
        itt_start.second = itt_start.minute = itt_start.hour = 0;
        itt_end.second = 59; itt_end.minute = 59; itt_end.hour = 23;
 
@@ -2196,7 +2076,7 @@ gboolean vcal_meeting_export_freebusy(const gchar *path, const gchar *user,
                 ICAL_VFREEBUSY_COMPONENT,
                icalproperty_vanew_dtstart(itt_start, 0),
                icalproperty_vanew_dtend(itt_end, 0),
-                0
+                (void*)0
                 );
 
        debug_print("DTSTART:%s\nDTEND:%s\n",
@@ -2221,14 +2101,14 @@ gboolean vcal_meeting_export_freebusy(const gchar *path, const gchar *user,
 
        icalcomponent_add_component(calendar, vfreebusy);
        
-       if (str_write_to_file(icalcomponent_as_ical_string(calendar), internal_file) < 0) {
+       if (str_write_to_file(icalcomponent_as_ical_string(calendar), internal_file, TRUE) < 0) {
                g_warning("can't export freebusy");
        }
        
        g_free(internal_file);
 
        if (vcalprefs.export_freebusy_enable) {
-               if (str_write_to_file(icalcomponent_as_ical_string(calendar), tmpfile) < 0) {
+               if (str_write_to_file(icalcomponent_as_ical_string(calendar), tmpfile, TRUE) < 0) {
                        alertpanel_error(_("Could not export the freebusy info."));
                        g_free(tmpfile);
                        icalcomponent_free(calendar);
@@ -2245,8 +2125,8 @@ gboolean vcal_meeting_export_freebusy(const gchar *path, const gchar *user,
                g_free(tmpfile);
                return TRUE;
        }
-       file = g_strdup(path);
 
+       file = g_strdup(path);
 
        if (file 
        && strncmp(file, "http://", 7) 
@@ -2254,32 +2134,32 @@ gboolean vcal_meeting_export_freebusy(const gchar *path, const gchar *user,
        && strncmp(file, "webcal://", 9)
        && strncmp(file, "webcals://", 10)
        && strncmp(file, "ftp://", 6)) {
-               gchar *afile = NULL;
+               gchar *afile;
                if (file[0] != G_DIR_SEPARATOR)
-                       afile=g_strdup_printf("%s%s%s", get_home_dir(), 
+                       afile = g_strdup_printf("%s%s%s", get_home_dir(), 
                                        G_DIR_SEPARATOR_S, file);
                else
-                       afile=g_strdup(file);
+                       afile = g_strdup(file);
                if (move_file(tmpfile, file, TRUE) != 0) {
                        log_error(LOG_PROTOCOL, _("Couldn't export free/busy to '%s'\n"),
                                afile);
                        res = FALSE;
                }
                g_free(afile);
-               g_free(file);
        } else if (file) {
-               FILE *fp = g_fopen(tmpfile, "rb");
+               FILE *fp = claws_fopen(tmpfile, "rb");
                if (!strncmp(file, "webcal", 6)) {
                        gchar *tmp = g_strdup_printf("http%s", file+6);
                        g_free(file);
                        file = tmp;
                }
                if (fp) {
-                       res = vcal_curl_put(file, fp, filesize, user, pass);
-                       fclose(fp);
+                       res = vcal_curl_put(file, fp, filesize, user, (pass != NULL ? pass : ""));
+                       claws_fclose(fp);
                }
-               g_free(file);
        }
        g_free(tmpfile);
+       if (file)
+               g_free(file);
        return res;
 }