| 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); |