1 /* -*- mode: C++; tab-width: 4; c-basic-offset: 4; -*- */
2 
3 /* AbiSource Application Framework
4  * Copyright (C) 2002 AbiSource, Inc.
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19  * 02110-1301 USA.
20  */
21 
22 #include "xap_Frame.h"
23 #include "xap_UnixApp.h"
24 #include "xap_UnixDlg_HTMLOptions.h"
25 
static_constructor(XAP_DialogFactory * pDF,XAP_Dialog_Id id)26 XAP_Dialog * XAP_UnixDialog_HTMLOptions::static_constructor (XAP_DialogFactory * pDF,
27 															 XAP_Dialog_Id id)
28 {
29 	return new XAP_UnixDialog_HTMLOptions(pDF,id);
30 }
31 
XAP_UnixDialog_HTMLOptions(XAP_DialogFactory * pDlgFactory,XAP_Dialog_Id id)32 XAP_UnixDialog_HTMLOptions::XAP_UnixDialog_HTMLOptions (XAP_DialogFactory * pDlgFactory,
33 														XAP_Dialog_Id id)
34 	: XAP_Dialog_HTMLOptions(pDlgFactory,id),
35 	  m_windowMain(NULL),
36 	  m_wIs4(NULL),
37 	  m_wAbiWebDoc(NULL),
38 	  m_wDeclareXML(NULL),
39 	  m_wAllowAWML(NULL),
40 	  m_wEmbedCSS(NULL),
41 	  m_wEmbedImages(NULL),
42           m_wMathMLRenderPNG(NULL),
43 	  m_wSplitDocument(NULL)
44 {
45 	//
46 }
47 
~XAP_UnixDialog_HTMLOptions()48 XAP_UnixDialog_HTMLOptions::~XAP_UnixDialog_HTMLOptions ()
49 {
50 	//
51 }
52 
53 typedef enum
54 {
55 	BUTTON_OK,
56 	BUTTON_SAVE_SETTINGS,
57 	BUTTON_RESTORE_SETTINGS,
58 	BUTTON_CANCEL
59 } ResponseId;
60 
runModal(XAP_Frame * pFrame)61 void XAP_UnixDialog_HTMLOptions::runModal (XAP_Frame * pFrame)
62 {
63 	if (pFrame == NULL) return;
64 
65 	/* Build the window's widgets and arrange them
66 	 */
67 	GtkWidget * mainWindow = _constructWindow ();
68 
69 	if (mainWindow == NULL) return;
70 
71 	bool stop = false;
72 	while (!stop)
73 		switch (abiRunModalDialog (GTK_DIALOG (mainWindow), pFrame, this, BUTTON_OK, false))
74 			{
75 			case BUTTON_OK:
76 				event_OK ();
77 				stop = true;
78 				break;
79 			case BUTTON_SAVE_SETTINGS:
80 				event_SaveSettings ();
81 				break;
82 			case BUTTON_RESTORE_SETTINGS:
83 				event_RestoreSettings ();
84 				break;
85 			case BUTTON_CANCEL:
86 			default:
87 				event_Cancel ();
88 				stop = true;
89 				break;
90 			}
91 	abiDestroyWidget (mainWindow);
92 }
93 
toggle_Is4()94 void XAP_UnixDialog_HTMLOptions::toggle_Is4 ()
95 {
96 	bool on = (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (m_wIs4)) == TRUE);
97 	set_HTML4 (on);
98 	refreshStates ();
99 }
100 
toggle_AbiWebDoc()101 void XAP_UnixDialog_HTMLOptions::toggle_AbiWebDoc ()
102 {
103 	bool on = (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (m_wAbiWebDoc)) == TRUE);
104 	set_PHTML (on);
105 	refreshStates ();
106 }
107 
toggle_DeclareXML()108 void XAP_UnixDialog_HTMLOptions::toggle_DeclareXML ()
109 {
110 	bool on = (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (m_wDeclareXML)) == TRUE);
111 	set_Declare_XML (on);
112 	refreshStates ();
113 }
114 
toggle_AllowAWML()115 void XAP_UnixDialog_HTMLOptions::toggle_AllowAWML ()
116 {
117 	bool on = (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (m_wAllowAWML)) == TRUE);
118 	set_Allow_AWML (on);
119 	refreshStates ();
120 }
121 
toggle_EmbedCSS()122 void XAP_UnixDialog_HTMLOptions::toggle_EmbedCSS ()
123 {
124 	bool on = (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (m_wEmbedCSS)) == TRUE);
125 	set_Embed_CSS (on);
126 	refreshStates ();
127 }
128 
toggle_EmbedImages()129 void XAP_UnixDialog_HTMLOptions::toggle_EmbedImages ()
130 {
131 	bool on = (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (m_wEmbedImages)) == TRUE);
132 	set_Embed_Images (on);
133 	refreshStates ();
134 }
135 
136 
toggle_MathMLRenderPNG()137 void XAP_UnixDialog_HTMLOptions::toggle_MathMLRenderPNG ()
138 {
139 	bool on = (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (m_wMathMLRenderPNG)) == TRUE);
140 	set_MathML_Render_PNG (on);
141 	refreshStates ();
142 }
143 
toggle_SplitDocument()144 void XAP_UnixDialog_HTMLOptions::toggle_SplitDocument ()
145 {
146 	bool on = (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (m_wSplitDocument)) == TRUE);
147 	set_Split_Document (on);
148 	refreshStates ();
149 }
refreshStates()150 void XAP_UnixDialog_HTMLOptions::refreshStates ()
151 {
152 	gboolean on;
153 
154 	on = get_HTML4 () ? TRUE : FALSE;
155 	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (m_wIs4), on);
156 
157 	on = get_PHTML () ? TRUE : FALSE;
158 	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (m_wAbiWebDoc), on);
159 
160 	on = get_Declare_XML () ? TRUE : FALSE;
161 	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (m_wDeclareXML), on);
162 
163 	on = can_set_Declare_XML () ? TRUE : FALSE;
164 	gtk_widget_set_sensitive (m_wDeclareXML, on);
165 
166 	on = get_Allow_AWML () ? TRUE : FALSE;
167 	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (m_wAllowAWML), on);
168 
169 	on = can_set_Allow_AWML () ? TRUE : FALSE;
170 	gtk_widget_set_sensitive (m_wAllowAWML, on);
171 
172 	on = get_Embed_CSS () ? TRUE : FALSE;
173 	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (m_wEmbedCSS), on);
174 
175 	on = can_set_Embed_CSS () ? TRUE : FALSE;
176 	gtk_widget_set_sensitive (m_wEmbedCSS, on);
177 
178 	on = get_Embed_Images () ? TRUE : FALSE;
179 	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (m_wEmbedImages), on);
180 
181 	on = can_set_Embed_Images () ? TRUE : FALSE;
182 	gtk_widget_set_sensitive (m_wEmbedImages, on);
183 
184         on = get_MathML_Render_PNG () ? TRUE : FALSE;
185 	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (m_wMathMLRenderPNG), on);
186 
187 	on = can_set_MathML_Render_PNG () ? TRUE : FALSE;
188 	gtk_widget_set_sensitive (m_wMathMLRenderPNG, on);
189 
190         on = get_Split_Document () ? TRUE : FALSE;
191 	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (m_wSplitDocument), on);
192 
193 	on = can_set_Split_Document () ? TRUE : FALSE;
194 	gtk_widget_set_sensitive (m_wSplitDocument, on);
195 
196 }
197 
event_OK()198 void XAP_UnixDialog_HTMLOptions::event_OK ()
199 {
200 	m_bShouldSave = true;
201 }
202 
event_SaveSettings()203 void XAP_UnixDialog_HTMLOptions::event_SaveSettings ()
204 {
205 	saveDefaults ();
206 	refreshStates ();
207 }
208 
event_RestoreSettings()209 void XAP_UnixDialog_HTMLOptions::event_RestoreSettings ()
210 {
211 	restoreDefaults ();
212 	refreshStates ();
213 }
214 
event_Cancel()215 void XAP_UnixDialog_HTMLOptions::event_Cancel ()
216 {
217 	m_bShouldSave = false;
218 }
219 
s_Is4(GtkWidget *,XAP_UnixDialog_HTMLOptions * dlg)220 static void s_Is4 (GtkWidget * /* w */, XAP_UnixDialog_HTMLOptions * dlg)
221 {
222 	dlg->toggle_Is4 ();
223 }
224 
s_AbiWebDoc(GtkWidget *,XAP_UnixDialog_HTMLOptions * dlg)225 static void s_AbiWebDoc (GtkWidget * /* w */, XAP_UnixDialog_HTMLOptions * dlg)
226 {
227 	dlg->toggle_AbiWebDoc ();
228 }
229 
s_DeclareXML(GtkWidget *,XAP_UnixDialog_HTMLOptions * dlg)230 static void s_DeclareXML (GtkWidget * /* w */, XAP_UnixDialog_HTMLOptions * dlg)
231 {
232 	dlg->toggle_DeclareXML ();
233 }
234 
s_AllowAWML(GtkWidget *,XAP_UnixDialog_HTMLOptions * dlg)235 static void s_AllowAWML (GtkWidget * /* w */, XAP_UnixDialog_HTMLOptions * dlg)
236 {
237 	dlg->toggle_AllowAWML ();
238 }
239 
s_EmbedCSS(GtkWidget *,XAP_UnixDialog_HTMLOptions * dlg)240 static void s_EmbedCSS (GtkWidget * /* w */, XAP_UnixDialog_HTMLOptions * dlg)
241 {
242 	dlg->toggle_EmbedCSS ();
243 }
244 
s_EmbedImages(GtkWidget *,XAP_UnixDialog_HTMLOptions * dlg)245 static void s_EmbedImages (GtkWidget * /* w */, XAP_UnixDialog_HTMLOptions * dlg)
246 {
247 	dlg->toggle_EmbedImages ();
248 }
249 
s_MathMLRenderPNG(GtkWidget *,XAP_UnixDialog_HTMLOptions * dlg)250 static void s_MathMLRenderPNG (GtkWidget * /* w */, XAP_UnixDialog_HTMLOptions * dlg)
251 {
252 	dlg->toggle_MathMLRenderPNG();
253 }
254 
s_SplitDocument(GtkWidget *,XAP_UnixDialog_HTMLOptions * dlg)255 static void s_SplitDocument (GtkWidget * /* w */, XAP_UnixDialog_HTMLOptions * dlg)
256 {
257 	dlg->toggle_SplitDocument();
258 }
259 
_constructWindow()260 GtkWidget * XAP_UnixDialog_HTMLOptions::_constructWindow ()
261 {
262 	const XAP_StringSet * pSS = m_pApp->getStringSet ();
263 
264 	const char * title   = static_cast<const char *>(pSS->getValue (XAP_STRING_ID_DLG_HTMLOPT_ExpTitle));
265 	const char * label   = static_cast<const char *>(pSS->getValue (XAP_STRING_ID_DLG_HTMLOPT_ExpLabel));
266 	const char * save    = static_cast<const char *>(pSS->getValue (XAP_STRING_ID_DLG_HTMLOPT_ExpSave));
267 	const char * restore = static_cast<const char *>(pSS->getValue (XAP_STRING_ID_DLG_HTMLOPT_ExpRestore));
268 
269 	const char * Is4         = static_cast<const char *>(pSS->getValue (XAP_STRING_ID_DLG_HTMLOPT_ExpIs4));
270 	const char * AbiWebDoc   = static_cast<const char *>(pSS->getValue (XAP_STRING_ID_DLG_HTMLOPT_ExpAbiWebDoc));
271 	const char * DeclareXML  = static_cast<const char *>(pSS->getValue (XAP_STRING_ID_DLG_HTMLOPT_ExpDeclareXML));
272 	const char * AllowAWML   = static_cast<const char *>(pSS->getValue (XAP_STRING_ID_DLG_HTMLOPT_ExpAllowAWML));
273 	const char * EmbedCSS    = static_cast<const char *>(pSS->getValue (XAP_STRING_ID_DLG_HTMLOPT_ExpEmbedCSS));
274 	const char * EmbedImages = static_cast<const char *>(pSS->getValue (XAP_STRING_ID_DLG_HTMLOPT_ExpEmbedImages));
275 
276         const char * MathMLRenderPNG = static_cast<const char *>(pSS->getValue (XAP_STRING_ID_DLG_HTMLOPT_ExpMathMLRenderPNG));
277 	const char * SplitDocument   = static_cast<const char *>(pSS->getValue (XAP_STRING_ID_DLG_HTMLOPT_ExpSplitDocument));
278 
279 
280 	/* This is the top level GTK widget, the window.
281 	 * It's created with a "dialog" style.
282 	 */
283 	m_windowMain = abiDialogNew ("HTML export options dialog", true, title);
284 
285 	if (m_windowMain == NULL) return NULL;
286 
287 	/* This is the top level organization widget, which packs things vertically
288 	 */
289 	GtkWidget * vboxMain = gtk_dialog_get_content_area(GTK_DIALOG(m_windowMain));
290 
291 	/* The top item in the vbox is a simple label
292 	 */
293 	GtkWidget * labelActivate = gtk_label_new (label);
294 	if (labelActivate)
295 		{
296 			gtk_widget_show (labelActivate);
297 			gtk_box_pack_start (GTK_BOX (vboxMain), labelActivate, FALSE, TRUE, 0);
298 			gtk_label_set_justify (GTK_LABEL (labelActivate), GTK_JUSTIFY_LEFT);
299 			gtk_misc_set_alignment (GTK_MISC (labelActivate), 0, 0);
300 			gtk_misc_set_padding (GTK_MISC (labelActivate), 10, 5);
301 		}
302 
303 	m_wIs4 = gtk_check_button_new_with_label (Is4);
304 	if (m_wIs4)
305 		{
306 			gtk_container_set_border_width (GTK_CONTAINER (m_wIs4), 5);
307 			gtk_widget_show (m_wIs4);
308 			gtk_box_pack_start (GTK_BOX (vboxMain), m_wIs4, TRUE, TRUE, 0);
309 			g_signal_connect (G_OBJECT (m_wIs4), "toggled",
310 							  G_CALLBACK (s_Is4), static_cast<gpointer>(this));
311 		}
312 	m_wAbiWebDoc = gtk_check_button_new_with_label (AbiWebDoc);
313 	if (m_wAbiWebDoc)
314 		{
315 			gtk_container_set_border_width (GTK_CONTAINER (m_wAbiWebDoc), 5);
316 			gtk_widget_show (m_wAbiWebDoc);
317 			gtk_box_pack_start (GTK_BOX (vboxMain), m_wAbiWebDoc, TRUE, TRUE, 0);
318 			g_signal_connect (G_OBJECT (m_wAbiWebDoc), "toggled",
319 							  G_CALLBACK (s_AbiWebDoc), static_cast<gpointer>(this));
320 		}
321 	m_wDeclareXML = gtk_check_button_new_with_label (DeclareXML);
322 	if (m_wDeclareXML)
323 		{
324 			gtk_container_set_border_width (GTK_CONTAINER (m_wDeclareXML), 5);
325 			gtk_widget_show (m_wDeclareXML);
326 			gtk_box_pack_start (GTK_BOX (vboxMain), m_wDeclareXML, TRUE, TRUE, 0);
327 			g_signal_connect (G_OBJECT (m_wDeclareXML), "toggled",
328 							  G_CALLBACK (s_DeclareXML), static_cast<gpointer>(this));
329 		}
330 	m_wAllowAWML = gtk_check_button_new_with_label (AllowAWML);
331 	if (m_wAllowAWML)
332 		{
333 			gtk_container_set_border_width (GTK_CONTAINER (m_wAllowAWML), 5);
334 			gtk_widget_show (m_wAllowAWML);
335 			gtk_box_pack_start (GTK_BOX (vboxMain), m_wAllowAWML, TRUE, TRUE, 0);
336 			g_signal_connect (G_OBJECT (m_wAllowAWML), "toggled",
337 							  G_CALLBACK (s_AllowAWML), static_cast<gpointer>(this));
338 		}
339 	m_wEmbedCSS = gtk_check_button_new_with_label (EmbedCSS);
340 	if (m_wEmbedCSS)
341 		{
342 			gtk_container_set_border_width (GTK_CONTAINER (m_wEmbedCSS), 5);
343 			gtk_widget_show (m_wEmbedCSS);
344 			gtk_box_pack_start (GTK_BOX (vboxMain), m_wEmbedCSS, TRUE, TRUE, 0);
345 			g_signal_connect (G_OBJECT (m_wEmbedCSS), "toggled",
346 							  G_CALLBACK (s_EmbedCSS), static_cast<gpointer>(this));
347 		}
348 	m_wEmbedImages = gtk_check_button_new_with_label (EmbedImages);
349 	if (m_wEmbedImages)
350 		{
351 			gtk_container_set_border_width (GTK_CONTAINER (m_wEmbedImages), 5);
352 			gtk_widget_show (m_wEmbedImages);
353 			gtk_box_pack_start (GTK_BOX (vboxMain), m_wEmbedImages, TRUE, TRUE, 0);
354 			g_signal_connect (G_OBJECT (m_wEmbedImages), "toggled",
355 							  G_CALLBACK (s_EmbedImages), static_cast<gpointer>(this));
356 		}
357 
358         m_wMathMLRenderPNG = gtk_check_button_new_with_label (MathMLRenderPNG);
359         if (m_wMathMLRenderPNG)
360 		{
361 			gtk_container_set_border_width (GTK_CONTAINER (m_wMathMLRenderPNG), 5);
362 			gtk_widget_show (m_wMathMLRenderPNG);
363 			gtk_box_pack_start (GTK_BOX (vboxMain), m_wMathMLRenderPNG, TRUE, TRUE, 0);
364 			g_signal_connect (G_OBJECT (m_wMathMLRenderPNG), "toggled",
365 							  G_CALLBACK (s_MathMLRenderPNG), static_cast<gpointer>(this));
366 		}
367 
368 	 m_wSplitDocument = gtk_check_button_new_with_label (SplitDocument);
369         if (m_wSplitDocument)
370 		{
371 			gtk_container_set_border_width (GTK_CONTAINER (m_wSplitDocument), 5);
372 			gtk_widget_show (m_wSplitDocument);
373 			gtk_box_pack_start (GTK_BOX (vboxMain), m_wSplitDocument, TRUE, TRUE, 0);
374 			g_signal_connect (G_OBJECT (m_wSplitDocument), "toggled",
375 							  G_CALLBACK (s_SplitDocument), static_cast<gpointer>(this));
376 		}
377 
378 
379 	refreshStates ();
380 
381 	abiAddStockButton (GTK_DIALOG(m_windowMain), save,    BUTTON_SAVE_SETTINGS);
382 	abiAddStockButton (GTK_DIALOG(m_windowMain), restore, BUTTON_RESTORE_SETTINGS);
383 
384 	abiAddStockButton (GTK_DIALOG(m_windowMain), GTK_STOCK_CANCEL, BUTTON_CANCEL);
385 	abiAddStockButton (GTK_DIALOG(m_windowMain), GTK_STOCK_OK,     BUTTON_OK);
386 
387 	return m_windowMain;
388 }
389