55using System . Collections . Generic ;
66using System . Linq ;
77using System . Threading . Tasks ;
8- using NoteWidgetAddIn . RibbonCommand . Markdown ;
98using NoteWidgetAddIn . Markdown ;
9+ using NoteWidgetAddIn . Model ;
10+ using NoteWidgetAddIn . RibbonCommand . Markdown ;
1011
1112namespace 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