xref: /aoo41x/main/svx/source/dialog/langbox.cxx (revision f6e50924)
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
10*f6e50924SAndrew Rist  *
11*f6e50924SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*f6e50924SAndrew Rist  *
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.
19*f6e50924SAndrew Rist  *
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 
GetDicInfoStr(const String & rName,const sal_uInt16 nLang,sal_Bool bNeg)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 
lcl_LocaleSeqToLangSeq(Sequence<Locale> & rSeq)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 
lcl_SeqHasLang(const Sequence<sal_Int16> & rLangSeq,sal_Int16 nLang)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 
TypeToPos_Impl(LanguageType eType,const ListBox & rLb)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 //-----------------------------------------------------------------------
SvxLanguageBox(Window * pParent,WinBits nWinStyle,sal_Bool bCheck)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 //------------------------------------------------------------------------
SvxLanguageBox(Window * pParent,const ResId & rResId,sal_Bool bCheck)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 //------------------------------------------------------------------------
Init()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 
~SvxLanguageBox()187cdf0e10cSrcweir SvxLanguageBox::~SvxLanguageBox()
188cdf0e10cSrcweir {
189cdf0e10cSrcweir     delete m_pSpellUsedLang;
190cdf0e10cSrcweir 	delete m_pLangTable;
191cdf0e10cSrcweir }
192cdf0e10cSrcweir 
193cdf0e10cSrcweir //------------------------------------------------------------------------
194cdf0e10cSrcweir 
ImplInsertImgEntry(const String & rEntry,sal_uInt16 nPos,bool bChecked)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 
SetLanguageList(sal_Int16 nLangList,sal_Bool bHasLangNone,sal_Bool bLangNoneIsLangAll,sal_Bool bCheckSpellAvail)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 
InsertLanguage(const LanguageType nLangType,sal_uInt16 nPos)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 
ImplInsertLanguage(const LanguageType nLangType,sal_uInt16 nPos,sal_Int16 nType)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 
InsertDefaultLanguage(sal_Int16 nType,sal_uInt16 nPos)392cdf0e10cSrcweir sal_uInt16 SvxLanguageBox::InsertDefaultLanguage( sal_Int16 nType, sal_uInt16 nPos )
393cdf0e10cSrcweir {
394cdf0e10cSrcweir     return ImplInsertLanguage( LANGUAGE_SYSTEM, nPos, nType );
395cdf0e10cSrcweir }
396cdf0e10cSrcweir 
397cdf0e10cSrcweir //------------------------------------------------------------------------
398cdf0e10cSrcweir 
InsertLanguage(const LanguageType nLangType,sal_Bool bCheckEntry,sal_uInt16 nPos)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 
RemoveLanguage(const LanguageType eLangType)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 
GetSelectLanguage() const435cdf0e10cSrcweir 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 
SelectLanguage(const LanguageType eLangType,sal_Bool bSelect)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 
IsLanguageSelected(const LanguageType eLangType) const461cdf0e10cSrcweir 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 
~SvxLanguageBox()479cdf0e10cSrcweir SvxLanguageBox::~SvxLanguageBox ()
480cdf0e10cSrcweir {
481cdf0e10cSrcweir }
482cdf0e10cSrcweir 
SvxLanguageBox(Context * pParent,const char * pFile,sal_Bool bCheck)483cdf0e10cSrcweir SvxLanguageBox::SvxLanguageBox( Context* pParent, const char* pFile, sal_Bool bCheck )
484cdf0e10cSrcweir : ListBox ( pParent, pFile, bCheck )
485cdf0e10cSrcweir {
486cdf0e10cSrcweir }
487cdf0e10cSrcweir 
SetLanguageList(sal_Int16,bool,bool,bool)488cdf0e10cSrcweir void SvxLanguageBox::SetLanguageList( sal_Int16/*list*/, bool/*hasLangNone*/, bool /*langNoneIsLangAll*/, bool /*checkSpellAvail*/)
489cdf0e10cSrcweir {
490cdf0e10cSrcweir }
491cdf0e10cSrcweir 
InsertLanguage(const LanguageType,sal_uInt16)492cdf0e10cSrcweir sal_uInt16 SvxLanguageBox::InsertLanguage( const LanguageType/*type*/, sal_uInt16/*pos*/)
493cdf0e10cSrcweir {
494cdf0e10cSrcweir     return 0;
495cdf0e10cSrcweir }
InsertLanguage(const LanguageType,bool,sal_uInt16)496cdf0e10cSrcweir sal_uInt16 SvxLanguageBox::InsertLanguage( const LanguageType/*type*/, bool/*checkEntry*/, sal_uInt16 /*pos*/)
497cdf0e10cSrcweir {
498cdf0e10cSrcweir     return 0;
499cdf0e10cSrcweir }
RemoveLanguage(const LanguageType)500cdf0e10cSrcweir void SvxLanguageBox::RemoveLanguage( const LanguageType/*type*/)
501cdf0e10cSrcweir {
502cdf0e10cSrcweir }
SelectLanguage(const LanguageType,bool)503cdf0e10cSrcweir void SvxLanguageBox::SelectLanguage( const LanguageType/*type*/, bool/*select*/)
504cdf0e10cSrcweir {
505cdf0e10cSrcweir }
GetSelectLanguage() const506cdf0e10cSrcweir LanguageType SvxLanguageBox::GetSelectLanguage() const
507cdf0e10cSrcweir {
508cdf0e10cSrcweir     return 0;
509cdf0e10cSrcweir }
IsLanguageSelected(const LanguageType) const510cdf0e10cSrcweir 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