summaryrefslogtreecommitdiff
path: root/slideshow/source/engine/rehearsetimingsactivity.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'slideshow/source/engine/rehearsetimingsactivity.cxx')
-rw-r--r--slideshow/source/engine/rehearsetimingsactivity.cxx585
1 files changed, 0 insertions, 585 deletions
diff --git a/slideshow/source/engine/rehearsetimingsactivity.cxx b/slideshow/source/engine/rehearsetimingsactivity.cxx
deleted file mode 100644
index 325b86d1c..000000000
--- a/slideshow/source/engine/rehearsetimingsactivity.cxx
+++ /dev/null
@@ -1,585 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-// MARKER(update_precomp.py): autogen include statement, do not remove
-#include "precompiled_slideshow.hxx"
-
-#include <boost/current_function.hpp>
-#include <rtl/ustrbuf.hxx>
-#include <vcl/svapp.hxx>
-#include <vcl/gdimtf.hxx>
-#include <vcl/virdev.hxx>
-#include <vcl/metric.hxx>
-#include <cppcanvas/vclfactory.hxx>
-#include <cppcanvas/basegfxfactory.hxx>
-#include <basegfx/range/b2drange.hxx>
-
-#include <comphelper/anytostring.hxx>
-#include <cppuhelper/exc_hlp.hxx>
-
-#include <com/sun/star/awt/MouseButton.hpp>
-#include <com/sun/star/awt/MouseEvent.hpp>
-#include <com/sun/star/rendering/XBitmap.hpp>
-
-#include "eventqueue.hxx"
-#include "screenupdater.hxx"
-#include "eventmultiplexer.hxx"
-#include "activitiesqueue.hxx"
-#include "slideshowcontext.hxx"
-#include "mouseeventhandler.hxx"
-#include "rehearsetimingsactivity.hxx"
-
-#include <boost/bind.hpp>
-#include <o3tl/compat_functional.hxx>
-#include <algorithm>
-
-using namespace com::sun::star;
-using namespace com::sun::star::uno;
-
-namespace slideshow {
-namespace internal {
-
-class RehearseTimingsActivity::WakeupEvent : public Event,
- private ::boost::noncopyable
-{
-public:
- WakeupEvent( boost::shared_ptr< ::canvas::tools::ElapsedTime > const& pTimeBase,
- ActivitySharedPtr const& rActivity,
- ActivitiesQueue & rActivityQueue ) :
-#if OSL_DEBUG_LEVEL > 1
- Event(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("WakeupEvent"))),
-#endif
- maTimer(pTimeBase),
- mnNextTime(0.0),
- mpActivity(rActivity),
- mrActivityQueue( rActivityQueue )
- {}
-
- virtual void dispose() {}
- virtual bool fire()
- {
- ActivitySharedPtr pActivity( mpActivity.lock() );
- if( !pActivity )
- return false;
-
- return mrActivityQueue.addActivity( pActivity );
- }
-
- virtual bool isCharged() const { return true; }
- virtual double getActivationTime( double nCurrentTime ) const
- {
- const double nElapsedTime( maTimer.getElapsedTime() );
-
- return ::std::max( nCurrentTime,
- nCurrentTime - nElapsedTime + mnNextTime );
- }
-
- /// Start the internal timer
- void start() { maTimer.reset(); }
-
- /** Set the next timeout this object should generate.
-
- @param nextTime
- Absolute time, measured from the last start() call,
- when this event should wakeup the Activity again. If
- your time is relative, simply call start() just before
- every setNextTimeout() call.
- */
- void setNextTimeout( double nextTime ) { mnNextTime = nextTime; }
-
-private:
- ::canvas::tools::ElapsedTime maTimer;
- double mnNextTime;
- boost::weak_ptr<Activity> mpActivity;
- ActivitiesQueue& mrActivityQueue;
-};
-
-class RehearseTimingsActivity::MouseHandler : public MouseEventHandler,
- private boost::noncopyable
-{
-public:
- explicit MouseHandler( RehearseTimingsActivity& rta );
-
- void reset();
- bool hasBeenClicked() const { return mbHasBeenClicked; }
-
- // MouseEventHandler
- virtual bool handleMousePressed( awt::MouseEvent const & evt );
- virtual bool handleMouseReleased( awt::MouseEvent const & evt );
- virtual bool handleMouseEntered( awt::MouseEvent const & evt );
- virtual bool handleMouseExited( awt::MouseEvent const & evt );
- virtual bool handleMouseDragged( awt::MouseEvent const & evt );
- virtual bool handleMouseMoved( awt::MouseEvent const & evt );
-
-private:
- bool isInArea( com::sun::star::awt::MouseEvent const & evt ) const;
- void updatePressedState( const bool pressedState ) const;
-
- RehearseTimingsActivity& mrActivity;
- bool mbHasBeenClicked;
- bool mbMouseStartedInArea;
-};
-
-const sal_Int32 LEFT_BORDER_SPACE = 10;
-const sal_Int32 LOWER_BORDER_SPACE = 30;
-
-RehearseTimingsActivity::RehearseTimingsActivity( const SlideShowContext& rContext ) :
- mrEventQueue(rContext.mrEventQueue),
- mrScreenUpdater(rContext.mrScreenUpdater),
- mrEventMultiplexer(rContext.mrEventMultiplexer),
- mrActivitiesQueue(rContext.mrActivitiesQueue),
- maElapsedTime( rContext.mrEventQueue.getTimer() ),
- maViews(),
- maSpriteRectangle(),
- maFont( Application::GetSettings().GetStyleSettings().GetInfoFont() ),
- mpWakeUpEvent(),
- mpMouseHandler(),
- maSpriteSizePixel(),
- mnYOffset(0),
- mbActive(false),
- mbDrawPressed(false)
-{
- maFont.SetHeight( maFont.GetHeight() * 2 );
- maFont.SetWidth( maFont.GetWidth() * 2 );
- maFont.SetAlign( ALIGN_BASELINE );
- maFont.SetColor( COL_BLACK );
-
- // determine sprite size (in pixel):
- VirtualDevice blackHole;
- blackHole.EnableOutput(false);
- blackHole.SetFont( maFont );
- blackHole.SetMapMode( MAP_PIXEL );
- Rectangle rect;
- const FontMetric metric( blackHole.GetFontMetric() );
- blackHole.GetTextBoundRect(
- rect, String(RTL_CONSTASCII_USTRINGPARAM("XX:XX:XX")) );
- maSpriteSizePixel.setX( rect.getWidth() * 12 / 10 );
- maSpriteSizePixel.setY( metric.GetLineHeight() * 11 / 10 );
- mnYOffset = (metric.GetAscent() + (metric.GetLineHeight() / 20));
-
- std::for_each( rContext.mrViewContainer.begin(),
- rContext.mrViewContainer.end(),
- boost::bind( &RehearseTimingsActivity::viewAdded,
- this,
- _1 ));
-}
-
-RehearseTimingsActivity::~RehearseTimingsActivity()
-{
- try
- {
- stop();
- }
- catch (uno::Exception &)
- {
- OSL_FAIL( rtl::OUStringToOString(
- comphelper::anyToString(
- cppu::getCaughtException() ),
- RTL_TEXTENCODING_UTF8 ).getStr() );
- }
-}
-
-boost::shared_ptr<RehearseTimingsActivity> RehearseTimingsActivity::create(
- const SlideShowContext& rContext )
-{
- boost::shared_ptr<RehearseTimingsActivity> pActivity(
- new RehearseTimingsActivity( rContext ));
-
- pActivity->mpMouseHandler.reset(
- new MouseHandler(*pActivity.get()) );
- pActivity->mpWakeUpEvent.reset(
- new WakeupEvent( rContext.mrEventQueue.getTimer(),
- pActivity,
- rContext.mrActivitiesQueue ));
-
- rContext.mrEventMultiplexer.addViewHandler( pActivity );
-
- return pActivity;
-}
-
-void RehearseTimingsActivity::start()
-{
- maElapsedTime.reset();
- mbDrawPressed = false;
- mbActive = true;
-
- // paint and show all sprites:
- paintAllSprites();
- for_each_sprite( boost::bind( &cppcanvas::Sprite::show, _1 ) );
-
- mrActivitiesQueue.addActivity( shared_from_this() );
-
- mpMouseHandler->reset();
- mrEventMultiplexer.addClickHandler(
- mpMouseHandler, 42 /* highest prio of all, > 3.0 */ );
- mrEventMultiplexer.addMouseMoveHandler(
- mpMouseHandler, 42 /* highest prio of all, > 3.0 */ );
-}
-
-double RehearseTimingsActivity::stop()
-{
- mrEventMultiplexer.removeMouseMoveHandler( mpMouseHandler );
- mrEventMultiplexer.removeClickHandler( mpMouseHandler );
-
- mbActive = false; // will be removed from queue
-
- for_each_sprite( boost::bind( &cppcanvas::Sprite::hide, _1 ) );
-
- return maElapsedTime.getElapsedTime();
-}
-
-bool RehearseTimingsActivity::hasBeenClicked() const
-{
- if (mpMouseHandler)
- return mpMouseHandler->hasBeenClicked();
- return false;
-}
-
-// Disposable:
-void RehearseTimingsActivity::dispose()
-{
- stop();
-
- mpWakeUpEvent.reset();
- mpMouseHandler.reset();
-
- ViewsVecT().swap( maViews );
-}
-
-// Activity:
-double RehearseTimingsActivity::calcTimeLag() const
-{
- return 0.0;
-}
-
-bool RehearseTimingsActivity::perform()
-{
- if( !isActive() )
- return false;
-
- if( !mpWakeUpEvent )
- return false;
-
- mpWakeUpEvent->start();
- mpWakeUpEvent->setNextTimeout( 0.5 );
- mrEventQueue.addEvent( mpWakeUpEvent );
-
- paintAllSprites();
-
- // sprites changed, need screen update
- mrScreenUpdater.notifyUpdate();
-
- return false; // don't reinsert, WakeupEvent will perform
- // that after the given timeout
-}
-
-bool RehearseTimingsActivity::isActive() const
-{
- return mbActive;
-}
-
-void RehearseTimingsActivity::dequeued()
-{
- // not used here
-}
-
-void RehearseTimingsActivity::end()
-{
- if (isActive())
- {
- stop();
- mbActive = false;
- }
-}
-
-basegfx::B2DRange RehearseTimingsActivity::calcSpriteRectangle( UnoViewSharedPtr const& rView ) const
-{
- const Reference<rendering::XBitmap> xBitmap( rView->getCanvas()->getUNOCanvas(),
- UNO_QUERY );
- if( !xBitmap.is() )
- return basegfx::B2DRange();
-
- const geometry::IntegerSize2D realSize( xBitmap->getSize() );
- // pixel:
- basegfx::B2DPoint spritePos(
- std::min<sal_Int32>( realSize.Width, LEFT_BORDER_SPACE ),
- std::max<sal_Int32>( 0, realSize.Height - maSpriteSizePixel.getY()
- - LOWER_BORDER_SPACE ) );
- basegfx::B2DHomMatrix transformation( rView->getTransformation() );
- transformation.invert();
- spritePos *= transformation;
- basegfx::B2DSize spriteSize( maSpriteSizePixel.getX(),
- maSpriteSizePixel.getY() );
- spriteSize *= transformation;
- return basegfx::B2DRange(
- spritePos.getX(), spritePos.getY(),
- spritePos.getX() + spriteSize.getX(),
- spritePos.getY() + spriteSize.getY() );
-}
-
-void RehearseTimingsActivity::viewAdded( const UnoViewSharedPtr& rView )
-{
- cppcanvas::CustomSpriteSharedPtr sprite(
- rView->createSprite( basegfx::B2DSize(
- maSpriteSizePixel.getX()+2,
- maSpriteSizePixel.getY()+2 ),
- 1001.0 )); // sprite should be in front of all
- // other sprites
- sprite->setAlpha( 0.8 );
- const basegfx::B2DRange spriteRectangle(
- calcSpriteRectangle( rView ) );
- sprite->move( basegfx::B2DPoint(
- spriteRectangle.getMinX(),
- spriteRectangle.getMinY() ) );
-
- if( maViews.empty() )
- maSpriteRectangle = spriteRectangle;
-
- maViews.push_back( ViewsVecT::value_type( rView, sprite ) );
-
- if (isActive())
- sprite->show();
-}
-
-void RehearseTimingsActivity::viewRemoved( const UnoViewSharedPtr& rView )
-{
- maViews.erase(
- std::remove_if(
- maViews.begin(), maViews.end(),
- boost::bind(
- std::equal_to<UnoViewSharedPtr>(),
- rView,
- // select view:
- boost::bind( o3tl::select1st<ViewsVecT::value_type>(), _1 ))),
- maViews.end() );
-}
-
-void RehearseTimingsActivity::viewChanged( const UnoViewSharedPtr& rView )
-{
- // find entry corresponding to modified view
- ViewsVecT::iterator aModifiedEntry(
- std::find_if(
- maViews.begin(),
- maViews.end(),
- boost::bind(
- std::equal_to<UnoViewSharedPtr>(),
- rView,
- // select view:
- boost::bind( o3tl::select1st<ViewsVecT::value_type>(), _1 ))));
-
- OSL_ASSERT( aModifiedEntry != maViews.end() );
- if( aModifiedEntry == maViews.end() )
- return;
-
- // new sprite pos, transformation might have changed:
- maSpriteRectangle = calcSpriteRectangle( rView );
-
- // reposition sprite:
- aModifiedEntry->second->move( maSpriteRectangle.getMinimum() );
-
- // sprites changed, need screen update
- mrScreenUpdater.notifyUpdate( rView );
-}
-
-void RehearseTimingsActivity::viewsChanged()
-{
- if( !maViews.empty() )
- {
- // new sprite pos, transformation might have changed:
- maSpriteRectangle = calcSpriteRectangle( maViews.front().first );
-
- // reposition sprites
- for_each_sprite( boost::bind( &cppcanvas::Sprite::move,
- _1,
- boost::cref(maSpriteRectangle.getMinimum())) );
-
- // sprites changed, need screen update
- mrScreenUpdater.notifyUpdate();
- }
-}
-
-void RehearseTimingsActivity::paintAllSprites() const
-{
- for_each_sprite(
- boost::bind( &RehearseTimingsActivity::paint, this,
- // call getContentCanvas() on each sprite:
- boost::bind(
- &cppcanvas::CustomSprite::getContentCanvas, _1 ) ) );
-}
-
-void RehearseTimingsActivity::paint( cppcanvas::CanvasSharedPtr const & canvas ) const
-{
- // build timer string:
- const sal_Int32 nTimeSecs =
- static_cast<sal_Int32>(maElapsedTime.getElapsedTime());
- rtl::OUStringBuffer buf;
- sal_Int32 n = (nTimeSecs / 3600);
- if (n < 10)
- buf.append( static_cast<sal_Unicode>('0') );
- buf.append( n );
- buf.append( static_cast<sal_Unicode>(':') );
- n = ((nTimeSecs % 3600) / 60);
- if (n < 10)
- buf.append( static_cast<sal_Unicode>('0') );
- buf.append( n );
- buf.append( static_cast<sal_Unicode>(':') );
- n = (nTimeSecs % 60);
- if (n < 10)
- buf.append( static_cast<sal_Unicode>('0') );
- buf.append( n );
- const rtl::OUString time = buf.makeStringAndClear();
-
- // create the MetaFile:
- GDIMetaFile metaFile;
- VirtualDevice blackHole;
- metaFile.Record( &blackHole );
- metaFile.SetPrefSize( Size( 1, 1 ) );
- blackHole.EnableOutput(false);
- blackHole.SetMapMode( MAP_PIXEL );
- blackHole.SetFont( maFont );
- Rectangle rect = Rectangle( 0,0,
- maSpriteSizePixel.getX(),
- maSpriteSizePixel.getY());
- if (mbDrawPressed)
- {
- blackHole.SetTextColor( COL_BLACK );
- blackHole.SetFillColor( COL_LIGHTGRAY );
- blackHole.SetLineColor( COL_GRAY );
- }
- else
- {
- blackHole.SetTextColor( COL_BLACK );
- blackHole.SetFillColor( COL_WHITE );
- blackHole.SetLineColor( COL_GRAY );
- }
- blackHole.DrawRect( rect );
- blackHole.GetTextBoundRect( rect, time );
- blackHole.DrawText(
- Point( (maSpriteSizePixel.getX() - rect.getWidth()) / 2,
- mnYOffset ), time );
-
- metaFile.Stop();
- metaFile.WindStart();
-
- cppcanvas::RendererSharedPtr renderer(
- cppcanvas::VCLFactory::getInstance().createRenderer(
- canvas, metaFile, cppcanvas::Renderer::Parameters() ) );
- const bool succ = renderer->draw();
- OSL_ASSERT( succ );
- (void)succ;
-}
-
-
-RehearseTimingsActivity::MouseHandler::MouseHandler( RehearseTimingsActivity& rta ) :
- mrActivity(rta),
- mbHasBeenClicked(false),
- mbMouseStartedInArea(false)
-{}
-
-void RehearseTimingsActivity::MouseHandler::reset()
-{
- mbHasBeenClicked = false;
- mbMouseStartedInArea = false;
-}
-
-bool RehearseTimingsActivity::MouseHandler::isInArea(
- awt::MouseEvent const & evt ) const
-{
- return mrActivity.maSpriteRectangle.isInside(
- basegfx::B2DPoint( evt.X, evt.Y ) );
-}
-
-void RehearseTimingsActivity::MouseHandler::updatePressedState(
- const bool pressedState ) const
-{
- if( pressedState != mrActivity.mbDrawPressed )
- {
- mrActivity.mbDrawPressed = pressedState;
- mrActivity.paintAllSprites();
-
- mrActivity.mrScreenUpdater.notifyUpdate();
- }
-}
-
-// MouseEventHandler
-bool RehearseTimingsActivity::MouseHandler::handleMousePressed(
- awt::MouseEvent const & evt )
-{
- if( evt.Buttons == awt::MouseButton::LEFT && isInArea(evt) )
- {
- mbMouseStartedInArea = true;
- updatePressedState(true);
- return true; // consume event
- }
- return false;
-}
-
-bool RehearseTimingsActivity::MouseHandler::handleMouseReleased(
- awt::MouseEvent const & evt )
-{
- if( evt.Buttons == awt::MouseButton::LEFT && mbMouseStartedInArea )
- {
- mbHasBeenClicked = isInArea(evt); // fini if in
- mbMouseStartedInArea = false;
- updatePressedState(false);
- if( !mbHasBeenClicked )
- return true; // consume event, else next slide (manual advance)
- }
- return false;
-}
-
-bool RehearseTimingsActivity::MouseHandler::handleMouseEntered(
- awt::MouseEvent const & /*evt*/ )
-{
- return false;
-}
-
-bool RehearseTimingsActivity::MouseHandler::handleMouseExited(
- awt::MouseEvent const & /*evt*/ )
-{
- return false;
-}
-
-bool RehearseTimingsActivity::MouseHandler::handleMouseDragged(
- awt::MouseEvent const & evt )
-{
- if( mbMouseStartedInArea )
- updatePressedState( isInArea(evt) );
- return false;
-}
-
-bool RehearseTimingsActivity::MouseHandler::handleMouseMoved(
- awt::MouseEvent const & /*evt*/ )
-{
- return false;
-}
-
-} // namespace internal
-} // namespace presentation
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */