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