Dynamic charset menu for Mailview.

This commit is contained in:
cata%netscape.com 2000-05-09 07:18:49 +00:00
Родитель 2f1cec3217
Коммит ae39534206
4 изменённых файлов: 285 добавлений и 114 удалений

Просмотреть файл

@ -61,6 +61,7 @@ static const char * kURINC_BrowserMore4CharsetMenuRoot = "NC:BrowserMore4Charset
static const char * kURINC_BrowserMore5CharsetMenuRoot = "NC:BrowserMore5CharsetMenuRoot";
static const char * kURINC_BrowserMore6CharsetMenuRoot = "NC:BrowserMore6CharsetMenuRoot";
static const char * kURINC_MaileditCharsetMenuRoot = "NC:MaileditCharsetMenuRoot";
static const char * kURINC_MailviewCharsetMenuRoot = "NC:MailviewCharsetMenuRoot";
DEFINE_RDF_VOCAB(NC_NAMESPACE_URI, NC, Name);
DEFINE_RDF_VOCAB(NC_NAMESPACE_URI, NC, Checked);
DEFINE_RDF_VOCAB(NC_NAMESPACE_URI, NC, BookmarkSeparator);
@ -112,6 +113,7 @@ private:
static nsIRDFResource * kNC_BrowserMore5CharsetMenuRoot;
static nsIRDFResource * kNC_BrowserMore6CharsetMenuRoot;
static nsIRDFResource * kNC_MaileditCharsetMenuRoot;
static nsIRDFResource * kNC_MailviewCharsetMenuRoot;
static nsIRDFResource * kNC_Name;
static nsIRDFResource * kNC_Checked;
static nsIRDFResource * kNC_CharsetDetector;
@ -121,23 +123,30 @@ private:
static nsIRDFDataSource * mInner;
nsVoidArray mBrowserMenu;
nsVoidArray mMailviewMenu;
nsresult Init();
nsresult Done();
nsresult SetCharsetCheckmark(nsString * aCharset, PRBool aValue);
nsresult InitBrowserMenu();
nsresult InitBrowserStaticMenu(nsIRDFService * aRDFServ,
nsICharsetConverterManager2 * aCCMan, nsISupportsArray * aDecs);
nsresult InitBrowserChardetMenu(nsIRDFService * aRDFServ,
nsICharsetConverterManager2 * aCCMan, nsIRDFContainer * aContainer);
nsresult InitBrowserMoreXMenu(nsIRDFService * aRDFServ,
nsICharsetConverterManager2 * aCCMan, nsISupportsArray * aDecs);
nsresult InitBrowserMoreMenu(nsIRDFService * aRDFServ,
nsICharsetConverterManager2 * aCCMan, nsISupportsArray * aDecs);
nsresult InitMaileditMenu();
nsresult InitMailviewMenu();
nsresult InitStaticMenu(nsIRDFService * aRDFServ,
nsICharsetConverterManager2 * aCCMan, nsISupportsArray * aDecs,
nsIRDFResource * aResource, char * aKey, nsVoidArray * aArray);
nsresult InitChardetMenu(nsIRDFService * aRDFServ,
nsICharsetConverterManager2 * aCCMan, nsIRDFContainer * aContainer);
nsresult InitMoreMenu(nsIRDFService * aRDFServ,
nsICharsetConverterManager2 * aCCMan, nsISupportsArray * aDecs,
nsIRDFResource * aResource, char * aFlag);
nsresult AddCharsetToItemArray(nsICharsetConverterManager2 * aCCMan,
nsVoidArray * aArray, nsIAtom * aCharset, nsMenuItem ** aResult);
nsresult AddCharsetArrayToItemArray(nsICharsetConverterManager2 * aCCMan,
@ -297,6 +306,7 @@ nsIRDFResource * nsCharsetMenu::kNC_BrowserMore4CharsetMenuRoot = NULL;
nsIRDFResource * nsCharsetMenu::kNC_BrowserMore5CharsetMenuRoot = NULL;
nsIRDFResource * nsCharsetMenu::kNC_BrowserMore6CharsetMenuRoot = NULL;
nsIRDFResource * nsCharsetMenu::kNC_MaileditCharsetMenuRoot = NULL;
nsIRDFResource * nsCharsetMenu::kNC_MailviewCharsetMenuRoot = NULL;
nsIRDFResource * nsCharsetMenu::kNC_Name = NULL;
nsIRDFResource * nsCharsetMenu::kNC_Checked = NULL;
nsIRDFResource * nsCharsetMenu::kNC_CharsetDetector = NULL;
@ -309,8 +319,11 @@ nsCharsetMenu::nsCharsetMenu()
PR_AtomicIncrement(&g_InstanceCount);
Init();
// XXX create the services here and send them as params to init methods
InitBrowserMenu();
InitMaileditMenu();
InitMailviewMenu();
}
nsCharsetMenu::~nsCharsetMenu()
@ -318,6 +331,7 @@ nsCharsetMenu::~nsCharsetMenu()
Done();
FreeMenuItemArray(&mBrowserMenu);
FreeMenuItemArray(&mMailviewMenu);
PR_AtomicDecrement(&g_InstanceCount);
}
@ -341,6 +355,7 @@ nsresult nsCharsetMenu::Init()
rdfServ->GetResource(kURINC_BrowserMore5CharsetMenuRoot, &kNC_BrowserMore5CharsetMenuRoot);
rdfServ->GetResource(kURINC_BrowserMore6CharsetMenuRoot, &kNC_BrowserMore6CharsetMenuRoot);
rdfServ->GetResource(kURINC_MaileditCharsetMenuRoot, &kNC_MaileditCharsetMenuRoot);
rdfServ->GetResource(kURINC_MailviewCharsetMenuRoot, &kNC_MailviewCharsetMenuRoot);
rdfServ->GetResource(kURINC_Name, &kNC_Name);
rdfServ->GetResource(kURINC_Checked, &kNC_Checked);
rdfServ->GetResource(kURINC_CharsetDetector, &kNC_CharsetDetector);
@ -373,6 +388,8 @@ nsresult nsCharsetMenu::Init()
if (NS_FAILED(res)) goto done;
res = rdfUtil->MakeSeq(mInner, kNC_MaileditCharsetMenuRoot, NULL);
if (NS_FAILED(res)) goto done;
res = rdfUtil->MakeSeq(mInner, kNC_MailviewCharsetMenuRoot, NULL);
if (NS_FAILED(res)) goto done;
res = rdfServ->RegisterDataSource(this, PR_FALSE);
@ -408,6 +425,7 @@ done:
NS_IF_RELEASE(kNC_BrowserMore5CharsetMenuRoot);
NS_IF_RELEASE(kNC_BrowserMore6CharsetMenuRoot);
NS_IF_RELEASE(kNC_MaileditCharsetMenuRoot);
NS_IF_RELEASE(kNC_MailviewCharsetMenuRoot);
NS_IF_RELEASE(kNC_Name);
NS_IF_RELEASE(kNC_Checked);
NS_IF_RELEASE(kNC_CharsetDetector);
@ -463,81 +481,20 @@ nsresult nsCharsetMenu::InitBrowserMenu()
if (NS_FAILED(res)) return res;
// even if we fail, the show must go on
res = InitBrowserStaticMenu(rdfServ, ccMan, decs);
char * prefKey = "intl.charsetmenu.browser.static";
res = InitStaticMenu(rdfServ, ccMan, decs, kNC_BrowserCharsetMenuRoot,
prefKey, &mBrowserMenu);
NS_ASSERTION(NS_SUCCEEDED(res), "error initializing browser static charset menu");
res = InitBrowserMoreXMenu(rdfServ, ccMan, decs);
NS_ASSERTION(NS_SUCCEEDED(res), "error initializing browser static X charset menu");
res = InitBrowserMoreMenu(rdfServ, ccMan, decs);
res = InitMoreMenu(rdfServ, ccMan, decs, kNC_BrowserMoreCharsetMenuRoot, ".notForBrowser");
NS_ASSERTION(NS_SUCCEEDED(res), "error initializing browser more charset menu");
return res;
}
nsresult nsCharsetMenu::InitBrowserStaticMenu(
nsIRDFService * aRDFServ,
nsICharsetConverterManager2 * aCCMan,
nsISupportsArray * aDecs)
{
nsresult res = NS_OK;
nsCOMPtr<nsIRDFContainer> container;
res = NewRDFContainer(mInner, kNC_BrowserCharsetMenuRoot, getter_AddRefs(container));
if (NS_FAILED(res)) return res;
// XXX work around bug that causes the submenus to be first instead of last
res = AddSeparatorToContainer(aRDFServ, aCCMan, container);
NS_ASSERTION(NS_SUCCEEDED(res), "error adding separator to container");
res = InitBrowserChardetMenu(aRDFServ, aCCMan, container);
NS_ASSERTION(NS_SUCCEEDED(res), "error initializing browser chardet menu");
res = AddSeparatorToContainer(aRDFServ, aCCMan, container);
NS_ASSERTION(NS_SUCCEEDED(res), "error adding separator to container");
NS_WITH_SERVICE(nsIPref, pref, NS_PREF_PROGID, &res);
if (NS_FAILED(res)) return res;
char * prefKey = "intl.charsetmenu.browser.static";
res = AddFromPrefsToMenu(pref, aRDFServ, aCCMan, &mBrowserMenu, container, prefKey,
aDecs, "charset.");
NS_ASSERTION(NS_SUCCEEDED(res), "error initializing charset menu from prefs");
return res;
}
nsresult nsCharsetMenu::InitBrowserChardetMenu(
nsIRDFService * aRDFServ,
nsICharsetConverterManager2 * aCCMan,
nsIRDFContainer * aContainer)
{
nsresult res = NS_OK;
nsVoidArray chardetArray;
nsCOMPtr<nsISupportsArray> array;
res = aCCMan->GetCharsetDetectorList(getter_AddRefs(array));
if (NS_FAILED(res)) goto done;
res = AddCharsetArrayToItemArray(aCCMan, &chardetArray, array);
if (NS_FAILED(res)) goto done;
// reorder the array
res = ReorderMenuItemArray(&chardetArray);
if (NS_FAILED(res)) goto done;
res = AddMenuItemArrayToContainer(aRDFServ, aCCMan, aContainer,
&chardetArray, kNC_CharsetDetector);
if (NS_FAILED(res)) goto done;
done:
// free the elements in the VoidArray
FreeMenuItemArray(&chardetArray);
return res;
}
nsresult nsCharsetMenu::InitBrowserMoreXMenu(
nsIRDFService * aRDFServ,
nsICharsetConverterManager2 * aCCMan,
@ -591,42 +548,6 @@ nsresult nsCharsetMenu::InitBrowserMoreXMenu(
return res;
}
nsresult nsCharsetMenu::InitBrowserMoreMenu(
nsIRDFService * aRDFServ,
nsICharsetConverterManager2 * aCCMan,
nsISupportsArray * aDecs)
{
nsresult res = NS_OK;
nsCOMPtr<nsIRDFContainer> container;
nsVoidArray moreMenu;
nsAutoString prop; prop.AssignWithConversion(".notForBrowser");
res = NewRDFContainer(mInner, kNC_BrowserMoreCharsetMenuRoot,
getter_AddRefs(container));
if (NS_FAILED(res)) goto done;
// remove charsets "not for browser"
res = RemoveFlaggedCharsets(aDecs, aCCMan, &prop);
if (NS_FAILED(res)) goto done;
res = AddCharsetArrayToItemArray(aCCMan, &moreMenu, aDecs);
if (NS_FAILED(res)) goto done;
// reorder the array
res = ReorderMenuItemArray(&moreMenu);
if (NS_FAILED(res)) goto done;
res = AddMenuItemArrayToContainer(aRDFServ, aCCMan, container, &moreMenu,
NULL);
if (NS_FAILED(res)) goto done;
done:
// free the elements in the VoidArray
FreeMenuItemArray(&moreMenu);
return res;
}
nsresult nsCharsetMenu::InitMaileditMenu()
{
nsresult res = NS_OK;
@ -657,6 +578,131 @@ nsresult nsCharsetMenu::InitMaileditMenu()
return res;
}
nsresult nsCharsetMenu::InitMailviewMenu()
{
nsresult res = NS_OK;
NS_WITH_SERVICE(nsIRDFService, rdfServ, kRDFServiceCID, &res);
if (NS_FAILED(res)) return res;
NS_WITH_SERVICE(nsICharsetConverterManager2, ccMan, kCharsetConverterManagerCID, &res);
if (NS_FAILED(res)) return res;
nsCOMPtr<nsISupportsArray> decs;
res = ccMan->GetDecoderList(getter_AddRefs(decs));
if (NS_FAILED(res)) return res;
// even if we fail, the show must go on
char * prefKey = "intl.charsetmenu.browser.static";
res = InitStaticMenu(rdfServ, ccMan, decs, kNC_MailviewCharsetMenuRoot,
prefKey, &mMailviewMenu);
NS_ASSERTION(NS_SUCCEEDED(res), "error initializing mailview static charset menu");
return res;
}
nsresult nsCharsetMenu::InitStaticMenu(
nsIRDFService * aRDFServ,
nsICharsetConverterManager2 * aCCMan,
nsISupportsArray * aDecs,
nsIRDFResource * aResource,
char * aKey,
nsVoidArray * aArray)
{
nsresult res = NS_OK;
nsCOMPtr<nsIRDFContainer> container;
res = NewRDFContainer(mInner, aResource, getter_AddRefs(container));
if (NS_FAILED(res)) return res;
// XXX work around bug that causes the submenus to be first instead of last
res = AddSeparatorToContainer(aRDFServ, aCCMan, container);
NS_ASSERTION(NS_SUCCEEDED(res), "error adding separator to container");
res = InitChardetMenu(aRDFServ, aCCMan, container);
NS_ASSERTION(NS_SUCCEEDED(res), "error initializing chardet menu");
res = AddSeparatorToContainer(aRDFServ, aCCMan, container);
NS_ASSERTION(NS_SUCCEEDED(res), "error adding separator to container");
NS_WITH_SERVICE(nsIPref, pref, NS_PREF_PROGID, &res);
if (NS_FAILED(res)) return res;
res = AddFromPrefsToMenu(pref, aRDFServ, aCCMan, aArray, container,
aKey, aDecs, "charset.");
NS_ASSERTION(NS_SUCCEEDED(res), "error initializing charset menu from prefs");
return res;
}
nsresult nsCharsetMenu::InitChardetMenu(
nsIRDFService * aRDFServ,
nsICharsetConverterManager2 * aCCMan,
nsIRDFContainer * aContainer)
{
nsresult res = NS_OK;
nsVoidArray chardetArray;
nsCOMPtr<nsISupportsArray> array;
res = aCCMan->GetCharsetDetectorList(getter_AddRefs(array));
if (NS_FAILED(res)) goto done;
res = AddCharsetArrayToItemArray(aCCMan, &chardetArray, array);
if (NS_FAILED(res)) goto done;
// reorder the array
res = ReorderMenuItemArray(&chardetArray);
if (NS_FAILED(res)) goto done;
res = AddMenuItemArrayToContainer(aRDFServ, aCCMan, aContainer,
&chardetArray, kNC_CharsetDetector);
if (NS_FAILED(res)) goto done;
done:
// free the elements in the VoidArray
FreeMenuItemArray(&chardetArray);
return res;
}
nsresult nsCharsetMenu::InitMoreMenu(
nsIRDFService * aRDFServ,
nsICharsetConverterManager2 * aCCMan,
nsISupportsArray * aDecs,
nsIRDFResource * aResource,
char * aFlag)
{
nsresult res = NS_OK;
nsCOMPtr<nsIRDFContainer> container;
nsVoidArray moreMenu;
nsAutoString prop; prop.AssignWithConversion(aFlag);
res = NewRDFContainer(mInner, aResource, getter_AddRefs(container));
if (NS_FAILED(res)) goto done;
// remove charsets "not for browser"
res = RemoveFlaggedCharsets(aDecs, aCCMan, &prop);
if (NS_FAILED(res)) goto done;
res = AddCharsetArrayToItemArray(aCCMan, &moreMenu, aDecs);
if (NS_FAILED(res)) goto done;
// reorder the array
res = ReorderMenuItemArray(&moreMenu);
if (NS_FAILED(res)) goto done;
res = AddMenuItemArrayToContainer(aRDFServ, aCCMan, container, &moreMenu,
NULL);
if (NS_FAILED(res)) goto done;
done:
// free the elements in the VoidArray
FreeMenuItemArray(&moreMenu);
return res;
}
nsresult nsCharsetMenu::AddCharsetToItemArray(
nsICharsetConverterManager2 * aCCMan,
nsVoidArray * aArray,

Просмотреть файл

@ -20,6 +20,8 @@ Communications Corporation. Portions created by Netscape are
Rights Reserved.
-->
<?xul-overlay href="chrome://global/content/charsetOverlay.xul"?>
<!DOCTYPE window [
<!ENTITY % messengerDTD SYSTEM "chrome://messenger/locale/messenger.dtd" >
%messengerDTD;
@ -462,6 +464,7 @@ Rights Reserved.
<menuitem value="&pageSourceCmd.label;" oncommand="MsgViewPageSource();"/>
<menuitem value="&pageInfoCmd.label;" disabled="true" oncommand="MsgViewPageInfo();"/>
<menuseparator/>
<!-- Deprecated BEGIN
<menu value="&dcharMenu.label;">
<menupopup>
<menuitem value="&dcharIso1Cmd.label;" oncommand="MessengerSetDefaultCharacterSet('ISO-8859-1');"/>
@ -514,14 +517,12 @@ Rights Reserved.
<menuitem value="&dcharThaiCmd.label;" oncommand="MessengerSetDefaultCharacterSet('TIS-620');"/>
<menuseparator />
<menuitem value="&dcharArmCmd.label;" oncommand="MessengerSetDefaultCharacterSet('ARMSCII-8');"/>
<!--
<menuseparator />
<menuitem value="&dcharIso6Cmd.label;" oncommand="MessengerSetDefaultCharacterSet('ISO-8859-6');"/>
<menuitem value="&dcharCp1256Cmd.label;" oncommand="MessengerSetDefaultCharacterSet('windows-1256');"/>
<menuseparator />
<menuitem value="&dcharIso8Cmd.label;" oncommand="MessengerSetDefaultCharacterSet('ISO-8859-8');"/>
<menuitem value="&dcharCp1255Cmd.label;" oncommand="MessengerSetDefaultCharacterSet('windows-1255');"/>
-->
</menupopup>
</menu>
<menu value="&dcharMenu4.label;">
@ -544,6 +545,8 @@ Rights Reserved.
<menuitem value="&dcharWinGreekCmd.label;" oncommand="MessengerSetDefaultCharacterSet('windows-1253');"/>
</menupopup>
</menu>
END of Deprecated -->
<menu id = "mailviewCharsetMenu" />
</menupopup>
</menu>
<menu value="&searchMenu.label;">

Просмотреть файл

@ -5,7 +5,7 @@ function MultiplexHandler(event)
var charset;
if (name == 'detectorGroup') {
SelectDetector(event);
SelectDetector(event, true);
} else if (name == 'charsetGroup') {
charset = node.getAttribute('id');
charset = charset.substring('charset.'.length, charset.length)
@ -17,13 +17,32 @@ function MultiplexHandler(event)
}
}
function MailMultiplexHandler(event)
{
var node = event.target;
var name = node.getAttribute('name');
var charset;
if (name == 'detectorGroup') {
SelectDetector(event, false);
} else if (name == 'charsetGroup') {
charset = node.getAttribute('id');
charset = charset.substring('charset.'.length, charset.length)
MessengerSetDefaultCharacterSet(charset);
} else if (name == 'charsetCustomize') {
//do nothing - please remove this else statement, once the charset prefs moves to the pref window
} else {
MessengerSetDefaultCharacterSet(node.getAttribute('id'));
}
}
function SetDefaultCharacterSet(charset)
{
dump("Charset Overlay menu item pressed: " + charset + "\n");
BrowserSetDefaultCharacterSet(charset);
}
function SelectDetector(event)
function SelectDetector(event, doReload)
{
dump("Charset Detector menu item pressed: " + event.target.getAttribute('id') + "\n");
@ -41,7 +60,7 @@ function SelectDetector(event)
if (pref) {
pref.SetCharPref("intl.charset.detector", prefvalue);
window.content.location.reload();
if (doReload) window.content.location.reload();
}
}

Просмотреть файл

@ -9,8 +9,111 @@
<script language="JavaScript" src="chrome://global/content/charsetOverlay.js"/>
<!-- Mail View Charset Menu -->
<menu id="mailviewCharsetMenu" value="&charsetMenu.label;" datasources="rdf:charset-menu" ref="NC:MailviewCharsetMenuRoot" oncommand="MailMultiplexHandler(event)" oncreate="UpdateCharsetDetector()">
<template>
<rule rdf:type="http://home.netscape.com/NC-rdf#CharsetDetector">
<menupopup>
<menuitem type="radio" name="detectorGroup" checked="rdf:http://home.netscape.com/NC-rdf#Checked" uri="..." value="rdf:http://home.netscape.com/NC-rdf#Name"/>
</menupopup>
</rule>
<rule rdf:type="http://home.netscape.com/NC-rdf#BookmarkSeparator">
<menupopup>
<menuseparator uri="..." />
</menupopup>
</rule>
<rule>
<menupopup>
<menuitem type="radio" name="charsetGroup" checked="rdf:http://home.netscape.com/NC-rdf#Checked" uri="..." value="rdf:http://home.netscape.com/NC-rdf#Name"/>
</menupopup>
</rule>
</template>
<menupopup>
<menu value="&charsetMenuMore1.label;" datasources="rdf:charset-menu" ref="NC:BrowserMore1CharsetMenuRoot">
<template>
<rule>
<menupopup>
<menuitem uri="..." value="rdf:http://home.netscape.com/NC-rdf#Name"/>
</menupopup>
</rule>
</template>
<menupopup>
</menupopup>
</menu>
<menu value="&charsetMenuMore2.label;" datasources="rdf:charset-menu" ref="NC:BrowserMore2CharsetMenuRoot">
<template>
<rule>
<menupopup>
<menuitem uri="..." value="rdf:http://home.netscape.com/NC-rdf#Name"/>
</menupopup>
</rule>
</template>
<menupopup>
</menupopup>
</menu>
<menu value="&charsetMenuMore3.label;" datasources="rdf:charset-menu" ref="NC:BrowserMore3CharsetMenuRoot">
<template>
<rule>
<menupopup>
<menuitem uri="..." value="rdf:http://home.netscape.com/NC-rdf#Name"/>
</menupopup>
</rule>
</template>
<menupopup>
</menupopup>
</menu>
<menu value="&charsetMenuMore4.label;" datasources="rdf:charset-menu" ref="NC:BrowserMore4CharsetMenuRoot">
<template>
<rule>
<menupopup>
<menuitem uri="..." value="rdf:http://home.netscape.com/NC-rdf#Name"/>
</menupopup>
</rule>
</template>
<menupopup>
</menupopup>
</menu>
<menu value="&charsetMenuMore5.label;" datasources="rdf:charset-menu" ref="NC:BrowserMore5CharsetMenuRoot">
<template>
<rule>
<menupopup>
<menuitem uri="..." value="rdf:http://home.netscape.com/NC-rdf#Name"/>
</menupopup>
</rule>
</template>
<menupopup>
</menupopup>
</menu>
<menu value="&charsetMenuMore6.label;" datasources="rdf:charset-menu" ref="NC:BrowserMore6CharsetMenuRoot">
<template>
<rule>
<menupopup>
<menuitem uri="..." value="rdf:http://home.netscape.com/NC-rdf#Name"/>
</menupopup>
</rule>
</template>
<menupopup>
</menupopup>
</menu>
<menu value="&charsetMenuMore.label;" datasources="rdf:charset-menu" ref="NC:BrowserMoreCharsetMenuRoot">
<template>
<rule>
<menupopup>
<menuitem uri="..." value="rdf:http://home.netscape.com/NC-rdf#Name"/>
</menupopup>
</rule>
</template>
<menupopup>
</menupopup>
</menu>
<menuseparator />
<menuitem value="&charsetCustomize.label;" />
</menupopup>
</menu>
<!-- Mail Edit Charset Menu -->
<menu id="maileditCharsetMenu" value="&charsetMenu.label;" datasources="rdf:charset-menu" ref="NC:MaileditCharsetMenuRoot" oncommand="SetDocumentCharacterSet(event);" oncreate="InitCharsetMenuCheckMark();">
<menu id="maileditCharsetMenu" value="&charsetMenu.label;" datasources="rdf:charset-menu" ref="NC:MaileditCharsetMenuRoot" oncommand="SetDocumentCharacterSet(event);" oncreate="InitCharsetMenuCheckMark();">
<template>
<rule>
<menupopup>
@ -26,7 +129,7 @@
</menu>
<!-- Charset Menu -->
<menu id="charsetMenu" value="&charsetMenu.label;" datasources="rdf:charset-menu" ref="NC:BrowserCharsetMenuRoot" oncommand="MultiplexHandler(event)" oncreate="UpdateMenus(event)">
<menu id="charsetMenu" value="&charsetMenu.label;" datasources="rdf:charset-menu" ref="NC:BrowserCharsetMenuRoot" oncommand="MultiplexHandler(event)" oncreate="UpdateMenus(event)">
<template>
<rule rdf:type="http://home.netscape.com/NC-rdf#CharsetDetector">
<menupopup>