| 532 static void gtk_blist_menu_join_cb(GtkWidget *w, GaimChat *chat) |
532 static void gtk_blist_menu_join_cb(GtkWidget *w, GaimChat *chat) |
| 533 { |
533 { |
| 534 serv_join_chat(chat->account->gc, chat->components); |
534 serv_join_chat(chat->account->gc, chat->components); |
| 535 } |
535 } |
| 536 |
536 |
| |
537 static void gtk_blist_renderer_edited_cb(GtkCellRendererText *text_rend, char *arg1, |
| |
538 char *arg2, gpointer nada) |
| |
539 { |
| |
540 GtkTreeIter iter; |
| |
541 GtkTreePath *path; |
| |
542 GValue val = {0,}; |
| |
543 GaimBlistNode *node; |
| |
544 |
| |
545 path = gtk_tree_path_new_from_string (arg1); |
| |
546 gtk_tree_model_get_iter (GTK_TREE_MODEL(gtkblist->treemodel), &iter, path); |
| |
547 gtk_tree_path_free (path); |
| |
548 gtk_tree_model_get_value (GTK_TREE_MODEL(gtkblist->treemodel), &iter, NODE_COLUMN, &val); |
| |
549 node = g_value_get_pointer(&val); |
| |
550 gtk_tree_view_set_enable_search (GTK_TREE_VIEW(gtkblist->treeview), TRUE); |
| |
551 g_object_set(G_OBJECT(gtkblist->text_rend), "editable", FALSE, NULL); |
| |
552 switch (node->type){ |
| |
553 case GAIM_BLIST_CONTACT_NODE: |
| |
554 gaim_blist_alias_buddy(gaim_contact_get_priority_buddy((GaimContact*)node), arg2); |
| |
555 break; |
| |
556 case GAIM_BLIST_BUDDY_NODE: |
| |
557 gaim_blist_alias_buddy((GaimBuddy*)node, arg2); |
| |
558 break; |
| |
559 case GAIM_BLIST_GROUP_NODE: |
| |
560 gaim_blist_rename_group((GaimGroup*)node, arg2); |
| |
561 break; |
| |
562 case GAIM_BLIST_CHAT_NODE: |
| |
563 gaim_blist_alias_chat((GaimChat*)node, arg2); |
| |
564 break; |
| |
565 default: |
| |
566 break; |
| |
567 } |
| |
568 } |
| |
569 |
| |
570 static void |
| |
571 gtk_blist_edit_starting(GtkCellRenderer *renderer, |
| |
572 GtkCellEditable *editable, |
| |
573 gchar *pathstr, |
| |
574 gpointer user_data) |
| |
575 { |
| |
576 GtkTreePath *path; |
| |
577 GtkTreeIter iter; |
| |
578 GaimBlistNode *node; |
| |
579 GValue val = {0,}; |
| |
580 |
| |
581 path = gtk_tree_path_new_from_string (pathstr); |
| |
582 gtk_tree_model_get_iter (GTK_TREE_MODEL(gtkblist->treemodel), &iter, path); |
| |
583 gtk_tree_path_free (path); |
| |
584 gtk_tree_model_get_value (GTK_TREE_MODEL(gtkblist->treemodel), &iter, NODE_COLUMN, &val); |
| |
585 node = g_value_get_pointer(&val); |
| |
586 |
| |
587 switch (node->type) { |
| |
588 case GAIM_BLIST_BUDDY_NODE: |
| |
589 gtk_entry_set_text(GTK_ENTRY(editable), ((GaimBuddy*)node)->alias); |
| |
590 break; |
| |
591 case GAIM_BLIST_CONTACT_NODE: |
| |
592 gtk_entry_set_text(GTK_ENTRY(editable), (gaim_contact_get_priority_buddy((GaimContact*)node))->alias); |
| |
593 break; |
| |
594 case GAIM_BLIST_GROUP_NODE: |
| |
595 gtk_entry_set_text(GTK_ENTRY(editable), ((GaimGroup*)node)->name); |
| |
596 break; |
| |
597 case GAIM_BLIST_CHAT_NODE: |
| |
598 gtk_entry_set_text(GTK_ENTRY(editable), ((GaimChat*)node)->alias); |
| |
599 break; |
| |
600 default: |
| |
601 break; |
| |
602 } |
| |
603 } |
| |
604 |
| 537 static void gtk_blist_menu_alias_cb(GtkWidget *w, GaimBlistNode *node) |
605 static void gtk_blist_menu_alias_cb(GtkWidget *w, GaimBlistNode *node) |
| 538 { |
606 { |
| 539 if(GAIM_BLIST_NODE_IS_BUDDY(node)) |
607 GtkTreeIter iter; |
| 540 gaim_gtkdialogs_alias_buddy((GaimBuddy*)node); |
608 GtkTreePath *path; |
| 541 else if(GAIM_BLIST_NODE_IS_CONTACT(node)) |
609 |
| 542 gaim_gtkdialogs_alias_contact((GaimContact*)node); |
610 if (!(get_iter_from_node(node, &iter))) { |
| 543 else if(GAIM_BLIST_NODE_IS_CHAT(node)) |
611 /* This is either a bug, or the buddy is in a collapsed contact */ |
| 544 gaim_gtkdialogs_alias_chat((GaimChat*)node); |
612 node = node->parent; |
| |
613 if (!get_iter_from_node(node, &iter)) |
| |
614 /* Now it's definitely a bug */ |
| |
615 return; |
| |
616 } |
| |
617 path = gtk_tree_model_get_path(GTK_TREE_MODEL(gtkblist->treemodel), &iter); |
| |
618 g_object_set(G_OBJECT(gtkblist->text_rend), "editable", TRUE, NULL); |
| |
619 gtk_tree_view_set_enable_search (GTK_TREE_VIEW(gtkblist->treeview), FALSE); |
| |
620 gtk_widget_grab_focus(gtkblist->treeview); |
| |
621 gtk_tree_view_set_cursor(GTK_TREE_VIEW(gtkblist->treeview), path, gtkblist->text_column, TRUE); |
| |
622 gtk_tree_path_free(path); |
| 545 } |
623 } |
| 546 |
624 |
| 547 static void gtk_blist_menu_bp_cb(GtkWidget *w, GaimBuddy *b) |
625 static void gtk_blist_menu_bp_cb(GtkWidget *w, GaimBuddy *b) |
| 548 { |
626 { |
| 549 gaim_gtkpounce_dialog_show(b->account, b->name, NULL); |
627 gaim_gtkpounce_dialog_show(b->account, b->name, NULL); |
| 1252 gaim_new_item_from_stock(menu, _("Add a C_hat"), GTK_STOCK_ADD, |
1330 gaim_new_item_from_stock(menu, _("Add a C_hat"), GTK_STOCK_ADD, |
| 1253 G_CALLBACK(gaim_gtk_blist_add_chat_cb), node, 0, 0, NULL); |
1331 G_CALLBACK(gaim_gtk_blist_add_chat_cb), node, 0, 0, NULL); |
| 1254 gaim_new_item_from_stock(menu, _("_Delete Group"), GTK_STOCK_REMOVE, |
1332 gaim_new_item_from_stock(menu, _("_Delete Group"), GTK_STOCK_REMOVE, |
| 1255 G_CALLBACK(gaim_gtk_blist_remove_cb), node, 0, 0, NULL); |
1333 G_CALLBACK(gaim_gtk_blist_remove_cb), node, 0, 0, NULL); |
| 1256 gaim_new_item_from_stock(menu, _("_Rename"), NULL, |
1334 gaim_new_item_from_stock(menu, _("_Rename"), NULL, |
| 1257 G_CALLBACK(show_rename_group), node, 0, 0, NULL); |
1335 G_CALLBACK(gtk_blist_menu_alias_cb), node, 0, 0, NULL); |
| 1258 |
1336 |
| 1259 gaim_gtk_append_blist_node_extended_menu(menu, node); |
1337 gaim_gtk_append_blist_node_extended_menu(menu, node); |
| 1260 |
1338 |
| 1261 return menu; |
1339 return menu; |
| 1262 } |
1340 } |
| 2614 }; |
2692 }; |
| 2615 |
2693 |
| 2616 /********************************************************* |
2694 /********************************************************* |
| 2617 * Private Utility functions * |
2695 * Private Utility functions * |
| 2618 *********************************************************/ |
2696 *********************************************************/ |
| 2619 static void |
|
| 2620 rename_group_cb(GaimGroup *g, const char *new_name) |
|
| 2621 { |
|
| 2622 gaim_blist_rename_group(g, new_name); |
|
| 2623 } |
|
| 2624 |
|
| 2625 /* |
|
| 2626 * Should disallow empty group names. |
|
| 2627 */ |
|
| 2628 static void |
|
| 2629 show_rename_group(GtkWidget *unused, GaimGroup *g) |
|
| 2630 { |
|
| 2631 gaim_request_input(NULL, _("Rename Group"), _("New group name"), |
|
| 2632 _("Please enter a new name for the selected group."), |
|
| 2633 g->name, FALSE, FALSE, NULL, |
|
| 2634 _("OK"), G_CALLBACK(rename_group_cb), |
|
| 2635 _("Cancel"), NULL, g); |
|
| 2636 } |
|
| 2637 |
2697 |
| 2638 static char *gaim_get_tooltip_text(GaimBlistNode *node) |
2698 static char *gaim_get_tooltip_text(GaimBlistNode *node) |
| 2639 { |
2699 { |
| 2640 GString *str = g_string_new(""); |
2700 GString *str = g_string_new(""); |
| 2641 GaimPlugin *prpl; |
2701 GaimPlugin *prpl; |
| 3469 g_signal_connect(G_OBJECT(gtkblist->treeview), "motion-notify-event", G_CALLBACK(gaim_gtk_blist_motion_cb), NULL); |
3529 g_signal_connect(G_OBJECT(gtkblist->treeview), "motion-notify-event", G_CALLBACK(gaim_gtk_blist_motion_cb), NULL); |
| 3470 g_signal_connect(G_OBJECT(gtkblist->treeview), "leave-notify-event", G_CALLBACK(gaim_gtk_blist_leave_cb), NULL); |
3530 g_signal_connect(G_OBJECT(gtkblist->treeview), "leave-notify-event", G_CALLBACK(gaim_gtk_blist_leave_cb), NULL); |
| 3471 |
3531 |
| 3472 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(gtkblist->treeview), FALSE); |
3532 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(gtkblist->treeview), FALSE); |
| 3473 |
3533 |
| 3474 column = gtk_tree_view_column_new (); |
3534 gtkblist->text_column = column = gtk_tree_view_column_new (); |
| 3475 |
3535 |
| 3476 rend = gtk_cell_renderer_pixbuf_new(); |
3536 rend = gtk_cell_renderer_pixbuf_new(); |
| 3477 gtk_tree_view_column_pack_start(column, rend, FALSE); |
3537 gtk_tree_view_column_pack_start(column, rend, FALSE); |
| 3478 gtk_tree_view_column_set_attributes(column, rend, |
3538 gtk_tree_view_column_set_attributes(column, rend, |
| 3479 "pixbuf", STATUS_ICON_COLUMN, |
3539 "pixbuf", STATUS_ICON_COLUMN, |
| 3480 "visible", STATUS_ICON_VISIBLE_COLUMN, |
3540 "visible", STATUS_ICON_VISIBLE_COLUMN, |
| 3481 NULL); |
3541 NULL); |
| 3482 g_object_set(rend, "xalign", 0.0, "ypad", 0, NULL); |
3542 g_object_set(rend, "xalign", 0.0, "ypad", 0, NULL); |
| 3483 |
3543 |
| 3484 rend = gtk_cell_renderer_text_new(); |
3544 gtkblist->text_rend = rend = gtk_cell_renderer_text_new(); |
| 3485 gtk_tree_view_column_pack_start (column, rend, TRUE); |
3545 gtk_tree_view_column_pack_start (column, rend, TRUE); |
| 3486 gtk_tree_view_column_set_attributes(column, rend, |
3546 gtk_tree_view_column_set_attributes(column, rend, |
| 3487 "markup", NAME_COLUMN, |
3547 "markup", NAME_COLUMN, |
| 3488 NULL); |
3548 NULL); |
| |
3549 g_signal_connect(G_OBJECT(rend), "edited", G_CALLBACK(gtk_blist_renderer_edited_cb), NULL); |
| |
3550 g_signal_connect(G_OBJECT(rend), "editing-started", G_CALLBACK(gtk_blist_edit_starting), NULL); |
| 3489 g_object_set(rend, "ypad", 0, "yalign", 0.5, NULL); |
3551 g_object_set(rend, "ypad", 0, "yalign", 0.5, NULL); |
| 3490 #if GTK_CHECK_VERSION(2,6,0) |
3552 #if GTK_CHECK_VERSION(2,6,0) |
| 3491 gtk_tree_view_column_set_expand (column, TRUE); |
3553 gtk_tree_view_column_set_expand (column, TRUE); |
| 3492 g_object_set(rend, "ellipsize", PANGO_ELLIPSIZE_END, NULL); |
3554 g_object_set(rend, "ellipsize", PANGO_ELLIPSIZE_END, NULL); |
| 3493 #endif |
3555 #endif |
| 3645 |
3707 |
| 3646 static gboolean get_iter_from_node(GaimBlistNode *node, GtkTreeIter *iter) { |
3708 static gboolean get_iter_from_node(GaimBlistNode *node, GtkTreeIter *iter) { |
| 3647 struct _gaim_gtk_blist_node *gtknode = (struct _gaim_gtk_blist_node *)node->ui_data; |
3709 struct _gaim_gtk_blist_node *gtknode = (struct _gaim_gtk_blist_node *)node->ui_data; |
| 3648 GtkTreePath *path; |
3710 GtkTreePath *path; |
| 3649 |
3711 |
| 3650 /* XXX: why do we assume we have a buddy here? */ |
|
| 3651 if (!gtknode) { |
3712 if (!gtknode) { |
| 3652 #if 0 |
|
| 3653 gaim_debug_error("gtkblist", "buddy %s has no ui_data\n", ((GaimBuddy *)node)->name); |
|
| 3654 #endif |
|
| 3655 return FALSE; |
3713 return FALSE; |
| 3656 } |
3714 } |
| 3657 |
3715 |
| 3658 if (!gtkblist) { |
3716 if (!gtkblist) { |
| 3659 gaim_debug_error("gtkblist", "get_iter_from_node was called, but we don't seem to have a blist\n"); |
3717 gaim_debug_error("gtkblist", "get_iter_from_node was called, but we don't seem to have a blist\n"); |
| 3660 return FALSE; |
3718 return FALSE; |
| 3661 } |
3719 } |
| 3662 |
3720 |
| 3663 if (!gtknode->row) |
3721 if (!gtknode->row) |
| 3664 return FALSE; |
3722 return FALSE; |
| |
3723 |
| 3665 |
3724 |
| 3666 if ((path = gtk_tree_row_reference_get_path(gtknode->row)) == NULL) |
3725 if ((path = gtk_tree_row_reference_get_path(gtknode->row)) == NULL) |
| 3667 return FALSE; |
3726 return FALSE; |
| |
3727 |
| 3668 if (!gtk_tree_model_get_iter(GTK_TREE_MODEL(gtkblist->treemodel), iter, path)) { |
3728 if (!gtk_tree_model_get_iter(GTK_TREE_MODEL(gtkblist->treemodel), iter, path)) { |
| 3669 gtk_tree_path_free(path); |
3729 gtk_tree_path_free(path); |
| 3670 return FALSE; |
3730 return FALSE; |
| 3671 } |
3731 } |
| 3672 gtk_tree_path_free(path); |
3732 gtk_tree_path_free(path); |