| /************************************************************** |
| * |
| * 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 <sfx2/progress.hxx> |
| #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 |
| |