LCOV - code coverage report
Current view: top level - slideshow/source/engine - rehearsetimingsactivity.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 0 235 0.0 %
Date: 2012-08-25 Functions: 0 44 0.0 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 0 0 -

           Branch data     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 <boost/current_function.hpp>
      22                 :            : #include <rtl/ustrbuf.hxx>
      23                 :            : #include <vcl/svapp.hxx>
      24                 :            : #include <vcl/gdimtf.hxx>
      25                 :            : #include <vcl/virdev.hxx>
      26                 :            : #include <vcl/metric.hxx>
      27                 :            : #include <cppcanvas/vclfactory.hxx>
      28                 :            : #include <cppcanvas/basegfxfactory.hxx>
      29                 :            : #include <basegfx/range/b2drange.hxx>
      30                 :            : 
      31                 :            : #include <comphelper/anytostring.hxx>
      32                 :            : #include <cppuhelper/exc_hlp.hxx>
      33                 :            : 
      34                 :            : #include <com/sun/star/awt/MouseButton.hpp>
      35                 :            : #include <com/sun/star/awt/MouseEvent.hpp>
      36                 :            : #include <com/sun/star/rendering/XBitmap.hpp>
      37                 :            : 
      38                 :            : #include "eventqueue.hxx"
      39                 :            : #include "screenupdater.hxx"
      40                 :            : #include "eventmultiplexer.hxx"
      41                 :            : #include "activitiesqueue.hxx"
      42                 :            : #include "slideshowcontext.hxx"
      43                 :            : #include "mouseeventhandler.hxx"
      44                 :            : #include "rehearsetimingsactivity.hxx"
      45                 :            : 
      46                 :            : #include <boost/bind.hpp>
      47                 :            : #include <o3tl/compat_functional.hxx>
      48                 :            : #include <algorithm>
      49                 :            : 
      50                 :            : using namespace com::sun::star;
      51                 :            : using namespace com::sun::star::uno;
      52                 :            : 
      53                 :            : namespace slideshow {
      54                 :            : namespace internal {
      55                 :            : 
      56                 :          0 : class RehearseTimingsActivity::WakeupEvent : public Event,
      57                 :            :                                              private ::boost::noncopyable
      58                 :            : {
      59                 :            : public:
      60                 :          0 :     WakeupEvent( boost::shared_ptr< ::canvas::tools::ElapsedTime > const& pTimeBase,
      61                 :            :                  ActivitySharedPtr const&                                 rActivity,
      62                 :            :                  ActivitiesQueue &                                        rActivityQueue ) :
      63                 :            : #if OSL_DEBUG_LEVEL > 1
      64                 :            :         Event(::rtl::OUString("WakeupEvent")),
      65                 :            : #endif
      66                 :            :         maTimer(pTimeBase),
      67                 :            :         mnNextTime(0.0),
      68                 :            :         mpActivity(rActivity),
      69                 :          0 :         mrActivityQueue( rActivityQueue )
      70                 :          0 :     {}
      71                 :            : 
      72                 :          0 :     virtual void dispose() {}
      73                 :          0 :     virtual bool fire()
      74                 :            :     {
      75                 :          0 :         ActivitySharedPtr pActivity( mpActivity.lock() );
      76                 :          0 :         if( !pActivity )
      77                 :          0 :             return false;
      78                 :            : 
      79                 :          0 :         return mrActivityQueue.addActivity( pActivity );
      80                 :            :     }
      81                 :            : 
      82                 :          0 :     virtual bool isCharged() const { return true; }
      83                 :          0 :     virtual double getActivationTime( double nCurrentTime ) const
      84                 :            :     {
      85                 :          0 :         const double nElapsedTime( maTimer.getElapsedTime() );
      86                 :            : 
      87                 :            :         return ::std::max( nCurrentTime,
      88                 :          0 :                            nCurrentTime - nElapsedTime + mnNextTime );
      89                 :            :     }
      90                 :            : 
      91                 :            :     /// Start the internal timer
      92                 :          0 :     void start() { maTimer.reset(); }
      93                 :            : 
      94                 :            :     /** Set the next timeout this object should generate.
      95                 :            : 
      96                 :            :         @param nextTime
      97                 :            :         Absolute time, measured from the last start() call,
      98                 :            :         when this event should wakeup the Activity again. If
      99                 :            :         your time is relative, simply call start() just before
     100                 :            :         every setNextTimeout() call.
     101                 :            :     */
     102                 :          0 :     void setNextTimeout( double nextTime ) { mnNextTime = nextTime; }
     103                 :            : 
     104                 :            : private:
     105                 :            :     ::canvas::tools::ElapsedTime    maTimer;
     106                 :            :     double                          mnNextTime;
     107                 :            :     boost::weak_ptr<Activity>       mpActivity;
     108                 :            :     ActivitiesQueue&                mrActivityQueue;
     109                 :            : };
     110                 :            : 
     111                 :          0 : class RehearseTimingsActivity::MouseHandler : public MouseEventHandler,
     112                 :            :                                               private boost::noncopyable
     113                 :            : {
     114                 :            : public:
     115                 :            :     explicit MouseHandler( RehearseTimingsActivity& rta );
     116                 :            : 
     117                 :            :     void reset();
     118                 :          0 :     bool hasBeenClicked() const { return mbHasBeenClicked; }
     119                 :            : 
     120                 :            :     // MouseEventHandler
     121                 :            :     virtual bool handleMousePressed( awt::MouseEvent const & evt );
     122                 :            :     virtual bool handleMouseReleased( awt::MouseEvent const & evt );
     123                 :            :     virtual bool handleMouseEntered( awt::MouseEvent const & evt );
     124                 :            :     virtual bool handleMouseExited( awt::MouseEvent const & evt );
     125                 :            :     virtual bool handleMouseDragged( awt::MouseEvent const & evt );
     126                 :            :     virtual bool handleMouseMoved( awt::MouseEvent const & evt );
     127                 :            : 
     128                 :            : private:
     129                 :            :     bool isInArea( com::sun::star::awt::MouseEvent const & evt ) const;
     130                 :            :     void updatePressedState( const bool pressedState ) const;
     131                 :            : 
     132                 :            :     RehearseTimingsActivity& mrActivity;
     133                 :            :     bool                     mbHasBeenClicked;
     134                 :            :     bool                     mbMouseStartedInArea;
     135                 :            : };
     136                 :            : 
     137                 :            : const sal_Int32 LEFT_BORDER_SPACE  = 10;
     138                 :            : const sal_Int32 LOWER_BORDER_SPACE = 30;
     139                 :            : 
     140                 :          0 : RehearseTimingsActivity::RehearseTimingsActivity( const SlideShowContext& rContext ) :
     141                 :            :     mrEventQueue(rContext.mrEventQueue),
     142                 :            :     mrScreenUpdater(rContext.mrScreenUpdater),
     143                 :            :     mrEventMultiplexer(rContext.mrEventMultiplexer),
     144                 :            :     mrActivitiesQueue(rContext.mrActivitiesQueue),
     145                 :          0 :     maElapsedTime( rContext.mrEventQueue.getTimer() ),
     146                 :            :     maViews(),
     147                 :            :     maSpriteRectangle(),
     148                 :          0 :     maFont( Application::GetSettings().GetStyleSettings().GetInfoFont() ),
     149                 :            :     mpWakeUpEvent(),
     150                 :            :     mpMouseHandler(),
     151                 :            :     maSpriteSizePixel(),
     152                 :            :     mnYOffset(0),
     153                 :            :     mbActive(false),
     154                 :          0 :     mbDrawPressed(false)
     155                 :            : {
     156                 :          0 :     maFont.SetHeight( maFont.GetHeight() * 2 );
     157                 :          0 :     maFont.SetWidth( maFont.GetWidth() * 2 );
     158                 :          0 :     maFont.SetAlign( ALIGN_BASELINE );
     159                 :          0 :     maFont.SetColor( COL_BLACK );
     160                 :            : 
     161                 :            :     // determine sprite size (in pixel):
     162                 :          0 :     VirtualDevice blackHole;
     163                 :          0 :     blackHole.EnableOutput(false);
     164                 :          0 :     blackHole.SetFont( maFont );
     165                 :          0 :     blackHole.SetMapMode( MAP_PIXEL );
     166                 :          0 :     Rectangle rect;
     167                 :          0 :     const FontMetric metric( blackHole.GetFontMetric() );
     168                 :            :     blackHole.GetTextBoundRect(
     169                 :          0 :         rect, String("XX:XX:XX") );
     170                 :          0 :     maSpriteSizePixel.setX( rect.getWidth() * 12 / 10 );
     171                 :          0 :     maSpriteSizePixel.setY( metric.GetLineHeight() * 11 / 10 );
     172                 :          0 :     mnYOffset = (metric.GetAscent() + (metric.GetLineHeight() / 20));
     173                 :            : 
     174                 :            :     std::for_each( rContext.mrViewContainer.begin(),
     175                 :            :                    rContext.mrViewContainer.end(),
     176                 :            :                    boost::bind( &RehearseTimingsActivity::viewAdded,
     177                 :            :                                 this,
     178                 :          0 :                                 _1 ));
     179                 :          0 : }
     180                 :            : 
     181                 :          0 : RehearseTimingsActivity::~RehearseTimingsActivity()
     182                 :            : {
     183                 :            :     try
     184                 :            :     {
     185                 :          0 :         stop();
     186                 :            :     }
     187                 :          0 :     catch (uno::Exception &)
     188                 :            :     {
     189                 :            :         OSL_FAIL( rtl::OUStringToOString(
     190                 :            :                         comphelper::anyToString(
     191                 :            :                             cppu::getCaughtException() ),
     192                 :            :                         RTL_TEXTENCODING_UTF8 ).getStr() );
     193                 :            :     }
     194                 :          0 : }
     195                 :            : 
     196                 :          0 : boost::shared_ptr<RehearseTimingsActivity> RehearseTimingsActivity::create(
     197                 :            :     const SlideShowContext& rContext )
     198                 :            : {
     199                 :            :     boost::shared_ptr<RehearseTimingsActivity> pActivity(
     200                 :          0 :         new RehearseTimingsActivity( rContext ));
     201                 :            : 
     202                 :          0 :     pActivity->mpMouseHandler.reset(
     203                 :          0 :         new MouseHandler(*pActivity.get()) );
     204                 :          0 :     pActivity->mpWakeUpEvent.reset(
     205                 :          0 :         new WakeupEvent( rContext.mrEventQueue.getTimer(),
     206                 :            :                          pActivity,
     207                 :          0 :                          rContext.mrActivitiesQueue ));
     208                 :            : 
     209                 :          0 :     rContext.mrEventMultiplexer.addViewHandler( pActivity );
     210                 :            : 
     211                 :          0 :     return pActivity;
     212                 :            : }
     213                 :            : 
     214                 :          0 : void RehearseTimingsActivity::start()
     215                 :            : {
     216                 :          0 :     maElapsedTime.reset();
     217                 :          0 :     mbDrawPressed = false;
     218                 :          0 :     mbActive = true;
     219                 :            : 
     220                 :            :     // paint and show all sprites:
     221                 :          0 :     paintAllSprites();
     222                 :          0 :     for_each_sprite( boost::bind( &cppcanvas::Sprite::show, _1 ) );
     223                 :            : 
     224                 :          0 :     mrActivitiesQueue.addActivity( shared_from_this() );
     225                 :            : 
     226                 :          0 :     mpMouseHandler->reset();
     227                 :            :     mrEventMultiplexer.addClickHandler(
     228                 :          0 :         mpMouseHandler, 42 /* highest prio of all, > 3.0 */ );
     229                 :            :     mrEventMultiplexer.addMouseMoveHandler(
     230                 :          0 :         mpMouseHandler, 42 /* highest prio of all, > 3.0 */ );
     231                 :          0 : }
     232                 :            : 
     233                 :          0 : double RehearseTimingsActivity::stop()
     234                 :            : {
     235                 :          0 :     mrEventMultiplexer.removeMouseMoveHandler( mpMouseHandler );
     236                 :          0 :     mrEventMultiplexer.removeClickHandler( mpMouseHandler );
     237                 :            : 
     238                 :          0 :     mbActive = false; // will be removed from queue
     239                 :            : 
     240                 :          0 :     for_each_sprite( boost::bind( &cppcanvas::Sprite::hide, _1 ) );
     241                 :            : 
     242                 :          0 :     return maElapsedTime.getElapsedTime();
     243                 :            : }
     244                 :            : 
     245                 :          0 : bool RehearseTimingsActivity::hasBeenClicked() const
     246                 :            : {
     247                 :          0 :     if (mpMouseHandler)
     248                 :          0 :         return mpMouseHandler->hasBeenClicked();
     249                 :          0 :     return false;
     250                 :            : }
     251                 :            : 
     252                 :            : // Disposable:
     253                 :          0 : void RehearseTimingsActivity::dispose()
     254                 :            : {
     255                 :          0 :     stop();
     256                 :            : 
     257                 :          0 :     mpWakeUpEvent.reset();
     258                 :          0 :     mpMouseHandler.reset();
     259                 :            : 
     260                 :          0 :     ViewsVecT().swap( maViews );
     261                 :          0 : }
     262                 :            : 
     263                 :            : // Activity:
     264                 :          0 : double RehearseTimingsActivity::calcTimeLag() const
     265                 :            : {
     266                 :          0 :     return 0.0;
     267                 :            : }
     268                 :            : 
     269                 :          0 : bool RehearseTimingsActivity::perform()
     270                 :            : {
     271                 :          0 :     if( !isActive() )
     272                 :          0 :         return false;
     273                 :            : 
     274                 :          0 :     if( !mpWakeUpEvent )
     275                 :          0 :         return false;
     276                 :            : 
     277                 :          0 :     mpWakeUpEvent->start();
     278                 :          0 :     mpWakeUpEvent->setNextTimeout( 0.5 );
     279                 :          0 :     mrEventQueue.addEvent( mpWakeUpEvent );
     280                 :            : 
     281                 :          0 :     paintAllSprites();
     282                 :            : 
     283                 :            :     // sprites changed, need screen update
     284                 :          0 :     mrScreenUpdater.notifyUpdate();
     285                 :            : 
     286                 :          0 :     return false; // don't reinsert, WakeupEvent will perform
     287                 :            :                   // that after the given timeout
     288                 :            : }
     289                 :            : 
     290                 :          0 : bool RehearseTimingsActivity::isActive() const
     291                 :            : {
     292                 :          0 :     return mbActive;
     293                 :            : }
     294                 :            : 
     295                 :          0 : void RehearseTimingsActivity::dequeued()
     296                 :            : {
     297                 :            :     // not used here
     298                 :          0 : }
     299                 :            : 
     300                 :          0 : void RehearseTimingsActivity::end()
     301                 :            : {
     302                 :          0 :     if (isActive())
     303                 :            :     {
     304                 :          0 :         stop();
     305                 :          0 :         mbActive = false;
     306                 :            :     }
     307                 :          0 : }
     308                 :            : 
     309                 :          0 : basegfx::B2DRange RehearseTimingsActivity::calcSpriteRectangle( UnoViewSharedPtr const& rView ) const
     310                 :            : {
     311                 :          0 :     const Reference<rendering::XBitmap> xBitmap( rView->getCanvas()->getUNOCanvas(),
     312                 :          0 :                                                  UNO_QUERY );
     313                 :          0 :     if( !xBitmap.is() )
     314                 :          0 :         return basegfx::B2DRange();
     315                 :            : 
     316                 :          0 :     const geometry::IntegerSize2D realSize( xBitmap->getSize() );
     317                 :            :     // pixel:
     318                 :            :     basegfx::B2DPoint spritePos(
     319                 :          0 :         std::min<sal_Int32>( realSize.Width, LEFT_BORDER_SPACE ),
     320                 :          0 :         std::max<sal_Int32>( 0, realSize.Height - maSpriteSizePixel.getY()
     321                 :          0 :                                                 - LOWER_BORDER_SPACE ) );
     322                 :          0 :     basegfx::B2DHomMatrix transformation( rView->getTransformation() );
     323                 :          0 :     transformation.invert();
     324                 :          0 :     spritePos *= transformation;
     325                 :          0 :     basegfx::B2DSize spriteSize( maSpriteSizePixel.getX(),
     326                 :          0 :                                  maSpriteSizePixel.getY() );
     327                 :          0 :     spriteSize *= transformation;
     328                 :            :     return basegfx::B2DRange(
     329                 :            :         spritePos.getX(), spritePos.getY(),
     330                 :          0 :         spritePos.getX() + spriteSize.getX(),
     331                 :          0 :         spritePos.getY() + spriteSize.getY() );
     332                 :            : }
     333                 :            : 
     334                 :          0 : void RehearseTimingsActivity::viewAdded( const UnoViewSharedPtr& rView )
     335                 :            : {
     336                 :            :     cppcanvas::CustomSpriteSharedPtr sprite(
     337                 :          0 :         rView->createSprite( basegfx::B2DSize(
     338                 :          0 :                                  maSpriteSizePixel.getX()+2,
     339                 :          0 :                                  maSpriteSizePixel.getY()+2 ),
     340                 :          0 :                              1001.0 )); // sprite should be in front of all
     341                 :            :                                         // other sprites
     342                 :          0 :     sprite->setAlpha( 0.8 );
     343                 :            :     const basegfx::B2DRange spriteRectangle(
     344                 :          0 :         calcSpriteRectangle( rView ) );
     345                 :          0 :     sprite->move( basegfx::B2DPoint(
     346                 :            :                       spriteRectangle.getMinX(),
     347                 :          0 :                       spriteRectangle.getMinY() ) );
     348                 :            : 
     349                 :          0 :     if( maViews.empty() )
     350                 :          0 :         maSpriteRectangle = spriteRectangle;
     351                 :            : 
     352                 :          0 :     maViews.push_back( ViewsVecT::value_type( rView, sprite ) );
     353                 :            : 
     354                 :          0 :     if (isActive())
     355                 :          0 :         sprite->show();
     356                 :          0 : }
     357                 :            : 
     358                 :          0 : void RehearseTimingsActivity::viewRemoved( const UnoViewSharedPtr& rView )
     359                 :            : {
     360                 :            :     maViews.erase(
     361                 :            :         std::remove_if(
     362                 :            :             maViews.begin(), maViews.end(),
     363                 :            :             boost::bind(
     364                 :            :                 std::equal_to<UnoViewSharedPtr>(),
     365                 :            :                 rView,
     366                 :            :                 // select view:
     367                 :            :                 boost::bind( o3tl::select1st<ViewsVecT::value_type>(), _1 ))),
     368                 :          0 :         maViews.end() );
     369                 :          0 : }
     370                 :            : 
     371                 :          0 : void RehearseTimingsActivity::viewChanged( const UnoViewSharedPtr& rView )
     372                 :            : {
     373                 :            :     // find entry corresponding to modified view
     374                 :            :     ViewsVecT::iterator aModifiedEntry(
     375                 :            :         std::find_if(
     376                 :            :             maViews.begin(),
     377                 :            :             maViews.end(),
     378                 :            :             boost::bind(
     379                 :            :                 std::equal_to<UnoViewSharedPtr>(),
     380                 :            :                 rView,
     381                 :            :                 // select view:
     382                 :          0 :                 boost::bind( o3tl::select1st<ViewsVecT::value_type>(), _1 ))));
     383                 :            : 
     384                 :            :     OSL_ASSERT( aModifiedEntry != maViews.end() );
     385                 :          0 :     if( aModifiedEntry == maViews.end() )
     386                 :          0 :         return;
     387                 :            : 
     388                 :            :     // new sprite pos, transformation might have changed:
     389                 :          0 :     maSpriteRectangle = calcSpriteRectangle( rView );
     390                 :            : 
     391                 :            :     // reposition sprite:
     392                 :          0 :     aModifiedEntry->second->move( maSpriteRectangle.getMinimum() );
     393                 :            : 
     394                 :            :     // sprites changed, need screen update
     395                 :          0 :     mrScreenUpdater.notifyUpdate( rView );
     396                 :            : }
     397                 :            : 
     398                 :          0 : void RehearseTimingsActivity::viewsChanged()
     399                 :            : {
     400                 :          0 :     if( !maViews.empty() )
     401                 :            :     {
     402                 :            :         // new sprite pos, transformation might have changed:
     403                 :          0 :         maSpriteRectangle = calcSpriteRectangle( maViews.front().first );
     404                 :            : 
     405                 :            :         // reposition sprites
     406                 :            :         for_each_sprite( boost::bind( &cppcanvas::Sprite::move,
     407                 :            :                                       _1,
     408                 :          0 :                                       boost::cref(maSpriteRectangle.getMinimum())) );
     409                 :            : 
     410                 :            :         // sprites changed, need screen update
     411                 :          0 :         mrScreenUpdater.notifyUpdate();
     412                 :            :     }
     413                 :          0 : }
     414                 :            : 
     415                 :          0 : void RehearseTimingsActivity::paintAllSprites() const
     416                 :            : {
     417                 :            :     for_each_sprite(
     418                 :            :         boost::bind( &RehearseTimingsActivity::paint, this,
     419                 :            :                      // call getContentCanvas() on each sprite:
     420                 :            :                      boost::bind(
     421                 :          0 :                          &cppcanvas::CustomSprite::getContentCanvas, _1 ) ) );
     422                 :          0 : }
     423                 :            : 
     424                 :          0 : void RehearseTimingsActivity::paint( cppcanvas::CanvasSharedPtr const & canvas ) const
     425                 :            : {
     426                 :            :     // build timer string:
     427                 :            :     const sal_Int32 nTimeSecs =
     428                 :          0 :         static_cast<sal_Int32>(maElapsedTime.getElapsedTime());
     429                 :          0 :     rtl::OUStringBuffer buf;
     430                 :          0 :     sal_Int32 n = (nTimeSecs / 3600);
     431                 :          0 :     if (n < 10)
     432                 :          0 :         buf.append( static_cast<sal_Unicode>('0') );
     433                 :          0 :     buf.append( n );
     434                 :          0 :     buf.append( static_cast<sal_Unicode>(':') );
     435                 :          0 :     n = ((nTimeSecs % 3600) / 60);
     436                 :          0 :     if (n < 10)
     437                 :          0 :         buf.append( static_cast<sal_Unicode>('0') );
     438                 :          0 :     buf.append( n );
     439                 :          0 :     buf.append( static_cast<sal_Unicode>(':') );
     440                 :          0 :     n = (nTimeSecs % 60);
     441                 :          0 :     if (n < 10)
     442                 :          0 :         buf.append( static_cast<sal_Unicode>('0') );
     443                 :          0 :     buf.append( n );
     444                 :          0 :     const rtl::OUString time = buf.makeStringAndClear();
     445                 :            : 
     446                 :            :     // create the MetaFile:
     447                 :          0 :     GDIMetaFile metaFile;
     448                 :          0 :     VirtualDevice blackHole;
     449                 :          0 :     metaFile.Record( &blackHole );
     450                 :          0 :     metaFile.SetPrefSize( Size( 1, 1 ) );
     451                 :          0 :     blackHole.EnableOutput(false);
     452                 :          0 :     blackHole.SetMapMode( MAP_PIXEL );
     453                 :          0 :     blackHole.SetFont( maFont );
     454                 :            :     Rectangle rect = Rectangle( 0,0,
     455                 :            :                                 maSpriteSizePixel.getX(),
     456                 :          0 :                                 maSpriteSizePixel.getY());
     457                 :          0 :     if (mbDrawPressed)
     458                 :            :     {
     459                 :          0 :         blackHole.SetTextColor( COL_BLACK );
     460                 :          0 :         blackHole.SetFillColor( COL_LIGHTGRAY );
     461                 :          0 :         blackHole.SetLineColor( COL_GRAY );
     462                 :            :     }
     463                 :            :     else
     464                 :            :     {
     465                 :          0 :         blackHole.SetTextColor( COL_BLACK );
     466                 :          0 :         blackHole.SetFillColor( COL_WHITE );
     467                 :          0 :         blackHole.SetLineColor( COL_GRAY );
     468                 :            :     }
     469                 :          0 :     blackHole.DrawRect( rect );
     470                 :          0 :     blackHole.GetTextBoundRect( rect, time );
     471                 :            :     blackHole.DrawText(
     472                 :          0 :         Point( (maSpriteSizePixel.getX() - rect.getWidth()) / 2,
     473                 :          0 :                mnYOffset ), time );
     474                 :            : 
     475                 :          0 :     metaFile.Stop();
     476                 :          0 :     metaFile.WindStart();
     477                 :            : 
     478                 :            :     cppcanvas::RendererSharedPtr renderer(
     479                 :          0 :         cppcanvas::VCLFactory::getInstance().createRenderer(
     480                 :          0 :             canvas, metaFile, cppcanvas::Renderer::Parameters() ) );
     481                 :          0 :     const bool succ = renderer->draw();
     482                 :            :     OSL_ASSERT( succ );
     483                 :          0 :     (void)succ;
     484                 :          0 : }
     485                 :            : 
     486                 :            : 
     487                 :          0 : RehearseTimingsActivity::MouseHandler::MouseHandler( RehearseTimingsActivity& rta ) :
     488                 :            :     mrActivity(rta),
     489                 :            :     mbHasBeenClicked(false),
     490                 :          0 :     mbMouseStartedInArea(false)
     491                 :          0 : {}
     492                 :            : 
     493                 :          0 : void RehearseTimingsActivity::MouseHandler::reset()
     494                 :            : {
     495                 :          0 :     mbHasBeenClicked = false;
     496                 :          0 :     mbMouseStartedInArea = false;
     497                 :          0 : }
     498                 :            : 
     499                 :          0 : bool RehearseTimingsActivity::MouseHandler::isInArea(
     500                 :            :     awt::MouseEvent const & evt ) const
     501                 :            : {
     502                 :            :     return mrActivity.maSpriteRectangle.isInside(
     503                 :          0 :         basegfx::B2DPoint( evt.X, evt.Y ) );
     504                 :            : }
     505                 :            : 
     506                 :          0 : void RehearseTimingsActivity::MouseHandler::updatePressedState(
     507                 :            :     const bool pressedState ) const
     508                 :            : {
     509                 :          0 :     if( pressedState != mrActivity.mbDrawPressed )
     510                 :            :     {
     511                 :          0 :         mrActivity.mbDrawPressed = pressedState;
     512                 :          0 :         mrActivity.paintAllSprites();
     513                 :            : 
     514                 :          0 :         mrActivity.mrScreenUpdater.notifyUpdate();
     515                 :            :     }
     516                 :          0 : }
     517                 :            : 
     518                 :            : // MouseEventHandler
     519                 :          0 : bool RehearseTimingsActivity::MouseHandler::handleMousePressed(
     520                 :            :     awt::MouseEvent const & evt )
     521                 :            : {
     522                 :          0 :     if( evt.Buttons == awt::MouseButton::LEFT && isInArea(evt) )
     523                 :            :     {
     524                 :          0 :         mbMouseStartedInArea = true;
     525                 :          0 :         updatePressedState(true);
     526                 :          0 :         return true; // consume event
     527                 :            :     }
     528                 :          0 :     return false;
     529                 :            : }
     530                 :            : 
     531                 :          0 : bool RehearseTimingsActivity::MouseHandler::handleMouseReleased(
     532                 :            :     awt::MouseEvent const & evt )
     533                 :            : {
     534                 :          0 :     if( evt.Buttons == awt::MouseButton::LEFT && mbMouseStartedInArea )
     535                 :            :     {
     536                 :          0 :         mbHasBeenClicked = isInArea(evt); // fini if in
     537                 :          0 :         mbMouseStartedInArea = false;
     538                 :          0 :         updatePressedState(false);
     539                 :          0 :         if( !mbHasBeenClicked )
     540                 :          0 :             return true; // consume event, else next slide (manual advance)
     541                 :            :     }
     542                 :          0 :     return false;
     543                 :            : }
     544                 :            : 
     545                 :          0 : bool RehearseTimingsActivity::MouseHandler::handleMouseEntered(
     546                 :            :     awt::MouseEvent const & /*evt*/ )
     547                 :            : {
     548                 :          0 :     return false;
     549                 :            : }
     550                 :            : 
     551                 :          0 : bool RehearseTimingsActivity::MouseHandler::handleMouseExited(
     552                 :            :     awt::MouseEvent const & /*evt*/ )
     553                 :            : {
     554                 :          0 :     return false;
     555                 :            : }
     556                 :            : 
     557                 :          0 : bool RehearseTimingsActivity::MouseHandler::handleMouseDragged(
     558                 :            :     awt::MouseEvent const & evt )
     559                 :            : {
     560                 :          0 :     if( mbMouseStartedInArea )
     561                 :          0 :         updatePressedState( isInArea(evt) );
     562                 :          0 :     return false;
     563                 :            : }
     564                 :            : 
     565                 :          0 : bool RehearseTimingsActivity::MouseHandler::handleMouseMoved(
     566                 :            :     awt::MouseEvent const & /*evt*/ )
     567                 :            : {
     568                 :          0 :     return false;
     569                 :            : }
     570                 :            : 
     571                 :            : } // namespace internal
     572                 :          0 : } // namespace presentation
     573                 :            : 
     574                 :            : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10