⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 indexlist.cpp

📁 VC开发环境下
💻 CPP
字号:
// IndexList.cpp : implementation file
//

#include "stdafx.h"
#include "IndexEditor.h"


#include "IndexList.h"
#include ".\indexlist.h"


// CIndexList

IMPLEMENT_DYNCREATE(CIndexList, CTreeView)

CIndexList::CIndexList()
{
	m_dlgIndex.Initial(this);
}

CIndexList::~CIndexList()
{
}

BEGIN_MESSAGE_MAP(CIndexList, CTreeView)
	ON_NOTIFY_REFLECT(TVN_KEYDOWN, OnTvnKeydown)
	ON_NOTIFY_REFLECT(TVN_SELCHANGED, OnTvnSelchanged)
	ON_COMMAND(ID_INDEX_ADD, OnIndexAdd)
	ON_COMMAND(ID_INDEX_DEL, OnIndexDel)
	ON_COMMAND(ID_INDEX_RENAME, OnIndexRename)
	ON_NOTIFY_REFLECT(TVN_ENDLABELEDIT, OnTvnEndlabeledit)
	ON_NOTIFY_REFLECT(NM_RCLICK, OnNMRclick)
//	ON_UPDATE_COMMAND_UI(ID_INDEX_ADD, OnUpdateIndexAdd)
	ON_UPDATE_COMMAND_UI(ID_INDEX_DEL, OnUpdateIndexDel)
//	ON_UPDATE_COMMAND_UI(ID_INDEX_RENAME, OnUpdateIndexRename)
	ON_COMMAND(ID_INDEX_FULL_ADD, OnIndexFullAdd)
	ON_COMMAND(ID_INDEX_PROPERTY, OnIndexProperty)
	ON_COMMAND(ID_INDEX_EXPAND_COLLAPSE, OnIndexExpandCollapse)
	ON_UPDATE_COMMAND_UI(ID_INDEX_EXPAND_COLLAPSE, OnUpdateIndexExpandCollapse)
END_MESSAGE_MAP()


// CIndexList diagnostics

#ifdef _DEBUG
void CIndexList::AssertValid() const
{
	CTreeView::AssertValid();
}

void CIndexList::Dump(CDumpContext& dc) const
{
	CTreeView::Dump(dc);
}

CIndexEditorDoc* CIndexList::GetDocument() const // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CIndexEditorDoc)));
	return (CIndexEditorDoc*)m_pDocument;
}
#endif //_DEBUG


// CIndexList message handlers

void CIndexList::OnInitialUpdate()
{
	CTreeView::OnInitialUpdate();

	// TODO: Add your specialized code here and/or call the base class
	SetWindowLong(m_hWnd,GWL_STYLE,WS_CHILD | WS_VISIBLE  | TVS_LINESATROOT |TVS_SHOWSELALWAYS
		| TVS_HASBUTTONS|WS_CLIPSIBLINGS |WS_CLIPCHILDREN|TVS_HASLINES |TVS_EDITLABELS );

	SetWindowPos(NULL,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER);
	

}

void CIndexList::OnUpdate(CView* /*pSender*/, LPARAM /*lHint*/, CObject* /*pHint*/)
{
	ASSERT(GetDocument()->m_cpIndexSystem!=NULL);

	if(GetDocument()->m_cpIndexSystem==NULL)
		return;

	ShowList();
}

void CIndexList::ShowList()
{
	CTreeCtrl& treeCtrl=GetTreeCtrl();
	
	treeCtrl.DeleteAllItems();
	
	IGHIndexsPtr cpIndexs;
	cpIndexs=GetDocument()->m_cpIndexSystem;
	
	CComBSTR bstrRootName;
	cpIndexs->get_Name(&bstrRootName);

	CString strRootName(bstrRootName);
	if (strRootName.IsEmpty()) 
		strRootName.LoadString(IDS_INDEX_DLG_NEW_INDEX_SYSTEM);
	HTREEITEM hRootItem=treeCtrl.InsertItem(strRootName);
	treeCtrl.SetItemState(hRootItem,TVIS_BOLD,TVIS_BOLD);

	LONG lCount;
	cpIndexs->get_Count(&lCount);

	IGHIndexPtr cpGHIndex;
	CComBSTR bstrName;
	for (LONG i=0;i<lCount;i++)
	{
		cpGHIndex=0;
		bstrName.Empty();
		cpIndexs->get_Item(i,&cpGHIndex);
		cpGHIndex->get_Name(&bstrName);

		treeCtrl.InsertItem(CString(bstrName),hRootItem);
	}

	treeCtrl.Expand(hRootItem,TVE_EXPAND);
}


void CIndexList::OnNMRclick(NMHDR *pNMHDR, LRESULT *pResult)
{
	// TODO: Add your control notification handler code here
	*pResult = 0;

	CPoint				point;
	UINT				uFlags;
	GetCursorPos(&point);
	if (point==CPoint(-1,-1))
		return;

	CPoint ptTree=point;
	ScreenToClient(&ptTree);

	HTREEITEM hItem=GetTreeCtrl().HitTest(ptTree, &uFlags);
	if(hItem)
	{
		ShowContextMenu(point);
		GetTreeCtrl().SelectItem(hItem);
		m_hCurrentItem=hItem;
	}


}

void CIndexList::ShowContextMenu(CPoint point)
{
	CMenu contextMenu;
	contextMenu.LoadMenu(IDR_MENU_LIST);

	CBCGPPopupMenu *pPopupMenu=new CBCGPPopupMenu();
	if(pPopupMenu->Create(this,point.x,point.y+2,contextMenu.GetSubMenu(0)->m_hMenu,FALSE,TRUE))
		return;

	((CBCGPMDIFrameWnd*)AfxGetMainWnd())->OnShowPopupMenu(pPopupMenu);
	UpdateDialogControls(this,FALSE);
}


void CIndexList::OnTvnKeydown(NMHDR *pNMHDR, LRESULT *pResult)
{
	LPNMTVKEYDOWN pTVKeyDown = reinterpret_cast<LPNMTVKEYDOWN>(pNMHDR);
	// TODO: Add your control notification handler code here
	*pResult = 0;
}

void CIndexList::OnTvnSelchanged(NMHDR *pNMHDR, LRESULT *pResult)
{
	LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);

	m_hCurrentItem=pNMTreeView->itemNew.hItem;
	if (m_hCurrentItem==GetTreeCtrl().GetRootItem())
		m_pGridView->ShowIndex(NULL);
	else
	{
		CString strCurrentItem=GetTreeCtrl().GetItemText(pNMTreeView->itemNew.hItem);
		m_pGridView->ShowIndex(strCurrentItem);	
	}
	*pResult = 0;
}

void CIndexList::OnTvnEndlabeledit(NMHDR *pNMHDR, LRESULT *pResult)
{
	LPNMTVDISPINFO pTVDispInfo = reinterpret_cast<LPNMTVDISPINFO>(pNMHDR);
	// TODO: Add your control notification handler code here
	
	 *pResult = 0;
	if (pTVDispInfo->item.pszText) 
	{
		CString strNewName=pTVDispInfo->item.pszText;
		if (strNewName.IsEmpty())
		{
			AfxMessageBox(IDS_INDEX_ERROR_CANNOT_EMPTY,MB_OK|MB_ICONERROR);
			return;
		}

		CTreeCtrl& treeCtrl=GetTreeCtrl();
		IGHIndexsPtr cpIndexSystem=GetDocument()->m_cpIndexSystem;

		if (pTVDispInfo->item.hItem==treeCtrl.GetRootItem())  //change Root Item
		{
			cpIndexSystem->put_Name(CComBSTR(pTVDispInfo->item.pszText));
		}
		else   //Change Index name
		{
			//Is equal another index name
			if (IsExist(strNewName))
			{
				AfxMessageBox(IDS_INDEX_ERROR_CANNOT_REPEAT,MB_OK|MB_ICONERROR);
				return;
			}
			else
			{
				CString strOleName=treeCtrl.GetItemText(pTVDispInfo->item.hItem);
				IGHIndexPtr cpIndex;
				if(!GetDocument()->FindIndexByName(strOleName,&cpIndex))
				{
					TRACE(traceAppMsg,0,_T("Error:Can't Find the Index by name\n"),0);
					ASSERT(FALSE);
					return;
				}

				cpIndex->put_Name(CComBSTR(strNewName));
			}
		}

		GetDocument()->SetModifiedFlag();
		GetDocument()->UpdateTitle();
		*pResult=1;
	}

       
}

BOOL CIndexList::IsExist(const CString& strName)
{
	CTreeCtrl& treeCtrl=GetTreeCtrl();
	CString strIndex;

	HTREEITEM hItem=treeCtrl.GetChildItem(treeCtrl.GetRootItem());
	while (hItem)
	{
		strIndex=treeCtrl.GetItemText(hItem);
		if (strIndex==strName)
			return TRUE;
		hItem=treeCtrl.GetNextItem(hItem,TVGN_NEXT);
	}

	return FALSE;
}

void CIndexList::SetGridView(CIndexEditorView* pView)
{
	m_pGridView=pView;
}

void CIndexList::OnIndexAdd()
{
	CTreeCtrl& treeCtrl=GetTreeCtrl();
	HRESULT hr;

	// add index to IndexSystem
	IGHIndexPtr cpIndex;
	hr=cpIndex.CreateInstance(CLSID_GHIndex);
	assert(hr==S_OK);

	CString strName;
	GetSafeName(strName);

	hr=cpIndex->put_Name(CComBSTR(strName));

	GetDocument()->m_cpIndexSystem->Add(cpIndex);

	GetDocument()->SetModifiedFlag();
	GetDocument()->UpdateTitle();

	// add a item to TreeCtrl
	HTREEITEM hItem=treeCtrl.InsertItem(strName,treeCtrl.GetRootItem());
	SendMessage(TVM_EDITLABELA,0,(LPARAM)hItem);
}

void CIndexList::OnIndexDel()
{
	CTreeCtrl& treeCtrl=GetTreeCtrl();

	if (m_hCurrentItem==treeCtrl.GetRootItem())    //Delete total index system
	{
		if(AfxMessageBox(IDS_INDEX_WARNING_DELETE_ALL,MB_OKCANCEL)==IDOK)  
		{
			GetDocument()->m_cpIndexSystem->Clear();
			GetDocument()->m_cpIndexSystem->put_Name(CComBSTR(_T("")));
			GetDocument()->m_cpIndexSystem->put_Description(CComBSTR(_T("")));
			OnUpdate(NULL,0,NULL);
			GetDocument()->SetModifiedFlag();
			GetDocument()->UpdateTitle();
			return;
		}
	}
	else  //Delete index
	{
		CString strName=treeCtrl.GetItemText(m_hCurrentItem);
		IGHIndexPtr cpIndex;
		if(!GetDocument()->FindIndexByName(strName,&cpIndex))
		{
			TRACE(traceAppMsg,0,_T("Error:Can't Find the Index by name\n"),0);
			ASSERT(FALSE);
			return;
		}

		GetDocument()->m_cpIndexSystem->Delete(cpIndex);
		treeCtrl.DeleteItem(m_hCurrentItem);

		GetDocument()->SetModifiedFlag();
		GetDocument()->UpdateTitle();
	}

}

void CIndexList::OnIndexRename()
{
	SendMessage(TVM_EDITLABELA,0,(LPARAM)m_hCurrentItem);
}


void CIndexList::OnUpdateIndexDel(CCmdUI *pCmdUI)
{
	CTreeCtrl& treeCtrl=GetTreeCtrl();
	CString strName=treeCtrl.GetItemText(treeCtrl.GetRootItem());
	CString strStandName;
	strStandName.LoadString(IDS_INDEX_DLG_NEW_INDEX_SYSTEM);
	if (strName==strStandName)
	{
		if (treeCtrl.GetCount()>1)
		{
			pCmdUI->Enable(TRUE);
		}
		else
            pCmdUI->Enable(FALSE);
	}
	else
		pCmdUI->Enable(TRUE);
	
}


void CIndexList::OnIndexFullAdd()
{
	if(m_dlgIndex.ShowDialog(GetDocument()->m_cpIndexSystem,FALSE))
	{
		GetTreeCtrl().InsertItem(m_dlgIndex.m_strName,GetTreeCtrl().GetRootItem());

		GetDocument()->SetModifiedFlag();
		GetDocument()->UpdateTitle();
	}
	
}

void CIndexList::OnIndexProperty()
{
	CTreeCtrl& treeCtrl=GetTreeCtrl();

	//IndexSystem Property
	if (m_hCurrentItem==GetTreeCtrl().GetRootItem())
	{
		if(m_dlgIndex.ShowDialog(GetDocument()->m_cpIndexSystem,TRUE))
		{
			treeCtrl.SetItemText(m_hCurrentItem,m_dlgIndex.m_strName);
			GetDocument()->SetModifiedFlag();
			GetDocument()->UpdateTitle();
		}
	}
	else //Index Property
	{	
		CString strName;
		strName=treeCtrl.GetItemText(m_hCurrentItem);
		IGHIndexPtr cpIndex;
		if(!GetDocument()->FindIndexByName(strName,&cpIndex))
		{
			TRACE(traceAppMsg,0,_T("Error:Can't Find the Index by name\n"),0);
			ASSERT(FALSE);
			return;
		}

		if(m_dlgIndex.ShowDialog(cpIndex))
		{
			treeCtrl.SetItemText(m_hCurrentItem,m_dlgIndex.m_strName);
			GetDocument()->SetModifiedFlag();
			GetDocument()->UpdateTitle();
		}
	}
}

void CIndexList::OnIndexExpandCollapse()
{
	CTreeCtrl& treeCtrl=GetTreeCtrl();
	if (m_hCurrentItem==treeCtrl.GetRootItem()) 
	{
		if (treeCtrl.GetItemState(m_hCurrentItem,TVIS_EXPANDED)&TVIS_EXPANDED) //Is Expand
			treeCtrl.Expand(m_hCurrentItem,TVE_COLLAPSE);
		else
			treeCtrl.Expand(m_hCurrentItem,TVE_EXPAND); //Else is collapse
	}
}

void CIndexList::OnUpdateIndexExpandCollapse(CCmdUI *pCmdUI)
{
	CTreeCtrl& treeCtrl=GetTreeCtrl();

	if (m_hCurrentItem==treeCtrl.GetRootItem())
		pCmdUI->Enable(TRUE);
	else
		pCmdUI->Enable(FALSE);

	CString strText;
	if (treeCtrl.GetItemState(treeCtrl.GetRootItem(),TVIS_EXPANDED)&TVIS_EXPANDED)
		strText.LoadString(IDS_INDEX_COLLAPSE);
	else
		strText.LoadString(IDS_INDEX_EXPAND);

	pCmdUI->SetText(strText);
}

void CIndexList::GetSafeName(CString& strName)
{
	int i=0;
	CString strLoadName;
	CString strAppend;

	strLoadName.LoadString(IDS_NEW_INDEX_NAME);
	strName=strLoadName;
	while (IsExist(strName))
	{
		strAppend.Format(_T("%d"),++i);
		strName=strLoadName+strAppend;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -