aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Editing/AbstractMargin.cs
diff options
context:
space:
mode:
authorRoy Ben Shabat <Roy.mail.net@gmail.com>2019-04-09 01:47:48 +0300
committerRoy Ben Shabat <Roy.mail.net@gmail.com>2019-04-09 01:47:48 +0300
commit080f1697e97e13461ec6df4d31c8924d01257a1b (patch)
treeb1fe0285de7bc9bc52e9e2195e66fe022bf8f5b3 /Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Editing/AbstractMargin.cs
parent1608e69a417bc5e40a607c3958c4a60f19f66f1a (diff)
downloadTango-080f1697e97e13461ec6df4d31c8924d01257a1b.tar.gz
Tango-080f1697e97e13461ec6df4d31c8924d01257a1b.zip
MERGE
Diffstat (limited to 'Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Editing/AbstractMargin.cs')
-rw-r--r--Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Editing/AbstractMargin.cs102
1 files changed, 102 insertions, 0 deletions
diff --git a/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Editing/AbstractMargin.cs b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Editing/AbstractMargin.cs
new file mode 100644
index 000000000..c82ff94a0
--- /dev/null
+++ b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Editing/AbstractMargin.cs
@@ -0,0 +1,102 @@
+// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
+// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
+
+using System;
+using System.Diagnostics;
+using System.Windows;
+
+using Tango.Scripting.Editors.Document;
+using Tango.Scripting.Editors.Rendering;
+
+namespace Tango.Scripting.Editors.Editing
+{
+ /// <summary>
+ /// Base class for margins.
+ /// Margins don't have to derive from this class, it just helps maintaining a reference to the TextView
+ /// and the TextDocument.
+ /// AbstractMargin derives from FrameworkElement, so if you don't want to handle visual children and rendering
+ /// on your own, choose another base class for your margin!
+ /// </summary>
+ public abstract class AbstractMargin : FrameworkElement, ITextViewConnect
+ {
+ /// <summary>
+ /// TextView property.
+ /// </summary>
+ public static readonly DependencyProperty TextViewProperty =
+ DependencyProperty.Register("TextView", typeof(TextView), typeof(AbstractMargin),
+ new FrameworkPropertyMetadata(OnTextViewChanged));
+
+ /// <summary>
+ /// Gets/sets the text view for which line numbers are displayed.
+ /// </summary>
+ /// <remarks>Adding a margin to <see cref="TextArea.LeftMargins"/> will automatically set this property to the text area's TextView.</remarks>
+ public TextView TextView {
+ get { return (TextView)GetValue(TextViewProperty); }
+ set { SetValue(TextViewProperty, value); }
+ }
+
+ static void OnTextViewChanged(DependencyObject dp, DependencyPropertyChangedEventArgs e)
+ {
+ AbstractMargin margin = (AbstractMargin)dp;
+ margin.wasAutoAddedToTextView = false;
+ margin.OnTextViewChanged((TextView)e.OldValue, (TextView)e.NewValue);
+ }
+
+ // automatically set/unset TextView property using ITextViewConnect
+ bool wasAutoAddedToTextView;
+
+ void ITextViewConnect.AddToTextView(TextView textView)
+ {
+ if (this.TextView == null) {
+ this.TextView = textView;
+ wasAutoAddedToTextView = true;
+ } else if (this.TextView != textView) {
+ throw new InvalidOperationException("This margin belongs to a different TextView.");
+ }
+ }
+
+ void ITextViewConnect.RemoveFromTextView(TextView textView)
+ {
+ if (wasAutoAddedToTextView && this.TextView == textView) {
+ this.TextView = null;
+ Debug.Assert(!wasAutoAddedToTextView); // setting this.TextView should have unset this flag
+ }
+ }
+
+ TextDocument document;
+
+ /// <summary>
+ /// Gets the document associated with the margin.
+ /// </summary>
+ public TextDocument Document {
+ get { return document; }
+ }
+
+ /// <summary>
+ /// Called when the <see cref="TextView"/> is changing.
+ /// </summary>
+ protected virtual void OnTextViewChanged(TextView oldTextView, TextView newTextView)
+ {
+ if (oldTextView != null) {
+ oldTextView.DocumentChanged -= TextViewDocumentChanged;
+ }
+ if (newTextView != null) {
+ newTextView.DocumentChanged += TextViewDocumentChanged;
+ }
+ TextViewDocumentChanged(null, null);
+ }
+
+ void TextViewDocumentChanged(object sender, EventArgs e)
+ {
+ OnDocumentChanged(document, TextView != null ? TextView.Document : null);
+ }
+
+ /// <summary>
+ /// Called when the <see cref="Document"/> is changing.
+ /// </summary>
+ protected virtual void OnDocumentChanged(TextDocument oldDocument, TextDocument newDocument)
+ {
+ document = newDocument;
+ }
+ }
+}