Mercurial > pidgin.yaz
comparison gtk/gtklog.c @ 14338:2ec879353592
[gaim-migrate @ 17035]
Fixes SF Bug # 1373116 (and related Debian Bug #341607)
Fix the Find functionality in the log viewer. It now properly scrolls to the first occurrence of the search term. Also, clicking the Find button will now jump to the next occurrence of the search term, including wrapping around to the top.
Possible Badness:
This changes the behavior of all IMHTML searches. Previously, if you kept calling gtk_imhtml_search_find(), it'd clear the highlighting when you went past the last occurrence of the search term. This seems wrong. I believe it should either stop or wrap around to the top. Wrapping around seemed most useful to me, so that's what I implemented.
This was inspired by SF Patch #1545488 by Mark Schneider
committer: Tailor Script <tailor@pidgin.im>
author | Richard Laager <rlaager@wiktel.com> |
---|---|
date | Sat, 26 Aug 2006 06:25:49 +0000 |
parents | 009db0b357b5 |
children | ba1fd54bb157 |
comparison
equal
deleted
inserted
replaced
14337:1a500db56415 | 14338:2ec879353592 |
---|---|
109 static void search_cb(GtkWidget *button, GaimGtkLogViewer *lv) | 109 static void search_cb(GtkWidget *button, GaimGtkLogViewer *lv) |
110 { | 110 { |
111 const char *search_term = gtk_entry_get_text(GTK_ENTRY(lv->entry)); | 111 const char *search_term = gtk_entry_get_text(GTK_ENTRY(lv->entry)); |
112 GList *logs; | 112 GList *logs; |
113 | 113 |
114 g_free(lv->search); | |
115 | |
116 gtk_tree_store_clear(lv->treestore); | |
117 if (!(*search_term)) { | 114 if (!(*search_term)) { |
118 /* reset the tree */ | 115 /* reset the tree */ |
116 gtk_tree_store_clear(lv->treestore); | |
119 populate_log_tree(lv); | 117 populate_log_tree(lv); |
118 g_free(lv->search); | |
120 lv->search = NULL; | 119 lv->search = NULL; |
121 gtk_imhtml_search_clear(GTK_IMHTML(lv->imhtml)); | 120 gtk_imhtml_search_clear(GTK_IMHTML(lv->imhtml)); |
122 select_first_log(lv); | 121 select_first_log(lv); |
123 return; | 122 return; |
124 } | 123 } |
125 | 124 |
125 if (lv->search != NULL && !strcmp(lv->search, search_term)) | |
126 { | |
127 /* Searching for the same term acts as "Find Next" */ | |
128 gtk_imhtml_search_find(GTK_IMHTML(lv->imhtml), lv->search); | |
129 return; | |
130 } | |
131 | |
132 gaim_gtk_set_cursor(lv->window, GDK_WATCH); | |
133 | |
134 g_free(lv->search); | |
126 lv->search = g_strdup(search_term); | 135 lv->search = g_strdup(search_term); |
136 | |
137 gtk_tree_store_clear(lv->treestore); | |
127 gtk_imhtml_clear(GTK_IMHTML(lv->imhtml)); | 138 gtk_imhtml_clear(GTK_IMHTML(lv->imhtml)); |
128 | |
129 gaim_gtk_set_cursor(lv->window, GDK_WATCH); | |
130 | 139 |
131 for (logs = lv->logs; logs != NULL; logs = logs->next) { | 140 for (logs = lv->logs; logs != NULL; logs = logs->next) { |
132 char *read = gaim_log_read((GaimLog*)logs->data, NULL); | 141 char *read = gaim_log_read((GaimLog*)logs->data, NULL); |
133 if (read && *read && gaim_strcasestr(read, search_term)) { | 142 if (read && *read && gaim_strcasestr(read, search_term)) { |
134 GtkTreeIter iter; | 143 GtkTreeIter iter; |
172 static void log_row_activated_cb(GtkTreeView *tv, GtkTreePath *path, GtkTreeViewColumn *col, GaimGtkLogViewer *viewer) { | 181 static void log_row_activated_cb(GtkTreeView *tv, GtkTreePath *path, GtkTreeViewColumn *col, GaimGtkLogViewer *viewer) { |
173 if (gtk_tree_view_row_expanded(tv, path)) | 182 if (gtk_tree_view_row_expanded(tv, path)) |
174 gtk_tree_view_collapse_row(tv, path); | 183 gtk_tree_view_collapse_row(tv, path); |
175 else | 184 else |
176 gtk_tree_view_expand_row(tv, path, FALSE); | 185 gtk_tree_view_expand_row(tv, path, FALSE); |
186 } | |
187 | |
188 static gboolean search_find_cb(gpointer data) | |
189 { | |
190 GaimGtkLogViewer *viewer = data; | |
191 gtk_imhtml_search_find(GTK_IMHTML(viewer->imhtml), viewer->search); | |
192 return FALSE; | |
177 } | 193 } |
178 | 194 |
179 static void log_select_cb(GtkTreeSelection *sel, GaimGtkLogViewer *viewer) { | 195 static void log_select_cb(GtkTreeSelection *sel, GaimGtkLogViewer *viewer) { |
180 GtkTreeIter iter; | 196 GtkTreeIter iter; |
181 GValue val; | 197 GValue val; |
228 ((flags & GAIM_LOG_READ_NO_NEWLINE) ? GTK_IMHTML_NO_NEWLINE : 0)); | 244 ((flags & GAIM_LOG_READ_NO_NEWLINE) ? GTK_IMHTML_NO_NEWLINE : 0)); |
229 g_free(read); | 245 g_free(read); |
230 | 246 |
231 if (viewer->search != NULL) { | 247 if (viewer->search != NULL) { |
232 gtk_imhtml_search_clear(GTK_IMHTML(viewer->imhtml)); | 248 gtk_imhtml_search_clear(GTK_IMHTML(viewer->imhtml)); |
233 gtk_imhtml_search_find(GTK_IMHTML(viewer->imhtml), viewer->search); | 249 g_idle_add(search_find_cb, viewer); |
234 } | 250 } |
235 | 251 |
236 gaim_gtk_clear_cursor(viewer->window); | 252 gaim_gtk_clear_cursor(viewer->window); |
237 } | 253 } |
238 | 254 |
289 GtkTreeViewColumn *col; | 305 GtkTreeViewColumn *col; |
290 GtkTreeSelection *sel; | 306 GtkTreeSelection *sel; |
291 GtkWidget *vbox; | 307 GtkWidget *vbox; |
292 GtkWidget *frame; | 308 GtkWidget *frame; |
293 GtkWidget *hbox; | 309 GtkWidget *hbox; |
294 GtkWidget *button; | 310 GtkWidget *find_button; |
295 GtkWidget *size_label; | 311 GtkWidget *size_label; |
296 | 312 |
297 if (logs == NULL) | 313 if (logs == NULL) |
298 { | 314 { |
299 /* No logs were found. */ | 315 /* No logs were found. */ |
415 /* Search box **********/ | 431 /* Search box **********/ |
416 hbox = gtk_hbox_new(FALSE, GAIM_HIG_BOX_SPACE); | 432 hbox = gtk_hbox_new(FALSE, GAIM_HIG_BOX_SPACE); |
417 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); | 433 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); |
418 lv->entry = gtk_entry_new(); | 434 lv->entry = gtk_entry_new(); |
419 gtk_box_pack_start(GTK_BOX(hbox), lv->entry, TRUE, TRUE, 0); | 435 gtk_box_pack_start(GTK_BOX(hbox), lv->entry, TRUE, TRUE, 0); |
420 button = gtk_button_new_from_stock(GTK_STOCK_FIND); | 436 find_button = gtk_button_new_from_stock(GTK_STOCK_FIND); |
421 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); | 437 gtk_box_pack_start(GTK_BOX(hbox), find_button, FALSE, FALSE, 0); |
422 g_signal_connect(GTK_ENTRY(lv->entry), "activate", G_CALLBACK(search_cb), lv); | 438 g_signal_connect(GTK_ENTRY(lv->entry), "activate", G_CALLBACK(search_cb), lv); |
423 g_signal_connect(GTK_BUTTON(button), "clicked", G_CALLBACK(search_cb), lv); | 439 g_signal_connect(GTK_BUTTON(find_button), "clicked", G_CALLBACK(search_cb), lv); |
424 | 440 |
425 select_first_log(lv); | 441 select_first_log(lv); |
426 | 442 |
427 gtk_widget_show_all(lv->window); | 443 gtk_widget_show_all(lv->window); |
428 | 444 |