#pragma warning restore IDE0069 // Disposable fields should be disposed

        public BookTemplateEditor()
        {
            InitializeComponent();

            SCBook    = new SCBook(Editor);
            Disposed += BookTemplateEditor_Disposed;

            UIUtils.ConfigureRibbonBar(Ribbon);

            Editor.AddService(typeof(ICommandUIStateManagerService), new BookTemplateICommandUIStateManagerService());

            var menuCommandHandler = new BookTemplateMenuCommandHandler(Editor);

            menuCommandHandler.RegisterMenuCommands();
            Editor.RemoveService(typeof(DevExpress.Snap.MenuCommandHandler));
            Editor.AddService(typeof(DevExpress.Snap.MenuCommandHandler), menuCommandHandler);

            //Disable removing styles
            barRemoveStyle.Visibility = BarItemVisibility.Never;
        }
 private void BookTemplateEditor_Disposed(object sender, EventArgs e)
 {
     SCBook?.Dispose();
     SCBook = null;
 }
        protected void WriteTable(Document book)
        {
            var dataSource = GetDataSource(_Output, DataSource, IgnoreErrors);

            if (string.IsNullOrWhiteSpace(TemplateFile))
            {
                throw new Exception("Template file is not specified.");
            }

            var templateFile = Project.Current.MapPath(TemplateFile);

            if (!File.Exists(templateFile))
            {
                throw new Exception($"Template file '{TemplateFile}' does not exist.");
            }

            MemoryStream documentData;

            using (var template = SCBook.NewSnapSCBook())
            {
                ExecuteLocked(() => template.Document.LoadDocument(templateFile), LockFiles ? LockObject : null);

                var mergeOptions = (template.BookServer as SnapDocumentServer).CreateSnapMailMergeExportOptions();
                mergeOptions.DataSource                 = dataSource;
                mergeOptions.DataMember                 = null;
                mergeOptions.CopyTemplateStyles         = CopyTemplateStyles;
                mergeOptions.HeaderFooterLinkToPrevious = !DoNotLinkHeaderFooter;
                if (NumberedListRestart.HasValue)
                {
                    mergeOptions.NumberedListRestart = NumberedListRestart.Value;
                }

                var snapDocument = template.Document as SnapDocument;
                snapDocument.Parameters.Clear();
                if (Parameters != null)
                {
                    foreach (DictionaryEntry keyValuePair in Parameters)
                    {
                        var parameter = new Parameter()
                        {
                            Name  = Convert.ToString(keyValuePair.Key),
                            Value = keyValuePair.Value,
                            Type  = keyValuePair.Value?.GetType() ?? typeof(string)
                        };
                        snapDocument.Parameters.Add(parameter);
                    }
                }

                documentData = new MemoryStream();
                snapDocument.SnapMailMerge(mergeOptions, documentData, DocumentFormat.OpenXml);
                documentData.Seek(0, SeekOrigin.Begin);
            }

            ExecuteSynchronized(() => DoWriteBook(book, documentData));

            if (OutputBook)
            {
                documentData.Seek(0, SeekOrigin.Begin);

                var outBook = new SCBookContext();
                outBook.Document.LoadDocument(documentData, DocumentFormat.OpenXml);

                WriteObject(outBook);
            }
        }