using System.IO;
using System.Text;
using System.Windows;
using Syncfusion.Windows.Controls.RichTextBoxAdv;
namespace InABox.DynamicGrid
{
///
/// Represents the extension class for SfRichTextBoxAdv.
///
public class ExtendedRichTextEditor : SfRichTextBoxAdv
{
#region Static Dependency Properties
///
/// Using as a backing store for Text dependency property to enable styling, animation etc.
///
public static readonly DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(ExtendedRichTextEditor),
new PropertyMetadata(string.Empty, OnTextChanged));
#endregion
#region Fields
private bool skipUpdating;
#endregion
#region Constructor
///
/// Initializes the instance of SfRichTextBoxAdvExtension class.
///
public ExtendedRichTextEditor()
{
// Wires the ContentChanged event.
ContentChanged += RTE_ContentChanged;
}
#endregion
#region Properties
///
/// Gets or Sets the text.
///
public string Text
{
get => (string)GetValue(TextProperty);
set => SetValue(TextProperty, value);
}
#endregion
#region Static Events
///
/// Called when text changed.
///
///
///
private static void OnTextChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
{
var richTextBox = (ExtendedRichTextEditor)obj;
//Update the document with the text.
richTextBox.UpdateDocument((string)e.NewValue);
}
#endregion
#region Events
///
/// Called when content changes in SfRichTextBoxAdv.
///
///
///
private void RTE_ContentChanged(object obj, ContentChangedEventArgs args)
{
if (Document != null)
{
// To skip internal updation of document on setting Text property.
skipUpdating = true;
Stream stream = new MemoryStream();
// Saves the document as text Stream.
Save(stream, FormatType.Html);
stream.Position = 0;
// Reads the stream and assigned the string to Text property
using (var reader = new StreamReader(stream))
{
Text = reader.ReadToEnd();
}
skipUpdating = false;
}
}
#endregion
#region Implementation
///
/// Updates the document.
///
/// The text.
private void UpdateDocument(string text)
{
// If text property is set internally means, skip updating the document.
if (!skipUpdating && !string.IsNullOrEmpty(text))
{
Stream stream = new MemoryStream();
// Convert the text string to byte array.
var bytes = Encoding.UTF8.GetBytes(text);
// Writes the byte array to stream.
stream.Write(bytes, 0, bytes.Length);
stream.Position = 0;
//Load the Text stream.
Load(stream, FormatType.Html);
}
}
///
/// Disposes the instance.
///
public void Dispose()
{
ContentChanged -= RTE_ContentChanged;
ClearValue(TextProperty);
base.Dispose();
}
#endregion
}
}