code_production/cfg-tools/apps/scanner-check/CDlgItemMgr.cpp

361 lines
9.4 KiB
C++
Raw Normal View History

2022-12-09 07:31:09 +00:00
// CDlgItemMgr.cpp: 实现文件
//
#include "pch.h"
#include "scanner-check.h"
#include "CDlgItemMgr.h"
#include "afxdialogex.h"
#include "CDlgInput.h"
2022-12-09 07:31:09 +00:00
#include <file/file_util.h>
#include <coding/coding.h>
// CDlgItemMgr 对话框
#pragma warning(disable: 4996)
static bool is_checked(CWnd* ctrl)
{
return ((CButton*)ctrl)->GetCheck() == BST_CHECKED;
}
static bool is_checked(CDialogEx* dlg, UINT id)
{
return is_checked(dlg->GetDlgItem(id));
}
static void set_checked(CWnd* ctrl, bool checked)
{
((CButton*)ctrl)->SetCheck(checked ? BST_CHECKED : BST_UNCHECKED);
}
static void set_checked(CDialogEx* dlg, UINT id, bool checked)
{
return set_checked(dlg->GetDlgItem(id), checked);
}
IMPLEMENT_DYNAMIC(CDlgItemMgr, CDialogEx)
CDlgItemMgr::CDlgItemMgr(CWnd* pParent /*=nullptr*/)
: CDialogEx(IDD_TEST_ITEM, pParent)
{
}
CDlgItemMgr::~CDlgItemMgr()
{
}
void CDlgItemMgr::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_LIST1, list_);
}
BOOL CDlgItemMgr::OnInitDialog()
{
CDialogEx::OnInitDialog();
int ind = list_.InsertColumn(list_.GetHeaderCtrl()->GetItemCount(), TEXT("\u5E8F\u53F7"), 0, 40);
list_.InsertColumn(list_.GetHeaderCtrl()->GetItemCount(), TEXT("ID"), 0, 60);
list_.InsertColumn(list_.GetHeaderCtrl()->GetItemCount(), TEXT("\u540D\u79F0"), 0, 102);
list_.InsertColumn(list_.GetHeaderCtrl()->GetItemCount(), TEXT("\u5FC5\u987B\u8054\u673A\u6D4B\u8BD5"), 0, 87);
list_.InsertColumn(list_.GetHeaderCtrl()->GetItemCount(), TEXT("\u4E0D\u901A\u8FC7\u5219\u505C\u6B62"), 0, 87);
list_.InsertColumn(list_.GetHeaderCtrl()->GetItemCount(), TEXT("\u63CF\u8FF0"), 0, 120);
2022-12-09 07:31:09 +00:00
list_.SetExtendedStyle((list_.GetExStyle() | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES) & (~LVS_EX_CHECKBOXES));
list_.ModifyStyle(0, LVS_SINGLESEL);
load_stored_config();
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
BEGIN_MESSAGE_MAP(CDlgItemMgr, CDialogEx)
ON_BN_CLICKED(IDC_BUTTON_ADD, &CDlgItemMgr::OnBnClickedButtonAdd)
ON_NOTIFY(NM_DBLCLK, IDC_LIST1, &CDlgItemMgr::OnNMDblclkList1)
ON_WM_DROPFILES()
END_MESSAGE_MAP()
// CDlgItemMgr 消息处理程序
void CDlgItemMgr::OnBnClickedButtonAdd()
{
// TODO: 在此添加控件通知处理程序代码
wchar_t text[128] = { 0 }, name[128] = { 0 }, desc[128] = { 0 };
2022-12-09 07:31:09 +00:00
bool online = is_checked(this, IDC_CHECK_ONLINE), fatal = is_checked(this, IDC_CHECK_FATAL);
int ind = -1;
if (::GetWindowTextW(GetDlgItem(IDC_EDIT_TITLE)->m_hWnd, text, _countof(text) - 1) == 0 ||
::GetWindowTextW(GetDlgItem(IDC_EDIT_NAME)->m_hWnd, name, _countof(name) - 1) == 0)
return;
if (::GetWindowTextW(GetDlgItem(IDC_EDIT_DESC)->m_hWnd, name, _countof(name) - 1) == 0)
{
wcscpy(desc, text);
}
2022-12-09 07:31:09 +00:00
for (int i = 0; i < list_.GetItemCount(); ++i)
{
wchar_t val[128] = { 0 };
list_.GetItemText(i, 1, val, _countof(val) - 1);
if (wcscmp(name, val) == 0)
{
ind = i;
break;
}
}
if (ind == -1)
{
wchar_t sn[20] = { 0 };
swprintf_s(sn, _countof(sn) - 1, L"%u", list_.GetItemCount() + 1);
ind = list_.InsertItem(list_.GetItemCount(), sn);
list_.SetItemText(ind, 1, name);
}
list_.SetItemText(ind, 2, text);
list_.SetItemText(ind, 3, online ? L"true" : L"false");
list_.SetItemText(ind, 4, fatal ? L"true" : L"false");
list_.SetItemText(ind, 5, desc);
2022-12-09 07:31:09 +00:00
list_.SetItemState(ind, LVNI_FOCUSED | LVIS_SELECTED, LVNI_FOCUSED | LVIS_SELECTED);
item_changed();
}
void CDlgItemMgr::OnNMDblclkList1(NMHDR* pNMHDR, LRESULT* pResult)
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
POINT pos = { 0 };
RECT r = { 0 };
GetCursorPos(&pos);
list_.ScreenToClient(&pos);
r.left = list_.HitTest(pos);
if (r.left != -1)
{
std::vector<int> width;
int ind = r.left, hpos = list_.GetScrollPos(SB_HORZ);
2022-12-09 07:31:09 +00:00
for (int i = 0; i < list_.GetHeaderCtrl()->GetItemCount(); ++i)
{
RECT r = { 0 };
list_.GetHeaderCtrl()->GetItemRect(i, &r);
width.push_back(r.right - r.left);
}
pos.x += hpos;
2022-12-09 07:31:09 +00:00
for (int i = 0; i < width.size(); ++i)
{
if (pos.x <= width[i])
{
wchar_t text[128] = { 0 };
if (i < 3)
{
std::wstring tips(L"\u5220\u9664\u6D4B\u8BD5\u9879\uFF1A");
list_.GetItemText(ind, 1, text, _countof(text) - 1);
tips += text;
tips += L"\uFF1F";
if (::MessageBoxW(m_hWnd, tips.c_str(), L"\u786E\u8BA4", MB_YESNO | MB_ICONQUESTION) == IDYES)
{
list_.DeleteItem(ind);
for (; ind < list_.GetItemCount(); ++ind)
{
swprintf_s(text, _countof(text) - 1, L"%u", ind + 1);
list_.SetItemText(ind, 0, text);
}
}
}
else if(i < 5)
2022-12-09 07:31:09 +00:00
{
list_.GetItemText(ind, i, text, _countof(text) - 1);
if (wcscmp(text, L"true"))
list_.SetItemText(ind, i, L"true");
else
list_.SetItemText(ind, i, L"false");
}
else
{
CDlgInput input;
wchar_t val[128] = { 0 };
std::wstring def(L"");
list_.GetItemText(ind, 2, val, _countof(val) - 1);
def = val;
input.set_title((std::wstring(L"\u4FEE\u6539 ") + val + L" \u63CF\u8FF0").c_str());
list_.GetItemText(ind, 5, val, _countof(val) - 1);
input.val_ = val;
if (input.DoModal() == IDOK)
{
if(input.val_.empty())
list_.SetItemText(ind, 5, def.c_str());
else
list_.SetItemText(ind, 5, input.val_.c_str());
}
}
2022-12-09 07:31:09 +00:00
break;
}
pos.x -= width[i];
}
}
*pResult = 0;
item_changed();
}
std::wstring CDlgItemMgr::get_stored_config_file(void)
{
wchar_t path[MAX_PATH] = { 0 };
std::wstring file(L"");
size_t pos = 0;
GetModuleFileNameW(NULL, path, _countof(path) - 1);
file = path;
pos = file.rfind(L'\\');
if (pos++ != std::wstring::npos)
file.erase(pos);
file += L"config\\stored.txt";
return file;
}
void CDlgItemMgr::get_item(int ind, page_config::ITEM* item)
{
wchar_t text[128] = { 0 };
list_.GetItemText(ind, 1, text, _countof(text) - 1);
item->name = text;
list_.GetItemText(ind, 2, text, _countof(text) - 1);
item->title = text;
list_.GetItemText(ind, 3, text, _countof(text) - 1);
item->man = wcscmp(text, L"false") == 0;
list_.GetItemText(ind, 4, text, _countof(text) - 1);
item->fatal = wcscmp(text, L"true") == 0;
list_.GetItemText(ind, 5, text, _countof(text) - 1);
item->desc = text;
2022-12-09 07:31:09 +00:00
}
void CDlgItemMgr::load_from_file(const wchar_t* file)
{
wchar_t path[MAX_PATH] = { 0 },
*sn = path,
*n = sn + 40,
*t = n + 40,
*m = t + 40,
*f = m + 40,
*d = f + 40;
2022-12-09 07:31:09 +00:00
size_t pos = 0;
std::string bom("");
std::wstring cont(L"");
list_.DeleteAllItems();
file_util::load_file(file, got_str, &bom);
coding_util::bom::to_unicode(bom.c_str(), bom.length(), got_wstr, &cont);
cont += L"\r\n";
while ((pos = cont.find(L"\r\n")) != std::wstring::npos)
{
int cnt = swscanf(cont.substr(0, pos).c_str(), L"%s %s %s %s %s", n, t, m, f, d);
2022-12-09 07:31:09 +00:00
if (cnt >= 2)
{
bool man = false, fatal = true;
if (cnt >= 3)
man = wcscmp(m, L"false") == 0;
if (cnt >= 4)
fatal = wcscmp(f, L"true") == 0;
swprintf_s(sn, 20, L"%u", list_.GetItemCount() + 1);
cnt = list_.InsertItem(list_.GetItemCount(), sn);
list_.SetItemText(cnt, 1, n);
list_.SetItemText(cnt, 2, t);
list_.SetItemText(cnt, 3, man ? L"false" : L"true");
list_.SetItemText(cnt, 4, f ? L"true" : L"false");
if(*d)
list_.SetItemText(cnt, 5, d);
else
list_.SetItemText(cnt, 5, t);
2022-12-09 07:31:09 +00:00
}
memset(path, 0, sizeof(path));
2022-12-09 07:31:09 +00:00
cont.erase(0, pos + 2);
}
::PostMessage(GetParent()->m_hWnd, WM_TEST_ITEM_CHANGED, 0, 0);
}
void CDlgItemMgr::load_stored_config(void)
{
std::wstring file(get_stored_config_file());
load_from_file(file.c_str());
}
void CDlgItemMgr::item_changed(void)
{
std::vector<page_config::ITEM> items;
std::wstring text(L"");
std::string bom("");
get_all_items(items);
for (size_t i = 0; i < items.size(); ++i)
{
text += items[i].name + L" " + items[i].title + L" ";
text += items[i].man ? L"false " : L"true ";
text += items[i].fatal ? L"true " : L"false ";
text += items[i].desc + L"\r\n";
2022-12-09 07:31:09 +00:00
}
coding_util::bom::from_unicode(text.c_str(), text.length() * 2, got_str, &bom);
file_util::save_2_file(bom.c_str(), bom.length(), get_stored_config_file().c_str());
::PostMessage(GetParent()->m_hWnd, WM_TEST_ITEM_CHANGED, 0, 0);
}
bool CDlgItemMgr::get_name(const wchar_t* title, page_config::ITEM* item)
{
wchar_t text[128] = { 0 };
for (size_t i = 0; i < list_.GetItemCount(); ++i)
{
list_.GetItemText(i, 2, text, _countof(text) - 1);
if (wcscmp(text, title) == 0)
{
get_item(i, item);
return true;
}
text[0] = 0;
}
return false;
}
2022-12-09 08:56:15 +00:00
bool CDlgItemMgr::get_title(const wchar_t* name, page_config::ITEM* item)
{
wchar_t text[128] = { 0 };
for (size_t i = 0; i < list_.GetItemCount(); ++i)
{
list_.GetItemText(i, 1, text, _countof(text) - 1);
if (wcscmp(text, name) == 0)
{
get_item(i, item);
return true;
}
text[0] = 0;
}
return false;
}
2022-12-09 07:31:09 +00:00
void CDlgItemMgr::get_all_items(std::vector<page_config::ITEM>& items)
{
wchar_t text[128] = { 0 };
for (size_t i = 0; i < list_.GetItemCount(); ++i)
{
page_config::ITEM item;
get_item(i, &item);
items.push_back(item);
}
}
void CDlgItemMgr::OnDropFiles(HDROP hDropInfo)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
// TODO: 在此添加消息处理程序代码和/或调用默认值
wchar_t path[MAX_PATH] = { 0 };
std::wstring cont(L"");
std::string bom("");
DragQueryFileW(hDropInfo, 0, path, _countof(path) - 1);
load_from_file(path);
CDialogEx::OnDropFiles(hDropInfo);
}
2022-12-09 08:56:15 +00:00