/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_svtools.hxx" #define _SV_PRGSBAR_CXX #include #include #include // ======================================================================= #define PROGRESSBAR_OFFSET 3 #define PROGRESSBAR_WIN_OFFSET 2 // ======================================================================= void ProgressBar::ImplInit() { mnPercent = 0; mbCalcNew = sal_True; ImplInitSettings( sal_True, sal_True, sal_True ); } static WinBits clearProgressBarBorder( Window* pParent, WinBits nOrgStyle ) { WinBits nOutStyle = nOrgStyle; if( pParent && (nOrgStyle & WB_BORDER) != 0 ) { if( pParent->IsNativeControlSupported( CTRL_PROGRESS, PART_ENTIRE_CONTROL ) ) nOutStyle &= WB_BORDER; } return nOutStyle; } // ----------------------------------------------------------------------- ProgressBar::ProgressBar( Window* pParent, WinBits nWinStyle ) : Window( pParent, clearProgressBarBorder( pParent, nWinStyle ) ) { SetOutputSizePixel( Size( 150, 20 ) ); ImplInit(); } // ----------------------------------------------------------------------- ProgressBar::ProgressBar( Window* pParent, const ResId& rResId ) : Window( pParent, rResId ) { ImplInit(); } // ----------------------------------------------------------------------- ProgressBar::~ProgressBar() { } // ----------------------------------------------------------------------- void ProgressBar::ImplInitSettings( sal_Bool bFont, sal_Bool bForeground, sal_Bool bBackground ) { const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings(); /* !!! Derzeit unterstuetzen wir keine Textausgaben if ( bFont ) { Font aFont; aFont = rStyleSettings.GetAppFont(); if ( IsControlFont() ) aFont.Merge( GetControlFont() ); SetZoomedPointFont( aFont ); } */ if ( bBackground ) { if( !IsControlBackground() && IsNativeControlSupported( CTRL_PROGRESS, PART_ENTIRE_CONTROL ) ) { if( (GetStyle() & WB_BORDER) ) SetBorderStyle( WINDOW_BORDER_REMOVEBORDER ); EnableChildTransparentMode( sal_True ); SetPaintTransparent( sal_True ); SetBackground(); SetParentClipMode( PARENTCLIPMODE_NOCLIP ); } else { Color aColor; if ( IsControlBackground() ) aColor = GetControlBackground(); else aColor = rStyleSettings.GetFaceColor(); SetBackground( aColor ); } } if ( bForeground || bFont ) { Color aColor = rStyleSettings.GetHighlightColor(); if ( IsControlForeground() ) aColor = GetControlForeground(); if ( aColor.IsRGBEqual( GetBackground().GetColor() ) ) { if ( aColor.GetLuminance() > 100 ) aColor.DecreaseLuminance( 64 ); else aColor.IncreaseLuminance( 64 ); } SetLineColor(); SetFillColor( aColor ); /* !!! Derzeit unterstuetzen wir keine Textausgaben SetTextColor( aColor ); SetTextFillColor(); */ } } // ----------------------------------------------------------------------- void ProgressBar::ImplDrawProgress( sal_uInt16 nOldPerc, sal_uInt16 nNewPerc ) { if ( mbCalcNew ) { mbCalcNew = sal_False; Size aSize = GetOutputSizePixel(); mnPrgsHeight = aSize.Height()-(PROGRESSBAR_WIN_OFFSET*2); mnPrgsWidth = (mnPrgsHeight*2)/3; maPos.Y() = PROGRESSBAR_WIN_OFFSET; long nMaxWidth = (aSize.Width()-(PROGRESSBAR_WIN_OFFSET*2)+PROGRESSBAR_OFFSET); sal_uInt16 nMaxCount = (sal_uInt16)(nMaxWidth / (mnPrgsWidth+PROGRESSBAR_OFFSET)); if ( nMaxCount <= 1 ) nMaxCount = 1; else { while ( ((10000/(10000/nMaxCount))*(mnPrgsWidth+PROGRESSBAR_OFFSET)) > nMaxWidth ) nMaxCount--; } mnPercentCount = 10000/nMaxCount; nMaxWidth = ((10000/(10000/nMaxCount))*(mnPrgsWidth+PROGRESSBAR_OFFSET))-PROGRESSBAR_OFFSET; maPos.X() = (aSize.Width()-nMaxWidth)/2; } ::DrawProgress( this, maPos, PROGRESSBAR_OFFSET, mnPrgsWidth, mnPrgsHeight, nOldPerc*100, nNewPerc*100, mnPercentCount, Rectangle( Point(), GetSizePixel() ) ); } // ----------------------------------------------------------------------- void ProgressBar::Paint( const Rectangle& ) { ImplDrawProgress( 0, mnPercent ); } // ----------------------------------------------------------------------- void ProgressBar::Resize() { mbCalcNew = sal_True; if ( IsReallyVisible() ) Invalidate(); } // ----------------------------------------------------------------------- void ProgressBar::SetValue( sal_uInt16 nNewPercent ) { DBG_ASSERTWARNING( nNewPercent <= 100, "StatusBar::SetProgressValue(): nPercent > 100" ); if ( nNewPercent < mnPercent ) { mbCalcNew = sal_True; mnPercent = nNewPercent; if ( IsReallyVisible() ) { Invalidate(); Update(); } } else { ImplDrawProgress( mnPercent, nNewPercent ); mnPercent = nNewPercent; } } // ----------------------------------------------------------------------- void ProgressBar::StateChanged( StateChangedType nType ) { /* !!! Derzeit unterstuetzen wir keine Textausgaben if ( (nType == STATE_CHANGE_ZOOM) || (nType == STATE_CHANGE_CONTROLFONT) ) { ImplInitSettings( sal_True, sal_False, sal_False ); Invalidate(); } else */ if ( nType == STATE_CHANGE_CONTROLFOREGROUND ) { ImplInitSettings( sal_False, sal_True, sal_False ); Invalidate(); } else if ( nType == STATE_CHANGE_CONTROLBACKGROUND ) { ImplInitSettings( sal_False, sal_False, sal_True ); Invalidate(); } Window::StateChanged( nType ); } // ----------------------------------------------------------------------- void ProgressBar::DataChanged( const DataChangedEvent& rDCEvt ) { if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) && (rDCEvt.GetFlags() & SETTINGS_STYLE) ) { ImplInitSettings( sal_True, sal_True, sal_True ); Invalidate(); } Window::DataChanged( rDCEvt ); }