#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 v; HTREEITEM hParent(hItem); while (isClassItem(tree, hParent)) { v.push_back(tree.GetItemText(hParent)); hParent = tree.GetParentItem(hParent); } CString sClass(_T("")); for (std::vector::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(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; } }