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 // MARKER(update_precomp.py): autogen include statement, do not remove 29 #include "precompiled_cui.hxx" 30 31 // include --------------------------------------------------------------- 32 33 #include <tools/shl.hxx> 34 #include <svl/itemset.hxx> 35 #include <svl/itempool.hxx> 36 #include <sfx2/objsh.hxx> 37 #include <vcl/msgbox.hxx> 38 39 #define _SVX_ZOOM_CXX 40 41 #include <cuires.hrc> 42 #include "zoom.hrc" 43 44 #include "zoom.hxx" 45 #include <svx/zoomitem.hxx> 46 #include <svx/viewlayoutitem.hxx> 47 #include <dialmgr.hxx> 48 #include <svx/zoom_def.hxx> 49 #include <svx/dialogs.hrc> // RID_SVXDLG_ZOOM 50 #include <layout/layout-pre.hxx> 51 52 #if ENABLE_LAYOUT 53 #undef CUI_RES 54 #define CUI_RES(x) #x 55 #undef SfxModalDialog 56 #define SfxModalDialog( parent, id ) Dialog( parent, "zoom.xml", id ) 57 #endif /* ENABLE_LAYOUT */ 58 59 // static ---------------------------------------------------------------- 60 61 #define SPECIAL_FACTOR ((sal_uInt16)0xFFFF) 62 63 // class SvxZoomDialog --------------------------------------------------- 64 65 sal_uInt16 SvxZoomDialog::GetFactor() const 66 { 67 if ( a100Btn.IsChecked() ) 68 return 100; 69 if ( aUserBtn.IsChecked() ) 70 return (sal_uInt16)aUserEdit.GetValue(); 71 else 72 return SPECIAL_FACTOR; 73 } 74 75 // ----------------------------------------------------------------------- 76 77 void SvxZoomDialog::SetFactor( sal_uInt16 nNewFactor, sal_uInt16 nBtnId ) 78 { 79 aUserEdit.Disable(); 80 81 if ( !nBtnId ) 82 { 83 if ( nNewFactor == 100 ) 84 { 85 a100Btn.Check(); 86 a100Btn.GrabFocus(); 87 } 88 else 89 { 90 aUserBtn.Check(); 91 aUserEdit.Enable(); 92 aUserEdit.SetValue( (long)nNewFactor ); 93 aUserEdit.GrabFocus(); 94 } 95 } 96 else 97 { 98 aUserEdit.SetValue( (long)nNewFactor ); 99 100 if ( ZOOMBTN_OPTIMAL == nBtnId ) 101 { 102 aOptimalBtn.Check(); 103 aOptimalBtn.GrabFocus(); 104 } 105 else if ( ZOOMBTN_PAGEWIDTH == nBtnId ) 106 { 107 aPageWidthBtn.Check(); 108 aPageWidthBtn.GrabFocus(); 109 } 110 else if ( ZOOMBTN_WHOLEPAGE == nBtnId ) 111 { 112 aWholePageBtn.Check(); 113 aWholePageBtn.GrabFocus(); 114 } 115 } 116 } 117 118 // ----------------------------------------------------------------------- 119 120 void SvxZoomDialog::HideButton( sal_uInt16 nBtnId ) 121 { 122 switch ( nBtnId ) 123 { 124 case ZOOMBTN_OPTIMAL: // Optimal-Button 125 aOptimalBtn.Hide(); 126 break; 127 128 case ZOOMBTN_PAGEWIDTH: // Seitenbreite-Button 129 aPageWidthBtn.Hide(); 130 break; 131 132 case ZOOMBTN_WHOLEPAGE: // Ganze Seite-Button 133 aWholePageBtn.Hide(); 134 break; 135 136 default: 137 DBG_ERROR( "Falsche Button-Nummer!!!" ); 138 } 139 } 140 141 // ----------------------------------------------------------------------- 142 143 void SvxZoomDialog::SetLimits( sal_uInt16 nMin, sal_uInt16 nMax ) 144 { 145 DBG_ASSERT( nMin < nMax, "invalid limits" ); 146 aUserEdit.SetMin( nMin ); 147 aUserEdit.SetFirst( nMin ); 148 aUserEdit.SetMax( nMax ); 149 aUserEdit.SetLast( nMax ); 150 } 151 152 // ----------------------------------------------------------------------- 153 154 SvxZoomDialog::SvxZoomDialog( Window* pParent, const SfxItemSet& rCoreSet ) : 155 156 SfxModalDialog( pParent, CUI_RES( RID_SVXDLG_ZOOM ) ), 157 158 aZoomFl ( this, CUI_RES( FL_ZOOM ) ), 159 aOptimalBtn ( this, CUI_RES( BTN_OPTIMAL ) ), 160 aWholePageBtn ( this, CUI_RES( BTN_WHOLE_PAGE ) ), 161 aPageWidthBtn ( this, CUI_RES( BTN_PAGE_WIDTH ) ), 162 a100Btn ( this, CUI_RES( BTN_100 ) ), 163 aUserBtn ( this, CUI_RES( BTN_USER ) ), 164 aUserEdit ( this, CUI_RES( ED_USER ) ), 165 166 aViewLayoutFl ( this, CUI_RES( FL_VIEWLAYOUT ) ), 167 aAutomaticBtn ( this, CUI_RES( BTN_AUTOMATIC ) ), 168 aSingleBtn ( this, CUI_RES( BTN_SINGLE ) ), 169 aColumnsBtn ( this, CUI_RES( BTN_COLUMNS ) ), 170 aColumnsEdit ( this, CUI_RES( ED_COLUMNS ) ), 171 aBookModeChk ( this, CUI_RES( CHK_BOOK ) ), 172 173 aBottomFl ( this, CUI_RES( FL_BOTTOM ) ), 174 aOKBtn ( this, CUI_RES( BTN_ZOOM_OK ) ), 175 aCancelBtn ( this, CUI_RES( BTN_ZOOM_CANCEL ) ), 176 aHelpBtn ( this, CUI_RES( BTN_ZOOM_HELP ) ), 177 178 rSet ( rCoreSet ), 179 pOutSet ( NULL ), 180 bModified ( sal_False ) 181 182 { 183 #if ENABLE_LAYOUT 184 SetHelpId (".uno:Zoom"); 185 #endif /* ENABLE_LAYOUT */ 186 Link aLink = LINK( this, SvxZoomDialog, UserHdl ); 187 a100Btn.SetClickHdl( aLink ); 188 aOptimalBtn.SetClickHdl( aLink ); 189 aPageWidthBtn.SetClickHdl( aLink ); 190 aWholePageBtn.SetClickHdl( aLink ); 191 aUserBtn.SetClickHdl( aLink ); 192 193 Link aViewLayoutLink = LINK( this, SvxZoomDialog, ViewLayoutUserHdl ); 194 aAutomaticBtn.SetClickHdl( aViewLayoutLink ); 195 aSingleBtn.SetClickHdl( aViewLayoutLink ); 196 aColumnsBtn.SetClickHdl( aViewLayoutLink ); 197 198 Link aViewLayoutSpinLink = LINK( this, SvxZoomDialog, ViewLayoutSpinHdl ); 199 aColumnsEdit.SetModifyHdl( aViewLayoutSpinLink ); 200 201 Link aViewLayoutCheckLink = LINK( this, SvxZoomDialog, ViewLayoutCheckHdl ); 202 aBookModeChk.SetClickHdl( aViewLayoutCheckLink ); 203 204 aOKBtn.SetClickHdl( LINK( this, SvxZoomDialog, OKHdl ) ); 205 aUserEdit.SetModifyHdl( LINK( this, SvxZoomDialog, SpinHdl ) ); 206 207 // Default-Werte 208 sal_uInt16 nValue = 100; 209 sal_uInt16 nMin = 10; 210 sal_uInt16 nMax = 1000; 211 212 // ggf. erst den alten Wert besorgen 213 const SfxUInt16Item* pOldUserItem = 0; 214 SfxObjectShell* pSh = SfxObjectShell::Current(); 215 216 if ( pSh ) 217 pOldUserItem = (const SfxUInt16Item*)pSh->GetItem( SID_ATTR_ZOOM_USER ); 218 219 if ( pOldUserItem ) 220 nValue = pOldUserItem->GetValue(); 221 222 // UserEdit initialisieren 223 if ( nMin > nValue ) 224 nMin = nValue; 225 if ( nMax < nValue ) 226 nMax = nValue; 227 aUserEdit.SetMin( nMin ); 228 aUserEdit.SetFirst( nMin ); 229 aUserEdit.SetMax( nMax ); 230 aUserEdit.SetLast( nMax ); 231 aUserEdit.SetValue( nValue ); 232 233 aUserEdit.SetAccessibleRelationLabeledBy( &aUserBtn ); 234 aUserEdit.SetAccessibleName(aUserBtn.GetText()); 235 aColumnsEdit.SetAccessibleRelationLabeledBy(&aColumnsBtn); 236 aColumnsEdit.SetAccessibleName(aColumnsBtn.GetText()); 237 aColumnsEdit.SetAccessibleRelationMemberOf(&aColumnsBtn); 238 aBookModeChk.SetAccessibleRelationLabeledBy(&aColumnsBtn); 239 aBookModeChk.SetAccessibleRelationMemberOf(&aColumnsBtn); 240 241 const SfxPoolItem& rItem = rSet.Get( rSet.GetPool()->GetWhich( SID_ATTR_ZOOM ) ); 242 243 if ( rItem.ISA(SvxZoomItem) ) 244 { 245 const SvxZoomItem& rZoomItem = (const SvxZoomItem&)rItem; 246 const sal_uInt16 nZoom = rZoomItem.GetValue(); 247 const SvxZoomType eType = rZoomItem.GetType(); 248 const sal_uInt16 nValSet = rZoomItem.GetValueSet(); 249 sal_uInt16 nBtnId = 0; 250 251 switch ( eType ) 252 { 253 case SVX_ZOOM_OPTIMAL: 254 nBtnId = ZOOMBTN_OPTIMAL; 255 break; 256 case SVX_ZOOM_PAGEWIDTH: 257 nBtnId = ZOOMBTN_PAGEWIDTH; 258 break; 259 case SVX_ZOOM_WHOLEPAGE: 260 nBtnId = ZOOMBTN_WHOLEPAGE; 261 break; 262 case SVX_ZOOM_PERCENT: 263 break; 264 case SVX_ZOOM_PAGEWIDTH_NOBORDER: 265 break; 266 } 267 268 if ( !(SVX_ZOOM_ENABLE_100 & nValSet) ) 269 a100Btn.Disable(); 270 if ( !(SVX_ZOOM_ENABLE_OPTIMAL & nValSet) ) 271 aOptimalBtn.Disable(); 272 if ( !(SVX_ZOOM_ENABLE_PAGEWIDTH & nValSet) ) 273 aPageWidthBtn.Disable(); 274 if ( !(SVX_ZOOM_ENABLE_WHOLEPAGE & nValSet) ) 275 aWholePageBtn.Disable(); 276 SetFactor( nZoom, nBtnId ); 277 } 278 else 279 { 280 const sal_uInt16 nZoom = ( (const SfxUInt16Item&)rItem ).GetValue(); 281 SetFactor( nZoom ); 282 } 283 284 const SfxPoolItem* pViewLayoutItem = 0; 285 if ( SFX_ITEM_SET == rSet.GetItemState( SID_ATTR_VIEWLAYOUT, sal_False, &pViewLayoutItem ) ) 286 { 287 const sal_uInt16 nColumns = static_cast<const SvxViewLayoutItem*>(pViewLayoutItem)->GetValue(); 288 const bool bBookMode = static_cast<const SvxViewLayoutItem*>(pViewLayoutItem)->IsBookMode(); 289 290 if ( 0 == nColumns ) 291 { 292 aAutomaticBtn.Check(); 293 aColumnsEdit.SetValue( 2 ); 294 aColumnsEdit.Disable(); 295 aBookModeChk.Disable(); 296 } 297 else if ( 1 == nColumns) 298 { 299 aSingleBtn.Check(); 300 aColumnsEdit.SetValue( 2 ); 301 aColumnsEdit.Disable(); 302 aBookModeChk.Disable(); 303 } 304 else 305 { 306 aColumnsBtn.Check(); 307 if ( !bBookMode ) 308 { 309 aColumnsEdit.SetValue( nColumns ); 310 if ( 0 != nColumns % 2 ) 311 aBookModeChk.Disable(); 312 } 313 else 314 { 315 aColumnsEdit.SetValue( nColumns ); 316 aBookModeChk.Check(); 317 } 318 } 319 } 320 else 321 { 322 // hide view layout related controls: 323 aViewLayoutFl.Disable(); 324 aAutomaticBtn.Disable(); 325 aSingleBtn.Disable(); 326 aColumnsBtn.Disable(); 327 aColumnsEdit.Disable(); 328 aBookModeChk.Disable(); 329 } 330 331 FreeResource(); 332 } 333 334 // ----------------------------------------------------------------------- 335 336 SvxZoomDialog::~SvxZoomDialog() 337 { 338 delete pOutSet; 339 pOutSet = 0; 340 } 341 342 // ----------------------------------------------------------------------- 343 344 IMPL_LINK( SvxZoomDialog, UserHdl, RadioButton *, pBtn ) 345 { 346 bModified |= sal_True; 347 348 if ( pBtn == &aUserBtn ) 349 { 350 aUserEdit.Enable(); 351 aUserEdit.GrabFocus(); 352 } 353 else 354 aUserEdit.Disable(); 355 return 0; 356 } 357 358 // ----------------------------------------------------------------------- 359 360 IMPL_LINK( SvxZoomDialog, SpinHdl, MetricField *, EMPTYARG ) 361 { 362 if ( !aUserBtn.IsChecked() ) 363 return 0; 364 bModified |= sal_True; 365 return 0; 366 } 367 368 // ----------------------------------------------------------------------- 369 370 IMPL_LINK( SvxZoomDialog, ViewLayoutUserHdl, RadioButton *, pBtn ) 371 { 372 bModified |= sal_True; 373 374 if ( pBtn == &aAutomaticBtn ) 375 { 376 aColumnsEdit.Disable(); 377 aBookModeChk.Disable(); 378 } 379 else if ( pBtn == &aSingleBtn ) 380 { 381 aColumnsEdit.Disable(); 382 aBookModeChk.Disable(); 383 } 384 else if ( pBtn == &aColumnsBtn ) 385 { 386 aColumnsEdit.Enable(); 387 aColumnsEdit.GrabFocus(); 388 if ( 0 == aColumnsEdit.GetValue() % 2 ) 389 aBookModeChk.Enable(); 390 } 391 else 392 { 393 DBG_ERROR( "Wrong Button" ); 394 return 0; 395 } 396 397 return 0; 398 } 399 400 // ----------------------------------------------------------------------- 401 402 IMPL_LINK( SvxZoomDialog, ViewLayoutSpinHdl, MetricField *, pEdt ) 403 { 404 if ( pEdt == &aColumnsEdit && !aColumnsBtn.IsChecked() ) 405 return 0; 406 407 if ( 0 == aColumnsEdit.GetValue() % 2 ) 408 aBookModeChk.Enable(); 409 else 410 { 411 aBookModeChk.Check( sal_False ); 412 aBookModeChk.Disable(); 413 } 414 415 bModified |= sal_True; 416 417 return 0; 418 } 419 420 // ----------------------------------------------------------------------- 421 422 IMPL_LINK( SvxZoomDialog, ViewLayoutCheckHdl, CheckBox *, pChk ) 423 { 424 if ( pChk == &aBookModeChk && !aColumnsBtn.IsChecked() ) 425 return 0; 426 427 bModified |= sal_True; 428 429 return 0; 430 } 431 432 // ----------------------------------------------------------------------- 433 434 IMPL_LINK( SvxZoomDialog, OKHdl, Button *, pBtn ) 435 { 436 if ( bModified || &aOKBtn != pBtn ) 437 { 438 SvxZoomItem aZoomItem( SVX_ZOOM_PERCENT, 0, rSet.GetPool()->GetWhich( SID_ATTR_ZOOM ) ); 439 SvxViewLayoutItem aViewLayoutItem( 0, false, rSet.GetPool()->GetWhich( SID_ATTR_VIEWLAYOUT ) ); 440 441 if ( &aOKBtn == pBtn ) 442 { 443 sal_uInt16 nFactor = GetFactor(); 444 445 if ( SPECIAL_FACTOR == nFactor ) 446 { 447 if ( aOptimalBtn.IsChecked() ) 448 aZoomItem.SetType( SVX_ZOOM_OPTIMAL ); 449 else if ( aPageWidthBtn.IsChecked() ) 450 aZoomItem.SetType( SVX_ZOOM_PAGEWIDTH ); 451 else if ( aWholePageBtn.IsChecked() ) 452 aZoomItem.SetType( SVX_ZOOM_WHOLEPAGE ); 453 } 454 else 455 aZoomItem.SetValue( nFactor ); 456 457 if ( aAutomaticBtn.IsChecked() ) 458 { 459 aViewLayoutItem.SetValue( 0 ); 460 aViewLayoutItem.SetBookMode( false ); 461 } 462 if ( aSingleBtn.IsChecked() ) 463 { 464 aViewLayoutItem.SetValue( 1 ); 465 aViewLayoutItem.SetBookMode( false ); 466 } 467 else if ( aColumnsBtn.IsChecked() ) 468 { 469 aViewLayoutItem.SetValue( static_cast<sal_uInt16>(aColumnsEdit.GetValue()) ); 470 aViewLayoutItem.SetBookMode( aBookModeChk.IsChecked() ); 471 } 472 } 473 else 474 { 475 DBG_ERROR( "Wrong Button" ); 476 return 0; 477 } 478 pOutSet = new SfxItemSet( rSet ); 479 pOutSet->Put( aZoomItem ); 480 481 // don't set attribute in case the whole viewlayout stuff is disabled: 482 if ( aViewLayoutFl.IsEnabled() ) 483 pOutSet->Put( aViewLayoutItem ); 484 485 // Wert aus dem UserEdit "uber den Dialog hinaus merken 486 SfxObjectShell* pSh = SfxObjectShell::Current(); 487 488 if ( pSh ) 489 pSh->PutItem( SfxUInt16Item( SID_ATTR_ZOOM_USER, 490 (sal_uInt16)aUserEdit.GetValue() ) ); 491 EndDialog( RET_OK ); 492 } 493 else 494 EndDialog( RET_CANCEL ); 495 return 0; 496 } 497 498 499