412 lines
13 KiB
C#

using System;
using System.Collections.Generic;
using Word = Microsoft.Office.Interop.Word;
using Microsoft.Office.Tools.Word;
using AIProofread.Controls;
using Microsoft.Office.Tools;
using Newtonsoft.Json;
using UtilLib;
using System.Threading;
using Microsoft.Office.Interop.Word;
using System.Linq;
using System.Windows.Forms;
namespace AIProofread
{
public partial class ThisAddIn
{
public static SynchronizationContext FmainThreadContext;
public string AddinName = " ";
/// <summary>
/// 最小宽度
/// </summary>
public static int MinWidth = 0;
/// <summary>
/// 启动路径
/// </summary>
public string applicationStartupPath;
/// <summary>
/// 校对面板
/// </summary>
public ProofreadMainControl proofreadPanel;
/// <summary>
/// 工具栏
/// </summary>
public Ribbon1 ribbon;
public bool IsWPS { get; set; }
public List<FormLogin> LoginFormList = new List<FormLogin>();
public Dictionary<Word.Document, CustomTaskPane> taskPanels = new Dictionary<Word.Document, CustomTaskPane>();
public Dictionary<Word.Document,bool> panelsVisible = new Dictionary<Word.Document, bool>();
public CustomTaskPane currentDocumentTaskPane;
private static readonly Dictionary<Word.Document, Dictionary<int, ProofreadItem>> allMarks = new Dictionary<Word.Document, Dictionary<int, ProofreadItem>>();
private void Application_WindowDeactivate(Word.Document doc, Window Wn)
{
Logger.Log("Application_WindowDeactivate -- " + doc.FullName);
//HidePanel(Doc);
if (taskPanels.ContainsKey(doc))
{
var visible = taskPanels[doc].Visible;
// 记录当前文档的显示状态
if (!panelsVisible.ContainsKey(doc))
{
panelsVisible.Add(doc, visible);
}
else
{
panelsVisible[doc] = visible;
}
}
}
private void Application_WindowActivate(Word.Document activeDoc, Window Wn)
{
// 当前文档添加书签集合
if (!allMarks.ContainsKey(activeDoc))
{
allMarks[activeDoc] = new Dictionary<int, ProofreadItem>();
}
Logger.Log("Application_WindowActivate -- " + activeDoc.FullName);
//ShowPanel(Doc);
if (!taskPanels.ContainsKey(activeDoc))
{
ShowPanel(activeDoc,false);
}
this.currentDocumentTaskPane = taskPanels[activeDoc];
if (IsWPS)
{
HideOtherPanel(activeDoc);
}
if (panelsVisible.ContainsKey(activeDoc) && panelsVisible[activeDoc])
{
taskPanels[activeDoc].Visible = true;
}
}
private void Application_DocumentBeforeClose(Word.Document currentDoc, ref bool Cancel)
{
Logger.Log("Application_DocumentBeforeClose -- " + currentDoc.FullName);
if (allMarks.ContainsKey(currentDoc))
{
allMarks.Remove(currentDoc);
}
DisposePanel(currentDoc);
}
public void ActiveCurrentDocumentMarks()
{
// 判断是否存在 没有的话初始化
var currentDoc = Application.ActiveDocument;
if (!allMarks.ContainsKey(currentDoc))
{
allMarks[currentDoc] = new Dictionary<int, ProofreadItem>();
}
Bridge.marks = allMarks[currentDoc];
}
private void Application_NewDocument(Word.Document Doc)
{
Logger.Log("Application_NewDocument -- " + Doc.FullName);
ShowPanel(Doc);
}
private void Application_DocumentOpen(Word.Document Doc)
{
Logger.Log("Application_DocumentOpen -- " + Doc.FullName);
ShowPanel(Doc);
}
void DisposePanel(Word.Document doc)
{
if (taskPanels.ContainsKey(doc))
{
taskPanels[doc].Visible = false;
taskPanels[doc].Dispose();
taskPanels.Remove(doc);
}
}
void HideOtherPanel(Word.Document doc)
{
if (taskPanels.ContainsKey(doc) && taskPanels[doc].Visible)
{
return;
}
foreach (var key in taskPanels.Keys)
{
taskPanels[key].Visible = false;
}
}
void HidePanel(Word.Document doc)
{
if (taskPanels.ContainsKey(doc))
{
taskPanels[doc].Visible = false;
}
}
private CustomTaskPane ShowPanel(Word.Document doc, bool show)
{
if (Application.ActiveDocument == null) return null;
if (doc == null) doc = Application.ActiveDocument;
if (taskPanels.ContainsKey(doc))
{
return taskPanels[doc];
}
//proofreadPanel = new ProofreadMainControl();
var control = new ProofreadMainControl(doc, MinWidth);
if (MinWidth < 10)
{
MinWidth = 420 * control.LabelWidth() / 42;
}
var panel = Globals.ThisAddIn.CustomTaskPanes.Add(control, AddinName);
this.currentDocumentTaskPane = panel;
taskPanels.Add(doc, panel);
panel.Visible = false;
panel.VisibleChanged += Panel_VisibleChanged;
control.Width = MinWidth;
panel.Width = MinWidth;
// 监听尺寸变化 防止最小尺寸小于设置值
control.SizeChanged += Control_SizeChanged;
return panel;
}
private void Panel_VisibleChanged(object sender, EventArgs e)
{
if(currentDocumentTaskPane == sender)
{
}
}
/// <summary>
/// word创建面板
/// </summary>
private CustomTaskPane ShowPanel(Word.Document doc)
{
return ShowPanel(doc, !IsWPS);
}
private void Control_SizeChanged(object sender, EventArgs e)
{
if (currentDocumentTaskPane != null && currentDocumentTaskPane.Width < MinWidth)
{
SendKeys.Send("{ESC}");
currentDocumentTaskPane.Width = MinWidth;
}
}
public int GetMinWidth()
{
return MinWidth;
}
public void Send(SendOrPostCallback d)
{
FmainThreadContext.Send(d, null);
}
//private void ProofreadPanel_SizeChanged(object sender, EventArgs e)
//{
// // 处理最小宽度
// if (customTaskPane != null && customTaskPane.Width < MinWidth && customTaskPane.Visible)
// {
// SendKeys.Send("{ESC}");
// customTaskPane.Width = MinWidth;
// }
//}
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
try
{
FmainThreadContext = SynchronizationContext.Current;
// 启动地址
applicationStartupPath = System.Windows.Forms.Application.StartupPath;
if (applicationStartupPath.Contains("WPS"))
{
IsWPS = true;
Config.IS_WPS = true;
try
{
Globals.Ribbons.Ribbon1.InitWPS();
}
catch (Exception ex)
{
Logger.Log("Init WPS Error " + ex.Message);
}
}
// 处理文档事件
Application.DocumentOpen += Application_DocumentOpen;
Application.DocumentBeforeClose += Application_DocumentBeforeClose;
Application.WindowActivate += Application_WindowActivate;
Application.WindowDeactivate += Application_WindowDeactivate;
(Application as ApplicationEvents4_Event).NewDocument += Application_NewDocument;
// 选区发生变化事件
//this.Application.WindowSelectionChange += Application_WindowSelectionChange;
try
{
if (Application.ActiveDocument != null)
{
// 默认直接打开文档 就直接创建panel
ShowPanel(Application.ActiveDocument, false);
}
}catch (Exception ex2)
{
Logger.Log("加载默认文档失败: " + ex2.ToString());
}
}
catch (Exception ex1)
{
Logger.Log("Init Error " + ex1.ToString());
}
}
private void Application_WindowSelectionChange(Word.Selection s)
{
if (s.Bookmarks != null)
{
if (s.Range.Start == s.Range.End) // 说明是点击呀
{
var count = s.Bookmarks.Count;
if (s.Bookmarks.Count == 1) // 只有这一个
{
foreach (Microsoft.Office.Interop.Word.Bookmark item in s.Bookmarks)
{
int proofreadId = Config.GetBookmarkIdByName(item.Name);
if (proofreadId > 0)
{
Bridge.bridge.SelectMarkById(proofreadId);
return;
}
}
}
}
}
Bridge.bridge.SelectMarkById(-1);
}
public int MyProperty { get; set; }
public void SendMessageToWeb(string msg, object data)
{
// 先显示panel
var panel = this.ShowPanel(Application.ActiveDocument, true);
SendMessageToWeb(panel.Control, msg, data);
}
public void SendMessageToWeb(UserControl panelControl, string msg, object data)
{
var json = JsonConvert.SerializeObject(new WebMessage(msg, data));
var control = (ProofreadMainControl)panelControl;
try
{
if (control.web.CoreWebView2 == null)
{
Thread.Sleep(500);
}
control.web.CoreWebView2.PostWebMessageAsJson(json);
}
catch (Exception ex)
{
Logger.Log("send message to web error \n" + ex.Message + "\n" + msg + data.ToString());
}
}
// 显示面板
public void ShowPanel()
{
this.currentDocumentTaskPane.Visible = true;
}
// 隐藏面板
public void HidePanel()
{
this.currentDocumentTaskPane.Visible = false;
}
public void ShowLoginForm(string action)
{
FormLogin frm = new FormLogin(action);
LoginFormList.Add(frm);
frm.Show();
}
void ClearPanels()
{
taskPanels.Values.ToList().ForEach(p =>
{
try
{
p.Dispose();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message + "\n" + ex.StackTrace);
Logger.Log(ex.Message + "\n" + ex.StackTrace);
}
});
taskPanels.Clear();
}
private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
{
// PanelModule.DisposeCTP();
//this.proofreadPanel.Dispose();
ClearPanels();
}
#region VSTO generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InternalStartup()
{
this.Startup += new System.EventHandler(ThisAddIn_Startup);
this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown);
}
public void SyncLogout()
{
ribbon.ProcessLogout();
taskPanels.Values.ToList().ForEach(p =>
{
try
{
// 同步登录失败信息
SendMessageToWeb(p.Control, "async-logout", null);
}catch (Exception ex) {
Logger.Log("async-logout:",ex);
}
});
}
#endregion
}
}