MMPanel.pas
上传用户:hylc_2004
上传日期:2014-01-23
资源大小:46800k
文件大小:69k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. {========================================================================}
  2. {=                (c) 1995-98 SwiftSoft Ronald Dittrich                 =}
  3. {========================================================================}
  4. {=                          All Rights Reserved                         =}
  5. {========================================================================}
  6. {=  D 01099 Dresden             = Fax.: +49(0)351-8037944               =}
  7. {=  Loewenstr.7a                = info@swiftsoft.de                     =}
  8. {========================================================================}
  9. {=  Actual versions on http://www.swiftsoft.de/index.html               =}
  10. {========================================================================}
  11. {=  This code is for reference purposes only and may not be copied or   =}
  12. {=  distributed in any format electronic or otherwise except one copy   =}
  13. {=  for backup purposes.                                                =}
  14. {=                                                                      =}
  15. {=  No Delphi Component Kit or Component individually or in a collection=}
  16. {=  subclassed or otherwise from the code in this unit, or associated   =}
  17. {=  .pas, .dfm, .dcu, .asm or .obj files may be sold or distributed     =}
  18. {=  without express permission from SwiftSoft.                          =}
  19. {=                                                                      =}
  20. {=  For more licence informations please refer to the associated        =}
  21. {=  HelpFile.                                                           =}
  22. {========================================================================}
  23. {=  $Date: 13.11.98 - 16:43:33 $                                        =}
  24. {========================================================================}
  25. unit MMPanel;
  26. {$I COMPILER.INC}
  27. {$DEFINE FLOATCALC}
  28. interface
  29. uses
  30. {$IFDEF WIN32}
  31.     Windows,
  32. {$ELSE}
  33.     WinTypes,
  34.     WinProcs,
  35. {$ENDIF}
  36.     SysUtils,
  37.     Messages,
  38.     Classes,
  39.     Graphics,
  40.     Controls,
  41.     Forms,
  42.     Dialogs,
  43.     ExtCtrls,
  44.     Menus,
  45.     MMObj,
  46.     MMUtils,
  47.     MMString,
  48.     MMMath,
  49.     MMMulDiv,
  50.     MMMrkLst;
  51. type
  52.     {-- TMMPanel ---------------------------------------------------------}
  53.     TMMPanel = class(TMMCustomPanel)
  54.     published
  55.        property OnClick;
  56.        property OnDblClick;
  57.        property OnDragDrop;
  58.        property OnDragOver;
  59.        property OnEndDrag;
  60.        property OnEnter;
  61.        property OnExit;
  62.        property OnMouseDown;
  63.        property OnMouseMove;
  64.        property OnMouseUp;
  65.        property OnResize;
  66.        {$IFDEF WIN32}
  67.        property OnStartDrag;
  68.        {$ENDIF}
  69.        property Align;
  70.        property Alignment;
  71.        property Bevel;
  72.        property DragCursor;
  73.        property DragMode;
  74.        property Enabled;
  75.        property Caption;
  76.        property Color;
  77.        property Ctl3D;
  78.        property Font;
  79.        property ParentColor;
  80.        property ParentCtl3D;
  81.        property ParentFont;
  82.        property ParentShowHint;
  83.        property PopupMenu;
  84.        property ShowHint;
  85.        property TabOrder;
  86.        property TabStop;
  87.        property Visible;
  88.     end;
  89.     {-- TMMBorder --------------------------------------------------------}
  90.     TMMBorder = class(TMMGraphicControl)
  91.     public
  92.        constructor Create(AOwner: TComponent); override;
  93.     published
  94.        property OnClick;
  95.        property OnDblClick;
  96.        property OnDragDrop;
  97.        property OnDragOver;
  98.        property OnEndDrag;
  99.        property OnMouseDown;
  100.        property OnMouseMove;
  101.        property OnMouseUp;
  102.        property Align;
  103.        property Bevel;
  104.        property DragCursor;
  105.        property DragMode;
  106.        property Enabled;
  107.        property Color;
  108.        property ParentColor;
  109.        property ParentShowHint;
  110.        property PopupMenu;
  111.        property ShowHint;
  112.        property Transparent;
  113.        property Visible;
  114.        property Width default 185;
  115.        property Height default 41;
  116.     end;
  117. type
  118.     TMarkerShift = (mkNone, mkLocator, mkMarkerA, mkMarkerB, mkMarkerAB, mkMarkerBA,mkListMarker);
  119.     TMarkerChangeEvent = procedure(Sender: TObject; var Value: Longint) of Object;
  120.     TMarkersChangeEvent = procedure(Sender: TObject; Shift: TMarkerShift; var ValueA, ValueB: Longint) of Object;
  121.     TRangeChangeEvent = procedure(Sender: TObject; Min, Max: Longint) of Object;
  122.     {-- TMMCustomMarkerPanel --------------------------------------------}
  123.     TMMCustomMarkerPanel = class(TMMCustomPanel)
  124.     private
  125.        FMarkerList    : TMMMarkerList;
  126.        FCurMarker     : integer;
  127.        FShowHints     : Boolean;
  128.        FCanUpdate     : Boolean;
  129.        FAutoScroll    : Boolean;
  130.        FMarkerShift   : TMarkerShift;    { which mouse action }
  131.        FGridWidthX    : Float;
  132.        FGridWidthY    : Float;
  133.        FSnapToGrid    : Boolean;
  134.        FHelpLocator   : Longint;
  135.        FLastHelpLoc   : integer;
  136.        FLocator       : Longint;
  137.        FLastLoc       : integer;
  138.        FMarkerA       : Longint;
  139.        FLastMarkA     : integer;
  140.        FMarkerB       : Longint;
  141.        FLastMarkB     : integer;
  142.        FHelpLocColor  : TColor;
  143.        FLocColor      : TColor;
  144.        FMarkAColor    : TColor;
  145.        FMarkBColor    : TColor;
  146.        FGridColor     : TColor;
  147.        FDrawSolid     : Boolean;
  148.        FDrawGriff     : Boolean;
  149.        FUseHelpLocator: Boolean;
  150.        FUseLocator    : Boolean;
  151.        FUseMarkers    : Boolean;
  152.        FCorralLocator : Boolean;
  153.        FRangeMinX     : Longint;
  154.        FRangeMaxX     : Longint;
  155.        FRangeMinY     : Longint;
  156.        FRangeMaxY     : Longint;
  157.        FBaseY         : Longint;
  158.        FDispMinX      : Longint;
  159.        FDispMaxX      : Longint;
  160.        FDispMinY      : Longint;
  161.        FDispMaxY      : Longint;
  162.        FDefaultHint   : string;
  163.        FLocked        : Boolean;
  164.        FLButtonDown   : Boolean;
  165.        FRButtonDown   : Boolean;
  166.        FLocatorMap    : TBitmap;
  167.        FMarkerAMap    : TBitmap;
  168.        FMarkerBMap    : TBitmap;
  169.        FSnapRange     : integer;
  170.        FDrawGridX     : Boolean;
  171.        FDrawGridY     : Boolean;
  172.        FButton        : TMouseButton;
  173.        FDragging      : Boolean;
  174.        FOnTrackBegin  : TNotifyEvent;            { Mausaction started      }
  175.        FOnTrack       : TNotifyEvent;            { Mausaction              }
  176.        FOnTrackEnd    : TNotifyEvent;            { Mausaction stopped      }
  177.        FOnHelpLocatorChanged: TMarkerChangeEvent; { help Locator changed }
  178.        FOnLocatorChanged: TMarkerChangeEvent;  { Locator changed         }
  179.        FOnMarkerAChanged: TMarkerChangeEvent;  { MarkerA changed         }
  180.        FOnMarkerBChanged: TMarkerChangeEvent;  { MarkerB changed         }
  181.        FOnMarkersChanged: TMarkersChangeEvent; { both Markers changed    }
  182.        FOnRangeChanged  : TRangeChangeEvent;   { Range changed           }
  183.        procedure AdjustBitmaps;
  184.        procedure SetHelpLocator(aValue: Longint);
  185.        procedure SetLocator(aValue: Longint);
  186.        procedure SetMarkerA(aValue: Longint);
  187.        procedure SetMarkerB(aValue: Longint);
  188.        procedure SetUseHelpLocator(aValue: Boolean);
  189.        procedure SetUseLocator(aValue: Boolean);
  190.        procedure SetUseMarkers(aValue: Boolean);
  191.        procedure SetColors(index: integer; aValue: TColor);
  192.        procedure SetDrawSolid(aValue: Boolean);
  193.        procedure SetDrawGriff(aValue : Boolean);
  194.        procedure SetRangeMinX(aValue: Longint);
  195.        procedure SetRangeMaxX(aValue: Longint);
  196.        procedure SetRangeMinY(aValue: Longint);
  197.        procedure SetRangeMaxY(aValue: Longint);
  198.        procedure SetBaseY(aValue: Longint);
  199.        procedure SetDispMinX(aValue: Longint);
  200.        procedure SetDispMaxX(aValue: Longint);
  201.        procedure SetDispMinY(aValue: Longint);
  202.        procedure SetDispMaxY(aValue: Longint);
  203.        procedure SetDefaultHint(aValue: String);
  204.        procedure SetMarkerList(aList: TMMMarkerList);
  205.        function  MouseAction(Button: TMouseButton; X: integer): TMarkerShift;
  206.        procedure DrawHelpLocator(aCanvas: TCanvas; var LastLoc: integer);
  207.        procedure DrawLocator(aCanvas: TCanvas; var LastLoc: integer);
  208.        procedure DrawMarkerA(aCanvas: TCanvas; var LastLoc: integer);
  209.        procedure DrawMarkerB(aCanvas: TCanvas; var LastLoc: integer);
  210.        procedure DrawMarkerGriff(aCanvas: TCanvas; Loc,Mode: integer);
  211.        procedure DrawAsSolid(aCanvas: TCanvas; MemDC: HDC; Mode,Loc: integer;
  212.                              var LastLoc: integer; Doted: Boolean; aColor: TColor);
  213.        procedure DrawAsXOR(aCanvas: TCanvas; Mode,Loc: integer;
  214.                            var LastLoc: integer; Doted: Boolean; aColor: TColor);
  215.        procedure WMLButtonDown(var Message: TWMLButtonDown); message WM_LBUTTONDOWN;
  216.        procedure WMLButtonUp(var Message: TWMLButtonUp); message WM_LBUTTONUP;
  217.        procedure WMRButtonDown(var Message: TWMRButtonDown); message WM_RBUTTONDOWN;
  218.        procedure WMRButtonUp(var Message: TWMRButtonUp); message WM_RBUTTONUP;
  219.        procedure WMCancelMode(var Message: TWMCancelMode); message WM_CANCELMODE;
  220.        procedure CMShowHintChanged(var Message: TMessage); message CM_SHOWHINTCHANGED;
  221.        procedure CMCursorChanged(var Message: TMessage); message CM_CURSORCHANGED;
  222.     protected
  223.        FOriginalCursor: TCursor;
  224.        procedure Paint; override;
  225.        procedure TrackBegin; dynamic;
  226.        procedure Track; dynamic;
  227.        procedure TrackEnd; dynamic;
  228.        procedure HelpLocatorChanged(Value: Longint); dynamic;
  229.        procedure LocatorChanged(Value: Longint); dynamic;
  230.        procedure MarkerAChanged(Value: Longint); dynamic;
  231.        procedure MarkerBChanged(Value: Longint); dynamic;
  232.        procedure MarkersChanged(Shift: TMarkerShift; ValueA, ValueB: Longint); dynamic;
  233.        procedure RangeChanged; dynamic;
  234.        procedure CheckRange(var lMin, lMax: Longint; MinRange,MaxRange,MinDistance: Longint); virtual;
  235.        function  AdjustVisibleRange(Value: Longint): Boolean; virtual;
  236.        procedure VLineDoted(aCanvas:TCanvas;x,y1,y2:integer;Clr:TColorRef); virtual;
  237.        procedure HLineDoted(aCanvas:TCanvas;x1,x2,y:integer;Clr:TColorRef); virtual;
  238.        procedure DrawGridsX(aCanvas: TCanvas; min,max: Longint);virtual;
  239.        procedure DrawGridsY(aCanvas: TCanvas; min,max: Longint);virtual;
  240.        procedure DrawListMarkers(aCanvas: TCanvas);
  241.        procedure DrawAllMarkers(aCanvas: TCanvas);
  242.        procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
  243.                            X, Y: integer); override;
  244.        procedure MouseMove(Shift: TShiftState; X, Y: integer); override;
  245.        procedure MouseUp(Button: TMouseButton; Shift: TShiftState;
  246.                          X, Y: integer); override;
  247.        procedure SetGridWidthX(aValue: Float); virtual;
  248.        procedure SetDrawGridX(aValue: Boolean); virtual;
  249.        procedure SetGridWidthY(aValue: Float); virtual;
  250.        procedure SetDrawGridY(aValue: Boolean); virtual;
  251.        function  GetHintText(aPos: TPoint): string; virtual;
  252.        function  GetMouseCursor(aPos: TPoint): TCursor; virtual;
  253.     public
  254.        constructor Create(AOwner: TComponent); override;
  255.        destructor  Destroy; override;
  256.        procedure SetBounds(aLeft, aTop, aWidth, aHeight: integer); override;
  257.        function  X_ToPixelNoLimit(X_Value: longint): Longint; virtual;
  258.        function  X_ToPixel(X_Value: longint): integer; virtual;
  259.        function  PixelTo_X(X: integer): Longint; virtual;
  260.        function  Y_ToPixelNoLimit(Y_Value: Longint): Longint; virtual;
  261.        function  Y_ToPixel(Y_Value: Longint): integer; virtual;
  262.        function  PixelTo_Y(Y: integer): Longint; virtual;
  263.        function  FindListMarker(X: integer): integer;
  264.        function  IsAnyMarker(X: integer): Boolean;
  265.        function  IsLocator(X: integer): Boolean;
  266.        function  IsMarkerA(X: integer): Boolean;
  267.        function  IsMarkerB(X: integer): Boolean;
  268.        function  IsListMarker(X: integer): Boolean;
  269.        function  IsGridX(X: integer; var Value: Longint): Boolean; virtual;
  270.        function  IsGridY(Y: integer; var Value: Longint): Boolean; virtual;
  271.        procedure SetMinMax(Min, Max: Longint); virtual;
  272.        procedure SetMinMaxY(Min, Max: Longint); virtual;
  273.        procedure SetRangeAll(MinX, MaxX, MinY, MaxY, YBase: Longint); virtual;
  274.        procedure SetDispAll(MinX, MaxX, MinY, MaxY: Longint); virtual;
  275.        property  MouseCapture;
  276.        property  Locked: Boolean read FLocked write FLocked;
  277.    protected
  278.        property OnTrackBegin: TNotifyEvent read FOnTrackBegin write FOnTrackBegin;
  279.        property OnTrack: TNotifyEvent read FOnTrack write FOnTrack;
  280.        property OnTrackEnd: TNotifyEvent read FOnTrackEnd write FOnTrackEnd;
  281.        property OnHelpLocatorChanged: TMarkerChangeEvent read FOnHelpLocatorChanged write FOnHelpLocatorChanged;
  282.        property OnLocatorChanged: TMarkerChangeEvent read FOnLocatorChanged write FOnLocatorChanged;
  283.        property OnMarkerAChanged: TMarkerChangeEvent read FOnMarkerAChanged write FOnMarkerAChanged;
  284.        property OnMarkerBChanged: TMarkerChangeEvent read FOnMarkerBChanged write FOnMarkerBChanged;
  285.        property OnMarkersChanged: TMarkersChangeEvent read FOnMarkersChanged write FOnMarkersChanged;
  286.        property OnRangeChanged: TRangeChangeEvent read FOnRangeChanged write FOnRangeChanged;
  287.        property AutoScroll: Boolean read FAutoScroll write FAutoScroll default True;
  288.        property UseHelpLocator: Boolean read FUseHelpLocator write SetUseHelpLocator default True;
  289.        property UseLocator: Boolean read FUseLocator write SetUseLocator default True;
  290.        property UseMarkers: Boolean read FUseMarkers write SetUseMarkers default False;
  291.        property CorralLocator: Boolean read FCorralLocator write FCorralLocator default True;
  292.        property HelpLocator: Longint read FHelpLocator write SetHelpLocator default -1;
  293.        property Locator: Longint read FLocator write SetLocator default -1;
  294.        property MarkerA: Longint read FMarkerA write SetMarkerA default -1;
  295.        property MarkerB: Longint read FMarkerB write SetMarkerB default -1;
  296.        property HelpLocatorColor : TColor index 0 read FHelpLocColor write SetColors default clSilver;
  297.        property LocatorColor : TColor index 1 read FLocColor write SetColors default clLime;
  298.        property MarkerAColor : TColor index 2 read FMarkAColor write SetColors default clRed;
  299.        property MarkerBColor : TColor index 3 read FMarkBColor write SetColors default clRed;
  300.        property GridColor: TColor index 4 read FGridColor write SetColors default clGray;
  301.        property DrawSolid: Boolean read FDrawSolid write SetDrawSolid default False;
  302.        property DrawGriff: Boolean read FDrawGriff write SetDrawGriff default False;
  303.        property DrawGridX: Boolean read FDrawGridX write SetDrawGridX default False;
  304.        property DrawGridY: Boolean read FDrawGridY write SetDrawGridY default False;
  305.        property GridWidthX: Float read FGridWidthX write SetGridWidthX;
  306.        property GridWidthY: Float read FGridWidthY write SetGridWidthY;
  307.        property SnapToGrid: Boolean read FSnapToGrid write FSnapToGrid default False;
  308.        property SnapRange: integer read FSnapRange write FSnapRange default 3;
  309.        property RangeMinX: Longint read FRangeMinX write SetRangeMinX default 0;
  310.        property RangeMaxX: Longint read FRangeMaxX write SetRangeMaxX default 1000;
  311.        property RangeMinY: Longint read FRangeMinY write SetRangeMinY default 0;
  312.        property RangeMaxY: Longint read FRangeMaxY write SetRangeMaxY default 1000;
  313.        property BaseY: Longint read FBaseY write SetBaseY default 500;
  314.        property DispMinX: Longint read FDispMinX write SetDispMinX default 0;
  315.        property DispMaxX: Longint read FDispMaxX write SetDispMaxX default 1000;
  316.        property DispMinY: Longint read FDispMinY write SetDispMinY default 0;
  317.        property DispMaxY: Longint read FDispMaxY write SetDispMaxY default 1000;
  318.        property MarkerList: TMMMarkerList read FMarkerList write SetMarkerList;
  319.        property DefaultHint: string read FDefaultHint write SetDefaultHint;
  320.     end;
  321.     {-- TMMMarkerPanel --------------------------------------------------}
  322.     TMMMarkerPanel = class(TMMCustomMarkerPanel)
  323.     public
  324.        property MarkerList;
  325.     published
  326.        property OnClick;
  327.        property OnDblClick;
  328.        property OnDragDrop;
  329.        property OnDragOver;
  330.        property OnEndDrag;
  331.        property OnEnter;
  332.        property OnExit;
  333.        property OnMouseDown;
  334.        property OnMouseMove;
  335.        property OnMouseUp;
  336.        property OnResize;
  337.        {$IFDEF WIN32}
  338.        property OnStartDrag;
  339.        {$ENDIF}
  340.        property OnTrackBegin;
  341.        property OnTrack;
  342.        property OnTrackEnd;
  343.        property OnHelpLocatorChanged;
  344.        property OnLocatorChanged;
  345.        property OnMarkerAChanged;
  346.        property OnMarkerBChanged;
  347.        property OnMarkersChanged;
  348.        property OnRangeChanged;
  349.        property Align;
  350.        property Alignment;
  351.        property Bevel;
  352.        property DragCursor;
  353.        property DragMode;
  354.        property Enabled;
  355.        property Color;
  356.        property Ctl3D;
  357.        property Font;
  358.        property ParentFont;
  359.        property ParentColor;
  360.        property ParentCtl3D;
  361.        property ParentShowHint;
  362.        property PopupMenu;
  363.        property ShowHint;
  364.        property TabOrder;
  365.        property TabStop;
  366.        property Visible;
  367.        property AutoScroll;
  368.        property CorralLocator;
  369.        property UseHelpLocator;
  370.        property UseLocator;
  371.        property UseMarkers;
  372.        property HelpLocator;
  373.        property Locator;
  374.        property GridWidthX;
  375.        property GridWidthY;
  376.        property SnapToGrid;
  377.        property SnapRange;
  378.        property MarkerA;
  379.        property MarkerB;
  380.        property LocatorColor;
  381.        property MarkerAColor;
  382.        property MarkerBColor;
  383.        property GridColor;
  384.        property DrawSolid;
  385.        property DrawGriff;
  386.        property DrawGridX;
  387.        property DrawGridY;
  388.        property RangeMinX;
  389.        property RangeMaxX;
  390.        property RangeMinY;
  391.        property RangeMaxY;
  392.        property BaseY;
  393.        property DispMinX;
  394.        property DispMaxX;
  395.        property DispMinY;
  396.        property DispMaxY;
  397.        property DefaultHint;
  398.     end;
  399. implementation
  400. const
  401.     GriffWidth = 10;
  402.     ButtonDown : Boolean = False;
  403. {== TMMBorder ============================================================}
  404. constructor TMMBorder.Create(aOwner: TComponent);
  405. begin
  406.      inherited Create(aOwner);
  407.      Width  := 185;
  408.      Height := 41;
  409.      ErrorCode := ComponentRegistered(InitCode, Self, ClassName);
  410.      if (ErrorCode <> 0) then RegisterFailed(InitCode, Self , ClassName);
  411. end;
  412. {== TMMCustomMarkerPanel ================================================}
  413. constructor TMMCustomMarkerPanel.Create(AOwner: TComponent);
  414. begin
  415.    inherited Create(AOwner);
  416.    ControlStyle   := ControlStyle - [csSetCaption,csAcceptsControls];
  417.    FMarkerList    := nil;
  418.    FMarkerAMap    := nil;
  419.    FMarkerBMap    := nil;
  420.    FLocatorMap    := nil;
  421.    FShowHints     := ShowHint;
  422.    FOriginalCursor:= Cursor;
  423.    FCanUpdate     := True;
  424.    FAutoScroll    := True;
  425.    FMarkerShift   := mkNone;
  426.    FUseHelpLocator:= True;
  427.    FUseLocator    := False;
  428.    FUseMarkers    := False;
  429.    FCorralLocator := True;
  430.    FRangeMinX     := 0;
  431.    FRangeMaxX     := 1000;
  432.    FRangeMinY     := 0;
  433.    FRangeMaxY     := 1000;
  434.    FBaseY         := 500;
  435.    FDispMinX      := 0;
  436.    FDispMaxX      := 1000;
  437.    FDispMinY      := 0;
  438.    FDispMaxY      := 1000;
  439.    FGridWidthX    := 100;
  440.    FGridWidthY    := 100;
  441.    FSnapToGrid    := False;
  442.    FSnapRange     := 3;
  443.    FHelpLocator   := -1;
  444.    FLastHelpLoc   := -1;
  445.    FHelpLocColor  := clSilver;
  446.    FLocator       := -1;
  447.    FLastLoc       := -1;
  448.    FLocColor      := clLime;
  449.    FMarkerA       := -1;
  450.    FLastMarkA     := -1;
  451.    FMarkAColor    := clRed;
  452.    FMarkerB       := -1;
  453.    FLastMarkB     := -1;
  454.    FMarkBColor    := clRed;
  455.    FGridColor     := clGray;
  456.    FDrawSolid     := False;
  457.    FDrawGriff     := False;
  458.    FDrawGridX     := False;
  459.    FDrawGridY     := False;
  460.    FDragging      := False;
  461.    UseLocator     := True;
  462.    FLocked        := False;
  463.    FDefaultHint   := '';
  464.    ErrorCode := ComponentRegistered(InitCode, Self, ClassName);
  465.    if (ErrorCode <> 0) then RegisterFailed(InitCode, Self , ClassName);
  466. end;
  467. {-- TMMCustomMarkerPanel ------------------------------------------------}
  468. destructor TMMCustomMarkerPanel.Destroy;
  469. begin
  470.    if assigned(FLocatorMap) then FLocatorMap.Free;
  471.    if assigned(FMarkerAMap) then FMarkerAMap.Free;
  472.    if assigned(FMarkerBMap) then FMarkerBMap.Free;
  473.    FMarkerList := nil;
  474.    inherited Destroy;
  475. end;
  476. {-- TMMCustomMarkerPanel ------------------------------------------------}
  477. procedure TMMCustomMarkerPanel.SetMarkerList(aList: TMMMarkerList);
  478. begin
  479.    FMarkerList := aList;
  480.    Invalidate;
  481. end;
  482. {-- TMMCustomMarkerPanel ------------------------------------------------}
  483. procedure TMMCustomMarkerPanel.SetRangeMinX(aValue: Longint);
  484. begin
  485.    SetRangeAll(aValue, FRangeMaxX, FRangeMinY, FRangeMaxY, FBaseY);
  486. end;
  487. {-- TMMCustomMarkerPanel ------------------------------------------------}
  488. procedure TMMCustomMarkerPanel.SetRangeMaxX(aValue: Longint);
  489. begin
  490.    SetRangeAll(FRangeMinX, aValue, FRangeMinY, FRangeMaxY, FBaseY);
  491. end;
  492. {-- TMMCustomMarkerPanel ------------------------------------------------}
  493. procedure TMMCustomMarkerPanel.SetRangeMinY(aValue: Longint);
  494. begin
  495.    SetRangeAll(FRangeMinX, FRangeMaxX, aValue, FRangeMaxY, FBaseY);
  496. end;
  497. {-- TMMCustomMarkerPanel ------------------------------------------------}
  498. procedure TMMCustomMarkerPanel.SetRangeMaxY(aValue: Longint);
  499. begin
  500.    SetRangeAll(FRangeMinX, FRangeMaxX, FRangeMinY, aValue, FBaseY);
  501. end;
  502. {-- TMMCustomMarkerPanel ------------------------------------------------}
  503. procedure TMMCustomMarkerPanel.SetBaseY(aValue: Longint);
  504. begin
  505.    SetRangeAll(FRangeMinX, FRangeMaxX, FRangeMinY, FRangeMaxY, aValue);
  506. end;
  507. {-- TMMCustomMarkerPanel ------------------------------------------------}
  508. procedure TMMCustomMarkerPanel.SetRangeAll(MinX, MaxX, MinY, MaxY, YBase: Longint);
  509. begin
  510.    if (MinX > MaxX) then SwapLong(MinX, MaxX);
  511.    if (MinY > MaxY) then SwapLong(MinY, MaxY);
  512.    if (MinX <> FRangeMinX) or (MaxX <> FRangeMaxX) or
  513.       (MinY <> FRangeMinY) or (MaxY <> FRangeMaxY) or
  514.       (YBase <> FBaseY) then
  515.    begin
  516.       FRangeMinX := MinX;
  517.       FRangeMaxX := Max(MaxX,MinX+1);
  518.       FRangeMinY := MinY;
  519.       FRangeMaxY := Max(MaxY,MinY+1);
  520.       FBaseY := Limit(YBase, FRangeMinY, FRangeMaxY);
  521.       SetDispAll(Limit(FDispMinX, FRangeMinX, FRangeMaxX),
  522.                  Max(Limit(FDispMaxX, FRangeMinX, FRangeMaxX),FDispMinX+1),
  523.                  Limit(FDispMinY, FRangeMinY, FRangeMaxY),
  524.                  Max(Limit(FDispMaxY, FRangeMinY, FRangeMaxY),FDispMinY+1));
  525.       Invalidate;
  526.    end;
  527.    {$IFDEF WIN32}
  528.    {$IFDEF TRIAL}
  529.    {$DEFINE _HACK1}
  530.    {$I MMHACK.INC}
  531.    {$ENDIF}
  532.     {$ENDIF}
  533. end;
  534. {-- TMMCustomMarkerPanel ------------------------------------------------}
  535. procedure TMMCustomMarkerPanel.SetDispMinX(aValue: Longint);
  536. begin
  537.    SetDispAll(aValue,FDispMaxX, FDispMinY, FDispMaxY);
  538. end;
  539. {-- TMMCustomMarkerPanel ------------------------------------------------}
  540. procedure TMMCustomMarkerPanel.SetDispMaxX(aValue: Longint);
  541. begin
  542.    SetDispAll(FDispMinX,aValue,FDispMinY,FDispMaxY);
  543. end;
  544. {-- TMMCustomMarkerPanel ------------------------------------------------}
  545. procedure TMMCustomMarkerPanel.SetDispMinY(aValue: Longint);
  546. begin
  547.    SetDispAll(FDispMinX,FDispMaxX, aValue, FDispMaxY);
  548. end;
  549. {-- TMMCustomMarkerPanel ------------------------------------------------}
  550. procedure TMMCustomMarkerPanel.SetDispMaxY(aValue: Longint);
  551. begin
  552.    SetDispAll(FDispMinX,FDispMaxX,FDispMinY,aValue);
  553. end;
  554. {-- TMMCustomMarkerPanel ------------------------------------------------}
  555. procedure TMMCustomMarkerPanel.SetMinMax(Min, Max: Longint);
  556. begin
  557.    SetDispAll(Min,Max,FDispMinY,FDispMaxY);
  558. end;
  559. {-- TMMCustomMarkerPanel ------------------------------------------------}
  560. procedure TMMCustomMarkerPanel.SetMinMaxY(Min, Max: Longint);
  561. begin
  562.    SetDispAll(FDispMinX,FDispMaxX,Min,Max);
  563. end;
  564. {-- TMMCustomMarkerPanel ------------------------------------------------}
  565. procedure TMMCustomMarkerPanel.SetDispAll(MinX, MaxX, MinY, MaxY: Longint);
  566. begin
  567.    if (MinX > MaxX) then SwapLong(MinX, MaxX);
  568.    if (MinY > MaxY) then SwapLong(MinY, MaxY);
  569.    if (MinX <> FDispMinX) or (MaxX <> FDispMaxX) or
  570.       (MinY <> FDispMinY) or (MaxY <> FDispMaxY) then
  571.    begin
  572.       CheckRange(MinX,MaxX,FRangeMinX,FRAngeMaxX,Width-2*BevelExtend);
  573.       FDispMinX := MinX;
  574.       FDispMaxX := MaxX;
  575.       CheckRange(MinY,MaxY,FRangeMinY,FRangeMaxY,Height-2*BevelExtend);
  576.       FDispMinY := MinY;
  577.       FDispMaxY := MaxY;
  578.       RangeChanged;
  579.    end;
  580.    {$IFDEF WIN32}
  581.    {$IFDEF TRIAL}
  582.    {$DEFINE _HACK2}
  583.    {$I MMHACK.INC}
  584.    {$ENDIF}
  585.    {$ENDIF}
  586. end;
  587. {-- TMMCustomMarkerPanel ------------------------------------------------}
  588. function TMMCustomMarkerPanel.AdjustVisibleRange(Value: Longint): Boolean;
  589. var
  590.    min, max: Longint;
  591.    pixel: integer;
  592.    aPos: TPoint;
  593. begin
  594.    Result := False;
  595.    { pa遲 den sichtbaren Bereich aller Elemente an (scrolling) }
  596.    if (Value >= RangeMinX) then
  597.    begin
  598.       pixel := X_ToPixel(Value);
  599.       if (pixel > Width-BevelExtend-5) and (DispMaxX < RangeMaxX) then
  600.       begin
  601.          max := limit(Value+(DispMaxX-DispMinX)div 2,RangeMinX,RangeMaxX);
  602.          min := max-(DispMaxX-DispMinX);
  603.          SetMinMax(min, max);
  604.          Update;
  605.          GetCursorPos(aPos);
  606.          aPos.X := ClientToScreen(Point(X_ToPixel(Value),0)).X;
  607.          SetCursorPos(aPos.X,aPos.Y);
  608.          Result := True;
  609.       end
  610.       else if (pixel < BevelExtend+5) and (DispMinX > RangeMinX) then
  611.       begin
  612.          min := limit(Value-(DispMaxX-DispMinX)div 2,RangeMinX,RangeMaxX);
  613.          max := min+(DispMaxX-DispMinX);
  614.          SetMinMax(min, max);
  615.          Update;
  616.          GetCursorPos(aPos);
  617.          aPos.X := ClientToScreen(Point(X_ToPixel(Value),0)).X;
  618.          SetCursorPos(aPos.X,aPos.Y);
  619.          Result := True
  620.       end;
  621.    end;
  622. end;
  623. {-- TMMCustomMarkerPanel ------------------------------------------------}
  624. procedure TMMCustomMarkerPanel.CheckRange(var lMin,lMax: Longint; MinRange,MaxRange,MinDistance: Longint);
  625. var
  626.    Diff: Longint;
  627. begin
  628.    if (lMax < lMin) then SwapLong(lMax,lMin);
  629.    lMax := Max(lMax, lMin+MinDistance);
  630.    if (lMax > MaxRange) then
  631.    begin
  632.       Diff := lMax-lMin;
  633.       lMax := MaxRange;
  634.       lMin := Max(lMax-Diff,MinRange);
  635.    end
  636.    else if (lMin < MinRange) then
  637.    begin
  638.       Diff := lMax-lMin;
  639.       lMin := MinRange;
  640.       lMax := Min(lMin+Diff,MaxRange);
  641.    end;
  642.    {$IFDEF WIN32}
  643.    {$IFDEF TRIAL}
  644.    {$DEFINE _HACK3}
  645.    {$I MMHACK.INC}
  646.    {$ENDIF}
  647.    {$ENDIF}
  648. end;
  649. {-- TMMCustomMarkerPanel ------------------------------------------------}
  650. function TMMCustomMarkerPanel.X_ToPixelNoLimit(X_Value: Longint): Longint;
  651. begin
  652. {$IFDEF FLOATCALC}
  653.    Result := BevelExtend+Round((X_Value-DispMinX)/(DispMaxX-DispMinX)*((Width-2*BevelExtend)-1));
  654. {$ELSE}
  655.    Result := BevelExtend+MulDiv32(X_Value-DispMinX,(Width-2*BevelExtend)-1,DispMaxX-DispMinX);
  656. {$ENDIF}
  657. end;
  658. {-- TMMCustomMarkerPanel ------------------------------------------------}
  659. function TMMCustomMarkerPanel.X_ToPixel(X_Value: Longint): integer;
  660. begin
  661.    Result := Limit(X_ToPixelNoLimit(X_Value),-16384,16384);
  662. end;
  663. {-- TMMCustomMarkerPanel ------------------------------------------------}
  664. function TMMCustomMarkerPanel.PixelTo_X(X: integer): Longint;
  665. begin
  666. {$IFDEF FLOATCALC}
  667.    Result := Round((X-BevelExtend)/((Width-2*BevelExtend)-1)*(DispMaxX-DispMinX))+DispMinX;
  668. {$ELSE}
  669.    Result := MulDiv32(X-BevelExtend,DispMaxX-DispMinX,(Width-2*BevelExtend)-1)+DispMinX;
  670. {$ENDIF}
  671. end;
  672. {-- TMMCustomMarkerPanel ------------------------------------------------}
  673. function TMMCustomMarkerPanel.Y_ToPixelNoLimit(Y_Value: Longint): Longint;
  674. begin
  675. {$IFDEF FLOATCALC}
  676.    Result := ((Height-BevelExtend)-1)-Round((Y_Value-DispMinY)/(DispMaxY-DispMinY)*((Height-2*BevelExtend)-1));
  677. {$ELSE}
  678.    Result := ((Height-BevelExtend)-1)-MulDiv32(Y_Value-DispMinY,(Height-2*BevelExtend)-1,DispMaxY-DispMinY);
  679. {$ENDIF}
  680. end;
  681. {-- TMMCustomMarkerPanel ------------------------------------------------}
  682. function TMMCustomMarkerPanel.Y_ToPixel(Y_Value: Longint): integer;
  683. begin
  684.    Result := Limit(Y_ToPixelNoLimit(Y_Value),-16384,16384);
  685. end;
  686. {-- TMMCustomMarkerPanel ------------------------------------------------}
  687. function TMMCustomMarkerPanel.PixelTo_Y(Y: integer): Longint;
  688. begin
  689. {$IFDEF FLOATCALC}
  690.    Result := Round((((Height-BevelExtend)-1)-Y)/((Height-2*BevelExtend)-1)*(DispMaxY-DispMinY))+DispMinY;
  691. {$ELSE}
  692.    Result := MulDiv32(((Height-BevelExtend)-1)-Y,DispMaxY-DispMinY,(Height-2*BevelExtend)-1)+DispMinY;
  693. {$ENDIF}
  694. end;
  695. {-- TMMCustomMarkerPanel ------------------------------------------------}
  696. procedure TMMCustomMarkerPanel.SetColors(Index: integer; aValue: TColor);
  697. begin
  698.    case Index of
  699.         0: if FHelpLocColor = aValue then exit else FHelpLocColor := aValue;
  700.         1: if FLocColor = aValue then exit else FLocColor := aValue;
  701.         2: if FMarkAColor = aValue then exit else FMarkAColor := aValue;
  702.         3: if FMarkBColor = aValue then exit else FMarkBColor := aValue;
  703.         4: if FGridColor = aValue then exit else FGridColor := aValue;
  704.    end;
  705.    Perform(CM_COLORCHANGED, 0, 0);
  706. end;
  707. {-- TMMCustomMarkerPanel ------------------------------------------------}
  708. procedure TMMCustomMarkerPanel.SetGridWidthX(aValue: Float);
  709. begin
  710.    if (aValue <> FGridWidthX) then
  711.    begin
  712.       if (aValue <= 0) then aValue := 1;
  713.       FGridWidthX := aValue;
  714.       Invalidate;
  715.    end;
  716. end;
  717. {-- TMMCustomMarkerPanel ------------------------------------------------}
  718. procedure TMMCustomMarkerPanel.SetGridWidthY(aValue: Float);
  719. begin
  720.    if (aValue <> FGridWidthY) then
  721.    begin
  722.       if (aValue <= 0) then aValue := 1;
  723.       FGridWidthY := aValue;
  724.       Invalidate;
  725.    end;
  726. end;
  727. {-- TMMCustomMarkerPanel ------------------------------------------------}
  728. procedure TMMCustomMarkerPanel.SetHelpLocator(aValue: Longint);
  729. begin
  730.    if (aValue <> FHelpLocator) then
  731.    begin
  732.       FHelpLocator := aValue;
  733.       if (X_ToPixel(FHelpLocator) <> FLastHelpLoc) then
  734.       begin
  735.          DrawHelpLocator(Canvas, FLastHelpLoc);
  736.       end;
  737.    end;
  738. end;
  739. {-- TMMCustomMarkerPanel ------------------------------------------------}
  740. procedure TMMCustomMarkerPanel.SetLocator(aValue: Longint);
  741. begin
  742.    if (aValue <> FLocator) then
  743.    begin
  744.       if FUseMarkers and FCorralLocator then
  745.       begin
  746.          if (FMarkerA >= 0) then aValue := Max(aValue,FMarkerA);
  747.          if (FMarkerB >= 0) then aValue := Min(aValue,FMarkerB);
  748.       end;
  749.       FLocator := aValue;
  750.       if (X_ToPixel(FLocator) <> FLastLoc) then
  751.       begin
  752.          DrawLocator(Canvas, FLastLoc);
  753.       end;
  754.    end;
  755. end;
  756. {-- TMMCustomMarkerPanel ------------------------------------------------}
  757. procedure TMMCustomMarkerPanel.SetMarkerA(aValue: Longint);
  758. begin
  759.    if (aValue <> FMarkerA) then
  760.    begin
  761.       if FUseLocator and FCorralLocator and (FLocator > 0) then
  762.          aValue := Min(aValue,FLocator-1)
  763.       else if (FMarkerB > 0) then
  764.          aValue := Min(aValue,FMarkerB-1);
  765.       FMarkerA := aValue;
  766.       if (X_ToPixel(FMarkerA) <> FLastMarkA) then
  767.       begin
  768.          DrawMarkerA(Canvas, FLastMarkA);
  769.       end;
  770.    end;
  771. end;
  772. {-- TMMCustomMarkerPanel ------------------------------------------------}
  773. procedure TMMCustomMarkerPanel.SetMarkerB(aValue: Longint);
  774. begin
  775.    if (aValue <> FMarkerB) then
  776.    begin
  777.       if FUseLocator and FCorralLocator and (FLocator >= 0) then
  778.          aValue := Max(aValue,FLocator+1)
  779.       else if (FMarkerA >= 0) then
  780.          aValue := Max(aValue,FMarkerA+1);
  781.       FMarkerB := aValue;
  782.       if (X_ToPixel(FMarkerB) <> FLastMarkB) then
  783.       begin
  784.          DrawMarkerB(Canvas, FLastMarkB);
  785.       end;
  786.    end;
  787. end;
  788. {-- TMMCustomMarkerPanel ------------------------------------------------}
  789. procedure TMMCustomMarkerPanel.DrawListMarkers(aCanvas: TCanvas);
  790. var
  791.    i,i2,von,bis: integer;
  792.    Loc,OldLoc,Mode: integer;
  793. begin
  794.    if (FMarkerList <> nil) and (FMarkerList.Count > 0) then
  795.    with FMarkerList do
  796.    begin
  797.       von := LocateMarker(DispMinX-1)-2; { first marker to draw }
  798.       bis := LocateMarker(DispMaxX);     { last marker to draw  }
  799.       for i := von to bis do
  800.       if inRange(i,0,Count-1) then
  801.       begin
  802.          if Markers[i]^.Visible then
  803.          begin
  804.             OldLoc := -1;
  805.             Loc:= X_ToPixel(Markers[i]^.Offset);
  806.             i2 := FindConnectedMarker(i);
  807.             if (i2 >= 0) then
  808.             begin
  809.                if Markers[i]^.Offset < Markers[i2]^.Offset then
  810.                   Mode := 5
  811.                else
  812.                   Mode := 6;
  813.             end
  814.             else Mode := 4;
  815.             DrawAsSolid(aCanvas, 0, Mode, Loc, OldLoc, True, Markers[i]^.Color);
  816.          end;
  817.       end;
  818.    end;
  819. end;
  820. {-- TMMCustomMarkerPanel ------------------------------------------------}
  821. procedure TMMCustomMarkerPanel.DrawAllMarkers(aCanvas: TCanvas);
  822. begin
  823.    DrawListMarkers(aCanvas);
  824.    if FUseMarkers then
  825.    begin
  826.       FLastMarkA := -1;
  827.       DrawMarkerA(aCanvas, FLastMarkA);
  828.       FLastMarkB := -1;
  829.       DrawMarkerB(aCanvas, FLastMarkB);
  830.    end;
  831.    if FUseLocator then
  832.    begin
  833.       FLastLoc := -1;
  834.       DrawLocator(aCanvas, FLastLoc);
  835.    end;
  836.    if FUseHelpLocator then
  837.    begin
  838.       FLastHelpLoc := -1;
  839.       DrawHelpLocator(aCanvas, FLastHelpLoc);
  840.    end;
  841. end;
  842. {-- TMMCustomMarkerPanel ------------------------------------------------}
  843. procedure TMMCustomMarkerPanel.DrawHelpLocator(aCanvas: TCanvas; var LastLoc: integer);
  844. var
  845.    Loc: integer;
  846. begin
  847.    if FUseHelpLocator then
  848.    begin
  849.       if (FHelpLocator >= 0) then
  850.          Loc := X_ToPixel(FHelpLocator)
  851.       else
  852.          Loc := FHelpLocator;
  853.       DrawAsXOR(aCanvas, 3, Loc, LastLoc, True, FHelpLocColor);
  854.    end;
  855. end;
  856. {-- TMMCustomMarkerPanel ------------------------------------------------}
  857. procedure TMMCustomMarkerPanel.DrawLocator(aCanvas: TCanvas; var LastLoc: integer);
  858. var
  859.    Loc: integer;
  860. begin
  861.    if FUseLocator then
  862.    begin
  863.       if (FLocator >= 0) then
  864.          Loc := X_ToPixel(FLocator)
  865.       else
  866.          Loc := FLocator;
  867.       if FDrawSolid then
  868.          DrawAsSolid(aCanvas, FLocatorMap.Canvas.Handle, 0, Loc, LastLoc, False, FLocColor)
  869.       else
  870.          DrawAsXOR(aCanvas, 0, Loc, LastLoc, False, FLocColor);
  871.    end;
  872. end;
  873. {-- TMMCustomMarkerPanel ------------------------------------------------}
  874. procedure TMMCustomMarkerPanel.DrawMarkerA(aCanvas: TCanvas; var LastLoc: integer);
  875. var
  876.    Loc: integer;
  877. begin
  878.    if FUseMarkers then
  879.    begin
  880.       if (FMarkerA >= 0) then
  881.           Loc := Min(X_ToPixel(FMarkerA),X_ToPixel(FMarkerB)-1)
  882.       else
  883.           Loc := FMarkerA;
  884.       if FDrawSolid then
  885.          DrawAsSolid(aCanvas,FMarkerAMap.Canvas.Handle, 1, Loc, LastLoc, False, FMarkAColor)
  886.       else
  887.          DrawAsXOR(aCanvas, 1, Loc, LastLoc, False, FMarkAColor);
  888.    end;
  889. end;
  890. {-- TMMCustomMarkerPanel ------------------------------------------------}
  891. procedure TMMCustomMarkerPanel.DrawMarkerB(aCanvas: TCanvas; var LastLoc: integer);
  892. var
  893.    Loc: integer;
  894. begin
  895.    if FUseMarkers then
  896.    begin
  897.       if (FMarkerB >= 0) then
  898.          Loc := Max(X_ToPixel(FMarkerA)+1,X_ToPixel(FMarkerB))
  899.       else
  900.          Loc := FMarkerB;
  901.       if FDrawSolid then
  902.          DrawAsSolid(aCanvas,FMarkerBMap.Canvas.Handle, 2, Loc, LastLoc, False, FMarkBColor)
  903.       else
  904.          DrawAsXOR(aCanvas, 2, Loc, LastLoc, False, FMarkBColor);
  905.    end;
  906. end;
  907. {-- TMMCustomMarkerPanel ------------------------------------------------}
  908. procedure TMMCustomMarkerPanel.DrawMarkerGriff(aCanvas: TCanvas; Loc,Mode: integer);
  909.    procedure SaveRectangle(X1,Y1,X2,Y2: integer);
  910.    var
  911.       i: integer;
  912.    begin
  913.       if Y2 < Y1 then SwapInt(Y1,Y2);
  914.       with aCanvas do
  915.       for i := 0 to (Y2-Y1)-1 do
  916.       begin
  917.          MoveTo(X1,Y1+i);
  918.          LineTo(X2,Y1+i);
  919.       end;
  920.    end;
  921. begin
  922.    with aCanvas do
  923.    begin
  924.       case Mode of
  925.          0: begin
  926.                { draw Locator }
  927.                MoveTo(Loc,BevelExtend+9);
  928.                LineTo(Loc,Height);
  929.                { draw griff }
  930.                MoveTo(Loc-4,BevelExtend+5);
  931.                LineTo(Loc+5,BevelExtend+5);
  932.                MoveTo(Loc-3,BevelExtend+6);
  933.                LineTo(Loc+4,BevelExtend+6);
  934.                MoveTo(Loc-2,BevelExtend+7);
  935.                LineTo(Loc+3,BevelExtend+7);
  936.                MoveTo(Loc-1,BevelExtend+8);
  937.                LineTo(Loc+2,BevelExtend+8);
  938.             end;
  939.          1: begin
  940.                { draw Marker A }
  941.                MoveTo(Loc,BevelExtend+1);
  942.                LineTo(Loc,Height);
  943.                { draw griff }
  944.                MoveTo(Loc+1,BevelExtend+2);
  945.                LineTo(Loc+2,BevelExtend+2);
  946.                MoveTo(Loc+1,BevelExtend+3);
  947.                LineTo(Loc+3,BevelExtend+3);
  948.                MoveTo(Loc+1,BevelExtend+4);
  949.                LineTo(Loc+4,BevelExtend+4);
  950.                MoveTo(Loc+1,BevelExtend+5);
  951.                LineTo(Loc+5,BevelExtend+5);
  952.                MoveTo(Loc+1,BevelExtend+6);
  953.                LineTo(Loc+4,BevelExtend+6);
  954.                MoveTo(Loc+1,BevelExtend+7);
  955.                LineTo(Loc+3,BevelExtend+7);
  956.                MoveTo(Loc+1,BevelExtend+8);
  957.                LineTo(Loc+2,BevelExtend+8);
  958.             end;
  959.          2: begin
  960.                { draw Marker B }
  961.                MoveTo(Loc,BevelExtend+1);
  962.                LineTo(Loc,Height);
  963.                { draw griff }
  964.                MoveTo(Loc-1,BevelExtend+2);
  965.                LineTo(Loc-2,BevelExtend+2);
  966.                MoveTo(Loc-1,BevelExtend+3);
  967.                LineTo(Loc-3,BevelExtend+3);
  968.                MoveTo(Loc-1,BevelExtend+4);
  969.                LineTo(Loc-4,BevelExtend+4);
  970.                MoveTo(Loc-1,BevelExtend+5);
  971.                LineTo(Loc-5,BevelExtend+5);
  972.                MoveTo(Loc-1,BevelExtend+6);
  973.                LineTo(Loc-4,BevelExtend+6);
  974.                MoveTo(Loc-1,BevelExtend+7);
  975.                LineTo(Loc-3,BevelExtend+7);
  976.                MoveTo(Loc-1,BevelExtend+8);
  977.                LineTo(Loc-2,BevelExtend+8);
  978.             end;
  979.    3,4,5,6: begin
  980.                { draw List-Marker }
  981.                MoveTo(Loc,BevelExtend+9);
  982.                LineTo(Loc,Height);
  983.                { draw griff }
  984.                SaveRectangle(Loc-3,BevelExtend+2,Loc+4,BevelExtend+7);
  985.                MoveTo(Loc-2,BevelExtend+7);
  986.                LineTo(Loc+3,BevelExtend+7);
  987.                MoveTo(Loc-1,BevelExtend+8);
  988.                LineTo(Loc+2,BevelExtend+8);
  989.                case Mode of
  990.                  4: begin
  991.                        Pen.Color := clBlack;
  992.                        MoveTo(Loc-1,BevelExtend+3);
  993.                        LineTo(Loc+2,BevelExtend+3);
  994.                        MoveTo(Loc,BevelExtend+4);
  995.                        LineTo(Loc,BevelExtend+7);
  996.                     end;
  997.                  5: begin
  998.                        Pen.Color := clBlack;
  999.                        MoveTo(Loc-1,BevelExtend+3);
  1000.                        LineTo(Loc+2,BevelExtend+3);
  1001.                        MoveTo(Loc-1,BevelExtend+4);
  1002.                        LineTo(Loc-1,BevelExtend+6);
  1003.                     end;
  1004.                  6: begin
  1005.                        Pen.Color := clBlack;
  1006.                        MoveTo(Loc-1,BevelExtend+3);
  1007.                        LineTo(Loc+2,BevelExtend+3);
  1008.                        MoveTo(Loc+1,BevelExtend+4);
  1009.                        LineTo(Loc+1,BevelExtend+6);
  1010.                     end;
  1011.                end;
  1012.            end;
  1013.       end;
  1014.    end;
  1015. end;
  1016. {-- TMMCustomMarkerPanel ------------------------------------------------}
  1017. procedure TMMCustomMarkerPanel.DrawAsSolid(aCanvas: TCanvas; MemDC: HDC;
  1018.                                            Mode, Loc: integer;
  1019.                                            var LastLoc: integer; Doted: Boolean;
  1020.                                            aColor: TColor);
  1021. var
  1022.    DC: HDC;
  1023. begin
  1024.    if not (csDesigning in ComponentState) and not Visible then exit;
  1025.    {$IFDEF DELPHI3}
  1026.    aCanvas.Lock;
  1027.    try
  1028.    {$ENDIF}
  1029.       aCanvas.Pen.Width := 1;
  1030.       aCanvas.Pen.Color := aColor;
  1031.       if FDrawGriff then
  1032.       begin
  1033.          aCanvas.Brush.Color := aColor;
  1034.          aCanvas.Brush.Style := bsSolid;
  1035.          IntersectClipRect(aCanvas.Handle,BevelExtend,1,Width-BevelExtend,Height);
  1036.          { clear old griff }
  1037.          if (LastLoc <> -1) and (MemDC <> 0) then
  1038.          begin
  1039.             { draw saved bitmap }
  1040.             BitBlt(aCanvas.Handle, LastLoc-5, 0, GriffWidth, Height,
  1041.                    MemDC, 0,0, SrcCopy);
  1042.          end;
  1043.          if inRange(Loc,BevelExtend,Width-BevelExtend-1) then
  1044.          begin
  1045.             { save background in bitmap and draw new griff }
  1046.             if (MemDC <> 0) then
  1047.                 BitBlt(MemDC, 0, 0, GriffWidth, Height,
  1048.                        aCanvas.Handle, Loc-5,0, SrcCopy);
  1049.             DrawMarkerGriff(aCanvas,Loc,Mode);
  1050.             LastLoc := Loc;
  1051.          end
  1052.          else LastLoc := -1;
  1053.       end
  1054.       else
  1055.       begin
  1056.          if Doted then
  1057.          begin
  1058.             aCanvas.Pen.Style := psDot;
  1059.             SetBkMode(aCanvas.Handle,TRANSPARENT);
  1060.          end;
  1061.          { Reduce calls to GetHandle }
  1062.          DC := aCanvas.Handle;
  1063.          { clear old locator }
  1064.          if (LastLoc <> -1) and (MemDC <> 0) then
  1065.          begin
  1066.             { restore background }
  1067.             BitBlt(DC, LastLoc, 0, 1, Height,
  1068.                    MemDC, 0, 0, SrcCopy);
  1069.          end;
  1070.          if inRange(Loc,BevelExtend,Width-BevelExtend-1) then
  1071.          begin
  1072.             { save background and draw new locator }
  1073.             if (MemDC <> 0) then
  1074.                 BitBlt(MemDC, 0, 0, 1, Height,
  1075.                        DC, Loc,0, srcCopy);
  1076.             if Doted then
  1077.             begin
  1078.                VLineDoted(aCanvas,Loc,0,Height, ColorToRGB(aColor));
  1079.             end
  1080.             else
  1081.             begin
  1082.                MoveToEx(DC,Loc,0,nil);
  1083.                LineTo(DC,Loc,Height);
  1084.             end;
  1085.             LastLoc := Loc;
  1086.          end
  1087.          else LastLoc := -1;
  1088.          aCanvas.Pen.Style := psSolid;
  1089.          SetBkMode(aCanvas.Handle,OPAQUE);
  1090.       end;
  1091.    {$IFDEF DELPHI3}
  1092.    finally
  1093.       aCanvas.Unlock;
  1094.    end;
  1095.    {$ENDIF}
  1096. end;
  1097. {-- TMMCustomMarkerPanel ------------------------------------------------}
  1098. procedure TMMCustomMarkerPanel.DrawAsXOR(aCanvas: TCanvas; Mode, Loc: integer;
  1099.                                    var LastLoc: integer; Doted: Boolean;
  1100.                                    aColor: TColor);
  1101. begin
  1102.    if not (csDesigning in ComponentState) and not Visible then exit;
  1103.    {$IFDEF DELPHI3}
  1104.    aCanvas.Lock;
  1105.    try
  1106.    {$ENDIF}
  1107.       with aCanvas do
  1108.       begin
  1109.          Pen.Width := 1;
  1110.          Pen.Mode := pmXor;
  1111.          Pen.Color := aColor;
  1112.          if FDrawGriff then
  1113.          begin
  1114.             IntersectClipRect(Canvas.Handle,BevelExtend,0,Width-BevelExtend,Height);
  1115.             { clear old griff }
  1116.             Brush.Color := aColor;
  1117.             Brush.Style := bsSolid;
  1118.             if LastLoc <> -1 then
  1119.             begin
  1120.                { delete old marker }
  1121.                DrawMarkerGriff(aCanvas,LastLoc,Mode);
  1122.             end;
  1123.             if inRange(Loc,BevelExtend,Width-BevelExtend-1) then
  1124.             begin
  1125.                { draw new marker }
  1126.                DrawMarkerGriff(aCanvas,Loc,Mode);
  1127.                LastLoc := Loc;
  1128.             end
  1129.             else LastLoc := -1;
  1130.          end
  1131.          else
  1132.          begin
  1133.             if Doted then
  1134.             begin
  1135.                Pen.Style := psDot;
  1136.                SetBkMode(Handle,TRANSPARENT);
  1137.             end;
  1138.             { alten Locator l鰏chen }
  1139.             if (LastLoc <> -1) then
  1140.             begin
  1141.                MoveTo(LastLoc, 0);
  1142.                LineTo(LastLoc, Height);
  1143.             end;
  1144.             if inRange(Loc,BevelExtend,Width-BevelExtend-1) then
  1145.             begin
  1146.                { neuen Locator zeicnen }
  1147.                MoveTo(Loc,0);
  1148.                LineTo(Loc,Height);
  1149.                LastLoc := Loc;
  1150.             end
  1151.             else LastLoc := -1;
  1152.          end;
  1153.          Pen.Mode := pmCopy;
  1154.          Pen.Style := psSolid;
  1155.          SetBkMode(Handle,OPAQUE);
  1156.       end;
  1157.    {$IFDEF DELPHI3}
  1158.    finally
  1159.       aCanvas.Unlock;
  1160.    end;
  1161.    {$ENDIF}
  1162. end;
  1163. {-- TMMCustomMarkerPanel ------------------------------------------------}
  1164. procedure TMMCustomMarkerPanel.AdjustBitmaps;
  1165. begin
  1166.    if FDrawSolid then
  1167.    begin
  1168.       if FDrawGriff then
  1169.       begin
  1170.          if FUseLocator then
  1171.          begin
  1172.             if not assigned(FLocatorMap) then FLocatorMap := TBitmap.Create;
  1173.             FLocatorMap.Width := GriffWidth;
  1174.             FLocatorMap.Height := Height;
  1175.             FLastLoc := -1;
  1176.          end;
  1177.          if FUseMarkers then
  1178.          begin
  1179.             if not assigned(FMarkerAMap) then FMarkerAMap := TBitmap.Create;
  1180.             if not assigned(FMarkerBMap) then FMarkerBMap := TBitmap.Create;
  1181.             FMarkerAMap.Width := GriffWidth;
  1182.             FMarkerBMap.Width := GriffWidth;
  1183.             FMarkerAMap.Height := Height;
  1184.             FMarkerBMap.Height := Height;
  1185.             FLastMarkA := -1;
  1186.             FLastMarkB := -1;
  1187.          end;
  1188.       end
  1189.       else
  1190.       begin
  1191.          if FUseLocator then
  1192.          begin
  1193.             if not assigned(FLocatorMap) then FLocatorMap := TBitmap.Create;
  1194.             FLocatorMap.Width := 1;
  1195.             FLocatorMap.Height := Height;
  1196.             FLastLoc := -1;
  1197.          end;
  1198.          if FUseMarkers then
  1199.          begin
  1200.             if not assigned(FMarkerAMap) then FMarkerAMap := TBitmap.Create;
  1201.             if not assigned(FMarkerBMap) then FMarkerBMap := TBitmap.Create;
  1202.             FMarkerAMap.Width := 1;
  1203.             FMarkerBMap.Width := 1;
  1204.             FMarkerAMap.Height := Height;
  1205.             FMarkerBMap.Height := Height;
  1206.             FLastMarkA := -1;
  1207.             FLastMarkB := -1;
  1208.          end;
  1209.       end;
  1210.    end;
  1211. end;
  1212. {-- TMMCustomMarkerPanel ------------------------------------------------}
  1213. procedure TMMCustomMarkerPanel.SetBounds(aLeft, aTop, aWidth, aHeight: integer);
  1214. var
  1215.    H: Integer;
  1216. begin
  1217.    H := Height;
  1218.    inherited SetBounds(aLeft, aTop, aWidth, aHeight);
  1219.    if (H <> Height) and (Height > 0) then
  1220.    begin
  1221.       AdjustBitmaps;
  1222.       Invalidate;
  1223.    end;
  1224. end;
  1225. {-- TMMCustomMarkerPanel ------------------------------------------------}
  1226. procedure TMMCustomMarkerPanel.SetDrawGriff(aValue: Boolean);
  1227. begin
  1228.    if (aValue <> FDrawGriff) then
  1229.    begin
  1230.       FDrawGriff := aValue;
  1231.       AdjustBitmaps;
  1232.       Invalidate;
  1233.    end;
  1234. end;
  1235. {-- TMMCustomMarkerPanel ------------------------------------------------}
  1236. procedure TMMCustomMarkerPanel.SetUseHelpLocator(aValue: Boolean);
  1237. begin
  1238.    if (aValue <> FUseHelpLocator) then
  1239.    begin
  1240.       FUseHelpLocator := aValue;
  1241.       Invalidate;
  1242.    end;
  1243. end;
  1244. {-- TMMCustomMarkerPanel ------------------------------------------------}
  1245. procedure TMMCustomMarkerPanel.SetUseLocator(aValue: Boolean);
  1246. begin
  1247.    if (aValue <> FUseLocator) then
  1248.    begin
  1249.       if assigned(FLocatorMap) then
  1250.       begin
  1251.          FLocatorMap.Free;
  1252.          FLocatorMap := nil;
  1253.       end;
  1254.       FUseLocator := aValue;
  1255.       AdjustBitmaps;
  1256.       Invalidate;
  1257.    end;
  1258. end;
  1259. {-- TMMCustomMarkerPanel ------------------------------------------------}
  1260. procedure TMMCustomMarkerPanel.SetUseMarkers(aValue: Boolean);
  1261. begin
  1262.    if (aValue <> FUseMarkers) then
  1263.    begin
  1264.       if assigned(FMarkerAMap) then
  1265.       begin
  1266.          FMarkerAMap.Free;
  1267.          FMarkerAMap := nil;
  1268.       end;
  1269.       if assigned(FMarkerBMap) then
  1270.       begin
  1271.          FMarkerBMap.Free;
  1272.          FMarkerBMap := nil;
  1273.       end;
  1274.       FUseMarkers := aValue;
  1275.       AdjustBitmaps;
  1276.       Invalidate;
  1277.    end;
  1278. end;
  1279. {-- TMMCustomMarkerPanel ------------------------------------------------}
  1280. procedure TMMCustomMarkerPanel.SetDrawSolid(aValue : boolean);
  1281. begin
  1282.    if aValue <> FDrawSolid then
  1283.    begin
  1284.       if assigned(FLocatorMap) then
  1285.       begin
  1286.          FLocatorMap.Free;
  1287.          FLocatorMap := nil;
  1288.       end;
  1289.       if assigned(FMarkerAMap) then
  1290.       begin
  1291.          FMarkerAMap.Free;
  1292.          FMarkerAMap := nil;
  1293.       end;
  1294.       if assigned(FMarkerBMap) then
  1295.       begin
  1296.          FMarkerBMap.Free;
  1297.          FMarkerBMap := nil;
  1298.       end;
  1299.       FDrawSolid := aValue;
  1300.       AdjustBitmaps;
  1301.       Invalidate;
  1302.    end;
  1303. end;
  1304. {-- TMMCustomMarkerPanel ------------------------------------------------}
  1305. procedure TMMCustomMarkerPanel.SetDrawGridX(aValue: Boolean);
  1306. begin
  1307.    if (aValue <> FDrawGridX) then
  1308.    begin
  1309.       FDrawGridX := aValue;
  1310.       Invalidate;
  1311.    end;
  1312. end;
  1313. {-- TMMCustomMarkerPanel ------------------------------------------------}
  1314. procedure TMMCustomMarkerPanel.SetDrawGridY(aValue: Boolean);
  1315. begin
  1316.    if (aValue <> FDrawGridY) then
  1317.    begin
  1318.       FDrawGridY := aValue;
  1319.       Invalidate;
  1320.    end;
  1321. end;
  1322. {-- TMMCustomMarkerPanel ------------------------------------------------}
  1323. procedure TMMCustomMarkerPanel.TrackBegin;
  1324. begin
  1325.    if assigned(FOnTrackBegin) then
  1326.       FOnTrackBegin(self);
  1327. end;
  1328. {-- TMMCustomMarkerPanel ------------------------------------------------}
  1329. procedure TMMCustomMarkerPanel.Track;
  1330. begin
  1331.    if assigned(FOnTrack) then
  1332.       FOnTrack(self);
  1333. end;
  1334. {-- TMMCustomMarkerPanel ------------------------------------------------}
  1335. procedure TMMCustomMarkerPanel.TrackEnd;
  1336. begin
  1337.    if assigned(FOnTrackEnd) then
  1338.       FOnTrackEnd(self);
  1339. end;
  1340. {-- TMMCustomMarkerPanel ------------------------------------------------}
  1341. procedure TMMCustomMarkerPanel.RangeChanged;
  1342. begin
  1343.    if not (csLoading in ComponentState) and assigned(FOnRangeChanged) then
  1344.       FOnRangeChanged(Self, FDispMinX, FDispMaxX);
  1345.    Invalidate;
  1346. end;
  1347. {-- TMMCustomMarkerPanel ------------------------------------------------}
  1348. procedure TMMCustomMarkerPanel.HelpLocatorChanged(Value: Longint);
  1349. begin
  1350.    if FAutoScroll and (FMarkerShift = mkListMarker) then
  1351.       AdjustVisibleRange(Value);
  1352.    if assigned(FOnHelpLocatorChanged) then
  1353.       FOnHelpLocatorChanged(Self, Value);
  1354.    SetHelpLocator(Value);
  1355. end;
  1356. {-- TMMCustomMarkerPanel ------------------------------------------------}
  1357. procedure TMMCustomMarkerPanel.LocatorChanged(Value: Longint);
  1358. begin
  1359.    if FAutoScroll then
  1360.       AdjustVisibleRange(Value);
  1361.    if assigned(FOnLocatorChanged) then
  1362.       FOnLocatorChanged(Self, Value);
  1363.    SetLocator(Value);
  1364. end;
  1365. {-- TMMCustomMarkerPanel ------------------------------------------------}
  1366. procedure TMMCustomMarkerPanel.MarkerAChanged(Value: Longint);
  1367. begin
  1368.    if FAutoScroll then
  1369.       AdjustVisibleRange(Value);
  1370.    if assigned(FOnMarkerAChanged) then
  1371.       FOnMarkerAChanged(Self, Value);
  1372.    SetMarkerA(Value);
  1373. end;
  1374. {-- TMMCustomMarkerPanel ------------------------------------------------}
  1375. procedure TMMCustomMarkerPanel.MarkerBChanged(Value: Longint);
  1376. begin
  1377.    if FAutoScroll then
  1378.       AdjustVisibleRange(Value);
  1379.    if assigned(FOnMarkerBChanged) then
  1380.       FOnMarkerBChanged(Self, Value);
  1381.    SetMarkerB(Value);
  1382. end;
  1383. {-- TMMCustomMarkerPanel ------------------------------------------------}
  1384. procedure TMMCustomMarkerPanel.MarkersChanged(Shift: TMarkerShift; ValueA, ValueB: Longint);
  1385. begin
  1386.    case Shift of
  1387.      mkMarkerAB:
  1388.      begin
  1389.          if FAutoScroll then
  1390.             AdjustVisibleRange(ValueA);
  1391.          if assigned(FOnMarkersChanged) then
  1392.             FOnMarkersChanged(Self, Shift, ValueA, ValueB);
  1393.          SetMarkerB(ValueB);
  1394.          SetMarkerA(ValueA);
  1395.       end;
  1396.       mkMarkerBA:
  1397.       begin
  1398.          if FAutoScroll then
  1399.             AdjustVisibleRange(ValueB);
  1400.          if assigned(FOnMarkersChanged) then
  1401.             FOnMarkersChanged(Self, Shift, ValueA, ValueB);
  1402.          SetMarkerA(ValueA);
  1403.          SetMarkerB(ValueB);
  1404.       end;
  1405.    end;
  1406. end;
  1407. {-- TMMCustomMarkerPanel ------------------------------------------------}
  1408. function TMMCustomMarkerPanel.IsAnyMarker(X: integer): Boolean;
  1409. begin
  1410.    Result := IsLocator(X) or IsMarkerA(X) or IsMarkerB(X) or IsListMarker(X);
  1411. end;
  1412. {-- TMMCustomMarkerPanel ------------------------------------------------}
  1413. function TMMCustomMarkerPanel.IsLocator(X: integer): Boolean;
  1414. var
  1415.    x1: Longint;
  1416. begin
  1417.    x1 := X_ToPixel(FLocator);
  1418.    Result := FUseLocator and (FLocator >= 0) and
  1419.              (X >= x1-SNAPRANGE) and
  1420.              (X <= x1+SNAPRANGE) and
  1421.              (X >= 0) and (X <= Width);
  1422. end;
  1423. {-- TMMCustomMarkerPanel ------------------------------------------------}
  1424. function TMMCustomMarkerPanel.IsMarkerA(X: integer): Boolean;
  1425. var
  1426.    x1: Longint;
  1427. begin
  1428.    x1 := X_ToPixel(FMarkerA);
  1429.    Result := FUseMarkers and (FMarkerA >= 0) and
  1430.              (X >= x1-SNAPRANGE-1) and
  1431.              (X <= x1+SNAPRANGE) and
  1432.              (X >= 0) and (X <= Width);
  1433. end;
  1434. {-- TMMCustomMarkerPanel ------------------------------------------------}
  1435. function TMMCustomMarkerPanel.IsMarkerB(X: integer): Boolean;
  1436. var
  1437.    x1: Longint;
  1438. begin
  1439.    x1 := X_ToPixel(FMarkerB);
  1440.    Result := FUseMarkers and (FMarkerB >= 0) and
  1441.              (X >= x1-SNAPRANGE) and
  1442.              (X <= x1+SNAPRANGE+1) and
  1443.              (X >= 0) and (X <= Width);
  1444. end;
  1445. {-- TMMCustomMarkerPanel ------------------------------------------------}
  1446. function TMMCustomMarkerPanel.FindListMarker(X: integer): integer;
  1447. var
  1448.    i: integer;
  1449. begin
  1450.    Result := -1;
  1451.    if (FMarkerList <> nil) and (FMarkerList.Count > 0) then
  1452.    with FMarkerList do
  1453.    begin
  1454.       i := LocateMarker(PixelTo_X(X));
  1455.       if (i < Count) and
  1456.          (X >= X_ToPixel(Markers[i]^.Offset)-SNAPRANGE) and
  1457.          (X <= X_ToPixel(Markers[i]^.Offset)+SNAPRANGE) and
  1458.           Markers[i]^.Visible then
  1459.       begin
  1460.          Result := i;
  1461.       end
  1462.       else if (i > 0) and
  1463.               (X >= X_ToPixel(Markers[i-1]^.Offset)-SNAPRANGE) and
  1464.               (X <= X_ToPixel(Markers[i-1]^.Offset)+SNAPRANGE) and
  1465.                Markers[i-1]^.Visible then
  1466.       begin
  1467.          Result := i-1;
  1468.       end;
  1469.    end;
  1470. end;
  1471. {-- TMMCustomMarkerPanel ------------------------------------------------}
  1472. function TMMCustomMarkerPanel.IsListMarker(X: integer): Boolean;
  1473. var
  1474.    index: integer;
  1475. begin
  1476.    index := FindListMarker(X);
  1477.    Result := (index >= 0) and not FMarkerList.Markers[index]^.Fixed;
  1478. end;
  1479. {-- TMMCustomMarkerPanel ------------------------------------------------}
  1480. function TMMCustomMarkerPanel.IsGridX(X: integer; var Value: Longint): Boolean;
  1481. var
  1482.    g: Longint;
  1483. begin
  1484.    Value := PixelTo_X(X);
  1485.    if FSnapToGrid and inMinMax(Value,DispMinX,DispMaxX) then
  1486.    begin
  1487.       g := Trunc(Trunc(Value/FGridWidthX)*FGridwidthX);
  1488.       { left }
  1489.       if (X - X_ToPixel(g) <= SNAPRANGE) then
  1490.       begin
  1491.          Result := True;
  1492.          Value := g;
  1493.          exit;
  1494.       end;
  1495.       { right }
  1496.       g := Trunc((Trunc(Value/FGridWidthX)+1)*FGridwidthX);
  1497.       if (X_ToPixel(g)-X <= SNAPRANGE) then
  1498.       begin
  1499.          Result := True;
  1500.          Value := g;
  1501.          exit;
  1502.       end;
  1503.    end;
  1504.    Result := False;
  1505. end;
  1506. {-- TMMCustomMarkerPanel ------------------------------------------------}
  1507. function TMMCustomMarkerPanel.IsGridY(Y: integer; var Value: Longint): Boolean;
  1508. var
  1509.    g: Longint;
  1510. begin
  1511.    Value := PixelTo_Y(Y);
  1512.    if FSnapToGrid and inMinMax(Value,DispMinY,DispMaxY) then
  1513.    begin
  1514.       g := Trunc(Trunc(Value/FGridWidthY)*FGridWidthY);
  1515.       { top }
  1516.       if (Y_ToPixel(g)-Y <= SNAPRANGE) then
  1517.       begin
  1518.          Result := True;
  1519.          Value := g;
  1520.          exit;
  1521.       end;
  1522.       { bottom }
  1523.       g := Trunc((Trunc(Value/FGridWidthY)+1)*FGridwidthY);
  1524.       if (Y-Y_ToPixel(g) <= SNAPRANGE) then
  1525.       begin
  1526.          Result := True;
  1527.          Value := g;
  1528.          exit;
  1529.       end;
  1530.    end;
  1531.    Result := False;
  1532. end;
  1533. {-- TMMCustomMarkerPanel ------------------------------------------------}
  1534. procedure TMMCustomMarkerPanel.WMLButtonDown(var Message: TWMLButtonDown);
  1535. begin
  1536.    ButtonDown   := True;
  1537.    FLButtonDown := True;
  1538.    if not FRButtonDown then inherited;
  1539. end;
  1540. {-- TMMCustomMarkerPanel ------------------------------------------------}
  1541. procedure TMMCustomMarkerPanel.WMLButtonUp(var Message: TWMLButtonUp);
  1542. begin
  1543.    ButtonDown   := False;
  1544.    FLButtonDown := False;
  1545.    if not FRButtonDown then inherited;
  1546. end;
  1547. {-- TMMCustomMarkerPanel ------------------------------------------------}
  1548. procedure TMMCustomMarkerPanel.WMRButtonDown(var Message: TWMRButtonDown);
  1549. begin
  1550.    ButtonDown   := True;
  1551.    FRButtonDown := True;
  1552.    if not FLButtonDown then inherited;
  1553. end;
  1554. {-- TMMCustomMarkerPanel ------------------------------------------------}
  1555. procedure TMMCustomMarkerPanel.WMRButtonUp(var Message: TWMRButtonUp);
  1556. begin
  1557.    ButtonDown   := False;
  1558.    FRButtonDown := False;
  1559.    if not FLButtonDown then inherited;
  1560. end;
  1561. {-- TMMCustomMarkerPanel ------------------------------------------------}
  1562. procedure TMMCustomMarkerPanel.WMCancelMode(var Message: TWMCancelMode);
  1563. var
  1564.    P: TPoint;
  1565. begin
  1566.    if FLButtonDown or FRButtonDown then
  1567.    begin
  1568.       GetCursorPos(P);
  1569.       P := ClientToScreen(P);
  1570.       if FLButtonDown then
  1571.          Perform(WM_LBUTTONUP, 0, Longint(PointToSmallPoint(P)));
  1572.       if FRButtonDown then
  1573.          Perform(WM_RBUTTONUP, 0, Longint(PointToSmallPoint(P)));
  1574.    end;
  1575.    inherited;
  1576. end;
  1577. {-- TMMCustomMarkerPanel ------------------------------------------------}
  1578. function TMMCustomMarkerPanel.MouseAction(Button: TMouseButton; X: integer): TMarkerShift;
  1579. begin
  1580.    Result := mkNone;
  1581.    if FUseLocator and (Button = mbLeft) and IsLocator(X) then
  1582.    begin
  1583.       Result := mkLocator;
  1584.       exit;                        { Locator }
  1585.    end;
  1586.    if FUseMarkers then
  1587.    begin
  1588.       if IsMarkerA(X) then
  1589.       begin
  1590.          if (Button = mbLeft) then Result := mkMarkerA
  1591.          else Result := mkMarkerAB;
  1592.          exit;
  1593.       end;
  1594.       if IsMarkerB(X) then
  1595.       begin
  1596.          if (Button = mbLeft) then Result := mkMarkerB
  1597.          else Result := mkMarkerBA;
  1598.          exit;
  1599.       end;
  1600.    end;
  1601.    if (Button = mbLeft) and IsListMarker(X) then
  1602.    begin
  1603.       Result := mkListMarker;
  1604.       exit;                        { MarkerList }
  1605.    end;
  1606. end;
  1607. const
  1608.      inHandler: integer = 0; { verhinder Rekursion durch 2x WM_LBUTTONDOWN }
  1609. {-- TMMCustomMarkerPanel ------------------------------------------------}
  1610. procedure TMMCustomMarkerPanel.MouseDown(Button: TMouseButton; Shift: TShiftState;
  1611.                                    X, Y: integer);
  1612. var
  1613.    P: TPoint;
  1614. begin
  1615.    if not FDragging and not FLocked then
  1616.    begin
  1617.       FMarkerShift := MouseAction(Button, X);
  1618.       if (FMarkerShift <> mkNone) then
  1619.       begin
  1620.          if (Button=mbLeft)or((Button=mbRight)and(FMarkerShift<>mkLocator)) then
  1621.          begin
  1622.             if (FMarkerShift = mkListMarker) then
  1623.                 FCurMarker := FindListMarker(X);
  1624.             MouseCapture := True;
  1625.             FButton := Button;
  1626.             FDragging := True;
  1627.             TrackBegin;
  1628.             exit;
  1629.          end;
  1630.       end
  1631.       else if (inHandler = 0) then
  1632.       begin
  1633.          inc(inHandler);
  1634.          FButton := Button;
  1635.          if (Button = mbLeft) and FUseLocator then
  1636.          begin
  1637.            { Locator neu setzen }
  1638.            if FUseMarkers and FCorralLocator then
  1639.               LocatorChanged(Limit(PixelTo_X(X),MarkerA,MarkerB))
  1640.            else
  1641.               LocatorChanged(Limit(PixelTo_X(X),DispMinX,DispMaxX));
  1642.            { !!! Trick 17 !!! }
  1643.            P := Point(X,Y);
  1644.            Perform(WM_LBUTTONUP, 0, Longint(PointToSmallPoint(P)));
  1645.            Perform(WM_MOUSEMOVE, 0, Longint(PointToSmallPoint(P)));
  1646.            Perform(WM_LBUTTONDOWN, 0, Longint(PointToSmallPoint(P)));
  1647.          end;
  1648.          dec(inHandler);
  1649.       end;
  1650.    end;
  1651.    inherited MouseDown(Button, Shift, X,Y);
  1652. end;
  1653. {-- TMMCustomMarkerPanel ------------------------------------------------}
  1654. procedure TMMCustomMarkerPanel.MouseMove(Shift: TShiftState; X,Y: integer);
  1655. var
  1656.   NewPos,NewPos2: Longint;
  1657.   OnePixel: Longint;
  1658. begin
  1659.    if FDragging and (FMarkerShift <> mkNone) then
  1660.    begin
  1661.       OnePixel := PixelTo_X(1)-PixelTo_X(0);
  1662.       isGridX(X,NewPos);
  1663.       case FMarkerShift of
  1664.          mkLocator:
  1665.          begin
  1666.             if UseMarkers and FCorralLocator then
  1667.                LocatorChanged(Limit(NewPos,MarkerA,MarkerB))
  1668.             else
  1669.                LocatorChanged(Limit(NewPos,DispMinX,DispMaxX));
  1670.          end;
  1671.          mkMarkerA:
  1672.          begin
  1673.             if UseLocator and FCorralLocator then
  1674.                NewPos := Limit(NewPos, DispMinX,Locator-OnePixel)
  1675.             else
  1676.                NewPos := Limit(NewPos, DispMinX,MarkerB-OnePixel);
  1677.             if (NewPos <> MarkerA) then
  1678.             begin
  1679.                MarkerAChanged(NewPos);
  1680.             end;
  1681.          end;
  1682.          mkMarkerB:
  1683.          begin
  1684.             if UseLocator and FCorralLocator then
  1685.                NewPos := Limit(NewPos, Locator+OnePixel,DispMaxX)
  1686.             else
  1687.                NewPos := Limit(NewPos, MarkerA+OnePixel,DispMaxX);
  1688.             if (NewPos <> MarkerB) then
  1689.             begin
  1690.                MarkerBChanged(NewPos);
  1691.             end;
  1692.          end;
  1693.          mkMarkerAB:
  1694.          begin
  1695.             if UseLocator and FCorralLocator then
  1696.                NewPos := Limit(NewPos,
  1697.                                Max(DispMinX,(Locator+OnePixel)-(MarkerB-MarkerA)),
  1698.                                Min(Locator-OnePixel,RangeMaxX-(MarkerB-MarkerA)))
  1699.             else
  1700.                NewPos := Limit(NewPos,DispMinX,RangeMaxX-(MarkerB-MarkerA));
  1701.             if (NewPos <> MarkerA) then
  1702.             begin
  1703.                if isGridX(X_ToPixel(NewPos+(MarkerB-MarkerA)),NewPos2) then
  1704.                begin
  1705.                   if UseLocator and FCorralLocator then
  1706.                      NewPos := Limit(NewPos + (NewPos2-(NewPos+(MarkerB-MarkerA))),
  1707.                                      Max(DispMinX,(Locator+OnePixel)-(MarkerB-MarkerA)),
  1708.                                      Min(Locator-OnePixel,RangeMaxX-(MarkerB-MarkerA)))
  1709.                   else
  1710.                      NewPos := Limit(NewPos + (NewPos2-(NewPos+(MarkerB-MarkerA))),
  1711.                                      DispMinX,RangeMaxX-(MarkerB-MarkerA));
  1712.                   if (NewPos = MarkerA) then exit;
  1713.                end;
  1714.                MarkersChanged(FMarkerShift,NewPos,NewPos+(MarkerB-MarkerA));
  1715.             end;
  1716.          end;
  1717.          mkMarkerBA:
  1718.          begin
  1719.             if UseLocator and FCorralLocator then
  1720.                NewPos := Limit(NewPos,
  1721.                                Max(RangeMinX+(MarkerB-MarkerA),Locator+OnePixel),
  1722.                                Min(DispMaxX,Max(Locator-OnePixel,0)+(MarkerB-MarkerA)))
  1723.             else
  1724.                NewPos := Limit(NewPos,RangeMinX+(MarkerB-MarkerA),DispMaxX);
  1725.             if (NewPos <> MarkerB) then
  1726.             begin
  1727.                if isGridX(X_ToPixel(NewPos-(MarkerB-MarkerA)),NewPos2) then
  1728.                begin
  1729.                   if UseLocator and FCorralLocator then
  1730.                      NewPos := Limit(NewPos + (NewPos2-(NewPos-(MarkerB-MarkerA))),
  1731.                                      Max(RangeMinX+(MarkerB-MarkerA),Locator+OnePixel),
  1732.                                      Min(DispMaxX,Max(Locator-OnePixel,0)+(MarkerB-MarkerA)))
  1733.                   else
  1734.                      NewPos := Limit(NewPos + (NewPos2-(NewPos-(MarkerB-MarkerA))),
  1735.                                      RangeMinX+(MarkerB-MarkerA),DispMaxX);
  1736.                   if (NewPos = MarkerB) then exit;
  1737.                end;
  1738.                MarkersChanged(FMarkerShift,NewPos-(MarkerB-MarkerA),NewPos);
  1739.             end;
  1740.          end;
  1741.          mkListMarker:
  1742.          begin
  1743.             HelpLocatorChanged(MinMax(NewPos,RangeMinX,RangeMaxX));
  1744.          end;
  1745.       end;
  1746.       Track;
  1747.       exit;
  1748.    end
  1749.    else
  1750.    begin
  1751.       FCanUpdate := False;
  1752.       Cursor := GetMouseCursor(Point(X,Y));
  1753.       if not Locked then
  1754.       begin
  1755.          Hint := GetHintText(Point(X,Y));
  1756.          if (Hint <> '')then
  1757.          begin
  1758.             ShowHint := FShowHints;
  1759.          end
  1760.          else
  1761.          begin
  1762.             {$IFDEF WIN32}
  1763.             Application.HideHint;
  1764.             {$ELSE}
  1765.             Application.CancelHint;
  1766.             {$ENDIF}
  1767.             ShowHint := False;
  1768.          end;
  1769.       end;
  1770.       FCanUpdate := True;
  1771.    end;
  1772.    inherited MouseMove(Shift,X,Y);
  1773. end;
  1774. {-- TMMCustomMarkerPanel ------------------------------------------------}
  1775. procedure TMMCustomMarkerPanel.MouseUp(Button: TMouseButton; Shift: TShiftState;
  1776.                                  X,Y: integer);
  1777. var
  1778.    NewPos: Longint;
  1779. begin
  1780.    if (Button = FButton) and FDragging then
  1781.    begin
  1782.       FDragging := False;
  1783.       if (FMarkerShift = mkListMarker) then
  1784.       begin
  1785.          if (HelpLocator >= 0) then
  1786.              NewPos := HelpLocator
  1787.          else
  1788.              NewPos := FMarkerList.Markers[FCurMarker]^.Offset;
  1789.          HelpLocatorChanged(-1);
  1790.          FMarkerList.SetOffset(FCurMarker,NewPos);
  1791.       end;
  1792.       FMarkerShift := mkNone;
  1793.       MouseCapture := False;
  1794.       TrackEnd;
  1795.    end
  1796.    else inherited MouseUp(Button,Shift,X,Y);
  1797. end;
  1798. {-- TMMCustomMarkerPanel ------------------------------------------------}
  1799. procedure TMMCustomMarkerPanel.CMShowHintChanged(var Message: TMessage);
  1800. begin
  1801.   inherited;
  1802.   if FCanUpdate then FShowHints := ShowHint;
  1803. end;
  1804. {-- TMMCustomMarkerPanel ------------------------------------------------}
  1805. procedure TMMCustomMarkerPanel.SetDefaultHint(aValue: String);
  1806. begin
  1807.   if (aValue <> FDefaultHint) then
  1808.   begin
  1809.      FDefaultHint := aValue;
  1810.      Hint := aValue;
  1811.   end;
  1812. end;
  1813. {-- TMMCustomMarkerPanel ------------------------------------------------}
  1814. function TMMCustomMarkerPanel.GetHintText(aPos: TPoint): string;
  1815. var
  1816.    i: integer;
  1817. begin
  1818.    Result := DefaultHint;
  1819.    if IsLocator(aPos.X) then Result := 'Locator'
  1820.    else if IsMarkerA(aPos.X) then Result := 'Marker A'
  1821.    else if IsMarkerB(aPos.X) then Result := 'Marker B'
  1822.    else if (FMarkerList <> nil) then
  1823.    begin
  1824.       i := FindListMarker(aPos.X);
  1825.       if (i >= 0) then Result := MarkerList.Markers[i]^.Name;
  1826.    end;
  1827. end;
  1828. {-- TMMCustomMarkerPanel ------------------------------------------------}
  1829. procedure TMMCustomMarkerPanel.CMCursorChanged(var Message: TMessage);
  1830. begin
  1831.    inherited;
  1832.    if FCanUpdate then FOriginalCursor := Cursor;
  1833. end;
  1834. {-- TMMCustomMarkerPanel ------------------------------------------------}
  1835. function TMMCustomMarkerPanel.GetMouseCursor(aPos: TPoint): TCursor;
  1836. begin
  1837.    Result := FOriginalCursor;
  1838.    if (not Locked and IsAnyMarker(aPos.X)) or
  1839.       (IsMarkerA(aPos.X) or IsMarkerB(aPos.X)) then
  1840.    begin
  1841.       if FDrawGriff then
  1842.          Result := crsHand1
  1843.       else
  1844.          Result := crsMark1
  1845.    end;
  1846. end;
  1847. {-- TMMCustomMarkerPanel ------------------------------------------------}
  1848. procedure TMMCustomMarkerPanel.VLineDoted(aCanvas:TCanvas;x,y1,y2:integer;Clr:TColorRef);
  1849. var
  1850.    DC: HDC;
  1851. begin
  1852.    DC := aCanvas.Handle;
  1853.    if (y1 > y2) then SwapInt(y1,y2);
  1854.    while y1 < y2 do
  1855.    begin
  1856.       SetPixel(DC,x,y1,Clr);
  1857.       inc(y1,3);
  1858.    end;
  1859. end;
  1860. {-- TMMCustomMarkerPanel ------------------------------------------------}
  1861. procedure TMMCustomMarkerPanel.HLineDoted(aCanvas:TCanvas;x1,x2,y:integer;Clr:TColorRef);
  1862. var
  1863.    DC: HDC;
  1864. begin
  1865.    DC := aCanvas.Handle;
  1866.    if (x1 > x2) then SwapInt(x1,x2);
  1867.    while x1 < x2 do
  1868.    begin
  1869.       SetPixel(DC,x1,y,Clr);
  1870.       inc(x1,3);
  1871.    end;
  1872. end;
  1873. {-- TMMCustomMarkerPanel ------------------------------------------------}
  1874. procedure TMMCustomMarkerPanel.DrawGridsX(aCanvas: TCanvas; min,max: Longint);
  1875. var
  1876.    i,x1,y1,y2,Steps: integer;
  1877.    Offset: Longint;
  1878.    Clr: TColorRef;
  1879. begin
  1880.    if FDrawGridX then
  1881.    begin
  1882.       Steps := Trunc((DispMaxX-DispMinX)/GridWidthX);
  1883.       Offset := Round(DispMinX+GridWidthX-ModR(DispMinX,GridWidthX));
  1884.       if (Steps > Width div 2) then exit;
  1885.       Clr := ColorToRGB(FGridColor);
  1886.       y1 := Y_ToPixel(DispMinY);
  1887.       y2 := Y_ToPixel(DispMaxY);
  1888.       for i := 0 to Steps do
  1889.       begin
  1890.          x1 := X_ToPixel(Offset+Trunc(i*GridWidthX));
  1891.          if (x1 >= X_ToPixel(max)) then break;
  1892.          if (x1 >= X_ToPixel(min)) then
  1893.             VLineDoted(aCanvas,x1,y1,y2,Clr);
  1894.       end;
  1895.    end;
  1896. end;
  1897. {-- TMMCustomMarkerPanel ------------------------------------------------}
  1898. procedure TMMCustomMarkerPanel.DrawGridsY(aCanvas: TCanvas; min,max: Longint);
  1899. var
  1900.    i,x1,x2,y1,Steps: integer;
  1901.    Offset: Longint;
  1902.    Clr: TColorRef;
  1903. begin
  1904.    if FDrawGridY then
  1905.    begin
  1906.       Steps := Trunc((DispMaxY-DispMinY)/GridWidthY);
  1907.       Offset := Round(DispMinY+GridWidthY-ModR(DispMinY,GridWidthY));
  1908.       if (Steps > Height div 2) then exit;
  1909.       x1 := X_ToPixel(DispMinX);
  1910.       x2 := X_ToPixel(DispMaxX);
  1911.       Clr := ColorToRGB(FGridColor);
  1912.       for i := 0 To Steps do
  1913.       begin
  1914.          y1 := Height-1-Y_ToPixel(Offset+Trunc(i*GridWidthY));
  1915.          if (y1 >= Y_ToPixel(min)) then break;
  1916.          if (y1 >= Y_ToPixel(max)) then
  1917.             HLineDoted(aCanvas,x1,x2,y1,Clr);
  1918.       end;
  1919.    end;
  1920. end;
  1921. {-- TMMCustomMarkerPanel ------------------------------------------------}
  1922. procedure TMMCustomMarkerPanel.Paint;
  1923. begin
  1924.    inherited Paint;
  1925.    DrawGridsX(Canvas,DispMinX,DispMaxX);
  1926.    DrawGridsY(Canvas,DispMinY,DispMaxY);
  1927.    DrawAllMarkers(Canvas);
  1928. end;
  1929. end.