Click here to Skip to main content
15,891,136 members
Articles / Desktop Programming / ATL

CM_ConfigBuilder 1.2g: Visual Studio 6/Visual Studio 2005/Visual Studio 2008 Code Generator for Application Settings Graphic Management

Rate me:
Please Sign up or sign in to vote.
4.94/5 (126 votes)
12 Feb 2008CPOL17 min read 697.3K   9.8K   262  
CM_ConfigBuilder generates and compiles the required files to manage your application's settings/preferences and to store/retrieve them in XML format.
// MemberInfoDlg_Validation.cpp : implementation file
//

#include "stdafx.h"
#include "MemberInfoDlg_Validation.h"
#include "XmlMemberInfo.h"
#include "MemDC.h"
#include "enums.h"
#include "MemberInfoDlg_ValidationInterval.h"
#include "MemberInfoDlg_ValidationStaticEnum.h"
#include "MemberInfoDlg_ValidationDynamicEnum.h"
#include "DrawUtils.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#define TIP_RECT_HEIGHT 200

/////////////////////////////////////////////////////////////////////////////
// CMemberInfoDlg_Validation dialog


CMemberInfoDlg_Validation::CMemberInfoDlg_Validation(CWnd* pParent /*=NULL*/)
	: CPropertyEditorDlg(CMemberInfoDlg_Validation::IDD, pParent),
	intervalDlg_(NULL),
	staticEnumDlg_(NULL),
	dynamicEnumDlg_(NULL),
	selDialog_(NULL),
	initialized_(false),
	dataType_(enDataType_None),
	showTipRect_(true)
{
	//{{AFX_DATA_INIT(CMemberInfoDlg_Validation)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
}

CMemberInfoDlg_Validation::~CMemberInfoDlg_Validation()
{
	if (intervalDlg_)
		delete intervalDlg_;

	if (staticEnumDlg_)
		delete staticEnumDlg_;

	if (dynamicEnumDlg_)
		delete dynamicEnumDlg_;
}

void CMemberInfoDlg_Validation::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CMemberInfoDlg_Validation)
	DDX_Control(pDX, IDC_CBO_VALIDATION_MODE, cboValidationMode_);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CMemberInfoDlg_Validation, CPropertyEditorDlg)
	//{{AFX_MSG_MAP(CMemberInfoDlg_Validation)
	ON_CBN_SELCHANGE(IDC_CBO_VALIDATION_MODE, OnSelchangeCboValidationMode)
	ON_WM_SIZE()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMemberInfoDlg_Validation message handlers
void CMemberInfoDlg_Validation::StoreData()
{
	enValidationMode validationMode;

	cboValidationMode_.GetSelKey((int&)validationMode);

	memberInfo_->GetValidationInfo()->SetValidationMode(validationMode);
	switch (validationMode) {
	
		case enValidationMode_None:
			selDialog_ = NULL;
			break;

		case enValidationMode_Interval:
			if (dataType_ == enDataType_Long || dataType_ == enDataType_Double)
				intervalDlg_->StoreData();
			else
				memberInfo_->GetValidationInfo()->SetValidationMode(enValidationMode_None);
			break;

		case enValidationMode_StaticEnum:
			if (dataType_ == enDataType_Long || dataType_ == enDataType_Double || dataType_ == enDataType_String)
				staticEnumDlg_->StoreData();
			else
				memberInfo_->GetValidationInfo()->SetValidationMode(enValidationMode_None);
			break;

		case enValidationMode_DynamicEnum:
			dynamicEnumDlg_->StoreData();
			break;
	}
}

void CMemberInfoDlg_Validation::SetData(CXmlBaseElement* element)
{
	memberInfo_ = dynamic_cast<CXmlMemberInfo*>(element);

	intervalDlg_->SetData(element);
	staticEnumDlg_->SetData(element);
	dynamicEnumDlg_->SetData(element);

	if (memberInfo_) {
		cboValidationMode_.SelectItem(memberInfo_->GetValidationInfo()->GetValidationMode());
		dataType_ = memberInfo_->GetDataType();
	} else {
		cboValidationMode_.SelectItem(enValidationMode_None);
		dataType_ = enDataType_None;
	}

	OnSelchangeCboValidationMode();
}

void CMemberInfoDlg_Validation::OnDataUpdate()
{
	if (memberInfo_ && memberInfo_->GetDataType() != dataType_) {
		intervalDlg_->OnDataUpdate();
		staticEnumDlg_->OnDataUpdate();
		dynamicEnumDlg_->OnDataUpdate();

		dataType_ = memberInfo_->GetDataType();

		OnSelchangeCboValidationMode();
	}
}



void CMemberInfoDlg_Validation::DrawBackground(CDC* pDC)
{
	CBaseDialog::DrawBackground(pDC);
	
	DrawTipRect(pDC);
}

void CMemberInfoDlg_Validation::DrawTipRect(CDC* pDC)
{
	if (!showTipRect_)
		return;

	CBrush b(::GetSysColor(COLOR_INFOBK));

	CRect rc;
	CRect cboRect;
	CPoint topLeft;
	CRect tipRect;

	cboValidationMode_.GetWindowRect(cboRect);
	ScreenToClient(cboRect);

	GetClientRect(rc);
	tipRect = rc;
	tipRect.top = rc.bottom - TIP_RECT_HEIGHT;
	if (tipRect.top < cboRect.bottom + 5)
		tipRect.top = cboRect.bottom + 5;

	tipRect.DeflateRect(5, 0, 5, 5);

	if (tipRect.Height() < 36)
		return;

	pDC->FillRect(tipRect, &b);
	DrawUtils::DrawRect(pDC, tipRect, ::GetSysColor(COLOR_3DSHADOW));
	
	topLeft = tipRect.TopLeft();
	topLeft.Offset(10, 10);

	DrawUtils::DrawIcon(pDC, IDI_INFO, topLeft, 16);

	tipRect.DeflateRect(36, 10, 10, 10);
	DrawUtils::DrawString(pDC, tipText_, tipRect, DT_LEFT, ::GetSysColor(COLOR_INFOTEXT), GetFont());
}



BOOL CMemberInfoDlg_Validation::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	ModifyStyle(0, WS_CLIPCHILDREN);

	cboValidationMode_.AddItem("No validation", enValidationMode_None);
	cboValidationMode_.AddItem("Numeric interval", enValidationMode_Interval);
	cboValidationMode_.AddItem("Static Enumerative", enValidationMode_StaticEnum);
	cboValidationMode_.AddItem("Dynamic Enumerative", enValidationMode_DynamicEnum);

	cboValidationMode_.SelectItem(enValidationMode_None);

	intervalDlg_ = new CMemberInfoDlg_ValidationInterval;
	staticEnumDlg_ = new CMemberInfoDlg_ValidationStaticEnum;
	dynamicEnumDlg_ = new CMemberInfoDlg_ValidationDynamicEnum;

	intervalDlg_->Create(intervalDlg_->IDD, this);
	staticEnumDlg_->Create(staticEnumDlg_->IDD, this);
	dynamicEnumDlg_->Create(dynamicEnumDlg_->IDD, this);

	initialized_ = true;
	
	tipText_ = "No validation selected";
	UpdateWindowSize();

	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void CMemberInfoDlg_Validation::OnSelchangeCboValidationMode() 
{
	enValidationMode validationMode;
	enDataType dataType;

	cboValidationMode_.GetSelKey((int&)validationMode);

	if (selDialog_)
		selDialog_->ShowWindow(SW_HIDE);

	dataType = memberInfo_->GetDataType();

	switch (validationMode) {
	
		case enValidationMode_None:
			selDialog_ = NULL;
			showTipRect_ = true;
			tipText_ = "No validation selected";
			break;

		case enValidationMode_Interval:
			if (memberInfo_ && (dataType == enDataType_Long || dataType == enDataType_Double)) {
				selDialog_ = intervalDlg_;
				showTipRect_ = false;
				tipText_ = "";
			} else {
				selDialog_ = NULL;
				showTipRect_ = true;
				tipText_ = "The data type currently selected does not support this kind of validation.";
			}
			break;

		case enValidationMode_StaticEnum:
			if (memberInfo_ && (dataType == enDataType_Long || dataType == enDataType_Double || dataType == enDataType_String)) {
				selDialog_ = staticEnumDlg_;
				showTipRect_ = false;
				tipText_ = "";
			} else {
				selDialog_ = NULL;
				showTipRect_ = true;
				tipText_ = "The data type currently selected does not support this kind of validation.";
			}
			break;

		case enValidationMode_DynamicEnum:
			selDialog_ = dynamicEnumDlg_;
			showTipRect_ = false;
			tipText_ = "";
			break;
	}

	//cboValidationMode_.RedrawWindow();

	UpdateWindowSize();
}


void CMemberInfoDlg_Validation::UpdateWindowSize()
{
	if (!initialized_)
		return;

	if (selDialog_) {
		CRect rc;
		CRect cboRect;

		cboValidationMode_.GetWindowRect(cboRect);
		ScreenToClient(cboRect);

		GetClientRect(rc);
		rc.DeflateRect(5, cboRect.bottom + 5, 5, 5);

		selDialog_->SetWindowPos(&CWnd::wndTop, rc.left, rc.top, rc.Width(), rc.Height(), SWP_SHOWWINDOW);
	}

	RedrawWindow();
}

void CMemberInfoDlg_Validation::OnSize(UINT nType, int cx, int cy) 
{
	CDialog::OnSize(nType, cx, cy);
	
	UpdateWindowSize();	
}

BOOL CMemberInfoDlg_Validation::PreTranslateMessage(MSG* pMsg) 
{
	
	return CDialog::PreTranslateMessage(pMsg);
}

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, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Web Developer
Italy Italy
For all Stefano's latest code, binaries and tutorials visit www.codemachines.com

Comments and Discussions