cody:lvlgraph: OnSelectionChanged

git-svn-id: trunk@40318 -
This commit is contained in:
mattias 2013-02-14 22:12:27 +00:00
parent 6662a11ade
commit 55d0aad334

View File

@ -261,6 +261,7 @@ type
procedure SetLevel(AValue: TLvlGraphLevel); procedure SetLevel(AValue: TLvlGraphLevel);
procedure SetSelected(AValue: boolean); procedure SetSelected(AValue: boolean);
procedure UnbindLevel; procedure UnbindLevel;
procedure SelectionChanged;
public public
Data: Pointer; // free for user data Data: Pointer; // free for user data
constructor Create(TheGraph: TLvlGraph; TheCaption: string; TheLevel: TLvlGraphLevel); constructor Create(TheGraph: TLvlGraph; TheCaption: string; TheLevel: TLvlGraphLevel);
@ -352,6 +353,7 @@ type
FOnInvalidate: TNotifyEvent; FOnInvalidate: TNotifyEvent;
FNodes: TFPList; // list of TLvlGraphNode FNodes: TFPList; // list of TLvlGraphNode
fLevels: TFPList; fLevels: TFPList;
FOnSelectionChanged: TNotifyEvent;
FOnStructureChanged: TOnLvlGraphStructureChanged; FOnStructureChanged: TOnLvlGraphStructureChanged;
function GetLevelCount: integer; function GetLevelCount: integer;
function GetLevels(Index: integer): TLvlGraphLevel; function GetLevels(Index: integer): TLvlGraphLevel;
@ -360,6 +362,7 @@ type
procedure InternalRemoveNode(Node: TLvlGraphNode); procedure InternalRemoveNode(Node: TLvlGraphNode);
procedure InternalRemoveLevel(Lvl: TLvlGraphLevel); procedure InternalRemoveLevel(Lvl: TLvlGraphLevel);
protected protected
procedure SelectionChanged;
public public
Data: Pointer; // free for user data Data: Pointer; // free for user data
constructor Create; constructor Create;
@ -369,6 +372,7 @@ type
procedure Invalidate; procedure Invalidate;
procedure StructureChanged(Element: TObject; Operation: TOperation); procedure StructureChanged(Element: TObject; Operation: TOperation);
property OnInvalidate: TNotifyEvent read FOnInvalidate write FOnInvalidate; property OnInvalidate: TNotifyEvent read FOnInvalidate write FOnInvalidate;
property OnSelectionChanged: TNotifyEvent read FOnSelectionChanged write FOnSelectionChanged;
property OnStructureChanged: TOnLvlGraphStructureChanged read FOnStructureChanged write FOnStructureChanged;// node, edge, level was added/deleted property OnStructureChanged: TOnLvlGraphStructureChanged read FOnStructureChanged write FOnStructureChanged;// node, edge, level was added/deleted
// nodes // nodes
@ -379,6 +383,8 @@ type
property FirstSelected: TLvlGraphNode read FFirstSelected; property FirstSelected: TLvlGraphNode read FFirstSelected;
property LastSelected: TLvlGraphNode read FLastSelected; property LastSelected: TLvlGraphNode read FLastSelected;
procedure ClearSelection; procedure ClearSelection;
procedure SingleSelect(Node: TLvlGraphNode);
function IsMultiSelection: boolean;
// edges // edges
function GetEdge(SourceCaption, TargetCaption: string; function GetEdge(SourceCaption, TargetCaption: string;
@ -484,6 +490,7 @@ type
FGraph: TLvlGraph; FGraph: TLvlGraph;
FNodeStyle: TLvlGraphNodeStyle; FNodeStyle: TLvlGraphNodeStyle;
FNodeUnderMouse: TLvlGraphNode; FNodeUnderMouse: TLvlGraphNode;
FOnSelectionChanged: TNotifyEvent;
FOptions: TLvlGraphCtrlOptions; FOptions: TLvlGraphCtrlOptions;
fUpdateLock: integer; fUpdateLock: integer;
FFlags: TLvlGraphControlFlags; FFlags: TLvlGraphControlFlags;
@ -494,8 +501,9 @@ type
procedure SetNodeUnderMouse(AValue: TLvlGraphNode); procedure SetNodeUnderMouse(AValue: TLvlGraphNode);
procedure SetOptions(AValue: TLvlGraphCtrlOptions); procedure SetOptions(AValue: TLvlGraphCtrlOptions);
protected protected
procedure AutoLayoutLevels(TxtH: LongInt); procedure AutoLayoutLevels(TxtH: LongInt); virtual;
procedure GraphInvalidate(Sender: TObject); virtual; procedure GraphInvalidate(Sender: TObject); virtual;
procedure GraphSelectionChanged(Sender: TObject); virtual;
procedure GraphStructureChanged(Sender, Element: TObject; Operation: TOperation); virtual; procedure GraphStructureChanged(Sender, Element: TObject; Operation: TOperation); virtual;
procedure DoSetBounds(ALeft, ATop, AWidth, AHeight: integer); override; procedure DoSetBounds(ALeft, ATop, AWidth, AHeight: integer); override;
procedure Paint; override; procedure Paint; override;
@ -517,6 +525,7 @@ type
property NodeStyle: TLvlGraphNodeStyle read FNodeStyle write SetNodeStyle; property NodeStyle: TLvlGraphNodeStyle read FNodeStyle write SetNodeStyle;
property NodeUnderMouse: TLvlGraphNode read FNodeUnderMouse write SetNodeUnderMouse; property NodeUnderMouse: TLvlGraphNode read FNodeUnderMouse write SetNodeUnderMouse;
property Options: TLvlGraphCtrlOptions read FOptions write SetOptions default DefaultLvlGraphCtrlOptions; property Options: TLvlGraphCtrlOptions read FOptions write SetOptions default DefaultLvlGraphCtrlOptions;
property OnSelectionChanged: TNotifyEvent read FOnSelectionChanged write FOnSelectionChanged;
end; end;
{ TLvlGraphControl } { TLvlGraphControl }
@ -552,6 +561,7 @@ type
property OnMouseLeave; property OnMouseLeave;
property OnMouseMove; property OnMouseMove;
property OnMouseUp; property OnMouseUp;
property OnSelectionChanged;
property OnShowHint; property OnShowHint;
property OnStartDrag; property OnStartDrag;
property OnUTF8KeyPress; property OnUTF8KeyPress;
@ -1001,6 +1011,12 @@ begin
end; end;
end; end;
procedure TCustomLvlGraphControl.GraphSelectionChanged(Sender: TObject);
begin
if OnSelectionChanged<>nil then
OnSelectionChanged(Self);
end;
procedure TCustomLvlGraphControl.DrawCaptions(const TxtH: integer); procedure TCustomLvlGraphControl.DrawCaptions(const TxtH: integer);
var var
Node: TLvlGraphNode; Node: TLvlGraphNode;
@ -1199,6 +1215,7 @@ begin
FOptions:=DefaultLvlGraphCtrlOptions; FOptions:=DefaultLvlGraphCtrlOptions;
FGraph:=TLvlGraph.Create; FGraph:=TLvlGraph.Create;
FGraph.OnInvalidate:=@GraphInvalidate; FGraph.OnInvalidate:=@GraphInvalidate;
FGraph.OnSelectionChanged:=@GraphSelectionChanged;
FGraph.OnStructureChanged:=@GraphStructureChanged; FGraph.OnStructureChanged:=@GraphStructureChanged;
FNodeStyle:=TLvlGraphNodeStyle.Create(Self); FNodeStyle:=TLvlGraphNodeStyle.Create(Self);
end; end;
@ -1457,6 +1474,19 @@ begin
FirstSelected.Selected:=false; FirstSelected.Selected:=false;
end; end;
procedure TLvlGraph.SingleSelect(Node: TLvlGraphNode);
begin
if (Node=FirstSelected) and (Node.NextSelected=nil) then exit;
Node.Selected:=true;
while FirstSelected<>Node do
FirstSelected.Selected:=false;
end;
function TLvlGraph.IsMultiSelection: boolean;
begin
Result:=(FirstSelected<>nil) and (FirstSelected.NextSelected<>nil);
end;
function TLvlGraph.GetEdge(SourceCaption, TargetCaption: string; function TLvlGraph.GetEdge(SourceCaption, TargetCaption: string;
CreateIfNotExists: boolean): TLvlGraphEdge; CreateIfNotExists: boolean): TLvlGraphEdge;
var var
@ -1494,6 +1524,12 @@ begin
StructureChanged(Lvl,opRemove); StructureChanged(Lvl,opRemove);
end; end;
procedure TLvlGraph.SelectionChanged;
begin
if OnSelectionChanged<>nil then
OnSelectionChanged(Self);
end;
procedure TLvlGraph.CreateTopologicalLevels; procedure TLvlGraph.CreateTopologicalLevels;
{$DEFINE LvlGraphConsistencyCheck} {$DEFINE LvlGraphConsistencyCheck}
var var
@ -1981,18 +2017,9 @@ begin
end; end;
procedure TLvlGraphNode.SetSelected(AValue: boolean); procedure TLvlGraphNode.SetSelected(AValue: boolean);
begin
if FSelected=AValue then Exit; procedure Unselect;
FSelected:=AValue; begin
if Graph<>nil then begin
if Selected then begin
FPrevSelected:=Graph.LastSelected;
if FPrevSelected<>nil then
FPrevSelected.FNextSelected:=Self
else
Graph.FFirstSelected:=Self;
Graph.FLastSelected:=Self;
end else begin
if FPrevSelected<>nil then if FPrevSelected<>nil then
FPrevSelected.FNextSelected:=FNextSelected FPrevSelected.FNextSelected:=FNextSelected
else else
@ -2004,8 +2031,37 @@ begin
FNextSelected:=nil; FNextSelected:=nil;
FPrevSelected:=nil; FPrevSelected:=nil;
end; end;
procedure Select;
begin
FPrevSelected:=Graph.LastSelected;
if FPrevSelected<>nil then
FPrevSelected.FNextSelected:=Self
else
Graph.FFirstSelected:=Self;
Graph.FLastSelected:=Self;
end; end;
Invalidate;
begin
if FSelected=AValue then begin
if Graph=nil then exit;
if Graph.LastSelected=Self then exit;
// make this node the last selected
Unselect;
Select;
SelectionChanged;
exit;
end;
// change Selected
FSelected:=AValue;
if Graph<>nil then begin
if Selected then begin
Select;
end else begin
Unselect;
end;
end;
SelectionChanged;
end; end;
procedure TLvlGraphNode.UnbindLevel; procedure TLvlGraphNode.UnbindLevel;
@ -2014,6 +2070,12 @@ begin
FLevel.fNodes.Remove(Self); FLevel.fNodes.Remove(Self);
end; end;
procedure TLvlGraphNode.SelectionChanged;
begin
if Graph<>nil then
Graph.SelectionChanged;
end;
procedure TLvlGraphNode.Invalidate; procedure TLvlGraphNode.Invalidate;
begin begin
if Graph<>nil then if Graph<>nil then