1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: preview.cxx,v $
12 * This file is part of OpenOffice.org.
14 * OpenOffice.org is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU Lesser General Public License version 3
16 * only, as published by the Free Software Foundation.
18 * OpenOffice.org is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Lesser General Public License version 3 for more details
22 * (a copy is included in the LICENSE file that accompanied this code).
24 * You should have received a copy of the GNU Lesser General Public License
25 * version 3 along with OpenOffice.org. If not, see
26 * <http://www.openoffice.org/license.html>
27 * for a copy of the LGPLv3 License.
29 ************************************************************************/
31 // MARKER(update_precomp.py): autogen include statement, do not remove
32 #include "precompiled_sc.hxx"
36 // INCLUDE ---------------------------------------------------------------
37 #include <tools/pstm.hxx>
38 #include "scitems.hxx"
39 #include <svx/eeitem.hxx>
42 #include <svtools/colorcfg.hxx>
43 #include <svx/fmview.hxx>
44 #include <svx/sizeitem.hxx>
45 #include <svx/svdpagv.hxx>
46 #include <sfx2/bindings.hxx>
47 #include <sfx2/viewfrm.hxx>
48 #include <sfx2/dispatch.hxx>
49 #include <svtools/accessibilityoptions.hxx>
50 #include <svtools/itemset.hxx>
51 #include <tools/multisel.hxx>
52 #include <vcl/waitobj.hxx>
53 #include <vcl/sound.hxx>
55 #include "preview.hxx"
56 #include "prevwsh.hxx"
57 #include "prevloc.hxx"
59 #include "docfunc.hxx"
60 #include "printfun.hxx"
61 #include "printopt.hxx"
62 #include "stlpool.hxx"
63 #include "undostyl.hxx"
64 #include "drwlayer.hxx"
66 #include "globstr.hrc"
67 #include "sc.hrc" // fuer ShellInvalidate
68 #include "AccessibleDocumentPagePreview.hxx"
69 #include <vcl/lineinfo.hxx>
70 #include <svx/algitem.hxx>
71 #include <svx/lrspitem.hxx>
72 #include <svx/ulspitem.hxx>
73 #include <svx/sizeitem.hxx>
75 #include "pagepar.hxx"
76 #include <com/sun/star/accessibility/XAccessible.hpp>
77 #include "AccessibilityHints.hxx"
78 #include <vcl/svapp.hxx>
79 #include "viewutil.hxx"
81 // STATIC DATA -----------------------------------------------------------
83 //==================================================================
85 #define SC_PREVIEW_SHADOWSIZE 2
87 long lcl_GetDisplayStart( SCTAB nTab
, ScDocument
* pDoc
, long* pPages
)
89 long nDisplayStart
= 0;
90 for (SCTAB i
=0; i
<nTab
; i
++)
92 if ( pDoc
->NeedPageResetAfterTab(i
) )
95 nDisplayStart
+= pPages
[i
];
101 ScPreview::ScPreview( Window
* pParent
, ScDocShell
* pDocSh
, ScPreviewShell
* pViewSh
) :
111 bStateValid( FALSE
),
112 bLocationValid( FALSE
),
113 pLocationData( NULL
),
115 nCurTab ( ScDocShell::GetCurTab() ),
117 bInGetState( FALSE
),
119 pViewShell( pViewSh
),
120 bLeftRulerMove( FALSE
),
121 bRightRulerMove( FALSE
),
122 bTopRulerMove( FALSE
),
123 bBottomRulerMove( FALSE
),
124 bHeaderRulerMove( FALSE
),
125 bFooterRulerMove( FALSE
),
126 bLeftRulerChange( FALSE
),
127 bRightRulerChange( FALSE
),
128 bTopRulerChange( FALSE
),
129 bBottomRulerChange( FALSE
),
130 bHeaderRulerChange( FALSE
),
131 bFooterRulerChange( FALSE
),
132 bPageMargin ( FALSE
),
133 bColRulerMove( FALSE
),
135 nColNumberButttonDown( 0 ),
139 SetOutDevViewType( OUTDEV_VIEWTYPE_PRINTPREVIEW
); //#106611#
142 SetHelpId( HID_SC_WIN_PREVIEW
);
143 SetUniqueId( HID_SC_WIN_PREVIEW
);
145 SetDigitLanguage( SC_MOD()->GetOptDigitLanguage() );
149 __EXPORT
ScPreview::~ScPreview()
152 delete pLocationData
;
155 void ScPreview::UpdateDrawView() // nTab muss richtig sein
157 ScDocument
* pDoc
= pDocShell
->GetDocument();
158 ScDrawLayer
* pModel
= pDoc
->GetDrawLayer(); // ist nicht 0
163 SdrPage
* pPage
= pModel
->GetPage(nTab
);
164 if ( pDrawView
&& ( !pDrawView
->GetSdrPageView() || pDrawView
->GetSdrPageView()->GetPage() != pPage
) )
166 // die angezeigte Page der DrawView umzustellen (s.u.) funktioniert nicht ?!?
171 if ( !pDrawView
) // neu anlegen?
173 pDrawView
= new FmFormView( pModel
, this );
174 // #55259# die DrawView uebernimmt den Design-Modus vom Model
175 // (Einstellung "Im Entwurfsmodus oeffnen"), darum hier zuruecksetzen
176 pDrawView
->SetDesignMode( TRUE
);
177 pDrawView
->SetPrintPreview( TRUE
);
178 pDrawView
->ShowSdrPage(pPage
);
181 else if ( !pDrawView
->GetSdrPageView()) // angezeigte Page umstellen
183 pDrawView
->HideSdrPage();
184 pDrawView
->ShowSdrPage(pDrawView
->GetModel()->GetPage(nTab
));
188 else if ( pDrawView
)
190 delete pDrawView
; // fuer diese Tabelle nicht gebraucht
196 void ScPreview::TestLastPage()
198 if (nPageNo
>= nTotalPages
)
202 nPageNo
= nTotalPages
- 1;
203 nTab
= nTabCount
- 1;
204 while (nTab
> 0 && !nPages
[nTab
]) // letzte nicht leere Tabelle
206 DBG_ASSERT(nPages
[nTab
],"alle Tabellen leer?");
207 nTabPage
= nPages
[nTab
] - 1;
209 for (USHORT i
=0; i
<nTab
; i
++)
210 nTabStart
+= nPages
[i
];
212 ScDocument
* pDoc
= pDocShell
->GetDocument();
213 nDisplayStart
= lcl_GetDisplayStart( nTab
, pDoc
, nPages
);
215 else // leeres Dokument
218 nPageNo
= nTabPage
= nTabStart
= nDisplayStart
= 0;
219 aState
.nPrintTab
= 0;
220 aState
.nStartCol
= aState
.nEndCol
= 0;
221 aState
.nStartRow
= aState
.nEndRow
= 0;
223 aState
.nPagesX
= aState
.nPagesY
= 0;
224 aState
.nTabPages
= aState
.nTotalPages
=
225 aState
.nPageStart
= aState
.nDocPages
= 0;
231 void ScPreview::CalcPages( SCTAB
/*nToWhichTab*/ )
235 ScDocument
* pDoc
= pDocShell
->GetDocument();
236 nTabCount
= pDoc
->GetTableCount();
238 //SCTAB nAnz = Min( nTabCount, SCTAB(nToWhichTab+1) );
239 SCTAB nAnz
= nTabCount
;
240 SCTAB nStart
= nTabsTested
;
248 // update all pending row heights with a single progress bar,
249 // instead of a separate progress for each sheet from ScPrintFunc
250 pDocShell
->UpdatePendingRowHeights( nAnz
-1, true );
252 // PrintOptions is passed to PrintFunc for SkipEmpty flag,
253 // but always all sheets are used (there is no selected sheet)
254 ScPrintOptions aOptions
= SC_MOD()->GetPrintOptions();
256 ScMarkData aMarkData
;
257 aMarkData
.SelectTable( nCurTab
, TRUE
);
259 for (SCTAB i
=nStart
; i
<nAnz
; i
++)
261 if (!aOptions
.GetAllSheets() && !aMarkData
.GetTableSelect( i
)) {
267 long nAttrPage
= i
> 0 ? nFirstAttr
[i
-1] : 1;
269 long nThisStart
= nTotalPages
;
270 ScPrintFunc
aPrintFunc( this, pDocShell
, i
, nAttrPage
, 0, NULL
, &aOptions
);
271 long nThisTab
= aPrintFunc
.GetTotalPages();
272 nPages
[i
] = nThisTab
;
273 nTotalPages
+= nThisTab
;
274 nFirstAttr
[i
] = aPrintFunc
.GetFirstPageNo(); // behalten oder aus Vorlage
276 if (nPageNo
>=nThisStart
&& nPageNo
<nTotalPages
)
279 nTabPage
= nPageNo
- nThisStart
;
280 nTabStart
= nThisStart
;
282 aPrintFunc
.GetPrintState( aState
);
283 aPageSize
= aPrintFunc
.GetPageSize();
287 nDisplayStart
= lcl_GetDisplayStart( nTab
, pDoc
, nPages
);
289 if (nAnz
> nTabsTested
)
292 // testen, ob hinter letzter Seite
294 if ( nTabsTested
>= nTabCount
)
297 aState
.nDocPages
= nTotalPages
;
305 void ScPreview::RecalcPages() // nur nPageNo geaendert
308 return; // dann wird CalcPages aufgerufen
310 SCTAB nOldTab
= nTab
;
313 while (nPageNo
>= nTotalPages
&& nTabsTested
< nTabCount
)
315 CalcPages( nTabsTested
);
322 for (SCTAB i
=0; i
<nTabsTested
; i
++)
324 long nThisStart
= nPartPages
;
325 nPartPages
+= nPages
[i
];
327 if (nPageNo
>=nThisStart
&& nPageNo
<nPartPages
)
330 nTabPage
= nPageNo
- nThisStart
;
331 nTabStart
= nThisStart
;
333 // aPageSize = aPrintFunc.GetPageSize();
337 ScDocument
* pDoc
= pDocShell
->GetDocument();
338 nDisplayStart
= lcl_GetDisplayStart( nTab
, pDoc
, nPages
);
341 TestLastPage(); // testen, ob hinter letzter Seite
343 if ( nTab
!= nOldTab
)
350 void ScPreview::DoPrint( ScPreviewLocationData
* pFillLocation
)
356 UpdateDrawView(); // Tabelle evtl. geaendert
359 Fraction
aPreviewZoom( nZoom
, 100 );
360 Fraction
aHorPrevZoom( (long)( 100 * nZoom
/ pDocShell
->GetOutputFactor() ), 10000 );
361 MapMode
aMMMode( MAP_100TH_MM
, Point(), aHorPrevZoom
, aPreviewZoom
);
363 BOOL bDoPrint
= ( pFillLocation
== NULL
);
364 BOOL bValidPage
= ( nPageNo
< nTotalPages
);
366 ScModule
* pScMod
= SC_MOD();
367 const svtools::ColorConfig
& rColorCfg
= pScMod
->GetColorConfig();
368 Color
aBackColor( rColorCfg
.GetColorValue(svtools::APPBACKGROUND
).nColor
);
370 if ( bDoPrint
&& ( aOffset
.X() < 0 || aOffset
.Y() < 0 ) && bValidPage
)
372 SetMapMode( aMMMode
);
374 SetFillColor(aBackColor
);
376 Size aWinSize
= GetOutputSize();
377 if ( aOffset
.X() < 0 )
378 DrawRect(Rectangle( 0, 0, -aOffset
.X(), aWinSize
.Height() ));
379 if ( aOffset
.Y() < 0 )
380 DrawRect(Rectangle( 0, 0, aWinSize
.Width(), -aOffset
.Y() ));
386 ScPrintOptions aOptions
= pScMod
->GetPrintOptions();
388 ScPrintFunc
* pPrintFunc
;
390 pPrintFunc
= new ScPrintFunc( this, pDocShell
, aState
, &aOptions
);
392 pPrintFunc
= new ScPrintFunc( this, pDocShell
, nTab
, nFirstAttr
[nTab
], nTotalPages
, NULL
, &aOptions
);
394 pPrintFunc
->SetOffset(aOffset
);
395 pPrintFunc
->SetManualZoom(nZoom
);
396 pPrintFunc
->SetDateTime(aDate
,aTime
);
397 pPrintFunc
->SetClearFlag(TRUE
);
398 pPrintFunc
->SetUseStyleColor( pScMod
->GetAccessOptions().GetIsForPagePreviews() );
400 pPrintFunc
->SetDrawView( pDrawView
);
402 // MultiSelection fuer die eine Seite muss etwas umstaendlich erzeugt werden...
403 Range
aPageRange( nPageNo
+1, nPageNo
+1 );
404 MultiSelection
aPage( aPageRange
);
405 aPage
.SetTotalRange( Range(0,RANGE_MAX
) );
406 aPage
.Select( aPageRange
);
408 long nPrinted
= pPrintFunc
->DoPrint( aPage
, nTabStart
, nDisplayStart
, bDoPrint
, NULL
, pFillLocation
);
409 DBG_ASSERT(nPrinted
<=1, "was'n nu los?");
412 // USHORT nPrintZoom = pPrintFunc->GetZoom();
414 if (nPrinted
) // wenn nichts, alles grau zeichnen
416 aLocalPageSize
= pPrintFunc
->GetPageSize();
417 aLocalPageSize
.Width() = (long) (aLocalPageSize
.Width() * HMM_PER_TWIPS
);
418 aLocalPageSize
.Height() = (long) (aLocalPageSize
.Height() * HMM_PER_TWIPS
);
423 pPrintFunc
->GetPrintState( aState
);
424 aState
.nDocPages
= nTotalPages
;
432 long nPageEndX
= aLocalPageSize
.Width() - aOffset
.X();
433 long nPageEndY
= aLocalPageSize
.Height() - aOffset
.Y();
435 nPageEndX
= nPageEndY
= 0;
437 Size aWinSize
= GetOutputSize();
438 Point
aWinEnd( aWinSize
.Width(), aWinSize
.Height() );
439 BOOL bRight
= nPageEndX
<= aWinEnd
.X();
440 BOOL bBottom
= nPageEndY
<= aWinEnd
.Y();
441 if (bRight
|| bBottom
)
444 SetFillColor(aBackColor
);
446 DrawRect(Rectangle(nPageEndX
,0, aWinEnd
.X(),aWinEnd
.Y()));
450 DrawRect(Rectangle(0,nPageEndY
, nPageEndX
,aWinEnd
.Y())); // Ecke nicht doppelt
452 DrawRect(Rectangle(0,nPageEndY
, aWinEnd
.X(),aWinEnd
.Y()));
458 Color
aBorderColor( SC_MOD()->GetColorConfig().GetColorValue(svtools::FONTCOLOR
).nColor
);
462 if ( aOffset
.X() <= 0 || aOffset
.Y() <= 0 || bRight
|| bBottom
)
464 SetLineColor( aBorderColor
);
467 Rectangle
aPixel( LogicToPixel( Rectangle( -aOffset
.X(), -aOffset
.Y(), nPageEndX
, nPageEndY
) ) );
470 DrawRect( PixelToLogic( aPixel
) );
476 SetFillColor( aBorderColor
);
480 aPixel
= LogicToPixel( Rectangle( nPageEndX
, -aOffset
.Y(), nPageEndX
, nPageEndY
) );
481 aPixel
.Top() += SC_PREVIEW_SHADOWSIZE
;
482 aPixel
.Right() += SC_PREVIEW_SHADOWSIZE
- 1;
483 aPixel
.Bottom() += SC_PREVIEW_SHADOWSIZE
- 1;
484 DrawRect( PixelToLogic( aPixel
) );
486 aPixel
= LogicToPixel( Rectangle( -aOffset
.X(), nPageEndY
, nPageEndX
, nPageEndY
) );
487 aPixel
.Left() += SC_PREVIEW_SHADOWSIZE
;
488 aPixel
.Right() += SC_PREVIEW_SHADOWSIZE
- 1;
489 aPixel
.Bottom() += SC_PREVIEW_SHADOWSIZE
- 1;
490 DrawRect( PixelToLogic( aPixel
) );
495 //Issue51656 Add resizeable margin on page preview from maoyg
496 void __EXPORT
ScPreview::Paint( const Rectangle
& /* rRect */ )
502 UpdateDrawView(); // Table possibly amended
505 Fraction
aPreviewZoom( nZoom
, 100 );
506 Fraction
aHorPrevZoom( (long)( 100 * nZoom
/ pDocShell
->GetOutputFactor() ), 10000 );
507 MapMode
aMMMode( MAP_100TH_MM
, Point(), aHorPrevZoom
, aPreviewZoom
);
509 ScModule
* pScMod
= SC_MOD();
510 const svtools::ColorConfig
& rColorCfg
= pScMod
->GetColorConfig();
511 Color
aBackColor( rColorCfg
.GetColorValue(svtools::APPBACKGROUND
).nColor
);
513 if ( aOffset
.X() < 0 || aOffset
.Y() < 0 )
515 SetMapMode( aMMMode
);
517 SetFillColor(aBackColor
);
519 Size aWinSize
= GetOutputSize();
520 if ( aOffset
.X() < 0 )
521 DrawRect(Rectangle( 0, 0, -aOffset
.X(), aWinSize
.Height() ));
522 if ( aOffset
.Y() < 0 )
523 DrawRect(Rectangle( 0, 0, aWinSize
.Width(), -aOffset
.Y() ));
526 long nLeftMargin
= 0;
527 long nRightMargin
= 0;
529 long nBottomMargin
= 0;
530 BOOL bHeaderOn
= FALSE
;
531 BOOL bFooterOn
= FALSE
;
533 ScDocument
* pDoc
= pDocShell
->GetDocument();
534 BOOL bLayoutRTL
= pDoc
->IsLayoutRTL( nTab
);
537 if ( nPageNo
< nTotalPages
)
539 ScPrintOptions aOptions
= SC_MOD()->GetPrintOptions();
541 ScPrintFunc
* pPrintFunc
;
543 pPrintFunc
= new ScPrintFunc( pDocShell
, this, aState
, &aOptions
);
545 pPrintFunc
= new ScPrintFunc( pDocShell
, this, nTab
, nFirstAttr
[nTab
], nTotalPages
, NULL
, &aOptions
);
547 pPrintFunc
->SetOffset(aOffset
);
548 pPrintFunc
->SetManualZoom(nZoom
);
549 pPrintFunc
->SetDateTime(aDate
,aTime
);
550 pPrintFunc
->SetClearFlag(TRUE
);
551 pPrintFunc
->SetUseStyleColor( pScMod
->GetAccessOptions().GetIsForPagePreviews() );
552 pPrintFunc
->SetDrawView( pDrawView
);
554 // Multi Selection for one side must be something umstaendlich generated ...
555 Range
aPageRange( nPageNo
+1, nPageNo
+1 );
556 MultiSelection
aPage( aPageRange
);
557 aPage
.SetTotalRange( Range(0,RANGE_MAX
) );
558 aPage
.Select( aPageRange
);
560 long nPrinted
= pPrintFunc
->DoPrint( aPage
, nTabStart
, nDisplayStart
);
561 DBG_ASSERT(nPrinted
<=1, "was'n nu los?");
565 //init nLeftMargin ... in the ScPrintFunc::InitParam!!!
566 nLeftMargin
= pPrintFunc
->GetLeftMargin();
567 nRightMargin
= pPrintFunc
->GetRightMargin();
568 nTopMargin
= pPrintFunc
->GetTopMargin();
569 nBottomMargin
= pPrintFunc
->GetBottomMargin();
570 nHeaderHeight
= pPrintFunc
->GetHeader().nHeight
;
571 nFooterHeight
= pPrintFunc
->GetFooter().nHeight
;
572 bHeaderOn
= pPrintFunc
->GetHeader().bEnable
;
573 bFooterOn
= pPrintFunc
->GetFooter().bEnable
;
574 mnScale
= pPrintFunc
->GetZoom();
577 Rectangle aRectCellPosition
;
578 Rectangle aRectPosition
;
579 GetLocationData().GetMainCellRange( aPageArea
, aPixRect
);
582 GetLocationData().GetCellPosition( aPageArea
.aStart
, aRectPosition
);
583 nLeftPosition
= aRectPosition
.Left();
584 for( SCCOL i
= aPageArea
.aStart
.Col(); i
<= aPageArea
.aEnd
.Col(); i
++ )
586 GetLocationData().GetCellPosition( ScAddress( i
,aPageArea
.aStart
.Row(),aPageArea
.aStart
.Tab()),aRectCellPosition
);
587 nRight
[i
] = aRectCellPosition
.Right();
592 GetLocationData().GetCellPosition( aPageArea
.aEnd
, aRectPosition
);
593 nLeftPosition
= aRectPosition
.Right()+1;
595 GetLocationData().GetCellPosition( aPageArea
.aStart
,aRectCellPosition
);
596 nRight
[ aPageArea
.aEnd
.Col() ] = aRectCellPosition
.Left();
597 for( SCCOL i
= aPageArea
.aEnd
.Col(); i
> aPageArea
.aStart
.Col(); i
-- )
599 GetLocationData().GetCellPosition( ScAddress( i
,aPageArea
.aEnd
.Row(),aPageArea
.aEnd
.Tab()),aRectCellPosition
);
600 nRight
[ i
-1 ] = nRight
[ i
] + aRectCellPosition
.Right() - aRectCellPosition
.Left() + 1;
604 if ( nPrinted
) // If nothing, all gray draw
606 aPaintPageSize
= pPrintFunc
->GetPageSize();
607 aPaintPageSize
.Width() = (long) (aPaintPageSize
.Width() * HMM_PER_TWIPS
);
608 aPaintPageSize
.Height() = (long) (aPaintPageSize
.Height() * HMM_PER_TWIPS
);
610 nLeftMargin
= (long) ( nLeftMargin
* HMM_PER_TWIPS
);
611 nRightMargin
= (long) ( nRightMargin
* HMM_PER_TWIPS
);
612 nTopMargin
= (long) ( nTopMargin
* HMM_PER_TWIPS
);
613 nBottomMargin
= (long) ( nBottomMargin
* HMM_PER_TWIPS
);
614 nHeaderHeight
= (long) ( nHeaderHeight
* HMM_PER_TWIPS
* mnScale
/ 100 + nTopMargin
);
615 nFooterHeight
= (long) ( nFooterHeight
* HMM_PER_TWIPS
* mnScale
/ 100 + nBottomMargin
);
620 pPrintFunc
->GetPrintState( aState
);
621 aState
.nDocPages
= nTotalPages
;
629 long nPageEndX
= aPaintPageSize
.Width() - aOffset
.X();
630 long nPageEndY
= aPaintPageSize
.Height() - aOffset
.Y();
631 Size aWinSize
= GetOutputSize();
632 Point
aWinEnd( aWinSize
.Width(), aWinSize
.Height() );
633 BOOL bRight
= nPageEndX
<= aWinEnd
.X();
634 BOOL bBottom
= nPageEndY
<= aWinEnd
.Y();
639 SetLineColor( COL_BLACK
);
640 DrawInvert( (long)( nTopMargin
- aOffset
.Y() ), POINTER_VSIZEBAR
);
641 DrawInvert( (long)(nPageEndY
- nBottomMargin
), POINTER_VSIZEBAR
);
642 DrawInvert( (long)( nLeftMargin
- aOffset
.X() ), POINTER_HSIZEBAR
);
643 DrawInvert( (long)( nPageEndX
- nRightMargin
) , POINTER_HSIZEBAR
);
646 DrawInvert( nHeaderHeight
- aOffset
.Y(), POINTER_VSIZEBAR
);
650 DrawInvert( nPageEndY
- nFooterHeight
, POINTER_VSIZEBAR
);
653 SetMapMode( MapMode( MAP_PIXEL
) );
654 for( int i
= aPageArea
.aStart
.Col(); i
<= aPageArea
.aEnd
.Col(); i
++ )
656 Point aColumnTop
= LogicToPixel( Point( 0, -aOffset
.Y() ) ,aMMMode
);
657 SetLineColor( COL_BLACK
);
658 SetFillColor( COL_BLACK
);
659 DrawRect( Rectangle( Point( nRight
[i
] - 2, aColumnTop
.Y() ),Point( nRight
[i
] + 2 , 4 + aColumnTop
.Y()) ));
660 DrawLine( Point( nRight
[i
], aColumnTop
.Y() ), Point( nRight
[i
], 10 + aColumnTop
.Y()) );
662 SetMapMode( aMMMode
);
665 if (bRight
|| bBottom
)
669 SetFillColor(aBackColor
);
671 DrawRect(Rectangle(nPageEndX
,0, aWinEnd
.X(),aWinEnd
.Y()));
675 DrawRect(Rectangle(0,nPageEndY
, nPageEndX
,aWinEnd
.Y())); // Ecke nicht doppelt
677 DrawRect(Rectangle(0,nPageEndY
, aWinEnd
.X(),aWinEnd
.Y()));
680 pViewShell
->UpdateScrollBars();
682 //Issue51656 Add resizeable margin on page preview from maoyg
684 void __EXPORT
ScPreview::Command( const CommandEvent
& rCEvt
)
686 USHORT nCmd
= rCEvt
.GetCommand();
687 if ( nCmd
== COMMAND_WHEEL
|| nCmd
== COMMAND_STARTAUTOSCROLL
|| nCmd
== COMMAND_AUTOSCROLL
)
689 BOOL bDone
= pViewShell
->ScrollCommand( rCEvt
);
691 Window::Command(rCEvt
);
693 else if ( nCmd
== COMMAND_CONTEXTMENU
)
694 SfxDispatcher::ExecutePopup();
696 Window::Command( rCEvt
);
700 void __EXPORT
ScPreview::KeyInput( const KeyEvent
& rKEvt
)
702 // The + and - keys can't be configured as accelerator entries, so they must be handled directly
703 // (in ScPreview, not ScPreviewShell -> only if the preview window has the focus)
705 const KeyCode
& rKeyCode
= rKEvt
.GetKeyCode();
706 USHORT nKey
= rKeyCode
.GetCode();
707 BOOL bHandled
= FALSE
;
708 if(!rKeyCode
.GetModifier())
713 case KEY_ADD
: nSlot
= SID_PREVIEW_ZOOMIN
; break;
714 case KEY_ESCAPE
: nSlot
= ScViewUtil::IsFullScreen( *pViewShell
) ? SID_CANCEL
: SID_PREVIEW_CLOSE
; break;
715 case KEY_SUBTRACT
: nSlot
= SID_PREVIEW_ZOOMOUT
; break;
720 pViewShell
->GetViewFrame()->GetDispatcher()->Execute( nSlot
, SFX_CALLMODE_ASYNCHRON
);
724 if ( !bHandled
&& !pViewShell
->KeyInput(rKEvt
) )
725 Window::KeyInput(rKEvt
);
729 const ScPreviewLocationData
& ScPreview::GetLocationData()
731 if ( !pLocationData
)
733 pLocationData
= new ScPreviewLocationData( pDocShell
->GetDocument(), this );
734 bLocationValid
= FALSE
;
736 if ( !bLocationValid
)
738 pLocationData
->Clear();
739 DoPrint( pLocationData
);
740 bLocationValid
= TRUE
;
742 return *pLocationData
;
746 void ScPreview::DataChanged(BOOL bNewTime
)
755 InvalidateLocationData( SC_HINT_DATACHANGED
);
760 String
ScPreview::GetPosString()
765 UpdateDrawView(); // Tabelle evtl. geaendert
768 String
aString( ScGlobal::GetRscString( STR_PAGE
) );
770 aString
+= String::CreateFromInt32(nPageNo
+1);
772 if (nTabsTested
>= nTabCount
)
774 aString
.AppendAscii(RTL_CONSTASCII_STRINGPARAM( " / " ));
775 aString
+= String::CreateFromInt32(nTotalPages
);
782 void ScPreview::SetZoom(USHORT nNewZoom
)
788 if (nNewZoom
!= nZoom
)
792 // apply new MapMode and call UpdateScrollBars to update aOffset
794 Fraction
aPreviewZoom( nZoom
, 100 );
795 Fraction
aHorPrevZoom( (long)( 100 * nZoom
/ pDocShell
->GetOutputFactor() ), 10000 );
796 MapMode
aMMMode( MAP_100TH_MM
, Point(), aHorPrevZoom
, aPreviewZoom
);
797 SetMapMode( aMMMode
);
799 bInPaint
= TRUE
; // don't scroll during SetYOffset in UpdateScrollBars
800 pViewShell
->UpdateScrollBars();
804 InvalidateLocationData( SC_HINT_ACC_VISAREACHANGED
);
811 void ScPreview::SetPageNo( long nPage
)
815 UpdateDrawView(); // Tabelle evtl. geaendert
816 InvalidateLocationData( SC_HINT_DATACHANGED
);
821 long ScPreview::GetFirstPage(SCTAB nTabP
)
823 SCTAB nDocTabCount
= pDocShell
->GetDocument()->GetTableCount();
824 if (nTabP
>= nDocTabCount
)
825 nTabP
= nDocTabCount
-1;
831 UpdateDrawView(); // Tabelle evtl. geaendert
833 for (SCTAB i
=0; i
<nTabP
; i
++)
836 // bei leerer Tabelle vorhergehende Seite
838 if ( nPages
[nTabP
]==0 && nPage
> 0 )
846 Size
lcl_GetDocPageSize( ScDocument
* pDoc
, SCTAB nTab
)
848 String aName
= pDoc
->GetPageStyle( nTab
);
849 ScStyleSheetPool
* pStylePool
= pDoc
->GetStyleSheetPool();
850 SfxStyleSheetBase
* pStyleSheet
= pStylePool
->Find( aName
, SFX_STYLE_FAMILY_PAGE
);
853 SfxItemSet
& rStyleSet
= pStyleSheet
->GetItemSet();
854 return ((const SvxSizeItem
&) rStyleSet
.Get(ATTR_PAGE_SIZE
)).GetSize();
858 DBG_ERROR( "PageStyle not found" );
864 USHORT
ScPreview::GetOptimalZoom(BOOL bWidthOnly
)
866 double nWinScaleX
= ScGlobal::nScreenPPTX
/ pDocShell
->GetOutputFactor();
867 double nWinScaleY
= ScGlobal::nScreenPPTY
;
868 Size aWinSize
= GetOutputSizePixel();
870 // desired margin is 0.25cm in default MapMode (like Writer),
871 // but some additional margin is introduced by integer scale values
872 // -> add only 0.10cm, so there is some margin in all cases.
873 Size
aMarginSize( LogicToPixel( Size( 100, 100 ), MAP_100TH_MM
) );
874 aWinSize
.Width() -= 2 * aMarginSize
.Width();
875 aWinSize
.Height() -= 2 * aMarginSize
.Height();
877 Size aLocalPageSize
= lcl_GetDocPageSize( pDocShell
->GetDocument(), nTab
);
878 if ( aLocalPageSize
.Width() && aLocalPageSize
.Height() )
880 long nZoomX
= (long) ( aWinSize
.Width() * 100 / ( aLocalPageSize
.Width() * nWinScaleX
));
881 long nZoomY
= (long) ( aWinSize
.Height() * 100 / ( aLocalPageSize
.Height() * nWinScaleY
));
883 long nOptimal
= nZoomX
;
884 if (!bWidthOnly
&& nZoomY
<nOptimal
)
892 return (USHORT
) nOptimal
;
899 void ScPreview::SetXOffset( long nX
)
901 if ( aOffset
.X() == nX
)
906 long nDif
= LogicToPixel(aOffset
).X() - LogicToPixel(Point(nX
,0)).X();
908 if (nDif
&& !bInPaint
)
910 MapMode aOldMode
= GetMapMode(); SetMapMode(MAP_PIXEL
);
912 SetMapMode(aOldMode
);
921 InvalidateLocationData( SC_HINT_ACC_VISAREACHANGED
);
926 void ScPreview::SetYOffset( long nY
)
928 if ( aOffset
.Y() == nY
)
933 long nDif
= LogicToPixel(aOffset
).Y() - LogicToPixel(Point(0,nY
)).Y();
935 if (nDif
&& !bInPaint
)
937 MapMode aOldMode
= GetMapMode(); SetMapMode(MAP_PIXEL
);
939 SetMapMode(aOldMode
);
948 InvalidateLocationData( SC_HINT_ACC_VISAREACHANGED
);
953 void ScPreview::DoInvalidate()
955 // Wenn das ganze aus dem GetState der Shell gerufen wird,
956 // muss das Invalidate hinterher asynchron kommen...
959 Application::PostUserEvent( STATIC_LINK( this, ScPreview
, InvalidateHdl
) );
961 StaticInvalidate(); // sofort
964 void ScPreview::StaticInvalidate()
966 // static method, because it's called asynchronously
967 // -> must use current viewframe
969 SfxViewFrame
* pViewFrm
= SfxViewFrame::Current();
973 SfxBindings
& rBindings
= pViewFrm
->GetBindings();
974 rBindings
.Invalidate(SID_STATUS_DOCPOS
);
975 rBindings
.Invalidate(SID_STATUS_PAGESTYLE
);
976 rBindings
.Invalidate(SID_PREVIEW_PREVIOUS
);
977 rBindings
.Invalidate(SID_PREVIEW_NEXT
);
978 rBindings
.Invalidate(SID_PREVIEW_FIRST
);
979 rBindings
.Invalidate(SID_PREVIEW_LAST
);
980 rBindings
.Invalidate(SID_ATTR_ZOOM
);
981 rBindings
.Invalidate(SID_PREVIEW_ZOOMIN
);
982 rBindings
.Invalidate(SID_PREVIEW_ZOOMOUT
);
983 rBindings
.Invalidate(SID_PREVIEW_SCALINGFACTOR
);
984 rBindings
.Invalidate(SID_ATTR_ZOOMSLIDER
);
987 IMPL_STATIC_LINK( ScPreview
, InvalidateHdl
, void*, EMPTYARG
)
989 (void)pThis
; // avoid warning
995 void ScPreview::DataChanged( const DataChangedEvent
& rDCEvt
)
997 Window::DataChanged(rDCEvt
);
999 if ( (rDCEvt
.GetType() == DATACHANGED_PRINTER
) ||
1000 (rDCEvt
.GetType() == DATACHANGED_DISPLAY
) ||
1001 (rDCEvt
.GetType() == DATACHANGED_FONTS
) ||
1002 (rDCEvt
.GetType() == DATACHANGED_FONTSUBSTITUTION
) ||
1003 ((rDCEvt
.GetType() == DATACHANGED_SETTINGS
) &&
1004 (rDCEvt
.GetFlags() & SETTINGS_STYLE
)) )
1006 if ( rDCEvt
.GetType() == DATACHANGED_FONTS
)
1007 pDocShell
->UpdateFontList();
1009 if ( rDCEvt
.GetType() == DATACHANGED_SETTINGS
&&
1010 (rDCEvt
.GetFlags() & SETTINGS_STYLE
) )
1012 // scroll bar size may have changed
1013 pViewShell
->InvalidateBorder(); // calls OuterResizePixel
1017 InvalidateLocationData( SC_HINT_DATACHANGED
);
1021 //Issue51656 Add resizeable margin on page preview from maoyg
1022 void __EXPORT
ScPreview::MouseButtonDown( const MouseEvent
& rMEvt
)
1024 Fraction
aPreviewZoom( nZoom
, 100 );
1025 Fraction
aHorPrevZoom( (long)( 100 * nZoom
/ pDocShell
->GetOutputFactor() ), 10000 );
1026 MapMode
aMMMode( MAP_100TH_MM
, Point(), aHorPrevZoom
, aPreviewZoom
);
1028 aButtonDownChangePoint
= PixelToLogic( rMEvt
.GetPosPixel(),aMMMode
);
1029 aButtonDownPt
= PixelToLogic( rMEvt
.GetPosPixel(),aMMMode
);
1033 if( rMEvt
.IsLeft() && GetPointer() == POINTER_HSIZEBAR
)
1035 SetMapMode( aMMMode
);
1036 if( bLeftRulerChange
)
1038 DrawInvert( aButtonDownChangePoint
.X(), POINTER_HSIZEBAR
);
1039 bLeftRulerMove
= TRUE
;
1040 bRightRulerMove
= FALSE
;
1042 else if( bRightRulerChange
)
1044 DrawInvert( aButtonDownChangePoint
.X(), POINTER_HSIZEBAR
);
1045 bLeftRulerMove
= FALSE
;
1046 bRightRulerMove
= TRUE
;
1050 if( rMEvt
.IsLeft() && GetPointer() == POINTER_VSIZEBAR
)
1052 SetMapMode( aMMMode
);
1053 if( bTopRulerChange
)
1055 DrawInvert( aButtonDownChangePoint
.Y(), POINTER_VSIZEBAR
);
1056 bTopRulerMove
= TRUE
;
1057 bBottomRulerMove
= FALSE
;
1059 else if( bBottomRulerChange
)
1061 DrawInvert( aButtonDownChangePoint
.Y(), POINTER_VSIZEBAR
);
1062 bTopRulerMove
= FALSE
;
1063 bBottomRulerMove
= TRUE
;
1065 else if( bHeaderRulerChange
)
1067 DrawInvert( aButtonDownChangePoint
.Y(), POINTER_VSIZEBAR
);
1068 bHeaderRulerMove
= TRUE
;
1069 bFooterRulerMove
= FALSE
;
1071 else if( bFooterRulerChange
)
1073 DrawInvert( aButtonDownChangePoint
.Y(), POINTER_VSIZEBAR
);
1074 bHeaderRulerMove
= FALSE
;
1075 bFooterRulerMove
= TRUE
;
1079 if( rMEvt
.IsLeft() && GetPointer() == POINTER_HSPLIT
)
1081 Point aNowPt
= rMEvt
.GetPosPixel();
1083 for( i
= aPageArea
.aStart
.Col(); i
<= aPageArea
.aEnd
.Col(); i
++ )
1085 if( aNowPt
.X() < nRight
[i
] + 2 && aNowPt
.X() > nRight
[i
] - 2 )
1087 nColNumberButttonDown
= i
;
1091 if( i
== aPageArea
.aEnd
.Col()+1 )
1094 SetMapMode( aMMMode
);
1095 if( nColNumberButttonDown
== aPageArea
.aStart
.Col() )
1096 DrawInvert( PixelToLogic( Point( nLeftPosition
, 0 ),aMMMode
).X() ,POINTER_HSPLIT
);
1098 DrawInvert( PixelToLogic( Point( nRight
[ nColNumberButttonDown
-1 ], 0 ),aMMMode
).X() ,POINTER_HSPLIT
);
1100 DrawInvert( aButtonDownChangePoint
.X(), POINTER_HSPLIT
);
1101 bColRulerMove
= TRUE
;
1105 void __EXPORT
ScPreview::MouseButtonUp( const MouseEvent
& rMEvt
)
1107 Fraction
aPreviewZoom( nZoom
, 100 );
1108 Fraction
aHorPrevZoom( (long)( 100 * nZoom
/ pDocShell
->GetOutputFactor() ), 10000 );
1109 MapMode
aMMMode( MAP_100TH_MM
, Point(), aHorPrevZoom
, aPreviewZoom
);
1111 aButtonUpPt
= PixelToLogic( rMEvt
.GetPosPixel(),aMMMode
);
1113 long nWidth
= (long) lcl_GetDocPageSize(pDocShell
->GetDocument(), nTab
).Width();
1114 long nHeight
= (long) lcl_GetDocPageSize(pDocShell
->GetDocument(), nTab
).Height();
1116 if( rMEvt
.IsLeft() && GetPointer() == POINTER_HSIZEBAR
)
1118 SetPointer( Pointer( POINTER_ARROW
) );
1120 BOOL bMoveRulerAction
= TRUE
;
1122 ScDocument
* pDoc
= pDocShell
->GetDocument();
1123 String aOldName
= pDoc
->GetPageStyle( nTab
);
1124 BOOL
bUndo( pDoc
->IsUndoEnabled() );
1125 ScStyleSheetPool
* pStylePool
= pDoc
->GetStyleSheetPool();
1126 SfxStyleSheetBase
* pStyleSheet
= pStylePool
->Find( aOldName
, SFX_STYLE_FAMILY_PAGE
);
1130 ScStyleSaveData aOldData
;
1132 aOldData
.InitFromStyle( pStyleSheet
);
1134 SfxItemSet
& rStyleSet
= pStyleSheet
->GetItemSet();
1136 SvxLRSpaceItem aLRItem
= ( const SvxLRSpaceItem
& ) rStyleSet
.Get( ATTR_LRSPACE
);
1138 if(( bLeftRulerChange
|| bRightRulerChange
) && ( aButtonUpPt
.X() <= ( 0 - aOffset
.X() ) || aButtonUpPt
.X() > nWidth
* HMM_PER_TWIPS
- aOffset
.X() ) )
1140 bMoveRulerAction
= FALSE
;
1141 Paint(Rectangle(0,0,10000,10000));
1143 else if( bLeftRulerChange
&& ( aButtonUpPt
.X() / HMM_PER_TWIPS
> nWidth
- aLRItem
.GetRight() - aOffset
.X() / HMM_PER_TWIPS
) )
1145 bMoveRulerAction
= FALSE
;
1146 Paint(Rectangle(0,0,10000,10000));
1148 else if( bRightRulerChange
&& ( aButtonUpPt
.X() / HMM_PER_TWIPS
< aLRItem
.GetLeft() - aOffset
.X() / HMM_PER_TWIPS
) )
1150 bMoveRulerAction
= FALSE
;
1151 Paint(Rectangle(0,0,10000,10000));
1153 else if( aButtonDownPt
.X() == aButtonUpPt
.X() )
1155 bMoveRulerAction
= FALSE
;
1156 DrawInvert( aButtonUpPt
.X(), POINTER_HSIZEBAR
);
1158 if( bMoveRulerAction
)
1160 if( bLeftRulerChange
&& bLeftRulerMove
)
1162 aLRItem
.SetLeft( (long)( aButtonUpPt
.X() / HMM_PER_TWIPS
+ aOffset
.X() / HMM_PER_TWIPS
));
1163 rStyleSet
.Put( aLRItem
);
1165 else if( bRightRulerChange
&& bRightRulerMove
)
1167 aLRItem
.SetRight( (long)( nWidth
- aButtonUpPt
.X() / HMM_PER_TWIPS
- aOffset
.X() / HMM_PER_TWIPS
));
1168 rStyleSet
.Put( aLRItem
);
1171 ScStyleSaveData aNewData
;
1172 aNewData
.InitFromStyle( pStyleSheet
);
1175 pDocShell
->GetUndoManager()->AddUndoAction(
1176 new ScUndoModifyStyle( pDocShell
, SFX_STYLE_FAMILY_PAGE
,
1177 aOldData
, aNewData
) );
1180 if ( ValidTab( nTab
) )
1182 ScPrintFunc
aPrintFunc( pDocShell
, this, nTab
);
1183 aPrintFunc
.UpdatePages();
1186 Rectangle
aRect(0,0,10000,10000);
1188 bLeftRulerChange
= FALSE
;
1189 bRightRulerChange
= FALSE
;
1192 bLeftRulerMove
= FALSE
;
1193 bRightRulerMove
= FALSE
;
1196 if( rMEvt
.IsLeft() && GetPointer() == POINTER_VSIZEBAR
)
1198 SetPointer( POINTER_ARROW
);
1200 BOOL bMoveRulerAction
= TRUE
;
1201 if( ( bTopRulerChange
|| bBottomRulerChange
|| bHeaderRulerChange
|| bFooterRulerChange
) && ( aButtonUpPt
.Y() <= ( 0 - aOffset
.Y() ) || aButtonUpPt
.Y() > nHeight
* HMM_PER_TWIPS
-aOffset
.Y() ) )
1203 bMoveRulerAction
= FALSE
;
1204 Paint( Rectangle(0,0,10000,10000) );
1206 else if( aButtonDownPt
.Y() == aButtonUpPt
.Y() )
1208 bMoveRulerAction
= FALSE
;
1209 DrawInvert( aButtonUpPt
.Y(), POINTER_VSIZEBAR
);
1211 if( bMoveRulerAction
)
1213 ScDocument
* pDoc
= pDocShell
->GetDocument();
1214 BOOL
bUndo( pDoc
->IsUndoEnabled() );
1215 ScStyleSheetPool
* pStylePool
= pDoc
->GetStyleSheetPool();
1216 SfxStyleSheetBase
* pStyleSheet
= pStylePool
->Find( pDoc
->GetPageStyle( nTab
), SFX_STYLE_FAMILY_PAGE
);
1217 DBG_ASSERT( pStyleSheet
, "PageStyle not found" );
1220 ScStyleSaveData aOldData
;
1222 aOldData
.InitFromStyle( pStyleSheet
);
1224 SfxItemSet
& rStyleSet
= pStyleSheet
->GetItemSet();
1226 SvxULSpaceItem aULItem
= ( const SvxULSpaceItem
&)rStyleSet
.Get( ATTR_ULSPACE
);
1228 if( bTopRulerMove
&& bTopRulerChange
)
1230 aULItem
.SetUpperValue( (USHORT
)( aButtonUpPt
.Y() / HMM_PER_TWIPS
+ aOffset
.Y() / HMM_PER_TWIPS
) );
1231 rStyleSet
.Put( aULItem
);
1233 else if( bBottomRulerMove
&& bBottomRulerChange
)
1235 aULItem
.SetLowerValue( (USHORT
)( nHeight
- aButtonUpPt
.Y() / HMM_PER_TWIPS
- aOffset
.Y() / HMM_PER_TWIPS
) );
1236 rStyleSet
.Put( aULItem
);
1238 else if( bHeaderRulerMove
&& bHeaderRulerChange
)
1240 const SfxPoolItem
* pItem
= NULL
;
1241 if ( rStyleSet
.GetItemState( ATTR_PAGE_HEADERSET
, FALSE
, &pItem
) == SFX_ITEM_SET
)
1243 SfxItemSet
& pHeaderSet
= ((SvxSetItem
*)pItem
)->GetItemSet();
1244 Size aHeaderSize
= ((const SvxSizeItem
&)pHeaderSet
.Get(ATTR_PAGE_SIZE
)).GetSize();
1245 aHeaderSize
.Height() = (long)( aButtonUpPt
.Y() / HMM_PER_TWIPS
+ aOffset
.Y() / HMM_PER_TWIPS
- aULItem
.GetUpper());
1246 aHeaderSize
.Height() = aHeaderSize
.Height() * 100 / mnScale
;
1247 SvxSetItem
aNewHeader( (const SvxSetItem
&)rStyleSet
.Get(ATTR_PAGE_HEADERSET
) );
1248 aNewHeader
.GetItemSet().Put( SvxSizeItem( ATTR_PAGE_SIZE
, aHeaderSize
) );
1249 rStyleSet
.Put( aNewHeader
);
1252 else if( bFooterRulerMove
&& bFooterRulerChange
)
1254 const SfxPoolItem
* pItem
= NULL
;
1255 if( rStyleSet
.GetItemState( ATTR_PAGE_FOOTERSET
, FALSE
, &pItem
) == SFX_ITEM_SET
)
1257 SfxItemSet
& pFooterSet
= ((SvxSetItem
*)pItem
)->GetItemSet();
1258 Size aFooterSize
= ((const SvxSizeItem
&)pFooterSet
.Get(ATTR_PAGE_SIZE
)).GetSize();
1259 aFooterSize
.Height() = (long)( nHeight
- aButtonUpPt
.Y() / HMM_PER_TWIPS
- aOffset
.Y() / HMM_PER_TWIPS
- aULItem
.GetLower() );
1260 aFooterSize
.Height() = aFooterSize
.Height() * 100 / mnScale
;
1261 SvxSetItem
aNewFooter( (const SvxSetItem
&)rStyleSet
.Get(ATTR_PAGE_FOOTERSET
) );
1262 aNewFooter
.GetItemSet().Put( SvxSizeItem( ATTR_PAGE_SIZE
, aFooterSize
) );
1263 rStyleSet
.Put( aNewFooter
);
1267 ScStyleSaveData aNewData
;
1268 aNewData
.InitFromStyle( pStyleSheet
);
1271 pDocShell
->GetUndoManager()->AddUndoAction(
1272 new ScUndoModifyStyle( pDocShell
, SFX_STYLE_FAMILY_PAGE
,
1273 aOldData
, aNewData
) );
1276 if ( ValidTab( nTab
) )
1278 ScPrintFunc
aPrintFunc( pDocShell
, this, nTab
);
1279 aPrintFunc
.UpdatePages();
1282 Rectangle
aRect(0,0,10000,10000);
1284 bTopRulerChange
= FALSE
;
1285 bBottomRulerChange
= FALSE
;
1286 bHeaderRulerChange
= FALSE
;
1287 bFooterRulerChange
= FALSE
;
1290 bTopRulerMove
= FALSE
;
1291 bBottomRulerMove
= FALSE
;
1292 bHeaderRulerMove
= FALSE
;
1293 bFooterRulerMove
= FALSE
;
1295 if( rMEvt
.IsLeft() && GetPointer() == POINTER_HSPLIT
)
1297 SetPointer(POINTER_ARROW
);
1298 ScDocument
* pDoc
= pDocShell
->GetDocument();
1299 BOOL bLayoutRTL
= pDoc
->IsLayoutRTL( nTab
);
1300 BOOL bMoveRulerAction
= TRUE
;
1301 if( aButtonDownPt
.X() == aButtonUpPt
.X() )
1303 bMoveRulerAction
= FALSE
;
1304 if( nColNumberButttonDown
== aPageArea
.aStart
.Col() )
1305 DrawInvert( PixelToLogic( Point( nLeftPosition
, 0 ),aMMMode
).X() ,POINTER_HSPLIT
);
1307 DrawInvert( PixelToLogic( Point( nRight
[ nColNumberButttonDown
-1 ], 0 ),aMMMode
).X() ,POINTER_HSPLIT
);
1308 DrawInvert( aButtonUpPt
.X(), POINTER_HSPLIT
);
1310 if( bMoveRulerAction
)
1312 long nNewColWidth
= 0;
1313 ScDocFunc
aFunc(*pDocShell
);
1314 SCCOLROW nCols
[2] = { nColNumberButttonDown
, nColNumberButttonDown
};
1318 nNewColWidth
= (long) ( PixelToLogic( Point( rMEvt
.GetPosPixel().X() - nRight
[ nColNumberButttonDown
], 0), aMMMode
).X() / HMM_PER_TWIPS
) * 100 / mnScale
;
1319 nNewColWidth
+= pDocShell
->GetDocument()->GetColWidth( nColNumberButttonDown
, nTab
);
1324 nNewColWidth
= (long) ( PixelToLogic( Point( nRight
[ nColNumberButttonDown
] - rMEvt
.GetPosPixel().X(), 0), aMMMode
).X() / HMM_PER_TWIPS
) * 100 / mnScale
;
1325 nNewColWidth
+= pDocShell
->GetDocument()->GetColWidth( nColNumberButttonDown
, nTab
);
1328 if( nNewColWidth
>= 0 )
1330 aFunc
.SetWidthOrHeight( TRUE
, 1,nCols
, nTab
, SC_SIZE_DIRECT
, (USHORT
)nNewColWidth
, TRUE
, TRUE
);
1332 if ( ValidTab( nTab
) )
1334 ScPrintFunc
aPrintFunc( pDocShell
, this, nTab
);
1335 aPrintFunc
.UpdatePages();
1337 Rectangle
nRect(0,0,10000,10000);
1340 bColRulerMove
= FALSE
;
1345 void __EXPORT
ScPreview::MouseMove( const MouseEvent
& rMEvt
)
1347 Fraction
aPreviewZoom( nZoom
, 100 );
1348 Fraction
aHorPrevZoom( (long)( 100 * nZoom
/ pDocShell
->GetOutputFactor() ), 10000 );
1349 MapMode
aMMMode( MAP_100TH_MM
, Point(), aHorPrevZoom
, aPreviewZoom
);
1350 Point aMouseMovePoint
= PixelToLogic( rMEvt
.GetPosPixel(), aMMMode
);
1352 long nLeftMargin
= 0;
1353 long nRightMargin
= 0;
1354 long nTopMargin
= 0;
1355 long nBottomMargin
= 0;
1358 long nWidth
= (long) lcl_GetDocPageSize(pDocShell
->GetDocument(), nTab
).Width();
1359 long nHeight
= (long) lcl_GetDocPageSize(pDocShell
->GetDocument(), nTab
).Height();
1361 if ( nPageNo
< nTotalPages
)
1363 ScPrintOptions aOptions
= SC_MOD()->GetPrintOptions();
1365 ScPrintFunc
* pPrintFunc
;
1368 pPrintFunc
= new ScPrintFunc( pDocShell
, this, aState
, &aOptions
);
1370 pPrintFunc
= new ScPrintFunc( pDocShell
, this, nTab
, nFirstAttr
[nTab
], nTotalPages
, NULL
, &aOptions
);
1372 nLeftMargin
= (long)( pPrintFunc
->GetLeftMargin() * HMM_PER_TWIPS
- aOffset
.X() );
1373 nRightMargin
= (long)( pPrintFunc
->GetRightMargin() * HMM_PER_TWIPS
);
1374 nRightMargin
= (long)( nWidth
* HMM_PER_TWIPS
- nRightMargin
- aOffset
.X() );
1375 nTopMargin
= (long)( pPrintFunc
->GetTopMargin() * HMM_PER_TWIPS
- aOffset
.Y() );
1376 nBottomMargin
= (long)( pPrintFunc
->GetBottomMargin() * HMM_PER_TWIPS
);
1377 nBottomMargin
= (long)( nHeight
* HMM_PER_TWIPS
- nBottomMargin
- aOffset
.Y() );
1380 nHeaderHeight
= (long)( nTopMargin
+ pPrintFunc
->GetHeader().nHeight
* HMM_PER_TWIPS
* mnScale
/ 100 );
1381 nFooterHeight
= (long)( nBottomMargin
- pPrintFunc
->GetFooter().nHeight
* HMM_PER_TWIPS
* mnScale
/ 100 );
1385 nHeaderHeight
= (long)( nTopMargin
+ pPrintFunc
->GetHeader().nHeight
* HMM_PER_TWIPS
);
1386 nFooterHeight
= (long)( nBottomMargin
- pPrintFunc
->GetFooter().nHeight
* HMM_PER_TWIPS
);
1391 Point
aPixPt( rMEvt
.GetPosPixel() );
1392 Point aLeftTop
= LogicToPixel( Point( nLeftMargin
, -aOffset
.Y() ) , aMMMode
);
1393 Point aLeftBottom
= LogicToPixel( Point( nLeftMargin
,(long)(nHeight
* HMM_PER_TWIPS
- aOffset
.Y()) ), aMMMode
);
1394 Point aRightTop
= LogicToPixel( Point( nRightMargin
, -aOffset
.Y() ), aMMMode
);
1395 Point aTopLeft
= LogicToPixel( Point( -aOffset
.X(), nTopMargin
), aMMMode
);
1396 Point aTopRight
= LogicToPixel( Point( (long)(nWidth
* HMM_PER_TWIPS
- aOffset
.X()), nTopMargin
), aMMMode
);
1397 Point aBottomLeft
= LogicToPixel( Point( -aOffset
.X(), nBottomMargin
), aMMMode
);
1398 Point aHeaderLeft
= LogicToPixel( Point( -aOffset
.X(), nHeaderHeight
), aMMMode
);
1399 Point aFooderLeft
= LogicToPixel( Point( -aOffset
.X(), nFooterHeight
), aMMMode
);
1401 BOOL bOnColRulerChange
= FALSE
;
1403 for( SCCOL i
=aPageArea
.aStart
.Col(); i
<= aPageArea
.aEnd
.Col(); i
++ )
1405 Point aColumnTop
= LogicToPixel( Point( 0, -aOffset
.Y() ) ,aMMMode
);
1406 Point aColumnBottom
= LogicToPixel( Point( 0, (long)( nHeight
* HMM_PER_TWIPS
- aOffset
.Y()) ), aMMMode
);
1407 if( aPixPt
.X() < ( nRight
[i
] + 2 ) && ( aPixPt
.X() > ( nRight
[i
] - 2 ) ) && ( aPixPt
.X() < aRightTop
.X() ) && ( aPixPt
.X() > aLeftTop
.X() )
1408 && ( aPixPt
.Y() > aColumnTop
.Y() ) && ( aPixPt
.Y() < aColumnBottom
.Y() ) && !bLeftRulerMove
&& !bRightRulerMove
1409 && !bTopRulerMove
&& !bBottomRulerMove
&& !bHeaderRulerMove
&& !bFooterRulerMove
)
1411 bOnColRulerChange
= TRUE
;
1412 if( !rMEvt
.GetButtons() && GetPointer() == POINTER_HSPLIT
)
1413 nColNumberButttonDown
= i
;
1418 if( aPixPt
.X() < ( aLeftTop
.X() + 2 ) && aPixPt
.X() > ( aLeftTop
.X() - 2 ) && !bRightRulerMove
)
1420 bLeftRulerChange
= TRUE
;
1421 bRightRulerChange
= FALSE
;
1423 else if( aPixPt
.X() < ( aRightTop
.X() + 2 ) && aPixPt
.X() > ( aRightTop
.X() - 2 ) && !bLeftRulerMove
)
1425 bLeftRulerChange
= FALSE
;
1426 bRightRulerChange
= TRUE
;
1428 else if( aPixPt
.Y() < ( aTopLeft
.Y() + 2 ) && aPixPt
.Y() > ( aTopLeft
.Y() - 2 ) && !bBottomRulerMove
&& !bHeaderRulerMove
&& !bFooterRulerMove
)
1430 bTopRulerChange
= TRUE
;
1431 bBottomRulerChange
= FALSE
;
1432 bHeaderRulerChange
= FALSE
;
1433 bFooterRulerChange
= FALSE
;
1435 else if( aPixPt
.Y() < ( aBottomLeft
.Y() + 2 ) && aPixPt
.Y() > ( aBottomLeft
.Y() - 2 ) && !bTopRulerMove
&& !bHeaderRulerMove
&& !bFooterRulerMove
)
1437 bTopRulerChange
= FALSE
;
1438 bBottomRulerChange
= TRUE
;
1439 bHeaderRulerChange
= FALSE
;
1440 bFooterRulerChange
= FALSE
;
1442 else if( aPixPt
.Y() < ( aHeaderLeft
.Y() + 2 ) && aPixPt
.Y() > ( aHeaderLeft
.Y() - 2 ) && !bTopRulerMove
&& !bBottomRulerMove
&& !bFooterRulerMove
)
1444 bTopRulerChange
= FALSE
;
1445 bBottomRulerChange
= FALSE
;
1446 bHeaderRulerChange
= TRUE
;
1447 bFooterRulerChange
= FALSE
;
1449 else if( aPixPt
.Y() < ( aFooderLeft
.Y() + 2 ) && aPixPt
.Y() > ( aFooderLeft
.Y() - 2 ) && !bTopRulerMove
&& !bBottomRulerMove
&& !bHeaderRulerMove
)
1451 bTopRulerChange
= FALSE
;
1452 bBottomRulerChange
= FALSE
;
1453 bHeaderRulerChange
= FALSE
;
1454 bFooterRulerChange
= TRUE
;
1459 if(( (aPixPt
.X() < ( aLeftTop
.X() + 2 ) && aPixPt
.X() > ( aLeftTop
.X() - 2 )) || bLeftRulerMove
||
1460 ( aPixPt
.X() < ( aRightTop
.X() + 2 ) && aPixPt
.X() > ( aRightTop
.X() - 2 ) ) || bRightRulerMove
|| bOnColRulerChange
|| bColRulerMove
)
1461 && aPixPt
.Y() > aLeftTop
.Y() && aPixPt
.Y() < aLeftBottom
.Y() )
1463 if( bOnColRulerChange
|| bColRulerMove
)
1465 SetPointer( Pointer( POINTER_HSPLIT
) );
1468 if( aMouseMovePoint
.X() > -aOffset
.X() && aMouseMovePoint
.X() < nWidth
* HMM_PER_TWIPS
- aOffset
.X() )
1469 DragMove( aMouseMovePoint
.X(), POINTER_HSPLIT
);
1474 if( bLeftRulerChange
&& !bTopRulerMove
&& !bBottomRulerMove
&& !bHeaderRulerMove
&& !bFooterRulerMove
)
1476 SetPointer( Pointer( POINTER_HSIZEBAR
) );
1477 if( bLeftRulerMove
)
1479 if( aMouseMovePoint
.X() > -aOffset
.X() && aMouseMovePoint
.X() < nWidth
* HMM_PER_TWIPS
- aOffset
.X() )
1480 DragMove( aMouseMovePoint
.X(), POINTER_HSIZEBAR
);
1483 else if( bRightRulerChange
&& !bTopRulerMove
&& !bBottomRulerMove
&& !bHeaderRulerMove
&& !bFooterRulerMove
)
1485 SetPointer( Pointer( POINTER_HSIZEBAR
) );
1486 if( bRightRulerMove
)
1488 if( aMouseMovePoint
.X() > -aOffset
.X() && aMouseMovePoint
.X() < nWidth
* HMM_PER_TWIPS
- aOffset
.X() )
1489 DragMove( aMouseMovePoint
.X(), POINTER_HSIZEBAR
);
1496 if( ( ( aPixPt
.Y() < ( aTopLeft
.Y() + 2 ) && aPixPt
.Y() > ( aTopLeft
.Y() - 2 ) ) || bTopRulerMove
||
1497 ( aPixPt
.Y() < ( aBottomLeft
.Y() + 2 ) && aPixPt
.Y() > ( aBottomLeft
.Y() - 2 ) ) || bBottomRulerMove
||
1498 ( aPixPt
.Y() < ( aHeaderLeft
.Y() + 2 ) && aPixPt
.Y() > ( aHeaderLeft
.Y() - 2 ) ) || bHeaderRulerMove
||
1499 ( aPixPt
.Y() < ( aFooderLeft
.Y() + 2 ) && aPixPt
.Y() > ( aFooderLeft
.Y() - 2 ) ) || bFooterRulerMove
)
1500 && aPixPt
.X() > aTopLeft
.X() && aPixPt
.X() < aTopRight
.X() )
1502 if( bTopRulerChange
)
1504 SetPointer( Pointer( POINTER_VSIZEBAR
) );
1507 if( aMouseMovePoint
.Y() > -aOffset
.Y() && aMouseMovePoint
.Y() < nHeight
* HMM_PER_TWIPS
- aOffset
.Y() )
1508 DragMove( aMouseMovePoint
.Y(), POINTER_VSIZEBAR
);
1511 else if( bBottomRulerChange
)
1513 SetPointer( Pointer( POINTER_VSIZEBAR
) );
1514 if( bBottomRulerMove
)
1516 if( aMouseMovePoint
.Y() > -aOffset
.Y() && aMouseMovePoint
.Y() < nHeight
* HMM_PER_TWIPS
- aOffset
.Y() )
1517 DragMove( aMouseMovePoint
.Y(), POINTER_VSIZEBAR
);
1520 else if( bHeaderRulerChange
)
1522 SetPointer( Pointer( POINTER_VSIZEBAR
) );
1523 if( bHeaderRulerMove
)
1525 if( aMouseMovePoint
.Y() > -aOffset
.Y() && aMouseMovePoint
.Y() < nHeight
* HMM_PER_TWIPS
- aOffset
.Y() )
1526 DragMove( aMouseMovePoint
.Y(), POINTER_VSIZEBAR
);
1529 else if( bFooterRulerChange
)
1531 SetPointer( Pointer( POINTER_VSIZEBAR
) );
1532 if( bFooterRulerMove
)
1534 if( aMouseMovePoint
.Y() > -aOffset
.Y() && aMouseMovePoint
.Y() < nHeight
* HMM_PER_TWIPS
- aOffset
.Y() )
1535 DragMove( aMouseMovePoint
.Y(), POINTER_VSIZEBAR
);
1540 SetPointer( Pointer( POINTER_ARROW
) );
1544 //Issue51656 Add resizeable margin on page preview from maoyg
1545 void ScPreview::InvalidateLocationData(ULONG nId
)
1547 bLocationValid
= FALSE
;
1548 if (pViewShell
->HasAccessibilityObjects())
1549 pViewShell
->BroadcastAccessibility( SfxSimpleHint( nId
) );
1552 void ScPreview::GetFocus()
1554 if (pViewShell
->HasAccessibilityObjects())
1555 pViewShell
->BroadcastAccessibility( ScAccWinFocusGotHint(GetAccessible()) );
1558 void ScPreview::LoseFocus()
1560 if (pViewShell
->HasAccessibilityObjects())
1561 pViewShell
->BroadcastAccessibility( ScAccWinFocusLostHint(GetAccessible()) );
1564 com::sun::star::uno::Reference
<com::sun::star::accessibility::XAccessible
> ScPreview::CreateAccessible()
1566 ScAccessibleDocumentPagePreview
* pAccessible
=
1567 new ScAccessibleDocumentPagePreview( GetAccessibleParentWindow()->GetAccessible(), pViewShell
);
1568 com::sun::star::uno::Reference
< com::sun::star::accessibility::XAccessible
> xAccessible
= pAccessible
;
1569 pAccessible
->Init();
1573 //Issue51656 Add resizeable margin on page preview from maoyg
1574 void ScPreview::DragMove( long nDragMovePos
, USHORT nFlags
)
1576 Fraction
aPreviewZoom( nZoom
, 100 );
1577 Fraction
aHorPrevZoom( (long)( 100 * nZoom
/ pDocShell
->GetOutputFactor() ), 10000 );
1578 MapMode
aMMMode( MAP_100TH_MM
, Point(), aHorPrevZoom
, aPreviewZoom
);
1579 SetMapMode( aMMMode
);
1580 long nPos
= nDragMovePos
;
1581 if( nFlags
== POINTER_HSIZEBAR
|| nFlags
== POINTER_HSPLIT
)
1583 if( nDragMovePos
!= aButtonDownChangePoint
.X() )
1585 DrawInvert( aButtonDownChangePoint
.X(), nFlags
);
1586 aButtonDownChangePoint
.X() = nPos
;
1587 DrawInvert( aButtonDownChangePoint
.X(), nFlags
);
1590 else if( nFlags
== POINTER_VSIZEBAR
)
1592 if( nDragMovePos
!= aButtonDownChangePoint
.Y() )
1594 DrawInvert( aButtonDownChangePoint
.Y(), nFlags
);
1595 aButtonDownChangePoint
.Y() = nPos
;
1596 DrawInvert( aButtonDownChangePoint
.Y(), nFlags
);
1601 void ScPreview::DrawInvert( long nDragPos
, USHORT nFlags
)
1603 long nHeight
= (long) lcl_GetDocPageSize( pDocShell
->GetDocument(), nTab
).Height();
1604 long nWidth
= (long) lcl_GetDocPageSize( pDocShell
->GetDocument(), nTab
).Width();
1605 if( nFlags
== POINTER_HSIZEBAR
|| nFlags
== POINTER_HSPLIT
)
1607 Rectangle
aRect( nDragPos
, -aOffset
.Y(), nDragPos
+ 1,(long)( ( nHeight
* HMM_PER_TWIPS
) - aOffset
.Y()));
1608 Invert( aRect
,INVERT_50
);
1610 else if( nFlags
== POINTER_VSIZEBAR
)
1612 Rectangle
aRect( -aOffset
.X(), nDragPos
,(long)( ( nWidth
* HMM_PER_TWIPS
) - aOffset
.X() ), nDragPos
+ 1 );
1613 Invert( aRect
,INVERT_50
);
1616 //Issue51656 Add resizeable margin on page preview from maoyg