code_twain/sane/DlgSaveScheme.cpp

247 lines
5.7 KiB
C++
Raw Normal View History

// DlgSaveScheme.cpp: 实现文件
//
#include "DlgSaveScheme.h"
#include "resource.h"
#include "scanned_img.h" // for local_trans
#include "gb_json.h"
#include "mem_dc.h"
#include "../../sdk/include/lang/app_language.h"
#define WIDTH_MARGINS 10
dlg_save_scheme::dlg_save_scheme(HWND parent) : dlg_base(parent, IDD_SAVE_SCHEME)
{
create();
std::wstring title(local_trans::lang_trans_between_hz936(CONST_STRING_SAVE_TITLE));
int dif = 0;
SetWindowTextW(hwnd(), title.c_str());
title = local_trans::lang_trans_between_hz936(CONST_STRING_SAVE_DISCARD);
set_item_text(IDC_RADIO_DISCARD, title.c_str());
set_item_fit_to_text(IDC_RADIO_DISCARD);
title = local_trans::lang_trans_between_hz936(CONST_STRING_SAVE_OVERWRITE);
set_item_text(IDC_RADIO_OVERWRITE, title.c_str());
dif = set_item_fit_to_text(IDC_RADIO_OVERWRITE);
title = local_trans::lang_trans_between_hz936(CONST_STRING_SAVE_NEW);
set_item_text(IDC_RADIO_NEW, title.c_str());
dif = set_item_fit_to_text(IDC_RADIO_NEW);
offset_item(IDC_NAME, dif, 0);
// expand_item(IDC_NAME, dif, 0);
{
RECT r = { 0 }, rc = { 0 };
GetWindowRect(hwnd(), &r);
GetWindowRect(get_item(IDC_NAME), &rc);
if (rc.right + WIDTH_MARGINS > r.right)
{
r.right = rc.right + WIDTH_MARGINS;
MoveWindow(hwnd(), r.left, r.top, RECT_W(r), RECT_H(r), FALSE);
}
}
title = local_trans::lang_trans_between_hz936(CONST_STRING_OK);
set_item_text(IDOK, title.c_str());
}
dlg_save_scheme::~dlg_save_scheme()
{
}
BOOL dlg_save_scheme::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_save_scheme::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)
{
EnableWindow(get_item(IDC_NAME), FALSE);
if (id == IDOK)
{
if (method_ == SAVE_NEW)
{
std::wstring text(get_wnd_text(get_item(IDC_NAME)));
if (text.empty() || std::find(existing_.begin(), existing_.end(), text) != existing_.end())
{
std::wstring info(L""), title(local_trans::lang_trans_between_hz936(CONST_STRING_ERROR));
if (text.empty())
{
info = local_trans::lang_trans_between_hz936(CONST_STRING_REINPUT_SCHEME_NAME);
}
else
{
info = local_trans::lang_trans_between_hz936(CONST_STRING_LEFT_QUOTE) + text
+ local_trans::lang_trans_between_hz936(CONST_STRING_RIGHT_QUOTE)
+ local_trans::lang_trans_between_hz936(CONST_STRING_REINPUT_WHEN_EXISTING);
}
EnableWindow(get_item(IDC_NAME), TRUE);
MessageBoxW(hwnd(), info.c_str(), title.c_str(), MB_OK);
goto_name();
return;
}
name_ = std::move(text);
}
if (method_ == SAVE_DISCARD)
log_info((L"Discard changes on scheme '" + name_ + L"'.\r\n").c_str(), 0);
else
log_info((L"Save changes to scheme '" + name_ + L"'.\r\n").c_str(), 0);
quit_modal(id);
}
else if (id == IDC_RADIO_DISCARD)
method_ = SAVE_DISCARD;
else if (id == IDC_RADIO_OVERWRITE)
method_ = SAVE_OVERWRITE;
else if (id == IDC_RADIO_NEW)
{
method_ = SAVE_NEW;
EnableWindow(get_item(IDC_NAME), TRUE);
goto_name();
}
}
}
}
void dlg_save_scheme::handle_notify(UINT id, LPNMHDR pnhdr)
{
}
void dlg_save_scheme::layout(void)
{
}
void dlg_save_scheme::on_init_dlg(void)
{
check_radio(IDC_RADIO_DISCARD);
}
void dlg_save_scheme::on_paint(HDC hdc)
{
}
void dlg_save_scheme::goto_name(void)
{
SendMessageW(get_item(IDC_NAME), EM_SETSEL, 0, -1);
SetFocus(get_item(IDC_NAME));
}
void dlg_save_scheme::check_radio(UINT id, bool check)
{
SendMessage(get_item(id), BM_SETCHECK, check ? (WPARAM)BST_CHECKED : (WPARAM)BST_UNCHECKED, 0);
}
void dlg_save_scheme::set_info(const wchar_t* name, std::vector<std::wstring>& existing, int mask)
{
bool set_method = false;
name_ = name;
existing_ = existing;
set_item_text(IDC_NAME, name);
{
std::wstring schem(local_trans::lang_trans_between_hz936(CONST_STRING_SAVE_OVERWRITE));
schem += L" - '";
schem += name;
schem += L"'";
set_item_text(IDC_RADIO_OVERWRITE, schem.c_str());
set_item_fit_to_text(IDC_RADIO_OVERWRITE);
RECT r = { 0 }, rc = { 0 };
GetWindowRect(get_item(IDC_RADIO_OVERWRITE), &rc);
GetWindowRect(hwnd(), &r);
if (RECT_W(r) < RECT_W(rc) + WIDTH_MARGINS)
{
r.right = r.left + RECT_W(rc) + WIDTH_MARGINS;
MoveWindow(hwnd(), r.left, r.top, RECT_W(r), RECT_H(r), FALSE);
}
}
if (mask & SAVE_METHOD_MASK(SAVE_DISCARD))
{
set_method = true;
method_ = SAVE_DISCARD;
EnableWindow(get_item(IDC_RADIO_DISCARD), TRUE);
check_radio(IDC_RADIO_DISCARD);
}
else
EnableWindow(get_item(IDC_RADIO_DISCARD), FALSE);
if (mask & SAVE_METHOD_MASK(SAVE_OVERWRITE))
{
if (!set_method)
{
set_method = true;
method_ = SAVE_OVERWRITE;
check_radio(IDC_RADIO_OVERWRITE);
}
EnableWindow(get_item(IDC_RADIO_OVERWRITE), TRUE);
}
else
EnableWindow(get_item(IDC_RADIO_OVERWRITE), FALSE);
if (mask & SAVE_METHOD_MASK(SAVE_NEW))
{
if (!set_method)
{
set_method = true;
method_ = SAVE_NEW;
check_radio(IDC_RADIO_NEW);
EnableWindow(get_item(IDC_NAME), TRUE);
}
EnableWindow(get_item(IDC_RADIO_NEW), TRUE);
}
else
EnableWindow(get_item(IDC_RADIO_NEW), FALSE);
}
save_method dlg_save_scheme::get_dispose(void)
{
return method_;
}
std::wstring dlg_save_scheme::get_name(void)
{
return name_;
}