comparison src/gtklog.c @ 7535:f771759739c1

[gaim-migrate @ 8148] Log viewer search. committer: Tailor Script <tailor@pidgin.im>
author Sean Egan <seanegan@gmail.com>
date Mon, 17 Nov 2003 03:40:17 +0000
parents 66d6f5c4a14a
children 083427fd8ba8
comparison
equal deleted inserted replaced
7534:5f1531ec872a 7535:f771759739c1
30 #include "gtklog.h" 30 #include "gtklog.h"
31 #include "gtkutils.h" 31 #include "gtkutils.h"
32 #include "log.h" 32 #include "log.h"
33 33
34 static GHashTable *log_viewers = NULL; 34 static GHashTable *log_viewers = NULL;
35 static void populate_log_tree(GaimGtkLogViewer *lv);
35 36
36 struct log_viewer_hash_t { 37 struct log_viewer_hash_t {
37 char *screenname; 38 char *screenname;
38 GaimAccount *account; 39 GaimAccount *account;
39 }; 40 };
59 !strcmp(normal, gaim_normalize(b->account, b->screenname)); 60 !strcmp(normal, gaim_normalize(b->account, b->screenname));
60 g_free(normal); 61 g_free(normal);
61 return ret; 62 return ret;
62 } 63 }
63 64
65 static void search_cb(GtkWidget *button, GaimGtkLogViewer *lv)
66 {
67 const char *search_term = gtk_entry_get_text(GTK_ENTRY(lv->entry));
68 GList *logs;
69 GdkCursor *cursor = gdk_cursor_new(GDK_WATCH);
70
71 if (lv->search)
72 g_free(lv->search);
73
74 gtk_tree_store_clear(lv->treestore);
75 if (strlen(search_term) == 0) {/* reset the tree */
76 populate_log_tree(lv);
77 lv->search = NULL;
78 gtk_imhtml_search_clear(lv->imhtml);
79 return;
80 }
81
82 lv->search = g_strdup(search_term);
83
84 gdk_window_set_cursor(lv->window->window, cursor);
85 while (gtk_events_pending())
86 gtk_main_iteration();
87 gdk_cursor_unref(cursor);
88
89 for (logs = lv->logs; logs != NULL; logs = logs->next) {
90 char *read = gaim_log_read((GaimLog*)logs->data, NULL);
91 if (gaim_strcasestr(read, search_term)) {
92 GtkTreeIter iter;
93 GaimLog *log = logs->data;
94 char title[64];
95 strftime(title, sizeof(title), "%c", localtime(&log->time));
96 gtk_tree_store_append (lv->treestore, &iter, NULL);
97 gtk_tree_store_set(lv->treestore, &iter,
98 0, title,
99 1, log, -1);
100 }
101 }
102
103
104 cursor = gdk_cursor_new(GDK_LEFT_PTR);
105 gdk_window_set_cursor(lv->window->window, cursor);
106 gdk_cursor_unref(cursor);
107 }
108
64 static gboolean destroy_cb(GtkWidget *w, gint resp, struct log_viewer_hash_t *ht) { 109 static gboolean destroy_cb(GtkWidget *w, gint resp, struct log_viewer_hash_t *ht) {
65 GaimGtkLogViewer *lv = g_hash_table_lookup(log_viewers, ht); 110 GaimGtkLogViewer *lv = g_hash_table_lookup(log_viewers, ht);
66 111
67 g_hash_table_remove(log_viewers, ht); 112 g_hash_table_remove(log_viewers, ht);
68 g_free(ht->screenname); 113 g_free(ht->screenname);
69 g_free(ht); 114 g_free(ht);
70 for (;lv->logs;lv->logs = lv->logs->next) { 115 while (lv->logs) {
71 GaimLog *log = lv->logs->data; 116 GaimLog *log = lv->logs->data;
117 GList *logs2;
72 g_free(log->name); 118 g_free(log->name);
73 g_free(log); 119 g_free(log);
74 } 120 logs2 = lv->logs->next;
121 g_list_free_1(lv->logs);
122 lv->logs = logs2;
123 }
124 if (lv->search)
125 g_free(lv->search);
75 g_free(lv); 126 g_free(lv);
76 gtk_widget_destroy(w); 127 gtk_widget_destroy(w);
77 128
78 return TRUE; 129 return TRUE;
79 } 130 }
105 gtk_window_set_title(GTK_WINDOW(viewer->window), title); 156 gtk_window_set_title(GTK_WINDOW(viewer->window), title);
106 gtk_imhtml_clear(GTK_IMHTML(viewer->imhtml)); 157 gtk_imhtml_clear(GTK_IMHTML(viewer->imhtml));
107 gtk_imhtml_append_text(GTK_IMHTML(viewer->imhtml), read, 158 gtk_imhtml_append_text(GTK_IMHTML(viewer->imhtml), read,
108 GTK_IMHTML_NO_COMMENTS | GTK_IMHTML_NO_TITLE | GTK_IMHTML_NO_SCROLL | 159 GTK_IMHTML_NO_COMMENTS | GTK_IMHTML_NO_TITLE | GTK_IMHTML_NO_SCROLL |
109 ((flags & GAIM_LOG_READ_NO_NEWLINE) ? GTK_IMHTML_NO_NEWLINE : 0)); 160 ((flags & GAIM_LOG_READ_NO_NEWLINE) ? GTK_IMHTML_NO_NEWLINE : 0));
161
162 if (viewer->search)
163 gtk_imhtml_search_find(viewer->imhtml, viewer->search);
164
110 g_free(read); 165 g_free(read);
111 g_free(title); 166 g_free(title);
112 } 167 }
113 168
114 /* I want to make this smarter, but haven't come up with a cool algorithm to do so, yet. 169 /* I want to make this smarter, but haven't come up with a cool algorithm to do so, yet.
233 hbox = gtk_hbox_new(FALSE, 6); 288 hbox = gtk_hbox_new(FALSE, 6);
234 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); 289 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
235 lv->entry = gtk_entry_new(); 290 lv->entry = gtk_entry_new();
236 gtk_box_pack_start(GTK_BOX(hbox), lv->entry, TRUE, TRUE, 0); 291 gtk_box_pack_start(GTK_BOX(hbox), lv->entry, TRUE, TRUE, 0);
237 button = gtk_button_new_from_stock(GTK_STOCK_FIND); 292 button = gtk_button_new_from_stock(GTK_STOCK_FIND);
293 g_signal_connect (G_OBJECT (button), "pressed",
294 G_CALLBACK (search_cb),
295 lv);
238 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); 296 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
239 297
240 gtk_widget_show_all(lv->window); 298 gtk_widget_show_all(lv->window);
241 } 299 }