comparison src/gtklog.c @ 10663:241d2e62bed2

[gaim-migrate @ 12202] Richard Laager did this committer: Tailor Script <tailor@pidgin.im>
author Sean Egan <seanegan@gmail.com>
date Mon, 07 Mar 2005 18:10:45 +0000
parents 6480697e907b
children 5fae2e790f5d
comparison
equal deleted inserted replaced
10662:54ac161a876e 10663:241d2e62bed2
37 static GHashTable *log_viewers = NULL; 37 static GHashTable *log_viewers = NULL;
38 static void populate_log_tree(GaimGtkLogViewer *lv); 38 static void populate_log_tree(GaimGtkLogViewer *lv);
39 static GaimGtkLogViewer *syslog_viewer = NULL; 39 static GaimGtkLogViewer *syslog_viewer = NULL;
40 40
41 struct log_viewer_hash_t { 41 struct log_viewer_hash_t {
42 GaimLogType type;
42 char *screenname; 43 char *screenname;
43 GaimAccount *account; 44 GaimAccount *account;
45 GaimContact *contact;
44 }; 46 };
45 47
46 static guint log_viewer_hash(gconstpointer data) 48 static guint log_viewer_hash(gconstpointer data)
47 { 49 {
48 const struct log_viewer_hash_t *viewer = data; 50 const struct log_viewer_hash_t *viewer = data;
49 return g_str_hash(viewer->screenname) + g_str_hash(gaim_account_get_username(viewer->account)); 51
50 52 if (viewer->contact != NULL)
51 } 53 return g_direct_hash(viewer->contact);
52 54
53 static gint log_viewer_equal(gconstpointer y, gconstpointer z) 55 return g_str_hash(viewer->screenname) +
56 g_str_hash(gaim_account_get_username(viewer->account));
57 }
58
59 static gboolean log_viewer_equal(gconstpointer y, gconstpointer z)
54 { 60 {
55 const struct log_viewer_hash_t *a, *b; 61 const struct log_viewer_hash_t *a, *b;
56 int ret; 62 int ret;
57 char *normal; 63 char *normal;
58 64
59 a = y; 65 a = y;
60 b = z; 66 b = z;
61 67
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
62 normal = g_strdup(gaim_normalize(a->account, a->screenname)); 78 normal = g_strdup(gaim_normalize(a->account, a->screenname));
63 ret = (a->account == b->account) && 79 ret = (a->account == b->account) &&
64 !strcmp(normal, gaim_normalize(b->account, b->screenname)); 80 !strcmp(normal, gaim_normalize(b->account, b->screenname));
65 g_free(normal); 81 g_free(normal);
82
66 return ret; 83 return ret;
67 } 84 }
68 85
69 static void search_cb(GtkWidget *button, GaimGtkLogViewer *lv) 86 static void search_cb(GtkWidget *button, GaimGtkLogViewer *lv)
70 { 87 {
71 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));
72 GList *logs; 89 GList *logs;
73 GdkCursor *cursor = gdk_cursor_new(GDK_WATCH); 90 GdkCursor *cursor = gdk_cursor_new(GDK_WATCH);
74 91
75 if (lv->search) 92 if (lv->search != NULL)
76 g_free(lv->search); 93 g_free(lv->search);
77 94
78 gtk_tree_store_clear(lv->treestore); 95 gtk_tree_store_clear(lv->treestore);
79 if (strlen(search_term) == 0) {/* reset the tree */ 96 if (strlen(search_term) == 0) {/* reset the tree */
80 populate_log_tree(lv); 97 populate_log_tree(lv);
116 } 133 }
117 134
118 static gboolean destroy_cb(GtkWidget *w, gint resp, struct log_viewer_hash_t *ht) { 135 static gboolean destroy_cb(GtkWidget *w, gint resp, struct log_viewer_hash_t *ht) {
119 GaimGtkLogViewer *lv = syslog_viewer; 136 GaimGtkLogViewer *lv = syslog_viewer;
120 137
121 if(ht != NULL){ 138 if (ht != NULL) {
122 lv = g_hash_table_lookup(log_viewers, ht); 139 lv = g_hash_table_lookup(log_viewers, ht);
123 g_hash_table_remove(log_viewers, ht); 140 g_hash_table_remove(log_viewers, ht);
124 g_free(ht->screenname); 141
142 if (ht->screenname != NULL)
143 g_free(ht->screenname);
144
125 g_free(ht); 145 g_free(ht);
126 } else 146 } else
127 syslog_viewer = NULL; 147 syslog_viewer = NULL;
128 148
129 while (lv->logs) { 149 while (lv->logs != NULL) {
130 GaimLog *log = lv->logs->data;
131 GList *logs2; 150 GList *logs2;
132 gaim_log_free(log); 151
152 gaim_log_free((GaimLog *)lv->logs->data);
153
133 logs2 = lv->logs->next; 154 logs2 = lv->logs->next;
134 g_list_free_1(lv->logs); 155 g_list_free_1(lv->logs);
135 lv->logs = logs2; 156 lv->logs = logs2;
136 } 157 }
137 if (lv->search) 158
159 if (lv->search != NULL)
138 g_free(lv->search); 160 g_free(lv->search);
161
139 g_free(lv); 162 g_free(lv);
140 gtk_widget_destroy(w); 163 gtk_widget_destroy(w);
141 164
142 return TRUE; 165 return TRUE;
143 } 166 }
144 #if 0 167
145 static gboolean destroy_syslog_cb(GtkWidget *w, gint resp, void *cb) 168 static void log_row_activated_cb(GtkTreeView *tv, GtkTreePath *path, GtkTreeViewColumn *col, GaimGtkLogViewer *viewer) {
146 { 169 if (gtk_tree_view_row_expanded(tv, path))
147 while (syslog_viewer->logs) { 170 gtk_tree_view_collapse_row(tv, path);
148 GaimLog *log = syslog_viewer->logs->data; 171 else
149 GList *logs2; 172 gtk_tree_view_expand_row(tv, path, FALSE);
150 gaim_log_free(log); 173 }
151 logs2 = syslog_viewer->logs->next; 174
152 g_list_free_1(syslog_viewer->logs);
153 syslog_viewer->logs = logs2;
154 }
155 if (syslog_viewer->search)
156 g_free(syslog_viewer->search);
157 g_free(syslog_viewer);
158 syslog_viewer = NULL;
159 gtk_widget_destroy(w);
160
161 return TRUE;
162 }
163 #endif
164 static void log_select_cb(GtkTreeSelection *sel, GaimGtkLogViewer *viewer) { 175 static void log_select_cb(GtkTreeSelection *sel, GaimGtkLogViewer *viewer) {
165 GtkTreeIter iter; 176 GtkTreeIter iter;
166 GValue val = { 0, }; 177 GValue val = { 0, };
167 GtkTreeModel *model = GTK_TREE_MODEL(viewer->treestore); 178 GtkTreeModel *model = GTK_TREE_MODEL(viewer->treestore);
168 GaimLog *log = NULL; 179 GaimLog *log = NULL;
169 GaimLogReadFlags flags; 180 GaimLogReadFlags flags;
170 char *read = NULL; 181 char *read = NULL;
171 char time[64]; 182 char time[64];
172 183
173 char *title; 184 if (!gtk_tree_selection_get_selected(sel, &model, &iter))
174 char *title_utf8; /* temporary variable for utf8 conversion */
175
176 if (! gtk_tree_selection_get_selected (sel, &model, &iter))
177 return; 185 return;
178 gtk_tree_model_get_value (model, &iter, 1, &val); 186 gtk_tree_model_get_value (model, &iter, 1, &val);
179 log = g_value_get_pointer(&val); 187 log = g_value_get_pointer(&val);
180 g_value_unset(&val); 188 g_value_unset(&val);
181 189
182 if (!log) 190 if (log == NULL)
183 return; 191 return;
192
193 if (log->type != GAIM_LOG_SYSTEM) {
194 char *title;
195 char *title_utf8; /* temporary variable for utf8 conversion */
196
197 gaim_strftime(time, sizeof(time), "%c", localtime(&log->time));
198
199 if (log->type == GAIM_LOG_CHAT)
200 title = g_strdup_printf(_("Conversation in %s on %s"), log->name, time);
201 else
202 title = g_strdup_printf(_("Conversation with %s on %s"), log->name, time);
203
204 title_utf8 = gaim_utf8_try_convert(title);
205 g_free(title);
206
207 title = g_strdup_printf("<span size='larger' weight='bold'>%s</span>", title_utf8);
208 g_free(title_utf8);
209
210 gtk_label_set_markup(GTK_LABEL(viewer->label), title);
211 g_free(title);
212 }
184 213
185 read = gaim_log_read(log, &flags); 214 read = gaim_log_read(log, &flags);
186 viewer->flags = flags; 215 viewer->flags = flags;
187 gaim_strftime(time, sizeof(time), "%c", localtime(&log->time)); 216
188 title = g_strdup_printf("%s - %s", log->name, time);
189 title_utf8 = gaim_utf8_try_convert(title);
190 g_free(title);
191 title = title_utf8;
192 gtk_window_set_title(GTK_WINDOW(viewer->window), title);
193 gtk_imhtml_clear(GTK_IMHTML(viewer->imhtml)); 217 gtk_imhtml_clear(GTK_IMHTML(viewer->imhtml));
194 gtk_imhtml_set_protocol_name(GTK_IMHTML(viewer->imhtml), 218 gtk_imhtml_set_protocol_name(GTK_IMHTML(viewer->imhtml),
195 gaim_account_get_protocol_name(log->account)); 219 gaim_account_get_protocol_name(log->account));
196 gtk_imhtml_append_text(GTK_IMHTML(viewer->imhtml), read, 220 gtk_imhtml_append_text(GTK_IMHTML(viewer->imhtml), read,
197 GTK_IMHTML_NO_COMMENTS | GTK_IMHTML_NO_TITLE | GTK_IMHTML_NO_SCROLL | 221 GTK_IMHTML_NO_COMMENTS | GTK_IMHTML_NO_TITLE | GTK_IMHTML_NO_SCROLL |
198 ((flags & GAIM_LOG_READ_NO_NEWLINE) ? GTK_IMHTML_NO_NEWLINE : 0)); 222 ((flags & GAIM_LOG_READ_NO_NEWLINE) ? GTK_IMHTML_NO_NEWLINE : 0));
199 223
200 if (viewer->search) 224 if (viewer->search != NULL) {
201 {
202 gtk_imhtml_search_clear(GTK_IMHTML(viewer->imhtml)); 225 gtk_imhtml_search_clear(GTK_IMHTML(viewer->imhtml));
203 gtk_imhtml_search_find(GTK_IMHTML(viewer->imhtml), viewer->search); 226 gtk_imhtml_search_find(GTK_IMHTML(viewer->imhtml), viewer->search);
204 } 227 }
205 228
206 g_free(read); 229 g_free(read);
207 g_free(title);
208 } 230 }
209 231
210 /* I want to make this smarter, but haven't come up with a cool algorithm to do so, yet. 232 /* I want to make this smarter, but haven't come up with a cool algorithm to do so, yet.
211 * I want the tree to be divided into groups like "Today," "Yesterday," "Last week," 233 * I want the tree to be divided into groups like "Today," "Yesterday," "Last week,"
212 * "August," "2002," etc. based on how many conversation took place in each subdivision. 234 * "August," "2002," etc. based on how many conversation took place in each subdivision.
217 /* Logs are made from trees in real life. 239 /* Logs are made from trees in real life.
218 This is a tree made from logs */ 240 This is a tree made from logs */
219 { 241 {
220 char month[30]; 242 char month[30];
221 char title[64]; 243 char title[64];
222 char prev_top_month[30]; 244 char prev_top_month[30] = "";
223 char *utf8_tmp; /* temporary variable for utf8 conversion */ 245 char *utf8_tmp; /* temporary variable for utf8 conversion */
224 GtkTreeIter toplevel, child; 246 GtkTreeIter toplevel, child;
225 GList *logs = lv->logs; 247 GList *logs = lv->logs;
226 while (logs) { 248
249 while (logs != NULL) {
227 GaimLog *log = logs->data; 250 GaimLog *log = logs->data;
228 251
229 gaim_strftime(month, sizeof(month), "%B %Y", localtime(&log->time)); 252 gaim_strftime(month, sizeof(month), "%B %Y", localtime(&log->time));
230 gaim_strftime(title, sizeof(title), "%c", localtime(&log->time)); 253 gaim_strftime(title, sizeof(title), "%c", localtime(&log->time));
231 254
254 277
255 logs = logs->next; 278 logs = logs->next;
256 } 279 }
257 } 280 }
258 281
259 void gaim_gtk_log_show(GaimLogType type, const char *screenname, GaimAccount *account) { 282 static GaimGtkLogViewer *display_log_viewer(struct log_viewer_hash_t *ht, GList *logs,
260 /* if (log_viewers && g_hash_table */ 283 const char *title, GdkPixbuf *pixbuf)
261 GtkWidget *hbox, *vbox; 284 {
262 GdkPixbuf *pixbuf, *scale; 285 GaimGtkLogViewer *lv;
263 GtkCellRenderer *rend; 286 GtkWidget *title_box;
264 GtkTreeViewColumn *col; 287 char *text;
265 GaimGtkLogViewer *lv = NULL;
266 GtkTreeSelection *sel;
267 GtkWidget *icon, *label, *pane, *sw, *button, *frame;
268 GList *logs;
269 char *text ,*ttext;
270 struct log_viewer_hash_t *ht = g_new0(struct log_viewer_hash_t, 1);
271
272 ht->screenname = g_strdup(screenname);
273 ht->account = account;
274
275 if (!log_viewers) {
276 log_viewers = g_hash_table_new(log_viewer_hash, log_viewer_equal);
277 } else if ((lv = g_hash_table_lookup(log_viewers, ht))) {
278 gtk_window_present(GTK_WINDOW(lv->window));
279 g_free(ht);
280 return;
281 }
282 288
283 lv = g_new0(GaimGtkLogViewer, 1); 289 lv = g_new0(GaimGtkLogViewer, 1);
284 lv->logs = logs = gaim_log_get_logs(type, screenname, account); 290 lv->logs = logs;
285 g_hash_table_insert(log_viewers, ht, lv); 291
292 if (ht != NULL)
293 g_hash_table_insert(log_viewers, ht, lv);
286 294
287 /* Window ***********/ 295 /* Window ***********/
288 lv->window = gtk_dialog_new_with_buttons(screenname, NULL, 0, 296 lv->window = gtk_dialog_new_with_buttons(title, NULL, 0,
289 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, NULL); 297 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, NULL);
290 gtk_container_set_border_width (GTK_CONTAINER(lv->window), 6); 298 gtk_container_set_border_width (GTK_CONTAINER(lv->window), 6);
291 gtk_dialog_set_has_separator(GTK_DIALOG(lv->window), FALSE); 299 gtk_dialog_set_has_separator(GTK_DIALOG(lv->window), FALSE);
292 gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(lv->window)->vbox), 0); 300 gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(lv->window)->vbox), 0);
293 g_signal_connect(G_OBJECT(lv->window), "response", 301 g_signal_connect(G_OBJECT(lv->window), "response",
294 G_CALLBACK(destroy_cb), ht); 302 G_CALLBACK(destroy_cb), ht);
295 303
296 hbox = gtk_hbox_new(FALSE, 6);
297 gtk_container_set_border_width(GTK_CONTAINER(hbox), 6);
298 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(lv->window)->vbox), hbox, FALSE, FALSE, 0);
299
300 /* Icon *************/ 304 /* Icon *************/
301 pixbuf = create_prpl_icon(account); 305 if (pixbuf != NULL) {
302 scale = gdk_pixbuf_scale_simple(pixbuf, 16, 16, GDK_INTERP_BILINEAR); 306 GdkPixbuf *scale;
303 icon = gtk_image_new_from_pixbuf(scale); 307 GtkWidget *icon;
304 gtk_box_pack_start(GTK_BOX(hbox), icon, FALSE, FALSE, 0); 308
305 g_object_unref(G_OBJECT(pixbuf)); 309 title_box = gtk_hbox_new(FALSE, 6);
306 g_object_unref(G_OBJECT(scale)); 310 gtk_container_set_border_width(GTK_CONTAINER(title_box), 6);
311 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(lv->window)->vbox), title_box, FALSE, FALSE, 0);
312
313 scale = gdk_pixbuf_scale_simple(pixbuf, 16, 16, GDK_INTERP_BILINEAR);
314 icon = gtk_image_new_from_pixbuf(scale);
315 gtk_box_pack_start(GTK_BOX(title_box), icon, FALSE, FALSE, 0);
316 g_object_unref(G_OBJECT(pixbuf));
317 g_object_unref(G_OBJECT(scale));
318 } else
319 title_box = GTK_DIALOG(lv->window)->vbox;
307 320
308 /* Label ************/ 321 /* Label ************/
309 label = gtk_label_new(NULL); 322 lv->label = gtk_label_new(NULL);
310 323
311 ttext = g_strdup_printf(_("Conversations with %s"), screenname); 324 text = g_strdup_printf("<span size='larger' weight='bold'>%s</span>", title);
312 text = g_strdup_printf("<span size='larger' weight='bold'>%s</span>",ttext); 325
313 g_free(ttext); 326 gtk_label_set_markup(GTK_LABEL(lv->label), text);
314 327 gtk_misc_set_alignment(GTK_MISC(lv->label), 0, 0);
315 gtk_label_set_markup(GTK_LABEL(label), text); 328 gtk_box_pack_start(GTK_BOX(title_box), lv->label, FALSE, FALSE, 0);
316 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
317 g_free(text); 329 g_free(text);
318 330
319 /* Pane *************/ 331 if (logs != NULL) {
320 pane = gtk_hpaned_new(); 332 GtkWidget *pane;
321 gtk_container_set_border_width(GTK_CONTAINER(pane), 6); 333 GtkWidget *sw;
322 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(lv->window)->vbox), pane, TRUE, TRUE, 0); 334 GtkCellRenderer *rend;
323 335 GtkTreeViewColumn *col;
324 /* List *************/ 336 GtkTreeSelection *sel;
325 sw = gtk_scrolled_window_new (NULL, NULL); 337 GtkWidget *vbox;
326 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), GTK_SHADOW_IN); 338 GtkWidget *frame;
327 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS); 339 GtkWidget *hbox;
328 gtk_paned_add1(GTK_PANED(pane), sw); 340 GtkWidget *button;
329 lv->treestore = gtk_tree_store_new (2, G_TYPE_STRING, G_TYPE_POINTER); 341
330 lv->treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (lv->treestore)); 342 /* Pane *************/
331 rend = gtk_cell_renderer_text_new(); 343 pane = gtk_hpaned_new();
332 col = gtk_tree_view_column_new_with_attributes ("time", rend, "markup", 0, NULL); 344 gtk_container_set_border_width(GTK_CONTAINER(pane), 6);
333 gtk_tree_view_append_column (GTK_TREE_VIEW(lv->treeview), col); 345 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(lv->window)->vbox), pane, TRUE, TRUE, 0);
334 gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (lv->treeview), FALSE); 346
335 gtk_container_add (GTK_CONTAINER (sw), lv->treeview); 347 /* List *************/
336 populate_log_tree(lv); 348 sw = gtk_scrolled_window_new (NULL, NULL);
337 349 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), GTK_SHADOW_IN);
338 sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (lv->treeview)); 350 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
339 g_signal_connect (G_OBJECT (sel), "changed", 351 gtk_paned_add1(GTK_PANED(pane), sw);
340 G_CALLBACK (log_select_cb), 352 lv->treestore = gtk_tree_store_new (2, G_TYPE_STRING, G_TYPE_POINTER);
341 lv); 353 lv->treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (lv->treestore));
342 gaim_set_accessible_label(lv->treeview, label); 354 rend = gtk_cell_renderer_text_new();
343 355 col = gtk_tree_view_column_new_with_attributes ("time", rend, "markup", 0, NULL);
344 /* A fancy little box ************/ 356 gtk_tree_view_append_column (GTK_TREE_VIEW(lv->treeview), col);
345 vbox = gtk_vbox_new(FALSE, 6); 357 gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (lv->treeview), FALSE);
346 gtk_paned_add2(GTK_PANED(pane), vbox); 358 gtk_container_add (GTK_CONTAINER (sw), lv->treeview);
347 359
348 /* Viewer ************/ 360 populate_log_tree(lv);
349 frame = gaim_gtk_create_imhtml(FALSE, &lv->imhtml, NULL); 361
350 gtk_widget_set_name(lv->imhtml, "gaim_gtklog_imhtml"); 362 sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (lv->treeview));
351 gtk_widget_set_size_request(lv->imhtml, 320, 200); 363 g_signal_connect (G_OBJECT (sel), "changed",
352 gtk_box_pack_start(GTK_BOX(vbox), frame, TRUE, TRUE, 0); 364 G_CALLBACK (log_select_cb),
353 gtk_widget_show(frame); 365 lv);
354 366 g_signal_connect (G_OBJECT(lv->treeview), "row-activated",
355 /* Search box **********/ 367 G_CALLBACK(log_row_activated_cb),
356 hbox = gtk_hbox_new(FALSE, 6); 368 lv);
357 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); 369 gaim_set_accessible_label(lv->treeview, lv->label);
358 lv->entry = gtk_entry_new(); 370
359 gtk_box_pack_start(GTK_BOX(hbox), lv->entry, TRUE, TRUE, 0); 371 /* A fancy little box ************/
360 button = gtk_button_new_from_stock(GTK_STOCK_FIND); 372 vbox = gtk_vbox_new(FALSE, 6);
361 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); 373 gtk_paned_add2(GTK_PANED(pane), vbox);
362 g_signal_connect(GTK_ENTRY(lv->entry), "activate", G_CALLBACK(search_cb), lv); 374
363 g_signal_connect(GTK_BUTTON(button), "activate", G_CALLBACK(search_cb), lv); 375 /* Viewer ************/
364 g_signal_connect(GTK_BUTTON(button), "clicked", G_CALLBACK(search_cb), lv); 376 frame = gaim_gtk_create_imhtml(FALSE, &lv->imhtml, NULL);
377 gtk_widget_set_name(lv->imhtml, "gaim_gtklog_imhtml");
378 gtk_widget_set_size_request(lv->imhtml, 320, 200);
379 gtk_box_pack_start(GTK_BOX(vbox), frame, TRUE, TRUE, 0);
380 gtk_widget_show(frame);
381
382 /* Search box **********/
383 hbox = gtk_hbox_new(FALSE, 6);
384 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
385 lv->entry = gtk_entry_new();
386 gtk_box_pack_start(GTK_BOX(hbox), lv->entry, TRUE, TRUE, 0);
387 button = gtk_button_new_from_stock(GTK_STOCK_FIND);
388 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
389 g_signal_connect(GTK_ENTRY(lv->entry), "activate", G_CALLBACK(search_cb), lv);
390 g_signal_connect(GTK_BUTTON(button), "activate", G_CALLBACK(search_cb), lv);
391 g_signal_connect(GTK_BUTTON(button), "clicked", G_CALLBACK(search_cb), lv);
392 } else {
393 /* No logs were found. */
394 const char *log_preferences = NULL;
395 GtkWidget *label;
396
397 if (ht == NULL) {
398 if (!gaim_prefs_get_bool("/core/logging/log_system"))
399 log_preferences = _("System events will only be logged if the <span style=\"italic\">Enable system log preference</span> is set.");
400 } else {
401 if (ht->type == GAIM_LOG_IM) {
402 if (!gaim_prefs_get_bool("/core/logging/log_ims"))
403 log_preferences = _("Instant messages will only be logged if the <span style=\"italic\">Log all instant messages</span> preference is enabled.");
404 } else if (ht->type == GAIM_LOG_CHAT) {
405 if (!gaim_prefs_get_bool("/core/logging/log_chats"))
406 log_preferences = _("Chats will only be logged if the <span style=\"italic\">Log all chats preference</span> is enabled.");
407 }
408 }
409
410 text = g_strdup_printf("\n<span weight=\"bold\">%s</span>%s%s\n",
411 _("No logs were found."),
412 log_preferences ? "\n" : "",
413 log_preferences ? log_preferences : "");
414
415 label = gtk_label_new(NULL);
416
417 gtk_label_set_markup(GTK_LABEL(label), text);
418 gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
419 gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
420 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(lv->window)->vbox), label, FALSE, FALSE, 0);
421 g_free(text);
422 }
365 423
366 gtk_widget_show_all(lv->window); 424 gtk_widget_show_all(lv->window);
425
426 return lv;
427 }
428
429 void gaim_gtk_log_show(GaimLogType type, const char *screenname, GaimAccount *account) {
430 struct log_viewer_hash_t *ht = g_new0(struct log_viewer_hash_t, 1);
431 GaimGtkLogViewer *lv = NULL;
432 const char *name = screenname;
433 char *title;
434
435 g_return_if_fail(account != NULL);
436 g_return_if_fail(screenname != NULL);
437
438 ht->type = type;
439 ht->screenname = g_strdup(screenname);
440 ht->account = account;
441
442 if (log_viewers == NULL) {
443 log_viewers = g_hash_table_new(log_viewer_hash, log_viewer_equal);
444 } else if ((lv = g_hash_table_lookup(log_viewers, ht))) {
445 gtk_window_present(GTK_WINDOW(lv->window));
446 g_free(ht);
447 return;
448 }
449
450 if (type == GAIM_LOG_CHAT) {
451 GaimChat *chat;
452
453 chat = gaim_blist_find_chat(account, screenname);
454 if (chat != NULL)
455 name = gaim_chat_get_name(chat);
456
457 title = g_strdup_printf(_("Conversations in %s"), name);
458 } else {
459 GaimBuddy *buddy;
460
461 buddy = gaim_find_buddy(account, screenname);
462 if (buddy != NULL)
463 name = gaim_buddy_get_contact_alias(buddy);
464
465 title = g_strdup_printf(_("Conversations with %s"), name);
466 }
467
468 display_log_viewer(ht, gaim_log_get_logs(type, screenname, account),
469 title, create_prpl_icon(account));
470 g_free(title);
471 }
472
473 void gaim_gtk_log_show_contact(GaimContact *contact) {
474 struct log_viewer_hash_t *ht = g_new0(struct log_viewer_hash_t, 1);
475 GaimBlistNode *child;
476 GaimGtkLogViewer *lv = NULL;
477 GList *logs = NULL;
478 char *filename;
479 GdkPixbuf *pixbuf;
480 const char *name = NULL;
481 char *title;
482
483 g_return_if_fail(contact != NULL);
484
485 ht->type = GAIM_LOG_IM;
486 ht->contact = contact;
487
488 if (log_viewers == NULL) {
489 log_viewers = g_hash_table_new(log_viewer_hash, log_viewer_equal);
490 } else if ((lv = g_hash_table_lookup(log_viewers, ht))) {
491 gtk_window_present(GTK_WINDOW(lv->window));
492 g_free(ht);
493 return;
494 }
495
496 for (child = contact->node.child ; child ; child = child->next) {
497 if (!GAIM_BLIST_NODE_IS_BUDDY(child))
498 continue;
499
500 logs = g_list_concat(logs,
501 gaim_log_get_logs(GAIM_LOG_IM, ((GaimBuddy *)child)->name,
502 ((GaimBuddy *)child)->account));
503 }
504 logs = g_list_sort(logs, gaim_log_compare);
505
506 filename = g_build_filename(DATADIR, "pixmaps", "gaim", "icons", "online.png", NULL);
507 pixbuf = gdk_pixbuf_new_from_file(filename, NULL);
508 g_free(filename);
509
510 if (contact->alias != NULL)
511 name = contact->alias;
512 else if (contact->priority != NULL)
513 name = gaim_buddy_get_contact_alias(contact->priority);
514
515 title = g_strdup_printf(_("Conversations with %s"), name);
516 display_log_viewer(ht, logs, title, pixbuf);
517 g_free(title);
367 } 518 }
368 519
369 void gaim_gtk_syslog_show() 520 void gaim_gtk_syslog_show()
370 { 521 {
371 GtkWidget *hbox, *vbox;
372 GtkCellRenderer *rend;
373 GtkTreeViewColumn *col;
374 GtkTreeSelection *sel;
375 GtkWidget *label, *pane, *sw, *button, *frame;
376 char *text;
377 GList *accounts = NULL; 522 GList *accounts = NULL;
523 GList *logs = NULL;
378 524
379 if (syslog_viewer != NULL) { 525 if (syslog_viewer != NULL) {
380 gtk_window_present(GTK_WINDOW(syslog_viewer->window)); 526 gtk_window_present(GTK_WINDOW(syslog_viewer->window));
381 return; 527 return;
382 } 528 }
383 529
384 syslog_viewer = g_new0(GaimGtkLogViewer, 1); 530 for(accounts = gaim_accounts_get_all(); accounts != NULL; accounts = accounts->next) {
385 531
386 for(accounts = gaim_accounts_get_all(); accounts != NULL;
387 accounts = accounts->next) {
388 GList *logs;
389 GaimAccount *account = (GaimAccount *)accounts->data; 532 GaimAccount *account = (GaimAccount *)accounts->data;
390 if(!gaim_find_prpl(gaim_account_get_protocol_id(account))) 533 if(gaim_find_prpl(gaim_account_get_protocol_id(account)) == NULL)
391 continue; 534 continue;
392 535
393 logs = gaim_log_get_system_logs(account); 536 logs = gaim_log_get_system_logs(account);
394 syslog_viewer->logs = g_list_concat(syslog_viewer->logs, logs); 537 logs = g_list_concat(logs, gaim_log_get_system_logs(account));
395 } 538 }
396 syslog_viewer->logs = g_list_sort(syslog_viewer->logs, gaim_log_compare); 539 logs = g_list_sort(logs, gaim_log_compare);
397 540
398 /* Window ***********/ 541 syslog_viewer = display_log_viewer(NULL, logs, _("System Log"), NULL);
399 syslog_viewer->window = gtk_dialog_new_with_buttons(_("System Log"), NULL, 0, 542 }
400 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, NULL);
401 gtk_container_set_border_width (GTK_CONTAINER(syslog_viewer->window), 6);
402 gtk_dialog_set_has_separator(GTK_DIALOG(syslog_viewer->window), FALSE);
403 gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(syslog_viewer->window)->vbox), 0);
404 g_signal_connect(G_OBJECT(syslog_viewer->window), "response",
405 G_CALLBACK(destroy_cb), NULL);
406
407 hbox = gtk_hbox_new(FALSE, 6);
408 gtk_container_set_border_width(GTK_CONTAINER(hbox), 6);
409 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(syslog_viewer->window)->vbox), hbox,
410 FALSE, FALSE, 0);
411
412 /* Label ************/
413 label = gtk_label_new(NULL);
414 text = g_strdup_printf("<span size='larger' weight='bold'>%s</span>",
415 _("System Log"));
416 gtk_label_set_markup(GTK_LABEL(label), text);
417 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
418 g_free(text);
419
420 /* Pane *************/
421 pane = gtk_hpaned_new();
422 gtk_container_set_border_width(GTK_CONTAINER(pane), 6);
423 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(syslog_viewer->window)->vbox), pane,
424 TRUE, TRUE, 0);
425
426 /* List *************/
427 sw = gtk_scrolled_window_new (NULL, NULL);
428 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), GTK_SHADOW_IN);
429 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
430 gtk_paned_add1(GTK_PANED(pane), sw);
431 syslog_viewer->treestore = gtk_tree_store_new (2, G_TYPE_STRING, G_TYPE_POINTER);
432 syslog_viewer->treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (syslog_viewer->treestore));
433 rend = gtk_cell_renderer_text_new();
434 col = gtk_tree_view_column_new_with_attributes ("time", rend, "markup", 0, NULL);
435 gtk_tree_view_append_column (GTK_TREE_VIEW(syslog_viewer->treeview), col);
436 gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (syslog_viewer->treeview), FALSE);
437 gtk_container_add (GTK_CONTAINER (sw), syslog_viewer->treeview);
438
439 gtk_widget_set_size_request(syslog_viewer->treeview, 170, 200);
440 populate_log_tree(syslog_viewer);
441
442 sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (syslog_viewer->treeview));
443 g_signal_connect (G_OBJECT (sel), "changed",
444 G_CALLBACK (log_select_cb),
445 syslog_viewer);
446
447 /* A fancy little box ************/
448 vbox = gtk_vbox_new(FALSE, 6);
449 gtk_paned_add2(GTK_PANED(pane), vbox);
450
451 /* Viewer ************/
452 frame = gaim_gtk_create_imhtml(FALSE, &syslog_viewer->imhtml, NULL);
453 gtk_widget_set_name(syslog_viewer->imhtml, "gaim_gtklog_imhtml");
454 gtk_widget_set_size_request(syslog_viewer->imhtml, 400, 200);
455 gtk_box_pack_start(GTK_BOX(vbox), frame, TRUE, TRUE, 0);
456 gtk_widget_show(frame);
457
458 /* Search box **********/
459 hbox = gtk_hbox_new(FALSE, 6);
460 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
461 syslog_viewer->entry = gtk_entry_new();
462 gtk_box_pack_start(GTK_BOX(hbox), syslog_viewer->entry, TRUE, TRUE, 0);
463 button = gtk_button_new_from_stock(GTK_STOCK_FIND);
464 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
465 g_signal_connect(GTK_ENTRY(syslog_viewer->entry), "activate",
466 G_CALLBACK(search_cb), syslog_viewer);
467 g_signal_connect(GTK_BUTTON(button), "activate",
468 G_CALLBACK(search_cb), syslog_viewer);
469 g_signal_connect(GTK_BUTTON(button), "clicked",
470 G_CALLBACK(search_cb), syslog_viewer);
471
472 gtk_widget_show_all(syslog_viewer->window);
473 }