using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Tango.BL.Entities;
using Tango.DragAndDrop;
using Tango.MachineStudio.MachineDesigner.ViewModels;
namespace Tango.MachineStudio.MachineDesigner.Views
{
/// <summary>
/// Interaction logic for MainView.xaml
/// </summary>
public pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #333333 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #666666 } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008800 } /* Keyword.Pseudo */
.highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */
.highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
.highlight .na { color: #336699 } /* Name.Attribute */
.highlight .nb { color: #003388 } /* Name.Builtin */
.highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */
.highlight .no { color: #003366; font-weight: bold } /* Name.Constant */
.highlight .nd { color: #555555 } /* Name.Decorator */
.highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */
.highlight .nl { color: #336699; font-style: italic } /* Name.Label */
.highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */
.highlight .py { color: #336699; font-weight: bold } /* Name.Property */
.highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #336699 } /* Name.Variable */
.highlight .ow { color: #008800 } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */
.highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */
.highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
.highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */
.highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
.highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */
.highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */
.highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */
.highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */
.highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */
.highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */
.highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */
.highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */
.highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */
.highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */
.highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */
.highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */
.highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */
.highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */
.highlight .vc { color: #336699 } /* Name.Variable.Class */
.highlight .vg { color: #dd7700 } /* Name.Variable.Global */
.highlight .vi { color: #3333bb } /* Name.Variable.Instance */
.highlight .vm { color: #336699 } /* Name.Variable.Magic */
.highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */// 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");
}
}
}
}
}