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);
- }
- }
- }
|