using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Drawing; namespace FastReport.Utils { #if !COMMUNITY /// /// Class for handling Exports visibility in the Preview control. /// public partial class ExportsOptions { private static ExportsOptions instance = null; /// /// Gets an instance of ExportOptions. /// /// An ExportOptions instance. public static ExportsOptions GetInstance() { if (instance == null) instance = new ExportsOptions(); return instance; } private ExportsTreeNode exportsMenu; /// /// All exports available in the Preview control. /// public ExportsTreeNode ExportsMenu { get { if (exportsMenu == null) { exportsMenu = new ExportsTreeNode() { Name = "Exports" }; CreateDefaultExports(); } return exportsMenu; } } /// /// Occurs once right before restore exports state. /// /// /// Use this event to configure the default exports state or add your own exports. /// public event EventHandler BeforeRestoreState; /// /// Occurs once right after restore exports state. /// /// /// You may use this event to disable some exports, for example: /// Config.PreviewSettings.Exports &= ~PreviewExports.PDFExport; /// Doing so before state is restored may not take an effect. /// public event EventHandler AfterRestoreState; internal void SaveState() { SaveOptions(); } private bool isRestored; internal void RestoreState() { if (!isRestored) { BeforeRestoreState?.Invoke(this, EventArgs.Empty); RestoreOptions(); AfterRestoreState?.Invoke(this, EventArgs.Empty); isRestored = true; } } private void EnumNodes(List list, ExportsTreeNode root) { list.Add(root); foreach (var node in root.Nodes) EnumNodes(list, node); } private List EnumNodes(ExportsTreeNode root) { var list = new List(); EnumNodes(list, root); return list; } private ExportsTreeNode FindItem(ExportsTreeNode root, string name, Type exportType) { foreach (var node in EnumNodes(root)) { if (exportType != null && node.ExportType == exportType || !string.IsNullOrEmpty(name) && node.Name == name) { return node; } } return null; } /// /// Sets Export category visibility. /// /// Export category name. /// Visibility state. public void SetExportCategoryEnabled(string name, bool enabled) { var node = FindItem(ExportsMenu, name, null); if (node != null) { foreach (var n in EnumNodes(node)) n.Enabled = enabled; } } /// /// Sets Export visibility. /// /// Export type. /// Visibility state. public void SetExportEnabled(Type exportType, bool enabled) { var node = FindItem(ExportsMenu, null, exportType); if (node != null) node.Enabled = enabled; } private ExportsOptions() { } /// /// Exports menu node. /// public partial class ExportsTreeNode { /// /// Gets or sets the name. /// public string Name { get; set; } /// /// Gets child nodes. /// public ExportsTreeNodeCollection Nodes { get; } /// /// Gets the parent node. /// public ExportsTreeNode Parent { get; private set; } /// /// Gets the root node. /// public ExportsTreeNode Root { get { var parent = this; while (parent.Parent != null) { parent = parent.Parent; } return parent; } } /// /// Gets or sets the type of the export. /// public Type ExportType { get; set; } /// /// Gets or sets the display text. /// public string Text { get; set; } /// /// Gets or sets the image index. /// public int ImageIndex { get; set; } = -1; /// /// Gets or sets the image. /// public Bitmap Image { get; set; } /// /// Gets or sets the tag. /// public ObjectInfo Tag { get; private set; } /// /// Gets or sets a value that indicates whether the node is enabled. /// public bool Enabled { get; set; } = true; internal ExportsTreeNode() { Nodes = new ExportsTreeNodeCollection(this); } /// /// Adds a category. /// /// The category key name. /// The image index. /// The category node. public ExportsTreeNode AddCategory(string name, int imageIndex = -1) { var node = new ExportsTreeNode() { Name = name, ImageIndex = imageIndex }; Nodes.Add(node); return node; } /// /// Adds a category. /// /// The category key name. /// The category display text. /// The image. /// The category node. public ExportsTreeNode AddCategory(string name, string text, Bitmap image) { var node = new ExportsTreeNode() { Name = name, Text = text, Image = image }; Nodes.Add(node); return node; } /// /// Adds an export and registers it. /// /// The export type. /// The display text. /// The image index. /// Returns this object to allow method chaining. public ExportsTreeNode AddExport(Type type, string text, int imageIndex = -1) { var node = new ExportsTreeNode() { Name = type.Name, ExportType = type, Text = text, ImageIndex = imageIndex }; node.Tag = RegisteredObjects.AddExport(node.ExportType, node.ToString(), node.ImageIndex); Nodes.Add(node); return this; } /// /// Adds an export and registers it. /// /// The export type. /// The display text. /// The image. /// Returns this object to allow method chaining. public ExportsTreeNode AddExport(Type type, string text, Bitmap image) { var node = new ExportsTreeNode() { Name = type.Name, ExportType = type, Text = text, Image = image }; node.Tag = RegisteredObjects.AddExport(node.ExportType, text, -1); Nodes.Add(node); return this; } /// /// Represents a collection of nodes. /// public class ExportsTreeNodeCollection : Collection { private ExportsTreeNode Owner { get; } internal ExportsTreeNodeCollection(ExportsTreeNode owner) { Owner = owner; } /// protected override void InsertItem(int index, ExportsTreeNode item) { item.Parent?.Nodes.Remove(item); base.InsertItem(index, item); item.Parent = Owner; } /// protected override void RemoveItem(int index) { var item = Items[index]; item.Parent = null; base.RemoveItem(index); } } } } #endif }