?? dbtreeview.cpp.txt
字號:
// DbTreeView.cpp : implementation file
//
#include "stdafx.h"
#include "minidatabase.h"
#include "DbTreeView.h"
#include "TextView.h"
#include "MainFrm.h"
#include "TableDlg.h"
#include "FieldDlg.h"
#include "KeyDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
const UINT IDC_TREE_CTRL = 1001;
/////////////////////////////////////////////////////////////////////////////
// CDbTreeView
IMPLEMENT_DYNCREATE(CDbTreeView, CView)
CDbTreeView::CDbTreeView()
{
m_pEditMemory = (BYTE *)malloc(EDIT_MEMORY_SIZE);
if (m_pEditMemory)
m_pMemoryEnd = m_pEditMemory + EDIT_MEMORY_SIZE;
else
m_pMemoryEnd = NULL;
// 設(shè)置數(shù)據(jù)庫內(nèi)存
RestartMemory();
// 初始化一個表
init_my_db(&m_hashEditDb, NULL);
}
CDbTreeView::~CDbTreeView()
{
if (m_pEditMemory)
free(m_pEditMemory);
}
void CDbTreeView::RestartMemory()
{
tool_set_nofree_base(m_pEditMemory, m_pMemoryEnd, m_pEditMemory);
}
#define _PM IsPrivateMemory
BOOL CDbTreeView::IsPrivateMemory(void *buff)
{
if (m_pEditMemory)
{
if (buff >= m_pEditMemory && buff < m_pMemoryEnd)
return FALSE;
}
return TRUE;
}
void CDbTreeView::ClearTable(TABLE *table)
{
RECORD *record = table->records;
do
{
if (record == NULL)
break;
RECORD *temp = record;
record = record->next;
if (_PM(temp))
delete temp;
} while (record != table->records);
}
void CDbTreeView::ClearBranchNode(CTreeCtrl &tc, HTREEITEM hti, BOOL bDelPriv)
{
HTREEITEM htiChild = NULL;
while (hti)
{
// 獲取子節(jié)點(diǎn)
htiChild = tc.GetChildItem(hti);
if (htiChild)
ClearBranchNode(tc, htiChild, bDelPriv);
// 刪除當(dāng)前節(jié)點(diǎn)信息
DWORD dwData = tc.GetItemData(hti);
if (dwData > 0)
{
NODE_DATA *nd = (NODE_DATA *)dwData;
switch (nd->type)
{
case DATA_TYPE_TABLE:
if (bDelPriv)
{
TABLE *table = (TABLE *)nd->data;
// 清理表記錄內(nèi)存
ClearTable(table);
// 清理表自身內(nèi)存
if (_PM(table->name))
delete table->name;
if (_PM(table->fields))
delete table->fields;
if (_PM(table->keys))
delete table->keys;
if (_PM(table))
delete table;
}
break;
case DATA_TYPE_FIELD:
if (bDelPriv)
{
FIELD *f = (FIELD *)nd->data;
if (_PM(f->name))
delete f->name;
if ((f->flags & FF_HAVE_DEFAULT)
&& (f->count > 1)
&& _PM(f->dv_ptr))
delete f->dv_ptr;
}
break;
case DATA_TYPE_KEY:
if (bDelPriv)
{
KEY *k = (KEY *)nd->data;
if (_PM(k->fields))
delete k->fields;
}
break;
}
delete nd;
}
HTREEITEM hDel = hti;
// 獲取兄弟節(jié)點(diǎn)
hti = tc.GetNextSiblingItem(hti);
// 刪除
tc.DeleteItem(hDel);
}
}
void CDbTreeView::ClearTree()
{
CTreeCtrl &tc = m_treeCtrl;
// 遞歸調(diào)用清除所有節(jié)點(diǎn)信息
ClearBranchNode(tc, tc.GetRootItem());
tc.DeleteAllItems();
// 隱藏記錄視圖
CMainFrame *mf = (CMainFrame *)GetParentFrame();
mf->m_pEditDbView[1]->PostMessage(WM_HIDE_GRID, 0, 0);
}
CString GetFieldType(FIELD *f)
{
CString str;
switch (f->type)
{
case FIELD_TYPE_CHAR:
str = _T("CHAR");
break;
case FIELD_TYPE_BYTE:
str = _T("BYTE");
break;
case FIELD_TYPE_SHORT:
str = _T("SHORT");
break;
case FIELD_TYPE_WORD:
str = _T("USHORT");
break;
case FIELD_TYPE_INT:
str = _T("INT");
break;
case FIELD_TYPE_UINT:
str = _T("UINT");
break;
default:
str = _T("UNKNOW");
}
if (f->count > 1)
{
CString strArr;
strArr.Format(_T("(%u)"), f->count);
str += strArr;
}
return str;
}
HTREEITEM CDbTreeView::InsertTreeNode(CTreeCtrl &tc, HTREEITEM htiParent, HTREEITEM htiAfter,
CString strTitle, int iImage, int iSelImage,
NODE_DATA *nd)
{
TV_INSERTSTRUCT newTreeItem;
newTreeItem.hParent = htiParent;
newTreeItem.hInsertAfter = htiAfter;
newTreeItem.item.iImage = iImage;
newTreeItem.item.iSelectedImage = iSelImage;
newTreeItem.item.pszText = (LPSTR)((LPCTSTR)strTitle);
newTreeItem.item.mask = TVIF_TEXT;
if (iImage >= 0)
newTreeItem.item.mask |= TVIF_IMAGE;
if (iSelImage >= 0)
newTreeItem.item.mask |= TVIF_SELECTEDIMAGE;
HTREEITEM htiNew = tc.InsertItem(&newTreeItem);
if (htiNew)
tc.SetItemData(htiNew, (DWORD)nd);
return htiNew;
}
// Load Table
void CDbTreeView::LoadTable(CTreeCtrl &tc, HTREEITEM htiParent, TABLE *table)
{
if (htiParent)
ClearBranchNode(tc, tc.GetChildItem(htiParent), FALSE);
// 載入字段信息
for (int i = 0; i < table->field_count; i++)
{
FIELD *f = table->fields + i;
CString strTitle;
strTitle.Format(_T("%s"), f->name);
NODE_DATA *nd = new NODE_DATA;
if (nd)
{
nd->type = DATA_TYPE_FIELD;
nd->data = (BYTE *)f;
}
HTREEITEM hti = InsertTreeNode(tc, htiParent, TVI_LAST, strTitle, 0, 0, nd);
}
// 載入關(guān)鍵字
for (i = 0; i < table->key_count; i++)
{
KEY *k = table->keys + i;
CString strTitle = _T("");
for (int m = 0; m < k->field_count; m++)
{
FIELD *f = table->fields + k->fields[m];
strTitle += f->name;
if (m < k->field_count - 1)
strTitle += _T(" | ");
}
NODE_DATA *nd = new NODE_DATA;
if (nd)
{
nd->type = DATA_TYPE_KEY;
nd->data = (BYTE *)k;
}
HTREEITEM hti = InsertTreeNode(tc, htiParent, TVI_LAST, strTitle, 1, 1, nd);
}
}
void CDbTreeView::LoadDb()
{
ClearTree();
// 載入數(shù)據(jù)
HASH_DATA *data = dynamic_element(&m_hashEditDb.array, 0, HASH_DATA*);
int records = m_hashEditDb.records;
for (int i = 0; i < records; i++)
{
TABLE *table = (TABLE *)data[i].data;
// 加入表名稱
CString strTitle = table->name;
NODE_DATA *nd = new NODE_DATA;
if (nd)
{
nd->type = DATA_TYPE_TABLE;
nd->data = (BYTE *)table;
}
HTREEITEM hti = InsertTreeNode(m_treeCtrl, NULL, TVI_SORT, strTitle, 2, 2, nd);
// Load Table
LoadTable(m_treeCtrl, hti, table);
}
// 載入第一項
HTREEITEM htiFirst = m_treeCtrl.GetRootItem();
if (htiFirst)
{
m_treeCtrl.SetFocus();
m_treeCtrl.SelectItem(htiFirst);
}
}
void CDbTreeView::AlterTable_EditField(TABLE *table, FIELD *of)
{
}
void CDbTreeView::AlterTable_CreateField(TABLE *table, FIELD *nf)
{
}
void CDbTreeView::AlterTable_DeleteField(TABLE *table, FIELD *df)
{
}
void CDbTreeView::AlterTable_MoveField(TABLE *table, FIELD *f1, FIELD *f2)
{
}
BEGIN_MESSAGE_MAP(CDbTreeView, CView)
//{{AFX_MSG_MAP(CDbTreeView)
ON_UPDATE_COMMAND_UI(ID_EDIT_INDICATOR_CRLF, OnUpdateIndicatorCRLF)
ON_UPDATE_COMMAND_UI(ID_INDICATOR_OVR, OnUpdateIndicatorOvr)
ON_WM_CREATE()
ON_WM_DESTROY()
ON_WM_SIZE()
ON_NOTIFY(TVN_SELCHANGED, IDC_TREE_CTRL, OnSelchangedTreeCtrl)
ON_NOTIFY(NM_DBLCLK, IDC_TREE_CTRL, OnDblclkTreeCtrl)
ON_NOTIFY(NM_RCLICK, IDC_TREE_CTRL, OnRclickTreeCtrl)
ON_NOTIFY(TVN_GETINFOTIP, IDC_TREE_CTRL, OnGetInfoTipTreeCtrl)
ON_COMMAND(ID_EDIT_TABLE, OnEditTable)
ON_COMMAND(ID_CREATE_TABLE, OnCreateTable)
ON_COMMAND(ID_DELETE_TABLE, OnDeleteTable)
ON_COMMAND(ID_EDIT_FIELD, OnEditField)
ON_COMMAND(ID_CREATE_FIELD, OnCreateField)
ON_COMMAND(ID_DELETE_FIELD, OnDeleteField)
ON_COMMAND(ID_EDIT_KEY, OnEditKey)
ON_COMMAND(ID_CREATE_KEY, OnCreateKey)
ON_COMMAND(ID_DELETE_KEY, OnDeleteKey)
//}}AFX_MSG_MAP
ON_MESSAGE(WM_FILE_NEW, OnFileNew)
ON_MESSAGE(WM_FILE_OPEN, OnFileOpen)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDbTreeView drawing
void CDbTreeView::OnDraw(CDC* pDC)
{
CDocument* pDoc = GetDocument();
// TODO: add draw code here
}
/////////////////////////////////////////////////////////////////////////////
// CDbTreeView diagnostics
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -