diff --git a/lcl/interfaces/carbon/carbonprivate.pp b/lcl/interfaces/carbon/carbonprivate.pp index de7508671e..3a426fd951 100644 --- a/lcl/interfaces/carbon/carbonprivate.pp +++ b/lcl/interfaces/carbon/carbonprivate.pp @@ -262,6 +262,8 @@ type procedure CreateWidget(const AParams: TCreateParams); override; procedure DestroyWidget; override; public + procedure AddToWidget(AParent: TCarbonWidget); override; + procedure ControlAdded; override; procedure BoundsChanged; override; @@ -581,6 +583,30 @@ begin inherited; end; +{------------------------------------------------------------------------------ + Method: TCarbonDesignWindow.AddToWidget + + Override to perform docked design window + ------------------------------------------------------------------------------} +procedure TCarbonDesignWindow.AddToWidget(AParent: TCarbonWidget); +begin + inherited AddToWidget(AParent); + + if not Assigned(fWindowRef) then + begin + HIViewRemoveFromSuperview(FDesignControl); + OSError(HIViewAddSubview(HIViewGetFirstSubview(FScrollView), FDesignControl), + Self, 'AddToWidget', SViewAddView); + BringDesignerToFront; + end else + begin + HIViewRemoveFromSuperview(FDesignControl); + OSError(HIViewAddSubview(fWinContent, FDesignControl), Self, 'AddToWidget', + SViewAddView); + BringDesignerToFront; + end; +end; + {------------------------------------------------------------------------------ Method: TCarbonDesignWindow.ControlAdded @@ -602,7 +628,11 @@ var begin inherited; - GetClientRect(R{%H-}); + if Assigned(FWindowRef) then + GetClientRect(R{%H-}) + else + GetScreenBounds(R{%H-}); + OffsetRect(R, -R.Left, -R.Top); OSError(HIViewSetFrame(FDesignControl, RectToCGRect(R)), Self, SSetBounds, SViewFrame); diff --git a/lcl/interfaces/carbon/carbonprivatewindow.inc b/lcl/interfaces/carbon/carbonprivatewindow.inc index 33991c67a7..685b2464d5 100644 --- a/lcl/interfaces/carbon/carbonprivatewindow.inc +++ b/lcl/interfaces/carbon/carbonprivatewindow.inc @@ -1581,7 +1581,7 @@ end; ------------------------------------------------------------------------------} function TCarbonWindow.GetScreenBounds(var ARect: TRect): Boolean; begin - if Window <> nil then + if Assigned(FWindowRef) then Result := GetBounds(ARect) else Result := inherited GetScreenBounds(ARect); diff --git a/lcl/interfaces/carbon/carbonwinapi.inc b/lcl/interfaces/carbon/carbonwinapi.inc index a057ada654..a037e6bab2 100644 --- a/lcl/interfaces/carbon/carbonwinapi.inc +++ b/lcl/interfaces/carbon/carbonwinapi.inc @@ -1420,11 +1420,17 @@ begin Result := CheckDC(PaintDC, 'GetDCOriginRelativeToWindow'); if Result then begin - DC := TCarbonDeviceContext(PaintDC); - affine := CGContextGetCTM(DC.CGContext); - TCarbonWidget(WindowHandle).GetBounds(r{%H-}); - OriginDiff.x := Round(affine.tx); - OriginDiff.y := Round((r.Bottom - r.Top) - affine.ty); + if TCarbonWindow(WindowHandle).Window <> nil then + begin + DC := TCarbonDeviceContext(PaintDC); + affine := CGContextGetCTM(DC.CGContext); + TCarbonWidget(WindowHandle).GetBounds(r{%H-}); + OriginDiff.x := Round(affine.tx); + OriginDiff.y := Round((r.Bottom - r.Top) - affine.ty); + end + else // for docked window + OriginDiff := Classes.Point(0, 0); + Result := true; end; end;