// EZOptionsDlg.cpp : implementation file
//
#include "stdafx.h"
#include "EZOptionsDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CEZOptionsDlg dialog
IMPLEMENT_DYNAMIC(CEZOptionsDlg,CDialog)
static const UINT m_narDefPropSheetButtons[] = {IDOK, IDCANCEL, ID_APPLY_NOW, IDHELP };
CEZOptionsDlg::CEZOptionsDlg(UINT nIDResource,CWnd* pParent /*=NULL*/,CString strTreeTitle /*= _T("")*/,BOOL bShowButtons /*= TRUE*/)
: CDialog(nIDResource, pParent)
,m_rcTree(GAP_CTRLS,GAP_CTRLS*3,DEF_WIDTH+GAP_CTRLS,DEF_HEIGHT+GAP_CTRLS*3)
,m_rcPage(m_rcTree.right+GAP_CTRLS,GAP_CTRLS*3,m_rcTree.right+GAP_CTRLS+DEF_WIDTH,DEF_HEIGHT+GAP_CTRLS*3)
,m_rcLabel(m_rcTree.right+GAP_CTRLS,GAP_CTRLS,m_rcTree.right+GAP_CTRLS+DEF_WIDTH,GAP_CTRLS*3)
,m_rcTreeLabel(GAP_CTRLS,GAP_CTRLS,DEF_WIDTH+GAP_CTRLS,GAP_CTRLS*3)
,m_rcPanel(m_rcTree.left,m_rcTree.bottom+GAP_CTRLS*2,m_rcPage.right,m_rcTree.bottom+GAP_CTRLS*5)
,m_pcurPage(0)
,m_strTreeTitle(strTreeTitle)
,m_bShowButtons(bShowButtons)
{
//{{AFX_DATA_INIT(CEZOptionsDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}
void CEZOptionsDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CEZOptionsDlg)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CEZOptionsDlg, CDialog)
//{{AFX_MSG_MAP(CEZOptionsDlg)
ON_WM_CREATE()
//}}AFX_MSG_MAP
ON_MESSAGE(WM_PAGECHANGED,OnPageChanged)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CEZOptionsDlg message handlers
void CEZOptionsDlg::AddPage(CEZPropertyPage *pPage, CString strPage, CString strCategory)
{
pPage->Create(this);
if(strPage.IsEmpty())
strPage = pPage->m_psp.pszTitle;
m_wndTree.AddPage(pPage,strPage,strCategory);
CSize szPage = pPage->GetPageSize();
BOOL bResize = FALSE;
if(m_rcPage.Width()<szPage.cx)
{
m_rcPage.right = m_rcPage.left+szPage.cx;
bResize = TRUE;
}
if(m_rcPage.Height()<szPage.cy)
{
m_rcPage.bottom= m_rcPage.top+szPage.cy;
bResize = TRUE;
}
if(!m_pcurPage)
m_wndTree.SelectPage(strPage);
if(bResize)
RepositionWindows();
pPage->MoveWindow(&m_rcPage);
}
void CEZOptionsDlg::RepositionWindows()
{
CalculateTreeRect();
CalculatePageRect();
CalculatePageLabelRect();
CalculateTreeLabelRect();
CalculateButtonPanelRect();
CalculateWindowRect();
m_wndTree.MoveWindow(&m_rcTree);
m_wndPanel.MoveWindow(&m_rcPage);
m_wndLabel.MoveWindow(&m_rcLabel);
m_wndTreeLabel.MoveWindow(&m_rcTreeLabel);
m_wndPanel.MoveWindow(&m_rcPanel);
if(m_pcurPage)
m_pcurPage->MoveWindow(&m_rcPage);
SetWindowPos(NULL,0,0,m_rcWnd.Width(),m_rcWnd.Height(),SWP_NOMOVE|SWP_NOZORDER);
}
LRESULT CEZOptionsDlg::OnPageChanged(WPARAM wparam, LPARAM lparam)
{
CString strText = (LPCTSTR)wparam;
m_pcurPage = (CEZPropertyPage*)lparam;
m_wndLabel.SetWindowText(strText);
m_wndLabel.InvalidateRect(NULL);
CRect rect;
if(m_pcurPage)
{
m_pcurPage->GetWindowRect(&rect);
if(rect.Width()<m_rcPage.Width() || rect.Height()<m_rcPage.Height())
RepositionWindows();
m_pcurPage->SetActiveWindow();
m_pcurPage->SetFocus();
}
return 0L;
}
CEZPropertyPage* CEZOptionsDlg::RemovePage(CString strTitle)
{
return m_wndTree.RemovePage(strTitle);
}
void CEZOptionsDlg::SetTreeCtrl(UINT nIDResource,CString strTitle)
{
m_wndTree.SubclassDlgItem(nIDResource,this);
m_strTreeTitle = strTitle;
m_wndTreeLabel.SetWindowText(m_strTreeTitle);
}
void CEZOptionsDlg::SetLabel(UINT nID)
{
m_wndLabel.SubclassDlgItem(nID,this);
}
void CEZOptionsDlg::SelectPage(CString strPage)
{
m_wndTree.SelectPage(strPage);
}
LRESULT CEZOptionsDlg::OnQuerySiblings(WPARAM wparam, LPARAM lparam)
{
return m_wndTree.OnQuerySiblings(wparam,lparam);
}
int CEZOptionsDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDialog::OnCreate(lpCreateStruct) == -1)
return -1;
m_wndTreeLabel.Create(m_strTreeTitle,WS_CHILD|WS_VISIBLE,m_rcTreeLabel,this,IDC_TREE_LABEL);
m_wndTreeLabel.SetColors(GetSysColor(COLOR_ACTIVECAPTION),GetSysColor(COLOR_INACTIVECAPTION),GetSysColor(COLOR_CAPTIONTEXT));
m_wndLabel.Create(_T(""),WS_CHILD|WS_VISIBLE,m_rcLabel,this,IDC_TREE_LABEL+1);
m_wndPanel.Create(m_rcPanel,this);
return 0;
}
void CEZOptionsDlg::AddButton(CString strText, UINT nCommandID)
{
m_wndPanel.AddButton(nCommandID,strText);
}
void CEZOptionsDlg::RemoveButton(UINT nCommandID)
{
m_wndPanel.RemoveButton(nCommandID);
}
void CEZOptionsDlg::ShowButtons(BOOL bShow)
{
m_bShowButtons = bShow;
m_wndPanel.ShowWindow(m_bShowButtons?SW_SHOW:SW_HIDE);
RepositionWindows();
}
void CEZOptionsDlg::CalculateTreeRect()
{
m_rcTree.bottom = m_rcPage.bottom;
m_rcTree.right = m_rcTree.left+m_wndTree.GetWidth();
}
void CEZOptionsDlg::CalculatePageRect()
{
m_rcPage.right = m_rcPage.Width();
m_rcPage.left = m_rcTree.right+GAP_CTRLS;
m_rcPage.right += m_rcPage.left;
}
void CEZOptionsDlg::CalculatePageLabelRect()
{
m_rcLabel.right = m_rcPage.right;
m_rcLabel.left = m_rcPage.left;
}
void CEZOptionsDlg::CalculateTreeLabelRect()
{
m_rcTreeLabel.right = m_rcTree.right;
}
void CEZOptionsDlg::CalculateButtonPanelRect()
{
if(m_bShowButtons)
m_rcPanel = CRect(m_rcTree.left,m_rcTree.bottom+GAP_CTRLS,m_rcPage.right,m_rcTree.bottom+GAP_CTRLS*6);
else
SetRectEmpty(&m_rcPanel);
}
void CEZOptionsDlg::CalculateWindowRect()
{
int nWidth = m_rcPage.right+GAP_CTRLS;
int nHeight = GAP_CTRLS*3;
nHeight+=m_bShowButtons?m_rcPanel.bottom:m_rcTree.bottom;
m_rcWnd = CRect(0,0, nWidth,nHeight);
}
BOOL CEZOptionsDlg::OnCommand(WPARAM wParam, LPARAM lParam)
{
if(m_pcurPage)
{
PSHNOTIFY pshn;
ZeroMemory(&pshn,sizeof(PSHNOTIFY));
pshn.hdr.hwndFrom = GetSafeHwnd();
int nIDCtrl = pshn.hdr.idFrom = m_pcurPage->GetDlgCtrlID();
UINT nID = LOWORD(wParam);
switch(nID)
{
case ID_APPLY_NOW:
case IDOK:
pshn.hdr.code = PSN_APPLY;
break;
case IDCANCEL:
if(m_pcurPage->OnQueryCancel())
break;
case IDHELP:
pshn.hdr.code = PSN_HELP;
break;
default:
return CDialog::OnCommand(wParam, lParam);
};
m_pcurPage->SendMessage(WM_NOTIFY,WPARAM(nIDCtrl),LPARAM(&pshn));
}
return CDialog::OnCommand(wParam, lParam);
}
BOOL CEZOptionsDlg::OnInitDialog()
{
CDialog::OnInitDialog();
m_wndPanel.AddButton(IDOK,_T("OK"));
m_wndPanel.AddButton(ID_APPLY_NOW,_T("Apply"));
m_wndPanel.AddButton(IDCANCEL,_T("Cancel"));
m_wndPanel.EnableButton(ID_APPLY_NOW,FALSE);
m_wndPanel.ShowWindow(m_bShowButtons?SW_SHOW:SW_HIDE);
return FALSE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
LRESULT CEZOptionsDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case PSM_APPLY:
{
WPARAM wparam = MAKEWPARAM(ID_APPLY_NOW,0) ;
return SendMessage(WM_COMMAND,wparam);
}
case PSM_CANCELTOCLOSE:
m_wndPanel.SetButtonText(IDCANCEL,_T("Close"));
return 0L;
case PSM_CHANGED:
m_wndPanel.EnableButton(ID_APPLY_NOW,TRUE);
return 0L;
case PSM_UNCHANGED:
m_wndPanel.EnableButton(ID_APPLY_NOW,FALSE);
return 0L;
case PSM_QUERYSIBLINGS:
return OnQuerySiblings(wParam,lParam);
}
return CDialog::WindowProc(message, wParam, lParam);
}
BOOL CEZOptionsDlg::IsButtonEnabled(int iButton)
{
return m_wndPanel.IsButtonEnabled(iButton);
}