using System; using System.Collections.Generic; using System.Text; namespace FooEditEngine { class SyntaxHilightGenerator : ILineInfoGenerator { const long AllowCallTicks = 1000 * 10000; //see.DateTime.Ticks プロパティ long lastUpdateTicks = DateTime.Now.Ticks; bool _IsSync = true; /// /// シンタックスハイライター /// internal IHilighter Hilighter { get; set; } public void Clear(LineToIndexTable lti) { for (int i = 0; i < lti.Count; i++) lti.GetRaw(i).Syntax = null; lti.ClearLayoutCache(); this._IsSync = false; } public bool Generate(Document doc, LineToIndexTable lti, bool force = true) { if (this.Hilighter == null) return false; long nowTick = DateTime.Now.Ticks; bool sync = force || !this._IsSync; if (sync || Math.Abs(nowTick - this.lastUpdateTicks) >= AllowCallTicks) { for (int i = 0; i < lti.Count; i++) this.HilightLine(lti, i); this.Hilighter.Reset(); lti.ClearLayoutCache(); this.lastUpdateTicks = nowTick; this._IsSync = true; return true; } return false; } private void HilightLine(LineToIndexTable lti, int row) { //シンタックスハイライトを行う List syntax = new List(); string str = lti[row]; int level = this.Hilighter.DoHilight(str, str.Length, (s) => { if (s.type == TokenType.None || s.type == TokenType.Control) return; if (str[s.index + s.length - 1] == Document.NewLine) s.length--; syntax.Add(new SyntaxInfo(s.index, s.length, s.type)); }); LineToIndexTableData lineData = lti.GetRaw(row); lineData.Syntax = syntax.ToArray(); } public void Update(Document doc, int startIndex, int insertLength, int removeLength) { } } }