home *** CD-ROM | disk | FTP | other *** search
/ Tools / WinSN5.0Ver.iso / NETSCAP.50 / WIN1998.ZIP / ns / cmd / xfe / src / PrefsDialogMailnews.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1998-04-08  |  137.9 KB  |  4,603 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.    PrefsDialogMailnews.cpp -- the Mail/News page in XFE preferences dialogs
  20.    Created: Linda Wei <lwei@netscape.com>, 17-Sep-96.
  21.  */
  22.  
  23. #include "MozillaApp.h"
  24. #include "felocale.h"
  25. #include "structs.h"
  26. #include "fonts.h"
  27. #include "xpassert.h"
  28. #include "xfe.h"
  29. #include "msgcom.h"
  30. #include "e_kit.h"
  31. #include "prprf.h"
  32. extern "C" {
  33. #include "prnetdb.h"
  34. }
  35. #include "PrefsDialog.h"
  36. #ifdef MOZ_MAIL_NEWS
  37. #include "PrefsMserverMore.h"
  38. #include "PrefsMsgMore.h"
  39. #include "ColorDialog.h"
  40. #include "PrefsLdapProp.h"
  41. #include "dirprefs.h"
  42. #include "addrbk.h"
  43. #include "dirprefs.h"
  44. #include "xp_list.h"
  45. #endif
  46. #include "prefapi.h"
  47.  
  48. #include <Xm/DrawnB.h>
  49. #include <Xm/Label.h>
  50. #include <Xm/LabelG.h>
  51. #include <Xm/CascadeBG.h>
  52. #include <Xm/PushB.h>
  53. #include <Xm/PushBG.h>
  54. #include <Xm/ToggleB.h>
  55. #include <Xm/ArrowBG.h>
  56. #include <Xm/Form.h>
  57. #include <Xm/Frame.h>
  58. #include <Xm/RowColumn.h>
  59. #include <Xm/LabelG.h> 
  60. #include <Xm/TextF.h> 
  61. #include <Xm/ToggleBG.h> 
  62. #include <DtWidgets/ComboBox.h>
  63. #include <Xfe/Xfe.h>
  64.  
  65. #define COLOR_STRING_BLACK "black"
  66.  
  67. extern int XFE_EMPTY_DIR;
  68. extern int XFE_PREFS_MAIL_FOLDER_SENT;
  69. extern int XFE_WARNING;
  70. extern int XFE_HOST_IS_UNKNOWN;
  71. extern int XFE_NEWS_DIR;
  72. extern int XFE_MAIL_HOST;
  73. extern int XFE_NEWS_HOST;
  74. extern int XFE_DIR_DOES_NOT_EXIST;
  75. extern int XFE_PREF_STYLE;
  76. extern int XFE_PREF_SIZE;
  77. extern int XFE_OUT_OF_MEMORY_URL;
  78. extern int XFE_PREFS_CR_CARD;
  79. extern int XFE_PREFS_LABEL_STYLE_PLAIN;
  80. extern int XFE_PREFS_LABEL_STYLE_BOLD;
  81. extern int XFE_PREFS_LABEL_STYLE_ITALIC;
  82. extern int XFE_PREFS_LABEL_STYLE_BOLDITALIC;
  83. extern int XFE_PREFS_LABEL_SIZE_NORMAL;
  84. extern int XFE_PREFS_LABEL_SIZE_BIGGER;
  85. extern int XFE_PREFS_LABEL_SIZE_SMALLER;
  86. extern int XFE_EMPTY_EMAIL_ADDR;
  87. extern int MK_MSG_MAIL_DIRECTORY_CHANGED;
  88.  
  89. #define OUTLINER_GEOMETRY_PREF "preferences.dir.outliner_geometry"
  90.  
  91. extern "C"
  92. {
  93. #ifdef MOZ_MAIL_NEWS
  94.     void      MIME_ConformToStandard(XP_Bool conform_p);
  95.     void      MSG_SetBiffStatFile(const char* filename);
  96.     void      MSG_SetFolderDirectory(MSG_Prefs* prefs, const char* directory);
  97.     void      NET_SetMailRelayHost(char * host);
  98.     void      NET_SetNewsHost(const char * hostname);
  99.     void      NET_SetPopUsername(const char *username);
  100.     void      fe_browse_file_of_text(MWContext *context, Widget text_field, Boolean dirp);
  101.     void      fe_installMailNews();
  102.     void      fe_installMailNewsComposition();
  103.     void      fe_installMailNewsMserver();
  104.     void      fe_installMailNewsNserver();
  105.     void      fe_installMailNewsAddrBook();
  106.     XP_List  *FE_GetDirServers();
  107.     ABook    *fe_GetABook(MWContext *context);
  108.     void      fe_showABCardPropertyDlg(Widget parent,
  109.                                        MWContext *context,
  110.                                        ABID entry,
  111.                                        XP_Bool newuser);
  112.     void      fe_SwatchSetColor(Widget widget, LO_Color* color);
  113.  
  114.     static void fe_set_quoted_text_styles(PrefsDataMailNews *);
  115.     static void fe_set_quoted_text_sizes(PrefsDataMailNews *);
  116.     static void fe_fcc_add_folders(XP_List *paths, XP_List *folders, 
  117.                                    MSG_FolderInfo *info, 
  118.                                    char *default_folder_path,
  119.                                    int default_folder_index, int depth);
  120.     static char *fe_GetFolderPathFromInfo(MSG_FolderInfo *f);
  121.     static char *fe_GetFolderNameFromInfo(MSG_FolderInfo *f);
  122. #endif // MOZ_MAIL_NEWS
  123.     char     *XP_GetString(int i);
  124.     void      fe_installMailNewsIdentity();
  125. }
  126.  
  127. #ifdef MOZ_MAIL_NEWS
  128. struct _quotedTextStyle {
  129.     MSG_FONT               style;
  130.     int                   *defaultLabelId;
  131. } quotedTextStyles[] = {
  132.     {
  133.         MSG_PlainFont,
  134.         &XFE_PREFS_LABEL_STYLE_PLAIN,
  135.     },
  136.     {
  137.         MSG_BoldFont,
  138.         &XFE_PREFS_LABEL_STYLE_BOLD,
  139.     },
  140.     {
  141.         MSG_ItalicFont,
  142.         &XFE_PREFS_LABEL_STYLE_ITALIC,
  143.     },
  144.     {
  145.         MSG_BoldItalicFont,
  146.         &XFE_PREFS_LABEL_STYLE_BOLDITALIC,
  147.     },
  148. };
  149.  
  150. struct _quotedTextSize {
  151.     MSG_CITATION_SIZE      size;
  152.     int                   *defaultLabelId;
  153. } quotedTextSizes[] = {
  154.     {
  155.         MSG_NormalSize,
  156.         &XFE_PREFS_LABEL_SIZE_NORMAL,
  157.     },
  158.     {
  159.         MSG_Bigger,
  160.         &XFE_PREFS_LABEL_SIZE_BIGGER,
  161.     },
  162.     {
  163.         MSG_Smaller,
  164.         &XFE_PREFS_LABEL_SIZE_SMALLER,
  165.     },
  166. };
  167. #endif // MOZ_MAIL_NEWS
  168.  
  169. #ifdef MOZ_MAIL_NEWS
  170. // ************************************************************************
  171. // ************************      Mail News        *************************
  172. // ************************************************************************
  173.  
  174. // Member:       XFE_PrefsPageMailNews
  175. // Description:  Constructor
  176. // Inputs:
  177. // Side effects: 
  178.  
  179. XFE_PrefsPageMailNews::XFE_PrefsPageMailNews(XFE_PrefsDialog *dialog)
  180.     : XFE_PrefsPage(dialog),
  181.       m_prefsDataMailNews(0),
  182.       m_refresh_needed(FALSE)
  183. {
  184. }
  185.  
  186. // Member:       ~XFE_PrefsPageMailNews
  187. // Description:  Destructor
  188. // Inputs:
  189. // Side effects: 
  190.  
  191. XFE_PrefsPageMailNews::~XFE_PrefsPageMailNews()
  192. {
  193.     PrefsDataMailNews     *fep = m_prefsDataMailNews;
  194.     char                  *orig_color_name;
  195.  
  196.     XtVaGetValues(fep->quoted_text_color_button,
  197.                   XmNuserData, &orig_color_name,
  198.                   NULL);
  199.     if (orig_color_name) XtFree(orig_color_name);
  200.  
  201.     delete m_prefsDataMailNews;
  202. }
  203.  
  204. // Member:       create
  205. // Description:  Creates page for MailNews/
  206. // Inputs:
  207. // Side effects: 
  208.  
  209. void XFE_PrefsPageMailNews::create()
  210. {
  211.     Widget            kids[100];
  212.     Arg               av[50];
  213.     int               ac;
  214.     int               i;
  215.  
  216.     PrefsDataMailNews *fep = NULL;
  217.  
  218.     fep = new PrefsDataMailNews;
  219.     memset(fep, 0, sizeof(PrefsDataMailNews));
  220.     m_prefsDataMailNews = fep;
  221.  
  222.     fep->context = getContext();
  223.     fep->prompt_dialog = getPrefsDialog()->getDialogChrome();
  224.  
  225.     Widget form;
  226.  
  227.     ac = 0;
  228.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
  229.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
  230.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  231.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  232.     form = XmCreateForm (m_wPageForm, "mailnews", av, ac);
  233.     XtManageChild (form);
  234.     m_wPage = fep->page = form;
  235.  
  236.     // plain quoted text
  237.  
  238.     Widget frame1;
  239.  
  240.     ac = 0;
  241.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  242.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  243.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
  244.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
  245.     frame1 = XmCreateFrame (form, "quotedFrame", av, ac);
  246.  
  247.     Widget form1;
  248.  
  249.     ac = 0;
  250.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  251.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  252.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
  253.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
  254.     form1 = XmCreateForm (frame1, "quotedBox", av, ac);
  255.  
  256.     Widget label1;
  257.  
  258.     ac = 0;
  259.     XtSetArg (av [ac], XmNchildType, XmFRAME_TITLE_CHILD); ac++;
  260.     label1 = XmCreateLabelGadget (frame1, "quotedTextLabel", av, ac);
  261.  
  262.     Visual    *v = 0;
  263.     Colormap   cmap = 0;
  264.     Cardinal   depth = 0;
  265.  
  266.     i = 0;
  267.     ac = 0;
  268.  
  269.     XtVaGetValues (getPrefsDialog()->getPrefsParent(),
  270.                    XtNvisual, &v,
  271.                    XtNcolormap, &cmap,
  272.                    XtNdepth, &depth, 
  273.                    0);
  274.  
  275.     // Quoted text - style, size, color
  276.  
  277.     Widget quoted_text_style_label;
  278.  
  279.     ac = 0;
  280.     kids[i++] = quoted_text_style_label =
  281.         XmCreateLabelGadget(form1, "quotedTextStyleLabel", av, ac);
  282.  
  283.     ac = 0;
  284.     XtSetArg(av[ac], XmNvisual, v); ac++;
  285.     XtSetArg(av[ac], XmNdepth, depth); ac++;
  286.     XtSetArg(av[ac], XmNcolormap, cmap); ac++;
  287.     fep->quoted_text_style_pulldown = 
  288.         XmCreatePulldownMenu (form1, "quotedTextStylePullDown", av, ac);
  289.  
  290.     ac = 0;
  291.     XtSetArg (av [ac], XmNsubMenuId, fep->quoted_text_style_pulldown); ac++;
  292.     kids[i++] = fep->quoted_text_style_option = 
  293.         fe_CreateOptionMenu (form1, "quotedTextStyleMenu", av, ac);
  294.     fe_set_quoted_text_styles(fep);
  295.     fe_UnmanageChild_safe(XmOptionLabelGadget(fep->quoted_text_style_option));
  296.  
  297.     Widget quoted_text_size_label;
  298.  
  299.     ac = 0;
  300.     kids[i++] = quoted_text_size_label = 
  301.         XmCreateLabelGadget (form1, "quotedTextSizeLabel", av, ac);
  302.  
  303.     ac = 0;
  304.     XtSetArg (av[ac], XmNvisual, v); ac++;
  305.     XtSetArg (av[ac], XmNdepth, depth); ac++;
  306.     XtSetArg (av[ac], XmNcolormap, cmap); ac++;
  307.     fep->quoted_text_size_pulldown = 
  308.         XmCreatePulldownMenu (form1, "quotedTextSizePullDown", av, ac);
  309.  
  310.     ac = 0;
  311.     XtSetArg (av [ac], XmNsubMenuId, fep->quoted_text_size_pulldown); ac++;
  312.     kids[i++] = fep->quoted_text_size_option =
  313.         fe_CreateOptionMenu (form1, "quotedTextSizeMenu", av, ac);
  314.     fe_set_quoted_text_sizes(fep);
  315.     fe_UnmanageChild_safe(XmOptionLabelGadget(fep->quoted_text_size_option));
  316.  
  317.     // color button
  318.  
  319.     Widget quoted_text_color_label;
  320.  
  321.     ac = 0;
  322.     kids[i++] = quoted_text_color_label =
  323.         XmCreateLabelGadget(form1, "quotedTextColorLabel", av, ac);
  324.  
  325.     ac = 0;
  326.     kids[i++] = fep->quoted_text_color_button =
  327.         XmCreateDrawnButton(form1, "quotedTextColorButton", av, ac);
  328.  
  329.     int labels_width;
  330.     labels_width = XfeVaGetWidestWidget(quoted_text_style_label,
  331.                                         quoted_text_size_label,
  332.                                         quoted_text_color_label,
  333.                                         NULL);
  334.     int labels_height;
  335.     labels_height = XfeVaGetTallestWidget(quoted_text_style_label,
  336.                                           fep->quoted_text_style_option,
  337.                                           fep->quoted_text_color_button,
  338.                                           NULL);
  339.  
  340.     XtVaSetValues (quoted_text_style_label,
  341.                    XmNheight, labels_height,
  342.                    XmNleftAttachment, XmATTACH_NONE,
  343.                    RIGHT_JUSTIFY_VA_ARGS(quoted_text_style_label,labels_width),
  344.                    XmNtopAttachment, XmATTACH_FORM,
  345.                    XmNbottomAttachment, XmATTACH_NONE,
  346.                    XmNrightAttachment, XmATTACH_NONE,
  347.                    0);
  348.  
  349.     XtVaSetValues (fep->quoted_text_style_option,
  350.                    XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  351.                    XmNtopWidget, quoted_text_style_label,
  352.                    XmNtopOffset, (-5),
  353.                    XmNbottomAttachment, XmATTACH_NONE,
  354.                    XmNleftAttachment, XmATTACH_WIDGET,
  355.                    XmNleftWidget, quoted_text_style_label,
  356.                    XmNrightAttachment, XmATTACH_NONE,
  357.                    0);
  358.  
  359.     XtVaSetValues (quoted_text_size_label,
  360.                    XmNheight, labels_height,
  361.                    XmNtopAttachment, XmATTACH_WIDGET,
  362.                    XmNtopWidget, fep->quoted_text_style_option,
  363.                    XmNtopOffset, 4,
  364.                    XmNbottomAttachment, XmATTACH_NONE,
  365.                    XmNleftAttachment, XmATTACH_NONE,
  366.                    XmNrightAttachment, XmATTACH_OPPOSITE_WIDGET,
  367.                    XmNrightWidget, quoted_text_style_label,
  368.                    0);
  369.  
  370.     XtVaSetValues (fep->quoted_text_size_option,
  371.                    XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  372.                    XmNtopWidget, quoted_text_size_label,
  373.                    XmNtopOffset, (-5),
  374.                    XmNbottomAttachment, XmATTACH_NONE,
  375.                    XmNleftAttachment, XmATTACH_WIDGET,
  376.                    XmNleftWidget, quoted_text_size_label,
  377.                    XmNrightAttachment, XmATTACH_NONE,
  378.                    0);
  379.  
  380.     XtVaSetValues (quoted_text_color_label,
  381.                    XmNheight, labels_height,
  382.                    XmNtopAttachment, XmATTACH_WIDGET,
  383.                    XmNtopWidget, fep->quoted_text_size_option,
  384.                    XmNtopOffset, 4,
  385.                    XmNbottomAttachment, XmATTACH_NONE,
  386.                    XmNleftAttachment, XmATTACH_NONE,
  387.                    XmNrightAttachment, XmATTACH_OPPOSITE_WIDGET,
  388.                    XmNrightWidget, quoted_text_style_label,
  389.                    0);
  390.  
  391.     XtVaSetValues (fep->quoted_text_color_button,
  392.                    XmNwidth, 40,
  393.                    XmNheight, 20,
  394.                    XmNshadowThickness, 2,
  395.                    XmNuserData, 0,
  396.                    XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  397.                    XmNtopWidget, quoted_text_color_label,
  398.                    XmNtopOffset, 2,
  399.                    XmNbottomAttachment, XmATTACH_NONE,
  400.                    XmNleftAttachment, XmATTACH_WIDGET,
  401.                    XmNleftWidget, quoted_text_color_label,
  402.                    XmNrightAttachment, XmATTACH_NONE,
  403.                    0);
  404.  
  405.     XtManageChildren(kids, i);
  406.     XtManageChild(label1);
  407.     XtManageChild(form1);
  408.     XtManageChild(frame1);
  409.  
  410.     // Display messages/articles with fixed/variable width font
  411.  
  412.     Widget frame2;
  413.  
  414.     ac = 0;
  415.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  416.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  417.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
  418.     XtSetArg (av [ac], XmNtopWidget, frame1); ac++;
  419.     XtSetArg (av [ac], XmNtopOffset, 8); ac++;
  420.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
  421.     frame2 = XmCreateFrame (form, "dpyMsgFrame", av, ac);
  422.  
  423.     Widget form2;
  424.  
  425.     ac = 0;
  426.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  427.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  428.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
  429.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
  430.     form2 = XmCreateForm (frame2, "dpyMsgBox", av, ac);
  431.  
  432.     Widget label2;
  433.  
  434.     ac = 0;
  435.     XtSetArg (av [ac], XmNchildType, XmFRAME_TITLE_CHILD); ac++;
  436.     label2 = XmCreateLabelGadget (frame2, "msgArticleLabel", av, ac);
  437.  
  438.     i = 0;
  439.     ac = 0;
  440.  
  441.     kids[i++] = fep->fixed_width_font_toggle =
  442.         XmCreateToggleButtonGadget(form2, "fixedWidthFont", av, ac);
  443.  
  444.     ac = 0;
  445.     kids[i++] = fep->var_width_font_toggle =
  446.         XmCreateToggleButtonGadget(form2, "varWidthFont", av, ac);
  447.  
  448.     XtVaSetValues (fep->fixed_width_font_toggle,
  449.                    XmNindicatorType, XmONE_OF_MANY,
  450.                    XmNtopAttachment, XmATTACH_FORM,
  451.                    XmNbottomAttachment, XmATTACH_NONE,
  452.                    XmNleftAttachment, XmATTACH_FORM,
  453.                    XmNleftOffset, 16,
  454.                    XmNrightAttachment, XmATTACH_NONE,
  455.                    0);
  456.  
  457.     XtVaSetValues (fep->var_width_font_toggle,
  458.                    XmNindicatorType, XmONE_OF_MANY,
  459.                    XmNtopAttachment, XmATTACH_WIDGET,
  460.                    XmNtopWidget, fep->fixed_width_font_toggle,
  461.                    XmNbottomAttachment, XmATTACH_NONE,
  462.                    XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  463.                    XmNleftWidget, fep->fixed_width_font_toggle,
  464.                    XmNrightAttachment, XmATTACH_NONE,
  465.                    0);
  466.  
  467.     XtManageChildren(kids, i);
  468.     XtManageChild(label2);
  469.     XtManageChild(form2);
  470.     XtManageChild(frame2);
  471.  
  472.     // Frame3
  473.  
  474.     Widget frame3;
  475.  
  476.     ac = 0;
  477.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  478.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  479.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
  480.     XtSetArg (av [ac], XmNtopWidget, frame2); ac++;
  481.     XtSetArg (av [ac], XmNtopOffset, 8); ac++;
  482.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
  483.     frame3 = XmCreateFrame (form, "frame3", av, ac);
  484.  
  485.     Widget form3;
  486.  
  487.     ac = 0;
  488.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  489.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  490.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
  491.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
  492.     form3 = XmCreateForm (frame3, "frame3Box", av, ac);
  493.  
  494.     ac = 0;
  495.     i = 0;
  496.  
  497.     kids[i++] = fep->reuse_thread_window_toggle =
  498.         XmCreateToggleButtonGadget(form3, "reuseThread", av, ac);
  499.  
  500.     kids[i++] = fep->reuse_message_window_toggle =
  501.         XmCreateToggleButtonGadget(form3, "reuseMsg", av, ac);
  502.  
  503.     XtVaSetValues (fep->reuse_thread_window_toggle,
  504.                    XmNindicatorType, XmN_OF_MANY,
  505.                    XmNalignment, XmALIGNMENT_BEGINNING,
  506.                    XmNtopAttachment, XmATTACH_FORM,
  507.                    XmNbottomAttachment, XmATTACH_NONE,
  508.                    XmNleftAttachment, XmATTACH_FORM,
  509.                    XmNrightAttachment, XmATTACH_NONE,
  510.                    0);
  511.  
  512.     XtVaSetValues (fep->reuse_message_window_toggle,
  513.                    XmNindicatorType, XmN_OF_MANY,
  514.                    XmNalignment, XmALIGNMENT_BEGINNING,
  515.                    XmNtopAttachment, XmATTACH_WIDGET,
  516.                    XmNtopWidget, fep->reuse_thread_window_toggle,
  517.                    XmNbottomAttachment, XmATTACH_NONE,
  518.                    XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  519.                    XmNleftWidget, fep->reuse_thread_window_toggle,
  520.                    XmNrightAttachment, XmATTACH_NONE,
  521.                    0);
  522.  
  523.     XtManageChildren(kids, i);
  524.     XtManageChild(form3);
  525.     XtManageChild(frame3);
  526.  
  527.     XtAddCallback(fep->quoted_text_color_button, XmNactivateCallback, 
  528.                   cb_quotedTextColor, this);
  529.  
  530.     XtAddCallback(fep->fixed_width_font_toggle, XmNvalueChangedCallback,
  531.                   cb_toggleMsgFont, fep);
  532.     XtAddCallback(fep->var_width_font_toggle, XmNvalueChangedCallback,
  533.                   cb_toggleMsgFont, fep);
  534.  
  535.     setCreated(TRUE);
  536. }
  537.  
  538. // Member:       init
  539. // Description:  Initializes page for MailNews
  540. // Inputs:
  541. // Side effects: 
  542.  
  543. void XFE_PrefsPageMailNews::init()
  544. {
  545.     XP_ASSERT(m_prefsDataMailNews);
  546.     
  547.     PrefsDataMailNews  *fep = m_prefsDataMailNews;
  548.     XFE_GlobalPrefs    *prefs = &fe_globalPrefs;
  549.     
  550.     // Plain quoted text
  551.  
  552.     // quoted_text_style_option, initialized in fe_set_quoted_text_styles()
  553.     // quoted_text_size_option, initialized in fe_set_quoted_text_sizes()
  554.  
  555.     // quoted text color
  556.  
  557.     LO_Color  color;
  558.     char     *color_string = 0;
  559.     char     *orig_citation_color;
  560.     char      buf[32];
  561.     Boolean   sensitive;
  562.  
  563.     color_string = ((prefs->citation_color) && (XP_STRLEN(prefs->citation_color) > 0)) ?
  564.         prefs->citation_color : COLOR_STRING_BLACK;
  565.     if (! LO_ParseRGB(color_string, &color.red, &color.green, &color.blue))
  566.         LO_ParseRGB(COLOR_STRING_BLACK, &color.red, &color.green, &color.blue);
  567.     sprintf(buf, "#%02x%02x%02x", color.red, color.green, color.blue);
  568.  
  569.     XtVaGetValues(fep->quoted_text_color_button, XmNuserData, &orig_citation_color, NULL);
  570.     if (orig_citation_color) XtFree(orig_citation_color);
  571.     XtVaSetValues(fep->quoted_text_color_button,
  572.                   XmNuserData, XtNewString(buf),
  573.                   NULL);
  574.     fe_SwatchSetColor(fep->quoted_text_color_button, &color);
  575.  
  576.     // If pref is locked, grey it out.
  577.  
  578.     XtSetSensitive(fep->quoted_text_style_pulldown,
  579.                    !PREF_PrefIsLocked("mail.quoted_style"));
  580.     XtSetSensitive(fep->quoted_text_size_pulldown, 
  581.                    !PREF_PrefIsLocked("mail.quoted_size"));
  582.     XtSetSensitive(fep->quoted_text_color_button, 
  583.                    !PREF_PrefIsLocked("mail.citation_color"));
  584.  
  585.     // fixed/var width font
  586.  
  587.     sensitive = !PREF_PrefIsLocked("mail.fixed_width_messages");
  588.     XtVaSetValues (fep->fixed_width_font_toggle,
  589.                    XmNset, prefs->fixed_message_font_p, 
  590.                    XmNsensitive, sensitive,
  591.                    0);
  592.     XtVaSetValues (fep->var_width_font_toggle,
  593.                    XmNset, !prefs->fixed_message_font_p, 
  594.                    XmNsensitive, sensitive,
  595.                    0);
  596.  
  597.     // Reuse thread/msg window
  598.  
  599.     XtVaSetValues(fep->reuse_thread_window_toggle, 
  600.                   XmNset, prefs->reuse_thread_window,
  601.                   XmNsensitive, !PREF_PrefIsLocked("mailnews.reuse_thread_window"),
  602.                   0);
  603.  
  604.     XtVaSetValues(fep->reuse_message_window_toggle,
  605.                   XmNset, prefs->reuse_msg_window,
  606.                   XmNsensitive, !PREF_PrefIsLocked("mailnews.reuse_message_window"),
  607.                   0);
  608.  
  609.     setInitialized(TRUE);
  610. }
  611.  
  612. // Member:       install
  613. // Description:  
  614. // Inputs:
  615. // Side effects: 
  616.  
  617. void XFE_PrefsPageMailNews::install()
  618. {
  619.     fe_installMailNews();
  620.  
  621.     if (m_refresh_needed) {
  622.         // Need to refresh message window
  623.         XFE_MozillaApp::theApp()->notifyInterested(XFE_MozillaApp::refreshMsgWindow);
  624.         m_refresh_needed = FALSE;
  625.     }
  626. }
  627.  
  628. // Member:       save
  629. // Description:  
  630. // Inputs:
  631. // Side effects: 
  632.  
  633. void XFE_PrefsPageMailNews::save()
  634. {
  635.     PrefsDataMailNews *fep = m_prefsDataMailNews;
  636.     Boolean            b;
  637.     
  638.     XP_ASSERT(fep);
  639.     if (! verify()) return;
  640.  
  641.     // quoted text style
  642.  
  643.     Widget     button;
  644.     MSG_FONT   style;
  645.     MSG_FONT   old_style;
  646.  
  647.     old_style = fe_globalPrefs.citation_font;
  648.     XtVaGetValues(fep->quoted_text_style_option, XmNmenuHistory, &button, NULL);
  649.     XtVaGetValues(button, XmNuserData, &style, NULL);
  650.     fe_globalPrefs.citation_font = style;
  651.     if (old_style != style) m_refresh_needed = TRUE;
  652.  
  653.     // quoted text size
  654.  
  655.     MSG_CITATION_SIZE   size;
  656.     MSG_CITATION_SIZE   old_size;
  657.  
  658.     old_size = fe_globalPrefs.citation_size;
  659.     XtVaGetValues(fep->quoted_text_size_option, XmNmenuHistory, &button, NULL);
  660.     XtVaGetValues(button, XmNuserData, &size, NULL);
  661.     fe_globalPrefs.citation_size = size;
  662.     if (old_size != size) m_refresh_needed = TRUE;
  663.  
  664.     // quoted_text_color_button;
  665.  
  666.     char *citation_color;
  667.     citation_color = fe_globalPrefs.citation_color;
  668.     char *selected_citation_color;
  669.     XtVaGetValues(fep->quoted_text_color_button, XmNuserData, &selected_citation_color, NULL);
  670.     fe_globalPrefs.citation_color = (char *)XP_STRDUP(selected_citation_color);
  671.     if (citation_color && fe_globalPrefs.citation_color &&
  672.         XP_STRCASECMP(citation_color, fe_globalPrefs.citation_color))
  673.         m_refresh_needed = TRUE;
  674.     if (citation_color) XP_FREE(citation_color);
  675.  
  676.     // Fixed/var width font
  677.  
  678.     XtVaGetValues (fep->fixed_width_font_toggle, XmNset, &b, 0);
  679.     if (b != fe_globalPrefs.fixed_message_font_p) m_refresh_needed = TRUE;
  680.     fe_globalPrefs.fixed_message_font_p = b;
  681.  
  682.     // Reuse thread/msg window
  683.  
  684.     XtVaGetValues(fep->reuse_thread_window_toggle, XmNset, &b, 0);
  685.     fe_globalPrefs.reuse_thread_window = b;
  686.  
  687.     XtVaGetValues(fep->reuse_message_window_toggle, XmNset, &b, 0);
  688.     fe_globalPrefs.reuse_msg_window = b;
  689.  
  690.     // Install preferences
  691.  
  692.     install();
  693. }
  694.  
  695. // Member:       getData
  696. // Description:  
  697. // Inputs:
  698. // Side effects: 
  699.  
  700. PrefsDataMailNews *XFE_PrefsPageMailNews::getData()
  701. {
  702.     return m_prefsDataMailNews;
  703. }
  704.  
  705. // Member:       prefsMailNewsCompositionCb_toggleMsgFont
  706. // Description:  
  707. // Inputs:
  708. // Side effects: 
  709.  
  710. void XFE_PrefsPageMailNews::cb_toggleMsgFont(Widget    w,
  711.                                              XtPointer closure,
  712.                                              XtPointer callData)
  713. {
  714.     XmToggleButtonCallbackStruct *cb = (XmToggleButtonCallbackStruct *)callData;
  715.     PrefsDataMailNews            *fep = (PrefsDataMailNews *)closure;
  716.  
  717.     if (! cb->set) {
  718.         XtVaSetValues(w, XmNset, True, 0);
  719.     }
  720.     else if (w == fep->fixed_width_font_toggle) {
  721.         XtVaSetValues(fep->var_width_font_toggle, XmNset, False, 0);
  722.     }
  723.     else if (w == fep->var_width_font_toggle) {
  724.         XtVaSetValues(fep->fixed_width_font_toggle, XmNset, False, 0);
  725.     }
  726.     else
  727.         abort();    
  728. }
  729.  
  730. // Member:       cb_quotedTextColor
  731. // Description:  
  732. // Inputs:
  733. // Side effects: 
  734.  
  735. void XFE_PrefsPageMailNews::cb_quotedTextColor(Widget    /* w */,
  736.                                                XtPointer closure,
  737.                                                XtPointer /* callData */)
  738. {
  739.     XFE_PrefsPageMailNews *thePage = (XFE_PrefsPageMailNews *)closure;
  740.     XFE_PrefsDialog       *theDialog = thePage->getPrefsDialog();
  741.     PrefsDataMailNews     *fep = thePage->getData();
  742.  
  743.     // LO_Color color;
  744.     // if (fe_ColorPicker(theDialog->getContext(), &color)) {
  745.     // fe_swatchSetColor(fep->quoted_text_color_button, &color);
  746.     //    }
  747.  
  748.     char   selected_color_name[128];
  749.     Pixel  selected_pixel;
  750.     char  *orig_color_name;
  751.  
  752.     XtVaGetValues(fep->quoted_text_color_button,
  753.                   XmNuserData, &orig_color_name,
  754.                   NULL);
  755.     if (orig_color_name != NULL)
  756.         XP_STRCPY(selected_color_name, orig_color_name);
  757.     else
  758.         selected_color_name[0] = '\0';
  759.  
  760.     if (fe_colorDialog(theDialog->getBaseWidget(), theDialog->getContext(),
  761.                        selected_color_name, &selected_pixel)) {
  762.         if (XP_STRLEN(selected_color_name) > 0) {
  763.             if (orig_color_name &&
  764.                 (! XP_STRCMP(orig_color_name, selected_color_name)))
  765.                 return;
  766.             if (orig_color_name) XtFree(orig_color_name);
  767.             XtVaSetValues(fep->quoted_text_color_button, 
  768.                           XmNbackground, selected_pixel,
  769.                           XmNuserData, XtNewString(selected_color_name),
  770.                           NULL);
  771.         }
  772.     }
  773. }
  774.  
  775. static void fe_set_quoted_text_styles(PrefsDataMailNews     *fep)
  776. {
  777.     int              ac;
  778.     int              i;
  779.     int              numStyles;
  780.     Arg              av[50];
  781.     char            *label;
  782.     char             name[32];
  783.     XmString         xms;
  784.     Widget           button;
  785.     XFE_GlobalPrefs *prefs = &fe_globalPrefs;
  786.  
  787.     numStyles = XtNumber(quotedTextStyles); 
  788.     for (i = 0; i < numStyles; i++)    {
  789.         label = XP_GetString(*quotedTextStyles[i].defaultLabelId);
  790.  
  791.         ac = 0;
  792.         xms = XmStringCreateLtoR(label, XmFONTLIST_DEFAULT_TAG);
  793.         XtSetArg(av[ac], XmNlabelString, xms); ac++;
  794.  
  795.         XP_SAFE_SPRINTF(name, sizeof(name), "style%d", i);
  796.         button = XmCreatePushButtonGadget(fep->quoted_text_style_pulldown,
  797.                                           name, av, ac);
  798.         XmStringFree(xms);
  799.  
  800.         XtVaSetValues(button, XmNuserData, quotedTextStyles[i].style, NULL);
  801.  
  802.         if (quotedTextStyles[i].style == prefs->citation_font)
  803.             XtVaSetValues (fep->quoted_text_style_option, XmNmenuHistory, button, 0);
  804.  
  805.         XtManageChild(button);
  806.     }
  807. }
  808.  
  809. static void fe_set_quoted_text_sizes(PrefsDataMailNews     *fep)
  810. {
  811.     int              ac;
  812.     int              i;
  813.     int              numSizes;
  814.     Arg              av[50];
  815.     char            *label;
  816.     char             name[32];
  817.     XmString         xms;
  818.     Widget           button;
  819.     XFE_GlobalPrefs *prefs = &fe_globalPrefs;
  820.  
  821.     numSizes = XtNumber(quotedTextSizes); 
  822.     for (i = 0; i < numSizes; i++)    {
  823.         label = XP_GetString(*quotedTextSizes[i].defaultLabelId);
  824.  
  825.         ac = 0;
  826.         xms = XmStringCreateLtoR(label, XmFONTLIST_DEFAULT_TAG);
  827.         XtSetArg(av[ac], XmNlabelString, xms); ac++;
  828.  
  829.         XP_SAFE_SPRINTF(name, sizeof(name), "size%d", i);
  830.         button = XmCreatePushButtonGadget(fep->quoted_text_size_pulldown,
  831.                                           name, av, ac);
  832.         XmStringFree(xms);
  833.  
  834.         XtVaSetValues(button, XmNuserData, quotedTextSizes[i].size, NULL);
  835.  
  836.         if (quotedTextSizes[i].size == prefs->citation_size)
  837.             XtVaSetValues (fep->quoted_text_size_option, XmNmenuHistory, button, 0);
  838.  
  839.         XtManageChild(button);
  840.     }
  841. }
  842. #endif // MOZ_MAIL_NEWS
  843.  
  844. // ************************************************************************
  845. // ************************  Mail News/Identity   *************************
  846. // ************************************************************************
  847.  
  848. // Member:       XFE_PrefsPageMailNewsIdentity
  849. // Description:  Constructor
  850. // Inputs:
  851. // Side effects: 
  852.  
  853. XFE_PrefsPageMailNewsIdentity::XFE_PrefsPageMailNewsIdentity(XFE_PrefsDialog *dialog)
  854.     : XFE_PrefsPage(dialog),
  855.       m_prefsDataMailNewsIdentity(0)
  856. {
  857. }
  858.  
  859. // Member:       ~XFE_PrefsPageMailNewsIdentity
  860. // Description:  Destructor
  861. // Inputs:
  862. // Side effects: 
  863.  
  864. XFE_PrefsPageMailNewsIdentity::~XFE_PrefsPageMailNewsIdentity()
  865. {
  866.     delete m_prefsDataMailNewsIdentity;
  867. }
  868.  
  869. // Member:       create
  870. // Description:  Creates page for MailNews/Identity
  871. // Inputs:
  872. // Side effects: 
  873.  
  874. void XFE_PrefsPageMailNewsIdentity::create()
  875. {
  876.     Widget            kids[100];
  877.     Arg               av[50];
  878.     int               ac;
  879.     int               i;
  880.  
  881.     PrefsDataMailNewsIdentity *fep = NULL;
  882.  
  883.     fep = new PrefsDataMailNewsIdentity;
  884.     memset(fep, 0, sizeof(PrefsDataMailNewsIdentity));
  885.     m_prefsDataMailNewsIdentity = fep;
  886.  
  887.     fep->context = getContext();
  888.     fep->prompt_dialog = getPrefsDialog()->getDialogChrome();
  889.  
  890.     Widget form;
  891.  
  892.     ac = 0;
  893.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
  894.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
  895.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  896.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  897.     form = XmCreateForm (m_wPageForm, "mailnewsIdentity", av, ac);
  898.     XtManageChild (form);
  899.     m_wPage = fep->page = form;
  900.  
  901.     Widget frame1;
  902.  
  903.     ac = 0;
  904.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  905.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  906.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
  907.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
  908.     frame1 = XmCreateFrame (form, "mnIdFrame", av, ac);
  909.  
  910.     Widget form1;
  911.  
  912.     ac = 0;
  913.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  914.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  915.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
  916.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
  917.     form1 = XmCreateForm (frame1, "mnIdBox", av, ac);
  918.  
  919.     Widget id_label;
  920.     Widget name_label;
  921.     Widget email_addr_label;
  922.     Widget org_label;
  923. #ifdef MOZ_MAIL_NEWS
  924.     Widget reply_to_addr_label;
  925.     Widget sig_file_label;
  926.     Widget browse_button;
  927. #endif // MOZ_MAIL_NEWS
  928.  
  929.     ac = 0;
  930.     i = 0;
  931.  
  932.     kids[i++] = id_label = 
  933.         XmCreateLabelGadget(form1, "idLabel", av, ac);
  934.  
  935.     kids[i++] = name_label = 
  936.         XmCreateLabelGadget(form1, "nameLabel", av, ac);
  937.  
  938.     kids[i++] = email_addr_label = 
  939.         XmCreateLabelGadget(form1, "emailAddrLabel", av, ac);
  940.  
  941. #ifdef MOZ_MAIL_NEWS
  942.     kids[i++] = reply_to_addr_label = 
  943.         XmCreateLabelGadget(form1, "replyToAddrLabel", av, ac);
  944. #endif // MOZ_MAIL_NEWS
  945.  
  946.     kids[i++] = org_label = 
  947.         XmCreateLabelGadget(form1, "orgLabel", av, ac);
  948.  
  949. #ifdef MOZ_MAIL_NEWS
  950.     kids[i++] = sig_file_label = 
  951.         XmCreateLabelGadget(form1, "sigFileLabel", av, ac);
  952. #endif // MOZ_MAIL_NEWS
  953.  
  954.     kids[i++] = fep->name_text =
  955.         fe_CreateTextField(form1, "nameText", av, ac);
  956.  
  957.     kids[i++] = fep->email_addr_text =
  958.         fe_CreateTextField(form1, "emailAddrText", av, ac);
  959.  
  960. #ifdef MOZ_MAIL_NEWS
  961.     kids[i++] = fep->reply_to_addr_text =
  962.         fe_CreateTextField(form1, "replyToAddrText", av, ac);
  963. #endif // MOZ_MAIL_NEWS
  964.  
  965.     kids[i++] = fep->org_text =
  966.         fe_CreateTextField(form1, "orgText", av, ac);
  967.  
  968. #ifdef MOZ_MAIL_NEWS
  969.     kids[i++] = fep->sig_file_text =
  970.         fe_CreateTextField(form1, "sigFileText", av, ac);
  971.  
  972.     kids[i++] = fep->browse_button = browse_button = 
  973.         XmCreatePushButtonGadget(form1, "browse", av, ac);
  974.  
  975.     kids[i++] = fep->attach_card_toggle =
  976.         XmCreateToggleButtonGadget(form1, "attachCard", av, ac);
  977. #endif // MOZ_MAIL_NEWS
  978.  
  979.  
  980.     XtVaSetValues(id_label,
  981.                   XmNalignment, XmALIGNMENT_BEGINNING,
  982.                   XmNtopAttachment, XmATTACH_FORM,
  983.                   XmNleftAttachment, XmATTACH_FORM,
  984.                   XmNrightAttachment, XmATTACH_NONE,
  985.                   XmNbottomAttachment, XmATTACH_NONE,
  986.                   NULL);
  987.  
  988.     XtVaSetValues(name_label,
  989.                   XmNalignment, XmALIGNMENT_BEGINNING,
  990.                   XmNtopAttachment, XmATTACH_WIDGET,
  991.                   XmNtopWidget, id_label,
  992.                   XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  993.                   XmNleftWidget, id_label,
  994.                   XmNrightAttachment, XmATTACH_NONE,
  995.                   XmNbottomAttachment, XmATTACH_NONE,
  996.                   NULL);
  997.  
  998.     XtVaSetValues(fep->name_text,
  999.                   XmNcolumns, 35,
  1000.                   XmNtopAttachment, XmATTACH_WIDGET,
  1001.                   XmNtopWidget, name_label,
  1002.                   XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  1003.                   XmNleftWidget, id_label,
  1004.                   XmNrightAttachment, XmATTACH_NONE,
  1005.                   XmNbottomAttachment, XmATTACH_NONE,
  1006.                   NULL);
  1007.  
  1008.     XtVaSetValues(email_addr_label,
  1009.                   XmNalignment, XmALIGNMENT_BEGINNING,
  1010.                   XmNtopAttachment, XmATTACH_WIDGET,
  1011.                   XmNtopWidget, fep->name_text,
  1012.                   XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  1013.                   XmNleftWidget, id_label,
  1014.                   XmNrightAttachment, XmATTACH_NONE,
  1015.                   XmNbottomAttachment, XmATTACH_NONE,
  1016.                   NULL);
  1017.  
  1018.     XtVaSetValues(fep->email_addr_text,
  1019.                   XmNcolumns, 35,
  1020.                   XmNtopAttachment, XmATTACH_WIDGET,
  1021.                   XmNtopWidget, email_addr_label,
  1022.                   XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  1023.                   XmNleftWidget, id_label,
  1024.                   XmNrightAttachment, XmATTACH_NONE,
  1025.                   XmNbottomAttachment, XmATTACH_NONE,
  1026.                   NULL);
  1027.  
  1028. #ifdef MOZ_MAIL_NEWS
  1029.     XtVaSetValues(reply_to_addr_label,
  1030.                   XmNalignment, XmALIGNMENT_BEGINNING,
  1031.                   XmNtopAttachment, XmATTACH_WIDGET,
  1032.                   XmNtopWidget, fep->email_addr_text,
  1033.                   XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  1034.                   XmNleftWidget, id_label,
  1035.                   XmNrightAttachment, XmATTACH_NONE,
  1036.                   XmNbottomAttachment, XmATTACH_NONE,
  1037.                   NULL);
  1038.  
  1039.     XtVaSetValues(fep->reply_to_addr_text,
  1040.                   XmNcolumns, 35,
  1041.                   XmNtopAttachment, XmATTACH_WIDGET,
  1042.                   XmNtopWidget, reply_to_addr_label,
  1043.                   XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  1044.                   XmNleftWidget, id_label,
  1045.                   XmNrightAttachment, XmATTACH_NONE,
  1046.                   XmNbottomAttachment, XmATTACH_NONE,
  1047.                   NULL);
  1048. #endif // MOZ_MAIL_NEWS
  1049.  
  1050.     XtVaSetValues(org_label,
  1051.                   XmNalignment, XmALIGNMENT_BEGINNING,
  1052.                   XmNtopAttachment, XmATTACH_WIDGET,
  1053. #ifdef MOZ_MAIL_NEWS
  1054.                   XmNtopWidget, fep->reply_to_addr_text,
  1055. #else
  1056.                   XmNtopWidget, fep->email_addr_text,
  1057. #endif // MOZ_MAIL_NEWS
  1058.                   XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  1059.                   XmNleftWidget, id_label,
  1060.                   XmNrightAttachment, XmATTACH_NONE,
  1061.                   XmNbottomAttachment, XmATTACH_NONE,
  1062.                   NULL);
  1063.  
  1064.     XtVaSetValues(fep->org_text,
  1065.                   XmNcolumns, 35,
  1066.                   XmNtopAttachment, XmATTACH_WIDGET,
  1067.                   XmNtopWidget, org_label,
  1068.                   XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  1069.                   XmNleftWidget, id_label,
  1070.                   XmNrightAttachment, XmATTACH_NONE,
  1071.                   XmNbottomAttachment, XmATTACH_NONE,
  1072.                   NULL);
  1073.  
  1074. #ifdef MOZ_MAIL_NEWS
  1075.     XtVaSetValues(sig_file_label,
  1076.                   XmNcolumns, 35,
  1077.                   XmNalignment, XmALIGNMENT_BEGINNING,
  1078.                   XmNtopAttachment, XmATTACH_WIDGET,
  1079.                   XmNtopWidget, fep->org_text,
  1080.                   XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  1081.                   XmNleftWidget, id_label,
  1082.                   XmNrightAttachment, XmATTACH_NONE,
  1083.                   XmNbottomAttachment, XmATTACH_NONE,
  1084.                   NULL);
  1085.  
  1086.     XtVaSetValues(fep->sig_file_text,
  1087.                   XmNcolumns, 35,
  1088.                   XmNtopAttachment, XmATTACH_WIDGET,
  1089.                   XmNtopWidget, sig_file_label,
  1090.                   XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  1091.                   XmNleftWidget, id_label,
  1092.                   XmNrightAttachment, XmATTACH_NONE,
  1093.                   XmNbottomAttachment, XmATTACH_NONE,
  1094.                   NULL);
  1095.  
  1096.     XtVaSetValues(browse_button,
  1097.                   XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  1098.                   XmNtopWidget, fep->sig_file_text,
  1099.                   XmNleftAttachment, XmATTACH_WIDGET,
  1100.                   XmNleftWidget, fep->sig_file_text,
  1101.                   XmNleftOffset, 16,
  1102.                   XmNrightAttachment, XmATTACH_NONE,
  1103.                   XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET,
  1104.                   XmNbottomWidget, fep->sig_file_text,
  1105.                   NULL);
  1106.  
  1107.     int labels_height;
  1108.  
  1109.     labels_height = XfeVaGetTallestWidget(fep->attach_card_toggle,
  1110.                                           browse_button,
  1111.                                           fep->sig_file_text,
  1112.                                           NULL);
  1113.  
  1114.     XtVaSetValues(fep->attach_card_toggle,
  1115.                   XmNheight, labels_height,
  1116.                   XmNalignment, XmALIGNMENT_BEGINNING,
  1117.                   XmNtopAttachment, XmATTACH_WIDGET,
  1118.                   XmNtopWidget, fep->sig_file_text,
  1119.                   XmNtopOffset, 8,
  1120.                   XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  1121.                   XmNleftWidget, id_label,
  1122.                   XmNrightAttachment, XmATTACH_NONE,
  1123.                   XmNbottomAttachment, XmATTACH_NONE,
  1124.                   NULL);
  1125. #endif // MOZ_MAIL_NEWS
  1126.  
  1127. #ifdef MOZ_MAIL_NEWS
  1128.     XtAddCallback(browse_button, XmNactivateCallback,
  1129.                   cb_browse, this);
  1130.     XtAddCallback(fep->attach_card_toggle, XmNvalueChangedCallback,
  1131.                   cb_toggleAttachCard, this);
  1132. #endif // MOZ_MAIL_NEWS
  1133.  
  1134.  
  1135.     XtManageChildren(kids, i);
  1136.     XtManageChild(form1);
  1137.     XtManageChild(frame1);
  1138.  
  1139.     setCreated(TRUE);
  1140. }
  1141.  
  1142. // Member:       init
  1143. // Description:  Initializes page for MailNewsIdentity
  1144. // Inputs:
  1145. // Side effects: 
  1146.  
  1147. void XFE_PrefsPageMailNewsIdentity::init()
  1148. {
  1149.     XP_ASSERT(m_prefsDataMailNewsIdentity);
  1150.  
  1151.     PrefsDataMailNewsIdentity  *fep = m_prefsDataMailNewsIdentity;
  1152.     XFE_GlobalPrefs            *prefs = &fe_globalPrefs;
  1153.     
  1154.     fe_SetTextField(fep->name_text, prefs->real_name);
  1155.     fe_SetTextField(fep->email_addr_text, prefs->email_address);
  1156.     fe_SetTextField(fep->org_text, prefs->organization);
  1157. #ifdef MOZ_MAIL_NEWS
  1158.     fe_SetTextField(fep->reply_to_addr_text, prefs->reply_to_address);
  1159.     fe_SetTextField(fep->sig_file_text, prefs->signature_file);
  1160.     XtVaSetValues (fep->attach_card_toggle, XmNset, prefs->attach_address_card, 0);
  1161. #endif // MOZ_MAIL_NEWS
  1162.  
  1163.     // If the preference is locked, grey it out.
  1164.     XtSetSensitive(fep->name_text, 
  1165.                    !PREF_PrefIsLocked("mail.identity.username"));
  1166.     XtSetSensitive(fep->email_addr_text, 
  1167.                    !PREF_PrefIsLocked("mail.identity.useremail"));
  1168.     XtSetSensitive(fep->org_text, 
  1169.                    !PREF_PrefIsLocked("mail.identity.organization"));
  1170.  
  1171. #ifdef MOZ_MAIL_NEWS
  1172.     XtSetSensitive(fep->reply_to_addr_text, 
  1173.                    !PREF_PrefIsLocked("mail.identity.reply_to"));
  1174.     XtSetSensitive(fep->sig_file_text, 
  1175.                    !PREF_PrefIsLocked("mail.signature_file"));
  1176.     XtSetSensitive(fep->browse_button, 
  1177.                    !PREF_PrefIsLocked("mail.signature_file"));
  1178.     XtSetSensitive(fep->attach_card_toggle, 
  1179.                    !PREF_PrefIsLocked("mail.attach_vcard"));
  1180. #endif // MOZ_MAIL_NEWS
  1181.  
  1182.     setInitialized(TRUE);
  1183. }
  1184.  
  1185. // Member:       install
  1186. // Description:  
  1187. // Inputs:
  1188. // Side effects: 
  1189.  
  1190. void XFE_PrefsPageMailNewsIdentity::install()
  1191. {
  1192. #ifdef MOZ_MAIL_NEWS
  1193.     fe_installMailNewsIdentity();
  1194. #endif // MOZ_MAIL_NEWS
  1195. }
  1196.  
  1197. // Member:       verify
  1198. // Description:  
  1199. // Inputs:
  1200. // Side effects: 
  1201.  
  1202. Boolean XFE_PrefsPageMailNewsIdentity::verify()
  1203. {
  1204.     XP_ASSERT(m_prefsDataMailNewsIdentity);
  1205.     PrefsDataMailNewsIdentity  *fep = m_prefsDataMailNewsIdentity;
  1206.  
  1207.     // Make sure the user has specified a valid email address
  1208.  
  1209.     char *orig_email;
  1210.     char *email;
  1211.     orig_email = fe_GetTextField(fep->email_addr_text);
  1212.     email = fe_StringTrim(orig_email);
  1213.  
  1214.     if ((! email) ||
  1215.         (XP_STRLEN(email) == 0)) {
  1216.         FE_Alert(getContext(), XP_GetString(XFE_EMPTY_EMAIL_ADDR));
  1217.         return FALSE;
  1218.     }
  1219.     XtFree(orig_email);
  1220.  
  1221. #ifdef MOZ_MAIL_NEWS
  1222.     // Need to check if the user has created a card 
  1223.  
  1224.     PersonEntry      person;
  1225.     ABook           *addr_book = fe_GetABook(0);
  1226.     DIR_Server      *dir;
  1227.     ABID             entry_id;
  1228.     XFE_GlobalPrefs *prefs = &fe_globalPrefs;
  1229.  
  1230.     person.Initialize();
  1231.     person.pGivenName = ((prefs->real_name) && (XP_STRLEN(prefs->real_name) > 0)) ?
  1232.         XP_STRDUP(prefs->real_name) : 0;
  1233.     person.pEmailAddress = ((prefs->email_address) && (XP_STRLEN(prefs->email_address) > 0)) ?
  1234.         XP_STRDUP(prefs->email_address) : 0;
  1235.   
  1236.     DIR_GetPersonalAddressBook(FE_GetDirServers(), &dir);
  1237.  
  1238.     if (dir) {
  1239.         AB_GetEntryIDForPerson(dir, addr_book, &entry_id, &person);
  1240.  
  1241.         if (MSG_MESSAGEIDNONE == entry_id) {
  1242.             XtVaSetValues(fep->attach_card_toggle, XmNset, FALSE, 0);
  1243.         }
  1244.     }
  1245.  
  1246.     if (person.pGivenName) XP_FREE(person.pGivenName);
  1247.     if (person.pEmailAddress) XP_FREE(person.pEmailAddress);
  1248. #endif // MOZ_MAIL_NEWS
  1249.  
  1250.     return TRUE;
  1251. }
  1252.  
  1253. // Member:       save
  1254. // Description:  
  1255. // Inputs:
  1256. // Side effects: 
  1257.  
  1258. void XFE_PrefsPageMailNewsIdentity::save()
  1259. {
  1260.     PrefsDataMailNewsIdentity *fep = m_prefsDataMailNewsIdentity;
  1261.  
  1262.     XP_ASSERT(fep);
  1263.  
  1264.     if (fe_globalPrefs.real_name) {
  1265.         free(fe_globalPrefs.real_name);
  1266.     }
  1267.     fe_globalPrefs.real_name = fe_GetTextField(fep->name_text);
  1268.  
  1269.     PREFS_SET_GLOBALPREF_TEXT(email_address, email_addr_text);
  1270. #ifdef MOZ_MAIL_NEWS
  1271.     PREFS_SET_GLOBALPREF_TEXT(reply_to_address, reply_to_addr_text);
  1272.     PREFS_SET_GLOBALPREF_TEXT(signature_file, sig_file_text);
  1273. #endif // MOZ_MAIL_NEWS
  1274.  
  1275.     if (fe_globalPrefs.organization) {
  1276.         free (fe_globalPrefs.organization);
  1277.     }
  1278.     fe_globalPrefs.organization = fe_GetTextField (fep->org_text);
  1279.  
  1280. #ifdef MOZ_MAIL_NEWS
  1281.     Boolean b;
  1282.     XtVaGetValues(fep->attach_card_toggle, XmNset, &b, 0);
  1283.     fe_globalPrefs.attach_address_card = b;
  1284. #endif // MOZ_MAIL_NEWS
  1285.  
  1286.     // Install preferences
  1287.  
  1288.     install();
  1289. }
  1290.  
  1291. // Member:       getData
  1292. // Description:  
  1293. // Inputs:
  1294. // Side effects: 
  1295.  
  1296. PrefsDataMailNewsIdentity *XFE_PrefsPageMailNewsIdentity::getData()
  1297. {
  1298.     return m_prefsDataMailNewsIdentity;
  1299. }
  1300.  
  1301. #ifdef MOZ_MAIL_NEWS
  1302. // Member:       cb_browse
  1303. // Description:  
  1304. // Inputs:
  1305. // Side effects: 
  1306.  
  1307. void XFE_PrefsPageMailNewsIdentity::cb_browse(Widget    /* w */,
  1308.                                               XtPointer closure,
  1309.                                               XtPointer /* callData */)
  1310. {
  1311.     XFE_PrefsPageMailNewsIdentity *thePage = (XFE_PrefsPageMailNewsIdentity *)closure;
  1312.     XFE_PrefsDialog               *theDialog = thePage->getPrefsDialog();
  1313.     PrefsDataMailNewsIdentity     *fep = thePage->getData();
  1314.  
  1315.     fe_browse_file_of_text(theDialog->getContext(), fep->sig_file_text, False);
  1316. }
  1317. #endif // MOZ_MAIL_NEWS
  1318.  
  1319. #if 0
  1320. // Member:       cb_editCard
  1321. // Description:  
  1322. // Inputs:
  1323. // Side effects: 
  1324.  
  1325. void XFE_PrefsPageMailNewsIdentity::cb_editCard(Widget    /* w */,
  1326.                                                 XtPointer closure,
  1327.                                                 XtPointer /* callData */)
  1328. {
  1329.     XFE_PrefsPageMailNewsIdentity *thePage = (XFE_PrefsPageMailNewsIdentity *)closure;
  1330.     XFE_PrefsDialog               *theDialog = thePage->getPrefsDialog();
  1331.     Widget                         mainw = theDialog->getBaseWidget();
  1332.     XFE_GlobalPrefs               *prefs = &fe_globalPrefs;
  1333.     
  1334.     // Need to check if the user has created a card 
  1335.  
  1336.     PersonEntry  person;
  1337.     ABook       *addr_book = fe_GetABook(0);
  1338.     DIR_Server  *dir;
  1339.     ABID         entry_id;
  1340.  
  1341.     person.Initialize();
  1342.     person.pGivenName = ((prefs->real_name) && (XP_STRLEN(prefs->real_name) > 0)) ?
  1343.         XP_STRDUP(prefs->real_name) : 0;
  1344.     person.pEmailAddress = ((prefs->email_address) && (XP_STRLEN(prefs->email_address) > 0)) ?
  1345.         XP_STRDUP(prefs->email_address) : 0;
  1346.   
  1347.     DIR_GetPersonalAddressBook(FE_GetDirServers(), &dir);
  1348.  
  1349.     if (dir) {
  1350.         AB_GetEntryIDForPerson(dir, addr_book, &entry_id, &person);
  1351.         if (MSG_MESSAGEIDNONE != entry_id) {
  1352.             fe_showABCardPropertyDlg(mainw, 
  1353.                                      thePage->getContext(),
  1354.                                      entry_id,
  1355.                                      FALSE);
  1356.         }
  1357.     }
  1358.  
  1359.     if (person.pGivenName) XP_FREE(person.pGivenName);
  1360.     if (person.pEmailAddress) XP_FREE(person.pEmailAddress);
  1361. }
  1362. #endif
  1363.  
  1364. // Member:       cb_toggleAttachCard
  1365. // Description:  
  1366. // Inputs:
  1367. // Side effects: 
  1368.  
  1369. #ifdef MOZ_MAIL_NEWS
  1370. void XFE_PrefsPageMailNewsIdentity::cb_toggleAttachCard(Widget    /* w */,
  1371.                                                         XtPointer closure,
  1372.                                                         XtPointer callData)
  1373. {
  1374.     XmToggleButtonCallbackStruct  *cb = (XmToggleButtonCallbackStruct *)callData;
  1375.     XFE_PrefsPageMailNewsIdentity *thePage = (XFE_PrefsPageMailNewsIdentity *)closure;
  1376.     PrefsDataMailNewsIdentity     *fep = thePage->getData();
  1377.     XFE_PrefsDialog               *theDialog = thePage->getPrefsDialog();
  1378.     MWContext                     *context = theDialog->getContext();
  1379.     Widget                         mainw = theDialog->getBaseWidget();
  1380.     XFE_GlobalPrefs               *prefs = &fe_globalPrefs;
  1381.     
  1382.     if (! cb->set) return;
  1383.  
  1384.     // Need to check if the user has created a card 
  1385.  
  1386.     PersonEntry  person;
  1387.     ABook       *addr_book = fe_GetABook(0);
  1388.     DIR_Server  *dir;
  1389.     ABID         entry_id;
  1390.  
  1391.     person.Initialize();
  1392.     person.pGivenName = ((prefs->real_name) && (XP_STRLEN(prefs->real_name) > 0)) ?
  1393.         XP_STRDUP(prefs->real_name) : 0;
  1394.     person.pEmailAddress = ((prefs->email_address) && (XP_STRLEN(prefs->email_address) > 0)) ?
  1395.         XP_STRDUP(prefs->email_address) : 0;
  1396.   
  1397.     DIR_GetPersonalAddressBook(FE_GetDirServers(), &dir);
  1398.  
  1399.     if (dir) {
  1400.         AB_GetEntryIDForPerson(dir, addr_book, &entry_id, &person);
  1401.  
  1402.         if (MSG_MESSAGEIDNONE == entry_id) {
  1403.             if (XFE_Confirm(context, XP_GetString(XFE_PREFS_CR_CARD))){
  1404.                 fe_showABCardPropertyDlg(mainw, 
  1405.                                          thePage->getContext(),
  1406.                                          MSG_VIEWINDEXNONE, 
  1407.                                          TRUE);
  1408.             }
  1409.             else {
  1410.                 XtVaSetValues(fep->attach_card_toggle, XmNset, FALSE, 0);
  1411.             }
  1412.         }
  1413.     }
  1414.  
  1415.     if (person.pGivenName) XP_FREE(person.pGivenName);
  1416.     if (person.pEmailAddress) XP_FREE(person.pEmailAddress);
  1417. }
  1418. #endif // MOZ_MAIL_NEWS
  1419.  
  1420. #ifdef MOZ_MAIL_NEWS
  1421. // ************************************************************************
  1422. // **********************  Mail News/Composition   ************************
  1423. // ************************************************************************
  1424.  
  1425. // Member:       XFE_PrefsPageMailNewsComposition
  1426. // Description:  Constructor
  1427. // Inputs:
  1428. // Side effects: 
  1429.  
  1430. XFE_PrefsPageMailNewsComposition::XFE_PrefsPageMailNewsComposition(XFE_PrefsDialog *dialog)
  1431.     : XFE_PrefsPage(dialog),
  1432.       m_prefsDataMailNewsComposition(0)
  1433. {
  1434. }
  1435.  
  1436. // Member:       ~XFE_PrefsPageMailNewsComposition
  1437. // Description:  Destructor
  1438. // Inputs:
  1439. // Side effects: 
  1440.  
  1441. XFE_PrefsPageMailNewsComposition::~XFE_PrefsPageMailNewsComposition()
  1442. {
  1443.     delete m_prefsDataMailNewsComposition;
  1444. }
  1445.  
  1446. // Member:       create
  1447. // Description:  Creates page for MailNews/Composition
  1448. // Inputs:
  1449. // Side effects: 
  1450.  
  1451. void XFE_PrefsPageMailNewsComposition::create()
  1452. {
  1453.     Widget            kids[100];
  1454.     Arg               av[50];
  1455.     int               ac;
  1456.     int               i;
  1457.  
  1458.     PrefsDataMailNewsComposition *fep = NULL;
  1459.  
  1460.     fep = new PrefsDataMailNewsComposition;
  1461.     memset(fep, 0, sizeof(PrefsDataMailNewsComposition));
  1462.     m_prefsDataMailNewsComposition = fep;
  1463.  
  1464.     fep->context = getContext();
  1465.     fep->prompt_dialog = getPrefsDialog()->getDialogChrome();
  1466.  
  1467.     Widget form;
  1468.  
  1469.     ac = 0;
  1470.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
  1471.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
  1472.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  1473.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  1474.     form = XmCreateForm (m_wPageForm, "mailnewsCompose", av, ac);
  1475.     XtManageChild (form);
  1476.     m_wPage = fep->page = form;
  1477.  
  1478.     // Message Properties
  1479.  
  1480.     Widget frame1;
  1481.  
  1482.     ac = 0;
  1483.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  1484.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  1485.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
  1486.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
  1487.     frame1 = XmCreateFrame (form, "mailnewsCompFrame", av, ac);
  1488.  
  1489.     Widget form1;
  1490.  
  1491.     ac = 0;
  1492.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  1493.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  1494.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
  1495.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
  1496.     form1 = XmCreateForm (frame1, "mailnewsCompBox", av, ac);
  1497.  
  1498.     Widget label1;
  1499.  
  1500.     ac = 0;
  1501.     XtSetArg (av [ac], XmNchildType, XmFRAME_TITLE_CHILD); ac++;
  1502.     label1 = XmCreateLabelGadget (frame1, "msgPropLabel", av, ac);
  1503.  
  1504.     ac = 0;
  1505.     i = 0;
  1506.  
  1507.     // Auto quote original message
  1508.  
  1509.     Widget send_html_msg_toggle;
  1510.     Widget auto_quote_toggle;
  1511.     Widget wrap_label;
  1512.     Widget wrap_length_text;
  1513.     Widget char_label;
  1514.  
  1515.     kids[i++] = send_html_msg_toggle =
  1516.         XmCreateToggleButtonGadget(form1, "sendHtmlMsgToggle", av, ac);
  1517.  
  1518.     kids[i++] = auto_quote_toggle =
  1519.         XmCreateToggleButtonGadget(form1, "autoQuoteToggle", av, ac);
  1520.  
  1521.     kids[i++] = wrap_label =
  1522.         XmCreateLabelGadget(form1, "wrapLabel", av, ac);
  1523.  
  1524.     kids[i++] = char_label =
  1525.         XmCreateLabelGadget(form1, "charLabel", av, ac);
  1526.  
  1527.     kids[i++] = wrap_length_text =
  1528.         fe_CreateTextField(form1, "wrapLengthText", av, ac);
  1529.  
  1530.     fep->auto_quote_toggle = auto_quote_toggle;
  1531.     fep->send_html_msg_toggle = send_html_msg_toggle;
  1532.     fep->wrap_length_text = wrap_length_text;
  1533.  
  1534.     XtVaSetValues(send_html_msg_toggle,
  1535.                   XmNindicatorType, XmN_OF_MANY,
  1536.                   XmNtopAttachment, XmATTACH_FORM,
  1537.                   XmNleftAttachment, XmATTACH_FORM,
  1538.                   XmNrightAttachment, XmATTACH_NONE,
  1539.                   XmNbottomAttachment, XmATTACH_NONE,
  1540.                   NULL);
  1541.  
  1542.     XtVaSetValues(auto_quote_toggle,
  1543.                   XmNindicatorType, XmN_OF_MANY,
  1544.                   XmNtopAttachment, XmATTACH_WIDGET,
  1545.                   XmNtopWidget, send_html_msg_toggle,
  1546.                   XmNleftAttachment, XmATTACH_FORM,
  1547.                   XmNrightAttachment, XmATTACH_NONE,
  1548.                   XmNbottomAttachment, XmATTACH_NONE,
  1549.                   NULL);
  1550.  
  1551.     int labels_height;
  1552.     labels_height = XfeVaGetTallestWidget(wrap_label,
  1553.                                           wrap_length_text,
  1554.                                           NULL);
  1555.  
  1556.     XtVaSetValues(wrap_label,
  1557.                   XmNalignment, XmALIGNMENT_BEGINNING,
  1558.                   XmNheight, labels_height,
  1559.                   XmNtopAttachment, XmATTACH_WIDGET,
  1560.                   XmNtopWidget, auto_quote_toggle,
  1561.                   XmNleftAttachment, XmATTACH_FORM,
  1562.                   XmNrightAttachment, XmATTACH_NONE,
  1563.                   XmNbottomAttachment, XmATTACH_NONE,
  1564.                   NULL);
  1565.  
  1566.     XtVaSetValues(wrap_length_text,
  1567.                   XmNcolumns, 3,
  1568.                   XmNheight, labels_height,
  1569.                   XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  1570.                   XmNtopWidget, wrap_label,
  1571.                   XmNleftAttachment, XmATTACH_WIDGET,
  1572.                   XmNleftWidget, wrap_label,
  1573.                   XmNrightAttachment, XmATTACH_NONE,
  1574.                   XmNbottomAttachment, XmATTACH_NONE,
  1575.                   NULL);
  1576.  
  1577.     XtVaSetValues(char_label,
  1578.                   XmNalignment, XmALIGNMENT_BEGINNING,
  1579.                   XmNheight, labels_height,
  1580.                   XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  1581.                   XmNtopWidget, wrap_label,
  1582.                   XmNleftAttachment, XmATTACH_WIDGET,
  1583.                   XmNleftWidget, wrap_length_text,
  1584.                   XmNrightAttachment, XmATTACH_NONE,
  1585.                   XmNbottomAttachment, XmATTACH_NONE,
  1586.                   NULL);
  1587.  
  1588.     XtManageChildren(kids, i);
  1589.     XtManageChild(label1);
  1590.     XtManageChild(form1);
  1591.     XtManageChild(frame1);
  1592.  
  1593.     // Copies of outgoing messages
  1594.  
  1595.     Widget frame2;
  1596.  
  1597.     ac = 0;
  1598.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  1599.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  1600.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
  1601.     XtSetArg (av [ac], XmNtopWidget, frame1); ac++;
  1602.     XtSetArg (av [ac], XmNtopOffset, 8); ac++;
  1603.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
  1604.     frame2 = XmCreateFrame (form, "ccFrame", av, ac);
  1605.  
  1606.     Widget form2;
  1607.  
  1608.     ac = 0;
  1609.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  1610.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  1611.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
  1612.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
  1613.     form2 = XmCreateForm (frame2, "ccBox", av, ac);
  1614.  
  1615.     Widget label2;
  1616.  
  1617.     ac = 0;
  1618.     XtSetArg (av [ac], XmNchildType, XmFRAME_TITLE_CHILD); ac++;
  1619.     label2 = XmCreateLabelGadget (frame2, "ccLabel", av, ac);
  1620.  
  1621.     // Email a copy of outgoing message to
  1622.  
  1623.     Widget email_label;
  1624.     Widget mail_msg_label;
  1625.     Widget news_msg_label;
  1626.     Widget mail_email_self_toggle;
  1627.     Widget mail_email_other_label;
  1628.     Widget mail_email_other_text;
  1629.     Widget news_email_self_toggle;
  1630.     Widget news_email_other_label;
  1631.     Widget news_email_other_text;
  1632.  
  1633.     ac = 0;
  1634.     i = 0;
  1635.  
  1636.     kids[i++] = email_label = 
  1637.         XmCreateLabelGadget(form2, "emailLabel", av, ac);
  1638.  
  1639.     kids[i++] = mail_msg_label = 
  1640.         XmCreateLabelGadget(form2, "mailMsgLabel", av, ac);
  1641.  
  1642.     kids[i++] = news_msg_label = 
  1643.         XmCreateLabelGadget(form2, "newsMsgLabel", av, ac);
  1644.  
  1645.     kids[i++] = mail_email_self_toggle =
  1646.         XmCreateToggleButtonGadget(form2, "mEmailSelfToggle", av, ac);
  1647.  
  1648.     kids[i++] = news_email_self_toggle =
  1649.         XmCreateToggleButtonGadget(form2, "nEmailSelfToggle", av, ac);
  1650.  
  1651.     kids[i++] = mail_email_other_label = 
  1652.         XmCreateLabelGadget(form2, "mEmailOtherLabel", av, ac);
  1653.  
  1654.     kids[i++] = news_email_other_label = 
  1655.         XmCreateLabelGadget(form2, "nEmailOtherLabel", av, ac);
  1656.  
  1657.     kids[i++] = mail_email_other_text = 
  1658.         fe_CreateTextField(form2, "mEmailOtherText", av, ac);
  1659.  
  1660.     kids[i++] = news_email_other_text = 
  1661.         fe_CreateTextField(form2, "nEmailOtherText", av, ac);
  1662.  
  1663.     fep->mail_email_self_toggle = mail_email_self_toggle;
  1664.     fep->mail_email_other_text = mail_email_other_text;
  1665.     fep->news_email_self_toggle = news_email_self_toggle;
  1666.     fep->news_email_other_text = news_email_other_text;
  1667.  
  1668.     XtVaSetValues(email_label,
  1669.                   XmNalignment, XmALIGNMENT_BEGINNING,
  1670.                   XmNtopAttachment, XmATTACH_WIDGET,
  1671.                   XmNtopWidget, auto_quote_toggle,
  1672.                   XmNtopOffset, 8,
  1673.                   XmNleftAttachment, XmATTACH_FORM,
  1674.                   XmNrightAttachment, XmATTACH_NONE,
  1675.                   XmNbottomAttachment, XmATTACH_NONE,
  1676.                   NULL);
  1677.  
  1678.     int labels_width;
  1679.     labels_width = XfeVaGetWidestWidget(mail_msg_label,
  1680.                                         news_msg_label,
  1681.                                         NULL);
  1682.  
  1683.     labels_height = XfeVaGetTallestWidget(mail_msg_label,
  1684.                                           mail_email_self_toggle,
  1685.                                           mail_email_other_label,
  1686.                                           mail_email_other_text,
  1687.                                           NULL);
  1688.  
  1689.     XtVaSetValues(mail_msg_label,
  1690.                   XmNalignment, XmALIGNMENT_BEGINNING,
  1691.                   XmNwidth, labels_width,
  1692.                   XmNheight, labels_height,
  1693.                   XmNtopAttachment, XmATTACH_WIDGET,
  1694.                   XmNtopWidget, email_label,
  1695.                   XmNleftAttachment, XmATTACH_FORM,
  1696.                   XmNleftOffset, 26,
  1697.                   XmNrightAttachment, XmATTACH_NONE,
  1698.                   XmNbottomAttachment, XmATTACH_NONE,
  1699.                   NULL);
  1700.  
  1701.     XtVaSetValues(mail_email_self_toggle,
  1702.                   XmNindicatorType, XmN_OF_MANY,
  1703.                   XmNheight, labels_height,
  1704.                   XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  1705.                   XmNtopWidget, mail_msg_label,
  1706.                   XmNleftAttachment, XmATTACH_WIDGET,
  1707.                   XmNleftWidget, mail_msg_label,
  1708.                   XmNrightAttachment, XmATTACH_NONE,
  1709.                   XmNbottomAttachment, XmATTACH_NONE,
  1710.                   NULL);
  1711.  
  1712.     XtVaSetValues(mail_email_other_label,
  1713.                   XmNheight, labels_height,
  1714.                   XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  1715.                   XmNtopWidget, mail_msg_label,
  1716.                   XmNleftAttachment, XmATTACH_WIDGET,
  1717.                   XmNleftWidget, mail_email_self_toggle,
  1718.                   XmNleftOffset, 8,
  1719.                   XmNrightAttachment, XmATTACH_NONE,
  1720.                   XmNbottomAttachment, XmATTACH_NONE,
  1721.                   NULL);
  1722.  
  1723.     XtVaSetValues(mail_email_other_text,
  1724.                   XmNcolumns, 20,
  1725.                   XmNheight, labels_height,
  1726.                   XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  1727.                   XmNtopWidget, mail_msg_label,
  1728.                   XmNleftAttachment, XmATTACH_WIDGET,
  1729.                   XmNleftWidget, mail_email_other_label,
  1730.                   XmNrightAttachment, XmATTACH_NONE,
  1731.                   XmNbottomAttachment, XmATTACH_NONE,
  1732.                   NULL);
  1733.  
  1734.     XtVaSetValues(news_msg_label,
  1735.                   XmNalignment, XmALIGNMENT_BEGINNING,
  1736.                   XmNwidth, labels_width,
  1737.                   XmNheight, labels_height,
  1738.                   XmNtopAttachment, XmATTACH_WIDGET,
  1739.                   XmNtopWidget, mail_msg_label,
  1740.                   XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  1741.                   XmNleftWidget, mail_msg_label,
  1742.                   XmNrightAttachment, XmATTACH_NONE,
  1743.                   XmNbottomAttachment, XmATTACH_NONE,
  1744.                   NULL);
  1745.  
  1746.     XtVaSetValues(news_email_self_toggle,
  1747.                   XmNindicatorType, XmN_OF_MANY,
  1748.                   XmNheight, labels_height,
  1749.                   XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  1750.                   XmNtopWidget, news_msg_label,
  1751.                   XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  1752.                   XmNleftWidget, mail_email_self_toggle,
  1753.                   XmNrightAttachment, XmATTACH_NONE,
  1754.                   XmNbottomAttachment, XmATTACH_NONE,
  1755.                   NULL);
  1756.  
  1757.     XtVaSetValues(news_email_other_label,
  1758.                   XmNalignment, XmALIGNMENT_BEGINNING,
  1759.                   XmNheight, labels_height,
  1760.                   XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  1761.                   XmNtopWidget, news_msg_label,
  1762.                   XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  1763.                   XmNleftWidget, mail_email_other_label,
  1764.                   XmNrightAttachment, XmATTACH_NONE,
  1765.                   XmNbottomAttachment, XmATTACH_NONE,
  1766.                   NULL);
  1767.  
  1768.     XtVaSetValues(news_email_other_text,
  1769.                   XmNcolumns, 20,
  1770.                   XmNheight, labels_height,
  1771.                   XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  1772.                   XmNtopWidget, news_msg_label,
  1773.                   XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  1774.                   XmNleftWidget, mail_email_other_text,
  1775.                   XmNrightAttachment, XmATTACH_NONE,
  1776.                   XmNbottomAttachment, XmATTACH_NONE,
  1777.                   NULL);
  1778.  
  1779.     // FCC
  1780.  
  1781.     Visual    *v = 0;
  1782.     Colormap   cmap = 0;
  1783.     Cardinal   depth = 0;
  1784.  
  1785.     XtVaGetValues(getPrefsDialog()->getPrefsParent(),
  1786.                   XtNvisual, &v,
  1787.                   XtNcolormap, &cmap,
  1788.                   XtNdepth, &depth, 
  1789.                   0);
  1790.  
  1791.     Widget fcc_label;
  1792.     Widget mail_fcc_toggle;
  1793.     Widget mail_fcc_combo;
  1794.     Widget news_fcc_toggle;
  1795.     Widget news_fcc_combo;
  1796.  
  1797.     ac = 0;
  1798.     kids[i++] = fcc_label = 
  1799.         XmCreateLabelGadget(form2, "fccLabel", av, ac);
  1800.  
  1801.     kids[i++] = mail_fcc_toggle =
  1802.         XmCreateToggleButtonGadget(form2, "mailFolderToggle", av, ac);
  1803.  
  1804.     kids[i++] = news_fcc_toggle =
  1805.         XmCreateToggleButtonGadget(form2, "newsFolderToggle", av, ac);
  1806.  
  1807.     ac = 0;
  1808.     XtSetArg(av[ac], XmNvisual, v); ac++;
  1809.     XtSetArg(av[ac], XmNdepth, depth); ac++;
  1810.     XtSetArg(av[ac], XmNcolormap, cmap); ac++;
  1811.     XtSetArg(av[ac], XmNmoveSelectedItemUp, False); ac++;
  1812.     XtSetArg(av[ac], XmNtype, XmDROP_DOWN_LIST_BOX); ac++;
  1813.     XtSetArg(av[ac], XmNarrowType, XmMOTIF); ac++;
  1814.     kids[i++] = mail_fcc_combo = DtCreateComboBox(form2, "mailFccCombo", av, ac);
  1815.  
  1816.     ac = 0;
  1817.     XtSetArg(av[ac], XmNvisual, v); ac++;
  1818.     XtSetArg(av[ac], XmNdepth, depth); ac++;
  1819.     XtSetArg(av[ac], XmNcolormap, cmap); ac++;
  1820.     XtSetArg(av[ac], XmNmoveSelectedItemUp, False); ac++;
  1821.     XtSetArg(av[ac], XmNtype, XmDROP_DOWN_LIST_BOX); ac++;
  1822.     XtSetArg(av[ac], XmNarrowType, XmMOTIF); ac++;
  1823.     kids[i++] = news_fcc_combo = DtCreateComboBox(form2, "newsFccCombo", av, ac);
  1824.  
  1825.     fep->mail_fcc_toggle = mail_fcc_toggle;
  1826.     fep->mail_fcc_combo = mail_fcc_combo;
  1827.     fep->news_fcc_toggle = news_fcc_toggle;
  1828.     fep->news_fcc_combo = news_fcc_combo;
  1829.  
  1830.     XtVaSetValues(fcc_label,
  1831.                   XmNalignment, XmALIGNMENT_BEGINNING,
  1832.                   XmNtopAttachment, XmATTACH_WIDGET,
  1833.                   XmNtopWidget, news_msg_label,
  1834.                   XmNtopOffset, 8,
  1835.                   XmNleftAttachment, XmATTACH_FORM,
  1836.                   XmNrightAttachment, XmATTACH_NONE,
  1837.                   XmNbottomAttachment, XmATTACH_NONE,
  1838.                   NULL);
  1839.  
  1840.     int labels_width2;
  1841.     labels_width2 = XfeVaGetWidestWidget(mail_fcc_toggle,
  1842.                                          news_fcc_toggle,
  1843.                                          NULL);
  1844.  
  1845.     int labels_height2;
  1846.     labels_height2 = XfeVaGetTallestWidget(mail_fcc_toggle,
  1847.                                            mail_fcc_combo,
  1848.                                            NULL);
  1849.  
  1850.     XtVaSetValues(mail_fcc_toggle,
  1851.                   XmNindicatorType, XmN_OF_MANY,
  1852.                   XmNheight, labels_height2,
  1853.                   XmNwidth, labels_width2,
  1854.                   XmNtopAttachment, XmATTACH_WIDGET,
  1855.                   XmNtopWidget, fcc_label,
  1856.                   XmNtopOffset, 8,
  1857.                   XmNleftAttachment, XmATTACH_FORM,
  1858.                   XmNleftOffset, 16,
  1859.                   XmNrightAttachment, XmATTACH_NONE,
  1860.                   XmNbottomAttachment, XmATTACH_NONE,
  1861.                   NULL);
  1862.  
  1863.     XtVaSetValues(mail_fcc_combo,
  1864.                   XmNheight, labels_height2,
  1865.                   XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  1866.                   XmNtopWidget, mail_fcc_toggle,
  1867.                   XmNleftAttachment, XmATTACH_WIDGET,
  1868.                   XmNleftWidget, mail_fcc_toggle,
  1869.                   XmNrightAttachment, XmATTACH_NONE,
  1870.                   XmNbottomAttachment, XmATTACH_NONE,
  1871.                   NULL);
  1872.  
  1873.     XtVaSetValues(news_fcc_toggle,
  1874.                   XmNindicatorType, XmN_OF_MANY,
  1875.                   XmNwidth, labels_width2,
  1876.                   XmNheight, labels_height2,
  1877.                   XmNtopAttachment, XmATTACH_WIDGET,
  1878.                   XmNtopWidget, mail_fcc_toggle,
  1879.                   XmNtopOffset, 8,
  1880.                   XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  1881.                   XmNleftWidget, mail_fcc_toggle,
  1882.                   XmNrightAttachment, XmATTACH_NONE,
  1883.                   XmNbottomAttachment, XmATTACH_NONE,
  1884.                   NULL);
  1885.  
  1886.     XtVaSetValues(news_fcc_combo,
  1887.                   XmNheight, labels_height2,
  1888.                   XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  1889.                   XmNtopWidget, news_fcc_toggle,
  1890.                   XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  1891.                   XmNleftWidget, mail_fcc_combo,
  1892.                   XmNrightAttachment, XmATTACH_NONE,
  1893.                   XmNbottomAttachment, XmATTACH_NONE,
  1894.                   NULL);
  1895.  
  1896.     XtManageChildren(kids, i);
  1897.     XtManageChild(label2);
  1898.     XtManageChild(form2);
  1899.     XtManageChild(frame2);
  1900.  
  1901.     Widget more_button;
  1902.  
  1903.     ac = 0;
  1904.     i = 0;
  1905.  
  1906.     kids[i++] = more_button =
  1907.         XmCreatePushButtonGadget(form, "moreButton", av, ac);
  1908.  
  1909.     XtVaSetValues(more_button,
  1910.                   XmNtopAttachment, XmATTACH_WIDGET,
  1911.                   XmNtopWidget, frame2,
  1912.                   XmNtopOffset, 8,
  1913.                   XmNleftAttachment, XmATTACH_NONE,
  1914.                   XmNrightAttachment, XmATTACH_FORM,
  1915.                   XmNbottomAttachment, XmATTACH_NONE,
  1916.                   NULL);
  1917.     XtAddCallback(more_button, XmNactivateCallback, cb_more, this);
  1918.  
  1919.     XtManageChildren(kids, i);
  1920.  
  1921.     setCreated(TRUE);
  1922. }
  1923.  
  1924. // Member:       init
  1925. // Description:  Initializes page for MailNewsComposition
  1926. // Inputs:
  1927. // Side effects: 
  1928.  
  1929. void XFE_PrefsPageMailNewsComposition::init()
  1930. {
  1931.     XP_ASSERT(m_prefsDataMailNewsComposition);
  1932.  
  1933.     PrefsDataMailNewsComposition  *fep = m_prefsDataMailNewsComposition;
  1934.     XFE_GlobalPrefs               *prefs = &fe_globalPrefs;
  1935.     char                           buf[1024];
  1936.  
  1937.     // BCC
  1938.  
  1939.     XtVaSetValues(fep->mail_email_self_toggle, XmNset, prefs->mailbccself_p, 0);
  1940.     fe_SetTextField(fep->mail_email_other_text, prefs->mail_bcc);
  1941.  
  1942.     XtVaSetValues(fep->news_email_self_toggle, XmNset, prefs->newsbccself_p, 0);
  1943.     fe_SetTextField(fep->news_email_other_text, prefs->news_bcc);
  1944.  
  1945.     // FCC
  1946.  
  1947.     XtVaSetValues(fep->mail_fcc_toggle, XmNset, prefs->mailfcc_p, 0);
  1948.     setFccMenu(TRUE);
  1949.  
  1950.     XtVaSetValues(fep->news_fcc_toggle, XmNset, prefs->newsfcc_p, 0);
  1951.     setFccMenu(FALSE);
  1952.  
  1953.     XtVaSetValues(fep->auto_quote_toggle, XmNset, prefs->autoquote_reply, 0);
  1954.  
  1955.     // send_html_msg_toggle
  1956.  
  1957.     XtVaSetValues(fep->send_html_msg_toggle, XmNset, prefs->send_html_msg, 0);
  1958.  
  1959.     // wrap length
  1960.  
  1961.     PR_snprintf(buf, sizeof(buf), "%d", prefs->msg_wrap_length);
  1962.     XtVaSetValues(fep->wrap_length_text, XmNvalue, buf, 0);
  1963.  
  1964.  
  1965.     // If the preference is locked, grey it out.
  1966.     XtSetSensitive(fep->mail_email_self_toggle,
  1967.                    !PREF_PrefIsLocked("mail.cc_self"));
  1968.     XtSetSensitive(fep->mail_email_other_text,
  1969.                    !PREF_PrefIsLocked("mail.default_cc"));
  1970.     XtSetSensitive(fep->news_email_self_toggle,
  1971.                    !PREF_PrefIsLocked("news.cc_self"));
  1972.     XtSetSensitive(fep->news_email_other_text,
  1973.                    !PREF_PrefIsLocked("news.default_cc"));
  1974.     XtSetSensitive(fep->mail_fcc_toggle,
  1975.                    !PREF_PrefIsLocked("mail.use_fcc"));
  1976.     XtSetSensitive(fep->mail_fcc_combo,
  1977.                    !PREF_PrefIsLocked("mail.default_fcc"));
  1978.     XtSetSensitive(fep->news_fcc_toggle,
  1979.                    !PREF_PrefIsLocked("news.use_fcc"));
  1980.     XtSetSensitive(fep->news_fcc_combo,
  1981.                    !PREF_PrefIsLocked("news.default_fcc"));
  1982.     XtSetSensitive(fep->auto_quote_toggle,
  1983.                    !PREF_PrefIsLocked("mail.auto_quote"));
  1984.     XtSetSensitive(fep->send_html_msg_toggle,
  1985.                    !PREF_PrefIsLocked("mail.send_html"));
  1986.     XtSetSensitive(fep->wrap_length_text,
  1987.                    !PREF_PrefIsLocked("mailnews.wraplength"));
  1988.  
  1989.     setInitialized(TRUE);
  1990. }
  1991.  
  1992. // Member:       install
  1993. // Description:  
  1994. // Inputs:
  1995. // Side effects: 
  1996.  
  1997. void XFE_PrefsPageMailNewsComposition::install()
  1998. {
  1999.     fe_installMailNewsComposition();
  2000. }
  2001.  
  2002. // Member:       save
  2003. // Description:  
  2004. // Inputs:
  2005. // Side effects: 
  2006.  
  2007. void XFE_PrefsPageMailNewsComposition::save()
  2008. {
  2009.     PrefsDataMailNewsComposition *fep = m_prefsDataMailNewsComposition;
  2010.  
  2011.     XP_ASSERT(fep);
  2012.  
  2013.     // BCC
  2014.  
  2015.     PREFS_SET_GLOBALPREF_TEXT(mail_bcc, mail_email_other_text);
  2016.     PREFS_SET_GLOBALPREF_TEXT(news_bcc, news_email_other_text);
  2017.     XtVaGetValues(fep->mail_email_self_toggle, 
  2018.                   XmNset, &fe_globalPrefs.mailbccself_p, 
  2019.                   0);
  2020.     XtVaGetValues(fep->news_email_self_toggle,
  2021.                   XmNset, &fe_globalPrefs.newsbccself_p, 
  2022.                   0);
  2023.  
  2024.     // FCC
  2025.  
  2026.     if (fe_globalPrefs.mail_fcc) {
  2027.         free(fe_globalPrefs.mail_fcc); 
  2028.         fe_globalPrefs.mail_fcc = 0;
  2029.     }
  2030.  
  2031.     if (fe_globalPrefs.news_fcc) {
  2032.         free(fe_globalPrefs.news_fcc); 
  2033.         fe_globalPrefs.news_fcc = 0;
  2034.     }
  2035.  
  2036.     XtVaGetValues(fep->mail_fcc_toggle, 
  2037.                   XmNset, &fe_globalPrefs.mailfcc_p, 
  2038.                   0);
  2039.     XtVaGetValues(fep->news_fcc_toggle,
  2040.                   XmNset, &fe_globalPrefs.newsfcc_p, 
  2041.                   0);
  2042.  
  2043.     // If there is no folder, unselect the fcc toggle
  2044.  
  2045.     if ((fe_globalPrefs.mailfcc_p) &&
  2046.         (XP_ListCount(fep->mail_fcc_folders) == 0))
  2047.         fe_globalPrefs.mailfcc_p = FALSE;
  2048.  
  2049.     if ((fe_globalPrefs.newsfcc_p) &&
  2050.         (XP_ListCount(fep->news_fcc_folders) == 0))
  2051.         fe_globalPrefs.newsfcc_p = FALSE;
  2052.         
  2053.     // Find out which folder was selected
  2054.  
  2055.     int       pos;
  2056.  
  2057.     if ((fe_globalPrefs.mailfcc_p) &&
  2058.         (XP_ListCount(fep->mail_fcc_folders) > 0)){
  2059.         XtVaGetValues(fep->mail_fcc_combo, XmNselectedPosition, &pos, 0);
  2060.         fe_globalPrefs.mail_fcc = 
  2061.             XP_STRDUP((char *)XP_ListGetObjectNum(fep->mail_fcc_paths, pos+1));
  2062.         }
  2063.     else 
  2064.         fe_globalPrefs.mail_fcc = XP_STRDUP("");
  2065.  
  2066.     if ((fe_globalPrefs.newsfcc_p) &&
  2067.         (XP_ListCount(fep->news_fcc_folders) > 0)){
  2068.         XtVaGetValues(fep->news_fcc_combo, XmNselectedPosition, &pos, 0);
  2069.         fe_globalPrefs.news_fcc = 
  2070.             XP_STRDUP((char *)XP_ListGetObjectNum(fep->news_fcc_paths, pos+1));
  2071.     }
  2072.     else
  2073.         fe_globalPrefs.news_fcc = XP_STRDUP("");
  2074.  
  2075.     // Auto quote when replying
  2076.  
  2077.     XtVaGetValues(fep->auto_quote_toggle,
  2078.                   XmNset, &fe_globalPrefs.autoquote_reply, 
  2079.                   0);
  2080.  
  2081.     // Send HTML messages
  2082.  
  2083.     XtVaGetValues(fep->send_html_msg_toggle,
  2084.                   XmNset, &fe_globalPrefs.send_html_msg, 
  2085.                   0);
  2086.  
  2087.     // Wrap length
  2088.  
  2089.     char                    c;
  2090.     char                   *s = 0;
  2091.     int                     n;
  2092.  
  2093.     XtVaGetValues (fep->wrap_length_text, XmNvalue, &s, 0);
  2094.     if (1 == sscanf (s, " %d %c", &n, &c) &&
  2095.         n > 0)
  2096.         fe_globalPrefs.msg_wrap_length = n;
  2097.     if (s) XtFree(s);
  2098.  
  2099.     // Install preferences
  2100.  
  2101.     install();
  2102. }
  2103.  
  2104. // Member:       getData
  2105. // Description:  
  2106. // Inputs:
  2107. // Side effects: 
  2108.  
  2109. PrefsDataMailNewsComposition *XFE_PrefsPageMailNewsComposition::getData()
  2110. {
  2111.     return m_prefsDataMailNewsComposition;
  2112. }
  2113.  
  2114. // Member:       setFccMenu
  2115. // Description:  
  2116. // Inputs:
  2117. // Side effects: 
  2118.  
  2119. void XFE_PrefsPageMailNewsComposition::setFccMenu(Boolean isMail)
  2120. {
  2121.     PrefsDataMailNewsComposition *fep = m_prefsDataMailNewsComposition;
  2122.     XFE_GlobalPrefs              *prefs = &fe_globalPrefs;
  2123.  
  2124.     Widget   combo  = isMail ? fep->mail_fcc_combo : fep->news_fcc_combo;
  2125.     XP_List *folders = isMail ? fep->mail_fcc_folders : fep->news_fcc_folders;
  2126.     XP_List *paths = isMail ? fep->mail_fcc_paths : fep->news_fcc_paths;
  2127.     char    *pref_folder_path = isMail ? prefs->mail_fcc : prefs->news_fcc;
  2128.  
  2129.     // Remove existing children 
  2130.  
  2131.     XmString  xms;
  2132.     int       i;
  2133.     char     *path;
  2134.     char     *folder;
  2135.  
  2136.     if (folders) {
  2137.         int count = XP_ListCount(folders);
  2138.         if (count > 0) {
  2139.             DtComboBoxDeleteAllItems(combo);
  2140.             for (i = 0; i < count; i++) {
  2141.                 folder = (char *)XP_ListGetObjectNum(folders, i+1);
  2142.                 path = (char *)XP_ListGetObjectNum(paths, i+1);
  2143.                 XP_FREEIF(folder);
  2144.                 XP_FREEIF(path);
  2145.             }
  2146.         }
  2147.         XP_ListDestroy(folders);
  2148.         XP_ListDestroy(paths);
  2149.     }
  2150.  
  2151.     if (isMail) {
  2152.         fep->mail_fcc_folders = XP_ListNew();
  2153.         fep->mail_fcc_paths = XP_ListNew();
  2154.     }
  2155.     else {
  2156.         fep->news_fcc_folders = XP_ListNew();
  2157.         fep->news_fcc_paths = XP_ListNew();
  2158.     }
  2159.     folders = isMail ? fep->mail_fcc_folders : fep->news_fcc_folders;
  2160.     paths = isMail ? fep->mail_fcc_paths : fep->news_fcc_paths;
  2161.  
  2162.     // Put the preferred folder as the first one on the list if there is one
  2163.  
  2164.     char *default_folder_path = (pref_folder_path && XP_STRLEN(pref_folder_path) > 0) ?
  2165.         pref_folder_path : 0;
  2166.     int default_folder_index = (-1);
  2167.  
  2168.     if (default_folder_path) {
  2169.         XP_ListAddObjectToEnd(folders, XP_STRDUP(default_folder_path));
  2170.         XP_ListAddObjectToEnd(paths, XP_STRDUP(default_folder_path));
  2171.         default_folder_index = 0;
  2172.     }
  2173.  
  2174.     // Now read in all folders
  2175.  
  2176.     int              depth = 0;
  2177.     int              num_sub_folders = 0;
  2178.     MSG_FolderInfo **children = 0;
  2179.     MSG_FolderInfo  *localMailTree = MSG_GetLocalMailTree(fe_getMNMaster());
  2180.  
  2181.     num_sub_folders = MSG_GetFolderChildren(fe_getMNMaster(), localMailTree, NULL, 0);
  2182.     
  2183.     if (num_sub_folders > 0) {
  2184.         children = (MSG_FolderInfo **)XP_CALLOC(num_sub_folders, sizeof(MSG_FolderInfo*));
  2185.         num_sub_folders = 
  2186.             MSG_GetFolderChildren(fe_getMNMaster(), localMailTree, children, num_sub_folders);
  2187.     }
  2188.  
  2189.     for (i = 0; i < num_sub_folders; i++) {
  2190.         fe_fcc_add_folders(paths, folders, children[i], default_folder_path, 
  2191.                            default_folder_index, depth);
  2192.     }
  2193.  
  2194.     
  2195.     int count = XP_ListCount(folders);
  2196.     if (count > 0) {
  2197.         for (i = 0; i < count; i++) {
  2198.             char *folder_name = (char *)XP_ListGetObjectNum(folders, i+1);
  2199.             xms = XmStringCreateLtoR(folder_name, XmFONTLIST_DEFAULT_TAG);
  2200.             DtComboBoxAddItem(combo, xms, 0, True);
  2201.             if (i == 0) DtComboBoxSelectItem(combo, xms);
  2202.             XmStringFree(xms);
  2203.         }
  2204.     }
  2205.     else {
  2206.         xms = XmStringCreateLtoR("", XmFONTLIST_DEFAULT_TAG);
  2207.         XtVaSetValues(combo, XmNlabelString, xms, 0);
  2208.         XmStringFree(xms);
  2209.     }
  2210.  
  2211.     if (children) XP_FREE(children);
  2212. }
  2213.  
  2214. // Member:       cb_more
  2215. // Description:  
  2216. // Inputs:
  2217. // Side effects: 
  2218.  
  2219. void XFE_PrefsPageMailNewsComposition::cb_more(Widget    /* w */,
  2220.                                                XtPointer closure,
  2221.                                                XtPointer /* callData */)
  2222. {
  2223.     XFE_PrefsPageMailNewsComposition *thePage = (XFE_PrefsPageMailNewsComposition *)closure;
  2224.     XFE_PrefsDialog                  *theDialog = thePage->getPrefsDialog();
  2225.     Widget                            mainw = theDialog->getBaseWidget();
  2226.  
  2227.     // Instantiate a mail server more dialog
  2228.  
  2229.     XFE_PrefsMsgMoreDialog *theMoreDialog = 0;
  2230.  
  2231.     if ((theMoreDialog =
  2232.          new XFE_PrefsMsgMoreDialog(theDialog, mainw, "prefsMsgMore")) == 0) {
  2233.         fe_perror(thePage->getContext(), XP_GetString(XFE_OUT_OF_MEMORY_URL));
  2234.         return;
  2235.     }
  2236.  
  2237.     // Initialize and pop up the more dialog
  2238.  
  2239.     theMoreDialog->initPage();
  2240.     theMoreDialog->show();
  2241. }
  2242.  
  2243. static void fe_fcc_add_folders(XP_List        *paths,
  2244.                                XP_List        *folders,
  2245.                                MSG_FolderInfo *info, 
  2246.                                char           *default_folder_path,
  2247.                                int             default_folder_index,
  2248.                                int             depth)
  2249. {
  2250.     int              num_sub_folders;
  2251.     int              i;
  2252.     MSG_FolderInfo **children = 0;
  2253.     char            *this_folder_path = fe_GetFolderPathFromInfo(info);
  2254.     char            *this_folder_name = fe_GetFolderNameFromInfo(info);
  2255.     char             folder_buf[256];
  2256.  
  2257.     // Create the button if this is different from the default folder
  2258.  
  2259.     *folder_buf = '\0';
  2260.     for (i = 0; i < depth; i++)
  2261.         XP_STRCAT(folder_buf, "  ");
  2262.     XP_STRCAT(folder_buf, this_folder_name);
  2263.  
  2264.     if ((default_folder_path != 0) &&
  2265.         ((XP_STRCMP(default_folder_path, this_folder_path) == 0))) {
  2266.         // The default folder path is a folder in the mail directory.
  2267.         // Replace the label with folder name.
  2268.         
  2269.         char *folder_name = (char *)XP_ListGetObjectNum(folders, default_folder_index+1);
  2270.         XP_ListRemoveObject(folders, folder_name);
  2271.         char *folder_path = (char *)XP_ListGetObjectNum(paths, default_folder_index+1);
  2272.         XP_ListRemoveObject(paths, folder_path);
  2273.  
  2274.         // add the default to the front of the list
  2275.         XP_ListAddObject(folders, XP_STRDUP(folder_buf));
  2276.         XP_ListAddObject(paths, XP_STRDUP(this_folder_path));
  2277.     }
  2278.     else {
  2279.         // If there is no default folder path, make Sent as the one that gets displayed
  2280.         if ((default_folder_path == 0) &&
  2281.             (XP_STRCMP(this_folder_name, 
  2282.                        XP_GetString(XFE_PREFS_MAIL_FOLDER_SENT)) == 0)) {
  2283.             // add the Sent folder to the front of the list
  2284.             XP_ListAddObject(folders, XP_STRDUP(folder_buf));
  2285.             XP_ListAddObject(paths, XP_STRDUP(this_folder_path));
  2286.         }
  2287.         else {
  2288.             // add this folder to the end of the list
  2289.             XP_ListAddObjectToEnd(folders, XP_STRDUP(folder_buf));
  2290.             XP_ListAddObjectToEnd(paths, XP_STRDUP(this_folder_path));
  2291.         }
  2292.     }
  2293.  
  2294.     num_sub_folders = MSG_GetFolderChildren(fe_getMNMaster(), info, NULL, 0);
  2295.  
  2296.     if (num_sub_folders > 0) {
  2297.         children = (MSG_FolderInfo **)XP_CALLOC(num_sub_folders, sizeof(MSG_FolderInfo*));
  2298.         num_sub_folders = MSG_GetFolderChildren(fe_getMNMaster(), info, children, num_sub_folders);
  2299.     }
  2300.  
  2301.     for (i = 0; i < num_sub_folders; i ++) {
  2302.         fe_fcc_add_folders(paths, folders, children[i], default_folder_path,
  2303.                            default_folder_index, depth+1);
  2304.     }
  2305.  
  2306.     if (num_sub_folders > 0)
  2307.         XP_FREE(children);
  2308. }
  2309.  
  2310. static char *fe_GetFolderPathFromInfo(MSG_FolderInfo *f) {
  2311.     return (char*)MSG_GetFolderNameFromID(f);
  2312. }
  2313.  
  2314. static char *fe_GetFolderNameFromInfo(MSG_FolderInfo *f) {
  2315.     char *name = 0;
  2316.     char *path = (char*)MSG_GetFolderNameFromID(f);
  2317.     if (strrchr(path, '/'))
  2318.         name = strrchr(path, '/') + 1;
  2319.     else
  2320.         name = path;
  2321.     return name;
  2322. }
  2323.  
  2324. // ************************************************************************
  2325. // ************************ Mail News/Mail Server *************************
  2326. // ************************************************************************
  2327.  
  2328. // Member:       XFE_PrefsPageMailNewsMserver
  2329. // Description:  Constructor
  2330. // Inputs:
  2331. // Side effects: 
  2332.  
  2333. XFE_PrefsPageMailNewsMserver::XFE_PrefsPageMailNewsMserver(XFE_PrefsDialog *dialog)
  2334.     : XFE_PrefsPage(dialog),
  2335.       m_prefsDataMailNewsMserver(0)
  2336. {
  2337. }
  2338.  
  2339. // Member:       ~XFE_PrefsPageMailNewsMserver
  2340. // Description:  Destructor
  2341. // Inputs:
  2342. // Side effects: 
  2343.  
  2344. XFE_PrefsPageMailNewsMserver::~XFE_PrefsPageMailNewsMserver()
  2345. {
  2346.     delete m_prefsDataMailNewsMserver;
  2347. }
  2348.  
  2349. // Member:       create
  2350. // Description:  Creates page for MailNews/Mail server
  2351. // Inputs:
  2352. // Side effects: 
  2353.  
  2354. void XFE_PrefsPageMailNewsMserver::create()
  2355. {
  2356.     Widget            kids[100];
  2357.     Arg               av[50];
  2358.     int               ac;
  2359.     int               i;
  2360.  
  2361.     PrefsDataMailNewsMserver *fep = NULL;
  2362.  
  2363.     fep = new PrefsDataMailNewsMserver;
  2364.     memset(fep, 0, sizeof(PrefsDataMailNewsMserver));
  2365.     m_prefsDataMailNewsMserver = fep;
  2366.  
  2367.     fep->context = getContext();
  2368.     fep->prompt_dialog = getPrefsDialog()->getDialogChrome();
  2369.  
  2370.     Widget form;
  2371.  
  2372.     ac = 0;
  2373.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
  2374.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
  2375.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  2376.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  2377.     form = XmCreateForm (m_wPageForm, "mailnewsMserver", av, ac);
  2378.     XtManageChild (form);
  2379.     m_wPage = fep->page = form;
  2380.  
  2381.     Widget frame1;
  2382.  
  2383.     ac = 0;
  2384.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  2385.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  2386.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
  2387.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
  2388.     frame1 = XmCreateFrame (form, "mServerFrame", av, ac);
  2389.  
  2390.     Widget form1;
  2391.  
  2392.     ac = 0;
  2393.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  2394.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  2395.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
  2396.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
  2397.     form1 = XmCreateForm (frame1, "mServerBox", av, ac);
  2398.  
  2399.     Widget server_label;
  2400.     Widget pop_user_name_label;
  2401.     Widget pop_user_name_text;
  2402.     Widget incoming_mail_server_label;
  2403.     Widget incoming_mail_server_text;
  2404.     Widget outgoing_mail_server_label;
  2405.     Widget outgoing_mail_server_text;
  2406.  
  2407.     // POP user name and Incoming/outgoing mail server
  2408.  
  2409.     ac = 0;
  2410.     i = 0;
  2411.  
  2412.     kids[i++] = server_label = 
  2413.         XmCreateLabelGadget(form1, "serverLabel", av, ac);
  2414.  
  2415.     kids[i++] = pop_user_name_label = 
  2416.         XmCreateLabelGadget(form1, "popUserNameLabel", av, ac);
  2417.  
  2418.     kids[i++] = incoming_mail_server_label = 
  2419.         XmCreateLabelGadget(form1, "incomingMailServerLabel", av, ac);
  2420.  
  2421.     kids[i++] = outgoing_mail_server_label = 
  2422.         XmCreateLabelGadget(form1, "outgoingMailServerLabel", av, ac);
  2423.  
  2424.     kids[i++] = pop_user_name_text =
  2425.         fe_CreateTextField(form1, "popUserNameText", av, ac);
  2426.  
  2427.     kids[i++] = incoming_mail_server_text =
  2428.         fe_CreateTextField(form1, "incomingMailServerText", av, ac);
  2429.  
  2430.     kids[i++] = outgoing_mail_server_text =
  2431.         fe_CreateTextField(form1, "outgoingMailServerText", av, ac);
  2432.  
  2433.     fep->pop_user_name_text = pop_user_name_text;
  2434.     fep->incoming_mail_server_text = incoming_mail_server_text;
  2435.     fep->outgoing_mail_server_text = outgoing_mail_server_text;
  2436.  
  2437.     // Mail server type
  2438.  
  2439.     Widget server_type_label;
  2440.     Widget pop3_toggle;
  2441.     Widget movemail_toggle;
  2442.     Widget imap_toggle;
  2443.  
  2444.  
  2445.     kids[i++] = server_type_label = 
  2446.         XmCreateLabelGadget(form1, "serverTypeLabel", av, ac);
  2447.  
  2448.     kids[i++] = pop3_toggle =
  2449.         XmCreateToggleButtonGadget(form1, "pop3Toggle", av, ac);
  2450.  
  2451.     kids[i++] = movemail_toggle =
  2452.         XmCreateToggleButtonGadget(form1, "moveMailToggle", av, ac);
  2453.  
  2454.     kids[i++] = imap_toggle =
  2455.         XmCreateToggleButtonGadget(form1, "imapToggle", av, ac);
  2456.  
  2457.     fep->pop3_toggle = pop3_toggle;
  2458.     fep->movemail_toggle = movemail_toggle;
  2459.     fep->imap_toggle = imap_toggle;
  2460.  
  2461.     Widget leave_msg_on_server_toggle;
  2462.     //    Widget imap_local_copies_toggle;
  2463.     Widget imap_server_ssl_toggle;
  2464.     Widget delete_is_move_to_trash_toggle;
  2465.  
  2466.     kids[i++] = leave_msg_on_server_toggle =
  2467.         XmCreateToggleButtonGadget(form1, "leaveMsgToggle", av, ac);
  2468.  
  2469.     //    kids[i++] = imap_local_copies_toggle =
  2470.     //  XmCreateToggleButtonGadget(form1, "imapLocalCopiesToggle", av, ac);
  2471.  
  2472.     kids[i++] = imap_server_ssl_toggle =
  2473.         XmCreateToggleButtonGadget(form1, "imapServerSslToggle", av, ac);
  2474.  
  2475.     kids[i++] = delete_is_move_to_trash_toggle =
  2476.         XmCreateToggleButtonGadget(form1, "imapDeleteToggle", av, ac);
  2477.  
  2478.     fep->leave_msg_on_server_toggle = leave_msg_on_server_toggle;
  2479.     //    fep->imap_local_copies_toggle = imap_local_copies_toggle;
  2480.     fep->imap_server_ssl_toggle = imap_server_ssl_toggle;
  2481.     fep->delete_is_move_to_trash_toggle = delete_is_move_to_trash_toggle;
  2482.  
  2483.     Widget built_in_app_toggle;
  2484.     Widget external_app_toggle;
  2485.     Widget external_app_text;
  2486.     Widget external_app_browse_button;
  2487.  
  2488.     kids[i++] = built_in_app_toggle =
  2489.         XmCreateToggleButtonGadget(form1, "builtInAppToggle", av, ac);
  2490.  
  2491.     kids[i++] = external_app_toggle =
  2492.         XmCreateToggleButtonGadget(form1, "externalAppToggle", av, ac);
  2493.  
  2494.     kids[i++] = external_app_text =
  2495.         fe_CreateTextField(form1, "externalAppText", av, ac);
  2496.  
  2497.     kids[i++] = external_app_browse_button =
  2498.         XmCreatePushButtonGadget(form1, "externalAppBrowse", av, ac);
  2499.  
  2500.     fep->built_in_app_toggle = built_in_app_toggle;
  2501.     fep->external_app_toggle = external_app_toggle;
  2502.     fep->external_app_text = external_app_text;
  2503.     fep->external_app_browse_button = external_app_browse_button;
  2504.  
  2505.  
  2506.     // Attachments
  2507.  
  2508.     int labels_width;
  2509.     int labels_height;
  2510.     int labels_height2;
  2511.  
  2512.     labels_width = XfeVaGetWidestWidget(pop_user_name_label,
  2513.                                         incoming_mail_server_label,
  2514.                                         outgoing_mail_server_label,
  2515.                                         NULL);
  2516.  
  2517.     labels_height = XfeVaGetTallestWidget(incoming_mail_server_label,
  2518.                                           incoming_mail_server_text,
  2519.                                           NULL);
  2520.  
  2521.     XtVaSetValues(server_label,
  2522.                   XmNalignment, XmALIGNMENT_BEGINNING,
  2523.                   XmNtopAttachment, XmATTACH_FORM,
  2524.                   XmNleftAttachment, XmATTACH_FORM,
  2525.                   XmNrightAttachment, XmATTACH_NONE,
  2526.                   XmNbottomAttachment, XmATTACH_NONE,
  2527.                   NULL);
  2528.  
  2529.     XtVaSetValues(pop_user_name_label,
  2530.                   XmNheight, labels_height,
  2531.                   RIGHT_JUSTIFY_VA_ARGS(pop_user_name_label,labels_width),
  2532.                   XmNtopAttachment, XmATTACH_WIDGET,
  2533.                   XmNtopWidget, server_label,
  2534.                   XmNleftAttachment, XmATTACH_FORM,
  2535.                   XmNrightAttachment, XmATTACH_NONE,
  2536.                   XmNbottomAttachment, XmATTACH_NONE,
  2537.                   NULL);
  2538.  
  2539.     XtVaSetValues(pop_user_name_text,
  2540.                   XmNheight, labels_height,
  2541.                   XmNcolumns, 25,
  2542.                   XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  2543.                   XmNtopWidget, pop_user_name_label,
  2544.                   XmNleftAttachment, XmATTACH_FORM,
  2545.                   XmNleftOffset, labels_width,
  2546.                   XmNrightAttachment, XmATTACH_NONE,
  2547.                   XmNbottomAttachment, XmATTACH_NONE,
  2548.                   NULL);
  2549.  
  2550.     XtVaSetValues(outgoing_mail_server_label,
  2551.                   RIGHT_JUSTIFY_VA_ARGS(outgoing_mail_server_label,labels_width),
  2552.                   XmNheight, labels_height,
  2553.                   XmNtopAttachment, XmATTACH_WIDGET,
  2554.                   XmNtopWidget, pop_user_name_label,
  2555.                   XmNleftAttachment, XmATTACH_FORM,
  2556.                   XmNrightAttachment, XmATTACH_NONE,
  2557.                   XmNbottomAttachment, XmATTACH_NONE,
  2558.                   NULL);
  2559.  
  2560.     XtVaSetValues(outgoing_mail_server_text,
  2561.                   XmNcolumns, 25,
  2562.                   XmNheight, labels_height,
  2563.                   XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  2564.                   XmNtopWidget, outgoing_mail_server_label,
  2565.                   XmNleftAttachment, XmATTACH_FORM,
  2566.                   XmNleftOffset, labels_width,
  2567.                   XmNrightAttachment, XmATTACH_NONE,
  2568.                   XmNbottomAttachment, XmATTACH_NONE,
  2569.                   NULL);
  2570.  
  2571.     XtVaSetValues(incoming_mail_server_label,
  2572.                   RIGHT_JUSTIFY_VA_ARGS(incoming_mail_server_label,labels_width),
  2573.                   XmNheight, labels_height,
  2574.                   XmNtopAttachment, XmATTACH_WIDGET,
  2575.                   XmNtopWidget, outgoing_mail_server_label,
  2576.                   XmNleftAttachment, XmATTACH_FORM,
  2577.                   XmNrightAttachment, XmATTACH_NONE,
  2578.                   XmNbottomAttachment, XmATTACH_NONE,
  2579.                   NULL);
  2580.  
  2581.     XtVaSetValues(incoming_mail_server_text,
  2582.                   XmNcolumns, 25,
  2583.                   XmNheight, labels_height,
  2584.                   XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  2585.                   XmNtopWidget, incoming_mail_server_label,
  2586.                   XmNleftAttachment, XmATTACH_FORM,
  2587.                   XmNleftOffset, labels_width,
  2588.                   XmNrightAttachment, XmATTACH_NONE,
  2589.                   XmNbottomAttachment, XmATTACH_NONE,
  2590.                   NULL);
  2591.  
  2592.     XtVaSetValues(server_type_label,
  2593.                   XmNalignment, XmALIGNMENT_BEGINNING,
  2594.                   XmNtopAttachment, XmATTACH_WIDGET,
  2595.                   XmNtopWidget, incoming_mail_server_text,
  2596.                   XmNleftAttachment, XmATTACH_FORM,
  2597.                   XmNrightAttachment, XmATTACH_NONE,
  2598.                   XmNbottomAttachment, XmATTACH_NONE,
  2599.                   NULL);
  2600.  
  2601.     XtVaSetValues(pop3_toggle,
  2602.                   XmNindicatorType, XmONE_OF_MANY,
  2603.                   XmNalignment, XmALIGNMENT_BEGINNING,
  2604.                   XmNtopAttachment, XmATTACH_WIDGET,
  2605.                   XmNtopWidget, server_type_label,
  2606.                   XmNleftAttachment, XmATTACH_FORM,
  2607.                   XmNrightAttachment, XmATTACH_NONE,
  2608.                   XmNbottomAttachment, XmATTACH_NONE,
  2609.                   NULL);
  2610.  
  2611.     XtVaSetValues(leave_msg_on_server_toggle,
  2612.                   XmNindicatorType, XmN_OF_MANY,
  2613.                   XmNtopAttachment, XmATTACH_WIDGET,
  2614.                   XmNtopWidget, pop3_toggle,
  2615.                   XmNleftAttachment, XmATTACH_FORM,
  2616.                   XmNleftOffset, 16,
  2617.                   XmNrightAttachment, XmATTACH_NONE,
  2618.                   XmNbottomAttachment, XmATTACH_NONE,
  2619.                   NULL);
  2620.  
  2621.     XtVaSetValues(movemail_toggle,
  2622.                   XmNalignment, XmALIGNMENT_BEGINNING,
  2623.                   XmNindicatorType, XmONE_OF_MANY,
  2624.                   XmNtopAttachment, XmATTACH_WIDGET,
  2625.                   XmNtopWidget, leave_msg_on_server_toggle,
  2626.                   XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  2627.                   XmNleftWidget, pop3_toggle,
  2628.                   XmNrightAttachment, XmATTACH_NONE,
  2629.                   XmNbottomAttachment, XmATTACH_NONE,
  2630.                   NULL);
  2631.  
  2632.     labels_height2 = XfeVaGetTallestWidget(external_app_toggle,
  2633.                                            external_app_text,
  2634.                                            external_app_browse_button,
  2635.                                            NULL);
  2636.  
  2637.     XtVaSetValues(built_in_app_toggle,
  2638.                   XmNindicatorType, XmONE_OF_MANY,
  2639.                   XmNtopAttachment, XmATTACH_WIDGET,
  2640.                   XmNtopWidget, movemail_toggle,
  2641.                   XmNleftAttachment, XmATTACH_FORM,
  2642.                   XmNleftOffset, 16,
  2643.                   XmNrightAttachment, XmATTACH_NONE,
  2644.                   XmNbottomAttachment, XmATTACH_NONE,
  2645.                   NULL);
  2646.  
  2647.     XtVaSetValues(external_app_toggle,
  2648.                   XmNindicatorType, XmONE_OF_MANY,
  2649.                   XmNheight, labels_height2,
  2650.                   XmNtopAttachment, XmATTACH_WIDGET,
  2651.                   XmNtopWidget, built_in_app_toggle,
  2652.                   XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  2653.                   XmNleftWidget, built_in_app_toggle,
  2654.                   XmNrightAttachment, XmATTACH_NONE,
  2655.                   XmNbottomAttachment, XmATTACH_NONE,
  2656.                   NULL);
  2657.  
  2658.     XtVaSetValues(external_app_text,
  2659.                   XmNheight, labels_height2,
  2660.                   XmNcolumns, 20,
  2661.                   XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  2662.                   XmNtopWidget, external_app_toggle,
  2663.                   XmNleftAttachment, XmATTACH_WIDGET,
  2664.                   XmNleftWidget, external_app_toggle,
  2665.                   XmNrightAttachment, XmATTACH_NONE,
  2666.                   XmNbottomAttachment, XmATTACH_NONE,
  2667.                   NULL);
  2668.  
  2669.     XtVaSetValues(external_app_browse_button,
  2670.                   XmNheight, labels_height2,
  2671.                   XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  2672.                   XmNtopWidget, external_app_toggle,
  2673.                   XmNleftAttachment, XmATTACH_WIDGET,
  2674.                   XmNleftWidget, external_app_text,
  2675.                   XmNrightAttachment, XmATTACH_NONE,
  2676.                   XmNbottomAttachment, XmATTACH_NONE,
  2677.                   NULL);
  2678.  
  2679.     XtVaSetValues(imap_toggle,
  2680.                   XmNalignment, XmALIGNMENT_BEGINNING,
  2681.                   XmNindicatorType, XmONE_OF_MANY,
  2682.                   XmNtopAttachment, XmATTACH_WIDGET,
  2683.                   XmNtopWidget, external_app_toggle,
  2684.                   XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  2685.                   XmNleftWidget, movemail_toggle,
  2686.                   XmNrightAttachment, XmATTACH_NONE,
  2687.                   XmNbottomAttachment, XmATTACH_NONE,
  2688.                   NULL);
  2689.  
  2690.     XtVaSetValues(delete_is_move_to_trash_toggle,
  2691.                   XmNindicatorType, XmN_OF_MANY,
  2692.                   XmNtopAttachment, XmATTACH_WIDGET,
  2693.                   XmNtopWidget, imap_toggle,
  2694.                   XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  2695.                   XmNleftWidget, leave_msg_on_server_toggle,
  2696.                   XmNrightAttachment, XmATTACH_NONE,
  2697.                   XmNbottomAttachment, XmATTACH_NONE,
  2698.                   NULL);
  2699.  
  2700.     XtVaSetValues(imap_server_ssl_toggle,
  2701.                   XmNindicatorType, XmN_OF_MANY,
  2702.                   XmNtopAttachment, XmATTACH_WIDGET,
  2703.                   XmNtopWidget, delete_is_move_to_trash_toggle,
  2704.                   XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  2705.                   XmNleftWidget, leave_msg_on_server_toggle,
  2706.                   XmNrightAttachment, XmATTACH_NONE,
  2707.                   XmNbottomAttachment, XmATTACH_NONE,
  2708.                   NULL);
  2709.  
  2710.     // Add callbacks
  2711.  
  2712.     XtAddCallback(pop3_toggle, XmNvalueChangedCallback,
  2713.                   cb_toggleServerType, fep);
  2714.     XtAddCallback(movemail_toggle, XmNvalueChangedCallback,
  2715.                   cb_toggleServerType, fep);
  2716.     XtAddCallback(imap_toggle, XmNvalueChangedCallback,
  2717.                   cb_toggleServerType, fep);
  2718.     
  2719.     XtAddCallback(built_in_app_toggle, XmNvalueChangedCallback,
  2720.                   cb_toggleApplication, fep);
  2721.     XtAddCallback(external_app_toggle, XmNvalueChangedCallback,
  2722.                   cb_toggleApplication, fep);
  2723.  
  2724.     XtAddCallback(external_app_browse_button, XmNactivateCallback,
  2725.                   cb_browseApplication, this);
  2726.  
  2727.     XtManageChildren (kids, i);
  2728.     XtManageChild(form1);
  2729.     XtManageChild(frame1);
  2730.  
  2731.     Widget more_button;
  2732.  
  2733.     ac = 0;
  2734.     i = 0;
  2735.  
  2736.     kids[i++] = more_button =
  2737.         XmCreatePushButtonGadget(form, "moreButton", av, ac);
  2738.  
  2739.     XtVaSetValues(more_button,
  2740.                   XmNheight, labels_height,
  2741.                   XmNtopAttachment, XmATTACH_WIDGET,
  2742.                   XmNtopWidget, frame1,
  2743.                   XmNtopOffset, 8,
  2744.                   XmNleftAttachment, XmATTACH_NONE,
  2745.                   XmNrightAttachment, XmATTACH_FORM,
  2746.                   XmNbottomAttachment, XmATTACH_NONE,
  2747.                   NULL);
  2748.  
  2749.     XtAddCallback(more_button, XmNactivateCallback,
  2750.                   cb_more, this);
  2751.  
  2752.     XtManageChildren(kids, i);
  2753.  
  2754.     setCreated(TRUE);
  2755. }
  2756.  
  2757. // Member:       init
  2758. // Description:  Initializes page for MailNewsMserver
  2759. // Inputs:
  2760. // Side effects: 
  2761.  
  2762. void XFE_PrefsPageMailNewsMserver::init()
  2763. {
  2764.     XP_ASSERT(m_prefsDataMailNewsMserver);
  2765.  
  2766.     PrefsDataMailNewsMserver  *fep = m_prefsDataMailNewsMserver;
  2767.     XFE_GlobalPrefs           *prefs = &fe_globalPrefs;
  2768.     XP_Bool                    b;
  2769.     Boolean                    sensitive;
  2770.     
  2771.     fe_SetTextField(fep->incoming_mail_server_text, prefs->pop3_host);
  2772.     fe_SetTextField(fep->outgoing_mail_server_text, prefs->mailhost);
  2773.     fe_SetTextField(fep->pop_user_name_text, prefs->pop3_user_id);
  2774.     XtVaSetValues(fep->leave_msg_on_server_toggle, XmNset, prefs->pop3_leave_mail_on_server, 0);
  2775.     //    XtVaSetValues(fep->imap_local_copies_toggle, XmNset, prefs->imap_local_copies, 0);
  2776.     XtVaSetValues(fep->imap_server_ssl_toggle, XmNset, prefs->imap_server_ssl, 0);
  2777.     XtVaSetValues(fep->delete_is_move_to_trash_toggle, XmNset, prefs->imap_delete_is_move_to_trash, 0);
  2778.     XtVaSetValues (fep->built_in_app_toggle, XmNset, prefs->builtin_movemail_p, 0);
  2779.     XtVaSetValues (fep->external_app_toggle, XmNset, !prefs->builtin_movemail_p, 0);
  2780.  
  2781.     sensitive = !PREF_PrefIsLocked("mail.server_type");
  2782.     XtSetSensitive(fep->movemail_toggle, sensitive);
  2783.     XtSetSensitive(fep->pop3_toggle, sensitive);
  2784.     XtSetSensitive(fep->imap_toggle, sensitive);
  2785.  
  2786.     if (prefs->mail_server_type == MAIL_SERVER_MOVEMAIL) {
  2787.         XtVaSetValues(fep->movemail_toggle, XmNset, True, 0);
  2788.         XtVaSetValues(fep->pop3_toggle, XmNset, False, 0);
  2789.         XtVaSetValues(fep->imap_toggle, XmNset, False, 0);
  2790.         XtVaSetValues(fep->pop_user_name_text, XmNsensitive, False, 0);
  2791.         XtVaSetValues(fep->incoming_mail_server_text, XmNsensitive, False, 0);
  2792.         b = prefs->builtin_movemail_p;
  2793.         sensitive = !PREF_PrefIsLocked("mail.use_builtin_movemail");
  2794.         XtVaSetValues (fep->built_in_app_toggle, XmNset, b && sensitive, 0);
  2795.         XtVaSetValues (fep->external_app_toggle, XmNset, !b && sensitive, 0);
  2796.         sensitive = !PREF_PrefIsLocked("mail.movemail_program");
  2797.         XtVaSetValues (fep->external_app_text, XmNsensitive, !b && sensitive, 0);
  2798.         XtVaSetValues(fep->external_app_browse_button, XmNsensitive, !b && sensitive, 0);
  2799.     } 
  2800.     else if (prefs->mail_server_type == MAIL_SERVER_POP3) {
  2801.         // Pop 3
  2802.         XtVaSetValues(fep->pop3_toggle, XmNset, True, 0);
  2803.         XtVaSetValues(fep->movemail_toggle, XmNset, False, 0);
  2804.         XtVaSetValues(fep->imap_toggle, XmNset, False, 0);
  2805.         sensitive = !PREF_PrefIsLocked("network.hosts.pop_server");
  2806.         XtVaSetValues(fep->incoming_mail_server_text, XmNsensitive, sensitive, 0);
  2807.         sensitive = !PREF_PrefIsLocked("mail.pop_name");
  2808.         XtVaSetValues(fep->pop_user_name_text, XmNsensitive, sensitive, 0);
  2809.         XtVaSetValues(fep->built_in_app_toggle, XmNsensitive, False, 0);
  2810.         XtVaSetValues(fep->external_app_toggle, XmNsensitive, False, 0);
  2811.         XtVaSetValues(fep->external_app_text, XmNsensitive, False, 0);
  2812.         XtVaSetValues(fep->external_app_browse_button, XmNsensitive, False, 0);
  2813.     }
  2814.     else if (prefs->mail_server_type == MAIL_SERVER_IMAP) {
  2815.         XtVaSetValues(fep->movemail_toggle, XmNset, False, 0);
  2816.         XtVaSetValues(fep->pop3_toggle, XmNset, False, 0);
  2817.         XtVaSetValues(fep->imap_toggle, XmNset, True, 0);
  2818.         XtVaSetValues(fep->built_in_app_toggle, XmNsensitive, False, 0);
  2819.         XtVaSetValues(fep->external_app_toggle, XmNsensitive, False, 0);
  2820.         XtVaSetValues(fep->external_app_text, XmNsensitive, False, 0);
  2821.         XtVaSetValues(fep->external_app_browse_button, XmNsensitive, False, 0);
  2822.         sensitive = !PREF_PrefIsLocked("mail.pop_name");
  2823.         XtVaSetValues(fep->pop_user_name_text, XmNsensitive, sensitive, 0);
  2824.         sensitive = !PREF_PrefIsLocked("network.hosts.pop_server");
  2825.         XtVaSetValues(fep->incoming_mail_server_text, XmNsensitive, sensitive, 0);
  2826.     } 
  2827.  
  2828.  
  2829.     sensitive = ( prefs->mail_server_type == MAIL_SERVER_POP3 &&
  2830.                   !PREF_PrefIsLocked("mail.leave_on_server") );
  2831.     XtSetSensitive(fep->leave_msg_on_server_toggle, sensitive);
  2832.  
  2833.     //    sensitive = ( prefs->mail_server_type == MAIL_SERVER_IMAP &&
  2834.     //                  !PREF_PrefIsLocked("mail.imap.local_copies") );
  2835.     //    XtSetSensitive(fep->imap_local_copies_toggle, sensitive);
  2836.  
  2837.     sensitive = ( prefs->mail_server_type == MAIL_SERVER_IMAP &&
  2838.                   !PREF_PrefIsLocked("mail.imap.server_ssl") );
  2839.     XtSetSensitive(fep->imap_server_ssl_toggle, sensitive);
  2840.  
  2841.     sensitive = ( prefs->mail_server_type == MAIL_SERVER_IMAP &&
  2842.                   !PREF_PrefIsLocked("mail.imap.delete_is_move_to_trash") );
  2843.     XtSetSensitive(fep->delete_is_move_to_trash_toggle, sensitive);
  2844.  
  2845.     XtSetSensitive(fep->outgoing_mail_server_text, 
  2846.                    !PREF_PrefIsLocked("network.hosts.smtp_server"));
  2847.  
  2848.     fe_SetTextField(fep->external_app_text, prefs->movemail_program);
  2849.  
  2850.     setInitialized(TRUE);
  2851. }
  2852.  
  2853. // Member:       verify
  2854. // Description:  
  2855. // Inputs:
  2856. // Side effects: 
  2857.  
  2858. Boolean XFE_PrefsPageMailNewsMserver::verify()
  2859. {
  2860.     char         buf[10000];
  2861.     char        *buf2;
  2862.     char        *warning;
  2863.     int          size;
  2864.     int          orig_mail_server_type = fe_globalPrefs.mail_server_type;
  2865.     int          new_mail_server_type=0;  // Initialized to avoid warning - RK
  2866.     Boolean      b;
  2867.  
  2868.     XP_ASSERT(m_prefsDataMailNewsMserver);
  2869.     PrefsDataMailNewsMserver *fep = m_prefsDataMailNewsMserver;
  2870.  
  2871.     // Pop up a dialog warning the user that he has to exit
  2872.     // in order for mail server prefs to take effect.
  2873.  
  2874.     XtVaGetValues(fep->pop3_toggle, XmNset, &b, 0);
  2875.     if (b) new_mail_server_type = MAIL_SERVER_POP3;
  2876.     
  2877.     XtVaGetValues(fep->movemail_toggle, XmNset, &b, 0);
  2878.     if (b) new_mail_server_type = MAIL_SERVER_MOVEMAIL;
  2879.  
  2880.     XtVaGetValues(fep->imap_toggle, XmNset, &b, 0);
  2881.     if (b) new_mail_server_type = MAIL_SERVER_IMAP;
  2882.  
  2883.     if (new_mail_server_type != orig_mail_server_type) {
  2884.         if (! XFE_Confirm(getContext(), XP_GetString(MK_MSG_MAIL_DIRECTORY_CHANGED))) {
  2885.             // revert to old prefs if the user changes his mind
  2886.             init();
  2887.             return FALSE;
  2888.         }
  2889.     }
  2890.  
  2891.     buf2 = buf;
  2892.     strcpy (buf, XP_GetString(XFE_WARNING));
  2893.     buf2 = buf + XP_STRLEN(buf);
  2894.     warning = buf2;
  2895.     size = buf + sizeof (buf) - warning;
  2896.  
  2897.     PREFS_CHECK_HOST(fep->outgoing_mail_server_text, XP_GetString(XFE_MAIL_HOST), 
  2898.                      warning, size);
  2899.  
  2900.     if (*buf2) {
  2901.         FE_Alert (getContext(), fe_StringTrim (buf));
  2902.         return FALSE;
  2903.     }
  2904.     else {
  2905.         return TRUE;
  2906.     }
  2907. }
  2908.  
  2909. // Member:       install
  2910. // Description:  
  2911. // Inputs:
  2912. // Side effects: 
  2913.  
  2914. void XFE_PrefsPageMailNewsMserver::install()
  2915. {
  2916.     fe_installMailNewsMserver();
  2917. }
  2918.  
  2919. // Member:       save
  2920. // Description:  
  2921. // Inputs:
  2922. // Side effects: 
  2923.  
  2924. void XFE_PrefsPageMailNewsMserver::save()
  2925. {
  2926.     PrefsDataMailNewsMserver *fep = m_prefsDataMailNewsMserver;
  2927.     Boolean                   b;
  2928.  
  2929.     XP_ASSERT(fep);
  2930.  
  2931.     // Mail server and type
  2932.  
  2933.     // POP3
  2934.  
  2935.     XtVaGetValues(fep->leave_msg_on_server_toggle, XmNset, &b, 0);
  2936.     fe_globalPrefs.pop3_leave_mail_on_server = b;
  2937.  
  2938.     XtVaGetValues(fep->pop3_toggle, XmNset, &b, 0);
  2939.     if (b) {
  2940.         fe_globalPrefs.mail_server_type = MAIL_SERVER_POP3;
  2941.     }
  2942.  
  2943.     // Movemail
  2944.     XtVaGetValues(fep->movemail_toggle, XmNset, &b, 0);
  2945.     fe_globalPrefs.use_movemail_p = b;
  2946.     if (b) {
  2947.         fe_globalPrefs.mail_server_type = MAIL_SERVER_MOVEMAIL;
  2948.     }
  2949.  
  2950.     // IMAP
  2951.     //    XtVaGetValues(fep->imap_local_copies_toggle, XmNset, &b, 0);
  2952.     //    fe_globalPrefs.imap_local_copies = b;
  2953.     XtVaGetValues(fep->imap_server_ssl_toggle, XmNset, &b, 0);
  2954.     fe_globalPrefs.imap_server_ssl = b;
  2955.  
  2956.     XtVaGetValues(fep->delete_is_move_to_trash_toggle, XmNset, &b, 0);
  2957.     fe_globalPrefs.imap_delete_is_move_to_trash = b;
  2958.  
  2959.     XtVaGetValues(fep->imap_toggle, XmNset, &b, 0);
  2960.     if (b) {
  2961.         fe_globalPrefs.mail_server_type = MAIL_SERVER_IMAP;
  2962.     }
  2963.  
  2964.  
  2965.     PREFS_SET_GLOBALPREF_TEXT(movemail_program, external_app_text);
  2966.     PREFS_SET_GLOBALPREF_TEXT(pop3_host, incoming_mail_server_text);
  2967.     PREFS_SET_GLOBALPREF_TEXT(pop3_user_id, pop_user_name_text);
  2968.     PREFS_SET_GLOBALPREF_TEXT(mailhost, outgoing_mail_server_text);
  2969.  
  2970.     if (fe_globalPrefs.use_movemail_p) {
  2971.         XtVaGetValues(fep->built_in_app_toggle, XmNset, &b, 0);
  2972.         fe_globalPrefs.builtin_movemail_p = b;
  2973.     }
  2974.  
  2975.     // Install preferences
  2976.  
  2977.     install();
  2978. }
  2979.  
  2980. // Member:       getData
  2981. // Description:  
  2982. // Inputs:
  2983. // Side effects: 
  2984.  
  2985. PrefsDataMailNewsMserver *XFE_PrefsPageMailNewsMserver::getData()
  2986. {
  2987.     return m_prefsDataMailNewsMserver;
  2988. }
  2989.  
  2990. // Member:       cb_browseApplication
  2991. // Description:  
  2992. // Inputs:
  2993. // Side effects: 
  2994.  
  2995. void XFE_PrefsPageMailNewsMserver::cb_browseApplication(Widget    /* w */,
  2996.                                                         XtPointer closure,
  2997.                                                         XtPointer /* callData */)
  2998. {
  2999.     XFE_PrefsPageMailNewsMserver *thePage = (XFE_PrefsPageMailNewsMserver *)closure;
  3000.     XFE_PrefsDialog              *theDialog = thePage->getPrefsDialog();
  3001.     PrefsDataMailNewsMserver     *fep = thePage->getData();
  3002.  
  3003.     fe_browse_file_of_text(theDialog->getContext(), fep->external_app_text, False);
  3004. }
  3005.  
  3006. // Member:       cb_more
  3007. // Description:  
  3008. // Inputs:
  3009. // Side effects: 
  3010.  
  3011. void XFE_PrefsPageMailNewsMserver::cb_more(Widget    /* w */,
  3012.                                            XtPointer closure,
  3013.                                            XtPointer /* callData */)
  3014. {
  3015.     XFE_PrefsPageMailNewsMserver *thePage = (XFE_PrefsPageMailNewsMserver *)closure;
  3016.     XFE_PrefsDialog              *theDialog = thePage->getPrefsDialog();
  3017.     Widget                        mainw = theDialog->getBaseWidget();
  3018.  
  3019.     //    while (!XtIsWMShell(mainw) && (XtParent(mainw)!=0))
  3020.     //        mainw = XtParent(mainw);
  3021.  
  3022.     // Instantiate a mail server more dialog
  3023.  
  3024.     XFE_PrefsMserverMoreDialog *theMoreDialog = 0;
  3025.  
  3026.     if ((theMoreDialog =
  3027.          new XFE_PrefsMserverMoreDialog(theDialog, mainw, "prefsMserverMore")) == 0) {
  3028.         fe_perror(thePage->getContext(), XP_GetString(XFE_OUT_OF_MEMORY_URL));
  3029.         return;
  3030.     }
  3031.  
  3032.     // Initialize and pop up the more dialog
  3033.  
  3034.     theMoreDialog->initPage();
  3035.     theMoreDialog->show();
  3036. }
  3037.  
  3038. // Member:       cb_toggleServerType
  3039. // Description:  
  3040. // Inputs:
  3041. // Side effects: 
  3042.  
  3043. void XFE_PrefsPageMailNewsMserver::cb_toggleServerType(Widget    w,
  3044.                                                        XtPointer closure,
  3045.                                                        XtPointer callData)
  3046. {
  3047.     XmToggleButtonCallbackStruct *cb = (XmToggleButtonCallbackStruct *)callData;
  3048.     PrefsDataMailNewsMserver     *fep = (PrefsDataMailNewsMserver *)closure;
  3049.     Boolean                       sensitive;
  3050.  
  3051.     if (! cb->set) {
  3052.         XtVaSetValues(w, XmNset, True, 0);
  3053.     }
  3054.     else if (w == fep->pop3_toggle) {
  3055.         XtVaSetValues(fep->movemail_toggle, XmNset, False, 0);
  3056.         XtVaSetValues(fep->imap_toggle, XmNset, False, 0);
  3057.         XtVaSetValues(fep->built_in_app_toggle, XmNsensitive, False, 0);
  3058.         XtVaSetValues(fep->external_app_toggle, XmNsensitive, False, 0);
  3059.         XtVaSetValues(fep->external_app_text, XmNsensitive, False, 0);
  3060.         XtVaSetValues(fep->external_app_browse_button, XmNsensitive, False, 0);
  3061.         XtVaSetValues(fep->pop_user_name_text, 
  3062.                       XmNsensitive, !PREF_PrefIsLocked("mail.pop_name"), 0);
  3063.         XtVaSetValues(fep->incoming_mail_server_text, 
  3064.                       XmNsensitive, !PREF_PrefIsLocked("network.hosts.pop_server"), 0);
  3065.         XtVaSetValues(fep->leave_msg_on_server_toggle, 
  3066.                       XmNsensitive, !PREF_PrefIsLocked("mail.leave_on_server"),
  3067.                       0);
  3068.  
  3069.         XtVaSetValues(fep->imap_server_ssl_toggle, XmNsensitive, False, 0);
  3070.         XtVaSetValues(fep->delete_is_move_to_trash_toggle, XmNsensitive, False, 0);
  3071.     }
  3072.     else if (w == fep->movemail_toggle) {
  3073.         XtVaSetValues(fep->pop3_toggle, XmNset, False, 0);
  3074.         XtVaSetValues(fep->imap_toggle, XmNset, False, 0);
  3075.         sensitive = !PREF_PrefIsLocked("mail.use_builtin_movemail");
  3076.         XtVaSetValues(fep->built_in_app_toggle, XmNsensitive, sensitive, 0);
  3077.         XtVaSetValues(fep->external_app_toggle, XmNsensitive, sensitive, 0);
  3078.         sensitive = !PREF_PrefIsLocked("mail.movemail_program");
  3079.         XtVaSetValues(fep->external_app_text, XmNsensitive, sensitive, 0);
  3080.         XtVaSetValues(fep->external_app_browse_button, XmNsensitive, sensitive, 0);
  3081.         XtVaSetValues(fep->pop_user_name_text, XmNsensitive, False, 0);
  3082.         XtVaSetValues(fep->incoming_mail_server_text, XmNsensitive, False, 0);
  3083.         XtVaSetValues(fep->leave_msg_on_server_toggle, XmNsensitive, False, 0);
  3084.         //        XtVaSetValues(fep->imap_local_copies_toggle, XmNsensitive, False, 0);
  3085.         XtVaSetValues(fep->imap_server_ssl_toggle, XmNsensitive, False, 0);
  3086.         XtVaSetValues(fep->delete_is_move_to_trash_toggle, XmNsensitive, False, 0);
  3087.     }
  3088.     else if (w == fep->imap_toggle) {
  3089.         XtVaSetValues(fep->movemail_toggle, XmNset, False, 0);
  3090.         XtVaSetValues(fep->pop3_toggle, XmNset, False, 0);
  3091.         XtVaSetValues(fep->built_in_app_toggle, XmNsensitive, False, 0);
  3092.         XtVaSetValues(fep->external_app_toggle, XmNsensitive, False, 0);
  3093.         XtVaSetValues(fep->external_app_text, XmNsensitive, False, 0);
  3094.         XtVaSetValues(fep->external_app_browse_button, XmNsensitive, False, 0);
  3095.         sensitive = !PREF_PrefIsLocked("mail.pop_name");
  3096.         XtVaSetValues(fep->pop_user_name_text, XmNsensitive, sensitive, 0);
  3097.         sensitive = !PREF_PrefIsLocked("network.hosts.pop_server");
  3098.         XtVaSetValues(fep->incoming_mail_server_text, XmNsensitive, sensitive, 0);
  3099.         XtVaSetValues(fep->leave_msg_on_server_toggle, XmNsensitive, False, 0);
  3100.         //        XtVaSetValues(fep->imap_local_copies_toggle, 
  3101.         //                      XmNsensitive, !PREF_PrefIsLocked("mail.imap.local_copies"), 0);
  3102.         XtVaSetValues(fep->imap_server_ssl_toggle, 
  3103.                       XmNsensitive, !PREF_PrefIsLocked("mail.imap.server_ssl"), 0);
  3104.         XtVaSetValues(fep->delete_is_move_to_trash_toggle, 
  3105.                       XmNsensitive, !PREF_PrefIsLocked("mail.imap.delete_is_move_to_trash"), 0);
  3106.     }
  3107.     else
  3108.         abort();
  3109. }
  3110.  
  3111. // Member:       cb_toggleApplication
  3112. // Description:  
  3113. // Inputs:
  3114. // Side effects: 
  3115.  
  3116. void XFE_PrefsPageMailNewsMserver::cb_toggleApplication(Widget    w,
  3117.                                                         XtPointer closure,
  3118.                                                         XtPointer callData)
  3119. {
  3120.     XmToggleButtonCallbackStruct *cb = (XmToggleButtonCallbackStruct *)callData;
  3121.     PrefsDataMailNewsMserver     *fep = (PrefsDataMailNewsMserver *)closure;
  3122.  
  3123.     if (! cb->set) {
  3124.         XtVaSetValues(w, XmNset, True, 0);
  3125.     }
  3126.     else if (w == fep->built_in_app_toggle) {
  3127.         XtVaSetValues(fep->external_app_toggle, XmNset, False, 0);
  3128.         XtVaSetValues(fep->external_app_text, XmNsensitive, False, 0);
  3129.         XtVaSetValues(fep->external_app_browse_button, XmNsensitive, False, 0);
  3130.     }
  3131.     else if (w == fep->external_app_toggle) {
  3132.         XtVaSetValues(fep->built_in_app_toggle, XmNset, False, 0);
  3133.         XtVaSetValues(fep->external_app_text, XmNsensitive, True, 0);
  3134.         XtVaSetValues(fep->external_app_browse_button, XmNsensitive, True, 0);
  3135.     }
  3136.     else
  3137.         abort();    
  3138. }
  3139.  
  3140. // ************************************************************************
  3141. // ************************ Mail News/News Server *************************
  3142. // ************************************************************************
  3143.  
  3144. // Member:       XFE_PrefsPageMailNewsNserver
  3145. // Description:  Constructor
  3146. // Inputs:
  3147. // Side effects: 
  3148.  
  3149. XFE_PrefsPageMailNewsNserver::XFE_PrefsPageMailNewsNserver(XFE_PrefsDialog *dialog)
  3150.     : XFE_PrefsPage(dialog),
  3151.       m_prefsDataMailNewsNserver(0)
  3152. {
  3153. }
  3154.  
  3155. // Member:       ~XFE_PrefsPageMailNewsNserver
  3156. // Description:  Destructor
  3157. // Inputs:
  3158. // Side effects: 
  3159.  
  3160. XFE_PrefsPageMailNewsNserver::~XFE_PrefsPageMailNewsNserver()
  3161. {
  3162.     delete m_prefsDataMailNewsNserver;
  3163. }
  3164.  
  3165. // Member:       create
  3166. // Description:  Creates page for MailNews/News server
  3167. // Inputs:
  3168. // Side effects: 
  3169.  
  3170. void XFE_PrefsPageMailNewsNserver::create()
  3171. {
  3172.     Widget            kids[100];
  3173.     Arg               av[50];
  3174.     int               ac;
  3175.     int               i;
  3176.  
  3177.     PrefsDataMailNewsNserver *fep = NULL;
  3178.  
  3179.     fep = new PrefsDataMailNewsNserver;
  3180.     memset(fep, 0, sizeof(PrefsDataMailNewsNserver));
  3181.     m_prefsDataMailNewsNserver = fep;
  3182.  
  3183.     fep->context = getContext();
  3184.     fep->prompt_dialog = getPrefsDialog()->getDialogChrome();
  3185.  
  3186.     Widget form;
  3187.  
  3188.     ac = 0;
  3189.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
  3190.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
  3191.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  3192.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  3193.     form = XmCreateForm (m_wPageForm, "mailnewsNserver", av, ac);
  3194.     XtManageChild (form);
  3195.     m_wPage = fep->page = form;
  3196.  
  3197.     Widget frame1;
  3198.  
  3199.     ac = 0;
  3200.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  3201.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  3202.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
  3203.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
  3204.     frame1 = XmCreateFrame (form, "nServerFrame", av, ac);
  3205.  
  3206.     Widget form1;
  3207.  
  3208.     ac = 0;
  3209.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  3210.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  3211.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
  3212.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
  3213.     form1 = XmCreateForm (frame1, "nServerBox", av, ac);
  3214.  
  3215.     Widget news_server_label;
  3216.     Widget nntp_server_label;
  3217.     Widget port_label;
  3218.  
  3219.     ac = 0;
  3220.     i = 0;
  3221.  
  3222.     kids[i++] = news_server_label = 
  3223.         XmCreateLabelGadget(form1, "newsServerLabel", av, ac);
  3224.  
  3225.     kids[i++] = port_label = 
  3226.         XmCreateLabelGadget(form1, "portLabel", av, ac);
  3227.  
  3228.     kids[i++] = nntp_server_label = 
  3229.         XmCreateLabelGadget(form1, "nntpServerLabel", av, ac);
  3230.  
  3231.     kids[i++] = fep->nntp_server_text =
  3232.         fe_CreateTextField(form1, "nntpServerText", av, ac);
  3233.  
  3234.     kids[i++] = fep->port_text =
  3235.         fe_CreateTextField(form1, "serverPortText", av, ac);
  3236.  
  3237.     kids[i++] = fep->secure_toggle =
  3238.         XmCreateToggleButtonGadget(form1, "secure", av, ac);
  3239.  
  3240.     XtVaSetValues(news_server_label,
  3241.                   XmNalignment, XmALIGNMENT_BEGINNING,
  3242.                   XmNtopAttachment, XmATTACH_FORM,
  3243.                   XmNleftAttachment, XmATTACH_FORM,
  3244.                   XmNrightAttachment, XmATTACH_NONE,
  3245.                   XmNbottomAttachment, XmATTACH_NONE,
  3246.                   NULL);
  3247.  
  3248.     XtVaSetValues(nntp_server_label,
  3249.                   XmNalignment, XmALIGNMENT_BEGINNING,
  3250.                   XmNtopAttachment, XmATTACH_WIDGET,
  3251.                   XmNtopWidget, news_server_label,
  3252.                   XmNtopOffset, 4,
  3253.                   XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  3254.                   XmNleftWidget, news_server_label,
  3255.                   XmNrightAttachment, XmATTACH_NONE,
  3256.                   XmNbottomAttachment, XmATTACH_NONE,
  3257.                   NULL);
  3258.  
  3259.     XtVaSetValues(fep->nntp_server_text,
  3260.                   XmNcolumns, 35,
  3261.                   XmNtopAttachment, XmATTACH_WIDGET,
  3262.                   XmNtopWidget, nntp_server_label,
  3263.                   XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  3264.                   XmNleftWidget, news_server_label,
  3265.                   XmNrightAttachment, XmATTACH_NONE,
  3266.                   XmNbottomAttachment, XmATTACH_NONE,
  3267.                   NULL);
  3268.  
  3269.     int labels_height;
  3270.     labels_height = XfeVaGetTallestWidget(port_label,
  3271.                                           fep->port_text,
  3272.                                           fep->secure_toggle,
  3273.                                           NULL);
  3274.  
  3275.     XtVaSetValues(port_label,
  3276.                   XmNheight, labels_height,
  3277.                   XmNalignment, XmALIGNMENT_BEGINNING,
  3278.                   XmNtopAttachment, XmATTACH_WIDGET,
  3279.                   XmNtopWidget, fep->nntp_server_text,
  3280.                   XmNtopOffset, 4,
  3281.                   XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  3282.                   XmNleftWidget, news_server_label,
  3283.                   XmNrightAttachment, XmATTACH_NONE,
  3284.                   XmNbottomAttachment, XmATTACH_NONE,
  3285.                   NULL);
  3286.  
  3287.     XtVaSetValues(fep->port_text,
  3288.                   XmNheight, labels_height,
  3289.                   XmNcolumns, 5,
  3290.                   XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  3291.                   XmNtopWidget, port_label,
  3292.                   XmNleftAttachment, XmATTACH_WIDGET,
  3293.                   XmNleftWidget, port_label,
  3294.                   XmNrightAttachment, XmATTACH_NONE,
  3295.                   XmNbottomAttachment, XmATTACH_NONE,
  3296.                   NULL);
  3297.     
  3298.     XtVaSetValues(fep->secure_toggle,
  3299.                   XmNheight, labels_height,
  3300.                   XmNindicatorType, XmN_OF_MANY,
  3301.                   XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  3302.                   XmNtopWidget, port_label,
  3303.                   XmNleftAttachment, XmATTACH_WIDGET,
  3304.                   XmNleftWidget, fep->port_text,
  3305.                   XmNleftOffset, 24,
  3306.                   XmNrightAttachment, XmATTACH_NONE,
  3307.                   XmNbottomAttachment, XmATTACH_NONE,
  3308.                   NULL);
  3309.  
  3310.  
  3311.     XtManageChildren (kids, i);
  3312.     XtManageChild(form1);
  3313.     XtManageChild(frame1);
  3314.  
  3315.     Widget frame2;
  3316.  
  3317.     ac = 0;
  3318.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  3319.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  3320.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
  3321.     XtSetArg (av [ac], XmNtopWidget, frame1); ac++;
  3322.     XtSetArg (av [ac], XmNtopOffset, 8); ac++;
  3323.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
  3324.     frame2 = XmCreateFrame(form, "newsDirFrame", av, ac);
  3325.  
  3326.     Widget form2;
  3327.  
  3328.     ac = 0;
  3329.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  3330.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  3331.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
  3332.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
  3333.     form2 = XmCreateForm (frame2, "newsDirBox", av, ac);
  3334.  
  3335.     Widget news_dir_label;
  3336.     Widget browse_button;
  3337.     Widget msg_label;
  3338.  
  3339.     ac = 0;
  3340.     i = 0;
  3341.  
  3342.     kids[i++] = news_dir_label = 
  3343.         XmCreateLabelGadget(form2, "newsDirLabel", av, ac);
  3344.  
  3345.     kids[i++] = msg_label = 
  3346.         XmCreateLabelGadget(form2, "msgLabel", av, ac);
  3347.  
  3348.     kids[i++] = fep->news_dir_text =
  3349.         fe_CreateTextField(form2, "newsDirText", av, ac);
  3350.  
  3351.     kids[i++] = fep->msg_size_text =
  3352.         fe_CreateTextField(form2, "msgSizeText", av, ac);
  3353.  
  3354.     kids[i++] = fep->notify_toggle =
  3355.         XmCreateToggleButtonGadget(form2, "notify", av, ac);
  3356.  
  3357.     kids[i++] = fep->browse_button = browse_button =
  3358.         XmCreatePushButtonGadget(form2, "browse", av, ac);
  3359.  
  3360.     XtVaSetValues(news_dir_label,
  3361.                   XmNalignment, XmALIGNMENT_BEGINNING,
  3362.                   XmNtopAttachment, XmATTACH_FORM,
  3363.                   XmNleftAttachment, XmATTACH_FORM,
  3364.                   XmNrightAttachment, XmATTACH_NONE,
  3365.                   XmNbottomAttachment, XmATTACH_NONE,
  3366.                   NULL);
  3367.  
  3368.     XtVaSetValues(fep->news_dir_text,
  3369.                   XmNcolumns, 35,
  3370.                   XmNtopAttachment, XmATTACH_WIDGET,
  3371.                   XmNtopWidget, news_dir_label,
  3372.                   XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  3373.                   XmNleftWidget, news_dir_label,
  3374.                   XmNrightAttachment, XmATTACH_NONE,
  3375.                   XmNbottomAttachment, XmATTACH_NONE,
  3376.                   NULL);
  3377.  
  3378.     XtVaSetValues(browse_button,
  3379.                   XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  3380.                   XmNtopWidget, fep->news_dir_text,
  3381.                   XmNleftAttachment, XmATTACH_WIDGET,
  3382.                   XmNleftWidget, fep->news_dir_text,
  3383.                   XmNleftOffset, 16,
  3384.                   XmNrightAttachment, XmATTACH_NONE,
  3385.                   XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET,
  3386.                   XmNbottomWidget, fep->news_dir_text,
  3387.                   NULL);
  3388.  
  3389.     labels_height = XfeVaGetTallestWidget(fep->notify_toggle,
  3390.                                           fep->msg_size_text,
  3391.                                           msg_label,
  3392.                                           NULL);
  3393.  
  3394.     XtVaSetValues(fep->notify_toggle,
  3395.                   XmNtopOffset, 4,
  3396.                   XmNheight, labels_height,
  3397.                   XmNtopAttachment, XmATTACH_WIDGET,
  3398.                   XmNtopWidget, fep->news_dir_text,
  3399.                   XmNleftAttachment, XmATTACH_FORM,
  3400.                   XmNrightAttachment, XmATTACH_NONE,
  3401.                   XmNbottomAttachment, XmATTACH_NONE,
  3402.                   NULL);
  3403.  
  3404.     XtVaSetValues(fep->msg_size_text,
  3405.                   XmNcolumns, 6,
  3406.                   XmNheight, labels_height,
  3407.                   XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  3408.                   XmNtopWidget, fep->notify_toggle,
  3409.                   XmNleftAttachment, XmATTACH_WIDGET,
  3410.                   XmNleftWidget, fep->notify_toggle,
  3411.                   XmNrightAttachment, XmATTACH_NONE,
  3412.                   XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET,
  3413.                   XmNbottomWidget, fep->notify_toggle,
  3414.                   NULL);
  3415.  
  3416.     XtVaSetValues(msg_label,
  3417.                   XmNheight, labels_height,
  3418.                   XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  3419.                   XmNtopWidget, fep->notify_toggle,
  3420.                   XmNleftAttachment, XmATTACH_WIDGET,
  3421.                   XmNleftWidget, fep->msg_size_text,
  3422.                   XmNrightAttachment, XmATTACH_NONE,
  3423.                   XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET,
  3424.                   XmNbottomWidget, fep->msg_size_text,
  3425.                   NULL);
  3426.  
  3427.     XtAddCallback(fep->secure_toggle, XmNvalueChangedCallback, cb_toggleSecure, fep);
  3428.     XtAddCallback(browse_button, XmNactivateCallback, cb_browse, this);
  3429.  
  3430.     XtManageChildren(kids, i);
  3431.     XtManageChild(form2);
  3432.     XtManageChild(frame2);
  3433.  
  3434.     setCreated(TRUE);
  3435. }
  3436.  
  3437. // Member:       init
  3438. // Description:  Initializes page for MailNewsNserver
  3439. // Inputs:
  3440. // Side effects: 
  3441.  
  3442. void XFE_PrefsPageMailNewsNserver::init()
  3443. {
  3444.     XP_ASSERT(m_prefsDataMailNewsNserver);
  3445.  
  3446.     PrefsDataMailNewsNserver  *fep = m_prefsDataMailNewsNserver;
  3447.     XFE_GlobalPrefs           *prefs = &fe_globalPrefs;
  3448.     Boolean                    sensitive;
  3449.     char                       buf[256];
  3450.  
  3451.     // News server
  3452.  
  3453.     XtVaSetValues(fep->nntp_server_text, 
  3454.                   XmNsensitive, !PREF_PrefIsLocked("network.hosts.nntp_server"),
  3455.                   0);
  3456.     fe_SetTextField(fep->nntp_server_text, prefs->newshost);
  3457.  
  3458.     PR_snprintf(buf, sizeof(buf), "%d", prefs->news_server_port);
  3459.     XtVaSetValues(fep->port_text,
  3460.                   XmNsensitive, !PREF_PrefIsLocked("news.server_port"),
  3461.                   0);
  3462.     fe_SetTextField(fep->port_text, buf);
  3463.  
  3464.     XtVaSetValues(fep->secure_toggle,
  3465.                   XmNset, prefs->news_server_secure,
  3466.                   XmNsensitive, !PREF_PrefIsLocked("news.server_is_secure"),
  3467.                   0);
  3468.  
  3469.     // News folder and download
  3470.  
  3471.     fe_SetTextField(fep->news_dir_text, prefs->newsrc_directory);
  3472.     sensitive = !PREF_PrefIsLocked("news.directory");
  3473.     XtSetSensitive(fep->news_dir_text, sensitive);
  3474.     XtSetSensitive(fep->browse_button, sensitive);
  3475.  
  3476.     XtVaSetValues(fep->notify_toggle, XmNset, prefs->news_notify_on, 0);
  3477.     PR_snprintf(buf, sizeof(buf), "%d", prefs->news_max_articles);
  3478.     XtVaSetValues(fep->msg_size_text, XmNvalue, buf, 0);
  3479.  
  3480.     XtSetSensitive(fep->notify_toggle, !PREF_PrefIsLocked("news.notify.on"));
  3481.     XtSetSensitive(fep->msg_size_text, !PREF_PrefIsLocked("news.notify.size"));
  3482.  
  3483.     setInitialized(TRUE);
  3484. }
  3485.  
  3486. // Member:       verify
  3487. // Description:  
  3488. // Inputs:
  3489. // Side effects: 
  3490.  
  3491. Boolean XFE_PrefsPageMailNewsNserver::verify()
  3492. {
  3493.     char         buf[10000];
  3494.     char        *buf2;
  3495.     char        *warning;
  3496.     struct stat  st;
  3497.     int          size;
  3498.  
  3499.     buf2 = buf;
  3500.     strcpy (buf, XP_GetString(XFE_WARNING));
  3501.     buf2 = buf + XP_STRLEN(buf);
  3502.     warning = buf2;
  3503.     size = buf + sizeof (buf) - warning;
  3504.  
  3505.     XP_ASSERT(m_prefsDataMailNewsNserver);
  3506.     PrefsDataMailNewsNserver  *fep = m_prefsDataMailNewsNserver;
  3507.  
  3508.     PREFS_CHECK_HOST (fep->nntp_server_text,
  3509.                       XP_GetString(XFE_NEWS_HOST), warning, size);
  3510.     PREFS_CHECK_DIR  (fep->news_dir_text,
  3511.                       XP_GetString(XFE_NEWS_DIR),
  3512.                       warning, size);
  3513.  
  3514.     if (*buf2) {
  3515.         FE_Alert(getContext(), fe_StringTrim (buf));
  3516.         return FALSE;
  3517.     }
  3518.     else {
  3519.         return TRUE;
  3520.     }
  3521. }
  3522.  
  3523. // Member:       install
  3524. // Description:  
  3525. // Inputs:
  3526. // Side effects: 
  3527.  
  3528. void XFE_PrefsPageMailNewsNserver::install()
  3529. {
  3530.     fe_installMailNewsNserver();
  3531. }
  3532.  
  3533. // Member:       save
  3534. // Description:  
  3535. // Inputs:
  3536. // Side effects: 
  3537.  
  3538. void XFE_PrefsPageMailNewsNserver::save()
  3539. {
  3540.     PrefsDataMailNewsNserver *fep = m_prefsDataMailNewsNserver;
  3541.  
  3542.     XP_ASSERT(fep);
  3543.  
  3544.     PREFS_SET_GLOBALPREF_TEXT(newshost, nntp_server_text);
  3545.  
  3546.     XP_FREEIF(fe_globalPrefs.newsrc_directory);
  3547.     char *s = fe_GetTextField(fep->news_dir_text);
  3548.     fe_globalPrefs.newsrc_directory = s ? s : XP_STRDUP("");
  3549.  
  3550.     Boolean b;
  3551.  
  3552.     XtVaGetValues(fep->notify_toggle, XmNset, &b, 0);
  3553.     fe_globalPrefs.news_notify_on = b;
  3554.  
  3555.     XtVaGetValues(fep->secure_toggle, XmNset, &b, 0);
  3556.     fe_globalPrefs.news_server_secure = b;
  3557.  
  3558.     char *text;
  3559.     char  dummy;
  3560.     int   size = 0;
  3561.     int   port = 0;
  3562.  
  3563.     XtVaGetValues(fep->msg_size_text, XmNvalue, &text, 0);
  3564.     if (1 == sscanf(text, " %d %c", &size, &dummy) &&
  3565.         size >= 0)
  3566.         fe_globalPrefs.news_max_articles = size;
  3567.     if (text) XtFree(text);
  3568.  
  3569.     XtVaGetValues(fep->port_text, XmNvalue, &text, 0);
  3570.     if (1 == sscanf(text, " %d %c", &port, &dummy) &&
  3571.         port >= 0)
  3572.         fe_globalPrefs.news_server_port = port;
  3573.     if (text) XtFree(text);
  3574.  
  3575.     // Install preferences
  3576.  
  3577.     install();
  3578. }
  3579.  
  3580. // Member:       getData
  3581. // Description:  
  3582. // Inputs:
  3583. // Side effects: 
  3584.  
  3585. PrefsDataMailNewsNserver *XFE_PrefsPageMailNewsNserver::getData()
  3586. {
  3587.     return m_prefsDataMailNewsNserver;
  3588. }
  3589.  
  3590. // Member:       cb_browse
  3591. // Description:  
  3592. // Inputs:
  3593. // Side effects: 
  3594.  
  3595. void XFE_PrefsPageMailNewsNserver::cb_browse(Widget    /* w */,
  3596.                                              XtPointer closure,
  3597.                                              XtPointer /* callData */)
  3598. {
  3599.     XFE_PrefsPageMailNewsNserver *thePage = (XFE_PrefsPageMailNewsNserver *)closure;
  3600.     XFE_PrefsDialog              *theDialog = thePage->getPrefsDialog();
  3601.     PrefsDataMailNewsNserver     *fep = thePage->getData();
  3602.  
  3603.     fe_browse_file_of_text(theDialog->getContext(), fep->news_dir_text, True);
  3604. }
  3605.  
  3606. // Member:       cb_toggleSecure
  3607. // Description:  
  3608. // Inputs:
  3609. // Side effects: 
  3610.  
  3611. void XFE_PrefsPageMailNewsNserver::cb_toggleSecure(Widget    /*w*/,
  3612.                                                    XtPointer closure,
  3613.                                                    XtPointer callData)
  3614. {
  3615.     XmToggleButtonCallbackStruct *cb = (XmToggleButtonCallbackStruct *)callData;
  3616.     PrefsDataMailNewsNserver     *fep = (PrefsDataMailNewsNserver *)closure;
  3617.     char                         *port_text = 0;
  3618.     char                         *trimmed_port_text;
  3619.     int                           port_number;
  3620.     char                          buf[256];
  3621.  
  3622.     port_text = fe_GetTextField(fep->port_text);
  3623.     if (port_text) {
  3624.         trimmed_port_text = fe_StringTrim(port_text);
  3625.         if (XP_STRLEN(trimmed_port_text) == 0) {
  3626.             port_number = (cb->set) ? SECURE_NEWS_PORT : NEWS_PORT;
  3627.         }
  3628.         else {
  3629.             port_number = atoi(trimmed_port_text);
  3630.             if (cb->set && port_number == NEWS_PORT)
  3631.                 port_number = SECURE_NEWS_PORT;
  3632.             else if (! cb->set && port_number == SECURE_NEWS_PORT)
  3633.                 port_number = NEWS_PORT;
  3634.         }
  3635.         XtFree(port_text);
  3636.     }
  3637.     else {
  3638.         port_number = (cb->set) ? SECURE_NEWS_PORT : NEWS_PORT;
  3639.     }
  3640.  
  3641.     PR_snprintf(buf, sizeof(buf), "%d", port_number);
  3642.     fe_SetTextField(fep->port_text, buf);
  3643. }
  3644.  
  3645. // ************************************************************************
  3646. // *********************** Mail News/Address Book *************************
  3647. // ************************************************************************
  3648.  
  3649. const int XFE_PrefsPageMailNewsAddrBook::OUTLINER_COLUMN_NAME = 0;
  3650. const int XFE_PrefsPageMailNewsAddrBook::OUTLINER_COLUMN_MAX_LENGTH = 256;
  3651. const int XFE_PrefsPageMailNewsAddrBook::OUTLINER_INIT_POS = (-1);
  3652. #define STRING_COL_NAME    "Name"
  3653.  
  3654. // Member:       XFE_PrefsPageMailNewsAddrBook
  3655. // Description:  Constructor
  3656. // Inputs:
  3657. // Side effects: 
  3658.  
  3659. XFE_PrefsPageMailNewsAddrBook::XFE_PrefsPageMailNewsAddrBook(XFE_PrefsDialog *dialog)
  3660.     : XFE_PrefsPage(dialog),
  3661.       m_prefsDataMailNewsAddrBook(0),
  3662.       m_rowIndex(0)
  3663. {
  3664. }
  3665.  
  3666. // Member:       ~XFE_PrefsPageMailNewsAddrBook
  3667. // Description:  Destructor
  3668. // Inputs:
  3669. // Side effects: 
  3670.  
  3671. XFE_PrefsPageMailNewsAddrBook::~XFE_PrefsPageMailNewsAddrBook()
  3672. {
  3673.     PrefsDataMailNewsAddrBook   *fep = m_prefsDataMailNewsAddrBook;
  3674.  
  3675.     if (fep) {
  3676.         delete fep->dir_outliner;
  3677.         if (fep->directories) 
  3678.             XP_ListDestroy(fep->directories);
  3679.         // Note: do not destroy deleted_directories. It's taken care of by 
  3680.         // DIR_DeleteServerList, which is called by DIR_CleanUpServerPreferences
  3681.     }
  3682.     delete m_prefsDataMailNewsAddrBook;
  3683. }
  3684.  
  3685. // Member:       create
  3686. // Description:  Creates page for MailNews/Address Book
  3687. // Inputs:
  3688. // Side effects: 
  3689.  
  3690. void XFE_PrefsPageMailNewsAddrBook::create()
  3691. {
  3692.     Widget            kids[100];
  3693.     Arg               av[50];
  3694.     int               ac;
  3695.     int               i;
  3696.  
  3697.     PrefsDataMailNewsAddrBook *fep = NULL;
  3698.  
  3699.     fep = new PrefsDataMailNewsAddrBook;
  3700.     memset(fep, 0, sizeof(PrefsDataMailNewsAddrBook));
  3701.     m_prefsDataMailNewsAddrBook = fep;
  3702.  
  3703.     fep->context = getContext();
  3704.     fep->prompt_dialog = getPrefsDialog()->getDialogChrome();
  3705.  
  3706.     Widget form;
  3707.  
  3708.     ac = 0;
  3709.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
  3710.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
  3711.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  3712.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  3713.     form = XmCreateForm (m_wPageForm, "mailnewsAddrBook", av, ac);
  3714.     XtManageChild (form);
  3715.     m_wPage = fep->page = form;
  3716.  
  3717.     Widget frame1;
  3718.  
  3719.     ac = 0;
  3720.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  3721.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  3722.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
  3723.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
  3724.     frame1 = XmCreateFrame (form, "addrBookFrame", av, ac);
  3725.  
  3726.     Widget form1;
  3727.  
  3728.     ac = 0;
  3729.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  3730.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  3731.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
  3732.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
  3733.     form1 = XmCreateForm (frame1, "addrBookBox", av, ac);
  3734.  
  3735.     Widget addr_book_label;
  3736.     Widget dir_list;
  3737.     Widget up_button;
  3738.     Widget down_button;
  3739.     Widget add_button;
  3740.     Widget edit_button;
  3741.     Widget delete_button;
  3742.  
  3743.     ac = 0;
  3744.     i = 0;
  3745.  
  3746.     kids[i++] = addr_book_label = 
  3747.         XmCreateLabelGadget(form1, "addrBookLabel", av, ac);
  3748.  
  3749.     kids[i++] = up_button = 
  3750.         XmCreateArrowButtonGadget(form1, "upButton", av, ac);
  3751.  
  3752.     kids[i++] = down_button = 
  3753.         XmCreateArrowButtonGadget(form1, "downButton", av, ac);
  3754.  
  3755.     kids[i++] = add_button =
  3756.         XmCreatePushButtonGadget(form1, "newButton", av, ac);
  3757.  
  3758.     kids[i++] = edit_button =
  3759.         XmCreatePushButtonGadget(form1, "editButton", av, ac);
  3760.  
  3761.     kids[i++] = delete_button =
  3762.         XmCreatePushButtonGadget(form1, "deleteButton", av, ac);
  3763.  
  3764.     // Outliner
  3765.  
  3766.     int           num_columns = 1;
  3767.     static int    default_column_widths[] = {40};
  3768.     XFE_Outliner *outliner;
  3769.  
  3770.     outliner = new XFE_Outliner("dirList",            // name
  3771.                                 this,                  // outlinable
  3772.                                 getPrefsDialog(),      // top level                                  
  3773.                                 form1,                 // parent
  3774.                                 FALSE,                 // constant size
  3775.                                 FALSE,                 // has headings
  3776.                                 num_columns,           // number of columns
  3777.                                 num_columns,           // number of visible columns
  3778.                                 default_column_widths, // default column widths
  3779.                                 OUTLINER_GEOMETRY_PREF
  3780.                                 );
  3781.  
  3782.     dir_list = fep->dir_list = outliner->getBaseWidget();
  3783.  
  3784.     XtVaSetValues(outliner->getBaseWidget(),
  3785.                   XtVaTypedArg, XmNblankBackground, XmRString, "white", 6,
  3786.                   XmNvisibleRows, 10,
  3787.                   NULL);
  3788.     XtVaSetValues(outliner->getBaseWidget(),
  3789.                   XmNcellDefaults, True,
  3790.                   XtVaTypedArg, XmNcellBackground, XmRString, "white", 6,
  3791.                   NULL);
  3792.  
  3793.     outliner->setColumnResizable(OUTLINER_COLUMN_NAME, False);
  3794.     outliner->show();
  3795.     
  3796.     fep->add_button = add_button;
  3797.     fep->edit_button = edit_button;
  3798.     fep->delete_button = delete_button;
  3799.     fep->up_button = up_button;
  3800.     fep->down_button = down_button;
  3801.     fep->dir_outliner = outliner;
  3802.  
  3803.     XtVaSetValues(addr_book_label,
  3804.                   XmNalignment, XmALIGNMENT_BEGINNING,
  3805.                   XmNtopAttachment, XmATTACH_FORM,
  3806.                   XmNleftAttachment, XmATTACH_FORM,
  3807.                   XmNrightAttachment, XmATTACH_NONE,
  3808.                   XmNbottomAttachment, XmATTACH_NONE,
  3809.                   NULL);
  3810.  
  3811.     Pixel parent_bg;
  3812.     XtVaGetValues(getPrefsDialog()->getDialogChrome(), XmNbackground, &parent_bg, 0);
  3813.  
  3814.     XtVaSetValues(dir_list,
  3815.                   XmNtopAttachment, XmATTACH_WIDGET,
  3816.                   XmNtopWidget, addr_book_label,
  3817.                   XmNtopOffset, 4,
  3818.                   XmNleftAttachment, XmATTACH_FORM,
  3819.                   XmNrightAttachment, XmATTACH_NONE,
  3820.                   XmNbottomAttachment, XmATTACH_NONE,
  3821.                   NULL);
  3822.     
  3823.     Dimension list_height;
  3824.     Dimension up_button_height;
  3825.     int down_button_top_offset;
  3826.     int up_button_top_offset;
  3827.  
  3828.     XtVaGetValues(down_button,
  3829.                   XmNtopOffset, &down_button_top_offset,
  3830.                   NULL);
  3831.  
  3832.     list_height = XfeHeight(dir_list);
  3833.     up_button_height = XfeHeight(up_button);
  3834.     up_button_top_offset = list_height/2 - up_button_height - down_button_top_offset/2;
  3835.  
  3836.     XtVaSetValues(up_button,
  3837.                   XmNarrowDirection, XmARROW_UP,
  3838.                   XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  3839.                   XmNtopWidget, dir_list,
  3840.                   XmNtopOffset, up_button_top_offset,
  3841.                   XmNleftAttachment, XmATTACH_WIDGET,
  3842.                   XmNleftWidget, dir_list,
  3843.                   XmNleftOffset, 8,
  3844.                   XmNrightAttachment, XmATTACH_NONE,
  3845.                   XmNbottomAttachment, XmATTACH_NONE,
  3846.                   NULL);
  3847.                   
  3848.     XtVaSetValues(down_button,
  3849.                   XmNarrowDirection, XmARROW_DOWN,
  3850.                   XmNtopAttachment, XmATTACH_WIDGET,
  3851.                   XmNtopWidget, up_button,
  3852.                   XmNtopOffset, 4,
  3853.                   XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  3854.                   XmNleftWidget, up_button,
  3855.                   XmNrightAttachment, XmATTACH_NONE,
  3856.                   XmNbottomAttachment, XmATTACH_NONE,
  3857.                   NULL);
  3858.  
  3859.     int labels_width;
  3860.     labels_width = XfeVaGetWidestWidget(add_button,
  3861.                                         edit_button,
  3862.                                         delete_button,
  3863.                                         NULL);
  3864.  
  3865.     XtVaSetValues(add_button,
  3866.                   XmNwidth, labels_width,
  3867.                   XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  3868.                   XmNtopWidget, dir_list,
  3869.                   XmNleftAttachment, XmATTACH_WIDGET,
  3870.                   XmNleftWidget, up_button,
  3871.                   XmNleftOffset, 24,
  3872.                   XmNrightAttachment, XmATTACH_NONE,
  3873.                   XmNbottomAttachment, XmATTACH_NONE,
  3874.                   NULL);
  3875.  
  3876.     XtVaSetValues(edit_button,
  3877.                   XmNwidth, labels_width,
  3878.                   XmNtopAttachment, XmATTACH_WIDGET,
  3879.                   XmNtopWidget, add_button,
  3880.                   XmNtopOffset, 4,
  3881.                   XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  3882.                   XmNleftWidget, add_button,
  3883.                   XmNrightAttachment, XmATTACH_NONE,
  3884.                   XmNbottomAttachment, XmATTACH_NONE,
  3885.                   NULL);
  3886.  
  3887.     XtVaSetValues(delete_button,
  3888.                   XmNwidth, labels_width,
  3889.                   XmNtopAttachment, XmATTACH_WIDGET,
  3890.                   XmNtopWidget, edit_button,
  3891.                   XmNtopOffset, 4,
  3892.                   XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  3893.                   XmNleftWidget, add_button,
  3894.                   XmNrightAttachment, XmATTACH_NONE,
  3895.                   XmNbottomAttachment, XmATTACH_NONE,
  3896.                   NULL);
  3897.  
  3898.     XtManageChildren (kids, i);
  3899.     XtManageChild(form1);
  3900.     XtManageChild(frame1);
  3901.  
  3902.     // Show full names as
  3903.  
  3904.     Widget frame2;
  3905.  
  3906.     ac = 0;
  3907.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
  3908.     XtSetArg (av [ac], XmNtopWidget, frame1); ac++;
  3909.     XtSetArg (av [ac], XmNtopOffset, 8); ac++;
  3910.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  3911.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  3912.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
  3913.     frame2 = XmCreateFrame (form, "frame2", av, ac);
  3914.  
  3915.     Widget form2;
  3916.  
  3917.     ac = 0;
  3918.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  3919.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  3920.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
  3921.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
  3922.     form2 = XmCreateForm (frame2, "toolbarBox", av, ac);
  3923.  
  3924.     Widget label2;
  3925.  
  3926.     ac = 0;
  3927.     XtSetArg (av [ac], XmNchildType, XmFRAME_TITLE_CHILD); ac++;
  3928.     label2 = XmCreateLabelGadget (frame2, "fullNameLabel", av, ac);
  3929.  
  3930.     Widget first_last_toggle;
  3931.     Widget last_first_toggle;
  3932.     Widget first_last_label;
  3933.     Widget last_first_label;
  3934.  
  3935.     ac = 0;
  3936.     i = 0;
  3937.  
  3938.     kids[i++] = first_last_toggle = 
  3939.         XmCreateToggleButtonGadget(form2, "firstLastToggle", av, ac);
  3940.  
  3941.     kids[i++] = last_first_toggle = 
  3942.         XmCreateToggleButtonGadget(form2, "lastFirstToggle", av, ac);
  3943.  
  3944.     kids[i++] = first_last_label = 
  3945.         XmCreateLabelGadget(form2, "firstLastLabel", av, ac);
  3946.  
  3947.     kids[i++] = last_first_label = 
  3948.         XmCreateLabelGadget(form2, "lastFirstLabel", av, ac);
  3949.  
  3950.     fep->first_last_toggle = first_last_toggle;
  3951.     fep->last_first_toggle = last_first_toggle;
  3952.  
  3953.     int labels_width2;
  3954.  
  3955.     labels_width2 = XfeVaGetWidestWidget(first_last_toggle,
  3956.                                          last_first_toggle,
  3957.                                          NULL);
  3958.  
  3959.     int labels_height;
  3960.  
  3961.     labels_height = XfeVaGetTallestWidget(first_last_toggle,
  3962.                                           first_last_label,
  3963.                                           NULL);
  3964.  
  3965.     XtVaSetValues(first_last_toggle,
  3966.                   XmNalignment, XmALIGNMENT_BEGINNING,
  3967.                   XmNindicatorType, XmONE_OF_MANY,
  3968.                   XmNwidth, labels_width2,
  3969.                   XmNheight, labels_height,
  3970.                   XmNtopAttachment, XmATTACH_FORM,
  3971.                   XmNleftAttachment, XmATTACH_FORM,
  3972.                   XmNleftOffset, 16,
  3973.                   XmNrightAttachment, XmATTACH_NONE,
  3974.                   XmNbottomAttachment, XmATTACH_NONE,
  3975.                   NULL);
  3976.  
  3977.     XtVaSetValues(first_last_label,
  3978.                   XmNheight, labels_height,
  3979.                   XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  3980.                   XmNtopWidget, first_last_toggle,
  3981.                   XmNleftAttachment, XmATTACH_WIDGET,
  3982.                   XmNleftWidget, first_last_toggle,
  3983.                   XmNrightAttachment, XmATTACH_NONE,
  3984.                   XmNbottomAttachment, XmATTACH_NONE,
  3985.                   NULL);
  3986.  
  3987.     XtVaSetValues(last_first_toggle,
  3988.                   XmNalignment, XmALIGNMENT_BEGINNING,
  3989.                   XmNindicatorType, XmONE_OF_MANY,
  3990.                   XmNwidth, labels_width2,
  3991.                   XmNheight, labels_height,
  3992.                   XmNtopAttachment, XmATTACH_WIDGET,
  3993.                   XmNtopWidget, first_last_toggle,
  3994.                   XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  3995.                   XmNleftWidget, first_last_toggle,
  3996.                   XmNrightAttachment, XmATTACH_NONE,
  3997.                   XmNbottomAttachment, XmATTACH_NONE,
  3998.                   NULL);
  3999.  
  4000.     XtVaSetValues(last_first_label,
  4001.                   XmNheight, labels_height,
  4002.                   XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  4003.                   XmNtopWidget, last_first_toggle,
  4004.                   XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  4005.                   XmNleftWidget, first_last_label,
  4006.                   XmNrightAttachment, XmATTACH_NONE,
  4007.                   XmNbottomAttachment, XmATTACH_NONE,
  4008.                   NULL);
  4009.  
  4010.     XtManageChildren (kids, i);
  4011.     XtManageChild(label2);
  4012.     XtManageChild(form2);
  4013.     XtManageChild(frame2);
  4014.  
  4015.     // Add callbacks
  4016.  
  4017.     XtAddCallback(up_button, XmNactivateCallback, cb_promote, this);
  4018.     XtAddCallback(down_button, XmNactivateCallback, cb_demote, this);
  4019.     XtAddCallback(add_button, XmNactivateCallback, cb_add, this);
  4020.     XtAddCallback(edit_button, XmNactivateCallback, cb_edit, this);
  4021.     XtAddCallback(delete_button, XmNactivateCallback, cb_delete, this);
  4022.  
  4023.     XtAddCallback(first_last_toggle, XmNvalueChangedCallback, cb_toggleNameOrder, fep);
  4024.     XtAddCallback(last_first_toggle, XmNvalueChangedCallback, cb_toggleNameOrder, fep);
  4025.  
  4026.     setCreated(TRUE);
  4027. }
  4028.  
  4029. // Member:       init
  4030. // Description:  Initializes page for MailNewsAddrBook
  4031. // Inputs:
  4032. // Side effects: 
  4033.  
  4034. void XFE_PrefsPageMailNewsAddrBook::init()
  4035. {
  4036.     XP_ASSERT(m_prefsDataMailNewsAddrBook);
  4037.  
  4038.     PrefsDataMailNewsAddrBook     *fep = m_prefsDataMailNewsAddrBook;
  4039.     XFE_GlobalPrefs               *prefs = &fe_globalPrefs;
  4040.     Boolean                        sensitive;
  4041.  
  4042.     if (! fep->deleted_directories) fep->deleted_directories = XP_ListNew();
  4043.     fep->directories = FE_GetDirServers();
  4044.     fep->num_directories = XP_ListCount(fep->directories);
  4045.  
  4046.     fep->dir_outliner->change(0, fep->num_directories, fep->num_directories);
  4047.     setSelectionPos(OUTLINER_INIT_POS);
  4048.  
  4049.     sensitive = !PREF_PrefIsLocked("mail.addr_book.lastnamefirst");
  4050.     XtVaSetValues(fep->first_last_toggle, 
  4051.                   XmNset, !prefs->addr_book_lastname_first, 
  4052.                   XmNsensitive, sensitive,
  4053.                   0);
  4054.     XtVaSetValues(fep->last_first_toggle, 
  4055.                   XmNset, prefs->addr_book_lastname_first, 
  4056.                   XmNsensitive, sensitive,
  4057.                   0);
  4058.  
  4059.     setInitialized(TRUE);
  4060. }
  4061.  
  4062. // Member:       install
  4063. // Description:  
  4064. // Inputs:
  4065. // Side effects: 
  4066.  
  4067. void XFE_PrefsPageMailNewsAddrBook::install()
  4068. {
  4069.     XP_ASSERT(m_prefsDataMailNewsAddrBook);
  4070.     PrefsDataMailNewsAddrBook     *fep = m_prefsDataMailNewsAddrBook;
  4071.  
  4072.     // directory listing
  4073.  
  4074.     DIR_SaveServerPreferences(fep->directories);
  4075.     DIR_CleanUpServerPreferences(fep->deleted_directories);
  4076.     fe_installMailNewsAddrBook();
  4077. }
  4078.  
  4079. // Member:       save
  4080. // Description:  
  4081. // Inputs:
  4082. // Side effects: 
  4083.  
  4084. void XFE_PrefsPageMailNewsAddrBook::save()
  4085. {
  4086.     PrefsDataMailNewsAddrBook *fep = m_prefsDataMailNewsAddrBook;
  4087.     Boolean                    b;
  4088.  
  4089.     // XP_ASSERT(fep);
  4090.  
  4091.     XtVaGetValues(fep->last_first_toggle, XmNset, &b, 0);
  4092.     fe_globalPrefs.addr_book_lastname_first = b;
  4093.  
  4094.     // Install preferences
  4095.  
  4096.     install();
  4097. }
  4098.  
  4099. // Member:       insertDir
  4100. // Description:  
  4101. // Inputs:
  4102. // Side effects: 
  4103.  
  4104. void XFE_PrefsPageMailNewsAddrBook::insertDir(DIR_Server *dir)
  4105. {
  4106.     // First figure out where to insert it
  4107.  
  4108.     PrefsDataMailNewsAddrBook *fep = m_prefsDataMailNewsAddrBook;
  4109.     int                        pos = 0;
  4110.     int                        count = fep->num_directories;
  4111.     
  4112.     if (count > 0) {
  4113.         // Check if there is any selection
  4114.         uint32     sel_count = 0;
  4115.         const int *indices = 0;
  4116.         fep->dir_outliner->getSelection(&indices, (int *) &sel_count);
  4117.         if (sel_count > 0 && indices) {
  4118.             pos = indices[0];
  4119.         }
  4120.     }
  4121.  
  4122.     // Insert at pos
  4123.  
  4124.     insertDirAtPos(pos, dir);
  4125. }
  4126.  
  4127. // Member:       insertDirAtPos
  4128. // Description:  
  4129. // Inputs:
  4130. // Side effects: 
  4131.  
  4132. void XFE_PrefsPageMailNewsAddrBook::insertDirAtPos(int pos, DIR_Server *dir)
  4133. {
  4134.     PrefsDataMailNewsAddrBook *fep = m_prefsDataMailNewsAddrBook;
  4135.     int                        count = fep->num_directories;
  4136.     DIR_Server                *prev_dir;
  4137.     
  4138.     // Insert dir at position
  4139.  
  4140.     if (count > 0) {
  4141.         prev_dir = (DIR_Server*)XP_ListGetObjectNum(fep->directories,pos+1);
  4142.         XP_ListInsertObjectAfter(fep->directories, prev_dir, dir);
  4143.     }
  4144.     else {
  4145.         XP_ListAddObjectToEnd(fep->directories, dir);
  4146.     }
  4147.     fep->num_directories = XP_ListCount(fep->directories);
  4148.  
  4149.     // Repaint 
  4150.  
  4151.     fep->dir_outliner->change(0, fep->num_directories, fep->num_directories);
  4152.  
  4153.     // Set selection
  4154.  
  4155.     setSelectionPos(pos);
  4156. }
  4157.  
  4158. // Member:       deleteDirAtPos
  4159. // Description:  
  4160. // Inputs:
  4161. // Side effects: 
  4162.  
  4163. void XFE_PrefsPageMailNewsAddrBook::deleteDirAtPos(int pos)
  4164. {
  4165.     PrefsDataMailNewsAddrBook *fep = m_prefsDataMailNewsAddrBook;
  4166.     int                        count = fep->num_directories;
  4167.  
  4168.     if (pos >= count) return;
  4169.  
  4170.     // Remove the directory at pos
  4171.  
  4172.     if (pos >=  fep->num_directories) return;
  4173.     DIR_Server *dir = (DIR_Server*)XP_ListGetObjectNum(fep->directories,pos+1);
  4174.     
  4175.     DIR_Server *copy;
  4176.     DIR_CopyServer(dir, ©);
  4177.     XP_ListAddObjectToEnd(fep->deleted_directories, copy);
  4178.  
  4179.     if (! XP_ListRemoveObject(fep->directories, dir)) return;
  4180.     fep->num_directories = XP_ListCount(fep->directories);
  4181.  
  4182.     // Repaint
  4183.  
  4184.     fep->dir_outliner->change(0, fep->num_directories, fep->num_directories);
  4185.  
  4186.     // Set selection if there is more than one entry 
  4187.  
  4188.     if (fep->num_directories > 0) {
  4189.         if (pos >= fep->num_directories) pos--;
  4190.         setSelectionPos(pos);
  4191.     }
  4192.     else {
  4193.         setSelectionPos(OUTLINER_INIT_POS);
  4194.     }
  4195. }
  4196.  
  4197. // Member:       swapDirs
  4198. // Description:  
  4199. // Inputs:
  4200. // Side effects: 
  4201.  
  4202. void XFE_PrefsPageMailNewsAddrBook::swapDirs(int pos1, int pos2, int sel_pos)
  4203. {
  4204.     PrefsDataMailNewsAddrBook *fep = m_prefsDataMailNewsAddrBook;
  4205.     int                        count = fep->num_directories;
  4206.     DIR_Server                *dir1;
  4207.     DIR_Server                *dir2;
  4208.     XP_List                   *ptr1;
  4209.     XP_List                   *ptr2;
  4210.  
  4211.     if ((pos1 >= count) ||
  4212.         (pos2 >= count) ||
  4213.         (sel_pos >= count))
  4214.         return;
  4215.  
  4216.     // Swap
  4217.     
  4218.     dir1 = (DIR_Server*)XP_ListGetObjectNum(fep->directories,pos1+1);
  4219.     ptr1 = XP_ListFindObject(fep->directories, dir1);
  4220.  
  4221.     dir2 = (DIR_Server*)XP_ListGetObjectNum(fep->directories,pos2+1);
  4222.     ptr2 = XP_ListFindObject(fep->directories, dir2);
  4223.  
  4224.     ptr1->object = (void *)dir2;
  4225.     ptr2->object = (void *)dir1;
  4226.  
  4227.     // Repaint
  4228.  
  4229.     fep->dir_outliner->change(0, fep->num_directories, fep->num_directories);
  4230.  
  4231.     // Set selection if there is more than one entry 
  4232.  
  4233.     setSelectionPos(sel_pos);
  4234. }
  4235.  
  4236. // Member:       setSelelctionPos
  4237. // Description:  
  4238. // Inputs:
  4239. // Side effects: 
  4240.  
  4241. void XFE_PrefsPageMailNewsAddrBook::setSelectionPos(int pos)
  4242. {
  4243.     PrefsDataMailNewsAddrBook *fep = m_prefsDataMailNewsAddrBook;
  4244.     int                        count = fep->num_directories;
  4245.  
  4246.     if (pos >= count) return;
  4247.  
  4248.     if (pos == OUTLINER_INIT_POS) {
  4249.         XtVaSetValues(fep->delete_button, XmNsensitive, False, NULL);
  4250.         XtVaSetValues(fep->up_button, XmNsensitive, False, NULL);
  4251.         XtVaSetValues(fep->down_button, XmNsensitive, False, NULL);
  4252.         XtVaSetValues(fep->edit_button, XmNsensitive, False, NULL);
  4253.     }
  4254.     else {
  4255.         // Grey out the Delete/Edit button if it is Personal Address Book
  4256.         DIR_Server *dir = (DIR_Server*)XP_ListGetObjectNum(fep->directories,pos+1);
  4257.         fep->dir_outliner->selectItemExclusive(pos);
  4258.         XtVaSetValues(fep->delete_button, XmNsensitive,
  4259.                       (count != 0 && dir->dirType != PABDirectory), NULL);
  4260.         XtVaSetValues(fep->edit_button, XmNsensitive,
  4261.                       (count != 0 && dir->dirType != PABDirectory), NULL);
  4262.         XtVaSetValues(fep->up_button, XmNsensitive, (pos != 0), NULL);
  4263.         XtVaSetValues(fep->down_button, XmNsensitive, (pos != (count-1)), NULL);
  4264.     }
  4265. }
  4266.  
  4267. // Member:       deselelctionPos
  4268. // Description:  
  4269. // Inputs:
  4270. // Side effects: 
  4271.  
  4272. void XFE_PrefsPageMailNewsAddrBook::deselectPos(int pos)
  4273. {
  4274.     PrefsDataMailNewsAddrBook *fep = m_prefsDataMailNewsAddrBook;
  4275.     int                        count = fep->num_directories;
  4276.  
  4277.     if (pos >= count) return;
  4278.  
  4279.     fep->dir_outliner->deselectItem(pos);
  4280. }
  4281.  
  4282. // Member:       getData
  4283. // Description:  
  4284. // Inputs:
  4285. // Side effects: 
  4286.  
  4287. PrefsDataMailNewsAddrBook *XFE_PrefsPageMailNewsAddrBook::getData()
  4288. {
  4289.     return m_prefsDataMailNewsAddrBook;
  4290. }
  4291.  
  4292. // Member:       cb_promote
  4293. // Description:  
  4294. // Inputs:
  4295. // Side effects: 
  4296.  
  4297. void XFE_PrefsPageMailNewsAddrBook::cb_promote(Widget    /* w */,
  4298.                                                XtPointer closure,
  4299.                                                XtPointer /* callData */)
  4300. {
  4301.     XFE_PrefsPageMailNewsAddrBook *thePage = (XFE_PrefsPageMailNewsAddrBook *)closure;
  4302.     PrefsDataMailNewsAddrBook     *fep = thePage->getData();
  4303.     int                            count = fep->num_directories;
  4304.     int                            pos = 0;
  4305.     uint32                         sel_count = 0;
  4306.     const int                     *indices = 0;
  4307.  
  4308.     if (count == 0) return;
  4309.  
  4310.     fep->dir_outliner->getSelection(&indices, (int *) &sel_count);
  4311.     if (sel_count > 0 && indices) {
  4312.         pos = indices[0];
  4313.         if (pos != 0) {
  4314.             thePage->deselectPos(pos);
  4315.             thePage->swapDirs(pos, pos-1, pos-1);
  4316.         }
  4317.     }
  4318. }
  4319.  
  4320. // Member:       cb_demote
  4321. // Description:  
  4322. // Inputs:
  4323. // Side effects: 
  4324.  
  4325. void XFE_PrefsPageMailNewsAddrBook::cb_demote(Widget    /* w */,
  4326.                                               XtPointer closure,
  4327.                                               XtPointer /* callData */)
  4328. {
  4329.     XFE_PrefsPageMailNewsAddrBook *thePage = (XFE_PrefsPageMailNewsAddrBook *)closure;
  4330.     PrefsDataMailNewsAddrBook     *fep = thePage->getData();
  4331.     int                            count = fep->num_directories;
  4332.     int                            pos = 0;
  4333.     uint32                         sel_count = 0;
  4334.     const int                     *indices = 0;
  4335.  
  4336.     if (count == 0) return;
  4337.  
  4338.     fep->dir_outliner->getSelection(&indices, (int *) &sel_count);
  4339.     if (sel_count > 0 && indices) {
  4340.         pos = indices[0];
  4341.         if (pos != (count-1)) {
  4342.             thePage->deselectPos(pos);
  4343.             thePage->swapDirs(pos, pos+1, pos+1);
  4344.         }
  4345.     }
  4346. }
  4347.  
  4348. // Member:       cb_add
  4349. // Description:  
  4350. // Inputs:
  4351. // Side effects: 
  4352.  
  4353. void XFE_PrefsPageMailNewsAddrBook::cb_add(Widget    /* w */,
  4354.                                            XtPointer closure,
  4355.                                            XtPointer /* callData */)
  4356. {
  4357.     XFE_PrefsPageMailNewsAddrBook *thePage = (XFE_PrefsPageMailNewsAddrBook *)closure;
  4358.     XFE_PrefsDialog               *theDialog = thePage->getPrefsDialog();
  4359.     Widget                         mainw = theDialog->getBaseWidget();
  4360.  
  4361.     //    while (!XtIsWMShell(mainw) && (XtParent(mainw)!=0))
  4362.     //        mainw = XtParent(mainw);
  4363.  
  4364.     // Instantiate an LDAP dialog
  4365.  
  4366.     XFE_PrefsLdapPropDialog *theLdapPropDialog = 0;
  4367.  
  4368.     if ((theLdapPropDialog =
  4369.          new XFE_PrefsLdapPropDialog(theDialog, thePage, mainw, "prefsLdapProp")) == 0) {
  4370.         fe_perror(thePage->getContext(), XP_GetString(XFE_OUT_OF_MEMORY_URL));
  4371.         return;
  4372.     }
  4373.  
  4374.     // Initialize and pop up the LDAP dialog
  4375.  
  4376.     theLdapPropDialog->initPage(0);
  4377.     theLdapPropDialog->show();
  4378. }
  4379.  
  4380. // Member:       cb_edit
  4381. // Description:  
  4382. // Inputs:
  4383. // Side effects: 
  4384.  
  4385. void XFE_PrefsPageMailNewsAddrBook::cb_edit(Widget    /* w */,
  4386.                                             XtPointer closure,
  4387.                                             XtPointer /* callData */)
  4388. {
  4389.     XFE_PrefsPageMailNewsAddrBook *thePage = (XFE_PrefsPageMailNewsAddrBook *)closure;
  4390.     XFE_PrefsDialog               *theDialog = thePage->getPrefsDialog();
  4391.     PrefsDataMailNewsAddrBook     *fep = thePage->getData();
  4392.     Widget                         mainw = theDialog->getBaseWidget();
  4393.     int                            pos = 0;
  4394.     uint32                         sel_count = 0;
  4395.     const int                     *indices = 0;
  4396.     DIR_Server                    *server;
  4397.  
  4398.     // Find the entry that's selected
  4399.  
  4400.     fep->dir_outliner->getSelection(&indices, (int *) &sel_count);
  4401.     if (sel_count > 0 && indices) {
  4402.         pos = indices[0];
  4403.         if (pos >=  fep->num_directories) return;
  4404.         server = (DIR_Server*)XP_ListGetObjectNum(fep->directories,pos+1);
  4405.     }
  4406.     else 
  4407.         return;
  4408.  
  4409.     //    while (!XtIsWMShell(mainw) && (XtParent(mainw)!=0))
  4410.     //        mainw = XtParent(mainw);
  4411.  
  4412.     // Instantiate an LDAP dialog
  4413.  
  4414.     XFE_PrefsLdapPropDialog *theLdapPropDialog = 0;
  4415.  
  4416.     if ((theLdapPropDialog =
  4417.          new XFE_PrefsLdapPropDialog(theDialog, thePage, mainw, "prefsLdapProp")) == 0) {
  4418.         fe_perror(thePage->getContext(), XP_GetString(XFE_OUT_OF_MEMORY_URL));
  4419.         return;
  4420.     }
  4421.  
  4422.     // Initialize and pop up the LDAP dialog
  4423.  
  4424.     theLdapPropDialog->initPage(server);
  4425.     theLdapPropDialog->show();
  4426. }
  4427.  
  4428. // Member:       cb_delete
  4429. // Description:  
  4430. // Inputs:
  4431. // Side effects: 
  4432.  
  4433. void XFE_PrefsPageMailNewsAddrBook::cb_delete(Widget    /* w */,
  4434.                                               XtPointer closure,
  4435.                                               XtPointer /* callData */)
  4436. {
  4437.     XFE_PrefsPageMailNewsAddrBook *thePage = (XFE_PrefsPageMailNewsAddrBook *)closure;
  4438.     PrefsDataMailNewsAddrBook     *fep = thePage->getData();
  4439.     int                            count = fep->num_directories;
  4440.     int                            pos = 0;
  4441.     uint32                         sel_count = 0;
  4442.     const int                     *indices = 0;
  4443.  
  4444.     if (count == 0) return;
  4445.  
  4446.     fep->dir_outliner->getSelection(&indices, (int *) &sel_count);
  4447.     if (sel_count > 0 && indices) {
  4448.         pos = indices[0];
  4449.         thePage->deleteDirAtPos(pos);
  4450.     }
  4451. }
  4452.  
  4453. // Member:       cb_toggleNameOrder
  4454. // Description:  
  4455. // Inputs:
  4456. // Side effects: 
  4457.  
  4458. void XFE_PrefsPageMailNewsAddrBook::cb_toggleNameOrder(Widget    w,
  4459.                                                        XtPointer closure,
  4460.                                                        XtPointer callData)
  4461. {
  4462.     XmToggleButtonCallbackStruct *cb = (XmToggleButtonCallbackStruct *)callData;
  4463.     PrefsDataMailNewsAddrBook    *fep = (PrefsDataMailNewsAddrBook *)closure;
  4464.  
  4465.     if (! cb->set) {
  4466.         XtVaSetValues(w, XmNset, True, 0);
  4467.     }
  4468.     else if (w == fep->first_last_toggle) {
  4469.         XtVaSetValues(fep->last_first_toggle, XmNset, False, 0);
  4470.     }
  4471.     else if (w == fep->last_first_toggle) {
  4472.         XtVaSetValues(fep->first_last_toggle, XmNset, False, 0);
  4473.     }
  4474.     else
  4475.         abort();    
  4476. }
  4477.  
  4478. /* Outlinable interface methods */
  4479.  
  4480. void *XFE_PrefsPageMailNewsAddrBook::ConvFromIndex(int /* index */)
  4481. {
  4482.     return (void *)NULL;
  4483. }
  4484.  
  4485. int XFE_PrefsPageMailNewsAddrBook::ConvToIndex(void * /* item */)
  4486. {
  4487.     return 0;
  4488. }
  4489.  
  4490. char*XFE_PrefsPageMailNewsAddrBook::getColumnName(int column)
  4491. {
  4492.     switch (column){
  4493.     case OUTLINER_COLUMN_NAME:
  4494.         return STRING_COL_NAME;
  4495.     default:
  4496.         XP_ASSERT(0); 
  4497.         return 0;
  4498.     }
  4499. }
  4500.  
  4501. char *XFE_PrefsPageMailNewsAddrBook::getColumnHeaderText(int column)
  4502. {
  4503.   switch (column) 
  4504.     {
  4505.     case OUTLINER_COLUMN_NAME:
  4506.       return "";
  4507.     default:
  4508.       XP_ASSERT(0);
  4509.       return 0;
  4510.     }
  4511. }
  4512.  
  4513. fe_icon *XFE_PrefsPageMailNewsAddrBook::getColumnHeaderIcon(int /* column */)
  4514. {
  4515.     return 0;
  4516.  
  4517. }
  4518.  
  4519. EOutlinerTextStyle XFE_PrefsPageMailNewsAddrBook::getColumnHeaderStyle(int /* column */)
  4520. {
  4521.     return OUTLINER_Default;
  4522. }
  4523.  
  4524. // This method acquires one line of data.
  4525. void *XFE_PrefsPageMailNewsAddrBook::acquireLineData(int line)
  4526. {
  4527.     m_rowIndex = line;
  4528.     return (void *)1;
  4529. }
  4530.  
  4531. void XFE_PrefsPageMailNewsAddrBook::getTreeInfo(Boolean * /* expandable */,
  4532.                                                 Boolean * /* is_expanded */,
  4533.                                                 int     * /* depth */,
  4534.                                                 OutlinerAncestorInfo ** /* ancestor */)
  4535. {
  4536.     // No-op
  4537. }
  4538.  
  4539.  
  4540. EOutlinerTextStyle XFE_PrefsPageMailNewsAddrBook::getColumnStyle(int /*column*/)
  4541. {
  4542.     return OUTLINER_Default;
  4543. }
  4544.  
  4545. char *XFE_PrefsPageMailNewsAddrBook::getColumnText(int column)
  4546.     PrefsDataMailNewsAddrBook *fep = m_prefsDataMailNewsAddrBook;
  4547.     static char                line[OUTLINER_COLUMN_MAX_LENGTH+1];
  4548.  
  4549.     *line = 0;
  4550.     DIR_Server *dir = (DIR_Server*)XP_ListGetObjectNum(fep->directories,m_rowIndex+1);
  4551.     if (! dir) return line;
  4552.  
  4553.     switch (column) {
  4554.     case OUTLINER_COLUMN_NAME:
  4555.         sprintf(line, "%s", dir->description);
  4556.         break;
  4557.  
  4558.     default:
  4559.         break;
  4560.     }
  4561.  
  4562.     return line;
  4563. }
  4564.  
  4565. fe_icon *XFE_PrefsPageMailNewsAddrBook::getColumnIcon(int /* column */)
  4566. {
  4567.     return 0;
  4568. }
  4569.  
  4570. void XFE_PrefsPageMailNewsAddrBook::releaseLineData()
  4571. {
  4572.     // No-op
  4573. }
  4574.  
  4575. void XFE_PrefsPageMailNewsAddrBook::Buttonfunc(const OutlineButtonFuncData *data)
  4576. {
  4577.     int row = data->row;
  4578.  
  4579.     if (row < 0) {
  4580.         // header
  4581.         return;
  4582.     } 
  4583.  
  4584.     setSelectionPos(data->row);
  4585. }
  4586.  
  4587. void XFE_PrefsPageMailNewsAddrBook::Flippyfunc(const OutlineFlippyFuncData * /* data */)
  4588. {
  4589.     // No-op
  4590. }
  4591.  
  4592. XFE_Outliner *XFE_PrefsPageMailNewsAddrBook::getOutliner()
  4593. {
  4594.     return m_prefsDataMailNewsAddrBook->dir_outliner;
  4595. }
  4596. #endif // MOZ_MAIL_NEWS
  4597.  
  4598. // ************************************************************************
  4599. // ********************** Miscellaneous functions *************************
  4600. // ************************************************************************
  4601.  
  4602.