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

#include <vcl/virdev.hxx>
#include <vcl/image.hxx>
#include <svx/frmsel.hxx>
#include <svx/framelinkarray.hxx>
#include <editeng/borderline.hxx>

namespace svx {

namespace a11y { class AccFrameSelector; }

// ============================================================================

class FrameBorder
{
public:
    explicit            FrameBorder( FrameBorderType eType );

    inline FrameBorderType GetType() const { return meType; }

    inline bool         IsEnabled() const { return mbEnabled; }
    void                Enable( FrameSelFlags nFlags );

    inline FrameBorderState GetState() const { return meState; }
    void                SetState( FrameBorderState eState );

    inline bool         IsSelected() const { return mbSelected; }
    inline void         Select( bool bSelect ) { mbSelected = bSelect; }

    const SvxBorderLine& GetCoreStyle() const { return maCoreStyle; }
    void                SetCoreStyle( const SvxBorderLine* pStyle );

    inline void         SetUIColor( const Color& rColor ) {maUIStyle.SetColor( rColor ); }
    inline const frame::Style& GetUIStyle() const { return maUIStyle; }

    inline void         ClearFocusArea() { maFocusArea.Clear(); }
    void                AddFocusPolygon( const Polygon& rFocus );
    void                MergeFocusToPolyPolygon( PolyPolygon& rPPoly ) const;

    inline void         ClearClickArea() { maClickArea.Clear(); }
    void                AddClickRect( const Rectangle& rRect );
    bool                ContainsClickPoint( const Point& rPos ) const;
    void                MergeClickAreaToPolyPolygon( PolyPolygon& rPPoly ) const;
    Rectangle           GetClickBoundRect() const;

    void                SetKeyboardNeighbors(
                            FrameBorderType eLeft, FrameBorderType eRight,
                            FrameBorderType eTop, FrameBorderType eBottom );
    FrameBorderType     GetKeyboardNeighbor( sal_uInt16 nKeyCode ) const;

private:
    const FrameBorderType meType;       /// Frame border type (position in control).
    FrameBorderState    meState;        /// Frame border state (on/off/don't care).
    SvxBorderLine       maCoreStyle;    /// Core style from application.
    frame::Style        maUIStyle;      /// Internal style to draw lines.
    FrameBorderType     meKeyLeft;      /// Left neighbor for keyboard control.
    FrameBorderType     meKeyRight;     /// Right neighbor for keyboard control.
    FrameBorderType     meKeyTop;       /// Upper neighbor for keyboard control.
    FrameBorderType     meKeyBottom;    /// Lower neighbor for keyboard control.
    PolyPolygon         maFocusArea;    /// Focus drawing areas.
    PolyPolygon         maClickArea;    /// Mouse click areas.
    bool                mbEnabled;      /// true = Border enabled in control.
    bool                mbSelected;     /// true = Border selected in control.
};

// ============================================================================

typedef std::vector< FrameBorder* >     FrameBorderPtrVec;

struct FrameSelectorImpl : public Resource
{
    typedef ::com::sun::star::uno::Reference<
        ::com::sun::star::accessibility::XAccessible >  XAccessibleRef;
    typedef std::vector< a11y::AccFrameSelector* >      AccessibleImplVec;
    typedef std::vector< XAccessibleRef >               XAccessibleRefVec;

    FrameSelector&      mrFrameSel;     /// The control itself.
    VirtualDevice       maVirDev;       /// For all buffered drawing operations.
    ImageList           maILArrows;     /// Arrows in current system colors.
    Color               maBackCol;      /// Background color.
    Color               maArrowCol;     /// Selection arrow color.
    Color               maMarkCol;      /// Selection marker color.
    Color               maHCLineCol;    /// High contrast line color.
    Point               maVirDevPos;    /// Position of virtual device in the control.
    Point               maMousePos;     /// Last mouse pointer position.

    FrameBorder         maLeft;         /// All data of left frame border.
    FrameBorder         maRight;        /// All data of right frame border.
    FrameBorder         maTop;          /// All data of top frame border.
    FrameBorder         maBottom;       /// All data of bottom frame border.
    FrameBorder         maHor;          /// All data of inner horizontal frame border.
    FrameBorder         maVer;          /// All data of inner vertical frame border.
    FrameBorder         maTLBR;         /// All data of top-left to bottom-right frame border.
    FrameBorder         maBLTR;         /// All data of bottom-left to top-right frame border.
    SvxBorderLine       maCurrStyle;    /// Current style and color for new borders.
    frame::Array        maArray;        /// Frame link array to draw an array of frame borders.

    FrameSelFlags       mnFlags;        /// Flags for enabled frame borders.
    FrameBorderPtrVec   maAllBorders;   /// Pointers to all frame borders.
    FrameBorderPtrVec   maEnabBorders;  /// Pointers to enables frame borders.
    Link                maSelectHdl;    /// Selection handler.

    long                mnCtrlSize;     /// Size of the control (always square).
    long                mnArrowSize;    /// Size of an arrow image.
    long                mnLine1;        /// Middle of left/top frame borders.
    long                mnLine2;        /// Middle of inner frame borders.
    long                mnLine3;        /// Middle of right/bottom frame borders.
    long                mnFocusOffs;    /// Offset from frame border middle to draw focus.

    bool                mbHor;          /// true = Inner horizontal frame border enabled.
    bool                mbVer;          /// true = Inner vertical frame border enabled.
    bool                mbTLBR;         /// true = Top-left to bottom-right frame border enabled.
    bool                mbBLTR;         /// true = Bottom-left to top-right frame border enabled.
    bool                mbFullRepaint;  /// Used for repainting (false = only copy virtual device).
    bool                mbAutoSelect;   /// true = Auto select a frame border, if focus reaches control.
    bool                mbClicked;      /// true = The control has been clicked at least one time.
    bool                mbHCMode;       /// true = High contrast mode.

    a11y::AccFrameSelector* mpAccess;   /// Pointer to accessibility object of the control.
    XAccessibleRef      mxAccess;       /// Reference to accessibility object of the control.
    AccessibleImplVec   maChildVec;     /// Pointers to accessibility objects for frame borders.
    XAccessibleRefVec   mxChildVec;     /// References to accessibility objects for frame borders.

    explicit            FrameSelectorImpl( FrameSelector& rFrameSel );
                        ~FrameSelectorImpl();

    // initialization ---------------------------------------------------------

    /** Initializes the control, enables/disables frame borders according to flags. */
    void                Initialize( FrameSelFlags nFlags );

    /** Fills all color members from current style settings. */
    void                InitColors();
    /** Creates the image list with selection arrows regarding current style settings. */
    void                InitArrowImageList();
    /** Initializes global coordinates. */
    void                InitGlobalGeometry();
    /** Initializes coordinates of all frame borders. */
    void                InitBorderGeometry();
    /** Initializes click areas of all enabled frame borders. */
    void                InitClickAreas();
    /** Draws the entire control into the internal virtual device. */
    void                InitVirtualDevice();

    // frame border access ----------------------------------------------------

    /** Returns the object representing the specified frame border. */
    const FrameBorder&  GetBorder( FrameBorderType eBorder ) const;
    /** Returns the object representing the specified frame border (write access). */
    FrameBorder&        GetBorderAccess( FrameBorderType eBorder );

    // drawing ----------------------------------------------------------------

    /** Draws the background of the entire control (the gray areas between borders). */
    void                DrawBackground();

    /** Draws selection arrows for the specified frame border. */
    void                DrawArrows( const FrameBorder& rBorder );
    /** Draws arrows in current selection state for all enabled frame borders. */
    void                DrawAllArrows();

    /** Returns the color that has to be used to draw a frame border. */
    Color               GetDrawLineColor( const Color& rColor ) const;
    /** Draws all frame borders. */
    void                DrawAllFrameBorders();

    /** Draws all contents of the control. */
    void                DrawVirtualDevice();
    /** Copies contents of the virtual device to the control. */
    void                CopyVirDevToControl();

    /** Draws tracking rectangles for all selected frame borders. */
    void                DrawAllTrackingRects();

    /** Converts a mouse position to the virtual device position. */
    Point               GetDevPosFromMousePos( const Point& rMousePos ) const;

    /** Invalidates the control.
        @param bFullRepaint  true = Full repaint; false = update selection only. */
    void                DoInvalidate( bool bFullRepaint );

    // frame border state and style -------------------------------------------

    /** Sets the state of the specified frame border. */
    void                SetBorderState( FrameBorder& rBorder, FrameBorderState eState );
    /** Sets the core style of the specified frame border, or hides the frame border, if pStyle is 0. */
    void                SetBorderCoreStyle( FrameBorder& rBorder, const SvxBorderLine* pStyle );
    /** Sets the color of the specified frame border. */
    void                SetBorderColor( FrameBorder& rBorder, const Color& rColor );

    /** Changes the state of a frame border after a control event (mouse/keyboard). */
    void                ToggleBorderState( FrameBorder& rBorder );

    // frame border selection -------------------------------------------------

    /** Selects a frame border and schedules redraw. */
    void                SelectBorder( FrameBorder& rBorder, bool bSelect );
    /** Grabs focus without auto-selection of a frame border, if no border selected. */
    void                SilentGrabFocus();

    /** Returns true, if all selected frame borders are equal (or if nothing is selected). */
    bool                SelectedBordersEqual() const;
};

// ============================================================================

/** Dummy predicate for frame border iterators to use all borders in a container. */
struct FrameBorderDummy_Pred
{
    inline bool operator()( const FrameBorder* ) const { return true; }
};

/** Predicate for frame border iterators to use only visible borders in a container. */
struct FrameBorderVisible_Pred
{
    inline bool operator()( const FrameBorder* pBorder ) const { return pBorder->GetState() == FRAMESTATE_SHOW; }
};

/** Predicate for frame border iterators to use only selected borders in a container. */
struct FrameBorderSelected_Pred
{
    inline bool operator()( const FrameBorder* pBorder ) const { return pBorder->IsSelected(); }
};

/** Template class for all types of frame border iterators. */
template< typename Cont, typename Iter, typename Pred >
class FrameBorderIterBase
{
public:
    typedef Cont                                        container_type;
    typedef Iter                                        iterator_type;
    typedef Pred                                        predicate_type;
    typedef typename Cont::value_type                   value_type;
    typedef FrameBorderIterBase< Cont, Iter, Pred >    this_type;

    explicit            FrameBorderIterBase( container_type& rCont );
    inline bool         Is() const { return maIt != maEnd; }
    this_type&          operator++();
    inline value_type   operator*() const { return *maIt; }

private:
    iterator_type       maIt;
    iterator_type       maEnd;
    predicate_type      maPred;
};

/** Iterator for constant svx::FrameBorder containers, iterates over all borders. */
typedef FrameBorderIterBase< const FrameBorderPtrVec, FrameBorderPtrVec::const_iterator, FrameBorderDummy_Pred >
    FrameBorderCIter;

/** Iterator for mutable svx::FrameBorder containers, iterates over all borders. */
typedef FrameBorderIterBase< FrameBorderPtrVec, FrameBorderPtrVec::iterator, FrameBorderDummy_Pred >
    FrameBorderIter;

/** Iterator for constant svx::FrameBorder containers, iterates over visible borders. */
typedef FrameBorderIterBase< const FrameBorderPtrVec, FrameBorderPtrVec::const_iterator, FrameBorderVisible_Pred >
    VisFrameBorderCIter;

/** Iterator for mutable svx::FrameBorder containers, iterates over visible borders. */
typedef FrameBorderIterBase< FrameBorderPtrVec, FrameBorderPtrVec::iterator, FrameBorderVisible_Pred >
    VisFrameBorderIter;

/** Iterator for constant svx::FrameBorder containers, iterates over selected borders. */
typedef FrameBorderIterBase< const FrameBorderPtrVec, FrameBorderPtrVec::const_iterator, FrameBorderSelected_Pred >
    SelFrameBorderCIter;

/** Iterator for mutable svx::FrameBorder containers, iterates over selected borders. */
typedef FrameBorderIterBase< FrameBorderPtrVec, FrameBorderPtrVec::iterator, FrameBorderSelected_Pred >
    SelFrameBorderIter;

// ============================================================================

} // namespace svx

#endif
