Compare commits

...

65 Commits

Author SHA1 Message Date
e28499b26f 版本号升级至2.2.6,新增版本说明弹窗功能
- 升级程序不再使用缓存文件,避免上一次下载的程序不完整
2025-07-04 11:35:30 +08:00
5c52c1a87a 版本号升级至2.2.5,FormWebView 隐藏窗口图标 2025-06-20 16:52:03 +08:00
16c24c10ec 启用多项功能开关,优化查找方法参数与健壮性
本次提交主要包括:
- 优化查找相关方法(FindBySentence、FindTextInRange),新增 prevOffset 和 findStart 参数,支持从指定偏移量和位置开始查找,提升查找灵活性与准确性(DocumentUtil.cs)
2025-06-05 23:51:36 +08:00
fc3773b65d 更新配置常量与调试代码调整
1. 在 `Config.cs` 中新增多个环境常量字符串:
   - 新增 `ALL_IN_ONE`、`PRE` 和新的 `PROD` 常量。
   - 删除旧的 `PROD` 常量,原值为 `"http://aijdw1.goldmye.com/"`。
2. 调整 `WEB_PATH` 的值:
   - `#if DEBUG` 下改为 `AppServer.PRE`。
   - 非 `DEBUG` 下保持为 `AppServer.PROD`。
3. 在 `Tools.cs` 中注释掉两行 `Debug.WriteLine` 调试代码,减少不必要的调试输出。
2025-05-21 11:29:36 +08:00
ff9a25d437 Bridge.cs 中,向 data 字典新增 BuildVersion 键值对。 2025-05-19 19:58:14 +08:00
8284a9d552 break: ActiveDocument 改为实时获取
优化调试逻辑,增强日志记录,简化代码结构

- 修改 AIProofread.csproj.user 的 <StartAction> 配置,调试时直接启动项目。
- Bridge.cs 中增加异常处理的详细错误信息。
- DocumentInfo.cs 增加日志记录,调整 RunInMainThread 方法逻辑。
- DocumentList.cs 删除过时的 XML 注释。
- ThisAddIn.cs 优化文档管理逻辑,调整 ActiveDocument 属性为只读,改进文档列表处理,删除冗余代码。
2025-05-09 16:59:27 +08:00
a54765e911 优化面板按钮逻辑
- 调整 `TaskPane_VisibleChanged` 方法逻辑,增加异步延迟处理和详细日志记录,修复 `CurrentDocument` 引用问题。
- 优化 `CheckBtnStatus` 方法,提升代码可读性并修正按钮状态逻辑。
- 改进 `TaskPane` 释放逻辑,增加对控件的重置操作。
2025-05-08 16:48:10 +08:00
32e85c62c0 优化日志记录、资源管理及功能支持
- 引入 log4net 库,统一日志记录方式,提升可维护性。
- 优化异常处理,增加详细日志记录,增强代码健壮性。
- 调整资源文件引用,新增图标资源,删除无用资源。
- 优化文档事件处理逻辑,改进面板显示与隐藏逻辑。
- 增加对 WPS 环境的支持,动态调整功能行为。
- 禁用部分功能(如常识性检测、客服、升级和帮助)。
- 删除冗余代码,清理注释,统一代码风格。
- 更新程序集版本至 2.2.5,改进调试与生产环境配置。
2025-05-08 13:57:12 +08:00
5b519f48e1 fixed: 修复首次加载插件面板初始化多个窗口或环境无法正确初始化 2025-04-23 18:02:17 +08:00
b1ace782f8 添加模块配置 2025-04-21 13:29:24 +08:00
d061406026 fix: 修正扩展初始化时面板没有初始化的问题 2025-04-19 18:36:27 +08:00
fa62b66a02 检测面板是否已经创建 2025-04-18 20:45:06 +08:00
5e4f692897 feat:版本改为2.2.5;消息提示框能够提示关闭消息;修复多处问题并优化功能实现 2025-04-17 16:53:32 +08:00
3c3ccb8847 feat: 更新程序集信息至 2.2.4 2025-04-15 22:13:43 +08:00
1644a1591f 添加版本 2025-04-15 17:22:25 +08:00
2bebf743ba feat: 日志底层组件采用log4net 2025-04-13 13:59:22 +08:00
fb2f5e0d16 feat:勘误表导出底层组件修改 2025-04-13 01:32:21 +08:00
cf148e9000 feat(ui): 调整FormLogin窗体和web控件尺寸
- 添加关闭事件,用于释放web资源
2025-04-09 21:24:45 +08:00
e52fd188b6 feat: 调整方法参数和文件保存逻辑 2025-04-03 23:36:38 +08:00
200f415ac6 perf: 📜️更新版本;对于特殊内容文档兼容 2025-03-30 14:28:18 +08:00
2b3e330841 feat: ️新增全局回调方法,优化修订模式处理
在 `Bridge.cs` 文件中:
- 修改 `ProcessStartInfo` 的 `Verb` 属性赋值方式,保持不变。
- 新增 `Callback` 方法,用于全局回调。
- 新增 `CheckInTrackRevisions` 方法,用于检查文档是否处于修订模式,并根据用户选择关闭修订模式或返回相应结果。
- 修改提示信息内容,并在用户选择不关闭修订模式时,返回相应错误信息。
- 调整 `JSONObject.Create()` 的链式调用格式。
- 调整 `InitProofreadCacheList` 方法的参数格式。

在 `FormMessage.cs` 文件中:
- 新增 `ShowMessage` 方法的重载版本,支持自定义确认和取消按钮的文本。

在 `DocumentInfo.cs` 文件中:
- 新增 `GlobalCallback` 方法,用于调用 Web 全局回调函数。

在 `ThisAddIn.cs` 文件中:
- 修改日志记录信息,增加文档修订模式的状态。
- 新增 `GlobalCallback` 方法,用于全局回调。
2025-03-29 21:25:19 +08:00
e8c18e6eb8 perf: 📜️强化常识性检测数据结构优化 2025-03-28 09:34:03 +08:00
342e32f49f fixed: 另存导致文档面板被关闭 2025-03-13 20:33:25 +08:00
d16d6d4671 fixed: ️修复文档关闭后再次打开展示多个面板 2025-03-10 16:46:47 +08:00
a296604f2c feat:新增模型选择 2025-03-06 22:35:04 +08:00
5013e10cb1 feat:添加模型选择菜单 2025-03-05 19:48:57 +08:00
31ee6d4894 fixed: 勘误表原文过长导致截取异常 2025-03-05 19:48:42 +08:00
03e0ffdce8 feat:客服调整;优化大文档及格式复杂文档卡片跳转卡顿 2025-03-05 15:36:24 +08:00
f418ec74e5 fixed: 修复ProofreadRangeInfo类丢失导致无法编译 2025-03-01 10:42:26 +08:00
e04d6104b2 feat: 添加并适配政务校对 2025-03-01 10:10:46 +08:00
d37882d6dd fixed: 校对后批注导致得百分号 2025-02-13 11:35:17 +08:00
b97e7d15ee 更新版本 2025-02-10 20:56:30 +08:00
d0126e6986 feat: 添加登录限制 2025-02-03 23:01:13 +08:00
c546fe21ef 批注导致校对产生百分号 2025-01-24 10:37:53 +08:00
90fc77b258 fixed: 勘误表顺序修复 2025-01-16 22:01:05 +08:00
907f4bc971 fixed: 细化按钮状态调整 2025-01-06 21:52:49 +08:00
22095404e0 fixed: 常识检测精确到选择位置;空格导致的查找失败. 2025-01-06 20:22:18 +08:00
94e7327dce fixed: 勘误表内容居中及定位错误;全角与半角空格导致定位不正确 2025-01-06 13:51:41 +08:00
b8f7341b9d fixed 当常识检测窗口被关闭时重新生成对象 2025-01-03 16:56:42 +08:00
41bfe9c5a3 更新常识检测 2025-01-02 17:07:50 +08:00
f1ddfa3d65 Merge branch 'dev/stream' into dev/sense-detection 2025-01-02 16:09:06 +08:00
7426273320 更新导出样式 2025-01-02 16:07:28 +08:00
697756127c feat: 改变入口进行登录判断 2024-12-31 20:13:16 +08:00
3a3d128ab0 update export style 2024-12-31 19:41:30 +08:00
e363d6df8b 常识性检测添加版本号 2024-12-31 16:45:57 +08:00
f7f9fdf5d3 feat: 新增文章常识性检测 2024-12-31 10:50:52 +08:00
b3b931e89f 添加版本提示 2024-12-30 09:42:01 +08:00
c036b904fa 统一弹出框样式 2024-12-25 19:29:29 +08:00
95de468a04 fixed: 缓存文件无法覆盖问题;纯空格删除后勘误表数据对不上; 2024-12-25 15:24:21 +08:00
ad0afdc54c feat: 缓存文件添加隐藏属性;勘误表添加造字首选和规范术语类型;
fixed: 校对项内容定位和原始不一致导致从头搜索
2024-12-19 16:29:50 +08:00
bc65188c0c update: 新增提示类型;弹窗样式统一;
fixed: 导出勘误表同一行校对数据顺序乱序;
2024-12-17 22:47:09 +08:00
59ebe8a18d 优化查找;
修正在结尾新增导致段落异常;
修正导出勘误表的样式;
2024-12-10 23:08:52 +08:00
753094447a update 2024-12-06 00:25:38 +08:00
d132bbfa3a fixed 勘误表导出顺序问题;同一句新增导致后续定位错误 2024-12-03 20:45:09 +08:00
8ab9a209e5 fixed bug 2024-11-17 11:09:50 +08:00
afddb096b7 fixed 导出提示问题 2024-11-14 20:13:23 +08:00
5b6b615bd2 fixed 自动登录无法关闭窗口 2024-11-13 01:26:32 +08:00
3c0d0f4608 fixed缓存初始化无法找到mark 2024-11-13 01:12:52 +08:00
76147498f4 fixed:新增导致原始内容被覆盖 2024-11-11 21:13:11 +08:00
70c0654a41 保存缓存时 自动保存文档 2024-11-11 17:45:40 +08:00
8ceaf028d8 feat: 调整dialog样式 2024-11-11 17:04:22 +08:00
e58390f7ef 缓存加载时初始化数据无法定位操作状态 2024-11-09 20:14:19 +08:00
7ec0f49aa5 只允许显示一个登录窗口 2024-11-08 22:52:03 +08:00
089e0bc64a 更新数据交互流程;
优化框架架构;
调整数据结构;
2024-11-05 13:40:39 +08:00
4116886a32 update 2024-09-07 21:44:39 +08:00
181 changed files with 10023 additions and 1418 deletions

5
.gitignore vendored
View File

@ -3,5 +3,10 @@ bin
packages
TestConsoleApp
.vs
obj
**/obj/Debug/**
**/obj/Release/**
**/obj/Test/**
**/**/obj/Debug/**
**/**/obj/Release/**
**/**/obj/Test/**

Binary file not shown.

View File

@ -11,6 +11,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "util-lib", "util-lib\util-l
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "updater", "updater\updater.csproj", "{73AC658D-CD49-4731-8491-A7BDBC811559}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ai-proofread-client", "ai-proofread-client\ai-proofread-client.csproj", "{48C0B207-150A-40B7-9A25-ECF9218FF86F}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@ -42,6 +44,12 @@ Global
{73AC658D-CD49-4731-8491-A7BDBC811559}.Release|Any CPU.Build.0 = Release|Any CPU
{73AC658D-CD49-4731-8491-A7BDBC811559}.Test|Any CPU.ActiveCfg = Debug|Any CPU
{73AC658D-CD49-4731-8491-A7BDBC811559}.Test|Any CPU.Build.0 = Debug|Any CPU
{48C0B207-150A-40B7-9A25-ECF9218FF86F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{48C0B207-150A-40B7-9A25-ECF9218FF86F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{48C0B207-150A-40B7-9A25-ECF9218FF86F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{48C0B207-150A-40B7-9A25-ECF9218FF86F}.Release|Any CPU.Build.0 = Release|Any CPU
{48C0B207-150A-40B7-9A25-ECF9218FF86F}.Test|Any CPU.ActiveCfg = Debug|Any CPU
{48C0B207-150A-40B7-9A25-ECF9218FF86F}.Test|Any CPU.Build.0 = Debug|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE

View File

@ -128,6 +128,12 @@
<Reference Include="BouncyCastle.Cryptography, Version=2.0.0.0, Culture=neutral, PublicKeyToken=072edcf4a5328938, processorArchitecture=MSIL">
<HintPath>..\packages\BouncyCastle.Cryptography.2.3.1\lib\net461\BouncyCastle.Cryptography.dll</HintPath>
</Reference>
<Reference Include="DocumentFormat.OpenXml, Version=3.3.0.0, Culture=neutral, PublicKeyToken=8fb06cb64d019a17, processorArchitecture=MSIL">
<HintPath>..\packages\DocumentFormat.OpenXml.3.3.0\lib\net46\DocumentFormat.OpenXml.dll</HintPath>
</Reference>
<Reference Include="DocumentFormat.OpenXml.Framework, Version=3.3.0.0, Culture=neutral, PublicKeyToken=8fb06cb64d019a17, processorArchitecture=MSIL">
<HintPath>..\packages\DocumentFormat.OpenXml.Framework.3.3.0\lib\net46\DocumentFormat.OpenXml.Framework.dll</HintPath>
</Reference>
<Reference Include="Enums.NET, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7ea1c1650d506225, processorArchitecture=MSIL">
<HintPath>..\packages\Enums.NET.4.0.1\lib\net45\Enums.NET.dll</HintPath>
</Reference>
@ -137,11 +143,17 @@
<Reference Include="ICSharpCode.SharpZipLib, Version=1.4.2.13, Culture=neutral, PublicKeyToken=1b03e6acf1164f73, processorArchitecture=MSIL">
<HintPath>..\packages\SharpZipLib.1.4.2\lib\netstandard2.0\ICSharpCode.SharpZipLib.dll</HintPath>
</Reference>
<Reference Include="log4net, Version=3.0.4.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a, processorArchitecture=MSIL">
<HintPath>..\packages\log4net.3.0.4\lib\net462\log4net.dll</HintPath>
</Reference>
<Reference Include="MathNet.Numerics, Version=5.0.0.0, Culture=neutral, PublicKeyToken=cd8b63ad3d691a37, processorArchitecture=MSIL">
<HintPath>..\packages\MathNet.Numerics.Signed.5.0.0\lib\net461\MathNet.Numerics.dll</HintPath>
</Reference>
<Reference Include="Microsoft.IO.RecyclableMemoryStream, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.IO.RecyclableMemoryStream.3.0.0\lib\netstandard2.0\Microsoft.IO.RecyclableMemoryStream.dll</HintPath>
<Reference Include="Microsoft.IO.RecyclableMemoryStream, Version=3.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.IO.RecyclableMemoryStream.3.0.1\lib\netstandard2.0\Microsoft.IO.RecyclableMemoryStream.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Office.Interop.Excel, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c, processorArchitecture=MSIL">
<EmbedInteropTypes>True</EmbedInteropTypes>
</Reference>
<Reference Include="Microsoft.Web.WebView2.Core, Version=1.0.2210.55, Culture=neutral, PublicKeyToken=2a8ab48044d2601e, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Web.WebView2.1.0.2210.55\lib\net45\Microsoft.Web.WebView2.Core.dll</HintPath>
@ -167,6 +179,7 @@
<Reference Include="NPOI.OpenXmlFormats, Version=2.7.1.0, Culture=neutral, PublicKeyToken=0df73ec7942b34e1, processorArchitecture=MSIL">
<HintPath>..\packages\NPOI.2.7.1\lib\netstandard2.0\NPOI.OpenXmlFormats.dll</HintPath>
</Reference>
<Reference Include="PresentationCore" />
<Reference Include="SixLabors.Fonts, Version=1.0.0.0, Culture=neutral, PublicKeyToken=d998eea7b14cab13, processorArchitecture=MSIL">
<HintPath>..\packages\SixLabors.Fonts.1.0.1\lib\netstandard2.0\SixLabors.Fonts.dll</HintPath>
</Reference>
@ -177,6 +190,9 @@
<Reference Include="System.Buffers, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll</HintPath>
</Reference>
<Reference Include="System.ComponentModel.Annotations, Version=4.2.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.ComponentModel.Annotations.5.0.0\lib\net461\System.ComponentModel.Annotations.dll</HintPath>
</Reference>
<Reference Include="System.ComponentModel.DataAnnotations" />
<Reference Include="System.Configuration" />
<Reference Include="System.Configuration.ConfigurationManager, Version=6.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
@ -185,6 +201,7 @@
<Reference Include="System.Data" />
<Reference Include="System.Data.OracleClient" />
<Reference Include="System.Drawing" />
<Reference Include="System.IO.Compression, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL" />
<Reference Include="System.Memory, Version=4.0.1.2, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Memory.4.5.5\lib\net461\System.Memory.dll</HintPath>
</Reference>
@ -203,8 +220,8 @@
<Reference Include="System.Security.Cryptography.Pkcs, Version=6.0.0.3, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Security.Cryptography.Pkcs.6.0.3\lib\net461\System.Security.Cryptography.Pkcs.dll</HintPath>
</Reference>
<Reference Include="System.Security.Cryptography.Xml, Version=6.0.0.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Security.Cryptography.Xml.6.0.1\lib\net461\System.Security.Cryptography.Xml.dll</HintPath>
<Reference Include="System.Security.Cryptography.Xml, Version=8.0.0.2, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Security.Cryptography.Xml.8.0.2\lib\net462\System.Security.Cryptography.Xml.dll</HintPath>
</Reference>
<Reference Include="System.Security.Permissions, Version=6.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Security.Permissions.6.0.0\lib\net461\System.Security.Permissions.dll</HintPath>
@ -225,6 +242,7 @@
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="System.Web" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
<Reference Include="System.Core" />
@ -284,18 +302,42 @@
<Compile Include="Controls\BaseWinForm.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Controls\FormCommonsenseDetection.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Controls\FormCommonsenseDetection.Designer.cs">
<DependentUpon>FormCommonsenseDetection.cs</DependentUpon>
</Compile>
<Compile Include="Controls\FormContact.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Controls\FormContact.Designer.cs">
<DependentUpon>FormContact.cs</DependentUpon>
</Compile>
<Compile Include="Controls\FormDialog.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Controls\FormDialog.Designer.cs">
<DependentUpon>FormDialog.cs</DependentUpon>
</Compile>
<Compile Include="Controls\FormLexicon.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Controls\FormLexicon.Designer.cs">
<DependentUpon>FormLexicon.cs</DependentUpon>
</Compile>
<Compile Include="Controls\FormLoading.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Controls\FormLoading.Designer.cs">
<DependentUpon>FormLoading.cs</DependentUpon>
</Compile>
<Compile Include="Controls\FormLogger.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Controls\FormLogger.Designer.cs">
<DependentUpon>FormLogger.cs</DependentUpon>
</Compile>
<Compile Include="Controls\FormLogin.cs">
<SubType>Form</SubType>
</Compile>
@ -308,50 +350,124 @@
<Compile Include="Controls\FormMain.Designer.cs">
<DependentUpon>FormMain.cs</DependentUpon>
</Compile>
<Compile Include="Controls\FormMask.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Controls\FormMask.Designer.cs">
<DependentUpon>FormMask.cs</DependentUpon>
</Compile>
<Compile Include="Controls\FormMessage.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Controls\FormMessage.Designer.cs">
<DependentUpon>FormMessage.cs</DependentUpon>
</Compile>
<Compile Include="Controls\FormReadme.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Controls\FormReadme.Designer.cs">
<DependentUpon>FormReadme.cs</DependentUpon>
</Compile>
<Compile Include="Controls\FormSetting.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Controls\FormSetting.Designer.cs">
<DependentUpon>FormSetting.cs</DependentUpon>
</Compile>
<Compile Include="Controls\FormWebView.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Controls\FormWebView.Designer.cs">
<DependentUpon>FormWebView.cs</DependentUpon>
</Compile>
<Compile Include="Controls\MessageTips.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Controls\MessageTips.Designer.cs">
<DependentUpon>MessageTips.cs</DependentUpon>
</Compile>
<Compile Include="Controls\ProofreadMainControl.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="Controls\ProofreadMainControl.Designer.cs">
<DependentUpon>ProofreadMainControl.cs</DependentUpon>
</Compile>
<Compile Include="core\AppModule.cs" />
<Compile Include="core\BridgeResult.cs" />
<Compile Include="core\CommonSenseDetection.cs" />
<Compile Include="core\CorrectionCharacter.cs" />
<Compile Include="core\CorrectionFragmentAbstract.cs" />
<Compile Include="core\CorrectionRangeAbstract.cs" />
<Compile Include="core\CorrectResultExportor.cs" />
<Compile Include="core\DocumentReader.cs" />
<Compile Include="core\DocumentText.cs" />
<Compile Include="core\DocumentUtil.cs" />
<Compile Include="core\EventForwarder.cs" />
<Compile Include="core\JSONObject.cs" />
<Compile Include="core\StringUtil.cs" />
<Compile Include="core\Tools.cs" />
<Compile Include="core\MainPanelWebMessage.cs" />
<Compile Include="Logger.cs" />
<Compile Include="core\ExportConfig.cs" />
<Compile Include="core\WebView2EventHandler.cs" />
<Compile Include="LogHelper.cs" />
<Compile Include="Model\BridgeResult.cs" />
<Compile Include="Model\CommonsenseDetectionItem.cs" />
<Compile Include="Model\DocumentContent.cs" />
<Compile Include="Model\DocumentInfo.cs" />
<Compile Include="Model\DocumentList.cs" />
<Compile Include="Model\ExportDataItem.cs" />
<Compile Include="Model\InsertMarkData.cs" />
<Compile Include="Model\ProofreadRangeInfo.cs" />
<Compile Include="ProofreadItem.cs" />
<Compile Include="Properties\AssemblyInfo.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="Transform.cs" />
<Compile Include="Util\HostHelper.cs" />
<Compile Include="Util\HttpUtil.cs" />
<Compile Include="Util\User32Util.cs" />
<EmbeddedResource Include="Controls\FormCommonsenseDetection.resx">
<DependentUpon>FormCommonsenseDetection.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Controls\FormContact.resx">
<DependentUpon>FormContact.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Controls\FormDialog.resx">
<DependentUpon>FormDialog.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Controls\FormLexicon.resx">
<DependentUpon>FormLexicon.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Controls\FormLoading.resx">
<DependentUpon>FormLoading.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Controls\FormLogger.resx">
<DependentUpon>FormLogger.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Controls\FormLogin.resx">
<DependentUpon>FormLogin.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Controls\FormMain.resx">
<DependentUpon>FormMain.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Controls\FormMask.resx">
<DependentUpon>FormMask.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Controls\FormMessage.resx">
<DependentUpon>FormMessage.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Controls\FormReadme.resx">
<DependentUpon>FormReadme.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Controls\FormSetting.resx">
<DependentUpon>FormSetting.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Controls\FormWebView.resx">
<DependentUpon>FormWebView.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Controls\MessageTips.resx">
<DependentUpon>MessageTips.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Controls\ProofreadMainControl.resx">
<DependentUpon>ProofreadMainControl.cs</DependentUpon>
</EmbeddedResource>
@ -363,6 +479,7 @@
<EmbeddedResource Include="Ribbon1.resx">
<DependentUpon>Ribbon1.cs</DependentUpon>
</EmbeddedResource>
<None Include="app.config" />
<None Include="packages.config" />
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
@ -407,7 +524,75 @@
</ProjectReference>
</ItemGroup>
<ItemGroup>
<Folder Include="Resources\" />
<None Include="Resources\button.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\icon-refresh.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\icon-refresh-wps.jpg" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\icon-save.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\icon-save-wps.jpg" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\button_default.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\form_bg.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\icon-panel-wps.jpg" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\icon-panel.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\icon-history-wps.jpg" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\icon-history.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\icon-export-wps.jpg" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\icon-export.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\icon_close.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\logo.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\logo_wps.jpg" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\logo_no_text.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\logo_no_text_wps.jpg" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\icon-ai-robot.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\icon-ai-robot-wps.jpg" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\icon-manual.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\icon-manual-wps.jpg" />
</ItemGroup>
<ItemGroup>
<Content Include="favicon.ico" />
<None Include="Resources\icon-update-new-wps.jpg" />
<None Include="Resources\icon-update-new.png" />
</ItemGroup>
<PropertyGroup>
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
@ -436,6 +621,9 @@
<PlatformTarget>AnyCPU</PlatformTarget>
<LangVersion>7.3</LangVersion>
</PropertyGroup>
<PropertyGroup>
<ApplicationIcon>favicon.ico</ApplicationIcon>
</PropertyGroup>
<!-- Include the build rules for a C# project. -->
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- Include additional build rules for an Office application add-in. -->

View File

@ -8,6 +8,10 @@
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'">
<StartAction>Project</StartAction>
<StartProgram>C:\Soft\Kingsoft\WPS Office\12.1.0.17827\office6\wps.exe</StartProgram>
<StartProgram>C:\Soft\Kingsoft\WPS Office\12.1.0.20784\office6\wps.exe</StartProgram>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|AnyCPU'">
<StartAction>Project</StartAction>
<StartProgram>C:\Soft\Kingsoft\WPS Office\12.1.0.18608\office6\wps.exe</StartProgram>
</PropertyGroup>
</Project>

File diff suppressed because it is too large Load Diff

View File

@ -1,4 +1,5 @@
using System;
using System.IO;
using System.Text.RegularExpressions;
namespace AIProofread
@ -9,28 +10,63 @@ namespace AIProofread
Test,
Prod
}
public class AppServer
{
/// <summary>
/// 开发环境
/// </summary>
public const string DEV = "http://localhost:5173/";
/// <summary>
/// 一体机
/// </summary>
public const string ALL_IN_ONE = "http://112.48.25.226:89/";
/// <summary>
/// 果麦预发布环境
/// </summary>
public const string PRE = "https://pre-gm-plugin.gachafun.com/";
/// <summary>
/// 果麦生产环境
/// </summary>
public const string PROD = "https://gm-plugin.gachafun.com/";
/// <summary>
/// 测试环境
/// </summary>
public const string TEST = "http://tt-plugin.zverse.group/";
}
public class Config
{
public static readonly string APP_NAME = "AI校对王";
public static readonly string APP_VERSION = "1.0.11";
public static readonly string APP_VERSION = "2.2.6";
public static readonly string BuildVersion = "20250623_1757";
public static bool IS_WPS = false;
public static bool UpgradeForcedNotice = false;
public static readonly string APP_BASE_DIR = AppDomain.CurrentDomain.BaseDirectory;
public static readonly string CONFIG_FILE = AppDomain.CurrentDomain.BaseDirectory + "app.json";
#if DEBUG
public static string USER_MANUAL_URL = "https://aiprhelp.guomai.cn/";
/// <summary>
/// 文本背景色
/// </summary>
public static readonly string TextBackgroundColor = "#E9DABB"; // e9dabb D6AA69
public static string DeviceId = "";
#if DEBUG
/// <summary>
/// 网页访问地址
/// </summary>
public static string WEB_PATH = "http://192.168.10.100:5173/";
public static string WEB_PATH = AppServer.DEV; //pre-gm-plugin.gachafun.com localhost:5173 gm2-plugin.zverse.group
public static bool RUN_IN_DEBUG = true;
public static AppEnvironment APP_ENV = AppEnvironment.Dev;
#else
public static string WEB_PATH = "https://gm-plugin.gachafun.com/";
#else
public static string WEB_PATH = AppServer.PROD; // gm-plugin.gachafun.com pre-gm-plugin.gachafun.com
public static bool RUN_IN_DEBUG = false;
public static AppEnvironment APP_ENV = AppEnvironment.Prod;
#endif
#endif
public static readonly string APP_DATA_PATH = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\ai_proofread";
public static readonly string APP_LOG_PATH = APP_DATA_PATH + "\\logs\\";
public static readonly string APP_README_PATH = APP_DATA_PATH + "\\readme\\";
public static readonly string WEB_DATA_PATH = APP_DATA_PATH + "\\userdata";
/// <summary>
@ -39,6 +75,14 @@ namespace AIProofread
public static readonly string BOOKMARK_NAME_PREFIX = "ai_proofread_";
private static readonly Regex regex = new Regex("^ai_proofread_\\d+$");
public static string GetCurrentVersionReadmeCacheFile()
{
if (!Directory.Exists(APP_README_PATH))
{
Directory.CreateDirectory(APP_README_PATH);
}
return Path.Combine(APP_README_PATH, APP_VERSION + ".txt");
}
public static bool IsProofreadMark(string name)
{
@ -71,7 +115,8 @@ namespace AIProofread
/// <returns></returns>
public static string WebPath(string path)
{
return WEB_PATH + path;
Random r = new Random();
return WEB_PATH + path + (path.IndexOf("?") == -1 ? "?":"&") + $"ver={APP_VERSION}&r=" + r.NextDouble();
}
}
}

View File

@ -1,11 +1,9 @@
using Microsoft.Web.WebView2.Core;
using log4net;
using Microsoft.Web.WebView2.Core;
using Microsoft.Web.WebView2.WinForms;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace AIProofread.Controls
@ -14,6 +12,7 @@ namespace AIProofread.Controls
[ComVisible(true)]
public class BaseWinForm : Form
{
#region WIN32 API
[DllImport("Gdi32.dll", EntryPoint = "CreateRoundRectRgn")]
private static extern IntPtr CreateRoundRectRgn(
int nLeftRect, // x-coordinate of upper-left corner
@ -49,6 +48,9 @@ namespace AIProofread.Controls
private const int WM_NCHITTEST = 0x84; // variables for dragging the form
private const int HTCLIENT = 0x1;
private const int HTCAPTION = 0x2;
#endregion
private readonly ILog logger = LogHelper.GetLogger(typeof(BaseWinForm));
protected override CreateParams CreateParams
{
@ -110,7 +112,12 @@ namespace AIProofread.Controls
this.FormBorderStyle = FormBorderStyle.None;
}
protected async void InitWebView(WebView2 webView,String url,string name)
public void SetHeight(int height)
{
this.Height = height;
}
protected async void InitWebView(WebView2 webView, String url, string name, Action callaback = null)
{
//Bridge.InitWebEnvAsync(name, webView);
try
@ -123,12 +130,48 @@ namespace AIProofread.Controls
var eventForwarder = new EventForwarder(this);
webView.CoreWebView2.AddHostObjectToScript("event", eventForwarder);
webView.CoreWebView2.AddHostObjectToScript("host", this);
webView.CoreWebView2.AddHostObjectToScript("bridge", Bridge.bridge);
if (callaback != null)
{
callaback();
}
webView.Source = new Uri(url);
}catch (Exception ex)
}
catch (Exception ex)
{
Logger.Log("\ninit webview error:" + ex.Message + "\n" + ex.StackTrace);
logger.Error("\ninit webview error:" + ex.Message, ex);
}
}
public void Download(string url)
{
Globals.ThisAddIn.ActiveDocument.RunInMainThread(() =>
{
var sfd = new SaveFileDialog();
sfd.Filter = "Excel文件|*.xlsx";
sfd.DefaultExt = ".xlsx";
if (sfd.ShowDialog() == DialogResult.OK)
{
var fileName = sfd.FileName;
Download(url, fileName);
}
});
}
public void Download(string url, string fileName)
{
// 现在url对应文件并保存到fileName
try
{
using (var client = new WebClient())
{
client.DownloadFile(url, fileName);
}
}
catch (Exception ex)
{
logger.Error("\nDownload error:" + ex.Message, ex);
}
}
}

View File

@ -0,0 +1,69 @@
namespace AIProofread.Controls
{
partial class FormCommonsenseDetection
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormCommonsenseDetection));
this.MainWebView = new Microsoft.Web.WebView2.WinForms.WebView2();
((System.ComponentModel.ISupportInitialize)(this.MainWebView)).BeginInit();
this.SuspendLayout();
//
// MainWebView
//
this.MainWebView.AllowExternalDrop = false;
this.MainWebView.BackColor = System.Drawing.SystemColors.ControlDark;
this.MainWebView.CreationProperties = null;
this.MainWebView.DefaultBackgroundColor = System.Drawing.Color.White;
this.MainWebView.Dock = System.Windows.Forms.DockStyle.Fill;
this.MainWebView.Location = new System.Drawing.Point(0, 0);
this.MainWebView.Name = "MainWebView";
this.MainWebView.Size = new System.Drawing.Size(800, 600);
this.MainWebView.TabIndex = 0;
this.MainWebView.ZoomFactor = 1D;
//
// FormCommonsenseDetection
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(800, 600);
this.Controls.Add(this.MainWebView);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Name = "FormCommonsenseDetection";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "常识性检测";
this.Load += new System.EventHandler(this.FormCommonsenseDetection_Load);
((System.ComponentModel.ISupportInitialize)(this.MainWebView)).EndInit();
this.ResumeLayout(false);
}
#endregion
private Microsoft.Web.WebView2.WinForms.WebView2 MainWebView;
}
}

View File

@ -0,0 +1,69 @@
using AIProofread.core;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using UtilLib;
namespace AIProofread.Controls
{
[ClassInterface(ClassInterfaceType.AutoDual)]
[ComVisible(true)]
public partial class FormCommonsenseDetection : BaseWinForm
{
private bool initialized = false;
private List<WebMessage> actions = new List<WebMessage>();
public FormCommonsenseDetection()
{
InitializeComponent();
}
private void FormCommonsenseDetection_Load(object sender, EventArgs e)
{
// 初始化
InitWebView(MainWebView, Config.WebPath("commonsense-detection"), "commonsense-detection", () =>
{
MainWebView.CoreWebView2.AddHostObjectToScript("detection", CommonSenseDetection.Instance(this));
});
}
private void SendToWeb(string action, object data)
{
var json = JsonConvert.SerializeObject(new WebMessage(action, data));
MainWebView.CoreWebView2.PostWebMessageAsJson(json);
}
public void SendMessageToWeb(string action, object data)
{
// 判断是否已经初始化完成
if (this.initialized)
{
SendToWeb(action, data);
return;
}
// 添加到队列
actions.Add(new WebMessage(action, data));
//this.action = action;
//this.data = data;
}
public void InitializationCompleted()
{
if (!this.initialized && actions.Count > 0) // !string.IsNullOrEmpty(this.action)
{
actions.ForEach(item =>
{
SendToWeb(item.Message, item.Data);
});
// clear
actions.Clear();
//SendToWeb(this.action, this.data);
//this.action = null;
//this.data = null;
}
this.initialized = true;
}
}
}

View File

@ -0,0 +1,451 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAEAgIAAAAEACAAoTAAAFgAAACgAAACAAAAAAAEAAAEACAAAAAAAAEAAAAAAAAAAAAAAAAEAAAAB
AAAAAAAAaarWAGmq1gBpqtYAaarWAGmq1gBpqtYAaarWAGmq1gBpqtYAaarWAGmq1gBpqtYAaarWAGmq
1gBpqtYAaarWAGmq1gBpqtYAaarWAGmq1gBpqtYAaarWAGmq1gBpqtYAaarWAGmq1gBpqtYAaarWAGmq
1gBpqtYAaarWAGmq1gBpqtYAaarWAGmq1gBpqtYAaarWAGmq1gBpqtYAaarWAGmq1gBpqtYAaarWAGmq
1gBpqtYAaarWAGmq1gBpqtYAaarWAGmq1gBpqtYAaarWAGmq1gBpqtYAaarWAGmq1gBpqtYAaarWAGmq
1gBpqtYAaarWAGmq1gBpqtYAaarWAGmq1gBpqtYAaarWAGmq1gBpqtYAaarWAGmq1gBpqtYAaarWAGmq
1gBpqtYAaarWAGmq1gBpqtYAaarWAGmq1gBpqtYAaarWAGmq1gBpqtYAaarWAGmq1gBpqtYAaarWAGmq
1gBpqtYAaarWAGmq1gBpqtYAaarWAGmq1gBpqtYAaarWAGmq1gBpqtYAaarWAGmq1gBpqtYAaarWAGmq
1gBpqtYAaarWAGmq1gBpqtYAaarWAGmq1gBpqtYAaarWAGmq1gBpqtYAaarWAGmq1gBpqtYAaarWAGmq
1gBpqtYAaarWAGmq1gBpqtYAaarWAGmq1gBpqtYAaarWAGmq1gBpqtYAaarWAGmq1gBpqtYAaarWAGmq
1gBpqtYAaarWAGmq1gBpqtYAaarWAGmq1gBpqtYAaarWAGmq1gBpqtYAaarWAGmq1gBpqtYAaarWAGmq
1gBpqtYAaarWAGmq1gBpqtYAaarWAGmq1gBpqtYAaarWAGmq1gBpqtYAaarWAGmq1gBpqtYAaarWAGmq
1gBpqtYAaarWAGmq1gBpqtYAaarWAGmq1gBpqtYAaarWAGmq1gBpqtYAaarWAGmq1gBpqtYAaarWAGmq
1gBpqtYAaarWAGmq1gBpqtYAaarWAGmq1gBpqtYAaarWAGmq1gBpqtYAaarWAGmq1gBpqtYAaarWAGmq
1gBpqtYAaarWAGmq1gBpqtYAaarWAGmq1gBpqtYAaarWAGmq1gBpqtYAaarWAGmq1gBpqtYAaarWAGmq
1gBpqtYAaarWAGmq1gBpqtYAaarWAGmq1gBpqtYAaarWAGmq1gBpqtYAaarWAGmq1gBpqtYAaarWAGmq
1gBpqtYAaarWAGmq1gBpqtYAaarWAGmq1gBpqtYAaarWAGmq1gBpqtYAaarWAGmq1gBpqtYAaarWAGmq
1gBpqtYAaarWAGmq1gBpqtYAaarWAGmq1gBpqtYAaarWAGmq1gBpqtYAaarWAGmq1gBpqtYAaarWAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAw6bZKstri4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4
uLi4uLi4uLi4uLi4uLi4rJRvOQwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAB5rwOPw9/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7
+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/HjvmseBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAABRfy/T7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7
+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79MtfFAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsm/T7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7
+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/GbLAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOsD7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7
+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/vAOgAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADTE+/v7+/v7+/v7+/v7+/v7+/v7+/v7
+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7
+/v7+/vCNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgrvv7+/v7+/v7+/v7+/v7
+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7
+/v7+/v7+/v7+/v7+/uuHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACX73+/v7+/v7
+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7
+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/d8CQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2
4/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7
+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
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAGDRIW2dvb29tZVdEMBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAP//////////////////////////////////////////////////////////////////
///////////////////////AAAAAAAAAAAAD////////AAAAAAAAAAAAAH///////AAAAAAAAAAAAAA/
//////gAAAAAAAAAAAAAH//////wAAAAAAAAAAAAAA//////4AAAAAAAAAAAAAAH/////8AAAAAAAAAA
AAAAA/////+AAAAAAAAAAAAAAAH/////gAAAAAAAAAAAAAAB/////wAAAAAAAAAAAAAAAP////8AAAAA
AAAAAAAAAAD/////AAAAAAAAAAAAAAAA/////wAH///wAAAP///gAP////4AD///8AAAD///8AB////+
AA////AAAA////AAf////gAP///wAAAP///wAH////4AD///8AAAD///8AB////+AA////AAAA////AA
f////gAP///wAAAP///wAH////4AD///8AAAD///8AB////+AA////AAAA////AAf////gAP///wAAAP
///wAH////4AD///8AAAD///8AB////+AA////AAAA////AAf////gAP///////////wAH//AB4AD///
////////8AB4AAAOAA////////////AAcAAADgAP///////////wAHAAAA4AD///////////8ABwAAAO
AA////////////AAcAAADgAP///////////wAHAAAA4AD///////////8ABwAAAOAA////////////AA
cAAADgAP//w////8P//wAHAAAA4AD//gB///4Af/8ABwAAAOAA//wAP//8AD//AAcAAADgAP/4AB//+A
Af/wAHAAAAAAD/8AAP//AAD/8ABwAAAAAA//AAD//wAA//AAAAAAAAAP/gAAf/4AAH/wAAAAAAAAD/4A
AH/+AAB/8AAAAAAAAA/+AAB//gAAf/AAAAAAAAAP/gAAf/4AAH/wAAAAAAAAD/4AAH/+AAB/8AAAAAAA
AA/+AAB//gAAf/AAAAAAAAAP/wAA//8AAP/wAAAAAAAAD/8AAP//AAD/8AAAAAAAAA//gAH//4AB//AA
AAAAAAAP/8AD///AA//wAAAAAAAAD//wB///4A//8AAAAAAAAA////////////AAAAAAAAAP////////
///4AAAAAAAAD///////////+AAAAAAAAA////////////gAAAAADgAP////////////////AA4AD///
//////wAD////wAOAA/////////AAAH///8ADgAP////////AAAAP///8v4AD////////AAAAA/////+
AA////////AAAAAD/////gAP///////AAAAAAP////4AD///////gAAAAAB////+AA///////wAAAAAA
P////gAP//////wAAAAAAB////4AD//////4AAAAAAAH///+AA//////8AAAAAAAA////gAP/////+AA
AAAAAAP///4AD//////gAAP/8AAB///+AA//////wAAf//wAAP///gAP/////4AAP///AAB///4AB///
//8AAP///8AAf///AAP/////AAH////gAD///wAAAAAA/gAD////8AAf//8AAAAAAP4AB/4f//gAH///
AAAAAAD8AA/+D//8AB///4AAAAAA/AAf/A///gAP//+AAAAAAPwAP/gH//4AD///wAAAAAD4AD/4A///
AAf//+AAAAAA+AB/8AP//4AH///wAAAAAPgAf+AB//+AB///+AAAAADwAP/AAP//wAf///wAAAAA8AD/
wAD//8AD////AAAAAPAA/4AAf//AA////8AAAADwAf8AAD//4AP////4AAAB4AH/AAAf/+AD////////
/+AB/gAAH//gA//////////gAfwAAA//4AP/////////4AH4AAAH/+AB/////////+AB+ABAB//gAf//
///////gAfAAwAP/4AH/////////4AHwAeAB/+AD/////////+AB8AHwAP/gA//////////gAfwP8AB/
4AP/////////8AH///gAf+AD//////////AA///8AD/AA//////////wAP///gAfwAP/////////8AD/
//4AH8AD//////////gAf///AA+AB//////////4AH///4APgAf/////////+AA///+ADwAH////////
//wAP///wA4AD//////////8AB/////+AA///////////AAP/////AAP//////////4AB/////gAH///
///////+AAf////wAB///////////wAB////4AA///////////8AAP///8AAf///////////gAB///8A
AH///////////8AAH//+AAD////////////AAAf/8AAB////////////4AAAf4AAA/////////////AA
AAAAAAP////////////4AAAAAAAH/////////////AAAAAAAD/////////////4AAAAAAD//////////
////gAAAAAB//////////////8AAAAAA///////////////gAAAAA///////////////+AAAAAf/////
//////////4AAAAf////////////////wAAA//////////////////wAD///////////////////////
////////////////////////
</value>
</data>
</root>

View File

@ -40,7 +40,7 @@
this.WebViewContact.Dock = System.Windows.Forms.DockStyle.Fill;
this.WebViewContact.Location = new System.Drawing.Point(0, 0);
this.WebViewContact.Name = "WebViewContact";
this.WebViewContact.Size = new System.Drawing.Size(400, 310);
this.WebViewContact.Size = new System.Drawing.Size(620, 450);
this.WebViewContact.TabIndex = 0;
this.WebViewContact.ZoomFactor = 1D;
//
@ -48,11 +48,11 @@
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(400, 310);
this.ClientSize = new System.Drawing.Size(620, 450);
this.Controls.Add(this.WebViewContact);
this.Name = "FormContact";
this.ShowIcon = false;
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "联系客服";
this.Load += new System.EventHandler(this.FormContact_Load);
((System.ComponentModel.ISupportInitialize)(this.WebViewContact)).EndInit();

View File

@ -4,12 +4,15 @@ using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace AIProofread.Controls
{
[ClassInterface(ClassInterfaceType.AutoDual)]
[ComVisible(true)]
public partial class FormContact : BaseWinForm
{
public FormContact()

View File

@ -0,0 +1,111 @@
namespace AIProofread.Controls
{
partial class FormDialog
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.LabelMeesage = new System.Windows.Forms.Label();
this.BtnClose = new System.Windows.Forms.Button();
this.BtnConfirm = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// LabelMeesage
//
this.LabelMeesage.Font = new System.Drawing.Font("微软雅黑", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.LabelMeesage.ForeColor = System.Drawing.Color.Black;
this.LabelMeesage.Location = new System.Drawing.Point(39, 60);
this.LabelMeesage.Name = "LabelMeesage";
this.LabelMeesage.Size = new System.Drawing.Size(346, 70);
this.LabelMeesage.TabIndex = 7;
this.LabelMeesage.Text = "label1";
this.LabelMeesage.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// BtnClose
//
this.BtnClose.BackColor = System.Drawing.Color.White;
this.BtnClose.BackgroundImage = global::AIProofread.Properties.Resources.button_default;
this.BtnClose.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch;
this.BtnClose.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.BtnClose.FlatAppearance.BorderColor = System.Drawing.Color.Gainsboro;
this.BtnClose.FlatAppearance.BorderSize = 0;
this.BtnClose.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.BtnClose.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.BtnClose.ForeColor = System.Drawing.Color.Black;
this.BtnClose.Location = new System.Drawing.Point(222, 205);
this.BtnClose.Name = "BtnClose";
this.BtnClose.Size = new System.Drawing.Size(120, 44);
this.BtnClose.TabIndex = 6;
this.BtnClose.Text = "取消";
this.BtnClose.UseVisualStyleBackColor = false;
this.BtnClose.Click += new System.EventHandler(this.BtnClose_Click);
//
// BtnConfirm
//
this.BtnConfirm.BackgroundImage = global::AIProofread.Properties.Resources.button;
this.BtnConfirm.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch;
this.BtnConfirm.FlatAppearance.BorderSize = 0;
this.BtnConfirm.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.BtnConfirm.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.BtnConfirm.ForeColor = System.Drawing.Color.White;
this.BtnConfirm.Location = new System.Drawing.Point(78, 205);
this.BtnConfirm.Name = "BtnConfirm";
this.BtnConfirm.Size = new System.Drawing.Size(120, 44);
this.BtnConfirm.TabIndex = 5;
this.BtnConfirm.Text = "确认";
this.BtnConfirm.UseVisualStyleBackColor = true;
this.BtnConfirm.Click += new System.EventHandler(this.button2_Click);
//
// FormDialog
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.Color.White;
this.CancelButton = this.BtnClose;
this.ClientSize = new System.Drawing.Size(422, 286);
this.Controls.Add(this.LabelMeesage);
this.Controls.Add(this.BtnClose);
this.Controls.Add(this.BtnConfirm);
this.ForeColor = System.Drawing.Color.White;
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "FormDialog";
this.ShowIcon = false;
this.ShowInTaskbar = false;
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Deactivate += new System.EventHandler(this.FormDialog_Deactivate);
this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.FormDialog_FormClosed);
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.Label LabelMeesage;
private System.Windows.Forms.Button BtnClose;
private System.Windows.Forms.Button BtnConfirm;
}
}

View File

@ -0,0 +1,70 @@
using AIProofread.Util;
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace AIProofread.Controls
{
public partial class FormDialog : Form
{
public FormDialog()
{
InitializeComponent();
}
private static FormMask mask;
private void SetMessage(string message)
{
LabelMeesage.Text = message;
}
private void SetButtonText(string yesButtonText, string noButtonText)
{
BtnClose.Text = noButtonText;
BtnConfirm.Text = yesButtonText;
}
public static DialogResult Show(string message, string caption, string yesButtonText, string noButtonText)
{
FormDialog formMessage = new FormDialog();
mask = new FormMask(formMessage);
mask.ShowOverWord();
formMessage.SetMessage(message);
formMessage.Text = caption;
formMessage.SetButtonText(yesButtonText, noButtonText);
formMessage.TopMost = true;
IntPtr wordHandle = new IntPtr(Globals.ThisAddIn.Application.ActiveWindow.Hwnd); // 获取Word窗口句柄
User32Util.SetParent(formMessage.Handle,wordHandle);
formMessage.Show();
return DialogResult.Yes;
}
public static DialogResult Show(string message)
{
return Show(message, "", "是", "否");
}
private void BtnClose_Click(object sender, EventArgs e)
{
this.DialogResult = DialogResult.No;
this.TopMost = false;
this.Close();
}
private void button2_Click(object sender, EventArgs e)
{
this.DialogResult = DialogResult.Yes;
this.Close();
}
private void FormDialog_Deactivate(object sender, EventArgs e)
{
// SetForegroundWindow(this.Handle);
// this.Activate();
}
private void FormDialog_FormClosed(object sender, FormClosedEventArgs e)
{
mask.Close();
mask = null;
}
}
}

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -0,0 +1,66 @@
namespace AIProofread.Controls
{
partial class FormLexicon
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.MainWebView = new Microsoft.Web.WebView2.WinForms.WebView2();
((System.ComponentModel.ISupportInitialize)(this.MainWebView)).BeginInit();
this.SuspendLayout();
//
// MainWebView
//
this.MainWebView.AllowExternalDrop = true;
this.MainWebView.CreationProperties = null;
this.MainWebView.DefaultBackgroundColor = System.Drawing.Color.White;
this.MainWebView.Dock = System.Windows.Forms.DockStyle.Fill;
this.MainWebView.Location = new System.Drawing.Point(0, 0);
this.MainWebView.Name = "MainWebView";
this.MainWebView.Size = new System.Drawing.Size(1000, 640);
this.MainWebView.TabIndex = 0;
this.MainWebView.ZoomFactor = 1D;
//
// FormLexicon
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(1000, 640);
this.Controls.Add(this.MainWebView);
this.Name = "FormLexicon";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "FormLexicon";
this.Load += new System.EventHandler(this.FormLexicon_Load);
((System.ComponentModel.ISupportInitialize)(this.MainWebView)).EndInit();
this.ResumeLayout(false);
}
#endregion
private Microsoft.Web.WebView2.WinForms.WebView2 MainWebView;
}
}

View File

@ -0,0 +1,21 @@
using System;
using System.Runtime.InteropServices;
namespace AIProofread.Controls
{
[ClassInterface(ClassInterfaceType.AutoDual)]
[ComVisible(true)]
public partial class FormLexicon : BaseWinForm
{
public FormLexicon()
{
InitializeComponent();
}
private void FormLexicon_Load(object sender, EventArgs e)
{
// 初始化
InitWebView(MainWebView, Config.WebPath("lexicon"), "lexicon");
}
}
}

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -0,0 +1,104 @@
namespace AIProofread.Controls
{
partial class FormLogger
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormLogger));
this.LogText = new System.Windows.Forms.RichTextBox();
this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components);
this.TsmiClear = new System.Windows.Forms.ToolStripMenuItem();
this.panel1 = new System.Windows.Forms.Panel();
this.contextMenuStrip1.SuspendLayout();
this.panel1.SuspendLayout();
this.SuspendLayout();
//
// LogText
//
this.LogText.AutoWordSelection = true;
this.LogText.BackColor = System.Drawing.Color.White;
this.LogText.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.LogText.ContextMenuStrip = this.contextMenuStrip1;
this.LogText.Dock = System.Windows.Forms.DockStyle.Fill;
this.LogText.Font = new System.Drawing.Font("微软雅黑", 7.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.LogText.Location = new System.Drawing.Point(0, 0);
this.LogText.Name = "LogText";
this.LogText.ReadOnly = true;
this.LogText.ShowSelectionMargin = true;
this.LogText.Size = new System.Drawing.Size(784, 310);
this.LogText.TabIndex = 0;
this.LogText.Text = "";
//
// contextMenuStrip1
//
this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.TsmiClear});
this.contextMenuStrip1.Name = "contextMenuStrip1";
this.contextMenuStrip1.Size = new System.Drawing.Size(125, 26);
//
// TsmiClear
//
this.TsmiClear.Name = "TsmiClear";
this.TsmiClear.Size = new System.Drawing.Size(124, 22);
this.TsmiClear.Text = "清除日志";
this.TsmiClear.Click += new System.EventHandler(this.TsmiClear_Click);
//
// panel1
//
this.panel1.Controls.Add(this.LogText);
this.panel1.Dock = System.Windows.Forms.DockStyle.Fill;
this.panel1.Location = new System.Drawing.Point(0, 0);
this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(784, 310);
this.panel1.TabIndex = 1;
//
// FormLogger
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(784, 310);
this.Controls.Add(this.panel1);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Name = "FormLogger";
this.Text = "实时日志";
this.TopMost = true;
this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.FormLogger_FormClosed);
this.contextMenuStrip1.ResumeLayout(false);
this.panel1.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.RichTextBox LogText;
private System.Windows.Forms.Panel panel1;
private System.Windows.Forms.ContextMenuStrip contextMenuStrip1;
private System.Windows.Forms.ToolStripMenuItem TsmiClear;
}
}

View File

@ -0,0 +1,107 @@
using System;
using System.Windows.Forms;
namespace AIProofread.Controls
{
public partial class FormLogger : Form
{
private ListView LogListView = new ListView();
public FormLogger()
{
InitializeComponent();
//LogListView.View = View.Details;
//LogListView.FullRowSelect = true;
//LogListView.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);
}
private void InitLogListView()
{
var columnHeader1 = new ColumnHeader();
var columnHeader2 = new ColumnHeader();
var columnHeader3 = new ColumnHeader();
columnHeader1.Text = "Tag";
columnHeader1.Width = 67;
columnHeader2.Text = "Time";
columnHeader2.Width = 117;
columnHeader3.Text = "Message";
columnHeader3.Width = 480;
LogListView.Columns.AddRange(new ColumnHeader[] {columnHeader1,columnHeader2,columnHeader3});
}
/// <summary>
/// 显示最大日志数
/// </summary>
private const int MaxDisplayItemCount = 100;
public void Log(string time, string tag, string message)
{
ShowLogInText(time, tag, message);
}
private void ShowLogInText(string time, string tag, string message)
{
if (LogText.InvokeRequired)
{
//LogText.Invoke(new AppendLogDel(AppendLog), args);
}
else
{
LogText.AppendText(string.Format("{0} {1} {2}",time,tag,message));
LogText.AppendText(Environment.NewLine);
LogText.ScrollToCaret();
LogText.Update();
}
}
private void ShowLogInList(string time, string tag, string message)
{
if (LogListView.InvokeRequired)
{
LogListView.Invoke(new Action(() => AddLogToList(time, tag, message)));
}
else
{
AddLogToList(time, tag, message);
}
}
private void AddLogToList(string time, string tag, string message)
{
//
ListViewItem insertItem = new ListViewItem(new string[] { tag, time, message });
//
//insertItem.SubItems.Add(time);
//insertItem.SubItems.Add(tag, Color.Violet, Color.White, LogListView.Font);
//insertItem.SubItems.Add(message, Color.Blue, Color.White, LogListView.Font);
//ListViewSubItem tagItem = new ListViewSubItem(insertItem,tag);
//ListViewSubItem timeItem = new ListViewSubItem(insertItem,time, Color.Violet, Color.White, LogListView.Font);
//ListViewSubItem messageItem = new ListViewSubItem(insertItem, time, Color.Blue, Color.White, LogListView.Font);
//insertItem.SubItems.Add(tagItem);
if (LogListView.Items.Count > MaxDisplayItemCount)
{
LogListView.Items.RemoveAt(MaxDisplayItemCount);
}
//ListViewItem lstItem = new ListViewItem(" " + DateTime.Now.ToString(), imageIndex);
//lstItem.SubItems.Add(info);
LogListView.Items.Insert(0, insertItem);
}
private void FormLogger_FormClosed(object sender, FormClosedEventArgs e)
{
LogHelper.LoggerForm = null;
}
private void TsmiClear_Click(object sender, EventArgs e)
{
LogText.Text = string.Empty;
}
}
}

View File

@ -0,0 +1,196 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="contextMenuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAEAIB4AAAEAIACgDwAAFgAAACgAAAAgAAAAPAAAAAEAIAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAA
AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA
AAEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPQAA
AJUAAACYAAAAmAAAAJgAAACYAAAAmAAAAJgAAACYAAAAmAAAAJgAAACYAAAAmAAAAJgAAACYAAAAmAAA
AJgAAACYAAAAmAAAAJgAAACQAAAALQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAB9AAAA/wAAAOoAAADnAAAA5wAAAOcAAADnAAAA5wAAAOcAAADnAAAA5wAAAOcAAADnAAAA5wAA
AOcAAADnAAAA5wAAAOcAAADnAAAA8AAAAPoAAABaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAH4AAADpAAAAQQAAACMAAAAlAAAAJQAAACUAAAAlAAAAJQAAACUAAAAlAAAAJQAA
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
ADUAAAA1AAAANQAAABoAAAAAAAAATQAAAO8AAABbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAH8AAADlAAAAIQAAAAAAAAAJAAAAFAAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABNAAAA7wAAAFsAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAOUAAAAiAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAQAA
AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAAAAAE0AAADvAAAAWwAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB9AAAA9wAAAKkAAACbAAAAnAAAAJwAAACcAAAAnAAA
AJwAAACcAAAAnAAAAJwAAACcAAAAnAAAAJwAAACcAAAAnAAAAJwAAACbAAAAuQAAAPUAAABbAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGkAAADhAAAA4gAAAOIAAADiAAAA4gAA
AOIAAADiAAAA4gAAAOIAAADiAAAA4gAAAOIAAADiAAAA4gAAAOIAAADiAAAA4gAAAOIAAADiAAAA2AAA
AEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAACUAAAAmAAAAJgAA
ACYAAAAmAAAAJgAAACYAAAAmAAAAJgAAACYAAAAmAAAAJgAAACYAAAAmAAAAJgAAACYAAAAmAAAAJgAA
ACYAAAAkAAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAD////////////////8AAA/+AAAH/gAAB/4AAAf+P//H/iIAR/4iAEf+IgBH/j//x/4//8f+IgBH/iI
AR/4iAEf+I//H/j//x/4iAEf+IgBH/iIAR/4j/8f+PABH/gAAB/4AAAf+AAAH///////////////////
//8=
</value>
</data>
</root>

View File

@ -1,8 +1,11 @@
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace AIProofread.Controls
{
[ClassInterface(ClassInterfaceType.AutoDual)]
[ComVisible(true)]
public partial class FormLogin : BaseWinForm
{
@ -11,6 +14,19 @@ namespace AIProofread.Controls
public FormLogin()
{
InitializeComponent();
this.FormClosed += (s, e) =>
{
// 关闭时释放资源
try
{
if (web != null)
{
web.Dispose();
web = null;
}
}
catch { };
};
//Bridge.InitWebEnvAsync("login", web);
//Bridge.AddEventHandler(BridgeEvent.LoginSuccess, OnLoginSuccess);
}
@ -18,6 +34,19 @@ namespace AIProofread.Controls
{
this.action = action;
InitializeComponent();
this.FormClosed += (s, e) =>
{
// 关闭时释放资源
try
{
if (web != null)
{
web.Dispose();
web = null;
}
}
catch { };
};
}
private void OnLoginSuccess(object sender, EventArgs e)
@ -28,9 +57,9 @@ namespace AIProofread.Controls
private void FormLogin_Load(object sender, EventArgs e)
{
//this.web.Source = new Uri(Config.WebPath("#login"));
InitWebView(web, Config.WebPath("login?action=" + this.action), "login");
var r = new FormLogin();
InitWebView(web, Config.WebPath("login?action=" + this.action + "&version=" + Config.APP_VERSION + "&t=" + DateTime.Now.Ticks), "login");
}
}
}

View File

@ -0,0 +1,48 @@
namespace AIProofread.Controls
{
partial class FormMask
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.SuspendLayout();
//
// FormMask
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.Color.White;
this.ClientSize = new System.Drawing.Size(800, 450);
this.Name = "FormMask";
this.Opacity = 0.1D;
this.Text = "FormMask";
this.ResumeLayout(false);
}
#endregion
}
}

View File

@ -0,0 +1,46 @@
using AIProofread.Util;
using System;
using System.Drawing;
using System.Windows.Forms;
namespace AIProofread.Controls
{
public partial class FormMask : Form
{
public Form myParent;
public FormMask(Form myParent)
{
//InitializeComponent();
this.myParent = myParent;
this.FormBorderStyle = FormBorderStyle.None;
this.BackColor = Color.Black;
this.Opacity = 0.5; // 设置遮罩透明度
this.ShowInTaskbar = false;
this.StartPosition = FormStartPosition.Manual;
this.WindowState = FormWindowState.Maximized;
this.Click += FormMask_Click;
//this.TopMost = true;
}
private void FormMask_Click(object sender, EventArgs e)
{
User32Util.SetForegroundWindow(myParent.Handle);
myParent.Focus();
}
public void ShowOverWord()
{
IntPtr wordHandle = new IntPtr(Globals.ThisAddIn.Application.ActiveWindow.Hwnd); // 获取Word窗口句柄
// User32Util.SetParent(this.Handle, wordHandle);
var wordRect = new User32Util.RECT();
User32Util.GetWindowRect(wordHandle, ref wordRect);
// 设置遮罩窗体的位置和大小
this.Bounds = new Rectangle(wordRect.Left, wordRect.Top,
wordRect.Right - wordRect.Left,
wordRect.Bottom - wordRect.Top);
this.Show();
}
}
}

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -0,0 +1,158 @@
namespace AIProofread.Controls
{
partial class FormMessage
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.LblMeesage = new System.Windows.Forms.Label();
this.panel1 = new System.Windows.Forms.Panel();
this.IconClose = new System.Windows.Forms.PictureBox();
this.label1 = new System.Windows.Forms.Label();
this.BtnClose = new System.Windows.Forms.Button();
this.BtnConfirm = new System.Windows.Forms.Button();
this.panel1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.IconClose)).BeginInit();
this.SuspendLayout();
//
// LblMeesage
//
this.LblMeesage.BackColor = System.Drawing.Color.Transparent;
this.LblMeesage.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.LblMeesage.Location = new System.Drawing.Point(30, 60);
this.LblMeesage.Name = "LblMeesage";
this.LblMeesage.Size = new System.Drawing.Size(320, 70);
this.LblMeesage.TabIndex = 4;
this.LblMeesage.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// panel1
//
this.panel1.BackgroundImage = global::AIProofread.Properties.Resources.form_bg;
this.panel1.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch;
this.panel1.Controls.Add(this.IconClose);
this.panel1.Controls.Add(this.label1);
this.panel1.Location = new System.Drawing.Point(0, 0);
this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(380, 46);
this.panel1.TabIndex = 3;
this.panel1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.panel1_MouseDown);
//
// IconClose
//
this.IconClose.BackColor = System.Drawing.Color.Transparent;
this.IconClose.Cursor = System.Windows.Forms.Cursors.Hand;
this.IconClose.Image = global::AIProofread.Properties.Resources.icon_close;
this.IconClose.Location = new System.Drawing.Point(350, 15);
this.IconClose.Name = "IconClose";
this.IconClose.Size = new System.Drawing.Size(16, 16);
this.IconClose.TabIndex = 1;
this.IconClose.TabStop = false;
this.IconClose.Click += new System.EventHandler(this.IconClose_Click);
//
// label1
//
this.label1.AutoSize = true;
this.label1.BackColor = System.Drawing.Color.Transparent;
this.label1.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.label1.Location = new System.Drawing.Point(11, 12);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(74, 21);
this.label1.TabIndex = 0;
this.label1.Text = "温馨提示";
this.label1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.label1_MouseDown);
//
// BtnClose
//
this.BtnClose.BackColor = System.Drawing.Color.White;
this.BtnClose.BackgroundImage = global::AIProofread.Properties.Resources.button_default;
this.BtnClose.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch;
this.BtnClose.Cursor = System.Windows.Forms.Cursors.Hand;
this.BtnClose.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.BtnClose.FlatAppearance.BorderColor = System.Drawing.Color.Gainsboro;
this.BtnClose.FlatAppearance.BorderSize = 0;
this.BtnClose.FlatAppearance.MouseDownBackColor = System.Drawing.Color.Transparent;
this.BtnClose.FlatAppearance.MouseOverBackColor = System.Drawing.Color.Transparent;
this.BtnClose.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.BtnClose.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.BtnClose.ForeColor = System.Drawing.Color.Black;
this.BtnClose.Location = new System.Drawing.Point(200, 150);
this.BtnClose.Name = "BtnClose";
this.BtnClose.Size = new System.Drawing.Size(120, 44);
this.BtnClose.TabIndex = 2;
this.BtnClose.Text = "关闭";
this.BtnClose.UseVisualStyleBackColor = false;
this.BtnClose.Click += new System.EventHandler(this.BtnClose_Click);
//
// BtnConfirm
//
this.BtnConfirm.BackgroundImage = global::AIProofread.Properties.Resources.button;
this.BtnConfirm.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch;
this.BtnConfirm.Cursor = System.Windows.Forms.Cursors.Hand;
this.BtnConfirm.DialogResult = System.Windows.Forms.DialogResult.OK;
this.BtnConfirm.FlatAppearance.BorderSize = 0;
this.BtnConfirm.FlatAppearance.MouseDownBackColor = System.Drawing.Color.Transparent;
this.BtnConfirm.FlatAppearance.MouseOverBackColor = System.Drawing.Color.Transparent;
this.BtnConfirm.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.BtnConfirm.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.BtnConfirm.ForeColor = System.Drawing.Color.White;
this.BtnConfirm.Location = new System.Drawing.Point(60, 150);
this.BtnConfirm.Name = "BtnConfirm";
this.BtnConfirm.Size = new System.Drawing.Size(120, 44);
this.BtnConfirm.TabIndex = 1;
this.BtnConfirm.Text = "重新校对";
this.BtnConfirm.UseVisualStyleBackColor = true;
this.BtnConfirm.Click += new System.EventHandler(this.BtnConfirm_Click);
//
// FormMessage
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.Color.White;
this.ClientSize = new System.Drawing.Size(380, 216);
this.Controls.Add(this.LblMeesage);
this.Controls.Add(this.panel1);
this.Controls.Add(this.BtnClose);
this.Controls.Add(this.BtnConfirm);
this.Name = "FormMessage";
this.ShowIcon = false;
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "FormMessage";
this.panel1.ResumeLayout(false);
this.panel1.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.IconClose)).EndInit();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.Button BtnConfirm;
private System.Windows.Forms.Button BtnClose;
private System.Windows.Forms.Panel panel1;
private System.Windows.Forms.Label LblMeesage;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.PictureBox IconClose;
}
}

View File

@ -0,0 +1,165 @@
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace AIProofread.Controls
{
public partial class FormMessage : BaseWinForm
{
public const int WM_NCLBUTTONDOWN = 0xA1;
public const int HT_CAPTION = 0x2;
[DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
[DllImport("user32.dll")]
public static extern bool ReleaseCapture();
/// <summary>
/// 初始化宽度
/// </summary>
private const int INIT_WIDTH = 380;
public FormMessage()
{
InitializeComponent();
}
private void SetMessage(string message)
{
LblMeesage.Text = message;
}
private string currentConfirmText;
private string currentConfirmAction;
private void SetConfirmText(string confirmText)
{
currentConfirmText = confirmText;
if (confirmText == "proofread")
{
confirmText = "重新校对";
}
BtnConfirm.Text = confirmText;
BtnConfirm.Visible = true;
BtnConfirm.Enabled = true;
}
private void HideConfirm()
{
BtnConfirm.Visible = false;
BtnConfirm.Enabled = false;
BtnClose.Location = new System.Drawing.Point((
(this.Width - BtnClose.Width) / 2
), BtnClose.Location.Y);
}
/// <summary>
/// 计算缩放
/// </summary>
/// <param name="size"></param>
/// <returns></returns>
private int ScaleSize(int size)
{
return (int)(size * this.Width * 1.0 / INIT_WIDTH);
}
private void ResetButtons()
{
BtnClose.Location = new System.Drawing.Point(ScaleSize(200), BtnClose.Location.Y);
BtnConfirm.Location = new System.Drawing.Point(ScaleSize(60), BtnConfirm.Location.Y);
BtnConfirm.Visible = true;
BtnConfirm.Enabled = true;
}
public void HideCloseBtn()
{
BtnClose.Visible = false;
LblMeesage.Location = new System.Drawing.Point(LblMeesage.Location.X, LblMeesage.Location.Y + ScaleSize(30));
}
public static FormMessage ShowMessage(string message, int closeDelay = 3000)
{
FormMessage formMessage = new FormMessage();
formMessage.SetMessage(message);
formMessage.HideConfirm();
// 先置顶
formMessage.TopMost = true;
formMessage.Show();
return formMessage;
}
public static DialogResult ShowMessage(string message, string confirmText = "确认",string cancelText="取消", string confirmAction = null)
{
FormMessage formMessage = new FormMessage();
formMessage.SetMessage(message);
formMessage.currentConfirmAction = confirmAction;
formMessage.BtnClose.Text = cancelText;
if (string.IsNullOrEmpty(confirmText))
{
formMessage.HideConfirm();
}
else
{
formMessage.BtnConfirm.Text = confirmText;
formMessage.ResetButtons();
}
return formMessage.ShowDialog();
}
public static DialogResult ShowMessage(string message, string confirmText = "确认", string confirmAction = null)
{
FormMessage formMessage = new FormMessage();
formMessage.SetMessage(message);
formMessage.currentConfirmAction = confirmAction;
if (string.IsNullOrEmpty(confirmText))
{
formMessage.HideConfirm();
}
else
{
formMessage.BtnConfirm.Text = confirmText;
formMessage.ResetButtons();
}
return formMessage.ShowDialog();
}
private void BtnClose_Click(object sender, EventArgs e)
{
if (!string.IsNullOrEmpty(currentConfirmAction))
{
string time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
Globals.ThisAddIn.SendMessageToWeb(currentConfirmAction, "cancel");
}
this.Close();
}
private void BtnConfirm_Click(object sender, EventArgs e)
{
if (!string.IsNullOrEmpty(currentConfirmAction))
{
string time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
Globals.ThisAddIn.SendMessageToWeb(currentConfirmAction, "confirm");
}
this.Close();
}
private void IconClose_Click(object sender, EventArgs e)
{
this.Close();
}
private void HanleMouseDown()
{
ReleaseCapture();
SendMessage(this.Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
}
private void label1_MouseDown(object sender, MouseEventArgs e)
{
HanleMouseDown();
}
private void panel1_MouseDown(object sender, MouseEventArgs e)
{
HanleMouseDown();
}
}
}

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -0,0 +1,68 @@
namespace AIProofread.Controls
{
partial class FormReadme
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.WebView_ReadMe = new Microsoft.Web.WebView2.WinForms.WebView2();
((System.ComponentModel.ISupportInitialize)(this.WebView_ReadMe)).BeginInit();
this.SuspendLayout();
//
// WebView_ReadMe
//
this.WebView_ReadMe.AllowExternalDrop = true;
this.WebView_ReadMe.CreationProperties = null;
this.WebView_ReadMe.DefaultBackgroundColor = System.Drawing.Color.White;
this.WebView_ReadMe.Dock = System.Windows.Forms.DockStyle.Fill;
this.WebView_ReadMe.Location = new System.Drawing.Point(0, 0);
this.WebView_ReadMe.Name = "WebView_ReadMe";
this.WebView_ReadMe.Size = new System.Drawing.Size(600, 480);
this.WebView_ReadMe.TabIndex = 0;
this.WebView_ReadMe.ZoomFactor = 1D;
//
// FormReadme
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(600, 480);
this.Controls.Add(this.WebView_ReadMe);
this.Name = "FormReadme";
this.ShowIcon = false;
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "版本更新说明";
this.TopMost = true;
this.Load += new System.EventHandler(this.FormReadme_Load);
((System.ComponentModel.ISupportInitialize)(this.WebView_ReadMe)).EndInit();
this.ResumeLayout(false);
}
#endregion
private Microsoft.Web.WebView2.WinForms.WebView2 WebView_ReadMe;
}
}

View File

@ -0,0 +1,55 @@
using AIProofread.core;
using System;
using System.IO;
using System.Runtime.InteropServices;
namespace AIProofread.Controls
{
[ClassInterface(ClassInterfaceType.AutoDual)]
[ComVisible(true)]
public partial class FormReadme : BaseWinForm
{
/// <summary>
/// 单例实例。
/// </summary>
private static FormReadme INSTANCE = null;
public FormReadme()
{
InitializeComponent();
// 写入缓存
File.WriteAllText(Config.GetCurrentVersionReadmeCacheFile(), DateTime.Now.ToString("yyyy-M-d"));
}
/// <summary>
/// 获取单例对象。
/// </summary>
public static FormReadme GetInstance(bool newInstance = true)
{
if (newInstance && (INSTANCE == null || INSTANCE.IsDisposed))
{
INSTANCE = new FormReadme();
}
return INSTANCE;
}
public void CloseAndDispose()
{
if (INSTANCE != null && !INSTANCE.IsDisposed)
{
INSTANCE.Close();
INSTANCE = null;
}
}
private void FormReadme_Load(object sender, EventArgs e)
{
// 初始化
InitWebView(WebView_ReadMe, Config.WebPath("version-readme"), "version-readme", () =>
{
WebView_ReadMe.CoreWebView2.AddHostObjectToScript("readme", this);
});
}
}
}

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -0,0 +1,67 @@
namespace AIProofread.Controls
{
partial class FormWebView
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.WebView = new Microsoft.Web.WebView2.WinForms.WebView2();
((System.ComponentModel.ISupportInitialize)(this.WebView)).BeginInit();
this.SuspendLayout();
//
// WebView
//
this.WebView.AllowExternalDrop = true;
this.WebView.CreationProperties = null;
this.WebView.DefaultBackgroundColor = System.Drawing.Color.White;
this.WebView.Dock = System.Windows.Forms.DockStyle.Fill;
this.WebView.Location = new System.Drawing.Point(0, 0);
this.WebView.Name = "WebView";
this.WebView.Size = new System.Drawing.Size(800, 450);
this.WebView.TabIndex = 0;
this.WebView.ZoomFactor = 1D;
//
// FormWebView
//
this.AllowDrop = true;
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(800, 450);
this.Controls.Add(this.WebView);
this.Name = "FormWebView";
this.ShowIcon = false;
this.Text = "FormWebView";
this.Load += new System.EventHandler(this.FormWebView_Load);
((System.ComponentModel.ISupportInitialize)(this.WebView)).EndInit();
this.ResumeLayout(false);
}
#endregion
private Microsoft.Web.WebView2.WinForms.WebView2 WebView;
}
}

View File

@ -0,0 +1,37 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace AIProofread.Controls
{
[ClassInterface(ClassInterfaceType.AutoDual)]
[ComVisible(true)]
public partial class FormWebView : BaseWinForm
{
public string WebUrl { get; set; }
public FormWebView(string url,int width,int height)
{
InitializeComponent();
this.WebUrl = url;
this.SetSize(width, height);
}
public void SetSize(int width, int height)
{
this.Width = width;
this.Height = height;
}
private void FormWebView_Load(object sender, EventArgs e)
{
// 初始化
InitWebView(WebView,this.WebUrl, "webview");
}
}
}

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -0,0 +1,46 @@
namespace AIProofread.Controls
{
partial class MessageTips
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.SuspendLayout();
//
// MessageTips
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(483, 360);
this.Name = "MessageTips";
this.Text = "MessageTips";
this.ResumeLayout(false);
}
#endregion
}
}

View File

@ -0,0 +1,20 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace AIProofread.Controls
{
public partial class MessageTips : Form
{
public MessageTips()
{
InitializeComponent();
}
}
}

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -1,5 +1,6 @@
using Microsoft.Office.Interop.Word;

using Microsoft.Web.WebView2.Core;
using Microsoft.Web.WebView2.WinForms;
using System;
using System.Windows.Forms;
@ -7,35 +8,69 @@ namespace AIProofread.Controls
{
public partial class ProofreadMainControl : UserControl
{
private Document doc;
private int minWidth;
public ProofreadMainControl(Document doc,int minWidth)
public ProofreadMainControl()
{
InitializeComponent();
this.doc = doc;
this.minWidth = minWidth;
Bridge.InitWebEnvAsync("main", web);
//this.minWidth = 420 * LabelWidth() / 42;
//this.MinimumSize = new System.Drawing.Size(this.minWidth, 0);
}
private bool isShowingErrorPage = false;
public void WebView2NavigationCompleted(object sender, CoreWebView2NavigationCompletedEventArgs e)
{
if (isShowingErrorPage)
{
return;
}
if (e.IsSuccess)
{
isShowingErrorPage = false;
return;
}
isShowingErrorPage = true;
string errorPageHtml = @"
<html>
<head>
<title></title>
<style>
body { font-family: sans-serif; text-align: center; padding-top: 50px; user-select: none; }
h1 { color: #d00; }
</style>
</head>
<body oncontextmenu='return false;'>
<h1></h1>
<p></p>
<a href=" + "\"javascript:window.chrome.webview.postMessage('reload');\"" + @">重新加载</a>
</body>
</html>";
(sender as WebView2).CoreWebView2.NavigateToString(errorPageHtml);
}
private void ProofreadMainControl_Load(object sender, EventArgs e)
{
this.web.Source = new Uri(Config.WebPath("home?version=" + Config.APP_VERSION + "&t=" + DateTime.Now.Ticks));
this.web.NavigationCompleted += WebView2NavigationCompleted;
this.web.WebMessageReceived += (s, ex) =>
{
if (ex.TryGetWebMessageAsString() == "reload")
{
isShowingErrorPage = false;
web.Source = new Uri(Config.WebPath("correct"));
}
};
this.web.Source = new Uri(Config.WebPath("correct" ));
//this.SizeChanged += ProofreadMainControl_SizeChanged;
}
private void ProofreadMainControl_SizeChanged(object sender, EventArgs e)
{
if(this.minWidth > 0 && this.Width < this.minWidth)
{
SendKeys.Send("{ESC}");
this.Width = this.minWidth;
}
//if(this.minWidth > 0 && this.Width < this.minWidth)
//{
// SendKeys.Send("{ESC}");
// this.Width = this.minWidth;
//}
}
public int LabelWidth()
{

103
AIProofread/LogHelper.cs Normal file
View File

@ -0,0 +1,103 @@
using AIProofread.Controls;
using log4net.Config;
using log4net;
using System;
using System.IO;
using log4net.Appender;
using log4net.Layout;
using log4net.Repository.Hierarchy;
namespace AIProofread
{
public class LogHelper
{
public static FormLogger LoggerForm;
//private static readonly string AppDataPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
public static ILog Logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
static LogHelper()
{
//log4net.GlobalContext.Properties["APP_DATA"] = Config.APP_LOG_PATH;
//XmlConfigurator.Configure();
//Logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository();
PatternLayout layout = new PatternLayout("%date [%thread] %-5level %logger - %message%newline");
layout.ActivateOptions();
//string appDataPath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
//string logFilePath = Path.Combine(appDataPath, "YourAppName", "logs");
RollingFileAppender roller = new RollingFileAppender();
roller.File = Config.APP_LOG_PATH;
roller.AppendToFile = true;
roller.RollingStyle = RollingFileAppender.RollingMode.Date;
roller.DatePattern = "yyyy-MM-dd'.txt'";
roller.StaticLogFileName = false;
roller.Layout = layout;
roller.ActivateOptions();
hierarchy.Root.AddAppender(roller);
hierarchy.Root.Level = log4net.Core.Level.Info;
hierarchy.Configured = true;
}
/// <summary>
///
/// </summary>
/// <param name="msg"></param>
public static void Log(string tag, string message)
{
string time = DateTime.Now.ToString("HH:mm:ss");
// 如果日志窗口已经打开,则显示日志
if (LoggerForm != null && !LoggerForm.IsDisposed && LoggerForm.Visible)
{
LoggerForm.Log(time, tag, message);
}
if (!Directory.Exists(Config.APP_LOG_PATH))
{
Directory.CreateDirectory(Config.APP_LOG_PATH);
}
Logger.Debug($"[{tag}] {message}");
//try
//{
// string path = Config.APP_LOG_PATH + DateTime.Now.ToString("yyyy-MM-dd") + ".txt";
// StreamWriter streamWriter = File.AppendText(path);
// streamWriter.WriteLine("***************************[" + tag + "]***************************");
// streamWriter.WriteLine("消息:" + message);
// streamWriter.WriteLine("时间:" + time);
// streamWriter.WriteLine();
// streamWriter.Flush();
// streamWriter.Close();
// streamWriter.Dispose();
//}
//catch (Exception) { }
}
public static void Log(string msg)
{
Log((Config.IS_WPS ? "WPS" : "WORD"), msg);
}
public static void Log(Exception e)
{
Logger.Error(Config.IS_WPS ? "WPS" : "WORD" + e.ToString(), e);
//Log(e.Message + "\n" + e.StackTrace);
}
public static void Log(string tag, Exception e)
{
Logger.Error(tag, e);
}
public static void LogToWeb(string msg)
{
if (Config.RUN_IN_DEBUG)
{
Globals.ThisAddIn.SendMessageToWeb("DEBUG-LOG", msg);
}
}
internal static ILog GetLogger(Type type)
{
return LogManager.GetLogger(type);
}
}
}

View File

@ -1,50 +0,0 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AIProofread
{
public class Logger
{
private static readonly string AppDataPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
/// <summary>
///
/// </summary>
/// <param name="msg"></param>
public static void Log(string msg)
{
string path = Config.APP_LOG_PATH + DateTime.Now.ToString("yyyy-MM-dd") + ".txt";
if (!Directory.Exists(Config.APP_LOG_PATH))
{
Directory.CreateDirectory(Config.APP_LOG_PATH);
}
StreamWriter streamWriter = File.AppendText(path);
streamWriter.WriteLine("***************************[" + (Config.IS_WPS ? "WPS" : "WORD") + "]***************************");
streamWriter.WriteLine("消息:" + msg);
streamWriter.WriteLine("时间:" + DateTime.Now.ToString("yyyy - MM - dd HH: mm:ss"));
streamWriter.WriteLine();
streamWriter.Flush();
streamWriter.Close();
streamWriter.Dispose();
}
public static void Log( Exception e)
{
Log(e.Message + "\n" + e.StackTrace);
}
public static void Log(string tag, Exception e)
{
Log(tag + "\n" + e.StackTrace);
}
public static void LogToWeb(string msg)
{
if (Config.RUN_IN_DEBUG)
{
Globals.ThisAddIn.SendMessageToWeb("DEBUG-LOG", msg);
}
}
}
}

View File

@ -0,0 +1,47 @@
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AIProofread.Model
{
class BridgeResultModel
{
[JsonProperty("code")]
public int Code { get; set; }
[JsonProperty("message")]
public string Message { get; set; }
[JsonProperty("data")]
public object Data { get; set; }
}
public class BridgeResult
{
public static string Error()
{
return Error(-1, "error");
}
public static string Error(Exception ex)
{
return Error(-1, ex.Message);
}
public static string Error(string message)
{
return Error(-1, message);
}
public static string Error(int code, string message)
{
return JsonConvert.SerializeObject(new BridgeResultModel() { Code = code, Message = message });
}
public static string Success()
{
return Success(null);
}
public static string Success(object data)
{
return JsonConvert.SerializeObject(new BridgeResultModel() { Code = 0, Data = data, Message = "success" });
}
}
}

View File

@ -0,0 +1,31 @@
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AIProofread.Model
{
public enum CommonsenseDetectionType
{
All = 1,
Paragraph = 2
}
public class CommonsenseDetectionItem
{
[JsonProperty("id")]
public int Id { get; set; }
[JsonProperty("type")]
public CommonsenseDetectionType Type { get; set; }
[JsonProperty("summary")]
public string Summary { get; set; }
[JsonProperty("location")]
public string Location { get; set; }
[JsonProperty("result_content")]
public string ResultContent { get; set; }
}
}

View File

@ -0,0 +1,21 @@
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AIProofread.Model
{
public class DocumentContent
{
[JsonProperty("origin")]
public string[] OriginCut { get; set; }
[JsonProperty("trim_cut")]
public string[] TrimCut { get; set; }
[JsonProperty("paragraphs")]
public string[] Paragraphs { get; set; }
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,159 @@
using log4net;
using log4net.Repository.Hierarchy;
using Microsoft.Office.Interop.Word;
using System;
using System.Collections.Generic;
using System.Linq;
namespace AIProofread.Model
{
/// <summary>
/// 文档列表
/// </summary>
public class DocumentList
{
public ILog Logger = LogHelper.GetLogger(typeof(DocumentList));
public List<DocumentInfo> documentList = new List<DocumentInfo>();
public DocumentInfo ActiveDocument { get; set; }
public int Count => documentList.Count;
public void Add(DocumentInfo documentInfo)
{
documentList.Add(documentInfo);
}
public void Clear()
{
documentList.ForEach(doc => { doc.Dispose(); });
documentList.Clear();
}
public DocumentInfo Get(int index)
{
return documentList[index];
}
public DocumentInfo GetById(int id)
{
return Count > 0 ? documentList.FirstOrDefault(x => x.Id == id) : null;
}
public DocumentInfo Get(string uniqueId)
{
return Count > 0 ? documentList.FirstOrDefault(x => x.UniqueId == uniqueId) : null;
}
public DocumentInfo Get(Document doc)
{
return Count > 0 && doc != null ? documentList.FirstOrDefault(x => x.CurrentDocument == doc) : null;
}
public DocumentInfo GetActive()
{
// documentList.FirstOrDefault(x => x.IsActive)
return Count > 0 ? ActiveDocument : null;
}
public bool Contains(DocumentInfo documentInfo)
{
return Count > 0 && documentList.Contains(documentInfo);
}
public bool Contains(string uniqueId)
{
return Count > 0 && documentList.Any(x => x.UniqueId == uniqueId);
}
// 通过文档判断是否包含
public bool Contains(Document originDocument)
{
return Count > 0 && originDocument != null && documentList.Any(x => x.CurrentDocument == originDocument);
}
/// <summary>
/// 移除文档
/// </summary>
/// <param name="documentInfo"></param>
/// <returns></returns>
public bool Remove(DocumentInfo documentInfo)
{
return documentList.Remove(documentInfo);
}
public bool Remove(Document originDocument)
{
if (Count > 0 && originDocument != null)
{
documentList.RemoveAll(x =>
{
if (x.CurrentDocument == originDocument)
{
x.Close();
return true;
}
return false;
});
}
return true;
}
/// <summary>
/// 获取文档的索引
/// </summary>
/// <param name="item"></param>
/// <returns></returns>
public int IndexOf(DocumentInfo item)
{
return documentList.IndexOf(item);
}
/// <summary>
/// 设置当前激活的文档
/// </summary>
/// <param name="originDocument"></param>
public DocumentInfo SetActiveDocument(Document originDocument)
{
Logger.Debug("SetActiveDocument(113): " + originDocument.Name);
if (originDocument == null) return null;
var document = InitDocument(originDocument);
if (document == null)
{
Logger.Error("Document not exists SetActiveDocument");
return null;
}
if (ActiveDocument != null && ActiveDocument.CurrentDocument != originDocument)
{
// WPS 只有一个窗口 所以需要先关闭之前文档的面板
ActiveDocument?.Deactive();
}
// 如果存在,则设置激活
ActiveDocument = document;
//document.IsActive = true;
document.Active();
document.CheckBtnStatus();
return document;
}
internal void HideAllPane()
{
documentList.ForEach(d => d.HidePane());
}
public DocumentInfo InitDocument(Document originDocument)
{
var document = Get(originDocument);
try
{
// 如果不存在,则添加
if (document == null)
{
Logger.Debug("Document not exists,InitDocument: " + originDocument.Name);
document = new DocumentInfo(originDocument);
Add(document);
}
}catch(Exception ex)
{
Logger.Error("InitDocument error: " + ex.Message,ex);
}
return document;
}
}
}

View File

@ -0,0 +1,148 @@
using Microsoft.Office.Interop.Word;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text;
using UtilLib;
namespace AIProofread.Model
{
public class ExportDataItem
{
public int PageNumber { get; set; }
public int LineNumber { get; set; }
public string OriginSentence { get; set; }
public CorrectItem Item { get; set; }
private static readonly int MAX_WORD_LENGTH = 128;
public ExportDataItem(CorrectItem item, int pageNumber, int lineNumber,string originSentence = "")
{
Item = item;
PageNumber = pageNumber;
LineNumber = lineNumber;
OriginSentence = originSentence;
}
public static string GetSentence(ProofreadItem item)
{
var sentence = item.OriginSentence;
var isInsert = item.content.Tag == "i";
var limitLength = Math.Max(item.content.Origin.Length, MAX_WORD_LENGTH);
if (sentence.Length <= limitLength && !isInsert)
{
return sentence;
}
if (isInsert)
{
Debug.WriteLine("GetReadDocumentFilePath Start ==>", DateTime.Now.ToLongTimeString());
}
// 截取中间位置
if(sentence.Length > limitLength)
{
try
{
var middlePosition = limitLength / 2;
var cutStart = item.content.Start - middlePosition;
// 越界了
if (cutStart < 0)
{
cutStart = 0;
}
var originText = sentence.Substring(cutStart, Math.Min(sentence.Length - cutStart, limitLength));
if (!isInsert)
{
item.content.Start = item.content.Start - cutStart;
item.content.End = item.content.End - cutStart;
return originText;
}
}
catch (Exception ex)
{
LogHelper.Log(ex);
}
}
var sb = new StringBuilder();
if (sentence.Length <= limitLength && isInsert)
{
var before = item.content.Start == 0 ? string.Empty: sentence.Substring(0, item.content.Start);
var after = item.content.Start >= sentence.Length ? string.Empty : sentence.Substring(item.content.Start);
if (!string.IsNullOrEmpty(before))
{
sb.Append(before);
}
//
sb.Append(ToolUtil.GetBlankText(item.content.Text.Length, "˽"));
if (!string.IsNullOrEmpty(after))
{
sb.Append(after);
}
item.content.Start = item.content.Start;
item.content.End = item.content.Start + 1;
return sb.ToString().Trim();
}
var range = item.mark.Range;
// 获取range所在句子
//var first = range.Sentences.First.Start;
//var last = range.Sentences.Last.End;
var sentences = range.Sentences;
foreach (Microsoft.Office.Interop.Word.Range s in sentences)
{
var str = s.Text;
if (isInsert && range.Start >= s.Start && range.End <= s.End)
{
sb.Append(str.Replace(" ", "˽"));
}
else
{
sb.Append(str);
}
}
var first = sentences.First;
// 内容位置:用于后续标红
item.content.Start = range.Start - first.Start;
item.content.End = range.End - first.Start;
return sb.ToString().Trim();
}
public static List<ExportDataItem> GetExportData(Dictionary<int, ProofreadItem> marks)
{
List<ExportDataItem> list = new List<ExportDataItem>();
foreach (var item in marks)
{
// 没有mark
if (item.Value.mark == null) continue;
var it = item.Value.content;
// 单纯删除空格
if (it.Tag == "d" && it.Origin.Trim().Length == 0) continue;
var range = item.Value.mark.Range.Duplicate;
range.End = item.Value.mark.Start;
// 获取书签在文档的页码数
var pageNumber = range.get_Information(WdInformation.wdActiveEndPageNumber); // wdActiveEndPageNumber
// 获取书签在当前页面的行数
var lineNumber = range.get_Information(WdInformation.wdFirstCharacterLineNumber);
list.Add(new ExportDataItem(it, pageNumber, lineNumber,GetSentence(item.Value)));
}
// 根据页码和行数排序
list.Sort((x, y) =>
{
if (x.PageNumber == y.PageNumber)
{
if(x.LineNumber == y.LineNumber)
{
// 如果行数相同,则根据起始位置排序
return x.Item.Id.CompareTo(y.Item.Id);
}
// 如果页码相同,则根据行数排序
return x.LineNumber.CompareTo(y.LineNumber);
}
return x.PageNumber.CompareTo(y.PageNumber);
});
return list;
}
}
}

View File

@ -0,0 +1,10 @@
using Microsoft.Office.Tools.Word;
namespace AIProofread.Model
{
public class InsertMarkData
{
public Bookmark Mark { get; set; }
public int InsertLength { get; set; }
}
}

View File

@ -0,0 +1,11 @@
using Microsoft.Office.Interop.Word;
namespace AIProofread.Model
{
public class ProofreadRangeInfo
{
public float Size { get; set; }
public WdColor Background { get; set; }
public WdColor Color { get; set; }
}
}

View File

@ -8,32 +8,36 @@ using Bookmark = Microsoft.Office.Tools.Word.Bookmark;
namespace UtilLib
{
public class ProofreadItem
{
public Bookmark mark;
public CorrectedContent content;
private float originSize;
private WdColor originColor;
private WdColor originBackgroundColor;
public string OriginSentence { get; set; }
public CorrectItem content;
public float originSize;
public WdColor originColor;
public WdColor originBackgroundColor;
public string Name { get; set; }
public int DocumentId { get; set; }
public ProofreadItem(CorrectedContent content,int documentId)
public ProofreadItem(CorrectItem content, string originSentence, int documentId)
{
this.content = content;
this.DocumentId = documentId;
this.OriginSentence = originSentence;
InitBookMark(null);
SetMarkName();
}
private void SetMarkName()
{
this.Name = this.mark != null ? mark.Name : Config.BuildBookmarkName(content.id);
this.Name = this.mark != null ? mark.Name : Config.BuildBookmarkName(content.Id);
}
public ProofreadItem(CorrectedContent content, Bookmark bookmark, int documentId)
public ProofreadItem(CorrectItem content, string originSentence, Bookmark bookmark, int documentId)
{
this.DocumentId = documentId;
this.OriginSentence = originSentence;
this.content = content;
if (bookmark != null)
{
@ -52,13 +56,13 @@ namespace UtilLib
{
// 创建mark
this.mark = bookmark != null ? bookmark
: DocumentUtil.AddBookmark(content.tag == "i" ? null : content.color, content.start, content.end);
: DocumentUtil.AddBookmark(content.Tag == "i" ? null : content.Color, content.Start, content.End);
if (mark != null)
{
// 记录目前字体
originSize = mark.Range.Font.Size;
// 设置名称
mark.Name = Config.BuildBookmarkName(content.id);
mark.Name = Config.BuildBookmarkName(content.Id);
}
}
@ -72,14 +76,14 @@ namespace UtilLib
private void OnMarkSelected(object sender, Microsoft.Office.Tools.Word.SelectionEventArgs e)
{
//throw new System.NotImplementedException();
Bridge.bridge.SelectMarkById(content.id,DocumentId);
Bridge.bridge.SelectMarkById(content.Id, DocumentId);
}
public void Select()
{
if (mark == null) return;
mark.Range.Font.Size = originSize + 2; // 将选中标签文本放大字体
mark.Select();
//mark.Select();
}
public void UnSelect()
@ -92,7 +96,7 @@ namespace UtilLib
}
catch (Exception e)
{
Logger.Log(e);
LogHelper.Log(e);
}
}
@ -101,12 +105,15 @@ namespace UtilLib
try
{
if (mark == null) return;
//mark.Range.Underline = Microsoft.Office.Interop.Word.WdUnderline.wdUnderlineThick;
mark.Shading.BackgroundPatternColor = (WdColor)ColorTranslator.ToOle(Colors.FromHex(content.color));
// 颜色转码
var color = (WdColor)ColorTranslator.ToOle(Colors.FromHex(Config.TextBackgroundColor));
// 给选区添加背景颜色
mark.Shading.BackgroundPatternColor = color;
}
catch (Exception e)
{
Logger.Log(e);
LogHelper.Log(e);
}
}
@ -124,49 +131,113 @@ namespace UtilLib
}
catch (Exception e)
{
Logger.Log(e);
LogHelper.Log(e);
}
}
private void PrepareCommentProcess(Bookmark mark)
{
var doc = Globals.ThisAddIn.Application.ActiveDocument;
var fullRange = doc.Range();
var range = mark.Range;
var checkRange = doc.Range(
Math.Max(range.Start - 2, fullRange.Start),
Math.Min(range.End + 2, fullRange.End)
);
var comments = checkRange.Comments;
// 判断当前书签选区内容是否有评论
if (comments != null && comments.Count > 0)
{
LogHelper.Log("有批注");
foreach (Microsoft.Office.Interop.Word.Comment item in comments)
{
// 判断当前评论和书签选区是否一致
if (item.Scope.Start == range.Start && item.Scope.End == range.End)
{
LogHelper.Log("删除批注:" + item.Range.Text);
// 删除评论
item.Delete();
}
}
}
}
/// <summary>
/// 处理校对项
/// </summary>
/// <param name="status"></param>
public void Process(int status)
{
if (mark == null) return;
//
content.isAccept = status;
content.IsAccept = status;
// 采纳
if (status == AcceptStatus.Accept)
{
if (content.tag == "r" || content.tag == "i")
PrepareCommentProcess(mark);
if (content.Tag == "r" || content.Tag == "i")
{
mark.Text = content.text;
mark.Text = content.Text;
}
else if (content.tag == "d")
else if (content.Tag == "d")
{
mark.Text = "";
}
ResetMarkStyle();
}
} // 复核 或者 忽略
else if (status == AcceptStatus.Review || status == AcceptStatus.Ignore)
{
ResetMarkStyle();
// 新增添加了空格 所以当忽略时还原
if (content.tag == "i")
if (content.Tag == "i")
{
mark.Text = "";
}
}
// 撤销处理
else if (status == AcceptStatus.Default)
{
if (content.tag == "r" || content.tag == "d")
// 撤销
if (content.Tag == "r" || content.Tag == "d")
{
mark.Text = content.origin;
mark.Text = content.Origin;
}
else if (content.tag == "i")
else if (content.Tag == "i")
{
mark.Text = ToolUtil.GetBlankText(content.text.Length);
mark.Text = ToolUtil.GetBlankText(content.Text.Length);
}
SetMarkStyle();
}
// 处理由于批注导致出现百分号
AfterMarkTextChanged(mark);
}
private void AfterMarkTextChanged(Bookmark mark)
{
// 获取标签所在段落最后的位置
var paragraphEnd = mark.Paragraphs.Last.Range.End;
var end = mark.End + 2 > paragraphEnd ? paragraphEnd : mark.End + 2;
var rng = Globals.ThisAddIn.ActiveDocument.Range(mark.End, end);
// 判断书签范围内是否有批注
if (rng.Text?.IndexOf("%") != -1)
{
LogHelper.Log($"处理百分号问题:有批注");
if (rng.Comments != null && rng.Comments.Count > 0)
{
for (var i = 1; i < rng.Comments.Count; i++)
{
var comment = rng.Comments[i];
comment.Scope.Text = comment.Scope.Text.Replace("%", "");
}
}
else
{
rng.Text = rng.Text.Replace("%", "");
}
}
}
}
}

View File

@ -7,11 +7,11 @@ using System.Security;
// 控制。更改这些特性值可修改
// 与程序集关联的信息。
[assembly: AssemblyTitle("AI校对王")]
[assembly: AssemblyDescription("AI校对王")]
[assembly: AssemblyDescription("AI校对王 2.2.6")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("果麦文化")]
[assembly: AssemblyProduct("AI校对王")]
[assembly: AssemblyCopyright("Copyright © GuoMai 2024")]
[assembly: AssemblyCompany("果麦文化传媒股份有限公司")]
[assembly: AssemblyProduct("AI校对王 2.2.6")]
[assembly: AssemblyCopyright("Copyright © 果麦文化传媒股份有限公司 2025")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
@ -33,6 +33,6 @@ using System.Security;
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值,
// 方法是按如下所示使用“*”: :
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.1")]
[assembly: AssemblyFileVersion("1.0.0.1")]
[assembly: AssemblyVersion("2.2.6.0")]
[assembly: AssemblyFileVersion("2.2.6.0")]

View File

@ -60,6 +60,26 @@ namespace AIProofread.Properties {
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap button {
get {
object obj = ResourceManager.GetObject("button", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap button_default {
get {
object obj = ResourceManager.GetObject("button_default", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
@ -70,6 +90,36 @@ namespace AIProofread.Properties {
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap form_bg {
get {
object obj = ResourceManager.GetObject("form_bg", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap icon_ai_robot {
get {
object obj = ResourceManager.GetObject("icon-ai-robot", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap icon_ai_robot_wps {
get {
object obj = ResourceManager.GetObject("icon-ai-robot-wps", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
@ -110,6 +160,56 @@ namespace AIProofread.Properties {
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap icon_close {
get {
object obj = ResourceManager.GetObject("icon_close", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap icon_export {
get {
object obj = ResourceManager.GetObject("icon-export", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap icon_export_wps {
get {
object obj = ResourceManager.GetObject("icon-export-wps", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap icon_history {
get {
object obj = ResourceManager.GetObject("icon-history", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap icon_history_wps {
get {
object obj = ResourceManager.GetObject("icon-history-wps", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
@ -130,6 +230,46 @@ namespace AIProofread.Properties {
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap icon_manual {
get {
object obj = ResourceManager.GetObject("icon-manual", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap icon_manual_wps {
get {
object obj = ResourceManager.GetObject("icon-manual-wps", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap icon_panel {
get {
object obj = ResourceManager.GetObject("icon-panel", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap icon_panel_wps {
get {
object obj = ResourceManager.GetObject("icon-panel-wps", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
@ -170,6 +310,46 @@ namespace AIProofread.Properties {
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap icon_refresh {
get {
object obj = ResourceManager.GetObject("icon-refresh", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap icon_refresh_wps {
get {
object obj = ResourceManager.GetObject("icon-refresh-wps", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap icon_save {
get {
object obj = ResourceManager.GetObject("icon-save", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap icon_save_wps {
get {
object obj = ResourceManager.GetObject("icon-save-wps", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
@ -200,6 +380,26 @@ namespace AIProofread.Properties {
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap icon_update_new {
get {
object obj = ResourceManager.GetObject("icon-update-new", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap icon_update_new_wps {
get {
object obj = ResourceManager.GetObject("icon-update-new-wps", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
@ -229,5 +429,45 @@ namespace AIProofread.Properties {
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap logo {
get {
object obj = ResourceManager.GetObject("logo", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap logo_no_text {
get {
object obj = ResourceManager.GetObject("logo_no_text", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap logo_no_text_wps {
get {
object obj = ResourceManager.GetObject("logo_no_text_wps", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap logo_wps {
get {
object obj = ResourceManager.GetObject("logo_wps", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
}
}

View File

@ -118,56 +118,127 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="icon-logout" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icon-logout.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="favicon" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\favicon.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icon-setting" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icon-setting.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icon-phone" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icon-phone.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icon-update" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icon-update.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icon-book" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icon-book.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icon-clear" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icon-clear.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icon-proofread" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icon-proofread.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icon-user" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icon-user.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icon-book-wps" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icon-book-wps.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icon-clear-wps" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icon-clear-wps.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icon-logout-wps" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icon-logout-wps.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icon-phone-wps" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icon-phone-wps.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icon-proofread-wps" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icon-proofread-wps.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
<data name="button" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\button.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icon-setting-wps" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icon-setting-wps.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icon-update-wps" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icon-update-wps.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
<data name="icon-user" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icon-user.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icon-save-wps" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icon-save-wps.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icon-proofread-wps" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icon-proofread-wps.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icon-history" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icon-history.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icon-phone" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icon-phone.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icon-user-wps" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icon-user-wps.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="form_bg" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\form_bg.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icon-save" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icon-save.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icon-logout-wps" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icon-logout-wps.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icon-book-wps" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icon-book-wps.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icon-update-wps" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icon-update-wps.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icon-manual" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icon-manual.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icon-setting" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icon-setting.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="logo" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\logo.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icon-update" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icon-update.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icon-clear-wps" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icon-clear-wps.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icon-book" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icon-book.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icon-panel-wps" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icon-panel-wps.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="favicon" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\favicon.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icon-ai-robot-wps" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icon-ai-robot-wps.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icon-refresh-wps" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icon-refresh-wps.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icon-clear" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icon-clear.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icon-manual-wps" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icon-manual-wps.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="button_default" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\button_default.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icon-export-wps" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icon-export-wps.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icon-refresh" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icon-refresh.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="logo_no_text" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\logo_no_text.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="logo_no_text_wps" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\logo_no_text_wps.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="logo_wps" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\logo_wps.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icon-export" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icon-export.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icon-phone-wps" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icon-phone-wps.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icon-history-wps" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icon-history-wps.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icon-panel" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icon-panel.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icon-ai-robot" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icon-ai-robot.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icon-logout" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icon-logout.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icon_close" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icon_close.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icon-proofread" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icon-proofread.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icon-update-new" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icon-update-new.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icon-update-new-wps" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icon-update-new-wps.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
</root>

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 456 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 980 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 948 B

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.2 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.0 KiB

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.9 KiB

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.0 KiB

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.6 KiB

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 843 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 942 B

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 399 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

View File

@ -36,31 +36,59 @@ namespace AIProofread
/// </summary>
private void InitializeComponent()
{
Microsoft.Office.Tools.Ribbon.RibbonDropDownItem ribbonDropDownItemImpl1 = this.Factory.CreateRibbonDropDownItem();
Microsoft.Office.Tools.Ribbon.RibbonDropDownItem ribbonDropDownItemImpl2 = this.Factory.CreateRibbonDropDownItem();
Microsoft.Office.Tools.Ribbon.RibbonDropDownItem ribbonDropDownItemImpl3 = this.Factory.CreateRibbonDropDownItem();
this.tabAIProofread = this.Factory.CreateRibbonTab();
this.group1 = this.Factory.CreateRibbonGroup();
this.BtnProofreadAll = this.Factory.CreateRibbonButton();
this.menuProofreadList = this.Factory.CreateRibbonMenu();
this.BtnProofreadExact = this.Factory.CreateRibbonButton();
this.BtnProofreadFull = this.Factory.CreateRibbonButton();
this.BtnExportProofreadResult = this.Factory.CreateRibbonButton();
this.btnClear = this.Factory.CreateRibbonButton();
this.btnOpenLexicon = this.Factory.CreateRibbonButton();
this.menuSencenDect = this.Factory.CreateRibbonMenu();
this.btnDetectionAll = this.Factory.CreateRibbonButton();
this.btnDetectionParagraph = this.Factory.CreateRibbonButton();
this.btnDetectionHistory = this.Factory.CreateRibbonButton();
this.btnSetting = this.Factory.CreateRibbonButton();
this.Group = this.Factory.CreateRibbonGroup();
this.ButtonSaveCache = this.Factory.CreateRibbonButton();
this.ButtonLoadCache = this.Factory.CreateRibbonButton();
this.grpOther = this.Factory.CreateRibbonGroup();
this.BtnGetContact = this.Factory.CreateRibbonButton();
this.BtnUpdate = this.Factory.CreateRibbonButton();
this.btnLogin = this.Factory.CreateRibbonButton();
this.btnLogout = this.Factory.CreateRibbonButton();
this.LblNickname = this.Factory.CreateRibbonLabel();
this.LblDate = this.Factory.CreateRibbonLabel();
this.LblNickname = this.Factory.CreateRibbonLabel();
this.group2 = this.Factory.CreateRibbonGroup();
this.BtnShowPanel = this.Factory.CreateRibbonButton();
this.BtnShowManual = this.Factory.CreateRibbonButton();
this.grpDebug = this.Factory.CreateRibbonGroup();
this.btnShowPane = this.Factory.CreateRibbonButton();
this.btnHidePane = this.Factory.CreateRibbonButton();
this.BtnOpenLog = this.Factory.CreateRibbonButton();
this.button1 = this.Factory.CreateRibbonButton();
this.BtnOpenLogger = this.Factory.CreateRibbonButton();
this.BtnTest = this.Factory.CreateRibbonButton();
this.BtnOpenAppDir = this.Factory.CreateRibbonButton();
this.BtnShowVersion = this.Factory.CreateRibbonButton();
this.button2 = this.Factory.CreateRibbonButton();
this.dropDown1 = this.Factory.CreateRibbonDropDown();
this.tabAIProofread.SuspendLayout();
this.group1.SuspendLayout();
this.Group.SuspendLayout();
this.grpOther.SuspendLayout();
this.group2.SuspendLayout();
this.grpDebug.SuspendLayout();
this.SuspendLayout();
//
// tabAIProofread
//
this.tabAIProofread.Groups.Add(this.group1);
this.tabAIProofread.Groups.Add(this.Group);
this.tabAIProofread.Groups.Add(this.grpOther);
this.tabAIProofread.Groups.Add(this.group2);
this.tabAIProofread.Groups.Add(this.grpDebug);
this.tabAIProofread.Label = "AI校对王";
this.tabAIProofread.Name = "tabAIProofread";
@ -68,32 +96,52 @@ namespace AIProofread
//
// group1
//
this.group1.Items.Add(this.BtnProofreadAll);
this.group1.Items.Add(this.menuProofreadList);
this.group1.Items.Add(this.BtnExportProofreadResult);
this.group1.Items.Add(this.btnClear);
this.group1.Items.Add(this.btnOpenLexicon);
this.group1.Items.Add(this.menuSencenDect);
this.group1.Items.Add(this.btnSetting);
this.group1.Items.Add(this.BtnGetContact);
this.group1.Items.Add(this.BtnUpdate);
this.group1.Items.Add(this.btnLogin);
this.group1.Items.Add(this.btnLogout);
this.group1.Items.Add(this.LblNickname);
this.group1.Items.Add(this.LblDate);
this.group1.Name = "group1";
//
// BtnProofreadAll
// menuProofreadList
//
this.BtnProofreadAll.ControlSize = Microsoft.Office.Core.RibbonControlSize.RibbonControlSizeLarge;
this.BtnProofreadAll.Image = global::AIProofread.Properties.Resources.icon_proofread;
this.BtnProofreadAll.Label = "全文校对\n";
this.BtnProofreadAll.Name = "BtnProofreadAll";
this.BtnProofreadAll.ShowImage = true;
this.BtnProofreadAll.Click += new Microsoft.Office.Tools.Ribbon.RibbonControlEventHandler(this.BtnProofreadAll_Click);
this.menuProofreadList.ControlSize = Microsoft.Office.Core.RibbonControlSize.RibbonControlSizeLarge;
this.menuProofreadList.Image = global::AIProofread.Properties.Resources.icon_proofread;
this.menuProofreadList.Items.Add(this.BtnProofreadExact);
this.menuProofreadList.Items.Add(this.BtnProofreadFull);
this.menuProofreadList.Label = "全文校对\r\n";
this.menuProofreadList.Name = "menuProofreadList";
this.menuProofreadList.ShowImage = true;
//
// BtnProofreadExact
//
this.BtnProofreadExact.Label = "优先查准";
this.BtnProofreadExact.Name = "BtnProofreadExact";
this.BtnProofreadExact.ShowImage = true;
this.BtnProofreadExact.Click += new Microsoft.Office.Tools.Ribbon.RibbonControlEventHandler(this.BtnProofreadExact_Click);
//
// BtnProofreadFull
//
this.BtnProofreadFull.Label = "优先查全";
this.BtnProofreadFull.Name = "BtnProofreadFull";
this.BtnProofreadFull.ShowImage = true;
this.BtnProofreadFull.Click += new Microsoft.Office.Tools.Ribbon.RibbonControlEventHandler(this.BtnProofreadFull_Click);
//
// BtnExportProofreadResult
//
this.BtnExportProofreadResult.ControlSize = Microsoft.Office.Core.RibbonControlSize.RibbonControlSizeLarge;
this.BtnExportProofreadResult.Image = global::AIProofread.Properties.Resources.icon_export;
this.BtnExportProofreadResult.Label = "勘误表导出\r\n";
this.BtnExportProofreadResult.Name = "BtnExportProofreadResult";
this.BtnExportProofreadResult.ShowImage = true;
this.BtnExportProofreadResult.Click += new Microsoft.Office.Tools.Ribbon.RibbonControlEventHandler(this.BtnExportProofreadResult_Click);
//
// btnClear
//
this.btnClear.ControlSize = Microsoft.Office.Core.RibbonControlSize.RibbonControlSizeLarge;
this.btnClear.Image = global::AIProofread.Properties.Resources.icon_clear;
this.btnClear.Label = "清除标注\n";
this.btnClear.Label = "清除标注\r\n";
this.btnClear.Name = "btnClear";
this.btnClear.ShowImage = true;
this.btnClear.Click += new Microsoft.Office.Tools.Ribbon.RibbonControlEventHandler(this.btnClear_Click);
@ -102,25 +150,92 @@ namespace AIProofread
//
this.btnOpenLexicon.ControlSize = Microsoft.Office.Core.RibbonControlSize.RibbonControlSizeLarge;
this.btnOpenLexicon.Image = global::AIProofread.Properties.Resources.icon_book;
this.btnOpenLexicon.Label = "词库管理\n";
this.btnOpenLexicon.Label = "词库管理\r\n";
this.btnOpenLexicon.Name = "btnOpenLexicon";
this.btnOpenLexicon.ShowImage = true;
this.btnOpenLexicon.Click += new Microsoft.Office.Tools.Ribbon.RibbonControlEventHandler(this.btnOpenLexicon_Click);
//
// menuSencenDect
//
this.menuSencenDect.ControlSize = Microsoft.Office.Core.RibbonControlSize.RibbonControlSizeLarge;
this.menuSencenDect.Image = global::AIProofread.Properties.Resources.icon_ai_robot;
this.menuSencenDect.Items.Add(this.btnDetectionAll);
this.menuSencenDect.Items.Add(this.btnDetectionParagraph);
this.menuSencenDect.Items.Add(this.btnDetectionHistory);
this.menuSencenDect.Label = "常识性校对助手\r\n";
this.menuSencenDect.Name = "menuSencenDect";
this.menuSencenDect.ShowImage = true;
//
// btnDetectionAll
//
this.btnDetectionAll.Label = "全文常识检测\r\n";
this.btnDetectionAll.Name = "btnDetectionAll";
this.btnDetectionAll.ShowImage = true;
this.btnDetectionAll.Click += new Microsoft.Office.Tools.Ribbon.RibbonControlEventHandler(this.btnDetectionAll_Click);
//
// btnDetectionParagraph
//
this.btnDetectionParagraph.Enabled = false;
this.btnDetectionParagraph.Label = "段落常识检测\r\n";
this.btnDetectionParagraph.Name = "btnDetectionParagraph";
this.btnDetectionParagraph.ShowImage = true;
this.btnDetectionParagraph.Click += new Microsoft.Office.Tools.Ribbon.RibbonControlEventHandler(this.btnDetectionParagraph_Click);
//
// btnDetectionHistory
//
this.btnDetectionHistory.Label = "历史检测记录\r\n";
this.btnDetectionHistory.Name = "btnDetectionHistory";
this.btnDetectionHistory.ShowImage = true;
this.btnDetectionHistory.Click += new Microsoft.Office.Tools.Ribbon.RibbonControlEventHandler(this.btnDetectionHistory_Click);
//
// btnSetting
//
this.btnSetting.ControlSize = Microsoft.Office.Core.RibbonControlSize.RibbonControlSizeLarge;
this.btnSetting.Image = global::AIProofread.Properties.Resources.icon_setting;
this.btnSetting.Label = "插件设置\n";
this.btnSetting.Label = "设置\r\n";
this.btnSetting.Name = "btnSetting";
this.btnSetting.ShowImage = true;
this.btnSetting.Click += new Microsoft.Office.Tools.Ribbon.RibbonControlEventHandler(this.btnSetting_Click);
//
// Group
//
this.Group.Items.Add(this.ButtonSaveCache);
this.Group.Items.Add(this.ButtonLoadCache);
this.Group.Name = "Group";
//
// ButtonSaveCache
//
this.ButtonSaveCache.ControlSize = Microsoft.Office.Core.RibbonControlSize.RibbonControlSizeLarge;
this.ButtonSaveCache.Image = global::AIProofread.Properties.Resources.icon_save;
this.ButtonSaveCache.Label = "保存进度\r\n";
this.ButtonSaveCache.Name = "ButtonSaveCache";
this.ButtonSaveCache.ShowImage = true;
this.ButtonSaveCache.Click += new Microsoft.Office.Tools.Ribbon.RibbonControlEventHandler(this.ButtonSaveCache_Click);
//
// ButtonLoadCache
//
this.ButtonLoadCache.ControlSize = Microsoft.Office.Core.RibbonControlSize.RibbonControlSizeLarge;
this.ButtonLoadCache.Image = global::AIProofread.Properties.Resources.icon_history;
this.ButtonLoadCache.Label = "加载进度\r\n";
this.ButtonLoadCache.Name = "ButtonLoadCache";
this.ButtonLoadCache.ShowImage = true;
this.ButtonLoadCache.Click += new Microsoft.Office.Tools.Ribbon.RibbonControlEventHandler(this.ButtonLoadCache_Click);
//
// grpOther
//
this.grpOther.Items.Add(this.BtnGetContact);
this.grpOther.Items.Add(this.BtnUpdate);
this.grpOther.Items.Add(this.btnLogin);
this.grpOther.Items.Add(this.btnLogout);
this.grpOther.Items.Add(this.LblDate);
this.grpOther.Items.Add(this.LblNickname);
this.grpOther.Name = "grpOther";
//
// BtnGetContact
//
this.BtnGetContact.ControlSize = Microsoft.Office.Core.RibbonControlSize.RibbonControlSizeLarge;
this.BtnGetContact.Image = global::AIProofread.Properties.Resources.icon_phone;
this.BtnGetContact.Label = "联系客服\n";
this.BtnGetContact.Label = "联系客服\r\n";
this.BtnGetContact.Name = "BtnGetContact";
this.BtnGetContact.ShowImage = true;
this.BtnGetContact.Click += new Microsoft.Office.Tools.Ribbon.RibbonControlEventHandler(this.BtnGetContact_Click);
@ -129,7 +244,7 @@ namespace AIProofread
//
this.BtnUpdate.ControlSize = Microsoft.Office.Core.RibbonControlSize.RibbonControlSizeLarge;
this.BtnUpdate.Image = global::AIProofread.Properties.Resources.icon_update;
this.BtnUpdate.Label = "版本更新\n";
this.BtnUpdate.Label = "版本更新\r\n";
this.BtnUpdate.Name = "BtnUpdate";
this.BtnUpdate.ShowImage = true;
this.BtnUpdate.Click += new Microsoft.Office.Tools.Ribbon.RibbonControlEventHandler(this.BtnUpdate_Click);
@ -138,39 +253,71 @@ namespace AIProofread
//
this.btnLogin.ControlSize = Microsoft.Office.Core.RibbonControlSize.RibbonControlSizeLarge;
this.btnLogin.Image = global::AIProofread.Properties.Resources.icon_user;
this.btnLogin.Label = "用户登录\n";
this.btnLogin.Label = "用户登录\r\n";
this.btnLogin.Name = "btnLogin";
this.btnLogin.ScreenTip = "用户登录\r\n";
this.btnLogin.ShowImage = true;
this.btnLogin.SuperTip = "通过手机验证码或者密码登录账号";
this.btnLogin.Click += new Microsoft.Office.Tools.Ribbon.RibbonControlEventHandler(this.btnLogin_Click);
//
// btnLogout
//
this.btnLogout.ControlSize = Microsoft.Office.Core.RibbonControlSize.RibbonControlSizeLarge;
this.btnLogout.Image = global::AIProofread.Properties.Resources.icon_logout;
this.btnLogout.Label = "退出登录\n";
this.btnLogout.Label = "退出登录\r\n";
this.btnLogout.Name = "btnLogout";
this.btnLogout.ShowImage = true;
this.btnLogout.Visible = false;
this.btnLogout.Click += new Microsoft.Office.Tools.Ribbon.RibbonControlEventHandler(this.btnLogout_Click);
//
// LblNickname
//
this.LblNickname.Label = "xxx 已登录";
this.LblNickname.Name = "LblNickname";
this.LblNickname.Visible = false;
//
// LblDate
//
this.LblDate.Label = "过期时间:";
this.LblDate.Name = "LblDate";
this.LblDate.Visible = false;
//
// LblNickname
//
this.LblNickname.Label = "xxx 已登录";
this.LblNickname.Name = "LblNickname";
this.LblNickname.Visible = false;
//
// group2
//
this.group2.Items.Add(this.BtnShowPanel);
this.group2.Items.Add(this.BtnShowManual);
this.group2.Name = "group2";
//
// BtnShowPanel
//
this.BtnShowPanel.ControlSize = Microsoft.Office.Core.RibbonControlSize.RibbonControlSizeLarge;
this.BtnShowPanel.Enabled = false;
this.BtnShowPanel.Image = global::AIProofread.Properties.Resources.icon_panel;
this.BtnShowPanel.Label = "显示面板\r\n";
this.BtnShowPanel.Name = "BtnShowPanel";
this.BtnShowPanel.ShowImage = true;
this.BtnShowPanel.Click += new Microsoft.Office.Tools.Ribbon.RibbonControlEventHandler(this.BtnShowPanel_Click);
//
// BtnShowManual
//
this.BtnShowManual.ControlSize = Microsoft.Office.Core.RibbonControlSize.RibbonControlSizeLarge;
this.BtnShowManual.Image = global::AIProofread.Properties.Resources.icon_manual;
this.BtnShowManual.Label = "用户手册\r\n";
this.BtnShowManual.Name = "BtnShowManual";
this.BtnShowManual.ShowImage = true;
this.BtnShowManual.Click += new Microsoft.Office.Tools.Ribbon.RibbonControlEventHandler(this.BtnShowManual_Click);
//
// grpDebug
//
this.grpDebug.Items.Add(this.btnShowPane);
this.grpDebug.Items.Add(this.btnHidePane);
this.grpDebug.Items.Add(this.BtnOpenLog);
this.grpDebug.Items.Add(this.button1);
this.grpDebug.Items.Add(this.BtnOpenLogger);
this.grpDebug.Items.Add(this.BtnTest);
this.grpDebug.Items.Add(this.BtnOpenAppDir);
this.grpDebug.Items.Add(this.BtnShowVersion);
this.grpDebug.Items.Add(this.button2);
this.grpDebug.Items.Add(this.dropDown1);
this.grpDebug.Label = "开发调试";
this.grpDebug.Name = "grpDebug";
this.grpDebug.Visible = false;
@ -193,11 +340,46 @@ namespace AIProofread
this.BtnOpenLog.Name = "BtnOpenLog";
this.BtnOpenLog.Click += new Microsoft.Office.Tools.Ribbon.RibbonControlEventHandler(this.BtnOpenLog_Click);
//
// button1
// BtnOpenLogger
//
this.button1.Label = "更新测试版本";
this.button1.Name = "button1";
this.button1.Click += new Microsoft.Office.Tools.Ribbon.RibbonControlEventHandler(this.button1_Click);
this.BtnOpenLogger.Label = "打开日志窗口";
this.BtnOpenLogger.Name = "BtnOpenLogger";
this.BtnOpenLogger.Click += new Microsoft.Office.Tools.Ribbon.RibbonControlEventHandler(this.BtnOpenLogger_Click);
//
// BtnTest
//
this.BtnTest.Label = "获取当前位置";
this.BtnTest.Name = "BtnTest";
this.BtnTest.Click += new Microsoft.Office.Tools.Ribbon.RibbonControlEventHandler(this.BtnTest_Click);
//
// BtnOpenAppDir
//
this.BtnOpenAppDir.Label = "打开插件目录";
this.BtnOpenAppDir.Name = "BtnOpenAppDir";
this.BtnOpenAppDir.Click += new Microsoft.Office.Tools.Ribbon.RibbonControlEventHandler(this.BtnOpenAppDir_Click);
//
// BtnShowVersion
//
this.BtnShowVersion.Label = "版本查看";
this.BtnShowVersion.Name = "BtnShowVersion";
this.BtnShowVersion.Click += new Microsoft.Office.Tools.Ribbon.RibbonControlEventHandler(this.BtnShowVersion_Click);
//
// button2
//
this.button2.Label = "打开登录窗口";
this.button2.Name = "button2";
this.button2.Click += new Microsoft.Office.Tools.Ribbon.RibbonControlEventHandler(this.button2_Click);
//
// dropDown1
//
ribbonDropDownItemImpl1.Label = "开发";
ribbonDropDownItemImpl2.Label = "测试";
ribbonDropDownItemImpl3.Label = "生产";
this.dropDown1.Items.Add(ribbonDropDownItemImpl1);
this.dropDown1.Items.Add(ribbonDropDownItemImpl2);
this.dropDown1.Items.Add(ribbonDropDownItemImpl3);
this.dropDown1.Label = "环境";
this.dropDown1.Name = "dropDown1";
//
// Ribbon1
//
@ -209,6 +391,12 @@ namespace AIProofread
this.tabAIProofread.PerformLayout();
this.group1.ResumeLayout(false);
this.group1.PerformLayout();
this.Group.ResumeLayout(false);
this.Group.PerformLayout();
this.grpOther.ResumeLayout(false);
this.grpOther.PerformLayout();
this.group2.ResumeLayout(false);
this.group2.PerformLayout();
this.grpDebug.ResumeLayout(false);
this.grpDebug.PerformLayout();
this.ResumeLayout(false);
@ -223,7 +411,6 @@ namespace AIProofread
internal Microsoft.Office.Tools.Ribbon.RibbonLabel LblNickname;
internal Microsoft.Office.Tools.Ribbon.RibbonLabel LblDate;
internal Microsoft.Office.Tools.Ribbon.RibbonButton btnLogin;
internal Microsoft.Office.Tools.Ribbon.RibbonButton BtnProofreadAll;
internal Microsoft.Office.Tools.Ribbon.RibbonButton btnClear;
internal Microsoft.Office.Tools.Ribbon.RibbonButton btnOpenLexicon;
internal Microsoft.Office.Tools.Ribbon.RibbonButton btnSetting;
@ -233,7 +420,27 @@ namespace AIProofread
internal Microsoft.Office.Tools.Ribbon.RibbonButton btnShowPane;
internal Microsoft.Office.Tools.Ribbon.RibbonButton btnHidePane;
internal Microsoft.Office.Tools.Ribbon.RibbonButton BtnOpenLog;
internal Microsoft.Office.Tools.Ribbon.RibbonButton button1;
internal Microsoft.Office.Tools.Ribbon.RibbonGroup Group;
internal Microsoft.Office.Tools.Ribbon.RibbonButton ButtonSaveCache;
internal Microsoft.Office.Tools.Ribbon.RibbonButton ButtonLoadCache;
internal Microsoft.Office.Tools.Ribbon.RibbonButton BtnOpenLogger;
internal Microsoft.Office.Tools.Ribbon.RibbonButton BtnTest;
internal Microsoft.Office.Tools.Ribbon.RibbonButton BtnOpenAppDir;
internal Microsoft.Office.Tools.Ribbon.RibbonGroup group2;
internal Microsoft.Office.Tools.Ribbon.RibbonButton BtnShowPanel;
internal Microsoft.Office.Tools.Ribbon.RibbonButton BtnExportProofreadResult;
internal Microsoft.Office.Tools.Ribbon.RibbonButton BtnShowVersion;
internal Microsoft.Office.Tools.Ribbon.RibbonDropDown dropDown1;
internal Microsoft.Office.Tools.Ribbon.RibbonGroup grpOther;
internal Microsoft.Office.Tools.Ribbon.RibbonMenu menuSencenDect;
internal Microsoft.Office.Tools.Ribbon.RibbonButton btnDetectionAll;
internal Microsoft.Office.Tools.Ribbon.RibbonButton btnDetectionParagraph;
internal Microsoft.Office.Tools.Ribbon.RibbonButton btnDetectionHistory;
internal Microsoft.Office.Tools.Ribbon.RibbonButton BtnShowManual;
internal Microsoft.Office.Tools.Ribbon.RibbonMenu menuProofreadList;
internal Microsoft.Office.Tools.Ribbon.RibbonButton BtnProofreadExact;
internal Microsoft.Office.Tools.Ribbon.RibbonButton BtnProofreadFull;
internal Microsoft.Office.Tools.Ribbon.RibbonButton button2;
}
partial class ThisRibbonCollection

View File

@ -3,81 +3,150 @@ using System;
using System.Diagnostics;
using AIProofread.Controls;
using UtilLib;
using System.Drawing;
using System.Security.Cryptography;
using Microsoft.Office.Interop.Word;
using System.IO;
using System.Threading.Tasks;
using AIProofread.Util;
using Microsoft.Office.Tools.Word;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AIProofread.core;
using System.Windows.Forms;
using AIProofread.Properties;
using System.Security.Policy;
namespace AIProofread
{
public partial class Ribbon1
{
private bool IS_LOGIN = false;
private Userinfo currentLoginUserinfo;
private void Ribbon1_Load(object sender, RibbonUIEventArgs e)
{
//btnLogin.Label = "用户\n登录";
//btnLogout.Label = "退出\n登录";
Globals.ThisAddIn.ribbon = this;
ShowDebug();
InitModule();
}
/// <summary>
/// 用于调试或测试
/// </summary>
public void ShowDebug()
public void InitModule()
{
if (Config.RUN_IN_DEBUG)
menuProofreadList.Visible = AppModule.ENABLE_PROOFREAD;
BtnExportProofreadResult.Visible = AppModule.ENABLE_EXPORT_PROOFREAD_RESULT;
btnOpenLexicon.Visible = AppModule.ENABLE_LEXICON_MANAGE;
menuSencenDect.Visible = AppModule.ENABLE_COMMONSENSE_CHECK;
btnSetting.Visible = AppModule.ENABLE_SETTING;
ButtonSaveCache.Visible = AppModule.ENABLE_SAVE_CACHE;
ButtonLoadCache.Visible = AppModule.ENABLE_LOAD_CACHE;
BtnGetContact.Visible = AppModule.ENABLE_CUSTOMER_SERVICE;
BtnUpdate.Visible = AppModule.ENABLE_UPGRADE;
BtnShowManual.Visible = AppModule.ENABLE_HELP;
// 调试面板
grpDebug.Visible = Config.RUN_IN_DEBUG;
}
public void SetCommonBtnStatus(bool status)
{
grpDebug.Visible = true;
// BtnProofreadAll.Enabled = status;
menuProofreadList.Enabled = status;
btnClear.Enabled = status;
btnOpenLexicon.Enabled = status;
btnSetting.Enabled = status;
BtnUpdate.Enabled = status;
btnLogin.Enabled = status;
btnLogout.Enabled = status;
ButtonLoadCache.Enabled = status;
ButtonSaveCache.Enabled = status;
menuSencenDect.Enabled = status;
//BtnShowPanel.Enabled = status;
BtnExportProofreadResult.Enabled = status;
}
public void SetBtnStatus(string key, bool status)
{
if (key == "proofread-status")
{
SetCommonBtnStatus(status);
}
else if (key == "view-panel")
{
BtnShowPanel.Enabled = status;
}
else if (key == "disable-by-upgrade")
{
SetCommonBtnStatus(status);
BtnUpdate.Enabled = true;
BtnShowPanel.Enabled = status;
}
}
/// <summary>
/// 初始化WPS相关功能(图标)
/// </summary>
public void InitWPS()
{
BtnProofreadAll.Image = AIProofread.Properties.Resources.icon_proofread_wps;
menuProofreadList.Image = AIProofread.Properties.Resources.icon_proofread_wps;
btnClear.Image = AIProofread.Properties.Resources.icon_clear_wps;
btnOpenLexicon.Image = AIProofread.Properties.Resources.icon_book_wps;
btnSetting.Image = AIProofread.Properties.Resources.icon_setting_wps;
BtnGetContact.Image = AIProofread.Properties.Resources.icon_phone_wps;
BtnUpdate.Image = AIProofread.Properties.Resources.icon_update_wps;
btnLogin.Image = AIProofread.Properties.Resources.icon_user_wps;
menuSencenDect.Image = AIProofread.Properties.Resources.icon_ai_robot_wps;
btnLogout.Image = AIProofread.Properties.Resources.icon_logout_wps;
// 缓存相关
ButtonLoadCache.Image = AIProofread.Properties.Resources.icon_refresh_wps;
ButtonSaveCache.Image = AIProofread.Properties.Resources.icon_save_wps;
// 显示面板
BtnShowPanel.Image = AIProofread.Properties.Resources.icon_panel_wps;
// 导出校对结果
BtnExportProofreadResult.Image = AIProofread.Properties.Resources.icon_export_wps;
BtnShowManual.Image = AIProofread.Properties.Resources.icon_manual_wps;
}
public void ProcessLoginInfo(Userinfo userinfo)
{
if (userinfo == null) return;
currentLoginUserinfo = userinfo;
// 登录状态
IS_LOGIN = true;
// 切换登录状态
ToggleLogin();
LblNickname.Label = userinfo.nickname;
LblDate.Label = userinfo.expiration;
// 关闭所有登录窗口
foreach (var item in Globals.ThisAddIn.LoginFormList)
{
try
{
if (!item.IsDisposed)
{
item.Close();
}
}
catch (Exception ex)
{
LogHelper.Log(this.Name, ex);
}
}
Globals.ThisAddIn.LoginFormList.Clear();
}
/// <summary>
/// 注销登录
/// </summary>
public void ProcessLogout()
{
Globals.ThisAddIn.CloseReadmeIfShown();
IS_LOGIN = false;
currentLoginUserinfo = null;
ToggleLogin();
Globals.ThisAddIn.HideAllPanel();
}
// 处理是否登录的展示
@ -94,64 +163,84 @@ namespace AIProofread
// 弹出登录窗口
private void btnLogin_Click(object sender, RibbonControlEventArgs e)
{
Globals.ThisAddIn.CloseReadmeIfShown();
Bridge.bridge.ShowLoginForm(null);
}
// 注销登录
private void btnLogout_Click(object sender, RibbonControlEventArgs e)
{
Globals.ThisAddIn.CloseReadmeIfShown();
Globals.ThisAddIn.ActiveDocument.ShowDialog(currentLoginUserinfo.phone + " 退出AI校对王", "确定", "logout");
//Globals.ThisAddIn.ShowDialog("退出AI校对王",)
// 注销吧
Bridge.bridge.Logout(null);
Globals.ThisAddIn.HideAllPanel();
//Bridge.bridge.Logout(null);
//Globals.ThisAddIn.HideAllPanel();
//Globals.ThisAddIn.SendMessageToWeb("confirm-logout", null);
}
public void ShowNewVersionIcon()
{
Globals.ThisAddIn.CloseReadmeIfShown();
BtnUpdate.Image = Globals.ThisAddIn.IsWPS? Resources.icon_update_new_wps : Resources.icon_update_new;
}
private void btnOpenLexicon_Click(object sender, RibbonControlEventArgs e)
{
Globals.ThisAddIn.CloseReadmeIfShown();
Globals.ThisAddIn.SendMessageToWeb("show-lexicon", null);
//(new FormLexicon()).Show();
}
private void btnSetting_Click(object sender, RibbonControlEventArgs e)
{
Globals.ThisAddIn.CloseReadmeIfShown();
Globals.ThisAddIn.SendMessageToWeb("show-setting", null);
}
private void BtnGetContact_Click(object sender, RibbonControlEventArgs e)
{
(new FormContact()).ShowDialog();
Globals.ThisAddIn.CloseReadmeIfShown();
var frm = new FormContact();
Globals.ThisAddIn.ActiveDocument.RunInMainThread(() =>
{
frm.ShowDialog();
});
}
private void BtnUpdate_Click(object sender, RibbonControlEventArgs e)
{
Globals.ThisAddIn.CloseReadmeIfShown();
//System.Windows.Forms.MessageBox.Show("当前插件是最新版本");
//Globals.ThisAddIn.SendMessageToWeb("upgrade", Config.APP_VERSION);
Bridge.bridge.ShowUpgradeView();
}
private void BtnProofreadAll_Click(object sender, RibbonControlEventArgs e)
{
string time = DateTime.Now.ToString("yyyy - MM - dd HH: mm:ss: fff:ffffff");
Globals.ThisAddIn.SendMessageToWeb("start", time);
}
private void btnClear_Click(object sender, RibbonControlEventArgs e)
{
Globals.ThisAddIn.CloseReadmeIfShown();
//DocumentUtil.ClearProofreadMarks();
var result = MessageBox.Show("请确认是否清除此文档的所有校对标注?", "提示", MessageBoxButtons.OKCancel);
if(result == DialogResult.OK)
{
Bridge.bridge.clearAllProofreadMark(null);
Globals.ThisAddIn.SendMessageToWeb("clear-tips", null);
}
Globals.ThisAddIn.ActiveDocument.ShowDialog("请确认是否清除此文档的所有校对标注?", "确定", "clear-tips");
//if (result == DialogResult.OK)
//{
// //Bridge.bridge.clearAllProofreadMark(null);
// Globals.ThisAddIn.ClearAllProofreadMark();
//}
}
private void btnShowPane_Click(object sender, RibbonControlEventArgs e)
{
Globals.ThisAddIn.CloseReadmeIfShown();
Globals.ThisAddIn.ShowPanel();
}
private void btnHidePane_Click(object sender, RibbonControlEventArgs e)
{
Globals.ThisAddIn.CloseReadmeIfShown();
Globals.ThisAddIn.HidePanel();
}
@ -387,7 +476,7 @@ namespace AIProofread
}
catch (Exception exception)
{
Logger.Log(exception);
LogHelper.Log(exception);
}
return result;
}
@ -407,5 +496,182 @@ namespace AIProofread
{
Bridge.StartUpgradeProcess();
}
private void BtnOpenLogger_Click(object sender, RibbonControlEventArgs e)
{
// 判断日志窗口是否已经存在或者打开
if (LogHelper.LoggerForm == null || LogHelper.LoggerForm.IsDisposed)
{
// 创建日志窗口
LogHelper.LoggerForm = new FormLogger();
}
LogHelper.LoggerForm.Show();
}
private int GetRangeParagraphNumber(Range range)
{
var app = Globals.ThisAddIn.Application;
int paragraphNumber = 0;
if (range.Paragraphs.Count > 0)
{
// 获取当前文本在文档的段落数
var currentParagraph = range.Paragraphs.First;
var currentParagraphStart = currentParagraph.Range.Start;
var allParagraphs = app.ActiveDocument.Paragraphs;
for (var i = 1; i <= allParagraphs.Count; i++)
{
var paragraph = allParagraphs[i];
var paragraphStart = paragraph.Range.Start;
if (paragraphStart > currentParagraphStart)
{
break;
}
if (currentParagraphStart == paragraphStart || paragraph == currentParagraph)
{
paragraphNumber = i;
break;
}
}
}
return paragraphNumber;
}
private void BtnTest_Click(object sender, RibbonControlEventArgs e)
{
// 获取当前系统时间戳
//int time = (int)(DateTime.Now.Ticks / 10000000);
//BtnTest.Label = "测试按钮" + time;
//var result = MessageBox.Show("Test", "xxx");
//Globals.ThisAddIn.Application.
var app = Globals.ThisAddIn.Application;
var selection = app.Selection;
var range = selection.Range.Duplicate;
range.End = selection.Start;
// 获取所在页
var pageNumber = GetIndexPageNumber(range);
// 获取所在行
var rowNumber = range.get_Information(WdInformation.wdFirstCharacterLineNumber);
int paragraphNumber = GetRangeParagraphNumber(range);
MessageBox.Show($"当前页:{pageNumber}, 行:{rowNumber}, 段落:{paragraphNumber}");
}
private void ButtonSaveCache_Click(object sender, RibbonControlEventArgs e)
{
Globals.ThisAddIn.SendMessageToWeb("save-cache", "");
}
private void ButtonLoadCache_Click(object sender, RibbonControlEventArgs e)
{
Globals.ThisAddIn.CloseReadmeIfShown();
Globals.ThisAddIn.ShowDialog("即将加载最近保存的进度,新的修改可能会丢失!", "确定", "load-cache");
}
private void BtnShowPanel_Click(object sender, RibbonControlEventArgs e)
{
Globals.ThisAddIn.CloseReadmeIfShown();
Globals.ThisAddIn.SendMessageToWeb("show-panel", "");
}
private void BtnOpenAppDir_Click(object sender, RibbonControlEventArgs e)
{
Globals.ThisAddIn.CloseReadmeIfShown();
// 打开日志目录
Process.Start(AppDomain.CurrentDomain.BaseDirectory);
}
private void BtnExportProofreadResult_Click(object sender, RibbonControlEventArgs e)
{
Globals.ThisAddIn.CloseReadmeIfShown();
Globals.ThisAddIn.SendMessageToWeb("export-result", "");
}
private void BtnShowVersion_Click(object sender, RibbonControlEventArgs e)
{
Globals.ThisAddIn.CloseReadmeIfShown();
Globals.ThisAddIn.SendMessageToWeb("show-version", "");
}
public Range currectSelectRange;
private void btnDetectionAll_Click(object sender, RibbonControlEventArgs e)
{
Globals.ThisAddIn.CloseReadmeIfShown();
Globals.ThisAddIn.SendMessageToWeb("show-check-all", "");
}
private void btnDetectionParagraph_Click(object sender, RibbonControlEventArgs e)
{
Globals.ThisAddIn.CloseReadmeIfShown();
// 获取当前选中的选区的首尾段落起始与结束位置
var start = currectSelectRange.Start; // .Paragraphs.First.Range
var end = currectSelectRange.End; // .Paragraphs.Last.Range
var data = JSONObject.Create().Put("start", start).Put("end", end).ToString();
Globals.ThisAddIn.SendMessageToWeb("show-check-range", data);
}
private void btnDetectionHistory_Click(object sender, RibbonControlEventArgs e)
{
Globals.ThisAddIn.CloseReadmeIfShown();
Globals.ThisAddIn.SendMessageToWeb("show-check-history", "");
}
/// <summary>
/// 存储当前选区
/// </summary>
/// <param name="s"></param>
public void ParseSelectionChange(Selection s)
{
var r = s.Range;
this.currectSelectRange = r;
if (CommonSenseDetection.instance.isChecking)
{
return;
}
btnDetectionParagraph.Enabled = r.Start != r.End;
btnDetectionAll.Enabled = r.Start == r.End;
}
public void SetDetectionBtnStatus(bool allStatus,bool rangeStatus)
{
btnDetectionAll.Enabled = allStatus;
btnDetectionParagraph.Enabled = rangeStatus;
}
private void BtnShowManual_Click(object sender, RibbonControlEventArgs e)
{
Globals.ThisAddIn.CloseReadmeIfShown();
try
{
Process.Start(Config.USER_MANUAL_URL);
}catch (Exception) {
Globals.ThisAddIn.ActiveDocument.ShowMessage("打开用户手册失败", 2000, false);
}
}
private void BtnProofreadExact_Click(object sender, RibbonControlEventArgs e)
{
Globals.ThisAddIn.CloseReadmeIfShown();
//
Globals.ThisAddIn.ActiveDocument.CheckPanel();
Globals.ThisAddIn.SendMessageToWeb("start", "exact");
}
private void BtnProofreadFull_Click(object sender, RibbonControlEventArgs e)
{
Globals.ThisAddIn.CloseReadmeIfShown();
Globals.ThisAddIn.ActiveDocument.CheckPanel();
Globals.ThisAddIn.SendMessageToWeb("start", "full");
}
private void button2_Click(object sender, RibbonControlEventArgs e)
{
Globals.ThisAddIn.CloseReadmeIfShown();
Bridge.bridge.ShowLoginForm(null);
}
}
}

View File

@ -117,7 +117,115 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="BtnProofreadAll.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<metadata name="tabAIProofread.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="group1.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="menuProofreadList.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="BtnProofreadExact.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="BtnProofreadFull.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="BtnExportProofreadResult.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="btnClear.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="btnOpenLexicon.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="menuSencenDect.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="btnDetectionAll.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="btnDetectionParagraph.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="btnDetectionHistory.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="btnSetting.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="Group.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="ButtonSaveCache.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="ButtonLoadCache.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="grpOther.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="BtnGetContact.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="BtnUpdate.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="btnLogin.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="btnLogout.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="LblDate.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="LblNickname.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="group2.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="BtnShowPanel.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="BtnShowManual.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="grpDebug.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="btnShowPane.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="btnHidePane.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="BtnOpenLog.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="BtnOpenLogger.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="BtnTest.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="BtnOpenAppDir.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="BtnShowVersion.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="button2.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="dropDown1.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="$this.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
</root>

File diff suppressed because it is too large Load Diff

7
AIProofread/Transform.cs Normal file
View File

@ -0,0 +1,7 @@

namespace AIProofread
{
public class Transform
{
}
}

View File

@ -0,0 +1,63 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace AIProofread.Util
{
public class User32Util
{
[DllImport("user32.dll")]
public static extern bool GetWindowRect(IntPtr hWnd, ref RECT rect);
[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
public int Left;
public int Top;
public int Right;
public int Bottom;
}
// 引入 User32.dll 中的 SetParent 方法
[DllImport("user32.dll", SetLastError = true)]
public static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool SetForegroundWindow(IntPtr hWnd);
#region
public const int HORZRES = 8;
public const int VERTRES = 10;
public const int LOGPIXELSX = 88;
public const int LOGPIXELSY = 90;
public const int DESKTOPVERTRES = 117;
public const int DESKTOPHORZRES = 118;
[DllImport("user32.dll")]
public static extern IntPtr GetDC(IntPtr ptr);
[DllImport("gdi32.dll")]
public static extern int GetDeviceCaps(
IntPtr hdc, // handle to DC
int nIndex // index of capability
);
[DllImport("user32.dll", EntryPoint = "ReleaseDC")]
public static extern IntPtr ReleaseDC(IntPtr hWnd, IntPtr hDc);
[DllImport("user32.dll")]
public static extern IntPtr GetDesktopWindow();
public static float GetSreenScale()
{
var hdc = GetDC(GetDesktopWindow());
int nWidth = GetDeviceCaps(hdc, DESKTOPHORZRES);
ReleaseDC(IntPtr.Zero, hdc);
float f_Scale = (float)nWidth / (float)Screen.PrimaryScreen.Bounds.Width;
return 1 / f_Scale;
}
#endregion
}
}

Some files were not shown because too many files have changed in this diff Show More