📄 simplegraph.pas
字号:
function GetLinkInputs(Index: Integer): TGraphLink;
function GetLinkInputCount: Integer;
function GetLinkOutputs(Index: Integer): TGraphLink;
function GetLinkOutputCount: Integer;
function IsFontStored: Boolean;
procedure StyleChanged(Sender: TObject);
procedure ListChanged(Sender: TObject; GraphObject: TGraphObject;
Action: TGraphObjectListAction);
procedure ReadCustomData(Stream: TStream);
procedure WriteCustomData(Stream: TStream);
protected
constructor CreateAsReplacement(AGraphObject: TGraphObject); virtual;
constructor CreateFromStream(AOwner: TSimpleGraph; AStream: TStream); virtual;
function GetOwner: TPersistent; override;
procedure DefineProperties(Filer: TFiler); override;
procedure Initialize; virtual;
procedure Loaded; virtual;
procedure ReplaceID(OldID, NewID: DWORD); virtual;
procedure ReplaceObject(OldObject, NewObject: TGraphObject); virtual;
procedure NotifyDependents(Flag: TGraphDependencyChangeFlag); virtual;
procedure LookupDependencies; virtual;
procedure UpdateDependencies; virtual;
procedure UpdateDependencyTo(GraphObject: TGraphObject; Flag: TGraphDependencyChangeFlag); virtual;
function UpdateTextPlacement(Recalc: Boolean; dX, dY: Integer): Boolean; virtual;
procedure Changed(Flags: TGraphChangeFlags); virtual;
procedure BoundsChanged(dX, dY, dCX, dCY: Integer); virtual;
procedure DependentChanged(GraphObject: TGraphObject; Action: TGraphObjectListAction); virtual;
procedure LinkInputChanged(GraphObject: TGraphObject; Action: TGraphObjectListAction); virtual;
procedure LinkOutputChanged(GraphObject: TGraphObject; Action: TGraphObjectListAction); virtual;
procedure ParentFontChanged; virtual;
function IsUpdateLocked: Boolean; virtual;
function NeighborhoodRadius: Integer; virtual;
function FixHookAnchor: TPoint; virtual; abstract;
function RelativeHookAnchor(RefPt: TPoint): TPoint; virtual; abstract;
procedure DrawControlPoint(Canvas: TCanvas; const Pt: TPoint; Enabled: Boolean); virtual;
procedure DrawControlPoints(Canvas: TCanvas); virtual; abstract;
procedure DrawHighlight(Canvas: TCanvas); virtual; abstract;
procedure DrawText(Canvas: TCanvas); virtual; abstract;
procedure DrawBody(Canvas: TCanvas); virtual; abstract;
procedure Draw(Canvas: TCanvas); virtual;
procedure DrawState(Canvas: TCanvas); virtual;
function IsVisibleOn(Canvas: TCanvas): Boolean; virtual;
procedure QueryVisualRect(out Rect: TRect); virtual; abstract;
function QueryHitTest(const Pt: TPoint): DWORD; virtual;
function QueryCursor(HT: DWORD): TCursor; virtual;
function QueryMobility(HT: DWORD): TObjectSides; virtual;
function OffsetHitTest(HT: DWORD; dX, dY: Integer): Boolean; virtual;
procedure SnapHitTestOffset(HT: DWORD; var dX, dY: Integer); virtual;
function BeginFollowDrag(HT: DWORD): Boolean; virtual;
function EndFollowDrag: Boolean; virtual;
procedure DisableDrag; virtual;
procedure EnableDrag; virtual;
procedure MoveBy(dX, dY: Integer); virtual; abstract;
procedure MouseDown(Button: TMouseButton; Shift: TShiftState; const Pt: TPoint); virtual;
procedure MouseMove(Shift: TShiftState; const Pt: TPoint); virtual;
procedure MouseUp(Button: TMouseButton; Shift: TShiftState; const Pt: TPoint); virtual;
function KeyPress(var Key: Word; Shift: TShiftState): Boolean; virtual;
procedure SetBoundsRect(const Rect: TRect); virtual; abstract;
function GetBoundsRect: TRect; virtual; abstract;
function GetSelectedVisualRect: TRect; virtual;
protected
property TextToShow: String read fTextToShow write fTextToShow;
property DependentList: TGraphObjectList read fDependentList;
property LinkInputList: TGraphObjectList read fLinkInputList;
property LinkOutputList: TGraphObjectList read fLinkOutputList;
property VisualRectFlags: TGraphChangeFlags read fVisualRectFlags write fVisualRectFlags;
public
constructor Create(AOwner: TSimpleGraph); virtual;
destructor Destroy; override;
procedure AfterConstruction; override;
procedure BeforeDestruction; override;
procedure Assign(Source: TPersistent); override;
procedure AssignTo(Dest: TPersistent); override;
function ConvertTo(AnotherClass: TGraphObjectClass): TGraphObject; virtual;
procedure LoadFromStream(Stream: TStream); virtual;
procedure SaveToStream(Stream: TStream); virtual;
procedure BeginUpdate; virtual;
procedure EndUpdate; virtual;
procedure Invalidate; virtual;
procedure BringToFront; virtual;
procedure SendToBack; virtual;
class function IsLink: Boolean; virtual;
class function IsNode: Boolean; virtual;
function IsLocked: Boolean; virtual;
function Delete: Boolean; virtual;
function CanDelete: Boolean; virtual;
function HitTest(const Pt: TPoint): DWORD; virtual;
function ContainsPoint(X, Y: Integer): Boolean; virtual;
function ContainsRect(const Rect: TRect): Boolean; virtual;
function BeginDrag(const Pt: TPoint; HT: DWORD = $FFFFFFFF): Boolean; virtual;
function DragTo(const Pt: TPoint; SnapToGrid: Boolean): Boolean; virtual;
function DragBy(dX, dY: Integer; SnapToGrid: Boolean): Boolean; virtual;
function EndDrag(Accept: Boolean): Boolean; virtual;
property States: TGraphObjectStates read fStates;
property Dragging: Boolean read GetDragging;
property Showing: Boolean read GetShowing;
property Owner: TSimpleGraph read fOwner;
property ZOrder: Integer read GetZOrder write SetZOrder;
property Selected: Boolean read fSelected write SetSelected;
property BoundsRect: TRect read GetBoundsRect write SetBoundsRect;
property VisualRect: TRect read fVisualRect;
property SelectedVisualRect: TRect read GetSelectedVisualRect;
property Dependents[Index: Integer]: TGraphObject read GetDependents;
property DependentCount: Integer read GetDependentCount;
property LinkInputs[Index: Integer]: TGraphLink read GetLinkInputs;
property LinkInputCount: Integer read GetLinkInputCount;
property LinkOutputs[Index: Integer]: TGraphLink read GetLinkOutputs;
property LinkOutputCount: Integer read GetLinkOutputCount;
property Data: Pointer read fData write fData;
property ID: DWORD read fID;
published
property Text: String read fText write SetText;
property Hint: String read fHint write SetHint;
property Brush: TBrush read fBrush write SetBrush;
property Pen: TPen read fPen write SetPen;
property Font: TFont read fFont write SetFont stored IsFontStored;
property ParentFont: Boolean read fParentFont write SetParentFont default True;
property Options: TGraphObjectOptions read fOptions write SetOptions
default [goLinkable, goSelectable, goShowCaption];
property Visible: Boolean read fVisible write SetVisible default True;
property Tag: Integer read fTag write fTag default 0;
property HasCustomData: Boolean read fHasCustomData write SetHasCustomData default False;
end;
{ TGraphLink }
TGraphLinkOption = (gloFixedStartPoint, gloFixedEndPoint, gloFixedBreakPoints);
TGraphLinkOptions = set of TGraphLinkOption;
TLinkBeginEndStyle = (lsNone, lsArrow, lsArrowSimple, lsCircle, lsDiamond);
TLinkNormalizeOptions = set of (lnoDeleteSamePoint, lnoDeleteSameAngle);
TLinkChangeMode = (lcmNone, lcmInsertPoint, lcmRemovePoint, lcmMovePoint, lcmMovePolyline);
TGraphLink = class(TGraphObject)
private
fPoints: TPoints;
fPointCount: Integer;
fSource: TGraphObject;
fTarget: TGraphObject;
fTextPosition: Integer;
fTextSpacing: Integer;
fBeginStyle: TLinkBeginEndStyle;
fBeginSize: Byte;
fEndStyle: TLinkBeginEndStyle;
fEndSize: Byte;
fLinkOptions: TGraphLinkOptions;
fTextRegion: HRGN;
fTextAngle: Double;
fTextCenter: TPoint;
fTextLine: Integer;
fChangeMode: TLinkChangeMode;
fAcceptingHook: Boolean;
fHookingObject: TGraphObject;
fMovingPoint: Integer;
SourceID: DWORD;
TargetID: DWORD;
UpdatingEndPoints: Boolean;
CheckingLink: Boolean;
procedure SetSource(Value: TGraphObject);
procedure SetTarget(Value: TGraphObject);
procedure SetLinkOptions(Value: TGraphLinkOptions);
procedure SetTextPosition(Value: Integer);
procedure SetTextSpacing(Value: Integer);
procedure SetBeginStyle(Value: TLinkBeginEndStyle);
procedure SetBeginSize(Value: Byte);
procedure SetEndStyle(Value: TLinkBeginEndStyle);
procedure SetEndSize(Value: Byte);
function GetPoints(Index: Integer): TPoint;
procedure SetPoints(Index: Integer; const Value: TPoint);
procedure SetPolyline(const Value: TPoints);
procedure ReadSource(Reader: TReader);
procedure WriteSource(Writer: TWriter);
procedure ReadTarget(Reader: TReader);
procedure WriteTarget(Writer: TWriter);
procedure ReadPoints(Stream: TStream);
procedure WritePoints(Stream: TStream);
private
procedure ReadFromNode(Reader: TReader); // Obsolete - for backward compatibility
procedure ReadToNode(Reader: TReader); // Obsolete - for backward compatibility
procedure ReadKind(Reader: TReader); // Obsolete - for backward compatibility
procedure ReadArrowSize(Reader: TReader); // Obsolete - for backward compatibility
protected
procedure DefineProperties(Filer: TFiler); override;
procedure Loaded; override;
function FixHookAnchor: TPoint; override;
function RelativeHookAnchor(RefPt: TPoint): TPoint; override;
procedure ReplaceID(OldID, NewID: DWORD); override;
procedure ReplaceObject(OldObject, NewObject: TGraphObject); override;
procedure NotifyDependents(Flag: TGraphDependencyChangeFlag); override;
procedure UpdateDependencyTo(GraphObject: TGraphObject; Flag: TGraphDependencyChangeFlag); override;
procedure UpdateDependencies; override;
procedure LookupDependencies; override;
function UpdateTextPlacement(Recalc: Boolean; dX, dY: Integer): Boolean; override;
function CreateTextRegion: HRGN; virtual;
function IndexOfLongestLine: Integer; virtual;
function IndexOfNearestLine(const Pt: TPoint; Neighborhood: Integer): Integer; virtual;
procedure QueryVisualRect(out Rect: TRect); override;
function QueryHitTest(const Pt: TPoint): DWORD; override;
function QueryCursor(HT: DWORD): TCursor; override;
function QueryMobility(HT: DWORD): TObjectSides; override;
function OffsetHitTest(HT: DWORD; dX, dY: Integer): Boolean; override;
procedure SnapHitTestOffset(HT: DWORD; var dX, dY: Integer); override;
function BeginFollowDrag(HT: DWORD): Boolean; override;
procedure MoveBy(dX, dY: Integer); override;
procedure MouseDown(Button: TMouseButton; Shift: TShiftState; const Pt: TPoint); override;
procedure MouseMove(Shift: TShiftState; const Pt: TPoint); override;
procedure MouseUp(Button: TMouseButton; Shift: TShiftState; const Pt: TPoint); override;
procedure UpdateChangeMode(HT: DWORD; Shift: TShiftState); virtual;
function PointStyleOffset(Style: TLinkBeginEndStyle; Size: Integer): Integer; virtual;
function PointStyleRect(const Pt: TPoint; const Angle: Double;
Style: TLinkBeginEndStyle; Size: Integer): TRect; virtual;
function DrawPointStyle(Canvas: TCanvas; const Pt: TPoint; const Angle: Double;
Style: TLinkBeginEndStyle; Size: Integer): TPoint; virtual;
procedure DrawControlPoints(Canvas: TCanvas); override;
procedure DrawHighlight(Canvas: TCanvas); override;
procedure DrawText(Canvas: TCanvas); override;
procedure DrawBody(Canvas: TCanvas); override;
procedure SetBoundsRect(const Rect: TRect); override;
function GetBoundsRect: TRect; override;
protected
property TextRegion: HRGN read fTextRegion;
property TextAngle: Double read fTextAngle;
property TextCenter: TPoint read fTextCenter;
property TextLine: Integer read fTextLine;
property ChangeMode: TLinkChangeMode read fChangeMode write fChangeMode;
property AcceptingHook: Boolean read fAcceptingHook;
property HookingObject: TGraphObject read fHookingObject;
property MovingPoint: Integer read fMovingPoint;
public
constructor Create(AOwner: TSimpleGraph); override;
constructor CreateNew(AOwner: TSimpleGraph; ASource: TGraphObject;
const Pts: array of TPoint; ATarget: TGraphObject); virtual;
destructor Destroy; override;
procedure Assign(Source: TPersistent); override;
function ContainsRect(const Rect: TRect): Boolean; override;
function CanMove: Boolean; virtual;
function AddPoint(const Pt: TPoint): Integer; virtual;
procedure InsertPoint(Index: Integer; const Pt: TPoint); virtual;
procedure RemovePoint(Index: Integer); virtual;
function IndexOfPoint(const Pt: TPoint; Neighborhood: Integer = 0): Integer; virtual;
function AddBreakPoint(const Pt: TPoint): Integer; virtual;
function NormalizeBreakPoints(Options: TLinkNormalizeOptions): Boolean; virtual;
function IsFixedPoint(Index: Integer; HookedPointsAsFixed: Boolean): Boolean; virtual;
function IsHookedPoint(Index: Integer): Boolean; virtual;
function HookedObjectOf(Index: Integer): TGraphObject; virtual;
function HookedIndexOf(GraphObject: TGraphObject): Integer; virtual;
function HookedPointCount: Integer; virtual;
function CanHook(Index: Integer; GraphObject: TGraphObject): Boolean; virtual;
function Hook(Index: Integer; GraphObject: TGraphObject): Boolean; virtual;
function Unhook(GraphObject: TGraphObject): Integer; overload; virtual;
function Unhook(Index: Integer): Boolean; overload; virtual;
function CanLink(ASource, ATarget: TGraphObject): Boolean; virtual;
function Link(ASource, ATarget: TGraphObject): Boolean; virtual;
function Rotate(const Angle: Double; const Origin: TPoint): Boolean; virtual;
function Scale(const Factor: Double): Boolean; virtual;
procedure Reverse; virtual;
class function IsLink: Boolean; override;
property Source: TGraphObject read fSource write SetSource;
property Target: TGraphObject read fTarget write SetTarget;
property Points[Index: Integer]: TPoint read GetPoints write SetPoints;
property PointCount: Integer read fPointCount;
property Polyline: TPoints read fPoints write SetPolyline;
published
property BeginStyle: TLinkBeginEndStyle read fBeginStyle write SetBeginStyle default lsNone;
property BeginSize: Byte read fBeginSize write SetBeginSize default 6;
property EndStyle: TLinkBeginEndStyle read fEndStyle write SetEndStyle default lsArrow;
property EndSize: Byte read fEndSize write SetEndSize default 6;
property LinkOptions: TGraphLinkOptions read fLinkOptions write SetLinkOptions default [];
property TextPosition: Integer read fTextPosition write SetTextPosition default -1;
property TextSpacing: Integer read fTextSpacing write SetTextSpacing default 0;
end;
{ TGraphNode }
TGraphNodeOption = (gnoMovable, gnoResizable, gnoShowBackground);
TGraphNodeOptions = set of TGraphNodeOption;
TGraphNode = class(TGraphObject)
private
fLeft: Integer;
fTop: Integer;
fWidth: Integer;
fHeight: Integer;
fAlignment: TAlignment;
fLayout: TTextLayout;
fMargin: Integer;
fBackground: TPicture;
fBackgroundMargins: TRect;
fNodeOptions: TGraphNodeOptions;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -