xref: /trunk/main/sw/source/ui/docvw/PostItMgr.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
29*cdf0e10cSrcweir #include "precompiled_sw.hxx"
30*cdf0e10cSrcweir 
31*cdf0e10cSrcweir #include "PostItMgr.hxx"
32*cdf0e10cSrcweir #include <postithelper.hxx>
33*cdf0e10cSrcweir 
34*cdf0e10cSrcweir #include <SidebarWin.hxx>
35*cdf0e10cSrcweir #include <AnnotationWin.hxx>
36*cdf0e10cSrcweir #include <frmsidebarwincontainer.hxx>
37*cdf0e10cSrcweir #include <accmap.hxx>
38*cdf0e10cSrcweir 
39*cdf0e10cSrcweir #include <SidebarWindowsConsts.hxx>
40*cdf0e10cSrcweir #include <AnchorOverlayObject.hxx>
41*cdf0e10cSrcweir #include <ShadowOverlayObject.hxx>
42*cdf0e10cSrcweir 
43*cdf0e10cSrcweir #include <vcl/svapp.hxx>
44*cdf0e10cSrcweir #include <vcl/scrbar.hxx>
45*cdf0e10cSrcweir #include <vcl/outdev.hxx>
46*cdf0e10cSrcweir 
47*cdf0e10cSrcweir #include <viewopt.hxx>
48*cdf0e10cSrcweir 
49*cdf0e10cSrcweir #include <view.hxx>
50*cdf0e10cSrcweir #include <docsh.hxx>
51*cdf0e10cSrcweir #include <wrtsh.hxx>
52*cdf0e10cSrcweir #include <doc.hxx>
53*cdf0e10cSrcweir #include <fldbas.hxx>
54*cdf0e10cSrcweir #include <fmtfld.hxx>
55*cdf0e10cSrcweir #include <docufld.hxx>
56*cdf0e10cSrcweir #include <edtwin.hxx>
57*cdf0e10cSrcweir #include <txtfld.hxx>
58*cdf0e10cSrcweir #include <ndtxt.hxx>
59*cdf0e10cSrcweir #include <redline.hxx>
60*cdf0e10cSrcweir #include <docary.hxx>
61*cdf0e10cSrcweir #include <SwRewriter.hxx>
62*cdf0e10cSrcweir #include <tools/color.hxx>
63*cdf0e10cSrcweir 
64*cdf0e10cSrcweir #include <swmodule.hxx>
65*cdf0e10cSrcweir #include <annotation.hrc>
66*cdf0e10cSrcweir #include "cmdid.h"
67*cdf0e10cSrcweir 
68*cdf0e10cSrcweir #include <sfx2/request.hxx>
69*cdf0e10cSrcweir #include <sfx2/event.hxx>
70*cdf0e10cSrcweir #include <svl/srchitem.hxx>
71*cdf0e10cSrcweir 
72*cdf0e10cSrcweir 
73*cdf0e10cSrcweir #include <svl/languageoptions.hxx>
74*cdf0e10cSrcweir #include <svtools/langtab.hxx>
75*cdf0e10cSrcweir #include <svl/smplhint.hxx>
76*cdf0e10cSrcweir 
77*cdf0e10cSrcweir #include <svx/svdview.hxx>
78*cdf0e10cSrcweir #include <editeng/eeitem.hxx>
79*cdf0e10cSrcweir #include <editeng/langitem.hxx>
80*cdf0e10cSrcweir #include <editeng/outliner.hxx>
81*cdf0e10cSrcweir 
82*cdf0e10cSrcweir #include <i18npool/mslangid.hxx>
83*cdf0e10cSrcweir #include <i18npool/lang.h>
84*cdf0e10cSrcweir 
85*cdf0e10cSrcweir #include "swevent.hxx"
86*cdf0e10cSrcweir #include "switerator.hxx"
87*cdf0e10cSrcweir 
88*cdf0e10cSrcweir // distance between Anchor Y and initial note position
89*cdf0e10cSrcweir #define POSTIT_INITIAL_ANCHOR_DISTANCE      20
90*cdf0e10cSrcweir //distance between two postits
91*cdf0e10cSrcweir #define POSTIT_SPACE_BETWEEN                8
92*cdf0e10cSrcweir #define POSTIT_MINIMUMSIZE_WITH_META        60
93*cdf0e10cSrcweir #define POSTIT_SCROLL_SIDEBAR_HEIGHT        20
94*cdf0e10cSrcweir 
95*cdf0e10cSrcweir // if we layout more often we stop, this should never happen
96*cdf0e10cSrcweir #define MAX_LOOP_COUNT                      50
97*cdf0e10cSrcweir 
98*cdf0e10cSrcweir using namespace sw::sidebarwindows;
99*cdf0e10cSrcweir 
100*cdf0e10cSrcweir /*
101*cdf0e10cSrcweir bool comp_author( const SwPostItItem* a, const SwPostItItem* b)
102*cdf0e10cSrcweir {
103*cdf0e10cSrcweir     return a->pFmtFld->GetFld()->GetPar1() < b->pFmtFld->GetFld()->GetPar1();
104*cdf0e10cSrcweir }
105*cdf0e10cSrcweir 
106*cdf0e10cSrcweir bool comp_date( const SwPostItItem* a, const SwPostItItem* b)
107*cdf0e10cSrcweir {
108*cdf0e10cSrcweir     return static_cast<SwPostItField*>(a->pFmtFld->GetFld())->GetDate()  < static_cast<SwPostItField*>(b->pFmtFld->GetFld())->GetDate();
109*cdf0e10cSrcweir }
110*cdf0e10cSrcweir */
111*cdf0e10cSrcweir 
112*cdf0e10cSrcweir //
113*cdf0e10cSrcweir bool comp_pos(const SwSidebarItem* a, const SwSidebarItem* b)
114*cdf0e10cSrcweir {
115*cdf0e10cSrcweir     // --> OD 2010-01-19 #i88070#
116*cdf0e10cSrcweir     // sort by anchor position
117*cdf0e10cSrcweir //// if position is on the same line, sort by x (Left) position, otherwise by y(Bottom) position
118*cdf0e10cSrcweir //// if two notes are at the same position, sort by logical node position
119*cdf0e10cSrcweir //    return (a->maLayoutInfo.mPosition.Bottom() == b->maLayoutInfo.mPosition.Bottom())
120*cdf0e10cSrcweir //            ? ( ( (a->maLayoutInfo.mPosition.Left() == b->maLayoutInfo.mPosition.Left()) &&
121*cdf0e10cSrcweir //                  (a->GetBroadCaster()->ISA(SwFmtFld) && b->GetBroadCaster()->ISA(SwFmtFld)) )
122*cdf0e10cSrcweir //                ? *(static_cast<SwFmtFld*>(a->GetBroadCaster())->GetTxtFld()->GetStart()) <
123*cdf0e10cSrcweir //                    *(static_cast<SwFmtFld*>(b->GetBroadCaster())->GetTxtFld()->GetStart())
124*cdf0e10cSrcweir //                : a->maLayoutInfo.mPosition.Left() < b->maLayoutInfo.mPosition.Left() )
125*cdf0e10cSrcweir //            : a->maLayoutInfo.mPosition.Bottom() < b->maLayoutInfo.mPosition.Bottom();
126*cdf0e10cSrcweir     return a->GetAnchorPosition() < b->GetAnchorPosition();
127*cdf0e10cSrcweir     // <--
128*cdf0e10cSrcweir }
129*cdf0e10cSrcweir 
130*cdf0e10cSrcweir SwPostItMgr::SwPostItMgr(SwView* pView)
131*cdf0e10cSrcweir     : mpView(pView)
132*cdf0e10cSrcweir     , mpWrtShell(mpView->GetDocShell()->GetWrtShell())
133*cdf0e10cSrcweir     , mpEditWin(&mpView->GetEditWin())
134*cdf0e10cSrcweir     , mnEventId(0)
135*cdf0e10cSrcweir     , mbWaitingForCalcRects(false)
136*cdf0e10cSrcweir     , mpActivePostIt(0)
137*cdf0e10cSrcweir     , mbLayout(false)
138*cdf0e10cSrcweir     , mbLayoutHeight(0)
139*cdf0e10cSrcweir     , mbLayouting(false)
140*cdf0e10cSrcweir     , mbReadOnly(mpView->GetDocShell()->IsReadOnly())
141*cdf0e10cSrcweir     , mbDeleteNote(true)
142*cdf0e10cSrcweir     , mpAnswer(0)
143*cdf0e10cSrcweir     , mbIsShowAnchor( false )
144*cdf0e10cSrcweir     , mpFrmSidebarWinContainer( 0 )
145*cdf0e10cSrcweir {
146*cdf0e10cSrcweir     if(!mpView->GetDrawView() )
147*cdf0e10cSrcweir         mpView->GetWrtShell().MakeDrawView();
148*cdf0e10cSrcweir 
149*cdf0e10cSrcweir     SwNoteProps aProps;
150*cdf0e10cSrcweir     mbIsShowAnchor = aProps.IsShowAnchor();
151*cdf0e10cSrcweir 
152*cdf0e10cSrcweir     //make sure we get the colour yellow always, even if not the first one of comments or redlining
153*cdf0e10cSrcweir     SW_MOD()->GetRedlineAuthor();
154*cdf0e10cSrcweir 
155*cdf0e10cSrcweir     // collect all PostIts and redline comments that exist after loading the document
156*cdf0e10cSrcweir     // don't check for existance for any of them, don't focus them
157*cdf0e10cSrcweir     AddPostIts(false,false);
158*cdf0e10cSrcweir     /*  this code can be used once we want redline comments in the Sidebar
159*cdf0e10cSrcweir     AddRedlineComments(false,false);
160*cdf0e10cSrcweir     */
161*cdf0e10cSrcweir     // we want to receive stuff like SFX_HINT_DOCCHANGED
162*cdf0e10cSrcweir     StartListening(*mpView->GetDocShell());
163*cdf0e10cSrcweir     if (!mvPostItFlds.empty())
164*cdf0e10cSrcweir     {
165*cdf0e10cSrcweir         mbWaitingForCalcRects = true;
166*cdf0e10cSrcweir         mnEventId = Application::PostUserEvent( LINK( this, SwPostItMgr, CalcHdl), 0 );
167*cdf0e10cSrcweir     }
168*cdf0e10cSrcweir }
169*cdf0e10cSrcweir 
170*cdf0e10cSrcweir SwPostItMgr::~SwPostItMgr()
171*cdf0e10cSrcweir {
172*cdf0e10cSrcweir     if ( mnEventId )
173*cdf0e10cSrcweir         Application::RemoveUserEvent( mnEventId );
174*cdf0e10cSrcweir     // forget about all our Sidebar windows
175*cdf0e10cSrcweir     RemoveSidebarWin();
176*cdf0e10cSrcweir     EndListening( *mpView->GetDocShell() );
177*cdf0e10cSrcweir 
178*cdf0e10cSrcweir     for(std::vector<SwPostItPageItem*>::iterator i = mPages.begin(); i!= mPages.end() ; i++)
179*cdf0e10cSrcweir         delete (*i);
180*cdf0e10cSrcweir     mPages.clear();
181*cdf0e10cSrcweir 
182*cdf0e10cSrcweir     delete mpFrmSidebarWinContainer;
183*cdf0e10cSrcweir     mpFrmSidebarWinContainer = 0;
184*cdf0e10cSrcweir }
185*cdf0e10cSrcweir 
186*cdf0e10cSrcweir void SwPostItMgr::CheckForRemovedPostIts()
187*cdf0e10cSrcweir {
188*cdf0e10cSrcweir     bool bRemoved = false;
189*cdf0e10cSrcweir     for(std::list<SwSidebarItem*>::iterator i = mvPostItFlds.begin(); i!= mvPostItFlds.end(); )
190*cdf0e10cSrcweir     {
191*cdf0e10cSrcweir         std::list<SwSidebarItem*>::iterator it = i++;
192*cdf0e10cSrcweir         if ( !(*it)->UseElement() )
193*cdf0e10cSrcweir         {
194*cdf0e10cSrcweir             SwSidebarItem* p = (*it);
195*cdf0e10cSrcweir             mvPostItFlds.remove(*it);
196*cdf0e10cSrcweir             if (GetActiveSidebarWin() == p->pPostIt)
197*cdf0e10cSrcweir                 SetActiveSidebarWin(0);
198*cdf0e10cSrcweir             if (p->pPostIt)
199*cdf0e10cSrcweir                 delete p->pPostIt;
200*cdf0e10cSrcweir             delete p;
201*cdf0e10cSrcweir             bRemoved = true;
202*cdf0e10cSrcweir         }
203*cdf0e10cSrcweir     }
204*cdf0e10cSrcweir 
205*cdf0e10cSrcweir     if ( bRemoved )
206*cdf0e10cSrcweir     {
207*cdf0e10cSrcweir         // make sure that no deleted items remain in page lists
208*cdf0e10cSrcweir         // todo: only remove deleted ones?!
209*cdf0e10cSrcweir         if ( mvPostItFlds.empty() )
210*cdf0e10cSrcweir         {
211*cdf0e10cSrcweir             PreparePageContainer();
212*cdf0e10cSrcweir             PrepareView();
213*cdf0e10cSrcweir         }
214*cdf0e10cSrcweir         else
215*cdf0e10cSrcweir             // if postits are their make sure that page lists are not empty
216*cdf0e10cSrcweir             // otherwise sudden paints can cause pain (in BorderOverPageBorder)
217*cdf0e10cSrcweir             CalcRects();
218*cdf0e10cSrcweir     }
219*cdf0e10cSrcweir }
220*cdf0e10cSrcweir 
221*cdf0e10cSrcweir void SwPostItMgr::InsertItem(SfxBroadcaster* pItem, bool bCheckExistance, bool bFocus)
222*cdf0e10cSrcweir {
223*cdf0e10cSrcweir     if (bCheckExistance)
224*cdf0e10cSrcweir     {
225*cdf0e10cSrcweir         for(std::list<SwSidebarItem*>::iterator i = mvPostItFlds.begin(); i!= mvPostItFlds.end() ; i++)
226*cdf0e10cSrcweir         {
227*cdf0e10cSrcweir             if ( (*i)->GetBroadCaster() == pItem )
228*cdf0e10cSrcweir                 return;
229*cdf0e10cSrcweir         }
230*cdf0e10cSrcweir     }
231*cdf0e10cSrcweir     mbLayout = bFocus;
232*cdf0e10cSrcweir     if (pItem->ISA(SwFmtFld))
233*cdf0e10cSrcweir         mvPostItFlds.push_back(new SwAnnotationItem(static_cast<SwFmtFld*>(pItem), true, bFocus) );
234*cdf0e10cSrcweir     /*
235*cdf0e10cSrcweir     else
236*cdf0e10cSrcweir     if (pItem->ISA(SwRedline))
237*cdf0e10cSrcweir         mvPostItFlds.push_back(new SwRedCommentItem( static_cast<SwRedline*>(pItem), true, bFocus)) ;
238*cdf0e10cSrcweir     */
239*cdf0e10cSrcweir     DBG_ASSERT(pItem->ISA(SwFmtFld) /*|| pItem->ISA(SwRedline)*/,"Mgr::InsertItem: seems like new stuff was added");
240*cdf0e10cSrcweir     StartListening(*pItem);
241*cdf0e10cSrcweir }
242*cdf0e10cSrcweir 
243*cdf0e10cSrcweir void SwPostItMgr::RemoveItem( SfxBroadcaster* pBroadcast )
244*cdf0e10cSrcweir {
245*cdf0e10cSrcweir     EndListening(*pBroadcast);
246*cdf0e10cSrcweir     for(std::list<SwSidebarItem*>::iterator i = mvPostItFlds.begin(); i!= mvPostItFlds.end() ; i++)
247*cdf0e10cSrcweir     {
248*cdf0e10cSrcweir         if ( (*i)->GetBroadCaster() == pBroadcast )
249*cdf0e10cSrcweir         {
250*cdf0e10cSrcweir             SwSidebarItem* p = (*i);
251*cdf0e10cSrcweir             if (GetActiveSidebarWin() == p->pPostIt)
252*cdf0e10cSrcweir                 SetActiveSidebarWin(0);
253*cdf0e10cSrcweir             mvPostItFlds.remove(*i);
254*cdf0e10cSrcweir             delete p->pPostIt;
255*cdf0e10cSrcweir             delete p;
256*cdf0e10cSrcweir             break;
257*cdf0e10cSrcweir         }
258*cdf0e10cSrcweir     }
259*cdf0e10cSrcweir     mbLayout = true;
260*cdf0e10cSrcweir     PrepareView();
261*cdf0e10cSrcweir }
262*cdf0e10cSrcweir 
263*cdf0e10cSrcweir void SwPostItMgr::Notify( SfxBroadcaster& rBC, const SfxHint& rHint )
264*cdf0e10cSrcweir {
265*cdf0e10cSrcweir     if ( rHint.IsA(TYPE(SfxEventHint) ) )
266*cdf0e10cSrcweir     {
267*cdf0e10cSrcweir         sal_uInt32 nId = ((SfxEventHint&)rHint).GetEventId();
268*cdf0e10cSrcweir         if ( nId == SW_EVENT_LAYOUT_FINISHED )
269*cdf0e10cSrcweir         {
270*cdf0e10cSrcweir             if ( !mbWaitingForCalcRects && !mvPostItFlds.empty())
271*cdf0e10cSrcweir             {
272*cdf0e10cSrcweir                 mbWaitingForCalcRects = true;
273*cdf0e10cSrcweir                 mnEventId = Application::PostUserEvent( LINK( this, SwPostItMgr, CalcHdl), 0 );
274*cdf0e10cSrcweir             }
275*cdf0e10cSrcweir         }
276*cdf0e10cSrcweir     }
277*cdf0e10cSrcweir     else if ( rHint.IsA(TYPE(SfxSimpleHint) ) )
278*cdf0e10cSrcweir     {
279*cdf0e10cSrcweir         sal_uInt32 nId = ((SfxSimpleHint&)rHint).GetId();
280*cdf0e10cSrcweir         switch ( nId )
281*cdf0e10cSrcweir         {
282*cdf0e10cSrcweir             case SFX_HINT_MODECHANGED:
283*cdf0e10cSrcweir             {
284*cdf0e10cSrcweir                 if ( mbReadOnly != !!(mpView->GetDocShell()->IsReadOnly()) )
285*cdf0e10cSrcweir                 {
286*cdf0e10cSrcweir                     mbReadOnly = !mbReadOnly;
287*cdf0e10cSrcweir                     SetReadOnlyState();
288*cdf0e10cSrcweir                     mbLayout = true;
289*cdf0e10cSrcweir                 }
290*cdf0e10cSrcweir                 break;
291*cdf0e10cSrcweir             }
292*cdf0e10cSrcweir             case SFX_HINT_DOCCHANGED:
293*cdf0e10cSrcweir             {
294*cdf0e10cSrcweir                 if ( mpView->GetDocShell() == &rBC )
295*cdf0e10cSrcweir                 {
296*cdf0e10cSrcweir                     if ( !mbWaitingForCalcRects && !mvPostItFlds.empty())
297*cdf0e10cSrcweir                     {
298*cdf0e10cSrcweir                         mbWaitingForCalcRects = true;
299*cdf0e10cSrcweir                         mnEventId = Application::PostUserEvent( LINK( this, SwPostItMgr, CalcHdl), 0 );
300*cdf0e10cSrcweir                     }
301*cdf0e10cSrcweir                 }
302*cdf0e10cSrcweir                 break;
303*cdf0e10cSrcweir             }
304*cdf0e10cSrcweir             case SFX_HINT_USER04:
305*cdf0e10cSrcweir             {
306*cdf0e10cSrcweir                 // if we are in a SplitNode/Cut operation, do not delete note and then add again, as this will flicker
307*cdf0e10cSrcweir                 mbDeleteNote = !mbDeleteNote;
308*cdf0e10cSrcweir                 break;
309*cdf0e10cSrcweir             }
310*cdf0e10cSrcweir             case SFX_HINT_DYING:
311*cdf0e10cSrcweir             {
312*cdf0e10cSrcweir                 if ( mpView->GetDocShell() != &rBC )
313*cdf0e10cSrcweir                 {
314*cdf0e10cSrcweir                     // field to be removed is the broadcaster
315*cdf0e10cSrcweir                     DBG_ERROR("Notification for removed SwFmtFld was not sent!");
316*cdf0e10cSrcweir                     RemoveItem(&rBC);
317*cdf0e10cSrcweir                 }
318*cdf0e10cSrcweir                 break;
319*cdf0e10cSrcweir             }
320*cdf0e10cSrcweir         }
321*cdf0e10cSrcweir     }
322*cdf0e10cSrcweir     /*
323*cdf0e10cSrcweir     else if ( rHint.IsA(TYPE(SwRedlineHint) ) )
324*cdf0e10cSrcweir     {
325*cdf0e10cSrcweir         const SwRedlineHint rRedlineHint = static_cast<const SwRedlineHint&>(rHint);
326*cdf0e10cSrcweir         SwRedline* pRedline = const_cast<SwRedline*>(rRedlineHint.GetRedline());
327*cdf0e10cSrcweir         switch ( rRedlineHint.Which() )
328*cdf0e10cSrcweir         {
329*cdf0e10cSrcweir             case SWREDLINE_INSERTED :
330*cdf0e10cSrcweir             {
331*cdf0e10cSrcweir                 bool bEmpty = !HasNotes();
332*cdf0e10cSrcweir                 InsertItem( pRedline, true, false );
333*cdf0e10cSrcweir                 if (bEmpty && !mvPostItFlds.empty())
334*cdf0e10cSrcweir                     PrepareView(true);
335*cdf0e10cSrcweir                 break;
336*cdf0e10cSrcweir             }
337*cdf0e10cSrcweir             case SWREDLINE_REMOVED:
338*cdf0e10cSrcweir             {
339*cdf0e10cSrcweir                 RemoveItem(pRedline);
340*cdf0e10cSrcweir                 break;
341*cdf0e10cSrcweir             }
342*cdf0e10cSrcweir             case SWREDLINE_FOCUS:
343*cdf0e10cSrcweir             {
344*cdf0e10cSrcweir                                 if (rRedlineHint.GetView()== mpView)
345*cdf0e10cSrcweir                     Focus(rBC);
346*cdf0e10cSrcweir                 break;
347*cdf0e10cSrcweir             }
348*cdf0e10cSrcweir         }
349*cdf0e10cSrcweir     }
350*cdf0e10cSrcweir     */
351*cdf0e10cSrcweir     else if ( rHint.IsA(TYPE(SwFmtFldHint) ) )
352*cdf0e10cSrcweir     {
353*cdf0e10cSrcweir         const SwFmtFldHint& rFmtHint = static_cast<const SwFmtFldHint&>(rHint);
354*cdf0e10cSrcweir         SwFmtFld* pFld = const_cast <SwFmtFld*>( rFmtHint.GetField() );
355*cdf0e10cSrcweir         switch ( rFmtHint.Which() )
356*cdf0e10cSrcweir         {
357*cdf0e10cSrcweir             case SWFMTFLD_INSERTED :
358*cdf0e10cSrcweir             {
359*cdf0e10cSrcweir                 if (!pFld)
360*cdf0e10cSrcweir                 {
361*cdf0e10cSrcweir                     AddPostIts(true);
362*cdf0e10cSrcweir                     break;
363*cdf0e10cSrcweir                 }
364*cdf0e10cSrcweir                 // get field to be inserted from hint
365*cdf0e10cSrcweir                 if ( pFld->IsFldInDoc() )
366*cdf0e10cSrcweir                 {
367*cdf0e10cSrcweir                     bool bEmpty = !HasNotes();
368*cdf0e10cSrcweir                     InsertItem( pFld, true, false );
369*cdf0e10cSrcweir                     if (bEmpty && !mvPostItFlds.empty())
370*cdf0e10cSrcweir                         PrepareView(true);
371*cdf0e10cSrcweir                 }
372*cdf0e10cSrcweir                 else
373*cdf0e10cSrcweir                 {
374*cdf0e10cSrcweir                     DBG_ERROR( "Inserted field not in document!" );
375*cdf0e10cSrcweir                         }
376*cdf0e10cSrcweir                 break;
377*cdf0e10cSrcweir             }
378*cdf0e10cSrcweir             case SWFMTFLD_REMOVED:
379*cdf0e10cSrcweir             {
380*cdf0e10cSrcweir                 if (mbDeleteNote)
381*cdf0e10cSrcweir                 {
382*cdf0e10cSrcweir                     if (!pFld)
383*cdf0e10cSrcweir                     {
384*cdf0e10cSrcweir                         CheckForRemovedPostIts();
385*cdf0e10cSrcweir                         break;
386*cdf0e10cSrcweir                     }
387*cdf0e10cSrcweir                     RemoveItem(pFld);
388*cdf0e10cSrcweir                 }
389*cdf0e10cSrcweir                 break;
390*cdf0e10cSrcweir             }
391*cdf0e10cSrcweir             case SWFMTFLD_FOCUS:
392*cdf0e10cSrcweir             {
393*cdf0e10cSrcweir                     if (rFmtHint.GetView()== mpView)
394*cdf0e10cSrcweir                     Focus(rBC);
395*cdf0e10cSrcweir                 break;
396*cdf0e10cSrcweir             }
397*cdf0e10cSrcweir             case SWFMTFLD_CHANGED:
398*cdf0e10cSrcweir             {
399*cdf0e10cSrcweir                         SwFmtFld* pFmtFld = dynamic_cast<SwFmtFld*>(&rBC);
400*cdf0e10cSrcweir                 for(std::list<SwSidebarItem*>::iterator i = mvPostItFlds.begin(); i!= mvPostItFlds.end() ; i++)
401*cdf0e10cSrcweir                 {
402*cdf0e10cSrcweir                             if ( pFmtFld == (*i)->GetBroadCaster() )
403*cdf0e10cSrcweir                     {
404*cdf0e10cSrcweir                         if ((*i)->pPostIt)
405*cdf0e10cSrcweir                         {
406*cdf0e10cSrcweir                             (*i)->pPostIt->SetPostItText();
407*cdf0e10cSrcweir                             mbLayout = true;
408*cdf0e10cSrcweir                         }
409*cdf0e10cSrcweir                         break;
410*cdf0e10cSrcweir                     }
411*cdf0e10cSrcweir                 }
412*cdf0e10cSrcweir                 break;
413*cdf0e10cSrcweir             }
414*cdf0e10cSrcweir             case SWFMTFLD_LANGUAGE:
415*cdf0e10cSrcweir             {
416*cdf0e10cSrcweir                         SwFmtFld* pFmtFld = dynamic_cast<SwFmtFld*>(&rBC);
417*cdf0e10cSrcweir                 for(std::list<SwSidebarItem*>::iterator i = mvPostItFlds.begin(); i!= mvPostItFlds.end() ; i++)
418*cdf0e10cSrcweir                 {
419*cdf0e10cSrcweir                                 if ( pFmtFld == (*i)->GetBroadCaster() )
420*cdf0e10cSrcweir                     {
421*cdf0e10cSrcweir                         if ((*i)->pPostIt)
422*cdf0e10cSrcweir                         {
423*cdf0e10cSrcweir                             sal_uInt16 nScriptType = SvtLanguageOptions::GetScriptTypeOfLanguage( (*i)->GetFmtFld()->GetFld()->GetLanguage() );
424*cdf0e10cSrcweir                             sal_uInt16 nLangWhichId = 0;
425*cdf0e10cSrcweir                             switch (nScriptType)
426*cdf0e10cSrcweir                             {
427*cdf0e10cSrcweir                                 case SCRIPTTYPE_LATIN :    nLangWhichId = EE_CHAR_LANGUAGE ; break;
428*cdf0e10cSrcweir                                 case SCRIPTTYPE_ASIAN :    nLangWhichId = EE_CHAR_LANGUAGE_CJK; break;
429*cdf0e10cSrcweir                                 case SCRIPTTYPE_COMPLEX :  nLangWhichId = EE_CHAR_LANGUAGE_CTL; break;
430*cdf0e10cSrcweir                             }
431*cdf0e10cSrcweir                             (*i)->pPostIt->SetLanguage( SvxLanguageItem((*i)->GetFmtFld()->GetFld()->GetLanguage(),
432*cdf0e10cSrcweir                                                         nLangWhichId) );
433*cdf0e10cSrcweir                         }
434*cdf0e10cSrcweir                         break;
435*cdf0e10cSrcweir                     }
436*cdf0e10cSrcweir                 }
437*cdf0e10cSrcweir                 break;
438*cdf0e10cSrcweir             }
439*cdf0e10cSrcweir         }
440*cdf0e10cSrcweir     }
441*cdf0e10cSrcweir }
442*cdf0e10cSrcweir 
443*cdf0e10cSrcweir void SwPostItMgr::Focus(SfxBroadcaster& rBC)
444*cdf0e10cSrcweir {
445*cdf0e10cSrcweir     if (!mpWrtShell->GetViewOptions()->IsPostIts())
446*cdf0e10cSrcweir     {
447*cdf0e10cSrcweir         SfxRequest aRequest(mpView->GetViewFrame(),FN_VIEW_NOTES);
448*cdf0e10cSrcweir         mpView->ExecViewOptions(aRequest);
449*cdf0e10cSrcweir     }
450*cdf0e10cSrcweir 
451*cdf0e10cSrcweir     for(std::list<SwSidebarItem*>::iterator i = mvPostItFlds.begin(); i!= mvPostItFlds.end() ; i++)
452*cdf0e10cSrcweir     {
453*cdf0e10cSrcweir         // field to get the focus is the broadcaster
454*cdf0e10cSrcweir         if ( &rBC == (*i)->GetBroadCaster() )
455*cdf0e10cSrcweir         {
456*cdf0e10cSrcweir             if ((*i)->pPostIt)
457*cdf0e10cSrcweir             {
458*cdf0e10cSrcweir                 (*i)->pPostIt->GrabFocus();
459*cdf0e10cSrcweir                 MakeVisible((*i)->pPostIt);
460*cdf0e10cSrcweir             }
461*cdf0e10cSrcweir             else
462*cdf0e10cSrcweir             {
463*cdf0e10cSrcweir                 // when the layout algorithm starts, this postit is created and receives focus
464*cdf0e10cSrcweir                 (*i)->bFocus = true;
465*cdf0e10cSrcweir             }
466*cdf0e10cSrcweir         }
467*cdf0e10cSrcweir     }
468*cdf0e10cSrcweir }
469*cdf0e10cSrcweir 
470*cdf0e10cSrcweir bool SwPostItMgr::CalcRects()
471*cdf0e10cSrcweir {
472*cdf0e10cSrcweir     if ( mnEventId )
473*cdf0e10cSrcweir     {
474*cdf0e10cSrcweir         // if CalcRects() was forced and an event is still pending: remove it
475*cdf0e10cSrcweir         // it is superfluous and also may cause reentrance problems if triggered while layouting
476*cdf0e10cSrcweir         Application::RemoveUserEvent( mnEventId );
477*cdf0e10cSrcweir         mnEventId = 0;
478*cdf0e10cSrcweir     }
479*cdf0e10cSrcweir 
480*cdf0e10cSrcweir     bool bChange = false;
481*cdf0e10cSrcweir     bool bRepair = false;
482*cdf0e10cSrcweir     PreparePageContainer();
483*cdf0e10cSrcweir     if ( !mvPostItFlds.empty() )
484*cdf0e10cSrcweir     {
485*cdf0e10cSrcweir         for(std::list<SwSidebarItem*>::iterator i = mvPostItFlds.begin(); i!= mvPostItFlds.end() ; i++)
486*cdf0e10cSrcweir         {
487*cdf0e10cSrcweir             SwSidebarItem* pItem = (*i);
488*cdf0e10cSrcweir             if ( !pItem->UseElement() )
489*cdf0e10cSrcweir             {
490*cdf0e10cSrcweir                 DBG_ERROR("PostIt is not in doc or other wrong use");
491*cdf0e10cSrcweir                 bRepair = true;
492*cdf0e10cSrcweir                 continue;
493*cdf0e10cSrcweir             }
494*cdf0e10cSrcweir 
495*cdf0e10cSrcweir             //save old rect and visible state
496*cdf0e10cSrcweir             SwRect aOldRect(pItem->maLayoutInfo.mPosition);
497*cdf0e10cSrcweir             SwPostItHelper::SwLayoutStatus eOldStatus = pItem->mLayoutStatus;
498*cdf0e10cSrcweir             std::vector< SwLayoutInfo > aInfo;
499*cdf0e10cSrcweir             {
500*cdf0e10cSrcweir                 SwPosition aPosition = pItem->GetAnchorPosition();
501*cdf0e10cSrcweir                 pItem->mLayoutStatus = SwPostItHelper::getLayoutInfos( aInfo, aPosition );
502*cdf0e10cSrcweir             }
503*cdf0e10cSrcweir             if( aInfo.size() )
504*cdf0e10cSrcweir             {
505*cdf0e10cSrcweir                 pItem->maLayoutInfo = aInfo[0];
506*cdf0e10cSrcweir             }
507*cdf0e10cSrcweir             bChange = bChange ||
508*cdf0e10cSrcweir                       ( pItem->maLayoutInfo.mPosition != aOldRect ) ||
509*cdf0e10cSrcweir                       ( eOldStatus != pItem->mLayoutStatus );
510*cdf0e10cSrcweir         }
511*cdf0e10cSrcweir 
512*cdf0e10cSrcweir         // show notes in right order in navigator
513*cdf0e10cSrcweir         //prevent Anchors during layout to overlap, e.g. when moving a frame
514*cdf0e10cSrcweir         Sort(SORT_POS);
515*cdf0e10cSrcweir 
516*cdf0e10cSrcweir         // sort the items into the right page vector, so layout can be done by page
517*cdf0e10cSrcweir         for(std::list<SwSidebarItem*>::iterator i = mvPostItFlds.begin(); i!= mvPostItFlds.end() ; i++)
518*cdf0e10cSrcweir         {
519*cdf0e10cSrcweir             SwSidebarItem* pItem = (*i);
520*cdf0e10cSrcweir             if( SwPostItHelper::INVISIBLE == pItem->mLayoutStatus )
521*cdf0e10cSrcweir             {
522*cdf0e10cSrcweir                 if (pItem->pPostIt)
523*cdf0e10cSrcweir                     pItem->pPostIt->HideNote();
524*cdf0e10cSrcweir                 continue;
525*cdf0e10cSrcweir             }
526*cdf0e10cSrcweir 
527*cdf0e10cSrcweir             if( SwPostItHelper::HIDDEN == pItem->mLayoutStatus )
528*cdf0e10cSrcweir             {
529*cdf0e10cSrcweir                 if (!mpWrtShell->GetViewOptions()->IsShowHiddenChar())
530*cdf0e10cSrcweir                 {
531*cdf0e10cSrcweir                     if (pItem->pPostIt)
532*cdf0e10cSrcweir                         pItem->pPostIt->HideNote();
533*cdf0e10cSrcweir                     continue;
534*cdf0e10cSrcweir                 }
535*cdf0e10cSrcweir             }
536*cdf0e10cSrcweir 
537*cdf0e10cSrcweir             const unsigned long aPageNum = pItem->maLayoutInfo.mnPageNumber;
538*cdf0e10cSrcweir             if (aPageNum > mPages.size())
539*cdf0e10cSrcweir             {
540*cdf0e10cSrcweir                 const unsigned long nNumberOfPages = mPages.size();
541*cdf0e10cSrcweir                 for (unsigned int j=0; j<aPageNum - nNumberOfPages; ++j)
542*cdf0e10cSrcweir                     mPages.push_back( new SwPostItPageItem());
543*cdf0e10cSrcweir             }
544*cdf0e10cSrcweir             mPages[aPageNum-1]->mList->push_back(pItem);
545*cdf0e10cSrcweir             mPages[aPageNum-1]->mPageRect = pItem->maLayoutInfo.mPageFrame;
546*cdf0e10cSrcweir             mPages[aPageNum-1]->eSidebarPosition = pItem->maLayoutInfo.meSidebarPosition;
547*cdf0e10cSrcweir         }
548*cdf0e10cSrcweir 
549*cdf0e10cSrcweir         if (!bChange && mpWrtShell->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE))
550*cdf0e10cSrcweir         {
551*cdf0e10cSrcweir             long nLayoutHeight = SwPostItHelper::getLayoutHeight( mpWrtShell->GetLayout() );
552*cdf0e10cSrcweir             if( nLayoutHeight > mbLayoutHeight )
553*cdf0e10cSrcweir             {
554*cdf0e10cSrcweir                 if (mPages[0]->bScrollbar || HasScrollbars())
555*cdf0e10cSrcweir                     bChange = true;
556*cdf0e10cSrcweir             }
557*cdf0e10cSrcweir             else if( nLayoutHeight < mbLayoutHeight )
558*cdf0e10cSrcweir             {
559*cdf0e10cSrcweir                 if (mPages[0]->bScrollbar || !BorderOverPageBorder(1))
560*cdf0e10cSrcweir                     bChange = true;
561*cdf0e10cSrcweir             }
562*cdf0e10cSrcweir         }
563*cdf0e10cSrcweir     }
564*cdf0e10cSrcweir 
565*cdf0e10cSrcweir     if ( bRepair )
566*cdf0e10cSrcweir         CheckForRemovedPostIts();
567*cdf0e10cSrcweir 
568*cdf0e10cSrcweir     mbLayoutHeight = SwPostItHelper::getLayoutHeight( mpWrtShell->GetLayout() );
569*cdf0e10cSrcweir     mbWaitingForCalcRects = false;
570*cdf0e10cSrcweir     return bChange;
571*cdf0e10cSrcweir }
572*cdf0e10cSrcweir 
573*cdf0e10cSrcweir bool SwPostItMgr::HasScrollbars() const
574*cdf0e10cSrcweir {
575*cdf0e10cSrcweir     for(std::list<SwSidebarItem*>::const_iterator i = mvPostItFlds.begin(); i!= mvPostItFlds.end() ; i++)
576*cdf0e10cSrcweir     {
577*cdf0e10cSrcweir         if ((*i)->bShow && (*i)->pPostIt && (*i)->pPostIt->HasScrollbar())
578*cdf0e10cSrcweir             return true;
579*cdf0e10cSrcweir     }
580*cdf0e10cSrcweir     return false;
581*cdf0e10cSrcweir }
582*cdf0e10cSrcweir 
583*cdf0e10cSrcweir void SwPostItMgr::PreparePageContainer()
584*cdf0e10cSrcweir {
585*cdf0e10cSrcweir     // we do not just delete the SwPostItPageItem, so offset/scrollbar is not lost
586*cdf0e10cSrcweir     long lPageSize = mpWrtShell->GetNumPages();
587*cdf0e10cSrcweir     long lContainerSize = mPages.size();
588*cdf0e10cSrcweir 
589*cdf0e10cSrcweir     if (lContainerSize < lPageSize)
590*cdf0e10cSrcweir     {
591*cdf0e10cSrcweir         for (int i=0; i<lPageSize - lContainerSize;i++)
592*cdf0e10cSrcweir             mPages.push_back( new SwPostItPageItem());
593*cdf0e10cSrcweir     }
594*cdf0e10cSrcweir     else
595*cdf0e10cSrcweir     if (lContainerSize > lPageSize)
596*cdf0e10cSrcweir     {
597*cdf0e10cSrcweir         for (int i=mPages.size()-1; i >= lPageSize;--i)
598*cdf0e10cSrcweir         {
599*cdf0e10cSrcweir             delete mPages[i];
600*cdf0e10cSrcweir             mPages.pop_back();
601*cdf0e10cSrcweir         }
602*cdf0e10cSrcweir     }
603*cdf0e10cSrcweir     // only clear the list, DO NOT delete the objects itself
604*cdf0e10cSrcweir     for(std::vector<SwPostItPageItem*>::iterator i = mPages.begin(); i!= mPages.end() ; i++)
605*cdf0e10cSrcweir     {
606*cdf0e10cSrcweir         (*i)->mList->clear();
607*cdf0e10cSrcweir         if (mvPostItFlds.empty())
608*cdf0e10cSrcweir             (*i)->bScrollbar = false;
609*cdf0e10cSrcweir 
610*cdf0e10cSrcweir     }
611*cdf0e10cSrcweir }
612*cdf0e10cSrcweir 
613*cdf0e10cSrcweir void SwPostItMgr::LayoutPostIts()
614*cdf0e10cSrcweir {
615*cdf0e10cSrcweir     if ( !mvPostItFlds.empty() && !mbWaitingForCalcRects )
616*cdf0e10cSrcweir     {
617*cdf0e10cSrcweir         mbLayouting = true;
618*cdf0e10cSrcweir 
619*cdf0e10cSrcweir             //loop over all pages and do the layout
620*cdf0e10cSrcweir             // - create SwPostIt if neccessary
621*cdf0e10cSrcweir             // - place SwPostIts on their initial position
622*cdf0e10cSrcweir             // - calculate neccessary height for all PostIts together
623*cdf0e10cSrcweir             bool bUpdate = false;
624*cdf0e10cSrcweir             for (unsigned long n=0;n<mPages.size();n++)
625*cdf0e10cSrcweir             {
626*cdf0e10cSrcweir                 // only layout if there are notes on this page
627*cdf0e10cSrcweir                 if (mPages[n]->mList->size()>0)
628*cdf0e10cSrcweir                 {
629*cdf0e10cSrcweir                     std::list<SwSidebarWin*>    aVisiblePostItList;
630*cdf0e10cSrcweir                     unsigned long           lNeededHeight = 0;
631*cdf0e10cSrcweir                     long                    mlPageBorder = 0;
632*cdf0e10cSrcweir                     long                    mlPageEnd = 0;
633*cdf0e10cSrcweir 
634*cdf0e10cSrcweir                     for(SwSidebarItem_iterator i = mPages[n]->mList->begin(); i!= mPages[n]->mList->end(); i++)
635*cdf0e10cSrcweir                     {
636*cdf0e10cSrcweir                         SwSidebarItem* pItem = (*i);
637*cdf0e10cSrcweir                         SwSidebarWin* pPostIt = pItem->pPostIt;
638*cdf0e10cSrcweir 
639*cdf0e10cSrcweir                         if (mPages[n]->eSidebarPosition == sw::sidebarwindows::SIDEBAR_LEFT )
640*cdf0e10cSrcweir                         {
641*cdf0e10cSrcweir                             // x value for notes positioning
642*cdf0e10cSrcweir                             mlPageBorder = mpEditWin->LogicToPixel( Point( mPages[n]->mPageRect.Left(), 0)).X() - GetSidebarWidth(true);// - GetSidebarBorderWidth(true);
643*cdf0e10cSrcweir                             //bending point
644*cdf0e10cSrcweir                             mlPageEnd =
645*cdf0e10cSrcweir                                 mpWrtShell->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE)
646*cdf0e10cSrcweir                                 ? pItem->maLayoutInfo.mPagePrtArea.Left()
647*cdf0e10cSrcweir                                 : mPages[n]->mPageRect.Left() + 350;
648*cdf0e10cSrcweir                         }
649*cdf0e10cSrcweir                         else if (mPages[n]->eSidebarPosition == sw::sidebarwindows::SIDEBAR_RIGHT )
650*cdf0e10cSrcweir                         {
651*cdf0e10cSrcweir                             // x value for notes positioning
652*cdf0e10cSrcweir                             mlPageBorder = mpEditWin->LogicToPixel( Point(mPages[n]->mPageRect.Right(), 0)).X() + GetSidebarBorderWidth(true);
653*cdf0e10cSrcweir                             //bending point
654*cdf0e10cSrcweir                             mlPageEnd =
655*cdf0e10cSrcweir                                 mpWrtShell->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE)
656*cdf0e10cSrcweir                                 ? pItem->maLayoutInfo.mPagePrtArea.Right() :
657*cdf0e10cSrcweir                                 mPages[n]->mPageRect.Right() - 350;
658*cdf0e10cSrcweir                         }
659*cdf0e10cSrcweir 
660*cdf0e10cSrcweir                         if (pItem->bShow)
661*cdf0e10cSrcweir                         {
662*cdf0e10cSrcweir                             long Y = mpEditWin->LogicToPixel( Point(0,pItem->maLayoutInfo.mPosition.Bottom())).Y();
663*cdf0e10cSrcweir                             long aPostItHeight = 0;
664*cdf0e10cSrcweir                             if (!pPostIt)
665*cdf0e10cSrcweir                             {
666*cdf0e10cSrcweir                                 pPostIt = (*i)->GetSidebarWindow( mpView->GetEditWin(),
667*cdf0e10cSrcweir                                                                   WB_DIALOGCONTROL,
668*cdf0e10cSrcweir                                                                   *this,
669*cdf0e10cSrcweir                                                                   0 );
670*cdf0e10cSrcweir                                 pPostIt->InitControls();
671*cdf0e10cSrcweir                                 pPostIt->SetReadonly(mbReadOnly);
672*cdf0e10cSrcweir                                 pItem->pPostIt = pPostIt;
673*cdf0e10cSrcweir                                 if (mpAnswer)
674*cdf0e10cSrcweir                                 {
675*cdf0e10cSrcweir                                     if (pPostIt->CalcFollow()) //do we really have another note in front of this one
676*cdf0e10cSrcweir                                         static_cast<sw::annotation::SwAnnotationWin*>(pPostIt)->InitAnswer(mpAnswer);
677*cdf0e10cSrcweir                                     delete mpAnswer;
678*cdf0e10cSrcweir                                     mpAnswer = 0;
679*cdf0e10cSrcweir                                 }
680*cdf0e10cSrcweir                             }
681*cdf0e10cSrcweir 
682*cdf0e10cSrcweir                             pPostIt->SetChangeTracking(
683*cdf0e10cSrcweir                                 pItem->mLayoutStatus,
684*cdf0e10cSrcweir                                 GetColorAnchor(pItem->maLayoutInfo.mRedlineAuthor));
685*cdf0e10cSrcweir                             pPostIt->SetSidebarPosition(mPages[n]->eSidebarPosition);
686*cdf0e10cSrcweir                             pPostIt->SetFollow(pPostIt->CalcFollow());
687*cdf0e10cSrcweir                             aPostItHeight = ( pPostIt->GetPostItTextHeight() < pPostIt->GetMinimumSizeWithoutMeta()
688*cdf0e10cSrcweir                                               ? pPostIt->GetMinimumSizeWithoutMeta()
689*cdf0e10cSrcweir                                               : pPostIt->GetPostItTextHeight() )
690*cdf0e10cSrcweir                                             + pPostIt->GetMetaHeight();
691*cdf0e10cSrcweir                             pPostIt->SetPosSizePixelRect( mlPageBorder ,
692*cdf0e10cSrcweir                                                           Y - GetInitialAnchorDistance(),
693*cdf0e10cSrcweir                                                           GetNoteWidth() ,
694*cdf0e10cSrcweir                                                           aPostItHeight,
695*cdf0e10cSrcweir                                                           pItem->maLayoutInfo.mPosition,
696*cdf0e10cSrcweir                                                           mlPageEnd );
697*cdf0e10cSrcweir                             pPostIt->ChangeSidebarItem( *pItem );
698*cdf0e10cSrcweir 
699*cdf0e10cSrcweir                             if (pItem->bFocus)
700*cdf0e10cSrcweir                             {
701*cdf0e10cSrcweir                                 mbLayout = true;
702*cdf0e10cSrcweir                                 pPostIt->GrabFocus();
703*cdf0e10cSrcweir                                 pItem->bFocus = false;
704*cdf0e10cSrcweir                             }
705*cdf0e10cSrcweir                             // only the visible postits are used for the final layout
706*cdf0e10cSrcweir                             aVisiblePostItList.push_back(pPostIt);
707*cdf0e10cSrcweir                             lNeededHeight += pPostIt->IsFollow() ? aPostItHeight : aPostItHeight+GetSpaceBetween();
708*cdf0e10cSrcweir                         }
709*cdf0e10cSrcweir                         else // we don't want to see it
710*cdf0e10cSrcweir                         {
711*cdf0e10cSrcweir                             if (pPostIt)
712*cdf0e10cSrcweir                                 pPostIt->HideNote();
713*cdf0e10cSrcweir                         }
714*cdf0e10cSrcweir                     }
715*cdf0e10cSrcweir 
716*cdf0e10cSrcweir                     if ((aVisiblePostItList.size()>0) && ShowNotes())
717*cdf0e10cSrcweir                     {
718*cdf0e10cSrcweir                         bool bOldScrollbar = mPages[n]->bScrollbar;
719*cdf0e10cSrcweir                         if (ShowNotes())
720*cdf0e10cSrcweir                             mPages[n]->bScrollbar = LayoutByPage(aVisiblePostItList, mPages[n]->mPageRect.SVRect(), lNeededHeight);
721*cdf0e10cSrcweir                         else
722*cdf0e10cSrcweir                             mPages[n]->bScrollbar = false;
723*cdf0e10cSrcweir                         if (!mPages[n]->bScrollbar)
724*cdf0e10cSrcweir                         {
725*cdf0e10cSrcweir                             mPages[n]->lOffset = 0;
726*cdf0e10cSrcweir                         }
727*cdf0e10cSrcweir                         else
728*cdf0e10cSrcweir                         {
729*cdf0e10cSrcweir                             //when we changed our zoom level, the offset value can be to big, so lets check for the largest possible zoom value
730*cdf0e10cSrcweir                             long aAvailableHeight = mpEditWin->LogicToPixel(Size(0,mPages[n]->mPageRect.Height())).Height() - 2 * GetSidebarScrollerHeight();
731*cdf0e10cSrcweir                             long lOffset = -1 * GetScrollSize() * (aVisiblePostItList.size() - aAvailableHeight / GetScrollSize());
732*cdf0e10cSrcweir                             if (mPages[n]->lOffset < lOffset)
733*cdf0e10cSrcweir                                 mPages[n]->lOffset = lOffset;
734*cdf0e10cSrcweir                         }
735*cdf0e10cSrcweir                         bUpdate = (bOldScrollbar != mPages[n]->bScrollbar) || bUpdate;
736*cdf0e10cSrcweir                         const long aSidebarheight = mPages[n]->bScrollbar ? mpEditWin->PixelToLogic(Size(0,GetSidebarScrollerHeight())).Height() : 0;
737*cdf0e10cSrcweir                         /*
738*cdf0e10cSrcweir                                         TODO
739*cdf0e10cSrcweir                                         - enlarge all notes till GetNextBorder(), as we resized to average value before
740*cdf0e10cSrcweir                                         */
741*cdf0e10cSrcweir                         //lets hide the ones which overlap the page
742*cdf0e10cSrcweir                         for(SwSidebarWin_iterator i = aVisiblePostItList.begin(); i!= aVisiblePostItList.end() ; i++)
743*cdf0e10cSrcweir                         {
744*cdf0e10cSrcweir                             if (mPages[n]->lOffset != 0)
745*cdf0e10cSrcweir                                 (*i)->TranslateTopPosition(mPages[n]->lOffset);
746*cdf0e10cSrcweir 
747*cdf0e10cSrcweir                             bool bBottom  = mpEditWin->PixelToLogic(Point(0,(*i)->VirtualPos().Y()+(*i)->VirtualSize().Height())).Y() <= (mPages[n]->mPageRect.Bottom()-aSidebarheight);
748*cdf0e10cSrcweir                             bool bTop = mpEditWin->PixelToLogic(Point(0,(*i)->VirtualPos().Y())).Y() >= (mPages[n]->mPageRect.Top()+aSidebarheight);
749*cdf0e10cSrcweir                             if ( bBottom && bTop )
750*cdf0e10cSrcweir                             {
751*cdf0e10cSrcweir                                 (*i)->ShowNote();
752*cdf0e10cSrcweir                             }
753*cdf0e10cSrcweir                             else
754*cdf0e10cSrcweir                             {
755*cdf0e10cSrcweir                                 if (mpEditWin->PixelToLogic(Point(0,(*i)->VirtualPos().Y())).Y() < (mPages[n]->mPageRect.Top()+aSidebarheight))
756*cdf0e10cSrcweir                                 {
757*cdf0e10cSrcweir                                     if ( mPages[n]->eSidebarPosition == sw::sidebarwindows::SIDEBAR_LEFT )
758*cdf0e10cSrcweir                                         (*i)->ShowAnchorOnly(Point( mPages[n]->mPageRect.Left(),
759*cdf0e10cSrcweir                                                                     mPages[n]->mPageRect.Top()));
760*cdf0e10cSrcweir                                     else if ( mPages[n]->eSidebarPosition == sw::sidebarwindows::SIDEBAR_RIGHT )
761*cdf0e10cSrcweir                                         (*i)->ShowAnchorOnly(Point( mPages[n]->mPageRect.Right(),
762*cdf0e10cSrcweir                                                                     mPages[n]->mPageRect.Top()));
763*cdf0e10cSrcweir                                 }
764*cdf0e10cSrcweir                                 else
765*cdf0e10cSrcweir                                 {
766*cdf0e10cSrcweir                                     if ( mPages[n]->eSidebarPosition == sw::sidebarwindows::SIDEBAR_LEFT )
767*cdf0e10cSrcweir                                         (*i)->ShowAnchorOnly(Point(mPages[n]->mPageRect.Left(),
768*cdf0e10cSrcweir                                                                    mPages[n]->mPageRect.Bottom()));
769*cdf0e10cSrcweir                                     else if ( mPages[n]->eSidebarPosition == sw::sidebarwindows::SIDEBAR_RIGHT )
770*cdf0e10cSrcweir                                         (*i)->ShowAnchorOnly(Point(mPages[n]->mPageRect.Right(),
771*cdf0e10cSrcweir                                                                    mPages[n]->mPageRect.Bottom()));
772*cdf0e10cSrcweir                                 }
773*cdf0e10cSrcweir                                 DBG_ASSERT(mPages[n]->bScrollbar,"SwPostItMgr::LayoutByPage(): note overlaps, but bScrollbar is not true");
774*cdf0e10cSrcweir                             }
775*cdf0e10cSrcweir                         }
776*cdf0e10cSrcweir 
777*cdf0e10cSrcweir                         // do some magic so we really see the focused note
778*cdf0e10cSrcweir                         for(SwSidebarWin_iterator i = aVisiblePostItList.begin(); i!= aVisiblePostItList.end() ; i++)
779*cdf0e10cSrcweir                         {
780*cdf0e10cSrcweir                                             if ((*i)->HasChildPathFocus())
781*cdf0e10cSrcweir                             {
782*cdf0e10cSrcweir                                 MakeVisible((*i),n+1);
783*cdf0e10cSrcweir                                 break;
784*cdf0e10cSrcweir                             }
785*cdf0e10cSrcweir                         }
786*cdf0e10cSrcweir                     }
787*cdf0e10cSrcweir                     else
788*cdf0e10cSrcweir                     {
789*cdf0e10cSrcweir                         for(SwSidebarWin_iterator i = aVisiblePostItList.begin(); i!= aVisiblePostItList.end() ; i++)
790*cdf0e10cSrcweir                                                                 (*i)->SetPosAndSize();
791*cdf0e10cSrcweir 
792*cdf0e10cSrcweir                                                         bool bOldScrollbar = mPages[n]->bScrollbar;
793*cdf0e10cSrcweir                                                         mPages[n]->bScrollbar = false;
794*cdf0e10cSrcweir                                                         bUpdate = (bOldScrollbar != mPages[n]->bScrollbar) || bUpdate;
795*cdf0e10cSrcweir                     }
796*cdf0e10cSrcweir                     aVisiblePostItList.clear();
797*cdf0e10cSrcweir                 }
798*cdf0e10cSrcweir                 else
799*cdf0e10cSrcweir                 {
800*cdf0e10cSrcweir                     bUpdate = true;
801*cdf0e10cSrcweir                     mPages[n]->bScrollbar = false;
802*cdf0e10cSrcweir                 }
803*cdf0e10cSrcweir             }
804*cdf0e10cSrcweir 
805*cdf0e10cSrcweir             if (!ShowNotes())
806*cdf0e10cSrcweir             {       // we do not want to see the notes anymore -> Options-Writer-View-Notes
807*cdf0e10cSrcweir                 bool bRepair = false;
808*cdf0e10cSrcweir                 for(SwSidebarItem_iterator i = mvPostItFlds.begin(); i!= mvPostItFlds.end() ; i++)
809*cdf0e10cSrcweir                 {
810*cdf0e10cSrcweir                     SwSidebarItem* pItem = (*i);
811*cdf0e10cSrcweir                     if ( !pItem->UseElement() )
812*cdf0e10cSrcweir                     {
813*cdf0e10cSrcweir                         DBG_ERROR("PostIt is not in doc!");
814*cdf0e10cSrcweir                         bRepair = true;
815*cdf0e10cSrcweir                         continue;
816*cdf0e10cSrcweir                     }
817*cdf0e10cSrcweir 
818*cdf0e10cSrcweir                     if ((*i)->pPostIt)
819*cdf0e10cSrcweir                     {
820*cdf0e10cSrcweir                         (*i)->pPostIt->HideNote();
821*cdf0e10cSrcweir                         if ((*i)->pPostIt->HasChildPathFocus())
822*cdf0e10cSrcweir                         {
823*cdf0e10cSrcweir                             SetActiveSidebarWin(0);
824*cdf0e10cSrcweir                             (*i)->pPostIt->GrabFocusToDocument();
825*cdf0e10cSrcweir                         }
826*cdf0e10cSrcweir                     }
827*cdf0e10cSrcweir                 }
828*cdf0e10cSrcweir 
829*cdf0e10cSrcweir                 if ( bRepair )
830*cdf0e10cSrcweir                     CheckForRemovedPostIts();
831*cdf0e10cSrcweir             }
832*cdf0e10cSrcweir 
833*cdf0e10cSrcweir 
834*cdf0e10cSrcweir             // notes scrollbar is otherwise not drawn correctly for some cases
835*cdf0e10cSrcweir             // scrollbar area is enough
836*cdf0e10cSrcweir             if (bUpdate)
837*cdf0e10cSrcweir                 mpEditWin->Invalidate();
838*cdf0e10cSrcweir         mbLayouting = false;
839*cdf0e10cSrcweir     }
840*cdf0e10cSrcweir }
841*cdf0e10cSrcweir 
842*cdf0e10cSrcweir bool SwPostItMgr::BorderOverPageBorder(unsigned long aPage) const
843*cdf0e10cSrcweir {
844*cdf0e10cSrcweir     if ( mPages[aPage-1]->mList->empty() )
845*cdf0e10cSrcweir     {
846*cdf0e10cSrcweir         DBG_ERROR("Notes SidePane painted but no rects and page lists calculated!");
847*cdf0e10cSrcweir         return false;
848*cdf0e10cSrcweir     }
849*cdf0e10cSrcweir 
850*cdf0e10cSrcweir     SwSidebarItem_iterator aItem = mPages[aPage-1]->mList->end();
851*cdf0e10cSrcweir     --aItem;
852*cdf0e10cSrcweir     DBG_ASSERT ((*aItem)->pPostIt,"BorderOverPageBorder: NULL postIt, should never happen");
853*cdf0e10cSrcweir     if ((*aItem)->pPostIt)
854*cdf0e10cSrcweir     {
855*cdf0e10cSrcweir         const long aSidebarheight = mPages[aPage-1]->bScrollbar ? mpEditWin->PixelToLogic(Size(0,GetSidebarScrollerHeight())).Height() : 0;
856*cdf0e10cSrcweir         const long aEndValue = mpEditWin->PixelToLogic(Point(0,(*aItem)->pPostIt->GetPosPixel().Y()+(*aItem)->pPostIt->GetSizePixel().Height())).Y();
857*cdf0e10cSrcweir         return aEndValue <= mPages[aPage-1]->mPageRect.Bottom()-aSidebarheight;
858*cdf0e10cSrcweir     }
859*cdf0e10cSrcweir     else
860*cdf0e10cSrcweir         return false;
861*cdf0e10cSrcweir }
862*cdf0e10cSrcweir 
863*cdf0e10cSrcweir void SwPostItMgr::Scroll(const long lScroll,const unsigned long aPage)
864*cdf0e10cSrcweir {
865*cdf0e10cSrcweir     DBG_ASSERT((lScroll % GetScrollSize() )==0,"SwPostItMgr::Scroll: scrolling by wrong value");
866*cdf0e10cSrcweir     // do not scroll more than neccessary up or down
867*cdf0e10cSrcweir     if ( ((mPages[aPage-1]->lOffset == 0) && (lScroll>0)) || ( BorderOverPageBorder(aPage) && (lScroll<0)) )
868*cdf0e10cSrcweir         return;
869*cdf0e10cSrcweir 
870*cdf0e10cSrcweir     const bool bOldUp = ArrowEnabled(KEY_PAGEUP,aPage);
871*cdf0e10cSrcweir     const bool bOldDown = ArrowEnabled(KEY_PAGEDOWN,aPage);
872*cdf0e10cSrcweir     const long aSidebarheight = mpEditWin->PixelToLogic(Size(0,GetSidebarScrollerHeight())).Height();
873*cdf0e10cSrcweir     for(SwSidebarItem_iterator i = mPages[aPage-1]->mList->begin(); i!= mPages[aPage-1]->mList->end(); i++)
874*cdf0e10cSrcweir     {
875*cdf0e10cSrcweir         SwSidebarWin* pPostIt = (*i)->pPostIt;
876*cdf0e10cSrcweir         // if this is an answer, we should take the normal position and not the real, slightly moved position
877*cdf0e10cSrcweir         pPostIt->SetVirtualPosSize(pPostIt->GetPosPixel(),pPostIt->GetSizePixel());
878*cdf0e10cSrcweir         pPostIt->TranslateTopPosition(lScroll);
879*cdf0e10cSrcweir 
880*cdf0e10cSrcweir         if ((*i)->bShow)
881*cdf0e10cSrcweir         {
882*cdf0e10cSrcweir             bool bBottom  = mpEditWin->PixelToLogic(Point(0,pPostIt->VirtualPos().Y()+pPostIt->VirtualSize().Height())).Y() <= (mPages[aPage-1]->mPageRect.Bottom()-aSidebarheight);
883*cdf0e10cSrcweir             bool bTop = mpEditWin->PixelToLogic(Point(0,pPostIt->VirtualPos().Y())).Y() >=   (mPages[aPage-1]->mPageRect.Top()+aSidebarheight);
884*cdf0e10cSrcweir             if ( bBottom && bTop)
885*cdf0e10cSrcweir             {
886*cdf0e10cSrcweir                     pPostIt->ShowNote();
887*cdf0e10cSrcweir             }
888*cdf0e10cSrcweir             else
889*cdf0e10cSrcweir             {
890*cdf0e10cSrcweir                 if ( mpEditWin->PixelToLogic(Point(0,pPostIt->VirtualPos().Y())).Y() < (mPages[aPage-1]->mPageRect.Top()+aSidebarheight))
891*cdf0e10cSrcweir                 {
892*cdf0e10cSrcweir                     if (mPages[aPage-1]->eSidebarPosition == sw::sidebarwindows::SIDEBAR_LEFT)
893*cdf0e10cSrcweir                         pPostIt->ShowAnchorOnly(Point(mPages[aPage-1]->mPageRect.Left(),mPages[aPage-1]->mPageRect.Top()));
894*cdf0e10cSrcweir                     else if (mPages[aPage-1]->eSidebarPosition == sw::sidebarwindows::SIDEBAR_RIGHT)
895*cdf0e10cSrcweir                         pPostIt->ShowAnchorOnly(Point(mPages[aPage-1]->mPageRect.Right(),mPages[aPage-1]->mPageRect.Top()));
896*cdf0e10cSrcweir                 }
897*cdf0e10cSrcweir                 else
898*cdf0e10cSrcweir                 {
899*cdf0e10cSrcweir                     if (mPages[aPage-1]->eSidebarPosition == sw::sidebarwindows::SIDEBAR_LEFT)
900*cdf0e10cSrcweir                         pPostIt->ShowAnchorOnly(Point(mPages[aPage-1]->mPageRect.Left(),mPages[aPage-1]->mPageRect.Bottom()));
901*cdf0e10cSrcweir                     else if (mPages[aPage-1]->eSidebarPosition == sw::sidebarwindows::SIDEBAR_RIGHT)
902*cdf0e10cSrcweir                         pPostIt->ShowAnchorOnly(Point(mPages[aPage-1]->mPageRect.Right(),mPages[aPage-1]->mPageRect.Bottom()));
903*cdf0e10cSrcweir                 }
904*cdf0e10cSrcweir             }
905*cdf0e10cSrcweir         }
906*cdf0e10cSrcweir     }
907*cdf0e10cSrcweir     mPages[aPage-1]->lOffset += lScroll;
908*cdf0e10cSrcweir     if ( (bOldUp != ArrowEnabled(KEY_PAGEUP,aPage)) ||(bOldDown != ArrowEnabled(KEY_PAGEDOWN,aPage)) )
909*cdf0e10cSrcweir     {
910*cdf0e10cSrcweir         mpEditWin->Invalidate(GetBottomScrollRect(aPage));
911*cdf0e10cSrcweir         mpEditWin->Invalidate(GetTopScrollRect(aPage));
912*cdf0e10cSrcweir     }
913*cdf0e10cSrcweir }
914*cdf0e10cSrcweir 
915*cdf0e10cSrcweir void SwPostItMgr::AutoScroll(const SwSidebarWin* pPostIt,const unsigned long aPage )
916*cdf0e10cSrcweir {
917*cdf0e10cSrcweir     // otherwise all notes are visible
918*cdf0e10cSrcweir     if (mPages[aPage-1]->bScrollbar)
919*cdf0e10cSrcweir     {
920*cdf0e10cSrcweir         const long aSidebarheight = mpEditWin->PixelToLogic(Size(0,GetSidebarScrollerHeight())).Height();
921*cdf0e10cSrcweir         const bool bBottom  = mpEditWin->PixelToLogic(Point(0,pPostIt->GetPosPixel().Y()+pPostIt->GetSizePixel().Height())).Y() <= (mPages[aPage-1]->mPageRect.Bottom()-aSidebarheight);
922*cdf0e10cSrcweir         const bool bTop = mpEditWin->PixelToLogic(Point(0,pPostIt->GetPosPixel().Y())).Y() >= (mPages[aPage-1]->mPageRect.Top()+aSidebarheight);
923*cdf0e10cSrcweir         if ( !(bBottom && bTop))
924*cdf0e10cSrcweir         {
925*cdf0e10cSrcweir             const long aDiff = bBottom ? mpEditWin->LogicToPixel(Point(0,mPages[aPage-1]->mPageRect.Top() + aSidebarheight)).Y() - pPostIt->GetPosPixel().Y() :
926*cdf0e10cSrcweir                                             mpEditWin->LogicToPixel(Point(0,mPages[aPage-1]->mPageRect.Bottom() - aSidebarheight)).Y() - (pPostIt->GetPosPixel().Y()+pPostIt->GetSizePixel().Height());
927*cdf0e10cSrcweir             // this just adds the missing value to get the next a* GetScrollSize() after aDiff
928*cdf0e10cSrcweir             // e.g aDiff= 61 POSTIT_SCOLL=50 --> lScroll = 100
929*cdf0e10cSrcweir             const long lScroll = bBottom ? (aDiff + ( GetScrollSize() - (aDiff % GetScrollSize()))) : (aDiff - (GetScrollSize() + (aDiff % GetScrollSize())));
930*cdf0e10cSrcweir             Scroll(lScroll, aPage);
931*cdf0e10cSrcweir         }
932*cdf0e10cSrcweir     }
933*cdf0e10cSrcweir }
934*cdf0e10cSrcweir 
935*cdf0e10cSrcweir void SwPostItMgr::MakeVisible(const SwSidebarWin* pPostIt,long aPage )
936*cdf0e10cSrcweir {
937*cdf0e10cSrcweir     if (aPage == -1)
938*cdf0e10cSrcweir     {
939*cdf0e10cSrcweir         // we dont know the page yet, lets find it ourselves
940*cdf0e10cSrcweir         for (unsigned long n=0;n<mPages.size();n++)
941*cdf0e10cSrcweir         {
942*cdf0e10cSrcweir             if (mPages[n]->mList->size()>0)
943*cdf0e10cSrcweir             {
944*cdf0e10cSrcweir                 for(SwSidebarItem_iterator i = mPages[n]->mList->begin(); i!= mPages[n]->mList->end(); i++)
945*cdf0e10cSrcweir                 {
946*cdf0e10cSrcweir                     if ((*i)->pPostIt==pPostIt)
947*cdf0e10cSrcweir                     {
948*cdf0e10cSrcweir                         aPage = n+1;
949*cdf0e10cSrcweir                         break;
950*cdf0e10cSrcweir                     }
951*cdf0e10cSrcweir                 }
952*cdf0e10cSrcweir             }
953*cdf0e10cSrcweir         }
954*cdf0e10cSrcweir     }
955*cdf0e10cSrcweir     if (aPage!=-1)
956*cdf0e10cSrcweir         AutoScroll(pPostIt,aPage);
957*cdf0e10cSrcweir     Rectangle aNoteRect (Point(pPostIt->GetPosPixel().X(),pPostIt->GetPosPixel().Y()-5),pPostIt->GetSizePixel());
958*cdf0e10cSrcweir     if (!aNoteRect.IsEmpty())
959*cdf0e10cSrcweir         mpWrtShell->MakeVisible(SwRect(mpEditWin->PixelToLogic(aNoteRect)));
960*cdf0e10cSrcweir }
961*cdf0e10cSrcweir 
962*cdf0e10cSrcweir bool SwPostItMgr::ArrowEnabled(sal_uInt16 aDirection,unsigned long aPage) const
963*cdf0e10cSrcweir {
964*cdf0e10cSrcweir     switch (aDirection)
965*cdf0e10cSrcweir     {
966*cdf0e10cSrcweir         case KEY_PAGEUP:
967*cdf0e10cSrcweir             {
968*cdf0e10cSrcweir                 return (mPages[aPage-1]->lOffset != 0);
969*cdf0e10cSrcweir             }
970*cdf0e10cSrcweir         case KEY_PAGEDOWN:
971*cdf0e10cSrcweir             {
972*cdf0e10cSrcweir                 return (!BorderOverPageBorder(aPage));
973*cdf0e10cSrcweir             }
974*cdf0e10cSrcweir         default: return false;
975*cdf0e10cSrcweir     }
976*cdf0e10cSrcweir }
977*cdf0e10cSrcweir 
978*cdf0e10cSrcweir Color SwPostItMgr::GetArrowColor(sal_uInt16 aDirection,unsigned long aPage) const
979*cdf0e10cSrcweir {
980*cdf0e10cSrcweir     if (ArrowEnabled(aDirection,aPage))
981*cdf0e10cSrcweir     {
982*cdf0e10cSrcweir         if (Application::GetSettings().GetStyleSettings().GetHighContrastMode())
983*cdf0e10cSrcweir             return Color(COL_WHITE);
984*cdf0e10cSrcweir         else
985*cdf0e10cSrcweir             return COL_NOTES_SIDEPANE_ARROW_ENABLED;
986*cdf0e10cSrcweir     }
987*cdf0e10cSrcweir     else
988*cdf0e10cSrcweir     {
989*cdf0e10cSrcweir         return COL_NOTES_SIDEPANE_ARROW_DISABLED;
990*cdf0e10cSrcweir     }
991*cdf0e10cSrcweir }
992*cdf0e10cSrcweir 
993*cdf0e10cSrcweir bool SwPostItMgr::LayoutByPage(std::list<SwSidebarWin*> &aVisiblePostItList,const Rectangle aBorder, long lNeededHeight)
994*cdf0e10cSrcweir {
995*cdf0e10cSrcweir     /*** General layout idea:***/
996*cdf0e10cSrcweir     //  - if we have space left, we always move the current one up,
997*cdf0e10cSrcweir     //    otherwise the next one down
998*cdf0e10cSrcweir     //  - first all notes are resized
999*cdf0e10cSrcweir     //  - then the real layout starts
1000*cdf0e10cSrcweir     /*************************************************************/
1001*cdf0e10cSrcweir 
1002*cdf0e10cSrcweir     //rBorder is the page rect
1003*cdf0e10cSrcweir     const Rectangle rBorder         = mpEditWin->LogicToPixel( aBorder);
1004*cdf0e10cSrcweir     long            lTopBorder      = rBorder.Top() + 5;
1005*cdf0e10cSrcweir     long            lBottomBorder   = rBorder.Bottom() - 5;
1006*cdf0e10cSrcweir     const long      lVisibleHeight  = lBottomBorder - lTopBorder; //rBorder.GetHeight() ;
1007*cdf0e10cSrcweir     long            lSpaceUsed      = 0;
1008*cdf0e10cSrcweir     long            lTranslatePos   = 0;
1009*cdf0e10cSrcweir     int             loop            = 0;
1010*cdf0e10cSrcweir     bool            bDone           = false;
1011*cdf0e10cSrcweir     bool            bScrollbars     = false;
1012*cdf0e10cSrcweir 
1013*cdf0e10cSrcweir     // do all neccessary resizings
1014*cdf0e10cSrcweir     if (lVisibleHeight < lNeededHeight)
1015*cdf0e10cSrcweir     {
1016*cdf0e10cSrcweir         // ok, now we have to really resize and adding scrollbars
1017*cdf0e10cSrcweir         const long lAverageHeight = (lVisibleHeight - aVisiblePostItList.size()*GetSpaceBetween()) / aVisiblePostItList.size();
1018*cdf0e10cSrcweir         if (lAverageHeight<GetMinimumSizeWithMeta())
1019*cdf0e10cSrcweir         {
1020*cdf0e10cSrcweir             bScrollbars = true;
1021*cdf0e10cSrcweir             lTopBorder += GetSidebarScrollerHeight() + 10;
1022*cdf0e10cSrcweir             lBottomBorder -= (GetSidebarScrollerHeight() + 10);
1023*cdf0e10cSrcweir                 for(SwSidebarWin_iterator i = aVisiblePostItList.begin(); i!= aVisiblePostItList.end() ; i++)
1024*cdf0e10cSrcweir                     (*i)->SetSize(Size((*i)->VirtualSize().getWidth(),(*i)->GetMinimumSizeWithMeta()));
1025*cdf0e10cSrcweir         }
1026*cdf0e10cSrcweir         else
1027*cdf0e10cSrcweir         {
1028*cdf0e10cSrcweir             for(SwSidebarWin_iterator i = aVisiblePostItList.begin(); i!= aVisiblePostItList.end() ; i++)
1029*cdf0e10cSrcweir             {
1030*cdf0e10cSrcweir                 if ( (*i)->VirtualSize().getHeight() > lAverageHeight)
1031*cdf0e10cSrcweir                     (*i)->SetSize(Size((*i)->VirtualSize().getWidth(),lAverageHeight));
1032*cdf0e10cSrcweir             }
1033*cdf0e10cSrcweir         }
1034*cdf0e10cSrcweir     }
1035*cdf0e10cSrcweir 
1036*cdf0e10cSrcweir     //start the real layout so nothing overlaps anymore
1037*cdf0e10cSrcweir     if (aVisiblePostItList.size()>1)
1038*cdf0e10cSrcweir     {
1039*cdf0e10cSrcweir         // if no window is moved anymore we are finished
1040*cdf0e10cSrcweir         while (!bDone)
1041*cdf0e10cSrcweir         {
1042*cdf0e10cSrcweir             loop++;
1043*cdf0e10cSrcweir             bDone = true;
1044*cdf0e10cSrcweir             lSpaceUsed = lTopBorder + GetSpaceBetween();
1045*cdf0e10cSrcweir             for(SwSidebarWin_iterator i = aVisiblePostItList.begin(); i!= aVisiblePostItList.end() ; i++)
1046*cdf0e10cSrcweir             {
1047*cdf0e10cSrcweir                 SwSidebarWin_iterator aNextPostIt = i;
1048*cdf0e10cSrcweir                 ++aNextPostIt;
1049*cdf0e10cSrcweir 
1050*cdf0e10cSrcweir                 if (aNextPostIt !=aVisiblePostItList.end())
1051*cdf0e10cSrcweir                 {
1052*cdf0e10cSrcweir                     lTranslatePos = ( (*i)->VirtualPos().Y() + (*i)->VirtualSize().Height()) - (*aNextPostIt)->VirtualPos().Y();
1053*cdf0e10cSrcweir                     if (lTranslatePos > 0) // note windows overlaps the next one
1054*cdf0e10cSrcweir                     {
1055*cdf0e10cSrcweir                         // we are not done yet, loop at least once more
1056*cdf0e10cSrcweir                         bDone = false;
1057*cdf0e10cSrcweir                         // if there is space left, move the current note up
1058*cdf0e10cSrcweir                         // it could also happen that there is no space left for the first note due to a scrollbar
1059*cdf0e10cSrcweir                         // then we also jump into, so we move the current one up and the next one down
1060*cdf0e10cSrcweir                         if ( (lSpaceUsed <= (*i)->VirtualPos().Y()) || (i==aVisiblePostItList.begin()))
1061*cdf0e10cSrcweir                         {
1062*cdf0e10cSrcweir                             // we have space left, so let's move the current one up
1063*cdf0e10cSrcweir                             if ( ((*i)->VirtualPos().Y()- lTranslatePos - GetSpaceBetween()) > lTopBorder)
1064*cdf0e10cSrcweir                             {
1065*cdf0e10cSrcweir                                 if ((*aNextPostIt)->IsFollow())
1066*cdf0e10cSrcweir                                     (*i)->TranslateTopPosition(-1*(lTranslatePos+ANCHORLINE_WIDTH));
1067*cdf0e10cSrcweir                                 else
1068*cdf0e10cSrcweir                                     (*i)->TranslateTopPosition(-1*(lTranslatePos+GetSpaceBetween()));
1069*cdf0e10cSrcweir                             }
1070*cdf0e10cSrcweir                             else
1071*cdf0e10cSrcweir                             {
1072*cdf0e10cSrcweir                                 long lMoveUp = (*i)->VirtualPos().Y() - lTopBorder;
1073*cdf0e10cSrcweir                                 (*i)->TranslateTopPosition(-1* lMoveUp);
1074*cdf0e10cSrcweir                                 if ((*aNextPostIt)->IsFollow())
1075*cdf0e10cSrcweir                                     (*aNextPostIt)->TranslateTopPosition( (lTranslatePos+ANCHORLINE_WIDTH) - lMoveUp);
1076*cdf0e10cSrcweir                                 else
1077*cdf0e10cSrcweir                                     (*aNextPostIt)->TranslateTopPosition( (lTranslatePos+GetSpaceBetween()) - lMoveUp);
1078*cdf0e10cSrcweir                             }
1079*cdf0e10cSrcweir                         }
1080*cdf0e10cSrcweir                         else
1081*cdf0e10cSrcweir                         {
1082*cdf0e10cSrcweir                             // no space left, left move the next one down
1083*cdf0e10cSrcweir                             if ((*aNextPostIt)->IsFollow())
1084*cdf0e10cSrcweir                                 (*aNextPostIt)->TranslateTopPosition(lTranslatePos+ANCHORLINE_WIDTH);
1085*cdf0e10cSrcweir                             else
1086*cdf0e10cSrcweir                                 (*aNextPostIt)->TranslateTopPosition(lTranslatePos+GetSpaceBetween());
1087*cdf0e10cSrcweir                         }
1088*cdf0e10cSrcweir                     }
1089*cdf0e10cSrcweir                     else
1090*cdf0e10cSrcweir                     {
1091*cdf0e10cSrcweir                         // the first one could overlap the topborder instead of a second note
1092*cdf0e10cSrcweir                         if (i==aVisiblePostItList.begin())
1093*cdf0e10cSrcweir                         {
1094*cdf0e10cSrcweir                             long lMoveDown = lTopBorder - (*i)->VirtualPos().Y();
1095*cdf0e10cSrcweir                             if (lMoveDown>0)
1096*cdf0e10cSrcweir                             {
1097*cdf0e10cSrcweir                                 bDone = false;
1098*cdf0e10cSrcweir                                 (*i)->TranslateTopPosition( lMoveDown);
1099*cdf0e10cSrcweir                             }
1100*cdf0e10cSrcweir                         }
1101*cdf0e10cSrcweir                     }
1102*cdf0e10cSrcweir                     if (aNextPostIt !=aVisiblePostItList.end() && (*aNextPostIt)->IsFollow())
1103*cdf0e10cSrcweir                         lSpaceUsed += (*i)->VirtualSize().Height() + ANCHORLINE_WIDTH;
1104*cdf0e10cSrcweir                     else
1105*cdf0e10cSrcweir                         lSpaceUsed += (*i)->VirtualSize().Height() + GetSpaceBetween();
1106*cdf0e10cSrcweir                 }
1107*cdf0e10cSrcweir                 else
1108*cdf0e10cSrcweir                 {
1109*cdf0e10cSrcweir                     //(*i) is the last visible item
1110*cdf0e10cSrcweir                     SwSidebarWin_iterator aPrevPostIt = i;
1111*cdf0e10cSrcweir                     --aPrevPostIt;
1112*cdf0e10cSrcweir                     //lTranslatePos = ( (*aPrevPostIt)->VirtualPos().Y() + (*aPrevPostIt)->VirtualSize().Height() + GetSpaceBetween() ) - (*i)->VirtualPos().Y();
1113*cdf0e10cSrcweir                     lTranslatePos = ( (*aPrevPostIt)->VirtualPos().Y() + (*aPrevPostIt)->VirtualSize().Height() ) - (*i)->VirtualPos().Y();
1114*cdf0e10cSrcweir                     if (lTranslatePos > 0)
1115*cdf0e10cSrcweir                     {
1116*cdf0e10cSrcweir                         bDone = false;
1117*cdf0e10cSrcweir                         if ( ((*i)->VirtualPos().Y()+ (*i)->VirtualSize().Height()+lTranslatePos) < lBottomBorder)
1118*cdf0e10cSrcweir                         {
1119*cdf0e10cSrcweir                             if ( (*i)->IsFollow() )
1120*cdf0e10cSrcweir                                 (*i)->TranslateTopPosition(lTranslatePos+ANCHORLINE_WIDTH);
1121*cdf0e10cSrcweir                             else
1122*cdf0e10cSrcweir                                 (*i)->TranslateTopPosition(lTranslatePos+GetSpaceBetween());
1123*cdf0e10cSrcweir                         }
1124*cdf0e10cSrcweir                         else
1125*cdf0e10cSrcweir                         {
1126*cdf0e10cSrcweir                             (*i)->TranslateTopPosition(lBottomBorder - ((*i)->VirtualPos().Y()+ (*i)->VirtualSize().Height()) );
1127*cdf0e10cSrcweir                         }
1128*cdf0e10cSrcweir                     }
1129*cdf0e10cSrcweir                     else
1130*cdf0e10cSrcweir                     {
1131*cdf0e10cSrcweir                         // note does not overlap, but we might be over the lower border
1132*cdf0e10cSrcweir                         // only do this if there are no scrollbars, otherwise notes are supposed to overlap the border
1133*cdf0e10cSrcweir                         if (!bScrollbars && ((*i)->VirtualPos().Y()+ (*i)->VirtualSize().Height() > lBottomBorder) )
1134*cdf0e10cSrcweir                         {
1135*cdf0e10cSrcweir                             bDone = false;
1136*cdf0e10cSrcweir                             (*i)->TranslateTopPosition(lBottomBorder - ((*i)->VirtualPos().Y()+ (*i)->VirtualSize().Height()));
1137*cdf0e10cSrcweir                         }
1138*cdf0e10cSrcweir                     }
1139*cdf0e10cSrcweir                 }
1140*cdf0e10cSrcweir             }
1141*cdf0e10cSrcweir             // security check so we don't loop forever
1142*cdf0e10cSrcweir             if (loop>MAX_LOOP_COUNT)
1143*cdf0e10cSrcweir             {
1144*cdf0e10cSrcweir                 DBG_ERROR("PostItMgr::Layout(): We are looping forever");
1145*cdf0e10cSrcweir                 break;
1146*cdf0e10cSrcweir             }
1147*cdf0e10cSrcweir         }
1148*cdf0e10cSrcweir     }
1149*cdf0e10cSrcweir     else
1150*cdf0e10cSrcweir     {
1151*cdf0e10cSrcweir         // only one left, make sure it is not hidden at the top or bottom
1152*cdf0e10cSrcweir         SwSidebarWin_iterator i = aVisiblePostItList.begin();
1153*cdf0e10cSrcweir         lTranslatePos = lTopBorder - (*i)->VirtualPos().Y();
1154*cdf0e10cSrcweir         if (lTranslatePos>0)
1155*cdf0e10cSrcweir         {
1156*cdf0e10cSrcweir             (*i)->TranslateTopPosition(lTranslatePos+GetSpaceBetween());
1157*cdf0e10cSrcweir         }
1158*cdf0e10cSrcweir         lTranslatePos = lBottomBorder - ((*i)->VirtualPos().Y()+ (*i)->VirtualSize().Height());
1159*cdf0e10cSrcweir         if (lTranslatePos<0)
1160*cdf0e10cSrcweir         {
1161*cdf0e10cSrcweir             (*i)->TranslateTopPosition(lTranslatePos);
1162*cdf0e10cSrcweir         }
1163*cdf0e10cSrcweir     }
1164*cdf0e10cSrcweir     return bScrollbars;
1165*cdf0e10cSrcweir  }
1166*cdf0e10cSrcweir 
1167*cdf0e10cSrcweir /*
1168*cdf0e10cSrcweir void SwPostItMgr::AddRedlineComments(bool bCheckExistance, bool bFocus)
1169*cdf0e10cSrcweir {
1170*cdf0e10cSrcweir     bool bEmpty = mvPostItFlds.empty();
1171*cdf0e10cSrcweir     const SwRedlineTbl& aTable = mpView->GetDocShell()->GetDoc()->GetRedlineTbl();
1172*cdf0e10cSrcweir     for( sal_uInt16 i = 0; i < aTable.Count(); ++i )
1173*cdf0e10cSrcweir     {
1174*cdf0e10cSrcweir         SwRedline* pRedline = const_cast<SwRedline*>((aTable)[i]);
1175*cdf0e10cSrcweir         if ( pRedline->GetComment() != String(rtl::OUString::createFromAscii("")) )
1176*cdf0e10cSrcweir             InsertItem(pRedline, bCheckExistance, bFocus);
1177*cdf0e10cSrcweir     }
1178*cdf0e10cSrcweir     if (bEmpty && !mvPostItFlds.empty())
1179*cdf0e10cSrcweir         PrepareView(true);
1180*cdf0e10cSrcweir  }
1181*cdf0e10cSrcweir  */
1182*cdf0e10cSrcweir 
1183*cdf0e10cSrcweir void SwPostItMgr::AddPostIts(bool bCheckExistance, bool bFocus)
1184*cdf0e10cSrcweir {
1185*cdf0e10cSrcweir     bool bEmpty = mvPostItFlds.empty();
1186*cdf0e10cSrcweir     SwFieldType* pType = mpView->GetDocShell()->GetDoc()->GetFldType(RES_POSTITFLD, aEmptyStr,false);
1187*cdf0e10cSrcweir     SwIterator<SwFmtFld,SwFieldType> aIter( *pType );
1188*cdf0e10cSrcweir     SwFmtFld* pSwFmtFld = aIter.First();
1189*cdf0e10cSrcweir     while(pSwFmtFld)
1190*cdf0e10cSrcweir     {
1191*cdf0e10cSrcweir         if ( pSwFmtFld->GetTxtFld())
1192*cdf0e10cSrcweir         {
1193*cdf0e10cSrcweir             if ( pSwFmtFld->IsFldInDoc() )
1194*cdf0e10cSrcweir                 InsertItem(pSwFmtFld,bCheckExistance,bFocus);
1195*cdf0e10cSrcweir         }
1196*cdf0e10cSrcweir         pSwFmtFld = aIter.Next();
1197*cdf0e10cSrcweir     }
1198*cdf0e10cSrcweir 
1199*cdf0e10cSrcweir     // if we just added the first one we have to update the view for centering
1200*cdf0e10cSrcweir     if (bEmpty && !mvPostItFlds.empty())
1201*cdf0e10cSrcweir         PrepareView(true);
1202*cdf0e10cSrcweir }
1203*cdf0e10cSrcweir 
1204*cdf0e10cSrcweir void SwPostItMgr::RemoveSidebarWin()
1205*cdf0e10cSrcweir {
1206*cdf0e10cSrcweir     if (!mvPostItFlds.empty())
1207*cdf0e10cSrcweir     {
1208*cdf0e10cSrcweir         for(std::list<SwSidebarItem*>::iterator i = mvPostItFlds.begin(); i!= mvPostItFlds.end() ; i++)
1209*cdf0e10cSrcweir         {
1210*cdf0e10cSrcweir             EndListening( *((*i)->GetBroadCaster()) );
1211*cdf0e10cSrcweir             if ((*i)->pPostIt)
1212*cdf0e10cSrcweir                 delete (*i)->pPostIt;
1213*cdf0e10cSrcweir             delete (*i);
1214*cdf0e10cSrcweir         }
1215*cdf0e10cSrcweir         mvPostItFlds.clear();
1216*cdf0e10cSrcweir     }
1217*cdf0e10cSrcweir 
1218*cdf0e10cSrcweir     // all postits removed, no items should be left in pages
1219*cdf0e10cSrcweir     PreparePageContainer();
1220*cdf0e10cSrcweir }
1221*cdf0e10cSrcweir 
1222*cdf0e10cSrcweir // copy to new vector, otherwise RemoveItem would operate and delete stuff on mvPostItFlds as well
1223*cdf0e10cSrcweir // RemoveItem will clean up the core field and visible postit if neccessary
1224*cdf0e10cSrcweir // we cannot just delete everything as before, as postits could move into change tracking
1225*cdf0e10cSrcweir void SwPostItMgr::Delete(String aAuthor)
1226*cdf0e10cSrcweir {
1227*cdf0e10cSrcweir     mpWrtShell->StartAllAction();
1228*cdf0e10cSrcweir     if ( HasActiveSidebarWin() && (GetActiveSidebarWin()->GetAuthor()==aAuthor) )
1229*cdf0e10cSrcweir     {
1230*cdf0e10cSrcweir         SetActiveSidebarWin(0);
1231*cdf0e10cSrcweir     }
1232*cdf0e10cSrcweir     SwRewriter aRewriter;
1233*cdf0e10cSrcweir     String aUndoString = SW_RES(STR_DELETE_AUTHOR_NOTES);
1234*cdf0e10cSrcweir     aUndoString += aAuthor;
1235*cdf0e10cSrcweir     aRewriter.AddRule(UNDO_ARG1, aUndoString);
1236*cdf0e10cSrcweir     mpWrtShell->StartUndo( UNDO_DELETE, &aRewriter );
1237*cdf0e10cSrcweir 
1238*cdf0e10cSrcweir     std::vector<SwFmtFld*> aTmp;
1239*cdf0e10cSrcweir     aTmp.reserve( mvPostItFlds.size() );
1240*cdf0e10cSrcweir     for(std::list<SwSidebarItem*>::iterator pPostIt = mvPostItFlds.begin(); pPostIt!= mvPostItFlds.end() ; pPostIt++)
1241*cdf0e10cSrcweir     {
1242*cdf0e10cSrcweir         if ((*pPostIt)->GetFmtFld() && ((*pPostIt)->pPostIt->GetAuthor() == aAuthor) )
1243*cdf0e10cSrcweir             aTmp.push_back( (*pPostIt)->GetFmtFld() );
1244*cdf0e10cSrcweir     }
1245*cdf0e10cSrcweir     for(std::vector<SwFmtFld*>::iterator i = aTmp.begin(); i!= aTmp.end() ; i++)
1246*cdf0e10cSrcweir     {
1247*cdf0e10cSrcweir         mpWrtShell->GotoField( *(*i) );
1248*cdf0e10cSrcweir         mpWrtShell->DelRight();
1249*cdf0e10cSrcweir     }
1250*cdf0e10cSrcweir     mpWrtShell->EndUndo();
1251*cdf0e10cSrcweir     PrepareView();
1252*cdf0e10cSrcweir     mpWrtShell->EndAllAction();
1253*cdf0e10cSrcweir     mbLayout = true;
1254*cdf0e10cSrcweir     CalcRects();
1255*cdf0e10cSrcweir     LayoutPostIts();
1256*cdf0e10cSrcweir }
1257*cdf0e10cSrcweir 
1258*cdf0e10cSrcweir void SwPostItMgr::Delete()
1259*cdf0e10cSrcweir {
1260*cdf0e10cSrcweir     mpWrtShell->StartAllAction();
1261*cdf0e10cSrcweir     SetActiveSidebarWin(0);
1262*cdf0e10cSrcweir     SwRewriter aRewriter;
1263*cdf0e10cSrcweir     aRewriter.AddRule(UNDO_ARG1, SW_RES(STR_DELETE_ALL_NOTES) );
1264*cdf0e10cSrcweir     mpWrtShell->StartUndo( UNDO_DELETE, &aRewriter );
1265*cdf0e10cSrcweir 
1266*cdf0e10cSrcweir     std::vector<SwFmtFld*> aTmp;
1267*cdf0e10cSrcweir     aTmp.reserve( mvPostItFlds.size() );
1268*cdf0e10cSrcweir     for(std::list<SwSidebarItem*>::iterator pPostIt = mvPostItFlds.begin(); pPostIt!= mvPostItFlds.end() ; pPostIt++)
1269*cdf0e10cSrcweir     {
1270*cdf0e10cSrcweir         if ((*pPostIt)->GetFmtFld())
1271*cdf0e10cSrcweir             aTmp.push_back( (*pPostIt)->GetFmtFld() );
1272*cdf0e10cSrcweir     }
1273*cdf0e10cSrcweir     for(std::vector<SwFmtFld*>::iterator i = aTmp.begin(); i!= aTmp.end() ; i++)
1274*cdf0e10cSrcweir     {
1275*cdf0e10cSrcweir         mpWrtShell->GotoField( *(*i) );
1276*cdf0e10cSrcweir         mpWrtShell->DelRight();
1277*cdf0e10cSrcweir     }
1278*cdf0e10cSrcweir 
1279*cdf0e10cSrcweir /*
1280*cdf0e10cSrcweir     for(std::list<SwPostItItem*>::iterator i = mvPostItFlds.begin(); i!= mvPostItFlds.end() ; i++)
1281*cdf0e10cSrcweir     {
1282*cdf0e10cSrcweir         SwPostItItem* pItem = (*i);
1283*cdf0e10cSrcweir         // stop listening, we delete ourselves
1284*cdf0e10cSrcweir         EndListening( *(pItem->pFmtFld) );
1285*cdf0e10cSrcweir         // delete the actual SwPostItField
1286*cdf0e10cSrcweir         mpWrtShell->GotoField(*pItem->pFmtFld);
1287*cdf0e10cSrcweir         mpWrtShell->DelRight();
1288*cdf0e10cSrcweir         // delete visual representation
1289*cdf0e10cSrcweir         delete pItem->pPostIt;
1290*cdf0e10cSrcweir         // delete struct saving the pointers
1291*cdf0e10cSrcweir         delete pItem;
1292*cdf0e10cSrcweir     }
1293*cdf0e10cSrcweir     mvPostItFlds.clear();
1294*cdf0e10cSrcweir */
1295*cdf0e10cSrcweir 
1296*cdf0e10cSrcweir     mpWrtShell->EndUndo();
1297*cdf0e10cSrcweir     PrepareView();
1298*cdf0e10cSrcweir     mpWrtShell->EndAllAction();
1299*cdf0e10cSrcweir     mbLayout = true;
1300*cdf0e10cSrcweir     CalcRects();
1301*cdf0e10cSrcweir     LayoutPostIts();
1302*cdf0e10cSrcweir }
1303*cdf0e10cSrcweir #if 0
1304*cdf0e10cSrcweir void SwPostItMgr::Hide(SwPostItField* pPostItField )
1305*cdf0e10cSrcweir {
1306*cdf0e10cSrcweir     for(std::list<SwSidebarItem*>::iterator i = mvPostItFlds.begin(); i!= mvPostItFlds.end() ; i++)
1307*cdf0e10cSrcweir     {
1308*cdf0e10cSrcweir         if ((*i)->GetFmtFld())
1309*cdf0e10cSrcweir         {
1310*cdf0e10cSrcweir             SwPostItField* pField = static_cast<SwPostItField*>((*i)->GetFmtFld()->GetFld());
1311*cdf0e10cSrcweir             if (pPostItField==pField)
1312*cdf0e10cSrcweir             {
1313*cdf0e10cSrcweir                 (*i)->bShow = false;
1314*cdf0e10cSrcweir                 (*i)->pPostIt->HideNote();
1315*cdf0e10cSrcweir                 break;
1316*cdf0e10cSrcweir             }
1317*cdf0e10cSrcweir         }
1318*cdf0e10cSrcweir     }
1319*cdf0e10cSrcweir 
1320*cdf0e10cSrcweir     LayoutPostIts();
1321*cdf0e10cSrcweir }
1322*cdf0e10cSrcweir #endif
1323*cdf0e10cSrcweir void SwPostItMgr::Hide( const String& rAuthor )
1324*cdf0e10cSrcweir {
1325*cdf0e10cSrcweir     for(SwSidebarItem_iterator i = mvPostItFlds.begin(); i!= mvPostItFlds.end() ; i++)
1326*cdf0e10cSrcweir     {
1327*cdf0e10cSrcweir         if ( (*i)->pPostIt && ((*i)->pPostIt->GetAuthor() == rAuthor) )
1328*cdf0e10cSrcweir         {
1329*cdf0e10cSrcweir             (*i)->bShow  = false;
1330*cdf0e10cSrcweir             (*i)->pPostIt->HideNote();
1331*cdf0e10cSrcweir         }
1332*cdf0e10cSrcweir     }
1333*cdf0e10cSrcweir 
1334*cdf0e10cSrcweir     LayoutPostIts();
1335*cdf0e10cSrcweir }
1336*cdf0e10cSrcweir 
1337*cdf0e10cSrcweir void SwPostItMgr::Hide()
1338*cdf0e10cSrcweir {
1339*cdf0e10cSrcweir     for(SwSidebarItem_iterator i = mvPostItFlds.begin(); i!= mvPostItFlds.end() ; i++)
1340*cdf0e10cSrcweir     {
1341*cdf0e10cSrcweir         (*i)->bShow = false;
1342*cdf0e10cSrcweir         (*i)->pPostIt->HideNote();
1343*cdf0e10cSrcweir     }
1344*cdf0e10cSrcweir }
1345*cdf0e10cSrcweir 
1346*cdf0e10cSrcweir 
1347*cdf0e10cSrcweir void SwPostItMgr::Show()
1348*cdf0e10cSrcweir {
1349*cdf0e10cSrcweir     for(SwSidebarItem_iterator i = mvPostItFlds.begin(); i!= mvPostItFlds.end() ; i++)
1350*cdf0e10cSrcweir     {
1351*cdf0e10cSrcweir         (*i)->bShow = true;
1352*cdf0e10cSrcweir     }
1353*cdf0e10cSrcweir     LayoutPostIts();
1354*cdf0e10cSrcweir }
1355*cdf0e10cSrcweir 
1356*cdf0e10cSrcweir void SwPostItMgr::Sort(const short aType)
1357*cdf0e10cSrcweir {
1358*cdf0e10cSrcweir     if (mvPostItFlds.size()>1 )
1359*cdf0e10cSrcweir     {
1360*cdf0e10cSrcweir         switch (aType)
1361*cdf0e10cSrcweir         {
1362*cdf0e10cSrcweir             case SORT_POS:
1363*cdf0e10cSrcweir                 mvPostItFlds.sort(comp_pos);
1364*cdf0e10cSrcweir                 break;
1365*cdf0e10cSrcweir             /*
1366*cdf0e10cSrcweir             case SORT_AUTHOR:
1367*cdf0e10cSrcweir                 mvPostItFlds.sort(comp_author);
1368*cdf0e10cSrcweir                 break;
1369*cdf0e10cSrcweir             case SORT_DATE:
1370*cdf0e10cSrcweir                 mvPostItFlds.sort(comp_date);
1371*cdf0e10cSrcweir                 break;
1372*cdf0e10cSrcweir             */
1373*cdf0e10cSrcweir         }
1374*cdf0e10cSrcweir     }
1375*cdf0e10cSrcweir }
1376*cdf0e10cSrcweir 
1377*cdf0e10cSrcweir SwSidebarWin* SwPostItMgr::GetSidebarWin( const SfxBroadcaster* pBroadcaster) const
1378*cdf0e10cSrcweir {
1379*cdf0e10cSrcweir     for(const_iterator i = mvPostItFlds.begin(); i!= mvPostItFlds.end() ; i++)
1380*cdf0e10cSrcweir     {
1381*cdf0e10cSrcweir         if ( (*i)->GetBroadCaster() == pBroadcaster)
1382*cdf0e10cSrcweir             return (*i)->pPostIt;
1383*cdf0e10cSrcweir     }
1384*cdf0e10cSrcweir     return NULL;
1385*cdf0e10cSrcweir }
1386*cdf0e10cSrcweir 
1387*cdf0e10cSrcweir sw::annotation::SwAnnotationWin* SwPostItMgr::GetAnnotationWin(const SwPostItField* pFld) const
1388*cdf0e10cSrcweir {
1389*cdf0e10cSrcweir     for(const_iterator i = mvPostItFlds.begin(); i!= mvPostItFlds.end() ; i++)
1390*cdf0e10cSrcweir     {
1391*cdf0e10cSrcweir         if ( (*i)->GetFmtFld() && ((*i)->GetFmtFld()->GetFld() == pFld))
1392*cdf0e10cSrcweir             return dynamic_cast<sw::annotation::SwAnnotationWin*>((*i)->pPostIt);
1393*cdf0e10cSrcweir     }
1394*cdf0e10cSrcweir     return NULL;
1395*cdf0e10cSrcweir }
1396*cdf0e10cSrcweir 
1397*cdf0e10cSrcweir SwSidebarWin* SwPostItMgr::GetNextPostIt( sal_uInt16 aDirection,
1398*cdf0e10cSrcweir                                           SwSidebarWin* aPostIt )
1399*cdf0e10cSrcweir {
1400*cdf0e10cSrcweir     if (mvPostItFlds.size()>1)
1401*cdf0e10cSrcweir     {
1402*cdf0e10cSrcweir         for(SwSidebarItem_iterator i = mvPostItFlds.begin(); i!= mvPostItFlds.end() ; i++)
1403*cdf0e10cSrcweir         {
1404*cdf0e10cSrcweir             if ( (*i)->pPostIt ==aPostIt)
1405*cdf0e10cSrcweir             {
1406*cdf0e10cSrcweir                 SwSidebarItem_iterator iNextPostIt  = i;
1407*cdf0e10cSrcweir                 if (aDirection==KEY_PAGEUP)
1408*cdf0e10cSrcweir                 {
1409*cdf0e10cSrcweir                     if ( iNextPostIt==mvPostItFlds.begin() )
1410*cdf0e10cSrcweir                     {
1411*cdf0e10cSrcweir                         return NULL;
1412*cdf0e10cSrcweir                     }
1413*cdf0e10cSrcweir                     --iNextPostIt;
1414*cdf0e10cSrcweir                 }
1415*cdf0e10cSrcweir                 else
1416*cdf0e10cSrcweir                 {
1417*cdf0e10cSrcweir                     iNextPostIt++;
1418*cdf0e10cSrcweir                     if ( iNextPostIt==mvPostItFlds.end() )
1419*cdf0e10cSrcweir                     {
1420*cdf0e10cSrcweir                         return NULL;
1421*cdf0e10cSrcweir                     }
1422*cdf0e10cSrcweir                 }
1423*cdf0e10cSrcweir                 // lets quit, we are back at the beginng
1424*cdf0e10cSrcweir                 if ( (*iNextPostIt)->pPostIt==aPostIt)
1425*cdf0e10cSrcweir                     return NULL;
1426*cdf0e10cSrcweir                 return (*iNextPostIt)->pPostIt;
1427*cdf0e10cSrcweir             }
1428*cdf0e10cSrcweir         }
1429*cdf0e10cSrcweir         return NULL;
1430*cdf0e10cSrcweir     }
1431*cdf0e10cSrcweir     else
1432*cdf0e10cSrcweir         return NULL;
1433*cdf0e10cSrcweir }
1434*cdf0e10cSrcweir 
1435*cdf0e10cSrcweir long SwPostItMgr::GetNextBorder()
1436*cdf0e10cSrcweir {
1437*cdf0e10cSrcweir     for (unsigned long n=0;n<mPages.size();n++)
1438*cdf0e10cSrcweir     {
1439*cdf0e10cSrcweir         for(SwSidebarItem_iterator b = mPages[n]->mList->begin(); b!= mPages[n]->mList->end(); b++)
1440*cdf0e10cSrcweir         {
1441*cdf0e10cSrcweir             if ((*b)->pPostIt == mpActivePostIt)
1442*cdf0e10cSrcweir             {
1443*cdf0e10cSrcweir                 SwSidebarItem_iterator aNext = b;
1444*cdf0e10cSrcweir                 aNext++;
1445*cdf0e10cSrcweir                 bool bFollow = (aNext == mPages[n]->mList->end()) ? false : (*aNext)->pPostIt->IsFollow();
1446*cdf0e10cSrcweir                 if ( mPages[n]->bScrollbar || bFollow )
1447*cdf0e10cSrcweir                 {
1448*cdf0e10cSrcweir                     return -1;
1449*cdf0e10cSrcweir                 }
1450*cdf0e10cSrcweir                 else
1451*cdf0e10cSrcweir                 {
1452*cdf0e10cSrcweir                     //if this is the last item, return the bottom border otherwise the next item
1453*cdf0e10cSrcweir                     if (aNext == mPages[n]->mList->end())
1454*cdf0e10cSrcweir                         return mpEditWin->LogicToPixel(Point(0,mPages[n]->mPageRect.Bottom())).Y() - GetSpaceBetween();
1455*cdf0e10cSrcweir                     else
1456*cdf0e10cSrcweir                         return (*aNext)->pPostIt->GetPosPixel().Y() - GetSpaceBetween();
1457*cdf0e10cSrcweir                 }
1458*cdf0e10cSrcweir             }
1459*cdf0e10cSrcweir         }
1460*cdf0e10cSrcweir     }
1461*cdf0e10cSrcweir 
1462*cdf0e10cSrcweir     DBG_ERROR("SwPostItMgr::GetNextBorder(): We have to find a next border here");
1463*cdf0e10cSrcweir     return -1;
1464*cdf0e10cSrcweir }
1465*cdf0e10cSrcweir 
1466*cdf0e10cSrcweir void SwPostItMgr::SetShadowState(const SwPostItField* pFld,bool bCursor)
1467*cdf0e10cSrcweir {
1468*cdf0e10cSrcweir     if (pFld)
1469*cdf0e10cSrcweir     {
1470*cdf0e10cSrcweir         if (pFld !=mShadowState.mpShadowFld)
1471*cdf0e10cSrcweir         {
1472*cdf0e10cSrcweir             if (mShadowState.mpShadowFld)
1473*cdf0e10cSrcweir             {
1474*cdf0e10cSrcweir                 // reset old one if still alive
1475*cdf0e10cSrcweir                 // TODO: does not work properly if mouse and cursor was set
1476*cdf0e10cSrcweir                 sw::annotation::SwAnnotationWin* pOldPostIt =
1477*cdf0e10cSrcweir                                     GetAnnotationWin(mShadowState.mpShadowFld);
1478*cdf0e10cSrcweir                 if (pOldPostIt && pOldPostIt->Shadow() && (pOldPostIt->Shadow()->GetShadowState() != SS_EDIT))
1479*cdf0e10cSrcweir                     pOldPostIt->SetViewState(VS_NORMAL);
1480*cdf0e10cSrcweir             }
1481*cdf0e10cSrcweir             //set new one, if it is not currently edited
1482*cdf0e10cSrcweir             sw::annotation::SwAnnotationWin* pNewPostIt = GetAnnotationWin(pFld);
1483*cdf0e10cSrcweir             if (pNewPostIt && pNewPostIt->Shadow() && (pNewPostIt->Shadow()->GetShadowState() != SS_EDIT))
1484*cdf0e10cSrcweir             {
1485*cdf0e10cSrcweir                 pNewPostIt->SetViewState(VS_VIEW);
1486*cdf0e10cSrcweir                 //remember our new field
1487*cdf0e10cSrcweir                 mShadowState.mpShadowFld = pFld;
1488*cdf0e10cSrcweir                 mShadowState.bCursor = false;
1489*cdf0e10cSrcweir                 mShadowState.bMouse = false;
1490*cdf0e10cSrcweir             }
1491*cdf0e10cSrcweir         }
1492*cdf0e10cSrcweir         if (bCursor)
1493*cdf0e10cSrcweir             mShadowState.bCursor = true;
1494*cdf0e10cSrcweir         else
1495*cdf0e10cSrcweir             mShadowState.bMouse = true;
1496*cdf0e10cSrcweir     }
1497*cdf0e10cSrcweir     else
1498*cdf0e10cSrcweir     {
1499*cdf0e10cSrcweir         if (mShadowState.mpShadowFld)
1500*cdf0e10cSrcweir         {
1501*cdf0e10cSrcweir             if (bCursor)
1502*cdf0e10cSrcweir                 mShadowState.bCursor = false;
1503*cdf0e10cSrcweir             else
1504*cdf0e10cSrcweir                 mShadowState.bMouse = false;
1505*cdf0e10cSrcweir             if (!mShadowState.bCursor && !mShadowState.bMouse)
1506*cdf0e10cSrcweir             {
1507*cdf0e10cSrcweir                 // reset old one if still alive
1508*cdf0e10cSrcweir                 sw::annotation::SwAnnotationWin* pOldPostIt = GetAnnotationWin(mShadowState.mpShadowFld);
1509*cdf0e10cSrcweir                 if (pOldPostIt && pOldPostIt->Shadow() && (pOldPostIt->Shadow()->GetShadowState() != SS_EDIT))
1510*cdf0e10cSrcweir                 {
1511*cdf0e10cSrcweir                     pOldPostIt->SetViewState(VS_NORMAL);
1512*cdf0e10cSrcweir                     mShadowState.mpShadowFld = 0;
1513*cdf0e10cSrcweir                 }
1514*cdf0e10cSrcweir             }
1515*cdf0e10cSrcweir         }
1516*cdf0e10cSrcweir     }
1517*cdf0e10cSrcweir }
1518*cdf0e10cSrcweir 
1519*cdf0e10cSrcweir void SwPostItMgr::PrepareView(bool bIgnoreCount)
1520*cdf0e10cSrcweir {
1521*cdf0e10cSrcweir     if (!HasNotes() || bIgnoreCount)
1522*cdf0e10cSrcweir     {
1523*cdf0e10cSrcweir         mpWrtShell->StartAllAction();
1524*cdf0e10cSrcweir         //mpEditWin->Invalidate(); // really not needed anymore??
1525*cdf0e10cSrcweir         SwRootFrm* pLayout = mpWrtShell->GetLayout();
1526*cdf0e10cSrcweir         if ( pLayout )
1527*cdf0e10cSrcweir             SwPostItHelper::setSidebarChanged( pLayout,
1528*cdf0e10cSrcweir                 mpWrtShell->getIDocumentSettingAccess()->get( IDocumentSettingAccess::BROWSE_MODE ) );
1529*cdf0e10cSrcweir         mpWrtShell->EndAllAction();
1530*cdf0e10cSrcweir     }
1531*cdf0e10cSrcweir }
1532*cdf0e10cSrcweir 
1533*cdf0e10cSrcweir bool SwPostItMgr::ShowScrollbar(const unsigned long aPage) const
1534*cdf0e10cSrcweir {
1535*cdf0e10cSrcweir     if (mPages.size() > aPage-1)
1536*cdf0e10cSrcweir         return (mPages[aPage-1]->bScrollbar && !mbWaitingForCalcRects);
1537*cdf0e10cSrcweir     else
1538*cdf0e10cSrcweir         return false;
1539*cdf0e10cSrcweir }
1540*cdf0e10cSrcweir 
1541*cdf0e10cSrcweir bool SwPostItMgr::IsHit(const Point &aPointPixel)
1542*cdf0e10cSrcweir {
1543*cdf0e10cSrcweir     if (HasNotes() && ShowNotes())
1544*cdf0e10cSrcweir     {
1545*cdf0e10cSrcweir         const Point aPoint = mpEditWin->PixelToLogic(aPointPixel);
1546*cdf0e10cSrcweir         const SwRootFrm* pLayout = mpWrtShell->GetLayout();
1547*cdf0e10cSrcweir         SwRect aPageFrm;
1548*cdf0e10cSrcweir         const unsigned long nPageNum = SwPostItHelper::getPageInfo( aPageFrm, pLayout, aPoint );
1549*cdf0e10cSrcweir         if( nPageNum )
1550*cdf0e10cSrcweir         {
1551*cdf0e10cSrcweir             Rectangle aRect;
1552*cdf0e10cSrcweir             DBG_ASSERT(mPages.size()>nPageNum-1,"SwPostitMgr:: page container size wrong");
1553*cdf0e10cSrcweir             aRect = mPages[nPageNum-1]->eSidebarPosition == sw::sidebarwindows::SIDEBAR_LEFT
1554*cdf0e10cSrcweir                     ? Rectangle(Point(aPageFrm.Left()-GetSidebarWidth()-GetSidebarBorderWidth(),aPageFrm.Top()),Size(GetSidebarWidth(),aPageFrm.Height()))
1555*cdf0e10cSrcweir                     : Rectangle( Point(aPageFrm.Right()+GetSidebarBorderWidth(),aPageFrm.Top()) , Size(GetSidebarWidth(),aPageFrm.Height()));
1556*cdf0e10cSrcweir             if (aRect.IsInside(aPoint))
1557*cdf0e10cSrcweir             {
1558*cdf0e10cSrcweir                 // we hit the note's sidebar
1559*cdf0e10cSrcweir                 // lets now test for the arrow area
1560*cdf0e10cSrcweir                 if (mPages[nPageNum-1]->bScrollbar)
1561*cdf0e10cSrcweir                     return ScrollbarHit(nPageNum,aPoint);
1562*cdf0e10cSrcweir                 else
1563*cdf0e10cSrcweir                     return false;
1564*cdf0e10cSrcweir             }
1565*cdf0e10cSrcweir         }
1566*cdf0e10cSrcweir     }
1567*cdf0e10cSrcweir     return false;
1568*cdf0e10cSrcweir }
1569*cdf0e10cSrcweir Rectangle SwPostItMgr::GetBottomScrollRect(const unsigned long aPage) const
1570*cdf0e10cSrcweir {
1571*cdf0e10cSrcweir     SwRect aPageRect = mPages[aPage-1]->mPageRect;
1572*cdf0e10cSrcweir     Point aPointBottom = mPages[aPage-1]->eSidebarPosition == sw::sidebarwindows::SIDEBAR_LEFT
1573*cdf0e10cSrcweir                          ? Point(aPageRect.Left() - GetSidebarWidth() - GetSidebarBorderWidth() + mpEditWin->PixelToLogic(Size(2,0)).Width(),aPageRect.Bottom()- mpEditWin->PixelToLogic(Size(0,2+GetSidebarScrollerHeight())).Height())
1574*cdf0e10cSrcweir                          : Point(aPageRect.Right() + GetSidebarBorderWidth() + mpEditWin->PixelToLogic(Size(2,0)).Width(),aPageRect.Bottom()- mpEditWin->PixelToLogic(Size(0,2+GetSidebarScrollerHeight())).Height());
1575*cdf0e10cSrcweir     Size aSize(GetSidebarWidth() - mpEditWin->PixelToLogic(Size(4,0)).Width(), mpEditWin->PixelToLogic(Size(0,GetSidebarScrollerHeight())).Height()) ;
1576*cdf0e10cSrcweir     return Rectangle(aPointBottom,aSize);
1577*cdf0e10cSrcweir 
1578*cdf0e10cSrcweir }
1579*cdf0e10cSrcweir 
1580*cdf0e10cSrcweir Rectangle SwPostItMgr::GetTopScrollRect(const unsigned long aPage) const
1581*cdf0e10cSrcweir {
1582*cdf0e10cSrcweir     SwRect aPageRect = mPages[aPage-1]->mPageRect;
1583*cdf0e10cSrcweir     Point aPointTop = mPages[aPage-1]->eSidebarPosition == sw::sidebarwindows::SIDEBAR_LEFT
1584*cdf0e10cSrcweir                       ? Point(aPageRect.Left() - GetSidebarWidth() -GetSidebarBorderWidth()+ mpEditWin->PixelToLogic(Size(2,0)).Width(),aPageRect.Top() + mpEditWin->PixelToLogic(Size(0,2)).Height())
1585*cdf0e10cSrcweir                       : Point(aPageRect.Right() + GetSidebarBorderWidth() + mpEditWin->PixelToLogic(Size(2,0)).Width(),aPageRect.Top() + mpEditWin->PixelToLogic(Size(0,2)).Height());
1586*cdf0e10cSrcweir     Size aSize(GetSidebarWidth() - mpEditWin->PixelToLogic(Size(4,0)).Width(), mpEditWin->PixelToLogic(Size(0,GetSidebarScrollerHeight())).Height()) ;
1587*cdf0e10cSrcweir     return Rectangle(aPointTop,aSize);
1588*cdf0e10cSrcweir }
1589*cdf0e10cSrcweir 
1590*cdf0e10cSrcweir 
1591*cdf0e10cSrcweir //IMPORTANT: if you change the rects here, also change SwPageFrm::PaintNotesSidebar()
1592*cdf0e10cSrcweir bool SwPostItMgr::ScrollbarHit(const unsigned long aPage,const Point &aPoint)
1593*cdf0e10cSrcweir {
1594*cdf0e10cSrcweir     SwRect aPageRect = mPages[aPage-1]->mPageRect;
1595*cdf0e10cSrcweir     Point aPointBottom = mPages[aPage-1]->eSidebarPosition == sw::sidebarwindows::SIDEBAR_LEFT
1596*cdf0e10cSrcweir                          ? Point(aPageRect.Left() - GetSidebarWidth()-GetSidebarBorderWidth() + mpEditWin->PixelToLogic(Size(2,0)).Width(),aPageRect.Bottom()- mpEditWin->PixelToLogic(Size(0,2+GetSidebarScrollerHeight())).Height())
1597*cdf0e10cSrcweir                          : Point(aPageRect.Right() + GetSidebarBorderWidth()+ mpEditWin->PixelToLogic(Size(2,0)).Width(),aPageRect.Bottom()- mpEditWin->PixelToLogic(Size(0,2+GetSidebarScrollerHeight())).Height());
1598*cdf0e10cSrcweir 
1599*cdf0e10cSrcweir     Point aPointTop = mPages[aPage-1]->eSidebarPosition == sw::sidebarwindows::SIDEBAR_LEFT
1600*cdf0e10cSrcweir                       ? Point(aPageRect.Left() - GetSidebarWidth()-GetSidebarBorderWidth()+ mpEditWin->PixelToLogic(Size(2,0)).Width(),aPageRect.Top() + mpEditWin->PixelToLogic(Size(0,2)).Height())
1601*cdf0e10cSrcweir                       : Point(aPageRect.Right()+GetSidebarBorderWidth()+ mpEditWin->PixelToLogic(Size(2,0)).Width(),aPageRect.Top() + mpEditWin->PixelToLogic(Size(0,2)).Height());
1602*cdf0e10cSrcweir 
1603*cdf0e10cSrcweir     Rectangle aRectBottom(GetBottomScrollRect(aPage));
1604*cdf0e10cSrcweir     Rectangle aRectTop(GetTopScrollRect(aPage));
1605*cdf0e10cSrcweir 
1606*cdf0e10cSrcweir     if (aRectBottom.IsInside(aPoint))
1607*cdf0e10cSrcweir     {
1608*cdf0e10cSrcweir         if (aPoint.X() < long((aPointBottom.X() + GetSidebarWidth()/3)))
1609*cdf0e10cSrcweir             Scroll( GetScrollSize(),aPage);
1610*cdf0e10cSrcweir         else
1611*cdf0e10cSrcweir             Scroll( -1*GetScrollSize(), aPage);
1612*cdf0e10cSrcweir         return true;
1613*cdf0e10cSrcweir     }
1614*cdf0e10cSrcweir     else
1615*cdf0e10cSrcweir     if (aRectTop.IsInside(aPoint))
1616*cdf0e10cSrcweir     {
1617*cdf0e10cSrcweir         if (aPoint.X() < long((aPointTop.X() + GetSidebarWidth()/3*2)))
1618*cdf0e10cSrcweir             Scroll(GetScrollSize(), aPage);
1619*cdf0e10cSrcweir         else
1620*cdf0e10cSrcweir             Scroll(-1*GetScrollSize(), aPage);
1621*cdf0e10cSrcweir         return true;
1622*cdf0e10cSrcweir     }
1623*cdf0e10cSrcweir     return false;
1624*cdf0e10cSrcweir }
1625*cdf0e10cSrcweir 
1626*cdf0e10cSrcweir void SwPostItMgr::CorrectPositions()
1627*cdf0e10cSrcweir {
1628*cdf0e10cSrcweir    if ( mbWaitingForCalcRects || mbLayouting || mvPostItFlds.empty() )
1629*cdf0e10cSrcweir        return;
1630*cdf0e10cSrcweir 
1631*cdf0e10cSrcweir    // find first valid note
1632*cdf0e10cSrcweir    SwSidebarWin *pFirstPostIt = 0;
1633*cdf0e10cSrcweir    for(SwSidebarItem_iterator i = mvPostItFlds.begin(); i!= mvPostItFlds.end() ; i++)
1634*cdf0e10cSrcweir    {
1635*cdf0e10cSrcweir        pFirstPostIt = (*i)->pPostIt;
1636*cdf0e10cSrcweir        if (pFirstPostIt)
1637*cdf0e10cSrcweir             break;
1638*cdf0e10cSrcweir    }
1639*cdf0e10cSrcweir 
1640*cdf0e10cSrcweir    //if we have not found a valid note, forget about it and leave
1641*cdf0e10cSrcweir    if (!pFirstPostIt)
1642*cdf0e10cSrcweir        return;
1643*cdf0e10cSrcweir 
1644*cdf0e10cSrcweir     // 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
1645*cdf0e10cSrcweir     // --> OD 2010-06-03 #i111964# - check, if anchor overlay object exists.
1646*cdf0e10cSrcweir     const long aAnchorX = pFirstPostIt->Anchor()
1647*cdf0e10cSrcweir                           ? mpEditWin->LogicToPixel( Point((long)(pFirstPostIt->Anchor()->GetSixthPosition().getX()),0)).X()
1648*cdf0e10cSrcweir                           : 0;
1649*cdf0e10cSrcweir     const long aAnchorY = pFirstPostIt->Anchor()
1650*cdf0e10cSrcweir                           ? mpEditWin->LogicToPixel( Point(0,(long)(pFirstPostIt->Anchor()->GetSixthPosition().getY()))).Y() + 1
1651*cdf0e10cSrcweir                           : 0;
1652*cdf0e10cSrcweir     // <--
1653*cdf0e10cSrcweir     if (Point(aAnchorX,aAnchorY) != pFirstPostIt->GetPosPixel())
1654*cdf0e10cSrcweir     {
1655*cdf0e10cSrcweir         long aAnchorPosX = 0;
1656*cdf0e10cSrcweir         long aAnchorPosY = 0;
1657*cdf0e10cSrcweir         for (unsigned long n=0;n<mPages.size();n++)
1658*cdf0e10cSrcweir         {
1659*cdf0e10cSrcweir             for(SwSidebarItem_iterator i = mPages[n]->mList->begin(); i!= mPages[n]->mList->end(); i++)
1660*cdf0e10cSrcweir             {
1661*cdf0e10cSrcweir                 // --> OD 2010-06-03 #i111964# - check, if anchor overlay object exists.
1662*cdf0e10cSrcweir                 if ( (*i)->bShow && (*i)->pPostIt && (*i)->pPostIt->Anchor() )
1663*cdf0e10cSrcweir                 // <--
1664*cdf0e10cSrcweir                 {
1665*cdf0e10cSrcweir                     aAnchorPosX = mPages[n]->eSidebarPosition == sw::sidebarwindows::SIDEBAR_LEFT
1666*cdf0e10cSrcweir                         ? mpEditWin->LogicToPixel( Point((long)((*i)->pPostIt->Anchor()->GetSeventhPosition().getX()),0)).X()
1667*cdf0e10cSrcweir                         : mpEditWin->LogicToPixel( Point((long)((*i)->pPostIt->Anchor()->GetSixthPosition().getX()),0)).X();
1668*cdf0e10cSrcweir                     aAnchorPosY = mpEditWin->LogicToPixel( Point(0,(long)((*i)->pPostIt->Anchor()->GetSixthPosition().getY()))).Y() + 1;
1669*cdf0e10cSrcweir                     (*i)->pPostIt->SetPosPixel(Point(aAnchorPosX,aAnchorPosY));
1670*cdf0e10cSrcweir                }
1671*cdf0e10cSrcweir             }
1672*cdf0e10cSrcweir         }
1673*cdf0e10cSrcweir     }
1674*cdf0e10cSrcweir }
1675*cdf0e10cSrcweir 
1676*cdf0e10cSrcweir 
1677*cdf0e10cSrcweir bool SwPostItMgr::ShowNotes() const
1678*cdf0e10cSrcweir {
1679*cdf0e10cSrcweir     // we only want to see notes if Options - Writer - View - Notes is ticked
1680*cdf0e10cSrcweir     return mpWrtShell->GetViewOptions()->IsPostIts();
1681*cdf0e10cSrcweir }
1682*cdf0e10cSrcweir 
1683*cdf0e10cSrcweir bool SwPostItMgr::HasNotes() const
1684*cdf0e10cSrcweir {
1685*cdf0e10cSrcweir     return !mvPostItFlds.empty();
1686*cdf0e10cSrcweir }
1687*cdf0e10cSrcweir 
1688*cdf0e10cSrcweir unsigned long SwPostItMgr::GetSidebarWidth(bool bPx) const
1689*cdf0e10cSrcweir {
1690*cdf0e10cSrcweir     unsigned long aWidth = (unsigned long)(mpWrtShell->GetViewOptions()->GetZoom() * 1.8);
1691*cdf0e10cSrcweir     if (bPx)
1692*cdf0e10cSrcweir         return aWidth;
1693*cdf0e10cSrcweir     else
1694*cdf0e10cSrcweir         return mpEditWin->PixelToLogic(Size( aWidth ,0)).Width();
1695*cdf0e10cSrcweir }
1696*cdf0e10cSrcweir 
1697*cdf0e10cSrcweir unsigned long SwPostItMgr::GetSidebarBorderWidth(bool bPx) const
1698*cdf0e10cSrcweir {
1699*cdf0e10cSrcweir     if (bPx)
1700*cdf0e10cSrcweir         return 2;
1701*cdf0e10cSrcweir     else
1702*cdf0e10cSrcweir         return mpEditWin->PixelToLogic(Size(2,0)).Width();
1703*cdf0e10cSrcweir }
1704*cdf0e10cSrcweir 
1705*cdf0e10cSrcweir unsigned long SwPostItMgr::GetNoteWidth()
1706*cdf0e10cSrcweir {
1707*cdf0e10cSrcweir     return GetSidebarWidth(true);
1708*cdf0e10cSrcweir }
1709*cdf0e10cSrcweir 
1710*cdf0e10cSrcweir Color SwPostItMgr::GetColorDark(sal_uInt16 aAuthorIndex)
1711*cdf0e10cSrcweir {
1712*cdf0e10cSrcweir     if (!Application::GetSettings().GetStyleSettings().GetHighContrastMode())
1713*cdf0e10cSrcweir     {
1714*cdf0e10cSrcweir         static const Color aArrayNormal[] = {
1715*cdf0e10cSrcweir             COL_AUTHOR1_NORMAL,     COL_AUTHOR2_NORMAL,     COL_AUTHOR3_NORMAL,
1716*cdf0e10cSrcweir             COL_AUTHOR4_NORMAL,     COL_AUTHOR5_NORMAL,     COL_AUTHOR6_NORMAL,
1717*cdf0e10cSrcweir             COL_AUTHOR7_NORMAL,     COL_AUTHOR8_NORMAL,     COL_AUTHOR9_NORMAL };
1718*cdf0e10cSrcweir 
1719*cdf0e10cSrcweir         return Color( aArrayNormal[ aAuthorIndex % (sizeof( aArrayNormal )/ sizeof( aArrayNormal[0] ))]);
1720*cdf0e10cSrcweir     }
1721*cdf0e10cSrcweir     else
1722*cdf0e10cSrcweir         return Color(COL_WHITE);
1723*cdf0e10cSrcweir }
1724*cdf0e10cSrcweir 
1725*cdf0e10cSrcweir Color SwPostItMgr::GetColorLight(sal_uInt16 aAuthorIndex)
1726*cdf0e10cSrcweir {
1727*cdf0e10cSrcweir     if (!Application::GetSettings().GetStyleSettings().GetHighContrastMode())
1728*cdf0e10cSrcweir     {
1729*cdf0e10cSrcweir         static const Color aArrayLight[] = {
1730*cdf0e10cSrcweir             COL_AUTHOR1_LIGHT,      COL_AUTHOR2_LIGHT,      COL_AUTHOR3_LIGHT,
1731*cdf0e10cSrcweir             COL_AUTHOR4_LIGHT,      COL_AUTHOR5_LIGHT,      COL_AUTHOR6_LIGHT,
1732*cdf0e10cSrcweir             COL_AUTHOR7_LIGHT,      COL_AUTHOR8_LIGHT,      COL_AUTHOR9_LIGHT };
1733*cdf0e10cSrcweir 
1734*cdf0e10cSrcweir         return Color( aArrayLight[ aAuthorIndex % (sizeof( aArrayLight )/ sizeof( aArrayLight[0] ))]);
1735*cdf0e10cSrcweir     }
1736*cdf0e10cSrcweir     else
1737*cdf0e10cSrcweir         return Color(COL_WHITE);
1738*cdf0e10cSrcweir }
1739*cdf0e10cSrcweir 
1740*cdf0e10cSrcweir Color SwPostItMgr::GetColorAnchor(sal_uInt16 aAuthorIndex)
1741*cdf0e10cSrcweir {
1742*cdf0e10cSrcweir     if (!Application::GetSettings().GetStyleSettings().GetHighContrastMode())
1743*cdf0e10cSrcweir     {
1744*cdf0e10cSrcweir         static const Color aArrayAnchor[] = {
1745*cdf0e10cSrcweir             COL_AUTHOR1_DARK,       COL_AUTHOR2_DARK,       COL_AUTHOR3_DARK,
1746*cdf0e10cSrcweir             COL_AUTHOR4_DARK,       COL_AUTHOR5_DARK,       COL_AUTHOR6_DARK,
1747*cdf0e10cSrcweir             COL_AUTHOR7_DARK,       COL_AUTHOR8_DARK,       COL_AUTHOR9_DARK };
1748*cdf0e10cSrcweir 
1749*cdf0e10cSrcweir         return Color( aArrayAnchor[  aAuthorIndex % (sizeof( aArrayAnchor )  / sizeof( aArrayAnchor[0] ))]);
1750*cdf0e10cSrcweir     }
1751*cdf0e10cSrcweir     else
1752*cdf0e10cSrcweir         return Color(COL_WHITE);
1753*cdf0e10cSrcweir }
1754*cdf0e10cSrcweir 
1755*cdf0e10cSrcweir void SwPostItMgr::SetActiveSidebarWin( SwSidebarWin* p)
1756*cdf0e10cSrcweir {
1757*cdf0e10cSrcweir     if ( p != mpActivePostIt )
1758*cdf0e10cSrcweir     {
1759*cdf0e10cSrcweir         // we need the temp variable so we can set mpActivePostIt before we call DeactivatePostIt
1760*cdf0e10cSrcweir         // therefore we get a new layout in DOCCHANGED when switching from postit to document,
1761*cdf0e10cSrcweir         // otherwise, GetActivePostIt() would still hold our old postit
1762*cdf0e10cSrcweir         SwSidebarWin* pActive = mpActivePostIt;
1763*cdf0e10cSrcweir         mpActivePostIt = p;
1764*cdf0e10cSrcweir         if (pActive)
1765*cdf0e10cSrcweir         {
1766*cdf0e10cSrcweir             pActive->DeactivatePostIt();
1767*cdf0e10cSrcweir             mShadowState.mpShadowFld = 0;
1768*cdf0e10cSrcweir         }
1769*cdf0e10cSrcweir         if (mpActivePostIt)
1770*cdf0e10cSrcweir         {
1771*cdf0e10cSrcweir             mpActivePostIt->GotoPos();
1772*cdf0e10cSrcweir             mpView->AttrChangedNotify(0);
1773*cdf0e10cSrcweir             mpActivePostIt->ActivatePostIt();
1774*cdf0e10cSrcweir         }
1775*cdf0e10cSrcweir     }
1776*cdf0e10cSrcweir }
1777*cdf0e10cSrcweir 
1778*cdf0e10cSrcweir IMPL_LINK( SwPostItMgr, CalcHdl, void*, /* pVoid*/  )
1779*cdf0e10cSrcweir {
1780*cdf0e10cSrcweir     mnEventId = 0;
1781*cdf0e10cSrcweir     if ( mbLayouting )
1782*cdf0e10cSrcweir     {
1783*cdf0e10cSrcweir         DBG_ERROR("Reentrance problem in Layout Manager!");
1784*cdf0e10cSrcweir         mbWaitingForCalcRects = false;
1785*cdf0e10cSrcweir         return 0;
1786*cdf0e10cSrcweir     }
1787*cdf0e10cSrcweir 
1788*cdf0e10cSrcweir     // do not change order, even if it would seem so in the first place, we need the calcrects always
1789*cdf0e10cSrcweir     if (CalcRects() || mbLayout)
1790*cdf0e10cSrcweir     {
1791*cdf0e10cSrcweir         mbLayout = false;
1792*cdf0e10cSrcweir         LayoutPostIts();
1793*cdf0e10cSrcweir     }
1794*cdf0e10cSrcweir     return 0;
1795*cdf0e10cSrcweir }
1796*cdf0e10cSrcweir 
1797*cdf0e10cSrcweir void SwPostItMgr::Rescale()
1798*cdf0e10cSrcweir {
1799*cdf0e10cSrcweir     for(std::list<SwSidebarItem*>::iterator i = mvPostItFlds.begin(); i!= mvPostItFlds.end() ; i++)
1800*cdf0e10cSrcweir         if ( (*i)->pPostIt )
1801*cdf0e10cSrcweir             (*i)->pPostIt->Rescale();
1802*cdf0e10cSrcweir }
1803*cdf0e10cSrcweir 
1804*cdf0e10cSrcweir sal_Int32 SwPostItMgr::GetInitialAnchorDistance() const
1805*cdf0e10cSrcweir {
1806*cdf0e10cSrcweir     const Fraction& f( mpEditWin->GetMapMode().GetScaleY() );
1807*cdf0e10cSrcweir     return POSTIT_INITIAL_ANCHOR_DISTANCE * f.GetNumerator() / f.GetDenominator();
1808*cdf0e10cSrcweir }
1809*cdf0e10cSrcweir 
1810*cdf0e10cSrcweir sal_Int32 SwPostItMgr::GetSpaceBetween() const
1811*cdf0e10cSrcweir {
1812*cdf0e10cSrcweir     const Fraction& f( mpEditWin->GetMapMode().GetScaleY() );
1813*cdf0e10cSrcweir     return ( POSTIT_SPACE_BETWEEN ) * f.GetNumerator() / f.GetDenominator();
1814*cdf0e10cSrcweir }
1815*cdf0e10cSrcweir 
1816*cdf0e10cSrcweir sal_Int32 SwPostItMgr::GetScrollSize() const
1817*cdf0e10cSrcweir {
1818*cdf0e10cSrcweir     const Fraction& f( mpEditWin->GetMapMode().GetScaleY() );
1819*cdf0e10cSrcweir     return ( POSTIT_SPACE_BETWEEN + POSTIT_MINIMUMSIZE_WITH_META ) * f.GetNumerator() / f.GetDenominator();
1820*cdf0e10cSrcweir }
1821*cdf0e10cSrcweir 
1822*cdf0e10cSrcweir sal_Int32 SwPostItMgr::GetMinimumSizeWithMeta() const
1823*cdf0e10cSrcweir {
1824*cdf0e10cSrcweir     const Fraction& f( mpEditWin->GetMapMode().GetScaleY() );
1825*cdf0e10cSrcweir     return POSTIT_MINIMUMSIZE_WITH_META * f.GetNumerator() / f.GetDenominator();
1826*cdf0e10cSrcweir }
1827*cdf0e10cSrcweir 
1828*cdf0e10cSrcweir sal_Int32 SwPostItMgr::GetSidebarScrollerHeight() const
1829*cdf0e10cSrcweir {
1830*cdf0e10cSrcweir     const Fraction& f( mpEditWin->GetMapMode().GetScaleY() );
1831*cdf0e10cSrcweir     return POSTIT_SCROLL_SIDEBAR_HEIGHT * f.GetNumerator() / f.GetDenominator();
1832*cdf0e10cSrcweir }
1833*cdf0e10cSrcweir 
1834*cdf0e10cSrcweir void SwPostItMgr::SetSpellChecking()
1835*cdf0e10cSrcweir {
1836*cdf0e10cSrcweir     for(std::list<SwSidebarItem*>::iterator i = mvPostItFlds.begin(); i!= mvPostItFlds.end() ; i++)
1837*cdf0e10cSrcweir         if ( (*i)->pPostIt )
1838*cdf0e10cSrcweir             (*i)->pPostIt->SetSpellChecking();
1839*cdf0e10cSrcweir }
1840*cdf0e10cSrcweir 
1841*cdf0e10cSrcweir void SwPostItMgr::SetReadOnlyState()
1842*cdf0e10cSrcweir {
1843*cdf0e10cSrcweir     for(std::list<SwSidebarItem*>::iterator i = mvPostItFlds.begin(); i!= mvPostItFlds.end() ; i++)
1844*cdf0e10cSrcweir         if ( (*i)->pPostIt )
1845*cdf0e10cSrcweir             (*i)->pPostIt->SetReadonly( mbReadOnly );
1846*cdf0e10cSrcweir }
1847*cdf0e10cSrcweir 
1848*cdf0e10cSrcweir void SwPostItMgr::CheckMetaText()
1849*cdf0e10cSrcweir {
1850*cdf0e10cSrcweir         for(std::list<SwSidebarItem*>::iterator i = mvPostItFlds.begin(); i!= mvPostItFlds.end() ; i++)
1851*cdf0e10cSrcweir                 if ( (*i)->pPostIt )
1852*cdf0e10cSrcweir                        (*i)->pPostIt->CheckMetaText();
1853*cdf0e10cSrcweir 
1854*cdf0e10cSrcweir }
1855*cdf0e10cSrcweir 
1856*cdf0e10cSrcweir sal_uInt16 SwPostItMgr::Replace(SvxSearchItem* pItem)
1857*cdf0e10cSrcweir {
1858*cdf0e10cSrcweir     SwSidebarWin* pWin = GetActiveSidebarWin();
1859*cdf0e10cSrcweir     sal_uInt16 aResult = pWin->GetOutlinerView()->StartSearchAndReplace( *pItem );
1860*cdf0e10cSrcweir     if (!aResult)
1861*cdf0e10cSrcweir         SetActiveSidebarWin(0);
1862*cdf0e10cSrcweir     return aResult;
1863*cdf0e10cSrcweir }
1864*cdf0e10cSrcweir 
1865*cdf0e10cSrcweir sal_uInt16 SwPostItMgr::FinishSearchReplace(const ::com::sun::star::util::SearchOptions& rSearchOptions, bool bSrchForward)
1866*cdf0e10cSrcweir {
1867*cdf0e10cSrcweir     SwSidebarWin* pWin = GetActiveSidebarWin();
1868*cdf0e10cSrcweir     SvxSearchItem aItem(SID_SEARCH_ITEM );
1869*cdf0e10cSrcweir     aItem.SetSearchOptions(rSearchOptions);
1870*cdf0e10cSrcweir     aItem.SetBackward(!bSrchForward);
1871*cdf0e10cSrcweir     sal_uInt16 aResult = pWin->GetOutlinerView()->StartSearchAndReplace( aItem );
1872*cdf0e10cSrcweir     if (!aResult)
1873*cdf0e10cSrcweir         SetActiveSidebarWin(0);
1874*cdf0e10cSrcweir     return aResult;
1875*cdf0e10cSrcweir }
1876*cdf0e10cSrcweir 
1877*cdf0e10cSrcweir sal_uInt16 SwPostItMgr::SearchReplace(const SwFmtFld &pFld, const ::com::sun::star::util::SearchOptions& rSearchOptions, bool bSrchForward)
1878*cdf0e10cSrcweir {
1879*cdf0e10cSrcweir     sal_uInt16 aResult = 0;
1880*cdf0e10cSrcweir     SwSidebarWin* pWin = GetSidebarWin(&pFld);
1881*cdf0e10cSrcweir     if (pWin)
1882*cdf0e10cSrcweir     {
1883*cdf0e10cSrcweir         ESelection aOldSelection = pWin->GetOutlinerView()->GetSelection();
1884*cdf0e10cSrcweir         if (bSrchForward)
1885*cdf0e10cSrcweir             pWin->GetOutlinerView()->SetSelection(ESelection(0,0,0,0));
1886*cdf0e10cSrcweir         else
1887*cdf0e10cSrcweir             pWin->GetOutlinerView()->SetSelection(ESelection(0xFFFF,0xFFFF,0xFFFF,0xFFFF));
1888*cdf0e10cSrcweir         SvxSearchItem aItem(SID_SEARCH_ITEM );
1889*cdf0e10cSrcweir         aItem.SetSearchOptions(rSearchOptions);
1890*cdf0e10cSrcweir         aItem.SetBackward(!bSrchForward);
1891*cdf0e10cSrcweir         aResult = pWin->GetOutlinerView()->StartSearchAndReplace( aItem );
1892*cdf0e10cSrcweir         if (!aResult)
1893*cdf0e10cSrcweir             pWin->GetOutlinerView()->SetSelection(aOldSelection);
1894*cdf0e10cSrcweir         else
1895*cdf0e10cSrcweir         {
1896*cdf0e10cSrcweir             SetActiveSidebarWin(pWin);
1897*cdf0e10cSrcweir             MakeVisible(pWin);
1898*cdf0e10cSrcweir         }
1899*cdf0e10cSrcweir     }
1900*cdf0e10cSrcweir     return aResult;
1901*cdf0e10cSrcweir }
1902*cdf0e10cSrcweir 
1903*cdf0e10cSrcweir void SwPostItMgr::AssureStdModeAtShell()
1904*cdf0e10cSrcweir {
1905*cdf0e10cSrcweir     //#i103373# #i103645#
1906*cdf0e10cSrcweir         // deselect any drawing or frame and leave editing mode
1907*cdf0e10cSrcweir         SdrView* pSdrView = mpWrtShell->GetDrawView();
1908*cdf0e10cSrcweir         if ( pSdrView && pSdrView->IsTextEdit() )
1909*cdf0e10cSrcweir         {
1910*cdf0e10cSrcweir             sal_Bool bLockView = mpWrtShell->IsViewLocked();
1911*cdf0e10cSrcweir             mpWrtShell->LockView( sal_True );
1912*cdf0e10cSrcweir             mpWrtShell->EndTextEdit();
1913*cdf0e10cSrcweir                 mpWrtShell->LockView( bLockView );
1914*cdf0e10cSrcweir         }
1915*cdf0e10cSrcweir 
1916*cdf0e10cSrcweir         if( mpWrtShell->IsSelFrmMode() || mpWrtShell->IsObjSelected())
1917*cdf0e10cSrcweir         {
1918*cdf0e10cSrcweir                 mpWrtShell->UnSelectFrm();
1919*cdf0e10cSrcweir                 mpWrtShell->LeaveSelFrmMode();
1920*cdf0e10cSrcweir                 mpWrtShell->GetView().LeaveDrawCreate();
1921*cdf0e10cSrcweir                 mpWrtShell->EnterStdMode();
1922*cdf0e10cSrcweir 
1923*cdf0e10cSrcweir                 mpWrtShell->DrawSelChanged();
1924*cdf0e10cSrcweir                 mpView->StopShellTimer();
1925*cdf0e10cSrcweir         }
1926*cdf0e10cSrcweir }
1927*cdf0e10cSrcweir 
1928*cdf0e10cSrcweir bool SwPostItMgr::HasActiveSidebarWin() const
1929*cdf0e10cSrcweir {
1930*cdf0e10cSrcweir     return mpActivePostIt != 0;
1931*cdf0e10cSrcweir }
1932*cdf0e10cSrcweir 
1933*cdf0e10cSrcweir bool SwPostItMgr::HasActiveAnnotationWin() const
1934*cdf0e10cSrcweir {
1935*cdf0e10cSrcweir     return HasActiveSidebarWin() &&
1936*cdf0e10cSrcweir            dynamic_cast<sw::annotation::SwAnnotationWin*>(mpActivePostIt) != 0;
1937*cdf0e10cSrcweir }
1938*cdf0e10cSrcweir 
1939*cdf0e10cSrcweir void SwPostItMgr::GrabFocusOnActiveSidebarWin()
1940*cdf0e10cSrcweir {
1941*cdf0e10cSrcweir     if ( HasActiveSidebarWin() )
1942*cdf0e10cSrcweir     {
1943*cdf0e10cSrcweir         mpActivePostIt->GrabFocus();
1944*cdf0e10cSrcweir     }
1945*cdf0e10cSrcweir }
1946*cdf0e10cSrcweir 
1947*cdf0e10cSrcweir void SwPostItMgr::UpdateDataOnActiveSidebarWin()
1948*cdf0e10cSrcweir {
1949*cdf0e10cSrcweir     if ( HasActiveSidebarWin() )
1950*cdf0e10cSrcweir     {
1951*cdf0e10cSrcweir         mpActivePostIt->UpdateData();
1952*cdf0e10cSrcweir     }
1953*cdf0e10cSrcweir }
1954*cdf0e10cSrcweir 
1955*cdf0e10cSrcweir void SwPostItMgr::DeleteActiveSidebarWin()
1956*cdf0e10cSrcweir {
1957*cdf0e10cSrcweir     if ( HasActiveSidebarWin() )
1958*cdf0e10cSrcweir     {
1959*cdf0e10cSrcweir         mpActivePostIt->Delete();
1960*cdf0e10cSrcweir     }
1961*cdf0e10cSrcweir }
1962*cdf0e10cSrcweir 
1963*cdf0e10cSrcweir void SwPostItMgr::HideActiveSidebarWin()
1964*cdf0e10cSrcweir {
1965*cdf0e10cSrcweir     if ( HasActiveSidebarWin() )
1966*cdf0e10cSrcweir     {
1967*cdf0e10cSrcweir         mpActivePostIt->Hide();
1968*cdf0e10cSrcweir     }
1969*cdf0e10cSrcweir }
1970*cdf0e10cSrcweir 
1971*cdf0e10cSrcweir void SwPostItMgr::ToggleInsModeOnActiveSidebarWin()
1972*cdf0e10cSrcweir {
1973*cdf0e10cSrcweir     if ( HasActiveSidebarWin() )
1974*cdf0e10cSrcweir     {
1975*cdf0e10cSrcweir         mpActivePostIt->ToggleInsMode();
1976*cdf0e10cSrcweir     }
1977*cdf0e10cSrcweir }
1978*cdf0e10cSrcweir 
1979*cdf0e10cSrcweir void SwPostItMgr::ConnectSidebarWinToFrm( const SwFrm& rFrm,
1980*cdf0e10cSrcweir                                           const SwFmtFld& rFmtFld,
1981*cdf0e10cSrcweir                                           SwSidebarWin& rSidebarWin )
1982*cdf0e10cSrcweir {
1983*cdf0e10cSrcweir     if ( mpFrmSidebarWinContainer == 0 )
1984*cdf0e10cSrcweir     {
1985*cdf0e10cSrcweir         mpFrmSidebarWinContainer = new SwFrmSidebarWinContainer();
1986*cdf0e10cSrcweir     }
1987*cdf0e10cSrcweir 
1988*cdf0e10cSrcweir     const bool bInserted = mpFrmSidebarWinContainer->insert( rFrm, rFmtFld, rSidebarWin );
1989*cdf0e10cSrcweir     if ( bInserted &&
1990*cdf0e10cSrcweir          mpWrtShell->GetAccessibleMap() )
1991*cdf0e10cSrcweir     {
1992*cdf0e10cSrcweir         mpWrtShell->GetAccessibleMap()->InvalidatePosOrSize( 0, 0, &rSidebarWin, SwRect() );
1993*cdf0e10cSrcweir     }
1994*cdf0e10cSrcweir }
1995*cdf0e10cSrcweir 
1996*cdf0e10cSrcweir void SwPostItMgr::DisconnectSidebarWinFromFrm( const SwFrm& rFrm,
1997*cdf0e10cSrcweir                                                SwSidebarWin& rSidebarWin )
1998*cdf0e10cSrcweir {
1999*cdf0e10cSrcweir     if ( mpFrmSidebarWinContainer != 0 )
2000*cdf0e10cSrcweir     {
2001*cdf0e10cSrcweir         const bool bRemoved = mpFrmSidebarWinContainer->remove( rFrm, rSidebarWin );
2002*cdf0e10cSrcweir         if ( bRemoved &&
2003*cdf0e10cSrcweir              mpWrtShell->GetAccessibleMap() )
2004*cdf0e10cSrcweir         {
2005*cdf0e10cSrcweir             mpWrtShell->GetAccessibleMap()->Dispose( 0, 0, &rSidebarWin );
2006*cdf0e10cSrcweir         }
2007*cdf0e10cSrcweir     }
2008*cdf0e10cSrcweir }
2009*cdf0e10cSrcweir 
2010*cdf0e10cSrcweir bool SwPostItMgr::HasFrmConnectedSidebarWins( const SwFrm& rFrm )
2011*cdf0e10cSrcweir {
2012*cdf0e10cSrcweir     bool bRet( false );
2013*cdf0e10cSrcweir 
2014*cdf0e10cSrcweir     if ( mpFrmSidebarWinContainer != 0 )
2015*cdf0e10cSrcweir     {
2016*cdf0e10cSrcweir         bRet = !mpFrmSidebarWinContainer->empty( rFrm );
2017*cdf0e10cSrcweir     }
2018*cdf0e10cSrcweir 
2019*cdf0e10cSrcweir     return bRet;
2020*cdf0e10cSrcweir }
2021*cdf0e10cSrcweir 
2022*cdf0e10cSrcweir Window* SwPostItMgr::GetSidebarWinForFrmByIndex( const SwFrm& rFrm,
2023*cdf0e10cSrcweir                                                  const sal_Int32 nIndex )
2024*cdf0e10cSrcweir {
2025*cdf0e10cSrcweir     Window* pSidebarWin( 0 );
2026*cdf0e10cSrcweir 
2027*cdf0e10cSrcweir     if ( mpFrmSidebarWinContainer != 0 )
2028*cdf0e10cSrcweir     {
2029*cdf0e10cSrcweir         pSidebarWin = mpFrmSidebarWinContainer->get( rFrm, nIndex );
2030*cdf0e10cSrcweir     }
2031*cdf0e10cSrcweir 
2032*cdf0e10cSrcweir     return pSidebarWin;
2033*cdf0e10cSrcweir }
2034*cdf0e10cSrcweir 
2035*cdf0e10cSrcweir void SwPostItMgr::GetAllSidebarWinForFrm( const SwFrm& rFrm,
2036*cdf0e10cSrcweir                                           std::vector< Window* >* pChildren )
2037*cdf0e10cSrcweir {
2038*cdf0e10cSrcweir     if ( mpFrmSidebarWinContainer != 0 )
2039*cdf0e10cSrcweir     {
2040*cdf0e10cSrcweir         mpFrmSidebarWinContainer->getAll( rFrm, pChildren );
2041*cdf0e10cSrcweir     }
2042*cdf0e10cSrcweir }
2043*cdf0e10cSrcweir 
2044*cdf0e10cSrcweir void SwNoteProps::Commit() {}
2045*cdf0e10cSrcweir void SwNoteProps::Notify( const ::com::sun::star::uno::Sequence< rtl::OUString >& ) {}
2046