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