pidgin/gtkimhtmltoolbar.c

changeset 19761
a9f07315cf37
parent 19719
446e97aca498
child 19859
71d37b57eff2
equal deleted inserted replaced
19760:4cb74c61d57a 19761:a9f07315cf37
26 #include "internal.h" 26 #include "internal.h"
27 #include "pidgin.h" 27 #include "pidgin.h"
28 28
29 #include "imgstore.h" 29 #include "imgstore.h"
30 #include "notify.h" 30 #include "notify.h"
31 #include "prefs.h"
31 #include "request.h" 32 #include "request.h"
32 #include "pidginstock.h" 33 #include "pidginstock.h"
33 #include "util.h" 34 #include "util.h"
34 35
35 #include "gtkdialogs.h" 36 #include "gtkdialogs.h"
1019 gtk_widget_destroy(menu); 1020 gtk_widget_destroy(menu);
1020 menu = g_object_get_data(object, "insert_menu"); 1021 menu = g_object_get_data(object, "insert_menu");
1021 if (menu) 1022 if (menu)
1022 gtk_widget_destroy(menu); 1023 gtk_widget_destroy(menu);
1023 1024
1025 purple_prefs_disconnect_by_handle(object);
1026
1024 G_OBJECT_CLASS(parent_class)->finalize (object); 1027 G_OBJECT_CLASS(parent_class)->finalize (object);
1028 }
1029
1030 static void
1031 switch_toolbar_view(GtkWidget *item, GtkIMHtmlToolbar *toolbar)
1032 {
1033 purple_prefs_set_bool(PIDGIN_PREFS_ROOT "/conversations/toolbar/wide",
1034 !purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/conversations/toolbar/wide"));
1035 }
1036
1037 static gboolean
1038 gtk_imhtmltoolbar_popup_menu(GtkWidget *widget, GdkEventButton *event, GtkIMHtmlToolbar *toolbar)
1039 {
1040 GtkWidget *menu;
1041 GtkWidget *item;
1042 gboolean wide;
1043
1044 if (event->button != 3)
1045 return FALSE;
1046
1047 wide = GTK_WIDGET_VISIBLE(toolbar->bold);
1048
1049 menu = gtk_menu_new();
1050 item = gtk_menu_item_new_with_mnemonic(wide ? _("Group Items") : _("Ungroup Items"));
1051 g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(switch_toolbar_view), toolbar);
1052 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
1053 gtk_widget_show(item);
1054
1055 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, pidgin_menu_position_func_helper,
1056 widget, event->button, event->time);
1057 return TRUE;
1025 } 1058 }
1026 1059
1027 /* Boring GTK+ stuff */ 1060 /* Boring GTK+ stuff */
1028 static void gtk_imhtmltoolbar_class_init (GtkIMHtmlToolbarClass *class) 1061 static void gtk_imhtmltoolbar_class_init (GtkIMHtmlToolbarClass *class)
1029 { 1062 {
1031 GObjectClass *gobject_class; 1064 GObjectClass *gobject_class;
1032 object_class = (GtkObjectClass*) class; 1065 object_class = (GtkObjectClass*) class;
1033 gobject_class = (GObjectClass*) class; 1066 gobject_class = (GObjectClass*) class;
1034 parent_class = gtk_type_class(GTK_TYPE_HBOX); 1067 parent_class = gtk_type_class(GTK_TYPE_HBOX);
1035 gobject_class->finalize = gtk_imhtmltoolbar_finalize; 1068 gobject_class->finalize = gtk_imhtmltoolbar_finalize;
1069
1070 purple_prefs_add_none(PIDGIN_PREFS_ROOT "/conversations/toolbar");
1071 purple_prefs_add_bool(PIDGIN_PREFS_ROOT "/conversations/toolbar/wide", FALSE);
1036 } 1072 }
1037 1073
1038 static void gtk_imhtmltoolbar_create_old_buttons(GtkIMHtmlToolbar *toolbar) 1074 static void gtk_imhtmltoolbar_create_old_buttons(GtkIMHtmlToolbar *toolbar)
1039 { 1075 {
1076 GtkWidget *hbox;
1040 GtkWidget *button; 1077 GtkWidget *button;
1041 /* Bold */ 1078 struct {
1042 button = pidgin_pixbuf_toolbar_button_from_stock(GTK_STOCK_BOLD); 1079 char *stock;
1043 g_signal_connect(G_OBJECT(button), "clicked", 1080 gpointer callback;
1044 G_CALLBACK(do_bold), toolbar); 1081 GtkWidget **button;
1045 toolbar->bold = button; 1082 const char *tooltip;
1046 1083 } buttons[] = {
1047 1084 {GTK_STOCK_BOLD, G_CALLBACK(do_bold), &toolbar->bold, _("Bold")},
1048 /* Italic */ 1085 {GTK_STOCK_ITALIC, do_italic, &toolbar->italic, _("Italic")},
1049 button = pidgin_pixbuf_toolbar_button_from_stock(GTK_STOCK_ITALIC); 1086 {GTK_STOCK_UNDERLINE, do_underline, &toolbar->underline, _("Underline")},
1050 g_signal_connect(G_OBJECT(button), "clicked", 1087 {GTK_STOCK_STRIKETHROUGH, do_strikethrough, &toolbar->strikethrough, _("Strikethrough")},
1051 G_CALLBACK(do_italic), toolbar); 1088 {"", NULL, NULL, NULL},
1052 toolbar->italic = button; 1089 {PIDGIN_STOCK_TOOLBAR_TEXT_LARGER, do_big, &toolbar->larger_size, _("Increase Font Size")},
1053 1090 {PIDGIN_STOCK_TOOLBAR_TEXT_SMALLER, do_small, &toolbar->smaller_size, _("Decrease Font Size")},
1054 /* Underline */ 1091 {"", NULL, NULL, NULL},
1055 button = pidgin_pixbuf_toolbar_button_from_stock(GTK_STOCK_UNDERLINE); 1092 {PIDGIN_STOCK_TOOLBAR_FONT_FACE, toggle_font, &toolbar->font, _("Font Face")},
1056 g_signal_connect(G_OBJECT(button), "clicked", 1093 {PIDGIN_STOCK_TOOLBAR_FGCOLOR, toggle_bg_color, &toolbar->bgcolor, _("Background Color")},
1057 G_CALLBACK(do_underline), toolbar); 1094 {PIDGIN_STOCK_TOOLBAR_BGCOLOR, toggle_fg_color, &toolbar->fgcolor, _("Foreground Color")},
1058 toolbar->underline = button; 1095 {"", NULL, NULL, NULL},
1059 1096 {PIDGIN_STOCK_CLEAR, clear_formatting_cb, &toolbar->clear, _("Reset Formatting")},
1060 1097 {"", NULL, NULL, NULL},
1061 /* Strikethrough */ 1098 {PIDGIN_STOCK_TOOLBAR_INSERT_LINK, insert_link_cb, &toolbar->link, _("Insert Link")},
1062 button = pidgin_pixbuf_toolbar_button_from_stock(GTK_STOCK_STRIKETHROUGH); 1099 {PIDGIN_STOCK_TOOLBAR_INSERT_IMAGE, insert_image_cb, &toolbar->image, _("Insert IM Image")},
1063 g_signal_connect(G_OBJECT(button), "clicked", 1100 {PIDGIN_STOCK_TOOLBAR_SMILEY, insert_smiley_cb, &toolbar->smiley, _("Insert Smiley")},
1064 G_CALLBACK(do_strikethrough), toolbar); 1101 {NULL, NULL, NULL, NULL}
1065 toolbar->strikethrough = button; 1102 };
1066 1103 int iter;
1067 /* Increase font size */ 1104
1068 button = pidgin_pixbuf_toolbar_button_from_stock(PIDGIN_STOCK_TOOLBAR_TEXT_LARGER); 1105 hbox = gtk_hbox_new(FALSE, 0);
1069 g_signal_connect(G_OBJECT(button), "clicked", 1106
1070 G_CALLBACK(do_big), toolbar); 1107 for (iter = 0; buttons[iter].stock; iter++) {
1071 toolbar->larger_size = button; 1108 if (buttons[iter].stock[0]) {
1072 1109 button = pidgin_pixbuf_toolbar_button_from_stock(buttons[iter].stock);
1073 /* Decrease font size */ 1110 g_signal_connect(G_OBJECT(button), "clicked",
1074 button = pidgin_pixbuf_toolbar_button_from_stock(PIDGIN_STOCK_TOOLBAR_TEXT_SMALLER); 1111 G_CALLBACK(buttons[iter].callback), toolbar);
1075 g_signal_connect(G_OBJECT(button), "clicked", 1112 *(buttons[iter].button) = button;
1076 G_CALLBACK(do_small), toolbar); 1113 gtk_tooltips_set_tip(toolbar->tooltips, button, buttons[iter].tooltip, NULL);
1077 toolbar->smaller_size = button; 1114 } else
1078 1115 button = gtk_vseparator_new();
1079 /* Font Face */ 1116 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
1080 1117 }
1081 button = pidgin_pixbuf_toolbar_button_from_stock(PIDGIN_STOCK_TOOLBAR_FONT_FACE); 1118
1082 g_signal_connect(G_OBJECT(button), "clicked", 1119 gtk_box_pack_start(GTK_BOX(toolbar), hbox, FALSE, FALSE, 0);
1083 G_CALLBACK(toggle_font), toolbar); 1120 g_object_set_data(G_OBJECT(toolbar), "wide-view", hbox);
1084 toolbar->font = button;
1085
1086 /* Foreground Color */
1087 button = pidgin_pixbuf_toolbar_button_from_stock(PIDGIN_STOCK_TOOLBAR_FGCOLOR);
1088 g_signal_connect(G_OBJECT(button), "clicked",
1089 G_CALLBACK(toggle_fg_color), toolbar);
1090 toolbar->fgcolor = button;
1091
1092 /* Background Color */
1093 button = pidgin_pixbuf_toolbar_button_from_stock(PIDGIN_STOCK_TOOLBAR_BGCOLOR);
1094 g_signal_connect(G_OBJECT(button), "clicked",
1095 G_CALLBACK(toggle_bg_color), toolbar);
1096 toolbar->bgcolor = button;
1097
1098 button = pidgin_pixbuf_toolbar_button_from_stock(PIDGIN_STOCK_TOOLBAR_INSERT_LINK);
1099 g_signal_connect(G_OBJECT(button), "clicked",
1100 G_CALLBACK(insert_link_cb), toolbar);
1101 toolbar->link = button;
1102
1103 /* Insert IM Image */
1104 button = pidgin_pixbuf_toolbar_button_from_stock(PIDGIN_STOCK_TOOLBAR_INSERT_IMAGE);
1105 g_signal_connect(G_OBJECT(button), "clicked",
1106 G_CALLBACK(insert_image_cb), toolbar);
1107 toolbar->image = button;
1108
1109 /* Insert Smiley */
1110 button = pidgin_pixbuf_toolbar_button_from_stock(PIDGIN_STOCK_TOOLBAR_SMILEY);
1111 g_signal_connect(G_OBJECT(button), "clicked",
1112 G_CALLBACK(insert_smiley_cb), toolbar);
1113 toolbar->smiley = button;
1114
1115 /* Reset formatting */
1116 button = pidgin_pixbuf_toolbar_button_from_stock(PIDGIN_STOCK_TOOLBAR_SMILEY);
1117 g_signal_connect(G_OBJECT(button), "clicked",
1118 G_CALLBACK(clear_formatting_cb), toolbar);
1119 toolbar->clear = button;
1120 } 1121 }
1121 1122
1122 static void 1123 static void
1123 button_sensitiveness_changed(GtkWidget *button, gpointer dontcare, GtkWidget *item) 1124 button_sensitiveness_changed(GtkWidget *button, gpointer dontcare, GtkWidget *item)
1124 { 1125 {
1138 { 1139 {
1139 if (GTK_IS_LABEL(widget)) 1140 if (GTK_IS_LABEL(widget))
1140 g_object_set(G_OBJECT(widget), "use-markup", TRUE, NULL); 1141 g_object_set(G_OBJECT(widget), "use-markup", TRUE, NULL);
1141 } 1142 }
1142 1143
1144 static void
1145 imhtmltoolbar_view_pref_changed(const char *name, PurplePrefType type,
1146 gconstpointer value, gpointer toolbar)
1147 {
1148 if (value) {
1149 gtk_widget_hide_all(g_object_get_data(G_OBJECT(toolbar), "lean-view"));
1150 gtk_widget_show_all(g_object_get_data(G_OBJECT(toolbar), "wide-view"));
1151 } else {
1152 gtk_widget_hide_all(g_object_get_data(G_OBJECT(toolbar), "wide-view"));
1153 gtk_widget_show_all(g_object_get_data(G_OBJECT(toolbar), "lean-view"));
1154 }
1155 }
1156
1143 static void gtk_imhtmltoolbar_init (GtkIMHtmlToolbar *toolbar) 1157 static void gtk_imhtmltoolbar_init (GtkIMHtmlToolbar *toolbar)
1144 { 1158 {
1145 GtkWidget *hbox = GTK_WIDGET(toolbar); 1159 GtkWidget *hbox = GTK_WIDGET(toolbar), *event = gtk_event_box_new();
1146 GtkWidget *bbox; 1160 GtkWidget *bbox, *box = gtk_hbox_new(FALSE, 0);
1147 GtkWidget *image; 1161 GtkWidget *image;
1148 GtkWidget *label; 1162 GtkWidget *label;
1149 GtkWidget *insert_button; 1163 GtkWidget *insert_button;
1150 GtkWidget *font_button; 1164 GtkWidget *font_button;
1151 GtkWidget *font_menu; 1165 GtkWidget *font_menu;
1175 {_("Bac_kground color"), &toolbar->bgcolor, TRUE}, 1189 {_("Bac_kground color"), &toolbar->bgcolor, TRUE},
1176 {_("_Reset formatting"), &toolbar->clear, FALSE}, 1190 {_("_Reset formatting"), &toolbar->clear, FALSE},
1177 {NULL, NULL, FALSE} 1191 {NULL, NULL, FALSE}
1178 }; 1192 };
1179 1193
1180
1181 toolbar->imhtml = NULL; 1194 toolbar->imhtml = NULL;
1182 toolbar->font_dialog = NULL; 1195 toolbar->font_dialog = NULL;
1183 toolbar->fgcolor_dialog = NULL; 1196 toolbar->fgcolor_dialog = NULL;
1184 toolbar->bgcolor_dialog = NULL; 1197 toolbar->bgcolor_dialog = NULL;
1185 toolbar->link_dialog = NULL; 1198 toolbar->link_dialog = NULL;
1201 gtk_box_pack_start(GTK_BOX(bbox), image, FALSE, FALSE, 0); 1214 gtk_box_pack_start(GTK_BOX(bbox), image, FALSE, FALSE, 0);
1202 label = gtk_label_new_with_mnemonic(_("_Font")); 1215 label = gtk_label_new_with_mnemonic(_("_Font"));
1203 gtk_label_set_use_markup(GTK_LABEL(label), TRUE); 1216 gtk_label_set_use_markup(GTK_LABEL(label), TRUE);
1204 g_object_set_data(G_OBJECT(hbox), "font_label", label); 1217 g_object_set_data(G_OBJECT(hbox), "font_label", label);
1205 gtk_box_pack_start(GTK_BOX(bbox), label, FALSE, FALSE, 0); 1218 gtk_box_pack_start(GTK_BOX(bbox), label, FALSE, FALSE, 0);
1206 gtk_box_pack_start(GTK_BOX(hbox), font_button, FALSE, FALSE, 0); 1219 gtk_box_pack_start(GTK_BOX(box), font_button, FALSE, FALSE, 0);
1207 gtk_widget_show_all(font_button); 1220 gtk_widget_show_all(font_button);
1208 1221
1209 font_menu = gtk_menu_new(); 1222 font_menu = gtk_menu_new();
1210 g_object_set_data(G_OBJECT(toolbar), "font_menu", font_menu); 1223 g_object_set_data(G_OBJECT(toolbar), "font_menu", font_menu);
1211 1224
1230 g_signal_connect(G_OBJECT(font_button), "activate", G_CALLBACK(pidgin_menu_clicked), font_menu); 1243 g_signal_connect(G_OBJECT(font_button), "activate", G_CALLBACK(pidgin_menu_clicked), font_menu);
1231 g_signal_connect(G_OBJECT(font_menu), "deactivate", G_CALLBACK(pidgin_menu_deactivate), font_button); 1244 g_signal_connect(G_OBJECT(font_menu), "deactivate", G_CALLBACK(pidgin_menu_deactivate), font_button);
1232 1245
1233 /* Sep */ 1246 /* Sep */
1234 sep = gtk_vseparator_new(); 1247 sep = gtk_vseparator_new();
1235 gtk_box_pack_start(GTK_BOX(hbox), sep, FALSE, FALSE, 0); 1248 gtk_box_pack_start(GTK_BOX(box), sep, FALSE, FALSE, 0);
1236 gtk_widget_show_all(sep); 1249 gtk_widget_show_all(sep);
1237 1250
1238 /* Insert */ 1251 /* Insert */
1239 insert_button = gtk_toggle_button_new(); 1252 insert_button = gtk_toggle_button_new();
1240 gtk_button_set_relief(GTK_BUTTON(insert_button), GTK_RELIEF_NONE); 1253 gtk_button_set_relief(GTK_BUTTON(insert_button), GTK_RELIEF_NONE);
1242 gtk_container_add(GTK_CONTAINER(insert_button), bbox); 1255 gtk_container_add(GTK_CONTAINER(insert_button), bbox);
1243 image = gtk_image_new_from_stock(PIDGIN_STOCK_TOOLBAR_INSERT, gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL)); 1256 image = gtk_image_new_from_stock(PIDGIN_STOCK_TOOLBAR_INSERT, gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL));
1244 gtk_box_pack_start(GTK_BOX(bbox), image, FALSE, FALSE, 0); 1257 gtk_box_pack_start(GTK_BOX(bbox), image, FALSE, FALSE, 0);
1245 label = gtk_label_new_with_mnemonic(_("_Insert")); 1258 label = gtk_label_new_with_mnemonic(_("_Insert"));
1246 gtk_box_pack_start(GTK_BOX(bbox), label, FALSE, FALSE, 0); 1259 gtk_box_pack_start(GTK_BOX(bbox), label, FALSE, FALSE, 0);
1247 gtk_box_pack_start(GTK_BOX(hbox), insert_button, FALSE, FALSE, 0); 1260 gtk_box_pack_start(GTK_BOX(box), insert_button, FALSE, FALSE, 0);
1248 gtk_widget_show_all(insert_button); 1261 gtk_widget_show_all(insert_button);
1249 1262
1250 insert_menu = gtk_menu_new(); 1263 insert_menu = gtk_menu_new();
1251 g_object_set_data(G_OBJECT(toolbar), "insert_menu", insert_menu); 1264 g_object_set_data(G_OBJECT(toolbar), "insert_menu", insert_menu);
1252 1265
1275 1288
1276 g_signal_connect_swapped(G_OBJECT(insert_button), "button-press-event", G_CALLBACK(gtk_widget_activate), insert_button); 1289 g_signal_connect_swapped(G_OBJECT(insert_button), "button-press-event", G_CALLBACK(gtk_widget_activate), insert_button);
1277 g_signal_connect(G_OBJECT(insert_button), "activate", G_CALLBACK(pidgin_menu_clicked), insert_menu); 1290 g_signal_connect(G_OBJECT(insert_button), "activate", G_CALLBACK(pidgin_menu_clicked), insert_menu);
1278 g_signal_connect(G_OBJECT(insert_menu), "deactivate", G_CALLBACK(pidgin_menu_deactivate), insert_button); 1291 g_signal_connect(G_OBJECT(insert_menu), "deactivate", G_CALLBACK(pidgin_menu_deactivate), insert_button);
1279 toolbar->sml = NULL; 1292 toolbar->sml = NULL;
1293
1294 gtk_box_pack_start(GTK_BOX(hbox), box, FALSE, FALSE, 0);
1295 g_object_set_data(G_OBJECT(hbox), "lean-view", box);
1296
1297 purple_prefs_connect_callback(toolbar, PIDGIN_PREFS_ROOT "/conversations/toolbar/wide",
1298 imhtmltoolbar_view_pref_changed, toolbar);
1299 purple_prefs_trigger_callback(PIDGIN_PREFS_ROOT "/conversations/toolbar/wide");
1300
1301 gtk_widget_add_events(event, GDK_BUTTON_PRESS_MASK);
1302 gtk_box_pack_start(GTK_BOX(hbox), event, TRUE, TRUE, 0);
1303 g_signal_connect(G_OBJECT(event), "button-press-event", G_CALLBACK(gtk_imhtmltoolbar_popup_menu), toolbar);
1304 gtk_widget_show(event);
1280 } 1305 }
1281 1306
1282 GtkWidget *gtk_imhtmltoolbar_new() 1307 GtkWidget *gtk_imhtmltoolbar_new()
1283 { 1308 {
1284 return GTK_WIDGET(g_object_new(gtk_imhtmltoolbar_get_type(), NULL)); 1309 return GTK_WIDGET(g_object_new(gtk_imhtmltoolbar_get_type(), NULL));

mercurial