summaryrefslogtreecommitdiff
path: root/sd/source/ui/slidesorter/inc/view/SlsLayouter.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'sd/source/ui/slidesorter/inc/view/SlsLayouter.hxx')
-rwxr-xr-xsd/source/ui/slidesorter/inc/view/SlsLayouter.hxx382
1 files changed, 382 insertions, 0 deletions
diff --git a/sd/source/ui/slidesorter/inc/view/SlsLayouter.hxx b/sd/source/ui/slidesorter/inc/view/SlsLayouter.hxx
new file mode 100755
index 000000000000..9b1fd996e9c0
--- /dev/null
+++ b/sd/source/ui/slidesorter/inc/view/SlsLayouter.hxx
@@ -0,0 +1,382 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef SD_SLIDESORTER_VIEW_LAYOUTER_HXX
+#define SD_SLIDESORTER_VIEW_LAYOUTER_HXX
+
+#include <sal/types.h>
+#include <tools/fract.hxx>
+#include <vcl/mapmod.hxx>
+#include <vector>
+#include <utility>
+
+class MapMode;
+class OutputDevice;
+class Size;
+
+namespace sd { namespace slidesorter { namespace view {
+
+/** Calculate the size and position of page objects displayed by a slide
+ sorter. The layouter takes into account various input values:
+ 1.) Size of the window in which the slide sorter is displayed.
+ 2.) Desired and minimal and maximal widths of page objects.
+ 3.) Minimal and maximal number of columns.
+ 4.) Vertical and horizontal gaps between objects in adjacent columns.
+ 5.) Borders arround every page object.
+ 6.) Vertical and horizontal borders between enclosing page and outer
+ page objects.
+ From these it calculates various output values:
+ 1.) The width of page objects.
+ 2.) The number of columns.
+ 3.) The size of the enclosing page.
+
+ <p>Sizes and lengths are all in pixel except where explicitly stated
+ otherwise.</p>
+
+ <p>The GetIndex... methods may return indices that are larger than or
+ equal to (zero based) the number of pages. This is so because the
+ number of pages is not known to the class instances. Indices are
+ calculated with reference to the general grid layout of page
+ objects.</p>
+*/
+class Layouter
+{
+public:
+ Layouter (void);
+ ~Layouter (void);
+
+ /** Set the horizontal and vertical borders in pixel coordinates between
+ the enclosing window and page objects. The borders may be painted
+ larger then the given values when the space for the insertion marker
+ is not sufficient.
+ @param nLeftBorder
+ Use a negative value to indicate that the left border size
+ shall not be modified. A value of 10 is the default.
+ @param nRightBorder
+ Use a negative value to indicate that the right border size
+ shall not be modified. A value of 10 is the default.
+ @param nTopBorder
+ Use a negative value to indicate that the top border size
+ shall not be modified. A value of 10 is the default.
+ @param nBottomBorder
+ Use a negative value to indicate that the bottom border size
+ shall not be modified. A value of 10 is the default.
+ */
+ void SetBorders (sal_Int32 nLeftBorder, sal_Int32 nRightBorder,
+ sal_Int32 nTopBorder, sal_Int32 nBottomBorder);
+
+ /** Set the borders arround every page object.
+ @param nLeftBorder
+ A negative value indicates that the left border shall not be
+ modified. A value of 0 is the default.
+ @param nRightBorder
+ A negative value indicates that the left border shall not be
+ modified. A value of 0 is the default.
+ @param nTopBorder
+ A negative value indicates that the left border shall not be
+ modified. A value of 0 is the default.
+ @param nBottomBorder
+ A negative value indicates that the left border shall not be
+ modified. A value of 0 is the default.
+ */
+ void SetPageBorders (sal_Int32 nLeftBorder, sal_Int32 nRightBorder,
+ sal_Int32 nTopBorder, sal_Int32 nBottomBorder);
+
+ /** Set the interval of valid column counts. When nMinimalColumnCount
+ <= nMaximalColumnCount is not fullfilled then the call is ignored.
+ @param nMinimalColumnCount
+ The default value is 1. The question whether higher values make
+ any sense is left to the caller.
+ @param nMaximalColumnCount
+ The default value is 5.
+ */
+ void SetColumnCount (sal_Int32 nMinimalColumnCount,
+ sal_Int32 nMaximalColumnCount);
+
+ /** Central method of this class. It takes the input values and
+ calculates the output values. Both given sizes must not be 0 in any
+ dimension or the call is ignored.
+ @param rWindowSize
+ The size of the window in pixels that the slide sorter is
+ displayed in.
+ @param rPageObjectSize
+ Size of each page in model coordinates.
+ @param pDevice
+ The map mode of this output device is adapted to the new layout
+ of the page objects.
+ @return
+ The return value indicates whether the Get... methods can be
+ used to obtain valid values (<TRUE/>).
+ */
+ bool RearrangeHorizontal (
+ const Size& rWindowSize,
+ const Size& rPageObjectSize,
+ OutputDevice* pDevice,
+ const sal_uInt32 nPageCount);
+ bool RearrangeVertical (
+ const Size& rWindowSize,
+ const Size& rPageObjectSize,
+ OutputDevice* pDevice);
+
+ /** Change the zoom factor. This does not change the general layout
+ (number of columns).
+ */
+ void SetZoom (Fraction nZoomFactor, OutputDevice* pDevice);
+
+ /** Return the number of columns.
+ */
+ sal_Int32 GetColumnCount (void) const;
+
+ /** Return the scale factor that can be set at the map mode of the
+ output window.
+ */
+ Fraction GetScaleFactor (void) const;
+
+ Size GetPageObjectSize (void) const;
+
+ /** Return the bounding box in model coordinates of the nIndex-th page
+ object.
+ */
+ Rectangle GetPageObjectBox (sal_Int32 nIndex) const;
+
+ /** Return the bounding box in model coordinates of the page that
+ contains the given amount of page objects.
+ */
+ Rectangle GetPageBox (sal_Int32 nObjectCount) const;
+
+ /** Return the rectangle that bounds the insertion marker that is
+ specified by the parameters.
+ @param nIndex
+ Index of the page object from which the position of the marker
+ will be calculated.
+ @param bVertical
+ When <TRUE/> then the insertion marker will be calculated with a
+ vertical orientation positioned to the left or right of the
+ specified page object. A horizontal orientation is indicated by
+ <FALSE/>. In this case the marker will be positioned above or
+ below the page object.
+ @param bLeftOrTop
+ This flag indicates whether the insertion marker will be
+ positioned above or to the left (<TRUE/>) the page object. When
+ <FALSE/> is given then the marker will be positioned below or to
+ the right of the page object.
+ */
+ Rectangle GetInsertionMarkerBox (
+ sal_Int32 nIndex,
+ bool bVertical,
+ bool bLeftOrTop) const;
+
+ /** Return the index of the first fully or partially visible page
+ object. This takes into account only the vertical dimension.
+ */
+ sal_Int32 GetIndexOfFirstVisiblePageObject (
+ const Rectangle& rVisibleArea) const;
+
+ /** Return the index of the last fully or partially visible page
+ object. This takes into account only the vertical dimension.
+ @return
+ The returned index may be larger than the number of existing
+ page objects.
+ */
+ sal_Int32 GetIndexOfLastVisiblePageObject (
+ const Rectangle& rVisibleArea) const;
+
+ /** Return the index of the page object that is rendered at the given
+ point.
+ @param rPosition
+ The position is expected to be in model coordinates relative to
+ the page origin.
+ @param bIncludePageBorders
+ When <TRUE/> then include the page borders into the calculation,
+ i.e. when a point lies in the border of a page object but not on
+ the actual page area the index of that page is returned;
+ otherwise -1 would be returned to indicate that no page object
+ has been hit.
+ @return
+ The returned index may be larger than the number of existing
+ page objects.
+ */
+ sal_Int32 GetIndexAtPoint (
+ const Point& rModelPosition,
+ bool bIncludePageBorders = false) const;
+
+ /** Return the page index of where to do an insert operation when the
+ user would release the the mouse button at the given position after
+ a drag operation.
+ @param rPosition
+ The position in the model coordinate system for which to
+ determine the insertion page index. The position does not have
+ to be over a page object to return a valid value.
+ @param bAllowVerticalPosition
+ When this flag is <TRUE/> then the vertical gaps between rows
+ may be taken into account for calculating the insertion index as
+ well as the horizontal gaps between columns. This will happen
+ only when there is only one column.
+ (better name, anyone?)
+ @return
+ Returns the page index, as accepted by the slide sorter model,
+ of the page after which an insertion would take place. An index
+ of 0 means that insertion will take place before the first page,
+ An index equal to or greater than the page count means to insert
+ after the last page.
+ A value of -1 indicates that no valid insertion index exists for
+ the given point.
+ */
+ sal_Int32 GetInsertionIndex (
+ const Point& rModelPosition,
+ bool bAllowVerticalPosition) const;
+
+ typedef ::std::pair<double,double> DoublePoint;
+ /** Transform a point given in model coordinates in to layouter
+ coordinates. Layouter coordinates are floating point numbers where
+ the integer part denotes a row or a column and the part after the
+ decimal point is a relative position in that row or column.
+ */
+ DoublePoint ConvertModelToLayouterCoordinates (
+ const Point& rModelPoint) const;
+
+ /** Transform a point given in layouter coordinates to model
+ coordinates. See ConvertModelToLayouterCoordinates for a
+ description of layouter coordinates.
+ */
+ Point ConvertLayouterToModelCoordinates (
+ const DoublePoint&rLayouterPoint) const;
+
+ typedef ::std::vector<Rectangle> BackgroundRectangleList;
+
+private:
+ class ScreenAndModelValue {public:
+ sal_Int32 mnScreen,mnModel;
+ explicit ScreenAndModelValue (sal_Int32 nScreen, sal_Int32 nModel = 0)
+ : mnScreen(nScreen),mnModel(nModel) {}
+ };
+ ScreenAndModelValue mnRequestedLeftBorder;
+ ScreenAndModelValue mnRequestedRightBorder;
+ ScreenAndModelValue mnRequestedTopBorder;
+ ScreenAndModelValue mnRequestedBottomBorder;
+ ScreenAndModelValue mnLeftBorder;
+ ScreenAndModelValue mnRightBorder;
+ ScreenAndModelValue mnTopBorder;
+ ScreenAndModelValue mnBottomBorder;
+ ScreenAndModelValue mnLeftPageBorder;
+ ScreenAndModelValue mnRightPageBorder;
+ ScreenAndModelValue mnTopPageBorder;
+ ScreenAndModelValue mnBottomPageBorder;
+ ScreenAndModelValue mnVerticalGap;
+ ScreenAndModelValue mnHorizontalGap;
+ ScreenAndModelValue mnInsertionMarkerThickness;
+ ScreenAndModelValue mnTotalVerticalGap;
+ ScreenAndModelValue mnTotalHorizontalGap;
+ sal_Int32 mnMinimalWidth;
+ sal_Int32 mnPreferredWidth;
+ sal_Int32 mnMaximalWidth;
+ sal_Int32 mnMinimalColumnCount;
+ sal_Int32 mnMaximalColumnCount;
+ sal_Int32 mnColumnCount;
+ Size maPageObjectModelSize;
+ Size maPageObjectPixelSize;
+
+ BackgroundRectangleList maBackgroundRectangleList;
+
+ enum GapMembership { GM_NONE, GM_PREVIOUS, GM_BOTH, GM_NEXT,
+ GM_PAGE_BORDER};
+
+ /** Calculate the row that the point with the given vertical coordinate
+ is over. The horizontal component is ignored.
+ @param nYPosition
+ Vertical position in model coordinates.
+ @param bIncludeBordersAndGaps
+ When this flag is <TRUE/> then the area of borders and gaps are
+ interpreted as belonging to one of the rows.
+ @param eGapMembership
+ Specifies to what row the gap areas belong. Here GM_NONE
+ corresponds to bIncludeBordersAndGaps being <FALSE/>. When
+ GM_BOTH is given then the upper half is associated to the row
+ above and the lower half to the row below. Values of
+ GM_PREVIOUS and GM_NEXT associate the whole gap area with the
+ row above or below respectively.
+ */
+ sal_Int32 GetRowAtPosition (
+ sal_Int32 nYPosition,
+ bool bIncludeBordersAndGaps,
+ GapMembership eGapMembership = GM_NONE) const;
+
+ /** Calculate the column that the point with the given horizontal
+ coordinate is over. The verical component is ignored.
+ @param nXPosition
+ Horizontal position in model coordinates.
+ @param bIncludeBordersAndGaps
+ When this flag is <TRUE/> then the area of borders and gaps are
+ interpreted as belonging to one of the columns.
+ @param eGapMembership
+ Specifies to what column the gap areas belong. Here GM_NONE
+ corresponds to bIncludeBordersAndGaps being <FALSE/>. When
+ GM_BOTH is given then the left half is associated with the
+ column at the left and the right half with the column to the
+ right. Values of GM_PREVIOUS and GM_NEXT associate the whole
+ gap area with the column to the left or right respectively.
+ */
+ sal_Int32 GetColumnAtPosition (
+ sal_Int32 nXPosition,
+ bool bIncludeBordersAndGaps,
+ GapMembership eGapMembership = GM_NONE) const;
+
+ /** This method is typically called from GetRowAtPosition() and
+ GetColumnAtPosition() to handle a position that lies inside the gap
+ between two adjacent rows or columns.
+ @param nDistanceIntoGap
+ Vertical distance from the bottom of the upper row down into the
+ gap or or horizontal distance from the right edge right into the
+ gap.
+ @param eGapMemberhship
+ This value decides what areas in the gap belong to which (or no)
+ row or column.
+ @param nIndex
+ The row index of the upper row or the column index of the left
+ column.
+ @param nLeftOrTopPageBorder
+ Width in model coordinates of the border the the right of or
+ below a page.
+ @param nGap
+ Width or height of the gap in model coordiantes between the
+ page borders.
+ @return
+ Returns either the index of the upper row (as given as nRow), the
+ index of the lower row (nRow+1) or -1 to indicate that the
+ position belongs to no row.
+ */
+ sal_Int32 ResolvePositionInGap (
+ sal_Int32 nDistanceIntoGap,
+ GapMembership eGapMembership,
+ sal_Int32 nIndex,
+ sal_Int32 nLeftOrTopPageBorder,
+ sal_Int32 nGap) const;
+};
+
+} } } // end of namespace ::sd::slidesorter::view
+
+#endif