1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_sw.hxx"
26*b1cdbd2cSJim Jagielski #include <pagepreviewlayout.hxx>
27*b1cdbd2cSJim Jagielski #ifndef _PREVWPAGE_HXX
28*b1cdbd2cSJim Jagielski #include <prevwpage.hxx>
29*b1cdbd2cSJim Jagielski #endif
30*b1cdbd2cSJim Jagielski 
31*b1cdbd2cSJim Jagielski #include <algorithm>
32*b1cdbd2cSJim Jagielski #include <vcl/window.hxx>
33*b1cdbd2cSJim Jagielski #include <rootfrm.hxx>
34*b1cdbd2cSJim Jagielski #include <pagefrm.hxx>
35*b1cdbd2cSJim Jagielski #include <viewsh.hxx>
36*b1cdbd2cSJim Jagielski #include <viewimp.hxx>
37*b1cdbd2cSJim Jagielski #include <viewopt.hxx>
38*b1cdbd2cSJim Jagielski #include <swregion.hxx>
39*b1cdbd2cSJim Jagielski #ifndef _COMCORE_HRC
40*b1cdbd2cSJim Jagielski #include <comcore.hrc>
41*b1cdbd2cSJim Jagielski #endif
42*b1cdbd2cSJim Jagielski // OD 19.02.2003 #107369# - method <SwAlignRect(..)>
43*b1cdbd2cSJim Jagielski #include <frmtool.hxx>
44*b1cdbd2cSJim Jagielski // OD 24.09.2003 #i19975#
45*b1cdbd2cSJim Jagielski #include <svx/zoomitem.hxx>
46*b1cdbd2cSJim Jagielski #include <printdata.hxx>
47*b1cdbd2cSJim Jagielski 
48*b1cdbd2cSJim Jagielski #include <IDocumentDeviceAccess.hxx>
49*b1cdbd2cSJim Jagielski 
50*b1cdbd2cSJim Jagielski // OD 20.02.2003 #107369# - method to update statics for paint
51*b1cdbd2cSJim Jagielski // Note: method defined in '/sw/source/core/layout/paintfrm.cxx'
52*b1cdbd2cSJim Jagielski extern void SwCalcPixStatics( OutputDevice *pOut );
53*b1cdbd2cSJim Jagielski 
54*b1cdbd2cSJim Jagielski // =============================================================================
55*b1cdbd2cSJim Jagielski // methods to initialize page preview layout
56*b1cdbd2cSJim Jagielski // =============================================================================
SwPagePreviewLayout(ViewShell & _rParentViewShell,const SwRootFrm & _rLayoutRootFrm)57*b1cdbd2cSJim Jagielski SwPagePreviewLayout::SwPagePreviewLayout( ViewShell& _rParentViewShell,
58*b1cdbd2cSJim Jagielski                                           const SwRootFrm& _rLayoutRootFrm )
59*b1cdbd2cSJim Jagielski     : mnXFree ( 4*142 ),
60*b1cdbd2cSJim Jagielski       mnYFree ( 4*142 ),
61*b1cdbd2cSJim Jagielski       mrParentViewShell( _rParentViewShell ),
62*b1cdbd2cSJim Jagielski       mrLayoutRootFrm ( _rLayoutRootFrm )
63*b1cdbd2cSJim Jagielski {
64*b1cdbd2cSJim Jagielski     _Clear();
65*b1cdbd2cSJim Jagielski 
66*b1cdbd2cSJim Jagielski     // OD 2004-03-05 #i18143#
67*b1cdbd2cSJim Jagielski     mbBookPreview = false;
68*b1cdbd2cSJim Jagielski     mbBookPreviewModeToggled = false;
69*b1cdbd2cSJim Jagielski 
70*b1cdbd2cSJim Jagielski     mbPrintEmptyPages = mrParentViewShell.getIDocumentDeviceAccess()->getPrintData().IsPrintEmptyPages();
71*b1cdbd2cSJim Jagielski }
72*b1cdbd2cSJim Jagielski 
_Clear()73*b1cdbd2cSJim Jagielski void SwPagePreviewLayout::_Clear()
74*b1cdbd2cSJim Jagielski {
75*b1cdbd2cSJim Jagielski     mbLayoutInfoValid = mbLayoutSizesValid = mbPaintInfoValid = false;
76*b1cdbd2cSJim Jagielski 
77*b1cdbd2cSJim Jagielski     maWinSize.Width() = 0;
78*b1cdbd2cSJim Jagielski     maWinSize.Height() = 0;
79*b1cdbd2cSJim Jagielski     mnCols = mnRows = 0;
80*b1cdbd2cSJim Jagielski 
81*b1cdbd2cSJim Jagielski     _ClearPrevwLayoutSizes();
82*b1cdbd2cSJim Jagielski 
83*b1cdbd2cSJim Jagielski     mbDoesLayoutRowsFitIntoWindow = false;
84*b1cdbd2cSJim Jagielski     mbDoesLayoutColsFitIntoWindow = false;
85*b1cdbd2cSJim Jagielski 
86*b1cdbd2cSJim Jagielski     mnPaintPhyStartPageNum = 0;
87*b1cdbd2cSJim Jagielski     mnPaintStartCol = mnPaintStartRow = 0;
88*b1cdbd2cSJim Jagielski     mbNoPageVisible = false;
89*b1cdbd2cSJim Jagielski     maPaintStartPageOffset.X() = 0;
90*b1cdbd2cSJim Jagielski     maPaintStartPageOffset.Y() = 0;
91*b1cdbd2cSJim Jagielski     maPaintPreviewDocOffset.X() = 0;
92*b1cdbd2cSJim Jagielski     maPaintPreviewDocOffset.Y() = 0;
93*b1cdbd2cSJim Jagielski     maAdditionalPaintOffset.X() = 0;
94*b1cdbd2cSJim Jagielski     maAdditionalPaintOffset.Y() = 0;
95*b1cdbd2cSJim Jagielski     maPaintedPrevwDocRect.Left() = 0;
96*b1cdbd2cSJim Jagielski     maPaintedPrevwDocRect.Top() = 0;
97*b1cdbd2cSJim Jagielski     maPaintedPrevwDocRect.Right() = 0;
98*b1cdbd2cSJim Jagielski     maPaintedPrevwDocRect.Bottom() = 0;
99*b1cdbd2cSJim Jagielski     mnSelectedPageNum = 0;
100*b1cdbd2cSJim Jagielski     _ClearPrevwPageData();
101*b1cdbd2cSJim Jagielski 
102*b1cdbd2cSJim Jagielski     // OD 07.11.2003 #i22014#
103*b1cdbd2cSJim Jagielski     mbInPaint = false;
104*b1cdbd2cSJim Jagielski     mbNewLayoutDuringPaint = false;
105*b1cdbd2cSJim Jagielski }
106*b1cdbd2cSJim Jagielski 
_ClearPrevwLayoutSizes()107*b1cdbd2cSJim Jagielski void SwPagePreviewLayout::_ClearPrevwLayoutSizes()
108*b1cdbd2cSJim Jagielski {
109*b1cdbd2cSJim Jagielski     mnPages = 0;
110*b1cdbd2cSJim Jagielski 
111*b1cdbd2cSJim Jagielski     maMaxPageSize.Width() = 0;
112*b1cdbd2cSJim Jagielski     maMaxPageSize.Height() = 0;
113*b1cdbd2cSJim Jagielski     maPreviewDocRect.Left() = maPreviewDocRect.Top() = 0;
114*b1cdbd2cSJim Jagielski     maPreviewDocRect.Right() = maPreviewDocRect.Bottom() = 0;
115*b1cdbd2cSJim Jagielski     mnColWidth = mnRowHeight = 0;
116*b1cdbd2cSJim Jagielski     mnPrevwLayoutWidth = mnPrevwLayoutHeight = 0;
117*b1cdbd2cSJim Jagielski }
118*b1cdbd2cSJim Jagielski 
_ClearPrevwPageData()119*b1cdbd2cSJim Jagielski void SwPagePreviewLayout::_ClearPrevwPageData()
120*b1cdbd2cSJim Jagielski {
121*b1cdbd2cSJim Jagielski     for ( std::vector<PrevwPage*>::iterator aPageDelIter = maPrevwPages.begin();
122*b1cdbd2cSJim Jagielski           aPageDelIter != maPrevwPages.end();
123*b1cdbd2cSJim Jagielski           ++aPageDelIter )
124*b1cdbd2cSJim Jagielski     {
125*b1cdbd2cSJim Jagielski         delete (*aPageDelIter);
126*b1cdbd2cSJim Jagielski     }
127*b1cdbd2cSJim Jagielski     maPrevwPages.clear();
128*b1cdbd2cSJim Jagielski }
129*b1cdbd2cSJim Jagielski 
130*b1cdbd2cSJim Jagielski /** calculate page preview layout sizes
131*b1cdbd2cSJim Jagielski 
132*b1cdbd2cSJim Jagielski     OD 18.12.2002 #103492#
133*b1cdbd2cSJim Jagielski 
134*b1cdbd2cSJim Jagielski     @author OD
135*b1cdbd2cSJim Jagielski */
_CalcPrevwLayoutSizes()136*b1cdbd2cSJim Jagielski void SwPagePreviewLayout::_CalcPrevwLayoutSizes()
137*b1cdbd2cSJim Jagielski {
138*b1cdbd2cSJim Jagielski     // calculate maximal page size; calculate also number of pages
139*b1cdbd2cSJim Jagielski 
140*b1cdbd2cSJim Jagielski     const SwPageFrm* pPage = static_cast<const SwPageFrm*>(mrLayoutRootFrm.Lower());
141*b1cdbd2cSJim Jagielski     while ( pPage )
142*b1cdbd2cSJim Jagielski     {
143*b1cdbd2cSJim Jagielski         if ( !mbBookPreview && !mbPrintEmptyPages && pPage->IsEmptyPage() )
144*b1cdbd2cSJim Jagielski         {
145*b1cdbd2cSJim Jagielski             pPage = static_cast<const SwPageFrm*>(pPage->GetNext());
146*b1cdbd2cSJim Jagielski             continue;
147*b1cdbd2cSJim Jagielski         }
148*b1cdbd2cSJim Jagielski 
149*b1cdbd2cSJim Jagielski         ++mnPages;
150*b1cdbd2cSJim Jagielski         pPage->Calc();
151*b1cdbd2cSJim Jagielski         const Size& rPageSize = pPage->Frm().SSize();
152*b1cdbd2cSJim Jagielski         if ( rPageSize.Width() > maMaxPageSize.Width() )
153*b1cdbd2cSJim Jagielski             maMaxPageSize.Width() = rPageSize.Width();
154*b1cdbd2cSJim Jagielski         if ( rPageSize.Height() > maMaxPageSize.Height() )
155*b1cdbd2cSJim Jagielski             maMaxPageSize.Height() = rPageSize.Height();
156*b1cdbd2cSJim Jagielski         pPage = static_cast<const SwPageFrm*>(pPage->GetNext());
157*b1cdbd2cSJim Jagielski     }
158*b1cdbd2cSJim Jagielski     // calculate and set column width and row height
159*b1cdbd2cSJim Jagielski     mnColWidth = maMaxPageSize.Width() + mnXFree;
160*b1cdbd2cSJim Jagielski     mnRowHeight = maMaxPageSize.Height() + mnYFree;
161*b1cdbd2cSJim Jagielski 
162*b1cdbd2cSJim Jagielski     // calculate and set preview layout width and height
163*b1cdbd2cSJim Jagielski     mnPrevwLayoutWidth = mnCols * mnColWidth + mnXFree;
164*b1cdbd2cSJim Jagielski     mnPrevwLayoutHeight = mnRows * mnRowHeight + mnYFree;
165*b1cdbd2cSJim Jagielski 
166*b1cdbd2cSJim Jagielski     // calculate document rectangle in preview layout
167*b1cdbd2cSJim Jagielski     {
168*b1cdbd2cSJim Jagielski         Size aDocSize;
169*b1cdbd2cSJim Jagielski         // document width
170*b1cdbd2cSJim Jagielski         aDocSize.Width() = mnPrevwLayoutWidth;
171*b1cdbd2cSJim Jagielski 
172*b1cdbd2cSJim Jagielski         // document height
173*b1cdbd2cSJim Jagielski         // determine number of rows needed for <nPages> in preview layout
174*b1cdbd2cSJim Jagielski         // OD 19.02.2003 #107369# - use method <GetRowOfPage(..)>.
175*b1cdbd2cSJim Jagielski         sal_uInt16 nDocRows = GetRowOfPage( mnPages );
176*b1cdbd2cSJim Jagielski         aDocSize.Height() = nDocRows * maMaxPageSize.Height() +
177*b1cdbd2cSJim Jagielski                             (nDocRows+1) * mnYFree;
178*b1cdbd2cSJim Jagielski         maPreviewDocRect.SetPos( Point( 0, 0 ) );
179*b1cdbd2cSJim Jagielski         maPreviewDocRect.SetSize( aDocSize );
180*b1cdbd2cSJim Jagielski     }
181*b1cdbd2cSJim Jagielski }
182*b1cdbd2cSJim Jagielski 
183*b1cdbd2cSJim Jagielski /** init page preview layout
184*b1cdbd2cSJim Jagielski 
185*b1cdbd2cSJim Jagielski     OD 11.12.2002 #103492#
186*b1cdbd2cSJim Jagielski     initialize the page preview settings for a given layout.
187*b1cdbd2cSJim Jagielski     side effects:
188*b1cdbd2cSJim Jagielski     (1) If parameter <_bCalcScale> is true, mapping mode with calculated
189*b1cdbd2cSJim Jagielski     scaling is set at the output device and the zoom at the view options of
190*b1cdbd2cSJim Jagielski     the given view shell is set with the calculated scaling.
191*b1cdbd2cSJim Jagielski 
192*b1cdbd2cSJim Jagielski     @author OD
193*b1cdbd2cSJim Jagielski */
Init(const sal_uInt16 _nCols,const sal_uInt16 _nRows,const Size & _rPxWinSize,const bool _bCalcScale)194*b1cdbd2cSJim Jagielski bool SwPagePreviewLayout::Init( const sal_uInt16 _nCols,
195*b1cdbd2cSJim Jagielski                                 const sal_uInt16 _nRows,
196*b1cdbd2cSJim Jagielski                                 const Size&      _rPxWinSize,
197*b1cdbd2cSJim Jagielski                                 const bool       _bCalcScale
198*b1cdbd2cSJim Jagielski                               )
199*b1cdbd2cSJim Jagielski {
200*b1cdbd2cSJim Jagielski     // check environment and parameters
201*b1cdbd2cSJim Jagielski     {
202*b1cdbd2cSJim Jagielski         bool bColsRowsValid = (_nCols != 0) && (_nRows != 0);
203*b1cdbd2cSJim Jagielski         ASSERT( bColsRowsValid, "preview layout parameters not correct - preview layout can *not* be initialized" );
204*b1cdbd2cSJim Jagielski         if ( !bColsRowsValid )
205*b1cdbd2cSJim Jagielski             return false;
206*b1cdbd2cSJim Jagielski 
207*b1cdbd2cSJim Jagielski         bool bPxWinSizeValid = (_rPxWinSize.Width() >= 0) &&
208*b1cdbd2cSJim Jagielski                                (_rPxWinSize.Height() >= 0);
209*b1cdbd2cSJim Jagielski         ASSERT( bPxWinSizeValid, "no window size - preview layout can *not* be initialized" );
210*b1cdbd2cSJim Jagielski         if ( !bPxWinSizeValid )
211*b1cdbd2cSJim Jagielski             return false;
212*b1cdbd2cSJim Jagielski     }
213*b1cdbd2cSJim Jagielski 
214*b1cdbd2cSJim Jagielski     // environment and parameters ok
215*b1cdbd2cSJim Jagielski 
216*b1cdbd2cSJim Jagielski     // clear existing preview settings
217*b1cdbd2cSJim Jagielski     _Clear();
218*b1cdbd2cSJim Jagielski 
219*b1cdbd2cSJim Jagielski     // set layout information columns and rows
220*b1cdbd2cSJim Jagielski     mnCols = _nCols;
221*b1cdbd2cSJim Jagielski     mnRows = _nRows;
222*b1cdbd2cSJim Jagielski 
223*b1cdbd2cSJim Jagielski     _CalcPrevwLayoutSizes();
224*b1cdbd2cSJim Jagielski 
225*b1cdbd2cSJim Jagielski     // validate layout information
226*b1cdbd2cSJim Jagielski     mbLayoutInfoValid = true;
227*b1cdbd2cSJim Jagielski 
228*b1cdbd2cSJim Jagielski     if ( _bCalcScale )
229*b1cdbd2cSJim Jagielski     {
230*b1cdbd2cSJim Jagielski         // calculate scaling
231*b1cdbd2cSJim Jagielski         MapMode aMapMode( MAP_TWIP );
232*b1cdbd2cSJim Jagielski         Size aWinSize = mrParentViewShell.GetOut()->PixelToLogic( _rPxWinSize, aMapMode );
233*b1cdbd2cSJim Jagielski         Fraction aXScale( aWinSize.Width(), mnPrevwLayoutWidth );
234*b1cdbd2cSJim Jagielski         Fraction aYScale( aWinSize.Height(), mnPrevwLayoutHeight );
235*b1cdbd2cSJim Jagielski         if( aXScale < aYScale )
236*b1cdbd2cSJim Jagielski             aYScale = aXScale;
237*b1cdbd2cSJim Jagielski         {
238*b1cdbd2cSJim Jagielski             // adjust scaling for Drawing layer.
239*b1cdbd2cSJim Jagielski             aYScale *= Fraction( 1000, 1 );
240*b1cdbd2cSJim Jagielski             long nNewNuminator = aYScale.operator long();
241*b1cdbd2cSJim Jagielski             if( nNewNuminator < 1 )
242*b1cdbd2cSJim Jagielski                 nNewNuminator = 1;
243*b1cdbd2cSJim Jagielski             aYScale = Fraction( nNewNuminator, 1000 );
244*b1cdbd2cSJim Jagielski             // propagate scaling as zoom percentage to view options for font cache
245*b1cdbd2cSJim Jagielski             _ApplyNewZoomAtViewShell( static_cast<sal_uInt8>(nNewNuminator/10) );
246*b1cdbd2cSJim Jagielski         }
247*b1cdbd2cSJim Jagielski         aMapMode.SetScaleY( aYScale );
248*b1cdbd2cSJim Jagielski         aMapMode.SetScaleX( aYScale );
249*b1cdbd2cSJim Jagielski         // set created mapping mode with calculated scaling at output device.
250*b1cdbd2cSJim Jagielski         mrParentViewShell.GetOut()->SetMapMode( aMapMode );
251*b1cdbd2cSJim Jagielski         // OD 20.02.2003 #107369# - update statics for paint.
252*b1cdbd2cSJim Jagielski         ::SwCalcPixStatics( mrParentViewShell.GetOut() );
253*b1cdbd2cSJim Jagielski     }
254*b1cdbd2cSJim Jagielski 
255*b1cdbd2cSJim Jagielski     // set window size in twips
256*b1cdbd2cSJim Jagielski     maWinSize = mrParentViewShell.GetOut()->PixelToLogic( _rPxWinSize );
257*b1cdbd2cSJim Jagielski     // validate layout sizes
258*b1cdbd2cSJim Jagielski     mbLayoutSizesValid = true;
259*b1cdbd2cSJim Jagielski 
260*b1cdbd2cSJim Jagielski     return true;
261*b1cdbd2cSJim Jagielski }
262*b1cdbd2cSJim Jagielski 
263*b1cdbd2cSJim Jagielski /** apply new zoom at given view shell
264*b1cdbd2cSJim Jagielski 
265*b1cdbd2cSJim Jagielski     OD 11.12.2002 #103492# - implementation of <_ApplyNewZoomAtViewShell>
266*b1cdbd2cSJim Jagielski 
267*b1cdbd2cSJim Jagielski     @author OD
268*b1cdbd2cSJim Jagielski */
_ApplyNewZoomAtViewShell(sal_uInt8 _aNewZoom)269*b1cdbd2cSJim Jagielski void SwPagePreviewLayout::_ApplyNewZoomAtViewShell( sal_uInt8 _aNewZoom )
270*b1cdbd2cSJim Jagielski {
271*b1cdbd2cSJim Jagielski     SwViewOption aNewViewOptions = *(mrParentViewShell.GetViewOptions());
272*b1cdbd2cSJim Jagielski     if ( aNewViewOptions.GetZoom() != _aNewZoom )
273*b1cdbd2cSJim Jagielski     {
274*b1cdbd2cSJim Jagielski         aNewViewOptions.SetZoom( _aNewZoom );
275*b1cdbd2cSJim Jagielski         // OD 24.09.2003 #i19975# - consider zoom type.
276*b1cdbd2cSJim Jagielski         enum SvxZoomType eZoomType = SVX_ZOOM_PERCENT;
277*b1cdbd2cSJim Jagielski         aNewViewOptions.SetZoomType( eZoomType );
278*b1cdbd2cSJim Jagielski         mrParentViewShell.ApplyViewOptions( aNewViewOptions );
279*b1cdbd2cSJim Jagielski     }
280*b1cdbd2cSJim Jagielski }
281*b1cdbd2cSJim Jagielski 
282*b1cdbd2cSJim Jagielski /** method to adjust page preview layout to document changes
283*b1cdbd2cSJim Jagielski 
284*b1cdbd2cSJim Jagielski     OD 18.12.2002 #103492#
285*b1cdbd2cSJim Jagielski 
286*b1cdbd2cSJim Jagielski     @author OD
287*b1cdbd2cSJim Jagielski */
ReInit()288*b1cdbd2cSJim Jagielski bool SwPagePreviewLayout::ReInit()
289*b1cdbd2cSJim Jagielski {
290*b1cdbd2cSJim Jagielski     // check environment and parameters
291*b1cdbd2cSJim Jagielski     {
292*b1cdbd2cSJim Jagielski         bool bLayoutSettingsValid = mbLayoutInfoValid && mbLayoutSizesValid;
293*b1cdbd2cSJim Jagielski         ASSERT( bLayoutSettingsValid,
294*b1cdbd2cSJim Jagielski                 "no valid preview layout info/sizes - no re-init of page preview layout");
295*b1cdbd2cSJim Jagielski         if ( !bLayoutSettingsValid )
296*b1cdbd2cSJim Jagielski             return false;
297*b1cdbd2cSJim Jagielski     }
298*b1cdbd2cSJim Jagielski 
299*b1cdbd2cSJim Jagielski     _ClearPrevwLayoutSizes();
300*b1cdbd2cSJim Jagielski     _CalcPrevwLayoutSizes();
301*b1cdbd2cSJim Jagielski 
302*b1cdbd2cSJim Jagielski     return true;
303*b1cdbd2cSJim Jagielski }
304*b1cdbd2cSJim Jagielski 
305*b1cdbd2cSJim Jagielski // =============================================================================
306*b1cdbd2cSJim Jagielski // methods to prepare paint of page preview
307*b1cdbd2cSJim Jagielski // =============================================================================
308*b1cdbd2cSJim Jagielski /** prepare paint of page preview
309*b1cdbd2cSJim Jagielski 
310*b1cdbd2cSJim Jagielski     OD 12.12.2002 #103492#
311*b1cdbd2cSJim Jagielski     OD 21.03.2003 #108282# - delete parameter _onStartPageVirtNum
312*b1cdbd2cSJim Jagielski 
313*b1cdbd2cSJim Jagielski     @author OD, _nProposedStartPageNum, _onStartPageNum are absolute
314*b1cdbd2cSJim Jagielski */
Prepare(const sal_uInt16 _nProposedStartPageNum,const Point _aProposedStartPos,const Size & _rPxWinSize,sal_uInt16 & _onStartPageNum,Rectangle & _orDocPreviewPaintRect,const bool _bStartWithPageAtFirstCol)315*b1cdbd2cSJim Jagielski bool SwPagePreviewLayout::Prepare( const sal_uInt16 _nProposedStartPageNum,
316*b1cdbd2cSJim Jagielski                                    const Point      _aProposedStartPos,
317*b1cdbd2cSJim Jagielski                                    const Size&      _rPxWinSize,
318*b1cdbd2cSJim Jagielski                                    sal_uInt16&      _onStartPageNum,
319*b1cdbd2cSJim Jagielski                                    Rectangle&       _orDocPreviewPaintRect,
320*b1cdbd2cSJim Jagielski                                    const bool       _bStartWithPageAtFirstCol
321*b1cdbd2cSJim Jagielski                                  )
322*b1cdbd2cSJim Jagielski {
323*b1cdbd2cSJim Jagielski     sal_uInt16 nProposedStartPageNum = ConvertAbsoluteToRelativePageNum( _nProposedStartPageNum );
324*b1cdbd2cSJim Jagielski     // check environment and parameters
325*b1cdbd2cSJim Jagielski     {
326*b1cdbd2cSJim Jagielski         bool bLayoutSettingsValid = mbLayoutInfoValid && mbLayoutSizesValid;
327*b1cdbd2cSJim Jagielski         ASSERT( bLayoutSettingsValid,
328*b1cdbd2cSJim Jagielski                 "no valid preview layout info/sizes - no prepare of preview paint");
329*b1cdbd2cSJim Jagielski         if ( !bLayoutSettingsValid )
330*b1cdbd2cSJim Jagielski             return false;
331*b1cdbd2cSJim Jagielski 
332*b1cdbd2cSJim Jagielski         bool bStartPageRangeValid = nProposedStartPageNum <= mnPages;
333*b1cdbd2cSJim Jagielski         ASSERT( bStartPageRangeValid,
334*b1cdbd2cSJim Jagielski                 "proposed start page not existing - no prepare of preview paint");
335*b1cdbd2cSJim Jagielski         if ( !bStartPageRangeValid )
336*b1cdbd2cSJim Jagielski             return false;
337*b1cdbd2cSJim Jagielski 
338*b1cdbd2cSJim Jagielski         bool bStartPosRangeValid =
339*b1cdbd2cSJim Jagielski                 _aProposedStartPos.X() >= 0 && _aProposedStartPos.Y() >= 0 &&
340*b1cdbd2cSJim Jagielski                 _aProposedStartPos.X() <= maPreviewDocRect.Right() &&
341*b1cdbd2cSJim Jagielski                 _aProposedStartPos.Y() <= maPreviewDocRect.Bottom();
342*b1cdbd2cSJim Jagielski         ASSERT( bStartPosRangeValid,
343*b1cdbd2cSJim Jagielski                 "proposed start position out of range - no prepare of preview paint");
344*b1cdbd2cSJim Jagielski         if ( !bStartPosRangeValid )
345*b1cdbd2cSJim Jagielski             return false;
346*b1cdbd2cSJim Jagielski 
347*b1cdbd2cSJim Jagielski         bool bWinSizeValid = _rPxWinSize.Width() != 0 && _rPxWinSize.Height() != 0;
348*b1cdbd2cSJim Jagielski         ASSERT ( bWinSizeValid, "no window size - no prepare of preview paint");
349*b1cdbd2cSJim Jagielski         if ( !bWinSizeValid )
350*b1cdbd2cSJim Jagielski             return false;
351*b1cdbd2cSJim Jagielski 
352*b1cdbd2cSJim Jagielski         bool bStartInfoValid = _nProposedStartPageNum > 0 ||
353*b1cdbd2cSJim Jagielski                                _aProposedStartPos != Point(0,0);
354*b1cdbd2cSJim Jagielski         if ( !bStartInfoValid )
355*b1cdbd2cSJim Jagielski             nProposedStartPageNum = 1;
356*b1cdbd2cSJim Jagielski     }
357*b1cdbd2cSJim Jagielski 
358*b1cdbd2cSJim Jagielski     // environment and parameter ok
359*b1cdbd2cSJim Jagielski 
360*b1cdbd2cSJim Jagielski     // update window size at preview setting data
361*b1cdbd2cSJim Jagielski     maWinSize = mrParentViewShell.GetOut()->PixelToLogic( _rPxWinSize );
362*b1cdbd2cSJim Jagielski 
363*b1cdbd2cSJim Jagielski     mbNoPageVisible = false;
364*b1cdbd2cSJim Jagielski     if ( nProposedStartPageNum > 0 )
365*b1cdbd2cSJim Jagielski     {
366*b1cdbd2cSJim Jagielski         // determine column and row of proposed start page in virtual preview layout
367*b1cdbd2cSJim Jagielski         sal_uInt16 nColOfProposed = GetColOfPage( nProposedStartPageNum );
368*b1cdbd2cSJim Jagielski         sal_uInt16 nRowOfProposed = GetRowOfPage( nProposedStartPageNum );
369*b1cdbd2cSJim Jagielski         // determine start page
370*b1cdbd2cSJim Jagielski         if ( _bStartWithPageAtFirstCol )
371*b1cdbd2cSJim Jagielski         {
372*b1cdbd2cSJim Jagielski             // OD 19.02.2003 #107369# - leaving left-top-corner blank is
373*b1cdbd2cSJim Jagielski             // controlled by <mbBookPreview>.
374*b1cdbd2cSJim Jagielski             if ( mbBookPreview &&
375*b1cdbd2cSJim Jagielski                  ( nProposedStartPageNum == 1 || nRowOfProposed == 1 )
376*b1cdbd2cSJim Jagielski                )
377*b1cdbd2cSJim Jagielski                 mnPaintPhyStartPageNum = 1;
378*b1cdbd2cSJim Jagielski             else
379*b1cdbd2cSJim Jagielski                 mnPaintPhyStartPageNum = nProposedStartPageNum - (nColOfProposed-1);
380*b1cdbd2cSJim Jagielski         }
381*b1cdbd2cSJim Jagielski         else
382*b1cdbd2cSJim Jagielski             mnPaintPhyStartPageNum = nProposedStartPageNum;
383*b1cdbd2cSJim Jagielski 
384*b1cdbd2cSJim Jagielski         mnPaintPhyStartPageNum = ConvertRelativeToAbsolutePageNum( mnPaintPhyStartPageNum );
385*b1cdbd2cSJim Jagielski 
386*b1cdbd2cSJim Jagielski         // set starting column
387*b1cdbd2cSJim Jagielski         if ( _bStartWithPageAtFirstCol )
388*b1cdbd2cSJim Jagielski             mnPaintStartCol = 1;
389*b1cdbd2cSJim Jagielski         else
390*b1cdbd2cSJim Jagielski             mnPaintStartCol = nColOfProposed;
391*b1cdbd2cSJim Jagielski         // set starting row
392*b1cdbd2cSJim Jagielski         mnPaintStartRow = nRowOfProposed;
393*b1cdbd2cSJim Jagielski         // page offset == (-1,-1), indicating no offset and paint of free space.
394*b1cdbd2cSJim Jagielski         maPaintStartPageOffset.X() = -1;
395*b1cdbd2cSJim Jagielski         maPaintStartPageOffset.Y() = -1;
396*b1cdbd2cSJim Jagielski         // virtual preview document offset.
397*b1cdbd2cSJim Jagielski         if ( _bStartWithPageAtFirstCol )
398*b1cdbd2cSJim Jagielski             maPaintPreviewDocOffset.X() = 0;
399*b1cdbd2cSJim Jagielski         else
400*b1cdbd2cSJim Jagielski             maPaintPreviewDocOffset.X() = (nColOfProposed-1) * mnColWidth;
401*b1cdbd2cSJim Jagielski         maPaintPreviewDocOffset.Y() = (nRowOfProposed-1) * mnRowHeight;
402*b1cdbd2cSJim Jagielski     }
403*b1cdbd2cSJim Jagielski     else
404*b1cdbd2cSJim Jagielski     {
405*b1cdbd2cSJim Jagielski         // determine column and row of proposed start position.
406*b1cdbd2cSJim Jagielski         // Note: paint starts at point (0,0)
407*b1cdbd2cSJim Jagielski         sal_uInt16 nColOfProposed =
408*b1cdbd2cSJim Jagielski                 static_cast<sal_uInt16>(_aProposedStartPos.X() / mnColWidth) + 1;
409*b1cdbd2cSJim Jagielski         sal_uInt16 nRowOfProposed =
410*b1cdbd2cSJim Jagielski                 static_cast<sal_uInt16>(_aProposedStartPos.Y() / mnRowHeight) + 1;
411*b1cdbd2cSJim Jagielski         // determine start page == page at proposed start position
412*b1cdbd2cSJim Jagielski         // OD 19.02.2003 #107369# - leaving left-top-corner blank is
413*b1cdbd2cSJim Jagielski         // controlled by <mbBookPreview>.
414*b1cdbd2cSJim Jagielski         if ( mbBookPreview &&
415*b1cdbd2cSJim Jagielski              ( nRowOfProposed == 1 && nColOfProposed == 1 )
416*b1cdbd2cSJim Jagielski            )
417*b1cdbd2cSJim Jagielski             mnPaintPhyStartPageNum = 1;
418*b1cdbd2cSJim Jagielski         else
419*b1cdbd2cSJim Jagielski         {
420*b1cdbd2cSJim Jagielski             // OD 19.02.2003 #107369# - leaving left-top-corner blank is
421*b1cdbd2cSJim Jagielski             // controlled by <mbBookPreview>.
422*b1cdbd2cSJim Jagielski             mnPaintPhyStartPageNum = (nRowOfProposed-1) * mnCols + nColOfProposed;
423*b1cdbd2cSJim Jagielski             if ( mbBookPreview )
424*b1cdbd2cSJim Jagielski                 --mnPaintPhyStartPageNum;
425*b1cdbd2cSJim Jagielski             if ( mnPaintPhyStartPageNum > mnPages )
426*b1cdbd2cSJim Jagielski             {
427*b1cdbd2cSJim Jagielski                 // no page will be visible, because shown part of document
428*b1cdbd2cSJim Jagielski                 // preview is the last row to the right of the last page
429*b1cdbd2cSJim Jagielski                 mnPaintPhyStartPageNum = mnPages;
430*b1cdbd2cSJim Jagielski                 mbNoPageVisible = true;
431*b1cdbd2cSJim Jagielski             }
432*b1cdbd2cSJim Jagielski         }
433*b1cdbd2cSJim Jagielski         // set starting column and starting row
434*b1cdbd2cSJim Jagielski         mnPaintStartCol = nColOfProposed;
435*b1cdbd2cSJim Jagielski         mnPaintStartRow = nRowOfProposed;
436*b1cdbd2cSJim Jagielski         // page offset
437*b1cdbd2cSJim Jagielski         maPaintStartPageOffset.X() =
438*b1cdbd2cSJim Jagielski                 (_aProposedStartPos.X() % mnColWidth) - mnXFree;
439*b1cdbd2cSJim Jagielski         maPaintStartPageOffset.Y() =
440*b1cdbd2cSJim Jagielski                 (_aProposedStartPos.Y() % mnRowHeight) - mnYFree;
441*b1cdbd2cSJim Jagielski         // virtual preview document offset.
442*b1cdbd2cSJim Jagielski         maPaintPreviewDocOffset = _aProposedStartPos;
443*b1cdbd2cSJim Jagielski     }
444*b1cdbd2cSJim Jagielski 
445*b1cdbd2cSJim Jagielski     // determine additional paint offset, if preview layout fits into window.
446*b1cdbd2cSJim Jagielski     _CalcAdditionalPaintOffset();
447*b1cdbd2cSJim Jagielski 
448*b1cdbd2cSJim Jagielski     // determine rectangle to be painted from document preview
449*b1cdbd2cSJim Jagielski     _CalcDocPrevwPaintRect();
450*b1cdbd2cSJim Jagielski     _orDocPreviewPaintRect = maPaintedPrevwDocRect;
451*b1cdbd2cSJim Jagielski 
452*b1cdbd2cSJim Jagielski     // OD 20.01.2003 #103492# - shift visible preview document area to the left,
453*b1cdbd2cSJim Jagielski     // if on the right is an area left blank.
454*b1cdbd2cSJim Jagielski     if ( !mbDoesLayoutColsFitIntoWindow &&
455*b1cdbd2cSJim Jagielski          maPaintedPrevwDocRect.GetWidth() < maWinSize.Width() )
456*b1cdbd2cSJim Jagielski     {
457*b1cdbd2cSJim Jagielski         maPaintedPrevwDocRect.Move(
458*b1cdbd2cSJim Jagielski                 -(maWinSize.Width() - maPaintedPrevwDocRect.GetWidth()), 0 );
459*b1cdbd2cSJim Jagielski         Prepare( 0, maPaintedPrevwDocRect.TopLeft(),
460*b1cdbd2cSJim Jagielski                  _rPxWinSize, _onStartPageNum,
461*b1cdbd2cSJim Jagielski                  _orDocPreviewPaintRect, _bStartWithPageAtFirstCol );
462*b1cdbd2cSJim Jagielski     }
463*b1cdbd2cSJim Jagielski 
464*b1cdbd2cSJim Jagielski     // OD 20.01.2003 #103492# - shift visible preview document area to the top,
465*b1cdbd2cSJim Jagielski     // if on the botton is an area left blank.
466*b1cdbd2cSJim Jagielski     if ( mbBookPreviewModeToggled &&
467*b1cdbd2cSJim Jagielski          maPaintedPrevwDocRect.Bottom() == maPreviewDocRect.Bottom() &&
468*b1cdbd2cSJim Jagielski          maPaintedPrevwDocRect.GetHeight() < maWinSize.Height() )
469*b1cdbd2cSJim Jagielski     {
470*b1cdbd2cSJim Jagielski         if ( mbDoesLayoutRowsFitIntoWindow )
471*b1cdbd2cSJim Jagielski         {
472*b1cdbd2cSJim Jagielski             if ( maPaintedPrevwDocRect.GetHeight() < mnPrevwLayoutHeight)
473*b1cdbd2cSJim Jagielski             {
474*b1cdbd2cSJim Jagielski                 maPaintedPrevwDocRect.Move(
475*b1cdbd2cSJim Jagielski                         0, -(mnPrevwLayoutHeight - maPaintedPrevwDocRect.GetHeight()) );
476*b1cdbd2cSJim Jagielski                 Prepare( 0, maPaintedPrevwDocRect.TopLeft(),
477*b1cdbd2cSJim Jagielski                          _rPxWinSize, _onStartPageNum,
478*b1cdbd2cSJim Jagielski                          _orDocPreviewPaintRect, _bStartWithPageAtFirstCol );
479*b1cdbd2cSJim Jagielski             }
480*b1cdbd2cSJim Jagielski         }
481*b1cdbd2cSJim Jagielski         else
482*b1cdbd2cSJim Jagielski         {
483*b1cdbd2cSJim Jagielski             maPaintedPrevwDocRect.Move(
484*b1cdbd2cSJim Jagielski                     0, -(maWinSize.Height() - maPaintedPrevwDocRect.GetHeight()) );
485*b1cdbd2cSJim Jagielski             Prepare( 0, maPaintedPrevwDocRect.TopLeft(),
486*b1cdbd2cSJim Jagielski                      _rPxWinSize, _onStartPageNum,
487*b1cdbd2cSJim Jagielski                      _orDocPreviewPaintRect, _bStartWithPageAtFirstCol );
488*b1cdbd2cSJim Jagielski         }
489*b1cdbd2cSJim Jagielski     }
490*b1cdbd2cSJim Jagielski 
491*b1cdbd2cSJim Jagielski     // determine preview pages - visible pages with needed data for paint and
492*b1cdbd2cSJim Jagielski     // accessible pages with needed data.
493*b1cdbd2cSJim Jagielski     _CalcPreviewPages();
494*b1cdbd2cSJim Jagielski 
495*b1cdbd2cSJim Jagielski     // OD 07.11.2003 #i22014# - indicate new layout, if print preview is in paint
496*b1cdbd2cSJim Jagielski     if ( mbInPaint )
497*b1cdbd2cSJim Jagielski     {
498*b1cdbd2cSJim Jagielski         mbNewLayoutDuringPaint = true;
499*b1cdbd2cSJim Jagielski     }
500*b1cdbd2cSJim Jagielski 
501*b1cdbd2cSJim Jagielski     // validate paint data
502*b1cdbd2cSJim Jagielski     mbPaintInfoValid = true;
503*b1cdbd2cSJim Jagielski 
504*b1cdbd2cSJim Jagielski     // return start page
505*b1cdbd2cSJim Jagielski     _onStartPageNum = mnPaintPhyStartPageNum;
506*b1cdbd2cSJim Jagielski 
507*b1cdbd2cSJim Jagielski     return true;
508*b1cdbd2cSJim Jagielski }
509*b1cdbd2cSJim Jagielski 
510*b1cdbd2cSJim Jagielski /** calculate additional paint offset
511*b1cdbd2cSJim Jagielski 
512*b1cdbd2cSJim Jagielski     OD 12.12.2002 #103492#
513*b1cdbd2cSJim Jagielski 
514*b1cdbd2cSJim Jagielski     @author OD
515*b1cdbd2cSJim Jagielski */
_CalcAdditionalPaintOffset()516*b1cdbd2cSJim Jagielski void SwPagePreviewLayout::_CalcAdditionalPaintOffset()
517*b1cdbd2cSJim Jagielski {
518*b1cdbd2cSJim Jagielski     if ( mnPrevwLayoutWidth <= maWinSize.Width() &&
519*b1cdbd2cSJim Jagielski          maPaintStartPageOffset.X() <= 0 )
520*b1cdbd2cSJim Jagielski     {
521*b1cdbd2cSJim Jagielski         mbDoesLayoutColsFitIntoWindow = true;
522*b1cdbd2cSJim Jagielski         maAdditionalPaintOffset.X() = (maWinSize.Width() - mnPrevwLayoutWidth) / 2;
523*b1cdbd2cSJim Jagielski     }
524*b1cdbd2cSJim Jagielski     else
525*b1cdbd2cSJim Jagielski     {
526*b1cdbd2cSJim Jagielski         mbDoesLayoutColsFitIntoWindow = false;
527*b1cdbd2cSJim Jagielski         maAdditionalPaintOffset.X() = 0;
528*b1cdbd2cSJim Jagielski     }
529*b1cdbd2cSJim Jagielski 
530*b1cdbd2cSJim Jagielski     if ( mnPrevwLayoutHeight <= maWinSize.Height() &&
531*b1cdbd2cSJim Jagielski          maPaintStartPageOffset.Y() <= 0 )
532*b1cdbd2cSJim Jagielski     {
533*b1cdbd2cSJim Jagielski         mbDoesLayoutRowsFitIntoWindow = true;
534*b1cdbd2cSJim Jagielski         maAdditionalPaintOffset.Y() = (maWinSize.Height() - mnPrevwLayoutHeight) / 2;
535*b1cdbd2cSJim Jagielski     }
536*b1cdbd2cSJim Jagielski     else
537*b1cdbd2cSJim Jagielski     {
538*b1cdbd2cSJim Jagielski         mbDoesLayoutRowsFitIntoWindow = false;
539*b1cdbd2cSJim Jagielski         maAdditionalPaintOffset.Y() = 0;
540*b1cdbd2cSJim Jagielski     }
541*b1cdbd2cSJim Jagielski }
542*b1cdbd2cSJim Jagielski 
543*b1cdbd2cSJim Jagielski /** calculate painted preview document rectangle
544*b1cdbd2cSJim Jagielski 
545*b1cdbd2cSJim Jagielski     OD 12.12.2002 #103492#
546*b1cdbd2cSJim Jagielski 
547*b1cdbd2cSJim Jagielski     @author OD
548*b1cdbd2cSJim Jagielski */
_CalcDocPrevwPaintRect()549*b1cdbd2cSJim Jagielski void SwPagePreviewLayout::_CalcDocPrevwPaintRect()
550*b1cdbd2cSJim Jagielski {
551*b1cdbd2cSJim Jagielski     Point aTopLeftPos = maPaintPreviewDocOffset;
552*b1cdbd2cSJim Jagielski     maPaintedPrevwDocRect.SetPos( aTopLeftPos );
553*b1cdbd2cSJim Jagielski 
554*b1cdbd2cSJim Jagielski     Size aSize;
555*b1cdbd2cSJim Jagielski     if ( mbDoesLayoutColsFitIntoWindow )
556*b1cdbd2cSJim Jagielski         //aSize.Width() = mnPrevwLayoutWidth;
557*b1cdbd2cSJim Jagielski         aSize.Width() = Min( mnPrevwLayoutWidth,
558*b1cdbd2cSJim Jagielski                              maPreviewDocRect.GetWidth() - aTopLeftPos.X() );
559*b1cdbd2cSJim Jagielski     else
560*b1cdbd2cSJim Jagielski         aSize.Width() = Min( maPreviewDocRect.GetWidth() - aTopLeftPos.X(),
561*b1cdbd2cSJim Jagielski                              maWinSize.Width() - maAdditionalPaintOffset.X() );
562*b1cdbd2cSJim Jagielski     if ( mbDoesLayoutRowsFitIntoWindow )
563*b1cdbd2cSJim Jagielski         //aSize.Height() = mnPrevwLayoutHeight;
564*b1cdbd2cSJim Jagielski         aSize.Height() = Min( mnPrevwLayoutHeight,
565*b1cdbd2cSJim Jagielski                               maPreviewDocRect.GetHeight() - aTopLeftPos.Y() );
566*b1cdbd2cSJim Jagielski     else
567*b1cdbd2cSJim Jagielski         aSize.Height() = Min( maPreviewDocRect.GetHeight() - aTopLeftPos.Y(),
568*b1cdbd2cSJim Jagielski                               maWinSize.Height() - maAdditionalPaintOffset.Y() );
569*b1cdbd2cSJim Jagielski     maPaintedPrevwDocRect.SetSize( aSize );
570*b1cdbd2cSJim Jagielski }
571*b1cdbd2cSJim Jagielski 
572*b1cdbd2cSJim Jagielski /** calculate preview pages
573*b1cdbd2cSJim Jagielski 
574*b1cdbd2cSJim Jagielski     OD 12.12.2002 #103492#
575*b1cdbd2cSJim Jagielski 
576*b1cdbd2cSJim Jagielski     @author OD
577*b1cdbd2cSJim Jagielski */
_CalcPreviewPages()578*b1cdbd2cSJim Jagielski void SwPagePreviewLayout::_CalcPreviewPages()
579*b1cdbd2cSJim Jagielski {
580*b1cdbd2cSJim Jagielski     _ClearPrevwPageData();
581*b1cdbd2cSJim Jagielski 
582*b1cdbd2cSJim Jagielski     if ( mbNoPageVisible )
583*b1cdbd2cSJim Jagielski         return;
584*b1cdbd2cSJim Jagielski 
585*b1cdbd2cSJim Jagielski     // determine start page frame
586*b1cdbd2cSJim Jagielski     const SwPageFrm* pStartPage = mrLayoutRootFrm.GetPageByPageNum( mnPaintPhyStartPageNum );
587*b1cdbd2cSJim Jagielski 
588*b1cdbd2cSJim Jagielski     // calculate initial paint offset
589*b1cdbd2cSJim Jagielski     Point aInitialPaintOffset;
590*b1cdbd2cSJim Jagielski     if ( maPaintStartPageOffset != Point( -1, -1 ) )
591*b1cdbd2cSJim Jagielski         aInitialPaintOffset = Point(0,0) - maPaintStartPageOffset;
592*b1cdbd2cSJim Jagielski     else
593*b1cdbd2cSJim Jagielski         aInitialPaintOffset = Point( mnXFree, mnYFree );
594*b1cdbd2cSJim Jagielski     aInitialPaintOffset += maAdditionalPaintOffset;
595*b1cdbd2cSJim Jagielski 
596*b1cdbd2cSJim Jagielski     // prepare loop data
597*b1cdbd2cSJim Jagielski     const SwPageFrm* pPage = pStartPage;
598*b1cdbd2cSJim Jagielski     sal_uInt16 nCurrCol = mnPaintStartCol;
599*b1cdbd2cSJim Jagielski     sal_uInt16 nConsideredRows = 0;
600*b1cdbd2cSJim Jagielski     Point aCurrPaintOffset = aInitialPaintOffset;
601*b1cdbd2cSJim Jagielski     // loop on pages to determine preview background retangles
602*b1cdbd2cSJim Jagielski     while ( pPage &&
603*b1cdbd2cSJim Jagielski             (!mbDoesLayoutRowsFitIntoWindow || nConsideredRows < mnRows) &&
604*b1cdbd2cSJim Jagielski             aCurrPaintOffset.Y() < maWinSize.Height()
605*b1cdbd2cSJim Jagielski           )
606*b1cdbd2cSJim Jagielski     {
607*b1cdbd2cSJim Jagielski         if ( !mbBookPreview && !mbPrintEmptyPages && pPage->IsEmptyPage() )
608*b1cdbd2cSJim Jagielski         {
609*b1cdbd2cSJim Jagielski             pPage = static_cast<const SwPageFrm*>(pPage->GetNext());
610*b1cdbd2cSJim Jagielski             continue;
611*b1cdbd2cSJim Jagielski         }
612*b1cdbd2cSJim Jagielski 
613*b1cdbd2cSJim Jagielski         pPage->Calc();
614*b1cdbd2cSJim Jagielski 
615*b1cdbd2cSJim Jagielski         // consider only pages, which have to be painted.
616*b1cdbd2cSJim Jagielski         if ( nCurrCol < mnPaintStartCol )
617*b1cdbd2cSJim Jagielski         {
618*b1cdbd2cSJim Jagielski             // calculate data of unvisible page needed for accessibility
619*b1cdbd2cSJim Jagielski             PrevwPage* pPrevwPage = new PrevwPage;
620*b1cdbd2cSJim Jagielski             Point aCurrAccOffset = aCurrPaintOffset -
621*b1cdbd2cSJim Jagielski                            Point( (mnPaintStartCol-nCurrCol) * mnColWidth, 0 );
622*b1cdbd2cSJim Jagielski             _CalcPreviewDataForPage( *(pPage), aCurrAccOffset, pPrevwPage );
623*b1cdbd2cSJim Jagielski             pPrevwPage->bVisible = false;
624*b1cdbd2cSJim Jagielski             maPrevwPages.push_back( pPrevwPage );
625*b1cdbd2cSJim Jagielski             // continue with next page and next column
626*b1cdbd2cSJim Jagielski             pPage = static_cast<const SwPageFrm*>(pPage->GetNext());
627*b1cdbd2cSJim Jagielski             ++nCurrCol;
628*b1cdbd2cSJim Jagielski             continue;
629*b1cdbd2cSJim Jagielski         }
630*b1cdbd2cSJim Jagielski         if ( aCurrPaintOffset.X() < maWinSize.Width() )
631*b1cdbd2cSJim Jagielski         {
632*b1cdbd2cSJim Jagielski             // OD 19.02.2003 #107369# - leaving left-top-corner blank is
633*b1cdbd2cSJim Jagielski             // controlled by <mbBookPreview>.
634*b1cdbd2cSJim Jagielski             if ( mbBookPreview && pPage->GetPhyPageNum() == 1 && mnCols != 1 && nCurrCol == 1
635*b1cdbd2cSJim Jagielski                )
636*b1cdbd2cSJim Jagielski             {
637*b1cdbd2cSJim Jagielski                 // first page in 2nd column
638*b1cdbd2cSJim Jagielski                 // --> continue with increased paint offset and next column
639*b1cdbd2cSJim Jagielski                 aCurrPaintOffset.X() += mnColWidth;
640*b1cdbd2cSJim Jagielski                 ++nCurrCol;
641*b1cdbd2cSJim Jagielski                 continue;
642*b1cdbd2cSJim Jagielski             }
643*b1cdbd2cSJim Jagielski 
644*b1cdbd2cSJim Jagielski             // calculate data of visible page
645*b1cdbd2cSJim Jagielski             PrevwPage* pPrevwPage = new PrevwPage;
646*b1cdbd2cSJim Jagielski             _CalcPreviewDataForPage( *(pPage), aCurrPaintOffset, pPrevwPage );
647*b1cdbd2cSJim Jagielski             pPrevwPage->bVisible = true;
648*b1cdbd2cSJim Jagielski             maPrevwPages.push_back( pPrevwPage );
649*b1cdbd2cSJim Jagielski         }
650*b1cdbd2cSJim Jagielski         else
651*b1cdbd2cSJim Jagielski         {
652*b1cdbd2cSJim Jagielski             // calculate data of unvisible page needed for accessibility
653*b1cdbd2cSJim Jagielski             PrevwPage* pPrevwPage = new PrevwPage;
654*b1cdbd2cSJim Jagielski             _CalcPreviewDataForPage( *(pPage), aCurrPaintOffset, pPrevwPage );
655*b1cdbd2cSJim Jagielski             pPrevwPage->bVisible = false;
656*b1cdbd2cSJim Jagielski             maPrevwPages.push_back( pPrevwPage );
657*b1cdbd2cSJim Jagielski         }
658*b1cdbd2cSJim Jagielski 
659*b1cdbd2cSJim Jagielski         // prepare data for next loop
660*b1cdbd2cSJim Jagielski         pPage = static_cast<const SwPageFrm*>(pPage->GetNext());
661*b1cdbd2cSJim Jagielski 
662*b1cdbd2cSJim Jagielski         aCurrPaintOffset.X() += mnColWidth;
663*b1cdbd2cSJim Jagielski         ++nCurrCol;
664*b1cdbd2cSJim Jagielski         if ( nCurrCol > mnCols )
665*b1cdbd2cSJim Jagielski         {
666*b1cdbd2cSJim Jagielski             ++nConsideredRows;
667*b1cdbd2cSJim Jagielski             aCurrPaintOffset.X() = aInitialPaintOffset.X();
668*b1cdbd2cSJim Jagielski             nCurrCol = 1;
669*b1cdbd2cSJim Jagielski             aCurrPaintOffset.Y() += mnRowHeight;
670*b1cdbd2cSJim Jagielski         }
671*b1cdbd2cSJim Jagielski     }
672*b1cdbd2cSJim Jagielski }
673*b1cdbd2cSJim Jagielski 
674*b1cdbd2cSJim Jagielski /** determines preview data for a given page and a given preview offset
675*b1cdbd2cSJim Jagielski 
676*b1cdbd2cSJim Jagielski     OD 13.12.2002 #103492#
677*b1cdbd2cSJim Jagielski 
678*b1cdbd2cSJim Jagielski     @author OD
679*b1cdbd2cSJim Jagielski */
_CalcPreviewDataForPage(const SwPageFrm & _rPage,const Point & _rPrevwOffset,PrevwPage * _opPrevwPage)680*b1cdbd2cSJim Jagielski bool SwPagePreviewLayout::_CalcPreviewDataForPage( const SwPageFrm& _rPage,
681*b1cdbd2cSJim Jagielski                                                    const Point& _rPrevwOffset,
682*b1cdbd2cSJim Jagielski                                                    PrevwPage* _opPrevwPage )
683*b1cdbd2cSJim Jagielski {
684*b1cdbd2cSJim Jagielski     // page frame
685*b1cdbd2cSJim Jagielski     _opPrevwPage->pPage = &_rPage;
686*b1cdbd2cSJim Jagielski     // size of page frame
687*b1cdbd2cSJim Jagielski     if ( _rPage.IsEmptyPage() )
688*b1cdbd2cSJim Jagielski     {
689*b1cdbd2cSJim Jagielski         if ( _rPage.GetPhyPageNum() % 2 == 0 )
690*b1cdbd2cSJim Jagielski             _opPrevwPage->aPageSize = _rPage.GetPrev()->Frm().SSize();
691*b1cdbd2cSJim Jagielski         else
692*b1cdbd2cSJim Jagielski             _opPrevwPage->aPageSize = _rPage.GetNext()->Frm().SSize();
693*b1cdbd2cSJim Jagielski     }
694*b1cdbd2cSJim Jagielski     else
695*b1cdbd2cSJim Jagielski         _opPrevwPage->aPageSize = _rPage.Frm().SSize();
696*b1cdbd2cSJim Jagielski     // position of page in preview window
697*b1cdbd2cSJim Jagielski     Point aPrevwWinOffset( _rPrevwOffset );
698*b1cdbd2cSJim Jagielski     if ( _opPrevwPage->aPageSize.Width() < maMaxPageSize.Width() )
699*b1cdbd2cSJim Jagielski         aPrevwWinOffset.X() += ( maMaxPageSize.Width() - _opPrevwPage->aPageSize.Width() ) / 2;
700*b1cdbd2cSJim Jagielski     if ( _opPrevwPage->aPageSize.Height() < maMaxPageSize.Height() )
701*b1cdbd2cSJim Jagielski         aPrevwWinOffset.Y() += ( maMaxPageSize.Height() - _opPrevwPage->aPageSize.Height() ) / 2;
702*b1cdbd2cSJim Jagielski     _opPrevwPage->aPrevwWinPos = aPrevwWinOffset;
703*b1cdbd2cSJim Jagielski     // logic position of page and mapping offset for paint
704*b1cdbd2cSJim Jagielski     if ( _rPage.IsEmptyPage() )
705*b1cdbd2cSJim Jagielski     {
706*b1cdbd2cSJim Jagielski         _opPrevwPage->aLogicPos = _opPrevwPage->aPrevwWinPos;
707*b1cdbd2cSJim Jagielski         _opPrevwPage->aMapOffset = Point( 0, 0 );
708*b1cdbd2cSJim Jagielski     }
709*b1cdbd2cSJim Jagielski     else
710*b1cdbd2cSJim Jagielski     {
711*b1cdbd2cSJim Jagielski         _opPrevwPage->aLogicPos = _rPage.Frm().Pos();
712*b1cdbd2cSJim Jagielski         _opPrevwPage->aMapOffset = _opPrevwPage->aPrevwWinPos - _opPrevwPage->aLogicPos;
713*b1cdbd2cSJim Jagielski     }
714*b1cdbd2cSJim Jagielski 
715*b1cdbd2cSJim Jagielski     return true;
716*b1cdbd2cSJim Jagielski }
717*b1cdbd2cSJim Jagielski 
718*b1cdbd2cSJim Jagielski /** enable/disable book preview
719*b1cdbd2cSJim Jagielski 
720*b1cdbd2cSJim Jagielski     OD 2004-03-04 #i18143#
721*b1cdbd2cSJim Jagielski 
722*b1cdbd2cSJim Jagielski     @author OD
723*b1cdbd2cSJim Jagielski */
SetBookPreviewMode(const bool _bEnableBookPreview,sal_uInt16 & _onStartPageNum,Rectangle & _orDocPreviewPaintRect)724*b1cdbd2cSJim Jagielski bool SwPagePreviewLayout::SetBookPreviewMode( const bool _bEnableBookPreview,
725*b1cdbd2cSJim Jagielski                                               sal_uInt16& _onStartPageNum,
726*b1cdbd2cSJim Jagielski                                               Rectangle&  _orDocPreviewPaintRect )
727*b1cdbd2cSJim Jagielski {
728*b1cdbd2cSJim Jagielski     bool bRet = false;
729*b1cdbd2cSJim Jagielski 
730*b1cdbd2cSJim Jagielski     if ( mbBookPreview != _bEnableBookPreview)
731*b1cdbd2cSJim Jagielski     {
732*b1cdbd2cSJim Jagielski         mbBookPreview = _bEnableBookPreview;
733*b1cdbd2cSJim Jagielski         // re-initialize page preview layout
734*b1cdbd2cSJim Jagielski         ReInit();
735*b1cdbd2cSJim Jagielski         // re-prepare page preview layout
736*b1cdbd2cSJim Jagielski         {
737*b1cdbd2cSJim Jagielski             mbBookPreviewModeToggled = true;
738*b1cdbd2cSJim Jagielski             Point aProposedStartPos( maPaintPreviewDocOffset );
739*b1cdbd2cSJim Jagielski             // if proposed start position is below virtual preview document
740*b1cdbd2cSJim Jagielski             // bottom, adjust it to the virtual preview document bottom
741*b1cdbd2cSJim Jagielski             if ( aProposedStartPos.Y() > maPreviewDocRect.Bottom() )
742*b1cdbd2cSJim Jagielski             {
743*b1cdbd2cSJim Jagielski                 aProposedStartPos.Y() = maPreviewDocRect.Bottom();
744*b1cdbd2cSJim Jagielski             }
745*b1cdbd2cSJim Jagielski             Prepare( 0, aProposedStartPos,
746*b1cdbd2cSJim Jagielski                      mrParentViewShell.GetOut()->LogicToPixel( maWinSize ),
747*b1cdbd2cSJim Jagielski                      _onStartPageNum, _orDocPreviewPaintRect );
748*b1cdbd2cSJim Jagielski             mbBookPreviewModeToggled = false;
749*b1cdbd2cSJim Jagielski         }
750*b1cdbd2cSJim Jagielski 
751*b1cdbd2cSJim Jagielski         bRet = true;
752*b1cdbd2cSJim Jagielski     }
753*b1cdbd2cSJim Jagielski 
754*b1cdbd2cSJim Jagielski     return bRet;
755*b1cdbd2cSJim Jagielski }
756*b1cdbd2cSJim Jagielski 
757*b1cdbd2cSJim Jagielski // =============================================================================
758*b1cdbd2cSJim Jagielski // methods to determine new data for changing the current shown part of the
759*b1cdbd2cSJim Jagielski // document preview.
760*b1cdbd2cSJim Jagielski // =============================================================================
761*b1cdbd2cSJim Jagielski /** calculate start position for new scale
762*b1cdbd2cSJim Jagielski 
763*b1cdbd2cSJim Jagielski     OD 12.12.2002 #103492#
764*b1cdbd2cSJim Jagielski 
765*b1cdbd2cSJim Jagielski     @author OD
766*b1cdbd2cSJim Jagielski */
GetPreviewStartPosForNewScale(const Fraction & _aNewScale,const Fraction & _aOldScale,const Size & _aNewWinSize) const767*b1cdbd2cSJim Jagielski Point SwPagePreviewLayout::GetPreviewStartPosForNewScale(
768*b1cdbd2cSJim Jagielski                           const Fraction& _aNewScale,
769*b1cdbd2cSJim Jagielski                           const Fraction& _aOldScale,
770*b1cdbd2cSJim Jagielski                           const Size&     _aNewWinSize ) const
771*b1cdbd2cSJim Jagielski {
772*b1cdbd2cSJim Jagielski     Point aNewPaintStartPos = maPaintedPrevwDocRect.TopLeft();
773*b1cdbd2cSJim Jagielski     if ( _aNewScale < _aOldScale )
774*b1cdbd2cSJim Jagielski     {
775*b1cdbd2cSJim Jagielski         // increase paint width by moving start point to left.
776*b1cdbd2cSJim Jagielski         if ( mnPrevwLayoutWidth < _aNewWinSize.Width() )
777*b1cdbd2cSJim Jagielski             aNewPaintStartPos.X() = 0;
778*b1cdbd2cSJim Jagielski         else if ( maPaintedPrevwDocRect.GetWidth() < _aNewWinSize.Width() )
779*b1cdbd2cSJim Jagielski         {
780*b1cdbd2cSJim Jagielski             aNewPaintStartPos.X() -=
781*b1cdbd2cSJim Jagielski                 (_aNewWinSize.Width() - maPaintedPrevwDocRect.GetWidth()) / 2;
782*b1cdbd2cSJim Jagielski             if ( aNewPaintStartPos.X() < 0)
783*b1cdbd2cSJim Jagielski                 aNewPaintStartPos.X() = 0;
784*b1cdbd2cSJim Jagielski         }
785*b1cdbd2cSJim Jagielski 
786*b1cdbd2cSJim Jagielski         if ( !mbDoesLayoutRowsFitIntoWindow )
787*b1cdbd2cSJim Jagielski         {
788*b1cdbd2cSJim Jagielski             // increase paint height by moving start point to top.
789*b1cdbd2cSJim Jagielski             if ( mnPrevwLayoutHeight < _aNewWinSize.Height() )
790*b1cdbd2cSJim Jagielski             {
791*b1cdbd2cSJim Jagielski                 aNewPaintStartPos.Y() =
792*b1cdbd2cSJim Jagielski                     ( (mnPaintStartRow - 1) * mnRowHeight );
793*b1cdbd2cSJim Jagielski             }
794*b1cdbd2cSJim Jagielski             else if ( maPaintedPrevwDocRect.GetHeight() < _aNewWinSize.Height() )
795*b1cdbd2cSJim Jagielski             {
796*b1cdbd2cSJim Jagielski                 aNewPaintStartPos.Y() -=
797*b1cdbd2cSJim Jagielski                     (_aNewWinSize.Height() - maPaintedPrevwDocRect.GetHeight()) / 2;
798*b1cdbd2cSJim Jagielski                 if ( aNewPaintStartPos.Y() < 0)
799*b1cdbd2cSJim Jagielski                     aNewPaintStartPos.Y() = 0;
800*b1cdbd2cSJim Jagielski             }
801*b1cdbd2cSJim Jagielski         }
802*b1cdbd2cSJim Jagielski     }
803*b1cdbd2cSJim Jagielski     else
804*b1cdbd2cSJim Jagielski     {
805*b1cdbd2cSJim Jagielski         // decrease paint width by moving start point to right
806*b1cdbd2cSJim Jagielski         if ( maPaintedPrevwDocRect.GetWidth() > _aNewWinSize.Width() )
807*b1cdbd2cSJim Jagielski             aNewPaintStartPos.X() +=
808*b1cdbd2cSJim Jagielski                 (maPaintedPrevwDocRect.GetWidth() - _aNewWinSize.Width()) / 2;
809*b1cdbd2cSJim Jagielski         // decrease paint height by moving start point to bottom
810*b1cdbd2cSJim Jagielski         if ( maPaintedPrevwDocRect.GetHeight() > _aNewWinSize.Height() )
811*b1cdbd2cSJim Jagielski         {
812*b1cdbd2cSJim Jagielski             aNewPaintStartPos.Y() +=
813*b1cdbd2cSJim Jagielski                 (maPaintedPrevwDocRect.GetHeight() - _aNewWinSize.Height()) / 2;
814*b1cdbd2cSJim Jagielski             // check, if new y-position is outside document preview
815*b1cdbd2cSJim Jagielski             if ( aNewPaintStartPos.Y() > maPreviewDocRect.Bottom() )
816*b1cdbd2cSJim Jagielski                 aNewPaintStartPos.Y() =
817*b1cdbd2cSJim Jagielski                         Max( 0L, maPreviewDocRect.Bottom() - mnPrevwLayoutHeight );
818*b1cdbd2cSJim Jagielski         }
819*b1cdbd2cSJim Jagielski     }
820*b1cdbd2cSJim Jagielski 
821*b1cdbd2cSJim Jagielski     return aNewPaintStartPos;
822*b1cdbd2cSJim Jagielski }
823*b1cdbd2cSJim Jagielski 
824*b1cdbd2cSJim Jagielski /** determines, if page with given page number is visible in preview
825*b1cdbd2cSJim Jagielski 
826*b1cdbd2cSJim Jagielski     OD 12.12.2002 #103492#
827*b1cdbd2cSJim Jagielski 
828*b1cdbd2cSJim Jagielski     @author OD, _nPageNum is absolut!
829*b1cdbd2cSJim Jagielski */
IsPageVisible(const sal_uInt16 _nPageNum) const830*b1cdbd2cSJim Jagielski bool SwPagePreviewLayout::IsPageVisible( const sal_uInt16 _nPageNum ) const
831*b1cdbd2cSJim Jagielski {
832*b1cdbd2cSJim Jagielski     const PrevwPage* pPrevwPage = _GetPrevwPageByPageNum( _nPageNum );
833*b1cdbd2cSJim Jagielski     return pPrevwPage && pPrevwPage->bVisible;
834*b1cdbd2cSJim Jagielski }
835*b1cdbd2cSJim Jagielski 
836*b1cdbd2cSJim Jagielski /** calculate data to bring new selected page into view.
837*b1cdbd2cSJim Jagielski 
838*b1cdbd2cSJim Jagielski     OD 12.12.2002 #103492#
839*b1cdbd2cSJim Jagielski 
840*b1cdbd2cSJim Jagielski     @author OD, IN/OUT parameters are absolute page numbers!!!
841*b1cdbd2cSJim Jagielski */
CalcStartValuesForSelectedPageMove(const sal_Int16 _nHoriMove,const sal_Int16 _nVertMove,sal_uInt16 & _orNewSelectedPage,sal_uInt16 & _orNewStartPage,Point & _orNewStartPos) const842*b1cdbd2cSJim Jagielski bool SwPagePreviewLayout::CalcStartValuesForSelectedPageMove(
843*b1cdbd2cSJim Jagielski                                 const sal_Int16  _nHoriMove,
844*b1cdbd2cSJim Jagielski                                 const sal_Int16  _nVertMove,
845*b1cdbd2cSJim Jagielski                                 sal_uInt16&      _orNewSelectedPage,
846*b1cdbd2cSJim Jagielski                                 sal_uInt16&      _orNewStartPage,
847*b1cdbd2cSJim Jagielski                                 Point&           _orNewStartPos ) const
848*b1cdbd2cSJim Jagielski {
849*b1cdbd2cSJim Jagielski     // determine position of current selected page
850*b1cdbd2cSJim Jagielski     sal_uInt16 nTmpRelSelPageNum = ConvertAbsoluteToRelativePageNum( mnSelectedPageNum );
851*b1cdbd2cSJim Jagielski     sal_uInt16 nNewRelSelectedPageNum = nTmpRelSelPageNum;
852*b1cdbd2cSJim Jagielski 
853*b1cdbd2cSJim Jagielski     // OD 19.02.2003 #107369# - leaving left-top-corner blank is controlled
854*b1cdbd2cSJim Jagielski     // by <mbBookPreview>.
855*b1cdbd2cSJim Jagielski     if ( mbBookPreview )
856*b1cdbd2cSJim Jagielski     {
857*b1cdbd2cSJim Jagielski         // Note: consider that left-top-corner is left blank --> +1
858*b1cdbd2cSJim Jagielski         ++nTmpRelSelPageNum;
859*b1cdbd2cSJim Jagielski     }
860*b1cdbd2cSJim Jagielski     sal_uInt16 nTmpCol = nTmpRelSelPageNum % mnCols;
861*b1cdbd2cSJim Jagielski     sal_uInt16 nCurrRow = nTmpRelSelPageNum / mnCols;
862*b1cdbd2cSJim Jagielski     if ( nTmpCol > 0 )
863*b1cdbd2cSJim Jagielski         ++nCurrRow;
864*b1cdbd2cSJim Jagielski 
865*b1cdbd2cSJim Jagielski     // determine new selected page number
866*b1cdbd2cSJim Jagielski     {
867*b1cdbd2cSJim Jagielski         if ( _nHoriMove != 0 )
868*b1cdbd2cSJim Jagielski         {
869*b1cdbd2cSJim Jagielski             if ( (nNewRelSelectedPageNum + _nHoriMove) < 1 )
870*b1cdbd2cSJim Jagielski                 nNewRelSelectedPageNum = 1;
871*b1cdbd2cSJim Jagielski             else if ( (nNewRelSelectedPageNum + _nHoriMove) > mnPages )
872*b1cdbd2cSJim Jagielski                 nNewRelSelectedPageNum = mnPages;
873*b1cdbd2cSJim Jagielski             else
874*b1cdbd2cSJim Jagielski                 nNewRelSelectedPageNum = nNewRelSelectedPageNum + _nHoriMove;
875*b1cdbd2cSJim Jagielski         }
876*b1cdbd2cSJim Jagielski         if ( _nVertMove != 0 )
877*b1cdbd2cSJim Jagielski         {
878*b1cdbd2cSJim Jagielski             if ( (nNewRelSelectedPageNum + (_nVertMove * mnCols)) < 1 )
879*b1cdbd2cSJim Jagielski                 nNewRelSelectedPageNum = 1;
880*b1cdbd2cSJim Jagielski             else if ( (nNewRelSelectedPageNum + (_nVertMove * mnCols)) > mnPages )
881*b1cdbd2cSJim Jagielski                 nNewRelSelectedPageNum = mnPages;
882*b1cdbd2cSJim Jagielski             else
883*b1cdbd2cSJim Jagielski                 nNewRelSelectedPageNum += ( _nVertMove * mnCols );
884*b1cdbd2cSJim Jagielski         }
885*b1cdbd2cSJim Jagielski     }
886*b1cdbd2cSJim Jagielski 
887*b1cdbd2cSJim Jagielski     sal_uInt16 nNewStartPage = mnPaintPhyStartPageNum;
888*b1cdbd2cSJim Jagielski     Point aNewStartPos = Point(0,0);
889*b1cdbd2cSJim Jagielski 
890*b1cdbd2cSJim Jagielski     sal_uInt16 nNewAbsSelectedPageNum = ConvertRelativeToAbsolutePageNum( nNewRelSelectedPageNum );
891*b1cdbd2cSJim Jagielski     if ( !IsPageVisible( nNewAbsSelectedPageNum ) )
892*b1cdbd2cSJim Jagielski     {
893*b1cdbd2cSJim Jagielski         if ( _nHoriMove != 0 && _nVertMove != 0 )
894*b1cdbd2cSJim Jagielski         {
895*b1cdbd2cSJim Jagielski             ASSERT( false, "missing implementation for moving preview selected page horizontal AND vertical");
896*b1cdbd2cSJim Jagielski             return false;
897*b1cdbd2cSJim Jagielski         }
898*b1cdbd2cSJim Jagielski 
899*b1cdbd2cSJim Jagielski         // new selected page has to be brought into view considering current
900*b1cdbd2cSJim Jagielski         // visible preview.
901*b1cdbd2cSJim Jagielski         sal_Int16 nTotalRows = GetRowOfPage( mnPages );
902*b1cdbd2cSJim Jagielski         if ( (_nHoriMove > 0 || _nVertMove > 0) &&
903*b1cdbd2cSJim Jagielski              mbDoesLayoutRowsFitIntoWindow &&
904*b1cdbd2cSJim Jagielski              mbDoesLayoutColsFitIntoWindow && // OD 20.02.2003 #107369# - add condition
905*b1cdbd2cSJim Jagielski              nCurrRow > nTotalRows - mnRows )
906*b1cdbd2cSJim Jagielski         {
907*b1cdbd2cSJim Jagielski             // new proposed start page = left-top-corner of last possible
908*b1cdbd2cSJim Jagielski             // preview page.
909*b1cdbd2cSJim Jagielski             nNewStartPage = (nTotalRows - mnRows) * mnCols + 1;
910*b1cdbd2cSJim Jagielski             // OD 19.02.2003 #107369# - leaving left-top-corner blank is controlled
911*b1cdbd2cSJim Jagielski             // by <mbBookPreview>.
912*b1cdbd2cSJim Jagielski             if ( mbBookPreview )
913*b1cdbd2cSJim Jagielski             {
914*b1cdbd2cSJim Jagielski                 // Note: decrease new proposed start page number by one,
915*b1cdbd2cSJim Jagielski                 // because of blank left-top-corner
916*b1cdbd2cSJim Jagielski                 --nNewStartPage;
917*b1cdbd2cSJim Jagielski             }
918*b1cdbd2cSJim Jagielski             nNewStartPage = ConvertRelativeToAbsolutePageNum( nNewStartPage );
919*b1cdbd2cSJim Jagielski         }
920*b1cdbd2cSJim Jagielski         else
921*b1cdbd2cSJim Jagielski         {
922*b1cdbd2cSJim Jagielski             // new proposed start page = new selected page.
923*b1cdbd2cSJim Jagielski             nNewStartPage = ConvertRelativeToAbsolutePageNum( nNewRelSelectedPageNum );
924*b1cdbd2cSJim Jagielski         }
925*b1cdbd2cSJim Jagielski     }
926*b1cdbd2cSJim Jagielski 
927*b1cdbd2cSJim Jagielski     _orNewSelectedPage = nNewAbsSelectedPageNum;
928*b1cdbd2cSJim Jagielski     _orNewStartPage = nNewStartPage;
929*b1cdbd2cSJim Jagielski     _orNewStartPos = aNewStartPos;
930*b1cdbd2cSJim Jagielski 
931*b1cdbd2cSJim Jagielski     return true;
932*b1cdbd2cSJim Jagielski }
933*b1cdbd2cSJim Jagielski 
934*b1cdbd2cSJim Jagielski /** checks, if given position is inside a shown document page
935*b1cdbd2cSJim Jagielski 
936*b1cdbd2cSJim Jagielski     OD 17.12.2002 #103492#
937*b1cdbd2cSJim Jagielski 
938*b1cdbd2cSJim Jagielski     @author OD
939*b1cdbd2cSJim Jagielski */
940*b1cdbd2cSJim Jagielski struct PrevwPosInsidePagePred
941*b1cdbd2cSJim Jagielski {
942*b1cdbd2cSJim Jagielski     const Point mnPrevwPos;
PrevwPosInsidePagePredPrevwPosInsidePagePred943*b1cdbd2cSJim Jagielski     PrevwPosInsidePagePred( const Point _nPrevwPos ) : mnPrevwPos( _nPrevwPos ) {};
operator ()PrevwPosInsidePagePred944*b1cdbd2cSJim Jagielski     bool operator() ( const PrevwPage* _pPrevwPage )
945*b1cdbd2cSJim Jagielski     {
946*b1cdbd2cSJim Jagielski         if ( _pPrevwPage->bVisible )
947*b1cdbd2cSJim Jagielski         {
948*b1cdbd2cSJim Jagielski             Rectangle aPrevwPageRect( _pPrevwPage->aPrevwWinPos, _pPrevwPage->aPageSize );
949*b1cdbd2cSJim Jagielski             return aPrevwPageRect.IsInside( mnPrevwPos ) ? true : false;
950*b1cdbd2cSJim Jagielski         }
951*b1cdbd2cSJim Jagielski         else
952*b1cdbd2cSJim Jagielski             return false;
953*b1cdbd2cSJim Jagielski     }
954*b1cdbd2cSJim Jagielski };
955*b1cdbd2cSJim Jagielski 
IsPrevwPosInDocPrevwPage(const Point _aPrevwPos,Point & _orDocPos,bool & _obPosInEmptyPage,sal_uInt16 & _onPageNum) const956*b1cdbd2cSJim Jagielski bool SwPagePreviewLayout::IsPrevwPosInDocPrevwPage( const Point  _aPrevwPos,
957*b1cdbd2cSJim Jagielski                                                     Point&       _orDocPos,
958*b1cdbd2cSJim Jagielski                                                     bool&        _obPosInEmptyPage,
959*b1cdbd2cSJim Jagielski                                                     sal_uInt16&  _onPageNum ) const
960*b1cdbd2cSJim Jagielski {
961*b1cdbd2cSJim Jagielski     bool bIsPosInsideDoc;
962*b1cdbd2cSJim Jagielski 
963*b1cdbd2cSJim Jagielski     // initialize variable parameter values.
964*b1cdbd2cSJim Jagielski     _orDocPos.X() = 0;
965*b1cdbd2cSJim Jagielski     _orDocPos.Y() = 0;
966*b1cdbd2cSJim Jagielski     _obPosInEmptyPage = false;
967*b1cdbd2cSJim Jagielski     _onPageNum = 0;
968*b1cdbd2cSJim Jagielski 
969*b1cdbd2cSJim Jagielski     std::vector<PrevwPage*>::const_iterator aFoundPrevwPageIter =
970*b1cdbd2cSJim Jagielski             std::find_if( maPrevwPages.begin(), maPrevwPages.end(),
971*b1cdbd2cSJim Jagielski                           PrevwPosInsidePagePred( _aPrevwPos ) );
972*b1cdbd2cSJim Jagielski 
973*b1cdbd2cSJim Jagielski     if ( aFoundPrevwPageIter == maPrevwPages.end() )
974*b1cdbd2cSJim Jagielski         // given preview position outside a document page.
975*b1cdbd2cSJim Jagielski         bIsPosInsideDoc = false;
976*b1cdbd2cSJim Jagielski     else
977*b1cdbd2cSJim Jagielski     {
978*b1cdbd2cSJim Jagielski         _onPageNum = (*aFoundPrevwPageIter)->pPage->GetPhyPageNum();
979*b1cdbd2cSJim Jagielski         if ( (*aFoundPrevwPageIter)->pPage->IsEmptyPage() )
980*b1cdbd2cSJim Jagielski         {
981*b1cdbd2cSJim Jagielski             // given preview position inside an empty page
982*b1cdbd2cSJim Jagielski             bIsPosInsideDoc = false;
983*b1cdbd2cSJim Jagielski             _obPosInEmptyPage = true;
984*b1cdbd2cSJim Jagielski         }
985*b1cdbd2cSJim Jagielski         else
986*b1cdbd2cSJim Jagielski         {
987*b1cdbd2cSJim Jagielski             // given preview position inside a normal page
988*b1cdbd2cSJim Jagielski             bIsPosInsideDoc = true;
989*b1cdbd2cSJim Jagielski             _orDocPos = _aPrevwPos -
990*b1cdbd2cSJim Jagielski                         (*aFoundPrevwPageIter)->aPrevwWinPos +
991*b1cdbd2cSJim Jagielski                         (*aFoundPrevwPageIter)->aLogicPos;
992*b1cdbd2cSJim Jagielski         }
993*b1cdbd2cSJim Jagielski     }
994*b1cdbd2cSJim Jagielski 
995*b1cdbd2cSJim Jagielski     return bIsPosInsideDoc;
996*b1cdbd2cSJim Jagielski }
997*b1cdbd2cSJim Jagielski 
998*b1cdbd2cSJim Jagielski /** determine window page scroll amount
999*b1cdbd2cSJim Jagielski 
1000*b1cdbd2cSJim Jagielski     OD 17.12.2002 #103492#
1001*b1cdbd2cSJim Jagielski 
1002*b1cdbd2cSJim Jagielski     @author OD
1003*b1cdbd2cSJim Jagielski */
GetWinPagesScrollAmount(const sal_Int16 _nWinPagesToScroll) const1004*b1cdbd2cSJim Jagielski SwTwips SwPagePreviewLayout::GetWinPagesScrollAmount(
1005*b1cdbd2cSJim Jagielski                                 const sal_Int16 _nWinPagesToScroll ) const
1006*b1cdbd2cSJim Jagielski {
1007*b1cdbd2cSJim Jagielski     SwTwips nScrollAmount;
1008*b1cdbd2cSJim Jagielski     if ( mbDoesLayoutRowsFitIntoWindow )
1009*b1cdbd2cSJim Jagielski     {
1010*b1cdbd2cSJim Jagielski         nScrollAmount = (mnPrevwLayoutHeight - mnYFree) * _nWinPagesToScroll;
1011*b1cdbd2cSJim Jagielski     }
1012*b1cdbd2cSJim Jagielski     else
1013*b1cdbd2cSJim Jagielski         nScrollAmount = _nWinPagesToScroll * maPaintedPrevwDocRect.GetHeight();
1014*b1cdbd2cSJim Jagielski 
1015*b1cdbd2cSJim Jagielski     // OD 19.02.2003 #107369# - check, if preview layout size values are valid.
1016*b1cdbd2cSJim Jagielski     // If not, the checks for an adjustment of the scroll amount aren't useful.
1017*b1cdbd2cSJim Jagielski     if ( mbLayoutSizesValid )
1018*b1cdbd2cSJim Jagielski     {
1019*b1cdbd2cSJim Jagielski         if ( (maPaintedPrevwDocRect.Top() + nScrollAmount) <= 0 )
1020*b1cdbd2cSJim Jagielski             nScrollAmount = -maPaintedPrevwDocRect.Top();
1021*b1cdbd2cSJim Jagielski 
1022*b1cdbd2cSJim Jagielski         // OD 14.02.2003 #107369# - correct scroll amount
1023*b1cdbd2cSJim Jagielski         if ( nScrollAmount > 0 &&
1024*b1cdbd2cSJim Jagielski              maPaintedPrevwDocRect.Bottom() == maPreviewDocRect.Bottom()
1025*b1cdbd2cSJim Jagielski            )
1026*b1cdbd2cSJim Jagielski         {
1027*b1cdbd2cSJim Jagielski             nScrollAmount = 0;
1028*b1cdbd2cSJim Jagielski         }
1029*b1cdbd2cSJim Jagielski         else
1030*b1cdbd2cSJim Jagielski         {
1031*b1cdbd2cSJim Jagielski             while ( (maPaintedPrevwDocRect.Top() + nScrollAmount + mnYFree) >= maPreviewDocRect.GetHeight() )
1032*b1cdbd2cSJim Jagielski             {
1033*b1cdbd2cSJim Jagielski                 nScrollAmount -= mnRowHeight;
1034*b1cdbd2cSJim Jagielski             }
1035*b1cdbd2cSJim Jagielski         }
1036*b1cdbd2cSJim Jagielski     }
1037*b1cdbd2cSJim Jagielski 
1038*b1cdbd2cSJim Jagielski     return nScrollAmount;
1039*b1cdbd2cSJim Jagielski }
1040*b1cdbd2cSJim Jagielski 
1041*b1cdbd2cSJim Jagielski // =============================================================================
1042*b1cdbd2cSJim Jagielski // methods to paint page preview layout
1043*b1cdbd2cSJim Jagielski // =============================================================================
1044*b1cdbd2cSJim Jagielski /** paint prepared preview
1045*b1cdbd2cSJim Jagielski 
1046*b1cdbd2cSJim Jagielski     OD 12.12.2002 #103492#
1047*b1cdbd2cSJim Jagielski 
1048*b1cdbd2cSJim Jagielski     @author OD
1049*b1cdbd2cSJim Jagielski */
Paint(const Rectangle _aOutRect) const1050*b1cdbd2cSJim Jagielski bool SwPagePreviewLayout::Paint( const Rectangle  _aOutRect ) const
1051*b1cdbd2cSJim Jagielski {
1052*b1cdbd2cSJim Jagielski     // check environment and parameters
1053*b1cdbd2cSJim Jagielski     {
1054*b1cdbd2cSJim Jagielski         if ( !mrParentViewShell.GetWin() &&
1055*b1cdbd2cSJim Jagielski              !mrParentViewShell.GetOut()->GetConnectMetaFile() )
1056*b1cdbd2cSJim Jagielski             return false;
1057*b1cdbd2cSJim Jagielski 
1058*b1cdbd2cSJim Jagielski         ASSERT( mbPaintInfoValid,
1059*b1cdbd2cSJim Jagielski                 "invalid preview settings - no paint of preview" );
1060*b1cdbd2cSJim Jagielski         if ( !mbPaintInfoValid )
1061*b1cdbd2cSJim Jagielski             return false;
1062*b1cdbd2cSJim Jagielski     }
1063*b1cdbd2cSJim Jagielski 
1064*b1cdbd2cSJim Jagielski     // OD 17.11.2003 #i22014# - no paint, if <superfluous> flag is set at layout
1065*b1cdbd2cSJim Jagielski     if ( mrLayoutRootFrm.IsSuperfluous() )
1066*b1cdbd2cSJim Jagielski     {
1067*b1cdbd2cSJim Jagielski         return true;
1068*b1cdbd2cSJim Jagielski     }
1069*b1cdbd2cSJim Jagielski 
1070*b1cdbd2cSJim Jagielski     // environment and parameter ok
1071*b1cdbd2cSJim Jagielski 
1072*b1cdbd2cSJim Jagielski     // OD 07.11.2003 #i22014#
1073*b1cdbd2cSJim Jagielski     if ( mbInPaint )
1074*b1cdbd2cSJim Jagielski     {
1075*b1cdbd2cSJim Jagielski         return false;
1076*b1cdbd2cSJim Jagielski     }
1077*b1cdbd2cSJim Jagielski     mbInPaint = true;
1078*b1cdbd2cSJim Jagielski 
1079*b1cdbd2cSJim Jagielski     OutputDevice* pOutputDev = mrParentViewShell.GetOut();
1080*b1cdbd2cSJim Jagielski 
1081*b1cdbd2cSJim Jagielski     // prepare paint
1082*b1cdbd2cSJim Jagielski     if ( maPrevwPages.size() > 0 )
1083*b1cdbd2cSJim Jagielski     {
1084*b1cdbd2cSJim Jagielski         mrParentViewShell.Imp()->bFirstPageInvalid = sal_False;
1085*b1cdbd2cSJim Jagielski         mrParentViewShell.Imp()->pFirstVisPage =
1086*b1cdbd2cSJim Jagielski                 const_cast<SwPageFrm*>(maPrevwPages[0]->pPage);
1087*b1cdbd2cSJim Jagielski     }
1088*b1cdbd2cSJim Jagielski 
1089*b1cdbd2cSJim Jagielski     // paint preview background
1090*b1cdbd2cSJim Jagielski     {
1091*b1cdbd2cSJim Jagielski         SwRegionRects aPreviewBackgrdRegion( _aOutRect );
1092*b1cdbd2cSJim Jagielski         // calculate preview background rectangles
1093*b1cdbd2cSJim Jagielski         for ( std::vector<PrevwPage*>::const_iterator aPageIter = maPrevwPages.begin();
1094*b1cdbd2cSJim Jagielski               aPageIter != maPrevwPages.end();
1095*b1cdbd2cSJim Jagielski               ++aPageIter )
1096*b1cdbd2cSJim Jagielski         {
1097*b1cdbd2cSJim Jagielski             if ( (*aPageIter)->bVisible )
1098*b1cdbd2cSJim Jagielski             {
1099*b1cdbd2cSJim Jagielski                 aPreviewBackgrdRegion -=
1100*b1cdbd2cSJim Jagielski                         SwRect( (*aPageIter)->aPrevwWinPos, (*aPageIter)->aPageSize );
1101*b1cdbd2cSJim Jagielski             }
1102*b1cdbd2cSJim Jagielski         }
1103*b1cdbd2cSJim Jagielski         // paint preview background rectangles
1104*b1cdbd2cSJim Jagielski         mrParentViewShell._PaintDesktop( aPreviewBackgrdRegion );
1105*b1cdbd2cSJim Jagielski     }
1106*b1cdbd2cSJim Jagielski 
1107*b1cdbd2cSJim Jagielski     // prepare data for paint of pages
1108*b1cdbd2cSJim Jagielski     const Rectangle aPxOutRect( pOutputDev->LogicToPixel( _aOutRect ) );
1109*b1cdbd2cSJim Jagielski 
1110*b1cdbd2cSJim Jagielski     MapMode aMapMode( pOutputDev->GetMapMode() );
1111*b1cdbd2cSJim Jagielski     MapMode aSavedMapMode = aMapMode;
1112*b1cdbd2cSJim Jagielski 
1113*b1cdbd2cSJim Jagielski     const Font& rEmptyPgFont = SwPageFrm::GetEmptyPageFont();
1114*b1cdbd2cSJim Jagielski 
1115*b1cdbd2cSJim Jagielski     Color aEmptyPgShadowBorderColor = SwViewOption::GetFontColor();
1116*b1cdbd2cSJim Jagielski 
1117*b1cdbd2cSJim Jagielski     for ( std::vector<PrevwPage*>::const_iterator aPageIter = maPrevwPages.begin();
1118*b1cdbd2cSJim Jagielski           aPageIter != maPrevwPages.end();
1119*b1cdbd2cSJim Jagielski           ++aPageIter )
1120*b1cdbd2cSJim Jagielski     {
1121*b1cdbd2cSJim Jagielski         if ( !(*aPageIter)->bVisible )
1122*b1cdbd2cSJim Jagielski             continue;
1123*b1cdbd2cSJim Jagielski 
1124*b1cdbd2cSJim Jagielski         Rectangle aPageRect( (*aPageIter)->aLogicPos, (*aPageIter)->aPageSize );
1125*b1cdbd2cSJim Jagielski         aMapMode.SetOrigin( (*aPageIter)->aMapOffset );
1126*b1cdbd2cSJim Jagielski         pOutputDev->SetMapMode( aMapMode );
1127*b1cdbd2cSJim Jagielski         Rectangle aPxPaintRect = pOutputDev->LogicToPixel( aPageRect );
1128*b1cdbd2cSJim Jagielski         if ( aPxOutRect.IsOver( aPxPaintRect) )
1129*b1cdbd2cSJim Jagielski         {
1130*b1cdbd2cSJim Jagielski             if ( (*aPageIter)->pPage->IsEmptyPage() )
1131*b1cdbd2cSJim Jagielski             {
1132*b1cdbd2cSJim Jagielski                 const Color aRetouche( mrParentViewShell.Imp()->GetRetoucheColor() );
1133*b1cdbd2cSJim Jagielski                 if( pOutputDev->GetFillColor() != aRetouche )
1134*b1cdbd2cSJim Jagielski                     pOutputDev->SetFillColor( aRetouche );
1135*b1cdbd2cSJim Jagielski                 pOutputDev->SetLineColor(); // OD 20.02.2003 #107369# - no line color
1136*b1cdbd2cSJim Jagielski                 // OD 20.02.2003 #107369# - use aligned page rectangle
1137*b1cdbd2cSJim Jagielski                 {
1138*b1cdbd2cSJim Jagielski                     SwRect aTmpPageRect( aPageRect );
1139*b1cdbd2cSJim Jagielski                     ::SwAlignRect( aTmpPageRect, &mrParentViewShell);
1140*b1cdbd2cSJim Jagielski                     aPageRect = aTmpPageRect.SVRect();
1141*b1cdbd2cSJim Jagielski                 }
1142*b1cdbd2cSJim Jagielski                 pOutputDev->DrawRect( aPageRect );
1143*b1cdbd2cSJim Jagielski 
1144*b1cdbd2cSJim Jagielski                 // paint empty page text
1145*b1cdbd2cSJim Jagielski                 Font aOldFont( pOutputDev->GetFont() );
1146*b1cdbd2cSJim Jagielski                 pOutputDev->SetFont( rEmptyPgFont );
1147*b1cdbd2cSJim Jagielski                 pOutputDev->DrawText( aPageRect, SW_RESSTR( STR_EMPTYPAGE ),
1148*b1cdbd2cSJim Jagielski                                     TEXT_DRAW_VCENTER |
1149*b1cdbd2cSJim Jagielski                                     TEXT_DRAW_CENTER |
1150*b1cdbd2cSJim Jagielski                                     TEXT_DRAW_CLIP );
1151*b1cdbd2cSJim Jagielski                 pOutputDev->SetFont( aOldFont );
1152*b1cdbd2cSJim Jagielski                 // paint shadow and border for empty page
1153*b1cdbd2cSJim Jagielski                 // OD 19.02.2003 #107369# - use new method to paint page border and
1154*b1cdbd2cSJim Jagielski                 // shadow
1155*b1cdbd2cSJim Jagielski                 SwPageFrm::PaintBorderAndShadow( aPageRect, &mrParentViewShell, true, true );
1156*b1cdbd2cSJim Jagielski             }
1157*b1cdbd2cSJim Jagielski             else
1158*b1cdbd2cSJim Jagielski             {
1159*b1cdbd2cSJim Jagielski                 mrParentViewShell.aVisArea = aPageRect;
1160*b1cdbd2cSJim Jagielski                 aPxPaintRect.Intersection( aPxOutRect );
1161*b1cdbd2cSJim Jagielski                 Rectangle aPaintRect = pOutputDev->PixelToLogic( aPxPaintRect );
1162*b1cdbd2cSJim Jagielski                 mrParentViewShell.Paint( aPaintRect );
1163*b1cdbd2cSJim Jagielski                 // --> OD 2007-08-15 #i80691#
1164*b1cdbd2cSJim Jagielski                 // paint page border and shadow
1165*b1cdbd2cSJim Jagielski                 {
1166*b1cdbd2cSJim Jagielski                     SwRect aPageBorderRect;
1167*b1cdbd2cSJim Jagielski                     SwPageFrm::GetBorderAndShadowBoundRect( SwRect( aPageRect ), &mrParentViewShell, aPageBorderRect, true );
1168*b1cdbd2cSJim Jagielski                     const Region aDLRegion(aPageBorderRect.SVRect());
1169*b1cdbd2cSJim Jagielski                     mrParentViewShell.DLPrePaint2(aDLRegion);
1170*b1cdbd2cSJim Jagielski                     SwPageFrm::PaintBorderAndShadow( aPageRect, &mrParentViewShell, true, true );
1171*b1cdbd2cSJim Jagielski                     mrParentViewShell.DLPostPaint2(true);
1172*b1cdbd2cSJim Jagielski                 }
1173*b1cdbd2cSJim Jagielski                 // <--
1174*b1cdbd2cSJim Jagielski             }
1175*b1cdbd2cSJim Jagielski             // OD 07.11.2003 #i22014# - stop painting, because new print
1176*b1cdbd2cSJim Jagielski             // preview layout is created during paint.
1177*b1cdbd2cSJim Jagielski             if ( mbNewLayoutDuringPaint )
1178*b1cdbd2cSJim Jagielski             {
1179*b1cdbd2cSJim Jagielski                 break;
1180*b1cdbd2cSJim Jagielski             }
1181*b1cdbd2cSJim Jagielski 
1182*b1cdbd2cSJim Jagielski             if ( (*aPageIter)->pPage->GetPhyPageNum() == mnSelectedPageNum )
1183*b1cdbd2cSJim Jagielski             {
1184*b1cdbd2cSJim Jagielski                 _PaintSelectMarkAtPage( (*aPageIter) );
1185*b1cdbd2cSJim Jagielski             }
1186*b1cdbd2cSJim Jagielski 
1187*b1cdbd2cSJim Jagielski         }
1188*b1cdbd2cSJim Jagielski     }
1189*b1cdbd2cSJim Jagielski 
1190*b1cdbd2cSJim Jagielski     // OD 17.11.2003 #i22014# - no update of accessible preview, if a new
1191*b1cdbd2cSJim Jagielski     // print preview layout is created during paint.
1192*b1cdbd2cSJim Jagielski     if ( !mbNewLayoutDuringPaint )
1193*b1cdbd2cSJim Jagielski     {
1194*b1cdbd2cSJim Jagielski         // update at accessiblilty interface
1195*b1cdbd2cSJim Jagielski         mrParentViewShell.Imp()->UpdateAccessiblePreview(
1196*b1cdbd2cSJim Jagielski                         maPrevwPages,
1197*b1cdbd2cSJim Jagielski                         aMapMode.GetScaleX(),
1198*b1cdbd2cSJim Jagielski                         mrLayoutRootFrm.GetPageByPageNum( mnSelectedPageNum ),
1199*b1cdbd2cSJim Jagielski                         maWinSize );
1200*b1cdbd2cSJim Jagielski     }
1201*b1cdbd2cSJim Jagielski 
1202*b1cdbd2cSJim Jagielski     pOutputDev->SetMapMode( aSavedMapMode );
1203*b1cdbd2cSJim Jagielski     mrParentViewShell.aVisArea.Clear();
1204*b1cdbd2cSJim Jagielski 
1205*b1cdbd2cSJim Jagielski     // OD 07.11.2003 #i22014#
1206*b1cdbd2cSJim Jagielski     mbInPaint = false;
1207*b1cdbd2cSJim Jagielski     mbNewLayoutDuringPaint = false;
1208*b1cdbd2cSJim Jagielski 
1209*b1cdbd2cSJim Jagielski     return true;
1210*b1cdbd2cSJim Jagielski }
1211*b1cdbd2cSJim Jagielski 
1212*b1cdbd2cSJim Jagielski /** repaint pages on page preview
1213*b1cdbd2cSJim Jagielski 
1214*b1cdbd2cSJim Jagielski     OD 18.12.2002 #103492#
1215*b1cdbd2cSJim Jagielski 
1216*b1cdbd2cSJim Jagielski     @author OD
1217*b1cdbd2cSJim Jagielski */
Repaint(const Rectangle _aInvalidCoreRect) const1218*b1cdbd2cSJim Jagielski void SwPagePreviewLayout::Repaint( const Rectangle _aInvalidCoreRect ) const
1219*b1cdbd2cSJim Jagielski {
1220*b1cdbd2cSJim Jagielski     // check environment and parameters
1221*b1cdbd2cSJim Jagielski     {
1222*b1cdbd2cSJim Jagielski         if ( !mrParentViewShell.GetWin() &&
1223*b1cdbd2cSJim Jagielski              !mrParentViewShell.GetOut()->GetConnectMetaFile() )
1224*b1cdbd2cSJim Jagielski             return;
1225*b1cdbd2cSJim Jagielski 
1226*b1cdbd2cSJim Jagielski         ASSERT( mbPaintInfoValid,
1227*b1cdbd2cSJim Jagielski                 "invalid preview settings - no paint of preview" );
1228*b1cdbd2cSJim Jagielski         if ( !mbPaintInfoValid )
1229*b1cdbd2cSJim Jagielski             return;
1230*b1cdbd2cSJim Jagielski     }
1231*b1cdbd2cSJim Jagielski 
1232*b1cdbd2cSJim Jagielski     // environment and parameter ok
1233*b1cdbd2cSJim Jagielski 
1234*b1cdbd2cSJim Jagielski     // prepare paint
1235*b1cdbd2cSJim Jagielski     if ( maPrevwPages.size() > 0 )
1236*b1cdbd2cSJim Jagielski     {
1237*b1cdbd2cSJim Jagielski         mrParentViewShell.Imp()->bFirstPageInvalid = sal_False;
1238*b1cdbd2cSJim Jagielski         mrParentViewShell.Imp()->pFirstVisPage =
1239*b1cdbd2cSJim Jagielski                 const_cast<SwPageFrm*>(maPrevwPages[0]->pPage);
1240*b1cdbd2cSJim Jagielski     }
1241*b1cdbd2cSJim Jagielski 
1242*b1cdbd2cSJim Jagielski     // invalidate visible pages, which overlap the invalid core rectangle
1243*b1cdbd2cSJim Jagielski     for ( std::vector<PrevwPage*>::const_iterator aPageIter = maPrevwPages.begin();
1244*b1cdbd2cSJim Jagielski           aPageIter != maPrevwPages.end();
1245*b1cdbd2cSJim Jagielski           ++aPageIter )
1246*b1cdbd2cSJim Jagielski     {
1247*b1cdbd2cSJim Jagielski         if ( !(*aPageIter)->bVisible )
1248*b1cdbd2cSJim Jagielski             continue;
1249*b1cdbd2cSJim Jagielski 
1250*b1cdbd2cSJim Jagielski         Rectangle aPageRect( (*aPageIter)->aLogicPos, (*aPageIter)->aPageSize );
1251*b1cdbd2cSJim Jagielski         if ( _aInvalidCoreRect.IsOver( aPageRect ) )
1252*b1cdbd2cSJim Jagielski         {
1253*b1cdbd2cSJim Jagielski             aPageRect.Intersection( _aInvalidCoreRect );
1254*b1cdbd2cSJim Jagielski             Rectangle aInvalidPrevwRect = aPageRect;
1255*b1cdbd2cSJim Jagielski             aInvalidPrevwRect.SetPos( aInvalidPrevwRect.TopLeft() -
1256*b1cdbd2cSJim Jagielski                                       (*aPageIter)->aLogicPos +
1257*b1cdbd2cSJim Jagielski                                       (*aPageIter)->aPrevwWinPos );
1258*b1cdbd2cSJim Jagielski             mrParentViewShell.GetWin()->Invalidate( aInvalidPrevwRect );
1259*b1cdbd2cSJim Jagielski         }
1260*b1cdbd2cSJim Jagielski     }
1261*b1cdbd2cSJim Jagielski }
1262*b1cdbd2cSJim Jagielski 
1263*b1cdbd2cSJim Jagielski /** paint selection mark at page
1264*b1cdbd2cSJim Jagielski 
1265*b1cdbd2cSJim Jagielski     OD 17.12.2002 #103492#
1266*b1cdbd2cSJim Jagielski 
1267*b1cdbd2cSJim Jagielski     @author OD
1268*b1cdbd2cSJim Jagielski */
_PaintSelectMarkAtPage(const PrevwPage * _aSelectedPrevwPage) const1269*b1cdbd2cSJim Jagielski void SwPagePreviewLayout::_PaintSelectMarkAtPage(
1270*b1cdbd2cSJim Jagielski                                     const PrevwPage* _aSelectedPrevwPage ) const
1271*b1cdbd2cSJim Jagielski {
1272*b1cdbd2cSJim Jagielski     OutputDevice* pOutputDev = mrParentViewShell.GetOut();
1273*b1cdbd2cSJim Jagielski     MapMode aMapMode( pOutputDev->GetMapMode() );
1274*b1cdbd2cSJim Jagielski     // save mapping mode of output device
1275*b1cdbd2cSJim Jagielski     MapMode aSavedMapMode = aMapMode;
1276*b1cdbd2cSJim Jagielski     // save fill and line color of output device
1277*b1cdbd2cSJim Jagielski     Color aFill( pOutputDev->GetFillColor() );
1278*b1cdbd2cSJim Jagielski     Color aLine( pOutputDev->GetLineColor() );
1279*b1cdbd2cSJim Jagielski 
1280*b1cdbd2cSJim Jagielski     // determine selection mark color
1281*b1cdbd2cSJim Jagielski     Color aSelPgLineColor(COL_LIGHTBLUE);
1282*b1cdbd2cSJim Jagielski     const StyleSettings& rSettings =
1283*b1cdbd2cSJim Jagielski         mrParentViewShell.GetWin()->GetSettings().GetStyleSettings();
1284*b1cdbd2cSJim Jagielski     if ( rSettings.GetHighContrastMode() )
1285*b1cdbd2cSJim Jagielski         aSelPgLineColor = rSettings.GetHighlightTextColor();
1286*b1cdbd2cSJim Jagielski 
1287*b1cdbd2cSJim Jagielski     // set needed mapping mode at output device
1288*b1cdbd2cSJim Jagielski     aMapMode.SetOrigin( _aSelectedPrevwPage->aMapOffset );
1289*b1cdbd2cSJim Jagielski     pOutputDev->SetMapMode( aMapMode );
1290*b1cdbd2cSJim Jagielski 
1291*b1cdbd2cSJim Jagielski     // calculate page rectangle in pixel coordinates
1292*b1cdbd2cSJim Jagielski     SwRect aPageRect( _aSelectedPrevwPage->aLogicPos,
1293*b1cdbd2cSJim Jagielski                          _aSelectedPrevwPage->aPageSize );
1294*b1cdbd2cSJim Jagielski     // OD 19.02.2003 #107369# - use aligned page rectangle, as it is used for
1295*b1cdbd2cSJim Jagielski     // page border and shadow paint - see <SwPageFrm::PaintBorderAndShadow(..)>
1296*b1cdbd2cSJim Jagielski     ::SwAlignRect( aPageRect, &mrParentViewShell);
1297*b1cdbd2cSJim Jagielski     Rectangle aPxPageRect = pOutputDev->LogicToPixel( aPageRect.SVRect() );
1298*b1cdbd2cSJim Jagielski 
1299*b1cdbd2cSJim Jagielski     // draw two rectangle
1300*b1cdbd2cSJim Jagielski     // OD 19.02.2003 #107369# - adjust position of select mark rectangle
1301*b1cdbd2cSJim Jagielski     Rectangle aRect( aPxPageRect.Left(), aPxPageRect.Top(),
1302*b1cdbd2cSJim Jagielski                        aPxPageRect.Right(), aPxPageRect.Bottom() );
1303*b1cdbd2cSJim Jagielski     aRect = pOutputDev->PixelToLogic( aRect );
1304*b1cdbd2cSJim Jagielski     pOutputDev->SetFillColor(); // OD 20.02.2003 #107369# - no fill color
1305*b1cdbd2cSJim Jagielski     pOutputDev->SetLineColor( aSelPgLineColor );
1306*b1cdbd2cSJim Jagielski     pOutputDev->DrawRect( aRect );
1307*b1cdbd2cSJim Jagielski     // OD 19.02.2003 #107369# - adjust position of select mark rectangle
1308*b1cdbd2cSJim Jagielski     aRect = Rectangle( aPxPageRect.Left()+1, aPxPageRect.Top()+1,
1309*b1cdbd2cSJim Jagielski                        aPxPageRect.Right()-1, aPxPageRect.Bottom()-1 );
1310*b1cdbd2cSJim Jagielski     aRect = pOutputDev->PixelToLogic( aRect );
1311*b1cdbd2cSJim Jagielski     pOutputDev->DrawRect( aRect );
1312*b1cdbd2cSJim Jagielski 
1313*b1cdbd2cSJim Jagielski     // reset fill and line color of output device
1314*b1cdbd2cSJim Jagielski     pOutputDev->SetFillColor( aFill );
1315*b1cdbd2cSJim Jagielski     pOutputDev->SetLineColor( aLine );
1316*b1cdbd2cSJim Jagielski 
1317*b1cdbd2cSJim Jagielski     // reset mapping mode of output device
1318*b1cdbd2cSJim Jagielski     pOutputDev->SetMapMode( aSavedMapMode );
1319*b1cdbd2cSJim Jagielski }
1320*b1cdbd2cSJim Jagielski 
1321*b1cdbd2cSJim Jagielski /** paint to mark new selected page
1322*b1cdbd2cSJim Jagielski 
1323*b1cdbd2cSJim Jagielski     OD 17.12.2002 #103492#
1324*b1cdbd2cSJim Jagielski     Perform paint for current selected page in order to unmark it.
1325*b1cdbd2cSJim Jagielski     Set new selected page and perform paint to mark this page.
1326*b1cdbd2cSJim Jagielski 
1327*b1cdbd2cSJim Jagielski     @author OD, _nSelectedPage, mnSelectedPage are absolut
1328*b1cdbd2cSJim Jagielski */
MarkNewSelectedPage(const sal_uInt16 _nSelectedPage)1329*b1cdbd2cSJim Jagielski void SwPagePreviewLayout::MarkNewSelectedPage( const sal_uInt16 _nSelectedPage )
1330*b1cdbd2cSJim Jagielski {
1331*b1cdbd2cSJim Jagielski     sal_uInt16 nOldSelectedPageNum = mnSelectedPageNum;
1332*b1cdbd2cSJim Jagielski     mnSelectedPageNum = _nSelectedPage;
1333*b1cdbd2cSJim Jagielski 
1334*b1cdbd2cSJim Jagielski     // re-paint for current selected page in order to umark it.
1335*b1cdbd2cSJim Jagielski     const PrevwPage* pOldSelectedPrevwPage = _GetPrevwPageByPageNum( nOldSelectedPageNum );
1336*b1cdbd2cSJim Jagielski     if ( pOldSelectedPrevwPage && pOldSelectedPrevwPage->bVisible )
1337*b1cdbd2cSJim Jagielski     {
1338*b1cdbd2cSJim Jagielski         // OD 20.02.2003 #107369# - invalidate only areas of selection mark.
1339*b1cdbd2cSJim Jagielski         SwRect aPageRect( pOldSelectedPrevwPage->aPrevwWinPos,
1340*b1cdbd2cSJim Jagielski                               pOldSelectedPrevwPage->aPageSize );
1341*b1cdbd2cSJim Jagielski         ::SwAlignRect( aPageRect, &mrParentViewShell);
1342*b1cdbd2cSJim Jagielski         OutputDevice* pOutputDev = mrParentViewShell.GetOut();
1343*b1cdbd2cSJim Jagielski         Rectangle aPxPageRect = pOutputDev->LogicToPixel( aPageRect.SVRect() );
1344*b1cdbd2cSJim Jagielski         // invalidate top mark line
1345*b1cdbd2cSJim Jagielski         Rectangle aInvalPxRect( aPxPageRect.Left(), aPxPageRect.Top(),
1346*b1cdbd2cSJim Jagielski                                 aPxPageRect.Right(), aPxPageRect.Top()+1 );
1347*b1cdbd2cSJim Jagielski         mrParentViewShell.GetWin()->Invalidate( pOutputDev->PixelToLogic( aInvalPxRect ) );
1348*b1cdbd2cSJim Jagielski         // invalidate right mark line
1349*b1cdbd2cSJim Jagielski         aInvalPxRect = Rectangle( aPxPageRect.Right()-1, aPxPageRect.Top(),
1350*b1cdbd2cSJim Jagielski                                   aPxPageRect.Right(), aPxPageRect.Bottom() );
1351*b1cdbd2cSJim Jagielski         mrParentViewShell.GetWin()->Invalidate( pOutputDev->PixelToLogic( aInvalPxRect ) );
1352*b1cdbd2cSJim Jagielski         // invalidate bottom mark line
1353*b1cdbd2cSJim Jagielski         aInvalPxRect = Rectangle( aPxPageRect.Left(), aPxPageRect.Bottom()-1,
1354*b1cdbd2cSJim Jagielski                                   aPxPageRect.Right(), aPxPageRect.Bottom() );
1355*b1cdbd2cSJim Jagielski         mrParentViewShell.GetWin()->Invalidate( pOutputDev->PixelToLogic( aInvalPxRect ) );
1356*b1cdbd2cSJim Jagielski         // invalidate left mark line
1357*b1cdbd2cSJim Jagielski         aInvalPxRect = Rectangle( aPxPageRect.Left(), aPxPageRect.Top(),
1358*b1cdbd2cSJim Jagielski                                   aPxPageRect.Left()+1, aPxPageRect.Bottom() );
1359*b1cdbd2cSJim Jagielski         mrParentViewShell.GetWin()->Invalidate( pOutputDev->PixelToLogic( aInvalPxRect ) );
1360*b1cdbd2cSJim Jagielski     }
1361*b1cdbd2cSJim Jagielski 
1362*b1cdbd2cSJim Jagielski     // re-paint for new selected page in order to mark it.
1363*b1cdbd2cSJim Jagielski     const PrevwPage* pNewSelectedPrevwPage = _GetPrevwPageByPageNum( _nSelectedPage );
1364*b1cdbd2cSJim Jagielski     if ( pNewSelectedPrevwPage && pNewSelectedPrevwPage->bVisible )
1365*b1cdbd2cSJim Jagielski         _PaintSelectMarkAtPage( pNewSelectedPrevwPage );
1366*b1cdbd2cSJim Jagielski }
1367*b1cdbd2cSJim Jagielski 
1368*b1cdbd2cSJim Jagielski 
1369*b1cdbd2cSJim Jagielski // =============================================================================
1370*b1cdbd2cSJim Jagielski // helper methods
1371*b1cdbd2cSJim Jagielski // =============================================================================
1372*b1cdbd2cSJim Jagielski /** get preview page by physical page number
1373*b1cdbd2cSJim Jagielski 
1374*b1cdbd2cSJim Jagielski     OD 17.12.2002 #103492#
1375*b1cdbd2cSJim Jagielski 
1376*b1cdbd2cSJim Jagielski     @author OD
1377*b1cdbd2cSJim Jagielski */
1378*b1cdbd2cSJim Jagielski struct EqualsPageNumPred
1379*b1cdbd2cSJim Jagielski {
1380*b1cdbd2cSJim Jagielski     const sal_uInt16 mnPageNum;
EqualsPageNumPredEqualsPageNumPred1381*b1cdbd2cSJim Jagielski     EqualsPageNumPred( const sal_uInt16 _nPageNum ) : mnPageNum( _nPageNum ) {};
operator ()EqualsPageNumPred1382*b1cdbd2cSJim Jagielski     bool operator() ( const PrevwPage* _pPrevwPage )
1383*b1cdbd2cSJim Jagielski     {
1384*b1cdbd2cSJim Jagielski         return _pPrevwPage->pPage->GetPhyPageNum() == mnPageNum;
1385*b1cdbd2cSJim Jagielski     }
1386*b1cdbd2cSJim Jagielski };
1387*b1cdbd2cSJim Jagielski 
_GetPrevwPageByPageNum(const sal_uInt16 _nPageNum) const1388*b1cdbd2cSJim Jagielski const PrevwPage* SwPagePreviewLayout::_GetPrevwPageByPageNum( const sal_uInt16 _nPageNum ) const
1389*b1cdbd2cSJim Jagielski {
1390*b1cdbd2cSJim Jagielski     std::vector<PrevwPage*>::const_iterator aFoundPrevwPageIter =
1391*b1cdbd2cSJim Jagielski             std::find_if( maPrevwPages.begin(), maPrevwPages.end(),
1392*b1cdbd2cSJim Jagielski                           EqualsPageNumPred( _nPageNum ) );
1393*b1cdbd2cSJim Jagielski 
1394*b1cdbd2cSJim Jagielski     if ( aFoundPrevwPageIter == maPrevwPages.end() )
1395*b1cdbd2cSJim Jagielski         return 0;
1396*b1cdbd2cSJim Jagielski     else
1397*b1cdbd2cSJim Jagielski         return (*aFoundPrevwPageIter);
1398*b1cdbd2cSJim Jagielski }
1399*b1cdbd2cSJim Jagielski 
1400*b1cdbd2cSJim Jagielski /** determine row the page with the given number is in
1401*b1cdbd2cSJim Jagielski 
1402*b1cdbd2cSJim Jagielski     OD 17.01.2003 #103492#
1403*b1cdbd2cSJim Jagielski 
1404*b1cdbd2cSJim Jagielski     @author OD, _nPageNum is relative
1405*b1cdbd2cSJim Jagielski */
GetRowOfPage(sal_uInt16 _nPageNum) const1406*b1cdbd2cSJim Jagielski sal_uInt16 SwPagePreviewLayout::GetRowOfPage( sal_uInt16 _nPageNum ) const
1407*b1cdbd2cSJim Jagielski {
1408*b1cdbd2cSJim Jagielski     // OD 19.02.2003 #107369# - leaving left-top-corner blank is controlled
1409*b1cdbd2cSJim Jagielski     // by <mbBookPreview>.
1410*b1cdbd2cSJim Jagielski     if ( mbBookPreview )
1411*b1cdbd2cSJim Jagielski     {
1412*b1cdbd2cSJim Jagielski         // Note: increase given physical page number by one, because left-top-corner
1413*b1cdbd2cSJim Jagielski         //       in the preview layout is left blank.
1414*b1cdbd2cSJim Jagielski         ++_nPageNum;
1415*b1cdbd2cSJim Jagielski     }
1416*b1cdbd2cSJim Jagielski 
1417*b1cdbd2cSJim Jagielski     sal_uInt16 nRow = (_nPageNum) / mnCols;
1418*b1cdbd2cSJim Jagielski     if ( ( (_nPageNum) % mnCols ) > 0 )
1419*b1cdbd2cSJim Jagielski         ++nRow;
1420*b1cdbd2cSJim Jagielski 
1421*b1cdbd2cSJim Jagielski     return nRow;
1422*b1cdbd2cSJim Jagielski }
1423*b1cdbd2cSJim Jagielski 
1424*b1cdbd2cSJim Jagielski /** determine column the page with the given number is in
1425*b1cdbd2cSJim Jagielski 
1426*b1cdbd2cSJim Jagielski     OD 17.01.2003 #103492#
1427*b1cdbd2cSJim Jagielski 
1428*b1cdbd2cSJim Jagielski     @author OD, _nPageNum is relative
1429*b1cdbd2cSJim Jagielski */
GetColOfPage(sal_uInt16 _nPageNum) const1430*b1cdbd2cSJim Jagielski sal_uInt16 SwPagePreviewLayout::GetColOfPage( sal_uInt16 _nPageNum ) const
1431*b1cdbd2cSJim Jagielski {
1432*b1cdbd2cSJim Jagielski     // OD 19.02.2003 #107369# - leaving left-top-corner blank is controlled
1433*b1cdbd2cSJim Jagielski     // by <mbBookPreview>.
1434*b1cdbd2cSJim Jagielski     if ( mbBookPreview )
1435*b1cdbd2cSJim Jagielski     {
1436*b1cdbd2cSJim Jagielski         // Note: increase given physical page number by one, because left-top-corner
1437*b1cdbd2cSJim Jagielski         //       in the preview layout is left blank.
1438*b1cdbd2cSJim Jagielski         ++_nPageNum;
1439*b1cdbd2cSJim Jagielski     }
1440*b1cdbd2cSJim Jagielski 
1441*b1cdbd2cSJim Jagielski     sal_uInt16 nCol = (_nPageNum) % mnCols;
1442*b1cdbd2cSJim Jagielski     if ( nCol == 0 )
1443*b1cdbd2cSJim Jagielski         nCol = mnCols;
1444*b1cdbd2cSJim Jagielski 
1445*b1cdbd2cSJim Jagielski     return nCol;
1446*b1cdbd2cSJim Jagielski }
1447*b1cdbd2cSJim Jagielski 
GetPrevwDocSize() const1448*b1cdbd2cSJim Jagielski Size SwPagePreviewLayout::GetPrevwDocSize() const
1449*b1cdbd2cSJim Jagielski {
1450*b1cdbd2cSJim Jagielski     ASSERT( PreviewLayoutValid(), "PagePreviewLayout not valid" );
1451*b1cdbd2cSJim Jagielski     return maPreviewDocRect.GetSize();
1452*b1cdbd2cSJim Jagielski }
1453*b1cdbd2cSJim Jagielski 
1454*b1cdbd2cSJim Jagielski /** get size of a preview page by its physical page number
1455*b1cdbd2cSJim Jagielski 
1456*b1cdbd2cSJim Jagielski     OD 15.01.2003 #103492#
1457*b1cdbd2cSJim Jagielski 
1458*b1cdbd2cSJim Jagielski     @author OD
1459*b1cdbd2cSJim Jagielski */
GetPrevwPageSizeByPageNum(sal_uInt16 _nPageNum) const1460*b1cdbd2cSJim Jagielski Size SwPagePreviewLayout::GetPrevwPageSizeByPageNum( sal_uInt16 _nPageNum ) const
1461*b1cdbd2cSJim Jagielski {
1462*b1cdbd2cSJim Jagielski     const PrevwPage* pPrevwPage = _GetPrevwPageByPageNum( _nPageNum );
1463*b1cdbd2cSJim Jagielski     if ( pPrevwPage )
1464*b1cdbd2cSJim Jagielski     {
1465*b1cdbd2cSJim Jagielski         return pPrevwPage->aPageSize;
1466*b1cdbd2cSJim Jagielski     }
1467*b1cdbd2cSJim Jagielski     else
1468*b1cdbd2cSJim Jagielski     {
1469*b1cdbd2cSJim Jagielski         return Size( 0, 0 );
1470*b1cdbd2cSJim Jagielski     }
1471*b1cdbd2cSJim Jagielski }
1472*b1cdbd2cSJim Jagielski 
1473*b1cdbd2cSJim Jagielski /** get virtual page number by its physical page number
1474*b1cdbd2cSJim Jagielski 
1475*b1cdbd2cSJim Jagielski     OD 21.03.2003 #108282#
1476*b1cdbd2cSJim Jagielski 
1477*b1cdbd2cSJim Jagielski     @author OD
1478*b1cdbd2cSJim Jagielski */
GetVirtPageNumByPageNum(sal_uInt16 _nPageNum) const1479*b1cdbd2cSJim Jagielski sal_uInt16 SwPagePreviewLayout::GetVirtPageNumByPageNum( sal_uInt16 _nPageNum ) const
1480*b1cdbd2cSJim Jagielski {
1481*b1cdbd2cSJim Jagielski     const PrevwPage* pPrevwPage = _GetPrevwPageByPageNum( _nPageNum );
1482*b1cdbd2cSJim Jagielski     if ( pPrevwPage )
1483*b1cdbd2cSJim Jagielski     {
1484*b1cdbd2cSJim Jagielski         return pPrevwPage->pPage->GetVirtPageNum();
1485*b1cdbd2cSJim Jagielski     }
1486*b1cdbd2cSJim Jagielski     else
1487*b1cdbd2cSJim Jagielski     {
1488*b1cdbd2cSJim Jagielski         return 0;
1489*b1cdbd2cSJim Jagielski     }
1490*b1cdbd2cSJim Jagielski }
1491*b1cdbd2cSJim Jagielski 
1492*b1cdbd2cSJim Jagielski /** Convert absolute to relative page numbers (see PrintEmptyPages)
1493*b1cdbd2cSJim Jagielski 
1494*b1cdbd2cSJim Jagielski     @author FME
1495*b1cdbd2cSJim Jagielski */
ConvertAbsoluteToRelativePageNum(sal_uInt16 _nAbsPageNum) const1496*b1cdbd2cSJim Jagielski sal_uInt16 SwPagePreviewLayout::ConvertAbsoluteToRelativePageNum( sal_uInt16 _nAbsPageNum ) const
1497*b1cdbd2cSJim Jagielski {
1498*b1cdbd2cSJim Jagielski     if ( mbBookPreview || mbPrintEmptyPages || !_nAbsPageNum )
1499*b1cdbd2cSJim Jagielski     {
1500*b1cdbd2cSJim Jagielski         return _nAbsPageNum;
1501*b1cdbd2cSJim Jagielski     }
1502*b1cdbd2cSJim Jagielski 
1503*b1cdbd2cSJim Jagielski     const SwPageFrm* pTmpPage = static_cast<const SwPageFrm*>(mrLayoutRootFrm.Lower());
1504*b1cdbd2cSJim Jagielski 
1505*b1cdbd2cSJim Jagielski     sal_uInt16 nRet = 1;
1506*b1cdbd2cSJim Jagielski 
1507*b1cdbd2cSJim Jagielski     while ( pTmpPage && pTmpPage->GetPhyPageNum() != _nAbsPageNum )
1508*b1cdbd2cSJim Jagielski     {
1509*b1cdbd2cSJim Jagielski         if ( !pTmpPage->IsEmptyPage() )
1510*b1cdbd2cSJim Jagielski             ++nRet;
1511*b1cdbd2cSJim Jagielski 
1512*b1cdbd2cSJim Jagielski         pTmpPage = static_cast<const SwPageFrm*>( pTmpPage->GetNext() );
1513*b1cdbd2cSJim Jagielski     }
1514*b1cdbd2cSJim Jagielski 
1515*b1cdbd2cSJim Jagielski     return nRet;
1516*b1cdbd2cSJim Jagielski }
1517*b1cdbd2cSJim Jagielski 
1518*b1cdbd2cSJim Jagielski /** Convert relative to absolute page numbers (see PrintEmptyPages)
1519*b1cdbd2cSJim Jagielski 
1520*b1cdbd2cSJim Jagielski     @author FME
1521*b1cdbd2cSJim Jagielski */
ConvertRelativeToAbsolutePageNum(sal_uInt16 _nRelPageNum) const1522*b1cdbd2cSJim Jagielski sal_uInt16 SwPagePreviewLayout::ConvertRelativeToAbsolutePageNum( sal_uInt16 _nRelPageNum ) const
1523*b1cdbd2cSJim Jagielski {
1524*b1cdbd2cSJim Jagielski     if ( mbBookPreview || mbPrintEmptyPages || !_nRelPageNum )
1525*b1cdbd2cSJim Jagielski     {
1526*b1cdbd2cSJim Jagielski         return _nRelPageNum;
1527*b1cdbd2cSJim Jagielski     }
1528*b1cdbd2cSJim Jagielski 
1529*b1cdbd2cSJim Jagielski     const SwPageFrm* pTmpPage = static_cast<const SwPageFrm*>(mrLayoutRootFrm.Lower());
1530*b1cdbd2cSJim Jagielski     const SwPageFrm* pRet = 0;
1531*b1cdbd2cSJim Jagielski 
1532*b1cdbd2cSJim Jagielski     sal_uInt16 i = 0;
1533*b1cdbd2cSJim Jagielski     while( pTmpPage && i != _nRelPageNum )
1534*b1cdbd2cSJim Jagielski     {
1535*b1cdbd2cSJim Jagielski         if ( !pTmpPage->IsEmptyPage() )
1536*b1cdbd2cSJim Jagielski             ++i;
1537*b1cdbd2cSJim Jagielski 
1538*b1cdbd2cSJim Jagielski         pRet = pTmpPage;
1539*b1cdbd2cSJim Jagielski         pTmpPage = static_cast<const SwPageFrm*>( pTmpPage->GetNext() );
1540*b1cdbd2cSJim Jagielski     }
1541*b1cdbd2cSJim Jagielski 
1542*b1cdbd2cSJim Jagielski     return pRet->GetPhyPageNum();
1543*b1cdbd2cSJim Jagielski }
1544