8317
|
1 /*
|
|
2 * GtkIMHtmlToolbar
|
|
3 *
|
|
4 * Gaim is the legal property of its developers, whose names are too numerous
|
|
5 * to list here. Please refer to the COPYRIGHT file distributed with this
|
|
6 * source distribution.
|
|
7 *
|
|
8 * This program is free software; you can redistribute it and/or modify
|
|
9 * under the terms of the GNU General Public License as published by
|
|
10 * the Free Software Foundation; either version 2 of the License, or
|
|
11 * (at your option) any later version.
|
|
12 *
|
|
13 * This program is distributed in the hope that it will be useful,
|
|
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
16 * GNU General Public License for more details.
|
|
17 *
|
|
18 * You should have received a copy of the GNU General Public License
|
|
19 * along with this program; if not, write to the Free Software
|
|
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
21 *
|
|
22 */
|
|
23
|
|
24 #include <gtk/gtk.h>
|
|
25 #include <gtk/gtkvbox.h>
|
|
26 #include "gtkimhtmltoolbar.h"
|
|
27 #include "gtkutils.h"
|
|
28 #include "notify.h"
|
|
29 #include "request.h"
|
|
30 #include "stock.h"
|
|
31 #include "internal.h"
|
|
32 #include "ui.h"
|
|
33
|
|
34 static GtkVBoxClass *parent_class = NULL;
|
|
35
|
|
36 static void do_bold(GtkWidget *bold, GtkIMHtmlToolbar *toolbar)
|
|
37 {
|
|
38 g_return_if_fail(toolbar);
|
|
39 gtk_imhtml_toggle_bold(GTK_IMHTML(toolbar->imhtml));
|
|
40 gtk_widget_grab_focus(toolbar->imhtml);
|
|
41 }
|
|
42
|
|
43 static void
|
|
44 do_italic(GtkWidget *italic, GtkIMHtmlToolbar *toolbar)
|
|
45 {
|
|
46 g_return_if_fail(toolbar);
|
|
47 gtk_imhtml_toggle_italic(GTK_IMHTML(toolbar->imhtml));
|
|
48 gtk_widget_grab_focus(toolbar->imhtml);
|
|
49 }
|
|
50
|
|
51 static void
|
|
52 do_underline(GtkWidget *underline, GtkIMHtmlToolbar *toolbar)
|
|
53 {
|
|
54 g_return_if_fail(toolbar);
|
|
55 gtk_imhtml_toggle_underline(GTK_IMHTML(toolbar->imhtml));
|
|
56 gtk_widget_grab_focus(toolbar->imhtml);
|
|
57 }
|
|
58
|
|
59 static void
|
|
60 do_small(GtkWidget *smalltb, GtkIMHtmlToolbar *toolbar)
|
|
61 {
|
|
62 g_return_if_fail(toolbar);
|
|
63 gtk_imhtml_font_shrink(GTK_IMHTML(toolbar->imhtml));
|
|
64 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar->smaller_size), FALSE);
|
|
65 gtk_widget_grab_focus(toolbar->imhtml);
|
|
66 }
|
|
67
|
|
68 static void
|
|
69 do_big(GtkWidget *large, GtkIMHtmlToolbar *toolbar)
|
|
70 {
|
|
71 g_return_if_fail(toolbar);
|
|
72 gtk_imhtml_font_grow(GTK_IMHTML(toolbar->imhtml));
|
|
73 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar->larger_size), FALSE);
|
|
74 gtk_widget_grab_focus(toolbar->imhtml);
|
|
75 }
|
|
76
|
|
77
|
|
78
|
|
79 static void toolbar_cancel_font(GtkWidget *widget, GtkIMHtmlToolbar *toolbar)
|
|
80 {
|
|
81
|
|
82 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar->font), FALSE);
|
|
83
|
|
84 if (toolbar->font_dialog) {
|
|
85 gtk_widget_destroy(toolbar->font_dialog);
|
|
86 toolbar->font_dialog = NULL;
|
|
87 }
|
|
88 }
|
|
89
|
|
90 static void apply_font(GtkWidget *widget, GtkFontSelection *fontsel)
|
|
91 {
|
|
92 /* this could be expanded to include font size, weight, etc.
|
|
93 but for now only works with font face */
|
|
94 char *fontname;
|
|
95 char *space;
|
|
96 GtkIMHtmlToolbar *toolbar = g_object_get_data(G_OBJECT(fontsel), "gaim_toolbar");
|
|
97
|
|
98 fontname = gtk_font_selection_dialog_get_font_name(GTK_FONT_SELECTION_DIALOG(fontsel));
|
|
99
|
|
100 space = strrchr(fontname, ' ');
|
|
101 if(space && isdigit(*(space+1)))
|
|
102 *space = '\0';
|
|
103
|
|
104 gtk_imhtml_toggle_fontface(GTK_IMHTML(toolbar->imhtml), fontname);
|
|
105
|
|
106 g_free(fontname);
|
|
107
|
|
108 toolbar_cancel_font(NULL, toolbar);
|
|
109 }
|
|
110
|
|
111 static void
|
|
112 toggle_font(GtkWidget *font, GtkIMHtmlToolbar *toolbar)
|
|
113 {
|
|
114 char fonttif[128];
|
|
115 const char *fontface;
|
|
116
|
|
117 g_return_if_fail(toolbar);
|
|
118
|
|
119 if (!toolbar->font_dialog) {
|
|
120 toolbar->font_dialog = gtk_font_selection_dialog_new(_("Select Font"));
|
|
121
|
|
122 g_object_set_data(G_OBJECT(toolbar->font_dialog), "gaim_toolbar", toolbar);
|
|
123
|
|
124 /* if (gtkconv->fontface[0]) {
|
|
125 g_snprintf(fonttif, sizeof(fonttif), "%s 12", gtkconv->fontface);
|
|
126 gtk_font_selection_dialog_set_font_name(GTK_FONT_SELECTION_DIALOG(gtkconv->dialogs.font),
|
|
127 fonttif);
|
|
128 } else {
|
|
129 gtk_font_selection_dialog_set_font_name(GTK_FONT_SELECTION_DIALOG(gtkconv->dialogs.font),
|
|
130 DEFAULT_FONT_FACE);
|
|
131 }
|
|
132 */
|
|
133
|
|
134 g_signal_connect(G_OBJECT(toolbar->font_dialog), "delete_event",
|
|
135 G_CALLBACK(toolbar_cancel_font), toolbar);
|
|
136 g_signal_connect(G_OBJECT(GTK_FONT_SELECTION_DIALOG(toolbar->font_dialog)->ok_button),
|
|
137 "clicked", G_CALLBACK(apply_font), toolbar->font_dialog);
|
|
138 g_signal_connect(G_OBJECT(GTK_FONT_SELECTION_DIALOG(toolbar->font_dialog)->cancel_button),
|
|
139 "clicked", G_CALLBACK(toolbar_cancel_font), toolbar);
|
|
140
|
|
141
|
|
142 gtk_window_present(GTK_WINDOW(toolbar->font_dialog));
|
|
143 } else {
|
|
144 toolbar_cancel_font(NULL, toolbar);
|
|
145 }
|
|
146 gtk_widget_grab_focus(toolbar->imhtml);
|
|
147 }
|
|
148
|
|
149 static void cancel_toolbar_fgcolor(GtkWidget *widget, GtkIMHtmlToolbar *toolbar)
|
|
150 {
|
|
151 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar->fgcolor), FALSE);
|
|
152 gtk_widget_destroy(toolbar->fgcolor_dialog);
|
|
153 toolbar->fgcolor_dialog = NULL;
|
|
154 }
|
|
155
|
|
156 static void do_fgcolor(GtkWidget *widget, GtkColorSelection *colorsel)
|
|
157 {
|
|
158 GdkColor text_color;
|
|
159 GtkIMHtmlToolbar *toolbar = g_object_get_data(G_OBJECT(colorsel), "gaim_toolbar");
|
|
160 char *open_tag;
|
|
161
|
|
162 open_tag = g_malloc(30);
|
|
163 gtk_color_selection_get_current_color(colorsel, &text_color);
|
|
164 g_snprintf(open_tag, 23, "#%02X%02X%02X",
|
|
165 text_color.red / 256,
|
|
166 text_color.green / 256,
|
|
167 text_color.blue / 256);
|
|
168 gtk_imhtml_toggle_forecolor(GTK_IMHTML(toolbar->imhtml), open_tag);
|
|
169
|
|
170 g_free(open_tag);
|
|
171 cancel_toolbar_fgcolor(NULL, toolbar);
|
|
172 }
|
|
173
|
|
174 static void
|
|
175 toggle_fg_color(GtkWidget *color, GtkIMHtmlToolbar *toolbar)
|
|
176 {
|
|
177 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(color))) {
|
|
178 GtkWidget *colorsel;
|
|
179 GdkColor fgcolor;
|
|
180
|
|
181 /*gdk_color_parse(gaim_prefs_get_string("/gaim/gtk/conversations/fgcolor"),
|
|
182 &fgcolor);*/
|
|
183 if (!toolbar->fgcolor_dialog) {
|
|
184
|
|
185 toolbar->fgcolor_dialog = gtk_color_selection_dialog_new(_("Select Text Color"));
|
|
186 colorsel = GTK_COLOR_SELECTION_DIALOG(toolbar->fgcolor_dialog)->colorsel;
|
|
187 //gtk_color_selection_set_current_color(GTK_COLOR_SELECTION(colorsel), &fgcolor);
|
|
188 g_object_set_data(G_OBJECT(colorsel), "gaim_toolbar", toolbar);
|
|
189
|
|
190 g_signal_connect(G_OBJECT(toolbar->fgcolor_dialog), "delete_event",
|
|
191 G_CALLBACK(cancel_toolbar_fgcolor), toolbar);
|
|
192 g_signal_connect(G_OBJECT(GTK_COLOR_SELECTION_DIALOG(toolbar->fgcolor_dialog)->ok_button),
|
|
193 "clicked", G_CALLBACK(do_fgcolor), colorsel);
|
|
194 g_signal_connect(G_OBJECT
|
|
195 (GTK_COLOR_SELECTION_DIALOG(toolbar->fgcolor_dialog)->cancel_button),
|
|
196 "clicked", G_CALLBACK(cancel_toolbar_fgcolor), toolbar);
|
|
197
|
|
198 }
|
|
199 gtk_window_present(toolbar->fgcolor_dialog);
|
|
200 } else if (toolbar->fgcolor_dialog != NULL) {
|
|
201 cancel_toolbar_fgcolor(color, toolbar);
|
|
202 } else {
|
|
203 //gaim_gtk_advance_past(gtkconv, "<FONT COLOR>", "</FONT>");
|
|
204 }
|
|
205 gtk_widget_grab_focus(toolbar->imhtml);
|
|
206 }
|
|
207
|
|
208 static void cancel_toolbar_bgcolor(GtkWidget *widget, GtkIMHtmlToolbar *toolbar)
|
|
209 {
|
|
210 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar->bgcolor), FALSE);
|
|
211 gtk_widget_destroy(toolbar->bgcolor_dialog);
|
|
212 toolbar->bgcolor_dialog = NULL;
|
|
213 }
|
|
214
|
|
215 static void do_bgcolor(GtkWidget *widget, GtkColorSelection *colorsel)
|
|
216 {
|
|
217 GdkColor text_color;
|
|
218 GtkIMHtmlToolbar *toolbar = g_object_get_data(G_OBJECT(colorsel), "gaim_toolbar");
|
|
219 char *open_tag;
|
|
220
|
|
221 open_tag = g_malloc(30);
|
|
222 gtk_color_selection_get_current_color(colorsel, &text_color);
|
|
223 g_snprintf(open_tag, 23, "#%02X%02X%02X",
|
|
224 text_color.red / 256,
|
|
225 text_color.green / 256,
|
|
226 text_color.blue / 256);
|
|
227 gtk_imhtml_toggle_backcolor(GTK_IMHTML(toolbar->imhtml), open_tag);
|
|
228
|
|
229 g_free(open_tag);
|
|
230 cancel_toolbar_bgcolor(NULL, toolbar);
|
|
231 }
|
|
232
|
|
233 static void
|
|
234 toggle_bg_color(GtkWidget *color, GtkIMHtmlToolbar *toolbar)
|
|
235 {
|
|
236 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(color))) {
|
|
237 GtkWidget *colorsel;
|
|
238 GdkColor bgcolor;
|
|
239
|
|
240 /*gdk_color_parse(gaim_prefs_get_string("/gaim/gtk/conversations/bgcolor"),
|
|
241 &bgcolor);*/
|
|
242 if (!toolbar->bgcolor_dialog) {
|
|
243
|
|
244 toolbar->bgcolor_dialog = gtk_color_selection_dialog_new(_("Select Text Color"));
|
|
245 colorsel = GTK_COLOR_SELECTION_DIALOG(toolbar->bgcolor_dialog)->colorsel;
|
|
246 //gtk_color_selection_set_current_color(GTK_COLOR_SELECTION(colorsel), &bgcolor);
|
|
247 g_object_set_data(G_OBJECT(colorsel), "gaim_toolbar", toolbar);
|
|
248
|
|
249 g_signal_connect(G_OBJECT(toolbar->bgcolor_dialog), "delete_event",
|
|
250 G_CALLBACK(cancel_toolbar_bgcolor), toolbar);
|
|
251 g_signal_connect(G_OBJECT(GTK_COLOR_SELECTION_DIALOG(toolbar->bgcolor_dialog)->ok_button),
|
|
252 "clicked", G_CALLBACK(do_bgcolor), colorsel);
|
|
253 g_signal_connect(G_OBJECT
|
|
254 (GTK_COLOR_SELECTION_DIALOG(toolbar->bgcolor_dialog)->cancel_button),
|
|
255 "clicked", G_CALLBACK(cancel_toolbar_bgcolor), toolbar);
|
|
256
|
|
257 }
|
|
258 gtk_window_present(toolbar->bgcolor_dialog);
|
|
259 } else if (toolbar->bgcolor_dialog != NULL) {
|
|
260 cancel_toolbar_bgcolor(color, toolbar);
|
|
261 } else {
|
|
262 //gaim_gtk_advance_past(gtkconv, "<FONT COLOR>", "</FONT>");
|
|
263 }
|
|
264 gtk_widget_grab_focus(toolbar->imhtml);
|
|
265 }
|
|
266
|
|
267 static void
|
|
268 cancel_link_cb(GtkIMHtmlToolbar *toolbar, GaimRequestFields *fields)
|
|
269 {
|
|
270 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar->link), FALSE);
|
|
271 toolbar->link_dialog = NULL;
|
|
272 }
|
|
273
|
|
274 static void
|
|
275 close_link_dialog(GtkIMHtmlToolbar *toolbar)
|
|
276 {
|
|
277 if (toolbar->link_dialog != NULL)
|
|
278 {
|
|
279 gaim_request_close(GAIM_REQUEST_FIELDS, toolbar->link_dialog);
|
|
280 toolbar->link_dialog = NULL;
|
|
281 }
|
|
282 }
|
|
283
|
|
284 static void
|
|
285 do_insert_link_cb(GtkIMHtmlToolbar *toolbar, GaimRequestFields *fields)
|
|
286 {
|
|
287 const char *url, *description;
|
|
288
|
|
289 url = gaim_request_fields_get_string(fields, "url");
|
|
290 description = gaim_request_fields_get_string(fields, "description");
|
|
291
|
|
292 if (description == NULL)
|
|
293 description = url;
|
|
294
|
|
295 gtk_imhtml_insert_link(GTK_IMHTML(toolbar->imhtml), url, description);
|
|
296
|
|
297 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar->link), FALSE);
|
|
298
|
|
299 toolbar->link_dialog = NULL;
|
|
300 }
|
|
301
|
|
302 static void
|
|
303 insert_link_cb(GtkWidget *w, GtkIMHtmlToolbar *toolbar)
|
|
304 {
|
|
305 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toolbar->link))) {
|
|
306 GaimRequestFields *fields;
|
|
307 GaimRequestFieldGroup *group;
|
|
308 GaimRequestField *field;
|
|
309
|
|
310 fields = gaim_request_fields_new();
|
|
311
|
|
312 group = gaim_request_field_group_new(NULL);
|
|
313 gaim_request_fields_add_group(fields, group);
|
|
314
|
|
315 field = gaim_request_field_string_new("url", _("_URL"), NULL, FALSE);
|
|
316 gaim_request_field_set_required(field, TRUE);
|
|
317 gaim_request_field_group_add_field(group, field);
|
|
318
|
|
319 field = gaim_request_field_string_new("description", _("_Description"),
|
|
320 NULL, FALSE);
|
|
321 gaim_request_field_group_add_field(group, field);
|
|
322
|
|
323 toolbar->link_dialog =
|
|
324 gaim_request_fields(toolbar, _("Insert Link"),
|
|
325 NULL,
|
|
326 _("Please enter the URL and description of the "
|
|
327 "link that you want to insert. The description "
|
|
328 "is optional."),
|
|
329 fields,
|
|
330 _("_Insert"), G_CALLBACK(do_insert_link_cb),
|
|
331 _("Cancel"), G_CALLBACK(cancel_link_cb),
|
|
332 toolbar);
|
|
333 } else {
|
|
334 close_link_dialog(toolbar);
|
|
335 }
|
|
336 gtk_widget_grab_focus(toolbar->imhtml);
|
|
337 }
|
|
338
|
|
339
|
|
340 static void
|
|
341 do_insert_image_cb(GtkWidget *widget, int resp, GtkIMHtmlToolbar *toolbar)
|
|
342 {
|
|
343 char *name, *filename;
|
|
344 char *buf, *filedata;
|
|
345 size_t size;
|
|
346 GError *error = NULL;
|
|
347 int id;
|
|
348
|
|
349 if (resp != GTK_RESPONSE_OK) {
|
|
350 //set_toggle(toolbar->image, FALSE);
|
|
351 gtk_widget_destroy(widget);
|
|
352 toolbar->image_dialog = NULL;
|
|
353 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar->image), FALSE);
|
|
354 return;
|
|
355 }
|
|
356
|
|
357 name = g_strdup(gtk_file_selection_get_filename(GTK_FILE_SELECTION(widget)));
|
|
358
|
|
359 if (!name) {
|
|
360 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar->image), FALSE);
|
|
361 return;
|
|
362 }
|
|
363
|
|
364 if (gaim_gtk_check_if_dir(name, GTK_FILE_SELECTION(widget))) {
|
|
365 g_free(name);
|
|
366 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar->image), FALSE);
|
|
367 return;
|
|
368 }
|
|
369
|
|
370 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar->image), FALSE);
|
|
371
|
|
372 if (!g_file_get_contents(name, &filedata, &size, &error)) {
|
|
373 gaim_notify_error(NULL, NULL, error->message, NULL);
|
|
374
|
|
375 g_error_free(error);
|
|
376 g_free(name);
|
|
377
|
|
378 return;
|
|
379 }
|
|
380
|
|
381 filename = name;
|
|
382 while (strchr(filename, '/'))
|
|
383 filename = strchr(filename, '/') + 1;
|
|
384
|
|
385 id = gaim_imgstore_add(filedata, size, filename);
|
|
386 g_free(filedata);
|
|
387
|
|
388 if (!id) {
|
|
389 buf = g_strdup_printf(_("Failed to store image: %s\n"), name);
|
|
390 gaim_notify_error(NULL, NULL, buf, NULL);
|
|
391
|
|
392 g_free(buf);
|
|
393 g_free(name);
|
|
394
|
|
395 return;
|
|
396 }
|
|
397
|
|
398 //im->images = g_slist_append(im->images, GINT_TO_POINTER(id));
|
|
399
|
|
400 /*buf = g_strdup_printf("<IMG ID=\"%d\" SRC=\"file://%s\">", id, filename);
|
|
401 gtk_text_buffer_insert_at_cursor(GTK_TEXT_BUFFER(gtkconv->entry_buffer), buf, -1);
|
|
402 g_free(buf);
|
|
403 */
|
|
404 g_free(name);
|
|
405 }
|
|
406
|
|
407
|
|
408 static void
|
|
409 insert_image_cb(GtkWidget *save, GtkIMHtmlToolbar *toolbar)
|
|
410 {
|
|
411 char buf[BUF_LONG];
|
|
412 GtkWidget *window;
|
|
413
|
|
414 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toolbar->image))) {
|
|
415 window = gtk_file_selection_new(_("Insert Image"));
|
|
416 g_snprintf(buf, sizeof(buf), "%s" G_DIR_SEPARATOR_S, gaim_home_dir());
|
|
417 gtk_file_selection_set_filename(GTK_FILE_SELECTION(window), buf);
|
|
418
|
|
419 gtk_dialog_set_default_response(GTK_DIALOG(window), GTK_RESPONSE_OK);
|
|
420 g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(window)),
|
|
421 "response", G_CALLBACK(do_insert_image_cb), toolbar);
|
|
422
|
|
423 gtk_widget_show(window);
|
|
424 toolbar->image_dialog = window;
|
|
425 } else {
|
|
426 gtk_widget_destroy(toolbar->image_dialog);
|
|
427 toolbar->image_dialog = NULL;
|
|
428 }
|
|
429 gtk_widget_grab_focus(toolbar->imhtml);
|
|
430 }
|
|
431
|
|
432
|
|
433 void close_smiley_dialog(GtkWidget *widget, GtkIMHtmlToolbar *toolbar)
|
|
434 {
|
|
435 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar->smiley), FALSE);
|
|
436
|
|
437 if (toolbar->smiley_dialog) {
|
|
438 gtk_widget_destroy(toolbar->smiley_dialog);
|
|
439 toolbar->smiley_dialog = NULL;
|
|
440 }
|
|
441 }
|
|
442
|
|
443
|
|
444 void insert_smiley_text(GtkWidget *widget, GtkIMHtmlToolbar *toolbar)
|
|
445 {
|
|
446 char *smiley_text = g_object_get_data(G_OBJECT(widget), "smiley_text");
|
|
447 //GaimPlugin *proto = gaim_find_prpl(gaim_account_get_protocol_id(gaim_conversation_get_account(c)));
|
|
448
|
|
449 gtk_imhtml_insert_smiley(GTK_IMHTML(toolbar->imhtml), NULL, smiley_text); //proto->info->name, smiley_text);
|
|
450
|
|
451 close_smiley_dialog(NULL, toolbar);
|
|
452 }
|
|
453
|
|
454
|
|
455 static void add_smiley(GtkIMHtmlToolbar *toolbar, GtkWidget *table, int row, int col, char *filename, char *face)
|
|
456 {
|
|
457 GtkWidget *image;
|
|
458 GtkWidget *button;
|
|
459
|
|
460 image = gtk_image_new_from_file(filename);
|
|
461 button = gtk_button_new();
|
|
462 gtk_container_add(GTK_CONTAINER(button), image);
|
|
463 g_object_set_data(G_OBJECT(button), "smiley_text", face);
|
|
464 g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(insert_smiley_text), toolbar);
|
|
465
|
|
466 gtk_tooltips_set_tip(toolbar->tooltips, button, face, NULL);
|
|
467
|
|
468 gtk_table_attach_defaults(GTK_TABLE(table), button, col, col+1, row, row+1);
|
|
469
|
|
470 /* these look really weird with borders */
|
|
471 gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE);
|
|
472
|
|
473 gtk_widget_show(button);
|
|
474 }
|
|
475
|
|
476
|
|
477 static gboolean smiley_is_unique(GSList *list, GtkIMHtmlSmiley *smiley) {
|
|
478 while(list) {
|
|
479 GtkIMHtmlSmiley *cur = list->data;
|
|
480 if(!strcmp(cur->file, smiley->file))
|
|
481 return FALSE;
|
|
482 list = list->next;
|
|
483 }
|
|
484 return TRUE;
|
|
485 }
|
|
486
|
|
487
|
|
488 static void
|
|
489 insert_smiley_cb(GtkWidget *smiley, GtkIMHtmlToolbar *toolbar)
|
|
490 {
|
|
491 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(smiley))) {
|
|
492
|
|
493 GtkWidget *dialog;
|
|
494 GtkWidget *smiley_table = NULL;
|
|
495 GSList *smileys, *unique_smileys = NULL;
|
|
496 int width;
|
|
497 int row = 0, col = 0;
|
|
498
|
|
499 if (toolbar->smiley_dialog) {
|
|
500 gtk_widget_grab_focus(toolbar->imhtml);
|
|
501 return;
|
|
502 }
|
|
503
|
|
504 /*
|
|
505 if(c->account)
|
|
506 smileys = get_proto_smileys(
|
|
507 gaim_account_get_protocol_id(gaim_conversation_get_account(c)));
|
|
508 else
|
|
509 */
|
|
510
|
|
511 smileys = get_proto_smileys(GAIM_PROTO_DEFAULT);
|
|
512
|
|
513 while(smileys) {
|
|
514 GtkIMHtmlSmiley *smiley = smileys->data;
|
|
515 if(!smiley->hidden) {
|
|
516 if(smiley_is_unique(unique_smileys, smiley))
|
|
517 unique_smileys = g_slist_append(unique_smileys, smiley);
|
|
518 }
|
|
519 smileys = smileys->next;
|
|
520 }
|
|
521
|
|
522
|
|
523 width = floor(sqrt(g_slist_length(unique_smileys)));
|
|
524
|
|
525 GAIM_DIALOG(dialog);
|
|
526 gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE);
|
|
527 gtk_window_set_role(GTK_WINDOW(dialog), "smiley_dialog");
|
|
528 gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_MOUSE);
|
|
529
|
|
530 smiley_table = gtk_table_new(width, width, TRUE);
|
|
531
|
|
532 /* pack buttons */
|
|
533
|
|
534 while(unique_smileys) {
|
|
535 GtkIMHtmlSmiley *smiley = unique_smileys->data;
|
|
536 if(!smiley->hidden) {
|
|
537 add_smiley(toolbar, smiley_table, row, col, smiley->file, smiley->smile);
|
|
538 if(++col >= width) {
|
|
539 col = 0;
|
|
540 row++;
|
|
541 }
|
|
542 }
|
|
543 unique_smileys = unique_smileys->next;
|
|
544 }
|
|
545
|
|
546 gtk_container_add(GTK_CONTAINER(dialog), smiley_table);
|
|
547
|
|
548 gtk_widget_show(smiley_table);
|
|
549
|
|
550 gtk_container_set_border_width(GTK_CONTAINER(dialog), 5);
|
|
551
|
|
552 /* connect signals */
|
|
553 g_object_set_data(G_OBJECT(dialog), "dialog_type", "smiley dialog");
|
|
554 g_signal_connect(G_OBJECT(dialog), "delete_event",
|
|
555 G_CALLBACK(close_smiley_dialog), toolbar);
|
|
556
|
|
557 /* show everything */
|
|
558 gtk_window_set_title(GTK_WINDOW(dialog), _("Smile!"));
|
|
559 gtk_widget_show_all(dialog);
|
|
560
|
|
561 toolbar->smiley_dialog = dialog;
|
|
562
|
|
563 } else if (toolbar->smiley_dialog) {
|
|
564 close_smiley_dialog(smiley, toolbar);
|
|
565 }
|
|
566 gtk_widget_grab_focus(toolbar->imhtml);
|
|
567 }
|
|
568
|
|
569 enum {
|
|
570 LAST_SIGNAL
|
|
571 };
|
|
572 //static guint signals [LAST_SIGNAL] = { 0 };
|
|
573
|
|
574 static void
|
|
575 gtk_imhtmltoolbar_finalize (GObject *object)
|
|
576 {
|
|
577 /*GtkIMHtml *imhtml = GTK_IMHTML(object);
|
|
578 GList *scalables;
|
|
579
|
|
580 g_hash_table_destroy(imhtml->smiley_data);
|
|
581 gtk_smiley_tree_destroy(imhtml->default_smilies);
|
|
582 gdk_cursor_unref(imhtml->hand_cursor);
|
|
583 gdk_cursor_unref(imhtml->arrow_cursor);
|
|
584 gdk_cursor_unref(imhtml->text_cursor);
|
|
585 if(imhtml->tip_window){
|
|
586 gtk_widget_destroy(imhtml->tip_window);
|
|
587 }
|
|
588 if(imhtml->tip_timer)
|
|
589 gtk_timeout_remove(imhtml->tip_timer);
|
|
590
|
|
591 for(scalables = imhtml->scalables; scalables; scalables = scalables->next) {
|
|
592 GtkIMHtmlScalable *scale = GTK_IMHTML_SCALABLE(scalables->data);
|
|
593 scale->free(scale);
|
|
594 }
|
|
595
|
|
596 g_list_free(imhtml->scalables);
|
|
597 G_OBJECT_CLASS(parent_class)->finalize (object);*/
|
|
598 }
|
|
599
|
|
600 /* Boring GTK stuff */
|
|
601 static void gtk_imhtmltoolbar_class_init (GtkIMHtmlToolbarClass *class)
|
|
602 {
|
|
603 GtkObjectClass *object_class;
|
|
604 GObjectClass *gobject_class;
|
|
605 object_class = (GtkObjectClass*) class;
|
|
606 gobject_class = (GObjectClass*) class;
|
|
607 parent_class = gtk_type_class(GTK_TYPE_VBOX);
|
|
608 /* signals[URL_CLICKED] = g_signal_new(url_clicked",
|
|
609 G_TYPE_FROM_CLASS(gobject_class),
|
|
610 G_SIGNAL_RUN_FIRST,
|
|
611 G_STRUCT_OFFSET(GtkIMHtmlClass, url_clicked),
|
|
612 NULL,
|
|
613 0,
|
|
614 g_cclosure_marshal_VOID__POINTER,
|
|
615 G_TYPE_NONE, 1,
|
|
616 G_TYPE_POINTER);*/
|
|
617 gobject_class->finalize = gtk_imhtmltoolbar_finalize;
|
|
618 }
|
|
619
|
|
620 static void gtk_imhtmltoolbar_init (GtkIMHtmlToolbar *toolbar)
|
|
621 {
|
|
622 GtkWidget *hbox;
|
|
623 GtkWidget *button;
|
|
624 GtkWidget *sep;
|
|
625 GtkSizeGroup *sg;
|
|
626
|
|
627 toolbar->imhtml = NULL;
|
|
628 toolbar->font_dialog = NULL;
|
|
629 toolbar->fgcolor_dialog = NULL;
|
|
630 toolbar->bgcolor_dialog = NULL;
|
|
631 toolbar->link_dialog = NULL;
|
|
632 toolbar->smiley_dialog = NULL;
|
|
633 toolbar->image_dialog = NULL;
|
|
634
|
|
635 toolbar->tooltips = gtk_tooltips_new();
|
|
636
|
|
637 sg = gtk_size_group_new(GTK_SIZE_GROUP_BOTH);
|
|
638
|
|
639 sep = gtk_hseparator_new();
|
|
640 gtk_box_pack_start(GTK_BOX(toolbar), sep, FALSE, FALSE, 0);
|
|
641 gtk_widget_show(sep);
|
|
642
|
|
643 hbox = gtk_hbox_new(FALSE, 6);
|
|
644 gtk_box_pack_start(GTK_BOX(toolbar), hbox, FALSE, FALSE, 0);
|
|
645
|
|
646 /* Bold */
|
|
647 button = gaim_pixbuf_toolbar_button_from_stock(GTK_STOCK_BOLD);
|
|
648 gtk_size_group_add_widget(sg, button);
|
|
649 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
|
|
650 gtk_tooltips_set_tip(toolbar->tooltips, button, _("Bold"), NULL);
|
|
651
|
|
652 g_signal_connect(G_OBJECT(button), "clicked",
|
|
653 G_CALLBACK(do_bold), toolbar);
|
|
654
|
|
655 toolbar->bold = button;
|
|
656
|
|
657 /* Italic */
|
|
658 button = gaim_pixbuf_toolbar_button_from_stock(GTK_STOCK_ITALIC);
|
|
659 gtk_size_group_add_widget(sg, button);
|
|
660 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
|
|
661 gtk_tooltips_set_tip(toolbar->tooltips, button, _("Italic"), NULL);
|
|
662
|
|
663 g_signal_connect(G_OBJECT(button), "clicked",
|
|
664 G_CALLBACK(do_italic), toolbar);
|
|
665
|
|
666 toolbar->italic = button;
|
|
667
|
|
668 /* Underline */
|
|
669 button = gaim_pixbuf_toolbar_button_from_stock(GTK_STOCK_UNDERLINE);
|
|
670 gtk_size_group_add_widget(sg, button);
|
|
671 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
|
|
672 gtk_tooltips_set_tip(toolbar->tooltips, button, _("Underline"), NULL);
|
|
673
|
|
674 g_signal_connect(G_OBJECT(button), "clicked",
|
|
675 G_CALLBACK(do_underline), toolbar);
|
|
676
|
|
677 toolbar->underline = button;
|
|
678
|
|
679 /* Sep */
|
|
680 sep = gtk_vseparator_new();
|
|
681 gtk_box_pack_start(GTK_BOX(hbox), sep, FALSE, FALSE, 0);
|
|
682
|
|
683 /* Increase font size */
|
|
684 button = gaim_pixbuf_toolbar_button_from_stock(GAIM_STOCK_TEXT_BIGGER);
|
|
685 gtk_size_group_add_widget(sg, button);
|
|
686 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
|
|
687 gtk_tooltips_set_tip(toolbar->tooltips, button,
|
|
688 _("Larger font size"), NULL);
|
|
689
|
|
690 g_signal_connect(G_OBJECT(button), "clicked",
|
|
691 G_CALLBACK(do_big), toolbar);
|
|
692
|
|
693 toolbar->larger_size = button;
|
|
694
|
|
695 /* Decrease font size */
|
|
696 button = gaim_pixbuf_toolbar_button_from_stock(GAIM_STOCK_TEXT_SMALLER);
|
|
697 gtk_size_group_add_widget(sg, button);
|
|
698 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
|
|
699 gtk_tooltips_set_tip(toolbar->tooltips, button,
|
|
700 _("Smaller font size"), NULL);
|
|
701
|
|
702 g_signal_connect(G_OBJECT(button), "clicked",
|
|
703 G_CALLBACK(do_small), toolbar);
|
|
704
|
|
705 toolbar->smaller_size = button;
|
|
706
|
|
707 /* Sep */
|
|
708 sep = gtk_vseparator_new();
|
|
709 gtk_box_pack_start(GTK_BOX(hbox), sep, FALSE, FALSE, 0);
|
|
710
|
|
711 /* Font Face */
|
|
712
|
|
713 button = gaim_pixbuf_toolbar_button_from_stock(GTK_STOCK_SELECT_FONT);
|
|
714 gtk_size_group_add_widget(sg, button);
|
|
715 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
|
|
716 gtk_tooltips_set_tip(toolbar->tooltips, button,
|
|
717 _("Font Face"), NULL);
|
|
718
|
|
719 g_signal_connect(G_OBJECT(button), "clicked",
|
|
720 G_CALLBACK(toggle_font), toolbar);
|
|
721
|
|
722 toolbar->font = button;
|
|
723
|
|
724 /* Foreground Color */
|
|
725 button = gaim_pixbuf_toolbar_button_from_stock(GAIM_STOCK_FGCOLOR);
|
|
726 gtk_size_group_add_widget(sg, button);
|
|
727 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
|
|
728 gtk_tooltips_set_tip(toolbar->tooltips, button,
|
|
729 _("Foreground font color"), NULL);
|
|
730
|
|
731 g_signal_connect(G_OBJECT(button), "clicked",
|
|
732 G_CALLBACK(toggle_fg_color), toolbar);
|
|
733
|
|
734 toolbar->fgcolor = button;
|
|
735
|
|
736 /* Background Color */
|
|
737 button = gaim_pixbuf_toolbar_button_from_stock(GAIM_STOCK_BGCOLOR);
|
|
738 gtk_size_group_add_widget(sg, button);
|
|
739 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
|
|
740 gtk_tooltips_set_tip(toolbar->tooltips, button,
|
|
741 _("Background color"), NULL);
|
|
742
|
|
743 g_signal_connect(G_OBJECT(button), "clicked",
|
|
744 G_CALLBACK(toggle_bg_color), toolbar);
|
|
745
|
|
746 toolbar->bgcolor = button;
|
|
747
|
|
748 /* Sep */
|
|
749 sep = gtk_vseparator_new();
|
|
750 gtk_box_pack_start(GTK_BOX(hbox), sep, FALSE, FALSE, 0);
|
|
751
|
|
752 /* Insert Link */
|
|
753 button = gaim_pixbuf_toolbar_button_from_stock(GAIM_STOCK_LINK);
|
|
754 gtk_size_group_add_widget(sg, button);
|
|
755 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
|
|
756 gtk_tooltips_set_tip(toolbar->tooltips, button, _("Insert link"), NULL);
|
|
757 g_signal_connect(G_OBJECT(button), "clicked",
|
|
758 G_CALLBACK(insert_link_cb), toolbar);
|
|
759
|
|
760 toolbar->link = button;
|
|
761
|
|
762 /* Insert IM Image */
|
|
763 button = gaim_pixbuf_toolbar_button_from_stock(GAIM_STOCK_IMAGE);
|
|
764 gtk_size_group_add_widget(sg, button);
|
|
765 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
|
|
766 gtk_tooltips_set_tip(toolbar->tooltips, button, _("Insert image"), NULL);
|
|
767
|
|
768 g_signal_connect(G_OBJECT(button), "clicked",
|
|
769 G_CALLBACK(insert_image_cb), toolbar);
|
|
770
|
|
771 toolbar->image = button;
|
|
772
|
|
773 /* Insert Smiley */
|
|
774 button = gaim_pixbuf_toolbar_button_from_stock(GAIM_STOCK_SMILEY);
|
|
775 gtk_size_group_add_widget(sg, button);
|
|
776 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
|
|
777 gtk_tooltips_set_tip(toolbar->tooltips, button, _("Insert smiley"), NULL);
|
|
778
|
|
779 g_signal_connect(G_OBJECT(button), "clicked",
|
|
780 G_CALLBACK(insert_smiley_cb), toolbar);
|
|
781
|
|
782 toolbar->smiley = button;
|
|
783
|
|
784
|
|
785 sep = gtk_hseparator_new();
|
|
786 gtk_box_pack_start(GTK_BOX(toolbar), sep, FALSE, FALSE, 0);
|
|
787 gtk_widget_show(sep);
|
|
788
|
|
789
|
|
790 //if (!gaim_prefs_get_bool("/gaim/gtk/conversations/show_formatting_toolbar"))
|
|
791 // gtk_widget_hide(vbox);
|
|
792
|
|
793 gtk_widget_show_all(hbox);
|
|
794 }
|
|
795
|
|
796 GtkWidget *gtk_imhtmltoolbar_new()
|
|
797 {
|
|
798 return GTK_WIDGET(g_object_new(gtk_imhtmltoolbar_get_type(), NULL));
|
|
799 }
|
|
800
|
|
801 GType gtk_imhtmltoolbar_get_type()
|
|
802 {
|
|
803 static GType imhtmltoolbar_type = 0;
|
|
804
|
|
805 if (!imhtmltoolbar_type) {
|
|
806 static const GTypeInfo imhtmltoolbar_info = {
|
|
807 sizeof(GtkIMHtmlToolbarClass),
|
|
808 NULL,
|
|
809 NULL,
|
|
810 (GClassInitFunc) gtk_imhtmltoolbar_class_init,
|
|
811 NULL,
|
|
812 NULL,
|
|
813 sizeof (GtkIMHtmlToolbar),
|
|
814 0,
|
|
815 (GInstanceInitFunc) gtk_imhtmltoolbar_init
|
|
816 };
|
|
817
|
|
818 imhtmltoolbar_type = g_type_register_static(gtk_vbox_get_type(),
|
|
819 "GtkIMHtmlToolbar", &imhtmltoolbar_info, 0);
|
|
820 }
|
|
821
|
|
822 return imhtmltoolbar_type;
|
|
823 }
|
|
824
|
|
825
|
|
826 void gtk_imhtmltoolbar_attach (GtkIMHtmlToolbar *toolbar, GtkWidget *imhtml)
|
|
827 {
|
|
828 toolbar->imhtml = imhtml;
|
|
829 }
|