From d16f19da91e68b4f1e45bbf8cac60d559f2e4818 Mon Sep 17 00:00:00 2001 From: Ansgar Becker Date: Tue, 15 Jan 2013 09:09:44 +0000 Subject: [PATCH] Disallow to drag a session folder somewhere below itself, which would end up in an infinite folder structure, theoretically. Fixes issue #3086. --- source/connections.pas | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/source/connections.pas b/source/connections.pas index 7ae733fa..fba9fcdd 100644 --- a/source/connections.pas +++ b/source/connections.pas @@ -666,16 +666,33 @@ procedure Tconnform.ListSessionsDragOver(Sender: TBaseVirtualTree; Source: TObject; Shift: TShiftState; State: TDragState; Pt: TPoint; Mode: TDropMode; var Effect: Integer; var Accept: Boolean); var - TargetNode: PVirtualNode; + TargetNode, ParentNode: PVirtualNode; TargetSess: PConnectionParameters; begin // Allow node dragging everywhere except within the current folder TargetNode := Sender.GetNodeAt(Pt.X, Pt.Y); TargetSess := Sender.GetNodeData(TargetNode); Accept := (Source = Sender) - and ((TargetNode.Parent <> ListSessions.FocusedNode.Parent) or TargetSess.IsFolder) - and (TargetNode <> ListSessions.FocusedNode.Parent) - and (Mode <> dmNowhere); + and Assigned(TargetSess) + and (Mode <> dmNowhere) + and (TargetNode <> ListSessions.FocusedNode.Parent); + + // Moving a folder into itself would create an infinite folder structure + if Accept and TargetSess.IsFolder then + Accept := Accept and (TargetNode <> ListSessions.FocusedNode); + if Accept and (not TargetSess.IsFolder) then + Accept := Accept and (TargetNode.Parent <> ListSessions.FocusedNode.Parent); + + if Accept then begin + // Do not allow focused node to be moved somewhere below itself + ParentNode := TargetNode.Parent; + while Assigned(ParentNode) do begin + Accept := Accept and (ParentNode <> ListSessions.FocusedNode); + if not Accept then + Break; + ParentNode := ParentNode.Parent; + end; + end; end;