| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217 | 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<StackPanel>    {        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<double> 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);        }    }}
 |