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-2008 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., 51 Franklin St, Fifth Floor,
19 * Boston, MA 02110-1301 USA
21 * Authors: Martyn Russell <martyn@imendio.com>
22 * Xavier Claessens <xclaesse@gmail.com>
30 #include <glib/gi18n-lib.h>
33 #include <telepathy-glib/account-manager.h>
35 #include <libempathy/empathy-log-manager.h>
36 #include <libempathy/empathy-chatroom-manager.h>
37 #include <libempathy/empathy-chatroom.h>
38 #include <libempathy/empathy-message.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-theme-manager.h"
46 #include "empathy-ui-utils.h"
48 #define DEBUG_FLAG EMPATHY_DEBUG_OTHER
49 #include <libempathy/empathy-debug.h>
56 GtkWidget *entry_find;
57 GtkWidget *button_find;
58 GtkWidget *treeview_find;
59 GtkWidget *scrolledwindow_find;
60 EmpathyChatView *chatview_find;
61 GtkWidget *button_previous;
62 GtkWidget *button_next;
64 GtkWidget *vbox_chats;
65 GtkWidget *account_chooser_chats;
66 GtkWidget *entry_chats;
67 GtkWidget *calendar_chats;
68 GtkWidget *treeview_chats;
69 GtkWidget *scrolledwindow_chats;
70 EmpathyChatView *chatview_chats;
74 EmpathyLogManager *log_manager;
76 /* Those are only used while waiting for the account chooser to be ready */
77 TpAccount *selected_account;
78 gchar *selected_chat_id;
79 gboolean selected_is_chatroom;
82 static void log_window_destroy_cb (GtkWidget *widget,
83 EmpathyLogWindow *window);
84 static void log_window_entry_find_changed_cb (GtkWidget *entry,
85 EmpathyLogWindow *window);
86 static void log_window_find_changed_cb (GtkTreeSelection *selection,
87 EmpathyLogWindow *window);
88 static void log_window_find_populate (EmpathyLogWindow *window,
89 const gchar *search_criteria);
90 static void log_window_find_setup (EmpathyLogWindow *window);
91 static void log_window_button_find_clicked_cb (GtkWidget *widget,
92 EmpathyLogWindow *window);
93 static void log_window_button_next_clicked_cb (GtkWidget *widget,
94 EmpathyLogWindow *window);
95 static void log_window_button_previous_clicked_cb (GtkWidget *widget,
96 EmpathyLogWindow *window);
97 static void log_window_chats_changed_cb (GtkTreeSelection *selection,
98 EmpathyLogWindow *window);
99 static void log_window_chats_populate (EmpathyLogWindow *window);
100 static void log_window_chats_setup (EmpathyLogWindow *window);
101 static void log_window_chats_accounts_changed_cb (GtkWidget *combobox,
102 EmpathyLogWindow *window);
103 static void log_window_chats_set_selected (EmpathyLogWindow *window,
105 const gchar *chat_id,
106 gboolean is_chatroom);
107 static gboolean log_window_chats_get_selected (EmpathyLogWindow *window,
110 gboolean *is_chatroom);
111 static void log_window_chats_get_messages (EmpathyLogWindow *window,
112 const gchar *date_to_show);
113 static void log_window_calendar_chats_day_selected_cb (GtkWidget *calendar,
114 EmpathyLogWindow *window);
115 static void log_window_calendar_chats_month_changed_cb (GtkWidget *calendar,
116 EmpathyLogWindow *window);
117 static void log_window_entry_chats_changed_cb (GtkWidget *entry,
118 EmpathyLogWindow *window);
119 static void log_window_entry_chats_activate_cb (GtkWidget *entry,
120 EmpathyLogWindow *window);
123 COL_FIND_ACCOUNT_ICON,
124 COL_FIND_ACCOUNT_NAME,
128 COL_FIND_IS_CHATROOM,
130 COL_FIND_DATE_READABLE,
139 COL_CHAT_IS_CHATROOM,
144 account_manager_prepared_cb (GObject *source_object,
145 GAsyncResult *result,
148 TpAccountManager *account_manager = TP_ACCOUNT_MANAGER (source_object);
149 EmpathyLogWindow *window = user_data;
152 GError *error = NULL;
154 if (!tp_account_manager_prepare_finish (account_manager, result, &error)) {
155 DEBUG ("Failed to prepare account manager: %s", error->message);
156 g_error_free (error);
160 accounts = tp_account_manager_get_valid_accounts (account_manager);
161 account_num = g_list_length (accounts);
162 g_list_free (accounts);
164 if (account_num > 1) {
165 gtk_widget_show (window->vbox_chats);
166 gtk_widget_show (window->account_chooser_chats);
168 gtk_widget_hide (window->vbox_chats);
169 gtk_widget_hide (window->account_chooser_chats);
174 account_chooser_ready_cb (EmpathyAccountChooser *chooser,
175 EmpathyLogWindow *window)
177 gtk_notebook_set_current_page (GTK_NOTEBOOK (window->notebook), 1);
178 log_window_chats_set_selected (window, window->selected_account,
179 window->selected_chat_id, window->selected_is_chatroom);
183 empathy_log_window_show (TpAccount *account,
184 const gchar *chat_id,
185 gboolean is_chatroom,
188 static EmpathyLogWindow *window = NULL;
189 EmpathyAccountChooser *account_chooser;
190 TpAccountManager *account_manager;
195 gtk_window_present (GTK_WINDOW (window->window));
197 if (account && chat_id) {
198 gtk_notebook_set_current_page (GTK_NOTEBOOK (window->notebook), 1);
199 log_window_chats_set_selected (window, account,
200 chat_id, is_chatroom);
203 return window->window;
206 window = g_new0 (EmpathyLogWindow, 1);
207 window->log_manager = empathy_log_manager_dup_singleton ();
209 filename = empathy_file_lookup ("empathy-log-window.ui",
211 gui = empathy_builder_get_file (filename,
212 "log_window", &window->window,
213 "notebook", &window->notebook,
214 "entry_find", &window->entry_find,
215 "button_find", &window->button_find,
216 "treeview_find", &window->treeview_find,
217 "scrolledwindow_find", &window->scrolledwindow_find,
218 "button_previous", &window->button_previous,
219 "button_next", &window->button_next,
220 "entry_chats", &window->entry_chats,
221 "calendar_chats", &window->calendar_chats,
222 "vbox_chats", &window->vbox_chats,
223 "treeview_chats", &window->treeview_chats,
224 "scrolledwindow_chats", &window->scrolledwindow_chats,
228 empathy_builder_connect (gui, window,
229 "log_window", "destroy", log_window_destroy_cb,
230 "entry_find", "changed", log_window_entry_find_changed_cb,
231 "button_previous", "clicked", log_window_button_previous_clicked_cb,
232 "button_next", "clicked", log_window_button_next_clicked_cb,
233 "button_find", "clicked", log_window_button_find_clicked_cb,
234 "entry_chats", "changed", log_window_entry_chats_changed_cb,
235 "entry_chats", "activate", log_window_entry_chats_activate_cb,
238 g_object_unref (gui);
240 g_object_add_weak_pointer (G_OBJECT (window->window),
243 /* We set this up here so we can block it when needed. */
244 g_signal_connect (window->calendar_chats, "day-selected",
245 G_CALLBACK (log_window_calendar_chats_day_selected_cb),
247 g_signal_connect (window->calendar_chats, "month-changed",
248 G_CALLBACK (log_window_calendar_chats_month_changed_cb),
251 /* Configure Search EmpathyChatView */
252 window->chatview_find = empathy_theme_manager_create_view (empathy_theme_manager_get ());
253 gtk_container_add (GTK_CONTAINER (window->scrolledwindow_find),
254 GTK_WIDGET (window->chatview_find));
255 gtk_widget_show (GTK_WIDGET (window->chatview_find));
257 /* Configure Contacts EmpathyChatView */
258 window->chatview_chats = empathy_theme_manager_create_view (empathy_theme_manager_get ());
259 gtk_container_add (GTK_CONTAINER (window->scrolledwindow_chats),
260 GTK_WIDGET (window->chatview_chats));
261 gtk_widget_show (GTK_WIDGET (window->chatview_chats));
263 /* Account chooser for chats */
264 window->account_chooser_chats = empathy_account_chooser_new ();
265 account_chooser = EMPATHY_ACCOUNT_CHOOSER (window->account_chooser_chats);
267 gtk_box_pack_start (GTK_BOX (window->vbox_chats),
268 window->account_chooser_chats,
271 g_signal_connect (window->account_chooser_chats, "changed",
272 G_CALLBACK (log_window_chats_accounts_changed_cb),
276 account_manager = tp_account_manager_dup ();
277 tp_account_manager_prepare_async (account_manager, NULL,
278 account_manager_prepared_cb, window);
279 g_object_unref (account_manager);
282 log_window_find_setup (window);
285 log_window_chats_setup (window);
286 log_window_chats_populate (window);
288 if (account && chat_id) {
289 window->selected_account = account;
290 window->selected_chat_id = g_strdup (chat_id);
291 window->selected_is_chatroom = is_chatroom;
293 if (empathy_account_chooser_is_ready (account_chooser))
294 account_chooser_ready_cb (account_chooser, window);
296 /* Chat will be selected once the account chooser is ready */
297 g_signal_connect (account_chooser, "ready",
298 G_CALLBACK (account_chooser_ready_cb), window);
302 gtk_window_set_transient_for (GTK_WINDOW (window->window),
303 GTK_WINDOW (parent));
306 gtk_widget_show (window->window);
308 return window->window;
312 log_window_destroy_cb (GtkWidget *widget,
313 EmpathyLogWindow *window)
315 g_free (window->last_find);
316 g_object_unref (window->log_manager);
317 g_free (window->selected_chat_id);
326 log_window_entry_find_changed_cb (GtkWidget *entry,
327 EmpathyLogWindow *window)
330 gboolean is_sensitive = TRUE;
332 str = gtk_entry_get_text (GTK_ENTRY (window->entry_find));
334 is_sensitive &= !EMP_STR_EMPTY (str);
336 !window->last_find ||
337 (window->last_find && strcmp (window->last_find, str) != 0);
339 gtk_widget_set_sensitive (window->button_find, is_sensitive);
343 log_window_find_changed_cb (GtkTreeSelection *selection,
344 EmpathyLogWindow *window)
351 gboolean is_chatroom;
353 EmpathyMessage *message;
356 gboolean can_do_previous;
357 gboolean can_do_next;
359 /* Get selected information */
360 view = GTK_TREE_VIEW (window->treeview_find);
361 model = gtk_tree_view_get_model (view);
363 if (!gtk_tree_selection_get_selected (selection, NULL, &iter)) {
364 gtk_widget_set_sensitive (window->button_previous, FALSE);
365 gtk_widget_set_sensitive (window->button_next, FALSE);
367 empathy_chat_view_clear (window->chatview_find);
372 gtk_widget_set_sensitive (window->button_previous, TRUE);
373 gtk_widget_set_sensitive (window->button_next, TRUE);
375 gtk_tree_model_get (model, &iter,
376 COL_FIND_ACCOUNT, &account,
377 COL_FIND_CHAT_ID, &chat_id,
378 COL_FIND_IS_CHATROOM, &is_chatroom,
379 COL_FIND_DATE, &date,
382 /* Clear all current messages shown in the textview */
383 empathy_chat_view_clear (window->chatview_find);
385 /* Turn off scrolling temporarily */
386 empathy_chat_view_scroll (window->chatview_find, FALSE);
389 messages = empathy_log_manager_get_messages_for_date (window->log_manager,
394 g_object_unref (account);
398 for (l = messages; l; l = l->next) {
400 empathy_chat_view_append_message (window->chatview_find, message);
401 g_object_unref (message);
403 g_list_free (messages);
405 /* Scroll to the most recent messages */
406 empathy_chat_view_scroll (window->chatview_find, TRUE);
408 /* Highlight and find messages */
409 empathy_chat_view_highlight (window->chatview_find,
410 window->last_find, FALSE);
411 empathy_chat_view_find_next (window->chatview_find,
415 empathy_chat_view_find_abilities (window->chatview_find,
420 gtk_widget_set_sensitive (window->button_previous, can_do_previous);
421 gtk_widget_set_sensitive (window->button_next, can_do_next);
422 gtk_widget_set_sensitive (window->button_find, FALSE);
426 log_window_find_populate (EmpathyLogWindow *window,
427 const gchar *search_criteria)
433 GtkTreeSelection *selection;
437 view = GTK_TREE_VIEW (window->treeview_find);
438 model = gtk_tree_view_get_model (view);
439 selection = gtk_tree_view_get_selection (view);
440 store = GTK_LIST_STORE (model);
442 empathy_chat_view_clear (window->chatview_find);
444 gtk_list_store_clear (store);
446 if (EMP_STR_EMPTY (search_criteria)) {
447 /* Just clear the search. */
451 hits = empathy_log_manager_search_new (window->log_manager, search_criteria);
453 for (l = hits; l; l = l->next) {
454 EmpathyLogSearchHit *hit;
455 const gchar *account_name;
456 const gchar *account_icon;
457 gchar *date_readable;
461 /* Protect against invalid data (corrupt or old log files. */
462 if (!hit->account || !hit->chat_id) {
466 date_readable = empathy_log_manager_get_date_readable (hit->date);
467 account_name = tp_account_get_display_name (hit->account);
468 account_icon = tp_account_get_icon_name (hit->account);
470 gtk_list_store_append (store, &iter);
471 gtk_list_store_set (store, &iter,
472 COL_FIND_ACCOUNT_ICON, account_icon,
473 COL_FIND_ACCOUNT_NAME, account_name,
474 COL_FIND_ACCOUNT, hit->account,
475 COL_FIND_CHAT_NAME, hit->chat_id, /* FIXME */
476 COL_FIND_CHAT_ID, hit->chat_id,
477 COL_FIND_IS_CHATROOM, hit->is_chatroom,
478 COL_FIND_DATE, hit->date,
479 COL_FIND_DATE_READABLE, date_readable,
482 g_free (date_readable);
484 /* FIXME: Update COL_FIND_CHAT_NAME */
485 if (hit->is_chatroom) {
491 empathy_log_manager_search_free (hits);
496 log_window_find_setup (EmpathyLogWindow *window)
500 GtkTreeSelection *selection;
501 GtkTreeSortable *sortable;
502 GtkTreeViewColumn *column;
504 GtkCellRenderer *cell;
507 view = GTK_TREE_VIEW (window->treeview_find);
508 selection = gtk_tree_view_get_selection (view);
511 store = gtk_list_store_new (COL_FIND_COUNT,
512 G_TYPE_STRING, /* account icon name */
513 G_TYPE_STRING, /* account name */
514 TP_TYPE_ACCOUNT, /* account */
515 G_TYPE_STRING, /* chat name */
516 G_TYPE_STRING, /* chat id */
517 G_TYPE_BOOLEAN, /* is chatroom */
518 G_TYPE_STRING, /* date */
519 G_TYPE_STRING); /* date_readable */
521 model = GTK_TREE_MODEL (store);
522 sortable = GTK_TREE_SORTABLE (store);
524 gtk_tree_view_set_model (view, model);
527 column = gtk_tree_view_column_new ();
529 cell = gtk_cell_renderer_pixbuf_new ();
530 gtk_tree_view_column_pack_start (column, cell, FALSE);
531 gtk_tree_view_column_add_attribute (column, cell,
533 COL_FIND_ACCOUNT_ICON);
535 cell = gtk_cell_renderer_text_new ();
536 gtk_tree_view_column_pack_start (column, cell, TRUE);
537 gtk_tree_view_column_add_attribute (column, cell,
539 COL_FIND_ACCOUNT_NAME);
541 gtk_tree_view_column_set_title (column, _("Account"));
542 gtk_tree_view_append_column (view, column);
544 gtk_tree_view_column_set_resizable (column, TRUE);
545 gtk_tree_view_column_set_clickable (column, TRUE);
547 cell = gtk_cell_renderer_text_new ();
548 offset = gtk_tree_view_insert_column_with_attributes (view, -1, _("Conversation"),
549 cell, "text", COL_FIND_CHAT_NAME,
552 column = gtk_tree_view_get_column (view, offset - 1);
553 gtk_tree_view_column_set_sort_column_id (column, COL_FIND_CHAT_NAME);
554 gtk_tree_view_column_set_resizable (column, TRUE);
555 gtk_tree_view_column_set_clickable (column, TRUE);
557 cell = gtk_cell_renderer_text_new ();
558 offset = gtk_tree_view_insert_column_with_attributes (view, -1, _("Date"),
559 cell, "text", COL_FIND_DATE_READABLE,
562 column = gtk_tree_view_get_column (view, offset - 1);
563 gtk_tree_view_column_set_sort_column_id (column, COL_FIND_DATE);
564 gtk_tree_view_column_set_resizable (column, TRUE);
565 gtk_tree_view_column_set_clickable (column, TRUE);
567 /* Set up treeview properties */
568 gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
569 gtk_tree_sortable_set_sort_column_id (sortable,
574 g_signal_connect (selection, "changed",
575 G_CALLBACK (log_window_find_changed_cb),
578 g_object_unref (store);
582 log_window_button_find_clicked_cb (GtkWidget *widget,
583 EmpathyLogWindow *window)
587 str = gtk_entry_get_text (GTK_ENTRY (window->entry_find));
589 /* Don't find the same crap again */
590 if (window->last_find && strcmp (window->last_find, str) == 0) {
594 g_free (window->last_find);
595 window->last_find = g_strdup (str);
597 log_window_find_populate (window, str);
601 log_window_button_next_clicked_cb (GtkWidget *widget,
602 EmpathyLogWindow *window)
604 if (window->last_find) {
605 gboolean can_do_previous;
606 gboolean can_do_next;
608 empathy_chat_view_find_next (window->chatview_find,
612 empathy_chat_view_find_abilities (window->chatview_find,
617 gtk_widget_set_sensitive (window->button_previous, can_do_previous);
618 gtk_widget_set_sensitive (window->button_next, can_do_next);
623 log_window_button_previous_clicked_cb (GtkWidget *widget,
624 EmpathyLogWindow *window)
626 if (window->last_find) {
627 gboolean can_do_previous;
628 gboolean can_do_next;
630 empathy_chat_view_find_previous (window->chatview_find,
634 empathy_chat_view_find_abilities (window->chatview_find,
639 gtk_widget_set_sensitive (window->button_previous, can_do_previous);
640 gtk_widget_set_sensitive (window->button_next, can_do_next);
649 log_window_chats_changed_cb (GtkTreeSelection *selection,
650 EmpathyLogWindow *window)
652 /* Use last date by default */
653 gtk_calendar_clear_marks (GTK_CALENDAR (window->calendar_chats));
655 log_window_chats_get_messages (window, NULL);
659 log_window_chats_populate (EmpathyLogWindow *window)
661 EmpathyAccountChooser *account_chooser;
667 GtkTreeSelection *selection;
671 account_chooser = EMPATHY_ACCOUNT_CHOOSER (window->account_chooser_chats);
672 account = empathy_account_chooser_dup_account (account_chooser);
674 view = GTK_TREE_VIEW (window->treeview_chats);
675 model = gtk_tree_view_get_model (view);
676 selection = gtk_tree_view_get_selection (view);
677 store = GTK_LIST_STORE (model);
679 if (account == NULL) {
680 gtk_list_store_clear (store);
684 /* Block signals to stop the logs being retrieved prematurely */
685 g_signal_handlers_block_by_func (selection,
686 log_window_chats_changed_cb,
689 gtk_list_store_clear (store);
691 chats = empathy_log_manager_get_chats (window->log_manager, account);
692 for (l = chats; l; l = l->next) {
693 EmpathyLogSearchHit *hit;
697 gtk_list_store_append (store, &iter);
698 gtk_list_store_set (store, &iter,
699 COL_CHAT_ICON, "empathy-available", /* FIXME */
700 COL_CHAT_NAME, hit->chat_id,
701 COL_CHAT_ACCOUNT, account,
702 COL_CHAT_ID, hit->chat_id,
703 COL_CHAT_IS_CHATROOM, hit->is_chatroom,
706 /* FIXME: Update COL_CHAT_ICON/NAME */
707 if (hit->is_chatroom) {
711 empathy_log_manager_search_free (chats);
713 /* Unblock signals */
714 g_signal_handlers_unblock_by_func (selection,
715 log_window_chats_changed_cb,
719 g_object_unref (account);
723 log_window_chats_setup (EmpathyLogWindow *window)
727 GtkTreeSelection *selection;
728 GtkTreeSortable *sortable;
729 GtkTreeViewColumn *column;
731 GtkCellRenderer *cell;
733 view = GTK_TREE_VIEW (window->treeview_chats);
734 selection = gtk_tree_view_get_selection (view);
737 store = gtk_list_store_new (COL_CHAT_COUNT,
738 G_TYPE_STRING, /* icon */
739 G_TYPE_STRING, /* name */
740 TP_TYPE_ACCOUNT, /* account */
741 G_TYPE_STRING, /* id */
742 G_TYPE_BOOLEAN); /* is chatroom */
744 model = GTK_TREE_MODEL (store);
745 sortable = GTK_TREE_SORTABLE (store);
747 gtk_tree_view_set_model (view, model);
750 column = gtk_tree_view_column_new ();
752 cell = gtk_cell_renderer_pixbuf_new ();
753 gtk_tree_view_column_pack_start (column, cell, FALSE);
754 gtk_tree_view_column_add_attribute (column, cell,
758 cell = gtk_cell_renderer_text_new ();
759 g_object_set (cell, "ellipsize", PANGO_ELLIPSIZE_END, NULL);
760 gtk_tree_view_column_pack_start (column, cell, TRUE);
761 gtk_tree_view_column_add_attribute (column, cell,
765 gtk_tree_view_append_column (view, column);
767 /* set up treeview properties */
768 gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
769 gtk_tree_sortable_set_sort_column_id (sortable,
774 g_signal_connect (selection, "changed",
775 G_CALLBACK (log_window_chats_changed_cb),
778 g_object_unref (store);
782 log_window_chats_accounts_changed_cb (GtkWidget *combobox,
783 EmpathyLogWindow *window)
785 /* Clear all current messages shown in the textview */
786 empathy_chat_view_clear (window->chatview_chats);
788 log_window_chats_populate (window);
792 log_window_chats_set_selected (EmpathyLogWindow *window,
794 const gchar *chat_id,
795 gboolean is_chatroom)
797 EmpathyAccountChooser *account_chooser;
800 GtkTreeSelection *selection;
805 account_chooser = EMPATHY_ACCOUNT_CHOOSER (window->account_chooser_chats);
806 empathy_account_chooser_set_account (account_chooser, account);
808 view = GTK_TREE_VIEW (window->treeview_chats);
809 model = gtk_tree_view_get_model (view);
810 selection = gtk_tree_view_get_selection (view);
812 if (!gtk_tree_model_get_iter_first (model, &iter)) {
816 for (ok = TRUE; ok; ok = gtk_tree_model_iter_next (model, &iter)) {
817 TpAccount *this_account;
819 gboolean this_is_chatroom;
821 gtk_tree_model_get (model, &iter,
822 COL_CHAT_ACCOUNT, &this_account,
823 COL_CHAT_ID, &this_chat_id,
824 COL_CHAT_IS_CHATROOM, &this_is_chatroom,
827 if (this_account == account &&
828 strcmp (this_chat_id, chat_id) == 0 &&
829 this_is_chatroom == is_chatroom) {
830 gtk_tree_selection_select_iter (selection, &iter);
831 path = gtk_tree_model_get_path (model, &iter);
832 gtk_tree_view_scroll_to_cell (view, path, NULL, TRUE, 0.5, 0.0);
833 gtk_tree_path_free (path);
834 g_object_unref (this_account);
835 g_free (this_chat_id);
839 g_object_unref (this_account);
840 g_free (this_chat_id);
845 log_window_chats_get_selected (EmpathyLogWindow *window,
848 gboolean *is_chatroom)
852 GtkTreeSelection *selection;
855 TpAccount *acc = NULL;
856 gboolean room = FALSE;
858 view = GTK_TREE_VIEW (window->treeview_chats);
859 model = gtk_tree_view_get_model (view);
860 selection = gtk_tree_view_get_selection (view);
862 if (!gtk_tree_selection_get_selected (selection, NULL, &iter)) {
866 gtk_tree_model_get (model, &iter,
867 COL_CHAT_ACCOUNT, &acc,
869 COL_CHAT_IS_CHATROOM, &room,
880 g_object_unref (acc);
890 log_window_chats_get_messages (EmpathyLogWindow *window,
891 const gchar *date_to_show)
895 gboolean is_chatroom;
896 EmpathyMessage *message;
904 guint month_selected;
907 if (!log_window_chats_get_selected (window, &account,
908 &chat_id, &is_chatroom)) {
912 g_signal_handlers_block_by_func (window->calendar_chats,
913 log_window_calendar_chats_day_selected_cb,
916 /* Either use the supplied date or get the last */
919 gboolean day_selected = FALSE;
921 /* Get a list of dates and show them on the calendar */
922 dates = empathy_log_manager_get_dates (window->log_manager,
926 for (l = dates; l; l = l->next) {
934 sscanf (str, "%4d%2d%2d", &year, &month, &day);
935 gtk_calendar_get_date (GTK_CALENDAR (window->calendar_chats),
946 if (year != year_selected || month != month_selected) {
951 DEBUG ("Marking date:'%s'", str);
952 gtk_calendar_mark_day (GTK_CALENDAR (window->calendar_chats), day);
960 gtk_calendar_select_day (GTK_CALENDAR (window->calendar_chats), day);
964 /* Unselect the day in the calendar */
965 gtk_calendar_select_day (GTK_CALENDAR (window->calendar_chats), 0);
968 sscanf (date, "%4d%2d%2d", &year, &month, &day);
969 gtk_calendar_get_date (GTK_CALENDAR (window->calendar_chats),
976 if (year != year_selected && month != month_selected) {
980 gtk_calendar_select_day (GTK_CALENDAR (window->calendar_chats), day);
983 g_signal_handlers_unblock_by_func (window->calendar_chats,
984 log_window_calendar_chats_day_selected_cb,
991 /* Clear all current messages shown in the textview */
992 empathy_chat_view_clear (window->chatview_chats);
994 /* Turn off scrolling temporarily */
995 empathy_chat_view_scroll (window->chatview_find, FALSE);
998 messages = empathy_log_manager_get_messages_for_date (window->log_manager,
1003 for (l = messages; l; l = l->next) {
1006 empathy_chat_view_append_message (window->chatview_chats,
1008 g_object_unref (message);
1010 g_list_free (messages);
1012 /* Turn back on scrolling */
1013 empathy_chat_view_scroll (window->chatview_find, TRUE);
1015 /* Give the search entry main focus */
1016 gtk_widget_grab_focus (window->entry_chats);
1019 g_list_foreach (dates, (GFunc) g_free, NULL);
1020 g_list_free (dates);
1021 g_object_unref (account);
1026 log_window_calendar_chats_day_selected_cb (GtkWidget *calendar,
1027 EmpathyLogWindow *window)
1035 gtk_calendar_get_date (GTK_CALENDAR (calendar), &year, &month, &day);
1037 /* We need this hear because it appears that the months start from 0 */
1040 date = g_strdup_printf ("%4.4d%2.2d%2.2d", year, month, day);
1042 DEBUG ("Currently selected date is:'%s'", date);
1044 log_window_chats_get_messages (window, date);
1050 log_window_calendar_chats_month_changed_cb (GtkWidget *calendar,
1051 EmpathyLogWindow *window)
1055 gboolean is_chatroom;
1056 guint year_selected;
1057 guint month_selected;
1062 gtk_calendar_clear_marks (GTK_CALENDAR (calendar));
1064 if (!log_window_chats_get_selected (window, &account,
1065 &chat_id, &is_chatroom)) {
1066 DEBUG ("No chat selected to get dates for...");
1070 g_object_get (calendar,
1071 "month", &month_selected,
1072 "year", &year_selected,
1075 /* We need this hear because it appears that the months start from 0 */
1078 /* Get the log object for this contact */
1079 dates = empathy_log_manager_get_dates (window->log_manager, account,
1080 chat_id, is_chatroom);
1081 g_object_unref (account);
1084 for (l = dates; l; l = l->next) {
1095 sscanf (str, "%4d%2d%2d", &year, &month, &day);
1097 if (year == year_selected && month == month_selected) {
1098 DEBUG ("Marking date:'%s'", str);
1099 gtk_calendar_mark_day (GTK_CALENDAR (window->calendar_chats), day);
1103 g_list_foreach (dates, (GFunc) g_free, NULL);
1104 g_list_free (dates);
1106 DEBUG ("Currently showing month %d and year %d", month_selected,
1111 log_window_entry_chats_changed_cb (GtkWidget *entry,
1112 EmpathyLogWindow *window)
1116 str = gtk_entry_get_text (GTK_ENTRY (window->entry_chats));
1117 empathy_chat_view_highlight (window->chatview_chats, str, FALSE);
1120 empathy_chat_view_find_next (window->chatview_chats,
1128 log_window_entry_chats_activate_cb (GtkWidget *entry,
1129 EmpathyLogWindow *window)
1133 str = gtk_entry_get_text (GTK_ENTRY (window->entry_chats));
1136 empathy_chat_view_find_next (window->chatview_chats,