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 27 #include <sfx2/app.hxx> 28 #include <tools/rc.h> 29 #include <tools/shl.hxx> 30 31 #define _SVSTDARR_USHORTS 32 #include <svl/svstdarr.hxx> 33 #include <dialmgr.hxx> 34 35 #include "iconcdlg.hxx" 36 37 #include "helpid.hrc" 38 #include <cuires.hrc> 39 #include <unotools/viewoptions.hxx> 40 #include <svtools/apearcfg.hxx> 41 #include <vcl/mnemonic.hxx> 42 #include <vcl/i18nhelp.hxx> 43 44 #ifdef WNT 45 int __cdecl IconcDlgCmpUS_Impl( const void* p1, const void* p2 ) 46 #else 47 #if defined(OS2) && defined(ICC) 48 int _Optlink IconcDlgCmpUS_Impl( const void* p1, const void* p2 ) 49 #else 50 int IconcDlgCmpUS_Impl( const void* p1, const void* p2 ) 51 #endif 52 #endif 53 { 54 return *(sal_uInt16*)p1 - *(sal_uInt16*)p2; 55 } 56 57 // some stuff for easier changes for SvtViewOptions 58 static const sal_Char* pViewOptDataName = "dialog data"; 59 #define VIEWOPT_DATANAME ::rtl::OUString::createFromAscii( pViewOptDataName ) 60 61 static inline void SetViewOptUserItem( SvtViewOptions& rOpt, const String& rData ) 62 { 63 rOpt.SetUserItem( VIEWOPT_DATANAME, ::com::sun::star::uno::makeAny( ::rtl::OUString( rData ) ) ); 64 } 65 66 static inline String GetViewOptUserItem( const SvtViewOptions& rOpt ) 67 { 68 ::com::sun::star::uno::Any aAny( rOpt.GetUserItem( VIEWOPT_DATANAME ) ); 69 ::rtl::OUString aUserData; 70 aAny >>= aUserData; 71 72 return String( aUserData ); 73 } 74 75 76 //##################################################################### 77 // 78 // Class IconChoicePage 79 // 80 //##################################################################### 81 82 /********************************************************************** 83 | 84 | Ctor / Dtor 85 | 86 \**********************************************************************/ 87 88 IconChoicePage::IconChoicePage( Window *pParent, const ResId &rResId, 89 const SfxItemSet &rAttrSet ) 90 : TabPage ( pParent, rResId ), 91 pSet ( &rAttrSet ), 92 bHasExchangeSupport ( sal_False ), 93 pDialog ( NULL ), 94 bStandard ( sal_False ) 95 { 96 SetStyle ( GetStyle() | WB_DIALOGCONTROL | WB_HIDE ); 97 } 98 99 // ----------------------------------------------------------------------- 100 101 IconChoicePage::~IconChoicePage() 102 { 103 } 104 105 /********************************************************************** 106 | 107 | Activate / Deaktivate 108 | 109 \**********************************************************************/ 110 111 void IconChoicePage::ActivatePage( const SfxItemSet& ) 112 { 113 } 114 115 // ----------------------------------------------------------------------- 116 117 int IconChoicePage::DeactivatePage( SfxItemSet* ) 118 { 119 return LEAVE_PAGE; 120 } 121 122 /********************************************************************** 123 | 124 | ... 125 | 126 \**********************************************************************/ 127 128 void IconChoicePage::FillUserData() 129 { 130 } 131 132 // ----------------------------------------------------------------------- 133 134 sal_Bool IconChoicePage::IsReadOnly() const 135 { 136 return sal_False; 137 } 138 139 // ----------------------------------------------------------------------- 140 141 sal_Bool IconChoicePage::QueryClose() 142 { 143 return sal_True; 144 } 145 146 /********************************************************************** 147 | 148 | window-methods 149 | 150 \**********************************************************************/ 151 152 void IconChoicePage::ImplInitSettings() 153 { 154 Window* pParent = GetParent(); 155 if ( pParent->IsChildTransparentModeEnabled() && !IsControlBackground() ) 156 { 157 EnableChildTransparentMode( sal_True ); 158 SetParentClipMode( PARENTCLIPMODE_NOCLIP ); 159 SetPaintTransparent( sal_True ); 160 SetBackground(); 161 } 162 else 163 { 164 EnableChildTransparentMode( sal_False ); 165 SetParentClipMode( 0 ); 166 SetPaintTransparent( sal_False ); 167 168 if ( IsControlBackground() ) 169 SetBackground( GetControlBackground() ); 170 else 171 SetBackground( pParent->GetBackground() ); 172 } 173 } 174 175 // ----------------------------------------------------------------------- 176 177 void IconChoicePage::StateChanged( StateChangedType nType ) 178 { 179 Window::StateChanged( nType ); 180 181 if ( nType == STATE_CHANGE_CONTROLBACKGROUND ) 182 { 183 ImplInitSettings(); 184 Invalidate(); 185 } 186 } 187 188 // ----------------------------------------------------------------------- 189 190 void IconChoicePage::DataChanged( const DataChangedEvent& rDCEvt ) 191 { 192 Window::DataChanged( rDCEvt ); 193 194 if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) && 195 (rDCEvt.GetFlags() & SETTINGS_STYLE) ) 196 { 197 ImplInitSettings(); 198 Invalidate(); 199 } 200 } 201 202 //##################################################################### 203 // 204 // Class IconChoiceDialog 205 // 206 //##################################################################### 207 208 /********************************************************************** 209 | 210 | Ctor / Dtor 211 | 212 \**********************************************************************/ 213 214 IconChoiceDialog::IconChoiceDialog ( Window* pParent, const ResId &rResId, 215 const EIconChoicePos ePos, 216 const SfxItemSet *pItemSet )//, sal_Bool bEditFmt, const String *pUserButtonText = 0 ) 217 : ModalDialog ( pParent, rResId ), 218 meChoicePos ( ePos ), 219 maIconCtrl ( this, WB_3DLOOK | WB_ICON | WB_BORDER | 220 WB_NOCOLUMNHEADER | WB_HIGHLIGHTFRAME | 221 /* WB_NOSELECTION | */ WB_NODRAGSELECTION | WB_TABSTOP ), 222 mnCurrentPageId ( USHRT_MAX ), 223 224 aOKBtn ( this, WB_DEFBUTTON ), 225 aCancelBtn ( this, WB_DEFBUTTON ), 226 aHelpBtn ( this ), 227 aResetBtn ( this ), 228 pSet ( pItemSet ), 229 pOutSet ( NULL ), 230 pExampleSet ( NULL ), 231 pRanges ( NULL ), 232 nResId ( rResId.GetId() ), 233 234 bHideResetBtn ( sal_False ), 235 bModal ( sal_False ), 236 bInOK ( sal_False ), 237 bModified ( sal_False ), 238 bItemsReset ( sal_False ) 239 { 240 // IconChoiceCtrl-Settings 241 //maIconCtrl.SetBackground ( Wallpaper( Color (146, 146, 186) ) ); 242 243 maIconCtrl.SetStyle (WB_3DLOOK | WB_ICON | WB_BORDER | WB_NOCOLUMNHEADER | WB_HIGHLIGHTFRAME | /* WB_NOSELECTION | */ WB_NODRAGSELECTION | WB_TABSTOP | WB_CLIPCHILDREN ); 244 SetCtrlPos ( meChoicePos ); 245 maIconCtrl.SetClickHdl ( LINK ( this, IconChoiceDialog , ChosePageHdl_Impl ) ); 246 maIconCtrl.Show(); 247 maIconCtrl.SetChoiceWithCursor ( sal_True ); 248 maIconCtrl.SetSelectionMode( SINGLE_SELECTION ); 249 maIconCtrl.SetHelpId( HID_ICCDIALOG_CHOICECTRL ); 250 251 // ItemSet 252 if ( pSet ) 253 { 254 pExampleSet = new SfxItemSet( *pSet ); 255 pOutSet = new SfxItemSet( *pSet->GetPool(), pSet->GetRanges() ); 256 } 257 258 // Buttons 259 aOKBtn.SetClickHdl ( LINK( this, IconChoiceDialog, OkHdl ) ); 260 aOKBtn.SetHelpId( HID_ICCDIALOG_OK_BTN ); 261 aCancelBtn.SetHelpId( HID_ICCDIALOG_CANCEL_BTN ); 262 aResetBtn.SetClickHdl( LINK( this, IconChoiceDialog, ResetHdl ) ); 263 aResetBtn.SetText( CUI_RESSTR(RID_SVXSTR_ICONCHOICEDLG_RESETBUT) ); 264 aResetBtn.SetHelpId( HID_ICCDIALOG_RESET_BTN ); 265 aOKBtn.Show(); 266 aCancelBtn.Show(); 267 aHelpBtn.Show(); 268 aResetBtn.Show(); 269 270 SetPosSizeCtrls ( sal_True ); 271 } 272 273 // ----------------------------------------------------------------------- 274 275 /* 276 IconChoiceDialog ::IconChoiceDialog ( SfxViewFrame *pViewFrame, Window* pParent, const ResId &rResId, 277 const SfxItemSet * = 0, sal_Bool bEditFmt = sal_False, 278 const String *pUserButtonText = 0 ) 279 : meChoicePos ( PosLeft ), // Default erst ma Links 280 maIconCtrl ( this, Die_Winbits ), 281 aOKBtn ( this ), 282 pUserBtn ( pUserButtonText? new PushButton(this): 0 ), 283 aCancelBtn ( this ), 284 aHelpBtn ( this ), 285 aResetBtn ( this ), 286 aBaseFmtBtn ( this ), 287 mnCurrentPageId ( 0 ) 288 { 289 FreeResource(); 290 } 291 */ 292 293 // ----------------------------------------------------------------------- 294 295 IconChoiceDialog ::~IconChoiceDialog () 296 { 297 sal_uLong i; 298 299 // save configuration at INI-Manager 300 // and remove pages 301 SvtViewOptions aTabDlgOpt( E_TABDIALOG, String::CreateFromInt32( nResId ) ); 302 aTabDlgOpt.SetWindowState( ::rtl::OUString::createFromAscii( GetWindowState((WINDOWSTATE_MASK_X | WINDOWSTATE_MASK_Y | WINDOWSTATE_MASK_STATE | WINDOWSTATE_MASK_MINIMIZED)).GetBuffer() ) ); 303 aTabDlgOpt.SetPageID( mnCurrentPageId ); 304 305 const sal_uLong nCount = maPageList.Count(); 306 307 for ( i = 0; i < nCount; ++i ) 308 { 309 IconChoicePageData* pData = maPageList.GetObject(i); 310 311 if ( pData->pPage ) 312 { 313 pData->pPage->FillUserData(); 314 String aPageData(pData->pPage->GetUserData()); 315 if ( aPageData.Len() ) 316 { 317 SvtViewOptions aTabPageOpt( E_TABPAGE, String::CreateFromInt32( pData->nId ) ); 318 319 SetViewOptUserItem( aTabPageOpt, aPageData ); 320 } 321 322 if ( pData->bOnDemand ) 323 delete (SfxItemSet*)&pData->pPage->GetItemSet(); 324 delete pData->pPage; 325 } 326 delete pData; 327 } 328 329 // remove Userdata from Icons 330 for ( i=0; i<maIconCtrl.GetEntryCount(); i++) 331 { 332 SvxIconChoiceCtrlEntry* pEntry = maIconCtrl.GetEntry ( i ); 333 sal_uInt16* pUserData = (sal_uInt16*) pEntry->GetUserData(); 334 delete pUserData; 335 } 336 337 // 338 if ( pRanges ) 339 delete pRanges; 340 if ( pOutSet ) 341 delete pOutSet; 342 } 343 344 /********************************************************************** 345 | 346 | add new page 347 | 348 \**********************************************************************/ 349 350 SvxIconChoiceCtrlEntry* IconChoiceDialog::AddTabPage( sal_uInt16 nId, const String& rIconText, 351 const Image& rChoiceIcon, 352 const Image& rChoiceIconHC, 353 CreatePage pCreateFunc /* != 0 */, 354 GetPageRanges pRangesFunc /* darf 0 sein */, 355 sal_Bool bItemsOnDemand, sal_uLong /*nPos*/ ) 356 { 357 IconChoicePageData* pData = new IconChoicePageData ( nId, pCreateFunc, 358 pRangesFunc, 359 bItemsOnDemand ); 360 maPageList.Insert ( pData, LIST_APPEND ); 361 362 pData->fnGetRanges = pRangesFunc; 363 pData->bOnDemand = bItemsOnDemand; 364 365 sal_uInt16 *pId = new sal_uInt16 ( nId ); 366 SvxIconChoiceCtrlEntry* pEntry = maIconCtrl.InsertEntry( rIconText, rChoiceIcon, rChoiceIconHC ); 367 pEntry->SetUserData ( (void*) pId ); 368 return pEntry; 369 } 370 371 /********************************************************************** 372 | 373 | Paint-method 374 | 375 \**********************************************************************/ 376 377 void IconChoiceDialog::Paint( const Rectangle& rRect ) 378 { 379 Dialog::Paint ( rRect ); 380 381 for ( sal_uLong i=0; i<maPageList.Count(); i++ ) 382 { 383 IconChoicePageData* pData = (IconChoicePageData*)maPageList.GetObject ( i ); 384 385 if ( pData->nId == mnCurrentPageId ) 386 { 387 ShowPageImpl ( pData ); 388 } 389 else 390 { 391 HidePageImpl ( pData ); 392 } 393 } 394 } 395 396 EIconChoicePos IconChoiceDialog::SetCtrlPos( const EIconChoicePos& rPos ) 397 { 398 WinBits aWinBits = maIconCtrl.GetStyle (); 399 400 switch ( meChoicePos ) 401 { 402 case PosLeft : 403 aWinBits &= ~WB_ALIGN_TOP & ~WB_NOVSCROLL; 404 aWinBits |= WB_ALIGN_LEFT | WB_NOHSCROLL; 405 break; 406 case PosRight : 407 aWinBits &= ~WB_ALIGN_TOP & ~WB_NOVSCROLL; 408 aWinBits |= WB_ALIGN_LEFT | WB_NOHSCROLL; 409 break; 410 case PosTop : 411 aWinBits &= ~WB_ALIGN_LEFT & ~WB_NOHSCROLL; 412 aWinBits |= WB_ALIGN_TOP | WB_NOVSCROLL; 413 break; 414 case PosBottom : 415 aWinBits &= ~WB_ALIGN_LEFT & ~WB_NOHSCROLL; 416 aWinBits |= WB_ALIGN_TOP | WB_NOVSCROLL; 417 break; 418 }; 419 maIconCtrl.SetStyle ( aWinBits ); 420 421 SetPosSizeCtrls(); 422 423 424 EIconChoicePos eOldPos = meChoicePos; 425 meChoicePos = rPos; 426 427 return eOldPos; 428 } 429 430 /********************************************************************** 431 | 432 | Show / Hide page or button 433 | 434 \**********************************************************************/ 435 436 void IconChoiceDialog::ShowPageImpl ( IconChoicePageData* pData ) 437 { 438 if ( pData->pPage ) 439 pData->pPage->Show(); 440 } 441 442 // ----------------------------------------------------------------------- 443 444 void IconChoiceDialog::HidePageImpl ( IconChoicePageData* pData ) 445 { 446 if ( pData->pPage ) 447 pData->pPage->Hide(); 448 } 449 450 // ----------------------------------------------------------------------- 451 452 void IconChoiceDialog::ShowPage( sal_uInt16 nId ) 453 { 454 bool bInvalidate = GetCurPageId() != nId; 455 SetCurPageId( nId ); 456 ActivatePageImpl( ); 457 if(bInvalidate) 458 Invalidate(); 459 460 // IA2 CWS. MT: I guess we want the event now, and not in Paint()? 461 IconChoicePageData* pData = GetPageData ( mnCurrentPageId ); 462 if(pData) 463 ShowPageImpl ( pData ); 464 } 465 466 /********************************************************************** 467 | 468 | Resize Dialog 469 | 470 \**********************************************************************/ 471 472 #define ICONCTRL_WIDTH_PIXEL 110 473 #define ICONCTRL_HEIGHT_PIXEL 75 474 #define MINSIZE_BUTTON_WIDTH 70 475 #define MINSIZE_BUTTON_HEIGHT 22 476 477 void IconChoiceDialog::Resize() 478 { 479 Dialog::Resize (); 480 481 if ( IsReallyVisible() ) 482 { 483 SetPosSizeCtrls (); 484 } 485 } 486 487 void IconChoiceDialog::SetPosSizeCtrls ( sal_Bool bInit ) 488 { 489 const Point aCtrlOffset ( LogicToPixel( Point( CTRLS_OFFSET, CTRLS_OFFSET ), MAP_APPFONT ) ); 490 Size aOutSize ( GetOutputSizePixel() ); 491 492 //////////////////////////////////////// 493 // Button-Defaults 494 // 495 Size aDefaultButtonSize = LogicToPixel( Size( 50, 14 ), MAP_APPFONT ); 496 497 // Reset-Button 498 Size aResetButtonSize ( bInit ? aDefaultButtonSize : 499 aResetBtn.GetSizePixel () ); 500 501 //////////////////////////////////////// 502 // IconChoiceCtrl resizen & positionieren 503 // 504 SvtTabAppearanceCfg aCfg; 505 const long nDefaultWidth = (aCfg.GetScaleFactor() * ICONCTRL_WIDTH_PIXEL) / 100; 506 const long nDefaultHeight = (aCfg.GetScaleFactor() * ICONCTRL_HEIGHT_PIXEL) / 100; 507 508 Size aNewIconCtrlSize ( nDefaultWidth, 509 aOutSize.Height()-(2*aCtrlOffset.X()) ); 510 Point aIconCtrlPos; 511 switch ( meChoicePos ) 512 { 513 case PosLeft : 514 aIconCtrlPos = aCtrlOffset; 515 aNewIconCtrlSize = Size ( nDefaultWidth, 516 aOutSize.Height()-(2*aCtrlOffset.X()) ); 517 break; 518 case PosRight : 519 aIconCtrlPos = Point ( aOutSize.Width() - nDefaultWidth - 520 aCtrlOffset.X(), aCtrlOffset.X() ); 521 aNewIconCtrlSize = Size ( nDefaultWidth, 522 aOutSize.Height()-(2*aCtrlOffset.X()) ); 523 break; 524 case PosTop : 525 aIconCtrlPos = aCtrlOffset; 526 aNewIconCtrlSize = Size ( aOutSize.Width()-(2*aCtrlOffset.X()), 527 nDefaultHeight ); 528 break; 529 case PosBottom : 530 aIconCtrlPos = Point ( aCtrlOffset.X(), aOutSize.Height() - 531 aResetButtonSize.Height() - (2*aCtrlOffset.X()) - 532 nDefaultHeight ); 533 aNewIconCtrlSize = Size ( aOutSize.Width()-(2*aCtrlOffset.X()), 534 nDefaultHeight ); 535 break; 536 }; 537 maIconCtrl.SetPosSizePixel ( aIconCtrlPos, aNewIconCtrlSize ); 538 maIconCtrl.ArrangeIcons(); 539 540 //////////////////////////////////////// 541 // Pages resizen & positionieren 542 // 543 for ( sal_uLong i=0; i<maPageList.Count(); i++ ) 544 { 545 IconChoicePageData* pData = (IconChoicePageData*)maPageList.GetObject ( i ); 546 547 Point aNewPagePos; 548 Size aNewPageSize; 549 switch ( meChoicePos ) 550 { 551 case PosLeft : 552 aNewPagePos = Point ( aNewIconCtrlSize.Width() + (2*CTRLS_OFFSET), 553 CTRLS_OFFSET ); 554 aNewPageSize = Size ( aOutSize.Width() - aNewIconCtrlSize.Width() - 555 (3*CTRLS_OFFSET), 556 aOutSize.Height() - aOKBtn.GetSizePixel().Height() - 557 (3*CTRLS_OFFSET) ); 558 break; 559 case PosRight : 560 aNewPagePos = aCtrlOffset; 561 aNewPageSize = Size ( aOutSize.Width() - aNewIconCtrlSize.Width() - 562 (3*aCtrlOffset.X()), 563 aOutSize.Height() - aOKBtn.GetSizePixel().Height() - 564 (3*aCtrlOffset.X()) ); 565 break; 566 case PosTop : 567 aNewPagePos = Point ( aCtrlOffset.X(), aNewIconCtrlSize.Height() + 568 (2*aCtrlOffset.X()) ); 569 aNewPageSize = Size ( aOutSize.Width() - (2*aCtrlOffset.X()), 570 aOutSize.Height() - aOKBtn.GetSizePixel().Height() - 571 aNewIconCtrlSize.Height() - (4*aCtrlOffset.X()) ); 572 break; 573 case PosBottom : 574 aNewPagePos = aCtrlOffset; 575 aNewPageSize = Size ( aOutSize.Width() - (2*aCtrlOffset.X()), 576 aOutSize.Height() - aOKBtn.GetSizePixel().Height() - 577 aNewIconCtrlSize.Height() - (4*aCtrlOffset.X()) ); 578 break; 579 }; 580 581 if ( pData->pPage ) 582 pData->pPage->SetPosSizePixel ( aNewPagePos, aNewPageSize ); 583 } 584 585 //////////////////////////////////////// 586 // Buttons positionieren 587 // 588 sal_uLong nXOffset=0; 589 if ( meChoicePos == PosRight ) 590 nXOffset = aNewIconCtrlSize.Width()+(2*aCtrlOffset.X()); 591 592 aResetBtn.SetPosSizePixel ( Point( aOutSize.Width() - nXOffset - 593 aResetButtonSize.Width()-aCtrlOffset.X(), 594 aOutSize.Height()-aResetButtonSize.Height()- 595 aCtrlOffset.X() ), 596 aResetButtonSize ); 597 // Help-Button 598 Size aHelpButtonSize ( bInit ? aDefaultButtonSize : 599 aHelpBtn.GetSizePixel () ); 600 aHelpBtn.SetPosSizePixel ( Point( aOutSize.Width()-aResetButtonSize.Width()- 601 aHelpButtonSize.Width()- nXOffset - 602 (2*aCtrlOffset.X()), 603 aOutSize.Height()-aHelpButtonSize.Height()- 604 aCtrlOffset.X() ), 605 aHelpButtonSize ); 606 // Cancel-Button 607 Size aCancelButtonSize ( bInit ? aDefaultButtonSize : 608 aCancelBtn.GetSizePixel () ); 609 aCancelBtn.SetPosSizePixel ( Point( aOutSize.Width()-aCancelButtonSize.Width()- 610 aResetButtonSize.Width()-aHelpButtonSize.Width()- 611 (3*aCtrlOffset.X()) - nXOffset, 612 aOutSize.Height()-aCancelButtonSize.Height()- 613 aCtrlOffset.X() ), 614 aCancelButtonSize ); 615 // OK-Button 616 Size aOKButtonSize ( bInit ? aDefaultButtonSize : aOKBtn.GetSizePixel () ); 617 aOKBtn.SetPosSizePixel ( Point( aOutSize.Width()-aOKButtonSize.Width()- 618 aCancelButtonSize.Width()-aResetButtonSize.Width()- 619 aHelpButtonSize.Width()-(4*aCtrlOffset.X())- nXOffset, 620 aOutSize.Height()-aOKButtonSize.Height()-aCtrlOffset.X() ), 621 aOKButtonSize ); 622 623 Invalidate(); 624 } 625 626 void IconChoiceDialog::SetPosSizePages ( sal_uInt16 nId ) 627 { 628 const Point aCtrlOffset ( LogicToPixel( Point( CTRLS_OFFSET, CTRLS_OFFSET ), MAP_APPFONT ) ); 629 IconChoicePageData* pData = GetPageData ( nId ); 630 631 if ( pData->pPage ) 632 { 633 Size aOutSize ( GetOutputSizePixel() ); 634 Size aIconCtrlSize ( maIconCtrl.GetSizePixel() ); 635 636 Point aNewPagePos; 637 Size aNewPageSize; 638 switch ( meChoicePos ) 639 { 640 case PosLeft : 641 aNewPagePos = Point ( aIconCtrlSize.Width() + (2*aCtrlOffset.X()), 642 aCtrlOffset.X() ); 643 aNewPageSize = Size ( aOutSize.Width() - maIconCtrl.GetSizePixel().Width() - 644 (3*aCtrlOffset.X()), 645 aOutSize.Height() - aOKBtn.GetSizePixel().Height() - 646 (3*aCtrlOffset.X()) ); 647 break; 648 case PosRight : 649 aNewPagePos = aCtrlOffset; 650 aNewPageSize = Size ( aOutSize.Width() - maIconCtrl.GetSizePixel().Width() - 651 (3*aCtrlOffset.X()), 652 aOutSize.Height() - aOKBtn.GetSizePixel().Height() - 653 (3*aCtrlOffset.X()) ); 654 break; 655 case PosTop : 656 aNewPagePos = Point ( aCtrlOffset.X(), aIconCtrlSize.Height() + 657 (2*aCtrlOffset.X()) ); 658 aNewPageSize = Size ( aOutSize.Width() - (2*aCtrlOffset.X()), 659 aOutSize.Height() - aOKBtn.GetSizePixel().Height() - 660 maIconCtrl.GetSizePixel().Height() - (4*aCtrlOffset.X()) ); 661 break; 662 case PosBottom : 663 aNewPagePos = aCtrlOffset; 664 aNewPageSize = Size ( aOutSize.Width() - (2*aCtrlOffset.X()), 665 aOutSize.Height() - aOKBtn.GetSizePixel().Height() - 666 maIconCtrl.GetSizePixel().Height() - (4*aCtrlOffset.X()) ); 667 break; 668 }; 669 670 pData->pPage->SetPosSizePixel ( aNewPagePos, aNewPageSize ); 671 } 672 } 673 674 /********************************************************************** 675 | 676 | select a page 677 | 678 \**********************************************************************/ 679 680 IMPL_LINK ( IconChoiceDialog , ChosePageHdl_Impl, void *, EMPTYARG ) 681 { 682 sal_uLong nPos; 683 684 SvxIconChoiceCtrlEntry *pEntry = maIconCtrl.GetSelectedEntry ( nPos ); 685 if ( !pEntry ) 686 pEntry = maIconCtrl.GetCursor( ); 687 688 sal_uInt16 *pId = (sal_uInt16*)pEntry->GetUserData (); 689 690 if( *pId != mnCurrentPageId ) 691 { 692 IconChoicePageData* pData = GetPageData ( mnCurrentPageId ); 693 if ( pData->pPage ) 694 DeActivatePageImpl(); 695 696 SetCurPageId ( *pId ); 697 698 ActivatePageImpl(); 699 Invalidate(); 700 } 701 702 return 0L; 703 } 704 705 /********************************************************************** 706 | 707 | Button-handler 708 | 709 \**********************************************************************/ 710 711 IMPL_LINK( IconChoiceDialog, OkHdl, Button *, EMPTYARG ) 712 { 713 bInOK = sal_True; 714 715 if ( OK_Impl() ) 716 { 717 if ( bModal ) 718 EndDialog( Ok() ); 719 else 720 { 721 Ok(); 722 Close(); 723 } 724 } 725 return 0; 726 } 727 728 // ----------------------------------------------------------------------- 729 730 IMPL_LINK( IconChoiceDialog, ResetHdl, Button *, EMPTYARG ) 731 { 732 ResetPageImpl (); 733 734 IconChoicePageData* pData = GetPageData ( mnCurrentPageId ); 735 DBG_ASSERT( pData, "Id nicht bekannt" ); 736 737 if ( pData->bOnDemand ) 738 { 739 // CSet auf AIS hat hier Probleme, daher getrennt 740 const SfxItemSet* _pSet = &( pData->pPage->GetItemSet() ); 741 pData->pPage->Reset( *(SfxItemSet*)_pSet ); 742 } 743 else 744 pData->pPage->Reset( *pSet ); 745 746 747 return 0; 748 } 749 750 // ----------------------------------------------------------------------- 751 752 IMPL_LINK( IconChoiceDialog, CancelHdl, Button*, EMPTYARG ) 753 { 754 Close(); 755 756 return 0; 757 } 758 759 /********************************************************************** 760 | 761 | call page 762 | 763 \**********************************************************************/ 764 765 void IconChoiceDialog::ActivatePageImpl () 766 { 767 DBG_ASSERT( maPageList.Count(), "keine Pages angemeldet" ); 768 IconChoicePageData* pData = GetPageData ( mnCurrentPageId ); 769 DBG_ASSERT( pData, "Id nicht bekannt" ); 770 if ( pData ) 771 { 772 if ( !pData->pPage ) 773 { 774 const SfxItemSet* pTmpSet = 0; 775 776 if ( pSet ) 777 { 778 if ( bItemsReset && pSet->GetParent() ) 779 pTmpSet = pSet->GetParent(); 780 else 781 pTmpSet = pSet; 782 } 783 784 if ( pTmpSet && !pData->bOnDemand ) 785 pData->pPage = (pData->fnCreatePage)( this, *pTmpSet ); 786 else 787 pData->pPage = (pData->fnCreatePage)( this, *CreateInputItemSet( mnCurrentPageId ) ); 788 789 SvtViewOptions aTabPageOpt( E_TABPAGE, String::CreateFromInt32( pData->nId ) ); 790 pData->pPage->SetUserData( GetViewOptUserItem( aTabPageOpt ) ); 791 SetPosSizePages ( pData->nId ); 792 793 if ( pData->bOnDemand ) 794 pData->pPage->Reset( (SfxItemSet &)pData->pPage->GetItemSet() ); 795 else 796 pData->pPage->Reset( *pSet ); 797 798 PageCreated( mnCurrentPageId, *pData->pPage ); 799 } 800 else if ( pData->bRefresh ) 801 { 802 pData->pPage->Reset( *pSet ); 803 } 804 805 pData->bRefresh = sal_False; 806 807 if ( pExampleSet ) 808 pData->pPage->ActivatePage( *pExampleSet ); 809 } 810 811 SetHelpId( pData->pPage->GetHelpId() ); 812 813 sal_Bool bReadOnly = pData->pPage->IsReadOnly(); 814 if ( bReadOnly || bHideResetBtn ) 815 aResetBtn.Hide(); 816 else 817 aResetBtn.Show(); 818 819 } 820 821 // ----------------------------------------------------------------------- 822 823 sal_Bool IconChoiceDialog::DeActivatePageImpl () 824 { 825 IconChoicePageData *pData = GetPageData ( mnCurrentPageId ); 826 827 int nRet = IconChoicePage::LEAVE_PAGE; 828 829 if ( pData ) 830 { 831 IconChoicePage * pPage = pData->pPage; 832 833 if ( !pExampleSet && pPage->HasExchangeSupport() && pSet ) 834 pExampleSet = new SfxItemSet( *pSet->GetPool(), pSet->GetRanges() ); 835 836 if ( pSet ) 837 { 838 SfxItemSet aTmp( *pSet->GetPool(), pSet->GetRanges() ); 839 840 if ( pPage->HasExchangeSupport() ) 841 nRet = pPage->DeactivatePage( &aTmp ); 842 843 if ( ( IconChoicePage::LEAVE_PAGE & nRet ) == IconChoicePage::LEAVE_PAGE && 844 aTmp.Count() ) 845 { 846 pExampleSet->Put( aTmp ); 847 pOutSet->Put( aTmp ); 848 } 849 } 850 else 851 { 852 if ( pPage->HasExchangeSupport() ) //!!! 853 { 854 if ( !pExampleSet ) 855 { 856 SfxItemPool* pPool = pPage->GetItemSet().GetPool(); 857 pExampleSet = 858 new SfxItemSet( *pPool, GetInputRanges( *pPool ) ); 859 } 860 nRet = pPage->DeactivatePage( pExampleSet ); 861 } 862 else 863 nRet = pPage->DeactivatePage( NULL ); 864 } 865 866 if ( nRet & IconChoicePage::REFRESH_SET ) 867 { 868 pSet = GetRefreshedSet(); 869 DBG_ASSERT( pSet, "GetRefreshedSet() liefert NULL" ); 870 // alle Pages als neu zu initialsieren flaggen 871 const sal_uLong nCount = maPageList.Count(); 872 873 for ( sal_uInt16 i = 0; i < nCount; ++i ) 874 { 875 IconChoicePageData* pObj = (IconChoicePageData*)maPageList.GetObject(i); 876 877 if ( pObj->pPage != pPage ) // eigene Page nicht mehr refreshen 878 pObj->bRefresh = sal_True; 879 else 880 pObj->bRefresh = sal_False; 881 } 882 } 883 } 884 885 if ( nRet & IconChoicePage::LEAVE_PAGE ) 886 return sal_True; 887 else 888 return sal_False; 889 } 890 891 // ----------------------------------------------------------------------- 892 893 void IconChoiceDialog::ResetPageImpl () 894 { 895 IconChoicePageData *pData = GetPageData ( mnCurrentPageId ); 896 897 DBG_ASSERT( pData, "Id nicht bekannt" ); 898 899 if ( pData->bOnDemand ) 900 { 901 // CSet auf AIS hat hier Probleme, daher getrennt 902 const SfxItemSet* _pSet = &pData->pPage->GetItemSet(); 903 pData->pPage->Reset( *(SfxItemSet*)_pSet ); 904 } 905 else 906 pData->pPage->Reset( *pSet ); 907 } 908 909 /********************************************************************** 910 | 911 | handling itemsets 912 | 913 \**********************************************************************/ 914 915 const sal_uInt16* IconChoiceDialog::GetInputRanges( const SfxItemPool& rPool ) 916 { 917 if ( pSet ) 918 { 919 DBG_ERRORFILE( "Set bereits vorhanden!" ); 920 return pSet->GetRanges(); 921 } 922 923 if ( pRanges ) 924 return pRanges; 925 SvUShorts aUS( 16, 16 ); 926 sal_uLong nCount = maPageList.Count(); 927 928 sal_uInt16 i; 929 for ( i = 0; i < nCount; ++i ) 930 { 931 IconChoicePageData* pData = maPageList.GetObject (i); 932 933 if ( pData->fnGetRanges ) 934 { 935 const sal_uInt16* pTmpRanges = (pData->fnGetRanges)(); 936 const sal_uInt16* pIter = pTmpRanges; 937 938 sal_uInt16 nLen; 939 for( nLen = 0; *pIter; ++nLen, ++pIter ) 940 ; 941 aUS.Insert( pTmpRanges, nLen, aUS.Count() ); 942 } 943 } 944 945 // remove double Id's 946 #ifndef TF_POOLABLE 947 if ( rPool.HasMap() ) 948 #endif 949 { 950 nCount = aUS.Count(); 951 952 for ( i = 0; i < nCount; ++i ) 953 aUS[i] = rPool.GetWhich( aUS[i] ); 954 } 955 956 // sortieren 957 if ( aUS.Count() > 1 ) 958 { 959 #if defined __SUNPRO_CC 960 #pragma disable_warn 961 #endif 962 qsort( (void*)aUS.GetData(), aUS.Count(), sizeof(sal_uInt16), IconcDlgCmpUS_Impl ); 963 #if defined __SUNPRO_CC 964 #pragma enable_warn 965 #endif 966 } 967 968 pRanges = new sal_uInt16[aUS.Count() + 1]; 969 memcpy(pRanges, aUS.GetData(), sizeof(sal_uInt16) * aUS.Count()); 970 pRanges[aUS.Count()] = 0; 971 972 return pRanges; 973 } 974 975 // ----------------------------------------------------------------------- 976 977 void IconChoiceDialog::SetInputSet( const SfxItemSet* pInSet ) 978 { 979 FASTBOOL bSet = ( pSet != NULL ); 980 981 pSet = pInSet; 982 983 if ( !bSet && !pExampleSet && !pOutSet ) 984 { 985 pExampleSet = new SfxItemSet( *pSet ); 986 pOutSet = new SfxItemSet( *pSet->GetPool(), pSet->GetRanges() ); 987 } 988 } 989 990 // ----------------------------------------------------------------------- 991 992 void IconChoiceDialog::PageCreated( sal_uInt16 /*nId*/, IconChoicePage& /*rPage*/ ) 993 { 994 // not interested in 995 } 996 997 // ----------------------------------------------------------------------- 998 999 SfxItemSet* IconChoiceDialog::CreateInputItemSet( sal_uInt16 ) 1000 { 1001 DBG_WARNINGFILE( "CreateInputItemSet nicht implementiert" ); 1002 1003 return 0; 1004 } 1005 1006 /********************************************************************** 1007 | 1008 | start dialog 1009 | 1010 \**********************************************************************/ 1011 1012 short IconChoiceDialog::Execute() 1013 { 1014 if ( !maPageList.Count() ) 1015 return RET_CANCEL; 1016 1017 Start_Impl(); 1018 1019 return Dialog::Execute(); 1020 } 1021 1022 // ----------------------------------------------------------------------- 1023 1024 void IconChoiceDialog::Start( sal_Bool bShow ) 1025 { 1026 1027 aCancelBtn.SetClickHdl( LINK( this, IconChoiceDialog, CancelHdl ) ); 1028 bModal = sal_False; 1029 1030 Start_Impl(); 1031 1032 if ( bShow ) 1033 Window::Show(); 1034 1035 } 1036 1037 // ----------------------------------------------------------------------- 1038 1039 sal_Bool IconChoiceDialog::QueryClose() 1040 { 1041 sal_Bool bRet = sal_True; 1042 const sal_uLong nCount = maPageList.Count(); 1043 for ( sal_uLong i = 0; i < nCount; ++i ) 1044 { 1045 IconChoicePageData* pData = maPageList.GetObject(i); 1046 if ( pData->pPage && !pData->pPage->QueryClose() ) 1047 { 1048 bRet = sal_False; 1049 break; 1050 } 1051 } 1052 return bRet; 1053 } 1054 1055 // ----------------------------------------------------------------------- 1056 1057 void IconChoiceDialog::Start_Impl() 1058 { 1059 Point aPos; 1060 sal_uInt16 nActPage; 1061 1062 if ( mnCurrentPageId == 0 || mnCurrentPageId == USHRT_MAX ) 1063 nActPage = maPageList.GetObject(0)->nId;//First()->nId; 1064 else 1065 nActPage = mnCurrentPageId; 1066 1067 // Konfiguration vorhanden? 1068 SvtViewOptions aTabDlgOpt( E_TABDIALOG, String::CreateFromInt32( nResId ) ); 1069 1070 if ( aTabDlgOpt.Exists() ) 1071 { 1072 // ggf. Position aus Konfig 1073 SetWindowState( ByteString( aTabDlgOpt.GetWindowState().getStr(), RTL_TEXTENCODING_ASCII_US ) ); 1074 1075 // initiale TabPage aus Programm/Hilfe/Konfig 1076 nActPage = (sal_uInt16)aTabDlgOpt.GetPageID(); 1077 1078 if ( USHRT_MAX != mnCurrentPageId ) 1079 nActPage = mnCurrentPageId; 1080 1081 if ( GetPageData ( nActPage ) == NULL ) 1082 nActPage = ( (IconChoicePageData*)maPageList.GetObject(0) )->nId; 1083 } 1084 else if ( USHRT_MAX != mnCurrentPageId && GetPageData ( mnCurrentPageId ) != NULL ) 1085 nActPage = mnCurrentPageId; 1086 1087 mnCurrentPageId = nActPage; 1088 1089 FocusOnIcon( mnCurrentPageId ); 1090 1091 ActivatePageImpl(); 1092 } 1093 1094 // ----------------------------------------------------------------------- 1095 1096 const SfxItemSet* IconChoiceDialog::GetRefreshedSet() 1097 { 1098 DBG_ERRORFILE( "GetRefreshedSet nicht implementiert" ); 1099 return 0; 1100 } 1101 1102 /********************************************************************** 1103 | 1104 | tool-methods 1105 | 1106 \**********************************************************************/ 1107 1108 IconChoicePageData* IconChoiceDialog::GetPageData ( sal_uInt16 nId ) 1109 { 1110 IconChoicePageData *pRet = NULL; 1111 sal_Bool bFound = sal_False; 1112 1113 for ( sal_uLong i=0; i<maPageList.Count() && !bFound; i++ ) 1114 { 1115 IconChoicePageData* pData = (IconChoicePageData*)maPageList.GetObject ( i ); 1116 1117 if ( pData->nId == nId ) 1118 { 1119 pRet = pData; 1120 } 1121 } 1122 1123 return pRet; 1124 } 1125 1126 /********************************************************************** 1127 | 1128 | OK-Status 1129 | 1130 \**********************************************************************/ 1131 1132 sal_Bool IconChoiceDialog::OK_Impl() 1133 { 1134 IconChoicePage* pPage = GetPageData ( mnCurrentPageId )->pPage; 1135 1136 bool bEnd = !pPage; 1137 if ( pPage ) 1138 { 1139 int nRet = IconChoicePage::LEAVE_PAGE; 1140 if ( pSet ) 1141 { 1142 SfxItemSet aTmp( *pSet->GetPool(), pSet->GetRanges() ); 1143 sal_Bool bRet = sal_False; 1144 1145 if ( pPage->HasExchangeSupport() ) 1146 nRet = pPage->DeactivatePage( &aTmp ); 1147 1148 if ( ( IconChoicePage::LEAVE_PAGE & nRet ) == IconChoicePage::LEAVE_PAGE 1149 && aTmp.Count() ) 1150 { 1151 pExampleSet->Put( aTmp ); 1152 pOutSet->Put( aTmp ); 1153 } 1154 else if ( bRet ) 1155 bModified |= sal_True; 1156 } 1157 else 1158 nRet = pPage->DeactivatePage( NULL ); 1159 bEnd = nRet; 1160 } 1161 1162 return bEnd; 1163 } 1164 1165 // ----------------------------------------------------------------------- 1166 1167 short IconChoiceDialog::Ok() 1168 { 1169 bInOK = sal_True; 1170 1171 if ( !pOutSet ) 1172 { 1173 if ( !pExampleSet && pSet ) 1174 pOutSet = pSet->Clone( sal_False ); // ohne Items 1175 else if ( pExampleSet ) 1176 pOutSet = new SfxItemSet( *pExampleSet ); 1177 } 1178 sal_Bool _bModified = sal_False; 1179 1180 const sal_uLong nCount = maPageList.Count(); 1181 1182 for ( sal_uInt16 i = 0; i < nCount; ++i ) 1183 { 1184 IconChoicePageData* pData = GetPageData ( i ); 1185 1186 IconChoicePage* pPage = pData->pPage; 1187 1188 if ( pPage ) 1189 { 1190 if ( pData->bOnDemand ) 1191 { 1192 SfxItemSet& rSet = (SfxItemSet&)pPage->GetItemSet(); 1193 rSet.ClearItem(); 1194 _bModified |= pPage->FillItemSet( rSet ); 1195 } 1196 else if ( pSet && !pPage->HasExchangeSupport() ) 1197 { 1198 SfxItemSet aTmp( *pSet->GetPool(), pSet->GetRanges() ); 1199 1200 if ( pPage->FillItemSet( aTmp ) ) 1201 { 1202 _bModified |= sal_True; 1203 pExampleSet->Put( aTmp ); 1204 pOutSet->Put( aTmp ); 1205 } 1206 } 1207 } 1208 } 1209 1210 if ( _bModified || ( pOutSet && pOutSet->Count() > 0 ) ) 1211 _bModified |= sal_True; 1212 1213 return _bModified ? RET_OK : RET_CANCEL; 1214 } 1215 1216 // ----------------------------------------------------------------------- 1217 1218 void IconChoiceDialog::FocusOnIcon( sal_uInt16 nId ) 1219 { 1220 // set focus to icon for the current visible page 1221 for ( sal_uInt16 i=0; i<maIconCtrl.GetEntryCount(); i++) 1222 { 1223 SvxIconChoiceCtrlEntry* pEntry = maIconCtrl.GetEntry ( i ); 1224 sal_uInt16* pUserData = (sal_uInt16*) pEntry->GetUserData(); 1225 1226 if ( pUserData && *pUserData == nId ) 1227 { 1228 maIconCtrl.SetCursor( pEntry ); 1229 break; 1230 } 1231 } 1232 } 1233