pidgin/gtklog.c

changeset 15586
b03db9cb6cac
parent 15578
8039a694e225
child 15612
5de26d19e4e5
equal deleted inserted replaced
15585:93dff667b2a3 15586:b03db9cb6cac
24 */ 24 */
25 #include "internal.h" 25 #include "internal.h"
26 #include "pidgin.h" 26 #include "pidgin.h"
27 27
28 #include "account.h" 28 #include "account.h"
29 #include "debug.h"
30 #include "log.h"
31 #include "notify.h"
32 #include "request.h"
33 #include "util.h"
34
29 #include "gtkblist.h" 35 #include "gtkblist.h"
30 #include "gtkimhtml.h" 36 #include "gtkimhtml.h"
31 #include "gtklog.h" 37 #include "gtklog.h"
32 #include "gtkutils.h" 38 #include "gtkutils.h"
33 #include "log.h"
34 #include "notify.h"
35 #include "util.h"
36 39
37 static GHashTable *log_viewers = NULL; 40 static GHashTable *log_viewers = NULL;
38 static void populate_log_tree(PidginLogViewer *lv); 41 static void populate_log_tree(PidginLogViewer *lv);
39 static PidginLogViewer *syslog_viewer = NULL; 42 static PidginLogViewer *syslog_viewer = NULL;
40 43
182 g_free(ht->screenname); 185 g_free(ht->screenname);
183 g_free(ht); 186 g_free(ht);
184 } else 187 } else
185 syslog_viewer = NULL; 188 syslog_viewer = NULL;
186 189
190 gaim_request_close_with_handle(lv);
191
187 g_list_foreach(lv->logs, (GFunc)gaim_log_free, NULL); 192 g_list_foreach(lv->logs, (GFunc)gaim_log_free, NULL);
188 g_list_free(lv->logs); 193 g_list_free(lv->logs);
189 194
190 g_free(lv->search); 195 g_free(lv->search);
191 g_free(lv); 196 g_free(lv);
196 static void log_row_activated_cb(GtkTreeView *tv, GtkTreePath *path, GtkTreeViewColumn *col, PidginLogViewer *viewer) { 201 static void log_row_activated_cb(GtkTreeView *tv, GtkTreePath *path, GtkTreeViewColumn *col, PidginLogViewer *viewer) {
197 if (gtk_tree_view_row_expanded(tv, path)) 202 if (gtk_tree_view_row_expanded(tv, path))
198 gtk_tree_view_collapse_row(tv, path); 203 gtk_tree_view_collapse_row(tv, path);
199 else 204 else
200 gtk_tree_view_expand_row(tv, path, FALSE); 205 gtk_tree_view_expand_row(tv, path, FALSE);
206 }
207
208 static void delete_log_cb(GaimLog *log)
209 {
210 if (!gaim_log_delete(log))
211 {
212 gaim_notify_error(NULL, NULL, "Log Deletion Failed",
213 "Check permissions and try again.");
214 }
215 }
216
217 static void log_delete_log_cb(GtkWidget *menuitem, gpointer *data)
218 {
219 PidginLogViewer *lv = data[0];
220 GaimLog *log = data[1];
221 const char *time = log_get_date(log);
222 const char *name;
223 char *tmp;
224
225 if (log->type == GAIM_LOG_IM)
226 {
227 GaimBuddy *buddy = gaim_find_buddy(log->account, log->name);
228 if (buddy != NULL)
229 name = gaim_buddy_get_contact_alias(buddy);
230 else
231 name = log->name;
232
233 tmp = g_strdup_printf(_("Are you sure you want to permanently delete the log of the "
234 "conversation with %s which started at %s?"), name, time);
235 }
236 else if (log->type == GAIM_LOG_CHAT)
237 {
238 GaimChat *chat = gaim_blist_find_chat(log->account, log->name);
239 if (chat != NULL)
240 name = gaim_chat_get_name(chat);
241 else
242 name = log->name;
243
244 tmp = g_strdup_printf(_("Are you sure you want to permanently delete the log of the "
245 "conversation in %s which started at %s?"), name, time);
246 }
247 else if (log->type == GAIM_LOG_SYSTEM)
248 {
249 tmp = g_strdup_printf(_("Are you sure you want to permanently delete the system log "
250 "which started at %s?"), time);
251 }
252 else
253 g_return_if_reached();
254
255 gaim_request_action(lv, NULL, "Delete Log?", tmp,
256 0, log, 2, _("Delete"), delete_log_cb, _("Cancel"), NULL);
257 g_free(tmp);
258 }
259
260 static void log_show_popup_menu(GtkWidget *treeview, GdkEventButton *event, gpointer *data)
261 {
262 GtkWidget *menu = gtk_menu_new();
263 GtkWidget *menuitem = gtk_menu_item_new_with_label("Delete Log...");
264
265 if (!gaim_log_is_deletable((GaimLog *)data[1]))
266 gtk_widget_set_sensitive(menuitem, FALSE);
267
268 g_signal_connect(menuitem, "activate", G_CALLBACK(log_delete_log_cb), data);
269 g_object_set_data_full(menuitem, "log-viewer-data", data, g_free);
270 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
271 gtk_widget_show_all(menu);
272
273 gtk_menu_popup(GTK_MENU(menu), NULL, (GtkMenuPositionFunc)data[2], NULL, NULL,
274 (event != NULL) ? event->button : 0,
275 gdk_event_get_time((GdkEvent *)event));
276 }
277
278 static gboolean log_button_press_cb(GtkWidget *treeview, GdkEventButton *event, PidginLogViewer *lv)
279 {
280 if (event->type == GDK_BUTTON_PRESS && event->button == 3)
281 {
282 GtkTreePath *path;
283 GtkTreeIter iter;
284 GValue val;
285 GaimLog *log;
286 gpointer *data;
287
288 if (!gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(treeview), event->x, event->y, &path, NULL, NULL, NULL))
289 return FALSE;
290 gtk_tree_model_get_iter(GTK_TREE_MODEL(lv->treestore), &iter, path);
291 val.g_type = 0;
292 gtk_tree_model_get_value(GTK_TREE_MODEL(lv->treestore), &iter, 1, &val);
293
294 log = g_value_get_pointer(&val);
295
296 if (log == NULL)
297 return FALSE;
298
299 data = g_new(gpointer, 3);
300 data[0] = lv;
301 data[1] = log;
302 data[2] = NULL;
303
304 log_show_popup_menu(treeview, event, data);
305 return TRUE;
306 }
307
308 return FALSE;
309 }
310
311 static gboolean log_popup_menu_cb(GtkWidget *treeview, PidginLogViewer *lv)
312 {
313 GtkTreeSelection *sel;
314 GtkTreeIter iter;
315 GValue val;
316 GaimLog *log;
317 gpointer *data;
318
319 sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(lv));
320 if (!gtk_tree_selection_get_selected(sel, NULL, &iter))
321 return FALSE;
322
323 val.g_type = 0;
324 gtk_tree_model_get_value(GTK_TREE_MODEL(lv->treestore),
325 &iter, NODE_COLUMN, &val);
326
327 log = g_value_get_pointer(&val);
328
329 if (log == NULL)
330 return FALSE;
331
332 data = g_new(gpointer, 3);
333 data[0] = lv;
334 data[1] = log;
335 data[2] = pidgin_treeview_popup_menu_position_func;
336
337 log_show_popup_menu(treeview, NULL, data);
338 return TRUE;
201 } 339 }
202 340
203 static gboolean search_find_cb(gpointer data) 341 static gboolean search_find_cb(gpointer data)
204 { 342 {
205 PidginLogViewer *viewer = data; 343 PidginLogViewer *viewer = data;
414 g_signal_connect (G_OBJECT(lv->treeview), "row-activated", 552 g_signal_connect (G_OBJECT(lv->treeview), "row-activated",
415 G_CALLBACK(log_row_activated_cb), 553 G_CALLBACK(log_row_activated_cb),
416 lv); 554 lv);
417 pidgin_set_accessible_label(lv->treeview, lv->label); 555 pidgin_set_accessible_label(lv->treeview, lv->label);
418 556
557 g_signal_connect(lv->treeview, "button-press-event", G_CALLBACK(log_button_press_cb), lv);
558 g_signal_connect(lv->treeview, "popup-menu", G_CALLBACK(log_popup_menu_cb), lv);
559
419 /* Log size ************/ 560 /* Log size ************/
420 if(log_size) { 561 if(log_size) {
421 char *sz_txt = gaim_str_size_to_units(log_size); 562 char *sz_txt = gaim_str_size_to_units(log_size);
422 text = g_strdup_printf("<span weight='bold'>%s</span> %s", _("Total log size:"), sz_txt); 563 text = g_strdup_printf("<span weight='bold'>%s</span> %s", _("Total log size:"), sz_txt);
423 size_label = gtk_label_new(NULL); 564 size_label = gtk_label_new(NULL);

mercurial