home *** CD-ROM | disk | FTP | other *** search
/ Tools / WinSN5.0Ver.iso / NETSCAP.50 / WIN1998.ZIP / ns / cmd / xfe / src / PrefsDialogOffline.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1998-04-08  |  27.1 KB  |  946 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.    PrefsDialogOffline.cpp -- the Offline pages in XFE preferences dialogs
  20.    Created: Linda Wei <lwei@netscape.com>, 11-Dec-96.
  21.  */
  22.  
  23. #include "felocale.h"
  24. #include "structs.h"
  25. #include "fonts.h"
  26. #include "xpassert.h"
  27. #include "prprf.h"
  28. #include "xfe.h"
  29. #include "PrefsDialog.h"
  30.  
  31. #include <Xm/Label.h>
  32. #include <Xm/LabelG.h>
  33. #include <Xm/CascadeBG.h>
  34. #include <Xm/PushB.h>
  35. #include <Xm/PushBG.h>
  36. #include <Xm/ToggleB.h>
  37. #include <Xm/ArrowBG.h>
  38. #include <Xm/Form.h>
  39. #include <Xm/Frame.h>
  40. #include <Xm/RowColumn.h>
  41. #include <Xm/LabelG.h> 
  42. #include <Xm/TextF.h> 
  43. #include <Xm/ToggleBG.h> 
  44. #include <XmL/Grid.h>
  45. #include <XmL/Folder.h>
  46. #include <Xfe/Xfe.h>
  47.  
  48. extern "C"
  49. {
  50.     char     *XP_GetString(int i);
  51.     void      fe_installOffline();
  52.     void      fe_installOfflineNews();
  53.  
  54.     static void fe_create_download_messages(PrefsDataOfflineNews *);
  55.     static void fe_create_download_from(PrefsDataOfflineNews *);
  56. }
  57.  
  58. extern int XFE_OFFLINE_NEWS_ALL_MSGS;
  59. extern int XFE_OFFLINE_NEWS_UNREAD_MSGS;
  60.  
  61. extern int XFE_OFFLINE_NEWS_YESTERDAY;
  62. extern int XFE_OFFLINE_NEWS_ONE_WK_AGO;
  63. extern int XFE_OFFLINE_NEWS_TWO_WKS_AGO;
  64. extern int XFE_OFFLINE_NEWS_ONE_MONTH_AGO;
  65. extern int XFE_OFFLINE_NEWS_SIX_MONTHS_AGO;
  66. extern int XFE_OFFLINE_NEWS_ONE_YEAR_AGO;
  67.  
  68. // Make sure the entries correspond to the prefs defined in prefs.h
  69.  
  70. int *downloadMessages[] = {
  71.     &XFE_OFFLINE_NEWS_ALL_MSGS,
  72.     &XFE_OFFLINE_NEWS_UNREAD_MSGS,
  73. };
  74.  
  75. int *downloadFrom[] = {
  76.     &XFE_OFFLINE_NEWS_YESTERDAY,
  77.     &XFE_OFFLINE_NEWS_ONE_WK_AGO,
  78.     &XFE_OFFLINE_NEWS_TWO_WKS_AGO,
  79.     &XFE_OFFLINE_NEWS_ONE_MONTH_AGO,
  80.     &XFE_OFFLINE_NEWS_SIX_MONTHS_AGO,
  81.     &XFE_OFFLINE_NEWS_ONE_YEAR_AGO,
  82. };
  83.  
  84. // ************************************************************************
  85. // *************************       Offline        *************************
  86. // ************************************************************************
  87.  
  88. // Member:       XFE_PrefsPageOffline
  89. // Description:  Constructor
  90. // Inputs:
  91. // Side effects: 
  92.  
  93. XFE_PrefsPageOffline::XFE_PrefsPageOffline(XFE_PrefsDialog *dialog)
  94.     : XFE_PrefsPage(dialog),
  95.       m_prefsDataOffline(0)
  96. {
  97. }
  98.  
  99. // Member:       ~XFE_PrefsPageOffline
  100. // Description:  Destructor
  101. // Inputs:
  102. // Side effects: 
  103.  
  104. XFE_PrefsPageOffline::~XFE_PrefsPageOffline()
  105. {
  106.     delete m_prefsDataOffline;
  107. }
  108.  
  109. // Member:       create
  110. // Description:  Creates page for Offline
  111. // Inputs:
  112. // Side effects: 
  113.  
  114. void XFE_PrefsPageOffline::create()
  115. {
  116.     Widget            kids[100];
  117.     Arg               av[50];
  118.     int               ac;
  119.     int               i;
  120.  
  121.     PrefsDataOffline *fep = NULL;
  122.  
  123.     fep = new PrefsDataOffline;
  124.     memset(fep, 0, sizeof(PrefsDataOffline));
  125.     m_prefsDataOffline = fep;
  126.  
  127.     fep->context = getContext();
  128.     fep->prompt_dialog = getPrefsDialog()->getDialogChrome();
  129.  
  130.     Widget form;
  131.  
  132.     ac = 0;
  133.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
  134.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
  135.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  136.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  137.     form = XmCreateForm (m_wPageForm, "offline", av, ac);
  138.     XtManageChild (form);
  139.     m_wPage = fep->page = form;
  140.  
  141.     // Startup 
  142.  
  143.     Widget frame1;
  144.  
  145.     ac = 0;
  146.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  147.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  148.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
  149.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
  150.     frame1 = XmCreateFrame (form, "startupFrame", av, ac);
  151.  
  152.     Widget form1;
  153.  
  154.     ac = 0;
  155.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  156.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  157.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
  158.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
  159.     form1 = XmCreateForm (frame1, "startupBox", av, ac);
  160.  
  161.     Widget label1;
  162.     Widget online_toggle;
  163.     Widget offline_toggle;
  164.     Widget ask_toggle;
  165.     Widget online_desc;
  166.     Widget offline_desc;
  167.     Widget ask_desc;
  168.  
  169.     ac = 0;
  170.     XtSetArg (av [ac], XmNchildType, XmFRAME_TITLE_CHILD); ac++;
  171.     label1 = XmCreateLabelGadget (frame1, "startupBoxLabel", av, ac);
  172.  
  173.     ac = 0;
  174.     i = 0;
  175.  
  176.     kids[i++] = online_toggle = XmCreateToggleButtonGadget (form1,
  177.                                                             "online",
  178.                                                             av, ac);
  179.     fep->online_toggle = online_toggle;
  180.  
  181.     kids[i++] = online_desc = XmCreateLabelGadget (form1, "onlineDesc",
  182.                                                    av, ac);
  183.  
  184.     kids[i++] = offline_toggle = XmCreateToggleButtonGadget (form1,
  185.                                                              "offline",
  186.                                                              av, ac);
  187.     fep->offline_toggle = offline_toggle;
  188.  
  189.     kids[i++] = offline_desc = XmCreateLabelGadget (form1, "offlineDesc",
  190.                                                     av, ac);
  191.  
  192.     kids[i++] = ask_toggle = XmCreateToggleButtonGadget (form1,
  193.                                                          "ask",
  194.                                                          av, ac);
  195.     fep->ask_toggle = ask_toggle;
  196.  
  197.     kids[i++] = ask_desc = XmCreateLabelGadget (form1, "askDesc",
  198.                                                 av, ac);
  199.  
  200.     Dimension spacing;
  201.     Dimension toggle_width;
  202.     XtVaGetValues(online_toggle,
  203.                   XmNindicatorSize, &toggle_width,
  204.                   XmNspacing, &spacing,
  205.                   NULL);
  206.  
  207.     XtVaSetValues (online_toggle,
  208.                    XmNindicatorType, XmONE_OF_MANY,
  209.                    XmNtopAttachment, XmATTACH_FORM,
  210.                    XmNleftAttachment, XmATTACH_FORM,
  211.                    XmNbottomAttachment, XmATTACH_NONE,
  212.                    XmNrightAttachment, XmATTACH_NONE,
  213.                    0);
  214.     XtVaSetValues (online_desc,
  215.                    XmNalignment, XmALIGNMENT_BEGINNING,
  216.                    XmNtopAttachment, XmATTACH_WIDGET,
  217.                    XmNtopWidget, online_toggle,
  218.                    XmNbottomAttachment, XmATTACH_NONE,
  219.                    XmNleftAttachment, XmATTACH_FORM,
  220.                    XmNleftOffset, toggle_width+spacing,
  221.                    XmNrightAttachment, XmATTACH_NONE,
  222.                    0);
  223.     XtVaSetValues (offline_toggle,
  224.                    XmNindicatorType, XmONE_OF_MANY,
  225.                    XmNtopAttachment, XmATTACH_WIDGET,
  226.                    XmNtopWidget, online_desc,
  227.                    XmNtopOffset, 4,
  228.                    XmNbottomAttachment, XmATTACH_NONE,
  229.                    XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  230.                    XmNleftWidget, online_toggle,
  231.                    XmNrightAttachment, XmATTACH_NONE,
  232.                    0);
  233.     XtVaSetValues (offline_desc,
  234.                    XmNalignment, XmALIGNMENT_BEGINNING,
  235.                    XmNtopAttachment, XmATTACH_WIDGET,
  236.                    XmNtopWidget, offline_toggle,
  237.                    XmNbottomAttachment, XmATTACH_NONE,
  238.                    XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  239.                    XmNleftWidget, online_desc,
  240.                    XmNrightAttachment, XmATTACH_NONE,
  241.                    0);
  242.     XtVaSetValues (ask_toggle,
  243.                    XmNindicatorType, XmONE_OF_MANY,
  244.                    XmNtopAttachment, XmATTACH_WIDGET,
  245.                    XmNtopWidget, offline_desc,
  246.                    XmNtopOffset, 4,
  247.                    XmNbottomAttachment, XmATTACH_NONE,
  248.                    XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  249.                    XmNleftWidget, online_toggle,
  250.                    XmNrightAttachment, XmATTACH_NONE,
  251.                    0);
  252.     XtVaSetValues (ask_desc,
  253.                    XmNalignment, XmALIGNMENT_BEGINNING,
  254.                    XmNtopAttachment, XmATTACH_WIDGET,
  255.                    XmNtopWidget, ask_toggle,
  256.                    XmNbottomAttachment, XmATTACH_NONE,
  257.                    XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  258.                    XmNleftWidget, online_desc,
  259.                    XmNrightAttachment, XmATTACH_NONE,
  260.                    0);
  261.  
  262.     XtManageChildren (kids, i);
  263.     XtManageChild (label1);
  264.     XtManageChild (form1);
  265.     XtManageChild(frame1);
  266.  
  267.     XtAddCallback (online_toggle, XmNvalueChangedCallback,
  268.                    cb_toggleStartup, fep);
  269.     XtAddCallback (offline_toggle, XmNvalueChangedCallback,
  270.                    cb_toggleStartup, fep);
  271.     XtAddCallback (ask_toggle, XmNvalueChangedCallback,
  272.                    cb_toggleStartup, fep);
  273.  
  274.     setCreated(TRUE);
  275. }
  276.  
  277. // Member:       init
  278. // Description:  Initializes page for Offline
  279. // Inputs:
  280. // Side effects: 
  281.  
  282. void XFE_PrefsPageOffline::init()
  283. {
  284.     XP_ASSERT(m_prefsDataOffline);
  285.  
  286.     PrefsDataOffline *fep = m_prefsDataOffline;
  287.     XFE_GlobalPrefs  *prefs = &fe_globalPrefs;
  288.  
  289.     // Start up
  290.  
  291.     XtVaSetValues(fep->online_toggle, 
  292.                   XmNset, (prefs->offline_startup_mode == OFFLINE_STARTUP_ONLINE),
  293.                   0);
  294.  
  295.     XtVaSetValues(fep->offline_toggle, 
  296.                   XmNset, (prefs->offline_startup_mode == OFFLINE_STARTUP_OFFLINE),
  297.                   0);
  298.  
  299.     XtVaSetValues(fep->ask_toggle, 
  300.                   XmNset, (prefs->offline_startup_mode == OFFLINE_STARTUP_ASKME),
  301.                   0);
  302.  
  303.     setInitialized(TRUE);
  304. }
  305.  
  306. // Member:       install
  307. // Description:  
  308. // Inputs:
  309. // Side effects: 
  310.  
  311. void XFE_PrefsPageOffline::install()
  312. {
  313.     fe_installOffline();
  314. }
  315.  
  316. // Member:       save
  317. // Description:  
  318. // Inputs:
  319. // Side effects: 
  320.  
  321. void XFE_PrefsPageOffline::save()
  322. {
  323.     PrefsDataOffline *fep = m_prefsDataOffline;
  324.  
  325.     XP_ASSERT(fep);
  326.     if (! verify()) return;
  327.  
  328.     Boolean b;
  329.  
  330.     XtVaGetValues(fep->online_toggle, XmNset, &b, 0);
  331.     if (b) fe_globalPrefs.offline_startup_mode = OFFLINE_STARTUP_ONLINE;
  332.  
  333.     XtVaGetValues(fep->offline_toggle, XmNset, &b, 0);
  334.     if (b) fe_globalPrefs.offline_startup_mode = OFFLINE_STARTUP_OFFLINE;
  335.  
  336.     XtVaGetValues(fep->ask_toggle, XmNset, &b, 0);
  337.     if (b) fe_globalPrefs.offline_startup_mode = OFFLINE_STARTUP_ASKME;
  338.  
  339.     // Install preferences
  340.  
  341.     install();
  342. }
  343.  
  344. // Member:       getData
  345. // Description:  
  346. // Inputs:
  347. // Side effects: 
  348.  
  349. PrefsDataOffline *XFE_PrefsPageOffline::getData()
  350. {
  351.     return m_prefsDataOffline;
  352. }
  353.  
  354. void XFE_PrefsPageOffline::cb_toggleStartup(Widget    widget,
  355.                                             XtPointer closure,
  356.                                             XtPointer call_data)
  357. {
  358.     PrefsDataOffline *fep = (PrefsDataOffline *)closure;
  359.     XmToggleButtonCallbackStruct *cb = (XmToggleButtonCallbackStruct *)call_data;
  360.  
  361.     if (! cb->set) {
  362.         XtVaSetValues(widget, XmNset, True, 0);
  363.     }
  364.     else if (widget == fep->online_toggle) {
  365.         XtVaSetValues(fep->offline_toggle, XmNset, False, 0);
  366.         XtVaSetValues(fep->ask_toggle, XmNset, False, 0);
  367.     }
  368.     else if (widget == fep->offline_toggle)    {
  369.         XtVaSetValues(fep->online_toggle, XmNset, False, 0);
  370.         XtVaSetValues(fep->ask_toggle, XmNset, False, 0);
  371.     }
  372.     else if (widget == fep->ask_toggle)    {
  373.         XtVaSetValues(fep->online_toggle, XmNset, False, 0);
  374.         XtVaSetValues(fep->offline_toggle, XmNset, False, 0);
  375.     }
  376.     else
  377.         abort();
  378. }
  379.  
  380. // ************************************************************************
  381. // *************************    Offline/News      *************************
  382. // ************************************************************************
  383.  
  384. // Member:       XFE_PrefsPageOfflineNews
  385. // Description:  Constructor
  386. // Inputs:
  387. // Side effects: 
  388.  
  389. XFE_PrefsPageOfflineNews::XFE_PrefsPageOfflineNews(XFE_PrefsDialog *dialog)
  390.     : XFE_PrefsPage(dialog),
  391.       m_prefsDataOfflineNews(0)
  392. {
  393. }
  394.  
  395. // Member:       ~XFE_PrefsPageOfflineNews
  396. // Description:  Destructor
  397. // Inputs:
  398. // Side effects: 
  399.  
  400. XFE_PrefsPageOfflineNews::~XFE_PrefsPageOfflineNews()
  401. {
  402.     PrefsDataOfflineNews         *fep = m_prefsDataOfflineNews;
  403.  
  404.     if (fep->msg_menu_items) XP_FREE(fep->msg_menu_items);
  405.     if (fep->from_menu_items) XP_FREE(fep->from_menu_items);
  406.  
  407.     delete m_prefsDataOfflineNews;
  408. }
  409.  
  410. // Member:       create
  411. // Description:  Creates page for OfflineNews
  412. // Inputs:
  413. // Side effects: 
  414.  
  415. void XFE_PrefsPageOfflineNews::create()
  416. {
  417.     Widget            kids[100];
  418.     Arg               av[50];
  419.     int               ac;
  420.     int               i;
  421.  
  422.     PrefsDataOfflineNews *fep = NULL;
  423.  
  424.     fep = new PrefsDataOfflineNews;
  425.     memset(fep, 0, sizeof(PrefsDataOfflineNews));
  426.     m_prefsDataOfflineNews = fep;
  427.  
  428.     fep->context = getContext();
  429.     fep->prompt_dialog = getPrefsDialog()->getDialogChrome();
  430.  
  431.     Widget form;
  432.  
  433.     ac = 0;
  434.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
  435.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
  436.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  437.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  438.     form = XmCreateForm (m_wPageForm, "offlineNews", av, ac);
  439.     XtManageChild (form);
  440.     m_wPage = fep->page = form;
  441.  
  442.     // Message Download
  443.  
  444.     Widget frame1;
  445.  
  446.     ac = 0;
  447.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  448.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  449.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
  450.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
  451.     frame1 = XmCreateFrame (form, "downloadFrame", av, ac);
  452.  
  453.     Widget form1;
  454.  
  455.     ac = 0;
  456.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  457.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  458.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
  459.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
  460.     form1 = XmCreateForm (frame1, "downloadBox", av, ac);
  461.  
  462.     Widget label1;
  463.  
  464.     ac = 0;
  465.     XtSetArg (av [ac], XmNchildType, XmFRAME_TITLE_CHILD); ac++;
  466.     label1 = XmCreateLabelGadget (frame1, "downloadBoxLabel", av, ac);
  467.  
  468.     Widget     download_msgs_label;
  469.     Widget     download_by_date_toggle;
  470.     Widget     download_date_from_toggle;
  471.     Widget     download_date_since_toggle;
  472.     Widget     msg_pulldown;
  473.     Widget     msg_option;
  474.     Widget     from_pulldown;
  475.     Widget     from_option;
  476.     Widget     num_days_text;
  477.     Widget     msgs_label;
  478.     Widget     days_ago_label;
  479.  
  480.     ac = 0;
  481.     i = 0;
  482.  
  483.     kids[i++] = download_msgs_label = XmCreateLabelGadget(form1,
  484.                                                           "downloadMsgs",
  485.                                                           av, ac);
  486.  
  487.     kids[i++] = download_by_date_toggle = XmCreateToggleButtonGadget (form1,
  488.                                                                       "downloadByDate",
  489.                                                                       av, ac);
  490.     fep->download_by_date_toggle = download_by_date_toggle;
  491.  
  492.     kids[i++] = download_date_from_toggle = XmCreateToggleButtonGadget (form1,
  493.                                                                         "downloadDateFrom",
  494.                                                                         av, ac);
  495.     fep->download_date_from_toggle = download_date_from_toggle;
  496.  
  497.     kids[i++] = download_date_since_toggle = XmCreateToggleButtonGadget (form1,
  498.                                                                          "downloadDateSince",
  499.                                                                          av, ac);
  500.     fep->download_date_since_toggle = download_date_since_toggle;
  501.  
  502.     kids[i++] = msgs_label = XmCreateLabelGadget (form1, "msgsLabel", av, ac);
  503.     kids[i++] = days_ago_label = XmCreateLabelGadget (form1, "daysAgoLabel", av, ac);
  504.  
  505.     kids[i++] = num_days_text = fe_CreateTextField (form1, "numDays", av, ac);
  506.     fep->num_days_text = num_days_text;
  507.  
  508.     Visual    *v = 0;
  509.     Colormap   cmap = 0;
  510.     Cardinal   depth = 0;
  511.     
  512.     XtVaGetValues (getPrefsDialog()->getPrefsParent(),
  513.                    XtNvisual, &v,
  514.                    XtNcolormap, &cmap,
  515.                    XtNdepth, &depth, 
  516.                    0);
  517.  
  518.     ac = 0;
  519.     XtSetArg (av[ac], XmNvisual, v); ac++;
  520.     XtSetArg (av[ac], XmNdepth, depth); ac++;
  521.     XtSetArg (av[ac], XmNcolormap, cmap); ac++;
  522.     msg_pulldown = XmCreatePulldownMenu (form1, "msgPullDown", av, ac);
  523.     fep->msg_pulldown = msg_pulldown;
  524.  
  525.     ac = 0;
  526.     XtSetArg (av [ac], XmNsubMenuId, fep->msg_pulldown); ac++;
  527.     kids[i++] = msg_option = fe_CreateOptionMenu (form1, "msgMenu", av, ac);
  528.     fep->msg_option = msg_option;
  529.     fe_create_download_messages(fep);
  530.     fe_UnmanageChild_safe(XmOptionLabelGadget(fep->msg_option));
  531.  
  532.     ac = 0;
  533.     XtSetArg (av[ac], XmNvisual, v); ac++;
  534.     XtSetArg (av[ac], XmNdepth, depth); ac++;
  535.     XtSetArg (av[ac], XmNcolormap, cmap); ac++;
  536.     from_pulldown = XmCreatePulldownMenu (form1, "fromPullDown", av, ac);
  537.     fep->from_pulldown = from_pulldown;
  538.  
  539.     ac = 0;
  540.     XtSetArg (av [ac], XmNsubMenuId, fep->from_pulldown); ac++;
  541.     kids[i++] = from_option = fe_CreateOptionMenu (form1, "fromMenu", av, ac);
  542.     fep->from_option = from_option;
  543.     fe_create_download_from(fep);
  544.     fe_UnmanageChild_safe(XmOptionLabelGadget(fep->from_option));
  545.  
  546.     int labels_height;
  547.     labels_height = XfeVaGetTallestWidget(msg_option,
  548.                                           download_msgs_label,
  549.                                           num_days_text,
  550.                                           msgs_label,
  551.                                           NULL);
  552.     
  553.     XtVaSetValues (download_msgs_label,
  554.                    XmNheight, labels_height,
  555.                    XmNtopAttachment, XmATTACH_FORM,
  556.                    XmNleftAttachment, XmATTACH_FORM,
  557.                    XmNbottomAttachment, XmATTACH_NONE,
  558.                    XmNrightAttachment, XmATTACH_NONE,
  559.                    0);
  560.  
  561.     XtVaSetValues (download_by_date_toggle,
  562.                    XmNheight, labels_height,
  563.                    XmNindicatorType, XmN_OF_MANY,
  564.                    XmNtopAttachment, XmATTACH_WIDGET,
  565.                    XmNtopWidget, download_msgs_label,
  566.                    XmNbottomAttachment, XmATTACH_NONE,
  567.                    XmNleftAttachment, XmATTACH_FORM,
  568.                    XmNrightAttachment, XmATTACH_NONE,
  569.                    0);
  570.  
  571.     XtVaSetValues (msg_option,
  572.                    XmNheight, labels_height,
  573.                    XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  574.                    XmNtopWidget, download_msgs_label,
  575.                    XmNleftAttachment, XmATTACH_WIDGET,
  576.                    XmNleftWidget, download_msgs_label,
  577.                    XmNbottomAttachment, XmATTACH_NONE,
  578.                    XmNrightAttachment, XmATTACH_NONE,
  579.                    0);
  580.  
  581.     XtVaSetValues (msgs_label,
  582.                    XmNalignment, XmALIGNMENT_BEGINNING,
  583.                    XmNheight, labels_height,
  584.                    XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  585.                    XmNtopWidget, download_msgs_label,
  586.                    XmNleftAttachment, XmATTACH_WIDGET,
  587.                    XmNleftWidget, msg_option,
  588.                    XmNbottomAttachment, XmATTACH_NONE,
  589.                    XmNrightAttachment, XmATTACH_NONE,
  590.                    0);
  591.  
  592.     Dimension spacing;
  593.     Dimension toggle_width;
  594.     XtVaGetValues(download_by_date_toggle,
  595.                   XmNindicatorSize, &toggle_width,
  596.                   XmNspacing, &spacing,
  597.                   NULL);
  598.  
  599.     XtVaSetValues(download_date_from_toggle,
  600.                   XmNindicatorType, XmONE_OF_MANY,
  601.                   XmNheight, labels_height,
  602.                   XmNtopAttachment, XmATTACH_WIDGET,
  603.                   XmNtopWidget, download_by_date_toggle,
  604.                   XmNleftAttachment, XmATTACH_FORM,
  605.                   XmNleftOffset, toggle_width+spacing,
  606.                   XmNbottomAttachment, XmATTACH_NONE,
  607.                   XmNrightAttachment, XmATTACH_NONE,
  608.                   0);
  609.  
  610.     XtVaSetValues(download_date_since_toggle,
  611.                   XmNindicatorType, XmONE_OF_MANY,
  612.                   XmNheight, labels_height,
  613.                   XmNtopAttachment, XmATTACH_WIDGET,
  614.                   XmNtopWidget,download_date_from_toggle,
  615.                   XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  616.                   XmNleftWidget, download_date_from_toggle,
  617.                   XmNbottomAttachment, XmATTACH_NONE,
  618.                   XmNrightAttachment, XmATTACH_NONE,
  619.                   0);
  620.  
  621.     XtVaSetValues(from_option,
  622.                   XmNheight, labels_height,
  623.                   XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  624.                   XmNtopWidget,download_date_from_toggle,
  625.                   XmNleftAttachment, XmATTACH_WIDGET,
  626.                   XmNleftWidget, download_date_from_toggle,
  627.                   XmNbottomAttachment, XmATTACH_NONE,
  628.                   XmNrightAttachment, XmATTACH_NONE,
  629.                   0);
  630.  
  631.     XtVaSetValues(num_days_text,
  632.                   XmNcolumns, 6,
  633.                   XmNheight, labels_height,
  634.                   XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  635.                   XmNtopWidget,download_date_since_toggle,
  636.                   XmNleftAttachment, XmATTACH_WIDGET,
  637.                   XmNleftWidget, download_date_since_toggle,
  638.                   XmNbottomAttachment, XmATTACH_NONE,
  639.                   XmNrightAttachment, XmATTACH_NONE,
  640.                   0);
  641.  
  642.     XtVaSetValues(days_ago_label,
  643.                   XmNalignment, XmALIGNMENT_BEGINNING,
  644.                   XmNheight, labels_height,
  645.                   XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  646.                   XmNtopWidget,download_date_since_toggle,
  647.                   XmNleftAttachment, XmATTACH_WIDGET,
  648.                   XmNleftWidget, num_days_text,
  649.                   XmNbottomAttachment, XmATTACH_NONE,
  650.                   XmNrightAttachment, XmATTACH_NONE,
  651.                   0);
  652.  
  653.     XtManageChildren (kids, i);
  654.     XtManageChild (label1);
  655.     XtManageChild (form1);
  656.     XtManageChild(frame1);
  657.  
  658.     Widget frame2;
  659.  
  660.     ac = 0;
  661.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  662.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  663.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
  664.     XtSetArg (av [ac], XmNtopWidget, frame1); ac++;
  665.     XtSetArg (av [ac], XmNtopOffset, 8); ac++;
  666.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
  667.     frame2 = XmCreateFrame (form, "frame2", av, ac);
  668.  
  669.     Widget form2;
  670.  
  671.     ac = 0;
  672.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  673.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  674.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
  675.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
  676.     form2 = XmCreateForm (frame2, "form2", av, ac);
  677.  
  678.     Widget discussion_label;
  679.     Widget discussion_label2;
  680.     Widget select_discussion_button;
  681.  
  682.     ac = 0;
  683.     i = 0;
  684.  
  685.     kids[i++] = discussion_label = 
  686.         XmCreateLabelGadget(form2, "discussionLabel", av, ac);
  687.  
  688.     kids[i++] = discussion_label2 = 
  689.         XmCreateLabelGadget(form2, "discussionLabel2", av, ac);
  690.  
  691.     kids[i++] = select_discussion_button =
  692.         XmCreatePushButtonGadget(form2, "selectDiscussion", av, ac);
  693.  
  694.     XtVaSetValues(discussion_label,
  695.                   XmNalignment, XmALIGNMENT_BEGINNING,
  696.                   XmNtopAttachment, XmATTACH_FORM,
  697.                   XmNleftAttachment, XmATTACH_FORM,
  698.                   XmNbottomAttachment, XmATTACH_NONE,
  699.                   XmNrightAttachment, XmATTACH_NONE,
  700.                   0);
  701.  
  702.     Dimension label_width = XfeWidth(discussion_label);
  703.     Dimension button_width = XfeWidth(select_discussion_button);
  704.     int offset = (label_width - button_width) / 2;
  705.     if (offset < 0) offset = 0;
  706.  
  707.     XtVaSetValues(select_discussion_button,
  708.                   XmNtopAttachment, XmATTACH_WIDGET,
  709.                   XmNtopWidget, discussion_label,
  710.                   XmNtopOffset, 8,
  711.                   XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  712.                   XmNleftWidget, discussion_label,
  713.                   XmNleftOffset, offset,
  714.                   XmNbottomAttachment, XmATTACH_NONE,
  715.                   XmNrightAttachment, XmATTACH_NONE,
  716.                   0);
  717.  
  718.     label_width = XfeWidth(discussion_label);
  719.     Dimension label_width2 = XfeWidth(discussion_label2);
  720.     offset = (label_width - label_width2) / 2;
  721.     if (offset < 0) offset = 0;
  722.  
  723.     XtVaSetValues(discussion_label2,
  724.                   XmNalignment, XmALIGNMENT_BEGINNING,
  725.                   XmNtopAttachment, XmATTACH_WIDGET,
  726.                   XmNtopWidget, select_discussion_button,
  727.                   XmNtopOffset, 4,
  728.                   XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  729.                   XmNleftWidget, discussion_label,
  730.                   XmNleftOffset, offset,
  731.                   XmNbottomAttachment, XmATTACH_NONE,
  732.                   XmNrightAttachment, XmATTACH_NONE,
  733.                   0);
  734.  
  735.     XtManageChildren(kids, i);
  736.     XtManageChild(form2);
  737.     XtManageChild(frame2);
  738.  
  739.     XtAddCallback(download_date_from_toggle, XmNvalueChangedCallback, cb_toggleDownLoadByDate, fep);
  740.     XtAddCallback(download_date_since_toggle, XmNvalueChangedCallback, cb_toggleDownLoadByDate, fep);
  741.  
  742.     setCreated(TRUE);
  743. }
  744.  
  745. // Member:       init
  746. // Description:  Initializes page for OfflineNews
  747. // Inputs:
  748. // Side effects: 
  749.  
  750. void XFE_PrefsPageOfflineNews::init()
  751. {
  752.     XP_ASSERT(m_prefsDataOfflineNews);
  753.  
  754.     PrefsDataOfflineNews *fep = m_prefsDataOfflineNews;
  755.     XFE_GlobalPrefs  *prefs = &fe_globalPrefs;
  756.  
  757.     // Message download
  758.  
  759.     // messages
  760.  
  761.     if (prefs->offline_news_download_unread) 
  762.         XtVaSetValues(fep->msg_option,
  763.                       XmNmenuHistory, fep->msg_menu_items[OFFLINE_NEWS_DL_UNREAD_ONLY], 
  764.                       0);
  765.     else 
  766.         XtVaSetValues(fep->msg_option,
  767.                       XmNmenuHistory, fep->msg_menu_items[OFFLINE_NEWS_DL_ALL], 
  768.                       0);
  769.  
  770.     // download by date
  771.  
  772.     XtVaSetValues(fep->download_by_date_toggle,
  773.                   XmNset, prefs->offline_news_download_by_date,
  774.                   0);
  775.  
  776.     XtVaSetValues(fep->download_date_from_toggle,
  777.                   XmNset, ! prefs->offline_news_download_use_days,
  778.                   0);
  779.  
  780.     XtVaSetValues(fep->download_date_since_toggle,
  781.                   XmNset, prefs->offline_news_download_use_days,
  782.                   0);
  783.  
  784.     XtVaSetValues(fep->from_option,
  785.                   XmNmenuHistory, fep->from_menu_items[prefs->offline_news_download_inc], 
  786.                   0);
  787.  
  788.     char buf[256];
  789.     PR_snprintf(buf, sizeof(buf), "%d", prefs->offline_news_download_days);
  790.     XtVaSetValues(fep->num_days_text, XmNvalue, buf, 0);
  791.  
  792.     setInitialized(TRUE);
  793. }
  794.  
  795. // Member:       install
  796. // Description:  
  797. // Inputs:
  798. // Side effects: 
  799.  
  800. void XFE_PrefsPageOfflineNews::install()
  801. {
  802.     fe_installOfflineNews();
  803. }
  804.  
  805. // Member:       save
  806. // Description:  
  807. // Inputs:
  808. // Side effects: 
  809.  
  810. void XFE_PrefsPageOfflineNews::save()
  811. {
  812.     PrefsDataOfflineNews *fep = m_prefsDataOfflineNews;
  813.  
  814.     XP_ASSERT(fep);
  815.     if (! verify()) return;
  816.  
  817.     Widget  button;
  818.     int     user_data;
  819.     Boolean b;
  820.  
  821.     XtVaGetValues(fep->msg_option, XmNmenuHistory, &button, 0);
  822.     if (button) {
  823.         XtVaGetValues(button, XmNuserData, &user_data, 0);
  824.         fe_globalPrefs.offline_news_download_unread = (user_data == OFFLINE_NEWS_DL_UNREAD_ONLY);
  825.     }
  826.  
  827.     XtVaGetValues(fep->download_by_date_toggle, XmNset, &b, 0);
  828.     fe_globalPrefs.offline_news_download_by_date = b;
  829.  
  830.     XtVaGetValues(fep->download_date_since_toggle, XmNset, &b, 0);
  831.     fe_globalPrefs.offline_news_download_use_days = b;
  832.  
  833.     XtVaGetValues(fep->from_option, XmNmenuHistory, &button, 0);
  834.     if (button) {
  835.         XtVaGetValues(button, XmNuserData, &user_data, 0);
  836.         fe_globalPrefs.offline_news_download_inc = user_data;
  837.     }
  838.  
  839.     char *text;
  840.     char  dummy;
  841.     int   size = 0;
  842.  
  843.     XtVaGetValues(fep->num_days_text, XmNvalue, &text, 0);
  844.     if (1 == sscanf(text, " %d %c", &size, &dummy) &&
  845.         size >= 0)
  846.         fe_globalPrefs.offline_news_download_days = size;
  847.     if (text) XtFree(text);
  848.  
  849.     // Install preferences
  850.  
  851.     install();
  852. }
  853.  
  854. // Member:       getData
  855. // Description:  
  856. // Inputs:
  857. // Side effects: 
  858.  
  859. PrefsDataOfflineNews *XFE_PrefsPageOfflineNews::getData()
  860. {
  861.     return m_prefsDataOfflineNews;
  862. }
  863.  
  864. // Member:       cb_toggleDownLoadByDate
  865. // Description:  
  866. // Inputs:
  867. // Side effects: 
  868.  
  869. void XFE_PrefsPageOfflineNews::cb_toggleDownLoadByDate(Widget    w,
  870.                                                        XtPointer closure,
  871.                                                        XtPointer callData)
  872. {
  873.     XmToggleButtonCallbackStruct *cb = (XmToggleButtonCallbackStruct *)callData;
  874.     PrefsDataOfflineNews         *fep = (PrefsDataOfflineNews *)closure;
  875.  
  876.     if (! cb->set) {
  877.         XtVaSetValues(w, XmNset, True, 0);
  878.     }
  879.     else if (w == fep->download_date_from_toggle) {
  880.         XtVaSetValues(fep->download_date_since_toggle, XmNset, False, 0);
  881.     }
  882.     else if (w == fep->download_date_since_toggle) {
  883.         XtVaSetValues(fep->download_date_from_toggle, XmNset, False, 0);
  884.     }
  885.     else
  886.         abort();    
  887. }
  888.  
  889. static void fe_create_download_messages(PrefsDataOfflineNews *fep)
  890. {
  891.     int              ac;
  892.     int              i;
  893.     int              count;
  894.     Arg              av[50];
  895.     char            *label;
  896.     Widget           button;
  897.     XmString         xms;
  898.  
  899.     count = XtNumber(downloadMessages); 
  900.     fep->msg_menu_items = (Widget *)XP_CALLOC(count, sizeof(Widget));
  901.  
  902.     for (i = 0; i < count; i++)    {
  903.         label = XP_GetString(*downloadMessages[i]);
  904.  
  905.         ac = 0;
  906.         xms = XmStringCreateLtoR(label, XmFONTLIST_DEFAULT_TAG);
  907.         XtSetArg(av[ac], XmNlabelString, xms); ac++;
  908.         button = XmCreatePushButtonGadget(fep->msg_pulldown, label, av, ac);
  909.         fep->msg_menu_items[i] = button;
  910.         XmStringFree(xms);
  911.  
  912.         XtVaSetValues(button, XmNuserData, i, NULL);
  913.         XtManageChild(button);
  914.     }
  915. }
  916.  
  917. static void fe_create_download_from(PrefsDataOfflineNews *fep)
  918. {
  919.     int              ac;
  920.     int              i;
  921.     int              count;
  922.     Arg              av[50];
  923.     char            *label;
  924.     Widget           button;
  925.     XmString         xms;
  926.  
  927.     count = XtNumber(downloadFrom); 
  928.     fep->from_menu_items = (Widget *)XP_CALLOC(count, sizeof(Widget));
  929.  
  930.     for (i = 0; i < count; i++)    {
  931.         label = XP_GetString(*downloadFrom[i]);
  932.  
  933.         ac = 0;
  934.         xms = XmStringCreateLtoR(label, XmFONTLIST_DEFAULT_TAG);
  935.         XtSetArg(av[ac], XmNlabelString, xms); ac++;
  936.         button = XmCreatePushButtonGadget(fep->from_pulldown, label, av, ac);
  937.         fep->from_menu_items[i] = button;
  938.         XmStringFree(xms);
  939.  
  940.         XtVaSetValues(button, XmNuserData, i, NULL);
  941.         XtManageChild(button);
  942.     }
  943. }
  944.  
  945.  
  946.