diff options
Diffstat (limited to 'sw/source/ui/lingu/olmenu.cxx')
-rw-r--r-- | sw/source/ui/lingu/olmenu.cxx | 997 |
1 files changed, 997 insertions, 0 deletions
diff --git a/sw/source/ui/lingu/olmenu.cxx b/sw/source/ui/lingu/olmenu.cxx new file mode 100644 index 000000000000..a3f2b67b69b6 --- /dev/null +++ b/sw/source/ui/lingu/olmenu.cxx @@ -0,0 +1,997 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_sw.hxx" + +#include <hintids.hxx> + +#ifndef _SVSTDARR_HXX +#define _SVSTDARR_STRINGSDTOR +#include <svl/svstdarr.hxx> +#endif +#include <unotools/lingucfg.hxx> +#include <unotools/linguprops.hxx> +#include <svtools/filter.hxx> +#include <editeng/svxacorr.hxx> +#include <sfx2/dispatch.hxx> +#include <sfx2/imagemgr.hxx> +#include <osl/file.hxx> +#include <rtl/string.hxx> + +#include <i18npool/mslangid.hxx> +#include <linguistic/lngprops.hxx> +#include <linguistic/misc.hxx> +#include <comphelper/processfactory.hxx> +#include <editeng/unolingu.hxx> +#include <com/sun/star/uno/Any.hxx> +#include <com/sun/star/frame/XStorable.hpp> +#include <com/sun/star/linguistic2/XSpellChecker1.hpp> +#include <com/sun/star/linguistic2/XLanguageGuessing.hpp> +#include <com/sun/star/linguistic2/SingleProofreadingError.hpp> +#include <com/sun/star/lang/XServiceInfo.hpp> +#include <com/sun/star/container/XIndexAccess.hpp> +#include <com/sun/star/container/XNameAccess.hpp> +#include <com/sun/star/frame/XModuleManager.hpp> +#include <com/sun/star/lang/XMultiServiceFactory.hpp> +#include <com/sun/star/i18n/ScriptType.hpp> +#include <svx/dlgutil.hxx> +#include <svl/itemset.hxx> +#include <editeng/langitem.hxx> +#include <editeng/splwrap.hxx> +#include <vcl/svapp.hxx> +#include <vcl/settings.hxx> +#include <unotools/lingucfg.hxx> +#include <editeng/acorrcfg.hxx> +#include <swmodule.hxx> +#include <cmdid.h> +#include <helpid.h> +#include <swtypes.hxx> +#include <wrtsh.hxx> +#include <view.hxx> +#include <docsh.hxx> //CheckSpellChanges +#include <olmenu.hxx> +#include <swundo.hxx> +#include <crsskip.hxx> +#include <ndtxt.hxx> +#include <olmenu.hrc> +#include <doc.hxx> + +// -> #111827# +#include <SwRewriter.hxx> +#include <comcore.hrc> +#include <undobj.hxx> +// <- #111827# + +#include <unomid.h> +#include <svl/languageoptions.hxx> +#include <map> +#include <svtools/langtab.hxx> +#include <com/sun/star/document/XDocumentLanguages.hpp> +#include <edtwin.hxx> +#include <sfx2/sfxdlg.hxx> +#include "swabstdlg.hxx" +#include "chrdlg.hrc" +#include <editeng/brshitem.hxx> +#include <svl/stritem.hxx> +#include <viewopt.hxx> +#include <uitool.hxx> + +#include <wview.hxx> +#include <sfx2/request.hxx> + +#include <vcl/msgbox.hxx> + +#include <langhelper.hxx> + +using namespace ::com::sun::star; +using ::rtl::OUString; + +extern void lcl_CharDialog( SwWrtShell &rWrtSh, BOOL bUseDialog, USHORT nSlot,const SfxItemSet *pArgs, SfxRequest *pReq ); + + +/*-------------------------------------------------------------------------- + +---------------------------------------------------------------------------*/ + +// tries to determine the language of 'rText' +// +LanguageType lcl_CheckLanguage( + const OUString &rText, + uno::Reference< linguistic2::XSpellChecker1 > xSpell, + uno::Reference< linguistic2::XLanguageGuessing > xLangGuess, + sal_Bool bIsParaText ) +{ + LanguageType nLang = LANGUAGE_NONE; + if (bIsParaText) // check longer texts with language-guessing... + { + if (!xLangGuess.is()) + return nLang; + + lang::Locale aLocale( xLangGuess->guessPrimaryLanguage( rText, 0, rText.getLength()) ); + + // get language as from "Tools/Options - Language Settings - Languages: Locale setting" + LanguageType nTmpLang = Application::GetSettings().GetLanguage(); + + // if the result from language guessing does not provide a 'Country' part + // try to get it by looking up the locale setting of the office. + if (aLocale.Country.getLength() == 0) + { + lang::Locale aTmpLocale = SvxCreateLocale( nTmpLang ); + if (aTmpLocale.Language == aLocale.Language) + nLang = nTmpLang; + } + if (nLang == LANGUAGE_NONE) // language not found by looking up the system language... + nLang = MsLangId::convertLocaleToLanguageWithFallback( aLocale ); + if (nLang == LANGUAGE_SYSTEM) + nLang = nTmpLang; + if (nLang == LANGUAGE_DONTKNOW) + nLang = LANGUAGE_NONE; + } + else // check single word + { + if (!xSpell.is()) + return nLang; + + // + // build list of languages to check + // + LanguageType aLangList[4]; + const AllSettings& rSettings = Application::GetSettings(); + SvtLinguOptions aLinguOpt; + SvtLinguConfig().GetOptions( aLinguOpt ); + // The default document language from "Tools/Options - Language Settings - Languages: Western" + aLangList[0] = MsLangId::resolveSystemLanguageByScriptType(aLinguOpt.nDefaultLanguage, ::com::sun::star::i18n::ScriptType::LATIN); + // The one from "Tools/Options - Language Settings - Languages: User interface" + aLangList[1] = rSettings.GetUILanguage(); + // The one from "Tools/Options - Language Settings - Languages: Locale setting" + aLangList[2] = rSettings.GetLanguage(); + // en-US + aLangList[3] = LANGUAGE_ENGLISH_US; +#ifdef DEBUG + lang::Locale a0( SvxCreateLocale( aLangList[0] ) ); + lang::Locale a1( SvxCreateLocale( aLangList[1] ) ); + lang::Locale a2( SvxCreateLocale( aLangList[2] ) ); + lang::Locale a3( SvxCreateLocale( aLangList[3] ) ); +#endif + + INT32 nCount = sizeof(aLangList) / sizeof(aLangList[0]); + for (INT32 i = 0; i < nCount; i++) + { + INT16 nTmpLang = aLangList[i]; + if (nTmpLang != LANGUAGE_NONE && nTmpLang != LANGUAGE_DONTKNOW) + { + if (xSpell->hasLanguage( nTmpLang ) && + xSpell->isValid( rText, nTmpLang, uno::Sequence< beans::PropertyValue >() )) + { + nLang = nTmpLang; + break; + } + } + } + } + + return nLang; +} + + +/// @returns : the language for the selected text that is set for the +/// specified attribute (script type). +/// If there are more than one languages used LANGUAGE_DONTKNOW will be returned. +/// @param nLangWhichId : one of +/// RES_CHRATR_LANGUAGE, RES_CHRATR_CJK_LANGUAGE, RES_CHRATR_CTL_LANGUAGE, +/// @returns: the language in use for the selected text. +/// 'In use' means the language(s) matching the script type(s) of the +/// selected text. Or in other words, the language a spell checker would use. +/// If there is more than one language LANGUAGE_DONTKNOW will be returned. +// check if nScriptType includes the script type associated to nLang +inline bool lcl_checkScriptType( sal_Int16 nScriptType, LanguageType nLang ) +{ + return 0 != (nScriptType & SvtLanguageOptions::GetScriptTypeOfLanguage( nLang )); +} + +USHORT SwSpellPopup::fillLangPopupMenu( + PopupMenu *pPopupMenu, + USHORT Lang_Start, + uno::Sequence< ::rtl::OUString > aSeq, + SwWrtShell* pWrtSh, + USHORT nLangTable ) +{ + if (!pPopupMenu) + return 0; + + //Reference< awt::XMenuExtended > m_xMenuExtended( m_xPopupMenu, UNO_QUERY ); + std::map< ::rtl::OUString, ::rtl::OUString > LangItems; + + SvtLanguageTable aLanguageTable; + USHORT nItemId = Lang_Start; + rtl::OUString curLang = aSeq[0]; + USHORT nScriptType = static_cast< sal_Int16 >(aSeq[1].toInt32()); + rtl::OUString keyboardLang = aSeq[2]; + rtl::OUString guessLang = aSeq[3]; + + //1--add current language + if(curLang!=OUString::createFromAscii("")) + { + LangItems[curLang]=curLang; + } + + SvtLanguageTable aLangTable; + //2--System + const AllSettings& rAllSettings=Application::GetSettings(); + LanguageType rSystemLanguage = rAllSettings.GetLanguage(); + if(rSystemLanguage!=LANGUAGE_DONTKNOW) + { + if (lcl_checkScriptType(nScriptType,rSystemLanguage )) + LangItems[OUString(aLangTable.GetString(rSystemLanguage))]=OUString(aLangTable.GetString(rSystemLanguage)); + } + + //3--UI + LanguageType rUILanguage = rAllSettings.GetUILanguage(); + if(rUILanguage!=LANGUAGE_DONTKNOW) + { + if (lcl_checkScriptType(nScriptType, rUILanguage )) + LangItems[OUString(aLangTable.GetString(rUILanguage))]=OUString(aLangTable.GetString(rUILanguage)); + } + + //4--guessed language + if(guessLang!=OUString::createFromAscii("")) + { + if (lcl_checkScriptType(nScriptType, aLanguageTable.GetType(guessLang))) + LangItems[guessLang]=guessLang; + } + + + //5--keyboard language + if(keyboardLang!=OUString::createFromAscii("")) + { + if (lcl_checkScriptType(nScriptType, aLanguageTable.GetType(keyboardLang))) + LangItems[keyboardLang]=keyboardLang; + } + + //6--all languages used in current document + uno::Reference< com::sun::star::frame::XModel > xModel; + uno::Reference< com::sun::star::frame::XController > xController( pWrtSh->GetView().GetViewFrame()->GetFrame().GetFrameInterface()->getController(), uno::UNO_QUERY ); + if ( xController.is() ) + xModel = xController->getModel(); + + uno::Reference< document::XDocumentLanguages > xDocumentLanguages( xModel, uno::UNO_QUERY ); + /*the description of nScriptType + LATIN : 1 + ASIAN : 2 + COMPLEX:4 + LATIN + ASIAN : 3 + LATIN + COMPLEX : 5 + ASIAN + COMPLEX : 6 + LATIN + ASIAN + COMPLEX : 7 + */ + + sal_Int16 nCount=7; + if(xDocumentLanguages.is()) + { + uno::Sequence< lang::Locale > rLocales(xDocumentLanguages->getDocumentLanguages(nScriptType,nCount)); + if(rLocales.getLength()>0) + { + for(USHORT i = 0; i<rLocales.getLength();++i) + { + if (LangItems.size()==7) + break; + const lang::Locale& rLocale=rLocales[i]; + if(lcl_checkScriptType(nScriptType, aLanguageTable.GetType(rLocale.Language))) + LangItems[ rtl::OUString(rLocale.Language)]=OUString(rLocale.Language); + } + } + } + + for (std::map< rtl::OUString, rtl::OUString >::const_iterator it = LangItems.begin(); it != LangItems.end(); ++it) + { + rtl::OUString aEntryTxt( it->first ); + if (aEntryTxt != rtl::OUString( aLangTable.GetString( LANGUAGE_NONE ) )&& + aEntryTxt != rtl::OUString::createFromAscii("*") && + aEntryTxt.getLength() > 0) + { + ++nItemId; + if (nLangTable == 0) // language for selection + aLangTable_Text[nItemId] = aEntryTxt; + else if (nLangTable == 1) // language for paragraph + aLangTable_Paragraph[nItemId] = aEntryTxt; + else if (nLangTable == 2) // language for document + aLangTable_Document[nItemId] = aEntryTxt; + + pPopupMenu->InsertItem( nItemId, aEntryTxt, MIB_RADIOCHECK ); + if (aEntryTxt == curLang) + { + //make a check mark for the current language + pPopupMenu->CheckItem( nItemId, TRUE ); + } + } + } + + //7--none + nItemId++; + pPopupMenu->InsertItem( nItemId, String(SW_RES( STR_LANGSTATUS_NONE )), MIB_RADIOCHECK ); + + //More... + nItemId++; + pPopupMenu->InsertItem( nItemId, String(SW_RES( STR_LANGSTATUS_MORE )), MIB_RADIOCHECK ); + + return nItemId - Lang_Start; // return number of inserted entries +} + + +static Image lcl_GetImageFromPngUrl( const OUString &rFileUrl ) +{ + Image aRes; + OUString aTmp; + osl::FileBase::getSystemPathFromFileURL( rFileUrl, aTmp ); +// ::rtl::OString aPath = OString( aTmp.getStr(), aTmp.getLength(), osl_getThreadTextEncoding() ); +#if defined(WNT) +// aTmp = lcl_Win_GetShortPathName( aTmp ); +#endif + Graphic aGraphic; + const String aFilterName( RTL_CONSTASCII_USTRINGPARAM( IMP_PNG ) ); + if( GRFILTER_OK == GraphicFilter::LoadGraphic( aTmp, aFilterName, aGraphic ) ) + { + aRes = Image( aGraphic.GetBitmapEx() ); + } + return aRes; +} + + +::rtl::OUString RetrieveLabelFromCommand( const ::rtl::OUString& aCmdURL ) +{ + ::rtl::OUString aLabel; + if ( aCmdURL.getLength() ) + { + try + { + uno::Reference< container::XNameAccess > xNameAccess( ::comphelper::getProcessServiceFactory()->createInstance( rtl::OUString::createFromAscii("com.sun.star.frame.UICommandDescription") ), uno::UNO_QUERY ); + if ( xNameAccess.is() ) + { + uno::Reference< container::XNameAccess > xUICommandLabels; + const ::rtl::OUString aModule( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.text.TextDocument" ) ); + uno::Any a = xNameAccess->getByName( aModule ); + uno::Reference< container::XNameAccess > xUICommands; + a >>= xUICommandLabels; + rtl::OUString aStr; + uno::Sequence< beans::PropertyValue > aPropSeq; + a = xUICommandLabels->getByName( aCmdURL ); + if ( a >>= aPropSeq ) + { + for ( sal_Int32 i = 0; i < aPropSeq.getLength(); i++ ) + { + if ( aPropSeq[i].Name.equalsAscii( "Name" )) + { + aPropSeq[i].Value >>= aStr; + break; + } + } + } + aLabel = aStr; + } + } + catch ( uno::Exception& ) + { + } + } + + return aLabel; +} + + +SwSpellPopup::SwSpellPopup( + SwWrtShell* pWrtSh, + const uno::Reference< linguistic2::XSpellAlternatives > &xAlt, + const String &rParaText ) : +PopupMenu( SW_RES(MN_SPELL_POPUP) ), +pSh( pWrtSh ), +xSpellAlt(xAlt), +bGrammarResults(false) +{ + DBG_ASSERT(xSpellAlt.is(), "no spelling alternatives available"); + + CreateAutoMnemonics(); + nCheckedLanguage = LANGUAGE_NONE; + if (xSpellAlt.is()) + { + nCheckedLanguage = SvxLocaleToLanguage( xSpellAlt->getLocale() ); + aSuggestions = xSpellAlt->getAlternatives(); + } + sal_Int16 nStringCount = static_cast< sal_Int16 >( aSuggestions.getLength() ); + + SvtLinguConfig aCfg; + const bool bHC = Application::GetSettings().GetStyleSettings().GetHighContrastMode(); + + PopupMenu *pMenu = GetPopupMenu(MN_AUTOCORR); + pMenu->SetMenuFlags(MENU_FLAG_NOAUTOMNEMONICS); + sal_Bool bEnable = sal_False; + if( nStringCount ) + { + Image aImage; + OUString aSuggestionImageUrl; + uno::Reference< container::XNamed > xNamed( xSpellAlt, uno::UNO_QUERY ); + if (xNamed.is()) + { + aSuggestionImageUrl = aCfg.GetSpellAndGrammarContextSuggestionImage( xNamed->getName(), bHC ); + aImage = Image( lcl_GetImageFromPngUrl( aSuggestionImageUrl ) ); + } + + InsertSeparator(0); + bEnable = sal_True; + for( sal_uInt16 i = 0, nPos = 1, nId = MN_AUTOCORR_START + 1; + i < nStringCount; ++i, ++nPos, ++nId ) + { + const String aEntry = aSuggestions[ i ]; + InsertItem( nPos, aEntry, 0, i ); + SetHelpId( nPos, HID_LINGU_REPLACE); + + if (aSuggestionImageUrl.getLength() > 0) + SetItemImage( nPos, aImage ); + + pMenu->InsertItem( nId, aEntry ); + pMenu->SetHelpId( nPos, HID_LINGU_AUTOCORR); + } + } + + OUString aIgnoreSelection( String( SW_RES( STR_IGNORE_SELECTION ) ) ); + OUString aSpellingAndGrammar = RetrieveLabelFromCommand( C2U(".uno:SpellingAndGrammarDialog") ); + SetItemText( MN_SPELLING, aSpellingAndGrammar ); + USHORT nItemPos = GetItemPos( MN_IGNORE ); + InsertItem( MN_IGNORE_SELECTION, aIgnoreSelection, 0, nItemPos ); + SetHelpId( MN_IGNORE_SELECTION, HID_LINGU_IGNORE_SELECTION); + + EnableItem( MN_AUTOCORR, bEnable ); + + uno::Reference< linguistic2::XLanguageGuessing > xLG = SW_MOD()->GetLanguageGuesser(); + nGuessLangWord = LANGUAGE_NONE; + nGuessLangPara = LANGUAGE_NONE; + if (xSpellAlt.is() && xLG.is()) + { + nGuessLangWord = lcl_CheckLanguage( xSpellAlt->getWord(), ::GetSpellChecker(), xLG, sal_False ); + nGuessLangPara = lcl_CheckLanguage( rParaText, ::GetSpellChecker(), xLG, sal_True ); + } + if (nGuessLangWord != LANGUAGE_NONE || nGuessLangPara != LANGUAGE_NONE) + { + // make sure LANGUAGE_NONE gets not used as menu entry + if (nGuessLangWord == LANGUAGE_NONE) + nGuessLangWord = nGuessLangPara; + if (nGuessLangPara == LANGUAGE_NONE) + nGuessLangPara = nGuessLangWord; + } + + pMenu = GetPopupMenu(MN_INSERT); + + bEnable = FALSE; // enable MN_INSERT? + + pMenu->CreateAutoMnemonics(); + uno::Reference< linguistic2::XDictionaryList > xDicList( SvxGetDictionaryList() ); + if (xDicList.is()) + { + // add the default positive dictionary to dic-list (if not already done). + // This is to ensure that there is at least one dictionary to which + // words could be added. + uno::Reference< linguistic2::XDictionary > xDic( SvxGetOrCreatePosDic( xDicList ) ); + if (xDic.is()) + xDic->setActive( sal_True ); + + aDics = xDicList->getDictionaries(); + const uno::Reference< linguistic2::XDictionary > *pDic = aDics.getConstArray(); + USHORT nDicCount = static_cast< USHORT >(aDics.getLength()); + + for( USHORT i = 0; i < nDicCount; i++ ) + { + uno::Reference< linguistic2::XDictionary > xDicTmp( pDic[i], uno::UNO_QUERY ); + if (!xDicTmp.is() || SvxGetIgnoreAllList() == xDicTmp) + continue; + + uno::Reference< frame::XStorable > xStor( xDicTmp, uno::UNO_QUERY ); + LanguageType nActLanguage = SvxLocaleToLanguage( xDicTmp->getLocale() ); + if( xDicTmp->isActive() + && xDicTmp->getDictionaryType() != linguistic2::DictionaryType_NEGATIVE + && (nCheckedLanguage == nActLanguage || LANGUAGE_NONE == nActLanguage ) + && (!xStor.is() || !xStor->isReadonly()) ) + { + // the extra 1 is because of the (possible) external + // linguistic entry above + USHORT nPos = MN_INSERT_START + i + 1; + pMenu->InsertItem( nPos, xDicTmp->getName() ); + bEnable = sal_True; + + uno::Reference< lang::XServiceInfo > xSvcInfo( xDicTmp, uno::UNO_QUERY ); + if (xSvcInfo.is()) + { + OUString aDictionaryImageUrl( aCfg.GetSpellAndGrammarContextDictionaryImage( + xSvcInfo->getImplementationName(), bHC) ); + if (aDictionaryImageUrl.getLength() > 0) + { + Image aImage( lcl_GetImageFromPngUrl( aDictionaryImageUrl ) ); + pMenu->SetItemImage( nPos, aImage ); + } + } + } + } + } + EnableItem( MN_INSERT, bEnable ); + + //ADD NEW LANGUAGE MENU ITEM + /////////////////////////////////////////////////////////////////////////// + String aScriptTypesInUse( String::CreateFromInt32( pWrtSh->GetScriptType() ) ); + SvtLanguageTable aLangTable; + + // get keyboard language + String aKeyboardLang; + LanguageType nLang = LANGUAGE_DONTKNOW; + SwEditWin& rEditWin = pWrtSh->GetView().GetEditWin(); + nLang = rEditWin.GetInputLanguage(); + if (nLang != LANGUAGE_DONTKNOW && nLang != LANGUAGE_SYSTEM) + aKeyboardLang = aLangTable.GetString( nLang ); + + // get the language that is in use + const String aMultipleLanguages = String::CreateFromAscii("*"); + String aCurrentLang = aMultipleLanguages; + nLang = SwLangHelper::GetCurrentLanguage( *pWrtSh ); + if (nLang != LANGUAGE_DONTKNOW) + aCurrentLang = aLangTable.GetString( nLang ); + + // build sequence for status value + uno::Sequence< ::rtl::OUString > aSeq( 4 ); + aSeq[0] = aCurrentLang; + aSeq[1] = aScriptTypesInUse; + aSeq[2] = aKeyboardLang; + aSeq[3] = aLangTable.GetString(nGuessLangWord); + + pMenu = GetPopupMenu(MN_LANGUAGE_SELECTION); + nNumLanguageTextEntries = fillLangPopupMenu( pMenu, MN_LANGUAGE_SELECTION_START, aSeq, pWrtSh, 0 ); + EnableItem( MN_LANGUAGE_SELECTION, true ); + + pMenu = GetPopupMenu(MN_LANGUAGE_PARAGRAPH); + nNumLanguageParaEntries = fillLangPopupMenu( pMenu, MN_LANGUAGE_PARAGRAPH_START, aSeq, pWrtSh, 1 ); + EnableItem( MN_LANGUAGE_PARAGRAPH, true ); +/* + pMenu = GetPopupMenu(MN_LANGUAGE_ALL_TEXT); + nNumLanguageDocEntries = fillLangPopupMenu( pMenu, MN_LANGUAGE_ALL_TEXT_START, aSeq, pWrtSh, 2 ); + EnableItem( MN_LANGUAGE_ALL_TEXT, true ); +*/ + uno::Reference< frame::XFrame > xFrame = pWrtSh->GetView().GetViewFrame()->GetFrame().GetFrameInterface(); + Image rImg = ::GetImage( xFrame, + ::rtl::OUString::createFromAscii(".uno:SpellingAndGrammarDialog"), sal_False, + Application::GetSettings().GetStyleSettings().GetHighContrastMode() ); + SetItemImage( MN_SPELLING, rImg ); + ////////////////////////////////////////////////////////////////////////////////// + + RemoveDisabledEntries( TRUE, TRUE ); + SetMenuFlags(MENU_FLAG_NOAUTOMNEMONICS); +} + +/*-------------------------------------------------------------------------- + +---------------------------------------------------------------------------*/ + +SwSpellPopup::SwSpellPopup( + SwWrtShell *pWrtSh, + const linguistic2::ProofreadingResult &rResult, + sal_Int32 nErrorInResult, + const uno::Sequence< rtl::OUString > &rSuggestions, + const String &rParaText ) : +PopupMenu( SW_RES(MN_SPELL_POPUP) ), +pSh( pWrtSh ), +aSuggestions( rSuggestions ), +bGrammarResults( true ), +aInfo16( SW_RES(IMG_INFO_16) ) +{ + nCheckedLanguage = SvxLocaleToLanguage( rResult.aLocale ); + + sal_Int16 nItemId = 1; + sal_Int16 nPos = 0; + OUString aMessageText( rResult.aErrors[ nErrorInResult ].aShortComment ); + InsertSeparator( nPos++ ); + InsertItem( nItemId, aMessageText, MIB_NOSELECT, nPos++ ); + SetItemImage( nItemId, aInfo16 ); + ++nItemId; + + CreateAutoMnemonics(); + + InsertSeparator( nPos++ ); + sal_Int32 nStringCount = aSuggestions.getLength(); + if ( nStringCount ) // suggestions available... + { + Image aImage; + OUString aSuggestionImageUrl; + uno::Reference< lang::XServiceInfo > xInfo( rResult.xProofreader, uno::UNO_QUERY ); + if (xInfo.is()) + { + aSuggestionImageUrl = SvtLinguConfig().GetSpellAndGrammarContextSuggestionImage( xInfo->getImplementationName() ); + aImage = Image( lcl_GetImageFromPngUrl( aSuggestionImageUrl ) ); + } + + for (sal_uInt16 i = 0; i < nStringCount; ++i) + { + const String aEntry = aSuggestions[ i ]; + InsertItem( nItemId, aEntry, 0, nPos++ ); + SetHelpId( nItemId, HID_LINGU_REPLACE ); + + if (aSuggestionImageUrl.getLength() > 0) + SetItemImage( nItemId, aImage ); + + ++nItemId; + } + InsertSeparator( nPos++ ); + } + + OUString aIgnoreSelection( String( SW_RES( STR_IGNORE_SELECTION ) ) ); + OUString aSpellingAndGrammar = RetrieveLabelFromCommand( C2U(".uno:SpellingAndGrammarDialog") ); + SetItemText( MN_SPELLING, aSpellingAndGrammar ); + USHORT nItemPos = GetItemPos( MN_IGNORE ); + InsertItem( MN_IGNORE_SELECTION, aIgnoreSelection, 0, nItemPos ); + SetHelpId( MN_IGNORE_SELECTION, HID_LINGU_IGNORE_SELECTION); + + EnableItem( MN_AUTOCORR, false ); + + uno::Reference< linguistic2::XLanguageGuessing > xLG = SW_MOD()->GetLanguageGuesser(); + nGuessLangWord = LANGUAGE_NONE; + nGuessLangPara = LANGUAGE_NONE; + if (xLG.is()) + { +// nGuessLangWord = lcl_CheckLanguage( xSpellAlt->getWord(), ::GetSpellChecker(), xLG, sal_False ); + nGuessLangPara = lcl_CheckLanguage( rParaText, ::GetSpellChecker(), xLG, sal_True ); + } + if (nGuessLangWord != LANGUAGE_NONE || nGuessLangPara != LANGUAGE_NONE) + { + // make sure LANGUAGE_NONE gets not used as menu entry + if (nGuessLangWord == LANGUAGE_NONE) + nGuessLangWord = nGuessLangPara; + if (nGuessLangPara == LANGUAGE_NONE) + nGuessLangPara = nGuessLangWord; + } + + EnableItem( MN_IGNORE, false ); + EnableItem( MN_INSERT, false ); + + //ADD NEW LANGUAGE MENU ITEM + /////////////////////////////////////////////////////////////////////////// + String aScriptTypesInUse( String::CreateFromInt32( pWrtSh->GetScriptType() ) ); + SvtLanguageTable aLangTable; + + // get keyboard language + String aKeyboardLang; + LanguageType nLang = LANGUAGE_DONTKNOW; + SwEditWin& rEditWin = pWrtSh->GetView().GetEditWin(); + nLang = rEditWin.GetInputLanguage(); + if (nLang != LANGUAGE_DONTKNOW && nLang != LANGUAGE_SYSTEM) + aKeyboardLang = aLangTable.GetString( nLang ); + + // get the language that is in use + const String aMultipleLanguages = String::CreateFromAscii("*"); + String aCurrentLang = aMultipleLanguages; + nLang = SwLangHelper::GetCurrentLanguage( *pWrtSh ); + if (nLang != LANGUAGE_DONTKNOW) + aCurrentLang = aLangTable.GetString( nLang ); + + // build sequence for status value + uno::Sequence< ::rtl::OUString > aSeq( 4 ); + aSeq[0] = aCurrentLang; + aSeq[1] = aScriptTypesInUse; + aSeq[2] = aKeyboardLang; + aSeq[3] = aLangTable.GetString(nGuessLangWord); + + PopupMenu *pMenu = GetPopupMenu(MN_LANGUAGE_SELECTION); + nNumLanguageTextEntries = fillLangPopupMenu( pMenu, MN_LANGUAGE_SELECTION_START, aSeq, pWrtSh, 0 ); + EnableItem( MN_LANGUAGE_SELECTION, true ); + + pMenu = GetPopupMenu(MN_LANGUAGE_PARAGRAPH); + nNumLanguageParaEntries = fillLangPopupMenu( pMenu, MN_LANGUAGE_PARAGRAPH_START, aSeq, pWrtSh, 1 ); + EnableItem( MN_LANGUAGE_PARAGRAPH, true ); +/* + pMenu = GetPopupMenu(MN_LANGUAGE_ALL_TEXT); + nNumLanguageDocEntries = fillLangPopupMenu( pMenu, MN_LANGUAGE_ALL_TEXT_START, aSeq, pWrtSh, 2 ); + EnableItem( MN_LANGUAGE_ALL_TEXT, true ); +*/ + uno::Reference< frame::XFrame > xFrame = pWrtSh->GetView().GetViewFrame()->GetFrame().GetFrameInterface(); + Image rImg = ::GetImage( xFrame, + ::rtl::OUString::createFromAscii(".uno:SpellingAndGrammarDialog"), sal_False, + Application::GetSettings().GetStyleSettings().GetHighContrastMode() ); + SetItemImage( MN_SPELLING, rImg ); + + ////////////////////////////////////////////////////////////////////////////////// + + RemoveDisabledEntries( TRUE, TRUE ); + SetMenuFlags(MENU_FLAG_NOAUTOMNEMONICS); +} + +/*-------------------------------------------------------------------------- + +---------------------------------------------------------------------------*/ +sal_uInt16 SwSpellPopup::Execute( const Rectangle& rWordPos, Window* pWin ) +{ +// SetMenuFlags(MENU_FLAG_NOAUTOMNEMONICS); + sal_uInt16 nRet = PopupMenu::Execute(pWin, pWin->LogicToPixel(rWordPos)); + Execute( nRet ); + return nRet; +} +/*-- 19.01.2006 08:15:48--------------------------------------------------- + + -----------------------------------------------------------------------*/ +void SwSpellPopup::Execute( USHORT nId ) +{ + if (bGrammarResults && nId == 1) + return; // nothing to do since it is the error message (short comment) + + sal_Bool bAutoCorr = sal_False; + if( nId > MN_AUTOCORR_START && nId < MN_LANGUAGE_SELECTION_START && nId != USHRT_MAX ) + { + nId -= MN_AUTOCORR_START; + bAutoCorr = sal_True; + } + + if( nId && nId != USHRT_MAX) + { + int nAltIdx = bGrammarResults ? nId - 2 : nId - 1; + if ( nAltIdx >= 0 && nAltIdx < aSuggestions.getLength() && (bGrammarResults || xSpellAlt.is()) ) + { + sal_Bool bOldIns = pSh->IsInsMode(); + pSh->SetInsMode( sal_True ); + + DBG_ASSERT( 0 <= nAltIdx && nAltIdx <= aSuggestions.getLength(), "index out of range"); + String aTmp( aSuggestions[ nAltIdx ] ); + String aOrig( bGrammarResults ? OUString() : xSpellAlt->getWord() ); + + // if orginal word has a trailing . (likely the end of a sentence) + // and the replacement text hasn't, then add it to the replacement + if (aTmp.Len() && aOrig.Len() && + '.' == aOrig.GetChar( aOrig.Len() - 1) && /* !IsAlphaNumeric ??*/ + '.' != aTmp.GetChar( aTmp.Len() - 1)) + { + aTmp += '.'; + } + + // #111827# + SwRewriter aRewriter; + + aRewriter.AddRule(UNDO_ARG1, pSh->GetCrsrDescr()); + aRewriter.AddRule(UNDO_ARG2, String(SW_RES(STR_YIELDS))); + + { + String aTmpStr; + + aTmpStr += String(SW_RES(STR_START_QUOTE)); + aTmpStr += aTmp; + aTmpStr += String(SW_RES(STR_END_QUOTE)); + aRewriter.AddRule(UNDO_ARG3, aTmpStr); + } + + pSh->StartUndo(UNDO_UI_REPLACE, &aRewriter); + pSh->StartAction(); + pSh->DelLeft(); + + pSh->Insert( aTmp ); + /* #102505# EndAction/EndUndo moved down since insertion + of temporary auto correction is now undoable two and + must reside in the same undo group.*/ + + + // nur aufnehmen, wenn es NICHT schon in der Autokorrektur vorhanden ist + SvxAutoCorrect* pACorr = SvxAutoCorrCfg::Get()->GetAutoCorrect(); + + String aOrigWord( bGrammarResults ? OUString() : xSpellAlt->getWord() ) ; + String aNewWord; + if( nId ) + aNewWord = aSuggestions[ nAltIdx ]; + else + aNewWord = aOrigWord; + SvxPrepareAutoCorrect( aOrigWord, aNewWord ); + + if( bAutoCorr ) + { + pACorr->PutText( aOrigWord, aNewWord, nCheckedLanguage ); + } + + /* #102505# EndAction/EndUndo moved down since insertion + of temporary auto correction is now undoable two and + must reside in the same undo group.*/ + pSh->EndAction(); + pSh->EndUndo(UNDO_UI_REPLACE); + + pSh->SetInsMode( bOldIns ); + } + else + { + if (nId < MN_LANGUAGE_SELECTION_START) + { + switch( nId ) + { + case MN_SPELLING: + { + if (bGrammarResults) + { + SvtLinguConfig().SetProperty( A2OU( UPN_IS_GRAMMAR_INTERACTIVE ), uno::makeAny( sal_True )); + } + pSh->Left(CRSR_SKIP_CHARS, FALSE, 1, FALSE ); + { + uno::Reference<linguistic2::XDictionaryList> xDictionaryList( SvxGetDictionaryList() ); + SvxDicListChgClamp aClamp( xDictionaryList ); + pSh->GetView().GetViewFrame()->GetDispatcher()-> + Execute( FN_SPELL_GRAMMAR_DIALOG, SFX_CALLMODE_ASYNCHRON ); + } + } + break; + case MN_IGNORE_SELECTION : + { + SwPaM *pPaM = pSh->GetCrsr(); + if (pPaM) + pSh->IgnoreGrammarErrorAt( *pPaM ); + } + break; + case MN_IGNORE : + { + uno::Reference< linguistic2::XDictionary > xDictionary( SvxGetIgnoreAllList(), uno::UNO_QUERY ); + linguistic::AddEntryToDic( + xDictionary, + xSpellAlt->getWord(), sal_False, + aEmptyStr, LANGUAGE_NONE ); + } + break; + case MN_INSERT: + DBG_ERROR("geht noch nicht!"); + break; + case MN_LANGUAGE_WORD: + case MN_LANGUAGE_PARA: + { + pSh->StartAction(); + + if( MN_LANGUAGE_PARA == nId ) + { + if( !pSh->IsSttPara() ) + pSh->MovePara( fnParaCurr, fnParaStart ); + pSh->SwapPam(); + if( !pSh->IsEndPara() ) + pSh->MovePara( fnParaCurr, fnParaEnd ); + } + + LanguageType nLangToUse = (MN_LANGUAGE_PARA == nId) ? nGuessLangPara : nGuessLangWord; + sal_uInt16 nScriptType = SvtLanguageOptions::GetScriptTypeOfLanguage( nLangToUse ); + USHORT nResId = 0; + switch (nScriptType) + { + case SCRIPTTYPE_COMPLEX : nResId = RES_CHRATR_CTL_LANGUAGE; break; + case SCRIPTTYPE_ASIAN : nResId = RES_CHRATR_CJK_LANGUAGE; break; + default /*SCRIPTTYPE_LATIN*/: nResId = RES_CHRATR_LANGUAGE; break; + } + SfxItemSet aSet(pSh->GetAttrPool(), nResId, nResId ); + aSet.Put( SvxLanguageItem( nLangToUse, nResId ) ); + pSh->SetAttr( aSet ); + + pSh->EndAction(); + } + break; + default: + if(nId >= MN_INSERT_START ) + { + OUString aWord( xSpellAlt->getWord() ); + INT32 nDicIdx = nId - MN_INSERT_START - 1; + DBG_ASSERT( nDicIdx < aDics.getLength(), + "dictionary index out of range" ); + uno::Reference< linguistic2::XDictionary > xDic = + aDics.getConstArray()[nDicIdx]; + INT16 nAddRes = linguistic::AddEntryToDic( xDic, + aWord, FALSE, aEmptyStr, LANGUAGE_NONE ); + // save modified user-dictionary if it is persistent + uno::Reference< frame::XStorable > xSavDic( xDic, uno::UNO_QUERY ); + if (xSavDic.is()) + xSavDic->store(); + + if (DIC_ERR_NONE != nAddRes + && !xDic->getEntry( aWord ).is()) + { + SvxDicError( + &pSh->GetView().GetViewFrame()->GetWindow(), + nAddRes ); + } + } + } + } + else + { + SfxItemSet aCoreSet( pSh->GetView().GetPool(), + RES_CHRATR_LANGUAGE, RES_CHRATR_LANGUAGE, + RES_CHRATR_CJK_LANGUAGE, RES_CHRATR_CJK_LANGUAGE, + RES_CHRATR_CTL_LANGUAGE, RES_CHRATR_CTL_LANGUAGE, + 0 ); + String aNewLangTxt; + +// pSh->StartAction(); + + if (nId >= MN_LANGUAGE_SELECTION_START && nId < MN_LANGUAGE_SELECTION_START + nNumLanguageTextEntries - 1) + { + //Set language for current selection + aNewLangTxt=aLangTable_Text[nId]; + SwLangHelper::SetLanguage( *pSh, aNewLangTxt, true, aCoreSet ); + } + else if (nId == MN_LANGUAGE_SELECTION_START + nNumLanguageTextEntries - 1) + { + //Set Language_None for current selection + SwLangHelper::SetLanguage_None( *pSh, true, aCoreSet ); + } + else if (nId == MN_LANGUAGE_SELECTION_START + nNumLanguageTextEntries) + { + //Open Format/Character Dialog + lcl_CharDialog( *pSh, true, nId, 0, 0 ); + } + else if (nId >= MN_LANGUAGE_PARAGRAPH_START && nId < MN_LANGUAGE_PARAGRAPH_START + nNumLanguageParaEntries - 1) + { + //Set language for current paragraph + aNewLangTxt=aLangTable_Paragraph[nId]; + pSh->Push(); // save cursor + SwLangHelper::SelectCurrentPara( *pSh ); + SwLangHelper::SetLanguage( *pSh, aNewLangTxt, true, aCoreSet ); + pSh->Pop( FALSE ); // restore cursor + } + else if (nId == MN_LANGUAGE_PARAGRAPH_START + nNumLanguageParaEntries - 1) + { + //Set Language_None for current paragraph + pSh->Push(); // save cursor + SwLangHelper::SelectCurrentPara( *pSh ); + SwLangHelper::SetLanguage_None( *pSh, true, aCoreSet ); + pSh->Pop( FALSE ); // restore cursor + } + else if (nId == MN_LANGUAGE_PARAGRAPH_START + nNumLanguageParaEntries) + { + pSh->Push(); // save cursor + SwLangHelper::SelectCurrentPara( *pSh ); + //Open Format/Character Dialog + lcl_CharDialog( *pSh, true, nId, 0, 0 ); + pSh->Pop( FALSE ); // restore cursor + } + else if (nId >= MN_LANGUAGE_ALL_TEXT_START && nId < MN_LANGUAGE_ALL_TEXT_START + nNumLanguageDocEntries - 1) + { + //Set selected language as the default language + aNewLangTxt=aLangTable_Document[nId]; + SwLangHelper::SetLanguage( *pSh, aNewLangTxt, false, aCoreSet ); + } + else if (nId == MN_LANGUAGE_ALL_TEXT_START + nNumLanguageDocEntries - 1) + { + //Set Language_None as the default language + SwLangHelper::SetLanguage_None( *pSh, false, aCoreSet ); + } + else if (nId == MN_LANGUAGE_ALL_TEXT_START + nNumLanguageDocEntries) + { + // open the dialog "Tools/Options/Language Settings - Language" + SfxAbstractDialogFactory* pFact = SfxAbstractDialogFactory::Create(); + if (pFact) + { + VclAbstractDialog* pDlg = pFact->CreateVclDialog( pSh->GetView().GetWindow(), SID_LANGUAGE_OPTIONS ); + pDlg->Execute(); + delete pDlg; + } + } + +// pSh->EndAction(); + } + } + } + + pSh->EnterStdMode(); +} |