OSDN Git Service

MVVM対応の準備のためにLineBreak,TabStops,DrawLineNumber,LineBreakCharCount,MarkerPatternSetをDo...
[fooeditengine/FooEditEngine.git] / Core / Document.cs
index 8052b42..c1c98e2 100644 (file)
@@ -138,8 +138,15 @@ namespace FooEditEngine
         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>
         /// コンストラクター
@@ -162,24 +169,139 @@ namespace FooEditEngine
             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>