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