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