Files
envi-code/SourceCode/Code2026/PipelineCmd/ModelLibCopyTreeDlg.cpp
T
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

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;
}
}