xref: /aoo42x/main/sw/inc/pagepreviewlayout.hxx (revision fb0b81f5)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 #ifndef _PAGEPREVIEWLAYOUT_HXX
23 #define _PAGEPREVIEWLAYOUT_HXX
24 
25 // template class <std::vector>
26 #include <vector>
27 // datatypes sal_xyz
28 #include <sal/types.h>
29 // classes <Point>, <Size> and <Rectangle>
30 #include <tools/gen.hxx>
31 // datatype <SwTwips>
32 #include <swtypes.hxx>
33 
34 class ViewShell;
35 class SwRootFrm;
36 class SwPageFrm;
37 class Fraction;
38 struct PrevwPage;
39 
40 // =============================================================================
41 /** page preview functionality in the writer
42 
43     OD 11.12.2002 #103492# - class <SwPagePreviewLayout>
44 
45     @author OD
46 */
47 class SwPagePreviewLayout
48 {
49 private:
50     friend class ViewShell;
51 
52     // number of horizontal and vertical twips for spacing between the pages.
53     const SwTwips mnXFree;
54     const SwTwips mnYFree;
55 
56     // view shell the print preview is generated for.
57     ViewShell& mrParentViewShell;
58     // top layout frame of the layout for accessing the pages
59     const SwRootFrm& mrLayoutRootFrm;
60 
61     // boolean indicating, if the layout information (number of columns and rows)
62     // are valid.
63     bool        mbLayoutInfoValid;
64     // boolean indicating, if the calculated print preview layout sizes
65     // ( windows size in twips, maximal page size, column width, row height,
66     //   width and height of a print preview page, size of the print preview
67     //   document ) are valid
68     bool        mbLayoutSizesValid;
69     // boolean indicating, if the paint information ( physical number of
70     //   start page, start column and row, paint offsets, rectangle visible of
71     //   the print preview document.
72     bool        mbPaintInfoValid;
73 
74     Size        maWinSize;
75     sal_uInt16  mnCols;
76     sal_uInt16  mnRows;
77     sal_uInt16  mnPages;
78     // OD 19.02.2003 #107369# - new flag for leaving blank left-top-corner
79     // OD 2004-03-05 #i18143# - the book preview is controlled by this flag
80     bool        mbBookPreview;
81     bool        mbBookPreviewModeToggled;
82 
83     Size        maMaxPageSize;
84     Rectangle   maPreviewDocRect;
85     SwTwips     mnColWidth;
86     SwTwips     mnRowHeight;
87     SwTwips     mnPrevwLayoutWidth;
88     SwTwips     mnPrevwLayoutHeight;
89     bool        mbDoesLayoutColsFitIntoWindow;
90     bool        mbDoesLayoutRowsFitIntoWindow;
91 
92     sal_uInt16  mnPaintPhyStartPageNum;
93     sal_uInt16  mnPaintStartCol;
94     sal_uInt16  mnPaintStartRow;
95     bool        mbNoPageVisible;
96     Point       maPaintStartPageOffset;
97     Point       maPaintPreviewDocOffset;
98     Point       maAdditionalPaintOffset;
99     Rectangle   maPaintedPrevwDocRect;
100     sal_uInt16  mnSelectedPageNum;
101 
102     std::vector<PrevwPage*> maPrevwPages;
103 
104     // OD 07.11.2003 #i22014# - internal booleans to indicate, that a new print
105     // preview layout has been created during a paint.
106     mutable bool mbInPaint;
107     mutable bool mbNewLayoutDuringPaint;
108 
109     bool mbPrintEmptyPages;
110 
111     /** clear internal data about current page preview
112 
113         OD 11.12.2002 #103492#
114 
115         @author OD
116     */
117     void _Clear();
118 
119     /** helper method to clear preview page layout sizes
120 
121         OD 18.12.2002 #103492#
122 
123         @author OD
124     */
125     void _ClearPrevwLayoutSizes();
126 
127     /** helper method to clear data in preview page vectors
128 
129         OD 13.12.2002 #103492#
130 
131         @author OD
132     */
133     void _ClearPrevwPageData();
134 
135     /** calculate page preview layout sizes
136 
137         OD 18.12.2002 #103492#
138 
139         @author OD
140     */
141     void _CalcPrevwLayoutSizes();
142 
143     /** apply new zoom at given view shell
144 
145         OD 11.12.2002 #103492#
146 
147         @author OD
148 
149         @param _aNewZoom
150         input parameter - new zoom percentage
151     */
152     void _ApplyNewZoomAtViewShell( sal_uInt8 _aNewZoom );
153 
154     /** calculate additional paint offset
155 
156         OD 12.12.2002 #103492#
157         helper method called by <Prepare> in order to calculate an additional
158         paint offset to center output in given window size.
159         The booleans <mbDoesLayoutRowsFitIntoWindow> and <mbDoesLayoutColsFitIntoWindow>
160         are also determined.
161         preconditions:
162         (1) preview layout is given (number of rows and columns).
163         (2) window size is given.
164         (3) height of row and width of column are calculated.
165         (4) paint offset of start page is calculated.
166 
167         @author OD
168     */
169     void _CalcAdditionalPaintOffset();
170 
171     /** calculate painted preview document rectangle
172 
173         OD 12.12.2002 #103492#
174         helper method called by <Prepare> in order to calculate the rectangle,
175         which will be painted for the document arranged by the given preview
176         layout.
177         preconditions:
178         (1) paint offset of document preview is calculated.
179         (2) size of document preview is calculated.
180         (3) additional paint offset is calculated - see <_CalcAdditionalPaintOffset>.
181 
182         @author OD
183     */
184     void _CalcDocPrevwPaintRect();
185 
186     /** determines preview data for a given page and a given preview offset
187 
188         OD 13.12.2002 #103492#
189 
190         @author OD
191 
192         @param _rPage
193         input parameter - constant reference to page frame, for which the
194         preview data will be calculated.
195 
196         @param _rPrevwOffset
197         input parameter - constant reference to the offset the given page has
198         in the current preview window.
199         Note: Offset can be negative.
200 
201         @param _opPrevwPage
202         output parameter - calculated preview data.
203 
204         @return boolean, indicating, if calculation was successful.
205     */
206     bool _CalcPreviewDataForPage( const SwPageFrm& _rPage,
207                                   const Point& _rPrevwOffset,
208                                   PrevwPage* _opPrevwPage );
209 
210     /** calculate preview pages
211 
212         OD 12.12.2002 #103492#
213         helper method called by <Prepare> in order to determine which pages
214         will be visible in the current preview and calculate the data needed
215         to paint these pages. Also the accessible pages with its needed data
216         are determined.
217 
218         @author OD
219     */
220     void _CalcPreviewPages();
221 
222     /** get preview page by physical page number
223 
224         OD 17.12.2002 #103492#
225 
226         @author OD
227 
228         @param _nPageNum
229         input parameter - physical page number of page, for which the preview
230         page will be returned.
231 
232         @return pointer to preview page of current preview pages. If page doesn't
233         belongs to current preview pages, <0> is returned.
234     */
235     const PrevwPage* _GetPrevwPageByPageNum( const sal_uInt16 _nPageNum ) const;
236 
237     /** paint selection mark at page
238 
239         OD 17.12.2002 #103492#
240 
241         @author OD
242     */
243     void _PaintSelectMarkAtPage( const PrevwPage* _aSelectedPrevwPage ) const;
244 
245 public:
246     /** constructor of <SwPagePreviewLayout>
247 
248         OD 11.12.2002 #103492#
249 
250         @author OD
251 
252         @param _rParentViewShell
253         input parameter - reference to the view shell the page preview
254         layout belongs to. Reference will be hold as member <mrParentViewShell>.
255         Adjustments/Changes at this view shell:
256         (1) Adjustment of the mapping mode at the output device.
257         (2) Change of the zoom at the view options.
258         (3) Preparations for paint of the page preview.
259 
260         @param _rLayoutRootFrm
261         input parameter - constant reference to the root frame of the layout.
262         Reference will be hold as member <mrLayoutRootFrm> in order to get
263         access to the page frames.
264     */
265     SwPagePreviewLayout( ViewShell& _rParentViewShell,
266                          const SwRootFrm&    _rLayoutRootFrm );
267 
268     /** destructor of <SwPagePreviewLayout>
269 
270         OD 17.12.2002 #103492#
271 
272         @author
273     */
~SwPagePreviewLayout()274     inline ~SwPagePreviewLayout()
275     {
276         _ClearPrevwPageData();
277     }
278 
279     /** init page preview layout
280 
281         OD 11.12.2002 #103492#
282         initialize the page preview settings for a given layout.
283         side effects:
284         (1) If parameter <_bCalcScale> is true, mapping mode with calculated
285         scaling is set at the output device and the zoom at the view options of
286         the given view shell is set with the calculated scaling.
287 
288         @author OD
289 
290         @param _nCols
291         input parameter - initial number of page columns in the preview.
292 
293         @param _nRows
294         input parameter - initial number of page rows in the preview.
295 
296         @param _rPxWinSize
297         input parameter - window size in which the preview will be displayed and
298         for which the scaling will be calculated.
299 
300         @param _bCalcScale
301         input parameter - control, if method should calculate the needed
302         scaling for the proposed preview layout for the given window size
303         and sets the scaling at the output device and the view options.
304 
305         @return boolean, indicating, if preview layout is successful initialized.
306     */
307     bool Init( const sal_uInt16 _nCols,
308                const sal_uInt16 _nRows,
309                const Size&      _rPxWinSize,
310                const bool       _bCalcScale
311               );
312 
313     /** method to adjust page preview layout to document changes
314 
315         OD 18.12.2002 #103492#
316 
317         @author OD
318 
319         @return boolean, indicating, if preview layout is successful initialized.
320     */
321     bool ReInit();
322 
323     /** prepare paint of page preview
324 
325         OD 12.12.2002 #103492#
326         With the valid preview layout settings - calculated and set by method
327         <Init(..)> - the paint of a specific part of the virtual preview
328         document is prepared. The corresponding part is given by either
329         a start page (parameter <_nProposedStartPageNum>) or a absolute position
330         (parameter <_aProposedStartPoint>).
331         The accessibility preview will also be updated via a corresponding
332         method call.
333         OD 21.03.2003 #108282# - delete parameter _onStartPageVirtNum
334 
335         @author OD
336 
337         @param _nProposedStartPageNum [0..<number of document pages>]
338         input parameter - proposed number of page, which should be painted in
339         the left-top-corner in the current output device. input parameter
340         <_bStartWithPageAtFirstCol> influences, if proposed page is actual
341         painted in the left-top-corner.
342 
343         @param _nProposedStartPos [(0,0)..<PreviewDocumentSize>]
344         input parameter - proposed absolute position in the virtual preview
345         document, which should be painted in the left-top-corner in the current
346         output device.
347 
348         @param _rPxWinSize
349         input parameter - pixel size of window the preview will be painted in.
350 
351         @param _onStartPageNum
352         output parameter - physical number of page, which will be painted in the
353         left-top-corner in the current output device.
354 
355         @param _orDocPreviewPaintRect
356         output parameter - rectangle of preview document, which will be painted.
357 
358         @param _bStartWithPageAtFirstCol
359         input parameter with default value "true" - controls, if start page
360         is set to page in first column the proposed start page is located.
361 
362         @return boolean, indicating, if prepare of preview paint was successful.
363     */
364     bool Prepare( const sal_uInt16 _nProposedStartPageNum,
365                   const Point      _aProposedStartPos,
366                   const Size&      _rPxWinSize,
367                   sal_uInt16&      _onStartPageNum,
368                   Rectangle&       _orDocPreviewPaintRect,
369                   const bool       _bStartWithPageAtFirstCol = true
370                 );
371 
372     /** get selected page number
373 
374         OD 13.12.2002 #103492#
375 
376         @author OD
377     */
SelectedPage()378     inline sal_uInt16 SelectedPage()
379     {
380         return mnSelectedPageNum;
381     }
382 
383     /** set selected page number
384 
385         OD 14.01.2003 #103492#
386 
387         @author OD
388     */
SetSelectedPage(sal_uInt16 _nSelectedPageNum)389     inline void SetSelectedPage( sal_uInt16 _nSelectedPageNum )
390     {
391         mnSelectedPageNum = _nSelectedPageNum;
392     }
393 
394     /** paint prepared preview
395 
396         OD 12.12.2002 #103492#
397 
398         @author OD
399 
400         @param _aOutRect
401         input parameter - Twip rectangle of window, which should be painted.
402 
403         @return boolean, indicating, if paint of preview was performed
404     */
405     bool Paint( const Rectangle _aOutRect ) const;
406 
407     /** repaint pages on page preview
408 
409         OD 18.12.2002 #103492#
410         method to invalidate visible pages due to changes in a different
411         view shell.
412 
413         @author OD
414     */
415     void Repaint( const Rectangle _aInvalidCoreRect ) const;
416 
417     /** paint to mark new selected page
418 
419         OD 17.12.2002 #103492#
420         Perform paint for current selected page in order to unmark it.
421         Set new selected page and perform paint to mark this page.
422 
423         @author OD
424 
425         @param _nNewSelectedPage
426         input parameter - physical number of page, which will be marked as selected.
427     */
428     void MarkNewSelectedPage( const sal_uInt16 _nSelectedPage );
429 
430     /** calculate start position for new scale
431 
432         OD 12.12.2002 #103492#
433         calculate new start position for a new scale. Calculation bases on the
434         current visible part of the document arranged in the given preview layout.
435         preconditions:
436         (1) new scaling is already set at the given output device.
437 
438         @author OD
439 
440         @return Point, start position for new scale
441     */
442     Point GetPreviewStartPosForNewScale( const Fraction& _aNewScale,
443                                          const Fraction& _aOldScale,
444                                          const Size&     _aNewWinSize ) const;
445 
446     /** determines, if page with given page number is visible in preview
447 
448         OD 12.12.2002 #103492#
449 
450         @author OD
451 
452         @param _nPageNum
453         input parameter - physical number of page, for which it will be
454         determined, if it is visible.
455 
456         @return boolean, indicating, if page with given page number is visible
457         in preview.
458     */
459     bool IsPageVisible( const sal_uInt16 _nPageNum ) const;
460 
461     /** calculate data to bring new selected page into view.
462 
463         OD 12.12.2002 #103492#
464 
465         @author OD
466 
467         @param _nHoriMove
468         input parameter - positive/negative number of columns the current
469         selected page have to be moved.
470 
471         @param _nVertMove
472         input parameter - positive/negative number of rows the current
473         selected page have to be moved.
474 
475         @param _orNewSelectedPage
476         output parameter - number of new selected page
477 
478         @param _orNewStartPage
479         output parameter - number of new start page
480 
481         @param _orNewStartPos
482         output parameter - new start position in document preview
483 
484         @return boolean - indicating, that move was successful.
485     */
486     bool CalcStartValuesForSelectedPageMove( const sal_Int16  _nHoriMove,
487                                              const sal_Int16  _nVertMove,
488                                              sal_uInt16&      _orNewSelectedPage,
489                                              sal_uInt16&      _orNewStartPage,
490                                              Point&           _orNewStartPos ) const;
491 
492     /** checks, if given position is inside a shown document page
493 
494         OD 17.12.2002 #103492#
495 
496         @author OD
497 
498         @param _aPrevwPos
499         input parameter - position inside the visible preview window.
500 
501         @param _orDocPos
502         output parameter - corresponding position in the document, if given
503         preview position is inside a shown document page, not an empty page.
504         If not, it's value is <Point( 0, 0 )>.
505 
506         @param _obPosInEmptyPage
507         output parameter - indicates, that given preview position lays inside
508         an shown empty page.
509 
510         @param _onPageNum
511         output parameter - corresponding physical number of page, if given
512         preview position is inside a shown document page, considers also empty
513         pages. If not, it's value is <0>.
514 
515         @return boolean - indicating, that given preview position lays inside
516         a shown document preview page, not an empty page.
517     */
518     bool IsPrevwPosInDocPrevwPage( const Point  _aPrevwPos,
519                                    Point&       _orDocPos,
520                                    bool&        _obPosInEmptyPage,
521                                    sal_uInt16&  _onPageNum ) const;
522 
DoesPreviewLayoutRowsFitIntoWindow() const523     inline bool DoesPreviewLayoutRowsFitIntoWindow() const
524     {
525         return mbDoesLayoutRowsFitIntoWindow;
526     }
527 
DoesPreviewLayoutColsFitIntoWindow() const528     inline bool DoesPreviewLayoutColsFitIntoWindow() const
529     {
530         return mbDoesLayoutColsFitIntoWindow;
531     }
532 
PreviewLayoutValid() const533     inline bool PreviewLayoutValid() const
534     {
535         return mbLayoutInfoValid && mbLayoutSizesValid && mbPaintInfoValid;
536     }
537 
538     /** determine preview window page scroll amount
539 
540         OD 17.12.2002 #103492#
541 
542         @author OD
543 
544         @param _nWinPagesToScroll
545         input parameter - number of preview window pages the scroll amount has
546         to be calculated for. Negative values for preview window page up
547         scrolling, positive values for preview window page down scrolling.
548 
549         @return scroll amount in SwTwips
550     */
551     SwTwips GetWinPagesScrollAmount( const sal_Int16 _nWinPagesToScroll ) const;
552 
553     /** determine row the page with the given number is in
554 
555         OD 17.01.2003 #103492#
556 
557         @author OD
558 
559         @param _nPageNum
560         input parameter - physical page number of page, for which the row in
561         preview layout has to be calculated.
562 
563         @return number of row the page with the given physical page number is in
564     */
565     sal_uInt16 GetRowOfPage( sal_uInt16 _nPageNum ) const;
566 
567     /** determine column the page with the given number is in
568 
569         OD 17.01.2003 #103492#
570 
571         @author OD
572 
573         @param _nPageNum
574         input parameter - physical page number of page, for which the column in
575         preview layout has to be calculated.
576 
577         @return number of column the page with the given physical page number is in
578     */
579     sal_uInt16 GetColOfPage( sal_uInt16 _nPageNum ) const;
580 
581     // OD 18.12.2002 #103492#
582     Size GetPrevwDocSize() const;
583 
584     /** get size of a preview page by its physical page number
585 
586         OD 15.01.2003 #103492#
587 
588         @author OD
589 
590         @param _nPageNum
591         input parameter - pysical page number of preview page, for which the
592         page size has to be returned.
593 
594         @return an object of class <Size>
595     */
596     Size GetPrevwPageSizeByPageNum( sal_uInt16 _nPageNum ) const;
597 
598     /** get virtual page number by its physical page number
599 
600         OD 21.03.2003 #108282#
601 
602         @author OD
603 
604         @param _nPageNum
605         input parameter - pysical page number of preview page, for which the
606         virtual page number has to be determined.
607 
608         @return virtual page number of page given by its physical page number,
609         if the page is in the current preview pages vector, otherwise 0.
610     */
611     sal_uInt16 GetVirtPageNumByPageNum( sal_uInt16 _nPageNum ) const;
612 
613     /** enable/disable book preview
614 
615         OD 2004-03-04 #i18143#
616 
617         @author OD
618     */
619     bool SetBookPreviewMode( const bool  _bEnableBookPreview,
620                              sal_uInt16& _onStartPageNum,
621                              Rectangle&  _orDocPreviewPaintRect );
622 
623     /** Convert relative to absolute page numbers (see PrintEmptyPages)
624 
625         @author FME
626     */
627     sal_uInt16 ConvertRelativeToAbsolutePageNum( sal_uInt16 _nRelPageNum ) const;
628 
629     /** Convert absolute to relative page numbers (see PrintEmptyPages)
630 
631         @author FME
632     */
633     sal_uInt16 ConvertAbsoluteToRelativePageNum( sal_uInt16 _nAbsPageNum ) const;
634 
635     /** get the number of preview pages
636 
637         @author FME
638     */
GetNumberOfPreviewPages()639     sal_uInt16 GetNumberOfPreviewPages() { return sal::static_int_cast< sal_uInt16 >(maPrevwPages.size()); }
640 };
641 
642 #endif // _PAGEPREVIEWLAYOUT_HXX
643