xref: /trunk/main/sw/source/ui/docvw/SidebarWin.cxx (revision c2eaa082)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 #include "precompiled_sw.hxx"
25 
26 #include <SidebarWin.hxx>
27 #include <SidebarWinAcc.hxx>
28 #include <PostItMgr.hxx>
29 
30 #include <SidebarTxtControl.hxx>
31 #include <AnchorOverlayObject.hxx>
32 #include <ShadowOverlayObject.hxx>
33 #include <OverlayRanges.hxx>
34 
35 #include <annotation.hrc>
36 #include <popup.hrc>
37 #include <docvw.hrc>
38 #include <app.hrc>
39 #include <access.hrc>
40 
41 #include <viewopt.hxx>
42 #include <cmdid.h>
43 
44 #include <editeng/fontitem.hxx>
45 #include <editeng/fhgtitem.hxx>
46 #include <editeng/langitem.hxx>
47 #include <editeng/editview.hxx>
48 #include <editeng/outliner.hxx>
49 #include <editeng/editeng.hxx>
50 #include <editeng/eeitem.hxx>
51 
52 #include <svl/zforlist.hxx>
53 #include <svl/undo.hxx>
54 #include <svl/stritem.hxx>
55 
56 #include <sfx2/viewfrm.hxx>
57 #include <sfx2/bindings.hxx>
58 #include <sfx2/dispatch.hxx>
59 
60 #include <vcl/scrbar.hxx>
61 #include <vcl/svapp.hxx>
62 #include <vcl/menubtn.hxx>
63 
64 #include <edtwin.hxx>
65 #include <view.hxx>
66 #include <docsh.hxx>
67 #include <wrtsh.hxx>
68 #include <doc.hxx>
69 #include <swmodule.hxx>
70 #include <langhelper.hxx>
71 
72 #include <txtannotationfld.hxx>
73 #include <ndtxt.hxx>
74 
75 #include <sw_primitivetypes2d.hxx>
76 #include <drawinglayer/primitive2d/primitivetools2d.hxx>
77 #include <drawinglayer/primitive2d/fillgradientprimitive2d.hxx>
78 #include <drawinglayer/primitive2d/polypolygonprimitive2d.hxx>
79 #include <drawinglayer/primitive2d/polygonprimitive2d.hxx>
80 #include <drawinglayer/primitive2d/shadowprimitive2d.hxx>
81 
82 namespace css = ::com::sun::star;
83 
84 namespace sw { namespace sidebarwindows {
85 
86 #define METABUTTON_WIDTH        16
87 #define METABUTTON_HEIGHT       18
88 #define METABUTTON_AREA_WIDTH   30
89 #define POSTIT_META_HEIGHT  (sal_Int32)     30
90 #define POSTIT_MINIMUMSIZE_WITHOUT_META     50
91 
92 #define POSTIT_SHADOW_BRIGHT    Color(180,180,180)
93 #define POSTIT_SHADOW_DARK      Color(83,83,83)
94 
95 #define EMPTYSTRING             rtl::OUString::createFromAscii("")
96 
97 /************** SwSidebarWin************************************/
SwSidebarWin(SwEditWin & rEditWin,WinBits nBits,SwPostItMgr & aMgr,SwPostItBits aBits,SwSidebarItem & rSidebarItem)98 SwSidebarWin::SwSidebarWin( SwEditWin& rEditWin,
99                             WinBits nBits,
100                             SwPostItMgr& aMgr,
101                             SwPostItBits aBits,
102                             SwSidebarItem& rSidebarItem )
103     : Window(&rEditWin, nBits)
104     , mrMgr(aMgr)
105     , mrView( rEditWin.GetView() )
106     , nFlags(aBits)
107     , mnEventId(0)
108     , mpOutlinerView(0)
109     , mpOutliner(0)
110     , mpSidebarTxtControl(0)
111     , mpVScrollbar(0)
112     , mpMetadataAuthor(0)
113     , mpMetadataDate(0)
114     , mpMenuButton(0)
115     , mpAnchor( NULL )
116     , mpShadow( NULL )
117     , mpTextRangeOverlay( NULL )
118     , mColorAnchor()
119     , mColorDark()
120     , mColorLight()
121     , mChangeColor()
122     , meSidebarPosition( sw::sidebarwindows::SIDEBAR_NONE )
123     , mPosSize()
124     , mAnchorRect()
125     , mPageBorder( 0 )
126     , mbMouseOver( false )
127     , mLayoutStatus( SwPostItHelper::INVISIBLE )
128     , mbReadonly( false )
129     , mbIsFollow( false )
130     , mrSidebarItem( rSidebarItem )
131     , mpAnchorFrm( rSidebarItem.maLayoutInfo.mpAnchorFrm )
132 {
133     mpShadow = ShadowOverlayObject::CreateShadowOverlayObject( mrView );
134     if ( mpShadow )
135     {
136         mpShadow->setVisible(false);
137     }
138 
139     mrMgr.ConnectSidebarWinToFrm( *(mrSidebarItem.maLayoutInfo.mpAnchorFrm),
140                                   mrSidebarItem.GetFmtFld(),
141                                   *this );
142 }
143 
~SwSidebarWin()144 SwSidebarWin::~SwSidebarWin()
145 {
146     mrMgr.DisconnectSidebarWinFromFrm( *(mrSidebarItem.maLayoutInfo.mpAnchorFrm),
147                                        *this );
148 
149     Disable();
150 
151     if ( mpSidebarTxtControl )
152     {
153         if ( mpOutlinerView )
154         {
155             mpOutlinerView->SetWindow( 0 );
156         }
157         delete mpSidebarTxtControl;
158         mpSidebarTxtControl = 0;
159     }
160 
161     if ( mpOutlinerView )
162     {
163         delete mpOutlinerView;
164         mpOutlinerView = 0;
165     }
166 
167     if (mpOutliner)
168     {
169         delete mpOutliner;
170         mpOutliner = 0;
171     }
172 
173     if (mpMetadataAuthor)
174     {
175         mpMetadataAuthor->RemoveEventListener( LINK( this, SwSidebarWin, WindowEventListener ) );
176         delete mpMetadataAuthor;
177         mpMetadataAuthor = 0;
178     }
179 
180     if (mpMetadataDate)
181     {
182         mpMetadataDate->RemoveEventListener( LINK( this, SwSidebarWin, WindowEventListener ) );
183         delete mpMetadataDate;
184         mpMetadataDate = 0;
185     }
186 
187     if (mpVScrollbar)
188     {
189         mpVScrollbar->RemoveEventListener( LINK( this, SwSidebarWin, WindowEventListener ) );
190         delete mpVScrollbar;
191         mpVScrollbar = 0;
192     }
193 
194     AnchorOverlayObject::DestroyAnchorOverlayObject( mpAnchor );
195     mpAnchor = NULL;
196 
197     ShadowOverlayObject::DestroyShadowOverlayObject( mpShadow );
198     mpShadow = NULL;
199 
200     delete mpTextRangeOverlay;
201     mpTextRangeOverlay = NULL;
202 
203     delete mpMenuButton;
204     mpMenuButton = 0;
205 
206     if (mnEventId)
207         Application::RemoveUserEvent( mnEventId );
208 }
209 
Paint(const Rectangle & rRect)210 void SwSidebarWin::Paint( const Rectangle& rRect)
211 {
212     Window::Paint(rRect);
213 
214     if (mpMetadataAuthor->IsVisible() )
215     {
216         //draw left over space
217         if ( Application::GetSettings().GetStyleSettings().GetHighContrastMode() )
218         {
219             SetFillColor(COL_BLACK);
220         }
221         else
222         {
223             SetFillColor(mColorDark);
224         }
225         SetLineColor();
226         DrawRect( PixelToLogic(
227                 Rectangle( Point( mpMetadataAuthor->GetPosPixel().X() +
228                                     mpMetadataAuthor->GetSizePixel().Width(),
229                                   mpMetadataAuthor->GetPosPixel().Y() ),
230                            Size( GetMetaButtonAreaWidth(),
231                                  mpMetadataAuthor->GetSizePixel().Height() +
232                                     mpMetadataDate->GetSizePixel().Height() ) ) ) );
233     }
234 }
235 
SetPosSizePixelRect(long nX,long nY,long nWidth,long nHeight,const SwRect & aAnchorRect,const long aPageBorder)236 void SwSidebarWin::SetPosSizePixelRect( long nX,
237                                         long nY,
238                                         long nWidth,
239                                         long nHeight,
240                                         const SwRect& aAnchorRect,
241                                         const long aPageBorder)
242 {
243     mPosSize = Rectangle(Point(nX,nY),Size(nWidth,nHeight));
244     mAnchorRect = aAnchorRect;
245     mPageBorder = aPageBorder;
246 }
247 
SetSize(const Size & rNewSize)248 void SwSidebarWin::SetSize( const Size& rNewSize )
249 {
250     mPosSize.SetSize(rNewSize);
251 }
252 
SetVirtualPosSize(const Point & aPoint,const Size & aSize)253 void SwSidebarWin::SetVirtualPosSize( const Point& aPoint, const Size& aSize)
254 {
255     mPosSize = Rectangle(aPoint,aSize);
256 }
257 
TranslateTopPosition(const long aAmount)258 void SwSidebarWin::TranslateTopPosition(const long aAmount)
259 {
260     mPosSize.Move(0,aAmount);
261 }
262 
ShowAnchorOnly(const Point & aPoint)263 void SwSidebarWin::ShowAnchorOnly(const Point &aPoint)
264 {
265     HideNote();
266     SetPosAndSize();
267     if (mpAnchor)
268     {
269         mpAnchor->SetSixthPosition(basegfx::B2DPoint(aPoint.X(),aPoint.Y()));
270         mpAnchor->SetSeventhPosition(basegfx::B2DPoint(aPoint.X(),aPoint.Y()));
271         mpAnchor->SetAnchorState(AS_ALL);
272         mpAnchor->setVisible(true);
273     }
274     if (mpShadow)
275         mpShadow->setVisible(false);
276 }
277 
DefaultItem()278 SfxItemSet SwSidebarWin::DefaultItem()
279 {
280     SfxItemSet aItem( mrView.GetDocShell()->GetPool() );
281     aItem.Put(SvxFontHeightItem(200,100,EE_CHAR_FONTHEIGHT));
282     aItem.Put(SvxFontItem(FAMILY_SWISS,GetSettings().GetStyleSettings().GetFieldFont().GetName(),
283         EMPTYSTRING,PITCH_DONTKNOW,RTL_TEXTENCODING_DONTKNOW,EE_CHAR_FONTINFO));
284     return aItem;
285 }
286 
InitControls()287 void SwSidebarWin::InitControls()
288 {
289     AddEventListener( LINK( this, SwSidebarWin, WindowEventListener ) );
290 
291     // actual window which holds the user text
292     mpSidebarTxtControl = new SidebarTxtControl( *this,
293                                                  WB_NODIALOGCONTROL,
294                                                  mrView, mrMgr );
295     mpSidebarTxtControl->SetPointer(Pointer(POINTER_TEXT));
296 
297     // window controls for author and date
298     mpMetadataAuthor = new Edit( this, 0 );
299     mpMetadataAuthor->SetAccessibleName( SW_RES( STR_ACCESS_ANNOTATION_AUTHOR_NAME ) );
300     mpMetadataAuthor->SetReadOnly();
301     mpMetadataAuthor->AlwaysDisableInput(true);
302     mpMetadataAuthor->SetCallHandlersOnInputDisabled(true);
303     mpMetadataAuthor->AddEventListener( LINK( this, SwSidebarWin, WindowEventListener ) );
304     // we should leave this setting alone, but for this we need a better layout algo
305     // with variable meta size height
306     {
307         AllSettings aSettings = mpMetadataAuthor->GetSettings();
308         StyleSettings aStyleSettings = aSettings.GetStyleSettings();
309         Font aFont = aStyleSettings.GetFieldFont();
310         aFont.SetHeight(8);
311         aStyleSettings.SetFieldFont(aFont);
312         aSettings.SetStyleSettings(aStyleSettings);
313         mpMetadataAuthor->SetSettings(aSettings);
314     }
315 
316     mpMetadataDate = new Edit( this, 0 );
317     mpMetadataDate->SetAccessibleName( SW_RES( STR_ACCESS_ANNOTATION_DATE_NAME ) );
318     mpMetadataDate->SetReadOnly();
319     mpMetadataDate->AlwaysDisableInput(true);
320     mpMetadataDate->SetCallHandlersOnInputDisabled(true);
321     mpMetadataDate->AddEventListener( LINK( this, SwSidebarWin, WindowEventListener ) );
322     // we should leave this setting alone, but for this we need a better layout algo
323     // with variable meta size height
324     {
325         AllSettings aSettings = mpMetadataDate->GetSettings();
326         StyleSettings aStyleSettings = aSettings.GetStyleSettings();
327         Font aFont = aStyleSettings.GetFieldFont();
328         aFont.SetHeight(8);
329         aStyleSettings.SetFieldFont(aFont);
330         aSettings.SetStyleSettings(aStyleSettings);
331         mpMetadataDate->SetSettings(aSettings);
332     }
333 
334 
335     SwDocShell* aShell = mrView.GetDocShell();
336     mpOutliner = new Outliner(&aShell->GetPool(),OUTLINERMODE_TEXTOBJECT);
337     aShell->GetDoc()->SetCalcFieldValueHdl( mpOutliner );
338     mpOutliner->SetUpdateMode( sal_True );
339     Rescale();
340 
341     mpOutlinerView = new OutlinerView ( mpOutliner, mpSidebarTxtControl );
342     mpOutlinerView->SetBackgroundColor(COL_TRANSPARENT);
343     mpOutliner->InsertView(mpOutlinerView );
344     mpOutlinerView->SetOutputArea( PixelToLogic( Rectangle(0,0,1,1) ) );
345 
346     mpOutlinerView->SetAttribs(DefaultItem());
347 
348     // TODO: ??
349     EEHorizontalTextDirection aDefHoriTextDir = Application::GetSettings().GetLayoutRTL() ? EE_HTEXTDIR_R2L : EE_HTEXTDIR_L2R;
350     mpOutliner->SetDefaultHorizontalTextDirection( aDefHoriTextDir );
351 
352     //create Scrollbars
353     mpVScrollbar = new ScrollBar(this, WB_3DLOOK |WB_VSCROLL|WB_DRAG);
354     mpVScrollbar->EnableNativeWidget(false);
355     mpVScrollbar->EnableRTL( false );
356     mpVScrollbar->SetScrollHdl(LINK(this, SwSidebarWin, ScrollHdl));
357     mpVScrollbar->EnableDrag();
358     mpVScrollbar->AddEventListener( LINK( this, SwSidebarWin, WindowEventListener ) );
359 
360     const SwViewOption* pVOpt = mrView.GetWrtShellPtr()->GetViewOptions();
361     sal_uLong nCntrl = mpOutliner->GetControlWord();
362     // TODO: crash when AUTOCOMPLETE enabled
363     nCntrl |= EE_CNTRL_MARKFIELDS | EE_CNTRL_PASTESPECIAL | EE_CNTRL_AUTOCORRECT  | EV_CNTRL_AUTOSCROLL | EE_CNTRL_URLSFXEXECUTE; // | EE_CNTRL_AUTOCOMPLETE;
364     if (pVOpt->IsFieldShadings())
365         nCntrl |= EE_CNTRL_MARKFIELDS;
366     else
367         nCntrl &= ~EE_CNTRL_MARKFIELDS;
368     if (pVOpt->IsOnlineSpell())
369         nCntrl |= EE_CNTRL_ONLINESPELLING;
370     else
371         nCntrl &= ~EE_CNTRL_ONLINESPELLING;
372     mpOutliner->SetControlWord(nCntrl);
373 
374     sal_uInt16 aIndex = SW_MOD()->InsertRedlineAuthor(GetAuthor());
375     SetColor( mrMgr.GetColorDark(aIndex),
376               mrMgr.GetColorLight(aIndex),
377               mrMgr.GetColorAnchor(aIndex));
378 
379     CheckMetaText();
380 
381     mpMenuButton = CreateMenuButton();
382 
383     SetLanguage(GetLanguage());
384     GetOutlinerView()->StartSpeller();
385     SetPostItText();
386     Engine()->CompleteOnlineSpelling();
387 
388     mpSidebarTxtControl->Show();
389     mpMetadataAuthor->Show();
390     mpMetadataDate->Show();
391     mpVScrollbar->Show();
392 }
393 
CheckMetaText()394 void SwSidebarWin::CheckMetaText()
395 {
396     const SvtSysLocale aSysLocale;
397     const LocaleDataWrapper& rLocalData = aSysLocale.GetLocaleData();
398     String sMeta = GetAuthor();
399     if (sMeta.Len() == 0)
400     {
401         sMeta = String(SW_RES(STR_NOAUTHOR));
402     }
403     else if (sMeta.Len() > 22)
404     {
405         sMeta.Erase(20);
406         sMeta = sMeta + rtl::OUString::createFromAscii("...");
407     }
408     if ( mpMetadataAuthor->GetText() != sMeta )
409     {
410         mpMetadataAuthor->SetText(sMeta);
411     }
412 
413     Date aDate = GetDate();
414     if (aDate==Date())
415     {
416         sMeta = String(SW_RES(STR_POSTIT_TODAY));
417     }
418     else if (aDate == Date(Date()-1))
419     {
420         sMeta = String(SW_RES(STR_POSTIT_YESTERDAY));
421     }
422     else if (aDate.IsValid() )
423     {
424         sMeta = rLocalData.getDate(aDate);
425     }
426     else
427     {
428         sMeta = String(SW_RES(STR_NODATE));
429     }
430     if (GetTime()!=0)
431     {
432         sMeta = sMeta + rtl::OUString::createFromAscii(" ")  + rLocalData.getTime( GetTime(),false );
433     }
434     if ( mpMetadataDate->GetText() != sMeta )
435     {
436         mpMetadataDate->SetText(sMeta);
437     }
438 
439 }
440 
Rescale()441 void SwSidebarWin::Rescale()
442 {
443     MapMode aMode = GetParent()->GetMapMode();
444     aMode.SetOrigin( Point() );
445     mpOutliner->SetRefMapMode( aMode );
446     SetMapMode( aMode );
447     mpSidebarTxtControl->SetMapMode( aMode );
448     if ( mpMetadataAuthor )
449     {
450         Font aFont( mpMetadataAuthor->GetSettings().GetStyleSettings().GetFieldFont() );
451         sal_Int32 nHeight = aFont.GetHeight();
452         nHeight = nHeight * aMode.GetScaleY().GetNumerator() / aMode.GetScaleY().GetDenominator();
453         aFont.SetHeight( nHeight );
454         mpMetadataAuthor->SetControlFont( aFont );
455     }
456     if ( mpMetadataDate )
457     {
458         Font aFont( mpMetadataDate->GetSettings().GetStyleSettings().GetFieldFont() );
459         sal_Int32 nHeight = aFont.GetHeight();
460         nHeight = nHeight * aMode.GetScaleY().GetNumerator() / aMode.GetScaleY().GetDenominator();
461         aFont.SetHeight( nHeight );
462         mpMetadataDate->SetControlFont( aFont );
463     }
464 }
465 
SetPosAndSize()466 void SwSidebarWin::SetPosAndSize()
467 {
468     bool bChange = false;
469 
470     if (GetSizePixel() != mPosSize.GetSize())
471     {
472         bChange = true;
473         SetSizePixel(mPosSize.GetSize());
474         DoResize();
475     }
476 
477     if (GetPosPixel().X() != mPosSize.TopLeft().X() || (abs(GetPosPixel().Y() - mPosSize.TopLeft().Y()) > 5) )
478     {
479         bChange = true;
480         SetPosPixel(mPosSize.TopLeft());
481 
482         Point aLineStart;
483         Point aLineEnd ;
484         switch ( meSidebarPosition )
485         {
486             case sw::sidebarwindows::SIDEBAR_LEFT:
487             {
488                 aLineStart = EditWin()->PixelToLogic( Point(GetPosPixel().X()+GetSizePixel().Width(),GetPosPixel().Y()-1) );
489                 aLineEnd = EditWin()->PixelToLogic( Point(GetPosPixel().X(),GetPosPixel().Y()-1) );
490             }
491             break;
492             case sw::sidebarwindows::SIDEBAR_RIGHT:
493             {
494                 aLineStart = EditWin()->PixelToLogic( Point(GetPosPixel().X(),GetPosPixel().Y()-1) );
495                 aLineEnd = EditWin()->PixelToLogic( Point(GetPosPixel().X()+GetSizePixel().Width(),GetPosPixel().Y()-1) );
496             }
497             break;
498             default:
499                 ASSERT( false,
500                         "<SwSidebarWin::SetPosAndSize()> - unexpected position of sidebar" );
501             break;
502         }
503 
504         if (!IsPreview())
505         {
506             if (mpAnchor)
507             {
508                 mpAnchor->SetAllPosition( basegfx::B2DPoint( mAnchorRect.Left() , mAnchorRect.Bottom() - 5* 15),
509                                           basegfx::B2DPoint( mAnchorRect.Left()-5*15 , mAnchorRect.Bottom()+5*15),
510                                           basegfx::B2DPoint( mAnchorRect.Left()+5*15 , mAnchorRect.Bottom()+5*15),
511                                           basegfx::B2DPoint( mAnchorRect.Left(), mAnchorRect.Bottom()+2*15),
512                                           basegfx::B2DPoint( mPageBorder ,mAnchorRect.Bottom()+2*15),
513                                           basegfx::B2DPoint( aLineStart.X(),aLineStart.Y()),
514                                           basegfx::B2DPoint( aLineEnd.X(),aLineEnd.Y()));
515                 mpAnchor->SetHeight(mAnchorRect.Height());
516             }
517             else
518             {
519                 mpAnchor = AnchorOverlayObject::CreateAnchorOverlayObject( mrView,
520                                                                            mAnchorRect,
521                                                                            mPageBorder,
522                                                                            aLineStart,
523                                                                            aLineEnd,
524                                                                            mColorAnchor );
525                 if ( mpAnchor )
526                 {
527                     mpAnchor->SetHeight(mAnchorRect.Height());
528                     mpAnchor->setVisible(true);
529                     mpAnchor->SetAnchorState(AS_TRI);
530                     if (HasChildPathFocus())
531                     {
532                         mpAnchor->setLineSolid(true);
533                     }
534                 }
535             }
536         }
537     }
538     else
539     {
540         if ( mpAnchor &&
541              ( mpAnchor->getBasePosition() != basegfx::B2DPoint( mAnchorRect.Left() , mAnchorRect.Bottom()-5*15) ) )
542         {
543             mpAnchor->SetTriPosition( basegfx::B2DPoint( mAnchorRect.Left() , mAnchorRect.Bottom() - 5* 15),
544                                       basegfx::B2DPoint( mAnchorRect.Left()-5*15 , mAnchorRect.Bottom()+5*15),
545                                       basegfx::B2DPoint( mAnchorRect.Left()+5*15 , mAnchorRect.Bottom()+5*15),
546                                       basegfx::B2DPoint( mAnchorRect.Left(), mAnchorRect.Bottom()+2*15),
547                                       basegfx::B2DPoint( mPageBorder , mAnchorRect.Bottom()+2*15));
548         }
549     }
550 
551     if (bChange)
552     {
553         Point aStart = EditWin()->PixelToLogic(GetPosPixel()+Point(0,GetSizePixel().Height()));
554         Point aEnd = EditWin()->PixelToLogic(GetPosPixel()+Point(GetSizePixel().Width()-1,GetSizePixel().Height()));
555         mpShadow->SetPosition(basegfx::B2DPoint(aStart.X(),aStart.Y()), basegfx::B2DPoint(aEnd.X(),aEnd.Y()));
556     }
557 
558     if (mrMgr.ShowNotes())
559     {
560         if (IsFollow() && !HasChildPathFocus())
561         {
562             if ( mpAnchor )
563             {
564                 mpAnchor->SetAnchorState(AS_END);
565             }
566         }
567         else
568         {
569             if ( mpAnchor )
570             {
571                 mpAnchor->SetAnchorState(AS_ALL);
572             }
573             SwSidebarWin* pWin = GetTopReplyNote();
574             if ( pWin && pWin->Anchor() )
575             {
576                 pWin->Anchor()->SetAnchorState(AS_END);
577             }
578         }
579     }
580 
581     // text range overlay
582     if ( mrMgr.ShowNotes()
583          && mrSidebarItem.maLayoutInfo.mnStartNodeIdx != 0
584          && mrSidebarItem.maLayoutInfo.mnStartContent != STRING_NOTFOUND )
585     {
586         std::vector< basegfx::B2DRange > aAnnotationTextRanges;
587         {
588             const SwTxtAnnotationFld* pTxtAnnotationFld =
589                 dynamic_cast< const SwTxtAnnotationFld* >( mrSidebarItem.GetFmtFld().GetTxtFld() );
590             if ( pTxtAnnotationFld != NULL
591                  && pTxtAnnotationFld->GetpTxtNode() != NULL )
592             {
593                 SwTxtNode* pTxtNode = pTxtAnnotationFld->GetpTxtNode();
594                 SwNodes& rNds = pTxtNode->GetDoc()->GetNodes();
595                 SwCntntNode* const pCntntNd = rNds[mrSidebarItem.maLayoutInfo.mnStartNodeIdx]->GetCntntNode();
596                 SwPosition aStartPos( *pCntntNd, mrSidebarItem.maLayoutInfo.mnStartContent );
597                 SwShellCrsr* pTmpCrsr = NULL;
598                 const bool bTableCrsrNeeded = pTxtNode->FindTableBoxStartNode() != pCntntNd->FindTableBoxStartNode();
599                 if ( bTableCrsrNeeded )
600                 {
601                     SwShellTableCrsr* pTableCrsr = new SwShellTableCrsr( DocView().GetWrtShell(), aStartPos );
602                     pTableCrsr->SetMark();
603                     pTableCrsr->GetMark()->nNode = *pTxtNode;
604                     pTableCrsr->GetMark()->nContent.Assign( pTxtNode, *(pTxtAnnotationFld->GetStart())+1 );
605                     pTableCrsr->NewTableSelection();
606                     pTmpCrsr = pTableCrsr;
607                 }
608                 else
609                 {
610                     SwShellCrsr* pCrsr = new SwShellCrsr( DocView().GetWrtShell(), aStartPos );
611                     pCrsr->SetMark();
612                     pCrsr->GetMark()->nNode = *pTxtNode;
613                     pCrsr->GetMark()->nContent.Assign( pTxtNode, *(pTxtAnnotationFld->GetStart())+1 );
614                     pTmpCrsr = pCrsr;
615                 }
616                 ::boost::scoped_ptr<SwShellCrsr> pTmpCrsrForAnnotationTextRange( pTmpCrsr );
617 
618                 pTmpCrsrForAnnotationTextRange->FillRects();
619 
620                 for( sal_uInt16 a(0); a < pTmpCrsrForAnnotationTextRange->Count(); ++a )
621                 {
622                     const SwRect aNextRect((*pTmpCrsrForAnnotationTextRange)[a]);
623                     const Rectangle aPntRect(aNextRect.SVRect());
624 
625                     aAnnotationTextRanges.push_back(basegfx::B2DRange(
626                         aPntRect.Left(), aPntRect.Top(),
627                         aPntRect.Right() + 1, aPntRect.Bottom() + 1));
628                 }
629             }
630         }
631 
632         if ( mpTextRangeOverlay != NULL )
633         {
634             mpTextRangeOverlay->setRanges( aAnnotationTextRanges );
635             if ( mpAnchor != NULL && mpAnchor->getLineSolid() )
636             {
637                 mpTextRangeOverlay->ShowSolidBorder();
638             }
639             else
640             {
641                 mpTextRangeOverlay->HideSolidBorder();
642             }
643         }
644         else
645         {
646             mpTextRangeOverlay =
647                 sw::overlay::OverlayRanges::CreateOverlayRange(
648                     DocView(),
649                     mColorAnchor,
650                     aAnnotationTextRanges,
651                     mpAnchor != NULL ? mpAnchor->getLineSolid() : false );
652         }
653     }
654     else
655     {
656         delete mpTextRangeOverlay;
657         mpTextRangeOverlay = NULL;
658     }
659 }
660 
DoResize()661 void SwSidebarWin::DoResize()
662 {
663     long aTextHeight    =  LogicToPixel( mpOutliner->CalcTextSize()).Height();
664     long aHeight        =  GetSizePixel().Height();
665     unsigned long aWidth    =  GetSizePixel().Width();
666 
667     aHeight -= GetMetaHeight();
668     mpMetadataAuthor->Show();
669     mpMetadataDate->Show();
670     mpSidebarTxtControl->SetQuickHelpText(EMPTYSTRING);
671 
672     if ((aTextHeight > aHeight) && !IsPreview())
673     {   // we need vertical scrollbars and have to reduce the width
674         aWidth -= GetScrollbarWidth();
675         mpVScrollbar->Show();
676     }
677     else
678     {
679         mpVScrollbar->Hide();
680     }
681 
682     {
683         const Size aSizeOfMetadataControls( GetSizePixel().Width() - GetMetaButtonAreaWidth(),
684                                             GetMetaHeight()/2 );
685         mpMetadataAuthor->SetPosSizePixel( 0,
686                                            aHeight,
687                                            aSizeOfMetadataControls.Width(),
688                                            aSizeOfMetadataControls.Height() );
689         mpMetadataDate->SetPosSizePixel( 0,
690                                          aHeight + aSizeOfMetadataControls.Height(),
691                                          aSizeOfMetadataControls.Width(),
692                                          aSizeOfMetadataControls.Height() );
693     }
694 
695     mpOutliner->SetPaperSize( PixelToLogic( Size(aWidth,aHeight) ) ) ;
696     mpOutlinerView->SetOutputArea( PixelToLogic( Rectangle(0,0,aWidth,aHeight) ) );
697     if (!mpVScrollbar->IsVisible())
698     {   // if we do not have a scrollbar anymore, we want to see the complete text
699         mpOutlinerView->SetVisArea( PixelToLogic( Rectangle(0,0,aWidth,aHeight) ) );
700     }
701 
702     if (!Application::GetSettings().GetLayoutRTL())
703     {
704         mpSidebarTxtControl->SetPosSizePixel(0, 0, aWidth, aHeight);
705         mpVScrollbar->SetPosSizePixel( aWidth, 0, GetScrollbarWidth(), aHeight);
706     }
707     else
708     {
709         mpSidebarTxtControl->SetPosSizePixel( ( (aTextHeight > aHeight) && !IsPreview()
710                                       ? GetScrollbarWidth() : 0 ) , 0,
711                                       aWidth, aHeight);
712         mpVScrollbar->SetPosSizePixel( 0, 0, GetScrollbarWidth(), aHeight);
713     }
714 
715     mpVScrollbar->SetVisibleSize( PixelToLogic(Size(0,aHeight)).Height() );
716     mpVScrollbar->SetPageSize( PixelToLogic(Size(0,aHeight)).Height() * 8 / 10 );
717     mpVScrollbar->SetLineSize( mpOutliner->GetTextHeight() / 10 );
718     SetScrollbar();
719     mpVScrollbar->SetRange( Range(0, mpOutliner->GetTextHeight()));
720 
721     //calculate rects for meta- button
722     const Fraction& fx( GetMapMode().GetScaleX() );
723     const Fraction& fy( GetMapMode().GetScaleY() );
724 
725     const Point aPos( mpMetadataAuthor->GetPosPixel());
726     Rectangle aRectMetaButton;
727     if (IsPreview())
728     {
729         aRectMetaButton = PixelToLogic(
730             Rectangle( Point( aPos.X()+GetSizePixel().Width()-(METABUTTON_WIDTH*4+10)*fx.GetNumerator()/fx.GetDenominator(),
731                               aPos.Y()+5*fy.GetNumerator()/fy.GetDenominator() ),
732                        Size( METABUTTON_WIDTH*4*fx.GetNumerator()/fx.GetDenominator(),
733                              METABUTTON_HEIGHT*fy.GetNumerator()/fy.GetDenominator() ) ) );
734     }
735     else
736     {
737         aRectMetaButton = PixelToLogic(
738             Rectangle( Point( aPos.X()+GetSizePixel().Width()-(METABUTTON_WIDTH+10)*fx.GetNumerator()/fx.GetDenominator(),
739                               aPos.Y()+5*fy.GetNumerator()/fy.GetDenominator() ),
740                        Size( METABUTTON_WIDTH*fx.GetNumerator()/fx.GetDenominator(),
741                              METABUTTON_HEIGHT*fy.GetNumerator()/fy.GetDenominator() ) ) );
742     }
743 
744     {
745         const Rectangle aRectMetaButtonPixel( LogicToPixel( aRectMetaButton ) );
746         mpMenuButton->SetPosSizePixel( aRectMetaButtonPixel.Left(),
747                                        aRectMetaButtonPixel.Top(),
748                                        aRectMetaButtonPixel.GetWidth(),
749                                        aRectMetaButtonPixel.GetHeight() );
750     }
751 }
752 
SetSizePixel(const Size & rNewSize)753 void SwSidebarWin::SetSizePixel( const Size& rNewSize )
754 {
755     Window::SetSizePixel(rNewSize);
756 
757     if (mpShadow)
758     {
759         Point aStart = EditWin()->PixelToLogic(GetPosPixel()+Point(0,GetSizePixel().Height()));
760         Point aEnd = EditWin()->PixelToLogic(GetPosPixel()+Point(GetSizePixel().Width()-1,GetSizePixel().Height()));
761         mpShadow->SetPosition(basegfx::B2DPoint(aStart.X(),aStart.Y()), basegfx::B2DPoint(aEnd.X(),aEnd.Y()));
762     }
763 }
764 
SetScrollbar()765 void SwSidebarWin::SetScrollbar()
766 {
767     mpVScrollbar->SetThumbPos( mpOutlinerView->GetVisArea().Top()+ mpOutlinerView->GetEditView().GetCursor()->GetOffsetY());
768 }
769 
ResizeIfNeccessary(long aOldHeight,long aNewHeight)770 void SwSidebarWin::ResizeIfNeccessary(long aOldHeight, long aNewHeight)
771 {
772     if (aOldHeight != aNewHeight)
773     {
774         //check for lower border or next note
775         long aBorder = mrMgr.GetNextBorder();
776         if (aBorder != -1)
777         {
778             if (aNewHeight > GetMinimumSizeWithoutMeta())
779             {
780                 long aNewLowerValue = GetPosPixel().Y() + aNewHeight + GetMetaHeight();
781                 if (aNewLowerValue < aBorder)
782                     SetSizePixel(Size(GetSizePixel().Width(),aNewHeight+GetMetaHeight()));
783                 else
784                     SetSizePixel(Size(GetSizePixel().Width(),aBorder - GetPosPixel().Y()));
785                 DoResize();
786                 Invalidate();
787             }
788             else
789             {
790                 if (GetSizePixel().Height() != GetMinimumSizeWithoutMeta() + GetMetaHeight())
791                     SetSizePixel(Size(GetSizePixel().Width(),GetMinimumSizeWithoutMeta() + GetMetaHeight()));
792                 DoResize();
793                 Invalidate();
794             }
795         }
796         else
797         {
798             DoResize();
799             Invalidate();
800         }
801     }
802     else
803     {
804         SetScrollbar();
805     }
806 }
807 
SetColor(Color aColorDark,Color aColorLight,Color aColorAnchor)808 void SwSidebarWin::SetColor(Color aColorDark,Color aColorLight, Color aColorAnchor)
809 {
810     mColorDark =  aColorDark;
811     mColorLight = aColorLight;
812     mColorAnchor = aColorAnchor;
813 
814     if ( !Application::GetSettings().GetStyleSettings().GetHighContrastMode() )
815     {
816         {
817             mpMetadataAuthor->SetControlBackground(mColorDark);
818             AllSettings aSettings = mpMetadataAuthor->GetSettings();
819             StyleSettings aStyleSettings = aSettings.GetStyleSettings();
820             aStyleSettings.SetFieldTextColor(aColorAnchor);
821             aSettings.SetStyleSettings(aStyleSettings);
822             mpMetadataAuthor->SetSettings(aSettings);
823         }
824 
825         {
826             mpMetadataDate->SetControlBackground(mColorDark);
827             AllSettings aSettings = mpMetadataDate->GetSettings();
828             StyleSettings aStyleSettings = aSettings.GetStyleSettings();
829             aStyleSettings.SetFieldTextColor(aColorAnchor);
830             aSettings.SetStyleSettings(aStyleSettings);
831             mpMetadataDate->SetSettings(aSettings);
832         }
833 
834         AllSettings aSettings2 = mpVScrollbar->GetSettings();
835         StyleSettings aStyleSettings2 = aSettings2.GetStyleSettings();
836         aStyleSettings2.SetButtonTextColor(Color(0,0,0));
837         aStyleSettings2.SetCheckedColor(mColorLight); //hintergund
838         aStyleSettings2.SetShadowColor(mColorAnchor);
839         aStyleSettings2.SetFaceColor(mColorDark);
840         aSettings2.SetStyleSettings(aStyleSettings2);
841         mpVScrollbar->SetSettings(aSettings2);
842     }
843 }
844 
SetSidebarPosition(sw::sidebarwindows::SidebarPosition eSidebarPosition)845 void SwSidebarWin::SetSidebarPosition(sw::sidebarwindows::SidebarPosition eSidebarPosition)
846 {
847     meSidebarPosition = eSidebarPosition;
848 }
849 
SetReadonly(sal_Bool bSet)850 void SwSidebarWin::SetReadonly(sal_Bool bSet)
851 {
852     mbReadonly = bSet;
853     GetOutlinerView()->SetReadOnly(bSet);
854 }
855 
SetLanguage(const SvxLanguageItem aNewItem)856 void SwSidebarWin::SetLanguage(const SvxLanguageItem aNewItem)
857 {
858     Link pLink = Engine()->GetModifyHdl();
859     Engine()->SetModifyHdl( Link() );
860     ESelection aOld = GetOutlinerView()->GetSelection();
861 
862     ESelection aNewSelection( 0, 0, Engine()->GetParagraphCount()-1, USHRT_MAX );
863     GetOutlinerView()->SetSelection( aNewSelection );
864     SfxItemSet aEditAttr(GetOutlinerView()->GetAttribs());
865     aEditAttr.Put(aNewItem);
866     GetOutlinerView()->SetAttribs( aEditAttr );
867 
868     GetOutlinerView()->SetSelection(aOld);
869     Engine()->SetModifyHdl( pLink );
870 
871     const SwViewOption* pVOpt = mrView.GetWrtShellPtr()->GetViewOptions();
872     sal_uLong nCntrl = Engine()->GetControlWord();
873     // turn off
874     if (!pVOpt->IsOnlineSpell())
875         nCntrl &= ~EE_CNTRL_ONLINESPELLING;
876     else
877         nCntrl &= ~EE_CNTRL_ONLINESPELLING;
878     Engine()->SetControlWord(nCntrl);
879 
880     //turn back on
881     if (pVOpt->IsOnlineSpell())
882         nCntrl |= EE_CNTRL_ONLINESPELLING;
883     else
884         nCntrl &= ~EE_CNTRL_ONLINESPELLING;
885     Engine()->SetControlWord(nCntrl);
886 
887     Engine()->CompleteOnlineSpelling();
888     Invalidate();
889 }
890 
DataChanged(const DataChangedEvent & aEvent)891 void SwSidebarWin::DataChanged( const DataChangedEvent& aEvent)
892 {
893     Window::DataChanged( aEvent );
894 }
895 
GetFocus()896 void SwSidebarWin::GetFocus()
897 {
898     if (mpSidebarTxtControl)
899         mpSidebarTxtControl->GrabFocus();
900 }
901 
LoseFocus()902 void SwSidebarWin::LoseFocus()
903 {
904 }
905 
ShowNote()906 void SwSidebarWin::ShowNote()
907 {
908     SetPosAndSize();
909     if (!IsVisible())
910         Window::Show();
911     if (mpShadow && !mpShadow->isVisible())
912         mpShadow->setVisible(true);
913     if (mpAnchor && !mpAnchor->isVisible())
914         mpAnchor->setVisible(true);
915 }
916 
HideNote()917 void SwSidebarWin::HideNote()
918 {
919     if (IsVisible())
920         Window::Hide();
921     if (mpAnchor)
922     {
923         if (mrMgr.IsShowAnchor())
924             mpAnchor->SetAnchorState(AS_TRI);
925         else
926             mpAnchor->setVisible(false);
927     }
928     if (mpShadow && mpShadow->isVisible())
929         mpShadow->setVisible(false);
930 }
931 
ActivatePostIt()932 void SwSidebarWin::ActivatePostIt()
933 {
934     mrMgr.AssureStdModeAtShell();
935 
936     mpOutliner->ClearModifyFlag();
937     mpOutliner->GetUndoManager().Clear();
938 
939     CheckMetaText();
940     SetViewState(VS_EDIT);
941     GetOutlinerView()->ShowCursor();
942 
943     mpOutlinerView->GetEditView().SetInsertMode(mrView.GetWrtShellPtr()->IsInsMode());
944 
945     if ( !Application::GetSettings().GetStyleSettings().GetHighContrastMode() )
946         GetOutlinerView()->SetBackgroundColor(mColorDark);
947 }
948 
DeactivatePostIt()949 void SwSidebarWin::DeactivatePostIt()
950 {
951     // remove selection, #i87073#
952     if (GetOutlinerView()->GetEditView().HasSelection())
953     {
954         ESelection aSelection = GetOutlinerView()->GetEditView().GetSelection();
955         aSelection.nEndPara = aSelection.nStartPara;
956         aSelection.nEndPos = aSelection.nStartPos;
957         GetOutlinerView()->GetEditView().SetSelection(aSelection);
958     }
959 
960     mpOutliner->CompleteOnlineSpelling();
961 
962     SetViewState(VS_NORMAL);
963     // write the visible text back into the SwField
964     UpdateData();
965 
966     if ( !Application::GetSettings().GetStyleSettings().GetHighContrastMode() )
967         GetOutlinerView()->SetBackgroundColor(COL_TRANSPARENT);
968 
969 
970     if ( !IsProtected() &&
971          Engine()->GetEditEngine().GetText()==String(EMPTYSTRING) )
972     {
973         mnEventId = Application::PostUserEvent( LINK( this, SwSidebarWin, DeleteHdl), 0 );
974     }
975 }
976 
ToggleInsMode()977 void SwSidebarWin::ToggleInsMode()
978 {
979     if (!mrView.GetWrtShell().IsRedlineOn())
980     {
981         //change outliner
982         mpOutlinerView->GetEditView().SetInsertMode(!mpOutlinerView->GetEditView().IsInsertMode());
983         //change documnet
984         mrView.GetWrtShell().ToggleInsMode();
985         //update statusbar
986         SfxBindings &rBnd = mrView.GetViewFrame()->GetBindings();
987         rBnd.Invalidate(SID_ATTR_INSERT);
988         rBnd.Update(SID_ATTR_INSERT);
989     }
990 }
991 
ExecuteCommand(sal_uInt16 nSlot)992 void SwSidebarWin::ExecuteCommand(sal_uInt16 nSlot)
993 {
994     mrMgr.AssureStdModeAtShell();
995 
996     switch (nSlot)
997     {
998         case FN_POSTIT:
999         case FN_REPLY:
1000         {
1001             // if this note is empty, it will be deleted once losing the focus, so no reply, but only a new note
1002             // will be created
1003             if (Engine()->GetEditEngine().GetText() != String(EMPTYSTRING))
1004             {
1005                 OutlinerParaObject* pPara = new OutlinerParaObject(*GetOutlinerView()->GetEditView().CreateTextObject());
1006                 mrMgr.RegisterAnswer(pPara);
1007             }
1008             if (mrMgr.HasActiveSidebarWin())
1009                 mrMgr.SetActiveSidebarWin(0);
1010             SwitchToFieldPos();
1011             mrView.GetViewFrame()->GetDispatcher()->Execute(FN_POSTIT);
1012             break;
1013         }
1014         case FN_DELETE_COMMENT:
1015 
1016                 //Delete(); // do not kill the parent of our open popup menu
1017                 mnEventId = Application::PostUserEvent( LINK( this, SwSidebarWin, DeleteHdl), 0 );
1018             break;
1019         case FN_DELETE_ALL_NOTES:
1020         case FN_HIDE_ALL_NOTES:
1021             // not possible as slot as this would require that "this" is the active postit
1022             mrView.GetViewFrame()->GetBindings().Execute( nSlot, 0, 0, SFX_CALLMODE_ASYNCHRON );
1023             break;
1024         case FN_DELETE_NOTE_AUTHOR:
1025         case FN_HIDE_NOTE_AUTHOR:
1026         {
1027             // not possible as slot as this would require that "this" is the active postit
1028             SfxStringItem aItem( nSlot, GetAuthor() );
1029             const SfxPoolItem* aItems[2];
1030             aItems[0] = &aItem;
1031             aItems[1] = 0;
1032             mrView.GetViewFrame()->GetBindings().Execute( nSlot, aItems, 0, SFX_CALLMODE_ASYNCHRON );
1033         }
1034         default:
1035             mrView.GetViewFrame()->GetBindings().Execute( nSlot );
1036             break;
1037     }
1038 }
1039 
EditWin()1040 SwEditWin*  SwSidebarWin::EditWin()
1041 {
1042     return &mrView.GetEditWin();
1043 }
1044 
GetPostItTextHeight()1045 long SwSidebarWin::GetPostItTextHeight()
1046 {
1047     return mpOutliner ? LogicToPixel(mpOutliner->CalcTextSize()).Height() : 0;
1048 }
1049 
SwitchToPostIt(sal_uInt16 aDirection)1050 void SwSidebarWin::SwitchToPostIt(sal_uInt16 aDirection)
1051 {
1052     SwSidebarWin* pPostIt = mrMgr.GetNextPostIt(aDirection, this);
1053     if (pPostIt)
1054         pPostIt->GrabFocus();
1055 }
1056 
IMPL_LINK(SwSidebarWin,WindowEventListener,VclSimpleEvent *,pEvent)1057 IMPL_LINK( SwSidebarWin, WindowEventListener, VclSimpleEvent*, pEvent )
1058 {
1059     VclWindowEvent* pWinEvent = dynamic_cast<VclWindowEvent*>(pEvent);
1060     if ( pWinEvent )
1061     {
1062         if ( pWinEvent->GetId() == VCLEVENT_WINDOW_MOUSEMOVE )
1063         {
1064             MouseEvent* pMouseEvt = (MouseEvent*)pWinEvent->GetData();
1065             if ( pMouseEvt->IsEnterWindow() )
1066             {
1067                 mbMouseOver = true;
1068                 if ( !HasFocus() )
1069                 {
1070                     SetViewState(VS_VIEW);
1071                     Invalidate();
1072                 }
1073             }
1074             else if ( pMouseEvt->IsLeaveWindow())
1075             {
1076                 if (IsPreview())
1077                 {
1078                     //doLazyDelete();
1079                 }
1080                 else
1081                 {
1082                     mbMouseOver = false;
1083                     if ( !HasFocus() )
1084                     {
1085                         SetViewState(VS_NORMAL);
1086                         Invalidate();
1087                     }
1088                 }
1089             }
1090         }
1091         else if ( pWinEvent->GetId() == VCLEVENT_WINDOW_ACTIVATE &&
1092                   pWinEvent->GetWindow() == mpSidebarTxtControl )
1093         {
1094             const sal_Bool bLockView = mrView.GetWrtShell().IsViewLocked();
1095             mrView.GetWrtShell().LockView( sal_True );
1096 
1097             if ( !IsPreview() )
1098             {
1099                 mrMgr.SetActiveSidebarWin( this );
1100             }
1101 
1102             mrView.GetWrtShell().LockView( bLockView );
1103             mrMgr.MakeVisible( this );
1104         }
1105         else if ( pWinEvent->GetWindow() == mpSidebarTxtControl )
1106         {
1107             int i = 5;
1108             ++i;
1109         }
1110     }
1111     return sal_True;
1112 }
1113 
Delete()1114 void SwSidebarWin::Delete()
1115 {
1116     if ( mrMgr.GetActiveSidebarWin() == this)
1117     {
1118         mrMgr.SetActiveSidebarWin(0);
1119         // if the note is empty, the previous line will send a delete event, but we are already there
1120         if (mnEventId)
1121         {
1122             Application::RemoveUserEvent( mnEventId );
1123             mnEventId = 0;
1124         }
1125     }
1126 }
1127 
IMPL_LINK(SwSidebarWin,ScrollHdl,ScrollBar *,pScroll)1128 IMPL_LINK(SwSidebarWin, ScrollHdl, ScrollBar*, pScroll)
1129 {
1130     long nDiff = GetOutlinerView()->GetEditView().GetVisArea().Top() - pScroll->GetThumbPos();
1131     GetOutlinerView()->Scroll( 0, nDiff );
1132     return 0;
1133 }
1134 
IMPL_LINK(SwSidebarWin,ModifyHdl,void *,pVoid)1135 IMPL_LINK(SwSidebarWin, ModifyHdl, void*, pVoid)
1136 {
1137     // no warnings, please
1138     pVoid=0;
1139     mrView.GetDocShell()->SetModified(sal_True);
1140     return 0;
1141 }
1142 
IMPL_LINK(SwSidebarWin,DeleteHdl,void *,pVoid)1143 IMPL_LINK(SwSidebarWin, DeleteHdl, void*, pVoid)
1144 {
1145     // no warnings, please
1146     pVoid=0;
1147     mnEventId = 0;
1148     Delete();
1149     return 0;
1150 }
1151 
1152 
ResetAttributes()1153 void SwSidebarWin::ResetAttributes()
1154 {
1155     mpOutlinerView->RemoveAttribsKeepLanguages(sal_True);
1156     mpOutliner->RemoveFields(sal_True);
1157     mpOutlinerView->SetAttribs(DefaultItem());
1158 }
1159 
GetScrollbarWidth()1160 sal_Int32 SwSidebarWin::GetScrollbarWidth()
1161 {
1162     return mrView.GetWrtShell().GetViewOptions()->GetZoom() / 10;
1163 }
1164 
GetMetaButtonAreaWidth()1165 sal_Int32 SwSidebarWin::GetMetaButtonAreaWidth()
1166 {
1167     const Fraction& f( GetMapMode().GetScaleX() );
1168     if (IsPreview())
1169         return 3 * METABUTTON_AREA_WIDTH * f.GetNumerator() / f.GetDenominator();
1170     else
1171         return METABUTTON_AREA_WIDTH * f.GetNumerator() / f.GetDenominator();
1172 }
1173 
GetMetaHeight()1174 sal_Int32 SwSidebarWin::GetMetaHeight()
1175 {
1176     const Fraction& f( GetMapMode().GetScaleY() );
1177     return POSTIT_META_HEIGHT * f.GetNumerator() / f.GetDenominator();
1178 }
1179 
GetMinimumSizeWithMeta()1180 sal_Int32 SwSidebarWin::GetMinimumSizeWithMeta()
1181 {
1182     return mrMgr.GetMinimumSizeWithMeta();
1183 }
1184 
GetMinimumSizeWithoutMeta()1185 sal_Int32 SwSidebarWin::GetMinimumSizeWithoutMeta()
1186 {
1187     const Fraction& f( GetMapMode().GetScaleY() );
1188     return POSTIT_MINIMUMSIZE_WITHOUT_META * f.GetNumerator() / f.GetDenominator();
1189 }
1190 
SetSpellChecking()1191 void SwSidebarWin::SetSpellChecking()
1192 {
1193     const SwViewOption* pVOpt = mrView.GetWrtShellPtr()->GetViewOptions();
1194     sal_uLong nCntrl = mpOutliner->GetControlWord();
1195     if (pVOpt->IsOnlineSpell())
1196         nCntrl |= EE_CNTRL_ONLINESPELLING;
1197     else
1198         nCntrl &= ~EE_CNTRL_ONLINESPELLING;
1199     mpOutliner->SetControlWord(nCntrl);
1200 
1201     mpOutliner->CompleteOnlineSpelling();
1202     Invalidate();
1203 }
1204 
SetViewState(ViewState bViewState)1205 void SwSidebarWin::SetViewState(ViewState bViewState)
1206 {
1207     switch (bViewState)
1208     {
1209         case VS_EDIT:
1210         {
1211             if (mpAnchor)
1212             {
1213                 mpAnchor->SetAnchorState(AS_ALL);
1214                 SwSidebarWin* pWin = GetTopReplyNote();
1215                 // --> OD 2010-06-03 #i111964#
1216                 if ( pWin && pWin->Anchor() )
1217                 // <--
1218                 {
1219                     pWin->Anchor()->SetAnchorState(AS_END);
1220                 }
1221                 mpAnchor->setLineSolid(true);
1222                 if ( mpTextRangeOverlay != NULL )
1223                 {
1224                     mpTextRangeOverlay->ShowSolidBorder();
1225                 }
1226             }
1227             if (mpShadow)
1228                 mpShadow->SetShadowState(SS_EDIT);
1229             break;
1230         }
1231         case VS_VIEW:
1232         {
1233             if (mpAnchor)
1234             {
1235                 mpAnchor->setLineSolid(true);
1236                 if ( mpTextRangeOverlay != NULL )
1237                 {
1238                     mpTextRangeOverlay->ShowSolidBorder();
1239                 }
1240             }
1241             if (mpShadow)
1242                 mpShadow->SetShadowState(SS_VIEW);
1243             break;
1244         }
1245         case VS_NORMAL:
1246         {
1247             if (mpAnchor)
1248             {
1249                 if (IsFollow())
1250                 {
1251                     // if there is no visible parent note, we want to see the complete anchor ??
1252                     //if (IsAnyStackParentVisible())
1253                     mpAnchor->SetAnchorState(AS_END);
1254                     SwSidebarWin* pTopWinSelf = GetTopReplyNote();
1255                     SwSidebarWin* pTopWinActive = mrMgr.HasActiveSidebarWin()
1256                                                   ? mrMgr.GetActiveSidebarWin()->GetTopReplyNote()
1257                                                   : 0;
1258                     if ( pTopWinSelf && ( pTopWinSelf != pTopWinActive ) &&
1259                          pTopWinSelf->Anchor() )
1260                     {
1261                         if ( pTopWinSelf != mrMgr.GetActiveSidebarWin() )
1262                         {
1263                             pTopWinSelf->Anchor()->setLineSolid(false);
1264                             if ( pTopWinSelf->TextRange() != NULL )
1265                             {
1266                                 pTopWinSelf->TextRange()->HideSolidBorder();
1267                             }
1268                         }
1269                         pTopWinSelf->Anchor()->SetAnchorState(AS_ALL);
1270                     }
1271                 }
1272                 mpAnchor->setLineSolid(false);
1273                 if ( mpTextRangeOverlay != NULL )
1274                 {
1275                     mpTextRangeOverlay->HideSolidBorder();
1276                 }
1277             }
1278             if ( mpShadow )
1279             {
1280                 mpShadow->SetShadowState(SS_NORMAL);
1281             }
1282             break;
1283         }
1284     }
1285 }
1286 
GetTopReplyNote()1287 SwSidebarWin* SwSidebarWin::GetTopReplyNote()
1288 {
1289     SwSidebarWin* pTopNote = 0;
1290     SwSidebarWin* pSidebarWin = IsFollow() ? mrMgr.GetNextPostIt(KEY_PAGEUP, this) : 0;
1291     while (pSidebarWin)
1292     {
1293         pTopNote = pSidebarWin;
1294         pSidebarWin = pSidebarWin->IsFollow() ? mrMgr.GetNextPostIt(KEY_PAGEUP, pSidebarWin) : 0;
1295     }
1296     return pTopNote;
1297 }
1298 
SwitchToFieldPos()1299 void SwSidebarWin::SwitchToFieldPos()
1300 {
1301     if ( mrMgr.GetActiveSidebarWin() == this )
1302             mrMgr.SetActiveSidebarWin(0);
1303     GotoPos();
1304     sal_uInt32 aCount = MoveCaret();
1305     if (aCount)
1306         mrView.GetDocShell()->GetWrtShell()->SwCrsrShell::Right(aCount, 0, sal_False);
1307     GrabFocusToDocument();
1308 }
1309 
GetLanguage(void)1310 SvxLanguageItem SwSidebarWin::GetLanguage(void)
1311 {
1312     return SvxLanguageItem(SwLangHelper::GetLanguage(mrView.GetWrtShell(),RES_CHRATR_LANGUAGE),RES_CHRATR_LANGUAGE);
1313 }
1314 
SetChangeTracking(const SwPostItHelper::SwLayoutStatus aLayoutStatus,const Color & aChangeColor)1315 void SwSidebarWin::SetChangeTracking( const SwPostItHelper::SwLayoutStatus aLayoutStatus,
1316                                       const Color& aChangeColor )
1317 {
1318     if ( (mLayoutStatus != aLayoutStatus) ||
1319          (mChangeColor != aChangeColor) )
1320     {
1321         mLayoutStatus = aLayoutStatus;
1322         mChangeColor = aChangeColor;
1323         Invalidate();
1324     }
1325 }
1326 
HasScrollbar() const1327 bool SwSidebarWin::HasScrollbar() const
1328 {
1329     return mpVScrollbar != 0;
1330 }
1331 
IsScrollbarVisible() const1332 bool SwSidebarWin::IsScrollbarVisible() const
1333 {
1334     return HasScrollbar() && mpVScrollbar->IsVisible();
1335 }
1336 
ChangeSidebarItem(SwSidebarItem & rSidebarItem)1337 void SwSidebarWin::ChangeSidebarItem( SwSidebarItem& rSidebarItem )
1338 {
1339     const bool bAnchorChanged = mpAnchorFrm != rSidebarItem.maLayoutInfo.mpAnchorFrm;
1340     if ( bAnchorChanged )
1341     {
1342         mrMgr.DisconnectSidebarWinFromFrm( *(mpAnchorFrm), *this );
1343     }
1344 
1345     mrSidebarItem = rSidebarItem;
1346     mpAnchorFrm = mrSidebarItem.maLayoutInfo.mpAnchorFrm;
1347 
1348     if ( GetWindowPeer() )
1349     {
1350         SidebarWinAccessible* pAcc =
1351                         static_cast<SidebarWinAccessible*>( GetWindowPeer() );
1352         ASSERT( dynamic_cast<SidebarWinAccessible*>( GetWindowPeer() ),
1353                 "<SwSidebarWin::ChangeSidebarItem(..)> - unexpected type of window peer -> crash possible!" );
1354         pAcc->ChangeSidebarItem( mrSidebarItem );
1355     }
1356 
1357     if ( bAnchorChanged )
1358     {
1359         mrMgr.ConnectSidebarWinToFrm( *(mrSidebarItem.maLayoutInfo.mpAnchorFrm),
1360                                       mrSidebarItem.GetFmtFld(),
1361                                       *this );
1362     }
1363 }
1364 
CreateAccessible()1365 css::uno::Reference< css::accessibility::XAccessible > SwSidebarWin::CreateAccessible()
1366 {
1367     SidebarWinAccessible* pAcc( new SidebarWinAccessible( *this,
1368                                                           mrView.GetWrtShell(),
1369                                                           mrSidebarItem ) );
1370     css::uno::Reference< css::awt::XWindowPeer > xWinPeer( pAcc );
1371     SetWindowPeer( xWinPeer, pAcc );
1372 
1373     css::uno::Reference< css::accessibility::XAccessible > xAcc( xWinPeer, css::uno::UNO_QUERY );
1374     return xAcc;
1375 }
1376 
1377 } } // eof of namespace sw::sidebarwindows
1378 
1379 /********** SwRedComment**************/
1380 /*
1381 SwRedComment::SwRedComment( Window* pParent, WinBits nBits,SwPostItMgr* aMgr,SwPostItBits aBits,SwRedline* pRed)
1382     : SwSidebarWin(pParent,nBits,aMgr,aBits),
1383     pRedline(pRed)
1384 {
1385 }
1386 
1387 void SwRedComment::SetPopup()
1388 {
1389     mpButtonPopup = new PopupMenu(SW_RES(MN_REDCOMMENT_BUTTON));
1390     //mpButtonPopup->SetMenuFlags(MENU_FLAG_ALWAYSSHOWDISABLEDENTRIES);
1391 }
1392 
1393 void SwRedComment::UpdateData()
1394 {
1395     if ( Engine()->IsModified() )
1396     {
1397         // so we get a new layout of notes (Anchor position is still the same and we would otherwise not get one)
1398         Mgr()->SetLayout();
1399         // SetRedline is calling SetModified already
1400         DocView()->GetWrtShell().SetRedlineComment(Engine()->GetEditEngine().GetText());
1401     }
1402     Engine()->ClearModifyFlag();
1403     Engine()->GetUndoManager().Clear();
1404 }
1405 
1406 void SwRedComment::SetPostItText()
1407 {
1408     Engine()->SetModifyHdl( Link() );
1409     Engine()->EnableUndo( sal_False );
1410 
1411     Engine()->Clear();
1412     View()->SetAttribs(DefaultItem());
1413     View()->InsertText(pRedline->GetComment(),false);
1414 
1415     Engine()->ClearModifyFlag();
1416     Engine()->GetUndoManager().Clear();
1417     Engine()->EnableUndo( sal_True );
1418     Engine()->SetModifyHdl( LINK( this, SwSidebarWin, ModifyHdl ) );
1419     Invalidate();
1420 }
1421 
1422 void SwRedComment::DeactivatePostIt()
1423 {
1424     SwSidebarWin::DeactivatePostIt();
1425     // current Redline is still selected
1426     DocView()->GetWrtShellPtr()->ClearMark();
1427 }
1428 
1429 void SwRedComment::ActivatePostIt()
1430 {
1431     SwSidebarWin::ActivatePostIt();
1432 
1433     // do we want the redline selected?
1434     // otherwise, SwRedComment::ActivatePostIt() as well as SwRedComment::DeactivatePostIt()
1435     // can be thrown out completly
1436     DocView()->GetDocShell()->GetWrtShell()->GotoRedline(
1437         DocView()->GetDocShell()->GetWrtShell()->FindRedlineOfData(pRedline->GetRedlineData()),true);
1438 }
1439 
1440 void SwRedComment::MouseButtonDown( const MouseEvent& rMEvt )
1441 {
1442     if (mRectMetaButton.IsInside(PixelToLogic(rMEvt.GetPosPixel())) && rMEvt.IsLeft())
1443     {
1444         ExecuteCommand( mpButtonPopup->Execute( this,Rectangle(LogicToPixel(mRectMetaButton.BottomLeft()),LogicToPixel(mRectMetaButton.BottomLeft())),POPUPMENU_EXECUTE_DOWN | POPUPMENU_NOMOUSEUPCLOSE) );
1445     }
1446 }
1447 
1448 void SwRedComment::Delete()
1449 {
1450     SwSidebarWin::Delete();
1451     // we are not necessarily on our redline, so let's move there
1452     GotoPos();
1453     DocView()->GetWrtShell().SetRedlineComment(EMPTYSTRING);
1454     DocView()->GetWrtShell().ClearMark();
1455     // so we get a new layout of notes (Anchor position is still the same and we would otherwise not get one)
1456     Mgr()->SetLayout();
1457     Mgr()->RemoveItem(pRedline);
1458 }
1459 
1460 void SwRedComment::GotoPos()
1461 {
1462     DocView()->GetDocShell()->GetWrtShell()->GotoRedline(
1463         DocView()->GetDocShell()->GetWrtShell()->FindRedlineOfData(pRedline->GetRedlineData()));
1464 }
1465 
1466 String SwRedComment::GetAuthor()
1467 {
1468     return pRedline->GetAuthorString();
1469 }
1470 
1471 Date SwRedComment::GetDate()
1472 {
1473     return pRedline->GetTimeStamp().GetDate();
1474 }
1475 
1476 Time SwRedComment::GetTime()
1477 {
1478     return pRedline->GetTimeStamp().GetTime();
1479 }
1480 
1481 bool SwRedComment::IsProtected()
1482 {
1483     return SwSidebarWin::IsProtected() || pRedline->Start()->nNode.GetNode().GetTxtNode()->IsInProtectSect();
1484 }
1485 */
1486