code_twain/sane/DlgCfgMgr.cpp

217 lines
5.7 KiB
C++

// DlgIndicator.cpp: 实现文件
//
#include "DlgCfgMgr.h"
#include "resource.h"
#include "scanned_img.h" // for local_trans
#include "mem_dc.h"
#include "gb_json.h"
// CDlgIndicator 对话框
dlg_cfg_mgr::dlg_cfg_mgr(gb::scanner_cfg* cfg, HWND parent) : cfg_(cfg), dlg_base(parent, IDD_CFG_MGR), schm_changed_(false)
{
create();
std::wstring title(local_trans::lang_trans_between_hz936(CONST_STRING_CFG_MANAGER));
int dif = 0;
SetWindowTextW(hwnd(), title.c_str());
title = local_trans::lang_trans_between_hz936(CONST_STRING_CFG_SCHEME);
set_item_text(IDC_STATIC_PAPER, title.c_str());
set_item_fit_to_text(IDC_STATIC_PAPER);
title = local_trans::lang_trans_between_hz936(CONST_STRING_DEL_SELECTED);
set_item_text(IDC_BUTTON_DEL_SEL, title.c_str());
dif = set_item_fit_to_text(IDC_BUTTON_DEL_SEL);
if (dif)
offset_item(IDC_BUTTON_DEL_SEL, -dif, 0);
title = local_trans::lang_trans_between_hz936(CONST_STRING_DEL_ALL);
set_item_text(IDC_BUTTON_DEL_ALL, title.c_str());
set_item_fit_to_text(IDC_BUTTON_DEL_ALL);
title = local_trans::lang_trans_between_hz936(CONST_STRING_CFG_CONTENT);
set_item_text(IDC_STATIC_SKETCH, title.c_str());
title = local_trans::lang_trans_between_hz936(CONST_STRING_OK);
set_item_text(IDOK, title.c_str());
}
dlg_cfg_mgr::~dlg_cfg_mgr()
{
}
BOOL dlg_cfg_mgr::handle_message(UINT msg, WPARAM wp, LPARAM lp)
{
wchar_t text[40] = { 0 };
BOOL ret = TRUE;
switch (msg)
{
case WM_INITDIALOG:
on_init_dlg();
UpdateWindow(hwnd());
break;
case WM_COMMAND:
handle_command(HIWORD(wp), LOWORD(wp), (HWND)lp);
break;
case WM_NOTIFY:
handle_notify(wp, (LPNMHDR)lp);
break;
case WM_PAINT:
{
PAINTSTRUCT ps = { 0 };
HDC hdc = BeginPaint(hwnd(), &ps);
{
compatible_dc dc(hdc);
on_paint(dc.get_dc());
}
EndPaint(hwnd(), &ps);
}
break;
default:
ret = FALSE;
}
return ret;
}
void dlg_cfg_mgr::handle_command(WORD code, WORD id, HANDLE ctrl)
{
wchar_t cls[128] = { 0 };
GetClassNameW((HWND)ctrl, cls, _countof(cls) - 1);
if (IS_BUTTON(cls))
{
if (code == BN_CLICKED)
{
if (id == IDOK || id == IDCANCEL)
quit_modal(id);
else if (id == IDC_BUTTON_DEL_SEL)
on_del_selected();
else if (id == IDC_BUTTON_DEL_ALL)
on_del_all();
}
}
else if (IS_EDIT(cls))
{
//if (code == EN_SETFOCUS)
// label_edit_ = (HWND)ctrl;
}
}
void dlg_cfg_mgr::handle_notify(UINT id, LPNMHDR pnhdr)
{
if (id == IDC_LIST1)
{
if (pnhdr->code == LVN_BEGINLABELEDITW)
{
LPNMLVDISPINFOW pdisp = (LPNMLVDISPINFOW)pnhdr;
label_ = pdisp->item.pszText ? pdisp->item.pszText : L"";
}
else if (pnhdr->code == LVN_ENDLABELEDITW)
{
LPNMLVDISPINFOW pdisp = (LPNMLVDISPINFOW)pnhdr;
if (pdisp->item.pszText && label_ != pdisp->item.pszText)
{
ListView_SetItemText(get_item(IDC_LIST1), pdisp->item.iItem, pdisp->item.iSubItem, pdisp->item.pszText);
if (cfg_)
{
if (!cfg_->rename_scheme(local_trans::u2a(label_.c_str(), CP_UTF8).c_str(), local_trans::u2a(pdisp->item.pszText, CP_UTF8).c_str()))
{
std::wstring input(pdisp->item.pszText);
input += L" " + local_trans::lang_trans_between_hz936(CONST_STRING_ALREADY_EXISTS);
::MessageBoxW(hwnd(), input.c_str(), local_trans::lang_trans_between_hz936(CONST_STRING_RE_INPUT).c_str(), MB_OK | MB_ICONINFORMATION);
dlg_base::list_set_item_text(get_item(IDC_LIST1), pdisp->item.iItem, 0, label_.c_str());
}
}
}
}
else if (pnhdr->code == LVN_ITEMCHANGED)
{
LPNMLISTVIEW pv = (LPNMLISTVIEW)pnhdr;
if ((pv->uNewState & LVIS_SELECTED) && (pv->uOldState & LVIS_SELECTED) == 0)
on_sel_changed(pv->iItem);
}
}
}
void dlg_cfg_mgr::layout(void)
{
}
void dlg_cfg_mgr::on_init_dlg(void)
{
HWND lstwnd = get_item(IDC_LIST1);
std::vector<std::string> schemes;
cfg_->get_all_schemes(schemes);
dlg_base::list_insert_column(lstwnd, local_trans::lang_trans_between_hz936(CONST_STRING_CFG_NAME).c_str(), 270);
for (size_t i = 1; i < schemes.size(); ++i) // 0 is default scheme
{
dlg_base::list_insert_item(lstwnd, local_trans::a2u(schemes[i].c_str(), CP_UTF8).c_str());
}
}
void dlg_cfg_mgr::on_paint(HDC hdc)
{
}
void dlg_cfg_mgr::on_sel_changed(int sel)
{
std::wstring name(dlg_base::list_get_text(get_item(IDC_LIST1), sel));
gb::sane_config_schm* schm = cfg_->get_scheme(local_trans::u2a(name.c_str(), CP_UTF8).c_str());
name = L"";
if (schm)
{
std::string key(""), val("");
int cnt = 1;
if (schm->first_config(key, val))
{
do
{
std::string v(gb::sane_config_schm::sane_option_value_2_string(&val[0], val.length(), (SANE_Value_Type)cfg_->option_value_type(key.c_str())));
name += std::to_wstring(cnt++) + L" - " + local_trans::a2u(cfg_->option_title(key.c_str()).c_str(), CP_UTF8) + L"\r\n ";
if (cfg_->option_value_type(key.c_str()) == SANE_TYPE_STRING)
v = local_trans::u2a(local_trans::lang_trans_between_hz936(local_trans::a2u(v.c_str(), CP_UTF8).c_str()).c_str(), CP_UTF8);
name += local_trans::a2u(v.c_str(), CP_UTF8) + L"\r\n\r\n";
} while (schm->next_config(key, val));
}
schm->release();
}
dlg_base::set_item_text(IDC_EDIT1, name.c_str());
}
void dlg_cfg_mgr::on_del_selected(void)
{
std::vector<int> sels;
HWND lwnd = get_item(IDC_LIST1);
bool changed = false;
dlg_base::list_get_selected_items(lwnd, sels);
for(int i = sels.size() - 1; i >= 0; i--)
{
std::string name(local_trans::u2a(dlg_base::list_get_text(lwnd, sels[i]).c_str(), CP_UTF8));
if (cfg_->remove_scheme(name.c_str()))
{
changed = true;
ListView_DeleteItem(lwnd, sels[i]);
schm_changed_ = true;
}
}
}
void dlg_cfg_mgr::on_del_all(void)
{
cfg_->remove_all_schemes();
ListView_DeleteAllItems(get_item(IDC_LIST1)); // clear list
schm_changed_ = true;
dlg_base::set_item_text(IDC_EDIT1, L"");
}
bool dlg_cfg_mgr::is_scheme_changed(void)
{
return schm_changed_;
}