xref: /aoo41x/main/oox/source/helper/progressbar.cxx (revision ca5ec200)
1*ca5ec200SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*ca5ec200SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*ca5ec200SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*ca5ec200SAndrew Rist  * distributed with this work for additional information
6*ca5ec200SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*ca5ec200SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*ca5ec200SAndrew Rist  * "License"); you may not use this file except in compliance
9*ca5ec200SAndrew Rist  * with the License.  You may obtain a copy of the License at
10*ca5ec200SAndrew Rist  *
11*ca5ec200SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*ca5ec200SAndrew Rist  *
13*ca5ec200SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*ca5ec200SAndrew Rist  * software distributed under the License is distributed on an
15*ca5ec200SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*ca5ec200SAndrew Rist  * KIND, either express or implied.  See the License for the
17*ca5ec200SAndrew Rist  * specific language governing permissions and limitations
18*ca5ec200SAndrew Rist  * under the License.
19*ca5ec200SAndrew Rist  *
20*ca5ec200SAndrew Rist  *************************************************************/
21*ca5ec200SAndrew Rist 
22*ca5ec200SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir #include "oox/helper/progressbar.hxx"
25cdf0e10cSrcweir 
26cdf0e10cSrcweir #include <com/sun/star/task/XStatusIndicator.hpp>
27cdf0e10cSrcweir #include "oox/helper/helper.hxx"
28cdf0e10cSrcweir 
29cdf0e10cSrcweir namespace oox {
30cdf0e10cSrcweir 
31cdf0e10cSrcweir // ============================================================================
32cdf0e10cSrcweir 
33cdf0e10cSrcweir using namespace ::com::sun::star::task;
34cdf0e10cSrcweir using namespace ::com::sun::star::uno;
35cdf0e10cSrcweir 
36cdf0e10cSrcweir using ::rtl::OUString;
37cdf0e10cSrcweir 
38cdf0e10cSrcweir namespace {
39cdf0e10cSrcweir 
40cdf0e10cSrcweir const sal_Int32 PROGRESS_RANGE      = 1000000;
41cdf0e10cSrcweir 
42cdf0e10cSrcweir } // namespace
43cdf0e10cSrcweir 
44cdf0e10cSrcweir // ============================================================================
45cdf0e10cSrcweir 
~IProgressBar()46cdf0e10cSrcweir IProgressBar::~IProgressBar()
47cdf0e10cSrcweir {
48cdf0e10cSrcweir }
49cdf0e10cSrcweir 
50cdf0e10cSrcweir // ----------------------------------------------------------------------------
51cdf0e10cSrcweir 
~ISegmentProgressBar()52cdf0e10cSrcweir ISegmentProgressBar::~ISegmentProgressBar()
53cdf0e10cSrcweir {
54cdf0e10cSrcweir }
55cdf0e10cSrcweir 
56cdf0e10cSrcweir // ============================================================================
57cdf0e10cSrcweir // ============================================================================
58cdf0e10cSrcweir 
ProgressBar(const Reference<XStatusIndicator> & rxIndicator,const OUString & rText)59cdf0e10cSrcweir ProgressBar::ProgressBar( const Reference< XStatusIndicator >& rxIndicator, const OUString& rText ) :
60cdf0e10cSrcweir     mxIndicator( rxIndicator ),
61cdf0e10cSrcweir     mfPosition( 0 )
62cdf0e10cSrcweir {
63cdf0e10cSrcweir     if( mxIndicator.is() )
64cdf0e10cSrcweir         mxIndicator->start( rText, PROGRESS_RANGE );
65cdf0e10cSrcweir }
66cdf0e10cSrcweir 
~ProgressBar()67cdf0e10cSrcweir ProgressBar::~ProgressBar()
68cdf0e10cSrcweir {
69cdf0e10cSrcweir     if( mxIndicator.is() )
70cdf0e10cSrcweir         mxIndicator->end();
71cdf0e10cSrcweir }
72cdf0e10cSrcweir 
getPosition() const73cdf0e10cSrcweir double ProgressBar::getPosition() const
74cdf0e10cSrcweir {
75cdf0e10cSrcweir     return mfPosition;
76cdf0e10cSrcweir }
77cdf0e10cSrcweir 
setPosition(double fPosition)78cdf0e10cSrcweir void ProgressBar::setPosition( double fPosition )
79cdf0e10cSrcweir {
80cdf0e10cSrcweir     OSL_ENSURE( (mfPosition <= fPosition) && (fPosition <= 1.0), "ProgressBar::setPosition - invalid position" );
81cdf0e10cSrcweir     mfPosition = getLimitedValue< double >( fPosition, mfPosition, 1.0 );
82cdf0e10cSrcweir     if( mxIndicator.is() )
83cdf0e10cSrcweir         mxIndicator->setValue( static_cast< sal_Int32 >( mfPosition * PROGRESS_RANGE ) );
84cdf0e10cSrcweir }
85cdf0e10cSrcweir 
86cdf0e10cSrcweir // ============================================================================
87cdf0e10cSrcweir 
88cdf0e10cSrcweir namespace prv {
89cdf0e10cSrcweir 
90cdf0e10cSrcweir class SubSegment : public ISegmentProgressBar
91cdf0e10cSrcweir {
92cdf0e10cSrcweir public:
93cdf0e10cSrcweir     explicit            SubSegment( IProgressBar& rParentProgress, double fStartPos, double fLength );
94cdf0e10cSrcweir 
95cdf0e10cSrcweir     virtual double      getPosition() const;
96cdf0e10cSrcweir     virtual void        setPosition( double fPosition );
97cdf0e10cSrcweir 
98cdf0e10cSrcweir     virtual double      getFreeLength() const;
99cdf0e10cSrcweir     virtual ISegmentProgressBarRef createSegment( double fLength );
100cdf0e10cSrcweir 
101cdf0e10cSrcweir private:
102cdf0e10cSrcweir     IProgressBar&       mrParentProgress;
103cdf0e10cSrcweir     double              mfStartPos;
104cdf0e10cSrcweir     double              mfLength;
105cdf0e10cSrcweir     double              mfPosition;
106cdf0e10cSrcweir     double              mfFreeStart;
107cdf0e10cSrcweir };
108cdf0e10cSrcweir 
109cdf0e10cSrcweir // ----------------------------------------------------------------------------
110cdf0e10cSrcweir 
SubSegment(IProgressBar & rParentProgress,double fStartPos,double fLength)111cdf0e10cSrcweir SubSegment::SubSegment( IProgressBar& rParentProgress, double fStartPos, double fLength ) :
112cdf0e10cSrcweir     mrParentProgress( rParentProgress ),
113cdf0e10cSrcweir     mfStartPos( fStartPos ),
114cdf0e10cSrcweir     mfLength( fLength ),
115cdf0e10cSrcweir     mfPosition( 0.0 ),
116cdf0e10cSrcweir     mfFreeStart( 0.0 )
117cdf0e10cSrcweir {
118cdf0e10cSrcweir }
119cdf0e10cSrcweir 
getPosition() const120cdf0e10cSrcweir double SubSegment::getPosition() const
121cdf0e10cSrcweir {
122cdf0e10cSrcweir     return mfPosition;
123cdf0e10cSrcweir }
124cdf0e10cSrcweir 
setPosition(double fPosition)125cdf0e10cSrcweir void SubSegment::setPosition( double fPosition )
126cdf0e10cSrcweir {
127cdf0e10cSrcweir     OSL_ENSURE( (mfPosition <= fPosition) && (fPosition <= 1.0), "SubSegment::setPosition - invalid position" );
128cdf0e10cSrcweir     mfPosition = getLimitedValue< double >( fPosition, mfPosition, 1.0 );
129cdf0e10cSrcweir     mrParentProgress.setPosition( mfStartPos + mfPosition * mfLength );
130cdf0e10cSrcweir }
131cdf0e10cSrcweir 
getFreeLength() const132cdf0e10cSrcweir double SubSegment::getFreeLength() const
133cdf0e10cSrcweir {
134cdf0e10cSrcweir     return 1.0 - mfFreeStart;
135cdf0e10cSrcweir }
136cdf0e10cSrcweir 
createSegment(double fLength)137cdf0e10cSrcweir ISegmentProgressBarRef SubSegment::createSegment( double fLength )
138cdf0e10cSrcweir {
139cdf0e10cSrcweir     OSL_ENSURE( (0.0 < fLength) && (fLength <= getFreeLength()), "SubSegment::createSegment - invalid length" );
140cdf0e10cSrcweir     fLength = getLimitedValue< double >( fLength, 0.0, getFreeLength() );
141cdf0e10cSrcweir     ISegmentProgressBarRef xSegment( new prv::SubSegment( *this, mfFreeStart, fLength ) );
142cdf0e10cSrcweir     mfFreeStart += fLength;
143cdf0e10cSrcweir     return xSegment;
144cdf0e10cSrcweir }
145cdf0e10cSrcweir 
146cdf0e10cSrcweir } // namespace prv
147cdf0e10cSrcweir 
148cdf0e10cSrcweir // ============================================================================
149cdf0e10cSrcweir 
SegmentProgressBar(const Reference<XStatusIndicator> & rxIndicator,const OUString & rText)150cdf0e10cSrcweir SegmentProgressBar::SegmentProgressBar( const Reference< XStatusIndicator >& rxIndicator, const OUString& rText ) :
151cdf0e10cSrcweir     maProgress( rxIndicator, rText ),
152cdf0e10cSrcweir     mfFreeStart( 0.0 )
153cdf0e10cSrcweir {
154cdf0e10cSrcweir }
155cdf0e10cSrcweir 
getPosition() const156cdf0e10cSrcweir double SegmentProgressBar::getPosition() const
157cdf0e10cSrcweir {
158cdf0e10cSrcweir     return maProgress.getPosition();
159cdf0e10cSrcweir }
160cdf0e10cSrcweir 
setPosition(double fPosition)161cdf0e10cSrcweir void SegmentProgressBar::setPosition( double fPosition )
162cdf0e10cSrcweir {
163cdf0e10cSrcweir     maProgress.setPosition( fPosition );
164cdf0e10cSrcweir }
165cdf0e10cSrcweir 
getFreeLength() const166cdf0e10cSrcweir double SegmentProgressBar::getFreeLength() const
167cdf0e10cSrcweir {
168cdf0e10cSrcweir     return 1.0 - mfFreeStart;
169cdf0e10cSrcweir }
170cdf0e10cSrcweir 
createSegment(double fLength)171cdf0e10cSrcweir ISegmentProgressBarRef SegmentProgressBar::createSegment( double fLength )
172cdf0e10cSrcweir {
173cdf0e10cSrcweir     OSL_ENSURE( (0.0 < fLength) && (fLength <= getFreeLength()), "SegmentProgressBar::createSegment - invalid length" );
174cdf0e10cSrcweir     fLength = getLimitedValue< double >( fLength, 0.0, getFreeLength() );
175cdf0e10cSrcweir     ISegmentProgressBarRef xSegment( new prv::SubSegment( maProgress, mfFreeStart, fLength ) );
176cdf0e10cSrcweir     mfFreeStart += fLength;
177cdf0e10cSrcweir     return xSegment;
178cdf0e10cSrcweir }
179cdf0e10cSrcweir 
180cdf0e10cSrcweir // ============================================================================
181cdf0e10cSrcweir 
182cdf0e10cSrcweir } // namespace oox
183