home *** CD-ROM | disk | FTP | other *** search
/ Tools / WinSN5.0Ver.iso / NETSCAP.50 / WIN1998.ZIP / ns / cmd / xfe / src / PrefsApplEdit.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1998-04-08  |  36.4 KB  |  1,193 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.    PrefsApplEdit.cpp -- The more dialog for Mail server preference
  20.    Created: Linda Wei <lwei@netscape.com>, 23-Oct-96.
  21.  */
  22.  
  23. #include "felocale.h"
  24. #include "structs.h"
  25. #include "fonts.h"
  26. #include "xpassert.h"
  27. #include "np.h"
  28. #include "xfe.h"
  29. #include "e_kit.h"
  30. #include "PrefsApplEdit.h"
  31. #include "PrefsDialogAppl.h"
  32. #include "PrefsDialog.h"
  33.  
  34. #include <Xm/Xm.h>
  35. #include <Xm/Label.h>
  36. #include <Xm/LabelG.h>
  37. #include <Xm/PushB.h>
  38. #include <Xm/PushBG.h>
  39. #include <Xm/ToggleB.h>
  40. #include <Xm/Form.h>
  41. #include <Xm/Frame.h>
  42. #include <Xm/TextF.h> 
  43. #include <Xm/ToggleBG.h> 
  44. #include <XmL/Grid.h>
  45. #include <DtWidgets/ComboBox.h>
  46. #include <Xfe/Xfe.h>
  47.  
  48. extern int XFE_HELPERS_PLUGIN_DESC_CHANGE;
  49. extern int XFE_HELPERS_EMPTY_MIMETYPE;
  50. extern int XFE_ERROR_SAVING_OPTIONS;
  51. extern int XFE_HELPERS_EMPTY_APP;
  52.  
  53. extern "C"
  54. {
  55.     char     *XP_GetString(int i);
  56. /*     char     *XP_AppendStr(char *s1, char *s2); */
  57.     void      fe_browse_file_of_text(MWContext *context, Widget text_field, Boolean dirp);
  58.     char     *fe_GetPluginNameFromMailcapEntry(NET_mdataStruct *md_item);
  59.     int       fe_GetMimetypeInfoFromPlugin(char *pluginName, char *mimetype,
  60.                                            char **r_desc, char **r_ext);
  61.     XP_Bool   fe_IsMailcapEntryPlugin(NET_mdataStruct *md_item);
  62. }
  63.  
  64. // ==================== Public Member Functions ====================
  65.  
  66. // Member:       XFE_PrefsApplEditDialog
  67. // Description:  Constructor
  68. // Inputs:
  69. // Side effects: Creates the edit dialog for applications
  70.  
  71. XFE_PrefsApplEditDialog::XFE_PrefsApplEditDialog
  72.                         (XFE_PrefsDialog *prefsDialog,
  73.                          Widget           parent,      // dialog parent
  74.                          char             *name,        // dialog name
  75.                          XFE_PrefsPageGeneralAppl *prefsPageGeneralAppl,
  76.                          Boolean               modal)       // modal dialog?
  77.     : XFE_Dialog(parent, 
  78.                  name,
  79.                  TRUE,     // ok
  80.                  TRUE,     // cancel
  81.                  FALSE,    // help
  82.                  FALSE,    // apply
  83.                  FALSE,    // separator
  84.                  modal     // modal
  85.                  ),
  86.       m_prefsDialog(prefsDialog),
  87.       m_prefsPageGeneralAppl(prefsPageGeneralAppl),
  88.       m_prefsDataApplEdit(0),
  89.       m_prefsDataGeneralAppl(0)
  90. {
  91.     m_prefsDataGeneralAppl = m_prefsPageGeneralAppl->getData();
  92.  
  93.     PrefsDataApplEdit *fep = NULL;
  94.  
  95.     fep = new PrefsDataApplEdit;
  96.     memset(fep, 0, sizeof(PrefsDataApplEdit));
  97.     m_prefsDataApplEdit = fep;
  98.     fep->context = m_prefsDialog->getContext();
  99.     
  100.     Widget     kids[100];
  101.     Arg        av[50];
  102.     int        ac;
  103.     int        i;
  104.  
  105.     Widget form;
  106.     form = XtVaCreateWidget("form", xmFormWidgetClass, m_chrome,
  107.                             XmNmarginWidth, 8,
  108.                             XmNtopAttachment, XmATTACH_FORM,
  109.                             XmNleftAttachment, XmATTACH_FORM,
  110.                             XmNrightAttachment, XmATTACH_FORM,
  111.                             XmNbottomAttachment, XmATTACH_FORM,
  112.                             NULL);
  113.     XtManageChild (form);
  114.  
  115.     Widget form1;
  116.     ac = 0;
  117.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  118.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  119.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
  120.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
  121.     form1 = XmCreateForm (form, "applEditForm", av, ac);
  122.  
  123.     Widget static_desc_label;
  124.     Widget mime_types_desc_label;
  125.     Widget mime_types_desc_text;
  126.     Widget mime_types_label;
  127.     Widget mime_types_text;
  128.     Widget mime_types_suffix_label;
  129.     Widget mime_types_suffix_text;
  130.  
  131.     ac = 0;
  132.     i = 0;
  133.     kids[i++] = mime_types_desc_label =
  134.         XmCreateLabelGadget (form1, "mimeTypesDescriptionLabel", av, ac);
  135.  
  136.     kids[i++] = mime_types_desc_text = 
  137.         fe_CreateTextField (form1, "mimeTypesDescriptionText",av,ac);
  138.  
  139.     kids[i++] = static_desc_label =
  140.         XmCreateLabelGadget (form1, "staticDescriptionLabel", av, ac);
  141.  
  142.     kids[i++] = mime_types_label = 
  143.         XmCreateLabelGadget (form1, "mimeTypesLabel", av, ac);
  144.  
  145.     kids[i++] = mime_types_text = 
  146.         fe_CreateTextField (form1, "mimeTypesText",av,ac);
  147.  
  148.     kids[i++] = mime_types_suffix_label = 
  149.         XmCreateLabelGadget (form1, "mimeTypesSuffixLabel", av, ac);
  150.  
  151.     kids[i++] = mime_types_suffix_text =
  152.         fe_CreateTextField (form1, "mimeTypesSuffixText",av, ac);
  153.  
  154.     if (fe_globalData.nonterminal_text_translations) {
  155.         XtOverrideTranslations (mime_types_desc_text,
  156.                                 fe_globalData.nonterminal_text_translations);
  157.         XtOverrideTranslations (mime_types_text,
  158.                                 fe_globalData.nonterminal_text_translations);
  159.     }
  160.  
  161.     XtAddCallback(mime_types_text, 
  162.                   XmNvalueChangedCallback, prefsApplEditCb_setHandledBy, this);
  163.  
  164.     int labels_height;
  165.     labels_height = XfeVaGetTallestWidget(mime_types_desc_label,
  166.                                           mime_types_desc_text,
  167.                                           NULL);
  168.  
  169.     int labels_width;
  170.     labels_width = XfeVaGetWidestWidget(mime_types_desc_label,
  171.                                         mime_types_label,
  172.                                         mime_types_suffix_label,
  173.                                         NULL);
  174.  
  175.     XtVaSetValues (mime_types_desc_label,
  176.                    XmNheight, labels_height,
  177.                    RIGHT_JUSTIFY_VA_ARGS(mime_types_desc_label,labels_width),
  178.                    XmNtopAttachment, XmATTACH_FORM,
  179.                    XmNbottomAttachment, XmATTACH_NONE,
  180.                    0);
  181.  
  182.     XtVaSetValues (mime_types_desc_text,
  183.                    XmNcolumns, 35,
  184.                    XmNheight, labels_height,
  185.                    XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  186.                    XmNtopWidget, mime_types_desc_label,
  187.                    XmNbottomAttachment, XmATTACH_NONE,
  188.                    XmNleftAttachment, XmATTACH_WIDGET,
  189.                    XmNleftWidget, mime_types_desc_label,
  190.                    XmNrightAttachment, XmATTACH_NONE,
  191.                    0);
  192.  
  193.     XtVaSetValues (static_desc_label,
  194.                    XmNheight, labels_height,
  195.                    XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  196.                    XmNtopWidget, mime_types_desc_label,
  197.                    XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET,
  198.                    XmNbottomWidget, mime_types_desc_label,
  199.                    XmNleftAttachment, XmATTACH_WIDGET,
  200.                    XmNleftWidget, mime_types_desc_label,
  201.                    XmNrightAttachment, XmATTACH_NONE,
  202.                    0);
  203.  
  204.     XtVaSetValues (mime_types_label,
  205.                    XmNheight, labels_height,
  206.                    RIGHT_JUSTIFY_VA_ARGS(mime_types_label,labels_width),
  207.                    XmNtopAttachment, XmATTACH_WIDGET,
  208.                    XmNtopWidget, mime_types_desc_label,
  209.                    XmNbottomAttachment, XmATTACH_NONE,
  210.                    0);
  211.  
  212.     XtVaSetValues (mime_types_text,
  213.                    XmNcolumns, 35,
  214.                    XmNheight, labels_height,
  215.                    XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  216.                    XmNtopWidget,mime_types_label,
  217.                    XmNbottomAttachment, XmATTACH_NONE,
  218.                    XmNleftAttachment, XmATTACH_WIDGET,
  219.                    XmNleftWidget, mime_types_label,
  220.                    XmNrightAttachment, XmATTACH_NONE,
  221.                    0);
  222.  
  223.     XtVaSetValues (mime_types_suffix_label,
  224.                    XmNheight, labels_height,
  225.                    RIGHT_JUSTIFY_VA_ARGS(mime_types_suffix_label,labels_width),
  226.                    XmNtopAttachment, XmATTACH_WIDGET,
  227.                    XmNtopWidget, mime_types_label,
  228.                    XmNbottomAttachment, XmATTACH_NONE,
  229.                    0);
  230.  
  231.     XtVaSetValues (mime_types_suffix_text,
  232.                    XmNcolumns, 35,
  233.                    XmNheight, labels_height,
  234.                    XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  235.                    XmNtopWidget, mime_types_suffix_label,
  236.                    XmNbottomAttachment, XmATTACH_NONE,
  237.                    XmNleftAttachment, XmATTACH_WIDGET,
  238.                    XmNleftWidget, mime_types_suffix_label,
  239.                    XmNrightAttachment, XmATTACH_NONE,
  240.                    0);
  241.  
  242.     XtManageChildren(kids,i);
  243.     XtManageChild(form1);
  244.  
  245.  
  246.     Widget frame1;
  247.     ac = 0;
  248.     XtSetArg (av [ac], XmNmarginWidth, 8); ac++;
  249.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  250.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  251.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
  252.     XtSetArg (av [ac], XmNtopWidget, form1); ac++;
  253.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
  254.     frame1 = XmCreateFrame (form, "applEditFrame", av, ac);
  255.  
  256.     Widget label1;
  257.     ac = 0;
  258.     XtSetArg (av [ac], XmNchildType, XmFRAME_TITLE_CHILD); ac++;
  259.     label1 = XmCreateLabelGadget (frame1, "applEditFrameLabel", av, ac);
  260.  
  261.     Widget form2;
  262.     ac = 0;
  263.     XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  264.     XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  265.     XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
  266.     XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
  267.     form2 = XmCreateForm (frame1, "applEditHandleBox", av, ac);
  268.  
  269.     Widget navigator_toggle;
  270.     Widget plugin_toggle;
  271.     Widget app_toggle;
  272.     Widget app_text;
  273.     Widget app_browse;
  274.     Widget plugin_combo;
  275.     Widget save_toggle;
  276.     Widget unknown_toggle;
  277.  
  278.     ac = 0;
  279.     i = 0;
  280.  
  281.     kids [i++] = navigator_toggle = 
  282.         XmCreateToggleButtonGadget (form2, "applEditNavigator", av,ac);
  283.  
  284.     kids [i++] = plugin_toggle = 
  285.         XmCreateToggleButtonGadget (form2, "applEditPlugin", av,ac);
  286.  
  287.      Visual *v = 0;
  288.     Colormap cmap = 0;
  289.     Cardinal depth = 0;
  290.  
  291.     XtVaGetValues (parent, 
  292.                    XtNvisual, &v,
  293.                    XtNcolormap, &cmap,
  294.                    XtNdepth, &depth, 
  295.                    0);
  296.  
  297.     ac = 0;
  298.     XtSetArg(av[ac], XmNmoveSelectedItemUp, False); ac++;
  299.     XtSetArg(av[ac], XmNtype, XmDROP_DOWN_LIST_BOX); ac++;
  300.     XtSetArg(av[ac], XmNvisual, v); ac++;
  301.     XtSetArg(av[ac], XmNdepth, depth); ac++;
  302.     XtSetArg(av[ac], XmNcolormap, cmap); ac++;
  303.     XtSetArg(av[ac], XmNuserData, 0); ac++;
  304.     XtSetArg(av[ac], XmNarrowType, XmMOTIF); ac++;
  305.     kids[i++] = plugin_combo = DtCreateComboBox(form2, "pluginCombo", av,ac);
  306.     XtAddCallback(plugin_combo, XmNselectionCallback, prefsApplEditCb_selectPlugin, this);
  307.  
  308.     ac = 0;
  309.     kids [i++] = app_toggle = 
  310.         XmCreateToggleButtonGadget (form2, "applEditApp", av,ac);
  311.  
  312.     kids [i++] = app_text = 
  313.         fe_CreateTextField (form2, "applEditAppText", av,ac);
  314.  
  315.     kids [i++] = app_browse = 
  316.         XmCreatePushButton (form2, "applEditAppBrowse", av,ac);
  317.  
  318.     kids [i++] = save_toggle = 
  319.         XmCreateToggleButtonGadget (form2, "applEditSave", av,ac);
  320.  
  321.     kids [i++] = unknown_toggle =
  322.         XmCreateToggleButtonGadget (form2, "applEditUnknown", av,ac);
  323.  
  324.     fep->static_desc_label = static_desc_label;
  325.     fep->mime_types_desc_text = mime_types_desc_text;
  326.     fep->mime_types_text = mime_types_text;
  327.     fep->mime_types_suffix_text = mime_types_suffix_text;
  328.     fep->navigator_toggle = navigator_toggle;
  329.     fep->plugin_toggle = plugin_toggle;
  330.     fep->plugin_combo = plugin_combo;
  331.     fep->app_toggle  = app_toggle;
  332.     fep->app_text = app_text;
  333.     fep->app_browse = app_browse;
  334.     fep->save_toggle = save_toggle;
  335.     fep->unknown_toggle = unknown_toggle;
  336.   
  337.     buildPluginList((char *)(fep->cd ? fep->cd->ci.type:NULL));
  338.   
  339.     labels_height = XfeVaGetTallestWidget(plugin_toggle,
  340.                                           plugin_combo,
  341.                                           app_browse,
  342.                                           app_text,
  343.                                           NULL);
  344.  
  345.     labels_width = XfeVaGetWidestWidget(plugin_toggle,
  346.                                         app_toggle,
  347.                                         NULL);
  348.  
  349.     XtVaSetValues (navigator_toggle,
  350.                    XmNindicatorType, XmONE_OF_MANY,
  351.                    XmNheight, labels_height,
  352.                    XmNtopAttachment, XmATTACH_FORM,
  353.                    XmNbottomAttachment, XmATTACH_NONE,
  354.                    XmNleftAttachment, XmATTACH_FORM,
  355.                    XmNrightAttachment, XmATTACH_NONE,
  356.                    XmNsensitive, True,
  357.                    0);
  358.  
  359.     XtVaSetValues (plugin_toggle,
  360.                    XmNindicatorType, XmONE_OF_MANY,
  361.                    XmNheight, labels_height,
  362.                    XmNtopAttachment, XmATTACH_WIDGET,
  363.                    XmNtopWidget, navigator_toggle,
  364.                    XmNbottomAttachment, XmATTACH_NONE,
  365.                    XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  366.                    XmNleftWidget, navigator_toggle,
  367.                    XmNrightAttachment, XmATTACH_NONE,
  368.                    0);
  369.  
  370.     XtVaSetValues (plugin_combo,
  371.                    XmNheight, labels_height,
  372.                    XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  373.                    XmNtopWidget, plugin_toggle,
  374.                    XmNbottomAttachment, XmATTACH_NONE,
  375.                    XmNleftAttachment, XmATTACH_FORM,
  376.                    XmNleftOffset, labels_width+8,
  377.                    XmNrightAttachment, XmATTACH_NONE,
  378.                    0);
  379.  
  380.     XtVaSetValues (app_toggle,
  381.                    XmNindicatorType, XmONE_OF_MANY,
  382.                    XmNheight, labels_height,
  383.                    XmNtopAttachment, XmATTACH_WIDGET,
  384.                    XmNtopWidget, plugin_toggle,
  385.                    XmNbottomAttachment, XmATTACH_NONE,
  386.                    XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  387.                    XmNleftWidget, plugin_toggle,
  388.                    XmNrightAttachment, XmATTACH_NONE,
  389.                    0);
  390.  
  391.     Dimension size;
  392.     Dimension space;
  393.     XtVaGetValues( app_toggle, 
  394.                    XmNindicatorSize, &size, 
  395.                    XmNspacing, &space, 
  396.                    0 );
  397.  
  398.     XtVaSetValues (app_text,
  399.                    XmNcolumns, 35,
  400.                    XmNheight, labels_height,
  401.                    XmNsensitive, False,
  402.                    XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  403.                    XmNtopWidget, app_toggle,
  404.                    XmNbottomAttachment, XmATTACH_NONE,
  405.                    XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  406.                    XmNleftWidget, plugin_combo,
  407.                    XmNrightAttachment, XmATTACH_NONE,
  408.                    0);
  409.  
  410.     XtVaSetValues (app_browse,
  411.                    XmNmarginWidth, 8,
  412.                    XmNheight, labels_height,
  413.                    XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
  414.                    XmNtopWidget, app_text,
  415.                    XmNbottomAttachment, XmATTACH_NONE,
  416.                    XmNleftAttachment, XmATTACH_WIDGET,
  417.                    XmNleftWidget, app_text,
  418.                    XmNrightAttachment, XmATTACH_NONE,
  419.                    0);
  420.  
  421.     XtVaSetValues (save_toggle,
  422.                    XmNindicatorType, XmONE_OF_MANY,
  423.                    XmNheight, labels_height,
  424.                    XmNtopAttachment, XmATTACH_WIDGET,
  425.                    XmNtopWidget, app_text,
  426.                    XmNbottomAttachment, XmATTACH_NONE,
  427.                    XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  428.                    XmNleftWidget, app_toggle,
  429.                    XmNrightAttachment, XmATTACH_NONE,
  430.                    0);
  431.  
  432.     XtVaSetValues (unknown_toggle,
  433.                    XmNindicatorType, XmONE_OF_MANY,
  434.                    XmNheight, labels_height,
  435.                    XmNtopAttachment, XmATTACH_WIDGET,
  436.                    XmNtopWidget, save_toggle,
  437.                    XmNbottomAttachment, XmATTACH_NONE,
  438.                    XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
  439.                    XmNleftWidget, save_toggle,
  440.                    XmNrightAttachment, XmATTACH_NONE,
  441.                    0);
  442.  
  443.     XtManageChildren (kids, i);
  444.     XtManageChild(form2);
  445.     XtManageChild(label1);
  446.     XtManageChild(frame1);
  447.  
  448.     XtAddCallback(navigator_toggle,  XmNvalueChangedCallback,
  449.                   prefsApplEditCb_toggleHandledBy, this);
  450.     XtAddCallback(plugin_toggle,  XmNvalueChangedCallback,
  451.                   prefsApplEditCb_toggleHandledBy, this);
  452.     XtAddCallback(app_toggle,  XmNvalueChangedCallback,
  453.                   prefsApplEditCb_toggleHandledBy, this);
  454.     XtAddCallback(save_toggle,  XmNvalueChangedCallback,
  455.                   prefsApplEditCb_toggleHandledBy, this);
  456.     XtAddCallback(unknown_toggle,  XmNvalueChangedCallback,
  457.                   prefsApplEditCb_toggleHandledBy, this);
  458.  
  459.     XtAddCallback(app_browse,  XmNactivateCallback,
  460.                   prefsApplEditCb_browseAppl, this);
  461.  
  462.     XtAddCallback(m_chrome, XmNokCallback, prefsApplEditCb_ok, this);
  463.     XtAddCallback(m_chrome, XmNcancelCallback, prefsApplEditCb_cancel, this);
  464. }
  465.  
  466. // Member:       ~XFE_PrefsApplEditDialog
  467. // Description:  Destructor
  468. // Inputs:
  469. // Side effects: 
  470.  
  471. XFE_PrefsApplEditDialog::~XFE_PrefsApplEditDialog()
  472. {
  473.     // Clean up
  474.  
  475.     delete m_prefsDataApplEdit;
  476. }
  477.  
  478. // Member:       show
  479. // Description:  Pop up dialog
  480. // Inputs:
  481. // Side effects: 
  482.  
  483. void XFE_PrefsApplEditDialog::show()
  484. {
  485.     // TODO: Initialize the dialog
  486.  
  487.     // Manage the top level
  488.  
  489.     XFE_Dialog::show();
  490.  
  491.     // Set focus to the OK button
  492.  
  493.     XmProcessTraversal(m_okButton, XmTRAVERSE_CURRENT);
  494. }
  495.  
  496. // Member:       initPage
  497. // Description:  Initializes page for MailNewsApplEdit
  498. // Inputs:
  499. // Side effects: 
  500.  
  501. void XFE_PrefsApplEditDialog::initPage(Boolean newFlag,
  502.                                        int     pos)
  503. {
  504.     XP_ASSERT(m_prefsDataApplEdit);
  505.  
  506.     PrefsDataApplEdit    *fep = m_prefsDataApplEdit;
  507.     PrefsDataGeneralAppl *appl_data = m_prefsDataGeneralAppl;
  508.  
  509.     fep->pos = pos;
  510.     fep->static_app = False;
  511.  
  512.     if (newFlag) {
  513.         fep->pos = 0;
  514.         fep->cd = 0;
  515.         XtUnmanageChild(fep->static_desc_label);
  516.     }
  517.     else if (pos < xfe_prefsAppl_get_static_app_count()) {
  518.  
  519.         // static applications
  520.         fep->static_app = True;
  521.         XtUnmanageChild(fep->mime_types_desc_text);
  522.  
  523.         XmString xms;
  524.         xms = XmStringCreateLtoR(xfe_prefsAppl_get_static_app_desc(pos),
  525.                                  XmFONTLIST_DEFAULT_TAG);
  526.         XtVaSetValues(fep->static_desc_label,
  527.                       XmNlabelString, xms,
  528.                       0 );
  529.         XmStringFree(xms);
  530.  
  531.         XtSetSensitive(fep->mime_types_text, False);
  532.         XtSetSensitive(fep->mime_types_suffix_text, False);
  533.         XtSetSensitive(fep->navigator_toggle, False);
  534.         XtSetSensitive(fep->unknown_toggle, False);
  535.         XtSetSensitive(fep->plugin_toggle, False);
  536.         XtSetSensitive(fep->save_toggle, False);
  537.         XtSetSensitive(fep->navigator_toggle, False);
  538.         XtVaSetValues(fep->app_toggle,
  539.                       XmNset, True, 
  540.                       XmNsensitive, True,
  541.                       0);
  542.  
  543.         XtVaSetValues(fep->app_text, XmNsensitive, True, 0);
  544.         fe_SetTextField(fep->app_text,
  545.                       xfe_prefsAppl_get_static_app_command(pos));
  546.     }
  547.     else {
  548.         /* mime types */
  549.         /* Note that fep->pos is adjusted */
  550.         XtUnmanageChild(fep->static_desc_label);
  551.         int adjusted_pos = pos - appl_data->static_apps_count;
  552.         fep->pos = adjusted_pos;
  553.         fep->cd = xfe_prefsDialogAppl_get_mime_data_at_pos(adjusted_pos);
  554.  
  555.         NET_cdataStruct *cd = fep->cd;
  556.  
  557.         int i;
  558.         char *extensions = 0; /* has to initialize bf. passing to StrAllocCopy() */
  559.  
  560.         if ( !fep || !cd->ci.type || !*cd->ci.type ) return;
  561.  
  562.         /* Found Type */
  563.         XtVaSetValues(fep->mime_types_text, XmNcursorPosition, 0, 0);
  564.         fe_SetTextField(fep->mime_types_text, cd->ci.type);
  565.  
  566.         /* MIME Description */
  567.         if ( cd->ci.desc && *cd->ci.desc ) {
  568.             XtVaSetValues(fep->mime_types_desc_text, XmNcursorPosition, 0, 0 );
  569.             fe_SetTextField(fep->mime_types_desc_text, cd->ci.desc);
  570.         }
  571.  
  572.         /* MIME Suffix */
  573.         for ( i = 0; i < cd->num_exts; i++ ) {
  574.             if ( i == 0 ) {
  575.                 StrAllocCopy(extensions, cd->exts[i] );
  576.             }
  577.             else {
  578.                 extensions = XP_AppendStr(extensions, ",");
  579.                 extensions = XP_AppendStr(extensions,  cd->exts[i]);
  580.             }
  581.         }
  582.  
  583.         if (cd->num_exts > 0 ) {
  584.             XtVaSetValues(fep->mime_types_suffix_text, XmNcursorPosition, 0, 0);
  585.             fe_SetTextField(fep->mime_types_suffix_text, extensions);
  586.         }
  587.  
  588.         /* Handle By...this mail cap */
  589.  
  590.         NET_mdataStruct *md = NULL;
  591.         XtVaSetValues(fep->navigator_toggle, XmNsensitive, False, 0);
  592.         /* Netscape Type ?*/
  593.         if (xfe_prefsDialogAppl_handle_by_netscape(cd->ci.type) ){
  594.             XtVaSetValues(fep->navigator_toggle, XmNsensitive, True, 0);
  595.         }
  596.  
  597.         md = xfe_prefsDialogAppl_get_mailcap_from_type(cd->ci.type);
  598.         if ( md && md->command && *md->command ){
  599.             XtVaSetValues(fep->app_text, XmNsensitive, False, 0 );
  600.             fe_SetTextField(fep->app_text, md->command);
  601.         }
  602.     
  603.         if (md && md->xmode && *md->xmode){
  604.             md->xmode = fe_StringTrim(md->xmode);
  605.  
  606.             if (!strcmp(md->xmode, NET_COMMAND_UNKNOWN))
  607.                 XtVaSetValues(fep->unknown_toggle, XmNset, True, 0 );
  608.             else if (fe_IsMailcapEntryPlugin(md))
  609.                 XtVaSetValues(fep->plugin_toggle, XmNset, True, 0 );
  610.             else if (!strcmp(md->xmode, NET_COMMAND_SAVE_TO_DISK) ||
  611.                      (!strcmp(md->xmode, NET_COMMAND_SAVE_BY_NETSCAPE)))
  612.                 XtVaSetValues(fep->save_toggle, XmNset, True, 0 );
  613.             else if (!strcmp(md->xmode,NET_COMMAND_NETSCAPE))
  614.                 XtVaSetValues(fep->navigator_toggle, XmNset, True, 0 );
  615.             else if (!strcmp(md->xmode,NET_COMMAND_DELETED))
  616.                 XtVaSetValues(fep->unknown_toggle, XmNset, True, 0 );
  617.         }
  618.         else if ( md  && md->command && *md->command){
  619.             XtVaSetValues(fep->app_toggle, XmNset, True, 0 );
  620.             XtVaSetValues(fep->app_text,
  621.                           XmNsensitive, True, 0 );
  622.         }
  623.         else if (xfe_prefsDialogAppl_handle_by_netscape(cd->ci.type) )
  624.             XtVaSetValues(fep->navigator_toggle, XmNset, True, 0 );
  625.         else if (xfe_prefsDialogAppl_handle_by_saveToDisk(cd->ci.type) )
  626.             XtVaSetValues(fep->save_toggle, XmNset, True, 0 );
  627.         else
  628.             XtVaSetValues(fep->unknown_toggle, XmNset, True, 0);
  629.     }
  630. }
  631.  
  632. // Member:       verifyPage
  633. // Description:  verify page for MailNewsApplEdit
  634. // Inputs:
  635. // Side effects: 
  636.  
  637. Boolean XFE_PrefsApplEditDialog::verifyPage()
  638. {
  639.     return TRUE;
  640. }
  641.  
  642. // Member:       installChanges
  643. // Description:  install changes for ApplEdit
  644. // Inputs:
  645. // Side effects: 
  646.  
  647. void XFE_PrefsApplEditDialog::installChanges()
  648. {
  649. }
  650.  
  651. // Member:       getContext
  652. // Description:  returns context
  653. // Inputs:
  654. // Side effects: 
  655.  
  656. MWContext *XFE_PrefsApplEditDialog::getContext()
  657. {
  658.     return (m_prefsDialog->getContext());
  659. }
  660.  
  661. // Member:       getPrefsDialog
  662. // Description:  returns preferences dialog
  663. // Inputs:
  664. // Side effects: 
  665.  
  666. XFE_PrefsDialog *XFE_PrefsApplEditDialog::getPrefsDialog()
  667. {
  668.     return (m_prefsDialog);
  669. }
  670.  
  671. // Friend:       prefsApplEditCb_ok
  672. // Description:  
  673. // Inputs:
  674. // Side effects: 
  675.  
  676. void prefsApplEditCb_ok(Widget    w,
  677.                         XtPointer closure,
  678.                         XtPointer callData)
  679. {
  680.     XFE_PrefsApplEditDialog  *theDialog = (XFE_PrefsApplEditDialog *)closure;
  681.     XFE_PrefsPageGeneralAppl *thePage = theDialog->m_prefsPageGeneralAppl;
  682.     PrefsDataApplEdit        *fep = theDialog->m_prefsDataApplEdit;
  683.     PrefsDataGeneralAppl     *applData = theDialog->m_prefsDataGeneralAppl;
  684.  
  685.     XP_ASSERT(fep);
  686.     if (! theDialog->verifyPage()) return;
  687.  
  688.     char            *text = 0;
  689.     char            *u = 0;
  690.     int              i;
  691.     int              old_pos;
  692.     NET_cdataStruct *old_cd = NULL;
  693.     NET_cdataStruct *new_cd = NULL;
  694.     NET_mdataStruct *md = NULL;
  695.     Boolean          add_new_cd = False;
  696.     char            *src_string =0;
  697.     int              real_pos;
  698.  
  699.     if (fep->static_app) {
  700.         
  701.         /* Update fe_globalPrefs for static apps */
  702.  
  703.         text = fe_GetTextField(fep->app_text);
  704.         if (text && *text) {
  705.             char *trimmed_text = fe_StringTrim(text);
  706.             if (XP_STRLEN(trimmed_text) > 0) {
  707.  
  708.                 /* Update the application command in fe_globalPrefs */
  709.                 xfe_prefsAppl_set_static_app_command(fep->pos, trimmed_text);
  710.  
  711.                 /* Update the applications pane in prefs dialog */
  712.                 char *line = 0;
  713.                 line = PR_smprintf("%s|%s", 
  714.                                    xfe_prefsAppl_get_static_app_desc(fep->pos), 
  715.                                    trimmed_text); 
  716.                 XmLGridSetStringsPos(applData->helpers_list, XmCONTENT, fep->pos, 
  717.                                      XmCONTENT, 0, line);
  718.                 XP_FREEIF(line);
  719.             }
  720.             else {
  721.                 FE_Alert(fep->context, XP_GetString(XFE_HELPERS_EMPTY_APP));
  722.             }
  723.         }
  724.         else {
  725.             FE_Alert(fep->context, XP_GetString(XFE_HELPERS_EMPTY_APP));
  726.         }
  727.         XP_FREEIF(text);
  728.     }
  729.  
  730.     else {
  731.  
  732.         /* Deal with helper apps handled by the XP */
  733.  
  734.         thePage->setModified(TRUE);
  735.  
  736.         /* Type  is critical. If this field is empty, then basically we don't
  737.        do a thing here */
  738.  
  739.         text = fe_GetTextField(fep->mime_types_text);
  740.         if ( !text ) return;
  741.         text = fe_StringTrim(text);
  742.         if ( !strlen(text)) {
  743.             FE_Alert(fep->context, XP_GetString(XFE_HELPERS_EMPTY_MIMETYPE));
  744.             XtFree(text); 
  745.             return;
  746.         }
  747.  
  748.         if(text) XtFree(text);
  749.  
  750.         /* Empty type Business has been taken care of */
  751.         /* Do some serious stuff here now...*/
  752.  
  753.         new_cd = NET_cdataCreate();
  754.         new_cd->is_local = True;
  755.         if ( fep->cd ) {
  756.             new_cd->is_external = fep->cd->is_external;
  757.             new_cd->is_modified = 1;
  758.         }
  759.         else {
  760.             new_cd->is_external = 1;
  761.             new_cd->is_modified = 1;
  762.  
  763.             /* If new entry was deleted before commit, we don't want to save the info out*/
  764.             new_cd->is_new = 1; /* remember this for deletion*/
  765.  
  766.             add_new_cd = True;
  767.         }
  768.  
  769.         /* Description */
  770.         text = fe_GetTextField(fep->mime_types_desc_text);
  771.         if ( text && *text ) {
  772.             fe_StringTrim(text);
  773.             StrAllocCopy(new_cd->ci.desc, text);
  774.         }
  775.         if(text) XtFree(text);
  776.  
  777.         /* Type */
  778.         text = fe_GetTextField(fep->mime_types_text);
  779.         if ( text && *text ){
  780.             fe_StringTrim(text);
  781.             StrAllocCopy( new_cd->ci.type, text);
  782.         }
  783.         if(text) XtFree(text);
  784.  
  785.         /* Suffix */
  786.         text = fe_GetTextField(fep->mime_types_suffix_text);
  787.         u = XP_STRTOK(text, ",");
  788.  
  789.         while (u) {
  790.             u = fe_StringTrim(u);
  791.             xfe_prefsDialogAppl_build_exts(u, new_cd);
  792.             u = XP_STRTOK(NULL, ",");
  793.         }
  794.         if(text) XtFree(text);
  795.  
  796.         if ( (old_cd=xfe_prefsDialogAppl_can_combine (new_cd, &old_pos)) ) {
  797.             if ( ! xfe_prefsDialogAppl_is_deleted_type(old_cd) ) { 
  798.                 /* Only cd's that aren't deleted are displayed in the list */
  799.                 /* Therefore, we need to make sure if the item is in the list */
  800.                 /* in order to delete */
  801.  
  802.                 if ( xfe_prefsDialogAppl_get_mime_data_real_pos(old_cd, &real_pos) )
  803.                     old_pos = real_pos;
  804.  
  805.                 if ( old_pos > fep->pos ) 
  806.                     XmLGridDeleteRows(applData->helpers_list, XmCONTENT, 
  807.                                       old_pos + xfe_prefsAppl_get_static_app_count(), 1);
  808.                 else if (fep->pos > old_pos ) {
  809.                     XmLGridDeleteRows(applData->helpers_list, XmCONTENT, 
  810.                                       old_pos + xfe_prefsAppl_get_static_app_count(), 1);
  811.                     fep->pos -= 1;
  812.                 }
  813.             }
  814.  
  815.             /* CanCombine=True will remove the fep->cd from the list 
  816.              * Therefore, make the new one the current 
  817.              * If action = add_new_cd, and can_combine = true, we should
  818.              * remove the old one
  819.              */
  820.             if ( add_new_cd ) {
  821.                 NET_cdataRemove(old_cd);
  822.                 old_cd = NULL;
  823.             }
  824.         }
  825.  
  826.         if ( fep->cd ) /* Then, this is not an action: NEW  */ {
  827.  
  828.             if ( !fep->cd->is_local && !fep->cd->is_external ) {
  829.                 /* read from Global mime.type in old mime format */
  830.                 /* convert it to the new format here */
  831.                 src_string = xfe_prefsDialogAppl_construct_new_mime_string( new_cd );
  832.             }
  833.             else if ( !fep->cd->is_local && !fep->cd->num_exts ) {
  834.                 /* This entry is added by an existing mailcap type */
  835.                 src_string = xfe_prefsDialogAppl_construct_new_mime_string(new_cd);
  836.             }
  837.             else    
  838.                 src_string = xfe_prefsDialogAppl_replace_new_mime_string( fep->cd, new_cd );
  839.  
  840.             XP_FREE(fep->cd->src_string);
  841.             fep->cd->src_string = src_string;
  842.  
  843.             XP_FREE(fep->cd->ci.desc );
  844.             XP_FREE(fep->cd->ci.type );
  845.  
  846.             fep->cd->ci.desc = 0;
  847.             fep->cd->ci.type = 0;
  848.  
  849.             for ( i = 0; i < fep->cd->num_exts; i++ )
  850.                 XP_FREE (fep->cd->exts[i]);
  851.             XP_FREE(fep->cd->exts);
  852.  
  853.             fep->cd->exts = 0;
  854.             fep->cd->num_exts = 0;
  855.             fep->cd->is_external = new_cd->is_external;
  856.             fep->cd->is_modified = new_cd->is_modified;
  857.             StrAllocCopy(fep->cd->ci.desc, new_cd->ci.desc);
  858.             StrAllocCopy(fep->cd->ci.type, new_cd->ci.type);
  859.             for ( i = 0; i < new_cd->num_exts; i++ )
  860.                 xfe_prefsDialogAppl_build_exts(new_cd->exts[i], fep->cd);
  861.  
  862.             NET_cdataFree(new_cd);
  863.         }
  864.         else {
  865.             src_string = xfe_prefsDialogAppl_construct_new_mime_string( new_cd );
  866.             if ( new_cd->src_string) XP_FREE(new_cd->src_string);
  867.             new_cd->src_string = src_string;
  868.             fep->cd = new_cd;
  869.         }
  870.  
  871.         xfe_prefsDialogAppl_build_handle(fep);
  872.         if ( add_new_cd && (fep->pos == 0)) {
  873.             fep->pos = -1;
  874.             NET_cdataAdd(fep->cd);
  875.         }
  876.  
  877.         if ( ! xfe_prefsDialogAppl_is_deleted_type(fep->cd) ) {
  878.             md = xfe_prefsDialogAppl_get_mailcap_from_type(fep->cd->ci.type);
  879.             int  position;
  880.             if (fep->pos == (-1)) {
  881.                 /* adding this to the list.
  882.                  * This is kinda tricky. We need to add this to the
  883.                  * beginning of mime type list, because the backend does
  884.                  * that in the background.
  885.                  * at the same time, we want to insert it after the static apps
  886.                  */
  887.                 position = xfe_prefsAppl_get_static_app_count();
  888.                 xfe_prefsDialogAppl_insert_type_at_pos(applData, fep->cd, md, position);
  889.             }
  890.             else {
  891.                 /* replacing an existing entry */
  892.                 position = fep->pos + xfe_prefsAppl_get_static_app_count();
  893.                 xfe_prefsDialogAppl_append_type_to_list(applData, fep->cd, md, position);
  894.             }
  895.         }
  896.     }
  897.  
  898.     // Simulate a cancel
  899.  
  900.     prefsApplEditCb_cancel(w, closure, callData);
  901.  
  902.     // Install preferences
  903.  
  904.     theDialog->installChanges();
  905.  
  906.     // Save the preferences at the end, so that if we've found some setting
  907.     // that crashes, it won't get saved...
  908.  
  909.     if (!XFE_SavePrefs ((char *) fe_globalData.user_prefs_file, &fe_globalPrefs))
  910.         fe_perror(theDialog->getContext(), XP_GetString( XFE_ERROR_SAVING_OPTIONS));
  911. }
  912.  
  913. // Friend:       prefsApplEditCb_cancel
  914. // Description:  
  915. // Inputs:
  916. // Side effects: 
  917.  
  918. void prefsApplEditCb_cancel(Widget    /* w */,
  919.                             XtPointer closure,
  920.                             XtPointer /* callData */)
  921. {
  922.     XFE_PrefsApplEditDialog *theDialog = (XFE_PrefsApplEditDialog *)closure;
  923.  
  924.     // Delete the dialog
  925.  
  926.     delete theDialog;
  927. }
  928.  
  929. // Friend:       prefsApplEditCb_toggleHandledBy
  930. // Description:  
  931. // Inputs:
  932. // Side effects: 
  933.  
  934. void prefsApplEditCb_toggleHandledBy(Widget    widget,
  935.                                      XtPointer closure,
  936.                                      XtPointer callData)
  937. {
  938.     XFE_PrefsApplEditDialog      *theDialog = (XFE_PrefsApplEditDialog *)closure;
  939.     PrefsDataApplEdit            *fep = theDialog->m_prefsDataApplEdit;
  940.     XmToggleButtonCallbackStruct *cb = (XmToggleButtonCallbackStruct *)callData;
  941.  
  942.      if (!cb->set) {
  943.         XtVaSetValues (widget, XmNset, True, 0);
  944.     }
  945.     else if (widget == fep->navigator_toggle) {
  946.         XtVaSetValues (fep->plugin_toggle, XmNset, False, 0);
  947.         XtVaSetValues (fep->app_toggle, XmNset, False, 0);
  948.         XtVaSetValues (fep->save_toggle, XmNset, False, 0);
  949.         XtVaSetValues (fep->unknown_toggle, XmNset, False, 0);
  950.         XtVaSetValues (fep->plugin_combo, XmNsensitive, False, 0);
  951.         XtVaSetValues (fep->app_text, XmNsensitive, False, 0);
  952.     }
  953.     else if (widget == fep->plugin_toggle) {
  954.         if (fep->plugins) {
  955.             int    n;
  956.             char  *pluginName;
  957.             XtVaGetValues(fep->plugin_combo, XmNuserData, &n, 0);
  958.             pluginName = fep->plugins[n];
  959.             theDialog->pluginSelected(pluginName);
  960.         }
  961.         XtVaSetValues (fep->navigator_toggle, XmNset, False, 0);
  962.         XtVaSetValues (fep->app_toggle, XmNset, False, 0);
  963.         XtVaSetValues (fep->save_toggle, XmNset, False, 0);
  964.         XtVaSetValues (fep->unknown_toggle, XmNset, False, 0);
  965.         XtVaSetValues (fep->plugin_combo, XmNsensitive, True, 0);
  966.         XtVaSetValues (fep->app_text, XmNsensitive, False, 0);
  967.     }
  968.     else if (widget == fep->app_toggle) {
  969.         XtVaSetValues (fep->navigator_toggle, XmNset, False, 0);
  970.         XtVaSetValues (fep->plugin_toggle, XmNset, False, 0);
  971.         XtVaSetValues (fep->save_toggle, XmNset, False, 0);
  972.         XtVaSetValues (fep->unknown_toggle, XmNset, False, 0);
  973.         XtVaSetValues (fep->plugin_combo, XmNsensitive, False, 0);
  974.         XtVaSetValues (fep->app_text, XmNsensitive, True, 0);
  975.     }
  976.     else if (widget == fep->save_toggle) {
  977.         XtVaSetValues (fep->navigator_toggle, XmNset, False, 0);
  978.         XtVaSetValues (fep->plugin_toggle, XmNset, False, 0);
  979.         XtVaSetValues (fep->app_toggle, XmNset, False, 0);
  980.         XtVaSetValues (fep->unknown_toggle, XmNset, False, 0);
  981.         XtVaSetValues (fep->plugin_combo, XmNsensitive, False, 0);
  982.         XtVaSetValues (fep->app_text, XmNsensitive, False, 0);
  983.     }
  984.     else if (widget == fep->unknown_toggle) {
  985.         XtVaSetValues (fep->navigator_toggle, XmNset, False, 0);
  986.         XtVaSetValues (fep->plugin_toggle, XmNset, False, 0);
  987.         XtVaSetValues (fep->app_toggle, XmNset, False, 0);
  988.         XtVaSetValues (fep->save_toggle, XmNset, False, 0);
  989.         XtVaSetValues (fep->plugin_combo, XmNsensitive, False, 0);
  990.         XtVaSetValues (fep->app_text, XmNsensitive, False, 0);
  991.     }
  992.     else
  993.         abort ();
  994. }
  995.  
  996. // Friend:       prefsApplEditCb_browseAppl
  997. // Description:  
  998. // Inputs:
  999. // Side effects: 
  1000.  
  1001. void prefsApplEditCb_browseAppl(Widget    /* w */,
  1002.                                 XtPointer closure,
  1003.                                 XtPointer /* callData */)
  1004. {
  1005.     XFE_PrefsApplEditDialog   *theDialog = (XFE_PrefsApplEditDialog *)closure;
  1006.     PrefsDataApplEdit         *fep = theDialog->m_prefsDataApplEdit;
  1007.  
  1008.     fe_browse_file_of_text(theDialog->getContext(), fep->app_text, False);
  1009. }
  1010.  
  1011. // Friend:       prefsApplEditCb_setHandledBy
  1012. // Description:  
  1013. // Inputs:
  1014. // Side effects: 
  1015.  
  1016. void prefsApplEditCb_setHandledBy(Widget    /* w */,
  1017.                                   XtPointer closure,
  1018.                                   XtPointer /* callData */)
  1019. {
  1020.     XFE_PrefsApplEditDialog   *theDialog = (XFE_PrefsApplEditDialog *)closure;
  1021.     PrefsDataApplEdit *fep = theDialog->m_prefsDataApplEdit;
  1022.     char              *text = NULL;
  1023.     Bool               nav_p = False;
  1024.     Bool               plugin_p = False;
  1025.  
  1026.     text = fe_GetTextField(fep->mime_types_text);
  1027.  
  1028.     if (text && *text && xfe_prefsDialogAppl_handle_by_netscape(text)) {
  1029.         XtVaSetValues(fep->navigator_toggle, XmNsensitive, True, 0);
  1030.         nav_p = True;
  1031.     }
  1032.     else
  1033.         XtVaSetValues(fep->navigator_toggle, XmNsensitive, False, 0);
  1034.  
  1035.     if (text && *text && theDialog->handleByPlugin(text))
  1036.         /* fe_helpers_handle_by_plugin() will sensitize the plugin button. */
  1037.         plugin_p = True;
  1038.   
  1039.     /* if Navigator used to handle this but cannot anymore,
  1040.      * unknown takes over 
  1041.      */
  1042.     if (XmToggleButtonGetState(fep->navigator_toggle) && !nav_p)
  1043.         XmToggleButtonSetState(fep->unknown_toggle, True, True);
  1044.  
  1045.     /* if Plugin used to handle this but cannot anymore, unknown takes over */
  1046.     if (XmToggleButtonGetState(fep->plugin_toggle) && !plugin_p)
  1047.         XmToggleButtonSetState(fep->unknown_toggle, True, True);
  1048.  
  1049.     if (text) XtFree(text);
  1050. }
  1051.  
  1052. void prefsApplEditCb_selectPlugin(Widget    /* widget */,
  1053.                                   XtPointer closure,
  1054.                                   XtPointer call_data)
  1055. {
  1056.     XFE_PrefsApplEditDialog   *theDialog = (XFE_PrefsApplEditDialog *)closure;
  1057.     PrefsDataApplEdit         *fep = theDialog->m_prefsDataApplEdit;
  1058.     DtComboBoxCallbackStruct  *cbs = (DtComboBoxCallbackStruct *)call_data;
  1059.     char                      *pluginName;
  1060.  
  1061.     if (!XmToggleButtonGetState(fep->plugin_toggle)) return;
  1062.  
  1063.     pluginName = fep->plugins[cbs->item_position];
  1064.     XtVaSetValues(fep->plugin_combo, XmNuserData, cbs->item_position, 0);
  1065.     theDialog->pluginSelected(pluginName);
  1066. }
  1067.  
  1068. // ==================== Static Member Functions ====================
  1069.  
  1070. // Member:       buildPluginList
  1071. // Description:  
  1072. // Inputs:
  1073. // Side effects: 
  1074.  
  1075. void XFE_PrefsApplEditDialog::buildPluginList(char *mimeType)
  1076. {
  1077.     int               i;
  1078.     char            **plugins = NULL;
  1079.     char             *current_plugin = NULL;
  1080.     NET_mdataStruct  *md = NULL;
  1081.     XmString          xms;
  1082.  
  1083.     PrefsDataApplEdit *fep = m_prefsDataApplEdit;
  1084.     if (!fep) return;
  1085.  
  1086.     if (mimeType  && *mimeType)
  1087.         plugins = NPL_FindPluginsForType(mimeType);
  1088.   
  1089.     /* Destroy all existing children */
  1090.     if (fep->plugin_combo) {
  1091.         int   count;
  1092.         XtVaGetValues(fep->plugin_combo, XmNitemCount, &count, 0);
  1093.         if (count > 0) DtComboBoxDeleteAllItems(fep->plugin_combo);
  1094.     }
  1095.   
  1096.     if (plugins && plugins[0]) {
  1097.         md = xfe_prefsDialogAppl_get_mailcap_from_type(mimeType);
  1098.         if (fe_IsMailcapEntryPlugin(md))
  1099.             current_plugin = fe_GetPluginNameFromMailcapEntry(md);
  1100.     
  1101.         i = 0;
  1102.         while (plugins[i]) {
  1103.             xms = XmStringCreateLtoR(plugins[i], XmFONTLIST_DEFAULT_TAG);
  1104.             DtComboBoxAddItem(fep->plugin_combo, xms, 0, True);
  1105.             if ((i == 0) || 
  1106.                 (!strcmp(current_plugin, plugins[i])))
  1107.                 DtComboBoxSelectItem(fep->plugin_combo, xms);
  1108.             XmStringFree(xms);
  1109.             i++;
  1110.         }
  1111.         XtVaSetValues(fep->plugin_combo, XmNsensitive, True, 0);
  1112.         XtVaSetValues(fep->plugin_toggle, XmNsensitive, True, 0);
  1113.     }
  1114.     else {
  1115.         // No plugins installed for this mime type
  1116.         XmString xms;
  1117.         xms = XmStringCreateLtoR(" ", XmFONTLIST_DEFAULT_TAG);
  1118.         XtVaSetValues(fep->plugin_combo,
  1119.                       XmNlabelString, xms,
  1120.                       0);
  1121.         XmStringFree(xms);
  1122.         XtVaSetValues(fep->plugin_toggle, XmNsensitive, False, 0);
  1123.     }
  1124.  
  1125.     fep->plugins = plugins;
  1126. }
  1127.  
  1128. // Member:       buildPluginList
  1129. // Description:  
  1130. // Inputs:
  1131. // Side effects: 
  1132.  
  1133. void XFE_PrefsApplEditDialog::pluginSelected(char *pluginName)
  1134. {
  1135.     PrefsDataApplEdit *fep = m_prefsDataApplEdit;
  1136.  
  1137.     /* Change the description and extensions to what the plugins says */
  1138.     char *mimetype, *desc=NULL, *ext=NULL;
  1139.     char *cur_desc=NULL, *cur_ext=NULL;
  1140.     XP_Bool differ = True;
  1141.  
  1142.     mimetype = fe_GetTextField(fep->mime_types_text);
  1143.  
  1144.     if (fe_GetMimetypeInfoFromPlugin(pluginName, mimetype, &desc, &ext) >= 0) {
  1145.         /* If either the description or the extension is different from what is
  1146.          * already being displayed, ask the user whether to revert to what the
  1147.          * plugin says.
  1148.          */
  1149.         cur_desc = fe_GetTextField(fep->mime_types_desc_text);
  1150.         cur_ext = fe_GetTextField(fep->mime_types_suffix_text);
  1151.      
  1152.         if (desc) differ = strcmp(desc, cur_desc);
  1153.         else differ = *cur_desc;
  1154.      
  1155.         if (!differ)
  1156.             if (ext) differ = strcmp(ext, cur_ext);
  1157.             else differ = *cur_ext;
  1158.         
  1159.         if (differ) {
  1160.             char *buf;
  1161.             buf = PR_smprintf(XP_GetString(XFE_HELPERS_PLUGIN_DESC_CHANGE),
  1162.                               mimetype, desc?desc:"", ext?ext:"");
  1163.             if (FE_Confirm(fep->context, buf)) {
  1164.                 XtVaSetValues(fep->mime_types_desc_text, XmNcursorPosition, 0,
  1165.                               0);
  1166.                 fe_SetTextField(fep->mime_types_desc_text, desc);
  1167.                 XtVaSetValues(fep->mime_types_suffix_text, XmNcursorPosition, 0,
  1168.                               0);
  1169.                 fe_SetTextField(fep->mime_types_suffix_text, ext);
  1170.             }
  1171.             if (buf) XP_FREE(buf);
  1172.         }
  1173.     }
  1174.  
  1175.     if (mimetype) XP_FREE(mimetype);
  1176.     if (cur_desc) XP_FREE(cur_desc);
  1177.     if (cur_ext) XP_FREE(cur_ext);
  1178. }
  1179.  
  1180. XP_Bool XFE_PrefsApplEditDialog::handleByPlugin(char *type)
  1181. {
  1182.     PrefsDataApplEdit *fep = m_prefsDataApplEdit;
  1183.     Bool b;
  1184.  
  1185.     /* Create plugins options menu and sensitize the plugin option menu and
  1186.        toggle button, depending on the mimetype passed in */
  1187.  
  1188.     buildPluginList(type);
  1189.     XtVaGetValues(fep->plugin_toggle, XmNsensitive, &b, 0);
  1190.     return(b);
  1191. }
  1192.  
  1193.