blob: 08deba8cce090b3fd23fcdd8f0d9b9556d6e85b4 [file] [log] [blame]
/**************************************************************
*
* 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 existance 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 neccessary
// - place SwPostIts on their initial position
// - calculate neccessary 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 neccessary 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 neccessary 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 neccessary
// 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 >& ) {}