📄 unitclasstree.cpp
字号:
// UnitClassTree.cpp: implementation of the UnitClassTree class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "SM.h"
#include "UnitClassTree.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
//##ModelId=40A481F80218
UnitClassTree::UnitClassTree(CTreeCtrl *Tree):UnitTree(Tree)
{
pClassTable = new CDaoTableDef(&theDatabase);
pClassTable->Open(_T("Class"));
pClassRS = new CDaoRecordset();
pClassRS->Open(pClassTable);
}
//##ModelId=40A481F80223
UnitClassTree::~UnitClassTree()
{
pClassRS->Close();
pClassTable->Close();
delete pClassRS;
delete pClassTable;
}
//##ModelId=40A481F801B8
void UnitClassTree::LoadAll(int ID, HTREEITEM parent)
{
COleVariant var;
var.ChangeType(VT_I4);
var.lVal = (long)ID;
pUnitRS->SetCurrentIndex(_T("id"));
if(pUnitRS->Seek("=", &var))
{
CDaoVariant v_ID, v_name, v_superior;
//插入当前树结点
v_ID = pUnitRS->GetFieldValue("ID");
v_name = pUnitRS->GetFieldValue("Unit");
v_superior = pUnitRS->GetFieldValue("Superior_id");
Units.push_back(Unit(v_ID.AsInt(), v_name.AsString(), v_superior.AsInt()));
HTREEITEM item = pTree->InsertItem(v_name.AsString(), 1, 0, parent);
Items.push_back(item);
Types.push_back(0);
Points.push_back(Units.size()-1);
pTree->SetItemData(item, DWORD(Items.size()-1));
//插入子结点
pUnitRS->SetCurrentIndex(_T("Superior_id"));
if(pUnitRS->Seek("=", &var))
{
vector<int> childs;
int id, sid;
do
{
id = pUnitRS->GetFieldValue("ID").lVal;
sid = pUnitRS->GetFieldValue("Superior_id").lVal;
if(sid == ID)
childs.push_back(id);
else
break;//或并非孩子结点
pUnitRS->MoveNext();
}
while(!pUnitRS->IsEOF());//库底
for(int i=0; i<childs.size(); i++)
LoadAll(childs[i], item);
//
//插入班级
}
pClassRS->SetCurrentIndex(_T("ID"));
pClassRS->SetCurrentIndex(_T("Superior_id"));
if(pClassRS->Seek("=", &var))
{
CDaoVariant v_class_ID, v_class_name, v_class_superior, v_class_teacher;
HTREEITEM child_item;
do
{
v_class_ID = pClassRS->GetFieldValue("ID");
v_class_name = pClassRS->GetFieldValue("Class");
v_class_superior = pClassRS->GetFieldValue("Superior_id");
v_class_teacher = pClassRS->GetFieldValue("Teacher_id");
if(v_class_superior.AsInt()==ID)
{
Classes.push_back(
Class(v_class_ID.AsInt(),
v_class_name.AsString(),
v_class_superior.AsInt(),
v_class_teacher.AsInt()
)
);
child_item = pTree->InsertItem(v_class_name.AsString(), 2, 2, item);
Items.push_back(child_item);
pTree->SetItemData(child_item, DWORD(Items.size()-1));
Types.push_back(1);
Points.push_back(Classes.size()-1);
}
else
break;//或并非孩子结点
pClassRS->MoveNext();
}
while(!pClassRS->IsEOF());//库底
}
}
}
//##ModelId=40A481F801B7
Unit& UnitClassTree::GetSelectUnit()
{
HTREEITEM item = pTree->GetSelectedItem();
ASSERT(item != NULL);
if(item != NULL)
{
int pos = pTree->GetItemData(item);
if(Types[pos] == 1)//is Class
return Units[Points[pTree->GetItemData(pTree->GetParentItem(item))]];
else
return Units[Points[pos]];
}
else
return Units[0];//缺省返回
}
//##ModelId=40A481F801B6
int UnitClassTree::GetSelectType()
{
HTREEITEM item = pTree->GetSelectedItem();
ASSERT(item != NULL);
if(item)
{
int pos = pTree->GetItemData(item);
return Types[pos];
}
else
{
return -1;
}
}
//##ModelId=40A481F801B5
Class& UnitClassTree::GetSelectClass()
{
HTREEITEM item = pTree->GetSelectedItem();
ASSERT(item != NULL);
if(item != NULL)
{
int pos = pTree->GetItemData(item);
if(Types[pos] == 1)//is Class
{
return Classes[Points[pTree->GetItemData(item)]];
}
}
ASSERT(Classes.size() != 0);
return Classes[0];//缺省返回
}
//##ModelId=40A481F801A5
bool UnitClassTree::SetSelectClass(int ID)
{
int pos=0;
while(pos<Classes.size())
{
if(Classes[pos].ID==ID)
break;
pos++;
}
if(pos == Classes.size())
return false;
for(int i=0;i<Types.size();i++)
{
if(Types[i]==1 && Points[i]==pos)
break;
}
if(i==Types.size())
return false;
pTree->Select(Items[i], TVGN_FIRSTVISIBLE);
pTree->SelectItem(Items[i]);
return true;
}
//##ModelId=40A481F8017A
bool UnitClassTree::SetSelectUnit(int ID)
{
int pos=0;
while(Units[pos].ID!=ID && pos<Units.size())
pos++;
if(pos == Units.size())
return false;
for(int i=0;i<Types.size();i++)
{
if(Types[i]==0 && Points[i]==pos)
break;
}
if(i==Types.size())
return false;
pTree->Select(Items[i], TVGN_FIRSTVISIBLE);
pTree->SelectItem(Items[i]);
return true;
}
//##ModelId=40A481F80179
void UnitClassTree::Clear()
{
UnitTree::Clear();
Points.clear();
Classes.clear();
Types.clear();
}
//##ModelId=40A481F80169
bool UnitClassTree::IsChild(int father_id, int child_id, int type)
{
return false;
}
//##ModelId=40A481F80168
void UnitClassTree::ReLoad()
{
Clear();
Load();
}
//##ModelId=40A481F8015A
void UnitClassTree::DeleteClass(long id)
{
long t_id;
HTREEITEM item , parent_item , next_item;
item = pTree->GetSelectedItem();
parent_item = pTree->GetParentItem(item);
next_item = pTree->GetNextSiblingItem(item);
if(!next_item)
next_item = pTree->GetPrevSiblingItem(item);
if(!next_item)
next_item = parent_item;
int pos = pTree->GetItemData(next_item);
bool type = Types[pos]==1;
t_id = type ? Classes[Points[pos]].ID : Units[Points[pos]].ID;
ReLoad();
if(type)
SetSelectClass(t_id);
else
SetSelectUnit(t_id);
}
//##ModelId=40A481F80158
void UnitClassTree::DeleteUnit(long id)
{
ReLoad();
}
//##ModelId=40A481F8014B
void UnitClassTree::NewClass(long id)
{
ReLoad();
SetSelectClass(id);
}
//##ModelId=40A481F80149
void UnitClassTree::NewUnit(long id)
{
ReLoad();
SetSelectUnit(id);
}
//##ModelId=40A481F8013C
void UnitClassTree::UpdateUnit(long id)
{
ReLoad();
SetSelectUnit(id);
}
//##ModelId=40A481F8013A
void UnitClassTree::UpdateClass(long id)
{
ReLoad();
SetSelectClass(id);
}
//##ModelId=40A481F80138
Class& UnitClassTree::GetClass(HTREEITEM item)
{
if(item != NULL)
{
int pos = pTree->GetItemData(item);
if(Types[pos] == 1)//is Class
{
return Classes[Points[pTree->GetItemData(item)]];
}
}
ASSERT(Classes.size() != 0);
return Classes[0];//缺省返回
}
//##ModelId=40A481F8012A
int UnitClassTree::GetType(HTREEITEM item)
{
int pos = pTree->GetItemData(item);
return Types[pos];
}
//##ModelId=40A481F80128
Unit& UnitClassTree::GetUnit(HTREEITEM item)
{
if(item != NULL)
{
int pos = pTree->GetItemData(item);
if(Types[pos] == 1)//is Class
return Units[Points[pTree->GetItemData(pTree->GetParentItem(item))]];
else
return Units[Points[pos]];
}
else
return Units[0];//缺省返回
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -