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

#include <sfx2/sidebar/ControllerItem.hxx>
#include <sfx2/sidebar/IContextChangeReceiver.hxx>
#include <vcl/fixed.hxx>
#include <boost/scoped_ptr.hpp>
#include <editeng/svxenum.hxx>

class ToolBox;
class MetricField;
class MetricBox;
class CheckBox;
namespace svx { namespace sidebar { class SidebarDialControl; }}

namespace sc { namespace sidebar {

class AlignmentPropertyPanel
:   public Control,
    public ::sfx2::sidebar::IContextChangeReceiver,
    public ::sfx2::sidebar::ControllerItem::ItemUpdateReceiverInterface
{
public:
    static AlignmentPropertyPanel* Create(
        Window* pParent,
        const cssu::Reference<css::frame::XFrame>& rxFrame,
        SfxBindings* pBindings);

    virtual void DataChanged(
        const DataChangedEvent& rEvent);

    virtual void HandleContextChange(
        const ::sfx2::sidebar::EnumContext aContext);

    virtual void NotifyItemUpdate(
        const sal_uInt16 nSId,
        const SfxItemState eState,
        const SfxPoolItem* pState,
        const bool bIsEnabled);

    SfxBindings* GetBindings();

    virtual void Resize (void);

private:
    //ui controls
	::boost::scoped_ptr<Window> 			    mpTBHorizontalBackground;
    ::boost::scoped_ptr< ToolBox >              mpTBHorizontal;
	::boost::scoped_ptr<Window> 			    mpTBVerticalBackground;
    ::boost::scoped_ptr< ToolBox >              mpTBVertical;
    ::boost::scoped_ptr< FixedText >            mpFTLeftIndent;
    ::boost::scoped_ptr< MetricField >          mpMFLeftIndent;
    ::boost::scoped_ptr< CheckBox >             mpCBXWrapText;
    ::boost::scoped_ptr< CheckBox >             mpCBXMergeCell;
    ::boost::scoped_ptr< FixedText >            mpFtRotate;
    ::boost::scoped_ptr< svx::sidebar::SidebarDialControl > mpCtrlDial;
    ::boost::scoped_ptr< MetricBox >            mpMtrAngle;
    ::boost::scoped_ptr< CheckBox >             mpCbStacked;

    ::sfx2::sidebar::ControllerItem             maAlignHorControl;
    ::sfx2::sidebar::ControllerItem             maAlignVerControl;
    ::sfx2::sidebar::ControllerItem             maLeftIndentControl;
    ::sfx2::sidebar::ControllerItem             maMergeCellControl;
    ::sfx2::sidebar::ControllerItem             maWrapTextControl;
    ::sfx2::sidebar::ControllerItem             maAngleControl;
    ::sfx2::sidebar::ControllerItem             maStackControl;

    Image                                       maIMGAlignLeft;
    Image                                       maIMGAlignCenter;
    Image                                       maIMGAlignRight;
    Image                                       maIMGAlignJust;
    Image                                       maIMGAlignTop;
    Image                                       maIMGAlignCenterV;
    Image                                       maIMGAlignBottom;

    SvxCellHorJustify                           meHorAlignState;
    SvxCellVerJustify                           meVerAlignState;

    /// bitfield
    bool                                        mbMultiDisable : 1;

    cssu::Reference<css::frame::XFrame>         mxFrame;
    ::sfx2::sidebar::EnumContext                maContext;
    SfxBindings*                                mpBindings;

    DECL_LINK( TbxHorAlignSelectHdl, ToolBox* );
    DECL_LINK( TbxVerAlignSelectHdl, ToolBox* );
    DECL_LINK( MFLeftIndentMdyHdl, void * );
    DECL_LINK( CBOXMergnCellClkHdl, void * );
    DECL_LINK( CBOXWrapTextClkHdl, void * );
    DECL_LINK( AngleModifiedHdl, void * );
    DECL_LINK( RotationHdl, void * );
    DECL_LINK( ClickStackHdl, void * );

    // constructor/destuctor
    AlignmentPropertyPanel(
        Window* pParent,
        const cssu::Reference<css::frame::XFrame>& rxFrame,
        SfxBindings* pBindings);
    virtual ~AlignmentPropertyPanel();

    void Initialize();
    void UpdateHorAlign();
    void UpdateVerAlign();
    void FormatDegrees(double& dTmp);
};

} } // end of namespace ::sc::sidebar

#endif
// eof
