From 3d7d7d9baa88569d6ec9eea50c34424a4b0f6d10 Mon Sep 17 00:00:00 2001 From: Carl Chang Date: Mon, 13 May 2019 15:39:56 +0800 Subject: [PATCH] update target window on keyboard focus; add warning when closing without successful save; --- App.xaml.cs | 5 +- MainWindow.xaml | 3 +- MainWindow.xaml.cs | 82 +++++++++++++----------------- Resources/StringResources.en.xaml | 1 + Resources/StringResources.zh.xaml | 1 + bin/Release/DesktopNote.exe | Bin 1306112 -> 1306112 bytes 6 files changed, 43 insertions(+), 49 deletions(-) diff --git a/App.xaml.cs b/App.xaml.cs index 1f49957..619ecb8 100644 --- a/App.xaml.cs +++ b/App.xaml.cs @@ -122,7 +122,10 @@ public static void Quit(bool savesetting) foreach (var win in MainWindows) { if (win == null) continue; - win.SaveToXamlPkg(); + var exMsg = win.SaveToXamlPkg(); + if (exMsg != null && + MessageBox.Show(exMsg + "\r\n" + (string)App.Current.Resources["msgbox_not_saved_confirm"], "", MessageBoxButton.YesNo, MessageBoxImage.Exclamation) != MessageBoxResult.Yes) + return; if (savesetting) { win.CurrentSetting.Win_Pos = new Point(win.Left, win.Top); diff --git a/MainWindow.xaml b/MainWindow.xaml index f03b930..3670dda 100644 --- a/MainWindow.xaml +++ b/MainWindow.xaml @@ -26,7 +26,8 @@ + GotKeyboardFocus="RTB_Main_GotKeyboardFocus" LostKeyboardFocus="RTB_Main_LostKeyboardFocus" + ContextMenuOpening="RTB_Main_ContextMenuOpening" PreviewMouseDown="RTB_Main_PreviewMouseDown"> diff --git a/MainWindow.xaml.cs b/MainWindow.xaml.cs index bd0c8f8..50c2524 100644 --- a/MainWindow.xaml.cs +++ b/MainWindow.xaml.cs @@ -270,6 +270,11 @@ private void RTB_Main_LostKeyboardFocus(object sender, KeyboardFocusChangedEvent DockToSide(); } + private void RTB_Main_GotKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e) + { + App.FormatWindow.UpdateTargets(this); + } + private void RTB_Main_ContextMenuOpening(object sender, ContextMenuEventArgs e) { e.Handled = true; @@ -338,60 +343,43 @@ private void SaveNotes() } } - internal void SaveToXamlPkg() + private string TextRangeSave() { - lock (Lock_Save) + string statusText, exMsg = null; + try { - TextRange tr = null; - bool isUIthread = Dispatcher.CheckAccess(); - string result; - if (isUIthread) - tr = new TextRange(RTB_Main.Document.ContentStart, RTB_Main.Document.ContentEnd); - else - Dispatcher.Invoke(delegate { tr = new TextRange(RTB_Main.Document.ContentStart, RTB_Main.Document.ContentEnd); }); - - try - { - if (isUIthread) - { - using (var ms = new FileStream(CurrentSetting.Doc_Location, FileMode.Create)) - { - tr.Save(ms, DataFormats.XamlPackage, true); - } - File.WriteAllText(CurrentSetting.Bak_Location, tr.Text); - } - else - { - Dispatcher.Invoke(delegate - { - using (var ms = new FileStream(CurrentSetting.Doc_Location, FileMode.Create)) - { - tr.Save(ms, DataFormats.XamlPackage, true); - }; - File.WriteAllText(CurrentSetting.Bak_Location, tr.Text); - }); - } - result = (string)Application.Current.Resources["status_saved"]; - } - catch + var tr = new TextRange(RTB_Main.Document.ContentStart, RTB_Main.Document.ContentEnd); + using (var ms = new FileStream(CurrentSetting.Doc_Location, FileMode.Create)) { - result = (string)Application.Current.Resources["status_save_failed"]; + tr.Save(ms, DataFormats.XamlPackage, true); } + File.WriteAllText(CurrentSetting.Bak_Location, tr.Text); + statusText = (string)Application.Current.Resources["status_saved"]; + } + catch (Exception ex) + { + statusText = (string)Application.Current.Resources["status_save_failed"]; + exMsg = ex.ToString(); + } + + TB_Status.Text = statusText; + TB_Status.Visibility = Visibility.Visible; + return exMsg; + } + /// Non-null string if there are errors when saving. + internal string SaveToXamlPkg() + { + string exMsg = null; + lock (Lock_Save) + { + bool isUIthread = Dispatcher.CheckAccess(); if (isUIthread) - { - TB_Status.Text = result; - TB_Status.Visibility = Visibility.Visible; - } + exMsg = TextRangeSave(); else - { - Dispatcher.Invoke(delegate - { - TB_Status.Text = result; - TB_Status.Visibility = Visibility.Visible; - }); - } + exMsg = Dispatcher.Invoke(() => TextRangeSave()); } + return exMsg; } private void Win_Main_Loaded(object sender, RoutedEventArgs e) @@ -583,8 +571,8 @@ private void TrayIcon_TrayMouseDoubleClick(object sender, RoutedEventArgs e) win.UnDock(); } } - #endregion + #endregion } } diff --git a/Resources/StringResources.en.xaml b/Resources/StringResources.en.xaml index fd64b72..35ce4a6 100644 --- a/Resources/StringResources.en.xaml +++ b/Resources/StringResources.en.xaml @@ -59,4 +59,5 @@ Program will exit now. Text content path New Note Do you also want to delete the note content and backup files? + Current note content is not saved. Changes will be lost after exiting. Exit anyway? \ No newline at end of file diff --git a/Resources/StringResources.zh.xaml b/Resources/StringResources.zh.xaml index d6dd852..99df3d9 100644 --- a/Resources/StringResources.zh.xaml +++ b/Resources/StringResources.zh.xaml @@ -59,4 +59,5 @@ 文本保存路径 新笔记 是否需要一起删除笔记内容和备份文件? + 当前笔记内容并未保存,退出会丢失更改的内容。确定要退出吗? \ No newline at end of file diff --git a/bin/Release/DesktopNote.exe b/bin/Release/DesktopNote.exe index 620c4016bb7bd10923dbbbd53b5d59b0da8ee590..ec72550fc206eaf9c5ae72bbc118ec12734d0d1f 100644 GIT binary patch delta 15961 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 F{{jnym=6E| delta 15744 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 Lje}lb|78CI@%h_E