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