diff --git a/lcl/interfaces/cocoa/cocoaint.pas b/lcl/interfaces/cocoa/cocoaint.pas index 5a5c6ae32e..d8dbb2c7bc 100644 --- a/lcl/interfaces/cocoa/cocoaint.pas +++ b/lcl/interfaces/cocoa/cocoaint.pas @@ -709,6 +709,86 @@ begin Result := Assigned(Modals) and (Modals.Count > 0); end; +type + + { TToCollectItem } + + TToCollectItem = class(TObject) + // reference count is needed, in case the event processing + // goes into a recursion (i.e. a modal window) + // Thus the object added at the start of event, should not be released + // until its "event loop" is actually finishing + refCount: Integer; + obj: TObject; + constructor Create(aobj: TObject); + destructor Destroy; override; + end; + +{ TToCollectItem } + +constructor TToCollectItem.Create(aobj: TObject); +begin + inherited Create; + obj := aobj; + refCount := 1; +end; + +destructor TToCollectItem.Destroy; +begin + obj.Free; + inherited; +end; + +procedure TCocoaWidgetSet.AddToCollect(obj: TObject); +var + i : integer; +begin + // let's try to find an object. Do not add a duplicate + for i := 0 to ToCollect.Count - 1 do + if TToCollectItem(ToCollect[i]).obj=obj then + Exit; + ToCollect.Add(TToCollectItem.Create(obj)); +end; + +procedure TCocoaWidgetSet.RetainToCollect; +var + i : Integer; + cl : TToCollectItem; +begin + for i := 0 to ToCollect.Count - 1 do + begin + cl := TToCollectItem(ToCollect[i]); + inc(cl.refCount); + end; +end; + +procedure TCocoaWidgetSet.ReleaseToCollect; +var + cl : TToCollectItem; + i : integer; +begin + for i := 0 to ToCollect.Count - 1 do + begin + cl := TToCollectItem(ToCollect[i]); + dec(cl.refCount); + if cl.refCount = 0 then + begin + cl.Free; + ToCollect[i] := nil; + end; + end; + ToCollect.Pack; +end; + +procedure TCocoaWidgetSet.ReleaseAllToCollect; +var + i : integer; +begin + for i := 0 to ToCollect.Count - 1 do + TToCollectItem(ToCollect[i]).Free; + ToCollect.Clear; +end; + initialization // {$I Cocoaimages.lrs} InternalInit; diff --git a/lcl/interfaces/cocoa/cocoalclintf.inc b/lcl/interfaces/cocoa/cocoalclintf.inc index 8c3c05ff7c..d77ba8a0cb 100644 --- a/lcl/interfaces/cocoa/cocoalclintf.inc +++ b/lcl/interfaces/cocoa/cocoalclintf.inc @@ -735,85 +735,6 @@ begin Result := True; end; -type - - { TToCollectItem } - - TToCollectItem = class(TObject) - // reference count is needed, in case the event processing - // goes into a recursion (i.e. a modal window) - // Thus the object added at the start of event, should not be released - // until its "event loop" is actually finishing - refCount: Integer; - obj: TObject; - constructor Create(aobj: TObject); - destructor Destroy; override; - end; - -{ TToCollectItem } - -constructor TToCollectItem.Create(aobj: TObject); -begin - inherited Create; - obj := aobj; - refCount := 1; -end; - -destructor TToCollectItem.Destroy; -begin - obj.Free; - inherited; -end; - -procedure TCocoaWidgetSet.AddToCollect(obj: TObject); -var - i : integer; -begin - // let's try to find an object. Do not add a duplicate - for i := 0 to ToCollect.Count - 1 do - if TToCollectItem(ToCollect[i]).obj=obj then - Exit; - ToCollect.Add(TToCollectItem.Create(obj)); -end; - -procedure TCocoaWidgetSet.RetainToCollect; -var - i : Integer; - cl : TToCollectItem; -begin - for i := 0 to ToCollect.Count - 1 do - begin - cl := TToCollectItem(ToCollect[i]); - inc(cl.refCount); - end; -end; - -procedure TCocoaWidgetSet.ReleaseToCollect; -var - cl : TToCollectItem; - i : integer; -begin - for i := 0 to ToCollect.Count - 1 do - begin - cl := TToCollectItem(ToCollect[i]); - dec(cl.refCount); - if cl.refCount = 0 then - begin - cl.Free; - ToCollect[i] := nil; - end; - end; - ToCollect.Pack; -end; - -procedure TCocoaWidgetSet.ReleaseAllToCollect; -var - i : integer; -begin - for i := 0 to ToCollect.Count - 1 do - TToCollectItem(ToCollect[i]).Free; - ToCollect.Clear; -end; {------------------------------------------------------------------------------ Function: RawImage_QueryDescription