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