lazarus/lcl/interfaces/cocoa/cocoawsscrollers.pas

162 lines
4.0 KiB
ObjectPascal

unit CocoaWSScrollers;
{$mode objfpc}{$H+}
{$modeswitch objectivec1}
interface
uses
Classes, SysUtils, LCLType, Controls, Forms,
CocoaAll, CocoaPrivate, CocoaCustomControl, CocoaScrollers, CocoaUtils;
type
{ TASyncLCLControlAdjustSizer }
TASyncLCLControlAdjustSizer = class
private
_control: TWinControl;
_doing: Boolean;
procedure doAdjustSize(data: PtrInt);
public
procedure adjustSize(control: TWinControl);
end;
function EmbedInScrollView(AView: NSView; AReleaseView: Boolean = true): TCocoaScrollView;
function EmbedInManualScrollView(AView: NSView): TCocoaManualScrollView;
function EmbedInManualScrollHost(AView: TCocoaManualScrollView): TCocoaManualScrollHost;
procedure LCLScrollViewAdjustSize(control: TWinControl);
var
ASyncLCLControlAdjustSizer: TASyncLCLControlAdjustSizer;
implementation
function EmbedInScrollView(AView: NSView; AReleaseView: Boolean): TCocoaScrollView;
var
r: TRect;
p: NSView;
begin
if not Assigned(AView) then
Exit(nil);
r := AView.lclFrame;
p := AView.superview;
Result := TCocoaScrollView.alloc.initWithFrame(NSNullRect);
if Assigned(p) then p.addSubView(Result);
Result.lclSetFrame(r);
{$ifdef BOOLFIX}
Result.setHidden_(Ord(AView.isHidden));
{$else}
Result.setHidden(AView.isHidden);
{$endif}
Result.setDocumentView(AView);
Result.setDrawsBackground(false); // everything is covered anyway
{$ifdef BOOLFIX}
AView.setHidden_(Ord(false));
{$else}
AView.setHidden(false);
{$endif}
if AReleaseView then AView.release;
SetViewDefaults(Result);
end;
function EmbedInManualScrollView(AView: NSView): TCocoaManualScrollView;
var
r: TRect;
p: NSView;
begin
if not Assigned(AView) then
begin
Result:=nil;
Exit;
end;
r := AView.lclFrame;
p := AView.superview;
p.setAutoresizingMask( NSViewWidthSizable or NSViewHeightSizable);
Result := TCocoaManualScrollView.alloc.initWithFrame(NSNullRect);
Result.setAcceptsTouchEvents(true);
Result.setAutoresizesSubviews(false);
if Assigned(p) then p.addSubView(Result);
Result.lclSetFrame(r);
{$ifdef BOOLFIX}
Result.setHidden_(Ord(AView.isHidden));
{$else}
Result.setHidden(AView.isHidden);
{$endif}
Result.setDocumentView(AView);
{$ifdef BOOLFIX}
AView.setHidden_(Ord(false));
{$else}
AView.setHidden(false);
{$endif}
AView.release;
SetViewDefaults(Result);
if AView.isKindOfClass(TCocoaCustomControl) then
TCocoaCustomControl(AView).auxMouseByParent := true;
end;
function EmbedInManualScrollHost(AView: TCocoaManualScrollView
): TCocoaManualScrollHost;
var
r: TRect;
p: NSView;
begin
if not Assigned(AView) then
Exit(nil);
r := AView.lclFrame;
p := AView.superview;
Result := TCocoaManualScrollHost.alloc.initWithFrame(NSNullRect);
if Assigned(p) then p.addSubView(Result);
Result.lclSetFrame(r);
{$ifdef BOOLFIX}
Result.setHidden_(Ord(AView.isHidden));
{$else}
Result.setHidden(AView.isHidden);
{$endif}
Result.setDocumentView(AView);
Result.setDrawsBackground(false); // everything is covered anyway
Result.contentView.setAutoresizesSubviews(false);
AView.setAutoresizingMask(NSViewWidthSizable or NSViewHeightSizable);
AView.release;
{$ifdef BOOLFIX}
AView.setHidden_(Ord(false));
{$else}
AView.setHidden(false);
{$endif}
SetViewDefaults(Result);
end;
procedure LCLScrollViewAdjustSize(control: TWinControl);
begin
if NSScroller.preferredScrollerStyle = NSScrollerStyleOverlay then
Exit;
ASyncLCLControlAdjustSizer.adjustSize(control);
end;
{ TASyncLCLControlAdjustSizer }
procedure TASyncLCLControlAdjustSizer.doAdjustSize(data: PtrInt);
begin
_control.AdjustSize;
_doing:= False;
end;
procedure TASyncLCLControlAdjustSizer.adjustSize(control: TWinControl);
begin
_control:= control;
_control.InvalidateClientRectCache(true);
if NOT _doing then
Application.QueueAsyncCall(@doAdjustSize, 0);
_doing:= True;
end;
initialization
ASyncLCLControlAdjustSizer:= TASyncLCLControlAdjustSizer.Create;
finalization
FreeAndNil( ASyncLCLControlAdjustSizer );
end.