| 33 #include "request.h" |
33 #include "request.h" |
| 34 #include "util.h" |
34 #include "util.h" |
| 35 |
35 |
| 36 #include "pidginstock.h" |
36 #include "pidginstock.h" |
| 37 #include "gtkblist.h" |
37 #include "gtkblist.h" |
| 38 #include "gtkimhtml.h" |
|
| 39 #include "gtklog.h" |
38 #include "gtklog.h" |
| 40 #include "gtkutils.h" |
39 #include "gtkutils.h" |
| |
40 #include "gtkwebview.h" |
| 41 |
41 |
| 42 static GHashTable *log_viewers = NULL; |
42 static GHashTable *log_viewers = NULL; |
| 43 static void populate_log_tree(PidginLogViewer *lv); |
43 static void populate_log_tree(PidginLogViewer *lv); |
| 44 static PidginLogViewer *syslog_viewer = NULL; |
44 static PidginLogViewer *syslog_viewer = NULL; |
| 45 |
45 |
| 128 /* reset the tree */ |
128 /* reset the tree */ |
| 129 gtk_tree_store_clear(lv->treestore); |
129 gtk_tree_store_clear(lv->treestore); |
| 130 populate_log_tree(lv); |
130 populate_log_tree(lv); |
| 131 g_free(lv->search); |
131 g_free(lv->search); |
| 132 lv->search = NULL; |
132 lv->search = NULL; |
| 133 gtk_imhtml_search_clear(GTK_IMHTML(lv->imhtml)); |
133 webkit_web_view_unmark_text_matches(WEBKIT_WEB_VIEW(lv->web_view)); |
| 134 select_first_log(lv); |
134 select_first_log(lv); |
| 135 return; |
135 return; |
| 136 } |
136 } |
| 137 |
137 |
| 138 if (lv->search != NULL && !strcmp(lv->search, search_term)) |
138 if (lv->search != NULL && !strcmp(lv->search, search_term)) |
| 139 { |
139 { |
| 140 /* Searching for the same term acts as "Find Next" */ |
140 /* Searching for the same term acts as "Find Next" */ |
| 141 gtk_imhtml_search_find(GTK_IMHTML(lv->imhtml), lv->search); |
141 webkit_web_view_search_text(WEBKIT_WEB_VIEW(lv->web_view), lv->search, FALSE, TRUE, TRUE); |
| 142 return; |
142 return; |
| 143 } |
143 } |
| 144 |
144 |
| 145 pidgin_set_cursor(lv->window, GDK_WATCH); |
145 pidgin_set_cursor(lv->window, GDK_WATCH); |
| 146 |
146 |
| 147 g_free(lv->search); |
147 g_free(lv->search); |
| 148 lv->search = g_strdup(search_term); |
148 lv->search = g_strdup(search_term); |
| 149 |
149 |
| 150 gtk_tree_store_clear(lv->treestore); |
150 gtk_tree_store_clear(lv->treestore); |
| 151 gtk_imhtml_clear(GTK_IMHTML(lv->imhtml)); |
151 webkit_web_view_open(WEBKIT_WEB_VIEW(lv->web_view), "about:blank"); /* clear the view */ |
| 152 |
152 |
| 153 for (logs = lv->logs; logs != NULL; logs = logs->next) { |
153 for (logs = lv->logs; logs != NULL; logs = logs->next) { |
| 154 char *read = purple_log_read((PurpleLog*)logs->data, NULL); |
154 char *read = purple_log_read((PurpleLog*)logs->data, NULL); |
| 155 if (read && *read && purple_strcasestr(read, search_term)) { |
155 if (read && *read && purple_strcasestr(read, search_term)) { |
| 156 GtkTreeIter iter; |
156 GtkTreeIter iter; |
| 417 } |
417 } |
| 418 |
418 |
| 419 static gboolean search_find_cb(gpointer data) |
419 static gboolean search_find_cb(gpointer data) |
| 420 { |
420 { |
| 421 PidginLogViewer *viewer = data; |
421 PidginLogViewer *viewer = data; |
| 422 gtk_imhtml_search_find(GTK_IMHTML(viewer->imhtml), viewer->search); |
422 webkit_web_view_mark_text_matches(WEBKIT_WEB_VIEW(viewer->web_view), viewer->search, FALSE, 0); |
| 423 g_object_steal_data(G_OBJECT(viewer->entry), "search-find-cb"); |
423 webkit_web_view_set_highlight_text_matches(WEBKIT_WEB_VIEW(viewer->web_view), TRUE); |
| |
424 webkit_web_view_search_text(WEBKIT_WEB_VIEW(viewer->web_view), viewer->search, FALSE, TRUE, TRUE); |
| 424 return FALSE; |
425 return FALSE; |
| 425 } |
426 } |
| 426 |
427 |
| 427 static void log_select_cb(GtkTreeSelection *sel, PidginLogViewer *viewer) { |
428 static void log_select_cb(GtkTreeSelection *sel, PidginLogViewer *viewer) { |
| 428 GtkTreeIter iter; |
429 GtkTreeIter iter; |
| 459 } |
460 } |
| 460 |
461 |
| 461 read = purple_log_read(log, &flags); |
462 read = purple_log_read(log, &flags); |
| 462 viewer->flags = flags; |
463 viewer->flags = flags; |
| 463 |
464 |
| 464 gtk_imhtml_clear(GTK_IMHTML(viewer->imhtml)); |
465 webkit_web_view_open(WEBKIT_WEB_VIEW(viewer->web_view), "about:blank"); |
| 465 gtk_imhtml_set_protocol_name(GTK_IMHTML(viewer->imhtml), |
|
| 466 purple_account_get_protocol_name(log->account)); |
|
| 467 |
466 |
| 468 purple_signal_emit(pidgin_log_get_handle(), "log-displaying", viewer, log); |
467 purple_signal_emit(pidgin_log_get_handle(), "log-displaying", viewer, log); |
| 469 |
468 |
| 470 gtk_imhtml_append_text(GTK_IMHTML(viewer->imhtml), read, |
469 webkit_web_view_load_html_string(WEBKIT_WEB_VIEW(viewer->web_view), read, ""); |
| 471 GTK_IMHTML_NO_COMMENTS | GTK_IMHTML_NO_TITLE | GTK_IMHTML_NO_SCROLL | |
|
| 472 ((flags & PURPLE_LOG_READ_NO_NEWLINE) ? GTK_IMHTML_NO_NEWLINE : 0)); |
|
| 473 g_free(read); |
470 g_free(read); |
| 474 |
471 |
| 475 if (viewer->search != NULL) { |
472 if (viewer->search != NULL) { |
| 476 guint source; |
473 webkit_web_view_unmark_text_matches(WEBKIT_WEB_VIEW(viewer->web_view)); |
| 477 gtk_imhtml_search_clear(GTK_IMHTML(viewer->imhtml)); |
474 g_idle_add(search_find_cb, viewer); |
| 478 source = g_idle_add(search_find_cb, viewer); |
|
| 479 g_object_set_data_full(G_OBJECT(viewer->entry), "search-find-cb", |
|
| 480 GINT_TO_POINTER(source), (GDestroyNotify)g_source_remove); |
|
| 481 } |
475 } |
| 482 |
476 |
| 483 pidgin_clear_cursor(viewer->window); |
477 pidgin_clear_cursor(viewer->window); |
| 484 } |
478 } |
| 485 |
479 |
| 618 g_object_unref(G_OBJECT(lv->treestore)); |
612 g_object_unref(G_OBJECT(lv->treestore)); |
| 619 rend = gtk_cell_renderer_text_new(); |
613 rend = gtk_cell_renderer_text_new(); |
| 620 col = gtk_tree_view_column_new_with_attributes ("time", rend, "markup", 0, NULL); |
614 col = gtk_tree_view_column_new_with_attributes ("time", rend, "markup", 0, NULL); |
| 621 gtk_tree_view_append_column (GTK_TREE_VIEW(lv->treeview), col); |
615 gtk_tree_view_append_column (GTK_TREE_VIEW(lv->treeview), col); |
| 622 gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (lv->treeview), FALSE); |
616 gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (lv->treeview), FALSE); |
| 623 gtk_paned_add1(GTK_PANED(pane), |
617 gtk_paned_add1(GTK_PANED(pane), |
| 624 pidgin_make_scrollable(lv->treeview, GTK_POLICY_NEVER, GTK_POLICY_ALWAYS, GTK_SHADOW_IN, -1, -1)); |
618 pidgin_make_scrollable(lv->treeview, GTK_POLICY_NEVER, GTK_POLICY_ALWAYS, GTK_SHADOW_IN, -1, -1)); |
| 625 |
619 |
| 626 populate_log_tree(lv); |
620 populate_log_tree(lv); |
| 627 |
621 |
| 628 sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (lv->treeview)); |
622 sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (lv->treeview)); |
| 653 /* A fancy little box ************/ |
647 /* A fancy little box ************/ |
| 654 vbox = gtk_vbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); |
648 vbox = gtk_vbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); |
| 655 gtk_paned_add2(GTK_PANED(pane), vbox); |
649 gtk_paned_add2(GTK_PANED(pane), vbox); |
| 656 |
650 |
| 657 /* Viewer ************/ |
651 /* Viewer ************/ |
| 658 frame = pidgin_create_imhtml(FALSE, &lv->imhtml, NULL, NULL); |
652 frame = pidgin_create_webview(FALSE, &lv->web_view, NULL, NULL); |
| 659 gtk_widget_set_name(lv->imhtml, "pidgin_log_imhtml"); |
653 gtk_widget_set_name(lv->web_view, "pidgin_log_web_view"); |
| 660 gtk_widget_set_size_request(lv->imhtml, 320, 200); |
654 gtk_widget_set_size_request(lv->web_view, 320, 200); |
| 661 gtk_box_pack_start(GTK_BOX(vbox), frame, TRUE, TRUE, 0); |
655 gtk_box_pack_start(GTK_BOX(vbox), frame, TRUE, TRUE, 0); |
| 662 gtk_widget_show(frame); |
656 gtk_widget_show(frame); |
| 663 |
657 |
| 664 /* Search box **********/ |
658 /* Search box **********/ |
| 665 hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); |
659 hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); |