anchor.diff:      FOnTabChangeQuery: TATTabChangeQueryEvent;
       FOnTabGetTick: TATTabGetTickEvent;
       FOnTabGetCloseAction: TATTabGetCloseActionEvent;
  +    FOnTabDblClick: TATTabDblClickEvent;
  +    FOnTabDropQuery: TATTabDropQueryEvent;
   
       function ConvertButtonIdToTabIndex(Id: TATTabButton): integer; inline;
       procedure DoAnimationTabAdd(AIndex: integer);
  
positive.code: procedure TATTabs.DoTabDrop;
  var
    NFrom, NTo: integer;
  begin
    NFrom:= FTabIndex;
    if not IsIndexOk(NFrom) then Exit;
    NTo:= FTabIndexDrop;
    if not IsIndexOk(NTo) then
      NTo:= TabCount-1;
    if NFrom=NTo then Exit;  
  
    FTabList.Items[NFrom].Index:= NTo;
    SetTabIndex(NTo);
  
negative.code:   TATTabDrawEvent = procedure (Sender: TObject;
      AElemType: TATTabElemType; ATabIndex: integer;
      ACanvas: TCanvas; const ARect: TRect; var ACanDraw: boolean) of object;
    TATTabMoveEvent = procedure (Sender: TObject; AIndexFrom, AIndexTo: integer) of object;
    TATTabChangeQueryEvent = procedure (Sender: TObject; ANewTabIndex: integer;
      var ACanChange: boolean) of object;
    TATTabClickUserButton = procedure (Sender: TObject; AIndex: integer) of object;
    TATTabGetTickEvent = function (Sender: TObject; ATabObject: TObject): Int64 of object;
    TATTabGetCloseActionEvent = procedure (Sender: TObject; var AAction: TATTabActionOnClose) of object;
    TATTabDblClickEvent = procedure (Sender: TObject; AIndex: integer) of object;
    TATTabDropQueryEvent = procedure (Sender: TObject; AIndexFrom, AIndexTo: integer; var ACanDrop: boolean) of object;
  
  type
    TATTabTriangle = (
  