Skip to content

Commit e92ad60

Browse files
committed
Press F5 to refresh Preview Window to show latest OneNote page content.
1 parent 285871d commit e92ad60

File tree

3 files changed

+145
-17
lines changed

3 files changed

+145
-17
lines changed

NoteWidgetAddIn/Model/NotePage.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,9 +119,11 @@ public NotePage(XElement xelement)
119119
}
120120
Root = xelement;
121121
PageID = Root.Attribute("ID").Value;
122+
LastModifiedTime = Root.Attribute("lastModifiedTime").Value;
122123
Namespace = Root.Name.Namespace;
123124
}
124125
public string PageID { get;}
126+
public string LastModifiedTime { get; }
125127
public XElement Root { get;}
126128
/// <summary>
127129
/// Root Namespace

NoteWidgetAddIn/NoteApplication.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ namespace NoteWidgetAddIn
1414
{
1515
public sealed class NoteApplication : IDisposable
1616
{
17+
private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
1718
#region Helpers
1819
private class SimpleWin32Window : System.Windows.Forms.IWin32Window
1920
{
@@ -138,6 +139,7 @@ public void Publish(string nodeID, PublishFormat format, string filePath)
138139
public void Dispose()
139140
{
140141
_application = null;
142+
Logger.Debug($"NoteApplication Disposed. Hash: {this.GetHashCode()}");
141143
}
142144
#endregion
143145
}

NoteWidgetAddIn/RibbonCommand/Markdown/PreviewMarkdownCommand.cs

Lines changed: 141 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,37 +5,91 @@
55
using System.Collections.Generic;
66
using System.Linq;
77
using System.Threading.Tasks;
8-
using NoteWidgetAddIn.RibbonCommand.Markdown;
98
using NoteWidgetAddIn.Markdown;
9+
using NoteWidgetAddIn.Model;
10+
using NoteWidgetAddIn.RibbonCommand.Markdown;
1011

1112
namespace NoteWidgetAddIn.RibbonCommand
1213
{
1314
internal class PreviewMarkdownCommand : Command
1415
{
15-
private static IDictionary<int, WebBrowserWindow> windowContainer = new Dictionary<int, WebBrowserWindow>();
16+
#region PreviewWindowHolder
17+
class PreviewWindowHolder
18+
{
19+
public PreviewWindowHolder(string pageID, string pageLastModifiedTime, WebBrowserWindow previewWindow)
20+
{
21+
PageID = pageID;
22+
PageLastModifiedTime = pageLastModifiedTime;
23+
PreviewWindow = previewWindow;
24+
}
25+
26+
public string PageID { get; set; }
27+
public string PageLastModifiedTime { get; set; }
28+
public WebBrowserWindow PreviewWindow { get; }
29+
}
30+
#endregion
31+
32+
private static Dictionary<int, PreviewWindowHolder> windowContainer = new Dictionary<int, PreviewWindowHolder>();
1633
public override async Task ExecuteAsync(params object[] args)
1734
{
35+
await PreviewCurrentNotePage();
36+
}
37+
38+
private async Task PreviewCurrentNotePage()
39+
{
1840
var settings = Properties.Settings.Default;
19-
if (TryGetPageContent(out var htmlContent))
41+
if (TryGetCurrentNotePage(out var notePage))
2042
{
21-
if (settings.Markdown_Preview_Singleton && windowContainer.Count > 0)
43+
var existedHolder = windowContainer.Select(c => c.Value).FirstOrDefault(c => c.PageID == notePage.PageID);
44+
if (existedHolder != null)
2245
{
23-
var window = windowContainer.First().Value;
24-
window.Dispatcher.Invoke(() =>
46+
if (existedHolder.PageLastModifiedTime == notePage.LastModifiedTime)
2547
{
26-
window.BrowserHtmlContent = htmlContent;
27-
window.RefreshBrowser();
48+
return;
49+
}
50+
existedHolder.PageLastModifiedTime = notePage.LastModifiedTime;
51+
var htmlContent = GetHtmlContent(notePage);
52+
existedHolder.PreviewWindow.Dispatcher.Invoke(() =>
53+
{
54+
existedHolder.PreviewWindow.BrowserHtmlContent = htmlContent;
55+
existedHolder.PreviewWindow.RefreshBrowser();
56+
});
57+
}
58+
else if (settings.Markdown_Preview_Singleton && windowContainer.Count > 0)
59+
{
60+
var holder = windowContainer.First().Value;
61+
holder.PageID = notePage.PageID;
62+
holder.PageLastModifiedTime = notePage.LastModifiedTime;
63+
var htmlContent = GetHtmlContent(notePage);
64+
holder.PreviewWindow.Dispatcher.Invoke(() =>
65+
{
66+
holder.PreviewWindow.BrowserHtmlContent = htmlContent;
67+
holder.PreviewWindow.RefreshBrowser();
2868
});
2969
}
3070
else
3171
{
72+
var htmlContent = GetHtmlContent(notePage);
3273
await WpfAddInApplication.Current.BeginInvoke(() =>
3374
{
3475
var window = new WebBrowserWindow();
3576
window.RememberMeIdentifier = "Markdown_Preview";
3677
window.BrowserHtmlContent = htmlContent;
3778
var helper = new System.Windows.Interop.WindowInteropHelper(window);
3879
helper.Owner = OwnerWin32Window.Handle;
80+
81+
window.KeyDown += (s, e) =>
82+
{
83+
//Refresh
84+
if (e.Key == System.Windows.Input.Key.F5)
85+
{
86+
Task.Run(async () =>
87+
{
88+
await PreviewCurrentNotePage();
89+
});
90+
}
91+
};
92+
3993
window.Closed += (s, e) =>
4094
{
4195
var key = window.GetHashCode();
@@ -44,34 +98,104 @@ await WpfAddInApplication.Current.BeginInvoke(() =>
4498
windowContainer.Remove(key);
4599
}
46100
};
47-
windowContainer.Add(window.GetHashCode(), window);
101+
102+
windowContainer.Add(window.GetHashCode(), new PreviewWindowHolder(notePage.PageID, notePage.LastModifiedTime, window));
48103
window.Show();
49104
});
50105
}
51106
}
52107
await Task.Yield();
53108
}
54-
private bool TryGetPageContent(out string htmlContent)
109+
110+
private string GetHtmlContent(NotePage page)
111+
{
112+
var htmlBody = MarkdownHelper.MarkdownToHtml(page.ContentInnerText);
113+
return HtmlTemplate.LocalResourceTemplate.ToHtml(page.Title.InnerText, htmlBody);
114+
}
115+
116+
private bool TryGetCurrentNotePage(out NotePage currentNotePage)
55117
{
56118
try
57119
{
58-
string title, markdownText;
59120
using (var app = Context.CreateApplication())
60121
{
61-
var page = app.GetCurrentNotePage();
62-
title = page.Title.InnerText;
63-
markdownText = page.ContentInnerText;
122+
currentNotePage = app.GetCurrentNotePage();
123+
}
124+
if (currentNotePage == null)
125+
{
126+
return false;
64127
}
65-
var htmlBody = MarkdownHelper.MarkdownToHtml(markdownText);
66-
htmlContent = HtmlTemplate.LocalResourceTemplate.ToHtml(title, htmlBody);
67128
return true;
68129
}
69130
catch (Exception ex)
70131
{
71132
Logger.Error(ex);
72133
}
73-
htmlContent = null;
134+
135+
currentNotePage = null;
74136
return false;
75137
}
138+
139+
//private static IDictionary<int, WebBrowserWindow> windowContainer = new Dictionary<int, WebBrowserWindow>();
140+
//public override async Task ExecuteAsync(params object[] args)
141+
//{
142+
// var settings = Properties.Settings.Default;
143+
// if (TryGetPageContent(out var htmlContent))
144+
// {
145+
// if (settings.Markdown_Preview_Singleton && windowContainer.Count > 0)
146+
// {
147+
// var window = windowContainer.First().Value;
148+
// window.Dispatcher.Invoke(() =>
149+
// {
150+
// window.BrowserHtmlContent = htmlContent;
151+
// window.RefreshBrowser();
152+
// });
153+
// }
154+
// else
155+
// {
156+
// await WpfAddInApplication.Current.BeginInvoke(() =>
157+
// {
158+
// var window = new WebBrowserWindow();
159+
// window.RememberMeIdentifier = "Markdown_Preview";
160+
// window.BrowserHtmlContent = htmlContent;
161+
// var helper = new System.Windows.Interop.WindowInteropHelper(window);
162+
// helper.Owner = OwnerWin32Window.Handle;
163+
// window.Closed += (s, e) =>
164+
// {
165+
// var key = window.GetHashCode();
166+
// if (windowContainer.ContainsKey(key))
167+
// {
168+
// windowContainer.Remove(key);
169+
// }
170+
// };
171+
// windowContainer.Add(window.GetHashCode(), window);
172+
// window.Show();
173+
// });
174+
// }
175+
// }
176+
// await Task.Yield();
177+
//}
178+
//private bool TryGetPageContent(out string htmlContent)
179+
//{
180+
// try
181+
// {
182+
// string title, markdownText;
183+
// using (var app = Context.CreateApplication())
184+
// {
185+
// var page = app.GetCurrentNotePage();
186+
// title = page.Title.InnerText;
187+
// markdownText = page.ContentInnerText;
188+
// }
189+
// var htmlBody = MarkdownHelper.MarkdownToHtml(markdownText);
190+
// htmlContent = HtmlTemplate.LocalResourceTemplate.ToHtml(title, htmlBody);
191+
// return true;
192+
// }
193+
// catch (Exception ex)
194+
// {
195+
// Logger.Error(ex);
196+
// }
197+
// htmlContent = null;
198+
// return false;
199+
//}
76200
}
77201
}

0 commit comments

Comments
 (0)