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