ide: more reliable TSourceMarks.FindFirstMarkNode, simplified node compare functions

git-svn-id: trunk@18962 -
This commit is contained in:
paul 2009-03-12 03:18:26 +00:00
parent a9de954bca
commit b03edbc7c8

View File

@ -210,23 +210,18 @@ type
function CompareSourceMarks(Data1, Data2: Pointer): integer; function CompareSourceMarks(Data1, Data2: Pointer): integer;
var var
Mark1: TSourceMark; Mark1: TSourceMark absolute Data1;
Mark2: TSourceMark; Mark2: TSourceMark absolute Data2;
begin begin
Mark1:=TSourceMark(Data1);
Mark2:=TSourceMark(Data2);
Result := Mark1.Compare(Mark2); Result := Mark1.Compare(Mark2);
end; end;
function CompareEditorAndLineWithMark(Key, Data: Pointer): integer; function CompareEditorAndLineWithMark(Key, Data: Pointer): integer;
var var
EditorAndLine: PEditorAndLine; EditorAndLine: PEditorAndLine absolute Key;
AMark: TSourceMark; AMark: TSourceMark absolute Data;
begin begin
EditorAndLine:=PEditorAndLine(Key); Result := -AMark.CompareEditorAndLine(EditorAndLine^.Editor, EditorAndLine^.Line);
AMark:=TSourceMark(Data);
Result:=AMark.CompareEditorAndLine(EditorAndLine^.Editor,EditorAndLine^.Line);
Result:=-Result;
end; end;
{ TSourceMark } { TSourceMark }
@ -407,7 +402,7 @@ function TSourceMark.CompareEditorAndLine(ASynEdit: TCustomSynEdit;
ALine: integer): integer; ALine: integer): integer;
begin begin
Result := PtrInt(fSynEdit) - PtrInt(ASynEdit); Result := PtrInt(fSynEdit) - PtrInt(ASynEdit);
if Result<>0 then exit; if Result <> 0 then Exit;
Result := Line - ALine; Result := Line - ALine;
end; end;
@ -531,12 +526,19 @@ end;
function TSourceMarks.FindFirstMarkNode(ASynEdit: TCustomSynEdit; ALine: integer function TSourceMarks.FindFirstMarkNode(ASynEdit: TCustomSynEdit; ALine: integer
): TAVLTreeNode; ): TAVLTreeNode;
var var
LeftNode: TAVLTreeNode;
EditorAndLine: TEditorAndLine; EditorAndLine: TEditorAndLine;
begin begin
EditorAndLine.Editor := ASynEdit; EditorAndLine.Editor := ASynEdit;
EditorAndLine.Line := ALine; EditorAndLine.Line := ALine;
Result:=fSortedItems.FindLeftMostKey(@EditorAndLine, Result := fSortedItems.FindKey(@EditorAndLine, @CompareEditorAndLineWithMark);
@CompareEditorAndLineWithMark); while Result <> nil do
begin
LeftNode := fSortedItems.FindPrecessor(Result);
if (LeftNode = nil) or
(CompareEditorAndLineWithMark(@EditorAndLine, LeftNode.Data) <> 0) then break;
Result := LeftNode;
end;
end; end;
constructor TSourceMarks.Create(TheOwner: TComponent); constructor TSourceMarks.Create(TheOwner: TComponent);
@ -648,14 +650,15 @@ begin
Result := nil; Result := nil;
EditorAndLine.Editor := ASynEdit; EditorAndLine.Editor := ASynEdit;
EditorAndLine.Line := ALine; EditorAndLine.Line := ALine;
AVLNode:=fSortedItems.FindLeftMostKey(@EditorAndLine, AVLNode := FindFirstMarkNode(ASynEdit, ALine);
@CompareEditorAndLineWithMark); while (AVLNode <> nil) do
while (AVLNode<>nil) do begin begin
CurMark := TSourceMark(AVLNode.Data); CurMark := TSourceMark(AVLNode.Data);
if CompareEditorAndLineWithMark(@EditorAndLine, CurMark) <> 0 then break; if CompareEditorAndLineWithMark(@EditorAndLine, CurMark) <> 0 then break;
if CurMark.IsBreakPoint then begin if CurMark.IsBreakPoint then
begin
Result := CurMark; Result := CurMark;
exit; Exit;
end; end;
AVLNode := fSortedItems.FindSuccessor(AVLNode); AVLNode := fSortedItems.FindSuccessor(AVLNode);
end; end;
@ -675,8 +678,7 @@ begin
Marks := nil; Marks := nil;
EditorAndLine.Editor := ASynEdit; EditorAndLine.Editor := ASynEdit;
EditorAndLine.Line := ALine; EditorAndLine.Line := ALine;
AVLNode := fSortedItems.FindLeftMostKey(@EditorAndLine, AVLNode := FindFirstMarkNode(ASynEdit, ALine);
@CompareEditorAndLineWithMark);
while (AVLNode <> nil) do while (AVLNode <> nil) do
begin begin
CurMark := TSourceMark(AVLNode.Data); CurMark := TSourceMark(AVLNode.Data);