/// ドキュメント全体が削除されたことを表す
/// </summary>
Clear,
+ /// <summary>
+ /// レイアウトが再構築されたことを表す
+ /// </summary>
+ RebuildLayout,
}
/// <summary>
/// </summary>
public void PerformLayout()
{
- //単に再構築するだけなので行ダーティフラグは更新してはいけない
this.LayoutLines.IsFrozneDirtyFlag = true;
- this.FireUpdate(new DocumentUpdateEventArgs(UpdateType.Clear, -1, -1, -1));
- this.FireUpdate(new DocumentUpdateEventArgs(UpdateType.Replace, 0, 0, this.Length));
+ this.FireUpdate(new DocumentUpdateEventArgs(UpdateType.RebuildLayout, -1, -1, -1));
this.LayoutLines.IsFrozneDirtyFlag = false;
if (this.PerformLayouted != null)
this.PerformLayouted(this, null);
}
/// <summary>
- /// ã\82»ã\83\91ã\83¬ã\83¼ã\82¿ã\83¼ã\81§å\9b²ã\81¾ã\82\8cã\81\9fç¯\84å\9b²å\86\85ã\82\92é\81¸æ\8a\9eする
+ /// ã\82»ã\83\91ã\83¬ã\83¼ã\82¿ã\83¼ã\81§å\8cºå\88\87ã\82\89ã\82\8cã\81\9fé \98å\9f\9fã\82\92å\8f\96å¾\97する
/// </summary>
/// <param name="index">探索を開始するインデックス</param>
/// <param name="find_sep_func">セパレーターなら真を返し、そうでないなら偽を返す</param>
- /// <param name="changeAnchor">選択の起点となるとインデックスを変更するなら真。そうでなければ偽</param>
- public void SelectSepartor(int index,Func<char,bool> find_sep_func, bool changeAnchor = false)
+ /// <returns>開始インデックス、終了インデックス</returns>
+ public Tuple<int,int> GetSepartor(int index, Func<char, bool> find_sep_func)
{
- if (this.FireUpdateEvent == false)
- throw new InvalidOperationException("");
-
if (find_sep_func == null)
throw new ArgumentNullException("find_sep_func must not be null");
if (this.Length <= 0 || index >= this.Length)
- return;
+ return null;
Document str = this;
start--;
if (find_sep_func(str[start]))
+ {
start++;
+ }
int end = index;
while (end < this.Length && !find_sep_func(str[end]))
end++;
+ return new Tuple<int, int>(start, end);
+ }
+
+ /// <summary>
+ /// セパレーターで囲まれた範囲内を選択する
+ /// </summary>
+ /// <param name="index">探索を開始するインデックス</param>
+ /// <param name="find_sep_func">セパレーターなら真を返し、そうでないなら偽を返す</param>
+ /// <param name="changeAnchor">選択の起点となるとインデックスを変更するなら真。そうでなければ偽</param>
+ public void SelectSepartor(int index,Func<char,bool> find_sep_func, bool changeAnchor = false)
+ {
+ if (this.FireUpdateEvent == false)
+ throw new InvalidOperationException("");
+
+ if (find_sep_func == null)
+ throw new ArgumentNullException("find_sep_func must not be null");
+
+ var t = this.GetSepartor(index, find_sep_func);
+ if (t == null)
+ return;
+
+ int start = t.Item1, end = t.Item2;
+
this.Select(start, end - start);
if (changeAnchor)
try
{
this.Clear();
- this.LayoutLines.IsFrozneDirtyFlag = true;
await this.buffer.LoadAsync(fs, tokenSource);
}
finally
{
- this.Dirty = false; //ファイルの内容とドキュメントの中身は同じなのでダーティフラグは偽にする
this.PerformLayout();
- //これ以降の操作にだけダーティフラグを適用しないとおかしなことになる
- this.LayoutLines.IsFrozneDirtyFlag = false;
if (this.LoadProgress != null)
this.LoadProgress(this, new ProgressEventArgs(ProgressState.Complete));
}
/// <param name="fs">IStreamWriterオブジェクト</param>
/// <param name="tokenSource">キャンセルトークン</param>
/// <returns>Taskオブジェクト</returns>
- /// <remarks>非同期操作中はこのメソッドを実行することはできません。同時にダーティフラグもクリアされます</remarks>
+ /// <remarks>非同期操作中はこのメソッドを実行することはできません</remarks>
public async Task SaveAsync(TextWriter fs, CancellationTokenSource tokenSource = null)
{
await this.buffer.SaveAsync(fs, tokenSource);
- this.Dirty = false;
}
/// <summary>
{
switch (e.type)
{
+ case UpdateType.RebuildLayout:
+ this._LayoutLines.Clear();
+ this._LayoutLines.UpdateAsReplace(0, 0, this.Length);
+ break;
case UpdateType.Replace:
if (e.row == null)
{
this._LayoutLines.UpdateLineAsReplace(e.row.Value, e.removeLength, e.insertLength);
this.Markers.UpdateMarkers(this.LayoutLines.GetIndexFromLineNumber(e.row.Value), e.insertLength, e.removeLength);
}
+ this.Dirty = true;
break;
case UpdateType.Clear:
this._LayoutLines.Clear();
+ this.Dirty = true;
break;
}
- this.Dirty = true;
if(this.FireUpdateEvent)
this.Update(this, e);
}