home *** CD-ROM | disk | FTP | other *** search
/ Tools / WinSN5.0Ver.iso / NETSCAP.50 / WIN1998.ZIP / ns / cmd / xfe / src / PrefsDialogGeneral.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1998-04-08  |  161.6 KB  |  5,342 lines

  1. /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
  2.  *
  3.  * The contents of this file are subject to the Netscape Public License
  4.  * Version 1.0 (the "NPL"); you may not use this file except in
  5.  * compliance with the NPL.  You may obtain a copy of the NPL at
  6.  * http://www.mozilla.org/NPL/
  7.  *
  8.  * Software distributed under the NPL is distributed on an "AS IS" basis,
  9.  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
  10.  * for the specific language governing rights and limitations under the
  11.  * NPL.
  12.  *
  13.  * The Initial Developer of this code under the NPL is Netscape
  14.  * Communications Corporation.  Portions created by Netscape are
  15.  * Copyright (C) 1998 Netscape Communications Corporation.  All Rights
  16.  * Reserved.
  17.  */
  18. /*
  19.    PrefsDialogGeneral.cpp -- the General page in XFE preferences dialogs
  20.    Created: Linda Wei <lwei@netscape.com>, 17-Sep-96.
  21.  */
  22.  
  23. #include "Frame.h"
  24. #include "felocale.h"
  25. #include "structs.h"
  26. #include "fonts.h"
  27. #include "xpassert.h"
  28. #include "MozillaApp.h"
  29. #include "View.h"
  30. #include "prprf.h"
  31. #include "net.h"
  32. #include "libmocha.h"
  33. #include "java.h"
  34. #include "PrefsDialogAppl.h"
  35. #include "PrefsProxiesView.h"
  36. #include "PrefsApplEdit.h"
  37. #include "Netcaster.h"
  38.  
  39. #include "PrefsDialog.h"
  40. #include "ColorDialog.h"
  41. #include "ViewGlue.h"
  42. #include "e_kit.h"
  43. #include "prefapi.h"
  44. #include "nf.h"
  45.  
  46. #include <Xm/Label.h>
  47. #include <Xm/LabelG.h>
  48. #include <Xm/CascadeBG.h>
  49. #include <Xm/PushB.h>
  50. #include <Xm/PushBG.h>
  51. #include <Xm/ToggleB.h>
  52. #include <Xm/ArrowBG.h>
  53. #include <Xm/Form.h>
  54. #include <Xm/Frame.h>
  55. #include <Xm/RowColumn.h>
  56. #include <Xm/LabelG.h> 
  57. #include <Xm/TextF.h> 
  58. #include <Xm/ToggleBG.h> 
  59. #include <XmL/Grid.h>
  60. #include <XmL/Folder.h>
  61. #include <Xm/DrawnB.h>
  62. #include <DtWidgets/ComboBox.h>
  63. #include <Xfe/Xfe.h>
  64. #include "Netcaster.h"
  65.  
  66. #define DEFAULT_COLUMN_WIDTH     35
  67. #define MAX_COLUMN_WIDTH         100
  68.  
  69. #define DEF_COLOR_BUTTON_WIDTH  40
  70. #define DEF_COLOR_BUTTON_HEIGHT 20
  71.  
  72. extern int XFE_HELPERS_LIST_HEADER;
  73. extern int XFE_PRIVATE_MIMETYPE_RELOAD;
  74. extern int XFE_PRIVATE_MAILCAP_RELOAD;
  75. extern int XFE_PRIVATE_RELOADED_MIMETYPE;
  76. extern int XFE_PRIVATE_RELOADED_MAILCAP;
  77. extern int XFE_HELPERS_NETSCAPE;
  78. extern int XFE_HELPERS_UNKNOWN;
  79. extern int XFE_HELPERS_SAVE;
  80. extern int XFE_HELPERS_PLUGIN;
  81. extern int XFE_OUT_OF_MEMORY_URL;
  82. extern int XFE_HELPERS_CANNOT_DEL_STATIC_APPS;
  83. extern int XFE_PREFS_RESTART_FOR_FONT_CHANGES;
  84.  
  85. extern "C"
  86. {
  87.     void      GH_ClearGlobalHistory(void);
  88.     void      NET_CleanupFileFormat(char *filename);
  89.     void      NET_CleanupMailCapList(char* filename);
  90.     void      NET_ReloadProxyConfig(MWContext *window_id);
  91.     void      NET_SelectProxyStyle(NET_ProxyStyle style);
  92.     void      NET_SetCacheUseMethod(CacheUseEnum method);
  93.     void      NET_SetDiskCacheSize(int32 new_size);
  94.     void      NET_SetMemoryCacheSize(int32 new_size);
  95.     void      NET_SetProxyServer(NET_ProxyType type, const char *org_host_port);
  96.     char     *XP_GetString(int i);
  97.     void      fe_browse_file_of_text(MWContext *context, Widget text_field, Boolean dirp);
  98.     void      fe_browse_file_of_text_in_url(MWContext *context, Widget text_field, Boolean dirp);
  99.     void      fe_installGeneralAppearance();
  100.     void      fe_installGeneral();
  101.     void      fe_installGeneralFonts();
  102.     void      fe_installGeneralColors();
  103.     void      fe_installGeneralAdvanced();
  104.     void      fe_installGeneralAppl();
  105.     void      fe_installGeneralCache();
  106.     void      fe_installGeneralProxies();
  107.     void      fe_installBrowserAppl();
  108.     void      fe_installDiskSpace();
  109.     void      fe_SwatchSetColor(Widget widget, LO_Color* color);
  110.     XP_Bool   fe_IsCalendarInstalled();
  111.     XP_Bool   fe_IsConferenceInstalled();
  112.  
  113.     static void fe_InvalidateFontData(void);
  114.     static void prefsGeneralFontsCb_fontFamily(Widget, XtPointer, XtPointer);
  115.     static void prefsGeneralFontsCb_fontSize(Widget, XtPointer, XtPointer);
  116.     static void fe_set_new_font_sizes(PrefsDataGeneralFonts *, fe_FontPitch *);
  117.     static void fe_set_new_font_families(PrefsDataGeneralFonts *, fe_FontPitch *, 
  118.                                          Widget, Widget);
  119.     static void fe_get_scaled_font_size(PrefsDataGeneralFonts *fep);
  120.     static Boolean xfe_is_asian_encoding(int);
  121. }
  122.  
  123. // ************************************************************************
  124. // *************************     Appearance       *************************
  125. // ************************************************************************
  126.  
  127. // Member:       XFE_PrefsPageGeneralAppearance
  128. // Description:  Constructor
  129. // Inputs:
  130. // Side effects: 
  131.  
  132. XFE_PrefsPageGeneralAppearance::XFE_PrefsPageGeneralAppearance(XFE_PrefsDialog *dialog)
  133.     : XFE_PrefsPage(dialog),
  134.       m_prefsDataGeneralAppearance(0),
  135.       m_toolbar_needs_updating(FALSE)
  136. {
  137.   m_toolbar_needs_updating = FALSE;
  138. }
  139.  
  140. // Member:       ~XFE_PrefsPageGeneralAppearance
  141. // Description:  Destructor
  142. // Inputs:
  143. // Side effects: 
  144.  
  145. XFE_PrefsPageGeneralAppearance::~XFE_PrefsPageGeneralAppearance()
  146. {
  147.     delete m_prefsDataGeneralAppearance;
  148. }
  149.  
  150. // Member:       create
  151. // Description:  Creates page for GeneralAppearance
  152. // Inputs:
  153. // Side effects: 
  154.  
  155. void XFE_PrefsPageGeneralAppearance::create()
  156. {
  157.     Widget            kids[100];
  158.     Arg               av[50];
  159.     int               ac;
  160.     int               i;
  161.  
  162.     PrefsDataGeneralAppearance *fep = NULL;
  163.  
  164.     fep = new PrefsDataGeneralAppearance;
  165.     memset(fep, 0, sizeof(PrefsDataGeneralAppearance));
  166.     m_prefsDataGeneralAppearance = fep;
  167.  
  168.     fep->context = getContext();
  169.     fep->prompt_dialog = getPrefsDialog()->getDialogChrome();
  170.  
  171.     Widget form;
  172.  
  173.     ac = 0;
  174.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
  175.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
  176.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  177.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  178.     form = XmCreateForm (m_wPageForm, "appearance", av, ac);
  179.     XtManageChild (form);
  180.     m_wPage = fep->page = form;
  181.  
  182.     // Launch on startup
  183.  
  184.     Widget frame1;
  185.  
  186.     ac = 0;
  187.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  188.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  189.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
  190.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
  191.     frame1 = XmCreateFrame (form, "launchFrame", av, ac);
  192.  
  193.     Widget form1;
  194.  
  195.     ac = 0;
  196.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  197.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  198.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
  199.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
  200.     form1 = XmCreateForm (frame1, "launchBox", av, ac);
  201.  
  202.     Widget label1;
  203.  
  204.     ac = 0;
  205.     XtSetArg (av [ac], XmNchildType, XmFRAME_TITLE_CHILD); ac++;
  206.     label1 = XmCreateLabelGadget (frame1, "launchBoxLabel", av, ac);
  207.  
  208.     Widget     navigator_toggle;
  209. #ifdef MOZ_MAIL_NEWS
  210.     Widget     messenger_toggle;
  211.     Widget     collabra_toggle;
  212.     Widget     composer_toggle;
  213.     Widget     conference_toggle = 0;
  214. #endif // MOZ_MAIL_NEWS
  215.     Widget     netcaster_toggle = 0;
  216. #ifdef MOZ_MAIL_NEWS
  217.     Widget     calendar_toggle = 0;
  218. #endif
  219. #ifdef MOZ_NETCAST
  220.     Widget     netcaster_top_widget;
  221. #endif
  222.     Widget     calendar_top_widget;
  223.  
  224.     ac = 0;
  225.     i = 0;
  226.  
  227.     kids[i++] = navigator_toggle = 
  228.         XmCreateToggleButtonGadget (form1, "navigator", av, ac);
  229.  
  230. #ifdef MOZ_MAIL_NEWS
  231.     kids[i++] = messenger_toggle = 
  232.         XmCreateToggleButtonGadget (form1, "messenger", av, ac);
  233.  
  234.     kids[i++] = collabra_toggle = 
  235.         XmCreateToggleButtonGadget (form1, "collabra", av, ac);
  236.  
  237.     kids[i++] = composer_toggle = 
  238.         XmCreateToggleButtonGadget (form1, "composer", av, ac);
  239.     calendar_top_widget = composer_toggle;
  240.     netcaster_top_widget = composer_toggle;
  241.  
  242.     if (fe_IsConferenceInstalled()) {
  243.         kids[i++] = conference_toggle = 
  244.             XmCreateToggleButtonGadget (form1, "conference", av, ac);
  245.         calendar_top_widget = conference_toggle;
  246.         netcaster_top_widget = conference_toggle;
  247.     }
  248. #endif // MOZ_MAIL_NEWS
  249.  
  250.     if (fe_IsNetcasterInstalled()) {
  251.         kids[i++] = netcaster_toggle = 
  252.             XmCreateToggleButtonGadget (form1, "netcaster", av, ac);
  253.         calendar_top_widget = netcaster_toggle;
  254.     }
  255.  
  256. #ifdef MOZ_MAIL_NEWS
  257.     if (fe_IsCalendarInstalled()) {
  258.         kids[i++] = calendar_toggle = 
  259.             XmCreateToggleButtonGadget (form1, "calendar", av, ac);
  260.     }
  261. #endif // MOZ_MAIL_NEWS
  262.  
  263.     fep->navigator_toggle = navigator_toggle;
  264. #ifdef MOZ_MAIL_NEWS
  265.     fep->messenger_toggle = messenger_toggle;
  266.     fep->collabra_toggle = collabra_toggle;
  267.     fep->composer_toggle = composer_toggle;
  268.     fep->conference_toggle = conference_toggle;
  269. #endif // MOZ_MAIL_NEWS
  270.     fep->netcaster_toggle = netcaster_toggle;
  271. #ifdef MOZ_MAIL_NEWS
  272.     fep->calendar_toggle = calendar_toggle;
  273. #endif // MOZ_MAIL_NEWS
  274.  
  275.     XtVaSetValues (navigator_toggle,
  276.                    XmNindicatorType, XmN_OF_MANY,
  277.                    XmNtopAttachment, XmATTACH_FORM,
  278.                    XmNleftAttachment, XmATTACH_FORM,
  279.                    XmNbottomAttachment, XmATTACH_NONE,
  280.                    XmNrightAttachment, XmATTACH_NONE,
  281.                    0);
  282. #ifdef MOZ_MAIL_NEWS
  283.     XtVaSetValues (messenger_toggle,
  284.                    XmNindicatorType, XmN_OF_MANY,
  285.                    XmNtopAttachment, XmATTACH_WIDGET,
  286.                    XmNtopWidget, navigator_toggle,
  287.                    XmNbottomAttachment, XmATTACH_NONE,
  288.                    XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  289.                    XmNleftWidget, navigator_toggle,
  290.                    XmNrightAttachment, XmATTACH_NONE,
  291.                    0);
  292.     XtVaSetValues (collabra_toggle,
  293.                    XmNindicatorType, XmN_OF_MANY,
  294.                    XmNtopAttachment, XmATTACH_WIDGET,
  295.                    XmNtopWidget, messenger_toggle,
  296.                    XmNbottomAttachment, XmATTACH_NONE,
  297.                    XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  298.                    XmNleftWidget, navigator_toggle,
  299.                    XmNrightAttachment, XmATTACH_NONE,
  300.                    0);
  301.     XtVaSetValues (composer_toggle,
  302.                    XmNindicatorType, XmN_OF_MANY,
  303.                    XmNtopAttachment, XmATTACH_WIDGET,
  304.                    XmNtopWidget, collabra_toggle,
  305.                    XmNbottomAttachment, XmATTACH_NONE,
  306.                    XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  307.                    XmNleftWidget, navigator_toggle,
  308.                    XmNrightAttachment, XmATTACH_NONE,
  309.                    0);
  310.     if (conference_toggle) {
  311.         XtVaSetValues (conference_toggle,
  312.                        XmNindicatorType, XmN_OF_MANY,
  313.                        XmNtopAttachment, XmATTACH_WIDGET,
  314.                        XmNtopWidget, composer_toggle,
  315.                        XmNbottomAttachment, XmATTACH_NONE,
  316.                        XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  317.                        XmNleftWidget, navigator_toggle,
  318.                        XmNrightAttachment, XmATTACH_NONE,
  319.                        0);
  320.     }
  321.     if (netcaster_toggle) {
  322.         XtVaSetValues (netcaster_toggle,
  323.                        XmNindicatorType, XmN_OF_MANY,
  324.                        XmNtopAttachment, XmATTACH_WIDGET,
  325.                        XmNtopWidget, netcaster_top_widget,
  326.                        XmNbottomAttachment, XmATTACH_NONE,
  327.                        XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  328.                        XmNleftWidget, navigator_toggle,
  329.                        XmNrightAttachment, XmATTACH_NONE,
  330.                        0);
  331.     }
  332.     if (calendar_toggle) {
  333.         XtVaSetValues (calendar_toggle,
  334.                        XmNindicatorType, XmN_OF_MANY,
  335.                        XmNtopAttachment, XmATTACH_WIDGET,
  336.                        XmNtopWidget, calendar_top_widget,
  337.                        XmNbottomAttachment, XmATTACH_NONE,
  338.                        XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  339.                        XmNleftWidget, navigator_toggle,
  340.                        XmNrightAttachment, XmATTACH_NONE,
  341.                        0);
  342.     }
  343. #else 
  344.     if (netcaster_toggle) {
  345.         XtVaSetValues (netcaster_toggle,
  346.                        XmNindicatorType, XmN_OF_MANY,
  347.                        XmNtopAttachment, XmATTACH_WIDGET,
  348.                        XmNtopWidget, navigator_toggle,
  349.                        XmNbottomAttachment, XmATTACH_NONE,
  350.                        XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  351.                        XmNleftWidget, navigator_toggle,
  352.                        XmNrightAttachment, XmATTACH_NONE,
  353.                        0);
  354.     }
  355. #endif // MOZ_MAIL_NEWS
  356.  
  357.     XtManageChildren (kids, i);
  358.     XtManageChild (label1);
  359.     XtManageChild (form1);
  360.  
  361.     // Show Toolbar As
  362.  
  363.     Widget frame2;
  364.  
  365.     ac = 0;
  366.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
  367.     XtSetArg (av [ac], XmNtopWidget, frame1); ac++;
  368.     XtSetArg (av [ac], XmNtopOffset, 8); ac++;
  369.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  370.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  371.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
  372.     frame2 = XmCreateFrame (form, "frame2", av, ac);
  373.  
  374.     Widget form2;
  375.  
  376.     ac = 0;
  377.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  378.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  379.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
  380.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
  381.     form2 = XmCreateForm (frame2, "toolbarBox", av, ac);
  382.  
  383.     Widget label2;
  384.  
  385.     ac = 0;
  386.     XtSetArg (av [ac], XmNchildType, XmFRAME_TITLE_CHILD); ac++;
  387.     label2 = XmCreateLabelGadget (frame2, "toolbarBoxLabel", av, ac);
  388.  
  389.     ac = 0;
  390.     i = 0;
  391.  
  392.     kids[i++] = fep->pic_and_text_toggle = 
  393.         XmCreateToggleButtonGadget (form2, "picAndText", av, ac);
  394.  
  395.     kids[i++] = fep->pic_only_toggle =
  396.         XmCreateToggleButtonGadget (form2, "picOnly", av, ac);
  397.  
  398.     kids[i++] = fep->text_only_toggle =
  399.         XmCreateToggleButtonGadget (form2, "textOnly", av, ac);
  400.  
  401.     kids[i++] = fep->show_tooltips_toggle =
  402.         fe_CreateToolTipsDemoToggle (form2, "showTooltips", av, ac);
  403.  
  404.     XtVaSetValues (fep->pic_and_text_toggle,
  405.                    XmNindicatorType, XmONE_OF_MANY,
  406.                    XmNtopAttachment, XmATTACH_FORM,
  407.                    XmNleftAttachment, XmATTACH_FORM,
  408.                    XmNbottomAttachment, XmATTACH_NONE,
  409.                    XmNrightAttachment, XmATTACH_NONE,
  410.                    0);
  411.     XtVaSetValues (fep->pic_only_toggle,
  412.                    XmNindicatorType, XmONE_OF_MANY,
  413.                    XmNtopAttachment, XmATTACH_WIDGET,
  414.                    XmNtopWidget, fep->pic_and_text_toggle,
  415.                    XmNbottomAttachment, XmATTACH_NONE,
  416.                    XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  417.                    XmNleftWidget, fep->pic_and_text_toggle,
  418.                    XmNrightAttachment, XmATTACH_NONE,
  419.                    0);
  420.  
  421.     XtVaSetValues (fep->text_only_toggle,
  422.                    XmNindicatorType, XmONE_OF_MANY,
  423.                    XmNtopAttachment, XmATTACH_WIDGET,
  424.                    XmNtopWidget, fep->pic_only_toggle,
  425.                    XmNbottomAttachment, XmATTACH_NONE,
  426.                    XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  427.                    XmNleftWidget, fep->pic_and_text_toggle,
  428.                    XmNrightAttachment, XmATTACH_NONE,
  429.                    0);
  430.  
  431.     XtVaSetValues (fep->show_tooltips_toggle,
  432.                    XmNindicatorType, XmN_OF_MANY,
  433.                    XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  434.                    XmNtopWidget, fep->pic_and_text_toggle,
  435.                    XmNbottomAttachment, XmATTACH_NONE,
  436.                    XmNleftAttachment, XmATTACH_POSITION,
  437.                    XmNleftPosition, 50,
  438.                    XmNrightAttachment, XmATTACH_NONE,
  439.                    0);
  440.  
  441.     XtManageChildren (kids, i);
  442.     XtManageChild (label2);
  443.     XtManageChild (form2);
  444.     XtManageChild (frame1);
  445.     XtManageChild (frame2);
  446.  
  447.     XtAddCallback (fep->pic_and_text_toggle, XmNvalueChangedCallback,
  448.                    cb_setToolbarAttr, fep);
  449.     XtAddCallback (fep->pic_only_toggle, XmNvalueChangedCallback,
  450.                    cb_setToolbarAttr, fep);
  451.     XtAddCallback (fep->text_only_toggle, XmNvalueChangedCallback,
  452.                    cb_setToolbarAttr, fep);
  453.  
  454.     setCreated(TRUE);
  455. }
  456.  
  457. // Member:       init
  458. // Description:  Initializes page for Appearance
  459. // Inputs:
  460. // Side effects: 
  461.  
  462. void XFE_PrefsPageGeneralAppearance::init()
  463. {
  464.     XP_ASSERT(m_prefsDataGeneralAppearance);
  465.  
  466.     PrefsDataGeneralAppearance *fep = m_prefsDataGeneralAppearance;
  467.     XFE_GlobalPrefs            *prefs = &fe_globalPrefs;
  468.     Boolean                    sensitive; 
  469.  
  470.     // Launch on startup
  471.     
  472.     XtVaSetValues(fep->navigator_toggle, XmNset, prefs->startup_browser_p, 0);
  473. #ifdef MOZ_MAIL_NEWS
  474.     XtVaSetValues(fep->messenger_toggle, XmNset, prefs->startup_mail_p, 0);
  475.     XtVaSetValues(fep->collabra_toggle,  XmNset, prefs->startup_news_p, 0);
  476.     XtVaSetValues(fep->composer_toggle,  XmNset, prefs->startup_editor_p, 0);
  477.     if (fep->conference_toggle) {
  478.         XtVaSetValues(fep->conference_toggle,
  479.                       XmNset, prefs->startup_conference_p, 0);
  480.     }
  481. #endif // MOZ_MAIL_NEWS
  482.     if (fep->netcaster_toggle) {
  483.         XtVaSetValues(fep->netcaster_toggle,
  484.                       XmNset, prefs->startup_netcaster_p, 0);
  485.     }
  486. #ifdef MOZ_MAIL_NEWS
  487.     if (fep->calendar_toggle) {
  488.         XtVaSetValues(fep->calendar_toggle,
  489.                       XmNset, prefs->startup_calendar_p, 0);
  490.     }
  491. #endif // MOZ_MAIL_NEWS
  492.     sensitive = !PREF_PrefIsLocked("general.startup.browser");
  493.     XtSetSensitive(fep->navigator_toggle, sensitive);
  494. #ifdef MOZ_MAIL_NEWS
  495.     sensitive = !PREF_PrefIsLocked("general.startup.mail");
  496.     XtSetSensitive(fep->messenger_toggle, sensitive);
  497.     sensitive = !PREF_PrefIsLocked("general.startup.news");
  498.     XtSetSensitive(fep->collabra_toggle, sensitive);
  499. #endif
  500. #ifdef EDITOR
  501.     sensitive = !PREF_PrefIsLocked("general.startup.editor");
  502. #endif
  503. #ifdef MOZ_MAIL_NEWS
  504.     XtSetSensitive(fep->composer_toggle, sensitive);
  505.     if (fep->conference_toggle) {
  506.         sensitive = !PREF_PrefIsLocked("general.startup.conference");
  507.         XtSetSensitive(fep->conference_toggle, sensitive);
  508.     }
  509. #endif // MOZ_MAIL_NEWS
  510.     if (fep->netcaster_toggle) {
  511.         sensitive = !PREF_PrefIsLocked("general.startup.netcaster");
  512.         XtSetSensitive(fep->netcaster_toggle, sensitive);
  513.     }
  514. #ifdef MOZ_MAIL_NEWS
  515.     if (fep->calendar_toggle) {
  516.         sensitive = !PREF_PrefIsLocked("general.startup.calendar");
  517.         XtSetSensitive(fep->calendar_toggle, sensitive);
  518.     }
  519. #endif // MOZ_MAIL_NEWS
  520.  
  521.     // Show toolbar as
  522.  
  523.     XtVaSetValues(fep->pic_and_text_toggle, 
  524.                   XmNset, (prefs->toolbar_style == BROWSER_TOOLBAR_ICONS_AND_TEXT), 
  525.                   0);
  526.     XtVaSetValues(fep->pic_only_toggle, 
  527.                   XmNset, (prefs->toolbar_style == BROWSER_TOOLBAR_ICONS_ONLY),
  528.                   0);
  529.     XtVaSetValues(fep->text_only_toggle,
  530.                   XmNset, (prefs->toolbar_style == BROWSER_TOOLBAR_TEXT_ONLY),
  531.                   0);
  532.  
  533.     sensitive = !PREF_PrefIsLocked("browser.chrome.toolbar_style");
  534.     XtSetSensitive(fep->pic_and_text_toggle, sensitive);
  535.     XtSetSensitive(fep->pic_only_toggle, sensitive);
  536.     XtSetSensitive(fep->text_only_toggle, sensitive);
  537.  
  538.     XtVaSetValues(fep->show_tooltips_toggle, XmNset, prefs->toolbar_tips_p, 0);
  539.  
  540.     sensitive = !PREF_PrefIsLocked("browser.chrome.toolbar_tips");
  541.     XtSetSensitive(fep->show_tooltips_toggle, sensitive);
  542.  
  543.     setInitialized(TRUE);
  544. }
  545.  
  546. // Member:       install
  547. // Description:  
  548. // Inputs:
  549. // Side effects: 
  550.  
  551. void XFE_PrefsPageGeneralAppearance::install()
  552. {
  553.     fe_installGeneralAppearance();
  554.  
  555.     if (m_toolbar_needs_updating) {
  556.         // Notify whoever is interested in updating toolbar appearance
  557.         XFE_MozillaApp::theApp()->notifyInterested(XFE_MozillaApp::updateToolbarAppearance);
  558.         m_toolbar_needs_updating = FALSE;
  559.     }
  560. }
  561.  
  562. // Member:       save
  563. // Description:  
  564. // Inputs:
  565. // Side effects: 
  566.  
  567. void XFE_PrefsPageGeneralAppearance::save()
  568. {
  569.     PrefsDataGeneralAppearance *fep = m_prefsDataGeneralAppearance;
  570.     Boolean                     b;
  571.  
  572.     XP_ASSERT(fep);
  573.  
  574.     // Launch on startup
  575.  
  576.     XtVaGetValues(fep->navigator_toggle, XmNset, &b, 0);
  577.     fe_globalPrefs.startup_browser_p = b;
  578. #ifdef MOZ_MAIL_NEWS
  579.     XtVaGetValues(fep->messenger_toggle, XmNset, &b, 0);
  580.     fe_globalPrefs.startup_mail_p = b;
  581.     XtVaGetValues(fep->collabra_toggle, XmNset, &b, 0);
  582.     fe_globalPrefs.startup_news_p = b;
  583.     XtVaGetValues(fep->composer_toggle, XmNset, &b, 0);
  584. #endif
  585. #ifdef EDITOR
  586.     fe_globalPrefs.startup_editor_p = b;
  587. #endif
  588. #ifdef MOZ_MAIL_NEWS
  589.     if (fep->conference_toggle) {
  590.         XtVaGetValues(fep->conference_toggle, XmNset, &b, 0);
  591.         fe_globalPrefs.startup_conference_p = b;
  592.     }
  593. #endif // MOZ_MAIL_NEWS
  594.     if (fep->netcaster_toggle) {
  595.         XtVaGetValues(fep->netcaster_toggle, XmNset, &b, 0);
  596.         fe_globalPrefs.startup_netcaster_p = b;
  597.     }
  598. #ifdef MOZ_MAIL_NEWS
  599.     if (fep->calendar_toggle) {
  600.         XtVaGetValues(fep->calendar_toggle, XmNset, &b, 0);
  601.         fe_globalPrefs.startup_calendar_p = b;
  602.     }
  603. #endif // MOZ_MAIL_NEWS
  604.  
  605.     // Show Toolbar as
  606.  
  607.     Boolean picsNtext;
  608.     Boolean picsOnly;
  609.     int     old_toolbar_style = fe_globalPrefs.toolbar_style;
  610.  
  611.     XtVaGetValues(fep->pic_and_text_toggle, XmNset, &picsNtext, 0);
  612.     XtVaGetValues(fep->pic_only_toggle, XmNset, &picsOnly, 0);
  613.  
  614.     if (picsNtext)
  615.       {
  616.         fe_globalPrefs.toolbar_style   = BROWSER_TOOLBAR_ICONS_AND_TEXT;
  617.         fe_globalPrefs.toolbar_icons_p = True;
  618.         fe_globalPrefs.toolbar_text_p  = True;
  619.       } 
  620.     else if (picsOnly)
  621.       {
  622.         fe_globalPrefs.toolbar_style   = BROWSER_TOOLBAR_ICONS_ONLY;
  623.         fe_globalPrefs.toolbar_icons_p = True;
  624.         fe_globalPrefs.toolbar_text_p  = False;
  625.       }
  626.     else
  627.       {
  628.         fe_globalPrefs.toolbar_style   = BROWSER_TOOLBAR_TEXT_ONLY;
  629.         fe_globalPrefs.toolbar_icons_p = False;
  630.         fe_globalPrefs.toolbar_text_p  = True;
  631.       }
  632.  
  633.     if (old_toolbar_style != fe_globalPrefs.toolbar_style) {
  634.         m_toolbar_needs_updating = TRUE;
  635.     }
  636.  
  637.     XtVaGetValues(fep->show_tooltips_toggle, XmNset, &b, 0);
  638.     fe_globalPrefs.toolbar_tips_p = b;
  639.  
  640.     // Install preferences
  641.  
  642.     install();
  643. }
  644.  
  645. // Member:       getData
  646. // Description:  
  647. // Inputs:
  648. // Side effects: 
  649.  
  650. PrefsDataGeneralAppearance *XFE_PrefsPageGeneralAppearance::getData()
  651. {
  652.     return m_prefsDataGeneralAppearance;
  653. }
  654.  
  655. void XFE_PrefsPageGeneralAppearance::cb_setToolbarAttr(Widget    widget,
  656.                                                        XtPointer closure,
  657.                                                        XtPointer call_data)
  658. {
  659.     PrefsDataGeneralAppearance *fep = (PrefsDataGeneralAppearance *)closure;
  660.     XmToggleButtonCallbackStruct *cb = (XmToggleButtonCallbackStruct *)call_data;
  661.  
  662.     if (! cb->set) {
  663.         XtVaSetValues(widget, XmNset, True, 0);
  664.     }
  665.     else if (widget == fep->pic_and_text_toggle) {
  666.         XtVaSetValues(fep->pic_only_toggle, XmNset, False, 0);
  667.         XtVaSetValues(fep->text_only_toggle, XmNset, False, 0);
  668.     }
  669.     else if (widget == fep->pic_only_toggle)    {
  670.         XtVaSetValues(fep->pic_and_text_toggle, XmNset, False, 0);
  671.         XtVaSetValues(fep->text_only_toggle, XmNset, False, 0);
  672.     }
  673.     else if (widget == fep->text_only_toggle)    {
  674.         XtVaSetValues(fep->pic_and_text_toggle, XmNset, False, 0);
  675.         XtVaSetValues(fep->pic_only_toggle, XmNset, False, 0);
  676.     }
  677.     else
  678.         abort();
  679. }
  680.  
  681. // ************************************************************************
  682. // *************************    General/Fonts     *************************
  683. // ************************************************************************
  684.  
  685. // Member:       XFE_PrefsPageGeneralFonts
  686. // Description:  Constructor
  687. // Inputs:
  688. // Side effects: 
  689.  
  690. XFE_PrefsPageGeneralFonts::XFE_PrefsPageGeneralFonts(XFE_PrefsDialog *dialog)
  691.     : XFE_PrefsPage(dialog),
  692.       m_prefsDataGeneralFonts(0)
  693. {
  694. }
  695.  
  696. // Member:       ~XFE_PrefsPageGeneralFonts
  697. // Description:  Destructor
  698. // Inputs:
  699. // Side effects: 
  700.  
  701. XFE_PrefsPageGeneralFonts::~XFE_PrefsPageGeneralFonts()
  702. {
  703.     if (m_prefsDataGeneralFonts)
  704.         XP_FREE(m_prefsDataGeneralFonts->encoding_menu_csid);
  705.     delete m_prefsDataGeneralFonts;
  706. }
  707.  
  708. void XFE_PrefsPageGeneralFonts::relayout(PrefsDataGeneralFonts *fep)
  709. {
  710.     int family_pos, size_pos;
  711.     int family_label_width, family_width, size_label_width;
  712.     int toggle_text_height;
  713.  
  714.     /*
  715.      * Layout the encoding widgets
  716.      *
  717.      *   family label  family selector   size label  size selector
  718.      *     column          column          column      column
  719.      *
  720.      *                + family_pos
  721.      *                |                             + size_pos
  722.      *                |                             |
  723.      *                v                             v
  724.      *   family_label:family              size_label:size_selector 
  725.      *                                        toggle:size_text
  726.      *
  727.      */
  728.     family_label_width = XfeVaGetWidestWidget(fep->encoding_label,
  729.                             fep->proportional_label, fep->fixed_label, NULL);
  730.  
  731.     family_pos = family_label_width;
  732.  
  733.     family_width = XfeVaGetWidestWidget(fep->prop_family_option, 
  734.                                         fep->fixed_family_option, NULL);
  735.  
  736.     size_label_width = XfeVaGetWidestWidget(fep->prop_size_label,
  737.                             fep->fixed_size_label, NULL);
  738.  
  739.     size_pos = family_pos + family_width + size_label_width;
  740.  
  741.     toggle_text_height = XfeVaGetTallestWidget(fep->prop_size_toggle,
  742.                                                fep->prop_size_field,
  743.                                                NULL);
  744.  
  745.     /*
  746.      * Layout the family labels and family selectors
  747.      */
  748.  
  749.     /* encoding */
  750.     XtVaSetValues (fep->encoding_label,
  751.                    XmNleftAttachment, XmATTACH_NONE,
  752.                    RIGHT_JUSTIFY_VA_ARGS(fep->encoding_label,family_pos),
  753.                    XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  754.                    XmNtopWidget, fep->encoding_menu,
  755.                    XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET,
  756.                    XmNbottomWidget, fep->encoding_menu,
  757.                    0);
  758.     XtVaSetValues (fep->encoding_menu,
  759.                    XmNleftAttachment, XmATTACH_FORM,
  760.                    XmNleftOffset, family_pos,
  761.                    XmNrightAttachment, XmATTACH_NONE,
  762.                    XmNtopAttachment, XmATTACH_FORM,
  763.                    XmNbottomAttachment, XmATTACH_NONE,
  764.                    0);
  765.  
  766.     /* proportional font */
  767.     XtVaSetValues (fep->proportional_label,
  768.                    XmNleftAttachment, XmATTACH_NONE,
  769.                    RIGHT_JUSTIFY_VA_ARGS(fep->proportional_label,family_pos),
  770.                    XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  771.                    XmNtopWidget, fep->prop_family_option,
  772.                    XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET,
  773.                    XmNbottomWidget, fep->prop_family_option,
  774.                    0);
  775.     XtVaSetValues (fep->prop_family_option,
  776.                    XmNleftAttachment, XmATTACH_FORM,
  777.                    XmNleftOffset, family_pos,
  778.                    XmNrightAttachment, XmATTACH_NONE,
  779.                    XmNtopAttachment, XmATTACH_WIDGET,
  780.                    XmNtopWidget, fep->encoding_menu,
  781.                    XmNbottomAttachment, XmATTACH_NONE,
  782.                    0);
  783.  
  784.     /* monospaced font */
  785.     XtVaSetValues (fep->fixed_label,
  786.                    XmNleftAttachment, XmATTACH_NONE,
  787.                    RIGHT_JUSTIFY_VA_ARGS(fep->fixed_label,family_pos),
  788.                    XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  789.                    XmNtopWidget, fep->fixed_family_option,
  790.                    XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET,
  791.                    XmNbottomWidget, fep->fixed_family_option,
  792.                    0);
  793.     XtVaSetValues (fep->fixed_family_option,
  794.                    XmNleftAttachment, XmATTACH_FORM,
  795.                    XmNleftOffset, family_pos,
  796.                    XmNrightAttachment, XmATTACH_NONE,
  797.                    XmNtopAttachment, XmATTACH_WIDGET,
  798.                    XmNtopWidget, fep->prop_size_field,
  799.                    XmNbottomAttachment, XmATTACH_NONE,
  800.                    0);
  801.  
  802.     /*
  803.      * Layout the size labels and family selectors
  804.      */
  805.     /* proportional font */
  806.     XtVaSetValues (fep->prop_size_label,
  807.                    XmNleftAttachment, XmATTACH_NONE,
  808.                    RIGHT_JUSTIFY_VA_ARGS(fep->prop_size_label,size_pos),
  809.                    XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  810.                    XmNtopWidget, fep->prop_family_option,
  811.                    XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET,
  812.                    XmNbottomWidget, fep->prop_family_option,
  813.                    0);
  814.     XtVaSetValues (fep->prop_size_option,
  815.                    XmNleftAttachment, XmATTACH_FORM,
  816.                    XmNleftOffset, size_pos,
  817.                    XmNrightAttachment, XmATTACH_NONE,
  818.                    XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  819.                    XmNtopWidget, fep->prop_family_option,
  820.                    XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET,
  821.                    XmNbottomWidget, fep->prop_family_option,
  822.                    0);
  823.     /* monospaced font */
  824.     XtVaSetValues (fep->fixed_size_label,
  825.                    XmNleftAttachment, XmATTACH_NONE,
  826.                    RIGHT_JUSTIFY_VA_ARGS(fep->fixed_size_label,size_pos),
  827.                    XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  828.                    XmNtopWidget, fep->fixed_family_option,
  829.                    XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET,
  830.                    XmNbottomWidget, fep->fixed_family_option,
  831.                    0);
  832.     XtVaSetValues (fep->fixed_size_option,
  833.                    XmNleftAttachment, XmATTACH_FORM,
  834.                    XmNleftOffset, size_pos,
  835.                    XmNrightAttachment, XmATTACH_NONE,
  836.                    XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  837.                    XmNtopWidget, fep->fixed_family_option,
  838.                    XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET,
  839.                    XmNbottomWidget, fep->fixed_family_option,
  840.                    0);
  841.  
  842.     /*
  843.      * Layout the scaled size toggle and text field
  844.      */
  845.     /* proportional font */
  846.     XtVaSetValues (fep->prop_size_toggle,
  847.                    XmNleftAttachment, XmATTACH_NONE,
  848.                    RIGHT_JUSTIFY_VA_ARGS(fep->prop_size_toggle,size_pos),
  849.                    XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  850.                    XmNheight, toggle_text_height,
  851.                    XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  852.                    XmNtopWidget, fep->prop_size_field,
  853.                    XmNbottomAttachment, XmATTACH_NONE,
  854.                    0);
  855.     XtVaSetValues (fep->prop_size_field,
  856.                    XmNleftAttachment, XmATTACH_FORM,
  857.                    XmNleftOffset, size_pos,
  858.                    XmNrightAttachment, XmATTACH_NONE,
  859.                    XmNheight, toggle_text_height,
  860.                    XmNtopAttachment, XmATTACH_WIDGET,
  861.                    XmNtopWidget, fep->prop_size_option,
  862.                    XmNbottomAttachment, XmATTACH_NONE,
  863.                    0);
  864.  
  865.     /* monospaced font */
  866.     XtVaSetValues (fep->fixed_size_toggle,
  867.                    XmNleftAttachment, XmATTACH_NONE,
  868.                    RIGHT_JUSTIFY_VA_ARGS(fep->fixed_size_toggle,size_pos),
  869.                    XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  870.                    XmNheight, toggle_text_height,
  871.                    XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  872.                    XmNtopWidget, fep->fixed_size_field,
  873.                    XmNbottomAttachment, XmATTACH_NONE,
  874.                    0);
  875.     XtVaSetValues (fep->fixed_size_field,
  876.                    XmNleftAttachment, XmATTACH_FORM,
  877.                    XmNleftOffset, size_pos,
  878.                    XmNrightAttachment, XmATTACH_NONE,
  879.                    XmNheight, toggle_text_height,
  880.                    XmNtopAttachment, XmATTACH_WIDGET,
  881.                    XmNtopWidget, fep->fixed_size_option,
  882.                    XmNbottomAttachment, XmATTACH_NONE,
  883.                    0);
  884. }
  885.  
  886. // Member:       create
  887. // Description:  Creates page for GeneralFonts
  888. // Inputs:
  889. // Side effects: 
  890.  
  891. void XFE_PrefsPageGeneralFonts::create()
  892. {
  893.     Widget            kids[100];
  894.     Arg               av[50];
  895.     int               ac;
  896.     int               i;
  897.     int               j;
  898.  
  899.     PrefsDataGeneralFonts *fep = NULL;
  900.  
  901.     fep = new PrefsDataGeneralFonts;
  902.     memset(fep, 0, sizeof(PrefsDataGeneralFonts));
  903.     m_prefsDataGeneralFonts = fep;
  904.  
  905.     fep->context = getContext();
  906.     fep->prompt_dialog = getPrefsDialog()->getDialogChrome();
  907.     fep->encoding_menu_csid = (int*)XP_CALLOC(INTL_CHAR_SET_MAX, sizeof(int));
  908.  
  909.     Widget form;
  910.  
  911.     ac = 0;
  912.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
  913.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
  914.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  915.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  916.     form = XmCreateForm (m_wPageForm, "fonts", av, ac);
  917.     XtManageChild (form);
  918.     m_wPage = fep->page = form;
  919.  
  920.     // Fonts and Encodings 
  921.  
  922.     Widget frame1;
  923.  
  924.     ac = 0;
  925.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  926.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  927.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
  928.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
  929.     frame1 = XmCreateFrame (form, "fontsFrame", av, ac);
  930.  
  931.     Widget form1;
  932.  
  933.     ac = 0;
  934.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  935.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  936.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
  937.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
  938.     form1 = XmCreateForm (frame1, "fontsBox", av, ac);
  939.  
  940.     Widget label1;
  941.  
  942.     ac = 0;
  943.     XtSetArg (av [ac], XmNchildType, XmFRAME_TITLE_CHILD); ac++;
  944.     label1 = XmCreateLabelGadget (frame1, "fontsBoxLabel", av, ac);
  945.  
  946.     Visual    *v = 0;
  947.     Colormap   cmap = 0;
  948.     Cardinal   depth = 0;
  949.  
  950.     ac = 0;
  951.     i = 0;
  952.     kids[i++] = fep->encoding_label = XmCreateLabelGadget (form1, "encodingLabel",
  953.                                                        av, ac);
  954.  
  955.     XtVaGetValues (getPrefsDialog()->getPrefsParent(),
  956.                    XtNvisual, &v,
  957.                    XtNcolormap, &cmap,
  958.                    XtNdepth, &depth, 
  959.                    0);
  960.  
  961.     /* Create a combobox for storing encoding choices */
  962.  
  963.     ac = 0;
  964.     XtSetArg (av[ac], XmNmoveSelectedItemUp, False); ac++;
  965.     XtSetArg (av[ac], XmNtype, XmDROP_DOWN_LIST_BOX); ac++;
  966.     XtSetArg (av[ac], XmNarrowType, XmMOTIF); ac++;
  967.     XtSetArg (av[ac], XmNvisual, v); ac++;
  968.     XtSetArg (av[ac], XmNcolormap, cmap); ac++;
  969.     XtSetArg (av[ac], XmNdepth, depth); ac++;
  970.     kids[i++] = fep->encoding_menu = DtCreateComboBox(form1, "encodingMenu", av,ac);
  971.     XtAddCallback(fep->encoding_menu, XmNselectionCallback, cb_charSet, this);
  972.  
  973.  
  974.     fe_FontCharSet *charset;
  975.     int             selectedCharSet;
  976.  
  977.     selectedCharSet = 0;
  978.     ac = 0;
  979.     int num_encodings = 0;
  980.     for (j = 0; j < INTL_CHAR_SET_MAX; j++) {
  981.         XmString xmstr;
  982.  
  983.         charset = &fe_FontCharSets[fe_SortedFontCharSets[j]];
  984.         if (!charset->name) {
  985.             continue;
  986.         }
  987.         fep->encoding_menu_csid[j] = fe_SortedFontCharSets[j];
  988.         xmstr = XmStringCreateLocalized(charset->name);
  989.         DtComboBoxAddItem(fep->encoding_menu, xmstr, 0, True);
  990.         num_encodings += 1;
  991.         if (charset->selected) {
  992.             DtComboBoxSelectItem(fep->encoding_menu, xmstr);
  993.             selectedCharSet = j;
  994.         }
  995.         XmStringFree(xmstr);
  996.     }
  997.     if (num_encodings > 15)
  998.         num_encodings = 15;
  999.     XtVaSetValues(fep->encoding_menu, XmNvisibleItemCount, num_encodings, NULL);
  1000.     charset = &fe_FontCharSets[fe_SortedFontCharSets[selectedCharSet]];
  1001.     fep->selected_encoding = fe_SortedFontCharSets[selectedCharSet];
  1002.  
  1003.     ac = 0;
  1004.     kids[i++] = fep->proportional_label = XmCreateLabelGadget (form1,
  1005.                                                   "proportionalLabel", av, ac);
  1006.  
  1007.     ac = 0;
  1008.     XtSetArg (av[ac], XmNarrowType, XmMOTIF); ac++;
  1009.     XtSetArg (av[ac], XmNvisual, v); ac++;
  1010.     XtSetArg (av[ac], XmNcolormap, cmap); ac++;
  1011.     XtSetArg (av[ac], XmNdepth, depth); ac++;
  1012.     kids[i++] = fep->prop_family_option = DtCreateComboBox(form1,
  1013.                                                    "proportionalMenu", av, ac);
  1014.     /* need to add a callback */
  1015.       XtAddCallback (fep->prop_family_option, XmNselectionCallback,
  1016.                                   prefsGeneralFontsCb_fontFamily, fep);
  1017.   
  1018.   
  1019.       ac = 0;
  1020.      kids[i++] = fep->prop_size_label = XmCreateLabelGadget (form1, "propSizeLabel",
  1021.                                                           av, ac);
  1022.   
  1023.     ac = 0;
  1024.     XtSetArg (av[ac], XmNarrowType, XmMOTIF); ac++;
  1025.     XtSetArg (av[ac], XmNvisual, v); ac++;
  1026.     XtSetArg (av[ac], XmNcolormap, cmap); ac++;
  1027.     XtSetArg (av[ac], XmNdepth, depth); ac++;
  1028.     kids[i++] = fep->prop_size_option = DtCreateComboBox (form1, "propSizeMenu",
  1029.                                                           av, ac);
  1030.     XtAddCallback(fep->prop_size_option, XmNselectionCallback,
  1031.                             prefsGeneralFontsCb_fontSize, fep);
  1032.  
  1033.     ac = 0;
  1034.     XtSetArg (av[ac], XmNcolumns, 5); ac++;
  1035.     kids [i++] = fep->prop_size_field =
  1036.         fe_CreateTextField (form1, "propSizeField",    av, ac);
  1037.  
  1038.     ac = 0;
  1039.     kids[i++] = fep->prop_size_toggle = 
  1040.         XmCreateToggleButtonGadget(form1, "propSizeToggle", av, ac);
  1041.  
  1042.     XtAddCallback(fep->prop_size_toggle, XmNvalueChangedCallback,
  1043.                   cb_allowScaling, this);
  1044.  
  1045.     fe_set_new_font_families(fep, &charset->pitches[0], fep->prop_family_option,
  1046.                              fep->prop_size_option);
  1047.  
  1048.     ac = 0;
  1049.     kids[i++] = fep->fixed_label = XmCreateLabelGadget(form1,
  1050.                                                   "fixedLabel", av, ac);
  1051.  
  1052.     ac = 0;
  1053.     XtSetArg (av[ac], XmNarrowType, XmMOTIF); ac++;
  1054.     XtSetArg (av[ac], XmNvisual, v); ac++;
  1055.     XtSetArg (av[ac], XmNcolormap, cmap); ac++;
  1056.     XtSetArg (av[ac], XmNdepth, depth); ac++;
  1057.     kids[i++] = fep->fixed_family_option = DtCreateComboBox (form1,
  1058.                                                              "fixedMenu", av, ac);
  1059.     XtAddCallback (fep->fixed_family_option, XmNselectionCallback,
  1060.                     prefsGeneralFontsCb_fontFamily, fep);
  1061.  
  1062.  
  1063.     ac = 0;
  1064.     kids[i++] = fep->fixed_size_label = XmCreateLabelGadget (form1, "fixedSizeLabel",
  1065.                                                         av, ac);
  1066.  
  1067.     ac = 0;
  1068.     XtSetArg (av[ac], XmNarrowType, XmMOTIF); ac++;
  1069.     XtSetArg (av[ac], XmNvisual, v); ac++;
  1070.     XtSetArg (av[ac], XmNcolormap, cmap); ac++;
  1071.     XtSetArg (av[ac], XmNdepth, depth); ac++;
  1072.     kids[i++] = fep->fixed_size_option = DtCreateComboBox (form1, "fixedSizeMenu",
  1073.                                                            av, ac);
  1074.     XtAddCallback(fep->fixed_size_option, XmNselectionCallback,
  1075.                   prefsGeneralFontsCb_fontSize, fep);
  1076.  
  1077.     ac = 0;
  1078.     XtSetArg (av[ac], XmNcolumns, 5); ac++;
  1079.     kids [i++] = fep->fixed_size_field = 
  1080.         fe_CreateTextField (form1, "fixedSizeField", av, ac);
  1081.  
  1082.     ac = 0;
  1083.     kids [i++] = fep->fixed_size_toggle =
  1084.         XmCreateToggleButtonGadget (form1, "fixedSizeToggle", av, ac);
  1085.  
  1086.     XtAddCallback(fep->fixed_size_toggle, XmNvalueChangedCallback,
  1087.                   cb_allowScaling, this);
  1088.  
  1089.     fe_set_new_font_families(fep, &charset->pitches[1],
  1090.                              fep->fixed_family_option, fep->fixed_size_option);
  1091.  
  1092.      relayout(fep);
  1093.  
  1094.     XtManageChildren (kids, i);
  1095.     XtManageChild (label1);
  1096.     XtManageChild (form1);
  1097.     XtManageChild (frame1);
  1098.  
  1099.     // Web Font
  1100.  
  1101.     Widget frame2;
  1102.  
  1103.     ac = 0;
  1104.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  1105.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  1106.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
  1107.     XtSetArg (av [ac], XmNtopWidget, frame1); ac++;
  1108.     XtSetArg (av [ac], XmNtopOffset, 8); ac++;
  1109.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
  1110.     frame2 = XmCreateFrame (form, "webFontFrame", av, ac);
  1111.  
  1112.     Widget form2;
  1113.  
  1114.     ac = 0;
  1115.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  1116.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  1117.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
  1118.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
  1119.     form2 = XmCreateForm (frame2, "webFontBox", av, ac);
  1120.  
  1121.       ac = 0;
  1122.     i = 0;
  1123.  
  1124.      kids[i++] = fep->use_font_label =
  1125.           XmCreateLabelGadget (form2, "useFontLabel", av, ac);
  1126.      kids[i++] = fep->use_my_font_toggle = 
  1127.           XmCreateToggleButtonGadget(form2, "useMyFont", av, ac);
  1128.      kids[i++] = fep->use_doc_font_selective_toggle = 
  1129.           XmCreateToggleButtonGadget(form2, "useDocFontSelective", av, ac);
  1130.      kids[i++] = fep->use_doc_font_whenever_toggle = 
  1131.           XmCreateToggleButtonGadget(form2, "useDocFontWhenever", av, ac);
  1132.     
  1133.     /*
  1134.      * Layout the webfont enable toggles
  1135.      */
  1136.     XtVaSetValues(fep->use_font_label,
  1137.                   XmNtopAttachment, XmATTACH_FORM,
  1138.                   XmNleftAttachment, XmATTACH_FORM,
  1139.                   XmNrightAttachment, XmATTACH_NONE,
  1140.                   XmNbottomAttachment, XmATTACH_NONE,
  1141.                   0);
  1142.  
  1143.     XtVaSetValues(fep->use_my_font_toggle,
  1144.                   XmNindicatorType, XmONE_OF_MANY,
  1145.                   XmNtopAttachment, XmATTACH_WIDGET,
  1146.                   XmNtopWidget, fep->use_font_label,
  1147.                   XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  1148.                   XmNleftWidget, fep->use_font_label,
  1149.                   XmNleftOffset, 16,
  1150.                   XmNrightAttachment, XmATTACH_NONE,
  1151.                   XmNbottomAttachment, XmATTACH_NONE,
  1152.                   0);
  1153.  
  1154.     XtVaSetValues(fep->use_doc_font_selective_toggle,
  1155.                   XmNindicatorType, XmONE_OF_MANY,
  1156.                   XmNtopAttachment, XmATTACH_WIDGET,
  1157.                   XmNtopWidget, fep->use_my_font_toggle,
  1158.                   XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  1159.                   XmNleftWidget, fep->use_my_font_toggle,
  1160.                   XmNrightAttachment, XmATTACH_NONE,
  1161.                   XmNbottomAttachment, XmATTACH_NONE,
  1162.                   0);
  1163.  
  1164.     XtVaSetValues(fep->use_doc_font_whenever_toggle,
  1165.                   XmNindicatorType, XmONE_OF_MANY,
  1166.                   XmNtopAttachment, XmATTACH_WIDGET,
  1167.                   XmNtopWidget, fep->use_doc_font_selective_toggle,
  1168.                   XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  1169.                   XmNleftWidget, fep->use_my_font_toggle,
  1170.                   XmNrightAttachment, XmATTACH_NONE,
  1171.                   XmNbottomAttachment, XmATTACH_NONE,
  1172.                   0);
  1173.  
  1174.     XtManageChildren (kids, i);
  1175.     XtManageChild (form2);
  1176.     XtManageChild (frame2);
  1177.  
  1178.      XtAddCallback(fep->use_my_font_toggle, XmNvalueChangedCallback,
  1179.                     cb_toggleUseFont, fep);
  1180.      XtAddCallback(fep->use_doc_font_selective_toggle, XmNvalueChangedCallback,
  1181.                     cb_toggleUseFont, fep);
  1182.      XtAddCallback(fep->use_doc_font_whenever_toggle, XmNvalueChangedCallback,
  1183.                     cb_toggleUseFont, fep);
  1184.  
  1185.     setCreated(TRUE);
  1186. }
  1187.  
  1188. // Member:       init
  1189. // Description:  Initializes page for GeneralFonts
  1190. // Inputs:
  1191. // Side effects: 
  1192.  
  1193. void XFE_PrefsPageGeneralFonts::init()
  1194. {
  1195.     XP_ASSERT(m_prefsDataGeneralFonts);
  1196.  
  1197.     PrefsDataGeneralFonts  *fep = m_prefsDataGeneralFonts;
  1198.     XFE_GlobalPrefs        *prefs = &fe_globalPrefs;
  1199.     Boolean                sensitive;
  1200.  
  1201.     // TODO: Fonts & Encoding
  1202.  
  1203.     // Web font
  1204.  
  1205.     XtVaSetValues(fep->use_my_font_toggle, 
  1206.                   XmNset, (prefs->use_doc_fonts == DOC_FONTS_NEVER),
  1207.                   0);
  1208.  
  1209.     XtVaSetValues(fep->use_doc_font_selective_toggle, 
  1210.                   XmNset, (prefs->use_doc_fonts == DOC_FONTS_QUICK),
  1211.                   0);
  1212.  
  1213.     XtVaSetValues(fep->use_doc_font_whenever_toggle, 
  1214.                   XmNset, (prefs->use_doc_fonts == DOC_FONTS_ALWAYS),
  1215.                   0);
  1216.  
  1217.     // If pref is locked, grey it out.
  1218.     sensitive = !PREF_PrefIsLocked("browser.use_document_fonts");
  1219.     XtSetSensitive(fep->use_my_font_toggle, sensitive);
  1220.     XtSetSensitive(fep->use_doc_font_selective_toggle, sensitive);
  1221.     XtSetSensitive(fep->use_doc_font_whenever_toggle, sensitive);
  1222.  
  1223.     setInitialized(TRUE);
  1224. }
  1225.  
  1226. // Member:       install
  1227. // Description:  
  1228. // Inputs:
  1229. // Side effects: 
  1230.  
  1231. void XFE_PrefsPageGeneralFonts::install()
  1232. {
  1233.     fe_installGeneralFonts();
  1234. }
  1235.  
  1236. // Member:       save
  1237. // Description:  
  1238. // Inputs:
  1239. // Side effects: 
  1240.  
  1241. void XFE_PrefsPageGeneralFonts::save()
  1242. {
  1243.     PrefsDataGeneralFonts *fep = m_prefsDataGeneralFonts;
  1244.  
  1245.     XP_ASSERT(fep);
  1246.  
  1247.     fe_get_scaled_font_size(fep);
  1248.  
  1249.     if (fep->fonts_changed) {
  1250.         // Notify whoever is interested in changes in default font
  1251.         XFE_MozillaApp::theApp()->notifyInterested(XFE_MozillaApp::defaultFontChanged);
  1252.         fep->fonts_changed = 0;
  1253.     }
  1254.  
  1255.     Boolean b;
  1256.  
  1257.     XtVaGetValues(fep->use_my_font_toggle, XmNset, &b, 0);
  1258.     if (b) fe_globalPrefs.use_doc_fonts = DOC_FONTS_NEVER;
  1259.  
  1260.     XtVaGetValues(fep->use_doc_font_selective_toggle, XmNset, &b, 0);
  1261.     if (b) fe_globalPrefs.use_doc_fonts = DOC_FONTS_QUICK;
  1262.  
  1263.     XtVaGetValues(fep->use_doc_font_whenever_toggle, XmNset, &b, 0);
  1264.     if (b) fe_globalPrefs.use_doc_fonts = DOC_FONTS_ALWAYS;
  1265.  
  1266.     // Install preferences
  1267.  
  1268.     install();
  1269. }
  1270.  
  1271. // Member:       getData
  1272. // Description:  
  1273. // Inputs:
  1274. // Side effects: 
  1275.  
  1276. PrefsDataGeneralFonts *XFE_PrefsPageGeneralFonts::getData()
  1277. {
  1278.     return m_prefsDataGeneralFonts;
  1279. }
  1280.  
  1281. void prefsGeneralFontsCb_fontFamily(Widget     widget,
  1282.                                     XtPointer  closure,
  1283.                                     XtPointer  call_data)
  1284. {
  1285.     PrefsDataGeneralFonts *fep;
  1286.     XtPointer              data;
  1287.     fe_FontFamily         *family;
  1288.     fe_FontPitch          *pitch;
  1289.     int                       i;
  1290.     DtComboBoxCallbackStruct *cbs;
  1291.  
  1292.     fep = (PrefsDataGeneralFonts *)closure;
  1293.     fep->fonts_changed = 1;
  1294.     cbs = (DtComboBoxCallbackStruct *)call_data;
  1295.  
  1296.     XtVaGetValues(widget, XmNuserData, &data, 0);
  1297.     pitch = (fe_FontPitch *) data;
  1298.  
  1299.     pitch->selectedFamily = NULL;
  1300.     for (i = 0; i < pitch->numberOfFamilies; i++)
  1301.     {
  1302.         family = &pitch->families[i];
  1303.         if (i == cbs->item_position)
  1304.         {
  1305.             family->selected = 1;
  1306.         }
  1307.         else
  1308.         {
  1309.             family->selected = 0;
  1310.         }
  1311.     }
  1312.  
  1313.     fe_set_new_font_sizes(fep, pitch);
  1314.     fe_InvalidateFontData();
  1315.     // Notify whoever is interested in changes in default font
  1316.     XFE_MozillaApp::theApp()->notifyInterested(XFE_MozillaApp::defaultFontChanged);
  1317.     fep->fonts_changed = 0;
  1318.  
  1319.     // For Asian encoding, the user should exit communicator in order for
  1320.     // font prefs to take effect (workaround for bug 72939)
  1321.  
  1322.     if (xfe_is_asian_encoding(fep->selected_encoding)) {
  1323.         FE_Alert(fep->context, XP_GetString(XFE_PREFS_RESTART_FOR_FONT_CHANGES));
  1324.     }
  1325. }
  1326.  
  1327. void prefsGeneralFontsCb_fontSize(Widget    widget,
  1328.                                   XtPointer closure,
  1329.                                   XtPointer call_data)
  1330. {
  1331.     PrefsDataGeneralFonts *fep;
  1332.     XtPointer              data;
  1333.     fe_FontFamily         *family;
  1334.     fe_FontPitch          *pitch;
  1335.     fe_FontSize              *size;
  1336.     int                    i;
  1337.     DtComboBoxCallbackStruct  *cbs;
  1338.  
  1339.     fep = (PrefsDataGeneralFonts *) closure;
  1340.     fep->fonts_changed = 1;
  1341.     cbs = (DtComboBoxCallbackStruct *)call_data;
  1342.  
  1343.     XtVaGetValues(widget, XmNuserData, &data, 0);
  1344.     pitch = (fe_FontPitch *) data;
  1345.  
  1346.     family = NULL;
  1347.     for (i = 0; i < pitch->numberOfFamilies; i++)
  1348.     {
  1349.         family = &pitch->families[i];
  1350.         if (family->selected)
  1351.         {
  1352.             break;
  1353.         }
  1354.         else
  1355.         {
  1356.             family = NULL;
  1357.         }
  1358.     }
  1359.     if (!family)
  1360.     {
  1361.         return;
  1362.     }
  1363.  
  1364.     for (i = 0; i < family->numberOfPointSizes; i++)
  1365.     {
  1366.         size = &family->pointSizes[i];
  1367.         if (i == cbs->item_position)
  1368.             size->selected = 1;
  1369.         else
  1370.             size->selected = 0;
  1371.     }
  1372.  
  1373.     fe_FreeFontSizeTable(family);
  1374.     fe_InvalidateFontData();
  1375.     // Notify whoever is interested in changes in default font
  1376.     XFE_MozillaApp::theApp()->notifyInterested(XFE_MozillaApp::defaultFontChanged);
  1377.     fep->fonts_changed = 0;
  1378.  
  1379.     // For Asian encoding, the user should exit communicator in order for
  1380.     // font prefs to take effect (workaround for bug 72939)
  1381.  
  1382.     if (xfe_is_asian_encoding(fep->selected_encoding)) {
  1383.         FE_Alert(fep->context, XP_GetString(XFE_PREFS_RESTART_FOR_FONT_CHANGES));
  1384.     }
  1385. }
  1386.  
  1387. void XFE_PrefsPageGeneralFonts::cb_charSet(Widget      /* widget */,
  1388.                                            XtPointer   closure,
  1389.                                            XtPointer   call_data)
  1390. {
  1391.     PrefsDataGeneralFonts *fep;
  1392.     fe_FontCharSet        *charset;
  1393.     int                       charsetID;
  1394.     int                       i;
  1395.     DtComboBoxCallbackStruct *cbs;
  1396.     XFE_PrefsPageGeneralFonts *thePage = (XFE_PrefsPageGeneralFonts *)closure;
  1397.  
  1398.  
  1399.     fep = thePage->getData();
  1400.     cbs = (DtComboBoxCallbackStruct *)call_data;
  1401.     charsetID = fep->encoding_menu_csid[cbs->item_position];
  1402.     fep->selected_encoding = charsetID;
  1403.  
  1404.     for (i = 0; i < INTL_CHAR_SET_MAX; i++)
  1405.     {
  1406.         fe_FontCharSets[i].selected = 0;
  1407.     }
  1408.     charset = &fe_FontCharSets[charsetID];
  1409.     charset->selected = 1;
  1410.  
  1411.     fe_set_new_font_families(fep, &charset->pitches[0],
  1412.                              fep->prop_family_option, fep->prop_size_option);
  1413.  
  1414.     fe_set_new_font_families(fep, &charset->pitches[1],
  1415.                              fep->fixed_family_option, fep->fixed_size_option);
  1416.  
  1417.     thePage->relayout(fep);
  1418. }
  1419.  
  1420. void XFE_PrefsPageGeneralFonts::cb_toggleUseFont(Widget    widget,
  1421.                                                  XtPointer closure,
  1422.                                                  XtPointer call_data)
  1423. {
  1424.     PrefsDataGeneralFonts        *fep = (PrefsDataGeneralFonts *)closure;
  1425.     XmToggleButtonCallbackStruct *cb = (XmToggleButtonCallbackStruct *)call_data;
  1426.  
  1427.     if (! cb->set) {
  1428.         XtVaSetValues(widget, XmNset, True, 0);
  1429.     }
  1430.     else if (widget == fep->use_my_font_toggle) {
  1431.         XtVaSetValues(fep->use_doc_font_selective_toggle, XmNset, False, 0);
  1432.         XtVaSetValues(fep->use_doc_font_whenever_toggle, XmNset, False, 0);
  1433.     }
  1434.     else if (widget == fep->use_doc_font_selective_toggle) {
  1435.         XtVaSetValues(fep->use_my_font_toggle, XmNset, False, 0);
  1436.         XtVaSetValues(fep->use_doc_font_whenever_toggle, XmNset, False, 0);
  1437.     }
  1438.     else if (widget == fep->use_doc_font_whenever_toggle) {
  1439.         XtVaSetValues(fep->use_my_font_toggle, XmNset, False, 0);
  1440.         XtVaSetValues(fep->use_doc_font_selective_toggle, XmNset, False, 0);
  1441.     }
  1442.     else
  1443.         abort();
  1444. }
  1445.  
  1446. // Member:       cb_allowScaling
  1447. // Description:  
  1448. // Inputs:
  1449. // Side effects: 
  1450.  
  1451. void XFE_PrefsPageGeneralFonts::cb_allowScaling(Widget    w,
  1452.                                                 XtPointer closure,
  1453.                                                 XtPointer callData)
  1454. {
  1455.     XFE_PrefsPageGeneralFonts    *thePage = (XFE_PrefsPageGeneralFonts *)closure;
  1456.     PrefsDataGeneralFonts        *fep = thePage->getData();
  1457.     XmToggleButtonCallbackStruct *cb;
  1458.     XtPointer                     data;
  1459.     fe_FontFamily                *family;
  1460.     fe_FontPitch                 *pitch;
  1461.     unsigned int                  allowScaling;
  1462.     int                           i;
  1463.     
  1464.     cb = (XmToggleButtonCallbackStruct *)callData;
  1465.     fep->fonts_changed = 1;
  1466.  
  1467.     XtVaGetValues(w, XmNuserData, &data, 0);
  1468.     pitch = (fe_FontPitch *) data;
  1469.  
  1470.     family = NULL;
  1471.     for (i = 0; i < pitch->numberOfFamilies; i++) {
  1472.         family = &pitch->families[i];
  1473.         if (family->selected) {
  1474.             break;
  1475.         }
  1476.         else {
  1477.             family = NULL;
  1478.         }
  1479.     }
  1480.     if (!family) {
  1481.         return;
  1482.     }
  1483.     
  1484.     if (cb->set) {
  1485.         allowScaling = 1;
  1486.     }
  1487.     else {
  1488.         allowScaling = 0;
  1489.     }
  1490.  
  1491.     /*
  1492.      * sanity check
  1493.      */
  1494.  
  1495.     if (family->pointSizes->size) {
  1496.         allowScaling = 0;
  1497.         XtVaSetValues(w, XmNset, False, 0);
  1498.         XtVaSetValues(w, XmNsensitive, False, 0);
  1499.     }
  1500.     else if (family->numberOfPointSizes == 1) {
  1501.         allowScaling = 1;
  1502.         XtVaSetValues(w, XmNset, True, 0);
  1503.         XtVaSetValues(w, XmNsensitive, False, 0);
  1504.     }
  1505.  
  1506.     if (allowScaling != family->allowScaling) {
  1507.          fe_FreeFontSizeTable(family);
  1508.         family->allowScaling = allowScaling;
  1509.         fe_InvalidateFontData();
  1510.         // Notify whoever is interested in changes in default font
  1511.         XFE_MozillaApp::theApp()->notifyInterested(XFE_MozillaApp::defaultFontChanged);
  1512.         fep->fonts_changed = 0;
  1513.     }
  1514. }
  1515.  
  1516. /* This disabled the backends notion of the font cache.
  1517.  *
  1518.  * FE caches fonts for each LO_TextAttr in the LO_TextAttr->FE_Data. Once
  1519.  * the user changes either the default family/face, size, proportional/fixed,
  1520.  * scaled/non-scaled, we will need to clear the font cache that backend
  1521.  * maintains.
  1522.  */
  1523. static void fe_InvalidateFontData(void)
  1524. {
  1525.     /*
  1526.      * free the Asian font groups, which are also caches
  1527.      */
  1528.     fe_FreeFontGroups();
  1529. }
  1530.  
  1531. static void fe_set_new_font_families(PrefsDataGeneralFonts *fep,
  1532.                                      fe_FontPitch          *pitch,
  1533.                                      Widget                 familyCombobox,
  1534.                                      Widget                 sizeCombobox)
  1535. {
  1536.     int                i;
  1537.     fe_FontFamily  *family;
  1538.     Widget          list;
  1539.  
  1540.     pitch->sizeMenu = sizeCombobox;
  1541.  
  1542.     DtComboBoxDeleteAllItems(familyCombobox);
  1543.     XtVaGetValues(familyCombobox, XmNlist, &list, NULL);
  1544.     XtVaSetValues(list, XmNuserData, pitch, NULL);
  1545.  
  1546.     for (i = 0; i < pitch->numberOfFamilies; i++)
  1547.     {
  1548.         XmString xmstr;
  1549.  
  1550.         family = &pitch->families[i];
  1551.         xmstr = XmStringCreateLocalized(family->name);
  1552.         DtComboBoxAddItem(familyCombobox, xmstr, 0, True);
  1553.         if ((i == 0) || (family->selected))
  1554.             DtComboBoxSelectItem(familyCombobox, xmstr);
  1555.         XmStringFree(xmstr);
  1556.     }
  1557.     if (pitch->numberOfFamilies > 15)
  1558.         XtVaSetValues(familyCombobox, XmNvisibleItemCount, 15, NULL);
  1559.     else
  1560.         XtVaSetValues(familyCombobox, XmNvisibleItemCount, pitch->numberOfFamilies, NULL);
  1561.  
  1562.     fe_set_new_font_sizes(fep, pitch);
  1563. }
  1564.  
  1565. static void fe_set_new_font_sizes(PrefsDataGeneralFonts *fep, 
  1566.                                   fe_FontPitch          *pitch)
  1567. {
  1568.     int                i;
  1569.     char            name[16];
  1570.     fe_FontFamily  *family;
  1571.     fe_FontSize       *size;
  1572.     Widget          list;
  1573.     Widget          toggle;
  1574.     XmString        xms;
  1575.  
  1576.     if (pitch->sizeMenu == fep->prop_size_option)
  1577.         toggle = fep->prop_size_toggle;
  1578.     else
  1579.         toggle = fep->fixed_size_toggle;
  1580.  
  1581.     DtComboBoxDeleteAllItems(pitch->sizeMenu);
  1582.  
  1583.     family = NULL;
  1584.     for (i = 0; i < pitch->numberOfFamilies; i++)
  1585.     {
  1586.         family = &pitch->families[i];
  1587.         if (family->selected)
  1588.             break;
  1589.         else
  1590.             family = NULL;
  1591.     }
  1592.     if (!family)
  1593.         return;
  1594.  
  1595.     XtVaGetValues(pitch->sizeMenu, XmNlist, &list, NULL);
  1596.     XtVaSetValues(list, XmNuserData, pitch, NULL);
  1597.  
  1598.     if (family->allowScaling) {
  1599.         XtVaSetValues(toggle, XmNset, True, 0);
  1600.     }
  1601.     else {
  1602.         XtVaSetValues(toggle, XmNset, False, 0);
  1603.     }
  1604.  
  1605.     if (family->pointSizes->size) {
  1606.         XtVaSetValues(toggle, XmNsensitive, False, 0);
  1607.     }
  1608.     else {
  1609.         if (family->numberOfPointSizes == 1) {
  1610.             XtVaSetValues(toggle, XmNsensitive, False, 0);
  1611.         }
  1612.         else {
  1613.             XtVaSetValues(toggle, XmNsensitive, True, 0);
  1614.         }
  1615.     }
  1616.     XtVaSetValues(toggle, XmNuserData, pitch, NULL);
  1617.  
  1618.     for (i = 0; i < family->numberOfPointSizes; i++)
  1619.     {
  1620.         size = &family->pointSizes[i];
  1621.         if (size->size)
  1622.             (void) PR_snprintf(name, sizeof(name), "%d.%d ",
  1623.                                     size->size / 10, size->size % 10);
  1624.         else
  1625.             (void) PR_snprintf(name, sizeof(name), "%d ", size->size);
  1626.         xms = XmStringCreateLtoR(name, XmFONTLIST_DEFAULT_TAG);
  1627.         DtComboBoxAddItem(pitch->sizeMenu, xms, 0, True);
  1628.         if ((i == 0) || (size->selected))
  1629.             DtComboBoxSelectItem(pitch->sizeMenu, xms);
  1630.         XmStringFree(xms);
  1631.     }
  1632. }
  1633.  
  1634. static void fe_get_scaled_font_size(PrefsDataGeneralFonts *fep)
  1635. {
  1636.     fe_FontCharSet  *charset = NULL;
  1637.     fe_FontFamily   *family;
  1638.     Widget           field;
  1639.     fe_FontPitch    *pitch;
  1640.     char            *endptr;
  1641.     char            *buf;
  1642.     int              i;
  1643.     int              j;
  1644.     int              oldSize;
  1645.  
  1646.     for (i = 0; i < INTL_CHAR_SET_MAX; i++) {
  1647.         if (fe_FontCharSets[i].selected) {
  1648.             charset = &fe_FontCharSets[i];
  1649.         }
  1650.     }
  1651.  
  1652.     if (!charset){
  1653.         return;
  1654.     }
  1655.  
  1656.     for (i = 0; i < 2; i++) {
  1657.         field = (i ? fep->fixed_size_field : fep->prop_size_field);
  1658.         pitch = &charset->pitches[i];
  1659.         XtVaGetValues(field, XmNvalue, &buf, 0);
  1660.         family = NULL;
  1661.         for (j = 0; j < pitch->numberOfFamilies; j++) {
  1662.             family = &pitch->families[j];
  1663.             if (family->selected) {
  1664.                 break;
  1665.             }
  1666.             else {
  1667.                 family = NULL;
  1668.             }
  1669.         }
  1670.         if (!family) {
  1671.             continue;
  1672.         }
  1673.         oldSize = family->scaledSize;
  1674.         errno = 0;
  1675.         family->scaledSize = ((int) (strtod(buf, &endptr) * 10));
  1676.         if (errno || (family->scaledSize < 0)){
  1677.             family->scaledSize = 0;
  1678.         }
  1679.         if (family->scaledSize != oldSize){
  1680.             fep->fonts_changed = 1;
  1681.             fe_FreeFontSizeTable(family);
  1682.             fe_InvalidateFontData();
  1683.         }
  1684.         XtFree(buf);
  1685.     }
  1686. }
  1687.  
  1688. static Boolean xfe_is_asian_encoding(int encoding) 
  1689. {
  1690.     char    *encoding_name = fe_FontCharSets[encoding].mimeName;
  1691.     
  1692.     if ((! XP_STRCASECMP(encoding_name, "gb_2312-80")) ||          // Simplified Chinese
  1693.         (! XP_STRCASECMP(encoding_name, "jis_x0201")) ||           // Japanese
  1694.         (! XP_STRCASECMP(encoding_name, "jis_x0208-1983")) ||      // Japanese
  1695.         (! XP_STRCASECMP(encoding_name, "jis_x0212-1990")) ||      // Japanese
  1696.         (! XP_STRCASECMP(encoding_name, "ks_c_5601-1987")) ||      // Korean
  1697.         (! XP_STRCASECMP(encoding_name, "x-cns11643-1110")) ||     // traditional Chinese
  1698.         (! XP_STRCASECMP(encoding_name, "x-cns11643-1")) ||        // traditional Chinese
  1699.         (! XP_STRCASECMP(encoding_name, "x-cns11643-2")) ||        // traditional Chinese
  1700.         (! XP_STRCASECMP(encoding_name, "x-gb2312-11")) ||         // simplified Chinese
  1701.         (! XP_STRCASECMP(encoding_name, "x-jisx0208-11")) ||       // Japanese
  1702.         (! XP_STRCASECMP(encoding_name, "x-ksc5601-11")) ||        // Korean
  1703.         (! XP_STRCASECMP(encoding_name, "x-x-big5")))              // Traditional Chinese
  1704.         return TRUE;
  1705.     else
  1706.         return FALSE;
  1707. }
  1708.  
  1709. // ************************************************************************
  1710. // *************************    General/Colors     *************************
  1711. // ************************************************************************
  1712.  
  1713. // Member:       XFE_PrefsPageGeneralColors
  1714. // Description:  Constructor
  1715. // Inputs:
  1716. // Side effects: 
  1717.  
  1718. XFE_PrefsPageGeneralColors::XFE_PrefsPageGeneralColors(XFE_PrefsDialog *dialog)
  1719.     : XFE_PrefsPage(dialog),
  1720.       m_prefsDataGeneralColors(0),
  1721.       m_underlinelinks_changed(FALSE),
  1722.       m_colors_changed(FALSE)
  1723. {
  1724. }
  1725.  
  1726. // Member:       ~XFE_PrefsPageGeneralColors
  1727. // Description:  Destructor
  1728. // Inputs:
  1729. // Side effects: 
  1730.  
  1731. XFE_PrefsPageGeneralColors::~XFE_PrefsPageGeneralColors()
  1732. {
  1733.     PrefsDataGeneralColors  *fep = m_prefsDataGeneralColors;
  1734.     char                    *orig_color;
  1735.  
  1736.     XtVaGetValues(fep->text_color_button, XmNuserData, &orig_color, NULL);
  1737.     if (orig_color) XtFree(orig_color);
  1738.  
  1739.     XtVaGetValues(fep->bg_color_button, XmNuserData, &orig_color, NULL);
  1740.     if (orig_color) XtFree(orig_color);
  1741.  
  1742.     XtVaGetValues(fep->links_color_button, XmNuserData, &orig_color, NULL);
  1743.     if (orig_color) XtFree(orig_color);
  1744.  
  1745.     XtVaGetValues(fep->vlinks_color_button, XmNuserData, &orig_color, NULL);
  1746.     if (orig_color) XtFree(orig_color);
  1747.  
  1748.     delete m_prefsDataGeneralColors;
  1749. }
  1750.  
  1751. // Member:       create
  1752. // Description:  Creates page for GeneralColors
  1753. // Inputs:
  1754. // Side effects: 
  1755.  
  1756. void XFE_PrefsPageGeneralColors::create()
  1757. {
  1758.     Widget            kids[100];
  1759.     Arg               av[50];
  1760.     int               ac;
  1761.     int               i;
  1762.  
  1763.     PrefsDataGeneralColors *fep = NULL;
  1764.  
  1765.     fep = new PrefsDataGeneralColors;
  1766.     memset(fep, 0, sizeof(PrefsDataGeneralColors));
  1767.     m_prefsDataGeneralColors = fep;
  1768.  
  1769.     fep->context = getContext();
  1770.     fep->prompt_dialog = getPrefsDialog()->getDialogChrome();
  1771.  
  1772.     Widget form;
  1773.  
  1774.     ac = 0;
  1775.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
  1776.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
  1777.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  1778.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  1779.     form = XmCreateForm (m_wPageForm, "colors", av, ac);
  1780.     XtManageChild (form);
  1781.     m_wPage = fep->page = form;
  1782.  
  1783.     // Colors
  1784.  
  1785.     Widget frame1;
  1786.  
  1787.     ac = 0;
  1788.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  1789.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_POSITION); ac++;
  1790.     XtSetArg (av [ac], XmNrightPosition, 50); ac++;
  1791.     XtSetArg (av [ac], XmNrightOffset, 4); ac++;
  1792.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
  1793.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
  1794.     frame1 = XmCreateFrame (form, "colorFrame", av, ac);
  1795.  
  1796.     Widget form1;
  1797.  
  1798.     ac = 0;
  1799.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  1800.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  1801.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
  1802.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
  1803.     form1 = XmCreateForm (frame1, "colorBox", av, ac);
  1804.  
  1805.     Widget label1;
  1806.  
  1807.     ac = 0;
  1808.     XtSetArg (av [ac], XmNchildType, XmFRAME_TITLE_CHILD); ac++;
  1809.     label1 = XmCreateLabelGadget (frame1, "colorBoxLabel", av, ac);
  1810.  
  1811.     Widget     text_color_label;
  1812.     Widget     bg_color_label;
  1813.     Widget     text_color_button;
  1814.     Widget     bg_color_button;
  1815.     Widget     use_default_colors_button;
  1816.  
  1817.     ac = 0;
  1818.     i = 0;
  1819.  
  1820.     kids[i++] = text_color_label =
  1821.         XmCreateLabelGadget(form1, "textColorLabel", av, ac);
  1822.  
  1823.     kids[i++] = bg_color_label =
  1824.         XmCreateLabelGadget(form1, "bgColorLabel", av, ac);
  1825.  
  1826.     ac = 0;
  1827.     XtSetArg (av[ac], XmNwidth, DEF_COLOR_BUTTON_WIDTH); ac++;
  1828.     XtSetArg (av[ac], XmNheight, DEF_COLOR_BUTTON_HEIGHT); ac++;
  1829.     kids[i++] = text_color_button =
  1830.         XmCreateDrawnButton(form1, "textColorButton", av, ac);
  1831.  
  1832.     ac = 0;
  1833.     XtSetArg (av[ac], XmNwidth, DEF_COLOR_BUTTON_WIDTH); ac++;
  1834.     XtSetArg (av[ac], XmNheight, DEF_COLOR_BUTTON_HEIGHT); ac++;
  1835.     kids[i++] = bg_color_button =
  1836.         XmCreateDrawnButton(form1, "bgColorButton", av, ac);
  1837.  
  1838.     ac = 0;
  1839.     kids[i++] = use_default_colors_button = 
  1840.         XmCreatePushButtonGadget(form1, "useDefColors", av, ac);
  1841.  
  1842.     fep->text_color_button = text_color_button;
  1843.     fep->bg_color_button = bg_color_button;
  1844.     fep->use_default_colors_button = use_default_colors_button;
  1845.  
  1846.     int labels_height;
  1847.     labels_height = XfeVaGetTallestWidget(text_color_label,
  1848.                                           text_color_button,
  1849.                                           NULL);
  1850.     int labels_width;
  1851.     labels_width = XfeVaGetWidestWidget(text_color_label,
  1852.                                         bg_color_label,
  1853.                                         NULL);
  1854.  
  1855.     XtVaSetValues(text_color_label,
  1856.                   XmNheight, labels_height,
  1857.                   RIGHT_JUSTIFY_VA_ARGS(text_color_label,labels_width),
  1858.                   XmNtopAttachment, XmATTACH_FORM,
  1859.                   XmNbottomAttachment, XmATTACH_NONE,
  1860.                   NULL);
  1861.     
  1862.     XtVaSetValues(bg_color_label,
  1863.                   XmNheight, labels_height,
  1864.                   RIGHT_JUSTIFY_VA_ARGS(bg_color_label,labels_width),
  1865.                   XmNtopAttachment, XmATTACH_WIDGET,
  1866.                   XmNtopWidget, text_color_label,
  1867.                   XmNbottomAttachment, XmATTACH_NONE,
  1868.                   NULL);
  1869.     
  1870.     XtVaSetValues(text_color_button,
  1871.                   XmNheight, labels_height,
  1872.                   XmNshadowThickness, 2,
  1873.                   XmNuserData, 0,
  1874.                   XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  1875.                   XmNtopWidget, text_color_label,
  1876.                   XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET,
  1877.                   XmNbottomWidget, text_color_label,
  1878.                   XmNleftAttachment, XmATTACH_WIDGET,
  1879.                   XmNleftWidget, text_color_label,
  1880.                   XmNleftOffset, 4,
  1881.                   XmNrightAttachment, XmATTACH_NONE,
  1882.                   0);
  1883.  
  1884.     XtVaSetValues(bg_color_button,
  1885.                   XmNheight, labels_height,
  1886.                   XmNshadowThickness, 2,
  1887.                   XmNuserData, 0,
  1888.                   XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  1889.                   XmNtopWidget, bg_color_label,
  1890.                   XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET,
  1891.                   XmNbottomWidget, bg_color_label,
  1892.                   XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  1893.                   XmNleftWidget, text_color_button,
  1894.                   XmNrightAttachment, XmATTACH_NONE,
  1895.                   0);
  1896.  
  1897.     XtVaSetValues(use_default_colors_button,
  1898.                   XmNtopAttachment, XmATTACH_WIDGET,
  1899.                   XmNtopWidget, bg_color_label,
  1900.                   XmNtopOffset, 4,
  1901.                   XmNbottomAttachment, XmATTACH_FORM,
  1902.                   XmNleftAttachment, XmATTACH_NONE,
  1903.                   XmNrightAttachment, XmATTACH_FORM,
  1904.                   0);
  1905.  
  1906.     XtAddCallback(text_color_button, XmNactivateCallback, cb_activateColor, this);
  1907.     XtAddCallback(bg_color_button, XmNactivateCallback, cb_activateColor, this);
  1908.     XtAddCallback(use_default_colors_button, XmNactivateCallback, cb_defaultColor, this);
  1909.  
  1910.     XtManageChildren (kids, i);
  1911.     XtManageChild (label1);
  1912.     XtManageChild (form1);
  1913.     XtManageChild (frame1);
  1914.  
  1915.     // Links
  1916.  
  1917.     Widget frame2;
  1918.  
  1919.     ac = 0;
  1920.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_WIDGET); ac++;
  1921.     XtSetArg (av [ac], XmNleftWidget, frame1); ac++;
  1922.     XtSetArg (av [ac], XmNleftOffset, 8); ac++;
  1923.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  1924.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;    
  1925.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET); ac++;
  1926.     XtSetArg (av [ac], XmNbottomWidget, frame1); ac++;
  1927.     frame2 = XmCreateFrame (form, "linksFrame", av, ac);
  1928.  
  1929.     Widget form2;
  1930.  
  1931.     ac = 0;
  1932.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  1933.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  1934.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
  1935.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
  1936.     form2 = XmCreateForm (frame2, "linksBox", av, ac);
  1937.  
  1938.     Widget label2;
  1939.  
  1940.     ac = 0;
  1941.     XtSetArg (av [ac], XmNchildType, XmFRAME_TITLE_CHILD); ac++;
  1942.     label2 = XmCreateLabelGadget (frame2, "linksBoxLabel", av, ac);
  1943.  
  1944.     Widget     links_color_label;
  1945.     Widget     vlinks_color_label;
  1946.     Widget     links_color_button;
  1947.     Widget     vlinks_color_button;
  1948.     Widget     underline_links_toggle;
  1949.  
  1950.     ac = 0;
  1951.     i = 0;
  1952.  
  1953.     kids[i++] = links_color_label =
  1954.         XmCreateLabelGadget(form2, "linksLabel", av, ac);
  1955.  
  1956.     kids[i++] = vlinks_color_label =
  1957.         XmCreateLabelGadget(form2, "vlinksLabel", av, ac);
  1958.  
  1959.     ac = 0;
  1960.     XtSetArg (av[ac], XmNwidth, DEF_COLOR_BUTTON_WIDTH); ac++;
  1961.     XtSetArg (av[ac], XmNheight, DEF_COLOR_BUTTON_HEIGHT); ac++;
  1962.     kids[i++] = links_color_button =
  1963.         XmCreateDrawnButton(form2, "linksColorButton", av, ac);
  1964.  
  1965.     ac = 0;
  1966.     XtSetArg (av[ac], XmNwidth, DEF_COLOR_BUTTON_WIDTH); ac++;
  1967.     XtSetArg (av[ac], XmNheight, DEF_COLOR_BUTTON_HEIGHT); ac++;
  1968.     kids[i++] = vlinks_color_button =
  1969.         XmCreateDrawnButton(form2, "vlinksColorButton", av, ac);
  1970.  
  1971.     ac = 0;
  1972.     kids[i++] = underline_links_toggle = 
  1973.         XmCreateToggleButtonGadget(form2, "underline", av, ac);
  1974.  
  1975.     fep->links_color_button = links_color_button;
  1976.     fep->vlinks_color_button = vlinks_color_button;
  1977.     fep->underline_links_toggle = underline_links_toggle;
  1978.  
  1979.     labels_height = XfeVaGetTallestWidget(links_color_label,
  1980.                                           links_color_button,
  1981.                                           NULL);
  1982.     labels_width = XfeVaGetWidestWidget(links_color_label,
  1983.                                         vlinks_color_label,
  1984.                                         NULL);
  1985.  
  1986.     XtVaSetValues(links_color_label,
  1987.                   XmNheight, labels_height,
  1988.                   RIGHT_JUSTIFY_VA_ARGS(links_color_label,labels_width),
  1989.                   XmNtopAttachment, XmATTACH_FORM,
  1990.                   XmNbottomAttachment, XmATTACH_NONE,
  1991.                   NULL);
  1992.     
  1993.     XtVaSetValues(vlinks_color_label,
  1994.                   XmNheight, labels_height,
  1995.                   RIGHT_JUSTIFY_VA_ARGS(vlinks_color_label,labels_width),
  1996.                   XmNtopAttachment, XmATTACH_WIDGET,
  1997.                   XmNtopWidget, links_color_label,
  1998.                   XmNbottomAttachment, XmATTACH_NONE,
  1999.                   NULL);
  2000.     
  2001.     XtVaSetValues(links_color_button,
  2002.                   XmNheight, labels_height,
  2003.                   XmNshadowThickness, 2,
  2004.                   XmNuserData, 0,
  2005.                   XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  2006.                   XmNtopWidget, links_color_label,
  2007.                   XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET,
  2008.                   XmNbottomWidget, links_color_label,
  2009.                   XmNleftAttachment, XmATTACH_WIDGET,
  2010.                   XmNleftWidget, links_color_label,
  2011.                   XmNleftOffset, 4,
  2012.                   XmNrightAttachment, XmATTACH_NONE,
  2013.                   0);
  2014.  
  2015.     XtVaSetValues(vlinks_color_button,
  2016.                   XmNheight, labels_height,
  2017.                   XmNshadowThickness, 2,
  2018.                   XmNuserData, 0,
  2019.                   XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  2020.                   XmNtopWidget, vlinks_color_label,
  2021.                   XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET,
  2022.                   XmNbottomWidget, vlinks_color_label,
  2023.                   XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  2024.                   XmNleftWidget, links_color_button,
  2025.                   XmNrightAttachment, XmATTACH_NONE,
  2026.                   0);
  2027.  
  2028.     XtVaSetValues(underline_links_toggle,
  2029.                   XmNtopAttachment, XmATTACH_WIDGET,
  2030.                   XmNtopWidget, vlinks_color_label,
  2031.                   XmNtopOffset, 4,
  2032.                   XmNbottomAttachment, XmATTACH_NONE,
  2033.                   XmNleftAttachment, XmATTACH_FORM,
  2034.                   XmNrightAttachment, XmATTACH_NONE,
  2035.                   0);
  2036.  
  2037.     XtAddCallback(links_color_button, XmNactivateCallback, cb_activateColor, this);
  2038.     XtAddCallback(vlinks_color_button, XmNactivateCallback, cb_activateColor, this);
  2039.  
  2040.     XtManageChildren (kids, i);
  2041.     XtManageChild (label2);
  2042.     XtManageChild (form2);
  2043.     XtManageChild (frame2);
  2044.  
  2045.     // Use my colors
  2046.  
  2047.     Widget frame3;
  2048.  
  2049.     ac = 0;
  2050.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  2051.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  2052.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
  2053.     XtSetArg (av [ac], XmNtopWidget, frame1); ac++;
  2054.     XtSetArg (av [ac], XmNtopOffset, 8); ac++;
  2055.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
  2056.     frame3 = XmCreateFrame (form, "frame3", av, ac);
  2057.  
  2058.     Widget form3;
  2059.  
  2060.     ac = 0;
  2061.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  2062.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  2063.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
  2064.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
  2065.     form3 = XmCreateForm (frame3, "box3", av, ac);
  2066.  
  2067.     Widget     use_color_label;
  2068.     Widget     use_my_color_toggle;
  2069.  
  2070.     ac = 0;
  2071.     i = 0;
  2072.  
  2073.     kids[i++] = use_color_label =
  2074.         XmCreateLabelGadget(form3, "useColor", av, ac);
  2075.  
  2076.     kids[i++] = use_my_color_toggle = 
  2077.         XmCreateToggleButtonGadget(form3, "useMyColor", av, ac);
  2078.  
  2079.     fep->use_my_color_toggle = use_my_color_toggle;
  2080.  
  2081.     XtVaSetValues(use_color_label,
  2082.                   XmNtopAttachment, XmATTACH_FORM,
  2083.                   XmNbottomAttachment, XmATTACH_NONE,
  2084.                   XmNleftAttachment, XmATTACH_FORM,
  2085.                   XmNrightAttachment, XmATTACH_NONE,
  2086.                   NULL);
  2087.     
  2088.     XtVaSetValues(use_my_color_toggle,
  2089.                   XmNtopAttachment, XmATTACH_WIDGET,
  2090.                   XmNtopWidget, use_color_label,
  2091.                   XmNbottomAttachment, XmATTACH_NONE,
  2092.                   XmNleftAttachment, XmATTACH_FORM,
  2093.                   XmNleftOffset, 8,
  2094.                   XmNrightAttachment, XmATTACH_NONE,
  2095.                   NULL);
  2096.  
  2097.     XtManageChildren(kids, i);
  2098.     XtManageChild(form3);
  2099.     XtManageChild(frame3);
  2100.  
  2101.     setCreated(TRUE);
  2102. }
  2103.  
  2104. // Member:       init
  2105. // Description:  Initializes page for GeneralColors
  2106. // Inputs:
  2107. // Side effects: 
  2108.  
  2109. void XFE_PrefsPageGeneralColors::init()
  2110. {
  2111.     XP_ASSERT(m_prefsDataGeneralColors);
  2112.  
  2113.     PrefsDataGeneralColors *fep = m_prefsDataGeneralColors;
  2114.     XFE_GlobalPrefs        *prefs = &fe_globalPrefs;
  2115.     LO_Color               *color;
  2116.     char                   *orig_color;
  2117.     char                    buf[32];
  2118.  
  2119.     // Colors - foreground
  2120.  
  2121.     XtVaGetValues(fep->text_color_button, XmNuserData, &orig_color, NULL);
  2122.     if (orig_color) XtFree(orig_color);
  2123.     color = &prefs->text_color;
  2124.     XP_SAFE_SPRINTF(buf, sizeof(buf), "#%02x%02x%02x", color->red, color->green, color->blue);
  2125.     XtVaSetValues(fep->text_color_button, 
  2126.                   XmNsensitive, !PREF_PrefIsLocked("browser.foreground_color"),
  2127.                   XmNuserData, XtNewString(buf),
  2128.                   0);
  2129.     fe_SwatchSetColor(fep->text_color_button, &prefs->text_color);
  2130.  
  2131.     // Colors - background
  2132.  
  2133.     XtVaGetValues(fep->bg_color_button, XmNuserData, &orig_color, NULL);
  2134.     if (orig_color) XtFree(orig_color);
  2135.     color = &prefs->background_color;
  2136.     XP_SAFE_SPRINTF(buf, sizeof(buf), "#%02x%02x%02x", color->red, color->green, color->blue);
  2137.     XtVaSetValues(fep->bg_color_button, 
  2138.                   XmNsensitive, !PREF_PrefIsLocked("browser.background_color"),
  2139.                   XmNuserData, XtNewString(buf),
  2140.                   0);
  2141.     fe_SwatchSetColor(fep->bg_color_button, &prefs->background_color);
  2142.  
  2143.     // Use default colors
  2144.  
  2145.     XtVaSetValues(fep->use_default_colors_button, 
  2146.                   XmNsensitive, 
  2147.                   !PREF_PrefIsLocked("browser.foreground_color") && 
  2148.                   !PREF_PrefIsLocked("browser.background_color"),
  2149.                   0);
  2150.  
  2151.     // Links - unvisited links
  2152.  
  2153.     XtVaGetValues(fep->links_color_button, XmNuserData, &orig_color, NULL);
  2154.     if (orig_color) XtFree(orig_color);
  2155.     color = &prefs->links_color;
  2156.     XP_SAFE_SPRINTF(buf, sizeof(buf), "#%02x%02x%02x", color->red, color->green, color->blue);
  2157.     XtVaSetValues(fep->links_color_button, 
  2158.                   XmNsensitive, !PREF_PrefIsLocked("browser.anchor_color"),
  2159.                   XmNuserData, XtNewString(buf),
  2160.                   0);
  2161.     fe_SwatchSetColor(fep->links_color_button, &prefs->links_color);
  2162.  
  2163.     // Links - visited links
  2164.  
  2165.     XtVaGetValues(fep->vlinks_color_button, XmNuserData, &orig_color, NULL);
  2166.     if (orig_color) XtFree(orig_color);
  2167.     color = &prefs->vlinks_color;
  2168.     XP_SAFE_SPRINTF(buf, sizeof(buf), "#%02x%02x%02x", color->red, color->green, color->blue);
  2169.     XtVaSetValues(fep->vlinks_color_button, 
  2170.                   XmNsensitive, !PREF_PrefIsLocked("browser.visited_color"),
  2171.                   XmNuserData, XtNewString(buf),
  2172.                   0);
  2173.     fe_SwatchSetColor(fep->vlinks_color_button, &prefs->vlinks_color);
  2174.  
  2175.     // Underline links
  2176.  
  2177.     XtVaSetValues(fep->underline_links_toggle, 
  2178.                   XmNset, prefs->underline_links_p,
  2179.                   XmNsensitive, !PREF_PrefIsLocked("browser.underline_anchors"),
  2180.                   0);
  2181.  
  2182.     // Use doc colors
  2183.  
  2184.     XtVaSetValues(fep->use_my_color_toggle,
  2185.                   XmNset, !prefs->use_doc_colors, 
  2186.                   XmNsensitive, !PREF_PrefIsLocked("browser.use_document_colors"),
  2187.                   0);
  2188.  
  2189.     setInitialized(TRUE);
  2190. }
  2191.  
  2192. // Member:       install
  2193. // Description:  
  2194. // Inputs:
  2195. // Side effects: 
  2196.  
  2197. void XFE_PrefsPageGeneralColors::install()
  2198. {
  2199.     fe_installGeneralColors();
  2200.  
  2201.     if (m_colors_changed) {
  2202.         XFE_MozillaApp::theApp()->notifyInterested(XFE_MozillaApp::defaultColorsChanged);
  2203.         m_colors_changed = FALSE;
  2204.     }
  2205.     else if (m_underlinelinks_changed) {
  2206.         XFE_MozillaApp::theApp()->notifyInterested(XFE_MozillaApp::linksAttributeChanged);
  2207.         m_underlinelinks_changed = FALSE;
  2208.     }
  2209. }
  2210.  
  2211. // Member:       save
  2212. // Description:  
  2213. // Inputs:
  2214. // Side effects: 
  2215.  
  2216. void XFE_PrefsPageGeneralColors::save()
  2217. {
  2218.     PrefsDataGeneralColors *fep = m_prefsDataGeneralColors;
  2219.     Boolean                 b;
  2220.     LO_Color                orig_color;
  2221.     LO_Color                new_color;
  2222.     char                   *selected_color;
  2223.  
  2224.     // Colors - foreground
  2225.  
  2226.     orig_color = fe_globalPrefs.text_color;
  2227.     XtVaGetValues(fep->text_color_button, XmNuserData, &selected_color, NULL);
  2228.     LO_ParseRGB(selected_color, &new_color.red, &new_color.green, &new_color.blue);
  2229.     if ((new_color.red != orig_color.red) ||
  2230.         (new_color.green != orig_color.green) ||
  2231.         (new_color.blue != orig_color.blue))
  2232.         m_colors_changed = TRUE;
  2233.     fe_globalPrefs.text_color = new_color;
  2234.  
  2235.     // Colors - background
  2236.  
  2237.     orig_color = fe_globalPrefs.background_color;
  2238.     XtVaGetValues(fep->bg_color_button, XmNuserData, &selected_color, NULL);
  2239.     LO_ParseRGB(selected_color, &new_color.red, &new_color.green, &new_color.blue);
  2240.     if ((new_color.red != orig_color.red) ||
  2241.         (new_color.green != orig_color.green) ||
  2242.         (new_color.blue != orig_color.blue))
  2243.         m_colors_changed = TRUE;
  2244.     fe_globalPrefs.background_color = new_color;
  2245.  
  2246.     // Links - unvisited links
  2247.  
  2248.     orig_color = fe_globalPrefs.links_color;
  2249.     XtVaGetValues(fep->links_color_button, XmNuserData, &selected_color, NULL);
  2250.     LO_ParseRGB(selected_color, &new_color.red, &new_color.green, &new_color.blue);
  2251.     if ((new_color.red != orig_color.red) ||
  2252.         (new_color.green != orig_color.green) ||
  2253.         (new_color.blue != orig_color.blue))
  2254.         m_colors_changed = TRUE;
  2255.     fe_globalPrefs.links_color = new_color;
  2256.  
  2257.     // Links - visited links
  2258.  
  2259.     orig_color = fe_globalPrefs.vlinks_color;
  2260.     XtVaGetValues(fep->vlinks_color_button, XmNuserData, &selected_color, NULL);
  2261.     LO_ParseRGB(selected_color, &new_color.red, &new_color.green, &new_color.blue);
  2262.     if ((new_color.red != orig_color.red) ||
  2263.         (new_color.green != orig_color.green) ||
  2264.         (new_color.blue != orig_color.blue))
  2265.         m_colors_changed = TRUE;
  2266.     fe_globalPrefs.vlinks_color = new_color;
  2267.  
  2268.     // Underline links
  2269.  
  2270.     XP_Bool old_underline_links = fe_globalPrefs.underline_links_p;
  2271.     XtVaGetValues(fep->underline_links_toggle, XmNset, &b, 0);
  2272.     fe_globalPrefs.underline_links_p = b;
  2273.  
  2274.     if (old_underline_links != fe_globalPrefs.underline_links_p) {
  2275.         m_underlinelinks_changed = TRUE;
  2276.     }
  2277.         
  2278.     // Use doc colors
  2279.  
  2280.     XtVaGetValues(fep->use_my_color_toggle, XmNset, &b, 0);
  2281.     fe_globalPrefs.use_doc_colors = !b;
  2282.  
  2283.     // Install preferences
  2284.  
  2285.     install();
  2286. }
  2287.  
  2288. // Member:       getData
  2289. // Description:  
  2290. // Inputs:
  2291. // Side effects: 
  2292.  
  2293. PrefsDataGeneralColors *XFE_PrefsPageGeneralColors::getData()
  2294. {
  2295.     return m_prefsDataGeneralColors;
  2296. }
  2297.  
  2298. void XFE_PrefsPageGeneralColors::cb_activateColor(Widget      w,
  2299.                                               XtPointer   closure,
  2300.                                               XtPointer   /* call_data */)
  2301. {
  2302.     XFE_PrefsPageGeneralColors *thePage = (XFE_PrefsPageGeneralColors *)closure;
  2303.     XFE_PrefsDialog            *theDialog = thePage->getPrefsDialog();
  2304.  
  2305.     char   selected_color_name[128];
  2306.     Pixel  selected_pixel;
  2307.     char  *orig_color_name;
  2308.  
  2309.     XtVaGetValues(w,
  2310.                   XmNuserData, &orig_color_name,
  2311.                   NULL);
  2312.  
  2313.     if (orig_color_name != NULL)
  2314.         XP_STRCPY(selected_color_name, orig_color_name);
  2315.     else
  2316.         selected_color_name[0] = '\0';
  2317.  
  2318.     if (fe_colorDialog(theDialog->getBaseWidget(), theDialog->getContext(),
  2319.                        selected_color_name, &selected_pixel)) {
  2320.         if (strlen(selected_color_name) > 0) {
  2321.             if (orig_color_name &&
  2322.                 (! XP_STRCMP(orig_color_name, selected_color_name)))
  2323.                 return;
  2324.             if (orig_color_name) XtFree(orig_color_name);
  2325.             XtVaSetValues(w,
  2326.                           XmNbackground, selected_pixel,
  2327.                           XmNuserData, XtNewString(selected_color_name),
  2328.                           NULL);
  2329.         }
  2330.     }
  2331. }
  2332.  
  2333. void XFE_PrefsPageGeneralColors::cb_defaultColor(Widget      /* w */,
  2334.                                                  XtPointer   closure,
  2335.                                                  XtPointer   /* call_data */)
  2336. {
  2337.     XFE_PrefsPageGeneralColors *thePage = (XFE_PrefsPageGeneralColors *)closure;
  2338.     PrefsDataGeneralColors     *fep = thePage->getData();
  2339.     char                        buf[32];
  2340.     LO_Color                    color;
  2341.     char                       *orig_color;
  2342.     
  2343.     XtVaGetValues(fep->text_color_button, XmNuserData, &orig_color, NULL);
  2344.     if (orig_color) XtFree(orig_color);
  2345.     PREF_GetDefaultColorPref("browser.foreground_color", 
  2346.                              &color.red, &color.green, &color.blue);
  2347.     XP_SAFE_SPRINTF(buf, sizeof(buf), "#%02x%02x%02x", color.red, color.green, color.blue);
  2348.     XtVaSetValues(fep->text_color_button, 
  2349.                   XmNuserData, XtNewString(buf),
  2350.                   0);
  2351.     fe_SwatchSetColor(fep->text_color_button, &color);
  2352.     
  2353.     XtVaGetValues(fep->bg_color_button, XmNuserData, &orig_color, NULL);
  2354.     if (orig_color) XtFree(orig_color);
  2355.     PREF_GetDefaultColorPref("browser.background_color", 
  2356.                              &color.red, &color.green, &color.blue);
  2357.     XP_SAFE_SPRINTF(buf, sizeof(buf), "#%02x%02x%02x", color.red, color.green, color.blue);
  2358.     XtVaSetValues(fep->bg_color_button, 
  2359.                   XmNuserData, XtNewString(buf),
  2360.                   0);
  2361.     fe_SwatchSetColor(fep->bg_color_button, &color);
  2362. }
  2363.  
  2364. // ************************************************************************
  2365. // *************************   General/Advanced   *************************
  2366. // ************************************************************************
  2367.  
  2368. // Member:       XFE_PrefsPageGeneralAdvanced
  2369. // Description:  Constructor
  2370. // Inputs:
  2371. // Side effects: 
  2372.  
  2373. XFE_PrefsPageGeneralAdvanced::XFE_PrefsPageGeneralAdvanced(XFE_PrefsDialog *dialog)
  2374.     : XFE_PrefsPage(dialog),
  2375.       m_prefsDataGeneralAdvanced(0)
  2376. {
  2377.   m_toolbar_needs_updating = FALSE;
  2378. }
  2379.  
  2380. // Member:       ~XFE_PrefsPageGeneralAdvanced
  2381. // Description:  Destructor
  2382. // Inputs:
  2383. // Side effects: 
  2384.  
  2385. XFE_PrefsPageGeneralAdvanced::~XFE_PrefsPageGeneralAdvanced()
  2386. {
  2387.     delete m_prefsDataGeneralAdvanced;
  2388. }
  2389.  
  2390. // Member:       create
  2391. // Description:  Creates page for GeneralAdvanced
  2392. // Inputs:
  2393. // Side effects: 
  2394.  
  2395. void XFE_PrefsPageGeneralAdvanced::create()
  2396. {
  2397.     Widget            kids[100];
  2398.     Arg               av[50];
  2399.     int               ac;
  2400.     int               i;
  2401.  
  2402.     PrefsDataGeneralAdvanced *fep = NULL;
  2403.  
  2404.     fep = new PrefsDataGeneralAdvanced;
  2405.     memset(fep, 0, sizeof(PrefsDataGeneralAdvanced));
  2406.     m_prefsDataGeneralAdvanced = fep;
  2407.  
  2408.     fep->context = getContext();
  2409.     fep->prompt_dialog = getPrefsDialog()->getDialogChrome();
  2410.  
  2411.     Widget form;
  2412.  
  2413.     ac = 0;
  2414.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
  2415.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
  2416.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  2417.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  2418.     form = XmCreateForm (m_wPageForm, "advanced", av, ac);
  2419.     XtManageChild (form);
  2420.     m_wPage = fep->page = form;
  2421.  
  2422.     Widget frame1;
  2423.  
  2424.     ac = 0;
  2425.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  2426.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  2427.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
  2428.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
  2429.     frame1 = XmCreateFrame (form, "advancedFrame", av, ac);
  2430.  
  2431.     Widget form1;
  2432.  
  2433.     ac = 0;
  2434.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  2435.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  2436.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
  2437.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
  2438.     form1 = XmCreateForm (frame1, "advancedBox", av, ac);
  2439.  
  2440.     // top portion
  2441.  
  2442.     Widget enable_js_top_attachment_widget = NULL;
  2443.  
  2444.     ac = 0;
  2445.     i = 0;
  2446.  
  2447.     kids[i++] = fep->show_image_toggle =
  2448.         XmCreateToggleButtonGadget(form1, "showImage", av, ac);
  2449.  
  2450.     enable_js_top_attachment_widget = fep->show_image_toggle;
  2451.  
  2452. #ifdef JAVA
  2453.     kids[i++] = fep->enable_java_toggle = 
  2454.         XmCreateToggleButtonGadget(form1, "enableJava", av, ac);
  2455.  
  2456.     enable_js_top_attachment_widget = fep->enable_java_toggle;
  2457. #endif /* JAVA */
  2458.  
  2459.     kids[i++] = fep->enable_js_toggle = 
  2460.         XmCreateToggleButtonGadget(form1, "enableJs", av, ac);
  2461.  
  2462.     kids[i++] = fep->enable_style_sheet_toggle = 
  2463.         XmCreateToggleButtonGadget(form1, "enableStyleSheet", av, ac);
  2464.  
  2465.     kids[i++] = fep->auto_install_toggle = 
  2466.         XmCreateToggleButtonGadget(form1, "autoInstall", av, ac);
  2467.  
  2468.     kids[i++] = fep->email_anonftp_toggle = 
  2469.         XmCreateToggleButtonGadget(form1, "emailAnonFtp", av, ac);
  2470.  
  2471.     XtVaSetValues(fep->show_image_toggle,
  2472.                   XmNindicatorType, XmN_OF_MANY,
  2473.                   XmNalignment, XmALIGNMENT_BEGINNING,
  2474.                   XmNtopAttachment, XmATTACH_FORM,
  2475.                   XmNbottomAttachment, XmATTACH_NONE,
  2476.                   XmNleftAttachment, XmATTACH_FORM,
  2477.                   XmNrightAttachment, XmATTACH_NONE,
  2478.                   0);
  2479.  
  2480. #ifdef JAVA
  2481.     XtVaSetValues(fep->enable_java_toggle,
  2482.                   XmNindicatorType, XmN_OF_MANY,
  2483.                   XmNalignment, XmALIGNMENT_BEGINNING,
  2484.                   XmNtopAttachment, XmATTACH_WIDGET,
  2485.                   XmNtopWidget, fep->show_image_toggle,
  2486.                   XmNbottomAttachment, XmATTACH_NONE,
  2487.                   XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  2488.                   XmNleftWidget, fep->show_image_toggle,
  2489.                   XmNrightAttachment, XmATTACH_NONE,
  2490.                   0);
  2491. #endif /* JAVA */
  2492.  
  2493.     XtVaSetValues(fep->enable_js_toggle,
  2494.                   XmNindicatorType, XmN_OF_MANY,
  2495.                   XmNalignment, XmALIGNMENT_BEGINNING,
  2496.                   XmNtopAttachment, XmATTACH_WIDGET,
  2497.                   XmNtopWidget, enable_js_top_attachment_widget,
  2498.                   XmNbottomAttachment, XmATTACH_NONE,
  2499.                   XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  2500.                   XmNleftWidget, fep->show_image_toggle,
  2501.                   XmNrightAttachment, XmATTACH_NONE,
  2502.                   0);
  2503.  
  2504.     XtVaSetValues(fep->enable_style_sheet_toggle,
  2505.                   XmNindicatorType, XmN_OF_MANY,
  2506.                   XmNalignment, XmALIGNMENT_BEGINNING,
  2507.                   XmNtopAttachment, XmATTACH_WIDGET,
  2508.                   XmNtopWidget, fep->enable_js_toggle,
  2509.                   XmNbottomAttachment, XmATTACH_NONE,
  2510.                   XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  2511.                   XmNleftWidget, fep->show_image_toggle,
  2512.                   XmNrightAttachment, XmATTACH_NONE,
  2513.                   0);
  2514.  
  2515.     XtVaSetValues(fep->auto_install_toggle,
  2516.                   XmNindicatorType, XmN_OF_MANY,
  2517.                   XmNalignment, XmALIGNMENT_BEGINNING,
  2518.                   XmNtopAttachment, XmATTACH_WIDGET,
  2519.                   XmNtopWidget, fep->enable_style_sheet_toggle,
  2520.                   XmNbottomAttachment, XmATTACH_NONE,
  2521.                   XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  2522.                   XmNleftWidget, fep->show_image_toggle,
  2523.                   XmNrightAttachment, XmATTACH_NONE,
  2524.                   0);
  2525.  
  2526.     XtVaSetValues(fep->email_anonftp_toggle,
  2527.                   XmNindicatorType, XmN_OF_MANY,
  2528.                   XmNalignment, XmALIGNMENT_BEGINNING,
  2529.                   XmNtopAttachment, XmATTACH_WIDGET,
  2530.                   XmNtopWidget, fep->auto_install_toggle,
  2531.                   XmNbottomAttachment, XmATTACH_NONE,
  2532.                   XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  2533.                   XmNleftWidget, fep->show_image_toggle,
  2534.                   XmNrightAttachment, XmATTACH_NONE,
  2535.                   0);
  2536.  
  2537.     XtManageChildren (kids, i);
  2538.     XtManageChild (form1);
  2539.     XtManageChild (frame1);
  2540.     
  2541.     // Cookies
  2542.  
  2543.     Widget frame2;
  2544.     Widget label2;
  2545.     Widget form2;
  2546.  
  2547.     ac = 0;
  2548.     XtSetArg (av[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  2549.     XtSetArg (av[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  2550.     XtSetArg (av[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
  2551.     XtSetArg (av[ac], XmNtopWidget, frame1); ac++;
  2552.     XtSetArg (av[ac], XmNtopOffset, 8); ac++;
  2553.     XtSetArg (av[ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
  2554.     frame2 = XmCreateFrame (form, "cookieFrame", av, ac);
  2555.  
  2556.     ac = 0;
  2557.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  2558.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  2559.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
  2560.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
  2561.     form2 = XmCreateForm (frame2, "cookieBox", av, ac);
  2562.  
  2563.     ac = 0;
  2564.     XtSetArg (av [ac], XmNchildType, XmFRAME_TITLE_CHILD); ac++;
  2565.     label2 = XmCreateLabelGadget (frame2, "cookieBoxLabel", av, ac);
  2566.  
  2567.     ac = 0;
  2568.     i = 0;
  2569.  
  2570.     kids[i++] = fep->always_accept_cookie_toggle =
  2571.         XmCreateToggleButtonGadget(form2, "alwaysAcceptCookie", av, ac);
  2572.  
  2573.     kids[i++] = fep->no_foreign_cookie_toggle =
  2574.         XmCreateToggleButtonGadget(form2, "noForeignCookie", av, ac);
  2575.  
  2576.     kids[i++] = fep->never_accept_cookie_toggle =
  2577.         XmCreateToggleButtonGadget(form2, "neverAcceptCookie", av, ac);
  2578.  
  2579.     kids[i++] = fep->warn_cookie_toggle =
  2580.         XmCreateToggleButtonGadget(form2, "warnCookie", av, ac);
  2581.  
  2582.     XtVaSetValues(fep->always_accept_cookie_toggle,
  2583.                   XmNindicatorType, XmONE_OF_MANY,
  2584.                   XmNalignment, XmALIGNMENT_BEGINNING,
  2585.                   XmNtopAttachment, XmATTACH_FORM,
  2586.                   XmNbottomAttachment, XmATTACH_NONE,
  2587.                   XmNleftAttachment, XmATTACH_FORM,
  2588.                   XmNrightAttachment, XmATTACH_NONE,
  2589.                   0);
  2590.  
  2591.     XtVaSetValues(fep->no_foreign_cookie_toggle,
  2592.                   XmNindicatorType, XmONE_OF_MANY,
  2593.                   XmNalignment, XmALIGNMENT_BEGINNING,
  2594.                   XmNtopAttachment, XmATTACH_WIDGET,
  2595.                   XmNtopWidget, fep->always_accept_cookie_toggle,
  2596.                   XmNbottomAttachment, XmATTACH_NONE,
  2597.                   XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  2598.                   XmNleftWidget, fep->always_accept_cookie_toggle,
  2599.                   XmNrightAttachment, XmATTACH_NONE,
  2600.                   0);
  2601.  
  2602.     XtVaSetValues(fep->never_accept_cookie_toggle,
  2603.                   XmNindicatorType, XmONE_OF_MANY,
  2604.                   XmNalignment, XmALIGNMENT_BEGINNING,
  2605.                   XmNtopAttachment, XmATTACH_WIDGET,
  2606.                   XmNtopWidget, fep->no_foreign_cookie_toggle,
  2607.                   XmNbottomAttachment, XmATTACH_NONE,
  2608.                   XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  2609.                   XmNleftWidget, fep->always_accept_cookie_toggle,
  2610.                   XmNrightAttachment, XmATTACH_NONE,
  2611.                   0);
  2612.  
  2613.     XtVaSetValues(fep->warn_cookie_toggle,
  2614.                   XmNindicatorType, XmN_OF_MANY,
  2615.                   XmNalignment, XmALIGNMENT_BEGINNING,
  2616.                   XmNtopAttachment, XmATTACH_WIDGET,
  2617.                   XmNtopWidget, fep->never_accept_cookie_toggle,
  2618.                   XmNtopOffset, 8,
  2619.                   XmNbottomAttachment, XmATTACH_NONE,
  2620.                   XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  2621.                   XmNleftWidget, fep->always_accept_cookie_toggle,
  2622.                   XmNrightAttachment, XmATTACH_NONE,
  2623.                   0);
  2624.  
  2625.     XtManageChildren (kids, i);
  2626.     XtManageChild (label2);
  2627.     XtManageChild (form2);
  2628.     XtManageChild (frame2);
  2629.  
  2630.     // Add callbacks
  2631.  
  2632.     XtAddCallback(fep->always_accept_cookie_toggle, XmNvalueChangedCallback,
  2633.                   cb_toggleCookieState, fep);
  2634.     XtAddCallback(fep->no_foreign_cookie_toggle, XmNvalueChangedCallback,
  2635.                   cb_toggleCookieState, fep);
  2636.     XtAddCallback(fep->never_accept_cookie_toggle, XmNvalueChangedCallback,
  2637.                   cb_toggleCookieState, fep);
  2638.  
  2639.     setCreated(TRUE);
  2640. }
  2641.  
  2642. // Member:       init
  2643. // Description:  Initializes page for GeneralAdvanced
  2644. // Inputs:
  2645. // Side effects: 
  2646.  
  2647. void XFE_PrefsPageGeneralAdvanced::init()
  2648. {
  2649.     XP_ASSERT(m_prefsDataGeneralAdvanced);    
  2650.  
  2651.     PrefsDataGeneralAdvanced *fep = m_prefsDataGeneralAdvanced;
  2652.     XFE_GlobalPrefs          *prefs = &fe_globalPrefs;
  2653.     Boolean                  sensitive;
  2654.  
  2655.     XtVaSetValues(fep->show_image_toggle, 
  2656.                   XmNset, prefs->autoload_images_p, 
  2657.                   XmNsensitive, !PREF_PrefIsLocked("general.always_load_images"),
  2658.                   0);
  2659.     XtVaSetValues(fep->enable_style_sheet_toggle, 
  2660.                   XmNset, prefs->enable_style_sheet, 
  2661.                   XmNsensitive, !PREF_PrefIsLocked("browser.enable_style_sheets"),
  2662.                   0);
  2663.  
  2664. #ifdef JAVA
  2665.     XtVaSetValues(fep->enable_java_toggle, 
  2666.                   XmNset, prefs->enable_java, 
  2667.                   XmNsensitive, !PREF_PrefIsLocked("security.enable_java"),
  2668.                   0);
  2669. #endif /* JAVA */
  2670.  
  2671.     XtVaSetValues(fep->enable_js_toggle, 
  2672.                   XmNset, prefs->enable_javascript, 
  2673.                   XmNsensitive, !PREF_PrefIsLocked("javascript.enabled"),
  2674.                   0);
  2675.  
  2676.     XtVaSetValues(fep->auto_install_toggle, 
  2677.                   XmNset, prefs->auto_install, 
  2678.                   XmNsensitive, !PREF_PrefIsLocked("autoupdate.enabled"),
  2679.                   0);
  2680.     XtVaSetValues(fep->email_anonftp_toggle, 
  2681.                   XmNset, prefs->email_anonftp, 
  2682.                   XmNsensitive, !PREF_PrefIsLocked("security.email_as_ftp_password"),
  2683.                   0);
  2684.  
  2685.     // Cookie
  2686.  
  2687.     sensitive = !PREF_PrefIsLocked("network.cookie.cookieBehavior");
  2688.     XtVaSetValues(fep->always_accept_cookie_toggle, 
  2689.                   XmNset, prefs->accept_cookie == NET_Accept,
  2690.                   XmNsensitive, sensitive,
  2691.                   0);
  2692.     XtVaSetValues(fep->no_foreign_cookie_toggle, 
  2693.                   XmNset, prefs->accept_cookie == NET_DontAcceptForeign,
  2694.                   XmNsensitive, sensitive,
  2695.                   0);
  2696.     XtVaSetValues(fep->never_accept_cookie_toggle, 
  2697.                   XmNset, prefs->accept_cookie == NET_DontUse,
  2698.                   XmNsensitive, sensitive,
  2699.                   0);
  2700.  
  2701.     sensitive = !PREF_PrefIsLocked("network.cookie.warnAboutCookies");
  2702.     XtVaSetValues(fep->warn_cookie_toggle, 
  2703.                   XmNset, prefs->warn_accept_cookie,
  2704.                   XmNsensitive, sensitive,
  2705.                   0);
  2706.  
  2707.     setInitialized(TRUE);
  2708. }
  2709.  
  2710. // Member:       install
  2711. // Description:  
  2712. // Inputs:
  2713. // Side effects: 
  2714.  
  2715. void XFE_PrefsPageGeneralAdvanced::install()
  2716. {
  2717.     fe_installGeneralAdvanced();
  2718.  
  2719.     if (m_toolbar_needs_updating) {
  2720.         // Notify whoever is interested in updating toolbar appearance
  2721.         XFE_MozillaApp::theApp()->notifyInterested(XFE_MozillaApp::updateToolbarAppearance);
  2722.         m_toolbar_needs_updating = FALSE;
  2723.     }
  2724. }
  2725.  
  2726. // Member:       save
  2727. // Description:  
  2728. // Inputs:
  2729. // Side effects: 
  2730.  
  2731. void XFE_PrefsPageGeneralAdvanced::save()
  2732. {
  2733.     PrefsDataGeneralAdvanced *fep = m_prefsDataGeneralAdvanced;
  2734.     Boolean                  b;
  2735.  
  2736.     int old_autoload_images = fe_globalPrefs.autoload_images_p;
  2737.  
  2738.     XP_ASSERT(fep);
  2739.  
  2740.     XtVaGetValues(fep->show_image_toggle, XmNset, &b, 0);
  2741.     fe_globalPrefs.autoload_images_p = b;
  2742.  
  2743.     XtVaGetValues(fep->enable_style_sheet_toggle, XmNset, &b, 0);
  2744.     fe_globalPrefs.enable_style_sheet = b;
  2745.  
  2746. #ifdef JAVA
  2747.     XtVaGetValues(fep->enable_java_toggle, XmNset, &b, 0);
  2748.     fe_globalPrefs.enable_java = b;
  2749. #endif /* JAVA */
  2750.  
  2751.     XtVaGetValues(fep->enable_js_toggle, XmNset, &b, 0);
  2752.     fe_globalPrefs.enable_javascript = b;
  2753.  
  2754.     XtVaGetValues(fep->auto_install_toggle, XmNset, &b, 0);
  2755.     fe_globalPrefs.auto_install = b;
  2756.  
  2757.     XtVaGetValues(fep->email_anonftp_toggle, XmNset, &b, 0);
  2758.     fe_globalPrefs.email_anonftp = b;
  2759.  
  2760.     // Cookies
  2761.  
  2762.     XtVaGetValues(fep->always_accept_cookie_toggle, XmNset, &b, 0);
  2763.     if (b) fe_globalPrefs.accept_cookie = NET_Accept;
  2764.  
  2765.     XtVaGetValues(fep->no_foreign_cookie_toggle, XmNset, &b, 0);
  2766.     if (b) fe_globalPrefs.accept_cookie = NET_DontAcceptForeign;
  2767.  
  2768.     XtVaGetValues(fep->never_accept_cookie_toggle, XmNset, &b, 0);
  2769.  
  2770.     if (b) fe_globalPrefs.accept_cookie = NET_DontUse;
  2771.  
  2772.     XtVaGetValues(fep->warn_cookie_toggle, XmNset, &b, 0);
  2773.     fe_globalPrefs.warn_accept_cookie = b;
  2774.  
  2775.     if (old_autoload_images != fe_globalPrefs.autoload_images_p) {
  2776.       m_toolbar_needs_updating = TRUE;
  2777.     }
  2778.  
  2779.  
  2780.  
  2781.     // Install preferences
  2782.  
  2783.     install();
  2784. }
  2785.  
  2786. // Member:       getData
  2787. // Description:  
  2788. // Inputs:
  2789. // Side effects: 
  2790.  
  2791. PrefsDataGeneralAdvanced *XFE_PrefsPageGeneralAdvanced::getData()
  2792. {
  2793.     return m_prefsDataGeneralAdvanced;
  2794. }
  2795.  
  2796. // Member:       cb_toggleCookieState
  2797. // Description:  
  2798. // Inputs:
  2799. // Side effects: 
  2800.  
  2801. void XFE_PrefsPageGeneralAdvanced::cb_toggleCookieState(Widget    w,
  2802.                                                         XtPointer closure,
  2803.                                                         XtPointer callData)
  2804. {
  2805.     XmToggleButtonCallbackStruct *cb = (XmToggleButtonCallbackStruct *)callData;
  2806.     PrefsDataGeneralAdvanced     *fep = (PrefsDataGeneralAdvanced *)closure;
  2807.  
  2808.     if (! cb->set) {
  2809.         XtVaSetValues(w, XmNset, True, 0);
  2810.     }
  2811.     else if (w == fep->always_accept_cookie_toggle) {
  2812.         XtVaSetValues(fep->no_foreign_cookie_toggle, XmNset, False, 0);
  2813.         XtVaSetValues(fep->never_accept_cookie_toggle, XmNset, False, 0);
  2814.     }
  2815.     else if (w == fep->no_foreign_cookie_toggle) {
  2816.         XtVaSetValues(fep->always_accept_cookie_toggle, XmNset, False, 0);
  2817.         XtVaSetValues(fep->never_accept_cookie_toggle, XmNset, False, 0);
  2818.     }
  2819.     else if (w == fep->never_accept_cookie_toggle) {
  2820.         XtVaSetValues(fep->always_accept_cookie_toggle, XmNset, False, 0);
  2821.         XtVaSetValues(fep->no_foreign_cookie_toggle, XmNset, False, 0);
  2822.     }
  2823.     else
  2824.         abort();    
  2825. }
  2826.  
  2827. // ************************************************************************
  2828. // **************************    General/Appl   ***************************
  2829. // ************************************************************************
  2830.  
  2831. // Member:       XFE_PrefsPageGeneralAppl
  2832. // Description:  Constructor
  2833. // Inputs:
  2834. // Side effects: 
  2835.  
  2836. XFE_PrefsPageGeneralAppl::XFE_PrefsPageGeneralAppl(XFE_PrefsDialog *dialog)
  2837.     : XFE_PrefsPage(dialog),
  2838.       m_prefsDataGeneralAppl(0)
  2839. {
  2840. }
  2841.  
  2842. // Member:       ~XFE_PrefsPageGeneralAppl
  2843. // Description:  Destructor
  2844. // Inputs:
  2845. // Side effects: 
  2846.  
  2847. XFE_PrefsPageGeneralAppl::~XFE_PrefsPageGeneralAppl()
  2848. {
  2849.     delete m_prefsDataGeneralAppl;
  2850. }
  2851.  
  2852. // Member:       create
  2853. // Description:  Creates page for GeneralAppl
  2854. // Inputs:
  2855. // Side effects: 
  2856.  
  2857. void XFE_PrefsPageGeneralAppl::create()
  2858. {
  2859.     Widget            kids[100];
  2860.     Arg               av[50];
  2861.     int               ac;
  2862.     int               i;
  2863.  
  2864.     PrefsDataGeneralAppl *fep = NULL;
  2865.  
  2866.     fep = new PrefsDataGeneralAppl;
  2867.     memset(fep, 0, sizeof(PrefsDataGeneralAppl));
  2868.     m_prefsDataGeneralAppl = fep;
  2869.  
  2870.     fep->context = getContext();
  2871.     fep->prompt_dialog = getPrefsDialog()->getDialogChrome();
  2872.  
  2873.     Widget form;
  2874.  
  2875.     ac = 0;
  2876.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
  2877.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
  2878.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  2879.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  2880.     form = XmCreateForm (m_wPageForm, "appl", av, ac);
  2881.     XtManageChild (form);
  2882.     m_wPage = fep->page = form;
  2883.  
  2884.     Widget frame1;
  2885.  
  2886.     ac = 0;
  2887.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  2888.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  2889.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
  2890.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
  2891.     frame1 = XmCreateFrame (form, "applFrame", av, ac);
  2892.  
  2893.     Widget form1;
  2894.  
  2895.     ac = 0;
  2896.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  2897.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  2898.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
  2899.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
  2900.     form1 = XmCreateForm (frame1, "applBox", av, ac);
  2901.  
  2902.     // Application list
  2903.  
  2904.     Widget helpers_list;
  2905.  
  2906.     ac = 0;
  2907.     i = 0;
  2908.     XtSetArg(av[ac], XmNselectionPolicy, XmSELECT_BROWSE_ROW); ac++;
  2909.     XtSetArg(av[ac], XmNhorizontalSizePolicy, XmCONSTANT); ac++;
  2910.     XtSetArg(av[ac], XmNallowColumnResize, True); ac++;
  2911.     XtSetArg(av[ac], XmNheight, 250); ac++;
  2912.     kids[i++] = helpers_list = XmLCreateGrid(form1, "helperApp", av, ac);
  2913.     fep->helpers_list = helpers_list;
  2914.     XtVaSetValues(helpers_list, XmNcolumnSizePolicy, XmVARIABLE, NULL);
  2915.     XtVaSetValues(helpers_list, XmNlayoutFrozen, True, NULL);
  2916.  
  2917.     XmLGridAddColumns(helpers_list, XmCONTENT, -1, 2);
  2918.  
  2919.     // First Column
  2920.     XtVaSetValues(helpers_list, 
  2921.                   XmNrowType, XmHEADING,
  2922.                   XmNcolumn, 0,
  2923.                   XmNcellDefaults, True,
  2924.                   XmNcolumnWidth,  DEFAULT_COLUMN_WIDTH,
  2925.                   XmNcellType, XmSTRING_CELL,
  2926.                   XmNcellEditable, True,
  2927.                   XmNcellAlignment, XmALIGNMENT_LEFT,
  2928.                   NULL);
  2929.  
  2930.     // Second Column
  2931.     XtVaSetValues(helpers_list, 
  2932.                   XmNrowType, XmHEADING,
  2933.                   XmNcolumn, 1,
  2934.                   XmNcellDefaults, True,
  2935.                   XmNcellType, XmSTRING_CELL,
  2936.                   XmNcellEditable, True,
  2937.                   XmNcolumnWidth, MAX_COLUMN_WIDTH,
  2938.                   XmNcellAlignment, XmALIGNMENT_LEFT, 
  2939.                   NULL);
  2940.  
  2941.     XmLGridAddRows(helpers_list, XmHEADING, -1, 1);
  2942.     XmLGridSetStrings(helpers_list, XP_GetString(XFE_HELPERS_LIST_HEADER));
  2943.  
  2944.     // Get the font from *XmLGrid*fontList at this point.  - XXX dp 
  2945.  
  2946.     XtVaSetValues(helpers_list, 
  2947.                   XmNcellDefaults, True,
  2948.                   XmNcellType, XmSTRING_CELL,
  2949.                   XmNcellEditable, False,
  2950.                   XmNcellLeftBorderType, XmBORDER_NONE,
  2951.                   XmNcellRightBorderType, XmBORDER_NONE,
  2952.                   XmNcellTopBorderType, XmBORDER_NONE,
  2953.                   XmNcellBottomBorderType, XmBORDER_NONE,
  2954.                   XmNcellAlignment, XmALIGNMENT_LEFT, 
  2955.                   NULL);
  2956.  
  2957.     XtVaSetValues(helpers_list,
  2958.                   XmNlayoutFrozen, False,
  2959.                   NULL);
  2960.  
  2961.     // New, Edit, Delete buttons
  2962.  
  2963.     ac = 0;
  2964.  
  2965.     Widget new_button;
  2966.     Widget edit_button;
  2967.     Widget delete_button;
  2968.     Widget folder_label;
  2969.     Widget folder_text;
  2970.     Widget browse_button;
  2971.     
  2972.     kids[i++] = new_button =
  2973.         XmCreatePushButtonGadget(form1, "newButton", av, ac);
  2974.  
  2975.     kids[i++] = edit_button =
  2976.         XmCreatePushButtonGadget(form1, "editButton", av, ac);
  2977.  
  2978.     kids[i++] = delete_button =
  2979.         XmCreatePushButtonGadget(form1, "deleteButton", av, ac);
  2980.  
  2981.     // Downloads folder
  2982.  
  2983.     kids[i++] = folder_label = 
  2984.         XmCreateLabelGadget(form1, "folderLabel", av, ac);
  2985.  
  2986.     ac = 0;
  2987.     XtSetArg(av[ac], XmNcolumns, 25); ac++;
  2988.     kids[i++] = folder_text = 
  2989.         fe_CreateTextField(form1, "folderText", av, ac);
  2990.  
  2991.     ac = 0;
  2992.     kids[i++] = browse_button =
  2993.         XmCreatePushButtonGadget(form1, "browseButton", av, ac);
  2994.  
  2995.     fep->folder_text = folder_text;
  2996.     fep->browse_button = browse_button;
  2997.     
  2998.     // Attachments
  2999.  
  3000.     Dimension width = XfeWidth(folder_label) +
  3001.         XfeWidth(folder_text) +
  3002.         XfeWidth(browse_button);
  3003.  
  3004.     XtVaSetValues(helpers_list,
  3005.                   XmNwidth, width,
  3006.                   XmNleftAttachment, XmATTACH_FORM,
  3007.                   XmNrightAttachment, XmATTACH_NONE,
  3008.                   XmNbottomAttachment, XmATTACH_NONE,
  3009.                   XmNtopAttachment, XmATTACH_FORM,
  3010.                   NULL);
  3011.  
  3012.     int labels_width;
  3013.     int edit_left_offset;
  3014.  
  3015.     labels_width = XfeVaGetWidestWidget(new_button,
  3016.                                         edit_button,
  3017.                                         delete_button,
  3018.                                         NULL);
  3019.     edit_left_offset = -(labels_width/2);
  3020.     
  3021.     XtVaSetValues(edit_button,
  3022.                   XmNwidth, labels_width,
  3023.                   XmNleftAttachment, XmATTACH_POSITION,
  3024.                   XmNleftPosition, 50,
  3025.                   XmNleftOffset, edit_left_offset,
  3026.                   XmNrightAttachment, XmATTACH_NONE,
  3027.                   XmNbottomAttachment, XmATTACH_NONE,
  3028.                   XmNtopAttachment, XmATTACH_WIDGET,
  3029.                   XmNtopWidget, helpers_list,
  3030.                   XmNtopOffset, 8,
  3031.                   NULL);
  3032.  
  3033.     XtVaSetValues(new_button,
  3034.                   XmNwidth, labels_width,
  3035.                   XmNleftAttachment, XmATTACH_NONE,
  3036.                   XmNrightAttachment, XmATTACH_WIDGET,
  3037.                   XmNrightWidget, edit_button,
  3038.                   XmNrightOffset, 8,
  3039.                   XmNbottomAttachment, XmATTACH_NONE,
  3040.                   XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  3041.                   XmNtopWidget, edit_button,
  3042.                   NULL);
  3043.  
  3044.     XtVaSetValues(delete_button,
  3045.                   XmNwidth, labels_width,
  3046.                   XmNleftAttachment, XmATTACH_WIDGET,
  3047.                   XmNleftWidget, edit_button,
  3048.                   XmNleftOffset, 8,
  3049.                   XmNrightAttachment, XmATTACH_NONE,
  3050.                   XmNbottomAttachment, XmATTACH_NONE,
  3051.                   XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  3052.                   XmNtopWidget, edit_button,
  3053.                   NULL);
  3054.  
  3055.     int labels_height;
  3056.  
  3057.     labels_height = XfeVaGetTallestWidget(folder_label,
  3058.                                           folder_text,
  3059.                                           browse_button,
  3060.                                           NULL);
  3061.  
  3062.     XtVaSetValues(folder_label,
  3063.                   XmNheight, labels_height,
  3064.                   XmNleftAttachment, XmATTACH_FORM,
  3065.                   XmNtopAttachment, XmATTACH_WIDGET,
  3066.                   XmNtopWidget, new_button,
  3067.                   XmNtopOffset, 8,
  3068.                   XmNrightAttachment, XmATTACH_NONE,
  3069.                   XmNbottomAttachment, XmATTACH_NONE,
  3070.                   NULL);
  3071.  
  3072.     XtVaSetValues(folder_text,
  3073.                   XmNheight, labels_height,
  3074.                   XmNleftAttachment, XmATTACH_WIDGET,
  3075.                   XmNleftWidget, folder_label,
  3076.                   XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  3077.                   XmNtopWidget, folder_label,
  3078.                   XmNrightAttachment, XmATTACH_NONE,
  3079.                   XmNbottomAttachment, XmATTACH_NONE,
  3080.                   NULL);
  3081.  
  3082.     XtVaSetValues(browse_button,
  3083.                   XmNheight, labels_height,
  3084.                   XmNleftAttachment, XmATTACH_WIDGET,
  3085.                   XmNleftWidget, folder_text,
  3086.                   XmNleftOffset, 4,
  3087.                   XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  3088.                   XmNtopWidget, folder_label,
  3089.                   XmNrightAttachment, XmATTACH_NONE,
  3090.                   XmNbottomAttachment, XmATTACH_NONE,
  3091.                   NULL);
  3092.  
  3093.     // Add callbacks
  3094.  
  3095.     XtAddCallback(new_button, XmNactivateCallback, cb_new, this);
  3096.     XtAddCallback(edit_button, XmNactivateCallback, cb_edit, this);
  3097.     XtAddCallback(delete_button, XmNactivateCallback, cb_delete, this);
  3098.     XtAddCallback(browse_button, XmNactivateCallback, cb_browse, this);
  3099.  
  3100.     XtManageChildren(kids, i);
  3101.     XtManageChild(form1);
  3102.     XtManageChild(frame1);
  3103.  
  3104.     // Set up Column Width 
  3105.  
  3106.     XmFontList fontList;
  3107.     short      avgwidth;
  3108.     short      avgheight;
  3109.  
  3110.     XtVaGetValues(helpers_list,
  3111.                   XmNfontList, &fontList,
  3112.                   XmNwidth, &width, 
  3113.                   NULL);
  3114.     XmLFontListGetDimensions(fontList, &avgwidth, &avgheight, TRUE);
  3115.  
  3116.     setCreated(TRUE);
  3117. }
  3118.  
  3119. // Member:       init
  3120. // Description:  Initializes page for GeneralAppl
  3121. // Inputs:
  3122. // Side effects: 
  3123.  
  3124. void XFE_PrefsPageGeneralAppl::init()
  3125. {
  3126.     XFE_GlobalPrefs      *prefs = &fe_globalPrefs;
  3127.     XP_ASSERT(m_prefsDataGeneralAppl);
  3128.     PrefsDataGeneralAppl *fep = m_prefsDataGeneralAppl;
  3129.     Boolean sensitive;
  3130.     
  3131.     // Before making the helpers page see if we want to reload the
  3132.     // mailcap and mimetype files if they changed on disk.
  3133.  
  3134.     XP_Bool needs_reload = FALSE;
  3135.  
  3136.     /* Mimetypes file */
  3137.  
  3138.     if (fe_globalData.privateMimetypeFileModifiedTime != 0 &&
  3139.         fe_isFileExist(fe_globalPrefs.private_mime_types_file) &&
  3140.         fe_isFileChanged(fe_globalPrefs.private_mime_types_file,
  3141.                          fe_globalData.privateMimetypeFileModifiedTime, NULL)) {
  3142.         char *msg = PR_smprintf(XP_GetString(XFE_PRIVATE_RELOADED_MIMETYPE),
  3143.                                 fe_globalPrefs.private_mime_types_file);
  3144.         if (msg) {
  3145.             fe_Alert_2(getPrefsDialog()->getDialogChrome(), msg);
  3146.             XP_FREE(msg);
  3147.         }
  3148.         needs_reload = TRUE;
  3149.     }
  3150.  
  3151.     // The mailcap File 
  3152.  
  3153.     if (fe_globalData.privateMailcapFileModifiedTime != 0 &&
  3154.         fe_isFileExist(fe_globalPrefs.private_mailcap_file) &&
  3155.         fe_isFileChanged(fe_globalPrefs.private_mailcap_file,
  3156.                          fe_globalData.privateMailcapFileModifiedTime, NULL)) {
  3157.         char *msg = PR_smprintf(XP_GetString(XFE_PRIVATE_RELOADED_MAILCAP),
  3158.                                 fe_globalPrefs.private_mailcap_file);
  3159.         if (msg) {
  3160.             fe_Alert_2(getPrefsDialog()->getDialogChrome(), msg);
  3161.             XP_FREE(msg);
  3162.         }
  3163.         needs_reload = TRUE;
  3164.     }
  3165.  
  3166.     if (needs_reload) {
  3167.         NET_CleanupMailCapList(NULL);
  3168.         NET_CleanupFileFormat(NULL);
  3169.         fe_RegisterConverters();
  3170.     }
  3171.  
  3172.     // Add static applications
  3173.  
  3174.     xfe_prefsDialogAppl_build_static_list(fep);
  3175.  
  3176.     // Parse the .mime.types and .mailcap files.
  3177.     xfe_prefsDialogAppl_build_mime_list(fep);
  3178.  
  3179.     // browser download directory
  3180.     fe_SetTextField(fep->folder_text, prefs->tmp_dir);
  3181.  
  3182.     sensitive = !PREF_PrefIsLocked("browser.download_directory");
  3183.     XtSetSensitive(fep->folder_text, sensitive);
  3184.     XtSetSensitive(fep->browse_button, sensitive);
  3185.  
  3186.     setInitialized(TRUE);
  3187. }
  3188.  
  3189. // Member:       unmap
  3190. // Description:  
  3191. // Inputs:
  3192. // Side effects: 
  3193.  
  3194. void XFE_PrefsPageGeneralAppl::unmap()
  3195. {
  3196.     PrefsDataGeneralAppl *fep = m_prefsDataGeneralAppl;
  3197.     XP_ASSERT(fep);
  3198.  
  3199.     if (fep->helpers_changed) {
  3200.         /* Throw away the current information about mime types */
  3201.         NET_CleanupFileFormat(NULL);
  3202.         fe_globalData.privateMimetypeFileModifiedTime = 0;
  3203.         NET_CleanupMailCapList(NULL);
  3204.         fe_globalData.privateMailcapFileModifiedTime = 0;
  3205.  
  3206.         /* Re-load the default settings */
  3207.         fe_RegisterConverters();
  3208.     }
  3209.  
  3210.     XFE_PrefsPage::unmap();
  3211. }
  3212.  
  3213. // Member:       install
  3214. // Description:  
  3215. // Inputs:
  3216. // Side effects: 
  3217.  
  3218. void XFE_PrefsPageGeneralAppl::install()
  3219. {
  3220.     fe_installBrowserAppl();
  3221.  
  3222. #ifdef NEW_DECODERS
  3223.     PrefsDataGeneralAppl *fep = m_prefsDataGeneralAppl;
  3224.     XP_ASSERT(fep);
  3225.  
  3226.     if (fep->helpers_changed) {
  3227.         XP_Bool reload = FALSE;
  3228.  
  3229.         /* Save the current preferences out */
  3230.         if (fe_globalData.privateMimetypeFileModifiedTime != 0 &&
  3231.             fe_isFileExist(fe_globalPrefs.private_mime_types_file) &&
  3232.             fe_isFileChanged(fe_globalPrefs.private_mime_types_file,
  3233.                              fe_globalData.privateMimetypeFileModifiedTime, 0)) {
  3234.             /* Ask users about overwriting or reloading */
  3235.             char *msg = PR_smprintf(XP_GetString(XFE_PRIVATE_MIMETYPE_RELOAD),
  3236.                                     fe_globalPrefs.private_mime_types_file);
  3237.             if (msg) {
  3238.                 reload = XFE_Confirm (fep->context, msg);
  3239.                 XP_FREE(msg);
  3240.             }
  3241.         }
  3242.         if (reload)
  3243.             NET_CleanupFileFormat(NULL);
  3244.         else
  3245.             NET_CleanupFileFormat(fe_globalPrefs.private_mime_types_file);
  3246.  
  3247.         reload = FALSE;
  3248.         if (fe_globalData.privateMailcapFileModifiedTime != 0 &&
  3249.             fe_isFileExist(fe_globalPrefs.private_mailcap_file) &&
  3250.             fe_isFileChanged(fe_globalPrefs.private_mailcap_file,
  3251.                              fe_globalData.privateMailcapFileModifiedTime, NULL)) {
  3252.             /* Ask users about overwriting or reloading */
  3253.             char *msg = PR_smprintf(XP_GetString(XFE_PRIVATE_MAILCAP_RELOAD),
  3254.                                     fe_globalPrefs.private_mailcap_file);
  3255.             if (msg) {
  3256.                 reload = XFE_Confirm(fep->context, msg);
  3257.                 XP_FREE(msg);
  3258.             }
  3259.         }
  3260.         if (reload)
  3261.             NET_CleanupMailCapList(NULL);
  3262.         else
  3263.             NET_CleanupMailCapList(fe_globalPrefs.private_mailcap_file);
  3264.  
  3265.         /* Load the preferences file again */
  3266.         fe_RegisterConverters ();
  3267.     }
  3268. #endif /* NEW_DECODERS */
  3269. }
  3270.  
  3271. // Member:       markGeneralApplModified
  3272. // Description:  
  3273. // Inputs:
  3274. // Side effects: 
  3275.  
  3276. void XFE_PrefsPageGeneralAppl::setModified(Boolean flag)
  3277. {
  3278.     XP_ASSERT(m_prefsDataGeneralAppl);
  3279.     PrefsDataGeneralAppl *fep = m_prefsDataGeneralAppl;
  3280.     
  3281.     fep->helpers_changed = flag;
  3282. }
  3283.  
  3284. // Member:       save
  3285. // Description:  
  3286. // Inputs:
  3287. // Side effects: 
  3288.  
  3289. void XFE_PrefsPageGeneralAppl::save()
  3290. {
  3291.     XP_ASSERT(m_prefsDataGeneralAppl);
  3292.     PrefsDataGeneralAppl *fep = m_prefsDataGeneralAppl;
  3293.  
  3294.     XP_FREEIF(fe_globalPrefs.tmp_dir);
  3295.     char *s = fe_GetTextField(fep->folder_text);
  3296.     fe_globalPrefs.tmp_dir = s ? s : XP_STRDUP("");
  3297.  
  3298.     // Install preferences
  3299.  
  3300.     install();
  3301. }
  3302.  
  3303. // Member:       getData
  3304. // Description:  
  3305. // Inputs:
  3306. // Side effects: 
  3307.  
  3308. PrefsDataGeneralAppl *XFE_PrefsPageGeneralAppl::getData()
  3309. {
  3310.     return m_prefsDataGeneralAppl;
  3311. }
  3312.  
  3313. // Member:       cb_new
  3314. // Description:  
  3315. // Inputs:
  3316. // Side effects: 
  3317.  
  3318. void XFE_PrefsPageGeneralAppl::cb_new(Widget    /* w */,
  3319.                                       XtPointer closure,
  3320.                                       XtPointer /* callData */)
  3321. {
  3322.     XFE_PrefsPageGeneralAppl *thePage = (XFE_PrefsPageGeneralAppl *)closure;
  3323.     XFE_PrefsDialog          *theDialog = thePage->getPrefsDialog();
  3324.     Widget                    mainw = theDialog->getBaseWidget();
  3325.  
  3326.     // while (!XtIsWMShell(mainw) && (XtParent(mainw)!=0))
  3327.     //        mainw = XtParent(mainw);
  3328.  
  3329.     // Instantiate an applications new dialog
  3330.  
  3331.     XFE_PrefsApplEditDialog *theNewDialog = 0;
  3332.  
  3333.     if ((theNewDialog =
  3334.          new XFE_PrefsApplEditDialog(theDialog, mainw, "prefsApplEdit", thePage)) == 0) {
  3335.         fe_perror(thePage->getContext(), XP_GetString(XFE_OUT_OF_MEMORY_URL));
  3336.         return;
  3337.     }
  3338.  
  3339.     // Initialize and pop up the dialog
  3340.  
  3341.     theNewDialog->initPage(TRUE, 0);
  3342.     theNewDialog->show();
  3343. }
  3344.  
  3345. // Member:       cb_edit
  3346. // Description:  
  3347. // Inputs:
  3348. // Side effects: 
  3349.  
  3350. void XFE_PrefsPageGeneralAppl::cb_edit(Widget    w,
  3351.                                        XtPointer closure,
  3352.                                        XtPointer /* callData */)
  3353. {
  3354.     XFE_PrefsPageGeneralAppl *thePage = (XFE_PrefsPageGeneralAppl *)closure;
  3355.     XFE_PrefsDialog          *theDialog = thePage->getPrefsDialog();
  3356.     PrefsDataGeneralAppl     *fep = thePage->getData();
  3357.     Widget                    mainw = theDialog->getBaseWidget();
  3358.  
  3359.     // Instantiate an applications new dialog
  3360.  
  3361.     XFE_PrefsApplEditDialog *theEditDialog = 0;
  3362.     PrefsDataGeneralAppl    *prefsDataGeneralAppl;
  3363.  
  3364.     XtVaGetValues(w, XmNuserData, &prefsDataGeneralAppl, NULL);
  3365.  
  3366.     if ((theEditDialog =
  3367.          new XFE_PrefsApplEditDialog(theDialog, mainw, "prefsApplEdit", thePage)) == 0) {
  3368.         fe_perror(thePage->getContext(), XP_GetString(XFE_OUT_OF_MEMORY_URL));
  3369.         return;
  3370.     }
  3371.  
  3372.     // Initialize and pop up the dialog
  3373.  
  3374.     int    selectedCount;
  3375.     int    pos[1]; /* we are browse select, so only 1 row is selected */
  3376.  
  3377.     selectedCount = XmLGridGetSelectedRowCount(fep->helpers_list);
  3378.     if ( selectedCount != 1 )
  3379.         return;
  3380.  
  3381.     XmLGridGetSelectedRows(fep->helpers_list, pos, selectedCount);
  3382.  
  3383.     theEditDialog->initPage(FALSE, pos[0]);
  3384.     theEditDialog->show();
  3385. }
  3386.  
  3387. // Member:       cb_delete
  3388. // Description:  
  3389. // Inputs:
  3390. // Side effects: 
  3391.  
  3392. void XFE_PrefsPageGeneralAppl::cb_delete(Widget    /* w */,
  3393.                                          XtPointer closure,
  3394.                                          XtPointer /* callData */)
  3395. {
  3396.     XFE_PrefsPageGeneralAppl *thePage = (XFE_PrefsPageGeneralAppl *)closure;
  3397.     PrefsDataGeneralAppl     *fep = thePage->getData();
  3398.     char                     *old_str = 0;
  3399.     char                     *src_str = 0;
  3400.     NET_cdataStruct          *cd = NULL;
  3401.     NET_mdataStruct          *old_md= NULL;
  3402.     int                       selectedCount;
  3403.     int                       pos[1]; /* we are browse select, so only 1 row is selected */
  3404.  
  3405.     selectedCount = XmLGridGetSelectedRowCount(fep->helpers_list);
  3406.      if ( selectedCount != 1 )
  3407.         return;
  3408.  
  3409.     XmLGridGetSelectedRows(fep->helpers_list, pos, selectedCount);
  3410.  
  3411.     int position = pos[0];
  3412.     if (position < fep->static_apps_count) {
  3413.         /* cannot remove static applications */
  3414.         FE_Alert(thePage->getContext(), XP_GetString(XFE_HELPERS_CANNOT_DEL_STATIC_APPS));
  3415.         return;
  3416.     }
  3417.   
  3418.     /* adjust position */
  3419.     position = position - fep->static_apps_count;
  3420.     /* pos in the list always start from 0 */
  3421.     cd = xfe_prefsDialogAppl_get_mime_data_at_pos(position);
  3422.     if ( fep ) {
  3423.         if (XFE_Confirm (fep->context, fe_globalData.helper_app_delete_message)) {
  3424.             thePage->setModified(TRUE);
  3425.             old_md = xfe_prefsDialogAppl_get_mailcap_from_type(cd->ci.type); 
  3426.  
  3427.             if ( old_md ) {
  3428.                 /* If there is a mailcap entry, 
  3429.                    then update to reflect delete */
  3430.                 old_str = old_md->src_string;
  3431.                 old_md->src_string = 0;
  3432.             }
  3433.             if ( !old_str || !strlen(old_str)) {
  3434.                 src_str = 
  3435.                     xfe_prefsDialogAppl_construct_new_mailcap_string(old_md, 
  3436.                                                          cd->ci.type, 
  3437.                                                          NULL, 
  3438.                                                          NET_COMMAND_DELETED);
  3439.             }
  3440.             else {
  3441.                 src_str = xfe_prefsDialogAppl_deleteCommand(old_str);
  3442.                 XP_FREE(old_str);
  3443.  
  3444.                 old_str = src_str;
  3445.                 src_str = xfe_prefsDialogAppl_updateKey(src_str, 
  3446.                                                     NET_MOZILLA_FLAGS, 
  3447.                                                     NET_COMMAND_DELETED, 1 );
  3448.                 XP_FREE(old_str);
  3449.             }
  3450.  
  3451.             if ( old_md ) {
  3452.                 if (old_md->src_string ) XP_FREE(old_md->src_string);
  3453.                 old_md->src_string = 0;
  3454.  
  3455.                 if ( src_str && *src_str )
  3456.                     old_md->src_string = src_str;
  3457.  
  3458.                 if (old_md->xmode) XP_FREE(old_md->xmode);
  3459.                 old_md->xmode = strdup(NET_COMMAND_DELETED);
  3460.                 old_md->is_modified = 1;
  3461.             }
  3462.             else {
  3463.                 xfe_prefsDialogAppl_add_new_mailcap_data(cd->ci.type, 
  3464.                                                          src_str, NULL,  
  3465.                                                          NET_COMMAND_DELETED, 
  3466.                                                          1);
  3467.                 XP_FREE(src_str);
  3468.             }
  3469.  
  3470.             /* delete the row at pos[0], because position is now adjusted
  3471.              * with static applications in mind...
  3472.              */
  3473.             XmLGridDeleteRows(fep->helpers_list, XmCONTENT, pos[0], 1);
  3474.  
  3475.             if (cd->is_new) {
  3476.                 NET_cdataRemove(cd);
  3477.                 if ( old_md )
  3478.                     NET_mdataRemove(old_md);
  3479.             }
  3480.         }
  3481.     }
  3482. }
  3483.  
  3484. // Member:       cb_browse
  3485. // Description:  
  3486. // Inputs:
  3487. // Side effects: 
  3488.  
  3489. void XFE_PrefsPageGeneralAppl::cb_browse(Widget    /* w */,
  3490.                                          XtPointer closure,
  3491.                                          XtPointer /* callData */)
  3492. {
  3493.     XFE_PrefsPageGeneralAppl *thePage = (XFE_PrefsPageGeneralAppl *)closure;
  3494.     XFE_PrefsDialog          *theDialog = thePage->getPrefsDialog();
  3495.     PrefsDataGeneralAppl     *fep = thePage->getData();
  3496.  
  3497.     fe_browse_file_of_text(theDialog->getContext(), fep->folder_text, True);
  3498. }
  3499.  
  3500. // ************************************************************************
  3501. // *************************     General/Cache    *************************
  3502. // ************************************************************************
  3503.  
  3504. // Member:       XFE_PrefsPageGeneralCache
  3505. // Description:  Constructor
  3506. // Inputs:
  3507. // Side effects: 
  3508.  
  3509. XFE_PrefsPageGeneralCache::XFE_PrefsPageGeneralCache(XFE_PrefsDialog *dialog)
  3510.     : XFE_PrefsPage(dialog),
  3511.       m_prefsDataGeneralCache(0)
  3512. {
  3513. }
  3514.  
  3515. // Member:       ~XFE_PrefsPageGeneralCache
  3516. // Description:  Destructor
  3517. // Inputs:
  3518. // Side effects: 
  3519.  
  3520. XFE_PrefsPageGeneralCache::~XFE_PrefsPageGeneralCache()
  3521. {
  3522.     delete m_prefsDataGeneralCache;
  3523. }
  3524.  
  3525. // Member:       create
  3526. // Description:  Creates page for GeneralCache
  3527. // Inputs:
  3528. // Side effects: 
  3529.  
  3530. void XFE_PrefsPageGeneralCache::create()
  3531. {
  3532.     Widget            kids[100];
  3533.     Arg               av[50];
  3534.     int               ac;
  3535.     int               i;
  3536.  
  3537.     PrefsDataGeneralCache *fep = NULL;
  3538.  
  3539.     fep = new PrefsDataGeneralCache;
  3540.     memset(fep, 0, sizeof(PrefsDataGeneralCache));
  3541.     m_prefsDataGeneralCache = fep;
  3542.  
  3543.     fep->context = getContext();
  3544.     fep->prompt_dialog = getPrefsDialog()->getDialogChrome();
  3545.  
  3546.     Widget form;
  3547.  
  3548.     ac = 0;
  3549.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
  3550.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
  3551.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  3552.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  3553.     form = XmCreateForm (m_wPageForm, "cache", av, ac);
  3554.     XtManageChild (form);
  3555.     m_wPage = fep->page = form;
  3556.  
  3557.     Widget frame1;
  3558.  
  3559.     ac = 0;
  3560.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  3561.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  3562.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
  3563.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
  3564.     frame1 = XmCreateFrame (form, "cacheFrame", av, ac);
  3565.  
  3566.     Widget form1;
  3567.  
  3568.     ac = 0;
  3569.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  3570.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  3571.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
  3572.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
  3573.     form1 = XmCreateForm (frame1, "cacheBox", av, ac);
  3574.  
  3575.     Widget cacheLabel;
  3576.  
  3577.     cacheLabel = XtVaCreateManagedWidget("cacheLabel",
  3578.                                          xmLabelGadgetClass, form1,
  3579.                                          XmNalignment, XmALIGNMENT_BEGINNING,
  3580.                                          XmNtopAttachment, XmATTACH_FORM,
  3581.                                          XmNleftAttachment, XmATTACH_FORM,
  3582.                                          XmNrightAttachment, XmATTACH_NONE,
  3583.                                          XmNbottomAttachment, XmATTACH_NONE,
  3584.                                          NULL);
  3585.  
  3586.     Widget cache_dir_label;
  3587.     Widget cache_dir_text;
  3588.     Widget browse_button;
  3589.     Widget mem_label;
  3590.     Widget mem_text;
  3591.     Widget mem_k;
  3592.     Widget disk_label;
  3593.     Widget disk_text;
  3594.     Widget disk_k;
  3595.     Widget clear_disk_button;
  3596.     Widget clear_mem_button;
  3597.  
  3598.     ac = 0;
  3599.     i = 0;
  3600.     
  3601.     kids [i++] = cache_dir_label = XmCreateLabelGadget (form1, "cacheDirLabel", av, ac);
  3602.     kids [i++] = cache_dir_text = fe_CreateTextField (form1, "cacheDirText", av, ac);
  3603.  
  3604.     kids [i++] = mem_label = XmCreateLabelGadget (form1, "memoryLabel", av, ac);
  3605.     kids [i++] = mem_text = fe_CreateTextField (form1, "memoryText", av, ac);
  3606.     kids [i++] = mem_k = XmCreateLabelGadget (form1, "memoryK", av, ac);
  3607.  
  3608.     kids [i++] = disk_label = XmCreateLabelGadget (form1, "diskLabel", av, ac);
  3609.     kids [i++] = disk_text = fe_CreateTextField (form1, "diskText", av, ac);
  3610.     kids [i++] = disk_k = XmCreateLabelGadget (form1, "diskK", av, ac);
  3611.  
  3612.     kids[i++] = browse_button =    XmCreatePushButtonGadget(form1, "browse", av, ac);
  3613.     kids[i++] = clear_mem_button =    XmCreatePushButtonGadget(form1, "clearMem", av, ac);
  3614.     kids[i++] = clear_disk_button =    XmCreatePushButtonGadget(form1, "clearDisk", av, ac);
  3615.  
  3616.     fep->cache_dir_text = cache_dir_text;
  3617.     fep->browse_button = browse_button;
  3618.     fep->mem_text = mem_text;
  3619.     fep->disk_text = disk_text;
  3620.  
  3621.     int labels_width;
  3622.     labels_width = XfeVaGetWidestWidget(cache_dir_label,
  3623.                                         mem_label,
  3624.                                         disk_label,
  3625.                                         NULL);
  3626.     int labels_height;
  3627.     labels_height = XfeVaGetTallestWidget(cache_dir_label,
  3628.                                           cache_dir_text,
  3629.                                           browse_button,
  3630.                                           NULL);
  3631.     int button_width;
  3632.     button_width = XfeVaGetWidestWidget(clear_mem_button,
  3633.                                         clear_disk_button,
  3634.                                         NULL);
  3635.  
  3636.     XtVaSetValues (disk_label,
  3637.                    XmNheight, labels_height,
  3638.                    RIGHT_JUSTIFY_VA_ARGS(disk_label,labels_width),
  3639.                    XmNtopAttachment, XmATTACH_WIDGET,
  3640.                    XmNtopWidget, cacheLabel,
  3641.                    XmNbottomAttachment, XmATTACH_NONE,
  3642.                    0);
  3643.  
  3644.     XtVaSetValues (disk_text,
  3645.                    XmNcolumns, 6,
  3646.                    XmNheight, labels_height,
  3647.                    XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  3648.                    XmNtopWidget, disk_label,
  3649.                    XmNbottomAttachment, XmATTACH_NONE,
  3650.                    XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  3651.                    XmNleftWidget, cache_dir_text,
  3652.                    XmNrightAttachment, XmATTACH_NONE,
  3653.                    0);
  3654.  
  3655.     XtVaSetValues (disk_k,
  3656.                    XmNheight, labels_height,
  3657.                    XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  3658.                    XmNtopWidget, disk_text,
  3659.                    XmNbottomAttachment, XmATTACH_NONE,
  3660.                    XmNleftAttachment, XmATTACH_WIDGET,
  3661.                    XmNleftWidget, disk_text,
  3662.                    XmNrightAttachment, XmATTACH_NONE,
  3663.                    0);
  3664.  
  3665.     XtVaSetValues (clear_disk_button,
  3666.                    XmNheight, labels_height,
  3667.                    XmNwidth, button_width,
  3668.                    XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  3669.                    XmNtopWidget, disk_k,
  3670.                    XmNbottomAttachment, XmATTACH_NONE,
  3671.                    XmNleftAttachment, XmATTACH_NONE,
  3672.                    XmNrightAttachment, XmATTACH_OPPOSITE_WIDGET,
  3673.                    XmNrightWidget, browse_button,
  3674.                    0);
  3675.  
  3676.     XtVaSetValues (mem_label,
  3677.                    XmNheight, labels_height,
  3678.                    RIGHT_JUSTIFY_VA_ARGS(mem_label,labels_width),
  3679.                    XmNtopAttachment, XmATTACH_WIDGET,
  3680.                    XmNtopWidget, disk_label,
  3681.                    XmNbottomAttachment, XmATTACH_NONE,
  3682.                    0);
  3683.  
  3684.     XtVaSetValues (mem_text,
  3685.                    XmNcolumns, 6,
  3686.                    XmNheight, labels_height,
  3687.                    XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  3688.                    XmNtopWidget, mem_label,
  3689.                    XmNbottomAttachment, XmATTACH_NONE,
  3690.                    XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  3691.                    XmNleftWidget, cache_dir_text,
  3692.                    XmNrightAttachment, XmATTACH_NONE,
  3693.                    0);
  3694.  
  3695.     XtVaSetValues (mem_k,
  3696.                    XmNheight, labels_height,
  3697.                    XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  3698.                    XmNtopWidget, mem_text,
  3699.                    XmNbottomAttachment, XmATTACH_NONE,
  3700.                    XmNleftAttachment, XmATTACH_WIDGET,
  3701.                    XmNleftWidget, mem_text,
  3702.                    XmNrightAttachment, XmATTACH_NONE,
  3703.                    0);
  3704.  
  3705.     XtVaSetValues (clear_mem_button,
  3706.                    XmNheight, labels_height,
  3707.                    XmNwidth, button_width,
  3708.                    XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  3709.                    XmNtopWidget, mem_k,
  3710.                    XmNbottomAttachment, XmATTACH_NONE,
  3711.                    XmNleftAttachment, XmATTACH_NONE,
  3712.                    XmNrightAttachment, XmATTACH_OPPOSITE_WIDGET,
  3713.                    XmNrightWidget, browse_button,
  3714.                    0);
  3715.  
  3716.     XtVaSetValues (cache_dir_label,
  3717.                    XmNheight, labels_height,
  3718.                    RIGHT_JUSTIFY_VA_ARGS(cache_dir_label, labels_width),
  3719.                    XmNtopAttachment, XmATTACH_WIDGET,
  3720.                    XmNtopWidget, mem_label,
  3721.                    XmNbottomAttachment, XmATTACH_NONE,
  3722.                    0);
  3723.  
  3724.     XtVaSetValues (cache_dir_text,
  3725.                    XmNcolumns, 25,
  3726.                    XmNheight, labels_height,
  3727.                    XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  3728.                    XmNtopWidget, cache_dir_label,
  3729.                    XmNbottomAttachment, XmATTACH_NONE,
  3730.                    XmNleftAttachment, XmATTACH_FORM,
  3731.                    XmNleftOffset, labels_width,
  3732.                    XmNrightAttachment, XmATTACH_NONE,
  3733.                    0);
  3734.  
  3735.     XtVaSetValues (browse_button,
  3736.                    XmNheight, labels_height,
  3737.                    XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  3738.                    XmNtopWidget, cache_dir_label,
  3739.                    XmNbottomAttachment, XmATTACH_NONE,
  3740.                    XmNleftAttachment, XmATTACH_WIDGET,
  3741.                    XmNleftWidget, cache_dir_text,
  3742.                    XmNrightAttachment, XmATTACH_NONE,
  3743.                    0);
  3744.  
  3745.     XtManageChildren (kids, i);
  3746.     
  3747.     // Verify
  3748.  
  3749.     Widget verifyLabel;
  3750.  
  3751.     verifyLabel = XtVaCreateManagedWidget("verifyLabel",
  3752.                                           xmLabelGadgetClass, form1,
  3753.                                           XmNtopAttachment, XmATTACH_WIDGET,
  3754.                                           XmNtopWidget, cache_dir_label,
  3755.                                           XmNtopOffset, 8,
  3756.                                           XmNleftAttachment, XmATTACH_FORM,
  3757.                                           XmNrightAttachment, XmATTACH_NONE,
  3758.                                           XmNbottomAttachment, XmATTACH_NONE,
  3759.                                           NULL);
  3760.  
  3761.     Widget verifyRc;
  3762.  
  3763.     verifyRc = XtVaCreateManagedWidget("verifyRc",
  3764.                                        xmRowColumnWidgetClass, form1,
  3765.                                        XmNradioBehavior, TRUE,
  3766.                                        XmNtopAttachment, XmATTACH_WIDGET,
  3767.                                        XmNtopWidget, verifyLabel,
  3768.                                        XmNleftAttachment, XmATTACH_FORM,
  3769.                                        XmNleftOffset, 16,
  3770.                                        XmNrightAttachment, XmATTACH_NONE,
  3771.                                        XmNbottomAttachment, XmATTACH_NONE,
  3772.                                        NULL);
  3773.  
  3774.     i = 0;
  3775.  
  3776.     ac = 0;
  3777.     XtSetArg (av [ac], XmNindicatorType, XmONE_OF_MANY); ac++;
  3778.     kids[i++] = fep->every_toggle =
  3779.         XmCreateToggleButtonGadget(verifyRc, "every", av, ac);
  3780.  
  3781.     ac = 0;
  3782.     XtSetArg (av [ac], XmNindicatorType, XmONE_OF_MANY); ac++;
  3783.     kids[i++] = fep->once_toggle =
  3784.         XmCreateToggleButtonGadget(verifyRc, "once", av, ac);
  3785.  
  3786.     ac = 0;
  3787.     XtSetArg (av [ac], XmNindicatorType, XmONE_OF_MANY); ac++;
  3788.     kids[i++] = fep->never_toggle =
  3789.         XmCreateToggleButtonGadget(verifyRc, "never", av, ac);
  3790.  
  3791.     XtManageChildren (kids, i);
  3792.  
  3793.     i = 0;
  3794.     kids[i++] = verifyRc;
  3795.     XtManageChildren (kids, i);
  3796.  
  3797.     XtAddCallback(browse_button, XmNactivateCallback, cb_browse, this);
  3798.     XtAddCallback(clear_disk_button, XmNactivateCallback, cb_clearDisk, this);
  3799.     XtAddCallback(clear_mem_button, XmNactivateCallback, cb_clearMem, this);
  3800.  
  3801.     XtManageChild(form1);
  3802.     XtManageChild(frame1);
  3803.  
  3804.     setCreated(TRUE);
  3805. }
  3806.  
  3807. // Member:       init
  3808. // Description:  Initializes page for GeneralCache
  3809. // Inputs:
  3810. // Side effects: 
  3811.  
  3812. void XFE_PrefsPageGeneralCache::init()
  3813. {
  3814.     XP_ASSERT(m_prefsDataGeneralCache);
  3815.  
  3816.     PrefsDataGeneralCache *fep = m_prefsDataGeneralCache;
  3817.     XFE_GlobalPrefs       *prefs = &fe_globalPrefs;
  3818.     Boolean               sensitive;
  3819.     
  3820.     // Cache directory, Memory cache, disk cache
  3821.  
  3822.     fe_SetTextField(fep->cache_dir_text, prefs->cache_dir);
  3823.  
  3824.     sensitive = !PREF_PrefIsLocked("browser.cache.directory");
  3825.     XtSetSensitive(fep->cache_dir_text, sensitive);
  3826.     XtSetSensitive(fep->browse_button, sensitive);
  3827.  
  3828.     char buf [255];
  3829.  
  3830.     PR_snprintf(buf, sizeof(buf), "%d", prefs->memory_cache_size);
  3831.     XtVaSetValues(fep->mem_text, XmNvalue, buf, 0);
  3832.     sensitive = !PREF_PrefIsLocked("browser.cache.memory_cache_size");
  3833.     XtSetSensitive(fep->mem_text, sensitive);
  3834.  
  3835.     PR_snprintf(buf, sizeof(buf), "%d", prefs->disk_cache_size);
  3836.     XtVaSetValues(fep->disk_text, XmNvalue, buf, 0);
  3837.     sensitive = !PREF_PrefIsLocked("browser.cache.disk_cache_size");
  3838.     XtSetSensitive(fep->disk_text, sensitive);
  3839.  
  3840.     // Verify cache
  3841.  
  3842.     XtVaSetValues(fep->once_toggle, XmNset, prefs->verify_documents == 0, 0);
  3843.     XtVaSetValues(fep->every_toggle, XmNset, prefs->verify_documents == 1, 0);
  3844.     XtVaSetValues(fep->never_toggle, XmNset, prefs->verify_documents == 2, 0);
  3845.  
  3846.     // If pref is locked, grey it out.
  3847.     sensitive = !PREF_PrefIsLocked("browser.cache.check_doc_frequency");
  3848.     XtSetSensitive(fep->once_toggle, sensitive);
  3849.     XtSetSensitive(fep->every_toggle, sensitive);
  3850.     XtSetSensitive(fep->never_toggle, sensitive);
  3851.  
  3852.     setInitialized(TRUE);
  3853. }
  3854.  
  3855. // Member:       install
  3856. // Description:  
  3857. // Inputs:
  3858. // Side effects: 
  3859.  
  3860. void XFE_PrefsPageGeneralCache::install()
  3861. {
  3862.     fe_installGeneralCache();
  3863. }
  3864.  
  3865. // Member:       save
  3866. // Description:  
  3867. // Inputs:
  3868. // Side effects: 
  3869.  
  3870. void XFE_PrefsPageGeneralCache::save()
  3871. {
  3872.     PrefsDataGeneralCache *fep = m_prefsDataGeneralCache;
  3873.     Boolean                b;
  3874.  
  3875.     XP_ASSERT(fep);
  3876.  
  3877.     char *text;
  3878.     char  dummy;
  3879.     int   size = 0;
  3880.     char *s = 0;
  3881.  
  3882.     XP_FREEIF(fe_globalPrefs.cache_dir);
  3883.     s = fe_GetTextField(fep->cache_dir_text);
  3884.     fe_globalPrefs.cache_dir = s ? s : XP_STRDUP("");
  3885.  
  3886.     // Memory cache
  3887.  
  3888.     text = 0;
  3889.     XtVaGetValues(fep->mem_text, XmNvalue, &text, 0);
  3890.     if (1 == sscanf (text, " %d %c", &size, &dummy) &&
  3891.         size >= 0)
  3892.         fe_globalPrefs.memory_cache_size = size;
  3893.     if (text) XtFree(text);
  3894.  
  3895.     // Disk cache
  3896.  
  3897.     text = 0;
  3898.     XtVaGetValues(fep->disk_text, XmNvalue, &text, 0);
  3899.     if (1 == sscanf (text, " %d %c", &size, &dummy) &&
  3900.         size >= 0)
  3901.         fe_globalPrefs.disk_cache_size = size;
  3902.     if (text) XtFree(text);
  3903.  
  3904.     // Verify document in cache
  3905.  
  3906.     XtVaGetValues(fep->once_toggle, XmNset, &b, 0);
  3907.     if (b) fe_globalPrefs.verify_documents = 0;
  3908.     XtVaGetValues(fep->every_toggle, XmNset, &b, 0);
  3909.     if (b) fe_globalPrefs.verify_documents = 1;
  3910.     XtVaGetValues(fep->never_toggle, XmNset, &b, 0);
  3911.     if (b) fe_globalPrefs.verify_documents = 2;
  3912.   
  3913.     // Install preferences
  3914.  
  3915.     install();
  3916. }
  3917.  
  3918. // Member:       getData
  3919. // Description:  
  3920. // Inputs:
  3921. // Side effects: 
  3922.  
  3923. PrefsDataGeneralCache *XFE_PrefsPageGeneralCache::getData()
  3924. {
  3925.     return m_prefsDataGeneralCache;
  3926. }
  3927.  
  3928. // Member:       cb_browse
  3929. // Description:  
  3930. // Inputs:
  3931. // Side effects: 
  3932.  
  3933. void XFE_PrefsPageGeneralCache::cb_browse(Widget    /* w */,
  3934.                                           XtPointer closure,
  3935.                                           XtPointer /* callData */)
  3936. {
  3937.     XFE_PrefsPageGeneralCache    *thePage = (XFE_PrefsPageGeneralCache *)closure;
  3938.     XFE_PrefsDialog              *theDialog = thePage->getPrefsDialog();
  3939.     PrefsDataGeneralCache        *fep = thePage->getData();
  3940.  
  3941.     fe_browse_file_of_text(theDialog->getContext(), fep->cache_dir_text, True);
  3942. }
  3943.  
  3944. // Member:       cb_browse
  3945. // Description:  
  3946. // Inputs:
  3947. // Side effects: 
  3948.  
  3949. void XFE_PrefsPageGeneralCache::cb_clearDisk(Widget    /* w */,
  3950.                                              XtPointer closure,
  3951.                                              XtPointer /* callData */)
  3952. {
  3953.     XFE_PrefsPageGeneralCache    *thePage = (XFE_PrefsPageGeneralCache *)closure;
  3954.     XFE_PrefsDialog              *theDialog = thePage->getPrefsDialog();
  3955.     MWContext                    *context = theDialog->getContext();
  3956.     int32                         size;
  3957.  
  3958.     if (XFE_Confirm (context, fe_globalData.clear_disk_cache_message))    {
  3959.         PREF_GetIntPref("browser.cache.disk_cache_size", &size);
  3960.         PREF_SetIntPref("browser.cache.disk_cache_size", 0);
  3961.         PREF_SetIntPref("browser.cache.disk_cache_size", size);
  3962.     }
  3963. }
  3964.  
  3965. // Member:       cb_clearMem
  3966. // Description:  
  3967. // Inputs:
  3968. // Side effects: 
  3969.  
  3970. void XFE_PrefsPageGeneralCache::cb_clearMem(Widget    /* w */,
  3971.                                             XtPointer closure,
  3972.                                             XtPointer /* callData */)
  3973. {
  3974.     XFE_PrefsPageGeneralCache    *thePage = (XFE_PrefsPageGeneralCache *)closure;
  3975.     XFE_PrefsDialog              *theDialog = thePage->getPrefsDialog();
  3976.     MWContext                    *context = theDialog->getContext();
  3977.     int32                         size;
  3978.  
  3979.     if (XFE_Confirm (context, fe_globalData.clear_mem_cache_message)) {
  3980.         PREF_GetIntPref("browser.cache.memory_cache_size", &size);
  3981.         PREF_SetIntPref("browser.cache.memory_cache_size", 0);
  3982.         PREF_SetIntPref("browser.cache.memory_cache_size", size);
  3983.     }
  3984. }
  3985.  
  3986. // ************************************************************************
  3987. // *************************    General/Proxies   *************************
  3988. // ************************************************************************
  3989.  
  3990. // Member:       XFE_PrefsPageGeneralProxies
  3991. // Description:  Constructor
  3992. // Inputs:
  3993. // Side effects: 
  3994.  
  3995. XFE_PrefsPageGeneralProxies::XFE_PrefsPageGeneralProxies(XFE_PrefsDialog *dialog)
  3996.     : XFE_PrefsPage(dialog),
  3997.       m_prefsDataGeneralProxies(0)
  3998. {
  3999. }
  4000.  
  4001. // Member:       ~XFE_PrefsPageGeneralProxies
  4002. // Description:  Destructor
  4003. // Inputs:
  4004. // Side effects: 
  4005.  
  4006. XFE_PrefsPageGeneralProxies::~XFE_PrefsPageGeneralProxies()
  4007. {
  4008.     delete m_prefsDataGeneralProxies;
  4009. }
  4010.  
  4011. // Member:       create
  4012. // Description:  Creates page for GeneralProxies
  4013. // Inputs:
  4014. // Side effects: 
  4015.  
  4016. void XFE_PrefsPageGeneralProxies::create()
  4017. {
  4018.     Widget            kids[100];
  4019.     Arg               av[50];
  4020.     int               ac;
  4021.     int               i;
  4022.  
  4023.     PrefsDataGeneralProxies *fep = NULL;
  4024.  
  4025.     fep = new PrefsDataGeneralProxies;
  4026.     memset(fep, 0, sizeof(PrefsDataGeneralProxies));
  4027.     m_prefsDataGeneralProxies = fep;
  4028.  
  4029.     fep->context = getContext();
  4030.     fep->prompt_dialog = getPrefsDialog()->getDialogChrome();
  4031.  
  4032.     Widget form;
  4033.  
  4034.     ac = 0;
  4035.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
  4036.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
  4037.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  4038.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  4039.     form = XmCreateForm (m_wPageForm, "proxies", av, ac);
  4040.     XtManageChild (form);
  4041.     m_wPage = fep->page = form;
  4042.  
  4043.     Widget frame1;
  4044.  
  4045.     ac = 0;
  4046.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  4047.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  4048.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
  4049.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
  4050.     frame1 = XmCreateFrame (form, "proxiesFrame", av, ac);
  4051.  
  4052.     Widget form1;
  4053.  
  4054.     ac = 0;
  4055.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  4056.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  4057.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
  4058.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
  4059.     form1 = XmCreateForm (frame1, "proxiesBox", av, ac);
  4060.  
  4061.     Widget proxiesLabel;
  4062.  
  4063.     proxiesLabel = XtVaCreateManagedWidget("proxiesLabel",
  4064.                                            xmLabelGadgetClass, form1,
  4065.                                            XmNalignment, XmALIGNMENT_BEGINNING,
  4066.                                            XmNtopAttachment, XmATTACH_FORM,
  4067.                                            XmNleftAttachment, XmATTACH_FORM,
  4068.                                            XmNrightAttachment, XmATTACH_NONE,
  4069.                                            XmNbottomAttachment, XmATTACH_NONE,
  4070.                                            NULL);
  4071.  
  4072.     ac = 0;
  4073.     i = 0;
  4074.  
  4075.     kids[i++] = fep->direct_toggle =
  4076.         XmCreateToggleButtonGadget(form1, "direct", av, ac);
  4077.  
  4078.     kids[i++] = fep->manual_toggle =
  4079.         XmCreateToggleButtonGadget(form1, "manual", av, ac);
  4080.  
  4081.     kids[i++] = fep->auto_toggle =
  4082.         XmCreateToggleButtonGadget(form1, "auto", av, ac);
  4083.  
  4084.     Widget config_label;
  4085.     kids[i++] = config_label =
  4086.         XmCreateLabelGadget(form1, "config", av, ac);
  4087.  
  4088.     kids[i++] = fep->config_url_text =
  4089.         fe_CreateTextField (form1, "configUrl", av, ac);
  4090.  
  4091.     kids[i++] = fep->view_button =
  4092.         XmCreatePushButtonGadget(form1, "view", av, ac);
  4093.  
  4094.     kids[i++] = fep->reload_button =
  4095.         XmCreatePushButtonGadget(form1, "reload", av, ac);
  4096.  
  4097.     XtVaSetValues(fep->direct_toggle,
  4098.                   XmNindicatorType, XmONE_OF_MANY,
  4099.                   XmNtopAttachment, XmATTACH_WIDGET,
  4100.                   XmNtopWidget, proxiesLabel,
  4101.                   XmNtopOffset, 4,
  4102.                   XmNleftAttachment, XmATTACH_FORM,
  4103.                   XmNleftOffset, 16,
  4104.                   XmNrightAttachment, XmATTACH_NONE,
  4105.                   XmNbottomAttachment, XmATTACH_NONE,
  4106.                   NULL);
  4107.  
  4108.     XtVaSetValues(fep->manual_toggle,
  4109.                   XmNindicatorType, XmONE_OF_MANY,
  4110.                   XmNtopAttachment, XmATTACH_WIDGET,
  4111.                   XmNtopWidget, fep->direct_toggle,
  4112.                   XmNtopOffset, 4,
  4113.                   XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  4114.                   XmNleftWidget, fep->direct_toggle,
  4115.                   XmNrightAttachment, XmATTACH_NONE,
  4116.                   XmNbottomAttachment, XmATTACH_NONE,
  4117.                   NULL);
  4118.  
  4119.     XtVaSetValues(fep->auto_toggle,
  4120.                   XmNindicatorType, XmONE_OF_MANY,
  4121.                   XmNtopAttachment, XmATTACH_WIDGET,
  4122.                   XmNtopWidget, fep->manual_toggle,
  4123.                   XmNtopOffset, 4,
  4124.                   XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  4125.                   XmNleftWidget, fep->direct_toggle,
  4126.                   XmNrightAttachment, XmATTACH_NONE,
  4127.                   XmNbottomAttachment, XmATTACH_NONE,
  4128.                   NULL);
  4129.  
  4130.     Dimension  indicator_size;
  4131.     Dimension  spacing;
  4132.  
  4133.     XtVaGetValues(fep->auto_toggle,
  4134.                   XmNindicatorSize, &indicator_size,
  4135.                   XmNspacing, &spacing,
  4136.                   NULL);
  4137.  
  4138.     int labels_height;
  4139.     labels_height = XfeVaGetTallestWidget(fep->config_url_text,
  4140.                                           config_label,
  4141.                                           NULL);
  4142.  
  4143.     XtVaSetValues(config_label,
  4144.                   XmNheight, labels_height,
  4145.                   XmNtopAttachment, XmATTACH_WIDGET,
  4146.                   XmNtopWidget, fep->auto_toggle,
  4147.                   XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  4148.                   XmNleftWidget, fep->direct_toggle,
  4149.                   XmNleftOffset, indicator_size+spacing,
  4150.                   XmNrightAttachment, XmATTACH_NONE,
  4151.                   XmNbottomAttachment, XmATTACH_NONE,
  4152.                   NULL);
  4153.  
  4154.     XtVaSetValues(fep->config_url_text,
  4155.                   XmNcolumns, 25,
  4156.                   XmNheight, labels_height,
  4157.                   XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  4158.                   XmNtopWidget, config_label,
  4159.                   XmNleftAttachment, XmATTACH_WIDGET,
  4160.                   XmNleftWidget, config_label,
  4161.                   XmNrightAttachment, XmATTACH_NONE,
  4162.                   XmNbottomAttachment, XmATTACH_NONE,
  4163.                   NULL);
  4164.  
  4165.     XtVaSetValues(fep->view_button,
  4166.                   XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  4167.                   XmNtopWidget, fep->manual_toggle,
  4168.                   XmNleftAttachment, XmATTACH_WIDGET,
  4169.                   XmNleftWidget, fep->manual_toggle,
  4170.                   XmNleftOffset, 8,
  4171.                   XmNrightAttachment, XmATTACH_NONE,
  4172.                   XmNbottomAttachment, XmATTACH_NONE,
  4173.                   NULL);
  4174.  
  4175.     XtVaSetValues(fep->reload_button,
  4176.                   XmNtopAttachment, XmATTACH_WIDGET,
  4177.                   XmNtopWidget, fep->config_url_text,
  4178.                   XmNleftAttachment, XmATTACH_NONE,
  4179.                   XmNrightAttachment, XmATTACH_OPPOSITE_WIDGET,
  4180.                   XmNrightWidget, fep->config_url_text,
  4181.                   XmNbottomAttachment, XmATTACH_NONE,
  4182.                   NULL);
  4183.  
  4184.     XtAddCallback(fep->direct_toggle, XmNvalueChangedCallback,
  4185.                   cb_setProxies, fep);
  4186.     XtAddCallback(fep->manual_toggle, XmNvalueChangedCallback,
  4187.                   cb_setProxies, fep);
  4188.     XtAddCallback(fep->auto_toggle, XmNvalueChangedCallback,
  4189.                   cb_setProxies, fep);
  4190.  
  4191.     XtAddCallback(fep->view_button, XmNactivateCallback, cb_viewProxies, this);
  4192.     XtAddCallback(fep->reload_button, XmNactivateCallback, cb_reloadProxies, this);
  4193.  
  4194.     XtManageChildren (kids, i);
  4195.     XtManageChild(form1);
  4196.     XtManageChild(frame1);
  4197.  
  4198.     setCreated(TRUE);
  4199. }
  4200.  
  4201. // Member:       init
  4202. // Description:  Initializes page for GeneralProxies
  4203. // Inputs:
  4204. // Side effects: 
  4205.  
  4206. void XFE_PrefsPageGeneralProxies::init()
  4207. {
  4208.     XP_ASSERT(m_prefsDataGeneralProxies);
  4209.  
  4210.     PrefsDataGeneralProxies *fep = m_prefsDataGeneralProxies;
  4211.     XFE_GlobalPrefs         *prefs = &fe_globalPrefs;
  4212.     int                      state =  prefs->proxy_mode;
  4213.     Boolean                  sensitive;
  4214.     
  4215.     sensitive = !PREF_PrefIsLocked("network.proxy.type");
  4216.     XtVaSetValues(fep->direct_toggle, 
  4217.                   XmNset, ((state == PROXY_STYLE_UNSET) || 
  4218.                                     (state == PROXY_STYLE_NONE)), 
  4219.                   XmNsensitive, sensitive,
  4220.                   0);
  4221.     XtVaSetValues(fep->manual_toggle, 
  4222.                   XmNset, (state == PROXY_STYLE_MANUAL), 
  4223.                   XmNsensitive, sensitive,
  4224.                   0);
  4225.     XtVaSetValues(fep->view_button,  XmNsensitive, 
  4226.                                 (state == PROXY_STYLE_MANUAL), 0);
  4227.     XtVaSetValues(fep->auto_toggle, 
  4228.                   XmNset, (state == PROXY_STYLE_AUTOMATIC), 
  4229.                   XmNsensitive, sensitive,
  4230.                   0);
  4231.     fe_SetTextField(fep->config_url_text, prefs->proxy_url);
  4232.  
  4233.     sensitive = !PREF_PrefIsLocked("network.proxy.autoconfig_url");
  4234.     XtVaSetValues(fep->config_url_text, 
  4235.                   XmNsensitive, (state==PROXY_STYLE_AUTOMATIC) && sensitive, 0);
  4236.     XtVaSetValues(fep->reload_button, XmNsensitive, 
  4237.                                 (state==PROXY_STYLE_AUTOMATIC), 0);
  4238.  
  4239.     setInitialized(TRUE);
  4240. }
  4241.  
  4242. // Member:       install
  4243. // Description:  
  4244. // Inputs:
  4245. // Side effects: 
  4246.  
  4247. void XFE_PrefsPageGeneralProxies::install()
  4248. {
  4249.     fe_installGeneralProxies();
  4250. }
  4251.  
  4252. // Member:       save
  4253. // Description:  
  4254. // Inputs:
  4255. // Side effects: 
  4256.  
  4257. void XFE_PrefsPageGeneralProxies::save()
  4258. {
  4259.     PrefsDataGeneralProxies *fep = m_prefsDataGeneralProxies;
  4260.  
  4261.     XP_ASSERT(fep);
  4262.  
  4263.     XP_FREEIF(fe_globalPrefs.proxy_url);
  4264.     char *s1 = fe_GetTextField(fep->config_url_text);
  4265.     fe_globalPrefs.proxy_url = s1 ? s1 : XP_STRDUP("");
  4266.     if (*s1) {
  4267.         NET_SetProxyServer(PROXY_AUTOCONF_URL, (const char *)s1);
  4268.     }
  4269.  
  4270.     Boolean b;
  4271.  
  4272.     XtVaGetValues(fep->direct_toggle, XmNset, &b, 0);
  4273.     if (b) {
  4274.         NET_SelectProxyStyle(PROXY_STYLE_NONE);
  4275.         fe_globalPrefs.proxy_mode = PROXY_STYLE_NONE;
  4276.     }
  4277.  
  4278.     XtVaGetValues(fep->manual_toggle, XmNset, &b, 0);
  4279.     if (b) {
  4280.         NET_SelectProxyStyle(PROXY_STYLE_MANUAL);
  4281.         fe_globalPrefs.proxy_mode = PROXY_STYLE_MANUAL;
  4282.     }
  4283.  
  4284.     XtVaGetValues(fep->auto_toggle, XmNset, &b, 0);
  4285.     if (b) {
  4286.         NET_SelectProxyStyle(PROXY_STYLE_AUTOMATIC);
  4287.         fe_globalPrefs.proxy_mode = PROXY_STYLE_AUTOMATIC;
  4288.     }
  4289.  
  4290.     // Install preferences
  4291.  
  4292.     install();
  4293. }
  4294.  
  4295. // Member:       getData
  4296. // Description:  
  4297. // Inputs:
  4298. // Side effects: 
  4299.  
  4300. PrefsDataGeneralProxies *XFE_PrefsPageGeneralProxies::getData()
  4301. {
  4302.     return m_prefsDataGeneralProxies;
  4303. }
  4304.  
  4305. // Member:       cb_setProxies
  4306. // Description:  
  4307. // Inputs:
  4308. // Side effects: 
  4309.  
  4310. void XFE_PrefsPageGeneralProxies::cb_setProxies(Widget    w,
  4311.                                                 XtPointer closure,
  4312.                                                 XtPointer callData)
  4313. {
  4314.     PrefsDataGeneralProxies      *fep = (PrefsDataGeneralProxies *)closure;
  4315.     XmToggleButtonCallbackStruct *cb = (XmToggleButtonCallbackStruct *)callData;
  4316.  
  4317.     if (! cb->set) {
  4318.         XtVaSetValues(w, XmNset, True, 0);
  4319.     }
  4320.     else if (w == fep->direct_toggle){
  4321.         XtVaSetValues(fep->manual_toggle, XmNset, False, 0);
  4322.         XtVaSetValues(fep->auto_toggle, XmNset, False, 0);
  4323.         XtVaSetValues(fep->config_url_text, XmNsensitive, False, 0);
  4324.         XtVaSetValues(fep->view_button, XmNsensitive, False, 0);
  4325.         XtVaSetValues(fep->reload_button, XmNsensitive, False, 0);
  4326.     }
  4327.     else if (w == fep->manual_toggle){
  4328.         XtVaSetValues(fep->direct_toggle, XmNset, False, 0);
  4329.         XtVaSetValues(fep->auto_toggle, XmNset, False, 0);
  4330.         XtVaSetValues(fep->view_button, XmNsensitive, True, 0);
  4331.         XtVaSetValues(fep->config_url_text, XmNsensitive, False, 0);
  4332.         XtVaSetValues(fep->reload_button, XmNsensitive, False, 0);
  4333.     }
  4334.     else if (w == fep->auto_toggle){
  4335.         XtVaSetValues(fep->direct_toggle, XmNset, False, 0);
  4336.         XtVaSetValues(fep->manual_toggle, XmNset, False, 0);
  4337.         XtVaSetValues(fep->view_button, XmNsensitive, False, 0);
  4338.         XtVaSetValues(fep->config_url_text, 
  4339.                       XmNsensitive, !PREF_PrefIsLocked("network.proxy.autoconfig_url"), 
  4340.                       0);
  4341.         XtVaSetValues(fep->reload_button, XmNsensitive, True, 0);
  4342.     }
  4343.     else
  4344.         abort();
  4345. }
  4346.  
  4347. // Member:       cb_viewProxies
  4348. // Description:  
  4349. // Inputs:
  4350. // Side effects: 
  4351.  
  4352. void XFE_PrefsPageGeneralProxies::cb_viewProxies(Widget    /* w */,
  4353.                                                  XtPointer closure,
  4354.                                                  XtPointer /* callData */)
  4355. {
  4356.     XFE_PrefsPageGeneralProxies *thePage = (XFE_PrefsPageGeneralProxies *)closure;
  4357.     XFE_PrefsDialog             *theDialog = thePage->getPrefsDialog();
  4358.     Widget                       mainw = theDialog->getBaseWidget();
  4359.  
  4360.     //    while (!XtIsWMShell(mainw) && (XtParent(mainw)!=0))
  4361.     //        mainw = XtParent(mainw);
  4362.  
  4363.     // Instantiate a view proxies dialog
  4364.  
  4365.     XFE_PrefsProxiesViewDialog *theViewDialog = 0;
  4366.  
  4367.     if ((theViewDialog =
  4368.          new XFE_PrefsProxiesViewDialog(theDialog, mainw, "prefsProxiesView")) == 0) {
  4369.         fe_perror(thePage->getContext(), XP_GetString(XFE_OUT_OF_MEMORY_URL));
  4370.         return;
  4371.     }
  4372.  
  4373.     // Initialize and pop up the view dialog
  4374.  
  4375.     theViewDialog->initPage();
  4376.     theViewDialog->show();
  4377. }
  4378.  
  4379. // Member:       cb_reloadProxies
  4380. // Description:  
  4381. // Inputs:
  4382. // Side effects: 
  4383.  
  4384. void XFE_PrefsPageGeneralProxies::cb_reloadProxies(Widget    /* w */,
  4385.                                                    XtPointer closure,
  4386.                                                    XtPointer /* callData */)
  4387. {
  4388.     XFE_PrefsPageGeneralProxies *thePage = (XFE_PrefsPageGeneralProxies *)closure;
  4389.     XFE_PrefsDialog             *theDialog = thePage->getPrefsDialog();
  4390.     PrefsDataGeneralProxies     *fep = thePage->getData();
  4391.     char                        *s1 = 0;
  4392.  
  4393.     s1 = fe_GetTextField(fep->config_url_text);
  4394.     if (s1 && *s1) {
  4395.         NET_SetProxyServer(PROXY_AUTOCONF_URL, s1);
  4396.         // fe_globalPrefs.proxy_url = XP_STRDUP(s1);
  4397.      }
  4398.     if (s1) XtFree(s1);
  4399.     NET_ReloadProxyConfig(theDialog->getContext());
  4400. }
  4401.  
  4402. // ************************************************************************
  4403. // ************************  Advanced/DiskSpace   *************************
  4404. // ************************************************************************
  4405.  
  4406. // Member:       XFE_PrefsPageDiskSpace
  4407. // Description:  Constructor
  4408. // Inputs:
  4409. // Side effects: 
  4410.  
  4411. XFE_PrefsPageDiskSpace::XFE_PrefsPageDiskSpace(XFE_PrefsDialog *dialog)
  4412.     : XFE_PrefsPage(dialog),
  4413.       m_prefsDataDiskSpace(0)
  4414. {
  4415. }
  4416.  
  4417. // Member:       ~XFE_PrefsPageDiskSpace
  4418. // Description:  Destructor
  4419. // Inputs:
  4420. // Side effects: 
  4421.  
  4422. XFE_PrefsPageDiskSpace::~XFE_PrefsPageDiskSpace()
  4423. {
  4424.     delete m_prefsDataDiskSpace;
  4425. }
  4426.  
  4427. // Member:       create
  4428. // Description:  Creates page for DiskSpace
  4429. // Inputs:
  4430. // Side effects: 
  4431.  
  4432. void XFE_PrefsPageDiskSpace::create()
  4433. {
  4434.     Widget            kids[100];
  4435.     Arg               av[50];
  4436.     int               ac;
  4437.     int               i;
  4438.  
  4439.     PrefsDataDiskSpace *fep = NULL;
  4440.  
  4441.     fep = new PrefsDataDiskSpace;
  4442.     memset(fep, 0, sizeof(PrefsDataDiskSpace));
  4443.     m_prefsDataDiskSpace = fep;
  4444.  
  4445.     fep->context = getContext();
  4446.     fep->prompt_dialog = getPrefsDialog()->getDialogChrome();
  4447.  
  4448.     Widget form;
  4449.  
  4450.     ac = 0;
  4451.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
  4452.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
  4453.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  4454.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  4455.     form = XmCreateForm (m_wPageForm, "diskSpace", av, ac);
  4456.     XtManageChild (form);
  4457.     m_wPage = fep->page = form;
  4458.  
  4459.     // All messages
  4460.  
  4461.     Widget frame1;
  4462.  
  4463.     ac = 0;
  4464.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  4465.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  4466.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
  4467.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
  4468.     frame1 = XmCreateFrame (form, "allMsgsFrame", av, ac);
  4469.  
  4470.     Widget form1;
  4471.  
  4472.     ac = 0;
  4473.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  4474.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  4475.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
  4476.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
  4477.     form1 = XmCreateForm (frame1, "allMsgsBox", av, ac);
  4478.  
  4479.     Widget label1;
  4480.     Widget max_msg_size_toggle;
  4481.     Widget max_msg_size_text;
  4482.     Widget k_label;
  4483.     Widget ask_threshold_toggle;
  4484.     Widget threshold_text;
  4485.     Widget k_label2;
  4486.  
  4487.     ac = 0;
  4488.     XtSetArg (av [ac], XmNchildType, XmFRAME_TITLE_CHILD); ac++;
  4489.     label1 = XmCreateLabelGadget (frame1, "allMsgsBoxLabel", av, ac);
  4490.  
  4491.     ac = 0;
  4492.     i = 0;
  4493.  
  4494.     kids[i++] = max_msg_size_toggle =
  4495.         XmCreateToggleButtonGadget (form1, "maxMsgSize", av, ac);
  4496.  
  4497.     kids[i++] = max_msg_size_text = fe_CreateTextField (form1, "msgSize", av, ac);
  4498.  
  4499.     kids[i++] = k_label = XmCreateLabelGadget(form1, "k", av, ac);
  4500.  
  4501.     kids[i++] = ask_threshold_toggle =
  4502.         XmCreateToggleButtonGadget (form1, "askThreshold", av, ac);
  4503.  
  4504.     kids[i++] = threshold_text = fe_CreateTextField (form1, "threshold", av, ac);
  4505.  
  4506.     kids[i++] = k_label2 = XmCreateLabelGadget(form1, "k2", av, ac);
  4507.  
  4508.     fep->max_msg_size_toggle = max_msg_size_toggle;
  4509.     fep->max_msg_size_text = max_msg_size_text;
  4510.     fep->ask_threshold_toggle = ask_threshold_toggle;
  4511.     fep->threshold_text = threshold_text;
  4512.  
  4513.     int labels_height;
  4514.     labels_height = XfeVaGetTallestWidget(max_msg_size_toggle,
  4515.                                           max_msg_size_text,
  4516.                                           k_label,
  4517.                                           NULL);
  4518.     
  4519.     XtVaSetValues (max_msg_size_toggle,
  4520.                    XmNindicatorType, XmN_OF_MANY,
  4521.                    XmNheight, labels_height,
  4522.                    XmNtopAttachment, XmATTACH_FORM,
  4523.                    XmNleftAttachment, XmATTACH_FORM,
  4524.                    XmNbottomAttachment, XmATTACH_NONE,
  4525.                    XmNrightAttachment, XmATTACH_NONE,
  4526.                    0);
  4527.  
  4528.     XtVaSetValues (max_msg_size_text,
  4529.                    XmNcolumns, 6,
  4530.                    XmNheight, labels_height,
  4531.                    XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  4532.                    XmNtopWidget, max_msg_size_toggle,
  4533.                    XmNbottomAttachment, XmATTACH_NONE,
  4534.                    XmNleftAttachment, XmATTACH_WIDGET,
  4535.                    XmNleftWidget, max_msg_size_toggle,
  4536.                    XmNrightAttachment, XmATTACH_NONE,
  4537.                    0);
  4538.  
  4539.     XtVaSetValues (k_label,
  4540.                    XmNheight, labels_height,
  4541.                    XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  4542.                    XmNtopWidget, max_msg_size_toggle,
  4543.                    XmNbottomAttachment, XmATTACH_NONE,
  4544.                    XmNleftAttachment, XmATTACH_WIDGET,
  4545.                    XmNleftWidget, max_msg_size_text,
  4546.                    XmNrightAttachment, XmATTACH_NONE,
  4547.                    0);
  4548.  
  4549.     XtVaSetValues (ask_threshold_toggle,
  4550.                    XmNindicatorType, XmN_OF_MANY,
  4551.                    XmNheight, labels_height,
  4552.                    XmNtopAttachment, XmATTACH_WIDGET,
  4553.                    XmNtopWidget, max_msg_size_toggle,
  4554.                    XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  4555.                    XmNleftWidget, max_msg_size_toggle,
  4556.                    XmNbottomAttachment, XmATTACH_NONE,
  4557.                    XmNrightAttachment, XmATTACH_NONE,
  4558.                    0);
  4559.  
  4560.     XtVaSetValues (threshold_text,
  4561.                    XmNcolumns, 6,
  4562.                    XmNheight, labels_height,
  4563.                    XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  4564.                    XmNtopWidget, ask_threshold_toggle,
  4565.                    XmNbottomAttachment, XmATTACH_NONE,
  4566.                    XmNleftAttachment, XmATTACH_WIDGET,
  4567.                    XmNleftWidget, ask_threshold_toggle,
  4568.                    XmNrightAttachment, XmATTACH_NONE,
  4569.                    0);
  4570.  
  4571.     XtVaSetValues (k_label2,
  4572.                    XmNheight, labels_height,
  4573.                    XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  4574.                    XmNtopWidget, ask_threshold_toggle,
  4575.                    XmNbottomAttachment, XmATTACH_NONE,
  4576.                    XmNleftAttachment, XmATTACH_WIDGET,
  4577.                    XmNleftWidget, threshold_text,
  4578.                    XmNrightAttachment, XmATTACH_NONE,
  4579.                    0);
  4580.  
  4581.     XtManageChildren (kids, i);
  4582.     XtManageChild (label1);
  4583.     XtManageChild (form1);
  4584.     XtManageChild(frame1);
  4585.  
  4586.     // News Messages Only
  4587.  
  4588.     Widget frame2;
  4589.  
  4590.     ac = 0;
  4591.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
  4592.     XtSetArg (av [ac], XmNtopWidget, frame1); ac++;
  4593.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  4594.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  4595.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
  4596.     frame2 = XmCreateFrame (form, "newsMsgsFrame", av, ac);
  4597.  
  4598.     Widget form2;
  4599.  
  4600.     ac = 0;
  4601.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  4602.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  4603.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
  4604.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
  4605.     form2 = XmCreateForm (frame2, "newsMsgsBox", av, ac);
  4606.  
  4607.     Widget label2;
  4608.     Widget news_msgs_label;
  4609.     Widget keep_news_by_age_toggle;
  4610.     Widget keep_all_news_toggle;
  4611.     Widget keep_news_by_count_toggle;
  4612.     Widget keep_news_days_text;
  4613.     Widget keep_news_count_text;
  4614.     Widget keep_unread_news_toggle;
  4615.     Widget days_label;
  4616.     Widget msgs_label;
  4617.  
  4618.     ac = 0;
  4619.     XtSetArg (av [ac], XmNchildType, XmFRAME_TITLE_CHILD); ac++;
  4620.     label2 = XmCreateLabelGadget (frame2, "newsMsgsBoxLabel", av, ac);
  4621.  
  4622.     ac = 0;
  4623.     i = 0;
  4624.  
  4625.     kids[i++] = news_msgs_label = XmCreateLabelGadget (form2, "newsMsgsLabel", av, ac);
  4626.  
  4627.     kids[i++] = keep_news_by_age_toggle = 
  4628.         XmCreateToggleButtonGadget(form2, "keepNewsByAge", av, ac);
  4629.  
  4630.     kids[i++] = keep_all_news_toggle = 
  4631.         XmCreateToggleButtonGadget(form2, "keepAllNews", av, ac);
  4632.  
  4633.     kids[i++] = keep_news_by_count_toggle = 
  4634.         XmCreateToggleButtonGadget(form2, "keepNewsByCount", av, ac);
  4635.  
  4636.     kids[i++] = keep_unread_news_toggle = 
  4637.         XmCreateToggleButtonGadget(form2, "keepUnreadNews", av, ac);
  4638.  
  4639.     kids[i++] = keep_news_days_text = fe_CreateTextField (form2, "numDays", av, ac);
  4640.  
  4641.     kids[i++] = keep_news_count_text = fe_CreateTextField (form2, "numMsgs", av, ac);
  4642.  
  4643.     kids[i++] = days_label = XmCreateLabelGadget (form2, "daysLabel", av, ac);
  4644.  
  4645.     kids[i++] = msgs_label = XmCreateLabelGadget (form2, "msgsLabel", av, ac);
  4646.  
  4647.     fep->keep_all_news_toggle = keep_all_news_toggle;
  4648.     fep->keep_news_by_age_toggle = keep_news_by_age_toggle;
  4649.     fep->keep_news_by_count_toggle = keep_news_by_count_toggle;
  4650.     fep->keep_news_days_text = keep_news_days_text;
  4651.     fep->keep_news_count_text = keep_news_count_text;
  4652.     fep->keep_unread_news_toggle = keep_unread_news_toggle;
  4653.  
  4654.     labels_height = XfeVaGetTallestWidget(keep_news_by_age_toggle,
  4655.                                           keep_news_days_text,
  4656.                                           days_label,
  4657.                                           NULL);
  4658.     
  4659.     XtVaSetValues (news_msgs_label,
  4660.                    XmNtopAttachment, XmATTACH_FORM,
  4661.                    XmNleftAttachment, XmATTACH_FORM,
  4662.                    XmNbottomAttachment, XmATTACH_NONE,
  4663.                    XmNrightAttachment, XmATTACH_NONE,
  4664.                    0);
  4665.  
  4666.     XtVaSetValues (keep_news_by_age_toggle,
  4667.                    XmNindicatorType, XmONE_OF_MANY,
  4668.                    XmNheight, labels_height,
  4669.                    XmNtopAttachment, XmATTACH_WIDGET,
  4670.                    XmNtopWidget, news_msgs_label,
  4671.                    XmNbottomAttachment, XmATTACH_NONE,
  4672.                    XmNleftAttachment, XmATTACH_FORM,
  4673.                    XmNleftOffset, 16,
  4674.                    XmNrightAttachment, XmATTACH_NONE,
  4675.                    0);
  4676.  
  4677.     XtVaSetValues (keep_all_news_toggle,
  4678.                    XmNindicatorType, XmONE_OF_MANY,
  4679.                    XmNheight, labels_height,
  4680.                    XmNtopAttachment, XmATTACH_WIDGET,
  4681.                    XmNtopWidget, keep_news_by_age_toggle,
  4682.                    XmNbottomAttachment, XmATTACH_NONE,
  4683.                    XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  4684.                    XmNleftWidget, keep_news_by_age_toggle,
  4685.                    XmNrightAttachment, XmATTACH_NONE,
  4686.                    0);
  4687.  
  4688.     XtVaSetValues (keep_news_by_count_toggle,
  4689.                    XmNindicatorType, XmONE_OF_MANY,
  4690.                    XmNheight, labels_height,
  4691.                    XmNtopAttachment, XmATTACH_WIDGET,
  4692.                    XmNtopWidget, keep_all_news_toggle,
  4693.                    XmNbottomAttachment, XmATTACH_NONE,
  4694.                    XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  4695.                    XmNleftWidget, keep_news_by_age_toggle,
  4696.                    XmNrightAttachment, XmATTACH_NONE,
  4697.                    0);
  4698.  
  4699.     XtVaSetValues (keep_unread_news_toggle,
  4700.                    XmNindicatorType, XmN_OF_MANY,
  4701.                    XmNheight, labels_height,
  4702.                    XmNtopAttachment, XmATTACH_WIDGET,
  4703.                    XmNtopWidget, keep_news_by_count_toggle,
  4704.                    XmNbottomAttachment, XmATTACH_NONE,
  4705.                    XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  4706.                    XmNleftWidget, keep_news_by_age_toggle,
  4707.                    XmNrightAttachment, XmATTACH_NONE,
  4708.                    0);
  4709.  
  4710.     XtVaSetValues (keep_news_days_text,
  4711.                    XmNcolumns, 6,
  4712.                    XmNheight, labels_height,
  4713.                    XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  4714.                    XmNtopWidget, keep_news_by_age_toggle,
  4715.                    XmNbottomAttachment, XmATTACH_NONE,
  4716.                    XmNleftAttachment, XmATTACH_WIDGET,
  4717.                    XmNleftWidget, keep_news_by_age_toggle,
  4718.                    XmNrightAttachment, XmATTACH_NONE,
  4719.                    0);
  4720.  
  4721.     XtVaSetValues (days_label,
  4722.                    XmNheight, labels_height,
  4723.                    XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  4724.                    XmNtopWidget, keep_news_by_age_toggle,
  4725.                    XmNbottomAttachment, XmATTACH_NONE,
  4726.                    XmNleftAttachment, XmATTACH_WIDGET,
  4727.                    XmNleftWidget, keep_news_days_text,
  4728.                    XmNrightAttachment, XmATTACH_NONE,
  4729.                    0);
  4730.  
  4731.     XtVaSetValues (keep_news_count_text,
  4732.                    XmNcolumns, 6,
  4733.                    XmNheight, labels_height,
  4734.                    XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  4735.                    XmNtopWidget, keep_news_by_count_toggle,
  4736.                    XmNbottomAttachment, XmATTACH_NONE,
  4737.                    XmNleftAttachment, XmATTACH_WIDGET,
  4738.                    XmNleftWidget, keep_news_by_count_toggle,
  4739.                    XmNrightAttachment, XmATTACH_NONE,
  4740.                    0);
  4741.  
  4742.     XtVaSetValues (msgs_label,
  4743.                    XmNheight, labels_height,
  4744.                    XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  4745.                    XmNtopWidget, keep_news_count_text,
  4746.                    XmNbottomAttachment, XmATTACH_NONE,
  4747.                    XmNleftAttachment, XmATTACH_WIDGET,
  4748.                    XmNleftWidget, keep_news_count_text,
  4749.                    XmNrightAttachment, XmATTACH_NONE,
  4750.                    0);
  4751.  
  4752.     XtManageChildren (kids, i);
  4753.     XtManageChild (label2);
  4754.     XtManageChild (form2);
  4755.     XtManageChild(frame2);
  4756.  
  4757.     XtAddCallback(keep_news_by_age_toggle, XmNvalueChangedCallback, cb_toggleKeepNews, fep);
  4758.     XtAddCallback(keep_all_news_toggle, XmNvalueChangedCallback, cb_toggleKeepNews, fep);
  4759.     XtAddCallback(keep_news_by_count_toggle, XmNvalueChangedCallback, cb_toggleKeepNews, fep);
  4760.  
  4761.     setCreated(TRUE);
  4762. }
  4763.  
  4764. // Member:       init
  4765. // Description:  Initializes page for DiskSpace
  4766. // Inputs:
  4767. // Side effects: 
  4768.  
  4769. void XFE_PrefsPageDiskSpace::init()
  4770. {
  4771.     XP_ASSERT(m_prefsDataDiskSpace);
  4772.  
  4773.     /* malmer */
  4774.  
  4775.     PrefsDataDiskSpace *fep = m_prefsDataDiskSpace;
  4776.     XFE_GlobalPrefs    *prefs = &fe_globalPrefs;
  4777.     char                buf[1024];
  4778.  
  4779.     // Do not download any message larger than...
  4780.  
  4781.     XtVaSetValues(fep->max_msg_size_toggle, 
  4782.                   XmNset, prefs->pop3_msg_size_limit_p, 
  4783.                   XmNsensitive, !PREF_PrefIsLocked("mail.limit_message_size"),
  4784.                   0);
  4785.     PR_snprintf(buf, sizeof(buf), "%d", abs(prefs->pop3_msg_size_limit));
  4786.     XtVaSetValues(fep->max_msg_size_text, 
  4787.                   XmNvalue, buf, 
  4788. #if 0
  4789.                   // This can be used when the toggle callback is added.
  4790.                   XmNsensitive, prefs->pop3_msg_size_limit_p && 
  4791.                                 !PREF_PrefIsLocked("mail.max_size"),
  4792. #else
  4793.                   XmNsensitive, !PREF_PrefIsLocked("mail.max_size"),
  4794. #endif
  4795.                   0);
  4796.  
  4797.     XtVaSetValues(fep->ask_threshold_toggle, 
  4798.                   XmNset, prefs->msg_prompt_purge_threshold, 
  4799.                   XmNsensitive, !PREF_PrefIsLocked("mail.prompt_purge_threshhold"),
  4800.                   0);
  4801.     PR_snprintf(buf, sizeof(buf), "%d", prefs->msg_purge_threshold);
  4802.     XtVaSetValues(fep->threshold_text, 
  4803.                   XmNvalue, buf, 
  4804. #if 0
  4805.                   // This can be used when the toggle callback is added.
  4806.                   XmNsensitive, prefs->msg_prompt_purge_threshold && 
  4807.                                 !PREF_PrefIsLocked("mail.purge_threshhold"),
  4808. #else
  4809.                   XmNsensitive, !PREF_PrefIsLocked("mail.purge_threshhold"),
  4810. #endif
  4811.                   0);
  4812.  
  4813.     // Clean up messages 
  4814.  
  4815.     XtVaSetValues(fep->keep_all_news_toggle, 
  4816.                   XmNset, (prefs->news_keep_method == KEEP_ALL_NEWS),
  4817.                   XmNsensitive, !PREF_PrefIsLocked("news.keep.method"),
  4818.                   0);
  4819.     XtVaSetValues(fep->keep_news_by_age_toggle, 
  4820.                   XmNset, (prefs->news_keep_method == KEEP_NEWS_BY_AGE),
  4821.                   XmNsensitive, !PREF_PrefIsLocked("news.keep.method"),
  4822.                   0);
  4823.     XtVaSetValues(fep->keep_news_by_count_toggle, 
  4824.                   XmNset, (prefs->news_keep_method == KEEP_NEWS_BY_COUNT),
  4825.                   XmNsensitive, !PREF_PrefIsLocked("news.keep.method"),
  4826.                   0);
  4827.  
  4828.     PR_snprintf(buf, sizeof(buf), "%d", prefs->news_keep_days);
  4829.     XtVaSetValues(fep->keep_news_days_text, 
  4830.                   XmNvalue, buf, 
  4831. #if 0
  4832.                   // This can be used when the toggle callback is added.
  4833.                   XmNsensitive, prefs->news_keep_method == KEEP_NEWS_BY_AGE && 
  4834.                                 !PREF_PrefIsLocked("news.keep.days"),
  4835. #else
  4836.                   XmNsensitive, !PREF_PrefIsLocked("news.keep.days"),
  4837. #endif
  4838.                   0);
  4839.  
  4840.     PR_snprintf(buf, sizeof(buf), "%d", prefs->news_keep_count);
  4841.     XtVaSetValues(fep->keep_news_count_text, 
  4842.                   XmNvalue, buf, 
  4843. #if 0
  4844.                   // This can be used when the toggle callback is added.
  4845.                   XmNsensitive, prefs->news_keep_method == KEEP_NEWS_BY_COUNT &&
  4846.                                 !PREF_PrefIsLocked("news.keep.count"),
  4847. #else
  4848.                   XmNsensitive, !PREF_PrefIsLocked("news.keep.count"),
  4849. #endif
  4850.                   0);
  4851.  
  4852.     // Keep unread messages
  4853.  
  4854.     XtVaSetValues(fep->keep_unread_news_toggle, 
  4855.                   XmNset, prefs->news_keep_only_unread, 
  4856.                   XmNsensitive, !PREF_PrefIsLocked("news.keep.only_unread"),
  4857.                   0);
  4858.  
  4859.     setInitialized(TRUE);
  4860. }
  4861.  
  4862. // Member:       install
  4863. // Description:  
  4864. // Inputs:
  4865. // Side effects: 
  4866.  
  4867. void XFE_PrefsPageDiskSpace::install()
  4868. {
  4869.     fe_installDiskSpace();
  4870. }
  4871.  
  4872. // Member:       save
  4873. // Description:  
  4874. // Inputs:
  4875. // Side effects: 
  4876.  
  4877. void XFE_PrefsPageDiskSpace::save()
  4878. {
  4879.     PrefsDataDiskSpace *fep = m_prefsDataDiskSpace;
  4880.  
  4881.     XP_ASSERT(fep);
  4882.  
  4883.     Boolean                     b;
  4884.     char                        c;
  4885.     char                       *s = 0;
  4886.     int                         n;
  4887.  
  4888.     // All messages
  4889.  
  4890.     XtVaGetValues(fep->max_msg_size_toggle, XmNset, &b, 0);
  4891.     fe_globalPrefs.pop3_msg_size_limit_p = b;
  4892.  
  4893.     XtVaGetValues(fep->max_msg_size_text, XmNvalue, &s, 0);
  4894.     fe_globalPrefs.pop3_msg_size_limit = 0;
  4895.     if (1 == sscanf (s, " %d %c", &n, &c))
  4896.       fe_globalPrefs.pop3_msg_size_limit = n;
  4897.     if (s) XtFree(s);
  4898.  
  4899.     XtVaGetValues(fep->ask_threshold_toggle, XmNset, &b, 0);
  4900.     fe_globalPrefs.msg_prompt_purge_threshold = b;
  4901.  
  4902.     XtVaGetValues(fep->threshold_text, XmNvalue, &s, 0);
  4903.     fe_globalPrefs.msg_purge_threshold = 0;
  4904.     if (1 == sscanf (s, " %d %c", &n, &c))
  4905.       fe_globalPrefs.msg_purge_threshold = n;
  4906.     if (s) XtFree(s);
  4907.  
  4908.     // News messages
  4909.  
  4910.     XtVaGetValues(fep->keep_all_news_toggle, XmNset, &b, 0);
  4911.     if (b) fe_globalPrefs.news_keep_method = KEEP_ALL_NEWS;
  4912.  
  4913.     XtVaGetValues(fep->keep_news_by_age_toggle, XmNset, &b, 0);
  4914.     if (b) fe_globalPrefs.news_keep_method = KEEP_NEWS_BY_AGE;
  4915.  
  4916.     XtVaGetValues(fep->keep_news_by_count_toggle, XmNset, &b, 0);
  4917.     if (b) fe_globalPrefs.news_keep_method = KEEP_NEWS_BY_COUNT;
  4918.  
  4919.     XtVaGetValues(fep->keep_news_days_text, XmNvalue, &s, 0);
  4920.     fe_globalPrefs.news_keep_days = 0;
  4921.     if (1 == sscanf (s, " %d %c", &n, &c))
  4922.       fe_globalPrefs.news_keep_days = n;
  4923.     if (s) XtFree(s);
  4924.  
  4925.     XtVaGetValues(fep->keep_news_count_text, XmNvalue, &s, 0);
  4926.     fe_globalPrefs.news_keep_count = 0;
  4927.     if (1 == sscanf (s, " %d %c", &n, &c))
  4928.       fe_globalPrefs.news_keep_count = n;
  4929.     if (s) XtFree(s);
  4930.  
  4931.     XtVaGetValues(fep->keep_unread_news_toggle, XmNset, &b, 0);
  4932.     fe_globalPrefs.news_keep_only_unread = b;
  4933.  
  4934.     // Install preferences
  4935.  
  4936.     install();
  4937. }
  4938.  
  4939. // Member:       getData
  4940. // Description:  
  4941. // Inputs:
  4942. // Side effects: 
  4943.  
  4944. PrefsDataDiskSpace *XFE_PrefsPageDiskSpace::getData()
  4945. {
  4946.     return m_prefsDataDiskSpace;
  4947. }
  4948.  
  4949. #if 0
  4950. // Member:       cb_more
  4951. // Description:  
  4952. // Inputs:
  4953. // Side effects: 
  4954.  
  4955. void XFE_PrefsPageDiskSpace::cb_more(Widget    /* w */,
  4956.                                             XtPointer closure,
  4957.                                             XtPointer /* callData */)
  4958. {
  4959.     XFE_PrefsPageDiskSpace *thePage = (XFE_PrefsPageDiskSpace *)closure;
  4960.     XFE_PrefsDialog               *theDialog = thePage->getPrefsDialog();
  4961.     Widget                         mainw = theDialog->getBaseWidget();
  4962.  
  4963.     //    while (!XtIsWMShell(mainw) && (XtParent(mainw)!=0))
  4964.     //        mainw = XtParent(mainw);
  4965.  
  4966.     // Instantiate a mail server more dialog
  4967.  
  4968.     XFE_PrefsDiskMoreDialog *theMoreDialog = 0;
  4969.  
  4970.     if ((theMoreDialog =
  4971.          new XFE_PrefsDiskMoreDialog(theDialog, mainw, "prefsDiskMore")) == 0) {
  4972.         fe_perror(thePage->getContext(), XP_GetString(XFE_OUT_OF_MEMORY_URL));
  4973.         return;
  4974.     }
  4975.  
  4976.     // Initialize and pop up the more dialog
  4977.  
  4978.     theMoreDialog->initPage();
  4979.     theMoreDialog->show();
  4980. }
  4981. #endif
  4982.  
  4983. void XFE_PrefsPageDiskSpace::cb_toggleKeepNews(Widget    widget,
  4984.                                                XtPointer closure,
  4985.                                                XtPointer call_data)
  4986. {
  4987.     PrefsDataDiskSpace           *fep = (PrefsDataDiskSpace *)closure;
  4988.     XmToggleButtonCallbackStruct *cb = (XmToggleButtonCallbackStruct *)call_data;
  4989.  
  4990.     if (! cb->set) {
  4991.         XtVaSetValues(widget, XmNset, True, 0);
  4992.     }
  4993.     else if (widget == fep->keep_news_by_age_toggle) {
  4994.         XtVaSetValues(fep->keep_all_news_toggle, XmNset, False, 0);
  4995.         XtVaSetValues(fep->keep_news_by_count_toggle, XmNset, False, 0);
  4996.     }
  4997.     else if (widget == fep->keep_all_news_toggle) {
  4998.         XtVaSetValues(fep->keep_news_by_age_toggle, XmNset, False, 0);
  4999.         XtVaSetValues(fep->keep_news_by_count_toggle, XmNset, False, 0);
  5000.     }
  5001.     else if (widget == fep->keep_news_by_count_toggle) {
  5002.         XtVaSetValues(fep->keep_news_by_age_toggle, XmNset, False, 0);
  5003.         XtVaSetValues(fep->keep_all_news_toggle, XmNset, False, 0);
  5004.     }
  5005.     else
  5006.         abort();
  5007. }
  5008.  
  5009. #ifdef PREFS_UNSUPPORTED
  5010.  
  5011. // ************************************************************************
  5012. // ************************  Advanced/Help Files  *************************
  5013. // ************************************************************************
  5014.  
  5015. // Member:       XFE_PrefsPageHelpFiles
  5016. // Description:  Constructor
  5017. // Inputs:
  5018. // Side effects: 
  5019.  
  5020. XFE_PrefsPageHelpFiles::XFE_PrefsPageHelpFiles(XFE_PrefsDialog *dialog)
  5021.     : XFE_PrefsPage(dialog),
  5022.       m_prefsDataHelpFiles(0)
  5023. {
  5024. }
  5025.  
  5026. // Member:       ~XFE_PrefsPageHelpFiles
  5027. // Description:  Destructor
  5028. // Inputs:
  5029. // Side effects: 
  5030.  
  5031. XFE_PrefsPageHelpFiles::~XFE_PrefsPageHelpFiles()
  5032. {
  5033.     delete m_prefsDataHelpFiles;
  5034. }
  5035.  
  5036. // Member:       create
  5037. // Description:  Creates page for HelpFiles
  5038. // Inputs:
  5039. // Side effects: 
  5040.  
  5041. void XFE_PrefsPageHelpFiles::create()
  5042. {
  5043.     Widget            kids[100];
  5044.     Arg               av[50];
  5045.     int               ac;
  5046.     int               i;
  5047.  
  5048.     PrefsDataHelpFiles *fep = NULL;
  5049.  
  5050.     fep = new PrefsDataHelpFiles;
  5051.     memset(fep, 0, sizeof(PrefsDataHelpFiles));
  5052.     m_prefsDataHelpFiles = fep;
  5053.  
  5054.     fep->context = getContext();
  5055.     fep->prompt_dialog = getPrefsDialog()->getDialogChrome();
  5056.  
  5057.     Widget form;
  5058.  
  5059.     ac = 0;
  5060.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
  5061.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
  5062.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  5063.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  5064.     form = XmCreateForm (m_wPageForm, "helpFiles", av, ac);
  5065.     XtManageChild (form);
  5066.     m_wPage = fep->page = form;
  5067.  
  5068.     Widget frame1;
  5069.  
  5070.     ac = 0;
  5071.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  5072.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  5073.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
  5074.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
  5075.     frame1 = XmCreateFrame (form, "helpFrame", av, ac);
  5076.  
  5077.     Widget form1;
  5078.  
  5079.     ac = 0;
  5080.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  5081.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  5082.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
  5083.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
  5084.     form1 = XmCreateForm (frame1, "helpBox", av, ac);
  5085.  
  5086.     Widget help_label;
  5087.     Widget netscape_toggle;
  5088.     Widget install_toggle;
  5089.     Widget custom_toggle;
  5090.     Widget custom_url_text;
  5091.     Widget browse_button;
  5092.  
  5093.     ac = 0;
  5094.     i = 0;
  5095.  
  5096.     kids[i++] = help_label = XmCreateLabelGadget(form1, "helpLabel", av, ac);
  5097.  
  5098.     kids[i++] = netscape_toggle =
  5099.         XmCreateToggleButtonGadget(form1, "netscapeToggle", av, ac);
  5100.  
  5101.     kids[i++] = install_toggle =
  5102.         XmCreateToggleButtonGadget(form1, "installToggle", av, ac);
  5103.  
  5104.     kids[i++] = custom_toggle =
  5105.         XmCreateToggleButtonGadget(form1, "customToggle", av, ac);
  5106.  
  5107.     kids[i++] = custom_url_text = 
  5108.         fe_CreateTextField (form1, "customUrl", av, ac);
  5109.  
  5110.     kids[i++] = browse_button = XmCreatePushButtonGadget(form1, "browse", av, ac);
  5111.  
  5112.     fep->netscape_toggle = netscape_toggle;
  5113.     fep->install_toggle = install_toggle;
  5114.     fep->custom_toggle = custom_toggle;
  5115.     fep->custom_url_text = custom_url_text;
  5116.     fep->browse_button = browse_button;
  5117.  
  5118.     int labels_height;
  5119.     labels_height = XfeVaGetTallestWidget(custom_toggle,
  5120.                                           custom_url_text,
  5121.                                           NULL);
  5122.  
  5123.     XtVaSetValues (help_label,
  5124.                    XmNheight, labels_height,
  5125.                    XmNtopAttachment, XmATTACH_FORM,
  5126.                    XmNleftAttachment, XmATTACH_FORM,
  5127.                    XmNbottomAttachment, XmATTACH_NONE,
  5128.                    XmNrightAttachment, XmATTACH_NONE,
  5129.                    0);
  5130.  
  5131.     XtVaSetValues (netscape_toggle,
  5132.                    XmNindicatorType, XmONE_OF_MANY,
  5133.                    XmNheight, labels_height,
  5134.                    XmNtopAttachment, XmATTACH_WIDGET,
  5135.                    XmNtopWidget, help_label,
  5136.                    XmNleftAttachment, XmATTACH_FORM,
  5137.                    XmNleftOffset, 16,
  5138.                    XmNbottomAttachment, XmATTACH_NONE,
  5139.                    XmNrightAttachment, XmATTACH_NONE,
  5140.                    0);
  5141.  
  5142.     XtVaSetValues (install_toggle,
  5143.                    XmNindicatorType, XmONE_OF_MANY,
  5144.                    XmNheight, labels_height,
  5145.                    XmNtopAttachment, XmATTACH_WIDGET,
  5146.                    XmNtopWidget, netscape_toggle,
  5147.                    XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  5148.                    XmNleftWidget, netscape_toggle,
  5149.                    XmNbottomAttachment, XmATTACH_NONE,
  5150.                    XmNrightAttachment, XmATTACH_NONE,
  5151.                    0);
  5152.  
  5153.     XtVaSetValues (custom_toggle,
  5154.                    XmNindicatorType, XmONE_OF_MANY,
  5155.                    XmNheight, labels_height,
  5156.                    XmNtopAttachment, XmATTACH_WIDGET,
  5157.                    XmNtopWidget, install_toggle,
  5158.                    XmNbottomAttachment, XmATTACH_NONE,
  5159.                    XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  5160.                    XmNleftWidget, install_toggle,
  5161.                    XmNrightAttachment, XmATTACH_NONE,
  5162.                    0);
  5163.  
  5164.     XtVaSetValues (custom_url_text,
  5165.                    XmNcolumns, 35,
  5166.                    XmNheight, labels_height,
  5167.                    XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  5168.                    XmNtopWidget, custom_toggle,
  5169.                    XmNbottomAttachment, XmATTACH_NONE,
  5170.                    XmNleftAttachment, XmATTACH_WIDGET,
  5171.                    XmNleftWidget, custom_toggle,
  5172.                    XmNrightAttachment, XmATTACH_NONE,
  5173.                    0);
  5174.  
  5175.     XtVaSetValues (browse_button,
  5176.                    XmNtopAttachment, XmATTACH_WIDGET,
  5177.                    XmNtopWidget, custom_url_text,
  5178.                    XmNtopOffset, 8,
  5179.                    XmNbottomAttachment, XmATTACH_NONE,
  5180.                    XmNleftAttachment, XmATTACH_NONE,
  5181.                    XmNrightAttachment, XmATTACH_OPPOSITE_WIDGET,
  5182.                    XmNrightWidget, custom_url_text,
  5183.                    0);
  5184.  
  5185.     XtManageChildren (kids, i);
  5186.     XtManageChild (form1);
  5187.     XtManageChild(frame1);
  5188.  
  5189.     XtAddCallback(netscape_toggle, XmNvalueChangedCallback, cb_toggleHelpSite, fep);
  5190.     XtAddCallback(install_toggle, XmNvalueChangedCallback, cb_toggleHelpSite, fep);
  5191.     XtAddCallback(custom_toggle, XmNvalueChangedCallback, cb_toggleHelpSite, fep);
  5192.  
  5193.     XtAddCallback(browse_button, XmNactivateCallback, cb_browse, this);
  5194.  
  5195.     setCreated(TRUE);
  5196. }
  5197.  
  5198. // Member:       init
  5199. // Description:  Initializes page for HelpFiles
  5200. // Inputs:
  5201. // Side effects: 
  5202.  
  5203. void XFE_PrefsPageHelpFiles::init()
  5204. {
  5205.     XP_ASSERT(m_prefsDataHelpFiles);
  5206.  
  5207.     PrefsDataHelpFiles *fep = m_prefsDataHelpFiles;
  5208.     XFE_GlobalPrefs    *prefs = &fe_globalPrefs;
  5209.     Boolean             sensitive;
  5210.  
  5211.     sensitive = !PREF_PrefIsLocked("general.help_source.site");
  5212.  
  5213.     XtVaSetValues(fep->netscape_toggle, 
  5214.                   XmNset, (prefs->help_source_site == HELPFILE_SITE_NETSCAPE),
  5215.                   XmNsensitive, sensitive,
  5216.                   0);
  5217.     XtVaSetValues(fep->install_toggle, 
  5218.                   XmNset, (prefs->help_source_site == HELPFILE_SITE_INSTALLED),
  5219.                   XmNsensitive, sensitive,
  5220.                   0);
  5221.     XtVaSetValues(fep->custom_toggle, 
  5222.                   XmNset, (prefs->help_source_site == HELPFILE_SITE_CUSTOM),
  5223.                   XmNsensitive, sensitive,
  5224.                   0);
  5225.  
  5226.     sensitive = prefs->help_source_site == HELPFILE_SITE_CUSTOM &&
  5227.                 !PREF_PrefIsLocked("general.help_source.url");
  5228.     XtVaSetValues(fep->custom_url_text, 
  5229.                   XmNsensitive, sensitive,
  5230.                   0);
  5231.     fe_SetTextField(fep->custom_url_text, prefs->help_source_url);
  5232.     XtSetSensitive(fep->browse_button, sensitive);
  5233.  
  5234.     setInitialized(TRUE);
  5235. }
  5236.  
  5237. // Member:       install
  5238. // Description:  
  5239. // Inputs:
  5240. // Side effects: 
  5241.  
  5242. void XFE_PrefsPageHelpFiles::install()
  5243. {
  5244. }
  5245.  
  5246. // Member:       save
  5247. // Description:  
  5248. // Inputs:
  5249. // Side effects: 
  5250.  
  5251. void XFE_PrefsPageHelpFiles::save()
  5252. {
  5253.     PrefsDataHelpFiles *fep = m_prefsDataHelpFiles;
  5254.  
  5255.     XP_ASSERT(fep);
  5256.  
  5257.     Boolean b;
  5258.  
  5259.     XtVaGetValues(fep->netscape_toggle, XmNset, &b, 0);
  5260.     if (b) fe_globalPrefs.help_source_site = HELPFILE_SITE_NETSCAPE;
  5261.  
  5262.     XtVaGetValues(fep->install_toggle, XmNset, &b, 0);
  5263.     if (b) fe_globalPrefs.help_source_site = HELPFILE_SITE_INSTALLED;
  5264.  
  5265.     XtVaGetValues(fep->custom_toggle, XmNset, &b, 0);
  5266.     if (b) fe_globalPrefs.help_source_site = HELPFILE_SITE_CUSTOM;
  5267.  
  5268.     XP_FREEIF(fe_globalPrefs.help_source_url);
  5269.     char *s = fe_GetTextField(fep->custom_url_text);
  5270.     fe_globalPrefs.help_source_url = s ? s : XP_STRDUP("");
  5271.  
  5272.     // Install preferences
  5273.  
  5274.     install();
  5275. }
  5276.  
  5277. // Member:       getData
  5278. // Description:  
  5279. // Inputs:
  5280. // Side effects: 
  5281.  
  5282. PrefsDataHelpFiles *XFE_PrefsPageHelpFiles::getData()
  5283. {
  5284.     return m_prefsDataHelpFiles;
  5285. }
  5286.  
  5287. // Member:       cb_toggleHelpSite
  5288. // Description:  
  5289. // Inputs:
  5290. // Side effects: 
  5291.  
  5292. void XFE_PrefsPageHelpFiles::cb_toggleHelpSite(Widget    w,
  5293.                                                XtPointer closure,
  5294.                                                XtPointer callData)
  5295. {
  5296.     XmToggleButtonCallbackStruct *cb = (XmToggleButtonCallbackStruct *)callData;
  5297.     PrefsDataHelpFiles           *fep = (PrefsDataHelpFiles *)closure;
  5298.     Boolean                       sensitive;
  5299.  
  5300.     if (! cb->set) {
  5301.         XtVaSetValues(w, XmNset, True, 0);
  5302.     }
  5303.     else if (w == fep->netscape_toggle) {
  5304.         XtVaSetValues(fep->install_toggle, XmNset, False, 0);
  5305.         XtVaSetValues(fep->custom_toggle, XmNset, False, 0);
  5306.     }
  5307.     else if (w == fep->install_toggle) {
  5308.         XtVaSetValues(fep->netscape_toggle, XmNset, False, 0);
  5309.         XtVaSetValues(fep->custom_toggle, XmNset, False, 0);
  5310.     }
  5311.     else if (w == fep->custom_toggle) {
  5312.         XtVaSetValues(fep->netscape_toggle, XmNset, False, 0);
  5313.         XtVaSetValues(fep->install_toggle, XmNset, False, 0);
  5314.     }
  5315.     else
  5316.         abort();    
  5317.  
  5318.     sensitive = ( w == fep->custom_toggle &&
  5319.                   !PREF_PrefIsLocked("general.help_source.url") );
  5320.     XtSetSensitive(fep->custom_url_text, sensitive);
  5321.     XtSetSensitive(fep->browse_button, sensitive);
  5322. }
  5323.  
  5324. // Member:       cb_more
  5325. // Description:  
  5326. // Inputs:
  5327. // Side effects: 
  5328.  
  5329. void XFE_PrefsPageHelpFiles::cb_browse(Widget    /* w */,
  5330.                                        XtPointer closure,
  5331.                                        XtPointer /* callData */)
  5332. {
  5333.     XFE_PrefsPageHelpFiles *thePage = (XFE_PrefsPageHelpFiles *)closure;
  5334.     XFE_PrefsDialog        *theDialog = thePage->getPrefsDialog();
  5335.     PrefsDataHelpFiles     *fep = thePage->getData();
  5336.  
  5337.     fe_browse_file_of_text_in_url(theDialog->getContext(), fep->custom_url_text, True);
  5338. }
  5339.  
  5340. #endif /* PREFS_UNSUPPORTED */
  5341.  
  5342.