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