/************************************************************** * * 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 SD_SLIDESORTER_SLIDE_SORTER_VIEW_HXX #define SD_SLIDESORTER_SLIDE_SORTER_VIEW_HXX #include "SlideSorter.hxx" #include "model/SlsPageDescriptor.hxx" #include "model/SlsSharedPageDescriptor.hxx" #include "view/SlsLayouter.hxx" #include "view/SlsILayerPainter.hxx" #include "View.hxx" #include #include "pres.hxx" #include #include #include #include #include #include #include #include class Point; namespace sd { namespace slidesorter { namespace controller { class SlideSorterController; class Properties; } } } namespace sd { namespace slidesorter { namespace cache { class PageCache; } } } namespace sd { namespace slidesorter { namespace model { class SlideSorterModel; } } } namespace sd { namespace slidesorter { namespace view { class ButtonBar; class LayeredDevice; class Layouter; class PageObjectPainter; class SelectionPainter; class ToolTip; class SlideSorterView : public sd::View, public ::boost::noncopyable { public: TYPEINFO (); /** Create a new view for the slide sorter. @param rViewShell This reference is simply passed to the base class and not used by this class. */ SlideSorterView (SlideSorter& rSlideSorter); void Init (void); virtual ~SlideSorterView (void); void Dispose (void); /** Set the general way of layouting the page objects. Note that this method does not trigger any repaints or layouts. */ bool SetOrientation (const Layouter::Orientation eOrientation); Layouter::Orientation GetOrientation (void) const; void RequestRepaint (void); void RequestRepaint (const model::SharedPageDescriptor& rDescriptor); void RequestRepaint (const Rectangle& rRepaintBox); void RequestRepaint (const Region& rRepaintRegion); Rectangle GetModelArea (void); /** Return the index of the page that is rendered at the given position. @param rPosition The position is expected to be in pixel coordinates. @return The returned index is -1 when there is no page object at the given position. */ sal_Int32 GetPageIndexAtPoint (const Point& rPosition) const; view::Layouter& GetLayouter (void); virtual void ModelHasChanged (void); void LocalModelHasChanged(void); /** This method is typically called before a model change takes place. All references to model data are released. PostModelChange() has to be called to complete the handling of the model change. When the calls to Pre- and PostModelChange() are very close to each other you may call HandleModelChange() instead. */ void PreModelChange (void); /** This method is typically called after a model change took place. References to model data are re-allocated. Call this method only after PreModelChange() has been called. */ void PostModelChange (void); /** This method is a convenience function that simply calls PreModelChange() and then PostModelChange(). */ void HandleModelChange (void); void HandleDrawModeChange (void); virtual void Resize (void); virtual void CompleteRedraw ( OutputDevice* pDevice, const Region& rPaintArea, sdr::contact::ViewObjectContactRedirector* pRedirector = NULL); void Paint (OutputDevice& rDevice, const Rectangle& rRepaintArea); virtual void ConfigurationChanged ( utl::ConfigurationBroadcaster* pBroadcaster, sal_uInt32 nHint); void HandleDataChangeEvent (void); void Layout (void); /** This tells the view that it has to re-determine the visibility of the page objects before painting them the next time. */ void InvalidatePageObjectVisibilities (void); /** Return the window to which this view renders its output. */ // ::boost::shared_ptr GetWindow (void) const; ::boost::shared_ptr GetPreviewCache (void); /** Set the bounding box of the insertion marker in model coordinates. It will be painted as a dark rectangle that fills the given box. */ void SetInsertionMarker (const Rectangle& rBBox); /** Specify whether the insertion marker will be painted or not. */ void SetInsertionMarkerVisibility (bool bVisible); /** Set the size and position of the selection rectangle. It will be painted as a dashed rectangle. */ void SetSelectionRectangle (const Rectangle& rBox); /** Specify whether the selection rectangle will be painted or not. */ void SetSelectionRectangleVisibility (bool bVisible); /** Return the range of currently visible page objects including the first and last one in that range. @return The returned pair of page object indices is empty when the second index is lower than the first. */ Pair GetVisiblePageRange (void); /** Add a shape to the page. Typically used from inside PostModelChange(). */ // void AddSdrObject (SdrObject& rObject); /** Add a listener that is called when the set of visible slides. @param rListener When this method is called multiple times for the same listener the second and all following calls are ignored. Each listener is added only once. */ void AddVisibilityChangeListener (const Link& rListener); /** Remove a listener that is called when the set of visible slides changes. @param rListener It is save to pass a listener that was not added or has been removed previously. Such calls are ignored. */ void RemoveVisibilityChangeListener (const Link& rListener); /** The page under the mouse is not highlighted in some contexts. Call this method on context changes. */ void UpdatePageUnderMouse (bool bAnimate); void UpdatePageUnderMouse ( const Point& rMousePosition, const bool bIsMouseButtonDown, const bool bAnimate = true); void UpdatePageUnderMouse ( const model::SharedPageDescriptor& rpDescriptor, const Point& rMousePosition, const bool bIsMouseButtonDown, const bool bAnimate = true); void SetPageUnderMouse ( const model::SharedPageDescriptor& rpDescriptor, const bool bAnimate = true); bool SetState ( const model::SharedPageDescriptor& rpDescriptor, const model::PageDescriptor::State eState, const bool bStateValue, const bool bAnimate = true); void UpdateOrientation (void); ::boost::shared_ptr GetPageObjectPainter (void); ::boost::shared_ptr GetLayeredDevice (void) const; class DrawLock { public: DrawLock (view::SlideSorterView& rView, const SharedSdWindow& rpWindow); DrawLock (SlideSorter& rSlideSorter); ~DrawLock (void); /** When the DrawLock is disposed then it will not request a repaint on destruction. */ void Dispose (void); private: view::SlideSorterView& mrView; SharedSdWindow mpWindow; }; ButtonBar& GetButtonBar (void) const; ToolTip& GetToolTip (void) const; virtual void DragFinished (sal_Int8 nDropAction); protected: virtual void Notify (SfxBroadcaster& rBroadcaster, const SfxHint& rHint); private: SlideSorter& mrSlideSorter; model::SlideSorterModel& mrModel; bool mbIsDisposed; ::std::auto_ptr mpLayouter; bool mbPageObjectVisibilitiesValid; ::boost::shared_ptr mpPreviewCache; ::boost::shared_ptr mpLayeredDevice; Range maVisiblePageRange; bool mbModelChangedWhileModifyEnabled; Size maPreviewSize; bool mbPreciousFlagUpdatePending; Layouter::Orientation meOrientation; ::boost::shared_ptr mpProperties; model::SharedPageDescriptor mpPageUnderMouse; sal_Int32 mnButtonUnderMouse; ::boost::shared_ptr mpPageObjectPainter; ::boost::shared_ptr mpSelectionPainter; Region maRedrawRegion; SharedILayerPainter mpBackgroundPainter; ::boost::scoped_ptr mpButtonBar; ::boost::scoped_ptr mpToolTip; bool mbIsRearrangePending; ::std::vector maVisibilityChangeListeners; /** Determine the visibility of all page objects. */ void DeterminePageObjectVisibilities (void); void UpdatePreciousFlags (void); void RequestRearrange (void); void Rearrange (void); }; } } } // end of namespace ::sd::slidesorter::view #endif