mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-06-23 17:28:51 +02:00
162 lines
4.0 KiB
ObjectPascal
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.
|
|
|