windows-nt/Source/XPSP1/NT/shell/osshell/dskquota/ui/progress.cpp
2020-09-26 16:20:57 +08:00

784 lines
23 KiB
C++

///////////////////////////////////////////////////////////////////////////////
/* File: progress.cpp
Description: Implements the various flavors of progress dialogs used
in the quota UI.
Revision History:
Date Description Programmer
-------- --------------------------------------------------- ----------
05/28/97 Initial creation. BrianAu
*/
///////////////////////////////////////////////////////////////////////////////
#include "pch.h"
#pragma hdrstop
#include "progress.h"
#include "resource.h"
///////////////////////////////////////////////////////////////////////////////
/* Function: ProgressDialog::SendToProgressBar [inline]
Description: Inline function that sends a message to the dialog's
progress bar control. If there is no progress bar control, the
function returns FALSE.
Arguments: Standard Win32 message arguments.
Returns:
If progress bar window exists, returns the result of SendMessage.
Otherwise, returns FALSE.
Revision History:
Date Description Programmer
-------- --------------------------------------------------- ----------
05/28/97 Initial creation. BrianAu
*/
///////////////////////////////////////////////////////////////////////////////
inline INT_PTR
ProgressDialog::SendToProgressBar(
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
if (NULL != m_hwndProgressBar)
return SendMessage(m_hwndProgressBar, uMsg, wParam, lParam);
else
return FALSE;
}
///////////////////////////////////////////////////////////////////////////////
/* Function: ProgressDialog::ProgressDialog
Description: Class constructor for progress dialog base class.
Arguments:
idDialogTemplate - ID number for the dialog's resource template.
idProgressBar - ID number for the progress bar control.
idTxtDescription - ID number for text description in dialog.
idTxtFileName - ID number for file name field in dialog.
Returns: Nothing.
Revision History:
Date Description Programmer
-------- --------------------------------------------------- ----------
05/28/97 Initial creation. BrianAu
*/
///////////////////////////////////////////////////////////////////////////////
ProgressDialog::ProgressDialog(
UINT idDialogTemplate,
UINT idProgressBar,
UINT idTxtDescription,
UINT idTxtFileName
) : m_idDialogTemplate(idDialogTemplate),
m_idProgressBar(idProgressBar),
m_idTxtDescription(idTxtDescription),
m_idTxtFileName(idTxtFileName),
m_hWnd(NULL),
m_bUserCancelled(FALSE)
{
DBGTRACE((DM_VIEW, DL_HIGH, TEXT("ProgressDialog::ProgressDialog")));
DBGPRINT((DM_VIEW, DL_HIGH, TEXT("\tthis = 0x%08X"), this));
//
// Do nothing.
//
}
///////////////////////////////////////////////////////////////////////////////
/* Function: ProgressDialog::~ProgressDialog
Description: Class destructor for progress dialog base class.
Arguments: None.
Returns: Nothing.
Revision History:
Date Description Programmer
-------- --------------------------------------------------- ----------
05/28/97 Initial creation. BrianAu
*/
///////////////////////////////////////////////////////////////////////////////
ProgressDialog::~ProgressDialog(
VOID
)
{
DBGTRACE((DM_VIEW, DL_HIGH, TEXT("ProgressDialog::~ProgressDialog")));
DBGPRINT((DM_VIEW, DL_HIGH, TEXT("\tthis = 0x%08X"), this));
//
// Call the Destroy() function to destroy the progress dialog window.
//
Destroy();
}
///////////////////////////////////////////////////////////////////////////////
/* Function: ProgressDialog::Create
Description: Creates the dialog.
Arguments:
hInstance - Instance handle for the DLL containing the dialog
resource template.
hwndParent - Parent window for dialog.
Returns:
TRUE = Dialog was created.
FALSE = Dialog was not created.
Revision History:
Date Description Programmer
-------- --------------------------------------------------- ----------
05/28/97 Initial creation. BrianAu
*/
///////////////////////////////////////////////////////////////////////////////
BOOL
ProgressDialog::Create(
HINSTANCE hInstance,
HWND hwndParent
)
{
m_hWnd = CreateDialogParam(hInstance,
MAKEINTRESOURCE(m_idDialogTemplate),
hwndParent,
DlgProc,
(LPARAM)this);
if (NULL != m_hWnd)
{
m_hwndProgressBar = GetDlgItem(m_hWnd, m_idProgressBar);
DBGASSERT((NULL != m_hwndProgressBar));
}
return (NULL != m_hWnd);
}
///////////////////////////////////////////////////////////////////////////////
/* Function: ProgressDialog::Destroy
Description: Destroys the dialog window.
Arguments: None.
Returns: Nothing.
Revision History:
Date Description Programmer
-------- --------------------------------------------------- ----------
05/28/97 Initial creation. BrianAu
*/
///////////////////////////////////////////////////////////////////////////////
VOID
ProgressDialog::Destroy(
VOID
)
{
//
// Note that m_hWnd is set to NULL in OnDestroy().
//
if (NULL != m_hWnd)
DestroyWindow(m_hWnd);
}
///////////////////////////////////////////////////////////////////////////////
/* Function: ProgressDialog::DlgProc [static]
Description: Message procedure for the dialog.
Arguments: Standard Win32 message proc arguments.
Returns: Standard Win32 message proc return values.
Revision History:
Date Description Programmer
-------- --------------------------------------------------- ----------
05/28/97 Initial creation. BrianAu
*/
///////////////////////////////////////////////////////////////////////////////
INT_PTR CALLBACK
ProgressDialog::DlgProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
//
// Retrieve the dialog object's ptr from the window's userdata.
// Place there in response to WM_INITDIALOG.
//
ProgressDialog *pThis = (ProgressDialog *)GetWindowLongPtr(hwnd, DWLP_USER);
switch(uMsg)
{
case WM_INITDIALOG:
//
// Store "this" ptr in window's userdata.
//
SetWindowLongPtr(hwnd, DWLP_USER, (INT_PTR)lParam);
pThis = (ProgressDialog *)lParam;
//
// Description text control is hidden by default.
// Calling SetDescription() will show it.
//
ShowWindow(GetDlgItem(hwnd, pThis->m_idTxtDescription), SW_HIDE);
ShowWindow(GetDlgItem(hwnd, pThis->m_idTxtFileName), SW_HIDE);
//
// Center dialog in it's parent.
//
::CenterPopupWindow(hwnd);
//
// Let derived classes respond to WM_INITDIALOG.
//
return pThis->OnInitDialog(hwnd, wParam, lParam);
case WM_DESTROY:
//
// Let derived classes respond to WM_DESTROY.
//
return pThis->OnDestroy(hwnd);
case WM_COMMAND:
if (IDCANCEL == LOWORD(wParam))
{
//
// User pressed "Cancel" button.
// Set the "User cancelled" flag and let derived
// classes respond to the cancellation.
//
pThis->m_bUserCancelled = TRUE;
return pThis->OnCancel(hwnd, wParam, lParam);
}
break;
}
if (NULL != pThis)
{
//
// Let derived classes respond to any message if they wish.
// Note that only WM_INITDIALOG, WM_DESTROY and the "user cancelled"
// events are the only special cases.
//
return pThis->HandleMessage(hwnd, uMsg, wParam, lParam);
}
return FALSE;
}
///////////////////////////////////////////////////////////////////////////////
/* Function: ProgressDialog::HandleMessage
Description: Base class implementation of virtual function. Derived
classes can provide an implementation to handle any message other than
WM_INITDIALOG or WM_DESTROY. These two messages have their own
virtual message handlers.
Arguments: Standard Win32 message proc arguments.
Returns: Always returns FALSE.
Revision History:
Date Description Programmer
-------- --------------------------------------------------- ----------
05/28/97 Initial creation. BrianAu
*/
///////////////////////////////////////////////////////////////////////////////
INT_PTR
ProgressDialog::HandleMessage(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
return FALSE;
}
///////////////////////////////////////////////////////////////////////////////
/* Function: ProgressDialog::OnInitDialog
Description: Base class implementation of virtual function. Called
when the base class receives WM_INITDIALOG. Derived classes can
provide an implementation if they wish to perform some operation
in response to WM_INITDIALOG.
Arguments:
hwnd - Dialog window handle.
wParam, lParam - Standard Win32 message proc arguments.
Returns: Always returns TRUE so that USER will set the control focus.
Revision History:
Date Description Programmer
-------- --------------------------------------------------- ----------
05/28/97 Initial creation. BrianAu
*/
///////////////////////////////////////////////////////////////////////////////
INT_PTR
ProgressDialog::OnInitDialog(
HWND hwnd,
WPARAM wParam,
LPARAM lParam
)
{
return TRUE;
}
///////////////////////////////////////////////////////////////////////////////
/* Function: ProgressDialog::OnDestroy
Description: Base class implementation of virtual function. Called
when the base class receives WM_DESTROY. Derived classes can
provide an implementation if they wish to perform some operation
in response to WM_DESTROY. Before returning, any derived implementation
must call the base class implementation so that m_hWnd is properly
set to NULL.
Arguments:
hwnd - Dialog window handle.
Returns: Always returns FALSE.
Revision History:
Date Description Programmer
-------- --------------------------------------------------- ----------
05/28/97 Initial creation. BrianAu
*/
///////////////////////////////////////////////////////////////////////////////
INT_PTR
ProgressDialog::OnDestroy(
HWND hwnd
)
{
m_hWnd = NULL;
return FALSE;
}
///////////////////////////////////////////////////////////////////////////////
/* Function: ProgressDialog::OnCancel
Description: Base class implementation of virtual function. Called
when the user presses the "Cancel" button in the dialog. This
implementation assumes that the Cancel button is assigned the ID
of IDCANCEL (standard).
Arguments:
hwnd - Dialog window handle.
wParam, lParam - Standard Win32 message proc arguments.
Returns: Always returns FALSE.
Revision History:
Date Description Programmer
-------- --------------------------------------------------- ----------
05/28/97 Initial creation. BrianAu
*/
///////////////////////////////////////////////////////////////////////////////
INT_PTR
ProgressDialog::OnCancel(
HWND hwnd,
WPARAM wParam,
LPARAM lParam
)
{
return FALSE;
}
///////////////////////////////////////////////////////////////////////////////
/* Function: ProgressDialog::FlushMessages
Description: While the dialog is active, call this periodically so that
the thread is able to properly update the dialog and respond to the
user pressing "Cancel".
Arguments: None.
Returns: Nothing.
Revision History:
Date Description Programmer
-------- --------------------------------------------------- ----------
05/28/97 Initial creation. BrianAu
*/
///////////////////////////////////////////////////////////////////////////////
VOID
ProgressDialog::FlushMessages(
VOID
)
{
if (NULL != m_hWnd)
{
//
// Process messages for the dialog's parent and all of it's children.
//
MSG msg;
while (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE) &&
WM_QUIT != msg.message)
{
GetMessage(&msg, NULL, 0, 0);
if (!IsDialogMessage(m_hWnd, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
}
}
///////////////////////////////////////////////////////////////////////////////
/* Function: ProgressDialog::SetTitle
Description: Sets the title string in the dialog.
Arguments:
pszTitle - Address of title string.
Returns: Nothing.
Revision History:
Date Description Programmer
-------- --------------------------------------------------- ----------
05/28/97 Initial creation. BrianAu
*/
///////////////////////////////////////////////////////////////////////////////
VOID
ProgressDialog::SetTitle(
LPCTSTR pszTitle
)
{
DBGASSERT((NULL != pszTitle));
if (NULL != m_hWnd)
{
if (0 == ((DWORD_PTR)pszTitle & ~0xffff))
{
TCHAR szText[MAX_PATH] = { TEXT('\0') };
LoadString(g_hInstDll, (DWORD)((DWORD_PTR)pszTitle), szText, ARRAYSIZE(szText));
pszTitle = szText;
}
SetWindowText(m_hWnd, pszTitle);
FlushMessages();
}
}
///////////////////////////////////////////////////////////////////////////////
/* Function: ProgressDialog::SetDescription
Description: Sets the progress description string in the dialog.
Arguments:
pszDescription - Address of description string.
Returns: Nothing.
Revision History:
Date Description Programmer
-------- --------------------------------------------------- ----------
05/28/97 Initial creation. BrianAu
*/
///////////////////////////////////////////////////////////////////////////////
VOID
ProgressDialog::SetDescription(
LPCTSTR pszDescription
)
{
DBGASSERT((NULL != pszDescription));
if (NULL != m_hWnd)
{
if (0 == ((DWORD_PTR)pszDescription & ~0xffff))
{
TCHAR szText[MAX_PATH] = { TEXT('\0') };
LoadString(g_hInstDll, (DWORD)((DWORD_PTR)pszDescription), szText, ARRAYSIZE(szText));
pszDescription = szText;
}
SetWindowText(GetDlgItem(m_hWnd, m_idTxtDescription), pszDescription);
//
// Description control is by default hidden.
//
ShowWindow(GetDlgItem(m_hWnd, m_idTxtDescription), SW_NORMAL);
FlushMessages();
}
}
///////////////////////////////////////////////////////////////////////////////
/* Function: ProgressDialog::SetFileName
Description: Sets the file name description string in the dialog.
If the file name is too long, it is formatted with ellipses to
fit in the space provided.
Arguments:
pszFileName - Address of file name string.
Returns: Nothing.
Revision History:
Date Description Programmer
-------- --------------------------------------------------- ----------
05/28/97 Initial creation. BrianAu
*/
///////////////////////////////////////////////////////////////////////////////
VOID
ProgressDialog::SetFileName(
LPCTSTR pszFileName
)
{
DBGASSERT((NULL != pszFileName));
if (NULL != m_hWnd)
{
HWND hwndCtl = GetDlgItem(m_hWnd, m_idTxtFileName);
HDC hdc = GetDC(hwndCtl);
RECT rc;
LPTSTR pszText = StringDup(pszFileName);
if (NULL != pszText)
{
GetClientRect(hwndCtl, &rc);
DrawText(hdc,
pszText,
-1,
&rc,
DT_CENTER |
DT_PATH_ELLIPSIS |
DT_MODIFYSTRING);
SetWindowText(hwndCtl, pszText);
delete[] pszText;
//
// FileName control is by default hidden.
//
ShowWindow(hwndCtl, SW_NORMAL);
}
FlushMessages();
ReleaseDC(hwndCtl, hdc);
}
}
///////////////////////////////////////////////////////////////////////////////
/* Function: ProgressDialog::ProgressBarInit
Description: Initializes the progress bar control with range and step
values. If this function is not called, the progress bar defaults
to:
iMin = 0
iMax = 100
iStep = 10
Arguments:
iMin - Minimum range value.
iMax - Maximum range value.
iStep - Amount bar advances each time PBM_STEPIT is received.
Returns:
TRUE = Progress bar control accepted settings.
FALSE = Progress bar rejected settings.
Revision History:
Date Description Programmer
-------- --------------------------------------------------- ----------
05/28/97 Initial creation. BrianAu
*/
///////////////////////////////////////////////////////////////////////////////
BOOL
ProgressDialog::ProgressBarInit(
UINT iMin,
UINT iMax,
UINT iStep
)
{
BOOL bResult = FALSE;
if (0 != SendToProgressBar(PBM_SETSTEP, iStep, 0))
bResult = (0 != SendToProgressBar(PBM_SETRANGE, 0, MAKELPARAM(iMin, iMax)));
FlushMessages();
return bResult;
}
///////////////////////////////////////////////////////////////////////////////
/* Function: ProgressDialog::ProgressBarReset
Description: Resets the progres bar position at 0.
Arguments: None.
Returns: Previous "position" of progress bar.
Revision History:
Date Description Programmer
-------- --------------------------------------------------- ----------
05/28/97 Initial creation. BrianAu
*/
///////////////////////////////////////////////////////////////////////////////
UINT
ProgressDialog::ProgressBarReset(
VOID
)
{
UINT iReturn = (UINT)ProgressBarSetPosition(0);
FlushMessages();
return iReturn;
}
///////////////////////////////////////////////////////////////////////////////
/* Function: ProgressDialog::ProgressBarAdvance
Description: Advances the progress bar a given number of counts.
Arguments:
iDelta - Number of counts to advance. If -1, the bar is advanced
by the step value supplied in ProgressBarInit.
Returns: Previous "position" of progress bar.
Revision History:
Date Description Programmer
-------- --------------------------------------------------- ----------
05/28/97 Initial creation. BrianAu
*/
///////////////////////////////////////////////////////////////////////////////
UINT
ProgressDialog::ProgressBarAdvance(
UINT iDelta
)
{
UINT iReturn;
if ((UINT)-1 == iDelta)
iReturn = (UINT)SendToProgressBar(PBM_STEPIT, 0, 0);
else
iReturn = (UINT)SendToProgressBar(PBM_DELTAPOS, (WPARAM)iDelta, 0);
FlushMessages();
return iReturn;
}
///////////////////////////////////////////////////////////////////////////////
/* Function: ProgressDialog::ProgressBarSetPosition
Description: Advances the progress bar to a specific position.
Arguments:
iPosition - Specific position count.
Returns: Previous "position" of progress bar.
Revision History:
Date Description Programmer
-------- --------------------------------------------------- ----------
05/28/97 Initial creation. BrianAu
*/
///////////////////////////////////////////////////////////////////////////////
UINT
ProgressDialog::ProgressBarSetPosition(
UINT iPosition
)
{
UINT iReturn = (UINT)SendToProgressBar(PBM_SETPOS, (WPARAM)iPosition, 0);
FlushMessages();
return iReturn;
}
///////////////////////////////////////////////////////////////////////////////
/* Function: ProgressDialog::Show
Description: Makes the progress dialog visible.
Arguments: None.
Returns: Nothing.
Revision History:
Date Description Programmer
-------- --------------------------------------------------- ----------
05/28/97 Initial creation. BrianAu
*/
///////////////////////////////////////////////////////////////////////////////
VOID
ProgressDialog::Show(
VOID
)
{
if (NULL != m_hWnd)
{
ShowWindow(m_hWnd, SW_SHOWNORMAL);
FlushMessages();
}
}
///////////////////////////////////////////////////////////////////////////////
/* Function: ProgressDialog::Hide
Description: Hides the progress dialog.
Arguments: None.
Returns: Nothing.
Revision History:
Date Description Programmer
-------- --------------------------------------------------- ----------
05/28/97 Initial creation. BrianAu
*/
///////////////////////////////////////////////////////////////////////////////
VOID
ProgressDialog::Hide(
VOID
)
{
if (NULL != m_hWnd)
{
ShowWindow(m_hWnd, SW_HIDE);
FlushMessages();
}
}