void CDesertConfigDialog::FillCfgTree()
{
	m_cfgtree.DeleteAllItems();
	DesertIface::Space space;
	dhelper_ptr->getDesertIfaceSpace(space);

	std::string iname = space.name();
	TVINSERTSTRUCT tvInsert;
	tvInsert.hParent = NULL;
	tvInsert.hInsertAfter = NULL;
	tvInsert.item.mask = TVIF_TEXT;
	tvInsert.item.pszText = _T("DesignSpace");
	m_cfgTreeRootItem = m_cfgtree.InsertItem(&tvInsert);
//	m_cfgtree.SetItemState( m_cfgTreeRootItem, TVIS_BOLD, TVIS_BOLD ); //bold
//	m_cfgtree.SetItemState( cfg_root, 0, TVIS_BOLD );  //unbold
	
	set<DesertIface::Element> elems = space.Element_kind_children();
	for(set<DesertIface::Element>::iterator i=elems.begin();i!=elems.end();++i)
	{
		if(!dhelper_ptr->isElementExist((*i).externalID())) continue;
		iname = (*i).name();
		HTREEITEM elem_node = m_cfgtree.InsertItem(utf82cstring(iname), m_cfgTreeRootItem, TVI_LAST);
		FillCfgTree(DesertIface::Element(*i), elem_node);
		m_cfgtree.SortChildren(elem_node);
		m_cfgtree.Expand(elem_node,TVE_EXPAND);
		cfgTreeMap[elem_node]=(*i).externalID();
	}
	m_cfgtree.SortChildren(m_cfgTreeRootItem);
	m_cfgtree.Expand(m_cfgTreeRootItem, TVE_EXPAND);
}
BOOL CDesertConfigDialog::OnInitDialog()
{
	CDialog::OnInitDialog();

	// TODO:  Add extra initialization here
	stringstream ss;
	long cfgCount = dhelper_ptr->getRealConfigCount();
	if(cfgCount == -2) {
		cfgSizeInfo = "Design Space Too Large";
	} else if(cfgCount == -1) {
		cfgSizeInfo = "Not calculated yet";
	} else {
		ss << cfgCount;
		cfgSizeInfo = ss.str();
	}

	/*std::string info = "Total Configurations: \t"+(std::string)cnt_buff+"\r\nChecked Configurations: \t0";
	m_cfgsize.SetWindowText(info.c_str());*/
	updateSize(0);
	
	FillCfgList();
	FillCfgTree();
	
	m_blInited = false;

	//initialize resize anchor
	BOOL bOk = FALSE;
	bOk = m_resizer.Hook(this);
	ASSERT( bOk);

	bOk = m_resizer.SetAnchor(IDC_CFGSIZE, ANCHOR_HORIZONTALLY | ANCHOR_TOP);
	ASSERT( bOk);

	bOk = m_resizer.SetAnchor(IDC_CLEARALLETN, ANCHOR_TOP | ANCHOR_RIGHT);
	ASSERT( bOk);

	bOk = m_resizer.SetAnchor(IDC_CFGLIST, ANCHOR_VERTICALLY);
	ASSERT( bOk);

	bOk = m_resizer.SetAnchor(IDC_CFGTREE, ANCHOR_ALL);
	ASSERT( bOk);

	bOk = m_resizer.SetAnchor(IDC_EXPORTSELBTN, ANCHOR_BOTTOM );
	ASSERT( bOk);

	bOk = m_resizer.SetAnchor(IDC_EXPORTALLBTN, ANCHOR_BOTTOM | ANCHOR_LEFT);
	ASSERT( bOk);

	bOk = m_resizer.SetAnchor(IDCANCEL, ANCHOR_BOTTOM |ANCHOR_RIGHT );
	ASSERT( bOk);

	bOk = m_resizer.SetAnchor(IDC_CLOSEALLBTN, ANCHOR_BOTTOM | ANCHOR_RIGHT );
	ASSERT( bOk);

	return TRUE;  // return TRUE unless you set the focus to a control
	// EXCEPTION: OCX Property Pages should return FALSE
}
void CDesertConfigDialog::FillCfgTree(DesertIface::Element &elem, HTREEITEM parent)
{
	set<DesertIface::Element> elems = elem.Element_kind_children();
	for(set<DesertIface::Element>::iterator i=elems.begin();i!=elems.end();++i)
	{
		if(!dhelper_ptr->isElementExist((*i).externalID())) continue;
		DesertIface::Element currElem = *i;
		std::string iname = currElem.name();
		if(currElem.decomposition())
			iname+=" [Compound]";
		else
		{
			set<DesertIface::Element> child_elems = currElem.Element_kind_children();
			if(!child_elems.empty())
			{
				if(dhelper_ptr->isOptionalElement(currElem))
					iname+=" [Optional]";
				else
					iname+=" [Alternative]";
			}
			else
			{
				//add number it envolved in configurations [#/total#]
				if(iname=="null")
				{
					int cnt = dhelper_ptr->getElementInConfigsCount(currElem.externalID());
					char buffer[10];
					_itoa(cnt, buffer, 10);
					iname = iname + " [" +(std::string)buffer+"/"+cfgSizeInfo+"]";
				}
				else
				{
					std::string cnt_str = dhelper_ptr->getElementInConfigsString(currElem.externalID());
					iname = iname + " [" +cnt_str+"]";
				}
			}
		}
		HTREEITEM elem_node = m_cfgtree.InsertItem(utf82cstring(iname), parent, TVI_LAST);
		FillCfgTree(DesertIface::Element(*i),elem_node);
		m_cfgtree.SortChildren(elem_node);
		m_cfgtree.Expand(elem_node,TVE_EXPAND);
		cfgTreeMap[elem_node]=(*i).externalID();
	}
	//leaf node
}