1*6d739b60SAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
3*6d739b60SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4*6d739b60SAndrew Rist * or more contributor license agreements. See the NOTICE file
5*6d739b60SAndrew Rist * distributed with this work for additional information
6*6d739b60SAndrew Rist * regarding copyright ownership. The ASF licenses this file
7*6d739b60SAndrew Rist * to you under the Apache License, Version 2.0 (the
8*6d739b60SAndrew Rist * "License"); you may not use this file except in compliance
9*6d739b60SAndrew Rist * with the License. You may obtain a copy of the License at
10cdf0e10cSrcweir *
11*6d739b60SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir *
13*6d739b60SAndrew Rist * Unless required by applicable law or agreed to in writing,
14*6d739b60SAndrew Rist * software distributed under the License is distributed on an
15*6d739b60SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*6d739b60SAndrew Rist * KIND, either express or implied. See the License for the
17*6d739b60SAndrew Rist * specific language governing permissions and limitations
18*6d739b60SAndrew Rist * under the License.
19cdf0e10cSrcweir *
20*6d739b60SAndrew Rist *************************************************************/
21*6d739b60SAndrew Rist
22*6d739b60SAndrew Rist
23cdf0e10cSrcweir
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_framework.hxx"
26cdf0e10cSrcweir
27cdf0e10cSrcweir #include <com/sun/star/lang/XMultiServiceFactory.hpp>
28cdf0e10cSrcweir #include <com/sun/star/document/XDocumentLanguages.hpp>
29cdf0e10cSrcweir #include <com/sun/star/frame/XModuleManager.hpp>
30cdf0e10cSrcweir #include <com/sun/star/beans/PropertyValue.hpp>
31cdf0e10cSrcweir
32cdf0e10cSrcweir #include <tools/debug.hxx>
33cdf0e10cSrcweir #include <vcl/settings.hxx>
34cdf0e10cSrcweir #include <vcl/svapp.hxx>
35cdf0e10cSrcweir #include <i18npool/mslangid.hxx>
36cdf0e10cSrcweir #include <svtools/langtab.hxx>
37cdf0e10cSrcweir #include <comphelper/processfactory.hxx>
38cdf0e10cSrcweir #include <helper/mischelper.hxx>
39cdf0e10cSrcweir #include <services.h>
40cdf0e10cSrcweir
41cdf0e10cSrcweir
42cdf0e10cSrcweir using namespace ::com::sun::star;
43cdf0e10cSrcweir using namespace ::com::sun::star::uno;
44cdf0e10cSrcweir using namespace ::com::sun::star::frame;
45cdf0e10cSrcweir using namespace ::com::sun::star::beans;
46cdf0e10cSrcweir using namespace ::com::sun::star::container;
47cdf0e10cSrcweir using namespace ::com::sun::star::lang;
48cdf0e10cSrcweir
49cdf0e10cSrcweir using ::rtl::OUString;
50cdf0e10cSrcweir
51cdf0e10cSrcweir
52cdf0e10cSrcweir namespace framework
53cdf0e10cSrcweir {
54cdf0e10cSrcweir
GetGuesser() const55cdf0e10cSrcweir uno::Reference< linguistic2::XLanguageGuessing > LanguageGuessingHelper::GetGuesser() const
56cdf0e10cSrcweir {
57cdf0e10cSrcweir if (!m_xLanguageGuesser.is())
58cdf0e10cSrcweir {
59cdf0e10cSrcweir try
60cdf0e10cSrcweir {
61cdf0e10cSrcweir m_xLanguageGuesser = uno::Reference< linguistic2::XLanguageGuessing >(
62cdf0e10cSrcweir m_xServiceManager->createInstance(
63cdf0e10cSrcweir rtl::OUString::createFromAscii( "com.sun.star.linguistic2.LanguageGuessing" ) ),
64cdf0e10cSrcweir uno::UNO_QUERY );
65cdf0e10cSrcweir }
66cdf0e10cSrcweir catch (uno::Exception &r)
67cdf0e10cSrcweir {
68cdf0e10cSrcweir (void) r;
69cdf0e10cSrcweir DBG_ASSERT( 0, "failed to get language guessing component" );
70cdf0e10cSrcweir }
71cdf0e10cSrcweir }
72cdf0e10cSrcweir return m_xLanguageGuesser;
73cdf0e10cSrcweir }
74cdf0e10cSrcweir
75cdf0e10cSrcweir ////////////////////////////////////////////////////////////
76cdf0e10cSrcweir
RetrieveLabelFromCommand(const::rtl::OUString & aCmdURL,const uno::Reference<lang::XMultiServiceFactory> & _xServiceFactory,uno::Reference<container::XNameAccess> & _xUICommandLabels,const uno::Reference<frame::XFrame> & _xFrame,::rtl::OUString & _rModuleIdentifier,sal_Bool & _rIni,const sal_Char * _pName)77cdf0e10cSrcweir ::rtl::OUString RetrieveLabelFromCommand(
78cdf0e10cSrcweir const ::rtl::OUString& aCmdURL,
79cdf0e10cSrcweir const uno::Reference< lang::XMultiServiceFactory >& _xServiceFactory,
80cdf0e10cSrcweir uno::Reference< container::XNameAccess >& _xUICommandLabels,
81cdf0e10cSrcweir const uno::Reference< frame::XFrame >& _xFrame,
82cdf0e10cSrcweir ::rtl::OUString& _rModuleIdentifier,
83cdf0e10cSrcweir sal_Bool& _rIni,
84cdf0e10cSrcweir const sal_Char* _pName)
85cdf0e10cSrcweir {
86cdf0e10cSrcweir ::rtl::OUString aLabel;
87cdf0e10cSrcweir
88cdf0e10cSrcweir // Retrieve popup menu labels
89cdf0e10cSrcweir if ( !_xUICommandLabels.is() )
90cdf0e10cSrcweir {
91cdf0e10cSrcweir try
92cdf0e10cSrcweir {
93cdf0e10cSrcweir if ( !_rIni )
94cdf0e10cSrcweir {
95cdf0e10cSrcweir _rIni = sal_True;
96cdf0e10cSrcweir Reference< XModuleManager > xModuleManager( _xServiceFactory->createInstance( SERVICENAME_MODULEMANAGER ), UNO_QUERY_THROW );
97cdf0e10cSrcweir
98cdf0e10cSrcweir try
99cdf0e10cSrcweir {
100cdf0e10cSrcweir _rModuleIdentifier = xModuleManager->identify( _xFrame );
101cdf0e10cSrcweir }
102cdf0e10cSrcweir catch( Exception& )
103cdf0e10cSrcweir {
104cdf0e10cSrcweir }
105cdf0e10cSrcweir }
106cdf0e10cSrcweir
107cdf0e10cSrcweir Reference< XNameAccess > xNameAccess( _xServiceFactory->createInstance( SERVICENAME_UICOMMANDDESCRIPTION ), UNO_QUERY );
108cdf0e10cSrcweir if ( xNameAccess.is() )
109cdf0e10cSrcweir {
110cdf0e10cSrcweir xNameAccess->getByName( _rModuleIdentifier ) >>= _xUICommandLabels;
111cdf0e10cSrcweir }
112cdf0e10cSrcweir }
113cdf0e10cSrcweir catch ( Exception& )
114cdf0e10cSrcweir {
115cdf0e10cSrcweir }
116cdf0e10cSrcweir }
117cdf0e10cSrcweir
118cdf0e10cSrcweir if ( _xUICommandLabels.is() )
119cdf0e10cSrcweir {
120cdf0e10cSrcweir try
121cdf0e10cSrcweir {
122cdf0e10cSrcweir if ( aCmdURL.getLength() > 0 )
123cdf0e10cSrcweir {
124cdf0e10cSrcweir rtl::OUString aStr;
125cdf0e10cSrcweir Sequence< PropertyValue > aPropSeq;
126cdf0e10cSrcweir if( _xUICommandLabels->hasByName( aCmdURL ) )
127cdf0e10cSrcweir {
128cdf0e10cSrcweir if ( _xUICommandLabels->getByName( aCmdURL ) >>= aPropSeq )
129cdf0e10cSrcweir {
130cdf0e10cSrcweir for ( sal_Int32 i = 0; i < aPropSeq.getLength(); i++ )
131cdf0e10cSrcweir {
132cdf0e10cSrcweir if ( aPropSeq[i].Name.equalsAscii( _pName/*"Label"*/ ))
133cdf0e10cSrcweir {
134cdf0e10cSrcweir aPropSeq[i].Value >>= aStr;
135cdf0e10cSrcweir break;
136cdf0e10cSrcweir }
137cdf0e10cSrcweir }
138cdf0e10cSrcweir }
139cdf0e10cSrcweir }
140cdf0e10cSrcweir aLabel = aStr;
141cdf0e10cSrcweir }
142cdf0e10cSrcweir }
143cdf0e10cSrcweir catch ( com::sun::star::uno::Exception& )
144cdf0e10cSrcweir {
145cdf0e10cSrcweir }
146cdf0e10cSrcweir }
147cdf0e10cSrcweir
148cdf0e10cSrcweir return aLabel;
149cdf0e10cSrcweir }
150cdf0e10cSrcweir
151cdf0e10cSrcweir ////////////////////////////////////////////////////////////
152cdf0e10cSrcweir
FillLangItems(std::set<OUString> & rLangItems,const SvtLanguageTable & rLanguageTable,const uno::Reference<frame::XFrame> & rxFrame,const LanguageGuessingHelper & rLangGuessHelper,sal_Int16 nScriptType,const OUString & rCurLang,const OUString & rKeyboardLang,const OUString & rGuessedTextLang)153cdf0e10cSrcweir void FillLangItems( std::set< OUString > &rLangItems,
154cdf0e10cSrcweir const SvtLanguageTable & rLanguageTable,
155cdf0e10cSrcweir const uno::Reference< frame::XFrame > & rxFrame,
156cdf0e10cSrcweir const LanguageGuessingHelper & rLangGuessHelper,
157cdf0e10cSrcweir sal_Int16 nScriptType,
158cdf0e10cSrcweir const OUString & rCurLang,
159cdf0e10cSrcweir const OUString & rKeyboardLang,
160cdf0e10cSrcweir const OUString & rGuessedTextLang )
161cdf0e10cSrcweir {
162cdf0e10cSrcweir rLangItems.clear();
163cdf0e10cSrcweir
164cdf0e10cSrcweir //1--add current language
165cdf0e10cSrcweir if( rCurLang != OUString() &&
166cdf0e10cSrcweir LANGUAGE_DONTKNOW != rLanguageTable.GetType( rCurLang ))
167cdf0e10cSrcweir rLangItems.insert( rCurLang );
168cdf0e10cSrcweir
169cdf0e10cSrcweir //2--System
170cdf0e10cSrcweir const AllSettings& rAllSettings = Application::GetSettings();
171cdf0e10cSrcweir LanguageType rSystemLanguage = rAllSettings.GetLanguage();
172cdf0e10cSrcweir if( rSystemLanguage != LANGUAGE_DONTKNOW )
173cdf0e10cSrcweir {
174cdf0e10cSrcweir if ( IsScriptTypeMatchingToLanguage( nScriptType, rSystemLanguage ))
175cdf0e10cSrcweir rLangItems.insert( OUString( rLanguageTable.GetString( rSystemLanguage )) );
176cdf0e10cSrcweir }
177cdf0e10cSrcweir
178cdf0e10cSrcweir //3--UI
179cdf0e10cSrcweir LanguageType rUILanguage = rAllSettings.GetUILanguage();
180cdf0e10cSrcweir if( rUILanguage != LANGUAGE_DONTKNOW )
181cdf0e10cSrcweir {
182cdf0e10cSrcweir if ( IsScriptTypeMatchingToLanguage( nScriptType, rUILanguage ))
183cdf0e10cSrcweir rLangItems.insert( OUString( rLanguageTable.GetString( rUILanguage )) );
184cdf0e10cSrcweir }
185cdf0e10cSrcweir
186cdf0e10cSrcweir //4--guessed language
187cdf0e10cSrcweir uno::Reference< linguistic2::XLanguageGuessing > xLangGuesser( rLangGuessHelper.GetGuesser() );
188cdf0e10cSrcweir if ( xLangGuesser.is() && rGuessedTextLang.getLength() > 0)
189cdf0e10cSrcweir {
190cdf0e10cSrcweir ::com::sun::star::lang::Locale aLocale(xLangGuesser->guessPrimaryLanguage( rGuessedTextLang, 0, rGuessedTextLang.getLength()) );
191cdf0e10cSrcweir LanguageType nLang = MsLangId::convertLocaleToLanguageWithFallback( aLocale );
192cdf0e10cSrcweir if (nLang != LANGUAGE_DONTKNOW && nLang != LANGUAGE_NONE && nLang != LANGUAGE_SYSTEM
193cdf0e10cSrcweir && IsScriptTypeMatchingToLanguage( nScriptType, nLang ))
194cdf0e10cSrcweir rLangItems.insert( rLanguageTable.GetString( nLang ));
195cdf0e10cSrcweir }
196cdf0e10cSrcweir
197cdf0e10cSrcweir //5--keyboard language
198cdf0e10cSrcweir if( rKeyboardLang != OUString())
199cdf0e10cSrcweir {
200cdf0e10cSrcweir if ( IsScriptTypeMatchingToLanguage( nScriptType, rLanguageTable.GetType( rKeyboardLang )))
201cdf0e10cSrcweir rLangItems.insert( rKeyboardLang );
202cdf0e10cSrcweir }
203cdf0e10cSrcweir
204cdf0e10cSrcweir //6--all languages used in current document
205cdf0e10cSrcweir Reference< com::sun::star::frame::XModel > xModel;
206cdf0e10cSrcweir if ( rxFrame.is() )
207cdf0e10cSrcweir {
208cdf0e10cSrcweir Reference< com::sun::star::frame::XController > xController( rxFrame->getController(), UNO_QUERY );
209cdf0e10cSrcweir if ( xController.is() )
210cdf0e10cSrcweir xModel = xController->getModel();
211cdf0e10cSrcweir }
212cdf0e10cSrcweir Reference< document::XDocumentLanguages > xDocumentLanguages( xModel, UNO_QUERY );
213cdf0e10cSrcweir /*the description of nScriptType
214cdf0e10cSrcweir LATIN : 0x001
215cdf0e10cSrcweir ASIAN : 0x002
216cdf0e10cSrcweir COMPLEX: 0x004
217cdf0e10cSrcweir */
218cdf0e10cSrcweir const sal_Int16 nMaxCount = 7;
219cdf0e10cSrcweir if ( xDocumentLanguages.is() )
220cdf0e10cSrcweir {
221cdf0e10cSrcweir Sequence< Locale > rLocales( xDocumentLanguages->getDocumentLanguages( nScriptType, nMaxCount ));
222cdf0e10cSrcweir if ( rLocales.getLength() > 0 )
223cdf0e10cSrcweir {
224cdf0e10cSrcweir for ( sal_uInt16 i = 0; i < rLocales.getLength(); ++i )
225cdf0e10cSrcweir {
226cdf0e10cSrcweir if ( rLangItems.size() == static_cast< size_t >(nMaxCount) )
227cdf0e10cSrcweir break;
228cdf0e10cSrcweir const Locale& rLocale=rLocales[i];
229cdf0e10cSrcweir if( IsScriptTypeMatchingToLanguage( nScriptType, rLanguageTable.GetType( rLocale.Language )))
230cdf0e10cSrcweir rLangItems.insert( OUString( rLocale.Language ) );
231cdf0e10cSrcweir }
232cdf0e10cSrcweir }
233cdf0e10cSrcweir }
234cdf0e10cSrcweir }
235cdf0e10cSrcweir
236cdf0e10cSrcweir } // namespace framework
237cdf0e10cSrcweir
238cdf0e10cSrcweir
239