From 140533ed754cb8109d00f25cf33f2b5864ca0edc Mon Sep 17 00:00:00 2001 From: brianlagunas_cp Date: Sat, 30 Oct 2010 04:17:44 +0000 Subject: [PATCH] RichTextBox: Removed the AllowFormatting property and completely changed the way the format bar works. The format bar is now a seperate control and can be used either on the deafult RichTextBox or the toolkit's RichTextBox. The format bar is used in conjunction with a format bar manager class. You add the format bar as follows or on the default RichTextBox like so You can also create your own format bar by inheriting from IRichTextBoxFormatBar. --- .../UIElementAdorner.cs | 2 +- .../FormatToolbar/FormatToolbarManager.cs | 107 ----------- .../RichTextBox/RichTextBox.cs | 23 +-- .../IRichTextBoxFormatBar.cs | 9 + .../Images/Bold16.png | Bin .../Images/CenterAlign16.png | Bin .../Images/Italic16.png | Bin .../Images/JustifyAlign16.png | Bin .../Images/LeftAlign16.png | Bin .../Images/RightAlign16.png | Bin .../Images/Underline16.png | Bin .../RichTextBoxFormatBar.xaml} | 39 ++-- .../RichTextBoxFormatBar.xaml.cs} | 34 +++- .../RichTextBoxFormatBarManager.cs | 177 ++++++++++++++++++ .../WPFToolkit.Extended.csproj | 42 +++-- 15 files changed, 269 insertions(+), 164 deletions(-) rename ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/{RichTextBox/FormatToolbar => Core}/UIElementAdorner.cs (95%) delete mode 100644 ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBox/FormatToolbar/FormatToolbarManager.cs create mode 100644 ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBoxFormatBar/IRichTextBoxFormatBar.cs rename ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/{RichTextBox/FormatToolbar => RichTextBoxFormatBar}/Images/Bold16.png (100%) rename ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/{RichTextBox/FormatToolbar => RichTextBoxFormatBar}/Images/CenterAlign16.png (100%) rename ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/{RichTextBox/FormatToolbar => RichTextBoxFormatBar}/Images/Italic16.png (100%) rename ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/{RichTextBox/FormatToolbar => RichTextBoxFormatBar}/Images/JustifyAlign16.png (100%) rename ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/{RichTextBox/FormatToolbar => RichTextBoxFormatBar}/Images/LeftAlign16.png (100%) rename ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/{RichTextBox/FormatToolbar => RichTextBoxFormatBar}/Images/RightAlign16.png (100%) rename ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/{RichTextBox/FormatToolbar => RichTextBoxFormatBar}/Images/Underline16.png (100%) rename ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/{RichTextBox/FormatToolbar/FormatToolbar.xaml => RichTextBoxFormatBar/RichTextBoxFormatBar.xaml} (87%) rename ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/{RichTextBox/FormatToolbar/FormatToolbar.xaml.cs => RichTextBoxFormatBar/RichTextBoxFormatBar.xaml.cs} (80%) create mode 100644 ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBoxFormatBar/RichTextBoxFormatBarManager.cs diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBox/FormatToolbar/UIElementAdorner.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Core/UIElementAdorner.cs similarity index 95% rename from ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBox/FormatToolbar/UIElementAdorner.cs rename to ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Core/UIElementAdorner.cs index 7b601b47..263ca034 100644 --- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBox/FormatToolbar/UIElementAdorner.cs +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Core/UIElementAdorner.cs @@ -4,7 +4,7 @@ using System.Windows.Media; using System.Windows.Documents; using System.Windows; -namespace Microsoft.Windows.Controls.Formatting +namespace Microsoft.Windows.Controls.Core { /// /// An adorner that can display one and only one UIElement. diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBox/FormatToolbar/FormatToolbarManager.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBox/FormatToolbar/FormatToolbarManager.cs deleted file mode 100644 index 295e419a..00000000 --- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBox/FormatToolbar/FormatToolbarManager.cs +++ /dev/null @@ -1,107 +0,0 @@ -using System; -using System.Windows.Controls; -using System.Windows.Documents; -using System.Windows; - -namespace Microsoft.Windows.Controls.Formatting -{ - internal class FormatToolbarManager - { - RichTextBox _richTextBox; - readonly UIElementAdorner _adorner; - FormatToolbar toolbar; - - bool AdornerIsVisible - { - get { return _adorner.Visibility == Visibility.Visible; } - } - - public FormatToolbarManager(RichTextBox richTextBox) - { - _richTextBox = richTextBox; - _adorner = new UIElementAdorner(richTextBox); - toolbar = new FormatToolbar(richTextBox); - AttachToRichtextBox(); - } - - private void AttachToRichtextBox() - { - _richTextBox.Selection.Changed += Selection_Changed; - } - - void Selection_Changed(object sender, EventArgs e) - { - TextRange selectedText = new TextRange(_richTextBox.Selection.Start, _richTextBox.Selection.End); - if (selectedText.Text.Length > 0) - { - VerifyAdorner(); - } - else - { - HideAdorner(); - } - } - - //TODO: refactor - void VerifyAdorner() - { - VerifyAdornerLayer(); - - Control adorningEditor = toolbar; - _adorner.Child = adorningEditor; - _adorner.Visibility = Visibility.Visible; - - Rect wordBoundary = _richTextBox.Selection.End.GetPositionAtOffset(0, LogicalDirection.Backward).GetCharacterRect(LogicalDirection.Backward); - - double left = wordBoundary.X; - double top = (wordBoundary.Y + wordBoundary.Height) - toolbar.ActualHeight; - - //top boundary - if (top < 0) - { - top = wordBoundary.Y + wordBoundary.Height; - } - - //right boundary - if (left + toolbar.ActualWidth > _richTextBox.ActualWidth - 20) - { - left = left - toolbar.ActualWidth; - top = wordBoundary.Y + wordBoundary.Height + 5; - } - - //bottom boundary - if (top + toolbar.ActualHeight > _richTextBox.ActualHeight - 20) - { - top = wordBoundary.Y - (toolbar.ActualHeight + wordBoundary.Height); - } - - _adorner.SetOffsets(left, top); - } - - /// - /// Ensures that the adorner is in the adorner layer. - /// - /// True if the adorner is in the adorner layer, else false. - bool VerifyAdornerLayer() - { - if (_adorner.Parent != null) - return true; - - AdornerLayer layer = AdornerLayer.GetAdornerLayer(_richTextBox); - if (layer == null) - return false; - - layer.Add(_adorner); - return true; - } - - void HideAdorner() - { - if (this.AdornerIsVisible) - { - _adorner.Visibility = Visibility.Collapsed; - _adorner.Child = null; - } - } - } -} diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBox/RichTextBox.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBox/RichTextBox.cs index ff9c810d..c8015e32 100644 --- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBox/RichTextBox.cs +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBox/RichTextBox.cs @@ -2,7 +2,6 @@ using System.Windows; using System.Windows.Data; using System.Windows.Threading; -using Microsoft.Windows.Controls.Formatting; namespace Microsoft.Windows.Controls { @@ -12,7 +11,6 @@ namespace Microsoft.Windows.Controls private bool _textHasLoaded; private bool isInvokePending; - private FormatToolbarManager _manager; #endregion //Private Members @@ -33,28 +31,9 @@ namespace Microsoft.Windows.Controls #region Properties - #region AllowFormatting - - public static readonly DependencyProperty AllowFormatingProperty = DependencyProperty.Register("AllowFormating", typeof(bool), typeof(RichTextBox), new PropertyMetadata(false, new PropertyChangedCallback(OnAllowFormatingPropertyChanged))); - public bool AllowFormating - { - get { return (bool)GetValue(AllowFormatingProperty); } - set { SetValue(AllowFormatingProperty, value); } - } - - private static void OnAllowFormatingPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) - { - RichTextBox rtb = (RichTextBox)d; - - if ((bool)e.NewValue) - rtb._manager = new FormatToolbarManager(rtb); - } - - #endregion //AllowFormatting - #region Text - public static readonly DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(RichTextBox), new FrameworkPropertyMetadata(String.Empty, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, new PropertyChangedCallback(OnTextPropertyChanged), new CoerceValueCallback(CoerceTextProperty), true, System.Windows.Data.UpdateSourceTrigger.LostFocus)); + public static readonly DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(RichTextBox), new FrameworkPropertyMetadata(String.Empty, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnTextPropertyChanged, CoerceTextProperty, true, UpdateSourceTrigger.LostFocus)); public string Text { get { return (string)GetValue(TextProperty); } diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBoxFormatBar/IRichTextBoxFormatBar.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBoxFormatBar/IRichTextBoxFormatBar.cs new file mode 100644 index 00000000..a39f4105 --- /dev/null +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBoxFormatBar/IRichTextBoxFormatBar.cs @@ -0,0 +1,9 @@ +using System; + +namespace Microsoft.Windows.Controls +{ + public interface IRichTextBoxFormatBar + { + global::System.Windows.Controls.RichTextBox RichTextBox { get; set; } + } +} diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBox/FormatToolbar/Images/Bold16.png b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBoxFormatBar/Images/Bold16.png similarity index 100% rename from ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBox/FormatToolbar/Images/Bold16.png rename to ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBoxFormatBar/Images/Bold16.png diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBox/FormatToolbar/Images/CenterAlign16.png b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBoxFormatBar/Images/CenterAlign16.png similarity index 100% rename from ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBox/FormatToolbar/Images/CenterAlign16.png rename to ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBoxFormatBar/Images/CenterAlign16.png diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBox/FormatToolbar/Images/Italic16.png b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBoxFormatBar/Images/Italic16.png similarity index 100% rename from ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBox/FormatToolbar/Images/Italic16.png rename to ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBoxFormatBar/Images/Italic16.png diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBox/FormatToolbar/Images/JustifyAlign16.png b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBoxFormatBar/Images/JustifyAlign16.png similarity index 100% rename from ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBox/FormatToolbar/Images/JustifyAlign16.png rename to ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBoxFormatBar/Images/JustifyAlign16.png diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBox/FormatToolbar/Images/LeftAlign16.png b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBoxFormatBar/Images/LeftAlign16.png similarity index 100% rename from ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBox/FormatToolbar/Images/LeftAlign16.png rename to ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBoxFormatBar/Images/LeftAlign16.png diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBox/FormatToolbar/Images/RightAlign16.png b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBoxFormatBar/Images/RightAlign16.png similarity index 100% rename from ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBox/FormatToolbar/Images/RightAlign16.png rename to ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBoxFormatBar/Images/RightAlign16.png diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBox/FormatToolbar/Images/Underline16.png b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBoxFormatBar/Images/Underline16.png similarity index 100% rename from ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBox/FormatToolbar/Images/Underline16.png rename to ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBoxFormatBar/Images/Underline16.png diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBox/FormatToolbar/FormatToolbar.xaml b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBoxFormatBar/RichTextBoxFormatBar.xaml similarity index 87% rename from ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBox/FormatToolbar/FormatToolbar.xaml rename to ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBoxFormatBar/RichTextBoxFormatBar.xaml index 314e9102..3c793a16 100644 --- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBox/FormatToolbar/FormatToolbar.xaml +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBoxFormatBar/RichTextBoxFormatBar.xaml @@ -1,7 +1,7 @@ - @@ -10,12 +10,29 @@ +