// CommitMonitor - simple checker for new commits in svn repositories
// Copyright (C) 2007 - Stefan Kueng
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.
// This program 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 General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software Foundation,
// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
//
#pragma once
#include <shlobj.h>
#pragma comment(lib, "shell32.lib")
/**
* A wrapper class for the IProgressDialog interface. Thats
* the dialog used by the shell/IE to show progress in e.g.
* copying, downloading, ...
*
* \remark you need to call AfxOleInit() before using this class, preferably in
* your app's InitInistance() method.
*/
class CProgressDlg
{
public:
CProgressDlg();
~CProgressDlg();
/**
* sets the title of the progress dialog box.
* \param szTitle pointer to a NULL-terminated string that contains the dialog box title
*/
void SetTitle ( LPCWSTR szTitle );
/**
* Displays a message.
* \param dwLine line number on which the text is to be displayed. There are three lines possible, two lines if SetCalculateTime() is set to true.
* \param szText NULL-terminated string that contains the line text.
* \param bCompactPath set to true if you want the text to be compacted (if it is a path) to fit on the line.
*
* \remark This call should be made *after* the dialog has been shown - this allows
* the system to measure the space available for the text, and do path compaction properly
*/
void SetLine ( DWORD dwLine, LPCWSTR szText, bool bCompactPath = false );
#ifdef _MFC_VER
/**
* Wrappers around set line, to do a CString::Format type operation
* See SetLine for more details
*
* \remark These calls should be made *after* the dialog has been shown - this allows
* the system to measure the space available for the text, and do path compaction properly
*/
void FormatPathLine ( DWORD dwLine, UINT idFormatText, ...);
void FormatNonPathLine ( DWORD dwLine, UINT idFormatText, ...);
#endif
/**
* Sets a message to be displayed if the user clicks the cancel button.
* \param szMessage pointer to a NULL-terminated string that contains the message.
* \remark Even though the user clicks Cancel, the application cannot immediately
* call Stop() to close the dialog box. The application
* must wait until the next time it calls HasUserCancelled() to
* discover that the user has canceled the operation. Since this delay might be
* significant, the progress dialog box provides the user with immediate feedback
* by clearing text lines 1 and 2 and displaying the cancel message on line 3.
* The message is intended to let the user know that the delay is normal and that
* the progress dialog box will be closed shortly. It is typically is set to
* something like "Please wait while ...".
*/
void SetCancelMsg ( LPCWSTR szMessage );
#ifdef _MFC_VER
void SetCancelMsg ( UINT idMessage );
/**
* Specifies an AVI-clip that will run in the dialog box.
* \param uRsrcID AVI resource identifier. To create this value use the MAKEINTRESOURCE macro.
*/
void SetAnimation ( UINT uRsrcID );
#endif
/**
* Specifies an AVI-clip that will run in the dialog box.
* \param hinst instance handle to the module from which the avi resource should be loaded.
* \param uRsrcID AVI resource identifier. To create this value use the MAKEINTRESOURCE macro.
*/
void SetAnimation ( HINSTANCE hinst, UINT uRsrcID );
/**
* Specifies that the progress dialog should have a line indicating the time remaining to complete.
* \param bCalculate false to deactivate the time remaining line.
*/
void SetTime ( bool bTime = true );
/**
* Specifies if the progress bar should be shown or not.
*/
void SetShowProgressBar ( bool bShow = true );
/**
* Resets the progress dialog box timer to zero.
* \remark the timer is used to estimate the remaining time. It is started when your
* application calls ShowModal() or ShowModeless(). Unless your application will
* start immediately, it should call ResetTimer() just before starting the operation.
* This practice ensures that the time estimates will be as accurate as possible.
* This method should not be called after the first call to UpdateProgress().
*/
void ResetTimer();
/**
* Shows the progress dialog box modal.
*/
#ifdef _MFC_VER
HRESULT ShowModal ( CWnd* pwndParent );
#endif
HRESULT ShowModal ( HWND hWndParent );
/**
* Shows the progress dialog box modeless.
*/
#ifdef _MFC_VER
HRESULT ShowModeless ( CWnd* pwndParent );
#endif
HRESULT ShowModeless ( HWND hWndParent );
/**
* Stops the progress dialog box and removes it from the screen.
*/
void Stop();
/**
* Updates the progress dialog box with the current state of the operation.
* \param dwProgress Application-defined value that indicates what proportion of the operation has been completed at the time the method was called
* \param dwMax Application-defined value that specifies what value dwCompleted will have when the operation is complete
*/
void SetProgress ( DWORD dwProgress, DWORD dwMax );
/**
* Updates the progress dialog box with the current state of the operation.
* \param u64Progress Application-defined value that indicates what proportion of the operation has been completed at the time the method was called
* \param u64ProgressMax Application-defined value that specifies what value dwCompleted will have when the operation is complete
*/
void SetProgress64 ( ULONGLONG u64Progress, ULONGLONG u64ProgressMax );
/**
* Checks whether the user has cancelled the operation.
*/
bool HasUserCancelled();
/**
* Checks whether this object was created successfully. If the return value is false then
* you MUST NOT use the current instance of this class.
*/
bool IsValid() const { return m_bValid; }
/**
* After a call to Stop() to hide the progress dialog,
* call EnsureValid() to recreate the dialog and fill in the
* data again.
*/
bool EnsureValid();
protected:
IProgressDialog* m_pIDlg;
bool m_bValid;
bool m_isVisible;
DWORD m_dwDlgFlags;
};