/**************************************************************
 *
 * 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_SLIDE_VIEW_SHELL_HXX
#define SD_SLIDE_VIEW_SHELL_HXX


#include "ViewShell.hxx"
#include "SlideView.hxx"
#include <sfx2/viewfac.hxx>
#include <sfx2/viewsh.hxx>



class SdPage;



namespace sd {

class SdUnoSlideView;
class Window;

/** Show an overview over the slides in an Impress document and allow
    some high level editing i.e. editing of the order in a show, not
    the contents of the slides.
*/
class SlideViewShell
    : public ViewShell
{
public:

    TYPEINFO();

    SFX_DECL_VIEWFACTORY(SlideViewShell);
    SFX_DECL_INTERFACE(SD_IF_SDSLIDEVIEWSHELL)

    /** Create a new view shell for the slide view.
        @param rViewShellBase
            The new object will be stacked on this view shell base.
        @param pFrameView
            The frame view that makes it possible to pass information from
            one view shell to the next.
    */
    SlideViewShell(SfxViewFrame* pFrame,
        ViewShellBase& rViewShellBase,
        ::Window* pParentWindow,
        FrameView* pFrameView = NULL);

    SlideViewShell(SfxViewFrame *pFrame,
        ::Window* pParentWindow,
        const SlideViewShell& rShell);

    virtual ~SlideViewShell (void);

	virtual void    Paint(const Rectangle& rRect, ::sd::Window* pWin);

    /** Arrange and resize the GUI elements like rulers, sliders, and
        buttons as well as the actual document view according to the size of
        the enclosing window and current sizes of buttons, rulers, and
        sliders.
    */
    virtual void ArrangeGUIElements (void);
	virtual void    AddWindow(::sd::Window* pWin) { pSlideView->AddWindowToPaintView((OutputDevice*) pWin); }
	virtual void    RemoveWindow(::sd::Window* pWin) { pSlideView->DeleteWindowFromPaintView((OutputDevice*) pWin); }

	virtual sal_Bool    KeyInput(const KeyEvent& rKEvt, ::sd::Window* pWin);
	virtual void    MouseMove(const MouseEvent& rMEvt, ::sd::Window* pWin);
	virtual void    MouseButtonUp(const MouseEvent& rMEvt, ::sd::Window* pWin);
	virtual void    MouseButtonDown(const MouseEvent& rMEvt, ::sd::Window* pWin);
	virtual void    Command(const CommandEvent& rCEvt, ::sd::Window* pWin);

	virtual SdPage*	GetActualPage();

	/** @returns
			current or selected page or 0.
	*/
	virtual SdPage* getCurrentPage() const;

	void            ExecCtrl(SfxRequest &rReq);
	void            GetCtrlState(SfxItemSet &rSet);
	void            GetMenuState(SfxItemSet &rSet);
	void            GetAttrState(SfxItemSet &rSet);

    void            SetPagesPerRow( sal_uInt16 nPagesPerRow );

	void            ExecStatusBar(SfxRequest& rReq);
	void            GetStatusBarState(SfxItemSet& rSet);

	void            FuTemporary(SfxRequest &rReq);
	void            FuPermanent(SfxRequest &rReq);
	void            FuSupport(SfxRequest &rReq);

	virtual void    ReadFrameViewData(FrameView* pView);
	virtual void    WriteFrameViewData();

	virtual void	SetZoom(long nZoom);
	virtual void	SetZoomRect(const Rectangle& rZoomRect);

	virtual sal_Bool    HasSelection( sal_Bool bText = sal_True ) const;

    /** Draw the rectangle around the specified slide that indicates whether
        the slide is selected or not.  When not selected the rectangle is
        painted in the background color (WindowColor from the style settings)
        and is therefore not visible.  A selected slide is painted with the
        WindowTextColor from the style settings.  Painting takes place in
        all associated windows.  The line- and fill color of the windows are
        restored to their original values after the rectangle is painted.
        @param nPage
            When the page number is invalid then the call is ignored.
    */
	void			DrawSelectionRect( sal_uInt16 nPage );
    void			DrawFocusRect( sal_uInt16 nPage );

    virtual void    WriteUserDataSequence ( ::com::sun::star::uno::Sequence < ::com::sun::star::beans::PropertyValue >&, sal_Bool bBrowse = sal_False );
    virtual void    ReadUserDataSequence ( const ::com::sun::star::uno::Sequence < ::com::sun::star::beans::PropertyValue >&, sal_Bool bBrowse = sal_False );

	virtual void    VisAreaChanged(const Rectangle& rRect);

    virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible> CreateAccessibleDocumentView( ::sd::Window* pWindow );

    void            SelectionHasChanged();
    //Notify the SELECTION_CHANGE, SELECTION_ADD, SELECTION_REMOVE events
    void            SelectionHasChanged(sal_uInt16 nPage, sal_Bool bSelect);
    void            PageLayoutHasChanged();
    void            FocusHasChanged( sal_uInt16 nOldFocusPage, sal_uInt16 nNewFocusPage );
    void            PageVisibilityHasChanged( sal_uInt16 nPage, sal_Bool bVisible );

    /** On activation the preview is turned off.
    */
    virtual void Activate (sal_Bool IsMDIActivate);

	void SwitchViewFireFocus(::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > xAcc );
protected:
	virtual Size    GetOptimalSizePixel() const;
	virtual long    VirtHScrollHdl(ScrollBar* pHScroll);
	virtual long    VirtVScrollHdl(ScrollBar* pVHScroll);


private:
	SlideView* pSlideView;
	Point		    aDisplayPos;
	Size		    aDisplaySize;
    sal_uInt16          nCurFocusPage;
	bool		    bSetInitialZoomFactor;
	bool		    bInitializeWinPos;

	void            Construct(SdDrawDocument* pDoc);
    void            ImplDrawFocusRect( sal_uInt16 nPage, sal_Bool bVisible );
};

} // end of namespace sd

#endif
