Esempio n. 1
0
void WTreeNode::OnTreeNodeCheck()
{
	
	if(treeCheckBox_->isChecked())		
		SetTreeCheck(true);
	else
		SetTreeCheck(false);


}
BOOL CDlgLayerTree::CheckTreeItemName(CString sName, HTREEITEM hTI /* = TVI_ROOT */)
{
	if (hTI == NULL || sName.IsEmpty())
	{
		return FALSE;
	}

	CString sItemName = m_tree.GetItemText(hTI);
	if (sItemName.CompareNoCase(sName) == 0)
	{
		SetTreeCheck(hTI);
		return TRUE;
	}

	if (m_tree.ItemHasChildren(hTI))
	{
		HTREEITEM ChiItem = m_tree.GetNextItem(hTI, TVGN_CHILD);
		BOOL bFind = CheckTreeItemName(sName, ChiItem);
		if (bFind)
		{
			return TRUE;
		}
	}

	hTI = m_tree.GetNextItem(hTI, TVGN_NEXT);
	while (hTI != NULL)
	{
		sItemName = m_tree.GetItemText(hTI);
		if (sItemName.CompareNoCase(sName) == 0)
		{
			SetTreeCheck(hTI);
			return TRUE;
		}

		if (m_tree.ItemHasChildren(hTI))
		{
			HTREEITEM ChiItem = m_tree.GetNextItem(hTI, TVGN_CHILD);
			BOOL bFind = CheckTreeItemName(sName, ChiItem);
			if (bFind)
			{
				return TRUE;
			}
		}

		hTI = m_tree.GetNextItem(hTI, TVGN_NEXT);
	}

	return FALSE;
}
//-----------------------------------------------------------------------------
HTREEITEM CDlgLayerTree::CreateTree(CString sName, HTREEITEM hParent /*= TVI_ROOT*/)
{
	HTREEITEM hReTI = m_tree.InsertItem(sName, hParent);

	CStringArray strChildNameArray,strNeedArray;
	if (CLayerTreeDef::GetChildrenAliasName(strChildNameArray, strNeedArray, sName))
	{
		for (int i = strChildNameArray.GetSize() - 1; i >= 0; i--)
		{
			CString Right;
			CPowerConfig::GetRightByResource(strChildNameArray.GetAt(i), Right);
			int nRight = atoi(Right);
			if (!(nRight & POWER_SCAN))// 对比查看权限
			{
				//strChildNameArray.RemoveAt(i);///////////////////////////////##############################
			}
		}
		for (int i = 0; i < strChildNameArray.GetSize(); i++)
		{
			HTREEITEM hTI = CreateTree(strChildNameArray.GetAt(i), hReTI);
			CString sTmp = strNeedArray.GetAt(i);
			if (!sTmp.IsEmpty() && sTmp.CollateNoCase("0") != 0 && hTI != NULL)
			{
				SetTreeCheck(hTI);
				m_SdeAliasNames.Add(strChildNameArray.GetAt(i));
			}
		}
	}

	return hReTI;
}
void CDlgLayerTree::SetCurSelItemName(HTREEITEM hTI /*= TVI_ROOT*/)
{
	CString sName = m_tree.GetItemText(hTI);

	BOOL bFind = FALSE;
	for (int i = 0; (i < m_SdeAliasNames.GetSize()) && !bFind; i++)
	{
		if (m_SdeAliasNames.GetAt(i).CompareNoCase(sName) == 0)
		{
			SetTreeCheck(hTI);
			bFind = TRUE;
		}
	}

	if (!bFind && (m_tree.ItemHasChildren(hTI)))
	{
		HTREEITEM ChiItem = m_tree.GetNextItem(hTI, TVGN_CHILD);
		SetCurSelItemName(ChiItem);
	}

	HTREEITEM NexItem = m_tree.GetNextItem(hTI, TVGN_NEXT);
	if (NexItem != NULL)
	{
		SetCurSelItemName(NexItem);
	}
}
//-----------------------------------------------------------------------------
void CDlgLayerTree::OnNMClickLayerTree(NMHDR *pNMHDR, LRESULT *pResult)
{
	// TODO: 在此添加控件通知处理程序代码
	UINT uFlag;
	CPoint pt;
	CString sSelLayer;
	HTREEITEM SelRoot,ParRoot,NexRoot;
	GetCursorPos(&pt);
	m_tree.ScreenToClient(&pt);
	SelRoot = m_tree.HitTest(pt,&uFlag);
	if ((NULL!=SelRoot) && (uFlag&TVHT_ONITEMSTATEICON))
	{
		BOOL bChecked = m_tree.GetCheck(SelRoot);

		SetTreeCheck(SelRoot, !bChecked);

		//分析是否有必要对树枝进行调整
		ParRoot = m_tree.GetParentItem(SelRoot);
		while (ParRoot != NULL)
		{
			if (bChecked)
				m_tree.SetCheck(ParRoot,FALSE);//当前处在被选择状态即将被取消选择
			else
			{
				int k=0;//当前处在非选择状态即将有可能处于选择状态(标志位)
				NexRoot=m_tree.GetNextItem(ParRoot,TVGN_CHILD);
				if(NexRoot!=SelRoot)
				{
					if(!m_tree.GetCheck(NexRoot)) k=1;
				}
				if(k==0)
				{
					while(TRUE)
					{
						NexRoot=m_tree.GetNextItem(NexRoot,TVGN_NEXT);
						if(NexRoot==NULL) break;
						if(NexRoot==SelRoot) continue;
						if(!m_tree.GetCheck(NexRoot))
						{
							k=1;
							break;
						}
					}
				}
				if(k==0) m_tree.SetCheck(ParRoot);
			}
			ParRoot = m_tree.GetParentItem(ParRoot);
		}
		//if(acedCommand(0)!=RTNORM) sendCommandToAutoCAD("\x1B");

		SaveSelLayer();

		m_tree.SetCheck(SelRoot, bChecked);
	}

	*pResult = 0;
}
//-----------------------------------------------------------------------------
void CDlgLayerTree::SetTreeCheck(HTREEITEM hTI /*= TVI_ROOT*/, BOOL bCheck /*= TRUE*/)
{
	if (hTI == NULL)
	{
		return;
	}

	if (m_tree.ItemHasChildren(hTI))
	{
		HTREEITEM ChiItem = m_tree.GetNextItem(hTI, TVGN_CHILD);
		SetTreeCheck(ChiItem, bCheck);

		HTREEITEM NexItem = m_tree.GetNextItem(ChiItem, TVGN_NEXT);
		while (NexItem != NULL)
		{
			SetTreeCheck(NexItem, bCheck);
			NexItem = m_tree.GetNextItem(NexItem, TVGN_NEXT);
		}
	}

	m_tree.SetCheck(hTI, bCheck);
}
//-----------------------------------------------------------------------------
void CDlgLayerTree::OnBnClickedBtnCloseall() //关闭所有SDE图层
{
	HTREEITEM hTI = m_tree.GetRootItem();

	while (hTI != NULL)
	{
		SetTreeCheck(hTI, FALSE);

		hTI = m_tree.GetNextItem(hTI, TVGN_NEXT);
	}

	SaveSelLayer();
}
//-----------------------------------------------------------------------------
void CDlgLayerTree::InitializeTreeControl()
{

	m_tree.DeleteAllItems();
	CStringArray strNameArray,strNeedArray;

	if (CLayerTreeDef::GetChildrenAliasName(strNameArray, strNeedArray)==FALSE)  return;

	for (int i = strNameArray.GetSize() - 1; i >= 0; i--)
	{
		CString strRight;
		CPowerConfig::GetRightByResource(strNameArray.GetAt(i), strRight);
		int nRight = atoi(strRight);
		if (!(nRight & POWER_SCAN))// 对比查看权限
		{
			//strNameArray.RemoveAt(i);  ////////////////////////######################
		}
	}
	for (int i = 0; i < strNameArray.GetSize(); i++)
	{
		HTREEITEM hTI = CreateTree(strNameArray.GetAt(i));
		CString sTmp = strNeedArray.GetAt(i);
		if (!sTmp.IsEmpty() && sTmp.CollateNoCase("0") != 0 && hTI != NULL)
		{
			//必选项
			//m_tree.SetCheck(hTI);
			SetTreeCheck(hTI);
			m_SdeAliasNames.Add(strNameArray.GetAt(i));
		}
	}

	// 读取用户机器上配置的图层名称,显示为选中
	if (m_tree.GetRootItem() == NULL)
	{
		return;
	}

	ReadSelLayer();
}
//-----------------------------------------------------------------------------
void CLayerTreeDlg::OnNMClickLayerTree(NMHDR *pNMHDR, LRESULT *pResult)
{
	// TODO: 在此添加控件通知处理程序代码
	*pResult = 0;

	UINT uFlag;
	CPoint pt;
	CString sSelLayer;
	HTREEITEM SelRoot,ParRoot,NexRoot;

	pt = CPoint(this->GetCurrentMessage()->pt);
	m_tree.ScreenToClient(&pt);
	SelRoot = m_tree.HitTest(pt,&uFlag);

	if (NULL == SelRoot)
		return;

	if (uFlag & TVHT_ONITEMSTATEICON)
	{
		BOOL bChecked = m_tree.GetCheck(SelRoot);
		//置反选中状态
		SetTreeCheck(SelRoot, !bChecked);

		//分析是否有必要对树枝进行调整
		ParRoot = m_tree.GetParentItem(SelRoot);
		while (ParRoot != NULL)
		{
			if (bChecked)
				m_tree.SetCheck(ParRoot,FALSE);//当前处在被选择状态即将被取消选择
			else
			{
				int k=0;//当前处在非选择状态即将有可能处于选择状态(标志位)
				NexRoot=m_tree.GetNextItem(ParRoot,TVGN_CHILD);
				if(NexRoot!=SelRoot)
				{
					if(!m_tree.GetCheck(NexRoot)) k=1;
				}
				if(k==0)
				{
					while(TRUE)
					{
						NexRoot=m_tree.GetNextItem(NexRoot,TVGN_NEXT);
						if(NexRoot==NULL) break;
						if(NexRoot==SelRoot) continue;
						if(!m_tree.GetCheck(NexRoot))
						{
							k=1;
							break;
						}
					}
				}
				if(k==0) m_tree.SetCheck(ParRoot);
			}
			ParRoot = m_tree.GetParentItem(ParRoot);
		}

		m_tree.SetCheck(SelRoot, bChecked);

		ShowLayer(SelRoot, !bChecked);

//		sendCommandToAutoCAD("redraw ");
	}

	else if(!m_tree.ItemHasChildren(SelRoot)) 
	{
		CString strLayerName = m_tree.GetItemText(SelRoot);

		Acad::ErrorStatus es = Acad::eOk;

		AcDbDatabase* pDB = acdbHostApplicationServices()->workingDatabase();

		if (NULL == pDB)
			return;

		AcDbLayerTable *pLyTable = NULL;
		AcDbLayerTableRecord *pLyRcd = NULL;

		es = pDB->getSymbolTable(pLyTable,AcDb::kForRead);            //获得当前数据库中层表指针
		if ( es != Acad::eOk ) 
		{
			acutPrintf("\n获取LayerTable的时候发生错误,请稍后再试。\n");
			return;
		}

		if ( !pLyTable->has(strLayerName) )
		{
			pLyTable->close();
			return;
		}

		pLyTable->close();

		SetCurrentLayer(strLayerName);
	}
}