Click here to Skip to main content
15,895,746 members
Articles / Desktop Programming / MFC

EZOptionsDlg - Netscape Preferences like dialog

Rate me:
Please Sign up or sign in to vote.
4.38/5 (4 votes)
16 Apr 2001 121K   3.1K   45  
A modified property sheet with the tree control replacing the tabs.
// 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);
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
Web Developer
United States United States
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions