| 85 |
85 |
| 86 static void search_cb(GtkWidget *button, GaimGtkLogViewer *lv) |
86 static void search_cb(GtkWidget *button, GaimGtkLogViewer *lv) |
| 87 { |
87 { |
| 88 const char *search_term = gtk_entry_get_text(GTK_ENTRY(lv->entry)); |
88 const char *search_term = gtk_entry_get_text(GTK_ENTRY(lv->entry)); |
| 89 GList *logs; |
89 GList *logs; |
| 90 GdkCursor *cursor = gdk_cursor_new(GDK_WATCH); |
90 GdkCursor *cursor; |
| 91 |
91 |
| 92 if (lv->search != NULL) |
92 if (lv->search != NULL) |
| 93 g_free(lv->search); |
93 g_free(lv->search); |
| 94 |
94 |
| 95 gtk_tree_store_clear(lv->treestore); |
95 gtk_tree_store_clear(lv->treestore); |
| 96 if (strlen(search_term) == 0) {/* reset the tree */ |
96 if (!(*search_term)) { |
| |
97 /* reset the tree */ |
| 97 populate_log_tree(lv); |
98 populate_log_tree(lv); |
| 98 lv->search = NULL; |
99 lv->search = NULL; |
| 99 gtk_imhtml_search_clear(GTK_IMHTML(lv->imhtml)); |
100 gtk_imhtml_search_clear(GTK_IMHTML(lv->imhtml)); |
| 100 return; |
101 return; |
| 101 } |
102 } |
| 102 |
103 |
| 103 lv->search = g_strdup(search_term); |
104 lv->search = g_strdup(search_term); |
| 104 |
105 |
| |
106 cursor = gdk_cursor_new(GDK_WATCH); |
| 105 gdk_window_set_cursor(lv->window->window, cursor); |
107 gdk_window_set_cursor(lv->window->window, cursor); |
| |
108 gdk_cursor_unref(cursor); |
| 106 while (gtk_events_pending()) |
109 while (gtk_events_pending()) |
| 107 gtk_main_iteration(); |
110 gtk_main_iteration(); |
| 108 gdk_cursor_unref(cursor); |
|
| 109 |
111 |
| 110 for (logs = lv->logs; logs != NULL; logs = logs->next) { |
112 for (logs = lv->logs; logs != NULL; logs = logs->next) { |
| 111 char *read = gaim_log_read((GaimLog*)logs->data, NULL); |
113 char *read = gaim_log_read((GaimLog*)logs->data, NULL); |
| 112 if (gaim_strcasestr(read, search_term)) { |
114 if (read && *read && gaim_strcasestr(read, search_term)) { |
| 113 GtkTreeIter iter; |
115 GtkTreeIter iter; |
| 114 GaimLog *log = logs->data; |
116 GaimLog *log = logs->data; |
| 115 char title[64]; |
117 char title[64]; |
| 116 char *title_utf8; /* temporary variable for utf8 conversion */ |
118 char *title_utf8; /* temporary variable for utf8 conversion */ |
| |
119 |
| 117 gaim_strftime(title, sizeof(title), "%c", localtime(&log->time)); |
120 gaim_strftime(title, sizeof(title), "%c", localtime(&log->time)); |
| 118 title_utf8 = gaim_utf8_try_convert(title); |
121 title_utf8 = gaim_utf8_try_convert(title); |
| 119 strncpy(title, title_utf8, sizeof(title)); |
122 strncpy(title, title_utf8, sizeof(title)); |
| 120 g_free(title_utf8); |
123 g_free(title_utf8); |
| |
124 |
| 121 gtk_tree_store_append (lv->treestore, &iter, NULL); |
125 gtk_tree_store_append (lv->treestore, &iter, NULL); |
| 122 gtk_tree_store_set(lv->treestore, &iter, |
126 gtk_tree_store_set(lv->treestore, &iter, |
| 123 0, title, |
127 0, title, |
| 124 1, log, -1); |
128 1, log, -1); |
| 125 } |
129 } |
| 126 g_free(read); |
130 g_free(read); |
| 127 } |
131 } |
| 128 |
132 |
| 129 |
133 gdk_window_set_cursor(lv->window->window, NULL); |
| 130 cursor = gdk_cursor_new(GDK_LEFT_PTR); |
|
| 131 gdk_window_set_cursor(lv->window->window, cursor); |
|
| 132 gdk_cursor_unref(cursor); |
|
| 133 } |
134 } |
| 134 |
135 |
| 135 static gboolean destroy_cb(GtkWidget *w, gint resp, struct log_viewer_hash_t *ht) { |
136 static gboolean destroy_cb(GtkWidget *w, gint resp, struct log_viewer_hash_t *ht) { |
| 136 GaimGtkLogViewer *lv = syslog_viewer; |
137 GaimGtkLogViewer *lv = syslog_viewer; |
| 137 |
138 |
| 218 gtk_imhtml_set_protocol_name(GTK_IMHTML(viewer->imhtml), |
230 gtk_imhtml_set_protocol_name(GTK_IMHTML(viewer->imhtml), |
| 219 gaim_account_get_protocol_name(log->account)); |
231 gaim_account_get_protocol_name(log->account)); |
| 220 gtk_imhtml_append_text(GTK_IMHTML(viewer->imhtml), read, |
232 gtk_imhtml_append_text(GTK_IMHTML(viewer->imhtml), read, |
| 221 GTK_IMHTML_NO_COMMENTS | GTK_IMHTML_NO_TITLE | GTK_IMHTML_NO_SCROLL | |
233 GTK_IMHTML_NO_COMMENTS | GTK_IMHTML_NO_TITLE | GTK_IMHTML_NO_SCROLL | |
| 222 ((flags & GAIM_LOG_READ_NO_NEWLINE) ? GTK_IMHTML_NO_NEWLINE : 0)); |
234 ((flags & GAIM_LOG_READ_NO_NEWLINE) ? GTK_IMHTML_NO_NEWLINE : 0)); |
| |
235 g_free(read); |
| 223 |
236 |
| 224 if (viewer->search != NULL) { |
237 if (viewer->search != NULL) { |
| 225 gtk_imhtml_search_clear(GTK_IMHTML(viewer->imhtml)); |
238 gtk_imhtml_search_clear(GTK_IMHTML(viewer->imhtml)); |
| 226 gtk_imhtml_search_find(GTK_IMHTML(viewer->imhtml), viewer->search); |
239 gtk_imhtml_search_find(GTK_IMHTML(viewer->imhtml), viewer->search); |
| 227 } |
240 } |
| 228 |
241 |
| 229 g_free(read); |
242 /* When we set the initial log, this gets called and the window is still NULL. */ |
| |
243 if (viewer->window->window != NULL) |
| |
244 gdk_window_set_cursor(viewer->window->window, NULL); |
| 230 } |
245 } |
| 231 |
246 |
| 232 /* I want to make this smarter, but haven't come up with a cool algorithm to do so, yet. |
247 /* I want to make this smarter, but haven't come up with a cool algorithm to do so, yet. |
| 233 * I want the tree to be divided into groups like "Today," "Yesterday," "Last week," |
248 * I want the tree to be divided into groups like "Today," "Yesterday," "Last week," |
| 234 * "August," "2002," etc. based on how many conversation took place in each subdivision. |
249 * "August," "2002," etc. based on how many conversation took place in each subdivision. |