159 lines
3.9 KiB
C#
159 lines
3.9 KiB
C#
// 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.Globalization;
|
|
using ICSharpCode.AvalonEdit.Document;
|
|
|
|
namespace ICSharpCode.AvalonEdit
|
|
{
|
|
/// <summary>
|
|
/// Represents a text location with a visual column.
|
|
/// </summary>
|
|
public struct TextViewPosition : IEquatable<TextViewPosition>
|
|
{
|
|
int line, column, visualColumn;
|
|
|
|
/// <summary>
|
|
/// Gets/Sets Location.
|
|
/// </summary>
|
|
public TextLocation Location {
|
|
get {
|
|
return new TextLocation(line, column);
|
|
}
|
|
set {
|
|
line = value.Line;
|
|
column = value.Column;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets/Sets the line number.
|
|
/// </summary>
|
|
public int Line {
|
|
get { return line; }
|
|
set { line = value; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets/Sets the (text) column number.
|
|
/// </summary>
|
|
public int Column {
|
|
get { return column; }
|
|
set { column = value; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets/Sets the visual column number.
|
|
/// Can be -1 (meaning unknown visual column).
|
|
/// </summary>
|
|
public int VisualColumn {
|
|
get { return visualColumn; }
|
|
set { visualColumn = value; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// Creates a new TextViewPosition instance.
|
|
/// </summary>
|
|
public TextViewPosition(int line, int column, int visualColumn)
|
|
{
|
|
this.line = line;
|
|
this.column = column;
|
|
this.visualColumn = visualColumn;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Creates a new TextViewPosition instance.
|
|
/// </summary>
|
|
public TextViewPosition(int line, int column)
|
|
: this(line, column, -1)
|
|
{
|
|
}
|
|
|
|
/// <summary>
|
|
/// Creates a new TextViewPosition instance.
|
|
/// </summary>
|
|
public TextViewPosition(TextLocation location, int visualColumn)
|
|
{
|
|
this.line = location.Line;
|
|
this.column = location.Column;
|
|
this.visualColumn = visualColumn;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Creates a new TextViewPosition instance.
|
|
/// </summary>
|
|
public TextViewPosition(TextLocation location)
|
|
: this(location, -1)
|
|
{
|
|
}
|
|
|
|
/// <inheritdoc/>
|
|
public override string ToString()
|
|
{
|
|
return string.Format(CultureInfo.InvariantCulture,
|
|
"[TextViewPosition Line={0} Column={1} VisualColumn={2}]",
|
|
this.line, this.column, this.visualColumn);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Implicit conversion to <see cref="TextLocation"/>.
|
|
/// </summary>
|
|
[Obsolete("Use the Location property instead of the implicit conversion to TextLocation")]
|
|
public static implicit operator TextLocation(TextViewPosition position)
|
|
{
|
|
return new TextLocation(position.Line, position.Column);
|
|
}
|
|
|
|
#region Equals and GetHashCode implementation
|
|
// The code in this region is useful if you want to use this structure in collections.
|
|
// If you don't need it, you can just remove the region and the ": IEquatable<Struct1>" declaration.
|
|
|
|
/// <inheritdoc/>
|
|
public override bool Equals(object obj)
|
|
{
|
|
if (obj is TextViewPosition)
|
|
return Equals((TextViewPosition)obj); // use Equals method below
|
|
else
|
|
return false;
|
|
}
|
|
|
|
/// <inheritdoc/>
|
|
public override int GetHashCode()
|
|
{
|
|
int hashCode = 0;
|
|
unchecked {
|
|
hashCode += 1000000007 * Line.GetHashCode();
|
|
hashCode += 1000000009 * Column.GetHashCode();
|
|
hashCode += 1000000021 * VisualColumn.GetHashCode();
|
|
}
|
|
return hashCode;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Equality test.
|
|
/// </summary>
|
|
public bool Equals(TextViewPosition other)
|
|
{
|
|
return this.Line == other.Line && this.Column == other.Column && this.VisualColumn == other.VisualColumn;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Equality test.
|
|
/// </summary>
|
|
public static bool operator ==(TextViewPosition left, TextViewPosition right)
|
|
{
|
|
return left.Equals(right);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Inequality test.
|
|
/// </summary>
|
|
public static bool operator !=(TextViewPosition left, TextViewPosition right)
|
|
{
|
|
return !(left.Equals(right)); // use operator == and negate result
|
|
}
|
|
#endregion
|
|
}
|
|
}
|