You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
557 lines
13 KiB
C++
557 lines
13 KiB
C++
// XTPTaskDialogFrame.cpp: implementation of the CXTPTaskDialogFrame class.
|
|
//
|
|
// This file is a part of the XTREME CONTROLS MFC class library.
|
|
// (c)1998-2012 Codejock Software, All Rights Reserved.
|
|
//
|
|
// THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
|
|
// RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
|
|
// CONSENT OF CODEJOCK SOFTWARE.
|
|
//
|
|
// THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
|
|
// IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
|
|
// YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
|
|
// SINGLE COMPUTER.
|
|
//
|
|
// CONTACT INFORMATION:
|
|
// support@codejock.com
|
|
// http://www.codejock.com
|
|
//
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
#include "stdafx.h"
|
|
|
|
#include "Common/XTPVC80Helpers.h"
|
|
#include "Common/XTPColorManager.h"
|
|
#include "../Util/XTPControlTheme.h"
|
|
|
|
#include "../Button/XTPButtonTheme.h"
|
|
#include "XTPTaskDialogControls.h"
|
|
#include "XTPTaskDialogAPI.h"
|
|
#include "XTPTaskDialogClient.h"
|
|
#include "XTPTaskDialogFrame.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CXTPTaskDialogFrame
|
|
|
|
CXTPTaskDialogFrame::CXTPTaskDialogFrame(TASKDIALOGCONFIG* pConfig)
|
|
: m_lpDlgTemplate(NULL)
|
|
, m_dwTickCount(0)
|
|
, m_dwCallbackInterval(200)
|
|
{
|
|
m_pConfig = pConfig;
|
|
ASSERT(m_pConfig != NULL);
|
|
}
|
|
|
|
CXTPTaskDialogFrame::~CXTPTaskDialogFrame()
|
|
{
|
|
DestroyWindow();
|
|
|
|
free(m_lpDlgTemplate);
|
|
}
|
|
|
|
BOOL CXTPTaskDialogFrame::OnInitDialog()
|
|
{
|
|
BOOL bResult = CXTPTaskDialogClient::OnInitDialog();
|
|
|
|
int nDefaultButton = m_pConfig->nDefaultButton;
|
|
|
|
if (nDefaultButton == 0)
|
|
{
|
|
if (m_arrLinkButtons.GetSize() > 0)
|
|
{
|
|
nDefaultButton = m_arrLinkButtons[0]->GetDlgCtrlID();
|
|
}
|
|
else if (m_arrCommandButtons.GetSize() > 0)
|
|
{
|
|
nDefaultButton = m_arrCommandButtons[0]->GetDlgCtrlID();
|
|
}
|
|
}
|
|
|
|
CWnd* pWnd = nDefaultButton > 0 ? GetDlgItem(nDefaultButton) : NULL;
|
|
|
|
if (pWnd)
|
|
{
|
|
SetDefID(nDefaultButton);
|
|
}
|
|
|
|
if (pWnd && m_wndInputBox.GetSafeHwnd() == 0)
|
|
{
|
|
PostMessage(WM_NEXTDLGCTL, (WPARAM)pWnd->GetSafeHwnd(), TRUE);
|
|
}
|
|
|
|
|
|
m_dwTickCount = GetTickCount();
|
|
|
|
if (m_pConfig->dwFlags & TDF_CALLBACK_TIMER)
|
|
{
|
|
SetTimer(1, m_dwCallbackInterval, NULL);
|
|
}
|
|
|
|
return bResult;
|
|
}
|
|
|
|
BOOL CXTPTaskDialogFrame::Create(CWnd* pParentWnd)
|
|
{
|
|
if (m_lpDlgTemplate == NULL)
|
|
{
|
|
const int nDlgTemplateSize = sizeof(DLGTEMPLATE) + sizeof(DWORD) * 8;
|
|
m_lpDlgTemplate = (DLGTEMPLATE*)malloc(nDlgTemplateSize);
|
|
ZeroMemory(m_lpDlgTemplate, nDlgTemplateSize);
|
|
}
|
|
|
|
if (!m_lpDlgTemplate)
|
|
return FALSE;
|
|
|
|
m_lpDlgTemplate->style = GetFrameStyle() | WS_VISIBLE;
|
|
|
|
m_lpDlgTemplate->dwExtendedStyle = m_pConfig->dwFlags & TDF_RTL_LAYOUT ? WS_EX_LAYOUTRTL : 0;
|
|
|
|
return CreateIndirect(m_lpDlgTemplate, pParentWnd ? pParentWnd : m_pParentWnd, NULL);
|
|
}
|
|
|
|
INT_PTR CXTPTaskDialogFrame::DoModal()
|
|
{
|
|
ReleaseCapture();
|
|
|
|
if (m_lpDlgTemplate == NULL)
|
|
{
|
|
const int nDlgTemplateSize = sizeof(DLGTEMPLATE) + sizeof(DWORD) * 8;
|
|
m_lpDlgTemplate = (DLGTEMPLATE*)malloc(nDlgTemplateSize);
|
|
ZeroMemory(m_lpDlgTemplate, nDlgTemplateSize);
|
|
}
|
|
|
|
if (!m_lpDlgTemplate)
|
|
return -1;
|
|
|
|
m_lpDlgTemplate->style = GetFrameStyle();
|
|
|
|
m_lpDlgTemplate->dwExtendedStyle = m_pConfig->dwFlags & TDF_RTL_LAYOUT ? WS_EX_LAYOUTRTL : 0;
|
|
|
|
if (m_lpDialogTemplate == 0)
|
|
{
|
|
InitModalIndirect(m_lpDlgTemplate);
|
|
}
|
|
|
|
return CDialog::DoModal();
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP(CXTPTaskDialogFrame, CXTPTaskDialogClient)
|
|
//{{AFX_MSG_MAP(CXTPTaskDialogFrame)
|
|
ON_WM_CREATE()
|
|
ON_WM_DESTROY()
|
|
ON_WM_TIMER()
|
|
//}}AFX_MSG_MAP
|
|
ON_MESSAGE(TDM_SET_ELEMENT_TEXT, OnDialogSetElementText)
|
|
ON_MESSAGE(TDM_CLICK_BUTTON, OnDialogClickButton)
|
|
ON_MESSAGE(TDM_CLICK_RADIO_BUTTON, OnDialogClickRadioButton)
|
|
|
|
ON_MESSAGE(TDM_ENABLE_BUTTON, OnDialogEnableButton)
|
|
ON_MESSAGE(TDM_ENABLE_RADIO_BUTTON, OnDialogEnableRadioButton)
|
|
ON_MESSAGE(TDM_CLICK_VERIFICATION, OnDialogClickVerificationButton)
|
|
ON_MESSAGE(TDM_UPDATE_ICON, OnDialogUpdateIcon)
|
|
ON_MESSAGE(TDM_SET_BUTTON_ELEVATION_REQUIRED_STATE, OnDialogSetButtonElevationState)
|
|
|
|
ON_MESSAGE(TDM_SET_MARQUEE_PROGRESS_BAR, OnDialogSetMarqueeProgressBar)
|
|
ON_MESSAGE(TDM_SET_PROGRESS_BAR_STATE, OnDialogSetProgressBarState)
|
|
ON_MESSAGE(TDM_SET_PROGRESS_BAR_RANGE, OnDialogSetProgressBarRange)
|
|
ON_MESSAGE(TDM_SET_PROGRESS_BAR_POS, OnDialogSetProgressBarPos)
|
|
ON_MESSAGE(TDM_SET_PROGRESS_BAR_MARQUEE, OnDialogStartProgressBarMarquee)
|
|
ON_MESSAGE(TDM_NAVIGATE_PAGE, OnDialogNavigatePage)
|
|
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CXTPTaskDialogFrame message handlers
|
|
|
|
CString CXTPTaskDialogFrame::GetFrameTitle() const
|
|
{
|
|
CString strWindowTitle;
|
|
|
|
if (m_pConfig->pszWindowTitle != NULL)
|
|
{
|
|
if (IS_INTRESOURCE(m_pConfig->pszWindowTitle))
|
|
{
|
|
XTPLoadStringInst(m_pConfig->hInstance,
|
|
(UINT)(UINT_PTR)m_pConfig->pszWindowTitle, &strWindowTitle);
|
|
}
|
|
else
|
|
{
|
|
strWindowTitle = m_pConfig->pszWindowTitle;
|
|
}
|
|
}
|
|
|
|
if (strWindowTitle.IsEmpty())
|
|
{
|
|
TCHAR szModuleName[_MAX_PATH];
|
|
::GetModuleFileName(AfxGetInstanceHandle(), szModuleName, _MAX_PATH);
|
|
|
|
TCHAR szFileName[_MAX_FNAME], szExt[_MAX_EXT];
|
|
SPLITPATH_S(szModuleName, NULL, NULL, szFileName, szExt);
|
|
|
|
strWindowTitle.Format(_T("%s%s"), szFileName, szExt);
|
|
}
|
|
|
|
return strWindowTitle;
|
|
}
|
|
|
|
DWORD CXTPTaskDialogFrame::GetFrameStyle() const
|
|
{
|
|
DWORD dwStyle = WS_POPUP | WS_BORDER | WS_CAPTION | DS_ABSALIGN | DS_NOIDLEMSG | DS_3DLOOK | DS_MODALFRAME;
|
|
|
|
dwStyle |= WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
|
|
|
|
if (m_pConfig->dwFlags & TDF_CAN_BE_MINIMIZED)
|
|
{
|
|
dwStyle |= WS_MINIMIZEBOX;
|
|
}
|
|
|
|
if ((m_pConfig->dwFlags & TDF_ALLOW_DIALOG_CANCELLATION) || (m_pConfig->dwCommonButtons & TDCBF_CANCEL_BUTTON))
|
|
{
|
|
dwStyle |= WS_SYSMENU;
|
|
}
|
|
return dwStyle;
|
|
}
|
|
|
|
int CXTPTaskDialogFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
|
|
{
|
|
if (CXTPTaskDialogClient::OnCreate(lpCreateStruct) == -1)
|
|
return -1;
|
|
|
|
SetWindowText(GetFrameTitle());
|
|
|
|
|
|
if (m_pConfig->pszMainIcon == TD_WARNING_ICON)
|
|
MessageBeep(MB_ICONEXCLAMATION);
|
|
if (m_pConfig->pszMainIcon == TD_ERROR_ICON)
|
|
MessageBeep(MB_ICONERROR);
|
|
if (m_pConfig->pszMainIcon == TD_INFORMATION_ICON)
|
|
MessageBeep(MB_ICONINFORMATION);
|
|
|
|
|
|
if (!CreateClient(TRUE))
|
|
{
|
|
TRACE0("Failed to create Task Dialog UI window.\n");
|
|
return FALSE;
|
|
}
|
|
|
|
// inform callback Task Dialog was constructed.
|
|
SendNotify(TDN_DIALOG_CONSTRUCTED);
|
|
|
|
// inform callback Task Dialog was created.
|
|
SendNotify(TDN_CREATED);
|
|
|
|
return 0;
|
|
}
|
|
|
|
void CXTPTaskDialogFrame::OnDestroy()
|
|
{
|
|
CXTPTaskDialogClient::OnDestroy();
|
|
|
|
// inform callback Task Dialog was destroyed.
|
|
SendNotify(TDN_DESTROYED);
|
|
|
|
}
|
|
|
|
|
|
BOOL CXTPTaskDialogFrame::PreTranslateMessage(MSG* pMsg)
|
|
{
|
|
if (pMsg->message == WM_KEYDOWN || pMsg->message == WM_KEYUP)
|
|
{
|
|
switch (pMsg->wParam)
|
|
{
|
|
case VK_F1:
|
|
{
|
|
// inform callback F1 help key was pressed.
|
|
SendNotify(TDN_HELP);
|
|
return TRUE;
|
|
}
|
|
}
|
|
}
|
|
|
|
return CXTPTaskDialogClient::PreTranslateMessage(pMsg);
|
|
}
|
|
|
|
void CXTPTaskDialogFrame::OnTimer(UINT_PTR nIDEvent)
|
|
{
|
|
if (nIDEvent == 1)
|
|
{
|
|
DWORD dwTickCount = GetTickCount() - m_dwTickCount;
|
|
|
|
if ((int)SendNotify(TDN_TIMER, dwTickCount) == 1)
|
|
{
|
|
m_dwTickCount = GetTickCount();
|
|
}
|
|
}
|
|
|
|
CXTPTaskDialogClient::OnTimer(nIDEvent);
|
|
}
|
|
|
|
|
|
LRESULT CXTPTaskDialogFrame::OnDialogSetElementText(WPARAM wParam, LPARAM lParam)
|
|
{
|
|
if (wParam == TDE_MAIN_INSTRUCTION)
|
|
{
|
|
m_strMainInstruction.SetCaption(LoadItemString((LPCWSTR)lParam));
|
|
RecalcLayout();
|
|
return TRUE;
|
|
}
|
|
|
|
if (wParam == TDE_CONTENT)
|
|
{
|
|
m_strContent.SetCaption(LoadItemString((LPCWSTR)lParam));
|
|
|
|
m_wndContent.DestroyWindow();
|
|
if (IsHyperlinksEnabled())
|
|
{
|
|
m_wndContent.Create(CRect(0, 0, 0, 0), m_strContent.m_strCaption, &m_font, this);
|
|
}
|
|
|
|
|
|
RecalcLayout();
|
|
return TRUE;
|
|
}
|
|
|
|
if (wParam == TDE_EXPANDED_INFORMATION)
|
|
{
|
|
m_strExpandedInformation.SetCaption(LoadItemString((LPCWSTR)lParam));
|
|
m_wndExpandedInformation.DestroyWindow();
|
|
|
|
RecalcLayout();
|
|
return TRUE;
|
|
}
|
|
|
|
if (wParam == TDE_FOOTER)
|
|
{
|
|
m_strFooter.SetCaption(LoadItemString((LPCWSTR)lParam));
|
|
|
|
m_wndFooter.DestroyWindow();
|
|
if (IsHyperlinksEnabled())
|
|
{
|
|
m_wndFooter.Create(CRect(0, 0, 0, 0), m_strFooter.m_strCaption, &m_font, this);
|
|
}
|
|
|
|
RecalcLayout();
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
LRESULT CXTPTaskDialogFrame::OnDialogClickButton(WPARAM wParam, LPARAM /*lParam*/)
|
|
{
|
|
CWnd* pWnd = GetDlgItem((UINT)wParam);
|
|
if (!pWnd)
|
|
return FALSE;
|
|
|
|
WindowProc(WM_COMMAND, MAKEWPARAM((UINT)wParam, BN_CLICKED), (LPARAM)pWnd->GetSafeHwnd());
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
LRESULT CXTPTaskDialogFrame::OnDialogClickRadioButton(WPARAM wParam, LPARAM /*lParam*/)
|
|
{
|
|
CButton* pWnd = DYNAMIC_DOWNCAST(CButton, GetDlgItem((UINT)wParam));
|
|
if (!pWnd)
|
|
return FALSE;
|
|
|
|
if ((pWnd->SendMessage(WM_GETDLGCODE) & DLGC_RADIOBUTTON) == 0)
|
|
return FALSE;
|
|
|
|
HWND hWndCtrl = ::GetWindow(m_hWnd, GW_CHILD);
|
|
|
|
while (hWndCtrl)
|
|
{
|
|
if (::SendMessage(hWndCtrl, WM_GETDLGCODE, 0, 0L) & DLGC_RADIOBUTTON)
|
|
{
|
|
::SendMessage(hWndCtrl, BM_SETCHECK, hWndCtrl == pWnd->GetSafeHwnd(), 0L);
|
|
}
|
|
hWndCtrl = ::GetWindow(hWndCtrl, GW_HWNDNEXT);
|
|
}
|
|
|
|
m_nSelRadioButtonID = (UINT)wParam;
|
|
SendNotify(TDN_RADIO_BUTTON_CLICKED, (WPARAM)m_nSelRadioButtonID);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
LRESULT CXTPTaskDialogFrame::OnDialogEnableButton(WPARAM wParam, LPARAM lParam)
|
|
{
|
|
CWnd* pWnd = DYNAMIC_DOWNCAST(CButton, GetDlgItem((UINT)wParam));
|
|
if (!pWnd)
|
|
return FALSE;
|
|
|
|
|
|
if (!lParam && (::GetFocus() == pWnd->GetSafeHwnd()))
|
|
{
|
|
CWnd* pWndNext = GetNextDlgTabItem(pWnd);
|
|
PostMessage(WM_NEXTDLGCTL, (WPARAM)pWndNext->GetSafeHwnd(), TRUE);
|
|
}
|
|
|
|
pWnd->EnableWindow(lParam != 0);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
LRESULT CXTPTaskDialogFrame::OnDialogEnableRadioButton(WPARAM wParam, LPARAM lParam)
|
|
{
|
|
CButton* pWnd = DYNAMIC_DOWNCAST(CButton, GetDlgItem((UINT)wParam));
|
|
if (!pWnd)
|
|
return FALSE;
|
|
|
|
if ((pWnd->SendMessage(WM_GETDLGCODE) & DLGC_RADIOBUTTON) == 0)
|
|
return FALSE;
|
|
|
|
pWnd->EnableWindow(lParam != 0);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
LRESULT CXTPTaskDialogFrame::OnDialogClickVerificationButton(WPARAM wParam, LPARAM lParam)
|
|
{
|
|
if (!m_pBtnVerify)
|
|
return FALSE;
|
|
|
|
m_bVerification = (wParam != 0);
|
|
m_pBtnVerify->SetCheck(m_bVerification);
|
|
SendNotify(TDN_VERIFICATION_CLICKED, m_bVerification);
|
|
|
|
if (lParam)
|
|
{
|
|
m_pBtnVerify->SetFocus();
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
LRESULT CXTPTaskDialogFrame::OnDialogUpdateIcon(WPARAM wParam, LPARAM lParam)
|
|
{
|
|
if (wParam == TDIE_ICON_MAIN)
|
|
{
|
|
SAFE_DELETE_HICON(m_hIconMain);
|
|
m_hIconMain = CreateIcon((HICON)lParam, (PCWSTR)lParam, m_sizeIconMain, IsMainIconHandleUsed());
|
|
|
|
RecalcLayout();
|
|
return TRUE;
|
|
}
|
|
|
|
if (wParam == TDIE_ICON_FOOTER)
|
|
{
|
|
SAFE_DELETE_HICON(m_hIconFooter);
|
|
m_hIconFooter = CreateIcon((HICON)lParam, (PCWSTR)lParam, m_sizeIconFooter, IsFooterIconHandleUsed());
|
|
|
|
RecalcLayout();
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
#ifndef BCM_FIRST
|
|
#define BCM_FIRST 0x1600 // Button control messages
|
|
#endif
|
|
|
|
#ifndef BCM_SETSHIELD
|
|
#define BCM_SETSHIELD (BCM_FIRST + 0x000C)
|
|
#endif
|
|
|
|
LRESULT CXTPTaskDialogFrame::OnDialogSetButtonElevationState(WPARAM wParam, LPARAM lParam)
|
|
{
|
|
CButton* pWnd = DYNAMIC_DOWNCAST(CButton, GetDlgItem((UINT)wParam));
|
|
if (!pWnd)
|
|
return FALSE;
|
|
|
|
pWnd->SendMessage(BCM_SETSHIELD, 0, lParam);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
#ifndef PBM_SETMARQUEE
|
|
#define PBM_SETMARQUEE (WM_USER+10)
|
|
#endif
|
|
|
|
#ifndef PBS_MARQUEE
|
|
#define PBS_MARQUEE 0x08
|
|
#endif
|
|
|
|
#ifndef PBM_SETSTATE
|
|
#define PBM_SETSTATE (WM_USER+16)
|
|
#endif
|
|
|
|
LRESULT CXTPTaskDialogFrame::OnDialogSetMarqueeProgressBar(WPARAM wParam, LPARAM /*lParam*/)
|
|
{
|
|
if (!m_wndProgressBar)
|
|
return FALSE;
|
|
|
|
m_wndProgressBar.ModifyStyle(PBS_MARQUEE, wParam ? PBS_MARQUEE : 0);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
LRESULT CXTPTaskDialogFrame::OnDialogSetProgressBarState(WPARAM wParam, LPARAM /*lParam*/)
|
|
{
|
|
if (!m_wndProgressBar)
|
|
return FALSE;
|
|
m_wndProgressBar.SendMessage(PBM_SETSTATE, wParam);
|
|
return TRUE;
|
|
}
|
|
|
|
LRESULT CXTPTaskDialogFrame::OnDialogSetProgressBarRange(WPARAM /*wParam*/, LPARAM lParam)
|
|
{
|
|
if (!m_wndProgressBar)
|
|
return FALSE;
|
|
|
|
m_wndProgressBar.SetRange(LOWORD(lParam), HIWORD(lParam));
|
|
return TRUE;
|
|
}
|
|
|
|
LRESULT CXTPTaskDialogFrame::OnDialogSetProgressBarPos(WPARAM wParam, LPARAM /*lParam*/)
|
|
{
|
|
if (!m_wndProgressBar)
|
|
return FALSE;
|
|
|
|
m_wndProgressBar.SetPos((int)wParam);
|
|
return TRUE;
|
|
}
|
|
|
|
LRESULT CXTPTaskDialogFrame::OnDialogStartProgressBarMarquee(WPARAM wParam, LPARAM lParam)
|
|
{
|
|
if (!m_wndProgressBar)
|
|
return FALSE;
|
|
|
|
m_wndProgressBar.SendMessage(PBM_SETMARQUEE, wParam, wParam ? lParam : 0);
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
LRESULT CXTPTaskDialogFrame::OnDialogNavigatePage(WPARAM /*wParam*/, LPARAM lParam)
|
|
{
|
|
TASKDIALOGCONFIG* pConfig = (TASKDIALOGCONFIG*)lParam;
|
|
|
|
m_pConfig = pConfig;
|
|
|
|
KillTimer(1);
|
|
|
|
SetWindowText(GetFrameTitle());
|
|
|
|
if (!CreateClient(FALSE))
|
|
{
|
|
TRACE0("Failed to create Task Dialog UI window.\n");
|
|
return FALSE;
|
|
}
|
|
|
|
OnInitDialog();
|
|
|
|
// inform callback Task Dialog was constructed.
|
|
SendNotify(TDN_DIALOG_CONSTRUCTED);
|
|
|
|
SendNotify(TDN_NAVIGATED);
|
|
|
|
return TRUE;
|
|
}
|