2 * Claws Mail -- a GTK+ based, lightweight, and fast e-mail client
3 * Copyright (C) 1999-2022 the Claws Mail team and Colin Leroy
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 3 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
22 #include "claws-features.h"
27 #include <glib/gi18n.h>
29 #include <libical/ical.h>
37 #include "folder_item_prefs.h"
39 #include "file-utils.h"
41 #include "vcalendar.h"
42 #include "vcal_manager.h"
43 #include "vcal_folder.h"
44 #include "vcal_meeting_gtk.h"
45 #include "vcal_interface.h"
46 #include "prefs_account.h"
47 #include "prefs_common.h"
53 #include "alertpanel.h"
54 #include "vcal_prefs.h"
55 #include "statusbar.h"
59 MimeViewerFactory vcal_viewer_factory
;
61 static void create_meeting_from_message_cb_ui(GtkAction
*action
, gpointer data
);
63 static GdkColor uri_color
= {
72 MimeViewer mimeviewer
;
79 GtkWidget
*scrolledwin
;
87 GtkWidget
*description
;
95 GtkWidget
*unavail_box
;
98 static GtkActionEntry vcalendar_main_menu
[] = {{
99 "Message/CreateMeeting",
100 NULL
, N_("Create meeting from message..."), NULL
, NULL
, G_CALLBACK(create_meeting_from_message_cb_ui
)
103 static void create_meeting_from_message_cb_ui(GtkAction
*action
, gpointer data
)
105 MainWindow
*mainwin
= mainwindow_get_mainwindow();
106 SummaryView
*summaryview
= mainwin
->summaryview
;
107 GSList
*msglist
= summary_get_selected_msg_list(summaryview
);
108 FolderItem
*item
= NULL
;
113 if (summary_is_locked(summaryview
) || !msglist
) {
115 g_slist_free(msglist
);
118 total
= g_slist_length(msglist
);
120 msg
= g_strdup_printf(_("You are about to create %d "
121 "meetings, one by one. Do you "
122 "want to continue?"),
125 && alertpanel(_("Warning"), msg
, GTK_STOCK_CANCEL
, GTK_STOCK_YES
, NULL
,
127 != G_ALERTALTERNATE
) {
133 main_window_cursor_wait(summaryview
->mainwin
);
134 gtk_cmclist_freeze(GTK_CMCLIST(summaryview
->ctree
));
135 folder_item_update_freeze();
138 item
= summaryview
->folder_item
;
140 STATUSBAR_PUSH(mainwin
, _("Creating meeting..."));
142 for (cur
= msglist
; cur
; cur
= cur
->next
) {
143 MsgInfo
*msginfo
= procmsg_msginfo_get_full_info((MsgInfo
*)cur
->data
);
144 VCalEvent
*event
= NULL
;
147 if (MSG_IS_ENCRYPTED(msginfo
->flags
)) {
148 fp
= procmime_get_first_encrypted_text_content(msginfo
);
150 fp
= procmime_get_first_text_content(msginfo
);
155 time_t t
= time(NULL
);
158 gchar
*orgname
= NULL
;
159 gchar
*summary
= g_strdup(msginfo
->subject
? msginfo
->subject
:_("no subject"));
160 gchar
*description
= file_read_stream_to_str(fp
);
161 gchar
*dtstart
= g_strdup(icaltime_as_ical_string(icaltime_from_timet_with_zone(t
, FALSE
, NULL
)));
162 gchar
*dtend
= g_strdup(icaltime_as_ical_string(icaltime_from_timet_with_zone(t2
, FALSE
, NULL
)));
164 gchar
*tzid
= g_strdup("UTC");
166 gint method
= ICAL_METHOD_REQUEST
;
168 PrefsAccount
*account
= NULL
;
172 if (item
&& item
->prefs
&& item
->prefs
->enable_default_account
)
173 account
= account_find_from_id(item
->prefs
->default_account
);
176 account
= account_get_cur_account();
181 org
= g_strdup(account
->address
);
183 uid
= prefs_account_generate_msgid(account
);
185 event
= vcal_manager_new_event(uid
,
186 org
, NULL
, NULL
/*location*/, summary
, description
,
187 dtstart
, dtend
, recur
, tzid
, url
, method
, sequence
,
188 ICAL_VTODO_COMPONENT
);
191 /* hack to get default hours */
192 g_free(event
->dtstart
);
193 g_free(event
->dtend
);
194 event
->dtstart
= NULL
;
197 vcal_meeting_create(event
);
198 vcal_manager_free_event(event
);
212 procmsg_msginfo_free(&msginfo
);
215 statusbar_progress_all(0,0,0);
216 STATUSBAR_POP(mainwin
);
218 folder_item_update_thaw();
219 gtk_cmclist_thaw(GTK_CMCLIST(summaryview
->ctree
));
220 main_window_cursor_normal(summaryview
->mainwin
);
221 g_slist_free(msglist
);
224 static gchar
*get_tmpfile(VCalViewer
*vcalviewer
)
226 gchar
*tmpfile
= NULL
;
228 if (!vcalviewer
->tmpfile
) {
229 tmpfile
= procmime_get_tmp_file_name(vcalviewer
->mimeinfo
);
230 debug_print("creating %s\n", tmpfile
);
232 if (procmime_get_part(tmpfile
, vcalviewer
->mimeinfo
) < 0) {
233 g_warning("can't get mimepart file");
237 vcalviewer
->tmpfile
= tmpfile
;
240 return vcalviewer
->tmpfile
;
243 static GtkWidget
*vcal_viewer_get_widget(MimeViewer
*_mimeviewer
)
245 VCalViewer
*vcalviewer
= (VCalViewer
*) _mimeviewer
;
247 debug_print("vcal_viewer_get_widget\n");
248 gtk_widget_show_all(vcalviewer
->scrolledwin
);
249 return vcalviewer
->scrolledwin
;
252 static void vcal_viewer_clear_viewer(MimeViewer
*_mimeviewer
)
254 VCalViewer
*vcalviewer
= (VCalViewer
*) _mimeviewer
;
256 debug_print("vcal_viewer_clear_viewer\n");
258 g_free(vcalviewer
->file
);
259 vcalviewer
->file
= NULL
;
260 if (vcalviewer
->tmpfile
) {
261 debug_print("unlinking %s\n", vcalviewer
->tmpfile
);
262 g_unlink(vcalviewer
->tmpfile
);
263 g_free(vcalviewer
->tmpfile
);
264 vcalviewer
->tmpfile
= NULL
;
266 vcalviewer
->mimeinfo
= NULL
;
269 static VCalEvent
*vcalviewer_get_component(const gchar
*file
, const gchar
*charset
)
271 gchar
*compstr
= NULL
;
272 VCalEvent
*event
= NULL
;
278 g_return_val_if_fail(file
!= NULL
, NULL
);
280 if ((fp
= claws_fopen(file
, "rb")) == NULL
) {
281 FILE_OP_ERROR(file
, "claws_fopen");
285 array
= g_byte_array_new();
287 while ((n_read
= claws_fread(buf
, sizeof(gchar
), sizeof(buf
), fp
)) > 0) {
288 if (n_read
< sizeof(buf
) && claws_ferror(fp
))
290 g_byte_array_append(array
, (guchar
*)buf
, n_read
);
293 if (claws_ferror(fp
)) {
294 FILE_OP_ERROR("file stream", "claws_fread");
295 g_byte_array_free(array
, TRUE
);
301 g_byte_array_append(array
, (guchar
*)buf
, 1);
302 compstr
= (gchar
*)array
->data
;
303 g_byte_array_free(array
, FALSE
);
308 event
= vcal_get_event_from_ical(compstr
, charset
);
315 #define GTK_LABEL_SET_TEXT_TRIMMED(label, text) { \
316 gchar *tmplbl = strretchomp(g_strdup(text)); \
317 gtk_label_set_text(label, tmplbl); \
321 static void vcalviewer_answer_set_choices(VCalViewer
*vcalviewer
, VCalEvent
*event
, icalproperty_method method
);
323 static void vcalviewer_reset(VCalViewer
*vcalviewer
)
325 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->type
), "-");
326 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->who
), "-");
327 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->location
), "-");
328 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->summary
), "-");
329 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->description
), "-");
330 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->start
), "-");
331 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->end
), "-");
332 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->attendees
), "-");
333 g_free(vcalviewer
->url
);
334 vcalviewer
->url
= NULL
;
335 gtk_widget_hide(vcalviewer
->uribtn
);
336 vcalviewer_answer_set_choices(vcalviewer
, NULL
, ICAL_METHOD_CANCEL
);
339 static void vcalviewer_show_error(VCalViewer
*vcalviewer
, const gchar
*msg
)
341 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->type
), msg
);
344 static void vcalviewer_hide_error(VCalViewer
*vcalviewer
)
346 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->type
), "-");
349 static void vcalviewer_show_unavailable(VCalViewer
*vcalviewer
, gboolean visi
)
352 gtk_widget_show_all(vcalviewer
->unavail_box
);
354 gtk_widget_hide(vcalviewer
->unavail_box
);
357 static void vcalviewer_answer_set_choices(VCalViewer
*vcalviewer
, VCalEvent
*event
, icalproperty_method method
)
361 gtk_widget_hide(vcalviewer
->reedit
);
362 gtk_widget_hide(vcalviewer
->cancel
);
363 gtk_widget_hide(vcalviewer
->answer
);
364 gtk_widget_hide(vcalviewer
->button
);
366 for (i
= 0; i
< 3; i
++)
367 gtk_combo_box_text_remove(GTK_COMBO_BOX_TEXT(vcalviewer
->answer
), 0);
369 vcalviewer_show_unavailable(vcalviewer
, FALSE
);
371 if (method
== ICAL_METHOD_REQUEST
&& event
&& !event
->rec_occurrence
) {
372 PrefsAccount
*account
= vcal_manager_get_account_from_event(event
);
375 account
= vcal_manager_get_account_from_event(vcalviewer
->event
);
377 if (!account
&& event
) {
378 account
= account_get_default();
379 vcal_manager_update_answer(event
, account
->address
,
381 ICAL_PARTSTAT_NEEDSACTION
,
382 ICAL_CUTYPE_INDIVIDUAL
);
385 gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(vcalviewer
->answer
), _("Accept"));
386 gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(vcalviewer
->answer
), _("Tentatively accept"));
387 gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(vcalviewer
->answer
), _("Decline"));
388 gtk_widget_set_sensitive(vcalviewer
->answer
, TRUE
);
389 gtk_widget_set_sensitive(vcalviewer
->button
, TRUE
);
390 gtk_widget_show(vcalviewer
->answer
);
391 gtk_widget_show(vcalviewer
->button
);
393 gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(vcalviewer
->answer
), "-");
394 gtk_widget_set_sensitive(vcalviewer
->answer
, FALSE
);
395 gtk_widget_set_sensitive(vcalviewer
->button
, FALSE
);
398 gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(vcalviewer
->answer
), "-");
399 gtk_widget_set_sensitive(vcalviewer
->answer
, FALSE
);
400 gtk_widget_set_sensitive(vcalviewer
->button
, FALSE
);
402 gtk_combo_box_set_active(GTK_COMBO_BOX(vcalviewer
->answer
), 0);
404 if (event
&& event
->method
== ICAL_METHOD_REQUEST
) {
405 PrefsAccount
*account
= vcal_manager_get_account_from_event(event
);
406 gchar
*internal_ifb
= g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S
,
407 "vcalendar", G_DIR_SEPARATOR_S
,
408 "internal.ifb", NULL
);
409 gchar
*myfb
= file_read_to_str(internal_ifb
);
410 g_free(internal_ifb
);
412 icalparameter_partstat answer
=
413 vcal_manager_get_reply_for_attendee(event
, account
->address
);
415 if (answer
== ICAL_PARTSTAT_ACCEPTED
)
416 gtk_combo_box_set_active(GTK_COMBO_BOX(vcalviewer
->answer
), 0);
417 if (answer
== ICAL_PARTSTAT_TENTATIVE
)
418 gtk_combo_box_set_active(GTK_COMBO_BOX(vcalviewer
->answer
), 1);
419 if (answer
== ICAL_PARTSTAT_DECLINED
)
420 gtk_combo_box_set_active(GTK_COMBO_BOX(vcalviewer
->answer
), 2);
421 if (event
->dtstart
&& event
->dtend
&& myfb
&& *myfb
422 && answer
!= ICAL_PARTSTAT_ACCEPTED
423 && answer
!= ICAL_PARTSTAT_TENTATIVE
) {
424 if (!attendee_available(NULL
, event
->dtstart
, event
->dtend
, myfb
))
425 vcalviewer_show_unavailable(vcalviewer
, TRUE
);
431 g_free(vcalviewer
->url
);
432 if (event
&& event
->url
&& *(event
->url
)) {
433 vcalviewer
->url
= g_strdup(event
->url
);
434 gtk_widget_show(vcalviewer
->uribtn
);
436 vcalviewer
->url
= NULL
;
437 gtk_widget_hide(vcalviewer
->uribtn
);
441 static FolderItem
*vcalendar_get_current_item(void)
443 MainWindow
*mainwin
= mainwindow_get_mainwindow();
444 FolderItem
*item
= NULL
;
445 Folder
*folder
= folder_find_from_name (PLUGIN_NAME
, vcal_folder_get_class());
448 item
= mainwin
->summaryview
->folder_item
;
451 if (item
->folder
== folder
)
454 return folder
->inbox
;
460 void vcalviewer_display_event (VCalViewer
*vcalviewer
, VCalEvent
*event
)
463 gchar
*attendees
= NULL
;
464 gboolean mine
= FALSE
;
466 gboolean save_evt
= FALSE
;
467 FolderItem
*item
= vcalendar_get_current_item();
474 if (event
->type
== ICAL_VTODO_COMPONENT
) {
476 label
= g_strjoin(" ", _("You have a Todo item."),
477 _("Details follow:"), NULL
);
478 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->type
), label
);
480 } else if (event
->method
== ICAL_METHOD_REQUEST
) {
482 if (account_find_from_address(event
->organizer
, FALSE
)) {
483 label
= g_strjoin(" ", _("You have created a meeting."),
484 _("Details follow:"), NULL
);
485 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->type
), label
);
488 label
= g_strjoin(" ", _("You have been invited to a meeting."),
489 _("Details follow:"), NULL
);
490 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->type
), label
);
493 } else if (event
->method
== ICAL_METHOD_CANCEL
) {
495 label
= g_strjoin(" ",
496 _("A meeting to which you had been invited has been cancelled."),
497 _("Details follow:"), NULL
);
498 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->type
), label
);
500 vcalendar_refresh_folder_contents(item
);
501 } else if (event
->method
== ICAL_METHOD_REPLY
) {
502 /* don't change label */
505 label
= g_strjoin(" ", _("You have been forwarded an appointment."),
506 _("Details follow:"), NULL
);
507 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->type
), label
);
513 if (event
->orgname
&& *(event
->orgname
)
514 && event
->organizer
&& *(event
->organizer
)) {
515 gchar
*addr
= g_strconcat(event
->orgname
, " <", event
->organizer
, ">", NULL
);
516 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->who
), addr
);
518 } else if (event
->organizer
&& *(event
->organizer
)) {
519 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->who
), event
->organizer
);
521 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->who
), "-");
525 if (event
->location
&& *(event
->location
)) {
526 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->location
), event
->location
);
528 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->location
), "-");
532 if (event
->summary
&& *(event
->summary
)) {
533 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->summary
), event
->summary
);
535 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->summary
), "-");
539 if (event
->description
&& *(event
->description
)) {
540 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->description
), event
->description
);
542 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->description
), "-");
546 g_free(vcalviewer
->url
);
547 if (event
->url
&& *(event
->url
)) {
548 vcalviewer
->url
= g_strdup(event
->url
);
549 gtk_widget_show(vcalviewer
->uribtn
);
551 vcalviewer
->url
= NULL
;
552 gtk_widget_hide(vcalviewer
->uribtn
);
556 if (event
->start
&& *(event
->start
)) {
557 if (event
->recur
&& *(event
->recur
)) {
558 gchar
*tmp
= g_strdup_printf("%s <span weight=\"bold\">%s</span>",
559 _("(this event recurs)"), event
->start
);
560 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->start
), tmp
);
561 gtk_label_set_use_markup(GTK_LABEL(vcalviewer
->start
), TRUE
);
563 } else if (event
->rec_occurrence
) {
564 gchar
*tmp
= g_strdup_printf("%s <span weight=\"bold\">%s</span>",
565 _("(this event is part of a recurring event)"), event
->start
);
566 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->start
), tmp
);
567 gtk_label_set_use_markup(GTK_LABEL(vcalviewer
->start
), TRUE
);
570 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->start
), event
->start
);
573 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->start
), "-");
577 if (event
->end
&& *(event
->end
)) {
578 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->end
), event
->end
);
580 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->end
), "-");
584 attendees
= g_strdup("");
585 for (list
= vcal_manager_get_answers_emails(event
);
586 list
&& list
->data
; list
= list
->next
) {
587 gchar
*attendee
= (gchar
*)list
->data
;
588 gchar
*name
= vcal_manager_get_attendee_name(event
, attendee
);
589 gchar
*ename
= g_markup_printf_escaped("%s", name
?name
:"");
590 gchar
*eatt
= g_markup_printf_escaped("%s", attendee
);
591 icalparameter_partstat acode
= vcal_manager_get_reply_for_attendee(event
, attendee
);
592 gchar
*answer
= vcal_manager_get_reply_text_for_attendee(event
, attendee
);
593 gchar
*type
= vcal_manager_get_cutype_text_for_attendee(event
, attendee
);
596 tmp
= g_strdup_printf(
597 "%s%s<%s> (%s, <span%s>%s</span>)",
598 (ename
&& *(ename
))?ename
:"",
599 (ename
&& *(ename
))?" ":"",
600 (eatt
&& *(eatt
))?eatt
:"",
601 (type
&& *(type
))?type
:"",
602 (acode
!= ICAL_PARTSTAT_ACCEPTED
? " foreground=\"red\"":""),
603 (answer
&& *(answer
))?answer
:"");
604 e_len
= strlen(attendees
);
607 attendees
= g_realloc(attendees
, e_len
+n_len
+2);
608 *(attendees
+e_len
) = '\n';
609 strcpy(attendees
+e_len
+1, tmp
);
611 attendees
= g_realloc(attendees
, e_len
+n_len
+1);
612 strcpy(attendees
, tmp
);
622 if (attendees
&& *(attendees
)) {
623 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->attendees
), attendees
);
625 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->attendees
), "-");
628 gtk_label_set_use_markup(GTK_LABEL(vcalviewer
->attendees
), TRUE
);
632 if (event
->type
!= ICAL_VTODO_COMPONENT
)
633 vcalviewer_answer_set_choices(vcalviewer
, event
, event
->method
);
635 vcalviewer_answer_set_choices(vcalviewer
, event
, ICAL_METHOD_PUBLISH
);
637 vcalviewer_answer_set_choices(vcalviewer
, event
, ICAL_METHOD_REPLY
);
638 gtk_widget_show(vcalviewer
->reedit
);
639 gtk_widget_show(vcalviewer
->cancel
);
642 /* save if cancelled */
644 vcal_manager_save_event(event
, TRUE
);
647 gchar
*vcalviewer_get_uid_from_mimeinfo(MimeInfo
*mimeinfo
)
649 gchar
*compstr
= NULL
;
651 VCalEvent
*event
= NULL
;
653 compstr
= procmime_get_part_as_string(mimeinfo
, TRUE
);
655 event
= vcal_get_event_from_ical(compstr
, NULL
);
657 res
= g_strdup(event
->uid
);
659 vcal_manager_free_event(event
);
661 debug_print("got uid: %s\n", res
);
666 static void vcalviewer_get_request_values(VCalViewer
*vcalviewer
, MimeInfo
*mimeinfo
, gboolean is_todo
)
668 VCalEvent
*saved_event
= NULL
;
669 const gchar
*saveme
= procmime_mimeinfo_get_parameter(mimeinfo
, "vcalsave");
671 if (!vcalviewer
->event
)
674 /* see if we have it registered and more recent */
675 saved_event
= vcal_manager_load_event(vcalviewer
->event
->uid
);
676 if (saved_event
&& saved_event
->sequence
>= vcalviewer
->event
->sequence
) {
677 saved_event
->method
= vcalviewer
->event
->method
;
678 vcalviewer_display_event(vcalviewer
, saved_event
);
679 vcal_manager_free_event(saved_event
);
681 } else if (saved_event
) {
682 vcal_manager_free_event(saved_event
);
685 /* load it and register it */
687 if (!saveme
|| strcmp(saveme
,"no"))
688 vcal_manager_save_event(vcalviewer
->event
, FALSE
);
690 vcalviewer_display_event(vcalviewer
, vcalviewer
->event
);
693 static void vcalviewer_get_reply_values(VCalViewer
*vcalviewer
, MimeInfo
*mimeinfo
)
695 VCalEvent
*saved_event
= NULL
;
696 gchar
*attendee
= NULL
, *label
= NULL
;
697 Answer
*answer
= NULL
;
699 if (!vcalviewer
->event
)
702 if (!vcalviewer
->event
->answers
|| g_slist_length(vcalviewer
->event
->answers
) > 1) {
703 g_warning("strange, no answers or more than one");
706 if (vcalviewer
->event
->answers
) {
707 answer
= (Answer
*)vcalviewer
->event
->answers
->data
;
708 attendee
= g_strdup(answer
->attendee
);
713 label
= g_strjoin(" ",
714 _("You have received an answer to an unknown meeting proposal."),
715 _("Details follow:"), NULL
);
716 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->type
), label
);
718 label
= g_strdup_printf(_("You have received an answer to a meeting proposal.\n"
719 "%s has %s the invitation whose details follow:"),
720 attendee
, vcal_manager_answer_get_text(answer
->answer
));
721 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->type
), label
);
726 saved_event
= vcal_manager_load_event(vcalviewer
->event
->uid
);
727 if (saved_event
&& answer
) {
728 vcal_manager_update_answer(saved_event
,
729 answer
->attendee
, answer
->name
, answer
->answer
, answer
->cutype
);
730 vcal_manager_save_event(saved_event
, TRUE
);
731 saved_event
->method
= vcalviewer
->event
->method
;
732 vcalviewer_display_event(vcalviewer
, saved_event
);
733 vcal_manager_free_event(saved_event
);
735 } else if (saved_event
) {
736 vcal_manager_free_event(saved_event
);
739 if (vcalviewer
->event
->organizer
) {
740 if (vcalviewer
->event
->orgname
) {
741 gchar
*addr
= g_strconcat(vcalviewer
->event
->orgname
, " <",
742 vcalviewer
->event
->organizer
, ">", NULL
);
743 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->who
), addr
);
746 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->who
),
747 vcalviewer
->event
->organizer
);
750 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->who
), "-");
753 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->location
),
754 vcalviewer
->event
->location
?vcalviewer
->event
->location
:"-");
756 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->summary
),
757 vcalviewer
->event
->summary
?vcalviewer
->event
->summary
:"-");
759 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->description
),
760 vcalviewer
->event
->description
?vcalviewer
->event
->description
:"-");
762 g_free(vcalviewer
->url
);
763 if (vcalviewer
->event
->url
) {
764 vcalviewer
->url
= g_strdup(vcalviewer
->event
->url
);
765 gtk_widget_show(vcalviewer
->uribtn
);
767 vcalviewer
->url
= NULL
;
768 gtk_widget_hide(vcalviewer
->uribtn
);
771 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->start
),
772 vcalviewer
->event
->start
?vcalviewer
->event
->start
:"-");
773 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->end
),
774 vcalviewer
->event
->end
?vcalviewer
->event
->end
:"-");
776 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->attendees
), "-");
778 vcalviewer_answer_set_choices(vcalviewer
, NULL
, ICAL_METHOD_REPLY
);
781 static void vcalviewer_get_event(VCalViewer
*vcalviewer
, MimeInfo
*mimeinfo
)
783 gchar
*tmpfile
= get_tmpfile(vcalviewer
);
784 const gchar
*charset
= procmime_mimeinfo_get_parameter(mimeinfo
, "charset");
787 charset
= CS_WINDOWS_1252
;
789 if (!strcasecmp(charset
, CS_ISO_8859_1
))
790 charset
= CS_WINDOWS_1252
;
792 if (vcalviewer
->event
) {
793 vcal_manager_free_event(vcalviewer
->event
);
794 vcalviewer
->event
= NULL
;
798 vcalviewer_reset(vcalviewer
);
799 vcalviewer_show_error(vcalviewer
, _("Error - could not get the calendar MIME part."));
803 vcalviewer
->event
= vcalviewer_get_component(tmpfile
, charset
);
804 if (!vcalviewer
->event
) {
805 vcalviewer_reset(vcalviewer
);
806 vcalviewer_show_error(vcalviewer
, _("Error - no calendar part found."));
810 if (vcalviewer
->event
->type
== ICAL_VTODO_COMPONENT
) {
811 vcalviewer_get_request_values(vcalviewer
, mimeinfo
, TRUE
);
812 } else if (vcalviewer
->event
->method
== ICAL_METHOD_REQUEST
||
813 vcalviewer
->event
->method
== ICAL_METHOD_PUBLISH
||
814 vcalviewer
->event
->method
== ICAL_METHOD_CANCEL
) {
815 vcalviewer_get_request_values(vcalviewer
, mimeinfo
, FALSE
);
816 } else if (vcalviewer
->event
->method
== ICAL_METHOD_REPLY
) {
817 vcalviewer_get_reply_values(vcalviewer
, mimeinfo
);
819 vcalviewer_reset(vcalviewer
);
820 vcalviewer_show_error(vcalviewer
, _("Error - Unknown calendar component type."));
824 static VCalViewer
*s_vcalviewer
= NULL
;
826 static void vcal_viewer_show_mimepart(MimeViewer
*_mimeviewer
, const gchar
*file
, MimeInfo
*mimeinfo
)
828 VCalViewer
*vcalviewer
= (VCalViewer
*) _mimeviewer
;
829 GtkAllocation allocation
;
833 s_vcalviewer
= vcalviewer
;
835 if (mimeinfo
== NULL
) {
836 vcal_viewer_clear_viewer(_mimeviewer
);
840 debug_print("vcal_viewer_show_mimepart : %s\n", file
);
842 vcal_viewer_clear_viewer(_mimeviewer
);
843 gtk_widget_show_all(vcalviewer
->scrolledwin
);
844 g_free(vcalviewer
->file
);
845 vcalviewer
->file
= g_strdup(file
);
846 vcalviewer
->mimeinfo
= mimeinfo
;
847 vcalviewer_hide_error(vcalviewer
);
848 vcalviewer_get_event(vcalviewer
, mimeinfo
);
850 gtk_widget_get_allocation(vcalviewer
->scrolledwin
, &allocation
);
851 gtk_widget_set_size_request(vcalviewer
->description
,
852 allocation
.width
- 200, -1);
853 gtk_label_set_line_wrap(GTK_LABEL(vcalviewer
->location
), TRUE
);
854 gtk_label_set_line_wrap(GTK_LABEL(vcalviewer
->summary
), TRUE
);
855 gtk_label_set_line_wrap(GTK_LABEL(vcalviewer
->description
), TRUE
);
856 gtk_label_set_line_wrap(GTK_LABEL(vcalviewer
->attendees
), FALSE
);
858 if (prefs_common_get_prefs()->textfont
) {
859 PangoFontDescription
*font_desc
;
861 font_desc
= pango_font_description_from_string
862 (prefs_common_get_prefs()->textfont
);
864 gtk_widget_modify_font(
865 vcalviewer
->description
, font_desc
);
866 pango_font_description_free(font_desc
);
872 void vcalviewer_reload(FolderItem
*item
)
875 MainWindow
*mainwin
= mainwindow_get_mainwindow();
876 Folder
*folder
= folder_find_from_name (PLUGIN_NAME
, vcal_folder_get_class());
878 folder_item_scan(item
);
879 if (mainwin
&& mainwin
->summaryview
->folder_item
) {
880 FolderItem
*cur
= mainwin
->summaryview
->folder_item
;
881 if (cur
->folder
== folder
)
882 folder_item_scan(cur
);
884 if (mainwin
&& mainwin
->summaryview
->folder_item
== item
) {
885 debug_print("reload: %p, %p\n", (MimeViewer
*)s_vcalviewer
, s_vcalviewer
->mimeinfo
);
886 summary_redisplay_msg(mainwin
->summaryview
);
891 static void vcal_viewer_destroy_viewer(MimeViewer
*_mimeviewer
)
893 VCalViewer
*vcalviewer
= (VCalViewer
*) _mimeviewer
;
895 debug_print("vcal_viewer_destroy_viewer\n");
897 if (s_vcalviewer
== vcalviewer
)
899 vcal_viewer_clear_viewer(_mimeviewer
);
903 static gboolean
vcalviewer_reedit_cb(GtkButton
*widget
, gpointer data
)
905 VCalViewer
*vcalviewer
= (VCalViewer
*)data
;
906 gchar
* uid
= vcalviewer_get_uid_from_mimeinfo(vcalviewer
->mimeinfo
);
907 VCalEvent
*event
= NULL
;
909 s_vcalviewer
= vcalviewer
;
910 /* see if we have it registered and more recent */
911 event
= vcal_manager_load_event(uid
);
912 vcal_meeting_create(event
);
913 vcal_manager_free_event(event
);
917 static gboolean
vcalviewer_uribtn_cb(GtkButton
*widget
, gpointer data
)
919 VCalViewer
*vcalviewer
= (VCalViewer
*)data
;
922 open_uri(vcalviewer
->url
, prefs_common_get_uri_cmd());
927 void vcalendar_refresh_folder_contents(FolderItem
*item
)
929 g_return_val_if_fail(item
!= NULL
, NULL
);
931 Folder
*folder
= folder_find_from_name (PLUGIN_NAME
, vcal_folder_get_class());
932 if (folder
&& item
->folder
== folder
) {
933 MainWindow
*mainwin
= mainwindow_get_mainwindow();
934 folder_item_scan(item
);
935 if (mainwin
->summaryview
->folder_item
== item
) {
936 summary_show(mainwin
->summaryview
, item
, FALSE
);
941 static void send_cancel_notify_toggled_cb(GtkToggleButton
*button
, gboolean
*data
)
943 *data
= gtk_toggle_button_get_active(button
);
946 void vcalendar_cancel_meeting(FolderItem
*item
, const gchar
*uid
)
948 VCalEvent
*event
= NULL
;
949 VCalMeeting
*meet
= NULL
;
952 Folder
*folder
= folder_find_from_name (PLUGIN_NAME
, vcal_folder_get_class());
953 gboolean redisp
= FALSE
;
954 GtkWidget
*send_notify_chkbtn
= gtk_check_button_new_with_label(_("Send a notification to the attendees"));
955 gboolean send_notify
= TRUE
;
957 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(send_notify_chkbtn
), TRUE
);
958 gtk_widget_show(send_notify_chkbtn
);
959 g_signal_connect(G_OBJECT(send_notify_chkbtn
), "toggled",
960 G_CALLBACK(send_cancel_notify_toggled_cb
),
963 val
= alertpanel_full(_("Cancel meeting"),
964 _("Are you sure you want to cancel this meeting?"),
965 GTK_STOCK_NO
, GTK_STOCK_YES
, NULL
, ALERTFOCUS_FIRST
, FALSE
,
966 send_notify_chkbtn
, ALERT_WARNING
);
968 if (val
!= G_ALERTALTERNATE
)
971 event
= vcal_manager_load_event(uid
);
974 event
->method
= ICAL_METHOD_CANCEL
;
977 MainWindow
*mainwin
= mainwindow_get_mainwindow();
978 if (mainwin
->summaryview
->folder_item
== item
) {
980 summary_show(mainwin
->summaryview
, NULL
, FALSE
);
985 meet
= vcal_meeting_create_hidden(event
);
986 if (!vcal_meeting_send(meet
)) {
987 event
->method
= ICAL_METHOD_REQUEST
;
988 vcal_manager_save_event(event
, TRUE
);
989 vcal_manager_free_event(event
);
991 folder_item_scan(item
);
993 if (folder
&& redisp
) {
994 MainWindow
*mainwin
= mainwindow_get_mainwindow();
995 summary_show(mainwin
->summaryview
, item
, FALSE
);
1001 vcal_manager_save_event(event
, TRUE
);
1003 file
= vcal_manager_get_event_file(event
->uid
);
1005 vcal_manager_free_event(event
);
1008 folder_item_scan(item
);
1009 if (folder
&& redisp
) {
1010 MainWindow
*mainwin
= mainwindow_get_mainwindow();
1011 summary_show(mainwin
->summaryview
, item
, FALSE
);
1017 static gboolean
vcalviewer_cancel_cb(GtkButton
*widget
, gpointer data
)
1019 VCalViewer
*vcalviewer
= (VCalViewer
*)data
;
1020 FolderItem
*item
= vcalendar_get_current_item();
1021 gchar
* uid
= vcalviewer_get_uid_from_mimeinfo(vcalviewer
->mimeinfo
);
1022 vcalendar_cancel_meeting(item
, uid
);
1026 static gboolean
vcalviewer_action_cb(GtkButton
*widget
, gpointer data
)
1028 VCalViewer
*vcalviewer
= (VCalViewer
*)data
;
1029 gint index
= gtk_combo_box_get_active(GTK_COMBO_BOX(vcalviewer
->answer
));
1030 icalparameter_partstat reply
[3] = {ICAL_PARTSTAT_ACCEPTED
, ICAL_PARTSTAT_TENTATIVE
, ICAL_PARTSTAT_DECLINED
};
1031 PrefsAccount
*account
= NULL
;
1032 VCalEvent
*saved_event
= NULL
, *event
= NULL
;
1033 debug_print("index chosen %d\n", index
);
1035 if (index
< 0 || index
> 2) {
1039 s_vcalviewer
= vcalviewer
;
1041 if (!vcalviewer
->event
) {
1042 g_warning("can't get event");
1046 /* see if we have it registered and more recent */
1047 event
= vcalviewer
->event
;
1048 saved_event
= vcal_manager_load_event(vcalviewer
->event
->uid
);
1049 if (saved_event
&& saved_event
->sequence
>= vcalviewer
->event
->sequence
) {
1050 saved_event
->method
= vcalviewer
->event
->method
;
1051 event
= saved_event
;
1052 } else if (saved_event
) {
1053 vcal_manager_free_event(saved_event
);
1056 account
= vcal_manager_get_account_from_event(event
);
1059 AlertValue val
= alertpanel_full(_("No account found"),
1060 _("You have no account matching any attendee.\n"
1061 "Do you want to reply anyway?"),
1062 GTK_STOCK_CANCEL
, _("Reply anyway"), NULL
,
1063 ALERTFOCUS_SECOND
, FALSE
, NULL
, ALERT_QUESTION
);
1064 if (val
== G_ALERTALTERNATE
) {
1065 account
= account_get_default();
1066 vcal_manager_update_answer(event
, account
->address
,
1068 ICAL_PARTSTAT_NEEDSACTION
,
1069 ICAL_CUTYPE_INDIVIDUAL
);
1072 vcal_manager_free_event(saved_event
);
1077 vcal_manager_update_answer(event
, account
->address
, account
->name
, reply
[index
], 0);
1079 if (event
->organizer
&& *(event
->organizer
) &&
1080 !vcal_manager_reply(account
, event
)) {
1081 g_warning("couldn't send reply");
1083 debug_print("no organizer, not sending answer\n");
1086 vcal_manager_save_event(event
, TRUE
);
1088 vcalviewer_display_event(vcalviewer
, event
);
1090 vcal_manager_free_event(saved_event
);
1094 #define TABLE_ADD_LINE(label_text, widget) { \
1095 gchar *tmpstr = g_strdup_printf("<span weight=\"bold\">%s</span>",\
1097 GtkWidget *label = gtk_label_new(tmpstr); \
1099 gtk_label_set_use_markup (GTK_LABEL (label), TRUE); \
1100 gtk_misc_set_alignment (GTK_MISC(label), 1, 0); \
1101 gtk_table_attach (GTK_TABLE (vcalviewer->table), \
1102 label, 0, 1, i, i+1, \
1103 GTK_FILL, GTK_FILL, 6, 6); \
1104 gtk_table_attach (GTK_TABLE (vcalviewer->table), \
1105 widget, 1, 2, i, i+1, \
1106 GTK_FILL, GTK_FILL, 6, 6); \
1107 if (GTK_IS_LABEL(widget)) { \
1108 gtk_label_set_use_markup(GTK_LABEL (widget), TRUE); \
1109 gtk_misc_set_alignment (GTK_MISC(widget),0, 0); \
1110 gtk_label_set_line_wrap(GTK_LABEL(widget), TRUE); \
1115 static gchar
*vcal_viewer_get_selection(MimeViewer
*_viewer
)
1117 VCalViewer
*viewer
= (VCalViewer
*)_viewer
;
1118 if (viewer
->summary
== NULL
)
1120 if (gtk_label_get_text(GTK_LABEL(viewer
->description
))
1121 && *(gtk_label_get_text(GTK_LABEL(viewer
->description
))) > 2) {
1123 if (gtk_label_get_selection_bounds(GTK_LABEL(viewer
->description
),
1125 gchar
*tmp
= g_strdup(gtk_label_get_text(
1126 GTK_LABEL(viewer
->description
))+start
);
1127 tmp
[end
-start
] = '\0';
1130 return g_strdup(gtk_label_get_text(GTK_LABEL(viewer
->description
)));
1133 else if (gtk_label_get_text(GTK_LABEL(viewer
->summary
))
1134 && *(gtk_label_get_text(GTK_LABEL(viewer
->summary
))) > 2)
1135 return g_strdup(gtk_label_get_text(GTK_LABEL(viewer
->summary
)));
1141 static gboolean
vcal_viewer_scroll_page(MimeViewer
*_viewer
, gboolean up
)
1143 VCalViewer
*viewer
= (VCalViewer
*)_viewer
;
1144 GtkAdjustment
*vadj
= gtk_scrolled_window_get_vadjustment(
1145 GTK_SCROLLED_WINDOW(viewer
->scrolledwin
));
1147 return gtkutils_scroll_page(viewer
->table
, vadj
, up
);
1150 static void vcal_viewer_scroll_one_line(MimeViewer
*_viewer
, gboolean up
)
1152 VCalViewer
*viewer
= (VCalViewer
*)_viewer
;
1153 GtkAdjustment
*vadj
= gtk_scrolled_window_get_vadjustment(
1154 GTK_SCROLLED_WINDOW(viewer
->scrolledwin
));
1156 gtkutils_scroll_one_line(viewer
->table
, vadj
, up
);
1159 MimeViewer
*vcal_viewer_create(void)
1161 VCalViewer
*vcalviewer
;
1163 GtkWidget
*hbox
= NULL
, *vbox
= NULL
;
1164 GtkWidget
*warning_img
;
1165 GtkWidget
*warning_label
;
1167 debug_print("Creating vcal view...\n");
1168 vcalviewer
= g_new0(VCalViewer
, 1);
1169 vcalviewer
->mimeviewer
.factory
= &vcal_viewer_factory
;
1171 vcalviewer
->mimeviewer
.get_widget
= vcal_viewer_get_widget
;
1172 vcalviewer
->mimeviewer
.show_mimepart
= vcal_viewer_show_mimepart
;
1173 vcalviewer
->mimeviewer
.clear_viewer
= vcal_viewer_clear_viewer
;
1174 vcalviewer
->mimeviewer
.destroy_viewer
= vcal_viewer_destroy_viewer
;
1175 vcalviewer
->mimeviewer
.get_selection
= vcal_viewer_get_selection
;
1176 vcalviewer
->mimeviewer
.scroll_page
= vcal_viewer_scroll_page
;
1177 vcalviewer
->mimeviewer
.scroll_one_line
= vcal_viewer_scroll_one_line
;
1179 vcalviewer
->table
= gtk_table_new(8, 2, FALSE
);
1180 vcalviewer
->type
= gtk_label_new("meeting");
1181 vcalviewer
->who
= gtk_label_new("who");
1182 vcalviewer
->start
= gtk_label_new("start");
1183 vcalviewer
->end
= gtk_label_new("end");
1184 vcalviewer
->location
= gtk_label_new("location");
1185 vcalviewer
->summary
= gtk_label_new("summary");
1186 vcalviewer
->description
= gtk_label_new("description");
1187 vcalviewer
->attendees
= gtk_label_new("attendees");
1189 vcalviewer
->answer
= gtk_combo_box_text_new();
1190 vcalviewer
->url
= NULL
;
1191 vcalviewer
->button
= gtk_button_new_with_label(_("Answer"));
1192 vcalviewer
->reedit
= gtk_button_new_with_label(_("Edit meeting..."));
1193 vcalviewer
->cancel
= gtk_button_new_with_label(_("Cancel meeting..."));
1194 vcalviewer
->uribtn
= gtk_button_new_with_label(_("Launch website"));
1195 vcalviewer
->unavail_box
= gtk_hbox_new(FALSE
, 6);
1196 warning_img
= gtk_image_new_from_stock
1197 (GTK_STOCK_DIALOG_WARNING
, GTK_ICON_SIZE_SMALL_TOOLBAR
);
1198 warning_label
= gtk_label_new(_("You are already busy at this time."));
1200 gtk_box_pack_start(GTK_BOX(vcalviewer
->unavail_box
), warning_img
, FALSE
, FALSE
, 0);
1201 gtk_box_pack_start(GTK_BOX(vcalviewer
->unavail_box
), warning_label
, FALSE
, FALSE
, 0);
1203 hbox
= gtk_hbox_new(FALSE
, 6);
1204 gtk_box_pack_start(GTK_BOX(hbox
), vcalviewer
->answer
, FALSE
, FALSE
, 0);
1205 gtk_box_pack_start(GTK_BOX(hbox
), vcalviewer
->button
, FALSE
, FALSE
, 0);
1206 gtk_box_pack_start(GTK_BOX(hbox
), vcalviewer
->reedit
, FALSE
, FALSE
, 0);
1207 gtk_box_pack_start(GTK_BOX(hbox
), vcalviewer
->cancel
, FALSE
, FALSE
, 0);
1208 gtk_box_pack_start(GTK_BOX(hbox
), vcalviewer
->uribtn
, FALSE
, FALSE
, 0);
1210 vbox
= gtk_vbox_new(FALSE
, 6);
1211 gtk_box_pack_start(GTK_BOX(vbox
), hbox
, FALSE
, FALSE
, 0);
1212 gtk_box_pack_start(GTK_BOX(vbox
), vcalviewer
->unavail_box
, FALSE
, FALSE
, 0);
1214 vcalviewer_answer_set_choices(vcalviewer
, NULL
, ICAL_METHOD_REQUEST
);
1216 gtk_label_set_selectable(GTK_LABEL(vcalviewer
->type
), TRUE
);
1217 gtk_label_set_selectable(GTK_LABEL(vcalviewer
->who
), TRUE
);
1218 gtk_label_set_selectable(GTK_LABEL(vcalviewer
->start
), TRUE
);
1219 gtk_label_set_selectable(GTK_LABEL(vcalviewer
->end
), TRUE
);
1220 gtk_label_set_selectable(GTK_LABEL(vcalviewer
->location
), TRUE
);
1221 gtk_label_set_selectable(GTK_LABEL(vcalviewer
->summary
), TRUE
);
1222 gtk_label_set_selectable(GTK_LABEL(vcalviewer
->description
), TRUE
);
1223 gtk_label_set_selectable(GTK_LABEL(vcalviewer
->attendees
), TRUE
);
1225 g_signal_connect(G_OBJECT(vcalviewer
->button
), "clicked",
1226 G_CALLBACK(vcalviewer_action_cb
), vcalviewer
);
1228 g_signal_connect(G_OBJECT(vcalviewer
->reedit
), "clicked",
1229 G_CALLBACK(vcalviewer_reedit_cb
), vcalviewer
);
1231 g_signal_connect(G_OBJECT(vcalviewer
->cancel
), "clicked",
1232 G_CALLBACK(vcalviewer_cancel_cb
), vcalviewer
);
1234 g_signal_connect(G_OBJECT(vcalviewer
->uribtn
), "clicked",
1235 G_CALLBACK(vcalviewer_uribtn_cb
), vcalviewer
);
1237 TABLE_ADD_LINE(_("Event:"), vcalviewer
->type
);
1238 TABLE_ADD_LINE(_("Organizer:"), vcalviewer
->who
);
1239 TABLE_ADD_LINE(_("Location:"), vcalviewer
->location
);
1240 TABLE_ADD_LINE(_("Summary:"), vcalviewer
->summary
);
1241 TABLE_ADD_LINE(_("Starting:"), vcalviewer
->start
);
1242 TABLE_ADD_LINE(_("Ending:"), vcalviewer
->end
);
1243 TABLE_ADD_LINE(_("Description:"), vcalviewer
->description
);
1244 TABLE_ADD_LINE(_("Attendees:"), vcalviewer
->attendees
);
1245 gtk_label_set_line_wrap(GTK_LABEL(vcalviewer
->attendees
), FALSE
);
1246 TABLE_ADD_LINE(_("Action:"), vbox
);
1248 vcalviewer
->scrolledwin
= gtk_scrolled_window_new(NULL
, NULL
);
1249 gtk_scrolled_window_add_with_viewport(
1250 GTK_SCROLLED_WINDOW(vcalviewer
->scrolledwin
),
1252 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(vcalviewer
->scrolledwin
),
1254 GTK_POLICY_AUTOMATIC
);
1256 gtk_widget_show_all(vcalviewer
->scrolledwin
);
1257 return (MimeViewer
*) vcalviewer
;
1260 static gchar
*content_types
[] =
1261 {"text/calendar", NULL
};
1263 MimeViewerFactory vcal_viewer_factory
=
1270 static gint alert_timeout_tag
= 0;
1271 static gint scan_timeout_tag
= 0;
1273 static gboolean
vcal_webcal_check(gpointer data
)
1275 Folder
*root
= folder_find_from_name (PLUGIN_NAME
, vcal_folder_get_class());
1277 if (prefs_common_get_prefs()->work_offline
)
1280 manual_update
= FALSE
;
1281 folderview_check_new(root
);
1282 manual_update
= TRUE
;
1286 static guint context_menu_id
= 0;
1287 static guint main_menu_id
= 0;
1289 void vcalendar_init(void)
1291 MainWindow
*mainwin
= mainwindow_get_mainwindow();
1292 Folder
*folder
= NULL
;
1293 gchar
*directory
= g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S
,
1296 if (!is_dir_exist(directory
) && make_dir (directory
) != 0) {
1305 mimeview_register_viewer_factory(&vcal_viewer_factory
);
1306 folder_register_class(vcal_folder_get_class());
1308 folder
= folder_find_from_name (PLUGIN_NAME
, vcal_folder_get_class());
1310 START_TIMING("creating folder");
1311 folder
= folder_new(vcal_folder_get_class(), PLUGIN_NAME
, NULL
);
1312 folder
->klass
->create_tree(folder
);
1314 folder_scan_tree(folder
, TRUE
);
1318 if (!folder
->inbox
) {
1319 folder
->klass
->create_tree(folder
);
1320 folder_scan_tree(folder
, TRUE
);
1322 if (folder
->klass
->scan_required(folder
, folder
->inbox
)) {
1323 START_TIMING("scanning folder");
1324 folder_item_scan(folder
->inbox
);
1328 vcal_folder_gtk_init();
1330 alert_timeout_tag
= g_timeout_add(60*1000,
1331 (GSourceFunc
)vcal_meeting_alert_check
,
1333 scan_timeout_tag
= g_timeout_add(3600*1000,
1334 (GSourceFunc
)vcal_webcal_check
,
1336 if (prefs_common_get_prefs()->enable_color
) {
1337 gtkut_convert_int_to_gdk_color(prefs_common_get_prefs()->color
[COL_URI
],
1341 gtk_action_group_add_actions(mainwin
->action_group
, vcalendar_main_menu
,
1342 1, (gpointer
)mainwin
);
1343 MENUITEM_ADDUI_ID_MANAGER(mainwin
->ui_manager
, "/Menu/Message", "CreateMeeting",
1344 "Message/CreateMeeting", GTK_UI_MANAGER_MENUITEM
,
1346 MENUITEM_ADDUI_ID_MANAGER(mainwin
->ui_manager
, "/Menus/SummaryViewPopup", "CreateMeeting",
1347 "Message/CreateMeeting", GTK_UI_MANAGER_MENUITEM
,
1352 void vcalendar_done(void)
1354 MainWindow
*mainwin
= mainwindow_get_mainwindow();
1355 FolderView
*folderview
= NULL
;
1356 FolderItem
*fitem
= NULL
;
1358 icalmemory_free_ring();
1360 vcal_folder_free_data();
1362 if (mainwin
== NULL
)
1365 folderview
= mainwin
->folderview
;
1366 fitem
= folderview
->summaryview
->folder_item
;
1369 fitem
->folder
->klass
== vcal_folder_get_class()) {
1370 folderview_unselect(folderview
);
1371 summary_clear_all(folderview
->summaryview
);
1372 if (fitem
->folder
->klass
->item_closed
)
1373 fitem
->folder
->klass
->item_closed(fitem
);
1376 mimeview_unregister_viewer_factory(&vcal_viewer_factory
);
1377 folder_unregister_class(vcal_folder_get_class());
1378 vcal_folder_gtk_done();
1380 g_source_remove(alert_timeout_tag
);
1381 alert_timeout_tag
= 0;
1382 g_source_remove(scan_timeout_tag
);
1383 scan_timeout_tag
= 0;
1385 MENUITEM_REMUI_MANAGER(mainwin
->ui_manager
,mainwin
->action_group
, "Message/CreateMeeting", main_menu_id
);
1387 MENUITEM_REMUI_MANAGER(mainwin
->ui_manager
,mainwin
->action_group
, "Message/CreateMeeting", context_menu_id
);
1388 context_menu_id
= 0;