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