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 = " "; /// /// 最小宽度 /// private const int MinWidth = 420; /// /// 启动路径 /// public string applicationStartupPath; /// /// 校对面板 /// public ProofreadMainControl proofreadPanel; /// /// 工具栏 /// public Ribbon1 ribbon; public bool IsWPS { get; set; } public List LoginFormList = new List(); public Dictionary taskPanels = new Dictionary(); private CustomTaskPane customTaskPane; private void Application_WindowDeactivate(Word.Document Doc, Window Wn) { Logger.Log("Application_WindowDeactivate -- " + Doc.FullName); //HidePanel(Doc); } private void Application_WindowActivate(Word.Document Doc, Window Wn) { Logger.Log("Application_WindowActivate -- " + Doc.FullName); //ShowPanel(Doc); if (!taskPanels.ContainsKey(Doc)) { ShowPanel(Doc); } HideOtherPanel(Doc); } private void Application_DocumentBeforeClose(Word.Document Doc, ref bool Cancel) { Logger.Log("Application_DocumentBeforeClose -- " + Doc.FullName); DisposePanel(Doc); } 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 = doc == key; } } 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)) { taskPanels[doc].Visible = true; this.customTaskPane = taskPanels[doc]; return taskPanels[doc]; } //proofreadPanel = new ProofreadMainControl(); var control = new ProofreadMainControl(doc, MinWidth); var panel = Globals.ThisAddIn.CustomTaskPanes.Add(control, AddinName); this.customTaskPane = panel; taskPanels.Add(doc, panel); control.Width = MinWidth; panel.Width = MinWidth; panel.Visible = show; // 监听尺寸变化 防止最小尺寸小于设置值 control.SizeChanged += Control_SizeChanged; return panel; } /// /// word创建面板 /// private CustomTaskPane ShowPanel(Word.Document doc) { return ShowPanel(doc, !IsWPS); } private void Control_SizeChanged(object sender, EventArgs e) { if (customTaskPane != null && customTaskPane.Width < MinWidth) { SendKeys.Send("{ESC}"); customTaskPane.Width = 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; 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; if (Application.ActiveDocument != null) { // 默认直接打开文档 就直接创建panel ShowPanel(Application.ActiveDocument, false); } } 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); var json = JsonConvert.SerializeObject(new WebMessage(msg, data)); var control = (ProofreadMainControl)panel.Control; 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.customTaskPane.Visible = true; } // 隐藏面板 public void HidePanel() { this.customTaskPane.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 /// /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// private void InternalStartup() { this.Startup += new System.EventHandler(ThisAddIn_Startup); this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown); } #endregion } }