📄 indexlist.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 + -