/************************************************************** * * 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. * *************************************************************/ #ifndef SC_PROGRESS_HXX #define SC_PROGRESS_HXX #include #include "scdllapi.h" class ScDocument; /* * #i102566 * Drawing a progress bar update is not cheap, so if we draw it on every * percentage change of 200 calculations we get one progress draw per 2 * calculations which is slower than doing the calculations themselves. So as a * rough guide only do an update per MIN_NO_CODES_PER_PROGRESS_UPDATE * calculations */ #define MIN_NO_CODES_PER_PROGRESS_UPDATE 100 class SC_DLLPUBLIC ScProgress { private: static SfxProgress* pGlobalProgress; static sal_uLong nGlobalRange; static sal_uLong nGlobalPercent; static sal_Bool bGlobalNoUserBreak; static ScProgress* pInterpretProgress; static ScProgress* pOldInterpretProgress; static sal_uLong nInterpretProgress; static sal_Bool bAllowInterpretProgress; static ScDocument* pInterpretDoc; static sal_Bool bIdleWasDisabled; SfxProgress* pProgress; // not implemented ScProgress( const ScProgress& ); ScProgress& operator=( const ScProgress& ); static void CalcGlobalPercent( sal_uLong nVal ) { nGlobalPercent = nGlobalRange ? nVal * 100 / nGlobalRange : 0; } public: static SfxProgress* GetGlobalSfxProgress() { return pGlobalProgress; } static sal_Bool IsUserBreak() { return !bGlobalNoUserBreak; } static void CreateInterpretProgress( ScDocument* pDoc, sal_Bool bWait = sal_True ); static ScProgress* GetInterpretProgress() { return pInterpretProgress; } static void DeleteInterpretProgress(); static sal_uLong GetInterpretCount() { return nInterpretProgress; } static sal_uLong GetGlobalRange() { return nGlobalRange; } static sal_uLong GetGlobalPercent() { return nGlobalPercent; } ScProgress( SfxObjectShell* pObjSh, const String& rText, sal_uLong nRange, sal_Bool bAllDocs = sal_False, sal_Bool bWait = sal_True ); ~ScProgress(); #ifdef SC_PROGRESS_CXX // nur fuer DummyInterpret, sonst nie benutzen!!! ScProgress(); #endif // kann NULL sein! SfxProgress* GetSfxProgress() const { return pProgress; } sal_Bool SetStateText( sal_uLong nVal, const String &rVal, sal_uLong nNewRange = 0 ) { if ( pProgress ) { if ( nNewRange ) nGlobalRange = nNewRange; CalcGlobalPercent( nVal ); if ( !pProgress->SetStateText( nVal, rVal, nNewRange ) ) bGlobalNoUserBreak = sal_False; return bGlobalNoUserBreak; } return sal_True; } sal_Bool SetState( sal_uLong nVal, sal_uLong nNewRange = 0 ) { if ( pProgress ) { if ( nNewRange ) nGlobalRange = nNewRange; CalcGlobalPercent( nVal ); if ( !pProgress->SetState( nVal, nNewRange ) ) bGlobalNoUserBreak = sal_False; return bGlobalNoUserBreak; } return sal_True; } sal_Bool SetStateCountDown( sal_uLong nVal ) { if ( pProgress ) { CalcGlobalPercent( nGlobalRange - nVal ); if ( !pProgress->SetState( nGlobalRange - nVal ) ) bGlobalNoUserBreak = sal_False; return bGlobalNoUserBreak; } return sal_True; } sal_Bool SetStateOnPercent( sal_uLong nVal ) { // nur wenn Prozent mehr als vorher if ( nGlobalRange && (nVal * 100 / nGlobalRange) > nGlobalPercent ) return SetState( nVal ); return sal_True; } sal_Bool SetStateCountDownOnPercent( sal_uLong nVal ) { // nur wenn Prozent mehr als vorher if ( nGlobalRange && ((nGlobalRange - nVal) * 100 / nGlobalRange) > nGlobalPercent ) return SetStateCountDown( nVal ); return sal_True; } sal_uLong GetState() { if ( pProgress ) return pProgress->GetState(); return 0; } }; #endif