1*f6e50924SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*f6e50924SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*f6e50924SAndrew Rist * or more contributor license agreements. See the NOTICE file 5*f6e50924SAndrew Rist * distributed with this work for additional information 6*f6e50924SAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*f6e50924SAndrew Rist * to you under the Apache License, Version 2.0 (the 8*f6e50924SAndrew Rist * "License"); you may not use this file except in compliance 9*f6e50924SAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 11*f6e50924SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 13*f6e50924SAndrew Rist * Unless required by applicable law or agreed to in writing, 14*f6e50924SAndrew Rist * software distributed under the License is distributed on an 15*f6e50924SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*f6e50924SAndrew Rist * KIND, either express or implied. See the License for the 17*f6e50924SAndrew Rist * specific language governing permissions and limitations 18*f6e50924SAndrew Rist * under the License. 19cdf0e10cSrcweir * 20*f6e50924SAndrew Rist *************************************************************/ 21*f6e50924SAndrew Rist 22*f6e50924SAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_svx.hxx" 26cdf0e10cSrcweir 27cdf0e10cSrcweir // include --------------------------------------------------------------- 28cdf0e10cSrcweir 29cdf0e10cSrcweir #include <com/sun/star/linguistic2/XLinguServiceManager.hdl> 30cdf0e10cSrcweir #include <com/sun/star/linguistic2/XAvailableLocales.hpp> 31cdf0e10cSrcweir #include <com/sun/star/i18n/ScriptType.hpp> 32cdf0e10cSrcweir #include <linguistic/misc.hxx> 33cdf0e10cSrcweir #include <rtl/ustring.hxx> 34cdf0e10cSrcweir #include <unotools/localedatawrapper.hxx> 35cdf0e10cSrcweir #include <tools/urlobj.hxx> 36cdf0e10cSrcweir #include <svtools/langtab.hxx> 37cdf0e10cSrcweir #include <tools/shl.hxx> 38cdf0e10cSrcweir #include <i18npool/mslangid.hxx> 39cdf0e10cSrcweir #include <i18npool/lang.h> 40cdf0e10cSrcweir #include <editeng/scripttypeitem.hxx> 41cdf0e10cSrcweir #include <editeng/unolingu.hxx> 42cdf0e10cSrcweir #include <svx/langbox.hxx> 43cdf0e10cSrcweir #include <svx/dialmgr.hxx> 44cdf0e10cSrcweir #include <svx/dialogs.hrc> 45cdf0e10cSrcweir 46cdf0e10cSrcweir using namespace ::com::sun::star::util; 47cdf0e10cSrcweir using namespace ::com::sun::star::lang; 48cdf0e10cSrcweir using namespace ::com::sun::star::linguistic2; 49cdf0e10cSrcweir using namespace ::com::sun::star::uno; 50cdf0e10cSrcweir 51cdf0e10cSrcweir // ----------------------------------------------------------------------- 52cdf0e10cSrcweir 53cdf0e10cSrcweir String GetDicInfoStr( const String& rName, const sal_uInt16 nLang, sal_Bool bNeg ) 54cdf0e10cSrcweir { 55cdf0e10cSrcweir INetURLObject aURLObj; 56cdf0e10cSrcweir aURLObj.SetSmartProtocol( INET_PROT_FILE ); 57cdf0e10cSrcweir aURLObj.SetSmartURL( rName, INetURLObject::ENCODE_ALL ); 58cdf0e10cSrcweir String aTmp( aURLObj.GetBase() ); 59cdf0e10cSrcweir aTmp += sal_Unicode( ' ' ); 60cdf0e10cSrcweir 61cdf0e10cSrcweir if ( bNeg ) 62cdf0e10cSrcweir { 63cdf0e10cSrcweir sal_Char const sTmp[] = " (-) "; 64cdf0e10cSrcweir aTmp.AppendAscii( sTmp ); 65cdf0e10cSrcweir } 66cdf0e10cSrcweir 67cdf0e10cSrcweir if ( LANGUAGE_NONE == nLang ) 68cdf0e10cSrcweir aTmp += String( ResId( RID_SVXSTR_LANGUAGE_ALL, DIALOG_MGR() ) ); 69cdf0e10cSrcweir else 70cdf0e10cSrcweir { 71cdf0e10cSrcweir aTmp += sal_Unicode( '[' ); 72cdf0e10cSrcweir aTmp += SvtLanguageTable::GetLanguageString( (LanguageType)nLang ); 73cdf0e10cSrcweir aTmp += sal_Unicode( ']' ); 74cdf0e10cSrcweir } 75cdf0e10cSrcweir 76cdf0e10cSrcweir return aTmp; 77cdf0e10cSrcweir } 78cdf0e10cSrcweir 79cdf0e10cSrcweir //======================================================================== 80cdf0e10cSrcweir // misc local helper functions 81cdf0e10cSrcweir //======================================================================== 82cdf0e10cSrcweir 83cdf0e10cSrcweir static Sequence< sal_Int16 > lcl_LocaleSeqToLangSeq( Sequence< Locale > &rSeq ) 84cdf0e10cSrcweir { 85cdf0e10cSrcweir const Locale *pLocale = rSeq.getConstArray(); 86cdf0e10cSrcweir sal_Int32 nCount = rSeq.getLength(); 87cdf0e10cSrcweir 88cdf0e10cSrcweir Sequence< sal_Int16 > aLangs( nCount ); 89cdf0e10cSrcweir sal_Int16 *pLang = aLangs.getArray(); 90cdf0e10cSrcweir for (sal_Int32 i = 0; i < nCount; ++i) 91cdf0e10cSrcweir { 92cdf0e10cSrcweir pLang[i] = SvxLocaleToLanguage( pLocale[i] ); 93cdf0e10cSrcweir 94cdf0e10cSrcweir } 95cdf0e10cSrcweir 96cdf0e10cSrcweir return aLangs; 97cdf0e10cSrcweir } 98cdf0e10cSrcweir 99cdf0e10cSrcweir 100cdf0e10cSrcweir static sal_Bool lcl_SeqHasLang( const Sequence< sal_Int16 > & rLangSeq, sal_Int16 nLang ) 101cdf0e10cSrcweir { 102cdf0e10cSrcweir sal_Int32 i = -1; 103cdf0e10cSrcweir sal_Int32 nLen = rLangSeq.getLength(); 104cdf0e10cSrcweir if (nLen) 105cdf0e10cSrcweir { 106cdf0e10cSrcweir const sal_Int16 *pLang = rLangSeq.getConstArray(); 107cdf0e10cSrcweir for (i = 0; i < nLen; ++i) 108cdf0e10cSrcweir { 109cdf0e10cSrcweir if (nLang == pLang[i]) 110cdf0e10cSrcweir break; 111cdf0e10cSrcweir } 112cdf0e10cSrcweir } 113cdf0e10cSrcweir return i >= 0 && i < nLen; 114cdf0e10cSrcweir } 115cdf0e10cSrcweir 116cdf0e10cSrcweir //======================================================================== 117cdf0e10cSrcweir // class SvxLanguageBox 118cdf0e10cSrcweir //======================================================================== 119cdf0e10cSrcweir 120cdf0e10cSrcweir sal_uInt16 TypeToPos_Impl( LanguageType eType, const ListBox& rLb ) 121cdf0e10cSrcweir { 122cdf0e10cSrcweir sal_uInt16 nPos = LISTBOX_ENTRY_NOTFOUND; 123cdf0e10cSrcweir sal_uInt16 nCount = rLb.GetEntryCount(); 124cdf0e10cSrcweir 125cdf0e10cSrcweir for ( sal_uInt16 i=0; nPos == LISTBOX_ENTRY_NOTFOUND && i<nCount; i++ ) 126cdf0e10cSrcweir if ( eType == LanguageType((sal_uIntPtr)rLb.GetEntryData(i)) ) 127cdf0e10cSrcweir nPos = i; 128cdf0e10cSrcweir 129cdf0e10cSrcweir return nPos; 130cdf0e10cSrcweir } 131cdf0e10cSrcweir 132cdf0e10cSrcweir //----------------------------------------------------------------------- 133cdf0e10cSrcweir SvxLanguageBox::SvxLanguageBox( Window* pParent, WinBits nWinStyle, sal_Bool bCheck ) : 134cdf0e10cSrcweir ListBox( pParent, nWinStyle ), 135cdf0e10cSrcweir m_pSpellUsedLang( NULL ), 136cdf0e10cSrcweir m_bWithCheckmark( bCheck ) 137cdf0e10cSrcweir { 138cdf0e10cSrcweir Init(); 139cdf0e10cSrcweir } 140cdf0e10cSrcweir //------------------------------------------------------------------------ 141cdf0e10cSrcweir SvxLanguageBox::SvxLanguageBox( Window* pParent, const ResId& rResId, sal_Bool bCheck ) : 142cdf0e10cSrcweir ListBox( pParent, rResId ), 143cdf0e10cSrcweir m_pSpellUsedLang( NULL ), 144cdf0e10cSrcweir m_bWithCheckmark( bCheck ) 145cdf0e10cSrcweir { 146cdf0e10cSrcweir Init(); 147cdf0e10cSrcweir } 148cdf0e10cSrcweir //------------------------------------------------------------------------ 149cdf0e10cSrcweir void SvxLanguageBox::Init() 150cdf0e10cSrcweir { 151cdf0e10cSrcweir m_pLangTable = new SvtLanguageTable; 152cdf0e10cSrcweir m_aNotCheckedImage = Image( SVX_RES( RID_SVXIMG_NOTCHECKED ) ); 153cdf0e10cSrcweir m_aCheckedImage = Image( SVX_RES( RID_SVXIMG_CHECKED ) ); 154cdf0e10cSrcweir m_aCheckedImageHC = Image( SVX_RES( RID_SVXIMG_CHECKED_H ) ); 155cdf0e10cSrcweir m_aAllString = String( SVX_RESSTR( RID_SVXSTR_LANGUAGE_ALL ) ); 156cdf0e10cSrcweir m_nLangList = LANG_LIST_EMPTY; 157cdf0e10cSrcweir m_bHasLangNone = sal_False; 158cdf0e10cSrcweir m_bLangNoneIsLangAll = sal_False; 159cdf0e10cSrcweir 160cdf0e10cSrcweir // display entries sorted 161cdf0e10cSrcweir SetStyle( GetStyle() | WB_SORT ); 162cdf0e10cSrcweir 163cdf0e10cSrcweir if ( m_bWithCheckmark ) 164cdf0e10cSrcweir { 165cdf0e10cSrcweir SvtLanguageTable aLangTable; 166cdf0e10cSrcweir sal_uInt32 nCount = aLangTable.GetEntryCount(); 167cdf0e10cSrcweir for ( sal_uInt32 i = 0; i < nCount; i++ ) 168cdf0e10cSrcweir { 169cdf0e10cSrcweir LanguageType nLangType = aLangTable.GetTypeAtIndex( i ); 170cdf0e10cSrcweir 171cdf0e10cSrcweir sal_Bool bInsert = sal_True; 172cdf0e10cSrcweir if ((LANGUAGE_DONTKNOW == nLangType) || 173cdf0e10cSrcweir (LANGUAGE_SYSTEM == nLangType) || 174cdf0e10cSrcweir (LANGUAGE_USER1 <= nLangType && nLangType <= LANGUAGE_USER9)) 175cdf0e10cSrcweir { 176cdf0e10cSrcweir bInsert = sal_False; 177cdf0e10cSrcweir } 178cdf0e10cSrcweir 179cdf0e10cSrcweir if ( bInsert ) 180cdf0e10cSrcweir InsertLanguage( nLangType ); 181cdf0e10cSrcweir } 182cdf0e10cSrcweir m_nLangList = LANG_LIST_ALL; 183cdf0e10cSrcweir } 184cdf0e10cSrcweir } 185cdf0e10cSrcweir //------------------------------------------------------------------------ 186cdf0e10cSrcweir 187cdf0e10cSrcweir SvxLanguageBox::~SvxLanguageBox() 188cdf0e10cSrcweir { 189cdf0e10cSrcweir delete m_pSpellUsedLang; 190cdf0e10cSrcweir delete m_pLangTable; 191cdf0e10cSrcweir } 192cdf0e10cSrcweir 193cdf0e10cSrcweir //------------------------------------------------------------------------ 194cdf0e10cSrcweir 195cdf0e10cSrcweir sal_uInt16 SvxLanguageBox::ImplInsertImgEntry( const String& rEntry, sal_uInt16 nPos, bool bChecked ) 196cdf0e10cSrcweir { 197cdf0e10cSrcweir sal_uInt16 nRet = 0; 198cdf0e10cSrcweir if( !bChecked ) 199cdf0e10cSrcweir nRet = InsertEntry( rEntry, m_aNotCheckedImage, nPos ); 200cdf0e10cSrcweir else if( GetSettings().GetStyleSettings().GetHighContrastMode() ) 201cdf0e10cSrcweir nRet = InsertEntry( rEntry, m_aCheckedImageHC, nPos ); 202cdf0e10cSrcweir else 203cdf0e10cSrcweir nRet = InsertEntry( rEntry, m_aCheckedImage, nPos ); 204cdf0e10cSrcweir return nRet; 205cdf0e10cSrcweir } 206cdf0e10cSrcweir 207cdf0e10cSrcweir //------------------------------------------------------------------------ 208cdf0e10cSrcweir 209cdf0e10cSrcweir void SvxLanguageBox::SetLanguageList( sal_Int16 nLangList, 210cdf0e10cSrcweir sal_Bool bHasLangNone, sal_Bool bLangNoneIsLangAll, sal_Bool bCheckSpellAvail ) 211cdf0e10cSrcweir { 212cdf0e10cSrcweir Clear(); 213cdf0e10cSrcweir 214cdf0e10cSrcweir m_nLangList = nLangList; 215cdf0e10cSrcweir m_bHasLangNone = bHasLangNone; 216cdf0e10cSrcweir m_bLangNoneIsLangAll = bLangNoneIsLangAll; 217cdf0e10cSrcweir m_bWithCheckmark = bCheckSpellAvail; 218cdf0e10cSrcweir 219cdf0e10cSrcweir if ( LANG_LIST_EMPTY != nLangList ) 220cdf0e10cSrcweir { 221cdf0e10cSrcweir Sequence< sal_Int16 > aSpellAvailLang; 222cdf0e10cSrcweir Sequence< sal_Int16 > aHyphAvailLang; 223cdf0e10cSrcweir Sequence< sal_Int16 > aThesAvailLang; 224cdf0e10cSrcweir Sequence< sal_Int16 > aSpellUsedLang; 225cdf0e10cSrcweir Sequence< sal_Int16 > aHyphUsedLang; 226cdf0e10cSrcweir Sequence< sal_Int16 > aThesUsedLang; 227cdf0e10cSrcweir Reference< XAvailableLocales > xAvail( LinguMgr::GetLngSvcMgr(), UNO_QUERY ); 228cdf0e10cSrcweir if (xAvail.is()) 229cdf0e10cSrcweir { 230cdf0e10cSrcweir Sequence< Locale > aTmp; 231cdf0e10cSrcweir 232cdf0e10cSrcweir if (LANG_LIST_SPELL_AVAIL & nLangList) 233cdf0e10cSrcweir { 234cdf0e10cSrcweir aTmp = xAvail->getAvailableLocales( A2OU( SN_SPELLCHECKER ) ); 235cdf0e10cSrcweir aSpellAvailLang = lcl_LocaleSeqToLangSeq( aTmp ); 236cdf0e10cSrcweir } 237cdf0e10cSrcweir if (LANG_LIST_HYPH_AVAIL & nLangList) 238cdf0e10cSrcweir { 239cdf0e10cSrcweir aTmp = xAvail->getAvailableLocales( A2OU( SN_HYPHENATOR ) ); 240cdf0e10cSrcweir aHyphAvailLang = lcl_LocaleSeqToLangSeq( aTmp ); 241cdf0e10cSrcweir } 242cdf0e10cSrcweir if (LANG_LIST_THES_AVAIL & nLangList) 243cdf0e10cSrcweir { 244cdf0e10cSrcweir aTmp = xAvail->getAvailableLocales( A2OU( SN_THESAURUS ) ); 245cdf0e10cSrcweir aThesAvailLang = lcl_LocaleSeqToLangSeq( aTmp ); 246cdf0e10cSrcweir } 247cdf0e10cSrcweir } 248cdf0e10cSrcweir if (LANG_LIST_SPELL_USED & nLangList) 249cdf0e10cSrcweir { 250cdf0e10cSrcweir Reference< XSpellChecker1 > xTmp1( SvxGetSpellChecker(), UNO_QUERY ); 251cdf0e10cSrcweir if (xTmp1.is()) 252cdf0e10cSrcweir aSpellUsedLang = xTmp1->getLanguages(); 253cdf0e10cSrcweir } 254cdf0e10cSrcweir if (LANG_LIST_HYPH_USED & nLangList) 255cdf0e10cSrcweir { 256cdf0e10cSrcweir Reference< XHyphenator > xTmp( SvxGetHyphenator() ); 257cdf0e10cSrcweir if (xTmp.is()) { 258cdf0e10cSrcweir Sequence < Locale > aLocaleSequence( xTmp->getLocales() ); 259cdf0e10cSrcweir aHyphUsedLang = lcl_LocaleSeqToLangSeq( aLocaleSequence ); 260cdf0e10cSrcweir } 261cdf0e10cSrcweir } 262cdf0e10cSrcweir if (LANG_LIST_THES_USED & nLangList) 263cdf0e10cSrcweir { 264cdf0e10cSrcweir Reference< XThesaurus > xTmp( SvxGetThesaurus() ); 265cdf0e10cSrcweir if (xTmp.is()) { 266cdf0e10cSrcweir Sequence < Locale > aLocaleSequence( xTmp->getLocales() ); 267cdf0e10cSrcweir aThesUsedLang = lcl_LocaleSeqToLangSeq( aLocaleSequence ); 268cdf0e10cSrcweir } 269cdf0e10cSrcweir } 270cdf0e10cSrcweir 271cdf0e10cSrcweir SvtLanguageTable aLangTable; 272cdf0e10cSrcweir ::com::sun::star::uno::Sequence< sal_uInt16 > xKnown; 273cdf0e10cSrcweir const sal_uInt16* pKnown; 274cdf0e10cSrcweir sal_uInt32 nCount; 275cdf0e10cSrcweir if ( nLangList & LANG_LIST_ONLY_KNOWN ) 276cdf0e10cSrcweir { 277cdf0e10cSrcweir xKnown = LocaleDataWrapper::getInstalledLanguageTypes(); 278cdf0e10cSrcweir pKnown = xKnown.getConstArray(); 279cdf0e10cSrcweir nCount = xKnown.getLength(); 280cdf0e10cSrcweir } 281cdf0e10cSrcweir else 282cdf0e10cSrcweir { 283cdf0e10cSrcweir nCount = aLangTable.GetEntryCount(); 284cdf0e10cSrcweir pKnown = NULL; 285cdf0e10cSrcweir } 286cdf0e10cSrcweir for ( sal_uInt32 i = 0; i < nCount; i++ ) 287cdf0e10cSrcweir { 288cdf0e10cSrcweir LanguageType nLangType; 289cdf0e10cSrcweir if ( nLangList & LANG_LIST_ONLY_KNOWN ) 290cdf0e10cSrcweir nLangType = pKnown[i]; 291cdf0e10cSrcweir else 292cdf0e10cSrcweir nLangType = aLangTable.GetTypeAtIndex( i ); 293cdf0e10cSrcweir if ( nLangType != LANGUAGE_DONTKNOW && 294cdf0e10cSrcweir nLangType != LANGUAGE_SYSTEM && 295cdf0e10cSrcweir nLangType != LANGUAGE_NONE && 296cdf0e10cSrcweir (nLangType < LANGUAGE_USER1 || nLangType > LANGUAGE_USER9) && 297cdf0e10cSrcweir (MsLangId::getSubLanguage( nLangType) != 0 || 298cdf0e10cSrcweir (nLangList & LANG_LIST_ALSO_PRIMARY_ONLY)) && 299cdf0e10cSrcweir ((nLangList & LANG_LIST_ALL) != 0 || 300cdf0e10cSrcweir ((nLangList & LANG_LIST_WESTERN) != 0 && 301cdf0e10cSrcweir (SvtLanguageOptions::GetScriptTypeOfLanguage(nLangType) == 302cdf0e10cSrcweir SCRIPTTYPE_LATIN)) || 303cdf0e10cSrcweir ((nLangList & LANG_LIST_CTL) != 0 && 304cdf0e10cSrcweir (SvtLanguageOptions::GetScriptTypeOfLanguage(nLangType) == 305cdf0e10cSrcweir SCRIPTTYPE_COMPLEX)) || 306cdf0e10cSrcweir ((nLangList & LANG_LIST_CJK) != 0 && 307cdf0e10cSrcweir (SvtLanguageOptions::GetScriptTypeOfLanguage(nLangType) == 308cdf0e10cSrcweir SCRIPTTYPE_ASIAN)) || 309cdf0e10cSrcweir ((nLangList & LANG_LIST_FBD_CHARS) != 0 && 310cdf0e10cSrcweir MsLangId::hasForbiddenCharacters(nLangType)) || 311cdf0e10cSrcweir ((nLangList & LANG_LIST_SPELL_AVAIL) != 0 && 312cdf0e10cSrcweir lcl_SeqHasLang(aSpellAvailLang, nLangType)) || 313cdf0e10cSrcweir ((nLangList & LANG_LIST_HYPH_AVAIL) != 0 && 314cdf0e10cSrcweir lcl_SeqHasLang(aHyphAvailLang, nLangType)) || 315cdf0e10cSrcweir ((nLangList & LANG_LIST_THES_AVAIL) != 0 && 316cdf0e10cSrcweir lcl_SeqHasLang(aThesAvailLang, nLangType)) || 317cdf0e10cSrcweir ((nLangList & LANG_LIST_SPELL_USED) != 0 && 318cdf0e10cSrcweir lcl_SeqHasLang(aSpellUsedLang, nLangType)) || 319cdf0e10cSrcweir ((nLangList & LANG_LIST_HYPH_USED) != 0 && 320cdf0e10cSrcweir lcl_SeqHasLang(aHyphUsedLang, nLangType)) || 321cdf0e10cSrcweir ((nLangList & LANG_LIST_THES_USED) != 0 && 322cdf0e10cSrcweir lcl_SeqHasLang(aThesUsedLang, nLangType))) ) 323cdf0e10cSrcweir InsertLanguage( nLangType ); 324cdf0e10cSrcweir } 325cdf0e10cSrcweir 326cdf0e10cSrcweir if (bHasLangNone) 327cdf0e10cSrcweir InsertLanguage( LANGUAGE_NONE ); 328cdf0e10cSrcweir } 329cdf0e10cSrcweir } 330cdf0e10cSrcweir 331cdf0e10cSrcweir //------------------------------------------------------------------------ 332cdf0e10cSrcweir 333cdf0e10cSrcweir sal_uInt16 SvxLanguageBox::InsertLanguage( const LanguageType nLangType, sal_uInt16 nPos ) 334cdf0e10cSrcweir { 335cdf0e10cSrcweir return ImplInsertLanguage( nLangType, nPos, ::com::sun::star::i18n::ScriptType::WEAK ); 336cdf0e10cSrcweir } 337cdf0e10cSrcweir 338cdf0e10cSrcweir //------------------------------------------------------------------------ 339cdf0e10cSrcweir 340cdf0e10cSrcweir sal_uInt16 SvxLanguageBox::ImplInsertLanguage( const LanguageType nLangType, sal_uInt16 nPos, sal_Int16 nType ) 341cdf0e10cSrcweir { 342cdf0e10cSrcweir LanguageType nLang = MsLangId::getReplacementForObsoleteLanguage( nLangType); 343cdf0e10cSrcweir // For obsolete and to be replaced languages check whether an entry of the 344cdf0e10cSrcweir // replacement already exists and if so don't add an entry with identical 345cdf0e10cSrcweir // string as would be returned by SvtLanguageTable::GetString(). 346cdf0e10cSrcweir if (nLang != nLangType) 347cdf0e10cSrcweir { 348cdf0e10cSrcweir sal_uInt16 nAt = TypeToPos_Impl( nLang, *this ); 349cdf0e10cSrcweir if ( nAt != LISTBOX_ENTRY_NOTFOUND ) 350cdf0e10cSrcweir return nAt; 351cdf0e10cSrcweir } 352cdf0e10cSrcweir 353cdf0e10cSrcweir String aStrEntry = m_pLangTable->GetString( nLang ); 354cdf0e10cSrcweir if (LANGUAGE_NONE == nLang && m_bHasLangNone && m_bLangNoneIsLangAll) 355cdf0e10cSrcweir aStrEntry = m_aAllString; 356cdf0e10cSrcweir 357cdf0e10cSrcweir LanguageType nRealLang = nLang; 358cdf0e10cSrcweir if (nRealLang == LANGUAGE_SYSTEM) 359cdf0e10cSrcweir { 360cdf0e10cSrcweir nRealLang = MsLangId::resolveSystemLanguageByScriptType(nRealLang, nType); 361cdf0e10cSrcweir aStrEntry.AppendAscii(" - "); 362cdf0e10cSrcweir aStrEntry.Append(m_pLangTable->GetString( nRealLang )); 363cdf0e10cSrcweir } 364cdf0e10cSrcweir 365cdf0e10cSrcweir aStrEntry = ApplyLreOrRleEmbedding( aStrEntry ); 366cdf0e10cSrcweir 367cdf0e10cSrcweir sal_uInt16 nAt = 0; 368cdf0e10cSrcweir if ( m_bWithCheckmark ) 369cdf0e10cSrcweir { 370cdf0e10cSrcweir sal_Bool bFound = sal_False; 371cdf0e10cSrcweir 372cdf0e10cSrcweir if (!m_pSpellUsedLang) 373cdf0e10cSrcweir { 374cdf0e10cSrcweir Reference< XSpellChecker1 > xSpell( SvxGetSpellChecker(), UNO_QUERY ); 375cdf0e10cSrcweir if ( xSpell.is() ) 376cdf0e10cSrcweir m_pSpellUsedLang = new Sequence< sal_Int16 >( xSpell->getLanguages() ); 377cdf0e10cSrcweir } 378cdf0e10cSrcweir bFound = m_pSpellUsedLang ? 379cdf0e10cSrcweir lcl_SeqHasLang( *m_pSpellUsedLang, nRealLang ) : sal_False; 380cdf0e10cSrcweir 381cdf0e10cSrcweir nAt = ImplInsertImgEntry( aStrEntry, nPos, bFound ); 382cdf0e10cSrcweir } 383cdf0e10cSrcweir else 384cdf0e10cSrcweir nAt = InsertEntry( aStrEntry, nPos ); 385cdf0e10cSrcweir 386cdf0e10cSrcweir SetEntryData( nAt, (void*)(sal_uIntPtr)nLangType ); 387cdf0e10cSrcweir return nAt; 388cdf0e10cSrcweir } 389cdf0e10cSrcweir 390cdf0e10cSrcweir //------------------------------------------------------------------------ 391cdf0e10cSrcweir 392cdf0e10cSrcweir sal_uInt16 SvxLanguageBox::InsertDefaultLanguage( sal_Int16 nType, sal_uInt16 nPos ) 393cdf0e10cSrcweir { 394cdf0e10cSrcweir return ImplInsertLanguage( LANGUAGE_SYSTEM, nPos, nType ); 395cdf0e10cSrcweir } 396cdf0e10cSrcweir 397cdf0e10cSrcweir //------------------------------------------------------------------------ 398cdf0e10cSrcweir 399cdf0e10cSrcweir sal_uInt16 SvxLanguageBox::InsertLanguage( const LanguageType nLangType, 400cdf0e10cSrcweir sal_Bool bCheckEntry, sal_uInt16 nPos ) 401cdf0e10cSrcweir { 402cdf0e10cSrcweir LanguageType nLang = MsLangId::getReplacementForObsoleteLanguage( nLangType); 403cdf0e10cSrcweir // For obsolete and to be replaced languages check whether an entry of the 404cdf0e10cSrcweir // replacement already exists and if so don't add an entry with identical 405cdf0e10cSrcweir // string as would be returned by SvtLanguageTable::GetString(). 406cdf0e10cSrcweir if (nLang != nLangType) 407cdf0e10cSrcweir { 408cdf0e10cSrcweir sal_uInt16 nAt = TypeToPos_Impl( nLang, *this ); 409cdf0e10cSrcweir if ( nAt != LISTBOX_ENTRY_NOTFOUND ) 410cdf0e10cSrcweir return nAt; 411cdf0e10cSrcweir } 412cdf0e10cSrcweir 413cdf0e10cSrcweir String aStrEntry = m_pLangTable->GetString( nLang ); 414cdf0e10cSrcweir if (LANGUAGE_NONE == nLang && m_bHasLangNone && m_bLangNoneIsLangAll) 415cdf0e10cSrcweir aStrEntry = m_aAllString; 416cdf0e10cSrcweir 417cdf0e10cSrcweir sal_uInt16 nAt = ImplInsertImgEntry( aStrEntry, nPos, bCheckEntry ); 418cdf0e10cSrcweir SetEntryData( nAt, (void*)(sal_uIntPtr)nLang ); 419cdf0e10cSrcweir 420cdf0e10cSrcweir return nAt; 421cdf0e10cSrcweir } 422cdf0e10cSrcweir 423cdf0e10cSrcweir //------------------------------------------------------------------------ 424cdf0e10cSrcweir 425cdf0e10cSrcweir void SvxLanguageBox::RemoveLanguage( const LanguageType eLangType ) 426cdf0e10cSrcweir { 427cdf0e10cSrcweir sal_uInt16 nAt = TypeToPos_Impl( eLangType, *this ); 428cdf0e10cSrcweir 429cdf0e10cSrcweir if ( nAt != LISTBOX_ENTRY_NOTFOUND ) 430cdf0e10cSrcweir RemoveEntry( nAt ); 431cdf0e10cSrcweir } 432cdf0e10cSrcweir 433cdf0e10cSrcweir //------------------------------------------------------------------------ 434cdf0e10cSrcweir 435cdf0e10cSrcweir LanguageType SvxLanguageBox::GetSelectLanguage() const 436cdf0e10cSrcweir { 437cdf0e10cSrcweir sal_uInt16 nPos = GetSelectEntryPos(); 438cdf0e10cSrcweir 439cdf0e10cSrcweir if ( nPos != LISTBOX_ENTRY_NOTFOUND ) 440cdf0e10cSrcweir return LanguageType( (sal_uIntPtr)GetEntryData(nPos) ); 441cdf0e10cSrcweir else 442cdf0e10cSrcweir return LanguageType( LANGUAGE_DONTKNOW ); 443cdf0e10cSrcweir } 444cdf0e10cSrcweir 445cdf0e10cSrcweir //------------------------------------------------------------------------ 446cdf0e10cSrcweir 447cdf0e10cSrcweir void SvxLanguageBox::SelectLanguage( const LanguageType eLangType, sal_Bool bSelect ) 448cdf0e10cSrcweir { 449cdf0e10cSrcweir // If the core uses a LangID of an imported MS document and wants to select 450cdf0e10cSrcweir // a language that is replaced, we need to select the replacement instead. 451cdf0e10cSrcweir LanguageType nLang = MsLangId::getReplacementForObsoleteLanguage( eLangType); 452cdf0e10cSrcweir 453cdf0e10cSrcweir sal_uInt16 nAt = TypeToPos_Impl( nLang, *this ); 454cdf0e10cSrcweir 455cdf0e10cSrcweir if ( nAt != LISTBOX_ENTRY_NOTFOUND ) 456cdf0e10cSrcweir SelectEntryPos( nAt, bSelect ); 457cdf0e10cSrcweir } 458cdf0e10cSrcweir 459cdf0e10cSrcweir //------------------------------------------------------------------------ 460cdf0e10cSrcweir 461cdf0e10cSrcweir sal_Bool SvxLanguageBox::IsLanguageSelected( const LanguageType eLangType ) const 462cdf0e10cSrcweir { 463cdf0e10cSrcweir // Same here, work on the replacement if applicable. 464cdf0e10cSrcweir LanguageType nLang = MsLangId::getReplacementForObsoleteLanguage( eLangType); 465cdf0e10cSrcweir 466cdf0e10cSrcweir sal_uInt16 nAt = TypeToPos_Impl( nLang, *this ); 467cdf0e10cSrcweir 468cdf0e10cSrcweir if ( nAt != LISTBOX_ENTRY_NOTFOUND ) 469cdf0e10cSrcweir return IsEntryPosSelected( nAt ); 470cdf0e10cSrcweir else 471cdf0e10cSrcweir return sal_False; 472cdf0e10cSrcweir } 473cdf0e10cSrcweir 474cdf0e10cSrcweir #if ENABLE_LAYOUT 475cdf0e10cSrcweir 476cdf0e10cSrcweir namespace layout 477cdf0e10cSrcweir { 478cdf0e10cSrcweir 479cdf0e10cSrcweir SvxLanguageBox::~SvxLanguageBox () 480cdf0e10cSrcweir { 481cdf0e10cSrcweir } 482cdf0e10cSrcweir 483cdf0e10cSrcweir SvxLanguageBox::SvxLanguageBox( Context* pParent, const char* pFile, sal_Bool bCheck ) 484cdf0e10cSrcweir : ListBox ( pParent, pFile, bCheck ) 485cdf0e10cSrcweir { 486cdf0e10cSrcweir } 487cdf0e10cSrcweir 488cdf0e10cSrcweir void SvxLanguageBox::SetLanguageList( sal_Int16/*list*/, bool/*hasLangNone*/, bool /*langNoneIsLangAll*/, bool /*checkSpellAvail*/) 489cdf0e10cSrcweir { 490cdf0e10cSrcweir } 491cdf0e10cSrcweir 492cdf0e10cSrcweir sal_uInt16 SvxLanguageBox::InsertLanguage( const LanguageType/*type*/, sal_uInt16/*pos*/) 493cdf0e10cSrcweir { 494cdf0e10cSrcweir return 0; 495cdf0e10cSrcweir } 496cdf0e10cSrcweir sal_uInt16 SvxLanguageBox::InsertLanguage( const LanguageType/*type*/, bool/*checkEntry*/, sal_uInt16 /*pos*/) 497cdf0e10cSrcweir { 498cdf0e10cSrcweir return 0; 499cdf0e10cSrcweir } 500cdf0e10cSrcweir void SvxLanguageBox::RemoveLanguage( const LanguageType/*type*/) 501cdf0e10cSrcweir { 502cdf0e10cSrcweir } 503cdf0e10cSrcweir void SvxLanguageBox::SelectLanguage( const LanguageType/*type*/, bool/*select*/) 504cdf0e10cSrcweir { 505cdf0e10cSrcweir } 506cdf0e10cSrcweir LanguageType SvxLanguageBox::GetSelectLanguage() const 507cdf0e10cSrcweir { 508cdf0e10cSrcweir return 0; 509cdf0e10cSrcweir } 510cdf0e10cSrcweir bool SvxLanguageBox::IsLanguageSelected( const LanguageType/*type*/) const 511cdf0e10cSrcweir { 512cdf0e10cSrcweir return true; 513cdf0e10cSrcweir } 514cdf0e10cSrcweir 515cdf0e10cSrcweir /*IMPL_IMPL (SvxLanguageBox, ListBox); 516cdf0e10cSrcweir IMPL_CONSTRUCTORS ( SvxLanguageBox, ListBox, "svxlanguagebox" ); 517cdf0e10cSrcweir IMPL_GET_IMPL( SvxLanguageBox ); 518cdf0e10cSrcweir IMPL_GET_WINDOW (SvxLanguageBox);*/ 519cdf0e10cSrcweir }; 520cdf0e10cSrcweir 521cdf0e10cSrcweir #endif 522cdf0e10cSrcweir 523