зеркало из https://github.com/mozilla/gecko-dev.git
Added spellchecker support for different dictionaries/languages:
mozilla\editor\base\nsEditorShell.cpp mozilla\editor\idl\nsIEditorSpellCheck.idl mozilla\editor\txtsvc\public\nsISpellChecker.h - Added GetDictionaryList() and Get/SetCurrentDictionary() methods. mozilla\editor\ui\dialogs\content\EdDialogCommon.js - Added AppendValueAndDataToMenulist() function. mozilla\editor\ui\dialogs\content\EdSpellCheck.xul - We now import strres.js. mozilla\editor\ui\dialogs\content\EdSpellCheck.js - Added InitLanguageMenu().
This commit is contained in:
Родитель
fdced22104
Коммит
9a62a21851
|
@ -244,10 +244,12 @@ GetTreeOwner(nsIDocShell* aDocShell, nsIBaseWindow** aBaseWindow)
|
||||||
/////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
nsEditorShell::nsEditorShell()
|
nsEditorShell::nsEditorShell()
|
||||||
: mParserObserver(nsnull)
|
: mMailCompose(0)
|
||||||
, mStateMaintainer(nsnull)
|
, mDisplayMode(eDisplayModeNormal)
|
||||||
, mWebShellWindow(nsnull)
|
, mWebShellWindow(nsnull)
|
||||||
, mContentWindow(nsnull)
|
, mContentWindow(nsnull)
|
||||||
|
, mParserObserver(nsnull)
|
||||||
|
, mStateMaintainer(nsnull)
|
||||||
, mEditorController(nsnull)
|
, mEditorController(nsnull)
|
||||||
, mDocShell(nsnull)
|
, mDocShell(nsnull)
|
||||||
, mContentAreaDocShell(nsnull)
|
, mContentAreaDocShell(nsnull)
|
||||||
|
@ -256,8 +258,6 @@ nsEditorShell::nsEditorShell()
|
||||||
, mWrapColumn(0)
|
, mWrapColumn(0)
|
||||||
, mSuggestedWordIndex(0)
|
, mSuggestedWordIndex(0)
|
||||||
, mDictionaryIndex(0)
|
, mDictionaryIndex(0)
|
||||||
, mDisplayMode(eDisplayModeNormal)
|
|
||||||
, mMailCompose(0)
|
|
||||||
{
|
{
|
||||||
//TODO:Save last-used display mode in prefs so new window inherits?
|
//TODO:Save last-used display mode in prefs so new window inherits?
|
||||||
NS_INIT_REFCNT();
|
NS_INIT_REFCNT();
|
||||||
|
@ -4200,6 +4200,108 @@ nsEditorShell::RemoveWordFromDictionary(const PRUnichar *aWord)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsEditorShell::GetDictionaryList(PRUnichar ***aDictionaryList, PRUint32 *aCount)
|
||||||
|
{
|
||||||
|
nsresult result = NS_ERROR_NOT_IMPLEMENTED;
|
||||||
|
|
||||||
|
if (!aDictionaryList || !aCount)
|
||||||
|
return NS_ERROR_NULL_POINTER;
|
||||||
|
|
||||||
|
*aDictionaryList = 0;
|
||||||
|
*aCount = 0;
|
||||||
|
|
||||||
|
if (mEditor && mSpellChecker)
|
||||||
|
{
|
||||||
|
nsStringArray dictList;
|
||||||
|
|
||||||
|
result = mSpellChecker->GetDictionaryList(&dictList);
|
||||||
|
|
||||||
|
if (NS_FAILED(result))
|
||||||
|
return result;
|
||||||
|
|
||||||
|
PRUnichar **tmpPtr = 0;
|
||||||
|
|
||||||
|
if (dictList.Count() < 1)
|
||||||
|
{
|
||||||
|
// If there are no dictionaries, return an array containing
|
||||||
|
// one element and a count of one.
|
||||||
|
|
||||||
|
tmpPtr = (PRUnichar **)nsAllocator::Alloc(sizeof(PRUnichar *));
|
||||||
|
|
||||||
|
if (!tmpPtr)
|
||||||
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
|
|
||||||
|
*tmpPtr = 0;
|
||||||
|
*aDictionaryList = tmpPtr;
|
||||||
|
*aCount = 0;
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
tmpPtr = (PRUnichar **)nsAllocator::Alloc(sizeof(PRUnichar *) * dictList.Count());
|
||||||
|
|
||||||
|
if (!tmpPtr)
|
||||||
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
|
|
||||||
|
*aDictionaryList = tmpPtr;
|
||||||
|
*aCount = dictList.Count();
|
||||||
|
|
||||||
|
nsAutoString dictStr;
|
||||||
|
|
||||||
|
PRUint32 i;
|
||||||
|
|
||||||
|
for (i = 0; i < *aCount; i++)
|
||||||
|
{
|
||||||
|
dictList.StringAt(i, dictStr);
|
||||||
|
tmpPtr[i] = dictStr.ToNewUnicode();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsEditorShell::GetCurrentDictionary(PRUnichar **aDictionary)
|
||||||
|
{
|
||||||
|
nsresult result = NS_ERROR_NOT_INITIALIZED;
|
||||||
|
|
||||||
|
if (!aDictionary)
|
||||||
|
return NS_ERROR_NULL_POINTER;
|
||||||
|
|
||||||
|
*aDictionary = 0;
|
||||||
|
|
||||||
|
if (mEditor && mSpellChecker)
|
||||||
|
{
|
||||||
|
nsAutoString dictStr;
|
||||||
|
result = mSpellChecker->GetCurrentDictionary(&dictStr);
|
||||||
|
|
||||||
|
if (NS_FAILED(result))
|
||||||
|
return result;
|
||||||
|
|
||||||
|
*aDictionary = dictStr.ToNewUnicode();
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsEditorShell::SetCurrentDictionary(const PRUnichar *aDictionary)
|
||||||
|
{
|
||||||
|
nsresult result = NS_ERROR_NOT_INITIALIZED;
|
||||||
|
|
||||||
|
if (!aDictionary)
|
||||||
|
return NS_ERROR_NULL_POINTER;
|
||||||
|
|
||||||
|
if (mEditor && mSpellChecker)
|
||||||
|
{
|
||||||
|
nsAutoString dictStr(aDictionary);
|
||||||
|
result = mSpellChecker->SetCurrentDictionary(&dictStr);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsEditorShell::CloseSpellChecking()
|
nsEditorShell::CloseSpellChecking()
|
||||||
{
|
{
|
||||||
|
|
|
@ -244,10 +244,12 @@ GetTreeOwner(nsIDocShell* aDocShell, nsIBaseWindow** aBaseWindow)
|
||||||
/////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
nsEditorShell::nsEditorShell()
|
nsEditorShell::nsEditorShell()
|
||||||
: mParserObserver(nsnull)
|
: mMailCompose(0)
|
||||||
, mStateMaintainer(nsnull)
|
, mDisplayMode(eDisplayModeNormal)
|
||||||
, mWebShellWindow(nsnull)
|
, mWebShellWindow(nsnull)
|
||||||
, mContentWindow(nsnull)
|
, mContentWindow(nsnull)
|
||||||
|
, mParserObserver(nsnull)
|
||||||
|
, mStateMaintainer(nsnull)
|
||||||
, mEditorController(nsnull)
|
, mEditorController(nsnull)
|
||||||
, mDocShell(nsnull)
|
, mDocShell(nsnull)
|
||||||
, mContentAreaDocShell(nsnull)
|
, mContentAreaDocShell(nsnull)
|
||||||
|
@ -256,8 +258,6 @@ nsEditorShell::nsEditorShell()
|
||||||
, mWrapColumn(0)
|
, mWrapColumn(0)
|
||||||
, mSuggestedWordIndex(0)
|
, mSuggestedWordIndex(0)
|
||||||
, mDictionaryIndex(0)
|
, mDictionaryIndex(0)
|
||||||
, mDisplayMode(eDisplayModeNormal)
|
|
||||||
, mMailCompose(0)
|
|
||||||
{
|
{
|
||||||
//TODO:Save last-used display mode in prefs so new window inherits?
|
//TODO:Save last-used display mode in prefs so new window inherits?
|
||||||
NS_INIT_REFCNT();
|
NS_INIT_REFCNT();
|
||||||
|
@ -4200,6 +4200,108 @@ nsEditorShell::RemoveWordFromDictionary(const PRUnichar *aWord)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsEditorShell::GetDictionaryList(PRUnichar ***aDictionaryList, PRUint32 *aCount)
|
||||||
|
{
|
||||||
|
nsresult result = NS_ERROR_NOT_IMPLEMENTED;
|
||||||
|
|
||||||
|
if (!aDictionaryList || !aCount)
|
||||||
|
return NS_ERROR_NULL_POINTER;
|
||||||
|
|
||||||
|
*aDictionaryList = 0;
|
||||||
|
*aCount = 0;
|
||||||
|
|
||||||
|
if (mEditor && mSpellChecker)
|
||||||
|
{
|
||||||
|
nsStringArray dictList;
|
||||||
|
|
||||||
|
result = mSpellChecker->GetDictionaryList(&dictList);
|
||||||
|
|
||||||
|
if (NS_FAILED(result))
|
||||||
|
return result;
|
||||||
|
|
||||||
|
PRUnichar **tmpPtr = 0;
|
||||||
|
|
||||||
|
if (dictList.Count() < 1)
|
||||||
|
{
|
||||||
|
// If there are no dictionaries, return an array containing
|
||||||
|
// one element and a count of one.
|
||||||
|
|
||||||
|
tmpPtr = (PRUnichar **)nsAllocator::Alloc(sizeof(PRUnichar *));
|
||||||
|
|
||||||
|
if (!tmpPtr)
|
||||||
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
|
|
||||||
|
*tmpPtr = 0;
|
||||||
|
*aDictionaryList = tmpPtr;
|
||||||
|
*aCount = 0;
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
tmpPtr = (PRUnichar **)nsAllocator::Alloc(sizeof(PRUnichar *) * dictList.Count());
|
||||||
|
|
||||||
|
if (!tmpPtr)
|
||||||
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
|
|
||||||
|
*aDictionaryList = tmpPtr;
|
||||||
|
*aCount = dictList.Count();
|
||||||
|
|
||||||
|
nsAutoString dictStr;
|
||||||
|
|
||||||
|
PRUint32 i;
|
||||||
|
|
||||||
|
for (i = 0; i < *aCount; i++)
|
||||||
|
{
|
||||||
|
dictList.StringAt(i, dictStr);
|
||||||
|
tmpPtr[i] = dictStr.ToNewUnicode();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsEditorShell::GetCurrentDictionary(PRUnichar **aDictionary)
|
||||||
|
{
|
||||||
|
nsresult result = NS_ERROR_NOT_INITIALIZED;
|
||||||
|
|
||||||
|
if (!aDictionary)
|
||||||
|
return NS_ERROR_NULL_POINTER;
|
||||||
|
|
||||||
|
*aDictionary = 0;
|
||||||
|
|
||||||
|
if (mEditor && mSpellChecker)
|
||||||
|
{
|
||||||
|
nsAutoString dictStr;
|
||||||
|
result = mSpellChecker->GetCurrentDictionary(&dictStr);
|
||||||
|
|
||||||
|
if (NS_FAILED(result))
|
||||||
|
return result;
|
||||||
|
|
||||||
|
*aDictionary = dictStr.ToNewUnicode();
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsEditorShell::SetCurrentDictionary(const PRUnichar *aDictionary)
|
||||||
|
{
|
||||||
|
nsresult result = NS_ERROR_NOT_INITIALIZED;
|
||||||
|
|
||||||
|
if (!aDictionary)
|
||||||
|
return NS_ERROR_NULL_POINTER;
|
||||||
|
|
||||||
|
if (mEditor && mSpellChecker)
|
||||||
|
{
|
||||||
|
nsAutoString dictStr(aDictionary);
|
||||||
|
result = mSpellChecker->SetCurrentDictionary(&dictStr);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsEditorShell::CloseSpellChecking()
|
nsEditorShell::CloseSpellChecking()
|
||||||
{
|
{
|
||||||
|
|
|
@ -36,6 +36,9 @@ interface nsIEditorSpellCheck : nsISupports
|
||||||
wstring GetPersonalDictionaryWord();
|
wstring GetPersonalDictionaryWord();
|
||||||
void AddWordToDictionary(in wstring word);
|
void AddWordToDictionary(in wstring word);
|
||||||
void RemoveWordFromDictionary(in wstring word);
|
void RemoveWordFromDictionary(in wstring word);
|
||||||
|
void GetDictionaryList([array, size_is(count)] out wstring dictionaryList, out PRUint32 count);
|
||||||
|
void GetCurrentDictionary(out wstring dictionary);
|
||||||
|
void SetCurrentDictionary(in wstring dictionary);
|
||||||
void CloseSpellChecking();
|
void CloseSpellChecking();
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
|
@ -102,6 +102,32 @@ public:
|
||||||
* list of words in the user's personal dictionary.
|
* list of words in the user's personal dictionary.
|
||||||
*/
|
*/
|
||||||
NS_IMETHOD GetPersonalDictionary(nsStringArray *aWordList) = 0;
|
NS_IMETHOD GetPersonalDictionary(nsStringArray *aWordList) = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the list of strings representing the dictionaries
|
||||||
|
* the spellchecker supports. It was suggested that the strings
|
||||||
|
* returned be in the RFC 1766 format. This format looks something
|
||||||
|
* like <ISO 639 language code>-<ISO 3166 country code>.
|
||||||
|
* For example: en-US
|
||||||
|
* @param aDictionaryList is an array of nsStrings that represent the
|
||||||
|
* dictionaries supported by the spellchecker.
|
||||||
|
*/
|
||||||
|
NS_IMETHOD GetDictionaryList(nsStringArray *aDictionaryList) = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a string representing the current dictionary.
|
||||||
|
* @param aDictionary will contain the name of the dictionary.
|
||||||
|
* This name is the same string that is in the list returned
|
||||||
|
* by GetDictionaryList().
|
||||||
|
*/
|
||||||
|
NS_IMETHOD GetCurrentDictionary(nsString *aDictionary) = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tells the spellchecker to use a specific dictionary.
|
||||||
|
* @param aDictionary a string that is in the list returned
|
||||||
|
* by GetDictionaryList().
|
||||||
|
*/
|
||||||
|
NS_IMETHOD SetCurrentDictionary(const nsString *aDictionary) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // nsISpellChecker_h__
|
#endif // nsISpellChecker_h__
|
||||||
|
|
|
@ -102,6 +102,32 @@ public:
|
||||||
* list of words in the user's personal dictionary.
|
* list of words in the user's personal dictionary.
|
||||||
*/
|
*/
|
||||||
NS_IMETHOD GetPersonalDictionary(nsStringArray *aWordList) = 0;
|
NS_IMETHOD GetPersonalDictionary(nsStringArray *aWordList) = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the list of strings representing the dictionaries
|
||||||
|
* the spellchecker supports. It was suggested that the strings
|
||||||
|
* returned be in the RFC 1766 format. This format looks something
|
||||||
|
* like <ISO 639 language code>-<ISO 3166 country code>.
|
||||||
|
* For example: en-US
|
||||||
|
* @param aDictionaryList is an array of nsStrings that represent the
|
||||||
|
* dictionaries supported by the spellchecker.
|
||||||
|
*/
|
||||||
|
NS_IMETHOD GetDictionaryList(nsStringArray *aDictionaryList) = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a string representing the current dictionary.
|
||||||
|
* @param aDictionary will contain the name of the dictionary.
|
||||||
|
* This name is the same string that is in the list returned
|
||||||
|
* by GetDictionaryList().
|
||||||
|
*/
|
||||||
|
NS_IMETHOD GetCurrentDictionary(nsString *aDictionary) = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tells the spellchecker to use a specific dictionary.
|
||||||
|
* @param aDictionary a string that is in the list returned
|
||||||
|
* by GetDictionaryList().
|
||||||
|
*/
|
||||||
|
NS_IMETHOD SetCurrentDictionary(const nsString *aDictionary) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // nsISpellChecker_h__
|
#endif // nsISpellChecker_h__
|
||||||
|
|
|
@ -354,6 +354,35 @@ function AppendStringToMenulist(menulist, string)
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function AppendValueAndDataToMenulist(menulist, valueStr, dataStr)
|
||||||
|
{
|
||||||
|
if (menulist)
|
||||||
|
{
|
||||||
|
var menupopup = menulist.firstChild;
|
||||||
|
// May not have any popup yet -- so create one
|
||||||
|
if (!menupopup)
|
||||||
|
{
|
||||||
|
menupopup = document.createElement("menupopup");
|
||||||
|
if (menupopup)
|
||||||
|
menulist.appendChild(menupopup);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dump("Failed to create menupoup\n");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
menuItem = document.createElement("menuitem");
|
||||||
|
if (menuItem)
|
||||||
|
{
|
||||||
|
menuItem.setAttribute("value", valueStr);
|
||||||
|
menuItem.setAttribute("data", dataStr);
|
||||||
|
menupopup.appendChild(menuItem);
|
||||||
|
return menuItem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
function ClearMenulist(menulist)
|
function ClearMenulist(menulist)
|
||||||
{
|
{
|
||||||
// There is usually not more than 1 menupopup under a menulist,
|
// There is usually not more than 1 menupopup under a menulist,
|
||||||
|
|
|
@ -75,15 +75,67 @@ function Startup()
|
||||||
// Initial replace word is the misspelled word;
|
// Initial replace word is the misspelled word;
|
||||||
dialog.ReplaceWordInput.value = MisspelledWord;
|
dialog.ReplaceWordInput.value = MisspelledWord;
|
||||||
|
|
||||||
//Use English for now TODO: Kin needs to finish this work so we can fill in list
|
if (dialog.LanguageMenulist)
|
||||||
|
InitLanguageMenu("");
|
||||||
dump("Language Listed Index = "+dialog.LanguageMenulist.selectedIndex+"\n");
|
|
||||||
|
|
||||||
DoEnabling();
|
DoEnabling();
|
||||||
|
|
||||||
dialog.SuggestedList.focus();
|
dialog.SuggestedList.focus();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function InitLanguageMenu(defaultLangStr)
|
||||||
|
{
|
||||||
|
ClearMenulist(dialog.LanguageMenulist);
|
||||||
|
|
||||||
|
var o1 = {};
|
||||||
|
var o2 = {};
|
||||||
|
|
||||||
|
// Get the list of dictionaries from
|
||||||
|
// the spellchecker.
|
||||||
|
|
||||||
|
spellChecker.GetDictionaryList(o1, o2);
|
||||||
|
|
||||||
|
var dictList = o1.value;
|
||||||
|
var count = o2.value;
|
||||||
|
|
||||||
|
// Load the string bundle that will help us map
|
||||||
|
// RFC 1766 strings to UI strings.
|
||||||
|
|
||||||
|
var bundle = srGetStrBundle("resource:/res/acceptlanguage.properties");
|
||||||
|
var menuStr;
|
||||||
|
var defaultIndex = 0;
|
||||||
|
|
||||||
|
for (var i = 0; i < dictList.length; i++)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
menuStr = bundle.GetStringFromName(dictList[i]+".title");
|
||||||
|
|
||||||
|
if (!menuStr)
|
||||||
|
menuStr = dictList[i];
|
||||||
|
|
||||||
|
if (defaultLangStr && dictList[i] == defaultLangStr)
|
||||||
|
defaultIndex = i;
|
||||||
|
} catch (ex) {
|
||||||
|
// GetStringFromName throws an exception when
|
||||||
|
// a key is not found in the bundle. In that
|
||||||
|
// case, just use the original dictList string.
|
||||||
|
|
||||||
|
menuStr = dictList[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
AppendValueAndDataToMenulist(dialog.LanguageMenulist, menuStr, dictList[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now make sure the correct item in the menu list
|
||||||
|
// is selected and that the spellchecker is in sync!
|
||||||
|
|
||||||
|
if (dictList.length > 0)
|
||||||
|
{
|
||||||
|
dialog.LanguageMenulist.selectedIndex = defaultIndex;
|
||||||
|
// SelectLanguage();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function DoEnabling()
|
function DoEnabling()
|
||||||
{
|
{
|
||||||
if (MisspelledWord.length == 0)
|
if (MisspelledWord.length == 0)
|
||||||
|
@ -225,8 +277,13 @@ function EditDictionary()
|
||||||
|
|
||||||
function SelectLanguage()
|
function SelectLanguage()
|
||||||
{
|
{
|
||||||
// A bug in combobox prevents this from working
|
var item = dialog.LanguageMenulist.selectedItem;
|
||||||
dump("SpellCheck: SelectLanguage.\n");
|
|
||||||
|
try {
|
||||||
|
spellChecker.SetCurrentDictionary(item.data);
|
||||||
|
} catch (ex) {
|
||||||
|
dump(ex);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function Recheck()
|
function Recheck()
|
||||||
|
|
|
@ -35,6 +35,7 @@
|
||||||
|
|
||||||
<html:script language="JavaScript" src="chrome://editor/content/EdDialogCommon.js"/>
|
<html:script language="JavaScript" src="chrome://editor/content/EdDialogCommon.js"/>
|
||||||
<html:script language="JavaScript" src="chrome://editor/content/EdSpellCheck.js"/>
|
<html:script language="JavaScript" src="chrome://editor/content/EdSpellCheck.js"/>
|
||||||
|
<html:script language="Javascript" src="chrome://global/content/strres.js" />
|
||||||
<!-- The argument to ShowWindowWithArgs (the editor appCore name) is placed here -->
|
<!-- The argument to ShowWindowWithArgs (the editor appCore name) is placed here -->
|
||||||
<broadcaster id="args" value=""/>
|
<broadcaster id="args" value=""/>
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче