office-gobmx/sc/inc/progress.hxx
2011-01-28 23:45:43 +01:00

161 lines
7.2 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*************************************************************************
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* Copyright 2000, 2010 Oracle and/or its affiliates.
*
* OpenOffice.org - a multi-platform office productivity suite
*
* This file is part of OpenOffice.org.
*
* OpenOffice.org is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenOffice.org is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenOffice.org. If not, see
* <http://www.openoffice.org/license.html>
* for a copy of the LGPLv3 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 ULONG nGlobalRange;
static ULONG nGlobalPercent;
static BOOL bGlobalNoUserBreak;
static ScProgress* pInterpretProgress;
static ScProgress* pOldInterpretProgress;
static ULONG nInterpretProgress;
static BOOL bAllowInterpretProgress;
static ScDocument* pInterpretDoc;
static BOOL bIdleWasDisabled;
SfxProgress* pProgress;
// not implemented
ScProgress( const ScProgress& );
ScProgress& operator=( const ScProgress& );
static void CalcGlobalPercent( ULONG nVal )
{
nGlobalPercent = nGlobalRange ?
nVal * 100 / nGlobalRange : 0;
}
public:
static SfxProgress* GetGlobalSfxProgress() { return pGlobalProgress; }
static BOOL IsUserBreak() { return !bGlobalNoUserBreak; }
static void CreateInterpretProgress( ScDocument* pDoc,
BOOL bWait = TRUE );
static ScProgress* GetInterpretProgress() { return pInterpretProgress; }
static void DeleteInterpretProgress();
static ULONG GetInterpretCount() { return nInterpretProgress; }
static ULONG GetGlobalRange() { return nGlobalRange; }
static ULONG GetGlobalPercent() { return nGlobalPercent; }
ScProgress( SfxObjectShell* pObjSh,
const String& rText,
ULONG nRange, BOOL bAllDocs = FALSE,
BOOL bWait = TRUE );
~ScProgress();
#ifdef SC_PROGRESS_CXX
// for DummyInterpret only, never use otherwise!!!
ScProgress();
#endif
// might be NULL!
SfxProgress* GetSfxProgress() const { return pProgress; }
BOOL SetStateText( ULONG nVal, const String &rVal, ULONG nNewRange = 0 )
{
if ( pProgress )
{
if ( nNewRange )
nGlobalRange = nNewRange;
CalcGlobalPercent( nVal );
if ( !pProgress->SetStateText( nVal, rVal, nNewRange ) )
bGlobalNoUserBreak = FALSE;
return bGlobalNoUserBreak;
}
return TRUE;
}
BOOL SetState( ULONG nVal, ULONG nNewRange = 0 )
{
if ( pProgress )
{
if ( nNewRange )
nGlobalRange = nNewRange;
CalcGlobalPercent( nVal );
if ( !pProgress->SetState( nVal, nNewRange ) )
bGlobalNoUserBreak = FALSE;
return bGlobalNoUserBreak;
}
return TRUE;
}
BOOL SetStateCountDown( ULONG nVal )
{
if ( pProgress )
{
CalcGlobalPercent( nGlobalRange - nVal );
if ( !pProgress->SetState( nGlobalRange - nVal ) )
bGlobalNoUserBreak = FALSE;
return bGlobalNoUserBreak;
}
return TRUE;
}
BOOL SetStateOnPercent( ULONG nVal )
{ // only if percentage increased
if ( nGlobalRange && (nVal * 100 /
nGlobalRange) > nGlobalPercent )
return SetState( nVal );
return TRUE;
}
BOOL SetStateCountDownOnPercent( ULONG nVal )
{ // only if percentage increased
if ( nGlobalRange &&
((nGlobalRange - nVal) * 100 /
nGlobalRange) > nGlobalPercent )
return SetStateCountDown( nVal );
return TRUE;
}
ULONG GetState()
{
if ( pProgress )
return pProgress->GetState();
return 0;
}
};
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */