doc_and_tools/tools/apps/hgjson/DlgRange.cpp

490 lines
12 KiB
C++

// DlgRange.cpp: 实现文件
//
#include "stdafx.h"
#include "hgjson.h"
#include "DlgRange.h"
#include "afxdialogex.h"
#include "resource.h"
#include "DlgCondition.h"
// CDlgRange 对话框
IMPLEMENT_DYNAMIC(CDlgRange, CDialogEx)
CDlgRange::CDlgRange(const wchar_t* name, int type, CWnd* pParent /*=nullptr*/)
: CDialogEx(IDD_RANGE, pParent)
, name_(name ? name : L""), type_(type)
{
}
CDlgRange::~CDlgRange()
{
}
std::wstring CDlgRange::get_item_text(UINT id)
{
int l = GetDlgItem(id)->GetWindowTextLengthW();
wchar_t* buf = new wchar_t[l + 4];
l = GetDlgItem(id)->GetWindowTextW(buf, l + 2);
buf[l] = 0;
std::wstring ret(buf);
delete[] buf;
return std::move(ret);
}
void CDlgRange::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_LIST1, list_);
DDX_Control(pDX, IDC_COMBO_VAL, val_);
DDX_Control(pDX, IDC_COMBO_RANGE_FIELD, range_type_);
}
BOOL CDlgRange::OnInitDialog()
{
CDialogEx::OnInitDialog();
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
list_.SetExtendedStyle(list_.GetExtendedStyle() | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_INFOTIP);
list_.InsertColumn(0, TEXT("Value lists"), 0, 150);
list_.InsertColumn(1, TEXT("Condition"), 0, 159);
//list_.InsertColumn(2, TEXT("Default"), 0, 48);
GetDlgItem(IDC_EDIT_VAL)->EnableWindow(type_ != TYPE_FIELDS);
list_.EnableWindow(type_ != TYPE_FIELDS);
GetDlgItem(IDC_BUTTON_ADD)->EnableWindow(type_ != TYPE_FIELDS);
GetDlgItem(IDC_EDIT_FROM)->EnableWindow(type_ == TYPE_RANGE);
GetDlgItem(IDC_EDIT_TO)->EnableWindow(type_ == TYPE_RANGE);
GetDlgItem(IDC_EDIT_STEP)->EnableWindow(type_ == TYPE_RANGE);
GetDlgItem(IDC_EDIT_INIT2)->EnableWindow(type_ == TYPE_RANGE);
range_type_.EnableWindow(type_ == TYPE_RANGE);
GetDlgItem(IDC_COMBO_FIELD)->EnableWindow(type_ == TYPE_FIELDS);
val_.EnableWindow(type_ == TYPE_FIELDS);
func_menu_.LoadMenu(IDR_MENU_RANGE_VALUE);
list_cur_sel_ = -1;
if (type_ == TYPE_LIST || type_ == TYPE_RANGE)
{
bool def = false;
for (auto& v: vals_)
{
int ind = list_.InsertItem(list_.GetItemCount(), v.val.c_str());
std::wstring cond(v.cond);
for (auto& init : init_)
{
if (v.val == init.val)
{
//list_.SetItemText(ind, 2, L"yes");
cond.insert(0, L"default:");
def = true;
break;
}
}
list_.SetItemText(ind, 1, cond.c_str());
}
if (!def && init_.size())
{
int ind = list_.InsertItem(list_.GetItemCount(), init_[0].val.c_str());
list_.SetItemText(ind, 1, L"default:");
}
}
//else if(type_ == TYPE_RANGE && vals_.size() == 3)
//{
// SetDlgItemTextW(IDC_EDIT_FROM, vals_[0].val.c_str());
// SetDlgItemTextW(IDC_EDIT_TO, vals_[1].val.c_str());
// SetDlgItemTextW(IDC_EDIT_STEP, vals_[2].val.c_str());
// SetDlgItemTextW(IDC_EDIT_INIT2, init_.c_str());
//}
else if (type_ == TYPE_FIELDS)
{
}
return TRUE; // return TRUE unless you set the focus to a control
}
BEGIN_MESSAGE_MAP(CDlgRange, CDialogEx)
ON_BN_CLICKED(IDC_BUTTON_ADD, &CDlgRange::OnBnClickedButton1)
ON_BN_CLICKED(IDOK, &CDlgRange::OnBnClickedOk)
ON_NOTIFY(NM_DBLCLK, IDC_LIST1, &CDlgRange::OnNMDblclkList1)
ON_CBN_SELCHANGE(IDC_COMBO_FIELD, &CDlgRange::OnCbnSelchangeComboField)
ON_COMMAND(ID_RANGEVALUEMENU_DEFAULT, &CDlgRange::OnRangevaluemenuDefault)
ON_COMMAND(ID_RANGEVALUEMENU_DELETE, &CDlgRange::OnRangevaluemenuDelete)
ON_COMMAND(ID_RANGEVALUEMENU_SETCONDITION, &CDlgRange::OnRangevaluemenuSetcondition)
ON_NOTIFY(NM_RCLICK, IDC_LIST1, &CDlgRange::OnNMRClickList1)
END_MESSAGE_MAP()
// CDlgRange 消息处理程序
void CDlgRange::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
std::wstring val(get_item_text(IDC_EDIT_VAL)), range(get_item_text(IDC_COMBO_RANGE_FIELD));
int ind = -1;
if (val.empty())
{
MessageBox(TEXT("NO Input!"));
GotoDlgCtrl(GetDlgItem(IDC_EDIT_VAL));
return;
}
if (type_ == TYPE_RANGE && range.empty())
{
MessageBox(TEXT("Range value, must specify the role!"));
GotoDlgCtrl(GetDlgItem(IDC_COMBO_RANGE_FIELD));
return;
}
if (type_ == TYPE_LIST)
{
for (int i = 0; i < list_.GetItemCount(); ++i)
{
wchar_t buf[25] = { 0 };
list_.GetItemText(i, 0, buf, _countof(buf) - 1);
if (val == buf)
{
list_.SetItemState(i, LVIS_FOCUSED | LVIS_SELECTED | LVIS_ACTIVATING, LVIS_FOCUSED | LVIS_SELECTED | LVIS_ACTIVATING);
list_.SetSelectionMark(i);
ind = i;
break;
}
}
}
if(ind == -1)
ind = list_.InsertItem(list_.GetItemCount(), val.c_str());
if (type_ == TYPE_RANGE)
list_.SetItemText(ind, 1, (range + L":").c_str());
list_.SetItemState(ind, LVIS_FOCUSED | LVIS_SELECTED, LVIS_FOCUSED | LVIS_SELECTED);
list_.SetSelectionMark(ind);
list_.EnsureVisible(ind, FALSE);
}
void CDlgRange::OnNMDblclkList1(NMHDR* pNMHDR, LRESULT* pResult)
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
*pResult = 0;
// move to context menu, nothing to do here
return;
POINT pos = { 0 };
int item = -1;
GetCursorPos(&pos);
list_.ScreenToClient(&pos);
item = list_.HitTest(pos);
if (item != -1)
{
wchar_t buf[256] = { 0 };
int ret = 0;
list_.GetItemText(item, 0, buf, _countof(buf) - 1);
ret = ::MessageBoxW(m_hWnd, L"默认值、删除或者条件设置:\r\nYes: 是\r\nNo: 删除该项\r\nCancel: 设置条件", buf, MB_YESNOCANCEL);
if (ret == IDYES)
{
//init_ = buf;
//for (int i = 0; i < list_.GetItemCount(); ++i)
//{
// list_.SetItemText(i, 2, i == item ? L"yes" : L"");
//}
list_.SetItemText(item, 2, L"yes");
CONDVAL cv;
cv.val = buf;
list_.GetItemText(item, 1, buf, _countof(buf) - 1);
cv.cond = buf;
init_.push_back(cv);
}
else if (ret == IDNO)
{
list_.DeleteItem(item);
}
else
{
CDlgCondition dlg(name_.c_str());
wchar_t buf[512] = { 0 }, * init = buf;
list_.GetItemText(item, 1, buf, _countof(buf) - 1);
if (type_ == TYPE_RANGE && wcsstr(buf, L":"))
{
init = wcsstr(buf, L":") + 1;
}
dlg.init_data(item_all_, item_val_, init);
if (dlg.DoModal() == IDOK)
{
if (type_ == TYPE_RANGE && wcsstr(buf, L":"))
{
wcsstr(buf, L":")[1] = 0;
}
else
buf[0] = 0;
list_.SetItemText(item, 1, (buf + dlg.get_condition()).c_str());
}
}
}
}
void CDlgRange::OnCbnSelchangeComboField()
{
// TODO: 在此添加控件通知处理程序代码
std::wstring field(get_item_text(IDC_COMBO_FIELD));
init_val_api_(field.c_str(), &val_);
}
void CDlgRange::OnRangevaluemenuDefault()
{
// TODO: 在此添加命令处理程序代码
wchar_t buf[512] = { 0 };
bool def = false;
//list_.GetItemText(list_cur_sel_, 2, buf, _countof(buf) - 1);
//if (buf[0] == 0)
// wcscpy(buf, L"yes");
//else
// buf[0] = 0;
//list_.SetItemText(list_cur_sel_, 2, buf);
//def = wcscmp(buf, L"yes") == 0;
list_.GetItemText(list_cur_sel_, 1, buf, _countof(buf) - 1);
std::wstring cond(buf);
size_t pos = cond.find(L"default:");
if (pos == 0)
cond.erase(0, lstrlenW(L"default:"));
else
cond.insert(0, L"default:");
list_.SetItemText(list_cur_sel_, 1, cond.c_str());
list_cur_sel_ = -1;
}
void CDlgRange::OnRangevaluemenuDelete()
{
// TODO: 在此添加命令处理程序代码
list_.DeleteItem(list_cur_sel_);
list_cur_sel_ = -1;
}
void CDlgRange::OnRangevaluemenuSetcondition()
{
// TODO: 在此添加命令处理程序代码
CDlgCondition dlg(name_.c_str());
wchar_t buf[512] = { 0 }, * init = buf;
list_.GetItemText(list_cur_sel_, 1, buf, _countof(buf) - 1);
if (type_ == TYPE_RANGE && wcsstr(buf, L":"))
{
init = wcsstr(buf, L":") + 1;
}
dlg.init_data(item_all_, item_val_, init);
if (dlg.DoModal() == IDOK)
{
if (type_ == TYPE_RANGE && wcsstr(buf, L":"))
{
wcsstr(buf, L":")[1] = 0;
}
else
buf[0] = 0;
list_.SetItemText(list_cur_sel_, 1, (buf + dlg.get_condition()).c_str());
}
list_cur_sel_ = -1;
}
int get_list_sel(CListCtrl* lc)
{
POSITION pos = lc->GetFirstSelectedItemPosition();
int sel = lc->GetNextSelectedItem(pos);
return sel;
}
void CDlgRange::OnNMRClickList1(NMHDR* pNMHDR, LRESULT* pResult)
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
*pResult = 0;
POINT pt = { 0 };
list_cur_sel_ = get_list_sel(&list_);
//func_menu_.CheckMenuItem(ID_LISTMENU_TOOLTIPS, show_list_tooltips_ ? MF_CHECKED : MF_UNCHECKED);
if (list_cur_sel_ >= 0 && list_cur_sel_ < list_.GetItemCount())
{
wchar_t buf[80] = { 0 };
list_.GetItemText(list_cur_sel_, 1, buf, _countof(buf) - 1);
if (wcsstr(buf, L"min:") == buf || wcsstr(buf, L"max:") == buf || wcsstr(buf, L"step:") == buf)
func_menu_.EnableMenuItem(ID_RANGEVALUEMENU_DEFAULT, MF_DISABLED);
else
{
func_menu_.EnableMenuItem(ID_RANGEVALUEMENU_DEFAULT, MF_ENABLED);
}
list_.GetItemText(list_cur_sel_, 1, buf, _countof(buf) - 1);
func_menu_.CheckMenuItem(ID_RANGEVALUEMENU_DEFAULT, wcsstr(buf, L"default:") == buf ? MF_CHECKED : MF_UNCHECKED);
GetCursorPos(&pt);
func_menu_.GetSubMenu(0)->TrackPopupMenu(0, pt.x, pt.y, this);
}
}
void CDlgRange::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
vals_.clear();
init_.clear();
if (type_ == TYPE_LIST || type_ == TYPE_RANGE)
{
bool range = type_ == TYPE_RANGE, bl = false, bu = false, bs = false;
if(list_.GetItemCount() == 0)
{
MessageBox(TEXT("没有输入有效的值列表"), TEXT("No Value"), MB_OK);
return;
}
for (int i = 0; i < list_.GetItemCount(); ++i)
{
wchar_t buf[256] = { 0 };
CONDVAL val;
list_.GetItemText(i, 0, buf, _countof(buf) - 1);
val.val = buf;
list_.GetItemText(i, 1, buf, _countof(buf) - 1);
val.cond = buf;
if (val.cond.find(L"default:") == 0)
{
val.cond.erase(0, lstrlenW(L"default:"));
init_.push_back(val);
}
if (range)
{
if (val.cond.find(L"min:") == 0)
{
vals_.push_back(val);
bl = true;
}
else if (val.cond.find(L"max:") == 0)
{
vals_.push_back(val);
bu = true;
}
else if (val.cond.find(L"step:") == 0)
{
vals_.push_back(val);
bs = true;
}
}
else if(type_ == TYPE_LIST)
vals_.push_back(val);
}
if (range)
{
std::wstring no(L"");
if (!bl)
{
no = L"lower value";
}
else if (!bu)
{
no = L"upper value";
}
else if (!bs)
{
no = L"step value";
}
if (!no.empty())
{
MessageBox(TEXT("没有输入有效的值列表"), no.c_str(), MB_OK);
return;
}
}
if (init_.empty())
{
MessageBox(TEXT("请确定默认值!右键列表中的某项进行选择。 "), TEXT("No Default"), MB_OK);
return;
}
}
else if(type_ == TYPE_RANGE)
{
//std::wstring val(get_item_text(IDC_EDIT_FROM));
//
//if (val.empty())
//{
// MessageBox(TEXT("没有输入有效初始值"), TEXT("No Value"), MB_OK);
// GotoDlgCtrl(GetDlgItem(IDC_EDIT_FROM));
// return;
//}
//vals_.push_back(val);
//
//val = get_item_text(IDC_EDIT_TO);
//if (val.empty())
//{
// MessageBox(TEXT("没有输入有效终止值"), TEXT("No Value"), MB_OK);
// GotoDlgCtrl(GetDlgItem(IDC_EDIT_TO));
// return;
//}
//vals_.push_back(val);
//
//val = get_item_text(IDC_EDIT_STEP);
//if (val.empty())
//{
// MessageBox(TEXT("没有输入有效步长值"), TEXT("No Value"), MB_OK);
// GotoDlgCtrl(GetDlgItem(IDC_EDIT_TO));
// return;
//}
//vals_.push_back(val);
//
//init_ = get_item_text(IDC_EDIT_INIT2);
//if (init_.empty())
//{
// MessageBox(TEXT("没有输入有效默认值"), TEXT("No Value"), MB_OK);
// GotoDlgCtrl(GetDlgItem(IDC_EDIT_INIT2));
// return;
//}
}
else if (type_ == TYPE_FIELDS)
{
std::wstring field(get_item_text(IDC_COMBO_FIELD));
vals_.clear();
vals_.push_back(field);
CONDVAL cv;
cv.val = get_item_text(IDC_COMBO_VAL);
if (cv.val.empty())
{
MessageBox(TEXT("没有输入有效值"), TEXT("No Value"), MB_OK);
GotoDlgCtrl(GetDlgItem(IDC_COMBO_VAL));
return;
}
init_.push_back(cv);
}
CDialogEx::OnOK();
}