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

#include <swrect.hxx>
#include <fmtfld.hxx>
#include <redline.hxx>
#include <vector>
#include <vcl/window.hxx>
#include <SidebarWindowsTypes.hxx>
#include <svl/brdcst.hxx>

class SwTxtFld;
class SwRootFrm;
class SwPostIt;
class String;
class SwPostItMgr;
class SwEditWin;
namespace sw { namespace sidebarwindows {
    class SwSidebarWin;
} }

struct SwPosition;

typedef sal_Int64 SwPostItBits;

struct SwLayoutInfo
{
    const SwFrm* mpAnchorFrm;
    SwRect mPosition;

    // optional start of the annotation
    sal_uLong mnStartNodeIdx;
    xub_StrLen mnStartContent;

    SwRect mPageFrame;
    SwRect mPagePrtArea;
    unsigned long mnPageNumber;

    sw::sidebarwindows::SidebarPosition meSidebarPosition;

    sal_uInt16 mRedlineAuthor;

    SwLayoutInfo()
        : mpAnchorFrm(0)
        , mPosition()
        , mnStartNodeIdx( 0 )
        , mnStartContent( STRING_NOTFOUND )
        , mPageFrame()
        , mPagePrtArea()
        , mnPageNumber(1)
        , meSidebarPosition(sw::sidebarwindows::SIDEBAR_NONE)
        , mRedlineAuthor(0)
    {}
};

namespace SwPostItHelper
{
    enum SwLayoutStatus
    {
        INVISIBLE, VISIBLE, INSERTED, DELETED, NONE, HIDDEN
    };

    SwLayoutStatus getLayoutInfos(
        SwLayoutInfo& o_rInfo,
        const SwPosition& rAnchorPos,
        const SwPosition* pAnnotationStartPos = NULL );

    long getLayoutHeight( const SwRootFrm* pRoot );
    void setSidebarChanged( SwRootFrm* pRoot, bool bBrowseMode );
    unsigned long getPageInfo( SwRect& rPageFrm, const SwRootFrm* , const Point& );
}

class SwSidebarItem
{
public:
    sw::sidebarwindows::SwSidebarWin* pPostIt;
    bool bShow;
    bool bFocus;

    SwPostItHelper::SwLayoutStatus mLayoutStatus;
    SwLayoutInfo maLayoutInfo;

    SwSidebarItem( const bool aShow,
                   const bool aFocus)
        : pPostIt(0)
        , bShow(aShow)
        , bFocus(aFocus)
        , mLayoutStatus( SwPostItHelper::INVISIBLE )
        , maLayoutInfo()
    {
    }

    virtual ~SwSidebarItem()
    {
    }

    virtual SwPosition GetAnchorPosition() const = 0;
    virtual bool UseElement() = 0;
    virtual const SwFmtFld& GetFmtFld() const = 0;
    virtual const SfxBroadcaster* GetBroadCaster() const = 0;
    virtual sw::sidebarwindows::SwSidebarWin* GetSidebarWindow( SwEditWin& rEditWin,
                                                                WinBits nBits,
                                                                SwPostItMgr& aMgr,
                                                                SwPostItBits aBits) = 0;
};
/*
class SwRedCommentItem: public SwSidebarItem
{
private:
	SwRedline* pRedline;
public:

	SwRedCommentItem( SwRedline* pRed, bool aShow, bool aFocus)
        : SwSidebarItem(aShow,aFocus),
		pRedline(pRed) {}
	virtual ~SwRedCommentItem() {}
    virtual SwPosition GetAnchorPosition() const;
	virtual bool UseElement();
    virtual SwFmtFld* GetFmtFld() const {return 0; }
	virtual SfxBroadcaster* GetBroadCaster() const { return dynamic_cast<SfxBroadcaster *> (pRedline); }
    virtual sw::sidebarwindows::SwSidebarWin* GetSidebarWindow( SwEditWin& rEditWin,
                                                                WinBits nBits,
                                                                SwPostItMgr& aMgr,
                                                                SwPostItBits aBits);
};
*/

class SwAnnotationItem: public SwSidebarItem
{
public:
    SwAnnotationItem(
        SwFmtFld& rFmtFld,
        const bool bShow,
        const bool bFocus)
        : SwSidebarItem( bShow, bFocus )
        , mrFmtFld( rFmtFld )
    {
    }

    virtual ~SwAnnotationItem()
    {
    }

    virtual SwPosition GetAnchorPosition() const;
    virtual bool UseElement();
    virtual const SwFmtFld& GetFmtFld() const
    {
        return mrFmtFld;
    }
    virtual const SfxBroadcaster* GetBroadCaster() const
    {
        return dynamic_cast<const SfxBroadcaster *> (&mrFmtFld);
    }
    virtual sw::sidebarwindows::SwSidebarWin* GetSidebarWindow(
        SwEditWin& rEditWin,
        WinBits nBits,
        SwPostItMgr& aMgr,
        SwPostItBits aBits );

private:
    SwFmtFld& mrFmtFld;
};

#endif // _POSTITHELPER_HXX
