OSDN Git Service

MVVM対応の準備のためにLineBreak,TabStops,DrawLineNumber,LineBreakCharCount,MarkerPatternSetをDo...
authorgdkhd812 <test@nnn.co.jp>
Sun, 25 Oct 2015 10:27:57 +0000 (15:57 +0530)
committergdkhd812 <test@nnn.co.jp>
Sun, 25 Oct 2015 10:27:57 +0000 (15:57 +0530)
Core/Document.cs
Core/ViewBase.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>
index 41a029e..1c2fdf8 100644 (file)
@@ -82,9 +82,6 @@ namespace FooEditEngine
         protected Rectangle _Rect;
         protected double _LongestWidth;
         Padding _Padding;
-        bool _DrawLineNumber,_UrlMark;
-        LineBreakMethod _LineBreak;
-        int _LineBreakCharCount = 80;
 
         public ViewBase(Document doc, ITextRender r,Padding padding)
         {
@@ -98,8 +95,21 @@ namespace FooEditEngine
             this.SrcChanged += new EventHandler((s, e) => { });
             this.PerformLayouted += new EventHandler((s, e) => { });
             this.PageBoundChanged += new EventHandler((s, e) => { });
-            this.MarkerPatternSet = new MarkerPatternSet(this._LayoutLines, doc.Markers);
-            this.MarkerPatternSet.Updated += WacthDogPattern_Updated;
+            this.Document.LineBreakChanged += (s, e) =>
+            {
+                if (this.Document.LineBreak != LineBreakMethod.None)
+                    this._LayoutLines.SpilitString = new SpilitStringEventHandler(LayoutLines_SpilitStringByPixelbase);
+                else
+                    this._LayoutLines.SpilitString = new SpilitStringEventHandler(LayoutLines_SpilitStringByChar);
+            };
+            this.Document.TabStopsChanged += (s, e) =>
+            {
+                this.render.TabWidthChar = this.Document.TabStops;
+            };
+            this.Document.DrawLineNumberChanged += (s, e) =>
+            {
+                CalculateClipRect();
+            };
         }
 
         protected LineToIndexTable _LayoutLines
@@ -121,8 +131,7 @@ namespace FooEditEngine
         /// </summary>
         public MarkerPatternSet MarkerPatternSet
         {
-            get;
-            private set;
+            get { return this.Document.MarkerPatternSet; }
         }
 
         /// <summary>
@@ -130,19 +139,10 @@ namespace FooEditEngine
         /// </summary>
         public bool UrlMark
         {
-            get { return this._UrlMark; }
+            get { return this.Document.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);
-                }
+                this.Document.UrlMark = value;
             }
         }
 
@@ -199,15 +199,11 @@ namespace FooEditEngine
         {
             get
             {
-                return this._LineBreak;
+                return this.Document.LineBreak;
             }
             set
             {
-                this._LineBreak = value;
-                if (value != LineBreakMethod.None)
-                    this._LayoutLines.SpilitString = new SpilitStringEventHandler(LayoutLines_SpilitStringByPixelbase);
-                else
-                    this._LayoutLines.SpilitString = new SpilitStringEventHandler(LayoutLines_SpilitStringByChar);
+                this.Document.LineBreak = value;
             }
         }
 
@@ -218,11 +214,11 @@ namespace FooEditEngine
         {
             get
             {
-                return this._LineBreakCharCount;
+                return this.Document.LineBreakCharCount;
             }
             set
             {
-                this._LineBreakCharCount = value;
+                this.Document.LineBreakCharCount = value;
             }
         }
 
@@ -249,8 +245,8 @@ namespace FooEditEngine
         /// <remarks>変更した場合、呼び出し側で再描写する必要があります</remarks>
         public int TabStops
         {
-            get { return this.render.TabWidthChar; }
-            set { this.render.TabWidthChar = value; }
+            get { return this.Document.TabStops; }
+            set { this.Document.TabStops = value; }
         }
 
         /// <summary>
@@ -315,12 +311,10 @@ namespace FooEditEngine
         /// </summary>
         public bool DrawLineNumber
         {
-            get { return this._DrawLineNumber; }
+            get { return this.Document.DrawLineNumber; }
             set
             {
-                this._DrawLineNumber = value;
-                this._LayoutLines.ClearLayoutCache();
-                CalculateClipRect();
+                this.Document.DrawLineNumber = value;
             }
         }
 
@@ -386,11 +380,6 @@ namespace FooEditEngine
                 this.PageBoundChanged(this, e);
         }
 
-        void WacthDogPattern_Updated(object sender, EventArgs e)
-        {
-            this._LayoutLines.ClearLayoutCache();
-        }
-
         void render_ChangedRightToLeft(object sender, EventArgs e)
         {
             this._Src.X = 0;
@@ -421,12 +410,12 @@ namespace FooEditEngine
         IList<LineToIndexTableData> LayoutLines_SpilitStringByPixelbase(object sender, SpilitStringEventArgs e)
         {
             double WrapWidth;
-            if (_LineBreak == LineBreakMethod.PageBound)
+            if (this.LineBreak == LineBreakMethod.PageBound)
                 WrapWidth = this.render.TextArea.Width - LineBreakingMarginWidth;  //余白を残さないと欠ける
             else
-                WrapWidth = this.render.emSize.Width * this._LineBreakCharCount;
+                WrapWidth = this.render.emSize.Width * this.LineBreakCharCount;
 
-            if (WrapWidth < 0 && this._LineBreak != LineBreakMethod.None)
+            if (WrapWidth < 0 && this.LineBreak != LineBreakMethod.None)
                 throw new InvalidOperationException();
 
             int startIndex = e.index;
@@ -439,7 +428,7 @@ namespace FooEditEngine
 
         IList<LineToIndexTableData> LayoutLines_SpilitStringByChar(object sender, SpilitStringEventArgs e)
         {
-            return this.Document.CreateLineList(e.index, e.length,1000);
+            return this.Document.CreateLineList(e.index, e.length, Document.MaximumLineLength);
         }
     }
 }