/* * Copyright (C) 2013 FooProject * * This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at your option) any later version. * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ using System; using System.Text; using System.Text.RegularExpressions; using Slusser.Collections.Generic; namespace FooEditEngine { sealed class ReplaceCommand : ICommand { StringBuffer Buffer; TextRange ReplacementRange, ReplacedRange; GapBuffer replacement, replaced; //置き換え後の文字列、置き換え前の文字列 public ReplaceCommand(StringBuffer buf, int start, int length, string str) { this.Buffer = buf; this.ReplacementRange = new TextRange(start,str.Length); this.replacement = new GapBuffer(); this.replacement.AddRange(Util.GetEnumrator(str),str.Length); this.ReplacedRange = new TextRange(start,length); this.replaced = new GapBuffer(); this.replaced.AddRange(this.Buffer.GetEnumerator(start, length)); } #region ICommand メンバー public void undo() { this.Buffer.Replace(this.ReplacementRange.Index, this.replacement.Count,this.replaced,this.replaced.Count); } public void redo() { this.Buffer.Replace(this.ReplacedRange.Index, this.replaced.Count, this.replacement, this.replacement.Count); } 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, cmd.replacement.Count); return true; } if (this.ReplacedRange.Index + this.ReplacementRange.Length == cmd.ReplacedRange.Index && this.ReplacedRange.Index == this.ReplacementRange.Index) { this.replaced.AddRange(cmd.replaced,cmd.replaced.Count); this.replacement.AddRange(cmd.replacement,cmd.replacement.Count); this.ReplacedRange.Length += cmd.ReplacedRange.Length; this.ReplacementRange.Length += cmd.ReplacementRange.Length; return true; } return false; } public bool isempty() { return this.replaced.Count == 0 && this.replacement.Count == 0; } #endregion } sealed class ReplaceAllCommand : ICommand { StringBuffer buffer; Regex regex; StringBuffer oldBuffer; string replacePattern; bool groupReplace; LineToIndexTable layoutLines; public ReplaceAllCommand(StringBuffer buffer, LineToIndexTable layoutlines, Regex regex, string replacePattern,bool groupReplace) { this.buffer = buffer; this.regex = regex; this.replacePattern = replacePattern; this.groupReplace = groupReplace; this.layoutLines = layoutlines; } public void undo() { this.buffer.Replace(this.oldBuffer); } public void redo() { this.oldBuffer = new StringBuffer(this.buffer); this.buffer.ReplaceRegexAll(this.layoutLines, this.regex, this.replacePattern, this.groupReplace); } public bool marge(ICommand a) { return false; } public bool isempty() { return false; } } sealed class FastReplaceAllCommand : ICommand { StringBuffer buffer; StringBuffer oldBuffer; string targetPattern; string replacePattern; bool caseInsensitve; LineToIndexTable layoutLines; public FastReplaceAllCommand(StringBuffer buffer,LineToIndexTable layoutlines,string targetPattern, string replacePattern,bool ci) { this.buffer = buffer; this.replacePattern = replacePattern; this.targetPattern = targetPattern; this.caseInsensitve = ci; this.layoutLines = layoutlines; } public void undo() { this.buffer.Replace(this.oldBuffer); } public void redo() { this.oldBuffer = new StringBuffer(this.buffer); this.buffer.ReplaceAll(this.layoutLines, this.targetPattern, this.replacePattern,this.caseInsensitve); } public bool marge(ICommand a) { return false; } public bool isempty() { return false; } } }