1 /*
2 **
3 ** options_setup.c
4 **
5 ** Copyright (C) 1995, 1996, 1997 Johannes Plass
6 ** Copyright (C) 2004 Jose E. Marchesi
7 **
8 ** This program is free software; you can redistribute it and/or modify
9 ** it under the terms of the GNU General Public License as published by
10 ** the Free Software Foundation; either version 3 of the License, or
11 ** (at your option) any later version.
12 **
13 ** This program is distributed in the hope that it will be useful,
14 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
15 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 ** GNU General Public License for more details.
17 **
18 ** You should have received a copy of the GNU General Public License
19 ** along with GNU gv; see the file COPYING.  If not, write to
20 ** the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
21 ** Boston, MA 02111-1307, USA.
22 **
23 ** Author:   Johannes Plass (plass@thep.physik.uni-mainz.de)
24 **           Department of Physics
25 **           Johannes Gutenberg-University
26 **           Mainz, Germany
27 **
28 **           Jose E. Marchesi (jemarch@gnu.org)
29 **           GNU Project
30 **
31 ** Changes submitted by Maurizio Loreti distributed on the public
32 ** domain:
33 **
34 **       - Code for handle bzip2 compressed files.
35 */
36 #include "ac_config.h"
37 
38 /*
39 #define MESSAGES
40 */
41 #include "message.h"
42 
43 #include "config.h"
44 
45 #include <stdio.h>
46 #include <stdlib.h>
47 #include <ctype.h>
48 
49 #include "paths.h"
50 #include INC_X11(Intrinsic.h)
51 #include INC_X11(StringDefs.h)
52 #include INC_X11(Shell.h)
53 #include INC_XAW(SmeBSB.h)
54 #include "Aaa.h"
55 #include "Button.h"
56 #include "FileSel.h"
57 #include "Ghostview.h"
58 #include "Frame.h"
59 #include "MButton.h"
60 #include "Switch.h"
61 
62 #include "types.h"
63 #include "callbacks.h"
64 #include "widgets_misc.h"
65 #include "magmenu.h"
66 #include "main_resources.h"
67 #include "main_globals.h"
68 #include "media.h"
69 #include "misc.h"
70 #include "miscmenu.h"
71 #include "note.h"
72 #include "options.h"
73 #include "options_gv.h"
74 #include "options_setup.h"
75 #include "scale.h"
76 #include "ps.h"
77 #include "doc_misc.h"
78 #include "version.h"
79 
80 static Widget   popup=NULL,optionControl;
81 static Widget   eyeGuideToggle,reverseScrollingToggle,confirmPrintToggle,autoCenterToggle;
82 static Widget   pixmapToggle,miscLabel;
83 static Widget   confirmLabel,confirmButton,confirmMenu;
84 static Widget	titleLabel,titleButton,titleMenu;
85 static Widget   print_command,scales,screenSize,medias,magmenu,miscmenu;
86 
87 String confirm_quit_styles[4] = { 0 };
88 String title_styles[4] = { 0 };
89 
90 static void options_setup_setOptionsAtEntry(void);
91 static void options_setup_create(void);
92 extern void main_setResolutions(int);
93 extern void main_createScaleMenu(void);
94 
95 /*------------------------------------------------------
96   OptionPopupStruct
97 ------------------------------------------------------*/
98 
99 OptionPopupStruct gv_options_setup_struct = {
100   NULL,
101   options_setup_create,
102   options_setup_setOptionsAtEntry,
103   False
104 };
105 
106 OptionPopup gv_options_setup = (OptionPopup) &gv_options_setup_struct;
107 
108 /*------------------------------------------------------
109    options_setup_setOptionsAtEntry
110 ------------------------------------------------------*/
111 
options_setup_setOptionsAtEntry(void)112 static void options_setup_setOptionsAtEntry(void)
113 {
114   String s;
115   Arg args[2];
116   Cardinal n;
117   char tmp[50];
118 
119   BEGINMESSAGE(options_setup_setOptionsAtEntry)
120 
121   widgets_setToggle(confirmPrintToggle, (app_res.confirm_print ? 1 : 0));
122   widgets_setToggle(reverseScrollingToggle, (app_res.reverse_scrolling ? 1 : 0));
123   widgets_setToggle(eyeGuideToggle, (app_res.scrolling_eye_guide ? 1 : 0));
124   widgets_setToggle(pixmapToggle, (app_res.use_bpixmap ? 1 : 0));
125   widgets_setToggle(autoCenterToggle, (app_res.auto_center ? 1 : 0));
126 
127   SMESSAGE(gv_print_command)
128     widgets_setText(print_command, gv_print_command);
129   SMESSAGE(gv_scales_res)
130     s = options_squeezeMultiline(gv_scales_res);
131     widgets_setText(scales,s);
132     XtFree(s);
133   SMESSAGE(gv_medias_res)
134     s = options_squeezeMultiline(gv_medias_res);
135     widgets_setText(medias,s);
136     XtFree(s);
137   SMESSAGE(gv_magmenu_entries_res)
138     s = options_squeezeMultiline(gv_magmenu_entries_res);
139     widgets_setText(magmenu,s);
140     XtFree(s);
141   SMESSAGE(gv_miscmenu_entries_res)
142     s = options_squeezeMultiline(gv_miscmenu_entries_res);
143     widgets_setText(miscmenu,s);
144     XtFree(s);
145   sprintf(tmp,"%d x %d",gv_screen_width,gv_screen_height);
146   widgets_setText(screenSize,tmp);
147 
148   s=confirm_quit_styles[app_res.confirm_quit];
149                                    n=0;
150   XtSetArg(args[n], XtNlabel, s);  n++;
151   XtSetValues(confirmButton, args, n);
152 
153   s=title_styles[app_res.title_style];
154                                    n=0;
155   XtSetArg(args[n], XtNlabel, s);  n++;
156   XtSetValues(titleButton, args, n);
157 
158   ENDMESSAGE(options_setup_setOptionsAtEntry)
159 }
160 
161 /*------------------------------------------------------
162    options_setup_cb_apply
163 ------------------------------------------------------*/
164 
options_setup_cb_apply(Widget w _GL_UNUSED,XtPointer client_data _GL_UNUSED,XtPointer call_data _GL_UNUSED)165 static void options_setup_cb_apply(Widget w _GL_UNUSED, XtPointer client_data _GL_UNUSED, XtPointer call_data _GL_UNUSED)
166 {
167    Arg args[5];
168    Cardinal n;
169    Boolean b;
170    int i,j;
171    Boolean redisplay=False;
172    Boolean reopen=False;
173    char *l;
174 
175    BEGINMESSAGE(options_setup_cb_apply)
176 
177    app_res.confirm_print = SwitchIsSet(confirmPrintToggle) ? True : False ;
178    app_res.reverse_scrolling = SwitchIsSet(reverseScrollingToggle) ? True : False ;
179    app_res.scrolling_eye_guide = SwitchIsSet(eyeGuideToggle) ? True : False ;
180    app_res.auto_center = SwitchIsSet(autoCenterToggle) ? True : False ;
181 
182    b = app_res.use_bpixmap;
183    app_res.use_bpixmap = SwitchIsSet(pixmapToggle) ? True : False;
184    cb_useBackingPixmap(NULL,(XtPointer)2,NULL);
185    if (b != app_res.use_bpixmap) reopen=True;
186 
187 							n=0;
188    XtSetArg(args[n], XtNlabel, &l);                     n++;
189    XtGetValues(titleButton, args, n);
190    i=0;j=0;
191    while (i<3) {
192      if (!strcmp(title_styles[i],l)) j = i;
193      ++i;
194    }
195    if (j != app_res.title_style) {
196      app_res.title_style = j;
197      cb_showTitle(NULL,NULL,NULL);
198    }
199 
200    options_textApply(print_command,NULL,&gv_print_command);
201    options_textApply(magmenu,NULL,&gv_magmenu_entries_res);
202    magmenu_freeMagMenuEntries(gv_magmenu_entries);
203    gv_magmenu_entries = magmenu_parseMagMenuEntries(gv_magmenu_entries_res);
204    options_textApply(miscmenu,NULL,&gv_miscmenu_entries_res);
205    miscmenu_freeMiscMenuEntries(gv_miscmenu_entries);
206    gv_miscmenu_entries = miscmenu_parseMiscMenuEntries(gv_miscmenu_entries_res);
207    l = widgets_getText(screenSize);
208    i=j=0;
209    sscanf(l," %d x %d ",&i,&j);
210    if (i>0 && j>0 && (i != gv_screen_width || j != gv_screen_height)) {
211      gv_screen_width = i;
212      gv_screen_height = j;
213      main_setResolutions(0);
214      default_xdpi=default_ydpi=0.0;
215      redisplay=True;
216    }
217 							n=0;
218    XtSetArg(args[n], XtNlabel, &l);                     n++;
219    XtGetValues(confirmButton, args, n);
220    i=0;
221    while (i<3) {
222      if (!strcmp(confirm_quit_styles[i],l)) app_res.confirm_quit = i;
223      ++i;
224    }
225 
226    {
227      char *s,*sr;
228      l = widgets_getText(scales);
229      sr = options_squeezeMultiline(gv_scales_res);
230      s  = options_squeezeMultiline(l);
231      if (strcmp(s,sr)) {
232        XtFree(sr);
233        XtFree(gv_scales_res);
234        gv_scales_res=s;
235        scale_freeScales(gv_scales);
236        gv_scales = scale_parseScales(gv_scales_res);
237        XtDestroyWidget(scaleMenu);
238        XtFree((XtPointer)scaleEntry);
239        main_createScaleMenu();
240        gv_scale = scale_checkScaleNum(gv_scales,app_res.scale|SCALE_REL);
241        if (gv_scale < 0) gv_scale = scale_checkScaleNum(gv_scales,0|SCALE_REL);
242        gv_scale &= SCALE_VAL;
243        gv_scale_base = scale_checkScaleNum(gv_scales,(app_res.scale_base-1)|SCALE_BAS);
244        if (gv_scale_base < 0) gv_scale_base = 0;
245        gv_scale_base &= SCALE_VAL;
246        gv_scale_base_current = gv_scale_base;
247        gv_scale_current = gv_scale;
248        options_gv_createScaleMenus();
249        gv_scale_current = gv_scale_base_current = -1;
250        redisplay=True;
251      } else {
252        XtFree(s);
253        XtFree(sr);
254      }
255    }
256 
257    {
258      char *s,*sr;
259      l = widgets_getText(medias);
260      sr = options_squeezeMultiline(gv_medias_res);
261      s  = options_squeezeMultiline(l);
262      if (strcmp(s,sr)) {
263        XtFree(sr);
264        XtFree(gv_medias_res);
265        gv_medias_res=s;
266        media_freeMedias(gv_medias);
267        gv_medias = media_parseMedias(gv_medias_res);
268        gv_num_std_pagemedia = media_numMedias(gv_medias);
269        if (pagemediaMenu) {
270 	 XtDestroyWidget(pagemediaMenu);
271 	 pagemediaMenu=NULL;
272        }
273        gv_fallback_pagemedia   = doc_convStringToPageMedia(NULL,app_res.fallback_pagemedia);
274        if (gv_fallback_pagemedia == MEDIA_ID_INVALID) gv_fallback_pagemedia = doc_convStringToPageMedia(NULL,"A4");
275        if (gv_fallback_pagemedia == MEDIA_ID_INVALID) {
276 	 gv_fallback_pagemedia=1;
277 	 while (!gv_medias[gv_fallback_pagemedia]->used) gv_fallback_pagemedia++;
278        }
279        gv_pagemedia = gv_pagemedia_old = MEDIA_ID_INVALID;
280        gv_pagemedia_auto_old = -1;
281        misc_buildPagemediaMenu();
282        options_gv_createMediaMenus();
283        redisplay=True;
284      } else {
285        XtFree(s);
286        XtFree(sr);
287      }
288    }
289 
290 							n=0;
291    XtSetArg(args[n], XtNreverseScrolling,app_res.reverse_scrolling);n++;
292    XtSetValues(FileSel, args, n);
293 
294    if (reopen && gv_filename) {
295      cb_stopInterpreter(page,NULL,NULL);
296      show_page(REQUEST_REOPEN,NULL);
297    } else if (redisplay) show_page(REQUEST_OPTION_CHANGE,NULL);
298 
299    ENDMESSAGE(options_setup_cb_apply)
300 }
301 
302 /*------------------------------------------------------
303    options_setup_cb_save
304 ------------------------------------------------------*/
305 
306 static
options_setup_cb_save(Widget w _GL_UNUSED,XtPointer client_data _GL_UNUSED,XtPointer call_data _GL_UNUSED)307 void options_setup_cb_save(Widget w _GL_UNUSED, XtPointer client_data _GL_UNUSED, XtPointer call_data _GL_UNUSED)
308 {
309   int    argn = 0;
310   String argi[30];
311   String argv[30];
312   char tmp[20];
313   Arg args[1];
314   Cardinal n;
315   int i;
316   String l,t = "True",f = "False";
317 
318   BEGINMESSAGE(options_setup_cb_save)
319 
320   options_setArg(&(argi[argn]),&(argv[argn]),s_version             ,gv_class       ,versionResource);
321        ++argn;
322   options_setArg(&(argi[argn]),&(argv[argn]),s_miscMenuEntries     ,gv_class       ,widgets_getText(miscmenu));
323        ++argn;
324   options_setArg(&(argi[argn]),&(argv[argn]),s_magMenu             ,gv_class       ,widgets_getText(magmenu));
325        ++argn;
326   options_setArg(&(argi[argn]),&(argv[argn]),s_medias              ,gv_class       ,widgets_getText(medias));
327        ++argn;
328   options_setArg(&(argi[argn]),&(argv[argn]),s_scales              ,gv_class       ,widgets_getText(scales));
329        ++argn;
330   options_setArg(&(argi[argn]),&(argv[argn]),s_printCommand        ,gv_class,widgets_getText(print_command));
331        ++argn;
332   options_setArg(&(argi[argn]),&(argv[argn]),s_confirmPrint        ,gv_class       ,SwitchIsSet(confirmPrintToggle) ? t : f);
333        ++argn;
334   options_setArg(&(argi[argn]),&(argv[argn]),s_reverseScrolling    ,gv_class       ,SwitchIsSet(reverseScrollingToggle) ? t : f);
335        ++argn;
336   options_setArg(&(argi[argn]),&(argv[argn]),s_scrollingEyeGuide   ,gv_class       ,SwitchIsSet(eyeGuideToggle) ? t : f);
337        ++argn;
338   options_setArg(&(argi[argn]),&(argv[argn]),s_autoCenter          ,gv_class       ,SwitchIsSet(autoCenterToggle) ? t : f);
339        ++argn;
340   options_setArg(&(argi[argn]),&(argv[argn]),s_useBackingPixmap    ,gv_class       ,SwitchIsSet(pixmapToggle) ? t : f);
341        ++argn;
342 	         	       	        n=0;
343   XtSetArg(args[n], XtNlabel, &l);      n++;
344   XtGetValues(titleButton, args, n);
345   i=0; while (i<3) {
346      if (!strcmp(title_styles[i],l)) sprintf(tmp,"%d",i);
347      ++i;
348    }
349   options_setArg(&(argi[argn]),&(argv[argn]),s_titleStyle        ,gv_class        ,tmp);
350        ++argn;
351 	         	       	        n=0;
352   XtSetArg(args[n], XtNlabel, &l);      n++;
353   XtGetValues(confirmButton, args, n);
354   i=0; while (i<3) {
355      if (!strcmp(confirm_quit_styles[i],l)) sprintf(tmp,"%d",i);
356      ++i;
357    }
358   options_setArg(&(argi[argn]),&(argv[argn]),s_confirmQuit        ,gv_class        ,tmp);
359        ++argn;
360   {
361     char name[255];
362     char val[255];
363     scale_getScreenResourceName(gv_display,val);
364     sprintf(name,"%s",val);
365     options_setArg(&(argi[argn]),&(argv[argn]),name                  ,gv_class       ,widgets_getText(screenSize));
366        ++argn;
367   }
368 
369   options_save(argn,argi,argv);
370   while (--argn >=0) {
371     XtFree(argi[argn]);
372     XtFree(argv[argn]);
373   }
374 
375   ENDMESSAGE(options_setup_cb_save)
376 }
377 
378 /*------------------------------------------------------
379    options_setup_create
380 ------------------------------------------------------*/
381 
options_setup_create(void)382 void options_setup_create(void)
383 {
384    Arg          args[10];
385    Cardinal     n;
386    Widget       w;
387    int i;
388 
389    BEGINMESSAGE(options_setup_create)
390 
391    if (popup) {
392      INFMESSAGE(popup exists)
393      ENDMESSAGE(options_setup_create)
394      return;
395    }
396 
397         						n=0;
398         XtSetArg(args[n], XtNallowShellResize, True);	n++;
399    popup = XtCreatePopupShell("optionsetupPopup",transientShellWidgetClass,toplevel, args, n);
400    gv_options_setup->popup=popup;
401          						n=0;
402    optionControl = XtCreateManagedWidget("optionControl",aaaWidgetClass,popup,args,n);
403 
404    miscLabel              = XtCreateManagedWidget("misc",labelWidgetClass,optionControl,NULL,(Cardinal)0);
405    confirmPrintToggle     = XtCreateManagedWidget("confirmPrint",switchWidgetClass,optionControl,NULL,(Cardinal)0);
406    reverseScrollingToggle = XtCreateManagedWidget("scrolling",switchWidgetClass,optionControl,NULL,(Cardinal)0);
407    eyeGuideToggle         = XtCreateManagedWidget("eyeGuide",switchWidgetClass,optionControl,NULL,(Cardinal)0);
408    autoCenterToggle       = XtCreateManagedWidget("autoCenter",switchWidgetClass,optionControl,NULL,(Cardinal)0);
409    pixmapToggle           = XtCreateManagedWidget("pixmap",switchWidgetClass,optionControl,NULL,(Cardinal)0);
410 
411    options_createLabeledMenu("title",optionControl,&titleLabel,&titleButton,&titleMenu);
412      for (i = 0; title_styles[i]; i++) {
413        w = XtCreateManagedWidget(title_styles[i],smeBSBObjectClass, titleMenu,NULL,(Cardinal)0);
414        XtAddCallback(w, XtNcallback,options_cb_changeMenuLabel,NULL);
415      }
416    options_createLabeledMenu("confirm",optionControl,&confirmLabel,&confirmButton,&confirmMenu);
417      for (i = 0; confirm_quit_styles[i]; i++) {
418        w = XtCreateManagedWidget(confirm_quit_styles[i],smeBSBObjectClass, confirmMenu,NULL,(Cardinal)0);
419        XtAddCallback(w, XtNcallback,options_cb_changeMenuLabel,NULL);
420      }
421 
422         						n=0;
423    w = XtCreateManagedWidget("apply", buttonWidgetClass,optionControl, args, n);
424          XtAddCallback(w, XtNcallback, options_setup_cb_apply,NULL);
425          XtInstallAccelerators(optionControl, w);
426    w = XtCreateManagedWidget("save", buttonWidgetClass,optionControl, args, n);
427          XtAddCallback(w, XtNcallback, options_setup_cb_save,NULL);
428          XtInstallAccelerators(optionControl, w);
429    w = XtCreateManagedWidget("dismiss", buttonWidgetClass,optionControl, args, n);
430          XtAddCallback(w, XtNcallback, options_cb_popdown,(XtPointer)gv_options_setup);
431          XtInstallAccelerators(optionControl, w);
432 
433    miscmenu         = widgets_createLabeledTextField("miscmenu", optionControl);
434    magmenu          = widgets_createLabeledTextField("magmenu", optionControl);
435    medias           = widgets_createLabeledTextField("medias", optionControl);
436    print_command    = widgets_createLabeledLineTextField("printCommand", optionControl);
437    scales           = widgets_createLabeledTextField("scales", optionControl);
438    screenSize       = widgets_createLabeledLineTextField("screenSize", optionControl);
439 
440    options_setup_setOptionsAtEntry();
441    options_realize(popup,optionControl);
442 
443    ENDMESSAGE(options_setup_create)
444 }
445 
446 
447