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 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_cui.hxx" 26 #include <com/sun/star/beans/XPropertySet.hpp> 27 #include <com/sun/star/lang/XMultiServiceFactory.hpp> 28 #include <com/sun/star/loader/CannotActivateFactoryException.hpp> 29 #include <com/sun/star/linguistic2/XDictionaryList.hpp> 30 #include <com/sun/star/frame/XDesktop.hpp> 31 #include <com/sun/star/frame/XFrame.hpp> 32 #include <com/sun/star/frame/XModuleManager.hpp> 33 #include <com/sun/star/util/XMacroExpander.hpp> 34 #include <osl/module.hxx> 35 #include <com/sun/star/util/XCloseable.hpp> 36 #include <com/sun/star/frame/XLoadable.hpp> 37 #include <tools/rcid.h> 38 #include <tools/shl.hxx> 39 #include <tools/urlobj.hxx> 40 #include <comphelper/processfactory.hxx> 41 #include <toolkit/helper/vclunohelper.hxx> 42 #include <com/sun/star/beans/PropertyValue.hpp> 43 #include <com/sun/star/container/XNameContainer.hpp> 44 #include <com/sun/star/container/XNameAccess.hpp> 45 #include <com/sun/star/oooimprovement/XCoreController.hpp> 46 #include <comphelper/configurationhelper.hxx> 47 #include <com/sun/star/awt/XDialogProvider.hpp> 48 #include <com/sun/star/awt/XDialogProvider2.hpp> 49 #include <com/sun/star/awt/XContainerWindowProvider.hpp> 50 #include <com/sun/star/awt/XDialogEventHandler.hpp> 51 #include <com/sun/star/awt/XContainerWindowEventHandler.hpp> 52 #include <com/sun/star/awt/PosSize.hpp> 53 #include <com/sun/star/awt/XTopWindow.hpp> 54 #include <com/sun/star/awt/XControl.hpp> 55 #include <com/sun/star/awt/XTabController.hpp> 56 #include <vcl/help.hxx> 57 #include <linguistic/misc.hxx> 58 #include <svtools/helpopt.hxx> 59 #include <unotools/moduleoptions.hxx> 60 #include <svl/languageoptions.hxx> 61 #include <unotools/optionsdlg.hxx> 62 #include <sfx2/module.hxx> 63 #include <vcl/msgbox.hxx> 64 #include <sfx2/dispatch.hxx> 65 #include <vcl/waitobj.hxx> 66 #include <svl/slstitm.hxx> 67 #include <sfx2/viewfrm.hxx> 68 #include <unotools/viewoptions.hxx> 69 #include <sfx2/printopt.hxx> 70 #include <osl/module.h> 71 #include <osl/process.h> 72 #include <rtl/bootstrap.hxx> 73 #include <unotools/misccfg.hxx> 74 #include <sfx2/objsh.hxx> 75 #include <sfx2/viewsh.hxx> 76 #include <sfx2/tplpitem.hxx> 77 #include <svtools/apearcfg.hxx> 78 #include <unotools/linguprops.hxx> 79 #include <sfx2/app.hxx> 80 #include <svx/xdef.hxx> 81 #include <svx/xflclit.hxx> 82 #include <svx/xpool.hxx> 83 #include "cuitabarea.hxx" 84 #include <svx/ofaitem.hxx> 85 #include "opthtml.hxx" 86 #include "optcolor.hxx" 87 #include "optctl.hxx" 88 #include "optjava.hxx" 89 #include "optsave.hxx" 90 #include "optpath.hxx" 91 #include "cuioptgenrl.hxx" 92 #include "optlingu.hxx" 93 #include "optinet2.hxx" 94 #include "optasian.hxx" 95 #include "optaccessibility.hxx" 96 #include "optjsearch.hxx" 97 #include "connpooloptions.hxx" 98 #include "optupdt.hxx" 99 #include <optimprove.hxx> 100 #include "optchart.hxx" 101 #include "optgdlg.hxx" 102 #include "optmemory.hxx" 103 #include "optfltr.hxx" 104 #include <cuires.hrc> 105 #include "helpid.hrc" 106 #include <dialmgr.hxx> 107 #include "treeopt.hxx" 108 #include "treeopt.hrc" 109 #include "fontsubs.hxx" 110 #include <editeng/unolingu.hxx> 111 #include <svx/xtable.hxx> 112 #include "connpoolconfig.hxx" 113 #include "dbregister.hxx" 114 #include "dbregisterednamesconfig.hxx" 115 #include "cfgchart.hxx" 116 #include <svx/dialogs.hrc> 117 118 #ifndef _SVX_LANGITEM_HXX 119 #define ITEMID_LANGUAGE SID_ATTR_CHAR_LANGUAGE 120 #include <editeng/langitem.hxx> 121 #endif 122 123 124 #include <editeng/optitems.hxx> 125 126 #include <svx/drawitem.hxx> 127 #include <rtl/uri.hxx> 128 129 #ifdef LINUX 130 #include <string.h> 131 #include <sys/types.h> 132 #include <sys/stat.h> 133 #include <unistd.h> 134 #endif 135 136 using namespace ::com::sun::star; 137 using namespace ::com::sun::star::beans; 138 using namespace ::com::sun::star::container; 139 using namespace ::com::sun::star::frame; 140 using namespace ::com::sun::star::lang; 141 using namespace ::com::sun::star::linguistic2; 142 using namespace ::com::sun::star::uno; 143 using namespace ::com::sun::star::util; 144 145 #ifdef C2U 146 #error "Who define C2U before! I use it to create const ascii strings ..." 147 #else 148 #define C2U(cChar) rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( cChar ) ) 149 #endif 150 151 #define HINT_TIMEOUT 200 152 #define SELECT_FIRST_TIMEOUT 0 153 #define SELECT_TIMEOUT 300 154 #define COLORPAGE_UNKNOWN ((sal_uInt16)0xFFFF) 155 #define EXPAND_PROTOCOL "vnd.sun.star.expand:" 156 157 LastPageSaver* OfaTreeOptionsDialog::pLastPageSaver = NULL; 158 159 // some stuff for easier changes for SvtViewOptions 160 static const sal_Char* pViewOptDataName = "page data"; 161 #define VIEWOPT_DATANAME rtl::OUString::createFromAscii( pViewOptDataName ) 162 163 static XOutdevItemPool* mpStaticXOutdevItemPool = 0L; 164 165 static inline void SetViewOptUserItem( SvtViewOptions& rOpt, const String& rData ) 166 { 167 rOpt.SetUserItem( VIEWOPT_DATANAME, makeAny( rtl::OUString( rData ) ) ); 168 } 169 170 static inline String GetViewOptUserItem( const SvtViewOptions& rOpt ) 171 { 172 Any aAny( rOpt.GetUserItem( VIEWOPT_DATANAME ) ); 173 rtl::OUString aUserData; 174 aAny >>= aUserData; 175 176 return String( aUserData ); 177 } 178 179 struct ModuleToGroupNameMap_Impl 180 { 181 const char* m_pModule; 182 String m_sGroupName; 183 sal_uInt16 m_nNodeId; 184 }; 185 186 static OfaPageResource* pPageRes = NULL; 187 188 static ModuleToGroupNameMap_Impl ModuleMap[] = 189 { 190 { "ProductName", String::EmptyString(), SID_GENERAL_OPTIONS }, 191 { "LanguageSettings", String::EmptyString(), SID_LANGUAGE_OPTIONS }, 192 { "Internet", String::EmptyString(), SID_INET_DLG }, 193 { "LoadSave", String::EmptyString(), SID_FILTER_DLG }, 194 { "Writer", String::EmptyString(), SID_SW_EDITOPTIONS }, 195 { "WriterWeb", String::EmptyString(), SID_SW_ONLINEOPTIONS }, 196 { "Math", String::EmptyString(), SID_SM_EDITOPTIONS }, 197 { "Calc", String::EmptyString(), SID_SC_EDITOPTIONS }, 198 { "Impress", String::EmptyString(), SID_SD_EDITOPTIONS }, 199 { "Draw", String::EmptyString(), SID_SD_GRAPHIC_OPTIONS }, 200 { "Charts", String::EmptyString(), SID_SCH_EDITOPTIONS }, 201 { "Base", String::EmptyString(), SID_SB_STARBASEOPTIONS }, 202 203 { NULL, String::EmptyString(), 0xFFFF } 204 }; 205 206 static void setGroupName( const rtl::OUString& rModule, const String& rGroupName ) 207 { 208 sal_uInt16 nIndex = 0; 209 while ( ModuleMap[ nIndex ].m_pModule ) 210 { 211 rtl::OUString sTemp = 212 rtl::OUString::createFromAscii( ModuleMap[ nIndex ].m_pModule ); 213 if ( sTemp == rModule ) 214 { 215 ModuleMap[ nIndex ].m_sGroupName = rGroupName; 216 break; 217 } 218 ++nIndex; 219 } 220 } 221 222 static String getGroupName( const rtl::OUString& rModule, bool bForced ) 223 { 224 String sGroupName; 225 sal_uInt16 nIndex = 0; 226 while ( ModuleMap[ nIndex ].m_pModule ) 227 { 228 rtl::OUString sTemp = 229 rtl::OUString::createFromAscii( ModuleMap[ nIndex ].m_pModule ); 230 if ( sTemp == rModule ) 231 { 232 sGroupName = ModuleMap[ nIndex ].m_sGroupName; 233 break; 234 } 235 ++nIndex; 236 } 237 238 if ( sGroupName.Len() == 0 && bForced ) 239 { 240 if ( !pPageRes ) 241 pPageRes = new OfaPageResource; 242 243 if ( rModule == C2U("Writer") ) 244 sGroupName = pPageRes->GetTextArray().GetString(0); 245 else if ( rModule == C2U("WriterWeb") ) 246 sGroupName = pPageRes->GetHTMLArray().GetString(0); 247 else if ( rModule == C2U("Calc") ) 248 sGroupName = pPageRes->GetCalcArray().GetString(0); 249 else if ( rModule == C2U("Impress") ) 250 sGroupName = pPageRes->GetImpressArray().GetString(0); 251 else if ( rModule == C2U("Draw") ) 252 sGroupName = pPageRes->GetDrawArray().GetString(0); 253 else if ( rModule == C2U("Math") ) 254 sGroupName = pPageRes->GetStarMathArray().GetString(0); 255 else if ( rModule == C2U("Base") ) 256 sGroupName = pPageRes->GetDatasourcesArray().GetString(0); 257 } 258 return sGroupName; 259 } 260 261 static void deleteGroupNames() 262 { 263 sal_uInt16 nIndex = 0; 264 while ( ModuleMap[ nIndex ].m_pModule ) 265 ModuleMap[ nIndex++ ].m_sGroupName = String::EmptyString(); 266 } 267 268 static sal_uInt16 getGroupNodeId( const rtl::OUString& rModule ) 269 { 270 sal_uInt16 nNodeId = 0xFFFF, nIndex = 0; 271 while ( ModuleMap[ nIndex ].m_pModule ) 272 { 273 rtl::OUString sTemp = 274 rtl::OUString::createFromAscii( ModuleMap[ nIndex ].m_pModule ); 275 if ( sTemp == rModule ) 276 { 277 nNodeId = ModuleMap[ nIndex ].m_nNodeId; 278 break; 279 } 280 ++nIndex; 281 } 282 283 return nNodeId; 284 } 285 286 /*-- 29.10.2004 13:57:25--------------------------------------------------- 287 288 -----------------------------------------------------------------------*/ 289 class MailMergeCfg_Impl : public utl::ConfigItem 290 { 291 friend class SvxEMailTabPage; 292 // variables 293 sal_Bool bIsEmailSupported; 294 295 public: 296 MailMergeCfg_Impl(); 297 virtual ~MailMergeCfg_Impl(); 298 299 virtual void Commit(); 300 virtual void Notify( const com::sun::star::uno::Sequence< rtl::OUString >& _rPropertyNames); 301 302 sal_Bool IsEmailSupported() const {return bIsEmailSupported;} 303 304 }; 305 /*-- 29.10.2004 13:57:25--------------------------------------------------- 306 307 -----------------------------------------------------------------------*/ 308 MailMergeCfg_Impl::MailMergeCfg_Impl() : 309 utl::ConfigItem(C2U("Office.Writer/MailMergeWizard")), 310 bIsEmailSupported(sal_False) 311 { 312 Sequence<rtl::OUString> aNames(1); 313 aNames.getArray()[0] = C2U("EMailSupported"); 314 const Sequence< Any > aValues = GetProperties(aNames); 315 const Any* pValues = aValues.getConstArray(); 316 if(aValues.getLength() && pValues[0].hasValue()) 317 pValues[0] >>= bIsEmailSupported; 318 } 319 /*-- 29.10.2004 13:57:25--------------------------------------------------- 320 321 -----------------------------------------------------------------------*/ 322 MailMergeCfg_Impl::~MailMergeCfg_Impl() 323 { 324 } 325 /* -------------------------------------------------------------------------*/ 326 void MailMergeCfg_Impl::Commit() 327 { 328 } 329 330 void MailMergeCfg_Impl::Notify( const com::sun::star::uno::Sequence< rtl::OUString >& ) 331 { 332 } 333 334 //typedef SfxTabPage* (*FNCreateTabPage)( Window *pParent, const SfxItemSet &rAttrSet ); 335 SfxTabPage* CreateGeneralTabPage( sal_uInt16 nId, Window* pParent, const SfxItemSet& rSet ) 336 { 337 CreateTabPage fnCreate = 0; 338 switch(nId) 339 { 340 case RID_SFXPAGE_SAVE: fnCreate = &SvxSaveTabPage::Create; break; 341 case RID_SFXPAGE_PATH: fnCreate = &SvxPathTabPage::Create; break; 342 case RID_SFXPAGE_GENERAL: fnCreate = &SvxGeneralTabPage::Create; break; 343 case RID_SFXPAGE_PRINTOPTIONS: fnCreate = &SfxCommonPrintOptionsTabPage::Create; break; 344 case OFA_TP_LANGUAGES: fnCreate = &OfaLanguagesTabPage::Create; break; 345 case RID_SFXPAGE_LINGU: fnCreate = &SvxLinguTabPage::Create; break; 346 case RID_SVXPAGE_COLOR: fnCreate = &SvxColorTabPage::Create; break; 347 case OFA_TP_VIEW: fnCreate = &OfaViewTabPage::Create; break; 348 case OFA_TP_MISC: fnCreate = &OfaMiscTabPage::Create; break; 349 case OFA_TP_MEMORY: fnCreate = &OfaMemoryOptionsPage::Create; break; 350 case RID_SVXPAGE_ASIAN_LAYOUT: fnCreate = &SvxAsianLayoutPage::Create; break; 351 case RID_SVX_FONT_SUBSTITUTION: fnCreate = &SvxFontSubstTabPage::Create; break; 352 case RID_SVXPAGE_INET_PROXY: fnCreate = &SvxProxyTabPage::Create; break; 353 case RID_SVXPAGE_INET_SEARCH: fnCreate = &SvxSearchTabPage::Create; break; 354 case RID_SVXPAGE_INET_SECURITY: fnCreate = &SvxSecurityTabPage::Create; break; 355 case RID_SVXPAGE_INET_MAIL: fnCreate = &SvxEMailTabPage::Create; break; 356 case RID_SVXPAGE_COLORCONFIG: fnCreate = &SvxColorOptionsTabPage::Create; break; 357 case RID_OFAPAGE_HTMLOPT: fnCreate = &OfaHtmlTabPage::Create; break; 358 case SID_OPTFILTER_MSOFFICE: fnCreate = &OfaMSFilterTabPage::Create; break; 359 case RID_OFAPAGE_MSFILTEROPT2: fnCreate = &OfaMSFilterTabPage2::Create; break; 360 case RID_SVXPAGE_JSEARCH_OPTIONS: fnCreate = &SvxJSearchOptionsPage::Create ; break; 361 case SID_SB_CONNECTIONPOOLING: fnCreate = &::offapp::ConnectionPoolOptionsPage::Create; break; 362 case SID_SB_DBREGISTEROPTIONS: fnCreate = &::svx::DbRegistrationOptionsPage::Create; break; 363 case RID_SVXPAGE_ACCESSIBILITYCONFIG: fnCreate = &SvxAccessibilityOptionsTabPage::Create; break; 364 case RID_SVXPAGE_SSO: fnCreate = GetSSOCreator(); break; 365 case RID_SVXPAGE_OPTIONS_CTL: fnCreate = &SvxCTLOptionsPage::Create ; break; 366 case RID_SVXPAGE_OPTIONS_JAVA: fnCreate = &SvxJavaOptionsPage::Create ; break; 367 case RID_SVXPAGE_ONLINEUPDATE: fnCreate = &SvxOnlineUpdateTabPage::Create; break; 368 case RID_OPTPAGE_CHART_DEFCOLORS: fnCreate = &SvxDefaultColorOptPage::Create; break; 369 case RID_SVXPAGE_IMPROVEMENT: fnCreate = &SvxImprovementOptionsPage::Create; break; 370 } 371 372 SfxTabPage* pRet = fnCreate ? (*fnCreate)( pParent, rSet ) : NULL; 373 return pRet; 374 } 375 376 377 struct OptionsMapping_Impl 378 { 379 const char* m_pGroupName; 380 const char* m_pPageName; 381 sal_uInt16 m_nPageId; 382 }; 383 384 static OptionsMapping_Impl __READONLY_DATA OptionsMap_Impl[] = 385 { 386 // GROUP PAGE PAGE-ID 387 { "ProductName", NULL, SID_GENERAL_OPTIONS }, 388 { "ProductName", "UserData", RID_SFXPAGE_GENERAL }, 389 { "ProductName", "General", OFA_TP_MISC }, 390 { "ProductName", "Memory", OFA_TP_MEMORY }, 391 { "ProductName", "View", OFA_TP_VIEW }, 392 { "ProductName", "Print", RID_SFXPAGE_PRINTOPTIONS }, 393 { "ProductName", "Paths", RID_SFXPAGE_PATH }, 394 { "ProductName", "Colors", RID_SVXPAGE_COLOR }, 395 { "ProductName", "Fonts", RID_SVX_FONT_SUBSTITUTION }, 396 { "ProductName", "Security", RID_SVXPAGE_INET_SECURITY }, 397 { "ProductName", "Appearance", RID_SVXPAGE_COLORCONFIG }, 398 { "ProductName", "Accessibility", RID_SVXPAGE_ACCESSIBILITYCONFIG }, 399 { "ProductName", "Java", RID_SVXPAGE_OPTIONS_JAVA }, 400 { "ProductName", "NetworkIdentity", RID_SVXPAGE_SSO }, 401 { "ProductName", "OnlineUpdate", RID_SVXPAGE_ONLINEUPDATE }, 402 { "ProductName", "ImprovementProgram", RID_SVXPAGE_IMPROVEMENT }, 403 { "LanguageSettings", NULL, SID_LANGUAGE_OPTIONS }, 404 { "LanguageSettings", "Languages", OFA_TP_LANGUAGES }, 405 { "LanguageSettings", "WritingAids", RID_SFXPAGE_LINGU }, 406 { "LanguageSettings", "SearchingInJapanese", RID_SVXPAGE_JSEARCH_OPTIONS }, 407 { "LanguageSettings", "AsianLayout", RID_SVXPAGE_ASIAN_LAYOUT }, 408 { "LanguageSettings", "ComplexTextLayout", RID_SVXPAGE_OPTIONS_CTL }, 409 { "Internet", NULL, SID_INET_DLG }, 410 { "Internet", "Proxy", RID_SVXPAGE_INET_PROXY }, 411 { "Internet", "Search", RID_SVXPAGE_INET_SEARCH }, 412 { "Internet", "Email", RID_SVXPAGE_INET_MAIL }, 413 { "LoadSave", NULL, SID_FILTER_DLG }, 414 { "LoadSave", "General", RID_SFXPAGE_SAVE }, 415 { "LoadSave", "VBAProperties", SID_OPTFILTER_MSOFFICE }, 416 { "LoadSave", "MicrosoftOffice", RID_OFAPAGE_MSFILTEROPT2 }, 417 { "LoadSave", "HTMLCompatibility", RID_OFAPAGE_HTMLOPT }, 418 { "Writer", NULL, SID_SW_EDITOPTIONS }, 419 { "Writer", "General", RID_SW_TP_OPTLOAD_PAGE }, 420 { "Writer", "View", RID_SW_TP_CONTENT_OPT }, 421 { "Writer", "FormattingAids", RID_SW_TP_OPTSHDWCRSR }, 422 { "Writer", "Grid", RID_SVXPAGE_GRID }, 423 { "Writer", "BasicFontsWestern", RID_SW_TP_STD_FONT }, 424 { "Writer", "BasicFontsAsian", RID_SW_TP_STD_FONT_CJK }, 425 { "Writer", "BasicFontsCTL", RID_SW_TP_STD_FONT_CTL }, 426 { "Writer", "Print", RID_SW_TP_OPTPRINT_PAGE }, 427 { "Writer", "Table", RID_SW_TP_OPTTABLE_PAGE }, 428 { "Writer", "Changes", RID_SW_TP_REDLINE_OPT }, 429 { "Writer", "Compatibility", RID_SW_TP_OPTCOMPATIBILITY_PAGE }, 430 { "Writer", "AutoCaption", RID_SW_TP_OPTCAPTION_PAGE }, 431 { "Writer", "MailMerge", RID_SW_TP_MAILCONFIG }, 432 { "WriterWeb", NULL, SID_SW_ONLINEOPTIONS }, 433 { "WriterWeb", "View", RID_SW_TP_HTML_CONTENT_OPT }, 434 { "WriterWeb", "FormattingAids", RID_SW_TP_HTML_OPTSHDWCRSR }, 435 { "WriterWeb", "Grid", RID_SW_TP_HTML_OPTGRID_PAGE }, 436 { "WriterWeb", "Print", RID_SW_TP_HTML_OPTPRINT_PAGE }, 437 { "WriterWeb", "Table", RID_SW_TP_HTML_OPTTABLE_PAGE }, 438 { "WriterWeb", "Background", RID_SW_TP_BACKGROUND }, 439 { "Math", NULL, SID_SM_EDITOPTIONS }, 440 { "Math", "Settings", SID_SM_TP_PRINTOPTIONS }, 441 { "Calc", NULL, SID_SC_EDITOPTIONS }, 442 { "Calc", "General", SID_SC_TP_LAYOUT }, 443 { "Calc", "View", SID_SC_TP_CONTENT }, 444 { "Calc", "International", RID_OFA_TP_INTERNATIONAL }, 445 { "Calc", "Calculate", SID_SC_TP_CALC }, 446 { "Calc", "SortLists", SID_SC_TP_USERLISTS }, 447 { "Calc", "Changes", SID_SC_TP_CHANGES }, 448 { "Calc", "Grid", SID_SC_TP_GRID }, 449 { "Calc", "Print", RID_SC_TP_PRINT }, 450 { "Impress", NULL, SID_SD_EDITOPTIONS }, 451 { "Impress", "General", SID_SI_TP_MISC }, 452 { "Impress", "View", SID_SI_TP_CONTENTS }, 453 { "Impress", "Grid", SID_SI_TP_SNAP }, 454 { "Impress", "Print", SID_SI_TP_PRINT }, 455 { "Draw", NULL, SID_SD_GRAPHIC_OPTIONS }, 456 { "Draw", "General", SID_SD_TP_MISC }, 457 { "Draw", "View", SID_SD_TP_CONTENTS }, 458 { "Draw", "Grid", SID_SD_TP_SNAP }, 459 { "Draw", "Print", SID_SD_TP_PRINT }, 460 { "Charts", NULL, SID_SCH_EDITOPTIONS }, 461 { "Charts", "DefaultColors", RID_OPTPAGE_CHART_DEFCOLORS }, 462 { "Base", NULL, SID_SB_STARBASEOPTIONS }, 463 { "Base", "Connections", SID_SB_CONNECTIONPOOLING }, 464 { "Base", "Databases", SID_SB_DBREGISTEROPTIONS }, 465 { NULL, NULL, 0 } 466 }; 467 468 static sal_Bool lcl_getStringFromID( sal_uInt16 _nPageId, String& _rGroupName, String& _rPageName ) 469 { 470 sal_Bool bRet = sal_False; 471 472 sal_uInt16 nIdx = 0; 473 while ( OptionsMap_Impl[nIdx].m_pGroupName != NULL ) 474 { 475 if ( _nPageId == OptionsMap_Impl[nIdx].m_nPageId ) 476 { 477 bRet = sal_True; 478 _rGroupName = String( OptionsMap_Impl[nIdx].m_pGroupName, RTL_TEXTENCODING_ASCII_US ); 479 if ( OptionsMap_Impl[nIdx].m_pPageName != NULL ) 480 _rPageName = String( OptionsMap_Impl[nIdx].m_pPageName, RTL_TEXTENCODING_ASCII_US ); 481 break; 482 } 483 ++nIdx; 484 } 485 486 return bRet; 487 } 488 489 static sal_Bool lcl_isOptionHidden( sal_uInt16 _nPageId, const SvtOptionsDialogOptions& _rOptOptions ) 490 { 491 sal_Bool bIsHidden = sal_False; 492 String sGroupName, sPageName; 493 if ( lcl_getStringFromID( _nPageId, sGroupName, sPageName ) ) 494 { 495 if ( sPageName.Len() == 0 ) 496 bIsHidden = _rOptOptions.IsGroupHidden( sGroupName ); 497 else 498 bIsHidden = _rOptOptions.IsPageHidden( sPageName, sGroupName ); 499 } 500 return bIsHidden; 501 } 502 503 /* -----------------11.02.99 09:56------------------- 504 * 505 * --------------------------------------------------*/ 506 struct OptionsPageInfo 507 { 508 SfxTabPage* m_pPage; 509 sal_uInt16 m_nPageId; 510 rtl::OUString m_sPageURL; 511 rtl::OUString m_sEventHdl; 512 ExtensionsTabPage* m_pExtPage; 513 514 OptionsPageInfo( sal_uInt16 nId ) : m_pPage( NULL ), m_nPageId( nId ), m_pExtPage( NULL ) {} 515 }; 516 517 struct OptionsGroupInfo 518 { 519 SfxItemSet* m_pInItemSet; 520 SfxItemSet* m_pOutItemSet; 521 SfxShell* m_pShell; // used to create the page 522 SfxModule* m_pModule; // used to create the ItemSet 523 sal_uInt16 m_nDialogId; // Id of the former dialog 524 sal_Bool m_bLoadError; // load fails? 525 rtl::OUString m_sPageURL; 526 ExtensionsTabPage* m_pExtPage; 527 528 OptionsGroupInfo( SfxShell* pSh, SfxModule* pMod, sal_uInt16 nId ) : 529 m_pInItemSet( NULL ), m_pOutItemSet( NULL ), m_pShell( pSh ), 530 m_pModule( pMod ), m_nDialogId( nId ), m_bLoadError( sal_False ), 531 m_sPageURL( rtl::OUString() ), m_pExtPage( NULL ) {} 532 ~OptionsGroupInfo() { delete m_pInItemSet; delete m_pOutItemSet; } 533 }; 534 535 /* -----------------04.05.99 15:51------------------- 536 * 537 * --------------------------------------------------*/ 538 sal_Bool OfaOptionsTreeListBox::Collapse( SvLBoxEntry* pParent ) 539 { 540 bInCollapse = sal_True; 541 sal_Bool bRet = SvTreeListBox::Collapse(pParent); 542 bInCollapse = sal_False; 543 return bRet; 544 } 545 546 // ----------------------------------------------------------------------- 547 548 #define INI_LIST() \ 549 aOkPB ( this, CUI_RES( PB_OK ) ),\ 550 aCancelPB ( this, CUI_RES( PB_CANCEL ) ),\ 551 aHelpPB ( this, CUI_RES( PB_HELP ) ),\ 552 aBackPB ( this, CUI_RES( PB_BACK ) ),\ 553 aHiddenGB ( this, CUI_RES( FB_BORDER ) ),\ 554 aPageTitleFT ( this, CUI_RES( FT_PAGE_TITLE ) ),\ 555 aLine1FL ( this, CUI_RES( FL_LINE_1 ) ),\ 556 aHelpFT ( this, CUI_RES( FT_HELPTEXT ) ),\ 557 aHelpImg ( this, CUI_RES( IMG_HELP ) ),\ 558 aHelpTextsArr ( CUI_RES( STR_HELPTEXTS ) ),\ 559 aTreeLB ( this, CUI_RES( TLB_PAGES ) ),\ 560 sTitle ( GetText() ),\ 561 sNotLoadedError ( CUI_RES( ST_LOAD_ERROR ) ),\ 562 pCurrentPageEntry ( NULL ),\ 563 pColorPageItemSet ( NULL ),\ 564 maColorTab (),\ 565 nChangeType ( CT_NONE ),\ 566 nUnknownType ( COLORPAGE_UNKNOWN ),\ 567 nUnknownPos ( COLORPAGE_UNKNOWN ),\ 568 bIsAreaTP ( sal_False ),\ 569 bForgetSelection ( sal_False ),\ 570 bImageResized ( sal_False ),\ 571 bInSelectHdl_Impl ( false ),\ 572 bIsFromExtensionManager( false ), \ 573 bIsForSetDocumentLanguage( false ) 574 575 // Ctor() with Frame ----------------------------------------------------- 576 using namespace ::com::sun::star; 577 OfaTreeOptionsDialog::OfaTreeOptionsDialog( 578 Window* pParent, 579 const Reference< XFrame >& _xFrame, 580 bool bActivateLastSelection ) : 581 582 SfxModalDialog( pParent, CUI_RES( RID_OFADLG_OPTIONS_TREE ) ), 583 INI_LIST() 584 { 585 FreeResource(); 586 587 InitTreeAndHandler(); 588 Initialize( _xFrame ); 589 LoadExtensionOptions( rtl::OUString() ); 590 ResizeTreeLB(); 591 if (bActivateLastSelection) 592 ActivateLastSelection(); 593 594 aTreeLB.SetAccessibleName(GetDisplayText()); 595 } 596 597 // Ctor() with ExtensionId ----------------------------------------------- 598 599 OfaTreeOptionsDialog::OfaTreeOptionsDialog( Window* pParent, const rtl::OUString& rExtensionId ) : 600 601 SfxModalDialog( pParent, CUI_RES( RID_OFADLG_OPTIONS_TREE ) ), 602 603 INI_LIST() 604 605 { 606 FreeResource(); 607 608 bIsFromExtensionManager = ( rExtensionId.getLength() > 0 ); 609 InitTreeAndHandler(); 610 LoadExtensionOptions( rExtensionId ); 611 ResizeTreeLB(); 612 ActivateLastSelection(); 613 } 614 615 /* -----------------11.02.99 07:58------------------- 616 * 617 * --------------------------------------------------*/ 618 619 OfaTreeOptionsDialog::~OfaTreeOptionsDialog() 620 { 621 SvLBoxEntry* pEntry = aTreeLB.First(); 622 // first children 623 while(pEntry) 624 { 625 // if Child (has parent), then OptionsPageInfo 626 if(aTreeLB.GetParent(pEntry)) 627 { 628 OptionsPageInfo *pPageInfo = (OptionsPageInfo *)pEntry->GetUserData(); 629 if(pPageInfo->m_pPage) 630 { 631 pPageInfo->m_pPage->FillUserData(); 632 String aPageData(pPageInfo->m_pPage->GetUserData()); 633 if ( aPageData.Len() ) 634 { 635 SvtViewOptions aTabPageOpt( E_TABPAGE, String::CreateFromInt32( pPageInfo->m_nPageId ) ); 636 SetViewOptUserItem( aTabPageOpt, aPageData ); 637 } 638 delete pPageInfo->m_pPage; 639 } 640 641 if (pPageInfo->m_nPageId == RID_SFXPAGE_LINGU) 642 { 643 // write personal dictionaries 644 Reference< XDictionaryList > xDicList( SvxGetDictionaryList() ); 645 if (xDicList.is()) 646 { 647 linguistic::SaveDictionaries( xDicList ); 648 } 649 } 650 651 if( pPageInfo->m_pExtPage ) 652 delete pPageInfo->m_pExtPage; 653 654 delete pPageInfo; 655 } 656 pEntry = aTreeLB.Next(pEntry); 657 } 658 659 // and parents 660 pEntry = aTreeLB.First(); 661 while(pEntry) 662 { 663 if(!aTreeLB.GetParent(pEntry)) 664 { 665 OptionsGroupInfo* pGroupInfo = (OptionsGroupInfo*)pEntry->GetUserData(); 666 if ( pGroupInfo && pGroupInfo->m_pExtPage ) 667 delete pGroupInfo->m_pExtPage; 668 delete pGroupInfo; 669 } 670 pEntry = aTreeLB.Next(pEntry); 671 } 672 delete pColorPageItemSet; 673 deleteGroupNames(); 674 } 675 676 /* -----------------11.02.99 08:21------------------- 677 * 678 * --------------------------------------------------*/ 679 OptionsPageInfo* OfaTreeOptionsDialog::AddTabPage( 680 sal_uInt16 nId, const String& rPageName, sal_uInt16 nGroup ) 681 { 682 OptionsPageInfo* pPageInfo = new OptionsPageInfo( nId ); 683 SvLBoxEntry* pParent = aTreeLB.GetEntry( 0, nGroup ); 684 DBG_ASSERT( pParent, "OfaTreeOptionsDialog::AddTabPage(): no group found" ); 685 SvLBoxEntry* pEntry = aTreeLB.InsertEntry( rPageName, pParent ); 686 pEntry->SetUserData( pPageInfo ); 687 return pPageInfo; 688 } 689 690 /* -----------------11.02.99 10:02------------------- 691 * der ItemSet* geht in den Besitz des Dialogs 692 * --------------------------------------------------*/ 693 sal_uInt16 OfaTreeOptionsDialog::AddGroup(const String& rGroupName, 694 SfxShell* pCreateShell, 695 SfxModule* pCreateModule, 696 sal_uInt16 nDialogId ) 697 { 698 SvLBoxEntry* pEntry = aTreeLB.InsertEntry(rGroupName); 699 OptionsGroupInfo* pInfo = 700 new OptionsGroupInfo( pCreateShell, pCreateModule, nDialogId ); 701 pEntry->SetUserData(pInfo); 702 sal_uInt16 nRet = 0; 703 pEntry = aTreeLB.First(); 704 while(pEntry) 705 { 706 if(!aTreeLB.GetParent(pEntry)) 707 nRet++; 708 pEntry = aTreeLB.Next(pEntry); 709 } 710 return nRet - 1; 711 } 712 713 /* -----------------11.02.99 10:31------------------- 714 * 715 * --------------------------------------------------*/ 716 IMPL_LINK(OfaTreeOptionsDialog, ShowPageHdl_Impl, SvTreeListBox*, EMPTYARG) 717 { 718 if ( aSelectTimer.GetTimeout() == SELECT_FIRST_TIMEOUT ) 719 { 720 aSelectTimer.SetTimeout( SELECT_TIMEOUT ); 721 SelectHdl_Impl( NULL ); 722 } 723 else if ( aSelectTimer.GetTimeout() == SELECT_TIMEOUT ) 724 aSelectTimer.Start(); 725 726 return 0; 727 } 728 /* -----------------11.02.99 10:49------------------- 729 * 730 * --------------------------------------------------*/ 731 IMPL_LINK( OfaTreeOptionsDialog, BackHdl_Impl, PushButton*, EMPTYARG ) 732 { 733 if ( pCurrentPageEntry && aTreeLB.GetParent( pCurrentPageEntry ) ) 734 { 735 OptionsPageInfo* pPageInfo = (OptionsPageInfo*)pCurrentPageEntry->GetUserData(); 736 if ( pPageInfo->m_pPage ) 737 { 738 OptionsGroupInfo* pGroupInfo = 739 (OptionsGroupInfo*)aTreeLB.GetParent( pCurrentPageEntry )->GetUserData(); 740 if ( RID_SVXPAGE_COLOR == pPageInfo->m_nPageId ) 741 pPageInfo->m_pPage->Reset( *pColorPageItemSet ); 742 else 743 pPageInfo->m_pPage->Reset( *pGroupInfo->m_pInItemSet ); 744 } 745 else if ( pPageInfo->m_pExtPage ) 746 pPageInfo->m_pExtPage->ResetPage(); 747 } 748 return 0; 749 } 750 /* -----------------11.02.99 16:45------------------- 751 * 752 * --------------------------------------------------*/ 753 IMPL_LINK( OfaTreeOptionsDialog, OKHdl_Impl, Button *, EMPTYARG ) 754 { 755 aTreeLB.EndSelection(); 756 if ( pCurrentPageEntry && aTreeLB.GetParent( pCurrentPageEntry ) ) 757 { 758 OptionsPageInfo* pPageInfo = (OptionsPageInfo *)pCurrentPageEntry->GetUserData(); 759 if ( pPageInfo->m_pPage ) 760 { 761 OptionsGroupInfo* pGroupInfo = 762 (OptionsGroupInfo *)aTreeLB.GetParent(pCurrentPageEntry)->GetUserData(); 763 if ( RID_SVXPAGE_COLOR != pPageInfo->m_nPageId 764 && pPageInfo->m_pPage->HasExchangeSupport() ) 765 { 766 int nLeave = pPageInfo->m_pPage->DeactivatePage(pGroupInfo->m_pOutItemSet); 767 if ( nLeave == SfxTabPage::KEEP_PAGE ) 768 { 769 //die Seite darf nicht verlassen werden! 770 aTreeLB.Select(pCurrentPageEntry); 771 return 0; 772 } 773 } 774 pPageInfo->m_pPage->Hide(); 775 } 776 } 777 778 SvLBoxEntry* pEntry = aTreeLB.First(); 779 while ( pEntry ) 780 { 781 if ( aTreeLB.GetParent( pEntry ) ) 782 { 783 OptionsPageInfo* pPageInfo = (OptionsPageInfo *)pEntry->GetUserData(); 784 if ( pPageInfo->m_pPage && !pPageInfo->m_pPage->HasExchangeSupport() ) 785 { 786 OptionsGroupInfo* pGroupInfo = 787 (OptionsGroupInfo*)aTreeLB.GetParent(pEntry)->GetUserData(); 788 pPageInfo->m_pPage->FillItemSet(*pGroupInfo->m_pOutItemSet); 789 } 790 791 if ( pPageInfo->m_pExtPage ) 792 { 793 pPageInfo->m_pExtPage->DeactivatePage(); 794 pPageInfo->m_pExtPage->SavePage(); 795 } 796 } 797 pEntry = aTreeLB.Next(pEntry); 798 } 799 EndDialog(RET_OK); 800 return 0; 801 } 802 803 /* -----------------17.02.99 09:15------------------- 804 * Eine aufgeklappte Gruppe soll vollstaendig sichtbar sein 805 * --------------------------------------------------*/ 806 IMPL_LINK(OfaTreeOptionsDialog, ExpandedHdl_Impl, SvTreeListBox*, pBox ) 807 { 808 pBox->Update(); 809 pBox->InitStartEntry(); 810 SvLBoxEntry* pEntry = pBox->GetHdlEntry(); 811 if(pEntry && pBox->IsExpanded(pEntry)) 812 { 813 sal_uInt32 nChildCount = pBox->GetChildCount( pEntry ); 814 815 SvLBoxEntry* pNext = pEntry; 816 for(sal_uInt32 i = 0; i < nChildCount;i++) 817 { 818 pNext = pBox->GetNextEntryInView(pNext); 819 if(!pNext) 820 { 821 pBox->ScrollOutputArea( -(short)(nChildCount - i + 1) ); 822 break; 823 } 824 else 825 { 826 Size aSz(pBox->GetOutputSizePixel()); 827 int nHeight = pBox->GetEntryHeight(); 828 Point aPos(pBox->GetEntryPosition(pNext)); 829 if(aPos.Y()+nHeight > aSz.Height()) 830 { 831 pBox->ScrollOutputArea( -(short)(nChildCount - i + 1) ); 832 break; 833 } 834 } 835 } 836 } 837 return 0; 838 } 839 840 /* -----------------11.02.99 10:49------------------- 841 * 842 * --------------------------------------------------*/ 843 void OfaTreeOptionsDialog::ApplyItemSets() 844 { 845 SvLBoxEntry* pEntry = aTreeLB.First(); 846 while(pEntry) 847 { 848 if(!aTreeLB.GetParent(pEntry)) 849 { 850 OptionsGroupInfo* pGroupInfo = (OptionsGroupInfo *)pEntry->GetUserData(); 851 if(pGroupInfo->m_pOutItemSet) 852 { 853 if(pGroupInfo->m_pShell) 854 pGroupInfo->m_pShell->ApplyItemSet( pGroupInfo->m_nDialogId, *pGroupInfo->m_pOutItemSet); 855 else 856 ApplyItemSet( pGroupInfo->m_nDialogId, *pGroupInfo->m_pOutItemSet); 857 } 858 } 859 pEntry = aTreeLB.Next(pEntry); 860 } 861 } 862 863 void OfaTreeOptionsDialog::InitTreeAndHandler() 864 { 865 aTreeLB.SetNodeDefaultImages(); 866 aPageImages = ImageList( CUI_RES( RID_IMGLIST_TREEOPT ) ); 867 aPageImagesHC = ImageList( CUI_RES( RID_IMGLIST_TREEOPT_HC ) ); 868 869 aTreeLB.SetHelpId( HID_OFADLG_TREELISTBOX ); 870 aTreeLB.SetStyle( aTreeLB.GetStyle()|WB_HASBUTTONS | WB_HASBUTTONSATROOT | 871 WB_HASLINES | WB_HASLINESATROOT | 872 WB_CLIPCHILDREN | WB_HSCROLL | WB_FORCE_MAKEVISIBLE | WB_QUICK_SEARCH ); 873 aTreeLB.SetSpaceBetweenEntries( 0 ); 874 aTreeLB.SetSelectionMode( SINGLE_SELECTION ); 875 aTreeLB.SetSublistOpenWithLeftRight( sal_True ); 876 aTreeLB.SetExpandedHdl( LINK( this, OfaTreeOptionsDialog, ExpandedHdl_Impl ) ); 877 aTreeLB.SetSelectHdl( LINK( this, OfaTreeOptionsDialog, ShowPageHdl_Impl ) ); 878 aBackPB.SetClickHdl( LINK( this, OfaTreeOptionsDialog, BackHdl_Impl ) ); 879 aOkPB.SetClickHdl( LINK( this, OfaTreeOptionsDialog, OKHdl_Impl ) ); 880 881 aHiddenGB.Show(); 882 aSelectTimer.SetTimeout( SELECT_FIRST_TIMEOUT ); 883 aSelectTimer.SetTimeoutHdl( LINK( this, OfaTreeOptionsDialog, SelectHdl_Impl ) ); 884 } 885 886 /* -----------------17.02.99 09:51------------------- 887 * 888 * --------------------------------------------------*/ 889 void OfaTreeOptionsDialog::ActivatePage( sal_uInt16 nResId ) 890 { 891 bIsForSetDocumentLanguage = false; 892 if ( nResId == OFA_TP_LANGUAGES_FOR_SET_DOCUMENT_LANGUAGE ) 893 { 894 bIsForSetDocumentLanguage = true; 895 nResId = OFA_TP_LANGUAGES; 896 } 897 898 DBG_ASSERT( !bIsFromExtensionManager, "OfaTreeOptionsDialog::ActivatePage(): call from extension manager" ); 899 if ( !pLastPageSaver ) 900 pLastPageSaver = new LastPageSaver; 901 bForgetSelection = sal_True; 902 sal_uInt16 nTemp = pLastPageSaver->m_nLastPageId; 903 pLastPageSaver->m_nLastPageId = nResId; 904 ActivateLastSelection(); 905 pLastPageSaver->m_nLastPageId = nTemp; 906 } 907 908 void OfaTreeOptionsDialog::ActivatePage( const String& rPageURL ) 909 { 910 DBG_ASSERT( !bIsFromExtensionManager, "OfaTreeOptionsDialog::ActivatePage(): call from extension manager" ); 911 if ( !pLastPageSaver ) 912 pLastPageSaver = new LastPageSaver; 913 bForgetSelection = sal_True; 914 pLastPageSaver->m_nLastPageId = 0; 915 pLastPageSaver->m_sLastPageURL_Tools = rPageURL; 916 ActivateLastSelection(); 917 } 918 919 /* -----------------16.02.99 13:17------------------- 920 * 921 * --------------------------------------------------*/ 922 void OfaTreeOptionsDialog::ActivateLastSelection() 923 { 924 SvLBoxEntry* pEntry = NULL; 925 if ( pLastPageSaver ) 926 { 927 String sExpand( RTL_CONSTASCII_STRINGPARAM( EXPAND_PROTOCOL ) ); 928 String sLastURL = bIsFromExtensionManager ? pLastPageSaver->m_sLastPageURL_ExtMgr 929 : pLastPageSaver->m_sLastPageURL_Tools; 930 if ( sLastURL.Len() == 0 ) 931 { 932 sLastURL = !bIsFromExtensionManager ? pLastPageSaver->m_sLastPageURL_ExtMgr 933 : pLastPageSaver->m_sLastPageURL_Tools; 934 } 935 936 // MacroExpander to convert "expand"-URL to "file"-URL 937 Reference< XMacroExpander > m_xMacroExpander; 938 bool bMustExpand = ( INetURLObject( sLastURL ).GetProtocol() == INET_PROT_FILE ); 939 940 if ( bMustExpand ) 941 { 942 Reference< XComponentContext > xContext; 943 Reference< XPropertySet > xProps( ::comphelper::getProcessServiceFactory(), UNO_QUERY ); 944 xProps->getPropertyValue( 945 ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DefaultContext" ) ) ) >>= xContext; 946 if ( xContext.is() ) 947 m_xMacroExpander = Reference< com::sun::star::util::XMacroExpander >( 948 xContext->getValueByName( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( 949 "/singletons/com.sun.star.util.theMacroExpander" ) ) ), UNO_QUERY ); 950 } 951 952 SvLBoxEntry* pTemp = aTreeLB.First(); 953 while( !pEntry && pTemp ) 954 { 955 // restore only selection of a leaf 956 if ( aTreeLB.GetParent( pTemp ) && pTemp->GetUserData() ) 957 { 958 OptionsPageInfo* pPageInfo = (OptionsPageInfo*)pTemp->GetUserData(); 959 String sPageURL = pPageInfo->m_sPageURL; 960 if ( bMustExpand 961 && sPageURL.Len() > 0 962 && sExpand.Match( sPageURL ) == STRING_MATCH ) 963 { 964 // cut protocol 965 ::rtl::OUString sTemp( sPageURL.Copy( sizeof( EXPAND_PROTOCOL ) -1 ) ); 966 // decode uri class chars 967 sTemp = ::rtl::Uri::decode( 968 sTemp, rtl_UriDecodeWithCharset, RTL_TEXTENCODING_UTF8 ); 969 // expand string 970 sPageURL = m_xMacroExpander->expandMacros( sTemp ); 971 } 972 973 if ( ( !bIsFromExtensionManager 974 && pPageInfo->m_nPageId && pPageInfo->m_nPageId == pLastPageSaver->m_nLastPageId ) 975 || ( !pPageInfo->m_nPageId && sLastURL == sPageURL ) ) 976 pEntry = pTemp; 977 } 978 pTemp = aTreeLB.Next(pTemp); 979 } 980 } 981 982 if ( !pEntry ) 983 { 984 pEntry = aTreeLB.First(); 985 pEntry = aTreeLB.Next(pEntry); 986 } 987 988 SvLBoxEntry* pParent = aTreeLB.GetParent(pEntry); 989 aTreeLB.Expand(pParent); 990 aTreeLB.MakeVisible(pParent); 991 aTreeLB.MakeVisible(pEntry); 992 aTreeLB.Select(pEntry); 993 aTreeLB.GrabFocus(); 994 } 995 996 /* -----------------22.02.99 08:52------------------- 997 * 998 * --------------------------------------------------*/ 999 long OfaTreeOptionsDialog::Notify( NotifyEvent& rNEvt ) 1000 { 1001 if ( rNEvt.GetType() == EVENT_KEYINPUT ) 1002 { 1003 const KeyEvent* pKEvt = rNEvt.GetKeyEvent(); 1004 const KeyCode aKeyCode = pKEvt->GetKeyCode(); 1005 1006 if( aKeyCode.GetCode() == KEY_PAGEUP || 1007 aKeyCode.GetCode() == KEY_PAGEDOWN) 1008 { 1009 SvLBoxEntry* pCurEntry = aTreeLB.FirstSelected(); 1010 SvLBoxEntry* pTemp = 0; 1011 if(aKeyCode.GetCode() == KEY_PAGEDOWN) 1012 { 1013 pTemp = aTreeLB.Next( pCurEntry ) ; 1014 if(pTemp && !aTreeLB.GetParent(pTemp)) 1015 { 1016 pTemp = aTreeLB.Next( pTemp ) ; 1017 aTreeLB.Select(pTemp); 1018 } 1019 } 1020 else 1021 { 1022 pTemp = aTreeLB.Prev( pCurEntry ) ; 1023 if(pTemp && !aTreeLB.GetParent(pTemp)) 1024 { 1025 pTemp = aTreeLB.Prev( pTemp ) ; 1026 } 1027 } 1028 if(pTemp) 1029 { 1030 if(!aTreeLB.IsExpanded(aTreeLB.GetParent(pTemp))) 1031 aTreeLB.Expand(aTreeLB.GetParent(pTemp)); 1032 aTreeLB.MakeVisible(pTemp); 1033 aTreeLB.Select(pTemp); 1034 } 1035 } 1036 } 1037 return SfxModalDialog::Notify(rNEvt); 1038 } 1039 1040 // -------------------------------------------------------------------- 1041 1042 void OfaTreeOptionsDialog::DataChanged( const DataChangedEvent& rDCEvt ) 1043 { 1044 SfxModalDialog::DataChanged( rDCEvt ); 1045 1046 SvLBoxEntry* pEntry = aTreeLB.GetCurEntry(); 1047 if ( ( rDCEvt.GetType() == DATACHANGED_SETTINGS ) && ( rDCEvt.GetFlags() & SETTINGS_STYLE ) && 1048 !aTreeLB.GetParent(pEntry)) 1049 { 1050 OptionsGroupInfo* pInfo = static_cast<OptionsGroupInfo*>(pEntry->GetUserData()); 1051 bool bHighContrast = GetSettings().GetStyleSettings().GetHighContrastMode(); 1052 ImageList* pImgLst = bHighContrast ? &aPageImagesHC : &aPageImages; 1053 for ( sal_uInt16 i = 0; i < aHelpTextsArr.Count(); ++i ) 1054 { 1055 if ( aHelpTextsArr.GetValue(i) == pInfo->m_nDialogId ) 1056 { 1057 aHelpImg.SetImage( pImgLst->GetImage( pInfo->m_nDialogId ) ); 1058 break; 1059 } 1060 } 1061 } 1062 } 1063 class FlagSet_Impl 1064 { 1065 bool & rFlag; 1066 public: 1067 FlagSet_Impl(bool& bFlag) : rFlag(bFlag){rFlag = true;} 1068 ~FlagSet_Impl(){rFlag = false;} 1069 }; 1070 1071 IMPL_LINK( OfaTreeOptionsDialog, SelectHdl_Impl, Timer*, EMPTYARG ) 1072 { 1073 SvTreeListBox* pBox = &aTreeLB; 1074 SvLBoxEntry* pEntry = pBox->GetCurEntry(); 1075 SvLBoxEntry* pParent = pBox->GetParent(pEntry); 1076 pBox->EndSelection(); 1077 1078 DBG_ASSERT(!bInSelectHdl_Impl, "Timeout handler called twice"); 1079 if(bInSelectHdl_Impl || pCurrentPageEntry == pEntry) 1080 return 0; 1081 //#111938# lock the SelectHdl_Impl to prevent multiple executes 1082 FlagSet_Impl aFlag(bInSelectHdl_Impl); 1083 TabPage* pOldPage = NULL; 1084 TabPage* pNewPage = NULL; 1085 OptionsPageInfo* pOptPageInfo = ( pCurrentPageEntry && aTreeLB.GetParent( pCurrentPageEntry ) ) 1086 ? (OptionsPageInfo*)pCurrentPageEntry->GetUserData() : NULL; 1087 1088 if ( pOptPageInfo && pOptPageInfo->m_pPage && pOptPageInfo->m_pPage->IsVisible() ) 1089 { 1090 pOldPage = pOptPageInfo->m_pPage; 1091 OptionsGroupInfo* pGroupInfo = (OptionsGroupInfo*)aTreeLB.GetParent(pCurrentPageEntry)->GetUserData(); 1092 int nLeave = SfxTabPage::LEAVE_PAGE; 1093 if ( RID_SVXPAGE_COLOR != pOptPageInfo->m_nPageId && pOptPageInfo->m_pPage->HasExchangeSupport() ) 1094 nLeave = pOptPageInfo->m_pPage->DeactivatePage( pGroupInfo->m_pOutItemSet ); 1095 1096 if ( nLeave == SfxTabPage::KEEP_PAGE ) 1097 { 1098 // we cannot leave this page 1099 pBox->Select( pCurrentPageEntry ); 1100 return 0; 1101 } 1102 else 1103 pOptPageInfo->m_pPage->Hide(); 1104 } 1105 else if ( pOptPageInfo && pOptPageInfo->m_pExtPage ) 1106 { 1107 pOptPageInfo->m_pExtPage->Hide(); 1108 pOptPageInfo->m_pExtPage->DeactivatePage(); 1109 } 1110 else if ( pCurrentPageEntry && !aTreeLB.GetParent( pCurrentPageEntry ) ) 1111 { 1112 OptionsGroupInfo* pGroupInfo = (OptionsGroupInfo*)pCurrentPageEntry->GetUserData(); 1113 if ( pGroupInfo && pGroupInfo->m_pExtPage ) 1114 { 1115 pGroupInfo->m_pExtPage->Hide(); 1116 pGroupInfo->m_pExtPage->DeactivatePage(); 1117 } 1118 } 1119 if ( pParent ) 1120 { 1121 aPageTitleFT.Hide(); 1122 aLine1FL.Hide(); 1123 aHelpFT.Hide(); 1124 aHelpImg.Hide(); 1125 OptionsPageInfo *pPageInfo = (OptionsPageInfo *)pEntry->GetUserData(); 1126 OptionsGroupInfo* pGroupInfo = (OptionsGroupInfo *)pParent->GetUserData(); 1127 if(!pPageInfo->m_pPage && pPageInfo->m_nPageId > 0) 1128 { 1129 if(pGroupInfo->m_bLoadError) 1130 return 0; 1131 if ( RID_SVXPAGE_COLOR == pPageInfo->m_nPageId ) 1132 { 1133 if(!pColorPageItemSet) 1134 { 1135 // Move usage of a static XOutdevItemPool instance here 1136 if(!mpStaticXOutdevItemPool) 1137 { 1138 mpStaticXOutdevItemPool = new XOutdevItemPool(); 1139 } 1140 pColorPageItemSet = new SfxItemSet( *mpStaticXOutdevItemPool, XATTR_FILLSTYLE, XATTR_FILLCOLOR); 1141 pColorPageItemSet->Put( XFillColorItem() ); 1142 } 1143 } 1144 else 1145 { 1146 if(pGroupInfo->m_pModule /*&& !pGroupInfo->pModule->IsLoaded()*/) 1147 { 1148 SfxModule* pOldModule = pGroupInfo->m_pModule; 1149 sal_Bool bIdentical = pGroupInfo->m_pModule == pGroupInfo->m_pShell; 1150 1151 WaitObject aWait(this); 1152 //pGroupInfo->pModule = pGroupInfo->pModule->Load(); 1153 if(!pGroupInfo->m_pModule) 1154 { 1155 pGroupInfo->m_bLoadError = sal_True; 1156 InfoBox(pBox, sNotLoadedError).Execute(); 1157 return 0; 1158 } 1159 if(bIdentical) 1160 pGroupInfo->m_pShell = pGroupInfo->m_pModule; 1161 //jetzt noch testen, ob es auch in anderen Gruppen das gleiche Module gab (z.B. Text+HTML) 1162 SvLBoxEntry* pTemp = aTreeLB.First(); 1163 while(pTemp) 1164 { 1165 if(!aTreeLB.GetParent(pTemp) && pTemp != pEntry) 1166 { 1167 OptionsGroupInfo* pTGInfo = (OptionsGroupInfo *)pTemp->GetUserData(); 1168 if(pTGInfo->m_pModule == pOldModule) 1169 { 1170 pTGInfo->m_pModule = pGroupInfo->m_pModule; 1171 if(bIdentical) 1172 pTGInfo->m_pShell = pGroupInfo->m_pModule; 1173 } 1174 } 1175 pTemp = aTreeLB.Next(pTemp); 1176 } 1177 } 1178 1179 // if ( pPageInfo->nPageId != RID_OPTPAGE_CHART_DEFCOLORS ) 1180 { 1181 if(!pGroupInfo->m_pInItemSet) 1182 pGroupInfo->m_pInItemSet = pGroupInfo->m_pShell 1183 ? pGroupInfo->m_pShell->CreateItemSet( pGroupInfo->m_nDialogId ) 1184 : CreateItemSet( pGroupInfo->m_nDialogId ); 1185 if(!pGroupInfo->m_pOutItemSet) 1186 pGroupInfo->m_pOutItemSet = new SfxItemSet( 1187 *pGroupInfo->m_pInItemSet->GetPool(), 1188 pGroupInfo->m_pInItemSet->GetRanges()); 1189 } 1190 } 1191 1192 if(pGroupInfo->m_pModule) 1193 { 1194 pPageInfo->m_pPage = pGroupInfo->m_pModule->CreateTabPage( 1195 pPageInfo->m_nPageId, this, *pGroupInfo->m_pInItemSet ); 1196 } 1197 else if(RID_SVXPAGE_COLOR != pPageInfo->m_nPageId) 1198 pPageInfo->m_pPage = ::CreateGeneralTabPage( pPageInfo->m_nPageId, this, *pGroupInfo->m_pInItemSet ); 1199 else 1200 { 1201 pPageInfo->m_pPage = ::CreateGeneralTabPage( 1202 pPageInfo->m_nPageId, this, *pColorPageItemSet ); 1203 SvxColorTabPage& rColPage = *(SvxColorTabPage*)pPageInfo->m_pPage; 1204 const SvxColorTableItem* pPtr = NULL; 1205 if ( SfxViewFrame::Current() && SfxViewFrame::Current()->GetDispatcher() ) 1206 pPtr = dynamic_cast< const SvxColorTableItem* >(SfxViewFrame::Current()-> 1207 GetDispatcher()->Execute(SID_GET_COLORTABLE, SFX_CALLMODE_SYNCHRON)); 1208 maColorTab = pPtr ? pPtr->GetColorTable() : XColorList::GetStdColorList(); 1209 1210 rColPage.SetColorTable( maColorTab ); 1211 rColPage.SetPageType( &nUnknownType ); 1212 rColPage.SetDlgType( &nUnknownType ); 1213 rColPage.SetPos( &nUnknownPos ); 1214 rColPage.SetAreaTP( &bIsAreaTP ); 1215 rColPage.SetColorChgd( (ChangeType*)&nChangeType ); 1216 rColPage.Construct(); 1217 } 1218 1219 DBG_ASSERT( pPageInfo->m_pPage, "tabpage could not created"); 1220 if ( pPageInfo->m_pPage ) 1221 { 1222 SvtViewOptions aTabPageOpt( E_TABPAGE, String::CreateFromInt32( pPageInfo->m_nPageId ) ); 1223 pPageInfo->m_pPage->SetUserData( GetViewOptUserItem( aTabPageOpt ) ); 1224 1225 Point aTreePos(aTreeLB.GetPosPixel()); 1226 Size aTreeSize(aTreeLB.GetSizePixel()); 1227 Point aGBPos(aHiddenGB.GetPosPixel()); 1228 Size aPageSize(pPageInfo->m_pPage->GetSizePixel()); 1229 Size aGBSize(aHiddenGB.GetSizePixel()); 1230 Point aPagePos( aGBPos.X() + ( aGBSize.Width() - aPageSize.Width() ) / 2, 1231 aGBPos.Y() + ( aGBSize.Height() - aPageSize.Height() ) / 2 ); 1232 pPageInfo->m_pPage->SetPosPixel( aPagePos ); 1233 if ( RID_SVXPAGE_COLOR == pPageInfo->m_nPageId ) 1234 { 1235 pPageInfo->m_pPage->Reset( *pColorPageItemSet ); 1236 pPageInfo->m_pPage->ActivatePage( *pColorPageItemSet ); 1237 } 1238 else 1239 { 1240 pPageInfo->m_pPage->Reset( *pGroupInfo->m_pInItemSet ); 1241 } 1242 } 1243 } 1244 else if ( 0 == pPageInfo->m_nPageId && !pPageInfo->m_pExtPage ) 1245 { 1246 if ( !m_xContainerWinProvider.is() ) 1247 { 1248 Reference < XMultiServiceFactory > xFactory( ::comphelper::getProcessServiceFactory() ); 1249 m_xContainerWinProvider = Reference < awt::XContainerWindowProvider >( 1250 xFactory->createInstance( 1251 C2U("com.sun.star.awt.ContainerWindowProvider") ), UNO_QUERY ); 1252 DBG_ASSERT( m_xContainerWinProvider.is(), "service com.sun.star.awt.ContainerWindowProvider could not be loaded" ); 1253 } 1254 1255 pPageInfo->m_pExtPage = new ExtensionsTabPage( 1256 this, 0, pPageInfo->m_sPageURL, pPageInfo->m_sEventHdl, m_xContainerWinProvider ); 1257 Size aSize = aHiddenGB.GetSizePixel(); 1258 aSize.Width() = aSize.Width() - 4; 1259 aSize.Height() = aSize.Height() - 4; 1260 Point aPos = aHiddenGB.GetPosPixel(); 1261 aPos.X() = aPos.X() + 2; 1262 aPos.Y() = aPos.Y() + 2; 1263 pPageInfo->m_pExtPage->SetPosSizePixel( aPos, aSize ); 1264 } 1265 1266 if ( pPageInfo->m_pPage ) 1267 { 1268 if ( RID_SVXPAGE_COLOR != pPageInfo->m_nPageId && 1269 pPageInfo->m_pPage->HasExchangeSupport()) 1270 { 1271 pPageInfo->m_pPage->ActivatePage(*pGroupInfo->m_pOutItemSet); 1272 } 1273 pPageInfo->m_pPage->Show(); 1274 } 1275 else if ( pPageInfo->m_pExtPage ) 1276 { 1277 pPageInfo->m_pExtPage->Show(); 1278 pPageInfo->m_pExtPage->ActivatePage(); 1279 } 1280 1281 String sTmpTitle = sTitle; 1282 sTmpTitle += String::CreateFromAscii(" - "); 1283 sTmpTitle += aTreeLB.GetEntryText(pParent); 1284 sTmpTitle += String::CreateFromAscii(" - "); 1285 sTmpTitle += aTreeLB.GetEntryText(pEntry); 1286 SetText(sTmpTitle); 1287 pCurrentPageEntry = pEntry; 1288 if ( !bForgetSelection ) 1289 { 1290 if ( !pLastPageSaver ) 1291 pLastPageSaver = new LastPageSaver; 1292 if ( !bIsFromExtensionManager ) 1293 pLastPageSaver->m_nLastPageId = pPageInfo->m_nPageId; 1294 if ( pPageInfo->m_pExtPage ) 1295 { 1296 if ( bIsFromExtensionManager ) 1297 pLastPageSaver->m_sLastPageURL_ExtMgr = pPageInfo->m_sPageURL; 1298 else 1299 pLastPageSaver->m_sLastPageURL_Tools = pPageInfo->m_sPageURL; 1300 } 1301 } 1302 pNewPage = pPageInfo->m_pPage; 1303 } 1304 else 1305 { 1306 OptionsGroupInfo* pTGInfo = (OptionsGroupInfo *)pEntry->GetUserData(); 1307 if ( pTGInfo->m_sPageURL.getLength() == 0 ) 1308 { 1309 bool bHighContrast = GetSettings().GetStyleSettings().GetHighContrastMode(); 1310 ImageList* pImgLst = bHighContrast ? &aPageImagesHC : &aPageImages; 1311 //hier den Hilfetext anzeigen 1312 for ( sal_uInt16 i = 0; i < aHelpTextsArr.Count(); ++i ) 1313 { 1314 if ( aHelpTextsArr.GetValue(i) == pTGInfo->m_nDialogId ) 1315 { 1316 aHelpFT.SetText(aHelpTextsArr.GetString(i)); 1317 aHelpImg.SetImage(pImgLst->GetImage(pTGInfo->m_nDialogId)); 1318 break; 1319 } 1320 } 1321 1322 aPageTitleFT.Show(); 1323 aLine1FL.Show(); 1324 aHelpFT.Show(); 1325 aHelpImg.Show(); 1326 1327 //auf die Groesse der Bitmap anpassen 1328 if(!bImageResized) 1329 { 1330 const long nCtrlDist = 2; 1331 bImageResized = sal_True; 1332 Point aImgPos(aHelpImg.GetPosPixel()); 1333 Size aImgSize(aHelpImg.GetSizePixel()); 1334 Point aTitlePos(aPageTitleFT.GetPosPixel()); 1335 Point aLinePos(aLine1FL.GetPosPixel()); 1336 Point aHelpPos(aHelpFT.GetPosPixel()); 1337 Size aHelpSize(aHelpFT.GetSizePixel()); 1338 long nXDiff = 0; 1339 long nYDiff = 0; 1340 if(aTitlePos.X() <= (aImgPos.X() + aImgSize.Width() + nCtrlDist)) 1341 { 1342 nXDiff = aImgPos.X() + aImgSize.Width() + nCtrlDist - aTitlePos.X(); 1343 } 1344 if(aLinePos.Y() <= (aImgPos.Y() + aImgSize.Height() + nCtrlDist)) 1345 { 1346 nYDiff = aImgPos.Y() + aImgSize.Height() + nCtrlDist - aLinePos.Y(); 1347 } 1348 aLinePos.Y() += nYDiff; 1349 aLine1FL.SetPosPixel(aLinePos); 1350 1351 aTitlePos.X() += nXDiff; 1352 aPageTitleFT.SetPosPixel(aTitlePos); 1353 1354 aHelpPos.X() += nXDiff; 1355 aHelpPos.Y() += nYDiff; 1356 aHelpSize.Width() -= nXDiff; 1357 aHelpSize.Height() -= nYDiff; 1358 aHelpFT.SetPosSizePixel(aHelpPos, aHelpSize); 1359 1360 Font aFont = aHelpFT.GetFont(); 1361 Size aSz = aFont.GetSize(); 1362 aSz.Height() = (aSz.Height() * 14 ) / 10; 1363 aFont.SetSize(aSz); 1364 aPageTitleFT.SetFont(aFont); 1365 } 1366 1367 String sTmpTitle = sTitle; 1368 sTmpTitle += String::CreateFromAscii(" - "); 1369 aPageTitleFT.SetText(aTreeLB.GetEntryText(pEntry)); 1370 sTmpTitle += aPageTitleFT.GetText(); 1371 SetText(sTmpTitle); 1372 pCurrentPageEntry = NULL; 1373 } 1374 else 1375 { 1376 if ( !pTGInfo->m_pExtPage ) 1377 { 1378 if ( !m_xContainerWinProvider.is() ) 1379 { 1380 Reference < XMultiServiceFactory > xFactory( ::comphelper::getProcessServiceFactory() ); 1381 m_xContainerWinProvider = Reference < awt::XContainerWindowProvider >( 1382 xFactory->createInstance( 1383 C2U("com.sun.star.awt.ContainerWindowProvider") ), UNO_QUERY ); 1384 DBG_ASSERT( m_xContainerWinProvider.is(), "service com.sun.star.awt.ContainerWindowProvider could not be loaded" ); 1385 } 1386 1387 pTGInfo->m_pExtPage = 1388 new ExtensionsTabPage( this, 0, pTGInfo->m_sPageURL, rtl::OUString(), m_xContainerWinProvider ); 1389 Size aSize = aHiddenGB.GetSizePixel(); 1390 aSize.Width() = aSize.Width() - 4; 1391 aSize.Height() = aSize.Height() - 4; 1392 Point aPos = aHiddenGB.GetPosPixel(); 1393 aPos.X() = aPos.X() + 2; 1394 aPos.Y() = aPos.Y() + 2; 1395 pTGInfo->m_pExtPage->SetPosSizePixel( aPos, aSize ); 1396 } 1397 1398 if ( pTGInfo->m_pExtPage ) 1399 { 1400 pTGInfo->m_pExtPage->Show(); 1401 pTGInfo->m_pExtPage->ActivatePage(); 1402 } 1403 1404 pCurrentPageEntry = pEntry; 1405 } 1406 } 1407 1408 // restore lost focus, if necessary 1409 Window* pFocusWin = Application::GetFocusWindow(); 1410 // if the focused window is not the options treebox and the old page has the focus 1411 if ( pFocusWin && pFocusWin != pBox && pOldPage && pOldPage->HasChildPathFocus() ) 1412 // then set the focus to the new page or if we are on a group set the focus to the options treebox 1413 pNewPage ? pNewPage->GrabFocus() : pBox->GrabFocus(); 1414 1415 return 0; 1416 } 1417 1418 /* -----------------11.02.99 15:51------------------- 1419 * 1420 * --------------------------------------------------*/ 1421 1422 OfaPageResource::OfaPageResource() : 1423 Resource(CUI_RES(RID_OFADLG_OPTIONS_TREE_PAGES)), 1424 aGeneralDlgAry(CUI_RES(SID_GENERAL_OPTIONS)), 1425 aInetDlgAry(CUI_RES(SID_INET_DLG)), 1426 aLangDlgAry(CUI_RES(SID_LANGUAGE_OPTIONS)), 1427 aTextDlgAry(CUI_RES(SID_SW_EDITOPTIONS)), 1428 aHTMLDlgAry(CUI_RES(SID_SW_ONLINEOPTIONS)), 1429 aCalcDlgAry(CUI_RES(SID_SC_EDITOPTIONS)), 1430 aStarMathDlgAry(CUI_RES(SID_SM_EDITOPTIONS)), 1431 aImpressDlgAry(CUI_RES(SID_SD_EDITOPTIONS)), 1432 aDrawDlgAry(CUI_RES(SID_SD_GRAPHIC_OPTIONS)), 1433 aChartDlgAry(CUI_RES(SID_SCH_EDITOPTIONS)), 1434 aFilterDlgAry(CUI_RES(SID_FILTER_DLG)), 1435 aDatasourcesDlgAry(CUI_RES(SID_SB_STARBASEOPTIONS)) 1436 { 1437 FreeResource(); 1438 } 1439 1440 sal_Bool EnableSSO( void ) 1441 { 1442 // SSO must be enabled if the configuration manager bootstrap settings 1443 // are configured as follows ... 1444 // CFG_Offline=false 1445 // CFG_ServerType=uno ( or unspecified ) 1446 // CFG_BackendService= 1447 // com.sun.star.comp.configuration.backend.LdapSingleBackend 1448 1449 rtl::OUString theIniFile; 1450 osl_getExecutableFile( &theIniFile.pData ); 1451 theIniFile = theIniFile.copy( 0, theIniFile.lastIndexOf( '/' ) + 1 ) + 1452 rtl::OUString::createFromAscii( SAL_CONFIGFILE( "configmgr" ) ); 1453 ::rtl::Bootstrap theBootstrap( theIniFile ); 1454 1455 rtl::OUString theOfflineValue; 1456 rtl::OUString theDefaultOfflineValue = rtl::OUString::createFromAscii( "false" ); 1457 theBootstrap.getFrom( rtl::OUString::createFromAscii( "CFG_Offline" ), 1458 theOfflineValue, 1459 theDefaultOfflineValue ); 1460 1461 rtl::OUString theServerTypeValue; 1462 theBootstrap.getFrom( rtl::OUString::createFromAscii( "CFG_ServerType" ), 1463 theServerTypeValue ); 1464 1465 rtl::OUString theBackendServiceTypeValue; 1466 theBootstrap.getFrom( rtl::OUString::createFromAscii( "CFG_BackendService" ), 1467 theBackendServiceTypeValue ); 1468 1469 sal_Bool bSSOEnabled = 1470 ( theOfflineValue == theDefaultOfflineValue && 1471 ( theServerTypeValue.getLength() == 0 || 1472 theServerTypeValue == rtl::OUString::createFromAscii( "uno" ) ) && 1473 theBackendServiceTypeValue == 1474 rtl::OUString::createFromAscii( 1475 "com.sun.star.comp.configuration.backend.LdapSingleBackend" ) ); 1476 if ( bSSOEnabled && GetSSOCreator() == 0 ) 1477 { 1478 bSSOEnabled = sal_False; 1479 } 1480 return bSSOEnabled; 1481 } 1482 1483 extern "C" { static void SAL_CALL thisModule() {} } 1484 1485 CreateTabPage GetSSOCreator( void ) 1486 { 1487 static CreateTabPage theSymbol = 0; 1488 if ( theSymbol == 0 ) 1489 { 1490 osl::Module aModule; 1491 rtl::OUString theModuleName( RTL_CONSTASCII_USTRINGPARAM( SVLIBRARY( "ssoopt" ) ) ); 1492 if( aModule.loadRelative( 1493 &thisModule, theModuleName, SAL_LOADMODULE_DEFAULT ) ) 1494 { 1495 rtl::OUString theSymbolName( rtl::OUString::createFromAscii( "CreateSSOTabPage" ) ); 1496 theSymbol = reinterpret_cast<CreateTabPage>(aModule.getFunctionSymbol( theSymbolName )); 1497 } 1498 } 1499 1500 return theSymbol; 1501 } 1502 1503 SfxItemSet* OfaTreeOptionsDialog::CreateItemSet( sal_uInt16 nId ) 1504 { 1505 Reference< XPropertySet > xProp( SvxGetLinguPropertySet() ); 1506 SfxItemSet* pRet = 0; 1507 switch(nId) 1508 { 1509 case SID_GENERAL_OPTIONS: 1510 { 1511 pRet = new SfxItemSet( 1512 SFX_APP()->GetPool(), 1513 SID_ATTR_METRIC, SID_ATTR_SPELL, 1514 SID_AUTOSPELL_CHECK, SID_AUTOSPELL_CHECK, 1515 SID_ATTR_QUICKLAUNCHER, SID_ATTR_QUICKLAUNCHER, 1516 SID_ATTR_YEAR2000, SID_ATTR_YEAR2000, 1517 SID_HTML_MODE, SID_HTML_MODE, 1518 0 ); 1519 1520 SfxItemSet aOptSet( SFX_APP()->GetPool(), SID_ATTR_QUICKLAUNCHER, SID_ATTR_QUICKLAUNCHER ); 1521 SFX_APP()->GetOptions(aOptSet); 1522 pRet->Put(aOptSet); 1523 1524 utl::MiscCfg aMisc; 1525 const SfxPoolItem* pItem; 1526 SfxViewFrame* pViewFrame = SfxViewFrame::Current(); 1527 if ( pViewFrame ) 1528 { 1529 SfxDispatcher* pDispatch = pViewFrame->GetDispatcher(); 1530 1531 // Sonstiges - Year2000 1532 if( SFX_ITEM_AVAILABLE <= pDispatch->QueryState( SID_ATTR_YEAR2000, pItem ) ) 1533 pRet->Put( SfxUInt16Item( SID_ATTR_YEAR2000, ((const SfxUInt16Item*)pItem)->GetValue() ) ); 1534 else 1535 pRet->Put( SfxUInt16Item( SID_ATTR_YEAR2000, (sal_uInt16)aMisc.GetYear2000() ) ); 1536 } 1537 else 1538 pRet->Put( SfxUInt16Item( SID_ATTR_YEAR2000, (sal_uInt16)aMisc.GetYear2000() ) ); 1539 1540 1541 // Sonstiges - Tabulator 1542 pRet->Put(SfxBoolItem(SID_PRINTER_NOTFOUND_WARN, aMisc.IsNotFoundWarning())); 1543 1544 sal_uInt16 nFlag = aMisc.IsPaperSizeWarning() ? SFX_PRINTER_CHG_SIZE : 0; 1545 nFlag |= aMisc.IsPaperOrientationWarning() ? SFX_PRINTER_CHG_ORIENTATION : 0; 1546 pRet->Put( SfxFlagItem( SID_PRINTER_CHANGESTODOC, nFlag )); 1547 1548 } 1549 break; 1550 case SID_LANGUAGE_OPTIONS : 1551 { 1552 pRet = new SfxItemSet(SFX_APP()->GetPool(), 1553 SID_ATTR_LANGUAGE, SID_AUTOSPELL_CHECK, 1554 SID_ATTR_CHAR_CJK_LANGUAGE, SID_ATTR_CHAR_CTL_LANGUAGE, 1555 SID_OPT_LOCALE_CHANGED, SID_OPT_LOCALE_CHANGED, 1556 SID_SET_DOCUMENT_LANGUAGE, SID_SET_DOCUMENT_LANGUAGE, 1557 0 ); 1558 1559 // fuer die Linguistik 1560 1561 Reference< XSpellChecker1 > xSpell = SvxGetSpellChecker(); 1562 pRet->Put(SfxSpellCheckItem( xSpell, SID_ATTR_SPELL )); 1563 SfxHyphenRegionItem aHyphen( SID_ATTR_HYPHENREGION ); 1564 1565 sal_Int16 nMinLead = 2, 1566 nMinTrail = 2; 1567 if (xProp.is()) 1568 { 1569 xProp->getPropertyValue( String::CreateFromAscii( 1570 UPN_HYPH_MIN_LEADING) ) >>= nMinLead; 1571 xProp->getPropertyValue( String::CreateFromAscii( 1572 UPN_HYPH_MIN_TRAILING) ) >>= nMinTrail; 1573 } 1574 aHyphen.GetMinLead() = (sal_uInt8)nMinLead; 1575 aHyphen.GetMinTrail() = (sal_uInt8)nMinTrail; 1576 1577 const SfxPoolItem* pItem; 1578 SfxPoolItem* pClone; 1579 SfxViewFrame* pViewFrame = SfxViewFrame::Current(); 1580 if ( pViewFrame ) 1581 { 1582 SfxDispatcher* pDispatch = pViewFrame->GetDispatcher(); 1583 if(SFX_ITEM_AVAILABLE <= pDispatch->QueryState(SID_ATTR_LANGUAGE, pItem)) 1584 pRet->Put(SfxUInt16Item(SID_ATTR_LANGUAGE, ((const SvxLanguageItem*)pItem)->GetLanguage())); 1585 if(SFX_ITEM_AVAILABLE <= pDispatch->QueryState(SID_ATTR_CHAR_CJK_LANGUAGE, pItem)) 1586 pRet->Put(SfxUInt16Item(SID_ATTR_CHAR_CJK_LANGUAGE, ((const SvxLanguageItem*)pItem)->GetLanguage())); 1587 if(SFX_ITEM_AVAILABLE <= pDispatch->QueryState(SID_ATTR_CHAR_CTL_LANGUAGE, pItem)) 1588 pRet->Put(SfxUInt16Item(SID_ATTR_CHAR_CTL_LANGUAGE, ((const SvxLanguageItem*)pItem)->GetLanguage())); 1589 1590 pRet->Put(aHyphen); 1591 if(SFX_ITEM_AVAILABLE <= pDispatch->QueryState(SID_AUTOSPELL_CHECK, pItem)) 1592 { 1593 pClone = pItem->Clone(); 1594 pRet->Put(*pClone); 1595 delete pClone; 1596 } 1597 else 1598 { 1599 sal_Bool bVal = sal_False; 1600 if (xProp.is()) 1601 { 1602 xProp->getPropertyValue( String::CreateFromAscii( UPN_IS_SPELL_AUTO) ) >>= bVal; 1603 } 1604 1605 pRet->Put(SfxBoolItem(SID_AUTOSPELL_CHECK, bVal)); 1606 } 1607 } 1608 pRet->Put( SfxBoolItem( SID_SET_DOCUMENT_LANGUAGE, bIsForSetDocumentLanguage ) ); 1609 } 1610 break; 1611 case SID_INET_DLG : 1612 pRet = new SfxItemSet( SFX_APP()->GetPool(), 1613 SID_BASIC_ENABLED, SID_BASIC_ENABLED, 1614 //SID_OPTIONS_START - ..END 1615 SID_INET_EMAIL_NAME, SID_INET_PROXY_PORT, 1616 SID_SAVEREL_INET, SID_SAVEREL_FSYS, 1617 SID_INET_SMTPSERVER, SID_INET_SMTPSERVER, 1618 SID_INET_NOPROXY, SID_INET_SOCKS_PROXY_PORT, 1619 SID_INET_DNS_AUTO, SID_INET_DNS_SERVER, 1620 SID_SECURE_URL, SID_SECURE_URL, 1621 0L ); 1622 SFX_APP()->GetOptions(*pRet); 1623 break; 1624 case SID_FILTER_DLG: 1625 pRet = new SfxItemSet( SFX_APP()->GetPool(), 1626 SID_ATTR_DOCINFO, SID_ATTR_AUTOSAVEMINUTE, 1627 SID_SAVEREL_INET, SID_SAVEREL_FSYS, 1628 SID_ATTR_PRETTYPRINTING, SID_ATTR_PRETTYPRINTING, 1629 SID_ATTR_WARNALIENFORMAT, SID_ATTR_WARNALIENFORMAT, 1630 SID_ATTR_ODFENCRYPTION, SID_ATTR_ODFENCRYPTION, 1631 0 ); 1632 SFX_APP()->GetOptions(*pRet); 1633 break; 1634 1635 case SID_SB_STARBASEOPTIONS: 1636 pRet = new SfxItemSet( SFX_APP()->GetPool(), 1637 SID_SB_POOLING_ENABLED, SID_SB_DB_REGISTER, 1638 0 ); 1639 ::offapp::ConnectionPoolConfig::GetOptions(*pRet); 1640 ::svx::DbRegisteredNamesConfig::GetOptions(*pRet); 1641 break; 1642 1643 case SID_SCH_EDITOPTIONS: 1644 { 1645 SvxChartOptions aChartOpt; 1646 pRet = new SfxItemSet( SFX_APP()->GetPool(), SID_SCH_EDITOPTIONS, SID_SCH_EDITOPTIONS ); 1647 pRet->Put( SvxChartColorTableItem( SID_SCH_EDITOPTIONS, aChartOpt.GetDefaultColors() ) ); 1648 break; 1649 } 1650 } 1651 return pRet; 1652 } 1653 1654 void OfaTreeOptionsDialog::ApplyItemSet( sal_uInt16 nId, const SfxItemSet& rSet ) 1655 { 1656 switch(nId) 1657 { 1658 case SID_GENERAL_OPTIONS: 1659 { 1660 utl::MiscCfg aMisc; 1661 const SfxPoolItem* pItem; 1662 SfxItemSet aOptSet(SFX_APP()->GetPool(), SID_ATTR_QUICKLAUNCHER, SID_ATTR_QUICKLAUNCHER ); 1663 aOptSet.Put(rSet); 1664 if(aOptSet.Count()) 1665 SFX_APP()->SetOptions( aOptSet ); 1666 // Dispatcher neu holen, weil SetOptions() ggf. den Dispatcher zerst"ort hat 1667 SfxViewFrame *pViewFrame = SfxViewFrame::Current(); 1668 // ------------------------------------------------------------------------- 1669 // Year2000 auswerten 1670 // ------------------------------------------------------------------------- 1671 sal_uInt16 nY2K = USHRT_MAX; 1672 if( SFX_ITEM_SET == rSet.GetItemState( SID_ATTR_YEAR2000, sal_False, &pItem ) ) 1673 nY2K = ((const SfxUInt16Item*)pItem)->GetValue(); 1674 if( USHRT_MAX != nY2K ) 1675 { 1676 if ( pViewFrame ) 1677 { 1678 SfxDispatcher* pDispatch = pViewFrame->GetDispatcher(); 1679 pDispatch->Execute( SID_ATTR_YEAR2000, SFX_CALLMODE_ASYNCHRON, pItem, 0L); 1680 } 1681 aMisc.SetYear2000(nY2K); 1682 } 1683 1684 // ------------------------------------------------------------------------- 1685 // Drucken auswerten 1686 // ------------------------------------------------------------------------- 1687 if(SFX_ITEM_SET == rSet.GetItemState(SID_PRINTER_NOTFOUND_WARN, sal_False, &pItem)) 1688 aMisc.SetNotFoundWarning(((const SfxBoolItem*)pItem)->GetValue()); 1689 1690 if(SFX_ITEM_SET == rSet.GetItemState(SID_PRINTER_CHANGESTODOC, sal_False, &pItem)) 1691 { 1692 const SfxFlagItem* pFlag = (const SfxFlagItem*)pItem; 1693 aMisc.SetPaperSizeWarning(0 != (pFlag->GetValue() & SFX_PRINTER_CHG_SIZE )); 1694 aMisc.SetPaperOrientationWarning(0 != (pFlag->GetValue() & SFX_PRINTER_CHG_ORIENTATION )); 1695 } 1696 // ------------------------------------------------------------------------- 1697 // evaluate help options 1698 // ------------------------------------------------------------------------- 1699 if ( SvtHelpOptions().IsHelpTips() != Help::IsQuickHelpEnabled() ) 1700 SvtHelpOptions().IsHelpTips() ? Help::EnableQuickHelp() : Help::DisableQuickHelp(); 1701 if ( SvtHelpOptions().IsExtendedHelp() != Help::IsBalloonHelpEnabled() ) 1702 SvtHelpOptions().IsExtendedHelp() ? Help::EnableBalloonHelp() : Help::DisableBalloonHelp(); 1703 } 1704 break; 1705 case SID_LANGUAGE_OPTIONS : 1706 { 1707 OfaTreeOptionsDialog::ApplyLanguageOptions(rSet); 1708 } 1709 break; 1710 case SID_INET_DLG : 1711 case SID_FILTER_DLG: 1712 SFX_APP()->SetOptions( rSet ); 1713 break; 1714 1715 case SID_SB_STARBASEOPTIONS: 1716 ::offapp::ConnectionPoolConfig::SetOptions( rSet ); 1717 ::svx::DbRegisteredNamesConfig::SetOptions(rSet); 1718 break; 1719 1720 case SID_SCH_EDITOPTIONS: 1721 // nothing to do. Chart options only apply to newly created charts 1722 break; 1723 1724 default: 1725 { 1726 DBG_ERROR( "Unhandled option in ApplyItemSet" ); 1727 } 1728 break; 1729 } 1730 1731 } 1732 void OfaTreeOptionsDialog::ApplyLanguageOptions(const SfxItemSet& rSet) 1733 { 1734 sal_Bool bSaveSpellCheck = sal_False; 1735 const SfxPoolItem* pItem; 1736 1737 if ( SFX_ITEM_SET == rSet.GetItemState( SID_SPELL_MODIFIED, sal_False, &pItem ) ) 1738 { 1739 bSaveSpellCheck = ( (const SfxBoolItem*)pItem )->GetValue(); 1740 } 1741 Reference< XMultiServiceFactory > xMgr( ::comphelper::getProcessServiceFactory() ); 1742 Reference< XPropertySet > xProp( 1743 xMgr->createInstance( ::rtl::OUString::createFromAscii( 1744 "com.sun.star.linguistic2.LinguProperties") ), 1745 UNO_QUERY ); 1746 if ( SFX_ITEM_SET == rSet.GetItemState(SID_ATTR_HYPHENREGION, sal_False, &pItem ) ) 1747 { 1748 const SfxHyphenRegionItem* pHyphenItem = (const SfxHyphenRegionItem*)pItem; 1749 1750 if (xProp.is()) 1751 { 1752 xProp->setPropertyValue( 1753 String::CreateFromAscii(UPN_HYPH_MIN_LEADING), 1754 makeAny((sal_Int16) pHyphenItem->GetMinLead()) ); 1755 xProp->setPropertyValue( 1756 String::CreateFromAscii(UPN_HYPH_MIN_TRAILING), 1757 makeAny((sal_Int16) pHyphenItem->GetMinTrail()) ); 1758 } 1759 bSaveSpellCheck = sal_True; 1760 } 1761 1762 SfxViewFrame *pViewFrame = SfxViewFrame::Current(); 1763 if ( pViewFrame ) 1764 { 1765 SfxDispatcher* pDispatch = pViewFrame->GetDispatcher(); 1766 pItem = 0; 1767 if(SFX_ITEM_SET == rSet.GetItemState( SID_ATTR_LANGUAGE, sal_False, &pItem )) 1768 { 1769 pDispatch->Execute(pItem->Which(), SFX_CALLMODE_ASYNCHRON, pItem, 0L); 1770 bSaveSpellCheck = sal_True; 1771 } 1772 if(SFX_ITEM_SET == rSet.GetItemState( SID_ATTR_CHAR_CTL_LANGUAGE, sal_False, &pItem )) 1773 { 1774 pDispatch->Execute(pItem->Which(), SFX_CALLMODE_ASYNCHRON, pItem, 0L); 1775 bSaveSpellCheck = sal_True; 1776 } 1777 if(SFX_ITEM_SET == rSet.GetItemState( SID_ATTR_CHAR_CJK_LANGUAGE, sal_False, &pItem )) 1778 { 1779 pDispatch->Execute(pItem->Which(), SFX_CALLMODE_ASYNCHRON, pItem, 0L); 1780 bSaveSpellCheck = sal_True; 1781 } 1782 1783 if( SFX_ITEM_SET == rSet.GetItemState(SID_AUTOSPELL_CHECK, sal_False, &pItem )) 1784 { 1785 sal_Bool bOnlineSpelling = ((const SfxBoolItem*)pItem)->GetValue(); 1786 pDispatch->Execute(SID_AUTOSPELL_CHECK, 1787 SFX_CALLMODE_ASYNCHRON|SFX_CALLMODE_RECORD, pItem, 0L); 1788 1789 if (xProp.is()) 1790 { 1791 xProp->setPropertyValue( 1792 String::CreateFromAscii(UPN_IS_SPELL_AUTO), 1793 makeAny(bOnlineSpelling) ); 1794 } 1795 } 1796 1797 if( bSaveSpellCheck ) 1798 { 1799 //! the config item has changed since we modified the 1800 //! property set it uses 1801 pDispatch->Execute(SID_SPELLCHECKER_CHANGED, SFX_CALLMODE_ASYNCHRON); 1802 } 1803 } 1804 1805 if( SFX_ITEM_SET == rSet.GetItemState(SID_OPT_LOCALE_CHANGED, sal_False, &pItem )) 1806 { 1807 SfxViewFrame* _pViewFrame = SfxViewFrame::GetFirst(); 1808 while ( _pViewFrame ) 1809 { 1810 _pViewFrame->GetDispatcher()->Execute(pItem->Which(), SFX_CALLMODE_ASYNCHRON, pItem, 0L); 1811 _pViewFrame = SfxViewFrame::GetNext( *_pViewFrame ); 1812 } 1813 } 1814 } 1815 1816 rtl::OUString getCurrentFactory_Impl( const Reference< XFrame >& _xFrame ) 1817 { 1818 rtl::OUString sIdentifier; 1819 Reference < XFrame > xCurrentFrame( _xFrame ); 1820 Reference < XModuleManager > xModuleManager( ::comphelper::getProcessServiceFactory()->createInstance( 1821 DEFINE_CONST_UNICODE("com.sun.star.frame.ModuleManager") ), UNO_QUERY ); 1822 if ( !xCurrentFrame.is() ) 1823 { 1824 Reference< XDesktop > xDesktop( ::comphelper::getProcessServiceFactory()->createInstance( 1825 DEFINE_CONST_UNICODE("com.sun.star.frame.Desktop") ), UNO_QUERY ); 1826 if ( xDesktop.is() ) 1827 xCurrentFrame = xDesktop->getCurrentFrame(); 1828 } 1829 1830 if ( xCurrentFrame.is() && xModuleManager.is() ) 1831 { 1832 try 1833 { 1834 sIdentifier = xModuleManager->identify( xCurrentFrame ); 1835 } 1836 catch ( ::com::sun::star::frame::UnknownModuleException& ) 1837 { 1838 DBG_WARNING( "getActiveModule_Impl(): unknown module" ); 1839 } 1840 catch ( Exception& ) 1841 { 1842 DBG_ERRORFILE( "getActiveModule_Impl(): exception of XModuleManager::identify()" ); 1843 } 1844 } 1845 1846 return sIdentifier; 1847 } 1848 1849 void OfaTreeOptionsDialog::Initialize( const Reference< XFrame >& _xFrame ) 1850 { 1851 OfaPageResource aDlgResource; 1852 sal_uInt16 nGroup = 0; 1853 1854 SvtOptionsDialogOptions aOptionsDlgOpt; 1855 sal_uInt16 i, nPageId; 1856 1857 // %PRODUCTNAME options 1858 sal_Bool isSSOEnabled = EnableSSO(); 1859 if ( !lcl_isOptionHidden( SID_GENERAL_OPTIONS, aOptionsDlgOpt ) ) 1860 { 1861 ResStringArray& rGeneralArray = aDlgResource.GetGeneralArray(); 1862 setGroupName( C2U("ProductName"), rGeneralArray.GetString(0) ); 1863 nGroup = AddGroup( rGeneralArray.GetString(0), 0, 0, SID_GENERAL_OPTIONS ); 1864 sal_uInt16 nEnd = static_cast< sal_uInt16 >( rGeneralArray.Count() ); 1865 String sPageTitle; 1866 1867 for ( i = 1; i < nEnd; ++i ) 1868 { 1869 String sNewTitle = rGeneralArray.GetString(i); 1870 nPageId = (sal_uInt16)rGeneralArray.GetValue(i); 1871 if ( lcl_isOptionHidden( nPageId, aOptionsDlgOpt ) ) 1872 continue; 1873 1874 // Disable Online Update page if service not installed 1875 if( RID_SVXPAGE_ONLINEUPDATE == nPageId ) 1876 { 1877 const ::rtl::OUString sService = C2U("com.sun.star.setup.UpdateCheck"); 1878 1879 try 1880 { 1881 Reference < XMultiServiceFactory > xFactory( ::comphelper::getProcessServiceFactory() ); 1882 Reference < XInterface > xService( xFactory->createInstance( sService ) ); 1883 1884 if( ! xService.is() ) 1885 continue; 1886 } 1887 catch ( ::com::sun::star::loader::CannotActivateFactoryException& ) 1888 { 1889 continue; 1890 } 1891 } 1892 // Disable OOoImprovement page if not enabled 1893 if( RID_SVXPAGE_IMPROVEMENT == nPageId ) 1894 { 1895 continue; 1896 } 1897 if ( nPageId != RID_SVXPAGE_SSO || isSSOEnabled ) 1898 { 1899 AddTabPage( nPageId, sNewTitle, nGroup ); 1900 } 1901 } 1902 // private iteration hack for Improvement Program 1903 // hack for OOo 3.1 1904 // should not be in found in any later release 1905 for(bool bOnce = false; bOnce==false; bOnce=true) 1906 { 1907 String sNewTitle = C2U("Improvement Program"); 1908 { 1909 SvxImprovementPage aTempTabPage(this); 1910 sNewTitle = aTempTabPage.GetTitleText(); 1911 } 1912 nPageId = RID_SVXPAGE_IMPROVEMENT; 1913 if ( lcl_isOptionHidden( nPageId, aOptionsDlgOpt ) ) 1914 continue; 1915 // Disable OOoImprovement page if not enabled 1916 { 1917 const ::rtl::OUString sService = C2U("com.sun.star.oooimprovement.CoreController"); 1918 try 1919 { 1920 Reference < XMultiServiceFactory > xFactory( ::comphelper::getProcessServiceFactory() ); 1921 Reference < ::com::sun::star::oooimprovement::XCoreController > xService( xFactory->createInstance( sService ), UNO_QUERY ); 1922 1923 if( ! xService.is() ) 1924 continue; 1925 if( ! xService->showBuiltinOptionsPage(1)) 1926 continue; 1927 } 1928 catch ( ::com::sun::star::loader::CannotActivateFactoryException& ) 1929 { 1930 continue; 1931 } 1932 } 1933 if ( nPageId != RID_SVXPAGE_SSO || isSSOEnabled ) 1934 { 1935 AddTabPage( nPageId, sNewTitle, nGroup ); 1936 } 1937 } 1938 } 1939 1940 // Load and Save options 1941 if ( !lcl_isOptionHidden( SID_FILTER_DLG, aOptionsDlgOpt ) ) 1942 { 1943 ResStringArray& rFilterArray = aDlgResource.GetFilterArray(); 1944 setGroupName( C2U("LoadSave"), rFilterArray.GetString(0) ); 1945 nGroup = AddGroup( rFilterArray.GetString(0), 0, 0, SID_FILTER_DLG ); 1946 for ( i = 1; i < rFilterArray.Count(); ++i ) 1947 { 1948 nPageId = (sal_uInt16)rFilterArray.GetValue(i); 1949 if ( !lcl_isOptionHidden( nPageId, aOptionsDlgOpt ) ) 1950 AddTabPage( nPageId, rFilterArray.GetString(i), nGroup ); 1951 } 1952 } 1953 1954 // Language options 1955 SvtLanguageOptions aLanguageOptions; 1956 if ( !lcl_isOptionHidden( SID_LANGUAGE_OPTIONS, aOptionsDlgOpt ) ) 1957 { 1958 ResStringArray& rLangArray = aDlgResource.GetLangArray(); 1959 setGroupName( C2U("LanguageSettings"), rLangArray.GetString(0) ); 1960 nGroup = AddGroup( rLangArray.GetString(0), 0, 0, SID_LANGUAGE_OPTIONS ); 1961 for ( i = 1; i < rLangArray.Count(); ++i ) 1962 { 1963 nPageId = (sal_uInt16)rLangArray.GetValue(i); 1964 if ( lcl_isOptionHidden( nPageId, aOptionsDlgOpt ) ) 1965 continue; 1966 if ( ( RID_SVXPAGE_JSEARCH_OPTIONS != nPageId || aLanguageOptions.IsJapaneseFindEnabled() ) && 1967 ( RID_SVXPAGE_ASIAN_LAYOUT != nPageId || aLanguageOptions.IsAsianTypographyEnabled() ) && 1968 ( RID_SVXPAGE_OPTIONS_CTL != nPageId || aLanguageOptions.IsCTLFontEnabled() ) ) 1969 AddTabPage( nPageId, rLangArray.GetString(i), nGroup ); 1970 } 1971 } 1972 1973 1974 rtl::OUString aFactory = getCurrentFactory_Impl( _xFrame ); 1975 rtl::OUString sTemp = GetModuleIdentifier( comphelper::getProcessServiceFactory(), _xFrame ); 1976 DBG_ASSERT( sTemp == aFactory, "S H I T!!!" ); 1977 1978 // Writer and Writer/Web options 1979 sal_Bool bHasAnyFilter = sal_False; 1980 SvtModuleOptions aModuleOpt; 1981 if ( aModuleOpt.IsModuleInstalled( SvtModuleOptions::E_SWRITER ) ) 1982 { 1983 // Textdokument 1984 bHasAnyFilter = sal_True; 1985 ResStringArray& rTextArray = aDlgResource.GetTextArray(); 1986 if ( aFactory.equalsAscii( "com.sun.star.text.TextDocument" ) 1987 || aFactory.equalsAscii( "com.sun.star.text.WebDocument" ) 1988 || aFactory.equalsAscii( "com.sun.star.text.GlobalDocument" ) ) 1989 { 1990 SfxModule* pSwMod = (*(SfxModule**) GetAppData(SHL_WRITER)); 1991 if ( !lcl_isOptionHidden( SID_SW_EDITOPTIONS, aOptionsDlgOpt ) ) 1992 { 1993 if ( aFactory.equalsAscii( "com.sun.star.text.WebDocument" ) ) 1994 setGroupName( C2U("WriterWeb"), rTextArray.GetString(0) ); 1995 else 1996 setGroupName( C2U("Writer"), rTextArray.GetString(0) ); 1997 nGroup = AddGroup(rTextArray.GetString(0), pSwMod, pSwMod, SID_SW_EDITOPTIONS ); 1998 for ( i = 1; i < rTextArray.Count(); ++i ) 1999 { 2000 nPageId = (sal_uInt16)rTextArray.GetValue(i); 2001 if ( lcl_isOptionHidden( nPageId, aOptionsDlgOpt ) ) 2002 continue; 2003 if ( ( RID_SW_TP_STD_FONT_CJK != nPageId || aLanguageOptions.IsCJKFontEnabled() ) && 2004 ( RID_SW_TP_STD_FONT_CTL != nPageId || aLanguageOptions.IsCTLFontEnabled() ) && 2005 ( RID_SW_TP_MAILCONFIG != nPageId || MailMergeCfg_Impl().IsEmailSupported() ) ) 2006 AddTabPage( nPageId, rTextArray.GetString(i), nGroup ); 2007 } 2008 #ifdef DBG_UTIL 2009 AddTabPage( RID_SW_TP_OPTTEST_PAGE, String::CreateFromAscii("Interner Test"), nGroup ); 2010 #endif 2011 } 2012 2013 // HTML-Dokument 2014 if ( !lcl_isOptionHidden( SID_SW_ONLINEOPTIONS, aOptionsDlgOpt ) ) 2015 { 2016 ResStringArray& rHTMLArray = aDlgResource.GetHTMLArray(); 2017 nGroup = AddGroup(rHTMLArray.GetString(0), pSwMod, pSwMod, SID_SW_ONLINEOPTIONS ); 2018 for( i = 1; i < rHTMLArray.Count(); ++i ) 2019 { 2020 nPageId = (sal_uInt16)rHTMLArray.GetValue(i); 2021 if ( !lcl_isOptionHidden( nPageId, aOptionsDlgOpt ) ) 2022 AddTabPage( nPageId, rHTMLArray.GetString(i), nGroup ); 2023 } 2024 #ifdef DBG_UTIL 2025 AddTabPage( RID_SW_TP_OPTTEST_PAGE, String::CreateFromAscii("Interner Test"), nGroup ); 2026 #endif 2027 } 2028 } 2029 } 2030 2031 // Calc options 2032 if ( aModuleOpt.IsModuleInstalled( SvtModuleOptions::E_SCALC ) ) 2033 { 2034 bHasAnyFilter = sal_True; 2035 if ( aFactory.equalsAscii( "com.sun.star.sheet.SpreadsheetDocument" )) 2036 { 2037 if ( !lcl_isOptionHidden( SID_SC_EDITOPTIONS, aOptionsDlgOpt ) ) 2038 { 2039 ResStringArray& rCalcArray = aDlgResource.GetCalcArray(); 2040 SfxModule* pScMod = ( *( SfxModule** ) GetAppData( SHL_CALC ) ); 2041 setGroupName( C2U("Calc"), rCalcArray.GetString(0) ); 2042 nGroup = AddGroup( rCalcArray.GetString( 0 ), pScMod, pScMod, SID_SC_EDITOPTIONS ); 2043 const sal_uInt16 nCount = static_cast< const sal_uInt16 >( rCalcArray.Count() ); 2044 for ( i = 1; i < nCount; ++i ) 2045 { 2046 nPageId = (sal_uInt16)rCalcArray.GetValue(i); 2047 if ( lcl_isOptionHidden( nPageId, aOptionsDlgOpt ) ) 2048 continue; 2049 // if( bCTL || nId != RID_OFA_TP_INTERNATIONAL ) 2050 // #103755# if an international tabpage is need one day, this should be used again... ;-) 2051 if ( nPageId != RID_OFA_TP_INTERNATIONAL ) 2052 AddTabPage( nPageId, rCalcArray.GetString( i ), nGroup ); 2053 } 2054 } 2055 } 2056 } 2057 2058 // Impress options 2059 SfxModule* pSdMod = ( *( SfxModule** ) GetAppData( SHL_DRAW ) ); 2060 if ( aModuleOpt.IsModuleInstalled( SvtModuleOptions::E_SIMPRESS ) ) 2061 { 2062 bHasAnyFilter = sal_True; 2063 if ( aFactory.equalsAscii( "com.sun.star.presentation.PresentationDocument" )) 2064 { 2065 if ( !lcl_isOptionHidden( SID_SD_EDITOPTIONS, aOptionsDlgOpt ) ) 2066 { 2067 ResStringArray& rImpressArray = aDlgResource.GetImpressArray(); 2068 setGroupName( C2U("Impress"), rImpressArray.GetString(0) ); 2069 nGroup = AddGroup( rImpressArray.GetString( 0 ), pSdMod, pSdMod, SID_SD_EDITOPTIONS ); 2070 const sal_Bool bCTL = aLanguageOptions.IsCTLFontEnabled(); 2071 const sal_uInt16 nCount = static_cast< const sal_uInt16 >( rImpressArray.Count() ); 2072 for ( i = 1; i < nCount; ++i ) 2073 { 2074 nPageId = (sal_uInt16)rImpressArray.GetValue(i); 2075 if ( lcl_isOptionHidden( nPageId, aOptionsDlgOpt ) ) 2076 continue; 2077 if ( bCTL || nPageId != RID_OFA_TP_INTERNATIONAL_IMPR ) 2078 AddTabPage( nPageId, rImpressArray.GetString(i), nGroup ); 2079 } 2080 } 2081 } 2082 } 2083 2084 // Draw options 2085 if ( aModuleOpt.IsModuleInstalled( SvtModuleOptions::E_SDRAW ) ) 2086 { 2087 if ( aFactory.equalsAscii( "com.sun.star.drawing.DrawingDocument" )) 2088 { 2089 if ( !lcl_isOptionHidden( SID_SD_GRAPHIC_OPTIONS, aOptionsDlgOpt ) ) 2090 { 2091 ResStringArray& rDrawArray = aDlgResource.GetDrawArray(); 2092 setGroupName( C2U("Draw"), rDrawArray.GetString(0) ); 2093 nGroup = AddGroup( rDrawArray.GetString( 0 ), pSdMod, pSdMod, SID_SD_GRAPHIC_OPTIONS ); 2094 const sal_Bool bCTL = aLanguageOptions.IsCTLFontEnabled(); 2095 const sal_uInt16 nCount = static_cast< const sal_uInt16 >( rDrawArray.Count() ); 2096 for ( i = 1; i < nCount; ++i ) 2097 { 2098 nPageId = (sal_uInt16)rDrawArray.GetValue(i); 2099 if ( lcl_isOptionHidden( nPageId, aOptionsDlgOpt ) ) 2100 continue; 2101 if ( bCTL || nPageId != RID_OFA_TP_INTERNATIONAL_SD ) 2102 AddTabPage( nPageId, rDrawArray.GetString(i), nGroup ); 2103 } 2104 } 2105 } 2106 } 2107 2108 // Math options 2109 if ( aModuleOpt.IsModuleInstalled( SvtModuleOptions::E_SMATH ) ) 2110 { 2111 if ( aFactory.equalsAscii( "com.sun.star.formula.FormulaProperties" )) 2112 { 2113 if ( !lcl_isOptionHidden( SID_SM_EDITOPTIONS, aOptionsDlgOpt ) ) 2114 { 2115 ResStringArray& rStarMathArray = aDlgResource.GetStarMathArray(); 2116 SfxModule* pSmMod = (*(SfxModule**) GetAppData(SHL_SM)); 2117 setGroupName( C2U("Math"), rStarMathArray.GetString(0) ); 2118 nGroup = AddGroup(rStarMathArray.GetString(0), pSmMod, pSmMod, SID_SM_EDITOPTIONS ); 2119 for ( i = 1; i < rStarMathArray.Count(); ++i ) 2120 { 2121 nPageId = (sal_uInt16)rStarMathArray.GetValue(i); 2122 if ( !lcl_isOptionHidden( nPageId, aOptionsDlgOpt ) ) 2123 AddTabPage( nPageId, rStarMathArray.GetString(i), nGroup ); 2124 } 2125 } 2126 } 2127 } 2128 2129 // Database - needed only if there is an application which integrates with databases 2130 if ( !lcl_isOptionHidden( SID_SB_STARBASEOPTIONS, aOptionsDlgOpt ) && 2131 ( aModuleOpt.IsModuleInstalled( SvtModuleOptions::E_SDATABASE ) 2132 || aModuleOpt.IsModuleInstalled( SvtModuleOptions::E_SWRITER ) 2133 || aModuleOpt.IsModuleInstalled( SvtModuleOptions::E_SCALC ) 2134 ) ) 2135 { 2136 ResStringArray& rDSArray = aDlgResource.GetDatasourcesArray(); 2137 setGroupName( C2U("Base"), rDSArray.GetString(0) ); 2138 nGroup = AddGroup( rDSArray.GetString(0), 0, NULL, SID_SB_STARBASEOPTIONS ); 2139 for ( i = 1; i < rDSArray.Count(); ++i ) 2140 { 2141 nPageId = (sal_uInt16)rDSArray.GetValue(i); 2142 if ( !lcl_isOptionHidden( nPageId, aOptionsDlgOpt ) ) 2143 AddTabPage( nPageId, rDSArray.GetString(i), nGroup ); 2144 } 2145 } 2146 2147 // Chart options (always installed and active) 2148 if ( !lcl_isOptionHidden( SID_SCH_EDITOPTIONS, aOptionsDlgOpt ) ) 2149 { 2150 ResStringArray& rChartArray = aDlgResource.GetChartArray(); 2151 setGroupName( C2U("Charts"), rChartArray.GetString(0) ); 2152 nGroup = AddGroup( rChartArray.GetString(0), 0, 0, SID_SCH_EDITOPTIONS ); 2153 for ( i = 1; i < rChartArray.Count(); ++i ) 2154 { 2155 nPageId = (sal_uInt16)rChartArray.GetValue(i); 2156 if ( !lcl_isOptionHidden( nPageId, aOptionsDlgOpt ) ) 2157 AddTabPage( nPageId, rChartArray.GetString(i), nGroup ); 2158 } 2159 } 2160 2161 // Internet options 2162 if ( !lcl_isOptionHidden( SID_INET_DLG, aOptionsDlgOpt ) ) 2163 { 2164 ResStringArray& rInetArray = aDlgResource.GetInetArray(); 2165 setGroupName( C2U("Internet"), rInetArray.GetString(0) ); 2166 nGroup = AddGroup(rInetArray.GetString(0), 0, 0, SID_INET_DLG ); 2167 2168 for ( i = 1; i < rInetArray.Count(); ++i ) 2169 { 2170 nPageId = (sal_uInt16)rInetArray.GetValue(i); 2171 if ( lcl_isOptionHidden( nPageId, aOptionsDlgOpt ) ) 2172 continue; 2173 #if defined WNT 2174 // Disable E-mail tab-page on Windows 2175 if ( nPageId == RID_SVXPAGE_INET_MAIL ) 2176 continue; 2177 #endif 2178 AddTabPage( nPageId, rInetArray.GetString(i), nGroup ); 2179 } 2180 } 2181 2182 /*!!! 2183 ResizeTreeLB(); 2184 ActivateLastSelection(); 2185 */ 2186 } 2187 2188 namespace 2189 { 2190 void MoveControl( Control& _rCtrl, long _nDeltaPixel ) 2191 { 2192 Point aPt( _rCtrl.GetPosPixel() ); 2193 aPt.X() += _nDeltaPixel; 2194 _rCtrl.SetPosPixel( aPt ); 2195 } 2196 } 2197 2198 void OfaTreeOptionsDialog::ResizeTreeLB( void ) 2199 { 2200 const long nMax = aHiddenGB.GetSizePixel().Width() * 42 / 100; 2201 // don't ask where 42 comes from... but it looks / feels ok ;-) 2202 long nDelta = 50; // min. 2203 sal_uInt16 nDepth = 0; 2204 const long nIndent0 = PixelToLogic( Size( 28, 0 ) ).Width(); 2205 const long nIndent1 = PixelToLogic( Size( 52, 0 ) ).Width(); 2206 2207 SvTreeList* pTreeList = aTreeLB.GetModel(); 2208 DBG_ASSERT( pTreeList, "-OfaTreeOptionsDialog::ResizeTreeLB(): no model, no cookies!" ); 2209 2210 SvListEntry* pEntry = pTreeList->First(); 2211 while( pEntry ) 2212 { 2213 long n = aTreeLB.GetTextWidth( aTreeLB.GetEntryText( static_cast< SvLBoxEntry* >( pEntry ) ) ); 2214 n += ( nDepth == 0 )? nIndent0 : nIndent1; 2215 2216 if( n > nDelta ) 2217 nDelta = n; 2218 2219 pEntry = pTreeList->Next( pEntry, &nDepth ); 2220 } 2221 2222 nDelta = LogicToPixel( Size( nDelta + 3, 0 ) ).Width(); // + extra space [logic] 2223 nDelta += GetSettings().GetStyleSettings().GetScrollBarSize(); // + scroll bar, in case it's needed 2224 2225 if( nDelta > nMax ) 2226 nDelta = nMax; 2227 2228 // starting resizing with this 2229 Size aSize( GetSizePixel() ); 2230 aSize.Width() += nDelta; 2231 SetSizePixel( aSize ); 2232 2233 // resize treelistbox 2234 aSize = aTreeLB.GetSizePixel(); 2235 aSize.Width() += nDelta; 2236 aTreeLB.SetSizePixel( aSize ); 2237 2238 // ... and move depending controls 2239 MoveControl( aOkPB, nDelta ); 2240 MoveControl( aCancelPB, nDelta ); 2241 MoveControl( aHelpPB, nDelta ); 2242 MoveControl( aBackPB, nDelta ); 2243 MoveControl( aHiddenGB, nDelta ); 2244 MoveControl( aPageTitleFT, nDelta ); 2245 MoveControl( aLine1FL, nDelta ); 2246 MoveControl( aHelpFT, nDelta ); 2247 MoveControl( aHelpImg, nDelta ); 2248 } 2249 2250 bool isNodeActive( OptionsNode* pNode, Module* pModule ) 2251 { 2252 if ( pNode ) 2253 { 2254 // Node for all modules actine? 2255 if ( pNode->m_bAllModules ) 2256 return true; 2257 2258 // OOo-Nodes (Writer, Calc, Impress...) are active if node is already inserted 2259 if ( getGroupName( pNode->m_sId, false ).Len() > 0 ) 2260 return true; 2261 2262 // no module -> not active 2263 if ( !pModule ) 2264 return false; 2265 2266 // search node in active module 2267 if ( pModule->m_bActive ) 2268 { 2269 for ( sal_uInt32 j = 0; j < pModule->m_aNodeList.size(); ++j ) 2270 if ( pModule->m_aNodeList[j]->m_sId == pNode->m_sId ) 2271 return true; 2272 } 2273 } 2274 return false; 2275 } 2276 2277 void OfaTreeOptionsDialog::LoadExtensionOptions( const rtl::OUString& rExtensionId ) 2278 { 2279 Module* pModule = NULL; 2280 Reference< XMultiServiceFactory > xMSFac = comphelper::getProcessServiceFactory(); 2281 // open optionsdialog.xcu 2282 Reference< XNameAccess > xRoot( 2283 ::comphelper::ConfigurationHelper::openConfig( 2284 xMSFac, C2U("org.openoffice.Office.OptionsDialog"), 2285 ::comphelper::ConfigurationHelper::E_READONLY ), UNO_QUERY ); 2286 DBG_ASSERT( xRoot.is(), "OfaTreeOptionsDialog::LoadExtensionOptions(): no config" ); 2287 // when called by Tools - Options then load nodes of active module 2288 if ( rExtensionId.getLength() == 0 ) 2289 pModule = LoadModule( GetModuleIdentifier( xMSFac, Reference< XFrame >() ), xRoot ); 2290 2291 VectorOfNodes aNodeList; 2292 LoadNodes( xRoot, pModule, rExtensionId, aNodeList ); 2293 InsertNodes( aNodeList ); 2294 } 2295 2296 rtl::OUString OfaTreeOptionsDialog::GetModuleIdentifier( 2297 const Reference< XMultiServiceFactory >& xMFac, const Reference< XFrame >& rFrame ) 2298 { 2299 rtl::OUString sModule; 2300 Reference < XFrame > xCurrentFrame( rFrame ); 2301 Reference < XModuleManager > xModuleManager( xMFac->createInstance( 2302 C2U("com.sun.star.frame.ModuleManager") ), UNO_QUERY ); 2303 2304 if ( !xCurrentFrame.is() ) 2305 { 2306 Reference < XDesktop > xDesktop( xMFac->createInstance( 2307 C2U("com.sun.star.frame.Desktop") ), UNO_QUERY ); 2308 if ( xDesktop.is() ) 2309 xCurrentFrame = xDesktop->getCurrentFrame(); 2310 } 2311 2312 if ( xCurrentFrame.is() && xModuleManager.is() ) 2313 { 2314 try 2315 { 2316 sModule = xModuleManager->identify( xCurrentFrame ); 2317 } 2318 catch ( ::com::sun::star::frame::UnknownModuleException& ) 2319 { 2320 DBG_WARNING( "OfaTreeOptionsDialog::GetModuleIdentifier(): unknown module" ); 2321 } 2322 catch ( Exception& ) 2323 { 2324 DBG_ERRORFILE( "OfaTreeOptionsDialog::GetModuleIdentifier(): exception of XModuleManager::identify()" ); 2325 } 2326 } 2327 return sModule; 2328 } 2329 2330 Module* OfaTreeOptionsDialog::LoadModule( 2331 const rtl::OUString& rModuleIdentifier, const Reference< XNameAccess >& xRoot ) 2332 { 2333 Module* pModule = NULL; 2334 Reference< XNameAccess > xSet; 2335 2336 if ( xRoot->hasByName( C2U("Modules") ) ) 2337 { 2338 xRoot->getByName( C2U("Modules") ) >>= xSet; 2339 if ( xSet.is() ) 2340 { 2341 Sequence< rtl::OUString > seqNames = xSet->getElementNames(); 2342 for ( int i = 0; i < seqNames.getLength(); ++i ) 2343 { 2344 rtl::OUString sModule( seqNames[i] ); 2345 if ( rModuleIdentifier == sModule ) 2346 { 2347 // current active module found 2348 pModule = new Module( sModule ); 2349 pModule->m_bActive = true; 2350 2351 Reference< XNameAccess > xModAccess; 2352 xSet->getByName( seqNames[i] ) >>= xModAccess; 2353 if ( xModAccess.is() ) 2354 { 2355 // load the nodes of this module 2356 Reference< XNameAccess > xNodeAccess; 2357 xModAccess->getByName( C2U("Nodes") ) >>= xNodeAccess; 2358 if ( xNodeAccess.is() ) 2359 { 2360 Sequence< rtl::OUString > xTemp = xNodeAccess->getElementNames(); 2361 Reference< XNameAccess > xAccess; 2362 sal_Int32 nIndex = -1; 2363 for ( int x = 0; x < xTemp.getLength(); ++x ) 2364 { 2365 xNodeAccess->getByName( xTemp[x] ) >>= xAccess; 2366 if ( xAccess.is() ) 2367 { 2368 xAccess->getByName( C2U("Index") ) >>= nIndex; 2369 if ( nIndex < 0 ) 2370 // append nodes with index < 0 2371 pModule->m_aNodeList.push_back( 2372 new OrderedEntry( nIndex, xTemp[x] ) ); 2373 else 2374 { 2375 // search position of the node 2376 sal_uInt32 y = 0; 2377 for ( ; y < pModule->m_aNodeList.size(); ++y ) 2378 { 2379 sal_Int32 nNodeIdx = pModule->m_aNodeList[y]->m_nIndex; 2380 if ( nNodeIdx < 0 || nNodeIdx > nIndex ) 2381 break; 2382 } 2383 // and insert the node on this position 2384 pModule->m_aNodeList.insert( 2385 pModule->m_aNodeList.begin() + y, 2386 new OrderedEntry( nIndex, xTemp[x] ) ); 2387 } 2388 } 2389 } 2390 } 2391 } 2392 } 2393 } 2394 } 2395 } 2396 return pModule; 2397 } 2398 2399 void OfaTreeOptionsDialog::LoadNodes( 2400 const Reference< XNameAccess >& xRoot, Module* pModule, 2401 const rtl::OUString& rExtensionId, VectorOfNodes& rOutNodeList ) 2402 { 2403 Reference< XNameAccess > xSet; 2404 if ( xRoot->hasByName( C2U("Nodes") ) ) 2405 { 2406 xRoot->getByName( C2U("Nodes") ) >>= xSet; 2407 if ( xSet.is() ) 2408 { 2409 VectorOfNodes aNodeList; 2410 Sequence< rtl::OUString > seqNames = xSet->getElementNames(); 2411 2412 for ( int i = 0; i < seqNames.getLength(); ++i ) 2413 { 2414 String sGroupName( seqNames[i] ); 2415 Reference< XNameAccess > xNodeAccess; 2416 xSet->getByName( seqNames[i] ) >>= xNodeAccess; 2417 2418 if ( xNodeAccess.is() ) 2419 { 2420 rtl::OUString sNodeId, sLabel, sPageURL, sGroupId; 2421 bool bAllModules = false; 2422 sal_Int32 nGroupIndex = 0; 2423 2424 sNodeId = seqNames[i]; 2425 xNodeAccess->getByName( C2U("Label") ) >>= sLabel; 2426 xNodeAccess->getByName( C2U("OptionsPage") ) >>= sPageURL; 2427 xNodeAccess->getByName( C2U("AllModules") ) >>= bAllModules; 2428 xNodeAccess->getByName( C2U("GroupId") ) >>= sGroupId; 2429 xNodeAccess->getByName( C2U("GroupIndex") ) >>= nGroupIndex; 2430 2431 if ( sLabel.getLength() == 0 ) 2432 sLabel = sGroupName; 2433 String sTemp = getGroupName( sLabel, rExtensionId.getLength() > 0 ); 2434 if ( sTemp.Len() > 0 ) 2435 sLabel = sTemp; 2436 OptionsNode* pNode = 2437 new OptionsNode( sNodeId, sLabel, sPageURL, bAllModules, sGroupId, nGroupIndex ); 2438 2439 if ( !rExtensionId.getLength() && !isNodeActive( pNode, pModule ) ) 2440 { 2441 delete pNode; 2442 continue; 2443 } 2444 2445 Reference< XNameAccess > xLeavesSet; 2446 xNodeAccess->getByName( C2U( "Leaves" ) ) >>= xLeavesSet; 2447 if ( xLeavesSet.is() ) 2448 { 2449 Sequence< rtl::OUString > seqLeaves = xLeavesSet->getElementNames(); 2450 for ( int j = 0; j < seqLeaves.getLength(); ++j ) 2451 { 2452 Reference< XNameAccess > xLeaveAccess; 2453 xLeavesSet->getByName( seqLeaves[j] ) >>= xLeaveAccess; 2454 2455 if ( xLeaveAccess.is() ) 2456 { 2457 rtl::OUString sId, sLeafLabel, sEventHdl, sLeafURL, sLeafGrpId; 2458 sal_Int32 nLeafGrpIdx = 0; 2459 2460 xLeaveAccess->getByName( C2U("Id") ) >>= sId; 2461 xLeaveAccess->getByName( C2U("Label") ) >>= sLeafLabel; 2462 xLeaveAccess->getByName( C2U("OptionsPage") ) >>= sLeafURL; 2463 xLeaveAccess->getByName( C2U("EventHandlerService") ) >>= sEventHdl; 2464 xLeaveAccess->getByName( C2U("GroupId") ) >>= sLeafGrpId; 2465 xLeaveAccess->getByName( C2U("GroupIndex") ) >>= nLeafGrpIdx; 2466 2467 if ( !rExtensionId.getLength() || sId == rExtensionId ) 2468 { 2469 OptionsLeaf* pLeaf = new OptionsLeaf( 2470 sId, sLeafLabel, sLeafURL, sEventHdl, sLeafGrpId, nLeafGrpIdx ); 2471 2472 if ( sLeafGrpId.getLength() > 0 ) 2473 { 2474 bool bAlreadyOpened = false; 2475 if ( pNode->m_aGroupedLeaves.size() > 0 ) 2476 { 2477 for ( sal_uInt32 k = 0; 2478 k < pNode->m_aGroupedLeaves.size(); ++k ) 2479 { 2480 if ( pNode->m_aGroupedLeaves[k].size() > 0 && 2481 pNode->m_aGroupedLeaves[k][0]->m_sGroupId 2482 == sLeafGrpId ) 2483 { 2484 sal_uInt32 l = 0; 2485 for ( ; l < pNode->m_aGroupedLeaves[k].size(); ++l ) 2486 { 2487 if ( pNode->m_aGroupedLeaves[k][l]-> 2488 m_nGroupIndex >= nLeafGrpIdx ) 2489 break; 2490 } 2491 pNode->m_aGroupedLeaves[k].insert( 2492 pNode->m_aGroupedLeaves[k].begin() + l, pLeaf ); 2493 bAlreadyOpened = true; 2494 break; 2495 } 2496 } 2497 } 2498 if ( !bAlreadyOpened ) 2499 { 2500 VectorOfLeaves aGroupedLeaves; 2501 aGroupedLeaves.push_back( pLeaf ); 2502 pNode->m_aGroupedLeaves.push_back( aGroupedLeaves ); 2503 } 2504 } 2505 else 2506 pNode->m_aLeaves.push_back( 2507 new OptionsLeaf( 2508 sId, sLeafLabel, sLeafURL, 2509 sEventHdl, sLeafGrpId, nLeafGrpIdx ) ); 2510 } 2511 } 2512 } 2513 } 2514 2515 // do not insert nodes without leaves 2516 if ( pNode->m_aLeaves.size() > 0 || pNode->m_aGroupedLeaves.size() > 0 ) 2517 { 2518 pModule ? aNodeList.push_back( pNode ) : rOutNodeList.push_back( pNode ); 2519 } 2520 } 2521 } 2522 2523 if ( pModule && aNodeList.size() > 0 ) 2524 { 2525 sal_uInt32 i = 0, j = 0; 2526 for ( ; i < pModule->m_aNodeList.size(); ++i ) 2527 { 2528 rtl::OUString sNodeId = pModule->m_aNodeList[i]->m_sId; 2529 for ( j = 0; j < aNodeList.size(); ++j ) 2530 { 2531 OptionsNode* pNode = aNodeList[j]; 2532 if ( pNode->m_sId == sNodeId ) 2533 { 2534 rOutNodeList.push_back( pNode ); 2535 aNodeList.erase( aNodeList.begin() + j ); 2536 break; 2537 } 2538 } 2539 } 2540 2541 for ( i = 0; i < aNodeList.size(); ++i ) 2542 rOutNodeList.push_back( aNodeList[i] ); 2543 } 2544 } 2545 } 2546 } 2547 2548 sal_uInt16 lcl_getGroupId( const rtl::OUString& rGroupName, const SvTreeListBox& rTreeLB ) 2549 { 2550 String sGroupName( rGroupName ); 2551 sal_uInt16 nRet = 0; 2552 SvLBoxEntry* pEntry = rTreeLB.First(); 2553 while( pEntry ) 2554 { 2555 if ( !rTreeLB.GetParent( pEntry ) ) 2556 { 2557 String sTemp( rTreeLB.GetEntryText( pEntry ) ); 2558 if ( sTemp == sGroupName ) 2559 return nRet; 2560 nRet++; 2561 } 2562 pEntry = rTreeLB.Next( pEntry ); 2563 } 2564 2565 return USHRT_MAX; 2566 } 2567 2568 void lcl_insertLeaf( 2569 OfaTreeOptionsDialog* pDlg, OptionsNode* pNode, OptionsLeaf* pLeaf, const SvTreeListBox& rTreeLB ) 2570 { 2571 sal_uInt16 nGrpId = lcl_getGroupId( pNode->m_sLabel, rTreeLB ); 2572 if ( USHRT_MAX == nGrpId ) 2573 { 2574 sal_uInt16 nNodeGrpId = getGroupNodeId( pNode->m_sId ); 2575 nGrpId = pDlg->AddGroup( pNode->m_sLabel, NULL, NULL, nNodeGrpId ); 2576 if ( pNode->m_sPageURL.getLength() > 0 ) 2577 { 2578 SvLBoxEntry* pGrpEntry = rTreeLB.GetEntry( 0, nGrpId ); 2579 DBG_ASSERT( pGrpEntry, "OfaTreeOptionsDialog::InsertNodes(): no group" ); 2580 if ( pGrpEntry ) 2581 { 2582 OptionsGroupInfo* pGrpInfo = 2583 static_cast<OptionsGroupInfo*>(pGrpEntry->GetUserData()); 2584 pGrpInfo->m_sPageURL = pNode->m_sPageURL; 2585 } 2586 } 2587 } 2588 OptionsPageInfo* pInfo = pDlg->AddTabPage( 0, pLeaf->m_sLabel, nGrpId ); 2589 pInfo->m_sPageURL = pLeaf->m_sPageURL; 2590 pInfo->m_sEventHdl = pLeaf->m_sEventHdl; 2591 } 2592 2593 void OfaTreeOptionsDialog::InsertNodes( const VectorOfNodes& rNodeList ) 2594 { 2595 for ( sal_uInt32 i = 0; i < rNodeList.size(); ++i ) 2596 { 2597 OptionsNode* pNode = rNodeList[i]; 2598 2599 if ( pNode->m_aLeaves.size() > 0 || pNode->m_aGroupedLeaves.size() > 0 ) 2600 { 2601 sal_uInt32 j = 0; 2602 for ( ; j < pNode->m_aGroupedLeaves.size(); ++j ) 2603 { 2604 for ( sal_uInt32 k = 0; k < pNode->m_aGroupedLeaves[j].size(); ++k ) 2605 { 2606 OptionsLeaf* pLeaf = pNode->m_aGroupedLeaves[j][k]; 2607 lcl_insertLeaf( this, pNode, pLeaf, aTreeLB ); 2608 } 2609 } 2610 2611 for ( j = 0; j < pNode->m_aLeaves.size(); ++j ) 2612 { 2613 OptionsLeaf* pLeaf = pNode->m_aLeaves[j]; 2614 lcl_insertLeaf( this, pNode, pLeaf, aTreeLB ); 2615 } 2616 } 2617 } 2618 } 2619 2620 short OfaTreeOptionsDialog::Execute() 2621 { 2622 ::std::auto_ptr< SvxDicListChgClamp > pClamp; 2623 if ( !bIsFromExtensionManager ) 2624 { 2625 // collect all DictionaryList Events while the dialog is executed 2626 Reference<com::sun::star::linguistic2::XDictionaryList> xDictionaryList(SvxGetDictionaryList()); 2627 pClamp = ::std::auto_ptr< SvxDicListChgClamp >( new SvxDicListChgClamp( xDictionaryList ) ); 2628 } 2629 short nRet = SfxModalDialog::Execute(); 2630 2631 if( RET_OK == nRet ) 2632 { 2633 ApplyItemSets(); 2634 if( GetColorTable() ) 2635 { 2636 GetColorTable()->Save(); 2637 2638 // notify current viewframe it it uses the same color table 2639 if ( SfxViewFrame::Current() && SfxViewFrame::Current()->GetDispatcher() ) 2640 { 2641 const SvxColorTableItem* pPtr = dynamic_cast< const SvxColorTableItem* >( 2642 SfxViewFrame::Current()->GetDispatcher()->Execute(SID_GET_COLORTABLE, SFX_CALLMODE_SYNCHRON)); 2643 if( pPtr ) 2644 { 2645 XColorListSharedPtr aColorTab = pPtr->GetColorTable(); 2646 2647 if( aColorTab && 2648 aColorTab->GetPath() == GetColorTable()->GetPath() && 2649 aColorTab->GetName() == GetColorTable()->GetName() ) 2650 SfxObjectShell::Current()->PutItem( SvxColorTableItem( GetColorTable(), SID_COLOR_TABLE ) ); 2651 } 2652 } 2653 } 2654 2655 utl::ConfigManager::GetConfigManager()->StoreConfigItems(); 2656 } 2657 2658 return nRet; 2659 } 2660 2661 // class ExtensionsTabPage ----------------------------------------------- 2662 2663 ExtensionsTabPage::ExtensionsTabPage( 2664 Window* pParent, WinBits nStyle, const rtl::OUString& rPageURL, 2665 const rtl::OUString& rEvtHdl, const Reference< awt::XContainerWindowProvider >& rProvider ) : 2666 2667 TabPage( pParent, nStyle ), 2668 2669 m_sPageURL ( rPageURL ), 2670 m_sEventHdl ( rEvtHdl ), 2671 m_xWinProvider ( rProvider ), 2672 m_bIsWindowHidden ( false ) 2673 2674 { 2675 } 2676 2677 // ----------------------------------------------------------------------- 2678 2679 ExtensionsTabPage::~ExtensionsTabPage() 2680 { 2681 Hide(); 2682 DeactivatePage(); 2683 2684 if ( m_xPage.is() ) 2685 { 2686 Reference< XComponent > xComponent( m_xPage, UNO_QUERY ); 2687 if ( xComponent.is() ) 2688 { 2689 try 2690 { 2691 xComponent->dispose(); 2692 } 2693 catch ( const Exception & ) 2694 { 2695 } 2696 } 2697 m_xPage.clear(); 2698 } 2699 } 2700 2701 // ----------------------------------------------------------------------- 2702 2703 void ExtensionsTabPage::CreateDialogWithHandler() 2704 { 2705 try 2706 { 2707 bool bWithHandler = ( m_sEventHdl.getLength() > 0 ); 2708 if ( bWithHandler ) 2709 { 2710 Reference < XMultiServiceFactory > xFactory( ::comphelper::getProcessServiceFactory() ); 2711 m_xEventHdl = Reference< awt::XContainerWindowEventHandler >( 2712 xFactory->createInstance( m_sEventHdl ), UNO_QUERY ); 2713 } 2714 2715 if ( !bWithHandler || m_xEventHdl.is() ) 2716 { 2717 SetStyle( GetStyle() | WB_DIALOGCONTROL | WB_CHILDDLGCTRL ); 2718 Reference< awt::XWindowPeer > xParent( VCLUnoHelper::GetInterface( this ), UNO_QUERY ); 2719 m_xPage = Reference < awt::XWindow >( 2720 m_xWinProvider->createContainerWindow( 2721 m_sPageURL, rtl::OUString(), xParent, m_xEventHdl ), UNO_QUERY ); 2722 2723 Reference< awt::XControl > xPageControl( m_xPage, UNO_QUERY ); 2724 if ( xPageControl.is() ) 2725 { 2726 Reference< awt::XWindowPeer > xWinPeer( xPageControl->getPeer() ); 2727 if ( xWinPeer.is() ) 2728 { 2729 Window* pWindow = VCLUnoHelper::GetWindow( xWinPeer ); 2730 if ( pWindow ) 2731 pWindow->SetStyle( pWindow->GetStyle() | WB_DIALOGCONTROL | WB_CHILDDLGCTRL ); 2732 } 2733 } 2734 } 2735 } 2736 catch ( ::com::sun::star::lang::IllegalArgumentException& ) 2737 { 2738 DBG_ERRORFILE( "ExtensionsTabPage::CreateDialogWithHandler(): illegal argument" ); 2739 } 2740 catch ( Exception& ) 2741 { 2742 DBG_ERRORFILE( "ExtensionsTabPage::CreateDialogWithHandler(): exception of XDialogProvider2::createDialogWithHandler()" ); 2743 } 2744 } 2745 2746 // ----------------------------------------------------------------------- 2747 2748 sal_Bool ExtensionsTabPage::DispatchAction( const rtl::OUString& rAction ) 2749 { 2750 sal_Bool bRet = sal_False; 2751 if ( m_xEventHdl.is() ) 2752 { 2753 try 2754 { 2755 bRet = m_xEventHdl->callHandlerMethod( m_xPage, makeAny( rAction ), C2U("external_event") ); 2756 } 2757 catch ( Exception& ) 2758 { 2759 DBG_ERRORFILE( "ExtensionsTabPage::DispatchAction(): exception of XDialogEventHandler::callHandlerMethod()" ); 2760 } 2761 } 2762 return bRet; 2763 } 2764 2765 // ----------------------------------------------------------------------- 2766 2767 void ExtensionsTabPage::ActivatePage() 2768 { 2769 TabPage::ActivatePage(); 2770 2771 if ( !m_xPage.is() ) 2772 { 2773 CreateDialogWithHandler(); 2774 2775 if ( m_xPage.is() ) 2776 { 2777 Point aPos = Point(); 2778 Size aSize = GetSizePixel(); 2779 m_xPage->setPosSize( aPos.X() + 1, aPos.Y() + 1, 2780 aSize.Width() - 2, aSize.Height() - 2, awt::PosSize::POSSIZE ); 2781 if ( m_sEventHdl.getLength() > 0 ) 2782 DispatchAction( C2U("initialize") ); 2783 } 2784 } 2785 2786 if ( m_xPage.is() ) 2787 { 2788 m_xPage->setVisible( sal_True ); 2789 m_bIsWindowHidden = false; 2790 } 2791 } 2792 2793 // ----------------------------------------------------------------------- 2794 2795 void ExtensionsTabPage::DeactivatePage() 2796 { 2797 TabPage::DeactivatePage(); 2798 2799 if ( m_xPage.is() ) 2800 m_xPage->setVisible( sal_False ); 2801 } 2802 2803 // ----------------------------------------------------------------------- 2804 2805 void ExtensionsTabPage::ResetPage() 2806 { 2807 DispatchAction( C2U("back") ); 2808 ActivatePage(); 2809 } 2810 2811 // ----------------------------------------------------------------------- 2812 2813 void ExtensionsTabPage::SavePage() 2814 { 2815 DispatchAction( C2U("ok") ); 2816 } 2817