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_sc.hxx" 26 27 28 29 // INCLUDE --------------------------------------------------------------- 30 31 #include "scitems.hxx" 32 #include <editeng/eeitem.hxx> 33 34 #include <sfx2/app.hxx> 35 #include <editeng/sizeitem.hxx> 36 #include <svl/srchitem.hxx> 37 #include <svx/zoomslideritem.hxx> 38 #include <svx/svdview.hxx> 39 //CHINA001 #include <svx/zoom.hxx> 40 #include <sfx2/dispatch.hxx> 41 #include <sfx2/objface.hxx> 42 #include <sfx2/request.hxx> 43 #include <svl/stritem.hxx> 44 #include <svl/whiter.hxx> 45 #include <vcl/msgbox.hxx> 46 #include <vcl/help.hxx> 47 #include <tools/urlobj.hxx> 48 #include <sfx2/docfile.hxx> 49 #include <sfx2/printer.hxx> 50 51 #ifndef _SVX_ZOOMSLIDERITEM_HXX 52 #include <svx/zoomslideritem.hxx> 53 #endif 54 #include "prevwsh.hxx" 55 #include "preview.hxx" 56 #include "printfun.hxx" 57 #include "attrib.hxx" 58 #include "scmod.hxx" 59 #include "inputhdl.hxx" 60 #include "docsh.hxx" 61 #include "tabvwsh.hxx" 62 #include "stlpool.hxx" 63 #include "editutil.hxx" 64 #include "scresid.hxx" 65 #include "globstr.hrc" 66 #include "sc.hrc" 67 #include "ViewSettingsSequenceDefines.hxx" 68 #include "tpprint.hxx" 69 #include "printopt.hxx" 70 #include <xmloff/xmluconv.hxx> 71 #include <rtl/ustrbuf.hxx> 72 73 #include <svx/svxdlg.hxx> //CHINA001 74 #include <svx/dialogs.hrc> //CHINA001 75 76 #ifndef _SVX_ZOOM_HXX 77 #include <svx/zoom_def.hxx> 78 #endif 79 80 #include "sc.hrc" //CHINA001 81 #include "scabstdlg.hxx" //CHINA001 82 // fuer Rad-Maus 83 #define SC_DELTA_ZOOM 10 84 #define MINZOOM_SLIDER 10 85 #define MAXZOOM_SLIDER 400 86 87 #define SC_USERDATA_SEP ';' 88 89 using namespace com::sun::star; 90 91 // ----------------------------------------------------------------------- 92 93 #define ScPreviewShell 94 #include "scslots.hxx" 95 96 TYPEINIT1( ScPreviewShell, SfxViewShell ); 97 98 SFX_IMPL_INTERFACE( ScPreviewShell, SfxViewShell, ScResId(SCSTR_PREVIEWSHELL) ) 99 { 100 SFX_OBJECTBAR_REGISTRATION(SFX_OBJECTBAR_OBJECT|SFX_VISIBILITY_STANDARD| 101 SFX_VISIBILITY_SERVER|SFX_VISIBILITY_READONLYDOC, 102 ScResId(RID_OBJECTBAR_PREVIEW)); 103 SFX_POPUPMENU_REGISTRATION(ScResId(RID_POPUP_PREVIEW)); 104 } 105 106 SFX_IMPL_NAMED_VIEWFACTORY( ScPreviewShell, "PrintPreview" ) 107 { 108 SFX_VIEW_REGISTRATION(ScDocShell); 109 } 110 111 //------------------------------------------------------------------ 112 113 void ScPreviewShell::Construct( Window* pParent ) 114 { 115 eZoom = SVX_ZOOM_WHOLEPAGE; 116 117 pCorner = new ScrollBarBox( pParent, WB_SIZEABLE ); 118 119 pHorScroll = new ScrollBar(pParent, WB_HSCROLL ); 120 pVerScroll = new ScrollBar(pParent, WB_VSCROLL); 121 122 // SSA: --- RTL --- no mirroring for horizontal scrollbars 123 pHorScroll->EnableRTL( sal_False ); 124 125 pHorScroll->SetEndScrollHdl( LINK( this, ScPreviewShell, ScrollHandler ) ); 126 pVerScroll->SetEndScrollHdl( LINK( this, ScPreviewShell, ScrollHandler ) ); 127 128 pPreview = new ScPreview( pParent, pDocShell, this ); 129 130 SetPool( &SC_MOD()->GetPool() ); 131 SetWindow( pPreview ); 132 StartListening(*pDocShell,sal_True); 133 StartListening(*SFX_APP(),sal_True); // #i62045# #i62046# application is needed for Calc's own hints 134 SfxBroadcaster* pDrawBC = pDocShell->GetDocument()->GetDrawBroadcaster(); 135 if (pDrawBC) 136 StartListening(*pDrawBC); 137 138 pHorScroll->Show(); 139 pVerScroll->Show(); 140 pCorner->Show(); 141 SetHelpId( HID_SCSHELL_PREVWSH ); 142 SetName(String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("Preview"))); 143 } 144 145 ScPreviewShell::ScPreviewShell( SfxViewFrame* pViewFrame, 146 SfxViewShell* pOldSh ) : 147 SfxViewShell( pViewFrame, SFX_VIEW_CAN_PRINT | SFX_VIEW_HAS_PRINTOPTIONS ), 148 pDocShell( (ScDocShell*)pViewFrame->GetObjectShell() ), 149 nSourceDesignMode( SC_FORCEMODE_NONE ), 150 pAccessibilityBroadcaster( NULL ) 151 { 152 Construct( &pViewFrame->GetWindow() ); 153 154 if ( pOldSh && pOldSh->ISA( ScTabViewShell ) ) 155 { 156 // store view settings, show table from TabView 157 //! store live ScViewData instead, and update on ScTablesHint? 158 //! or completely forget aSourceData on ScTablesHint? 159 160 ScTabViewShell* pTabViewShell = ((ScTabViewShell*)pOldSh); 161 ScViewData* pData = pTabViewShell->GetViewData(); 162 pData->WriteUserDataSequence( aSourceData ); 163 InitStartTable( pData->GetTabNo() ); 164 165 // #106334# also have to store the TabView's DesignMode state 166 // (only if draw view exists) 167 SdrView* pDrawView = pTabViewShell->GetSdrView(); 168 if ( pDrawView ) 169 nSourceDesignMode = pDrawView->IsDesignMode(); 170 } 171 } 172 173 __EXPORT ScPreviewShell::~ScPreviewShell() 174 { 175 // #108333#; notify Accessibility that Shell is dying and before destroy all 176 BroadcastAccessibility( SfxSimpleHint( SFX_HINT_DYING ) ); 177 DELETEZ(pAccessibilityBroadcaster); 178 179 SfxBroadcaster* pDrawBC = pDocShell->GetDocument()->GetDrawBroadcaster(); 180 if (pDrawBC) 181 EndListening(*pDrawBC); 182 EndListening(*SFX_APP()); 183 EndListening(*pDocShell); 184 185 SetWindow(0); 186 delete pPreview; 187 delete pHorScroll; 188 delete pVerScroll; 189 delete pCorner; 190 191 // #97612# normal mode of operation is switching back to default view in the same frame, 192 // so there's no need to activate any other window here anymore 193 } 194 195 void ScPreviewShell::InitStartTable(SCTAB nTab) 196 { 197 pPreview->SetPageNo( pPreview->GetFirstPage(nTab) ); 198 } 199 200 //------------------------------------------------------------------ 201 202 String __EXPORT ScPreviewShell::GetDescription() const 203 { 204 return String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM(" ** Test ** ")); 205 } 206 207 Size __EXPORT ScPreviewShell::GetOptimalSizePixel() const 208 { 209 Size aOptSize(100,100); 210 211 ScTabViewShell* pViewSh = pDocShell->GetBestViewShell(); 212 213 if ( pViewSh ) 214 { 215 ScViewData* pViewData = pViewSh->GetViewData(); 216 SCTAB nCurTab = pViewData->GetTabNo(); 217 ScDocument* pDoc = pDocShell->GetDocument(); 218 ScStyleSheetPool* pStylePool = pDoc->GetStyleSheetPool(); 219 SfxStyleSheetBase* pStyleSheet = pStylePool->Find( 220 pDoc->GetPageStyle( nCurTab ), 221 SFX_STYLE_FAMILY_PAGE ); 222 223 DBG_ASSERT( pStyleSheet, "PageStyle not found :-/" ); 224 225 if ( pStyleSheet ) 226 { 227 const SfxItemSet& rSet = pStyleSheet->GetItemSet(); 228 const SvxSizeItem& rItem = (const SvxSizeItem&)rSet.Get( ATTR_PAGE_SIZE ); 229 const Size& rPageSize = rItem.GetSize(); 230 231 aOptSize.Width() = (long) (rPageSize.Width() * pViewData->GetPPTX()); 232 aOptSize.Height() = (long) (rPageSize.Height() * pViewData->GetPPTY()); 233 } 234 } 235 else 236 { 237 DBG_ERROR( "TabViewShell not found :-/" ); 238 } 239 240 return aOptSize; 241 } 242 243 void __EXPORT ScPreviewShell::AdjustPosSizePixel( const Point &rPos, const Size &rSize ) 244 { 245 long nBarW = GetViewFrame()->GetWindow().GetSettings().GetStyleSettings().GetScrollBarSize(); 246 long nBarH = nBarW; 247 // long nBarW = pVerScroll->GetSizePixel().Width(); 248 // long nBarH = pHorScroll->GetSizePixel().Height(); 249 250 Size aOutSize( rSize.Width()-nBarW, rSize.Height()-nBarH ); 251 pPreview->SetPosSizePixel( rPos, aOutSize ); 252 pHorScroll->SetPosSizePixel( Point( rPos.X(), rPos.Y() + aOutSize.Height() ), 253 Size( aOutSize.Width(), nBarH ) ); 254 pVerScroll->SetPosSizePixel( Point( rPos.X() + aOutSize.Width(), rPos.Y() ), 255 Size( nBarW, aOutSize.Height() ) ); 256 pCorner->SetPosSizePixel( Point( rPos.X() + aOutSize.Width(), rPos.Y() + aOutSize.Height() ), 257 Size( nBarW, nBarH ) ); 258 259 if ( SVX_ZOOM_WHOLEPAGE == eZoom ) 260 pPreview->SetZoom( pPreview->GetOptimalZoom(sal_False) ); 261 else if ( SVX_ZOOM_PAGEWIDTH == eZoom ) 262 pPreview->SetZoom( pPreview->GetOptimalZoom(sal_True) ); 263 264 UpdateScrollBars(); 265 } 266 267 void __EXPORT ScPreviewShell::InnerResizePixel( const Point &rOfs, const Size &rSize ) 268 { 269 AdjustPosSizePixel( rOfs,rSize ); 270 } 271 272 void __EXPORT ScPreviewShell::OuterResizePixel( const Point &rOfs, const Size &rSize ) 273 { 274 AdjustPosSizePixel( rOfs,rSize ); 275 } 276 277 void ScPreviewShell::UpdateScrollBars() 278 { 279 ScDocument* pDoc = pDocShell->GetDocument(); 280 SCTAB nTab = pPreview->GetTab(); 281 282 ScStyleSheetPool* pStylePool = pDoc->GetStyleSheetPool(); 283 SfxStyleSheetBase* pStyleSheet = pStylePool->Find( pDoc->GetPageStyle( nTab ), 284 SFX_STYLE_FAMILY_PAGE ); 285 DBG_ASSERT(pStyleSheet,"StyleSheet nicht gefunden"); 286 if (!pStyleSheet) return; 287 const SfxItemSet* pParamSet = &pStyleSheet->GetItemSet(); 288 289 Size aPageSize = ((const SvxSizeItem&) pParamSet->Get(ATTR_PAGE_SIZE)).GetSize(); 290 aPageSize.Width() = (long) (aPageSize.Width() * HMM_PER_TWIPS ); 291 aPageSize.Height() = (long) (aPageSize.Height() * HMM_PER_TWIPS ); 292 293 // for centering, page size without the shadow is used 294 295 Size aWindowSize = pPreview->GetOutputSize(); 296 297 Point aOfs = pPreview->GetOffset(); 298 long nMaxPos; 299 300 if( pHorScroll ) 301 { 302 pHorScroll->SetRange( Range( 0, aPageSize.Width() ) ); 303 pHorScroll->SetLineSize( aWindowSize.Width() / 16 ); 304 pHorScroll->SetPageSize( aWindowSize.Width() ); 305 pHorScroll->SetVisibleSize( aWindowSize.Width() ); 306 nMaxPos = aPageSize.Width() - aWindowSize.Width(); 307 if ( nMaxPos<0 ) 308 { 309 // page smaller than window -> center (but put scrollbar to 0) 310 aOfs.X() = 0; 311 pPreview->SetXOffset( nMaxPos / 2 ); 312 } 313 else if (aOfs.X() < 0) 314 { 315 // page larger than window -> never use negative offset 316 aOfs.X() = 0; 317 pPreview->SetXOffset( 0 ); 318 } 319 else if (aOfs.X() > nMaxPos) 320 { 321 // limit offset to align with right edge of window 322 aOfs.X() = nMaxPos; 323 pPreview->SetXOffset(nMaxPos); 324 } 325 pHorScroll->SetThumbPos( aOfs.X() ); 326 } 327 328 if( pVerScroll ) 329 { 330 long nPageNo = pPreview->GetPageNo(); 331 long nTotalPages = pPreview->GetTotalPages(); 332 333 nMaxVertPos = aPageSize.Height() - aWindowSize.Height(); 334 pVerScroll->SetLineSize( aWindowSize.Height() / 16 ); 335 pVerScroll->SetPageSize( aWindowSize.Height() ); 336 pVerScroll->SetVisibleSize( aWindowSize.Height() ); 337 if ( nMaxVertPos < 0 ) 338 { 339 // page smaller than window -> center (but put scrollbar to 0) 340 aOfs.Y() = 0; 341 pPreview->SetYOffset( nMaxVertPos / 2 ); 342 pVerScroll->SetThumbPos( nPageNo * aWindowSize.Height() ); 343 pVerScroll->SetRange( Range( 0, aWindowSize.Height() * nTotalPages )); 344 } 345 else if (aOfs.Y() < 0) 346 { 347 // page larger than window -> never use negative offset 348 pVerScroll->SetRange( Range( 0, aPageSize.Height() ) ); 349 aOfs.Y() = 0; 350 pPreview->SetYOffset( 0 ); 351 pVerScroll->SetThumbPos( aOfs.Y() ); 352 } 353 else if (aOfs.Y() > nMaxVertPos ) 354 { 355 // limit offset to align with window bottom 356 pVerScroll->SetRange( Range( 0, aPageSize.Height() ) ); 357 aOfs.Y() = nMaxVertPos; 358 pPreview->SetYOffset( nMaxVertPos ); 359 pVerScroll->SetThumbPos( aOfs.Y() ); 360 } 361 } 362 } 363 364 IMPL_LINK (ScPreviewShell,ScrollHandler, ScrollBar* ,pScroll ) 365 { 366 long nPos = pScroll->GetThumbPos(); 367 long nDelta = pScroll->GetDelta(); 368 long nMaxRange = pScroll->GetRangeMax(); 369 long nTotalPages = pPreview->GetTotalPages(); 370 long nPageNo = 0; 371 long nPerPageLength = 0; 372 sal_Bool bIsDivide = sal_True; 373 374 if( nTotalPages ) 375 nPerPageLength = nMaxRange / nTotalPages; 376 377 if( nPerPageLength ) 378 { 379 nPageNo = nPos / nPerPageLength; 380 if( nPos % nPerPageLength ) 381 { 382 bIsDivide = sal_False; 383 nPageNo ++; 384 } 385 } 386 387 sal_Bool bHoriz = ( pScroll == pHorScroll ); 388 389 if( bHoriz ) 390 pPreview->SetXOffset( nPos ); 391 else 392 { 393 if( nMaxVertPos > 0 ) 394 pPreview->SetYOffset( nPos ); 395 else 396 { 397 Point aMousePos = pScroll->OutputToNormalizedScreenPixel( pScroll->GetPointerPosPixel() ); 398 Point aPos = pScroll->GetParent()->OutputToNormalizedScreenPixel( pScroll->GetPosPixel() ); 399 String aHelpStr; 400 Rectangle aRect; 401 sal_uInt16 nAlign; 402 403 if( nDelta < 0 ) 404 { 405 if ( nTotalPages && nPageNo > 0 && !bIsDivide ) 406 pPreview->SetPageNo( nPageNo-1 ); 407 if( bIsDivide ) 408 pPreview->SetPageNo( nPageNo ); 409 410 aHelpStr = ScGlobal::GetRscString( STR_PAGE ); 411 aHelpStr += ' '; 412 aHelpStr += String::CreateFromInt32( nPageNo ); 413 414 aHelpStr.AppendAscii(RTL_CONSTASCII_STRINGPARAM( " / " )); 415 aHelpStr += String::CreateFromInt32( nTotalPages ); 416 } 417 else if( nDelta > 0 ) 418 { 419 sal_Bool bAllTested = pPreview->AllTested(); 420 if ( nTotalPages && ( nPageNo < nTotalPages || !bAllTested ) ) 421 pPreview->SetPageNo( nPageNo ); 422 423 aHelpStr = ScGlobal::GetRscString( STR_PAGE ); 424 aHelpStr += ' '; 425 aHelpStr += String::CreateFromInt32( nPageNo+1 ); 426 427 aHelpStr.AppendAscii(RTL_CONSTASCII_STRINGPARAM( " / " )); 428 aHelpStr += String::CreateFromInt32( nTotalPages ); 429 } 430 431 aRect.Left() = aPos.X() - 8; 432 aRect.Top() = aMousePos.Y(); 433 aRect.Right() = aRect.Left(); 434 aRect.Top() = aRect.Top(); 435 nAlign = QUICKHELP_BOTTOM|QUICKHELP_CENTER; 436 Help::ShowQuickHelp( pScroll->GetParent(), aRect, aHelpStr, nAlign ); 437 } 438 } 439 440 return 0; 441 } 442 443 sal_Bool ScPreviewShell::ScrollCommand( const CommandEvent& rCEvt ) 444 { 445 sal_Bool bDone = sal_False; 446 const CommandWheelData* pData = rCEvt.GetWheelData(); 447 if ( pData && pData->GetMode() == COMMAND_WHEEL_ZOOM ) 448 { 449 long nOld = pPreview->GetZoom(); 450 long nNew = nOld; 451 if ( pData->GetDelta() < 0 ) 452 nNew = Max( (long) MINZOOM, (long)( nOld - SC_DELTA_ZOOM ) ); 453 else 454 nNew = Min( (long) MAXZOOM, (long)( nOld + SC_DELTA_ZOOM ) ); 455 456 if ( nNew != nOld ) 457 { 458 eZoom = SVX_ZOOM_PERCENT; 459 pPreview->SetZoom( (sal_uInt16)nNew ); 460 } 461 462 bDone = sal_True; 463 } 464 else 465 { 466 bDone = pPreview->HandleScrollCommand( rCEvt, pHorScroll, pVerScroll ); 467 } 468 469 return bDone; 470 } 471 472 SfxPrinter* __EXPORT ScPreviewShell::GetPrinter( sal_Bool bCreate ) 473 { 474 return pDocShell->GetPrinter(bCreate); 475 } 476 477 sal_uInt16 __EXPORT ScPreviewShell::SetPrinter( SfxPrinter *pNewPrinter, sal_uInt16 nDiffFlags, bool ) 478 { 479 return pDocShell->SetPrinter( pNewPrinter, nDiffFlags ); 480 } 481 482 SfxTabPage* ScPreviewShell::CreatePrintOptionsPage( Window *pParent, const SfxItemSet &rOptions ) 483 { 484 ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create(); 485 DBG_ASSERT(pFact, "ScAbstractFactory create fail!");//CHINA001 486 //CHINA001 return ScTpPrintOptions::Create( pParent, rOptions ); 487 ::CreateTabPage ScTpPrintOptionsCreate = pFact->GetTabPageCreatorFunc( RID_SCPAGE_PRINT ); 488 if ( ScTpPrintOptionsCreate ) 489 return (*ScTpPrintOptionsCreate)( pParent, rOptions); 490 return 0; 491 } 492 493 //------------------------------------------------------------------------ 494 495 void __EXPORT ScPreviewShell::Activate(sal_Bool bMDI) 496 { 497 SfxViewShell::Activate(bMDI); 498 499 //! Basic etc. -> auslagern in eigene Datei (s. tabvwsh4) 500 501 if (bMDI) 502 { 503 // InputHdl ist jetzt meistens Null, keine Assertion mehr! 504 ScInputHandler* pInputHdl = SC_MOD()->GetInputHdl(); 505 if ( pInputHdl ) 506 pInputHdl->NotifyChange( NULL ); 507 } 508 } 509 510 void __EXPORT ScPreviewShell::Deactivate(sal_Bool bMDI) 511 { 512 SfxViewShell::Deactivate(bMDI); 513 514 if (bMDI) 515 { 516 } 517 } 518 519 //------------------------------------------------------------------------ 520 521 void __EXPORT ScPreviewShell::Execute( SfxRequest& rReq ) 522 { 523 sal_uInt16 nSlot = rReq.GetSlot(); 524 const SfxItemSet* pReqArgs = rReq.GetArgs(); 525 526 switch ( nSlot ) 527 { 528 case SID_FORMATPAGE: 529 case SID_STATUS_PAGESTYLE: 530 case SID_HFEDIT: 531 pDocShell->ExecutePageStyle( *this, rReq, pPreview->GetTab() ); 532 break; 533 case SID_REPAINT: 534 pPreview->Invalidate(); 535 rReq.Done(); 536 break; 537 case SID_PREV_TABLE: // Accelerator 538 case SID_PREVIEW_PREVIOUS: 539 { 540 long nPage = pPreview->GetPageNo(); 541 long nTotal = pPreview->GetTotalPages(); 542 if (nTotal && nPage > 0) 543 pPreview->SetPageNo( nPage-1 ); 544 } 545 break; 546 case SID_NEXT_TABLE: // Accelerator 547 case SID_PREVIEW_NEXT: 548 { 549 sal_Bool bAllTested = pPreview->AllTested(); 550 long nPage = pPreview->GetPageNo(); 551 long nTotal = pPreview->GetTotalPages(); 552 if (nTotal && (nPage+1 < nTotal || !bAllTested)) 553 pPreview->SetPageNo( nPage+1 ); 554 } 555 break; 556 case SID_CURSORTOPOFFILE: // Accelerator 557 case SID_PREVIEW_FIRST: 558 { 559 long nPage = pPreview->GetPageNo(); 560 long nTotal = pPreview->GetTotalPages(); 561 if (nTotal && nPage != 0) 562 pPreview->SetPageNo( 0 ); 563 } 564 break; 565 case SID_CURSORENDOFFILE: // Accelerator 566 case SID_PREVIEW_LAST: 567 { 568 if (!pPreview->AllTested()) 569 pPreview->CalcAll(); 570 571 long nPage = pPreview->GetPageNo(); 572 long nTotal = pPreview->GetTotalPages(); 573 if (nTotal && nPage+1 != nTotal) 574 pPreview->SetPageNo( nTotal-1 ); 575 } 576 break; 577 case SID_ATTR_ZOOM: 578 case FID_SCALE: 579 { 580 sal_uInt16 nZoom = 100; 581 sal_Bool bCancel = sal_False; 582 583 eZoom = SVX_ZOOM_PERCENT; 584 585 if ( pReqArgs ) 586 { 587 588 const SvxZoomItem& rZoomItem = (const SvxZoomItem&) 589 pReqArgs->Get(SID_ATTR_ZOOM); 590 591 eZoom = rZoomItem.GetType(); 592 nZoom = rZoomItem.GetValue(); 593 } 594 else 595 { 596 SfxItemSet aSet ( GetPool(), SID_ATTR_ZOOM, SID_ATTR_ZOOM ); 597 SvxZoomItem aZoomItem( SVX_ZOOM_PERCENT, pPreview->GetZoom(), SID_ATTR_ZOOM ); 598 599 aSet.Put( aZoomItem ); 600 //CHINA001 SvxZoomDialog* pDlg = pDlg = new SvxZoomDialog( NULL, aSet ); 601 SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); 602 if(pFact) 603 { 604 AbstractSvxZoomDialog* pDlg = pFact->CreateSvxZoomDialog(NULL, aSet); 605 DBG_ASSERT(pDlg, "Dialogdiet fail!");//CHINA001 606 pDlg->SetLimits( 20, 400 ); 607 pDlg->HideButton( ZOOMBTN_OPTIMAL ); 608 bCancel = ( RET_CANCEL == pDlg->Execute() ); 609 610 if ( !bCancel ) 611 { 612 const SvxZoomItem& rZoomItem = (const SvxZoomItem&) 613 pDlg->GetOutputItemSet()-> 614 Get( SID_ATTR_ZOOM ); 615 616 eZoom = rZoomItem.GetType(); 617 nZoom = rZoomItem.GetValue(); 618 } 619 620 delete pDlg; 621 } 622 } 623 624 if ( !bCancel ) 625 { 626 switch ( eZoom ) 627 { 628 case SVX_ZOOM_OPTIMAL: 629 case SVX_ZOOM_WHOLEPAGE: 630 nZoom = pPreview->GetOptimalZoom(sal_False); 631 break; 632 case SVX_ZOOM_PAGEWIDTH: 633 nZoom = pPreview->GetOptimalZoom(sal_True); 634 break; 635 default: 636 { 637 // added to avoid warnings 638 } 639 } 640 641 pPreview->SetZoom( nZoom ); 642 rReq.Done(); 643 } 644 } 645 break; 646 case SID_PREVIEW_ZOOMIN: 647 { 648 sal_uInt16 nNew = pPreview->GetZoom() + 20 ; 649 nNew -= nNew % 20; 650 pPreview->SetZoom( nNew ); 651 eZoom = SVX_ZOOM_PERCENT; 652 rReq.Done(); 653 } 654 break; 655 case SID_PREVIEW_ZOOMOUT: 656 { 657 sal_uInt16 nNew = pPreview->GetZoom() - 1; 658 nNew -= nNew % 20; 659 pPreview->SetZoom( nNew ); 660 eZoom = SVX_ZOOM_PERCENT; 661 rReq.Done(); 662 } 663 break; 664 case SID_PREVIEW_MARGIN: 665 { 666 sal_Bool bMargin = pPreview->GetPageMargins(); 667 pPreview->SetPageMargins( !bMargin ); 668 pPreview->Invalidate(); 669 rReq.Done(); 670 } 671 break; 672 case SID_ATTR_ZOOMSLIDER: 673 { 674 const SfxPoolItem* pItem; 675 eZoom = SVX_ZOOM_PERCENT; 676 if( pReqArgs && SFX_ITEM_SET == pReqArgs->GetItemState( SID_ATTR_ZOOMSLIDER, sal_True, &pItem ) ) 677 { 678 const sal_uInt16 nCurrentZoom = ((const SvxZoomSliderItem*)pItem)->GetValue(); 679 if( nCurrentZoom ) 680 { 681 pPreview->SetZoom( nCurrentZoom ); 682 rReq.Done(); 683 } 684 } 685 } 686 break; 687 case SID_PREVIEW_SCALINGFACTOR: 688 { 689 const SfxPoolItem* pItem; 690 SCTAB nTab = pPreview->GetTab(); 691 String aOldName = pDocShell->GetDocument()->GetPageStyle( pPreview->GetTab() ); 692 ScStyleSheetPool* pStylePool = pDocShell->GetDocument()->GetStyleSheetPool(); 693 SfxStyleSheetBase* pStyleSheet = pStylePool->Find( aOldName, SFX_STYLE_FAMILY_PAGE ); 694 DBG_ASSERT( pStyleSheet, "PageStyle not found! :-/" ); 695 696 if ( pReqArgs && pStyleSheet && SFX_ITEM_SET == pReqArgs->GetItemState( SID_PREVIEW_SCALINGFACTOR, sal_True, &pItem ) ) 697 { 698 const sal_uInt16 nCurrentZoom = ((const SvxZoomSliderItem *)pItem)->GetValue(); 699 SfxItemSet& rSet = pStyleSheet->GetItemSet(); 700 rSet.Put( SfxUInt16Item( ATTR_PAGE_SCALE, nCurrentZoom ) ); 701 ScPrintFunc aPrintFunc( pDocShell, pDocShell->GetPrinter(), nTab ); 702 aPrintFunc.UpdatePages(); 703 rReq.Done(); 704 } 705 GetViewFrame()->GetBindings().Invalidate( nSlot ); 706 } 707 break; 708 case SID_PRINTPREVIEW: 709 case SID_PREVIEW_CLOSE: 710 // print preview is now always in the same frame as the tab view 711 // -> always switch this frame back to normal view 712 // (ScTabViewShell ctor reads stored view data) 713 714 GetViewFrame()->GetDispatcher()->Execute( SID_VIEWSHELL0, SFX_CALLMODE_ASYNCHRON ); 715 break; 716 case SID_CURSORPAGEUP: 717 case SID_CURSORPAGEDOWN: 718 case SID_CURSORHOME: 719 case SID_CURSOREND: 720 case SID_CURSORUP: 721 case SID_CURSORDOWN: 722 case SID_CURSORLEFT: 723 case SID_CURSORRIGHT: 724 DoScroll( nSlot ); 725 break; 726 case SID_CANCEL: 727 if( ScViewUtil::IsFullScreen( *this ) ) 728 ScViewUtil::SetFullScreen( *this, false ); 729 break; 730 731 default: 732 break; 733 } 734 } 735 736 void __EXPORT ScPreviewShell::GetState( SfxItemSet& rSet ) 737 { 738 pPreview->SetInGetState(sal_True); 739 740 SCTAB nTab = pPreview->GetTab(); 741 long nPage = pPreview->GetPageNo(); 742 long nTotal = pPreview->GetTotalPages(); 743 sal_uInt16 nZoom = pPreview->GetZoom(); 744 sal_Bool bAllTested = pPreview->AllTested(); 745 746 SfxWhichIter aIter(rSet); 747 sal_uInt16 nWhich = aIter.FirstWhich(); 748 while ( nWhich ) 749 { 750 switch (nWhich) 751 { 752 case SID_STATUS_PAGESTYLE: 753 case SID_HFEDIT: 754 pDocShell->GetStatePageStyle( *this, rSet, nTab ); 755 break; 756 case SID_UNDO: 757 case SID_REDO: 758 case SID_REPEAT: 759 rSet.DisableItem(nWhich); 760 break; 761 case SID_PREVIEW_PREVIOUS: 762 case SID_PREVIEW_FIRST: 763 if (!nTotal || nPage==0) 764 rSet.DisableItem(nWhich); 765 break; 766 case SID_PREVIEW_NEXT: 767 case SID_PREVIEW_LAST: 768 if (bAllTested) 769 if (!nTotal || nPage==nTotal-1) 770 rSet.DisableItem(nWhich); 771 break; 772 case SID_PREVIEW_ZOOMIN: 773 if (nZoom >= 400) 774 rSet.DisableItem(nWhich); 775 break; 776 case SID_PREVIEW_ZOOMOUT: 777 if (nZoom <= 20) 778 rSet.DisableItem(nWhich); 779 break; 780 case SID_ATTR_ZOOM: 781 { 782 SvxZoomItem aZoom( eZoom, nZoom, nWhich ); 783 aZoom.SetValueSet( SVX_ZOOM_ENABLE_ALL & ~SVX_ZOOM_ENABLE_OPTIMAL ); 784 rSet.Put( aZoom ); 785 } 786 break; 787 case SID_ATTR_ZOOMSLIDER: 788 { 789 SvxZoomSliderItem aZoomSliderItem( nZoom, MINZOOM, MAXZOOM, SID_ATTR_ZOOMSLIDER ); 790 aZoomSliderItem.AddSnappingPoint( 100 ); 791 rSet.Put( aZoomSliderItem ); 792 } 793 break; 794 case SID_PREVIEW_SCALINGFACTOR: 795 { 796 if( pDocShell->IsReadOnly() ) 797 rSet.DisableItem( nWhich ); 798 else 799 { 800 String aOldName = pDocShell->GetDocument()->GetPageStyle( pPreview->GetTab() ); 801 ScStyleSheetPool* pStylePool = pDocShell->GetDocument()->GetStyleSheetPool(); 802 SfxStyleSheetBase* pStyleSheet = pStylePool->Find( aOldName, SFX_STYLE_FAMILY_PAGE ); 803 DBG_ASSERT( pStyleSheet, "PageStyle not found! :-/" ); 804 805 if ( pStyleSheet ) 806 { 807 SfxItemSet& rStyleSet = pStyleSheet->GetItemSet(); 808 sal_uInt16 nCurrentZoom = ((const SfxUInt16Item&)rStyleSet.Get(ATTR_PAGE_SCALE)).GetValue(); 809 if( nCurrentZoom ) 810 { 811 SvxZoomSliderItem aZoomSliderItem( nCurrentZoom, MINZOOM_SLIDER, MAXZOOM_SLIDER, SID_PREVIEW_SCALINGFACTOR ); 812 aZoomSliderItem.AddSnappingPoint( 100 ); 813 rSet.Put( aZoomSliderItem ); 814 } 815 else 816 rSet.DisableItem( nWhich ); 817 } 818 } 819 } 820 break; 821 case SID_STATUS_DOCPOS: 822 rSet.Put( SfxStringItem( nWhich, pPreview->GetPosString() ) ); 823 break; 824 case SID_PRINTPREVIEW: 825 rSet.Put( SfxBoolItem( nWhich, sal_True ) ); 826 break; 827 case SID_FORMATPAGE: 828 case SID_PREVIEW_MARGIN: 829 if( pDocShell->IsReadOnly() ) 830 rSet.DisableItem( nWhich ); 831 break; 832 } 833 834 nWhich = aIter.NextWhich(); 835 } 836 837 pPreview->SetInGetState(sal_False); 838 } 839 840 void ScPreviewShell::FillFieldData( ScHeaderFieldData& rData ) 841 { 842 ScDocument* pDoc = pDocShell->GetDocument(); 843 SCTAB nTab = pPreview->GetTab(); 844 pDoc->GetName( nTab, rData.aTabName ); 845 846 rData.aTitle = pDocShell->GetTitle(); 847 const INetURLObject& rURLObj = pDocShell->GetMedium()->GetURLObject(); 848 rData.aLongDocName = rURLObj.GetMainURL( INetURLObject::DECODE_UNAMBIGUOUS ); 849 if ( rData.aLongDocName.Len() ) 850 rData.aShortDocName = rURLObj.GetName( INetURLObject::DECODE_UNAMBIGUOUS ); 851 else 852 rData.aShortDocName = rData.aLongDocName = rData.aTitle; 853 rData.nPageNo = pPreview->GetPageNo() + 1; 854 855 sal_Bool bAllTested = pPreview->AllTested(); 856 if (bAllTested) 857 rData.nTotalPages = pPreview->GetTotalPages(); 858 else 859 rData.nTotalPages = 99; 860 861 // eNumType kennt der Dialog selber 862 } 863 864 void __EXPORT ScPreviewShell::WriteUserData(String& rData, sal_Bool /* bBrowse */) 865 { 866 // nZoom 867 // nPageNo 868 869 rData = String::CreateFromInt32(pPreview->GetZoom()); 870 rData += (sal_Unicode) SC_USERDATA_SEP; 871 rData += String::CreateFromInt32(pPreview->GetPageNo()); 872 } 873 874 void __EXPORT ScPreviewShell::ReadUserData(const String& rData, sal_Bool /* bBrowse */) 875 { 876 xub_StrLen nCount = rData.GetTokenCount(); 877 if (nCount) 878 { 879 xub_StrLen nIndex = 0; 880 pPreview->SetZoom((sal_uInt16)rData.GetToken( 0, SC_USERDATA_SEP, nIndex ).ToInt32()); 881 pPreview->SetPageNo(rData.GetToken( 0, SC_USERDATA_SEP, nIndex ).ToInt32()); 882 eZoom = SVX_ZOOM_PERCENT; 883 } 884 } 885 886 void __EXPORT ScPreviewShell::WriteUserDataSequence(uno::Sequence < beans::PropertyValue >& rSeq, sal_Bool /* bBrowse */) 887 { 888 rSeq.realloc(3); 889 beans::PropertyValue* pSeq = rSeq.getArray(); 890 if(pSeq) 891 { 892 sal_uInt16 nViewID(GetViewFrame()->GetCurViewId()); 893 pSeq[0].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_VIEWID)); 894 rtl::OUStringBuffer sBuffer(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_VIEW))); 895 SvXMLUnitConverter::convertNumber(sBuffer, static_cast<sal_Int32>(nViewID)); 896 pSeq[0].Value <<= sBuffer.makeStringAndClear(); 897 pSeq[1].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_ZOOMVALUE)); 898 pSeq[1].Value <<= sal_Int32 (pPreview->GetZoom()); 899 pSeq[2].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("PageNumber")); 900 pSeq[2].Value <<= pPreview->GetPageNo(); 901 } 902 } 903 904 void __EXPORT ScPreviewShell::ReadUserDataSequence(const uno::Sequence < beans::PropertyValue >& rSeq, sal_Bool /* bBrowse */) 905 { 906 sal_Int32 nCount(rSeq.getLength()); 907 if (nCount) 908 { 909 sal_Int32 nTemp = 0; 910 const beans::PropertyValue* pSeq = rSeq.getConstArray(); 911 if(pSeq) 912 { 913 for(sal_Int32 i = 0; i < nCount; i++, pSeq++) 914 { 915 rtl::OUString sName(pSeq->Name); 916 if(sName.compareToAscii(SC_ZOOMVALUE) == 0) 917 { 918 if (pSeq->Value >>= nTemp) 919 pPreview->SetZoom(sal_uInt16(nTemp)); 920 } 921 else if (sName.compareToAscii("PageNumber") == 0) 922 { 923 if (pSeq->Value >>= nTemp) 924 pPreview->SetPageNo(nTemp); 925 } 926 } 927 } 928 } 929 } 930 931 void ScPreviewShell::DoScroll( sal_uInt16 nMode ) 932 { 933 Point aCurPos, aPrevPos; 934 935 long nHRange = pHorScroll->GetRange().Max(); 936 long nHLine = pHorScroll->GetLineSize(); 937 long nHPage = pHorScroll->GetPageSize(); 938 long nVRange = pVerScroll->GetRange().Max(); 939 long nVLine = pVerScroll->GetLineSize(); 940 long nVPage = pVerScroll->GetPageSize(); 941 942 aCurPos.X() = pHorScroll->GetThumbPos(); 943 aCurPos.Y() = pVerScroll->GetThumbPos(); 944 aPrevPos = aCurPos; 945 946 long nThumbPos = pVerScroll->GetThumbPos(); 947 long nRangeMax = pVerScroll->GetRangeMax(); 948 949 switch( nMode ) 950 { 951 case SID_CURSORUP: 952 if( nMaxVertPos<0 ) 953 { 954 long nPage = pPreview->GetPageNo(); 955 956 if( nPage>0 ) 957 { 958 SfxViewFrame* pSfxViewFrame = GetViewFrame(); 959 SfxRequest aSfxRequest( pSfxViewFrame, SID_PREVIEW_PREVIOUS ); 960 Execute( aSfxRequest ); 961 } 962 } 963 else 964 aCurPos.Y() -= nVLine; 965 break; 966 case SID_CURSORDOWN: 967 if( nMaxVertPos<0 ) 968 { 969 long nPage = pPreview->GetPageNo(); 970 long nTotal = pPreview->GetTotalPages(); 971 972 // before testing for last page, make sure all page counts are calculated 973 if ( nPage+1 == nTotal && !pPreview->AllTested() ) 974 { 975 pPreview->CalcAll(); 976 nTotal = pPreview->GetTotalPages(); 977 } 978 979 if( nPage<nTotal-1 ) 980 { 981 SfxViewFrame* pSfxViewFrame = GetViewFrame(); 982 SfxRequest aSfxRequest( pSfxViewFrame, SID_PREVIEW_NEXT ); 983 Execute( aSfxRequest ); 984 } 985 } 986 else 987 aCurPos.Y() += nVLine; 988 break; 989 case SID_CURSORLEFT: 990 aCurPos.X() -= nHLine; 991 break; 992 case SID_CURSORRIGHT: 993 aCurPos.X() += nHLine; 994 break; 995 case SID_CURSORPAGEUP: 996 if( nThumbPos==0 || nMaxVertPos<0 ) 997 { 998 long nPage = pPreview->GetPageNo(); 999 1000 if( nPage>0 ) 1001 { 1002 SfxViewFrame* pSfxViewFrame = GetViewFrame(); 1003 SfxRequest aSfxRequest( pSfxViewFrame, SID_PREVIEW_PREVIOUS ); 1004 Execute( aSfxRequest ); 1005 aCurPos.Y() = nVRange; 1006 } 1007 } 1008 else 1009 aCurPos.Y() -= nVPage; 1010 break; 1011 case SID_CURSORPAGEDOWN: 1012 if( (abs(nVPage+nThumbPos-nRangeMax)<10) || nMaxVertPos<0 ) 1013 { 1014 long nPage = pPreview->GetPageNo(); 1015 long nTotal = pPreview->GetTotalPages(); 1016 1017 // before testing for last page, make sure all page counts are calculated 1018 if ( nPage+1 == nTotal && !pPreview->AllTested() ) 1019 { 1020 pPreview->CalcAll(); 1021 nTotal = pPreview->GetTotalPages(); 1022 } 1023 if( nPage<nTotal-1 ) 1024 { 1025 SfxViewFrame* pSfxViewFrame = GetViewFrame(); 1026 SfxRequest aSfxRequest( pSfxViewFrame, SID_PREVIEW_NEXT ); 1027 Execute( aSfxRequest ); 1028 aCurPos.Y() = 0; 1029 } 1030 } 1031 else 1032 aCurPos.Y() += nVPage; 1033 break; 1034 case SID_CURSORHOME: 1035 if( nMaxVertPos<0 ) 1036 { 1037 long nPage = pPreview->GetPageNo(); 1038 long nTotal = pPreview->GetTotalPages(); 1039 if( nTotal && nPage != 0 ) 1040 { 1041 SfxViewFrame* pSfxViewFrame = GetViewFrame(); 1042 SfxRequest aSfxRequest( pSfxViewFrame, SID_PREVIEW_FIRST ); 1043 Execute( aSfxRequest ); 1044 } 1045 } 1046 else 1047 { 1048 aCurPos.Y() = 0; 1049 aCurPos.X() = 0; 1050 } 1051 break; 1052 case SID_CURSOREND: 1053 if( nMaxVertPos<0 ) 1054 { 1055 if( !pPreview->AllTested() ) 1056 pPreview->CalcAll(); 1057 long nPage = pPreview->GetPageNo(); 1058 long nTotal = pPreview->GetTotalPages(); 1059 if( nTotal && nPage+1 != nTotal ) 1060 { 1061 SfxViewFrame* pSfxViewFrame = GetViewFrame(); 1062 SfxRequest aSfxRequest( pSfxViewFrame, SID_PREVIEW_LAST ); 1063 Execute( aSfxRequest ); 1064 } 1065 } 1066 else 1067 { 1068 aCurPos.Y() = nVRange; 1069 aCurPos.X() = nHRange; 1070 } 1071 break; 1072 } 1073 1074 // nHRange-nHPage kann negativ sein, deshalb Abfrage auf < 0 hinterher 1075 1076 if( aCurPos.Y() > (nVRange-nVPage) ) 1077 aCurPos.Y() = (nVRange-nVPage); 1078 if( aCurPos.Y() < 0 ) 1079 aCurPos.Y() = 0; 1080 if( aCurPos.X() > (nHRange-nHPage) ) 1081 aCurPos.X() = (nHRange-nHPage); 1082 if( aCurPos.X() < 0 ) 1083 aCurPos.X() = 0; 1084 1085 if( nMaxVertPos>=0 ) 1086 { 1087 if( aCurPos.Y() != aPrevPos.Y() ) 1088 { 1089 pVerScroll->SetThumbPos( aCurPos.Y() ); 1090 pPreview->SetYOffset( aCurPos.Y() ); 1091 } 1092 } 1093 1094 if( aCurPos.X() != aPrevPos.X() ) 1095 { 1096 pHorScroll->SetThumbPos( aCurPos.X() ); 1097 pPreview->SetXOffset( aCurPos.X() ); 1098 } 1099 1100 } 1101 1102 void ScPreviewShell::AddAccessibilityObject( SfxListener& rObject ) 1103 { 1104 if (!pAccessibilityBroadcaster) 1105 pAccessibilityBroadcaster = new SfxBroadcaster; 1106 1107 rObject.StartListening( *pAccessibilityBroadcaster ); 1108 } 1109 1110 void ScPreviewShell::RemoveAccessibilityObject( SfxListener& rObject ) 1111 { 1112 if (pAccessibilityBroadcaster) 1113 rObject.EndListening( *pAccessibilityBroadcaster ); 1114 else 1115 { 1116 DBG_ERROR("kein Accessibility-Broadcaster?"); 1117 } 1118 } 1119 1120 void ScPreviewShell::BroadcastAccessibility( const SfxHint &rHint ) 1121 { 1122 if (pAccessibilityBroadcaster) 1123 pAccessibilityBroadcaster->Broadcast( rHint ); 1124 } 1125 1126 sal_Bool ScPreviewShell::HasAccessibilityObjects() 1127 { 1128 return pAccessibilityBroadcaster && pAccessibilityBroadcaster->HasListeners(); 1129 } 1130 1131 const ScPreviewLocationData& ScPreviewShell::GetLocationData() 1132 { 1133 return pPreview->GetLocationData(); 1134 } 1135 1136 ScDocument* ScPreviewShell::GetDocument() 1137 { 1138 return pDocShell->GetDocument(); 1139 } 1140 1141 1142