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

#include <com/sun/star/frame/XFrame.hpp>
#include <com/sun/star/document/XUndoManager.hpp>

#include <svx/sidebar/Popup.hxx>

#include <sfx2/sidebar/ControllerItem.hxx>
#include <sfx2/sidebar/GridLayouter.hxx>

namespace svx { namespace sidebar {
    class PopupControl;
} }

#include <i18npool/paper.hxx>

#include <svx/pageitem.hxx>
#include <svx/rulritem.hxx>
#include <editeng/sizeitem.hxx>

#include <vcl/ctrl.hxx>
#include <vcl/fixed.hxx>
#include <vcl/button.hxx>
#include <vcl/toolbox.hxx>
#include <vcl/lstbox.hxx>
#include <vcl/field.hxx>
#include <svl/intitem.hxx>

#include <boost/scoped_ptr.hpp>


namespace css = ::com::sun::star;
namespace cssu = ::com::sun::star::uno;

namespace sw { namespace sidebar {

    class PagePropertyPanel 
        : public Control,
          public ::sfx2::sidebar::ControllerItem::ItemUpdateReceiverInterface
    {
    public:
        static PagePropertyPanel* Create(
            Window* pParent,
            const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame>& rxFrame,
            SfxBindings* pBindings );

        // interface of ::sfx2::sidebar::ControllerItem::ItemUpdateReceiverInterface
        virtual void NotifyItemUpdate(
            const sal_uInt16 nSId,
            const SfxItemState eState,
            const SfxPoolItem* pState,
            const bool bIsEnabled);

        SfxBindings* GetBindings() const
        {
            return mpBindings;
        }


        ::svx::sidebar::PopupControl* CreatePageOrientationControl( ::svx::sidebar::PopupContainer* pParent );
        void ExecuteOrientationChange( const sal_Bool bLandscape );
        void ClosePageOrientationPopup();

        ::svx::sidebar::PopupControl* CreatePageMarginControl( ::svx::sidebar::PopupContainer* pParent );
        void ExecuteMarginLRChange( 
            const long nPageLeftMargin,
            const long nPageRightMargin );
        void ExecuteMarginULChange(
            const long nPageTopMargin,
            const long nPageBottomMargin );
        void ExecutePageLayoutChange( const bool bMirrored );
        void ClosePageMarginPopup();

        ::svx::sidebar::PopupControl* CreatePageSizeControl( ::svx::sidebar::PopupContainer* pParent );
        void ExecuteSizeChange( const Paper ePaper );
        void ClosePageSizePopup();

        ::svx::sidebar::PopupControl* CreatePageColumnControl( ::svx::sidebar::PopupContainer* pParent );
        void ExecuteColumnChange( const sal_uInt16 nColumnType );
        void ClosePageColumnPopup();

        void StartUndo();
        void EndUndo();

        // Inherited from vcl Window.
        virtual void Resize (void);
                
    private:
        PagePropertyPanel(
            Window* pParent,
            const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame>& rxFrame,
            SfxBindings* pBindings );
        virtual ~PagePropertyPanel(void);

        SfxBindings* mpBindings;

        // toolboxes - on click open corresponding popup
        FixedText   maFtOrientation;
        ::boost::scoped_ptr<Window> mpToolBoxOrientationBackground;
        ::boost::scoped_ptr<ToolBox> mpToolBoxOrientation;
        FixedText				maFtMargin;
        ::boost::scoped_ptr<Window> mpToolBoxMarginBackground;
        ::boost::scoped_ptr<ToolBox> mpToolBoxMargin;
        FixedText				maFtSize;
        ::boost::scoped_ptr<Window> mpToolBoxSizeBackground;
        ::boost::scoped_ptr<ToolBox> mpToolBoxSize;
        FixedText				maFtColumn;
        ::boost::scoped_ptr<Window> mpToolBoxColumnBackground;
        ::boost::scoped_ptr<ToolBox> mpToolBoxColumn;

        Image*					maImgSize;
        Image*					maImgSize_L;
        Image					mImgPortrait;
        Image					mImgLandscape;
        Image					mImgNarrow;
        Image					mImgNormal;
        Image					mImgWide;
        Image					mImgMirrored;
        Image					mImgMarginCustom;
        Image					mImgNarrow_L;
        Image					mImgNormal_L;
        Image					mImgWide_L;
        Image					mImgMirrored_L;
        Image					mImgMarginCustom_L;
        Image					mImgA3;
        Image					mImgA4;
        Image					mImgA5;
        Image					mImgB4;
        Image					mImgB5;
        Image					mImgC5;
        Image					mImgLetter;
        Image					mImgLegal;
        Image					mImgSizeNone;
        Image					mImgA3_L;
        Image					mImgA4_L;
        Image					mImgA5_L;
        Image					mImgB4_L;
        Image					mImgB5_L;
        Image					mImgC5_L;
        Image					mImgLetter_L;
        Image					mImgLegal_L;
        Image					mImgSizeNone_L;
        Image					mImgColumn1;
        Image					mImgColumn2;
        Image					mImgColumn3;
        Image					mImgLeft;
        Image					mImgRight;
        Image					mImgColumnNone;
        Image					mImgColumn1_L;
        Image					mImgColumn2_L;
        Image					mImgColumn3_L;
        Image					mImgLeft_L;
        Image					mImgRight_L;
        Image					mImgColumnNone_L;

        // item keeping the following page style attributes:
        // - page orientation
        // - page usage - only left, only right, both, mirrored
        // item also hold the numbering type for the page style which should
        // be kept stable.
        ::boost::scoped_ptr<SvxPageItem> mpPageItem;

        // item keeping the page style's left and right margins
        ::boost::scoped_ptr<SvxLongLRSpaceItem> mpPageLRMarginItem;
        // item keeping the page style's top and bottom margins
        ::boost::scoped_ptr<SvxLongULSpaceItem> mpPageULMarginItem;

        // item keeping the page style's page size
        ::boost::scoped_ptr<SvxSizeItem> mpPageSizeItem;
        // Paper corresponding to the page style's page size
        Paper mePaper;

        // item keeping the page column type
        ::boost::scoped_ptr<SfxInt16Item> mpPageColumnTypeItem;

        FieldUnit 			meFUnit;
        SfxMapUnit			meUnit;

        // controller items
        ::sfx2::sidebar::ControllerItem m_aSwPagePgULControl;
        ::sfx2::sidebar::ControllerItem m_aSwPagePgLRControl;
        ::sfx2::sidebar::ControllerItem m_aSwPagePgSizeControl;
        ::sfx2::sidebar::ControllerItem m_aSwPagePgControl;
        ::sfx2::sidebar::ControllerItem m_aSwPageColControl;
        ::sfx2::sidebar::ControllerItem m_aSwPagePgMetricControl;
        
        // popups
        ::svx::sidebar::Popup maOrientationPopup;
        ::svx::sidebar::Popup maMarginPopup;
        ::svx::sidebar::Popup maSizePopup;
        ::svx::sidebar::Popup maColumnPopup;

        const cssu::Reference< css::document::XUndoManager > mxUndoManager;

        bool mbInvalidateSIDAttrPageOnSIDAttrPageSizeNotify;
        ::sfx2::sidebar::GridLayouter maLayouter;

        // handler for popup toolboxes to show the popups
        DECL_LINK(ClickOrientationHdl, ToolBox* );
        DECL_LINK(ClickMarginHdl, ToolBox* );
        DECL_LINK(ClickSizeHdl, ToolBox* );
        DECL_LINK(ClickColumnHdl, ToolBox* );

        void Initialize();

        void MetricState( SfxItemState eState, const SfxPoolItem* pState );

        // helper to adjust popup toolbox' images
        void ChangeMarginImage();
        void ChangeSizeImage();
        void ChangeColumnImage( const sal_uInt16 nColumnType );

    };

} } // end of namespace ::sw::sidebar

#endif