1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 29*cdf0e10cSrcweir #include "precompiled_sdext.hxx" 30*cdf0e10cSrcweir 31*cdf0e10cSrcweir #include "PresenterClock.hxx" 32*cdf0e10cSrcweir #include "PresenterComponent.hxx" 33*cdf0e10cSrcweir #include "PresenterConfigurationAccess.hxx" 34*cdf0e10cSrcweir #include "PresenterGeometryHelper.hxx" 35*cdf0e10cSrcweir #include <com/sun/star/awt/InvalidateStyle.hpp> 36*cdf0e10cSrcweir #include <com/sun/star/awt/MouseButton.hpp> 37*cdf0e10cSrcweir #include <com/sun/star/awt/Point.hpp> 38*cdf0e10cSrcweir #include <com/sun/star/awt/XWindowPeer.hpp> 39*cdf0e10cSrcweir #include <com/sun/star/container/XNameAccess.hpp> 40*cdf0e10cSrcweir #include <com/sun/star/deployment/XPackageInformationProvider.hpp> 41*cdf0e10cSrcweir #include <com/sun/star/drawing/framework/XControllerManager.hpp> 42*cdf0e10cSrcweir #include <com/sun/star/drawing/framework/XConfigurationController.hpp> 43*cdf0e10cSrcweir #include <com/sun/star/rendering/CompositeOperation.hpp> 44*cdf0e10cSrcweir #include <com/sun/star/rendering/PathCapType.hpp> 45*cdf0e10cSrcweir #include <com/sun/star/rendering/TextDirection.hpp> 46*cdf0e10cSrcweir #include <com/sun/star/rendering/XCanvasFont.hpp> 47*cdf0e10cSrcweir #include <com/sun/star/rendering/XSpriteCanvas.hpp> 48*cdf0e10cSrcweir #include <com/sun/star/util/Color.hpp> 49*cdf0e10cSrcweir #include <osl/mutex.hxx> 50*cdf0e10cSrcweir #include <osl/time.h> 51*cdf0e10cSrcweir #include <rtl/ref.hxx> 52*cdf0e10cSrcweir #include <vos/timer.hxx> 53*cdf0e10cSrcweir #include <boost/bind.hpp> 54*cdf0e10cSrcweir #include <cmath> 55*cdf0e10cSrcweir 56*cdf0e10cSrcweir using namespace ::com::sun::star; 57*cdf0e10cSrcweir using namespace ::com::sun::star::uno; 58*cdf0e10cSrcweir using namespace ::com::sun::star::drawing::framework; 59*cdf0e10cSrcweir using ::rtl::OUString; 60*cdf0e10cSrcweir 61*cdf0e10cSrcweir namespace sdext { namespace presenter { 62*cdf0e10cSrcweir 63*cdf0e10cSrcweir 64*cdf0e10cSrcweir /** Wrapper around a library timer. 65*cdf0e10cSrcweir */ 66*cdf0e10cSrcweir class PresenterClock::Timer : public vos::OTimer 67*cdf0e10cSrcweir { 68*cdf0e10cSrcweir public: 69*cdf0e10cSrcweir explicit Timer (const ::rtl::Reference<PresenterClock>& rpClock); 70*cdf0e10cSrcweir virtual ~Timer (void); 71*cdf0e10cSrcweir 72*cdf0e10cSrcweir void Stop (void); 73*cdf0e10cSrcweir 74*cdf0e10cSrcweir protected: 75*cdf0e10cSrcweir virtual void SAL_CALL onShot (void); 76*cdf0e10cSrcweir 77*cdf0e10cSrcweir private: 78*cdf0e10cSrcweir ::rtl::Reference<PresenterClock> mpClock; 79*cdf0e10cSrcweir }; 80*cdf0e10cSrcweir 81*cdf0e10cSrcweir 82*cdf0e10cSrcweir 83*cdf0e10cSrcweir 84*cdf0e10cSrcweir namespace { 85*cdf0e10cSrcweir bool GetDateTime (oslDateTime& rDateTime); 86*cdf0e10cSrcweir 87*cdf0e10cSrcweir class BitmapDescriptor 88*cdf0e10cSrcweir { 89*cdf0e10cSrcweir public: 90*cdf0e10cSrcweir Reference<rendering::XBitmap> mxBitmap; 91*cdf0e10cSrcweir awt::Point maOffset; 92*cdf0e10cSrcweir Reference<rendering::XBitmap> mxScaledBitmap; 93*cdf0e10cSrcweir geometry::RealPoint2D maScaledOffset; 94*cdf0e10cSrcweir }; 95*cdf0e10cSrcweir } 96*cdf0e10cSrcweir 97*cdf0e10cSrcweir 98*cdf0e10cSrcweir 99*cdf0e10cSrcweir 100*cdf0e10cSrcweir class PresenterClock::Painter 101*cdf0e10cSrcweir { 102*cdf0e10cSrcweir public: 103*cdf0e10cSrcweir virtual void Paint ( 104*cdf0e10cSrcweir const Reference<rendering::XCanvas>& rxCanvas, 105*cdf0e10cSrcweir const rendering::ViewState& rViewState, 106*cdf0e10cSrcweir const rendering::RenderState& rRenderState, 107*cdf0e10cSrcweir const util::Color& rBackgroundColor, 108*cdf0e10cSrcweir const sal_Int32 nHour, 109*cdf0e10cSrcweir const sal_Int32 nMinute, 110*cdf0e10cSrcweir const sal_Int32 nSecond, 111*cdf0e10cSrcweir const bool bShowSeconds) = 0; 112*cdf0e10cSrcweir virtual void Resize (const awt::Size& rSize) = 0; 113*cdf0e10cSrcweir }; 114*cdf0e10cSrcweir 115*cdf0e10cSrcweir 116*cdf0e10cSrcweir 117*cdf0e10cSrcweir 118*cdf0e10cSrcweir namespace { 119*cdf0e10cSrcweir class AnalogDefaultPainter : public PresenterClock::Painter 120*cdf0e10cSrcweir { 121*cdf0e10cSrcweir public: 122*cdf0e10cSrcweir AnalogDefaultPainter (void); 123*cdf0e10cSrcweir virtual ~AnalogDefaultPainter (void) {} 124*cdf0e10cSrcweir virtual void Paint ( 125*cdf0e10cSrcweir const Reference<rendering::XCanvas>& rxCanvas, 126*cdf0e10cSrcweir const rendering::ViewState& rViewState, 127*cdf0e10cSrcweir const rendering::RenderState& rRenderState, 128*cdf0e10cSrcweir const util::Color& rBackgroundColor, 129*cdf0e10cSrcweir const sal_Int32 nHour, 130*cdf0e10cSrcweir const sal_Int32 nMinute, 131*cdf0e10cSrcweir const sal_Int32 nSecond, 132*cdf0e10cSrcweir const bool bShowSeconds); 133*cdf0e10cSrcweir virtual void Resize (const awt::Size& rSize); 134*cdf0e10cSrcweir private: 135*cdf0e10cSrcweir geometry::RealPoint2D maCenter; 136*cdf0e10cSrcweir double mnOuterRadius; 137*cdf0e10cSrcweir awt::Size maSize; 138*cdf0e10cSrcweir Reference<rendering::XBitmap> mxBitmap; 139*cdf0e10cSrcweir 140*cdf0e10cSrcweir /** Relative length (with respect to radius) from center to the tip of 141*cdf0e10cSrcweir the hand. 142*cdf0e10cSrcweir */ 143*cdf0e10cSrcweir static const double mnRelativeHourHandLength; 144*cdf0e10cSrcweir /** Relative length (with respect to radius) from center to the 145*cdf0e10cSrcweir oposing end of the tip of the hand. 146*cdf0e10cSrcweir */ 147*cdf0e10cSrcweir static const double mnRelativeHourHandLength2; 148*cdf0e10cSrcweir static const double mnRelativeHourHandWidth; 149*cdf0e10cSrcweir static const double mnRelativeMinuteHandLength; 150*cdf0e10cSrcweir static const double mnRelativeMinuteHandLength2; 151*cdf0e10cSrcweir static const double mnRelativeMinuteHandWidth; 152*cdf0e10cSrcweir static const double mnRelativeSecondHandLength; 153*cdf0e10cSrcweir static const double mnRelativeSecondHandLength2; 154*cdf0e10cSrcweir static const double mnRelativeSecondHandWidth; 155*cdf0e10cSrcweir 156*cdf0e10cSrcweir void PaintAngledLine ( 157*cdf0e10cSrcweir const double nAngle, 158*cdf0e10cSrcweir const double nInnerRadius, 159*cdf0e10cSrcweir const double nOuterRadius, 160*cdf0e10cSrcweir const double nStrokeWidth, 161*cdf0e10cSrcweir const Reference<rendering::XCanvas>& rxCanvas, 162*cdf0e10cSrcweir const rendering::ViewState& rViewState, 163*cdf0e10cSrcweir const rendering::RenderState& rRenderState); 164*cdf0e10cSrcweir }; 165*cdf0e10cSrcweir 166*cdf0e10cSrcweir 167*cdf0e10cSrcweir class AnalogBitmapPainter : public PresenterClock::Painter 168*cdf0e10cSrcweir { 169*cdf0e10cSrcweir public: 170*cdf0e10cSrcweir AnalogBitmapPainter( 171*cdf0e10cSrcweir const Reference<XComponentContext>& rxContext, 172*cdf0e10cSrcweir const OUString& rsThemeName); 173*cdf0e10cSrcweir virtual ~AnalogBitmapPainter (void) {} 174*cdf0e10cSrcweir virtual void Paint ( 175*cdf0e10cSrcweir const Reference<rendering::XCanvas>& rxCanvas, 176*cdf0e10cSrcweir const rendering::ViewState& rViewState, 177*cdf0e10cSrcweir const rendering::RenderState& rRenderState, 178*cdf0e10cSrcweir const util::Color& rBackgroundColor, 179*cdf0e10cSrcweir const sal_Int32 nHour, 180*cdf0e10cSrcweir const sal_Int32 nMinute, 181*cdf0e10cSrcweir const sal_Int32 nSecond, 182*cdf0e10cSrcweir const bool bShowSeconds); 183*cdf0e10cSrcweir virtual void Resize (const awt::Size& rSize); 184*cdf0e10cSrcweir private: 185*cdf0e10cSrcweir css::uno::Reference<css::uno::XComponentContext> mxComponentContext; 186*cdf0e10cSrcweir const OUString msThemeName; 187*cdf0e10cSrcweir bool mbThemeLoaded; 188*cdf0e10cSrcweir bool mbThemeLoadingFailed; 189*cdf0e10cSrcweir geometry::RealPoint2D maCenter; 190*cdf0e10cSrcweir double mnOuterRadius; 191*cdf0e10cSrcweir BitmapDescriptor maFace; 192*cdf0e10cSrcweir BitmapDescriptor maMinuteHand; 193*cdf0e10cSrcweir BitmapDescriptor maHourHand; 194*cdf0e10cSrcweir 195*cdf0e10cSrcweir void PrepareBitmaps (const Reference<rendering::XCanvas>& rxCanvas); 196*cdf0e10cSrcweir Reference<container::XNameAccess> GetTheme ( 197*cdf0e10cSrcweir PresenterConfigurationAccess& rConfiguration); 198*cdf0e10cSrcweir bool ThemeNameComparator ( 199*cdf0e10cSrcweir const ::rtl::OUString& rsKey, 200*cdf0e10cSrcweir const Reference<container::XNameAccess>& rxCandidate, 201*cdf0e10cSrcweir const ::rtl::OUString& rsCurrentThemeName); 202*cdf0e10cSrcweir void LoadBitmaps ( 203*cdf0e10cSrcweir PresenterConfigurationAccess& rConfiguration, 204*cdf0e10cSrcweir const Reference<container::XNameAccess>& rxNameAccess, 205*cdf0e10cSrcweir const Reference<rendering::XCanvas>& rxCanvas); 206*cdf0e10cSrcweir void LoadBitmap ( 207*cdf0e10cSrcweir const OUString& rsKey, 208*cdf0e10cSrcweir const ::std::vector<Any>& rValues, 209*cdf0e10cSrcweir const OUString& rsBitmapPath, 210*cdf0e10cSrcweir const Reference<container::XNameAccess>& rxBitmapLoader); 211*cdf0e10cSrcweir void ScaleBitmaps (void); 212*cdf0e10cSrcweir }; 213*cdf0e10cSrcweir 214*cdf0e10cSrcweir 215*cdf0e10cSrcweir class DigitalDefaultPainter : public PresenterClock::Painter 216*cdf0e10cSrcweir { 217*cdf0e10cSrcweir public: 218*cdf0e10cSrcweir DigitalDefaultPainter ( 219*cdf0e10cSrcweir const ::rtl::Reference<PresenterController>& rpPresenterController, 220*cdf0e10cSrcweir const Reference<XResourceId>& rxViewId); 221*cdf0e10cSrcweir virtual ~DigitalDefaultPainter (void); 222*cdf0e10cSrcweir 223*cdf0e10cSrcweir virtual void Paint ( 224*cdf0e10cSrcweir const Reference<rendering::XCanvas>& rxCanvas, 225*cdf0e10cSrcweir const rendering::ViewState& rViewState, 226*cdf0e10cSrcweir const rendering::RenderState& rRenderState, 227*cdf0e10cSrcweir const util::Color& rBackgroundColor, 228*cdf0e10cSrcweir const sal_Int32 nHour, 229*cdf0e10cSrcweir const sal_Int32 nMinute, 230*cdf0e10cSrcweir const sal_Int32 nSecond, 231*cdf0e10cSrcweir const bool bShowSeconds); 232*cdf0e10cSrcweir virtual void Resize (const awt::Size& rSize); 233*cdf0e10cSrcweir 234*cdf0e10cSrcweir private: 235*cdf0e10cSrcweir ::rtl::Reference<PresenterController> mpPresenterController; 236*cdf0e10cSrcweir bool mbIs24HourFormat; 237*cdf0e10cSrcweir bool mbIsAdaptFontSize; 238*cdf0e10cSrcweir Reference<rendering::XCanvasFont> mxFont; 239*cdf0e10cSrcweir awt::Size maWindowSize; 240*cdf0e10cSrcweir OUString msViewURL; 241*cdf0e10cSrcweir 242*cdf0e10cSrcweir void CreateFont ( 243*cdf0e10cSrcweir const Reference<rendering::XCanvas>& rxCanvas, 244*cdf0e10cSrcweir const bool bIsShowSeconds); 245*cdf0e10cSrcweir }; 246*cdf0e10cSrcweir 247*cdf0e10cSrcweir 248*cdf0e10cSrcweir } // end of anonymous namespace 249*cdf0e10cSrcweir 250*cdf0e10cSrcweir 251*cdf0e10cSrcweir 252*cdf0e10cSrcweir 253*cdf0e10cSrcweir //===== PresenterClock ================================================================= 254*cdf0e10cSrcweir 255*cdf0e10cSrcweir ::rtl::Reference<PresenterClock> PresenterClock::Create ( 256*cdf0e10cSrcweir const Reference<XComponentContext>& rxContext, 257*cdf0e10cSrcweir const Reference<XResourceId>& rxViewId, 258*cdf0e10cSrcweir const Reference<frame::XController>& rxController, 259*cdf0e10cSrcweir const ::rtl::Reference<PresenterController>& rpPresenterController) 260*cdf0e10cSrcweir { 261*cdf0e10cSrcweir ::rtl::Reference<PresenterClock> pClock (new PresenterClock( 262*cdf0e10cSrcweir rxContext, 263*cdf0e10cSrcweir rxViewId, 264*cdf0e10cSrcweir rxController, 265*cdf0e10cSrcweir rpPresenterController)); 266*cdf0e10cSrcweir pClock->LateInit(); 267*cdf0e10cSrcweir return pClock; 268*cdf0e10cSrcweir } 269*cdf0e10cSrcweir 270*cdf0e10cSrcweir 271*cdf0e10cSrcweir 272*cdf0e10cSrcweir 273*cdf0e10cSrcweir PresenterClock::PresenterClock ( 274*cdf0e10cSrcweir const Reference<XComponentContext>& rxContext, 275*cdf0e10cSrcweir const Reference<XResourceId>& rxViewId, 276*cdf0e10cSrcweir const Reference<frame::XController>& rxController, 277*cdf0e10cSrcweir const ::rtl::Reference<PresenterController>& rpPresenterController) 278*cdf0e10cSrcweir : PresenterClockInterfaceBase(m_aMutex), 279*cdf0e10cSrcweir mxComponentContext(rxContext), 280*cdf0e10cSrcweir mxViewId(rxViewId), 281*cdf0e10cSrcweir mxWindow(), 282*cdf0e10cSrcweir mxCanvas(), 283*cdf0e10cSrcweir mxPane(), 284*cdf0e10cSrcweir mpPresenterController(rpPresenterController), 285*cdf0e10cSrcweir mbIsResizePending(true), 286*cdf0e10cSrcweir maViewState(), 287*cdf0e10cSrcweir maRenderState(), 288*cdf0e10cSrcweir mpTimer(), 289*cdf0e10cSrcweir mpClockPainter(), 290*cdf0e10cSrcweir mpClockPainter2(), 291*cdf0e10cSrcweir mnMode(1), 292*cdf0e10cSrcweir mnHour(-1), 293*cdf0e10cSrcweir mnMinute(-1), 294*cdf0e10cSrcweir mnSecond(-1), 295*cdf0e10cSrcweir mbIsShowSeconds(true) 296*cdf0e10cSrcweir { 297*cdf0e10cSrcweir SetMode(mnMode); 298*cdf0e10cSrcweir 299*cdf0e10cSrcweir maViewState.AffineTransform = geometry::AffineMatrix2D(1,0,0, 0,1,0); 300*cdf0e10cSrcweir maRenderState.AffineTransform = geometry::AffineMatrix2D(1,0,0, 0,1,0); 301*cdf0e10cSrcweir maRenderState.DeviceColor = Sequence<double>(4); 302*cdf0e10cSrcweir PresenterCanvasHelper::SetDeviceColor(maRenderState, util::Color(0x00000000)); 303*cdf0e10cSrcweir 304*cdf0e10cSrcweir try 305*cdf0e10cSrcweir { 306*cdf0e10cSrcweir 307*cdf0e10cSrcweir Reference<XControllerManager> xCM (rxController, UNO_QUERY_THROW); 308*cdf0e10cSrcweir Reference<XConfigurationController> xCC (xCM->getConfigurationController(), UNO_QUERY_THROW); 309*cdf0e10cSrcweir mxPane = Reference<XPane>(xCC->getResource(rxViewId->getAnchor()), UNO_QUERY_THROW); 310*cdf0e10cSrcweir 311*cdf0e10cSrcweir mxWindow = mxPane->getWindow(); 312*cdf0e10cSrcweir if (mxWindow.is()) 313*cdf0e10cSrcweir { 314*cdf0e10cSrcweir mxWindow->addPaintListener(this); 315*cdf0e10cSrcweir mxWindow->addWindowListener(this); 316*cdf0e10cSrcweir mxWindow->addMouseListener(this); 317*cdf0e10cSrcweir Reference<awt::XWindowPeer> xPeer (mxWindow, UNO_QUERY); 318*cdf0e10cSrcweir if (xPeer.is()) 319*cdf0e10cSrcweir xPeer->setBackground(util::Color(0xff000000)); 320*cdf0e10cSrcweir mxWindow->setVisible(sal_True); 321*cdf0e10cSrcweir } 322*cdf0e10cSrcweir 323*cdf0e10cSrcweir Resize(); 324*cdf0e10cSrcweir } 325*cdf0e10cSrcweir catch (RuntimeException&) 326*cdf0e10cSrcweir { 327*cdf0e10cSrcweir disposing(); 328*cdf0e10cSrcweir throw; 329*cdf0e10cSrcweir } 330*cdf0e10cSrcweir } 331*cdf0e10cSrcweir 332*cdf0e10cSrcweir 333*cdf0e10cSrcweir 334*cdf0e10cSrcweir 335*cdf0e10cSrcweir PresenterClock::~PresenterClock (void) 336*cdf0e10cSrcweir { 337*cdf0e10cSrcweir } 338*cdf0e10cSrcweir 339*cdf0e10cSrcweir 340*cdf0e10cSrcweir 341*cdf0e10cSrcweir 342*cdf0e10cSrcweir void PresenterClock::LateInit (void) 343*cdf0e10cSrcweir { 344*cdf0e10cSrcweir mpTimer = new Timer(this); 345*cdf0e10cSrcweir } 346*cdf0e10cSrcweir 347*cdf0e10cSrcweir 348*cdf0e10cSrcweir 349*cdf0e10cSrcweir 350*cdf0e10cSrcweir void SAL_CALL PresenterClock::disposing (void) 351*cdf0e10cSrcweir { 352*cdf0e10cSrcweir // osl::MutexGuard aGuard (m_aMutex); 353*cdf0e10cSrcweir if (mpTimer != NULL) 354*cdf0e10cSrcweir { 355*cdf0e10cSrcweir mpTimer->Stop(); 356*cdf0e10cSrcweir } 357*cdf0e10cSrcweir if (mxWindow.is()) 358*cdf0e10cSrcweir { 359*cdf0e10cSrcweir mxWindow->removePaintListener(this); 360*cdf0e10cSrcweir mxWindow->removeWindowListener(this); 361*cdf0e10cSrcweir mxWindow->removeMouseListener(this); 362*cdf0e10cSrcweir mxWindow = NULL; 363*cdf0e10cSrcweir } 364*cdf0e10cSrcweir mxCanvas = NULL; 365*cdf0e10cSrcweir mxViewId = NULL; 366*cdf0e10cSrcweir } 367*cdf0e10cSrcweir 368*cdf0e10cSrcweir 369*cdf0e10cSrcweir 370*cdf0e10cSrcweir 371*cdf0e10cSrcweir void PresenterClock::UpdateTime (void) 372*cdf0e10cSrcweir { 373*cdf0e10cSrcweir // Get current time and check whether it is different from last time. 374*cdf0e10cSrcweir oslDateTime aDateTime; 375*cdf0e10cSrcweir if ( ! GetDateTime(aDateTime)) 376*cdf0e10cSrcweir return; 377*cdf0e10cSrcweir if (aDateTime.Hours != mnHour 378*cdf0e10cSrcweir || aDateTime.Minutes != mnMinute 379*cdf0e10cSrcweir || aDateTime.Seconds != mnSecond) 380*cdf0e10cSrcweir { 381*cdf0e10cSrcweir mnHour = aDateTime.Hours % 24; 382*cdf0e10cSrcweir mnMinute = aDateTime.Minutes % 60; 383*cdf0e10cSrcweir mnSecond = aDateTime.Seconds % 60; 384*cdf0e10cSrcweir 385*cdf0e10cSrcweir Reference<awt::XWindowPeer> xPeer (mxWindow, UNO_QUERY); 386*cdf0e10cSrcweir if (xPeer.is()) 387*cdf0e10cSrcweir xPeer->invalidate(awt::InvalidateStyle::NOERASE | 388*cdf0e10cSrcweir awt::InvalidateStyle::UPDATE); 389*cdf0e10cSrcweir } 390*cdf0e10cSrcweir } 391*cdf0e10cSrcweir 392*cdf0e10cSrcweir 393*cdf0e10cSrcweir 394*cdf0e10cSrcweir 395*cdf0e10cSrcweir //----- lang::XEventListener ------------------------------------------------- 396*cdf0e10cSrcweir 397*cdf0e10cSrcweir void SAL_CALL PresenterClock::disposing (const lang::EventObject& rEventObject) 398*cdf0e10cSrcweir throw (RuntimeException) 399*cdf0e10cSrcweir { 400*cdf0e10cSrcweir // ::osl::MutexGuard aSolarGuard (::osl::Mutex::getGlobalMutex()); 401*cdf0e10cSrcweir // osl::MutexGuard aGuard (m_aMutex); 402*cdf0e10cSrcweir 403*cdf0e10cSrcweir if (rEventObject.Source == mxWindow) 404*cdf0e10cSrcweir { 405*cdf0e10cSrcweir mxWindow = NULL; 406*cdf0e10cSrcweir if (mpTimer != NULL) 407*cdf0e10cSrcweir mpTimer->Stop(); 408*cdf0e10cSrcweir } 409*cdf0e10cSrcweir } 410*cdf0e10cSrcweir 411*cdf0e10cSrcweir 412*cdf0e10cSrcweir 413*cdf0e10cSrcweir 414*cdf0e10cSrcweir //----- XPaintListener -------------------------------------------------------- 415*cdf0e10cSrcweir 416*cdf0e10cSrcweir void SAL_CALL PresenterClock::windowPaint (const awt::PaintEvent& rEvent) 417*cdf0e10cSrcweir throw (RuntimeException) 418*cdf0e10cSrcweir { 419*cdf0e10cSrcweir (void)rEvent; 420*cdf0e10cSrcweir ThrowIfDisposed(); 421*cdf0e10cSrcweir ::osl::MutexGuard aSolarGuard (::osl::Mutex::getGlobalMutex()); 422*cdf0e10cSrcweir Paint(rEvent.UpdateRect); 423*cdf0e10cSrcweir } 424*cdf0e10cSrcweir 425*cdf0e10cSrcweir 426*cdf0e10cSrcweir 427*cdf0e10cSrcweir 428*cdf0e10cSrcweir //----- XWindowListener ------------------------------------------------------- 429*cdf0e10cSrcweir 430*cdf0e10cSrcweir void SAL_CALL PresenterClock::windowResized (const awt::WindowEvent& rEvent) 431*cdf0e10cSrcweir throw (RuntimeException) 432*cdf0e10cSrcweir { 433*cdf0e10cSrcweir (void)rEvent; 434*cdf0e10cSrcweir mbIsResizePending = true; 435*cdf0e10cSrcweir } 436*cdf0e10cSrcweir 437*cdf0e10cSrcweir 438*cdf0e10cSrcweir 439*cdf0e10cSrcweir 440*cdf0e10cSrcweir void SAL_CALL PresenterClock::windowMoved (const awt::WindowEvent& rEvent) 441*cdf0e10cSrcweir throw (RuntimeException) 442*cdf0e10cSrcweir { 443*cdf0e10cSrcweir (void)rEvent; 444*cdf0e10cSrcweir mbIsResizePending = true; 445*cdf0e10cSrcweir } 446*cdf0e10cSrcweir 447*cdf0e10cSrcweir 448*cdf0e10cSrcweir 449*cdf0e10cSrcweir 450*cdf0e10cSrcweir void SAL_CALL PresenterClock::windowShown (const lang::EventObject& rEvent) 451*cdf0e10cSrcweir throw (RuntimeException) 452*cdf0e10cSrcweir { 453*cdf0e10cSrcweir (void)rEvent; 454*cdf0e10cSrcweir mbIsResizePending = true; 455*cdf0e10cSrcweir } 456*cdf0e10cSrcweir 457*cdf0e10cSrcweir 458*cdf0e10cSrcweir 459*cdf0e10cSrcweir 460*cdf0e10cSrcweir void SAL_CALL PresenterClock::windowHidden (const lang::EventObject& rEvent) 461*cdf0e10cSrcweir throw (RuntimeException) 462*cdf0e10cSrcweir { 463*cdf0e10cSrcweir (void)rEvent; 464*cdf0e10cSrcweir } 465*cdf0e10cSrcweir 466*cdf0e10cSrcweir 467*cdf0e10cSrcweir 468*cdf0e10cSrcweir 469*cdf0e10cSrcweir //----- XMouseListener -------------------------------------------------------- 470*cdf0e10cSrcweir 471*cdf0e10cSrcweir void SAL_CALL PresenterClock::mousePressed (const css::awt::MouseEvent& rEvent) 472*cdf0e10cSrcweir throw (css::uno::RuntimeException) 473*cdf0e10cSrcweir { 474*cdf0e10cSrcweir (void)rEvent; 475*cdf0e10cSrcweir if (rEvent.Buttons == awt::MouseButton::LEFT) 476*cdf0e10cSrcweir { 477*cdf0e10cSrcweir SetMode(mnMode+1); 478*cdf0e10cSrcweir } 479*cdf0e10cSrcweir } 480*cdf0e10cSrcweir 481*cdf0e10cSrcweir 482*cdf0e10cSrcweir 483*cdf0e10cSrcweir 484*cdf0e10cSrcweir void SAL_CALL PresenterClock::mouseReleased (const css::awt::MouseEvent& rEvent) 485*cdf0e10cSrcweir throw (css::uno::RuntimeException) 486*cdf0e10cSrcweir { 487*cdf0e10cSrcweir (void)rEvent; 488*cdf0e10cSrcweir } 489*cdf0e10cSrcweir 490*cdf0e10cSrcweir 491*cdf0e10cSrcweir 492*cdf0e10cSrcweir 493*cdf0e10cSrcweir void SAL_CALL PresenterClock::mouseEntered (const css::awt::MouseEvent& rEvent) 494*cdf0e10cSrcweir throw (css::uno::RuntimeException) 495*cdf0e10cSrcweir { 496*cdf0e10cSrcweir (void)rEvent; 497*cdf0e10cSrcweir } 498*cdf0e10cSrcweir 499*cdf0e10cSrcweir 500*cdf0e10cSrcweir 501*cdf0e10cSrcweir 502*cdf0e10cSrcweir void SAL_CALL PresenterClock::mouseExited (const css::awt::MouseEvent& rEvent) 503*cdf0e10cSrcweir throw (css::uno::RuntimeException) 504*cdf0e10cSrcweir { 505*cdf0e10cSrcweir (void)rEvent; 506*cdf0e10cSrcweir } 507*cdf0e10cSrcweir 508*cdf0e10cSrcweir 509*cdf0e10cSrcweir 510*cdf0e10cSrcweir 511*cdf0e10cSrcweir //----- XResourceId ----------------------------------------------------------- 512*cdf0e10cSrcweir 513*cdf0e10cSrcweir Reference<XResourceId> SAL_CALL PresenterClock::getResourceId (void) 514*cdf0e10cSrcweir throw (RuntimeException) 515*cdf0e10cSrcweir { 516*cdf0e10cSrcweir return mxViewId; 517*cdf0e10cSrcweir } 518*cdf0e10cSrcweir 519*cdf0e10cSrcweir 520*cdf0e10cSrcweir 521*cdf0e10cSrcweir 522*cdf0e10cSrcweir sal_Bool SAL_CALL PresenterClock::isAnchorOnly (void) 523*cdf0e10cSrcweir throw (RuntimeException) 524*cdf0e10cSrcweir { 525*cdf0e10cSrcweir return false; 526*cdf0e10cSrcweir } 527*cdf0e10cSrcweir 528*cdf0e10cSrcweir 529*cdf0e10cSrcweir 530*cdf0e10cSrcweir 531*cdf0e10cSrcweir //----------------------------------------------------------------------------- 532*cdf0e10cSrcweir 533*cdf0e10cSrcweir void PresenterClock::Resize (void) 534*cdf0e10cSrcweir { 535*cdf0e10cSrcweir if (mxPane.is()) 536*cdf0e10cSrcweir mxCanvas = Reference<rendering::XCanvas>(mxPane->getCanvas(), UNO_QUERY); 537*cdf0e10cSrcweir if (mxWindow.is() && mxCanvas.is()) 538*cdf0e10cSrcweir { 539*cdf0e10cSrcweir const awt::Rectangle aWindowBox (mxWindow->getPosSize()); 540*cdf0e10cSrcweir const awt::Size aWindowSize(aWindowBox.Width,aWindowBox.Height); 541*cdf0e10cSrcweir if (mpClockPainter.get() != NULL) 542*cdf0e10cSrcweir mpClockPainter->Resize(aWindowSize); 543*cdf0e10cSrcweir if (mpClockPainter2.get() != NULL) 544*cdf0e10cSrcweir mpClockPainter2->Resize(aWindowSize); 545*cdf0e10cSrcweir mbIsResizePending = false; 546*cdf0e10cSrcweir } 547*cdf0e10cSrcweir } 548*cdf0e10cSrcweir 549*cdf0e10cSrcweir 550*cdf0e10cSrcweir 551*cdf0e10cSrcweir 552*cdf0e10cSrcweir void PresenterClock::Paint (const awt::Rectangle& rUpdateBox) 553*cdf0e10cSrcweir { 554*cdf0e10cSrcweir if ( ! mxCanvas.is() && mxPane.is()) 555*cdf0e10cSrcweir mxCanvas = Reference<rendering::XCanvas>(mxPane->getCanvas(), UNO_QUERY); 556*cdf0e10cSrcweir if ( ! mxWindow.is() 557*cdf0e10cSrcweir || ! mxCanvas.is() 558*cdf0e10cSrcweir || ! mxCanvas->getDevice().is()) 559*cdf0e10cSrcweir { 560*cdf0e10cSrcweir return; 561*cdf0e10cSrcweir } 562*cdf0e10cSrcweir 563*cdf0e10cSrcweir try 564*cdf0e10cSrcweir { 565*cdf0e10cSrcweir if (mbIsResizePending) 566*cdf0e10cSrcweir Resize(); 567*cdf0e10cSrcweir 568*cdf0e10cSrcweir Reference<rendering::XPolyPolygon2D> xUpdatePolygon ( 569*cdf0e10cSrcweir PresenterGeometryHelper::CreatePolygon(rUpdateBox, mxCanvas->getDevice())); 570*cdf0e10cSrcweir 571*cdf0e10cSrcweir Clear(xUpdatePolygon); 572*cdf0e10cSrcweir 573*cdf0e10cSrcweir if (mpClockPainter.get() != NULL) 574*cdf0e10cSrcweir mpClockPainter->Paint(mxCanvas, 575*cdf0e10cSrcweir maViewState, 576*cdf0e10cSrcweir maRenderState, 577*cdf0e10cSrcweir mpPresenterController->GetViewBackgroundColor(mxViewId->getResourceURL()), 578*cdf0e10cSrcweir mnHour, 579*cdf0e10cSrcweir mnMinute, 580*cdf0e10cSrcweir mnSecond, 581*cdf0e10cSrcweir mbIsShowSeconds); 582*cdf0e10cSrcweir 583*cdf0e10cSrcweir if (mpClockPainter2.get() != NULL) 584*cdf0e10cSrcweir mpClockPainter2->Paint( 585*cdf0e10cSrcweir mxCanvas, 586*cdf0e10cSrcweir maViewState, 587*cdf0e10cSrcweir maRenderState, 588*cdf0e10cSrcweir mpPresenterController->GetViewBackgroundColor(mxViewId->getResourceURL()), 589*cdf0e10cSrcweir mnHour, 590*cdf0e10cSrcweir mnMinute, 591*cdf0e10cSrcweir mnSecond, 592*cdf0e10cSrcweir mbIsShowSeconds); 593*cdf0e10cSrcweir } 594*cdf0e10cSrcweir catch (RuntimeException& e) 595*cdf0e10cSrcweir { 596*cdf0e10cSrcweir (void)e; 597*cdf0e10cSrcweir } 598*cdf0e10cSrcweir 599*cdf0e10cSrcweir // Make the back buffer visible. 600*cdf0e10cSrcweir Reference<rendering::XSpriteCanvas> xSpriteCanvas (mxCanvas, UNO_QUERY); 601*cdf0e10cSrcweir if (xSpriteCanvas.is()) 602*cdf0e10cSrcweir xSpriteCanvas->updateScreen(sal_False); 603*cdf0e10cSrcweir } 604*cdf0e10cSrcweir 605*cdf0e10cSrcweir 606*cdf0e10cSrcweir 607*cdf0e10cSrcweir 608*cdf0e10cSrcweir void PresenterClock::Clear (const Reference<rendering::XPolyPolygon2D>& rxUpdatePolygon) 609*cdf0e10cSrcweir { 610*cdf0e10cSrcweir rendering::RenderState aRenderState = maRenderState; 611*cdf0e10cSrcweir const sal_Int32 nColor ( 612*cdf0e10cSrcweir mpPresenterController->GetViewBackgroundColor(mxViewId->getResourceURL())); 613*cdf0e10cSrcweir aRenderState.DeviceColor[0] = ((nColor&0x00ff0000) >> 16) / 255.0; 614*cdf0e10cSrcweir aRenderState.DeviceColor[1] = ((nColor&0x0000ff00) >> 8) / 255.0; 615*cdf0e10cSrcweir aRenderState.DeviceColor[2] = ((nColor&0x000000ff) >> 0) / 255.0; 616*cdf0e10cSrcweir 617*cdf0e10cSrcweir if (rxUpdatePolygon.is()) 618*cdf0e10cSrcweir mxCanvas->fillPolyPolygon( 619*cdf0e10cSrcweir rxUpdatePolygon, 620*cdf0e10cSrcweir maViewState, 621*cdf0e10cSrcweir aRenderState); 622*cdf0e10cSrcweir } 623*cdf0e10cSrcweir 624*cdf0e10cSrcweir 625*cdf0e10cSrcweir 626*cdf0e10cSrcweir 627*cdf0e10cSrcweir void PresenterClock::SetMode (const sal_Int32 nMode) 628*cdf0e10cSrcweir { 629*cdf0e10cSrcweir mnMode = nMode % 3; 630*cdf0e10cSrcweir 631*cdf0e10cSrcweir switch (mnMode) 632*cdf0e10cSrcweir { 633*cdf0e10cSrcweir case 0: 634*cdf0e10cSrcweir mpClockPainter.reset( 635*cdf0e10cSrcweir new AnalogBitmapPainter( 636*cdf0e10cSrcweir mxComponentContext, 637*cdf0e10cSrcweir OUString::createFromAscii("ClockTheme"))); 638*cdf0e10cSrcweir mpClockPainter2.reset(); 639*cdf0e10cSrcweir break; 640*cdf0e10cSrcweir 641*cdf0e10cSrcweir case 1: 642*cdf0e10cSrcweir mpClockPainter.reset(); 643*cdf0e10cSrcweir mpClockPainter2.reset(new AnalogDefaultPainter()); 644*cdf0e10cSrcweir break; 645*cdf0e10cSrcweir 646*cdf0e10cSrcweir case 2: 647*cdf0e10cSrcweir mpClockPainter.reset(); 648*cdf0e10cSrcweir mpClockPainter2.reset(new DigitalDefaultPainter(mpPresenterController, mxViewId)); 649*cdf0e10cSrcweir break; 650*cdf0e10cSrcweir 651*cdf0e10cSrcweir case 3: 652*cdf0e10cSrcweir mpClockPainter.reset( 653*cdf0e10cSrcweir new AnalogBitmapPainter( 654*cdf0e10cSrcweir mxComponentContext, 655*cdf0e10cSrcweir OUString::createFromAscii("ClockTheme"))); 656*cdf0e10cSrcweir mpClockPainter2.reset(new AnalogDefaultPainter()); 657*cdf0e10cSrcweir break; 658*cdf0e10cSrcweir } 659*cdf0e10cSrcweir Resize(); 660*cdf0e10cSrcweir } 661*cdf0e10cSrcweir 662*cdf0e10cSrcweir 663*cdf0e10cSrcweir 664*cdf0e10cSrcweir 665*cdf0e10cSrcweir void PresenterClock::ThrowIfDisposed (void) 666*cdf0e10cSrcweir throw (::com::sun::star::lang::DisposedException) 667*cdf0e10cSrcweir { 668*cdf0e10cSrcweir if (rBHelper.bDisposed || rBHelper.bInDispose) 669*cdf0e10cSrcweir { 670*cdf0e10cSrcweir throw lang::DisposedException ( 671*cdf0e10cSrcweir ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( 672*cdf0e10cSrcweir "PresenterClock object has already been disposed")), 673*cdf0e10cSrcweir static_cast<uno::XWeak*>(this)); 674*cdf0e10cSrcweir } 675*cdf0e10cSrcweir } 676*cdf0e10cSrcweir 677*cdf0e10cSrcweir 678*cdf0e10cSrcweir 679*cdf0e10cSrcweir 680*cdf0e10cSrcweir //===== Timer ================================================================= 681*cdf0e10cSrcweir 682*cdf0e10cSrcweir PresenterClock::Timer::Timer (const ::rtl::Reference<PresenterClock>& rpClock) 683*cdf0e10cSrcweir : OTimer(vos::TTimeValue(10), vos::TTimeValue(100/*ms*/)), 684*cdf0e10cSrcweir mpClock(rpClock) 685*cdf0e10cSrcweir { 686*cdf0e10cSrcweir acquire(); 687*cdf0e10cSrcweir start(); 688*cdf0e10cSrcweir } 689*cdf0e10cSrcweir 690*cdf0e10cSrcweir 691*cdf0e10cSrcweir 692*cdf0e10cSrcweir 693*cdf0e10cSrcweir PresenterClock::Timer::~Timer (void) 694*cdf0e10cSrcweir { 695*cdf0e10cSrcweir if (mpClock.is()) 696*cdf0e10cSrcweir Stop(); 697*cdf0e10cSrcweir } 698*cdf0e10cSrcweir 699*cdf0e10cSrcweir 700*cdf0e10cSrcweir 701*cdf0e10cSrcweir 702*cdf0e10cSrcweir void PresenterClock::Timer::Stop (void) 703*cdf0e10cSrcweir { 704*cdf0e10cSrcweir mpClock = NULL; 705*cdf0e10cSrcweir stop(); 706*cdf0e10cSrcweir release(); 707*cdf0e10cSrcweir } 708*cdf0e10cSrcweir 709*cdf0e10cSrcweir 710*cdf0e10cSrcweir 711*cdf0e10cSrcweir 712*cdf0e10cSrcweir void SAL_CALL PresenterClock::Timer::onShot (void) 713*cdf0e10cSrcweir { 714*cdf0e10cSrcweir if (mpClock.get() != NULL) 715*cdf0e10cSrcweir mpClock->UpdateTime(); 716*cdf0e10cSrcweir } 717*cdf0e10cSrcweir 718*cdf0e10cSrcweir 719*cdf0e10cSrcweir 720*cdf0e10cSrcweir namespace { 721*cdf0e10cSrcweir 722*cdf0e10cSrcweir //============================================================================= 723*cdf0e10cSrcweir 724*cdf0e10cSrcweir bool GetDateTime (oslDateTime& rDateTime) 725*cdf0e10cSrcweir { 726*cdf0e10cSrcweir TimeValue aSystemTime; 727*cdf0e10cSrcweir TimeValue aLocalTime; 728*cdf0e10cSrcweir if (osl_getSystemTime(&aSystemTime)) 729*cdf0e10cSrcweir if (osl_getLocalTimeFromSystemTime(&aSystemTime, &aLocalTime)) 730*cdf0e10cSrcweir if (osl_getDateTimeFromTimeValue(&aLocalTime, &rDateTime)) 731*cdf0e10cSrcweir return true; 732*cdf0e10cSrcweir return false; 733*cdf0e10cSrcweir } 734*cdf0e10cSrcweir 735*cdf0e10cSrcweir 736*cdf0e10cSrcweir 737*cdf0e10cSrcweir 738*cdf0e10cSrcweir //===== AnalogDefaultPainter ================================================== 739*cdf0e10cSrcweir 740*cdf0e10cSrcweir const double AnalogDefaultPainter::mnRelativeHourHandLength = 0.65; 741*cdf0e10cSrcweir const double AnalogDefaultPainter::mnRelativeHourHandLength2 (-0.1); 742*cdf0e10cSrcweir const double AnalogDefaultPainter::mnRelativeHourHandWidth (0.055); 743*cdf0e10cSrcweir const double AnalogDefaultPainter::mnRelativeMinuteHandLength (-0.2); 744*cdf0e10cSrcweir const double AnalogDefaultPainter::mnRelativeMinuteHandLength2 (0.85); 745*cdf0e10cSrcweir const double AnalogDefaultPainter::mnRelativeMinuteHandWidth (0.025); 746*cdf0e10cSrcweir const double AnalogDefaultPainter::mnRelativeSecondHandLength (-0.25); 747*cdf0e10cSrcweir const double AnalogDefaultPainter::mnRelativeSecondHandLength2 (0.95); 748*cdf0e10cSrcweir const double AnalogDefaultPainter::mnRelativeSecondHandWidth (0.015); 749*cdf0e10cSrcweir 750*cdf0e10cSrcweir AnalogDefaultPainter::AnalogDefaultPainter (void) 751*cdf0e10cSrcweir : maCenter(0,0), 752*cdf0e10cSrcweir mnOuterRadius(0), 753*cdf0e10cSrcweir maSize(0,0), 754*cdf0e10cSrcweir mxBitmap() 755*cdf0e10cSrcweir { 756*cdf0e10cSrcweir } 757*cdf0e10cSrcweir 758*cdf0e10cSrcweir 759*cdf0e10cSrcweir 760*cdf0e10cSrcweir 761*cdf0e10cSrcweir void AnalogDefaultPainter::Paint ( 762*cdf0e10cSrcweir const Reference<rendering::XCanvas>& rxCanvas, 763*cdf0e10cSrcweir const rendering::ViewState& rViewState, 764*cdf0e10cSrcweir const rendering::RenderState& rRenderState, 765*cdf0e10cSrcweir const util::Color& rBackgroundColor, 766*cdf0e10cSrcweir const sal_Int32 nHour, 767*cdf0e10cSrcweir const sal_Int32 nMinute, 768*cdf0e10cSrcweir const sal_Int32 nSecond, 769*cdf0e10cSrcweir const bool bShowSeconds) 770*cdf0e10cSrcweir { 771*cdf0e10cSrcweir double nInnerRadius (0); 772*cdf0e10cSrcweir double nStrokeWidth (0.1); 773*cdf0e10cSrcweir const double nClockSize (2*mnOuterRadius); 774*cdf0e10cSrcweir 775*cdf0e10cSrcweir // Some antialiasing is created by painting into a bitmap twice the 776*cdf0e10cSrcweir // screen size and then scaling it down. 777*cdf0e10cSrcweir const sal_Int32 nSuperSampleFactor (2); 778*cdf0e10cSrcweir if ( ! mxBitmap.is()) 779*cdf0e10cSrcweir { 780*cdf0e10cSrcweir mxBitmap = (rxCanvas->getDevice()->createCompatibleBitmap( 781*cdf0e10cSrcweir geometry::IntegerSize2D( 782*cdf0e10cSrcweir maSize.Width*nSuperSampleFactor, 783*cdf0e10cSrcweir maSize.Height*nSuperSampleFactor))); 784*cdf0e10cSrcweir } 785*cdf0e10cSrcweir Reference<rendering::XCanvas> xBitmapCanvas (mxBitmap, UNO_QUERY); 786*cdf0e10cSrcweir rendering::RenderState aRenderState(rRenderState); 787*cdf0e10cSrcweir aRenderState.AffineTransform.m00 = nSuperSampleFactor; 788*cdf0e10cSrcweir aRenderState.AffineTransform.m11 = nSuperSampleFactor; 789*cdf0e10cSrcweir 790*cdf0e10cSrcweir // Clear the background. 791*cdf0e10cSrcweir aRenderState.DeviceColor[0] = ((rBackgroundColor&0x00ff0000) >> 16) / 255.0; 792*cdf0e10cSrcweir aRenderState.DeviceColor[1] = ((rBackgroundColor&0x0000ff00) >> 8) / 255.0; 793*cdf0e10cSrcweir aRenderState.DeviceColor[2] = ((rBackgroundColor&0x000000ff) >> 0) / 255.0; 794*cdf0e10cSrcweir Reference<rendering::XPolyPolygon2D> xPolygon ( 795*cdf0e10cSrcweir PresenterGeometryHelper::CreatePolygon( 796*cdf0e10cSrcweir awt::Rectangle(0,0,maSize.Width,maSize.Height), 797*cdf0e10cSrcweir xBitmapCanvas->getDevice())); 798*cdf0e10cSrcweir if (xPolygon.is()) 799*cdf0e10cSrcweir xBitmapCanvas->fillPolyPolygon(xPolygon, rViewState, aRenderState); 800*cdf0e10cSrcweir 801*cdf0e10cSrcweir // Clock face and clock hands are painted in black. 802*cdf0e10cSrcweir aRenderState.DeviceColor[0] = 0; 803*cdf0e10cSrcweir aRenderState.DeviceColor[1] = 0; 804*cdf0e10cSrcweir aRenderState.DeviceColor[2] = 0; 805*cdf0e10cSrcweir 806*cdf0e10cSrcweir // Paint the clock face. 807*cdf0e10cSrcweir for (sal_Int32 nHourMark=0; nHourMark<12; ++nHourMark) 808*cdf0e10cSrcweir { 809*cdf0e10cSrcweir if (nHourMark%3 == 0) 810*cdf0e10cSrcweir { 811*cdf0e10cSrcweir nInnerRadius = 0.7 * mnOuterRadius; 812*cdf0e10cSrcweir nStrokeWidth = 0.05 * nClockSize; 813*cdf0e10cSrcweir } 814*cdf0e10cSrcweir else 815*cdf0e10cSrcweir { 816*cdf0e10cSrcweir nInnerRadius = 0.8 * mnOuterRadius; 817*cdf0e10cSrcweir nStrokeWidth = 0.03 * nClockSize; 818*cdf0e10cSrcweir } 819*cdf0e10cSrcweir 820*cdf0e10cSrcweir const double nAngle (nHourMark * 2 * M_PI / 12); 821*cdf0e10cSrcweir PaintAngledLine(nAngle, nInnerRadius, mnOuterRadius, nStrokeWidth, 822*cdf0e10cSrcweir xBitmapCanvas, rViewState, aRenderState); 823*cdf0e10cSrcweir } 824*cdf0e10cSrcweir 825*cdf0e10cSrcweir // Paint the hour hand. 826*cdf0e10cSrcweir const double nHoursAngle (((nHour%12)+nMinute/60.0) * 2 * M_PI / 12); 827*cdf0e10cSrcweir PaintAngledLine(nHoursAngle, 828*cdf0e10cSrcweir mnRelativeHourHandLength2*mnOuterRadius, 829*cdf0e10cSrcweir mnRelativeHourHandLength*mnOuterRadius, 830*cdf0e10cSrcweir mnRelativeHourHandWidth*nClockSize, 831*cdf0e10cSrcweir xBitmapCanvas, rViewState, aRenderState); 832*cdf0e10cSrcweir 833*cdf0e10cSrcweir // Paint the minute hand. 834*cdf0e10cSrcweir const double nMinutesAngle ((nMinute+nSecond/60.0) * 2 * M_PI / 60); 835*cdf0e10cSrcweir PaintAngledLine(nMinutesAngle, 836*cdf0e10cSrcweir mnRelativeMinuteHandLength2*mnOuterRadius, 837*cdf0e10cSrcweir mnRelativeMinuteHandLength*mnOuterRadius, 838*cdf0e10cSrcweir mnRelativeMinuteHandWidth*nClockSize, 839*cdf0e10cSrcweir xBitmapCanvas, rViewState, aRenderState); 840*cdf0e10cSrcweir 841*cdf0e10cSrcweir // Optionally paint the second hand. 842*cdf0e10cSrcweir if (bShowSeconds) 843*cdf0e10cSrcweir { 844*cdf0e10cSrcweir const double nSecondsAngle (nSecond * 2 * M_PI / 60); 845*cdf0e10cSrcweir PaintAngledLine(nSecondsAngle, 846*cdf0e10cSrcweir mnRelativeSecondHandLength2*mnOuterRadius, 847*cdf0e10cSrcweir mnRelativeSecondHandLength*mnOuterRadius, 848*cdf0e10cSrcweir mnRelativeSecondHandWidth*nClockSize, 849*cdf0e10cSrcweir xBitmapCanvas, rViewState, aRenderState); 850*cdf0e10cSrcweir } 851*cdf0e10cSrcweir 852*cdf0e10cSrcweir aRenderState.AffineTransform.m00 = 1.0 / nSuperSampleFactor; 853*cdf0e10cSrcweir aRenderState.AffineTransform.m11 = 1.0 / nSuperSampleFactor; 854*cdf0e10cSrcweir rxCanvas->drawBitmap(mxBitmap,rViewState,aRenderState); 855*cdf0e10cSrcweir } 856*cdf0e10cSrcweir 857*cdf0e10cSrcweir 858*cdf0e10cSrcweir 859*cdf0e10cSrcweir 860*cdf0e10cSrcweir void AnalogDefaultPainter::PaintAngledLine ( 861*cdf0e10cSrcweir const double nAngle, 862*cdf0e10cSrcweir const double nInnerRadius, 863*cdf0e10cSrcweir const double nOuterRadius, 864*cdf0e10cSrcweir const double nStrokeWidth, 865*cdf0e10cSrcweir const Reference<rendering::XCanvas>& rxCanvas, 866*cdf0e10cSrcweir const rendering::ViewState& rViewState, 867*cdf0e10cSrcweir const rendering::RenderState& rRenderState) 868*cdf0e10cSrcweir { 869*cdf0e10cSrcweir if ( ! rxCanvas.is()) 870*cdf0e10cSrcweir return; 871*cdf0e10cSrcweir 872*cdf0e10cSrcweir rendering::StrokeAttributes aStrokeAttributes; 873*cdf0e10cSrcweir aStrokeAttributes.StrokeWidth = nStrokeWidth; 874*cdf0e10cSrcweir aStrokeAttributes.StartCapType = rendering::PathCapType::SQUARE; 875*cdf0e10cSrcweir aStrokeAttributes.EndCapType = rendering::PathCapType::SQUARE; 876*cdf0e10cSrcweir aStrokeAttributes.StartCapType = rendering::PathCapType::BUTT; 877*cdf0e10cSrcweir aStrokeAttributes.EndCapType = rendering::PathCapType::BUTT; 878*cdf0e10cSrcweir const double nCos (cos(nAngle - M_PI/2)); 879*cdf0e10cSrcweir const double nSin (sin(nAngle - M_PI/2)); 880*cdf0e10cSrcweir 881*cdf0e10cSrcweir Sequence<Sequence<geometry::RealPoint2D> > aPoints(1); 882*cdf0e10cSrcweir aPoints[0] = Sequence<geometry::RealPoint2D>(2); 883*cdf0e10cSrcweir aPoints[0][0] = geometry::RealPoint2D( 884*cdf0e10cSrcweir maCenter.X + nInnerRadius*nCos + 0.5, 885*cdf0e10cSrcweir maCenter.Y + nInnerRadius*nSin + 0.5); 886*cdf0e10cSrcweir aPoints[0][1] = geometry::RealPoint2D( 887*cdf0e10cSrcweir maCenter.X + nOuterRadius*nCos + 0.5, 888*cdf0e10cSrcweir maCenter.Y + nOuterRadius*nSin + 0.5); 889*cdf0e10cSrcweir 890*cdf0e10cSrcweir Reference<rendering::XPolyPolygon2D> xLine ( 891*cdf0e10cSrcweir rxCanvas->getDevice()->createCompatibleLinePolyPolygon(aPoints), 892*cdf0e10cSrcweir UNO_QUERY); 893*cdf0e10cSrcweir if ( ! xLine.is()) 894*cdf0e10cSrcweir return; 895*cdf0e10cSrcweir rxCanvas->strokePolyPolygon( 896*cdf0e10cSrcweir xLine, 897*cdf0e10cSrcweir rViewState, 898*cdf0e10cSrcweir rRenderState, 899*cdf0e10cSrcweir aStrokeAttributes); 900*cdf0e10cSrcweir } 901*cdf0e10cSrcweir 902*cdf0e10cSrcweir 903*cdf0e10cSrcweir 904*cdf0e10cSrcweir 905*cdf0e10cSrcweir void AnalogDefaultPainter::Resize (const awt::Size& rWindowSize) 906*cdf0e10cSrcweir { 907*cdf0e10cSrcweir maSize = rWindowSize; 908*cdf0e10cSrcweir maCenter = geometry::RealPoint2D(rWindowSize.Width/2.0, rWindowSize.Height/2.0); 909*cdf0e10cSrcweir mnOuterRadius = ::std::min(rWindowSize.Width, rWindowSize.Height) / 2.0 - 2; 910*cdf0e10cSrcweir mxBitmap = NULL; 911*cdf0e10cSrcweir } 912*cdf0e10cSrcweir 913*cdf0e10cSrcweir 914*cdf0e10cSrcweir 915*cdf0e10cSrcweir 916*cdf0e10cSrcweir //===== AnalogBitmapPainter =================================================== 917*cdf0e10cSrcweir 918*cdf0e10cSrcweir AnalogBitmapPainter::AnalogBitmapPainter ( 919*cdf0e10cSrcweir const Reference<XComponentContext>& rxContext, 920*cdf0e10cSrcweir const OUString& rsThemeName) 921*cdf0e10cSrcweir : mxComponentContext(rxContext), 922*cdf0e10cSrcweir msThemeName(rsThemeName), 923*cdf0e10cSrcweir mbThemeLoaded(false), 924*cdf0e10cSrcweir mbThemeLoadingFailed(false), 925*cdf0e10cSrcweir maCenter(), 926*cdf0e10cSrcweir mnOuterRadius(), 927*cdf0e10cSrcweir maFace(), 928*cdf0e10cSrcweir maMinuteHand(), 929*cdf0e10cSrcweir maHourHand() 930*cdf0e10cSrcweir { 931*cdf0e10cSrcweir } 932*cdf0e10cSrcweir 933*cdf0e10cSrcweir 934*cdf0e10cSrcweir 935*cdf0e10cSrcweir 936*cdf0e10cSrcweir void AnalogBitmapPainter::Paint ( 937*cdf0e10cSrcweir const Reference<rendering::XCanvas>& rxCanvas, 938*cdf0e10cSrcweir const rendering::ViewState& rViewState, 939*cdf0e10cSrcweir const rendering::RenderState& rRenderState, 940*cdf0e10cSrcweir const util::Color& rBackgroundColor, 941*cdf0e10cSrcweir const sal_Int32 nHour, 942*cdf0e10cSrcweir const sal_Int32 nMinute, 943*cdf0e10cSrcweir const sal_Int32 nSecond, 944*cdf0e10cSrcweir const bool bShowSeconds) 945*cdf0e10cSrcweir { 946*cdf0e10cSrcweir (void)rBackgroundColor; 947*cdf0e10cSrcweir (void)nSecond; 948*cdf0e10cSrcweir (void)bShowSeconds; 949*cdf0e10cSrcweir 950*cdf0e10cSrcweir if ( ! rxCanvas.is()) 951*cdf0e10cSrcweir return; 952*cdf0e10cSrcweir 953*cdf0e10cSrcweir rendering::RenderState aRenderState = rRenderState; 954*cdf0e10cSrcweir 955*cdf0e10cSrcweir try 956*cdf0e10cSrcweir { 957*cdf0e10cSrcweir PrepareBitmaps(rxCanvas); 958*cdf0e10cSrcweir 959*cdf0e10cSrcweir if (maFace.mxScaledBitmap.is()) 960*cdf0e10cSrcweir { 961*cdf0e10cSrcweir aRenderState.AffineTransform = geometry::AffineMatrix2D( 962*cdf0e10cSrcweir 1,0, maCenter.X - maFace.maScaledOffset.X, 963*cdf0e10cSrcweir 0,1, maCenter.Y - maFace.maScaledOffset.Y); 964*cdf0e10cSrcweir rxCanvas->drawBitmap(maFace.mxScaledBitmap, rViewState, aRenderState); 965*cdf0e10cSrcweir } 966*cdf0e10cSrcweir 967*cdf0e10cSrcweir if (maMinuteHand.mxScaledBitmap.is()) 968*cdf0e10cSrcweir { 969*cdf0e10cSrcweir const double nMinuteAngle ((nMinute+nSecond/60.0) * 2.0 * M_PI / 60.0); 970*cdf0e10cSrcweir const double nCos (cos(nMinuteAngle - M_PI/2)); 971*cdf0e10cSrcweir const double nSin (sin(nMinuteAngle - M_PI/2)); 972*cdf0e10cSrcweir aRenderState.AffineTransform = geometry::AffineMatrix2D( 973*cdf0e10cSrcweir nCos, 974*cdf0e10cSrcweir -nSin, 975*cdf0e10cSrcweir -maMinuteHand.maScaledOffset.X*nCos 976*cdf0e10cSrcweir + maMinuteHand.maScaledOffset.Y*nSin+maCenter.X, 977*cdf0e10cSrcweir nSin, 978*cdf0e10cSrcweir nCos, 979*cdf0e10cSrcweir -maMinuteHand.maScaledOffset.X*nSin 980*cdf0e10cSrcweir - maMinuteHand.maScaledOffset.Y*nCos+maCenter.Y); 981*cdf0e10cSrcweir rxCanvas->drawBitmap(maMinuteHand.mxScaledBitmap, rViewState, aRenderState); 982*cdf0e10cSrcweir } 983*cdf0e10cSrcweir 984*cdf0e10cSrcweir if (maHourHand.mxScaledBitmap.is()) 985*cdf0e10cSrcweir { 986*cdf0e10cSrcweir const double nHoursAngle ((nHour%12+nMinute/60.0) * 2.0 * M_PI / 12.0); 987*cdf0e10cSrcweir const double nCos (cos(nHoursAngle - M_PI/2)); 988*cdf0e10cSrcweir const double nSin (sin(nHoursAngle - M_PI/2)); 989*cdf0e10cSrcweir aRenderState.AffineTransform = geometry::AffineMatrix2D( 990*cdf0e10cSrcweir nCos, 991*cdf0e10cSrcweir -nSin, 992*cdf0e10cSrcweir -maHourHand.maScaledOffset.X*nCos+maHourHand.maScaledOffset.Y*nSin+maCenter.X, 993*cdf0e10cSrcweir nSin, 994*cdf0e10cSrcweir nCos, 995*cdf0e10cSrcweir -maHourHand.maScaledOffset.X*nSin-maHourHand.maScaledOffset.Y*nCos+maCenter.Y); 996*cdf0e10cSrcweir rxCanvas->drawBitmap(maHourHand.mxScaledBitmap, rViewState, aRenderState); 997*cdf0e10cSrcweir } 998*cdf0e10cSrcweir } 999*cdf0e10cSrcweir catch(beans::UnknownPropertyException&) 1000*cdf0e10cSrcweir { 1001*cdf0e10cSrcweir } 1002*cdf0e10cSrcweir catch(RuntimeException&) 1003*cdf0e10cSrcweir { 1004*cdf0e10cSrcweir } 1005*cdf0e10cSrcweir } 1006*cdf0e10cSrcweir 1007*cdf0e10cSrcweir 1008*cdf0e10cSrcweir 1009*cdf0e10cSrcweir 1010*cdf0e10cSrcweir void AnalogBitmapPainter::Resize (const awt::Size& rWindowSize) 1011*cdf0e10cSrcweir { 1012*cdf0e10cSrcweir maCenter = geometry::RealPoint2D(rWindowSize.Width/2.0, rWindowSize.Height/2.0); 1013*cdf0e10cSrcweir mnOuterRadius = ::std::min(rWindowSize.Width, rWindowSize.Height) / 2.0 - 2; 1014*cdf0e10cSrcweir maFace.mxScaledBitmap = NULL; 1015*cdf0e10cSrcweir maHourHand.mxScaledBitmap = NULL; 1016*cdf0e10cSrcweir maMinuteHand.mxScaledBitmap = NULL; 1017*cdf0e10cSrcweir } 1018*cdf0e10cSrcweir 1019*cdf0e10cSrcweir 1020*cdf0e10cSrcweir 1021*cdf0e10cSrcweir 1022*cdf0e10cSrcweir void AnalogBitmapPainter::PrepareBitmaps (const Reference<rendering::XCanvas>& rxCanvas) 1023*cdf0e10cSrcweir { 1024*cdf0e10cSrcweir if (mbThemeLoadingFailed) 1025*cdf0e10cSrcweir { 1026*cdf0e10cSrcweir // Theme loading has failed previously. Do not try a second time. 1027*cdf0e10cSrcweir return; 1028*cdf0e10cSrcweir } 1029*cdf0e10cSrcweir if ( ! rxCanvas.is()) 1030*cdf0e10cSrcweir { 1031*cdf0e10cSrcweir // No canvas => bitmaps can neither be loaded, transformed into the 1032*cdf0e10cSrcweir // right format, nor can they be painted. 1033*cdf0e10cSrcweir return; 1034*cdf0e10cSrcweir } 1035*cdf0e10cSrcweir 1036*cdf0e10cSrcweir if ( ! mbThemeLoaded) 1037*cdf0e10cSrcweir { 1038*cdf0e10cSrcweir mbThemeLoaded = true; 1039*cdf0e10cSrcweir 1040*cdf0e10cSrcweir // Get access to the clock bitmaps in the configuration. 1041*cdf0e10cSrcweir PresenterConfigurationAccess aConfiguration ( 1042*cdf0e10cSrcweir mxComponentContext, 1043*cdf0e10cSrcweir OUString::createFromAscii("org.openoffice.Office.extension.PresenterScreen"), 1044*cdf0e10cSrcweir PresenterConfigurationAccess::READ_ONLY); 1045*cdf0e10cSrcweir 1046*cdf0e10cSrcweir Reference<container::XNameAccess> xTheme (GetTheme(aConfiguration)); 1047*cdf0e10cSrcweir if (xTheme.is()) 1048*cdf0e10cSrcweir LoadBitmaps(aConfiguration, xTheme, rxCanvas); 1049*cdf0e10cSrcweir else 1050*cdf0e10cSrcweir mbThemeLoadingFailed = true; 1051*cdf0e10cSrcweir } 1052*cdf0e10cSrcweir 1053*cdf0e10cSrcweir ScaleBitmaps(); 1054*cdf0e10cSrcweir } 1055*cdf0e10cSrcweir 1056*cdf0e10cSrcweir 1057*cdf0e10cSrcweir 1058*cdf0e10cSrcweir 1059*cdf0e10cSrcweir Reference<container::XNameAccess> AnalogBitmapPainter::GetTheme ( 1060*cdf0e10cSrcweir PresenterConfigurationAccess& rConfiguration) 1061*cdf0e10cSrcweir { 1062*cdf0e10cSrcweir Reference<container::XNameAccess> xTheme; 1063*cdf0e10cSrcweir 1064*cdf0e10cSrcweir // Get root of clock themes. 1065*cdf0e10cSrcweir Reference<container::XHierarchicalNameAccess> xClock ( 1066*cdf0e10cSrcweir rConfiguration.GetConfigurationNode( 1067*cdf0e10cSrcweir OUString::createFromAscii("PresenterScreenSettings/AnalogBitmapClock")), 1068*cdf0e10cSrcweir UNO_QUERY); 1069*cdf0e10cSrcweir 1070*cdf0e10cSrcweir // Determine the name of the theme to use. 1071*cdf0e10cSrcweir OUString sCurrentThemeName (OUString::createFromAscii("DefaultTheme")); 1072*cdf0e10cSrcweir rConfiguration.GetConfigurationNode( 1073*cdf0e10cSrcweir xClock, 1074*cdf0e10cSrcweir OUString::createFromAscii("CurrentTheme")) >>= sCurrentThemeName; 1075*cdf0e10cSrcweir 1076*cdf0e10cSrcweir // Load the clock theme. 1077*cdf0e10cSrcweir Reference<container::XNameAccess> xThemes ( 1078*cdf0e10cSrcweir rConfiguration.GetConfigurationNode( 1079*cdf0e10cSrcweir xClock, 1080*cdf0e10cSrcweir OUString::createFromAscii("Themes")), 1081*cdf0e10cSrcweir UNO_QUERY); 1082*cdf0e10cSrcweir if (xThemes.is()) 1083*cdf0e10cSrcweir { 1084*cdf0e10cSrcweir xTheme = Reference<container::XNameAccess>( 1085*cdf0e10cSrcweir PresenterConfigurationAccess::Find( 1086*cdf0e10cSrcweir xThemes, 1087*cdf0e10cSrcweir ::boost::bind(&AnalogBitmapPainter::ThemeNameComparator, 1088*cdf0e10cSrcweir this, _1, _2, sCurrentThemeName)), 1089*cdf0e10cSrcweir UNO_QUERY); 1090*cdf0e10cSrcweir } 1091*cdf0e10cSrcweir 1092*cdf0e10cSrcweir return xTheme; 1093*cdf0e10cSrcweir } 1094*cdf0e10cSrcweir 1095*cdf0e10cSrcweir 1096*cdf0e10cSrcweir 1097*cdf0e10cSrcweir 1098*cdf0e10cSrcweir bool AnalogBitmapPainter::ThemeNameComparator ( 1099*cdf0e10cSrcweir const OUString& rsKey, 1100*cdf0e10cSrcweir const Reference<container::XNameAccess>& rxCandidate, 1101*cdf0e10cSrcweir const OUString& rsCurrentThemeName) 1102*cdf0e10cSrcweir { 1103*cdf0e10cSrcweir (void)rsKey; 1104*cdf0e10cSrcweir if (rxCandidate.is()) 1105*cdf0e10cSrcweir { 1106*cdf0e10cSrcweir OUString sThemeName; 1107*cdf0e10cSrcweir if (rxCandidate->getByName(OUString::createFromAscii("ThemeName")) >>= sThemeName) 1108*cdf0e10cSrcweir { 1109*cdf0e10cSrcweir return sThemeName == rsCurrentThemeName; 1110*cdf0e10cSrcweir } 1111*cdf0e10cSrcweir } 1112*cdf0e10cSrcweir return false; 1113*cdf0e10cSrcweir } 1114*cdf0e10cSrcweir 1115*cdf0e10cSrcweir 1116*cdf0e10cSrcweir 1117*cdf0e10cSrcweir 1118*cdf0e10cSrcweir 1119*cdf0e10cSrcweir void AnalogBitmapPainter::LoadBitmaps ( 1120*cdf0e10cSrcweir PresenterConfigurationAccess& rConfiguration, 1121*cdf0e10cSrcweir const Reference<container::XNameAccess>& rxClockTheme, 1122*cdf0e10cSrcweir const Reference<rendering::XCanvas>& rxCanvas) 1123*cdf0e10cSrcweir { 1124*cdf0e10cSrcweir (void)rConfiguration; 1125*cdf0e10cSrcweir 1126*cdf0e10cSrcweir // Get base path to bitmaps. 1127*cdf0e10cSrcweir Reference<deployment::XPackageInformationProvider> xInformationProvider ( 1128*cdf0e10cSrcweir mxComponentContext->getValueByName(OUString::createFromAscii( 1129*cdf0e10cSrcweir "/singletons/com.sun.star.deployment.PackageInformationProvider")), 1130*cdf0e10cSrcweir UNO_QUERY); 1131*cdf0e10cSrcweir OUString sLocation; 1132*cdf0e10cSrcweir if (xInformationProvider.is()) 1133*cdf0e10cSrcweir sLocation = xInformationProvider->getPackageLocation(gsExtensionIdentifier); 1134*cdf0e10cSrcweir sLocation += OUString::createFromAscii("/"); 1135*cdf0e10cSrcweir 1136*cdf0e10cSrcweir // Create the bitmap loader. 1137*cdf0e10cSrcweir Reference<lang::XMultiComponentFactory> xFactory ( 1138*cdf0e10cSrcweir mxComponentContext->getServiceManager(), UNO_QUERY); 1139*cdf0e10cSrcweir if ( ! xFactory.is()) 1140*cdf0e10cSrcweir return; 1141*cdf0e10cSrcweir Sequence<Any> aArguments(1); 1142*cdf0e10cSrcweir aArguments[0] <<= rxCanvas; 1143*cdf0e10cSrcweir Reference<container::XNameAccess> xBitmapLoader( 1144*cdf0e10cSrcweir xFactory->createInstanceWithArgumentsAndContext( 1145*cdf0e10cSrcweir OUString::createFromAscii("com.sun.star.drawing.PresenterWorkaroundService"), 1146*cdf0e10cSrcweir aArguments, 1147*cdf0e10cSrcweir mxComponentContext), 1148*cdf0e10cSrcweir UNO_QUERY); 1149*cdf0e10cSrcweir if ( ! xBitmapLoader.is()) 1150*cdf0e10cSrcweir return; 1151*cdf0e10cSrcweir 1152*cdf0e10cSrcweir 1153*cdf0e10cSrcweir // Iterate over all entries in the bitmap list and load the bitmaps. 1154*cdf0e10cSrcweir Reference<container::XNameAccess> xBitmaps ( 1155*cdf0e10cSrcweir rxClockTheme->getByName(OUString::createFromAscii("Bitmaps")), 1156*cdf0e10cSrcweir UNO_QUERY); 1157*cdf0e10cSrcweir ::std::vector<rtl::OUString> aBitmapProperties (3); 1158*cdf0e10cSrcweir aBitmapProperties[0] = OUString::createFromAscii("FileName"); 1159*cdf0e10cSrcweir aBitmapProperties[1] = OUString::createFromAscii("XOffset"); 1160*cdf0e10cSrcweir aBitmapProperties[2] = OUString::createFromAscii("YOffset"); 1161*cdf0e10cSrcweir PresenterConfigurationAccess::ForAll( 1162*cdf0e10cSrcweir xBitmaps, 1163*cdf0e10cSrcweir aBitmapProperties, 1164*cdf0e10cSrcweir ::boost::bind(&AnalogBitmapPainter::LoadBitmap, 1165*cdf0e10cSrcweir this, 1166*cdf0e10cSrcweir _1, 1167*cdf0e10cSrcweir _2, 1168*cdf0e10cSrcweir sLocation, 1169*cdf0e10cSrcweir xBitmapLoader)); 1170*cdf0e10cSrcweir } 1171*cdf0e10cSrcweir 1172*cdf0e10cSrcweir 1173*cdf0e10cSrcweir 1174*cdf0e10cSrcweir 1175*cdf0e10cSrcweir void AnalogBitmapPainter::LoadBitmap ( 1176*cdf0e10cSrcweir const OUString& rsKey, 1177*cdf0e10cSrcweir const ::std::vector<Any>& rValues, 1178*cdf0e10cSrcweir const OUString& rsBitmapPath, 1179*cdf0e10cSrcweir const Reference<container::XNameAccess>& rxBitmapLoader) 1180*cdf0e10cSrcweir { 1181*cdf0e10cSrcweir if (rValues.size() == 3) 1182*cdf0e10cSrcweir { 1183*cdf0e10cSrcweir BitmapDescriptor* pDescriptor = NULL; 1184*cdf0e10cSrcweir if (rsKey == OUString::createFromAscii("Face")) 1185*cdf0e10cSrcweir pDescriptor = &maFace; 1186*cdf0e10cSrcweir else if (rsKey == OUString::createFromAscii("HourHand")) 1187*cdf0e10cSrcweir pDescriptor = &maHourHand; 1188*cdf0e10cSrcweir else if (rsKey == OUString::createFromAscii("MinuteHand")) 1189*cdf0e10cSrcweir pDescriptor = &maMinuteHand; 1190*cdf0e10cSrcweir 1191*cdf0e10cSrcweir if (pDescriptor == NULL) 1192*cdf0e10cSrcweir return; 1193*cdf0e10cSrcweir 1194*cdf0e10cSrcweir OUString sFileName; 1195*cdf0e10cSrcweir if ( ! (rValues[0] >>= sFileName)) 1196*cdf0e10cSrcweir return; 1197*cdf0e10cSrcweir 1198*cdf0e10cSrcweir rValues[1] >>= pDescriptor->maOffset.X; 1199*cdf0e10cSrcweir rValues[2] >>= pDescriptor->maOffset.Y; 1200*cdf0e10cSrcweir 1201*cdf0e10cSrcweir pDescriptor->mxBitmap = Reference<rendering::XBitmap>( 1202*cdf0e10cSrcweir rxBitmapLoader->getByName(rsBitmapPath+sFileName), UNO_QUERY); 1203*cdf0e10cSrcweir 1204*cdf0e10cSrcweir if ( ! pDescriptor->mxBitmap.is()) 1205*cdf0e10cSrcweir mbThemeLoadingFailed = true; 1206*cdf0e10cSrcweir } 1207*cdf0e10cSrcweir } 1208*cdf0e10cSrcweir 1209*cdf0e10cSrcweir 1210*cdf0e10cSrcweir 1211*cdf0e10cSrcweir 1212*cdf0e10cSrcweir void AnalogBitmapPainter::ScaleBitmaps (void) 1213*cdf0e10cSrcweir { 1214*cdf0e10cSrcweir if (mbThemeLoadingFailed) 1215*cdf0e10cSrcweir return; 1216*cdf0e10cSrcweir if ( ! maFace.mxBitmap.is()) 1217*cdf0e10cSrcweir return; 1218*cdf0e10cSrcweir 1219*cdf0e10cSrcweir const geometry::IntegerSize2D aFaceSize (maFace.mxBitmap->getSize()); 1220*cdf0e10cSrcweir const sal_Int32 nSize = std::max(aFaceSize.Width, aFaceSize.Height); 1221*cdf0e10cSrcweir const double nScale = mnOuterRadius*2 / nSize; 1222*cdf0e10cSrcweir 1223*cdf0e10cSrcweir BitmapDescriptor* aDescriptors[3] = { &maFace, &maHourHand, &maMinuteHand }; 1224*cdf0e10cSrcweir for (int nIndex=0; nIndex<3; ++nIndex) 1225*cdf0e10cSrcweir { 1226*cdf0e10cSrcweir BitmapDescriptor& rDescriptor (*aDescriptors[nIndex]); 1227*cdf0e10cSrcweir if ( ! rDescriptor.mxScaledBitmap.is() && rDescriptor.mxBitmap.is()) 1228*cdf0e10cSrcweir { 1229*cdf0e10cSrcweir const geometry::IntegerSize2D aBitmapSize (rDescriptor.mxBitmap->getSize()); 1230*cdf0e10cSrcweir rDescriptor.mxScaledBitmap = rDescriptor.mxBitmap->getScaledBitmap( 1231*cdf0e10cSrcweir geometry::RealSize2D(aBitmapSize.Width*nScale, aBitmapSize.Height*nScale), 1232*cdf0e10cSrcweir sal_False); 1233*cdf0e10cSrcweir rDescriptor.maScaledOffset = geometry::RealPoint2D( 1234*cdf0e10cSrcweir rDescriptor.maOffset.X * nScale, 1235*cdf0e10cSrcweir rDescriptor.maOffset.Y * nScale); 1236*cdf0e10cSrcweir } 1237*cdf0e10cSrcweir } 1238*cdf0e10cSrcweir } 1239*cdf0e10cSrcweir 1240*cdf0e10cSrcweir 1241*cdf0e10cSrcweir 1242*cdf0e10cSrcweir 1243*cdf0e10cSrcweir //===== DigitalDefaultPainter ================================================= 1244*cdf0e10cSrcweir 1245*cdf0e10cSrcweir DigitalDefaultPainter::DigitalDefaultPainter ( 1246*cdf0e10cSrcweir const ::rtl::Reference<PresenterController>& rpPresenterController, 1247*cdf0e10cSrcweir const Reference<XResourceId>& rxViewId) 1248*cdf0e10cSrcweir : mpPresenterController(rpPresenterController), 1249*cdf0e10cSrcweir mbIs24HourFormat(false), 1250*cdf0e10cSrcweir mbIsAdaptFontSize(true), 1251*cdf0e10cSrcweir mxFont(), 1252*cdf0e10cSrcweir maWindowSize(0,0), 1253*cdf0e10cSrcweir msViewURL(rxViewId.is() ? rxViewId->getResourceURL() : OUString()) 1254*cdf0e10cSrcweir { 1255*cdf0e10cSrcweir } 1256*cdf0e10cSrcweir 1257*cdf0e10cSrcweir 1258*cdf0e10cSrcweir 1259*cdf0e10cSrcweir 1260*cdf0e10cSrcweir DigitalDefaultPainter::~DigitalDefaultPainter (void) 1261*cdf0e10cSrcweir { 1262*cdf0e10cSrcweir } 1263*cdf0e10cSrcweir 1264*cdf0e10cSrcweir 1265*cdf0e10cSrcweir 1266*cdf0e10cSrcweir 1267*cdf0e10cSrcweir void DigitalDefaultPainter::Paint ( 1268*cdf0e10cSrcweir const Reference<rendering::XCanvas>& rxCanvas, 1269*cdf0e10cSrcweir const rendering::ViewState& rViewState, 1270*cdf0e10cSrcweir const rendering::RenderState& rRenderState, 1271*cdf0e10cSrcweir const util::Color& rBackgroundColor, 1272*cdf0e10cSrcweir const sal_Int32 nHour, 1273*cdf0e10cSrcweir const sal_Int32 nMinute, 1274*cdf0e10cSrcweir const sal_Int32 nSecond, 1275*cdf0e10cSrcweir const bool bIsShowSeconds) 1276*cdf0e10cSrcweir { 1277*cdf0e10cSrcweir (void)rBackgroundColor; 1278*cdf0e10cSrcweir (void)rRenderState; 1279*cdf0e10cSrcweir 1280*cdf0e10cSrcweir if ( ! mxFont.is()) 1281*cdf0e10cSrcweir CreateFont(rxCanvas,bIsShowSeconds); 1282*cdf0e10cSrcweir if ( ! mxFont.is()) 1283*cdf0e10cSrcweir return; 1284*cdf0e10cSrcweir 1285*cdf0e10cSrcweir OUString sText; 1286*cdf0e10cSrcweir 1287*cdf0e10cSrcweir if (mbIs24HourFormat) 1288*cdf0e10cSrcweir sText = OUString::valueOf(nHour); 1289*cdf0e10cSrcweir else 1290*cdf0e10cSrcweir { 1291*cdf0e10cSrcweir sText = OUString::valueOf(nHour>12 ? nHour-12 : nHour); 1292*cdf0e10cSrcweir } 1293*cdf0e10cSrcweir sText += OUString::createFromAscii(":"); 1294*cdf0e10cSrcweir const OUString sMinutes (OUString::valueOf(nMinute)); 1295*cdf0e10cSrcweir switch (sMinutes.getLength()) 1296*cdf0e10cSrcweir { 1297*cdf0e10cSrcweir case 1 : 1298*cdf0e10cSrcweir sText += OUString::createFromAscii("0") + sMinutes; 1299*cdf0e10cSrcweir break; 1300*cdf0e10cSrcweir case 2: 1301*cdf0e10cSrcweir sText += sMinutes; 1302*cdf0e10cSrcweir break; 1303*cdf0e10cSrcweir 1304*cdf0e10cSrcweir default: 1305*cdf0e10cSrcweir return; 1306*cdf0e10cSrcweir } 1307*cdf0e10cSrcweir if (bIsShowSeconds) 1308*cdf0e10cSrcweir { 1309*cdf0e10cSrcweir sText += OUString::createFromAscii(":"); 1310*cdf0e10cSrcweir const OUString sSeconds (OUString::valueOf(nSecond)); 1311*cdf0e10cSrcweir switch (sSeconds.getLength()) 1312*cdf0e10cSrcweir { 1313*cdf0e10cSrcweir case 1 : 1314*cdf0e10cSrcweir sText += OUString::createFromAscii("0") + sSeconds; 1315*cdf0e10cSrcweir break; 1316*cdf0e10cSrcweir case 2: 1317*cdf0e10cSrcweir sText += sSeconds; 1318*cdf0e10cSrcweir break; 1319*cdf0e10cSrcweir 1320*cdf0e10cSrcweir default: 1321*cdf0e10cSrcweir return; 1322*cdf0e10cSrcweir } 1323*cdf0e10cSrcweir } 1324*cdf0e10cSrcweir 1325*cdf0e10cSrcweir rendering::StringContext aContext ( 1326*cdf0e10cSrcweir sText, 1327*cdf0e10cSrcweir 0, 1328*cdf0e10cSrcweir sText.getLength()); 1329*cdf0e10cSrcweir Reference<rendering::XTextLayout> xLayout (mxFont->createTextLayout( 1330*cdf0e10cSrcweir aContext, 1331*cdf0e10cSrcweir rendering::TextDirection::WEAK_LEFT_TO_RIGHT, 1332*cdf0e10cSrcweir 0)); 1333*cdf0e10cSrcweir if ( ! xLayout.is()) 1334*cdf0e10cSrcweir return; 1335*cdf0e10cSrcweir geometry::RealRectangle2D aBox (xLayout->queryTextBounds()); 1336*cdf0e10cSrcweir 1337*cdf0e10cSrcweir 1338*cdf0e10cSrcweir rendering::RenderState aRenderState( 1339*cdf0e10cSrcweir geometry::AffineMatrix2D(1,0,0, 0,1,0), 1340*cdf0e10cSrcweir NULL, 1341*cdf0e10cSrcweir Sequence<double>(4), 1342*cdf0e10cSrcweir rendering::CompositeOperation::SOURCE); 1343*cdf0e10cSrcweir 1344*cdf0e10cSrcweir util::Color aFontColor (mpPresenterController->GetViewFontColor(msViewURL)); 1345*cdf0e10cSrcweir PresenterCanvasHelper::SetDeviceColor(aRenderState, aFontColor); 1346*cdf0e10cSrcweir aRenderState.AffineTransform.m02 1347*cdf0e10cSrcweir = (maWindowSize.Width - (aBox.X2-aBox.X1+1)) / 2 - aBox.X1; 1348*cdf0e10cSrcweir aRenderState.AffineTransform.m12 1349*cdf0e10cSrcweir = (maWindowSize.Height - (aBox.Y2-aBox.Y1+1)) / 2 - aBox.Y1; 1350*cdf0e10cSrcweir rxCanvas->drawText( 1351*cdf0e10cSrcweir aContext, 1352*cdf0e10cSrcweir mxFont, 1353*cdf0e10cSrcweir rViewState, 1354*cdf0e10cSrcweir aRenderState, 1355*cdf0e10cSrcweir rendering::TextDirection::WEAK_LEFT_TO_RIGHT); 1356*cdf0e10cSrcweir } 1357*cdf0e10cSrcweir 1358*cdf0e10cSrcweir 1359*cdf0e10cSrcweir 1360*cdf0e10cSrcweir 1361*cdf0e10cSrcweir void DigitalDefaultPainter::Resize (const awt::Size& rSize) 1362*cdf0e10cSrcweir { 1363*cdf0e10cSrcweir if (maWindowSize.Width != rSize.Width || maWindowSize.Height != rSize.Height) 1364*cdf0e10cSrcweir { 1365*cdf0e10cSrcweir maWindowSize = rSize; 1366*cdf0e10cSrcweir if (mbIsAdaptFontSize) 1367*cdf0e10cSrcweir mxFont = NULL; 1368*cdf0e10cSrcweir } 1369*cdf0e10cSrcweir } 1370*cdf0e10cSrcweir 1371*cdf0e10cSrcweir 1372*cdf0e10cSrcweir 1373*cdf0e10cSrcweir 1374*cdf0e10cSrcweir void DigitalDefaultPainter::CreateFont ( 1375*cdf0e10cSrcweir const Reference<rendering::XCanvas>& rxCanvas, 1376*cdf0e10cSrcweir const bool bIsShowSeconds) 1377*cdf0e10cSrcweir { 1378*cdf0e10cSrcweir if (rxCanvas.is() 1379*cdf0e10cSrcweir && rxCanvas->getDevice().is() 1380*cdf0e10cSrcweir && maWindowSize.Width>0 1381*cdf0e10cSrcweir && maWindowSize.Height>0) 1382*cdf0e10cSrcweir { 1383*cdf0e10cSrcweir // Create a time template for determinging the right font size. 1384*cdf0e10cSrcweir // Assume that 0 is the widest digit or that all digits have the 1385*cdf0e10cSrcweir // same width. 1386*cdf0e10cSrcweir OUString sTimeTemplate; 1387*cdf0e10cSrcweir // For the case that not all digits have the same width, create 1388*cdf0e10cSrcweir // different templates for 12 and 24 hour mode. 1389*cdf0e10cSrcweir if (mbIs24HourFormat) 1390*cdf0e10cSrcweir sTimeTemplate = OUString::createFromAscii("20"); 1391*cdf0e10cSrcweir else 1392*cdf0e10cSrcweir sTimeTemplate = OUString::createFromAscii("10"); 1393*cdf0e10cSrcweir if (bIsShowSeconds) 1394*cdf0e10cSrcweir sTimeTemplate += OUString::createFromAscii(":00:00"); 1395*cdf0e10cSrcweir else 1396*cdf0e10cSrcweir sTimeTemplate += OUString::createFromAscii(":00"); 1397*cdf0e10cSrcweir 1398*cdf0e10cSrcweir rendering::StringContext aContext ( 1399*cdf0e10cSrcweir sTimeTemplate, 1400*cdf0e10cSrcweir 0, 1401*cdf0e10cSrcweir sTimeTemplate.getLength()); 1402*cdf0e10cSrcweir 1403*cdf0e10cSrcweir // When the font size is adapted to the window size (as large as 1404*cdf0e10cSrcweir // possible without overlapping) then that is done in a four step 1405*cdf0e10cSrcweir // process: 1406*cdf0e10cSrcweir // 1. Create a font in a default size, e.g. 10pt. 1407*cdf0e10cSrcweir // 2. Determine a scale factor from enlarging the text bounding box 1408*cdf0e10cSrcweir // to maximal size inside the window. 1409*cdf0e10cSrcweir // 3. Create a new font by scaling the default size with the factor 1410*cdf0e10cSrcweir // calculated in step 2. 1411*cdf0e10cSrcweir // 4. Text may be rendered differently in different sizes. 1412*cdf0e10cSrcweir // Therefore repeat step 2 and 3 once. More iterations may lead to 1413*cdf0e10cSrcweir // even better results but probably not to visible differences. 1414*cdf0e10cSrcweir rendering::FontRequest aFontRequest (mpPresenterController->GetViewFontRequest(msViewURL)); 1415*cdf0e10cSrcweir // TODO: use font from view style from configuration 1416*cdf0e10cSrcweir aFontRequest.CellSize = 10; 1417*cdf0e10cSrcweir 1418*cdf0e10cSrcweir for (sal_Int32 nLoop=0; nLoop<3; ++nLoop) 1419*cdf0e10cSrcweir { 1420*cdf0e10cSrcweir mxFont = rxCanvas->createFont( 1421*cdf0e10cSrcweir aFontRequest, 1422*cdf0e10cSrcweir Sequence<beans::PropertyValue>(), 1423*cdf0e10cSrcweir geometry::Matrix2D(1,0,0,1)); 1424*cdf0e10cSrcweir if (mxFont.is()) 1425*cdf0e10cSrcweir { 1426*cdf0e10cSrcweir Reference<rendering::XTextLayout> xLayout (mxFont->createTextLayout( 1427*cdf0e10cSrcweir aContext, 1428*cdf0e10cSrcweir rendering::TextDirection::WEAK_LEFT_TO_RIGHT, 1429*cdf0e10cSrcweir 0)); 1430*cdf0e10cSrcweir 1431*cdf0e10cSrcweir if ( ! xLayout.is()) 1432*cdf0e10cSrcweir break; 1433*cdf0e10cSrcweir 1434*cdf0e10cSrcweir geometry::RealRectangle2D aBox (xLayout->queryTextBounds()); 1435*cdf0e10cSrcweir if (aBox.X2<=aBox.X1 || aBox.Y2<=aBox.Y1) 1436*cdf0e10cSrcweir break; 1437*cdf0e10cSrcweir const double nHorizontalFactor = maWindowSize.Width / (aBox.X2-aBox.X1+1); 1438*cdf0e10cSrcweir const double nVerticalFactor = maWindowSize.Height / (aBox.Y2-aBox.Y1+1); 1439*cdf0e10cSrcweir aFontRequest.CellSize *= ::std::min(nHorizontalFactor,nVerticalFactor); 1440*cdf0e10cSrcweir } 1441*cdf0e10cSrcweir } 1442*cdf0e10cSrcweir } 1443*cdf0e10cSrcweir } 1444*cdf0e10cSrcweir 1445*cdf0e10cSrcweir 1446*cdf0e10cSrcweir } // end of anonymous namespace 1447*cdf0e10cSrcweir 1448*cdf0e10cSrcweir 1449*cdf0e10cSrcweir } } // end of namespace ::sdext::presenter 1450