xref: /AOO41X/main/sc/source/ui/view/preview.cxx (revision a246698e06646cdcd859aaaf85b7563e41933c43)
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 #include <tools/pstm.hxx>
31 #include "scitems.hxx"
32 #include <editeng/eeitem.hxx>
33 
34 
35 #include <svtools/colorcfg.hxx>
36 #include <svx/fmview.hxx>
37 #include <editeng/sizeitem.hxx>
38 #include <svx/svdpagv.hxx>
39 #include <sfx2/bindings.hxx>
40 #include <sfx2/viewfrm.hxx>
41 #include <sfx2/dispatch.hxx>
42 #include <svtools/accessibilityoptions.hxx>
43 #include <svl/itemset.hxx>
44 #include <tools/multisel.hxx>
45 #include <vcl/waitobj.hxx>
46 #include <vcl/sound.hxx>
47 
48 #include "preview.hxx"
49 #include "prevwsh.hxx"
50 #include "prevloc.hxx"
51 #include "docsh.hxx"
52 #include "docfunc.hxx"
53 #include "printfun.hxx"
54 #include "printopt.hxx"
55 #include "stlpool.hxx"
56 #include "undostyl.hxx"
57 #include "drwlayer.hxx"
58 #include "scmod.hxx"
59 #include "globstr.hrc"
60 #include "sc.hrc"           // fuer ShellInvalidate
61 #include "AccessibleDocumentPagePreview.hxx"
62 #include <vcl/lineinfo.hxx>
63 #include <svx/algitem.hxx>
64 #include <editeng/lrspitem.hxx>
65 #include <editeng/ulspitem.hxx>
66 #include <editeng/sizeitem.hxx>
67 #include "attrib.hxx"
68 #include "pagepar.hxx"
69 #include <com/sun/star/accessibility/XAccessible.hpp>
70 #include "AccessibilityHints.hxx"
71 #include <vcl/svapp.hxx>
72 #include "viewutil.hxx"
73 
74 // STATIC DATA -----------------------------------------------------------
75 
76 //==================================================================
77 
78 //#define SC_PREVIEW_SHADOWSIZE 2
79 
lcl_GetDisplayStart(SCTAB nTab,ScDocument * pDoc,long * pPages)80 long lcl_GetDisplayStart( SCTAB nTab, ScDocument* pDoc, long* pPages )
81 {
82     long nDisplayStart = 0;
83     for (SCTAB i=0; i<nTab; i++)
84     {
85         if ( pDoc->NeedPageResetAfterTab(i) )
86             nDisplayStart = 0;
87         else
88             nDisplayStart += pPages[i];
89     }
90     return nDisplayStart;
91 }
92 
93 
ScPreview(Window * pParent,ScDocShell * pDocSh,ScPreviewShell * pViewSh)94 ScPreview::ScPreview( Window* pParent, ScDocShell* pDocSh, ScPreviewShell* pViewSh ) :
95     Window( pParent ),
96     nPageNo( 0 ),
97     nZoom( 100 ),
98     bValid( sal_False ),
99     nTabsTested( 0 ),
100     nTab( 0 ),
101     nTabStart( 0 ),
102     nDisplayStart( 0 ),
103     nTotalPages( 0 ),
104     bStateValid( sal_False ),
105     bLocationValid( sal_False ),
106     pLocationData( NULL ),
107     pDrawView( NULL ),
108     bInPaint( false ),
109     bInSetZoom( false ),
110     bInGetState( sal_False ),
111     pDocShell( pDocSh ),
112     pViewShell( pViewSh ),
113     bLeftRulerMove( sal_False ),
114     bRightRulerMove( sal_False ),
115     bTopRulerMove( sal_False ),
116     bBottomRulerMove( sal_False ),
117     bHeaderRulerMove( sal_False ),
118     bFooterRulerMove( sal_False ),
119     bLeftRulerChange( sal_False ),
120     bRightRulerChange( sal_False ),
121     bTopRulerChange( sal_False ),
122     bBottomRulerChange( sal_False ),
123     bHeaderRulerChange( sal_False ),
124     bFooterRulerChange( sal_False ),
125     bPageMargin ( sal_False ),
126     bColRulerMove( sal_False ),
127     mnScale( 0 ),
128     nColNumberButttonDown( 0 ),
129     nHeaderHeight ( 0 ),
130     nFooterHeight ( 0 )
131 {
132     SetOutDevViewType( OUTDEV_VIEWTYPE_PRINTPREVIEW ); //#106611#
133     SetBackground();
134 
135     SetHelpId( HID_SC_WIN_PREVIEW );
136     SetUniqueId( HID_SC_WIN_PREVIEW );
137 
138     SetDigitLanguage( SC_MOD()->GetOptDigitLanguage() );
139 
140     for (SCCOL i=0; i<=MAXCOL; i++)
141         nRight[i] = 0;                  // initialized with actual positions when markers are drawn
142 }
143 
144 
~ScPreview()145 __EXPORT ScPreview::~ScPreview()
146 {
147     delete pDrawView;
148     delete pLocationData;
149 }
150 
UpdateDrawView()151 void ScPreview::UpdateDrawView()        // nTab muss richtig sein
152 {
153     ScDocument* pDoc = pDocShell->GetDocument();
154     ScDrawLayer* pModel = pDoc->GetDrawLayer();     // ist nicht 0
155 
156     // #114135#
157     if ( pModel )
158     {
159         SdrPage* pPage = pModel->GetPage(nTab);
160         if ( pDrawView && ( !pDrawView->GetSdrPageView() || pDrawView->GetSdrPageView()->GetPage() != pPage ) )
161         {
162             //  die angezeigte Page der DrawView umzustellen (s.u.) funktioniert nicht ?!?
163             delete pDrawView;
164             pDrawView = NULL;
165         }
166 
167         if ( !pDrawView )                                   // neu anlegen?
168         {
169             pDrawView = new FmFormView( pModel, this );
170             // #55259# die DrawView uebernimmt den Design-Modus vom Model
171             // (Einstellung "Im Entwurfsmodus oeffnen"), darum hier zuruecksetzen
172             pDrawView->SetDesignMode( sal_True );
173             pDrawView->SetPrintPreview( sal_True );
174             pDrawView->ShowSdrPage(pPage);
175         }
176 #if 0
177         else if ( !pDrawView->GetSdrPageView())     // angezeigte Page umstellen
178         {
179             pDrawView->HideSdrPage();
180             pDrawView->ShowSdrPage(pDrawView->GetModel()->GetPage(nTab));
181         }
182 #endif
183     }
184     else if ( pDrawView )
185     {
186         delete pDrawView;           // fuer diese Tabelle nicht gebraucht
187         pDrawView = NULL;
188     }
189 }
190 
191 
TestLastPage()192 void ScPreview::TestLastPage()
193 {
194     if (nPageNo >= nTotalPages)
195     {
196         if (nTotalPages)
197         {
198             nPageNo = nTotalPages - 1;
199             nTab = nTabCount - 1;
200             while (nTab > 0 && !nPages[nTab])       // letzte nicht leere Tabelle
201                 --nTab;
202             DBG_ASSERT(nPages[nTab],"alle Tabellen leer?");
203             nTabPage = nPages[nTab] - 1;
204             nTabStart = 0;
205             for (sal_uInt16 i=0; i<nTab; i++)
206                 nTabStart += nPages[i];
207 
208             ScDocument* pDoc = pDocShell->GetDocument();
209             nDisplayStart = lcl_GetDisplayStart( nTab, pDoc, nPages );
210         }
211         else        // leeres Dokument
212         {
213             nTab = 0;
214             nPageNo = nTabPage = nTabStart = nDisplayStart = 0;
215             aState.nPrintTab = 0;
216                         aState.nStartCol = aState.nEndCol = 0;
217                         aState.nStartRow = aState.nEndRow = 0;
218                         aState.nZoom = 0;
219             aState.nPagesX = aState.nPagesY = 0;
220             aState.nTabPages = aState.nTotalPages =
221             aState.nPageStart = aState.nDocPages = 0;
222         }
223     }
224 }
225 
226 
CalcPages(SCTAB)227 void ScPreview::CalcPages( SCTAB /*nToWhichTab*/ )
228 {
229     WaitObject( this );
230 
231     ScDocument* pDoc = pDocShell->GetDocument();
232     nTabCount = pDoc->GetTableCount();
233 
234     //SCTAB nAnz = Min( nTabCount, SCTAB(nToWhichTab+1) );
235     SCTAB nAnz = nTabCount;
236     SCTAB nStart = nTabsTested;
237     if (!bValid)
238     {
239         nStart = 0;
240         nTotalPages = 0;
241         nTabsTested = 0;
242     }
243 
244     // update all pending row heights with a single progress bar,
245     // instead of a separate progress for each sheet from ScPrintFunc
246     pDocShell->UpdatePendingRowHeights( nAnz-1, true );
247 
248     //  PrintOptions is passed to PrintFunc for SkipEmpty flag,
249     //  but always all sheets are used (there is no selected sheet)
250     ScPrintOptions aOptions = SC_MOD()->GetPrintOptions();
251 
252     for (SCTAB i=nStart; i<nAnz; i++)
253     {
254         long nAttrPage = i > 0 ? nFirstAttr[i-1] : 1;
255 
256         long nThisStart = nTotalPages;
257         ScPrintFunc aPrintFunc( this, pDocShell, i, nAttrPage, 0, NULL, &aOptions );
258         long nThisTab = aPrintFunc.GetTotalPages();
259         nPages[i] = nThisTab;
260         nTotalPages += nThisTab;
261         nFirstAttr[i] = aPrintFunc.GetFirstPageNo();    // behalten oder aus Vorlage
262 
263         if (nPageNo>=nThisStart && nPageNo<nTotalPages)
264         {
265             nTab = i;
266             nTabPage = nPageNo - nThisStart;
267             nTabStart = nThisStart;
268 
269             aPrintFunc.GetPrintState( aState );
270             aPageSize = aPrintFunc.GetPageSize();
271         }
272     }
273 
274     nDisplayStart = lcl_GetDisplayStart( nTab, pDoc, nPages );
275 
276     if (nAnz > nTabsTested)
277         nTabsTested = nAnz;
278 
279     //  testen, ob hinter letzter Seite
280 
281     if ( nTabsTested >= nTabCount )
282         TestLastPage();
283 
284     aState.nDocPages = nTotalPages;
285 
286     bValid = sal_True;
287     bStateValid = sal_True;
288     DoInvalidate();
289 }
290 
291 
RecalcPages()292 void ScPreview::RecalcPages()                   // nur nPageNo geaendert
293 {
294     if (!bValid)
295         return;                         // dann wird CalcPages aufgerufen
296 
297     SCTAB nOldTab = nTab;
298 
299     sal_Bool bDone = sal_False;
300     while (nPageNo >= nTotalPages && nTabsTested < nTabCount)
301     {
302         CalcPages( nTabsTested );
303         bDone = sal_True;
304     }
305 
306     if (!bDone)
307     {
308         long nPartPages = 0;
309         for (SCTAB i=0; i<nTabsTested; i++)
310         {
311             long nThisStart = nPartPages;
312             nPartPages += nPages[i];
313 
314             if (nPageNo>=nThisStart && nPageNo<nPartPages)
315             {
316                 nTab = i;
317                 nTabPage = nPageNo - nThisStart;
318                 nTabStart = nThisStart;
319 
320 //              aPageSize = aPrintFunc.GetPageSize();
321             }
322         }
323 
324         ScDocument* pDoc = pDocShell->GetDocument();
325         nDisplayStart = lcl_GetDisplayStart( nTab, pDoc, nPages );
326     }
327 
328     TestLastPage();         // testen, ob hinter letzter Seite
329 
330     if ( nTab != nOldTab )
331         bStateValid = sal_False;
332 
333     DoInvalidate();
334 }
335 
336 
DoPrint(ScPreviewLocationData * pFillLocation)337 void ScPreview::DoPrint( ScPreviewLocationData* pFillLocation )
338 {
339     if (!bValid)
340     {
341         CalcPages(0);
342         RecalcPages();
343         UpdateDrawView();       // Tabelle evtl. geaendert
344     }
345 
346     Fraction aPreviewZoom( nZoom, 100 );
347     Fraction aHorPrevZoom( (long)( 100 * nZoom / pDocShell->GetOutputFactor() ), 10000 );
348     MapMode aMMMode( MAP_100TH_MM, Point(), aHorPrevZoom, aPreviewZoom );
349 
350     sal_Bool bDoPrint = ( pFillLocation == NULL );
351     sal_Bool bValidPage = ( nPageNo < nTotalPages );
352 
353     ScModule* pScMod = SC_MOD();
354     const svtools::ColorConfig& rColorCfg = pScMod->GetColorConfig();
355     Color aBackColor( rColorCfg.GetColorValue(svtools::APPBACKGROUND).nColor );
356 
357     if ( bDoPrint && ( aOffset.X() < 0 || aOffset.Y() < 0 ) && bValidPage )
358     {
359         SetMapMode( aMMMode );
360         SetLineColor();
361         SetFillColor(aBackColor);
362 
363         Size aWinSize = GetOutputSize();
364         if ( aOffset.X() < 0 )
365             DrawRect(Rectangle( 0, 0, -aOffset.X(), aWinSize.Height() ));
366         if ( aOffset.Y() < 0 )
367             DrawRect(Rectangle( 0, 0, aWinSize.Width(), -aOffset.Y() ));
368     }
369 
370     long   nLeftMargin = 0;
371     long   nRightMargin = 0;
372     long   nTopMargin = 0;
373     long   nBottomMargin = 0;
374     sal_Bool bHeaderOn = sal_False;
375     sal_Bool bFooterOn = sal_False;
376 
377     ScDocument* pDoc = pDocShell->GetDocument();
378     sal_Bool bLayoutRTL = pDoc->IsLayoutRTL( nTab );
379 
380     Size aLocalPageSize;
381     if ( bValidPage )
382     {
383         ScPrintOptions aOptions = pScMod->GetPrintOptions();
384 
385         ScPrintFunc* pPrintFunc;
386         if (bStateValid)
387             pPrintFunc = new ScPrintFunc( this, pDocShell, aState, &aOptions );
388         else
389             pPrintFunc = new ScPrintFunc( this, pDocShell, nTab, nFirstAttr[nTab], nTotalPages, NULL, &aOptions );
390 
391         pPrintFunc->SetOffset(aOffset);
392         pPrintFunc->SetManualZoom(nZoom);
393         pPrintFunc->SetDateTime(aDate,aTime);
394         pPrintFunc->SetClearFlag(sal_True);
395         pPrintFunc->SetUseStyleColor( pScMod->GetAccessOptions().GetIsForPagePreviews() );
396 
397         pPrintFunc->SetDrawView( pDrawView );
398 
399         // MultiSelection fuer die eine Seite muss etwas umstaendlich erzeugt werden...
400         Range aPageRange( nPageNo+1, nPageNo+1 );
401         MultiSelection aPage( aPageRange );
402         aPage.SetTotalRange( Range(0,RANGE_MAX) );
403         aPage.Select( aPageRange );
404 
405         long nPrinted = pPrintFunc->DoPrint( aPage, nTabStart, nDisplayStart, bDoPrint, pFillLocation );
406         DBG_ASSERT(nPrinted<=1, "was'n nu los?");
407 
408         SetMapMode(aMMMode);
409 
410         //init nLeftMargin ... in the ScPrintFunc::InitParam!!!
411         nLeftMargin = pPrintFunc->GetLeftMargin();
412         nRightMargin = pPrintFunc->GetRightMargin();
413         nTopMargin = pPrintFunc->GetTopMargin();
414         nBottomMargin = pPrintFunc->GetBottomMargin();
415         nHeaderHeight = pPrintFunc->GetHeader().nHeight;
416         nFooterHeight = pPrintFunc->GetFooter().nHeight;
417         bHeaderOn = pPrintFunc->GetHeader().bEnable;
418         bFooterOn = pPrintFunc->GetFooter().bEnable;
419         mnScale = pPrintFunc->GetZoom();
420 
421         if ( bDoPrint && bPageMargin && pLocationData )     // don't make use of pLocationData while filling it
422         {
423             Rectangle aPixRect;
424             Rectangle aRectCellPosition;
425             Rectangle aRectPosition;
426             pLocationData->GetMainCellRange( aPageArea, aPixRect );
427             if( !bLayoutRTL )
428             {
429                 pLocationData->GetCellPosition( aPageArea.aStart, aRectPosition );
430                 nLeftPosition = aRectPosition.Left();
431                 for( SCCOL i = aPageArea.aStart.Col(); i <= aPageArea.aEnd.Col(); i++ )
432                 {
433                     pLocationData->GetCellPosition( ScAddress( i,aPageArea.aStart.Row(),aPageArea.aStart.Tab()),aRectCellPosition );
434                     nRight[i] = aRectCellPosition.Right();
435                 }
436             }
437             else
438             {
439                 pLocationData->GetCellPosition( aPageArea.aEnd, aRectPosition );
440                 nLeftPosition = aRectPosition.Right()+1;
441 
442                 pLocationData->GetCellPosition( aPageArea.aStart,aRectCellPosition );
443                 nRight[ aPageArea.aEnd.Col() ] = aRectCellPosition.Left();
444                 for( SCCOL i = aPageArea.aEnd.Col(); i > aPageArea.aStart.Col(); i-- )
445                 {
446                     pLocationData->GetCellPosition( ScAddress( i,aPageArea.aEnd.Row(),aPageArea.aEnd.Tab()),aRectCellPosition );
447                     nRight[ i-1 ] = nRight[ i ] + aRectCellPosition.Right() - aRectCellPosition.Left() + 1;
448                 }
449             }
450         }
451 
452         if (nPrinted)   // wenn nichts, alles grau zeichnen
453         {
454             aLocalPageSize = pPrintFunc->GetPageSize();
455             aLocalPageSize.Width()  = (long) (aLocalPageSize.Width()  * HMM_PER_TWIPS );
456             aLocalPageSize.Height() = (long) (aLocalPageSize.Height() * HMM_PER_TWIPS );
457 
458             nLeftMargin = (long) ( nLeftMargin * HMM_PER_TWIPS );
459             nRightMargin = (long) ( nRightMargin * HMM_PER_TWIPS );
460             nTopMargin = (long) ( nTopMargin * HMM_PER_TWIPS );
461             nBottomMargin = (long) ( nBottomMargin * HMM_PER_TWIPS );
462             nHeaderHeight = (long) ( nHeaderHeight * HMM_PER_TWIPS * mnScale / 100 + nTopMargin );
463             nFooterHeight = (long) ( nFooterHeight * HMM_PER_TWIPS * mnScale / 100 + nBottomMargin );
464         }
465 
466         if (!bStateValid)
467         {
468             pPrintFunc->GetPrintState( aState );
469             aState.nDocPages = nTotalPages;
470             bStateValid = sal_True;
471         }
472         delete pPrintFunc;
473     }
474 
475     if ( bDoPrint )
476     {
477         long nPageEndX = aLocalPageSize.Width()  - aOffset.X();
478         long nPageEndY = aLocalPageSize.Height() - aOffset.Y();
479         if ( !bValidPage )
480             nPageEndX = nPageEndY = 0;
481 
482         Size aWinSize = GetOutputSize();
483         Point aWinEnd( aWinSize.Width(), aWinSize.Height() );
484         sal_Bool bRight  = nPageEndX <= aWinEnd.X();
485         sal_Bool bBottom = nPageEndY <= aWinEnd.Y();
486 
487         if( bPageMargin && bValidPage )
488         {
489             SetMapMode(aMMMode);
490             SetLineColor( COL_BLACK );
491             DrawInvert( (long)( nTopMargin - aOffset.Y() ), POINTER_VSIZEBAR );
492             DrawInvert( (long)(nPageEndY - nBottomMargin ), POINTER_VSIZEBAR );
493             DrawInvert( (long)( nLeftMargin - aOffset.X() ), POINTER_HSIZEBAR );
494             DrawInvert( (long)( nPageEndX - nRightMargin ) , POINTER_HSIZEBAR );
495             if( bHeaderOn )
496             {
497                 DrawInvert( nHeaderHeight - aOffset.Y(), POINTER_VSIZEBAR );
498             }
499             if( bFooterOn )
500             {
501                 DrawInvert( nPageEndY - nFooterHeight, POINTER_VSIZEBAR );
502             }
503 
504             SetMapMode( MapMode( MAP_PIXEL ) );
505             for( int i= aPageArea.aStart.Col(); i<= aPageArea.aEnd.Col(); i++ )
506             {
507                 Point aColumnTop = LogicToPixel( Point( 0, -aOffset.Y() ) ,aMMMode );
508                 SetLineColor( COL_BLACK );
509                 SetFillColor( COL_BLACK );
510                 DrawRect( Rectangle( Point( nRight[i] - 2, aColumnTop.Y() ),Point( nRight[i] + 2 , 4 + aColumnTop.Y()) ));
511                 DrawLine( Point( nRight[i], aColumnTop.Y() ), Point( nRight[i],  10 + aColumnTop.Y()) );
512             }
513             SetMapMode( aMMMode );
514         }
515 
516         if (bRight || bBottom)
517         {
518             SetMapMode(aMMMode);
519             SetLineColor();
520             SetFillColor(aBackColor);
521             if (bRight)
522                 DrawRect(Rectangle(nPageEndX,0, aWinEnd.X(),aWinEnd.Y()));
523             if (bBottom)
524             {
525                 if (bRight)
526                     DrawRect(Rectangle(0,nPageEndY, nPageEndX,aWinEnd.Y()));    // Ecke nicht doppelt
527                 else
528                     DrawRect(Rectangle(0,nPageEndY, aWinEnd.X(),aWinEnd.Y()));
529             }
530         }
531 
532         if ( bValidPage )
533         {
534             Color aBorderColor( SC_MOD()->GetColorConfig().GetColorValue(svtools::FONTCOLOR).nColor );
535 
536             //  draw border
537 
538             if ( aOffset.X() <= 0 || aOffset.Y() <= 0 || bRight || bBottom )
539             {
540                 SetLineColor( aBorderColor );
541                 SetFillColor();
542 
543                 Rectangle aPixel( LogicToPixel( Rectangle( -aOffset.X(), -aOffset.Y(), nPageEndX, nPageEndY ) ) );
544                 --aPixel.Right();
545                 --aPixel.Bottom();
546                 DrawRect( PixelToLogic( aPixel ) );
547             }
548 
549             //  draw shadow
550 
551 //          SetLineColor();
552 //          SetFillColor( aBorderColor );
553 
554 //          Rectangle aPixel;
555 
556 //          aPixel = LogicToPixel( Rectangle( nPageEndX, -aOffset.Y(), nPageEndX, nPageEndY ) );
557 //          aPixel.Top() += SC_PREVIEW_SHADOWSIZE;
558 //          aPixel.Right() += SC_PREVIEW_SHADOWSIZE - 1;
559 //          aPixel.Bottom() += SC_PREVIEW_SHADOWSIZE - 1;
560 //          DrawRect( PixelToLogic( aPixel ) );
561 
562 //          aPixel = LogicToPixel( Rectangle( -aOffset.X(), nPageEndY, nPageEndX, nPageEndY ) );
563 //          aPixel.Left() += SC_PREVIEW_SHADOWSIZE;
564 //          aPixel.Right() += SC_PREVIEW_SHADOWSIZE - 1;
565 //          aPixel.Bottom() += SC_PREVIEW_SHADOWSIZE - 1;
566 //          DrawRect( PixelToLogic( aPixel ) );
567         }
568     }
569 }
570 
571 //Issue51656 Add resizeable margin on page preview from maoyg
Paint(const Rectangle &)572 void __EXPORT ScPreview::Paint( const Rectangle& /* rRect */ )
573 {
574     bool bWasInPaint = bInPaint;        // nested calls shouldn't be necessary, but allow for now
575     bInPaint = true;
576 
577     if (bPageMargin)
578         GetLocationData();              // fill location data for column positions
579     DoPrint( NULL );
580     pViewShell->UpdateScrollBars();
581 
582     bInPaint = bWasInPaint;
583 }
584 //Issue51656 Add resizeable margin on page preview from maoyg
585 
Command(const CommandEvent & rCEvt)586 void __EXPORT ScPreview::Command( const CommandEvent& rCEvt )
587 {
588     sal_uInt16 nCmd = rCEvt.GetCommand();
589     if ( nCmd == COMMAND_WHEEL || nCmd == COMMAND_STARTAUTOSCROLL || nCmd == COMMAND_AUTOSCROLL )
590     {
591         sal_Bool bDone = pViewShell->ScrollCommand( rCEvt );
592         if (!bDone)
593             Window::Command(rCEvt);
594     }
595     else if ( nCmd == COMMAND_CONTEXTMENU )
596         SfxDispatcher::ExecutePopup();
597     else
598         Window::Command( rCEvt );
599 }
600 
601 
KeyInput(const KeyEvent & rKEvt)602 void __EXPORT ScPreview::KeyInput( const KeyEvent& rKEvt )
603 {
604     //  The + and - keys can't be configured as accelerator entries, so they must be handled directly
605     //  (in ScPreview, not ScPreviewShell -> only if the preview window has the focus)
606 
607     const KeyCode& rKeyCode = rKEvt.GetKeyCode();
608     sal_uInt16 nKey = rKeyCode.GetCode();
609     sal_Bool bHandled = sal_False;
610     if(!rKeyCode.GetModifier())
611     {
612         sal_uInt16 nSlot = 0;
613         switch(nKey)
614         {
615             case KEY_ADD:      nSlot = SID_PREVIEW_ZOOMIN;  break;
616             case KEY_ESCAPE:   nSlot = ScViewUtil::IsFullScreen( *pViewShell ) ? SID_CANCEL : SID_PREVIEW_CLOSE; break;
617             case KEY_SUBTRACT: nSlot = SID_PREVIEW_ZOOMOUT; break;
618         }
619         if(nSlot)
620         {
621             bHandled = sal_True;
622             pViewShell->GetViewFrame()->GetDispatcher()->Execute( nSlot, SFX_CALLMODE_ASYNCHRON );
623         }
624     }
625 
626     if ( !bHandled && !pViewShell->KeyInput(rKEvt) )
627         Window::KeyInput(rKEvt);
628 }
629 
630 
GetLocationData()631 const ScPreviewLocationData& ScPreview::GetLocationData()
632 {
633     if ( !pLocationData )
634     {
635         pLocationData = new ScPreviewLocationData( pDocShell->GetDocument(), this );
636         bLocationValid = sal_False;
637     }
638     if ( !bLocationValid )
639     {
640         pLocationData->Clear();
641         DoPrint( pLocationData );
642         bLocationValid = sal_True;
643     }
644     return *pLocationData;
645 }
646 
647 
DataChanged(sal_Bool bNewTime)648 void ScPreview::DataChanged(sal_Bool bNewTime)
649 {
650     if (bNewTime)
651     {
652         aDate = Date();
653         aTime = Time();
654     }
655 
656     bValid = sal_False;
657     InvalidateLocationData( SC_HINT_DATACHANGED );
658     Invalidate();
659 }
660 
661 
GetPosString()662 String ScPreview::GetPosString()
663 {
664     if (!bValid)
665     {
666         CalcPages(nTab);
667         UpdateDrawView();       // Tabelle evtl. geaendert
668     }
669 
670     String aString( ScGlobal::GetRscString( STR_PAGE ) );
671     aString += ' ';
672     aString += String::CreateFromInt32(nPageNo+1);
673 
674     if (nTabsTested >= nTabCount)
675     {
676         aString.AppendAscii(RTL_CONSTASCII_STRINGPARAM( " / " ));
677         aString += String::CreateFromInt32(nTotalPages);
678     }
679 
680     return aString;
681 }
682 
683 
SetZoom(sal_uInt16 nNewZoom)684 void ScPreview::SetZoom(sal_uInt16 nNewZoom)
685 {
686     if (nNewZoom < 20)
687         nNewZoom = 20;
688     if (nNewZoom > 400)
689         nNewZoom = 400;
690     if (nNewZoom != nZoom)
691     {
692         nZoom = nNewZoom;
693 
694         //  apply new MapMode and call UpdateScrollBars to update aOffset
695 
696         Fraction aPreviewZoom( nZoom, 100 );
697         Fraction aHorPrevZoom( (long)( 100 * nZoom / pDocShell->GetOutputFactor() ), 10000 );
698         MapMode aMMMode( MAP_100TH_MM, Point(), aHorPrevZoom, aPreviewZoom );
699         SetMapMode( aMMMode );
700 
701         bInSetZoom = true;              // don't scroll during SetYOffset in UpdateScrollBars
702         pViewShell->UpdateScrollBars();
703         bInSetZoom = false;
704 
705         bStateValid = sal_False;
706         InvalidateLocationData( SC_HINT_ACC_VISAREACHANGED );
707         DoInvalidate();
708         Invalidate();
709     }
710 }
711 
712 
SetPageNo(long nPage)713 void ScPreview::SetPageNo( long nPage )
714 {
715     nPageNo = nPage;
716     RecalcPages();
717     UpdateDrawView();       // Tabelle evtl. geaendert
718     InvalidateLocationData( SC_HINT_DATACHANGED );
719     Invalidate();
720 }
721 
722 
GetFirstPage(SCTAB nTabP)723 long ScPreview::GetFirstPage(SCTAB nTabP)
724 {
725     SCTAB nDocTabCount = pDocShell->GetDocument()->GetTableCount();
726     if (nTabP >= nDocTabCount)
727         nTabP = nDocTabCount-1;
728 
729     long nPage = 0;
730     if (nTabP>0)
731     {
732         CalcPages( nTabP );
733         UpdateDrawView();       // Tabelle evtl. geaendert
734 
735         for (SCTAB i=0; i<nTabP; i++)
736             nPage += nPages[i];
737 
738         // bei leerer Tabelle vorhergehende Seite
739 
740         if ( nPages[nTabP]==0 && nPage > 0 )
741             --nPage;
742     }
743 
744     return nPage;
745 }
746 
747 
lcl_GetDocPageSize(ScDocument * pDoc,SCTAB nTab)748 Size lcl_GetDocPageSize( ScDocument* pDoc, SCTAB nTab )
749 {
750     String aName = pDoc->GetPageStyle( nTab );
751     ScStyleSheetPool* pStylePool = pDoc->GetStyleSheetPool();
752     SfxStyleSheetBase* pStyleSheet = pStylePool->Find( aName, SFX_STYLE_FAMILY_PAGE );
753     if ( pStyleSheet )
754     {
755         SfxItemSet& rStyleSet = pStyleSheet->GetItemSet();
756         return ((const SvxSizeItem&) rStyleSet.Get(ATTR_PAGE_SIZE)).GetSize();
757     }
758     else
759     {
760         DBG_ERROR( "PageStyle not found" );
761         return Size();
762     }
763 }
764 
765 
GetOptimalZoom(sal_Bool bWidthOnly)766 sal_uInt16 ScPreview::GetOptimalZoom(sal_Bool bWidthOnly)
767 {
768     double nWinScaleX = ScGlobal::nScreenPPTX / pDocShell->GetOutputFactor();
769     double nWinScaleY = ScGlobal::nScreenPPTY;
770     Size aWinSize = GetOutputSizePixel();
771 
772     //  desired margin is 0.25cm in default MapMode (like Writer),
773     //  but some additional margin is introduced by integer scale values
774     //  -> add only 0.10cm, so there is some margin in all cases.
775     Size aMarginSize( LogicToPixel( Size( 100, 100 ), MAP_100TH_MM ) );
776     aWinSize.Width()  -= 2 * aMarginSize.Width();
777     aWinSize.Height() -= 2 * aMarginSize.Height();
778 
779     Size aLocalPageSize = lcl_GetDocPageSize( pDocShell->GetDocument(), nTab );
780     if ( aLocalPageSize.Width() && aLocalPageSize.Height() )
781     {
782         long nZoomX = (long) ( aWinSize.Width() * 100  / ( aLocalPageSize.Width() * nWinScaleX ));
783         long nZoomY = (long) ( aWinSize.Height() * 100 / ( aLocalPageSize.Height() * nWinScaleY ));
784 
785         long nOptimal = nZoomX;
786         if (!bWidthOnly && nZoomY<nOptimal)
787             nOptimal = nZoomY;
788 
789         if (nOptimal<20)
790             nOptimal = 20;
791         if (nOptimal>400)
792             nOptimal = 400;
793 
794         return (sal_uInt16) nOptimal;
795     }
796     else
797         return nZoom;
798 }
799 
800 
SetXOffset(long nX)801 void ScPreview::SetXOffset( long nX )
802 {
803     if ( aOffset.X() == nX )
804         return;
805 
806     if (bValid)
807     {
808         long nDif = LogicToPixel(aOffset).X() - LogicToPixel(Point(nX,0)).X();
809         aOffset.X() = nX;
810         if (nDif && !bInSetZoom)
811         {
812             MapMode aOldMode = GetMapMode(); SetMapMode(MAP_PIXEL);
813             Scroll( nDif, 0 );
814             SetMapMode(aOldMode);
815         }
816     }
817     else
818     {
819         aOffset.X() = nX;
820         if (!bInSetZoom)
821             Invalidate();
822     }
823     InvalidateLocationData( SC_HINT_ACC_VISAREACHANGED );
824     Paint(Rectangle());
825 }
826 
827 
SetYOffset(long nY)828 void ScPreview::SetYOffset( long nY )
829 {
830     if ( aOffset.Y() == nY )
831         return;
832 
833     if (bValid)
834     {
835         long nDif = LogicToPixel(aOffset).Y() - LogicToPixel(Point(0,nY)).Y();
836         aOffset.Y() = nY;
837         if (nDif && !bInSetZoom)
838         {
839             MapMode aOldMode = GetMapMode(); SetMapMode(MAP_PIXEL);
840             Scroll( 0, nDif );
841             SetMapMode(aOldMode);
842         }
843     }
844     else
845     {
846         aOffset.Y() = nY;
847         if (!bInSetZoom)
848             Invalidate();
849     }
850     InvalidateLocationData( SC_HINT_ACC_VISAREACHANGED );
851     Paint(Rectangle());
852 }
853 
854 
DoInvalidate()855 void ScPreview::DoInvalidate()
856 {
857     //  Wenn das ganze aus dem GetState der Shell gerufen wird,
858     //  muss das Invalidate hinterher asynchron kommen...
859 
860     if (bInGetState)
861         Application::PostUserEvent( STATIC_LINK( this, ScPreview, InvalidateHdl ) );
862     else
863         StaticInvalidate();     // sofort
864 }
865 
StaticInvalidate()866 void ScPreview::StaticInvalidate()
867 {
868     //  static method, because it's called asynchronously
869     //  -> must use current viewframe
870 
871     SfxViewFrame* pViewFrm = SfxViewFrame::Current();
872     if (!pViewFrm)
873         return;
874 
875     SfxBindings& rBindings = pViewFrm->GetBindings();
876     rBindings.Invalidate(SID_STATUS_DOCPOS);
877     rBindings.Invalidate(SID_STATUS_PAGESTYLE);
878     rBindings.Invalidate(SID_PREVIEW_PREVIOUS);
879     rBindings.Invalidate(SID_PREVIEW_NEXT);
880     rBindings.Invalidate(SID_PREVIEW_FIRST);
881     rBindings.Invalidate(SID_PREVIEW_LAST);
882     rBindings.Invalidate(SID_ATTR_ZOOM);
883     rBindings.Invalidate(SID_PREVIEW_ZOOMIN);
884     rBindings.Invalidate(SID_PREVIEW_ZOOMOUT);
885     rBindings.Invalidate(SID_PREVIEW_SCALINGFACTOR);
886     rBindings.Invalidate(SID_ATTR_ZOOMSLIDER);
887 }
888 
IMPL_STATIC_LINK(ScPreview,InvalidateHdl,void *,EMPTYARG)889 IMPL_STATIC_LINK( ScPreview, InvalidateHdl, void*, EMPTYARG )
890 {
891     (void)pThis;    // avoid warning
892 
893     StaticInvalidate();
894     return 0;
895 }
896 
DataChanged(const DataChangedEvent & rDCEvt)897 void ScPreview::DataChanged( const DataChangedEvent& rDCEvt )
898 {
899     Window::DataChanged(rDCEvt);
900 
901     if ( (rDCEvt.GetType() == DATACHANGED_PRINTER) ||
902          (rDCEvt.GetType() == DATACHANGED_DISPLAY) ||
903          (rDCEvt.GetType() == DATACHANGED_FONTS) ||
904          (rDCEvt.GetType() == DATACHANGED_FONTSUBSTITUTION) ||
905          ((rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
906           (rDCEvt.GetFlags() & SETTINGS_STYLE)) )
907     {
908         if ( rDCEvt.GetType() == DATACHANGED_FONTS )
909             pDocShell->UpdateFontList();
910 
911         // #i114518# Paint of form controls may modify the window's settings.
912         // Ignore the event if it is called from within Paint.
913         if ( !bInPaint )
914         {
915             if ( rDCEvt.GetType() == DATACHANGED_SETTINGS &&
916                   (rDCEvt.GetFlags() & SETTINGS_STYLE) )
917             {
918                 //  scroll bar size may have changed
919                 pViewShell->InvalidateBorder();     // calls OuterResizePixel
920             }
921 
922             Invalidate();
923             InvalidateLocationData( SC_HINT_DATACHANGED );
924         }
925     }
926 }
927 
928 //Issue51656 Add resizeable margin on page preview from maoyg
MouseButtonDown(const MouseEvent & rMEvt)929 void __EXPORT ScPreview::MouseButtonDown( const MouseEvent& rMEvt )
930 {
931     Fraction  aPreviewZoom( nZoom, 100 );
932     Fraction  aHorPrevZoom( (long)( 100 * nZoom / pDocShell->GetOutputFactor() ), 10000 );
933     MapMode   aMMMode( MAP_100TH_MM, Point(), aHorPrevZoom, aPreviewZoom );
934 
935     aButtonDownChangePoint = PixelToLogic( rMEvt.GetPosPixel(),aMMMode );
936     aButtonDownPt = PixelToLogic( rMEvt.GetPosPixel(),aMMMode );
937 
938     CaptureMouse();
939 
940     if( rMEvt.IsLeft() && GetPointer() == POINTER_HSIZEBAR )
941     {
942         SetMapMode( aMMMode );
943         if( bLeftRulerChange )
944         {
945            DrawInvert( aButtonDownChangePoint.X(), POINTER_HSIZEBAR );
946            bLeftRulerMove = sal_True;
947            bRightRulerMove = sal_False;
948         }
949         else if( bRightRulerChange )
950         {
951            DrawInvert( aButtonDownChangePoint.X(), POINTER_HSIZEBAR );
952            bLeftRulerMove = sal_False;
953            bRightRulerMove = sal_True;
954         }
955     }
956 
957     if( rMEvt.IsLeft() && GetPointer() == POINTER_VSIZEBAR )
958     {
959         SetMapMode( aMMMode );
960         if( bTopRulerChange )
961         {
962             DrawInvert( aButtonDownChangePoint.Y(), POINTER_VSIZEBAR );
963             bTopRulerMove = sal_True;
964             bBottomRulerMove = sal_False;
965         }
966         else if( bBottomRulerChange )
967         {
968             DrawInvert( aButtonDownChangePoint.Y(), POINTER_VSIZEBAR );
969             bTopRulerMove = sal_False;
970             bBottomRulerMove = sal_True;
971         }
972         else if( bHeaderRulerChange )
973         {
974             DrawInvert( aButtonDownChangePoint.Y(), POINTER_VSIZEBAR );
975             bHeaderRulerMove = sal_True;
976             bFooterRulerMove = sal_False;
977         }
978         else if( bFooterRulerChange )
979         {
980             DrawInvert( aButtonDownChangePoint.Y(), POINTER_VSIZEBAR );
981             bHeaderRulerMove = sal_False;
982             bFooterRulerMove = sal_True;
983         }
984     }
985 
986     if( rMEvt.IsLeft() && GetPointer() == POINTER_HSPLIT )
987     {
988         Point  aNowPt = rMEvt.GetPosPixel();
989         SCCOL i = 0;
990         for( i = aPageArea.aStart.Col(); i<= aPageArea.aEnd.Col(); i++ )
991         {
992             if( aNowPt.X() < nRight[i] + 2 && aNowPt.X() > nRight[i] - 2 )
993             {
994                 nColNumberButttonDown = i;
995                 break;
996             }
997         }
998         if( i == aPageArea.aEnd.Col()+1 )
999             return;
1000 
1001         SetMapMode( aMMMode );
1002         if( nColNumberButttonDown == aPageArea.aStart.Col() )
1003             DrawInvert( PixelToLogic( Point( nLeftPosition, 0 ),aMMMode ).X() ,POINTER_HSPLIT );
1004         else
1005             DrawInvert( PixelToLogic( Point( nRight[ nColNumberButttonDown-1 ], 0 ),aMMMode ).X() ,POINTER_HSPLIT );
1006 
1007         DrawInvert( aButtonDownChangePoint.X(), POINTER_HSPLIT );
1008         bColRulerMove = sal_True;
1009     }
1010 }
1011 
MouseButtonUp(const MouseEvent & rMEvt)1012 void __EXPORT ScPreview::MouseButtonUp( const MouseEvent& rMEvt )
1013 {
1014         Fraction  aPreviewZoom( nZoom, 100 );
1015         Fraction  aHorPrevZoom( (long)( 100 * nZoom / pDocShell->GetOutputFactor() ), 10000 );
1016         MapMode   aMMMode( MAP_100TH_MM, Point(), aHorPrevZoom, aPreviewZoom );
1017 
1018         aButtonUpPt = PixelToLogic( rMEvt.GetPosPixel(),aMMMode );
1019 
1020         long  nWidth = (long) lcl_GetDocPageSize(pDocShell->GetDocument(), nTab).Width();
1021         long  nHeight = (long) lcl_GetDocPageSize(pDocShell->GetDocument(), nTab).Height();
1022 
1023         if( rMEvt.IsLeft() && GetPointer() == POINTER_HSIZEBAR )
1024         {
1025             SetPointer( Pointer( POINTER_ARROW ) );
1026 
1027             sal_Bool bMoveRulerAction= sal_True;
1028 
1029             ScDocument * pDoc = pDocShell->GetDocument();
1030             String   aOldName = pDoc->GetPageStyle( nTab );
1031             sal_Bool  bUndo( pDoc->IsUndoEnabled() );
1032             ScStyleSheetPool* pStylePool = pDoc->GetStyleSheetPool();
1033             SfxStyleSheetBase* pStyleSheet = pStylePool->Find( aOldName, SFX_STYLE_FAMILY_PAGE );
1034 
1035             if ( pStyleSheet )
1036             {
1037                 ScStyleSaveData aOldData;
1038                 if( bUndo )
1039                     aOldData.InitFromStyle( pStyleSheet );
1040 
1041                 SfxItemSet&  rStyleSet = pStyleSheet->GetItemSet();
1042 
1043                 SvxLRSpaceItem aLRItem = ( const SvxLRSpaceItem& ) rStyleSet.Get( ATTR_LRSPACE );
1044 
1045                 if(( bLeftRulerChange || bRightRulerChange ) && ( aButtonUpPt.X() <= ( 0 - aOffset.X() ) || aButtonUpPt.X() > nWidth * HMM_PER_TWIPS - aOffset.X() ) )
1046                 {
1047                     bMoveRulerAction = sal_False;
1048                     Paint(Rectangle(0,0,10000,10000));
1049                 }
1050                 else if( bLeftRulerChange && ( aButtonUpPt.X() / HMM_PER_TWIPS > nWidth - aLRItem.GetRight() - aOffset.X() / HMM_PER_TWIPS ) )
1051                 {
1052                     bMoveRulerAction = sal_False;
1053                     Paint(Rectangle(0,0,10000,10000));
1054                 }
1055                 else if( bRightRulerChange && ( aButtonUpPt.X() / HMM_PER_TWIPS < aLRItem.GetLeft() - aOffset.X() / HMM_PER_TWIPS ) )
1056                 {
1057                     bMoveRulerAction = sal_False;
1058                     Paint(Rectangle(0,0,10000,10000));
1059                 }
1060                 else if( aButtonDownPt.X() == aButtonUpPt.X() )
1061                 {
1062                     bMoveRulerAction = sal_False;
1063                     DrawInvert( aButtonUpPt.X(), POINTER_HSIZEBAR );
1064                 }
1065                 if( bMoveRulerAction )
1066                 {
1067                     ScDocShellModificator aModificator( *pDocShell );
1068                     if( bLeftRulerChange && bLeftRulerMove )
1069                     {
1070                        aLRItem.SetLeft( (long)( aButtonUpPt.X() / HMM_PER_TWIPS + aOffset.X() / HMM_PER_TWIPS ));
1071                        rStyleSet.Put( aLRItem );
1072                     }
1073                     else if( bRightRulerChange && bRightRulerMove )
1074                     {
1075                         aLRItem.SetRight( (long)( nWidth - aButtonUpPt.X() / HMM_PER_TWIPS - aOffset.X() / HMM_PER_TWIPS ));
1076                         rStyleSet.Put( aLRItem );
1077                     }
1078 
1079                     ScStyleSaveData aNewData;
1080                     aNewData.InitFromStyle( pStyleSheet );
1081                     if( bUndo )
1082                     {
1083                         pDocShell->GetUndoManager()->AddUndoAction(
1084                             new ScUndoModifyStyle( pDocShell, SFX_STYLE_FAMILY_PAGE,
1085                             aOldData, aNewData ) );
1086                     }
1087 
1088                     if ( ValidTab( nTab ) )
1089                     {
1090                         ScPrintFunc aPrintFunc( this, pDocShell, nTab );
1091                         aPrintFunc.UpdatePages();
1092                     }
1093 
1094                     Rectangle aRect(0,0,10000,10000);
1095                     Paint( aRect );
1096                     aModificator.SetDocumentModified();
1097                     bLeftRulerChange = sal_False;
1098                     bRightRulerChange = sal_False;
1099                 }
1100             }
1101             bLeftRulerMove = sal_False;
1102             bRightRulerMove = sal_False;
1103         }
1104 
1105         if( rMEvt.IsLeft() && GetPointer() == POINTER_VSIZEBAR )
1106         {
1107             SetPointer( POINTER_ARROW );
1108 
1109             sal_Bool  bMoveRulerAction = sal_True;
1110             if( ( bTopRulerChange || bBottomRulerChange || bHeaderRulerChange || bFooterRulerChange ) && ( aButtonUpPt.Y() <= ( 0 - aOffset.Y() ) || aButtonUpPt.Y() > nHeight * HMM_PER_TWIPS -aOffset.Y() ) )
1111             {
1112                 bMoveRulerAction = sal_False;
1113                 Paint( Rectangle(0,0,10000,10000) );
1114             }
1115             else if( aButtonDownPt.Y() == aButtonUpPt.Y() )
1116             {
1117                 bMoveRulerAction = sal_False;
1118                 DrawInvert( aButtonUpPt.Y(), POINTER_VSIZEBAR );
1119             }
1120             if( bMoveRulerAction )
1121             {
1122                 ScDocument * pDoc = pDocShell->GetDocument();
1123                 sal_Bool  bUndo( pDoc->IsUndoEnabled() );
1124                 ScStyleSheetPool* pStylePool = pDoc->GetStyleSheetPool();
1125                 SfxStyleSheetBase* pStyleSheet = pStylePool->Find( pDoc->GetPageStyle( nTab ), SFX_STYLE_FAMILY_PAGE );
1126                 DBG_ASSERT( pStyleSheet, "PageStyle not found" );
1127                 if ( pStyleSheet )
1128                 {
1129                     ScDocShellModificator aModificator( *pDocShell );
1130                     ScStyleSaveData aOldData;
1131                     if( bUndo )
1132                         aOldData.InitFromStyle( pStyleSheet );
1133 
1134                     SfxItemSet& rStyleSet = pStyleSheet->GetItemSet();
1135 
1136                     SvxULSpaceItem aULItem = ( const SvxULSpaceItem&)rStyleSet.Get( ATTR_ULSPACE );
1137 
1138                     if( bTopRulerMove && bTopRulerChange )
1139                     {
1140                         aULItem.SetUpperValue( (sal_uInt16)( aButtonUpPt.Y() / HMM_PER_TWIPS + aOffset.Y() / HMM_PER_TWIPS ) );
1141                         rStyleSet.Put( aULItem );
1142                     }
1143                     else if( bBottomRulerMove && bBottomRulerChange )
1144                     {
1145                         aULItem.SetLowerValue( (sal_uInt16)( nHeight - aButtonUpPt.Y() / HMM_PER_TWIPS - aOffset.Y() / HMM_PER_TWIPS ) );
1146                         rStyleSet.Put( aULItem );
1147                     }
1148                     else if( bHeaderRulerMove && bHeaderRulerChange )
1149                     {
1150                         const SfxPoolItem* pItem = NULL;
1151                         if ( rStyleSet.GetItemState( ATTR_PAGE_HEADERSET, sal_False, &pItem ) == SFX_ITEM_SET )
1152                         {
1153                             SfxItemSet& pHeaderSet = ((SvxSetItem*)pItem)->GetItemSet();
1154                             Size  aHeaderSize = ((const SvxSizeItem&)pHeaderSet.Get(ATTR_PAGE_SIZE)).GetSize();
1155                             aHeaderSize.Height() = (long)( aButtonUpPt.Y() / HMM_PER_TWIPS + aOffset.Y() / HMM_PER_TWIPS - aULItem.GetUpper());
1156                             aHeaderSize.Height() = aHeaderSize.Height() * 100 / mnScale;
1157                             SvxSetItem  aNewHeader( (const SvxSetItem&)rStyleSet.Get(ATTR_PAGE_HEADERSET) );
1158                             aNewHeader.GetItemSet().Put( SvxSizeItem( ATTR_PAGE_SIZE, aHeaderSize ) );
1159                             rStyleSet.Put( aNewHeader );
1160                         }
1161                     }
1162                     else if( bFooterRulerMove && bFooterRulerChange )
1163                     {
1164                         const SfxPoolItem* pItem = NULL;
1165                         if( rStyleSet.GetItemState( ATTR_PAGE_FOOTERSET, sal_False, &pItem ) == SFX_ITEM_SET )
1166                         {
1167                             SfxItemSet& pFooterSet = ((SvxSetItem*)pItem)->GetItemSet();
1168                             Size aFooterSize = ((const SvxSizeItem&)pFooterSet.Get(ATTR_PAGE_SIZE)).GetSize();
1169                             aFooterSize.Height() = (long)( nHeight - aButtonUpPt.Y() / HMM_PER_TWIPS - aOffset.Y() / HMM_PER_TWIPS - aULItem.GetLower() );
1170                             aFooterSize.Height() = aFooterSize.Height() * 100 / mnScale;
1171                             SvxSetItem  aNewFooter( (const SvxSetItem&)rStyleSet.Get(ATTR_PAGE_FOOTERSET) );
1172                             aNewFooter.GetItemSet().Put( SvxSizeItem( ATTR_PAGE_SIZE, aFooterSize ) );
1173                             rStyleSet.Put( aNewFooter );
1174                         }
1175                     }
1176 
1177                     ScStyleSaveData aNewData;
1178                     aNewData.InitFromStyle( pStyleSheet );
1179                     if( bUndo )
1180                     {
1181                         pDocShell->GetUndoManager()->AddUndoAction(
1182                             new ScUndoModifyStyle( pDocShell, SFX_STYLE_FAMILY_PAGE,
1183                             aOldData, aNewData ) );
1184                     }
1185 
1186                     if ( ValidTab( nTab ) )
1187                     {
1188                         ScPrintFunc aPrintFunc( this, pDocShell, nTab );
1189                         aPrintFunc.UpdatePages();
1190                     }
1191 
1192                     Rectangle  aRect(0,0,10000,10000);
1193                     Paint( aRect );
1194                     aModificator.SetDocumentModified();
1195                     bTopRulerChange = sal_False;
1196                     bBottomRulerChange = sal_False;
1197                     bHeaderRulerChange = sal_False;
1198                     bFooterRulerChange = sal_False;
1199                  }
1200               }
1201               bTopRulerMove = sal_False;
1202               bBottomRulerMove = sal_False;
1203               bHeaderRulerMove = sal_False;
1204               bFooterRulerMove = sal_False;
1205         }
1206         if( rMEvt.IsLeft() && GetPointer() == POINTER_HSPLIT )
1207         {
1208             SetPointer(POINTER_ARROW);
1209             ScDocument* pDoc = pDocShell->GetDocument();
1210             sal_Bool  bLayoutRTL = pDoc->IsLayoutRTL( nTab );
1211             sal_Bool  bMoveRulerAction = sal_True;
1212             if( aButtonDownPt.X() == aButtonUpPt.X() )
1213             {
1214                 bMoveRulerAction = sal_False;
1215                 if( nColNumberButttonDown == aPageArea.aStart.Col() )
1216                     DrawInvert( PixelToLogic( Point( nLeftPosition, 0 ),aMMMode ).X() ,POINTER_HSPLIT );
1217                 else
1218                     DrawInvert( PixelToLogic( Point( nRight[ nColNumberButttonDown-1 ], 0 ),aMMMode ).X() ,POINTER_HSPLIT );
1219                 DrawInvert( aButtonUpPt.X(), POINTER_HSPLIT );
1220             }
1221             if( bMoveRulerAction )
1222             {
1223                 long  nNewColWidth = 0;
1224                 ScDocFunc aFunc(*pDocShell);
1225                 SCCOLROW nCols[2] = { nColNumberButttonDown, nColNumberButttonDown };
1226 
1227                 if( !bLayoutRTL )
1228                 {
1229                     nNewColWidth = (long) ( PixelToLogic( Point( rMEvt.GetPosPixel().X() - nRight[ nColNumberButttonDown ], 0), aMMMode ).X() / HMM_PER_TWIPS ) * 100 / mnScale;
1230                     nNewColWidth += pDocShell->GetDocument()->GetColWidth( nColNumberButttonDown, nTab );
1231                 }
1232                 else
1233                 {
1234 
1235                     nNewColWidth = (long) ( PixelToLogic( Point( nRight[ nColNumberButttonDown ] - rMEvt.GetPosPixel().X(), 0), aMMMode ).X() / HMM_PER_TWIPS ) * 100 / mnScale;
1236                     nNewColWidth += pDocShell->GetDocument()->GetColWidth( nColNumberButttonDown, nTab );
1237                 }
1238 
1239                 if( nNewColWidth >= 0 )
1240                 {
1241                     aFunc.SetWidthOrHeight( sal_True, 1,nCols, nTab, SC_SIZE_DIRECT, (sal_uInt16)nNewColWidth, sal_True, sal_True);
1242                 }
1243                 if ( ValidTab( nTab ) )
1244                 {
1245                     ScPrintFunc aPrintFunc( this, pDocShell, nTab );
1246                     aPrintFunc.UpdatePages();
1247                 }
1248                 Rectangle  nRect(0,0,10000,10000);
1249                 Paint( nRect );
1250             }
1251             bColRulerMove = sal_False;
1252         }
1253         ReleaseMouse();
1254 }
1255 
MouseMove(const MouseEvent & rMEvt)1256 void __EXPORT ScPreview::MouseMove( const MouseEvent& rMEvt )
1257 {
1258     Fraction aPreviewZoom( nZoom, 100 );
1259     Fraction aHorPrevZoom( (long)( 100 * nZoom / pDocShell->GetOutputFactor() ), 10000 );
1260     MapMode  aMMMode( MAP_100TH_MM, Point(), aHorPrevZoom, aPreviewZoom );
1261     Point    aMouseMovePoint = PixelToLogic( rMEvt.GetPosPixel(), aMMMode );
1262 
1263     long    nLeftMargin = 0;
1264     long    nRightMargin = 0;
1265     long    nTopMargin = 0;
1266     long    nBottomMargin = 0;
1267     Size    PageSize;
1268 
1269     long    nWidth = (long) lcl_GetDocPageSize(pDocShell->GetDocument(), nTab).Width();
1270     long    nHeight = (long) lcl_GetDocPageSize(pDocShell->GetDocument(), nTab).Height();
1271 
1272     if ( nPageNo < nTotalPages )
1273     {
1274         ScPrintOptions aOptions = SC_MOD()->GetPrintOptions();
1275 
1276         ScPrintFunc* pPrintFunc;
1277 
1278         if (bStateValid)
1279             pPrintFunc = new ScPrintFunc( this, pDocShell, aState, &aOptions );
1280         else
1281             pPrintFunc = new ScPrintFunc( this, pDocShell, nTab, nFirstAttr[nTab], nTotalPages, NULL, &aOptions );
1282 
1283         nLeftMargin = (long)( pPrintFunc->GetLeftMargin() * HMM_PER_TWIPS - aOffset.X() );
1284         nRightMargin = (long)( pPrintFunc->GetRightMargin() * HMM_PER_TWIPS );
1285         nRightMargin = (long)( nWidth * HMM_PER_TWIPS - nRightMargin - aOffset.X() );
1286         nTopMargin = (long)( pPrintFunc->GetTopMargin() * HMM_PER_TWIPS - aOffset.Y() );
1287         nBottomMargin = (long)( pPrintFunc->GetBottomMargin() * HMM_PER_TWIPS );
1288         nBottomMargin = (long)( nHeight * HMM_PER_TWIPS - nBottomMargin - aOffset.Y() );
1289         if( mnScale > 0 )
1290         {
1291             nHeaderHeight = (long)( nTopMargin + pPrintFunc->GetHeader().nHeight * HMM_PER_TWIPS * mnScale / 100 );
1292             nFooterHeight = (long)( nBottomMargin - pPrintFunc->GetFooter().nHeight * HMM_PER_TWIPS * mnScale / 100 );
1293         }
1294         else
1295         {
1296             nHeaderHeight = (long)( nTopMargin + pPrintFunc->GetHeader().nHeight * HMM_PER_TWIPS );
1297             nFooterHeight = (long)( nBottomMargin - pPrintFunc->GetFooter().nHeight * HMM_PER_TWIPS );
1298         }
1299         delete pPrintFunc;
1300     }
1301 
1302     Point   aPixPt( rMEvt.GetPosPixel() );
1303     Point   aLeftTop = LogicToPixel( Point( nLeftMargin, -aOffset.Y() ) , aMMMode );
1304     Point   aLeftBottom = LogicToPixel( Point( nLeftMargin ,(long)(nHeight * HMM_PER_TWIPS - aOffset.Y()) ), aMMMode );
1305     Point   aRightTop = LogicToPixel( Point( nRightMargin, -aOffset.Y() ), aMMMode );
1306     Point   aTopLeft = LogicToPixel( Point( -aOffset.X(), nTopMargin ), aMMMode );
1307     Point   aTopRight = LogicToPixel( Point( (long)(nWidth * HMM_PER_TWIPS - aOffset.X()), nTopMargin ), aMMMode );
1308     Point   aBottomLeft = LogicToPixel( Point( -aOffset.X(), nBottomMargin ), aMMMode );
1309     Point   aHeaderLeft = LogicToPixel( Point(  -aOffset.X(), nHeaderHeight ), aMMMode );
1310     Point   aFooderLeft = LogicToPixel( Point( -aOffset.X(), nFooterHeight ), aMMMode );
1311 
1312     sal_Bool   bOnColRulerChange = sal_False;
1313 
1314     for( SCCOL i=aPageArea.aStart.Col(); i<= aPageArea.aEnd.Col(); i++ )
1315     {
1316         Point   aColumnTop = LogicToPixel( Point( 0, -aOffset.Y() ) ,aMMMode );
1317         Point   aColumnBottom = LogicToPixel( Point( 0, (long)( nHeight * HMM_PER_TWIPS - aOffset.Y()) ), aMMMode );
1318         if( aPixPt.X() < ( nRight[i] + 2 ) && ( aPixPt.X() > ( nRight[i] - 2 ) ) && ( aPixPt.X() < aRightTop.X() ) && ( aPixPt.X() > aLeftTop.X() )
1319             && ( aPixPt.Y() > aColumnTop.Y() ) && ( aPixPt.Y() < aColumnBottom.Y() ) && !bLeftRulerMove && !bRightRulerMove
1320             && !bTopRulerMove && !bBottomRulerMove && !bHeaderRulerMove && !bFooterRulerMove )
1321         {
1322             bOnColRulerChange = sal_True;
1323             if( !rMEvt.GetButtons() && GetPointer() == POINTER_HSPLIT )
1324                 nColNumberButttonDown = i;
1325             break;
1326         }
1327     }
1328 
1329     if( aPixPt.X() < ( aLeftTop.X() + 2 ) && aPixPt.X() > ( aLeftTop.X() - 2 ) && !bRightRulerMove )
1330     {
1331         bLeftRulerChange = sal_True;
1332         bRightRulerChange = sal_False;
1333     }
1334     else if( aPixPt.X() < ( aRightTop.X() + 2 ) && aPixPt.X() > ( aRightTop.X() - 2 ) && !bLeftRulerMove )
1335     {
1336         bLeftRulerChange = sal_False;
1337         bRightRulerChange = sal_True;
1338     }
1339     else if( aPixPt.Y() < ( aTopLeft.Y() + 2 ) && aPixPt.Y() > ( aTopLeft.Y() - 2 ) && !bBottomRulerMove && !bHeaderRulerMove && !bFooterRulerMove )
1340     {
1341         bTopRulerChange = sal_True;
1342         bBottomRulerChange = sal_False;
1343         bHeaderRulerChange = sal_False;
1344         bFooterRulerChange = sal_False;
1345     }
1346     else if( aPixPt.Y() < ( aBottomLeft.Y() + 2 ) && aPixPt.Y() > ( aBottomLeft.Y() - 2 ) && !bTopRulerMove && !bHeaderRulerMove && !bFooterRulerMove )
1347     {
1348         bTopRulerChange = sal_False;
1349         bBottomRulerChange = sal_True;
1350         bHeaderRulerChange = sal_False;
1351         bFooterRulerChange = sal_False;
1352     }
1353     else if( aPixPt.Y() < ( aHeaderLeft.Y() + 2 ) && aPixPt.Y() > ( aHeaderLeft.Y() - 2 ) && !bTopRulerMove && !bBottomRulerMove && !bFooterRulerMove )
1354     {
1355         bTopRulerChange = sal_False;
1356         bBottomRulerChange = sal_False;
1357         bHeaderRulerChange = sal_True;
1358         bFooterRulerChange = sal_False;
1359     }
1360     else if( aPixPt.Y() < ( aFooderLeft.Y() + 2 ) && aPixPt.Y() > ( aFooderLeft.Y() - 2 ) && !bTopRulerMove && !bBottomRulerMove && !bHeaderRulerMove )
1361     {
1362         bTopRulerChange = sal_False;
1363         bBottomRulerChange = sal_False;
1364         bHeaderRulerChange = sal_False;
1365         bFooterRulerChange = sal_True;
1366     }
1367 
1368     if( bPageMargin )
1369     {
1370         if(( (aPixPt.X() < ( aLeftTop.X() + 2 ) && aPixPt.X() > ( aLeftTop.X() - 2 )) || bLeftRulerMove ||
1371             ( aPixPt.X() < ( aRightTop.X() + 2 ) && aPixPt.X() > ( aRightTop.X() - 2 ) ) || bRightRulerMove || bOnColRulerChange || bColRulerMove )
1372             && aPixPt.Y() > aLeftTop.Y() && aPixPt.Y() < aLeftBottom.Y() )
1373         {
1374             if( bOnColRulerChange || bColRulerMove )
1375             {
1376                 SetPointer( Pointer( POINTER_HSPLIT ) );
1377                 if( bColRulerMove )
1378                 {
1379                     if( aMouseMovePoint.X() > -aOffset.X() && aMouseMovePoint.X() < nWidth * HMM_PER_TWIPS - aOffset.X() )
1380                        DragMove( aMouseMovePoint.X(), POINTER_HSPLIT );
1381                 }
1382             }
1383             else
1384             {
1385                 if( bLeftRulerChange && !bTopRulerMove && !bBottomRulerMove && !bHeaderRulerMove && !bFooterRulerMove )
1386                 {
1387                     SetPointer( Pointer( POINTER_HSIZEBAR ) );
1388                     if( bLeftRulerMove )
1389                     {
1390                        if( aMouseMovePoint.X() > -aOffset.X() && aMouseMovePoint.X() < nWidth * HMM_PER_TWIPS - aOffset.X() )
1391                            DragMove( aMouseMovePoint.X(), POINTER_HSIZEBAR );
1392                     }
1393                 }
1394                 else if( bRightRulerChange && !bTopRulerMove && !bBottomRulerMove && !bHeaderRulerMove && !bFooterRulerMove )
1395                 {
1396                     SetPointer( Pointer( POINTER_HSIZEBAR ) );
1397                     if( bRightRulerMove )
1398                     {
1399                        if( aMouseMovePoint.X() > -aOffset.X() && aMouseMovePoint.X() < nWidth * HMM_PER_TWIPS - aOffset.X() )
1400                            DragMove( aMouseMovePoint.X(), POINTER_HSIZEBAR );
1401                     }
1402                 }
1403             }
1404         }
1405         else
1406         {
1407             if( ( ( aPixPt.Y() < ( aTopLeft.Y() + 2 ) && aPixPt.Y() > ( aTopLeft.Y() - 2 ) ) || bTopRulerMove ||
1408                 ( aPixPt.Y() < ( aBottomLeft.Y() + 2 ) && aPixPt.Y() > ( aBottomLeft.Y() - 2 ) ) || bBottomRulerMove ||
1409                 ( aPixPt.Y() < ( aHeaderLeft.Y() + 2 ) && aPixPt.Y() > ( aHeaderLeft.Y() - 2 ) ) || bHeaderRulerMove ||
1410                 ( aPixPt.Y() < ( aFooderLeft.Y() + 2 ) && aPixPt.Y() > ( aFooderLeft.Y() - 2 ) ) || bFooterRulerMove )
1411                 && aPixPt.X() > aTopLeft.X() && aPixPt.X() < aTopRight.X() )
1412             {
1413                 if( bTopRulerChange )
1414                 {
1415                     SetPointer( Pointer( POINTER_VSIZEBAR ) );
1416                     if( bTopRulerMove )
1417                     {
1418                         if( aMouseMovePoint.Y() > -aOffset.Y() && aMouseMovePoint.Y() < nHeight * HMM_PER_TWIPS - aOffset.Y() )
1419                             DragMove( aMouseMovePoint.Y(), POINTER_VSIZEBAR );
1420                     }
1421                 }
1422                 else if( bBottomRulerChange )
1423                 {
1424                     SetPointer( Pointer( POINTER_VSIZEBAR ) );
1425                     if( bBottomRulerMove )
1426                     {
1427                         if( aMouseMovePoint.Y() > -aOffset.Y() && aMouseMovePoint.Y() < nHeight * HMM_PER_TWIPS - aOffset.Y() )
1428                             DragMove( aMouseMovePoint.Y(), POINTER_VSIZEBAR );
1429                     }
1430                 }
1431                 else if( bHeaderRulerChange )
1432                 {
1433                     SetPointer( Pointer( POINTER_VSIZEBAR ) );
1434                     if( bHeaderRulerMove )
1435                     {
1436                         if( aMouseMovePoint.Y() > -aOffset.Y() && aMouseMovePoint.Y() < nHeight * HMM_PER_TWIPS - aOffset.Y() )
1437                             DragMove( aMouseMovePoint.Y(), POINTER_VSIZEBAR );
1438                     }
1439                 }
1440                 else if( bFooterRulerChange )
1441                 {
1442                     SetPointer( Pointer( POINTER_VSIZEBAR ) );
1443                     if( bFooterRulerMove )
1444                     {
1445                         if( aMouseMovePoint.Y() > -aOffset.Y() && aMouseMovePoint.Y() < nHeight * HMM_PER_TWIPS - aOffset.Y() )
1446                             DragMove( aMouseMovePoint.Y(), POINTER_VSIZEBAR );
1447                     }
1448                 }
1449             }
1450             else
1451                 SetPointer( Pointer( POINTER_ARROW ) );
1452         }
1453     }
1454 }
1455 //Issue51656 Add resizeable margin on page preview from maoyg
InvalidateLocationData(sal_uLong nId)1456 void ScPreview::InvalidateLocationData(sal_uLong nId)
1457 {
1458     bLocationValid = sal_False;
1459     if (pViewShell->HasAccessibilityObjects())
1460         pViewShell->BroadcastAccessibility( SfxSimpleHint( nId ) );
1461 }
1462 
GetFocus()1463 void ScPreview::GetFocus()
1464 {
1465     if (pViewShell->HasAccessibilityObjects())
1466         pViewShell->BroadcastAccessibility( ScAccWinFocusGotHint(GetAccessible()) );
1467 }
1468 
LoseFocus()1469 void ScPreview::LoseFocus()
1470 {
1471     if (pViewShell->HasAccessibilityObjects())
1472         pViewShell->BroadcastAccessibility( ScAccWinFocusLostHint(GetAccessible()) );
1473 }
1474 
CreateAccessible()1475 com::sun::star::uno::Reference<com::sun::star::accessibility::XAccessible> ScPreview::CreateAccessible()
1476 {
1477     com::sun::star::uno::Reference<com::sun::star::accessibility::XAccessible> xAcc= GetAccessible(sal_False);
1478     if (xAcc.is())
1479     {
1480         return xAcc;
1481     }
1482     ScAccessibleDocumentPagePreview* pAccessible =
1483         new ScAccessibleDocumentPagePreview( GetAccessibleParentWindow()->GetAccessible(), pViewShell );
1484     xAcc = pAccessible;
1485     SetAccessible(xAcc);
1486     pAccessible->Init();
1487     return xAcc;
1488 }
1489 // MT: Removed Windows::SwitchView() introduced with IA2 CWS.
1490 // There are other notifications for this when the active view has chnaged, so please update the code to use that event mechanism
SwitchView()1491 void ScPreview::SwitchView()
1492 {
1493     if (!Application::IsAccessibilityEnabled())
1494     {
1495         return ;
1496     }
1497     ScAccessibleDocumentBase* pAccDoc = static_cast<ScAccessibleDocumentBase*>(GetAccessible(sal_False).get());
1498     if (pAccDoc)
1499     {
1500         pAccDoc->SwitchViewFireFocus();
1501     }
1502 }
1503 //Issue51656 Add resizeable margin on page preview from maoyg
DragMove(long nDragMovePos,sal_uInt16 nFlags)1504 void ScPreview::DragMove( long nDragMovePos, sal_uInt16 nFlags )
1505 {
1506     Fraction aPreviewZoom( nZoom, 100 );
1507     Fraction aHorPrevZoom( (long)( 100 * nZoom / pDocShell->GetOutputFactor() ), 10000 );
1508     MapMode  aMMMode( MAP_100TH_MM, Point(), aHorPrevZoom, aPreviewZoom );
1509     SetMapMode( aMMMode );
1510     long  nPos = nDragMovePos;
1511     if( nFlags == POINTER_HSIZEBAR || nFlags == POINTER_HSPLIT )
1512     {
1513         if( nDragMovePos != aButtonDownChangePoint.X() )
1514         {
1515             DrawInvert( aButtonDownChangePoint.X(), nFlags );
1516             aButtonDownChangePoint.X() = nPos;
1517             DrawInvert( aButtonDownChangePoint.X(), nFlags );
1518         }
1519     }
1520     else if( nFlags == POINTER_VSIZEBAR )
1521     {
1522         if( nDragMovePos != aButtonDownChangePoint.Y() )
1523         {
1524             DrawInvert( aButtonDownChangePoint.Y(), nFlags );
1525             aButtonDownChangePoint.Y() = nPos;
1526             DrawInvert( aButtonDownChangePoint.Y(), nFlags );
1527         }
1528     }
1529 }
1530 
DrawInvert(long nDragPos,sal_uInt16 nFlags)1531 void ScPreview::DrawInvert( long nDragPos, sal_uInt16 nFlags )
1532 {
1533     long  nHeight = (long) lcl_GetDocPageSize( pDocShell->GetDocument(), nTab ).Height();
1534     long  nWidth = (long) lcl_GetDocPageSize( pDocShell->GetDocument(), nTab ).Width();
1535     if( nFlags == POINTER_HSIZEBAR || nFlags == POINTER_HSPLIT )
1536     {
1537         Rectangle aRect( nDragPos, -aOffset.Y(), nDragPos + 1,(long)( ( nHeight * HMM_PER_TWIPS ) - aOffset.Y()));
1538         Invert( aRect,INVERT_50 );
1539     }
1540     else if( nFlags == POINTER_VSIZEBAR )
1541     {
1542         Rectangle aRect( -aOffset.X(), nDragPos,(long)( ( nWidth * HMM_PER_TWIPS ) - aOffset.X() ), nDragPos + 1 );
1543         Invert( aRect,INVERT_50 );
1544     }
1545 }
1546 //Issue51656 Add resizeable margin on page preview from maoyg
1547