1 /************************************************************************* 2 * 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * Copyright 2000, 2010 Oracle and/or its affiliates. 6 * 7 * OpenOffice.org - a multi-platform office productivity suite 8 * 9 * This file is part of OpenOffice.org. 10 * 11 * OpenOffice.org is free software: you can redistribute it and/or modify 12 * it under the terms of the GNU Lesser General Public License version 3 13 * only, as published by the Free Software Foundation. 14 * 15 * OpenOffice.org is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU Lesser General Public License version 3 for more details 19 * (a copy is included in the LICENSE file that accompanied this code). 20 * 21 * You should have received a copy of the GNU Lesser General Public License 22 * version 3 along with OpenOffice.org. If not, see 23 * <http://www.openoffice.org/license.html> 24 * for a copy of the LGPLv3 License. 25 * 26 ************************************************************************/ 27 28 #if !TEST_LAYOUT 29 // MARKER(update_precomp.py): autogen include statement, do not remove 30 #include "precompiled_svx.hxx" 31 #endif /* !TEST_LAYOUT */ 32 33 #ifdef SVX_DLLIMPLEMENTATION 34 #undef SVX_DLLIMPLEMENTATION 35 #endif 36 37 // include --------------------------------------------------------------- 38 39 #if TEST_LAYOUT 40 #include <cstdio> 41 #endif /* TEST_LAYOUT */ 42 #include <tools/shl.hxx> 43 #include <svtools/itemset.hxx> 44 #include <svtools/itempool.hxx> 45 #include <sfx2/objsh.hxx> 46 #include <vcl/msgbox.hxx> 47 48 #define _SVX_ZOOM_CXX 49 50 #include <svx/dialogs.hrc> 51 #if !TEST_LAYOUT 52 #include "zoom.hrc" 53 #endif /* !TEST_LAYOUT */ 54 55 #include "zoom.hxx" 56 #if TEST_LAYOUT 57 #define SVX_ZOOM_OPTIMAL "Zoom optimal" 58 #define SVX_ZOOM_PAGEWIDTH "Zoom page width" 59 #define SVX_ZOOM_WHOLEPAGE "Zoom whole page" 60 struct SvxZoomItem 61 { 62 void SetType( char const* s ) 63 { 64 fputs( s, stderr ); 65 } 66 67 void SetValue( int n ) 68 { 69 fprintf( stderr, "Zoom factor: %d\n", int( n ) ); 70 } 71 }; 72 #define SfxPoolItem LAYOUT_SfxPoolItem 73 class LAYOUT_SfxPoolItem 74 { 75 }; 76 struct SvxViewLayoutItem : public LAYOUT_SfxPoolItem 77 { 78 bool IsBookMode() 79 { 80 return false; 81 } 82 USHORT GetValue() 83 { 84 return 0; 85 } 86 87 void SetValue( int n ) 88 { 89 fprintf( stderr, "Zoom factor: %d\n", int( n ) ); 90 } 91 void SetBookMode( bool ) 92 { 93 } 94 #if 0 // needed for real SfxPoolItem 95 int operator==( const SfxPoolItem& ) const 96 { 97 return 0; 98 } 99 SfxPoolItem* Clone( SfxItemPool* ) const 100 { 101 return 0; 102 } 103 #endif 104 }; 105 #else /* !TEST_LAYOUT */ 106 #include <svx/zoomitem.hxx> 107 #include <svx/viewlayoutitem.hxx> 108 #include <svx/dialmgr.hxx> 109 #endif /* !TEST_LAYOUT */ 110 #include "zoom_def.hxx" 111 112 #include <layout/layout-pre.hxx> 113 114 #if ENABLE_LAYOUT 115 #undef SVX_RES 116 #define SVX_RES(x) #x 117 #undef SfxModalDialog 118 #define SfxModalDialog( parent, id ) Dialog( parent, "zoom.xml", id ) 119 #endif /* ENABLE_LAYOUT */ 120 121 // static ---------------------------------------------------------------- 122 123 static USHORT pRanges[] = 124 { 125 SID_ATTR_ZOOM, 126 SID_ATTR_ZOOM, 127 0 128 }; 129 130 #define SPECIAL_FACTOR ((USHORT)0xFFFF) 131 132 // class SvxZoomDialog --------------------------------------------------- 133 134 USHORT SvxZoomDialog::GetFactor() const 135 { 136 if ( a100Btn.IsChecked() ) 137 return 100; 138 if ( aUserBtn.IsChecked() ) 139 return (USHORT)aUserEdit.GetValue(); 140 else 141 return SPECIAL_FACTOR; 142 } 143 144 // ----------------------------------------------------------------------- 145 146 void SvxZoomDialog::SetFactor( USHORT nNewFactor, USHORT nBtnId ) 147 { 148 #if TEST_LAYOUT 149 printf ("\t\t set factor %d\n", (int)nNewFactor); 150 #endif /* !TEST_LAYOUT */ 151 aUserEdit.Disable(); 152 153 if ( !nBtnId ) 154 { 155 if ( nNewFactor == 100 ) 156 { 157 a100Btn.Check(); 158 a100Btn.GrabFocus(); 159 } 160 else 161 { 162 aUserBtn.Check(); 163 aUserEdit.Enable(); 164 aUserEdit.SetValue( (long)nNewFactor ); 165 aUserEdit.GrabFocus(); 166 } 167 } 168 else 169 { 170 aUserEdit.SetValue( (long)nNewFactor ); 171 172 if ( ZOOMBTN_OPTIMAL == nBtnId ) 173 { 174 aOptimalBtn.Check(); 175 aOptimalBtn.GrabFocus(); 176 } 177 else if ( ZOOMBTN_PAGEWIDTH == nBtnId ) 178 { 179 aPageWidthBtn.Check(); 180 aPageWidthBtn.GrabFocus(); 181 } 182 else if ( ZOOMBTN_WHOLEPAGE == nBtnId ) 183 { 184 aWholePageBtn.Check(); 185 aWholePageBtn.GrabFocus(); 186 } 187 } 188 } 189 190 // ----------------------------------------------------------------------- 191 192 void SvxZoomDialog::SetButtonText( USHORT nBtnId, const String& rNewTxt ) 193 { 194 switch ( nBtnId ) 195 { 196 case ZOOMBTN_OPTIMAL: // Optimal-Button 197 aOptimalBtn.SetText( rNewTxt ); 198 break; 199 200 case ZOOMBTN_PAGEWIDTH: // Seitenbreite-Button 201 aPageWidthBtn.SetText( rNewTxt ); 202 break; 203 204 case ZOOMBTN_WHOLEPAGE: // Ganze Seite-Button 205 aWholePageBtn.SetText( rNewTxt ); 206 break; 207 208 default: 209 DBG_ERROR( "wrong button number" ); 210 } 211 } 212 213 // ----------------------------------------------------------------------- 214 215 void SvxZoomDialog::HideButton( USHORT nBtnId ) 216 { 217 switch ( nBtnId ) 218 { 219 case ZOOMBTN_OPTIMAL: // Optimal-Button 220 aOptimalBtn.Hide(); 221 break; 222 223 case ZOOMBTN_PAGEWIDTH: // Seitenbreite-Button 224 aPageWidthBtn.Hide(); 225 break; 226 227 case ZOOMBTN_WHOLEPAGE: // Ganze Seite-Button 228 aWholePageBtn.Hide(); 229 break; 230 231 default: 232 DBG_ERROR( "Falsche Button-Nummer!!!" ); 233 } 234 } 235 236 // ----------------------------------------------------------------------- 237 238 void SvxZoomDialog::SetLimits( USHORT nMin, USHORT nMax ) 239 { 240 DBG_ASSERT( nMin < nMax, "invalid limits" ); 241 aUserEdit.SetMin( nMin ); 242 aUserEdit.SetFirst( nMin ); 243 aUserEdit.SetMax( nMax ); 244 aUserEdit.SetLast( nMax ); 245 } 246 247 // ----------------------------------------------------------------------- 248 249 void SvxZoomDialog::SetSpinSize( USHORT nNewSpin ) 250 { 251 aUserEdit.SetSpinSize( nNewSpin ); 252 } 253 254 // ----------------------------------------------------------------------- 255 256 #if TEST_LAYOUT 257 SvxZoomDialog::SvxZoomDialog( Window* pParent ) : 258 #else /* !TEST_LAYOUT */ 259 SvxZoomDialog::SvxZoomDialog( Window* pParent, const SfxItemSet& rCoreSet ) : 260 #endif /* !TEST_LAYOUT */ 261 262 SfxModalDialog( pParent, SVX_RES( RID_SVXDLG_ZOOM ) ), 263 264 aZoomFl ( this, SVX_RES( FL_ZOOM ) ), 265 aOptimalBtn ( this, SVX_RES( BTN_OPTIMAL ) ), 266 aWholePageBtn ( this, SVX_RES( BTN_WHOLE_PAGE ) ), 267 aPageWidthBtn ( this, SVX_RES( BTN_PAGE_WIDTH ) ), 268 a100Btn ( this, SVX_RES( BTN_100 ) ), 269 aUserBtn ( this, SVX_RES( BTN_USER ) ), 270 aUserEdit ( this, SVX_RES( ED_USER ) ), 271 272 aViewLayoutFl ( this, SVX_RES( FL_VIEWLAYOUT ) ), 273 aAutomaticBtn ( this, SVX_RES( BTN_AUTOMATIC ) ), 274 aSingleBtn ( this, SVX_RES( BTN_SINGLE ) ), 275 aColumnsBtn ( this, SVX_RES( BTN_COLUMNS ) ), 276 aColumnsEdit ( this, SVX_RES( ED_COLUMNS ) ), 277 aBookModeChk ( this, SVX_RES( CHK_BOOK ) ), 278 279 aBottomFl ( this, SVX_RES( FL_BOTTOM ) ), 280 aOKBtn ( this, SVX_RES( BTN_ZOOM_OK ) ), 281 aCancelBtn ( this, SVX_RES( BTN_ZOOM_CANCEL ) ), 282 aHelpBtn ( this, SVX_RES( BTN_ZOOM_HELP ) ), 283 284 #if !TEST_LAYOUT 285 rSet ( rCoreSet ), 286 #endif /* !TEST_LAYOUT */ 287 pOutSet ( NULL ), 288 bModified ( FALSE ) 289 290 { 291 #if ENABLE_LAYOUT 292 SetHelpId (SID_ATTR_ZOOM); 293 #endif /* ENABLE_LAYOUT */ 294 Link aLink = LINK( this, SvxZoomDialog, UserHdl ); 295 a100Btn.SetClickHdl( aLink ); 296 aOptimalBtn.SetClickHdl( aLink ); 297 aPageWidthBtn.SetClickHdl( aLink ); 298 aWholePageBtn.SetClickHdl( aLink ); 299 aUserBtn.SetClickHdl( aLink ); 300 301 Link aViewLayoutLink = LINK( this, SvxZoomDialog, ViewLayoutUserHdl ); 302 aAutomaticBtn.SetClickHdl( aViewLayoutLink ); 303 aSingleBtn.SetClickHdl( aViewLayoutLink ); 304 aColumnsBtn.SetClickHdl( aViewLayoutLink ); 305 306 Link aViewLayoutSpinLink = LINK( this, SvxZoomDialog, ViewLayoutSpinHdl ); 307 aColumnsEdit.SetModifyHdl( aViewLayoutSpinLink ); 308 309 Link aViewLayoutCheckLink = LINK( this, SvxZoomDialog, ViewLayoutCheckHdl ); 310 aBookModeChk.SetClickHdl( aViewLayoutCheckLink ); 311 312 aOKBtn.SetClickHdl( LINK( this, SvxZoomDialog, OKHdl ) ); 313 aUserEdit.SetModifyHdl( LINK( this, SvxZoomDialog, SpinHdl ) ); 314 315 // Default-Werte 316 USHORT nValue = 100; 317 USHORT nMin = 10; 318 USHORT nMax = 1000; 319 320 #if !TEST_LAYOUT 321 // ggf. erst den alten Wert besorgen 322 const SfxUInt16Item* pOldUserItem = 0; 323 SfxObjectShell* pSh = SfxObjectShell::Current(); 324 325 if ( pSh ) 326 pOldUserItem = (const SfxUInt16Item*)pSh->GetItem( SID_ATTR_ZOOM_USER ); 327 328 if ( pOldUserItem ) 329 nValue = pOldUserItem->GetValue(); 330 331 // UserEdit initialisieren 332 if ( nMin > nValue ) 333 nMin = nValue; 334 if ( nMax < nValue ) 335 nMax = nValue; 336 #endif /* !TEST_LAYOUT */ 337 aUserEdit.SetMin( nMin ); 338 aUserEdit.SetFirst( nMin ); 339 aUserEdit.SetMax( nMax ); 340 aUserEdit.SetLast( nMax ); 341 aUserEdit.SetValue( nValue ); 342 343 #if TEST_LAYOUT 344 USHORT nZoom = 100; 345 SetFactor( nZoom ); 346 #else /* !TEST_LAYOUT */ 347 const SfxPoolItem& rItem = rSet.Get( rSet.GetPool()->GetWhich( SID_ATTR_ZOOM ) ); 348 349 if ( rItem.ISA(SvxZoomItem) ) 350 { 351 const SvxZoomItem& rZoomItem = (const SvxZoomItem&)rItem; 352 const USHORT nZoom = rZoomItem.GetValue(); 353 const SvxZoomType eType = rZoomItem.GetType(); 354 const USHORT nValSet = rZoomItem.GetValueSet(); 355 USHORT nBtnId = 0; 356 357 switch ( eType ) 358 { 359 case SVX_ZOOM_OPTIMAL: 360 nBtnId = ZOOMBTN_OPTIMAL; 361 break; 362 case SVX_ZOOM_PAGEWIDTH: 363 nBtnId = ZOOMBTN_PAGEWIDTH; 364 break; 365 case SVX_ZOOM_WHOLEPAGE: 366 nBtnId = ZOOMBTN_WHOLEPAGE; 367 break; 368 case SVX_ZOOM_PERCENT: 369 break; 370 case SVX_ZOOM_PAGEWIDTH_NOBORDER: 371 break; 372 } 373 374 if ( !(SVX_ZOOM_ENABLE_100 & nValSet) ) 375 a100Btn.Disable(); 376 if ( !(SVX_ZOOM_ENABLE_OPTIMAL & nValSet) ) 377 aOptimalBtn.Disable(); 378 if ( !(SVX_ZOOM_ENABLE_PAGEWIDTH & nValSet) ) 379 aPageWidthBtn.Disable(); 380 if ( !(SVX_ZOOM_ENABLE_WHOLEPAGE & nValSet) ) 381 aWholePageBtn.Disable(); 382 SetFactor( nZoom, nBtnId ); 383 } 384 else 385 { 386 const USHORT nZoom = ( (const SfxUInt16Item&)rItem ).GetValue(); 387 SetFactor( nZoom ); 388 } 389 390 const SfxPoolItem* pViewLayoutItem = 0; 391 if ( SFX_ITEM_SET == rSet.GetItemState( SID_ATTR_VIEWLAYOUT, FALSE, &pViewLayoutItem ) ) 392 { 393 const USHORT nColumns = static_cast<const SvxViewLayoutItem*>(pViewLayoutItem)->GetValue(); 394 const bool bBookMode = static_cast<const SvxViewLayoutItem*>(pViewLayoutItem)->IsBookMode(); 395 396 if ( 0 == nColumns ) 397 { 398 aAutomaticBtn.Check(); 399 aColumnsEdit.SetValue( 2 ); 400 aColumnsEdit.Disable(); 401 aBookModeChk.Disable(); 402 } 403 else if ( 1 == nColumns) 404 { 405 aSingleBtn.Check(); 406 aColumnsEdit.SetValue( 2 ); 407 aColumnsEdit.Disable(); 408 aBookModeChk.Disable(); 409 } 410 else 411 { 412 aColumnsBtn.Check(); 413 if ( !bBookMode ) 414 { 415 aColumnsEdit.SetValue( nColumns ); 416 if ( 0 != nColumns % 2 ) 417 aBookModeChk.Disable(); 418 } 419 else 420 { 421 aColumnsEdit.SetValue( nColumns ); 422 aBookModeChk.Check(); 423 } 424 } 425 } 426 else 427 { 428 // hide view layout related controls: 429 aViewLayoutFl.Disable(); 430 aAutomaticBtn.Disable(); 431 aSingleBtn.Disable(); 432 aColumnsBtn.Disable(); 433 aColumnsEdit.Disable(); 434 aBookModeChk.Disable(); 435 } 436 #endif /* !TEST_LAYOUT */ 437 438 FreeResource(); 439 } 440 441 // ----------------------------------------------------------------------- 442 443 SvxZoomDialog::~SvxZoomDialog() 444 { 445 delete pOutSet; 446 pOutSet = 0; 447 } 448 449 // ----------------------------------------------------------------------- 450 451 USHORT* SvxZoomDialog::GetRanges() 452 { 453 return pRanges; 454 } 455 456 // ----------------------------------------------------------------------- 457 458 IMPL_LINK( SvxZoomDialog, UserHdl, RadioButton *, pBtn ) 459 { 460 #if TEST_LAYOUT 461 fprintf( stderr, "SvxZoomDialog::UserHdl\n" ); 462 #endif /* TEST_LAYOUT */ 463 bModified |= TRUE; 464 465 if ( pBtn == &aUserBtn ) 466 { 467 aUserEdit.Enable(); 468 aUserEdit.GrabFocus(); 469 } 470 else 471 aUserEdit.Disable(); 472 return 0; 473 } 474 475 // ----------------------------------------------------------------------- 476 477 IMPL_LINK( SvxZoomDialog, SpinHdl, MetricField *, EMPTYARG ) 478 { 479 if ( !aUserBtn.IsChecked() ) 480 return 0; 481 bModified |= TRUE; 482 return 0; 483 } 484 485 // ----------------------------------------------------------------------- 486 487 IMPL_LINK( SvxZoomDialog, ViewLayoutUserHdl, RadioButton *, pBtn ) 488 { 489 bModified |= TRUE; 490 491 if ( pBtn == &aAutomaticBtn ) 492 { 493 aColumnsEdit.Disable(); 494 aBookModeChk.Disable(); 495 } 496 else if ( pBtn == &aSingleBtn ) 497 { 498 aColumnsEdit.Disable(); 499 aBookModeChk.Disable(); 500 } 501 else if ( pBtn == &aColumnsBtn ) 502 { 503 aColumnsEdit.Enable(); 504 aColumnsEdit.GrabFocus(); 505 if ( 0 == aColumnsEdit.GetValue() % 2 ) 506 aBookModeChk.Enable(); 507 } 508 else 509 { 510 DBG_ERROR( "Wrong Button" ); 511 return 0; 512 } 513 514 return 0; 515 } 516 517 // ----------------------------------------------------------------------- 518 519 IMPL_LINK( SvxZoomDialog, ViewLayoutSpinHdl, MetricField *, pEdt ) 520 { 521 if ( pEdt == &aColumnsEdit && !aColumnsBtn.IsChecked() ) 522 return 0; 523 524 if ( 0 == aColumnsEdit.GetValue() % 2 ) 525 aBookModeChk.Enable(); 526 else 527 { 528 aBookModeChk.Check( sal_False ); 529 aBookModeChk.Disable(); 530 } 531 532 bModified |= TRUE; 533 534 return 0; 535 } 536 537 // ----------------------------------------------------------------------- 538 539 IMPL_LINK( SvxZoomDialog, ViewLayoutCheckHdl, CheckBox *, pChk ) 540 { 541 if ( pChk == &aBookModeChk && !aColumnsBtn.IsChecked() ) 542 return 0; 543 544 bModified |= TRUE; 545 546 return 0; 547 } 548 549 // ----------------------------------------------------------------------- 550 551 IMPL_LINK( SvxZoomDialog, OKHdl, Button *, pBtn ) 552 { 553 if ( bModified || &aOKBtn != pBtn ) 554 { 555 #if TEST_LAYOUT 556 SvxZoomItem aZoomItem; 557 SvxViewLayoutItem aViewLayoutItem; 558 #else /* !TEST_LAYOUT */ 559 SvxZoomItem aZoomItem( SVX_ZOOM_PERCENT, 0, rSet.GetPool()->GetWhich( SID_ATTR_ZOOM ) ); 560 SvxViewLayoutItem aViewLayoutItem( 0, false, rSet.GetPool()->GetWhich( SID_ATTR_VIEWLAYOUT ) ); 561 #endif /* !TEST_LAYOUT */ 562 563 if ( &aOKBtn == pBtn ) 564 { 565 USHORT nFactor = GetFactor(); 566 567 if ( SPECIAL_FACTOR == nFactor ) 568 { 569 if ( aOptimalBtn.IsChecked() ) 570 aZoomItem.SetType( SVX_ZOOM_OPTIMAL ); 571 else if ( aPageWidthBtn.IsChecked() ) 572 aZoomItem.SetType( SVX_ZOOM_PAGEWIDTH ); 573 else if ( aWholePageBtn.IsChecked() ) 574 aZoomItem.SetType( SVX_ZOOM_WHOLEPAGE ); 575 } 576 else 577 aZoomItem.SetValue( nFactor ); 578 579 if ( aAutomaticBtn.IsChecked() ) 580 { 581 aViewLayoutItem.SetValue( 0 ); 582 aViewLayoutItem.SetBookMode( false ); 583 } 584 if ( aSingleBtn.IsChecked() ) 585 { 586 aViewLayoutItem.SetValue( 1 ); 587 aViewLayoutItem.SetBookMode( false ); 588 } 589 else if ( aColumnsBtn.IsChecked() ) 590 { 591 aViewLayoutItem.SetValue( static_cast<USHORT>(aColumnsEdit.GetValue()) ); 592 aViewLayoutItem.SetBookMode( aBookModeChk.IsChecked() ); 593 } 594 } 595 else 596 { 597 DBG_ERROR( "Wrong Button" ); 598 return 0; 599 } 600 #if !TEST_LAYOUT 601 pOutSet = new SfxItemSet( rSet ); 602 pOutSet->Put( aZoomItem ); 603 604 // don't set attribute in case the whole viewlayout stuff is disabled: 605 if ( aViewLayoutFl.IsEnabled() ) 606 pOutSet->Put( aViewLayoutItem ); 607 608 // Wert aus dem UserEdit "uber den Dialog hinaus merken 609 SfxObjectShell* pSh = SfxObjectShell::Current(); 610 611 if ( pSh ) 612 pSh->PutItem( SfxUInt16Item( SID_ATTR_ZOOM_USER, 613 (UINT16)aUserEdit.GetValue() ) ); 614 #endif /* !TEST_LAYOUT */ 615 EndDialog( RET_OK ); 616 } 617 else 618 EndDialog( RET_CANCEL ); 619 return 0; 620 } 621 622 623