xref: /AOO41X/main/sc/source/ui/view/prevwsh.cxx (revision 8809db7a87f97847b57a57f4cd2b0104b2b83182)
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