1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
3 * Copyright (C) 2006-2007 Imendio AB
4 * Copyright (C) 2007 Collabora Ltd.
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License as
8 * published by the Free Software Foundation; either version 2 of the
9 * License, or (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
16 * You should have received a copy of the GNU General Public
17 * License along with this program; if not, write to the
18 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 * Boston, MA 02111-1307, USA.
21 * Authors: Martyn Russell <martyn@imendio.com>
22 * Xavier Claessens <xclaesse@gmail.com>
30 #include <glib/gi18n.h>
32 #include <glade/glade.h>
34 #include <libempathy/empathy-log-manager.h>
35 #include <libempathy/empathy-chatroom-manager.h>
36 #include <libempathy/empathy-chatroom.h>
37 #include <libempathy/empathy-message.h>
38 #include <libempathy/empathy-debug.h>
39 #include <libempathy/empathy-utils.h>
40 #include <libempathy/empathy-time.h>
42 #include "empathy-log-window.h"
43 #include "empathy-account-chooser.h"
44 #include "empathy-chat-view.h"
45 #include "empathy-ui-utils.h"
47 #define DEBUG_DOMAIN "LogWindow"
54 GtkWidget *entry_find;
55 GtkWidget *button_find;
56 GtkWidget *treeview_find;
57 GtkWidget *scrolledwindow_find;
58 EmpathyChatView *chatview_find;
59 GtkWidget *button_previous;
60 GtkWidget *button_next;
62 GtkWidget *vbox_chats;
63 GtkWidget *account_chooser_chats;
64 GtkWidget *entry_chats;
65 GtkWidget *calendar_chats;
66 GtkWidget *treeview_chats;
67 GtkWidget *scrolledwindow_chats;
68 EmpathyChatView *chatview_chats;
72 EmpathyLogManager *log_manager;
76 log_window_destroy_cb (GtkWidget *widget,
77 EmpathyLogWindow *window);
79 log_window_entry_find_changed_cb (GtkWidget *entry,
80 EmpathyLogWindow *window);
82 log_window_find_changed_cb (GtkTreeSelection *selection,
83 EmpathyLogWindow *window);
85 log_window_find_populate (EmpathyLogWindow *window,
86 const gchar *search_criteria);
88 log_window_find_setup (EmpathyLogWindow *window);
90 log_window_button_find_clicked_cb (GtkWidget *widget,
91 EmpathyLogWindow *window);
93 log_window_button_next_clicked_cb (GtkWidget *widget,
94 EmpathyLogWindow *window);
96 log_window_button_previous_clicked_cb (GtkWidget *widget,
97 EmpathyLogWindow *window);
99 log_window_chats_changed_cb (GtkTreeSelection *selection,
100 EmpathyLogWindow *window);
102 log_window_chats_populate (EmpathyLogWindow *window);
104 log_window_chats_setup (EmpathyLogWindow *window);
106 log_window_chats_accounts_changed_cb (GtkWidget *combobox,
107 EmpathyLogWindow *window);
109 log_window_chats_new_message_cb (EmpathyContact *own_contact,
110 EmpathyMessage *message,
111 EmpathyLogWindow *window);
113 log_window_chats_set_selected (EmpathyLogWindow *window,
115 const gchar *chat_id,
116 gboolean is_chatroom);
118 log_window_chats_get_selected (EmpathyLogWindow *window,
121 gboolean *is_chatroom);
123 log_window_chats_get_messages (EmpathyLogWindow *window,
124 const gchar *date_to_show);
126 log_window_calendar_chats_day_selected_cb (GtkWidget *calendar,
127 EmpathyLogWindow *window);
129 log_window_calendar_chats_month_changed_cb (GtkWidget *calendar,
130 EmpathyLogWindow *window);
132 log_window_entry_chats_changed_cb (GtkWidget *entry,
133 EmpathyLogWindow *window);
135 log_window_entry_chats_activate_cb (GtkWidget *entry,
136 EmpathyLogWindow *window);
139 COL_FIND_ACCOUNT_ICON,
140 COL_FIND_ACCOUNT_NAME,
144 COL_FIND_IS_CHATROOM,
146 COL_FIND_DATE_READABLE,
155 COL_CHAT_IS_CHATROOM,
160 empathy_log_window_show (McAccount *account,
161 const gchar *chat_id,
162 gboolean is_chatroom,
165 static EmpathyLogWindow *window = NULL;
166 EmpathyAccountChooser *account_chooser;
172 gtk_window_present (GTK_WINDOW (window->window));
174 if (account && chat_id) {
175 gtk_notebook_set_current_page (GTK_NOTEBOOK (window->notebook), 1);
176 log_window_chats_set_selected (window, account,
177 chat_id, is_chatroom);
183 window = g_new0 (EmpathyLogWindow, 1);
184 window->log_manager = empathy_log_manager_new ();
186 glade = empathy_glade_get_file ("empathy-log-window.glade",
189 "log_window", &window->window,
190 "notebook", &window->notebook,
191 "entry_find", &window->entry_find,
192 "button_find", &window->button_find,
193 "treeview_find", &window->treeview_find,
194 "scrolledwindow_find", &window->scrolledwindow_find,
195 "button_previous", &window->button_previous,
196 "button_next", &window->button_next,
197 "entry_chats", &window->entry_chats,
198 "calendar_chats", &window->calendar_chats,
199 "vbox_chats", &window->vbox_chats,
200 "treeview_chats", &window->treeview_chats,
201 "scrolledwindow_chats", &window->scrolledwindow_chats,
203 empathy_glade_connect (glade,
205 "log_window", "destroy", log_window_destroy_cb,
206 "entry_find", "changed", log_window_entry_find_changed_cb,
207 "button_previous", "clicked", log_window_button_previous_clicked_cb,
208 "button_next", "clicked", log_window_button_next_clicked_cb,
209 "button_find", "clicked", log_window_button_find_clicked_cb,
210 "entry_chats", "changed", log_window_entry_chats_changed_cb,
211 "entry_chats", "activate", log_window_entry_chats_activate_cb,
214 g_object_unref (glade);
216 g_object_add_weak_pointer (G_OBJECT (window->window),
219 /* We set this up here so we can block it when needed. */
220 g_signal_connect (window->calendar_chats, "day-selected",
221 G_CALLBACK (log_window_calendar_chats_day_selected_cb),
223 g_signal_connect (window->calendar_chats, "month-changed",
224 G_CALLBACK (log_window_calendar_chats_month_changed_cb),
227 /* Configure Search EmpathyChatView */
228 window->chatview_find = empathy_chat_view_new ();
229 gtk_container_add (GTK_CONTAINER (window->scrolledwindow_find),
230 GTK_WIDGET (window->chatview_find));
231 gtk_widget_show (GTK_WIDGET (window->chatview_find));
233 /* Configure Contacts EmpathyChatView */
234 window->chatview_chats = empathy_chat_view_new ();
235 gtk_container_add (GTK_CONTAINER (window->scrolledwindow_chats),
236 GTK_WIDGET (window->chatview_chats));
237 gtk_widget_show (GTK_WIDGET (window->chatview_chats));
239 /* Account chooser for chats */
240 window->account_chooser_chats = empathy_account_chooser_new ();
241 account_chooser = EMPATHY_ACCOUNT_CHOOSER (window->account_chooser_chats);
243 gtk_box_pack_start (GTK_BOX (window->vbox_chats),
244 window->account_chooser_chats,
247 g_signal_connect (window->account_chooser_chats, "changed",
248 G_CALLBACK (log_window_chats_accounts_changed_cb),
252 accounts = mc_accounts_list ();
253 account_num = g_list_length (accounts);
254 mc_accounts_list_free (accounts);
256 if (account_num > 1) {
257 gtk_widget_show (window->vbox_chats);
258 gtk_widget_show (window->account_chooser_chats);
260 gtk_widget_hide (window->vbox_chats);
261 gtk_widget_hide (window->account_chooser_chats);
265 log_window_find_setup (window);
268 log_window_chats_setup (window);
269 log_window_chats_populate (window);
272 if (account && chat_id) {
273 gtk_notebook_set_current_page (GTK_NOTEBOOK (window->notebook), 1);
274 log_window_chats_set_selected (window, account,
275 chat_id, is_chatroom);
279 gtk_window_set_transient_for (GTK_WINDOW (window->window),
280 GTK_WINDOW (parent));
283 gtk_widget_show (window->window);
287 log_window_destroy_cb (GtkWidget *widget,
288 EmpathyLogWindow *window)
290 g_signal_handlers_disconnect_by_func (window->log_manager,
291 log_window_chats_new_message_cb,
294 g_free (window->last_find);
295 g_object_unref (window->log_manager);
304 log_window_entry_find_changed_cb (GtkWidget *entry,
305 EmpathyLogWindow *window)
308 gboolean is_sensitive = TRUE;
310 str = gtk_entry_get_text (GTK_ENTRY (window->entry_find));
312 is_sensitive &= !G_STR_EMPTY (str);
314 !window->last_find ||
315 (window->last_find && strcmp (window->last_find, str) != 0);
317 gtk_widget_set_sensitive (window->button_find, is_sensitive);
321 log_window_find_changed_cb (GtkTreeSelection *selection,
322 EmpathyLogWindow *window)
329 gboolean is_chatroom;
331 EmpathyMessage *message;
334 gboolean can_do_previous;
335 gboolean can_do_next;
337 /* Get selected information */
338 view = GTK_TREE_VIEW (window->treeview_find);
339 model = gtk_tree_view_get_model (view);
341 if (!gtk_tree_selection_get_selected (selection, NULL, &iter)) {
342 gtk_widget_set_sensitive (window->button_previous, FALSE);
343 gtk_widget_set_sensitive (window->button_next, FALSE);
345 empathy_chat_view_clear (window->chatview_find);
350 gtk_widget_set_sensitive (window->button_previous, TRUE);
351 gtk_widget_set_sensitive (window->button_next, TRUE);
353 gtk_tree_model_get (model, &iter,
354 COL_FIND_ACCOUNT, &account,
355 COL_FIND_CHAT_ID, &chat_id,
356 COL_FIND_IS_CHATROOM, &is_chatroom,
357 COL_FIND_DATE, &date,
360 /* Clear all current messages shown in the textview */
361 empathy_chat_view_clear (window->chatview_find);
363 /* Turn off scrolling temporarily */
364 empathy_chat_view_scroll (window->chatview_find, FALSE);
367 messages = empathy_log_manager_get_messages_for_date (window->log_manager,
372 g_object_unref (account);
376 for (l = messages; l; l = l->next) {
378 empathy_chat_view_append_message (window->chatview_find, message);
379 g_object_unref (message);
381 g_list_free (messages);
383 /* Scroll to the most recent messages */
384 empathy_chat_view_scroll (window->chatview_find, TRUE);
386 /* Highlight and find messages */
387 empathy_chat_view_highlight (window->chatview_find,
389 empathy_chat_view_find_next (window->chatview_find,
392 empathy_chat_view_find_abilities (window->chatview_find,
396 gtk_widget_set_sensitive (window->button_previous, can_do_previous);
397 gtk_widget_set_sensitive (window->button_next, can_do_next);
398 gtk_widget_set_sensitive (window->button_find, FALSE);
402 log_window_find_populate (EmpathyLogWindow *window,
403 const gchar *search_criteria)
409 GtkTreeSelection *selection;
413 view = GTK_TREE_VIEW (window->treeview_find);
414 model = gtk_tree_view_get_model (view);
415 selection = gtk_tree_view_get_selection (view);
416 store = GTK_LIST_STORE (model);
418 empathy_chat_view_clear (window->chatview_find);
420 gtk_list_store_clear (store);
422 if (G_STR_EMPTY (search_criteria)) {
423 /* Just clear the search. */
427 hits = empathy_log_manager_search_new (window->log_manager, search_criteria);
429 for (l = hits; l; l = l->next) {
430 EmpathyLogSearchHit *hit;
431 const gchar *account_name;
432 const gchar *account_icon;
433 gchar *date_readable;
437 /* Protect against invalid data (corrupt or old log files. */
438 if (!hit->account || !hit->chat_id) {
442 date_readable = empathy_log_manager_get_date_readable (hit->date);
443 account_name = mc_account_get_display_name (hit->account);
444 account_icon = empathy_icon_name_from_account (hit->account);
446 gtk_list_store_append (store, &iter);
447 gtk_list_store_set (store, &iter,
448 COL_FIND_ACCOUNT_ICON, account_icon,
449 COL_FIND_ACCOUNT_NAME, account_name,
450 COL_FIND_ACCOUNT, hit->account,
451 COL_FIND_CHAT_NAME, hit->chat_id, /* FIXME */
452 COL_FIND_CHAT_ID, hit->chat_id,
453 COL_FIND_IS_CHATROOM, hit->is_chatroom,
454 COL_FIND_DATE, hit->date,
455 COL_FIND_DATE_READABLE, date_readable,
458 g_free (date_readable);
460 /* FIXME: Update COL_FIND_CHAT_NAME */
461 if (hit->is_chatroom) {
467 empathy_log_manager_search_free (hits);
472 log_window_find_setup (EmpathyLogWindow *window)
476 GtkTreeSelection *selection;
477 GtkTreeSortable *sortable;
478 GtkTreeViewColumn *column;
480 GtkCellRenderer *cell;
483 view = GTK_TREE_VIEW (window->treeview_find);
484 selection = gtk_tree_view_get_selection (view);
487 store = gtk_list_store_new (COL_FIND_COUNT,
488 G_TYPE_STRING, /* account icon name */
489 G_TYPE_STRING, /* account name */
490 MC_TYPE_ACCOUNT, /* account */
491 G_TYPE_STRING, /* chat name */
492 G_TYPE_STRING, /* chat id */
493 G_TYPE_BOOLEAN, /* is chatroom */
494 G_TYPE_STRING, /* date */
495 G_TYPE_STRING); /* date_readable */
497 model = GTK_TREE_MODEL (store);
498 sortable = GTK_TREE_SORTABLE (store);
500 gtk_tree_view_set_model (view, model);
503 column = gtk_tree_view_column_new ();
505 cell = gtk_cell_renderer_pixbuf_new ();
506 gtk_tree_view_column_pack_start (column, cell, FALSE);
507 gtk_tree_view_column_add_attribute (column, cell,
509 COL_FIND_ACCOUNT_ICON);
511 cell = gtk_cell_renderer_text_new ();
512 gtk_tree_view_column_pack_start (column, cell, TRUE);
513 gtk_tree_view_column_add_attribute (column, cell,
515 COL_FIND_ACCOUNT_NAME);
517 gtk_tree_view_column_set_title (column, _("Account"));
518 gtk_tree_view_append_column (view, column);
520 gtk_tree_view_column_set_resizable (column, TRUE);
521 gtk_tree_view_column_set_clickable (column, TRUE);
523 cell = gtk_cell_renderer_text_new ();
524 offset = gtk_tree_view_insert_column_with_attributes (view, -1, _("Conversation"),
525 cell, "text", COL_FIND_CHAT_NAME,
528 column = gtk_tree_view_get_column (view, offset - 1);
529 gtk_tree_view_column_set_sort_column_id (column, COL_FIND_CHAT_NAME);
530 gtk_tree_view_column_set_resizable (column, TRUE);
531 gtk_tree_view_column_set_clickable (column, TRUE);
533 cell = gtk_cell_renderer_text_new ();
534 offset = gtk_tree_view_insert_column_with_attributes (view, -1, _("Date"),
535 cell, "text", COL_FIND_DATE_READABLE,
538 column = gtk_tree_view_get_column (view, offset - 1);
539 gtk_tree_view_column_set_sort_column_id (column, COL_FIND_DATE);
540 gtk_tree_view_column_set_resizable (column, TRUE);
541 gtk_tree_view_column_set_clickable (column, TRUE);
543 /* Set up treeview properties */
544 gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
545 gtk_tree_sortable_set_sort_column_id (sortable,
550 g_signal_connect (selection, "changed",
551 G_CALLBACK (log_window_find_changed_cb),
554 g_object_unref (store);
558 log_window_button_find_clicked_cb (GtkWidget *widget,
559 EmpathyLogWindow *window)
563 str = gtk_entry_get_text (GTK_ENTRY (window->entry_find));
565 /* Don't find the same crap again */
566 if (window->last_find && strcmp (window->last_find, str) == 0) {
570 g_free (window->last_find);
571 window->last_find = g_strdup (str);
573 log_window_find_populate (window, str);
577 log_window_button_next_clicked_cb (GtkWidget *widget,
578 EmpathyLogWindow *window)
580 if (window->last_find) {
581 gboolean can_do_previous;
582 gboolean can_do_next;
584 empathy_chat_view_find_next (window->chatview_find,
587 empathy_chat_view_find_abilities (window->chatview_find,
591 gtk_widget_set_sensitive (window->button_previous, can_do_previous);
592 gtk_widget_set_sensitive (window->button_next, can_do_next);
597 log_window_button_previous_clicked_cb (GtkWidget *widget,
598 EmpathyLogWindow *window)
600 if (window->last_find) {
601 gboolean can_do_previous;
602 gboolean can_do_next;
604 empathy_chat_view_find_previous (window->chatview_find,
607 empathy_chat_view_find_abilities (window->chatview_find,
611 gtk_widget_set_sensitive (window->button_previous, can_do_previous);
612 gtk_widget_set_sensitive (window->button_next, can_do_next);
621 log_window_chats_changed_cb (GtkTreeSelection *selection,
622 EmpathyLogWindow *window)
624 /* Use last date by default */
625 gtk_calendar_clear_marks (GTK_CALENDAR (window->calendar_chats));
627 log_window_chats_get_messages (window, NULL);
631 log_window_chats_populate (EmpathyLogWindow *window)
633 EmpathyAccountChooser *account_chooser;
639 GtkTreeSelection *selection;
643 account_chooser = EMPATHY_ACCOUNT_CHOOSER (window->account_chooser_chats);
644 account = empathy_account_chooser_get_account (account_chooser);
646 view = GTK_TREE_VIEW (window->treeview_chats);
647 model = gtk_tree_view_get_model (view);
648 selection = gtk_tree_view_get_selection (view);
649 store = GTK_LIST_STORE (model);
651 /* Block signals to stop the logs being retrieved prematurely */
652 g_signal_handlers_block_by_func (selection,
653 log_window_chats_changed_cb,
656 gtk_list_store_clear (store);
658 chats = empathy_log_manager_get_chats (window->log_manager, account);
659 for (l = chats; l; l = l->next) {
660 EmpathyLogSearchHit *hit;
664 gtk_list_store_append (store, &iter);
665 gtk_list_store_set (store, &iter,
666 COL_CHAT_ICON, "empathy-available", /* FIXME */
667 COL_CHAT_NAME, hit->chat_id,
668 COL_CHAT_ACCOUNT, account,
669 COL_CHAT_ID, hit->chat_id,
670 COL_CHAT_IS_CHATROOM, hit->is_chatroom,
673 /* FIXME: Update COL_CHAT_ICON/NAME */
674 if (hit->is_chatroom) {
678 empathy_log_manager_search_free (chats);
680 /* Unblock signals */
681 g_signal_handlers_unblock_by_func (selection,
682 log_window_chats_changed_cb,
686 g_object_unref (account);
690 log_window_chats_setup (EmpathyLogWindow *window)
694 GtkTreeSelection *selection;
695 GtkTreeSortable *sortable;
696 GtkTreeViewColumn *column;
698 GtkCellRenderer *cell;
700 view = GTK_TREE_VIEW (window->treeview_chats);
701 selection = gtk_tree_view_get_selection (view);
704 store = gtk_list_store_new (COL_CHAT_COUNT,
705 G_TYPE_STRING, /* icon */
706 G_TYPE_STRING, /* name */
707 MC_TYPE_ACCOUNT, /* account */
708 G_TYPE_STRING, /* id */
709 G_TYPE_BOOLEAN); /* is chatroom */
711 model = GTK_TREE_MODEL (store);
712 sortable = GTK_TREE_SORTABLE (store);
714 gtk_tree_view_set_model (view, model);
717 column = gtk_tree_view_column_new ();
719 cell = gtk_cell_renderer_pixbuf_new ();
720 gtk_tree_view_column_pack_start (column, cell, FALSE);
721 gtk_tree_view_column_add_attribute (column, cell,
725 cell = gtk_cell_renderer_text_new ();
726 g_object_set (cell, "ellipsize", PANGO_ELLIPSIZE_END, NULL);
727 gtk_tree_view_column_pack_start (column, cell, TRUE);
728 gtk_tree_view_column_add_attribute (column, cell,
732 gtk_tree_view_append_column (view, column);
734 /* set up treeview properties */
735 gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
736 gtk_tree_sortable_set_sort_column_id (sortable,
741 g_signal_connect (selection, "changed",
742 G_CALLBACK (log_window_chats_changed_cb),
745 g_object_unref (store);
749 log_window_chats_accounts_changed_cb (GtkWidget *combobox,
750 EmpathyLogWindow *window)
752 /* Clear all current messages shown in the textview */
753 empathy_chat_view_clear (window->chatview_chats);
755 log_window_chats_populate (window);
759 log_window_chats_new_message_cb (EmpathyContact *own_contact,
760 EmpathyMessage *message,
761 EmpathyLogWindow *window)
763 empathy_chat_view_append_message (window->chatview_chats, message);
765 /* Scroll to the most recent messages */
766 empathy_chat_view_scroll_down (window->chatview_chats);
770 log_window_chats_set_selected (EmpathyLogWindow *window,
772 const gchar *chat_id,
773 gboolean is_chatroom)
775 EmpathyAccountChooser *account_chooser;
778 GtkTreeSelection *selection;
783 account_chooser = EMPATHY_ACCOUNT_CHOOSER (window->account_chooser_chats);
784 empathy_account_chooser_set_account (account_chooser, account);
786 view = GTK_TREE_VIEW (window->treeview_chats);
787 model = gtk_tree_view_get_model (view);
788 selection = gtk_tree_view_get_selection (view);
790 if (!gtk_tree_model_get_iter_first (model, &iter)) {
794 for (ok = TRUE; ok; ok = gtk_tree_model_iter_next (model, &iter)) {
795 McAccount *this_account;
797 gboolean this_is_chatroom;
799 gtk_tree_model_get (model, &iter,
800 COL_CHAT_ACCOUNT, &this_account,
801 COL_CHAT_ID, &this_chat_id,
802 COL_CHAT_IS_CHATROOM, &this_is_chatroom,
805 if (empathy_account_equal (this_account, account) &&
806 strcmp (this_chat_id, chat_id) == 0 &&
807 this_is_chatroom == is_chatroom) {
808 gtk_tree_selection_select_iter (selection, &iter);
809 path = gtk_tree_model_get_path (model, &iter);
810 gtk_tree_view_scroll_to_cell (view, path, NULL, TRUE, 0.5, 0.0);
811 gtk_tree_path_free (path);
812 g_object_unref (this_account);
813 g_free (this_chat_id);
817 g_object_unref (this_account);
818 g_free (this_chat_id);
823 log_window_chats_get_selected (EmpathyLogWindow *window,
826 gboolean *is_chatroom)
830 GtkTreeSelection *selection;
833 McAccount *acc = NULL;
834 gboolean room = FALSE;
836 view = GTK_TREE_VIEW (window->treeview_chats);
837 model = gtk_tree_view_get_model (view);
838 selection = gtk_tree_view_get_selection (view);
840 if (!gtk_tree_selection_get_selected (selection, NULL, &iter)) {
844 gtk_tree_model_get (model, &iter,
845 COL_CHAT_ACCOUNT, &acc,
847 COL_CHAT_IS_CHATROOM, &room,
858 g_object_unref (acc);
868 log_window_chats_get_messages (EmpathyLogWindow *window,
869 const gchar *date_to_show)
873 gboolean is_chatroom;
874 EmpathyMessage *message;
882 guint month_selected;
885 if (!log_window_chats_get_selected (window, &account,
886 &chat_id, &is_chatroom)) {
890 g_signal_handlers_block_by_func (window->calendar_chats,
891 log_window_calendar_chats_day_selected_cb,
894 /* Either use the supplied date or get the last */
897 gboolean day_selected = FALSE;
899 /* Get a list of dates and show them on the calendar */
900 dates = empathy_log_manager_get_dates (window->log_manager,
904 for (l = dates; l; l = l->next) {
912 sscanf (str, "%4d%2d%2d", &year, &month, &day);
913 gtk_calendar_get_date (GTK_CALENDAR (window->calendar_chats),
924 if (year != year_selected || month != month_selected) {
929 empathy_debug (DEBUG_DOMAIN, "Marking date:'%s'", str);
930 gtk_calendar_mark_day (GTK_CALENDAR (window->calendar_chats), day);
938 gtk_calendar_select_day (GTK_CALENDAR (window->calendar_chats), day);
942 /* Unselect the day in the calendar */
943 gtk_calendar_select_day (GTK_CALENDAR (window->calendar_chats), 0);
946 sscanf (date, "%4d%2d%2d", &year, &month, &day);
947 gtk_calendar_get_date (GTK_CALENDAR (window->calendar_chats),
954 if (year != year_selected && month != month_selected) {
958 gtk_calendar_select_day (GTK_CALENDAR (window->calendar_chats), day);
960 g_signal_handlers_unblock_by_func (window->calendar_chats,
961 log_window_calendar_chats_day_selected_cb,
964 /* Clear all current messages shown in the textview */
965 empathy_chat_view_clear (window->chatview_chats);
967 /* Turn off scrolling temporarily */
968 empathy_chat_view_scroll (window->chatview_find, FALSE);
971 messages = empathy_log_manager_get_messages_for_date (window->log_manager,
976 for (l = messages; l; l = l->next) {
979 empathy_chat_view_append_message (window->chatview_chats,
981 g_object_unref (message);
983 g_list_free (messages);
985 g_list_foreach (dates, (GFunc) g_free, NULL);
988 g_object_unref (account);
991 /* Turn back on scrolling */
992 empathy_chat_view_scroll (window->chatview_find, TRUE);
994 /* Scroll to the most recent messages */
995 empathy_chat_view_scroll_down (window->chatview_chats);
997 /* Give the search entry main focus */
998 gtk_widget_grab_focus (window->entry_chats);
1002 log_window_calendar_chats_day_selected_cb (GtkWidget *calendar,
1003 EmpathyLogWindow *window)
1011 gtk_calendar_get_date (GTK_CALENDAR (calendar), &year, &month, &day);
1013 /* We need this hear because it appears that the months start from 0 */
1016 date = g_strdup_printf ("%4.4d%2.2d%2.2d", year, month, day);
1018 empathy_debug (DEBUG_DOMAIN, "Currently selected date is:'%s'", date);
1020 log_window_chats_get_messages (window, date);
1026 log_window_calendar_chats_month_changed_cb (GtkWidget *calendar,
1027 EmpathyLogWindow *window)
1031 gboolean is_chatroom;
1032 guint year_selected;
1033 guint month_selected;
1038 gtk_calendar_clear_marks (GTK_CALENDAR (calendar));
1040 if (!log_window_chats_get_selected (window, &account,
1041 &chat_id, &is_chatroom)) {
1042 empathy_debug (DEBUG_DOMAIN, "No chat selected to get dates for...");
1046 g_object_get (calendar,
1047 "month", &month_selected,
1048 "year", &year_selected,
1051 /* We need this hear because it appears that the months start from 0 */
1054 /* Get the log object for this contact */
1055 dates = empathy_log_manager_get_dates (window->log_manager, account,
1056 chat_id, is_chatroom);
1057 g_object_unref (account);
1060 for (l = dates; l; l = l->next) {
1071 sscanf (str, "%4d%2d%2d", &year, &month, &day);
1073 if (year == year_selected && month == month_selected) {
1074 empathy_debug (DEBUG_DOMAIN, "Marking date:'%s'", str);
1075 gtk_calendar_mark_day (GTK_CALENDAR (window->calendar_chats), day);
1079 g_list_foreach (dates, (GFunc) g_free, NULL);
1080 g_list_free (dates);
1082 empathy_debug (DEBUG_DOMAIN,
1083 "Currently showing month %d and year %d",
1084 month_selected, year_selected);
1088 log_window_entry_chats_changed_cb (GtkWidget *entry,
1089 EmpathyLogWindow *window)
1093 str = gtk_entry_get_text (GTK_ENTRY (window->entry_chats));
1094 empathy_chat_view_highlight (window->chatview_chats, str);
1097 empathy_chat_view_find_next (window->chatview_chats,
1104 log_window_entry_chats_activate_cb (GtkWidget *entry,
1105 EmpathyLogWindow *window)
1109 str = gtk_entry_get_text (GTK_ENTRY (window->entry_chats));
1112 empathy_chat_view_find_next (window->chatview_chats,