| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| #ifndef _PAGEPREVIEWLAYOUT_HXX |
| #define _PAGEPREVIEWLAYOUT_HXX |
| |
| // template class <std::vector> |
| #include <vector> |
| // datatypes sal_xyz |
| #include <sal/types.h> |
| // classes <Point>, <Size> and <Rectangle> |
| #include <tools/gen.hxx> |
| // datatype <SwTwips> |
| #include <swtypes.hxx> |
| |
| class ViewShell; |
| class SwRootFrm; |
| class SwPageFrm; |
| class Fraction; |
| struct PrevwPage; |
| |
| // ============================================================================= |
| /** page preview functionality in the writer |
| |
| OD 11.12.2002 #103492# - class <SwPagePreviewLayout> |
| |
| @author OD |
| */ |
| class SwPagePreviewLayout |
| { |
| private: |
| friend class ViewShell; |
| |
| // number of horizontal and vertical twips for spacing between the pages. |
| const SwTwips mnXFree; |
| const SwTwips mnYFree; |
| |
| // view shell the print preview is generated for. |
| ViewShell& mrParentViewShell; |
| // top layout frame of the layout for accessing the pages |
| const SwRootFrm& mrLayoutRootFrm; |
| |
| // boolean indicating, if the layout information (number of columns and rows) |
| // are valid. |
| bool mbLayoutInfoValid; |
| // boolean indicating, if the the calculated print preview layout sizes |
| // ( windows size in twips, maximal page size, column width, row height, |
| // width and height of a print preview page, size of the print preview |
| // document ) are valid |
| bool mbLayoutSizesValid; |
| // boolean indicating, if the the paint information ( physical number of |
| // start page, start column and row, paint offsets, rectangle visible of |
| // the print preview document. |
| bool mbPaintInfoValid; |
| |
| Size maWinSize; |
| sal_uInt16 mnCols; |
| sal_uInt16 mnRows; |
| sal_uInt16 mnPages; |
| // OD 19.02.2003 #107369# - new flag for leaving blank left-top-corner |
| // OD 2004-03-05 #i18143# - the book preview is controlled by this flag |
| bool mbBookPreview; |
| bool mbBookPreviewModeToggled; |
| |
| Size maMaxPageSize; |
| Rectangle maPreviewDocRect; |
| SwTwips mnColWidth; |
| SwTwips mnRowHeight; |
| SwTwips mnPrevwLayoutWidth; |
| SwTwips mnPrevwLayoutHeight; |
| bool mbDoesLayoutColsFitIntoWindow; |
| bool mbDoesLayoutRowsFitIntoWindow; |
| |
| sal_uInt16 mnPaintPhyStartPageNum; |
| sal_uInt16 mnPaintStartCol; |
| sal_uInt16 mnPaintStartRow; |
| bool mbNoPageVisible; |
| Point maPaintStartPageOffset; |
| Point maPaintPreviewDocOffset; |
| Point maAdditionalPaintOffset; |
| Rectangle maPaintedPrevwDocRect; |
| sal_uInt16 mnSelectedPageNum; |
| |
| std::vector<PrevwPage*> maPrevwPages; |
| |
| // OD 07.11.2003 #i22014# - internal booleans to indicate, that a new print |
| // preview layout has been created during a paint. |
| mutable bool mbInPaint; |
| mutable bool mbNewLayoutDuringPaint; |
| |
| bool mbPrintEmptyPages; |
| |
| /** clear internal data about current page preview |
| |
| OD 11.12.2002 #103492# |
| |
| @author OD |
| */ |
| void _Clear(); |
| |
| /** helper method to clear preview page layout sizes |
| |
| OD 18.12.2002 #103492# |
| |
| @author OD |
| */ |
| void _ClearPrevwLayoutSizes(); |
| |
| /** helper method to clear data in preview page vectors |
| |
| OD 13.12.2002 #103492# |
| |
| @author OD |
| */ |
| void _ClearPrevwPageData(); |
| |
| /** calculate page preview layout sizes |
| |
| OD 18.12.2002 #103492# |
| |
| @author OD |
| */ |
| void _CalcPrevwLayoutSizes(); |
| |
| /** apply new zoom at given view shell |
| |
| OD 11.12.2002 #103492# |
| |
| @author OD |
| |
| @param _aNewZoom |
| input parameter - new zoom percentage |
| */ |
| void _ApplyNewZoomAtViewShell( sal_uInt8 _aNewZoom ); |
| |
| /** calculate additional paint offset |
| |
| OD 12.12.2002 #103492# |
| helper method called by <Prepare> in order to calculate an additional |
| paint offset to center output in given window size. |
| The booleans <mbDoesLayoutRowsFitIntoWindow> and <mbDoesLayoutColsFitIntoWindow> |
| are also determined. |
| preconditions: |
| (1) preview layout is given (number of rows and columns). |
| (2) window size is given. |
| (3) height of row and width of column are calculated. |
| (4) paint offset of start page is calculated. |
| |
| @author OD |
| */ |
| void _CalcAdditionalPaintOffset(); |
| |
| /** calculate painted preview document rectangle |
| |
| OD 12.12.2002 #103492# |
| helper method called by <Prepare> in order to calculate the rectangle, |
| which will be painted for the document arranged by the given preview |
| layout. |
| preconditions: |
| (1) paint offset of document preview is calculated. |
| (2) size of document preview is calculated. |
| (3) additional paint offset is calculated - see <_CalcAdditionalPaintOffset>. |
| |
| @author OD |
| */ |
| void _CalcDocPrevwPaintRect(); |
| |
| /** determines preview data for a given page and a given preview offset |
| |
| OD 13.12.2002 #103492# |
| |
| @author OD |
| |
| @param _rPage |
| input parameter - constant reference to page frame, for which the |
| preview data will be calculated. |
| |
| @param _rPrevwOffset |
| input parameter - constant reference to the offset the given page has |
| in the current preview window. |
| Note: Offset can be negative. |
| |
| @param _opPrevwPage |
| output parameter - calculated preview data. |
| |
| @return boolean, indicating, if calculation was successful. |
| */ |
| bool _CalcPreviewDataForPage( const SwPageFrm& _rPage, |
| const Point& _rPrevwOffset, |
| PrevwPage* _opPrevwPage ); |
| |
| /** calculate preview pages |
| |
| OD 12.12.2002 #103492# |
| helper method called by <Prepare> in order to determine which pages |
| will be visible in the current preview and calculate the data needed |
| to paint these pages. Also the accessible pages with its needed data |
| are determined. |
| |
| @author OD |
| */ |
| void _CalcPreviewPages(); |
| |
| /** get preview page by physical page number |
| |
| OD 17.12.2002 #103492# |
| |
| @author OD |
| |
| @param _nPageNum |
| input parameter - physical page number of page, for which the preview |
| page will be returned. |
| |
| @return pointer to preview page of current preview pages. If page doesn't |
| belongs to current preview pages, <0> is returned. |
| */ |
| const PrevwPage* _GetPrevwPageByPageNum( const sal_uInt16 _nPageNum ) const; |
| |
| /** paint selection mark at page |
| |
| OD 17.12.2002 #103492# |
| |
| @author OD |
| */ |
| void _PaintSelectMarkAtPage( const PrevwPage* _aSelectedPrevwPage ) const; |
| |
| public: |
| /** constructor of <SwPagePreviewLayout> |
| |
| OD 11.12.2002 #103492# |
| |
| @author OD |
| |
| @param _rParentViewShell |
| input parameter - reference to the view shell the page preview |
| layout belongs to. Reference will be hold as member <mrParentViewShell>. |
| Adjustments/Changes at this view shell: |
| (1) Adjustment of the mapping mode at the output device. |
| (2) Change of the zoom at the view options. |
| (3) Preparations for paint of the page preview. |
| |
| @param _rLayoutRootFrm |
| input parameter - constant reference to the root frame of the layout. |
| Reference will be hold as member <mrLayoutRootFrm> in order to get |
| access to the page frames. |
| */ |
| SwPagePreviewLayout( ViewShell& _rParentViewShell, |
| const SwRootFrm& _rLayoutRootFrm ); |
| |
| /** destructor of <SwPagePreviewLayout> |
| |
| OD 17.12.2002 #103492# |
| |
| @author |
| */ |
| inline ~SwPagePreviewLayout() |
| { |
| _ClearPrevwPageData(); |
| } |
| |
| /** init page preview layout |
| |
| OD 11.12.2002 #103492# |
| initialize the page preview settings for a given layout. |
| side effects: |
| (1) If parameter <_bCalcScale> is true, mapping mode with calculated |
| scaling is set at the output device and the zoom at the view options of |
| the given view shell is set with the calculated scaling. |
| |
| @author OD |
| |
| @param _nCols |
| input parameter - initial number of page columns in the preview. |
| |
| @param _nRows |
| input parameter - initial number of page rows in the preview. |
| |
| @param _rPxWinSize |
| input parameter - window size in which the preview will be displayed and |
| for which the scaling will be calculated. |
| |
| @param _bCalcScale |
| input parameter - control, if method should calculate the needed |
| scaling for the proposed preview layout for the given window size |
| and sets the scaling at the output device and the view options. |
| |
| @return boolean, indicating, if preview layout is successful initialized. |
| */ |
| bool Init( const sal_uInt16 _nCols, |
| const sal_uInt16 _nRows, |
| const Size& _rPxWinSize, |
| const bool _bCalcScale |
| ); |
| |
| /** method to adjust page preview layout to document changes |
| |
| OD 18.12.2002 #103492# |
| |
| @author OD |
| |
| @return boolean, indicating, if preview layout is successful initialized. |
| */ |
| bool ReInit(); |
| |
| /** prepare paint of page preview |
| |
| OD 12.12.2002 #103492# |
| With the valid preview layout settings - calculated and set by method |
| <Init(..)> - the paint of a specific part of the virtual preview |
| document is prepared. The corresponding part is given by either |
| a start page (parameter <_nProposedStartPageNum>) or a absolute position |
| (parameter <_aProposedStartPoint>). |
| The accessibility preview will also be updated via a corresponding |
| method call. |
| OD 21.03.2003 #108282# - delete parameter _onStartPageVirtNum |
| |
| @author OD |
| |
| @param _nProposedStartPageNum [0..<number of document pages>] |
| input parameter - proposed number of page, which should be painted in |
| the left-top-corner in the current output device. input parameter |
| <_bStartWithPageAtFirstCol> influences, if proposed page is actual |
| painted in the left-top-corner. |
| |
| @param _nProposedStartPos [(0,0)..<PreviewDocumentSize>] |
| input parameter - proposed absolute position in the virtual preview |
| document, which should be painted in the left-top-corner in the current |
| output device. |
| |
| @param _rPxWinSize |
| input parameter - pixel size of window the preview will be painted in. |
| |
| @param _onStartPageNum |
| output parameter - physical number of page, which will be painted in the |
| left-top-corner in the current output device. |
| |
| @param _orDocPreviewPaintRect |
| output parameter - rectangle of preview document, which will be painted. |
| |
| @param _bStartWithPageAtFirstCol |
| input parameter with default value "true" - controls, if start page |
| is set to page in first column the proposed start page is located. |
| |
| @return boolean, indicating, if prepare of preview paint was successful. |
| */ |
| bool Prepare( const sal_uInt16 _nProposedStartPageNum, |
| const Point _aProposedStartPos, |
| const Size& _rPxWinSize, |
| sal_uInt16& _onStartPageNum, |
| Rectangle& _orDocPreviewPaintRect, |
| const bool _bStartWithPageAtFirstCol = true |
| ); |
| |
| /** get selected page number |
| |
| OD 13.12.2002 #103492# |
| |
| @author OD |
| */ |
| inline sal_uInt16 SelectedPage() |
| { |
| return mnSelectedPageNum; |
| } |
| |
| /** set selected page number |
| |
| OD 14.01.2003 #103492# |
| |
| @author OD |
| */ |
| inline void SetSelectedPage( sal_uInt16 _nSelectedPageNum ) |
| { |
| mnSelectedPageNum = _nSelectedPageNum; |
| } |
| |
| /** paint prepared preview |
| |
| OD 12.12.2002 #103492# |
| |
| @author OD |
| |
| @param _aOutRect |
| input parameter - Twip rectangle of window, which should be painted. |
| |
| @return boolean, indicating, if paint of preview was performed |
| */ |
| bool Paint( const Rectangle _aOutRect ) const; |
| |
| /** repaint pages on page preview |
| |
| OD 18.12.2002 #103492# |
| method to invalidate visible pages due to changes in a different |
| view shell. |
| |
| @author OD |
| */ |
| void Repaint( const Rectangle _aInvalidCoreRect ) const; |
| |
| /** paint to mark new selected page |
| |
| OD 17.12.2002 #103492# |
| Perform paint for current selected page in order to unmark it. |
| Set new selected page and perform paint to mark this page. |
| |
| @author OD |
| |
| @param _nNewSelectedPage |
| input parameter - physical number of page, which will be marked as selected. |
| */ |
| void MarkNewSelectedPage( const sal_uInt16 _nSelectedPage ); |
| |
| /** calculate start position for new scale |
| |
| OD 12.12.2002 #103492# |
| calculate new start position for a new scale. Calculation bases on the |
| current visible part of the document arranged in the given preview layout. |
| preconditions: |
| (1) new scaling is already set at the given output device. |
| |
| @author OD |
| |
| @return Point, start position for new scale |
| */ |
| Point GetPreviewStartPosForNewScale( const Fraction& _aNewScale, |
| const Fraction& _aOldScale, |
| const Size& _aNewWinSize ) const; |
| |
| /** determines, if page with given page number is visible in preview |
| |
| OD 12.12.2002 #103492# |
| |
| @author OD |
| |
| @param _nPageNum |
| input parameter - physical number of page, for which it will be |
| determined, if it is visible. |
| |
| @return boolean, indicating, if page with given page number is visible |
| in preview. |
| */ |
| bool IsPageVisible( const sal_uInt16 _nPageNum ) const; |
| |
| /** calculate data to bring new selected page into view. |
| |
| OD 12.12.2002 #103492# |
| |
| @author OD |
| |
| @param _nHoriMove |
| input parameter - positive/negative number of columns the current |
| selected page have to be moved. |
| |
| @param _nVertMove |
| input parameter - positive/negative number of rows the current |
| selected page have to be moved. |
| |
| @param _orNewSelectedPage |
| output parameter - number of new selected page |
| |
| @param _orNewStartPage |
| output parameter - number of new start page |
| |
| @param _orNewStartPos |
| output parameter - new start position in document preview |
| |
| @return boolean - indicating, that move was sucessful. |
| */ |
| bool CalcStartValuesForSelectedPageMove( const sal_Int16 _nHoriMove, |
| const sal_Int16 _nVertMove, |
| sal_uInt16& _orNewSelectedPage, |
| sal_uInt16& _orNewStartPage, |
| Point& _orNewStartPos ) const; |
| |
| /** checks, if given position is inside a shown document page |
| |
| OD 17.12.2002 #103492# |
| |
| @author OD |
| |
| @param _aPrevwPos |
| input parameter - position inside the visible preview window. |
| |
| @param _orDocPos |
| output parameter - corresponding position in the document, if given |
| preview position is inside a shown document page, not an empty page. |
| If not, it's value is <Point( 0, 0 )>. |
| |
| @param _obPosInEmptyPage |
| output parameter - indicates, that given preview position lays inside |
| an shown empty page. |
| |
| @param _onPageNum |
| output parameter - corresponding physical number of page, if given |
| preview position is inside a shown document page, considers also empty |
| pages. If not, it's value is <0>. |
| |
| @return boolean - indicating, that given preview position lays inside |
| a shown document preview page, not an empty page. |
| */ |
| bool IsPrevwPosInDocPrevwPage( const Point _aPrevwPos, |
| Point& _orDocPos, |
| bool& _obPosInEmptyPage, |
| sal_uInt16& _onPageNum ) const; |
| |
| inline bool DoesPreviewLayoutRowsFitIntoWindow() const |
| { |
| return mbDoesLayoutRowsFitIntoWindow; |
| } |
| |
| inline bool DoesPreviewLayoutColsFitIntoWindow() const |
| { |
| return mbDoesLayoutColsFitIntoWindow; |
| } |
| |
| inline bool PreviewLayoutValid() const |
| { |
| return mbLayoutInfoValid && mbLayoutSizesValid && mbPaintInfoValid; |
| } |
| |
| /** determine preview window page scroll amount |
| |
| OD 17.12.2002 #103492# |
| |
| @author OD |
| |
| @param _nWinPagesToScroll |
| input parameter - number of preview window pages the scroll amount has |
| to be calculated for. Negative values for preview window page up |
| scrolling, positive values for preview window page down scrolling. |
| |
| @return scroll amount in SwTwips |
| */ |
| SwTwips GetWinPagesScrollAmount( const sal_Int16 _nWinPagesToScroll ) const; |
| |
| /** determine row the page with the given number is in |
| |
| OD 17.01.2003 #103492# |
| |
| @author OD |
| |
| @param _nPageNum |
| input parameter - physical page number of page, for which the row in |
| preview layout has to be calculated. |
| |
| @return number of row the page with the given physical page number is in |
| */ |
| sal_uInt16 GetRowOfPage( sal_uInt16 _nPageNum ) const; |
| |
| /** determine column the page with the given number is in |
| |
| OD 17.01.2003 #103492# |
| |
| @author OD |
| |
| @param _nPageNum |
| input parameter - physical page number of page, for which the column in |
| preview layout has to be calculated. |
| |
| @return number of column the page with the given physical page number is in |
| */ |
| sal_uInt16 GetColOfPage( sal_uInt16 _nPageNum ) const; |
| |
| // OD 18.12.2002 #103492# |
| Size GetPrevwDocSize() const; |
| |
| /** get size of a preview page by its physical page number |
| |
| OD 15.01.2003 #103492# |
| |
| @author OD |
| |
| @param _nPageNum |
| input parameter - pysical page number of preview page, for which the |
| page size has to be returned. |
| |
| @return an object of class <Size> |
| */ |
| Size GetPrevwPageSizeByPageNum( sal_uInt16 _nPageNum ) const; |
| |
| /** get virtual page number by its physical page number |
| |
| OD 21.03.2003 #108282# |
| |
| @author OD |
| |
| @param _nPageNum |
| input parameter - pysical page number of preview page, for which the |
| virtual page number has to be determined. |
| |
| @return virtual page number of page given by its physical page number, |
| if the page is in the current preview pages vector, otherwise 0. |
| */ |
| sal_uInt16 GetVirtPageNumByPageNum( sal_uInt16 _nPageNum ) const; |
| |
| /** enable/disable book preview |
| |
| OD 2004-03-04 #i18143# |
| |
| @author OD |
| */ |
| bool SetBookPreviewMode( const bool _bEnableBookPreview, |
| sal_uInt16& _onStartPageNum, |
| Rectangle& _orDocPreviewPaintRect ); |
| |
| /** Convert relative to absolute page numbers (see PrintEmptyPages) |
| |
| @author FME |
| */ |
| sal_uInt16 ConvertRelativeToAbsolutePageNum( sal_uInt16 _nRelPageNum ) const; |
| |
| /** Convert absolute to relative page numbers (see PrintEmptyPages) |
| |
| @author FME |
| */ |
| sal_uInt16 ConvertAbsoluteToRelativePageNum( sal_uInt16 _nAbsPageNum ) const; |
| |
| /** get the number of preview pages |
| |
| @author FME |
| */ |
| sal_uInt16 GetNumberOfPreviewPages() { return sal::static_int_cast< sal_uInt16 >(maPrevwPages.size()); } |
| }; |
| |
| #endif // _PAGEPREVIEWLAYOUT_HXX |