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;
75 static void log_window_destroy_cb (GtkWidget *widget,
76 EmpathyLogWindow *window);
77 static void log_window_entry_find_changed_cb (GtkWidget *entry,
78 EmpathyLogWindow *window);
79 static void log_window_find_changed_cb (GtkTreeSelection *selection,
80 EmpathyLogWindow *window);
81 static void log_window_find_populate (EmpathyLogWindow *window,
82 const gchar *search_criteria);
83 static void log_window_find_setup (EmpathyLogWindow *window);
84 static void log_window_button_find_clicked_cb (GtkWidget *widget,
85 EmpathyLogWindow *window);
86 static void log_window_button_next_clicked_cb (GtkWidget *widget,
87 EmpathyLogWindow *window);
88 static void log_window_button_previous_clicked_cb (GtkWidget *widget,
89 EmpathyLogWindow *window);
90 static void log_window_chats_changed_cb (GtkTreeSelection *selection,
91 EmpathyLogWindow *window);
92 static void log_window_chats_populate (EmpathyLogWindow *window);
93 static void log_window_chats_setup (EmpathyLogWindow *window);
94 static void log_window_chats_accounts_changed_cb (GtkWidget *combobox,
95 EmpathyLogWindow *window);
96 static void log_window_chats_new_message_cb (EmpathyContact *own_contact,
97 EmpathyMessage *message,
98 EmpathyLogWindow *window);
99 static void log_window_chats_set_selected (EmpathyLogWindow *window,
101 const gchar *chat_id,
102 gboolean is_chatroom);
103 static gboolean log_window_chats_get_selected (EmpathyLogWindow *window,
106 gboolean *is_chatroom);
107 static void log_window_chats_get_messages (EmpathyLogWindow *window,
108 const gchar *date_to_show);
109 static void log_window_calendar_chats_day_selected_cb (GtkWidget *calendar,
110 EmpathyLogWindow *window);
111 static void log_window_calendar_chats_month_changed_cb (GtkWidget *calendar,
112 EmpathyLogWindow *window);
113 static void log_window_entry_chats_changed_cb (GtkWidget *entry,
114 EmpathyLogWindow *window);
115 static void log_window_entry_chats_activate_cb (GtkWidget *entry,
116 EmpathyLogWindow *window);
119 COL_FIND_ACCOUNT_ICON,
120 COL_FIND_ACCOUNT_NAME,
124 COL_FIND_IS_CHATROOM,
126 COL_FIND_DATE_READABLE,
135 COL_CHAT_IS_CHATROOM,
140 empathy_log_window_show (McAccount *account,
141 const gchar *chat_id,
142 gboolean is_chatroom,
145 static EmpathyLogWindow *window = NULL;
146 EmpathyAccountChooser *account_chooser;
152 gtk_window_present (GTK_WINDOW (window->window));
154 if (account && chat_id) {
155 gtk_notebook_set_current_page (GTK_NOTEBOOK (window->notebook), 1);
156 log_window_chats_set_selected (window, account,
157 chat_id, is_chatroom);
160 return window->window;
163 window = g_new0 (EmpathyLogWindow, 1);
164 window->log_manager = empathy_log_manager_new ();
166 glade = empathy_glade_get_file ("empathy-log-window.glade",
169 "log_window", &window->window,
170 "notebook", &window->notebook,
171 "entry_find", &window->entry_find,
172 "button_find", &window->button_find,
173 "treeview_find", &window->treeview_find,
174 "scrolledwindow_find", &window->scrolledwindow_find,
175 "button_previous", &window->button_previous,
176 "button_next", &window->button_next,
177 "entry_chats", &window->entry_chats,
178 "calendar_chats", &window->calendar_chats,
179 "vbox_chats", &window->vbox_chats,
180 "treeview_chats", &window->treeview_chats,
181 "scrolledwindow_chats", &window->scrolledwindow_chats,
183 empathy_glade_connect (glade,
185 "log_window", "destroy", log_window_destroy_cb,
186 "entry_find", "changed", log_window_entry_find_changed_cb,
187 "button_previous", "clicked", log_window_button_previous_clicked_cb,
188 "button_next", "clicked", log_window_button_next_clicked_cb,
189 "button_find", "clicked", log_window_button_find_clicked_cb,
190 "entry_chats", "changed", log_window_entry_chats_changed_cb,
191 "entry_chats", "activate", log_window_entry_chats_activate_cb,
194 g_object_unref (glade);
196 g_object_add_weak_pointer (G_OBJECT (window->window),
199 /* We set this up here so we can block it when needed. */
200 g_signal_connect (window->calendar_chats, "day-selected",
201 G_CALLBACK (log_window_calendar_chats_day_selected_cb),
203 g_signal_connect (window->calendar_chats, "month-changed",
204 G_CALLBACK (log_window_calendar_chats_month_changed_cb),
207 /* Configure Search EmpathyChatView */
208 window->chatview_find = empathy_chat_view_new ();
209 gtk_container_add (GTK_CONTAINER (window->scrolledwindow_find),
210 GTK_WIDGET (window->chatview_find));
211 gtk_widget_show (GTK_WIDGET (window->chatview_find));
213 /* Configure Contacts EmpathyChatView */
214 window->chatview_chats = empathy_chat_view_new ();
215 gtk_container_add (GTK_CONTAINER (window->scrolledwindow_chats),
216 GTK_WIDGET (window->chatview_chats));
217 gtk_widget_show (GTK_WIDGET (window->chatview_chats));
219 /* Account chooser for chats */
220 window->account_chooser_chats = empathy_account_chooser_new ();
221 account_chooser = EMPATHY_ACCOUNT_CHOOSER (window->account_chooser_chats);
223 gtk_box_pack_start (GTK_BOX (window->vbox_chats),
224 window->account_chooser_chats,
227 g_signal_connect (window->account_chooser_chats, "changed",
228 G_CALLBACK (log_window_chats_accounts_changed_cb),
232 accounts = mc_accounts_list ();
233 account_num = g_list_length (accounts);
234 mc_accounts_list_free (accounts);
236 if (account_num > 1) {
237 gtk_widget_show (window->vbox_chats);
238 gtk_widget_show (window->account_chooser_chats);
240 gtk_widget_hide (window->vbox_chats);
241 gtk_widget_hide (window->account_chooser_chats);
245 log_window_find_setup (window);
248 log_window_chats_setup (window);
249 log_window_chats_populate (window);
252 if (account && chat_id) {
253 gtk_notebook_set_current_page (GTK_NOTEBOOK (window->notebook), 1);
254 log_window_chats_set_selected (window, account,
255 chat_id, is_chatroom);
259 gtk_window_set_transient_for (GTK_WINDOW (window->window),
260 GTK_WINDOW (parent));
263 gtk_widget_show (window->window);
265 return window->window;
269 log_window_destroy_cb (GtkWidget *widget,
270 EmpathyLogWindow *window)
272 g_signal_handlers_disconnect_by_func (window->log_manager,
273 log_window_chats_new_message_cb,
276 g_free (window->last_find);
277 g_object_unref (window->log_manager);
286 log_window_entry_find_changed_cb (GtkWidget *entry,
287 EmpathyLogWindow *window)
290 gboolean is_sensitive = TRUE;
292 str = gtk_entry_get_text (GTK_ENTRY (window->entry_find));
294 is_sensitive &= !G_STR_EMPTY (str);
296 !window->last_find ||
297 (window->last_find && strcmp (window->last_find, str) != 0);
299 gtk_widget_set_sensitive (window->button_find, is_sensitive);
303 log_window_find_changed_cb (GtkTreeSelection *selection,
304 EmpathyLogWindow *window)
311 gboolean is_chatroom;
313 EmpathyMessage *message;
316 gboolean can_do_previous;
317 gboolean can_do_next;
319 /* Get selected information */
320 view = GTK_TREE_VIEW (window->treeview_find);
321 model = gtk_tree_view_get_model (view);
323 if (!gtk_tree_selection_get_selected (selection, NULL, &iter)) {
324 gtk_widget_set_sensitive (window->button_previous, FALSE);
325 gtk_widget_set_sensitive (window->button_next, FALSE);
327 empathy_chat_view_clear (window->chatview_find);
332 gtk_widget_set_sensitive (window->button_previous, TRUE);
333 gtk_widget_set_sensitive (window->button_next, TRUE);
335 gtk_tree_model_get (model, &iter,
336 COL_FIND_ACCOUNT, &account,
337 COL_FIND_CHAT_ID, &chat_id,
338 COL_FIND_IS_CHATROOM, &is_chatroom,
339 COL_FIND_DATE, &date,
342 /* Clear all current messages shown in the textview */
343 empathy_chat_view_clear (window->chatview_find);
345 /* Turn off scrolling temporarily */
346 empathy_chat_view_scroll (window->chatview_find, FALSE);
349 messages = empathy_log_manager_get_messages_for_date (window->log_manager,
354 g_object_unref (account);
358 for (l = messages; l; l = l->next) {
360 empathy_chat_view_append_message (window->chatview_find, message);
361 g_object_unref (message);
363 g_list_free (messages);
365 /* Scroll to the most recent messages */
366 empathy_chat_view_scroll (window->chatview_find, TRUE);
368 /* Highlight and find messages */
369 empathy_chat_view_highlight (window->chatview_find,
371 empathy_chat_view_find_next (window->chatview_find,
374 empathy_chat_view_find_abilities (window->chatview_find,
378 gtk_widget_set_sensitive (window->button_previous, can_do_previous);
379 gtk_widget_set_sensitive (window->button_next, can_do_next);
380 gtk_widget_set_sensitive (window->button_find, FALSE);
384 log_window_find_populate (EmpathyLogWindow *window,
385 const gchar *search_criteria)
391 GtkTreeSelection *selection;
395 view = GTK_TREE_VIEW (window->treeview_find);
396 model = gtk_tree_view_get_model (view);
397 selection = gtk_tree_view_get_selection (view);
398 store = GTK_LIST_STORE (model);
400 empathy_chat_view_clear (window->chatview_find);
402 gtk_list_store_clear (store);
404 if (G_STR_EMPTY (search_criteria)) {
405 /* Just clear the search. */
409 hits = empathy_log_manager_search_new (window->log_manager, search_criteria);
411 for (l = hits; l; l = l->next) {
412 EmpathyLogSearchHit *hit;
413 const gchar *account_name;
414 const gchar *account_icon;
415 gchar *date_readable;
419 /* Protect against invalid data (corrupt or old log files. */
420 if (!hit->account || !hit->chat_id) {
424 date_readable = empathy_log_manager_get_date_readable (hit->date);
425 account_name = mc_account_get_display_name (hit->account);
426 account_icon = empathy_icon_name_from_account (hit->account);
428 gtk_list_store_append (store, &iter);
429 gtk_list_store_set (store, &iter,
430 COL_FIND_ACCOUNT_ICON, account_icon,
431 COL_FIND_ACCOUNT_NAME, account_name,
432 COL_FIND_ACCOUNT, hit->account,
433 COL_FIND_CHAT_NAME, hit->chat_id, /* FIXME */
434 COL_FIND_CHAT_ID, hit->chat_id,
435 COL_FIND_IS_CHATROOM, hit->is_chatroom,
436 COL_FIND_DATE, hit->date,
437 COL_FIND_DATE_READABLE, date_readable,
440 g_free (date_readable);
442 /* FIXME: Update COL_FIND_CHAT_NAME */
443 if (hit->is_chatroom) {
449 empathy_log_manager_search_free (hits);
454 log_window_find_setup (EmpathyLogWindow *window)
458 GtkTreeSelection *selection;
459 GtkTreeSortable *sortable;
460 GtkTreeViewColumn *column;
462 GtkCellRenderer *cell;
465 view = GTK_TREE_VIEW (window->treeview_find);
466 selection = gtk_tree_view_get_selection (view);
469 store = gtk_list_store_new (COL_FIND_COUNT,
470 G_TYPE_STRING, /* account icon name */
471 G_TYPE_STRING, /* account name */
472 MC_TYPE_ACCOUNT, /* account */
473 G_TYPE_STRING, /* chat name */
474 G_TYPE_STRING, /* chat id */
475 G_TYPE_BOOLEAN, /* is chatroom */
476 G_TYPE_STRING, /* date */
477 G_TYPE_STRING); /* date_readable */
479 model = GTK_TREE_MODEL (store);
480 sortable = GTK_TREE_SORTABLE (store);
482 gtk_tree_view_set_model (view, model);
485 column = gtk_tree_view_column_new ();
487 cell = gtk_cell_renderer_pixbuf_new ();
488 gtk_tree_view_column_pack_start (column, cell, FALSE);
489 gtk_tree_view_column_add_attribute (column, cell,
491 COL_FIND_ACCOUNT_ICON);
493 cell = gtk_cell_renderer_text_new ();
494 gtk_tree_view_column_pack_start (column, cell, TRUE);
495 gtk_tree_view_column_add_attribute (column, cell,
497 COL_FIND_ACCOUNT_NAME);
499 gtk_tree_view_column_set_title (column, _("Account"));
500 gtk_tree_view_append_column (view, column);
502 gtk_tree_view_column_set_resizable (column, TRUE);
503 gtk_tree_view_column_set_clickable (column, TRUE);
505 cell = gtk_cell_renderer_text_new ();
506 offset = gtk_tree_view_insert_column_with_attributes (view, -1, _("Conversation"),
507 cell, "text", COL_FIND_CHAT_NAME,
510 column = gtk_tree_view_get_column (view, offset - 1);
511 gtk_tree_view_column_set_sort_column_id (column, COL_FIND_CHAT_NAME);
512 gtk_tree_view_column_set_resizable (column, TRUE);
513 gtk_tree_view_column_set_clickable (column, TRUE);
515 cell = gtk_cell_renderer_text_new ();
516 offset = gtk_tree_view_insert_column_with_attributes (view, -1, _("Date"),
517 cell, "text", COL_FIND_DATE_READABLE,
520 column = gtk_tree_view_get_column (view, offset - 1);
521 gtk_tree_view_column_set_sort_column_id (column, COL_FIND_DATE);
522 gtk_tree_view_column_set_resizable (column, TRUE);
523 gtk_tree_view_column_set_clickable (column, TRUE);
525 /* Set up treeview properties */
526 gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
527 gtk_tree_sortable_set_sort_column_id (sortable,
532 g_signal_connect (selection, "changed",
533 G_CALLBACK (log_window_find_changed_cb),
536 g_object_unref (store);
540 log_window_button_find_clicked_cb (GtkWidget *widget,
541 EmpathyLogWindow *window)
545 str = gtk_entry_get_text (GTK_ENTRY (window->entry_find));
547 /* Don't find the same crap again */
548 if (window->last_find && strcmp (window->last_find, str) == 0) {
552 g_free (window->last_find);
553 window->last_find = g_strdup (str);
555 log_window_find_populate (window, str);
559 log_window_button_next_clicked_cb (GtkWidget *widget,
560 EmpathyLogWindow *window)
562 if (window->last_find) {
563 gboolean can_do_previous;
564 gboolean can_do_next;
566 empathy_chat_view_find_next (window->chatview_find,
569 empathy_chat_view_find_abilities (window->chatview_find,
573 gtk_widget_set_sensitive (window->button_previous, can_do_previous);
574 gtk_widget_set_sensitive (window->button_next, can_do_next);
579 log_window_button_previous_clicked_cb (GtkWidget *widget,
580 EmpathyLogWindow *window)
582 if (window->last_find) {
583 gboolean can_do_previous;
584 gboolean can_do_next;
586 empathy_chat_view_find_previous (window->chatview_find,
589 empathy_chat_view_find_abilities (window->chatview_find,
593 gtk_widget_set_sensitive (window->button_previous, can_do_previous);
594 gtk_widget_set_sensitive (window->button_next, can_do_next);
603 log_window_chats_changed_cb (GtkTreeSelection *selection,
604 EmpathyLogWindow *window)
606 /* Use last date by default */
607 gtk_calendar_clear_marks (GTK_CALENDAR (window->calendar_chats));
609 log_window_chats_get_messages (window, NULL);
613 log_window_chats_populate (EmpathyLogWindow *window)
615 EmpathyAccountChooser *account_chooser;
621 GtkTreeSelection *selection;
625 account_chooser = EMPATHY_ACCOUNT_CHOOSER (window->account_chooser_chats);
626 account = empathy_account_chooser_get_account (account_chooser);
628 view = GTK_TREE_VIEW (window->treeview_chats);
629 model = gtk_tree_view_get_model (view);
630 selection = gtk_tree_view_get_selection (view);
631 store = GTK_LIST_STORE (model);
633 /* Block signals to stop the logs being retrieved prematurely */
634 g_signal_handlers_block_by_func (selection,
635 log_window_chats_changed_cb,
638 gtk_list_store_clear (store);
640 chats = empathy_log_manager_get_chats (window->log_manager, account);
641 for (l = chats; l; l = l->next) {
642 EmpathyLogSearchHit *hit;
646 gtk_list_store_append (store, &iter);
647 gtk_list_store_set (store, &iter,
648 COL_CHAT_ICON, "empathy-available", /* FIXME */
649 COL_CHAT_NAME, hit->chat_id,
650 COL_CHAT_ACCOUNT, account,
651 COL_CHAT_ID, hit->chat_id,
652 COL_CHAT_IS_CHATROOM, hit->is_chatroom,
655 /* FIXME: Update COL_CHAT_ICON/NAME */
656 if (hit->is_chatroom) {
660 empathy_log_manager_search_free (chats);
662 /* Unblock signals */
663 g_signal_handlers_unblock_by_func (selection,
664 log_window_chats_changed_cb,
668 g_object_unref (account);
672 log_window_chats_setup (EmpathyLogWindow *window)
676 GtkTreeSelection *selection;
677 GtkTreeSortable *sortable;
678 GtkTreeViewColumn *column;
680 GtkCellRenderer *cell;
682 view = GTK_TREE_VIEW (window->treeview_chats);
683 selection = gtk_tree_view_get_selection (view);
686 store = gtk_list_store_new (COL_CHAT_COUNT,
687 G_TYPE_STRING, /* icon */
688 G_TYPE_STRING, /* name */
689 MC_TYPE_ACCOUNT, /* account */
690 G_TYPE_STRING, /* id */
691 G_TYPE_BOOLEAN); /* is chatroom */
693 model = GTK_TREE_MODEL (store);
694 sortable = GTK_TREE_SORTABLE (store);
696 gtk_tree_view_set_model (view, model);
699 column = gtk_tree_view_column_new ();
701 cell = gtk_cell_renderer_pixbuf_new ();
702 gtk_tree_view_column_pack_start (column, cell, FALSE);
703 gtk_tree_view_column_add_attribute (column, cell,
707 cell = gtk_cell_renderer_text_new ();
708 g_object_set (cell, "ellipsize", PANGO_ELLIPSIZE_END, NULL);
709 gtk_tree_view_column_pack_start (column, cell, TRUE);
710 gtk_tree_view_column_add_attribute (column, cell,
714 gtk_tree_view_append_column (view, column);
716 /* set up treeview properties */
717 gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
718 gtk_tree_sortable_set_sort_column_id (sortable,
723 g_signal_connect (selection, "changed",
724 G_CALLBACK (log_window_chats_changed_cb),
727 g_object_unref (store);
731 log_window_chats_accounts_changed_cb (GtkWidget *combobox,
732 EmpathyLogWindow *window)
734 /* Clear all current messages shown in the textview */
735 empathy_chat_view_clear (window->chatview_chats);
737 log_window_chats_populate (window);
741 log_window_chats_new_message_cb (EmpathyContact *own_contact,
742 EmpathyMessage *message,
743 EmpathyLogWindow *window)
745 empathy_chat_view_append_message (window->chatview_chats, message);
747 /* Scroll to the most recent messages */
748 empathy_chat_view_scroll_down (window->chatview_chats);
752 log_window_chats_set_selected (EmpathyLogWindow *window,
754 const gchar *chat_id,
755 gboolean is_chatroom)
757 EmpathyAccountChooser *account_chooser;
760 GtkTreeSelection *selection;
765 account_chooser = EMPATHY_ACCOUNT_CHOOSER (window->account_chooser_chats);
766 empathy_account_chooser_set_account (account_chooser, account);
768 view = GTK_TREE_VIEW (window->treeview_chats);
769 model = gtk_tree_view_get_model (view);
770 selection = gtk_tree_view_get_selection (view);
772 if (!gtk_tree_model_get_iter_first (model, &iter)) {
776 for (ok = TRUE; ok; ok = gtk_tree_model_iter_next (model, &iter)) {
777 McAccount *this_account;
779 gboolean this_is_chatroom;
781 gtk_tree_model_get (model, &iter,
782 COL_CHAT_ACCOUNT, &this_account,
783 COL_CHAT_ID, &this_chat_id,
784 COL_CHAT_IS_CHATROOM, &this_is_chatroom,
787 if (empathy_account_equal (this_account, account) &&
788 strcmp (this_chat_id, chat_id) == 0 &&
789 this_is_chatroom == is_chatroom) {
790 gtk_tree_selection_select_iter (selection, &iter);
791 path = gtk_tree_model_get_path (model, &iter);
792 gtk_tree_view_scroll_to_cell (view, path, NULL, TRUE, 0.5, 0.0);
793 gtk_tree_path_free (path);
794 g_object_unref (this_account);
795 g_free (this_chat_id);
799 g_object_unref (this_account);
800 g_free (this_chat_id);
805 log_window_chats_get_selected (EmpathyLogWindow *window,
808 gboolean *is_chatroom)
812 GtkTreeSelection *selection;
815 McAccount *acc = NULL;
816 gboolean room = FALSE;
818 view = GTK_TREE_VIEW (window->treeview_chats);
819 model = gtk_tree_view_get_model (view);
820 selection = gtk_tree_view_get_selection (view);
822 if (!gtk_tree_selection_get_selected (selection, NULL, &iter)) {
826 gtk_tree_model_get (model, &iter,
827 COL_CHAT_ACCOUNT, &acc,
829 COL_CHAT_IS_CHATROOM, &room,
840 g_object_unref (acc);
850 log_window_chats_get_messages (EmpathyLogWindow *window,
851 const gchar *date_to_show)
855 gboolean is_chatroom;
856 EmpathyMessage *message;
864 guint month_selected;
867 if (!log_window_chats_get_selected (window, &account,
868 &chat_id, &is_chatroom)) {
872 g_signal_handlers_block_by_func (window->calendar_chats,
873 log_window_calendar_chats_day_selected_cb,
876 /* Either use the supplied date or get the last */
879 gboolean day_selected = FALSE;
881 /* Get a list of dates and show them on the calendar */
882 dates = empathy_log_manager_get_dates (window->log_manager,
886 for (l = dates; l; l = l->next) {
894 sscanf (str, "%4d%2d%2d", &year, &month, &day);
895 gtk_calendar_get_date (GTK_CALENDAR (window->calendar_chats),
906 if (year != year_selected || month != month_selected) {
911 empathy_debug (DEBUG_DOMAIN, "Marking date:'%s'", str);
912 gtk_calendar_mark_day (GTK_CALENDAR (window->calendar_chats), day);
920 gtk_calendar_select_day (GTK_CALENDAR (window->calendar_chats), day);
924 /* Unselect the day in the calendar */
925 gtk_calendar_select_day (GTK_CALENDAR (window->calendar_chats), 0);
928 sscanf (date, "%4d%2d%2d", &year, &month, &day);
929 gtk_calendar_get_date (GTK_CALENDAR (window->calendar_chats),
936 if (year != year_selected && month != month_selected) {
940 gtk_calendar_select_day (GTK_CALENDAR (window->calendar_chats), day);
943 g_signal_handlers_unblock_by_func (window->calendar_chats,
944 log_window_calendar_chats_day_selected_cb,
951 /* Clear all current messages shown in the textview */
952 empathy_chat_view_clear (window->chatview_chats);
954 /* Turn off scrolling temporarily */
955 empathy_chat_view_scroll (window->chatview_find, FALSE);
958 messages = empathy_log_manager_get_messages_for_date (window->log_manager,
963 for (l = messages; l; l = l->next) {
966 empathy_chat_view_append_message (window->chatview_chats,
968 g_object_unref (message);
970 g_list_free (messages);
972 /* Turn back on scrolling */
973 empathy_chat_view_scroll (window->chatview_find, TRUE);
975 /* Scroll to the most recent messages */
976 empathy_chat_view_scroll_down (window->chatview_chats);
978 /* Give the search entry main focus */
979 gtk_widget_grab_focus (window->entry_chats);
982 g_list_foreach (dates, (GFunc) g_free, NULL);
984 g_object_unref (account);
989 log_window_calendar_chats_day_selected_cb (GtkWidget *calendar,
990 EmpathyLogWindow *window)
998 gtk_calendar_get_date (GTK_CALENDAR (calendar), &year, &month, &day);
1000 /* We need this hear because it appears that the months start from 0 */
1003 date = g_strdup_printf ("%4.4d%2.2d%2.2d", year, month, day);
1005 empathy_debug (DEBUG_DOMAIN, "Currently selected date is:'%s'", date);
1007 log_window_chats_get_messages (window, date);
1013 log_window_calendar_chats_month_changed_cb (GtkWidget *calendar,
1014 EmpathyLogWindow *window)
1018 gboolean is_chatroom;
1019 guint year_selected;
1020 guint month_selected;
1025 gtk_calendar_clear_marks (GTK_CALENDAR (calendar));
1027 if (!log_window_chats_get_selected (window, &account,
1028 &chat_id, &is_chatroom)) {
1029 empathy_debug (DEBUG_DOMAIN, "No chat selected to get dates for...");
1033 g_object_get (calendar,
1034 "month", &month_selected,
1035 "year", &year_selected,
1038 /* We need this hear because it appears that the months start from 0 */
1041 /* Get the log object for this contact */
1042 dates = empathy_log_manager_get_dates (window->log_manager, account,
1043 chat_id, is_chatroom);
1044 g_object_unref (account);
1047 for (l = dates; l; l = l->next) {
1058 sscanf (str, "%4d%2d%2d", &year, &month, &day);
1060 if (year == year_selected && month == month_selected) {
1061 empathy_debug (DEBUG_DOMAIN, "Marking date:'%s'", str);
1062 gtk_calendar_mark_day (GTK_CALENDAR (window->calendar_chats), day);
1066 g_list_foreach (dates, (GFunc) g_free, NULL);
1067 g_list_free (dates);
1069 empathy_debug (DEBUG_DOMAIN,
1070 "Currently showing month %d and year %d",
1071 month_selected, year_selected);
1075 log_window_entry_chats_changed_cb (GtkWidget *entry,
1076 EmpathyLogWindow *window)
1080 str = gtk_entry_get_text (GTK_ENTRY (window->entry_chats));
1081 empathy_chat_view_highlight (window->chatview_chats, str);
1084 empathy_chat_view_find_next (window->chatview_chats,
1091 log_window_entry_chats_activate_cb (GtkWidget *entry,
1092 EmpathyLogWindow *window)
1096 str = gtk_entry_get_text (GTK_ENTRY (window->entry_chats));
1099 empathy_chat_view_find_next (window->chatview_chats,