Mozilla/mozilla/cmd/xfe/src/PrefsApplEdit.cpp
ramiro 9612894836 Add a check for a NULL str before passing it to strcmp().
Otherwise, Linux and possibly other platforms with strict strcmp()
implementations will crash when the plugin list is NULL.  Thanks to
pollmann@netscape.com.


git-svn-id: svn://10.0.0.236/trunk@1735 18797224-902f-48f8-a5cc-f745e15eee43
1998-05-15 11:21:09 +00:00

1199 lines
35 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* The contents of this file are subject to the Netscape Public License
* Version 1.0 (the "NPL"); you may not use this file except in
* compliance with the NPL. You may obtain a copy of the NPL at
* http://www.mozilla.org/NPL/
*
* Software distributed under the NPL is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
* for the specific language governing rights and limitations under the
* NPL.
*
* The Initial Developer of this code under the NPL is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
* Reserved.
*/
/*
PrefsApplEdit.cpp -- The more dialog for Mail server preference
Created: Linda Wei <lwei@netscape.com>, 23-Oct-96.
*/
#include "felocale.h"
#include "structs.h"
#include "fonts.h"
#include "xpassert.h"
#include "np.h"
#include "xfe.h"
#include "e_kit.h"
#include "PrefsApplEdit.h"
#include "PrefsDialogAppl.h"
#include "PrefsDialog.h"
#include <Xm/Xm.h>
#include <Xm/Label.h>
#include <Xm/LabelG.h>
#include <Xm/PushB.h>
#include <Xm/PushBG.h>
#include <Xm/ToggleB.h>
#include <Xm/Form.h>
#include <Xm/Frame.h>
#include <Xm/TextF.h>
#include <Xm/ToggleBG.h>
#include <XmL/Grid.h>
#include <DtWidgets/ComboBox.h>
#include <Xfe/Xfe.h>
extern int XFE_HELPERS_PLUGIN_DESC_CHANGE;
extern int XFE_HELPERS_EMPTY_MIMETYPE;
extern int XFE_ERROR_SAVING_OPTIONS;
extern int XFE_HELPERS_EMPTY_APP;
extern "C"
{
char *XP_GetString(int i);
/* char *XP_AppendStr(char *s1, char *s2); */
void fe_browse_file_of_text(MWContext *context, Widget text_field, Boolean dirp);
char *fe_GetPluginNameFromMailcapEntry(NET_mdataStruct *md_item);
int fe_GetMimetypeInfoFromPlugin(char *pluginName, char *mimetype,
char **r_desc, char **r_ext);
XP_Bool fe_IsMailcapEntryPlugin(NET_mdataStruct *md_item);
}
// ==================== Public Member Functions ====================
// Member: XFE_PrefsApplEditDialog
// Description: Constructor
// Inputs:
// Side effects: Creates the edit dialog for applications
XFE_PrefsApplEditDialog::XFE_PrefsApplEditDialog
(XFE_PrefsDialog *prefsDialog,
Widget parent, // dialog parent
char *name, // dialog name
XFE_PrefsPageGeneralAppl *prefsPageGeneralAppl,
Boolean modal) // modal dialog?
: XFE_Dialog(parent,
name,
TRUE, // ok
TRUE, // cancel
FALSE, // help
FALSE, // apply
FALSE, // separator
modal // modal
),
m_prefsDialog(prefsDialog),
m_prefsPageGeneralAppl(prefsPageGeneralAppl),
m_prefsDataApplEdit(0),
m_prefsDataGeneralAppl(0)
{
m_prefsDataGeneralAppl = m_prefsPageGeneralAppl->getData();
PrefsDataApplEdit *fep = NULL;
fep = new PrefsDataApplEdit;
memset(fep, 0, sizeof(PrefsDataApplEdit));
m_prefsDataApplEdit = fep;
fep->context = m_prefsDialog->getContext();
Widget kids[100];
Arg av[50];
int ac;
int i;
Widget form;
form = XtVaCreateWidget("form", xmFormWidgetClass, m_chrome,
XmNmarginWidth, 8,
XmNtopAttachment, XmATTACH_FORM,
XmNleftAttachment, XmATTACH_FORM,
XmNrightAttachment, XmATTACH_FORM,
XmNbottomAttachment, XmATTACH_FORM,
NULL);
XtManageChild (form);
Widget form1;
ac = 0;
XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
form1 = XmCreateForm (form, "applEditForm", av, ac);
Widget static_desc_label;
Widget mime_types_desc_label;
Widget mime_types_desc_text;
Widget mime_types_label;
Widget mime_types_text;
Widget mime_types_suffix_label;
Widget mime_types_suffix_text;
ac = 0;
i = 0;
kids[i++] = mime_types_desc_label =
XmCreateLabelGadget (form1, "mimeTypesDescriptionLabel", av, ac);
kids[i++] = mime_types_desc_text =
fe_CreateTextField (form1, "mimeTypesDescriptionText",av,ac);
kids[i++] = static_desc_label =
XmCreateLabelGadget (form1, "staticDescriptionLabel", av, ac);
kids[i++] = mime_types_label =
XmCreateLabelGadget (form1, "mimeTypesLabel", av, ac);
kids[i++] = mime_types_text =
fe_CreateTextField (form1, "mimeTypesText",av,ac);
kids[i++] = mime_types_suffix_label =
XmCreateLabelGadget (form1, "mimeTypesSuffixLabel", av, ac);
kids[i++] = mime_types_suffix_text =
fe_CreateTextField (form1, "mimeTypesSuffixText",av, ac);
if (fe_globalData.nonterminal_text_translations) {
XtOverrideTranslations (mime_types_desc_text,
fe_globalData.nonterminal_text_translations);
XtOverrideTranslations (mime_types_text,
fe_globalData.nonterminal_text_translations);
}
XtAddCallback(mime_types_text,
XmNvalueChangedCallback, prefsApplEditCb_setHandledBy, this);
int labels_height;
labels_height = XfeVaGetTallestWidget(mime_types_desc_label,
mime_types_desc_text,
NULL);
int labels_width;
labels_width = XfeVaGetWidestWidget(mime_types_desc_label,
mime_types_label,
mime_types_suffix_label,
NULL);
XtVaSetValues (mime_types_desc_label,
XmNheight, labels_height,
RIGHT_JUSTIFY_VA_ARGS(mime_types_desc_label,labels_width),
XmNtopAttachment, XmATTACH_FORM,
XmNbottomAttachment, XmATTACH_NONE,
0);
XtVaSetValues (mime_types_desc_text,
XmNcolumns, 35,
XmNheight, labels_height,
XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
XmNtopWidget, mime_types_desc_label,
XmNbottomAttachment, XmATTACH_NONE,
XmNleftAttachment, XmATTACH_WIDGET,
XmNleftWidget, mime_types_desc_label,
XmNrightAttachment, XmATTACH_NONE,
0);
XtVaSetValues (static_desc_label,
XmNheight, labels_height,
XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
XmNtopWidget, mime_types_desc_label,
XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET,
XmNbottomWidget, mime_types_desc_label,
XmNleftAttachment, XmATTACH_WIDGET,
XmNleftWidget, mime_types_desc_label,
XmNrightAttachment, XmATTACH_NONE,
0);
XtVaSetValues (mime_types_label,
XmNheight, labels_height,
RIGHT_JUSTIFY_VA_ARGS(mime_types_label,labels_width),
XmNtopAttachment, XmATTACH_WIDGET,
XmNtopWidget, mime_types_desc_label,
XmNbottomAttachment, XmATTACH_NONE,
0);
XtVaSetValues (mime_types_text,
XmNcolumns, 35,
XmNheight, labels_height,
XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
XmNtopWidget,mime_types_label,
XmNbottomAttachment, XmATTACH_NONE,
XmNleftAttachment, XmATTACH_WIDGET,
XmNleftWidget, mime_types_label,
XmNrightAttachment, XmATTACH_NONE,
0);
XtVaSetValues (mime_types_suffix_label,
XmNheight, labels_height,
RIGHT_JUSTIFY_VA_ARGS(mime_types_suffix_label,labels_width),
XmNtopAttachment, XmATTACH_WIDGET,
XmNtopWidget, mime_types_label,
XmNbottomAttachment, XmATTACH_NONE,
0);
XtVaSetValues (mime_types_suffix_text,
XmNcolumns, 35,
XmNheight, labels_height,
XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
XmNtopWidget, mime_types_suffix_label,
XmNbottomAttachment, XmATTACH_NONE,
XmNleftAttachment, XmATTACH_WIDGET,
XmNleftWidget, mime_types_suffix_label,
XmNrightAttachment, XmATTACH_NONE,
0);
XtManageChildren(kids,i);
XtManageChild(form1);
Widget frame1;
ac = 0;
XtSetArg (av [ac], XmNmarginWidth, 8); ac++;
XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
XtSetArg (av [ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
XtSetArg (av [ac], XmNtopWidget, form1); ac++;
XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
frame1 = XmCreateFrame (form, "applEditFrame", av, ac);
Widget label1;
ac = 0;
XtSetArg (av [ac], XmNchildType, XmFRAME_TITLE_CHILD); ac++;
label1 = XmCreateLabelGadget (frame1, "applEditFrameLabel", av, ac);
Widget form2;
ac = 0;
XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
form2 = XmCreateForm (frame1, "applEditHandleBox", av, ac);
Widget navigator_toggle;
Widget plugin_toggle;
Widget app_toggle;
Widget app_text;
Widget app_browse;
Widget plugin_combo;
Widget save_toggle;
Widget unknown_toggle;
ac = 0;
i = 0;
kids [i++] = navigator_toggle =
XmCreateToggleButtonGadget (form2, "applEditNavigator", av,ac);
kids [i++] = plugin_toggle =
XmCreateToggleButtonGadget (form2, "applEditPlugin", av,ac);
Visual *v = 0;
Colormap cmap = 0;
Cardinal depth = 0;
XtVaGetValues (parent,
XtNvisual, &v,
XtNcolormap, &cmap,
XtNdepth, &depth,
0);
ac = 0;
XtSetArg(av[ac], XmNmoveSelectedItemUp, False); ac++;
XtSetArg(av[ac], XmNtype, XmDROP_DOWN_LIST_BOX); ac++;
XtSetArg(av[ac], XmNvisual, v); ac++;
XtSetArg(av[ac], XmNdepth, depth); ac++;
XtSetArg(av[ac], XmNcolormap, cmap); ac++;
XtSetArg(av[ac], XmNuserData, 0); ac++;
XtSetArg(av[ac], XmNarrowType, XmMOTIF); ac++;
kids[i++] = plugin_combo = DtCreateComboBox(form2, "pluginCombo", av,ac);
XtAddCallback(plugin_combo, XmNselectionCallback, prefsApplEditCb_selectPlugin, this);
ac = 0;
kids [i++] = app_toggle =
XmCreateToggleButtonGadget (form2, "applEditApp", av,ac);
kids [i++] = app_text =
fe_CreateTextField (form2, "applEditAppText", av,ac);
kids [i++] = app_browse =
XmCreatePushButton (form2, "applEditAppBrowse", av,ac);
kids [i++] = save_toggle =
XmCreateToggleButtonGadget (form2, "applEditSave", av,ac);
kids [i++] = unknown_toggle =
XmCreateToggleButtonGadget (form2, "applEditUnknown", av,ac);
fep->static_desc_label = static_desc_label;
fep->mime_types_desc_text = mime_types_desc_text;
fep->mime_types_text = mime_types_text;
fep->mime_types_suffix_text = mime_types_suffix_text;
fep->navigator_toggle = navigator_toggle;
fep->plugin_toggle = plugin_toggle;
fep->plugin_combo = plugin_combo;
fep->app_toggle = app_toggle;
fep->app_text = app_text;
fep->app_browse = app_browse;
fep->save_toggle = save_toggle;
fep->unknown_toggle = unknown_toggle;
buildPluginList((char *)(fep->cd ? fep->cd->ci.type:NULL));
labels_height = XfeVaGetTallestWidget(plugin_toggle,
plugin_combo,
app_browse,
app_text,
NULL);
labels_width = XfeVaGetWidestWidget(plugin_toggle,
app_toggle,
NULL);
XtVaSetValues (navigator_toggle,
XmNindicatorType, XmONE_OF_MANY,
XmNheight, labels_height,
XmNtopAttachment, XmATTACH_FORM,
XmNbottomAttachment, XmATTACH_NONE,
XmNleftAttachment, XmATTACH_FORM,
XmNrightAttachment, XmATTACH_NONE,
XmNsensitive, True,
0);
XtVaSetValues (plugin_toggle,
XmNindicatorType, XmONE_OF_MANY,
XmNheight, labels_height,
XmNtopAttachment, XmATTACH_WIDGET,
XmNtopWidget, navigator_toggle,
XmNbottomAttachment, XmATTACH_NONE,
XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
XmNleftWidget, navigator_toggle,
XmNrightAttachment, XmATTACH_NONE,
0);
XtVaSetValues (plugin_combo,
XmNheight, labels_height,
XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
XmNtopWidget, plugin_toggle,
XmNbottomAttachment, XmATTACH_NONE,
XmNleftAttachment, XmATTACH_FORM,
XmNleftOffset, labels_width+8,
XmNrightAttachment, XmATTACH_NONE,
0);
XtVaSetValues (app_toggle,
XmNindicatorType, XmONE_OF_MANY,
XmNheight, labels_height,
XmNtopAttachment, XmATTACH_WIDGET,
XmNtopWidget, plugin_toggle,
XmNbottomAttachment, XmATTACH_NONE,
XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
XmNleftWidget, plugin_toggle,
XmNrightAttachment, XmATTACH_NONE,
0);
Dimension size;
Dimension space;
XtVaGetValues( app_toggle,
XmNindicatorSize, &size,
XmNspacing, &space,
0 );
XtVaSetValues (app_text,
XmNcolumns, 35,
XmNheight, labels_height,
XmNsensitive, False,
XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
XmNtopWidget, app_toggle,
XmNbottomAttachment, XmATTACH_NONE,
XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
XmNleftWidget, plugin_combo,
XmNrightAttachment, XmATTACH_NONE,
0);
XtVaSetValues (app_browse,
XmNmarginWidth, 8,
XmNheight, labels_height,
XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
XmNtopWidget, app_text,
XmNbottomAttachment, XmATTACH_NONE,
XmNleftAttachment, XmATTACH_WIDGET,
XmNleftWidget, app_text,
XmNrightAttachment, XmATTACH_NONE,
0);
XtVaSetValues (save_toggle,
XmNindicatorType, XmONE_OF_MANY,
XmNheight, labels_height,
XmNtopAttachment, XmATTACH_WIDGET,
XmNtopWidget, app_text,
XmNbottomAttachment, XmATTACH_NONE,
XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
XmNleftWidget, app_toggle,
XmNrightAttachment, XmATTACH_NONE,
0);
XtVaSetValues (unknown_toggle,
XmNindicatorType, XmONE_OF_MANY,
XmNheight, labels_height,
XmNtopAttachment, XmATTACH_WIDGET,
XmNtopWidget, save_toggle,
XmNbottomAttachment, XmATTACH_NONE,
XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
XmNleftWidget, save_toggle,
XmNrightAttachment, XmATTACH_NONE,
0);
XtManageChildren (kids, i);
XtManageChild(form2);
XtManageChild(label1);
XtManageChild(frame1);
XtAddCallback(navigator_toggle, XmNvalueChangedCallback,
prefsApplEditCb_toggleHandledBy, this);
XtAddCallback(plugin_toggle, XmNvalueChangedCallback,
prefsApplEditCb_toggleHandledBy, this);
XtAddCallback(app_toggle, XmNvalueChangedCallback,
prefsApplEditCb_toggleHandledBy, this);
XtAddCallback(save_toggle, XmNvalueChangedCallback,
prefsApplEditCb_toggleHandledBy, this);
XtAddCallback(unknown_toggle, XmNvalueChangedCallback,
prefsApplEditCb_toggleHandledBy, this);
XtAddCallback(app_browse, XmNactivateCallback,
prefsApplEditCb_browseAppl, this);
XtAddCallback(m_chrome, XmNokCallback, prefsApplEditCb_ok, this);
XtAddCallback(m_chrome, XmNcancelCallback, prefsApplEditCb_cancel, this);
}
// Member: ~XFE_PrefsApplEditDialog
// Description: Destructor
// Inputs:
// Side effects:
XFE_PrefsApplEditDialog::~XFE_PrefsApplEditDialog()
{
// Clean up
delete m_prefsDataApplEdit;
}
// Member: show
// Description: Pop up dialog
// Inputs:
// Side effects:
void XFE_PrefsApplEditDialog::show()
{
// TODO: Initialize the dialog
// Manage the top level
XFE_Dialog::show();
// Set focus to the OK button
XmProcessTraversal(m_okButton, XmTRAVERSE_CURRENT);
}
// Member: initPage
// Description: Initializes page for MailNewsApplEdit
// Inputs:
// Side effects:
void XFE_PrefsApplEditDialog::initPage(Boolean newFlag,
int pos)
{
XP_ASSERT(m_prefsDataApplEdit);
PrefsDataApplEdit *fep = m_prefsDataApplEdit;
PrefsDataGeneralAppl *appl_data = m_prefsDataGeneralAppl;
fep->pos = pos;
fep->static_app = False;
if (newFlag) {
fep->pos = 0;
fep->cd = 0;
XtUnmanageChild(fep->static_desc_label);
}
else if (pos < xfe_prefsAppl_get_static_app_count()) {
// static applications
fep->static_app = True;
XtUnmanageChild(fep->mime_types_desc_text);
XmString xms;
xms = XmStringCreateLtoR(xfe_prefsAppl_get_static_app_desc(pos),
XmFONTLIST_DEFAULT_TAG);
XtVaSetValues(fep->static_desc_label,
XmNlabelString, xms,
0 );
XmStringFree(xms);
XtSetSensitive(fep->mime_types_text, False);
XtSetSensitive(fep->mime_types_suffix_text, False);
XtSetSensitive(fep->navigator_toggle, False);
XtSetSensitive(fep->unknown_toggle, False);
XtSetSensitive(fep->plugin_toggle, False);
XtSetSensitive(fep->save_toggle, False);
XtSetSensitive(fep->navigator_toggle, False);
XtVaSetValues(fep->app_toggle,
XmNset, True,
XmNsensitive, True,
0);
XtVaSetValues(fep->app_text, XmNsensitive, True, 0);
fe_SetTextField(fep->app_text,
xfe_prefsAppl_get_static_app_command(pos));
}
else {
/* mime types */
/* Note that fep->pos is adjusted */
XtUnmanageChild(fep->static_desc_label);
int adjusted_pos = pos - appl_data->static_apps_count;
fep->pos = adjusted_pos;
fep->cd = xfe_prefsDialogAppl_get_mime_data_at_pos(adjusted_pos);
NET_cdataStruct *cd = fep->cd;
int i;
char *extensions = 0; /* has to initialize bf. passing to StrAllocCopy() */
if ( !fep || !cd->ci.type || !*cd->ci.type ) return;
/* Found Type */
XtVaSetValues(fep->mime_types_text, XmNcursorPosition, 0, 0);
fe_SetTextField(fep->mime_types_text, cd->ci.type);
/* MIME Description */
if ( cd->ci.desc && *cd->ci.desc ) {
XtVaSetValues(fep->mime_types_desc_text, XmNcursorPosition, 0, 0 );
fe_SetTextField(fep->mime_types_desc_text, cd->ci.desc);
}
/* MIME Suffix */
for ( i = 0; i < cd->num_exts; i++ ) {
if ( i == 0 ) {
StrAllocCopy(extensions, cd->exts[i] );
}
else {
extensions = XP_AppendStr(extensions, ",");
extensions = XP_AppendStr(extensions, cd->exts[i]);
}
}
if (cd->num_exts > 0 ) {
XtVaSetValues(fep->mime_types_suffix_text, XmNcursorPosition, 0, 0);
fe_SetTextField(fep->mime_types_suffix_text, extensions);
}
/* Handle By...this mail cap */
NET_mdataStruct *md = NULL;
XtVaSetValues(fep->navigator_toggle, XmNsensitive, False, 0);
/* Netscape Type ?*/
if (xfe_prefsDialogAppl_handle_by_netscape(cd->ci.type) ){
XtVaSetValues(fep->navigator_toggle, XmNsensitive, True, 0);
}
md = xfe_prefsDialogAppl_get_mailcap_from_type(cd->ci.type);
if ( md && md->command && *md->command ){
XtVaSetValues(fep->app_text, XmNsensitive, False, 0 );
fe_SetTextField(fep->app_text, md->command);
}
if (md && md->xmode && *md->xmode){
md->xmode = fe_StringTrim(md->xmode);
if (!strcmp(md->xmode, NET_COMMAND_UNKNOWN))
XtVaSetValues(fep->unknown_toggle, XmNset, True, 0 );
else if (fe_IsMailcapEntryPlugin(md))
XtVaSetValues(fep->plugin_toggle, XmNset, True, 0 );
else if (!strcmp(md->xmode, NET_COMMAND_SAVE_TO_DISK) ||
(!strcmp(md->xmode, NET_COMMAND_SAVE_BY_NETSCAPE)))
XtVaSetValues(fep->save_toggle, XmNset, True, 0 );
else if (!strcmp(md->xmode,NET_COMMAND_NETSCAPE))
XtVaSetValues(fep->navigator_toggle, XmNset, True, 0 );
else if (!strcmp(md->xmode,NET_COMMAND_DELETED))
XtVaSetValues(fep->unknown_toggle, XmNset, True, 0 );
}
else if ( md && md->command && *md->command){
XtVaSetValues(fep->app_toggle, XmNset, True, 0 );
XtVaSetValues(fep->app_text,
XmNsensitive, True, 0 );
}
else if (xfe_prefsDialogAppl_handle_by_netscape(cd->ci.type) )
XtVaSetValues(fep->navigator_toggle, XmNset, True, 0 );
else if (xfe_prefsDialogAppl_handle_by_saveToDisk(cd->ci.type) )
XtVaSetValues(fep->save_toggle, XmNset, True, 0 );
else
XtVaSetValues(fep->unknown_toggle, XmNset, True, 0);
}
}
// Member: verifyPage
// Description: verify page for MailNewsApplEdit
// Inputs:
// Side effects:
Boolean XFE_PrefsApplEditDialog::verifyPage()
{
return TRUE;
}
// Member: installChanges
// Description: install changes for ApplEdit
// Inputs:
// Side effects:
void XFE_PrefsApplEditDialog::installChanges()
{
}
// Member: getContext
// Description: returns context
// Inputs:
// Side effects:
MWContext *XFE_PrefsApplEditDialog::getContext()
{
return (m_prefsDialog->getContext());
}
// Member: getPrefsDialog
// Description: returns preferences dialog
// Inputs:
// Side effects:
XFE_PrefsDialog *XFE_PrefsApplEditDialog::getPrefsDialog()
{
return (m_prefsDialog);
}
// Friend: prefsApplEditCb_ok
// Description:
// Inputs:
// Side effects:
void prefsApplEditCb_ok(Widget w,
XtPointer closure,
XtPointer callData)
{
XFE_PrefsApplEditDialog *theDialog = (XFE_PrefsApplEditDialog *)closure;
XFE_PrefsPageGeneralAppl *thePage = theDialog->m_prefsPageGeneralAppl;
PrefsDataApplEdit *fep = theDialog->m_prefsDataApplEdit;
PrefsDataGeneralAppl *applData = theDialog->m_prefsDataGeneralAppl;
XP_ASSERT(fep);
if (! theDialog->verifyPage()) return;
char *text = 0;
char *u = 0;
int i;
int old_pos;
NET_cdataStruct *old_cd = NULL;
NET_cdataStruct *new_cd = NULL;
NET_mdataStruct *md = NULL;
Boolean add_new_cd = False;
char *src_string =0;
int real_pos;
if (fep->static_app) {
/* Update fe_globalPrefs for static apps */
text = fe_GetTextField(fep->app_text);
if (text && *text) {
char *trimmed_text = fe_StringTrim(text);
if (XP_STRLEN(trimmed_text) > 0) {
/* Update the application command in fe_globalPrefs */
xfe_prefsAppl_set_static_app_command(fep->pos, trimmed_text);
/* Update the applications pane in prefs dialog */
char *line = 0;
line = PR_smprintf("%s|%s",
xfe_prefsAppl_get_static_app_desc(fep->pos),
trimmed_text);
XmLGridSetStringsPos(applData->helpers_list, XmCONTENT, fep->pos,
XmCONTENT, 0, line);
XP_FREEIF(line);
}
else {
FE_Alert(fep->context, XP_GetString(XFE_HELPERS_EMPTY_APP));
}
}
else {
FE_Alert(fep->context, XP_GetString(XFE_HELPERS_EMPTY_APP));
}
XP_FREEIF(text);
}
else {
/* Deal with helper apps handled by the XP */
thePage->setModified(TRUE);
/* Type is critical. If this field is empty, then basically we don't
do a thing here */
text = fe_GetTextField(fep->mime_types_text);
if ( !text ) return;
text = fe_StringTrim(text);
if ( !strlen(text)) {
FE_Alert(fep->context, XP_GetString(XFE_HELPERS_EMPTY_MIMETYPE));
XtFree(text);
return;
}
if(text) XtFree(text);
/* Empty type Business has been taken care of */
/* Do some serious stuff here now...*/
new_cd = NET_cdataCreate();
new_cd->is_local = True;
if ( fep->cd ) {
new_cd->is_external = fep->cd->is_external;
new_cd->is_modified = 1;
}
else {
new_cd->is_external = 1;
new_cd->is_modified = 1;
/* If new entry was deleted before commit, we don't want to save the info out*/
new_cd->is_new = 1; /* remember this for deletion*/
add_new_cd = True;
}
/* Description */
text = fe_GetTextField(fep->mime_types_desc_text);
if ( text && *text ) {
fe_StringTrim(text);
StrAllocCopy(new_cd->ci.desc, text);
}
if(text) XtFree(text);
/* Type */
text = fe_GetTextField(fep->mime_types_text);
if ( text && *text ){
fe_StringTrim(text);
StrAllocCopy( new_cd->ci.type, text);
}
if(text) XtFree(text);
/* Suffix */
text = fe_GetTextField(fep->mime_types_suffix_text);
u = XP_STRTOK(text, ",");
while (u) {
u = fe_StringTrim(u);
xfe_prefsDialogAppl_build_exts(u, new_cd);
u = XP_STRTOK(NULL, ",");
}
if(text) XtFree(text);
if ( (old_cd=xfe_prefsDialogAppl_can_combine (new_cd, &old_pos)) ) {
if ( ! xfe_prefsDialogAppl_is_deleted_type(old_cd) ) {
/* Only cd's that aren't deleted are displayed in the list */
/* Therefore, we need to make sure if the item is in the list */
/* in order to delete */
if ( xfe_prefsDialogAppl_get_mime_data_real_pos(old_cd, &real_pos) )
old_pos = real_pos;
if ( old_pos > fep->pos )
XmLGridDeleteRows(applData->helpers_list, XmCONTENT,
old_pos + xfe_prefsAppl_get_static_app_count(), 1);
else if (fep->pos > old_pos ) {
XmLGridDeleteRows(applData->helpers_list, XmCONTENT,
old_pos + xfe_prefsAppl_get_static_app_count(), 1);
fep->pos -= 1;
}
}
/* CanCombine=True will remove the fep->cd from the list
* Therefore, make the new one the current
* If action = add_new_cd, and can_combine = true, we should
* remove the old one
*/
if ( add_new_cd ) {
NET_cdataRemove(old_cd);
old_cd = NULL;
}
}
if ( fep->cd ) /* Then, this is not an action: NEW */ {
if ( !fep->cd->is_local && !fep->cd->is_external ) {
/* read from Global mime.type in old mime format */
/* convert it to the new format here */
src_string = xfe_prefsDialogAppl_construct_new_mime_string( new_cd );
}
else if ( !fep->cd->is_local && !fep->cd->num_exts ) {
/* This entry is added by an existing mailcap type */
src_string = xfe_prefsDialogAppl_construct_new_mime_string(new_cd);
}
else
src_string = xfe_prefsDialogAppl_replace_new_mime_string( fep->cd, new_cd );
XP_FREE(fep->cd->src_string);
fep->cd->src_string = src_string;
XP_FREE(fep->cd->ci.desc );
XP_FREE(fep->cd->ci.type );
fep->cd->ci.desc = 0;
fep->cd->ci.type = 0;
for ( i = 0; i < fep->cd->num_exts; i++ )
XP_FREE (fep->cd->exts[i]);
XP_FREE(fep->cd->exts);
fep->cd->exts = 0;
fep->cd->num_exts = 0;
fep->cd->is_external = new_cd->is_external;
fep->cd->is_modified = new_cd->is_modified;
StrAllocCopy(fep->cd->ci.desc, new_cd->ci.desc);
StrAllocCopy(fep->cd->ci.type, new_cd->ci.type);
for ( i = 0; i < new_cd->num_exts; i++ )
xfe_prefsDialogAppl_build_exts(new_cd->exts[i], fep->cd);
NET_cdataFree(new_cd);
}
else {
src_string = xfe_prefsDialogAppl_construct_new_mime_string( new_cd );
if ( new_cd->src_string) XP_FREE(new_cd->src_string);
new_cd->src_string = src_string;
fep->cd = new_cd;
}
xfe_prefsDialogAppl_build_handle(fep);
if ( add_new_cd && (fep->pos == 0)) {
fep->pos = -1;
NET_cdataAdd(fep->cd);
}
if ( ! xfe_prefsDialogAppl_is_deleted_type(fep->cd) ) {
md = xfe_prefsDialogAppl_get_mailcap_from_type(fep->cd->ci.type);
int position;
if (fep->pos == (-1)) {
/* adding this to the list.
* This is kinda tricky. We need to add this to the
* beginning of mime type list, because the backend does
* that in the background.
* at the same time, we want to insert it after the static apps
*/
position = xfe_prefsAppl_get_static_app_count();
xfe_prefsDialogAppl_insert_type_at_pos(applData, fep->cd, md, position);
}
else {
/* replacing an existing entry */
position = fep->pos + xfe_prefsAppl_get_static_app_count();
xfe_prefsDialogAppl_append_type_to_list(applData, fep->cd, md, position);
}
}
}
// Simulate a cancel
prefsApplEditCb_cancel(w, closure, callData);
// Install preferences
theDialog->installChanges();
// Save the preferences at the end, so that if we've found some setting
// that crashes, it won't get saved...
if (!XFE_SavePrefs ((char *) fe_globalData.user_prefs_file, &fe_globalPrefs))
fe_perror(theDialog->getContext(), XP_GetString( XFE_ERROR_SAVING_OPTIONS));
}
// Friend: prefsApplEditCb_cancel
// Description:
// Inputs:
// Side effects:
void prefsApplEditCb_cancel(Widget /* w */,
XtPointer closure,
XtPointer /* callData */)
{
XFE_PrefsApplEditDialog *theDialog = (XFE_PrefsApplEditDialog *)closure;
// Delete the dialog
delete theDialog;
}
// Friend: prefsApplEditCb_toggleHandledBy
// Description:
// Inputs:
// Side effects:
void prefsApplEditCb_toggleHandledBy(Widget widget,
XtPointer closure,
XtPointer callData)
{
XFE_PrefsApplEditDialog *theDialog = (XFE_PrefsApplEditDialog *)closure;
PrefsDataApplEdit *fep = theDialog->m_prefsDataApplEdit;
XmToggleButtonCallbackStruct *cb = (XmToggleButtonCallbackStruct *)callData;
if (!cb->set) {
XtVaSetValues (widget, XmNset, True, 0);
}
else if (widget == fep->navigator_toggle) {
XtVaSetValues (fep->plugin_toggle, XmNset, False, 0);
XtVaSetValues (fep->app_toggle, XmNset, False, 0);
XtVaSetValues (fep->save_toggle, XmNset, False, 0);
XtVaSetValues (fep->unknown_toggle, XmNset, False, 0);
XtVaSetValues (fep->plugin_combo, XmNsensitive, False, 0);
XtVaSetValues (fep->app_text, XmNsensitive, False, 0);
}
else if (widget == fep->plugin_toggle) {
if (fep->plugins) {
int n;
char *pluginName;
XtVaGetValues(fep->plugin_combo, XmNuserData, &n, 0);
pluginName = fep->plugins[n];
theDialog->pluginSelected(pluginName);
}
XtVaSetValues (fep->navigator_toggle, XmNset, False, 0);
XtVaSetValues (fep->app_toggle, XmNset, False, 0);
XtVaSetValues (fep->save_toggle, XmNset, False, 0);
XtVaSetValues (fep->unknown_toggle, XmNset, False, 0);
XtVaSetValues (fep->plugin_combo, XmNsensitive, True, 0);
XtVaSetValues (fep->app_text, XmNsensitive, False, 0);
}
else if (widget == fep->app_toggle) {
XtVaSetValues (fep->navigator_toggle, XmNset, False, 0);
XtVaSetValues (fep->plugin_toggle, XmNset, False, 0);
XtVaSetValues (fep->save_toggle, XmNset, False, 0);
XtVaSetValues (fep->unknown_toggle, XmNset, False, 0);
XtVaSetValues (fep->plugin_combo, XmNsensitive, False, 0);
XtVaSetValues (fep->app_text, XmNsensitive, True, 0);
}
else if (widget == fep->save_toggle) {
XtVaSetValues (fep->navigator_toggle, XmNset, False, 0);
XtVaSetValues (fep->plugin_toggle, XmNset, False, 0);
XtVaSetValues (fep->app_toggle, XmNset, False, 0);
XtVaSetValues (fep->unknown_toggle, XmNset, False, 0);
XtVaSetValues (fep->plugin_combo, XmNsensitive, False, 0);
XtVaSetValues (fep->app_text, XmNsensitive, False, 0);
}
else if (widget == fep->unknown_toggle) {
XtVaSetValues (fep->navigator_toggle, XmNset, False, 0);
XtVaSetValues (fep->plugin_toggle, XmNset, False, 0);
XtVaSetValues (fep->app_toggle, XmNset, False, 0);
XtVaSetValues (fep->save_toggle, XmNset, False, 0);
XtVaSetValues (fep->plugin_combo, XmNsensitive, False, 0);
XtVaSetValues (fep->app_text, XmNsensitive, False, 0);
}
else
abort ();
}
// Friend: prefsApplEditCb_browseAppl
// Description:
// Inputs:
// Side effects:
void prefsApplEditCb_browseAppl(Widget /* w */,
XtPointer closure,
XtPointer /* callData */)
{
XFE_PrefsApplEditDialog *theDialog = (XFE_PrefsApplEditDialog *)closure;
PrefsDataApplEdit *fep = theDialog->m_prefsDataApplEdit;
fe_browse_file_of_text(theDialog->getContext(), fep->app_text, False);
}
// Friend: prefsApplEditCb_setHandledBy
// Description:
// Inputs:
// Side effects:
void prefsApplEditCb_setHandledBy(Widget /* w */,
XtPointer closure,
XtPointer /* callData */)
{
XFE_PrefsApplEditDialog *theDialog = (XFE_PrefsApplEditDialog *)closure;
PrefsDataApplEdit *fep = theDialog->m_prefsDataApplEdit;
char *text = NULL;
Bool nav_p = False;
Bool plugin_p = False;
text = fe_GetTextField(fep->mime_types_text);
if (text && *text && xfe_prefsDialogAppl_handle_by_netscape(text)) {
XtVaSetValues(fep->navigator_toggle, XmNsensitive, True, 0);
nav_p = True;
}
else
XtVaSetValues(fep->navigator_toggle, XmNsensitive, False, 0);
if (text && *text && theDialog->handleByPlugin(text))
/* fe_helpers_handle_by_plugin() will sensitize the plugin button. */
plugin_p = True;
/* if Navigator used to handle this but cannot anymore,
* unknown takes over
*/
if (XmToggleButtonGetState(fep->navigator_toggle) && !nav_p)
XmToggleButtonSetState(fep->unknown_toggle, True, True);
/* if Plugin used to handle this but cannot anymore, unknown takes over */
if (XmToggleButtonGetState(fep->plugin_toggle) && !plugin_p)
XmToggleButtonSetState(fep->unknown_toggle, True, True);
if (text) XtFree(text);
}
void prefsApplEditCb_selectPlugin(Widget /* widget */,
XtPointer closure,
XtPointer call_data)
{
XFE_PrefsApplEditDialog *theDialog = (XFE_PrefsApplEditDialog *)closure;
PrefsDataApplEdit *fep = theDialog->m_prefsDataApplEdit;
DtComboBoxCallbackStruct *cbs = (DtComboBoxCallbackStruct *)call_data;
char *pluginName;
if (!XmToggleButtonGetState(fep->plugin_toggle)) return;
pluginName = fep->plugins[cbs->item_position];
XtVaSetValues(fep->plugin_combo, XmNuserData, cbs->item_position, 0);
theDialog->pluginSelected(pluginName);
}
// ==================== Static Member Functions ====================
// Member: buildPluginList
// Description:
// Inputs:
// Side effects:
void XFE_PrefsApplEditDialog::buildPluginList(char *mimeType)
{
int i;
char **plugins = NULL;
char *current_plugin = NULL;
NET_mdataStruct *md = NULL;
XmString xms;
PrefsDataApplEdit *fep = m_prefsDataApplEdit;
if (!fep) return;
if (mimeType && *mimeType)
plugins = NPL_FindPluginsForType(mimeType);
/* Destroy all existing children */
if (fep->plugin_combo) {
int count;
XtVaGetValues(fep->plugin_combo, XmNitemCount, &count, 0);
if (count > 0) DtComboBoxDeleteAllItems(fep->plugin_combo);
}
if (plugins && plugins[0]) {
md = xfe_prefsDialogAppl_get_mailcap_from_type(mimeType);
if (fe_IsMailcapEntryPlugin(md))
current_plugin = fe_GetPluginNameFromMailcapEntry(md);
i = 0;
while (plugins[i]) {
xms = XmStringCreateLtoR(plugins[i], XmFONTLIST_DEFAULT_TAG);
DtComboBoxAddItem(fep->plugin_combo, xms, 0, True);
/*
* Linux crashes in strcmp() if current_plugin is NULL, so
* make sure it aint
*/
if ((i == 0) || (current_plugin && (!strcmp(current_plugin, plugins[i]))))
{
DtComboBoxSelectItem(fep->plugin_combo, xms);
}
XmStringFree(xms);
i++;
}
XtVaSetValues(fep->plugin_combo, XmNsensitive, True, 0);
XtVaSetValues(fep->plugin_toggle, XmNsensitive, True, 0);
}
else {
// No plugins installed for this mime type
XmString xms;
xms = XmStringCreateLtoR(" ", XmFONTLIST_DEFAULT_TAG);
XtVaSetValues(fep->plugin_combo,
XmNlabelString, xms,
0);
XmStringFree(xms);
XtVaSetValues(fep->plugin_toggle, XmNsensitive, False, 0);
}
fep->plugins = plugins;
}
// Member: buildPluginList
// Description:
// Inputs:
// Side effects:
void XFE_PrefsApplEditDialog::pluginSelected(char *pluginName)
{
PrefsDataApplEdit *fep = m_prefsDataApplEdit;
/* Change the description and extensions to what the plugins says */
char *mimetype, *desc=NULL, *ext=NULL;
char *cur_desc=NULL, *cur_ext=NULL;
XP_Bool differ = True;
mimetype = fe_GetTextField(fep->mime_types_text);
if (fe_GetMimetypeInfoFromPlugin(pluginName, mimetype, &desc, &ext) >= 0) {
/* If either the description or the extension is different from what is
* already being displayed, ask the user whether to revert to what the
* plugin says.
*/
cur_desc = fe_GetTextField(fep->mime_types_desc_text);
cur_ext = fe_GetTextField(fep->mime_types_suffix_text);
if (desc) differ = strcmp(desc, cur_desc);
else differ = *cur_desc;
if (!differ)
if (ext) differ = strcmp(ext, cur_ext);
else differ = *cur_ext;
if (differ) {
char *buf;
buf = PR_smprintf(XP_GetString(XFE_HELPERS_PLUGIN_DESC_CHANGE),
mimetype, desc?desc:"", ext?ext:"");
if (FE_Confirm(fep->context, buf)) {
XtVaSetValues(fep->mime_types_desc_text, XmNcursorPosition, 0,
0);
fe_SetTextField(fep->mime_types_desc_text, desc);
XtVaSetValues(fep->mime_types_suffix_text, XmNcursorPosition, 0,
0);
fe_SetTextField(fep->mime_types_suffix_text, ext);
}
if (buf) XP_FREE(buf);
}
}
if (mimetype) XP_FREE(mimetype);
if (cur_desc) XP_FREE(cur_desc);
if (cur_ext) XP_FREE(cur_ext);
}
XP_Bool XFE_PrefsApplEditDialog::handleByPlugin(char *type)
{
PrefsDataApplEdit *fep = m_prefsDataApplEdit;
Bool b;
/* Create plugins options menu and sensitize the plugin option menu and
toggle button, depending on the mimetype passed in */
buildPluginList(type);
XtVaGetValues(fep->plugin_toggle, XmNsensitive, &b, 0);
return(b);
}