Match match;
StringBuffer buffer;
LineToIndexTable _LayoutLines;
- bool _EnableFireUpdateEvent = true;
+ bool _EnableFireUpdateEvent = true,_UrlMark = false, _DrawLineNumber = false;
SemaphoreSlim Semaphore = new SemaphoreSlim(MaxSemaphoreCount);
+ LineBreakMethod _LineBreak;
+ int _TabStops, _LineBreakCharCount = 80;
+
+ /// <summary>
+ /// 一行当たりの最大文字数
+ /// </summary>
+ public const int MaximumLineLength = 1000;
/// <summary>
/// コンストラクター
this.Markers = new MarkerCollection(this);
this.UndoManager = new UndoManager();
this._LayoutLines = new LineToIndexTable(this);
- this._LayoutLines.SpilitString = LayoutLines_SpilitStringByChar;
+ this._LayoutLines.SpilitString = (s,e)=> {
+ return this.CreateLineList(e.index, e.length, MaximumLineLength);
+ };
this._LayoutLines.Clear();
+ this.MarkerPatternSet = new MarkerPatternSet(this._LayoutLines, this.Markers);
+ this.MarkerPatternSet.Updated += WacthDogPattern_Updated;
+ this.LineBreakChanged += (s, e) => { };
+ this.TabStopsChanged += (s, e) => { };
+ this.DrawLineNumberChanged += (s, e) => { };
+ }
+
+ void WacthDogPattern_Updated(object sender, EventArgs e)
+ {
+ this._LayoutLines.ClearLayoutCache();
}
/// <summary>
- /// レイアウト行を表す
+ /// DrawLineNumberの値が変わったときに通知される
/// </summary>
- public LineToIndexTable LayoutLines
+ public event EventHandler DrawLineNumberChanged;
+
+ /// <summary>
+ /// 行番号を表示するかどうか
+ /// </summary>
+ public bool DrawLineNumber
+ {
+ get { return this._DrawLineNumber; }
+ set
+ {
+ this._DrawLineNumber = value;
+ this._LayoutLines.ClearLayoutCache();
+ this.DrawLineNumberChanged(this, null);
+ }
+ }
+
+ /// <summary>
+ /// URLをハイパーリンクとして表示するなら真。そうでないなら偽
+ /// </summary>
+ public bool UrlMark
+ {
+ get { return this._UrlMark; }
+ set
+ {
+ this._UrlMark = value;
+ if (value)
+ {
+ Regex regex = new Regex("(http|https|ftp)(:\\/\\/[-_.!~*\\'()a-zA-Z0-9;\\/?:\\@&=+\\$,%#]+)");
+ this.MarkerPatternSet.Add(MarkerIDs.URL, new RegexMarkerPattern(regex, HilightType.Url, new Color()));
+ }
+ else
+ {
+ this.MarkerPatternSet.Remove(MarkerIDs.URL);
+ }
+ }
+ }
+
+ /// <summary>
+ /// LineBreakが変更されたときに通知される
+ /// </summary>
+ public EventHandler LineBreakChanged;
+
+ /// <summary>
+ /// 桁折り処理の方法を指定する
+ /// </summary>
+ /// <remarks>
+ /// 変更した場合、呼び出し側で再描写とレイアウトの再構築を行う必要があります
+ /// </remarks>
+ public LineBreakMethod LineBreak
{
get
{
- return this._LayoutLines;
+ return this._LineBreak;
+ }
+ set
+ {
+ this._LineBreak = value;
+ this.LineBreakChanged(this, null);
}
}
- IList<LineToIndexTableData> LayoutLines_SpilitStringByChar(object sender, SpilitStringEventArgs e)
+ /// <summary>
+ /// 折り返し行う文字数。実際に折り返しが行われる幅はem単位×この値となります
+ /// </summary>
+ /// <remarks>この値を変えた場合、LineBreakChangedイベントが発生します</remarks>
+ public int LineBreakCharCount
{
- return this.CreateLineList(e.index, e.length);
+ get
+ {
+ return this._LineBreakCharCount;
+ }
+ set
+ {
+ this._LineBreakCharCount = value;
+ this.LineBreakChanged(this, null);
+ }
+ }
+
+ /// <summary>
+ /// TabStopsの値が変わったことを通知する
+ /// </summary>
+ public event EventHandler TabStopsChanged;
+
+ /// <summary>
+ /// タブの幅
+ /// </summary>
+ /// <remarks>変更した場合、呼び出し側で再描写する必要があります</remarks>
+ public int TabStops
+ {
+ get { return this._TabStops; }
+ set {
+ this._TabStops = value;
+ this.TabStopsChanged(this, null);
+ }
+ }
+
+ /// <summary>
+ /// マーカーパターンセット
+ /// </summary>
+ public MarkerPatternSet MarkerPatternSet
+ {
+ get;
+ private set;
+ }
+
+ /// <summary>
+ /// レイアウト行を表す
+ /// </summary>
+ public LineToIndexTable LayoutLines
+ {
+ get
+ {
+ return this._LayoutLines;
+ }
}
/// <summary>