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