diff --git a/mozilla/intl/uconv/idl/nsICurrentCharsetListener.idl b/mozilla/intl/uconv/idl/nsICurrentCharsetListener.idl index 3bbeff5219a..72f37c10e1a 100644 --- a/mozilla/intl/uconv/idl/nsICurrentCharsetListener.idl +++ b/mozilla/intl/uconv/idl/nsICurrentCharsetListener.idl @@ -34,4 +34,5 @@ interface nsICurrentCharsetListener : nsISupports { void SetCurrentCharset(in wstring charset); void SetCurrentMailCharset(in wstring charset); + void SetCurrentComposerCharset(in wstring charset); }; diff --git a/mozilla/intl/uconv/src/nsCharsetMenu.cpp b/mozilla/intl/uconv/src/nsCharsetMenu.cpp index e3db8be1ef8..34ff1000d39 100644 --- a/mozilla/intl/uconv/src/nsCharsetMenu.cpp +++ b/mozilla/intl/uconv/src/nsCharsetMenu.cpp @@ -70,7 +70,7 @@ DEFINE_RDF_VOCAB(NC_NAMESPACE_URI, NC, CharsetDetector); DEFINE_RDF_VOCAB(RDF_NAMESPACE_URI, NC, type); //---------------------------------------------------------------------------- -// Class nsMenuItem [declaration] +// Class nsMenuEntry [declaration] /** * A little class holding all data needed for a menu item. @@ -78,18 +78,18 @@ DEFINE_RDF_VOCAB(RDF_NAMESPACE_URI, NC, type); * @created 18/Apr/2000 * @author Catalin Rotaru [CATA] */ -class nsMenuItem +class nsMenuEntry { public: // memory & ref counting & leak prevention stuff - nsMenuItem() { MOZ_COUNT_CTOR(nsMenuItem); } - ~nsMenuItem() { MOZ_COUNT_DTOR(nsMenuItem); } + nsMenuEntry() { MOZ_COUNT_CTOR(nsMenuEntry); } + ~nsMenuEntry() { MOZ_COUNT_DTOR(nsMenuEntry); } nsCOMPtr mCharset; nsAutoString mTitle; }; -MOZ_DECL_CTOR_COUNTER(nsMenuItem); +MOZ_DECL_CTOR_COUNTER(nsMenuEntry); //---------------------------------------------------------------------------- // Class nsCharsetMenu [declaration] @@ -129,16 +129,29 @@ private: static const char * kBrowserStaticPrefKey; static const char * kBrowserCachePrefKey; static const char * kBrowserCacheSizePrefKey; + static const char * kMailviewStaticPrefKey; + static const char * kMailviewCachePrefKey; + static const char * kMailviewCacheSizePrefKey; + static const char * kComposerStaticPrefKey; + static const char * kComposerCachePrefKey; + static const char * kComposerCacheSizePrefKey; static const char * kMaileditPrefKey; nsVoidArray mBrowserMenu; - nsVoidArray mMailviewMenu; - nsVoidArray mComposerMenu; - PRInt32 mBrowserCacheStart; PRInt32 mBrowserCacheSize; PRInt32 mBrowserMenuRDFPosition; + nsVoidArray mMailviewMenu; + PRInt32 mMailviewCacheStart; + PRInt32 mMailviewCacheSize; + PRInt32 mMailviewMenuRDFPosition; + + nsVoidArray mComposerMenu; + PRInt32 mComposerCacheStart; + PRInt32 mComposerCacheSize; + PRInt32 mComposerMenuRDFPosition; + nsresult Init(); nsresult Done(); nsresult SetCharsetCheckmark(nsString * aCharset, PRBool aValue); @@ -168,12 +181,12 @@ private: nsIRDFResource * aResource, char * aFlag); nsresult AddCharsetToItemArray(nsICharsetConverterManager2 * aCCMan, - nsVoidArray * aArray, nsIAtom * aCharset, nsMenuItem ** aResult, + nsVoidArray * aArray, nsIAtom * aCharset, nsMenuEntry ** aResult, PRInt32 aPlace); nsresult AddCharsetArrayToItemArray(nsICharsetConverterManager2 * aCCMan, nsVoidArray * aArray, nsISupportsArray * aCharsets); nsresult AddMenuItemToContainer(nsIRDFService * aRDFServ, - nsIRDFContainer * aContainer, nsMenuItem * aItem, nsIRDFResource * aType, + nsIRDFContainer * aContainer, nsMenuEntry * aItem, nsIRDFResource * aType, char * aIDPrefix, PRInt32 aPlace); nsresult AddMenuItemArrayToContainer(nsIRDFService * aRDFServ, nsIRDFContainer * aContainer, nsVoidArray * aArray, @@ -181,7 +194,7 @@ private: nsresult AddCharsetToContainer(nsIRDFService * aRDFServ, nsICharsetConverterManager2 * aCCMan, nsVoidArray * aArray, nsIRDFContainer * aContainer, nsIAtom * aCharset, char * aIDPrefix, - PRInt32 aPlace); + PRInt32 aPlace, PRInt32 aRDFPlace); nsresult AddFromPrefsToMenu(nsIPref * aPref, nsIRDFService * aRDFServ, nsICharsetConverterManager2 * aCCMan, nsVoidArray * aArray, @@ -199,7 +212,7 @@ private: nsICharsetConverterManager2 * aCCMan, nsIRDFContainer * aContainer); nsresult AddCharsetToCache(nsICharsetConverterManager2 * aCCMan, nsIAtom * aCharset, nsVoidArray * aArray, nsIRDFResource * aRDFResource, - PRInt32 aCacheStart); + PRInt32 aCacheStart, PRInt32 aCacheSize, PRInt32 aRDFPlace); nsresult WriteCacheToPrefs(nsVoidArray * aArray, PRInt32 aCacheStart, const char * aKey); @@ -214,7 +227,7 @@ private: nsIRDFResource * aResource, nsIRDFContainer ** aResult); void FreeMenuItemArray(nsVoidArray * aArray); PRInt32 FindMenuItemInArray(nsVoidArray * aArray, nsIAtom * aCharset, - nsMenuItem ** aResult); + nsMenuEntry ** aResult); nsresult ReorderMenuItemArray(nsVoidArray * aArray); nsresult GetCollation(nsICollation ** aCollation); @@ -223,12 +236,15 @@ public: virtual ~nsCharsetMenu(); nsresult RefreshBroserMenu(); + nsresult RefreshMailviewMenu(); + nsresult RefreshComposerMenu(); //-------------------------------------------------------------------------- // Interface nsICurrentCharsetListener [declaration] NS_IMETHOD SetCurrentCharset(const PRUnichar * aCharset); NS_IMETHOD SetCurrentMailCharset(const PRUnichar * aCharset); + NS_IMETHOD SetCurrentComposerCharset(const PRUnichar * aCharset); //-------------------------------------------------------------------------- // Interface nsIRDFDataSource [declaration] @@ -265,8 +281,8 @@ NS_IMETHODIMP NS_NewCharsetMenu(nsISupports * aOuter, const nsIID & aIID, static int PR_CALLBACK CompareMenuItems(const void* aArg1, const void* aArg2, void *data) { PRInt32 res; - nsMenuItem * aItem1 = *((nsMenuItem **) aArg1); - nsMenuItem * aItem2 = *((nsMenuItem **) aArg2); + nsMenuEntry * aItem1 = *((nsMenuEntry **) aArg1); + nsMenuEntry * aItem2 = *((nsMenuEntry **) aArg2); nsICollation * aCollation = (nsICollation *) data; aCollation->CompareString(kCollationCaseInSensitive, aItem1->mTitle, @@ -275,7 +291,7 @@ static int PR_CALLBACK CompareMenuItems(const void* aArg1, const void* aArg2, vo return res; } -static int PR_CALLBACK BroswerStaticChanged(const char * aPrefName, +static int PR_CALLBACK BrowserStaticChanged(const char * aPrefName, void * aInstanceData) { nsresult res; @@ -285,6 +301,26 @@ static int PR_CALLBACK BroswerStaticChanged(const char * aPrefName, return 0; } +static int PR_CALLBACK MailviewStaticChanged(const char * aPrefName, + void * aInstanceData) +{ + nsresult res; + res = ((nsCharsetMenu *) aInstanceData)->RefreshMailviewMenu(); + NS_ASSERTION(NS_SUCCEEDED(res), "error refreshing the mailview menu"); + + return 0; +} + +static int PR_CALLBACK ComposerStaticChanged(const char * aPrefName, + void * aInstanceData) +{ + nsresult res; + res = ((nsCharsetMenu *) aInstanceData)->RefreshComposerMenu(); + NS_ASSERTION(NS_SUCCEEDED(res), "error refreshing the composer menu"); + + return 0; +} + //---------------------------------------------------------------------------- // Class nsCharsetMenu [implementation] @@ -308,10 +344,22 @@ nsIRDFResource * nsCharsetMenu::kNC_CharsetDetector = NULL; nsIRDFResource * nsCharsetMenu::kNC_BookmarkSeparator = NULL; nsIRDFResource * nsCharsetMenu::kRDF_type = NULL; -const char * nsCharsetMenu::kBrowserStaticPrefKey = "intl.charsetmenu.browser.static"; -const char * nsCharsetMenu::kBrowserCachePrefKey = "intl.charsetmenu.browser.cache"; -const char * nsCharsetMenu::kBrowserCacheSizePrefKey= "intl.charsetmenu.browser.cache.size"; -const char * nsCharsetMenu::kMaileditPrefKey = "intl.charsetmenu.mailedit"; +// Note here that browser and mailview have the same static area and cache +// size but the cache itself is separate. + +const char * nsCharsetMenu::kBrowserStaticPrefKey = "intl.charsetmenu.browser.static"; +const char * nsCharsetMenu::kBrowserCachePrefKey = "intl.charsetmenu.browser.cache"; +const char * nsCharsetMenu::kBrowserCacheSizePrefKey = "intl.charsetmenu.browser.cache.size"; + +const char * nsCharsetMenu::kMailviewStaticPrefKey = "intl.charsetmenu.browser.static"; +const char * nsCharsetMenu::kMailviewCachePrefKey = "intl.charsetmenu.mailview.cache"; +const char * nsCharsetMenu::kMailviewCacheSizePrefKey = "intl.charsetmenu.browser.cache.size"; + +const char * nsCharsetMenu::kComposerStaticPrefKey = "intl.charsetmenu.browser.static"; +const char * nsCharsetMenu::kComposerCachePrefKey = "intl.charsetmenu.composer.cache"; +const char * nsCharsetMenu::kComposerCacheSizePrefKey = "intl.charsetmenu.browser.cache.size"; + +const char * nsCharsetMenu::kMaileditPrefKey = "intl.charsetmenu.mailedit"; nsCharsetMenu::nsCharsetMenu() { @@ -338,6 +386,8 @@ nsCharsetMenu::~nsCharsetMenu() PR_AtomicDecrement(&g_InstanceCount); } +// XXX collapse these 2 in one + nsresult nsCharsetMenu::RefreshBroserMenu() { nsresult res = NS_OK; @@ -378,6 +428,86 @@ nsresult nsCharsetMenu::RefreshBroserMenu() return res; } +nsresult nsCharsetMenu::RefreshMailviewMenu() +{ + nsresult res = NS_OK; + + NS_WITH_SERVICE(nsIRDFService, rdfServ, kRDFServiceCID, &res); + if (NS_FAILED(res)) return res; + + nsCOMPtr container; + res = NewRDFContainer(mInner, kNC_MailviewCharsetMenuRoot, getter_AddRefs(container)); + if (NS_FAILED(res)) return res; + + // clean the menu + res = ClearMenu(rdfServ, container, &mMailviewMenu); + if (NS_FAILED(res)) return res; + + // rebuild the menu + NS_WITH_SERVICE(nsICharsetConverterManager2, ccMan, kCharsetConverterManagerCID, &res); + if (NS_FAILED(res)) return res; + + nsCOMPtr decs; + res = ccMan->GetDecoderList(getter_AddRefs(decs)); + if (NS_FAILED(res)) return res; + + NS_WITH_SERVICE(nsIPref, pref, NS_PREF_PROGID, &res); + if (NS_FAILED(res)) return res; + + res = AddFromPrefsToMenu(pref, rdfServ, ccMan, &mMailviewMenu, container, + kMailviewStaticPrefKey, decs, "charset."); + NS_ASSERTION(NS_SUCCEEDED(res), "error initializing static charset menu from prefs"); + + // mark the end of the static area, the rest is cache + mMailviewCacheStart = mMailviewMenu.Count(); + + res = InitCacheMenu(rdfServ, ccMan, pref, decs, kNC_MailviewCharsetMenuRoot, + kMailviewCachePrefKey, &mMailviewMenu); + NS_ASSERTION(NS_SUCCEEDED(res), "error initializing mailview cache charset menu"); + + return res; +} + +nsresult nsCharsetMenu::RefreshComposerMenu() +{ + nsresult res = NS_OK; + + NS_WITH_SERVICE(nsIRDFService, rdfServ, kRDFServiceCID, &res); + if (NS_FAILED(res)) return res; + + nsCOMPtr container; + res = NewRDFContainer(mInner, kNC_ComposerCharsetMenuRoot, getter_AddRefs(container)); + if (NS_FAILED(res)) return res; + + // clean the menu + res = ClearMenu(rdfServ, container, &mComposerMenu); + if (NS_FAILED(res)) return res; + + // rebuild the menu + NS_WITH_SERVICE(nsICharsetConverterManager2, ccMan, kCharsetConverterManagerCID, &res); + if (NS_FAILED(res)) return res; + + nsCOMPtr decs; + res = ccMan->GetDecoderList(getter_AddRefs(decs)); + if (NS_FAILED(res)) return res; + + NS_WITH_SERVICE(nsIPref, pref, NS_PREF_PROGID, &res); + if (NS_FAILED(res)) return res; + + res = AddFromPrefsToMenu(pref, rdfServ, ccMan, &mComposerMenu, container, + kComposerStaticPrefKey, decs, "charset."); + NS_ASSERTION(NS_SUCCEEDED(res), "error initializing static charset menu from prefs"); + + // mark the end of the static area, the rest is cache + mComposerCacheStart = mComposerMenu.Count(); + + res = InitCacheMenu(rdfServ, ccMan, pref, decs, kNC_ComposerCharsetMenuRoot, + kComposerCachePrefKey, &mComposerMenu); + NS_ASSERTION(NS_SUCCEEDED(res), "error initializing composer cache charset menu"); + + return res; +} + nsresult nsCharsetMenu::Init() { nsresult res = NS_OK; @@ -512,6 +642,8 @@ nsresult nsCharsetMenu::SetCharsetCheckmark(nsString * aCharset, return res; } +// XXX collapse these initAAAMenu()'s in one + nsresult nsCharsetMenu::InitBrowserMenu() { nsresult res = NS_OK; @@ -560,7 +692,7 @@ nsresult nsCharsetMenu::InitBrowserMenu() NS_ASSERTION(NS_SUCCEEDED(res), "error initializing browser more charset menu"); // register prefs callback - pref->RegisterCallback(kBrowserStaticPrefKey, BroswerStaticChanged, this); + pref->RegisterCallback(kBrowserStaticPrefKey, BrowserStaticChanged, this); return res; } @@ -657,18 +789,40 @@ nsresult nsCharsetMenu::InitMailviewMenu() NS_WITH_SERVICE(nsICharsetConverterManager2, ccMan, kCharsetConverterManagerCID, &res); if (NS_FAILED(res)) return res; - NS_WITH_SERVICE(nsIPref, pref, NS_PREF_PROGID, &res); - if (NS_FAILED(res)) return res; - nsCOMPtr decs; res = ccMan->GetDecoderList(getter_AddRefs(decs)); if (NS_FAILED(res)) return res; + NS_WITH_SERVICE(nsIPref, pref, NS_PREF_PROGID, &res); + if (NS_FAILED(res)) return res; + + nsCOMPtr container; + res = NewRDFContainer(mInner, kNC_MailviewCharsetMenuRoot, getter_AddRefs(container)); + if (NS_FAILED(res)) return res; + // even if we fail, the show must go on res = InitStaticMenu(rdfServ, ccMan, pref, decs, - kNC_MailviewCharsetMenuRoot, kBrowserStaticPrefKey, &mMailviewMenu); + kNC_MailviewCharsetMenuRoot, kMailviewStaticPrefKey, &mMailviewMenu); NS_ASSERTION(NS_SUCCEEDED(res), "error initializing mailview static charset menu"); + // mark the end of the static area, the rest is cache + mMailviewCacheStart = mMailviewMenu.Count(); + pref->GetIntPref(kMailviewCacheSizePrefKey, &mMailviewCacheSize); + + // compute the position of the menu in the RDF container + res = container->GetCount(&mMailviewMenuRDFPosition); + if (NS_FAILED(res)) return res; + // this "1" here is a correction necessary because the RDF container + // elements are numbered from 1 (why god, WHY?!?!?!) + mMailviewMenuRDFPosition -= mMailviewCacheStart - 1; + + res = InitCacheMenu(rdfServ, ccMan, pref, decs, kNC_MailviewCharsetMenuRoot, + kMailviewCachePrefKey, &mMailviewMenu); + NS_ASSERTION(NS_SUCCEEDED(res), "error initializing mailview cache charset menu"); + + // register prefs callback + pref->RegisterCallback(kMailviewStaticPrefKey, MailviewStaticChanged, this); + return res; } @@ -682,18 +836,40 @@ nsresult nsCharsetMenu::InitComposerMenu() NS_WITH_SERVICE(nsICharsetConverterManager2, ccMan, kCharsetConverterManagerCID, &res); if (NS_FAILED(res)) return res; - NS_WITH_SERVICE(nsIPref, pref, NS_PREF_PROGID, &res); - if (NS_FAILED(res)) return res; - nsCOMPtr decs; res = ccMan->GetDecoderList(getter_AddRefs(decs)); if (NS_FAILED(res)) return res; + NS_WITH_SERVICE(nsIPref, pref, NS_PREF_PROGID, &res); + if (NS_FAILED(res)) return res; + + nsCOMPtr container; + res = NewRDFContainer(mInner, kNC_ComposerCharsetMenuRoot, getter_AddRefs(container)); + if (NS_FAILED(res)) return res; + // even if we fail, the show must go on - res = InitStaticMenu(rdfServ, ccMan, pref, decs, kNC_ComposerCharsetMenuRoot, - kBrowserStaticPrefKey, &mComposerMenu); + res = InitStaticMenu(rdfServ, ccMan, pref, decs, + kNC_ComposerCharsetMenuRoot, kComposerStaticPrefKey, &mComposerMenu); NS_ASSERTION(NS_SUCCEEDED(res), "error initializing composer static charset menu"); + // mark the end of the static area, the rest is cache + mComposerCacheStart = mComposerMenu.Count(); + pref->GetIntPref(kComposerCacheSizePrefKey, &mComposerCacheSize); + + // compute the position of the menu in the RDF container + res = container->GetCount(&mComposerMenuRDFPosition); + if (NS_FAILED(res)) return res; + // this "1" here is a correction necessary because the RDF container + // elements are numbered from 1 (why god, WHY?!?!?!) + mComposerMenuRDFPosition -= mComposerCacheStart - 1; + + res = InitCacheMenu(rdfServ, ccMan, pref, decs, kNC_ComposerCharsetMenuRoot, + kComposerCachePrefKey, &mComposerMenu); + NS_ASSERTION(NS_SUCCEEDED(res), "error initializing composer cache charset menu"); + + // register prefs callback + pref->RegisterCallback(kComposerStaticPrefKey, ComposerStaticChanged, this); + return res; } @@ -822,15 +998,15 @@ nsresult nsCharsetMenu::AddCharsetToItemArray( nsICharsetConverterManager2 * aCCMan, nsVoidArray * aArray, nsIAtom * aCharset, - nsMenuItem ** aResult, + nsMenuEntry ** aResult, PRInt32 aPlace) { nsresult res = NS_OK; - nsMenuItem * item = NULL; + nsMenuEntry * item = NULL; if (aResult != NULL) *aResult = NULL; - item = new nsMenuItem(); + item = new nsMenuEntry(); if (item == NULL) { res = NS_ERROR_OUT_OF_MEMORY; goto done; @@ -891,7 +1067,7 @@ nsresult nsCharsetMenu::AddCharsetArrayToItemArray( nsresult nsCharsetMenu::AddMenuItemToContainer( nsIRDFService * aRDFServ, nsIRDFContainer * aContainer, - nsMenuItem * aItem, + nsMenuEntry * aItem, nsIRDFResource * aType, char * aIDPrefix, PRInt32 aPlace) @@ -946,8 +1122,7 @@ nsresult nsCharsetMenu::AddMenuItemToContainer( res = aContainer->AppendElement(node); if (NS_FAILED(res)) return res; } else { - res = aContainer->InsertElementAt(node, mBrowserMenuRDFPosition + aPlace, - PR_TRUE); + res = aContainer->InsertElementAt(node, aPlace, PR_TRUE); if (NS_FAILED(res)) return res; } @@ -964,7 +1139,7 @@ nsresult nsCharsetMenu::AddMenuItemArrayToContainer( nsresult res = NS_OK; for (PRUint32 i = 0; i < count; i++) { - nsMenuItem * item = (nsMenuItem *) aArray->ElementAt(i); + nsMenuEntry * item = (nsMenuEntry *) aArray->ElementAt(i); if (item == NULL) return NS_ERROR_UNEXPECTED; res = AddMenuItemToContainer(aRDFServ, aContainer, item, aType, NULL, -1); @@ -981,16 +1156,17 @@ nsresult nsCharsetMenu::AddCharsetToContainer( nsIRDFContainer * aContainer, nsIAtom * aCharset, char * aIDPrefix, - PRInt32 aPlace) + PRInt32 aPlace, + PRInt32 aRDFPlace) { nsresult res = NS_OK; - nsMenuItem * item = NULL; + nsMenuEntry * item = NULL; res = AddCharsetToItemArray(aCCMan, aArray, aCharset, &item, aPlace); if (NS_FAILED(res)) goto done; res = AddMenuItemToContainer(aRDFServ, aContainer, item, NULL, aIDPrefix, - aPlace); + aPlace + aRDFPlace); if (NS_FAILED(res)) goto done; // if we have made another reference to "item", do not delete it @@ -1081,7 +1257,7 @@ nsresult nsCharsetMenu::AddFromStringToMenu( // else, add it to the menu res = AddCharsetToContainer(aRDFServ, aCCMan, aArray, aContainer, atom, - aIDPrefix, -1); + aIDPrefix, -1, 0); NS_ASSERTION(NS_SUCCEEDED(res), "cannot add charset to menu"); if (NS_FAILED(res)) break; @@ -1110,7 +1286,7 @@ nsresult nsCharsetMenu::AddSeparatorToContainer( u++; str.AppendInt(u); - nsMenuItem item; + nsMenuEntry item; item.mCharset = getter_AddRefs(NS_NewAtom(str)); item.mTitle.Assign(str); @@ -1123,7 +1299,9 @@ nsresult nsCharsetMenu::AddCharsetToCache( nsIAtom * aCharset, nsVoidArray * aArray, nsIRDFResource * aRDFResource, - PRInt32 aCacheStart) + PRInt32 aCacheStart, + PRInt32 aCacheSize, + PRInt32 aRDFPlace) { PRInt32 i; nsresult res = NS_OK; @@ -1139,13 +1317,13 @@ nsresult nsCharsetMenu::AddCharsetToCache( if (NS_FAILED(res)) return res; // iff too many items, remove last one - if (aArray->Count() - aCacheStart >= mBrowserCacheSize){ + if (aArray->Count() - aCacheStart >= aCacheSize){ res = RemoveLastMenuItem(rdfServ, container, aArray); if (NS_FAILED(res)) return res; } res = AddCharsetToContainer(rdfServ, aCCMan, aArray, container, aCharset, - "charset.", mBrowserCacheStart); + "charset.", aCacheStart, aRDFPlace); return res; } @@ -1165,7 +1343,7 @@ nsresult nsCharsetMenu::WriteCacheToPrefs(nsVoidArray * aArray, PRInt32 count = aArray->Count(); for (PRInt32 i = aCacheStart; i < count; i++) { - nsMenuItem * item = (nsMenuItem *) aArray->ElementAt(i); + nsMenuEntry * item = (nsMenuEntry *) aArray->ElementAt(i); if (item != NULL) { nsAutoString cs; res = item->mCharset->ToString(cs); @@ -1193,7 +1371,7 @@ nsresult nsCharsetMenu::ClearMenu(nsIRDFService * aRDFServ, // clean the RDF data source PRInt32 count = aArray->Count(); for (PRInt32 i = 0; i < count; i++) { - nsMenuItem * item = (nsMenuItem *) aArray->ElementAt(i); + nsMenuEntry * item = (nsMenuEntry *) aArray->ElementAt(i); if (item != NULL) { res = AddMenuItemToContainer(aRDFServ, aContainer, item, NULL, "charset.", -2); @@ -1202,7 +1380,7 @@ nsresult nsCharsetMenu::ClearMenu(nsIRDFService * aRDFServ, } // clean the internal data structures - FreeMenuItemArray(&mBrowserMenu); + FreeMenuItemArray(aArray); return res; } @@ -1214,7 +1392,7 @@ nsresult nsCharsetMenu::RemoveLastMenuItem(nsIRDFService * aRDFServ, nsresult res = NS_OK; PRInt32 last = aArray->Count() - 1; - nsMenuItem * item = (nsMenuItem *) aArray->ElementAt(last); + nsMenuEntry * item = (nsMenuEntry *) aArray->ElementAt(last); if (item != NULL) { res = AddMenuItemToContainer(aRDFServ, aContainer, item, NULL, "charset.", -2); @@ -1277,7 +1455,7 @@ void nsCharsetMenu::FreeMenuItemArray(nsVoidArray * aArray) { PRUint32 count = aArray->Count(); for (PRUint32 i = 0; i < count; i++) { - nsMenuItem * item = (nsMenuItem *) aArray->ElementAt(i); + nsMenuEntry * item = (nsMenuEntry *) aArray->ElementAt(i); if (item != NULL) { delete item; } @@ -1287,12 +1465,12 @@ void nsCharsetMenu::FreeMenuItemArray(nsVoidArray * aArray) PRInt32 nsCharsetMenu::FindMenuItemInArray(nsVoidArray * aArray, nsIAtom * aCharset, - nsMenuItem ** aResult) + nsMenuEntry ** aResult) { PRUint32 count = aArray->Count(); for (PRUint32 i=0; i < count; i++) { - nsMenuItem * item = (nsMenuItem *) aArray->ElementAt(i); + nsMenuEntry * item = (nsMenuEntry *) aArray->ElementAt(i); if ((item->mCharset).get() == aCharset) { if (aResult != NULL) *aResult = item; return i; @@ -1311,14 +1489,14 @@ nsresult nsCharsetMenu::ReorderMenuItemArray(nsVoidArray * aArray) PRUint32 i; // we need to use a temporary array - nsMenuItem ** array = new nsMenuItem * [count]; + nsMenuEntry ** array = new nsMenuEntry * [count]; if (array == NULL) { res = NS_ERROR_OUT_OF_MEMORY; goto done; } for (i = 0; i < count; i++) { - array[i] = (nsMenuItem *)aArray->ElementAt(i); + array[i] = (nsMenuEntry *)aArray->ElementAt(i); } // reorder the array @@ -1373,7 +1551,8 @@ NS_IMETHODIMP nsCharsetMenu::SetCurrentCharset(const PRUnichar * aCharset) if (NS_FAILED(res)) return res; res = AddCharsetToCache(ccMan, atom, &mBrowserMenu, - kNC_BrowserCharsetMenuRoot, mBrowserCacheStart); + kNC_BrowserCharsetMenuRoot, mBrowserCacheStart, mBrowserCacheSize, + mBrowserMenuRDFPosition); if (NS_FAILED(res)) return res; // XXX maybe we should write out this string only when the application is @@ -1394,8 +1573,35 @@ NS_IMETHODIMP nsCharsetMenu::SetCurrentMailCharset(const PRUnichar * aCharset) res = ccMan->GetCharsetAtom(aCharset, getter_AddRefs(atom)); if (NS_FAILED(res)) return res; - return AddCharsetToCache(ccMan, atom, &mMailviewMenu, - kNC_MailviewCharsetMenuRoot, mBrowserCacheStart); + res = AddCharsetToCache(ccMan, atom, &mMailviewMenu, + kNC_MailviewCharsetMenuRoot, mMailviewCacheStart, mMailviewCacheSize, + mMailviewMenuRDFPosition); + if (NS_FAILED(res)) return res; + + res = WriteCacheToPrefs(&mMailviewMenu, mMailviewCacheStart, + kMailviewCachePrefKey); + return res; +} + +NS_IMETHODIMP nsCharsetMenu::SetCurrentComposerCharset(const PRUnichar * aCharset) +{ + nsresult res; + + NS_WITH_SERVICE(nsICharsetConverterManager2, ccMan, kCharsetConverterManagerCID, &res); + if (NS_FAILED(res)) return res; + + nsCOMPtr atom; + res = ccMan->GetCharsetAtom(aCharset, getter_AddRefs(atom)); + if (NS_FAILED(res)) return res; + + res = AddCharsetToCache(ccMan, atom, &mComposerMenu, + kNC_ComposerCharsetMenuRoot, mComposerCacheStart, mComposerCacheSize, + mComposerMenuRDFPosition); + if (NS_FAILED(res)) return res; + + res = WriteCacheToPrefs(&mComposerMenu, mComposerCacheStart, + kComposerCachePrefKey); + return res; } //---------------------------------------------------------------------------- diff --git a/mozilla/modules/libpref/src/init/all.js b/mozilla/modules/libpref/src/init/all.js index 14d640c4dce..59dc68fe686 100644 --- a/mozilla/modules/libpref/src/init/all.js +++ b/mozilla/modules/libpref/src/init/all.js @@ -334,6 +334,8 @@ pref("intl.collationKeyAsCodePoint", false); pref("intl.charsetmenu.browser.static", "chrome://navigator/locale/navigator.properties"); pref("intl.charsetmenu.mailedit", "chrome://navigator/locale/navigator.properties"); pref("intl.charsetmenu.browser.cache", ""); +pref("intl.charsetmenu.mailview.cache", ""); +pref("intl.charsetmenu.composer.cache", ""); pref("intl.charsetmenu.browser.cache.size", 5); pref("intl.charset.detector", "chrome://navigator/locale/navigator.properties"); pref("intl.charset.default", "chrome://navigator/locale/navigator.properties"); diff --git a/mozilla/xpfe/global/resources/content/charsetOverlay.xul b/mozilla/xpfe/global/resources/content/charsetOverlay.xul index 5b4bb6bea8a..fc04b8a3ba4 100644 --- a/mozilla/xpfe/global/resources/content/charsetOverlay.xul +++ b/mozilla/xpfe/global/resources/content/charsetOverlay.xul @@ -108,7 +108,7 @@ - + @@ -211,7 +211,7 @@ - +