doc_and_tools/tools/apps/hgjson/DlgOptJson.cpp

3875 lines
165 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// DlgInput.cpp : implementation file
//
#include "stdafx.h"
#include "hgjson.h"
#include "DlgOptJson.h"
#include "afxdialogex.h"
#include "DlgRange.h"
#include "DlgCondition.h"
#include "opt_ui/DlgPage.h" // for local_trans
#include <algorithm>
#include "../../../../sdk/include/lang/app_language.h"
static std::string device_opt_json[] = {
"{\"restore\":{\"cat\":\"base\",\"group\":\"\",\"title\":\"\\u6062\\u590d\\u9ed8\\u8ba4\\u8bbe\\u7f6e\",\"desc\":\"\\u6062\\u590d\\u9ed8\\u8ba4\\u8bbe\\u7f6e\",\"ver\":0,\"pos\":0,\"fix-id\":0,\"type\":\"button\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4},\"help\":{\"cat\":\"base\",\"group\":\"\",\"title\":\"\\u5e2e\\u52a9\",\"desc\":\"\\u663e\\u793a\\u8f6f\\u4ef6\\u5e2e\\u52a9\\u6587\\u6863\",\"ver\":0,\"pos\":0,\"fix-id\":34897,\"type\":\"button\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4},\"is-multiout\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u591a\\u6d41\\u8f93\\u51fa\",\"desc\":\"\\u540c\\u65f6\\u8f93\\u51fa\\u591a\\u79cd\\u989c\\u8272\\u6a21\\u5f0f\\u7684\\u56fe\\u50cf\",\"ver\":0,\"pos\":0,\"fix-id\":34817,\"type\":\"bool\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":false,\"default\":false},\"multiout-type\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u591a\\u6d41\\u8f93\\u51fa\\u7c7b\\u578b\",\"desc\":\"\\u9009\\u62e9\\u591a\\u6d41\\u8f93\\u51fa\\u7684\\u7c7b\\u578b\",\"ver\":0,\"pos\":0,\"fix-id\":34818,\"type\":\"string\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":66,\"cur\":\"\\u5f69\\u8272+\\u7070\\u5ea6+\\u9ed1\\u767d\",\"default\":\"\\u5f69\\u8272+\\u7070\\u5ea6+\\u9ed1\\u767d\",\"range\":[\"\\u5f69\\u8272+\\u7070\\u5ea6+\\u9ed1\\u767d\",\"\\u5f69\\u8272+\\u7070\\u5ea6\",\"\\u5f69\\u8272+\\u9ed1\\u767d\",\"\\u7070\\u5ea6+\\u9ed1\\u767d\"],\"depend\":\"is-multiout==true\"},\"mode\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u989c\\u8272\\u6a21\\u5f0f\",\"desc\":\"\\u9009\\u62e9\\u8272\\u5f69\\u6a21\\u5f0f\",\"ver\":0,\"pos\":0,\"fix-id\":34819,\"type\":\"string\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":54,\"cur\":\"24\\u4f4d\\u5f69\\u8272\",\"default\":\"24\\u4f4d\\u5f69\\u8272\",\"range\":[\"24\\u4f4d\\u5f69\\u8272\",\"256\\u7ea7\\u7070\\u5ea6\",\"\\u9ed1\\u767d\",\"\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"],\"depend\":\"is-multiout!=true\"},\"binary-threshold\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u9ed1\\u767d\\u56fe\\u50cf\\u9608\\u503c\",\"desc\":\"\\u9ad8\\u4e8e\\u8be5\\u9608\\u503c\\u4e3a1\\uff08\\u767d\\uff09\\uff0c\\u4f4e\\u4e8e\\u8be5\\u9608\\u503c\\u4e3a0\\uff08\\u9ed1\\uff09\",\"ver\":0,\"pos\":0,\"fix-id\":34870,\"type\":\"int\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":127,\"default\":127,\"range\":{\"min\":0,\"max\":255,\"step\":1},\"depend\":\"multiout-type!=\\u5f69\\u8272+\\u7070\\u5ea6||mode==\\u9ed1\\u767d\"},\"reverse-bw\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u9ed1\\u767d\\u56fe\\u50cf\\u53cd\\u8272\\u8f93\\u51fa\",\"desc\":\"\\u8f93\\u51fa\\u7684\\u9ed1\\u767d\\u56fe\\u50cf\\u4ee5\\u201c1\\u201d\\u4ee3\\u8868\\u9ed1\\u8272\\uff0c\\u201c0\\u201d\\u4ee3\\u8868\\u767d\\u8272\",\"ver\":0,\"pos\":0,\"fix-id\":34878,\"type\":\"bool\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":false,\"default\":false,\"depend\":\"multiout-type!=\\u5f69\\u8272+\\u7070\\u5ea6||mode==\\u9ed1\\u767d\"},\"filter\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u7070\\u5ea6\\u6216\\u9ed1\\u767d\\u56fe\\u50cf - \\u9664\\u8272\\u4e0e\\u589e\\u5f3a\",\"desc\":\"\\u6d88\\u9664\\u6216\\u589e\\u5f3a\\u6307\\u5b9a\\u8272\\u5f69\",\"ver\":0,\"pos\":0,\"fix-id\":34820,\"type\":\"string\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":42,\"cur\":\"\\u4e0d\\u9664\\u8272\",\"default\":\"\\u4e0d\\u9664\\u8272\",\"range\":[\"\\u4e0d\\u9664\\u8272\",\"\\u9664\\u7ea2\\u8272\",\"\\u9664\\u7eff\\u8272\",\"\\u9664\\u84dd\\u8272\",\"\\u7ea2\\u8272\\u589e\\u5f3a\",\"\\u7eff\\u8272\\u589e\\u5f3a\",\"\\u84dd\\u8272\\u589e\\u5f3a\"],\"depend\":\"is-multiout!=true&&mode!=24\\u4f4d\\u5f69\\u8272&&mode!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"},\"is-rid-multiout-red\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"24\\u4f4d\\u5f69\\u8272\\u56fe\\u50cf - \\u591a\\u6d41\\u8f93\\u51fa\\u9664\\u7ea2\",\"desc\":\"\\u540c\\u65f6\\u8f93\\u51fa\\u5f69\\u8272\\u56fe\\u50cf\\u548c\\u7070\\u5ea6\\u9664\\u7ea2\\u56fe\\u50cf\",\"ver\":0,\"pos\":0,\"fix-id\":34821,\"type\":\"bool\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":false,\"default\":false,\"depend\":\"is-multiout!=true&&mode!=256\\u7ea7\\u7070\\u5ea6&&mode!=\\u9ed1\\u767d&&mode!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"},\"is-rid-answer-sheet-red\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"24\\u4f4d\\u5f69\\u8272\\u56fe\\u50cf - \\u7b54\\u9898\\u5361\\u9664\\u7ea2\",\"desc\":\"\\u8f93\\u51fa\\u9664\\u7ea2\\u5f69\\u8272\\u56fe\\u50cf\",\"ver\":0,\"pos\":0,\"fix-id\":34822,\"type\":\"bool\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":false,\"default\":false,\"depend\":\"is-multiout!=true&&mode!=256\\u7ea7\\u7070\\u5ea6&&mode!=\\u9ed1\\u767d&&mode!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"},\"is-erase-bkg\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u80cc\\u666f\\u79fb\\u9664\",\"desc\":\"\\u79fb\\u9664\\u6587\\u7a3f\\u80cc\\u666f\\u5e95\\u8272\",\"ver\":0,\"pos\":0,\"fix-id\":34823,\"type\":\"bool\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":false,\"default\":false,\"depend\":\"is-multiout!=true&&mode!=256\\u7ea7\\u7070\\u5ea6&&mode!=\\u9ed1\\u767d&&mode!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"},\"bkg-color-range\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\" \\u80cc\\u666f\\u8272\\u5f69\\u6d6e\\u52a8\\u8303\\u56f4\",\"desc\":\"\\u4e0e\\u80cc\\u666f\\u5e95\\u8272\\u504f\\u5dee\\u5728\\u8be5\\u503c\\u8303\\u56f4\\u5185\\u7684\\u989c\\u8272\\uff0c\\u90fd\\u5c06\\u88ab\\u79fb\\u9664\",\"ver\":0,\"pos\":0,\"fix-id\":34824,\"type\":\"int\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":20,\"default\":20,\"range\":{\"min\":1,\"max\":128,\"step\":1},\"depend\":\"is-erase-bkg==true\"},\"sharpen\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u9510\\u5316\\u4e0e\\u6a21\\u7cca\",\"desc\":\"\\u9009\\u62e9\\u9510\\u5316\\u6548\\u679c\\u6216\\u6a21\\u7cca\\u6548\\u679c\",\"ver\":0,\"pos\":0,\"fix-id\":34825,\"type\":\"string\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":48,\"cur\":\"\\u65e0\",\"default\":\"\\u65e0\",\"range\":[\"\\u65e0\",\"\\u9510\\u5316\",\"\\u8fdb\\u4e00\\u6b65\\u9510\\u5316\",\"\\u6a21\\u7cca\",\"\\u8fdb\\u4e00\\u6b65\\u6a21\\u7cca\"],\"depend\":\"is-multiout!=true&&mode!=\\u9ed1\\u767d&&mode!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"},\"is-rid-morr\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u53bb\\u9664\\u6469\\u5c14\\u7eb9\",\"desc\":\"\\u53bb\\u9664\\u56fe\\u50cf\\u4e2d\\u7684\\u6469\\u5c14\\u7eb9\",\"ver\":0,\"pos\":0,\"fix-id\":34826,\"type\":\"bool\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":false,\"default\":false,\"depend\":\"resolution<500&&is-multiout!=true&&paper!=\\u4e09\\u8054\\u8bd5\\u5377&&paper!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8&&paper!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207&&mode!=\\u9ed1\\u767d&&mode!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"},\"is-rid-grid\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u9664\\u7f51\\u7eb9\",\"desc\":\"\\u53bb\\u9664\\u56fe\\u50cf\\u4e2d\\u7684\\u7f51\\u7eb9\",\"ver\":0,\"pos\":0,\"fix-id\":34827,\"type\":\"bool\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":false,\"default\":false,\"depend\":\"resolution<500&&is-multiout!=true&&paper!=\\u4e09\\u8054\\u8bd5\\u5377&&paper!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8&&paper!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207&&mode!=\\u9ed1\\u767d&&mode!=\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"},\"is-err-extension\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u9519\\u8bef\\u6269\\u6563\",\"desc\":\"\\u4ee5\\u70b9\\u9635\\u5f62\\u5f0f\\u6784\\u5efa\\u56fe\\u50cf\",\"ver\":0,\"pos\":0,\"fix-id\":34828,\"type\":\"bool\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":false,\"default\":false,\"depend\":\"mode==\\u9ed1\\u767d\"},\"is-noise-optimize\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u9ed1\\u767d\\u56fe\\u50cf\\u566a\\u70b9\\u4f18\\u5316\",\"desc\":\"\\u53bb\\u9664\\u56fe\\u50cf\\u4e2d\\u7684\\u5b64\\u7acb\\u9ed1\\u70b9\",\"ver\":0,\"pos\":0,\"fix-id\":34829,\"type\":\"bool\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":false,\"default\":false,\"depend\":\"mode==\\u9ed1\\u767d\"},\"noise-size\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\" \\u566a\\u70b9\\u4f18\\u5316\\u5c3a\\u5bf8\",\"desc\":\"\\u8bbe\\u7f6e\\u9700\\u8981\\u53bb\\u9664\\u7684\\u9ed1\\u8272\\u5b64\\u7acb\\u70b9\\u7684\\u8fde\\u901a\\u4e2a\\u6570\",\"ver\":0,\"pos\":0,\"fix-id\":34830,\"type\":\"int\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":10,\"default\":10,\"range\":{\"min\":1,\"max\":50,\"step\":1},\"depend\":\"is-noise-optimize==true\"},\"paper\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u7eb8\\u5f20\\u5c3a\\u5bf8\",\"desc\":\"\\u8bbe\\u7f6e\\u51fa\\u56fe\\u5927\\u5c0f\",\"ver\":0,\"pos\":0,\"fix-id\":34831,\"type\":\"string\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":96,\"cur\":\"\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"default\":\"\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"range\":[\"A3\",\"8\\u5f00\",\"A4\",\"A4\\u6a2a\\u5411\",\"16\\u5f00\",\"16\\u5f00\\u6a2a\\u5411\",\"A5\",\"A5\\u6a2a\\u5411\",\"A6\",\"A6\\u6a2a\\u5411\",\"B4\",\"B5\",\"B5\\u6a2a\\u5411\",\"B6\",\"B6\\u6a2a\\u5411\",\"Letter\",\"Letter\\u6a2a\\u5411\",\"Double Letter\",\"LEGAL\",\"\\u5339\\u914d\\u539f",
"\\u59cb\\u5c3a\\u5bf8\",\"\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\",\"\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\",\"\\u4e09\\u8054\\u8bd5\\u5377\"]},\"is-custom-area\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\",\"ver\":0,\"pos\":0,\"fix-id\":34832,\"type\":\"bool\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":false,\"default\":false,\"depend\":\"paper!=\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8&&paper!=\\u4e09\\u8054\\u8bd5\\u5377&&paper!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8&&paper!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\"},\"tl-x\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u626b\\u63cf\\u533a\\u57df\\u5de6\\u4fa7\\uff08mm\\uff09\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\\u5de6\\u4e0a\\u89d2x\\u5750\\u6807\",\"ver\":0,\"pos\":0,\"fix-id\":34833,\"type\":\"float\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":8,\"cur\":0.000000,\"default\":0.000000,\"range\":{\"min\":0.000000,\"max\":210.000000,\"step\":21.000000},\"depend\":\"is-custom-area==true\"},\"br-x\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u626b\\u63cf\\u533a\\u57df\\u53f3\\u4fa7\\uff08mm\\uff09\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\\u53f3\\u4e0b\\u89d2x\\u5750\\u6807\",\"ver\":0,\"pos\":0,\"fix-id\":34834,\"type\":\"float\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":8,\"cur\":210.000000,\"default\":210.000000,\"range\":{\"min\":0.000000,\"max\":210.000000,\"step\":21.000000},\"depend\":\"is-custom-area==true\"},\"tl-y\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u626b\\u63cf\\u533a\\u57df\\u4e0a\\u4fa7\\uff08mm\\uff09\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\\u5de6\\u4e0a\\u89d2y\\u5750\\u6807\",\"ver\":0,\"pos\":0,\"fix-id\":34835,\"type\":\"float\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":8,\"cur\":0.000000,\"default\":0.000000,\"range\":{\"min\":0.000000,\"max\":297.000000,\"step\":29.700000},\"depend\":\"is-custom-area==true\"},\"br-y\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u626b\\u63cf\\u533a\\u57df\\u4e0b\\u4fa7\\uff08mm\\uff09\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\\u53f3\\u4e0b\\u89d2y\\u5750\\u6807\",\"ver\":0,\"pos\":0,\"fix-id\":34836,\"type\":\"float\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":8,\"cur\":297.000000,\"default\":297.000000,\"range\":{\"min\":0.000000,\"max\":297.000000,\"step\":29.700000},\"depend\":\"is-custom-area==true\"},\"is-size-check\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u5c3a\\u5bf8\\u68c0\\u6d4b\",\"desc\":\"\\u68c0\\u6d4b\\u7eb8\\u5f20\\u5b9e\\u9645\\u5c3a\\u5bf8\\u4e0e\\u8bbe\\u7f6e\\u662f\\u5426\\u5339\\u914d\",\"ver\":0,\"pos\":0,\"fix-id\":34837,\"type\":\"bool\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":false,\"default\":false,\"depend\":\"paper==A3||paper==A4||paper==A4\\u6a2a\\u5411||paper==A5||paper==A5\\u6a2a\\u5411||paper==A6||paper==A6\\u6a2a\\u5411||paper==B4||paper==B5||paper==B5\\u6a2a\\u5411||paper==B6||paper==B6\\u6a2a\\u5411||paper==Double Letter||paper==LEGAL||paper==Letter||paper==Letter\\u6a2a\\u5411\"},\"page\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u626b\\u63cf\\u9875\\u9762\",\"desc\":\"\\u8bbe\\u7f6e\\u9875\\u9762\\u626b\\u63cf\\u65b9\\u5f0f\",\"ver\":0,\"pos\":0,\"fix-id\":34838,\"type\":\"string\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":78,\"cur\":\"\\u53cc\\u9762\",\"default\":\"\\u53cc\\u9762\",\"range\":[\"\\u5355\\u9762\",\"\\u53cc\\u9762\",\"\\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\uff08\\u901a\\u7528\\uff09\",\"\\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\uff08\\u53d1\\u7968\\u7eb8\\uff09\",\"\\u5bf9\\u6298\"]},\"discardblank\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\",\"desc\":\"\",\"ver\":0,\"pos\":0,\"fix-id\":34919,\"type\":\"bool\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":false,\"default\":false},\"blank-sensitivity\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\" \\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\u7075\\u654f\\u5ea6\",\"desc\":\"\\u6570\\u503c\\u8d8a\\u5927\\uff0c\\u5219\\u8d8a\\u5bb9\\u6613\\u8df3\\u8fc7\",\"ver\":0,\"pos\":0,\"fix-id\":34839,\"type\":\"int\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":30,\"default\":30,\"range\":{\"min\":1,\"max\":100,\"step\":1},\"depend\":\"page==\\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\uff08\\u53d1\\u7968\\u7eb8\\uff09||page==\\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\uff08\\u901a\\u7528\\uff09||discardblank==true\"},\"fold-type\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u5bf9\\u6298\\u6a21\\u5f0f\",\"desc\":\"\",\"ver\":0,\"pos\":0,\"fix-id\":34887,\"type\":\"string\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":42,\"cur\":\"\\u5de6\\u53f3\\u5bf9\\u6298\",\"default\":\"\\u5de6\\u53f3\\u5bf9\\u6298\",\"range\":[\"\\u5de6\\u53f3\\u5bf9\\u6298\",\"\\u4e0a\\u4e0b\\u5bf9\\u6298\",\"\\u81ea\\u52a8\\u5bf9\\u6298\"],\"depend\":\"page==\\u5bf9\\u6298\"},\"resolution\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u5206\\u8fa8\\u7387\",\"desc\":\"\\u8bbe\\u7f6e\\u626b\\u63cf\\u56fe\\u50cf\\u7684\\u5206\\u8fa8\\u7387\",\"ver\":0,\"pos\":0,\"fix-id\":34840,\"type\":\"int\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":200,\"default\":200,\"range\":{\"min\":100,\"max\":600,\"step\":1}},\"image-quality\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u753b\\u8d28\",\"desc\":\"\\u9009\\u62e9\\u626b\\u63cf\\u4eea\\u7684\\u753b\\u8d28\\u6a21\\u5f0f\",\"ver\":0,\"pos\":0,\"fix-id\":34841,\"type\":\"string\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":42,\"cur\":\"\\u753b\\u8d28\\u4f18\\u5148\",\"default\":\"\\u753b\\u8d28\\u4f18\\u5148\",\"range\":[\"\\u901f\\u5ea6\\u4f18\\u5148\",\"\\u753b\\u8d28\\u4f18\\u5148\"],\"depend\":\"resolution>=300\"},\"is-exchange\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u4ea4\\u6362\\u6b63\\u53cd\\u9762\",\"desc\":\"\\u4ea4\\u6362\\u6bcf\\u5f20\\u6587\\u7a3f\\u7684\\u6b63\\u53cd\\u9762\\u51fa\\u56fe\\u987a\\u5e8f\",\"ver\":0,\"pos\":0,\"fix-id\":34842,\"type\":\"bool\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":false,\"default\":false,\"depend\":\"page!=\\u5355\\u9762\"},\"is-custom-gamma\":{\"cat\":\"base\",\"group\":\"bright\",\"title\":\"\\u542f\\u7528\\u8272\\u8c03\\u66f2\\u7ebf\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u56fe\\u50cf\\u8272\\u8c03\\u6548\\u679c\",\"ver\":0,\"pos\":0,\"fix-id\":34845,\"type\":\"bool\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":false,\"default\":false},\"brightness\":{\"cat\":\"base\",\"group\":\"bright\",\"title\":\"\\u4eae\\u5ea6\\u503c\",\"desc\":\"\\u8c03\\u6574\\u56fe\\u50cf\\u4eae\\u5ea6\",\"ver\":0,\"pos\":0,\"fix-id\":34846,\"type\":\"int\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":128,\"default\":128,\"range\":{\"min\":1,\"max\":255,\"step\":1},\"depend\":\"is-custom-gamma==false\"},\"contrast\":{\"cat\":\"base\",\"group\":\"bright\",\"title\":\"\\u5bf9\\u6bd4\\u5ea6\",\"desc\":\"\\u8c03\\u6574\\u56fe\\u50cf\\u5bf9\\u6bd4\\u5ea6\",\"ver\":0,\"pos\":0,\"fix-id\":34847,\"type\":\"int\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":4,\"default\":4,\"range\":{\"min\":1,\"max\":7,\"step\":1},\"depend\":\"is-custom-gamma==false\"},\"gamma\":{\"cat\":\"base\",\"group\":\"bright\",\"title\":\"\\u4f3d\\u9a6c\\u503c\",\"desc\":\"\\u8c03\\u6574\\u56fe\\u50cf\\u4f3d\\u739b\\u503c\",\"ver\":0,\"pos\":0,\"fix-id\":34848,\"type\":\"float\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":8,\"cur\":1.000000,\"default\":1.000000,\"range\":{\"min\":0.010000,\"max\":5.000000,\"step\":0.499000},\"depend\":\"is-custom-gamma==false\"},\"color-correction\":{\"cat\":\"base\",\"group\":\"imgp\",\"title\":\"\\u8272\\u504f\\u6821\\u6b63\",\"desc\":\"\\u8272\\u5f69\\u8fd8\\u539f\\u5ea6\\u77eb\\u6b63\\u529f\\u80fd\",\"ver\":0,\"pos\":0,\"fix-id\":34888,\"type\":\"bool\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":false,\"default\":false},\"is-anti-skew\":{\"cat\":\"base\",\"group\":\"imgp\",\"title\":\"\\u81ea\\u52a8\\u7ea0\\u504f\",\"desc\":\"\\u81ea\\u52a8\\u7ea0\\u6b63\\u6b6a\\u659c\\u9001\\u5165\\u7684\\u6587\\u7a3f\\u56fe\\u50cf\",\"ver\":0,\"pos\":0,\"fix-id\":34844,\"type\":\"bool\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":true,\"default\":true,\"depend\":\"page!=\\u5bf9\\u6298\"},\"is-split\":{\"cat\":\"base\",\"group\":\"imgp\",\"title\":\"\\u56fe\\u50cf\\u62c6\\u5206\",\"desc\":\"\\u81ea\\u52a8\\u62c6\\u5206\\u56fe\\u50cf\",\"ver\":0,\"pos\":0,\"fix-id\":34843,\"type\":\"bool\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":false,\"default\":false,\"depend\":\"page!=\\u5bf9\\u6298&&page!=\\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\uff08\\u53d1\\u7968\\u7eb8\\uff09&&page!=\\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\uff08\\u901a\\u7528\\uff09\"},\"is-erase-black-frame\":{\"cat\":\"base\",\"group\":\"imgp\",\"title\":\"\\u6d88\\u9664\\u9ed1\\u6846\",\"desc\":\"\\u6d88\\u9664\\u6587\\u7a3f\\u8303\\u56f4\\u5916\\u7684\\u9ed1\\u8272\\u80cc\\u666f\",\"ver\":0,\"pos\":0,\"fix-id\":34849,\"type\":\"bool\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":true,\"default\":true},\"bkg-fill-mode\":{\"cat\":\"base\",\"group\":\"i",
"mgp\",\"title\":\"\\u80cc\\u666f\\u586b\\u5145\\u65b9\\u5f0f\",\"desc\":\"\\u9009\\u62e9\\u80cc\\u666f\\u586b\\u5145\\u65b9\\u5f0f\",\"ver\":0,\"pos\":0,\"fix-id\":34854,\"type\":\"string\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":42,\"cur\":\"\\u51f8\\u591a\\u8fb9\\u5f62\",\"default\":\"\\u51f8\\u591a\\u8fb9\\u5f62\",\"range\":[\"\\u51f8\\u591a\\u8fb9\\u5f62\",\"\\u51f9\\u591a\\u8fb9\\u5f62\"],\"depend\":\"is-erase-black-frame==true\"},\"is-fill-color\":{\"cat\":\"base\",\"group\":\"imgp\",\"title\":\"\\u8272\\u5f69\\u586b\\u5145\",\"desc\":\"\\u542f\\u7528\\u540e\\u9ed1\\u6846\\u90e8\\u5206\\u5c06\\u586b\\u5145\\u4e3a\\u6587\\u7a3f\\u5e95\\u8272\",\"ver\":0,\"pos\":0,\"fix-id\":34859,\"type\":\"bool\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":false,\"default\":false,\"depend\":\"is-erase-black-frame==true\"},\"threshold\":{\"cat\":\"base\",\"group\":\"imgp\",\"title\":\"\\u9608\\u503c\",\"desc\":\"\\u6587\\u7a3f\\u5e95\\u8272\\u4e0e\\u9ed1\\u8272\\u80cc\\u666f\\u7070\\u5ea6\\u503c\\u7684\\u5dee\\u503c\\u5927\\u4e8e\\u8be5\\u503c\\uff0c\\u624d\\u4f1a\\u88ab\\u8bc6\\u522b\\u4e3a\\u6587\\u7a3f\",\"ver\":0,\"pos\":0,\"fix-id\":34851,\"type\":\"int\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":40,\"default\":40,\"range\":{\"min\":30,\"max\":50,\"step\":1},\"depend\":\"is-erase-black-frame==true||paper==\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8||paper==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8||paper==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207||is-anti-skew==true\"},\"anti-noise-level\":{\"cat\":\"base\",\"group\":\"imgp\",\"title\":\"\\u80cc\\u666f\\u6297\\u566a\\u7b49\\u7ea7\",\"desc\":\"\\u80fd\\u591f\\u5bb9\\u5fcd\\u7684\\u80cc\\u666f\\u6742\\u8272\\u6761\\u7eb9\\u7684\\u5bbd\\u5ea6\",\"ver\":0,\"pos\":0,\"fix-id\":34852,\"type\":\"int\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":8,\"default\":8,\"range\":{\"min\":2,\"max\":20,\"step\":1},\"depend\":\"is-erase-black-frame==true||paper==\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8||paper==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8||paper==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207||is-anti-skew==true\"},\"margin\":{\"cat\":\"base\",\"group\":\"imgp\",\"title\":\"\\u8fb9\\u7f18\\u7f29\\u8fdb\",\"desc\":\"\\u5bfb\\u627e\\u6587\\u7a3f\\u8fb9\\u7f18\\u65f6\\u5bf9\\u8fb9\\u7f18\\u7684\\u4fb5\\u5165\\u7a0b\\u5ea6\",\"ver\":0,\"pos\":0,\"fix-id\":34853,\"type\":\"int\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":5,\"default\":5,\"range\":{\"min\":2,\"max\":30,\"step\":1},\"depend\":\"is-erase-black-frame==true||paper==\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8||paper==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8||paper==\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207||is-anti-skew==true\"},\"is-dark-sample\":{\"cat\":\"base\",\"group\":\"imgp\",\"title\":\"\\u6df1\\u8272\\u6837\\u5f20\",\"desc\":\"\\u542f\\u7528\\u8be5\\u6a21\\u5f0f\\u9632\\u6b62\\u6df1\\u8272\\u5e95\\u8272\\u7684\\u6587\\u7a3f\\u56fe\\u50cf\\u88ab\\u8bef\\u5904\\u7406\",\"ver\":0,\"pos\":0,\"fix-id\":34850,\"type\":\"bool\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":false,\"default\":false,\"depend\":\"page!=\\u5bf9\\u6298&&is-erase-black-frame!=true&&paper!=\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8&&paper!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8&&paper!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207&&is-anti-skew!=true\"},\"is-anti-permeate\":{\"cat\":\"base\",\"group\":\"imgp\",\"title\":\"\\u9632\\u6b62\\u6e17\\u900f\",\"desc\":\"\\u9632\\u6b62\\u80cc\\u9762\\u56fe\\u6848\\u6e17\\u900f\",\"ver\":0,\"pos\":0,\"fix-id\":34855,\"type\":\"bool\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":false,\"default\":false},\"permeate-level\":{\"cat\":\"base\",\"group\":\"imgp\",\"title\":\" \\u9632\\u6b62\\u6e17\\u900f\\u7b49\\u7ea7\",\"desc\":\"\\u9009\\u62e9\\u9632\\u6b62\\u6e17\\u900f\\u7684\\u7b49\\u7ea7\",\"ver\":0,\"pos\":0,\"fix-id\":34856,\"type\":\"string\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":30,\"cur\":\"\\u8f83\\u5f31\",\"default\":\"\\u8f83\\u5f31\",\"range\":[\"\\u5f31\",\"\\u8f83\\u5f31\",\"\\u4e00\\u822c\",\"\\u8f83\\u5f3a\",\"\\u5f3a\"],\"depend\":\"is-anti-permeate==true\"},\"is-rid-hole-l\":{\"cat\":\"base\",\"group\":\"imgp\",\"title\":\"\\u7a7f\\u5b54\\u79fb\\u9664\\u2014\\u5de6\\u4fa7\",\"desc\":\"\\u7a7f\\u5b54\\u5728\\u7eb8\\u5f20\\u4e0a\\u7684\\u5de6\\u4fa7\",\"ver\":0,\"pos\":0,\"fix-id\":34879,\"type\":\"bool\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":false,\"default\":false},\"search-hole-range-l\":{\"cat\":\"base\",\"group\":\"imgp\",\"title\":\" \\u5de6\\u4fa7\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"desc\":\"\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"ver\":0,\"pos\":0,\"fix-id\":34880,\"type\":\"float\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":8,\"cur\":0.100000,\"default\":0.100000,\"range\":{\"min\":0.000000,\"max\":0.500000,\"step\":0.050000},\"depend\":\"is-rid-hole-l==true\"},\"is-rid-hole-r\":{\"cat\":\"base\",\"group\":\"imgp\",\"title\":\"\\u7a7f\\u5b54\\u79fb\\u9664\\u2014\\u53f3\\u4fa7\",\"desc\":\"\\u7a7f\\u5b54\\u5728\\u7eb8\\u5f20\\u4e0a\\u7684\\u53f3\\u4fa7\",\"ver\":0,\"pos\":0,\"fix-id\":34881,\"type\":\"bool\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":false,\"default\":false},\"search-hole-range-r\":{\"cat\":\"base\",\"group\":\"imgp\",\"title\":\" \\u53f3\\u4fa7\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"desc\":\"\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"ver\":0,\"pos\":0,\"fix-id\":34882,\"type\":\"float\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":8,\"cur\":0.100000,\"default\":0.100000,\"range\":{\"min\":0.000000,\"max\":0.500000,\"step\":0.050000},\"depend\":\"is-rid-hole-r==true\"},\"is-rid-hole-t\":{\"cat\":\"base\",\"group\":\"imgp\",\"title\":\"\\u7a7f\\u5b54\\u79fb\\u9664\\u2014\\u4e0a\\u4fa7\",\"desc\":\"\\u7a7f\\u5b54\\u5728\\u7eb8\\u5f20\\u7684\\u4e0a\\u90e8\",\"ver\":0,\"pos\":0,\"fix-id\":34883,\"type\":\"bool\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":false,\"default\":false},\"search-hole-range-t\":{\"cat\":\"base\",\"group\":\"imgp\",\"title\":\" \\u4e0a\\u4fa7\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"desc\":\"\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"ver\":0,\"pos\":0,\"fix-id\":34884,\"type\":\"float\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":8,\"cur\":0.100000,\"default\":0.100000,\"range\":{\"min\":0.000000,\"max\":0.500000,\"step\":0.050000},\"depend\":\"is-rid-hole-t==true\"},\"is-rid-hole-b\":{\"cat\":\"base\",\"group\":\"imgp\",\"title\":\"\\u7a7f\\u5b54\\u79fb\\u9664\\u2014\\u4e0b\\u4fa7\",\"desc\":\"\\u7a7f\\u5b54\\u5728\\u7eb8\\u5f20\\u7684\\u4e0b\\u90e8\",\"ver\":0,\"pos\":0,\"fix-id\":34885,\"type\":\"bool\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":false,\"default\":false},\"search-hole-range-b\":{\"cat\":\"base\",\"group\":\"imgp\",\"title\":\" \\u4e0b\\u4fa7\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"desc\":\"\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"ver\":0,\"pos\":0,\"fix-id\":34886,\"type\":\"float\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":8,\"cur\":0.100000,\"default\":0.100000,\"range\":{\"min\":0.000000,\"max\":0.500000,\"step\":0.050000},\"depend\":\"is-rid-hole-b==true\"},\"is-wait-scan\":{\"cat\":\"base\",\"group\":\"feeder\",\"title\":\"\\u5f85\\u7eb8\\u626b\\u63cf\",\"desc\":\"\\u542f\\u7528\\u540e\\uff0c\\u6587\\u7a3f\\u653e\\u5165\\u626b\\u63cf\\u4eea\\u65f6\\u5c06\\u81ea\\u52a8\\u542f\\u52a8\\u626b\\u63cf\",\"ver\":0,\"pos\":0,\"fix-id\":34873,\"type\":\"bool\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":false,\"default\":false},\"wait-scan-exit\":{\"cat\":\"base\",\"group\":\"feeder\",\"title\":\"\\u5f85\\u7eb8\\u626b\\u63cf\\u9000\\u51fa\\u65f6\\u95f4\",\"desc\":\"\\u8bbe\\u7f6e\\u7ed3\\u675f\\u5f85\\u7eb8\\u626b\\u63cf\\u7684\\u65f6\\u95f4\",\"ver\":0,\"pos\":0,\"fix-id\":0,\"type\":\"string\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":42,\"cur\":\"60s\",\"default\":\"60s\",\"range\":[\"15s\",\"30s\",\"60s\",\"2min\",\"4min\",\"8min\"],\"depend\":\"is-wait-scan==true\"},\"scan-mode\":{\"cat\":\"base\",\"group\":\"feeder\",\"title\":\"\\u626b\\u63cf\\u5f20\\u6570\",\"desc\":\"\\u9009\\u62e9\\u6307\\u5b9a\\u6570\\u91cf\\u626b\\u63cf\\u6216\\u8fde\\u7eed\\u626b\\u63cf\",\"ver\":0,\"pos\":0,\"fix-id\":34862,\"type\":\"string\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":54,\"cur\":\"\\u8fde\\u7eed\\u626b\\u63cf\",\"default\":\"\\u8fde\\u7eed\\u626b\\u63cf\",\"range\":[\"\\u8fde\\u7eed\\u626b\\u63cf\",\"\\u626b\\u63cf\\u6307\\u5b9a\\u5f20\\u6570\"],\"depend\":\"is-wait-scan==false\"},\"scan-count\":{\"cat\":\"base\",\"group\":\"feeder\",\"title\":\" \\u626b\\u63cf\\u6570\\u91cf\",\"desc\":\"\\u626b\\u63cf\\u6307\\u5b9a\\u6570\\u91cf\",\"ver\":0,\"pos\":0,\"fix-id\":34863,\"type\":\"int\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":-1,\"default\":-1,\"depend\":\"scan-mode==\\u626b\\u63cf\\u6307\\u5b9",
"a\\u5f20\\u6570\"},\"direction\":{\"cat\":\"base\",\"group\":\"feeder\",\"title\":\"\\u6587\\u7a3f\\u65b9\\u5411\",\"desc\":\"\\u8bbe\\u7f6e\\u56fe\\u50cf\\u7684\\u65b9\\u5411\",\"ver\":0,\"pos\":0,\"fix-id\":34864,\"type\":\"string\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":72,\"cur\":\"0\\u00b0\",\"default\":\"0\\u00b0\",\"range\":[\"0\\u00b0\",\"90\\u00b0\",\"180\\u00b0\",\"-90\\u00b0\",\"\\u81ea\\u52a8\\u6587\\u672c\\u65b9\\u5411\\u8bc6\\u522b\\u00b0\"]},\"is-rotate-bkg-180\":{\"cat\":\"base\",\"group\":\"feeder\",\"title\":\"\\u80cc\\u9762\\u65cb\\u8f6c180\\u00b0\",\"desc\":\"\\u80cc\\u9762\\u626b\\u63cf\\u7684\\u56fe\\u50cf\\u65cb\\u8f6c180\\u00b0\",\"ver\":0,\"pos\":0,\"fix-id\":34865,\"type\":\"bool\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":false,\"default\":false,\"depend\":\"page!=\\u5355\\u9762&&page!=\\u5bf9\\u6298&&direction!=\\u81ea\\u52a8\\u6587\\u672c\\u65b9\\u5411\\u8bc6\\u522b\\u00b0\"},\"is-ultrosonic\":{\"cat\":\"base\",\"group\":\"feeder\",\"title\":\"\\u8d85\\u58f0\\u6ce2\\u68c0\\u6d4b\",\"desc\":\"\\u68c0\\u6d4b\\u662f\\u5426\\u51fa\\u73b0\\u53cc\\u5f20\\u9001\\u5165\",\"ver\":0,\"pos\":0,\"fix-id\":34860,\"type\":\"bool\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":true,\"default\":true},\"double-feed\":{\"cat\":\"base\",\"group\":\"feeder\",\"title\":\"\\u53cc\\u5f20\\u56fe\\u7247\\u5904\\u7406\",\"desc\":\"\\u68c0\\u6d4b\\u5230\\u53cc\\u5f20\\u8fdb\\u7eb8\\u540e\\u7684\\u5904\\u7406\\u65b9\\u5f0f\",\"ver\":0,\"pos\":0,\"fix-id\":34872,\"type\":\"string\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":72,\"cur\":\"\\u4e22\\u5f03\\u56fe\\u50cf\\u5e76\\u505c\\u6b62\\u626b\\u63cf\",\"default\":\"\\u4e22\\u5f03\\u56fe\\u50cf\\u5e76\\u505c\\u6b62\\u626b\\u63cf\",\"range\":[\"\\u4e22\\u5f03\\u56fe\\u50cf\\u5e76\\u505c\\u6b62\\u626b\\u63cf\",\"\\u4e0a\\u4f20\\u56fe\\u50cf\\u5e76\\u505c\\u6b62\\u626b\\u63cf\"],\"depend\":\"is-ultrosonic==true\"},\"is-staple\":{\"cat\":\"base\",\"group\":\"feeder\",\"title\":\"\\u88c5\\u8ba2\\u68c0\\u6d4b\",\"desc\":\"\\u68c0\\u6d4b\\u662f\\u5426\\u51fa\\u73b0\\u7c98\\u8fde\\u9001\\u5165\",\"ver\":0,\"pos\":0,\"fix-id\":34861,\"type\":\"bool\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":false,\"default\":false},\"is-check-askew\":{\"cat\":\"base\",\"group\":\"feeder\",\"title\":\"\\u6b6a\\u659c\\u68c0\\u6d4b\",\"desc\":\"\\u68c0\\u6d4b\\u662f\\u5426\\u51fa\\u73b0\\u6b6a\\u659c\\u9001\\u5165\",\"ver\":0,\"pos\":0,\"fix-id\":34868,\"type\":\"bool\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":true,\"default\":true},\"askew-range\":{\"cat\":\"base\",\"group\":\"feeder\",\"title\":\"\\u6b6a\\u659c\\u5bb9\\u5fcd\\u5ea6\",\"desc\":\"\\u503c\\u8d8a\\u5c0f\\uff0c\\u80fd\\u5bb9\\u5fcd\\u5f97\\u9001\\u5165\\u6587\\u7a3f\\u6b6a\\u659c\\u89d2\\u5ea6\\u8d8a\\u5c0f\",\"ver\":0,\"pos\":0,\"fix-id\":34869,\"type\":\"int\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":3,\"default\":3,\"range\":{\"min\":1,\"max\":5,\"step\":1},\"depend\":\"is-check-askew==true\"},\"is-check-dog-ear\":{\"cat\":\"base\",\"group\":\"feeder\",\"title\":\"\\u6298\\u89d2\\u68c0\\u6d4b\",\"desc\":\"\\u68c0\\u6d4b\\u6587\\u7a3f\\u662f\\u5426\\u5b58\\u5728\\u6298\\u89d2\",\"ver\":0,\"pos\":0,\"fix-id\":34866,\"type\":\"bool\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":false,\"default\":false},\"dog-ear-size\":{\"cat\":\"base\",\"group\":\"feeder\",\"title\":\" \\u6298\\u89d2\\u5927\\u5c0f\",\"desc\":\"\\u503c\\u8d8a\\u5c0f\\uff0c\\u80fd\\u68c0\\u6d4b\\u5230\\u7684\\u6298\\u89d2\\u8d8a\\u5c0f\",\"ver\":0,\"pos\":0,\"fix-id\":34867,\"type\":\"int\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":70,\"default\":70,\"range\":{\"min\":10,\"max\":300,\"step\":1},\"depend\":\"is-check-dog-ear==true\"},\"is-auto-strength\":{\"cat\":\"base\",\"group\":\"feeder\",\"title\":\"\\u81ea\\u52a8\\u5206\\u7eb8\\u5f3a\\u5ea6\",\"desc\":\"\\u626b\\u63cf\\u4eea\\u81ea\\u52a8\\u4fee\\u6b63\\u5206\\u7eb8\\u529b\\u5ea6\",\"ver\":0,\"pos\":0,\"fix-id\":34876,\"type\":\"bool\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":false,\"default\":false},\"feed-strength-value\":{\"cat\":\"base\",\"group\":\"feeder\",\"title\":\" \\u8fdb\\u7eb8\\u5931\\u8d25\\u7387\",\"desc\":\"\\u9ad8\\u4e8e\\u8be5\\u503c\\u65f6\\u626b\\u63cf\\u4eea\\u5c06\\u8c03\\u6574\\u5206\\u7eb8\\u529b\\u5ea6\",\"ver\":0,\"pos\":0,\"fix-id\":34877,\"type\":\"float\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":8,\"cur\":0.100000,\"default\":0.100000,\"range\":{\"min\":0.100000,\"max\":0.900000,\"step\":0.080000},\"depend\":\"is-auto-strength==true\"},\"feed-strength\":{\"cat\":\"base\",\"group\":\"feeder\",\"title\":\"\\u5206\\u7eb8\\u5f3a\\u5ea6\",\"desc\":\"\\u8bbe\\u7f6e\\u626b\\u63cf\\u4eea\\u7684\\u5206\\u7eb8\\u529b\\u5ea6\",\"ver\":0,\"pos\":0,\"fix-id\":34874,\"type\":\"string\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":30,\"cur\":\"\\u4e00\\u822c\",\"default\":\"\\u4e00\\u822c\",\"range\":[\"\\u5f31\",\"\\u4e00\\u822c\",\"\\u5f3a\"],\"depend\":\"is-auto-strength!=true\"},\"time-to-sleep\":{\"cat\":\"base\",\"group\":\"feeder\",\"title\":\"\\u4f11\\u7720\\u65f6\\u95f4\",\"desc\":\"\\u8bbe\\u7f6e\\u626b\\u63cf\\u4eea\\u7684\\u4f11\\u7720\\u65f6\\u95f4\",\"ver\":0,\"pos\":0,\"fix-id\":34875,\"type\":\"string\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":36,\"cur\":\"\\u4e0d\\u4f11\\u7720\",\"default\":\"\\u4e0d\\u4f11\\u7720\",\"range\":[\"\\u4e0d\\u4f11\\u7720\",\"\\u4e94\\u5206\\u949f\",\"\\u5341\\u5206\\u949f\",\"\\u534a\\u5c0f\\u65f6\",\"\\u4e00\\u5c0f\\u65f6\",\"\\u4e24\\u5c0f\\u65f6\",\"\\u56db\\u5c0f\\u65f6\"]}}"
};
static std::string crash_json[] = { "{\"dev-sn\":{\"cat\":\"Common\",\"group\":\"\\u8bbe\\u5907\\u5c5e\\u6027\",\"title\":\"\\u8bbe\\u5907\\u5e8f\\u5217\\u53f7\",\"desc\":\"\\u8bbe\\u5907\\u552f\\u4e00\\u7f16\\u7801\",\"ver\":1,\"pos\":0,\"type\":\"string\",\"unit\":\"none\",\"affect\":0,\"readonly\":true,\"visible\":true,\"enabled\":true,\"size\":96,\"cur\":\"G100S20230001\",\"default\":\"G100S20230001\"},\"fmw-ver\":{\"cat\":\"Common\",\"group\":\"\\u8bbe\\u5907\\u5c5e\\u6027\",\"title\":\"\\u56fa\\u4ef6\\u7248\\u672c\\u53f7\",\"desc\":\"\\u8bbe\\u5907\\u9a71\\u52a8\\u7248\\u672c\\u53f7\",\"ver\":1,\"pos\":0,\"type\":\"string\",\"unit\":\"none\",\"affect\":0,\"readonly\":true,\"visible\":true,\"enabled\":true,\"size\":66,\"cur\":\"FMWV1001\",\"default\":\"FMWV1001\"},\"ip-addr\":{\"cat\":\"Common\",\"group\":\"\\u8bbe\\u5907\\u5c5e\\u6027\",\"title\":\"\\u8bbe\\u5907IP\\u5730\\u5740\",\"desc\":\"\\u5f53\\u8bbe\\u5907\\u8fde\\u63a5\\u7f51\\u7edc\\u65f6\\u5206\\u914d\\u7684IP\\u5730\\u5740\",\"ver\":1,\"pos\":0,\"type\":\"string\",\"unit\":\"none\",\"affect\":0,\"readonly\":true,\"visible\":true,\"enabled\":true,\"size\":60,\"cur\":\"192.168.1.128\",\"default\":\"0.0.0.0\"},\"mac-addr\":{\"cat\":\"Common\",\"group\":\"\\u8bbe\\u5907\\u5c5e\\u6027\",\"title\":\"\\u8bbe\\u5907MAC\\u5730\\u5740\",\"desc\":\"\\u8bbe\\u5907MAC\\u5730\\u5740\",\"ver\":1,\"pos\":0,\"type\":\"string\",\"unit\":\"none\",\"affect\":0,\"readonly\":true,\"visible\":true,\"enabled\":true,\"size\":120,\"cur\":\"da:48:8a:f7:e2:4f\",\"default\":\"00:11:22:33:44:55\"},\"cis-mode\":{\"cat\":\"cis\",\"group\":\"CIS\",\"title\":\"CIS\\u5de5\\u4f5c\\u6a21\\u5f0f\",\"desc\":\"\\u8bbe\\u7f6eCIS\\u5f69\\u8272\\u6216\\u8005\\u9ed1\\u767d\\u7684\\u5de5\\u4f5c\\u6a21\\u5f0f\",\"ver\":1,\"pos\":0,\"type\":\"string\",\"unit\":\"none\",\"affect\":2,\"readonly\":false,\"visible\":false,\"enabled\":true,\"size\":30,\"cur\":\"\\u5f69\\u8272\",\"default\":\"\\u5f69\\u8272\",\"range\":[\"\\u5f69\\u8272\",\"\\u9ed1\\u767d\"]},\"cis-dpi\":{\"cat\":\"cis\",\"group\":\"CIS\",\"title\":\"CIS\\u5206\\u8fa8\\u7387\",\"desc\":\"\\u8bbe\\u7f6eCIS\\u91c7\\u96c6\\u7684\\u5206\\u8fa8\\u7387\",\"ver\":1,\"pos\":0,\"type\":\"int\",\"unit\":\"none\",\"affect\":2,\"readonly\":false,\"visible\":false,\"enabled\":true,\"size\":4,\"cur\":200,\"default\":200,\"range\":[200,300,600]},\"gain-front\":{\"cat\":\"cis\",\"group\":\"CIS\",\"title\":\"\\u6b63\\u9762\\u589e\\u76ca\",\"desc\":\"\\u8bbe\\u7f6eCIS\\u6b63\\u9762\\u955c\\u5934\\u7684\\u589e\\u76ca\",\"ver\":1,\"pos\":0,\"type\":\"int\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":false,\"enabled\":true,\"size\":4,\"cur\":200,\"default\":200,\"range\":[100,200,300,600]},\"gain-back\":{\"cat\":\"cis\",\"group\":\"CIS\",\"title\":\"\\u80cc\\u9762\\u589e\\u76ca\",\"desc\":\"\\u8bbe\\u7f6eCIS\\u80cc\\u9762\\u955c\\u5934\\u7684\\u589e\\u76ca\",\"ver\":1,\"pos\":0,\"type\":\"int\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":false,\"enabled\":true,\"size\":4,\"cur\":200,\"default\":200,\"range\":[100,200,300,600]},\"offset-front\":{\"cat\":\"cis\",\"group\":\"CIS\",\"title\":\"\\u6b63\\u9762\\u504f\\u79fb\",\"desc\":\"\\u8bbe\\u7f6eCIS\\u6b63\\u9762\\u7684\\u504f\\u79fb\\u8ddd\\u79bb\",\"ver\":1,\"pos\":0,\"type\":\"int\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":false,\"enabled\":true,\"size\":4,\"cur\":150,\"default\":150,\"range\":[0,50,100,150,200]},\"offset-back\":{\"cat\":\"cis\",\"group\":\"CIS\",\"title\":\"\\u80cc\\u9762\\u504f\\u79fb\",\"desc\":\"\\u8bbe\\u7f6eCIS\\u80cc\\u9762\\u7684\\u504f\\u79fb\\u8ddd\\u79bb\",\"ver\":1,\"pos\":0,\"type\":\"int\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":false,\"enabled\":true,\"size\":4,\"cur\":150,\"default\":150,\"range\":[0,50,100,150,200]},\"exposure-f-r\":{\"cat\":\"cis\",\"group\":\"CIS\",\"title\":\"\\u6b63\\u9762\\u7ea2\\u8272\\u5206\\u91cf\\u66dd\\u5149\\u5ea6\",\"desc\":\"\\u8bbe\\u7f6e\\u6b63\\u9762\\u7ea2\\u8272\\u5206\\u91cf\\u7684\\u66dd\\u5149\\u5f3a\\u5ea6\",\"ver\":1,\"pos\":0,\"type\":\"int\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":false,\"enabled\":true,\"size\":4,\"cur\":0,\"default\":0,\"range\":{\"min\":-1000,\"max\":1000,\"step\":200}},\"exposure-f-g\":{\"cat\":\"cis\",\"group\":\"CIS\",\"title\":\"\\u6b63\\u9762\\u7eff\\u8272\\u5206\\u91cf\\u66dd\\u5149\\u5ea6\",\"desc\":\"\\u8bbe\\u7f6e\\u6b63\\u9762\\u7eff\\u8272\\u5206\\u91cf\\u7684\\u66dd\\u5149\\u5f3a\\u5ea6\",\"ver\":1,\"pos\":0,\"type\":\"int\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":false,\"enabled\":true,\"size\":4,\"cur\":0,\"default\":0,\"range\":{\"min\":-1000,\"max\":1000,\"step\":200}},\"exposure-f-b\":{\"cat\":\"cis\",\"group\":\"CIS\",\"title\":\"\\u6b63\\u9762\\u84dd\\u8272\\u5206\\u91cf\\u66dd\\u5149\\u5ea6\",\"desc\":\"\\u8bbe\\u7f6e\\u6b63\\u9762\\u84dd\\u8272\\u5206\\u91cf\\u7684\\u66dd\\u5149\\u5f3a\\u5ea6\",\"ver\":1,\"pos\":0,\"type\":\"int\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":false,\"enabled\":true,\"size\":4,\"cur\":0,\"default\":0,\"range\":{\"min\":-1000,\"max\":1000,\"step\":200}},\"exposure-b-r\":{\"cat\":\"cis\",\"group\":\"CIS\",\"title\":\"\\u80cc\\u9762\\u7ea2\\u8272\\u5206\\u91cf\\u66dd\\u5149\\u5ea6\",\"desc\":\"\\u8bbe\\u7f6e\\u6b63\\u80cc\\u9762\\u7ea2\\u8272\\u5206\\u91cf\\u7684\\u66dd\\u5149\\u5f3a\\u5ea6\",\"ver\":1,\"pos\":0,\"type\":\"int\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":false,\"enabled\":true,\"size\":4,\"cur\":0,\"default\":0,\"range\":{\"min\":-1000,\"max\":1000,\"step\":200}},\"exposure-b-g\":{\"cat\":\"cis\",\"group\":\"CIS\",\"title\":\"\\u80cc\\u9762\\u7eff\\u8272\\u5206\\u91cf\\u66dd\\u5149\\u5ea6\",\"desc\":\"\\u8bbe\\u7f6e\\u80cc\\u9762\\u7eff\\u8272\\u5206\\u91cf\\u7684\\u66dd\\u5149\\u5f3a\\u5ea6\",\"ver\":1,\"pos\":0,\"type\":\"int\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":false,\"enabled\":true,\"size\":4,\"cur\":0,\"default\":0,\"range\":{\"min\":-1000,\"max\":1000,\"step\":200}},\"exposure-b-b\":{\"cat\":\"cis\",\"group\":\"CIS\",\"title\":\"\\u80cc\\u9762\\u84dd\\u8272\\u5206\\u91cf\\u66dd\\u5149\\u5ea6\",\"desc\":\"\\u8bbe\\u7f6e\\u80cc\\u9762\\u84dd\\u8272\\u5206\\u91cf\\u7684\\u66dd\\u5149\\u5f3a\\u5ea6\",\"ver\":1,\"pos\":0,\"type\":\"int\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":false,\"enabled\":true,\"size\":4,\"cur\":0,\"default\":0,\"range\":{\"min\":-1000,\"max\":1000,\"step\":200}},\"paper\":{\"cat\":\"common\",\"group\":\"base\",\"title\":\"\\u7eb8\\u5f20\\u5c3a\\u5bf8\",\"desc\":\"\\u8bbe\\u7f6e\\u51fa\\u56fe\\u5927\\u5c0f\",\"ver\":1,\"pos\":0,\"type\":\"string\",\"unit\":\"none\",\"affect\":6,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":96,\"cur\":\"\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"default\":\"\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"range\":[\"A3\",\"8\\u5f00\",\"A4\",\"16\\u5f00\",\"A5\",\"A6\",\"B4\",\"B5\",\"B6\",\"Letter\",\"Double Letter\",\"LEGAL\",\"\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\",\"\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\",\"\\u4e09\\u8054\\u8bd5\\u5377\"]},\"lateral\":{\"cat\":\"common\",\"group\":\"base\",\"title\":\"\\u6a2a\\u5411\",\"desc\":\"\\u6a2a\\u5411\\u653e\\u7eb8\",\"ver\":1,\"pos\":0,\"type\":\"bool\",\"unit\":\"none\",\"affect\":6,\"readonly\":false,\"visible\":true,\"enabled\":false,\"size\":4,\"cur\":false,\"default\":false,\"depend_or\":[\"paper==A4\",\"==A5\",\"==A6\",\"==B5\",\"==B6\",\"==Letter\"]},\"paper-w\":{\"cat\":\"common\",\"group\":\"base\",\"title\":\"\\u7eb8\\u5f20\\u5bbd\\u5ea6<EFBFBD><EFBFBD>\\u50cf\\u7d20<EFBFBD><EFBFBD>\",\"desc\":\"\\u9009\\u62e9\\u7684\\u56fa\\u5b9a\\u5927\\u5c0f\\u7eb8\\u5f20\\u7684\\u5bbd\\u5ea6\",\"ver\":1,\"pos\":0,\"type\":\"int\",\"unit\":\"pixel\",\"affect\":0,\"readonly\":true,\"visible\":false,\"enabled\":true,\"size\":4,\"cur\":1654,\"default\":1654},\"paper-h\":{\"cat\":\"common\",\"group\":\"base\",\"title\":\"\\u7eb8\\u5f20\\u9ad8\\u5ea6<EFBFBD><EFBFBD>\\u50cf\\u7d20<EFBFBD><EFBFBD>\",\"desc\":\"\\u9009\\u62e9\\u7684\\u56fa\\u5b9a\\u5927\\u5c0f\\u7eb8\\u5f20\\u7684\\u5bbd\\u5ea6\",\"ver\":1,\"pos\":0,\"type\":\"int\",\"unit\":\"pixel\",\"affect\":0,\"readonly\":true,\"visible\":false,\"enabled\":true,\"size\":4,\"cur\":2339,\"default\":2339},\"is-custom-area\":{\"cat\":\"imgp\",\"group\":\"base\",\"title\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\",\"ver\":1,\"pos\":302,\"type\":\"bool\",\"unit\":\"none\",\"affect\":2,\"readonly\":false,\"visible\":true,\"enabled\":false,\"size\":4,\"cur\":false,\"default\":false,\"depend_and\":[\"paper!=\\u5339\\u914d\\u539f\\u59cb\\u5c3a\\u5bf8\",\"!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\",\"!=\\u6700\\u5927\\u626b\\u63cf\\u5c3a\\u5bf8\\u81ea\\u52a8\\u88c1\\u5207\"]},\"tl-x\":{\"cat\":\"imgp\",\"group\":\"base\",\"title\":\"\\u626b\\u63cf\\u533a\\u57df\\u5de6\\u4fa7<EFBFBD><EFBFBD>\\u50cf\\u7d20<EFBFBD><EFBFBD>\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\\u5de6\\u4e0a\\u89d2x\\u5750\\u6807\",\"ver\":1,\"pos\":303,\"type\":\"int\",\"unit\":\"pixel\",\"affect\":4,\"readonly\":false,\"visible\":true,\"enabled\":false,\"size\":4,\"cur\":0,\"default\":0,\"range\":{\"min\":0,\"max\":1654,\"step\":1},\"depend_and\":[\"is-custom-area==true\"]},\"br-x\":{\"cat\":\"imgp\",\"group\":\"base\",\"title\":\"\\u626b\\u63cf\\u533a\\u57df\\u53f3\\u4fa7<EFBFBD><EFBFBD>\\u50cf\\u7d20<EFBFBD><EFBFBD>\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\\u53f3\\u4e0b\\u89d2x\\u5750\\u6807\",\"ver\":1,\"pos\":304,\"type\":\"int\",\"unit\":\"pixel\",\"affect\":4,\"readonly\":false,\"visible\":true,\"enabled\":false,\"size\":4,\"cur\":1654,\"default\":1654,\"range\":{\"min\":0,\"max\":1654,\"step\":1},\"depend_and\":[\"is-custom-area==true\"]},\"tl-y\":{\"cat\":\"imgp\",\"group\":\"base\",\"title\":\"\\u626b\\u63cf\\u533a\\u57df\\u4e0a\\u4fa7<EFBFBD><EFBFBD>\\u50cf\\u7d20<EFBFBD><EFBFBD>\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\\u5de6\\u4e0a\\u89d2y\\u5750\\u6807\",\"ver\":1,\"pos\":305,\"type\":\"int\",\"unit\":\"pixel\",\"affect\":4,\"readonly\":false,\"visible\":true,\"enabled\":false,\"size\":4,\"cur\":0,\"default\":0,\"range\":{\"min\":0,\"max\":2339,\"step\":1},"
, "\"depend_and\":[\"is-custom-area==true\"]},\"br-y\":{\"cat\":\"imgp\",\"group\":\"base\",\"title\":\"\\u626b\\u63cf\\u533a\\u57df\\u4e0b\\u4fa7<EFBFBD><EFBFBD>\\u50cf\\u7d20<EFBFBD><EFBFBD>\",\"desc\":\"\\u81ea\\u5b9a\\u4e49\\u626b\\u63cf\\u533a\\u57df\\u53f3\\u4e0b\\u89d2y\\u5750\\u6807\",\"ver\":1,\"pos\":306,\"type\":\"int\",\"unit\":\"pixel\",\"affect\":4,\"readonly\":false,\"visible\":true,\"enabled\":false,\"size\":4,\"cur\":2339,\"default\":2339,\"range\":{\"min\":0,\"max\":2339,\"step\":1},\"depend_and\":[\"is-custom-area==true\"]},\"scan-count\":{\"cat\":\"cis\",\"group\":\"base\",\"title\":\"\\u626b\\u63cf\\u5f20\\u6570\",\"desc\":\"\\u8bbe\\u7f6e\\u626b\\u63cf\\u7684\\u7eb8\\u5f20\\u6570\\u91cf<EFBFBD><EFBFBD><EFBFBD><EFBFBD>-1<><31>\\u4e3a\\u8fde\\u7eed\\u626b\\u63cf\",\"ver\":1,\"pos\":0,\"type\":\"int\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":-1,\"default\":-1,\"range\":[-1,1,2,3,4,5,6,7,8,9,10]},\"double-feed-check\":{\"cat\":\"cis\",\"group\":\"feeder\",\"title\":\"\\u53cc\\u5f20\\u68c0\\u6d4b\",\"desc\":\"\\u8bbe\\u7f6e\\u53cc\\u5f20\\u68c0\\u6d4b\\u6a21\\u5f0f\",\"ver\":1,\"pos\":0,\"type\":\"string\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":36,\"cur\":\"\\u8d85\\u58f0\\u6ce2\",\"default\":\"\\u8d85\\u58f0\\u6ce2\",\"range\":[\"\\u65e0\",\"\\u8d85\\u58f0\\u6ce2\"]},\"is-staple\":{\"cat\":\"cis\",\"group\":\"feeder\",\"title\":\"\\u88c5\\u8ba2\\u68c0\\u6d4b\",\"desc\":\"\\u68c0\\u6d4b\\u662f\\u5426\\u51fa\\u73b0\\u7c98\\u8fde\\u9001\\u5165\",\"ver\":1,\"pos\":0,\"type\":\"bool\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":false,\"default\":false},\"is-check-askew\":{\"cat\":\"cis\",\"group\":\"feeder\",\"title\":\"\\u6b6a\\u659c\\u68c0\\u6d4b\",\"desc\":\"\\u68c0\\u6d4b\\u662f\\u5426\\u51fa\\u73b0\\u6b6a\\u659c\\u9001\\u5165\",\"ver\":1,\"pos\":0,\"type\":\"bool\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":true,\"default\":true},\"askew-range\":{\"cat\":\"cis\",\"group\":\"feeder\",\"title\":\"\\u6b6a\\u659c\\u5bb9\\u5fcd\\u5ea6\",\"desc\":\"\\u503c\\u8d8a\\u5c0f<EFBFBD><EFBFBD>\\u80fd\\u5bb9\\u5fcd\\u5f97\\u9001\\u5165\\u6587\\u7a3f\\u6b6a\\u659c\\u89d2\\u5ea6\\u8d8a\\u5c0f\",\"ver\":1,\"pos\":0,\"type\":\"int\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":3,\"default\":3,\"range\":{\"min\":1,\"max\":5,\"step\":1},\"depend_or\":[\"is-check-askew==true\"]},\"chip-pos-correct\":{\"cat\":\"cis\",\"group\":\"CIS\",\"title\":\"\\u6821\\u6b63\\u6a21\\u5f0f<EFBFBD><EFBFBD>\\u4f4d\\u7f6e<EFBFBD><EFBFBD>\",\"desc\":\"\\u542f\\u7528\\u82af\\u7247\\u4e0a\\u7684\\u4f4d\\u7f6e\\u6821\\u6b63\\u529f\\u80fd\",\"ver\":1,\"pos\":0,\"type\":\"bool\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":false,\"default\":false},\"auto-scan\":{\"cat\":\"cis\",\"group\":\"advance\",\"title\":\"\\u5f85\\u7eb8\\u626b\\u63cf\",\"desc\":\"\\u5f53\\u7eb8\\u5f20\\u653e\\u4e0a\\u626b\\u63cf\\u4eea\\u65f6<EFBFBD><EFBFBD>\\u81ea\\u52a8\\u5f00\\u542f\\u626b\\u63cf\",\"ver\":1,\"pos\":0,\"type\":\"bool\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":false,\"default\":false},\"photo-mode\":{\"cat\":\"cis\",\"group\":\"advance\",\"title\":\"\\u7167\\u7247\\u6a21\\u5f0f\",\"desc\":\"\\u7167\\u7247\\u6a21\\u5f0f\\u53ef\\u4ee5\\u4fdd\\u7559\\u56fe\\u7247\\u66f4\\u591a\\u7ec6\\u8282\",\"ver\":1,\"pos\":0,\"type\":\"bool\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":false,\"default\":false},\"chip-color-correct\":{\"cat\":\"cis\",\"group\":\"CIS\",\"title\":\"\\u56fe\\u50cf\\u6821\\u6b63<EFBFBD><EFBFBD>\\u989c\\u8272<EFBFBD><EFBFBD>\",\"desc\":\"\\u542f\\u7528\\u82af\\u7247\\u4e0a\\u7684\\u989c\\u8272\\u6821\\u6b63\\u529f\\u80fd\",\"ver\":1,\"pos\":0,\"type\":\"bool\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":false,\"default\":false},\"is-size-check\":{\"cat\":\"cis\",\"group\":\"base\",\"title\":\"\\u5c3a\\u5bf8\\u68c0\\u6d4b\",\"desc\":\"\\u56fa\\u5b9a\\u5e45\\u9762\\u4e0b\\u68c0\\u6d4b\\u7eb8\\u5f20\\u5c3a\\u5bf8\\u662f\\u5426\\u5339\\u914d\",\"ver\":1,\"pos\":0,\"type\":\"bool\",\"unit\":\"none\",\"affect\":2,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":false,\"default\":false},\"chip-cache\":{\"cat\":\"cis\",\"group\":\"CIS\",\"title\":\"\\u7247\\u4e0a\\u7f13\\u5b58\",\"desc\":\"\\u662f\\u5426\\u5728\\u7247\\u4e0a\\u7f13\\u5b58\\u56fe\\u7247\",\"ver\":1,\"pos\":0,\"type\":\"bool\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":false,\"default\":false},\"chip-size-err\":{\"cat\":\"cis\",\"group\":\"CIS\",\"title\":\"\\u5e45\\u9762\\u68c0\\u6d4b\\u8bef\\u5dee\",\"desc\":\"\\u8bbe\\u7f6e\\u5c3a\\u5bf8\\u68c0\\u6d4b\\u65f6\\u7684\\u8bef\\u5dee\\u5927\\u5c0f\",\"ver\":1,\"pos\":0,\"type\":\"int\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":false,\"size\":4,\"cur\":0,\"default\":0,\"range\":{\"min\":0,\"max\":511,\"step\":1},\"depend_or\":[\"is-size-check==true\"]},\"montage\":{\"cat\":\"cis\",\"group\":\"CIS\",\"title\":\"\\u56fe\\u50cf\\u62fc\\u63a5\",\"desc\":\"\\u5c06CIS\\u91c7\\u96c6\\u7684\\u539f\\u59cb\\u6570\\u636e\\u6062\\u590d\\u4e3a\\u6b63\\u5e38\\u7684\\u56fe\\u50cf\",\"ver\":1,\"pos\":10,\"type\":\"bool\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":false,\"enabled\":true,\"size\":4,\"cur\":true,\"default\":true},\"cis-color-correct\":{\"cat\":\"CIS\",\"group\":\"CIS\",\"title\":\"\\u5149\\u5b66\\u989c\\u8272\\u6821\\u6b63\",\"desc\":\"\\u5bf9CIS\\u7684\\u539f\\u56fe\\u989c\\u8272\\u8fdb\\u884c\\u6821\\u6b63\",\"ver\":1,\"pos\":20,\"type\":\"bool\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":false,\"enabled\":true,\"size\":4,\"cur\":true,\"default\":true},\"reinstate\":{\"cat\":\"CIS\",\"group\":\"CIS\",\"title\":\"\\u786c\\u4ef6\\u590d\\u539f\",\"desc\":\"\\u6d88\\u9664CIS\\u786c\\u4ef6\\u62c9\\u4f38\\u56e0\\u7d20<EFBFBD><EFBFBD>\\u6062\\u590d\\u56fe\\u7247\\u521d\\u59cb\\u72b6\\u6001\",\"ver\":1,\"pos\":30,\"type\":\"bool\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":false,\"enabled\":true,\"size\":4,\"cur\":true,\"default\":true},\"fb-split\":{\"cat\":\"CIS\",\"group\":\"CIS\",\"title\":\"\\u62c6\\u5206\\u6b63\\u53cd\\u9762\",\"desc\":\"\\u5c06\\u6b63\\u53cd\\u9762\\u5408\\u6210\\u7684\\u4e00\\u5f20\\u56fe\\u7247\\u62c6\\u5206\\u6210\\u6b63\\u9762\\u548c\\u53cd\\u9762\\u56fe\\u7247\",\"ver\":1,\"pos\":40,\"type\":\"bool\",\"unit\":\"none\",\"affect\":2,\"readonly\":false,\"visible\":false,\"enabled\":true,\"size\":4,\"cur\":true,\"default\":true},\"page\":{\"cat\":\"CIS\",\"group\":\"base\",\"title\":\"\\u9875\\u9762\",\"desc\":\"\\u83b7\\u53d6\\u7eb8\\u5f20\\u6307\\u5b9a\\u9762\\u7684\\u56fe\\u7247\",\"ver\":1,\"pos\":50,\"type\":\"string\",\"unit\":\"none\",\"affect\":2,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":30,\"cur\":\"\\u53cc\\u9762\",\"default\":\"\\u53cc\\u9762\",\"range\":[\"\\u6b63\\u9762\",\"\\u80cc\\u9762\",\"\\u53cc\\u9762\"],\"depend_or\":[\"fb-split==true\"]},\"is-exchange\":{\"cat\":\"CIS\",\"group\":\"base\",\"title\":\"\\u4ea4\\u6362\\u6b63\\u53cd\\u9762\",\"desc\":\"\\u4ea4\\u6362\\u6bcf\\u5f20\\u6587\\u7a3f\\u7684\\u6b63\\u53cd\\u9762\\u51fa\\u56fe\\u987a\\u5e8f\",\"ver\":1,\"pos\":60,\"type\":\"bool\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":false,\"default\":false,\"depend_and\":[\"fb-split==true\",\"page==\\u53cc\\u9762\"]},\"is-rotate-bkg-180\":{\"cat\":\"CIS\",\"group\":\"base\",\"title\":\"\\u80cc\\u9762\\u65cb\\u8f6c180\\u63b3\",\"desc\":\"\\u80cc\\u9762\\u626b\\u63cf\\u7684\\u56fe\\u50cf\\u65cb\\u8f6c180\\u63b3\",\"ver\":1,\"pos\":70,\"type\":\"bool\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":false,\"default\":false,\"depend_and\":[\"fb-split==true\",\"page!=\\u6b63\\u9762\"]},\"is-check-dog-ear\":{\"cat\":\"imgp\",\"group\":\"feeder\",\"title\":\"\\u6298\\u89d2\\u68c0\\u6d4b\",\"desc\":\"\\u68c0\\u6d4b\\u6587\\u7a3f\\u662f\\u5426\\u5b58\\u5728\\u6298\\u89d2\",\"ver\":1,\"pos\":10,\"type\":\"bool\",\"unit\":\"none\",\"affect\":2,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":false,\"default\":false},\"dog-ear-size\":{\"cat\":\"imgp\",\"group\":\"feeder\",\"title\":\" \\u6298\\u89d2\\u5927\\u5c0f\",\"desc\":\"\\u503c\\u8d8a\\u5c0f\\u80fd\\u68c0\\u6d4b\\u5230\\u7684\\u6298\\u89d2\\u8d8a\\u5c0f\",\"ver\":1,\"pos\":11,\"type\":\"int\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":false,\"size\":4,\"cur\":70,\"default\":70,\"range\":{\"min\":0,\"max\":100,\"step\":1},\"depend_or\":[\"is-check-dog-ear==true\"]},\"dog-ear-size-outer\":{\"cat\":\"imgp\",\"group\":\"feeder\",\"title\":\" \\u6298\\u89d2\\u5927\\u5c0f<EFBFBD><EFBFBD>\\u5728\\u56fe\\u7247\\u5916<EFBFBD><EFBFBD>\",\"desc\":\"\\u503c\\u8d8a\\u5c0f\\u80fd\\u68c0\\u6d4b\\u5230\\u7684\\u6298\\u89d2\\u8d8a\\u5c0f\",\"ver\":1,\"pos\":12,\"type\":\"int\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":false,\"enabled\":false,\"size\":4,\"cur\":70,\"default\":70,\"range\":{\"min\":0,\"max\":100,\"step\":1},\"depend_or\":[\"is-check-dog-ear==true\"]},\"dog-ear-zoom-x\":{\"cat\":\"imgp\",\"group\":\"feeder\",\"title\":\"\\u539f\\u56feX\\u8f74\\u7f29\\u653e\\u6bd4\\u4f8b\",\"desc\":\"\\u5bf9\\u4e8e\\u5927\\u5c3a\\u5bf8\\u56fe\\u50cf\\u800c\\u8a00\\u901a\\u8fc7zoom\\u7f29\\u5c0f\\u56fe\\u50cf\\u53ef\\u51cf\\u5c11\\u8ba1\\u7b97\\u91cf<EFBFBD><EFBFBD>\\u9ed8\\u8ba4\\u503c1.0\",\"ver\":1,\"pos\":13,\"type\":\"float\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":false,\"enabled\":false,\"size\":8,\"cur\":1,\"default\":1,\"range\":{\"min\":0.100000,\"max\":4,\"step\":0.500000},\"depend_or\":[\"is-check-dog-ear==true\"]},\"dog-ear-zoom-y\":{\"cat\":\"imgp\",\"group\":\"feeder\",\"title\":\"\\u539f\\u56fey\\u8f74\\u7f29\\u653e\\u6bd4\\u4f8b\",\"desc\":\"\\u5bf9\\u4e8e\\u5927\\u5c3a\\u5bf8\\u56fe\\u50cf\\u800c\\u8a00\\u901a\\u8fc7zoom\\u7f29\\u5c0f\\u56fe"
, "\\u50cf\\u53ef\\u51cf\\u5c11\\u8ba1\\u7b97\\u91cf<EFBFBD><EFBFBD>\\u9ed8\\u8ba4\\u503c1.0\",\"ver\":1,\"pos\":14,\"type\":\"float\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":false,\"enabled\":false,\"size\":8,\"cur\":1,\"default\":1,\"range\":{\"min\":0.100000,\"max\":4,\"step\":0.500000},\"depend_or\":[\"is-check-dog-ear==true\"]},\"dog-ear-threashold\":{\"cat\":\"imgp\",\"group\":\"feeder\",\"title\":\"\\u4e8c\\u503c\\u5316\\u9608\\u503c\",\"desc\":\"\\u6298\\u89d2\\u68c0\\u6d4b\\u4e8c\\u503c\\u5316\\u53c2\\u6570\",\"ver\":1,\"pos\":15,\"type\":\"int\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":false,\"enabled\":false,\"size\":4,\"cur\":40,\"default\":40,\"range\":{\"min\":10,\"max\":100,\"step\":5},\"depend_or\":[\"is-check-dog-ear==true\"]},\"is-rid-hole-l\":{\"cat\":\"imgp\",\"group\":\"imgp\",\"title\":\"\\u7a7f\\u5b54\\u79fb\\u9664<EFBFBD><EFBFBD>\\u5de6\\u4fa7\",\"desc\":\"\\u7a7f\\u5b54\\u5728\\u7eb8\\u5f20\\u4e0a\\u7684\\u5de6\\u4fa7\",\"ver\":1,\"pos\":100,\"type\":\"bool\",\"unit\":\"none\",\"affect\":2,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":false,\"default\":false},\"search-hole-range-l\":{\"cat\":\"imgp\",\"group\":\"imgp\",\"title\":\"\\u5de6\\u4fa7\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"desc\":\"\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"ver\":1,\"pos\":101,\"type\":\"float\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":false,\"size\":8,\"cur\":0.100000,\"default\":0.100000,\"range\":{\"min\":0,\"max\":0.500000,\"step\":0.050000},\"depend_and\":[\"is-rid-hole-l==true\"]},\"is-rid-hole-r\":{\"cat\":\"imgp\",\"group\":\"imgp\",\"title\":\"\\u7a7f\\u5b54\\u79fb\\u9664<EFBFBD><EFBFBD>\\u53f3\\u4fa7\",\"desc\":\"\\u7a7f\\u5b54\\u5728\\u7eb8\\u5f20\\u4e0a\\u7684\\u53f3\\u4fa7\",\"ver\":1,\"pos\":110,\"type\":\"bool\",\"unit\":\"none\",\"affect\":2,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":false,\"default\":false},\"search-hole-range-r\":{\"cat\":\"imgp\",\"group\":\"imgp\",\"title\":\"\\u53f3\\u4fa7\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"desc\":\"\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"ver\":1,\"pos\":111,\"type\":\"float\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":false,\"size\":8,\"cur\":0.100000,\"default\":0.100000,\"range\":{\"min\":0,\"max\":0.500000,\"step\":0.050000},\"depend_and\":[\"is-rid-hole-r==true\"]},\"is-rid-hole-t\":{\"cat\":\"imgp\",\"group\":\"imgp\",\"title\":\"\\u7a7f\\u5b54\\u79fb\\u9664<EFBFBD><EFBFBD>\\u4e0a\\u4fa7\",\"desc\":\"\\u7a7f\\u5b54\\u5728\\u7eb8\\u5f20\\u7684\\u4e0a\\u90e8\",\"ver\":1,\"pos\":120,\"type\":\"bool\",\"unit\":\"none\",\"affect\":2,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":false,\"default\":false},\"search-hole-range-t\":{\"cat\":\"imgp\",\"group\":\"imgp\",\"title\":\"\\u4e0a\\u4fa7\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"desc\":\"\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"ver\":1,\"pos\":121,\"type\":\"float\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":false,\"size\":8,\"cur\":0.100000,\"default\":0.100000,\"range\":{\"min\":0,\"max\":0.500000,\"step\":0.050000},\"depend_and\":[\"is-rid-hole-t==true\"]},\"is-rid-hole-b\":{\"cat\":\"imgp\",\"group\":\"imgp\",\"title\":\"\\u7a7f\\u5b54\\u79fb\\u9664<EFBFBD><EFBFBD>\\u4e0b\\u4fa7\",\"desc\":\"\\u7a7f\\u5b54\\u5728\\u7eb8\\u5f20\\u7684\\u4e0b\\u90e8\",\"ver\":1,\"pos\":130,\"type\":\"bool\",\"unit\":\"none\",\"affect\":2,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":false,\"default\":false},\"search-hole-range-b\":{\"cat\":\"imgp\",\"group\":\"imgp\",\"title\":\"\\u4e0b\\u4fa7\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"desc\":\"\\u7a7f\\u5b54\\u641c\\u7d22\\u8303\\u56f4\\u5360\\u5e45\\u9762\\u6bd4\\u4f8b\",\"ver\":1,\"pos\":131,\"type\":\"float\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":false,\"size\":8,\"cur\":0.100000,\"default\":0.100000,\"range\":{\"min\":0,\"max\":0.500000,\"step\":0.050000},\"depend_and\":[\"is-rid-hole-b==true\"]},\"hole-side-len\":{\"cat\":\"imgp\",\"group\":\"imgp\",\"title\":\"\\u7a7f\\u5b54\\u8fb9\\u957f\\u9608\\u503c\",\"desc\":\"\\u7a7f\\u5b54\\u8fb9\\u957f\\u8d85\\u51fa\\u8be5\\u9608\\u503c\\u65f6<EFBFBD><EFBFBD>\\u5c06\\u88ab\\u79fb\\u9664\",\"ver\":1,\"pos\":140,\"type\":\"float\",\"unit\":\"pixel\",\"affect\":0,\"readonly\":false,\"visible\":false,\"enabled\":true,\"size\":8,\"cur\":25,\"default\":25,\"range\":{\"min\":10,\"max\":50,\"step\":0}},\"hole-bin-threshold\":{\"cat\":\"imgp\",\"group\":\"imgp\",\"title\":\"\\u7a7f\\u5b54\\u79fb\\u9664\\u4e2d<EFBFBD><EFBFBD>\\u4e8c\\u503c\\u5316\\u56fe\\u50cf\\u7684\\u9608\\u503c\",\"desc\":\"\\u7a7f\\u5b54\\u79fb\\u9664\\u7b97\\u6cd5\\u4e2d<EFBFBD><EFBFBD>\\u4e8c\\u503c\\u5316\\u56fe\\u50cf\\u65f6<EFBFBD><EFBFBD>\\u91c7\\u7528\\u7684\\u9608\\u503c\",\"ver\":1,\"pos\":141,\"type\":\"int\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":false,\"enabled\":true,\"size\":4,\"cur\":50,\"default\":50,\"range\":{\"min\":0,\"max\":255,\"step\":1}},\"is-crop\":{\"cat\":\"imgp\",\"group\":\"imgp\",\"title\":\"\\u56fe\\u7247\\u88c1\\u5207\",\"desc\":\"\\u5c06\\u56fe\\u7247\\u88c1\\u5207\\u5230\\u9002\\u5408\\u7eb8\\u5f20\\u7684\\u5927\\u5c0f<EFBFBD><EFBFBD>\\u6216\\u8005\\u7528\\u6237\\u81ea\\u5b9a\\u4e49\\u5927\\u5c0f\",\"ver\":1,\"pos\":300,\"type\":\"bool\",\"unit\":\"none\",\"affect\":2,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":true,\"default\":true},\"is-auto-crop\":{\"cat\":\"imgp\",\"group\":\"imgp\",\"title\":\"\\u81ea\\u52a8\\u88c1\\u5207\",\"desc\":\"\\u5c06\\u56fe\\u7247\\u88c1\\u5207\\u5230\\u9002\\u5408\\u5df2\\u77e5\\u7eb8\\u5f20<EFBFBD><EFBFBD>\\u5982A4<EFBFBD><EFBFBD>\\u7684\\u5927\\u5c0f\",\"ver\":1,\"pos\":301,\"type\":\"bool\",\"unit\":\"none\",\"affect\":2,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":true,\"default\":true,\"depend_or\":[\"is-crop==true\"]},\"is-erase-black-frame\":{\"cat\":\"imgp\",\"group\":\"imgp\",\"title\":\"\\u6d88\\u9664\\u9ed1\\u6846\",\"desc\":\"\\u6d88\\u9664\\u6587\\u7a3f\\u8303\\u56f4\\u5916\\u7684\\u9ed1\\u8272\\u80cc\\u666f\",\"ver\":1,\"pos\":320,\"type\":\"bool\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":true,\"default\":true},\"bkg-fill-mode\":{\"cat\":\"imgp\",\"group\":\"imgp\",\"title\":\"\\u80cc\\u666f\\u586b\\u5145\\u65b9\\u5f0f\",\"desc\":\"\\u9009\\u62e9\\u80cc\\u666f\\u586b\\u5145\\u65b9\\u5f0f\",\"ver\":1,\"pos\":321,\"type\":\"string\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":42,\"cur\":\"\\u51f8\\u591a\\u8fb9\\u5f62\",\"default\":\"\\u51f8\\u591a\\u8fb9\\u5f62\",\"range\":[\"\\u51f8\\u591a\\u8fb9\\u5f62\",\"\\u51f9\\u591a\\u8fb9\\u5f62\"],\"depend_or\":[\"is-erase-black-frame==true\"]},\"is-fill-color\":{\"cat\":\"imgp\",\"group\":\"imgp\",\"title\":\"\\u8272\\u5f69\\u586b\\u5145\",\"desc\":\"\\u542f\\u7528\\u540e\\u9ed1\\u6846\\u90e8\\u5206\\u5c06\\u586b\\u5145\\u4e3a\\u6587\\u7a3f\\u5e95\\u8272\",\"ver\":1,\"pos\":330,\"type\":\"bool\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":false,\"default\":false,\"depend_and\":[\"is-erase-black-frame==true\"]},\"bg-fill-color\":{\"cat\":\"imgp\",\"group\":\"imgp\",\"title\":\"\\u80cc\\u666f\\u586b\\u5145\\u989c\\u8272\",\"desc\":\"\\u8bbe\\u7f6e\\u7528\\u4e8e\\u80cc\\u666f\\u586b\\u5145\\u7684\\u989c\\u8272<EFBFBD><EFBFBD>-1\\u4e3a\\u81ea\\u52a8\\u989c\\u8272\\u586b\\u5145\",\"ver\":1,\"pos\":331,\"type\":\"int\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":false,\"size\":4,\"cur\":0,\"default\":0,\"depend_and\":[\"is-fill-color==true\"]},\"is-discard-blank\":{\"cat\":\"imgp\",\"group\":\"imgp\",\"title\":\"\\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\",\"desc\":\"\\u5982\\u679c\\u68c0\\u6d4b\\u5230\\u56fe\\u50cf\\u4e3a\\u7a7a\\u767d<EFBFBD><EFBFBD>\\u5219\\u4e22\\u5f03\",\"ver\":1,\"pos\":200,\"type\":\"bool\",\"unit\":\"none\",\"affect\":2,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":false,\"default\":false},\"discard-blank\":{\"cat\":\"imgp\",\"group\":\"imgp\",\"title\":\"\\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\u7c7b\\u578b\",\"desc\":\"\\u901a\\u7528\\u548c\\u53d1\\u7968<EFBFBD><EFBFBD>\\u5176\\u4e2d\\u4e4b\\u4e00\",\"ver\":1,\"pos\":201,\"type\":\"string\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":false,\"size\":36,\"cur\":\"\\u901a\\u7528\",\"default\":\"\\u901a\\u7528\",\"range\":[\"\\u901a\\u7528\",\"\\u53d1\\u7968\\u7eb8\"],\"depend_or\":[\"is-discard-blank==true\"]},\"blank-sensitivity\":{\"cat\":\"imgp\",\"group\":\"imgp\",\"title\":\"\\u8df3\\u8fc7\\u7a7a\\u767d\\u9875\\u7075\\u654f\\u5ea6\",\"desc\":\"\\u6570\\u503c\\u8d8a\\u5927<EFBFBD><EFBFBD>\\u5219\\u8d8a\\u5bb9\\u6613\\u8df3\\u8fc7\",\"ver\":1,\"pos\":202,\"type\":\"int\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":false,\"size\":4,\"cur\":50,\"default\":50,\"range\":{\"min\":1,\"max\":100,\"step\":1},\"depend_or\":[\"is-discard-blank==true\"]},\"blank-threshold\":{\"cat\":\"imgp\",\"group\":\"imgp\",\"title\":\"\\u8f6e\\u5ed3\\u9608\\u503c\",\"desc\":\"\\u8f6e\\u5ed3\\u9608\\u503c\",\"ver\":1,\"pos\":210,\"type\":\"int\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":false,\"enabled\":false,\"size\":4,\"cur\":40,\"default\":40,\"range\":{\"min\":1,\"max\":100,\"step\":1},\"depend_or\":[\"is-discard-blank==true\"]},\"blank-indent\":{\"cat\":\"imgp\",\"group\":\"imgp\",\"title\":\"\\u7a7a\\u767d\\u9875\\u8fb9\\u7f18\\u7f29\\u8fdb\",\"desc\":\"\\u7a7a\\u767d\\u9875\\u8fb9\\u7f18\\u7f29\\u8fdb\",\"ver\":1,\"pos\":211,\"type\":\"int\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":false,\"enabled\":false,\"size\":4,\"cur\":30,\"default\":30,\"range\":{\"min\":1,\"max\":100,\"step\":1},\"depend_or\":[\"is-discard-blank==true\"]},\"blank-bg-clr\":{\"cat\":\"imgp\",\"group\":\"imgp\",\"title\":\"\\u80cc\\u666f\\u8272\\u9608\\u503c\",\"desc\""
, ":\"\\u4f4e\\u4e8e\\u8be5\\u503c<EFBFBD><EFBFBD>\\u88ab\\u89c6\\u4f5c\\u80cc\\u666f\\u989c\\u8272\",\"ver\":1,\"pos\":212,\"type\":\"int\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":false,\"enabled\":false,\"size\":4,\"cur\":200,\"default\":200,\"range\":{\"min\":1,\"max\":255,\"step\":1},\"depend_or\":[\"is-discard-blank==true\"]},\"blank-noise\":{\"cat\":\"imgp\",\"group\":\"imgp\",\"title\":\"\\u7eb8\\u5f20\\u6742\\u70b9\",\"desc\":\"\\u5ffd\\u7565\\u7eb8\\u5f20\\u6742\\u70b9<EFBFBD><EFBFBD><EFBFBD><EFBFBD>1\\u65f6\\u4e0d\\u751f\\u6548<EFBFBD><EFBFBD>\\u503c\\u8d8a\\u5927\\u8d8a\\u5bb9\\u6613\\u5ffd\\u7565\\u6742\\u70b9\",\"ver\":1,\"pos\":213,\"type\":\"int\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":false,\"enabled\":false,\"size\":4,\"cur\":11,\"default\":11,\"range\":{\"min\":1,\"max\":100,\"step\":1},\"depend_or\":[\"is-discard-blank==true\"]},\"mode\":{\"cat\":\"imgp\",\"group\":\"base\",\"title\":\"\\u989c\\u8272\\u6a21\\u5f0f\",\"desc\":\"\\u9009\\u62e9\\u8272\\u5f69\\u6a21\\u5f0f\",\"ver\":1,\"pos\":500,\"type\":\"string\",\"unit\":\"none\",\"affect\":6,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":54,\"cur\":\"24\\u4f4d\\u5f69\\u8272\",\"default\":\"24\\u4f4d\\u5f69\\u8272\",\"range\":[\"24\\u4f4d\\u5f69\\u8272\",\"256\\u7ea7\\u7070\\u5ea6\",\"\\u9ed1\\u767d\",\"\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"]},\"color-correct\":{\"cat\":\"imgp\",\"group\":\"imgp\",\"title\":\"\\u989c\\u8272\\u6821\\u6b63\",\"desc\":\"\\u6821\\u6b63\\u7531\\u4e8e\\u786c\\u4ef6\\u7279\\u6027\\u4ea7\\u751f\\u7684\\u8272\\u504f<EFBFBD><EFBFBD>\\u4f7f\\u56fe\\u7247\\u989c\\u8272\\u66f4\\u63a5\\u8fd1\\u771f\\u5b9e\",\"ver\":1,\"pos\":400,\"type\":\"string\",\"unit\":\"none\",\"affect\":0,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":42,\"cur\":\"\\u666e\\u901a\\u6a21\\u5f0f\",\"default\":\"\\u666e\\u901a\\u6a21\\u5f0f\",\"range\":[\"\\u4e0d\\u6821\\u6b63\",\"\\u666e\\u901a\\u6a21\\u5f0f\",\"\\u589e\\u5f3a\\u6a21\\u5f0f\"]},\"resolution\":{\"cat\":\"imgp\",\"group\":\"base\",\"title\":\"\\u5206\\u8fa8\\u7387\",\"desc\":\"\\u8bbe\\u7f6e\\u626b\\u63cf\\u56fe\\u50cf\\u7684\\u5206\\u8fa8\\u7387\",\"ver\":1,\"pos\":200,\"type\":\"int\",\"unit\":\"dpi\",\"affect\":6,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":200,\"default\":200,\"range\":{\"min\":100,\"max\":600,\"step\":50}},\"img-format\":{\"cat\":\"Common\",\"group\":\"output\",\"title\":\"\\u56fe\\u7247\\u683c\\u5f0f\",\"desc\":\"\\u8bbe\\u5907\\u8f93\\u51fa\\u7684\\u56fe\\u7247\\u6587\\u4ef6\\u683c\\u5f0f\",\"ver\":1,\"pos\":0,\"type\":\"string\",\"unit\":\"none\",\"affect\":2,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":42,\"cur\":\"JPEG\",\"default\":\"JPEG\",\"range\":[\"JPEG\",\"PNG\",\"TIFF\",\"BMP\"]},\"jpeg-quality\":{\"cat\":\"Common\",\"group\":\"output\",\"title\":\"JPEG\\u8d28\\u91cf\",\"desc\":\"\\u8bbe\\u7f6eJPEG\\u538b\\u7f29\\u8d28\\u91cf<EFBFBD><EFBFBD>\\u8d28\\u91cf\\u8d8a\\u9ad8<EFBFBD><EFBFBD>\\u538b\\u7f29\\u7387\\u8d8a\\u4f4e\",\"ver\":1,\"pos\":0,\"type\":\"int\",\"unit\":\"%\",\"affect\":4,\"readonly\":false,\"visible\":true,\"enabled\":true,\"size\":4,\"cur\":100,\"default\":100,\"range\":{\"min\":10,\"max\":100,\"step\":1},\"depend_or\":[\"img-format==JPEG\"]}}"
};
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// known name ...
#include "../../../../code_device/sdk/base/huagaoxxx_warraper_ex.h"
#include "opt_ui/DlgSetting.h"
#include "../../../../code_device/hgsane/sane_opt/sane_opts.h"
#include "../../../../code_device/sdk/sane_opt_json/device_opt.h"
namespace known_name
{
struct
{
std::wstring name;
std::wstring title;
}
g_cats[] = { {L"imgp", L"\u56FE\u50CF\u5904\u7406"}};
static std::wstring group_name(const wchar_t* grp_title)
{
std::string utf8(local_trans::u2a(grp_title, CP_UTF8));
return local_trans::a2u(device_option::trans_group(utf8.c_str(), false).c_str(), CP_UTF8);
}
static std::wstring group_title(const wchar_t* grp_name)
{
std::string utf8(local_trans::u2a(grp_name, CP_UTF8));
return local_trans::a2u(device_option::trans_group(utf8.c_str(), true).c_str(), CP_UTF8);
}
static std::wstring category_name(const wchar_t* cat_title)
{
for (auto& v : g_cats)
{
if (v.title == cat_title)
return v.name;
}
return cat_title;
}
static std::wstring category_title(const wchar_t* cat_name)
{
if (wcscmp(cat_name, L"imgproc") == 0)
cat_name = L"imgp";
for (auto& v : g_cats)
{
if (v.name == cat_name)
return v.title;
}
return cat_name;
}
// <20>ɼ<EFBFBD><C9BC>ɷ<EFBFBD><C9B7><EFBFBD>;<3B><><EFBFBD>ɷ<EFBFBD><C9B7><EFBFBD>;<3B><><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD>ɷ<EFBFBD><C9B7><EFBFBD>;<3B><EFBFBD><E8B1B8>֧<EFBFBD><D6A7>;
struct
{
std::wstring title;
int visible;
}g_visible[] = { {L"\u53EF\u89C1\u53EF\u8BBF\u95EE", OPT_VISIBLE_ALL}
, {L"\u4EC5\u53EF\u8BBF\u95EE", OPT_VISIBLE_ACCESS}
, {L"\u4E0D\u53EF\u89C1\u4E0D\u53EF\u8BBF\u95EE", OPT_VISIBLE_HIDE}
, {L"\u8BBE\u5907\u4E0D\u652F\u6301", OPT_VISIBLE_NOT_SUPPORT}
};
static std::wstring visible_title(int visb)
{
for (auto& v : g_visible)
{
if (v.visible == visb)
return v.title;
}
return g_visible[0].title;
}
static int visible_type(const wchar_t* title)
{
for (auto& v : g_visible)
{
if (v.title == title)
return v.visible;
}
return OPT_VISIBLE_ALL;
}
#define NAME_WITH_FIX_ID(id) { SANE_STD_OPT_NAME_##id, SANE_OPT_ID_##id }
struct
{
std::string name;
int fix_id;
}g_fix_ids[] = {
NAME_WITH_FIX_ID(IS_MULTI_OUT),
NAME_WITH_FIX_ID(MULTI_OUT_TYPE),
NAME_WITH_FIX_ID(COLOR_MODE),
NAME_WITH_FIX_ID(FILTER),
NAME_WITH_FIX_ID(RID_MULTIOUT_RED),
NAME_WITH_FIX_ID(RID_ANSWER_SHEET_RED),
NAME_WITH_FIX_ID(ERASE_BACKGROUND),
NAME_WITH_FIX_ID(BKG_COLOR_RANGE),
NAME_WITH_FIX_ID(SHARPEN),
NAME_WITH_FIX_ID(RID_MORR),
NAME_WITH_FIX_ID(RID_GRID),
NAME_WITH_FIX_ID(ERROR_EXTENSION),
NAME_WITH_FIX_ID(NOISE_OPTIMIZE),
NAME_WITH_FIX_ID(NOISE_SIZE),
NAME_WITH_FIX_ID(PAPER),
NAME_WITH_FIX_ID(CUSTOM_AREA),
NAME_WITH_FIX_ID(CUSTOM_AREA_LEFT),
NAME_WITH_FIX_ID(CUSTOM_AREA_RIGHT),
NAME_WITH_FIX_ID(CUSTOM_AREA_TOP),
NAME_WITH_FIX_ID(CUSTOM_AREA_BOTTOM),
NAME_WITH_FIX_ID(SIZE_CHECK),
NAME_WITH_FIX_ID(PAGE),
NAME_WITH_FIX_ID(DISCARD_BLANK_SENS),
NAME_WITH_FIX_ID(RESOLUTION),
NAME_WITH_FIX_ID(IMAGE_QUALITY),
NAME_WITH_FIX_ID(EXCHANGE),
NAME_WITH_FIX_ID(SPLIT),
NAME_WITH_FIX_ID(ANTI_SKEW),
NAME_WITH_FIX_ID(IS_CUSTOM_GAMMA),
NAME_WITH_FIX_ID(BRIGHTNESS),
NAME_WITH_FIX_ID(CONTRAST),
NAME_WITH_FIX_ID(GAMMA),
NAME_WITH_FIX_ID(ERASE_BLACK_FRAME),
NAME_WITH_FIX_ID(DARK_SAMPLE),
NAME_WITH_FIX_ID(THRESHOLD),
NAME_WITH_FIX_ID(ANTI_NOISE_LEVEL),
NAME_WITH_FIX_ID(MARGIN),
NAME_WITH_FIX_ID(FILL_BKG_MODE),
NAME_WITH_FIX_ID(IS_ANTI_PERMEATE),
NAME_WITH_FIX_ID(ANTI_PERMEATE_LEVEL),
NAME_WITH_FIX_ID(RID_HOLE),
NAME_WITH_FIX_ID(SEARCH_HOLE_RANGE),
NAME_WITH_FIX_ID(IS_FILL_COLOR),
NAME_WITH_FIX_ID(IS_ULTROSONIC_CHECK),
NAME_WITH_FIX_ID(IS_CHECK_STAPLE),
NAME_WITH_FIX_ID(SCAN_MODE),
NAME_WITH_FIX_ID(SCAN_COUNT),
NAME_WITH_FIX_ID(TEXT_DIRECTION),
NAME_WITH_FIX_ID(IS_ROTATE_BKG_180),
NAME_WITH_FIX_ID(IS_CHECK_DOG_EAR),
NAME_WITH_FIX_ID(DOG_EAR_SIZE),
NAME_WITH_FIX_ID(IS_CHECK_ASKEW),
NAME_WITH_FIX_ID(ASKEW_RANGE),
NAME_WITH_FIX_ID(BINARY_THRESHOLD),
NAME_WITH_FIX_ID(IS_PHOTO_MODE),
NAME_WITH_FIX_ID(DOUBLE_FEED_HANDLE),
NAME_WITH_FIX_ID(WAIT_TO_SCAN),
NAME_WITH_FIX_ID(FEED_STRENGTH),
NAME_WITH_FIX_ID(TIME_TO_SLEEP),
NAME_WITH_FIX_ID(IS_AUTO_FEED_STRENGTH),
NAME_WITH_FIX_ID(FEED_STRENGTH_VALUE),
NAME_WITH_FIX_ID(REVERSE_01),
NAME_WITH_FIX_ID(RID_HOLE_L),
NAME_WITH_FIX_ID(SEARCH_HOLE_RANGE_L),
NAME_WITH_FIX_ID(RID_HOLE_R),
NAME_WITH_FIX_ID(SEARCH_HOLE_RANGE_R),
NAME_WITH_FIX_ID(RID_HOLE_T),
NAME_WITH_FIX_ID(SEARCH_HOLE_RANGE_T),
NAME_WITH_FIX_ID(RID_HOLE_B),
NAME_WITH_FIX_ID(SEARCH_HOLE_RANGE_B),
NAME_WITH_FIX_ID(FOLD_TYPE),
NAME_WITH_FIX_ID(COLOR_CORRECTION),
NAME_WITH_FIX_ID(HISTORY_COUNT),
NAME_WITH_FIX_ID(DRIVER_VERSION),
NAME_WITH_FIX_ID(MANUFACTURER),
NAME_WITH_FIX_ID(COPYRIGHT),
NAME_WITH_FIX_ID(CO_URL),
NAME_WITH_FIX_ID(CO_TEL),
NAME_WITH_FIX_ID(CO_ADDR),
NAME_WITH_FIX_ID(CO_GPS),
NAME_WITH_FIX_ID(HELP),
NAME_WITH_FIX_ID(VID),
NAME_WITH_FIX_ID(PID),
NAME_WITH_FIX_ID(DEV_NAME),
NAME_WITH_FIX_ID(DEV_FAMILY),
NAME_WITH_FIX_ID(DEVICE_SERIAL_NO),
NAME_WITH_FIX_ID(FIRMWARE_VERSION),
NAME_WITH_FIX_ID(DEVICE_IP_ADDR),
NAME_WITH_FIX_ID(DEVICE_MAC_ADDR),
NAME_WITH_FIX_ID(CUSTOM_GAMMA),
NAME_WITH_FIX_ID(ROLLER_LIFE),
NAME_WITH_FIX_ID(LANGUAGE),
NAME_WITH_FIX_ID(MOTOR_VER),
NAME_WITH_FIX_ID(TRANSFORM_IMAGE_FORMAT),
NAME_WITH_FIX_ID(FREE_BUFFER),
NAME_WITH_FIX_ID(PAPER_ON),
NAME_WITH_FIX_ID(PAPER_W),
NAME_WITH_FIX_ID(PAPER_H),
NAME_WITH_FIX_ID(GRAY_GAMMA),
NAME_WITH_FIX_ID(COLOR_GAMMA),
NAME_WITH_FIX_ID(RED_GAMMA),
NAME_WITH_FIX_ID(GREEN_GAMMA),
NAME_WITH_FIX_ID(BLUE_GAMMA),
NAME_WITH_FIX_ID(INITIAL_BOOT_TIME),
NAME_WITH_FIX_ID(DISCARDBLANK),
NAME_WITH_FIX_ID(LOGIN),
NAME_WITH_FIX_ID(LOGOUT),
NAME_WITH_FIX_ID(ROLLER_COUNT),
NAME_WITH_FIX_ID(DRIVER_LOG),
NAME_WITH_FIX_ID(DEVICE_LOG),
NAME_WITH_FIX_ID(WAIT_SCAN_EXIT),
NAME_WITH_FIX_ID(RESTORE)
};
static int name_to_fix_id(const wchar_t* name)
{
std::string asc("");
coding_util::unicode_2_ansi(name, coding::get_string, &asc);
for (auto& v : g_fix_ids)
if (v.name == asc)
return v.fix_id;
return 0;
}
static std::string name_from_fix_id(int id)
{
for (auto& v : g_fix_ids)
{
if (v.fix_id == id)
return v.name;
}
return "";
}
static void erase_trans_letter(std::wstring& str)
{
size_t splash = str.find(L"\\\\");
while (splash != std::wstring::npos)
{
str.erase(splash++, 1);
splash = str.find(L"\\\\", splash);
}
splash = str.find(L"\\\"");
while (splash != std::wstring::npos)
{
str.erase(splash++, 1);
splash = str.find(L"\\\"", splash);
}
}
static bool is_sane_name(std::string& str)
{
return str[0] >= 'a' && str[0] <= 'z' && str.length() == lstrlenA(str.c_str());
}
static bool is_sane_name(std::wstring& str)
{
return str[0] >= L'a' && str[0] <= L'z' && str.length() == lstrlenW(str.c_str());
}
// <20><>ͨȨ<CDA8><C8A8>;<3B><><EFBFBD><EFBFBD>Ա;<3B><><EFBFBD><EFBFBD>֧<EFBFBD><D6A7>;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
struct
{
std::wstring title;
int auth;
}
g_auth[] = { {L"\u666E\u901A\u6743\u9650", USER_PRIVILEGE_COMMON}
, {L"\u7BA1\u7406\u5458", USER_PRIVILEGE_LOCAL_MGR}
, {L"\u6280\u672F\u652F\u6301", USER_PRIVILEGE_TECH_SUPPORTING}
, {L"\u5F00\u53D1\u8005", USER_PRIVILEGE_DEVLOPER}
};
static std::wstring auth_to_title(int auth)
{
for (auto& v : g_auth)
{
if (v.auth == auth)
return v.title;
}
return g_auth[0].title;
}
static int auth_from_title(const wchar_t* title)
{
for (auto& v : g_auth)
{
if (v.title == title)
return v.auth;
}
return g_auth[0].auth;
}
};
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// CDlgOptJson dialog
IMPLEMENT_DYNAMIC(CDlgOptJson, CDialogEx)
CDlgOptJson::CDlgOptJson(CWnd* pParent /*=NULL*/)
: CDialogEx(CDlgOptJson::IDD, pParent), tooltips_(NULL)
{
//_CrtSetBreakAlloc(12295);
std::string crash("");
gb_json* jsn = new gb_json();
for (auto& v : crash_json)
crash += v;
jsn->attach_text(&crash[0]);
jsn->release();
}
CDlgOptJson::~CDlgOptJson()
{
delete_from_tree();
lang_initialize((void*)0xde1e);
delete tooltips_;
clear_visible();
}
known_file_util::IJsonW* CDlgOptJson::SANEOPT::to_json(void)
{
known_file_util::IJsonW* jsn = known_file_util::create_jsonW(), *dep = NULL;
int nv = 0;
jsn->set_key(name.c_str());
jsn->set_value(L"cat", known_name::category_name(category.c_str()).c_str());
jsn->set_value(L"group", known_name::group_name(group.c_str()).c_str());
jsn->set_value(L"title", title.c_str());
jsn->set_value(L"desc", desc.c_str());
jsn->set_value(L"type", type.c_str());
if(ver > 0)
jsn->set_value(L"ver", ver);
if(pos > 0)
jsn->set_value(L"pos", pos);
if(fix_id > SANE_OPT_ID_BASE)
jsn->set_value(L"fix-id", fix_id);
jsn->set_value(L"ui-pos", ui_pos);
jsn->set_value(L"auth", auth);
SANEOPT::affect_str(nv, affect, false);
if(nv)
jsn->set_value(L"affect", nv);
if(unit != L"none")
jsn->set_value(L"unit", unit.c_str());
if(readonly)
jsn->set_value(L"readonly", readonly);
if (visible.size())
{
if(visible.size() == 1 && visible[0].cond.empty())
jsn->set_value(L"visible", *(int*)visible[0].val.c_str());
else
{
known_file_util::IJsonW* child = known_file_util::create_jsonW();
for (auto& v : visible)
{
if (v.cond.empty())
child->set_value(L"default", *(int*)v.val.c_str());
else
child->set_value(local_trans::a2u(v.cond.c_str(), CP_UTF8).c_str(), *(int*)v.val.c_str());
}
jsn->set_value(L"visible", child);
}
}
if(!enable)
jsn->set_value(L"enabled", enable);
jsn->set_value(L"size", size);
if (!auto_restore_default)
jsn->set_value(L"auto", auto_restore_default);
if (own_read)
jsn->set_value(L"ownread", own_read);
if (type == L"bool")
{
if (def_val.size() == 1)
{
jsn->set_value(L"cur", *(bool*)def_val[0].val.c_str());
jsn->set_value(L"default", *(bool*)def_val[0].val.c_str());
}
else if (def_val.size() > 1)
{
known_file_util::IJsonW* def = known_file_util::create_jsonW();
for (auto& v : def_val)
{
if (v.cond.empty())
{
def->set_value(L"default", *(bool*)v.val.c_str());
jsn->set_value(L"cur", *(bool*)v.val.c_str());
}
else
def->set_value(local_trans::a2u(v.cond.c_str(), CP_UTF8).c_str(), *(bool*)v.val.c_str());
}
jsn->set_value(L"default", def);
def->release();
}
}
else if (type == L"int")
{
known_file_util::IJsonW* rng = NULL;
if (def_val.size() == 1)
{
jsn->set_value(L"cur", *(int*)def_val[0].val.c_str());
jsn->set_value(L"default", *(int*)def_val[0].val.c_str());
}
else if (def_val.size() > 1)
{
known_file_util::IJsonW* def = known_file_util::create_jsonW();
for (auto& v : def_val)
{
if (v.cond.empty())
{
def->set_value(L"default", *(int*)v.val.c_str());
jsn->set_value(L"cur", *(int*)v.val.c_str());
}
else
def->set_value(local_trans::a2u(v.cond.c_str(), CP_UTF8).c_str(), *(int*)v.val.c_str());
}
jsn->set_value(L"default", def);
def->release();
}
if (range_type == L"list")
{
rng = known_file_util::create_jsonW();
rng->set_as_array(true);
for (auto& v : range)
{
if(v.cond.empty())
*rng += *(int*)v.val.c_str();
else
{
known_file_util::IJsonW* condv = known_file_util::create_jsonW();
condv->set_value(local_trans::a2u(v.cond.c_str(), CP_UTF8).c_str(), *(int*)v.val.c_str());
*rng += condv;
condv->release();
}
}
}
else if (range_type == L"range" && range.size() >= 3)
{
std::vector<CONDVAL> l, u, s, * n, * na[] = {&l, &u, &s};
std::wstring key[] = { L"min", L"max", L"step" };
for (auto& v : range)
{
CONDVAL val(v);
size_t pos = val.cond.find("min:");
if (pos != std::string::npos)
{
val.cond.erase(0, 4);
l.push_back(val);
}
else
{
pos = val.cond.find("max:");
if (pos != std::string::npos)
{
val.cond.erase(0, 4);
u.push_back(val);
}
else
{
pos = val.cond.find("step:");
if (pos != std::string::npos)
{
val.cond.erase(0, 5);
s.push_back(val);
}
}
}
}
rng = known_file_util::create_jsonW();
for (int i = 0; i < _countof(na); ++i)
{
n = na[i];
if (n->size() == 1)
{
if(known_name::is_sane_name((*n)[0].val))
rng->set_value(key[i].c_str(), local_trans::a2u((*n)[0].val.c_str(), CP_UTF8).c_str());
else
rng->set_value(key[i].c_str(), *(int*)&(*n)[0].val[0]);
}
else if (n->size() > 1)
{
known_file_util::IJsonW* lower = known_file_util::create_jsonW();
for (auto& v : *n)
{
if (v.cond.empty())
{
if(known_name::is_sane_name(v.val))
lower->set_value(L"default", local_trans::a2u(v.val.c_str(), CP_UTF8).c_str());
else
lower->set_value(L"default", *(int*)&v.val[0]);
}
else
{
if(known_name::is_sane_name(v.val))
lower->set_value(local_trans::a2u(v.cond.c_str(), CP_UTF8).c_str(), local_trans::a2u(v.val.c_str(), CP_UTF8).c_str());
else
lower->set_value(local_trans::a2u(v.cond.c_str(), CP_UTF8).c_str(), *(int*)&v.val[0]);
}
}
rng->set_value(key[i].c_str(), lower);
lower->release();
}
}
}
if (rng)
{
jsn->set_value(L"range", rng);
rng->release();
}
}
else if (type == L"float")
{
known_file_util::IJsonW* rng = NULL;
//jsn->set_value(L"size", (int)sizeof(double));
if (def_val.size() == 1)
{
jsn->set_value(L"cur", *(double*)def_val[0].val.c_str());
jsn->set_value(L"default", *(double*)def_val[0].val.c_str());
}
else if (def_val.size() > 1)
{
known_file_util::IJsonW* def = known_file_util::create_jsonW();
for (auto& v : def_val)
{
if (v.cond.empty())
{
def->set_value(L"default", *(double*)v.val.c_str());
jsn->set_value(L"cur", *(double*)v.val.c_str());
}
else
def->set_value(local_trans::a2u(v.cond.c_str(), CP_UTF8).c_str(), *(double*)v.val.c_str());
}
jsn->set_value(L"default", def);
def->release();
}
if (range_type == L"list")
{
rng = known_file_util::create_jsonW();
rng->set_as_array(true);
for (auto& v : range)
{
if(v.cond.empty())
*rng += *(double*)v.val.c_str();
else
{
known_file_util::IJsonW* condv = known_file_util::create_jsonW();
condv->set_value(local_trans::a2u(v.cond.c_str(), CP_UTF8).c_str(), *(double*)v.val.c_str());
*rng += condv;
condv->release();
}
}
}
else if (range_type == L"range" && range.size() >= 3)
{
std::vector<CONDVAL> l, u, s, * n, * na[] = { &l, &u, &s };
std::wstring key[] = { L"min", L"max", L"step" };
for (auto& v : range)
{
CONDVAL val(v);
size_t pos = val.cond.find("min:");
if (pos != std::string::npos)
{
val.cond.erase(0, 4);
l.push_back(val);
}
else
{
pos = val.cond.find("max:");
if (pos != std::string::npos)
{
val.cond.erase(0, 4);
u.push_back(val);
}
else
{
pos = val.cond.find("step:");
if (pos != std::string::npos)
{
val.cond.erase(0, 5);
s.push_back(val);
}
}
}
}
rng = known_file_util::create_jsonW();
for (int i = 0; i < _countof(na); ++i)
{
n = na[i];
if (n->size() == 1)
{
if (known_name::is_sane_name((*n)[0].val))
rng->set_value(key[i].c_str(), local_trans::a2u((*n)[0].val.c_str(), CP_UTF8).c_str());
else
rng->set_value(key[i].c_str(), *(double*)&(*n)[0].val[0]);
}
else if (n->size() > 1)
{
known_file_util::IJsonW* lower = known_file_util::create_jsonW();
for (auto& v : *n)
{
if (v.cond.empty())
{
if (known_name::is_sane_name(v.val))
lower->set_value(L"default", local_trans::a2u(v.val.c_str(), CP_UTF8).c_str());
else
lower->set_value(L"default", *(double*)&v.val[0]);
}
else
{
if (known_name::is_sane_name(v.val))
lower->set_value(local_trans::a2u(v.cond.c_str(), CP_UTF8).c_str(), local_trans::a2u(v.val.c_str(), CP_UTF8).c_str());
else
lower->set_value(local_trans::a2u(v.cond.c_str(), CP_UTF8).c_str(), *(double*)&v.val[0]);
}
}
rng->set_value(key[i].c_str(), lower);
lower->release();
}
}
}
if (rng)
{
jsn->set_value(L"range", rng);
rng->release();
}
}
else if (type == L"string")
{
int len = 0;
if (def_val.size() == 1)
{
jsn->set_value(L"cur", (const wchar_t*)def_val[0].val.c_str());
jsn->set_value(L"default", (const wchar_t*)def_val[0].val.c_str());
if (len < def_val[0].val.length())
len = def_val[0].val.length();
}
else if (def_val.size() > 1)
{
known_file_util::IJsonW* def = known_file_util::create_jsonW();
for (auto& v : def_val)
{
if (v.cond.empty())
{
def->set_value(L"default", (const wchar_t*)v.val.c_str());
jsn->set_value(L"cur", (const wchar_t*)v.val.c_str());
}
else
def->set_value(local_trans::a2u(v.cond.c_str(), CP_UTF8).c_str(), (const wchar_t*)v.val.c_str());
if (len < v.val.length())
len = v.val.length();
}
jsn->set_value(L"default", def);
def->release();
}
if (range.size())
{
known_file_util::IJsonW* rng = known_file_util::create_jsonW();
rng->set_as_array(true);
for (auto& v : range)
{
if(v.cond.empty())
*rng += (const wchar_t*)v.val.c_str();
else
{
known_file_util::IJsonW* condv = known_file_util::create_jsonW();
condv->set_value(local_trans::a2u(v.cond.c_str(), CP_UTF8).c_str(), (const wchar_t*)v.val.c_str());
*rng += condv;
condv->release();
}
if (len < v.val.length())
len = v.val.length();
}
jsn->set_value(L"range", rng);
rng->release();
}
len += 4;
len *= 3;
//jsn->set_value(L"size", len);
}
if (!depend.empty())
{
std::wstring trans(L"");
//for (auto& v : depend)
//{
// wchar_t buf[20] = { 0 };
// if ((WORD)v > 0x7f)
// swprintf_s(buf, _countof(buf) - 1, L"\\u%04X", (WORD)v);
// else
// buf[0] = v;
// trans += buf;
//}
jsn->set_value(L"depend", depend.c_str());
}
return jsn;
}
bool CDlgOptJson::SANEOPT::from_json(known_file_util::IJsonW* jsn)
{
bool ret = true;
const wchar_t* strv = NULL;
known_file_util::IJsonW* child = NULL;
SANEOPT::init(this);
name = jsn->key() ? jsn->key() : L"";
if (jsn->get_value(L"title", &strv) && strv)
title = strv;
if (jsn->get_value(L"desc", &strv) && strv)
desc = strv;
if (jsn->get_value(L"group", &strv) && strv)
{
std::wstring str(strv);
group = known_name::group_title(str.c_str());
}
if (jsn->get_value(L"cat", &strv) && strv)
category = known_name::category_title(strv);
else if(jsn->get_value(L"field", &strv) && strv)
category = known_name::category_title(strv);
if (jsn->get_value(L"unit", &strv) && strv)
unit = strv;
std::transform(unit.begin(), unit.end(), unit.begin(), tolower);
if (jsn->get_value(L"type", &strv) && strv)
type = strv;
std::transform(type.begin(), type.end(), type.begin(), tolower);
jsn->get_value(L"size", size);
if (!jsn->get_value(L"auth", auth))
auth = USER_PRIVILEGE_COMMON;
if (!jsn->get_value(L"ui-pos", ui_pos))
ui_pos = -1;
if (type == L"bool")
{
bool v = false;
known_file_util::IJsonW* child = NULL;
CONDVAL cv;
if (jsn->get_value(L"default", &child) && child)
{
known_file_util::JSONMEMW m = child->first_member();
while (m.type != known_file_util::JV_UNKNOWN)
{
//if (wcscmp(m.key, L"default") == 0)
// cv.cond = "";
//else
cv.cond = local_trans::u2a(m.key, CP_UTF8);
cv.val = std::string((char*)&m.bool_val, sizeof(m.bool_val));
m = child->next_member();
}
child->release();
}
else
{
if (!jsn->get_value(L"default", v))
jsn->get_value(L"cur", v);
cv.val = std::string((char*)&v, sizeof(v));
cv.cond = "default";
def_val.push_back(cv);
}
}
else if(type == L"int")
{
int v = 0;
known_file_util::IJsonW* child = NULL;
CONDVAL cv;
if (jsn->get_value(L"default", &child) && child)
{
known_file_util::JSONMEMW m = child->first_member();
while (m.type != known_file_util::JV_UNKNOWN)
{
//if (wcscmp(m.key, L"default") == 0)
// cv.cond = "";
//else
cv.cond = local_trans::u2a(m.key, CP_UTF8);
if(m.type == known_file_util::JV_UINT64)
cv.val = std::string((char*)&m.uint64_val, sizeof(m.uint64_val));
else
cv.val = std::string((char*)&m.int_val, sizeof(m.int_val));
m = child->next_member();
}
child->release();
}
else if (!jsn->get_value(L"default", v))
{
// try uint64 ...
unsigned long long n64 = 0;
if(jsn->get_value(L"default", n64) || jsn->get_value(L"cur", n64))
{
cv.cond = "default";
cv.val = std::string((char*)&n64, sizeof(n64));
def_val.push_back(cv);
}
}
else
{
cv.cond = "default";
cv.val = std::string((char*)&v, sizeof(v));
def_val.push_back(cv);
}
}
else if(type == L"float")
{
double v = false;
known_file_util::IJsonW* child = NULL;
CONDVAL cv;
if (jsn->get_value(L"default", &child) && child)
{
known_file_util::JSONMEMW m = child->first_member();
while (m.type != known_file_util::JV_UNKNOWN)
{
//if (wcscmp(m.key, L"default") == 0)
// cv.cond = "";
//else
cv.cond = local_trans::u2a(m.key, CP_UTF8);
cv.val = std::string((char*)&m.double_val, sizeof(m.double_val));
m = child->next_member();
}
child->release();
}
else
{
if (!jsn->get_value(L"default", v))
jsn->get_value(L"cur", v);
cv.val = std::string((char*)&v, sizeof(v));
cv.cond = "default";
def_val.push_back(cv);
}
}
else if(type == L"string")
{
strv = NULL;
known_file_util::IJsonW* child = NULL;
CONDVAL cv;
if (jsn->get_value(L"default", &child) && child)
{
known_file_util::JSONMEMW m = child->first_member();
while (m.type != known_file_util::JV_UNKNOWN)
{
//if (wcscmp(m.key, L"default") == 0)
// cv.cond = "";
//else
cv.cond = local_trans::u2a(m.key, CP_UTF8);
cv.val = std::string((const char*)m.str_val, lstrlenW(m.str_val) * 2 + 2);
m = child->next_member();
}
child->release();
}
else
{
if (!jsn->get_value(L"default", &strv))
jsn->get_value(L"cur", &strv);
if(strv)
cv.val = std::string((const char*)strv, lstrlenW(strv) * 2 + 2);
cv.cond = "default";
def_val.push_back(cv);
}
}
jsn->get_value(L"affect", ver);
SANEOPT::affect_str(ver, affect, true);
jsn->get_value(L"ver", ver);
jsn->get_value(L"pos", pos);
if (!jsn->get_value(L"readonly", readonly))
readonly = false;
if (!jsn->get_value(L"ownread", own_read))
own_read = false;
int nv = OPT_VISIBLE_ALL;
bool bv = true;
if (jsn->get_value(L"visible", bv))
{
CONDVAL cv;
cv.cond = "";
nv = bv ? OPT_VISIBLE_ALL : OPT_VISIBLE_HIDE;
cv.val = std::string((char*)&nv, sizeof(nv));
visible.push_back(cv);
}
else if (jsn->get_value(L"visible", nv))
{
CONDVAL cv;
cv.cond = "";
cv.val = std::string((char*)&nv, sizeof(nv));
visible.push_back(cv);
}
else if (jsn->get_value(L"visible", &child) && child)
{
known_file_util::JSONMEMW jm = child->first_member();
while (jm.type != known_file_util::JV_UNKNOWN)
{
CONDVAL cv;
cv.cond = local_trans::u2a(jm.key, CP_UTF8);
cv.val = std::string((char*)&jm.int_val, sizeof(jm.int_val));
visible.push_back(cv);
jm = child->next_member();
}
child->release();
child = nullptr;
}
if (!jsn->get_value(L"enabled", enable))
enable = true;
if (!jsn->get_value(L"fix-id", fix_id) && !name.empty())
{
fix_id = known_name::name_to_fix_id(name.c_str());
}
if (!jsn->get_value(L"auto", auto_restore_default))
auto_restore_default = true;
if (jsn->get_value(L"range", &child) && child)
{
const wchar_t* str_range = NULL;
if (type == L"int")
{
int nv = 0;
known_file_util::IJsonW* son = NULL;
if (child->get_value(L"min", nv) || child->get_value(L"min", &son) || child->get_value(L"min", &str_range))
{
range_type = L"range";
if (son)
{
known_file_util::JSONMEMW son1 = son->first_member();
while (son1.type != known_file_util::JV_UNKNOWN)
{
CONDVAL v;
v.cond = local_trans::u2a(son1.key, CP_UTF8);
if (v.cond == "default")
v.cond = "";
v.cond.insert(0, "min:");
if (son1.type == known_file_util::JV_STRING)
v.val = local_trans::u2a(son1.str_val, CP_UTF8);
else
v.val = std::string((char*)&son1.int_val, sizeof(son1.int_val));
range.push_back(v);
son1 = son->next_member();
}
son->release();
}
else
{
CONDVAL v;
v.val = str_range ? local_trans::u2a(str_range, CP_UTF8) : std::string((char*)&nv, sizeof(nv));
v.cond.insert(0, "min:");
range.push_back(v);
}
str_range = NULL;
if (child->get_value(L"max", nv) || child->get_value(L"max", &str_range))
{
CONDVAL v;
v.val = str_range ? local_trans::u2a(str_range, CP_UTF8) : std::string((char*)&nv, sizeof(nv));
v.cond.insert(0, "max:");
range.push_back(v);
}
else if (child->get_value(L"max", &son) && son)
{
known_file_util::JSONMEMW son1 = son->first_member();
while (son1.type != known_file_util::JV_UNKNOWN)
{
CONDVAL v;
v.cond = local_trans::u2a(son1.key, CP_UTF8);
if (v.cond == "default")
v.cond = "";
if (son1.type == known_file_util::JV_STRING)
v.val = local_trans::u2a(son1.str_val, CP_UTF8);
else
v.val = std::string((char*)&son1.int_val, sizeof(son1.int_val));
v.cond.insert(0, "max:");
range.push_back(v);
son1 = son->next_member();
}
son->release();
}
str_range = NULL;
if (child->get_value(L"step", nv) || child->get_value(L"step", &str_range))
{
CONDVAL v;
v.val = str_range ? local_trans::u2a(str_range, CP_UTF8) : std::string((char*)&nv, sizeof(nv));
v.cond.insert(0, "step:");
range.push_back(v);
}
else if (child->get_value(L"step", &son) && son)
{
known_file_util::JSONMEMW son1 = son->first_member();
while (son1.type != known_file_util::JV_UNKNOWN)
{
CONDVAL v;
v.cond = local_trans::u2a(son1.key, CP_UTF8);
if (v.cond == "default")
v.cond = "";
if (son1.type == known_file_util::JV_STRING)
v.val = local_trans::u2a(son1.str_val, CP_UTF8);
else
v.val = std::string((char*)&son1.int_val, sizeof(son1.int_val));
v.cond.insert(0, "step:");
range.push_back(v);
son1 = son->next_member();
}
son->release();
}
}
else
{
range_type = L"list";
known_file_util::JSONMEMW m = child->first_member();
while (m.type != known_file_util::JV_UNKNOWN)
{
if (m.type == known_file_util::JV_OBJECT)
{
known_file_util::JSONMEMW s = m.child->first_member();
while (s.type != known_file_util::JV_UNKNOWN)
{
CONDVAL cv;
cv.cond = local_trans::u2a(s.key, CP_UTF8);
cv.val = std::string((char*)&s.int_val, sizeof(s.int_val));
range.push_back(cv);
s = m.child->next_member();
}
m.child->release();
}
else
{
CONDVAL cv;
cv.cond = "";
cv.val = std::string((char*)&m.int_val, sizeof(m.int_val));
range.push_back(cv);
}
m = child->next_member();
}
}
}
else if (type == L"float")
{
double nv = 0;
known_file_util::IJsonW* son = NULL;
if (child->get_value(L"min", nv) || child->get_value(L"min", &son) || child->get_value(L"min", &str_range))
{
range_type = L"range";
if (son)
{
known_file_util::JSONMEMW son1 = son->first_member();
while (son1.type != known_file_util::JV_UNKNOWN)
{
CONDVAL v;
v.cond = local_trans::u2a(son1.key, CP_UTF8);
if (v.cond == "default")
v.cond = "";
if (son1.type == known_file_util::JV_STRING)
v.val = local_trans::u2a(son1.str_val, CP_UTF8);
else
v.val = std::string((char*)&son1.double_val, sizeof(son1.double_val));
v.cond.insert(0, "min:");
range.push_back(v);
son1 = son->next_member();
}
son->release();
}
else
{
CONDVAL v;
v.val = str_range ? local_trans::u2a(str_range, CP_UTF8) : std::string((char*)&nv, sizeof(nv));
v.cond.insert(0, "min:");
range.push_back(v);
}
str_range = NULL;
if (child->get_value(L"max", nv) || child->get_value(L"max", &str_range))
{
CONDVAL v;
v.val = str_range ? local_trans::u2a(str_range, CP_UTF8) : std::string((char*)&nv, sizeof(nv));
v.cond.insert(0, "max:");
range.push_back(v);
}
else if (child->get_value(L"max", &son) && son)
{
known_file_util::JSONMEMW son1 = son->first_member();
while (son1.type != known_file_util::JV_UNKNOWN)
{
CONDVAL v;
v.cond = local_trans::u2a(son1.key, CP_UTF8);
if (v.cond == "default")
v.cond = "";
v.cond.insert(0, "max:");
if (son1.type == known_file_util::JV_STRING)
v.val = local_trans::u2a(son1.str_val, CP_UTF8);
else
v.val = std::string((char*)&son1.double_val, sizeof(son1.double_val));
range.push_back(v);
son1 = son->next_member();
}
son->release();
}
str_range = NULL;
if (child->get_value(L"step", nv) || child->get_value(L"step", &str_range))
{
CONDVAL v;
v.val = str_range ? local_trans::u2a(str_range, CP_UTF8) : std::string((char*)&nv, sizeof(nv));
v.cond.insert(0, "step:");
range.push_back(v);
}
else if (child->get_value(L"step", &son) && son)
{
known_file_util::JSONMEMW son1 = son->first_member();
while (son1.type != known_file_util::JV_UNKNOWN)
{
CONDVAL v;
v.cond = local_trans::u2a(son1.key, CP_UTF8);
if (v.cond == "default")
v.cond = "";
if (son1.type == known_file_util::JV_STRING)
v.val = local_trans::u2a(son1.str_val, CP_UTF8);
else
v.val = std::string((char*)&son1.double_val, sizeof(son1.double_val));
v.cond.insert(0, "step:");
range.push_back(v);
son1 = son->next_member();
}
son->release();
}
}
else
{
range_type = L"list";
known_file_util::JSONMEMW m = child->first_member();
while (m.type != known_file_util::JV_UNKNOWN)
{
if (m.type == known_file_util::JV_OBJECT)
{
known_file_util::JSONMEMW s = m.child->first_member();
while (s.type != known_file_util::JV_UNKNOWN)
{
CONDVAL cv;
cv.cond = local_trans::u2a(s.key, CP_UTF8);
cv.val = std::string((char*)&s.double_val, sizeof(s.double_val));
range.push_back(cv);
s = m.child->next_member();
}
m.child->release();
}
else
{
CONDVAL cv;
cv.cond = "";
cv.val = std::string((char*)&m.double_val, sizeof(m.double_val));
range.push_back(cv);
}
m = child->next_member();
}
}
}
else if (type == L"string")
{
range_type = L"list";
known_file_util::JSONMEMW m = child->first_member();
while (m.type != known_file_util::JV_UNKNOWN)
{
CONDVAL cv;
if (m.type == known_file_util::JV_OBJECT)
{
known_file_util::JSONMEMW s = m.child->first_member();
while (s.type != known_file_util::JV_UNKNOWN)
{
cv.cond = local_trans::u2a(s.key, CP_UTF8);
cv.val = std::string((const char*)s.str_val, lstrlenW(s.str_val) * 2 + 2);
range.push_back(cv);
s = m.child->next_member();
}
m.child->release();
}
else
{
cv.cond = "";
cv.val = std::string((const char*)m.str_val, lstrlenW(m.str_val) * 2 + 2);
range.push_back(cv);
}
m = child->next_member();
}
}
child->release();
}
std::wstring oper(L"");
if (jsn->get_value(L"depend_and", &child) && child)
oper = L"&&";
else if (jsn->get_value(L"depend_or", &child) && child)
oper = L"||";
else
{
const wchar_t* dpnd = NULL;
jsn->get_value(L"depend", &dpnd);
depend = dpnd ? dpnd : L"";
}
if (child)
{
known_file_util::JSONMEMW m = child->first_member();
std::wstring n(L"");
while (m.type != known_file_util::JV_UNKNOWN)
{
std::wstring exp(m.str_val), nm(coding::name_from_depend_exp(exp));
if (nm.empty())
exp.insert(0, n);
else
n = nm;
if (!depend.empty())
depend += oper;
depend += exp;
m = child->next_member();
}
child->release();
}
return ret;
}
void CDlgOptJson::SANEOPT::init(struct _sane_opt_json* opt)
{
opt->name = opt->title = opt->desc = L"";
opt->group = L"\u57FA\u672C\u8BBE\u7F6E";
opt->category = opt->unit = opt->affect = opt->range_type = L"none";
opt->range.clear();
opt->def_val.clear();
opt->type = L"int";
opt->ver = 1;
opt->fix_id = 0;
opt->auth = USER_PRIVILEGE_COMMON;
opt->pos = -1;
opt->ui_pos = -1;
opt->readonly = false;
opt->visible.clear();
opt->enable = true;
opt->auto_restore_default = true;
opt->own_read = false;
}
std::wstring CDlgOptJson::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);
}
bool CDlgOptJson::is_button_check(UINT id)
{
return ((CButton*)GetDlgItem(id))->GetCheck() == BST_CHECKED;
}
void CDlgOptJson::set_button_check(UINT id, bool check)
{
((CButton*)GetDlgItem(id))->SetCheck(check ? BST_CHECKED : BST_UNCHECKED);
}
std::wstring CDlgOptJson::get_json_text(const wchar_t* tab)
{
known_file_util::IJsonW* root = known_file_util::create_jsonW(), * child = NULL;
std::wstring nofid(L"");
int nfidcnt = 0;
for (auto& v : opts_)
{
child = v.to_json();
if (v.fix_id <= 0)
nofid += L" " + std::to_wstring(++nfidcnt) + L"<EFBFBD><EFBFBD> " + v.title + L"\r\n";
if (child)
{
if(wcscmp(child->key(), L"global"))
root->set_value(v.name.c_str(), child);
child->release();
}
}
if (!nofid.empty())
{
nofid.insert(0, L" \u8BF7\u6CE8\u610F\uFF0C\u4EE5\u4E0B\u5C5E\u6027\u6CA1\u6709\u63D0\u4F9B\uFF26\uFF49\uFF58\uFF45\uFF44\uFF0D\uFF29\uFF24\u6570\u636E\uFF0C\u5C06\r\n\u65E0\u6CD5\u88AB\u6620\u5C04\u5230\uFF34\uFF37\uFF21\uFF29\uFF2E\u534F\u8BAE\u4E2D\uFF01\r\n\r\n");
MessageBox(nofid.c_str(), TEXT("Notice"), MB_OK | MB_ICONWARNING);
}
std::wstring cont(L"");
root->to_string(coding::get_wstring, &cont, tab);
root->release();
return std::move(cont);
}
void CDlgOptJson::from_ui(SANEOPT& sop)
{
std::wstring val(L"");
sop.name = get_item_text(IDC_EDIT_NAME);
sop.title = get_item_text(IDC_EDIT_TITLE);
sop.desc = get_item_text(IDC_EDIT_DESCRIPTION);
sop.group = get_item_text(IDC_COMBO_GROUP);
if (group_.FindStringExact(-1, sop.group.c_str()) == -1)
group_.AddString(sop.group.c_str());
sop.category = get_item_text(IDC_COMBO_CATEGORY);
if (cat_.FindStringExact(-1, sop.category.c_str()) == -1)
cat_.AddString(sop.group.c_str());
sop.affect = get_item_text(IDC_COMBO_AFFECT);
sop.unit = get_item_text(IDC_COMBO_UNIT);
sop.ver = GetDlgItemInt(IDC_EDIT_VER);
sop.type = get_item_text(IDC_COMBO_DATA_TYPE);
sop.pos = GetDlgItemInt(IDC_EDIT_POSITION);
sop.ui_pos = GetDlgItemInt(IDC_EDIT_UI_POS);
//sop.fix_id = GetDlgItemInt(IDC_EDIT_FIXED_ID);
sop.fix_id = fix_id_edit_.value();
sop.readonly = is_button_check(IDC_CHECK_READONLY);
//sop.open = visible_.GetCurSel(); // is_button_check(IDC_CHECK_PUBLIC);
sop.visible.clear();
for (int i = 0; i < visible_.GetCount(); ++i)
{
CONDVAL* pcv = (CONDVAL*)visible_.GetItemData(i);
sop.visible.push_back(*pcv);
}
sop.range_type = get_item_text(IDC_COMBO_RANGE);
sop.auth = known_name::auth_from_title(get_item_text(IDC_COMBO_AUTH).c_str());
if (GetDlgItem(IDC_EDIT_DEFAULT)->IsWindowVisible())
val = get_item_text(IDC_EDIT_DEFAULT);
else
val = get_item_text(IDC_COMBO_DEFAULT);
sop.size = GetDlgItemInt(IDC_EDIT_SIZE);
sop.def_val.clear(); // FIXED me to support multi-value!!!
if (val.find(L"=") == 0)
{
// consitant with another option
CONDVAL cv;
cv.cond = "default";
cv.val = std::string((const char*)val.c_str(), val.length() * 2 + 2);
sop.def_val.push_back(cv);
}
else if (sop.type == L"bool")
{
bool v = val == L"true";
CONDVAL cv;
cv.cond = "default";
cv.val = std::string((char*)&v, sizeof(v));
sop.def_val.push_back(cv);
}
else if (sop.type == L"int")
{
int v = _wtoi(val.c_str());
CONDVAL cv;
cv.cond = "default";
cv.val = std::string((char*)&v, sizeof(v));
sop.def_val.push_back(cv);
}
else if (sop.type == L"float")
{
double v = _wtof(val.c_str());
CONDVAL cv;
cv.cond = "default";
cv.val = std::string((char*)&v, sizeof(v));
sop.def_val.push_back(cv);
}
else if (sop.type == L"string")
{
CONDVAL cv;
cv.cond = "default";
cv.val = std::string((const char*)val.c_str(), val.length() * 2 + 2);
sop.def_val.push_back(cv);
}
sop.enable = is_button_check(IDC_CHECK_ENABLE);
sop.range_type = get_item_text(IDC_COMBO_RANGE);
sop.auto_restore_default = is_button_check(IDC_CHECK_AUTO_RESTORE);
sop.depend = get_item_text(IDC_EDIT_LOGIC);
sop.own_read = is_button_check(IDC_CHECK_OWN_READ);
simple_logic logic;
int pos = 0;
if (!logic.parse(local_trans::u2a(sop.depend.c_str(), CP_UTF8).c_str(), &pos))
{
wchar_t info[128] = { 0 };
swprintf_s(info, _countof(info) - 1, L"Invalid char at position %u('%c')!", pos, sop.depend[pos]);
MessageBox(info, L"Invalid Logic-Expression");
}
}
void CDlgOptJson::to_ui(const SANEOPT& sop)
{
int n = 0;
::SetDlgItemTextW(m_hWnd, IDC_EDIT_NAME, sop.name.c_str());
::SetDlgItemTextW(m_hWnd, IDC_EDIT_TITLE, sop.title.c_str());
::SetDlgItemTextW(m_hWnd, IDC_EDIT_DESCRIPTION, sop.desc.c_str());
SetDlgItemInt(IDC_EDIT_SIZE, sop.size);
n = group_.FindStringExact(-1, sop.group.c_str());
if (n == -1)
n = group_.AddString(sop.group.c_str());
group_.SetCurSel(n);
n = cat_.FindStringExact(-1, sop.category.c_str());
if (n == -1)
n = cat_.AddString(sop.category.c_str());
cat_.SetCurSel(n);
n = affect_.FindStringExact(-1, sop.affect.c_str());
affect_.SetCurSel(n);
n = unit_.FindStringExact(-1, sop.unit.c_str());
unit_.SetCurSel(n);
SetDlgItemInt(IDC_EDIT_VER, sop.ver);
n = type_.FindStringExact(-1, sop.type.c_str());
type_.SetCurSel(n);
CComboBox* auth = (CComboBox*)GetDlgItem(IDC_COMBO_AUTH);
n = auth->FindStringExact(-1, known_name::auth_to_title(sop.auth).c_str());
auth->SetCurSel(n);
SetDlgItemInt(IDC_EDIT_POSITION, sop.pos);
SetDlgItemInt(IDC_EDIT_UI_POS, sop.ui_pos);
//SetDlgItemInt(IDC_EDIT_FIXED_ID, sop.fix_id);
fix_id_edit_.set_value(sop.fix_id);
set_button_check(IDC_CHECK_READONLY, sop.readonly);
set_button_check(IDC_CHECK_OWN_READ, sop.own_read);
//set_button_check(IDC_CHECK_PUBLIC, sop.open);
//visible_.SetCurSel(sop.open);
clear_visible();
for (auto& v : sop.visible)
{
CONDVAL* pcv = new CONDVAL;
*pcv = v;
int n = visible_.InsertString(-1, known_name::visible_title(*(int*)v.val.c_str()).c_str());
visible_.SetItemData(n, (DWORD_PTR)pcv);
visible_.SetCurSel(n);
}
set_button_check(IDC_CHECK_ENABLE, sop.enable);
set_button_check(IDC_CHECK_AUTO_RESTORE, sop.auto_restore_default);
n = range_.FindStringExact(-1, sop.range_type.c_str());
range_.SetCurSel(n);
// default value ...
// depend item ...
SetDlgItemText(IDC_EDIT_LOGIC, sop.depend.c_str());
n = true;
parent_.EnableWindow(n);
logic_.EnableWindow(n);
depends_.EnableWindow(n);
GetDlgItem(IDC_BUTTON_ADD)->EnableWindow(n);
//GetDlgItem(IDC_EDIT_LOW)->EnableWindow(n);
//GetDlgItem(IDC_EDIT_LOW)->ShowWindow(SW_SHOW);
//GetDlgItem(IDC_COMBO_LOW)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_STATIC_AND)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_EDIT_BIG)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_COMBO_BIG)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_BUTTON_SET)->EnableWindow(sop.range_type != L"none");
parent_.ResetContent();
for (auto& v : opts_)
{
if (v.name == sop.name)
continue;
parent_.AddString(v.title.c_str());
}
OnCbnDataTypeSelchange();
OnCbnRangeSelchange();
OnCbnDependSelchange();
// default value ...
std::wstring def(L"");
if (sop.type == L"bool")
{
def_val_.ResetContent();
def_val_.AddString(L"false");
def_val_.AddString(L"true");
for (auto& v : sop.def_val)
{
if (v.val.length() > sizeof(bool) && v.val[0] == '=')
{
std::wstring t((const wchar_t*)v.val.c_str());
def_val_.AddString(t.c_str());
if (v.cond == "default")
def = t;
}
else if (v.cond == "default")
def = *(bool*)v.val.c_str() ? L"true" : L"false";
}
GetDlgItem(IDC_EDIT_DEFAULT)->ShowWindow(SW_HIDE);
def_val_.ShowWindow(SW_SHOW);
def_val_.SetCurSel(def_val_.FindStringExact(-1, def.c_str()));
}
else if (sop.type == L"int")
{
int nv = 0;
for (auto& v : sop.def_val)
{
if (v.cond == "default")
{
if (v.val.length() > sizeof(nv) && v.val[0] == '=')
{
def = (const wchar_t*)v.val.c_str();
}
else
{
nv = *(int*)v.val.c_str();
def = std::to_wstring(nv);
}
break;
}
}
if (sop.range_type == L"list")
{
GetDlgItem(IDC_EDIT_DEFAULT)->ShowWindow(SW_HIDE);
def_val_.ShowWindow(SW_SHOW);
def_val_.ResetContent();
for (auto& v : sop.range)
{
if (v.val.length() > sizeof(nv) && v.val[0] == '=')
{
def_val_.AddString((const wchar_t*)v.val.c_str());
}
else
{
def_val_.AddString(std::to_wstring(*(int*)v.val.c_str()).c_str());
}
}
def_val_.SetCurSel(def_val_.FindStringExact(-1, def.c_str()));
}
else
{
GetDlgItem(IDC_EDIT_DEFAULT)->ShowWindow(SW_SHOW);
SetDlgItemText(IDC_EDIT_DEFAULT, def.c_str());
def_val_.ShowWindow(SW_HIDE);
}
}
else if (sop.type == L"float")
{
double dbv = 0;
for (auto& v : sop.def_val)
{
if (v.cond == "default")
{
if (v.val[0] == '=' && lstrlenW((const wchar_t*)v.val.c_str()) == v.val.length() - 2)
{
def = (const wchar_t*)v.val.c_str();
}
else
{
dbv = *(double*)v.val.c_str();
def = std::to_wstring(dbv);
}
break;
}
}
if (sop.range_type == L"list")
{
GetDlgItem(IDC_EDIT_DEFAULT)->ShowWindow(SW_HIDE);
def_val_.ShowWindow(SW_SHOW);
def_val_.ResetContent();
for (auto& v : sop.range)
{
if (v.val[0] == '=' && lstrlenW((const wchar_t*)v.val.c_str()) == v.val.length() - 2)
{
def_val_.AddString((const wchar_t*)v.val.c_str());
}
else
{
def_val_.AddString(std::to_wstring(*(double*)v.val.c_str()).c_str());
}
}
def_val_.SetCurSel(def_val_.FindStringExact(-1, std::to_wstring(dbv).c_str()));
}
else
{
GetDlgItem(IDC_EDIT_DEFAULT)->ShowWindow(SW_SHOW);
SetDlgItemInt(IDC_EDIT_DEFAULT, dbv);
def_val_.ShowWindow(SW_HIDE);
}
}
else if (sop.type == L"string")
{
std::wstring strv(L"");
for (auto& v : sop.def_val)
{
strv = (const wchar_t*)v.val.c_str();
if (v.cond == "default")
break;
}
if (sop.range_type == L"list")
{
GetDlgItem(IDC_EDIT_DEFAULT)->ShowWindow(SW_HIDE);
def_val_.ShowWindow(SW_SHOW);
def_val_.ResetContent();
for (auto& v : sop.range)
{
def_val_.AddString((const wchar_t*)v.val.c_str());
}
def_val_.SetCurSel(def_val_.FindStringExact(-1, strv.c_str()));
}
else
{
GetDlgItem(IDC_EDIT_DEFAULT)->ShowWindow(SW_SHOW);
SetDlgItemText(IDC_EDIT_DEFAULT, strv.c_str());
def_val_.ShowWindow(SW_HIDE);
}
}
}
HTREEITEM CDlgOptJson::insert_new_item(const SANEOPT& opt, bool sel)
{
if (opt.name == L"global")
return NULL;
int fid = known_name::name_to_fix_id(opt.name.c_str());
if (fid && fid != opt.fix_id)
{
std::wstring text(L"fix-id<69><64><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>IDֵ");
wchar_t buf[40] = { 0 };
swprintf_s(buf, _countof(buf) - 1, L" 0x%04X ", fid);
text += buf;
text += L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><EFBFBD>";
::MessageBoxW(m_hWnd, text.c_str(), NULL, MB_OK);
GotoDlgCtrl(GetDlgItem(IDC_EDIT_FIXED_ID));
return NULL;
}
if (opt.fix_id)
{
std::string n(known_name::name_from_fix_id(opt.fix_id));
if (!n.empty() && n != local_trans::u2a(opt.name.c_str(), CP_UTF8))
{
wchar_t info[128] = { 0 };
swprintf_s(info, _countof(info) - 1, L"Fix-ID <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԡ<EFBFBD>%s<><73><EFBFBD><EFBFBD>ͻ<EFBFBD><CDBB>", local_trans::a2u(n.c_str(), CP_UTF8).c_str());
::MessageBoxW(m_hWnd, info, NULL, MB_OK);
GotoDlgCtrl(GetDlgItem(IDC_EDIT_FIXED_ID));
return NULL;
}
for (auto& v : opts_)
{
if (v.fix_id == opt.fix_id)
{
wchar_t info[128] = { 0 };
swprintf_s(info, _countof(info) - 1, L"Fix-ID <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԡ<EFBFBD>%s<><73><EFBFBD><EFBFBD>ͻ<EFBFBD><CDBB>", v.title.c_str());
::MessageBoxW(m_hWnd, info, NULL, MB_OK);
GotoDlgCtrl(GetDlgItem(IDC_EDIT_FIXED_ID));
return NULL;
}
else if (v.category == opt.category && v.category == L"ͼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" && v.pos == opt.pos)
{
wchar_t info[128] = { 0 };
swprintf_s(info, _countof(info) - 1, L"Position <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԡ<EFBFBD>%s<><73><EFBFBD><EFBFBD>ͻ<EFBFBD><CDBB>", v.title.c_str());
::MessageBoxW(m_hWnd, info, NULL, MB_OK);
GotoDlgCtrl(GetDlgItem(IDC_EDIT_POSITION));
return NULL;
}
}
}
HTREEITEM item = tree_.InsertItem(opt.title.c_str());
wchar_t* name = new wchar_t[opt.name.length() + 2];
wcscpy(name, opt.name.c_str());
if (!tree_.SetItemData(item, (DWORD_PTR)name))
delete[] name;
opts_.push_back(opt);
if (sel)
{
tree_.SelectItem(item);
tree_.EnsureVisible(item);
}
update_opt_count();
return item;
}
void CDlgOptJson::delete_from_tree(const wchar_t* name)
{
if (name)
{
HTREEITEM item = tree_.GetRootItem();
while (item)
{
wchar_t* buf = (wchar_t*)tree_.GetItemData(item);
if (buf && wcscmp(buf, name) == 0)
{
tree_.DeleteItem(item);
for (int i = 0; i < opts_.size(); ++i)
{
if (opts_[i].name == buf)
{
opts_.erase(opts_.begin() + i);
break;
}
}
delete[] buf;
break;
}
item = tree_.GetNextSiblingItem(item);
}
}
else
{
HTREEITEM item = tree_.GetRootItem();
while (item)
{
wchar_t* buf = (wchar_t*)tree_.GetItemData(item);
if (buf)
delete[] buf;
item = tree_.GetNextSiblingItem(item);
}
tree_.DeleteAllItems();
opts_.clear();
}
update_opt_count();
}
HTREEITEM CDlgOptJson::modify_tree_title(const wchar_t* name, const wchar_t* title)
{
HTREEITEM item = tree_.GetRootItem(), found = NULL;
while (item)
{
wchar_t* buf = (wchar_t*)tree_.GetItemData(item);
if (buf && wcscmp(buf, name) == 0)
{
tree_.SetItemText(item, title);
found = item;
break;
}
item = tree_.GetNextSiblingItem(item);
}
return found;
}
void CDlgOptJson::update_opt_count(void)
{
wchar_t hz_num[] = { L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" }, text[10] = { 0 }, *cur = text + _countof(text) - 2;
int cnt = opts_.size();
do
{
*cur-- = hz_num[cnt % 10];
cnt /= 10;
} while (cnt > 0);
SetDlgItemText(IDC_STATIC_CNT, cur + 1);
}
void CDlgOptJson::clear_visible(void)
{
for (int i = 0; i < visible_.GetCount(); ++i)
{
CONDVAL* pcv = (CONDVAL*)visible_.GetItemData(i);
delete pcv;
}
visible_.ResetContent();
}
bool CDlgOptJson::load_from_file(const wchar_t* path_file)
{
std::string cont("");
std::wstring unic(L"");
bool ret = false;
file_util::load_file(path_file, coding::get_string, &cont);
coding_util::bom::to_unicode(cont.c_str(), cont.length(), coding::get_wstring, &unic);
if (unic.length())
{
if (!load_from_json_text(unic.c_str()))
{
unic = path_file;
unic.insert(0, L"Parse json file '");
unic += L"' failed";
::MessageBoxW(m_hWnd, unic.c_str(), L"Error", MB_OK);
}
else
ret = true;
}
return ret;
}
bool CDlgOptJson::load_from_json_text(const wchar_t* txt, std::wstring* err_msg)
{
int pos = 0;
known_file_util::IJsonW* jsn = known_file_util::create_jsonW(txt, &pos), * child = NULL;
while (!jsn)
{
// try code-text ...
{
std::wstring code(txt);
size_t splash = 0;
known_name::erase_trans_letter(code);
jsn = known_file_util::create_jsonW(&code[0], (int*)&splash);
if (jsn)
break;
}
// try device_opt_json
{
std::wstring code(txt), tag(L"static std::string device_opt_json[] = {");
size_t pos = code.find(tag);
if (pos == 0)
{
code.erase(0, tag.length());
tag = L"\r\n\t\"";
while ((pos = code.find(tag)) != std::wstring::npos)
{
if (pos > 2 && code[pos - 1] == L',' && code[pos - 2] == L'\"')
code.erase(pos - 2, tag.length() + 2);
else
code.erase(pos, tag.length());
}
tag = L"\"\r\n";
pos = code.find(tag);
if (pos != std::wstring::npos)
code.erase(pos);
known_name::erase_trans_letter(code);
pos = 0;
jsn = known_file_util::create_jsonW(&code[0], (int*)&pos);
}
if (jsn)
break;
}
int ep = 10, len = 10;
if (lstrlenW(txt + pos) < 10)
len = lstrlenW(txt + pos);
if (pos < 10)
{
ep = pos;
pos = 10;
}
pos -= 10;
std::wstring info(txt + pos, len + ep + 1);
wchar_t msg[80] = { 0 };
swprintf_s(msg, L"Error at position %d of char '%c'!\r\n\r\n", ep, info[ep]);
if (err_msg)
*err_msg = msg + info;
else
::MessageBoxW(m_hWnd, (msg + info).c_str(), L"Load Error", MB_OK);
return false;
}
std::wstring group(L"");
delete_from_tree();
opts_.clear();
child = jsn->first_child();
while (child)
{
SANEOPT opt;
if (opt.from_json(child))
{
if (opt.type == L"group")
{
group = opt.title;
}
else
{
if(opt.group.empty() && !group.empty())
opt.group = group;
insert_new_item(opt, false);
}
}
child->release();
child = jsn->next_child();
}
jsn->release();
return true;
}
void CDlgOptJson::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_COMBO_GROUP, group_);
DDX_Control(pDX, IDC_COMBO_CATEGORY, cat_);
DDX_Control(pDX, IDC_COMBO_AFFECT, affect_);
DDX_Control(pDX, IDC_COMBO_UNIT, unit_);
DDX_Control(pDX, IDC_COMBO_DATA_TYPE, type_);
DDX_Control(pDX, IDC_COMBO_RANGE, range_);
DDX_Control(pDX, IDC_COMBO_DEFAULT, def_val_);
DDX_Control(pDX, IDC_COMBO_DEPEND, depend_);
DDX_Control(pDX, IDC_COMBO_PARENT, parent_);
DDX_Control(pDX, IDC_COMBO_LOGIC, logic_);
DDX_Control(pDX, IDC_COMBO_LOW, lower_);
DDX_Control(pDX, IDC_COMBO_BIG, upper_);
DDX_Control(pDX, IDC_COMBO_EXPORT, export_type_);
DDX_Control(pDX, IDC_COMBO_VISIBLE, visible_);
DDX_Control(pDX, IDC_LIST_DEPEND, depends_);
DDX_Control(pDX, IDC_TREE2, tree_);
}
BOOL CDlgOptJson::OnInitDialog()
{
CDialogEx::OnInitDialog();
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
group_.SetCurSel(0);
cat_.SetCurSel(0);
affect_.SetCurSel(0);
unit_.SetCurSel(0);
type_.SetCurSel(0);
range_.SetCurSel(0);
def_val_.SetCurSel(0);
depend_.SetCurSel(0);
set_button_check(IDC_CHECK_AUTO_RESTORE, true);
parent_.EnableWindow(FALSE);
logic_.EnableWindow(FALSE);
GetDlgItem(IDC_EDIT_LOW)->EnableWindow(FALSE);
depends_.EnableWindow(FALSE);
GetDlgItem(IDC_BUTTON_ADD)->EnableWindow(FALSE);
BITMAP bmi = { 0 };
GetObject(LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BITMAP1)), sizeof(bmi), &bmi);
tree_img_.Create(IDB_BITMAP1, bmi.bmWidth / 2, bmi.bmWidth / 2, RGB(255, 255, 255));
tree_.SetImageList(&tree_img_, TVSIL_NORMAL);
tree_menu_.LoadMenu(IDR_MENU1);
fix_id_edit_.attach(GetDlgItem(IDC_EDIT_FIXED_ID)->m_hWnd);
export_type_.SetCurSel(1);
visible_.SetCurSel(0);
tooltips_ = new tooltip_wnd();
tooltips_->create(m_hWnd);
tooltips_->add_tool_tip_for_ctrl(::GetDlgItem(m_hWnd, IDC_CHECK_AUTO_RESTORE), L"\u662F\u5426\u652F\u6301\u6062\u590D\u5230\u9ED8\u8BA4\u503C\u7684\u64CD\u4F5C");
tooltips_->add_tool_tip_for_ctrl(::GetDlgItem(m_hWnd, IDC_CHECK_OWN_READ), L"\u8BE5\u5C5E\u6027\u5F53\u524D\u503C\u9700\u8981\u989D\u5916\u64CD\u4F5C\u4EE5\u4FDD\u8BC1\u5B9E\u65F6\u6027");
tooltips_->add_tool_tip_for_ctrl(::GetDlgItem(m_hWnd, IDC_CHECK_PUBLIC), L"\u662F\u5426\u5BF9\u666E\u901A\u7528\u6237\u5F00\u653E");
tooltips_->add_tool_tip_for_ctrl(::GetDlgItem(m_hWnd, IDC_COMBO_AFFECT), L"\u8BE5\u5C5E\u6027\u503C\u53D1\u751F\u6539\u53D8\u540E\uFF0C\u662F\u5426\u5F71\u54CD\u5176\u5B83\u5C5E\u6027\u6216\u8005\u56FE\u50CF\u53C2\u6570\uFF1F");
tooltips_->add_tool_tip_for_ctrl(::GetDlgItem(m_hWnd, IDC_COMBO_CATEGORY), L"\u5C5E\u6027\u5206\u7C7B\u3002\u5982\u679C\u4E3A\u56FE\u50CF\u5206\u7C7B\uFF0C\u4F1A\u6309\u7167\u201Cposition\u201D\u503C\u6392\u5E8F\uFF0C\u4EE5\u786E\u5B9A\u6267\u884C\u7684\u5148\u540E\u987A\u5E8F");
tooltips_->add_tool_tip_for_ctrl(::GetDlgItem(m_hWnd, IDC_COMBO_GROUP), L"\u8BE5\u5C5E\u6027\u5728\u754C\u9762\u4E0A\u663E\u793A\u65F6\uFF0C\u6240\u5F52\u5C5E\u7684\u5206\u7EC4\u540D\u79F0");
tooltips_->add_tool_tip_for_ctrl(::GetDlgItem(m_hWnd, IDC_COMBO_AUTH), L"\u64CD\u4F5C\u8BE5\u5C5E\u6027\u6240\u9700\u8981\u7684\u6700\u4F4E\u6743\u9650");
tooltips_->add_tool_tip_for_ctrl(::GetDlgItem(m_hWnd, IDC_EDIT_FIXED_ID), L"\u63D0\u4F9B\u8BE5\u503C\uFF0C\u8BE5\u5C5E\u6027\u5373\u53EF\u88ABTWAIN\u534F\u8BAE\u4FA6\u6D4B\u5230");
tooltips_->add_tool_tip_for_ctrl(::GetDlgItem(m_hWnd, IDC_EDIT_POSITION), L"\u76F8\u540C\u5206\u7C7B\u201CCategory\u201D\u4E2D\u5C5E\u6027\u7684\u6267\u884C\u987A\u5E8F\uFF0C\u6570\u5B57\u8D8A\u5C0F\u6392\u5728\u8D8A\u524D\u9762\u6267\u884C\u3002\u5982\u679C\u5C5E\u6027ID\u76F8\u540C\uFF0C\u5219\u6309\u8BE5\u503C\u987A\u5E8F\u6267\u884C\uFF1B\u5982\u679C\u8BE5\u503C\u4E5F\u76F8\u540C\uFF0C\u5219\u6309\u6700\u8FD1\u6DFB\u52A0\u7684\u5C5E\u6027\u66FF\u6362\u4E4B\u524D\u7684\u6267\u884C\u3002");
tooltips_->add_tool_tip_for_ctrl(::GetDlgItem(m_hWnd, IDC_EDIT_UI_POS), L"\u8BE5\u5C5E\u6027\u5728\u754C\u9762\u4E0A\u663E\u793A\u7684\u987A\u5E8F");
tooltips_->add_tool_tip_for_ctrl(::GetDlgItem(m_hWnd, IDC_EDIT_VER), L"\u5F53\u8BE5\u5C5E\u6027\u6709\u591A\u4E2A\u6E90\u63D0\u4F9B\u65F6\uFF0C\u53D6\u7248\u672C\u9AD8\u8005\u4F7F\u7528\u3002\u7248\u672C\u76F8\u540C\u65F6\uFF0C\u6309\u201CPosition\u201D\u57DF\u6392\u5E8F\u4F7F\u7528\u3002");
return TRUE; // return TRUE unless you set the focus to a control
}
void CDlgOptJson::OnDestroy()
{
CDialogEx::OnDestroy();
// TODO: <20>ڴ˴<DAB4><CBB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
delete_from_tree();
}
BEGIN_MESSAGE_MAP(CDlgOptJson, CDialogEx)
ON_WM_PASTE()
ON_CBN_SELCHANGE(IDC_COMBO_DATA_TYPE, &CDlgOptJson::OnCbnDataTypeSelchange)
ON_CBN_SELCHANGE(IDC_COMBO_RANGE, &CDlgOptJson::OnCbnRangeSelchange)
ON_CBN_SELCHANGE(IDC_COMBO_DEPEND, &CDlgOptJson::OnCbnDependSelchange)
ON_CBN_SELCHANGE(IDC_COMBO_PARENT, &CDlgOptJson::OnCbnParentSelchange)
ON_CBN_SELCHANGE(IDC_COMBO_LOGIC, &CDlgOptJson::OnCbnLogicSelchange)
ON_BN_CLICKED(IDC_BUTTON_MODIFY, &CDlgOptJson::OnBnClickedButtonModify)
ON_BN_CLICKED(IDC_BUTTON_ADD, &CDlgOptJson::OnBnClickedButtonAdd)
ON_NOTIFY(TVN_SELCHANGED, IDC_TREE2, &CDlgOptJson::OnTvnSelchangedTree2)
ON_NOTIFY(NM_RCLICK, IDC_TREE2, &CDlgOptJson::OnNMRClickTree2)
ON_NOTIFY(TVN_SELCHANGING, IDC_TREE2, &CDlgOptJson::OnTvnSelchangingTree2)
ON_COMMAND(ID_TREE_LOADFILE, &CDlgOptJson::OnTreeLoadfile)
ON_COMMAND(ID_TREE_LOADCLIPBOARD, &CDlgOptJson::OnTreeLoadclipboard)
ON_LBN_DBLCLK(IDC_LIST_DEPEND, &CDlgOptJson::OnLbnDblclkListDepend)
ON_BN_CLICKED(IDC_BUTTON_SET, &CDlgOptJson::OnBnClickedButtonSet)
ON_COMMAND(ID_TREE_DELITEM, &CDlgOptJson::OnTreeDelitem)
ON_BN_CLICKED(IDC_BUTTON_EXPORT, &CDlgOptJson::OnBnClickedButtonExport)
ON_COMMAND(ID_TREE_MODIFYALLFIELD, &CDlgOptJson::OnTreeModifyallfield)
ON_COMMAND(ID_SORT_NAME, &CDlgOptJson::OnSortName)
ON_COMMAND(ID_SORT_TITLE, &CDlgOptJson::OnSortTitle)
ON_COMMAND(ID_SORT_GROUP, &CDlgOptJson::OnSortGroup)
ON_COMMAND(ID_SORT_POSITION, &CDlgOptJson::OnSortPosition)
ON_BN_CLICKED(IDC_BUTTON_SHOWUI, &CDlgOptJson::OnBnClickedButtonShowui)
ON_WM_DESTROY()
ON_WM_CTLCOLOR()
ON_MESSAGE(WM_CTLCOLORSTATIC, &CDlgOptJson::OnStaticColor)
ON_BN_CLICKED(IDC_BUTTON_SET_VISIBLE, &CDlgOptJson::OnBnClickedButtonSetVisible)
ON_NOTIFY(TVN_KEYDOWN, IDC_TREE2, &CDlgOptJson::OnTvnKeydownTree2)
END_MESSAGE_MAP()
// CDlgOptJson message handlers
void CDlgOptJson::OnCbnSelchange()
{
}
void CDlgOptJson::OnCbnDataTypeSelchange()
{
std::wstring val(get_item_text(IDC_COMBO_DATA_TYPE));
range_.EnableWindow();
if (val == L"bool")
{
range_.SetCurSel(range_.FindStringExact(-1, L"none"));
OnCbnRangeSelchange();
range_.EnableWindow(FALSE);
}
if (val == L"bool" || val == L"int")
{
SetDlgItemInt(IDC_EDIT_SIZE, sizeof(int));
GetDlgItem(IDC_EDIT_SIZE)->EnableWindow(FALSE);
}
else if (val == L"float")
{
SetDlgItemInt(IDC_EDIT_SIZE, sizeof(double));
GetDlgItem(IDC_EDIT_SIZE)->EnableWindow(FALSE);
}
else // if (val == L"string")
{
int size = val == L"string" ? 16 : 4;
std::wstring n(get_item_text(IDC_EDIT_NAME));
for (auto& v : opts_)
{
if (v.name == n)
{
size = v.size;
break;
}
}
SetDlgItemInt(IDC_EDIT_SIZE, size);
GetDlgItem(IDC_EDIT_SIZE)->EnableWindow(TRUE);
}
}
void CDlgOptJson::OnCbnRangeSelchange()
{
std::wstring val(get_item_text(IDC_COMBO_RANGE)),
type(get_item_text(IDC_COMBO_DATA_TYPE));
GetDlgItem(IDC_BUTTON_SET)->EnableWindow(val != L"none");
if (val == L"list" || type == L"bool")
{
GetDlgItem(IDC_EDIT_DEFAULT)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_COMBO_DEFAULT)->ShowWindow(SW_SHOW);
def_val_.ResetContent();
if (type == L"bool")
{
def_val_.AddString(L"false");
def_val_.AddString(L"true");
def_val_.SetCurSel(0);
}
}
else
{
GetDlgItem(IDC_EDIT_DEFAULT)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_COMBO_DEFAULT)->ShowWindow(SW_HIDE);
}
}
void CDlgOptJson::OnCbnDependSelchange()
{
std::wstring val(get_item_text(IDC_COMBO_DEPEND));
val = L"and";
parent_.EnableWindow(val != L"none");
logic_.EnableWindow(val != L"none");
depends_.EnableWindow(val != L"none");
lower_.EnableWindow(val != L"none");
upper_.EnableWindow(val != L"none");
GetDlgItem(IDC_BUTTON_ADD)->EnableWindow(val != L"none");
GetDlgItem(IDC_EDIT_LOW)->EnableWindow(val != L"none");
GetDlgItem(IDC_EDIT_BIG)->EnableWindow(val != L"none");
if (val != L"none")
{
val = get_item_text(IDC_EDIT_NAME);
parent_.ResetContent();
for (auto& v : opts_)
{
if (val == v.name)
continue;
parent_.AddString(v.title.c_str());
}
}
}
void CDlgOptJson::OnCbnParentSelchange()
{
std::wstring val(get_item_text(IDC_COMBO_PARENT));
SANEOPT opt;
for (auto& v : opts_)
{
if (val == v.title)
{
opt = v;
break;
}
}
logic_.ResetContent();
logic_.AddString(L"enabled");
logic_.AddString(L"!enabled");
if (opt.type == L"bool")
{
logic_.AddString(L"==");
logic_.SetCurSel(0);
OnCbnLogicSelchange();
GetDlgItem(IDC_EDIT_LOW)->ShowWindow(SW_HIDE);
lower_.ShowWindow(SW_SHOW);
lower_.ResetContent();
lower_.AddString(L"false");
lower_.AddString(L"true");
lower_.SetCurSel(0);
}
else if (opt.type == L"int" || opt.type == L"float")
{
logic_.AddString(L"==");
logic_.AddString(L"!=");
logic_.AddString(L"<");
logic_.AddString(L"<=");
logic_.AddString(L">");
logic_.AddString(L">=");
logic_.AddString(L"between");
logic_.AddString(L"out of");
logic_.SetCurSel(0);
OnCbnLogicSelchange();
if (opt.range_type == L"list")
{
GetDlgItem(IDC_EDIT_LOW)->ShowWindow(SW_HIDE);
lower_.ShowWindow(SW_SHOW);
lower_.ResetContent();
upper_.ResetContent();
if (opt.type == L"int")
{
for (auto& v : opt.range)
{
std::wstring val(std::to_wstring(*(int*)v.val.c_str()));
lower_.AddString(val.c_str());
upper_.AddString(val.c_str());
}
}
else
{
for (auto& v : opt.range)
{
std::wstring val(std::to_wstring(*(double*)v.val.c_str()));
lower_.AddString(val.c_str());
upper_.AddString(val.c_str());
}
}
}
else
{
GetDlgItem(IDC_EDIT_LOW)->ShowWindow(SW_SHOW);
lower_.ShowWindow(SW_HIDE);
}
}
else if (opt.type == L"string")
{
logic_.AddString(L"==");
logic_.AddString(L"!=");
logic_.SetCurSel(0);
OnCbnLogicSelchange();
if (opt.range_type == L"list")
{
GetDlgItem(IDC_EDIT_LOW)->ShowWindow(SW_HIDE);
lower_.ShowWindow(SW_SHOW);
lower_.ResetContent();
for (auto& v : opt.range)
{
std::wstring val((const wchar_t*)v.val.c_str());
lower_.AddString(val.c_str());
}
}
else
{
GetDlgItem(IDC_EDIT_LOW)->ShowWindow(SW_SHOW);
lower_.ShowWindow(SW_HIDE);
}
}
}
void CDlgOptJson::OnCbnLogicSelchange()
{
std::wstring val(get_item_text(IDC_COMBO_LOGIC));
GetDlgItem(IDC_EDIT_LOW)->ShowWindow(SW_SHOW);
lower_.ShowWindow(SW_SHOW);
if (val == L"enabled" || val == L"!enabled")
{
GetDlgItem(IDC_STATIC_AND)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_EDIT_LOW)->ShowWindow(SW_HIDE);
lower_.ShowWindow(SW_HIDE);
GetDlgItem(IDC_EDIT_BIG)->ShowWindow(SW_HIDE);
upper_.ShowWindow(SW_HIDE);
}
else if (val == L"between" || val == L"out of")
{
GetDlgItem(IDC_STATIC_AND)->ShowWindow(SW_SHOW);
// upper_.ShowWindow(SW_SHOW);
val = get_item_text(IDC_COMBO_PARENT);
for (auto& v : opts_)
{
if (val == v.title)
{
val = v.range_type;
break;
}
}
if (val == L"list")
{
upper_.ShowWindow(SW_SHOW);
GetDlgItem(IDC_EDIT_BIG)->ShowWindow(SW_HIDE);
}
else
{
upper_.ShowWindow(SW_HIDE);
GetDlgItem(IDC_EDIT_BIG)->ShowWindow(SW_SHOW);
}
}
else
{
GetDlgItem(IDC_STATIC_AND)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_EDIT_BIG)->ShowWindow(SW_HIDE);
upper_.ShowWindow(SW_HIDE);
}
}
void CDlgOptJson::OnPaste()
{
coding::CLPD clpb;
file_util::get_clipboard(coding::get_clipboard_content, &clpb);
if (clpb.cont.empty())
{
MessageBox(TEXT("clipboard is empty."));
return;
}
if (clpb.file)
{
size_t pos = clpb.cont.find(L"\r\n");
bool loaded = false;
while (!loaded && pos != std::wstring::npos)
{
loaded = load_from_file(clpb.cont.substr(0, pos).c_str());
clpb.cont.erase(0, pos + 2);
pos = clpb.cont.find(L"\r\n");
}
if (!loaded && file_util::is_file_existing(clpb.cont.c_str()))
load_from_file(clpb.cont.c_str());
}
else
{
std::wstring err(L"");
if (load_from_json_text(clpb.cont.c_str(), &err))
return;
// we assum the content from codes ...
std::wstring jsn(L"");
size_t pos = clpb.cont.find(L" std::string");
while (pos != std::wstring::npos)
{
clpb.cont.erase(0, pos);
pos = clpb.cont.find(L"\"");
if (pos == std::wstring::npos)
break;
clpb.cont.erase(0, pos + 1);
pos = clpb.cont.find(L"\");");
if (pos == std::wstring::npos)
{
jsn += clpb.cont;
break;
}
else
jsn += clpb.cont.substr(0, pos);
clpb.cont.erase(0, pos);
pos = clpb.cont.find(L" std::string");
}
if (jsn.length())
{
pos = jsn.find(L"\\\\");
while (pos != std::wstring::npos)
{
jsn.erase(pos++, 1);
pos = jsn.find(L"\\\\", pos);
}
pos = jsn.find(L"\\\"");
while (pos != std::wstring::npos)
{
jsn.erase(pos++, 1);
pos = jsn.find(L"\\\"", pos);
}
load_from_json_text(jsn.c_str());
}
else
::MessageBoxW(m_hWnd, err.c_str(), L"Load Error", MB_OK);
}
}
void CDlgOptJson::OnBnClickedButtonModify()
{
// TODO: <20>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>ӿؼ<D3BF>֪ͨ<CDA8><D6AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SANEOPT sop;
from_ui(sop);
if (sop.fix_id > 0 && sop.fix_id < 0x8800)
{
::MessageBoxW(m_hWnd, L"Fix-ID <20><>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>0x8800<30><30><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD>ֵ<EFBFBD><D6B5>", NULL, MB_OK);
GotoDlgCtrl(GetDlgItem(IDC_EDIT_FIXED_ID));
return;
}
if (sop.name.empty() || sop.title.empty())
{
MessageBox(TEXT("Name and Title must input!"));
return;
}
for (auto& v : opts_)
{
if (v.title == sop.title && v.name != sop.name)
{
if (::MessageBoxW(m_hWnd, (L"\u5DF2\u7ECF\u5B58\u5728\u540D\u4E3A\u201C" + v.title + L"\u201D\u7684\u914D\u7F6E\u9879\uFF01\uFF0C\u60F3\u4FEE\u6539Name\u5B57\u6BB5\u5417\uFF1F").c_str(), L"Error", MB_ICONSTOP | MB_YESNO) == IDYES)
{
sop.range = std::move(v.range);
v = std::move(sop);
}
return;
}
}
int fid = known_name::name_to_fix_id(sop.name.c_str());
if (fid && fid != sop.fix_id)
{
std::wstring text(L"fix-id<69><64><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>IDֵ");
wchar_t buf[40] = { 0 };
swprintf_s(buf, _countof(buf) - 1, L" 0x%04X ", fid);
text += buf;
text += L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><EFBFBD>";
::MessageBoxW(m_hWnd, text.c_str(), NULL, MB_OK);
GotoDlgCtrl(GetDlgItem(IDC_EDIT_FIXED_ID));
return;
}
if (sop.fix_id)
{
std::string n(known_name::name_from_fix_id(sop.fix_id));
if (!n.empty() && n != local_trans::u2a(sop.name.c_str(), CP_UTF8))
{
wchar_t info[128] = { 0 };
swprintf_s(info, _countof(info) - 1, L"Fix-ID <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԡ<EFBFBD>%s<><73><EFBFBD><EFBFBD>ͻ<EFBFBD><CDBB>", local_trans::a2u(n.c_str(), CP_UTF8).c_str());
::MessageBoxW(m_hWnd, info, NULL, MB_OK);
GotoDlgCtrl(GetDlgItem(IDC_EDIT_FIXED_ID));
return ;
}
for (auto& v : opts_)
{
if (v.fix_id == sop.fix_id)
{
if (v.name != sop.name)
{
wchar_t info[128] = { 0 };
swprintf_s(info, _countof(info) - 1, L"Fix-ID <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԡ<EFBFBD>%s<><73><EFBFBD><EFBFBD>ͻ<EFBFBD><CDBB>", v.title.c_str());
::MessageBoxW(m_hWnd, info, NULL, MB_OK);
GotoDlgCtrl(GetDlgItem(IDC_EDIT_FIXED_ID));
return;
}
}
else if (v.category == sop.category && v.category == L"ͼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" && v.pos == sop.pos)
{
wchar_t info[128] = { 0 };
swprintf_s(info, _countof(info) - 1, L"Position <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԡ<EFBFBD>%s<><73><EFBFBD><EFBFBD>ͻ<EFBFBD><CDBB>", v.title.c_str());
::MessageBoxW(m_hWnd, info, NULL, MB_OK);
GotoDlgCtrl(GetDlgItem(IDC_EDIT_POSITION));
return;
}
}
}
for (auto& v : opts_)
{
if (v.name == sop.name)
{
sop.range = std::move(v.range);
v = std::move(sop);
modify_tree_title(v.name.c_str(), v.title.c_str());
return;
}
}
insert_new_item(sop);
}
void CDlgOptJson::OnBnClickedButtonAdd()
{
// TODO: <20>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>ӿؼ<D3BF>֪ͨ<CDA8><D6AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - add depend items
//std::wstring opt(get_item_text(IDC_COMBO_PARENT)),
// logic(get_item_text(IDC_COMBO_LOGIC)),
// l(L""), u(L"");
//int ind = 0;
//
//for (auto& v : opts_)
//{
// if (v.title == opt)
// {
// opt = v.name;
// break;
// }
//}
//
//if (lower_.IsWindowVisible())
// l = get_item_text(IDC_COMBO_LOW);
//else
// l = get_item_text(IDC_EDIT_LOW);
//
//if (upper_.IsWindowVisible())
// u = get_item_text(IDC_COMBO_BIG);
//else if (GetDlgItem(IDC_EDIT_BIG)->IsWindowVisible())
// u = get_item_text(IDC_EDIT_BIG);
//
//if (logic == L"enabled" || logic == L"!enabled")
//{
// opt += L"." + logic;
//}
//else if (logic == L"between")
//{
// opt += L"==[" + l + L"," + u + L"]";
//}
//else if (logic == L"out of")
//{
// opt += L"!=[" + l + L"," + u + L"]";
//}
//else
//{
// opt += logic + l;
//}
//
//u = get_item_text(IDC_EDIT_LOGIC);
//if (!u.empty())
// u += L" || ";
//u += opt;
//SetDlgItemText(IDC_EDIT_LOGIC, u.c_str());
//
//ind = depends_.FindStringExact(-1, opt.c_str());
//if (ind == -1)
//{
// ind = depends_.AddString(opt.c_str());
//}
//depends_.SetCurSel(ind);
std::wstring text(get_item_text(IDC_EDIT_LOGIC)), name(get_item_text(IDC_EDIT_NAME));
CDlgCondition dlg(name.c_str());
auto get_opts = [&](int ind, int* type, int* range, std::wstring * name) -> std::wstring
{
if(ind < 0 || ind >= opts_.size())
return L"";
if (type)
{
if (opts_[ind].type == L"bool")
*type = SANE_TYPE_BOOL;
else if (opts_[ind].type == L"int")
*type = SANE_TYPE_INT;
else if (opts_[ind].type == L"float")
*type = SANE_TYPE_FIXED;
else if (opts_[ind].type == L"string")
*type = SANE_TYPE_STRING;
else if (opts_[ind].type == L"group")
*type = SANE_TYPE_GROUP;
else if (opts_[ind].type == L"button")
*type = SANE_TYPE_BUTTON;
else
*type = SANE_TYPE_INT;
}
if (range)
{
if (opts_[ind].range_type == L"range")
*range = SANE_CONSTRAINT_RANGE;
else if (opts_[ind].range_type == L"list")
*range = SANE_CONSTRAINT_STRING_LIST;
else
*range = SANE_CONSTRAINT_NONE;
}
if (name)
*name = opts_[ind].name;
return opts_[ind].title;
};
auto get_range = [&](const wchar_t* name, int ind) -> std::wstring
{
for (auto& v : opts_)
{
if (v.name == name)
{
if (ind >= 0 && ind < v.range.size())
{
if (v.type == L"bool")
return *(bool*)&v.range[ind].val[0] ? L"true" : L"false";
else if (v.type == L"int")
return std::to_wstring(*(int*)&v.range[ind].val[0]);
else if (v.type == L"float")
return std::to_wstring(*(double*)&v.range[ind].val[0]);
else if (v.type == L"string")
return (const wchar_t*)v.range[ind].val.c_str();
}
break;
}
}
return L"";
};
dlg.init_data(get_opts, get_range, text.c_str());
if (dlg.DoModal() == IDOK)
SetDlgItemText(IDC_EDIT_LOGIC, dlg.get_condition().c_str());
}
void CDlgOptJson::OnTvnSelchangedTree2(NMHDR* pNMHDR, LRESULT* pResult)
{
LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
// TODO: <20>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>ӿؼ<D3BF>֪ͨ<CDA8><D6AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
HTREEITEM item = tree_.GetSelectedItem();
if (item)
{
TVITEM tvi;
tvi.mask = TVIF_SELECTEDIMAGE;
tvi.iSelectedImage = 1;
tvi.hItem = item;
tree_.SetItem(&tvi);
wchar_t* name = (wchar_t*)tree_.GetItemData(item);
for (auto& v : opts_)
{
if (v.name == name)
{
to_ui(v);
break;
}
}
}
*pResult = 0;
}
#include "hgjsonDlg.h"
void CDlgOptJson::OnTvnKeydownTree2(NMHDR* pNMHDR, LRESULT* pResult)
{
LPNMTVKEYDOWN pTVKeyDown = reinterpret_cast<LPNMTVKEYDOWN>(pNMHDR);
// TODO: <20>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>ӿؼ<D3BF>֪ͨ<CDA8><D6AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*pResult = 0;
if (pTVKeyDown->wVKey != VK_UP && pTVKeyDown->wVKey != VK_DOWN)
return;
if (GetKeyState(VK_CONTROL) >= 0)
return;
HTREEITEM sel = tree_.GetSelectedItem(), neighbour = NULL;
wchar_t *n = NULL;
std::wstring name(ChgjsonDlg::get_tree_selected_item_text(&tree_, (DWORD_PTR*)&n));
int ind = 0;
for (auto& v : opts_)
{
if (v.title == name)
break;
ind++;
}
if (ind >= opts_.size())
return;
if (pTVKeyDown->wVKey == VK_DOWN)
{
neighbour = tree_.GetNextSiblingItem(sel);
if (neighbour)
{
tree_.DeleteItem(sel);
sel = tree_.InsertItem(name.c_str(), TVI_ROOT, neighbour);
tree_.SetItemData(sel, (DWORD_PTR)n);
SANEOPT so = opts_[ind];
opts_.erase(opts_.begin() + ind);
opts_.insert(opts_.begin() + ind + 1, so);
tree_.SelectItem(sel);
}
}
else if (pTVKeyDown->wVKey == VK_UP)
{
neighbour = tree_.GetPrevSiblingItem(sel);
if (neighbour)
{
neighbour = tree_.GetPrevSiblingItem(neighbour);
if (!neighbour)
neighbour = TVI_FIRST;
tree_.DeleteItem(sel);
sel = tree_.InsertItem(name.c_str(), TVI_ROOT, neighbour);
tree_.SetItemData(sel, (DWORD_PTR)n);
SANEOPT so = opts_[ind];
opts_.erase(opts_.begin() + ind);
opts_.insert(opts_.begin() + ind - 1, so);
tree_.SelectItem(sel);
}
}
}
void CDlgOptJson::OnNMRClickTree2(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: <20>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>ӿؼ<D3BF>֪ͨ<CDA8><D6AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*pResult = 0;
POINT pt = { 0 };
HTREEITEM hsel = tree_.GetSelectedItem();
tree_menu_.EnableMenuItem(ID_TREE_ADDGROUP, MF_DISABLED);
tree_menu_.EnableMenuItem(ID_TREE_ADDITEM, MF_DISABLED);
tree_menu_.EnableMenuItem(ID_TREE_ADDPRODUCT, MF_DISABLED);
tree_menu_.EnableMenuItem(ID_TREE_DELITEM, MF_DISABLED);
tree_menu_.EnableMenuItem(ID_TREE_RENAME, MF_DISABLED);
tree_menu_.EnableMenuItem(ID_TREE_TOOLTIPS, MF_DISABLED);
tree_menu_.EnableMenuItem(ID_TREE_EXPORTCHAR, MF_DISABLED);
tree_menu_.EnableMenuItem(ID_TREE_UNIFYSEQUENCE, MF_DISABLED);
if (hsel)
{
tree_menu_.EnableMenuItem(ID_TREE_DELITEM, MF_ENABLED);
}
GetCursorPos(&pt);
tree_menu_.GetSubMenu(0)->TrackPopupMenu(0, pt.x, pt.y, this);
}
void CDlgOptJson::OnTvnSelchangingTree2(NMHDR* pNMHDR, LRESULT* pResult)
{
LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
// TODO: <20>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>ӿؼ<D3BF>֪ͨ<CDA8><D6AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
HTREEITEM hsel = tree_.GetSelectedItem();
if (hsel)
{
}
*pResult = 0;
}
void CDlgOptJson::OnTreeLoadfile()
{
// TODO: <20>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EEB4A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
file_util::PATHFILE path = { 0 };
if (file_util::browser_file(m_hWnd, &path))
{
load_from_file(path.path);
}
}
void CDlgOptJson::OnTreeLoadclipboard()
{
// TODO: <20>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EEB4A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
OnPaste();
}
void CDlgOptJson::OnLbnDblclkListDepend()
{
// TODO: <20>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>ӿؼ<D3BF>֪ͨ<CDA8><D6AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int sel = depends_.GetCurSel();
if (sel >= 0 && sel < depends_.GetCount())
depends_.DeleteString(sel);
}
void CDlgOptJson::OnBnClickedButtonSet()
{
// TODO: <20>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>ӿؼ<D3BF>֪ͨ<CDA8><D6AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::wstring val(get_item_text(IDC_COMBO_RANGE)), name(get_item_text(IDC_EDIT_NAME));
CDlgRange dlg(name.c_str(), val == L"list", this);
SANEOPT opt;
val = get_item_text(IDC_EDIT_NAME);
if (val.empty())
{
MessageBox(TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ψһ<EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD>Name<EFBFBD>ֶ<EFBFBD>ֵ<EFBFBD><EFBFBD>"));
GotoDlgCtrl(GetDlgItem(IDC_EDIT_NAME));
return;
}
opt.name = val;
for (auto& v : opts_)
{
if (v.name == val)
{
opt = v;
break;
}
}
val = get_item_text(IDC_COMBO_DATA_TYPE);
if (!opt.name.empty())
{
if (val == L"int")
{
for (auto& v : opt.def_val)
{
CDlgRange::CONDVAL cv;
cv.cond = local_trans::a2u(v.cond.c_str(), CP_UTF8);
cv.val = std::to_wstring(*(int*)v.val.c_str());
dlg.init_.push_back(cv);
}
for (auto& v : opt.range)
{
CDlgRange::CONDVAL cv;
cv.cond = local_trans::a2u(v.cond.c_str(), CP_UTF8);
if (known_name::is_sane_name(v.val))
cv.val = local_trans::a2u(v.val.c_str(), CP_UTF8);
else
cv.val = std::to_wstring(*(int*)v.val.c_str());
dlg.vals_.push_back(cv);
}
}
else if (val == L"float")
{
for (auto& v : opt.def_val)
{
CDlgRange::CONDVAL cv;
cv.cond = local_trans::a2u(v.cond.c_str(), CP_UTF8);
cv.val = std::to_wstring(*(double*)v.val.c_str());
dlg.init_.push_back(cv);
}
for (auto& v : opt.range)
{
CDlgRange::CONDVAL cv;
cv.cond = local_trans::a2u(v.cond.c_str(), CP_UTF8);
if (known_name::is_sane_name(v.val))
cv.val = local_trans::a2u(v.val.c_str(), CP_UTF8);
else
cv.val = std::to_wstring(*(double*)v.val.c_str());
dlg.vals_.push_back(cv);
}
}
else
{
int len = 0;
for (auto& v : opt.def_val)
{
CDlgRange::CONDVAL cv;
cv.cond = local_trans::a2u(v.cond.c_str(), CP_UTF8);
cv.val = (const wchar_t*)v.val.c_str();
if (len < cv.val.length())
len = cv.val.length();
dlg.init_.push_back(cv);
}
for (auto& v : opt.range)
{
CDlgRange::CONDVAL cv;
cv.cond = local_trans::a2u(v.cond.c_str(), CP_UTF8);
cv.val = (const wchar_t*)v.val.c_str();
if (len < cv.val.length())
len = cv.val.length();
dlg.vals_.push_back(cv);
}
len *= 3;
len += 7;
len /= 4;
len *= 4;
SetDlgItemInt(IDC_EDIT_SIZE, len);
}
}
auto get_opts = [&](int ind, int* type, int* range, std::wstring* name) -> std::wstring
{
if (ind < 0 || ind >= opts_.size())
return L"";
if (type)
{
if (opts_[ind].type == L"bool")
*type = SANE_TYPE_BOOL;
else if (opts_[ind].type == L"int")
*type = SANE_TYPE_INT;
else if (opts_[ind].type == L"float")
*type = SANE_TYPE_FIXED;
else if (opts_[ind].type == L"string")
*type = SANE_TYPE_STRING;
else if (opts_[ind].type == L"group")
*type = SANE_TYPE_GROUP;
else if (opts_[ind].type == L"button")
*type = SANE_TYPE_BUTTON;
else
*type = SANE_TYPE_INT;
}
if (range)
{
if (opts_[ind].range_type == L"range")
*range = SANE_CONSTRAINT_RANGE;
else if (opts_[ind].range_type == L"list")
*range = SANE_CONSTRAINT_STRING_LIST;
else
*range = SANE_CONSTRAINT_NONE;
}
if (name)
*name = opts_[ind].name;
return opts_[ind].title;
};
auto get_range = [&](const wchar_t* name, int ind) -> std::wstring
{
for (auto& v : opts_)
{
if (v.name == name)
{
if (ind >= 0 && ind < v.range.size())
{
if (v.type == L"bool")
return *(bool*)&v.range[ind].val[0] ? L"true" : L"false";
else if (v.type == L"int")
return std::to_wstring(*(int*)&v.range[ind].val[0]);
else if (v.type == L"float")
return std::to_wstring(*(double*)&v.range[ind].val[0]);
else if (v.type == L"string")
return (const wchar_t*)v.range[ind].val.c_str();
}
break;
}
}
return L"";
};
dlg.set_init_val_api(INIT_VAL_API_PROTO(), get_opts, get_range);
if (dlg.DoModal() == IDOK)
{
opt.def_val.clear();
if (val == L"int")
{
for (auto& v : dlg.init_)
{
CONDVAL cv;
cv.cond = local_trans::u2a(v.cond.c_str(), CP_UTF8);
int n = _wtoi(v.val.c_str());
cv.val = std::string((char*)&n, sizeof(n));
opt.def_val.push_back(cv);
}
opt.range.clear();
for (auto& v : dlg.vals_)
{
CONDVAL cv;
int n = _wtoi(v.val.c_str());
if (known_name::is_sane_name(v.val))
cv.val = local_trans::u2a(v.val.c_str(), CP_UTF8);
else
cv.val = std::string((char*)&n, sizeof(n));
cv.cond = local_trans::u2a(v.cond.c_str(), CP_UTF8);
opt.range.push_back(cv);
}
}
else if (val == L"float")
{
for (auto& v : dlg.init_)
{
CONDVAL cv;
cv.cond = local_trans::u2a(v.cond.c_str(), CP_UTF8);
double n = _wtof(v.val.c_str());
cv.val = std::string((char*)&n, sizeof(n));
opt.def_val.push_back(cv);
}
opt.range.clear();
for (auto& v : dlg.vals_)
{
CONDVAL cv;
double n = _wtof(v.val.c_str());
if (known_name::is_sane_name(v.val))
cv.val = local_trans::u2a(v.val.c_str(), CP_UTF8);
else
cv.val = std::string((char*)&n, sizeof(n));
//cv.val = std::string((char*)&n, sizeof(n));
cv.cond = local_trans::u2a(v.cond.c_str(), CP_UTF8);
opt.range.push_back(cv);
}
}
else
{
opt.size = 0;
for (auto& v : dlg.init_)
{
CONDVAL cv;
cv.cond = local_trans::u2a(v.cond.c_str(), CP_UTF8);
cv.val = std::string((const char*)v.val.c_str(), v.val.length() * 2 + 2);
opt.def_val.push_back(cv);
if (opt.size < v.val.length())
opt.size = v.val.length();
}
opt.range.clear();
for (auto& v : dlg.vals_)
{
CONDVAL cv;
cv.val = std::string((const char*)v.val.c_str(), v.val.length() * 2 + 2);
cv.cond = local_trans::u2a(v.cond.c_str(), CP_UTF8);
opt.range.push_back(cv);
if (opt.size < v.val.length())
opt.size = v.val.length();
}
opt.size *= 3;
opt.size += 7;
opt.size /= 4;
opt.size *= 4;
}
// add or insert ...
for (auto& v : opts_)
{
if (v.name == opt.name)
{
from_ui(v);
v.range = opt.range;
v.def_val = opt.def_val;
to_ui(v);
return;
}
}
SANEOPT so;
from_ui(so);
so.range = opt.range;
so.def_val = opt.def_val;
insert_new_item(so);
to_ui(so);
}
}
void CDlgOptJson::OnTreeDelitem()
{
// TODO: <20>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EEB4A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
HTREEITEM item = tree_.GetSelectedItem();
if (item)
{
wchar_t* name = (wchar_t*)tree_.GetItemData(item);
if (MessageBox(TEXT("ȷ<EFBFBD><EFBFBD>Ҫɾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"), name, MB_YESNO) == IDYES)
{
delete_from_tree(name);
}
}
}
void CDlgOptJson::OnBnClickedButtonExport()
{
// TODO: <20>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>ӿؼ<D3BF>֪ͨ<CDA8><D6AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::wstring type(get_item_text(IDC_COMBO_EXPORT)),
cont(get_json_text(type == L"\u683C\u5F0F\u6587\u672C" ? L"\t" : NULL));
if (cont.empty())
{
MessageBox(TEXT("No content has been serialized! change exporting type and try again."), NULL, MB_OK | MB_ICONERROR);
return;
}
if (type == L"\u4EE3\u7801\u6587\u672C")
{
size_t pos = cont.find(L"\\");
while (pos++ != std::wstring::npos)
{
cont.insert(pos++, L"\\");
pos = cont.find(L"\\", pos);
}
pos = cont.find(L"\"");
while (pos != std::wstring::npos)
{
cont.insert(pos, L"\\");
pos = cont.find(L"\"", pos + 2);
}
// segmention up to 10 * 1024
int line_len = 10 * 1024,
ind = 0;
std::wstring pre(L"static std::string device_opt_json[] = {\r\n\t\"");
cont.insert(0, pre);
pos = pre.length();
while (cont.length() - pos > line_len)
{
if (cont[pos + line_len - 1] == L'\\')
{
pos--;
while (cont[pos + line_len] == L'\\')
pos--;
}
pos += line_len;
cont.insert(pos, L"\",\r\n\t\"");
pos += 5; // ");\r\n
}
cont += L"\"\r\n};\r\n";
}
else if (type == L"\u5916\u90E8\u914D\u7F6E.hsc")
{
//std::wstring name(L"\u8BF7\u75284\u4F4DPID\u66FF\u6362.hsc");
//std::string txt(local_trans::u2a(cont.c_str(), CP_UTF8)), ansi("");
//wchar_t path[MAX_PATH] = { 0 };
//GetModuleFileNameW(NULL, path, _countof(path) - 1);
//wcsrchr(path, L'\\')[1] = 0;
//name.insert(0, path);
//ansi = local_trans::u2a(name.c_str(), CP_ACP);
//if (save_scanner_setting(ansi.c_str(), txt) == 0)
// file_util::display_file_in_explorer(name.c_str());
return;
}
int n = file_util::set_clipboard(cont.c_str(), cont.length() * 2, CF_UNICODETEXT);
MessageBox(TEXT("JSON text has set to clipboard already"), std::to_wstring(cont.length()).c_str());
}
void CDlgOptJson::OnTreeModifyallfield()
{
// TODO: <20>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EEB4A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// Group;Category;Affect;Version;Position;Readonly;Public;Enabled;Depends;
std::wstring name(get_item_text(IDC_EDIT_NAME));
CDlgRange dlg(name.c_str(), CDlgRange::TYPE_FIELDS, this);
auto init_val = [&](const wchar_t* field, CComboBox* box) -> void
{
std::wstring n(field);
wchar_t text[256] = { 0 };
int l = 0;
box->ResetContent();
box->EnableWindow(); // 0x50010302
// ::SetWindowLong(box->m_hWnd, GWL_STYLE, (LONG)0x50010302);
if (n == L"Group")
{
for (int i = 0; i < group_.GetCount(); ++i)
{
l = group_.GetLBText(i, text);
text[l] = 0;
box->AddString(text);
}
}
else if (n == L"Category")
{
for (int i = 0; i < cat_.GetCount(); ++i)
{
l = cat_.GetLBText(i, text);
text[l] = 0;
box->AddString(text);
}
}
else if (n == L"Depends")
{
box->AddString(L"none");
box->SetCurSel(0);
box->EnableWindow(FALSE);
}
else if (n == L"Affect")
{
for (int i = 0; i < affect_.GetCount(); ++i)
{
l = affect_.GetLBText(i, text);
text[l] = 0;
box->AddString(text);
}
}
else if (n == L"Version")
{
box->AddString(L"1");
box->SetCurSel(0);
}
else if (n == L"Position")
{
box->AddString(L"-1");
box->SetCurSel(0);
}
else if (n == L"Readonly")
{
box->AddString(L"false");
box->AddString(L"true");
//::SetWindowLong(box->m_hWnd, GWL_STYLE, (LONG)0x50010203);
}
else if (n == L"Public")
{
box->AddString(L"false");
box->AddString(L"true");
//::SetWindowLong(box->m_hWnd, GWL_STYLE, (LONG)0x50010203);
}
else if (n == L"Enabled")
{
box->AddString(L"false");
box->AddString(L"true");
//::SetWindowLong(box->m_hWnd, GWL_STYLE, (LONG)0x50010203);
}
};
auto get_opts = [&](int ind, int* type, int* range, std::wstring* name) -> std::wstring
{
if (ind < 0 || ind >= opts_.size())
return L"";
if (type)
{
if (opts_[ind].type == L"bool")
*type = SANE_TYPE_BOOL;
else if (opts_[ind].type == L"int")
*type = SANE_TYPE_INT;
else if (opts_[ind].type == L"float")
*type = SANE_TYPE_FIXED;
else if (opts_[ind].type == L"string")
*type = SANE_TYPE_STRING;
else if (opts_[ind].type == L"group")
*type = SANE_TYPE_GROUP;
else if (opts_[ind].type == L"button")
*type = SANE_TYPE_BUTTON;
else
*type = SANE_TYPE_INT;
}
if (range)
{
if (opts_[ind].range_type == L"range")
*range = SANE_CONSTRAINT_RANGE;
else if (opts_[ind].range_type == L"list")
*range = SANE_CONSTRAINT_STRING_LIST;
else
*range = SANE_CONSTRAINT_NONE;
}
if (name)
*name = opts_[ind].name;
return opts_[ind].title;
};
auto get_range = [&](const wchar_t* name, int ind) -> std::wstring
{
for (auto& v : opts_)
{
if (v.name == name)
{
if (ind >= 0 && ind < v.range.size())
{
if (v.type == L"bool")
return *(bool*)&v.range[ind].val[0] ? L"true" : L"false";
else if (v.type == L"int")
return std::to_wstring(*(int*)&v.range[ind].val[0]);
else if (v.type == L"float")
return std::to_wstring(*(double*)&v.range[ind].val[0]);
else if (v.type == L"string")
return (const wchar_t*)v.range[ind].val.c_str();
}
break;
}
}
return L"";
};
dlg.set_init_val_api(init_val, get_opts, get_range);
if (dlg.DoModal() == IDOK)
{
std::wstring n(dlg.vals_[0].val),
val(dlg.init_[0].val);
if (n == L"Group")
{
for (auto& v : opts_)
v.group = val;
}
else if (n == L"Category")
{
for (auto& v : opts_)
v.category = val;
}
else if (n == L"Depends")
{
//for (auto& v : opts_)
// v.depend_oper = val;
}
else if (n == L"Affect")
{
for (auto& v : opts_)
v.affect = val;
}
else if (n == L"Version")
{
for (auto& v : opts_)
v.ver = _wtoi(val.c_str());
}
else if (n == L"Position")
{
for (auto& v : opts_)
v.pos = _wtoi(val.c_str());
}
else if (n == L"Readonly")
{
for (auto& v : opts_)
v.readonly = val == L"true";
}
else if (n == L"Public")
{
for (auto& v : opts_)
{
CONDVAL cv;
int visb = val == L"true" ? OPT_VISIBLE_ALL : OPT_VISIBLE_HIDE;
cv.val = std::string((char*)&visb, sizeof(visb));
v.visible.clear();
v.visible.push_back(cv);
}
}
else if (n == L"Enabled")
{
for (auto& v : opts_)
v.enable = val == L"true";
}
HTREEITEM sel = tree_.GetSelectedItem();
if (sel)
{
wchar_t* n = (wchar_t*)tree_.GetItemData(sel);
for (auto& v : opts_)
{
if (v.name == n)
{
to_ui(v);
break;
}
}
}
}
}
HBRUSH CDlgOptJson::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: <20>ڴ˸<DAB4><CBB8><EFBFBD> DC <20><><EFBFBD>κ<EFBFBD><CEBA><EFBFBD><EFBFBD><EFBFBD>
// TODO: <20><><EFBFBD><EFBFBD>Ĭ<EFBFBD>ϵIJ<CFB5><C4B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD><CAA3>򷵻<EFBFBD><F2B7B5BB><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
return hbr;
}
LRESULT CDlgOptJson::OnStaticColor(WPARAM wp, LPARAM lp)
{
::SetBkMode((HDC)wp, TRANSPARENT);
if (GetDlgItem(IDC_STATIC_CNT)->m_hWnd == (HWND)lp)
::SetTextColor((HDC)wp, RGB(192, 64, 240));
return (LRESULT)GetSysColorBrush(COLOR_3DFACE);
}
void CDlgOptJson::OnSortName()
{
// TODO: <20>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EEB4A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
HTREEITEM sel = tree_.GetSelectedItem();
std::wstring name(L"");
std::vector<SANEOPT> all(std::move(opts_));
std::sort(all.begin(), all.end(), SANEOPT::compare_name);
if (sel)
{
wchar_t* n = (wchar_t*)tree_.GetItemData(sel);
if (n)
name = n;
}
delete_from_tree();
for (auto& v : all)
insert_new_item(v, v.name == name);
}
void CDlgOptJson::OnSortTitle()
{
// TODO: <20>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EEB4A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
HTREEITEM sel = tree_.GetSelectedItem();
std::wstring name(L"");
std::vector<SANEOPT> all(std::move(opts_));
std::sort(all.begin(), all.end(), SANEOPT::compare_title);
if (sel)
{
wchar_t* n = (wchar_t*)tree_.GetItemData(sel);
if (n)
name = n;
}
delete_from_tree();
for (auto& v : all)
insert_new_item(v, v.name == name);
}
void CDlgOptJson::OnSortGroup()
{
// TODO: <20>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EEB4A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
HTREEITEM sel = tree_.GetSelectedItem();
std::wstring name(L"");
std::vector<SANEOPT> all(std::move(opts_));
std::sort(all.begin(), all.end(), SANEOPT::compare_group);
if (sel)
{
wchar_t* n = (wchar_t*)tree_.GetItemData(sel);
if (n)
name = n;
}
delete_from_tree();
for (auto& v : all)
insert_new_item(v, v.name == name);
}
void CDlgOptJson::OnSortPosition()
{
// TODO: <20>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EEB4A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
HTREEITEM sel = tree_.GetSelectedItem();
std::wstring name(L"");
std::vector<SANEOPT> all(std::move(opts_));
std::sort(all.begin(), all.end(), SANEOPT::compare_position);
if (sel)
{
wchar_t* n = (wchar_t*)tree_.GetItemData(sel);
if (n)
name = n;
}
delete_from_tree();
for (auto& v : all)
insert_new_item(v, v.name == name);
}
void CDlgOptJson::OnBnClickedButtonSetVisible()
{
// TODO: <20>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>ӿؼ<D3BF>֪ͨ<CDA8><D6AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ɼ<EFBFBD><C9BC>ɷ<EFBFBD><C9B7><EFBFBD>;<3B><><EFBFBD>ɷ<EFBFBD><C9B7><EFBFBD>;<3B><><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD>ɷ<EFBFBD><C9B7><EFBFBD>;
std::wstring name(get_item_text(IDC_EDIT_NAME));
CDlgRange dlg(name.c_str(), CDlgRange::TYPE_VISIBLE, this);
std::vector<std::wstring> vals;
SANEOPT opt;
if (name.empty())
{
MessageBox(TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ψһ<EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD>Name<EFBFBD>ֶ<EFBFBD>ֵ<EFBFBD><EFBFBD>"));
GotoDlgCtrl(GetDlgItem(IDC_EDIT_NAME));
return;
}
opt.name = name;
for (auto& v : opts_)
{
if (v.name == name)
{
opt = v;
break;
}
}
auto get_opts = [&](int ind, int* type, int* range, std::wstring* name) -> std::wstring
{
if (ind < 0 || ind >= opts_.size())
return L"";
if (type)
{
if (opts_[ind].type == L"bool")
*type = SANE_TYPE_BOOL;
else if (opts_[ind].type == L"int")
*type = SANE_TYPE_INT;
else if (opts_[ind].type == L"float")
*type = SANE_TYPE_FIXED;
else if (opts_[ind].type == L"string")
*type = SANE_TYPE_STRING;
else if (opts_[ind].type == L"group")
*type = SANE_TYPE_GROUP;
else if (opts_[ind].type == L"button")
*type = SANE_TYPE_BUTTON;
else
*type = SANE_TYPE_INT;
}
if (range)
{
if (opts_[ind].range_type == L"range")
*range = SANE_CONSTRAINT_RANGE;
else if (opts_[ind].range_type == L"list")
*range = SANE_CONSTRAINT_STRING_LIST;
else
*range = SANE_CONSTRAINT_NONE;
}
if (name)
*name = opts_[ind].name;
return opts_[ind].title;
};
auto get_range = [&](const wchar_t* name, int ind) -> std::wstring
{
for (auto& v : opts_)
{
if (v.name == name)
{
if (ind >= 0 && ind < v.range.size())
{
if (v.type == L"bool")
return *(bool*)&v.range[ind].val[0] ? L"true" : L"false";
else if (v.type == L"int")
return std::to_wstring(*(int*)&v.range[ind].val[0]);
else if (v.type == L"float")
return std::to_wstring(*(double*)&v.range[ind].val[0]);
else if (v.type == L"string")
return (const wchar_t*)v.range[ind].val.c_str();
}
break;
}
}
return L"";
};
for (auto& v : known_name::g_visible)
vals.push_back(v.title);
dlg.set_init_val_api(INIT_VAL_API_PROTO(), get_opts, get_range);
dlg.set_visible_values(vals);
for (auto& v: opt.visible)
{
CDlgRange::CONDVAL cv;
cv.cond = local_trans::a2u(v.cond.c_str(), CP_UTF8);
cv.val = known_name::visible_title(*(int*)v.val.c_str());
dlg.vals_.push_back(cv);
}
if (dlg.DoModal() == IDOK)
{
opt.visible.clear();
for (auto& v : dlg.vals_)
{
CONDVAL cv;
int nv = known_name::visible_type(v.val.c_str());
cv.cond = local_trans::u2a(v.cond.c_str(), CP_UTF8);
cv.val = std::string((char*)&nv, sizeof(nv));
opt.visible.push_back(cv);
}
for (auto& v : opts_)
{
if (v.name == name)
{
v = opt;
break;
}
}
to_ui(opt);
}
}
#include "../../../../code_device/sdk/sane_opt_json/base_opt.h"
namespace test_sane_ui
{
static struct paper_size
{
std::string paper;
SIZE size;
}g_paper_size[] =
{
{"A3", {297, 420}},
{"A4", {210, 297}},
{"A5", {148, 210}},
{"A6", {105, 148}},
{"B4", {257, 364}},
{"B5", {176, 250}}, // {PAPER_B5, {182, 257}},
{"B6", {125, 176}},
{"8K", {297, 420}},
{"16K", {210, 285}}, // {PAPER_16K, {185, 260}}
};
typedef struct _sane_objects
{
device_option *dev_opt;
sane_options *sane_opt;
}SANEOBJ, *LPSANEOBJ;
static void print_err(const char* msg)
{
std::string err("Error: ");
err += msg;
err += "\r\n";
OutputDebugStringA(err.c_str());
}
class sane_box : public sane_opt_provider
{
SIZE paper_size_mm_{ 210, 297 };
public:
sane_box(char* json)
{
set_opt_json_text(json);
}
protected:
~sane_box()
{}
public:
virtual int set_value(const char* name, void* val)
{
if (strcmp(name, SANE_STD_OPT_NAME_PAPER) == 0)
{
paper_size_mm_.cx = 210.f;
paper_size_mm_.cy = 297.f;
for (auto& v : g_paper_size)
{
if (v.paper == (char*)val)
{
paper_size_mm_ = v.size;
break;
}
}
}
return SCANNER_ERR_OK;
}
std::string get_value(const char* name, void* value, int* err)
{
std::string val("");
int result = SCANNER_ERR_OK, nv = 0;
if (strcmp(name, SANE_STD_OPT_NAME_PAPER_W) == 0)
{
double w = paper_size_mm_.cx;
val = std::string((char*)&w, sizeof(w));
}
else if (strcmp(name, SANE_STD_OPT_NAME_PAPER_H) == 0)
{
double h = paper_size_mm_.cy;
val = std::string((char*)&h, sizeof(h));
}
else
{
result = SCANNER_ERR_DEVICE_NOT_SUPPORT;
}
if (err)
*err = result;
return std::move(val);
}
};
SANE_Status sane_get_devices_api(const SANE_Device*** device_list, SANE_Bool local_only)
{
return SANE_STATUS_GOOD;
}
SANE_Status sane_open_api(SANE_String_Const devicename, SANE_Handle* handle)
{
return SANE_STATUS_GOOD;
}
void sane_close_api(SANE_Handle handle)
{}
const SANE_Option_Descriptor* sane_get_option_descriptor_api(SANE_Handle handle, SANE_Int option)
{
LPSANEOBJ sane = (LPSANEOBJ)handle;
return sane->sane_opt->get_opt_descriptor((void*)option);
}
SANE_Status sane_control_option_api(SANE_Handle handle, SANE_Int option, SANE_Action action, void* value, SANE_Int* info)
{
LPSANEOBJ sane = (LPSANEOBJ)handle;
SANE_Option_Descriptor* desc = sane->sane_opt->get_opt_descriptor((void*)option);
SANE_Value_Type type = desc->type;
void* fixed = value;
if (type == SANE_TYPE_FIXED)
{
fixed = new double[1];
*(double*)fixed = SANE_UNFIX(*(SANE_Fixed*)value);
}
if (action == SANE_ACTION_SET_VALUE)
{
bool modify = sane->dev_opt->refine_data(desc->name, fixed);
int err = sane->dev_opt->update_data(desc->name, fixed);
if (err == SCANNER_ERR_RELOAD_OPT_PARAM)
{
std::string text(sane->dev_opt->get_option_value(nullptr, SANE_ACTION_GET_ENTIRE_JSON));
{
wchar_t path[MAX_PATH] = { 0 };
std::wstring file(L"");
GetModuleFileNameW(NULL, path, _countof(path) - 1);
file = path;
file += L"-" + local_trans::a2u(desc->name, CP_UTF8) + L".txt";
file_util::save_2_file(text.c_str(), text.length(), file.c_str());
}
sane->sane_opt->init_from(text.c_str(), print_err, false);
err = 0;
if (info)
*info = SANE_INFO_RELOAD_OPTIONS;
}
}
else if (action == SANE_ACTION_GET_VALUE)
{
std::string val(sane->dev_opt->get_option_value(desc->name, SANE_ACTION_GET_VALUE));
memcpy(fixed, val.c_str(), val.length());
}
if (type == SANE_TYPE_FIXED)
{
*(SANE_Fixed*)value = SANE_FIX(*(double*)fixed);
delete[] fixed;
}
return SANE_STATUS_GOOD;
}
SANE_Status sane_get_parameters_api(SANE_Handle handle, SANE_Parameters* params)
{
return SANE_STATUS_GOOD;
}
SANE_Status sane_start_api(SANE_Handle handle)
{
return SANE_STATUS_GOOD;
}
SANE_Status sane_read_api(SANE_Handle handle, SANE_Byte* data, SANE_Int max_length, SANE_Int* length)
{
return SANE_STATUS_GOOD;
}
void sane_cancel_api(SANE_Handle handle)
{
}
SANE_Status sane_set_io_mode_api(SANE_Handle handle, SANE_Bool non_blocking)
{
return SANE_STATUS_GOOD;
}
SANE_Status sane_get_select_fd_api(SANE_Handle handle, SANE_Int* fd)
{
return SANE_STATUS_GOOD;
}
SANE_String_Const sane_strstatus_api(SANE_Status status)
{
return "";
}
SANE_Status sane_io_control_api(SANE_Handle h, unsigned long code, void* data, unsigned* len)
{
return SANE_STATUS_GOOD;
}
SANE_Status sane_init_api(SANE_Int* version_code, SANE_Auth_Callback authorize)
{
return SANE_STATUS_GOOD;
}
void sane_exit_api(void)
{}
void init_api(LPSANEAPI api)
{
#define SET_API(to) api->##to = to;
SET_API(sane_cancel_api);
SET_API(sane_close_api);
SET_API(sane_control_option_api);
SET_API(sane_exit_api);
SET_API(sane_get_devices_api);
SET_API(sane_get_option_descriptor_api);
SET_API(sane_get_parameters_api);
SET_API(sane_get_select_fd_api);
SET_API(sane_init_api);
SET_API(sane_io_control_api);
SET_API(sane_open_api);
SET_API(sane_read_api);
SET_API(sane_set_io_mode_api);
SET_API(sane_start_api);
SET_API(sane_strstatus_api);
}
static std::vector<gb_json*> g_objects;
static int max_objects = 0;
static void record_json_objects(gb_json* jsn, bool add, void* param)
{
std::vector<gb_json*>::iterator it = std::find(g_objects.begin(), g_objects.end(), jsn);
if (it == g_objects.end())
{
if (add)
{
g_objects.push_back(jsn);
if (max_objects < g_objects.size())
max_objects = g_objects.size();
}
}
else if (!add)
g_objects.erase(it);
}
}
void CDlgOptJson::OnBnClickedButtonShowui()
{
// TODO: <20>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>ӿؼ<D3BF>֪ͨ<CDA8><D6AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::wstring text(get_json_text());
std::string utf8(local_trans::u2a(text.c_str(), CP_UTF8));
test_sane_ui::SANEOBJ sane;
#ifdef DUMP_JSON_OBJECT_LIFE
set_gbjson_life_callback(test_sane_ui::record_json_objects, nullptr);
#endif
{
gb_json* jsn = new gb_json();
if (jsn->attach_text(&utf8[0]))
{
std::string tmp(jsn->to_string()), cp("");
int cmp = strcmp(utf8.c_str(), tmp.c_str());
for (int i = 0; i < 10; ++i)
{
if (jsn->attach_text(&tmp[0]))
{
cp = jsn->to_string();
cmp = strcmp(cp.c_str(), tmp.c_str());
}
}
}
jsn->release();
}
int n = file_util::set_clipboard(text.c_str(), text.length() * 2, CF_UNICODETEXT);
_CrtMemState bgn = { 0 }, diff = { 0 }, over = { 0 };
_CrtMemCheckpoint(&bgn);
sane.dev_opt = new device_option();
sane.sane_opt = new sane_options();
test_sane_ui::sane_box* box = new test_sane_ui::sane_box(&utf8[0]);
text.clear();
if (sane.dev_opt->add(box))
{
utf8 = sane.dev_opt->get_option_value(nullptr, SANE_ACTION_GET_ENTIRE_JSON);
if (sane.sane_opt->init_from(utf8.c_str(), test_sane_ui::print_err, true))
{
SANEAPI api = { 0 };
test_sane_ui::init_api(&api);
{
dlg_setting dlg(::GetParent(m_hWnd), &api, (SANE_Handle)&sane, false, L"Test", true);
dlg.do_modal(::GetParent(m_hWnd));
}
}
}
sane.dev_opt->release();
delete sane.sane_opt;
box->release();
_CrtMemDumpAllObjectsSince(&bgn);
}