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_framework.hxx"
26 
27 #ifndef __FRAMEWORK_UIELEMENT_PROGRESSBARWRAPPER_HXX_
28 #include <uielement/progressbarwrapper.hxx>
29 #endif
30 
31 //_________________________________________________________________________________________________________________
32 //	my own includes
33 //_________________________________________________________________________________________________________________
34 #include <helper/statusindicator.hxx>
35 #include <threadhelp/resetableguard.hxx>
36 #include <uielement/statusindicatorinterfacewrapper.hxx>
37 
38 //_________________________________________________________________________________________________________________
39 //	interface includes
40 //_________________________________________________________________________________________________________________
41 #include <com/sun/star/ui/UIElementType.hpp>
42 #include <com/sun/star/lang/DisposedException.hpp>
43 
44 //_________________________________________________________________________________________________________________
45 //	includes of other projects
46 //_________________________________________________________________________________________________________________
47 #include <vcl/svapp.hxx>
48 #include <toolkit/helper/vclunohelper.hxx>
49 
50 //_________________________________________________________________________________________________________________
51 //	namespace
52 //_________________________________________________________________________________________________________________
53 using namespace ::com::sun::star;
54 
55 namespace framework{
56 
57 //_________________________________________________________________________________________________________________
58 //	non exported const
59 //_________________________________________________________________________________________________________________
60 
61 //_________________________________________________________________________________________________________________
62 //	non exported definitions
63 //_________________________________________________________________________________________________________________
64 
65 //_________________________________________________________________________________________________________________
66 //	declarations
67 //_________________________________________________________________________________________________________________
68 
ProgressBarWrapper()69 ProgressBarWrapper::ProgressBarWrapper() :
70 UIElementWrapperBase( ::com::sun::star::ui::UIElementType::PROGRESSBAR )
71     ,   m_bOwnsInstance( sal_False )
72     ,   m_nRange( 100 )
73     ,   m_nValue( 0 )
74 {
75 }
76 
~ProgressBarWrapper()77 ProgressBarWrapper::~ProgressBarWrapper()
78 {
79 }
80 
81 // public interfaces
setStatusBar(const uno::Reference<awt::XWindow> & rStatusBar,sal_Bool bOwnsInstance)82 void ProgressBarWrapper::setStatusBar( const uno::Reference< awt::XWindow >& rStatusBar, sal_Bool bOwnsInstance )
83 {
84     ResetableGuard aGuard( m_aLock );
85 
86     if ( m_bDisposed )
87         return;
88 
89     if ( m_bOwnsInstance )
90     {
91         // dispose XWindow reference our our status bar
92         uno::Reference< lang::XComponent > xComponent( m_xStatusBar, uno::UNO_QUERY );
93         try
94         {
95             if ( xComponent.is() )
96                 xComponent->dispose();
97         }
98         catch ( uno::Exception& )
99         {
100         }
101         m_xStatusBar.clear();
102     }
103 
104     m_bOwnsInstance = bOwnsInstance;
105     m_xStatusBar    = rStatusBar;
106 }
107 
getStatusBar() const108 uno::Reference< awt::XWindow > ProgressBarWrapper::getStatusBar() const
109 {
110     ResetableGuard aGuard( m_aLock );
111 
112     if ( m_bDisposed )
113         return uno::Reference< awt::XWindow >();
114 
115     return m_xStatusBar;
116 }
117 
118 // wrapped methods of ::com::sun::star::task::XStatusIndicator
start(const::rtl::OUString & Text,::sal_Int32 Range)119 void ProgressBarWrapper::start( const ::rtl::OUString& Text, ::sal_Int32 Range )
120 throw (uno::RuntimeException)
121 {
122     uno::Reference< awt::XWindow > xWindow;
123     sal_Int32                      nValue( 0 );
124 
125     {
126         ResetableGuard aGuard( m_aLock );
127 
128         if ( m_bDisposed )
129             return;
130 
131         xWindow  = m_xStatusBar;
132         m_nValue = 0;
133         m_nRange = Range;
134         nValue   = m_nValue;
135     }
136 
137     if ( xWindow.is() )
138     {
139         vos::OGuard aSolarMutexGuard( Application::GetSolarMutex() );
140         Window* pWindow = VCLUnoHelper::GetWindow( xWindow );
141         if ( pWindow && pWindow->GetType() == WINDOW_STATUSBAR )
142         {
143             StatusBar* pStatusBar = (StatusBar *)pWindow;
144             if ( !pStatusBar->IsProgressMode() )
145                 pStatusBar->StartProgressMode( Text );
146             else
147             {
148 			    pStatusBar->SetUpdateMode( sal_False );
149 			    pStatusBar->EndProgressMode();
150                 pStatusBar->StartProgressMode( Text );
151 			    pStatusBar->SetProgressValue( sal_uInt16( nValue ));
152                 pStatusBar->SetUpdateMode( sal_True );
153             }
154             pStatusBar->Show( sal_True, SHOW_NOFOCUSCHANGE | SHOW_NOACTIVATE );
155         }
156     }
157 }
158 
end()159 void ProgressBarWrapper::end()
160 throw (uno::RuntimeException)
161 {
162     uno::Reference< awt::XWindow > xWindow;
163 
164     {
165         ResetableGuard aGuard( m_aLock );
166 
167         if ( m_bDisposed )
168             return;
169 
170         xWindow  = m_xStatusBar;
171         m_nRange = 100;
172         m_nValue = 0;
173     }
174 
175     if ( xWindow.is() )
176     {
177         vos::OGuard aSolarMutexGuard( Application::GetSolarMutex() );
178         Window* pWindow = VCLUnoHelper::GetWindow( xWindow );
179         if ( pWindow && pWindow->GetType() == WINDOW_STATUSBAR )
180         {
181             StatusBar* pStatusBar = (StatusBar *)pWindow;
182             if ( pStatusBar->IsProgressMode() )
183                 pStatusBar->EndProgressMode();
184         }
185     }
186 }
187 
setText(const::rtl::OUString & Text)188 void ProgressBarWrapper::setText( const ::rtl::OUString& Text )
189 throw (uno::RuntimeException)
190 {
191     uno::Reference< awt::XWindow > xWindow;
192     sal_Int32 nValue( 0 );
193 
194     {
195         ResetableGuard aGuard( m_aLock );
196 
197         if ( m_bDisposed )
198             return;
199 
200         xWindow  = m_xStatusBar;
201         m_aText  = Text;
202         nValue   = m_nValue;
203     }
204 
205     if ( xWindow.is() )
206     {
207         vos::OGuard aSolarMutexGuard( Application::GetSolarMutex() );
208         Window* pWindow = VCLUnoHelper::GetWindow( xWindow );
209         if ( pWindow && pWindow->GetType() == WINDOW_STATUSBAR )
210         {
211             StatusBar* pStatusBar = (StatusBar *)pWindow;
212 			if( pStatusBar->IsProgressMode() )
213             {
214 			    pStatusBar->SetUpdateMode( sal_False );
215 			    pStatusBar->EndProgressMode();
216                 pStatusBar->StartProgressMode( Text );
217 			    pStatusBar->SetProgressValue( sal_uInt16( nValue ));
218                 pStatusBar->SetUpdateMode( sal_True );
219             }
220             else
221                 pStatusBar->SetText( Text );
222         }
223     }
224 }
225 
setValue(::sal_Int32 nValue)226 void ProgressBarWrapper::setValue( ::sal_Int32 nValue )
227 throw (uno::RuntimeException)
228 {
229     uno::Reference< awt::XWindow > xWindow;
230     rtl::OUString aText;
231     sal_Bool      bSetValue( sal_False );
232 
233     {
234         ResetableGuard aGuard( m_aLock );
235 
236         if ( m_bDisposed )
237             return;
238 
239         xWindow  = m_xStatusBar;
240 
241         double fVal( 0 );
242         if ( m_nRange > 0 )
243         {
244             fVal = ( double( nValue ) / double( m_nRange )) * 100;
245             fVal = std::max( double( 0 ), std::min( fVal, double( 100 )));
246         }
247 
248         if ( m_nValue != sal_Int32( fVal ))
249         {
250             m_nValue = sal_Int32( fVal );
251             bSetValue = sal_True;
252         }
253 
254         nValue   = m_nValue;
255         aText    = m_aText;
256     }
257 
258     if ( xWindow.is() && bSetValue )
259     {
260         vos::OGuard aSolarMutexGuard( Application::GetSolarMutex() );
261         Window* pWindow = VCLUnoHelper::GetWindow( xWindow );
262         if ( pWindow && pWindow->GetType() == WINDOW_STATUSBAR )
263         {
264             StatusBar* pStatusBar = (StatusBar *)pWindow;
265             if ( !pStatusBar->IsProgressMode() )
266                 pStatusBar->StartProgressMode( aText );
267             pStatusBar->SetProgressValue( sal_uInt16( nValue ));
268         }
269     }
270 }
271 
reset()272 void ProgressBarWrapper::reset()
273 throw (uno::RuntimeException)
274 {
275     setText( rtl::OUString() );
276     setValue( 0 );
277 }
278 
279 // XInitialization
initialize(const uno::Sequence<uno::Any> &)280 void SAL_CALL ProgressBarWrapper::initialize( const uno::Sequence< uno::Any >& )
281 throw (uno::Exception, uno::RuntimeException)
282 {
283     // dummy - do nothing
284 }
285 
286 // XUpdatable
update()287 void SAL_CALL ProgressBarWrapper::update()
288 throw (uno::RuntimeException)
289 {
290     // dummy - do nothing
291 }
292 
293 // XComponent
dispose()294 void SAL_CALL ProgressBarWrapper::dispose()
295 throw (uno::RuntimeException)
296 {
297     uno::Reference< lang::XComponent > xThis(
298         static_cast< cppu::OWeakObject* >(this),
299         uno::UNO_QUERY );
300 
301     {
302         ResetableGuard aLock( m_aLock );
303 
304         if ( m_bDisposed )
305             return;
306     }
307 
308     {
309         lang::EventObject aEvent( xThis );
310         m_aListenerContainer.disposeAndClear( aEvent );
311 
312         ResetableGuard aLock( m_aLock );
313         if ( m_bOwnsInstance )
314         {
315             try
316             {
317                 uno::Reference< lang::XComponent > xComponent( m_xStatusBar, uno::UNO_QUERY );
318                 if ( xComponent.is() )
319                     xComponent->dispose();
320             }
321             catch ( lang::DisposedException& )
322             {
323             }
324         }
325 
326         m_xStatusBar.clear();
327         m_bDisposed = sal_True;
328     }
329 }
330 
331 // XUIElement
getRealInterface()332 uno::Reference< uno::XInterface > SAL_CALL ProgressBarWrapper::getRealInterface()
333 throw (uno::RuntimeException)
334 {
335     /* SAFE AREA ----------------------------------------------------------------------------------------------- */
336     // Ready for multithreading
337     ResetableGuard aLock( m_aLock );
338 
339     if ( m_bDisposed )
340         return uno::Reference< uno::XInterface >();
341     else
342     {
343         uno::Reference< uno::XInterface > xComp( m_xProgressBarIfacWrapper );
344         if ( !xComp.is() )
345         {
346             StatusIndicatorInterfaceWrapper* pWrapper =
347                 new StatusIndicatorInterfaceWrapper(
348                     uno::Reference< lang::XComponent >(
349                         static_cast< cppu::OWeakObject* >( this ),
350                         uno::UNO_QUERY ));
351                 xComp = uno::Reference< uno::XInterface >(
352                     static_cast< cppu::OWeakObject* >( pWrapper ),
353                     uno::UNO_QUERY );
354              m_xProgressBarIfacWrapper = xComp;
355         }
356 
357         return xComp;
358     }
359 }
360 
361 }		//	namespace framework
362