⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 simplegraph.pas

📁 矢量绘图组件(开源版)
💻 PAS
📖 第 1 页 / 共 5 页
字号:
    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 + -