LCOV - code coverage report
Current view: top level - sd/source/ui/annotations - annotationtag.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 1 301 0.3 %
Date: 2015-06-13 12:38:46 Functions: 2 42 4.8 %
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             : #include <com/sun/star/util/XChangesNotifier.hpp>
      21             : 
      22             : #include <vcl/help.hxx>
      23             : #include <vcl/svapp.hxx>
      24             : #include <vcl/settings.hxx>
      25             : 
      26             : #include <sfx2/viewfrm.hxx>
      27             : #include <sfx2/dispatch.hxx>
      28             : 
      29             : #include <svx/sdr/overlay/overlaymanager.hxx>
      30             : #include <svx/sdr/overlay/overlayanimatedbitmapex.hxx>
      31             : #include <svx/sdr/overlay/overlaybitmapex.hxx>
      32             : #include <svx/svdpagv.hxx>
      33             : #include <svx/sdrpagewindow.hxx>
      34             : #include <svx/sdrpaintwindow.hxx>
      35             : #include <svx/svddrgmt.hxx>
      36             : 
      37             : #include "View.hxx"
      38             : #include "sdresid.hxx"
      39             : #include "annotations.hrc"
      40             : #include "annotationmanagerimpl.hxx"
      41             : #include "annotationwindow.hxx"
      42             : #include "annotationtag.hxx"
      43             : #include "sdpage.hxx"
      44             : #include "ViewShell.hxx"
      45             : #include "app.hrc"
      46             : #include "Window.hxx"
      47             : #include "drawdoc.hxx"
      48             : 
      49             : using namespace ::com::sun::star::uno;
      50             : using namespace ::com::sun::star::lang;
      51             : using namespace ::com::sun::star::drawing;
      52             : using namespace ::com::sun::star::office;
      53             : using namespace ::com::sun::star::geometry;
      54             : 
      55             : namespace sd
      56             : {
      57             : 
      58             : const sal_uInt32 SMART_TAG_HDL_NUM = SAL_MAX_UINT32;
      59             : static const int DRGPIX     = 2;                               // Drag MinMove in Pixel
      60             : 
      61           0 : static OUString getInitials( const OUString& rName )
      62             : {
      63           0 :     OUString sInitials;
      64             : 
      65           0 :     const sal_Unicode * pStr = rName.getStr();
      66           0 :     sal_Int32 nLength = rName.getLength();
      67             : 
      68           0 :     while( nLength )
      69             :     {
      70             :         // skip whitespace
      71           0 :         while( nLength && (*pStr <= ' ') )
      72             :         {
      73           0 :             nLength--; pStr++;
      74             :         }
      75             : 
      76             :         // take letter
      77           0 :         if( nLength )
      78             :         {
      79           0 :             sInitials += OUString( *pStr );
      80           0 :             nLength--; pStr++;
      81             :         }
      82             : 
      83             :         // skip letters until whitespace
      84           0 :         while( nLength && (*pStr > ' ') )
      85             :         {
      86           0 :             nLength--; pStr++;
      87             :         }
      88             :     }
      89             : 
      90           0 :     return sInitials;
      91             : }
      92             : 
      93           0 : class AnnotationDragMove : public SdrDragMove
      94             : {
      95             : public:
      96             :     AnnotationDragMove(SdrDragView& rNewView, const rtl::Reference <AnnotationTag >& xTag);
      97             :     virtual bool BeginSdrDrag() SAL_OVERRIDE;
      98             :     virtual bool EndSdrDrag(bool bCopy) SAL_OVERRIDE;
      99             :     virtual void MoveSdrDrag(const Point& rNoSnapPnt) SAL_OVERRIDE;
     100             :     virtual void CancelSdrDrag() SAL_OVERRIDE;
     101             : 
     102             : private:
     103             :     rtl::Reference <AnnotationTag > mxTag;
     104             :     Point maOrigin;
     105             : };
     106             : 
     107           0 : AnnotationDragMove::AnnotationDragMove(SdrDragView& rNewView, const rtl::Reference <AnnotationTag >& xTag)
     108             : : SdrDragMove(rNewView)
     109           0 : , mxTag( xTag )
     110             : {
     111           0 : }
     112             : 
     113           0 : bool AnnotationDragMove::BeginSdrDrag()
     114             : {
     115           0 :     DragStat().Ref1()=GetDragHdl()->GetPos();
     116           0 :     DragStat().SetShown(!DragStat().IsShown());
     117             : 
     118           0 :     maOrigin = GetDragHdl()->GetPos();
     119           0 :     DragStat().SetActionRect(Rectangle(maOrigin,maOrigin));
     120             : 
     121           0 :     return true;
     122             : }
     123             : 
     124           0 : void AnnotationDragMove::MoveSdrDrag(const Point& rNoSnapPnt)
     125             : {
     126           0 :     Point aPnt(rNoSnapPnt);
     127             : 
     128           0 :     if (DragStat().CheckMinMoved(rNoSnapPnt))
     129             :     {
     130           0 :         if (aPnt!=DragStat().GetNow())
     131             :         {
     132           0 :             Hide();
     133           0 :             DragStat().NextMove(aPnt);
     134           0 :             GetDragHdl()->SetPos( maOrigin + Point( DragStat().GetDX(), DragStat().GetDY() ) );
     135           0 :             Show();
     136           0 :             DragStat().SetActionRect(Rectangle(aPnt,aPnt));
     137             :         }
     138             :     }
     139           0 : }
     140             : 
     141           0 : bool AnnotationDragMove::EndSdrDrag(bool /*bCopy*/)
     142             : {
     143           0 :     Hide();
     144           0 :     if( mxTag.is() )
     145           0 :         mxTag->Move( DragStat().GetDX(), DragStat().GetDY() );
     146           0 :     return true;
     147             : }
     148             : 
     149           0 : void AnnotationDragMove::CancelSdrDrag()
     150             : {
     151           0 :     Hide();
     152           0 : }
     153             : 
     154             : class AnnotationHdl : public SmartHdl
     155             : {
     156             : public:
     157             :     AnnotationHdl( const SmartTagReference& xTag, const Reference< XAnnotation >& xAnnotation, const Point& rPnt );
     158             :     virtual ~AnnotationHdl();
     159             :     virtual void CreateB2dIAObject() SAL_OVERRIDE;
     160             :     virtual bool IsFocusHdl() const SAL_OVERRIDE;
     161             :     virtual bool isMarkable() const SAL_OVERRIDE;
     162             : 
     163             : private:
     164             :     Reference< XAnnotation > mxAnnotation;
     165             :     rtl::Reference< AnnotationTag > mxTag;
     166             : };
     167             : 
     168           0 : AnnotationHdl::AnnotationHdl( const SmartTagReference& xTag, const Reference< XAnnotation >& xAnnotation, const Point& rPnt )
     169             : : SmartHdl( xTag, rPnt )
     170             : , mxAnnotation( xAnnotation )
     171           0 : , mxTag( dynamic_cast< AnnotationTag* >( xTag.get() ) )
     172             : {
     173           0 : }
     174             : 
     175           0 : AnnotationHdl::~AnnotationHdl()
     176             : {
     177           0 : }
     178             : 
     179           0 : void AnnotationHdl::CreateB2dIAObject()
     180             : {
     181             :     // first throw away old one
     182           0 :     GetRidOfIAObject();
     183             : 
     184           0 :     if( mxAnnotation.is() )
     185             :     {
     186           0 :         const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings();
     187             : 
     188           0 :         const Point aTagPos( GetPos() );
     189           0 :         basegfx::B2DPoint aPosition( aTagPos.X(), aTagPos.Y() );
     190             : 
     191           0 :         const bool bFocused = IsFocusHdl() && pHdlList && (pHdlList->GetFocusHdl() == this);
     192             : 
     193           0 :         BitmapEx aBitmapEx( mxTag->CreateAnnotationBitmap(mxTag->isSelected()) );
     194           0 :         BitmapEx aBitmapEx2;
     195           0 :         if( bFocused )
     196           0 :             aBitmapEx2 = mxTag->CreateAnnotationBitmap(!mxTag->isSelected() );
     197             : 
     198           0 :         if(pHdlList)
     199             :         {
     200           0 :             SdrMarkView* pView = pHdlList->GetView();
     201             : 
     202           0 :             if(pView && !pView->areMarkHandlesHidden())
     203             :             {
     204           0 :                 SdrPageView* pPageView = pView->GetSdrPageView();
     205             : 
     206           0 :                 if(pPageView)
     207             :                 {
     208           0 :                     for(sal_uInt32 b = 0; b < pPageView->PageWindowCount(); b++)
     209             :                     {
     210             :                         // const SdrPageViewWinRec& rPageViewWinRec = rPageViewWinList[b];
     211           0 :                         const SdrPageWindow& rPageWindow = *pPageView->GetPageWindow(b);
     212             : 
     213           0 :                         SdrPaintWindow& rPaintWindow = rPageWindow.GetPaintWindow();
     214           0 :                         rtl::Reference< sdr::overlay::OverlayManager > xManager = rPageWindow.GetOverlayManager();
     215           0 :                         if(rPaintWindow.OutputToWindow() && xManager.is() )
     216             :                         {
     217           0 :                             sdr::overlay::OverlayObject* pOverlayObject = 0;
     218             : 
     219             :                             // animate focused handles
     220           0 :                             if(bFocused)
     221             :                             {
     222           0 :                                 const sal_uInt64 nBlinkTime = rStyleSettings.GetCursorBlinkTime();
     223             : 
     224           0 :                                 pOverlayObject = new sdr::overlay::OverlayAnimatedBitmapEx(aPosition, aBitmapEx, aBitmapEx2, nBlinkTime, 0, 0, 0, 0 );
     225             :                             }
     226             :                             else
     227             :                             {
     228           0 :                                 pOverlayObject = new sdr::overlay::OverlayBitmapEx( aPosition, aBitmapEx, 0, 0 );
     229             :                             }
     230             : 
     231           0 :                             xManager->add(*pOverlayObject);
     232           0 :                             maOverlayGroup.append(*pOverlayObject);
     233             :                         }
     234           0 :                     }
     235             :                 }
     236             :             }
     237           0 :         }
     238             :     }
     239           0 : }
     240             : 
     241           0 : bool AnnotationHdl::IsFocusHdl() const
     242             : {
     243           0 :     return true;
     244             : }
     245             : 
     246           0 : bool AnnotationHdl::isMarkable() const
     247             : {
     248           0 :     return false;
     249             : }
     250             : 
     251           0 : AnnotationTag::AnnotationTag( AnnotationManagerImpl& rManager, ::sd::View& rView, const Reference< XAnnotation >& xAnnotation, Color& rColor, int nIndex, const vcl::Font& rFont )
     252             : : SmartTag( rView )
     253             : , mrManager( rManager )
     254             : , mxAnnotation( xAnnotation )
     255             : , maColor( rColor )
     256             : , mnIndex( nIndex )
     257             : , mrFont( rFont )
     258             : , mnClosePopupEvent( 0 )
     259           0 : , mpListenWindow( 0 )
     260             : {
     261           0 : }
     262             : 
     263           0 : AnnotationTag::~AnnotationTag()
     264             : {
     265             :     DBG_ASSERT( !mxAnnotation.is(), "sd::AnnotationTag::~AnnotationTag(), dispose me first!" );
     266           0 :     Dispose();
     267           0 : }
     268             : 
     269             : /** returns true if the AnnotationTag handled the event. */
     270           0 : bool AnnotationTag::MouseButtonDown( const MouseEvent& rMEvt, SmartHdl& /*rHdl*/ )
     271             : {
     272           0 :     if( !mxAnnotation.is() )
     273           0 :         return false;
     274             : 
     275           0 :     bool bRet = false;
     276           0 :     if( !isSelected() )
     277             :     {
     278           0 :         SmartTagReference xTag( this );
     279           0 :         mrView.getSmartTags().select( xTag );
     280           0 :         bRet = true;
     281             :     }
     282             : 
     283           0 :     if( rMEvt.IsLeft() && !rMEvt.IsRight() )
     284             :     {
     285           0 :         vcl::Window* pWindow = mrView.GetViewShell()->GetActiveWindow();
     286           0 :         if( pWindow )
     287             :         {
     288           0 :             maMouseDownPos = pWindow->PixelToLogic( rMEvt.GetPosPixel() );
     289             : 
     290           0 :             if( mpListenWindow )
     291           0 :                 mpListenWindow->RemoveEventListener( LINK(this, AnnotationTag, WindowEventHandler));
     292             : 
     293           0 :             mpListenWindow = pWindow;
     294           0 :             mpListenWindow->AddEventListener( LINK(this, AnnotationTag, WindowEventHandler));
     295             :         }
     296             : 
     297           0 :         bRet = true;
     298             :     }
     299             : 
     300           0 :     return bRet;
     301             : }
     302             : 
     303             : /** returns true if the SmartTag consumes this event. */
     304           0 : bool AnnotationTag::KeyInput( const KeyEvent& rKEvt )
     305             : {
     306           0 :     if( !mxAnnotation.is() )
     307           0 :         return false;
     308             : 
     309           0 :     sal_uInt16 nCode = rKEvt.GetKeyCode().GetCode();
     310           0 :     switch( nCode )
     311             :     {
     312             :     case KEY_DELETE:
     313           0 :         mrManager.DeleteAnnotation( mxAnnotation );
     314           0 :         return true;
     315             : 
     316             :     case KEY_DOWN:
     317             :     case KEY_UP:
     318             :     case KEY_LEFT:
     319             :     case KEY_RIGHT:
     320           0 :         return OnMove( rKEvt );
     321             : 
     322             :     case KEY_ESCAPE:
     323             :     {
     324           0 :         SmartTagReference xThis( this );
     325           0 :         mrView.getSmartTags().deselect();
     326           0 :         return true;
     327             :     }
     328             : 
     329             :     case KEY_TAB:
     330           0 :         mrManager.SelectNextAnnotation(!rKEvt.GetKeyCode().IsShift());
     331           0 :         return true;
     332             : 
     333             :     case KEY_RETURN:
     334             :        case KEY_SPACE:
     335           0 :            OpenPopup( true );
     336           0 :            return true;
     337             : 
     338             :     default:
     339           0 :         return false;
     340             :     }
     341             : }
     342             : 
     343             : /** returns true if the SmartTag consumes this event. */
     344           0 : bool AnnotationTag::RequestHelp( const HelpEvent& /*rHEvt*/ )
     345             : {
     346             : 
     347           0 :    return false;
     348             : }
     349             : 
     350             : /** returns true if the SmartTag consumes this event. */
     351           0 : bool AnnotationTag::Command( const CommandEvent& rCEvt )
     352             : {
     353           0 :     if ( rCEvt.GetCommand() == CommandEventId::ContextMenu )
     354             :     {
     355           0 :         vcl::Window* pWindow = mrView.GetViewShell()->GetActiveWindow();
     356           0 :         if( pWindow )
     357             :         {
     358           0 :             Rectangle aContextRect(rCEvt.GetMousePosPixel(),Size(1,1));
     359           0 :                mrManager.ExecuteAnnotationContextMenu( mxAnnotation, pWindow, aContextRect );
     360           0 :             return true;
     361             :         }
     362             :     }
     363             : 
     364           0 :     return false;
     365             : }
     366             : 
     367           0 : void AnnotationTag::Move( int nDX, int nDY )
     368             : {
     369           0 :     if( mxAnnotation.is() )
     370             :     {
     371           0 :         if( mrManager.GetDoc()->IsUndoEnabled() )
     372           0 :             mrManager.GetDoc()->BegUndo( SD_RESSTR( STR_ANNOTATION_UNDO_MOVE ) );
     373             : 
     374           0 :         RealPoint2D aPosition( mxAnnotation->getPosition() );
     375           0 :         aPosition.X += (double)nDX / 100.0;
     376           0 :         aPosition.Y += (double)nDY / 100.0;
     377           0 :         mxAnnotation->setPosition( aPosition );
     378             : 
     379           0 :         if( mrManager.GetDoc()->IsUndoEnabled() )
     380           0 :             mrManager.GetDoc()->EndUndo();
     381             : 
     382           0 :         mrView.updateHandles();
     383             :     }
     384           0 : }
     385             : 
     386           0 : bool AnnotationTag::OnMove( const KeyEvent& rKEvt )
     387             : {
     388           0 :     long nX = 0;
     389           0 :     long nY = 0;
     390             : 
     391           0 :     switch( rKEvt.GetKeyCode().GetCode() )
     392             :     {
     393           0 :     case KEY_UP:    nY = -1; break;
     394           0 :     case KEY_DOWN:  nY =  1; break;
     395           0 :     case KEY_LEFT:  nX = -1; break;
     396           0 :     case KEY_RIGHT: nX =  1; break;
     397           0 :     default: break;
     398             :     }
     399             : 
     400           0 :     if(rKEvt.GetKeyCode().IsMod2())
     401             :     {
     402           0 :         OutputDevice* pOut = mrView.GetViewShell()->GetActiveWindow();
     403           0 :         Size aLogicSizeOnePixel = (pOut) ? pOut->PixelToLogic(Size(1,1)) : Size(100, 100);
     404           0 :         nX *= aLogicSizeOnePixel.Width();
     405           0 :         nY *= aLogicSizeOnePixel.Height();
     406             :     }
     407             :     else
     408             :     {
     409             :         // old, fixed move distance
     410           0 :         nX *= 100;
     411           0 :         nY *= 100;
     412             :     }
     413             : 
     414           0 :     if( nX || nY )
     415             :     {
     416             :         // move the annotation
     417           0 :         Move( nX, nY );
     418             :     }
     419             : 
     420           0 :     return true;
     421             : }
     422             : 
     423           0 : void AnnotationTag::CheckPossibilities()
     424             : {
     425           0 : }
     426             : 
     427           0 : sal_uLong AnnotationTag::GetMarkablePointCount() const
     428             : {
     429           0 :     return 0;
     430             : }
     431             : 
     432           0 : sal_uLong AnnotationTag::GetMarkedPointCount() const
     433             : {
     434           0 :     return 0;
     435             : }
     436             : 
     437           0 : bool AnnotationTag::MarkPoint(SdrHdl& /*rHdl*/, bool /*bUnmark*/ )
     438             : {
     439           0 :     bool bRet=false;
     440           0 :     return bRet;
     441             : }
     442             : 
     443           0 : bool AnnotationTag::MarkPoints(const Rectangle* /*pRect*/, bool /*bUnmark*/ )
     444             : {
     445           0 :     bool bChgd=false;
     446           0 :     return bChgd;
     447             : }
     448             : 
     449           0 : bool AnnotationTag::getContext( SdrViewContext& /*rContext*/ )
     450             : {
     451           0 :     return false;
     452             : }
     453             : 
     454           0 : void AnnotationTag::addCustomHandles( SdrHdlList& rHandlerList )
     455             : {
     456           0 :     if( mxAnnotation.is() )
     457             :     {
     458           0 :         SmartTagReference xThis( this );
     459           0 :         Point aPoint;
     460           0 :         AnnotationHdl* pHdl = new AnnotationHdl( xThis, mxAnnotation, aPoint );
     461           0 :         pHdl->SetObjHdlNum( SMART_TAG_HDL_NUM );
     462           0 :         pHdl->SetPageView( mrView.GetSdrPageView() );
     463             : 
     464           0 :         RealPoint2D aPosition( mxAnnotation->getPosition() );
     465           0 :         Point aBasePos( static_cast<long>(aPosition.X * 100.0), static_cast<long>(aPosition.Y * 100.0) );
     466           0 :         pHdl->SetPos( aBasePos );
     467             : 
     468           0 :         rHandlerList.AddHdl( pHdl );
     469             :     }
     470           0 : }
     471             : 
     472           0 : void AnnotationTag::disposing()
     473             : {
     474           0 :     if( mpListenWindow )
     475             :     {
     476           0 :         mpListenWindow->RemoveEventListener( LINK(this, AnnotationTag, WindowEventHandler));
     477             :     }
     478             : 
     479           0 :     if( mnClosePopupEvent )
     480             :     {
     481           0 :         Application::RemoveUserEvent( mnClosePopupEvent );
     482           0 :         mnClosePopupEvent = 0;
     483             :     }
     484             : 
     485           0 :     mxAnnotation.clear();
     486           0 :     ClosePopup();
     487           0 :     SmartTag::disposing();
     488           0 : }
     489             : 
     490           0 : void AnnotationTag::select()
     491             : {
     492           0 :     SmartTag::select();
     493             : 
     494           0 :     mrManager.onTagSelected( *this );
     495             : 
     496           0 :     vcl::Window* pWindow = mrView.GetViewShell()->GetActiveWindow();
     497           0 :     if( pWindow )
     498             :     {
     499           0 :         RealPoint2D aPosition( mxAnnotation->getPosition() );
     500           0 :         Point aPos( static_cast<long>(aPosition.X * 100.0), static_cast<long>(aPosition.Y * 100.0) );
     501             : 
     502           0 :         Rectangle aVisRect( aPos, pWindow->PixelToLogic(maSize) );
     503           0 :         mrView.MakeVisible(aVisRect, *pWindow);
     504             :     }
     505           0 : }
     506             : 
     507           0 : void AnnotationTag::deselect()
     508             : {
     509           0 :     SmartTag::deselect();
     510             : 
     511           0 :     ClosePopup();
     512             : 
     513           0 :     mrManager.onTagDeselected( *this );
     514           0 : }
     515             : 
     516           0 : BitmapEx AnnotationTag::CreateAnnotationBitmap( bool bSelected )
     517             : {
     518           0 :     ScopedVclPtrInstance< VirtualDevice > pVDev;
     519             : 
     520           0 :     OUString sAuthor( getInitials( mxAnnotation->getAuthor() ) );
     521           0 :     sAuthor += OUString( ' ' );
     522           0 :     sAuthor += OUString::number( mnIndex );
     523             : 
     524           0 :     pVDev->SetFont( mrFont );
     525             : 
     526           0 :     const int BORDER_X = 4; // pixels
     527           0 :     const int BORDER_Y = 4; // pixels
     528             : 
     529           0 :     maSize = Size( pVDev->GetTextWidth( sAuthor ) + 2*BORDER_X, pVDev->GetTextHeight() + 2*BORDER_Y );
     530           0 :     pVDev->SetOutputSizePixel( maSize, false );
     531             : 
     532           0 :     Color aBorderColor( maColor );
     533             : 
     534           0 :     if( bSelected )
     535             :     {
     536           0 :         aBorderColor.Invert();
     537             :     }
     538             :     else
     539             :     {
     540           0 :         if( maColor.IsDark() )
     541             :         {
     542           0 :             aBorderColor.IncreaseLuminance( 32 );
     543             :         }
     544             :         else
     545             :         {
     546           0 :             aBorderColor.DecreaseLuminance( 32 );
     547             :         }
     548             :     }
     549             : 
     550           0 :     Point aPos;
     551           0 :     Rectangle aBorderRect( aPos, maSize );
     552           0 :     pVDev->SetLineColor(aBorderColor);
     553           0 :     pVDev->SetFillColor(maColor);
     554           0 :     pVDev->DrawRect( aBorderRect );
     555             : 
     556           0 :     pVDev->SetTextColor( maColor.IsDark() ? COL_WHITE : COL_BLACK );
     557           0 :     pVDev->DrawText( Point( BORDER_X, BORDER_Y ), sAuthor );
     558             : 
     559           0 :     return pVDev->GetBitmapEx( aPos, maSize );
     560             : }
     561             : 
     562           0 : void AnnotationTag::OpenPopup( bool bEdit )
     563             : {
     564           0 :     if( !mxAnnotation.is() )
     565           0 :         return;
     566             : 
     567           0 :     if( !mpAnnotationWindow.get() )
     568             :     {
     569           0 :            vcl::Window* pWindow = dynamic_cast< vcl::Window* >( getView().GetFirstOutputDevice() );
     570           0 :            if( pWindow )
     571             :            {
     572           0 :             RealPoint2D aPosition( mxAnnotation->getPosition() );
     573           0 :             Point aPos( pWindow->OutputToScreenPixel( pWindow->LogicToPixel( Point( static_cast<long>(aPosition.X * 100.0), static_cast<long>(aPosition.Y * 100.0) ) ) ) );
     574             : 
     575           0 :             aPos.X() += 4; // magic!
     576           0 :             aPos.Y() += 1;
     577             : 
     578           0 :             Rectangle aRect( aPos, maSize );
     579             : 
     580           0 :             mpAnnotationWindow.reset( VclPtr<AnnotationWindow>::Create( mrManager, mrView.GetDocSh(), pWindow->GetWindow(GetWindowType::Frame) ) );
     581           0 :             mpAnnotationWindow->InitControls();
     582           0 :             mpAnnotationWindow->setAnnotation(mxAnnotation);
     583             : 
     584           0 :             sal_uInt16 nArrangeIndex = 0;
     585           0 :             Point aPopupPos( FloatingWindow::CalcFloatingPosition( mpAnnotationWindow.get(), aRect, FloatWinPopupFlags::Right, nArrangeIndex ) );
     586           0 :             Size aPopupSize( 320, 240 );
     587             : 
     588           0 :             mpAnnotationWindow->SetPosSizePixel( aPopupPos, aPopupSize );
     589           0 :             mpAnnotationWindow->DoResize();
     590             : 
     591           0 :             mpAnnotationWindow->Show();
     592           0 :             mpAnnotationWindow->GrabFocus();
     593           0 :             mpAnnotationWindow->AddEventListener( LINK(this, AnnotationTag, WindowEventHandler));
     594             :         }
     595             :     }
     596             : 
     597           0 :     if( bEdit && mpAnnotationWindow.get() )
     598           0 :         mpAnnotationWindow->StartEdit();
     599             : }
     600             : 
     601           0 : void AnnotationTag::ClosePopup()
     602             : {
     603           0 :     if( mpAnnotationWindow.get() )
     604             :     {
     605           0 :         mpAnnotationWindow->RemoveEventListener( LINK(this, AnnotationTag, WindowEventHandler));
     606           0 :         mpAnnotationWindow->Deactivate();
     607           0 :         mpAnnotationWindow.reset();
     608             :     }
     609           0 : }
     610             : 
     611           0 : IMPL_LINK(AnnotationTag, WindowEventHandler, VclWindowEvent*, pEvent)
     612             : {
     613           0 :     if( pEvent != NULL )
     614             :     {
     615           0 :         vcl::Window* pWindow = pEvent->GetWindow();
     616             : 
     617           0 :         if( pWindow )
     618             :         {
     619           0 :             if( pWindow == mpAnnotationWindow.get() )
     620             :             {
     621           0 :                 if( pEvent->GetId() == VCLEVENT_WINDOW_DEACTIVATE )
     622             :                 {
     623           0 :                     if( mnClosePopupEvent )
     624           0 :                         Application::RemoveUserEvent( mnClosePopupEvent );
     625             : 
     626           0 :                     mnClosePopupEvent = Application::PostUserEvent( LINK( this, AnnotationTag, ClosePopupHdl ) );
     627             :                 }
     628             :             }
     629           0 :             else if( pWindow == mpListenWindow )
     630             :             {
     631           0 :                 switch( pEvent->GetId() )
     632             :                 {
     633             :                 case VCLEVENT_WINDOW_MOUSEBUTTONUP:
     634             :                     {
     635             :                         // if we stop pressing the button without a mouse move we open the popup
     636           0 :                         mpListenWindow->RemoveEventListener( LINK(this, AnnotationTag, WindowEventHandler));
     637           0 :                         mpListenWindow = 0;
     638           0 :                         if( mpAnnotationWindow.get() == 0 )
     639           0 :                             OpenPopup(false);
     640             :                     }
     641           0 :                     break;
     642             :                 case VCLEVENT_WINDOW_MOUSEMOVE:
     643             :                     {
     644             :                         // if we move the mouse after a button down we wan't to start draging
     645           0 :                         mpListenWindow->RemoveEventListener( LINK(this, AnnotationTag, WindowEventHandler));
     646           0 :                         mpListenWindow = 0;
     647             : 
     648           0 :                         SdrHdl* pHdl = mrView.PickHandle(maMouseDownPos);
     649           0 :                         if( pHdl )
     650             :                         {
     651           0 :                             mrView.BrkAction();
     652           0 :                             const sal_uInt16 nDrgLog = (sal_uInt16)pWindow->PixelToLogic(Size(DRGPIX,0)).Width();
     653             : 
     654           0 :                             rtl::Reference< AnnotationTag > xTag( this );
     655             : 
     656           0 :                             SdrDragMethod* pDragMethod = new AnnotationDragMove( mrView, xTag );
     657           0 :                             mrView.BegDragObj(maMouseDownPos, NULL, pHdl, nDrgLog, pDragMethod );
     658             :                         }
     659             :                     }
     660           0 :                     break;
     661             :                 case VCLEVENT_OBJECT_DYING:
     662           0 :                     mpListenWindow = 0;
     663           0 :                     break;
     664             :                 }
     665             :             }
     666             :         }
     667             :     }
     668           0 :     return sal_IntPtr(true);
     669             : }
     670             : 
     671           0 : IMPL_LINK_NOARG(AnnotationTag, ClosePopupHdl)
     672             : {
     673           0 :     mnClosePopupEvent = 0;
     674           0 :     ClosePopup();
     675           0 :     return 0;
     676             : }
     677             : 
     678          66 : } // end of namespace sd
     679             : 
     680             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11