comparison src/dialogs.c @ 8317:6f549c1d0829

[gaim-migrate @ 9041] Because I won't be able to work on this until late this week at the earliest, here's GtkIMHtmlToolbar. It's a composite widget that attaches to an editable gtkimhtml and controls all the formatting with ease. All one has to do to get a formattable, editable, gtkimhtml now is to replace a gtktextview with a gtkimhtml (you can even leave all the other calls that control it as gtkimhtml descends from gtktextview) throw one of these toolbars in there and gtk_imhtml_toolbar_attach it to the gtkimhtml. That's what I did in the New Away Message dialog. This would also be nice in gtkrequest.c and gtkpounce.c. Of course, this isn't done and there's a ton of hacky commented out old code in there. Things like keyboard shortcut preferences don't currently work and there's a lot of things I want to move around yet. However, if anyone feels inspired to work on it before I get back to it feel free. Maybe you can IM me beforehand or something. committer: Tailor Script <tailor@pidgin.im>
author Sean Egan <seanegan@gmail.com>
date Mon, 23 Feb 2004 21:18:27 +0000
parents 462ead6fc1a0
children a2c5537a814b
comparison
equal deleted inserted replaced
8316:cf84056fed27 8317:6f549c1d0829
32 #include "util.h" 32 #include "util.h"
33 33
34 #include "gtkblist.h" 34 #include "gtkblist.h"
35 #include "gtkconv.h" 35 #include "gtkconv.h"
36 #include "gtkimhtml.h" 36 #include "gtkimhtml.h"
37 #include "gtkimhtmltoolbar.h"
37 #include "gtkprefs.h" 38 #include "gtkprefs.h"
38 #include "gtkutils.h" 39 #include "gtkutils.h"
39 #include "stock.h" 40 #include "stock.h"
40 41
41 #include "ui.h" 42 #include "ui.h"
55 GaimConnection *gc; 56 GaimConnection *gc;
56 }; 57 };
57 58
58 struct create_away { 59 struct create_away {
59 GtkWidget *window; 60 GtkWidget *window;
61 GtkWidget *toolbar;
60 GtkWidget *entry; 62 GtkWidget *entry;
61 GtkWidget *text; 63 GtkWidget *text;
62 struct away_message *mess; 64 struct away_message *mess;
63 }; 65 };
64 66
110 112
111 object_data = g_object_get_data(G_OBJECT(w), "dialog_type"); 113 object_data = g_object_get_data(G_OBJECT(w), "dialog_type");
112 114
113 gtkconv = GAIM_GTK_CONVERSATION(c); 115 gtkconv = GAIM_GTK_CONVERSATION(c);
114 116
115 if (GTK_IS_COLOR_SELECTION_DIALOG(w)) { 117 /*if (GTK_IS_COLOR_SELECTION_DIALOG(w)) {
116 if (w == gtkconv->dialogs.fg_color) { 118 if (w == gtkconv->dialogs.fg_color) {
117 gtk_toggle_button_set_active( 119 gtk_toggle_button_set_active(
118 GTK_TOGGLE_BUTTON(gtkconv->toolbar.fgcolor), FALSE); 120 GTK_TOGGLE_BUTTON(gtkconv->toolbar.fgcolor), FALSE);
119 gtkconv->dialogs.fg_color = NULL; 121 gtkconv->dialogs.fg_color = NULL;
120 } else { 122 } else {
132 gtkconv->dialogs.smiley = NULL; 134 gtkconv->dialogs.smiley = NULL;
133 } else if (!g_ascii_strcasecmp(object_data, "log dialog")) { 135 } else if (!g_ascii_strcasecmp(object_data, "log dialog")) {
134 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtkconv->toolbar.log), 136 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtkconv->toolbar.log),
135 FALSE); 137 FALSE);
136 gtkconv->dialogs.log = NULL; 138 gtkconv->dialogs.log = NULL;
137 } 139 }*/
138 140
139 dialogwindows = g_list_remove(dialogwindows, w); 141 dialogwindows = g_list_remove(dialogwindows, w);
140 gtk_widget_destroy(w); 142 gtk_widget_destroy(w);
141 143
142 return FALSE; 144 return FALSE;
572 /*------------------------------------------------------*/ 574 /*------------------------------------------------------*/
573 575
574 GtkWidget *fgcseld = NULL; 576 GtkWidget *fgcseld = NULL;
575 GtkWidget *bgcseld = NULL; 577 GtkWidget *bgcseld = NULL;
576 578
577 void cancel_fgcolor(GtkWidget *widget, GaimConversation *c)
578 {
579 GaimGtkConversation *gtkconv;
580
581 gtkconv = GAIM_GTK_CONVERSATION(c);
582
583 if (gtkconv->toolbar.fgcolor && widget) {
584 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gtkconv->toolbar.fgcolor),
585 FALSE);
586 }
587
588 dialogwindows = g_list_remove(dialogwindows, gtkconv->dialogs.fg_color);
589 gtk_widget_destroy(gtkconv->dialogs.fg_color);
590 gtkconv->dialogs.fg_color = NULL;
591 }
592
593 void cancel_bgcolor(GtkWidget *widget, GaimConversation *c)
594 {
595 GaimGtkConversation *gtkconv;
596
597 gtkconv = GAIM_GTK_CONVERSATION(c);
598
599 if (gtkconv->toolbar.bgcolor && widget) {
600 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gtkconv->toolbar.bgcolor),
601 FALSE);
602 }
603
604 dialogwindows = g_list_remove(dialogwindows, gtkconv->dialogs.bg_color);
605 gtk_widget_destroy(gtkconv->dialogs.bg_color);
606 gtkconv->dialogs.bg_color = NULL;
607 }
608
609 void do_fgcolor(GtkWidget *widget, GtkColorSelection *colorsel)
610 {
611 GdkColor text_color;
612 GaimConversation *c;
613 GaimGtkConversation *gtkconv;
614 char *open_tag;
615
616 open_tag = g_malloc(30);
617
618 gtk_color_selection_get_current_color(colorsel, &text_color);
619
620 c = g_object_get_data(G_OBJECT(colorsel), "gaim_conversation");
621 /* GTK_IS_EDITABLE(c->entry); huh? */
622
623 gtkconv = GAIM_GTK_CONVERSATION(c);
624
625 gtkconv->fg_color = text_color;
626 g_snprintf(open_tag, 23, "#%02X%02X%02X",
627 text_color.red / 256,
628 text_color.green / 256,
629 text_color.blue / 256);
630 gtk_imhtml_toggle_forecolor(GTK_IMHTML(gtkconv->entry), open_tag);
631
632 g_free(open_tag);
633 cancel_fgcolor(NULL, c);
634 }
635
636 void do_bgcolor(GtkWidget *widget, GtkColorSelection *colorsel)
637 {
638 GdkColor text_color;
639 GaimConversation *c;
640 GaimGtkConversation *gtkconv;
641 char *open_tag;
642
643 open_tag = g_malloc(30);
644
645 gtk_color_selection_get_current_color(colorsel, &text_color);
646
647 c = g_object_get_data(G_OBJECT(colorsel), "gaim_conversation");
648 /* GTK_IS_EDITABLE(c->entry); huh? */
649
650 gtkconv = GAIM_GTK_CONVERSATION(c);
651
652 gtkconv->bg_color = text_color;
653 g_snprintf(open_tag, 25, "#%02X%02X%02X",
654 text_color.red / 256,
655 text_color.green / 256,
656 text_color.blue / 256);
657 gtk_imhtml_toggle_backcolor(GTK_IMHTML(gtkconv->entry), open_tag);
658
659 g_free(open_tag);
660 cancel_bgcolor(NULL, c);
661 }
662
663 void show_fgcolor_dialog(GaimConversation *c, GtkWidget *color) 579 void show_fgcolor_dialog(GaimConversation *c, GtkWidget *color)
664 { 580 {
665 GaimGtkConversation *gtkconv; 581 GaimGtkConversation *gtkconv;
666 GtkWidget *colorsel; 582 GtkWidget *colorsel;
667 GdkColor fgcolor; 583 GdkColor fgcolor;
669 gtkconv = GAIM_GTK_CONVERSATION(c); 585 gtkconv = GAIM_GTK_CONVERSATION(c);
670 586
671 gdk_color_parse(gaim_prefs_get_string("/gaim/gtk/conversations/fgcolor"), 587 gdk_color_parse(gaim_prefs_get_string("/gaim/gtk/conversations/fgcolor"),
672 &fgcolor); 588 &fgcolor);
673 589
674 if (color == NULL) { /* we came from the prefs */ 590 if (fgcseld)
675 if (fgcseld) 591 return;
676 return; 592
677 593 fgcseld = gtk_color_selection_dialog_new(_("Select Text Color"));
678 fgcseld = gtk_color_selection_dialog_new(_("Select Text Color")); 594 gtk_color_selection_set_current_color(GTK_COLOR_SELECTION
679 gtk_color_selection_set_current_color(GTK_COLOR_SELECTION
680 (GTK_COLOR_SELECTION_DIALOG(fgcseld)->colorsel), &fgcolor); 595 (GTK_COLOR_SELECTION_DIALOG(fgcseld)->colorsel), &fgcolor);
681 g_signal_connect(G_OBJECT(fgcseld), "delete_event", 596 g_signal_connect(G_OBJECT(fgcseld), "delete_event",
682 G_CALLBACK(destroy_colorsel), (void *)1); 597 G_CALLBACK(destroy_colorsel), (void *)1);
683 g_signal_connect(G_OBJECT(GTK_COLOR_SELECTION_DIALOG(fgcseld)->cancel_button), 598 g_signal_connect(G_OBJECT(GTK_COLOR_SELECTION_DIALOG(fgcseld)->cancel_button),
684 "clicked", G_CALLBACK(destroy_colorsel), (void *)1); 599 "clicked", G_CALLBACK(destroy_colorsel), (void *)1);
685 g_signal_connect(G_OBJECT(GTK_COLOR_SELECTION_DIALOG(fgcseld)->ok_button), "clicked", 600 g_signal_connect(G_OBJECT(GTK_COLOR_SELECTION_DIALOG(fgcseld)->ok_button), "clicked",
686 G_CALLBACK(apply_color_dlg), (void *)1); 601 G_CALLBACK(apply_color_dlg), (void *)1);
687 gtk_widget_realize(fgcseld); 602 gtk_widget_realize(fgcseld);
688 gtk_widget_show(fgcseld); 603 gtk_widget_show(fgcseld);
689 gdk_window_raise(fgcseld->window); 604 gdk_window_raise(fgcseld->window);
690 return; 605 return;
691 }
692
693 if (!gtkconv->dialogs.fg_color) {
694
695 gtkconv->dialogs.fg_color = gtk_color_selection_dialog_new(_("Select Text Color"));
696 colorsel = GTK_COLOR_SELECTION_DIALOG(gtkconv->dialogs.fg_color)->colorsel;
697 gtk_color_selection_set_current_color(GTK_COLOR_SELECTION(colorsel), &fgcolor);
698 g_object_set_data(G_OBJECT(colorsel), "gaim_conversation", c);
699
700 g_signal_connect(G_OBJECT(gtkconv->dialogs.fg_color), "delete_event",
701 G_CALLBACK(delete_event_dialog), c);
702 g_signal_connect(G_OBJECT(GTK_COLOR_SELECTION_DIALOG(gtkconv->dialogs.fg_color)->ok_button),
703 "clicked", G_CALLBACK(do_fgcolor), colorsel);
704 g_signal_connect(G_OBJECT
705 (GTK_COLOR_SELECTION_DIALOG(gtkconv->dialogs.fg_color)->cancel_button),
706 "clicked", G_CALLBACK(cancel_fgcolor), c);
707
708 gtk_widget_realize(gtkconv->dialogs.fg_color);
709 }
710
711 gtk_widget_show(gtkconv->dialogs.fg_color);
712 gdk_window_raise(gtkconv->dialogs.fg_color->window);
713 } 606 }
714 607
715 void show_bgcolor_dialog(GaimConversation *c, GtkWidget *color) 608 void show_bgcolor_dialog(GaimConversation *c, GtkWidget *color)
716 { 609 {
717 GaimGtkConversation *gtkconv; 610 GaimGtkConversation *gtkconv;
721 gtkconv = GAIM_GTK_CONVERSATION(c); 614 gtkconv = GAIM_GTK_CONVERSATION(c);
722 615
723 gdk_color_parse(gaim_prefs_get_string("/gaim/gtk/conversations/bgcolor"), 616 gdk_color_parse(gaim_prefs_get_string("/gaim/gtk/conversations/bgcolor"),
724 &bgcolor); 617 &bgcolor);
725 618
726 if (color == NULL) { /* we came from the prefs */ 619 if (bgcseld)
727 if (bgcseld) 620 return;
728 return; 621
729 622 bgcseld = gtk_color_selection_dialog_new(_("Select Background Color"));
730 bgcseld = gtk_color_selection_dialog_new(_("Select Background Color")); 623 gtk_color_selection_set_current_color(GTK_COLOR_SELECTION
731 gtk_color_selection_set_current_color(GTK_COLOR_SELECTION
732 (GTK_COLOR_SELECTION_DIALOG(bgcseld)->colorsel), &bgcolor); 624 (GTK_COLOR_SELECTION_DIALOG(bgcseld)->colorsel), &bgcolor);
733 g_signal_connect(G_OBJECT(bgcseld), "delete_event", 625 g_signal_connect(G_OBJECT(bgcseld), "delete_event",
734 G_CALLBACK(destroy_colorsel), NULL); 626 G_CALLBACK(destroy_colorsel), NULL);
735 g_signal_connect(G_OBJECT(GTK_COLOR_SELECTION_DIALOG(bgcseld)->cancel_button), 627 g_signal_connect(G_OBJECT(GTK_COLOR_SELECTION_DIALOG(bgcseld)->cancel_button),
736 "clicked", G_CALLBACK(destroy_colorsel), NULL); 628 "clicked", G_CALLBACK(destroy_colorsel), NULL);
737 g_signal_connect(G_OBJECT(GTK_COLOR_SELECTION_DIALOG(bgcseld)->ok_button), "clicked", 629 g_signal_connect(G_OBJECT(GTK_COLOR_SELECTION_DIALOG(bgcseld)->ok_button), "clicked",
738 G_CALLBACK(apply_color_dlg), (void *)2); 630 G_CALLBACK(apply_color_dlg), (void *)2);
739 gtk_widget_realize(bgcseld); 631 gtk_widget_realize(bgcseld);
740 gtk_widget_show(bgcseld); 632 gtk_widget_show(bgcseld);
741 gdk_window_raise(bgcseld->window); 633 gdk_window_raise(bgcseld->window);
742 return; 634 return;
743 } 635 }
744 636
745 if (!gtkconv->dialogs.bg_color) { 637
746 638 /*------------------------ ----------------------------------------------*/
747 gtkconv->dialogs.bg_color = gtk_color_selection_dialog_new(_("Select Background Color"));
748 colorsel = GTK_COLOR_SELECTION_DIALOG(gtkconv->dialogs.bg_color)->colorsel;
749 gtk_color_selection_set_current_color(GTK_COLOR_SELECTION(colorsel), &bgcolor);
750 g_object_set_data(G_OBJECT(colorsel), "gaim_conversation", c);
751
752 g_signal_connect(G_OBJECT(gtkconv->dialogs.bg_color), "delete_event",
753 G_CALLBACK(delete_event_dialog), c);
754 g_signal_connect(G_OBJECT(GTK_COLOR_SELECTION_DIALOG(gtkconv->dialogs.bg_color)->ok_button),
755 "clicked", G_CALLBACK(do_bgcolor), colorsel);
756 g_signal_connect(G_OBJECT
757 (GTK_COLOR_SELECTION_DIALOG(gtkconv->dialogs.bg_color)->cancel_button),
758 "clicked", G_CALLBACK(cancel_bgcolor), c);
759
760 gtk_widget_realize(gtkconv->dialogs.bg_color);
761 }
762
763 gtk_widget_show(gtkconv->dialogs.bg_color);
764 gdk_window_raise(gtkconv->dialogs.bg_color->window);
765 }
766
767 /*------------------------------------------------------------------------*/
768 /* Font Selection Dialog */ 639 /* Font Selection Dialog */
769 /*------------------------------------------------------------------------*/ 640 /*------------------------------------------------------------------------*/
770 641
771 void cancel_font(GtkWidget *widget, GaimConversation *c)
772 {
773 GaimGtkConversation *gtkconv;
774
775 gtkconv = GAIM_GTK_CONVERSATION(c);
776
777 if (gtkconv->toolbar.font && widget) {
778 gtk_toggle_button_set_active(
779 GTK_TOGGLE_BUTTON(gtkconv->toolbar.font), FALSE);
780 }
781
782 if (gtkconv->dialogs.font) {
783 dialogwindows = g_list_remove(dialogwindows, gtkconv->dialogs.font);
784 gtk_widget_destroy(gtkconv->dialogs.font);
785 gtkconv->dialogs.font = NULL;
786 }
787 }
788
789 void apply_font(GtkWidget *widget, GtkFontSelection *fontsel)
790 {
791 /* this could be expanded to include font size, weight, etc.
792 but for now only works with font face */
793 char *fontname;
794 char *space;
795 GaimConversation *c = g_object_get_data(G_OBJECT(fontsel),
796 "gaim_conversation");
797
798 if(!c)
799 return;
800
801 fontname = gtk_font_selection_dialog_get_font_name(GTK_FONT_SELECTION_DIALOG(fontsel));
802
803 space = strrchr(fontname, ' ');
804 if(space && isdigit(*(space+1)))
805 *space = '\0';
806
807 gaim_gtk_set_font_face(GAIM_GTK_CONVERSATION(c), fontname);
808
809 g_free(fontname);
810
811 cancel_font(NULL, c);
812 }
813 642
814 void destroy_fontsel(GtkWidget *w, gpointer d) 643 void destroy_fontsel(GtkWidget *w, gpointer d)
815 { 644 {
816 gtk_widget_destroy(fontseld); 645 gtk_widget_destroy(fontseld);
817 fontseld = NULL; 646 fontseld = NULL;
823 char fonttif[128]; 652 char fonttif[128];
824 const char *fontface; 653 const char *fontface;
825 654
826 gtkconv = GAIM_GTK_CONVERSATION(c); 655 gtkconv = GAIM_GTK_CONVERSATION(c);
827 656
828 if (!font) { /* we came from the prefs dialog */ 657
829 if (fontseld) 658 if (fontseld)
830 return;
831
832 fontseld = gtk_font_selection_dialog_new(_("Select Font"));
833
834 fontface = gaim_prefs_get_string("/gaim/gtk/conversations/font_face");
835
836 if (fontface != NULL && *fontface != '\0') {
837 g_snprintf(fonttif, sizeof(fonttif), "%s 12", fontface);
838 gtk_font_selection_dialog_set_font_name(GTK_FONT_SELECTION_DIALOG(fontseld),
839 fonttif);
840 } else {
841 gtk_font_selection_dialog_set_font_name(GTK_FONT_SELECTION_DIALOG(fontseld),
842 DEFAULT_FONT_FACE " 12");
843 }
844
845 g_signal_connect(G_OBJECT(fontseld), "delete_event",
846 G_CALLBACK(destroy_fontsel), NULL);
847 g_signal_connect(G_OBJECT(GTK_FONT_SELECTION_DIALOG(fontseld)->cancel_button),
848 "clicked", G_CALLBACK(destroy_fontsel), NULL);
849 g_signal_connect(G_OBJECT(GTK_FONT_SELECTION_DIALOG(fontseld)->ok_button), "clicked",
850 G_CALLBACK(apply_font_dlg), fontseld);
851 gtk_widget_realize(fontseld);
852 gtk_widget_show(fontseld);
853 gdk_window_raise(fontseld->window);
854 return; 659 return;
660
661 fontseld = gtk_font_selection_dialog_new(_("Select Font"));
662
663 fontface = gaim_prefs_get_string("/gaim/gtk/conversations/font_face");
664
665 if (fontface != NULL && *fontface != '\0') {
666 g_snprintf(fonttif, sizeof(fonttif), "%s 12", fontface);
667 gtk_font_selection_dialog_set_font_name(GTK_FONT_SELECTION_DIALOG(fontseld),
668 fonttif);
669 } else {
670 gtk_font_selection_dialog_set_font_name(GTK_FONT_SELECTION_DIALOG(fontseld),
671 DEFAULT_FONT_FACE " 12");
855 } 672 }
856 673
857 if (!gtkconv->dialogs.font) { 674 g_signal_connect(G_OBJECT(fontseld), "delete_event",
858 gtkconv->dialogs.font = gtk_font_selection_dialog_new(_("Select Font")); 675 G_CALLBACK(destroy_fontsel), NULL);
859 676 g_signal_connect(G_OBJECT(GTK_FONT_SELECTION_DIALOG(fontseld)->cancel_button),
860 g_object_set_data(G_OBJECT(gtkconv->dialogs.font), "gaim_conversation", c); 677 "clicked", G_CALLBACK(destroy_fontsel), NULL);
861 678 g_signal_connect(G_OBJECT(GTK_FONT_SELECTION_DIALOG(fontseld)->ok_button), "clicked",
862 if (gtkconv->fontface[0]) { 679 G_CALLBACK(apply_font_dlg), fontseld);
863 g_snprintf(fonttif, sizeof(fonttif), "%s 12", gtkconv->fontface); 680 gtk_widget_realize(fontseld);
864 gtk_font_selection_dialog_set_font_name(GTK_FONT_SELECTION_DIALOG(gtkconv->dialogs.font), 681 gtk_widget_show(fontseld);
865 fonttif); 682 gdk_window_raise(fontseld->window);
866 } else { 683 return;
867 gtk_font_selection_dialog_set_font_name(GTK_FONT_SELECTION_DIALOG(gtkconv->dialogs.font), 684
868 DEFAULT_FONT_FACE);
869 }
870
871 g_signal_connect(G_OBJECT(gtkconv->dialogs.font), "delete_event",
872 G_CALLBACK(delete_event_dialog), c);
873 g_signal_connect(G_OBJECT(GTK_FONT_SELECTION_DIALOG(gtkconv->dialogs.font)->ok_button),
874 "clicked", G_CALLBACK(apply_font), gtkconv->dialogs.font);
875 g_signal_connect(G_OBJECT(GTK_FONT_SELECTION_DIALOG(gtkconv->dialogs.font)->cancel_button),
876 "clicked", G_CALLBACK(cancel_font), c);
877
878 gtk_widget_realize(gtkconv->dialogs.font);
879
880 }
881
882 gtk_widget_show(gtkconv->dialogs.font);
883 gdk_window_raise(gtkconv->dialogs.font->window);
884 } 685 }
885 686
886 /*------------------------------------------------------------------------*/ 687 /*------------------------------------------------------------------------*/
887 /* The dialog for new away messages */ 688 /* The dialog for new away messages */
888 /*------------------------------------------------------------------------*/ 689 /*------------------------------------------------------------------------*/
897 else { 698 else {
898 am = ca->mess; 699 am = ca->mess;
899 } 700 }
900 701
901 g_snprintf(am->name, sizeof(am->name), "%s", gtk_entry_get_text(GTK_ENTRY(ca->entry))); 702 g_snprintf(am->name, sizeof(am->name), "%s", gtk_entry_get_text(GTK_ENTRY(ca->entry)));
902 away_message = gtk_text_view_get_text(GTK_TEXT_VIEW(ca->text), FALSE); 703 away_message = gtk_imhtml_get_markup(GTK_IMHTML(ca->text));
903 704
904 g_snprintf(am->message, sizeof(am->message), "%s", away_message); 705 g_snprintf(am->message, sizeof(am->message), "%s", away_message);
905 g_free(away_message); 706 g_free(away_message);
906 707
907 if (!ca->mess) 708 if (!ca->mess)
924 _("Please give the message a title, or choose " 725 _("Please give the message a title, or choose "
925 "\"Use\" to use without saving.")); 726 "\"Use\" to use without saving."));
926 return 0; 727 return 0;
927 } 728 }
928 729
929 msg = gtk_text_view_get_text(GTK_TEXT_VIEW(ca->text), FALSE); 730 msg = gtk_imhtml_get_markup(GTK_IMHTML(ca->text));
930 731
931 if (!msg && (type <= 1)) { 732 if (!msg && (type <= 1)) {
932 /* We shouldn't allow a blank message */ 733 /* We shouldn't allow a blank message */
933 gaim_notify_error(NULL, NULL, 734 gaim_notify_error(NULL, NULL,
934 _("You cannot create an empty away message"), NULL); 735 _("You cannot create an empty away message"), NULL);
957 758
958 if (!check_away_mess(ca, 0)) 759 if (!check_away_mess(ca, 0))
959 return; 760 return;
960 761
961 g_snprintf(am.name, sizeof(am.name), "%s", gtk_entry_get_text(GTK_ENTRY(ca->entry))); 762 g_snprintf(am.name, sizeof(am.name), "%s", gtk_entry_get_text(GTK_ENTRY(ca->entry)));
962 away_message = gtk_text_view_get_text(GTK_TEXT_VIEW(ca->text), FALSE); 763 away_message = gtk_imhtml_get_markup(GTK_IMHTML(ca->text));
963 764
964 g_snprintf(am.message, sizeof(am.message), "%s", away_message); 765 g_snprintf(am.message, sizeof(am.message), "%s", away_message);
965 g_free(away_message); 766 g_free(away_message);
966 767
967 do_away_message(NULL, &am); 768 do_away_message(NULL, &am);
1020 ca->entry = gtk_entry_new(); 821 ca->entry = gtk_entry_new();
1021 gtk_box_pack_start(GTK_BOX(hbox), ca->entry, TRUE, TRUE, 0); 822 gtk_box_pack_start(GTK_BOX(hbox), ca->entry, TRUE, TRUE, 0);
1022 gaim_set_accessible_label (ca->entry, label); 823 gaim_set_accessible_label (ca->entry, label);
1023 gtk_widget_grab_focus(ca->entry); 824 gtk_widget_grab_focus(ca->entry);
1024 825
826 /* Toolbar */
827 ca->toolbar = gtk_imhtmltoolbar_new();
828 gtk_box_pack_start(GTK_BOX(vbox), ca->toolbar, FALSE, FALSE, 0);
829
1025 /* Away message text */ 830 /* Away message text */
1026 sw = gtk_scrolled_window_new(NULL, NULL); 831 sw = gtk_scrolled_window_new(NULL, NULL);
1027 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), 832 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw),
1028 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); 833 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
1029 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw), GTK_SHADOW_IN); 834 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw), GTK_SHADOW_IN);
1030 gtk_box_pack_start(GTK_BOX(vbox), sw, TRUE, TRUE, 0); 835 gtk_box_pack_start(GTK_BOX(vbox), sw, TRUE, TRUE, 0);
1031 836
1032 ca->text = gtk_text_view_new(); 837 ca->text = gtk_imhtml_new(NULL, NULL);
838 gtk_imhtml_set_editable(ca->text, TRUE);
1033 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(ca->text), GTK_WRAP_WORD_CHAR); 839 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(ca->text), GTK_WRAP_WORD_CHAR);
1034 840
1035 if (gaim_prefs_get_bool("/gaim/gtk/conversations/spellcheck")) 841 if (gaim_prefs_get_bool("/gaim/gtk/conversations/spellcheck"))
1036 gaim_gtk_setup_gtkspell(GTK_TEXT_VIEW(ca->text)); 842 gaim_gtk_setup_gtkspell(GTK_TEXT_VIEW(ca->text));
843 gtk_imhtmltoolbar_attach(GTK_IMHTMLTOOLBAR(ca->toolbar), ca->text);
1037 844
1038 gtk_container_add(GTK_CONTAINER(sw), ca->text); 845 gtk_container_add(GTK_CONTAINER(sw), ca->text);
1039 846
1040 if (dummy) { 847 if (dummy) {
1041 struct away_message *amt; 848 struct away_message *amt;
1050 if (! gtk_tree_selection_get_selected (sel, (GtkTreeModel**)&ls, &iter)) 857 if (! gtk_tree_selection_get_selected (sel, (GtkTreeModel**)&ls, &iter))
1051 return; 858 return;
1052 gtk_tree_model_get_value (GTK_TREE_MODEL(ls), &iter, 1, &val); 859 gtk_tree_model_get_value (GTK_TREE_MODEL(ls), &iter, 1, &val);
1053 amt = g_value_get_pointer (&val); 860 amt = g_value_get_pointer (&val);
1054 gtk_entry_set_text(GTK_ENTRY(ca->entry), amt->name); 861 gtk_entry_set_text(GTK_ENTRY(ca->entry), amt->name);
1055 buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(ca->text)); 862 gtk_imhtml_append_text_with_images(GTK_IMHTML(ca->text), amt->message, 0, NULL);
1056 gtk_text_buffer_get_iter_at_offset(buffer, &start, pos);
1057 gtk_text_buffer_insert(buffer, &start, amt->message, strlen(amt->message));
1058
1059 ca->mess = amt; 863 ca->mess = amt;
1060 } 864 }
1061 865
1062 hbox = gtk_hbox_new(FALSE, 5); 866 hbox = gtk_hbox_new(FALSE, 5);
1063 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); 867 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
1077 button = gaim_pixbuf_button_from_stock(_("Cancel"), GTK_STOCK_CANCEL, GAIM_BUTTON_HORIZONTAL); 881 button = gaim_pixbuf_button_from_stock(_("Cancel"), GTK_STOCK_CANCEL, GAIM_BUTTON_HORIZONTAL);
1078 g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(destroy_dialog), ca->window); 882 g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(destroy_dialog), ca->window);
1079 gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0); 883 gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);
1080 884
1081 gtk_widget_show_all(ca->window); 885 gtk_widget_show_all(ca->window);
1082 }
1083
1084 /* smiley dialog */
1085
1086 void close_smiley_dialog(GtkWidget *widget, GaimConversation *c)
1087 {
1088 GaimGtkConversation *gtkconv;
1089
1090 gtkconv = GAIM_GTK_CONVERSATION(c);
1091
1092 if (gtkconv->toolbar.smiley) {
1093 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gtkconv->toolbar.smiley),
1094 FALSE);
1095 }
1096 if(gtkconv->dialogs.smiley) {
1097 dialogwindows = g_list_remove(dialogwindows, gtkconv->dialogs.smiley);
1098 gtk_widget_destroy(gtkconv->dialogs.smiley);
1099 gtkconv->dialogs.smiley = NULL;
1100 }
1101 }
1102
1103 void insert_smiley_text(GtkWidget *widget, GaimConversation *c)
1104 {
1105 GaimGtkConversation *gtkconv;
1106 char *smiley_text = g_object_get_data(G_OBJECT(widget), "smiley_text");
1107 GaimPlugin *proto = gaim_find_prpl(gaim_account_get_protocol_id(gaim_conversation_get_account(c)));
1108
1109 gtkconv = GAIM_GTK_CONVERSATION(c);
1110
1111 gtk_imhtml_insert_smiley(GTK_IMHTML(gtkconv->entry), proto->info->name, smiley_text);
1112
1113 close_smiley_dialog(NULL, c);
1114 }
1115
1116 static void add_smiley(GaimConversation *c, GtkWidget *table, int row, int col, char *filename, char *face)
1117 {
1118 GtkWidget *image;
1119 GtkWidget *button;
1120 GaimGtkConversation *gtkconv = GAIM_GTK_CONVERSATION(c);
1121
1122 image = gtk_image_new_from_file(filename);
1123 button = gtk_button_new();
1124 gtk_container_add(GTK_CONTAINER(button), image);
1125 g_object_set_data(G_OBJECT(button), "smiley_text", face);
1126 g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(insert_smiley_text), c);
1127
1128 gtk_tooltips_set_tip(gtkconv->tooltips, button, face, NULL);
1129
1130 gtk_table_attach_defaults(GTK_TABLE(table), button, col, col+1, row, row+1);
1131
1132 /* these look really weird with borders */
1133 gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE);
1134
1135 gtk_widget_show(button);
1136 }
1137
1138 static gboolean smiley_is_unique(GSList *list, GtkIMHtmlSmiley *smiley) {
1139 while(list) {
1140 GtkIMHtmlSmiley *cur = list->data;
1141 if(!strcmp(cur->file, smiley->file))
1142 return FALSE;
1143 list = list->next;
1144 }
1145 return TRUE;
1146 }
1147
1148 void show_smiley_dialog(GaimConversation *c, GtkWidget *widget)
1149 {
1150 GaimGtkConversation *gtkconv;
1151 GtkWidget *dialog;
1152 GtkWidget *smiley_table = NULL;
1153 GSList *smileys, *unique_smileys = NULL;
1154 int width;
1155 int row = 0, col = 0;
1156
1157 gtkconv = GAIM_GTK_CONVERSATION(c);
1158
1159 if (gtkconv->dialogs.smiley)
1160 return;
1161
1162 if(c->account)
1163 smileys = get_proto_smileys(
1164 gaim_account_get_protocol_id(gaim_conversation_get_account(c)));
1165 else
1166 smileys = get_proto_smileys(GAIM_PROTO_DEFAULT);
1167
1168 while(smileys) {
1169 GtkIMHtmlSmiley *smiley = smileys->data;
1170 if(!smiley->hidden) {
1171 if(smiley_is_unique(unique_smileys, smiley))
1172 unique_smileys = g_slist_append(unique_smileys, smiley);
1173 }
1174 smileys = smileys->next;
1175 }
1176
1177
1178 width = floor(sqrt(g_slist_length(unique_smileys)));
1179
1180 GAIM_DIALOG(dialog);
1181 gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE);
1182 gtk_window_set_role(GTK_WINDOW(dialog), "smiley_dialog");
1183 gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_MOUSE);
1184
1185 smiley_table = gtk_table_new(width, width, TRUE);
1186
1187 /* pack buttons */
1188
1189 while(unique_smileys) {
1190 GtkIMHtmlSmiley *smiley = unique_smileys->data;
1191 if(!smiley->hidden) {
1192 add_smiley(c, smiley_table, row, col, smiley->file, smiley->smile);
1193 if(++col >= width) {
1194 col = 0;
1195 row++;
1196 }
1197 }
1198 unique_smileys = unique_smileys->next;
1199 }
1200
1201 gtk_container_add(GTK_CONTAINER(dialog), smiley_table);
1202
1203 gtk_widget_show(smiley_table);
1204
1205 gtk_container_set_border_width(GTK_CONTAINER(dialog), 5);
1206
1207 /* connect signals */
1208 g_object_set_data(G_OBJECT(dialog), "dialog_type", "smiley dialog");
1209 g_signal_connect(G_OBJECT(dialog), "delete_event",
1210 G_CALLBACK(delete_event_dialog), c);
1211
1212 /* show everything */
1213 gtk_window_set_title(GTK_WINDOW(dialog), _("Smile!"));
1214 gtk_widget_show_all(dialog);
1215
1216 gtkconv->dialogs.smiley = dialog;
1217
1218 return;
1219 } 886 }
1220 887
1221 static void 888 static void
1222 alias_chat_cb(GaimChat *chat, const char *new_alias) 889 alias_chat_cb(GaimChat *chat, const char *new_alias)
1223 { 890 {