1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 #include "precompiled_basctl.hxx"
25 #include <ide_pch.hxx>
26 
27 #include <basidesh.hxx>
28 #include <baside3.hxx>
29 #include <basobj.hxx>
30 #include <iderdll.hxx>
31 #include "dlged.hxx"
32 
33 #include <localizationmgr.hxx>
34 #include <com/sun/star/resource/XStringResourceSupplier.hpp>
35 #include <com/sun/star/frame/XLayoutManager.hpp>
36 
37 using namespace ::com::sun::star;
38 using namespace ::com::sun::star::uno;
39 using namespace ::com::sun::star::lang;
40 using namespace ::com::sun::star::beans;
41 using namespace ::com::sun::star::resource;
42 
43 static ::rtl::OUString aDot  = ::rtl::OUString::createFromAscii( "." );
44 static ::rtl::OUString aEsc  = ::rtl::OUString::createFromAscii( "&" );
45 static ::rtl::OUString aSemi = ::rtl::OUString::createFromAscii( ";" );
46 
47 
LocalizationMgr(BasicIDEShell * pIDEShell,const ScriptDocument & rDocument,String aLibName,const Reference<XStringResourceManager> & xStringResourceManager)48 LocalizationMgr::LocalizationMgr( BasicIDEShell* pIDEShell,
49     const ScriptDocument& rDocument, String aLibName,
50 	const Reference< XStringResourceManager >& xStringResourceManager )
51 		: m_xStringResourceManager( xStringResourceManager )
52 		, m_pIDEShell( pIDEShell )
53 		, m_aDocument( rDocument )
54 		, m_aLibName( aLibName )
55 {
56 }
57 
isLibraryLocalized(void)58 bool LocalizationMgr::isLibraryLocalized( void )
59 {
60 	bool bRet = false;
61 	if( m_xStringResourceManager.is() )
62 	{
63 		Sequence< Locale > aLocaleSeq = m_xStringResourceManager->getLocales();
64 		bRet = ( aLocaleSeq.getLength() > 0 );
65 	}
66 	return bRet;
67 }
68 
handleTranslationbar(void)69 void LocalizationMgr::handleTranslationbar( void )
70 {
71 	static ::rtl::OUString aLayoutManagerName = ::rtl::OUString::createFromAscii( "LayoutManager" );
72 	static ::rtl::OUString aToolBarResName =
73 		::rtl::OUString::createFromAscii( "private:resource/toolbar/translationbar" );
74 
75 	Reference< beans::XPropertySet > xFrameProps
76 		( m_pIDEShell->GetViewFrame()->GetFrame().GetFrameInterface(), uno::UNO_QUERY );
77 	if ( xFrameProps.is() )
78     {
79 		Reference< ::com::sun::star::frame::XLayoutManager > xLayoutManager;
80 		uno::Any a = xFrameProps->getPropertyValue( aLayoutManagerName );
81 		a >>= xLayoutManager;
82         if ( xLayoutManager.is() )
83         {
84 			if ( !isLibraryLocalized() )
85             {
86                 xLayoutManager->destroyElement( aToolBarResName );
87             }
88             else
89             {
90                 xLayoutManager->createElement( aToolBarResName );
91                 xLayoutManager->requestElement( aToolBarResName );
92             }
93         }
94     }
95 }
96 
97 
98 //============================================
99 // TODO: -> export from toolkit
100 
101 struct LanguageDependentProp
102 {
103     const char* pPropName;
104     sal_Int32   nPropNameLength;
105 };
106 
107 static LanguageDependentProp aLanguageDependentProp[] =
108 {
109     { "Text",            4 },
110     { "Label",           5 },
111     { "Title",           5 },
112     { "HelpText",        8 },
113     { "CurrencySymbol", 14 },
114     { "StringItemList", 14 },
115     { 0, 0                 }
116 };
117 
isLanguageDependentProperty(::rtl::OUString aName)118 bool isLanguageDependentProperty( ::rtl::OUString aName )
119 {
120 	bool bRet = false;
121 
122 	LanguageDependentProp* pLangDepProp = aLanguageDependentProp;
123 	while( pLangDepProp->pPropName != 0 )
124 	{
125 		if( aName.equalsAsciiL( pLangDepProp->pPropName, pLangDepProp->nPropNameLength ))
126 		{
127 			bRet = true;
128 			break;
129 		}
130 		pLangDepProp++;
131 	}
132 	return bRet;
133 }
134 //============================================
135 
implEnableDisableResourceForAllLibraryDialogs(HandleResourceMode eMode)136 void LocalizationMgr::implEnableDisableResourceForAllLibraryDialogs( HandleResourceMode eMode )
137 {
138     Sequence< ::rtl::OUString > aDlgNames = m_aDocument.getObjectNames( E_DIALOGS, m_aLibName );
139     sal_Int32 nDlgCount = aDlgNames.getLength();
140     const ::rtl::OUString* pDlgNames = aDlgNames.getConstArray();
141 
142 	Reference< XStringResourceResolver > xDummyStringResolver;
143 	for( sal_Int32 i = 0 ; i < nDlgCount ; i++ )
144 	{
145 		String aDlgName = pDlgNames[ i ];
146 		DialogWindow* pWin = m_pIDEShell->FindDlgWin( m_aDocument, m_aLibName, aDlgName, sal_False );
147 		if( pWin && pWin->IsA( TYPE( DialogWindow ) ) )
148 		{
149 			DialogWindow* pDialogWin = static_cast< DialogWindow* >( pWin );
150 			Reference< container::XNameContainer > xDialog = pDialogWin->GetDialog();
151 			if( xDialog.is() )
152 			{
153 				// Handle dialog itself as control
154 				Any aDialogCtrl;
155 				aDialogCtrl <<= xDialog;
156 				implHandleControlResourceProperties( aDialogCtrl, aDlgName,
157 					::rtl::OUString(), m_xStringResourceManager, xDummyStringResolver, eMode );
158 
159 				// Handle all controls
160 				Sequence< ::rtl::OUString > aNames = xDialog->getElementNames();
161 				const ::rtl::OUString* pNames = aNames.getConstArray();
162 				sal_Int32 nCtrls = aNames.getLength();
163 				for( sal_Int32 j = 0 ; j < nCtrls ; ++j )
164 				{
165 					::rtl::OUString aCtrlName( pNames[j] );
166 					Any aCtrl = xDialog->getByName( aCtrlName );
167 					implHandleControlResourceProperties( aCtrl, aDlgName,
168 						aCtrlName, m_xStringResourceManager, xDummyStringResolver, eMode );
169 				}
170 			}
171 		}
172 	}
173 }
174 
175 
implCreatePureResourceId(const::rtl::OUString & aDialogName,const::rtl::OUString & aCtrlName,const::rtl::OUString & aPropName,Reference<XStringResourceManager> xStringResourceManager)176 ::rtl::OUString implCreatePureResourceId
177 	( const ::rtl::OUString& aDialogName, const ::rtl::OUString& aCtrlName,
178 	  const ::rtl::OUString& aPropName,
179 	  Reference< XStringResourceManager > xStringResourceManager )
180 {
181 	sal_Int32 nUniqueId = xStringResourceManager->getUniqueNumericId();
182 	::rtl::OUString aPureIdStr = ::rtl::OUString::valueOf( nUniqueId );
183 	aPureIdStr += aDot;
184 	aPureIdStr += aDialogName;
185 	aPureIdStr += aDot;
186 	if( !aCtrlName.isEmpty() )
187 	{
188 		aPureIdStr += aCtrlName;
189 		aPureIdStr += aDot;
190 	}
191 	aPureIdStr += aPropName;
192 	return aPureIdStr;
193 }
194 
195 extern bool localesAreEqual( const ::com::sun::star::lang::Locale& rLocaleLeft,
196 							 const ::com::sun::star::lang::Locale& rLocaleRight );
197 
198 // Works on xStringResourceManager's current language for SET_IDS/RESET_IDS,
199 // anyway only one language should exist when calling this method then,
200 // either the first one for mode SET_IDS or the last one for mode RESET_IDS
implHandleControlResourceProperties(Any aControlAny,const::rtl::OUString & aDialogName,const::rtl::OUString & aCtrlName,Reference<XStringResourceManager> xStringResourceManager,Reference<XStringResourceResolver> xSourceStringResolver,HandleResourceMode eMode)201 sal_Int32 LocalizationMgr::implHandleControlResourceProperties
202 	( Any aControlAny, const ::rtl::OUString& aDialogName, const ::rtl::OUString& aCtrlName,
203 		Reference< XStringResourceManager > xStringResourceManager,
204 		Reference< XStringResourceResolver > xSourceStringResolver, HandleResourceMode eMode )
205 {
206 	sal_Int32 nChangedCount = 0;
207 
208 	Reference< XPropertySet > xPropertySet;
209 	aControlAny >>= xPropertySet;
210 	if( xPropertySet.is() )
211 	{
212 		Sequence< Locale > aLocaleSeq = xStringResourceManager->getLocales();
213 		sal_Int32 nLocaleCount = aLocaleSeq.getLength();
214 		if( nLocaleCount == 0 )
215 			return 0;
216 
217 		Reference< XPropertySetInfo > xPropertySetInfo = xPropertySet->getPropertySetInfo();
218 		if( xPropertySetInfo.is() )
219 		{
220 			// get sequence of control properties
221 			Sequence< Property > aPropSeq = xPropertySetInfo->getProperties();
222 			const Property* pProps = aPropSeq.getConstArray();
223 			sal_Int32 nCtrlProps = aPropSeq.getLength();
224 
225 			// create a map of tab indices and control names, sorted by tab index
226 			for( sal_Int32 j = 0 ; j < nCtrlProps ; ++j )
227 			{
228 				const Property& rProp = pProps[j];
229 				::rtl::OUString aPropName = rProp.Name;
230 		        TypeClass eType = rProp.Type.getTypeClass();
231 				bool bLanguageDependentProperty =
232 					(eType == TypeClass_STRING || eType == TypeClass_SEQUENCE)
233 					&& isLanguageDependentProperty( aPropName );
234 				if( !bLanguageDependentProperty )
235 					continue;
236 
237 				if( eType == TypeClass_STRING )
238 				{
239 					Any aPropAny = xPropertySet->getPropertyValue( aPropName );
240 					::rtl::OUString aPropStr;
241 					aPropAny >>= aPropStr;
242 
243 					// Replace string by id, add id+string to StringResource
244 					if( eMode == SET_IDS )
245 					{
246 						bool bEscAlreadyExisting = (!aPropStr.isEmpty() && aPropStr.getStr()[0] == '&' );
247 						if( bEscAlreadyExisting )
248 							continue;
249 
250 						::rtl::OUString aPureIdStr = implCreatePureResourceId
251 							( aDialogName, aCtrlName, aPropName, xStringResourceManager );
252 
253 						// Set Id for all locales
254 						const Locale* pLocales = aLocaleSeq.getConstArray();
255 						for( sal_Int32 i = 0 ; i < nLocaleCount ; i++ )
256 						{
257 							const Locale& rLocale = pLocales[ i ];
258 							xStringResourceManager->setStringForLocale( aPureIdStr, aPropStr, rLocale );
259 						}
260 
261 						::rtl::OUString aPropIdStr = aEsc;
262 						aPropIdStr += aPureIdStr;
263 						// TODO?: Change here and in toolkit
264 						//aPropIdStr += aSemi;
265 						(void)aSemi;
266 						aPropAny <<= aPropIdStr;
267 						xPropertySet->setPropertyValue( aPropName, aPropAny );
268 					}
269 					// Replace id by string from StringResource
270 					else if( eMode == RESET_IDS )
271 					{
272 						if( aPropStr.getLength() > 1 )
273 						{
274 							::rtl::OUString aPureIdStr = aPropStr.copy( 1 );
275 							::rtl::OUString aNewPropStr = aPropStr;
276 							try
277 							{
278 								aNewPropStr = xStringResourceManager->resolveString( aPureIdStr );
279 							}
280 							catch(MissingResourceException&)
281 							{
282 							}
283 							aPropAny <<= aNewPropStr;
284 							xPropertySet->setPropertyValue( aPropName, aPropAny );
285 						}
286 					}
287 					// Remove Id for all locales
288 					else if( eMode == REMOVE_IDS_FROM_RESOURCE )
289 					{
290 						if( aPropStr.getLength() > 1 )
291 						{
292 							::rtl::OUString aPureIdStr = aPropStr.copy( 1 );
293 
294 							const Locale* pLocales = aLocaleSeq.getConstArray();
295 							for( sal_Int32 i = 0 ; i < nLocaleCount ; i++ )
296 							{
297 								const Locale& rLocale = pLocales[ i ];
298 								try
299 								{
300 									xStringResourceManager->removeIdForLocale( aPureIdStr, rLocale );
301 								}
302 								catch(MissingResourceException&)
303 								{
304 								}
305 							}
306 						}
307 					}
308 					// Rename resource id
309 					else if( eMode == RENAME_DIALOG_IDS || eMode == RENAME_CONTROL_IDS )
310 					{
311 						::rtl::OUString aSourceIdStr = aPropStr;
312 						::rtl::OUString aPureSourceIdStr = aSourceIdStr.copy( 1 );
313 
314 						::rtl::OUString aPureIdStr = implCreatePureResourceId
315 							( aDialogName, aCtrlName, aPropName, xStringResourceManager );
316 
317 						// Set new Id and remove old one for all locales
318 						const Locale* pLocales = aLocaleSeq.getConstArray();
319 						for( sal_Int32 i = 0 ; i < nLocaleCount ; i++ )
320 						{
321 							const Locale& rLocale = pLocales[ i ];
322 							::rtl::OUString aResStr;
323 							try
324 							{
325 								aResStr = xStringResourceManager->resolveStringForLocale
326 									( aPureSourceIdStr, rLocale );
327 								xStringResourceManager->removeIdForLocale( aPureSourceIdStr, rLocale );
328 								xStringResourceManager->setStringForLocale( aPureIdStr, aResStr, rLocale );
329 							}
330 							catch(MissingResourceException&)
331 							{}
332 						}
333 
334 						::rtl::OUString aPropIdStr = aEsc;
335 						aPropIdStr += aPureIdStr;
336 						// TODO?: Change here and in toolkit
337 						//aPropIdStr += aSemi;
338 						(void)aSemi;
339 						aPropAny <<= aPropIdStr;
340 						xPropertySet->setPropertyValue( aPropName, aPropAny );
341 					}
342 					// Replace string by string from source StringResourceResolver
343 					else if( eMode == MOVE_RESOURCES && xSourceStringResolver.is() )
344 					{
345 						::rtl::OUString aSourceIdStr = aPropStr;
346 						::rtl::OUString aPureSourceIdStr = aSourceIdStr.copy( 1 );
347 
348 						::rtl::OUString aPureIdStr = implCreatePureResourceId
349 							( aDialogName, aCtrlName, aPropName, xStringResourceManager );
350 
351 						const Locale& rDefaultLocale = xSourceStringResolver->getDefaultLocale();
352 
353 						// Set Id for all locales
354 						const Locale* pLocales = aLocaleSeq.getConstArray();
355 						for( sal_Int32 i = 0 ; i < nLocaleCount ; i++ )
356 						{
357 							const Locale& rLocale = pLocales[ i ];
358 							::rtl::OUString aResStr;
359 							try
360 							{
361 								aResStr = xSourceStringResolver->resolveStringForLocale
362 									( aPureSourceIdStr, rLocale );
363 							}
364 							catch(MissingResourceException&)
365 							{
366 								aResStr = xSourceStringResolver->resolveStringForLocale
367 									( aPureSourceIdStr, rDefaultLocale );
368 							}
369 							xStringResourceManager->setStringForLocale( aPureIdStr, aResStr, rLocale );
370 						}
371 
372 						::rtl::OUString aPropIdStr = aEsc;
373 						aPropIdStr += aPureIdStr;
374 						// TODO?: Change here and in toolkit
375 						//aPropIdStr += aSemi;
376 						(void)aSemi;
377 						aPropAny <<= aPropIdStr;
378 						xPropertySet->setPropertyValue( aPropName, aPropAny );
379 					}
380 					// Copy string from source to target resource
381 					else if( eMode == COPY_RESOURCES && xSourceStringResolver.is() )
382 					{
383 						::rtl::OUString aSourceIdStr = aPropStr;
384 						::rtl::OUString aPureSourceIdStr = aSourceIdStr.copy( 1 );
385 
386 						const Locale& rDefaultLocale = xSourceStringResolver->getDefaultLocale();
387 
388 						// Copy Id for all locales
389 						const Locale* pLocales = aLocaleSeq.getConstArray();
390 						for( sal_Int32 i = 0 ; i < nLocaleCount ; i++ )
391 						{
392 							const Locale& rLocale = pLocales[ i ];
393 							::rtl::OUString aResStr;
394 							try
395 							{
396 								aResStr = xSourceStringResolver->resolveStringForLocale
397 									( aPureSourceIdStr, rLocale );
398 							}
399 							catch(MissingResourceException&)
400 							{
401 								aResStr = xSourceStringResolver->resolveStringForLocale
402 									( aPureSourceIdStr, rDefaultLocale );
403 							}
404 							xStringResourceManager->setStringForLocale( aPureSourceIdStr, aResStr, rLocale );
405 						}
406 					}
407 					nChangedCount++;
408 				}
409 
410 				// Listbox / Combobox
411 				else if( eType == TypeClass_SEQUENCE )
412 				{
413 					Any aPropAny = xPropertySet->getPropertyValue( aPropName );
414 					Sequence< ::rtl::OUString > aPropStrings;
415 					aPropAny >>= aPropStrings;
416 
417 					const ::rtl::OUString* pPropStrings = aPropStrings.getConstArray();
418 					sal_Int32 nPropStringCount = aPropStrings.getLength();
419 					if( nPropStringCount == 0 )
420 						continue;
421 
422 					// Replace string by id, add id+string to StringResource
423 					if( eMode == SET_IDS )
424 					{
425 						Sequence< ::rtl::OUString > aIdStrings;
426 						aIdStrings.realloc( nPropStringCount );
427 						::rtl::OUString* pIdStrings = aIdStrings.getArray();
428 
429 						::rtl::OUString aIdStrBase = aDot;
430 						aIdStrBase += aCtrlName;
431 						aIdStrBase += aDot;
432 						aIdStrBase += aPropName;
433 
434 						const Locale* pLocales = aLocaleSeq.getConstArray();
435 						sal_Int32 i;
436 						for ( i = 0; i < nPropStringCount; ++i )
437 						{
438 							::rtl::OUString aPropStr = pPropStrings[i];
439 							bool bEscAlreadyExisting = (!aPropStr.isEmpty() && aPropStr.getStr()[0] == '&' );
440 							if( bEscAlreadyExisting )
441 							{
442 								pIdStrings[i] = aPropStr;
443 								continue;
444 							}
445 
446 							sal_Int32 nUniqueId = xStringResourceManager->getUniqueNumericId();
447 							::rtl::OUString aPureIdStr = ::rtl::OUString::valueOf( nUniqueId );
448 							aPureIdStr += aIdStrBase;
449 
450 							// Set Id for all locales
451 							for( sal_Int32 iLocale = 0 ; iLocale < nLocaleCount ; iLocale++ )
452 							{
453 								const Locale& rLocale = pLocales[ iLocale ];
454 								xStringResourceManager->setStringForLocale( aPureIdStr, aPropStr, rLocale );
455 							}
456 
457 							::rtl::OUString aPropIdStr = aEsc;
458 							aPropIdStr += aPureIdStr;
459 							pIdStrings[i] = aPropIdStr;
460 						}
461 						aPropAny <<= aIdStrings;
462 						xPropertySet->setPropertyValue( aPropName, aPropAny );
463 					}
464 					// Replace id by string from StringResource
465 					else if( eMode == RESET_IDS )
466 					{
467 						Sequence< ::rtl::OUString > aNewPropStrings;
468 						aNewPropStrings.realloc( nPropStringCount );
469 						::rtl::OUString* pNewPropStrings = aNewPropStrings.getArray();
470 
471 						sal_Int32 i;
472 						for ( i = 0; i < nPropStringCount; ++i )
473 						{
474 							::rtl::OUString aIdStr = pPropStrings[i];
475 							::rtl::OUString aNewPropStr = aIdStr;
476 							if( aIdStr.getLength() > 1 )
477 							{
478 								::rtl::OUString aPureIdStr = aIdStr.copy( 1 );
479 								try
480 								{
481 									aNewPropStr = xStringResourceManager->resolveString( aPureIdStr );
482 								}
483 								catch(MissingResourceException&)
484 								{
485 								}
486 							}
487 							pNewPropStrings[i] = aNewPropStr;
488 						}
489 						aPropAny <<= aNewPropStrings;
490 						xPropertySet->setPropertyValue( aPropName, aPropAny );
491 					}
492 					// Remove Id for all locales
493 					else if( eMode == REMOVE_IDS_FROM_RESOURCE )
494 					{
495 						Sequence< ::rtl::OUString > aNewPropStrings;
496 						aNewPropStrings.realloc( nPropStringCount );
497 
498 						const Locale* pLocales = aLocaleSeq.getConstArray();
499 						sal_Int32 i;
500 						for ( i = 0; i < nPropStringCount; ++i )
501 						{
502 							::rtl::OUString aIdStr = pPropStrings[i];
503 							if( aIdStr.getLength() > 1 )
504 							{
505 								::rtl::OUString aPureIdStr = aIdStr.copy( 1 );
506 
507 								for( sal_Int32 iLocale = 0 ; iLocale < nLocaleCount ; iLocale++ )
508 								{
509 									const Locale& rLocale = pLocales[iLocale];
510 									try
511 									{
512 										xStringResourceManager->removeIdForLocale( aPureIdStr, rLocale );
513 									}
514 									catch(MissingResourceException&)
515 									{
516 									}
517 								}
518 							}
519 						}
520 					}
521 					// Rename resource id
522 					else if( eMode == RENAME_CONTROL_IDS )
523 					{
524 						Sequence< ::rtl::OUString > aIdStrings;
525 						aIdStrings.realloc( nPropStringCount );
526 						::rtl::OUString* pIdStrings = aIdStrings.getArray();
527 
528 						::rtl::OUString aIdStrBase = aDot;
529 						aIdStrBase += aCtrlName;
530 						aIdStrBase += aDot;
531 						aIdStrBase += aPropName;
532 
533 						const Locale* pLocales = aLocaleSeq.getConstArray();
534 						sal_Int32 i;
535 						for ( i = 0; i < nPropStringCount; ++i )
536 						{
537 							::rtl::OUString aSourceIdStr = pPropStrings[i];
538 							::rtl::OUString aPureSourceIdStr = aSourceIdStr.copy( 1 );
539 
540 							sal_Int32 nUniqueId = xStringResourceManager->getUniqueNumericId();
541 							::rtl::OUString aPureIdStr = ::rtl::OUString::valueOf( nUniqueId );
542 							aPureIdStr += aIdStrBase;
543 
544 							// Set Id for all locales
545 							for( sal_Int32 iLocale = 0 ; iLocale < nLocaleCount ; iLocale++ )
546 							{
547 								const Locale& rLocale = pLocales[ iLocale ];
548 
549 								::rtl::OUString aResStr;
550 								try
551 								{
552 									aResStr = xStringResourceManager->resolveStringForLocale
553 										( aPureSourceIdStr, rLocale );
554 									xStringResourceManager->removeIdForLocale( aPureSourceIdStr, rLocale );
555 									xStringResourceManager->setStringForLocale( aPureIdStr, aResStr, rLocale );
556 								}
557 								catch(MissingResourceException&)
558 								{}
559 							}
560 
561 							::rtl::OUString aPropIdStr = aEsc;
562 							aPropIdStr += aPureIdStr;
563 							pIdStrings[i] = aPropIdStr;
564 						}
565 						aPropAny <<= aIdStrings;
566 						xPropertySet->setPropertyValue( aPropName, aPropAny );
567 					}
568 					// Replace string by string from source StringResourceResolver
569 					else if( eMode == MOVE_RESOURCES && xSourceStringResolver.is() )
570 					{
571 						Sequence< ::rtl::OUString > aIdStrings;
572 						aIdStrings.realloc( nPropStringCount );
573 						::rtl::OUString* pIdStrings = aIdStrings.getArray();
574 
575 						::rtl::OUString aIdStrBase = aDot;
576 						aIdStrBase += aCtrlName;
577 						aIdStrBase += aDot;
578 						aIdStrBase += aPropName;
579 
580 						const Locale& rDefaultLocale = xSourceStringResolver->getDefaultLocale();
581 
582 						const Locale* pLocales = aLocaleSeq.getConstArray();
583 						sal_Int32 i;
584 						for ( i = 0; i < nPropStringCount; ++i )
585 						{
586 							::rtl::OUString aSourceIdStr = pPropStrings[i];
587 							::rtl::OUString aPureSourceIdStr = aSourceIdStr.copy( 1 );
588 
589 							sal_Int32 nUniqueId = xStringResourceManager->getUniqueNumericId();
590 							::rtl::OUString aPureIdStr = ::rtl::OUString::valueOf( nUniqueId );
591 							aPureIdStr += aIdStrBase;
592 
593 							// Set Id for all locales
594 							for( sal_Int32 iLocale = 0 ; iLocale < nLocaleCount ; iLocale++ )
595 							{
596 								const Locale& rLocale = pLocales[ iLocale ];
597 
598 								::rtl::OUString aResStr;
599 								try
600 								{
601 									aResStr = xSourceStringResolver->resolveStringForLocale
602 										( aPureSourceIdStr, rLocale );
603 								}
604 								catch(MissingResourceException&)
605 								{
606 									aResStr = xSourceStringResolver->resolveStringForLocale
607 										( aPureSourceIdStr, rDefaultLocale );
608 								}
609 								xStringResourceManager->setStringForLocale( aPureIdStr, aResStr, rLocale );
610 							}
611 
612 							::rtl::OUString aPropIdStr = aEsc;
613 							aPropIdStr += aPureIdStr;
614 							pIdStrings[i] = aPropIdStr;
615 						}
616 						aPropAny <<= aIdStrings;
617 						xPropertySet->setPropertyValue( aPropName, aPropAny );
618 					}
619 					// Copy string from source to target resource
620 					else if( eMode == COPY_RESOURCES && xSourceStringResolver.is() )
621 					{
622 						const Locale& rDefaultLocale = xSourceStringResolver->getDefaultLocale();
623 
624 						const Locale* pLocales = aLocaleSeq.getConstArray();
625 						sal_Int32 i;
626 						for ( i = 0; i < nPropStringCount; ++i )
627 						{
628 							::rtl::OUString aSourceIdStr = pPropStrings[i];
629 							::rtl::OUString aPureSourceIdStr = aSourceIdStr.copy( 1 );
630 
631 							// Set Id for all locales
632 							for( sal_Int32 iLocale = 0 ; iLocale < nLocaleCount ; iLocale++ )
633 							{
634 								const Locale& rLocale = pLocales[ iLocale ];
635 
636 								::rtl::OUString aResStr;
637 								try
638 								{
639 									aResStr = xSourceStringResolver->resolveStringForLocale
640 										( aPureSourceIdStr, rLocale );
641 								}
642 								catch(MissingResourceException&)
643 								{
644 									aResStr = xSourceStringResolver->resolveStringForLocale
645 										( aPureSourceIdStr, rDefaultLocale );
646 								}
647 								xStringResourceManager->setStringForLocale( aPureSourceIdStr, aResStr, rLocale );
648 							}
649 						}
650 					}
651 					nChangedCount++;
652 				}
653 			}
654 		}
655 	}
656 	return nChangedCount;
657 }
658 
659 /*
660 void TEST_simulateDialogAddRemoveLocale( bool bAdd )
661 {
662 	Sequence< Locale > aLocaleSeq( 1 );
663 	Locale* pLocales = aLocaleSeq.getArray();
664 
665 	::com::sun::star::lang::Locale aLocale_en;
666 	aLocale_en.Language = ::rtl::OUString::createFromAscii( "en" );
667 	aLocale_en.Country = ::rtl::OUString::createFromAscii( "US" );
668 
669 	::com::sun::star::lang::Locale aLocale_de;
670 	aLocale_de.Language = ::rtl::OUString::createFromAscii( "de" );
671 	aLocale_de.Country = ::rtl::OUString::createFromAscii( "DE" );
672 
673 	::com::sun::star::lang::Locale aLocale_fr;
674 	aLocale_fr.Language = ::rtl::OUString::createFromAscii( "fr" );
675 	aLocale_fr.Country = ::rtl::OUString::createFromAscii( "FR" );
676 
677 	int n = 0;
678 	if( n == 0 )
679 		pLocales[0] = aLocale_en;
680 	else if( n == 1 )
681 		pLocales[0] = aLocale_de;
682 	else if( n == 2 )
683 		pLocales[0] = aLocale_fr;
684 
685 	BasicIDEShell* pIDEShell = IDE_DLL()->GetShell();
686 	LocalizationMgr* pMgr = pIDEShell->GetCurLocalizationMgr();
687 	if( bAdd )
688 		pMgr->handleAddLocales( aLocaleSeq );
689 	else
690 		pMgr->handleRemoveLocales( aLocaleSeq );
691 }
692 
693 void TEST_simulateDialogAddLocale( void )
694 {
695 	TEST_simulateDialogAddRemoveLocale( true );
696 }
697 
698 void TEST_simulateDialogRemoveLocale( void )
699 {
700 	TEST_simulateDialogAddRemoveLocale( false );
701 }
702 */
703 
handleAddLocales(Sequence<Locale> aLocaleSeq)704 void LocalizationMgr::handleAddLocales( Sequence< Locale > aLocaleSeq )
705 {
706 	const Locale* pLocales = aLocaleSeq.getConstArray();
707 	sal_Int32 nLocaleCount = aLocaleSeq.getLength();
708 
709 	if( isLibraryLocalized() )
710 	{
711 		for( sal_Int32 i = 0 ; i < nLocaleCount ; i++ )
712 		{
713 			const Locale& rLocale = pLocales[ i ];
714 			m_xStringResourceManager->newLocale( rLocale );
715 		}
716 	}
717 	else
718 	{
719 		DBG_ASSERT( nLocaleCount==1, "LocalizationMgr::handleAddLocales(): Only one first locale allowed" );
720 
721 		const Locale& rLocale = pLocales[ 0 ];
722 		m_xStringResourceManager->newLocale( rLocale );
723 		enableResourceForAllLibraryDialogs();
724 	}
725 
726 	BasicIDE::MarkDocumentModified( m_aDocument );
727 
728 	// update locale toolbar
729     SfxBindings* pBindings = BasicIDE::GetBindingsPtr();
730     if ( pBindings )
731 		pBindings->Invalidate( SID_BASICIDE_CURRENT_LANG );
732 
733 	handleTranslationbar();
734 }
735 
736 
handleRemoveLocales(Sequence<Locale> aLocaleSeq)737 void LocalizationMgr::handleRemoveLocales( Sequence< Locale > aLocaleSeq )
738 {
739 	const Locale* pLocales = aLocaleSeq.getConstArray();
740 	sal_Int32 nLocaleCount = aLocaleSeq.getLength();
741 	bool bConsistant = true;
742 	bool bModified = false;
743 
744 	for( sal_Int32 i = 0 ; i < nLocaleCount ; i++ )
745 	{
746 		const Locale& rLocale = pLocales[ i ];
747 		bool bRemove = true;
748 
749 		// Check if last locale
750 		Sequence< Locale > aResLocaleSeq = m_xStringResourceManager->getLocales();
751 		if( aResLocaleSeq.getLength() == 1 )
752         {
753 			const Locale& rLastResLocale = aResLocaleSeq.getConstArray()[ 0 ];
754 			if( localesAreEqual( rLocale, rLastResLocale ) )
755 			{
756 				disableResourceForAllLibraryDialogs();
757 			}
758 			else
759 			{
760 				// Inconsistancy, keep last locale
761 				bConsistant = false;
762 				bRemove = false;
763 			}
764         }
765 
766 		if( bRemove )
767         {
768 			try
769 			{
770 				m_xStringResourceManager->removeLocale( rLocale );
771 				bModified = true;
772 			}
773 			catch(IllegalArgumentException&)
774 			{
775 				bConsistant = false;
776 			}
777         }
778 	}
779 	if( bModified )
780 	{
781 		BasicIDE::MarkDocumentModified( m_aDocument );
782 
783 		// update slots
784         SfxBindings* pBindings = BasicIDE::GetBindingsPtr();
785         if ( pBindings )
786 		{
787 			pBindings->Invalidate( SID_BASICIDE_CURRENT_LANG );
788 			pBindings->Invalidate( SID_BASICIDE_MANAGE_LANG );
789 		}
790 
791 		handleTranslationbar();
792 	}
793 
794 	DBG_ASSERT( bConsistant,
795 		"LocalizationMgr::handleRemoveLocales(): sequence contains unsupported locales" );
796 }
797 
handleSetDefaultLocale(Locale aLocale)798 void LocalizationMgr::handleSetDefaultLocale( Locale aLocale )
799 {
800 	if( m_xStringResourceManager.is() )
801 	{
802 		try
803 		{
804 			m_xStringResourceManager->setDefaultLocale( aLocale );
805 		}
806 		catch(IllegalArgumentException&)
807 		{
808 			DBG_ERROR( "LocalizationMgr::handleSetDefaultLocale: Invalid locale" );
809 		}
810 
811 		// update locale toolbar
812         SfxBindings* pBindings = BasicIDE::GetBindingsPtr();
813         if ( pBindings )
814 			pBindings->Invalidate( SID_BASICIDE_CURRENT_LANG );
815 	}
816 }
817 
handleSetCurrentLocale(::com::sun::star::lang::Locale aLocale)818 void LocalizationMgr::handleSetCurrentLocale( ::com::sun::star::lang::Locale aLocale )
819 {
820 	if( m_xStringResourceManager.is() )
821 	{
822 		try
823 		{
824 			m_xStringResourceManager->setCurrentLocale( aLocale, false );
825 		}
826 		catch(IllegalArgumentException&)
827 		{
828 			DBG_ERROR( "LocalizationMgr::handleSetCurrentLocale: Invalid locale" );
829 		}
830 
831 		// update locale toolbar
832         SfxBindings* pBindings = BasicIDE::GetBindingsPtr();
833         if ( pBindings )
834 			pBindings->Invalidate( SID_BASICIDE_CURRENT_LANG );
835 
836 		IDEBaseWindow* pCurWin = m_pIDEShell->GetCurWindow();
837 		if ( pCurWin && !pCurWin->IsSuspended() && pCurWin->IsA( TYPE( DialogWindow ) ) )
838 		{
839 			DialogWindow* pDlgWin = (DialogWindow*)pCurWin;
840 			DlgEditor* pWinEditor = pDlgWin->GetEditor();
841 			if( pWinEditor )
842 				pWinEditor->UpdatePropertyBrowserDelayed();
843 		}
844 	}
845 }
846 
handleBasicStarted(void)847 void LocalizationMgr::handleBasicStarted( void )
848 {
849 	if( m_xStringResourceManager.is() )
850 		m_aLocaleBeforeBasicStart = m_xStringResourceManager->getCurrentLocale();
851 }
852 
handleBasicStopped(void)853 void LocalizationMgr::handleBasicStopped( void )
854 {
855 	try
856 	{
857 		if( m_xStringResourceManager.is() )
858 			m_xStringResourceManager->setCurrentLocale( m_aLocaleBeforeBasicStart, true );
859 	}
860 	catch(IllegalArgumentException&)
861 	{
862 	}
863 }
864 
865 
FindDialogWindowForEditor(DlgEditor * pEditor)866 DialogWindow* FindDialogWindowForEditor( DlgEditor* pEditor )
867 {
868 	BasicIDEShell* pIDEShell = IDE_DLL()->GetShell();
869 	IDEWindowTable& aIDEWindowTable = pIDEShell->GetIDEWindowTable();
870 	IDEBaseWindow* pWin = aIDEWindowTable.First();
871 	DialogWindow* pFoundDlgWin = NULL;
872 	while( pWin )
873 	{
874 		if ( !pWin->IsSuspended() && pWin->IsA( TYPE( DialogWindow ) ) )
875 		{
876 			DialogWindow* pDlgWin = (DialogWindow*)pWin;
877 			DlgEditor* pWinEditor = pDlgWin->GetEditor();
878 			if( pWinEditor == pEditor )
879 			{
880 				pFoundDlgWin = pDlgWin;
881 				break;
882 			}
883 		}
884 		pWin = aIDEWindowTable.Next();
885 	}
886 	return pFoundDlgWin;
887 }
888 
889 
setControlResourceIDsForNewEditorObject(DlgEditor * pEditor,Any aControlAny,const::rtl::OUString & aCtrlName)890 void LocalizationMgr::setControlResourceIDsForNewEditorObject( DlgEditor* pEditor,
891 	Any aControlAny, const ::rtl::OUString& aCtrlName )
892 {
893 	// Get library for DlgEditor
894 	DialogWindow* pDlgWin = FindDialogWindowForEditor( pEditor );
895 	if( !pDlgWin )
896 		return;
897     ScriptDocument aDocument( pDlgWin->GetDocument() );
898     DBG_ASSERT( aDocument.isValid(), "LocalizationMgr::setControlResourceIDsForNewEditorObject: invalid document!" );
899     if ( !aDocument.isValid() )
900         return;
901 	const String& rLibName = pDlgWin->GetLibName();
902 	Reference< container::XNameContainer > xDialogLib( aDocument.getLibrary( E_DIALOGS, rLibName, sal_True ) );
903 	Reference< XStringResourceManager > xStringResourceManager =
904 		LocalizationMgr::getStringResourceFromDialogLibrary( xDialogLib );
905 
906 	// Set resource property
907 	if( !xStringResourceManager.is() || xStringResourceManager->getLocales().getLength() == 0 )
908 		return;
909 
910 	::rtl::OUString aDialogName = pDlgWin->GetName();
911 	Reference< XStringResourceResolver > xDummyStringResolver;
912 	sal_Int32 nChangedCount = implHandleControlResourceProperties
913 		( aControlAny, aDialogName, aCtrlName, xStringResourceManager,
914 		  xDummyStringResolver, SET_IDS );
915 
916 	if( nChangedCount )
917 		BasicIDE::MarkDocumentModified( aDocument );
918 }
919 
renameControlResourceIDsForEditorObject(DlgEditor * pEditor,::com::sun::star::uno::Any aControlAny,const::rtl::OUString & aNewCtrlName)920 void LocalizationMgr::renameControlResourceIDsForEditorObject( DlgEditor* pEditor,
921 	::com::sun::star::uno::Any aControlAny, const ::rtl::OUString& aNewCtrlName )
922 {
923 	// Get library for DlgEditor
924 	DialogWindow* pDlgWin = FindDialogWindowForEditor( pEditor );
925 	if( !pDlgWin )
926 		return;
927     ScriptDocument aDocument( pDlgWin->GetDocument() );
928     DBG_ASSERT( aDocument.isValid(), "LocalizationMgr::renameControlResourceIDsForEditorObject: invalid document!" );
929     if ( !aDocument.isValid() )
930         return;
931 	const String& rLibName = pDlgWin->GetLibName();
932 	Reference< container::XNameContainer > xDialogLib( aDocument.getLibrary( E_DIALOGS, rLibName, sal_True ) );
933 	Reference< XStringResourceManager > xStringResourceManager =
934 		LocalizationMgr::getStringResourceFromDialogLibrary( xDialogLib );
935 
936 	// Set resource property
937 	if( !xStringResourceManager.is() || xStringResourceManager->getLocales().getLength() == 0 )
938 		return;
939 
940 	::rtl::OUString aDialogName = pDlgWin->GetName();
941 	Reference< XStringResourceResolver > xDummyStringResolver;
942 	implHandleControlResourceProperties
943 		( aControlAny, aDialogName, aNewCtrlName, xStringResourceManager,
944 		  xDummyStringResolver, RENAME_CONTROL_IDS );
945 }
946 
947 
deleteControlResourceIDsForDeletedEditorObject(DlgEditor * pEditor,Any aControlAny,const::rtl::OUString & aCtrlName)948 void LocalizationMgr::deleteControlResourceIDsForDeletedEditorObject( DlgEditor* pEditor,
949 	Any aControlAny, const ::rtl::OUString& aCtrlName )
950 {
951 	// Get library for DlgEditor
952 	DialogWindow* pDlgWin = FindDialogWindowForEditor( pEditor );
953 	if( !pDlgWin )
954 		return;
955     ScriptDocument aDocument( pDlgWin->GetDocument() );
956     DBG_ASSERT( aDocument.isValid(), "LocalizationMgr::deleteControlResourceIDsForDeletedEditorObject: invalid document!" );
957     if ( !aDocument.isValid() )
958         return;
959 	const String& rLibName = pDlgWin->GetLibName();
960 	Reference< container::XNameContainer > xDialogLib( aDocument.getLibrary( E_DIALOGS, rLibName, sal_True ) );
961 	Reference< XStringResourceManager > xStringResourceManager =
962 		LocalizationMgr::getStringResourceFromDialogLibrary( xDialogLib );
963 
964 	::rtl::OUString aDialogName = pDlgWin->GetName();
965 	Reference< XStringResourceResolver > xDummyStringResolver;
966 	sal_Int32 nChangedCount = implHandleControlResourceProperties
967 		( aControlAny, aDialogName, aCtrlName, xStringResourceManager,
968 		  xDummyStringResolver, REMOVE_IDS_FROM_RESOURCE );
969 
970 	if( nChangedCount )
971 		BasicIDE::MarkDocumentModified( aDocument );
972 }
973 
setStringResourceAtDialog(const ScriptDocument & rDocument,const String & aLibName,const String & aDlgName,Reference<container::XNameContainer> xDialogModel)974 void LocalizationMgr::setStringResourceAtDialog( const ScriptDocument& rDocument, const String& aLibName,
975 	const String& aDlgName, Reference< container::XNameContainer > xDialogModel )
976 {
977 	static ::rtl::OUString aResourceResolverPropName = ::rtl::OUString::createFromAscii( "ResourceResolver" );
978 
979 	// Get library
980 	Reference< container::XNameContainer > xDialogLib( rDocument.getLibrary( E_DIALOGS, aLibName, sal_True ) );
981 	Reference< XStringResourceManager > xStringResourceManager =
982 		LocalizationMgr::getStringResourceFromDialogLibrary( xDialogLib );
983 
984 	// Set resource property
985 	if( xStringResourceManager.is() )
986 	{
987 		// Not very elegant as dialog may or may not be localized yet
988 		// TODO: Find better place, where dialog is created
989 		if( xStringResourceManager->getLocales().getLength() > 0 )
990 		{
991 			Any aDialogCtrl;
992 			aDialogCtrl <<= xDialogModel;
993 			Reference< XStringResourceResolver > xDummyStringResolver;
994 			implHandleControlResourceProperties( aDialogCtrl, aDlgName,
995 				::rtl::OUString(), xStringResourceManager,
996 				xDummyStringResolver, SET_IDS );
997 		}
998 
999 		Reference< beans::XPropertySet > xDlgPSet( xDialogModel, UNO_QUERY );
1000 		Any aStringResourceManagerAny;
1001 		aStringResourceManagerAny <<= xStringResourceManager;
1002 		xDlgPSet->setPropertyValue( aResourceResolverPropName, aStringResourceManagerAny );
1003 	}
1004 }
1005 
renameStringResourceIDs(const ScriptDocument & rDocument,const String & aLibName,const String & aDlgName,Reference<container::XNameContainer> xDialogModel)1006 void LocalizationMgr::renameStringResourceIDs( const ScriptDocument& rDocument, const String& aLibName,
1007 	const String& aDlgName, Reference< container::XNameContainer > xDialogModel )
1008 {
1009 	// Get library
1010 	Reference< container::XNameContainer > xDialogLib( rDocument.getLibrary( E_DIALOGS, aLibName, sal_True ) );
1011 	Reference< XStringResourceManager > xStringResourceManager =
1012 		LocalizationMgr::getStringResourceFromDialogLibrary( xDialogLib );
1013 	if( !xStringResourceManager.is() )
1014 		return;
1015 
1016 	Any aDialogCtrl;
1017 	aDialogCtrl <<= xDialogModel;
1018 	Reference< XStringResourceResolver > xDummyStringResolver;
1019 	implHandleControlResourceProperties( aDialogCtrl, aDlgName,
1020 		::rtl::OUString(), xStringResourceManager,
1021 		xDummyStringResolver, RENAME_DIALOG_IDS );
1022 
1023 	// Handle all controls
1024 	Sequence< ::rtl::OUString > aNames = xDialogModel->getElementNames();
1025 	const ::rtl::OUString* pNames = aNames.getConstArray();
1026 	sal_Int32 nCtrls = aNames.getLength();
1027 	for( sal_Int32 i = 0 ; i < nCtrls ; ++i )
1028 	{
1029 		::rtl::OUString aCtrlName( pNames[i] );
1030 		Any aCtrl = xDialogModel->getByName( aCtrlName );
1031 		implHandleControlResourceProperties( aCtrl, aDlgName,
1032 			aCtrlName, xStringResourceManager,
1033 			xDummyStringResolver, RENAME_DIALOG_IDS );
1034 	}
1035 }
1036 
removeResourceForDialog(const ScriptDocument & rDocument,const String & aLibName,const String & aDlgName,Reference<container::XNameContainer> xDialogModel)1037 void LocalizationMgr::removeResourceForDialog( const ScriptDocument& rDocument, const String& aLibName,
1038 	const String& aDlgName, Reference< container::XNameContainer > xDialogModel )
1039 {
1040 	// Get library
1041 	Reference< container::XNameContainer > xDialogLib( rDocument.getLibrary( E_DIALOGS, aLibName, sal_True ) );
1042 	Reference< XStringResourceManager > xStringResourceManager =
1043 		LocalizationMgr::getStringResourceFromDialogLibrary( xDialogLib );
1044 	if( !xStringResourceManager.is() )
1045 		return;
1046 
1047 	Any aDialogCtrl;
1048 	aDialogCtrl <<= xDialogModel;
1049 	Reference< XStringResourceResolver > xDummyStringResolver;
1050 	implHandleControlResourceProperties( aDialogCtrl, aDlgName,
1051 		::rtl::OUString(), xStringResourceManager,
1052 		xDummyStringResolver, REMOVE_IDS_FROM_RESOURCE );
1053 
1054 	// Handle all controls
1055 	Sequence< ::rtl::OUString > aNames = xDialogModel->getElementNames();
1056 	const ::rtl::OUString* pNames = aNames.getConstArray();
1057 	sal_Int32 nCtrls = aNames.getLength();
1058 	for( sal_Int32 i = 0 ; i < nCtrls ; ++i )
1059 	{
1060 		::rtl::OUString aCtrlName( pNames[i] );
1061 		Any aCtrl = xDialogModel->getByName( aCtrlName );
1062 		implHandleControlResourceProperties( aCtrl, aDlgName,
1063 			aCtrlName, xStringResourceManager,
1064 			xDummyStringResolver, REMOVE_IDS_FROM_RESOURCE );
1065 	}
1066 }
1067 
resetResourceForDialog(Reference<container::XNameContainer> xDialogModel,Reference<XStringResourceManager> xStringResourceManager)1068 void LocalizationMgr::resetResourceForDialog( Reference< container::XNameContainer > xDialogModel,
1069 	Reference< XStringResourceManager > xStringResourceManager )
1070 {
1071 	if( !xStringResourceManager.is() )
1072 		return;
1073 
1074 	// Dialog as control
1075 	::rtl::OUString aDummyName;
1076 	Any aDialogCtrl;
1077 	aDialogCtrl <<= xDialogModel;
1078 	Reference< XStringResourceResolver > xDummyStringResolver;
1079 	implHandleControlResourceProperties( aDialogCtrl, aDummyName,
1080 		aDummyName, xStringResourceManager, xDummyStringResolver, RESET_IDS );
1081 
1082 	// Handle all controls
1083 	Sequence< ::rtl::OUString > aNames = xDialogModel->getElementNames();
1084 	const ::rtl::OUString* pNames = aNames.getConstArray();
1085 	sal_Int32 nCtrls = aNames.getLength();
1086 	for( sal_Int32 i = 0 ; i < nCtrls ; ++i )
1087 	{
1088 		::rtl::OUString aCtrlName( pNames[i] );
1089 		Any aCtrl = xDialogModel->getByName( aCtrlName );
1090 		implHandleControlResourceProperties( aCtrl, aDummyName,
1091 			aCtrlName, xStringResourceManager, xDummyStringResolver, RESET_IDS );
1092 	}
1093 }
1094 
setResourceIDsForDialog(Reference<container::XNameContainer> xDialogModel,Reference<XStringResourceManager> xStringResourceManager)1095 void LocalizationMgr::setResourceIDsForDialog( Reference< container::XNameContainer > xDialogModel,
1096 	Reference< XStringResourceManager > xStringResourceManager )
1097 {
1098 	if( !xStringResourceManager.is() )
1099 		return;
1100 
1101 	// Dialog as control
1102 	::rtl::OUString aDummyName;
1103 	Any aDialogCtrl;
1104 	aDialogCtrl <<= xDialogModel;
1105 	Reference< XStringResourceResolver > xDummyStringResolver;
1106 	implHandleControlResourceProperties( aDialogCtrl, aDummyName,
1107 		aDummyName, xStringResourceManager, xDummyStringResolver, SET_IDS );
1108 
1109 	// Handle all controls
1110 	Sequence< ::rtl::OUString > aNames = xDialogModel->getElementNames();
1111 	const ::rtl::OUString* pNames = aNames.getConstArray();
1112 	sal_Int32 nCtrls = aNames.getLength();
1113 	for( sal_Int32 i = 0 ; i < nCtrls ; ++i )
1114 	{
1115 		::rtl::OUString aCtrlName( pNames[i] );
1116 		Any aCtrl = xDialogModel->getByName( aCtrlName );
1117 		implHandleControlResourceProperties( aCtrl, aDummyName,
1118 			aCtrlName, xStringResourceManager, xDummyStringResolver, SET_IDS );
1119 	}
1120 }
1121 
copyResourcesForPastedEditorObject(DlgEditor * pEditor,Any aControlAny,const::rtl::OUString & aCtrlName,Reference<XStringResourceResolver> xSourceStringResolver)1122 void LocalizationMgr::copyResourcesForPastedEditorObject( DlgEditor* pEditor,
1123 	Any aControlAny, const ::rtl::OUString& aCtrlName,
1124 	Reference< XStringResourceResolver > xSourceStringResolver )
1125 {
1126 	// Get library for DlgEditor
1127 	DialogWindow* pDlgWin = FindDialogWindowForEditor( pEditor );
1128 	if( !pDlgWin )
1129 		return;
1130     ScriptDocument aDocument( pDlgWin->GetDocument() );
1131     DBG_ASSERT( aDocument.isValid(), "LocalizationMgr::copyResourcesForPastedEditorObject: invalid document!" );
1132     if ( !aDocument.isValid() )
1133         return;
1134 	const String& rLibName = pDlgWin->GetLibName();
1135 	Reference< container::XNameContainer > xDialogLib( aDocument.getLibrary( E_DIALOGS, rLibName, sal_True ) );
1136 	Reference< XStringResourceManager > xStringResourceManager =
1137 		LocalizationMgr::getStringResourceFromDialogLibrary( xDialogLib );
1138 
1139 	// Set resource property
1140 	if( !xStringResourceManager.is() || xStringResourceManager->getLocales().getLength() == 0 )
1141 		return;
1142 
1143 	::rtl::OUString aDialogName = pDlgWin->GetName();
1144 	implHandleControlResourceProperties
1145 		( aControlAny, aDialogName, aCtrlName, xStringResourceManager,
1146 		  xSourceStringResolver, MOVE_RESOURCES );
1147 }
1148 
copyResourceForDroppedDialog(Reference<container::XNameContainer> xDialogModel,const::rtl::OUString & aDialogName,Reference<XStringResourceManager> xStringResourceManager,Reference<XStringResourceResolver> xSourceStringResolver)1149 void LocalizationMgr::copyResourceForDroppedDialog( Reference< container::XNameContainer > xDialogModel,
1150 	const ::rtl::OUString& aDialogName, Reference< XStringResourceManager > xStringResourceManager,
1151 	Reference< XStringResourceResolver > xSourceStringResolver )
1152 {
1153 	if( !xStringResourceManager.is() )
1154 		return;
1155 
1156 	// Dialog as control
1157 	::rtl::OUString aDummyName;
1158 	Any aDialogCtrl;
1159 	aDialogCtrl <<= xDialogModel;
1160 	implHandleControlResourceProperties( aDialogCtrl, aDialogName,
1161 		aDummyName, xStringResourceManager, xSourceStringResolver, MOVE_RESOURCES );
1162 
1163 	// Handle all controls
1164 	Sequence< ::rtl::OUString > aNames = xDialogModel->getElementNames();
1165 	const ::rtl::OUString* pNames = aNames.getConstArray();
1166 	sal_Int32 nCtrls = aNames.getLength();
1167 	for( sal_Int32 i = 0 ; i < nCtrls ; ++i )
1168 	{
1169 		::rtl::OUString aCtrlName( pNames[i] );
1170 		Any aCtrl = xDialogModel->getByName( aCtrlName );
1171 		implHandleControlResourceProperties( aCtrl, aDialogName,
1172 			aCtrlName, xStringResourceManager, xSourceStringResolver, MOVE_RESOURCES );
1173 	}
1174 }
1175 
copyResourceForDialog(const Reference<container::XNameContainer> & xDialogModel,const Reference<XStringResourceResolver> & xSourceStringResolver,const Reference<XStringResourceManager> & xTargetStringResourceManager)1176 void LocalizationMgr::copyResourceForDialog(
1177 	const Reference< container::XNameContainer >& xDialogModel,
1178 	const Reference< XStringResourceResolver >& xSourceStringResolver,
1179 	const Reference< XStringResourceManager >& xTargetStringResourceManager )
1180 {
1181 	if( !xDialogModel.is() || !xSourceStringResolver.is() || !xTargetStringResourceManager.is() )
1182 		return;
1183 
1184 	::rtl::OUString aDummyName;
1185 	Any aDialogCtrl;
1186 	aDialogCtrl <<= xDialogModel;
1187 	implHandleControlResourceProperties
1188 		( aDialogCtrl, aDummyName, aDummyName, xTargetStringResourceManager,
1189 		  xSourceStringResolver, COPY_RESOURCES );
1190 
1191 	// Handle all controls
1192 	Sequence< ::rtl::OUString > aNames = xDialogModel->getElementNames();
1193 	const ::rtl::OUString* pNames = aNames.getConstArray();
1194 	sal_Int32 nCtrls = aNames.getLength();
1195 	for( sal_Int32 i = 0 ; i < nCtrls ; ++i )
1196 	{
1197 		::rtl::OUString aCtrlName( pNames[i] );
1198 		Any aCtrl = xDialogModel->getByName( aCtrlName );
1199 		implHandleControlResourceProperties( aCtrl, aDummyName, aDummyName,
1200 			xTargetStringResourceManager, xSourceStringResolver, COPY_RESOURCES );
1201 	}
1202 }
1203 
getStringResourceFromDialogLibrary(Reference<container::XNameContainer> xDialogLib)1204 Reference< XStringResourceManager > LocalizationMgr::getStringResourceFromDialogLibrary
1205 	( Reference< container::XNameContainer > xDialogLib )
1206 {
1207 	Reference< XStringResourceManager > xStringResourceManager;
1208 	if( xDialogLib.is() )
1209 	{
1210 		Reference< resource::XStringResourceSupplier > xStringResourceSupplier( xDialogLib, UNO_QUERY );
1211 		if( xStringResourceSupplier.is() )
1212 		{
1213 			Reference< resource::XStringResourceResolver >
1214 				xStringResourceResolver = xStringResourceSupplier->getStringResource();
1215 
1216 			xStringResourceManager =
1217 				Reference< resource::XStringResourceManager >( xStringResourceResolver, UNO_QUERY );
1218 		}
1219 	}
1220 	return xStringResourceManager;
1221 }
1222 
1223