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 GdkRGBA uri_color
= {
69 MimeViewer mimeviewer
;
76 GtkWidget
*scrolledwin
;
84 GtkWidget
*description
;
92 GtkWidget
*unavail_box
;
95 static GtkActionEntry vcalendar_main_menu
[] = {{
96 "Message/CreateMeeting",
97 NULL
, N_("Create meeting from message..."), NULL
, NULL
, G_CALLBACK(create_meeting_from_message_cb_ui
)
100 static void create_meeting_from_message_cb_ui(GtkAction
*action
, gpointer data
)
102 MainWindow
*mainwin
= mainwindow_get_mainwindow();
103 SummaryView
*summaryview
= mainwin
->summaryview
;
104 GSList
*msglist
= summary_get_selected_msg_list(summaryview
);
105 FolderItem
*item
= NULL
;
110 if (summary_is_locked(summaryview
) || !msglist
) {
112 g_slist_free(msglist
);
115 total
= g_slist_length(msglist
);
117 msg
= g_strdup_printf(_("You are about to create %d "
118 "meetings, one by one. Do you "
119 "want to continue?"),
122 && alertpanel(_("Warning"), msg
, NULL
, _("_Cancel"),
123 NULL
, _("_Yes"), NULL
, NULL
, ALERTFOCUS_SECOND
)
124 != G_ALERTALTERNATE
) {
130 main_window_cursor_wait(summaryview
->mainwin
);
131 gtk_cmclist_freeze(GTK_CMCLIST(summaryview
->ctree
));
132 folder_item_update_freeze();
135 item
= summaryview
->folder_item
;
137 STATUSBAR_PUSH(mainwin
, _("Creating meeting..."));
139 for (cur
= msglist
; cur
; cur
= cur
->next
) {
140 MsgInfo
*msginfo
= procmsg_msginfo_get_full_info((MsgInfo
*)cur
->data
);
141 VCalEvent
*event
= NULL
;
144 if (MSG_IS_ENCRYPTED(msginfo
->flags
)) {
145 fp
= procmime_get_first_encrypted_text_content(msginfo
);
147 fp
= procmime_get_first_text_content(msginfo
);
152 time_t t
= time(NULL
);
155 gchar
*orgname
= NULL
;
156 gchar
*summary
= g_strdup(msginfo
->subject
? msginfo
->subject
:_("no subject"));
157 gchar
*description
= file_read_stream_to_str(fp
);
158 gchar
*dtstart
= g_strdup(icaltime_as_ical_string(icaltime_from_timet_with_zone(t
, FALSE
, NULL
)));
159 gchar
*dtend
= g_strdup(icaltime_as_ical_string(icaltime_from_timet_with_zone(t2
, FALSE
, NULL
)));
161 gchar
*tzid
= g_strdup("UTC");
163 gint method
= ICAL_METHOD_REQUEST
;
165 PrefsAccount
*account
= NULL
;
169 if (item
&& item
->prefs
&& item
->prefs
->enable_default_account
)
170 account
= account_find_from_id(item
->prefs
->default_account
);
173 account
= account_get_cur_account();
178 org
= g_strdup(account
->address
);
180 uid
= prefs_account_generate_msgid(account
);
182 event
= vcal_manager_new_event(uid
,
183 org
, NULL
, NULL
/*location*/, summary
, description
,
184 dtstart
, dtend
, recur
, tzid
, url
, method
, sequence
,
185 ICAL_VTODO_COMPONENT
);
188 /* hack to get default hours */
189 g_free(event
->dtstart
);
190 g_free(event
->dtend
);
191 event
->dtstart
= NULL
;
194 vcal_meeting_create(event
);
195 vcal_manager_free_event(event
);
209 procmsg_msginfo_free(&msginfo
);
212 statusbar_progress_all(0,0,0);
213 STATUSBAR_POP(mainwin
);
215 folder_item_update_thaw();
216 gtk_cmclist_thaw(GTK_CMCLIST(summaryview
->ctree
));
217 main_window_cursor_normal(summaryview
->mainwin
);
218 g_slist_free(msglist
);
221 static gchar
*get_tmpfile(VCalViewer
*vcalviewer
)
223 gchar
*tmpfile
= NULL
;
225 if (!vcalviewer
->tmpfile
) {
226 tmpfile
= procmime_get_tmp_file_name(vcalviewer
->mimeinfo
);
227 debug_print("creating %s\n", tmpfile
);
229 if (procmime_get_part(tmpfile
, vcalviewer
->mimeinfo
) < 0) {
230 g_warning("can't get mimepart file");
234 vcalviewer
->tmpfile
= tmpfile
;
237 return vcalviewer
->tmpfile
;
240 static GtkWidget
*vcal_viewer_get_widget(MimeViewer
*_mimeviewer
)
242 VCalViewer
*vcalviewer
= (VCalViewer
*) _mimeviewer
;
244 debug_print("vcal_viewer_get_widget\n");
245 gtk_widget_show_all(vcalviewer
->scrolledwin
);
246 return vcalviewer
->scrolledwin
;
249 static void vcal_viewer_clear_viewer(MimeViewer
*_mimeviewer
)
251 VCalViewer
*vcalviewer
= (VCalViewer
*) _mimeviewer
;
253 debug_print("vcal_viewer_clear_viewer\n");
255 g_free(vcalviewer
->file
);
256 vcalviewer
->file
= NULL
;
257 if (vcalviewer
->tmpfile
) {
258 debug_print("unlinking %s\n", vcalviewer
->tmpfile
);
259 g_unlink(vcalviewer
->tmpfile
);
260 g_free(vcalviewer
->tmpfile
);
261 vcalviewer
->tmpfile
= NULL
;
263 vcalviewer
->mimeinfo
= NULL
;
266 static VCalEvent
*vcalviewer_get_component(const gchar
*file
, const gchar
*charset
)
268 gchar
*compstr
= NULL
;
269 VCalEvent
*event
= NULL
;
275 g_return_val_if_fail(file
!= NULL
, NULL
);
277 if ((fp
= claws_fopen(file
, "rb")) == NULL
) {
278 FILE_OP_ERROR(file
, "claws_fopen");
282 array
= g_byte_array_new();
284 while ((n_read
= claws_fread(buf
, sizeof(gchar
), sizeof(buf
), fp
)) > 0) {
285 if (n_read
< sizeof(buf
) && claws_ferror(fp
))
287 g_byte_array_append(array
, (guchar
*)buf
, n_read
);
290 if (claws_ferror(fp
)) {
291 FILE_OP_ERROR("file stream", "claws_fread");
292 g_byte_array_free(array
, TRUE
);
298 g_byte_array_append(array
, (guchar
*)buf
, 1);
299 compstr
= (gchar
*)array
->data
;
300 g_byte_array_free(array
, FALSE
);
305 event
= vcal_get_event_from_ical(compstr
, charset
);
312 #define GTK_LABEL_SET_TEXT_TRIMMED(label, text) { \
313 gchar *tmplbl = strretchomp(g_strdup(text)); \
314 gtk_label_set_text(label, tmplbl); \
318 static void vcalviewer_answer_set_choices(VCalViewer
*vcalviewer
, VCalEvent
*event
, icalproperty_method method
);
320 static void vcalviewer_reset(VCalViewer
*vcalviewer
)
322 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->type
), "-");
323 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->who
), "-");
324 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->location
), "-");
325 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->summary
), "-");
326 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->description
), "-");
327 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->start
), "-");
328 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->end
), "-");
329 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->attendees
), "-");
330 g_free(vcalviewer
->url
);
331 vcalviewer
->url
= NULL
;
332 gtk_widget_hide(vcalviewer
->uribtn
);
333 vcalviewer_answer_set_choices(vcalviewer
, NULL
, ICAL_METHOD_CANCEL
);
336 static void vcalviewer_show_error(VCalViewer
*vcalviewer
, const gchar
*msg
)
338 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->type
), msg
);
341 static void vcalviewer_hide_error(VCalViewer
*vcalviewer
)
343 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->type
), "-");
346 static void vcalviewer_show_unavailable(VCalViewer
*vcalviewer
, gboolean visi
)
349 gtk_widget_show_all(vcalviewer
->unavail_box
);
351 gtk_widget_hide(vcalviewer
->unavail_box
);
354 static void vcalviewer_answer_set_choices(VCalViewer
*vcalviewer
, VCalEvent
*event
, icalproperty_method method
)
358 gtk_widget_hide(vcalviewer
->reedit
);
359 gtk_widget_hide(vcalviewer
->cancel
);
360 gtk_widget_hide(vcalviewer
->answer
);
361 gtk_widget_hide(vcalviewer
->button
);
363 for (i
= 0; i
< 3; i
++)
364 gtk_combo_box_text_remove(GTK_COMBO_BOX_TEXT(vcalviewer
->answer
), 0);
366 vcalviewer_show_unavailable(vcalviewer
, FALSE
);
368 if (method
== ICAL_METHOD_REQUEST
&& event
&& !event
->rec_occurrence
) {
369 PrefsAccount
*account
= vcal_manager_get_account_from_event(event
);
372 account
= vcal_manager_get_account_from_event(vcalviewer
->event
);
374 if (!account
&& event
) {
375 account
= account_get_default();
376 vcal_manager_update_answer(event
, account
->address
,
378 ICAL_PARTSTAT_NEEDSACTION
,
379 ICAL_CUTYPE_INDIVIDUAL
);
382 gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(vcalviewer
->answer
), _("Accept"));
383 gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(vcalviewer
->answer
), _("Tentatively accept"));
384 gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(vcalviewer
->answer
), _("Decline"));
385 gtk_widget_set_sensitive(vcalviewer
->answer
, TRUE
);
386 gtk_widget_set_sensitive(vcalviewer
->button
, TRUE
);
387 gtk_widget_show(vcalviewer
->answer
);
388 gtk_widget_show(vcalviewer
->button
);
390 gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(vcalviewer
->answer
), "-");
391 gtk_widget_set_sensitive(vcalviewer
->answer
, FALSE
);
392 gtk_widget_set_sensitive(vcalviewer
->button
, FALSE
);
395 gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(vcalviewer
->answer
), "-");
396 gtk_widget_set_sensitive(vcalviewer
->answer
, FALSE
);
397 gtk_widget_set_sensitive(vcalviewer
->button
, FALSE
);
399 gtk_combo_box_set_active(GTK_COMBO_BOX(vcalviewer
->answer
), 0);
401 if (event
&& event
->method
== ICAL_METHOD_REQUEST
) {
402 PrefsAccount
*account
= vcal_manager_get_account_from_event(event
);
403 gchar
*internal_ifb
= g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S
,
404 "vcalendar", G_DIR_SEPARATOR_S
,
405 "internal.ifb", NULL
);
406 gchar
*myfb
= file_read_to_str(internal_ifb
);
407 g_free(internal_ifb
);
409 icalparameter_partstat answer
=
410 vcal_manager_get_reply_for_attendee(event
, account
->address
);
412 if (answer
== ICAL_PARTSTAT_ACCEPTED
)
413 gtk_combo_box_set_active(GTK_COMBO_BOX(vcalviewer
->answer
), 0);
414 if (answer
== ICAL_PARTSTAT_TENTATIVE
)
415 gtk_combo_box_set_active(GTK_COMBO_BOX(vcalviewer
->answer
), 1);
416 if (answer
== ICAL_PARTSTAT_DECLINED
)
417 gtk_combo_box_set_active(GTK_COMBO_BOX(vcalviewer
->answer
), 2);
418 if (event
->dtstart
&& event
->dtend
&& myfb
&& *myfb
419 && answer
!= ICAL_PARTSTAT_ACCEPTED
420 && answer
!= ICAL_PARTSTAT_TENTATIVE
) {
421 if (!attendee_available(NULL
, event
->dtstart
, event
->dtend
, myfb
))
422 vcalviewer_show_unavailable(vcalviewer
, TRUE
);
428 g_free(vcalviewer
->url
);
429 if (event
&& event
->url
&& *(event
->url
)) {
430 vcalviewer
->url
= g_strdup(event
->url
);
431 gtk_widget_show(vcalviewer
->uribtn
);
433 vcalviewer
->url
= NULL
;
434 gtk_widget_hide(vcalviewer
->uribtn
);
438 static FolderItem
*vcalendar_get_current_item(void)
440 MainWindow
*mainwin
= mainwindow_get_mainwindow();
441 FolderItem
*item
= NULL
;
442 Folder
*folder
= folder_find_from_name (PLUGIN_NAME
, vcal_folder_get_class());
445 item
= mainwin
->summaryview
->folder_item
;
448 if (item
->folder
== folder
)
451 return folder
->inbox
;
457 void vcalviewer_display_event (VCalViewer
*vcalviewer
, VCalEvent
*event
)
460 gchar
*attendees
= NULL
;
461 gboolean mine
= FALSE
;
463 gboolean save_evt
= FALSE
;
464 FolderItem
*item
= vcalendar_get_current_item();
471 if (event
->type
== ICAL_VTODO_COMPONENT
) {
473 label
= g_strjoin(" ", _("You have a Todo item."),
474 _("Details follow:"), NULL
);
475 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->type
), label
);
477 } else if (event
->method
== ICAL_METHOD_REQUEST
) {
479 if (account_find_from_address(event
->organizer
, FALSE
)) {
480 label
= g_strjoin(" ", _("You have created a meeting."),
481 _("Details follow:"), NULL
);
482 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->type
), label
);
485 label
= g_strjoin(" ", _("You have been invited to a meeting."),
486 _("Details follow:"), NULL
);
487 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->type
), label
);
490 } else if (event
->method
== ICAL_METHOD_CANCEL
) {
492 label
= g_strjoin(" ",
493 _("A meeting to which you had been invited has been cancelled."),
494 _("Details follow:"), NULL
);
495 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->type
), label
);
497 vcalendar_refresh_folder_contents(item
);
498 } else if (event
->method
== ICAL_METHOD_REPLY
) {
499 /* don't change label */
502 label
= g_strjoin(" ", _("You have been forwarded an appointment."),
503 _("Details follow:"), NULL
);
504 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->type
), label
);
510 if (event
->orgname
&& *(event
->orgname
)
511 && event
->organizer
&& *(event
->organizer
)) {
512 gchar
*addr
= g_strconcat(event
->orgname
, " <", event
->organizer
, ">", NULL
);
513 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->who
), addr
);
515 } else if (event
->organizer
&& *(event
->organizer
)) {
516 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->who
), event
->organizer
);
518 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->who
), "-");
522 if (event
->location
&& *(event
->location
)) {
523 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->location
), event
->location
);
525 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->location
), "-");
529 if (event
->summary
&& *(event
->summary
)) {
530 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->summary
), event
->summary
);
532 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->summary
), "-");
536 if (event
->description
&& *(event
->description
)) {
537 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->description
), event
->description
);
539 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->description
), "-");
543 g_free(vcalviewer
->url
);
544 if (event
->url
&& *(event
->url
)) {
545 vcalviewer
->url
= g_strdup(event
->url
);
546 gtk_widget_show(vcalviewer
->uribtn
);
548 vcalviewer
->url
= NULL
;
549 gtk_widget_hide(vcalviewer
->uribtn
);
553 if (event
->start
&& *(event
->start
)) {
554 if (event
->recur
&& *(event
->recur
)) {
555 gchar
*tmp
= g_strdup_printf("%s <span weight=\"bold\">%s</span>",
556 _("(this event recurs)"), event
->start
);
557 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->start
), tmp
);
558 gtk_label_set_use_markup(GTK_LABEL(vcalviewer
->start
), TRUE
);
560 } else if (event
->rec_occurrence
) {
561 gchar
*tmp
= g_strdup_printf("%s <span weight=\"bold\">%s</span>",
562 _("(this event is part of a recurring event)"), event
->start
);
563 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->start
), tmp
);
564 gtk_label_set_use_markup(GTK_LABEL(vcalviewer
->start
), TRUE
);
567 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->start
), event
->start
);
570 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->start
), "-");
574 if (event
->end
&& *(event
->end
)) {
575 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->end
), event
->end
);
577 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->end
), "-");
581 attendees
= g_strdup("");
582 for (list
= vcal_manager_get_answers_emails(event
);
583 list
&& list
->data
; list
= list
->next
) {
584 gchar
*attendee
= (gchar
*)list
->data
;
585 gchar
*name
= vcal_manager_get_attendee_name(event
, attendee
);
586 gchar
*ename
= g_markup_printf_escaped("%s", name
?name
:"");
587 gchar
*eatt
= g_markup_printf_escaped("%s", attendee
);
588 icalparameter_partstat acode
= vcal_manager_get_reply_for_attendee(event
, attendee
);
589 gchar
*answer
= vcal_manager_get_reply_text_for_attendee(event
, attendee
);
590 gchar
*type
= vcal_manager_get_cutype_text_for_attendee(event
, attendee
);
593 tmp
= g_strdup_printf(
594 "%s%s<%s> (%s, <span%s>%s</span>)",
595 (ename
&& *(ename
))?ename
:"",
596 (ename
&& *(ename
))?" ":"",
597 (eatt
&& *(eatt
))?eatt
:"",
598 (type
&& *(type
))?type
:"",
599 (acode
!= ICAL_PARTSTAT_ACCEPTED
? " foreground=\"red\"":""),
600 (answer
&& *(answer
))?answer
:"");
601 e_len
= strlen(attendees
);
604 attendees
= g_realloc(attendees
, e_len
+n_len
+2);
605 *(attendees
+e_len
) = '\n';
606 strcpy(attendees
+e_len
+1, tmp
);
608 attendees
= g_realloc(attendees
, e_len
+n_len
+1);
609 strcpy(attendees
, tmp
);
619 if (attendees
&& *(attendees
)) {
620 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->attendees
), attendees
);
622 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->attendees
), "-");
625 gtk_label_set_use_markup(GTK_LABEL(vcalviewer
->attendees
), TRUE
);
629 if (event
->type
!= ICAL_VTODO_COMPONENT
)
630 vcalviewer_answer_set_choices(vcalviewer
, event
, event
->method
);
632 vcalviewer_answer_set_choices(vcalviewer
, event
, ICAL_METHOD_PUBLISH
);
634 vcalviewer_answer_set_choices(vcalviewer
, event
, ICAL_METHOD_REPLY
);
635 gtk_widget_show(vcalviewer
->reedit
);
636 gtk_widget_show(vcalviewer
->cancel
);
639 /* save if cancelled */
641 vcal_manager_save_event(event
, TRUE
);
644 gchar
*vcalviewer_get_uid_from_mimeinfo(MimeInfo
*mimeinfo
)
646 gchar
*compstr
= NULL
;
648 VCalEvent
*event
= NULL
;
650 compstr
= procmime_get_part_as_string(mimeinfo
, TRUE
);
652 event
= vcal_get_event_from_ical(compstr
, NULL
);
654 res
= g_strdup(event
->uid
);
656 vcal_manager_free_event(event
);
658 debug_print("got uid: %s\n", res
);
663 static void vcalviewer_get_request_values(VCalViewer
*vcalviewer
, MimeInfo
*mimeinfo
, gboolean is_todo
)
665 VCalEvent
*saved_event
= NULL
;
666 const gchar
*saveme
= procmime_mimeinfo_get_parameter(mimeinfo
, "vcalsave");
668 if (!vcalviewer
->event
)
671 /* see if we have it registered and more recent */
672 saved_event
= vcal_manager_load_event(vcalviewer
->event
->uid
);
673 if (saved_event
&& saved_event
->sequence
>= vcalviewer
->event
->sequence
) {
674 saved_event
->method
= vcalviewer
->event
->method
;
675 vcalviewer_display_event(vcalviewer
, saved_event
);
676 vcal_manager_free_event(saved_event
);
678 } else if (saved_event
) {
679 vcal_manager_free_event(saved_event
);
682 /* load it and register it */
684 if (!saveme
|| strcmp(saveme
,"no"))
685 vcal_manager_save_event(vcalviewer
->event
, FALSE
);
687 vcalviewer_display_event(vcalviewer
, vcalviewer
->event
);
690 static void vcalviewer_get_reply_values(VCalViewer
*vcalviewer
, MimeInfo
*mimeinfo
)
692 VCalEvent
*saved_event
= NULL
;
693 gchar
*attendee
= NULL
, *label
= NULL
;
694 Answer
*answer
= NULL
;
696 if (!vcalviewer
->event
)
699 if (!vcalviewer
->event
->answers
|| g_slist_length(vcalviewer
->event
->answers
) > 1) {
700 g_warning("strange, no answers or more than one");
703 if (vcalviewer
->event
->answers
) {
704 answer
= (Answer
*)vcalviewer
->event
->answers
->data
;
705 attendee
= g_strdup(answer
->attendee
);
710 label
= g_strjoin(" ",
711 _("You have received an answer to an unknown meeting proposal."),
712 _("Details follow:"), NULL
);
713 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->type
), label
);
715 label
= g_strdup_printf(_("You have received an answer to a meeting proposal.\n"
716 "%s has %s the invitation whose details follow:"),
717 attendee
, vcal_manager_answer_get_text(answer
->answer
));
718 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->type
), label
);
723 saved_event
= vcal_manager_load_event(vcalviewer
->event
->uid
);
724 if (saved_event
&& answer
) {
725 vcal_manager_update_answer(saved_event
,
726 answer
->attendee
, answer
->name
, answer
->answer
, answer
->cutype
);
727 vcal_manager_save_event(saved_event
, TRUE
);
728 saved_event
->method
= vcalviewer
->event
->method
;
729 vcalviewer_display_event(vcalviewer
, saved_event
);
730 vcal_manager_free_event(saved_event
);
732 } else if (saved_event
) {
733 vcal_manager_free_event(saved_event
);
736 if (vcalviewer
->event
->organizer
) {
737 if (vcalviewer
->event
->orgname
) {
738 gchar
*addr
= g_strconcat(vcalviewer
->event
->orgname
, " <",
739 vcalviewer
->event
->organizer
, ">", NULL
);
740 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->who
), addr
);
743 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->who
),
744 vcalviewer
->event
->organizer
);
747 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->who
), "-");
750 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->location
),
751 vcalviewer
->event
->location
?vcalviewer
->event
->location
:"-");
753 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->summary
),
754 vcalviewer
->event
->summary
?vcalviewer
->event
->summary
:"-");
756 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->description
),
757 vcalviewer
->event
->description
?vcalviewer
->event
->description
:"-");
759 g_free(vcalviewer
->url
);
760 if (vcalviewer
->event
->url
) {
761 vcalviewer
->url
= g_strdup(vcalviewer
->event
->url
);
762 gtk_widget_show(vcalviewer
->uribtn
);
764 vcalviewer
->url
= NULL
;
765 gtk_widget_hide(vcalviewer
->uribtn
);
768 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->start
),
769 vcalviewer
->event
->start
?vcalviewer
->event
->start
:"-");
770 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->end
),
771 vcalviewer
->event
->end
?vcalviewer
->event
->end
:"-");
773 GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer
->attendees
), "-");
775 vcalviewer_answer_set_choices(vcalviewer
, NULL
, ICAL_METHOD_REPLY
);
778 static void vcalviewer_get_event(VCalViewer
*vcalviewer
, MimeInfo
*mimeinfo
)
780 gchar
*tmpfile
= get_tmpfile(vcalviewer
);
781 const gchar
*charset
= procmime_mimeinfo_get_parameter(mimeinfo
, "charset");
784 charset
= CS_WINDOWS_1252
;
786 if (!strcasecmp(charset
, CS_ISO_8859_1
))
787 charset
= CS_WINDOWS_1252
;
789 if (vcalviewer
->event
) {
790 vcal_manager_free_event(vcalviewer
->event
);
791 vcalviewer
->event
= NULL
;
795 vcalviewer_reset(vcalviewer
);
796 vcalviewer_show_error(vcalviewer
, _("Error - could not get the calendar MIME part."));
800 vcalviewer
->event
= vcalviewer_get_component(tmpfile
, charset
);
801 if (!vcalviewer
->event
) {
802 vcalviewer_reset(vcalviewer
);
803 vcalviewer_show_error(vcalviewer
, _("Error - no calendar part found."));
807 if (vcalviewer
->event
->type
== ICAL_VTODO_COMPONENT
) {
808 vcalviewer_get_request_values(vcalviewer
, mimeinfo
, TRUE
);
809 } else if (vcalviewer
->event
->method
== ICAL_METHOD_REQUEST
||
810 vcalviewer
->event
->method
== ICAL_METHOD_PUBLISH
||
811 vcalviewer
->event
->method
== ICAL_METHOD_CANCEL
) {
812 vcalviewer_get_request_values(vcalviewer
, mimeinfo
, FALSE
);
813 } else if (vcalviewer
->event
->method
== ICAL_METHOD_REPLY
) {
814 vcalviewer_get_reply_values(vcalviewer
, mimeinfo
);
816 vcalviewer_reset(vcalviewer
);
817 vcalviewer_show_error(vcalviewer
, _("Error - Unknown calendar component type."));
821 static VCalViewer
*s_vcalviewer
= NULL
;
823 static void vcal_viewer_show_mimepart(MimeViewer
*_mimeviewer
, const gchar
*file
, MimeInfo
*mimeinfo
)
825 VCalViewer
*vcalviewer
= (VCalViewer
*) _mimeviewer
;
826 GtkAllocation allocation
;
830 s_vcalviewer
= vcalviewer
;
832 if (mimeinfo
== NULL
) {
833 vcal_viewer_clear_viewer(_mimeviewer
);
837 debug_print("vcal_viewer_show_mimepart : %s\n", file
);
839 vcal_viewer_clear_viewer(_mimeviewer
);
840 gtk_widget_show_all(vcalviewer
->scrolledwin
);
841 g_free(vcalviewer
->file
);
842 vcalviewer
->file
= g_strdup(file
);
843 vcalviewer
->mimeinfo
= mimeinfo
;
844 vcalviewer_hide_error(vcalviewer
);
845 vcalviewer_get_event(vcalviewer
, mimeinfo
);
847 gtk_widget_get_allocation(vcalviewer
->scrolledwin
, &allocation
);
848 gtk_widget_set_size_request(vcalviewer
->description
,
849 allocation
.width
- 200, -1);
850 gtk_label_set_line_wrap(GTK_LABEL(vcalviewer
->location
), TRUE
);
851 gtk_label_set_line_wrap(GTK_LABEL(vcalviewer
->summary
), TRUE
);
852 gtk_label_set_line_wrap(GTK_LABEL(vcalviewer
->description
), TRUE
);
853 gtk_label_set_line_wrap(GTK_LABEL(vcalviewer
->attendees
), FALSE
);
855 if (prefs_common_get_prefs()->textfont
) {
856 PangoFontDescription
*font_desc
;
858 font_desc
= pango_font_description_from_string
859 (prefs_common_get_prefs()->textfont
);
861 gtk_widget_override_font(
862 vcalviewer
->description
, font_desc
);
863 pango_font_description_free(font_desc
);
869 void vcalviewer_reload(FolderItem
*item
)
872 MainWindow
*mainwin
= mainwindow_get_mainwindow();
873 Folder
*folder
= folder_find_from_name (PLUGIN_NAME
, vcal_folder_get_class());
875 folder_item_scan(item
);
876 if (mainwin
&& mainwin
->summaryview
->folder_item
) {
877 FolderItem
*cur
= mainwin
->summaryview
->folder_item
;
878 if (cur
->folder
== folder
)
879 folder_item_scan(cur
);
881 if (mainwin
&& mainwin
->summaryview
->folder_item
== item
) {
882 debug_print("reload: %p, %p\n", (MimeViewer
*)s_vcalviewer
, s_vcalviewer
->mimeinfo
);
883 summary_redisplay_msg(mainwin
->summaryview
);
888 static void vcal_viewer_destroy_viewer(MimeViewer
*_mimeviewer
)
890 VCalViewer
*vcalviewer
= (VCalViewer
*) _mimeviewer
;
892 debug_print("vcal_viewer_destroy_viewer\n");
894 if (s_vcalviewer
== vcalviewer
)
896 vcal_viewer_clear_viewer(_mimeviewer
);
900 static gboolean
vcalviewer_reedit_cb(GtkButton
*widget
, gpointer data
)
902 VCalViewer
*vcalviewer
= (VCalViewer
*)data
;
903 gchar
* uid
= vcalviewer_get_uid_from_mimeinfo(vcalviewer
->mimeinfo
);
904 VCalEvent
*event
= NULL
;
906 s_vcalviewer
= vcalviewer
;
907 /* see if we have it registered and more recent */
908 event
= vcal_manager_load_event(uid
);
909 vcal_meeting_create(event
);
910 vcal_manager_free_event(event
);
914 static gboolean
vcalviewer_uribtn_cb(GtkButton
*widget
, gpointer data
)
916 VCalViewer
*vcalviewer
= (VCalViewer
*)data
;
919 open_uri(vcalviewer
->url
, prefs_common_get_uri_cmd());
924 void vcalendar_refresh_folder_contents(FolderItem
*item
)
926 g_return_if_fail(item
!= NULL
);
928 Folder
*folder
= folder_find_from_name (PLUGIN_NAME
, vcal_folder_get_class());
929 if (folder
&& item
->folder
== folder
) {
930 MainWindow
*mainwin
= mainwindow_get_mainwindow();
931 folder_item_scan(item
);
932 if (mainwin
->summaryview
->folder_item
== item
) {
933 summary_show(mainwin
->summaryview
, item
, FALSE
);
938 static void send_cancel_notify_toggled_cb(GtkToggleButton
*button
, gboolean
*data
)
940 *data
= gtk_toggle_button_get_active(button
);
943 void vcalendar_cancel_meeting(FolderItem
*item
, const gchar
*uid
)
945 VCalEvent
*event
= NULL
;
946 VCalMeeting
*meet
= NULL
;
949 Folder
*folder
= folder_find_from_name (PLUGIN_NAME
, vcal_folder_get_class());
950 gboolean redisp
= FALSE
;
951 GtkWidget
*send_notify_chkbtn
= gtk_check_button_new_with_label(_("Send a notification to the attendees"));
952 gboolean send_notify
= TRUE
;
954 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(send_notify_chkbtn
), TRUE
);
955 gtk_widget_show(send_notify_chkbtn
);
956 g_signal_connect(G_OBJECT(send_notify_chkbtn
), "toggled",
957 G_CALLBACK(send_cancel_notify_toggled_cb
),
960 val
= alertpanel_full(_("Cancel meeting"),
961 _("Are you sure you want to cancel this meeting?"),
962 NULL
, _("_No"), NULL
, _("_Yes"), NULL
, NULL
,
963 ALERTFOCUS_FIRST
, FALSE
, send_notify_chkbtn
, ALERT_WARNING
);
965 if (val
!= G_ALERTALTERNATE
)
968 event
= vcal_manager_load_event(uid
);
971 event
->method
= ICAL_METHOD_CANCEL
;
974 MainWindow
*mainwin
= mainwindow_get_mainwindow();
975 if (mainwin
->summaryview
->folder_item
== item
) {
977 summary_show(mainwin
->summaryview
, NULL
, FALSE
);
982 meet
= vcal_meeting_create_hidden(event
);
983 if (!vcal_meeting_send(meet
)) {
984 event
->method
= ICAL_METHOD_REQUEST
;
985 vcal_manager_save_event(event
, TRUE
);
986 vcal_manager_free_event(event
);
988 folder_item_scan(item
);
990 if (folder
&& redisp
) {
991 MainWindow
*mainwin
= mainwindow_get_mainwindow();
992 summary_show(mainwin
->summaryview
, item
, FALSE
);
998 vcal_manager_save_event(event
, TRUE
);
1000 file
= vcal_manager_get_event_file(event
->uid
);
1002 vcal_manager_free_event(event
);
1005 folder_item_scan(item
);
1006 if (folder
&& redisp
) {
1007 MainWindow
*mainwin
= mainwindow_get_mainwindow();
1008 summary_show(mainwin
->summaryview
, item
, FALSE
);
1014 static gboolean
vcalviewer_cancel_cb(GtkButton
*widget
, gpointer data
)
1016 VCalViewer
*vcalviewer
= (VCalViewer
*)data
;
1017 FolderItem
*item
= vcalendar_get_current_item();
1018 gchar
* uid
= vcalviewer_get_uid_from_mimeinfo(vcalviewer
->mimeinfo
);
1019 vcalendar_cancel_meeting(item
, uid
);
1023 static gboolean
vcalviewer_action_cb(GtkButton
*widget
, gpointer data
)
1025 VCalViewer
*vcalviewer
= (VCalViewer
*)data
;
1026 gint index
= gtk_combo_box_get_active(GTK_COMBO_BOX(vcalviewer
->answer
));
1027 icalparameter_partstat reply
[3] = {ICAL_PARTSTAT_ACCEPTED
, ICAL_PARTSTAT_TENTATIVE
, ICAL_PARTSTAT_DECLINED
};
1028 PrefsAccount
*account
= NULL
;
1029 VCalEvent
*saved_event
= NULL
, *event
= NULL
;
1030 debug_print("index chosen %d\n", index
);
1032 if (index
< 0 || index
> 2) {
1036 s_vcalviewer
= vcalviewer
;
1038 if (!vcalviewer
->event
) {
1039 g_warning("can't get event");
1043 /* see if we have it registered and more recent */
1044 event
= vcalviewer
->event
;
1045 saved_event
= vcal_manager_load_event(vcalviewer
->event
->uid
);
1046 if (saved_event
&& saved_event
->sequence
>= vcalviewer
->event
->sequence
) {
1047 saved_event
->method
= vcalviewer
->event
->method
;
1048 event
= saved_event
;
1049 } else if (saved_event
) {
1050 vcal_manager_free_event(saved_event
);
1053 account
= vcal_manager_get_account_from_event(event
);
1056 AlertValue val
= alertpanel_full(_("No account found"),
1057 _("You have no account matching any attendee.\n"
1058 "Do you want to reply anyway?"),
1059 NULL
, _("_Cancel"), NULL
, _("Reply anyway"), NULL
, NULL
,
1060 ALERTFOCUS_SECOND
, FALSE
, NULL
, ALERT_QUESTION
);
1061 if (val
== G_ALERTALTERNATE
) {
1062 account
= account_get_default();
1063 vcal_manager_update_answer(event
, account
->address
,
1065 ICAL_PARTSTAT_NEEDSACTION
,
1066 ICAL_CUTYPE_INDIVIDUAL
);
1069 vcal_manager_free_event(saved_event
);
1074 vcal_manager_update_answer(event
, account
->address
, account
->name
, reply
[index
], 0);
1076 if (event
->organizer
&& *(event
->organizer
) &&
1077 !vcal_manager_reply(account
, event
)) {
1078 g_warning("couldn't send reply");
1080 debug_print("no organizer, not sending answer\n");
1083 vcal_manager_save_event(event
, TRUE
);
1085 vcalviewer_display_event(vcalviewer
, event
);
1087 vcal_manager_free_event(saved_event
);
1091 #define TABLE_ADD_LINE(label_text, widget) { \
1092 gchar *tmpstr = g_strdup_printf("<span weight=\"bold\">%s</span>",\
1094 GtkWidget *label = gtk_label_new(tmpstr); \
1096 gtk_label_set_use_markup (GTK_LABEL (label), TRUE); \
1097 gtk_label_set_xalign (GTK_LABEL(label), 1.0); \
1098 gtk_grid_attach(GTK_GRID(vcalviewer->table), label, 0, i, 1, 1);\
1099 gtk_widget_set_hexpand(label, TRUE); \
1100 gtk_widget_set_halign(label, GTK_ALIGN_FILL); \
1101 gtk_grid_attach(GTK_GRID(vcalviewer->table), widget, \
1103 gtk_widget_set_hexpand(widget, TRUE); \
1104 gtk_widget_set_halign(widget, GTK_ALIGN_FILL); \
1105 if (GTK_IS_LABEL(widget)) { \
1106 gtk_label_set_use_markup(GTK_LABEL (widget), TRUE); \
1107 gtk_label_set_xalign(GTK_LABEL(widget), 0.0); \
1108 gtk_label_set_yalign(GTK_LABEL(widget), 0.0); \
1109 gtk_label_set_line_wrap_mode(GTK_LABEL(widget), \
1111 gtk_label_set_line_wrap(GTK_LABEL(widget), TRUE); \
1116 static gchar
*vcal_viewer_get_selection(MimeViewer
*_viewer
)
1118 VCalViewer
*viewer
= (VCalViewer
*)_viewer
;
1119 if (viewer
->summary
== NULL
)
1121 if (gtk_label_get_text(GTK_LABEL(viewer
->description
))
1122 && *(gtk_label_get_text(GTK_LABEL(viewer
->description
))) > 2) {
1124 if (gtk_label_get_selection_bounds(GTK_LABEL(viewer
->description
),
1126 gchar
*tmp
= g_strdup(gtk_label_get_text(
1127 GTK_LABEL(viewer
->description
))+start
);
1128 tmp
[end
-start
] = '\0';
1131 return g_strdup(gtk_label_get_text(GTK_LABEL(viewer
->description
)));
1134 else if (gtk_label_get_text(GTK_LABEL(viewer
->summary
))
1135 && *(gtk_label_get_text(GTK_LABEL(viewer
->summary
))) > 2)
1136 return g_strdup(gtk_label_get_text(GTK_LABEL(viewer
->summary
)));
1142 static gboolean
vcal_viewer_scroll_page(MimeViewer
*_viewer
, gboolean up
)
1144 VCalViewer
*viewer
= (VCalViewer
*)_viewer
;
1145 GtkAdjustment
*vadj
= gtk_scrolled_window_get_vadjustment(
1146 GTK_SCROLLED_WINDOW(viewer
->scrolledwin
));
1148 return gtkutils_scroll_page(viewer
->table
, vadj
, up
);
1151 static void vcal_viewer_scroll_one_line(MimeViewer
*_viewer
, gboolean up
)
1153 VCalViewer
*viewer
= (VCalViewer
*)_viewer
;
1154 GtkAdjustment
*vadj
= gtk_scrolled_window_get_vadjustment(
1155 GTK_SCROLLED_WINDOW(viewer
->scrolledwin
));
1157 gtkutils_scroll_one_line(viewer
->table
, vadj
, up
);
1160 MimeViewer
*vcal_viewer_create(void)
1162 VCalViewer
*vcalviewer
;
1164 GtkWidget
*hbox
= NULL
, *vbox
= NULL
;
1165 GtkWidget
*warning_img
;
1166 GtkWidget
*warning_label
;
1168 debug_print("Creating vcal view...\n");
1169 vcalviewer
= g_new0(VCalViewer
, 1);
1170 vcalviewer
->mimeviewer
.factory
= &vcal_viewer_factory
;
1172 vcalviewer
->mimeviewer
.get_widget
= vcal_viewer_get_widget
;
1173 vcalviewer
->mimeviewer
.show_mimepart
= vcal_viewer_show_mimepart
;
1174 vcalviewer
->mimeviewer
.clear_viewer
= vcal_viewer_clear_viewer
;
1175 vcalviewer
->mimeviewer
.destroy_viewer
= vcal_viewer_destroy_viewer
;
1176 vcalviewer
->mimeviewer
.get_selection
= vcal_viewer_get_selection
;
1177 vcalviewer
->mimeviewer
.scroll_page
= vcal_viewer_scroll_page
;
1178 vcalviewer
->mimeviewer
.scroll_one_line
= vcal_viewer_scroll_one_line
;
1180 vcalviewer
->table
= gtk_grid_new();
1181 vcalviewer
->type
= gtk_label_new("meeting");
1182 vcalviewer
->who
= gtk_label_new("who");
1183 vcalviewer
->start
= gtk_label_new("start");
1184 vcalviewer
->end
= gtk_label_new("end");
1185 vcalviewer
->location
= gtk_label_new("location");
1186 vcalviewer
->summary
= gtk_label_new("summary");
1187 vcalviewer
->description
= gtk_label_new("description");
1188 vcalviewer
->attendees
= gtk_label_new("attendees");
1190 vcalviewer
->answer
= gtk_combo_box_text_new();
1191 vcalviewer
->url
= NULL
;
1192 vcalviewer
->button
= gtk_button_new_with_label(_("Answer"));
1193 vcalviewer
->reedit
= gtk_button_new_with_label(_("Edit meeting..."));
1194 vcalviewer
->cancel
= gtk_button_new_with_label(_("Cancel meeting..."));
1195 vcalviewer
->uribtn
= gtk_button_new_with_label(_("Launch website"));
1196 vcalviewer
->unavail_box
= gtk_box_new(GTK_ORIENTATION_HORIZONTAL
, 6);
1197 warning_img
= gtk_image_new_from_icon_name
1198 ("dialog-warning", GTK_ICON_SIZE_SMALL_TOOLBAR
);
1199 warning_label
= gtk_label_new(_("You are already busy at this time."));
1201 gtk_box_pack_start(GTK_BOX(vcalviewer
->unavail_box
), warning_img
, FALSE
, FALSE
, 0);
1202 gtk_box_pack_start(GTK_BOX(vcalviewer
->unavail_box
), warning_label
, FALSE
, FALSE
, 0);
1204 hbox
= gtk_box_new(GTK_ORIENTATION_HORIZONTAL
, 6);
1205 gtk_box_pack_start(GTK_BOX(hbox
), vcalviewer
->answer
, FALSE
, FALSE
, 0);
1206 gtk_box_pack_start(GTK_BOX(hbox
), vcalviewer
->button
, FALSE
, FALSE
, 0);
1207 gtk_box_pack_start(GTK_BOX(hbox
), vcalviewer
->reedit
, FALSE
, FALSE
, 0);
1208 gtk_box_pack_start(GTK_BOX(hbox
), vcalviewer
->cancel
, FALSE
, FALSE
, 0);
1209 gtk_box_pack_start(GTK_BOX(hbox
), vcalviewer
->uribtn
, FALSE
, FALSE
, 0);
1211 vbox
= gtk_box_new(GTK_ORIENTATION_VERTICAL
, 6);
1212 gtk_box_pack_start(GTK_BOX(vbox
), hbox
, FALSE
, FALSE
, 0);
1213 gtk_box_pack_start(GTK_BOX(vbox
), vcalviewer
->unavail_box
, FALSE
, FALSE
, 0);
1215 vcalviewer_answer_set_choices(vcalviewer
, NULL
, ICAL_METHOD_REQUEST
);
1217 gtk_label_set_selectable(GTK_LABEL(vcalviewer
->type
), TRUE
);
1218 gtk_label_set_selectable(GTK_LABEL(vcalviewer
->who
), TRUE
);
1219 gtk_label_set_selectable(GTK_LABEL(vcalviewer
->start
), TRUE
);
1220 gtk_label_set_selectable(GTK_LABEL(vcalviewer
->end
), TRUE
);
1221 gtk_label_set_selectable(GTK_LABEL(vcalviewer
->location
), TRUE
);
1222 gtk_label_set_selectable(GTK_LABEL(vcalviewer
->summary
), TRUE
);
1223 gtk_label_set_selectable(GTK_LABEL(vcalviewer
->description
), TRUE
);
1224 gtk_label_set_selectable(GTK_LABEL(vcalviewer
->attendees
), TRUE
);
1226 g_signal_connect(G_OBJECT(vcalviewer
->button
), "clicked",
1227 G_CALLBACK(vcalviewer_action_cb
), vcalviewer
);
1229 g_signal_connect(G_OBJECT(vcalviewer
->reedit
), "clicked",
1230 G_CALLBACK(vcalviewer_reedit_cb
), vcalviewer
);
1232 g_signal_connect(G_OBJECT(vcalviewer
->cancel
), "clicked",
1233 G_CALLBACK(vcalviewer_cancel_cb
), vcalviewer
);
1235 g_signal_connect(G_OBJECT(vcalviewer
->uribtn
), "clicked",
1236 G_CALLBACK(vcalviewer_uribtn_cb
), vcalviewer
);
1238 TABLE_ADD_LINE(_("Event:"), vcalviewer
->type
);
1239 TABLE_ADD_LINE(_("Organizer:"), vcalviewer
->who
);
1240 TABLE_ADD_LINE(_("Location:"), vcalviewer
->location
);
1241 TABLE_ADD_LINE(_("Summary:"), vcalviewer
->summary
);
1242 TABLE_ADD_LINE(_("Starting:"), vcalviewer
->start
);
1243 TABLE_ADD_LINE(_("Ending:"), vcalviewer
->end
);
1244 TABLE_ADD_LINE(_("Description:"), vcalviewer
->description
);
1245 TABLE_ADD_LINE(_("Attendees:"), vcalviewer
->attendees
);
1246 gtk_label_set_line_wrap(GTK_LABEL(vcalviewer
->attendees
), FALSE
);
1247 TABLE_ADD_LINE(_("Action:"), vbox
);
1249 vcalviewer
->scrolledwin
= gtk_scrolled_window_new(NULL
, NULL
);
1250 gtk_widget_set_name(GTK_WIDGET(vcalviewer
->scrolledwin
), "vcalendar_viewer");
1251 gtk_container_add(GTK_CONTAINER(vcalviewer
->scrolledwin
),
1253 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(vcalviewer
->scrolledwin
),
1255 GTK_POLICY_AUTOMATIC
);
1257 gtk_widget_show_all(vcalviewer
->scrolledwin
);
1258 return (MimeViewer
*) vcalviewer
;
1261 static gchar
*content_types
[] =
1262 {"text/calendar", NULL
};
1264 MimeViewerFactory vcal_viewer_factory
=
1271 static gint alert_timeout_tag
= 0;
1272 static gint scan_timeout_tag
= 0;
1274 static gboolean
vcal_webcal_check(gpointer data
)
1276 Folder
*root
= folder_find_from_name (PLUGIN_NAME
, vcal_folder_get_class());
1278 if (prefs_common_get_prefs()->work_offline
)
1281 manual_update
= FALSE
;
1282 folderview_check_new(root
);
1283 manual_update
= TRUE
;
1287 static guint context_menu_id
= 0;
1288 static guint main_menu_id
= 0;
1290 void vcalendar_init(void)
1292 MainWindow
*mainwin
= mainwindow_get_mainwindow();
1293 Folder
*folder
= NULL
;
1294 gchar
*directory
= g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S
,
1297 if (!is_dir_exist(directory
) && make_dir (directory
) != 0) {
1306 mimeview_register_viewer_factory(&vcal_viewer_factory
);
1307 folder_register_class(vcal_folder_get_class());
1309 folder
= folder_find_from_name (PLUGIN_NAME
, vcal_folder_get_class());
1311 START_TIMING("creating folder");
1312 folder
= folder_new(vcal_folder_get_class(), PLUGIN_NAME
, NULL
);
1313 folder
->klass
->create_tree(folder
);
1315 folder_scan_tree(folder
, TRUE
);
1319 if (!folder
->inbox
) {
1320 folder
->klass
->create_tree(folder
);
1321 folder_scan_tree(folder
, TRUE
);
1323 if (folder
->klass
->scan_required(folder
, folder
->inbox
)) {
1324 START_TIMING("scanning folder");
1325 folder_item_scan(folder
->inbox
);
1329 vcal_folder_gtk_init();
1331 alert_timeout_tag
= g_timeout_add(60*1000,
1332 (GSourceFunc
)vcal_meeting_alert_check
,
1334 scan_timeout_tag
= g_timeout_add(3600*1000,
1335 (GSourceFunc
)vcal_webcal_check
,
1337 if (prefs_common_get_prefs()->enable_color
) {
1338 uri_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;