只允许显示一个登录窗口

This commit is contained in:
LittleBoy 2024-11-08 22:52:03 +08:00
parent 089e0bc64a
commit 7ec0f49aa5
11 changed files with 257 additions and 176 deletions

Binary file not shown.

View File

@ -7,6 +7,7 @@ using Microsoft.Office.Tools.Word;
using Microsoft.Web.WebView2.Core;
using Microsoft.Web.WebView2.WinForms;
using Newtonsoft.Json;
using NPOI.XSSF.UserModel;
using NPOI.XWPF.UserModel;
using System;
using System.Collections.Generic;
@ -259,11 +260,14 @@ namespace AIProofread
{
Dictionary<string, object> data = new Dictionary<string, object>();
var doc = Globals.ThisAddIn.Application.ActiveDocument;
string ext = doc.FullName.ToLower();
var documentInfo = Globals.ThisAddIn.ActiveDocument;
var doc = documentInfo.CurrentDocument;
//string ext = doc.FullName.ToLower();
// 如果是
var shouldCheckSaved = ext.EndsWith(".wps") || doc.Paragraphs.Count < 200 || doc.Tables.Count < 20;
if (!shouldCheckSaved && !doc.Saved)
//var shouldCheckSaved = ext.EndsWith(".wps") || doc.Paragraphs.Count < 200 || doc.Tables.Count < 20;
// !shouldCheckSaved &&
if (!documentInfo.Saved())
{
data.Add("code", 1);
data.Add("message", "请保存文档后再进行校对");
@ -280,7 +284,7 @@ namespace AIProofread
}
else
{
documentInfo.hasProcessMark = false;
data.Add("code", 0);
data.Add("message", "success");
data.Add("name", doc.Name);
@ -536,7 +540,7 @@ namespace AIProofread
public void SelectMarkById(int proofreadId, int documentId)
{
Globals.ThisAddIn.ActiveDocument?.SelectMarkById(proofreadId);
Globals.ThisAddIn.ActiveDocument?.SelectMarkById(proofreadId,false);
}
public void processMark(int proofreadId, int status)
@ -572,7 +576,6 @@ namespace AIProofread
/// </summary>
//private static readonly int INSERT_FIND_OFFSET = 5;
public string MarkSentence(string content, int documentId)
{
// 初始化话
@ -603,6 +606,19 @@ namespace AIProofread
}
}
public string ExportProofreadResult()
{
try
{
DocumentUtil.ExportProofreadResult();
return BridgeResult.Success();
}
catch (Exception ex)
{
return BridgeResult.Error(-1, ex.Message);
}
}
public string ReadText(string path)
{
try

View File

@ -1,11 +1,4 @@
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

View File

@ -23,6 +23,14 @@ namespace AIProofread.Model
private static char[] ArticleSpecialChars = new char[4] { '\a', '\r', '\v', '\f' };
private static object missing = System.Reflection.Missing.Value;
/// <summary>
/// 是否已经校对
/// </summary>
public bool hasProofreaded = false;
/// <summary>
/// 是否已经处理了校对结果
/// </summary>
public bool hasProcessMark = false;
/// <summary>
///
@ -70,6 +78,7 @@ namespace AIProofread.Model
public int Id { get; set; }
public CustomTaskPane TaskPane { get; set; }
public WdProtectionType ProtectionType { get { return CurrentDocument.ProtectionType; } }
// 初始化
public DocumentInfo(Document doc)
@ -443,15 +452,20 @@ namespace AIProofread.Model
marks.Clear();
}
public void SelectMarkById(int proofreadId)
{
SelectMarkById(proofreadId, true);
}
/// <summary>
/// 选中标签
/// </summary>
/// <param name="proofreadId"></param>
public void SelectMarkById(int proofreadId)
public void SelectMarkById(int proofreadId, bool noticeToWeb)
{
if (proofreadId == selectProofreadId) return;
// 取消上一个标签移除
if (selectProofreadId > 0 && marks.ContainsKey(selectProofreadId))
if (proofreadId != -1 && marks.ContainsKey(selectProofreadId))
{
var m = marks[selectProofreadId];
if (m != null && CurrentDocument.Bookmarks.Exists(m.Name))
@ -465,7 +479,7 @@ namespace AIProofread.Model
}
selectProofreadId = proofreadId;
if (proofreadId > 0 && marks.ContainsKey(proofreadId))
if (proofreadId != -1 && marks.ContainsKey(proofreadId))
{
var mark = marks[proofreadId].mark;
if (mark == null) return;
@ -492,12 +506,16 @@ namespace AIProofread.Model
marks[proofreadId].Select();
//Globals.ThisAddIn.SendMessageToWeb("select", proofreadId);
}
Globals.ThisAddIn.SendMessageToWeb("select-proofread", proofreadId);
if (noticeToWeb)
{
Globals.ThisAddIn.SendMessageToWeb("select-proofread", proofreadId);
}
}
public void InitProofread(List<CorrectContext> list)
{
hasProofreaded = true;
int prevOffset = 0;
List<int> disabledList = new List<int>();
@ -510,6 +528,7 @@ namespace AIProofread.Model
int index = 0;
foreach (var item in correct.CorrectItems)
{
if (marks.ContainsKey(item.Id)) continue;
Logger.Log(string.Format("mark type {0} data {1}->{2}", item.Tag, item.Origin, item.Text));
int _prev = prevOffset;
// 查找对应区域并再该区域添加书签
@ -524,6 +543,31 @@ namespace AIProofread.Model
if (mark != null)
{
marks.Add(item.Id, new ProofreadItem(item,correct.Insert, mark, Id));
try
{
if (item.Tag == "i")
{ // 使用空格填充
mark.Text = ToolUtil.GetBlankText(item.Text.Length);
}
if (item.Color != null)
{
// 颜色转码
var color = (WdColor)ColorTranslator.ToOle(Colors.FromHex(item.Color));
// 给选区添加背景颜色
mark.Shading.BackgroundPatternColor = color;
//try
//{
//}
//catch (Exception)
//{
// //item.Value.mark.Shading.BackgroundPatternColor = WdColor.wdColorLightOrange;
//}
}
}catch(Exception e)
{
Logger.Log(string.Format("mark color error {0}",e.Message));
}
}
else
{
@ -540,29 +584,29 @@ namespace AIProofread.Model
}
}
}
foreach (var item in marks)
{
if (item.Value.mark != null)
{
if (item.Value.content.Tag == "i")
{
item.Value.mark.Text = ToolUtil.GetBlankText(item.Value.content.Text.Length);
}
if (item.Value.content.Color != null)
{
try
{
var color = (WdColor)ColorTranslator.ToOle(Colors.FromHex(item.Value.content.Color));
// 给选区添加背景颜色
item.Value.mark.Shading.BackgroundPatternColor = color;
}
catch (Exception)
{
//item.Value.mark.Shading.BackgroundPatternColor = WdColor.wdColorLightOrange;
}
}
}
}
//foreach (var item in marks)
//{
// if (item.Value.mark != null)
// {
// if (item.Value.content.Tag == "i")
// {
// item.Value.mark.Text = ToolUtil.GetBlankText(item.Value.content.Text.Length);
// }
// if (item.Value.content.Color != null)
// {
// try
// {
// var color = (WdColor)ColorTranslator.ToOle(Colors.FromHex(item.Value.content.Color));
// // 给选区添加背景颜色
// item.Value.mark.Shading.BackgroundPatternColor = color;
// }
// catch (Exception)
// {
// //item.Value.mark.Shading.BackgroundPatternColor = WdColor.wdColorLightOrange;
// }
// }
// }
//}
// 隐藏面板对应校对项
MainPanelWebMessage.DisabledProofreadItem(disabledList);
@ -646,8 +690,26 @@ namespace AIProofread.Model
{
if (proofreadId > 0 && marks.ContainsKey(proofreadId))
{
hasProcessMark = true;
marks[proofreadId].Process(status);
}
}
internal bool Saved()
{
if (CurrentDocument.Saved)
{
return true;
}
if(!hasProofreaded && !CurrentDocument.Saved) // 没有校对前需要提示保存
{
return false;
}
if(hasProofreaded && hasProcessMark && !CurrentDocument.Saved)
{
return false;
}
return true;
}
}
}

View File

@ -3,21 +3,13 @@ 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 NPOI.XSSF.UserModel;
using NPOI.SS.UserModel;
using AIProofread.Model;
namespace AIProofread
{
@ -473,130 +465,11 @@ namespace AIProofread
Process.Start(AppDomain.CurrentDomain.BaseDirectory);
}
private ICellStyle CreateBaseCellStyle(IWorkbook workbook)
{
var style = workbook.CreateCellStyle();
style.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;
style.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;
style.WrapText = true;
return style;
}
private IFont CreateBaseFont(IWorkbook workbook)
{
// 宋体 11
var font = workbook.CreateFont();
font.FontName = "宋体";
font.FontHeightInPoints = 11;
return font;
}
private void BtnExportProofreadResult_Click(object sender, RibbonControlEventArgs e)
{
SaveFileDialog sfd = new SaveFileDialog();
sfd.Filter = "Excel文件|*.xlsx";
var result = sfd.ShowDialog();
// 如果用户取消选择,则返回
if(result == DialogResult.Cancel)
{
return;
}
using (var fs = File.OpenWrite(sfd.FileName))
{
var book = new XSSFWorkbook();
var sheet = book.CreateSheet("Sheet1");
// 设置表格样式
var style = CreateBaseCellStyle(book);
style.SetFont(CreateBaseFont(book));
style.BorderBottom = NPOI.SS.UserModel.BorderStyle.None;
style.BorderTop = NPOI.SS.UserModel.BorderStyle.None;
style.BorderLeft = NPOI.SS.UserModel.BorderStyle.None;
style.BorderRight = NPOI.SS.UserModel.BorderStyle.None;
style.WrapText = true;
sheet.SetDefaultColumnStyle(0, style);
sheet.SetDefaultColumnStyle(1, style);
sheet.SetDefaultColumnStyle(2, style);
sheet.SetDefaultColumnStyle(3, style);
sheet.SetDefaultColumnStyle(4, style);
sheet.SetDefaultColumnStyle(5, style);
sheet.SetDefaultColumnStyle(6, style);
// 表头设置
var row = sheet.CreateRow(0);
row.CreateCell(0).SetCellValue("序号");
row.CreateCell(1).SetCellValue("页");
row.CreateCell(2).SetCellValue("行");
var cell = row.CreateCell(3);//
// 设置宽度
sheet.SetColumnWidth(3, 50 * 256);
cell.SetCellValue("详细信息");
var cellExp = row.CreateCell(4);
// 设置文字颜色为红色
var expStyle = book.CreateCellStyle();
var f1 = CreateBaseFont(book);
f1.Color = NPOI.HSSF.Util.HSSFColor.Red.Index;
expStyle.SetFont(f1);
cellExp.CellStyle = expStyle;
cellExp.SetCellValue("异常");
var suggestCell = row.CreateCell(5);//
suggestCell.CellStyle.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.Red.Index;
suggestCell.SetCellValue("建议");
row.CreateCell(6).SetCellValue("处理状态");
var blackFont = CreateBaseFont(book);
blackFont.Color = NPOI.HSSF.Util.HSSFColor.Black.Index;
var redFont = CreateBaseFont(book);
redFont.Color = NPOI.HSSF.Util.HSSFColor.Red.Index;
int id = 1;
foreach (var item in Globals.ThisAddIn.ActiveDocument.marks)
{
if(item.Value.mark == null) continue;
var it = item.Value.content;
var range = item.Value.mark.Range;
// 获取书签在文档的页码数
var pageNumber = range.get_Information(WdInformation.wdActiveEndPageNumber);
// 获取书签在当前页面的行数
var lineNumber = range.get_Information(WdInformation.wdFirstCharacterLineNumber);
row = sheet.CreateRow(id);
row.CreateCell(0).SetCellValue(id);
row.CreateCell(1).SetCellValue(pageNumber);
row.CreateCell(2).SetCellValue(lineNumber);
XSSFRichTextString originText = new XSSFRichTextString(item.Value.OriginSentence);
originText.ApplyFont(blackFont);
var startIndex = item.Value.OriginSentence.IndexOf(it.Origin);
// 对查找内容引用红色
originText.ApplyFont(startIndex, startIndex + it.Origin.Length, redFont);
row.CreateCell(3).SetCellValue(originText);
row.CreateCell(4).SetCellValue(it.Origin);
row.CreateCell(5).SetCellValue(it.Text);
row.CreateCell(6).SetCellValue(StatusText(it.IsAccept));
id++;
}
// 保存到文件
book.Write(fs);
MessageBox.Show("导出成功");
}
}
private string StatusText(int status)
{
if(status == AcceptStatus.Accept) return "采纳";
else if (status == AcceptStatus.Review) return "采纳";
else if (status == AcceptStatus.Ignore) return "忽略";
return "未处理";
Globals.ThisAddIn.SendMessageToWeb("export-result", "");
}
}
}

View File

@ -8,6 +8,7 @@ using AIProofread.Controls;
using UtilLib;
using AIProofread.Model;
using System.Collections.Generic;
using System.Runtime.InteropServices;
//using CustomTaskPane = Microsoft.Office.Core.CustomTaskPane;
//using CustomTaskPane = Microsoft.Office.Tools.CustomTaskPane;
//using NPOI.SS.Formula.Functions;
@ -311,7 +312,8 @@ namespace AIProofread
{
// 只选择第一个书签
// TODO: 优化
Bridge.bridge.SelectMarkById(proofreadId, 0);
//Bridge.bridge.SelectMarkById(proofreadId, 0);
ActiveDocument?.SelectMarkById(proofreadId, true);
return;
}
}
@ -351,14 +353,20 @@ namespace AIProofread
this.documentList.HideAllPane();
}
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool SetForegroundWindow(IntPtr hWnd);
/// <summary>
/// 显示登录窗口
/// </summary>
/// <param name="action"></param>
public void ShowLoginForm(string action)
{
public void ShowLoginForm(string action) {
// 关闭之前的窗口
if(LoginFormList.Count > 0){
LoginFormList.ForEach(f => f.Close());
}
FormLogin frm = new FormLogin(action);
LoginFormList.Add(frm);
frm.Show();
}

View File

@ -9,6 +9,10 @@ using Microsoft.Office.Tools.Word;
using Bookmark = Microsoft.Office.Tools.Word.Bookmark;
using Section = Microsoft.Office.Interop.Word.Section;
using WdColor = Microsoft.Office.Interop.Word.WdColor;
using NPOI.XSSF.UserModel;
using System.Windows.Forms;
using NPOI.SS.UserModel;
using System.IO;
namespace AIProofread
{
@ -379,7 +383,7 @@ namespace AIProofread
if (sentence.Text == c.Insert)
{ // 比对原始内容与校对原文是否一致
var range = document.Range(offset + item.Start, offset + item.End);
var range = document.Range(offset + item.Start, offset + item.End + 1);
//
if (range.Text == item.Origin) return range;
}
@ -407,7 +411,7 @@ namespace AIProofread
if (start1 != -1)
{
var findOffset = paraStart + start1 + (prefix1 != null ? prefix1.Length : 0);
return document.Range(findOffset, findOffset);
return document.Range(findOffset, findOffset + 1);
}
}
@ -434,7 +438,7 @@ namespace AIProofread
if (start != -1)
{
var findOffset = paraRange.Start + start + (prefix != null ? prefix.Length : 0);
var range = document.Range(findOffset, findOffset + wordEnd - wordStart);
var range = document.Range(findOffset, findOffset + wordEnd - wordStart + 1);
if (range.Text == item.Origin) { return range; }
}
// 直接定位查找
@ -445,5 +449,130 @@ namespace AIProofread
return document.Range(start, start + item.Origin.Length);
}
public static void ExportProofreadResult()
{
SaveFileDialog sfd = new SaveFileDialog();
sfd.Filter = "Excel文件|*.xlsx";
var result = sfd.ShowDialog();
// 如果用户取消选择,则返回
if (result == DialogResult.Cancel)
{
return;
}
using (var fs = File.OpenWrite(sfd.FileName))
{
var book = new XSSFWorkbook();
var sheet = book.CreateSheet("Sheet1");
// 设置表格样式
var style = CreateBaseCellStyle(book);
style.SetFont(CreateBaseFont(book));
style.BorderBottom = NPOI.SS.UserModel.BorderStyle.None;
style.BorderTop = NPOI.SS.UserModel.BorderStyle.None;
style.BorderLeft = NPOI.SS.UserModel.BorderStyle.None;
style.BorderRight = NPOI.SS.UserModel.BorderStyle.None;
style.WrapText = true;
sheet.SetDefaultColumnStyle(0, style);
sheet.SetDefaultColumnStyle(1, style);
sheet.SetDefaultColumnStyle(2, style);
sheet.SetDefaultColumnStyle(3, style);
sheet.SetDefaultColumnStyle(4, style);
sheet.SetDefaultColumnStyle(5, style);
sheet.SetDefaultColumnStyle(6, style);
// 表头设置
var row = sheet.CreateRow(0);
row.CreateCell(0).SetCellValue("序号");
row.CreateCell(1).SetCellValue("页");
row.CreateCell(2).SetCellValue("行");
var cell = row.CreateCell(3);//
// 设置宽度
sheet.SetColumnWidth(3, 50 * 256);
cell.SetCellValue("详细信息");
var cellExp = row.CreateCell(4);
// 设置文字颜色为红色
var expStyle = book.CreateCellStyle();
var f1 = CreateBaseFont(book);
f1.Color = NPOI.HSSF.Util.HSSFColor.Red.Index;
expStyle.SetFont(f1);
cellExp.CellStyle = expStyle;
cellExp.SetCellValue("异常");
var suggestCell = row.CreateCell(5);//
suggestCell.CellStyle.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.Red.Index;
suggestCell.SetCellValue("建议");
row.CreateCell(6).SetCellValue("处理状态");
var blackFont = CreateBaseFont(book);
blackFont.Color = NPOI.HSSF.Util.HSSFColor.Black.Index;
var redFont = CreateBaseFont(book);
redFont.Color = NPOI.HSSF.Util.HSSFColor.Red.Index;
int id = 1;
foreach (var item in Globals.ThisAddIn.ActiveDocument.marks)
{
if (item.Value.mark == null) continue;
var it = item.Value.content;
var range = item.Value.mark.Range;
// 获取书签在文档的页码数
var pageNumber = range.get_Information(WdInformation.wdActiveEndPageNumber);
// 获取书签在当前页面的行数
var lineNumber = range.get_Information(WdInformation.wdFirstCharacterLineNumber);
row = sheet.CreateRow(id);
row.CreateCell(0).SetCellValue(id);
row.CreateCell(1).SetCellValue(pageNumber);
row.CreateCell(2).SetCellValue(lineNumber);
XSSFRichTextString originText = new XSSFRichTextString(item.Value.OriginSentence);
originText.ApplyFont(blackFont);
var startIndex = item.Value.OriginSentence.IndexOf(it.Origin);
// 对查找内容引用红色
originText.ApplyFont(startIndex, startIndex + it.Origin.Length, redFont);
row.CreateCell(3).SetCellValue(originText);
row.CreateCell(4).SetCellValue(it.Origin);
row.CreateCell(5).SetCellValue(it.Text);
row.CreateCell(6).SetCellValue(StatusText(it.IsAccept));
id++;
}
// 保存到文件
book.Write(fs);
}
}
private static ICellStyle CreateBaseCellStyle(IWorkbook workbook)
{
var style = workbook.CreateCellStyle();
style.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;
style.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;
style.WrapText = true;
return style;
}
private static IFont CreateBaseFont(IWorkbook workbook)
{
// 宋体 11
var font = workbook.CreateFont();
font.FontName = "宋体";
font.FontHeightInPoints = 11;
return font;
}
private static string StatusText(int status)
{
if (status == AcceptStatus.Accept) return "采纳";
else if (status == AcceptStatus.Review) return "采纳";
else if (status == AcceptStatus.Ignore) return "忽略";
return "未处理";
}
}
}