1*5900e8ecSAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
3*5900e8ecSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4*5900e8ecSAndrew Rist * or more contributor license agreements. See the NOTICE file
5*5900e8ecSAndrew Rist * distributed with this work for additional information
6*5900e8ecSAndrew Rist * regarding copyright ownership. The ASF licenses this file
7*5900e8ecSAndrew Rist * to you under the Apache License, Version 2.0 (the
8*5900e8ecSAndrew Rist * "License"); you may not use this file except in compliance
9*5900e8ecSAndrew Rist * with the License. You may obtain a copy of the License at
10cdf0e10cSrcweir *
11*5900e8ecSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir *
13*5900e8ecSAndrew Rist * Unless required by applicable law or agreed to in writing,
14*5900e8ecSAndrew Rist * software distributed under the License is distributed on an
15*5900e8ecSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*5900e8ecSAndrew Rist * KIND, either express or implied. See the License for the
17*5900e8ecSAndrew Rist * specific language governing permissions and limitations
18*5900e8ecSAndrew Rist * under the License.
19cdf0e10cSrcweir *
20*5900e8ecSAndrew Rist *************************************************************/
21*5900e8ecSAndrew Rist
22*5900e8ecSAndrew Rist
23cdf0e10cSrcweir
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_svtools.hxx"
26cdf0e10cSrcweir
27cdf0e10cSrcweir #define _SV_PRGSBAR_CXX
28cdf0e10cSrcweir
29cdf0e10cSrcweir #include <tools/debug.hxx>
30cdf0e10cSrcweir #include <vcl/status.hxx>
31cdf0e10cSrcweir #include <svtools/prgsbar.hxx>
32cdf0e10cSrcweir
33cdf0e10cSrcweir // =======================================================================
34cdf0e10cSrcweir
35cdf0e10cSrcweir #define PROGRESSBAR_OFFSET 3
36cdf0e10cSrcweir #define PROGRESSBAR_WIN_OFFSET 2
37cdf0e10cSrcweir
38cdf0e10cSrcweir // =======================================================================
39cdf0e10cSrcweir
ImplInit()40cdf0e10cSrcweir void ProgressBar::ImplInit()
41cdf0e10cSrcweir {
42cdf0e10cSrcweir mnPercent = 0;
43cdf0e10cSrcweir mbCalcNew = sal_True;
44cdf0e10cSrcweir
45cdf0e10cSrcweir ImplInitSettings( sal_True, sal_True, sal_True );
46cdf0e10cSrcweir }
47cdf0e10cSrcweir
clearProgressBarBorder(Window * pParent,WinBits nOrgStyle)48cdf0e10cSrcweir static WinBits clearProgressBarBorder( Window* pParent, WinBits nOrgStyle )
49cdf0e10cSrcweir {
50cdf0e10cSrcweir WinBits nOutStyle = nOrgStyle;
51cdf0e10cSrcweir if( pParent && (nOrgStyle & WB_BORDER) != 0 )
52cdf0e10cSrcweir {
53cdf0e10cSrcweir if( pParent->IsNativeControlSupported( CTRL_PROGRESS, PART_ENTIRE_CONTROL ) )
54cdf0e10cSrcweir nOutStyle &= WB_BORDER;
55cdf0e10cSrcweir }
56cdf0e10cSrcweir return nOutStyle;
57cdf0e10cSrcweir }
58cdf0e10cSrcweir
59cdf0e10cSrcweir // -----------------------------------------------------------------------
60cdf0e10cSrcweir
ProgressBar(Window * pParent,WinBits nWinStyle)61cdf0e10cSrcweir ProgressBar::ProgressBar( Window* pParent, WinBits nWinStyle ) :
62cdf0e10cSrcweir Window( pParent, clearProgressBarBorder( pParent, nWinStyle ) )
63cdf0e10cSrcweir {
64cdf0e10cSrcweir SetOutputSizePixel( Size( 150, 20 ) );
65cdf0e10cSrcweir ImplInit();
66cdf0e10cSrcweir }
67cdf0e10cSrcweir
68cdf0e10cSrcweir // -----------------------------------------------------------------------
69cdf0e10cSrcweir
ProgressBar(Window * pParent,const ResId & rResId)70cdf0e10cSrcweir ProgressBar::ProgressBar( Window* pParent, const ResId& rResId ) :
71cdf0e10cSrcweir Window( pParent, rResId )
72cdf0e10cSrcweir {
73cdf0e10cSrcweir ImplInit();
74cdf0e10cSrcweir }
75cdf0e10cSrcweir
76cdf0e10cSrcweir // -----------------------------------------------------------------------
77cdf0e10cSrcweir
~ProgressBar()78cdf0e10cSrcweir ProgressBar::~ProgressBar()
79cdf0e10cSrcweir {
80cdf0e10cSrcweir }
81cdf0e10cSrcweir
82cdf0e10cSrcweir // -----------------------------------------------------------------------
83cdf0e10cSrcweir
ImplInitSettings(sal_Bool bFont,sal_Bool bForeground,sal_Bool bBackground)84cdf0e10cSrcweir void ProgressBar::ImplInitSettings( sal_Bool bFont,
85cdf0e10cSrcweir sal_Bool bForeground, sal_Bool bBackground )
86cdf0e10cSrcweir {
87cdf0e10cSrcweir const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
88cdf0e10cSrcweir
89cdf0e10cSrcweir /* !!! Derzeit unterstuetzen wir keine Textausgaben
90cdf0e10cSrcweir if ( bFont )
91cdf0e10cSrcweir {
92cdf0e10cSrcweir Font aFont;
93cdf0e10cSrcweir aFont = rStyleSettings.GetAppFont();
94cdf0e10cSrcweir if ( IsControlFont() )
95cdf0e10cSrcweir aFont.Merge( GetControlFont() );
96cdf0e10cSrcweir SetZoomedPointFont( aFont );
97cdf0e10cSrcweir }
98cdf0e10cSrcweir */
99cdf0e10cSrcweir
100cdf0e10cSrcweir if ( bBackground )
101cdf0e10cSrcweir {
102cdf0e10cSrcweir if( !IsControlBackground() &&
103cdf0e10cSrcweir IsNativeControlSupported( CTRL_PROGRESS, PART_ENTIRE_CONTROL ) )
104cdf0e10cSrcweir {
105cdf0e10cSrcweir if( (GetStyle() & WB_BORDER) )
106cdf0e10cSrcweir SetBorderStyle( WINDOW_BORDER_REMOVEBORDER );
107cdf0e10cSrcweir EnableChildTransparentMode( sal_True );
108cdf0e10cSrcweir SetPaintTransparent( sal_True );
109cdf0e10cSrcweir SetBackground();
110cdf0e10cSrcweir SetParentClipMode( PARENTCLIPMODE_NOCLIP );
111cdf0e10cSrcweir }
112cdf0e10cSrcweir else
113cdf0e10cSrcweir {
114cdf0e10cSrcweir Color aColor;
115cdf0e10cSrcweir if ( IsControlBackground() )
116cdf0e10cSrcweir aColor = GetControlBackground();
117cdf0e10cSrcweir else
118cdf0e10cSrcweir aColor = rStyleSettings.GetFaceColor();
119cdf0e10cSrcweir SetBackground( aColor );
120cdf0e10cSrcweir }
121cdf0e10cSrcweir }
122cdf0e10cSrcweir
123cdf0e10cSrcweir if ( bForeground || bFont )
124cdf0e10cSrcweir {
125cdf0e10cSrcweir Color aColor = rStyleSettings.GetHighlightColor();
126cdf0e10cSrcweir if ( IsControlForeground() )
127cdf0e10cSrcweir aColor = GetControlForeground();
128cdf0e10cSrcweir if ( aColor.IsRGBEqual( GetBackground().GetColor() ) )
129cdf0e10cSrcweir {
130cdf0e10cSrcweir if ( aColor.GetLuminance() > 100 )
131cdf0e10cSrcweir aColor.DecreaseLuminance( 64 );
132cdf0e10cSrcweir else
133cdf0e10cSrcweir aColor.IncreaseLuminance( 64 );
134cdf0e10cSrcweir }
135cdf0e10cSrcweir SetLineColor();
136cdf0e10cSrcweir SetFillColor( aColor );
137cdf0e10cSrcweir /* !!! Derzeit unterstuetzen wir keine Textausgaben
138cdf0e10cSrcweir SetTextColor( aColor );
139cdf0e10cSrcweir SetTextFillColor();
140cdf0e10cSrcweir */
141cdf0e10cSrcweir }
142cdf0e10cSrcweir }
143cdf0e10cSrcweir
144cdf0e10cSrcweir // -----------------------------------------------------------------------
145cdf0e10cSrcweir
ImplDrawProgress(sal_uInt16 nOldPerc,sal_uInt16 nNewPerc)146cdf0e10cSrcweir void ProgressBar::ImplDrawProgress( sal_uInt16 nOldPerc, sal_uInt16 nNewPerc )
147cdf0e10cSrcweir {
148cdf0e10cSrcweir if ( mbCalcNew )
149cdf0e10cSrcweir {
150cdf0e10cSrcweir mbCalcNew = sal_False;
151cdf0e10cSrcweir
152cdf0e10cSrcweir Size aSize = GetOutputSizePixel();
153cdf0e10cSrcweir mnPrgsHeight = aSize.Height()-(PROGRESSBAR_WIN_OFFSET*2);
154cdf0e10cSrcweir mnPrgsWidth = (mnPrgsHeight*2)/3;
155cdf0e10cSrcweir maPos.Y() = PROGRESSBAR_WIN_OFFSET;
156cdf0e10cSrcweir long nMaxWidth = (aSize.Width()-(PROGRESSBAR_WIN_OFFSET*2)+PROGRESSBAR_OFFSET);
157cdf0e10cSrcweir sal_uInt16 nMaxCount = (sal_uInt16)(nMaxWidth / (mnPrgsWidth+PROGRESSBAR_OFFSET));
158cdf0e10cSrcweir if ( nMaxCount <= 1 )
159cdf0e10cSrcweir nMaxCount = 1;
160cdf0e10cSrcweir else
161cdf0e10cSrcweir {
162cdf0e10cSrcweir while ( ((10000/(10000/nMaxCount))*(mnPrgsWidth+PROGRESSBAR_OFFSET)) > nMaxWidth )
163cdf0e10cSrcweir nMaxCount--;
164cdf0e10cSrcweir }
165cdf0e10cSrcweir mnPercentCount = 10000/nMaxCount;
166cdf0e10cSrcweir nMaxWidth = ((10000/(10000/nMaxCount))*(mnPrgsWidth+PROGRESSBAR_OFFSET))-PROGRESSBAR_OFFSET;
167cdf0e10cSrcweir maPos.X() = (aSize.Width()-nMaxWidth)/2;
168cdf0e10cSrcweir }
169cdf0e10cSrcweir
170cdf0e10cSrcweir ::DrawProgress( this, maPos, PROGRESSBAR_OFFSET, mnPrgsWidth, mnPrgsHeight,
171cdf0e10cSrcweir nOldPerc*100, nNewPerc*100, mnPercentCount,
172cdf0e10cSrcweir Rectangle( Point(), GetSizePixel() ) );
173cdf0e10cSrcweir }
174cdf0e10cSrcweir
175cdf0e10cSrcweir // -----------------------------------------------------------------------
176cdf0e10cSrcweir
Paint(const Rectangle &)177cdf0e10cSrcweir void ProgressBar::Paint( const Rectangle& )
178cdf0e10cSrcweir {
179cdf0e10cSrcweir ImplDrawProgress( 0, mnPercent );
180cdf0e10cSrcweir }
181cdf0e10cSrcweir
182cdf0e10cSrcweir // -----------------------------------------------------------------------
183cdf0e10cSrcweir
Resize()184cdf0e10cSrcweir void ProgressBar::Resize()
185cdf0e10cSrcweir {
186cdf0e10cSrcweir mbCalcNew = sal_True;
187cdf0e10cSrcweir if ( IsReallyVisible() )
188cdf0e10cSrcweir Invalidate();
189cdf0e10cSrcweir }
190cdf0e10cSrcweir
191cdf0e10cSrcweir // -----------------------------------------------------------------------
192cdf0e10cSrcweir
SetValue(sal_uInt16 nNewPercent)193cdf0e10cSrcweir void ProgressBar::SetValue( sal_uInt16 nNewPercent )
194cdf0e10cSrcweir {
195cdf0e10cSrcweir DBG_ASSERTWARNING( nNewPercent <= 100, "StatusBar::SetProgressValue(): nPercent > 100" );
196cdf0e10cSrcweir
197cdf0e10cSrcweir if ( nNewPercent < mnPercent )
198cdf0e10cSrcweir {
199cdf0e10cSrcweir mbCalcNew = sal_True;
200cdf0e10cSrcweir mnPercent = nNewPercent;
201cdf0e10cSrcweir if ( IsReallyVisible() )
202cdf0e10cSrcweir {
203cdf0e10cSrcweir Invalidate();
204cdf0e10cSrcweir Update();
205cdf0e10cSrcweir }
206cdf0e10cSrcweir }
207cdf0e10cSrcweir else
208cdf0e10cSrcweir {
209cdf0e10cSrcweir ImplDrawProgress( mnPercent, nNewPercent );
210cdf0e10cSrcweir mnPercent = nNewPercent;
211cdf0e10cSrcweir }
212cdf0e10cSrcweir }
213cdf0e10cSrcweir
214cdf0e10cSrcweir // -----------------------------------------------------------------------
215cdf0e10cSrcweir
StateChanged(StateChangedType nType)216cdf0e10cSrcweir void ProgressBar::StateChanged( StateChangedType nType )
217cdf0e10cSrcweir {
218cdf0e10cSrcweir /* !!! Derzeit unterstuetzen wir keine Textausgaben
219cdf0e10cSrcweir if ( (nType == STATE_CHANGE_ZOOM) ||
220cdf0e10cSrcweir (nType == STATE_CHANGE_CONTROLFONT) )
221cdf0e10cSrcweir {
222cdf0e10cSrcweir ImplInitSettings( sal_True, sal_False, sal_False );
223cdf0e10cSrcweir Invalidate();
224cdf0e10cSrcweir }
225cdf0e10cSrcweir else
226cdf0e10cSrcweir */
227cdf0e10cSrcweir if ( nType == STATE_CHANGE_CONTROLFOREGROUND )
228cdf0e10cSrcweir {
229cdf0e10cSrcweir ImplInitSettings( sal_False, sal_True, sal_False );
230cdf0e10cSrcweir Invalidate();
231cdf0e10cSrcweir }
232cdf0e10cSrcweir else if ( nType == STATE_CHANGE_CONTROLBACKGROUND )
233cdf0e10cSrcweir {
234cdf0e10cSrcweir ImplInitSettings( sal_False, sal_False, sal_True );
235cdf0e10cSrcweir Invalidate();
236cdf0e10cSrcweir }
237cdf0e10cSrcweir
238cdf0e10cSrcweir Window::StateChanged( nType );
239cdf0e10cSrcweir }
240cdf0e10cSrcweir
241cdf0e10cSrcweir // -----------------------------------------------------------------------
242cdf0e10cSrcweir
DataChanged(const DataChangedEvent & rDCEvt)243cdf0e10cSrcweir void ProgressBar::DataChanged( const DataChangedEvent& rDCEvt )
244cdf0e10cSrcweir {
245cdf0e10cSrcweir if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
246cdf0e10cSrcweir (rDCEvt.GetFlags() & SETTINGS_STYLE) )
247cdf0e10cSrcweir {
248cdf0e10cSrcweir ImplInitSettings( sal_True, sal_True, sal_True );
249cdf0e10cSrcweir Invalidate();
250cdf0e10cSrcweir }
251cdf0e10cSrcweir
252cdf0e10cSrcweir Window::DataChanged( rDCEvt );
253cdf0e10cSrcweir }
254cdf0e10cSrcweir
255