247 lines
5.7 KiB
C++
247 lines
5.7 KiB
C++
|
// 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_;
|
|||
|
}
|