SpreadsheetWindow.xaml.cs 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. using System;
  2. using System.ComponentModel;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Reflection;
  6. using System.Windows;
  7. using System.Windows.Controls;
  8. using System.Windows.Media.Imaging;
  9. using Comal.Classes;
  10. using InABox.WPF;
  11. using Microsoft.Xaml.Behaviors;
  12. using PRSDesktop;
  13. using Syncfusion.SfSkinManager;
  14. using Syncfusion.UI.Xaml.Grid.Utility;
  15. using Syncfusion.UI.Xaml.Spreadsheet;
  16. using Syncfusion.UI.Xaml.Spreadsheet.Commands;
  17. using Syncfusion.Windows.Tools.Controls;
  18. using Syncfusion.XlsIO;
  19. using Syncfusion.XlsIO.Implementation;
  20. namespace InABox.DynamicGrid.Spreadsheet
  21. {
  22. public class ZoomSliderBehavior : Behavior<StackPanel>
  23. {
  24. private Slider zoomSlider;
  25. private Button zoomDecreaseButton;
  26. private Button zoomIncreaseButton;
  27. protected override void OnAttached()
  28. {
  29. zoomSlider = this.AssociatedObject.Children[1] as Slider;
  30. zoomDecreaseButton = this.AssociatedObject.Children[0] as Button;
  31. zoomIncreaseButton = this.AssociatedObject.Children[2] as Button;
  32. zoomSlider.ValueChanged += zoomSlider_ValueChanged;
  33. zoomDecreaseButton.Click += zoomDecreaseButton_Click;
  34. zoomIncreaseButton.Click += zoomIncreaseButton_Click;
  35. }
  36. void zoomIncreaseButton_Click(object sender, RoutedEventArgs e)
  37. {
  38. var value = (int)((zoomSlider.Value + 10) / 10);
  39. zoomSlider.Value = value * 10;
  40. }
  41. void zoomDecreaseButton_Click(object sender, RoutedEventArgs e)
  42. {
  43. var value = (int)((zoomSlider.Value - 10) / 10);
  44. zoomSlider.Value = value * 10;
  45. }
  46. void zoomSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
  47. {
  48. var spreadsheet = this.AssociatedObject.DataContext as SfSpreadsheet;
  49. if (spreadsheet.ActiveSheet != null && e.NewValue != spreadsheet.ActiveSheet.Zoom)
  50. spreadsheet.SetZoomFactor(spreadsheet.ActiveSheet.Name, (int) e.NewValue);
  51. }
  52. protected override void OnDetaching()
  53. {
  54. zoomSlider.ValueChanged -= zoomSlider_ValueChanged;
  55. zoomDecreaseButton.Click -= zoomDecreaseButton_Click;
  56. zoomIncreaseButton.Click -= zoomIncreaseButton_Click;
  57. }
  58. }
  59. public class SpreadsheetSaveArgs
  60. {
  61. public ISpreadsheet Spreadsheet { get; }
  62. public byte[] Data { get; }
  63. public bool SaveAs { get; }
  64. public SpreadsheetSaveArgs(ISpreadsheet spreadsheet, byte[] data, bool saveas)
  65. {
  66. Spreadsheet = spreadsheet;
  67. Data = data;
  68. SaveAs = saveas;
  69. }
  70. }
  71. public delegate void SpreadsheetSave(object sender, SpreadsheetSaveArgs args);
  72. public partial class SpreadsheetWindow : RibbonWindow
  73. {
  74. private ISpreadsheet _sheet = null;
  75. public event SpreadsheetSave OnSave;
  76. public SpreadsheetWindow(ISpreadsheet sheet)
  77. {
  78. _sheet = sheet;
  79. InitializeComponent();
  80. SfSkinManager.SetTheme(this, new Theme() { ThemeName = "MaterialLight" });
  81. if (sheet.Data?.Any() == true)
  82. {
  83. using (var ms = new MemoryStream(sheet.Data))
  84. {
  85. spreadsheet.Open(ms);
  86. }
  87. }
  88. else
  89. {
  90. using (var ms = new MemoryStream())
  91. {
  92. ExcelEngine excelEngine = new ExcelEngine();
  93. IApplication application = excelEngine.Excel;
  94. application.DefaultVersion = ExcelVersion.Xlsx;
  95. IWorkbook workbook = application.Workbooks.Create(0);
  96. IWorksheet worksheet = workbook.Worksheets.Create("Sheet 1");
  97. workbook.SaveAs(ms);
  98. ms.Position = 0;
  99. spreadsheet.Open(ms);
  100. }
  101. }
  102. SetTitle();
  103. spreadsheet.Commands.CommandExecuting += (o, args) =>
  104. {
  105. if (args.CommandName == nameof(spreadsheet.Commands.FileSave))
  106. {
  107. args.Cancel = true;
  108. DoSave(false);
  109. SetTitle();
  110. return;
  111. }
  112. if (args.CommandName == nameof(spreadsheet.Commands.FileSaveAs))
  113. {
  114. args.Cancel = true;
  115. DoSave(true);
  116. SetTitle();
  117. return;
  118. }
  119. if (args.CommandName == nameof(spreadsheet.Commands.FileClose))
  120. {
  121. args.Cancel = true;
  122. if (!CheckChanged())
  123. return;
  124. Dispatcher.Invoke(() => DialogResult = true);
  125. }
  126. };
  127. }
  128. private void SetTitle()
  129. {
  130. Title = (Guid.Equals(_sheet.ID, Guid.Empty))
  131. ? "New Spreadsheet"
  132. : $"{_sheet.Code} : {_sheet.Description}";
  133. }
  134. private bool IsSpreadsheetChanged()
  135. {
  136. var workbook = spreadsheet.Workbook as WorkbookImpl;
  137. var value = typeof(WorkbookImpl).GetProperty("IsCellModified", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static).GetValue(workbook);
  138. return bool.Equals(value,true);
  139. //if (spreadsheet.HistoryManager.UndoStack.Any())
  140. }
  141. private bool CheckChanged()
  142. {
  143. if (IsSpreadsheetChanged())
  144. {
  145. var result = MessageBox.Show("This spreadsheet has unsaved changes!\n\nDo you wish to save these before closing?",
  146. "Unsaved changes", MessageBoxButton.YesNoCancel);
  147. if (result == MessageBoxResult.Cancel)
  148. return false;
  149. if (result == MessageBoxResult.Yes)
  150. DoSave(false);
  151. }
  152. return true;
  153. }
  154. private void DoSave(bool saveas)
  155. {
  156. using (var ms = new MemoryStream())
  157. {
  158. spreadsheet.SaveAs(ms);
  159. OnSave?.Invoke(this, new SpreadsheetSaveArgs(_sheet, ms.GetBuffer(), saveas));
  160. }
  161. }
  162. protected override void OnClosing(CancelEventArgs e)
  163. {
  164. if (!CheckChanged())
  165. {
  166. e.Cancel = true;
  167. return;
  168. }
  169. if (this.spreadsheet != null)
  170. {
  171. this.spreadsheet.Dispose();
  172. this.spreadsheet = null;
  173. }
  174. if(this.ribbon != null)
  175. {
  176. this.ribbon.Dispose();
  177. this.ribbon = null;
  178. }
  179. base.OnClosing(e);
  180. }
  181. }
  182. }