diff options
Diffstat (limited to 'sd/source/ui/slidesorter/view/SlideSorterView.cxx')
-rw-r--r-- | sd/source/ui/slidesorter/view/SlideSorterView.cxx | 1135 |
1 files changed, 0 insertions, 1135 deletions
diff --git a/sd/source/ui/slidesorter/view/SlideSorterView.cxx b/sd/source/ui/slidesorter/view/SlideSorterView.cxx deleted file mode 100644 index ce2b3a641..000000000 --- a/sd/source/ui/slidesorter/view/SlideSorterView.cxx +++ /dev/null @@ -1,1135 +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/SlideSorterView.hxx" - -#include "ViewShellBase.hxx" -#include "SlideSorter.hxx" -#include "SlideSorterViewShell.hxx" -#include "ViewShell.hxx" -#include "SlsViewCacheContext.hxx" -#include "SlsLayeredDevice.hxx" -#include "view/SlsLayouter.hxx" -#include "view/SlsPageObjectLayouter.hxx" -#include "view/SlsPageObjectPainter.hxx" -#include "view/SlsILayerPainter.hxx" -#include "view/SlsButtonBar.hxx" -#include "view/SlsToolTip.hxx" -#include "controller/SlideSorterController.hxx" -#include "controller/SlsProperties.hxx" -#include "model/SlideSorterModel.hxx" -#include "model/SlsPageEnumerationProvider.hxx" -#include "model/SlsPageDescriptor.hxx" -#include "cache/SlsPageCache.hxx" -#include "cache/SlsPageCacheManager.hxx" -#include "cache/SlsCacheContext.hxx" -#include "taskpane/SlideSorterCacheDisplay.hxx" -#include "DrawDocShell.hxx" -#include "PaneDockingWindow.hxx" - -#include "drawdoc.hxx" -#include "sdpage.hxx" -#include "Window.hxx" -#include "sdresid.hxx" -#include "glob.hrc" - -#include <svl/itempool.hxx> -#include <svx/svdpagv.hxx> -#include <svx/svdopage.hxx> -#include <svx/xlndsit.hxx> -#include <svx/xlnclit.hxx> -#include <vcl/svapp.hxx> -#include <vcl/scrbar.hxx> -#include <tools/poly.hxx> -#include <vcl/lineinfo.hxx> -#include <algorithm> -#include <svx/sdrpagewindow.hxx> -#include <svl/itempool.hxx> -#include <basegfx/matrix/b2dhommatrix.hxx> -#include <basegfx/polygon/b2dpolygontools.hxx> -#include <basegfx/polygon/b2dpolygon.hxx> -#include <drawinglayer/geometry/viewinformation2d.hxx> -#include <canvas/elapsedtime.hxx> - -//#define DEBUG_TIMING -#include <svl/itempool.hxx> -#ifdef DEBUG_TIMING -#include <vector> -#endif -#include <boost/foreach.hpp> - - -using namespace std; -using namespace ::sd::slidesorter::model; -using namespace ::drawinglayer::primitive2d; - - -namespace sd { namespace slidesorter { namespace view { - -namespace { - /** Wrapper around the SlideSorterView that supports the IPainter - interface and that allows the LayeredDevice to hold the - SlideSorterView (held as scoped_ptr by the SlideSorter) as - shared_ptr. - */ - class Painter : public ILayerPainter - { - public: - Painter (SlideSorterView& rView) : mrView(rView) {} - virtual ~Painter (void) {} - - virtual void Paint (OutputDevice& rDevice, const Rectangle& rRepaintArea) - { - mrView.Paint(rDevice,rRepaintArea); - } - - virtual void SetLayerInvalidator (const SharedILayerInvalidator&) {} - - private: - SlideSorterView& mrView; - }; -} - - - -class BackgroundPainter - : public ILayerPainter, - public ::boost::noncopyable -{ -public: - BackgroundPainter (const Color aBackgroundColor) : maBackgroundColor(aBackgroundColor) {} - virtual ~BackgroundPainter (void) {} - - virtual void Paint (OutputDevice& rDevice, const Rectangle& rRepaintArea) - { - rDevice.SetFillColor(maBackgroundColor); - rDevice.SetLineColor(); - rDevice.DrawRect(rRepaintArea); - } - - virtual void SetLayerInvalidator (const SharedILayerInvalidator&) {} - - void SetColor (const Color aColor) { maBackgroundColor = aColor; } - -private: - Color maBackgroundColor; -}; - - - -TYPEINIT1(SlideSorterView, ::sd::View); - -SlideSorterView::SlideSorterView (SlideSorter& rSlideSorter) - : ::sd::View ( - rSlideSorter.GetModel().GetDocument(), - rSlideSorter.GetContentWindow().get(), - rSlideSorter.GetViewShell()), - mrSlideSorter(rSlideSorter), - mrModel(rSlideSorter.GetModel()), - mbIsDisposed(false), - mpLayouter (new Layouter(rSlideSorter.GetContentWindow(), rSlideSorter.GetTheme())), - mbPageObjectVisibilitiesValid (false), - mpPreviewCache(), - mpLayeredDevice(new LayeredDevice(rSlideSorter.GetContentWindow())), - maVisiblePageRange(-1,-1), - mbModelChangedWhileModifyEnabled(true), - maPreviewSize(0,0), - mbPreciousFlagUpdatePending(true), - meOrientation(Layouter::GRID), - mpProperties(rSlideSorter.GetProperties()), - mpPageUnderMouse(), - mnButtonUnderMouse(-1), - mpPageObjectPainter(), - mpSelectionPainter(), - mpBackgroundPainter( - new BackgroundPainter(mrSlideSorter.GetTheme()->GetColor(Theme::Color_Background))), - mpButtonBar(new ButtonBar(mrSlideSorter)), - mpToolTip(new ToolTip(mrSlideSorter)), - mbIsRearrangePending(true), - maVisibilityChangeListeners() -{ - // Hide the page that contains the page objects. - SetPageVisible (sal_False); - - - // Register the background painter on level 1 to avoid the creation of a - // background buffer. - mpLayeredDevice->RegisterPainter(mpBackgroundPainter, 1); - - // Wrap a shared_ptr-held-wrapper around this view and register it as - // painter at the layered device. There is no explicit destruction: in - // the SlideSorterView destructor the layered device is destroyed and - // with it the only reference to the wrapper which therefore is also - // destroyed. - SharedILayerPainter pPainter (new Painter(*this)); - - // The painter is placed on level 1 to avoid buffering. This should be - // a little faster during animations because the previews are painted - // directly into the window, not via the buffer. - mpLayeredDevice->RegisterPainter(pPainter, 1); -} - - - - -SlideSorterView::~SlideSorterView (void) -{ - if ( ! mbIsDisposed) - { - OSL_ASSERT(mbIsDisposed); - Dispose(); - } -} - - - - -void SlideSorterView::Init (void) -{ - HandleModelChange(); -} - - - - -void SlideSorterView::Dispose (void) -{ - mpSelectionPainter.reset(); - - mpLayeredDevice->Dispose(); - mpPreviewCache.reset(); - - SetPageUnderMouse(SharedPageDescriptor(),false); - - // Hide the page to avoid problems in the view when deleting - // visualized objects - HideSdrPage(); - - // Deletion of the objects and the page will be done in SdrModel - // destructor (as long as objects and pages are added) - - OSL_ASSERT(mpLayeredDevice.unique()); - mpLayeredDevice.reset(); - - mbIsDisposed = true; -} - - - - -sal_Int32 SlideSorterView::GetPageIndexAtPoint (const Point& rWindowPosition) const -{ - sal_Int32 nIndex (-1); - - SharedSdWindow pWindow (mrSlideSorter.GetContentWindow()); - if (pWindow) - { - nIndex = mpLayouter->GetIndexAtPoint(pWindow->PixelToLogic(rWindowPosition), false, false); - - // Clip the page index against the page count. - if (nIndex >= mrModel.GetPageCount()) - nIndex = -1; - } - - return nIndex; -} - - - - -Layouter& SlideSorterView::GetLayouter (void) -{ - return *mpLayouter.get(); -} - - - - -void SlideSorterView::ModelHasChanged (void) -{ - // Ignore this call. Rely on hints sent by the model to get informed of - // model changes. -} - - - - -void SlideSorterView::LocalModelHasChanged(void) -{ - mbModelChangedWhileModifyEnabled = false; - - // First call our base class. - View::ModelHasChanged (); -} - - - - -void SlideSorterView::PreModelChange (void) -{ - // Reset the slide under the mouse. It will be re-set in PostModelChange(). - SetPageUnderMouse(SharedPageDescriptor()); -} - - - - -void SlideSorterView::PostModelChange (void) -{ - // In PreModelChange() the page objects have been released. Here we - // create new ones. - ::osl::MutexGuard aGuard (mrModel.GetMutex()); - - model::PageEnumeration aPageEnumeration ( - model::PageEnumerationProvider::CreateAllPagesEnumeration(mrModel)); - - // The new page objects have to be scaled and positioned. - RequestRearrange(); - RequestRepaint(); -} - - - - -/** At the moment for every model change all page objects are destroyed and - re-created again. This can be optimized by accepting hints that - describe the type of change so that existing page objects can be - reused. -*/ -void SlideSorterView::HandleModelChange (void) -{ - PreModelChange (); - PostModelChange(); -} - - - - -void SlideSorterView::HandleDrawModeChange (void) -{ - // Replace the preview cache with a new and empty one. The - // PreviewRenderer that is used by the cache is replaced by this as - // well. - mpPreviewCache.reset(); - GetPreviewCache()->InvalidateCache(true); - - RequestRepaint(); -} - - - - -void SlideSorterView::HandleDataChangeEvent (void) -{ - GetPageObjectPainter()->SetTheme(mrSlideSorter.GetTheme()); - - // Update the color used by the background painter. - ::boost::shared_ptr<BackgroundPainter> pPainter ( - ::boost::dynamic_pointer_cast<BackgroundPainter>(mpBackgroundPainter)); - if (pPainter) - pPainter->SetColor(mrSlideSorter.GetTheme()->GetColor(Theme::Color_Background)); - - if (mpButtonBar) - mpButtonBar->HandleDataChangeEvent(); - - RequestRepaint(); -} - - - - -void SlideSorterView::Resize (void) -{ - UpdateOrientation(); - - mpLayeredDevice->Resize(); - RequestRearrange(); -} - - - - -void SlideSorterView::RequestRearrange (void) -{ - mbIsRearrangePending = true; - Rearrange(); -} - - - - -void SlideSorterView::Rearrange (void) -{ - if ( ! mbIsRearrangePending) - return; - if (mrModel.GetPageCount() <= 0) - return; - - SharedSdWindow pWindow (mrSlideSorter.GetContentWindow()); - if ( ! pWindow) - return; - const Size aWindowSize (pWindow->GetSizePixel()); - if (aWindowSize.Width()<=0 || aWindowSize.Height()<=0) - return; - - const bool bRearrangeSuccess ( - mpLayouter->Rearrange ( - meOrientation, - aWindowSize, - mrModel.GetPageDescriptor(0)->GetPage()->GetSize(), - mrModel.GetPageCount())); - if (bRearrangeSuccess) - { - mbIsRearrangePending = false; - Layout(); - UpdatePageUnderMouse(false); - // RequestRepaint(); - } -} - - - - -void SlideSorterView::UpdateOrientation (void) -{ - // The layout of slides depends on whether the slide sorter is - // displayed in the center or the side pane. - if (mrSlideSorter.GetViewShell()->IsMainViewShell()) - SetOrientation(Layouter::GRID); - else - { - // Get access to the docking window. - ::Window* pWindow = mrSlideSorter.GetContentWindow().get(); - PaneDockingWindow* pDockingWindow = NULL; - while (pWindow!=NULL && pDockingWindow==NULL) - { - pDockingWindow = dynamic_cast<PaneDockingWindow*>(pWindow); - pWindow = pWindow->GetParent(); - } - - if (pDockingWindow != NULL) - { - const long nScrollBarSize ( - Application::GetSettings().GetStyleSettings().GetScrollBarSize()); - switch (pDockingWindow->GetOrientation()) - { - case PaneDockingWindow::HorizontalOrientation: - if (SetOrientation(Layouter::HORIZONTAL)) - { - const Range aRange (mpLayouter->GetValidVerticalSizeRange()); - pDockingWindow->SetValidSizeRange(Range( - aRange.Min() + nScrollBarSize, - aRange.Max() + nScrollBarSize)); - } - break; - - case PaneDockingWindow::VerticalOrientation: - if (SetOrientation(Layouter::VERTICAL)) - { - const Range aRange (mpLayouter->GetValidHorizontalSizeRange()); - pDockingWindow->SetValidSizeRange(Range( - aRange.Min() + nScrollBarSize, - aRange.Max() + nScrollBarSize)); - } - break; - - case PaneDockingWindow::UnknownOrientation: - if (SetOrientation(Layouter::GRID)) - { - const sal_Int32 nAdditionalSize (10); - pDockingWindow->SetMinOutputSizePixel(Size( - mpLayouter->GetValidHorizontalSizeRange().Min() - + nScrollBarSize - + nAdditionalSize, - mpLayouter->GetValidVerticalSizeRange().Min() - + nScrollBarSize - + nAdditionalSize)); - } - return; - } - } - else - { - // We are not placed in a docking window. One possible reason - // is that the slide sorter is temporarily into a cache and was - // reparented to a non-docking window. - SetOrientation(Layouter::GRID); - } - } -} - - - - -void SlideSorterView::Layout () -{ - SharedSdWindow pWindow (mrSlideSorter.GetContentWindow()); - if (pWindow) - { - // Set the model area, i.e. the smallest rectangle that includes all - // page objects. - const Rectangle aViewBox (mpLayouter->GetTotalBoundingBox()); - pWindow->SetViewOrigin (aViewBox.TopLeft()); - pWindow->SetViewSize (aViewBox.GetSize()); - - ::boost::shared_ptr<PageObjectLayouter> pPageObjectLayouter( - mpLayouter->GetPageObjectLayouter()); - if (pPageObjectLayouter) - { - const Size aNewPreviewSize (mpLayouter->GetPageObjectLayouter()->GetSize( - PageObjectLayouter::Preview, - PageObjectLayouter::WindowCoordinateSystem)); - if (maPreviewSize != aNewPreviewSize && GetPreviewCache()) - { - mpPreviewCache->ChangeSize(aNewPreviewSize, true); - maPreviewSize = aNewPreviewSize; - } - } - - // Iterate over all page objects and place them relative to the - // containing page. - model::PageEnumeration aPageEnumeration ( - model::PageEnumerationProvider::CreateAllPagesEnumeration(mrModel)); - while (aPageEnumeration.HasMoreElements()) - { - model::SharedPageDescriptor pDescriptor (aPageEnumeration.GetNextElement()); - pDescriptor->SetBoundingBox(mpLayouter->GetPageObjectBox(pDescriptor->GetPageIndex())); - } - - GetPageObjectPainter()->NotifyResize(); - } - - InvalidatePageObjectVisibilities (); -} - - - - -void SlideSorterView::InvalidatePageObjectVisibilities (void) -{ - mbPageObjectVisibilitiesValid = false; -} - - - - -void SlideSorterView::DeterminePageObjectVisibilities (void) -{ - SharedSdWindow pWindow (mrSlideSorter.GetContentWindow()); - if (pWindow) - { - // Set this flag to true here so that an invalidate during the - // visibility calculation can correctly invalidate it again. - mbPageObjectVisibilitiesValid = true; - - Rectangle aViewArea (pWindow->PixelToLogic(Rectangle(Point(0,0),pWindow->GetSizePixel()))); - const Range aRange (mpLayouter->GetRangeOfVisiblePageObjects(aViewArea)); - const Range aUnion( - ::std::min(maVisiblePageRange.Min(), aRange.Min()), - ::std::max(maVisiblePageRange.Max(), aRange.Max())); - - // For page objects that just dropped off the visible area we - // decrease the priority of pending requests for preview bitmaps. - if (maVisiblePageRange != aRange) - mbPreciousFlagUpdatePending |= true; - - model::SharedPageDescriptor pDescriptor; - for (int nIndex=aUnion.Min(); nIndex<=aUnion.Max(); nIndex++) - { - pDescriptor = mrModel.GetPageDescriptor(nIndex); - if (pDescriptor.get() != NULL) - SetState( - pDescriptor, - PageDescriptor::ST_Visible, - aRange.IsInside(nIndex)); - } - - // Broadcast a change of the set of visible page objects. - if (maVisiblePageRange != aRange) - { - maVisiblePageRange = aRange; - - // Tell the listeners that the visibility of some objects has - // changed. - ::std::vector<Link>& aChangeListeners (maVisibilityChangeListeners); - for (::std::vector<Link>::const_iterator - iLink(aChangeListeners.begin()), - iEnd(aChangeListeners.end()); - iLink!=iEnd; - ++iLink) - { - iLink->Call(NULL); - } - } - - - // Restore the mouse over state. - UpdatePageUnderMouse(true); - } -} - - - - -void SlideSorterView::UpdatePreciousFlags (void) -{ - if (mbPreciousFlagUpdatePending) - { - mbPreciousFlagUpdatePending = false; - - model::SharedPageDescriptor pDescriptor; - ::boost::shared_ptr<cache::PageCache> pCache = GetPreviewCache(); - sal_Int32 nPageCount (mrModel.GetPageCount()); - - for (int nIndex=0; nIndex<=nPageCount; ++nIndex) - { - pDescriptor = mrModel.GetPageDescriptor(nIndex); - if (pDescriptor.get() != NULL) - { - pCache->SetPreciousFlag( - pDescriptor->GetPage(), - maVisiblePageRange.IsInside(nIndex)); - SSCD_SET_VISIBILITY(mrModel.GetDocument(), nIndex, - maVisiblePageRange.IsInside(nIndex)); - } - else - { - // At least one cache entry can not be updated. Remember to - // repeat the whole updating later and leave the loop now. - mbPreciousFlagUpdatePending = true; - break; - } - } - } -} - - - - -bool SlideSorterView::SetOrientation (const Layouter::Orientation eOrientation) -{ - if (meOrientation != eOrientation) - { - meOrientation = eOrientation; - return true; - } - else - return false; -} - - - - -Layouter::Orientation SlideSorterView::GetOrientation (void) const -{ - return meOrientation; -} - - - - -void SlideSorterView::RequestRepaint (void) -{ - SharedSdWindow pWindow (mrSlideSorter.GetContentWindow()); - if (pWindow) - { - mpLayeredDevice->InvalidateAllLayers( - Rectangle( - pWindow->PixelToLogic(Point(0,0)), - pWindow->PixelToLogic(pWindow->GetSizePixel()))); - pWindow->Invalidate(); - } -} - - - - -void SlideSorterView::RequestRepaint (const model::SharedPageDescriptor& rpDescriptor) -{ - if (rpDescriptor) - RequestRepaint(rpDescriptor->GetBoundingBox()); -} - - - - -void SlideSorterView::RequestRepaint (const Rectangle& rRepaintBox) -{ - SharedSdWindow pWindow (mrSlideSorter.GetContentWindow()); - if (pWindow) - { - mpLayeredDevice->InvalidateAllLayers(rRepaintBox); - pWindow->Invalidate(rRepaintBox); - } -} - - - -void SlideSorterView::RequestRepaint (const Region& rRepaintRegion) -{ - SharedSdWindow pWindow (mrSlideSorter.GetContentWindow()); - if (pWindow) - { - mpLayeredDevice->InvalidateAllLayers(rRepaintRegion); - pWindow->Invalidate(rRepaintRegion); - } -} - - - - -Rectangle SlideSorterView::GetModelArea (void) -{ - return mpLayouter->GetTotalBoundingBox(); -} - - -#ifdef DEBUG_TIMING -static ::canvas::tools::ElapsedTime gaTimer; -static const size_t gFrameTimeCount (10); -static size_t gFrameTimeIndex (0); -static ::std::vector<double> gFrameTimes (gFrameTimeCount, 0); -static double gFrameTimeSum (0); -static const Rectangle gFrameTimeBox (10,10,150,20); -static double gnLastFrameStart = 0; -#endif - -void SlideSorterView::CompleteRedraw ( - OutputDevice* pDevice, - const Region& rPaintArea, - sdr::contact::ViewObjectContactRedirector* pRedirector) -{ - (void)pRedirector; -#ifdef DEBUG_TIMING - const double nStartTime (gaTimer.getElapsedTime()); - OSL_TRACE("SlideSorterView::CompleteRedraw start at %f, %s", - nStartTime, - mnLockRedrawSmph ? "locked" : ""); -#endif - - if (pDevice == NULL || pDevice!=mrSlideSorter.GetContentWindow().get()) - return; - - // The parent implementation of CompleteRedraw is called only when - // painting is locked. We do all the painting ourself. When painting - // is locked the parent implementation keeps track of the repaint - // requests and later, when painting is unlocked, calls CompleteRedraw - // for all missed repaints. - - if (mnLockRedrawSmph == 0) - { - mrSlideSorter.GetContentWindow()->IncrementLockCount(); - if (mpLayeredDevice->HandleMapModeChange()) - DeterminePageObjectVisibilities(); - mpLayeredDevice->Repaint(rPaintArea); - mrSlideSorter.GetContentWindow()->DecrementLockCount(); - } - else - { - maRedrawRegion.Union(rPaintArea); - } - -#ifdef DEBUG_TIMING - const double nEndTime (gaTimer.getElapsedTime()); - OSL_TRACE("SlideSorterView::CompleteRedraw end at %f after %fms", nEndTime, (nEndTime-nStartTime)*1000); - gFrameTimeSum -= gFrameTimes[gFrameTimeIndex]; - gFrameTimes[gFrameTimeIndex] = nStartTime - gnLastFrameStart; - gnLastFrameStart = nStartTime; - gFrameTimeSum += gFrameTimes[gFrameTimeIndex]; - gFrameTimeIndex = (gFrameTimeIndex+1) % gFrameTimeCount; - - - mrSlideSorter.GetContentWindow()->SetFillColor(COL_BLUE); - mrSlideSorter.GetContentWindow()->DrawRect(gFrameTimeBox); - mrSlideSorter.GetContentWindow()->SetTextColor(COL_WHITE); - mrSlideSorter.GetContentWindow()->DrawText( - gFrameTimeBox, - ::rtl::OUString::valueOf(1 / (gFrameTimeSum / gFrameTimeCount)), - TEXT_DRAW_RIGHT | TEXT_DRAW_VCENTER); - // mrSlideSorter.GetContentWindow()->Invalidate(gFrameTimeBox); -#endif -} - - - - -void SlideSorterView::Paint ( - OutputDevice& rDevice, - const Rectangle& rRepaintArea) -{ - if ( ! mpPageObjectPainter) - if ( ! GetPageObjectPainter()) - return; - - // Update the page visibilities when they have been invalidated. - if ( ! mbPageObjectVisibilitiesValid) - DeterminePageObjectVisibilities(); - - if (mbPreciousFlagUpdatePending) - UpdatePreciousFlags(); - - if (mbIsRearrangePending) - Rearrange(); - - // Paint all page objects that are fully or partially inside the - // repaint region. - const Range aRange (mpLayouter->GetRangeOfVisiblePageObjects(rRepaintArea)); - for (sal_Int32 nIndex=aRange.Min(); nIndex<=aRange.Max(); ++nIndex) - { - model::SharedPageDescriptor pDescriptor (mrModel.GetPageDescriptor(nIndex)); - if (!pDescriptor || ! pDescriptor->HasState(PageDescriptor::ST_Visible)) - continue; - - mpPageObjectPainter->PaintPageObject(rDevice, pDescriptor); - } -} - - - - -void SlideSorterView::ConfigurationChanged ( - utl::ConfigurationBroadcaster* pBroadcaster, - sal_uInt32 nHint) -{ - // Some changes of the configuration (some of the colors for example) - // may affect the previews. Throw away the old ones and create new ones. - cache::PageCacheManager::Instance()->InvalidateAllCaches(); - - ::sd::View::ConfigurationChanged(pBroadcaster, nHint); - RequestRepaint(); - -} - - - - -::boost::shared_ptr<cache::PageCache> SlideSorterView::GetPreviewCache (void) -{ - SharedSdWindow pWindow (mrSlideSorter.GetContentWindow()); - if (pWindow && mpPreviewCache.get() == NULL) - { - mpPreviewCache.reset( - new cache::PageCache( - mpLayouter->GetPageObjectSize(), - false, - cache::SharedCacheContext(new ViewCacheContext(mrSlideSorter)))); - } - - return mpPreviewCache; -} - - - - -Pair SlideSorterView::GetVisiblePageRange (void) -{ - if ( ! mbPageObjectVisibilitiesValid) - DeterminePageObjectVisibilities(); - return maVisiblePageRange; -} - - - - -void SlideSorterView::AddVisibilityChangeListener (const Link& rListener) -{ - if (::std::find ( - maVisibilityChangeListeners.begin(), - maVisibilityChangeListeners.end(), - rListener) == maVisibilityChangeListeners.end()) - { - maVisibilityChangeListeners.push_back(rListener); - } -} - - - - -void SlideSorterView::RemoveVisibilityChangeListener(const Link&rListener) -{ - maVisibilityChangeListeners.erase ( - ::std::find ( - maVisibilityChangeListeners.begin(), - maVisibilityChangeListeners.end(), - rListener)); -} - - - - -ButtonBar& SlideSorterView::GetButtonBar (void) const -{ - OSL_ASSERT(mpButtonBar); - return *mpButtonBar; -} - - - - -ToolTip& SlideSorterView::GetToolTip (void) const -{ - OSL_ASSERT(mpToolTip); - return *mpToolTip; -} - - - - -void SlideSorterView::Notify (SfxBroadcaster& rBroadcaster, const SfxHint& rHint) -{ - ::sd::DrawDocShell* pDocShell = mrModel.GetDocument()->GetDocSh(); - if (pDocShell!=NULL && pDocShell->IsEnableSetModified()) - mbModelChangedWhileModifyEnabled = true; - - ::sd::View::Notify(rBroadcaster, rHint); -} - - - - -void SlideSorterView::UpdatePageUnderMouse (bool bAnimate) -{ - ::boost::shared_ptr<ScrollBar> pVScrollBar (mrSlideSorter.GetVerticalScrollBar()); - ::boost::shared_ptr<ScrollBar> pHScrollBar (mrSlideSorter.GetHorizontalScrollBar()); - if ((pVScrollBar && pVScrollBar->IsVisible() && pVScrollBar->IsTracking()) - || (pHScrollBar && pHScrollBar->IsVisible() && pHScrollBar->IsTracking())) - { - // One of the scroll bars is tracking mouse movement. Do not - // highlight the slide under the mouse in this case. - SetPageUnderMouse(SharedPageDescriptor(),false); - return; - } - - SharedSdWindow pWindow (mrSlideSorter.GetContentWindow()); - if (pWindow && pWindow->IsVisible() && ! pWindow->IsMouseCaptured()) - { - const Window::PointerState aPointerState (pWindow->GetPointerState()); - const Rectangle aWindowBox (pWindow->GetPosPixel(), pWindow->GetSizePixel()); - if (aWindowBox.IsInside(aPointerState.maPos)) - { - UpdatePageUnderMouse ( - aPointerState.maPos, - (aPointerState.mnState & MOUSE_LEFT)!=0, - bAnimate); - return; - } - } - - SetPageUnderMouse(SharedPageDescriptor(),false); -} - - - - -void SlideSorterView::UpdatePageUnderMouse ( - const Point& rMousePosition, - const bool bIsMouseButtonDown, - const bool bAnimate) -{ - UpdatePageUnderMouse( - mrSlideSorter.GetController().GetPageAt(rMousePosition), - rMousePosition, - bIsMouseButtonDown, - bAnimate); -} - - - - -void SlideSorterView::UpdatePageUnderMouse ( - const model::SharedPageDescriptor& rpDescriptor, - const Point& rMousePosition, - const bool bIsMouseButtonDown, - const bool bAnimate) -{ - // Update the page under the mouse. - SetPageUnderMouse(rpDescriptor, bAnimate); - - // Tell the button bar about the new mouse position. - SharedSdWindow pWindow (mrSlideSorter.GetContentWindow()); - const Point aMouseModelPosition (pWindow->PixelToLogic(rMousePosition)); - - ::boost::shared_ptr<ViewShell> pMainViewShell (mrSlideSorter.GetViewShellBase()->GetMainViewShell()); - if (pMainViewShell - && pMainViewShell->GetShellType()!=ViewShell::ST_DRAW) - { - const bool bIsMouseOverButtonBar (GetButtonBar().IsMouseOverBar()); - GetButtonBar().ProcessMouseMotionEvent(rpDescriptor, aMouseModelPosition, bIsMouseButtonDown); - // Set the help text of the slide when the mouse was moved from the - // button bar back over the preview. - if (rpDescriptor - && GetButtonBar().IsMouseOverBar() != bIsMouseOverButtonBar - && bIsMouseOverButtonBar) - { - mpToolTip->ShowDefaultHelpText(); - } - } -} - - - - -void SlideSorterView::SetPageUnderMouse ( - const model::SharedPageDescriptor& rpDescriptor, - const bool bAnimate) -{ - if (mpPageUnderMouse != rpDescriptor) - { - if (mpPageUnderMouse) - SetState(mpPageUnderMouse, PageDescriptor::ST_MouseOver, false, bAnimate); - - mpPageUnderMouse = rpDescriptor; - - if (mpPageUnderMouse) - SetState(mpPageUnderMouse, PageDescriptor::ST_MouseOver, true, bAnimate); - - // Change the quick help text to display the name of the page under - // the mouse. - mpToolTip->SetPage(rpDescriptor); - } -} - - - - -bool SlideSorterView::SetState ( - const model::SharedPageDescriptor& rpDescriptor, - const PageDescriptor::State eState, - const bool bStateValue, - const bool bAnimate) -{ - model::SharedPageDescriptor pDescriptor (rpDescriptor); - if ( ! pDescriptor) - return false; - - const bool bModified (pDescriptor->SetState(eState, bStateValue)); - if ( ! bModified) - return false; - - // When the page object is not visible (i.e. not on the screen then - // nothing has to be painted. - if (pDescriptor->HasState(PageDescriptor::ST_Visible)) - { - // For most states a change of that state leads to visible - // difference and we have to request a repaint. - if (eState != PageDescriptor::ST_WasSelected) - RequestRepaint(pDescriptor); - } - - ::boost::shared_ptr<ViewShell> pMainViewShell(mrSlideSorter.GetViewShellBase()->GetMainViewShell()); - if (pMainViewShell - && pMainViewShell->GetShellType()!=ViewShell::ST_DRAW) - { - // Fade in or out the buttons. - if (eState == PageDescriptor::ST_MouseOver) - { - if (bStateValue) - GetButtonBar().RequestFadeIn(rpDescriptor, bAnimate); - else - GetButtonBar().RequestFadeOut(rpDescriptor, bAnimate); - } - } - - return bModified; -} - - - - -::boost::shared_ptr<PageObjectPainter> SlideSorterView::GetPageObjectPainter (void) -{ - if ( ! mpPageObjectPainter) - mpPageObjectPainter.reset(new PageObjectPainter(mrSlideSorter)); - return mpPageObjectPainter; -} - - - - -::boost::shared_ptr<LayeredDevice> SlideSorterView::GetLayeredDevice (void) const -{ - return mpLayeredDevice; -} - - - - -//===== SlideSorterView::DrawLock ============================================= - -SlideSorterView::DrawLock::DrawLock ( - view::SlideSorterView& rView, - const SharedSdWindow& rpWindow) - : mrView(rView), - mpWindow(rpWindow) -{ - if (mrView.mnLockRedrawSmph == 0) - mrView.maRedrawRegion.SetEmpty(); - ++mrView.mnLockRedrawSmph; -} - - - - -SlideSorterView::DrawLock::DrawLock (SlideSorter& rSlideSorter) - : mrView(rSlideSorter.GetView()), - mpWindow(rSlideSorter.GetContentWindow()) -{ - if (mrView.mnLockRedrawSmph == 0) - mrView.maRedrawRegion.SetEmpty(); - ++mrView.mnLockRedrawSmph; -} - - - - -SlideSorterView::DrawLock::~DrawLock (void) -{ - OSL_ASSERT(mrView.mnLockRedrawSmph>0); - --mrView.mnLockRedrawSmph; - if (mrView.mnLockRedrawSmph == 0) - if (mpWindow) - { - mpWindow->Invalidate(mrView.maRedrawRegion); - mpWindow->Update(); - } -} - - - - -void SlideSorterView::DrawLock::Dispose (void) -{ - mpWindow.reset(); -} - - -} } } // end of namespace ::sd::slidesorter::view - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |