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