1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
20 #include "progressmonitor.hxx"
22 #include <com/sun/star/awt/GradientStyle.hpp>
23 #include <com/sun/star/awt/RasterOperation.hpp>
24 #include <com/sun/star/awt/Gradient.hpp>
25 #include <com/sun/star/awt/XGraphics.hpp>
26 #include <com/sun/star/awt/PosSize.hpp>
27 #include <com/sun/star/uno/XComponentContext.hpp>
28 #include <cppuhelper/typeprovider.hxx>
29 #include <cppuhelper/queryinterface.hxx>
30 #include <tools/debug.hxx>
33 #include "progressbar.hxx"
35 using namespace ::cppu
;
36 using namespace ::osl
;
37 using namespace ::com::sun::star::uno
;
38 using namespace ::com::sun::star::lang
;
39 using namespace ::com::sun::star::awt
;
44 namespace unocontrols
{
46 ProgressMonitor::ProgressMonitor( const css::uno::Reference
< XComponentContext
>& rxContext
)
47 : BaseContainerControl ( rxContext
)
49 // Its not allowed to work with member in this method (refcounter !!!)
50 // But with a HACK (++refcount) its "OK" :-(
53 // Create instances for fixedtext, button and progress ...
55 m_xTopic_Top
= css::uno::Reference
< XFixedText
> ( rxContext
->getServiceManager()->createInstanceWithContext( FIXEDTEXT_SERVICENAME
, rxContext
), UNO_QUERY
);
56 m_xText_Top
= css::uno::Reference
< XFixedText
> ( rxContext
->getServiceManager()->createInstanceWithContext( FIXEDTEXT_SERVICENAME
, rxContext
), UNO_QUERY
);
57 m_xTopic_Bottom
= css::uno::Reference
< XFixedText
> ( rxContext
->getServiceManager()->createInstanceWithContext( FIXEDTEXT_SERVICENAME
, rxContext
), UNO_QUERY
);
58 m_xText_Bottom
= css::uno::Reference
< XFixedText
> ( rxContext
->getServiceManager()->createInstanceWithContext( FIXEDTEXT_SERVICENAME
, rxContext
), UNO_QUERY
);
59 m_xButton
= css::uno::Reference
< XButton
> ( rxContext
->getServiceManager()->createInstanceWithContext( BUTTON_SERVICENAME
, rxContext
), UNO_QUERY
);
60 m_xProgressBar
= VclPtr
<ProgressBar
>::Create(rxContext
);
62 // ... cast controls to Reference< XControl > (for "setModel"!) ...
63 css::uno::Reference
< XControl
> xRef_Topic_Top ( m_xTopic_Top
, UNO_QUERY
);
64 css::uno::Reference
< XControl
> xRef_Text_Top ( m_xText_Top
, UNO_QUERY
);
65 css::uno::Reference
< XControl
> xRef_Topic_Bottom ( m_xTopic_Bottom
, UNO_QUERY
);
66 css::uno::Reference
< XControl
> xRef_Text_Bottom ( m_xText_Bottom
, UNO_QUERY
);
67 css::uno::Reference
< XControl
> xRef_Button ( m_xButton
, UNO_QUERY
);
70 xRef_Topic_Top
->setModel ( css::uno::Reference
< XControlModel
> ( rxContext
->getServiceManager()->createInstanceWithContext( FIXEDTEXT_MODELNAME
, rxContext
), UNO_QUERY
) );
71 xRef_Text_Top
->setModel ( css::uno::Reference
< XControlModel
> ( rxContext
->getServiceManager()->createInstanceWithContext( FIXEDTEXT_MODELNAME
, rxContext
), UNO_QUERY
) );
72 xRef_Topic_Bottom
->setModel ( css::uno::Reference
< XControlModel
> ( rxContext
->getServiceManager()->createInstanceWithContext( FIXEDTEXT_MODELNAME
, rxContext
), UNO_QUERY
) );
73 xRef_Text_Bottom
->setModel ( css::uno::Reference
< XControlModel
> ( rxContext
->getServiceManager()->createInstanceWithContext( FIXEDTEXT_MODELNAME
, rxContext
), UNO_QUERY
) );
74 xRef_Button
->setModel ( css::uno::Reference
< XControlModel
> ( rxContext
->getServiceManager()->createInstanceWithContext( BUTTON_MODELNAME
, rxContext
), UNO_QUERY
) );
75 // ProgressBar has no model !!!
77 // ... and add controls to basecontainercontrol!
78 addControl ( CONTROLNAME_TEXT
, xRef_Topic_Top
);
79 addControl ( CONTROLNAME_TEXT
, xRef_Text_Top
);
80 addControl ( CONTROLNAME_TEXT
, xRef_Topic_Bottom
);
81 addControl ( CONTROLNAME_TEXT
, xRef_Text_Bottom
);
82 addControl ( CONTROLNAME_BUTTON
, xRef_Button
);
83 addControl ( CONTROLNAME_PROGRESSBAR
, m_xProgressBar
.get() );
85 // FixedText make it automatically visible by himself ... but not the progressbar !!!
86 // it must be set explicitly
87 m_xProgressBar
->setVisible( true );
89 // Reset to defaults !!!
90 // (progressbar take automatically its own defaults)
91 m_xButton
->setLabel ( DEFAULT_BUTTONLABEL
);
92 m_xTopic_Top
->setText ( PROGRESSMONITOR_DEFAULT_TOPIC
);
93 m_xText_Top
->setText ( PROGRESSMONITOR_DEFAULT_TEXT
);
94 m_xTopic_Bottom
->setText ( PROGRESSMONITOR_DEFAULT_TOPIC
);
95 m_xText_Bottom
->setText ( PROGRESSMONITOR_DEFAULT_TEXT
);
100 ProgressMonitor::~ProgressMonitor()
106 Any SAL_CALL
ProgressMonitor::queryInterface( const Type
& rType
) throw( RuntimeException
, std::exception
)
109 // Don't use mutex or guard in this method!!! Is a method of XInterface.
111 css::uno::Reference
< XInterface
> xDel
= BaseContainerControl::impl_getDelegator();
114 // If an delegator exist, forward question to his queryInterface.
115 // Delegator will ask his own queryAggregation!
116 aReturn
= xDel
->queryInterface( rType
);
120 // If an delegator unknown, forward question to own queryAggregation.
121 aReturn
= queryAggregation( rType
);
128 void SAL_CALL
ProgressMonitor::acquire() throw()
131 // Don't use mutex or guard in this method!!! Is a method of XInterface.
133 // Forward to baseclass
134 BaseControl::acquire();
138 void SAL_CALL
ProgressMonitor::release() throw()
141 // Don't use mutex or guard in this method!!! Is a method of XInterface.
143 // Forward to baseclass
144 BaseControl::release();
148 Sequence
< Type
> SAL_CALL
ProgressMonitor::getTypes() throw( RuntimeException
, std::exception
)
150 // Optimize this method !
151 // We initialize a static variable only one time. And we don't must use a mutex at every call!
152 // For the first call; pTypeCollection is NULL - for the second call pTypeCollection is different from NULL!
153 static OTypeCollection
* pTypeCollection
= NULL
;
155 if ( pTypeCollection
== NULL
)
157 // Ready for multithreading; get global mutex for first call of this method only! see before
158 MutexGuard
aGuard( Mutex::getGlobalMutex() );
160 // Control these pointer again ... it can be, that another instance will be faster then these!
161 if ( pTypeCollection
== NULL
)
163 // Create a static typecollection ...
164 static OTypeCollection
aTypeCollection ( cppu::UnoType
<XLayoutConstrains
>::get(),
165 cppu::UnoType
<XButton
>::get(),
166 cppu::UnoType
<XProgressMonitor
>::get(),
167 BaseContainerControl::getTypes()
169 // ... and set his address to static pointer!
170 pTypeCollection
= &aTypeCollection
;
174 return pTypeCollection
->getTypes();
178 Any SAL_CALL
ProgressMonitor::queryAggregation( const Type
& aType
) throw( RuntimeException
, std::exception
)
180 // Ask for my own supported interfaces ...
181 // Attention: XTypeProvider and XInterface are supported by OComponentHelper!
182 Any
aReturn ( ::cppu::queryInterface( aType
,
183 static_cast< XLayoutConstrains
* > ( this ) ,
184 static_cast< XButton
* > ( this ) ,
185 static_cast< XProgressMonitor
* > ( this )
189 // If searched interface not supported by this class ...
190 if ( !aReturn
.hasValue() )
192 // ... ask baseclasses.
193 aReturn
= BaseControl::queryAggregation( aType
);
200 void SAL_CALL
ProgressMonitor::addText(
201 const OUString
& rTopic
,
202 const OUString
& rText
,
203 sal_Bool bbeforeProgress
204 ) throw( RuntimeException
, std::exception
)
206 // Safe impossible cases
207 // Check valid call of this method.
208 DBG_ASSERT ( impl_debug_checkParameter ( rTopic
, rText
, bbeforeProgress
) , "ProgressMonitor::addText()\nCall without valid parameters!\n");
209 DBG_ASSERT ( !(impl_searchTopic ( rTopic
, bbeforeProgress
) != NULL
) , "ProgresMonitor::addText()\nThe text already exist.\n" );
211 // Do nothing (in Release), if topic already exist.
212 if ( impl_searchTopic ( rTopic
, bbeforeProgress
) != NULL
)
217 // Else ... take memory for new item ...
218 IMPL_TextlistItem
* pTextItem
= new IMPL_TextlistItem
;
221 pTextItem
->sTopic
= rTopic
;
222 pTextItem
->sText
= rText
;
224 // Ready for multithreading
225 MutexGuard
aGuard ( m_aMutex
);
227 // ... and insert it in right list.
228 if ( bbeforeProgress
)
230 maTextlist_Top
.push_back( pTextItem
);
234 maTextlist_Bottom
.push_back( pTextItem
);
238 impl_rebuildFixedText ();
239 impl_recalcLayout ();
243 void SAL_CALL
ProgressMonitor::removeText ( const OUString
& rTopic
, sal_Bool bbeforeProgress
) throw( RuntimeException
, std::exception
)
245 // Safe impossible cases
246 // Check valid call of this method.
247 DBG_ASSERT ( impl_debug_checkParameter ( rTopic
, bbeforeProgress
), "ProgressMonitor::removeText()\nCall without valid parameters!\n" );
249 // Search the topic ...
250 IMPL_TextlistItem
* pSearchItem
= impl_searchTopic ( rTopic
, bbeforeProgress
);
252 if ( pSearchItem
!= NULL
)
254 // Ready for multithreading
255 MutexGuard
aGuard ( m_aMutex
);
257 // ... delete item from right list ...
258 if ( bbeforeProgress
)
260 vector
< IMPL_TextlistItem
* >::iterator
261 itr
= find( maTextlist_Top
.begin(), maTextlist_Top
.end(), pSearchItem
);
262 if (itr
!= maTextlist_Top
.end())
263 maTextlist_Top
.erase(itr
);
267 vector
< IMPL_TextlistItem
* >::iterator
268 itr
= find( maTextlist_Bottom
.begin(), maTextlist_Bottom
.end(), pSearchItem
);
269 if (itr
!= maTextlist_Bottom
.end())
270 maTextlist_Bottom
.erase(itr
);
275 // ... and update window.
276 impl_rebuildFixedText ();
277 impl_recalcLayout ();
282 void SAL_CALL
ProgressMonitor::updateText (
283 const OUString
& rTopic
,
284 const OUString
& rText
,
285 sal_Bool bbeforeProgress
286 ) throw( RuntimeException
, std::exception
)
288 // Safe impossible cases
289 // Check valid call of this method.
290 DBG_ASSERT ( impl_debug_checkParameter ( rTopic
, rText
, bbeforeProgress
), "ProgressMonitor::updateText()\nCall without valid parameters!\n" );
293 IMPL_TextlistItem
* pSearchItem
= impl_searchTopic ( rTopic
, bbeforeProgress
);
295 if ( pSearchItem
!= NULL
)
297 // Ready for multithreading
298 MutexGuard
aGuard ( m_aMutex
);
300 // ... update text ...
301 pSearchItem
->sText
= rText
;
303 // ... and update window.
304 impl_rebuildFixedText ();
305 impl_recalcLayout ();
310 void SAL_CALL
ProgressMonitor::setForegroundColor ( sal_Int32 nColor
) throw( RuntimeException
, std::exception
)
312 // Ready for multithreading
313 MutexGuard
aGuard ( m_aMutex
);
315 m_xProgressBar
->setForegroundColor ( nColor
);
319 void SAL_CALL
ProgressMonitor::setBackgroundColor ( sal_Int32 nColor
) throw( RuntimeException
, std::exception
)
321 // Ready for multithreading
322 MutexGuard
aGuard ( m_aMutex
);
324 m_xProgressBar
->setBackgroundColor ( nColor
);
328 void SAL_CALL
ProgressMonitor::setValue ( sal_Int32 nValue
) throw( RuntimeException
, std::exception
)
330 // Ready for multithreading
331 MutexGuard
aGuard ( m_aMutex
);
333 m_xProgressBar
->setValue ( nValue
);
337 void SAL_CALL
ProgressMonitor::setRange ( sal_Int32 nMin
, sal_Int32 nMax
) throw( RuntimeException
, std::exception
)
339 // Ready for multithreading
340 MutexGuard
aGuard ( m_aMutex
);
342 m_xProgressBar
->setRange ( nMin
, nMax
);
346 sal_Int32 SAL_CALL
ProgressMonitor::getValue () throw( RuntimeException
, std::exception
)
348 // Ready for multithreading
349 MutexGuard
aGuard ( m_aMutex
);
351 return m_xProgressBar
->getValue ();
355 void SAL_CALL
ProgressMonitor::addActionListener ( const css::uno::Reference
< XActionListener
> & rListener
) throw( RuntimeException
, std::exception
)
357 // Ready for multithreading
358 MutexGuard
aGuard ( m_aMutex
);
360 if ( m_xButton
.is () )
362 m_xButton
->addActionListener ( rListener
);
367 void SAL_CALL
ProgressMonitor::removeActionListener ( const css::uno::Reference
< XActionListener
> & rListener
) throw( RuntimeException
, std::exception
)
369 // Ready for multithreading
370 MutexGuard
aGuard ( m_aMutex
);
372 if ( m_xButton
.is () )
374 m_xButton
->removeActionListener ( rListener
);
379 void SAL_CALL
ProgressMonitor::setLabel ( const OUString
& rLabel
) throw( RuntimeException
, std::exception
)
381 // Ready for multithreading
382 MutexGuard
aGuard ( m_aMutex
);
384 if ( m_xButton
.is () )
386 m_xButton
->setLabel ( rLabel
);
391 void SAL_CALL
ProgressMonitor::setActionCommand ( const OUString
& rCommand
) throw( RuntimeException
, std::exception
)
393 // Ready for multithreading
394 MutexGuard
aGuard ( m_aMutex
);
396 if ( m_xButton
.is () )
398 m_xButton
->setActionCommand ( rCommand
);
403 Size SAL_CALL
ProgressMonitor::getMinimumSize () throw( RuntimeException
, std::exception
)
405 return Size (PROGRESSMONITOR_DEFAULT_WIDTH
, PROGRESSMONITOR_DEFAULT_HEIGHT
);
409 Size SAL_CALL
ProgressMonitor::getPreferredSize () throw( RuntimeException
, std::exception
)
411 // Ready for multithreading
412 ClearableMutexGuard
aGuard ( m_aMutex
);
414 // get information about required place of child controls
415 css::uno::Reference
< XLayoutConstrains
> xTopicLayout_Top ( m_xTopic_Top
, UNO_QUERY
);
416 css::uno::Reference
< XLayoutConstrains
> xTopicLayout_Bottom ( m_xTopic_Bottom
, UNO_QUERY
);
417 css::uno::Reference
< XLayoutConstrains
> xButtonLayout ( m_xButton
, UNO_QUERY
);
419 Size aTopicSize_Top
= xTopicLayout_Top
->getPreferredSize ();
420 Size aTopicSize_Bottom
= xTopicLayout_Bottom
->getPreferredSize ();
421 Size aButtonSize
= xButtonLayout
->getPreferredSize ();
422 Rectangle aTempRectangle
= m_xProgressBar
->getPosSize();
423 Size aProgressBarSize
= Size( aTempRectangle
.Width
, aTempRectangle
.Height
);
427 // calc preferred size of progressmonitor
428 sal_Int32 nWidth
= 3 * PROGRESSMONITOR_FREEBORDER
;
429 nWidth
+= aProgressBarSize
.Width
;
431 sal_Int32 nHeight
= 6 * PROGRESSMONITOR_FREEBORDER
;
432 nHeight
+= aTopicSize_Top
.Height
;
433 nHeight
+= aProgressBarSize
.Height
;
434 nHeight
+= aTopicSize_Bottom
.Height
;
435 nHeight
+= 2; // 1 for black line, 1 for white line = 3D-Line!
436 nHeight
+= aButtonSize
.Height
;
439 if ( nWidth
< PROGRESSMONITOR_DEFAULT_WIDTH
)
441 nWidth
= PROGRESSMONITOR_DEFAULT_WIDTH
;
443 if ( nHeight
< PROGRESSMONITOR_DEFAULT_HEIGHT
)
445 nHeight
= PROGRESSMONITOR_DEFAULT_HEIGHT
;
449 return Size ( nWidth
, nHeight
);
453 Size SAL_CALL
ProgressMonitor::calcAdjustedSize ( const Size
& /*rNewSize*/ ) throw( RuntimeException
, std::exception
)
455 return getPreferredSize ();
459 void SAL_CALL
ProgressMonitor::createPeer ( const css::uno::Reference
< XToolkit
> & rToolkit
, const css::uno::Reference
< XWindowPeer
> & rParent
) throw( RuntimeException
, std::exception
)
463 BaseContainerControl::createPeer ( rToolkit
, rParent
);
465 // If user forget to call "setPosSize()", we have still a correct size.
466 // And a "MinimumSize" IS A "MinimumSize"!
467 // We change not the position of control at this point.
468 Size aDefaultSize
= getMinimumSize ();
469 setPosSize ( 0, 0, aDefaultSize
.Width
, aDefaultSize
.Height
, PosSize::SIZE
);
474 sal_Bool SAL_CALL
ProgressMonitor::setModel ( const css::uno::Reference
< XControlModel
> & /*rModel*/ ) throw( RuntimeException
, std::exception
)
481 css::uno::Reference
< XControlModel
> SAL_CALL
ProgressMonitor::getModel () throw( RuntimeException
, std::exception
)
484 // return (XControlModel*)this;
485 return css::uno::Reference
< XControlModel
> ();
489 void SAL_CALL
ProgressMonitor::dispose () throw( RuntimeException
, std::exception
)
491 // Ready for multithreading
492 MutexGuard
aGuard ( m_aMutex
);
494 // "removeControl()" control the state of a reference
495 css::uno::Reference
< XControl
> xRef_Topic_Top ( m_xTopic_Top
, UNO_QUERY
);
496 css::uno::Reference
< XControl
> xRef_Text_Top ( m_xText_Top
, UNO_QUERY
);
497 css::uno::Reference
< XControl
> xRef_Topic_Bottom ( m_xTopic_Bottom
, UNO_QUERY
);
498 css::uno::Reference
< XControl
> xRef_Text_Bottom ( m_xText_Bottom
, UNO_QUERY
);
499 css::uno::Reference
< XControl
> xRef_Button ( m_xButton
, UNO_QUERY
);
501 removeControl ( xRef_Topic_Top
);
502 removeControl ( xRef_Text_Top
);
503 removeControl ( xRef_Topic_Bottom
);
504 removeControl ( xRef_Text_Bottom
);
505 removeControl ( xRef_Button
);
506 removeControl ( m_xProgressBar
.get() );
508 // do'nt use "...->clear ()" or "... = XFixedText ()"
509 // when other hold a reference at this object !!!
510 xRef_Topic_Top
->dispose ();
511 xRef_Text_Top
->dispose ();
512 xRef_Topic_Bottom
->dispose ();
513 xRef_Text_Bottom
->dispose ();
514 xRef_Button
->dispose ();
515 m_xProgressBar
->dispose();
517 BaseContainerControl::dispose ();
521 void SAL_CALL
ProgressMonitor::setPosSize ( sal_Int32 nX
, sal_Int32 nY
, sal_Int32 nWidth
, sal_Int32 nHeight
, sal_Int16 nFlags
) throw( RuntimeException
, std::exception
)
523 Rectangle aBasePosSize
= getPosSize ();
524 BaseContainerControl::setPosSize (nX
, nY
, nWidth
, nHeight
, nFlags
);
526 // if position or size changed
528 ( nWidth
!= aBasePosSize
.Width
) ||
529 ( nHeight
!= aBasePosSize
.Height
)
532 // calc new layout for controls
533 impl_recalcLayout ();
534 // clear background (!)
535 // [Children were repainted in "recalcLayout" by setPosSize() automatically!]
536 getPeer()->invalidate(2);
537 // and repaint the control
538 impl_paint ( 0, 0, impl_getGraphicsPeer() );
542 // impl but public method to register service
543 const Sequence
< OUString
> ProgressMonitor::impl_getStaticSupportedServiceNames()
545 return css::uno::Sequence
<OUString
>();
548 // impl but public method to register service
549 const OUString
ProgressMonitor::impl_getStaticImplementationName()
551 return OUString("stardiv.UnoControls.ProgressMonitor");
555 void ProgressMonitor::impl_paint ( sal_Int32 nX
, sal_Int32 nY
, const css::uno::Reference
< XGraphics
> & rGraphics
)
559 // Ready for multithreading
560 MutexGuard
aGuard ( m_aMutex
);
562 // paint shadowed border around the progressmonitor
563 rGraphics
->setLineColor ( PROGRESSMONITOR_LINECOLOR_SHADOW
);
564 rGraphics
->drawLine ( impl_getWidth()-1, impl_getHeight()-1, impl_getWidth()-1, nY
);
565 rGraphics
->drawLine ( impl_getWidth()-1, impl_getHeight()-1, nX
, impl_getHeight()-1 );
567 rGraphics
->setLineColor ( PROGRESSMONITOR_LINECOLOR_BRIGHT
);
568 rGraphics
->drawLine ( nX
, nY
, impl_getWidth(), nY
);
569 rGraphics
->drawLine ( nX
, nY
, nX
, impl_getHeight() );
572 rGraphics
->setLineColor ( PROGRESSMONITOR_LINECOLOR_SHADOW
);
573 rGraphics
->drawLine ( m_a3DLine
.X
, m_a3DLine
.Y
, m_a3DLine
.X
+m_a3DLine
.Width
, m_a3DLine
.Y
);
575 rGraphics
->setLineColor ( PROGRESSMONITOR_LINECOLOR_BRIGHT
);
576 rGraphics
->drawLine ( m_a3DLine
.X
, m_a3DLine
.Y
+1, m_a3DLine
.X
+m_a3DLine
.Width
, m_a3DLine
.Y
+1 );
581 void ProgressMonitor::impl_recalcLayout ()
585 sal_Int32 nWidth_Button
;
586 sal_Int32 nHeight_Button
;
588 sal_Int32 nX_ProgressBar
;
589 sal_Int32 nY_ProgressBar
;
590 sal_Int32 nWidth_ProgressBar
;
591 sal_Int32 nHeight_ProgressBar
;
593 sal_Int32 nX_Text_Top
;
594 sal_Int32 nY_Text_Top
;
595 sal_Int32 nWidth_Text_Top
;
596 sal_Int32 nHeight_Text_Top
;
598 sal_Int32 nX_Topic_Top
;
599 sal_Int32 nY_Topic_Top
;
600 sal_Int32 nWidth_Topic_Top
;
601 sal_Int32 nHeight_Topic_Top
;
603 sal_Int32 nX_Text_Bottom
;
604 sal_Int32 nY_Text_Bottom
;
605 sal_Int32 nWidth_Text_Bottom
;
606 sal_Int32 nHeight_Text_Bottom
;
608 sal_Int32 nX_Topic_Bottom
;
609 sal_Int32 nY_Topic_Bottom
;
610 sal_Int32 nWidth_Topic_Bottom
;
611 sal_Int32 nHeight_Topic_Bottom
;
613 // Ready for multithreading
614 MutexGuard
aGuard ( m_aMutex
);
616 // get information about required place of child controls
617 css::uno::Reference
< XLayoutConstrains
> xTopicLayout_Top ( m_xTopic_Top
, UNO_QUERY
);
618 css::uno::Reference
< XLayoutConstrains
> xTextLayout_Top ( m_xText_Top
, UNO_QUERY
);
619 css::uno::Reference
< XLayoutConstrains
> xTopicLayout_Bottom ( m_xTopic_Bottom
, UNO_QUERY
);
620 css::uno::Reference
< XLayoutConstrains
> xTextLayout_Bottom ( m_xText_Bottom
, UNO_QUERY
);
621 css::uno::Reference
< XLayoutConstrains
> xButtonLayout ( m_xButton
, UNO_QUERY
);
623 Size aTopicSize_Top
= xTopicLayout_Top
->getPreferredSize ();
624 Size aTextSize_Top
= xTextLayout_Top
->getPreferredSize ();
625 Size aTopicSize_Bottom
= xTopicLayout_Bottom
->getPreferredSize ();
626 Size aTextSize_Bottom
= xTextLayout_Bottom
->getPreferredSize ();
627 Size aButtonSize
= xButtonLayout
->getPreferredSize ();
629 // calc position and size of child controls
630 // Button has preferred size!
631 nWidth_Button
= aButtonSize
.Width
;
632 nHeight_Button
= aButtonSize
.Height
;
634 // Left column before progressbar has preferred size and fixed position.
635 // But "Width" is oriented on left column below progressbar to!!! "max(...)"
636 nX_Topic_Top
= PROGRESSMONITOR_FREEBORDER
;
637 nY_Topic_Top
= PROGRESSMONITOR_FREEBORDER
;
638 nWidth_Topic_Top
= std::max( aTopicSize_Top
.Width
, aTopicSize_Bottom
.Width
);
639 nHeight_Topic_Top
= aTopicSize_Top
.Height
;
641 // Right column before progressbar has relativ position to left column ...
642 // ... and a size as rest of dialog size!
643 nX_Text_Top
= nX_Topic_Top
+nWidth_Topic_Top
+PROGRESSMONITOR_FREEBORDER
;
644 nY_Text_Top
= nY_Topic_Top
;
645 nWidth_Text_Top
= std::max ( aTextSize_Top
.Width
, aTextSize_Bottom
.Width
);
646 // Fix size of this column to minimum!
647 sal_Int32 nSummaryWidth
= nWidth_Text_Top
+nWidth_Topic_Top
+(3*PROGRESSMONITOR_FREEBORDER
);
648 if ( nSummaryWidth
< PROGRESSMONITOR_DEFAULT_WIDTH
)
649 nWidth_Text_Top
= PROGRESSMONITOR_DEFAULT_WIDTH
-nWidth_Topic_Top
-(3*PROGRESSMONITOR_FREEBORDER
);
650 // Fix size of column to maximum!
651 if ( nSummaryWidth
> impl_getWidth() )
652 nWidth_Text_Top
= impl_getWidth()-nWidth_Topic_Top
-(3*PROGRESSMONITOR_FREEBORDER
);
653 nHeight_Text_Top
= nHeight_Topic_Top
;
655 // Position of progressbar is relativ to columns before.
656 // Progressbar.Width = Dialog.Width !!!
657 // Progressbar.Height = Button.Height
658 nX_ProgressBar
= nX_Topic_Top
;
659 nY_ProgressBar
= nY_Topic_Top
+nHeight_Topic_Top
+PROGRESSMONITOR_FREEBORDER
;
660 nWidth_ProgressBar
= PROGRESSMONITOR_FREEBORDER
+nWidth_Topic_Top
+nWidth_Text_Top
;
661 nHeight_ProgressBar
= nHeight_Button
;
663 // Oriented by left column before progressbar.
664 nX_Topic_Bottom
= nX_Topic_Top
;
665 nY_Topic_Bottom
= nY_ProgressBar
+nHeight_ProgressBar
+PROGRESSMONITOR_FREEBORDER
;
666 nWidth_Topic_Bottom
= nWidth_Topic_Top
;
667 nHeight_Topic_Bottom
= aTopicSize_Bottom
.Height
;
669 // Oriented by right column before progressbar.
670 nX_Text_Bottom
= nX_Topic_Bottom
+nWidth_Topic_Bottom
+PROGRESSMONITOR_FREEBORDER
;
671 nY_Text_Bottom
= nY_Topic_Bottom
;
672 nWidth_Text_Bottom
= nWidth_Text_Top
;
673 nHeight_Text_Bottom
= nHeight_Topic_Bottom
;
675 // Oriented by progressbar.
676 nX_Button
= nX_ProgressBar
+nWidth_ProgressBar
-nWidth_Button
;
677 nY_Button
= nY_Topic_Bottom
+nHeight_Topic_Bottom
+PROGRESSMONITOR_FREEBORDER
;
679 // Calc offsets to center controls
683 nDx
= ( (2*PROGRESSMONITOR_FREEBORDER
)+nWidth_ProgressBar
);
684 nDy
= ( (6*PROGRESSMONITOR_FREEBORDER
)+nHeight_Topic_Top
+nHeight_ProgressBar
+nHeight_Topic_Bottom
+2+nHeight_Button
);
686 // At this point use original dialog size to center controls!
687 nDx
= (impl_getWidth ()/2)-(nDx
/2);
688 nDy
= (impl_getHeight()/2)-(nDy
/2);
699 // Set new position and size on all controls
700 css::uno::Reference
< XWindow
> xRef_Topic_Top ( m_xTopic_Top
, UNO_QUERY
);
701 css::uno::Reference
< XWindow
> xRef_Text_Top ( m_xText_Top
, UNO_QUERY
);
702 css::uno::Reference
< XWindow
> xRef_Topic_Bottom ( m_xTopic_Bottom
, UNO_QUERY
);
703 css::uno::Reference
< XWindow
> xRef_Text_Bottom ( m_xText_Bottom
, UNO_QUERY
);
704 css::uno::Reference
< XWindow
> xRef_Button ( m_xButton
, UNO_QUERY
);
706 xRef_Topic_Top
->setPosSize ( nDx
+nX_Topic_Top
, nDy
+nY_Topic_Top
, nWidth_Topic_Top
, nHeight_Topic_Top
, 15 );
707 xRef_Text_Top
->setPosSize ( nDx
+nX_Text_Top
, nDy
+nY_Text_Top
, nWidth_Text_Top
, nHeight_Text_Top
, 15 );
708 xRef_Topic_Bottom
->setPosSize ( nDx
+nX_Topic_Bottom
, nDy
+nY_Topic_Bottom
, nWidth_Topic_Bottom
, nHeight_Topic_Bottom
, 15 );
709 xRef_Text_Bottom
->setPosSize ( nDx
+nX_Text_Bottom
, nDy
+nY_Text_Bottom
, nWidth_Text_Bottom
, nHeight_Text_Bottom
, 15 );
710 xRef_Button
->setPosSize ( nDx
+nX_Button
, nDy
+nY_Button
, nWidth_Button
, nHeight_Button
, 15 );
711 m_xProgressBar
->setPosSize( nDx
+nX_ProgressBar
, nDy
+nY_ProgressBar
, nWidth_ProgressBar
, nHeight_ProgressBar
, 15 );
713 m_a3DLine
.X
= nDx
+nX_Topic_Top
;
714 m_a3DLine
.Y
= nDy
+nY_Topic_Bottom
+nHeight_Topic_Bottom
+(PROGRESSMONITOR_FREEBORDER
/2);
715 m_a3DLine
.Width
= nWidth_ProgressBar
;
716 m_a3DLine
.Height
= nHeight_ProgressBar
;
718 // All childcontrols make an implicit repaint in setPosSize()!
719 // Make it also for this 3D-line ...
720 css::uno::Reference
< XGraphics
> xGraphics
= impl_getGraphicsPeer ();
722 xGraphics
->setLineColor ( PROGRESSMONITOR_LINECOLOR_SHADOW
);
723 xGraphics
->drawLine ( m_a3DLine
.X
, m_a3DLine
.Y
, m_a3DLine
.X
+m_a3DLine
.Width
, m_a3DLine
.Y
);
725 xGraphics
->setLineColor ( PROGRESSMONITOR_LINECOLOR_BRIGHT
);
726 xGraphics
->drawLine ( m_a3DLine
.X
, m_a3DLine
.Y
+1, m_a3DLine
.X
+m_a3DLine
.Width
, m_a3DLine
.Y
+1 );
730 void ProgressMonitor::impl_rebuildFixedText ()
732 // Ready for multithreading
733 MutexGuard
aGuard ( m_aMutex
);
735 // Rebuild fixedtext before progress
737 // Rebuild left site of text
738 if (m_xTopic_Top
.is())
740 OUString aCollectString
;
742 // Collect all topics from list and format text.
743 // "\n" MUST BE at the end of line!!! => Else ... topic and his text are not in the same line!!!
744 for ( size_t n
= 0; n
< maTextlist_Top
.size(); ++n
)
746 IMPL_TextlistItem
* pSearchItem
= maTextlist_Top
[ n
];
747 aCollectString
+= pSearchItem
->sTopic
;
748 aCollectString
+= "\n";
751 m_xTopic_Top
->setText ( aCollectString
);
754 // Rebuild right site of text
755 if (m_xText_Top
.is())
757 OUString aCollectString
;
759 // Collect all topics from list and format text.
760 // "\n" MUST BE at the end of line!!! => Else ... topic and his text are not in the same line!!!
761 for ( size_t n
= 0; n
< maTextlist_Top
.size(); ++n
)
763 IMPL_TextlistItem
* pSearchItem
= maTextlist_Top
[ n
];
764 aCollectString
+= pSearchItem
->sText
;
765 aCollectString
+= "\n";
768 m_xText_Top
->setText ( aCollectString
);
771 // Rebuild fixedtext below progress
773 // Rebuild left site of text
774 if (m_xTopic_Bottom
.is())
776 OUString aCollectString
;
778 // Collect all topics from list and format text.
779 // "\n" MUST BE at the end of line!!! => Else ... topic and his text are not in the same line!!!
780 for ( size_t n
= 0; n
< maTextlist_Bottom
.size(); ++n
)
782 IMPL_TextlistItem
* pSearchItem
= maTextlist_Bottom
[ n
];
783 aCollectString
+= pSearchItem
->sTopic
;
784 aCollectString
+= "\n";
787 m_xTopic_Bottom
->setText ( aCollectString
);
790 // Rebuild right site of text
791 if (m_xText_Bottom
.is())
793 OUString aCollectString
;
795 // Collect all topics from list and format text.
796 // "\n" MUST BE at the end of line!!! => Else ... topic and his text are not in the same line!!!
797 for ( size_t n
= 0; n
< maTextlist_Bottom
.size(); ++n
)
799 IMPL_TextlistItem
* pSearchItem
= maTextlist_Bottom
[ n
];
800 aCollectString
+= pSearchItem
->sText
;
801 aCollectString
+= "\n";
804 m_xText_Bottom
->setText ( aCollectString
);
809 void ProgressMonitor::impl_cleanMemory ()
811 // Ready for multithreading
812 MutexGuard
aGuard ( m_aMutex
);
814 // Delete all of lists.
816 for ( size_t nPosition
= 0; nPosition
< maTextlist_Top
.size(); ++nPosition
)
818 IMPL_TextlistItem
* pSearchItem
= maTextlist_Top
[ nPosition
];
821 maTextlist_Top
.clear();
823 for ( size_t nPosition
= 0; nPosition
< maTextlist_Bottom
.size(); ++nPosition
)
825 IMPL_TextlistItem
* pSearchItem
= maTextlist_Bottom
[ nPosition
];
828 maTextlist_Bottom
.clear();
832 IMPL_TextlistItem
* ProgressMonitor::impl_searchTopic ( const OUString
& rTopic
, bool bbeforeProgress
)
834 // Get right textlist for following operations.
835 ::std::vector
< IMPL_TextlistItem
* >* pTextList
;
837 // Ready for multithreading
838 ClearableMutexGuard
aGuard ( m_aMutex
);
840 if ( bbeforeProgress
)
842 pTextList
= &maTextlist_Top
;
846 pTextList
= &maTextlist_Bottom
;
852 // Search the topic in textlist.
853 size_t nPosition
= 0;
854 size_t nCount
= pTextList
->size();
856 for ( nPosition
= 0; nPosition
< nCount
; ++nPosition
)
858 IMPL_TextlistItem
* pSearchItem
= pTextList
->at( nPosition
);
860 if ( pSearchItem
->sTopic
== rTopic
)
862 // We have found this topic... return a valid pointer.
867 // We haven't found this topic... return a nonvalid pointer.
874 // addText, updateText
875 bool ProgressMonitor::impl_debug_checkParameter (
876 const OUString
& rTopic
,
877 const OUString
& rText
,
878 bool /*bbeforeProgress*/
880 if ( rTopic
.isEmpty() ) return false; // ""
882 if ( rText
.isEmpty() ) return false; // ""
884 // "bbeforeProgress" is valid in everyway!
886 // Parameter OK ... return true.
891 bool ProgressMonitor::impl_debug_checkParameter ( const OUString
& rTopic
, bool /*bbeforeProgress*/ )
893 if ( rTopic
.isEmpty() ) return false; // ""
895 // "bbeforeProgress" is valid in everyway!
897 // Parameter OK ... return true.
901 #endif // #ifdef DBG_UTIL
903 } // namespace unocontrols
905 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */