From d1792391e09d1eac8b02a05ca7de8dea8f43c4d3 Mon Sep 17 00:00:00 2001 From: martin Date: Thu, 2 Dec 2010 23:39:48 +0000 Subject: [PATCH] SynEdit: Fix updating (book-)mark position on edit, after other shared editor was closed. incl Testcase git-svn-id: trunk@28601 - --- components/synedit/synedit.pp | 5 +- .../synedit/test/testsynsharededits.pas | 151 ++++++++++++++++++ 2 files changed, 153 insertions(+), 3 deletions(-) diff --git a/components/synedit/synedit.pp b/components/synedit/synedit.pp index 52a39d2083..6d0e347f96 100644 --- a/components/synedit/synedit.pp +++ b/components/synedit/synedit.pp @@ -1994,7 +1994,7 @@ begin FreeAndNil(FPaintLineColor2); FreeAndNil(fTextDrawer); FreeAndNil(fFontDummy); - DestroyMarkList; + DestroyMarkList; // before detach from FLines FreeAndNil(FWordBreaker); FreeAndNil(FFoldedLinesView); // has reference to caret FreeAndNil(FInternalBlockSelection); @@ -5422,7 +5422,7 @@ begin if IsMarkListShared then begin s := TSynEditStringList(FLines).AttachedSynEdits[0]; if s = Self then - s := TSynEditStringList(FLines).AttachedSynEdits[1]; + s := TSynEditStringList(FLines).AttachedSynEdits[1]; // TODO: find one that shares the MarkList (if someday partial sharing of Marks is avail) if TSynEditMarkListInternal(FMarkList).LinesView = FTheLinesView then TSynEditMarkListInternal(FMarkList).LinesView := TSynEdit(s).FTheLinesView; @@ -5473,7 +5473,6 @@ begin LView := TSynEditStringsLinked(LView).NextLines; end; TSynEditStringList(ALines).RemoveHanlders(FFoldedLinesView); - TSynEditStringList(ALines).RemoveHanlders(FMarkList); TSynEditStringList(ALines).RemoveHanlders(FCaret); TSynEditStringList(ALines).RemoveHanlders(FInternalCaret); TSynEditStringList(ALines).RemoveHanlders(FBlockSelection); diff --git a/components/synedit/test/testsynsharededits.pas b/components/synedit/test/testsynsharededits.pas index 32729aee96..43890327f5 100644 --- a/components/synedit/test/testsynsharededits.pas +++ b/components/synedit/test/testsynsharededits.pas @@ -98,6 +98,10 @@ var m: TSynEditMark; i: Integer; begin + //for i := 0 to FSynEdits[EditIndex].Marks.Count - 1 do begin + // m := FSynEdits[EditIndex].Marks[i]; + // debugln(['Mark ',i,' Line=',m.Line,' Col=',m.Column]); + //end; AssertEquals(Name + ' Edit: '+IntToStr(EditIndex)+' Count: ', length(MarkList) div 2, FSynEdits[EditIndex].Marks.Count); for i := 0 to (length(MarkList) div 2) - 1 do begin @@ -118,7 +122,9 @@ end; procedure TTestSynSharedEdits.TestMarks; begin + {%region share with marks} ReCreateEdit(2); + PushBaseName('share with marks'); // default setting is shared marklist FSynEdits[1].ShareOptions := [eosShareMarks]; @@ -136,9 +142,91 @@ begin CheckMarks('3/2 - 5/1', 0, [ 3,2, 5,2 ]); CheckMarks('3/2 - 5/1', 1, [ 3,2, 5,2 ]); + // move both + FSynEdits[0].CaretXY := Point(1, 4); + FSynEdits[0].CommandProcessor(ecLineBreak, ' ', nil); + CheckMarks('newline 3/2 - 6/1', 0, [ 3,2, 6,2 ]); + CheckMarks('newline 3/2 - 6/1', 1, [ 3,2, 6,2 ]); + + // unshare again + FSynEdits[1].UnShareTextBuffer; + CheckMarks('unshared 3/2 - 5/1', 0, [ 3,2, 6,2 ]); + CheckMarks('unshared 3/2 - 5/1', 1, []); // empty has no marks of it's own + + //move 1 + FSynEdits[0].CaretXY := Point(1, 4); // after mark + FSynEdits[0].CommandProcessor(ecLineBreak, ' ', nil); + + CheckMarks('unshared newline 3/2 - 5/1', 0, [ 3,2, 7,2 ]); + CheckMarks('unshared newline 3/2 - 5/1', 1, []); // empty has no marks of it's own + + AddMark(0, 7,1); + CheckMarks('unshared add(0)', 0, [ 3,2, 7,2, 7,1 ]); + CheckMarks('unshared add(0)', 1, []); + AddMark(1, 3,1); + CheckMarks('unshared add(1)', 0, [ 3,2, 7,2, 7,1 ]); + CheckMarks('unshared add(1)', 1, [ 3,1]); + + // delete mark from edit 0 + FSynEdits[0].Marks[0].Free; + CheckMarks('unshared del(0)', 0, [7,2, 7,1 ]); + CheckMarks('unshared del(0)', 1, [ 3,1 ]); + + {%endregion} + + {%region share with marks / destroy 1st} ReCreateEdit(2); + PopPushBaseName('share with marks / destroy 2nd'); + // default setting is shared marklist + FSynEdits[1].ShareOptions := [eosShareMarks]; + FSynEdits[1].ShareTextBufferFrom(FSynEdits[0]); + SetLines(TestText1); + + // create setup + AddMark(0, 3,2); + AddMark(1, 5,2); + CheckMarks('3/2 - 5/1', 0, [ 3,2, 5,2 ]); + CheckMarks('3/2 - 5/1', 1, [ 3,2, 5,2 ]); + + FreeAndNil(FSynEdits[0]); + CheckMarks('other destroyed', 1, [ 3,2, 5,2 ]); + + //move 1 + FSynEdits[1].CaretXY := Point(1, 4); // after mark + FSynEdits[1].CommandProcessor(ecLineBreak, ' ', nil); + + CheckMarks('unshared newline 3/2 - 5/1', 1, [ 3,2, 6,2 ]); + {%endregion} + + {%region share with marks / destroy 2nd} + ReCreateEdit(2); + PopPushBaseName('share with marks / destroy 2nd'); + // default setting is shared marklist + FSynEdits[1].ShareOptions := [eosShareMarks]; + FSynEdits[1].ShareTextBufferFrom(FSynEdits[0]); + SetLines(TestText1); + + // create setup + AddMark(0, 3,2); + AddMark(1, 5,2); + CheckMarks('3/2 - 5/1', 0, [ 3,2, 5,2 ]); + CheckMarks('3/2 - 5/1', 1, [ 3,2, 5,2 ]); + + FreeAndNil(FSynEdits[1]); + CheckMarks('other destroyed', 0, [ 3,2, 5,2 ]); + + //move 1 + FSynEdits[0].CaretXY := Point(1, 4); // after mark + FSynEdits[0].CommandProcessor(ecLineBreak, ' ', nil); + + CheckMarks('unshared newline 3/2 - 5/1', 0, [ 3,2, 6,2 ]); + {%endregion} + + {%region share, but separate marks} + ReCreateEdit(2); + PopPushBaseName('share, but separate marks'); // setting is not shared marklist FSynEdits[1].ShareOptions := []; @@ -156,6 +244,69 @@ begin CheckMarks('3/2 - 5/1', 0, [ 3,2 ]); CheckMarks('3/2 - 5/1', 1, [ 5,2 ]); + // unshare again + FSynEdits[1].UnShareTextBuffer; + CheckMarks('unshared', 0, [ 3,2 ]); + CheckMarks('unshared', 1, [ ]); // empty, even though it had own marks,. they were related to the text it has no longer + + FSynEdits[0].CaretXY := Point(1, 1); + FSynEdits[0].CommandProcessor(ecLineBreak, ' ', nil); + CheckMarks('unshared newline', 0, [ 4,2 ]); + CheckMarks('unshared newline', 1, [ ]); // empty, even though it had own marks,. they were related to the text it has no longer + + // delete mark from edit 0 + FSynEdits[0].Marks[0].Free; + CheckMarks('unshared del', 0, [ ]); + CheckMarks('unshared del', 1, [ ]); + {%endregion} + + {%region share but separate marks / destroy 1st} + ReCreateEdit(2); + PopPushBaseName('share with marks / destroy 2nd'); + // default setting is shared marklist + FSynEdits[1].ShareOptions := []; + FSynEdits[1].ShareTextBufferFrom(FSynEdits[0]); + SetLines(TestText1); + + // create setup + AddMark(0, 3,2); + AddMark(1, 5,2); + CheckMarks('3/2 - 5/1', 0, [ 3,2 ]); + CheckMarks('3/2 - 5/1', 1, [ 5,2 ]); + + FreeAndNil(FSynEdits[0]); + CheckMarks('other destroyed', 1, [ 5,2 ]); + + //move 1 + FSynEdits[1].CaretXY := Point(1, 1); + FSynEdits[1].CommandProcessor(ecLineBreak, ' ', nil); + + CheckMarks('unshared newline 3/2 - 5/1', 1, [ 6,2 ]); + {%endregion} + + {%region share, but separate marks / destroy 2nd} + ReCreateEdit(2); + PopPushBaseName('share with marks / destroy 2nd'); + // default setting is shared marklist + FSynEdits[1].ShareOptions := []; + FSynEdits[1].ShareTextBufferFrom(FSynEdits[0]); + SetLines(TestText1); + + // create setup + AddMark(0, 3,2); + AddMark(1, 5,2); + CheckMarks('3/2 - 5/1', 0, [ 3,2 ]); + CheckMarks('3/2 - 5/1', 1, [ 5,2 ]); + + FreeAndNil(FSynEdits[1]); + CheckMarks('other destroyed', 0, [ 3,2 ]); + + //move 1 + FSynEdits[0].CaretXY := Point(1, 1); + FSynEdits[0].CommandProcessor(ecLineBreak, ' ', nil); + + CheckMarks('unshared newline 3/2 - 5/1', 0, [ 4,2 ]); + {%endregion} end;