From: <pa...@us...> - 2008-08-09 14:27:40
|
Revision: 549 http://osmo-pim.svn.sourceforge.net/osmo-pim/?rev=549&view=rev Author: pasp Date: 2008-08-09 14:27:48 +0000 (Sat, 09 Aug 2008) Log Message: ----------- * Added framework for exporting calendar events to iCal file. Non functional yet due to libical problems. Modified Paths: -------------- trunk/src/calendar.c trunk/src/calendar_ical.c trunk/src/calendar_ical.h trunk/src/gui.h trunk/src/options_prefs.c trunk/src/options_prefs.h Modified: trunk/src/calendar.c =================================================================== --- trunk/src/calendar.c 2008-08-05 21:22:30 UTC (rev 548) +++ trunk/src/calendar.c 2008-08-09 14:27:48 UTC (rev 549) @@ -1407,6 +1407,15 @@ /*------------------------------------------------------------------------------*/ void +popup_ical_export_cb (gpointer user_data) +{ + GUI *appGUI = (GUI *) user_data; + ical_export (appGUI); +} + +/*------------------------------------------------------------------------------*/ + +void gui_create_calendar(GtkWidget *notebook, GUI *appGUI) { GtkWidget *vbox1; @@ -1427,6 +1436,7 @@ GtkWidget *popup_menu_add_task_entry; GtkWidget *popup_menu_separator; GtkWidget *popup_menu_browse_notes; +GtkWidget *popup_menu_ical_export; gchar tmpbuf[BUFFER_SIZE]; @@ -1583,6 +1593,14 @@ G_CALLBACK(popup_browse_notes_cb), appGUI); gtk_widget_show(popup_menu_browse_notes); +#ifdef HAVE_LIBICAL + popup_menu_ical_export = gtk_menu_item_new_with_label(_("Export to iCal file")); + gtk_menu_shell_append(GTK_MENU_SHELL(appGUI->cal->popup_menu), popup_menu_ical_export); + g_signal_connect_swapped(G_OBJECT(popup_menu_ical_export), "activate", + G_CALLBACK(popup_ical_export_cb), appGUI); + gtk_widget_show(popup_menu_ical_export); +#endif /* HAVE_LIBICAL */ + } appGUI->cal->date_label = gtk_label_new (NULL); Modified: trunk/src/calendar_ical.c =================================================================== --- trunk/src/calendar_ical.c 2008-08-05 21:22:30 UTC (rev 548) +++ trunk/src/calendar_ical.c 2008-08-09 14:27:48 UTC (rev 549) @@ -24,6 +24,7 @@ #include "calendar.h" #include "gui_utils.h" #include "calendar_notes.h" +#include "calendar_widget.h" #include "options_prefs.h" #include "options_gui_calendar.h" #include "stock_icons.h" @@ -31,6 +32,7 @@ #ifdef HAVE_LIBICAL #include <ical.h> +/*#include <icalss.h>*/ #undef PACKAGE #undef PACKAGE_BUGREPORT #undef PACKAGE_NAME @@ -859,5 +861,651 @@ /*------------------------------------------------------------------------------*/ +void +ical_export_window_close_cb (GtkWidget *widget, GdkEvent *event, gpointer user_data) { + + GUI *appGUI = (GUI *)user_data; + + config.ical_export_pane_pos = gtk_paned_get_position(GTK_PANED(appGUI->cal->ical_export_vpaned)); + + gtk_widget_destroy (appGUI->cal->ical_export_window); +} + +/*------------------------------------------------------------------------------*/ + +void +button_ical_export_window_close_cb (GtkButton *button, gpointer user_data) { + + ical_export_window_close_cb (GTK_WIDGET(button), NULL, user_data); +} + +/*------------------------------------------------------------------------------*/ + +gint +ical_export_key_press_cb (GtkWidget *widget, GdkEventKey *event, gpointer user_data) { + + switch(event->keyval) { + + case GDK_Escape: + ical_export_window_close_cb (GTK_WIDGET(widget), NULL, user_data); + return TRUE; + } + + return FALSE; +} + +/*------------------------------------------------------------------------------*/ + +void +update_notes_marks (GuiCalendar *calendar, GUI *appGUI) { + +guint year, month, day, i; + + gui_calendar_clear_marks (GUI_CALENDAR(calendar)); + gui_calendar_get_date (GUI_CALENDAR (calendar), + &year, &month, &day); + for (i = 1; i <= g_date_get_days_in_month (month + 1, year); i++) { + if (check_note(i, month+1, year, appGUI) == TRUE) { + gui_calendar_mark_day (GUI_CALENDAR (calendar), i); + } + } +} + +/*------------------------------------------------------------------------------*/ + +void +use_date_period_cb (GtkToggleButton *togglebutton, gpointer user_data) { + +gboolean state; + + GUI *appGUI = (GUI *)user_data; + + state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (togglebutton)); + + gtk_widget_set_sensitive (appGUI->cal->export_end_period_calendar, state); + + if (state == TRUE) { + update_notes_marks (GUI_CALENDAR (appGUI->cal->export_end_period_calendar), appGUI); + } else { + gui_calendar_clear_marks (GUI_CALENDAR (appGUI->cal->export_end_period_calendar)); + } +} + +/*------------------------------------------------------------------------------*/ + +void +select_file_cb (GtkWidget *widget, gpointer data) { + +GtkWidget *dialog; +gchar f_filename[PATH_MAX]; + + GUI *appGUI = (GUI *)data; + + dialog = gtk_file_chooser_dialog_new(_("Select output file"), + GTK_WINDOW(appGUI->main_window), + GTK_FILE_CHOOSER_ACTION_SAVE, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, + NULL); + + gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER); + gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(dialog), FALSE); + gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT); + + if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { + + g_strlcpy (f_filename, gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)), PATH_MAX-1); + + if (g_str_has_suffix (f_filename, ".ics") == FALSE && + g_str_has_suffix (f_filename, ".ICS") == FALSE) { + g_strlcat(f_filename, ".ics", PATH_MAX-1); + } + gtk_entry_set_text (GTK_ENTRY(appGUI->cal->output_file_entry), f_filename); + } + + gtk_widget_destroy(dialog); +} + +/*------------------------------------------------------------------------------*/ + +void +calendar_begin_end_day_selected_cb (GuiCalendar *calendar, gpointer user_data) +{ + GUI *appGUI = (GUI *) user_data; + update_notes_marks (GUI_CALENDAR (calendar), appGUI); +} + +/*------------------------------------------------------------------------------*/ + +gint +get_export_items (GUI *appGUI) { + +GtkTreeIter iter; +gint i; + + i = 0; + while (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (appGUI->cal->export_events_list_store), &iter, NULL, i++)); + + return i-1; +} + +/*------------------------------------------------------------------------------*/ + +void +add_export_item_to_list (guint day, guint month, guint year, GUI *appGUI) { + +GtkTreeIter iter; +gchar *text; +guint32 julian_day; +gint i; +gchar tmpbuf[BUFFER_SIZE]; + + if (check_note(day, month+1, year, appGUI) == TRUE) { + julian_day = date_to_julian (day, month, year); + text = get_note(day, month+1, year, appGUI); + + i = 0; + do { + tmpbuf[i] = text[i]; + i++; + } while (text[i] != '\n' && i < BUFFER_SIZE); + + tmpbuf[i] = '\0'; + + gtk_list_store_append (appGUI->cal->export_events_list_store, &iter); + gtk_list_store_set (appGUI->cal->export_events_list_store, &iter, + IE_COLUMN_DATE, julian_to_str (julian_day, DATE_FULL), + IE_COLUMN_DATE_JULIAN, julian_day, + IE_COLUMN_SUMMARY, tmpbuf, + IE_COLUMN_DESCRIPTION, text, -1); + } +} + +/*------------------------------------------------------------------------------*/ + +void +button_add_date_cb (GtkButton *button, gpointer user_data) { + +guint year, month, day; +guint32 julian_day, begin_julian_day, end_julian_day, i; +DATE *date; + + GUI *appGUI = (GUI *) user_data; + + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (appGUI->cal->use_date_period_checkbutton)) == FALSE) { + + gui_calendar_get_date (GUI_CALENDAR (appGUI->cal->export_begin_period_calendar), &year, &month, &day); + add_export_item_to_list (day, month, year, appGUI); + + } else { + + gui_calendar_get_date (GUI_CALENDAR (appGUI->cal->export_begin_period_calendar), &year, &month, &day); + begin_julian_day = date_to_julian (day, month, year); + gui_calendar_get_date (GUI_CALENDAR (appGUI->cal->export_end_period_calendar), &year, &month, &day); + end_julian_day = date_to_julian (day, month, year); + + if (begin_julian_day > end_julian_day) { + julian_day = begin_julian_day; + begin_julian_day = end_julian_day; + end_julian_day = julian_day; + } + + for (i = begin_julian_day; i <= end_julian_day; i++) { + date = julian_to_date (i); + if (date != NULL) { + add_export_item_to_list (date->day, date->month - 1, date->year, appGUI); + g_free (date); + } + } + + } +} + +/*------------------------------------------------------------------------------*/ + +void +summary_edited_cb (GtkCellRendererText *renderer, gchar *path, + gchar *new_text, gpointer user_data) { + +GtkTreeIter iter; +GtkTreeModel *model; + + GUI *appGUI = (GUI *)user_data; + + if (g_ascii_strcasecmp (new_text, "") != 0) { + model = gtk_tree_view_get_model (GTK_TREE_VIEW(appGUI->cal->export_events_list_treeview)); + if (gtk_tree_model_get_iter_from_string (model, &iter, path)) { + gtk_list_store_set(appGUI->cal->export_events_list_store, &iter, IE_COLUMN_SUMMARY, new_text, -1); + } + } +} + +/*------------------------------------------------------------------------------*/ + +void +button_remove_date_cb (GtkButton *button, gpointer user_data) { + +GtkTreeIter iter; +GtkTreePath *path; + + GUI *appGUI = (GUI *)user_data; + + gtk_tree_view_get_cursor (GTK_TREE_VIEW (appGUI->cal->export_events_list_treeview), &path, NULL); + + if (path != NULL) { + gtk_tree_model_get_iter (GTK_TREE_MODEL(appGUI->cal->export_events_list_store), &iter, path); + gtk_list_store_remove (appGUI->cal->export_events_list_store, &iter); + } +} + +/*------------------------------------------------------------------------------*/ + +void +button_clear_list_cb (GtkButton *button, gpointer user_data) { + +gint response; +gchar tmpbuf[BUFFER_SIZE]; + + GUI *appGUI = (GUI *)user_data; + + if (!get_export_items (appGUI)) return; + + sprintf (tmpbuf, "%s\n\n%s", _("The list will be cleared and all entries will be lost."), _("Are you sure?")); + + response = gui_create_dialog(GTK_MESSAGE_QUESTION, tmpbuf, GTK_WINDOW(appGUI->cal->ical_export_window)); + + if (response == GTK_RESPONSE_YES) { + gtk_list_store_clear (appGUI->cal->export_events_list_store); + } +} + +/*------------------------------------------------------------------------------*/ + +void +export_list_item_selected (GtkTreeSelection *selection, gpointer user_data) { + +GtkTreeIter iter; +GtkTextIter titer; +GtkTreeModel *model; +GtkTextBuffer *text_buffer; +gchar *text; + + GUI *appGUI = (GUI *)user_data; + + text_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW(appGUI->cal->export_day_note_textview)); + gui_clear_text_buffer (text_buffer, &titer); + + if (gtk_tree_selection_get_selected (selection, &model, &iter)) { + gtk_tree_model_get (model, &iter, IE_COLUMN_DESCRIPTION, &text, -1); + gtk_text_buffer_insert(text_buffer, &titer, text, -1); + g_free (text); + } +} + +/*------------------------------------------------------------------------------*/ + +void +ical_export_cb (GtkButton *button, gpointer user_data) { + +GtkTreeIter iter; +gchar *filename; +gint i; +guint32 julian_day; +gchar *summary, *description; +/*icalcomponent *event;*/ +/*icalproperty *prop;*/ +/*icalparameter *param;*/ +/*icalfileset *ics_file;*/ +/*struct icaltimetype atime;*/ + + GUI *appGUI = (GUI *)user_data; + + filename = g_strdup (gtk_entry_get_text(GTK_ENTRY(appGUI->cal->output_file_entry))); + + if (get_export_items(appGUI) == 0 || strlen(filename) == 0) { + g_free (filename); + return; + } + + /*ics_file = icalset_new_file (filename); */ + + /*if (ics_file == NULL) {*/ + /*ical_export_window_close_cb (NULL, NULL, user_data);*/ + /*g_free (filename);*/ + /*return;*/ + /*}*/ + + i = 0; + + while (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (appGUI->cal->export_events_list_store), &iter, NULL, i++)) { + + gtk_tree_model_get (GTK_TREE_MODEL (appGUI->cal->export_events_list_store), &iter, + IE_COLUMN_DATE_JULIAN, &julian_day, + IE_COLUMN_SUMMARY, &summary, + IE_COLUMN_DESCRIPTION, &description, -1); + + /*printf ("%d: %d, %s, %s\n", i, julian_day, summary, description);*/ + + /*event = icalcomponent_new(ICAL_VCALENDAR_COMPONENT);*/ + + /*atime.day = 1;*/ + /*atime.month = 8;*/ + /*atime.year = 2008;*/ + /*atime.is_date = 1;*/ + /*prop = icalproperty_new_dtstamp(atime);*/ + /*icalcomponent_add_property(event, prop);*/ + + /*prop = icalproperty_new_uid("clay.ll.pl");*/ + /*icalcomponent_add_property(event,prop);*/ + + /*prop=icalproperty_new_organizer("ch...@ex..."); */ + /*param = icalparameter_new_role(ICAL_ROLE_CHAIR);*/ + /*icalproperty_add_parameter(prop, param);*/ + /*icalcomponent_add_property(event,prop);*/ + + /*icalset_add_component (ics_file, event);*/ + /*icalfileset_commit (ics_file);*/ + + g_free (summary); + g_free (description); + } + + g_free (filename); + ical_export_window_close_cb (NULL, NULL, user_data); +} + +/*------------------------------------------------------------------------------*/ + +void +ical_export (GUI *appGUI) { + +GtkWidget *vbox1, *vbox2; +GtkWidget *hseparator; +GtkWidget *hbuttonbox; +GtkWidget *export_button; +GtkWidget *cancel_button; +GtkWidget *hbox1, *hbox2, *hbox3, *hbox4; +GtkWidget *frame; +GtkWidget *alignment; +GtkWidget *browse_dir_button; +GtkWidget *label; +GtkWidget *add_item_button; +GtkWidget *remove_item_button; +GtkWidget *clear_list_button; +GtkWidget *el_scrolledwindow; +GtkWidget *dn_scrolledwindow; +GtkTreeViewColumn *column; +GtkCellRenderer *renderer; +gchar tmpbuf[BUFFER_SIZE]; + + return; /* remove me */ + + appGUI->cal->ical_export_window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_window_set_title (GTK_WINDOW (appGUI->cal->ical_export_window), _("iCalendar export")); + gtk_window_set_position (GTK_WINDOW (appGUI->cal->ical_export_window), GTK_WIN_POS_CENTER_ON_PARENT); + gtk_window_set_default_size (GTK_WINDOW(appGUI->cal->ical_export_window), 600, 650); + gtk_window_set_modal (GTK_WINDOW (appGUI->cal->ical_export_window), TRUE); + g_signal_connect (G_OBJECT (appGUI->cal->ical_export_window), "delete_event", + G_CALLBACK(ical_export_window_close_cb), appGUI); + gtk_window_set_transient_for(GTK_WINDOW(appGUI->cal->ical_export_window), GTK_WINDOW(appGUI->main_window)); + gtk_container_set_border_width (GTK_CONTAINER (appGUI->cal->ical_export_window), 8); + g_signal_connect (G_OBJECT (appGUI->cal->ical_export_window), "key_press_event", + G_CALLBACK (ical_export_key_press_cb), appGUI); + + vbox1 = gtk_vbox_new (FALSE, 0); + gtk_widget_show (vbox1); + gtk_container_add (GTK_CONTAINER (appGUI->cal->ical_export_window), vbox1); + + frame = gtk_frame_new (NULL); + gtk_widget_show (frame); + gtk_box_pack_start (GTK_BOX (vbox1), frame, TRUE, TRUE, 0); + gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_NONE); + + sprintf(tmpbuf, "<b>%s:</b>", _("Day Selector")); + label = gtk_label_new (tmpbuf); + gtk_widget_show (label); + gtk_frame_set_label_widget (GTK_FRAME (frame), label); + gtk_label_set_use_markup (GTK_LABEL (label), TRUE); + + alignment = gtk_alignment_new (0.5, 0.5, 1, 1); + gtk_widget_show (alignment); + gtk_container_add (GTK_CONTAINER (frame), alignment); + gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 0, 0, 12, 0); + + vbox2 = gtk_vbox_new (FALSE, 8); + gtk_widget_show (vbox2); + gtk_container_add (GTK_CONTAINER (alignment), vbox2); + + hbox1 = gtk_hbox_new (FALSE, 8); + gtk_widget_show (hbox1); + gtk_box_pack_start (GTK_BOX (vbox2), hbox1, FALSE, TRUE, 0); + + appGUI->cal->export_begin_period_calendar = gui_calendar_new (); + gtk_widget_show (appGUI->cal->export_begin_period_calendar); + gui_calendar_set_cursor_type (GUI_CALENDAR (appGUI->cal->export_begin_period_calendar), CURSOR_BLOCK); + gui_calendar_set_selector_alpha (GUI_CALENDAR (appGUI->cal->export_begin_period_calendar), config.selector_alpha); + gui_calendar_set_today_marker_type (GUI_CALENDAR (appGUI->cal->export_begin_period_calendar), config.today_marker_type); + gui_calendar_set_today_marker_color (GUI_CALENDAR (appGUI->cal->export_begin_period_calendar), config.mark_current_day_color); + gui_calendar_set_today_marker_alpha (GUI_CALENDAR (appGUI->cal->export_begin_period_calendar), config.mark_current_day_alpha); + gui_calendar_set_display_options (GUI_CALENDAR (appGUI->cal->export_begin_period_calendar), + (config.display_options & !GUI_CALENDAR_NO_MONTH_CHANGE) | + GUI_CALENDAR_SHOW_HEADING | GUI_CALENDAR_SHOW_DAY_NAMES | + (config.display_options & GUI_CALENDAR_WEEK_START_MONDAY)); + gtk_box_pack_start (GTK_BOX (hbox1), appGUI->cal->export_begin_period_calendar, TRUE, TRUE, 0); + update_notes_marks (GUI_CALENDAR (appGUI->cal->export_begin_period_calendar), appGUI); + g_signal_connect (G_OBJECT (appGUI->cal->export_begin_period_calendar), "day-selected", + G_CALLBACK (calendar_begin_end_day_selected_cb), appGUI); + g_signal_connect (G_OBJECT (appGUI->cal->export_begin_period_calendar), "day-selected-double-click", + G_CALLBACK (button_add_date_cb), appGUI); + + appGUI->cal->export_end_period_calendar = gui_calendar_new (); + gtk_widget_show (appGUI->cal->export_end_period_calendar); + gui_calendar_set_cursor_type (GUI_CALENDAR (appGUI->cal->export_end_period_calendar), CURSOR_BLOCK); + gui_calendar_set_selector_alpha (GUI_CALENDAR (appGUI->cal->export_end_period_calendar), config.selector_alpha); + gui_calendar_set_today_marker_type (GUI_CALENDAR (appGUI->cal->export_end_period_calendar), config.today_marker_type); + gui_calendar_set_today_marker_color (GUI_CALENDAR (appGUI->cal->export_end_period_calendar), config.mark_current_day_color); + gui_calendar_set_today_marker_alpha (GUI_CALENDAR (appGUI->cal->export_end_period_calendar), config.mark_current_day_alpha); + gui_calendar_set_display_options (GUI_CALENDAR (appGUI->cal->export_end_period_calendar), + (config.display_options & !GUI_CALENDAR_NO_MONTH_CHANGE) | + GUI_CALENDAR_SHOW_HEADING | GUI_CALENDAR_SHOW_DAY_NAMES | + (config.display_options & GUI_CALENDAR_WEEK_START_MONDAY)); + gtk_box_pack_start (GTK_BOX (hbox1), appGUI->cal->export_end_period_calendar, TRUE, TRUE, 0); + gtk_widget_set_sensitive (appGUI->cal->export_end_period_calendar, FALSE); + g_signal_connect (G_OBJECT (appGUI->cal->export_end_period_calendar), "day-selected", + G_CALLBACK (calendar_begin_end_day_selected_cb), appGUI); + g_signal_connect (G_OBJECT (appGUI->cal->export_end_period_calendar), "day-selected-double-click", + G_CALLBACK (button_add_date_cb), appGUI); + + hbox2 = gtk_hbox_new (FALSE, 0); + gtk_widget_show (hbox2); + gtk_box_pack_start (GTK_BOX (vbox2), hbox2, FALSE, TRUE, 0); + + appGUI->cal->use_date_period_checkbutton = gtk_check_button_new_with_mnemonic (_("Use date period")); + gtk_widget_show (appGUI->cal->use_date_period_checkbutton); + GTK_WIDGET_UNSET_FLAGS (appGUI->cal->use_date_period_checkbutton, GTK_CAN_FOCUS); + g_signal_connect (G_OBJECT (appGUI->cal->use_date_period_checkbutton), "toggled", + G_CALLBACK (use_date_period_cb), appGUI); + gtk_box_pack_start (GTK_BOX (hbox2), appGUI->cal->use_date_period_checkbutton, FALSE, FALSE, 0); + + if (config.default_stock_icons) { + add_item_button = gtk_button_new_from_stock (GTK_STOCK_ADD); + } else { + add_item_button = gtk_button_new_from_stock (OSMO_STOCK_BUTTON_ADD); + } + gtk_widget_show (add_item_button); + GTK_WIDGET_UNSET_FLAGS (add_item_button, GTK_CAN_FOCUS); + gtk_box_pack_end (GTK_BOX (hbox2), add_item_button, FALSE, FALSE, 0); + g_signal_connect(add_item_button, "clicked", G_CALLBACK(button_add_date_cb), appGUI); + + appGUI->cal->ical_export_vpaned = gtk_vpaned_new (); + gtk_widget_show (appGUI->cal->ical_export_vpaned); + gtk_box_pack_start (GTK_BOX (vbox2), appGUI->cal->ical_export_vpaned, TRUE, TRUE, 0); + gtk_paned_set_position (GTK_PANED (appGUI->cal->ical_export_vpaned), 0); + gtk_paned_set_position(GTK_PANED(appGUI->cal->ical_export_vpaned), config.ical_export_pane_pos); + + el_scrolledwindow = gtk_scrolled_window_new (NULL, NULL); + gtk_widget_show (el_scrolledwindow); + gtk_paned_pack1 (GTK_PANED (appGUI->cal->ical_export_vpaned), el_scrolledwindow, TRUE, TRUE); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (el_scrolledwindow), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (el_scrolledwindow), GTK_SHADOW_IN); + + appGUI->cal->export_events_list_store = gtk_list_store_new (ICAL_EXPORT_NUM_COLUMNS, + G_TYPE_STRING, G_TYPE_INT, + G_TYPE_STRING, G_TYPE_STRING); + + appGUI->cal->export_events_list_treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL(appGUI->cal->export_events_list_store)); + gtk_widget_show (appGUI->cal->export_events_list_treeview); + gtk_container_add (GTK_CONTAINER (el_scrolledwindow), appGUI->cal->export_events_list_treeview); + gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (appGUI->cal->export_events_list_treeview), TRUE); + + appGUI->cal->export_events_list_selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (appGUI->cal->export_events_list_treeview)); + g_signal_connect (G_OBJECT(appGUI->cal->export_events_list_selection), "changed", + G_CALLBACK(export_list_item_selected), appGUI); + + renderer = gtk_cell_renderer_text_new (); + column = gtk_tree_view_column_new_with_attributes (_("Date"), + renderer, + "text", IE_COLUMN_DATE, + NULL); + gtk_tree_view_column_set_visible (column, TRUE); + gtk_tree_view_append_column (GTK_TREE_VIEW(appGUI->cal->export_events_list_treeview), column); + + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes(NULL, + renderer, + "text", IE_COLUMN_DATE_JULIAN, + NULL); + gtk_tree_view_column_set_visible (column, FALSE); + gtk_tree_view_append_column (GTK_TREE_VIEW(appGUI->cal->export_events_list_treeview), column); + + renderer = gtk_cell_renderer_text_new(); + g_object_set (renderer, "editable", TRUE, "editable-set", TRUE, NULL); + g_signal_connect (G_OBJECT (renderer), "edited", G_CALLBACK (summary_edited_cb), appGUI); + + column = gtk_tree_view_column_new_with_attributes(_("Summary"), + renderer, + "text", IE_COLUMN_SUMMARY, + NULL); + gtk_tree_view_column_set_visible (column, TRUE); + gtk_tree_view_append_column (GTK_TREE_VIEW(appGUI->cal->export_events_list_treeview), column); + + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes(NULL, + renderer, + "text", IE_COLUMN_DESCRIPTION, + NULL); + gtk_tree_view_column_set_visible (column, FALSE); + gtk_tree_view_append_column (GTK_TREE_VIEW(appGUI->cal->export_events_list_treeview), column); + + dn_scrolledwindow = gtk_scrolled_window_new (NULL, NULL); + gtk_widget_show (dn_scrolledwindow); + gtk_paned_pack2 (GTK_PANED (appGUI->cal->ical_export_vpaned), dn_scrolledwindow, TRUE, TRUE); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (dn_scrolledwindow), + GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (dn_scrolledwindow), GTK_SHADOW_IN); + + appGUI->cal->export_day_note_textview = gtk_text_view_new (); + gtk_widget_show (appGUI->cal->export_day_note_textview); + gtk_container_add (GTK_CONTAINER (dn_scrolledwindow), appGUI->cal->export_day_note_textview); + gtk_text_view_set_editable (GTK_TEXT_VIEW (appGUI->cal->export_day_note_textview), FALSE); + gtk_text_view_set_accepts_tab (GTK_TEXT_VIEW (appGUI->cal->export_day_note_textview), FALSE); + gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (appGUI->cal->export_day_note_textview), GTK_WRAP_WORD); + gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (appGUI->cal->export_day_note_textview), FALSE); + gtk_text_view_set_pixels_above_lines (GTK_TEXT_VIEW (appGUI->cal->export_day_note_textview), 4); + gtk_text_view_set_pixels_below_lines (GTK_TEXT_VIEW (appGUI->cal->export_day_note_textview), 4); + gtk_text_view_set_left_margin (GTK_TEXT_VIEW (appGUI->cal->export_day_note_textview), 4); + gtk_text_view_set_right_margin (GTK_TEXT_VIEW (appGUI->cal->export_day_note_textview), 4); + + hbox4 = gtk_hbox_new (FALSE, 0); + gtk_widget_show (hbox4); + gtk_box_pack_start (GTK_BOX (vbox2), hbox4, FALSE, TRUE, 0); + + if (config.default_stock_icons) { + remove_item_button = gtk_button_new_from_stock (GTK_STOCK_REMOVE); + } else { + remove_item_button = gtk_button_new_from_stock (OSMO_STOCK_BUTTON_REMOVE); + } + gtk_widget_show (remove_item_button); + GTK_WIDGET_UNSET_FLAGS (remove_item_button, GTK_CAN_FOCUS); + gtk_box_pack_end (GTK_BOX (hbox4), remove_item_button, FALSE, FALSE, 0); + g_signal_connect(remove_item_button, "clicked", G_CALLBACK(button_remove_date_cb), appGUI); + + if (config.default_stock_icons) { + clear_list_button = gtk_button_new_from_stock (GTK_STOCK_CLEAR); + } else { + clear_list_button = gtk_button_new_from_stock (OSMO_STOCK_BUTTON_CLEAR); + } + gtk_widget_show (clear_list_button); + GTK_WIDGET_UNSET_FLAGS (clear_list_button, GTK_CAN_FOCUS); + gtk_box_pack_end (GTK_BOX (hbox4), clear_list_button, FALSE, FALSE, 4); + g_signal_connect(clear_list_button, "clicked", G_CALLBACK(button_clear_list_cb), appGUI); + + frame = gtk_frame_new (NULL); + gtk_widget_show (frame); + gtk_box_pack_start (GTK_BOX (vbox1), frame, FALSE, TRUE, 0); + gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_NONE); + + sprintf(tmpbuf, "<b>%s:</b>", _("Output filename")); + label = gtk_label_new (tmpbuf); + gtk_widget_show (label); + gtk_frame_set_label_widget (GTK_FRAME (frame), label); + gtk_label_set_use_markup (GTK_LABEL (label), TRUE); + + alignment = gtk_alignment_new (0.5, 0.5, 1, 1); + gtk_widget_show (alignment); + gtk_container_add (GTK_CONTAINER (frame), alignment); + gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 0, 0, 12, 0); + + hbox3 = gtk_hbox_new (FALSE, 8); + gtk_widget_show (hbox3); + gtk_container_add (GTK_CONTAINER (alignment), hbox3); + + appGUI->cal->output_file_entry = gtk_entry_new (); + gtk_widget_show (appGUI->cal->output_file_entry); + gtk_box_pack_start (GTK_BOX (hbox3), appGUI->cal->output_file_entry, TRUE, TRUE, 0); + GTK_WIDGET_UNSET_FLAGS(appGUI->cal->output_file_entry, GTK_CAN_FOCUS); + gtk_editable_set_editable (GTK_EDITABLE(appGUI->cal->output_file_entry), FALSE); + + if (config.default_stock_icons) { + browse_dir_button = gui_stock_button (GTK_STOCK_DIRECTORY, FALSE); + } else { + browse_dir_button = gtk_button_new_from_stock (OSMO_STOCK_BUTTON_OPEN); + } + gtk_widget_show (browse_dir_button); + GTK_WIDGET_UNSET_FLAGS(browse_dir_button, GTK_CAN_FOCUS); + g_signal_connect(browse_dir_button, "clicked", G_CALLBACK(select_file_cb), appGUI); + gtk_box_pack_start (GTK_BOX (hbox3), browse_dir_button, FALSE, FALSE, 0); + + hseparator = gtk_hseparator_new (); + gtk_widget_show (hseparator); + gtk_box_pack_start (GTK_BOX (vbox1), hseparator, FALSE, TRUE, 4); + + hbuttonbox = gtk_hbutton_box_new (); + gtk_widget_show (hbuttonbox); + gtk_box_pack_start (GTK_BOX (vbox1), hbuttonbox, FALSE, TRUE, 0); + gtk_button_box_set_layout (GTK_BUTTON_BOX (hbuttonbox), GTK_BUTTONBOX_END); + gtk_box_set_spacing (GTK_BOX (hbuttonbox), 4); + + if (config.default_stock_icons) { + cancel_button = gtk_button_new_from_stock (GTK_STOCK_CANCEL); + } else { + cancel_button = gtk_button_new_from_stock (OSMO_STOCK_BUTTON_CANCEL); + } + gtk_widget_show (cancel_button); + gtk_container_add (GTK_CONTAINER (hbuttonbox), cancel_button); + GTK_WIDGET_SET_FLAGS (cancel_button, GTK_CAN_DEFAULT); + g_signal_connect(cancel_button, "clicked", G_CALLBACK(button_ical_export_window_close_cb), appGUI); + + export_button = gtk_button_new_with_label (_("Export")); + gtk_widget_show (export_button); + gtk_container_add (GTK_CONTAINER (hbuttonbox), export_button); + GTK_WIDGET_SET_FLAGS (export_button, GTK_CAN_DEFAULT); + g_signal_connect(export_button, "clicked", G_CALLBACK(ical_export_cb), appGUI); + + gtk_widget_show(appGUI->cal->ical_export_window); +} + +/*------------------------------------------------------------------------------*/ + #endif /* HAVE_LIBICAL */ Modified: trunk/src/calendar_ical.h =================================================================== --- trunk/src/calendar_ical.h 2008-08-05 21:22:30 UTC (rev 548) +++ trunk/src/calendar_ical.h 2008-08-09 14:27:48 UTC (rev 549) @@ -49,6 +49,14 @@ ICAL_EVENTS_NUM_COLUMNS }; +enum { + IE_COLUMN_DATE = 0, + IE_COLUMN_DATE_JULIAN, + IE_COLUMN_SUMMARY, + IE_COLUMN_DESCRIPTION, + ICAL_EXPORT_NUM_COLUMNS +}; + void calendar_display_ics (GDate *date, GUI *appGUI); void ics_initialize_timezone (void); @@ -56,7 +64,7 @@ void ics_calendar_refresh (GUI *appGUI); void ical_events_browser (GUI *appGUI); - +void ical_export (GUI *appGUI); void read_ical_entries (GUI *appGUI); void write_ical_entries (GUI *appGUI); Modified: trunk/src/gui.h =================================================================== --- trunk/src/gui.h 2008-08-05 21:22:30 UTC (rev 548) +++ trunk/src/gui.h 2008-08-09 14:27:48 UTC (rev 549) @@ -282,6 +282,16 @@ GtkWidget *ical_events_list; GtkTreeSelection *ical_events_list_selection; GtkListStore *ical_events_list_store; + GtkWidget *ical_export_window; + GtkWidget *output_file_entry; + GtkWidget *ical_export_vpaned; + GtkWidget *export_begin_period_calendar; + GtkWidget *export_end_period_calendar; + GtkWidget *export_day_note_textview; + GtkWidget *export_events_list_treeview; + GtkTreeSelection *export_events_list_selection; + GtkListStore *export_events_list_store; + GtkWidget *use_date_period_checkbutton; /* notes browser */ GtkWidget *day_notes_window; Modified: trunk/src/options_prefs.c =================================================================== --- trunk/src/options_prefs.c 2008-08-05 21:22:30 UTC (rev 548) +++ trunk/src/options_prefs.c 2008-08-09 14:27:48 UTC (rev 549) @@ -128,6 +128,7 @@ config.event_marker_type = EVENT_MARKER_CIRCLE; config.today_marker_type = TODAY_MARKER_FREEHAND_CIRCLE; config.day_notes_browser_filter = DN_FILTER_CURRENT_MONTH; + config.ical_export_pane_pos = 180; g_strlcpy (config.header_color, "#808080", MAXCOLORNAME); g_strlcpy (config.weekend_color, "#880000", MAXCOLORNAME); g_strlcpy (config.selection_color, "#526565", MAXCOLORNAME); @@ -331,6 +332,7 @@ utl_xml_get_int ("event_marker_type", &config.event_marker_type, calendar_node, doc); utl_xml_get_int ("today_marker_type", &config.today_marker_type, calendar_node, doc); utl_xml_get_int ("day_notes_browser_filter", &config.day_notes_browser_filter, calendar_node, doc); + utl_xml_get_int ("ical_export_pane_pos", &config.ical_export_pane_pos, calendar_node, doc); utl_xml_get_strn ("header_color", config.header_color, MAXCOLORNAME, calendar_node, doc); utl_xml_get_strn ("weekend_color", config.weekend_color, MAXCOLORNAME, calendar_node, doc); utl_xml_get_strn ("selection_color", config.selection_color, MAXCOLORNAME, calendar_node, doc); @@ -546,6 +548,7 @@ utl_xml_put_int ("event_marker_type", config.event_marker_type, calendar_node); utl_xml_put_int ("today_marker_type", config.today_marker_type, calendar_node); utl_xml_put_int ("day_notes_browser_filter", config.day_notes_browser_filter, calendar_node); + utl_xml_put_int ("ical_export_pane_pos", config.ical_export_pane_pos, calendar_node); utl_xml_put_strn ("header_color", config.header_color, MAXCOLORNAME, calendar_node); utl_xml_put_strn ("weekend_color", config.weekend_color, MAXCOLORNAME, calendar_node); utl_xml_put_strn ("selection_color", config.selection_color, MAXCOLORNAME, calendar_node); Modified: trunk/src/options_prefs.h =================================================================== --- trunk/src/options_prefs.h 2008-08-05 21:22:30 UTC (rev 548) +++ trunk/src/options_prefs.h 2008-08-09 14:27:48 UTC (rev 549) @@ -93,6 +93,7 @@ gint event_marker_type; gint today_marker_type; gint day_notes_browser_filter; + gint ical_export_pane_pos; gchar header_color[MAXCOLORNAME]; gchar weekend_color[MAXCOLORNAME]; gchar selection_color[MAXCOLORNAME]; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |