Go to the documentation of this file.00001
00002
00004
00005 #ifndef __OPERATION_METER_RML_H__
00006 #define __OPERATION_METER_RML_H__
00007
00008 #if _MSC_VER > 1000
00009 #pragma once
00010 #endif // _MSC_VER > 1000
00011
00012 #ifndef WIN32
00013 typedef const char* LPCSTR;
00014 #endif
00015
00016 #include "assert.h"
00017
00018
00019
00020
00021 class COperationMeterRML
00022 {
00023 public:
00024 virtual ~COperationMeterRML() {}
00025
00026 DWORD GetMaxPos() const { return m_maxPos; }
00027 DWORD GetPos() const { return m_curPos; }
00028
00029 bool SetMaxPos( DWORD pos, DWORD count = 50 )
00030 {
00031 if( pos!=m_maxPos && pos>=0 || m_curPos!=0 )
00032 {
00033 m_maxPos = pos;
00034 SetStepCount(count);
00035 UpdateMaxPos();
00036
00037 {
00038
00039 m_curPos = m_pos = 0;
00040 UpdatePos();
00041 }
00042 return true;
00043 }
00044 return false;
00045 }
00046
00047 bool SetPos( DWORD pos )
00048 {
00049 if( pos!=m_curPos && pos<=m_maxPos )
00050 {
00051 m_curPos = pos;
00052 if( pos>=m_pos+GetStep() || pos<=m_pos-GetStep() || pos==m_maxPos )
00053 {
00054 m_pos = pos;
00055 UpdatePos();
00056 return true;
00057 }
00058 }
00059 return false;
00060 }
00061
00062 DWORD GetStep() const
00063 {
00064 assert(m_step!=0 && m_step<=m_maxPos);
00065 return m_step;
00066 }
00067
00068 void SetStep( DWORD step = 0)
00069 {
00070 m_step = (step==0 || step>=m_maxPos) ? max(m_maxPos/50,(DWORD)1) : step;
00071 }
00072
00073 void SetStepCount( DWORD count )
00074 {
00075 assert(count>0);
00076 m_step = max(m_maxPos/count,(DWORD)1);
00077 }
00078
00079 bool AddPos( DWORD pos = 1)
00080 {
00081 assert(pos>0);
00082 return SetPos(pos+m_curPos);
00083 }
00084
00085 virtual void SetInfo( LPCSTR info ) {}
00086
00087
00088
00089 protected:
00090 COperationMeterRML() : m_maxPos(0), m_curPos(0), m_step(0), m_pos(0) {}
00091
00092 virtual void UpdateMaxPos()=0;
00093 virtual void UpdatePos()=0;
00094 private:
00095 DWORD m_maxPos;
00096 DWORD m_curPos;
00097 DWORD m_pos;
00098 DWORD m_step;
00099
00100 };
00101
00102
00103 class CSimpleMeterRML: public COperationMeterRML
00104 {
00105 public:
00106 CSimpleMeterRML() {}
00107
00108 virtual void SetInfo( LPCSTR info ) { printf("\n%s",info); }
00109 protected:
00110 virtual void UpdateMaxPos() {}
00111 virtual void UpdatePos() { printf("\r %i%% ",GetPos()*100/GetMaxPos()); }
00112 };
00113
00114
00115 class CFileMeterRML: public COperationMeterRML
00116 {
00117 public:
00118 CFileMeterRML() : m_fp(0) {}
00119
00120 bool SetFileMaxPos( FILE* fp )
00121 {
00122 if( fp!=NULL )
00123 {
00124 m_fp = fp;
00125 int fileLen = 0;
00126 if( fseek(fp,0,SEEK_END)==0 )
00127 {
00128 fileLen = ftell(fp);
00129 if( fileLen>0 )
00130 {
00131 rewind(fp);
00132 return SetMaxPos(fileLen);
00133 }
00134 }
00135 }
00136 return false;
00137 }
00138
00139 bool SetFilePos()
00140 {
00141 if( GetMaxPos()>0 && m_fp!=NULL )
00142 return SetPos(ftell(m_fp));
00143 return false;
00144 }
00145
00146 private:
00147
00148 FILE* m_fp;
00149 };
00150
00151
00152 #endif