aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/TextEditorOptions.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Software/Visual_Studio/Scripting/Tango.Scripting.Editors/TextEditorOptions.cs')
-rw-r--r--Software/Visual_Studio/Scripting/Tango.Scripting.Editors/TextEditorOptions.cs434
1 files changed, 434 insertions, 0 deletions
diff --git a/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/TextEditorOptions.cs b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/TextEditorOptions.cs
new file mode 100644
index 000000000..3dcc99eab
--- /dev/null
+++ b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/TextEditorOptions.cs
@@ -0,0 +1,434 @@
+// 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.ComponentModel;
+using System.Reflection;
+using System.Text;
+
+namespace Tango.Scripting.Editors
+{
+ /// <summary>
+ /// A container for the text editor options.
+ /// </summary>
+ [Serializable]
+ public class TextEditorOptions : INotifyPropertyChanged
+ {
+ #region ctor
+ /// <summary>
+ /// Initializes an empty instance of TextEditorOptions.
+ /// </summary>
+ public TextEditorOptions()
+ {
+ }
+
+ /// <summary>
+ /// Initializes a new instance of TextEditorOptions by copying all values
+ /// from <paramref name="options"/> to the new instance.
+ /// </summary>
+ public TextEditorOptions(TextEditorOptions options)
+ {
+ // get all the fields in the class
+ FieldInfo[] fields = typeof(TextEditorOptions).GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);
+
+ // copy each value over to 'this'
+ foreach(FieldInfo fi in fields) {
+ if (!fi.IsNotSerialized)
+ fi.SetValue(this, fi.GetValue(options));
+ }
+ }
+ #endregion
+
+ #region PropertyChanged handling
+ /// <inheritdoc/>
+ [field: NonSerialized]
+ public event PropertyChangedEventHandler PropertyChanged;
+
+ /// <summary>
+ /// Raises the PropertyChanged event.
+ /// </summary>
+ /// <param name="propertyName">The name of the changed property.</param>
+ protected void OnPropertyChanged(string propertyName)
+ {
+ OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
+ }
+
+ /// <summary>
+ /// Raises the PropertyChanged event.
+ /// </summary>
+ protected virtual void OnPropertyChanged(PropertyChangedEventArgs e)
+ {
+ if (PropertyChanged != null) {
+ PropertyChanged(this, e);
+ }
+ }
+ #endregion
+
+ #region ShowSpaces / ShowTabs / ShowEndOfLine / ShowBoxForControlCharacters
+ bool showSpaces;
+
+ /// <summary>
+ /// Gets/Sets whether to show · for spaces.
+ /// </summary>
+ /// <remarks>The default value is <c>false</c>.</remarks>
+ [DefaultValue(false)]
+ public virtual bool ShowSpaces {
+ get { return showSpaces; }
+ set {
+ if (showSpaces != value) {
+ showSpaces = value;
+ OnPropertyChanged("ShowSpaces");
+ }
+ }
+ }
+
+ bool showTabs;
+
+ /// <summary>
+ /// Gets/Sets whether to show » for tabs.
+ /// </summary>
+ /// <remarks>The default value is <c>false</c>.</remarks>
+ [DefaultValue(false)]
+ public virtual bool ShowTabs {
+ get { return showTabs; }
+ set {
+ if (showTabs != value) {
+ showTabs = value;
+ OnPropertyChanged("ShowTabs");
+ }
+ }
+ }
+
+ bool showEndOfLine;
+
+ /// <summary>
+ /// Gets/Sets whether to show ¶ at the end of lines.
+ /// </summary>
+ /// <remarks>The default value is <c>false</c>.</remarks>
+ [DefaultValue(false)]
+ public virtual bool ShowEndOfLine {
+ get { return showEndOfLine; }
+ set {
+ if (showEndOfLine != value) {
+ showEndOfLine = value;
+ OnPropertyChanged("ShowEndOfLine");
+ }
+ }
+ }
+
+ bool showBoxForControlCharacters = true;
+
+ /// <summary>
+ /// Gets/Sets whether to show a box with the hex code for control characters.
+ /// </summary>
+ /// <remarks>The default value is <c>true</c>.</remarks>
+ [DefaultValue(true)]
+ public virtual bool ShowBoxForControlCharacters {
+ get { return showBoxForControlCharacters; }
+ set {
+ if (showBoxForControlCharacters != value) {
+ showBoxForControlCharacters = value;
+ OnPropertyChanged("ShowBoxForControlCharacters");
+ }
+ }
+ }
+ #endregion
+
+ #region EnableHyperlinks
+ bool enableHyperlinks = true;
+
+ /// <summary>
+ /// Gets/Sets whether to enable clickable hyperlinks in the editor.
+ /// </summary>
+ /// <remarks>The default value is <c>true</c>.</remarks>
+ [DefaultValue(true)]
+ public virtual bool EnableHyperlinks {
+ get { return enableHyperlinks; }
+ set {
+ if (enableHyperlinks != value) {
+ enableHyperlinks = value;
+ OnPropertyChanged("EnableHyperlinks");
+ }
+ }
+ }
+
+ bool enableEmailHyperlinks = true;
+
+ /// <summary>
+ /// Gets/Sets whether to enable clickable hyperlinks for e-mail addresses in the editor.
+ /// </summary>
+ /// <remarks>The default value is <c>true</c>.</remarks>
+ [DefaultValue(true)]
+ public virtual bool EnableEmailHyperlinks {
+ get { return enableEmailHyperlinks; }
+ set {
+ if (enableEmailHyperlinks != value) {
+ enableEmailHyperlinks = value;
+ OnPropertyChanged("EnableEMailHyperlinks");
+ }
+ }
+ }
+
+ bool requireControlModifierForHyperlinkClick = true;
+
+ /// <summary>
+ /// Gets/Sets whether the user needs to press Control to click hyperlinks.
+ /// The default value is true.
+ /// </summary>
+ /// <remarks>The default value is <c>true</c>.</remarks>
+ [DefaultValue(true)]
+ public virtual bool RequireControlModifierForHyperlinkClick {
+ get { return requireControlModifierForHyperlinkClick; }
+ set {
+ if (requireControlModifierForHyperlinkClick != value) {
+ requireControlModifierForHyperlinkClick = value;
+ OnPropertyChanged("RequireControlModifierForHyperlinkClick");
+ }
+ }
+ }
+ #endregion
+
+ #region TabSize / IndentationSize / ConvertTabsToSpaces / GetIndentationString
+ // I'm using '_' prefixes for the fields here to avoid confusion with the local variables
+ // in the methods below.
+ // The fields should be accessed only by their property - the fields might not be used
+ // if someone overrides the property.
+
+ int _indentationSize = 4;
+
+ /// <summary>
+ /// Gets/Sets the width of one indentation unit.
+ /// </summary>
+ /// <remarks>The default value is 4.</remarks>
+ [DefaultValue(4)]
+ public virtual int IndentationSize {
+ get { return _indentationSize; }
+ set {
+ if (value < 1)
+ throw new ArgumentOutOfRangeException("value", value, "value must be positive");
+ // sanity check; a too large value might cause WPF to crash internally much later
+ // (it only crashed in the hundred thousands for me; but might crash earlier with larger fonts)
+ if (value > 1000)
+ throw new ArgumentOutOfRangeException("value", value, "indentation size is too large");
+ if (_indentationSize != value) {
+ _indentationSize = value;
+ OnPropertyChanged("IndentationSize");
+ OnPropertyChanged("IndentationString");
+ }
+ }
+ }
+
+ bool _convertTabsToSpaces;
+
+ /// <summary>
+ /// Gets/Sets whether to use spaces for indentation instead of tabs.
+ /// </summary>
+ /// <remarks>The default value is <c>false</c>.</remarks>
+ [DefaultValue(false)]
+ public virtual bool ConvertTabsToSpaces {
+ get { return _convertTabsToSpaces; }
+ set {
+ if (_convertTabsToSpaces != value) {
+ _convertTabsToSpaces = value;
+ OnPropertyChanged("ConvertTabsToSpaces");
+ OnPropertyChanged("IndentationString");
+ }
+ }
+ }
+
+ /// <summary>
+ /// Gets the text used for indentation.
+ /// </summary>
+ [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1721:PropertyNamesShouldNotMatchGetMethods")]
+ [Browsable(false)]
+ public string IndentationString {
+ get { return GetIndentationString(1); }
+ }
+
+ /// <summary>
+ /// Gets text required to indent from the specified <paramref name="column"/> to the next indentation level.
+ /// </summary>
+ public virtual string GetIndentationString(int column)
+ {
+ if (column < 1)
+ throw new ArgumentOutOfRangeException("column", column, "Value must be at least 1.");
+ int indentationSize = this.IndentationSize;
+ if (ConvertTabsToSpaces) {
+ return new string(' ', indentationSize - ((column - 1) % indentationSize));
+ } else {
+ return "\t";
+ }
+ }
+ #endregion
+
+ bool cutCopyWholeLine = true;
+
+ /// <summary>
+ /// Gets/Sets whether copying without a selection copies the whole current line.
+ /// </summary>
+ [DefaultValue(true)]
+ public virtual bool CutCopyWholeLine {
+ get { return cutCopyWholeLine; }
+ set {
+ if (cutCopyWholeLine != value) {
+ cutCopyWholeLine = value;
+ OnPropertyChanged("CutCopyWholeLine");
+ }
+ }
+ }
+
+ bool allowScrollBelowDocument;
+
+ /// <summary>
+ /// Gets/Sets whether the user can scroll below the bottom of the document.
+ /// The default value is false; but it a good idea to set this property to true when using folding.
+ /// </summary>
+ [DefaultValue(false)]
+ public virtual bool AllowScrollBelowDocument {
+ get { return allowScrollBelowDocument; }
+ set {
+ if (allowScrollBelowDocument != value) {
+ allowScrollBelowDocument = value;
+ OnPropertyChanged("AllowScrollBelowDocument");
+ }
+ }
+ }
+
+ double wordWrapIndentation = 0;
+
+ /// <summary>
+ /// Gets/Sets the indentation used for all lines except the first when word-wrapping.
+ /// The default value is 0.
+ /// </summary>
+ [DefaultValue(0.0)]
+ public virtual double WordWrapIndentation {
+ get { return wordWrapIndentation; }
+ set {
+ if (double.IsNaN(value) || double.IsInfinity(value))
+ throw new ArgumentOutOfRangeException("value", value, "value must not be NaN/infinity");
+ if (value != wordWrapIndentation) {
+ wordWrapIndentation = value;
+ OnPropertyChanged("WordWrapIndentation");
+ }
+ }
+ }
+
+ bool inheritWordWrapIndentation = true;
+
+ /// <summary>
+ /// Gets/Sets whether the indentation is inherited from the first line when word-wrapping.
+ /// The default value is true.
+ /// </summary>
+ /// <remarks>When combined with <see cref="WordWrapIndentation"/>, the inherited indentation is added to the word wrap indentation.</remarks>
+ [DefaultValue(true)]
+ public virtual bool InheritWordWrapIndentation {
+ get { return inheritWordWrapIndentation; }
+ set {
+ if (value != inheritWordWrapIndentation) {
+ inheritWordWrapIndentation = value;
+ OnPropertyChanged("InheritWordWrapIndentation");
+ }
+ }
+ }
+
+ bool enableRectangularSelection = true;
+
+ /// <summary>
+ /// Enables rectangular selection (press ALT and select a rectangle)
+ /// </summary>
+ [DefaultValue(true)]
+ public bool EnableRectangularSelection {
+ get { return enableRectangularSelection; }
+ set {
+ if (enableRectangularSelection != value) {
+ enableRectangularSelection = value;
+ OnPropertyChanged("EnableRectangularSelection");
+ }
+ }
+ }
+
+ bool enableTextDragDrop = true;
+
+ /// <summary>
+ /// Enable dragging text within the text area.
+ /// </summary>
+ [DefaultValue(true)]
+ public bool EnableTextDragDrop {
+ get { return enableTextDragDrop; }
+ set {
+ if (enableTextDragDrop != value) {
+ enableTextDragDrop = value;
+ OnPropertyChanged("EnableTextDragDrop");
+ }
+ }
+ }
+
+ bool enableVirtualSpace;
+
+ /// <summary>
+ /// Gets/Sets whether the user can set the caret behind the line ending
+ /// (into "virtual space").
+ /// Note that virtual space is always used (independent from this setting)
+ /// when doing rectangle selections.
+ /// </summary>
+ [DefaultValue(false)]
+ public virtual bool EnableVirtualSpace {
+ get { return enableVirtualSpace; }
+ set {
+ if (enableVirtualSpace != value) {
+ enableVirtualSpace = value;
+ OnPropertyChanged("EnableVirtualSpace");
+ }
+ }
+ }
+
+ bool enableImeSupport = true;
+
+ /// <summary>
+ /// Gets/Sets whether the support for Input Method Editors (IME)
+ /// for non-alphanumeric scripts (Chinese, Japanese, Korean, ...) is enabled.
+ /// </summary>
+ [DefaultValue(true)]
+ public virtual bool EnableImeSupport {
+ get { return enableImeSupport; }
+ set {
+ if (enableImeSupport != value) {
+ enableImeSupport = value;
+ OnPropertyChanged("EnableImeSupport");
+ }
+ }
+ }
+
+ bool showColumnRuler = false;
+
+ /// <summary>
+ /// Gets/Sets whether the column ruler should be shown.
+ /// </summary>
+ [DefaultValue(false)]
+ public virtual bool ShowColumnRuler {
+ get { return showColumnRuler; }
+ set {
+ if (showColumnRuler != value) {
+ showColumnRuler = value;
+ OnPropertyChanged("ShowColumnRuler");
+ }
+ }
+ }
+
+ int columnRulerPosition = 80;
+
+ /// <summary>
+ /// Gets/Sets where the column ruler should be shown.
+ /// </summary>
+ [DefaultValue(80)]
+ public virtual int ColumnRulerPosition {
+ get { return columnRulerPosition; }
+ set {
+ if (columnRulerPosition != value) {
+ columnRulerPosition = value;
+ OnPropertyChanged("ColumnRulerPosition");
+ }
+ }
+ }
+ }
+}