Mercurial > pidgin.yaz
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 } |