xref: /trunk/main/desktop/source/splash/splash.cxx (revision 07a3d7f1)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_desktop.hxx"
26 
27 #include <introbmpnames.hxx>
28 #include "splash.hxx"
29 #include <stdio.h>
30 #include <unotools/bootstrap.hxx>
31 #include <vos/process.hxx>
32 #include <tools/urlobj.hxx>
33 #include <tools/stream.hxx>
34 #include <sfx2/sfx.hrc>
35 #include <vcl/svapp.hxx>
36 #include <vcl/salnativewidgets.hxx>
37 
38 #include <com/sun/star/registry/XRegistryKey.hpp>
39 #include <rtl/bootstrap.hxx>
40 #include <rtl/logfile.hxx>
41 #include <rtl/ustrbuf.hxx>
42 #include <rtl/math.hxx>
43 #include <vcl/graph.hxx>
44 #include <svtools/filter.hxx>
45 
46 #define NOT_LOADED  ((long)-1)
47 
48 using namespace ::rtl;
49 using namespace ::com::sun::star::registry;
50 
51 namespace desktop
52 {
53 
SplashScreen(const Reference<XMultiServiceFactory> & rSMgr)54 SplashScreen::SplashScreen(const Reference< XMultiServiceFactory >& rSMgr)
55     : IntroWindow()
56     , _vdev(*((IntroWindow*)this))
57     , _cProgressFrameColor(sal::static_int_cast< ColorData >(NOT_LOADED))
58     , _bShowProgressFrame(true)
59     , _cProgressBarColor(sal::static_int_cast< ColorData >(NOT_LOADED))
60     , _bNativeProgress(true)
61 	, _iMax(100)
62 	, _iProgress(0)
63     , _eBitmapMode(BM_DEFAULTMODE)
64 	, _bPaintBitmap(sal_True)
65 	, _bPaintProgress(sal_False)
66     , _bShowLogo(sal_True)
67     , _bFullScreenSplash(sal_False)
68     , _bProgressEnd(sal_False)
69     , _tlx(NOT_LOADED)
70     , _tly(NOT_LOADED)
71     , _barwidth(NOT_LOADED)
72     , _barheight(NOT_LOADED)
73     , _barspace(2)
74     , _fXPos(-1.0)
75     , _fYPos(-1.0)
76     , _fWidth(-1.0)
77     , _fHeight(-1.0)
78     , _xoffset(12)
79 	, _yoffset(18)
80 {
81 	_rFactory = rSMgr;
82 
83     loadConfig();
84 }
85 
~SplashScreen()86 SplashScreen::~SplashScreen()
87 {
88 	Application::RemoveEventListener(
89 		LINK( this, SplashScreen, AppEventListenerHdl ) );
90 	Hide();
91 
92 }
93 
start(const OUString &,sal_Int32 nRange)94 void SAL_CALL SplashScreen::start(const OUString&, sal_Int32 nRange)
95 	throw (RuntimeException)
96 {
97     _iMax = nRange;
98     if (_bVisible) {
99         _bProgressEnd = sal_False;
100         ::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
101         if ( _eBitmapMode == BM_FULLSCREEN )
102             ShowFullScreenMode( sal_True );
103         Show();
104         Paint(Rectangle());
105         Flush();
106     }
107 }
108 
end()109 void SAL_CALL SplashScreen::end()
110 	throw (RuntimeException)
111 {
112     _iProgress = _iMax;
113     if (_bVisible )
114     {
115         if ( _eBitmapMode == BM_FULLSCREEN )
116             EndFullScreenMode();
117         Hide();
118     }
119     _bProgressEnd = sal_True;
120 }
121 
reset()122 void SAL_CALL SplashScreen::reset()
123 	throw (RuntimeException)
124 {
125     _iProgress = 0;
126     if (_bVisible && !_bProgressEnd )
127     {
128         if ( _eBitmapMode == BM_FULLSCREEN )
129             ShowFullScreenMode( sal_True );
130         Show();
131         updateStatus();
132     }
133 }
134 
setText(const OUString & rText)135 void SAL_CALL SplashScreen::setText(const OUString& rText)
136 	throw (RuntimeException)
137 {
138     ::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
139     if ( _sProgressText != rText )
140     {
141         _sProgressText = rText;
142 
143         if (_bVisible && !_bProgressEnd)
144         {
145             if ( _eBitmapMode == BM_FULLSCREEN )
146                 ShowFullScreenMode( sal_True );
147             Show();
148             updateStatus();
149         }
150     }
151 }
152 
setValue(sal_Int32 nValue)153 void SAL_CALL SplashScreen::setValue(sal_Int32 nValue)
154 	throw (RuntimeException)
155 {
156     RTL_LOGFILE_CONTEXT( aLog, "::SplashScreen::setValue (lo119109)" );
157     RTL_LOGFILE_CONTEXT_TRACE1( aLog, "value=%d", nValue );
158 
159     ::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
160     if (_bVisible && !_bProgressEnd) {
161         if ( _eBitmapMode == BM_FULLSCREEN )
162             ShowFullScreenMode( sal_True );
163         Show();
164         if (nValue >= _iMax) _iProgress = _iMax;
165 	else _iProgress = nValue;
166 	updateStatus();
167     }
168 }
169 
170 // XInitialize
171 void SAL_CALL
initialize(const::com::sun::star::uno::Sequence<::com::sun::star::uno::Any> & aArguments)172 SplashScreen::initialize( const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any>& aArguments )
173 	throw (RuntimeException)
174 {
175 	::osl::ClearableMutexGuard	aGuard(	_aMutex );
176 	if (aArguments.getLength() > 0)
177     {
178         aArguments[0] >>= _bVisible;
179         if (aArguments.getLength() > 1 )
180             aArguments[1] >>= _sAppName;
181 
182         // start to determine bitmap and all other required value
183         initBitmap();
184 	    Size aSize = _aIntroBmp.GetSizePixel();
185 	    SetOutputSizePixel( aSize );
186         _vdev.SetOutputSizePixel( aSize );
187 	    _height = aSize.Height();
188 	    _width = aSize.Width();
189         if (_width > 500)
190         {
191             Point xtopleft(212,216);
192             if ( NOT_LOADED == _tlx || NOT_LOADED == _tly )
193             {
194                 _tlx = xtopleft.X();    // top-left x
195                 _tly = xtopleft.Y();    // top-left y
196             }
197             if ( NOT_LOADED == _barwidth )
198                 _barwidth = 263;
199             if ( NOT_LOADED == _barheight )
200                 _barheight = 8;
201             if (( _eBitmapMode == BM_FULLSCREEN ) &&
202                 _bFullScreenSplash )
203             {
204                 if( ( _fXPos >= 0.0 ) && ( _fYPos >= 0.0 ))
205                 {
206                     _tlx = sal_Int32( double( aSize.Width() ) * _fXPos );
207                     _tly = sal_Int32( double( aSize.Height() ) * _fYPos );
208                 }
209                 if ( _fWidth >= 0.0 )
210                     _barwidth  = sal_Int32( double( aSize.Width() ) * _fWidth );
211                 if ( _fHeight >= 0.0 )
212                     _barheight = sal_Int32( double( aSize.Width() ) * _fHeight );
213             }
214         }
215         else
216         {
217             if ( NOT_LOADED == _barwidth )
218                 _barwidth  = _width - (2 * _xoffset);
219             if ( NOT_LOADED == _barheight )
220                 _barheight = 6;
221             if ( NOT_LOADED == _tlx || NOT_LOADED == _tly )
222             {
223                 _tlx = _xoffset;           // top-left x
224                 _tly = _height - _yoffset; // top-left y
225             }
226         }
227 
228         if ( sal::static_int_cast< ColorData >(NOT_LOADED) ==
229              _cProgressFrameColor.GetColor() )
230             _cProgressFrameColor = Color( COL_LIGHTGRAY );
231 
232         if ( sal::static_int_cast< ColorData >(NOT_LOADED) ==
233              _cProgressBarColor.GetColor() )
234         {
235             // progress bar: new color only for big bitmap format
236             if ( _width > 500 )
237                 _cProgressBarColor = Color( 157, 202, 18 );
238             else
239                 _cProgressBarColor = Color( COL_BLUE );
240         }
241 
242         Application::AddEventListener(
243 		    LINK( this, SplashScreen, AppEventListenerHdl ) );
244 
245         SetBackgroundBitmap( _aIntroBmp );
246     }
247 }
248 
updateStatus()249 void SplashScreen::updateStatus()
250 {
251 	if (!_bVisible || _bProgressEnd) return;
252 	if (!_bPaintProgress) _bPaintProgress = sal_True;
253 	//_bPaintBitmap=sal_False;
254 	Paint(Rectangle());
255 	//_bPaintBitmap=sal_True;
256     Flush();
257 }
258 
259 // internal private methods
IMPL_LINK(SplashScreen,AppEventListenerHdl,VclWindowEvent *,inEvent)260 IMPL_LINK( SplashScreen, AppEventListenerHdl, VclWindowEvent *, inEvent )
261 {
262 	if ( inEvent != 0 )
263 	{
264         // Paint( Rectangle() );
265 		switch ( inEvent->GetId() )
266 		{
267 			case VCLEVENT_WINDOW_SHOW:
268 				Paint( Rectangle() );
269 				break;
270 			default:
271 				break;
272 		}
273 	}
274 	return 0;
275 }
276 
277 // Read keys from edition/edition.ini or soffice{.ini|rc}:
implReadBootstrapKey(const OUString & _rKey)278 OUString implReadBootstrapKey( const OUString& _rKey )
279 {
280     OUString sValue(
281         rtl::OUString(
282             RTL_CONSTASCII_USTRINGPARAM(
283                 "${.override:${OOO_BASE_DIR}/program/edition/edition.ini:")) +
284         _rKey + rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("}")));
285     rtl::Bootstrap::expandMacros(sValue);
286     return sValue;
287 }
288 
loadConfig()289 void SplashScreen::loadConfig()
290 {
291     _bShowLogo = !implReadBootstrapKey(
292         rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Logo"))).
293         equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("0"));
294 
295     OUString sProgressFrameColor = implReadBootstrapKey(
296         OUString( RTL_CONSTASCII_USTRINGPARAM( "ProgressFrameColor" ) ) );
297     OUString sProgressBarColor = implReadBootstrapKey(
298         OUString( RTL_CONSTASCII_USTRINGPARAM( "ProgressBarColor" ) ) );
299     OUString sSize = implReadBootstrapKey(
300         OUString( RTL_CONSTASCII_USTRINGPARAM( "ProgressSize" ) ) );
301     OUString sPosition = implReadBootstrapKey(
302         OUString( RTL_CONSTASCII_USTRINGPARAM( "ProgressPosition" ) ) );
303     OUString sFullScreenSplash = implReadBootstrapKey(
304         OUString( RTL_CONSTASCII_USTRINGPARAM( "FullScreenSplash" ) ) );
305     OUString sNativeProgress = implReadBootstrapKey(
306         OUString( RTL_CONSTASCII_USTRINGPARAM( "NativeProgress" ) ) );
307     OUString sShowProgressFrame = implReadBootstrapKey(
308         OUString( RTL_CONSTASCII_USTRINGPARAM( "ShowProgressFrame" ) ) );
309 
310 
311     // Determine full screen splash mode
312     _bFullScreenSplash = (( sFullScreenSplash.getLength() > 0 ) &&
313                           ( !sFullScreenSplash.equalsAsciiL( "0", 1 )));
314 
315     // Try to retrieve the relative values for the progress bar. The current
316     // schema uses the screen ratio to retrieve the associated values.
317     if ( _bFullScreenSplash )
318         determineProgressRatioValues( _fXPos, _fYPos, _fWidth, _fHeight );
319 
320     if ( sProgressFrameColor.getLength() )
321     {
322         sal_uInt8 nRed = 0;
323         sal_uInt8 nGreen = 0;
324         sal_uInt8 nBlue = 0;
325         sal_Int32 idx = 0;
326         sal_Int32 temp = sProgressFrameColor.getToken( 0, ',', idx ).toInt32();
327         if ( idx != -1 )
328         {
329             nRed = static_cast< sal_uInt8 >( temp );
330             temp = sProgressFrameColor.getToken( 0, ',', idx ).toInt32();
331         }
332         if ( idx != -1 )
333         {
334             nGreen = static_cast< sal_uInt8 >( temp );
335             nBlue = static_cast< sal_uInt8 >( sProgressFrameColor.getToken( 0, ',', idx ).toInt32() );
336             _cProgressFrameColor = Color( nRed, nGreen, nBlue );
337         }
338     }
339 
340     if (sShowProgressFrame.getLength() > 0)
341     {
342         _bShowProgressFrame = sShowProgressFrame.toBoolean();
343     }
344 
345     if ( sProgressBarColor.getLength() )
346     {
347         sal_uInt8 nRed = 0;
348         sal_uInt8 nGreen = 0;
349         sal_uInt8 nBlue = 0;
350         sal_Int32 idx = 0;
351         sal_Int32 temp = sProgressBarColor.getToken( 0, ',', idx ).toInt32();
352         if ( idx != -1 )
353         {
354             nRed = static_cast< sal_uInt8 >( temp );
355             temp = sProgressBarColor.getToken( 0, ',', idx ).toInt32();
356         }
357         if ( idx != -1 )
358         {
359             nGreen = static_cast< sal_uInt8 >( temp );
360             nBlue = static_cast< sal_uInt8 >( sProgressBarColor.getToken( 0, ',', idx ).toInt32() );
361             _cProgressBarColor = Color( nRed, nGreen, nBlue );
362         }
363     }
364 
365     if( sNativeProgress.getLength() )
366     {
367         _bNativeProgress = sNativeProgress.toBoolean();
368     }
369 
370     if ( sSize.getLength() )
371     {
372         sal_Int32 idx = 0;
373         sal_Int32 temp = sSize.getToken( 0, ',', idx ).toInt32();
374         if ( idx != -1 )
375         {
376             _barwidth = temp;
377             _barheight = sSize.getToken( 0, ',', idx ).toInt32();
378         }
379     }
380 
381     if ( _barheight >= 10 )
382         _barspace = 3;  // more space between frame and bar
383 
384     if ( sPosition.getLength() )
385     {
386         sal_Int32 idx = 0;
387         sal_Int32 temp = sPosition.getToken( 0, ',', idx ).toInt32();
388         if ( idx != -1 )
389         {
390             _tlx = temp;
391             _tly = sPosition.getToken( 0, ',', idx ).toInt32();
392         }
393     }
394 }
395 
initBitmap()396 void SplashScreen::initBitmap()
397 {
398     if ( _bShowLogo )
399     {
400         OUString sExecutePath;
401         ::rtl::Bootstrap::get(
402             OUString( RTL_CONSTASCII_USTRINGPARAM( "OOO_BASE_DIR" ) ),
403             sExecutePath );
404         sExecutePath += OUString( RTL_CONSTASCII_USTRINGPARAM( "/program/" ) );
405 
406         bool haveBitmap = false;
407 
408         // Try all bitmaps in INTRO_BITMAP_NAMES
409         sal_Int32 nIndex = 0;
410         OUString  aIntroBitmapFiles( RTL_CONSTASCII_USTRINGPARAM( INTRO_BITMAP_STRINGLIST ));
411         do
412         {
413             haveBitmap = loadBitmap( sExecutePath, aIntroBitmapFiles.getToken( 0, ',', nIndex ) );
414         }
415         while ( !haveBitmap && ( nIndex >= 0 ) );
416 
417         if (!haveBitmap) {
418             rtl::OUString edition(
419                 rtl::OUString(
420                     RTL_CONSTASCII_USTRINGPARAM(
421                         "${OOO_BASE_DIR}/program/edition")));
422             rtl::Bootstrap::expandMacros(edition);
423             haveBitmap = findBitmap(edition);
424         }
425         if (!haveBitmap) {
426             findBitmap(sExecutePath);
427         }
428     }
429 }
430 
loadBitmap(rtl::OUString const & path,const rtl::OUString & rBmpFileName)431 bool SplashScreen::loadBitmap(
432     rtl::OUString const & path, const rtl::OUString &rBmpFileName )
433 {
434     if ( rBmpFileName.getLength() == 0 )
435         return false;
436 
437     INetURLObject aObj( path, INET_PROT_FILE );
438     aObj.insertName( rBmpFileName );
439 
440     SvFileStream aStrm( aObj.PathToFileName(), STREAM_STD_READ );
441     if ( !aStrm.GetError() )
442     {
443         // Use graphic class to also support more graphic formats (bmp,png,...)
444         Graphic aGraphic;
445 
446         GraphicFilter* pGF = GraphicFilter::GetGraphicFilter();
447         pGF->ImportGraphic( aGraphic, String(), aStrm, GRFILTER_FORMAT_DONTKNOW );
448 
449         // Default case, we load the intro bitmap from a separate file
450         // (e.g. staroffice_intro.bmp or starsuite_intro.bmp)
451         _aIntroBmp = aGraphic.GetBitmapEx();
452         return true;
453     }
454 
455     return false;
456 }
457 
findBitmap(rtl::OUString const & path)458 bool SplashScreen::findBitmap(rtl::OUString const & path) {
459     bool haveBitmap = false;
460     if ( _bFullScreenSplash )
461     {
462         haveBitmap = findScreenBitmap(path);
463         if ( haveBitmap )
464             _eBitmapMode = BM_FULLSCREEN;
465         else
466             haveBitmap = findAppBitmap(path);
467     }
468     if ( !haveBitmap )
469     {
470         haveBitmap = loadBitmap(
471             path, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("intro.png")));
472         if ( !haveBitmap )
473             haveBitmap = loadBitmap(
474                 path, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("intro.bmp")));
475     }
476 
477     return haveBitmap;
478 }
479 
findScreenBitmap(rtl::OUString const & path)480 bool SplashScreen::findScreenBitmap(rtl::OUString const & path)
481 {
482     sal_Int32 nWidth( 0 );
483     sal_Int32 nHeight( 0 );
484 
485     // determine desktop resolution
486     sal_uInt32 nCount = Application::GetScreenCount();
487     if ( nCount > 0 )
488     {
489         // retrieve size from first screen
490         Rectangle aScreenArea = Application::GetScreenPosSizePixel((unsigned int)0);
491         nWidth  = aScreenArea.GetWidth();
492         nHeight = aScreenArea.GetHeight();
493     }
494 
495     // create file name from screen resolution information
496     OUStringBuffer aStrBuf( 128 );
497     aStrBuf.appendAscii( "intro_" );
498     if ( _sAppName.getLength() > 0 )
499     {
500         aStrBuf.append( _sAppName );
501         aStrBuf.appendAscii( "_" );
502     }
503     aStrBuf.append( OUString::valueOf( nWidth ));
504     aStrBuf.appendAscii( "x" );
505     aStrBuf.append( OUString::valueOf( nHeight ));
506 
507     OUString aRootIntroFileName = aStrBuf.makeStringAndClear();
508     OUString aBmpFileName       = aRootIntroFileName + OUString::createFromAscii(".png");
509 
510     bool haveBitmap = loadBitmap( path, aBmpFileName );
511     if ( !haveBitmap )
512     {
513         aBmpFileName = aRootIntroFileName + OUString::createFromAscii(".bmp");
514         haveBitmap   = loadBitmap( path, aBmpFileName );
515     }
516 
517     if ( !haveBitmap )
518     {
519         aStrBuf.appendAscii( "intro_" );
520         aStrBuf.appendAscii( "_" );
521         aStrBuf.append( OUString::valueOf( nWidth ));
522         aStrBuf.appendAscii( "x" );
523         aStrBuf.append( OUString::valueOf( nHeight ));
524 
525         aRootIntroFileName = aStrBuf.makeStringAndClear();
526         aBmpFileName = aRootIntroFileName + OUString::createFromAscii(".png");
527 
528         haveBitmap = loadBitmap( path, aBmpFileName );
529         if ( !haveBitmap )
530         {
531             aBmpFileName = aRootIntroFileName + OUString::createFromAscii(".bmp");
532             haveBitmap   = loadBitmap( path, aBmpFileName );
533         }
534     }
535     return haveBitmap;
536 }
537 
findAppBitmap(rtl::OUString const & path)538 bool SplashScreen::findAppBitmap(rtl::OUString const & path)
539 {
540     bool haveBitmap = false;
541 
542     if ( _sAppName.getLength() > 0 )
543     {
544         OUStringBuffer aStrBuf( 128 );
545         aStrBuf.appendAscii( "intro_" );
546         aStrBuf.appendAscii( "_" );
547         aStrBuf.append( _sAppName );
548 
549         OUString aRootIntroFileName = aStrBuf.makeStringAndClear();
550 
551         OUString aBmpFileName = aRootIntroFileName + OUString::createFromAscii( ".png" );
552         haveBitmap = loadBitmap( path, aBmpFileName );
553         if ( !haveBitmap )
554         {
555             aBmpFileName = aRootIntroFileName + OUString::createFromAscii( ".bmp" );
556             haveBitmap = loadBitmap( path, aBmpFileName );
557         }
558     }
559     return haveBitmap;
560 }
561 
determineProgressRatioValues(double & rXRelPos,double & rYRelPos,double & rRelWidth,double & rRelHeight)562 void SplashScreen::determineProgressRatioValues(
563     double& rXRelPos, double& rYRelPos,
564     double& rRelWidth, double& rRelHeight )
565 {
566     sal_Int32 nWidth( 0 );
567     sal_Int32 nHeight( 0 );
568     sal_Int32 nScreenRatio( 0 );
569 
570     // determine desktop resolution
571     sal_uInt32 nCount = Application::GetScreenCount();
572     if ( nCount > 0 )
573     {
574         // retrieve size from first screen
575         Rectangle aScreenArea = Application::GetScreenPosSizePixel((unsigned int)0);
576         nWidth  = aScreenArea.GetWidth();
577         nHeight = aScreenArea.GetHeight();
578         nScreenRatio  = sal_Int32( math::round( double( nWidth ) / double( nHeight ), 2 ) * 100 );
579     }
580 
581     char szFullScreenProgressRatio[] = "FullScreenProgressRatio0";
582     char szFullScreenProgressPos[]   = "FullScreenProgressPos0";
583     char szFullScreenProgressSize[]  = "FullScreenProgressSize0";
584     for ( sal_Int32 i = 0; i <= 9; i++ )
585     {
586         char cNum = '0' + char( i );
587         szFullScreenProgressRatio[23] = cNum;
588         szFullScreenProgressPos[21]   = cNum;
589         szFullScreenProgressSize[22]  = cNum;
590 
591         OUString sFullScreenProgressRatio = implReadBootstrapKey(
592             OUString::createFromAscii( szFullScreenProgressRatio ) );
593 
594         if ( sFullScreenProgressRatio.getLength() > 0 )
595         {
596             double fRatio = sFullScreenProgressRatio.toDouble();
597             sal_Int32 nRatio = sal_Int32( math::round( fRatio, 2 ) * 100 );
598             if ( nRatio == nScreenRatio )
599             {
600                 OUString sFullScreenProgressPos = implReadBootstrapKey(
601                     OUString::createFromAscii( szFullScreenProgressPos ) );
602                 OUString sFullScreenProgressSize = implReadBootstrapKey(
603                     OUString::createFromAscii( szFullScreenProgressSize ) );
604 
605                 if ( sFullScreenProgressPos.getLength() )
606                 {
607                     sal_Int32 idx = 0;
608                     double temp = sFullScreenProgressPos.getToken( 0, ',', idx ).toDouble();
609                     if ( idx != -1 )
610                     {
611                         rXRelPos = temp;
612                         rYRelPos = sFullScreenProgressPos.getToken( 0, ',', idx ).toDouble();
613                     }
614                 }
615 
616                 if ( sFullScreenProgressSize.getLength() )
617                 {
618                     sal_Int32 idx = 0;
619                     double temp = sFullScreenProgressSize.getToken( 0, ',', idx ).toDouble();
620                     if ( idx != -1 )
621                     {
622                         rRelWidth  = temp;
623                         rRelHeight = sFullScreenProgressSize.getToken( 0, ',', idx ).toDouble();
624                     }
625                 }
626             }
627         }
628         else
629             break;
630     }
631 }
632 
Paint(const Rectangle &)633 void SplashScreen::Paint( const Rectangle&)
634 {
635 	if(!_bVisible) return;
636 
637     //native drawing
638     sal_Bool bNativeOK = sal_False;
639 
640     // in case of native controls we need to draw directly to the window
641     if( _bNativeProgress && IsNativeControlSupported( CTRL_INTROPROGRESS, PART_ENTIRE_CONTROL ) )
642     {
643         DrawBitmapEx( Point(), _aIntroBmp );
644 
645         ImplControlValue aValue( _iProgress * _barwidth / _iMax);
646         Rectangle aDrawRect( Point(_tlx, _tly), Size( _barwidth, _barheight ) );
647         Rectangle aNativeControlRegion, aNativeContentRegion;
648 
649         if( GetNativeControlRegion( CTRL_INTROPROGRESS, PART_ENTIRE_CONTROL, aDrawRect,
650                                              CTRL_STATE_ENABLED, aValue, rtl::OUString(),
651                                              aNativeControlRegion, aNativeContentRegion ) )
652         {
653               long nProgressHeight = aNativeControlRegion.GetHeight();
654               aDrawRect.Top() -= (nProgressHeight - _barheight)/2;
655               aDrawRect.Bottom() += (nProgressHeight - _barheight)/2;
656         }
657 
658         if( (bNativeOK = DrawNativeControl( CTRL_INTROPROGRESS, PART_ENTIRE_CONTROL, aDrawRect,
659                                             CTRL_STATE_ENABLED, aValue, _sProgressText )) != sal_False )
660         {
661             return;
662         }
663     }
664     //non native drawing
665 	// draw bitmap
666 	if (_bPaintBitmap)
667 		_vdev.DrawBitmapEx( Point(), _aIntroBmp );
668 
669 	if (_bPaintProgress)
670     {
671 		// draw progress...
672 		long length = (_iProgress * _barwidth / _iMax);
673         if (_bShowProgressFrame)
674             length -= (2 * _barspace);
675 		if (length < 0)
676             length = 0;
677 
678         if (_bShowProgressFrame)
679         {
680             // border
681             _vdev.SetFillColor();
682             _vdev.SetLineColor( _cProgressFrameColor );
683             _vdev.DrawRect(Rectangle(_tlx, _tly, _tlx+_barwidth, _tly+_barheight));
684             _vdev.SetFillColor( _cProgressBarColor );
685             _vdev.SetLineColor();
686             _vdev.DrawRect(Rectangle(_tlx+_barspace, _tly+_barspace, _tlx+_barspace+length, _tly+_barheight-_barspace));
687             _vdev.DrawText( Rectangle(_tlx, _tly+_barheight+5, _tlx+_barwidth, _tly+_barheight+5+20), _sProgressText, TEXT_DRAW_CENTER );
688         }
689         else
690         {
691             // Show flat progress bar without frame.
692 
693             // border
694             _vdev.SetFillColor( _cProgressFrameColor );
695             _vdev.SetLineColor();
696             _vdev.DrawRect(Rectangle(_tlx, _tly, _tlx+_barwidth, _tly+_barheight));
697 
698             _vdev.SetFillColor( _cProgressBarColor );
699             _vdev.SetLineColor();
700             _vdev.DrawRect(Rectangle(_tlx, _tly, _tlx+length, _tly+_barheight));
701         }
702 
703         _vdev.DrawText( Rectangle(_tlx, _tly+_barheight+5, _tlx+_barwidth, _tly+_barheight+5+20), _sProgressText, TEXT_DRAW_CENTER );
704 	}
705     Size aSize =  GetOutputSizePixel();
706     Size bSize =  _vdev.GetOutputSizePixel();
707     //_vdev.Flush();
708     //_vdev.DrawOutDev(Point(), GetOutputSize(), Point(), GetOutputSize(), *((IntroWindow*)this) );
709     DrawOutDev(Point(), GetOutputSizePixel(), Point(), _vdev.GetOutputSizePixel(), _vdev );
710 	//Flush();
711 }
712 
713 
714 // get service instance...
715 SplashScreen *SplashScreen::_pINSTANCE = NULL;
716 osl::Mutex SplashScreen::_aMutex;
717 
getInstance(const Reference<XMultiServiceFactory> & rSMgr)718 Reference< XInterface > SplashScreen::getInstance(const Reference< XMultiServiceFactory >& rSMgr)
719 {
720 	if ( _pINSTANCE == 0 )
721 	{
722 		osl::MutexGuard guard(_aMutex);
723 		if (_pINSTANCE == 0)
724 			return (XComponent*)new SplashScreen(rSMgr);
725 	}
726 
727 	return (XComponent*)0;
728 }
729 
730 // static service info...
731 const char* SplashScreen::interfaces[] =
732 {
733     "com.sun.star.task.XStartusIndicator",
734     "com.sun.star.lang.XInitialization",
735     NULL,
736 };
737 const sal_Char *SplashScreen::serviceName = "com.sun.star.office.SplashScreen";
738 const sal_Char *SplashScreen::implementationName = "com.sun.star.office.comp.SplashScreen";
739 const sal_Char *SplashScreen::supportedServiceNames[] = {"com.sun.star.office.SplashScreen", NULL};
740 
741 }
742