public bool marge(ICommand a) { ReplaceCommand cmd = a as ReplaceCommand; if (cmd == null) { return(false); } if (this.ReplacedRange.Length == 0 && cmd.ReplacementRange.Index >= this.ReplacementRange.Index && cmd.ReplacementRange.Index + cmd.ReplacementRange.Length <= this.ReplacementRange.Index + this.ReplacementRange.Length) { int bufferIndex = cmd.ReplacedRange.Index - this.ReplacementRange.Index; if (bufferIndex < this.replacement.Count) { this.replacement.RemoveRange(bufferIndex, cmd.ReplacedRange.Length); } this.replacement.InsertRange(bufferIndex, cmd.replacement); return(true); } if (this.ReplacedRange.Index + this.ReplacementRange.Length == cmd.ReplacedRange.Index && this.ReplacedRange.Index == this.ReplacementRange.Index) { this.replaced.AddRange(cmd.replaced); this.replacement.AddRange(cmd.replacement); this.ReplacedRange.Length += cmd.ReplacedRange.Length; this.ReplacementRange.Length += cmd.ReplacementRange.Length; return(true); } return(false); }
/// <summary> /// ドキュメントを置き換える /// </summary> /// <param name="index">開始インデックス</param> /// <param name="length">長さ</param> /// <param name="s">文字列</param> /// <param name="UserInput">ユーザーからの入力として扱うなら真</param> /// <remarks>読み出し操作中はこのメソッドを実行することはできません</remarks> public void Replace(int index, int length, string s, bool UserInput = false) { if (index < 0 || index > this.buffer.Length || index + length > this.buffer.Length || length < 0) { throw new ArgumentOutOfRangeException(); } if (length == 0 && (s == string.Empty || s == null)) { return; } foreach (int id in this.Markers.IDs) { this.RemoveMarker(id, index, length); } ReplaceCommand cmd = new ReplaceCommand(this.buffer, index, length, s); this.UndoManager.push(cmd); cmd.redo(); if (this.FireUpdateEvent && UserInput) { var input_str = string.Empty; if (s == Document.NewLine.ToString()) { input_str = s; } else if (s == string.Empty && length > 0) { input_str = "\b"; } //入力は終わっているので空文字を渡すが処理の都合で一部文字だけはそのまま渡す if (this.AutoComplete != null) { this.AutoComplete.ParseInput(input_str); } if (s == Document.NewLine.ToString()) { this.AutoIndentHook(this, null); } } }