xref: /AOO41X/main/sd/source/ui/annotations/annotationwindow.cxx (revision 79aad27f7f29270c03e208e3d687e8e3850af11d) !
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 #include "precompiled_sd.hxx"
25 
26 #include <editeng/fontitem.hxx>
27 #include <editeng/eeitem.hxx>
28 #include <editeng/fhgtitem.hxx>
29 #include <editeng/bulitem.hxx>
30 #include <editeng/udlnitem.hxx>
31 #include <editeng/shdditem.hxx>
32 #include <editeng/flditem.hxx>
33 #include <editeng/frmdir.hxx>
34 #include <editeng/frmdiritem.hxx>
35 #include <editeng/langitem.hxx>
36 #include <editeng/adjitem.hxx>
37 #include <editeng/editview.hxx>
38 #include <svx/svdview.hxx>
39 #include <svx/sdrpaintwindow.hxx>
40 #include <svx/sdr/overlay/overlaymanager.hxx>
41 #include <editeng/editstat.hxx> //EditEngine flags
42 #include <editeng/outliner.hxx>
43 #include <editeng/editeng.hxx>
44 #include <editeng/editobj.hxx>
45 #include <editeng/unolingu.hxx>
46 #include <editeng/outlobj.hxx>
47 #include <editeng/postitem.hxx>
48 #include <editeng/wghtitem.hxx>
49 #include <editeng/udlnitem.hxx>
50 #include <editeng/crsditem.hxx>
51 #include <svx/svxids.hrc>
52 #include <svtools/langtab.hxx>
53 #include <svl/slstitm.hxx>
54 #include <unotools/securityoptions.hxx>
55 #include <unotools/useroptions.hxx>
56 #include <svl/languageoptions.hxx>
57 #include <svl/zforlist.hxx>
58 #include <svtools/svmedit.hxx>
59 
60 #include <linguistic/lngprops.hxx>
61 
62 #include <sfx2/request.hxx>
63 #include <sfx2/viewfrm.hxx>
64 #include <sfx2/bindings.hxx>
65 #include <sfx2/dispatch.hxx>
66 #include <sfx2/mnumgr.hxx>
67 
68 #include <vcl/vclenum.hxx>
69 #include <vcl/edit.hxx>
70 #include <vcl/help.hxx>
71 #include <vcl/scrbar.hxx>
72 #include <vcl/button.hxx>
73 #include <vcl/svapp.hxx>
74 #include <vcl/gradient.hxx>
75 #include <vcl/salbtype.hxx> // FRound
76 #include <vcl/cursor.hxx>
77 
78 #include <basegfx/matrix/b2dhommatrix.hxx>
79 #include <basegfx/tuple/b2dtuple.hxx>
80 #include <basegfx/polygon/b2dpolygontools.hxx>
81 
82 #include "annotations.hrc"
83 #include "annotationwindow.hxx"
84 #include "annotationmanagerimpl.hxx"
85 
86 #include "DrawDocShell.hxx"
87 #include "ViewShell.hxx"
88 #include "drawdoc.hxx"
89 #include "View.hxx"
90 #include "textapi.hxx"
91 #include "sdresid.hxx"
92 
93 using rtl::OUString;
94 using namespace ::sd;
95 using namespace ::com::sun::star;
96 using namespace ::com::sun::star::uno;
97 using namespace ::com::sun::star::office;
98 using namespace ::com::sun::star::text;
99 
100 #define METABUTTON_WIDTH        16
101 #define METABUTTON_HEIGHT       18
102 #define METABUTTON_AREA_WIDTH   30
103 #define POSTIT_META_HEIGHT  (sal_Int32)     30
104 
105 #define EMPTYSTRING             rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(""))
106 
107 namespace sd {
108 
109 extern OUString getAnnotationDateTimeString( const Reference< XAnnotation >& xAnnotation );
110 extern SfxItemPool* GetAnnotationPool();
111 extern com::sun::star::util::DateTime getCurrentDateTime();
112 
ColorFromAlphaColor(sal_uInt8 aTransparency,Color & aFront,Color & aBack)113 Color ColorFromAlphaColor(sal_uInt8 aTransparency, Color &aFront, Color &aBack )
114 {
115     return Color((sal_uInt8)(aFront.GetRed()    * aTransparency/(double)255 + aBack.GetRed()    * (1-aTransparency/(double)255)),
116                  (sal_uInt8)(aFront.GetGreen()  * aTransparency/(double)255 + aBack.GetGreen()  * (1-aTransparency/(double)255)),
117                  (sal_uInt8)(aFront.GetBlue()   * aTransparency/(double)255 + aBack.GetBlue()   * (1-aTransparency/(double)255)));
118 }
119 
120 /************ AnnotationTextWindow **********************************/
121 
AnnotationTextWindow(AnnotationWindow * pParent,WinBits nBits)122 AnnotationTextWindow::AnnotationTextWindow( AnnotationWindow* pParent, WinBits nBits )
123 : Control(pParent, nBits)
124 , mpOutlinerView(0)
125 , mpAnnotationWindow( pParent )
126 {
127 }
128 
~AnnotationTextWindow()129 AnnotationTextWindow::~AnnotationTextWindow()
130 {
131 }
132 
Paint(const Rectangle & rRect)133 void AnnotationTextWindow::Paint( const Rectangle& rRect)
134 {
135     const bool bHighContrast = Application::GetSettings().GetStyleSettings().GetHighContrastMode();
136     if ( !bHighContrast )
137     {
138         DrawGradient(Rectangle(Point(0,0),PixelToLogic(GetSizePixel())),
139             Gradient(GRADIENT_LINEAR,mpAnnotationWindow->maColorLight,mpAnnotationWindow->maColor));
140     }
141 
142     if( mpOutlinerView )
143     {
144         Color aBackgroundColor( mpAnnotationWindow->maColor );
145         if( bHighContrast )
146         {
147             aBackgroundColor = GetSettings().GetStyleSettings().GetWindowColor();
148         }
149 
150         mpOutlinerView->SetBackgroundColor( aBackgroundColor );
151 
152         mpOutlinerView->Paint( rRect );
153     }
154 }
155 
KeyInput(const KeyEvent & rKeyEvt)156 void AnnotationTextWindow::KeyInput( const KeyEvent& rKeyEvt )
157 {
158     const KeyCode& rKeyCode = rKeyEvt.GetKeyCode();
159     sal_uInt16 nKey = rKeyCode.GetCode();
160 
161     if ((rKeyCode.IsMod1() && rKeyCode.IsMod2()) && ((nKey == KEY_PAGEUP) || (nKey == KEY_PAGEDOWN)))
162     {
163         SfxDispatcher* pDispatcher = mpAnnotationWindow->DocShell()->GetViewShell()->GetViewFrame()->GetDispatcher();
164         if( pDispatcher )
165             pDispatcher->Execute( nKey == KEY_PAGEDOWN ? SID_NEXT_POSTIT : SID_PREVIOUS_POSTIT );
166     }
167     else if (nKey == KEY_INSERT)
168     {
169         if (!rKeyCode.IsMod1() && !rKeyCode.IsMod2())
170             mpAnnotationWindow->ToggleInsMode();
171     }
172     else
173     {
174         long aOldHeight = mpAnnotationWindow->GetPostItTextHeight();
175         bool bDone = false;
176 
177         /// HACK: need to switch off processing of Undo/Redo in Outliner
178         if ( !( (nKey == KEY_Z || nKey == KEY_Y) && rKeyCode.IsMod1()) )
179         {
180             bool bIsProtected = mpAnnotationWindow->IsProtected();
181             if (!bIsProtected || (bIsProtected && !mpAnnotationWindow->Engine()->GetEditEngine().DoesKeyChangeText(rKeyEvt)) )
182 
183             bDone = mpOutlinerView->PostKeyEvent( rKeyEvt );
184         }
185         if (bDone)
186         {
187             mpAnnotationWindow->ResizeIfNeccessary(aOldHeight,mpAnnotationWindow->GetPostItTextHeight());
188         }
189         else
190         {
191             Control::KeyInput(rKeyEvt);
192         }
193     }
194 }
195 
MouseMove(const MouseEvent & rMEvt)196 void AnnotationTextWindow::MouseMove( const MouseEvent& rMEvt )
197 {
198     if ( mpOutlinerView )
199     {
200         mpOutlinerView->MouseMove( rMEvt );
201         SetPointer( mpOutlinerView->GetPointer( rMEvt.GetPosPixel() ) );
202     }
203 }
204 
MouseButtonDown(const MouseEvent & rMEvt)205 void AnnotationTextWindow::MouseButtonDown( const MouseEvent& rMEvt )
206 {
207     GrabFocus();
208     if ( mpOutlinerView )
209         mpOutlinerView->MouseButtonDown( rMEvt );
210     // todo mpOutlinerView->DocView()->GetViewFrame()->GetBindings().InvalidateAll(sal_False);
211 }
212 
MouseButtonUp(const MouseEvent & rMEvt)213 void AnnotationTextWindow::MouseButtonUp( const MouseEvent& rMEvt )
214 {
215     if ( mpOutlinerView )
216         mpOutlinerView->MouseButtonUp( rMEvt );
217 }
218 
Command(const CommandEvent & rCEvt)219 void AnnotationTextWindow::Command( const CommandEvent& rCEvt )
220 {
221     if ( rCEvt.GetCommand() == COMMAND_CONTEXTMENU )
222     {
223         mpAnnotationWindow->Command(rCEvt);
224     }
225     else
226     {
227         if ( mpOutlinerView )
228             mpOutlinerView->Command( rCEvt );
229         else
230             Window::Command(rCEvt);
231     }
232 }
233 
GetFocus()234 void AnnotationTextWindow::GetFocus()
235 {
236     Window::GetFocus();
237 }
238 
LoseFocus()239 void AnnotationTextWindow::LoseFocus()
240 {
241 //    if ( mpAnnotationWindow )
242 //        mpAnnotationWindow->UpdateAnnotation();
243 
244     Window::LoseFocus();
245 }
246 
GetSurroundingText() const247 XubString AnnotationTextWindow::GetSurroundingText() const
248 {
249     if( mpOutlinerView )
250     {
251         EditEngine *aEditEngine = mpOutlinerView->GetEditView().GetEditEngine();
252         if( mpOutlinerView->HasSelection() )
253             return mpOutlinerView->GetSelected();
254         else
255         {
256             ESelection aSelection = mpOutlinerView->GetEditView().GetSelection();
257             XubString aStr = aEditEngine->GetText(aSelection.nStartPara);
258             return aStr;
259         }
260     }
261     else
262         return XubString::EmptyString();
263 }
264 
GetSurroundingTextSelection() const265 Selection AnnotationTextWindow::GetSurroundingTextSelection() const
266 {
267     if( mpOutlinerView )
268     {
269         if( mpOutlinerView->HasSelection() )
270             return Selection( 0, mpOutlinerView->GetSelected().Len() );
271         else
272         {
273             ESelection aSelection = mpOutlinerView->GetEditView().GetSelection();
274             return Selection( aSelection.nStartPos, aSelection.nEndPos );
275         }
276     }
277     else
278         return Selection( 0, 0 );
279 }
280 
281 /************** AnnotationWindow***********************************++*/
282 
AnnotationWindow(AnnotationManagerImpl & rManager,DrawDocShell * pDocShell,Window * pParent)283 AnnotationWindow::AnnotationWindow( AnnotationManagerImpl& rManager, DrawDocShell* pDocShell, Window* pParent )
284 : FloatingWindow(pParent, WB_SYSTEMWINDOW|WB_BORDER|WB_NEEDSFOCUS)
285 , mrManager( rManager )
286 , mpDocShell( pDocShell )
287 , mpView( pDocShell->GetViewShell()->GetView() )
288 , mpDoc( pDocShell->GetDoc() )
289 , mpOutlinerView(0)
290 , mpOutliner(0)
291 , mpVScrollbar(0)
292 , mbReadonly(pDocShell->IsReadOnly())
293 , mbProtected(false)
294 , mbMouseOverButton(false)
295 , mpTextWindow(0)
296 , mpMeta(0)
297 {
298 }
299 
~AnnotationWindow()300 AnnotationWindow::~AnnotationWindow()
301 {
302     delete mpMeta;
303     delete mpOutlinerView;
304     delete mpOutliner;
305     delete mpVScrollbar;
306     delete mpTextWindow;
307 }
308 
InitControls()309 void AnnotationWindow::InitControls()
310 {
311     // actual window which holds the user text
312     mpTextWindow = new AnnotationTextWindow(this, WB_NODIALOGCONTROL);
313     mpTextWindow->SetPointer(Pointer(POINTER_TEXT));
314 
315     // window control for author and date
316     mpMeta = new MultiLineEdit(this,0);
317     mpMeta->SetReadOnly();
318     mpMeta->SetRightToLeft(Application::GetSettings().GetLayoutRTL());
319     mpMeta->AlwaysDisableInput(true);
320     mpMeta->SetCallHandlersOnInputDisabled(true);
321 
322 //  mpMeta->AddEventListener( LINK( mpPostItTxt, PostItTxt, WindowEventListener ) );
323 //  AddEventListener( LINK( mpTextWindow, PostItTxt, WindowEventListener ) );
324 
325     // we should leave this setting alone, but for this we need a better layout algo
326     // with variable meta size height
327     AllSettings aSettings = mpMeta->GetSettings();
328     StyleSettings aStyleSettings = aSettings.GetStyleSettings();
329     Font aFont = aStyleSettings.GetFieldFont();
330     aFont.SetHeight(8);
331     aStyleSettings.SetFieldFont(aFont);
332     aSettings.SetStyleSettings(aStyleSettings);
333     mpMeta->SetSettings(aSettings);
334 
335     mpOutliner = new ::Outliner(GetAnnotationPool(),OUTLINERMODE_TEXTOBJECT);
336     Doc()->SetCalcFieldValueHdl( mpOutliner );
337     mpOutliner->SetUpdateMode( sal_True );
338     Rescale();
339 
340     OutputDevice* pDev = Doc()->GetRefDevice();
341     if( pDev )
342     {
343         mpOutliner->SetRefDevice( pDev );
344     }
345 
346     mpOutlinerView = new OutlinerView ( mpOutliner, mpTextWindow );
347     mpOutliner->InsertView(mpOutlinerView );
348     mpTextWindow->SetOutlinerView(mpOutlinerView);
349     mpOutlinerView->SetOutputArea( PixelToLogic( Rectangle(0,0,1,1) ) );
350 
351 //  SfxItemSet item(DocShell()->GetPool());
352 //  item.Put(SvxFontHeightItem(352,100,EE_CHAR_FONTHEIGHT));
353 //  mpOutlinerView->SetAttribs(item);
354 
355     // TODO: ??
356     EEHorizontalTextDirection aDefHoriTextDir = Application::GetSettings().GetLayoutRTL() ? EE_HTEXTDIR_R2L : EE_HTEXTDIR_L2R;
357     mpOutliner->SetDefaultHorizontalTextDirection( aDefHoriTextDir );
358 
359     //create Scrollbars
360     mpVScrollbar = new ScrollBar(this, WB_3DLOOK |WB_VSCROLL|WB_DRAG);
361     mpVScrollbar->EnableNativeWidget(false);
362     mpVScrollbar->EnableRTL( false );
363     mpVScrollbar->SetScrollHdl(LINK(this, AnnotationWindow, ScrollHdl));
364     mpVScrollbar->EnableDrag();
365 //  mpVScrollbar->AddEventListener( LINK( this, AnnotationWindow, WindowEventListener ) );
366 
367     sal_uLong nCntrl = mpOutliner->GetControlWord();
368     nCntrl |= EE_CNTRL_PASTESPECIAL | EE_CNTRL_AUTOCORRECT  | EV_CNTRL_AUTOSCROLL | EE_CNTRL_NOCOLORS;
369 /*
370     if (pVOpt->IsFieldShadings())
371         nCntrl |= EE_CNTRL_MARKFIELDS;
372     else
373         nCntrl &= ~EE_CNTRL_MARKFIELDS;
374     if (pVOpt->IsOnlineSpell())
375         nCntrl |= EE_CNTRL_ONLINESPELLING;
376     else
377         nCntrl &= ~EE_CNTRL_ONLINESPELLING;
378 */
379     mpOutliner->SetControlWord(nCntrl);
380 //  mpOutliner->SetFlatMode( sal_True );
381 
382     Engine()->SetModifyHdl( Link() );
383     Engine()->EnableUndo( sal_False );
384 
385     Engine()->ClearModifyFlag();
386     Engine()->GetUndoManager().Clear();
387     Engine()->EnableUndo( sal_True );
388     Engine()->SetModifyHdl( LINK( this, AnnotationWindow, ModifyHdl ) );
389 
390     Invalidate();
391 
392     SetLanguage(GetLanguage());
393 
394     mpMeta->Show();
395     mpVScrollbar->Show();
396     mpTextWindow->Show();
397 }
398 
StartEdit()399 void AnnotationWindow::StartEdit()
400 {
401     getView()->SetSelection(ESelection(0xFFFF,0xFFFF,0xFFFF,0xFFFF));
402     getView()->ShowCursor();
403 }
404 
Rescale()405 void AnnotationWindow::Rescale()
406 {
407     MapMode aMode(MAP_100TH_MM);
408     aMode.SetOrigin( Point() );
409     //aMode.SetScaleX( aMode.GetScaleX() * Fraction( 8, 10 ) );
410     //aMode.SetScaleY( aMode.GetScaleY() * Fraction( 8, 10 ) );
411     mpOutliner->SetRefMapMode( aMode );
412     SetMapMode( aMode );
413     mpTextWindow->SetMapMode( aMode );
414     if ( mpMeta )
415     {
416         Font aFont( mpMeta->GetSettings().GetStyleSettings().GetFieldFont() );
417         sal_Int32 nHeight = aFont.GetHeight();
418         nHeight = nHeight * aMode.GetScaleY().GetNumerator() / aMode.GetScaleY().GetDenominator();
419         aFont.SetHeight( nHeight );
420         mpMeta->SetControlFont( aFont );
421     }
422 }
423 
DoResize()424 void AnnotationWindow::DoResize()
425 {
426     unsigned long aWidth    =   GetSizePixel().Width();
427     long aHeight            =   GetSizePixel().Height() - POSTIT_META_HEIGHT;
428 
429     mpOutliner->SetPaperSize( PixelToLogic( Size(aWidth,aHeight) ) ) ;
430     long aTextHeight        =   LogicToPixel( mpOutliner->CalcTextSize()).Height();
431 
432     if( aTextHeight > aHeight )
433     {   // we need vertical scrollbars and have to reduce the width
434         aWidth -= GetScrollbarWidth();
435         mpVScrollbar->Show();
436     }
437     else
438     {
439         mpVScrollbar->Hide();
440     }
441 
442     mpTextWindow->SetPosSizePixel(0,0,aWidth, aHeight);
443 
444     if( mbReadonly )
445         mpMeta->SetPosSizePixel(0,aHeight,GetSizePixel().Width(),POSTIT_META_HEIGHT);
446     else
447         mpMeta->SetPosSizePixel(0,aHeight,GetSizePixel().Width()-METABUTTON_AREA_WIDTH,POSTIT_META_HEIGHT);
448 
449     mpOutliner->SetPaperSize( PixelToLogic( Size(aWidth,aHeight) ) ) ;
450     mpOutlinerView->SetOutputArea( PixelToLogic( Rectangle(0,0,aWidth,aHeight) ) );
451     if (!mpVScrollbar->IsVisible())
452     {   // if we do not have a scrollbar anymore, we want to see the complete text
453         mpOutlinerView->SetVisArea( PixelToLogic( Rectangle(0,0,aWidth,aHeight) ) );
454     }
455     mpVScrollbar->SetPosSizePixel( 0 + aWidth, 0, GetScrollbarWidth(), aHeight );
456     mpVScrollbar->SetVisibleSize( PixelToLogic(Size(0,aHeight)).Height() );
457     mpVScrollbar->SetPageSize( PixelToLogic(Size(0,aHeight)).Height() * 8 / 10 );
458     mpVScrollbar->SetLineSize( mpOutliner->GetTextHeight() / 10 );
459     SetScrollbar();
460     mpVScrollbar->SetRange( Range(0, mpOutliner->GetTextHeight()));
461 
462     Point aPos( mpMeta->GetPosPixel());
463     Point aBase( aPos.X() + aPos.X() + GetSizePixel().Width(), aPos.Y() );
464     Point aLeft = PixelToLogic( Point( aBase.X() - (METABUTTON_WIDTH+5), aBase.Y()+17 ) );
465     Point aRight = PixelToLogic( Point( aBase.X() - (METABUTTON_WIDTH-1), aBase.Y()+17 ) );
466     Point aBottom = PixelToLogic( Point( aBase.X() - (METABUTTON_WIDTH+2), aBase.Y()+20 ) );
467 
468     maPopupTriangle.clear();
469     maPopupTriangle.append(basegfx::B2DPoint(aLeft.X(),aLeft.Y()));
470     maPopupTriangle.append(basegfx::B2DPoint(aRight.X(),aRight.Y()));
471     maPopupTriangle.append(basegfx::B2DPoint(aBottom.X(),aBottom.Y()));
472     maPopupTriangle.setClosed(true);
473     maRectMetaButton = PixelToLogic( Rectangle( Point(
474             aPos.X()+GetSizePixel().Width()-(METABUTTON_WIDTH+10),
475             aPos.Y()+5 ),
476             Size( METABUTTON_WIDTH, METABUTTON_HEIGHT ) ) );
477 
478 }
479 
SetSizePixel(const Size & rNewSize)480 void AnnotationWindow::SetSizePixel( const Size& rNewSize )
481 {
482     Window::SetSizePixel(rNewSize);
483 }
484 
SetScrollbar()485 void AnnotationWindow::SetScrollbar()
486 {
487     mpVScrollbar->SetThumbPos( mpOutlinerView->GetVisArea().Top()+ mpOutlinerView->GetEditView().GetCursor()->GetOffsetY());
488 }
489 
ResizeIfNeccessary(long aOldHeight,long aNewHeight)490 void AnnotationWindow::ResizeIfNeccessary(long aOldHeight, long aNewHeight)
491 {
492     if (aOldHeight != aNewHeight)
493     {
494         DoResize();
495         Invalidate();
496     }
497     else
498     {
499         SetScrollbar();
500     }
501 }
502 
SetLanguage(const SvxLanguageItem aNewItem)503 void AnnotationWindow::SetLanguage(const SvxLanguageItem aNewItem)
504 {
505     Engine()->SetModifyHdl( Link() );
506     ESelection aOld = getView()->GetSelection();
507 
508     ESelection aNewSelection( 0, 0, (sal_uInt16)Engine()->GetParagraphCount()-1, USHRT_MAX );
509     getView()->SetSelection( aNewSelection );
510     SfxItemSet aEditAttr(getView()->GetAttribs());
511     aEditAttr.Put(aNewItem);
512     getView()->SetAttribs( aEditAttr );
513 
514     getView()->SetSelection(aOld);
515     Engine()->SetModifyHdl( LINK( this, AnnotationWindow, ModifyHdl ) );
516 
517     Invalidate();
518 }
519 
ToggleInsMode()520 void AnnotationWindow::ToggleInsMode()
521 {
522     if( mpOutlinerView )
523     {
524         SfxBindings &rBnd = mpDocShell->GetViewShell()->GetViewFrame()->GetBindings();
525         rBnd.Invalidate(SID_ATTR_INSERT);
526         rBnd.Update(SID_ATTR_INSERT);
527     }
528 }
529 
GetPostItTextHeight()530 long AnnotationWindow::GetPostItTextHeight()
531 {
532     return mpOutliner ? LogicToPixel(mpOutliner->CalcTextSize()).Height() : 0;
533 }
534 
IMPL_LINK(AnnotationWindow,ScrollHdl,ScrollBar *,pScroll)535 IMPL_LINK(AnnotationWindow, ScrollHdl, ScrollBar*, pScroll)
536 {
537     long nDiff = getView()->GetEditView().GetVisArea().Top() - pScroll->GetThumbPos();
538     getView()->Scroll( 0, nDiff );
539     return 0;
540 }
541 
IMPL_LINK(AnnotationWindow,ModifyHdl,void *,EMPTYARG)542 IMPL_LINK(AnnotationWindow, ModifyHdl, void*, EMPTYARG)
543 {
544     return 0;
545 }
546 
GetScrollbarWidth()547 sal_Int32 AnnotationWindow::GetScrollbarWidth()
548 {
549     return 16;
550 //  return mpView->GetWrtShell().GetViewOptions()->GetZoom() / 10;
551 }
552 
GetLanguage(void)553 SvxLanguageItem AnnotationWindow::GetLanguage(void)
554 {
555     return SvxLanguageItem( Doc()->GetLanguage( EE_CHAR_LANGUAGE ), SID_ATTR_LANGUAGE );
556 }
557 
558 // --------------------------------------------------------------------
559 
getTextApiObject(const Reference<XAnnotation> & xAnnotation)560 TextApiObject* getTextApiObject( const Reference< XAnnotation >& xAnnotation )
561 {
562     if( xAnnotation.is() )
563     {
564         Reference< XText > xText( xAnnotation->getTextRange() );
565         return TextApiObject::getImplementation( xText );
566     }
567     return 0;
568 }
569 
570 // --------------------------------------------------------------------
571 
setAnnotation(const Reference<XAnnotation> & xAnnotation,bool bGrabFocus)572 void AnnotationWindow::setAnnotation( const Reference< XAnnotation >& xAnnotation, bool bGrabFocus )
573 {
574     if( (xAnnotation != mxAnnotation) && xAnnotation.is() )
575     {
576         mxAnnotation = xAnnotation;
577 
578         SetColor();
579 
580         SvtUserOptions aUserOptions;
581         mbProtected = aUserOptions.GetFullName() != xAnnotation->getAuthor();
582 
583         Engine()->Clear();
584         TextApiObject* pTextApi = getTextApiObject( mxAnnotation );
585 
586         if( pTextApi )
587         {
588             std::auto_ptr< OutlinerParaObject > pOPO( pTextApi->CreateText() );
589             Engine()->SetText( *pOPO.get() );
590         }
591 
592         Engine()->SetModifyHdl( LINK( this, AnnotationWindow, ModifyHdl ) );
593         Engine()->ClearModifyFlag();
594         Engine()->GetUndoManager().Clear();
595 
596         Invalidate();
597 
598         OUString sMeta( xAnnotation->getAuthor() );
599         OUString sDateTime( getAnnotationDateTimeString(xAnnotation) );
600 
601         if( sDateTime.getLength() != 0 )
602         {
603             if( sMeta.getLength() != 0 )
604                 sMeta += OUString( RTL_CONSTASCII_USTRINGPARAM( "\n" ) );
605 
606            sMeta += sDateTime;
607         }
608         mpMeta->SetText(sMeta);
609 
610         if( bGrabFocus )
611             GrabFocus();
612     }
613 }
614 
SetColor()615 void AnnotationWindow::SetColor()
616 {
617     sal_uInt16 nAuthorIdx = mpDoc->GetAnnotationAuthorIndex( mxAnnotation->getAuthor() );
618 
619     const bool bHighContrast = Application::GetSettings().GetStyleSettings().GetHighContrastMode();
620     if( bHighContrast )
621     {
622         StyleSettings aStyleSettings = GetSettings().GetStyleSettings();
623 
624         maColor = aStyleSettings.GetWindowColor();
625         maColorDark = maColor;
626         maColorLight = aStyleSettings.GetWindowTextColor();
627     }
628     else
629     {
630         maColor = mrManager.GetColor( nAuthorIdx );
631         maColorDark = mrManager.GetColorDark( nAuthorIdx );
632         maColorLight = mrManager.GetColorLight( nAuthorIdx );
633     }
634 
635     mpOutlinerView->SetBackgroundColor(maColor);
636     Engine()->SetBackgroundColor(maColor);
637 
638     {
639         SvtAccessibilityOptions aOptions;
640         Engine()->ForceAutoColor( bHighContrast || aOptions.GetIsAutomaticFontColor() );
641     }
642 
643     mpMeta->SetControlBackground(maColor);
644     AllSettings aSettings = mpMeta->GetSettings();
645     StyleSettings aStyleSettings = aSettings.GetStyleSettings();
646     aStyleSettings.SetFieldTextColor( bHighContrast ? maColorLight : maColorDark);
647     aSettings.SetStyleSettings(aStyleSettings);
648     mpMeta->SetSettings(aSettings);
649 
650     AllSettings aSettings2 = mpVScrollbar->GetSettings();
651     StyleSettings aStyleSettings2 = aSettings2.GetStyleSettings();
652     aStyleSettings2.SetButtonTextColor(Color(0,0,0));
653     aStyleSettings2.SetCheckedColor(maColorLight); //hintergund
654     aStyleSettings2.SetShadowColor(maColorDark);
655     aStyleSettings2.SetFaceColor(maColor);
656     aSettings2.SetStyleSettings(aStyleSettings2);
657     mpVScrollbar->SetSettings(aSettings2);
658 }
659 
Deactivate()660 void AnnotationWindow::Deactivate()
661 {
662     Reference< XAnnotation > xAnnotation( mxAnnotation );
663 
664     // write changed text back to annotation
665     if ( Engine()->IsModified() )
666     {
667         TextApiObject* pTextApi = getTextApiObject( xAnnotation );
668 
669         if( pTextApi )
670         {
671             OutlinerParaObject* pOPO = Engine()->CreateParaObject();
672             if( pOPO )
673             {
674                 if( mpDoc->IsUndoEnabled() )
675                     mpDoc->BegUndo( String( SdResId( STR_ANNOTATION_UNDO_EDIT ) ) );
676 
677                 pTextApi->SetText( *pOPO );
678                 delete pOPO;
679 
680                 // set current time to changed annotation
681                 xAnnotation->setDateTime( getCurrentDateTime() );
682 
683                 if( mpDoc->IsUndoEnabled() )
684                     mpDoc->EndUndo();
685 
686                 DocView()->GetDocSh()->SetModified(sal_True);
687             }
688 
689         }
690     }
691     Engine()->ClearModifyFlag();
692 
693     Engine()->GetUndoManager().Clear();
694 }
695 
Paint(const Rectangle & rRect)696 void AnnotationWindow::Paint( const Rectangle& rRect)
697 {
698     FloatingWindow::Paint( rRect );
699 
700     if(mpMeta->IsVisible() && !mbReadonly)
701     {
702         const bool bHighContrast = Application::GetSettings().GetStyleSettings().GetHighContrastMode();
703         //draw left over space
704         if ( bHighContrast )
705             SetFillColor(COL_BLACK);
706         else
707             SetFillColor(maColor);
708         SetLineColor();
709         DrawRect(PixelToLogic(Rectangle(Point(mpMeta->GetPosPixel().X()+mpMeta->GetSizePixel().Width(),mpMeta->GetPosPixel().Y()),Size(METABUTTON_AREA_WIDTH,mpMeta->GetSizePixel().Height()))));
710 
711         if ( bHighContrast )
712         {
713             //draw rect around button
714             SetFillColor(COL_BLACK);
715             SetLineColor(COL_WHITE);
716         }
717         else
718         {
719             //draw button
720             Gradient aGradient;
721             if (mbMouseOverButton)
722                 aGradient = Gradient(GRADIENT_LINEAR,ColorFromAlphaColor(80,maColorDark,maColor),ColorFromAlphaColor(15,maColorDark,maColor));
723             else
724                 aGradient = Gradient(GRADIENT_LINEAR,ColorFromAlphaColor(15,maColorDark,maColor),ColorFromAlphaColor(80,maColorDark,maColor));
725             DrawGradient(maRectMetaButton,aGradient);
726             //draw rect around button
727             SetFillColor();
728             SetLineColor(ColorFromAlphaColor(90,maColorDark,maColor));
729         }
730         DrawRect(maRectMetaButton);
731 
732         //draw arrow
733         if( bHighContrast )
734             SetFillColor(COL_WHITE);
735         else
736             SetFillColor(COL_BLACK);
737         SetLineColor();
738         DrawPolygon(Polygon(maPopupTriangle));
739     }
740 }
741 
MouseMove(const MouseEvent & rMEvt)742 void AnnotationWindow::MouseMove( const MouseEvent& rMEvt )
743 {
744     if( !mbReadonly )
745     {
746         if (maRectMetaButton.IsInside(PixelToLogic(rMEvt.GetPosPixel())))
747         {
748             if (!mbMouseOverButton)
749             {
750                 Invalidate(maRectMetaButton);
751                 mbMouseOverButton = true;
752             }
753         }
754         else
755         {
756             if (mbMouseOverButton)
757             {
758                 Invalidate(maRectMetaButton);
759                 mbMouseOverButton = false;
760             }
761         }
762     }
763 }
764 
MouseButtonDown(const MouseEvent & rMEvt)765 void AnnotationWindow::MouseButtonDown( const MouseEvent& rMEvt )
766 {
767     if (!mbReadonly && maRectMetaButton.IsInside(PixelToLogic(rMEvt.GetPosPixel())) && rMEvt.IsLeft())
768     {
769         // context menu
770         Rectangle aRect(LogicToPixel(maRectMetaButton.BottomLeft()),LogicToPixel(maRectMetaButton.BottomLeft()));
771         mrManager.ExecuteAnnotationContextMenu( mxAnnotation, (::Window*)this, aRect, true );
772     }
773 }
774 
Command(const CommandEvent & rCEvt)775 void AnnotationWindow::Command( const CommandEvent& rCEvt )
776 {
777     if ( rCEvt.GetCommand() == COMMAND_CONTEXTMENU )
778     {
779         if( mpMeta->IsVisible() &&(mpMeta->GetPosPixel().Y() < rCEvt.GetMousePosPixel().Y()) )
780             return;
781         mrManager.ExecuteAnnotationContextMenu( mxAnnotation, this, Rectangle(rCEvt.GetMousePosPixel(),Size(1,1)) );
782     }
783     else
784     {
785         FloatingWindow::Command(rCEvt);
786     }
787 }
788 
GetFocus()789 void AnnotationWindow::GetFocus()
790 {
791     if( mpTextWindow )
792         mpTextWindow->GrabFocus();
793     else
794         FloatingWindow::GetFocus();
795 }
796 
ExecuteSlot(sal_uInt16 nSID)797 void AnnotationWindow::ExecuteSlot( sal_uInt16 nSID )
798 {
799     if( nSID == SID_COPY )
800     {
801         getView()->Copy();
802     }
803     else if( nSID == SID_PASTE )
804     {
805         getView()->PasteSpecial();
806         DoResize();
807     }
808     else
809     {
810         SfxItemSet aEditAttr(getView()->GetAttribs());
811         SfxItemSet aNewAttr(mpOutliner->GetEmptyItemSet());
812 
813         switch( nSID )
814         {
815         case SID_ATTR_CHAR_WEIGHT:
816         {
817             FontWeight eFW = ( (const SvxWeightItem&) aEditAttr.Get( EE_CHAR_WEIGHT ) ).GetWeight();
818             aNewAttr.Put( SvxWeightItem( eFW == WEIGHT_NORMAL ? WEIGHT_BOLD : WEIGHT_NORMAL, EE_CHAR_WEIGHT ) );
819         }
820         break;
821         case SID_ATTR_CHAR_POSTURE:
822         {
823             FontItalic eFI = ( (const SvxPostureItem&) aEditAttr.Get( EE_CHAR_ITALIC ) ).GetPosture();
824             aNewAttr.Put( SvxPostureItem( eFI == ITALIC_NORMAL ? ITALIC_NONE : ITALIC_NORMAL, EE_CHAR_ITALIC ) );
825         }
826         break;
827         case SID_ATTR_CHAR_UNDERLINE:
828         {
829             FontUnderline eFU = ( (const SvxUnderlineItem&) aEditAttr. Get( EE_CHAR_UNDERLINE ) ).GetLineStyle();
830             aNewAttr.Put( SvxUnderlineItem( eFU == UNDERLINE_SINGLE ? UNDERLINE_NONE : UNDERLINE_SINGLE, EE_CHAR_UNDERLINE ) );
831         }
832         break;
833         case SID_ATTR_CHAR_STRIKEOUT:
834         {
835             FontStrikeout eFSO = ( ( (const SvxCrossedOutItem&) aEditAttr.Get( EE_CHAR_STRIKEOUT ) ).GetStrikeout() );
836             aNewAttr.Put( SvxCrossedOutItem( eFSO == STRIKEOUT_SINGLE ? STRIKEOUT_NONE : STRIKEOUT_SINGLE, EE_CHAR_STRIKEOUT ) );
837         }
838         break;
839         }
840         getView()->SetAttribs( aNewAttr );
841     }
842 }
843 
844 }
845