Mercurial > pidgin.yaz
annotate src/gtklog.c @ 13035:7da470b0c424
[gaim-migrate @ 15393]
Everyone says plugins shouldn't include internal.h. So, why do we install it? In keeping with my theory that diffs are the easiest way to explain what I'm thinking, I'm committing this. If it's bogus, feel free to revert or make me do so.
committer: Tailor Script <tailor@pidgin.im>
author | Richard Laager <rlaager@wiktel.com> |
---|---|
date | Wed, 25 Jan 2006 06:39:02 +0000 |
parents | cb36bc2db7c5 |
children | 0aa231ebbfd5 |
rev | line source |
---|---|
7432 | 1 /** |
2 * @file gtklog.c GTK+ Log viewer | |
3 * @ingroup gtkui | |
4 * | |
5 * gaim | |
6 * | |
8046 | 7 * Gaim is the legal property of its developers, whose names are too numerous |
8 * to list here. Please refer to the COPYRIGHT file distributed with this | |
9 * source distribution. | |
7537
083427fd8ba8
[gaim-migrate @ 8150]
Christian Hammond <chipx86@chipx86.com>
parents:
7535
diff
changeset
|
10 * |
7432 | 11 * This program is free software; you can redistribute it and/or modify |
12 * it under the terms of the GNU General Public License as published by | |
13 * the Free Software Foundation; either version 2 of the License, or | |
14 * (at your option) any later version. | |
15 * | |
16 * This program is distributed in the hope that it will be useful, | |
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
19 * GNU General Public License for more details. | |
20 * | |
21 * You should have received a copy of the GNU General Public License | |
22 * along with this program; if not, write to the Free Software | |
23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
24 */ | |
9791 | 25 #include "internal.h" |
26 #include "gtkgaim.h" | |
7432 | 27 |
28 #include "account.h" | |
29 #include "gtkblist.h" | |
30 #include "gtkimhtml.h" | |
31 #include "gtklog.h" | |
32 #include "gtkutils.h" | |
33 #include "log.h" | |
11769 | 34 #include "notify.h" |
10636 | 35 #include "util.h" |
7432 | 36 |
37 static GHashTable *log_viewers = NULL; | |
7535 | 38 static void populate_log_tree(GaimGtkLogViewer *lv); |
8573 | 39 static GaimGtkLogViewer *syslog_viewer = NULL; |
7432 | 40 |
41 struct log_viewer_hash_t { | |
10663 | 42 GaimLogType type; |
7432 | 43 char *screenname; |
44 GaimAccount *account; | |
10663 | 45 GaimContact *contact; |
7432 | 46 }; |
47 | |
7440 | 48 static guint log_viewer_hash(gconstpointer data) |
7432 | 49 { |
7440 | 50 const struct log_viewer_hash_t *viewer = data; |
51 | |
10663 | 52 if (viewer->contact != NULL) |
53 return g_direct_hash(viewer->contact); | |
54 | |
55 return g_str_hash(viewer->screenname) + | |
56 g_str_hash(gaim_account_get_username(viewer->account)); | |
7432 | 57 } |
58 | |
10663 | 59 static gboolean log_viewer_equal(gconstpointer y, gconstpointer z) |
7432 | 60 { |
7440 | 61 const struct log_viewer_hash_t *a, *b; |
7432 | 62 int ret; |
7440 | 63 char *normal; |
64 | |
65 a = y; | |
66 b = z; | |
67 | |
10663 | 68 if (a->contact != NULL) { |
69 if (b->contact != NULL) | |
70 return (a->contact == b->contact); | |
71 else | |
72 return FALSE; | |
73 } else { | |
74 if (b->contact != NULL) | |
75 return FALSE; | |
76 } | |
77 | |
7440 | 78 normal = g_strdup(gaim_normalize(a->account, a->screenname)); |
79 ret = (a->account == b->account) && | |
80 !strcmp(normal, gaim_normalize(b->account, b->screenname)); | |
7432 | 81 g_free(normal); |
10663 | 82 |
7432 | 83 return ret; |
84 } | |
85 | |
7535 | 86 static void search_cb(GtkWidget *button, GaimGtkLogViewer *lv) |
87 { | |
88 const char *search_term = gtk_entry_get_text(GTK_ENTRY(lv->entry)); | |
89 GList *logs; | |
12232
375f1f3817a8
[gaim-migrate @ 14534]
Richard Laager <rlaager@wiktel.com>
parents:
11869
diff
changeset
|
90 GdkCursor *cursor; |
10175 | 91 |
10663 | 92 if (lv->search != NULL) |
7535 | 93 g_free(lv->search); |
10175 | 94 |
11585 | 95 gtk_tree_store_clear(lv->treestore); |
12232
375f1f3817a8
[gaim-migrate @ 14534]
Richard Laager <rlaager@wiktel.com>
parents:
11869
diff
changeset
|
96 if (!(*search_term)) { |
375f1f3817a8
[gaim-migrate @ 14534]
Richard Laager <rlaager@wiktel.com>
parents:
11869
diff
changeset
|
97 /* reset the tree */ |
7535 | 98 populate_log_tree(lv); |
99 lv->search = NULL; | |
7537
083427fd8ba8
[gaim-migrate @ 8150]
Christian Hammond <chipx86@chipx86.com>
parents:
7535
diff
changeset
|
100 gtk_imhtml_search_clear(GTK_IMHTML(lv->imhtml)); |
7535 | 101 return; |
102 } | |
10175 | 103 |
7535 | 104 lv->search = g_strdup(search_term); |
10175 | 105 |
12232
375f1f3817a8
[gaim-migrate @ 14534]
Richard Laager <rlaager@wiktel.com>
parents:
11869
diff
changeset
|
106 cursor = gdk_cursor_new(GDK_WATCH); |
7535 | 107 gdk_window_set_cursor(lv->window->window, cursor); |
12232
375f1f3817a8
[gaim-migrate @ 14534]
Richard Laager <rlaager@wiktel.com>
parents:
11869
diff
changeset
|
108 gdk_cursor_unref(cursor); |
7535 | 109 while (gtk_events_pending()) |
110 gtk_main_iteration(); | |
10175 | 111 |
7535 | 112 for (logs = lv->logs; logs != NULL; logs = logs->next) { |
113 char *read = gaim_log_read((GaimLog*)logs->data, NULL); | |
12232
375f1f3817a8
[gaim-migrate @ 14534]
Richard Laager <rlaager@wiktel.com>
parents:
11869
diff
changeset
|
114 if (read && *read && gaim_strcasestr(read, search_term)) { |
7535 | 115 GtkTreeIter iter; |
116 GaimLog *log = logs->data; | |
117 char title[64]; | |
7676 | 118 char *title_utf8; /* temporary variable for utf8 conversion */ |
12232
375f1f3817a8
[gaim-migrate @ 14534]
Richard Laager <rlaager@wiktel.com>
parents:
11869
diff
changeset
|
119 |
10636 | 120 gaim_strftime(title, sizeof(title), "%c", localtime(&log->time)); |
7676 | 121 title_utf8 = gaim_utf8_try_convert(title); |
122 strncpy(title, title_utf8, sizeof(title)); | |
123 g_free(title_utf8); | |
12232
375f1f3817a8
[gaim-migrate @ 14534]
Richard Laager <rlaager@wiktel.com>
parents:
11869
diff
changeset
|
124 |
7535 | 125 gtk_tree_store_append (lv->treestore, &iter, NULL); |
126 gtk_tree_store_set(lv->treestore, &iter, | |
127 0, title, | |
10175 | 128 1, log, -1); |
7535 | 129 } |
10574 | 130 g_free(read); |
7535 | 131 } |
10175 | 132 |
12232
375f1f3817a8
[gaim-migrate @ 14534]
Richard Laager <rlaager@wiktel.com>
parents:
11869
diff
changeset
|
133 gdk_window_set_cursor(lv->window->window, NULL); |
7535 | 134 } |
135 | |
7454 | 136 static gboolean destroy_cb(GtkWidget *w, gint resp, struct log_viewer_hash_t *ht) { |
8573 | 137 GaimGtkLogViewer *lv = syslog_viewer; |
7454 | 138 |
10663 | 139 if (ht != NULL) { |
8573 | 140 lv = g_hash_table_lookup(log_viewers, ht); |
141 g_hash_table_remove(log_viewers, ht); | |
10663 | 142 |
143 if (ht->screenname != NULL) | |
144 g_free(ht->screenname); | |
145 | |
8573 | 146 g_free(ht); |
147 } else | |
148 syslog_viewer = NULL; | |
149 | |
10663 | 150 while (lv->logs != NULL) { |
7535 | 151 GList *logs2; |
10663 | 152 |
153 gaim_log_free((GaimLog *)lv->logs->data); | |
154 | |
7535 | 155 logs2 = lv->logs->next; |
156 g_list_free_1(lv->logs); | |
157 lv->logs = logs2; | |
7533 | 158 } |
10663 | 159 |
160 if (lv->search != NULL) | |
7535 | 161 g_free(lv->search); |
10663 | 162 |
8573 | 163 g_free(lv); |
7454 | 164 gtk_widget_destroy(w); |
165 | |
166 return TRUE; | |
167 } | |
168 | |
10663 | 169 static void log_row_activated_cb(GtkTreeView *tv, GtkTreePath *path, GtkTreeViewColumn *col, GaimGtkLogViewer *viewer) { |
170 if (gtk_tree_view_row_expanded(tv, path)) | |
171 gtk_tree_view_collapse_row(tv, path); | |
172 else | |
173 gtk_tree_view_expand_row(tv, path, FALSE); | |
8573 | 174 } |
10663 | 175 |
7454 | 176 static void log_select_cb(GtkTreeSelection *sel, GaimGtkLogViewer *viewer) { |
12838
cb36bc2db7c5
[gaim-migrate @ 15186]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
177 GtkTreeIter iter; |
12600
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12232
diff
changeset
|
178 GValue val; |
7432 | 179 GtkTreeModel *model = GTK_TREE_MODEL(viewer->treestore); |
180 GaimLog *log = NULL; | |
12232
375f1f3817a8
[gaim-migrate @ 14534]
Richard Laager <rlaager@wiktel.com>
parents:
11869
diff
changeset
|
181 GdkCursor *cursor; |
7432 | 182 GaimLogReadFlags flags; |
183 char *read = NULL; | |
184 char time[64]; | |
185 | |
10663 | 186 if (!gtk_tree_selection_get_selected(sel, &model, &iter)) |
7432 | 187 return; |
12600
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12232
diff
changeset
|
188 |
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12232
diff
changeset
|
189 val.g_type = 0; |
7432 | 190 gtk_tree_model_get_value (model, &iter, 1, &val); |
191 log = g_value_get_pointer(&val); | |
192 g_value_unset(&val); | |
193 | |
10663 | 194 if (log == NULL) |
7432 | 195 return; |
196 | |
12232
375f1f3817a8
[gaim-migrate @ 14534]
Richard Laager <rlaager@wiktel.com>
parents:
11869
diff
changeset
|
197 /* When we set the initial log, this gets called and the window is still NULL. */ |
375f1f3817a8
[gaim-migrate @ 14534]
Richard Laager <rlaager@wiktel.com>
parents:
11869
diff
changeset
|
198 if (viewer->window->window != NULL) |
375f1f3817a8
[gaim-migrate @ 14534]
Richard Laager <rlaager@wiktel.com>
parents:
11869
diff
changeset
|
199 { |
375f1f3817a8
[gaim-migrate @ 14534]
Richard Laager <rlaager@wiktel.com>
parents:
11869
diff
changeset
|
200 cursor = gdk_cursor_new(GDK_WATCH); |
375f1f3817a8
[gaim-migrate @ 14534]
Richard Laager <rlaager@wiktel.com>
parents:
11869
diff
changeset
|
201 gdk_window_set_cursor(viewer->window->window, cursor); |
375f1f3817a8
[gaim-migrate @ 14534]
Richard Laager <rlaager@wiktel.com>
parents:
11869
diff
changeset
|
202 gdk_cursor_unref(cursor); |
375f1f3817a8
[gaim-migrate @ 14534]
Richard Laager <rlaager@wiktel.com>
parents:
11869
diff
changeset
|
203 while (gtk_events_pending()) |
375f1f3817a8
[gaim-migrate @ 14534]
Richard Laager <rlaager@wiktel.com>
parents:
11869
diff
changeset
|
204 gtk_main_iteration(); |
375f1f3817a8
[gaim-migrate @ 14534]
Richard Laager <rlaager@wiktel.com>
parents:
11869
diff
changeset
|
205 } |
375f1f3817a8
[gaim-migrate @ 14534]
Richard Laager <rlaager@wiktel.com>
parents:
11869
diff
changeset
|
206 |
10663 | 207 if (log->type != GAIM_LOG_SYSTEM) { |
208 char *title; | |
209 char *title_utf8; /* temporary variable for utf8 conversion */ | |
210 | |
211 gaim_strftime(time, sizeof(time), "%c", localtime(&log->time)); | |
212 | |
213 if (log->type == GAIM_LOG_CHAT) | |
214 title = g_strdup_printf(_("Conversation in %s on %s"), log->name, time); | |
215 else | |
216 title = g_strdup_printf(_("Conversation with %s on %s"), log->name, time); | |
217 | |
218 title_utf8 = gaim_utf8_try_convert(title); | |
219 g_free(title); | |
220 | |
221 title = g_strdup_printf("<span size='larger' weight='bold'>%s</span>", title_utf8); | |
222 g_free(title_utf8); | |
223 | |
224 gtk_label_set_markup(GTK_LABEL(viewer->label), title); | |
225 g_free(title); | |
226 } | |
227 | |
7432 | 228 read = gaim_log_read(log, &flags); |
229 viewer->flags = flags; | |
10663 | 230 |
7432 | 231 gtk_imhtml_clear(GTK_IMHTML(viewer->imhtml)); |
10645 | 232 gtk_imhtml_set_protocol_name(GTK_IMHTML(viewer->imhtml), |
233 gaim_account_get_protocol_name(log->account)); | |
12838
cb36bc2db7c5
[gaim-migrate @ 15186]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
234 |
cb36bc2db7c5
[gaim-migrate @ 15186]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
235 gaim_signal_emit(gaim_gtk_log_get_handle(), "log-displaying", viewer, log); |
cb36bc2db7c5
[gaim-migrate @ 15186]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
236 |
10574 | 237 gtk_imhtml_append_text(GTK_IMHTML(viewer->imhtml), read, |
10175 | 238 GTK_IMHTML_NO_COMMENTS | GTK_IMHTML_NO_TITLE | GTK_IMHTML_NO_SCROLL | |
7432 | 239 ((flags & GAIM_LOG_READ_NO_NEWLINE) ? GTK_IMHTML_NO_NEWLINE : 0)); |
12232
375f1f3817a8
[gaim-migrate @ 14534]
Richard Laager <rlaager@wiktel.com>
parents:
11869
diff
changeset
|
240 g_free(read); |
7535 | 241 |
10663 | 242 if (viewer->search != NULL) { |
10574 | 243 gtk_imhtml_search_clear(GTK_IMHTML(viewer->imhtml)); |
7537
083427fd8ba8
[gaim-migrate @ 8150]
Christian Hammond <chipx86@chipx86.com>
parents:
7535
diff
changeset
|
244 gtk_imhtml_search_find(GTK_IMHTML(viewer->imhtml), viewer->search); |
10574 | 245 } |
10175 | 246 |
12232
375f1f3817a8
[gaim-migrate @ 14534]
Richard Laager <rlaager@wiktel.com>
parents:
11869
diff
changeset
|
247 /* When we set the initial log, this gets called and the window is still NULL. */ |
375f1f3817a8
[gaim-migrate @ 14534]
Richard Laager <rlaager@wiktel.com>
parents:
11869
diff
changeset
|
248 if (viewer->window->window != NULL) |
375f1f3817a8
[gaim-migrate @ 14534]
Richard Laager <rlaager@wiktel.com>
parents:
11869
diff
changeset
|
249 gdk_window_set_cursor(viewer->window->window, NULL); |
7432 | 250 } |
251 | |
252 /* I want to make this smarter, but haven't come up with a cool algorithm to do so, yet. | |
253 * I want the tree to be divided into groups like "Today," "Yesterday," "Last week," | |
254 * "August," "2002," etc. based on how many conversation took place in each subdivision. | |
255 * | |
256 * For now, I'll just make it a flat list. | |
257 */ | |
258 static void populate_log_tree(GaimGtkLogViewer *lv) | |
11585 | 259 /* Logs are made from trees in real life. |
7432 | 260 This is a tree made from logs */ |
261 { | |
9435 | 262 char month[30]; |
7440 | 263 char title[64]; |
10663 | 264 char prev_top_month[30] = ""; |
9435 | 265 char *utf8_tmp; /* temporary variable for utf8 conversion */ |
266 GtkTreeIter toplevel, child; | |
7432 | 267 GList *logs = lv->logs; |
10663 | 268 |
269 while (logs != NULL) { | |
7432 | 270 GaimLog *log = logs->data; |
10175 | 271 |
10636 | 272 gaim_strftime(month, sizeof(month), "%B %Y", localtime(&log->time)); |
273 gaim_strftime(title, sizeof(title), "%c", localtime(&log->time)); | |
10175 | 274 |
9435 | 275 /* do utf8 conversions */ |
276 utf8_tmp = gaim_utf8_try_convert(month); | |
277 strncpy(month, utf8_tmp, sizeof(month)); | |
10574 | 278 g_free(utf8_tmp); |
9435 | 279 utf8_tmp = gaim_utf8_try_convert(title); |
280 strncpy(title, utf8_tmp, sizeof(title)); | |
281 g_free(utf8_tmp); | |
10175 | 282 |
9435 | 283 if (strncmp(month, prev_top_month, sizeof(month)) != 0) { |
284 /* top level */ | |
285 gtk_tree_store_append(lv->treestore, &toplevel, NULL); | |
286 gtk_tree_store_set(lv->treestore, &toplevel, 0, month, 1, NULL, -1); | |
10175 | 287 |
10680 | 288 strncpy(prev_top_month, month, sizeof(prev_top_month)); |
289 } | |
10175 | 290 |
10680 | 291 /* sub */ |
292 gtk_tree_store_append(lv->treestore, &child, &toplevel); | |
293 gtk_tree_store_set(lv->treestore, &child, 0, title, 1, log, -1); | |
10175 | 294 |
7432 | 295 logs = logs->next; |
296 } | |
297 } | |
298 | |
10663 | 299 static GaimGtkLogViewer *display_log_viewer(struct log_viewer_hash_t *ht, GList *logs, |
11585 | 300 const char *title, GdkPixbuf *pixbuf, int log_size) |
10663 | 301 { |
302 GaimGtkLogViewer *lv; | |
303 GtkWidget *title_box; | |
304 char *text; | |
11769 | 305 GtkWidget *pane; |
306 GtkWidget *sw; | |
307 GtkCellRenderer *rend; | |
308 GtkTreeViewColumn *col; | |
309 GtkTreeSelection *sel; | |
11780 | 310 #if GTK_CHECK_VERSION(2,2,0) |
11769 | 311 GtkTreePath *path_to_first_log; |
11780 | 312 #endif |
11769 | 313 GtkWidget *vbox; |
314 GtkWidget *frame; | |
315 GtkWidget *hbox; | |
316 GtkWidget *button; | |
317 GtkWidget *size_label; | |
7432 | 318 |
319 lv = g_new0(GaimGtkLogViewer, 1); | |
10663 | 320 lv->logs = logs; |
321 | |
11769 | 322 if (logs == NULL) |
323 { | |
324 /* No logs were found. */ | |
325 const char *log_preferences = NULL; | |
326 | |
327 if (ht == NULL) { | |
328 if (!gaim_prefs_get_bool("/core/logging/log_system")) | |
329 log_preferences = _("System events will only be logged if the \"Log all status changes to system log\" preference is enabled."); | |
330 } else { | |
331 if (ht->type == GAIM_LOG_IM) { | |
332 if (!gaim_prefs_get_bool("/core/logging/log_ims")) | |
333 log_preferences = _("Instant messages will only be logged if the \"Log all instant messages\" preference is enabled."); | |
334 } else if (ht->type == GAIM_LOG_CHAT) { | |
335 if (!gaim_prefs_get_bool("/core/logging/log_chats")) | |
11869 | 336 log_preferences = _("Chats will only be logged if the \"Log all chats\" preference is enabled."); |
11769 | 337 } |
338 } | |
339 | |
340 gaim_notify_info(NULL, title, _("No logs were found"), log_preferences); | |
341 return NULL; | |
342 } | |
343 | |
10663 | 344 if (ht != NULL) |
345 g_hash_table_insert(log_viewers, ht, lv); | |
7432 | 346 |
347 /* Window ***********/ | |
10663 | 348 lv->window = gtk_dialog_new_with_buttons(title, NULL, 0, |
7432 | 349 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, NULL); |
11243 | 350 gtk_container_set_border_width (GTK_CONTAINER(lv->window), GAIM_HIG_BOX_SPACE); |
7432 | 351 gtk_dialog_set_has_separator(GTK_DIALOG(lv->window), FALSE); |
352 gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(lv->window)->vbox), 0); | |
10175 | 353 g_signal_connect(G_OBJECT(lv->window), "response", |
7454 | 354 G_CALLBACK(destroy_cb), ht); |
11004
a3d3729a9130
[gaim-migrate @ 12859]
Etan Reisner <pidgin@unreliablesource.net>
parents:
10884
diff
changeset
|
355 gtk_window_set_role(GTK_WINDOW(lv->window), "log_viewer"); |
7454 | 356 |
10663 | 357 /* Icon *************/ |
358 if (pixbuf != NULL) { | |
359 GdkPixbuf *scale; | |
360 GtkWidget *icon; | |
7432 | 361 |
11243 | 362 title_box = gtk_hbox_new(FALSE, GAIM_HIG_BOX_SPACE); |
363 gtk_container_set_border_width(GTK_CONTAINER(title_box), GAIM_HIG_BOX_SPACE); | |
10663 | 364 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(lv->window)->vbox), title_box, FALSE, FALSE, 0); |
365 | |
366 scale = gdk_pixbuf_scale_simple(pixbuf, 16, 16, GDK_INTERP_BILINEAR); | |
367 icon = gtk_image_new_from_pixbuf(scale); | |
368 gtk_box_pack_start(GTK_BOX(title_box), icon, FALSE, FALSE, 0); | |
369 g_object_unref(G_OBJECT(pixbuf)); | |
370 g_object_unref(G_OBJECT(scale)); | |
371 } else | |
372 title_box = GTK_DIALOG(lv->window)->vbox; | |
7432 | 373 |
374 /* Label ************/ | |
10663 | 375 lv->label = gtk_label_new(NULL); |
376 | |
377 text = g_strdup_printf("<span size='larger' weight='bold'>%s</span>", title); | |
9624 | 378 |
10663 | 379 gtk_label_set_markup(GTK_LABEL(lv->label), text); |
380 gtk_misc_set_alignment(GTK_MISC(lv->label), 0, 0); | |
381 gtk_box_pack_start(GTK_BOX(title_box), lv->label, FALSE, FALSE, 0); | |
7432 | 382 g_free(text); |
383 | |
11769 | 384 /* Pane *************/ |
385 pane = gtk_hpaned_new(); | |
386 gtk_container_set_border_width(GTK_CONTAINER(pane), GAIM_HIG_BOX_SPACE); | |
387 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(lv->window)->vbox), pane, TRUE, TRUE, 0); | |
7432 | 388 |
11769 | 389 /* List *************/ |
390 sw = gtk_scrolled_window_new (NULL, NULL); | |
391 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), GTK_SHADOW_IN); | |
392 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS); | |
393 gtk_paned_add1(GTK_PANED(pane), sw); | |
394 lv->treestore = gtk_tree_store_new (2, G_TYPE_STRING, G_TYPE_POINTER); | |
395 lv->treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (lv->treestore)); | |
396 rend = gtk_cell_renderer_text_new(); | |
397 col = gtk_tree_view_column_new_with_attributes ("time", rend, "markup", 0, NULL); | |
398 gtk_tree_view_append_column (GTK_TREE_VIEW(lv->treeview), col); | |
399 gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (lv->treeview), FALSE); | |
400 gtk_container_add (GTK_CONTAINER (sw), lv->treeview); | |
11402 | 401 |
11769 | 402 populate_log_tree(lv); |
11402 | 403 |
11769 | 404 sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (lv->treeview)); |
405 g_signal_connect (G_OBJECT (sel), "changed", | |
406 G_CALLBACK (log_select_cb), | |
407 lv); | |
408 g_signal_connect (G_OBJECT(lv->treeview), "row-activated", | |
409 G_CALLBACK(log_row_activated_cb), | |
410 lv); | |
411 gaim_set_accessible_label(lv->treeview, lv->label); | |
11585 | 412 |
11769 | 413 /* Log size ************/ |
414 if(log_size) { | |
415 char *sz_txt = gaim_str_size_to_units(log_size); | |
416 text = g_strdup_printf("<span weight='bold'>%s</span> %s", _("Total log size:"), sz_txt); | |
417 size_label = gtk_label_new(NULL); | |
418 gtk_label_set_markup(GTK_LABEL(size_label), text); | |
419 /* gtk_paned_add1(GTK_PANED(pane), size_label); */ | |
420 gtk_misc_set_alignment(GTK_MISC(size_label), 0, 0); | |
421 gtk_box_pack_end(GTK_BOX(GTK_DIALOG(lv->window)->vbox), size_label, FALSE, FALSE, 0); | |
422 g_free(sz_txt); | |
423 g_free(text); | |
424 } | |
11402 | 425 |
11769 | 426 /* A fancy little box ************/ |
427 vbox = gtk_vbox_new(FALSE, GAIM_HIG_BOX_SPACE); | |
428 gtk_paned_add2(GTK_PANED(pane), vbox); | |
11402 | 429 |
11769 | 430 /* Viewer ************/ |
431 frame = gaim_gtk_create_imhtml(FALSE, &lv->imhtml, NULL); | |
432 gtk_widget_set_name(lv->imhtml, "gaim_gtklog_imhtml"); | |
433 gtk_widget_set_size_request(lv->imhtml, 320, 200); | |
434 gtk_box_pack_start(GTK_BOX(vbox), frame, TRUE, TRUE, 0); | |
435 gtk_widget_show(frame); | |
10181 | 436 |
11769 | 437 /* Search box **********/ |
438 hbox = gtk_hbox_new(FALSE, GAIM_HIG_BOX_SPACE); | |
439 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); | |
440 lv->entry = gtk_entry_new(); | |
441 gtk_box_pack_start(GTK_BOX(hbox), lv->entry, TRUE, TRUE, 0); | |
442 button = gtk_button_new_from_stock(GTK_STOCK_FIND); | |
443 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); | |
444 g_signal_connect(GTK_ENTRY(lv->entry), "activate", G_CALLBACK(search_cb), lv); | |
445 g_signal_connect(GTK_BUTTON(button), "activate", G_CALLBACK(search_cb), lv); | |
446 g_signal_connect(GTK_BUTTON(button), "clicked", G_CALLBACK(search_cb), lv); | |
10175 | 447 |
11780 | 448 #if GTK_CHECK_VERSION(2,2,0) |
11769 | 449 /* Show most recent log **********/ |
450 path_to_first_log = gtk_tree_path_new_from_string("0:0"); | |
451 if (path_to_first_log) | |
452 { | |
453 gtk_tree_view_expand_to_path(GTK_TREE_VIEW(lv->treeview), path_to_first_log); | |
454 gtk_tree_selection_select_path(sel, path_to_first_log); | |
455 gtk_tree_path_free(path_to_first_log); | |
10663 | 456 } |
11780 | 457 #endif |
7432 | 458 |
459 gtk_widget_show_all(lv->window); | |
10663 | 460 |
461 return lv; | |
462 } | |
463 | |
464 void gaim_gtk_log_show(GaimLogType type, const char *screenname, GaimAccount *account) { | |
465 struct log_viewer_hash_t *ht = g_new0(struct log_viewer_hash_t, 1); | |
466 GaimGtkLogViewer *lv = NULL; | |
467 const char *name = screenname; | |
468 char *title; | |
469 | |
470 g_return_if_fail(account != NULL); | |
471 g_return_if_fail(screenname != NULL); | |
472 | |
473 ht->type = type; | |
474 ht->screenname = g_strdup(screenname); | |
475 ht->account = account; | |
476 | |
477 if (log_viewers == NULL) { | |
478 log_viewers = g_hash_table_new(log_viewer_hash, log_viewer_equal); | |
479 } else if ((lv = g_hash_table_lookup(log_viewers, ht))) { | |
480 gtk_window_present(GTK_WINDOW(lv->window)); | |
481 g_free(ht); | |
482 return; | |
483 } | |
484 | |
485 if (type == GAIM_LOG_CHAT) { | |
486 GaimChat *chat; | |
487 | |
488 chat = gaim_blist_find_chat(account, screenname); | |
489 if (chat != NULL) | |
490 name = gaim_chat_get_name(chat); | |
491 | |
492 title = g_strdup_printf(_("Conversations in %s"), name); | |
493 } else { | |
494 GaimBuddy *buddy; | |
495 | |
496 buddy = gaim_find_buddy(account, screenname); | |
497 if (buddy != NULL) | |
498 name = gaim_buddy_get_contact_alias(buddy); | |
499 | |
500 title = g_strdup_printf(_("Conversations with %s"), name); | |
501 } | |
502 | |
503 display_log_viewer(ht, gaim_log_get_logs(type, screenname, account), | |
11585 | 504 title, gaim_gtk_create_prpl_icon(account), gaim_log_get_total_size(type, screenname, account)); |
10663 | 505 g_free(title); |
506 } | |
507 | |
508 void gaim_gtk_log_show_contact(GaimContact *contact) { | |
509 struct log_viewer_hash_t *ht = g_new0(struct log_viewer_hash_t, 1); | |
510 GaimBlistNode *child; | |
511 GaimGtkLogViewer *lv = NULL; | |
512 GList *logs = NULL; | |
513 char *filename; | |
514 GdkPixbuf *pixbuf; | |
515 const char *name = NULL; | |
516 char *title; | |
11585 | 517 int total_log_size = 0; |
10663 | 518 |
519 g_return_if_fail(contact != NULL); | |
520 | |
521 ht->type = GAIM_LOG_IM; | |
522 ht->contact = contact; | |
523 | |
524 if (log_viewers == NULL) { | |
525 log_viewers = g_hash_table_new(log_viewer_hash, log_viewer_equal); | |
526 } else if ((lv = g_hash_table_lookup(log_viewers, ht))) { | |
527 gtk_window_present(GTK_WINDOW(lv->window)); | |
528 g_free(ht); | |
529 return; | |
530 } | |
531 | |
532 for (child = contact->node.child ; child ; child = child->next) { | |
533 if (!GAIM_BLIST_NODE_IS_BUDDY(child)) | |
534 continue; | |
535 | |
11703
a53cef8bd22b
[gaim-migrate @ 13994]
Richard Laager <rlaager@wiktel.com>
parents:
11700
diff
changeset
|
536 logs = g_list_concat(gaim_log_get_logs(GAIM_LOG_IM, ((GaimBuddy *)child)->name, |
a53cef8bd22b
[gaim-migrate @ 13994]
Richard Laager <rlaager@wiktel.com>
parents:
11700
diff
changeset
|
537 ((GaimBuddy *)child)->account), logs); |
11585 | 538 total_log_size += gaim_log_get_total_size(GAIM_LOG_IM, ((GaimBuddy *)child)->name, ((GaimBuddy *)child)->account); |
10663 | 539 } |
540 logs = g_list_sort(logs, gaim_log_compare); | |
541 | |
542 filename = g_build_filename(DATADIR, "pixmaps", "gaim", "icons", "online.png", NULL); | |
543 pixbuf = gdk_pixbuf_new_from_file(filename, NULL); | |
544 g_free(filename); | |
545 | |
546 if (contact->alias != NULL) | |
547 name = contact->alias; | |
548 else if (contact->priority != NULL) | |
549 name = gaim_buddy_get_contact_alias(contact->priority); | |
550 | |
551 title = g_strdup_printf(_("Conversations with %s"), name); | |
11585 | 552 display_log_viewer(ht, logs, title, pixbuf, total_log_size); |
10663 | 553 g_free(title); |
7432 | 554 } |
8573 | 555 |
556 void gaim_gtk_syslog_show() | |
557 { | |
558 GList *accounts = NULL; | |
10663 | 559 GList *logs = NULL; |
8573 | 560 |
10181 | 561 if (syslog_viewer != NULL) { |
8573 | 562 gtk_window_present(GTK_WINDOW(syslog_viewer->window)); |
563 return; | |
564 } | |
565 | |
10663 | 566 for(accounts = gaim_accounts_get_all(); accounts != NULL; accounts = accounts->next) { |
8573 | 567 |
568 GaimAccount *account = (GaimAccount *)accounts->data; | |
10663 | 569 if(gaim_find_prpl(gaim_account_get_protocol_id(account)) == NULL) |
8573 | 570 continue; |
571 | |
11703
a53cef8bd22b
[gaim-migrate @ 13994]
Richard Laager <rlaager@wiktel.com>
parents:
11700
diff
changeset
|
572 logs = g_list_concat(gaim_log_get_system_logs(account), logs); |
8573 | 573 } |
10663 | 574 logs = g_list_sort(logs, gaim_log_compare); |
10175 | 575 |
11585 | 576 syslog_viewer = display_log_viewer(NULL, logs, _("System Log"), NULL, 0); |
8573 | 577 } |
12838
cb36bc2db7c5
[gaim-migrate @ 15186]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
578 |
cb36bc2db7c5
[gaim-migrate @ 15186]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
579 /**************************************************************************** |
cb36bc2db7c5
[gaim-migrate @ 15186]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
580 * GTK+ LOG SUBSYSTEM ******************************************************* |
cb36bc2db7c5
[gaim-migrate @ 15186]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
581 ****************************************************************************/ |
cb36bc2db7c5
[gaim-migrate @ 15186]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
582 |
cb36bc2db7c5
[gaim-migrate @ 15186]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
583 void * |
cb36bc2db7c5
[gaim-migrate @ 15186]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
584 gaim_gtk_log_get_handle(void) |
cb36bc2db7c5
[gaim-migrate @ 15186]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
585 { |
cb36bc2db7c5
[gaim-migrate @ 15186]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
586 static int handle; |
cb36bc2db7c5
[gaim-migrate @ 15186]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
587 |
cb36bc2db7c5
[gaim-migrate @ 15186]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
588 return &handle; |
cb36bc2db7c5
[gaim-migrate @ 15186]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
589 } |
cb36bc2db7c5
[gaim-migrate @ 15186]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
590 |
cb36bc2db7c5
[gaim-migrate @ 15186]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
591 void gaim_gtk_log_init(void) |
cb36bc2db7c5
[gaim-migrate @ 15186]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
592 { |
cb36bc2db7c5
[gaim-migrate @ 15186]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
593 void *handle = gaim_gtk_log_get_handle(); |
cb36bc2db7c5
[gaim-migrate @ 15186]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
594 |
cb36bc2db7c5
[gaim-migrate @ 15186]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
595 gaim_signal_register(handle, "log-displaying", |
cb36bc2db7c5
[gaim-migrate @ 15186]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
596 gaim_marshal_VOID__POINTER_POINTER, |
cb36bc2db7c5
[gaim-migrate @ 15186]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
597 NULL, 2, |
cb36bc2db7c5
[gaim-migrate @ 15186]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
598 gaim_value_new(GAIM_TYPE_BOXED, |
cb36bc2db7c5
[gaim-migrate @ 15186]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
599 "GaimGtkLogViewer *"), |
cb36bc2db7c5
[gaim-migrate @ 15186]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
600 gaim_value_new(GAIM_TYPE_SUBTYPE, |
cb36bc2db7c5
[gaim-migrate @ 15186]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
601 GAIM_SUBTYPE_LOG)); |
cb36bc2db7c5
[gaim-migrate @ 15186]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
602 } |
cb36bc2db7c5
[gaim-migrate @ 15186]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
603 |
cb36bc2db7c5
[gaim-migrate @ 15186]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
604 void |
cb36bc2db7c5
[gaim-migrate @ 15186]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
605 gaim_gtk_log_uninit(void) |
cb36bc2db7c5
[gaim-migrate @ 15186]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
606 { |
cb36bc2db7c5
[gaim-migrate @ 15186]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
607 gaim_signals_unregister_by_instance(gaim_gtk_log_get_handle()); |
cb36bc2db7c5
[gaim-migrate @ 15186]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
608 } |