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
}