LCOV - code coverage report
Current view: top level - libreoffice/sd/source/ui/annotations - annotationwindow.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 0 394 0.0 %
Date: 2012-12-27 Functions: 0 43 0.0 %
Legend: Lines: hit not hit

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

Generated by: LCOV version 1.10