diff --git a/lcl/interfaces/carbon/carbonproc.pp b/lcl/interfaces/carbon/carbonproc.pp index 3db52ec8d4..7ebb868d2d 100644 --- a/lcl/interfaces/carbon/carbonproc.pp +++ b/lcl/interfaces/carbon/carbonproc.pp @@ -83,6 +83,8 @@ function CreateCustomHIView(const ARect: HIRect; ControlStyle: TControlStyle = [ procedure SetControlViewStyle(Control: ControlRef; TinySize, SmallSize, NormalSize: Integer; ControlHeight: Boolean = True); +function CarbonHitTest(Control: ControlRef; const X,Y: integer; var part: ControlPartCode): Boolean; + const DEFAULT_CFSTRING_ENCODING = kCFStringEncodingUTF8; @@ -669,6 +671,33 @@ begin SetControlData(Control, kControlEntireControl, kControlSizeTag, SizeOf(Data), @Data); end; + +{------------------------------------------------------------------------------ + Name: CarbonHitTest + Params: Control - control to test + x,y - mouse coordinates in control's local coordinates + part - hit test result + Returns: True - if hittest is succsefull, False - overwise + + Performs hit-test on a carbon control (hiview) + ------------------------------------------------------------------------------} +function CarbonHitTest(Control: ControlRef; const X,Y: integer; var part: ControlPartCode): Boolean; +var + event : EventRef; + mp : MacOSAll.point; +begin + Result := false; + if CreateEvent(kCFAllocatorDefault, kEventClassControl, kEventControlHitTest, 0, 0, event) <> noErr then + Exit; + mp.h := X; + mp.v := Y; + SetEventParameter(event, kEventParamDirectObject, typeControlRef, sizeof(Control), @Control); + SetEventParameter(event, kEventParamMouseLocation, typeQDPoint, sizeof(mp), @mp); + if SendEventToEventTarget(event, GetControlEventTarget(Control))= noErr then + Result:=GetEventParameter(event, kEventParamControlPart, typeControlPartCode, nil, sizeof(part), nil, @part)=noErr; + ReleaseEvent(event); +end; + {------------------------------------------------------------------------------ Name: CreateCFString Params: S - UTF-8 string diff --git a/lcl/interfaces/carbon/carbontabs.pp b/lcl/interfaces/carbon/carbontabs.pp index 5d7fb172f1..512f8c4bd5 100644 --- a/lcl/interfaces/carbon/carbontabs.pp +++ b/lcl/interfaces/carbon/carbontabs.pp @@ -98,6 +98,8 @@ type public function GetClientRect(var ARect: TRect): Boolean; override; function SetBounds(const ARect: TRect): Boolean; override; + + function GetPageIndexAtCursor(const AClientPos: TPoint): Integer; function IsDesignInteractive(const P: TPoint): Boolean; override; @@ -880,6 +882,23 @@ begin UpdateTabs; end; +function TCarbonTabsControl.GetPageIndexAtCursor(const AClientPos: TPoint): Integer; +var + tabno : ControlPartCode; +begin + Result := -1; + if not CarbonHitTest(Widget, AClientPos.X, AClientPos.Y, tabno) then Exit; + + if tabno = kControlNoPart then + begin + Result := TCustomNotebook(LCLObject).PageIndex + //CarbonHitTest(FUserPane, AClientPos.X, AClientPos.Y-35, tabno); + //Result := tabno; + end + else + Result := FFirstIndex+tabno-1; +end; + {------------------------------------------------------------------------------ Method: TCarbonTabsControl.IsDesignInteractive Params: P diff --git a/lcl/interfaces/carbon/carbonwsextctrls.pp b/lcl/interfaces/carbon/carbonwsextctrls.pp index 0ecc2fed91..8020fec6b8 100644 --- a/lcl/interfaces/carbon/carbonwsextctrls.pp +++ b/lcl/interfaces/carbon/carbonwsextctrls.pp @@ -67,7 +67,7 @@ type //class function GetNotebookMinTabHeight(const AWinControl: TWinControl): integer; override; //class function GetNotebookMinTabWidth(const AWinControl: TWinControl): integer; override; //class function GetPageRealIndex(const ANotebook: TCustomNotebook; AIndex: Integer): Integer; override; - //class function GetTabIndexAtPos(const ANotebook: TCustomNotebook; const AClientPos: TPoint): integer; override; + class function GetTabIndexAtPos(const ANotebook: TCustomNotebook; const AClientPos: TPoint): integer; override; class procedure SetPageIndex(const ANotebook: TCustomNotebook; const AIndex: integer); override; class procedure SetTabPosition(const ANotebook: TCustomNotebook; const ATabPosition: TTabPosition); override; class procedure ShowTabs(const ANotebook: TCustomNotebook; AShowTabs: boolean); override; @@ -296,6 +296,17 @@ begin TCarbonTabsControl(ANotebook.Handle).SetPageIndex(ANotebook.PageIndex); end; + +class function TCarbonWSCustomNotebook.GetTabIndexAtPos(const ANotebook: TCustomNotebook; const AClientPos: TPoint): integer; +var + p : TPoint; +begin + if not CheckHandle(ANotebook, Self, 'GetTabIndexAtPos') then Exit; + p := AClientPos; + inc(p.y, 35); // todo: find out why AClientPos incorrect for TNotebook + Result := TCarbonTabsControl(ANotebook.Handle).GetPageIndexAtCursor(p); +end; + {------------------------------------------------------------------------------ Method: TCarbonWSCustomNotebook.SetPageIndex Params: ANotebook - LCL custom notebook