/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /************************************************************************* * * 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 * * for a copy of the LGPLv3 License. * ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_svx.hxx" // include --------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace ::com::sun::star::util; using namespace ::com::sun::star::lang; using namespace ::com::sun::star::linguistic2; using namespace ::com::sun::star::uno; // ----------------------------------------------------------------------- String GetDicInfoStr( const String& rName, const USHORT nLang, BOOL bNeg ) { INetURLObject aURLObj; aURLObj.SetSmartProtocol( INET_PROT_FILE ); aURLObj.SetSmartURL( rName, INetURLObject::ENCODE_ALL ); String aTmp( aURLObj.GetBase() ); aTmp += sal_Unicode( ' ' ); if ( bNeg ) { sal_Char const sTmp[] = " (-) "; aTmp.AppendAscii( sTmp ); } if ( LANGUAGE_NONE == nLang ) aTmp += String( ResId( RID_SVXSTR_LANGUAGE_ALL, DIALOG_MGR() ) ); else { aTmp += sal_Unicode( '[' ); aTmp += SvtLanguageTable::GetLanguageString( (LanguageType)nLang ); aTmp += sal_Unicode( ']' ); } return aTmp; } //======================================================================== // misc local helper functions //======================================================================== static Sequence< INT16 > lcl_LocaleSeqToLangSeq( Sequence< Locale > &rSeq ) { const Locale *pLocale = rSeq.getConstArray(); INT32 nCount = rSeq.getLength(); Sequence< INT16 > aLangs( nCount ); INT16 *pLang = aLangs.getArray(); for (INT32 i = 0; i < nCount; ++i) { pLang[i] = SvxLocaleToLanguage( pLocale[i] ); } return aLangs; } static BOOL lcl_SeqHasLang( const Sequence< INT16 > & rLangSeq, INT16 nLang ) { INT32 i = -1; INT32 nLen = rLangSeq.getLength(); if (nLen) { const INT16 *pLang = rLangSeq.getConstArray(); for (i = 0; i < nLen; ++i) { if (nLang == pLang[i]) break; } } return i >= 0 && i < nLen; } //======================================================================== // class SvxLanguageBox //======================================================================== USHORT TypeToPos_Impl( LanguageType eType, const ListBox& rLb ) { USHORT nPos = LISTBOX_ENTRY_NOTFOUND; USHORT nCount = rLb.GetEntryCount(); for ( USHORT i=0; nPos == LISTBOX_ENTRY_NOTFOUND && i aSpellAvailLang; Sequence< INT16 > aHyphAvailLang; Sequence< INT16 > aThesAvailLang; Sequence< INT16 > aSpellUsedLang; Sequence< INT16 > aHyphUsedLang; Sequence< INT16 > aThesUsedLang; Reference< XAvailableLocales > xAvail( LinguMgr::GetLngSvcMgr(), UNO_QUERY ); if (xAvail.is()) { Sequence< Locale > aTmp; if (LANG_LIST_SPELL_AVAIL & nLangList) { aTmp = xAvail->getAvailableLocales( A2OU( SN_SPELLCHECKER ) ); aSpellAvailLang = lcl_LocaleSeqToLangSeq( aTmp ); } if (LANG_LIST_HYPH_AVAIL & nLangList) { aTmp = xAvail->getAvailableLocales( A2OU( SN_HYPHENATOR ) ); aHyphAvailLang = lcl_LocaleSeqToLangSeq( aTmp ); } if (LANG_LIST_THES_AVAIL & nLangList) { aTmp = xAvail->getAvailableLocales( A2OU( SN_THESAURUS ) ); aThesAvailLang = lcl_LocaleSeqToLangSeq( aTmp ); } } if (LANG_LIST_SPELL_USED & nLangList) { Reference< XSpellChecker1 > xTmp1( SvxGetSpellChecker(), UNO_QUERY ); if (xTmp1.is()) aSpellUsedLang = xTmp1->getLanguages(); } if (LANG_LIST_HYPH_USED & nLangList) { Reference< XHyphenator > xTmp( SvxGetHyphenator() ); if (xTmp.is()) { Sequence < Locale > aLocaleSequence( xTmp->getLocales() ); aHyphUsedLang = lcl_LocaleSeqToLangSeq( aLocaleSequence ); } } if (LANG_LIST_THES_USED & nLangList) { Reference< XThesaurus > xTmp( SvxGetThesaurus() ); if (xTmp.is()) { Sequence < Locale > aLocaleSequence( xTmp->getLocales() ); aThesUsedLang = lcl_LocaleSeqToLangSeq( aLocaleSequence ); } } SvtLanguageTable aLangTable; ::com::sun::star::uno::Sequence< sal_uInt16 > xKnown; const sal_uInt16* pKnown; sal_uInt32 nCount; if ( nLangList & LANG_LIST_ONLY_KNOWN ) { xKnown = LocaleDataWrapper::getInstalledLanguageTypes(); pKnown = xKnown.getConstArray(); nCount = xKnown.getLength(); } else { nCount = aLangTable.GetEntryCount(); pKnown = NULL; } for ( sal_uInt32 i = 0; i < nCount; i++ ) { LanguageType nLangType; if ( nLangList & LANG_LIST_ONLY_KNOWN ) nLangType = pKnown[i]; else nLangType = aLangTable.GetTypeAtIndex( i ); if ( nLangType != LANGUAGE_DONTKNOW && nLangType != LANGUAGE_SYSTEM && nLangType != LANGUAGE_NONE && (nLangType < LANGUAGE_USER1 || nLangType > LANGUAGE_USER9) && (MsLangId::getSubLanguage( nLangType) != 0 || (nLangList & LANG_LIST_ALSO_PRIMARY_ONLY)) && ((nLangList & LANG_LIST_ALL) != 0 || ((nLangList & LANG_LIST_WESTERN) != 0 && (SvtLanguageOptions::GetScriptTypeOfLanguage(nLangType) == SCRIPTTYPE_LATIN)) || ((nLangList & LANG_LIST_CTL) != 0 && (SvtLanguageOptions::GetScriptTypeOfLanguage(nLangType) == SCRIPTTYPE_COMPLEX)) || ((nLangList & LANG_LIST_CJK) != 0 && (SvtLanguageOptions::GetScriptTypeOfLanguage(nLangType) == SCRIPTTYPE_ASIAN)) || ((nLangList & LANG_LIST_FBD_CHARS) != 0 && MsLangId::hasForbiddenCharacters(nLangType)) || ((nLangList & LANG_LIST_SPELL_AVAIL) != 0 && lcl_SeqHasLang(aSpellAvailLang, nLangType)) || ((nLangList & LANG_LIST_HYPH_AVAIL) != 0 && lcl_SeqHasLang(aHyphAvailLang, nLangType)) || ((nLangList & LANG_LIST_THES_AVAIL) != 0 && lcl_SeqHasLang(aThesAvailLang, nLangType)) || ((nLangList & LANG_LIST_SPELL_USED) != 0 && lcl_SeqHasLang(aSpellUsedLang, nLangType)) || ((nLangList & LANG_LIST_HYPH_USED) != 0 && lcl_SeqHasLang(aHyphUsedLang, nLangType)) || ((nLangList & LANG_LIST_THES_USED) != 0 && lcl_SeqHasLang(aThesUsedLang, nLangType))) ) InsertLanguage( nLangType ); } if (bHasLangNone) InsertLanguage( LANGUAGE_NONE ); } } //------------------------------------------------------------------------ USHORT SvxLanguageBox::InsertLanguage( const LanguageType nLangType, USHORT nPos ) { return ImplInsertLanguage( nLangType, nPos, ::com::sun::star::i18n::ScriptType::WEAK ); } //------------------------------------------------------------------------ USHORT SvxLanguageBox::ImplInsertLanguage( const LanguageType nLangType, USHORT nPos, sal_Int16 nType ) { LanguageType nLang = MsLangId::getReplacementForObsoleteLanguage( nLangType); // For obsolete and to be replaced languages check whether an entry of the // replacement already exists and if so don't add an entry with identical // string as would be returned by SvtLanguageTable::GetString(). if (nLang != nLangType) { USHORT nAt = TypeToPos_Impl( nLang, *this ); if ( nAt != LISTBOX_ENTRY_NOTFOUND ) return nAt; } String aStrEntry = m_pLangTable->GetString( nLang ); if (LANGUAGE_NONE == nLang && m_bHasLangNone && m_bLangNoneIsLangAll) aStrEntry = m_aAllString; LanguageType nRealLang = nLang; if (nRealLang == LANGUAGE_SYSTEM) { nRealLang = MsLangId::resolveSystemLanguageByScriptType(nRealLang, nType); aStrEntry.AppendAscii(" - "); aStrEntry.Append(m_pLangTable->GetString( nRealLang )); } aStrEntry = ApplyLreOrRleEmbedding( aStrEntry ); USHORT nAt = 0; if ( m_bWithCheckmark ) { sal_Bool bFound = sal_False; if (!m_pSpellUsedLang) { Reference< XSpellChecker1 > xSpell( SvxGetSpellChecker(), UNO_QUERY ); if ( xSpell.is() ) m_pSpellUsedLang = new Sequence< INT16 >( xSpell->getLanguages() ); } bFound = m_pSpellUsedLang ? lcl_SeqHasLang( *m_pSpellUsedLang, nRealLang ) : FALSE; nAt = ImplInsertImgEntry( aStrEntry, nPos, bFound ); } else nAt = InsertEntry( aStrEntry, nPos ); SetEntryData( nAt, (void*)(ULONG)nLangType ); return nAt; } //------------------------------------------------------------------------ USHORT SvxLanguageBox::InsertDefaultLanguage( sal_Int16 nType, USHORT nPos ) { return ImplInsertLanguage( LANGUAGE_SYSTEM, nPos, nType ); } //------------------------------------------------------------------------ USHORT SvxLanguageBox::InsertLanguage( const LanguageType nLangType, BOOL bCheckEntry, USHORT nPos ) { LanguageType nLang = MsLangId::getReplacementForObsoleteLanguage( nLangType); // For obsolete and to be replaced languages check whether an entry of the // replacement already exists and if so don't add an entry with identical // string as would be returned by SvtLanguageTable::GetString(). if (nLang != nLangType) { USHORT nAt = TypeToPos_Impl( nLang, *this ); if ( nAt != LISTBOX_ENTRY_NOTFOUND ) return nAt; } String aStrEntry = m_pLangTable->GetString( nLang ); if (LANGUAGE_NONE == nLang && m_bHasLangNone && m_bLangNoneIsLangAll) aStrEntry = m_aAllString; USHORT nAt = ImplInsertImgEntry( aStrEntry, nPos, bCheckEntry ); SetEntryData( nAt, (void*)(ULONG)nLang ); return nAt; } //------------------------------------------------------------------------ void SvxLanguageBox::RemoveLanguage( const LanguageType eLangType ) { USHORT nAt = TypeToPos_Impl( eLangType, *this ); if ( nAt != LISTBOX_ENTRY_NOTFOUND ) RemoveEntry( nAt ); } //------------------------------------------------------------------------ LanguageType SvxLanguageBox::GetSelectLanguage() const { USHORT nPos = GetSelectEntryPos(); if ( nPos != LISTBOX_ENTRY_NOTFOUND ) return LanguageType( (ULONG)GetEntryData(nPos) ); else return LanguageType( LANGUAGE_DONTKNOW ); } //------------------------------------------------------------------------ void SvxLanguageBox::SelectLanguage( const LanguageType eLangType, BOOL bSelect ) { // If the core uses a LangID of an imported MS document and wants to select // a language that is replaced, we need to select the replacement instead. LanguageType nLang = MsLangId::getReplacementForObsoleteLanguage( eLangType); USHORT nAt = TypeToPos_Impl( nLang, *this ); if ( nAt != LISTBOX_ENTRY_NOTFOUND ) SelectEntryPos( nAt, bSelect ); } //------------------------------------------------------------------------ BOOL SvxLanguageBox::IsLanguageSelected( const LanguageType eLangType ) const { // Same here, work on the replacement if applicable. LanguageType nLang = MsLangId::getReplacementForObsoleteLanguage( eLangType); USHORT nAt = TypeToPos_Impl( nLang, *this ); if ( nAt != LISTBOX_ENTRY_NOTFOUND ) return IsEntryPosSelected( nAt ); else return FALSE; } #if ENABLE_LAYOUT namespace layout { SvxLanguageBox::~SvxLanguageBox () { } SvxLanguageBox::SvxLanguageBox( Context* pParent, const char* pFile, BOOL bCheck ) : ListBox ( pParent, pFile, bCheck ) { } void SvxLanguageBox::SetLanguageList( sal_Int16/*list*/, bool/*hasLangNone*/, bool /*langNoneIsLangAll*/, bool /*checkSpellAvail*/) { } sal_uInt16 SvxLanguageBox::InsertLanguage( const LanguageType/*type*/, sal_uInt16/*pos*/) { return 0; } sal_uInt16 SvxLanguageBox::InsertLanguage( const LanguageType/*type*/, bool/*checkEntry*/, sal_uInt16 /*pos*/) { return 0; } void SvxLanguageBox::RemoveLanguage( const LanguageType/*type*/) { } void SvxLanguageBox::SelectLanguage( const LanguageType/*type*/, bool/*select*/) { } LanguageType SvxLanguageBox::GetSelectLanguage() const { return 0; } bool SvxLanguageBox::IsLanguageSelected( const LanguageType/*type*/) const { return true; } /*IMPL_IMPL (SvxLanguageBox, ListBox); IMPL_CONSTRUCTORS ( SvxLanguageBox, ListBox, "svxlanguagebox" ); IMPL_GET_IMPL( SvxLanguageBox ); IMPL_GET_WINDOW (SvxLanguageBox);*/ }; #endif /* vim:set shiftwidth=4 softtabstop=4 expandtab: */