/**************************************************************
 * 
 * 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.
 * 
 *************************************************************/



// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_sw.hxx"

#include "PostItMgr.hxx"
#include <postithelper.hxx>

#include <SidebarWin.hxx>
#include <AnnotationWin.hxx>
#include <frmsidebarwincontainer.hxx>
#include <accmap.hxx>

#include <SidebarWindowsConsts.hxx>
#include <AnchorOverlayObject.hxx>
#include <ShadowOverlayObject.hxx>

#include <vcl/svapp.hxx>
#include <vcl/scrbar.hxx>
#include <vcl/outdev.hxx>

#include <viewopt.hxx>

#include <view.hxx>
#include <docsh.hxx>
#include <wrtsh.hxx>
#include <doc.hxx>
#include <fldbas.hxx>
#include <fmtfld.hxx>
#include <docufld.hxx>
#include <edtwin.hxx>
#include <txtfld.hxx>
#include <txtannotationfld.hxx>
#include <ndtxt.hxx>
#include <redline.hxx>
#include <docary.hxx>
#include <SwRewriter.hxx>
#include <tools/color.hxx>

#include <swmodule.hxx>
#include <annotation.hrc>
#include "cmdid.h"

#include <sfx2/request.hxx>
#include <sfx2/event.hxx>
#include <svl/srchitem.hxx>


#include <svl/languageoptions.hxx>
#include <svtools/langtab.hxx>
#include <svl/smplhint.hxx>

#include <svx/svdview.hxx>
#include <editeng/eeitem.hxx>
#include <editeng/langitem.hxx>
#include <editeng/outliner.hxx>

#include <i18npool/mslangid.hxx>
#include <i18npool/lang.h>

#include "swevent.hxx"
#include "switerator.hxx"

// distance between Anchor Y and initial note position
#define POSTIT_INITIAL_ANCHOR_DISTANCE      20
//distance between two postits
#define POSTIT_SPACE_BETWEEN				8
#define POSTIT_MINIMUMSIZE_WITH_META		60
#define POSTIT_SCROLL_SIDEBAR_HEIGHT		20

// if we layout more often we stop, this should never happen
#define MAX_LOOP_COUNT						50

using namespace sw::sidebarwindows;


bool comp_pos(const SwSidebarItem* a, const SwSidebarItem* b)
{
    // sort by anchor position
    return a->GetAnchorPosition() < b->GetAnchorPosition();
}

SwPostItMgr::SwPostItMgr(SwView* pView)
	: mpView(pView)
	, mpWrtShell(mpView->GetDocShell()->GetWrtShell())
	, mpEditWin(&mpView->GetEditWin())
	, mnEventId(0)
	, mbWaitingForCalcRects(false)
	, mpActivePostIt(0)
	, mbLayout(false)
	, mbLayoutHeight(0)
	, mbLayouting(false)
	, mbReadOnly(mpView->GetDocShell()->IsReadOnly())
	, mbDeleteNote(true)
	, mpAnswer(0)
    , mbIsShowAnchor( false )
    , mpFrmSidebarWinContainer( 0 )
{
	if(!mpView->GetDrawView() )
		mpView->GetWrtShell().MakeDrawView();

	SwNoteProps aProps;
    mbIsShowAnchor = aProps.IsShowAnchor();

	//make sure we get the colour yellow always, even if not the first one of comments or redlining
	SW_MOD()->GetRedlineAuthor();

	// collect all PostIts and redline comments that exist after loading the document
	// don't check for existence for any of them, don't focus them
	AddPostIts(false,false);
    /*  this code can be used once we want redline comments in the Sidebar
	AddRedlineComments(false,false);
	*/
	// we want to receive stuff like SFX_HINT_DOCCHANGED
	StartListening(*mpView->GetDocShell());
	if (!mvPostItFlds.empty())
	{
		mbWaitingForCalcRects = true;
		mnEventId = Application::PostUserEvent( LINK( this, SwPostItMgr, CalcHdl), 0 );
	}
}

SwPostItMgr::~SwPostItMgr()
{
	if ( mnEventId )
		Application::RemoveUserEvent( mnEventId );
    // forget about all our Sidebar windows
    RemoveSidebarWin();
	EndListening( *mpView->GetDocShell() );

	for(std::vector<SwPostItPageItem*>::iterator i = mPages.begin(); i!= mPages.end() ; i++)
		delete (*i);
	mPages.clear();

    delete mpFrmSidebarWinContainer;
    mpFrmSidebarWinContainer = 0;
}

void SwPostItMgr::CheckForRemovedPostIts()
{
	bool bRemoved = false;
    for(std::list<SwSidebarItem*>::iterator i = mvPostItFlds.begin(); i!= mvPostItFlds.end(); )
	{
        std::list<SwSidebarItem*>::iterator it = i++;
		if ( !(*it)->UseElement() )
		{
            SwSidebarItem* p = (*it);
			mvPostItFlds.remove(*it);
            if (GetActiveSidebarWin() == p->pPostIt)
                SetActiveSidebarWin(0);
			if (p->pPostIt)
				delete p->pPostIt;
			delete p;
			bRemoved = true;
		}
	}

	if ( bRemoved )
	{
		// make sure that no deleted items remain in page lists
		// todo: only remove deleted ones?!
		if ( mvPostItFlds.empty() )
		{
			PreparePageContainer();
			PrepareView();
		}
		else
			// if postits are their make sure that page lists are not empty
			// otherwise sudden paints can cause pain (in BorderOverPageBorder)
			CalcRects();
	}
}

void SwPostItMgr::InsertItem(SfxBroadcaster* pItem, bool bCheckExistance, bool bFocus)
{
	if (bCheckExistance)
	{
        for(std::list<SwSidebarItem*>::iterator i = mvPostItFlds.begin(); i!= mvPostItFlds.end() ; i++)
		{
			if ( (*i)->GetBroadCaster() == pItem )
				return;
		}
	}
	mbLayout = bFocus;
	if (pItem->ISA(SwFmtFld))
        mvPostItFlds.push_back(new SwAnnotationItem(static_cast<SwFmtFld&>(*pItem), true, bFocus) );
	/*
	else
	if (pItem->ISA(SwRedline))
		mvPostItFlds.push_back(new SwRedCommentItem( static_cast<SwRedline*>(pItem), true, bFocus)) ;
	*/
	DBG_ASSERT(pItem->ISA(SwFmtFld) /*|| pItem->ISA(SwRedline)*/,"Mgr::InsertItem: seems like new stuff was added");
	StartListening(*pItem);
}

void SwPostItMgr::RemoveItem( SfxBroadcaster* pBroadcast )
{
	EndListening(*pBroadcast);
    for(std::list<SwSidebarItem*>::iterator i = mvPostItFlds.begin(); i!= mvPostItFlds.end() ; i++)
	{
		if ( (*i)->GetBroadCaster() == pBroadcast )
		{
            SwSidebarItem* p = (*i);
            if (GetActiveSidebarWin() == p->pPostIt)
                SetActiveSidebarWin(0);
			mvPostItFlds.remove(*i);
			delete p->pPostIt;
			delete p;
			break;
		}
	}
	mbLayout = true;
	PrepareView();
}

void SwPostItMgr::Notify( SfxBroadcaster& rBC, const SfxHint& rHint )
{
	if ( rHint.IsA(TYPE(SfxEventHint) ) )
	{
		sal_uInt32 nId = ((SfxEventHint&)rHint).GetEventId();
		if ( nId == SW_EVENT_LAYOUT_FINISHED )
		{
			if ( !mbWaitingForCalcRects && !mvPostItFlds.empty())
			{
				mbWaitingForCalcRects = true;
				mnEventId = Application::PostUserEvent( LINK( this, SwPostItMgr, CalcHdl), 0 );
			}
		}
	}
	else if ( rHint.IsA(TYPE(SfxSimpleHint)	) )
	{
		sal_uInt32 nId = ((SfxSimpleHint&)rHint).GetId();
		switch ( nId )
		{
			case SFX_HINT_MODECHANGED:
			{
				if ( mbReadOnly != !!(mpView->GetDocShell()->IsReadOnly()) )
				{
					mbReadOnly = !mbReadOnly;
					SetReadOnlyState();
					mbLayout = true;
				}
				break;
			}
			case SFX_HINT_DOCCHANGED:
			{
				if ( mpView->GetDocShell() == &rBC )
				{
					if ( !mbWaitingForCalcRects && !mvPostItFlds.empty())
					{
						mbWaitingForCalcRects = true;
						mnEventId = Application::PostUserEvent( LINK( this, SwPostItMgr, CalcHdl), 0 );
					}
				}
				break;
			}
			case SFX_HINT_USER04:
			{
				// if we are in a SplitNode/Cut operation, do not delete note and then add again, as this will flicker
				mbDeleteNote = !mbDeleteNote;
				break;
			}
			case SFX_HINT_DYING:
			{
				if ( mpView->GetDocShell() != &rBC )
				{
					// field to be removed is the broadcaster
					DBG_ERROR("Notification for removed SwFmtFld was not sent!");
					RemoveItem(&rBC);
				}
				break;
			}
		}
	}
	/*
	else if ( rHint.IsA(TYPE(SwRedlineHint) ) )
	{
		const SwRedlineHint rRedlineHint = static_cast<const SwRedlineHint&>(rHint);
	   	SwRedline* pRedline = const_cast<SwRedline*>(rRedlineHint.GetRedline());
		switch ( rRedlineHint.Which() )
		{
			case SWREDLINE_INSERTED :
			{
				bool bEmpty = !HasNotes();
				InsertItem( pRedline, true, false );
				if (bEmpty && !mvPostItFlds.empty())
					PrepareView(true);
				break;
			}
			case SWREDLINE_REMOVED:
			{
				RemoveItem(pRedline);
				break;
			}
			case SWREDLINE_FOCUS:
			{
                                if (rRedlineHint.GetView()== mpView)
					Focus(rBC);
				break;
			}
		}
	}
	*/
	else if ( rHint.IsA(TYPE(SwFmtFldHint) ) )
	{
		const SwFmtFldHint& rFmtHint = static_cast<const SwFmtFldHint&>(rHint);
		SwFmtFld* pFld = const_cast <SwFmtFld*>( rFmtHint.GetField() );
		switch ( rFmtHint.Which() )
		{
			case SWFMTFLD_INSERTED :
			{
				if (!pFld)
				{
					AddPostIts(true);
					break;
				}
				// get field to be inserted from hint
				if ( pFld->IsFldInDoc() )
				{
					bool bEmpty = !HasNotes();
					InsertItem( pFld, true, false );
					if (bEmpty && !mvPostItFlds.empty())
						PrepareView(true);
				}
				else
				{
					DBG_ERROR( "Inserted field not in document!" );
                		}
				break;
			}
			case SWFMTFLD_REMOVED:
			{
				if (mbDeleteNote)
				{
					if (!pFld)
					{
						CheckForRemovedPostIts();
						break;
					}
					RemoveItem(pFld);
				}
				break;
			}
			case SWFMTFLD_FOCUS:
			{
       				if (rFmtHint.GetView()== mpView)
					Focus(rBC);
				break;
			}
			case SWFMTFLD_CHANGED:
			{
		                SwFmtFld* pFmtFld = dynamic_cast<SwFmtFld*>(&rBC);
                for(std::list<SwSidebarItem*>::iterator i = mvPostItFlds.begin(); i!= mvPostItFlds.end() ; i++)
				{
                			if ( pFmtFld == (*i)->GetBroadCaster() )
					{
						if ((*i)->pPostIt)
						{
							(*i)->pPostIt->SetPostItText();
							mbLayout = true;
						}
						break;
					}
				}
				break;
			}

            case SWFMTFLD_LANGUAGE:
                {
                    SwFmtFld* pFmtFld = dynamic_cast<SwFmtFld*>(&rBC);
                    for(std::list<SwSidebarItem*>::iterator i = mvPostItFlds.begin(); i!= mvPostItFlds.end() ; i++)
                    {
                        if ( pFmtFld == (*i)->GetBroadCaster() )
                        {
                            if ((*i)->pPostIt)
                            {
                                const sal_uInt16 nScriptType = SvtLanguageOptions::GetScriptTypeOfLanguage( (*i)->GetFmtFld().GetField()->GetLanguage() );
                                sal_uInt16 nLangWhichId = 0;
                                switch (nScriptType)
                                {
                                case SCRIPTTYPE_LATIN :    nLangWhichId = EE_CHAR_LANGUAGE ; break;
                                case SCRIPTTYPE_ASIAN :    nLangWhichId = EE_CHAR_LANGUAGE_CJK; break;
                                case SCRIPTTYPE_COMPLEX :  nLangWhichId = EE_CHAR_LANGUAGE_CTL; break;
                                }
                                (*i)->pPostIt->SetLanguage(
                                    SvxLanguageItem(
                                    (*i)->GetFmtFld().GetField()->GetLanguage(),
                                    nLangWhichId) );
                            }
                            break;
                        }
                    }
                    break;
                }
        }
    }
}

void SwPostItMgr::Focus(SfxBroadcaster& rBC)
{
	if (!mpWrtShell->GetViewOptions()->IsPostIts())
	{
		SfxRequest aRequest(mpView->GetViewFrame(),FN_VIEW_NOTES);
		mpView->ExecViewOptions(aRequest);
	}

    for(std::list<SwSidebarItem*>::iterator i = mvPostItFlds.begin(); i!= mvPostItFlds.end() ; i++)
	{
		// field to get the focus is the broadcaster
		if ( &rBC == (*i)->GetBroadCaster() )
		{
			if ((*i)->pPostIt)
			{
				(*i)->pPostIt->GrabFocus();
				MakeVisible((*i)->pPostIt);
			}
			else
			{
				// when the layout algorithm starts, this postit is created and receives focus
				(*i)->bFocus = true;
			}
		}
	}
}

bool SwPostItMgr::CalcRects()
{
    if ( mnEventId )
    {
        // if CalcRects() was forced and an event is still pending: remove it
        // it is superfluous and also may cause reentrance problems if triggered while layouting
        Application::RemoveUserEvent( mnEventId );
        mnEventId = 0;
    }

    bool bChange = false;
    bool bRepair = false;
    PreparePageContainer();
    if ( !mvPostItFlds.empty() )
    {
        for(std::list<SwSidebarItem*>::iterator i = mvPostItFlds.begin(); i!= mvPostItFlds.end() ; i++)
        {
            SwSidebarItem* pItem = (*i);
            if ( !pItem->UseElement() )
            {
                DBG_ERROR("PostIt is not in doc or other wrong use");
                bRepair = true;
                continue;
            }

            const SwRect aOldAnchorRect( pItem->maLayoutInfo.mPosition );
            const SwPostItHelper::SwLayoutStatus eOldLayoutStatus = pItem->mLayoutStatus;
            const sal_uLong nOldStartNodeIdx( pItem->maLayoutInfo.mnStartNodeIdx );
            const xub_StrLen nOldStartContent( pItem->maLayoutInfo.mnStartContent );

            {
                // update layout information
                const SwTxtAnnotationFld* pTxtAnnotationFld =
                    dynamic_cast< const SwTxtAnnotationFld* >( pItem->GetFmtFld().GetTxtFld() );
                const ::sw::mark::IMark* pAnnotationMark =
                    pTxtAnnotationFld != NULL ? pTxtAnnotationFld->GetAnnotationMark() : NULL;
                if ( pAnnotationMark != NULL )
                {
                    pItem->mLayoutStatus =
                        SwPostItHelper::getLayoutInfos(
                            pItem->maLayoutInfo,
                            pItem->GetAnchorPosition(),
                            &pAnnotationMark->GetMarkStart() );
                }
                else
                {
                    pItem->mLayoutStatus =
                        SwPostItHelper::getLayoutInfos( pItem->maLayoutInfo, pItem->GetAnchorPosition() );
                }
            }
            bChange = bChange
                      || pItem->maLayoutInfo.mPosition != aOldAnchorRect
                      || pItem->mLayoutStatus != eOldLayoutStatus
                      || pItem->maLayoutInfo.mnStartNodeIdx != nOldStartNodeIdx
                      || pItem->maLayoutInfo.mnStartContent != nOldStartContent;
        }

        // show notes in right order in navigator
        //prevent Anchors during layout to overlap, e.g. when moving a frame
        Sort(SORT_POS);

        // sort the items into the right page vector, so layout can be done by page
        for(std::list<SwSidebarItem*>::iterator i = mvPostItFlds.begin(); i!= mvPostItFlds.end() ; i++)
        {
            SwSidebarItem* pItem = (*i);
            if( SwPostItHelper::INVISIBLE == pItem->mLayoutStatus )
            {
                if (pItem->pPostIt)
                    pItem->pPostIt->HideNote();
                continue;
            }

            if( SwPostItHelper::HIDDEN == pItem->mLayoutStatus )
            {
                if (!mpWrtShell->GetViewOptions()->IsShowHiddenChar())
                {
                    if (pItem->pPostIt)
                        pItem->pPostIt->HideNote();
                    continue;
                }
            }

            const unsigned long aPageNum = pItem->maLayoutInfo.mnPageNumber;
            if (aPageNum > mPages.size())
            {
                const unsigned long nNumberOfPages = mPages.size();
                for (unsigned int j=0; j<aPageNum - nNumberOfPages; ++j)
                    mPages.push_back( new SwPostItPageItem());
            }
            mPages[aPageNum-1]->mList->push_back(pItem);
            mPages[aPageNum-1]->mPageRect = pItem->maLayoutInfo.mPageFrame;
            mPages[aPageNum-1]->eSidebarPosition = pItem->maLayoutInfo.meSidebarPosition;
        }

        if (!bChange && mpWrtShell->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE))
        {
            long nLayoutHeight = SwPostItHelper::getLayoutHeight( mpWrtShell->GetLayout() );
            if( nLayoutHeight > mbLayoutHeight )
            {
                if (mPages[0]->bScrollbar || HasScrollbars())
                    bChange = true;
            }
            else if( nLayoutHeight < mbLayoutHeight )
            {
                if (mPages[0]->bScrollbar || !BorderOverPageBorder(1))
                    bChange = true;
            }
        }
    }

    if ( bRepair )
        CheckForRemovedPostIts();

    mbLayoutHeight = SwPostItHelper::getLayoutHeight( mpWrtShell->GetLayout() );
    mbWaitingForCalcRects = false;
    return bChange;
}

bool SwPostItMgr::HasScrollbars() const
{
    for(std::list<SwSidebarItem*>::const_iterator i = mvPostItFlds.begin(); i!= mvPostItFlds.end() ; i++)
	{
        if ((*i)->bShow && (*i)->pPostIt && (*i)->pPostIt->HasScrollbar())
			return true;
	}
	return false;
}

void SwPostItMgr::PreparePageContainer()
{
	// we do not just delete the SwPostItPageItem, so offset/scrollbar is not lost
	long lPageSize = mpWrtShell->GetNumPages();
	long lContainerSize = mPages.size();

	if (lContainerSize < lPageSize)
	{
		for (int i=0; i<lPageSize - lContainerSize;i++)
			mPages.push_back( new SwPostItPageItem());
	}
	else
	if (lContainerSize > lPageSize)
	{
		for (int i=mPages.size()-1; i >= lPageSize;--i)
		{
			delete mPages[i];
			mPages.pop_back();
		}
	}
	// only clear the list, DO NOT delete the objects itself
	for(std::vector<SwPostItPageItem*>::iterator i = mPages.begin(); i!= mPages.end() ; i++)
	{
		(*i)->mList->clear();
		if (mvPostItFlds.empty())
			(*i)->bScrollbar = false;

	}
}

void SwPostItMgr::LayoutPostIts()
{
	if ( !mvPostItFlds.empty() && !mbWaitingForCalcRects )
	{
		mbLayouting = true;

			//loop over all pages and do the layout
			// - create SwPostIt if necessary
			// - place SwPostIts on their initial position
			// - calculate necessary height for all PostIts together
			bool bUpdate = false;
			for (unsigned long n=0;n<mPages.size();n++)
			{
				// only layout if there are notes on this page
				if (mPages[n]->mList->size()>0)
				{
                    std::list<SwSidebarWin*>    aVisiblePostItList;
					unsigned long			lNeededHeight = 0;
					long					mlPageBorder = 0;
					long					mlPageEnd = 0;

                    for(SwSidebarItem_iterator i = mPages[n]->mList->begin(); i!= mPages[n]->mList->end(); i++)
					{
                        SwSidebarItem* pItem = (*i);
                        SwSidebarWin* pPostIt = pItem->pPostIt;

                        if (mPages[n]->eSidebarPosition == sw::sidebarwindows::SIDEBAR_LEFT )
						{
							// x value for notes positioning
							mlPageBorder = mpEditWin->LogicToPixel( Point( mPages[n]->mPageRect.Left(), 0)).X() - GetSidebarWidth(true);// - GetSidebarBorderWidth(true);
							//bending point
                            mlPageEnd =
                                mpWrtShell->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE)
                                ? pItem->maLayoutInfo.mPagePrtArea.Left()
                                : mPages[n]->mPageRect.Left() + 350;
						}
                        else if (mPages[n]->eSidebarPosition == sw::sidebarwindows::SIDEBAR_RIGHT )
						{
							// x value for notes positioning
							mlPageBorder = mpEditWin->LogicToPixel( Point(mPages[n]->mPageRect.Right(), 0)).X() + GetSidebarBorderWidth(true);
							//bending point
                            mlPageEnd =
                                mpWrtShell->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE)
                                ? pItem->maLayoutInfo.mPagePrtArea.Right() :
                                mPages[n]->mPageRect.Right() - 350;
						}

						if (pItem->bShow)
						{
                            long Y = mpEditWin->LogicToPixel( Point(0,pItem->maLayoutInfo.mPosition.Bottom())).Y();
							long aPostItHeight = 0;
							if (!pPostIt)
							{
                                pPostIt = (*i)->GetSidebarWindow( mpView->GetEditWin(),
                                                                  WB_DIALOGCONTROL,
                                                                  *this,
                                                                  0 );
								pPostIt->InitControls();
								pPostIt->SetReadonly(mbReadOnly);
								pItem->pPostIt = pPostIt;
								if (mpAnswer)
								{
									if (pPostIt->CalcFollow()) //do we really have another note in front of this one
                                        static_cast<sw::annotation::SwAnnotationWin*>(pPostIt)->InitAnswer(mpAnswer);
									delete mpAnswer;
									mpAnswer = 0;
								}
							}

                            pPostIt->SetChangeTracking(
                                pItem->mLayoutStatus,
                                GetColorAnchor(pItem->maLayoutInfo.mRedlineAuthor));
                            pPostIt->SetSidebarPosition(mPages[n]->eSidebarPosition);
                            pPostIt->SetFollow(pPostIt->CalcFollow());
                            aPostItHeight = ( pPostIt->GetPostItTextHeight() < pPostIt->GetMinimumSizeWithoutMeta()
                                              ? pPostIt->GetMinimumSizeWithoutMeta()
                                              : pPostIt->GetPostItTextHeight() )
                                            + pPostIt->GetMetaHeight();
                            pPostIt->SetPosSizePixelRect( mlPageBorder ,
                                                          Y - GetInitialAnchorDistance(),
                                                          GetNoteWidth() ,
                                                          aPostItHeight,
                                                          pItem->maLayoutInfo.mPosition,
                                                          mlPageEnd );
                            pPostIt->ChangeSidebarItem( *pItem );

							if (pItem->bFocus)
							{
								mbLayout = true;
                                pPostIt->GrabFocus();
								pItem->bFocus = false;
							}
							// only the visible postits are used for the final layout
							aVisiblePostItList.push_back(pPostIt);
							lNeededHeight += pPostIt->IsFollow() ? aPostItHeight : aPostItHeight+GetSpaceBetween();
						}
						else // we don't want to see it
						{
							if (pPostIt)
								pPostIt->HideNote();
						}
					}

					if ((aVisiblePostItList.size()>0) && ShowNotes())
					{
						bool bOldScrollbar = mPages[n]->bScrollbar;
						if (ShowNotes())
							mPages[n]->bScrollbar = LayoutByPage(aVisiblePostItList, mPages[n]->mPageRect.SVRect(), lNeededHeight);
						else
							mPages[n]->bScrollbar = false;
						if (!mPages[n]->bScrollbar)
						{
							mPages[n]->lOffset = 0;
						}
						else
						{
							//when we changed our zoom level, the offset value can be to big, so lets check for the largest possible zoom value
							long aAvailableHeight = mpEditWin->LogicToPixel(Size(0,mPages[n]->mPageRect.Height())).Height() - 2 * GetSidebarScrollerHeight();
							long lOffset = -1 * GetScrollSize() * (aVisiblePostItList.size() - aAvailableHeight / GetScrollSize());
							if (mPages[n]->lOffset < lOffset)
								mPages[n]->lOffset = lOffset;
						}
						bUpdate = (bOldScrollbar != mPages[n]->bScrollbar) || bUpdate;
						const long aSidebarheight = mPages[n]->bScrollbar ? mpEditWin->PixelToLogic(Size(0,GetSidebarScrollerHeight())).Height() : 0;
						/*
                       					TODO
                       					- enlarge all notes till GetNextBorder(), as we resized to average value before
                       					*/
						//lets hide the ones which overlap the page
                        for(SwSidebarWin_iterator i = aVisiblePostItList.begin(); i!= aVisiblePostItList.end() ; i++)
						{
							if (mPages[n]->lOffset != 0)
								(*i)->TranslateTopPosition(mPages[n]->lOffset);

							bool bBottom  = mpEditWin->PixelToLogic(Point(0,(*i)->VirtualPos().Y()+(*i)->VirtualSize().Height())).Y() <= (mPages[n]->mPageRect.Bottom()-aSidebarheight);
							bool bTop = mpEditWin->PixelToLogic(Point(0,(*i)->VirtualPos().Y())).Y() >= (mPages[n]->mPageRect.Top()+aSidebarheight);
							if ( bBottom && bTop )
							{
								(*i)->ShowNote();
							}
							else
							{
								if (mpEditWin->PixelToLogic(Point(0,(*i)->VirtualPos().Y())).Y() < (mPages[n]->mPageRect.Top()+aSidebarheight))
								{
                                    if ( mPages[n]->eSidebarPosition == sw::sidebarwindows::SIDEBAR_LEFT )
                                        (*i)->ShowAnchorOnly(Point( mPages[n]->mPageRect.Left(),
                                                                    mPages[n]->mPageRect.Top()));
                                    else if ( mPages[n]->eSidebarPosition == sw::sidebarwindows::SIDEBAR_RIGHT )
                                        (*i)->ShowAnchorOnly(Point( mPages[n]->mPageRect.Right(),
                                                                    mPages[n]->mPageRect.Top()));
								}
								else
								{
                                    if ( mPages[n]->eSidebarPosition == sw::sidebarwindows::SIDEBAR_LEFT )
                                        (*i)->ShowAnchorOnly(Point(mPages[n]->mPageRect.Left(),
                                                                   mPages[n]->mPageRect.Bottom()));
                                    else if ( mPages[n]->eSidebarPosition == sw::sidebarwindows::SIDEBAR_RIGHT )
                                        (*i)->ShowAnchorOnly(Point(mPages[n]->mPageRect.Right(),
                                                                   mPages[n]->mPageRect.Bottom()));
								}
								DBG_ASSERT(mPages[n]->bScrollbar,"SwPostItMgr::LayoutByPage(): note overlaps, but bScrollbar is not true");
							}
						}

						// do some magic so we really see the focused note
                        for(SwSidebarWin_iterator i = aVisiblePostItList.begin(); i!= aVisiblePostItList.end() ; i++)
						{
                            				if ((*i)->HasChildPathFocus())
							{
								MakeVisible((*i),n+1);
								break;
							}
						}
					}
					else
					{
                        for(SwSidebarWin_iterator i = aVisiblePostItList.begin(); i!= aVisiblePostItList.end() ; i++)
                                                                (*i)->SetPosAndSize();

                                                        bool bOldScrollbar = mPages[n]->bScrollbar;
                                                        mPages[n]->bScrollbar = false;
                                                        bUpdate = (bOldScrollbar != mPages[n]->bScrollbar) || bUpdate;
					}
					aVisiblePostItList.clear();
				}
				else
				{
					bUpdate = true;
					mPages[n]->bScrollbar = false;
				}
			}

			if (!ShowNotes())
			{       // we do not want to see the notes anymore -> Options-Writer-View-Notes
				bool bRepair = false;
                for(SwSidebarItem_iterator i = mvPostItFlds.begin(); i!= mvPostItFlds.end() ; i++)
				{
                    SwSidebarItem* pItem = (*i);
					if ( !pItem->UseElement() )
					{
						DBG_ERROR("PostIt is not in doc!");
						bRepair = true;
						continue;
					}

					if ((*i)->pPostIt)
					{
						(*i)->pPostIt->HideNote();
						if ((*i)->pPostIt->HasChildPathFocus())
						{
                            SetActiveSidebarWin(0);
							(*i)->pPostIt->GrabFocusToDocument();
						}
					}
				}

				if ( bRepair )
					CheckForRemovedPostIts();
			}


			// notes scrollbar is otherwise not drawn correctly for some cases
			// scrollbar area is enough
			if (bUpdate)
				mpEditWin->Invalidate();
		mbLayouting = false;
	}
}

bool SwPostItMgr::BorderOverPageBorder(unsigned long aPage) const
{
	if ( mPages[aPage-1]->mList->empty() )
	{
		DBG_ERROR("Notes SidePane painted but no rects and page lists calculated!");
		return false;
	}

    SwSidebarItem_iterator aItem = mPages[aPage-1]->mList->end();
	--aItem;
	DBG_ASSERT ((*aItem)->pPostIt,"BorderOverPageBorder: NULL postIt, should never happen");
	if ((*aItem)->pPostIt)
	{
		const long aSidebarheight = mPages[aPage-1]->bScrollbar ? mpEditWin->PixelToLogic(Size(0,GetSidebarScrollerHeight())).Height() : 0;
		const long aEndValue = mpEditWin->PixelToLogic(Point(0,(*aItem)->pPostIt->GetPosPixel().Y()+(*aItem)->pPostIt->GetSizePixel().Height())).Y();
		return aEndValue <= mPages[aPage-1]->mPageRect.Bottom()-aSidebarheight;
	}
	else
		return false;
}

void SwPostItMgr::Scroll(const long lScroll,const unsigned long aPage)
{
	DBG_ASSERT((lScroll % GetScrollSize() )==0,"SwPostItMgr::Scroll: scrolling by wrong value");
	// do not scroll more than necessary up or down
	if ( ((mPages[aPage-1]->lOffset == 0) && (lScroll>0)) || ( BorderOverPageBorder(aPage) && (lScroll<0)) )
		return;

	const bool bOldUp = ArrowEnabled(KEY_PAGEUP,aPage);
	const bool bOldDown = ArrowEnabled(KEY_PAGEDOWN,aPage);
	const long aSidebarheight = mpEditWin->PixelToLogic(Size(0,GetSidebarScrollerHeight())).Height();
    for(SwSidebarItem_iterator i = mPages[aPage-1]->mList->begin(); i!= mPages[aPage-1]->mList->end(); i++)
	{
        SwSidebarWin* pPostIt = (*i)->pPostIt;
		// if this is an answer, we should take the normal position and not the real, slightly moved position
		pPostIt->SetVirtualPosSize(pPostIt->GetPosPixel(),pPostIt->GetSizePixel());
		pPostIt->TranslateTopPosition(lScroll);

		if ((*i)->bShow)
		{
			bool bBottom  = mpEditWin->PixelToLogic(Point(0,pPostIt->VirtualPos().Y()+pPostIt->VirtualSize().Height())).Y() <= (mPages[aPage-1]->mPageRect.Bottom()-aSidebarheight);
			bool bTop = mpEditWin->PixelToLogic(Point(0,pPostIt->VirtualPos().Y())).Y() >=	 (mPages[aPage-1]->mPageRect.Top()+aSidebarheight);
			if ( bBottom && bTop)
			{
					pPostIt->ShowNote();
			}
			else
			{
				if ( mpEditWin->PixelToLogic(Point(0,pPostIt->VirtualPos().Y())).Y() < (mPages[aPage-1]->mPageRect.Top()+aSidebarheight))
				{
                    if (mPages[aPage-1]->eSidebarPosition == sw::sidebarwindows::SIDEBAR_LEFT)
                        pPostIt->ShowAnchorOnly(Point(mPages[aPage-1]->mPageRect.Left(),mPages[aPage-1]->mPageRect.Top()));
                    else if (mPages[aPage-1]->eSidebarPosition == sw::sidebarwindows::SIDEBAR_RIGHT)
                        pPostIt->ShowAnchorOnly(Point(mPages[aPage-1]->mPageRect.Right(),mPages[aPage-1]->mPageRect.Top()));
				}
				else
				{
                    if (mPages[aPage-1]->eSidebarPosition == sw::sidebarwindows::SIDEBAR_LEFT)
                        pPostIt->ShowAnchorOnly(Point(mPages[aPage-1]->mPageRect.Left(),mPages[aPage-1]->mPageRect.Bottom()));
                    else if (mPages[aPage-1]->eSidebarPosition == sw::sidebarwindows::SIDEBAR_RIGHT)
                        pPostIt->ShowAnchorOnly(Point(mPages[aPage-1]->mPageRect.Right(),mPages[aPage-1]->mPageRect.Bottom()));
				}
			}
		}
	}
	mPages[aPage-1]->lOffset += lScroll;
	if ( (bOldUp != ArrowEnabled(KEY_PAGEUP,aPage)) ||(bOldDown != ArrowEnabled(KEY_PAGEDOWN,aPage)) )
	{
		mpEditWin->Invalidate(GetBottomScrollRect(aPage));
		mpEditWin->Invalidate(GetTopScrollRect(aPage));
	}
}

void SwPostItMgr::AutoScroll(const SwSidebarWin* pPostIt,const unsigned long aPage )
{
	// otherwise all notes are visible
	if (mPages[aPage-1]->bScrollbar)
	{
		const long aSidebarheight = mpEditWin->PixelToLogic(Size(0,GetSidebarScrollerHeight())).Height();
		const bool bBottom  = mpEditWin->PixelToLogic(Point(0,pPostIt->GetPosPixel().Y()+pPostIt->GetSizePixel().Height())).Y() <= (mPages[aPage-1]->mPageRect.Bottom()-aSidebarheight);
		const bool bTop = mpEditWin->PixelToLogic(Point(0,pPostIt->GetPosPixel().Y())).Y() >= (mPages[aPage-1]->mPageRect.Top()+aSidebarheight);
		if ( !(bBottom && bTop))
		{
			const long aDiff = bBottom ? mpEditWin->LogicToPixel(Point(0,mPages[aPage-1]->mPageRect.Top() + aSidebarheight)).Y() - pPostIt->GetPosPixel().Y() :
											mpEditWin->LogicToPixel(Point(0,mPages[aPage-1]->mPageRect.Bottom() - aSidebarheight)).Y() - (pPostIt->GetPosPixel().Y()+pPostIt->GetSizePixel().Height());
			// this just adds the missing value to get the next a* GetScrollSize() after aDiff
			// e.g aDiff= 61 POSTIT_SCOLL=50 --> lScroll = 100
			const long lScroll = bBottom ? (aDiff + ( GetScrollSize() - (aDiff % GetScrollSize()))) : (aDiff - (GetScrollSize() + (aDiff % GetScrollSize())));
			Scroll(lScroll, aPage);
		}
	}
}

void SwPostItMgr::MakeVisible(const SwSidebarWin* pPostIt,long aPage )
{
	if (aPage == -1)
	{
		// we dont know the page yet, lets find it ourselves
		for (unsigned long n=0;n<mPages.size();n++)
		{
			if (mPages[n]->mList->size()>0)
			{
                for(SwSidebarItem_iterator i = mPages[n]->mList->begin(); i!= mPages[n]->mList->end(); i++)
				{
					if ((*i)->pPostIt==pPostIt)
					{
						aPage = n+1;
						break;
					}
				}
			}
		}
	}
	if (aPage!=-1)
		AutoScroll(pPostIt,aPage);
	Rectangle aNoteRect (Point(pPostIt->GetPosPixel().X(),pPostIt->GetPosPixel().Y()-5),pPostIt->GetSizePixel());
	if (!aNoteRect.IsEmpty())
		mpWrtShell->MakeVisible(SwRect(mpEditWin->PixelToLogic(aNoteRect)));
}

bool SwPostItMgr::ArrowEnabled(sal_uInt16 aDirection,unsigned long aPage) const
{
	switch (aDirection)
	{
		case KEY_PAGEUP:
			{
				return (mPages[aPage-1]->lOffset != 0);
			}
		case KEY_PAGEDOWN:
			{
				return (!BorderOverPageBorder(aPage));
			}
		default: return false;
	}
}

Color SwPostItMgr::GetArrowColor(sal_uInt16 aDirection,unsigned long aPage) const
{
	if (ArrowEnabled(aDirection,aPage))
	{
		if (Application::GetSettings().GetStyleSettings().GetHighContrastMode())
			return Color(COL_WHITE);
		else
			return COL_NOTES_SIDEPANE_ARROW_ENABLED;
	}
	else
	{
		return COL_NOTES_SIDEPANE_ARROW_DISABLED;
	}
}

bool SwPostItMgr::LayoutByPage(std::list<SwSidebarWin*> &aVisiblePostItList,const Rectangle aBorder, long lNeededHeight)
{
	/*** General layout idea:***/
	//  - if we have space left, we always move the current one up,
	//    otherwise the next one down
	//  - first all notes are resized
	//	- then the real layout starts
	/*************************************************************/

	//rBorder is the page rect
    const Rectangle	rBorder			= mpEditWin->LogicToPixel( aBorder);
	long			lTopBorder		= rBorder.Top() + 5;
	long			lBottomBorder	= rBorder.Bottom() - 5;
	const long		lVisibleHeight	= lBottomBorder - lTopBorder; //rBorder.GetHeight() ;
	long			lSpaceUsed		= 0;
	long			lTranslatePos	= 0;
	int				loop			= 0;
	bool			bDone			= false;
	bool			bScrollbars		= false;

	// do all necessary resizings
	if (lVisibleHeight < lNeededHeight)
	{
		// ok, now we have to really resize and adding scrollbars
		const long lAverageHeight = (lVisibleHeight - aVisiblePostItList.size()*GetSpaceBetween()) / aVisiblePostItList.size();
		if (lAverageHeight<GetMinimumSizeWithMeta())
		{
			bScrollbars = true;
			lTopBorder += GetSidebarScrollerHeight() + 10;
			lBottomBorder -= (GetSidebarScrollerHeight() + 10);
                for(SwSidebarWin_iterator i = aVisiblePostItList.begin(); i!= aVisiblePostItList.end() ; i++)
					(*i)->SetSize(Size((*i)->VirtualSize().getWidth(),(*i)->GetMinimumSizeWithMeta()));
		}
		else
		{
            for(SwSidebarWin_iterator i = aVisiblePostItList.begin(); i!= aVisiblePostItList.end() ; i++)
			{
				if ( (*i)->VirtualSize().getHeight() > lAverageHeight)
					(*i)->SetSize(Size((*i)->VirtualSize().getWidth(),lAverageHeight));
			}
		}
	}

	//start the real layout so nothing overlaps anymore
	if (aVisiblePostItList.size()>1)
	{
		// if no window is moved anymore we are finished
		while (!bDone)
		{
			loop++;
  			bDone = true;
			lSpaceUsed = lTopBorder + GetSpaceBetween();
            for(SwSidebarWin_iterator i = aVisiblePostItList.begin(); i!= aVisiblePostItList.end() ; i++)
			{
                SwSidebarWin_iterator aNextPostIt = i;
				++aNextPostIt;

				if (aNextPostIt !=aVisiblePostItList.end())
				{
					lTranslatePos = ( (*i)->VirtualPos().Y() + (*i)->VirtualSize().Height()) - (*aNextPostIt)->VirtualPos().Y();
					if (lTranslatePos > 0) // note windows overlaps the next one
					{
						// we are not done yet, loop at least once more
						bDone = false;
						// if there is space left, move the current note up
						// it could also happen that there is no space left for the first note due to a scrollbar
						// then we also jump into, so we move the current one up and the next one down
						if ( (lSpaceUsed <= (*i)->VirtualPos().Y()) || (i==aVisiblePostItList.begin()))
						{
							// we have space left, so let's move the current one up
							if ( ((*i)->VirtualPos().Y()- lTranslatePos - GetSpaceBetween()) > lTopBorder)
							{
								if ((*aNextPostIt)->IsFollow())
                                    (*i)->TranslateTopPosition(-1*(lTranslatePos+ANCHORLINE_WIDTH));
								else
									(*i)->TranslateTopPosition(-1*(lTranslatePos+GetSpaceBetween()));
							}
							else
							{
								long lMoveUp = (*i)->VirtualPos().Y() - lTopBorder;
								(*i)->TranslateTopPosition(-1* lMoveUp);
								if ((*aNextPostIt)->IsFollow())
                                    (*aNextPostIt)->TranslateTopPosition( (lTranslatePos+ANCHORLINE_WIDTH) - lMoveUp);
								else
									(*aNextPostIt)->TranslateTopPosition( (lTranslatePos+GetSpaceBetween()) - lMoveUp);
							}
						}
						else
						{
							// no space left, left move the next one down
							if ((*aNextPostIt)->IsFollow())
                                (*aNextPostIt)->TranslateTopPosition(lTranslatePos+ANCHORLINE_WIDTH);
							else
								(*aNextPostIt)->TranslateTopPosition(lTranslatePos+GetSpaceBetween());
						}
					}
					else
					{
						// the first one could overlap the topborder instead of a second note
						if (i==aVisiblePostItList.begin())
						{
							long lMoveDown = lTopBorder - (*i)->VirtualPos().Y();
							if (lMoveDown>0)
							{
								bDone = false;
								(*i)->TranslateTopPosition( lMoveDown);
							}
						}
					}
					if (aNextPostIt !=aVisiblePostItList.end() && (*aNextPostIt)->IsFollow())
                        lSpaceUsed += (*i)->VirtualSize().Height() + ANCHORLINE_WIDTH;
					else
						lSpaceUsed += (*i)->VirtualSize().Height() + GetSpaceBetween();
				}
				else
				{
					//(*i) is the last visible item
                    SwSidebarWin_iterator aPrevPostIt = i;
					--aPrevPostIt;
					//lTranslatePos = ( (*aPrevPostIt)->VirtualPos().Y() + (*aPrevPostIt)->VirtualSize().Height() + GetSpaceBetween() ) - (*i)->VirtualPos().Y();
					lTranslatePos = ( (*aPrevPostIt)->VirtualPos().Y() + (*aPrevPostIt)->VirtualSize().Height() ) - (*i)->VirtualPos().Y();
					if (lTranslatePos > 0)
					{
						bDone = false;
						if ( ((*i)->VirtualPos().Y()+ (*i)->VirtualSize().Height()+lTranslatePos) < lBottomBorder)
						{
							if ( (*i)->IsFollow() )
                                (*i)->TranslateTopPosition(lTranslatePos+ANCHORLINE_WIDTH);
							else
								(*i)->TranslateTopPosition(lTranslatePos+GetSpaceBetween());
						}
						else
						{
							(*i)->TranslateTopPosition(lBottomBorder - ((*i)->VirtualPos().Y()+ (*i)->VirtualSize().Height()) );
						}
					}
					else
					{
						// note does not overlap, but we might be over the lower border
                        // only do this if there are no scrollbars, otherwise notes are supposed to overlap the border
						if (!bScrollbars && ((*i)->VirtualPos().Y()+ (*i)->VirtualSize().Height() > lBottomBorder) )
						{
							bDone = false;
							(*i)->TranslateTopPosition(lBottomBorder - ((*i)->VirtualPos().Y()+ (*i)->VirtualSize().Height()));
						}
					}
				}
			}
			// security check so we don't loop forever
			if (loop>MAX_LOOP_COUNT)
			{
				DBG_ERROR("PostItMgr::Layout(): We are looping forever");
				break;
			}
		}
	}
	else
	{
		// only one left, make sure it is not hidden at the top or bottom
        SwSidebarWin_iterator i = aVisiblePostItList.begin();
		lTranslatePos = lTopBorder - (*i)->VirtualPos().Y();
		if (lTranslatePos>0)
		{
			(*i)->TranslateTopPosition(lTranslatePos+GetSpaceBetween());
		}
		lTranslatePos =	lBottomBorder - ((*i)->VirtualPos().Y()+ (*i)->VirtualSize().Height());
		if (lTranslatePos<0)
		{
			(*i)->TranslateTopPosition(lTranslatePos);
		}
	}
	return bScrollbars;
 }

/*
void SwPostItMgr::AddRedlineComments(bool bCheckExistance, bool bFocus)
{
	bool bEmpty = mvPostItFlds.empty();
	const SwRedlineTbl& aTable = mpView->GetDocShell()->GetDoc()->GetRedlineTbl();
	for( sal_uInt16 i = 0; i < aTable.Count(); ++i )
	{
		SwRedline* pRedline = const_cast<SwRedline*>((aTable)[i]);
		if ( pRedline->GetComment() != String(rtl::OUString::createFromAscii("")) )
			InsertItem(pRedline, bCheckExistance, bFocus);
	}
	if (bEmpty && !mvPostItFlds.empty())
		PrepareView(true);
 }
 */

void SwPostItMgr::AddPostIts(bool bCheckExistance, bool bFocus)
{
	bool bEmpty = mvPostItFlds.empty();
	SwFieldType* pType = mpView->GetDocShell()->GetDoc()->GetFldType(RES_POSTITFLD, aEmptyStr,false);
	SwIterator<SwFmtFld,SwFieldType> aIter( *pType );
	SwFmtFld* pSwFmtFld = aIter.First();
	while(pSwFmtFld)
	{
		if ( pSwFmtFld->GetTxtFld())
		{
			if ( pSwFmtFld->IsFldInDoc() )
				InsertItem(pSwFmtFld,bCheckExistance,bFocus);
		}
		pSwFmtFld = aIter.Next();
	}

	// if we just added the first one we have to update the view for centering
	if (bEmpty && !mvPostItFlds.empty())
		PrepareView(true);
}

void SwPostItMgr::RemoveSidebarWin()
{
	if (!mvPostItFlds.empty())
	{
        for(std::list<SwSidebarItem*>::iterator i = mvPostItFlds.begin(); i!= mvPostItFlds.end() ; i++)
		{
			EndListening( *(const_cast<SfxBroadcaster*>((*i)->GetBroadCaster())) );
			if ((*i)->pPostIt)
				delete (*i)->pPostIt;
			delete (*i);
		}
		mvPostItFlds.clear();
	}

	// all postits removed, no items should be left in pages
	PreparePageContainer();
}

// copy to new vector, otherwise RemoveItem would operate and delete stuff on mvPostItFlds as well
// RemoveItem will clean up the core field and visible postit if necessary
// we cannot just delete everything as before, as postits could move into change tracking
void SwPostItMgr::Delete(String aAuthor)
{
	mpWrtShell->StartAllAction();
    if ( HasActiveSidebarWin() && (GetActiveSidebarWin()->GetAuthor()==aAuthor) )
    {
        SetActiveSidebarWin(0);
    }
	SwRewriter aRewriter;
	String aUndoString = SW_RES(STR_DELETE_AUTHOR_NOTES);
	aUndoString += aAuthor;
	aRewriter.AddRule(UNDO_ARG1, aUndoString);
	mpWrtShell->StartUndo( UNDO_DELETE, &aRewriter );

	std::vector<const SwFmtFld*> aTmp;
    aTmp.reserve( mvPostItFlds.size() );
    for(std::list<SwSidebarItem*>::iterator pPostIt = mvPostItFlds.begin(); pPostIt!= mvPostItFlds.end() ; pPostIt++)
	{
		if ( (*pPostIt)->pPostIt->GetAuthor() == aAuthor )
			aTmp.push_back( &(*pPostIt)->GetFmtFld() );
	}
	for(std::vector<const SwFmtFld*>::iterator i = aTmp.begin(); i!= aTmp.end() ; i++)
	{
		mpWrtShell->GotoField( *(*i) );
		mpWrtShell->DelRight();
	}
    mpWrtShell->EndUndo();
	PrepareView();
	mpWrtShell->EndAllAction();
	mbLayout = true;
	CalcRects();
	LayoutPostIts();
}

void SwPostItMgr::Delete()
{
	mpWrtShell->StartAllAction();
    SetActiveSidebarWin(0);
	SwRewriter aRewriter;
	aRewriter.AddRule(UNDO_ARG1, SW_RES(STR_DELETE_ALL_NOTES) );
	mpWrtShell->StartUndo( UNDO_DELETE, &aRewriter );

    std::vector<const SwFmtFld*> aTmp;
    aTmp.reserve( mvPostItFlds.size() );
    for(std::list<SwSidebarItem*>::iterator pPostIt = mvPostItFlds.begin(); pPostIt!= mvPostItFlds.end() ; pPostIt++)
    {
        aTmp.push_back( &(*pPostIt)->GetFmtFld() );
    }
	for(std::vector<const SwFmtFld*>::iterator i = aTmp.begin(); i!= aTmp.end() ; i++)
	{
		mpWrtShell->GotoField( *(*i) );
		mpWrtShell->DelRight();
	}

/*
	for(std::list<SwPostItItem*>::iterator i = mvPostItFlds.begin(); i!= mvPostItFlds.end() ; i++)
	{
		SwPostItItem* pItem = (*i);
		// stop listening, we delete ourselves
		EndListening( *(pItem->pFmtFld) );
		// delete the actual SwPostItField
		mpWrtShell->GotoField(*pItem->pFmtFld);
		mpWrtShell->DelRight();
		// delete visual representation
		delete pItem->pPostIt;
		// delete struct saving the pointers
		delete pItem;
	}
	mvPostItFlds.clear();
*/

    mpWrtShell->EndUndo();
	PrepareView();
	mpWrtShell->EndAllAction();
	mbLayout = true;
	CalcRects();
	LayoutPostIts();
}
#if 0
void SwPostItMgr::Hide(SwPostItField* pPostItField )
{
    for(std::list<SwSidebarItem*>::iterator i = mvPostItFlds.begin(); i!= mvPostItFlds.end() ; i++)
	{
		if ((*i)->GetFmtFld())
		{
			SwPostItField* pField = static_cast<SwPostItField*>((*i)->GetFmtFld()->GetFld());
			if (pPostItField==pField)
			{
				(*i)->bShow = false;
				(*i)->pPostIt->HideNote();
				break;
			}
		}
	}

	LayoutPostIts();
}
#endif
void SwPostItMgr::Hide( const String& rAuthor )
{
    for(SwSidebarItem_iterator i = mvPostItFlds.begin(); i!= mvPostItFlds.end() ; i++)
	{
		if ( (*i)->pPostIt && ((*i)->pPostIt->GetAuthor() == rAuthor) )
		{
			(*i)->bShow	 = false;
			(*i)->pPostIt->HideNote();
		}
	}

	LayoutPostIts();
}

void SwPostItMgr::Hide()
{
    for(SwSidebarItem_iterator i = mvPostItFlds.begin(); i!= mvPostItFlds.end() ; i++)
	{
		(*i)->bShow = false;
		(*i)->pPostIt->HideNote();
	}
}


void SwPostItMgr::Show()
{
    for(SwSidebarItem_iterator i = mvPostItFlds.begin(); i!= mvPostItFlds.end() ; i++)
	{
		(*i)->bShow = true;
	}
	LayoutPostIts();
}

void SwPostItMgr::Sort(const short aType)
{
	if (mvPostItFlds.size()>1 )
	{
		switch (aType)
		{
			case SORT_POS:
				mvPostItFlds.sort(comp_pos);
				break;
			/*
			case SORT_AUTHOR:
				mvPostItFlds.sort(comp_author);
				break;
			case SORT_DATE:
				mvPostItFlds.sort(comp_date);
				break;
			*/
		}
	}
}

SwSidebarWin* SwPostItMgr::GetSidebarWin( const SfxBroadcaster* pBroadcaster) const
{
	for(const_iterator i = mvPostItFlds.begin(); i!= mvPostItFlds.end() ; i++)
	{
		if ( (*i)->GetBroadCaster() == pBroadcaster)
			return (*i)->pPostIt;
	}
	return NULL;
}

sw::annotation::SwAnnotationWin* SwPostItMgr::GetAnnotationWin(const SwPostItField* pFld) const
{
    for(const_iterator i = mvPostItFlds.begin(); i!= mvPostItFlds.end() ; i++)
    {
        if ( (*i)->GetFmtFld().GetField() == pFld )
            return dynamic_cast<sw::annotation::SwAnnotationWin*>((*i)->pPostIt);
    }
    return NULL;
}

SwSidebarWin* SwPostItMgr::GetNextPostIt( sal_uInt16 aDirection,
                                          SwSidebarWin* aPostIt )
{
	if (mvPostItFlds.size()>1)
	{
        for(SwSidebarItem_iterator i = mvPostItFlds.begin(); i!= mvPostItFlds.end() ; i++)
		{
			if ( (*i)->pPostIt ==aPostIt)
			{
                SwSidebarItem_iterator iNextPostIt  = i;
				if (aDirection==KEY_PAGEUP)
				{
					if ( iNextPostIt==mvPostItFlds.begin() )
					{
						return NULL;
					}
					--iNextPostIt;
				}
				else
				{
					iNextPostIt++;
					if ( iNextPostIt==mvPostItFlds.end() )
					{
						return NULL;
					}
				}
				// lets quit, we are back at the beginng
				if ( (*iNextPostIt)->pPostIt==aPostIt)
					return NULL;
				return (*iNextPostIt)->pPostIt;
			}
		}
		return NULL;
	}
	else
		return NULL;
}

long SwPostItMgr::GetNextBorder()
{
	for (unsigned long n=0;n<mPages.size();n++)
	{
        for(SwSidebarItem_iterator b = mPages[n]->mList->begin(); b!= mPages[n]->mList->end(); b++)
		{
			if ((*b)->pPostIt == mpActivePostIt)
			{
                SwSidebarItem_iterator aNext = b;
				aNext++;
				bool bFollow = (aNext == mPages[n]->mList->end()) ? false : (*aNext)->pPostIt->IsFollow();
				if ( mPages[n]->bScrollbar || bFollow )
				{
					return -1;
				}
				else
				{
					//if this is the last item, return the bottom border otherwise the next item
					if (aNext == mPages[n]->mList->end())
						return mpEditWin->LogicToPixel(Point(0,mPages[n]->mPageRect.Bottom())).Y() - GetSpaceBetween();
					else
						return (*aNext)->pPostIt->GetPosPixel().Y() - GetSpaceBetween();
				}
			}
		}
	}

	DBG_ERROR("SwPostItMgr::GetNextBorder(): We have to find a next border here");
	return -1;
}

void SwPostItMgr::SetShadowState(const SwPostItField* pFld,bool bCursor)
{
	if (pFld)
	{
		if (pFld !=mShadowState.mpShadowFld)
		{
			if (mShadowState.mpShadowFld)
			{
				// reset old one if still alive
				// TODO: does not work properly if mouse and cursor was set
                sw::annotation::SwAnnotationWin* pOldPostIt =
                                    GetAnnotationWin(mShadowState.mpShadowFld);
				if (pOldPostIt && pOldPostIt->Shadow() && (pOldPostIt->Shadow()->GetShadowState() != SS_EDIT))
                    pOldPostIt->SetViewState(VS_NORMAL);
			}
			//set new one, if it is not currently edited
            sw::annotation::SwAnnotationWin* pNewPostIt = GetAnnotationWin(pFld);
			if (pNewPostIt && pNewPostIt->Shadow() && (pNewPostIt->Shadow()->GetShadowState() != SS_EDIT))
			{
                pNewPostIt->SetViewState(VS_VIEW);
				//remember our new field
				mShadowState.mpShadowFld = pFld;
				mShadowState.bCursor = false;
				mShadowState.bMouse = false;
			}
		}
		if (bCursor)
			mShadowState.bCursor = true;
		else
			mShadowState.bMouse = true;
	}
	else
	{
		if (mShadowState.mpShadowFld)
		{
			if (bCursor)
				mShadowState.bCursor = false;
			else
				mShadowState.bMouse = false;
			if (!mShadowState.bCursor && !mShadowState.bMouse)
			{
				// reset old one if still alive
                sw::annotation::SwAnnotationWin* pOldPostIt = GetAnnotationWin(mShadowState.mpShadowFld);
				if (pOldPostIt && pOldPostIt->Shadow() && (pOldPostIt->Shadow()->GetShadowState() != SS_EDIT))
				{
                    pOldPostIt->SetViewState(VS_NORMAL);
					mShadowState.mpShadowFld = 0;
				}
			}
		}
	}
}

void SwPostItMgr::PrepareView(bool bIgnoreCount)
{
	if (!HasNotes() || bIgnoreCount)
	{
		mpWrtShell->StartAllAction();
		//mpEditWin->Invalidate(); // really not needed anymore??
		SwRootFrm* pLayout = mpWrtShell->GetLayout();
        if ( pLayout )
            SwPostItHelper::setSidebarChanged( pLayout,
                mpWrtShell->getIDocumentSettingAccess()->get( IDocumentSettingAccess::BROWSE_MODE ) );
		mpWrtShell->EndAllAction();
	}
}

bool SwPostItMgr::ShowScrollbar(const unsigned long aPage) const
{
	if (mPages.size() > aPage-1)
		return (mPages[aPage-1]->bScrollbar && !mbWaitingForCalcRects);
	else
		return false;
}

bool SwPostItMgr::IsHit(const Point &aPointPixel)
{
	if (HasNotes() && ShowNotes())
	{
		const Point aPoint = mpEditWin->PixelToLogic(aPointPixel);
        const SwRootFrm* pLayout = mpWrtShell->GetLayout();
        SwRect aPageFrm;
		const unsigned long nPageNum = SwPostItHelper::getPageInfo( aPageFrm, pLayout, aPoint );
	    if( nPageNum )
		{
			Rectangle aRect;
			DBG_ASSERT(mPages.size()>nPageNum-1,"SwPostitMgr:: page container size wrong");
            aRect = mPages[nPageNum-1]->eSidebarPosition == sw::sidebarwindows::SIDEBAR_LEFT
                    ? Rectangle(Point(aPageFrm.Left()-GetSidebarWidth()-GetSidebarBorderWidth(),aPageFrm.Top()),Size(GetSidebarWidth(),aPageFrm.Height()))
                    : Rectangle( Point(aPageFrm.Right()+GetSidebarBorderWidth(),aPageFrm.Top()) , Size(GetSidebarWidth(),aPageFrm.Height()));
			if (aRect.IsInside(aPoint))
			{
				// we hit the note's sidebar
				// lets now test for the arrow area
				if (mPages[nPageNum-1]->bScrollbar)
					return ScrollbarHit(nPageNum,aPoint);
				else
					return false;
			}
		}
	}
	return false;
}
Rectangle SwPostItMgr::GetBottomScrollRect(const unsigned long aPage) const
{
	SwRect aPageRect = mPages[aPage-1]->mPageRect;
    Point aPointBottom = mPages[aPage-1]->eSidebarPosition == sw::sidebarwindows::SIDEBAR_LEFT
                         ? Point(aPageRect.Left() - GetSidebarWidth() - GetSidebarBorderWidth() + mpEditWin->PixelToLogic(Size(2,0)).Width(),aPageRect.Bottom()- mpEditWin->PixelToLogic(Size(0,2+GetSidebarScrollerHeight())).Height())
                         : Point(aPageRect.Right() + GetSidebarBorderWidth() + mpEditWin->PixelToLogic(Size(2,0)).Width(),aPageRect.Bottom()- mpEditWin->PixelToLogic(Size(0,2+GetSidebarScrollerHeight())).Height());
	Size aSize(GetSidebarWidth() - mpEditWin->PixelToLogic(Size(4,0)).Width(), mpEditWin->PixelToLogic(Size(0,GetSidebarScrollerHeight())).Height()) ;
	return Rectangle(aPointBottom,aSize);

}

Rectangle SwPostItMgr::GetTopScrollRect(const unsigned long aPage) const
{
	SwRect aPageRect = mPages[aPage-1]->mPageRect;
    Point aPointTop = mPages[aPage-1]->eSidebarPosition == sw::sidebarwindows::SIDEBAR_LEFT
                      ? Point(aPageRect.Left() - GetSidebarWidth() -GetSidebarBorderWidth()+ mpEditWin->PixelToLogic(Size(2,0)).Width(),aPageRect.Top() + mpEditWin->PixelToLogic(Size(0,2)).Height())
                      : Point(aPageRect.Right() + GetSidebarBorderWidth() + mpEditWin->PixelToLogic(Size(2,0)).Width(),aPageRect.Top() + mpEditWin->PixelToLogic(Size(0,2)).Height());
	Size aSize(GetSidebarWidth() - mpEditWin->PixelToLogic(Size(4,0)).Width(), mpEditWin->PixelToLogic(Size(0,GetSidebarScrollerHeight())).Height()) ;
	return Rectangle(aPointTop,aSize);
}


//IMPORTANT: if you change the rects here, also change SwPageFrm::PaintNotesSidebar()
bool SwPostItMgr::ScrollbarHit(const unsigned long aPage,const Point &aPoint)
{
	SwRect aPageRect = mPages[aPage-1]->mPageRect;
    Point aPointBottom = mPages[aPage-1]->eSidebarPosition == sw::sidebarwindows::SIDEBAR_LEFT
                         ? Point(aPageRect.Left() - GetSidebarWidth()-GetSidebarBorderWidth() + mpEditWin->PixelToLogic(Size(2,0)).Width(),aPageRect.Bottom()- mpEditWin->PixelToLogic(Size(0,2+GetSidebarScrollerHeight())).Height())
                         : Point(aPageRect.Right() + GetSidebarBorderWidth()+ mpEditWin->PixelToLogic(Size(2,0)).Width(),aPageRect.Bottom()- mpEditWin->PixelToLogic(Size(0,2+GetSidebarScrollerHeight())).Height());

    Point aPointTop = mPages[aPage-1]->eSidebarPosition == sw::sidebarwindows::SIDEBAR_LEFT
                      ? Point(aPageRect.Left() - GetSidebarWidth()-GetSidebarBorderWidth()+ mpEditWin->PixelToLogic(Size(2,0)).Width(),aPageRect.Top() + mpEditWin->PixelToLogic(Size(0,2)).Height())
                      : Point(aPageRect.Right()+GetSidebarBorderWidth()+ mpEditWin->PixelToLogic(Size(2,0)).Width(),aPageRect.Top() + mpEditWin->PixelToLogic(Size(0,2)).Height());

	Rectangle aRectBottom(GetBottomScrollRect(aPage));
	Rectangle aRectTop(GetTopScrollRect(aPage));

	if (aRectBottom.IsInside(aPoint))
	{
		if (aPoint.X() < long((aPointBottom.X() + GetSidebarWidth()/3)))
			Scroll( GetScrollSize(),aPage);
		else
			Scroll( -1*GetScrollSize(), aPage);
		return true;
	}
	else
	if (aRectTop.IsInside(aPoint))
	{
		if (aPoint.X() < long((aPointTop.X() + GetSidebarWidth()/3*2)))
			Scroll(GetScrollSize(), aPage);
		else
			Scroll(-1*GetScrollSize(), aPage);
		return true;
	}
	return false;
}

void SwPostItMgr::CorrectPositions()
{
   if ( mbWaitingForCalcRects || mbLayouting || mvPostItFlds.empty() )
       return;

   // find first valid note
   SwSidebarWin *pFirstPostIt = 0;
   for(SwSidebarItem_iterator i = mvPostItFlds.begin(); i!= mvPostItFlds.end() ; i++)
   {
       pFirstPostIt = (*i)->pPostIt;
       if (pFirstPostIt)
           break;
   }

   //if we have not found a valid note, forget about it and leave
   if (!pFirstPostIt)
       return;

    // yeah, I know,    if this is a left page it could be wrong, but finding the page and the note is probably not even faster than just doing it
    // --> OD 2010-06-03 #i111964# - check, if anchor overlay object exists.
    const long aAnchorX = pFirstPostIt->Anchor() 
                          ? mpEditWin->LogicToPixel( Point((long)(pFirstPostIt->Anchor()->GetSixthPosition().getX()),0)).X()
                          : 0;
    const long aAnchorY = pFirstPostIt->Anchor() 
                          ? mpEditWin->LogicToPixel( Point(0,(long)(pFirstPostIt->Anchor()->GetSixthPosition().getY()))).Y() + 1
                          : 0;
    // <-- 
    if (Point(aAnchorX,aAnchorY) != pFirstPostIt->GetPosPixel())
    {
        long aAnchorPosX = 0;
        long aAnchorPosY = 0;
        for (unsigned long n=0;n<mPages.size();n++)
        {
            for(SwSidebarItem_iterator i = mPages[n]->mList->begin(); i!= mPages[n]->mList->end(); i++)
            {
                if ( (*i)->bShow && (*i)->pPostIt && (*i)->pPostIt->Anchor() )
                {
                    aAnchorPosX = mPages[n]->eSidebarPosition == sw::sidebarwindows::SIDEBAR_LEFT
                        ? mpEditWin->LogicToPixel( Point((long)((*i)->pPostIt->Anchor()->GetSeventhPosition().getX()),0)).X()
                        : mpEditWin->LogicToPixel( Point((long)((*i)->pPostIt->Anchor()->GetSixthPosition().getX()),0)).X();
                    aAnchorPosY = mpEditWin->LogicToPixel( Point(0,(long)((*i)->pPostIt->Anchor()->GetSixthPosition().getY()))).Y() + 1;
                    (*i)->pPostIt->SetPosPixel(Point(aAnchorPosX,aAnchorPosY));
                }
            }
        }
    }
}


bool SwPostItMgr::ShowNotes() const
{
	// we only want to see notes if Options - Writer - View - Notes is ticked
	return mpWrtShell->GetViewOptions()->IsPostIts();
}

bool SwPostItMgr::HasNotes() const
{
	return !mvPostItFlds.empty();
}

unsigned long SwPostItMgr::GetSidebarWidth(bool bPx) const
{
	unsigned long aWidth = (unsigned long)(mpWrtShell->GetViewOptions()->GetZoom() * 1.8);
	if (bPx)
		return aWidth;
	else
		return mpEditWin->PixelToLogic(Size( aWidth ,0)).Width();
}

unsigned long SwPostItMgr::GetSidebarBorderWidth(bool bPx) const
{
	if (bPx)
		return 2;
	else
		return mpEditWin->PixelToLogic(Size(2,0)).Width();
}

unsigned long SwPostItMgr::GetNoteWidth()
{
	return GetSidebarWidth(true);
}

Color SwPostItMgr::GetColorDark(sal_uInt16 aAuthorIndex)
{
	if (!Application::GetSettings().GetStyleSettings().GetHighContrastMode())
	{
		static const Color aArrayNormal[] = {
			COL_AUTHOR1_NORMAL,		COL_AUTHOR2_NORMAL,		COL_AUTHOR3_NORMAL,
			COL_AUTHOR4_NORMAL,		COL_AUTHOR5_NORMAL,		COL_AUTHOR6_NORMAL,
			COL_AUTHOR7_NORMAL,		COL_AUTHOR8_NORMAL,		COL_AUTHOR9_NORMAL };

		return Color( aArrayNormal[ aAuthorIndex % (sizeof( aArrayNormal )/ sizeof( aArrayNormal[0] ))]);
	}
	else
		return Color(COL_WHITE);
}

Color SwPostItMgr::GetColorLight(sal_uInt16 aAuthorIndex)
{
	if (!Application::GetSettings().GetStyleSettings().GetHighContrastMode())
	{
		static const Color aArrayLight[] = {
			COL_AUTHOR1_LIGHT,		COL_AUTHOR2_LIGHT,		COL_AUTHOR3_LIGHT,
			COL_AUTHOR4_LIGHT,		COL_AUTHOR5_LIGHT,		COL_AUTHOR6_LIGHT,
			COL_AUTHOR7_LIGHT,		COL_AUTHOR8_LIGHT,		COL_AUTHOR9_LIGHT };

		return Color( aArrayLight[ aAuthorIndex % (sizeof( aArrayLight )/ sizeof( aArrayLight[0] ))]);
	}
	else
		return Color(COL_WHITE);
}

Color SwPostItMgr::GetColorAnchor(sal_uInt16 aAuthorIndex)
{
	if (!Application::GetSettings().GetStyleSettings().GetHighContrastMode())
	{
        static const Color aArrayAnchor[] = {
			COL_AUTHOR1_DARK,		COL_AUTHOR2_DARK,		COL_AUTHOR3_DARK,
			COL_AUTHOR4_DARK,		COL_AUTHOR5_DARK,		COL_AUTHOR6_DARK,
			COL_AUTHOR7_DARK,		COL_AUTHOR8_DARK,		COL_AUTHOR9_DARK };

        return Color( aArrayAnchor[  aAuthorIndex % (sizeof( aArrayAnchor )  / sizeof( aArrayAnchor[0] ))]);
	}
	else
		return Color(COL_WHITE);
}

void SwPostItMgr::SetActiveSidebarWin( SwSidebarWin* p)
{
	if ( p != mpActivePostIt )
	{
		// we need the temp variable so we can set mpActivePostIt before we call DeactivatePostIt
		// therefore we get a new layout in DOCCHANGED when switching from postit to document,
		// otherwise, GetActivePostIt() would still hold our old postit
        SwSidebarWin* pActive = mpActivePostIt;
		mpActivePostIt = p;
		if (pActive)
		{
			pActive->DeactivatePostIt();
			mShadowState.mpShadowFld = 0;
		}
		if (mpActivePostIt)
		{
			mpActivePostIt->GotoPos();
			mpView->AttrChangedNotify(0);
			mpActivePostIt->ActivatePostIt();
		}
	}
}

IMPL_LINK( SwPostItMgr, CalcHdl, void*, /* pVoid*/  )
{
	mnEventId = 0;
	if ( mbLayouting )
	{
		DBG_ERROR("Reentrance problem in Layout Manager!");
		mbWaitingForCalcRects = false;
		return 0;
	}

	// do not change order, even if it would seem so in the first place, we need the calcrects always
	if (CalcRects() || mbLayout)
	{
		mbLayout = false;
		LayoutPostIts();
	}
	return 0;
}

void SwPostItMgr::Rescale()
{
    for(std::list<SwSidebarItem*>::iterator i = mvPostItFlds.begin(); i!= mvPostItFlds.end() ; i++)
		if ( (*i)->pPostIt )
			(*i)->pPostIt->Rescale();
}

sal_Int32 SwPostItMgr::GetInitialAnchorDistance() const
{
	const Fraction& f( mpEditWin->GetMapMode().GetScaleY() );
    return POSTIT_INITIAL_ANCHOR_DISTANCE * f.GetNumerator() / f.GetDenominator();
}

sal_Int32 SwPostItMgr::GetSpaceBetween() const
{
	const Fraction& f( mpEditWin->GetMapMode().GetScaleY() );
	return ( POSTIT_SPACE_BETWEEN ) * f.GetNumerator() / f.GetDenominator();
}

sal_Int32 SwPostItMgr::GetScrollSize() const
{
	const Fraction& f( mpEditWin->GetMapMode().GetScaleY() );
	return ( POSTIT_SPACE_BETWEEN + POSTIT_MINIMUMSIZE_WITH_META ) * f.GetNumerator() / f.GetDenominator();
}

sal_Int32 SwPostItMgr::GetMinimumSizeWithMeta() const
{
	const Fraction& f( mpEditWin->GetMapMode().GetScaleY() );
	return POSTIT_MINIMUMSIZE_WITH_META * f.GetNumerator() / f.GetDenominator();
}

sal_Int32 SwPostItMgr::GetSidebarScrollerHeight() const
{
	const Fraction& f( mpEditWin->GetMapMode().GetScaleY() );
	return POSTIT_SCROLL_SIDEBAR_HEIGHT * f.GetNumerator() / f.GetDenominator();
}

void SwPostItMgr::SetSpellChecking()
{
    for(std::list<SwSidebarItem*>::iterator i = mvPostItFlds.begin(); i!= mvPostItFlds.end() ; i++)
		if ( (*i)->pPostIt )
			(*i)->pPostIt->SetSpellChecking();
}

void SwPostItMgr::SetReadOnlyState()
{
    for(std::list<SwSidebarItem*>::iterator i = mvPostItFlds.begin(); i!= mvPostItFlds.end() ; i++)
		if ( (*i)->pPostIt )
			(*i)->pPostIt->SetReadonly( mbReadOnly );
}

void SwPostItMgr::CheckMetaText()
{
        for(std::list<SwSidebarItem*>::iterator i = mvPostItFlds.begin(); i!= mvPostItFlds.end() ; i++)
                if ( (*i)->pPostIt )
                       (*i)->pPostIt->CheckMetaText();

}

sal_uInt16 SwPostItMgr::Replace(SvxSearchItem* pItem)
{
    SwSidebarWin* pWin = GetActiveSidebarWin();
    sal_uInt16 aResult = pWin->GetOutlinerView()->StartSearchAndReplace( *pItem );
	if (!aResult)
        SetActiveSidebarWin(0);
	return aResult;
}

sal_uInt16 SwPostItMgr::FinishSearchReplace(const ::com::sun::star::util::SearchOptions& rSearchOptions, bool bSrchForward)
{
    SwSidebarWin* pWin = GetActiveSidebarWin();
	SvxSearchItem aItem(SID_SEARCH_ITEM );
	aItem.SetSearchOptions(rSearchOptions);
	aItem.SetBackward(!bSrchForward);
    sal_uInt16 aResult = pWin->GetOutlinerView()->StartSearchAndReplace( aItem );
	if (!aResult)
        SetActiveSidebarWin(0);
	return aResult;
}

sal_uInt16 SwPostItMgr::SearchReplace(const SwFmtFld &pFld, const ::com::sun::star::util::SearchOptions& rSearchOptions, bool bSrchForward)
{
	sal_uInt16 aResult = 0;
    SwSidebarWin* pWin = GetSidebarWin(&pFld);
	if (pWin)
	{
        ESelection aOldSelection = pWin->GetOutlinerView()->GetSelection();
		if (bSrchForward)
            pWin->GetOutlinerView()->SetSelection(ESelection(0,0,0,0));
		else
            pWin->GetOutlinerView()->SetSelection(ESelection(0xFFFF,0xFFFF,0xFFFF,0xFFFF));
		SvxSearchItem aItem(SID_SEARCH_ITEM );
		aItem.SetSearchOptions(rSearchOptions);
		aItem.SetBackward(!bSrchForward);
        aResult = pWin->GetOutlinerView()->StartSearchAndReplace( aItem );
		if (!aResult)
            pWin->GetOutlinerView()->SetSelection(aOldSelection);
		else
		{
            SetActiveSidebarWin(pWin);
			MakeVisible(pWin);
		}
	}
	return aResult;
}

void SwPostItMgr::AssureStdModeAtShell()
{
	//#i103373# #i103645#
        // deselect any drawing or frame and leave editing mode
      	SdrView* pSdrView = mpWrtShell->GetDrawView();
        if ( pSdrView && pSdrView->IsTextEdit() )
        {
        	sal_Bool bLockView = mpWrtShell->IsViewLocked();
       		mpWrtShell->LockView( sal_True );
        	mpWrtShell->EndTextEdit();
                mpWrtShell->LockView( bLockView );
    	}

        if( mpWrtShell->IsSelFrmMode() || mpWrtShell->IsObjSelected())
        {
                mpWrtShell->UnSelectFrm();
                mpWrtShell->LeaveSelFrmMode();
                mpWrtShell->GetView().LeaveDrawCreate();
                mpWrtShell->EnterStdMode();

                mpWrtShell->DrawSelChanged();
                mpView->StopShellTimer();
        }
}

bool SwPostItMgr::HasActiveSidebarWin() const
{
    return mpActivePostIt != 0;
}

bool SwPostItMgr::HasActiveAnnotationWin() const
{
    return HasActiveSidebarWin() &&
           dynamic_cast<sw::annotation::SwAnnotationWin*>(mpActivePostIt) != 0;
}

void SwPostItMgr::GrabFocusOnActiveSidebarWin()
{
    if ( HasActiveSidebarWin() )
    {
        mpActivePostIt->GrabFocus();
    }
}

void SwPostItMgr::UpdateDataOnActiveSidebarWin()
{
    if ( HasActiveSidebarWin() )
    {
        mpActivePostIt->UpdateData();
    }
}

void SwPostItMgr::DeleteActiveSidebarWin()
{
    if ( HasActiveSidebarWin() )
    {
        mpActivePostIt->Delete();
    }
}

void SwPostItMgr::HideActiveSidebarWin()
{
    if ( HasActiveSidebarWin() )
    {
        mpActivePostIt->Hide();
    }
}

void SwPostItMgr::ToggleInsModeOnActiveSidebarWin()
{
    if ( HasActiveSidebarWin() )
    {
        mpActivePostIt->ToggleInsMode();
    }
}

void SwPostItMgr::ConnectSidebarWinToFrm( const SwFrm& rFrm,
                                          const SwFmtFld& rFmtFld,
                                          SwSidebarWin& rSidebarWin )
{
    if ( mpFrmSidebarWinContainer == 0 )
    {
        mpFrmSidebarWinContainer = new SwFrmSidebarWinContainer();
    }

    const bool bInserted = mpFrmSidebarWinContainer->insert( rFrm, rFmtFld, rSidebarWin );
    if ( bInserted &&
         mpWrtShell->GetAccessibleMap() )
    {
        mpWrtShell->GetAccessibleMap()->InvalidatePosOrSize( 0, 0, &rSidebarWin, SwRect() );
    }
}

void SwPostItMgr::DisconnectSidebarWinFromFrm( const SwFrm& rFrm,
                                               SwSidebarWin& rSidebarWin )
{
    if ( mpFrmSidebarWinContainer != 0 )
    {
        const bool bRemoved = mpFrmSidebarWinContainer->remove( rFrm, rSidebarWin );
        if ( bRemoved &&
             mpWrtShell->GetAccessibleMap() )
        {
            mpWrtShell->GetAccessibleMap()->Dispose( 0, 0, &rSidebarWin );
        }
    }
}

bool SwPostItMgr::HasFrmConnectedSidebarWins( const SwFrm& rFrm )
{
    bool bRet( false );

    if ( mpFrmSidebarWinContainer != 0 )
    {
        bRet = !mpFrmSidebarWinContainer->empty( rFrm );
    }

    return bRet;
}

Window* SwPostItMgr::GetSidebarWinForFrmByIndex( const SwFrm& rFrm,
                                                 const sal_Int32 nIndex )
{
    Window* pSidebarWin( 0 );

    if ( mpFrmSidebarWinContainer != 0 )
    {
        pSidebarWin = mpFrmSidebarWinContainer->get( rFrm, nIndex );
    }

    return pSidebarWin;
}

void SwPostItMgr::GetAllSidebarWinForFrm( const SwFrm& rFrm,
                                          std::vector< Window* >* pChildren )
{
    if ( mpFrmSidebarWinContainer != 0 )
    {
        mpFrmSidebarWinContainer->getAll( rFrm, pChildren );
    }
}

void SwNoteProps::Commit() {}
void SwNoteProps::Notify( const ::com::sun::star::uno::Sequence< rtl::OUString >& ) {}