using System; using System.ComponentModel; using System.IO; using System.Linq; using System.Reflection; using System.Windows; using System.Windows.Controls; using System.Windows.Media.Imaging; using Comal.Classes; using InABox.WPF; using Microsoft.Xaml.Behaviors; using PRSDesktop; using Syncfusion.SfSkinManager; using Syncfusion.UI.Xaml.Grid.Utility; using Syncfusion.UI.Xaml.Spreadsheet; using Syncfusion.UI.Xaml.Spreadsheet.Commands; using Syncfusion.Windows.Tools.Controls; using Syncfusion.XlsIO; using Syncfusion.XlsIO.Implementation; namespace InABox.DynamicGrid.Spreadsheet { public class ZoomSliderBehavior : Behavior { private Slider zoomSlider; private Button zoomDecreaseButton; private Button zoomIncreaseButton; protected override void OnAttached() { zoomSlider = this.AssociatedObject.Children[1] as Slider; zoomDecreaseButton = this.AssociatedObject.Children[0] as Button; zoomIncreaseButton = this.AssociatedObject.Children[2] as Button; zoomSlider.ValueChanged += zoomSlider_ValueChanged; zoomDecreaseButton.Click += zoomDecreaseButton_Click; zoomIncreaseButton.Click += zoomIncreaseButton_Click; } void zoomIncreaseButton_Click(object sender, RoutedEventArgs e) { var value = (int)((zoomSlider.Value + 10) / 10); zoomSlider.Value = value * 10; } void zoomDecreaseButton_Click(object sender, RoutedEventArgs e) { var value = (int)((zoomSlider.Value - 10) / 10); zoomSlider.Value = value * 10; } void zoomSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs e) { var spreadsheet = this.AssociatedObject.DataContext as SfSpreadsheet; if (spreadsheet.ActiveSheet != null && e.NewValue != spreadsheet.ActiveSheet.Zoom) spreadsheet.SetZoomFactor(spreadsheet.ActiveSheet.Name, (int) e.NewValue); } protected override void OnDetaching() { zoomSlider.ValueChanged -= zoomSlider_ValueChanged; zoomDecreaseButton.Click -= zoomDecreaseButton_Click; zoomIncreaseButton.Click -= zoomIncreaseButton_Click; } } public class SpreadsheetSaveArgs { public ISpreadsheet Spreadsheet { get; } public byte[] Data { get; } public bool SaveAs { get; } public SpreadsheetSaveArgs(ISpreadsheet spreadsheet, byte[] data, bool saveas) { Spreadsheet = spreadsheet; Data = data; SaveAs = saveas; } } public delegate void SpreadsheetSave(object sender, SpreadsheetSaveArgs args); public partial class SpreadsheetWindow : RibbonWindow { private ISpreadsheet _sheet = null; public event SpreadsheetSave OnSave; public SpreadsheetWindow(ISpreadsheet sheet) { _sheet = sheet; InitializeComponent(); SfSkinManager.SetTheme(this, new Theme() { ThemeName = "MaterialLight" }); if (sheet.Data?.Any() == true) { using (var ms = new MemoryStream(sheet.Data)) { spreadsheet.Open(ms); } } else { using (var ms = new MemoryStream()) { ExcelEngine excelEngine = new ExcelEngine(); IApplication application = excelEngine.Excel; application.DefaultVersion = ExcelVersion.Xlsx; IWorkbook workbook = application.Workbooks.Create(0); IWorksheet worksheet = workbook.Worksheets.Create("Sheet 1"); workbook.SaveAs(ms); ms.Position = 0; spreadsheet.Open(ms); } } SetTitle(); spreadsheet.Commands.CommandExecuting += (o, args) => { if (args.CommandName == nameof(spreadsheet.Commands.FileSave)) { args.Cancel = true; DoSave(false); SetTitle(); return; } if (args.CommandName == nameof(spreadsheet.Commands.FileSaveAs)) { args.Cancel = true; DoSave(true); SetTitle(); return; } if (args.CommandName == nameof(spreadsheet.Commands.FileClose)) { args.Cancel = true; if (!CheckChanged()) return; Dispatcher.Invoke(() => DialogResult = true); } }; } private void SetTitle() { Title = (Guid.Equals(_sheet.ID, Guid.Empty)) ? "New Spreadsheet" : $"{_sheet.Code} : {_sheet.Description}"; } private bool IsSpreadsheetChanged() { var workbook = spreadsheet.Workbook as WorkbookImpl; var value = typeof(WorkbookImpl).GetProperty("IsCellModified", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static).GetValue(workbook); return bool.Equals(value,true); //if (spreadsheet.HistoryManager.UndoStack.Any()) } private bool CheckChanged() { if (IsSpreadsheetChanged()) { var result = MessageBox.Show("This spreadsheet has unsaved changes!\n\nDo you wish to save these before closing?", "Unsaved changes", MessageBoxButton.YesNoCancel); if (result == MessageBoxResult.Cancel) return false; if (result == MessageBoxResult.Yes) DoSave(false); } return true; } private void DoSave(bool saveas) { using (var ms = new MemoryStream()) { spreadsheet.SaveAs(ms); OnSave?.Invoke(this, new SpreadsheetSaveArgs(_sheet, ms.GetBuffer(), saveas)); } } protected override void OnClosing(CancelEventArgs e) { if (!CheckChanged()) { e.Cancel = true; return; } if (this.spreadsheet != null) { this.spreadsheet.Dispose(); this.spreadsheet = null; } if(this.ribbon != null) { this.ribbon.Dispose(); this.ribbon = null; } base.OnClosing(e); } } }