1 /* Bluefish HTML Editor
2  * html.c - menu/toolbar callbacks, inserting functions, and other cool stuff
3  *
4  * Copyright (C) 1998 Olivier Sessink and Chris Mazuc
5  * modifications Copyright (C) 1999 Antti-Juhani Kaijanaho
6  * rewrite November 2000 (C) Olivier Sessink
7  * Copyright (C) 1999-2012 Olivier Sessink
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 3 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
21  */
22 
23 /*#define DEBUG*/
24 
25 #include <gtk/gtk.h>
26 #include <stdio.h>
27 #include <stdlib.h>				/* strtod() */
28 #include <string.h>
29 #include <time.h>
30 
31 #include "htmlbar.h"
32 #include "html.h"
33 #include "html_diag.h"			/* the new html dialog stuff  */
34 #include "html2.h"				/* style_but_new */
35 #include "cap.h"				/* cap() */
36 #include "../bf_lib.h"			/* main_v */
37 #include "../dialog_utils.h"
38 #include "../document.h"
39 #include "../gtk_easy.h"
40 #include "../stringlist.h"
41 
42 
43 /*****************************************************************************/
44 
45 void
htmlbar_insert_special_char(Tbfwin * bfwin,TBFSpecialChars spchar)46 htmlbar_insert_special_char(Tbfwin * bfwin, TBFSpecialChars spchar)
47 {
48 	const gchar *sp_chars[] = {
49 		NULL, "&nbsp;", "&brvbar;", "&shy;"
50 	};
51 
52 	doc_insert_two_strings(bfwin->current_document, sp_chars[spchar], NULL);
53 }
54 
55 void
general_html_menu_cb(Tbfwin * bfwin,guint callback_action,GtkWidget * widget)56 general_html_menu_cb(Tbfwin * bfwin, guint callback_action, GtkWidget * widget)
57 {
58 	gchar *tmp;
59 	gboolean is_xhtml = get_curlang_option_value(bfwin, lang_is_XHTML);
60 	g_print("general_html_menu_cb, switch %d\n",callback_action);
61 	switch (callback_action) {
62 	case 1:
63 		doc_insert_two_strings(bfwin->current_document, cap("<B>"), cap("</B>"));
64 		break;
65 	case 2:
66 		doc_insert_two_strings(bfwin->current_document, cap("<I>"), cap("</I>"));
67 		break;
68 	case 3:
69 		doc_insert_two_strings(bfwin->current_document,
70 							   is_xhtml ? cap("<SPAN STYLE=\"text-decoration: underline;\">") : cap("<U>")
71 							   , is_xhtml ? cap("</SPAN>") : cap("</U>"));
72 		break;
73 	case 4:
74 		doc_insert_two_strings(bfwin->current_document, cap("<STRIKE>"), cap("</STRIKE>"));
75 		break;
76 	case 5:
77 		doc_insert_two_strings(bfwin->current_document, cap("<P>"), cap("</P>"));
78 		break;
79 	case 6:
80 		doc_insert_two_strings(bfwin->current_document,
81 							   get_curlang_option_value(bfwin, self_close_singleton_tags) ? cap("<br />") : cap("<br>"), NULL);
82 		break;
83 	case 7:
84 		doc_insert_two_strings(bfwin->current_document, "&nbsp;", NULL);
85 		break;
86 	case 8:
87 		doc_insert_two_strings(bfwin->current_document,
88 							   is_xhtml ? cap("<DIV STYLE=\"text-align: center;\">") : cap("<DIV ALIGN=\"CENTER\">"),
89 							   cap("</DIV>"));
90 		break;
91 	case 9:
92 		doc_insert_two_strings(bfwin->current_document,
93 							   is_xhtml ? cap("<DIV STYLE=\"text-align: right;\">") : cap("<DIV ALIGN=\"RIGHT\">"),
94 							   cap("</DIV>"));
95 		break;
96 	case 10:
97 		doc_insert_two_strings(bfwin->current_document, "<!-- ", " -->");
98 		break;
99 	case 11:
100 		doc_insert_two_strings(bfwin->current_document,
101 							   is_xhtml ? cap("<SPAN STYLE=\"font-size: larger;\">") : cap("<FONT SIZE=\"+1\">")
102 							   , is_xhtml ? cap("</SPAN>") : cap("</FONT>"));
103 		break;
104 	case 12:
105 		doc_insert_two_strings(bfwin->current_document,
106 							   is_xhtml ? cap("<SPAN STYLE=\"font-size: smaller;\">") : cap("<FONT SIZE=\"-1\">")
107 							   , is_xhtml ? cap("</SPAN>") : cap("</FONT>"));
108 		break;
109 	case 13:
110 		doc_insert_two_strings(bfwin->current_document, cap("<PRE>"), cap("</PRE>"));
111 		break;
112 	case 14:
113 		doc_insert_two_strings(bfwin->current_document, cap("<SUB>"), cap("</SUB>"));
114 		break;
115 	case 15:
116 		doc_insert_two_strings(bfwin->current_document, cap("<SUP>"), cap("</SUP>"));
117 		break;
118 	case 16:
119 		doc_insert_two_strings(bfwin->current_document, cap("<STRONG>"), cap("</STRONG>"));
120 		break;
121 	case 17:
122 		doc_insert_two_strings(bfwin->current_document, cap("<EM>"), cap("</EM>"));
123 		break;
124 	case 18:
125 		doc_insert_two_strings(bfwin->current_document, cap("<H1>"), cap("</H1>"));
126 		break;
127 	case 19:
128 		doc_insert_two_strings(bfwin->current_document, cap("<H2>"), cap("</H2>"));
129 		break;
130 	case 20:
131 		doc_insert_two_strings(bfwin->current_document, cap("<H3>"), cap("</H3>"));
132 		break;
133 	case 21:
134 		doc_insert_two_strings(bfwin->current_document, cap("<H4>"), cap("</H4>"));
135 		break;
136 	case 22:
137 		doc_insert_two_strings(bfwin->current_document, cap("<H5>"), cap("</H5>"));
138 		break;
139 	case 23:
140 		doc_insert_two_strings(bfwin->current_document, cap("<H6>"), cap("</H6>"));
141 		break;
142 	case 24:
143 		doc_insert_two_strings(bfwin->current_document, cap("<TABLE>"), cap("</TABLE>"));
144 		break;
145 	case 25:
146 		doc_insert_two_strings(bfwin->current_document, cap("<TR>"), cap("</TR>"));
147 		break;
148 	case 26:
149 		doc_insert_two_strings(bfwin->current_document, cap("<TH>"), cap("</TH>"));
150 		break;
151 	case 27:
152 		doc_insert_two_strings(bfwin->current_document, cap("<TD>"), cap("</TD>"));
153 		break;
154 	case 28:
155 		doc_insert_two_strings(bfwin->current_document, cap("<CAPTION>"), cap("</CAPTION>"));
156 		break;
157 	case 29:
158 		doc_insert_two_strings(bfwin->current_document, cap("<FRAMESET>"), cap("</FRAMESET>"));
159 		break;
160 	case 30:
161 		doc_insert_two_strings(bfwin->current_document,
162 							   get_curlang_option_value(bfwin, self_close_singleton_tags) ? cap("<FRAME />") : cap("<FRAME>"), NULL);
163 		break;
164 	case 31:
165 		doc_insert_two_strings(bfwin->current_document, cap("<NOFRAMES>"), cap("</NOFRAMES>"));
166 		break;
167 	case 32:
168 		doc_insert_two_strings(bfwin->current_document,
169 							   get_curlang_option_value(bfwin, self_close_singleton_tags) ? cap("<BASE TARGET=\"\" />") : cap("<BASE TARGET=\"\">"), NULL);
170 		break;
171 	case 33:
172 		doc_insert_two_strings(bfwin->current_document, cap("<UL>"), cap("</UL>"));
173 		break;
174 	case 34:
175 		doc_insert_two_strings(bfwin->current_document, cap("<OL>"), cap("</OL>"));
176 		break;
177 	case 35:
178 		doc_insert_two_strings(bfwin->current_document, cap("<LI>"), cap("</LI>"));
179 		break;
180 	case 36:
181 		doc_insert_two_strings(bfwin->current_document, cap("<DL>\n\t<DT></DT>\n\t<DD></DD>\n</DL>"), "\n");
182 		break;
183 	case 37:
184 		doc_insert_two_strings(bfwin->current_document, cap("<DT>"), cap("</DT>"));
185 		break;
186 	case 38:
187 		doc_insert_two_strings(bfwin->current_document, cap("<DD>"), cap("</DD>"));
188 		break;
189 	case 39:
190 		doc_insert_two_strings(bfwin->current_document, cap("<MENU>"), cap("</MENU>"));
191 		break;
192 	case 40:
193 		doc_insert_two_strings(bfwin->current_document, cap("<MAP NAME=\""), is_xhtml ?
194 							   cap("\">\n\t<AREA SHAPE=\"\" COORDS=\"\" HREF=\"\" />\n</MAP>\n") :
195 							   cap("\">\n\t<AREA SHAPE=\"\" COORDS=\"\" HREF=\"\">\n</MAP>\n"));
196 		break;
197 	case 41:
198 		doc_insert_two_strings(bfwin->current_document,
199 							   get_curlang_option_value(bfwin, self_close_singleton_tags) ? cap("<BR CLEAR=\"ALL\" />") : cap("<BR CLEAR=\"ALL\">"), NULL);
200 		break;
201 	case 42:
202 		/* the text/css should be always lowercase! */
203 		tmp = g_strdup_printf("<%s=\"text/css\"><!--\n", cap("STYLE TYPE"));
204 		doc_insert_two_strings(bfwin->current_document, tmp, cap("\n--></STYLE>"));
205 		g_free(tmp);
206 		break;
207 	case 43:
208 		doc_insert_two_strings(bfwin->current_document, cap("<NOBR>"), cap("</NOBR>"));
209 		break;
210 	case 44:
211 		tmp = 	g_strdup_printf("<%s=\"javascript\" %s=\"text/javascript\"><!--\n", cap("SCRIPT LANGUAGE"),
212 							cap("TYPE"));
213 		doc_insert_two_strings(bfwin->current_document, tmp, cap("\n//--></SCRIPT>"));
214 		g_free(tmp);
215 		break;
216 /*  case 45:
217     tmp = g_strdup_printf("<%s=\"javascript\" %s>", cap("SCRIPT LANGUAGE"), cap("SRC=\"\" TYPE=\"text/javascript\""));
218     doc_insert_two_strings(bfwin->current_document, tmp, cap("</SCRIPT>"));
219     g_free(tmp);
220     break; */
221 /*  case 46:
222     tmp = g_strdup_printf("<%s=\"stylesheet\" %s=\"\" %s=\"text/css\">", cap("LINK REL"), cap("HREF"), cap("TYPE"));
223     doc_insert_two_strings(bfwin->current_document, tmp, "");
224     g_free(tmp);
225     break; */
226 	case 47:
227 		tmp = g_strconcat(cap("<META NAME=\"Generator\" CONTENT=\"")
228 						  , "Bluefish ", VERSION, " http://bluefish.openoffice.nl/",
229 						  get_curlang_option_value(bfwin, self_close_singleton_tags) ? "\" />\n" : "\">\n", NULL);
230 		doc_insert_two_strings(bfwin->current_document, tmp, NULL);
231 		g_free(tmp);
232 		break;
233 	case 48:
234 		doc_insert_two_strings(bfwin->current_document, cap("<DFN>"), cap("</DFN>"));
235 		break;
236 	case 49:
237 		doc_insert_two_strings(bfwin->current_document, cap("<CODE>"), cap("</CODE>"));
238 		break;
239 	case 50:
240 		doc_insert_two_strings(bfwin->current_document, cap("<SAMP>"), cap("</SAMP>"));
241 		break;
242 	case 51:
243 		doc_insert_two_strings(bfwin->current_document, cap("<KBD>"), cap("</KBD>"));
244 		break;
245 	case 52:
246 		doc_insert_two_strings(bfwin->current_document, cap("<VAR>"), cap("</VAR>"));
247 		break;
248 	case 53:
249 		doc_insert_two_strings(bfwin->current_document, cap("<CITE>"), cap("</CITE>"));
250 		break;
251 	case 54:
252 		doc_insert_two_strings(bfwin->current_document, cap("<ABBR>"), cap("</ABBR>"));
253 		break;
254 	case 55:
255 		doc_insert_two_strings(bfwin->current_document, cap("<ACRONYM>"), cap("</ACRONYM>"));
256 		break;
257 	case 56:
258 		doc_insert_two_strings(bfwin->current_document, cap("<SMALL>"), cap("</SMALL>"));
259 		break;
260 	case 57:
261 		doc_insert_two_strings(bfwin->current_document, cap("<BIG>"), cap("</BIG>"));
262 		break;
263 	case 58:
264 		doc_insert_two_strings(bfwin->current_document, cap("<BUTTON>"), cap("</BUTTON>"));
265 		break;
266 	case 59:
267 		doc_insert_two_strings(bfwin->current_document, cap("<SCRIPT>"), cap("</SCRIPT>"));
268 		break;
269 	case 60:
270 		doc_insert_two_strings(bfwin->current_document, cap("<SPAN>"), cap("</SPAN>"));
271 		break;
272 	case 61:
273 		doc_insert_two_strings(bfwin->current_document,
274 							   get_curlang_option_value(bfwin, self_close_singleton_tags) ? cap("<LINK />") : cap("<LINK>"), NULL);
275 		break;
276 	case 62:
277 		doc_insert_two_strings(bfwin->current_document, cap("<DIV>"), cap("</DIV>"));
278 		break;
279 	case 63:
280 		doc_insert_two_strings(bfwin->current_document, cap("<A>"), cap("</A>"));
281 		break;
282 	case 64:
283 		doc_insert_two_strings(bfwin->current_document,
284 							   get_curlang_option_value(bfwin, self_close_singleton_tags) ? cap("<IMG />") : cap("<IMG>"), NULL);
285 		break;
286 	case 65:
287 		doc_insert_two_strings(bfwin->current_document,
288 							   get_curlang_option_value(bfwin, self_close_singleton_tags) ? cap("<INPUT />") : cap("<INPUT>"), NULL);
289 		break;
290 	case 66:
291 		doc_insert_two_strings(bfwin->current_document, cap("<TEXTAREA>"), cap("</TEXTAREA>"));
292 		break;
293 	case 67:
294 		doc_insert_two_strings(bfwin->current_document, cap("<FORM>"), cap("</FORM>"));
295 		break;
296 	case 68:
297 		doc_insert_two_strings(bfwin->current_document, cap("<INS>"), cap("</INS>"));
298 		break;
299 	case 69:
300 		doc_insert_two_strings(bfwin->current_document, cap("<DEL>"), cap("</DEL>"));
301 		break;
302 	case 70:
303 		doc_insert_two_strings(bfwin->current_document, cap("<ARTICLE>"), cap("</ARTICLE>"));
304 		break;
305 	default:
306 		break;
307 	}
308 }
309 
310 
311 /************************************************************************/
312 
313 static gchar *
extract_time_string(const gchar * original_string)314 extract_time_string(const gchar *original_string)
315 {
316 	static gchar *return_string;
317 	gchar *start_ptr;
318 	gchar *end_ptr;
319 	gint string_size;
320 
321 	return_string = g_malloc0(32);
322 	start_ptr = strchr(original_string, '(');
323 	start_ptr++;
324 	end_ptr = strchr(original_string, ')');
325 	string_size = end_ptr - start_ptr;
326 	strncat(return_string, start_ptr, string_size);
327 	return return_string;
328 }
329 
330 /************************************************************************/
331 
332 /* time insert struct */
333 typedef struct {
334 	GtkWidget *check[7];
335 	GtkWidget *label[7];
336 	GtkWidget *dialog;
337 	Tbfwin *bfwin;
338 } TimeInsert;
339 
340 
341 static void
insert_time_destroy_lcb(GtkWidget * widget,TimeInsert * data)342 insert_time_destroy_lcb(GtkWidget * widget, TimeInsert * data)
343 {
344 	DEBUG_MSG("insert_time_destroy_lcb, data=%p\n", data);
345 	window_destroy(data->dialog);
346 	g_free(data);
347 }
348 
349 static void
insert_time_callback(GtkWidget * widget,TimeInsert * timeinsert)350 insert_time_callback(GtkWidget * widget, TimeInsert * timeinsert)
351 {
352 	const gchar *temp_string;
353 	gchar *insert_string;
354 	gchar *final_string;
355 	gint count;
356 
357 	insert_string = g_malloc0(32);
358 	final_string = g_malloc0(255);
359 	for (count = 1; count < 7; count++) {
360 		if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(timeinsert->check[count]))) {
361 			temp_string = gtk_label_get_text(GTK_LABEL(timeinsert->label[count]));
362 			insert_string = extract_time_string(temp_string);
363 			strncat(final_string, insert_string, 31);
364 			strncat(final_string, " ", 31);
365 		}
366 		DEBUG_MSG("insert_time_callback, count=%d\n", count);
367 	}
368 
369 	DEBUG_MSG("insert_time_callback, final_string=%s\n", final_string);
370 	doc_insert_two_strings(timeinsert->bfwin->current_document, final_string, "");
371 	DEBUG_MSG("insert_time_callback, text inserted\n");
372 	g_free(insert_string);
373 	g_free(final_string);
374 	insert_time_destroy_lcb(NULL, timeinsert);
375 	DEBUG_MSG("insert_time_callback, finished\n");
376 }
377 
378 /************************************************************************/
379 
380 static void
insert_time_cancel(GtkWidget * widget,TimeInsert * data)381 insert_time_cancel(GtkWidget * widget, TimeInsert * data)
382 {
383 	DEBUG_MSG("insert_time_cancel, data=%p\n", data);
384 	insert_time_destroy_lcb(widget, data);
385 }
386 
387 /************************************************************************/
388 void
insert_time_dialog(Tbfwin * bfwin)389 insert_time_dialog(Tbfwin * bfwin)
390 {
391 
392 	gint month, year, count;
393 	gchar isotime[60];
394 	time_t time_var;
395 	gchar *temp = NULL;
396 	struct tm *time_struct;
397 	TimeInsert *timeinsert;
398 	GtkWidget *ok_b, *cancel_b, *vbox, *hbox;
399 	timeinsert = g_new0(TimeInsert, 1);
400 	timeinsert->bfwin = bfwin;
401 	time_var = time(NULL);
402 	time_struct = localtime(&time_var);
403 	DEBUG_MSG("insert_time_cb, timeinsert=%p\n", timeinsert);
404 	timeinsert->dialog = window_full2(_("Insert Time"), GTK_WIN_POS_CENTER, 12, G_CALLBACK(insert_time_destroy_lcb), timeinsert,
405 					TRUE, bfwin->main_window);
406 	vbox = gtk_vbox_new(FALSE, 1);
407 	gtk_container_add(GTK_CONTAINER(timeinsert->dialog), vbox);
408 
409 	for (count = 1; count < 7; count++) {
410 		switch (count) {
411 		case 1:
412 			temp = 		g_strdup_printf(_("  _Time (%i:%i:%i)"), time_struct->tm_hour, time_struct->tm_min, time_struct->tm_sec);
413 			break;
414 		case 2:
415 			switch (time_struct->tm_wday) {
416 			case 0:
417 				temp = g_strdup(_("  Day of the _week (Sunday)"));
418 				break;
419 			case 1:
420 				temp = g_strdup(_("  Day of the _week (Monday)"));
421 				break;
422 			case 2:
423 				temp = g_strdup(_("  Day of the _week (Tuesday)"));
424 				break;
425 			case 3:
426 				temp = g_strdup(_("  Day of the _week (Wednesday)"));
427 				break;
428 			case 4:
429 				temp = g_strdup(_("  Day of the _week (Thursday)"));
430 				break;
431 			case 5:
432 				temp = g_strdup(_("  Day of the _week (Friday)"));
433 				break;
434 			case 6:
435 				temp = g_strdup(_("  Day of the _week (Saturday)"));
436 				break;
437 			default:
438 				g_message(_("You appear to have a non existent day!\n"));
439 				temp = g_strdup(" ** Error ** see stdout");
440 				break;
441 			}					/* end of switch day of week */
442 			break;
443 		case 3:
444 			month = time_struct->tm_mon + 1;
445 			year = time_struct->tm_year;
446 			year = 1900 + year;
447 			temp = g_strdup_printf(_("  _Date (%i/%i/%i)"), time_struct->tm_mday, month, year);
448 			break;
449 		case 4:
450 			temp = g_strdup_printf(_("  _Unix Time (%i)"), (int) time_var);
451 			break;
452 		case 5:
453 			{
454 				gchar *tmpstrtime = bf_portable_time(&time_var);
455 				temp = g_strdup_printf(_("  Unix Date _String (%s)"), tmpstrtime);
456 				g_free(tmpstrtime);
457 			}
458 			/* Replace \n on ')' */
459 			temp[strlen(temp) - 1] = ')';
460 			break;
461 		case 6:
462 			{
463 				gchar *tmpstr = _("  ISO-8601 Ti_me ");
464 #ifdef WIN32
465 				glong hours, mins;
466 				gchar gmtsign;
467 
468 				strftime(isotime, 30, "%Y-%m-%dT%H:%M:%S", time_struct);
469 				gmtsign = _timezone > 0 ? '-' : '+';
470 				hours = abs(_timezone) / 3600;
471 				mins = (abs(_timezone) % 3600) / 60;
472 				temp = g_strconcat(tmpstr, g_strdup_printf("(%s%c%02ld%02ld)", 						   isotime, gmtsign, hours, mins), NULL);
473 
474 #else							/* WIN32 */
475 				strftime(isotime, 30, "%Y-%m-%dT%H:%M:%S%z", time_struct);
476 				temp = g_strconcat(tmpstr, g_strdup_printf("(%s)", isotime), NULL);
477 #endif							/* WIN32 */
478 			}
479 			break;
480 		default:
481 			break;
482 		}						/* end of switch count */
483 		timeinsert->check[count] = gtk_check_button_new();
484 		timeinsert->label[count] = gtk_label_new_with_mnemonic(temp);
485 		gtk_label_set_mnemonic_widget(GTK_LABEL(timeinsert->label[count]), timeinsert->check[count]);
486 		g_free(temp);
487 		gtk_container_add(GTK_CONTAINER(timeinsert->check[count]), GTK_WIDGET(timeinsert->label[count]));
488 		gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(timeinsert->check[count]), TRUE, TRUE, 0);
489 	}							/* end of for loop */
490 
491 	hbox = gtk_hbox_new(FALSE, 0);
492 	gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 10);
493 #if GTK_CHECK_VERSION(3,0,0)
494 	hbox = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);
495 #else
496 	hbox = gtk_hbutton_box_new();
497 #endif
498 	gtk_button_box_set_layout(GTK_BUTTON_BOX(hbox), GTK_BUTTONBOX_END);
499 	gtk_box_set_spacing(GTK_BOX(hbox), 12);
500 	gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 0);
501 
502 	ok_b = bf_stock_ok_button(G_CALLBACK(insert_time_callback), (gpointer) timeinsert);
503 	gtk_window_set_default(GTK_WINDOW(timeinsert->dialog), ok_b);
504 	cancel_b = bf_stock_cancel_button(G_CALLBACK(insert_time_cancel), (gpointer) timeinsert);
505 	gtk_box_pack_start(GTK_BOX(hbox), cancel_b, TRUE, TRUE, 0);
506 	gtk_box_pack_start(GTK_BOX(hbox), ok_b, TRUE, TRUE, 0);
507 
508 	gtk_widget_show_all(timeinsert->dialog);
509 }
510 
511 /************************************************************************/
512 /*
513 gchar *converttohex(gchar * color)
514 {
515   if (!strncasecmp(color, "black", 32)) {
516     return "#000000";
517   }
518   if (!strncasecmp(color, "maroon", 32)) {
519     return "#800000";
520   }
521   if (!strncasecmp(color, "green", 32)) {
522     return "#008000";
523   }
524   if (!strncasecmp(color, "olive", 32)) {
525     return "#808000";
526   }
527   if (!strncasecmp(color, "navy", 32)) {
528     return "#000080";
529   }
530   if (!strncasecmp(color, "purple", 32)) {
531     return "#800080";
532   }
533   if (!strncasecmp(color, "fuchsia", 32)) {
534     return "#FF00FF";
535   }
536   if (!strncasecmp(color, "teal", 32)) {
537     return "#008080";
538   }
539   if (!strncasecmp(color, "gray", 32)) {
540     return "#808080";
541   }
542   if (!strncasecmp(color, "silver", 32)) {
543     return "#C0C0C0";
544   }
545   if (!strncasecmp(color, "red", 32)) {
546     return "#FF0000";
547   }
548   if (!strncasecmp(color, "lime", 32)) {
549     return "#00FF00";
550   }
551   if (!strncasecmp(color, "yellow", 32)) {
552     return "#FFFF00";
553   }
554   if (!strncasecmp(color, "blue", 32)) {
555     return "#0000FF";
556   }
557   if (!strncasecmp(color, "aqua", 32)) {
558     return "#00FFFF";
559   }
560   if (!strncasecmp(color, "white", 32)) {
561     return "#FFFFFF";
562   }
563   return color;
564 } */
565 
566 /************************************************************************/
567 /************************************************************************/
568 /****************                                  **********************/
569 /****************  BELOW ARE ALL DIALOGS MIGRATED  **********************/
570 /****************      TO HTML_DIAG FUNCTIONS      **********************/
571 /****************                                  **********************/
572 /************************************************************************/
573 /************************************************************************/
574 
575 static void
quickanchorok_lcb(GtkWidget * widget,Thtml_diag * dg)576 quickanchorok_lcb(GtkWidget * widget, Thtml_diag * dg)
577 {
578 	gchar *thestring, *finalstring;
579 	Tbfwin *bfwin = dg->bfwin;
580 
581 	thestring = g_strdup(cap("<A"));
582 	thestring = insert_string_if_entry(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(dg->combo[2]))), cap("HREF"), thestring,
583 							   NULL);
584 	thestring = insert_string_if_combobox(GTK_COMBO_BOX(dg->combo[1]), cap("TARGET"), thestring, NULL);
585 	thestring = insert_string_if_entry(GTK_ENTRY(dg->entry[2]), cap("NAME"), thestring, NULL);
586 	thestring = insert_string_if_entry(GTK_ENTRY(dg->entry[4]), NULL, thestring, NULL);
587 	thestring = insert_string_if_entry(GTK_ENTRY(dg->entry[5]), cap("ONCLICK"), thestring, NULL);
588 	thestring = insert_string_if_entry(GTK_ENTRY(dg->entry[6]), cap("ONDBLCLICK"), thestring, NULL);
589 	thestring = insert_string_if_entry(GTK_ENTRY(dg->entry[7]), cap("ONMOUSEOVER"), thestring, NULL);
590 	thestring = insert_string_if_entry(GTK_ENTRY(dg->entry[8]), cap("ONMOUSEDOWN"), thestring, NULL);
591 	thestring = insert_string_if_entry(GTK_ENTRY(dg->entry[9]), cap("ONMOUSEMOVE"), thestring, NULL);
592 	thestring = insert_string_if_entry(GTK_ENTRY(dg->entry[10]), cap("ONMOUSEOUT"), thestring, NULL);
593 	thestring = insert_string_if_entry(GTK_ENTRY(dg->entry[11]), cap("ONMOUSEUP"), thestring, NULL);
594 	thestring = insert_string_if_entry(GTK_ENTRY(dg->entry[12]), cap("ONKEYDOWN"), thestring, NULL);
595 	thestring = insert_string_if_entry(GTK_ENTRY(dg->entry[13]), cap("ONKEYPRESS"), thestring, NULL);
596 	thestring = insert_string_if_entry(GTK_ENTRY(dg->entry[14]), cap("ONKEYUP"), thestring, NULL);
597 	thestring = insert_string_if_entry(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(dg->attrwidget[0]))), cap("CLASS"),
598 							   thestring, NULL);
599 	thestring = insert_string_if_entry(GTK_ENTRY(dg->attrwidget[1]), cap("ID"), thestring, NULL);
600 	thestring = insert_string_if_entry(GTK_ENTRY(dg->attrwidget[2]), cap("STYLE"), thestring, NULL);
601 	thestring = insert_string_if_entry(GTK_ENTRY(dg->entry[17]), cap("LANG"), thestring, NULL);
602 	thestring = insert_string_if_entry(GTK_ENTRY(dg->entry[18]), cap("TITLE"), thestring, NULL);
603 	finalstring = g_strdup_printf("%s>", thestring);
604 	g_free(thestring);
605 
606 	bfwin->session->urllist = add_entry_to_stringlist(bfwin->session->urllist, GTK_WIDGET(gtk_bin_get_child(GTK_BIN(dg->combo[2]))));
607 	bfwin->session->targetlist = add_entry_to_stringlist(bfwin->session->targetlist, GTK_WIDGET(gtk_bin_get_child(GTK_BIN(dg->combo[1]))));
608 	bfwin->session->classlist = add_entry_to_stringlist(bfwin->session->classlist, GTK_WIDGET(gtk_bin_get_child(GTK_BIN(dg->attrwidget[0]))));
609 
610 	if (dg->range.end == -1) {
611 		doc_insert_two_strings(dg->doc, finalstring, cap("</A>"));
612 	} else {
613 		doc_replace_text(dg->doc, finalstring, dg->range.pos, dg->range.end);
614 	}
615 	g_free(finalstring);
616 	html_diag_destroy_cb(NULL, dg);
617 }
618 
619 static gboolean
string_looks_like_url(gchar * string)620 string_looks_like_url(gchar *string)
621 {
622 	if (string == NULL)
623 		return FALSE;
624 	if (strchr(string, '\n')!=NULL)
625 		return FALSE;
626 	if (strchr(string, '\t')!=NULL)
627 		return FALSE;
628 	if (strchr(string, '\r')!=NULL)
629 		return FALSE;
630 	if (strncmp(string,"http://", 7)==0 ||
631 	 			strncmp(string,"https://", 8)==0 ||
632 	 			strncmp(string,"ftp://", 6)==0) {
633 	 	return TRUE;
634 	}
635 	/* look for an extension and no spaces */
636 	if (g_regex_match_simple("^[\\./a-z0-9]+\\.[a-z]{3,5}$",string,G_REGEX_CASELESS|G_REGEX_ANCHORED,0)) {
637 		/*g_print("%s matches regex\n",string);*/
638 		return TRUE;
639 	}
640 	return FALSE;
641 }
642 
643 void
quickanchor_dialog(Tbfwin * bfwin,Ttagpopup * data)644 quickanchor_dialog(Tbfwin * bfwin, Ttagpopup * data)
645 {
646 	static gchar *aitems[] = { "href", "target", "name", "onkeyup", "onclick", "ondblclick", "onmouseover", "onmousedown",
647 "onmousemove", "onmouseout", "onmouseup", "onkeydown", "onkeypress", "class", "id", "style", "lang", "title", NULL };
648 	gchar *custom = NULL;
649 	gchar *avalues[19];
650 	gchar *url=NULL;
651 	Thtml_diag *dg;
652 	gint so, eo;
653 	GList *rel_link_list = NULL, *tmplist;
654 
655 
656 	GtkWidget *noteb, *dgtable, *file_but;
657 	DEBUG_MSG("quickanchor_dialog, bfwin=%p, data=%p\n", bfwin, data);
658 	dg = html_diag_new(bfwin, _("Quick Anchor"));
659 	fill_dialogvalues(aitems, avalues, &custom, (Ttagpopup *) data, dg);
660 
661 	noteb = gtk_notebook_new();
662 	gtk_box_pack_start(GTK_BOX(dg->vbox), noteb, FALSE, FALSE, 0);
663 
664 	dgtable = generic_table_inside_notebookframe(noteb, _("Attributes"), 9,3);
665 	if (avalues[0] != NULL && avalues[0][0] != '\0') {
666 		url = g_strdup(avalues[0]);
667 	} else if (doc_get_selection(bfwin->current_document, &so, &eo)){
668 		gchar *tmp = doc_get_chars(bfwin->current_document, so, eo);
669 		/* if the current selected text is an URL, use it */
670 		if (string_looks_like_url(tmp)) {
671 			url = tmp;
672 		} else {
673 			g_free(tmp);
674 		}
675 	}
676 	rel_link_list = list_relative_document_filenames(bfwin->current_document);
677 	tmplist = duplicate_stringlist(bfwin->session->urllist, 1);
678 	rel_link_list = g_list_concat(tmplist, rel_link_list);
679 	dg->combo[2] = html_diag_combobox_with_popdown(url, rel_link_list, 1);
680 
681 	free_stringlist(rel_link_list);
682 	g_free(url);
683 	file_but = file_but_new(GTK_WIDGET(gtk_bin_get_child(GTK_BIN(dg->combo[2]))), 0, bfwin);
684 	gtk_table_attach(GTK_TABLE(dgtable), GTK_WIDGET(file_but), 2,3, 0,1, GTK_SHRINK, GTK_SHRINK, 0,0);
685 	dialog_mnemonic_label_in_table(_("_HREF:"), dg->combo[2], dgtable, 0,1, 0,1);
686 	gtk_table_attach(GTK_TABLE(dgtable), GTK_WIDGET(GTK_BIN(dg->combo[2])), 1,2, 0,1, GTK_EXPAND|GTK_FILL, GTK_SHRINK, 0,0);
687 	if (bfwin->session->targetlist == NULL) {
688 		bfwin->session->targetlist = list_from_arglist(TRUE, "_top", "_blank", "_parent", "_self", NULL);
689 	}
690 	dg->combo[1] = html_diag_combobox_with_popdown(avalues[1], bfwin->session->targetlist, 1);
691 	dialog_mnemonic_label_in_table(_("_Target:"), dg->combo[1], dgtable, 0,1, 1,2);
692 	gtk_table_attach(GTK_TABLE(dgtable), GTK_WIDGET(GTK_BIN(dg->combo[1])), 1,3, 1,2, GTK_EXPAND|GTK_FILL,GTK_SHRINK, 0,0);
693 
694 	dg->entry[2] = dialog_entry_in_table(avalues[2], dgtable, 1,3, 2,3);
695 	dialog_mnemonic_label_in_table(_("_Name:"), dg->entry[2], dgtable, 0,1, 2,3);
696 
697 	dg->entry[18] = dialog_entry_in_table(avalues[17], dgtable, 1,3, 3,4);
698 	dialog_mnemonic_label_in_table(_("Titl_e:"), dg->entry[18], dgtable, 0,1, 3,4);
699 
700 	generic_class_id_style_section(dg, 0, dgtable, 4, avalues, 13);
701 
702 	dg->entry[17] = dialog_entry_in_table(avalues[16], dgtable, 1,3, 7,8);
703 	dialog_mnemonic_label_in_table(_("_Language:"), dg->entry[17], dgtable, 0,1, 7,8);
704 
705 	dg->entry[4] = dialog_entry_in_table(custom, dgtable, 1,3, 8,9);
706 	dialog_mnemonic_label_in_table(_("Custo_m:"), dg->entry[4], dgtable, 0,1, 8,9);
707 
708 	dgtable = generic_table_inside_notebookframe(noteb, _("Events"), 10,2);
709 
710 	dg->entry[5] = dialog_entry_in_table(avalues[4], dgtable, 1,2, 0,1);
711 	dialog_mnemonic_label_in_table(_("OnClic_k:"), dg->entry[5], dgtable, 0,1, 0,1);
712 
713 	dg->entry[6] = dialog_entry_in_table(avalues[5], dgtable, 1,2, 1,2);
714 	dialog_mnemonic_label_in_table(_("OnD_blClick:"), dg->entry[6], dgtable, 0,1, 1,2);
715 
716 	dg->entry[7] = dialog_entry_in_table(avalues[6], dgtable, 1,2, 2,3);
717 	dialog_mnemonic_label_in_table(_("OnMouseO_ver:"), dg->entry[7], dgtable, 0,1, 2,3);
718 
719 	dg->entry[8] = dialog_entry_in_table(avalues[7], dgtable, 1,2, 3,4);
720 	dialog_mnemonic_label_in_table(_("OnMouse_Down:"), dg->entry[8], dgtable, 0,1, 3,4);
721 
722 	dg->entry[9] = dialog_entry_in_table(avalues[8], dgtable, 1,2, 4,5);
723 	dialog_mnemonic_label_in_table(_("OnMouse_Move:"), dg->entry[9], dgtable, 0,1, 4,5);
724 
725 	dg->entry[10] = dialog_entry_in_table(avalues[9], dgtable, 1,2, 5,6);
726 	dialog_mnemonic_label_in_table(_("OnMouseOu_t:"), dg->entry[10], dgtable, 0,1, 5,6);
727 
728 	dg->entry[11] = dialog_entry_in_table(avalues[10], dgtable, 1,2, 6,7);
729 	dialog_mnemonic_label_in_table(_("OnMouse_Up:"), dg->entry[11], dgtable, 0,1, 6,7);
730 
731 	dg->entry[12] = dialog_entry_in_table(avalues[11], dgtable, 1,2, 7,8);
732 	dialog_mnemonic_label_in_table(_("OnKeyDo_wn:"), dg->entry[12], dgtable, 0,1, 7,8);
733 
734 	dg->entry[13] = dialog_entry_in_table(avalues[12], dgtable, 1,2, 8,9);
735 	dialog_mnemonic_label_in_table(_("OnKey_Press:"), dg->entry[13], dgtable, 0,1, 8,9);
736 
737 	dg->entry[14] = dialog_entry_in_table(avalues[3], dgtable, 1,2, 9,10);
738 	dialog_mnemonic_label_in_table(_("OnKe_yUp:"), dg->entry[14], dgtable, 0,1, 9,10);
739 
740 	html_diag_finish(dg, G_CALLBACK(quickanchorok_lcb));
741 	gtk_widget_grab_focus(dg->combo[2]);
742 	if (custom)
743 		g_free(custom);
744 }
745 
746 static void
block_tag_editok_lcb(gint type,Thtml_diag * dg)747 block_tag_editok_lcb(gint type, Thtml_diag * dg)
748 {
749 	Tbfwin *bfwin = dg->bfwin;
750 	gchar *thestring = NULL, *endstring = NULL, *finalstring;
751 
752 	switch (type) {
753 	case 1:
754 		thestring = g_strdup(cap("<P"));
755 		endstring = g_strdup(cap("</P>"));
756 		break;
757 	case 2:
758 		thestring = g_strdup(cap("<DIV"));
759 		endstring = g_strdup(cap("</DIV>"));
760 		break;
761 	case 3:
762 		thestring = g_strdup(cap("<SPAN"));
763 		endstring = g_strdup(cap("</SPAN>"));
764 		break;
765 	case 4:
766 		thestring = g_strdup(cap("<H1"));
767 		endstring = g_strdup(cap("</H1>"));
768 		break;
769 	case 5:
770 		thestring = g_strdup(cap("<H2"));
771 		endstring = g_strdup(cap("</H2>"));
772 		break;
773 	case 6:
774 		thestring = g_strdup(cap("<H3"));
775 		endstring = g_strdup(cap("</H3>"));
776 		break;
777 	case 7:
778 		thestring = g_strdup(cap("<H4"));
779 		endstring = g_strdup(cap("</H4>"));
780 		break;
781 	case 8:
782 		thestring = g_strdup(cap("<H5"));
783 		endstring = g_strdup(cap("</H5>"));
784 		break;
785 	case 9:
786 		thestring = g_strdup(cap("<H6"));
787 		endstring = g_strdup(cap("</H6>"));
788 		break;
789 	}
790 
791 	thestring = insert_string_if_combobox(GTK_COMBO_BOX(dg->combo[1]), cap("ALIGN"), thestring, NULL);
792 	thestring = insert_string_if_combobox(GTK_COMBO_BOX(dg->combo[2]), cap("CLASS"), thestring, NULL);
793 	thestring = insert_string_if_entry(GTK_ENTRY(dg->entry[1]), cap("STYLE"), thestring, NULL);
794 	thestring = insert_string_if_entry(GTK_ENTRY(dg->entry[2]), cap("NAME"), thestring, NULL);
795 	thestring = insert_string_if_entry(GTK_ENTRY(dg->entry[3]), cap("ID"), thestring, NULL);
796 	thestring = insert_string_if_entry(GTK_ENTRY(dg->entry[4]), NULL, thestring, NULL);
797 	finalstring = g_strdup_printf("%s>", thestring);
798 	g_free(thestring);
799 
800 	bfwin->session->classlist = add_entry_to_stringlist(bfwin->session->classlist, GTK_WIDGET(gtk_bin_get_child(GTK_BIN(dg->combo[2]))));
801 
802 	if (dg->range.end == -1) {
803 		doc_insert_two_strings(dg->doc, finalstring, endstring);
804 	} else {
805 		doc_replace_text(dg->doc, finalstring, dg->range.pos, dg->range.end);
806 	}
807 	g_free(endstring);
808 	g_free(finalstring);
809 	html_diag_destroy_cb(NULL, dg);
810 }
811 
812 static void
p_editok_lcb(GtkWidget * widget,gpointer data)813 p_editok_lcb(GtkWidget * widget, gpointer data)
814 {
815 	block_tag_editok_lcb(1, data);
816 }
817 
818 static void
div_editok_lcb(GtkWidget * widget,gpointer data)819 div_editok_lcb(GtkWidget * widget, gpointer data)
820 {
821 	block_tag_editok_lcb(2, data);
822 }
823 
824 static void
span_editok_lcb(GtkWidget * widget,gpointer data)825 span_editok_lcb(GtkWidget * widget, gpointer data)
826 {
827 	block_tag_editok_lcb(3, data);
828 }
829 
830 static void
h1_editok_lcb(GtkWidget * widget,gpointer data)831 h1_editok_lcb(GtkWidget * widget, gpointer data)
832 {
833 	block_tag_editok_lcb(4, data);
834 }
835 
836 static void
h2_editok_lcb(GtkWidget * widget,gpointer data)837 h2_editok_lcb(GtkWidget * widget, gpointer data)
838 {
839 	block_tag_editok_lcb(5, data);
840 }
841 
842 static void
h3_editok_lcb(GtkWidget * widget,gpointer data)843 h3_editok_lcb(GtkWidget * widget, gpointer data)
844 {
845 	block_tag_editok_lcb(6, data);
846 }
847 
848 static void
h4_editok_lcb(GtkWidget * widget,gpointer data)849 h4_editok_lcb(GtkWidget * widget, gpointer data)
850 {
851 	block_tag_editok_lcb(7, data);
852 }
853 
854 static void
h5_editok_lcb(GtkWidget * widget,gpointer data)855 h5_editok_lcb(GtkWidget * widget, gpointer data)
856 {
857 	block_tag_editok_lcb(8, data);
858 }
859 
860 static void
h6_editok_lcb(GtkWidget * widget,gpointer data)861 h6_editok_lcb(GtkWidget * widget, gpointer data)
862 {
863 	block_tag_editok_lcb(9, data);
864 }
865 
866 void
block_tag_edit_dialog(Tbfwin * bfwin,gint type,Ttagpopup * data)867 block_tag_edit_dialog(Tbfwin * bfwin, gint type, Ttagpopup * data)
868 {
869 	gchar *labeltext;
870 	GList *popuplist = NULL;
871 	GtkWidget *dgtable, *but;
872 
873 	static gchar *tagitems[] = { "align", "class", "style", "name", "id", NULL };
874 	gchar *tagvalues[6];
875 	gchar *custom = NULL;
876 	Thtml_diag *dg;
877 
878 	switch (type) {
879 	case 1:
880 		labeltext = g_strdup(_("Paragraph"));
881 		break;
882 	case 2:
883 		labeltext = g_strdup(_("Div"));
884 		break;
885 	case 3:
886 		labeltext = g_strdup(_("Span"));
887 		break;
888 	case 4:
889 		labeltext = g_strdup(_("Heading 1"));
890 		break;
891 	case 5:
892 		labeltext = g_strdup(_("Heading 2"));
893 		break;
894 	case 6:
895 		labeltext = g_strdup(_("Heading 3"));
896 		break;
897 	case 7:
898 		labeltext = g_strdup(_("Heading 4"));
899 		break;
900 	case 8:
901 		labeltext = g_strdup(_("Heading 5"));
902 		break;
903 	case 9:
904 		labeltext = g_strdup(_("Heading 6"));
905 		break;
906 	default:
907 		labeltext = g_strdup("");
908 		break;
909 	}
910 	dg = html_diag_new(bfwin, labeltext);
911 	g_free(labeltext);
912 	fill_dialogvalues(tagitems, tagvalues, &custom, (Ttagpopup *) data, dg);
913 
914 	dgtable = html_diag_table_in_vbox(dg, 5,4);
915 
916 	popuplist = g_list_append(NULL, "left");
917 	popuplist = g_list_append(popuplist, "center");
918 	popuplist = g_list_append(popuplist, "right");
919 	dg->combo[1] = html_diag_combobox_with_popdown(tagvalues[0], popuplist, 1);
920 	g_list_free(popuplist);
921 	dialog_mnemonic_label_in_table(_("Ali_gn:"), dg->combo[1], dgtable, 0,1, 0,1);
922 	gtk_table_attach_defaults(GTK_TABLE(dgtable), GTK_WIDGET(GTK_BIN(dg->combo[1])), 1,2, 0,1);
923 
924 	dg->combo[2] = html_diag_combobox_with_popdown(tagvalues[1], bfwin->session->classlist, 1);
925 	dialog_mnemonic_label_in_table(_("Cl_ass:"), dg->combo[2], dgtable, 0,1, 1,2);
926 	gtk_table_attach_defaults(GTK_TABLE(dgtable), GTK_WIDGET(GTK_BIN(dg->combo[2])), 1,2, 1,2);
927 
928 	dg->entry[1] = dialog_entry_in_table(tagvalues[2], dgtable, 1,3, 2,3);
929 	dialog_mnemonic_label_in_table(_("St_yle:"), dg->entry[1], dgtable, 0,1, 2,3);
930 
931 	but = style_but_new(dg->entry[1], dg->dialog);
932 	gtk_table_attach(GTK_TABLE(dgtable), but, 3,4, 2,3, GTK_SHRINK, GTK_SHRINK, 0,0);
933 
934 	dg->entry[2] = dialog_entry_in_table(tagvalues[3], dgtable, 3,4, 0,1);
935 	dialog_mnemonic_label_in_table(_("_Name:"), dg->entry[2], dgtable, 2,3, 0,1);
936 
937 	dg->entry[3] = dialog_entry_in_table(tagvalues[4], dgtable, 3,4, 1,2);
938 	dialog_mnemonic_label_in_table(_("_ID:"), dg->entry[3], dgtable, 2,3, 1,2);
939 
940 	dg->entry[4] = dialog_entry_in_table(custom, dgtable, 1,4, 3,4);
941 	dialog_mnemonic_label_in_table(_("Custo_m:"), dg->entry[4], dgtable, 0,1, 3,4);
942 
943 	switch (type) {
944 	case 1:
945 		html_diag_finish(dg, G_CALLBACK(p_editok_lcb));
946 		break;
947 	case 2:
948 		html_diag_finish(dg, G_CALLBACK(div_editok_lcb));
949 		break;
950 	case 3:
951 		html_diag_finish(dg, G_CALLBACK(span_editok_lcb));
952 		break;
953 	case 4:
954 		html_diag_finish(dg, G_CALLBACK(h1_editok_lcb));
955 		break;
956 	case 5:
957 		html_diag_finish(dg, G_CALLBACK(h2_editok_lcb));
958 		break;
959 	case 6:
960 		html_diag_finish(dg, G_CALLBACK(h3_editok_lcb));
961 		break;
962 	case 7:
963 		html_diag_finish(dg, G_CALLBACK(h4_editok_lcb));
964 		break;
965 	case 8:
966 		html_diag_finish(dg, G_CALLBACK(h5_editok_lcb));
967 		break;
968 	case 9:
969 		html_diag_finish(dg, G_CALLBACK(h6_editok_lcb));
970 		break;
971 	}
972 	if (custom)
973 		g_free(custom);
974 }
975 
976 void
p_dialog(Tbfwin * bfwin,Ttagpopup * data)977 p_dialog(Tbfwin * bfwin, Ttagpopup * data)
978 {
979 	block_tag_edit_dialog(bfwin, 1, data);
980 }
981 
982 void
div_dialog(Tbfwin * bfwin,Ttagpopup * data)983 div_dialog(Tbfwin * bfwin, Ttagpopup * data)
984 {
985 	block_tag_edit_dialog(bfwin, 2, data);
986 }
987 
988 void
span_dialog(Tbfwin * bfwin,Ttagpopup * data)989 span_dialog(Tbfwin * bfwin, Ttagpopup * data)
990 {
991 	block_tag_edit_dialog(bfwin, 3, data);
992 }
993 
994 void
h1_dialog(Tbfwin * bfwin,Ttagpopup * data)995 h1_dialog(Tbfwin * bfwin, Ttagpopup * data)
996 {
997 	block_tag_edit_dialog(bfwin, 4, data);
998 }
999 
1000 void
h2_dialog(Tbfwin * bfwin,Ttagpopup * data)1001 h2_dialog(Tbfwin * bfwin, Ttagpopup * data)
1002 {
1003 	block_tag_edit_dialog(bfwin, 5, data);
1004 }
1005 
1006 void
h3_dialog(Tbfwin * bfwin,Ttagpopup * data)1007 h3_dialog(Tbfwin * bfwin, Ttagpopup * data)
1008 {
1009 	block_tag_edit_dialog(bfwin, 6, data);
1010 }
1011 
1012 void
h4_dialog(Tbfwin * bfwin,Ttagpopup * data)1013 h4_dialog(Tbfwin * bfwin, Ttagpopup * data)
1014 {
1015 	block_tag_edit_dialog(bfwin, 7, data);
1016 }
1017 
1018 void
h5_dialog(Tbfwin * bfwin,Ttagpopup * data)1019 h5_dialog(Tbfwin * bfwin, Ttagpopup * data)
1020 {
1021 	block_tag_edit_dialog(bfwin, 8, data);
1022 }
1023 
1024 void
h6_dialog(Tbfwin * bfwin,Ttagpopup * data)1025 h6_dialog(Tbfwin * bfwin, Ttagpopup * data)
1026 {
1027 	block_tag_edit_dialog(bfwin, 9, data);
1028 }
1029 
1030 
1031 
1032 static void
quickruleok_lcb(GtkWidget * widget,Thtml_diag * dg)1033 quickruleok_lcb(GtkWidget * widget, Thtml_diag * dg)
1034 {
1035 	gchar *thestring, *finalstring;
1036 
1037 	thestring = g_strdup(cap("<HR"));
1038 	thestring = insert_string_if_combobox(GTK_COMBO_BOX(dg->combo[1]), cap("ALIGN"), thestring, NULL);
1039 	thestring = insert_integer_if_spin(dg->spin[1], cap("SIZE"), thestring, FALSE, 1);
1040 	thestring = insert_integer_if_spin(dg->spin[2], cap("WIDTH"), thestring,
1041 							   gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dg->check[1])),
1042 							   gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dg->check[1])) ? 100 : 0);
1043 	thestring = insert_attr_if_checkbox(dg->check[2], get_curlang_option_value(dg->bfwin, lang_is_XHTML) ? cap("NOSHADE=\"noshade\"") : cap("NOSHADE"), thestring);
1044 	thestring = insert_string_if_entry(GTK_ENTRY(dg->entry[1]), NULL, thestring, NULL);
1045 	finalstring = g_strdup_printf(get_curlang_option_value(dg->bfwin, self_close_singleton_tags) ? "%s />" : "%s>", thestring);
1046 	g_free(thestring);
1047 
1048 	if (dg->range.end == -1) {
1049 		doc_insert_two_strings(dg->doc, finalstring, NULL);
1050 	} else {
1051 		doc_replace_text(dg->doc, finalstring, dg->range.pos, dg->range.end);
1052 	}
1053 
1054 	g_free(finalstring);
1055 	html_diag_destroy_cb(NULL, dg);
1056 }
1057 
1058 void
quickrule_dialog(Tbfwin * bfwin,Ttagpopup * data)1059 quickrule_dialog(Tbfwin * bfwin, Ttagpopup * data)
1060 {
1061 	GList *popdownlist = NULL;
1062 
1063 	static gchar *hritems[] = { "align", "size", "width", "noshade", NULL };
1064 	gchar *hrvalues[5];
1065 	gchar *custom = NULL;
1066 	Thtml_diag *dg;
1067 	GtkWidget *dgtable;
1068 	GtkAdjustment *dgadj;
1069 
1070 	dg = html_diag_new(bfwin, _("Horizontal Rule"));
1071 	fill_dialogvalues(hritems, hrvalues, &custom, (Ttagpopup *) data, dg);
1072 
1073 	dgtable = html_diag_table_in_vbox(dg, 5, 10);
1074 	gtk_table_set_row_spacings(GTK_TABLE(dgtable), 12);
1075 
1076 	popdownlist = g_list_insert(popdownlist, "center", 0);
1077 	popdownlist = g_list_insert(popdownlist, "left", 1);
1078 	popdownlist = g_list_insert(popdownlist, "right", 2);
1079 	dg->combo[1] = html_diag_combobox_with_popdown(hrvalues[0], popdownlist, 1);
1080 	g_list_free(popdownlist);
1081 	dialog_mnemonic_label_in_table(_("_Align:"), dg->combo[1], dgtable, 0,1, 0,1);
1082 	gtk_table_attach_defaults(GTK_TABLE(dgtable), GTK_WIDGET(dg->combo[1]), 1,4, 0,1);
1083 
1084 	dgadj = (GtkAdjustment *) gtk_adjustment_new((gfloat) 1, 0.0, 200.0, 1.0, 5.0, 0.0);
1085 	dg->spin[1] = gtk_spin_button_new(dgadj, 1,0);
1086 	/* gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spin1), 1); */
1087 	gtk_table_attach_defaults(GTK_TABLE(dgtable), dg->spin[1], 1,2, 1,2);
1088 	dialog_mnemonic_label_in_table(_("_Height:"), dg->spin[1], dgtable, 0,1, 1,2);
1089 	parse_integer_for_dialog(hrvalues[1], dg->spin[1], NULL, NULL);
1090 
1091 	dgadj = (GtkAdjustment *) gtk_adjustment_new((gfloat) 50, 0.0, 600.0, 1.0, 5.0, 0.0);
1092 	dg->spin[2] = gtk_spin_button_new(dgadj, 1,0);
1093 	/*   gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spin2), 1); */
1094 	dialog_mnemonic_label_in_table(_("_Width:"), dg->spin[2], dgtable, 0,1, 2,3);
1095 	gtk_table_attach_defaults(GTK_TABLE(dgtable), dg->spin[2], 1,2, 2,3);
1096 
1097 	dg->check[1] = gtk_check_button_new_with_mnemonic(_("Is _percent"));
1098 	gtk_table_attach_defaults(GTK_TABLE(dgtable), dg->check[1], 3,4, 2,3);
1099 
1100 	parse_integer_for_dialog(hrvalues[2], dg->spin[2], NULL, dg->check[1]);
1101 
1102 	dg->check[2] = gtk_check_button_new_with_mnemonic(_("No _shading"));
1103 	gtk_table_attach_defaults(GTK_TABLE(dgtable), dg->check[2], 1,2, 3,4);
1104 	parse_existence_for_dialog(hrvalues[3], dg->check[2]);
1105 
1106 	dg->entry[1] = dialog_entry_in_table(custom, dgtable, 1,10, 4,5);
1107 	dialog_mnemonic_label_in_table(_("Custo_m:"), dg->entry[1], dgtable, 0,1, 4,5);
1108 
1109 	html_diag_finish(dg, G_CALLBACK(quickruleok_lcb));
1110 
1111 	if (custom)
1112 		g_free(custom);
1113 }
1114 
1115 static void
bodyok_lcb(GtkWidget * widget,Thtml_diag * dg)1116 bodyok_lcb(GtkWidget * widget, Thtml_diag * dg)
1117 {
1118 	Tbfwin *bfwin = dg->bfwin;
1119 	gchar *thestring, *finalstring;
1120 
1121 	thestring = g_strdup(cap("<BODY"));
1122 	if (dg->entry[1]) {
1123 		thestring = insert_string_if_entry(GTK_ENTRY(dg->entry[1]), cap("BACKGROUND"), thestring, NULL);
1124 		thestring = insert_string_if_combobox(GTK_COMBO_BOX(dg->combo[1]), cap("BGCOLOR"), thestring, NULL);
1125 		thestring = insert_string_if_combobox(GTK_COMBO_BOX(dg->combo[2]), cap("TEXT"), thestring, NULL);
1126 		thestring = insert_string_if_combobox(GTK_COMBO_BOX(dg->combo[3]), cap("LINK"), thestring, NULL);
1127 		thestring = insert_string_if_combobox(GTK_COMBO_BOX(dg->combo[4]), cap("VLINK"), thestring, NULL);
1128 		thestring = insert_string_if_combobox(GTK_COMBO_BOX(dg->combo[5]), cap("ALINK"), thestring, NULL);
1129 	}
1130 	thestring = insert_string_if_entry(GTK_ENTRY(dg->entry[3]), cap("STYLE"), thestring, NULL);
1131 	thestring = insert_string_if_combobox(GTK_COMBO_BOX(dg->combo[6]), cap("CLASS"), thestring, NULL);
1132 	thestring = insert_string_if_entry(GTK_ENTRY(dg->entry[4]), cap("ID"), thestring, NULL);
1133 	thestring = insert_string_if_entry(GTK_ENTRY(dg->entry[5]), cap("LANG"), thestring, NULL);
1134 	thestring = insert_string_if_entry(GTK_ENTRY(dg->entry[6]), cap("ONLOAD"), thestring, NULL);
1135 	thestring = insert_string_if_entry(GTK_ENTRY(dg->entry[7]), cap("ONUNLOAD"), thestring, NULL);
1136 
1137 	thestring = insert_string_if_entry(GTK_ENTRY(dg->entry[2]), NULL, thestring, NULL);
1138 	finalstring = g_strconcat(thestring, ">\n", NULL);
1139 	g_free(thestring);
1140 
1141 	if (dg->entry[1]) {
1142 		bfwin->session->colorlist = 	add_entry_to_stringlist(bfwin->session->colorlist, 	GTK_WIDGET(gtk_bin_get_child(GTK_BIN(dg->combo[1]))));
1143 		bfwin->session->colorlist = 	add_entry_to_stringlist(bfwin->session->colorlist, 	GTK_WIDGET(gtk_bin_get_child(GTK_BIN(dg->combo[2]))));
1144 		bfwin->session->colorlist = 	add_entry_to_stringlist(bfwin->session->colorlist, 	GTK_WIDGET(gtk_bin_get_child(GTK_BIN(dg->combo[3]))));
1145 		bfwin->session->colorlist = 	add_entry_to_stringlist(bfwin->session->colorlist, 	GTK_WIDGET(gtk_bin_get_child(GTK_BIN(dg->combo[4]))));
1146 		bfwin->session->colorlist = 	add_entry_to_stringlist(bfwin->session->colorlist, 	GTK_WIDGET(gtk_bin_get_child(GTK_BIN(dg->combo[5]))));
1147 	}
1148 	bfwin->session->classlist = add_entry_to_stringlist(bfwin->session->classlist, GTK_WIDGET(gtk_bin_get_child(GTK_BIN(dg->combo[6]))));
1149 
1150 	if (dg->range.end == -1) {
1151 		doc_insert_two_strings(dg->doc, finalstring, cap("</BODY>"));
1152 	} else {
1153 		doc_replace_text(dg->doc, finalstring, dg->range.pos, dg->range.end);
1154 	}
1155 
1156 	g_free(finalstring);
1157 	html_diag_destroy_cb(NULL, dg);
1158 }
1159 
1160 void
body_dialog(Tbfwin * bfwin,Ttagpopup * data)1161 body_dialog(Tbfwin * bfwin, Ttagpopup * data)
1162 {
1163 	static gchar *bodyitems[] = { "background", "bgcolor", "text", "link", "vlink", "alink", "style", "class", "id", "language",
1164 "onload", "onunload", NULL
1165 	};
1166 
1167 	GtkWidget *color_but, *file_but, *dgtable[3], *stylebut, *noteb, *hbox, *vbox2, *frame;
1168 	gchar *bodyvalues[13];
1169 	gchar *custom = NULL;
1170 	Thtml_diag *dg;
1171 
1172 	dg = html_diag_new(bfwin, _("Body"));
1173 	fill_dialogvalues(bodyitems, bodyvalues, &custom, (Ttagpopup *) data, dg);
1174 
1175 	noteb = gtk_notebook_new();
1176 	gtk_box_pack_start(GTK_BOX(dg->vbox), noteb, FALSE, FALSE, 0);
1177 
1178 	/* Options Tab */
1179 	frame = bf_generic_frame_new(NULL, GTK_SHADOW_NONE, 12);
1180 	gtk_notebook_append_page(GTK_NOTEBOOK(noteb), frame, gtk_label_new(_("Options")));
1181 	dgtable[1] = gtk_table_new(8, 3, FALSE);
1182 	gtk_table_set_row_spacings(GTK_TABLE(dgtable[1]), 6);
1183 	gtk_table_set_col_spacings(GTK_TABLE(dgtable[1]), 12);
1184 	gtk_container_add(GTK_CONTAINER(frame), dgtable[1]);
1185 
1186 	dg->entry[3] = dialog_entry_in_table(bodyvalues[6], dgtable[1], 1,2, 0,1);
1187 	dialog_mnemonic_label_in_table(_("St_yle:"), dg->entry[3], dgtable[1], 0,1, 0,1);
1188 
1189 	stylebut = style_but_new(dg->entry[3], dg->dialog);
1190 	gtk_table_attach(GTK_TABLE(dgtable[1]), stylebut, 2, 3, 0, 1, GTK_SHRINK, GTK_SHRINK, 0,0);
1191 
1192 	dg->combo[6] = html_diag_combobox_with_popdown(bodyvalues[7], bfwin->session->classlist, 1);
1193 	gtk_table_attach_defaults(GTK_TABLE(dgtable[1]), dg->combo[6], 1,2, 1,2);
1194 	dialog_mnemonic_label_in_table(_("Cl_ass:"), dg->combo[6], dgtable[1], 0,1, 1,2);
1195 
1196 	dg->entry[4] = dialog_entry_in_table(bodyvalues[8], dgtable[1], 1,2, 2,3);
1197 	dialog_mnemonic_label_in_table(_("_ID:"), dg->entry[4], dgtable[1], 0,1, 2,3);
1198 
1199 	dg->entry[5] = dialog_entry_in_table(bodyvalues[9], dgtable[1], 1,2, 3,4);
1200 	dialog_mnemonic_label_in_table(_("_Language:"), dg->entry[5], dgtable[1], 0,1, 3,4);
1201 
1202 	dg->entry[2] = dialog_entry_in_table(custom, dgtable[1], 1,3, 4,5);
1203 	dialog_mnemonic_label_in_table(_("Custo_m:"), dg->entry[2], dgtable[1], 0,1, 4,5);
1204 
1205 	/* Events Tab */
1206 	frame = bf_generic_frame_new(NULL, GTK_SHADOW_NONE, 12);
1207 	gtk_notebook_append_page(GTK_NOTEBOOK(noteb), frame, gtk_label_new(_("Events")));
1208 
1209 	vbox2 = gtk_vbox_new(FALSE, 12);
1210 	gtk_container_add(GTK_CONTAINER(frame), vbox2);
1211 
1212 	hbox = gtk_hbox_new(FALSE, 12);
1213 	dg->entry[6] = dialog_entry_labeled(bodyvalues[10], _("On _Load:"), hbox, 0);
1214 	gtk_box_pack_start(GTK_BOX(vbox2), hbox, FALSE, FALSE, 0);
1215 
1216 	hbox = gtk_hbox_new(FALSE, 12);
1217 	dg->entry[7] = dialog_entry_labeled(bodyvalues[11], _("On _Unload:"), hbox, 0);
1218 	gtk_box_pack_start(GTK_BOX(vbox2), hbox, FALSE, FALSE, 0);
1219 
1220 	/* Depreciated options tab */
1221 	if (!(!main_v->props.allow_dep && !data)) {
1222 		frame = bf_generic_frame_new(NULL, GTK_SHADOW_NONE, 12);
1223 		gtk_notebook_append_page(GTK_NOTEBOOK(noteb), frame, gtk_label_new(_("Depreciated options")));
1224 		dgtable[0] = gtk_table_new(6, 3, FALSE);
1225 		gtk_table_set_row_spacings(GTK_TABLE(dgtable[0]), 6);
1226 		gtk_table_set_col_spacings(GTK_TABLE(dgtable[0]), 12);
1227 		gtk_container_add(GTK_CONTAINER(frame), dgtable[0]);
1228 
1229 		dg->entry[1] = dialog_entry_in_table(bodyvalues[0], dgtable[0], 1,2, 0,1);
1230 		file_but = file_but_new(dg->entry[1], 0, bfwin);
1231 		gtk_table_attach(GTK_TABLE(dgtable[0]), GTK_WIDGET(file_but), 2,3, 0,1, GTK_FILL, GTK_FILL, 0,0);
1232 		dialog_mnemonic_label_in_table(_("Background _Image:"), dg->entry[1], dgtable[0], 0, 1, 			 0,1);
1233 
1234 		dg->combo[1] = html_diag_combobox_with_popdown(bodyvalues[1], bfwin->session->colorlist, 1);
1235 		color_but = color_but_new(gtk_bin_get_child(GTK_BIN(dg->combo[1])), dg->dialog);
1236 		gtk_table_attach(GTK_TABLE(dgtable[0]), color_but, 2,3, 1,2, GTK_FILL, GTK_FILL, 0,0);
1237 		gtk_table_attach_defaults(GTK_TABLE(dgtable[0]), dg->combo[1], 1,2, 1,2);
1238 		dialog_mnemonic_label_in_table(_("Back_ground Color:"), dg->combo[1], dgtable[0], 0, 1, 			 1,2);
1239 
1240 		dg->combo[2] = html_diag_combobox_with_popdown(bodyvalues[2], bfwin->session->colorlist, 1);
1241 		color_but = color_but_new(gtk_bin_get_child(GTK_BIN(dg->combo[2])), dg->dialog);
1242 		gtk_table_attach(GTK_TABLE(dgtable[0]), color_but, 2,3, 2,3, GTK_FILL, GTK_FILL, 0,0);
1243 		gtk_table_attach_defaults(GTK_TABLE(dgtable[0]), dg->combo[2], 1,2, 2,3);
1244 		dialog_mnemonic_label_in_table(_("_Text Color:"), dg->combo[2], dgtable[0], 0,1, 2,3);
1245 
1246 		dg->combo[3] = html_diag_combobox_with_popdown(bodyvalues[3], bfwin->session->colorlist, 1);
1247 		color_but = color_but_new(gtk_bin_get_child(GTK_BIN(dg->combo[3])), dg->dialog);
1248 		gtk_table_attach(GTK_TABLE(dgtable[0]), color_but, 2,3, 3,4, GTK_FILL, GTK_FILL, 0,0);
1249 		gtk_table_attach_defaults(GTK_TABLE(dgtable[0]), dg->combo[3], 1,2, 3,4);
1250 		dialog_mnemonic_label_in_table(_("_Link Color:"), dg->combo[3], dgtable[0], 0,1, 3,4);
1251 
1252 		dg->combo[4] = html_diag_combobox_with_popdown(bodyvalues[4], bfwin->session->colorlist, 1);
1253 		color_but = color_but_new(gtk_bin_get_child(GTK_BIN(dg->combo[4])), dg->dialog);
1254 		gtk_table_attach(GTK_TABLE(dgtable[0]), color_but, 2,3, 4,5, GTK_FILL, GTK_FILL, 0,0);
1255 		gtk_table_attach_defaults(GTK_TABLE(dgtable[0]), dg->combo[4], 1,2, 4,5);
1256 		dialog_mnemonic_label_in_table(_("_Visited Link Color:"), dg->combo[4], dgtable[0], 0, 			 1, 4,5);
1257 
1258 		dg->combo[5] = html_diag_combobox_with_popdown(bodyvalues[5], bfwin->session->colorlist, 1);
1259 		color_but = color_but_new(gtk_bin_get_child(GTK_BIN(dg->combo[5])), dg->dialog);
1260 		gtk_table_attach(GTK_TABLE(dgtable[0]), color_but, 2,3, 5,6, GTK_FILL, GTK_FILL, 0,0);
1261 		gtk_table_attach_defaults(GTK_TABLE(dgtable[0]), dg->combo[5], 1,2, 5,6);
1262 		dialog_mnemonic_label_in_table(_("_Active Link Color:"), dg->combo[5], dgtable[0], 0, 1, 			 5,6);
1263 
1264 	} else {
1265 		dg->combo[1] = NULL;
1266 		dg->combo[2] = NULL;
1267 		dg->combo[3] = NULL;
1268 		dg->combo[4] = NULL;
1269 		dg->combo[5] = NULL;
1270 		dg->entry[1] = NULL;
1271 	}
1272 
1273 	html_diag_finish(dg, G_CALLBACK(bodyok_lcb));
1274 
1275 	if (custom)
1276 		g_free(custom);
1277 }
1278 
1279 static void
metaok_lcb(GtkWidget * widget,Thtml_diag * dg)1280 metaok_lcb(GtkWidget * widget, Thtml_diag * dg)
1281 {
1282 	gchar *thestring, *finalstring;
1283 
1284 	thestring = g_strdup(cap("<META"));
1285 	thestring = insert_string_if_combobox(GTK_COMBO_BOX(dg->combo[1]), cap("HTTP-EQUIV"), thestring, NULL);
1286 	thestring = insert_string_if_combobox(GTK_COMBO_BOX(dg->combo[2]), cap("NAME"), thestring, NULL);
1287 	thestring = insert_string_if_entry(GTK_ENTRY(dg->entry[1]), cap("CONTENT"), thestring, NULL);
1288 	thestring = insert_string_if_entry(GTK_ENTRY(dg->entry[2]), cap("LANG"), thestring, NULL);
1289 	if (get_curlang_option_value(dg->bfwin, lang_is_XHTML)) {
1290 		thestring = insert_string_if_entry(GTK_ENTRY(dg->entry[2]), cap("XML:LANG"), thestring, NULL);
1291 	}
1292 	thestring = insert_string_if_entry(GTK_ENTRY(dg->entry[3]), cap("SCHEME"), thestring, NULL);
1293 	thestring = insert_string_if_entry(GTK_ENTRY(dg->entry[4]), NULL, thestring, NULL);
1294 	finalstring = g_strconcat(thestring, get_curlang_option_value(dg->bfwin, self_close_singleton_tags) ? " />" : ">", NULL);
1295 	g_free(thestring);
1296 
1297 	if (dg->range.end == -1) {
1298 		doc_insert_two_strings(dg->doc, finalstring, NULL);
1299 	} else {
1300 		doc_replace_text(dg->doc, finalstring, dg->range.pos, dg->range.end);
1301 	}
1302 	g_free(finalstring);
1303 	html_diag_destroy_cb(NULL, dg);
1304 }
1305 
1306 
1307 void
meta_dialog(Tbfwin * bfwin,Ttagpopup * data)1308 meta_dialog(Tbfwin * bfwin, Ttagpopup * data)
1309 {
1310 	GList *popuplist = NULL;
1311 
1312 	static gchar *tagitems[] = { "http-equiv", "name", "content", "lang", "scheme", NULL };
1313 	gchar *tagvalues[6];
1314 	gchar *custom = NULL;
1315 	Thtml_diag *dg;
1316 	GtkWidget *dgtable;
1317 
1318 	dg = html_diag_new(bfwin, _("Meta"));
1319 	fill_dialogvalues(tagitems, tagvalues, &custom, (Ttagpopup *) data, dg);
1320 
1321 	dgtable = html_diag_table_in_vbox(dg, 5, 10);
1322 	popuplist = list_from_arglist(FALSE, "abstract", "audience", "author", "copyright", "date", "description",
1323 						  "generator", "keywords", "page-topic", "page-type", "publisher", "revisit-after",
1324 						  "robots", NULL);
1325 	dg->combo[2] = html_diag_combobox_with_popdown(tagvalues[1], popuplist, 1);
1326 	dialog_mnemonic_label_in_table(_("_Name:"), dg->combo[2], dgtable, 0,1, 0,1);
1327 	gtk_table_attach_defaults(GTK_TABLE(dgtable), GTK_WIDGET(GTK_BIN(dg->combo[2])), 1,10, 0,1);
1328 	g_list_free(popuplist);
1329 
1330 	/* extra field for Dublin Core meta tags: DC.foo ? */
1331 	popuplist = list_from_arglist(FALSE, "expires", "refresh", "content-encoding", "content-location",
1332 						  "content-language", "content-style-type", "content-script-type", "content-type",
1333 						  "ext-cache", "cache-control", "pragma", "set-cookie", "PICS-Label", NULL);
1334 	dg->combo[1] = html_diag_combobox_with_popdown(tagvalues[0], popuplist, 1);
1335 	dialog_mnemonic_label_in_table(_("_HTTP-EQUIV:"), dg->combo[1], dgtable, 0,1, 1,2);
1336 	gtk_table_attach_defaults(GTK_TABLE(dgtable), GTK_WIDGET(GTK_BIN(dg->combo[1])), 1,10, 1,2);
1337 	g_list_free(popuplist);
1338 
1339 	dg->entry[1] = dialog_entry_in_table(tagvalues[2], dgtable, 1,10, 2,3);
1340 	dialog_mnemonic_label_in_table(_("Con_tent:"), dg->entry[1], dgtable, 0,1, 2,3);
1341 
1342 	dg->entry[2] = dialog_entry_in_table(tagvalues[3], dgtable, 1,10, 3,4);
1343 	dialog_mnemonic_label_in_table(_("_Language:"), dg->entry[2], dgtable, 0,1, 3,4);
1344 
1345 	dg->entry[3] = dialog_entry_in_table(tagvalues[4], dgtable, 1,10, 4,5);
1346 	dialog_mnemonic_label_in_table(_("_Scheme:"), dg->entry[3], dgtable, 0,1, 4,5);
1347 
1348 	dg->entry[4] = dialog_entry_in_table(custom, dgtable, 1,10, 5,6);
1349 	dialog_mnemonic_label_in_table(_("Custo_m:"), dg->entry[4], dgtable, 0,1, 5,6);
1350 
1351 	html_diag_finish(dg, G_CALLBACK(metaok_lcb));
1352 	if (custom)
1353 		g_free(custom);
1354 }
1355 
1356 static void
generalfontdialog_lcb(gint type,GtkWidget * widget,Thtml_diag * dg)1357 generalfontdialog_lcb(gint type, GtkWidget * widget, Thtml_diag * dg)
1358 {
1359 	gchar *thestring, *finalstring;
1360 
1361 	switch (type) {
1362 	case 1:
1363 		thestring = g_strdup(cap("<FONT"));
1364 		break;
1365 	case 2:
1366 		thestring = g_strdup(cap("<BASEFONT"));
1367 		break;
1368 	default:
1369 		DEBUG_MSG_C("uh-oh: generalfontdialog_lcb, unknown action %d\n", type);
1370 		g_return_if_reached();
1371 		break;
1372 	}
1373 	if (strlen(gtk_entry_get_text(GTK_ENTRY(dg->spin[1])))) {
1374 		gchar *sizecombo, *tmpstr;
1375 		sizecombo = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(dg->combo[1]));
1376 		if (strlen(sizecombo)) {
1377 			tmpstr = g_strconcat(thestring, cap(" size=\"")
1378 								 , sizecombo, gtk_entry_get_text(GTK_ENTRY(GTK_SPIN_BUTTON(dg->spin[1])))
1379 								 , "\"", NULL);
1380 		} else {
1381 			tmpstr = g_strconcat(thestring, cap(" size=\"")
1382 								 , gtk_entry_get_text(GTK_ENTRY(GTK_SPIN_BUTTON(dg->spin[1])))
1383 								 , "\"", NULL);
1384 		}
1385 		g_free(thestring);
1386 		thestring = tmpstr;
1387 		g_free(sizecombo);
1388 	}
1389 	thestring = insert_string_if_combobox(GTK_COMBO_BOX(dg->combo[2]), cap("COLOR"), thestring, NULL);
1390 	thestring = insert_string_if_combobox(GTK_COMBO_BOX(dg->combo[3]), cap("FACE"), thestring, NULL);
1391 	thestring = insert_string_if_entry(GTK_ENTRY(dg->entry[1]), NULL, thestring, NULL);
1392 	finalstring = g_strconcat(thestring, ">", NULL);
1393 	g_free(thestring);
1394 
1395 	if (dg->range.end == -1) {
1396 		doc_insert_two_strings(dg->doc, finalstring, cap("</FONT>"));
1397 	} else {
1398 		doc_replace_text(dg->doc, finalstring, dg->range.pos, dg->range.end);
1399 	}
1400 	g_free(finalstring);
1401 	html_diag_destroy_cb(NULL, dg);
1402 }
1403 
1404 static void
fontok_lcb(GtkWidget * widget,Thtml_diag * dg)1405 fontok_lcb(GtkWidget * widget, Thtml_diag * dg)
1406 {
1407 	generalfontdialog_lcb(1, widget, dg);
1408 }
1409 
1410 static void
basefontok_lcb(GtkWidget * widget,Thtml_diag * dg)1411 basefontok_lcb(GtkWidget * widget, Thtml_diag * dg)
1412 {
1413 	generalfontdialog_lcb(2, widget, dg);
1414 }
1415 
1416 static void
generalfontdialog_cb(gint type,Tbfwin * bfwin,Ttagpopup * data)1417 generalfontdialog_cb(gint type, Tbfwin * bfwin, Ttagpopup * data)
1418 {
1419 	GList *popdownlist = NULL;
1420 	GtkWidget *color_but;
1421 
1422 	static gchar *tagitems[] = { "size", "face", "color", NULL };
1423 	gchar *tagvalues[4];
1424 	gchar *custom = NULL;
1425 	Thtml_diag *dg;
1426 	GtkWidget *dgtable;
1427 
1428 	switch (type) {
1429 	case 1:
1430 		dg = html_diag_new(bfwin, _("Font"));
1431 		break;
1432 	case 2:
1433 		dg = html_diag_new(bfwin, _("Base Font"));
1434 		break;
1435 	default:
1436 		return;
1437 		break;
1438 	}
1439 	fill_dialogvalues(tagitems, tagvalues, &custom, (Ttagpopup *) data, dg);
1440 
1441 	dgtable = html_diag_table_in_vbox(dg, 3, 10);
1442 
1443 	popdownlist = g_list_insert(popdownlist, "+", 0);
1444 	popdownlist = g_list_insert(popdownlist, "-", 1);
1445 	popdownlist = g_list_insert(popdownlist, "", 2);
1446 	dg->combo[1] = html_diag_combobox_with_popdown("", popdownlist, 0);
1447 	g_list_free(popdownlist);
1448 	gtk_table_attach_defaults(GTK_TABLE(dgtable), gtk_label_new(_("Size")), 0,1, 0,1);
1449 	gtk_table_attach_defaults(GTK_TABLE(dgtable), GTK_WIDGET(GTK_BIN(dg->combo[1])), 1,2, 0,1);
1450 	dg->spin[1] = spinbut_with_value(NULL, 0, 100, 1.0, 5.0);
1451 	gtk_table_attach_defaults(GTK_TABLE(dgtable), dg->spin[1], 2,3, 0,1);
1452 	parse_integer_for_dialog(tagvalues[0], dg->spin[1], GTK_WIDGET(gtk_bin_get_child(GTK_BIN(dg->combo[1]))),
1453 							 NULL);
1454 
1455 	dg->combo[2] = html_diag_combobox_with_popdown(tagvalues[2], bfwin->session->colorlist, 1);
1456 	color_but = color_but_new(gtk_bin_get_child(GTK_BIN(dg->combo[2])), dg->dialog);
1457 	gtk_table_attach_defaults(GTK_TABLE(dgtable), gtk_label_new(_("Color")), 6,7, 0,1);
1458 	gtk_table_attach_defaults(GTK_TABLE(dgtable), GTK_WIDGET(GTK_BIN(dg->combo[2])), 7,9, 0,1);
1459 	gtk_table_attach_defaults(GTK_TABLE(dgtable), GTK_WIDGET(color_but), 9,10, 0,1);
1460 
1461 	dg->combo[3] = html_diag_combobox_with_popdown(tagvalues[1], bfwin->session->fontlist, 1);
1462 	gtk_table_attach_defaults(GTK_TABLE(dgtable), gtk_label_new(_("Face")), 0,1, 1,2);
1463 	gtk_table_attach_defaults(GTK_TABLE(dgtable), GTK_WIDGET(GTK_BIN(dg->combo[3])), 1,10, 1,2);
1464 
1465 	dg->entry[1] = dialog_entry_in_table(custom, dgtable, 1,10, 2,3);
1466 	gtk_table_attach_defaults(GTK_TABLE(dgtable), gtk_label_new(_("Custom")), 0,1, 2,3);
1467 	switch (type) {
1468 	case 1:
1469 		html_diag_finish(dg, G_CALLBACK(fontok_lcb));
1470 		break;
1471 	case 2:
1472 		html_diag_finish(dg, G_CALLBACK(basefontok_lcb));
1473 		break;
1474 	}
1475 
1476 	if (custom)
1477 		g_free(custom);
1478 }
1479 
1480 void
font_dialog(Tbfwin * bfwin,Ttagpopup * data)1481 font_dialog(Tbfwin * bfwin, Ttagpopup * data)
1482 {
1483 	generalfontdialog_cb(1, bfwin, data);
1484 }
1485 
1486 void
basefont_dialog(Tbfwin * bfwin,Ttagpopup * data)1487 basefont_dialog(Tbfwin * bfwin, Ttagpopup * data)
1488 {
1489 	generalfontdialog_cb(2, bfwin, data);
1490 }
1491 
1492 static void
emailok_lcb(GtkWidget * widget,Thtml_diag * dg)1493 emailok_lcb(GtkWidget * widget, Thtml_diag * dg)
1494 {
1495 	gchar *finalstring, *tmpstr, *cc, *bcc, *subj, *body;
1496 	gchar *urlencoded = NULL;
1497 	gboolean have_questionmark = FALSE;
1498 	tmpstr = g_strconcat(cap("<A HREF=\"mailto:")
1499 						 , gtk_entry_get_text(GTK_ENTRY(dg->entry[1]))
1500 						 , NULL);
1501 	if (strlen(gtk_entry_get_text(GTK_ENTRY(dg->entry[2])))) {
1502 		cc = g_strconcat("?cc=", gtk_entry_get_text(GTK_ENTRY(dg->entry[2])), NULL);
1503 		have_questionmark = TRUE;
1504 	} else {
1505 		cc = g_strdup("");
1506 	}
1507 	if (strlen(gtk_entry_get_text(GTK_ENTRY(dg->entry[3])))) {
1508 		if (have_questionmark) {
1509 			bcc = g_strconcat("&amp;bcc=", gtk_entry_get_text(GTK_ENTRY(dg->entry[3])), NULL);
1510 		} else {
1511 			bcc = g_strconcat("?bcc=", gtk_entry_get_text(GTK_ENTRY(dg->entry[3])), NULL);
1512 			have_questionmark = TRUE;
1513 		}
1514 	} else {
1515 		bcc = g_strdup("");
1516 	}
1517 	if (strlen(gtk_entry_get_text(GTK_ENTRY(dg->entry[4])))) {
1518 		urlencoded = g_uri_escape_string(gtk_entry_get_text(GTK_ENTRY(dg->entry[4])), NULL, FALSE);
1519 		if (have_questionmark) {
1520 			subj = g_strconcat("&amp;subject=", urlencoded, NULL);
1521 		} else {
1522 			subj = g_strconcat("?subject=", urlencoded, NULL);
1523 			have_questionmark = TRUE;
1524 		}
1525 	} else {
1526 		subj = g_strdup("");
1527 	}
1528 	if (strlen(gtk_entry_get_text(GTK_ENTRY(dg->entry[5])))) {
1529 		urlencoded = g_uri_escape_string(gtk_entry_get_text(GTK_ENTRY(dg->entry[5])), NULL, FALSE);
1530 		if (have_questionmark) {
1531 			body = g_strconcat("&amp;body=", urlencoded, NULL);
1532 		} else {
1533 			body = g_strconcat("?body=", urlencoded, NULL);
1534 		}
1535 	} else {
1536 		body = g_strdup("");
1537 	}
1538 	finalstring = g_strconcat(tmpstr, cc, bcc, subj, body, "\">", NULL);
1539 	g_free(tmpstr);
1540 	g_free(cc);
1541 	g_free(bcc);
1542 	g_free(subj);
1543 	g_free(body);
1544 	g_free(urlencoded);
1545 	doc_insert_two_strings(dg->doc, finalstring, cap("</A>"));
1546 	g_free(finalstring);
1547 	html_diag_destroy_cb(NULL, dg);
1548 }
1549 
1550 void
email_dialog(Tbfwin * bfwin,Ttagpopup * data)1551 email_dialog(Tbfwin * bfwin, Ttagpopup * data)
1552 {
1553 	GtkWidget *dgtable;
1554 	Thtml_diag *dg;
1555 
1556 	dg = html_diag_new(bfwin, _("E-mail"));
1557 
1558 	dgtable = gtk_table_new(5, 2, FALSE);
1559 	gtk_table_set_col_spacings(GTK_TABLE(dgtable), 12);
1560 	gtk_table_set_row_spacings(GTK_TABLE(dgtable), 12);
1561 	gtk_box_pack_start(GTK_BOX(dg->vbox), dgtable, FALSE, FALSE, 0);
1562 
1563 	dg->entry[1] = dialog_entry_in_table(NULL, dgtable, 1,2, 0,1);
1564 	dialog_mnemonic_label_in_table(_("_Mail to:"), dg->entry[1], dgtable, 0,1, 0,1);
1565 
1566 	dg->entry[2] = dialog_entry_in_table(NULL, dgtable, 1,2, 1,2);
1567 	dialog_mnemonic_label_in_table(_("_Copy to:"), dg->entry[2], dgtable, 0,1, 1,2);
1568 
1569 	dg->entry[3] = dialog_entry_in_table(NULL, dgtable, 1,2, 2,3);
1570 	dialog_mnemonic_label_in_table(_("Blin_d copy to:"), dg->entry[3], dgtable, 0,1, 2,3);
1571 
1572 	dg->entry[4] = dialog_entry_in_table(NULL, dgtable, 1,2, 3,4);
1573 	dialog_mnemonic_label_in_table(_("with _Subject:"), dg->entry[4], dgtable, 0,1, 3,4);
1574 
1575 	dg->entry[5] = dialog_entry_in_table(NULL, dgtable, 1,2, 4,5);
1576 	dialog_mnemonic_label_in_table(_("with _Body:"), dg->entry[5], dgtable, 0,1, 4,5);
1577 
1578 	html_diag_finish(dg, G_CALLBACK(emailok_lcb));
1579 }
1580 
1581 static void
quicklistok_lcb(GtkWidget * widget,Thtml_diag * dg)1582 quicklistok_lcb(GtkWidget * widget, Thtml_diag * dg)
1583 {
1584 	gint active, temp, i;
1585 	gchar *finalstring;
1586 
1587 	if (strlen(gtk_entry_get_text(GTK_ENTRY(dg->spin[1])))) {
1588 		temp = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(dg->spin[1]));
1589 		finalstring = g_malloc((8 + temp * 12) * sizeof(gchar));
1590 
1591 		active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dg->radio[1]));
1592 
1593 		if (active) {
1594 			strcpy(finalstring, cap("<OL>"));
1595 		} else {
1596 			strcpy(finalstring, cap("<UL>"));
1597 		}
1598 	/**********************************************/
1599 		/* TODO: use bf_str_repeat() function !!!!!!! */
1600 	/**********************************************/
1601 		for (i = 0; i < temp; i++) {
1602 			strcat(finalstring, cap("\n\t<LI></LI>"));
1603 		}
1604 		strcat(finalstring, "\n");
1605 
1606 		if (active) {
1607 			doc_insert_two_strings(dg->doc, finalstring, cap("</OL>"));
1608 		} else {
1609 			doc_insert_two_strings(dg->doc, finalstring, cap("</UL>"));
1610 		}
1611 		g_free(finalstring);
1612 	}
1613 	html_diag_destroy_cb(NULL, dg);
1614 }
1615 
1616 void
quicklist_dialog(Tbfwin * bfwin,Ttagpopup * data)1617 quicklist_dialog(Tbfwin * bfwin, Ttagpopup * data)
1618 {
1619 	Thtml_diag *dg;
1620 	GtkWidget *dgtable;
1621 
1622 	dg = html_diag_new(bfwin, _("Quick List"));
1623 
1624 	dgtable = html_diag_table_in_vbox(dg, 2, 10);
1625 	dg->spin[1] = spinbut_with_value("3", 0, 500, 1.0, 5.0);
1626 	gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(dg->spin[1]), 1);
1627 	dialog_mnemonic_label_in_table(_("Number of _rows:"), dg->spin[1], dgtable, 0,1, 0,1);
1628 	gtk_table_attach_defaults(GTK_TABLE(dgtable), dg->spin[1], 1,2, 0,1);
1629 
1630 	dg->radio[1] = gtk_radio_button_new_with_mnemonic(NULL, _("Or_dered"));
1631 	dg->radio[2] = gtk_radio_button_new_with_mnemonic(gtk_radio_button_get_group(GTK_RADIO_BUTTON(dg->radio[1])), 		   _("_Unordered"));
1632 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dg->radio[1]), TRUE);
1633 	dialog_mnemonic_label_in_table(_("Style:"), NULL, dgtable, 0,1, 1,2);
1634 	gtk_table_attach_defaults(GTK_TABLE(dgtable), dg->radio[1], 1,5, 1,2);
1635 	gtk_table_attach_defaults(GTK_TABLE(dgtable), dg->radio[2], 5,10, 1,2);
1636 
1637 	html_diag_finish(dg, G_CALLBACK(quicklistok_lcb));
1638 
1639 }
1640 
1641 static void
framesetdialogok_lcb(GtkWidget * widget,Thtml_diag * dg)1642 framesetdialogok_lcb(GtkWidget * widget, Thtml_diag * dg)
1643 {
1644 
1645 	gchar *thestring, *finalstring;
1646 
1647 	thestring = g_strdup(cap("<FRAMESET"));
1648 	thestring = insert_string_if_entry((GTK_ENTRY(dg->entry[1])), cap("COLS"), thestring, NULL);
1649 	thestring = insert_string_if_entry((GTK_ENTRY(dg->entry[2])), cap("ROWS"), thestring, NULL);
1650 	finalstring = g_strconcat(thestring, ">", NULL);
1651 	g_free(thestring);
1652 
1653 	if ((dg->check[1]) && (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dg->check[1])))) {
1654 		gint rowcount = 1, colcount = 1, framecount = 0;
1655 		gchar *rowstr, *colstr, *tmpstr, *framestring, *tmp;
1656 		rowstr = gtk_editable_get_chars(GTK_EDITABLE(dg->entry[1]), 0, -1);
1657 		tmp = rowstr;
1658 		while ((tmp = strchr(tmp, ','))) {
1659 			rowcount++;
1660 			tmp++;
1661 		}
1662 		g_free(rowstr);
1663 		colstr = gtk_editable_get_chars(GTK_EDITABLE(dg->entry[2]), 0, -1);
1664 		tmp = colstr;
1665 		while ((tmp = strchr(tmp, ','))) {
1666 			colcount++;
1667 			tmp++;
1668 		}
1669 		g_free(colstr);
1670 
1671 		framecount = colcount * rowcount;
1672 
1673 		if (get_curlang_option_value(dg->bfwin, self_close_singleton_tags) == 1) {
1674 			framestring = bf_str_repeat(cap("\n<FRAME />"), framecount);
1675 		} else {
1676 			framestring = bf_str_repeat(cap("\n<FRAME>"), framecount);
1677 		}
1678 		tmpstr = g_strconcat(finalstring, framestring, NULL);
1679 		g_free(framestring);
1680 		g_free(finalstring);
1681 		finalstring = tmpstr;
1682 	}
1683 
1684 	if (dg->range.end == -1) {
1685 		doc_insert_two_strings(dg->doc, finalstring, cap("\n</FRAMESET>"));
1686 	} else {
1687 		doc_replace_text(dg->doc, finalstring, dg->range.pos, dg->range.end);
1688 	}
1689 	g_free(finalstring);
1690 	html_diag_destroy_cb(NULL, dg);
1691 }
1692 
1693 
1694 void
frameset_dialog(Tbfwin * bfwin,Ttagpopup * data)1695 frameset_dialog(Tbfwin * bfwin, Ttagpopup * data)
1696 {
1697 	static gchar *tagitems[] = { "cols", "rows", "border", "spacing", NULL };
1698 	gchar *tagvalues[5];
1699 	gchar *custom = NULL;
1700 	Thtml_diag *dg;
1701 	GtkWidget *dgtable;
1702 
1703 	dg = html_diag_new(bfwin, _("Frameset"));
1704 	fill_dialogvalues(tagitems, tagvalues, &custom, (Ttagpopup *) data, dg);
1705 
1706 	dgtable = html_diag_table_in_vbox(dg, 5, 10);
1707 
1708 	dg->entry[1] = dialog_entry_in_table(tagvalues[0], dgtable, 2,10, 0,1);
1709 	dialog_mnemonic_label_in_table(_("Co_ls:"), dg->entry[1], dgtable, 0,2, 0,1);
1710 
1711 	dg->entry[2] = dialog_entry_in_table(tagvalues[1], dgtable, 2,10, 1,2);
1712 	dialog_mnemonic_label_in_table(_("_Rows:"), dg->entry[2], dgtable, 0,2, 1,2);
1713 
1714 	if (dg->range.end == -1) {
1715 		dg->check[1] = gtk_check_button_new();
1716 		dialog_mnemonic_label_in_table(_("_Add &lt;frame&gt; elements"), dg->check[1], dgtable, 3,4, 2,3);
1717 		gtk_table_attach_defaults(GTK_TABLE(dgtable), dg->check[1], 2,3, 2,3);
1718 	} else {
1719 		dg->check[1] = NULL;
1720 	}
1721 
1722 /* THIS IS NO VALID HTML !!!!
1723   dg->check[1] = gtk_check_button_new();
1724   parse_existence_for_dialog(tagvalues[2], dg->check[1]);
1725   gtk_table_attach_defaults(GTK_TABLE(dgtable), gtk_label_new(_("Border")), 0,2, 2,3);
1726   gtk_table_attach_defaults(GTK_TABLE(dgtable), dg->check[1], 2,4, 2,3);
1727 
1728   dg->spin[1] = spinbut_with_value(tagvalues[3], 0, 500, 1.0, 5.0);
1729   gtk_table_attach_defaults(GTK_TABLE(dgtable), gtk_label_new(_("Spacing")), 0,2, 3,4);
1730   gtk_table_attach_defaults(GTK_TABLE(dgtable), dg->spin[1], 2,4, 3,4);
1731 */
1732 	dg->entry[3] = dialog_entry_in_table(custom, dgtable, 2,10, 3,4);
1733 	dialog_mnemonic_label_in_table(_("Custo_m:"), dg->entry[3], dgtable, 0,2, 3,4);
1734 
1735 	html_diag_finish(dg, G_CALLBACK(framesetdialogok_lcb));
1736 
1737 	if (custom)
1738 		g_free(custom);
1739 }
1740 
1741 
1742 static void
framedialogok_lcb(GtkWidget * widget,Thtml_diag * dg)1743 framedialogok_lcb(GtkWidget * widget, Thtml_diag * dg)
1744 {
1745 	Tbfwin *bfwin = dg->bfwin;
1746 	gchar *thestring, *finalstring, *tmp;
1747 
1748 	thestring = g_strdup(cap("<FRAME"));
1749 	thestring = insert_string_if_combobox(GTK_COMBO_BOX(dg->combo[1]), cap("SRC"), thestring, NULL);
1750 	thestring = insert_string_if_combobox(GTK_COMBO_BOX(dg->combo[2]), cap("NAME"), thestring, NULL);
1751 	thestring = insert_string_if_entry((GTK_ENTRY(dg->spin[0])), cap("FRAMEBORDER"), thestring, NULL);
1752 	tmp = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(dg->combo[3]));
1753 	if(strlen(tmp)) {
1754 		thestring = g_strconcat(thestring, cap(" SCROLLING=\""), tmp, "\"",NULL);
1755 	}
1756 	g_free(tmp);
1757 	thestring = insert_string_if_entry((GTK_ENTRY(dg->spin[1])), cap("MARGINWIDTH"), thestring, NULL);
1758 	thestring = insert_string_if_entry((GTK_ENTRY(dg->spin[2])), cap("MARGINHEIGHT"), thestring, NULL);
1759 	thestring = insert_attr_if_checkbox(dg->check[1], get_curlang_option_value(dg->bfwin, lang_is_XHTML) ? cap("NORESIZE=\"noresize\"") : cap("NORESIZE"), thestring);
1760 	thestring = insert_string_if_entry((GTK_ENTRY(dg->entry[1])), NULL, thestring, NULL);
1761 
1762 	bfwin->session->targetlist = add_entry_to_stringlist(bfwin->session->targetlist, GTK_WIDGET(gtk_bin_get_child(GTK_BIN(dg->combo[2]))));
1763 	bfwin->session->urllist = add_entry_to_stringlist(bfwin->session->urllist, GTK_WIDGET(gtk_bin_get_child(GTK_BIN(dg->combo[1]))));
1764 
1765 	if (get_curlang_option_value(bfwin, self_close_singleton_tags)) {
1766 		finalstring = g_strconcat(thestring, " />", NULL);
1767 	} else {
1768 		finalstring = g_strconcat(thestring, ">", NULL);
1769 	}
1770 	g_free(thestring);
1771 
1772 	if (dg->range.end == -1) {
1773 		doc_insert_two_strings(dg->doc, finalstring, NULL);
1774 	} else {
1775 		doc_replace_text(dg->doc, finalstring, dg->range.pos, dg->range.end);
1776 	}
1777 	g_free(finalstring);
1778 	html_diag_destroy_cb(NULL, dg);
1779 }
1780 
1781 void
frame_dialog(Tbfwin * bfwin,Ttagpopup * data)1782 frame_dialog(Tbfwin * bfwin, Ttagpopup * data)
1783 {
1784 	GList *popuplist = NULL;
1785 	static gchar *tagitems[] = { "src", "name", "frameborder", "scrolling", "marginwidth", "marginheight", "noresize", NULL };
1786 	gchar *tagvalues[9];
1787 	gchar *custom = NULL;
1788 
1789 	GtkWidget *dgtable, *file_but;
1790 	Thtml_diag *dg;
1791 
1792 	dg = html_diag_new(bfwin, _("Frame"));
1793 	fill_dialogvalues(tagitems, tagvalues, &custom, (Ttagpopup *) data, dg);
1794 
1795 	dgtable = html_diag_table_in_vbox(dg, 5, 10);
1796 
1797 	dg->combo[1] = html_diag_combobox_with_popdown(tagvalues[0], bfwin->session->urllist, 1);
1798 	file_but = file_but_new(GTK_WIDGET(gtk_bin_get_child(GTK_BIN(dg->combo[1]))), 0, bfwin);
1799 	gtk_table_attach_defaults(GTK_TABLE(dgtable), GTK_WIDGET(file_but), 9,10, 0,1);
1800 	dialog_mnemonic_label_in_table(_("_Source:"), dg->combo[1], dgtable, 0,1, 0,1);
1801 	gtk_table_attach_defaults(GTK_TABLE(dgtable), GTK_WIDGET(GTK_BIN(dg->combo[1])), 1,9, 0,1);
1802 
1803 	dg->combo[2] = html_diag_combobox_with_popdown_sized(tagvalues[1], bfwin->session->targetlist, 1, 90);
1804 	dialog_mnemonic_label_in_table(_("_Name:"), dg->combo[2], dgtable, 0,1, 1,2);
1805 	gtk_table_attach_defaults(GTK_TABLE(dgtable), dg->combo[2], 1,5, 1,2);
1806 
1807 	dg->spin[1] = spinbut_with_value(tagvalues[4], 0, 500, 1.0, 5.0);
1808 	dialog_mnemonic_label_in_table(_("Margin _Width:"), dg->spin[1], dgtable, 0,1, 2,3);
1809 	gtk_table_attach_defaults(GTK_TABLE(dgtable), dg->spin[1], 1,5, 2,3);
1810 
1811 	dg->spin[2] = spinbut_with_value(tagvalues[5], 0, 500, 1.0, 5.0);
1812 	dialog_mnemonic_label_in_table(_("Margin _Height:"), dg->spin[2], dgtable, 0,1, 3,4);
1813 	gtk_table_attach_defaults(GTK_TABLE(dgtable), dg->spin[2], 1,5, 3,4);
1814 
1815 	popuplist = g_list_insert(popuplist, "auto",0);
1816 	popuplist = g_list_insert(popuplist, "yes",1);
1817 	popuplist = g_list_insert(popuplist, "no",2);
1818 	popuplist = g_list_insert(popuplist, "",3);
1819 	dg->combo[3] = html_diag_combobox_with_popdown("", popuplist, 0);
1820 	g_list_free(popuplist);
1821 	dialog_mnemonic_label_in_table(_("Scrollin_g:"), dg->combo[3], dgtable, 5,6, 1,2);
1822 	gtk_table_attach_defaults(GTK_TABLE(dgtable), dg->combo[3], 6,10, 1,2);
1823 
1824 	dg->spin[0] = spinbut_with_value(tagvalues[2], 0, 1, 1.0, 1.0);
1825 	dialog_mnemonic_label_in_table(_("_Frameborder:"), dg->spin[0], dgtable, 5,6, 2,3);
1826 	gtk_table_attach_defaults(GTK_TABLE(dgtable), dg->spin[0], 6,10, 2,3);
1827 
1828 	dg->check[1] = gtk_check_button_new();
1829 	parse_existence_for_dialog(tagvalues[6], dg->check[1]);
1830 	dialog_mnemonic_label_in_table(_("No _Resize:"), dg->check[1], dgtable, 5,6, 3,4);
1831 	gtk_table_attach_defaults(GTK_TABLE(dgtable), dg->check[1], 6,10, 3,4);
1832 
1833 /* THIS IS NO HTML
1834   adj = (GtkAdjustment *) gtk_adjustment_new((gfloat) 1, 0.0, 500.0, 1.0, 5.0, 0.0);
1835   spin3 = gtk_spin_button_new(adj, 1,0);
1836   parse_integer_for_dialog(tagvalues[5], spin3, NULL, NULL);
1837   gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(spin3), 1);
1838   gtk_table_attach_defaults(GTK_TABLE(dgtable), gtk_label_new(_("Spacing")), 4,5, 3,4);
1839   gtk_table_attach_defaults(GTK_TABLE(dgtable), spin3, 5,8, 3,4); */
1840 
1841 	dg->entry[1] = dialog_entry_in_table(custom, dgtable, 1, 10, 4,5);
1842 	dialog_mnemonic_label_in_table(_("Custo_m:"), dg->entry[1], dgtable, 0,1, 4,5);
1843 
1844 	html_diag_finish(dg, G_CALLBACK(framedialogok_lcb));
1845 
1846 	if (custom)
1847 		g_free(custom);
1848 }
1849 
1850 static void
audiodialogok_lcb(GtkWidget * widget,Thtml_diag * dg)1851 audiodialogok_lcb(GtkWidget * widget, Thtml_diag * dg)
1852 {
1853 	gchar *finalstring, *thestring;
1854 	gboolean is_xhtml = get_curlang_option_value(dg->bfwin, lang_is_XHTML);
1855 	/* Tag construction */
1856 	finalstring = g_strdup(cap("<AUDIO"));
1857 	finalstring = insert_string_if_combobox(GTK_COMBO_BOX(dg->combo[1]), cap("SRC"), finalstring, NULL);
1858 	finalstring = insert_attr_if_checkbox(dg->check[1], is_xhtml ? cap("AUTOPLAY=\"autoplay\"") : cap("AUTOPLAY"), finalstring);
1859 	finalstring = insert_attr_if_checkbox(dg->check[2], is_xhtml ? cap("CONTROLS=\"controls\"") : cap("CONTROLS"), finalstring);
1860 	finalstring = insert_attr_if_checkbox(dg->check[3], is_xhtml ? cap("LOOP=\"loop\"") : cap("LOOP"), finalstring);
1861 	finalstring = insert_attr_if_checkbox(dg->check[4], is_xhtml ? cap("MUTE=\"mute\"") : cap("MUTE"), finalstring);
1862 	finalstring = insert_string_if_entry((GTK_ENTRY(dg->entry[0])), cap("ID"), finalstring, NULL);
1863 	finalstring = insert_string_if_combobox(GTK_COMBO_BOX(dg->combo[3]), cap("CLASS"), finalstring, NULL);
1864 	finalstring = insert_string_if_combobox(GTK_COMBO_BOX(dg->combo[2]), cap("PRELOAD"), finalstring, NULL);
1865 	finalstring = insert_string_if_entry((GTK_ENTRY(dg->entry[2])), cap("STYLE"), finalstring, NULL);
1866 	finalstring = insert_string_if_entry((GTK_ENTRY(dg->entry[3])), NULL, finalstring, NULL);
1867 	thestring = finalstring;
1868 	finalstring = g_strconcat(thestring, ">", NULL);
1869 	g_free(thestring);
1870 	/* Insert tag in document */
1871 	if (dg->range.end == -1) {
1872 		doc_insert_two_strings(dg->doc, finalstring,  cap("</AUDIO>"));
1873 	} else {
1874 		doc_replace_text(dg->doc, finalstring, dg->range.pos, dg->range.end);
1875 	}
1876 
1877 	/* Free */
1878 	g_free(finalstring);
1879 	html_diag_destroy_cb(NULL, dg);
1880 }
1881 
1882 void
audio_dialog(Tbfwin * bfwin,Ttagpopup * data)1883 audio_dialog(Tbfwin * bfwin, Ttagpopup * data)
1884 {
1885 	/* Controls */
1886 	GtkWidget *dgtable, *but;
1887 	Thtml_diag *dg;
1888 	static gchar *tagitems[] = { "src", "preload", "id", "class", "style", NULL };
1889 	gchar *tagvalues[6];
1890 	gchar *custom=NULL;
1891 
1892 	/* Values attributes lists */
1893 	GList *listPreload;
1894 
1895 	/* Dialog construction and settings */
1896 	dg = html_diag_new(bfwin, _("Audio"));
1897 	fill_dialogvalues(tagitems, tagvalues, &custom, (Ttagpopup *) data, dg);
1898 	dgtable = html_diag_table_in_vbox(dg, 6, 11);
1899 
1900 	dg->combo[1] = html_diag_combobox_with_popdown(tagvalues[0], bfwin->session->urllist, 1);
1901 	but = file_but_new(GTK_WIDGET(gtk_bin_get_child(GTK_BIN(dg->combo[1]))), 0, bfwin);
1902 	gtk_table_attach(GTK_TABLE(dgtable), GTK_WIDGET(but), 9,10, 0,1, GTK_SHRINK,GTK_SHRINK,0,0);
1903 	dialog_mnemonic_label_in_table(_("_Source:"), dg->combo[1], dgtable, 0,1, 0,1);
1904 	gtk_table_attach_defaults(GTK_TABLE(dgtable), GTK_WIDGET(GTK_BIN(dg->combo[1])), 1,9, 0,1);
1905 
1906 	dg->check[1] = gtk_check_button_new();
1907 	dialog_mnemonic_label_in_table(_("_Autoplay:"), dg->check[1], dgtable, 0,1, 1,2);
1908 	gtk_table_attach_defaults(GTK_TABLE(dgtable), dg->check[1], 1,2, 1,2);
1909 
1910 	dg->check[2] = gtk_check_button_new();
1911 	dialog_mnemonic_label_in_table(_("C_ontrols:"), dg->check[2], dgtable, 2,3, 1,2);
1912 	gtk_table_attach_defaults(GTK_TABLE(dgtable), dg->check[2], 3,4, 1,2);
1913 
1914 	dg->check[3] = gtk_check_button_new();
1915 	dialog_mnemonic_label_in_table(_("_Loop:"), dg->check[3], dgtable, 4,5, 1,2);
1916 	gtk_table_attach_defaults(GTK_TABLE(dgtable), dg->check[3], 5,6, 1,2);
1917 
1918 	dg->check[4] = gtk_check_button_new();
1919 	dialog_mnemonic_label_in_table(_("M_ute:"), dg->check[4], dgtable, 7,8, 1,2);
1920 	gtk_table_attach_defaults(GTK_TABLE(dgtable), dg->check[4], 8,9, 1,2);
1921 
1922 	listPreload = list_from_arglist(FALSE, "", "auto", "metadata", "none", NULL);
1923 	dg->combo[2] = html_diag_combobox_with_popdown(tagvalues[1], listPreload, 1);
1924 	dialog_mnemonic_label_in_table(_("_Preload:"), dg->combo[2], dgtable, 0,1, 2,3);
1925 	gtk_table_attach_defaults(GTK_TABLE(dgtable), GTK_WIDGET(dg->combo[2]), 1,4, 2,3);
1926 	g_list_free(listPreload);
1927 
1928 	dg->entry[0] = dialog_entry_in_table(tagvalues[2], dgtable, 5,6, 2,3);
1929 	dialog_mnemonic_label_in_table(_("_Id:"), dg->entry[0], dgtable, 4,5, 2,3);
1930 
1931 	dg->combo[3] = html_diag_combobox_with_popdown(tagvalues[3], bfwin->session->classlist, 1);
1932 	gtk_table_attach_defaults(GTK_TABLE(dgtable), dg->combo[3], 8,9, 2,3);
1933 	dialog_mnemonic_label_in_table(_("Cl_ass:"), dg->combo[3], dgtable, 7,8, 2,3);
1934 
1935 	dg->entry[2] = dialog_entry_in_table(tagvalues[4], dgtable, 1,8 , 3,4);
1936 	dialog_mnemonic_label_in_table(_("_Style:"), dg->entry[2], dgtable, 0,1, 3,4);
1937 	but = style_but_new(dg->entry[2], dg->dialog);
1938 	gtk_table_attach(GTK_TABLE(dgtable), but, 8,10, 3,4, GTK_SHRINK,GTK_SHRINK,0,0);
1939 
1940 	dg->entry[3] = dialog_entry_in_table(custom, dgtable, 1,10, 4,5);
1941 	dialog_mnemonic_label_in_table(_("Custo_m:"), dg->entry[3], dgtable, 0,1, 4,5);
1942 
1943 	html_diag_finish(dg, G_CALLBACK(audiodialogok_lcb));
1944 }
1945 
1946 static void
canvasdialogok_lcb(GtkWidget * widget,Thtml_diag * dg)1947 canvasdialogok_lcb(GtkWidget * widget, Thtml_diag * dg)
1948 {
1949 	gchar *finalstring, *thestring;
1950 
1951 	/* Tag construction */
1952 	finalstring = g_strdup(cap("<CANVAS"));
1953 	finalstring = insert_string_if_entry((GTK_ENTRY(dg->spin[1])), cap("WIDTH"), finalstring, NULL);
1954 	finalstring = insert_string_if_entry((GTK_ENTRY(dg->spin[0])), cap("HEIGHT"), finalstring, NULL);
1955 	finalstring = insert_string_if_entry((GTK_ENTRY(dg->entry[0])), cap("ID"), finalstring, NULL);
1956 	finalstring = insert_string_if_entry((GTK_ENTRY(dg->entry[1])), cap("STYLE"), finalstring, NULL);
1957 	finalstring = insert_string_if_combobox(GTK_COMBO_BOX(dg->combo[0]), cap("CLASS"), finalstring, NULL);
1958 	finalstring = insert_string_if_entry((GTK_ENTRY(dg->entry[2])), NULL, finalstring, NULL);
1959 	thestring = finalstring;
1960 	finalstring = g_strconcat(thestring, ">", NULL);
1961 	g_free(thestring);
1962 	/* Insert tag in document */
1963 	if (dg->range.end == -1) {
1964 		doc_insert_two_strings(dg->doc, finalstring, cap("</CANVAS>"));
1965 	} else {
1966 		doc_replace_text(dg->doc, finalstring, dg->range.pos, dg->range.end);
1967 	}
1968 	g_free(finalstring);
1969 	html_diag_destroy_cb(NULL, dg);
1970 }
1971 
1972 void
canvas_dialog(Tbfwin * bfwin,Ttagpopup * data)1973 canvas_dialog(Tbfwin * bfwin, Ttagpopup * data)
1974 {
1975 	/* Controls */
1976 	GtkWidget *dgtable, *but;
1977 	Thtml_diag *dg;
1978 	static gchar *tagitems[] = { "height", "width", "id", "style", "class", NULL };
1979 	gchar *tagvalues[6];
1980 	gchar *custom=NULL;
1981 
1982 	/* Dialog construction */
1983 	dg = html_diag_new(bfwin, _("Canvas"));
1984 	fill_dialogvalues(tagitems, tagvalues, &custom, (Ttagpopup *) data, dg);
1985 	dgtable = html_diag_table_in_vbox(dg, 4,3);
1986 
1987 	dg->entry[0] = dialog_entry_in_table(tagvalues[2], dgtable, 1,2, 0,1);
1988 	dialog_mnemonic_label_in_table(_("_Id:"), dg->entry[0], dgtable, 0,1, 0,1);
1989 
1990 	dg->combo[0] = html_diag_combobox_with_popdown(tagvalues[4], bfwin->session->classlist, 1);
1991 	gtk_table_attach_defaults(GTK_TABLE(dgtable), dg->combo[0], 1,2, 1,2);
1992 	dialog_mnemonic_label_in_table(_("Cl_ass:"), dg->combo[0], dgtable, 0,1, 1,2);
1993 
1994 	dg->entry[1] = dialog_entry_in_table(tagvalues[3], dgtable, 1,3 , 2,3);
1995 	dialog_mnemonic_label_in_table(_("_Style:"), dg->entry[1], dgtable, 0,1, 2,3);
1996 	but = style_but_new(dg->entry[1], dg->dialog);
1997 	gtk_table_attach(GTK_TABLE(dgtable), but, 3,4, 2,3, GTK_SHRINK,GTK_SHRINK,0,0);
1998 
1999 	/* Width */
2000 	dg->spin[1] = spinbut_with_value(tagvalues[1]?tagvalues[1]:"200", 0, 10000, 1.0, 5.0);
2001 	dialog_mnemonic_label_in_table(_("_Width:"), dg->spin[1], dgtable, 2,3, 0,1);
2002 	gtk_table_attach_defaults(GTK_TABLE(dgtable), dg->spin[1], 3,4, 0,1);
2003 
2004 	/* Height */
2005 	dg->spin[0] = spinbut_with_value(tagvalues[0]?tagvalues[0]:"200", 0, 10000, 1.0, 5.0);
2006 	dialog_mnemonic_label_in_table(_("_Height:"), dg->spin[0], dgtable, 2,3, 1,2);
2007 	gtk_table_attach_defaults(GTK_TABLE(dgtable), dg->spin[0], 3,4, 1,2);
2008 
2009 	dg->entry[2] = dialog_entry_in_table(custom, dgtable, 1,4, 3,4);
2010 	dialog_mnemonic_label_in_table(_("Custo_m:"), dg->entry[2], dgtable, 0,1, 3,4);
2011 
2012 	html_diag_finish(dg, G_CALLBACK(canvasdialogok_lcb));
2013 }
2014 
2015 static void
videodialogok_lcb(GtkWidget * widget,Thtml_diag * dg)2016 videodialogok_lcb(GtkWidget * widget, Thtml_diag * dg)
2017 {
2018 	gchar *finalstring, *thestring;
2019 	gboolean is_xhtml = get_curlang_option_value(dg->bfwin, lang_is_XHTML);
2020 	/* Tag construction */
2021 	finalstring = g_strdup(cap("<VIDEO"));
2022 	finalstring = insert_string_if_combobox(GTK_COMBO_BOX(dg->combo[1]), cap("SRC"), finalstring, NULL);
2023 	finalstring = insert_string_if_combobox(GTK_COMBO_BOX(dg->combo[2]), cap("POSTER"), finalstring, NULL);
2024 	finalstring = insert_attr_if_checkbox(dg->check[1], is_xhtml ? cap("AUTOPLAY=\"autoplay\"") : cap("AUTOPLAY"), finalstring);
2025 	finalstring = insert_attr_if_checkbox(dg->check[2], is_xhtml ? cap("CONTROLS=\"controls\"") : cap("CONTROLS"), finalstring);
2026 	finalstring = insert_attr_if_checkbox(dg->check[3], is_xhtml ? cap("LOOP=\"loop\"") : cap("LOOP"), finalstring);
2027 	finalstring = insert_attr_if_checkbox(dg->check[4], is_xhtml ? cap("MUTE=\"mute\"") : cap("MUTE"), finalstring);
2028 	finalstring = insert_string_if_entry((GTK_ENTRY(dg->spin[1])), cap("WIDTH"), finalstring, NULL);
2029 	finalstring = insert_string_if_entry((GTK_ENTRY(dg->spin[2])), cap("HEIGHT"), finalstring, NULL);
2030 	finalstring = insert_string_if_entry((GTK_ENTRY(dg->entry[0])), cap("ID"), finalstring, NULL);
2031 	finalstring = insert_string_if_combobox(GTK_COMBO_BOX(dg->combo[3]), cap("CLASS"), finalstring, NULL);
2032 	finalstring = insert_string_if_combobox(GTK_COMBO_BOX(dg->combo[4]), cap("PRELOAD"), finalstring, NULL);
2033 	finalstring = insert_string_if_entry((GTK_ENTRY(dg->entry[1])), cap("STYLE"), finalstring, NULL);
2034 	finalstring = insert_string_if_entry((GTK_ENTRY(dg->entry[2])), NULL, finalstring, NULL);
2035 	thestring = finalstring;
2036 	finalstring = g_strconcat(thestring, ">", NULL);
2037 	g_free(thestring);
2038 	/* Insert tag in document */
2039 	if (dg->range.end == -1) {
2040 		doc_insert_two_strings(dg->doc, finalstring, cap("</VIDEO>"));
2041 	} else {
2042 		doc_replace_text(dg->doc, finalstring, dg->range.pos, dg->range.end);
2043 	}
2044 
2045 	/* Free */
2046 	g_free(finalstring);
2047 	html_diag_destroy_cb(NULL, dg);
2048 }
2049 
2050 void
video_dialog(Tbfwin * bfwin,Ttagpopup * data)2051 video_dialog(Tbfwin * bfwin, Ttagpopup * data)
2052 {
2053 	/* Controls */
2054 	GtkWidget *dgtable, *but;
2055 	Thtml_diag *dg;
2056 
2057 	/* Attributes name list */
2058 	static gchar *tagitems[] = { "src", "poster", "width", "height", "id", "class", "preload", "style", NULL };
2059 	gchar *tagvalues[9];
2060 	gchar *custom=NULL;
2061 
2062 	/* Values attributes lists */
2063 	GList *tmplist;
2064 
2065 	dg = html_diag_new(bfwin, _("Video"));
2066 	fill_dialogvalues(tagitems, tagvalues, &custom, (Ttagpopup *) data, dg);
2067 	dgtable = html_diag_table_in_vbox(dg, 7,9);
2068 
2069 	/* Source */
2070 	dg->combo[1] = html_diag_combobox_with_popdown(tagvalues[0], bfwin->session->urllist, 1);
2071 	but = file_but_new(GTK_WIDGET(gtk_bin_get_child(GTK_BIN(dg->combo[1]))), 0, bfwin);
2072 	gtk_table_attach(GTK_TABLE(dgtable), GTK_WIDGET(but), 8,9, 0,1, GTK_SHRINK,GTK_SHRINK,0,0);
2073 	dialog_mnemonic_label_in_table(_("_Source:"), dg->combo[1], dgtable, 0,1, 0,1);
2074 	gtk_table_attach_defaults(GTK_TABLE(dgtable), GTK_WIDGET(GTK_BIN(dg->combo[1])), 1,8, 0,1);
2075 
2076 	/* Poster */
2077 	dg->combo[2] = html_diag_combobox_with_popdown(tagvalues[1], bfwin->session->urllist, 1);
2078 	but = file_but_new(GTK_WIDGET(gtk_bin_get_child(GTK_BIN(dg->combo[2]))), 0, bfwin);
2079 	gtk_table_attach(GTK_TABLE(dgtable), GTK_WIDGET(but), 8,9, 1,2, GTK_SHRINK,GTK_SHRINK,0,0);
2080 	dialog_mnemonic_label_in_table(_("_Poster:"), dg->combo[2], dgtable, 0,1, 1,2);
2081 	gtk_table_attach_defaults(GTK_TABLE(dgtable), GTK_WIDGET(GTK_BIN(dg->combo[2])), 1,8, 1,2);
2082 
2083 	/* autoplay */
2084 	dg->check[1] = gtk_check_button_new();
2085 	dialog_mnemonic_label_in_table(_("_Autoplay:"), dg->check[1], dgtable, 0,1, 2,3);
2086 	gtk_table_attach_defaults(GTK_TABLE(dgtable), dg->check[1], 1,2, 2,3);
2087 
2088 	/* controls */
2089 	dg->check[2] = gtk_check_button_new();
2090 	dialog_mnemonic_label_in_table(_("C_ontrols:"), dg->check[2], dgtable, 2,3, 2,3);
2091 	gtk_table_attach_defaults(GTK_TABLE(dgtable), dg->check[2], 3,4, 2,3);
2092 
2093 	/* loop */
2094 	dg->check[3] = gtk_check_button_new();
2095 	dialog_mnemonic_label_in_table(_("_Loop:"), dg->check[3], dgtable, 4,5, 2,3);
2096 	gtk_table_attach_defaults(GTK_TABLE(dgtable), dg->check[3], 5,6, 2,3);
2097 
2098 	/* mute */
2099 	dg->check[4] = gtk_check_button_new();
2100 	dialog_mnemonic_label_in_table(_("M_ute:"), dg->check[4], dgtable, 7,8, 2,3);
2101 	gtk_table_attach_defaults(GTK_TABLE(dgtable), dg->check[4], 8,9, 2,3);
2102 
2103 	/* Width */
2104 	dg->spin[1] = spinbut_with_value(tagvalues[2]?tagvalues[2]:"200", 0, 10000, 1.0, 5.0);
2105 	dialog_mnemonic_label_in_table(_("_Width:"), dg->spin[1], dgtable, 4,5, 3,4);
2106 	gtk_table_attach_defaults(GTK_TABLE(dgtable), dg->spin[1], 5,6, 3,4);
2107 
2108 	/* Height */
2109 	dg->spin[2] = spinbut_with_value(tagvalues[3]?tagvalues[3]:"200", 0, 10000, 1.0, 5.0);
2110 	dialog_mnemonic_label_in_table(_("_Height:"), dg->spin[2], dgtable, 7,8, 3,4);
2111 	gtk_table_attach_defaults(GTK_TABLE(dgtable), dg->spin[2], 8,9, 3,4);
2112 
2113 
2114 	dg->entry[0] = dialog_entry_in_table(tagvalues[4], dgtable, 1,4, 4,5);
2115 	dialog_mnemonic_label_in_table(_("_Id:"), dg->entry[0], dgtable, 0,1, 4,5);
2116 
2117 	dg->combo[3] = html_diag_combobox_with_popdown(tagvalues[5], bfwin->session->classlist, 1);
2118 	gtk_table_attach_defaults(GTK_TABLE(dgtable), dg->combo[3], 5,9, 4,5);
2119 	dialog_mnemonic_label_in_table(_("Cl_ass:"), dg->combo[3], dgtable, 4,5, 4,5);
2120 
2121 	/* Preload */
2122 	tmplist = list_from_arglist(FALSE, "", "auto", "metadata", "none", NULL);
2123 	dg->combo[4] = html_diag_combobox_with_popdown(tagvalues[6], tmplist, 1);
2124 	dialog_mnemonic_label_in_table(_("_Preload:"), dg->combo[4], dgtable, 0,1, 3,4);
2125 	gtk_table_attach_defaults(GTK_TABLE(dgtable), GTK_WIDGET(dg->combo[4]), 1,4, 3,4);
2126 	g_list_free(tmplist);
2127 
2128 	dg->entry[1] = dialog_entry_in_table(tagvalues[7], dgtable, 1,7, 5,6);
2129 	dialog_mnemonic_label_in_table(_("_Style:"), dg->entry[1], dgtable, 0,1, 5,6);
2130 	but = style_but_new(dg->entry[1], dg->dialog);
2131 	gtk_table_attach(GTK_TABLE(dgtable), but, 7,9, 5,6, GTK_SHRINK,GTK_SHRINK,0,0);
2132 
2133 	dg->entry[2] = dialog_entry_in_table(custom, dgtable, 1,9, 6,7);
2134 	dialog_mnemonic_label_in_table(_("Custo_m:"), dg->entry[2], dgtable, 0,1, 6,7);
2135 
2136 	html_diag_finish(dg, G_CALLBACK(videodialogok_lcb));
2137 }
2138 
2139 static void
html5timedialogok_lcb(GtkWidget * widget,Thtml_diag * dg)2140 html5timedialogok_lcb(GtkWidget * widget, Thtml_diag * dg)
2141 {
2142 	gchar *finalstring, *thestring;
2143 
2144 	/* Tag construction */
2145 	finalstring = g_strdup(cap("<TIME"));
2146 /*	finalstring = insert_string_if_combobox(GTK_COMBO_BOX(dg->combo[0]), cap("PUBDATE"), finalstring, NULL);*/
2147 	finalstring = insert_string_if_entry((GTK_ENTRY(dg->entry[0])), cap("DATETIME"), finalstring, NULL);
2148 	finalstring = insert_string_if_entry((GTK_ENTRY(dg->entry[1])), NULL, finalstring, NULL);
2149 
2150 	thestring = finalstring;
2151 	finalstring = g_strconcat(thestring, ">", NULL);
2152 	g_free(thestring);
2153 	/* Insert tag in document */
2154 	if (dg->range.end == -1) {
2155 		doc_insert_two_strings(dg->doc, finalstring, cap("</TIME>"));
2156 	} else {
2157 		doc_replace_text(dg->doc, finalstring, dg->range.pos, dg->range.end);
2158 	}
2159 
2160 	/* Free */
2161 	g_free(finalstring);
2162 	html_diag_destroy_cb(NULL, dg);
2163 }
2164 
2165 void
html5time_dialog(Tbfwin * bfwin,Ttagpopup * data)2166 html5time_dialog(Tbfwin * bfwin, Ttagpopup * data)
2167 {
2168 	/* Controls */
2169 	GtkWidget *dgtable;
2170 	Thtml_diag *dg;
2171 	GtkWidget* l;
2172 
2173 	/* there is no more pubdate attribute */
2174 	static gchar *tagitems[] = { "datetime", "pubdate", NULL };
2175 	gchar *tagvalues[3];
2176 	gchar *custom=NULL;
2177 
2178 	/* Dialog construction */
2179 	dg = html_diag_new(bfwin, _("Time"));
2180 	fill_dialogvalues(tagitems, tagvalues, &custom, (Ttagpopup *) data, dg);
2181 	dgtable = html_diag_table_in_vbox(dg, 4,3);
2182 
2183 	/* Datetime help */
2184 	l = gtk_label_new(_("Datetime format (ex. YYYY-MM-DDThh:mm:ssTZD) :\n\n"
2185 		"YYYY - year (e.g. 2009)\n"
2186 		"MM - month (e.g. 01 for January)\nDD - day of the month (e.g. 08)\n"
2187 		"T - a required separator\nhh - hour (e.g. 22 for 10.00pm)\n"
2188 		"mm - minutes (e.g. 55)\nss - seconds (e.g. 03)\n"
2189 		"TZD - Time Zone Designator (Z denotes Zulu, also known as Greenwich Mean Time)\n"));
2190 	gtk_table_attach_defaults(GTK_TABLE(dgtable), GTK_WIDGET(l), 0,3, 0,1);
2191 
2192 	/* Datetime */
2193 	dg->entry[0] = dialog_entry_in_table(tagvalues[0], dgtable, 1,3, 1,2);
2194 	dialog_mnemonic_label_in_table(_("_Datetime:"), dg->entry[0], dgtable, 0,1, 1,2);
2195 
2196 	/* Pubdate is removed of html5*/
2197 
2198 	dg->entry[1] = dialog_entry_in_table(custom, dgtable, 1,3, 3,4);
2199 	dialog_mnemonic_label_in_table(_("Custo_m:"), dg->entry[1], dgtable, 0,1, 3,4);
2200 
2201 	html_diag_finish(dg, G_CALLBACK(html5timedialogok_lcb));
2202 }
2203 
2204 /* this is no HTML, but often requested, so we leave it for now */
2205 /* this is HTML5, modified for HTML5, src,type(Valid MIME type),width,height,&globals; */
2206 
2207 static void
embedok_lcb(GtkWidget * widget,Thtml_diag * dg)2208 embedok_lcb(GtkWidget * widget, Thtml_diag * dg)
2209 {
2210 	gchar *thestring, *finalstring;
2211 
2212 	finalstring = g_strdup(cap("<EMBED"));
2213 	finalstring = insert_string_if_combobox(GTK_COMBO_BOX(dg->combo[0]), cap("SRC"), finalstring, NULL);
2214 	finalstring = insert_string_if_entry((GTK_ENTRY(dg->entry[0])), cap("TYPE"), finalstring, NULL);
2215 	finalstring = insert_string_if_entry((GTK_ENTRY(dg->spin[1])), cap("WIDTH"), finalstring, NULL);
2216 	finalstring = insert_string_if_entry((GTK_ENTRY(dg->spin[2])), cap("HEIGHT"), finalstring, NULL);
2217 	finalstring = insert_string_if_entry((GTK_ENTRY(dg->entry[1])), cap("ID"), finalstring, NULL);
2218 	finalstring = insert_string_if_combobox(GTK_COMBO_BOX(dg->combo[1]), cap("CLASS"), finalstring, NULL);
2219 	finalstring = insert_string_if_entry((GTK_ENTRY(dg->entry[2])), cap("STYLE"), finalstring, NULL);
2220 	finalstring = insert_string_if_entry((GTK_ENTRY(dg->entry[3])), NULL, finalstring, NULL);
2221 	thestring = finalstring;
2222 	finalstring = g_strconcat(thestring, ">", NULL);
2223 	g_free(thestring);
2224 	/* Insert tag in document */
2225 	if (dg->range.end == -1) {
2226 		doc_insert_two_strings(dg->doc, finalstring, cap("</EMBED>"));
2227 	} else {
2228 		doc_replace_text(dg->doc, finalstring, dg->range.pos, dg->range.end);
2229 	}
2230 
2231 	/* Free */
2232 	g_free(finalstring);
2233 	html_diag_destroy_cb(NULL, dg);
2234 
2235 }
2236 
2237 void
embed_dialog(Tbfwin * bfwin,Ttagpopup * data)2238 embed_dialog(Tbfwin * bfwin, Ttagpopup * data)
2239 {
2240 		/* Controls */
2241 	GtkWidget *dgtable, *but;
2242 	Thtml_diag *dg;
2243 
2244 	/* Attributes name list */
2245 	static gchar *tagitems[] = { "src", "type", "width", "height", "id", "class", "style", NULL };
2246 	gchar *tagvalues[8];
2247 	gchar *custom=NULL;
2248 
2249 	dg = html_diag_new(bfwin, _("Embed"));
2250 	fill_dialogvalues(tagitems, tagvalues, &custom, (Ttagpopup *) data, dg);
2251 	dgtable = html_diag_table_in_vbox(dg, 5,5);
2252 
2253 	dg->combo[0] = html_diag_combobox_with_popdown(tagvalues[0], bfwin->session->urllist, 1);
2254 	but = file_but_new(GTK_WIDGET(gtk_bin_get_child(GTK_BIN(dg->combo[0]))), 0, bfwin);
2255 	gtk_table_attach(GTK_TABLE(dgtable), GTK_WIDGET(but), 5,6, 0,1, GTK_SHRINK,GTK_SHRINK,0,0);
2256 	dialog_mnemonic_label_in_table(_("_Source:"), dg->combo[0], dgtable, 0,1, 0,1);
2257 	gtk_table_attach_defaults(GTK_TABLE(dgtable), GTK_WIDGET(GTK_BIN(dg->combo[0])), 1,5, 0,1);
2258 
2259 	dg->entry[0] = dialog_entry_in_table(tagvalues[1], dgtable, 1,5, 1,2);
2260 	dialog_mnemonic_label_in_table(_("_MIME Type:"), dg->entry[0], dgtable, 0,1, 1,2);
2261 
2262 	dg->spin[1] = spinbut_with_value(tagvalues[2]?tagvalues[2]:"200", 0, 10000, 1.0, 5.0);
2263 	dialog_mnemonic_label_in_table(_("_Width:"), dg->spin[1], dgtable, 0,1, 2,3);
2264 	gtk_table_attach_defaults(GTK_TABLE(dgtable), dg->spin[1], 1,2, 2,3);
2265 
2266 	dg->spin[2] = spinbut_with_value(tagvalues[3]?tagvalues[3]:"200", 0, 10000, 1.0, 5.0);
2267 	dialog_mnemonic_label_in_table(_("_Height:"), dg->spin[2], dgtable, 3,4, 2,3);
2268 	gtk_table_attach_defaults(GTK_TABLE(dgtable), dg->spin[2], 4,6, 2,3);
2269 
2270 	dg->entry[1] = dialog_entry_in_table(tagvalues[4], dgtable, 1,2, 3,4);
2271 	dialog_mnemonic_label_in_table(_("_Id:"), dg->entry[1], dgtable, 0,1, 3,4);
2272 
2273 	dg->combo[1] = html_diag_combobox_with_popdown(tagvalues[5], bfwin->session->classlist, 1);
2274 	gtk_table_attach_defaults(GTK_TABLE(dgtable), dg->combo[1], 4,6, 3,4);
2275 	dialog_mnemonic_label_in_table(_("Cl_ass:"), dg->combo[1], dgtable, 3,4, 3,4);
2276 
2277 	dg->entry[2] = dialog_entry_in_table(tagvalues[6], dgtable, 1,4, 4,5);
2278 	dialog_mnemonic_label_in_table(_("_Style:"), dg->entry[2], dgtable, 0,1, 4,5);
2279 	but = style_but_new(dg->entry[2], dg->dialog);
2280 	gtk_table_attach(GTK_TABLE(dgtable), but, 4,6, 4,5, GTK_SHRINK,GTK_SHRINK,0,0);
2281 
2282 	dg->entry[3] = dialog_entry_in_table(custom, dgtable, 1,6, 5,6);
2283 	dialog_mnemonic_label_in_table(_("Custo_m:"), dg->entry[3], dgtable, 0,1, 5,6);
2284 
2285 	html_diag_finish(dg, G_CALLBACK(embedok_lcb));
2286 }
2287 
2288 static void
scriptok_lcb(GtkWidget * widget,Thtml_diag * dg)2289 scriptok_lcb(GtkWidget * widget, Thtml_diag * dg)
2290 {
2291 	gchar *thestring, *finalstring, *endstring;
2292 	gboolean is_xhtml = get_curlang_option_value(dg->bfwin, lang_is_XHTML);
2293 	thestring = g_strdup(cap("<SCRIPT"));
2294 	thestring = insert_string_if_combobox(GTK_COMBO_BOX(dg->combo[0]), cap("SRC"), thestring, NULL);
2295 	thestring = insert_string_if_combobox(GTK_COMBO_BOX(dg->combo[1]), cap("LANGUAGE"), thestring, NULL);
2296 	thestring = insert_string_if_combobox(GTK_COMBO_BOX(dg->combo[2]), cap("TYPE"), thestring, NULL);
2297 	thestring = insert_string_if_combobox(GTK_COMBO_BOX(dg->combo[3]), cap("CHARSET"), thestring, NULL);
2298 	thestring = insert_attr_if_checkbox(dg->check[0], is_xhtml ? cap("ASYNC=\"async\"") : cap("ASYNC"), thestring);
2299 	thestring = insert_attr_if_checkbox(dg->check[1], is_xhtml ? cap("DEFER=\"defer\"") : cap("DEFER"), thestring);
2300 	thestring = insert_string_if_entry(GTK_ENTRY(dg->entry[1]), NULL, thestring, NULL);
2301 	finalstring = g_strconcat(thestring, ">", NULL);
2302 	endstring = cap("</SCRIPT>");
2303 	g_free(thestring);
2304 
2305 	if (dg->range.end == -1) {
2306 		doc_insert_two_strings(dg->doc, finalstring, endstring);
2307 	} else {
2308 		doc_replace_text(dg->doc, finalstring, dg->range.pos, dg->range.end);
2309 	}
2310 	g_free(finalstring);
2311 	html_diag_destroy_cb(NULL, dg);
2312 }
2313 
2314 void
script_dialog(Tbfwin * bfwin,Ttagpopup * data)2315 script_dialog(Tbfwin * bfwin, Ttagpopup * data)
2316 {
2317 	GtkWidget *but;
2318 	GList *tmplist, *tmplist2, *tmplist3;
2319 	GtkWidget *dgtable;
2320 	Thtml_diag *dg;
2321 	static gchar *scriptitems[] = { "src", "language", "type", "charset", NULL };
2322 	gchar *tagvalues[5];
2323 	gchar *custom = NULL;
2324 
2325 	dg = html_diag_new(bfwin, _("Script"));
2326 	fill_dialogvalues(scriptitems, tagvalues, &custom, (Ttagpopup *) data, dg);
2327 
2328 	dgtable = html_diag_table_in_vbox(dg, 6, 12);
2329 
2330 	tmplist = g_list_append(NULL, "javascript");
2331 	tmplist = g_list_append(tmplist, "javascript1.2");
2332 	tmplist = g_list_append(tmplist, "javascript1.1");
2333 	tmplist2 = g_list_append(NULL, "application/javascript");
2334 	tmplist2 = g_list_append(tmplist2, "text/javascript");
2335 	tmplist2 = g_list_append(tmplist2, "application/x-javascript");
2336 	tmplist2 = g_list_append(tmplist2, "text/plain");
2337 	tmplist2 = g_list_append(tmplist2, "text/html");
2338 	tmplist3 = list_from_arglist(FALSE, "UTF-8", "ISO-8859-1", "ISO-8859-15", "ARMSCII-8", "BIG5", "BIG5-HKSCS", "CP866", "EUC-JP", "EUC-KR", "EUC-TW", "GB18030", "GB2312", "GBK", "GEORGIAN-ACADEMY", "HZ", "IBM850", "IBM852", "IBM855", "IBM857", "IBM862", "IBM864", "ISO-2022-JP", "ISO-2022-KR", "ISO-8859-10", "ISO-8859-13", "ISO-8859-14", "ISO-8859-16", "ISO-8859-2", "ISO-8859-3", "ISO-8859-4", "ISO-8859-5", "ISO-8859-6", "ISO-8859-7", "ISO-8859-8", "ISO-8859-8-I", "ISO-8859-9", "ISO-IR-111", "JOHAB", "KOI8R", "KOI8U", "SHIFT_JIS", "TCVN", "TIS-620", "UHC", "VISCII", "WINDOWS-1250", "WINDOWS-1251", "WINDOWS-1252", "WINDOWS-1253", "WINDOWS-1254", "WINDOWS-1255", "WINDOWS-1256", "WINDOWS-1257", "WINDOWS-1258",NULL);
2339 
2340 	dg->combo[0] = html_diag_combobox_with_popdown(tagvalues[0], bfwin->session->urllist, 1);
2341 	but = file_but_new(GTK_WIDGET(gtk_bin_get_child(GTK_BIN(dg->combo[0]))), 0, bfwin);
2342 	gtk_table_attach(GTK_TABLE(dgtable), GTK_WIDGET(but), 10,12, 0,1, GTK_SHRINK,GTK_SHRINK,0,0);
2343 	dialog_mnemonic_label_in_table(_("_Source:"), dg->combo[0], dgtable, 0,2, 0,1);
2344 	gtk_table_attach_defaults(GTK_TABLE(dgtable), GTK_WIDGET(GTK_BIN(dg->combo[0])), 2,10, 0,1);
2345 
2346 	dg->combo[1] = html_diag_combobox_with_popdown(tagvalues[1], tmplist, 1);
2347 	dialog_mnemonic_label_in_table(_("_Language:"), dg->combo[1], dgtable, 0,2, 1,2);
2348 	gtk_table_attach_defaults(GTK_TABLE(dgtable), dg->combo[1], 2,6, 1,2);
2349 	gtk_table_attach_defaults(GTK_TABLE(dgtable), GTK_WIDGET(gtk_label_new(_("(HTML4 only)"))), 7,8, 1,2);
2350 
2351 	dg->combo[2] = html_diag_combobox_with_popdown(tagvalues[2], tmplist2,1);
2352 	dialog_mnemonic_label_in_table(_("MIME _Type:"), dg->combo[2], dgtable, 0,2, 2,3);
2353 	gtk_table_attach_defaults(GTK_TABLE(dgtable), dg->combo[2], 2,6, 2,3);
2354 
2355 	dg->combo[3] = html_diag_combobox_with_popdown(tagvalues[3], tmplist3,1);
2356 	dialog_mnemonic_label_in_table(_("_Charset:"), dg->combo[3], dgtable, 0,2, 3,4);
2357 	gtk_table_attach_defaults(GTK_TABLE(dgtable), dg->combo[3], 2,6, 3,4);
2358 	gtk_table_attach_defaults(GTK_TABLE(dgtable), GTK_WIDGET(gtk_label_new(_("(HTML5)"))), 7,8, 3,4);
2359 
2360 	dg->check[0] = gtk_check_button_new();
2361 	dialog_mnemonic_label_in_table(_("_Async:"), dg->check[0], dgtable, 0,1, 4,5);
2362 	gtk_table_attach_defaults(GTK_TABLE(dgtable), dg->check[0], 1,2, 4,5);
2363 
2364 	dg->check[1] = gtk_check_button_new();
2365 	dialog_mnemonic_label_in_table(_("_Defer:"), dg->check[1], dgtable, 4,5, 4,5);
2366 	gtk_table_attach_defaults(GTK_TABLE(dgtable), dg->check[1], 5,6, 4,5);
2367 	gtk_table_attach_defaults(GTK_TABLE(dgtable), GTK_WIDGET(gtk_label_new(_("(HTML5)"))), 7,8, 4,5);
2368 
2369 	dg->entry[1] = dialog_entry_in_table(custom, dgtable, 2,12, 5,6);
2370 	dialog_mnemonic_label_in_table(_("Custo_m:"), dg->entry[1], dgtable, 0,2, 5,6);
2371 
2372 	html_diag_finish(dg, G_CALLBACK(scriptok_lcb));
2373 	g_list_free(tmplist);
2374 	g_list_free(tmplist2);
2375 	g_list_free(tmplist3);
2376 }
2377 
2378 static void
columncount_auto_toggled_lcb(GtkWidget * checkbutton,Thtml_diag * dg)2379 columncount_auto_toggled_lcb(GtkWidget * checkbutton, Thtml_diag * dg)
2380 {
2381 	if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbutton))){
2382 		gtk_widget_set_sensitive(dg->spin[0], FALSE);
2383 	} else {
2384 		gtk_widget_set_sensitive(dg->spin[0], TRUE);
2385 	}
2386 }
2387 
2388 static void
columnwidth_auto_toggled_lcb(GtkWidget * checkbutton,Thtml_diag * dg)2389 columnwidth_auto_toggled_lcb(GtkWidget * checkbutton, Thtml_diag * dg)
2390 {
2391 	if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbutton))){
2392 		gtk_widget_set_sensitive(dg->spin[1], FALSE);
2393 		gtk_widget_set_sensitive(dg->combo[0], FALSE);
2394 	} else {
2395 		gtk_widget_set_sensitive(dg->spin[1], TRUE);
2396 		gtk_widget_set_sensitive(dg->combo[0], TRUE);
2397 	}
2398 }
2399 
2400 static void
columngap_normal_clicked_lcb(GtkWidget * checkbutton,Thtml_diag * dg)2401 columngap_normal_clicked_lcb(GtkWidget * checkbutton, Thtml_diag * dg)
2402 {
2403 	if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbutton))){
2404 		gtk_widget_set_sensitive(dg->spin[2], FALSE);
2405 		gtk_widget_set_sensitive(dg->combo[1], FALSE);
2406 	} else {
2407 		gtk_widget_set_sensitive(dg->spin[2], TRUE);
2408 		gtk_widget_set_sensitive(dg->combo[1], TRUE);
2409 	}
2410 }
2411 
2412 static void
columnrulewidth_changed_lcb(GtkWidget * widget,Thtml_diag * dg)2413 columnrulewidth_changed_lcb(GtkWidget * widget, Thtml_diag * dg)
2414 {
2415 	if (strlen(gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(dg->combo[5])))) {
2416 		gtk_widget_set_sensitive(dg->spin[3], FALSE);
2417 		gtk_widget_set_sensitive(dg->combo[4], FALSE);
2418 	} else {
2419 		gtk_widget_set_sensitive(dg->spin[3], TRUE);
2420 		gtk_widget_set_sensitive(dg->combo[4], TRUE);
2421 	}
2422 }
2423 
2424 static void
columnselector_toggled_lcb(GtkWidget * widget,Thtml_diag * dg)2425 columnselector_toggled_lcb(GtkWidget * widget, Thtml_diag * dg)
2426 {
2427 	if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dg->radio[0]))) {
2428 		gtk_widget_set_sensitive(dg->entry[0], TRUE);
2429 	} else {
2430 		gtk_widget_set_sensitive(dg->entry[0], FALSE);
2431 	}
2432 }
2433 
2434 static void
columnsok_lcb(GtkWidget * widget,Thtml_diag * dg)2435 columnsok_lcb(GtkWidget * widget, Thtml_diag * dg)
2436 {
2437 	gchar *thestring, *finalstring, *endstring, *tmpstring;
2438 	gboolean moz, webkit;
2439 	moz = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dg->check[3]));
2440 	webkit = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dg->check[4]));
2441 
2442 	thestring = g_strdup("");
2443 	endstring = g_strdup("; ");
2444 	finalstring = g_strdup("");
2445 	if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dg->radio[0]))) {
2446 		if(gtk_entry_get_text_length(GTK_ENTRY(dg->entry[0]))==0) {
2447 			finalstring = g_strdup("\n");
2448 			endstring = g_strdup(";\n");
2449 		} else {
2450 			thestring = g_strconcat(thestring, gtk_entry_get_text(GTK_ENTRY(dg->entry[0])), " {\n",  NULL);
2451 			finalstring = g_strdup("\n}\n");
2452 			endstring = g_strdup(";\n");
2453 		}
2454 	}
2455 	if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dg->radio[1]))) {
2456 		thestring = g_strdup(" style=\"");
2457 		finalstring = g_strdup("\"");
2458 	}
2459 
2460 	tmpstring = g_strdup("columns: ");
2461 	if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dg->check[2]))) {
2462 	   tmpstring =  g_strconcat(tmpstring, "auto", NULL);
2463 	} else {
2464 		tmpstring = g_strconcat(tmpstring, gtk_entry_get_text(GTK_ENTRY(GTK_SPIN_BUTTON(dg->spin[0]))), NULL);
2465 	}
2466 	if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dg->check[3]))) {
2467 	   tmpstring =  g_strconcat(tmpstring, " auto", endstring, NULL);
2468 	} else {
2469 		tmpstring = g_strconcat(tmpstring, " ", gtk_entry_get_text(GTK_ENTRY(GTK_SPIN_BUTTON(dg->spin[1]))),
2470 		gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(dg->combo[0])), endstring, NULL);
2471 	}
2472 	thestring = g_strconcat(thestring, tmpstring, NULL);
2473 	if (moz) {thestring = g_strconcat(thestring, "-moz-", tmpstring, NULL);}
2474 	if (webkit) {thestring = g_strconcat(thestring, "-webkit-", tmpstring, NULL);}
2475 	g_free(tmpstring);
2476 
2477 	tmpstring =  g_strdup("column-gap: ");
2478 	if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dg->check[4]))) {
2479 	   tmpstring =  g_strconcat (tmpstring, "normal", endstring, NULL);
2480 	} else {
2481 		tmpstring = g_strconcat(tmpstring, gtk_entry_get_text(GTK_ENTRY(GTK_SPIN_BUTTON(dg->spin[2]))),
2482 		gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(dg->combo[1])), endstring, NULL);
2483 	}
2484 	thestring = g_strconcat(thestring, tmpstring, NULL);
2485 	if (moz) {thestring = g_strconcat(thestring, "-moz-", tmpstring, NULL);}
2486 	if (webkit) {thestring = g_strconcat(thestring, "-webkit-", tmpstring, NULL);}
2487 	g_free(tmpstring);
2488 
2489 	tmpstring =  g_strdup("column-rule: ");
2490 	tmpstring = g_strconcat(tmpstring, gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(dg->combo[2])), " ", NULL);
2491 	tmpstring = g_strconcat(tmpstring, gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(dg->combo[3])), " ", NULL);
2492 	if (strlen(gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(dg->combo[5])))) {
2493 		tmpstring = g_strconcat(tmpstring, gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(dg->combo[5])), endstring, NULL);
2494 	} else {
2495 		tmpstring = g_strconcat(tmpstring, gtk_entry_get_text(GTK_ENTRY(GTK_SPIN_BUTTON(dg->spin[3]))),
2496 		gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(dg->combo[4])), endstring, NULL);
2497 	}
2498 	thestring = g_strconcat(thestring, tmpstring, NULL);
2499 	if (moz) {thestring = g_strconcat(thestring, "-moz-", tmpstring, NULL);}
2500 	if (webkit) {thestring = g_strconcat(thestring, "-webkit-", tmpstring, NULL);}
2501 	g_free(tmpstring);
2502 
2503 	if (dg->range.end == -1) {
2504 		doc_insert_two_strings(dg->doc, thestring, finalstring );
2505 	} else {
2506 		doc_replace_text(dg->doc, finalstring, dg->range.pos, dg->range.end);
2507 	}
2508 	g_free(thestring);
2509 	g_free(finalstring);
2510 	g_free(endstring);
2511 	html_diag_destroy_cb(NULL, dg);
2512 }
2513 
2514 void
columns_dialog(Tbfwin * bfwin,Ttagpopup * data)2515 columns_dialog(Tbfwin * bfwin, Ttagpopup * data)
2516 {
2517 	GtkWidget *color_but;
2518 	GList *tmplist = 	list_from_arglist(FALSE,"em", "px", "ex", "ch", "rem", "px", "pc", "pt",
2519 				"mm", "cm", "in", "%", NULL),
2520 		*tmplist2 = list_from_arglist(FALSE, "", "none", "hidden", "dotted", "dashed", "solid",
2521 				"double", "groove", "ridge", "inset", "outset", NULL),
2522 		*tmplist3 = list_from_arglist(FALSE, "", "thin", "medium", "thick", NULL) ;
2523 	GtkWidget *dgtable;
2524 	Thtml_diag *dg;
2525 	static gchar *tagitems[] = { "column-count", "column-width", "column-width-unit", "column-gap",
2526 				"column-gap-unit", "column-rule-color", "column-rule-style", "column-rule-width",
2527 				"column-rule-width-unit", "column-rule-width-var", "selectors", NULL };
2528 	gchar *tagvalues[12];
2529 	gchar *custom = NULL;
2530 
2531 /*
2532 todo check buttons:
2533 column-span: all (default none)
2534 column-fill: auto (default balance)
2535 */
2536 
2537 	dg = html_diag_new(bfwin, _("CSS3 multi-column layout"));
2538 	fill_dialogvalues(tagitems, tagvalues, &custom, (Ttagpopup *) data, dg);
2539 	dgtable = html_diag_table_in_vbox(dg, 9, 4);
2540 
2541 	dg->spin[0] = spinbut_with_value(tagvalues[0] ? tagvalues[0]: "2", 1, 100, 1, 5);
2542 	gtk_widget_set_tooltip_text(
2543 			dialog_mnemonic_label_in_table("column-c_ount:", dg->spin[0], dgtable, 0,1, 0,1),
2544 			_("Auto (default) or number of columns"));
2545 	gtk_table_attach_defaults(GTK_TABLE(dgtable), dg->spin[0], 1,2, 0,1);
2546 	dg->check[2] = gtk_check_button_new_with_mnemonic("_auto");
2547 	g_signal_connect(dg->check[2], "toggled", G_CALLBACK(columncount_auto_toggled_lcb), dg);
2548 	gtk_table_attach_defaults(GTK_TABLE(dgtable), dg->check[2], 3,4, 0,1);
2549 
2550 	dg->spin[1] = spinbut_with_value(tagvalues[1] ? tagvalues[1]: "50", 0, 10000, 0.1, 1.0);
2551 	gtk_widget_set_tooltip_text(
2552 			dialog_mnemonic_label_in_table("column-_width:", dg->spin[1], dgtable, 0,1, 1,2),
2553 			_("Auto (default) or width"));
2554 	gtk_table_attach_defaults(GTK_TABLE(dgtable), dg->spin[1], 1,2, 1,2);
2555 	dg->combo[0] = html_diag_combobox_with_popdown_sized(tagvalues[2] ? tagvalues[2]: "%", tmplist, 0, 70);
2556 	gtk_table_attach_defaults(GTK_TABLE(dgtable), dg->combo[0], 2,3, 1,2);
2557 	dg->check[3] = gtk_check_button_new_with_mnemonic("a_uto");
2558 	g_signal_connect(dg->check[3], "toggled", G_CALLBACK(columnwidth_auto_toggled_lcb), dg);
2559 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dg->check[3]), TRUE);
2560 	gtk_table_attach_defaults(GTK_TABLE(dgtable), dg->check[3], 3,4, 1,2);
2561 
2562 	dg->spin[2] = spinbut_with_value(tagvalues[3] ? tagvalues[3]: "1", 0, 10000, 0.1, 1.0);
2563 	gtk_widget_set_tooltip_text(
2564 			dialog_mnemonic_label_in_table("column-_gap:", dg->spin[2], dgtable, 0,1, 2,3),
2565 			_("Normal (default) or width of the gap between columns"));
2566 	gtk_table_attach_defaults(GTK_TABLE(dgtable), dg->spin[2], 1,2, 2,3);
2567 	dg->combo[1] = html_diag_combobox_with_popdown_sized(tagvalues[4] ? tagvalues[4]: "em", tmplist, 0, 70);
2568 	gtk_table_attach_defaults(GTK_TABLE(dgtable), dg->combo[1], 2,3, 2,3);
2569 	dg->check[4] = gtk_check_button_new_with_mnemonic("_normal");
2570 	g_signal_connect(dg->check[4], "clicked", G_CALLBACK(columngap_normal_clicked_lcb), dg);
2571 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dg->check[4]), TRUE);
2572 	gtk_table_attach_defaults(GTK_TABLE(dgtable), dg->check[4], 3,4, 2,3);
2573 
2574 	dg->combo[2] = html_diag_combobox_with_popdown_sized(tagvalues[5], bfwin->session->colorlist, 1, 110);
2575 	color_but = color_but_new(gtk_bin_get_child(GTK_BIN(dg->combo[2])), dg->dialog);
2576 	dialog_mnemonic_label_in_table("column-rule-co_lor:", dg->combo[2], dgtable, 0,1, 3,4);
2577 	gtk_table_attach_defaults(GTK_TABLE(dgtable), GTK_WIDGET(GTK_BIN(dg->combo[2])), 1,2, 3,4);
2578 	gtk_table_attach_defaults(GTK_TABLE(dgtable), GTK_WIDGET(color_but), 2,3, 3,4);
2579 
2580 	dg->combo[3] = html_diag_combobox_with_popdown_sized(tagvalues[6] ? tagvalues[6]: "solid", tmplist2, 0, 110);
2581 	gtk_widget_set_tooltip_text(
2582 			dialog_mnemonic_label_in_table("column-rule-_style:", dg->combo[3], dgtable, 0,1, 4,5),
2583 			_("None (default) or style"));
2584 	gtk_table_attach_defaults(GTK_TABLE(dgtable), GTK_WIDGET(GTK_BIN(dg->combo[3])), 1,2, 4,5);
2585 
2586 	dg->spin[3] = spinbut_with_value(tagvalues[7] ? tagvalues[7]: "0.5", 0, 10000, 0.1, 1.0);
2587 	gtk_widget_set_tooltip_text(
2588 			dialog_mnemonic_label_in_table("column-rule-wi_dth:", dg->spin[3], dgtable, 0,1, 5,6),
2589 			_("Medium (default) or width"));
2590 	gtk_table_attach_defaults(GTK_TABLE(dgtable), dg->spin[3], 1,2, 5,6);
2591 
2592 	dg->combo[4] = html_diag_combobox_with_popdown_sized(tagvalues[8] ? tagvalues[8]: "em", tmplist, 0, 70);
2593 	gtk_table_attach_defaults(GTK_TABLE(dgtable), dg->combo[4], 2,3, 5,6);
2594 
2595 	dg->combo[5] = html_diag_combobox_with_popdown_sized(tagvalues[9] ? tagvalues[9]: "medium", tmplist3, 0, 90);
2596 	g_signal_connect(dg->combo[5], "changed", G_CALLBACK(columnrulewidth_changed_lcb), dg);
2597 	gtk_table_attach_defaults(GTK_TABLE(dgtable), GTK_WIDGET(GTK_BIN(dg->combo[5])), 3,4, 5,6);
2598 	gtk_widget_set_sensitive(dg->spin[3], FALSE);
2599 	gtk_widget_set_sensitive(dg->combo[4], FALSE);
2600 
2601 	gtk_table_attach_defaults(GTK_TABLE(dgtable), GTK_WIDGET(gtk_label_new(
2602 			_("Use vendor-prefixed CSS property:"))), 0,2, 6,7);
2603 	dg->check[3] = gtk_check_button_new_with_mnemonic("G_ecko");
2604 	gtk_table_attach_defaults(GTK_TABLE(dgtable), dg->check[3], 2,3, 6,7);
2605 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dg->check[3]), TRUE);
2606 	dg->check[4] = gtk_check_button_new_with_mnemonic("Web_kit");
2607 	gtk_table_attach_defaults(GTK_TABLE(dgtable), dg->check[4], 3,4, 6,7);
2608 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dg->check[4]), TRUE);
2609 
2610 	dg->radio[0] = gtk_radio_button_new_with_mnemonic(NULL, _("styles_heet"));
2611 	gtk_widget_set_tooltip_text(dg->radio[0],_("Add selector(s) to create a new rule"));
2612 	dg->radio[1] = gtk_radio_button_new_with_mnemonic(gtk_radio_button_get_group
2613 			(GTK_RADIO_BUTTON(dg->radio[0])), _("style a_ttribute"));
2614 	gtk_widget_set_tooltip_text(dg->radio[1],_("Add a style attribute in tag"));
2615 	dg->radio[2] = gtk_radio_button_new_with_mnemonic(gtk_radio_button_get_group
2616 			(GTK_RADIO_BUTTON(dg->radio[0])), _("style _values"));
2617 	gtk_widget_set_tooltip_text(dg->radio[2],_("Add values in a style attribute"));
2618 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dg->radio[0]), TRUE);
2619 	gtk_table_attach_defaults(GTK_TABLE(dgtable), dg->radio[0], 0,1, 7,8);
2620 	gtk_table_attach_defaults(GTK_TABLE(dgtable), dg->radio[1], 1,2, 7,8);
2621 	gtk_table_attach_defaults(GTK_TABLE(dgtable), dg->radio[2], 2,4, 7,8);
2622 	g_signal_connect(GTK_TOGGLE_BUTTON(dg->radio[0]), "toggled",
2623 				G_CALLBACK(columnselector_toggled_lcb), dg);
2624 
2625 	dg->entry[0] = dialog_entry_in_table(tagvalues[10], dgtable, 1,4, 8,9);
2626 	gtk_widget_set_tooltip_text(
2627 			dialog_mnemonic_label_in_table(_("Selecto_rs:"), dg->entry[0], dgtable, 0,1, 8,9),
2628 			_("Leave empty to insert declarations into an existing rule."));
2629 
2630 	g_list_free(tmplist);
2631 	g_list_free(tmplist2);
2632 	g_list_free(tmplist3);
2633 
2634 	html_diag_finish(dg, G_CALLBACK(columnsok_lcb));
2635 }
2636 
2637 static void
linkdialogok_lcb(GtkWidget * widget,Thtml_diag * dg)2638 linkdialogok_lcb(GtkWidget * widget, Thtml_diag * dg)
2639 {
2640 	gchar *thestring, *finalstring;
2641 
2642 	thestring = g_strdup(cap("<LINK"));
2643 	thestring = insert_string_if_combobox(GTK_COMBO_BOX(dg->attrwidget[0]), cap("HREF"), thestring, NULL);
2644 	thestring = insert_string_if_entry(GTK_ENTRY(dg->attrwidget[1]), cap("HREFLANG"), thestring, NULL);
2645 	thestring = insert_string_if_entry(GTK_ENTRY(dg->attrwidget[2]), cap("TITLE"), thestring, NULL);
2646 	thestring = insert_string_if_combobox(GTK_COMBO_BOX(dg->attrwidget[3]), cap("TYPE"), thestring, NULL);
2647 	thestring = insert_string_if_combobox(GTK_COMBO_BOX(dg->attrwidget[4]), cap("REL"), thestring, NULL);
2648 	thestring = insert_string_if_combobox(GTK_COMBO_BOX(dg->attrwidget[5]), cap("REV"), thestring, NULL);
2649 	thestring = insert_string_if_combobox(GTK_COMBO_BOX(dg->attrwidget[6]), cap("MEDIA"), thestring, NULL);
2650 	thestring = insert_string_if_entry(GTK_ENTRY(dg->attrwidget[7]), cap("LANG"), thestring, NULL);
2651 	thestring = insert_string_if_entry(GTK_ENTRY(dg->attrwidget[8]), NULL, thestring, NULL);
2652 	finalstring = g_strconcat(thestring, get_curlang_option_value(dg->bfwin, self_close_singleton_tags) ? " />" : ">", NULL);
2653 	g_free(thestring);
2654 
2655 	if (dg->range.end == -1) {
2656 		doc_insert_two_strings(dg->doc, finalstring, NULL);
2657 	} else {
2658 		doc_replace_text(dg->doc, finalstring, dg->range.pos, dg->range.end);
2659 	}
2660 	g_free(finalstring);
2661 	html_diag_destroy_cb(NULL, dg);
2662 }
2663 
2664 /*
2665  * This dialog can be used for almost every <link .../> tag usage. A few parts
2666  * are missing:
2667  *
2668  *   - rel="fontdef" src="..." which is for downloadable font types
2669  *     should grey out everything else or separate dialog?
2670  *   - missing: target (bad-style?), and charset attributes are not part of
2671  *     the dialog
2672  *
2673  * The mode-switch can be used to add more default values for links (see
2674  * html.h -> Tlinkdialog_mode. Maybe we can use this to handle the link-dialog
2675  * for downloadable font types. Oliver suggested to add some buttons as a way
2676  * for a fast and direct way to access several standard values (e.g. CSS) from
2677  * inside the dialog.
2678  */
2679 void
linkdialog_dialog(Tbfwin * bfwin,Ttagpopup * data,Tlinkdialog_mode mode)2680 linkdialog_dialog(Tbfwin * bfwin, Ttagpopup * data, Tlinkdialog_mode mode)
2681 {
2682 	static gchar *tagitems[] = { "href", "hreflang", "title", "type", "rel", "rev", "media", "lang", NULL };
2683 	gchar *tagvalues[9];
2684 	gchar *custom = NULL;
2685 	Thtml_diag *dg;
2686 	GtkWidget *dgtable, *but;
2687 
2688 	dg = html_diag_new(bfwin, _("Link"));
2689 	fill_dialogvalues(tagitems, tagvalues, &custom, (Ttagpopup *) data, dg);
2690 	dgtable = html_diag_table_in_vbox(dg, 3, 10);
2691 	{
2692 		GList *rel_link_list = NULL, *tmplist;
2693 		rel_link_list = list_relative_document_filenames(bfwin->current_document);
2694 		tmplist = duplicate_stringlist(bfwin->session->urllist, 1);
2695 		rel_link_list = g_list_concat(tmplist, rel_link_list);
2696 		dg->attrwidget[0] = html_diag_combobox_with_popdown(tagvalues[0], rel_link_list, 1);
2697 		free_stringlist(rel_link_list);
2698 	}
2699 	dialog_mnemonic_label_in_table(_("_HREF:"), dg->attrwidget[0], dgtable, 0,1, 0,1);
2700 	gtk_table_attach_defaults(GTK_TABLE(dgtable), dg->attrwidget[0], 1,2, 0,1);
2701 	but = file_but_new(gtk_bin_get_child(GTK_BIN(dg->attrwidget[0])), 0, bfwin);
2702 	gtk_table_attach_defaults(GTK_TABLE(dgtable), but, 2,3, 0,1);
2703 
2704 	dg->attrwidget[1] = dialog_entry_in_table(tagvalues[1], dgtable, 1,3, 1,2);
2705 	dialog_mnemonic_label_in_table(_("HREF_LANG:"), dg->attrwidget[1], dgtable, 0,1, 1,2);
2706 
2707 	dg->attrwidget[2] = dialog_entry_in_table(tagvalues[2], dgtable, 1,3, 2,3);
2708 	dialog_mnemonic_label_in_table(_("T_itle:"), dg->attrwidget[2], dgtable, 0,1, 2,3);
2709 
2710 	{
2711 		gchar *tmp;
2712 		GList *tmplist = 	list_from_arglist(FALSE, "text/html", "text/css", "text/plain", "text/javascript",
2713 							  "application/postscript", NULL);
2714 		switch (mode) {
2715 		case linkdialog_mode_default:
2716 			tmp = tagvalues[3];
2717 			break;
2718 		case linkdialog_mode_css:
2719 			tmp = "text/css";
2720 			break;
2721 		default:
2722 			tmp = tagvalues[3];
2723 			break;
2724 		}
2725 		dg->attrwidget[3] = html_diag_combobox_with_popdown(tmp, tmplist, 1);
2726 
2727 		g_list_free(tmplist);
2728 	}
2729 	dialog_mnemonic_label_in_table(_("_Type:"), dg->attrwidget[3], dgtable, 0,1, 3,4);
2730 	gtk_table_attach_defaults(GTK_TABLE(dgtable), dg->attrwidget[3], 1,3, 3,4);
2731 
2732 	{
2733 		gchar *tmp;
2734 		GList *tmplist = 	list_from_arglist(FALSE, "stylesheet", "alternate", "alternate stylesheet", "shortcut icon",
2735 							  "contents", "chapter", "section", "subsection", "index", "glossary", "appendix",
2736 							  "search", "author", "copyright", "next", "prev", "first", "last", "up", "top",
2737 							  "help", "bookmark", NULL);
2738 
2739 		switch (mode) {
2740 		case linkdialog_mode_default:
2741 			tmp = tagvalues[4];
2742 			break;
2743 		case linkdialog_mode_css:
2744 			tmp = "stylesheet";
2745 			break;
2746 		default:
2747 			tmp = tagvalues[4];
2748 			break;
2749 		}
2750 		dg->attrwidget[4] = html_diag_combobox_with_popdown(tmp, tmplist, 1);
2751 		dialog_mnemonic_label_in_table(_("_Forward Relation:"), dg->attrwidget[4], dgtable, 0,1, 4,5);
2752 		gtk_table_attach_defaults(GTK_TABLE(dgtable), dg->attrwidget[4], 1,3, 4,5);
2753 
2754 		dg->attrwidget[5] = html_diag_combobox_with_popdown(tagvalues[5], tmplist, 1);
2755 		dialog_mnemonic_label_in_table(_("_Reverse Relation:"), dg->attrwidget[5], dgtable, 0,1, 5,6);
2756 		gtk_table_attach_defaults(GTK_TABLE(dgtable), dg->attrwidget[5], 1,3, 5,6);
2757 
2758 		g_list_free(tmplist);
2759 	}
2760 
2761 	{
2762 		GList *tmplist = 	list_from_arglist(FALSE, "screen", "tty", "tv", "projection", "handheld", "print", "braille",
2763 							  "aural", "all", NULL);
2764 		dg->attrwidget[6] = html_diag_combobox_with_popdown(tagvalues[6], tmplist, 1);
2765 		g_list_free(tmplist);
2766 	}
2767 	dialog_mnemonic_label_in_table(_("Media:"), dg->attrwidget[6], dgtable, 0,1, 6,7);
2768 	gtk_table_attach_defaults(GTK_TABLE(dgtable), dg->attrwidget[6], 1,3, 6,7);
2769 
2770 	dg->attrwidget[7] = dialog_entry_in_table(tagvalues[7], dgtable, 1,3, 7,8);
2771 	dialog_mnemonic_label_in_table(_("L_ang:"), dg->attrwidget[7], dgtable, 0,1, 7,8);
2772 
2773 	dg->attrwidget[8] = dialog_entry_in_table(custom, dgtable, 1,3, 8,9);
2774 	dialog_mnemonic_label_in_table(_("_Custom:"), dg->attrwidget[8], dgtable, 0,1, 8,9);
2775 
2776 	html_diag_finish(dg, G_CALLBACK(linkdialogok_lcb));
2777 	if (custom)
2778 		g_free(custom);
2779 }
2780