1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 #ifndef SC_PROGRESS_HXX 25 #define SC_PROGRESS_HXX 26 27 #include <sfx2/progress.hxx> 28 #include "scdllapi.h" 29 30 class ScDocument; 31 32 /* 33 * #i102566 34 * Drawing a progress bar update is not cheap, so if we draw it on every 35 * percentage change of 200 calculations we get one progress draw per 2 36 * calculations which is slower than doing the calculations themselves. So as a 37 * rough guide only do an update per MIN_NO_CODES_PER_PROGRESS_UPDATE 38 * calculations 39 */ 40 #define MIN_NO_CODES_PER_PROGRESS_UPDATE 100 41 42 43 class SC_DLLPUBLIC ScProgress 44 { 45 private: 46 static SfxProgress* pGlobalProgress; 47 static sal_uLong nGlobalRange; 48 static sal_uLong nGlobalPercent; 49 static sal_Bool bGlobalNoUserBreak; 50 static ScProgress* pInterpretProgress; 51 static ScProgress* pOldInterpretProgress; 52 static sal_uLong nInterpretProgress; 53 static sal_Bool bAllowInterpretProgress; 54 static ScDocument* pInterpretDoc; 55 static sal_Bool bIdleWasDisabled; 56 57 SfxProgress* pProgress; 58 59 // not implemented 60 ScProgress( const ScProgress& ); 61 ScProgress& operator=( const ScProgress& ); 62 CalcGlobalPercent(sal_uLong nVal)63 static void CalcGlobalPercent( sal_uLong nVal ) 64 { 65 nGlobalPercent = nGlobalRange ? 66 nVal * 100 / nGlobalRange : 0; 67 } 68 69 public: GetGlobalSfxProgress()70 static SfxProgress* GetGlobalSfxProgress() { return pGlobalProgress; } IsUserBreak()71 static sal_Bool IsUserBreak() { return !bGlobalNoUserBreak; } 72 static void CreateInterpretProgress( ScDocument* pDoc, 73 sal_Bool bWait = sal_True ); GetInterpretProgress()74 static ScProgress* GetInterpretProgress() { return pInterpretProgress; } 75 static void DeleteInterpretProgress(); GetInterpretCount()76 static sal_uLong GetInterpretCount() { return nInterpretProgress; } GetGlobalRange()77 static sal_uLong GetGlobalRange() { return nGlobalRange; } GetGlobalPercent()78 static sal_uLong GetGlobalPercent() { return nGlobalPercent; } 79 80 ScProgress( SfxObjectShell* pObjSh, 81 const String& rText, 82 sal_uLong nRange, sal_Bool bAllDocs = sal_False, 83 sal_Bool bWait = sal_True ); 84 ~ScProgress(); 85 86 #ifdef SC_PROGRESS_CXX 87 // nur fuer DummyInterpret, sonst nie benutzen!!! 88 ScProgress(); 89 #endif 90 // kann NULL sein! GetSfxProgress() const91 SfxProgress* GetSfxProgress() const { return pProgress; } 92 SetStateText(sal_uLong nVal,const String & rVal,sal_uLong nNewRange=0)93 sal_Bool SetStateText( sal_uLong nVal, const String &rVal, sal_uLong nNewRange = 0 ) 94 { 95 if ( pProgress ) 96 { 97 if ( nNewRange ) 98 nGlobalRange = nNewRange; 99 CalcGlobalPercent( nVal ); 100 if ( !pProgress->SetStateText( nVal, rVal, nNewRange ) ) 101 bGlobalNoUserBreak = sal_False; 102 return bGlobalNoUserBreak; 103 } 104 return sal_True; 105 } SetState(sal_uLong nVal,sal_uLong nNewRange=0)106 sal_Bool SetState( sal_uLong nVal, sal_uLong nNewRange = 0 ) 107 { 108 if ( pProgress ) 109 { 110 if ( nNewRange ) 111 nGlobalRange = nNewRange; 112 CalcGlobalPercent( nVal ); 113 if ( !pProgress->SetState( nVal, nNewRange ) ) 114 bGlobalNoUserBreak = sal_False; 115 return bGlobalNoUserBreak; 116 } 117 return sal_True; 118 } SetStateCountDown(sal_uLong nVal)119 sal_Bool SetStateCountDown( sal_uLong nVal ) 120 { 121 if ( pProgress ) 122 { 123 CalcGlobalPercent( nGlobalRange - nVal ); 124 if ( !pProgress->SetState( nGlobalRange - nVal ) ) 125 bGlobalNoUserBreak = sal_False; 126 return bGlobalNoUserBreak; 127 } 128 return sal_True; 129 } SetStateOnPercent(sal_uLong nVal)130 sal_Bool SetStateOnPercent( sal_uLong nVal ) 131 { // nur wenn Prozent mehr als vorher 132 if ( nGlobalRange && (nVal * 100 / 133 nGlobalRange) > nGlobalPercent ) 134 return SetState( nVal ); 135 return sal_True; 136 } SetStateCountDownOnPercent(sal_uLong nVal)137 sal_Bool SetStateCountDownOnPercent( sal_uLong nVal ) 138 { // nur wenn Prozent mehr als vorher 139 if ( nGlobalRange && 140 ((nGlobalRange - nVal) * 100 / 141 nGlobalRange) > nGlobalPercent ) 142 return SetStateCountDown( nVal ); 143 return sal_True; 144 } GetState()145 sal_uLong GetState() 146 { 147 if ( pProgress ) 148 return pProgress->GetState(); 149 return 0; 150 } 151 }; 152 153 154 #endif 155 156