diff --git a/lcl/interfaces/cocoa/cocoaint.pas b/lcl/interfaces/cocoa/cocoaint.pas index 9bd30b1595..59ce4ac3eb 100644 --- a/lcl/interfaces/cocoa/cocoaint.pas +++ b/lcl/interfaces/cocoa/cocoaint.pas @@ -115,7 +115,7 @@ type procedure OnWakeMainThread(Sender: TObject); public // modal session - CurModalForm: TCustomForm; + CurModalForm: NSWindow; constructor Create; override; destructor Destroy; override; diff --git a/lcl/interfaces/cocoa/cocoaobject.inc b/lcl/interfaces/cocoa/cocoaobject.inc index 69533ecdca..e9c132cacd 100644 --- a/lcl/interfaces/cocoa/cocoaobject.inc +++ b/lcl/interfaces/cocoa/cocoaobject.inc @@ -532,7 +532,7 @@ begin lNSObj := NSWindow(AControl.window()); if lNSObj = nil then Exit; if not lNSObj.isKindOfClass_(TCocoaWindow) then Exit; - if lNSWin.LCLForm = CurModalForm then Exit; + if lNSWin = CurModalForm then Exit; Result := True; {$endif} end; diff --git a/lcl/interfaces/cocoa/cocoawinapi.inc b/lcl/interfaces/cocoa/cocoawinapi.inc index fc9876d704..5423f4a78f 100644 --- a/lcl/interfaces/cocoa/cocoawinapi.inc +++ b/lcl/interfaces/cocoa/cocoawinapi.inc @@ -2332,21 +2332,26 @@ end; function TCocoaWidgetSet.SetMenu(AWindowHandle: HWND; AMenuHandle: HMENU): Boolean; var lWin: NSWindow; + frm : TCustomForm; begin Result := False; lWin := NSWindow(GetNSObjectWindow(NSObject(AWindowHandle))); - if isFormDesigned(AWindowHandle) then begin + frm := HWNDToForm(AWindowHandle); + if Assigned(frm) and (csDesigning in frm.ComponentState) then begin Result := true; Exit; end; + if not Assigned(frm) then Exit; if (lWin <> nil) and lWin.isKindOfClass(TCocoaWindow) and - (TCocoaWindow(lWin).LCLForm.Menu.Handle = AMenuHandle) then + //todo: why is Menu handle checked here? + (frm.Menu.Handle = AMenuHandle) + then begin if lWin.isKeyWindow or lWin.isMainWindow then - SetMainMenu(AMenuHandle, TCocoaWindow(lWin).LCLForm.Menu); + SetMainMenu(AMenuHandle, frm.Menu); Result := True; end; end; diff --git a/lcl/interfaces/cocoa/cocoawindows.pas b/lcl/interfaces/cocoa/cocoawindows.pas index 560c72bc33..2654d6f941 100644 --- a/lcl/interfaces/cocoa/cocoawindows.pas +++ b/lcl/interfaces/cocoa/cocoawindows.pas @@ -29,7 +29,8 @@ uses MacOSAll, CocoaAll, CocoaUtils, CocoaGDIObjects, cocoa_extra, CocoaPrivate, CocoaTextEdits, // LCL - Forms, LCLType, LCLProc; + //Forms, + LCLType, LCLProc; type @@ -69,6 +70,9 @@ type function GetEnabled: Boolean; procedure SetEnabled(AValue: Boolean); + function AcceptFilesDrag: Boolean; + procedure DropFiles(const FileNames: array of string); + property Enabled: Boolean read GetEnabled write SetEnabled; end; @@ -130,7 +134,7 @@ type procedure windowDidExitFullScreen(notification: NSNotification); message 'windowDidExitFullScreen:'; public callback: IWindowCallback; - LCLForm: TCustomForm; + //LCLForm: TCustomForm; procedure dealloc; override; function acceptsFirstResponder: Boolean; override; function canBecomeKeyWindow: Boolean; override; @@ -881,16 +885,10 @@ begin end; function TCocoaWindow.draggingEntered(sender: NSDraggingInfoProtocol): NSDragOperation; -var - lTarget: TCustomForm = nil; begin Result := NSDragOperationNone; - if (callback <> nil) and (callback.GetTarget() <> nil) and (callback.GetTarget() is TCustomForm) then - lTarget := TCustomForm(callback.GetTarget()); - if (lTarget <> nil) and (lTarget.OnDropFiles <> nil) then - begin + if (callback <> nil) and (callback.AcceptFilesDrag) then Result := sender.draggingSourceOperationMask(); - end; end; function TCocoaWindow.performDragOperation(sender: NSDraggingInfoProtocol): Boolean; @@ -928,8 +926,8 @@ begin end; end;} - if (Length(lFiles) > 0) and (callback <> nil) and (callback.GetTarget() <> nil) then - TCustomForm(callback.GetTarget()).IntfDropFiles(lFiles); + if (Length(lFiles) > 0) and (callback <> nil) then + callback.DropFiles(lFiles); Result := True; end; diff --git a/lcl/interfaces/cocoa/cocoawsforms.pas b/lcl/interfaces/cocoa/cocoawsforms.pas index 4187c879d8..3d3d9099a6 100644 --- a/lcl/interfaces/cocoa/cocoawsforms.pas +++ b/lcl/interfaces/cocoa/cocoawsforms.pas @@ -55,6 +55,9 @@ type function GetEnabled: Boolean; virtual; procedure SetEnabled(AValue: Boolean); virtual; + function AcceptFilesDrag: Boolean; + procedure DropFiles(const FileNames: array of string); + property Enabled: Boolean read GetEnabled write SetEnabled; end; @@ -166,7 +169,6 @@ type procedure ArrangeTabOrder(const AWinControl: TWinControl); function HWNDToForm(AFormHandle: HWND): TCustomForm; -function isFormDesigned(AFormHandle:HWND): Boolean; implementation @@ -337,7 +339,7 @@ begin CanClose := LCLSendCloseQueryMsg(Target) > 0; // Special code for modal forms, which otherwise would get 0 here and not call Close - if (CocoaWidgetSet.CurModalForm = FTarget) and + if (CocoaWidgetSet.CurModalForm = window) and (TCustomForm(Target).ModalResult <> mrNone) then begin {$IFDEF COCOA_USE_NATIVE_MODAL} @@ -389,6 +391,17 @@ begin Owner.lclSetEnabled(AValue); end; +function TLCLWindowCallback.AcceptFilesDrag: Boolean; +begin + Result := Assigned(Target) and Assigned(TCustomForm(Target).OnDropFiles); +end; + +procedure TLCLWindowCallback.DropFiles(const FileNames: array of string); +begin + if Assigned(Target) then + TCustomForm(Target).IntfDropFiles(FileNames); +end; + { TCocoaWSScrollingWinControl} class function TCocoaWSScrollingWinControl.CreateHandle(const AWinControl: TWinControl; const AParams: TCreateParams): TLCLIntfHandle; @@ -584,7 +597,6 @@ begin cnt.callback := TCocoaWindow(win).callback; cnt.callback.IsOpaque:=true; - win.LCLForm := Form; win.setContentView(cnt); // Don't call addChildWindow_ordered here because this function can cause @@ -739,7 +751,7 @@ begin if (lWinContent <> nil) and (not fullscreen) then lWinContent.resolvePopupParent(); - CocoaWidgetSet.CurModalForm := ACustomForm; + CocoaWidgetSet.CurModalForm := lWinContent.lclOwnWindow; // LCL initialization code would cause the custom form to be disabled // (due to the fact, ShowModal() has not been called yet, and a previous form // might be disabled at the time. @@ -774,7 +786,7 @@ end; class procedure TCocoaWSCustomForm.SetModalResult(const ACustomForm: TCustomForm; ANewValue: TModalResult); begin - if (CocoaWidgetSet.CurModalForm = ACustomForm) and (ANewValue <> 0) then + if (CocoaWidgetSet.CurModalForm = NSView(ACustomForm.Handle).window) and (ANewValue <> 0) then CloseModal(ACustomForm); end; @@ -928,12 +940,4 @@ begin else Result := nil; end; -function isFormDesigned(AFormHandle:HWND): Boolean; -var - frm : TCustomForm; -begin - frm := HWNDToForm(AFormHandle); - Result := Assigned(frm) and (csDesigning in frm.ComponentState); -end; - end.