203 lines
5.0 KiB
C++
203 lines
5.0 KiB
C++
#include "StdAfx.h"
|
|
#include "ModelLibCopyTreeDlg.h"
|
|
#include "ModelLibDlgBase.h"
|
|
#include "CoreTools.h"
|
|
|
|
namespace
|
|
{
|
|
HTREEITEM findSubDir(CTreeCtrl &tree, HTREEITEM hRoot, LPCTSTR pszSubDir)
|
|
{
|
|
if (!tree.ItemHasChildren(hRoot) || !pszSubDir) return NULL;
|
|
|
|
CString str(_T(""));
|
|
HTREEITEM hChildItem = tree.GetChildItem(hRoot);
|
|
while (hChildItem != NULL)
|
|
{
|
|
str = tree.GetItemText(hChildItem);
|
|
if (str == pszSubDir)
|
|
return hChildItem;
|
|
hChildItem = tree.GetNextItem(hChildItem, TVGN_NEXT);
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
bool isFolderItem(CTreeCtrl &tree, HTREEITEM hItem)
|
|
{
|
|
return tree.GetRootItem() == tree.GetParentItem(hItem);
|
|
}
|
|
|
|
bool isRootItem(CTreeCtrl &tree, HTREEITEM hItem)
|
|
{
|
|
return hItem == tree.GetRootItem();
|
|
}
|
|
|
|
bool isClassItem(CTreeCtrl &tree, HTREEITEM hItem)
|
|
{
|
|
return (!isRootItem(tree, hItem) && !isFolderItem(tree, hItem));
|
|
}
|
|
|
|
HTREEITEM getParentFolder(CTreeCtrl &tree, const HTREEITEM &hItem)
|
|
{
|
|
if (hItem == tree.GetRootItem()) return NULL;
|
|
if (isFolderItem(tree, hItem)) return hItem;
|
|
|
|
HTREEITEM h = tree.GetParentItem(hItem);
|
|
while (isClassItem(tree, h))
|
|
{
|
|
h = tree.GetParentItem(h);;
|
|
}
|
|
|
|
return h;
|
|
}
|
|
|
|
CString getClassName(CTreeCtrl &tree, const HTREEITEM &hItem)
|
|
{
|
|
if (!isClassItem(tree, hItem)) return _T("");
|
|
CString sItem = tree.GetItemText(hItem);
|
|
std::vector<CString> v;
|
|
HTREEITEM hParent(hItem);
|
|
while (isClassItem(tree, hParent))
|
|
{
|
|
v.push_back(tree.GetItemText(hParent));
|
|
hParent = tree.GetParentItem(hParent);
|
|
}
|
|
CString sClass(_T(""));
|
|
for (std::vector<CString>::reverse_iterator it = v.rbegin(); it != v.rend(); ++it)
|
|
{
|
|
sClass += *it;
|
|
sClass += _T("\\");
|
|
}
|
|
sClass = sClass.Left(sClass.ReverseFind(_T('\\')));
|
|
return sClass;
|
|
}
|
|
|
|
int getLastInserId(CUIISQLiteServer &db, LPCTSTR pszTable)
|
|
{
|
|
CString sId;
|
|
if (db.GetSelData(CString(_T("select last_insert_rowid() from")) + pszTable, sId))
|
|
return TypeConvert::convert<int, LPCTSTR>(sId);
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
IMPLEMENT_DYNAMIC(CModelLibCopyTreeDlg, CDialog)
|
|
BEGIN_MESSAGE_MAP(CModelLibCopyTreeDlg, CDialog)
|
|
ON_BN_CLICKED(IDOK, &CModelLibCopyTreeDlg::OnBnClickedOk)
|
|
ON_BN_CLICKED(IDCANCEL, &CModelLibCopyTreeDlg::OnBnClickedCancel)
|
|
ON_BN_CLICKED(IDC_BUTTON1, &CModelLibCopyTreeDlg::OnNewFolder)
|
|
END_MESSAGE_MAP()
|
|
|
|
CModelLibCopyTreeDlg::CModelLibCopyTreeDlg(CImageList &img
|
|
, CUIISQLiteServer &db
|
|
, LPCTSTR pszTreeRoot
|
|
, LPCTSTR pszTablePrefix
|
|
, CWnd *pParent): CDialog(CModelLibCopyTreeDlg::IDD, pParent)
|
|
, m_imageList(img)
|
|
, m_iClassId(-1)
|
|
, m_sqlDB(db)
|
|
, m_sTreeRoot(pszTreeRoot)
|
|
, m_sTablePrefix(pszTablePrefix) { }
|
|
|
|
CModelLibCopyTreeDlg::~CModelLibCopyTreeDlg() { }
|
|
|
|
void CModelLibCopyTreeDlg::DoDataExchange(CDataExchange * pDX)
|
|
{
|
|
CDialog::DoDataExchange(pDX);
|
|
DDX_Control(pDX, IDC_TREE1, m_ctrlDirTree);
|
|
}
|
|
|
|
BOOL CModelLibCopyTreeDlg::OnInitDialog()
|
|
{
|
|
CDialog::OnInitDialog();
|
|
CModelLibDlgBase::helper_initLocalDirTree(m_ctrlDirTree
|
|
, m_imageList
|
|
, m_sqlDB
|
|
, m_sTreeRoot
|
|
, m_sTablePrefix);
|
|
return TRUE;
|
|
}
|
|
|
|
void CModelLibCopyTreeDlg::OnBnClickedOk()
|
|
{
|
|
HTREEITEM hItem = m_ctrlDirTree.GetSelectedItem();
|
|
if (!hItem)
|
|
{
|
|
AfxMessageBox(_T("请选择一个目录!"));
|
|
return;
|
|
}
|
|
if (::isFolderItem(m_ctrlDirTree, hItem) || ::isRootItem(m_ctrlDirTree, hItem))
|
|
{
|
|
AfxMessageBox(_T("不能选择根目录和一级目录!"));
|
|
return;
|
|
}
|
|
|
|
m_iClassId = m_ctrlDirTree.GetItemData(hItem);
|
|
|
|
CDialog::OnOK();
|
|
}
|
|
|
|
void CModelLibCopyTreeDlg::OnBnClickedCancel()
|
|
{
|
|
CDialog::OnCancel();
|
|
}
|
|
|
|
void CModelLibCopyTreeDlg::OnNewFolder()
|
|
{
|
|
HTREEITEM hRoot(m_ctrlDirTree.GetRootItem());
|
|
HTREEITEM hItem = m_ctrlDirTree.GetSelectedItem();
|
|
if (!hItem)
|
|
{
|
|
AfxMessageBox(_T("请选中一个目录!"));
|
|
return;
|
|
}
|
|
|
|
CString sName(_T("")), sTmp(_T(""));
|
|
if (!CoreTools::getNameByDialog(_T("输入目录名称"), _T("目录名称"), sTmp)) return;
|
|
if (sTmp.Find(_T('\\')) != -1)
|
|
{
|
|
AfxMessageBox(_T("目录名称中不能存在字符“\\”!"));
|
|
return;
|
|
}
|
|
|
|
HTREEITEM h = findSubDir(m_ctrlDirTree, hItem, sTmp);
|
|
if (h)
|
|
{
|
|
AfxMessageBox(_T("目录已经存在!"));
|
|
return;
|
|
}
|
|
|
|
CString sql(_T("")), sId(_T(""));
|
|
HTREEITEM hNew(NULL);
|
|
if (isRootItem(m_ctrlDirTree,hItem)) // 添加 folder
|
|
{
|
|
sql.Format(_T("insert into %s_folder (folder) values ('%s')"), m_sTablePrefix, sTmp);
|
|
if (m_sqlDB.ExecuteSQL(sql))
|
|
{
|
|
hNew = m_ctrlDirTree.InsertItem(sTmp, 0, 2, hItem);
|
|
m_ctrlDirTree.SetItemData(hNew, getLastInserId(m_sqlDB, m_sTablePrefix + _T("_folder")));
|
|
m_ctrlDirTree.Expand(hItem, TVE_EXPAND);
|
|
}
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
CString sClass = getClassName(m_ctrlDirTree,hItem);
|
|
if (!sClass.IsEmpty())
|
|
sClass += _T("\\");
|
|
sClass += sTmp;
|
|
|
|
HTREEITEM hParent = getParentFolder(m_ctrlDirTree,hItem);
|
|
int idFolder = m_ctrlDirTree.GetItemData(hParent);
|
|
|
|
sql.Format(_T("insert into %s_class (class, idfolder) values ('%s', '%d')"), m_sTablePrefix, sClass, idFolder);
|
|
if (m_sqlDB.ExecuteSQL(sql))
|
|
{
|
|
hNew = m_ctrlDirTree.InsertItem(sTmp, 0, 2, hItem);
|
|
m_ctrlDirTree.SetItemData(hNew, getLastInserId(m_sqlDB, m_sTablePrefix + _T("_folder")));
|
|
m_ctrlDirTree.Expand(hItem, TVE_EXPAND);
|
|
}
|
|
return;
|
|
}
|
|
}
|
|
|