summaryrefslogtreecommitdiff
path: root/sd/source/ui/slidesorter/view/SlsLayouter.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sd/source/ui/slidesorter/view/SlsLayouter.cxx')
-rw-r--r--sd/source/ui/slidesorter/view/SlsLayouter.cxx1555
1 files changed, 0 insertions, 1555 deletions
diff --git a/sd/source/ui/slidesorter/view/SlsLayouter.cxx b/sd/source/ui/slidesorter/view/SlsLayouter.cxx
deleted file mode 100644
index 19ec3bc64..000000000
--- a/sd/source/ui/slidesorter/view/SlsLayouter.cxx
+++ /dev/null
@@ -1,1555 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * 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.
- *
- ************************************************************************/
-
-#include "precompiled_sd.hxx"
-
-#include "view/SlsLayouter.hxx"
-#include "model/SlideSorterModel.hxx"
-#include "model/SlsPageDescriptor.hxx"
-#include "Window.hxx"
-#include <rtl/math.hxx>
-#include <basegfx/numeric/ftools.hxx>
-
-namespace {
- sal_Int32 RoundToInt (const double nValue)
- {
- return sal_Int32(::rtl::math::round(nValue));
- }
-}
-
-
-namespace sd { namespace slidesorter { namespace view {
-
-class Layouter::Implementation
-{
-public:
- SharedSdWindow mpWindow;
- sal_Int32 mnRequestedLeftBorder;
- sal_Int32 mnRequestedRightBorder;
- sal_Int32 mnRequestedTopBorder;
- sal_Int32 mnRequestedBottomBorder;
- sal_Int32 mnLeftBorder;
- sal_Int32 mnRightBorder;
- sal_Int32 mnTopBorder;
- sal_Int32 mnBottomBorder;
- sal_Int32 mnVerticalGap;
- sal_Int32 mnHorizontalGap;
- Size maMinimalSize;
- Size maPreferredSize;
- Size maMaximalSize;
- sal_Int32 mnMinimalColumnCount;
- sal_Int32 mnMaximalColumnCount;
- sal_Int32 mnPageCount;
- sal_Int32 mnColumnCount;
- sal_Int32 mnRowCount;
- /// The maximum number of columns. Can only be larger than the current
- /// number of columns when there are not enough pages to fill all
- /// available columns.
- sal_Int32 mnMaxColumnCount;
- /// The maximum number of rows. Can only be larger than the current
- /// number of rows when there are not enough pages to fill all available
- /// rows.
- sal_Int32 mnMaxRowCount;
- Size maPageObjectSize;
- ::boost::shared_ptr<PageObjectLayouter> mpPageObjectLayouter;
- ::boost::shared_ptr<view::Theme> mpTheme;
-
- /** Specify how the gap between two page objects is associated with the
- page objects.
- */
- enum GapMembership {
- GM_NONE, // Gap is not associated with any page object.
- GM_PREVIOUS, // The whole gap is associated with the previous page
- // object (left or above the gap.)
- GM_BOTH, // Half of the gap is associated with previous, half
- // with the next page object.
- GM_NEXT, // The whole gap is associated with the next page
- // object (right or below the gap.)
- GM_PAGE_BORDER
- };
-
- static Implementation* Create (
- const Implementation& rImplementation,
- const Layouter::Orientation eOrientation);
-
- virtual Layouter::Orientation GetOrientation (void) const = 0;
-
- bool Rearrange (
- const Size& rWindowSize,
- const Size& rPreviewModelSize,
- const sal_uInt32 nPageCount);
-
- /** 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.
- */
- 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 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 nGap) const;
-
- /** Calculate the logical part of the insert position, i.e. the page
- after whicht to insert.
- */
- virtual void CalculateLogicalInsertPosition (
- const Point& rModelPosition,
- InsertPosition& rPosition) const = 0;
-
- /** Calculate the geometrical part of the insert position, i.e. the
- location of where to display the insertion indicator and the
- distances about which the leading and trailing pages have to be
- moved to make room for the indicator.
- */
- void CalculateGeometricPosition (
- InsertPosition& rPosition,
- const Size& rIndicatorSize,
- const bool bIsVertical,
- model::SlideSorterModel& rModel) const;
-
- /** Return the bounding box of the preview or, when selected, of the page
- object. Thus, it returns something like a visual bounding box.
- */
- Rectangle GetInnerBoundingBox (
- model::SlideSorterModel& rModel,
- const sal_Int32 nIndex) const;
-
- Range GetValidHorizontalSizeRange (void) const;
- Range GetValidVerticalSizeRange (void) const;
-
- Range GetRangeOfVisiblePageObjects (const Rectangle& aVisibleArea) const;
- sal_Int32 GetIndex (
- const sal_Int32 nRow,
- const sal_Int32 nColumn,
- const bool bClampToValidRange) const;
-
- Rectangle GetPageObjectBox (
- const sal_Int32 nIndex,
- const bool bIncludeBorderAndGap = false) const;
-
- Rectangle GetPageObjectBox (
- const sal_Int32 nRow,
- const sal_Int32 nColumn) const;
-
- Rectangle AddBorderAndGap (
- const Rectangle& rBoundingBox,
- const sal_Int32 nRow,
- const sal_Int32 nColumn) const;
-
- Rectangle GetTotalBoundingBox (void) const;
-
- virtual ~Implementation (void);
-
-protected:
- Implementation (
- const SharedSdWindow& rpWindow,
- const ::boost::shared_ptr<view::Theme>& rpTheme);
- Implementation (const Implementation& rImplementation);
-
- virtual void CalculateRowAndColumnCount (const Size& rWindowSize) = 0;
- virtual void CalculateMaxRowAndColumnCount (const Size& rWindowSize) = 0;
- virtual Size CalculateTargetSize (
- const Size& rWindowSize,
- const Size& rPreviewModelSize) const = 0;
- Size GetTargetSize (
- const Size& rWindowSize,
- const Size& rPreviewModelSize,
- const bool bCalculateWidth,
- const bool bCalculateHeight) const;
- void CalculateVerticalLogicalInsertPosition (
- const Point& rModelPosition,
- InsertPosition& rPosition) const;
-};
-
-
-/** The vertical layouter has one column and as many rows as there are
- pages.
-*/
-class VerticalImplementation : public Layouter::Implementation
-{
-public:
- VerticalImplementation (
- const SharedSdWindow& rpWindow,
- const ::boost::shared_ptr<view::Theme>& rpTheme);
- VerticalImplementation (const Implementation& rImplementation);
-
- virtual Layouter::Orientation GetOrientation (void) const;
-
- void CalculateLogicalInsertPosition (
- const Point& rModelPosition,
- InsertPosition& rPosition) const;
-
-protected:
- virtual void CalculateRowAndColumnCount (const Size& rWindowSize);
- virtual void CalculateMaxRowAndColumnCount (const Size& rWindowSize);
- virtual Size CalculateTargetSize (
- const Size& rWindowSize,
- const Size& rPreviewModelSize) const;
-};
-
-
-/** The horizontal layouter has one row and as many columns as there are
- pages.
-*/
-class HorizontalImplementation : public Layouter::Implementation
-{
-public:
- HorizontalImplementation (
- const SharedSdWindow& rpWindow,
- const ::boost::shared_ptr<view::Theme>& rpTheme);
- HorizontalImplementation (const Implementation& rImplementation);
-
- virtual Layouter::Orientation GetOrientation (void) const;
-
- void CalculateLogicalInsertPosition (
- const Point& rModelPosition,
- InsertPosition& rPosition) const;
-
-protected:
- virtual void CalculateRowAndColumnCount (const Size& rWindowSize);
- virtual void CalculateMaxRowAndColumnCount (const Size& rWindowSize);
- virtual Size CalculateTargetSize (
- const Size& rWindowSize,
- const Size& rPreviewModelSize) const;
-};
-
-
-/** The number of columns of the grid layouter is defined via a control in
- the slide sorter tool bar. The number of rows is calculated from the
- number of columns and the number of pages.
-*/
-class GridImplementation : public Layouter::Implementation
-{
-public:
- GridImplementation (
- const SharedSdWindow& rpWindow,
- const ::boost::shared_ptr<view::Theme>& rpTheme);
- GridImplementation (const Implementation& rImplementation);
-
- virtual Layouter::Orientation GetOrientation (void) const;
-
- void CalculateLogicalInsertPosition (
- const Point& rModelPosition,
- InsertPosition& rPosition) const;
-
-protected:
- virtual void CalculateRowAndColumnCount (const Size& rWindowSize);
- virtual void CalculateMaxRowAndColumnCount (const Size& rWindowSize);
- virtual Size CalculateTargetSize (
- const Size& rWindowSize,
- const Size& rPreviewModelSize) const;
-};
-
-
-
-
-//===== Layouter ==============================================================
-
-Layouter::Layouter (
- const SharedSdWindow& rpWindow,
- const ::boost::shared_ptr<Theme>& rpTheme)
- : mpImplementation(new GridImplementation(rpWindow, rpTheme)),
- mpWindow(rpWindow)
-{
-}
-
-
-
-
-Layouter::~Layouter (void)
-{
-}
-
-
-
-
-::boost::shared_ptr<PageObjectLayouter> Layouter::GetPageObjectLayouter (void) const
-{
- return mpImplementation->mpPageObjectLayouter;
-}
-
-
-
-
-void Layouter::SetBorders (
- sal_Int32 nLeftBorder,
- sal_Int32 nRightBorder,
- sal_Int32 nTopBorder,
- sal_Int32 nBottomBorder)
-{
- if (nLeftBorder >= 0)
- mpImplementation->mnRequestedLeftBorder = nLeftBorder;
- if (nRightBorder >= 0)
- mpImplementation->mnRequestedRightBorder = nRightBorder;
- if (nTopBorder >= 0)
- mpImplementation->mnRequestedTopBorder = nTopBorder;
- if (nBottomBorder >= 0)
- mpImplementation->mnRequestedBottomBorder = nBottomBorder;
-}
-
-
-
-
-void Layouter::SetColumnCount (
- sal_Int32 nMinimalColumnCount,
- sal_Int32 nMaximalColumnCount)
-{
- if (nMinimalColumnCount <= nMaximalColumnCount)
- {
- mpImplementation->mnMinimalColumnCount = nMinimalColumnCount;
- mpImplementation->mnMaximalColumnCount = nMaximalColumnCount;
- }
-}
-
-
-
-
-bool Layouter::Rearrange (
- const Orientation eOrientation,
- const Size& rWindowSize,
- const Size& rPageSize,
- const sal_uInt32 nPageCount)
-{
- OSL_ASSERT(mpWindow);
-
- if (eOrientation != mpImplementation->GetOrientation())
- mpImplementation.reset(Implementation::Create(*mpImplementation, eOrientation));
-
- return mpImplementation->Rearrange(rWindowSize, rPageSize, nPageCount);
-}
-
-
-
-
-void Layouter::_SetZoom (double nZoomFactor)
-{
- _SetZoom(Fraction(nZoomFactor));
-}
-
-
-
-
-void Layouter::_SetZoom (Fraction nZoomFactor)
-{
- OSL_ASSERT(mpWindow);
-
- MapMode aMapMode (mpWindow->GetMapMode());
- aMapMode.SetScaleX (nZoomFactor);
- aMapMode.SetScaleY (nZoomFactor);
- mpWindow->SetMapMode (aMapMode);
-}
-
-
-
-
-sal_Int32 Layouter::GetColumnCount (void) const
-{
- return mpImplementation->mnColumnCount;
-}
-
-
-
-
-sal_Int32 Layouter::GetRowCount (void) const
-{
- return mpImplementation->mnRowCount;
-}
-
-
-
-
-sal_Int32 Layouter::GetRow (const sal_Int32 nIndex) const
-{
- return nIndex / mpImplementation->mnColumnCount;
-}
-
-
-
-
-sal_Int32 Layouter::GetColumn (const sal_Int32 nIndex) const
-{
- return nIndex % mpImplementation->mnColumnCount;
-}
-
-
-
-
-sal_Int32 Layouter::GetIndex (const sal_Int32 nRow, const sal_Int32 nColumn) const
-{
- return mpImplementation->GetIndex(nRow,nColumn,true);
-}
-
-
-
-
-Size Layouter::GetPageObjectSize (void) const
-{
- return mpImplementation->maPageObjectSize;
-}
-
-
-
-
-Rectangle Layouter::GetPageObjectBox (
- const sal_Int32 nIndex,
- const bool bIncludeBorderAndGap) const
-{
- return mpImplementation->GetPageObjectBox(nIndex, bIncludeBorderAndGap);
-}
-
-
-
-
-Rectangle Layouter::GetTotalBoundingBox (void) const
-{
- return mpImplementation->GetTotalBoundingBox();
-}
-
-
-
-
-InsertPosition Layouter::GetInsertPosition (
- const Point& rModelPosition,
- const Size& rIndicatorSize,
- model::SlideSorterModel& rModel) const
-{
- InsertPosition aPosition;
- mpImplementation->CalculateLogicalInsertPosition(
- rModelPosition,
- aPosition);
- mpImplementation->CalculateGeometricPosition(
- aPosition,
- rIndicatorSize,
- GetColumnCount()==1,
- rModel);
- return aPosition;
-}
-
-
-
-
-Range Layouter::GetValidHorizontalSizeRange (void) const
-{
- return mpImplementation->GetValidHorizontalSizeRange();
-}
-
-
-
-
-Range Layouter::GetValidVerticalSizeRange (void) const
-{
- return mpImplementation->GetValidVerticalSizeRange();
-}
-
-
-
-
-Range Layouter::GetRangeOfVisiblePageObjects (const Rectangle& aVisibleArea) const
-{
- return mpImplementation->GetRangeOfVisiblePageObjects(aVisibleArea);
-}
-
-
-
-
-sal_Int32 Layouter::GetIndexAtPoint (
- const Point& rPosition,
- const bool bIncludePageBorders,
- const bool bClampToValidRange) const
-{
- const sal_Int32 nRow (
- mpImplementation->GetRowAtPosition (
- rPosition.Y(),
- bIncludePageBorders,
- bIncludePageBorders ? Implementation::GM_PAGE_BORDER : Implementation::GM_NONE));
- const sal_Int32 nColumn (
- mpImplementation->GetColumnAtPosition (
- rPosition.X(),
- bIncludePageBorders,
- bIncludePageBorders ? Implementation::GM_PAGE_BORDER : Implementation::GM_NONE));
-
- return mpImplementation->GetIndex(nRow,nColumn,bClampToValidRange);
-}
-
-
-
-
-//===== Layouter::Implementation ==============================================
-
-Layouter::Implementation* Layouter::Implementation::Create (
- const Implementation& rImplementation,
- const Layouter::Orientation eOrientation)
-{
- switch (eOrientation)
- {
- case HORIZONTAL: return new HorizontalImplementation(rImplementation);
- case VERTICAL: return new VerticalImplementation(rImplementation);
- case GRID:
- default: return new GridImplementation(rImplementation);
- }
-}
-
-
-
-
-Layouter::Implementation::Implementation (
- const SharedSdWindow& rpWindow,
- const ::boost::shared_ptr<view::Theme>& rpTheme)
- : mpWindow(rpWindow),
- mnRequestedLeftBorder(5),
- mnRequestedRightBorder(5),
- mnRequestedTopBorder(5),
- mnRequestedBottomBorder(5),
- mnLeftBorder(5),
- mnRightBorder(5),
- mnTopBorder(5),
- mnBottomBorder(5),
- mnVerticalGap (10 - 2*rpTheme->GetIntegerValue(Theme::Integer_FocusIndicatorWidth)),
- mnHorizontalGap(10 - 2*rpTheme->GetIntegerValue(Theme::Integer_FocusIndicatorWidth)),
- maMinimalSize(132,98),
- maPreferredSize(200,150),
- maMaximalSize(300,200),
- mnMinimalColumnCount(1),
- mnMaximalColumnCount(15),
- mnPageCount(0),
- mnColumnCount(1),
- mnRowCount(0),
- mnMaxColumnCount(0),
- mnMaxRowCount(0),
- maPageObjectSize(1,1),
- mpPageObjectLayouter(),
- mpTheme(rpTheme)
-{
-}
-
-
-
-
-Layouter::Implementation::Implementation (const Implementation& rImplementation)
- : mpWindow(rImplementation.mpWindow),
- mnRequestedLeftBorder(rImplementation.mnRequestedLeftBorder),
- mnRequestedRightBorder(rImplementation.mnRequestedRightBorder),
- mnRequestedTopBorder(rImplementation.mnRequestedTopBorder),
- mnRequestedBottomBorder(rImplementation.mnRequestedBottomBorder),
- mnLeftBorder(rImplementation.mnLeftBorder),
- mnRightBorder(rImplementation.mnRightBorder),
- mnTopBorder(rImplementation.mnTopBorder),
- mnBottomBorder(rImplementation.mnBottomBorder),
- mnVerticalGap(rImplementation.mnVerticalGap),
- mnHorizontalGap(rImplementation.mnHorizontalGap),
- maMinimalSize(rImplementation.maMinimalSize),
- maPreferredSize(rImplementation.maPreferredSize),
- maMaximalSize(rImplementation.maMaximalSize),
- mnMinimalColumnCount(rImplementation.mnMinimalColumnCount),
- mnMaximalColumnCount(rImplementation.mnMaximalColumnCount),
- mnPageCount(rImplementation.mnPageCount),
- mnColumnCount(rImplementation.mnColumnCount),
- mnRowCount(rImplementation.mnRowCount),
- mnMaxColumnCount(rImplementation.mnMaxColumnCount),
- mnMaxRowCount(rImplementation.mnMaxRowCount),
- maPageObjectSize(rImplementation.maPageObjectSize),
- mpPageObjectLayouter(),
- mpTheme(rImplementation.mpTheme)
-{
-}
-
-
-
-
-Layouter::Implementation::~Implementation (void)
-{
-}
-
-
-
-
-bool Layouter::Implementation::Rearrange (
- const Size& rWindowSize,
- const Size& rPreviewModelSize,
- const sal_uInt32 nPageCount)
-{
- mnPageCount = nPageCount;
-
- // Return early when the window or the model have not yet been initialized.
- if (rWindowSize.Width()<=0 || rWindowSize.Height()<=0)
- return false;
- if (rPreviewModelSize.Width()<=0 || rPreviewModelSize.Height()<=0)
- return false;
-
- CalculateRowAndColumnCount(rWindowSize);
-
- // Update the border values.
- mnLeftBorder = mnRequestedLeftBorder;
- mnTopBorder = mnRequestedTopBorder;
- mnRightBorder = mnRequestedRightBorder;
- mnBottomBorder = mnRequestedBottomBorder;
- if (mnColumnCount > 1)
- {
- int nMinimumBorderWidth = mnHorizontalGap/2;
- if (mnLeftBorder < nMinimumBorderWidth)
- mnLeftBorder = nMinimumBorderWidth;
- if (mnRightBorder < nMinimumBorderWidth)
- mnRightBorder = nMinimumBorderWidth;
- }
- else
- {
- int nMinimumBorderHeight = mnVerticalGap/2;
- if (mnTopBorder < nMinimumBorderHeight)
- mnTopBorder = nMinimumBorderHeight;
- if (mnBottomBorder < nMinimumBorderHeight)
- mnBottomBorder = nMinimumBorderHeight;
- }
-
- mpPageObjectLayouter.reset(
- new PageObjectLayouter(
- mpTheme,
- CalculateTargetSize(rWindowSize, rPreviewModelSize),
- rPreviewModelSize,
- mpWindow,
- mnPageCount));
- maPageObjectSize = mpPageObjectLayouter->GetSize(
- PageObjectLayouter::FocusIndicator,
- PageObjectLayouter::WindowCoordinateSystem);
-
- CalculateMaxRowAndColumnCount(rWindowSize);
-
- return true;
-}
-
-
-
-
-sal_Int32 Layouter::Implementation::GetRowAtPosition (
- sal_Int32 nYPosition,
- bool bIncludeBordersAndGaps,
- GapMembership eGapMembership) const
-{
- sal_Int32 nRow = -1;
-
- const sal_Int32 nY = nYPosition - mnTopBorder;
- if (nY >= 0)
- {
- // Vertical distance from one row to the next.
- const sal_Int32 nRowOffset (maPageObjectSize.Height() + mnVerticalGap);
-
- // Calculate row consisting of page objects and gap below.
- nRow = nY / nRowOffset;
-
- const sal_Int32 nDistanceIntoGap ((nY - nRow*nRowOffset) - maPageObjectSize.Height());
- // When inside the gap below then nYPosition is not over a page
- // object.
- if (nDistanceIntoGap > 0)
- nRow = ResolvePositionInGap (
- nDistanceIntoGap,
- eGapMembership,
- nRow,
- mnVerticalGap);
- }
- else if (bIncludeBordersAndGaps)
- {
- // We are in the top border area. Set nRow to the first row when
- // the top border shall be considered to belong to the first row.
- nRow = 0;
- }
-
- return nRow;
-}
-
-
-
-
-sal_Int32 Layouter::Implementation::GetColumnAtPosition (
- sal_Int32 nXPosition,
- bool bIncludeBordersAndGaps,
- GapMembership eGapMembership) const
-{
- sal_Int32 nColumn = -1;
-
- sal_Int32 nX = nXPosition - mnLeftBorder;
- if (nX >= 0)
- {
- // Horizontal distance from one column to the next.
- const sal_Int32 nColumnOffset (maPageObjectSize.Width() + mnHorizontalGap);
-
- // Calculate row consisting of page objects and gap below.
- nColumn = nX / nColumnOffset;
- if (nColumn < 0)
- nColumn = 0;
- else if (nColumn >= mnColumnCount)
- nColumn = mnColumnCount-1;
-
- const sal_Int32 nDistanceIntoGap ((nX - nColumn*nColumnOffset) - maPageObjectSize.Width());
- // When inside the gap at the right then nXPosition is not over a
- // page object.
- if (nDistanceIntoGap > 0)
- nColumn = ResolvePositionInGap (
- nDistanceIntoGap,
- eGapMembership,
- nColumn,
- mnHorizontalGap);
- }
- else if (bIncludeBordersAndGaps)
- {
- // We are in the left border area. Set nColumn to the first column
- // when the left border shall be considered to belong to the first
- // column.
- nColumn = 0;
- }
- return nColumn;
-}
-
-
-
-
-sal_Int32 Layouter::Implementation::ResolvePositionInGap (
- sal_Int32 nDistanceIntoGap,
- GapMembership eGapMembership,
- sal_Int32 nIndex,
- sal_Int32 nGap) const
-{
- switch (eGapMembership)
- {
- case GM_NONE:
- // The gap is no man's land.
- nIndex = -1;
- break;
-
- case GM_BOTH:
- {
- // The lower half of the gap belongs to the next row or column.
- sal_Int32 nFirstHalfGapWidth = nGap / 2;
- if (nDistanceIntoGap > nFirstHalfGapWidth)
- nIndex ++;
- break;
- }
-
- case GM_PREVIOUS:
- // Row or column already at correct value.
- break;
-
- case GM_NEXT:
- // The complete gap belongs to the next row or column.
- nIndex ++;
- break;
-
- case GM_PAGE_BORDER:
- if (nDistanceIntoGap > 0)
- {
- if (nDistanceIntoGap > nGap)
- {
- // Inside the border of the next row or column.
- nIndex ++;
- }
- else
- {
- // Inside the gap between the page borders.
- nIndex = -1;
- }
- }
- break;
-
- default:
- nIndex = -1;
- }
-
- return nIndex;
-}
-
-
-
-
-void Layouter::Implementation::CalculateGeometricPosition (
- InsertPosition& rPosition,
- const Size& rIndicatorSize,
- const bool bIsVertical,
- model::SlideSorterModel& rModel) const
-{
- // 1. Determine right/bottom of the leading page and the left/top of the
- // trailing page object and how to distribute the missing space.
- sal_Int32 nLeadingLocation (0);
- sal_Int32 nTrailingLocation (0);
- bool bIsLeadingFixed (false);
- bool bIsTrailingFixed (false);
- sal_Int32 nSecondaryLocation (0);
- const sal_Int32 nIndex (rPosition.GetIndex());
-
- if (rPosition.IsAtRunStart())
- {
- // Place indicator at the top of the column.
- const Rectangle aOuterBox (GetPageObjectBox(nIndex));
- const Rectangle aInnerBox (GetInnerBoundingBox(rModel, nIndex));
- if (bIsVertical)
- {
- nLeadingLocation = aOuterBox.Top();
- nTrailingLocation = aInnerBox.Top();
- nSecondaryLocation = aInnerBox.Center().X();
- }
- else
- {
- nLeadingLocation = aOuterBox.Left();
- nTrailingLocation = aInnerBox.Left();
- nSecondaryLocation = aInnerBox.Center().Y();
- }
- bIsLeadingFixed = true;
- }
- else if (rPosition.IsAtRunEnd())
- {
- // Place indicator at the bottom/right of the column/row.
-
- const Rectangle aOuterBox (GetPageObjectBox(nIndex-1));
- const Rectangle aInnerBox (GetInnerBoundingBox(rModel, nIndex-1));
- if (bIsVertical)
- {
- nLeadingLocation = aInnerBox.Bottom();
- nTrailingLocation = aOuterBox.Bottom();
- nSecondaryLocation = aInnerBox.Center().X();
- }
- else
- {
- nLeadingLocation = aInnerBox.Right();
- nTrailingLocation = aOuterBox.Right();
- nSecondaryLocation = aInnerBox.Center().Y();
- }
- bIsTrailingFixed = true;
- if ( ! rPosition.IsExtraSpaceNeeded())
- bIsLeadingFixed = true;
- }
- else
- {
- // Place indicator between two rows/columns.
- const Rectangle aBox1 (GetInnerBoundingBox(rModel, nIndex-1));
- const Rectangle aBox2 (GetInnerBoundingBox(rModel, nIndex));
- if (bIsVertical)
- {
- nLeadingLocation = aBox1.Bottom();
- nTrailingLocation = aBox2.Top();
- nSecondaryLocation = (aBox1.Center().X() + aBox2.Center().X()) / 2;
- }
- else
- {
- nLeadingLocation = aBox1.Right();
- nTrailingLocation = aBox2.Left();
- nSecondaryLocation = (aBox1.Center().Y() + aBox2.Center().Y()) / 2;
- }
- }
-
- // 2. Calculate the location of the insert indicator and the offsets of
- // leading and trailing pages.
- const sal_Int32 nAvailableSpace (nTrailingLocation - nLeadingLocation);
- const sal_Int32 nRequiredSpace (bIsVertical ? rIndicatorSize.Height():rIndicatorSize.Width());
- const sal_Int32 nMissingSpace (::std::max(sal_Int32(0), nRequiredSpace - nAvailableSpace));
- sal_Int32 nPrimaryLocation (0);
- sal_Int32 nLeadingOffset (0);
- sal_Int32 nTrailingOffset (0);
- if (bIsLeadingFixed)
- {
- nPrimaryLocation = nLeadingLocation + nRequiredSpace/2;
- if ( ! bIsTrailingFixed)
- nTrailingOffset = nMissingSpace;
- }
- else if (bIsTrailingFixed)
- {
- nPrimaryLocation = nTrailingLocation - nRequiredSpace/2;
- nLeadingOffset = -nMissingSpace;
- }
- else
- {
- nPrimaryLocation = (nLeadingLocation + nTrailingLocation) /2;
- nLeadingOffset = -nMissingSpace/2;
- nTrailingOffset = nMissingSpace + nLeadingOffset;
- }
-
- if (bIsVertical)
- {
- rPosition.SetGeometricalPosition(
- Point(nSecondaryLocation, nPrimaryLocation),
- Point(0, nLeadingOffset),
- Point(0, nTrailingOffset));
- }
- else
- {
- rPosition.SetGeometricalPosition(
- Point(nPrimaryLocation, nSecondaryLocation),
- Point(nLeadingOffset, 0),
- Point(nTrailingOffset, 0));
- }
-}
-
-
-
-
-Rectangle Layouter::Implementation::GetInnerBoundingBox (
- model::SlideSorterModel& rModel,
- const sal_Int32 nIndex) const
-{
- model::SharedPageDescriptor pDescriptor (rModel.GetPageDescriptor(nIndex));
- if ( ! pDescriptor)
- return Rectangle();
-
- const Point aLocation (pDescriptor->GetLocation(true));
- if (pDescriptor->HasState(model::PageDescriptor::ST_Selected))
- return mpPageObjectLayouter->GetBoundingBox(
- aLocation,
- PageObjectLayouter::PageObject,
- PageObjectLayouter::ModelCoordinateSystem);
- else
- return mpPageObjectLayouter->GetBoundingBox(
- aLocation,
- PageObjectLayouter::Preview,
- PageObjectLayouter::ModelCoordinateSystem);
-}
-
-
-
-
-Range Layouter::Implementation::GetValidHorizontalSizeRange (void) const
-{
- return Range(
- mnLeftBorder + maMinimalSize.Width() + mnRightBorder,
- mnLeftBorder + maMaximalSize.Width() + mnRightBorder);
-}
-
-
-
-
-Range Layouter::Implementation::GetValidVerticalSizeRange (void) const
-{
- return Range(
- mnTopBorder + maMinimalSize.Height() + mnBottomBorder,
- mnTopBorder + maMaximalSize.Height() + mnBottomBorder);
-}
-
-
-
-
-Range Layouter::Implementation::GetRangeOfVisiblePageObjects (const Rectangle& aVisibleArea) const
-{
- const sal_Int32 nRow0 (GetRowAtPosition(aVisibleArea.Top(), true, GM_NEXT));
- const sal_Int32 nCol0 (GetColumnAtPosition(aVisibleArea.Left(),true, GM_NEXT));
- const sal_Int32 nRow1 (GetRowAtPosition(aVisibleArea.Bottom(), true, GM_PREVIOUS));
- const sal_Int32 nCol1 (GetColumnAtPosition(aVisibleArea.Right(), true, GM_PREVIOUS));
-
- // When start and end lie in different rows then the range may include
- // slides outside (left or right of) the given area.
- return Range(GetIndex(nRow0,nCol0,true), GetIndex(nRow1,nCol1,true));
-}
-
-
-
-
-Size Layouter::Implementation::GetTargetSize (
- const Size& rWindowSize,
- const Size& rPreviewModelSize,
- const bool bCalculateWidth,
- const bool bCalculateHeight) const
-{
- (void)rPreviewModelSize;
-
- if (mnColumnCount<=0 || mnRowCount<=0)
- return maPreferredSize;
- if ( ! (bCalculateWidth || bCalculateHeight))
- {
- OSL_ASSERT(bCalculateWidth || bCalculateHeight);
- return maPreferredSize;
- }
-
- // Calculate the width of each page object.
- Size aTargetSize (0,0);
- if (bCalculateWidth)
- aTargetSize.setWidth(
- (rWindowSize.Width() - mnLeftBorder - mnRightBorder
- - (mnColumnCount-1) * mnHorizontalGap)
- / mnColumnCount);
- else if (bCalculateHeight)
- aTargetSize.setHeight(
- (rWindowSize.Height() - mnTopBorder - mnBottomBorder
- - (mnRowCount-1) * mnVerticalGap)
- / mnRowCount);
-
- if (bCalculateWidth)
- {
- if (aTargetSize.Width() < maMinimalSize.Width())
- aTargetSize.setWidth(maMinimalSize.Width());
- else if (aTargetSize.Width() > maMaximalSize.Width())
- aTargetSize.setWidth(maMaximalSize.Width());
- }
- else if (bCalculateHeight)
- {
- if (aTargetSize.Height() < maMinimalSize.Height())
- aTargetSize.setHeight(maMinimalSize.Height());
- else if (aTargetSize.Height() > maMaximalSize.Height())
- aTargetSize.setHeight(maMaximalSize.Height());
- }
-
- return aTargetSize;
-}
-
-
-
-
-sal_Int32 Layouter::Implementation::GetIndex (
- const sal_Int32 nRow,
- const sal_Int32 nColumn,
- const bool bClampToValidRange) const
-{
- if (nRow >= 0 && nColumn >= 0)
- {
- const sal_Int32 nIndex (nRow * mnColumnCount + nColumn);
- if (nIndex >= mnPageCount)
- if (bClampToValidRange)
- return mnPageCount-1;
- else
- return -1;
- else
- return nIndex;
- }
- else if (bClampToValidRange)
- return 0;
- else
- return -1;
-}
-
-
-
-
-Rectangle Layouter::Implementation::GetPageObjectBox (
- const sal_Int32 nIndex,
- const bool bIncludeBorderAndGap) const
-{
- const sal_Int32 nRow (nIndex / mnColumnCount);
- const sal_Int32 nColumn (nIndex % mnColumnCount);
-
- const Rectangle aBoundingBox (GetPageObjectBox(nRow,nColumn));
- if (bIncludeBorderAndGap)
- return AddBorderAndGap(aBoundingBox, nRow, nColumn);
- else
- return aBoundingBox;
-}
-
-
-
-
-Rectangle Layouter::Implementation::GetPageObjectBox (
- const sal_Int32 nRow,
- const sal_Int32 nColumn) const
-{
- return Rectangle(
- Point (mnLeftBorder
- + nColumn * maPageObjectSize.Width()
- + (nColumn>0 ? nColumn : 0) * mnHorizontalGap,
- mnTopBorder
- + nRow * maPageObjectSize.Height()
- + (nRow>0 ? nRow : 0) * mnVerticalGap),
- maPageObjectSize);
-}
-
-
-
-
-
-Rectangle Layouter::Implementation::AddBorderAndGap (
- const Rectangle& rBoundingBox,
- const sal_Int32 nRow,
- const sal_Int32 nColumn) const
-{
- Rectangle aBoundingBox (rBoundingBox);
-
- if (nColumn == 0)
- aBoundingBox.Left() = 0;
- else
- aBoundingBox.Left() -= mnHorizontalGap/2;
- if (nColumn == mnColumnCount-1)
- aBoundingBox.Right() += mnRightBorder;
- else
- aBoundingBox.Right() += mnHorizontalGap/2;
- if (nRow == 0)
- aBoundingBox.Top() = 0;
- else
- aBoundingBox.Top() -= mnVerticalGap/2;
- if (nRow == mnRowCount-1)
- aBoundingBox.Bottom() += mnBottomBorder;
- else
- aBoundingBox.Bottom() += mnVerticalGap/2;
- return aBoundingBox;
-}
-
-
-
-
-Rectangle Layouter::Implementation::GetTotalBoundingBox (void) const
-{
- sal_Int32 nHorizontalSize = 0;
- sal_Int32 nVerticalSize = 0;
- if (mnColumnCount > 0)
- {
- sal_Int32 nRowCount = (mnPageCount+mnColumnCount-1) / mnColumnCount;
- nHorizontalSize =
- mnLeftBorder
- + mnRightBorder
- + mnColumnCount * maPageObjectSize.Width();
- if (mnColumnCount > 1)
- nHorizontalSize += (mnColumnCount-1) * mnHorizontalGap;
- nVerticalSize =
- mnTopBorder
- + mnBottomBorder
- + nRowCount * maPageObjectSize.Height();
- if (nRowCount > 1)
- nVerticalSize += (nRowCount-1) * mnVerticalGap;
- }
-
- return Rectangle (
- Point(0,0),
- Size (nHorizontalSize, nVerticalSize)
- );
-}
-
-
-
-
-void Layouter::Implementation::CalculateVerticalLogicalInsertPosition (
- const Point& rModelPosition,
- InsertPosition& rPosition) const
-{
- const sal_Int32 nY = rModelPosition.Y() - mnTopBorder + maPageObjectSize.Height()/2;
- const sal_Int32 nRowHeight (maPageObjectSize.Height() + mnVerticalGap);
- const sal_Int32 nRow (::std::min(mnPageCount, nY / nRowHeight));
- rPosition.SetLogicalPosition (
- nRow,
- 0,
- nRow,
- (nRow == 0),
- (nRow == mnRowCount),
- (nRow >= mnMaxRowCount));
-}
-
-
-
-
-//===== HorizontalImplementation ================================================
-
-HorizontalImplementation::HorizontalImplementation (
- const SharedSdWindow& rpWindow,
- const ::boost::shared_ptr<view::Theme>& rpTheme)
- : Implementation(rpWindow, rpTheme)
-{
-}
-
-
-
-
-HorizontalImplementation::HorizontalImplementation (const Implementation& rImplementation)
- : Implementation(rImplementation)
-{
-}
-
-
-
-
-Layouter::Orientation HorizontalImplementation::GetOrientation (void) const
-{
- return Layouter::HORIZONTAL;
-}
-
-
-
-
-void HorizontalImplementation::CalculateRowAndColumnCount (const Size& rWindowSize)
-{
- (void)rWindowSize;
-
- // Row and column count are fixed (for a given page count.)
- mnColumnCount = mnPageCount;
- mnRowCount = 1;
-}
-
-
-
-
-void HorizontalImplementation::CalculateMaxRowAndColumnCount (const Size& rWindowSize)
-{
- mnMaxColumnCount = (rWindowSize.Width() - mnLeftBorder - mnRightBorder)
- / (maPageObjectSize.Width() + mnHorizontalGap);
- mnMaxRowCount = 1;
-}
-
-
-
-
-Size HorizontalImplementation::CalculateTargetSize (
- const Size& rWindowSize,
- const Size& rPreviewModelSize) const
-{
- return Implementation::GetTargetSize(rWindowSize, rPreviewModelSize, false, true);
-}
-
-
-
-
-void HorizontalImplementation::CalculateLogicalInsertPosition (
- const Point& rModelPosition,
- InsertPosition& rPosition) const
-{
- const sal_Int32 nX = rModelPosition.X() - mnLeftBorder + maPageObjectSize.Width()/2;
- const sal_Int32 nColumnWidth (maPageObjectSize.Width() + mnHorizontalGap);
- const sal_Int32 nColumn (::std::min(mnPageCount, nX / nColumnWidth));
- rPosition.SetLogicalPosition (
- 0,
- nColumn,
- nColumn,
- (nColumn == 0),
- (nColumn == mnColumnCount),
- (nColumn >= mnMaxColumnCount));
-}
-
-
-
-
-//===== VerticalImplementation ================================================
-
-VerticalImplementation::VerticalImplementation (
- const SharedSdWindow& rpWindow,
- const ::boost::shared_ptr<view::Theme>& rpTheme)
- : Implementation(rpWindow, rpTheme)
-{
-}
-
-
-
-
-VerticalImplementation::VerticalImplementation (const Implementation& rImplementation)
- : Implementation(rImplementation)
-{
-}
-
-
-
-
-Layouter::Orientation VerticalImplementation::GetOrientation (void) const
-{
- return Layouter::VERTICAL;
-}
-
-
-
-
-void VerticalImplementation::CalculateRowAndColumnCount (const Size& rWindowSize)
-{
- (void)rWindowSize;
-
- // Row and column count are fixed (for a given page count.)
- mnRowCount = mnPageCount;
- mnColumnCount = 1;
-
-}
-
-
-
-
-void VerticalImplementation::CalculateMaxRowAndColumnCount (const Size& rWindowSize)
-{
- mnMaxRowCount = (rWindowSize.Height() - mnTopBorder - mnBottomBorder)
- / (maPageObjectSize.Height() + mnVerticalGap);
- mnMaxColumnCount = 1;
-}
-
-
-
-
-Size VerticalImplementation::CalculateTargetSize (
- const Size& rWindowSize,
- const Size& rPreviewModelSize) const
-{
- return Implementation::GetTargetSize(rWindowSize, rPreviewModelSize, true, false);
-}
-
-
-
-
-void VerticalImplementation::CalculateLogicalInsertPosition (
- const Point& rModelPosition,
- InsertPosition& rPosition) const
-{
- return CalculateVerticalLogicalInsertPosition(rModelPosition, rPosition);
-}
-
-
-
-
-//===== GridImplementation ================================================
-
-GridImplementation::GridImplementation (
- const SharedSdWindow& rpWindow,
- const ::boost::shared_ptr<view::Theme>& rpTheme)
- : Implementation(rpWindow, rpTheme)
-{
-}
-
-
-
-
-GridImplementation::GridImplementation (const Implementation& rImplementation)
- : Implementation(rImplementation)
-{
-}
-
-
-
-
-Layouter::Orientation GridImplementation::GetOrientation (void) const
-{
- return Layouter::GRID;
-}
-
-
-
-
-void GridImplementation::CalculateRowAndColumnCount (const Size& rWindowSize)
-{
- // Calculate the column count.
- mnColumnCount
- = (rWindowSize.Width() - mnRequestedLeftBorder - mnRequestedRightBorder)
- / (maPreferredSize.Width() + mnHorizontalGap);
- if (mnColumnCount < mnMinimalColumnCount)
- mnColumnCount = mnMinimalColumnCount;
- if (mnColumnCount > mnMaximalColumnCount)
- mnColumnCount = mnMaximalColumnCount;
- mnRowCount = (mnPageCount + mnColumnCount-1)/mnColumnCount;
-}
-
-
-
-
-void GridImplementation::CalculateMaxRowAndColumnCount (const Size& rWindowSize)
-{
- mnMaxColumnCount = (rWindowSize.Width() - mnLeftBorder - mnRightBorder)
- / (maPageObjectSize.Width() + mnHorizontalGap);
- mnMaxRowCount = (rWindowSize.Height() - mnTopBorder - mnBottomBorder)
- / (maPageObjectSize.Height() + mnVerticalGap);
-}
-
-
-
-
-
-Size GridImplementation::CalculateTargetSize (
- const Size& rWindowSize,
- const Size& rPreviewModelSize) const
-{
- return Implementation::GetTargetSize(rWindowSize, rPreviewModelSize, true, true);
-}
-
-
-
-
-void GridImplementation::CalculateLogicalInsertPosition (
- const Point& rModelPosition,
- InsertPosition& rPosition) const
-{
- if (mnColumnCount == 1)
- {
- CalculateVerticalLogicalInsertPosition(rModelPosition, rPosition);
- }
- else
- {
- // Handle the general case of more than one column.
- sal_Int32 nRow (::std::min(
- mnRowCount-1,
- GetRowAtPosition (rModelPosition.Y(), true, GM_BOTH)));
- const sal_Int32 nX = rModelPosition.X() - mnLeftBorder + maPageObjectSize.Width()/2;
- const sal_Int32 nColumnWidth (maPageObjectSize.Width() + mnHorizontalGap);
- sal_Int32 nColumn (::std::min(mnColumnCount, nX / nColumnWidth));
- sal_Int32 nIndex (nRow * mnColumnCount + nColumn);
- bool bIsAtRunEnd (nColumn == mnColumnCount);
-
- if (nIndex >= mnPageCount)
- {
- nIndex = mnPageCount;
- nRow = mnRowCount-1;
- nColumn = ::std::min(::std::min(mnPageCount, mnColumnCount), nColumn);
- bIsAtRunEnd = true;
- }
-
- rPosition.SetLogicalPosition (
- nRow,
- nColumn,
- nIndex,
- (nColumn == 0),
- bIsAtRunEnd,
- (nColumn >= mnMaxColumnCount));
- }
-}
-
-
-
-
-//===== InsertPosition ========================================================
-
-InsertPosition::InsertPosition (void)
- : mnRow(-1),
- mnColumn(-1),
- mnIndex(-1),
- mbIsAtRunStart(false),
- mbIsAtRunEnd(false),
- mbIsExtraSpaceNeeded(false),
- maLocation(0,0),
- maLeadingOffset(0,0),
- maTrailingOffset(0,0)
-{
-}
-
-
-
-
-InsertPosition& InsertPosition::operator= (const InsertPosition& rInsertPosition)
-{
- if (this != &rInsertPosition)
- {
- mnRow = rInsertPosition.mnRow;
- mnColumn = rInsertPosition.mnColumn;
- mnIndex = rInsertPosition.mnIndex;
- mbIsAtRunStart = rInsertPosition.mbIsAtRunStart;
- mbIsAtRunEnd = rInsertPosition.mbIsAtRunEnd;
- mbIsExtraSpaceNeeded = rInsertPosition.mbIsExtraSpaceNeeded;
- maLocation = rInsertPosition.maLocation;
- maLeadingOffset = rInsertPosition.maLeadingOffset;
- maTrailingOffset = rInsertPosition.maTrailingOffset;
- }
- return *this;
-}
-
-
-
-
-bool InsertPosition::operator== (const InsertPosition& rInsertPosition) const
-{
- // Do not compare the geometrical information (maLocation).
- return mnRow==rInsertPosition.mnRow
- && mnColumn==rInsertPosition.mnColumn
- && mnIndex==rInsertPosition.mnIndex
- && mbIsAtRunStart==rInsertPosition.mbIsAtRunStart
- && mbIsAtRunEnd==rInsertPosition.mbIsAtRunEnd
- && mbIsExtraSpaceNeeded==rInsertPosition.mbIsExtraSpaceNeeded;
-}
-
-
-
-
-bool InsertPosition::operator!= (const InsertPosition& rInsertPosition) const
-{
- return !operator==(rInsertPosition);
-}
-
-
-
-
-void InsertPosition::SetLogicalPosition (
- const sal_Int32 nRow,
- const sal_Int32 nColumn,
- const sal_Int32 nIndex,
- const bool bIsAtRunStart,
- const bool bIsAtRunEnd,
- const bool bIsExtraSpaceNeeded)
-{
- mnRow = nRow;
- mnColumn = nColumn;
- mnIndex = nIndex;
- mbIsAtRunStart = bIsAtRunStart;
- mbIsAtRunEnd = bIsAtRunEnd;
- mbIsExtraSpaceNeeded = bIsExtraSpaceNeeded;
-}
-
-
-
-
-void InsertPosition::SetGeometricalPosition(
- const Point aLocation,
- const Point aLeadingOffset,
- const Point aTrailingOffset)
-{
- maLocation = aLocation;
- maLeadingOffset = aLeadingOffset;
- maTrailingOffset = aTrailingOffset;
-}
-
-
-
-} } } // end of namespace ::sd::slidesorter::namespace
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */