lazarus/lcl/interfaces/carbon/carbonwsforms.pp

386 lines
13 KiB
ObjectPascal

{
*****************************************************************************
* CarbonWSForms.pp *
* ------------ *
* *
* *
*****************************************************************************
*****************************************************************************
This file is part of the Lazarus Component Library (LCL)
See the file COPYING.modifiedLGPL.txt, included in this distribution,
for details about the license.
*****************************************************************************
}
unit CarbonWSForms;
{$mode objfpc}{$H+}
interface
// defines
{$I carbondefines.inc}
uses
// Libs
MacOSAll,
// LCL
Controls, Forms, Graphics, LCLType, LCLProc, Classes,
// Widgetset
WSForms, WSLCLClasses,
// LCL Carbon
CarbonDef, CarbonPrivate;
type
{ TCarbonWSScrollingWinControl }
TCarbonWSScrollingWinControl = class(TWSScrollingWinControl)
published
class function CreateHandle(const AWinControl: TWinControl; const AParams: TCreateParams): TLCLIntfHandle; override;
class procedure ScrollBy(const AWinControl: TScrollingWinControl; const DeltaX, DeltaY: integer); override;
end;
{ TCarbonWSScrollBox }
TCarbonWSScrollBox = class(TWSScrollBox)
published
end;
{ TCarbonWSCustomFrame }
TCarbonWSCustomFrame = class(TWSCustomFrame)
published
end;
{ TCarbonWSFrame }
TCarbonWSFrame = class(TWSFrame)
published
end;
{ TCarbonWSCustomForm }
TCarbonWSCustomFormClass = class of TCarbonWSCustomForm;
TCarbonWSCustomForm = class(TWSCustomForm)
published
class function CreateHandle(const AWinControl: TWinControl; const AParams: TCreateParams): TLCLIntfHandle; override;
class procedure CloseModal(const ACustomForm: TCustomForm); override;
class procedure ShowModal(const ACustomForm: TCustomForm); override;
class procedure ShowHide(const AWinControl: TWinControl); override;
class procedure SetBorderIcons(const AForm: TCustomForm; const ABorderIcons: TBorderIcons); override;
class procedure SetFormBorderStyle(const AForm: TCustomForm; const AFormBorderStyle: TFormBorderStyle); override;
class procedure SetAlphaBlend(const ACustomForm: TCustomForm; const AlphaBlend: Boolean; const Alpha: Byte); override;
class procedure SetFormStyle(const ACustomForm: TCustomForm; const ANewFormStyle, {%H-}AOldFormStyle: TFormStyle); override;
class procedure SetPopupParent(const ACustomForm: TCustomForm;
const {%H-}APopupMode: TPopupMode; const APopupParent: TCustomForm); override;
end;
{ TCarbonWSForm }
TCarbonWSForm = class(TWSForm)
published
end;
{ TCarbonWSHintWindow }
TCarbonWSHintWindow = class(TWSHintWindow)
published
class function CreateHandle(const AWinControl: TWinControl; const AParams: TCreateParams): TLCLIntfHandle; override;
end;
{ TCarbonWSScreen }
TCarbonWSScreen = class(TWSScreen)
published
end;
{ TCarbonWSApplicationProperties }
TCarbonWSApplicationProperties = class(TWSApplicationProperties)
published
end;
implementation
uses
CarbonProc, CarbonDbgConsts;
{ TCarbonWSScrollingWinControl }
{------------------------------------------------------------------------------
Method: TCarbonWSScrollingWinControl.CreateHandle
Params: AWinControl - LCL control
AParams - Creation parameters
Returns: Handle to the window in Carbon interface
Creates new scrolling window control in Carbon interface with the specified
parameters
------------------------------------------------------------------------------}
class function TCarbonWSScrollingWinControl.CreateHandle(const AWinControl: TWinControl;
const AParams: TCreateParams): TLCLIntfHandle;
begin
Result := TLCLIntfHandle(TCarbonScrollingWinControl.Create(AWinControl, AParams));
end;
{------------------------------------------------------------------------------
Method: TCarbonWSScrollingWinControl.ScrollBy
Params: AWinControl - LCL scrolling win control
DX, DY -
Scrolls the content of the passed window
------------------------------------------------------------------------------}
class procedure TCarbonWSScrollingWinControl.ScrollBy(const AWinControl: TScrollingWinControl; const DeltaX, DeltaY: integer);
begin
if not CheckHandle(AWinControl, Self, 'ScrollBy') then Exit;
TCarbonWidget(AWinControl.Handle).ScrollBy(DeltaX, DeltaY);
AWinControl.Invalidate;
end;
{ TCarbonWSCustomForm }
{------------------------------------------------------------------------------
Method: TCarbonWSCustomForm.CreateHandle
Params: AWinControl - LCL control
AParams - Creation parameters
Returns: Handle to the window in Carbon interface
Creates new window in Carbon interface with the specified parameters
------------------------------------------------------------------------------}
class function TCarbonWSCustomForm.CreateHandle(const AWinControl: TWinControl;
const AParams: TCreateParams): TLCLIntfHandle;
var
frm : TCustomForm;
begin
if csDesigning in AWinControl.ComponentState then
Result := TLCLIntfHandle(TCarbonDesignWindow.Create(AWinControl, AParams))
else
Result := TLCLIntfHandle(TCarbonWindow.Create(AWinControl, AParams));
frm:=TCustomForm(AWinControl);
if Assigned(frm) then
begin
if (AParams.WndParent<>0) and ((AParams.Style and WS_CHILD) = 0) then
SetWindowGroup(TCarbonWindow(Result).Window, GetWindowGroupOfClass(kHelpWindowClass));
end;
end;
{------------------------------------------------------------------------------
Method: TCarbonWSCustomForm.CloseModal
Params: ACustomForm - LCL custom form
Closes modal window in Carbon interface
------------------------------------------------------------------------------}
class procedure TCarbonWSCustomForm.CloseModal(const ACustomForm: TCustomForm);
begin
if not CheckHandle(ACustomForm, Self, 'CloseModal') then Exit;
TCarbonWindow(ACustomForm.Handle).CloseModal;
end;
{------------------------------------------------------------------------------
Method: TCarbonWSCustomForm.ShowModal
Params: ACustomForm - LCL custom form
Shows modal window in Carbon interface
------------------------------------------------------------------------------}
class procedure TCarbonWSCustomForm.ShowModal(const ACustomForm: TCustomForm);
begin
if not CheckHandle(ACustomForm, Self, SShowModal) then Exit;
TCarbonWindow(ACustomForm.Handle).ShowModal;
end;
class procedure TCarbonWSCustomForm.ShowHide(const AWinControl: TWinControl);
var
nCmdShow : Integer;
ModalForm: TCustomForm;
ACurrentWindowClass: WindowClass;
function HaveModalForms: Boolean;
var
i: Integer;
AForm: TCustomForm;
begin
Result := False;
for i := 0 to Screen.CustomFormZOrderCount - 1 do
begin
AForm := Screen.CustomFormsZOrdered[i];
Result := AForm.Visible and AForm.HandleAllocated and (fsModal in AForm.FormState);
if Result then
begin
ModalForm := AForm;
break;
end;
end;
end;
function ShowNonModalOverModal(const AShowSheet: Boolean): Boolean;
var
AForm: TCustomForm;
begin
Result := False;
AForm := TCustomForm(AWinControl);
ModalForm := nil;
if AWinControl.HandleObjectShouldBeVisible and
not (csDesigning in AForm.ComponentState) and
not (fsModal in AForm.FormState) and
(AForm.FormStyle <> fsMDIChild) and
not (AForm.FormStyle in fsAllStayOnTop) and
HaveModalForms and
(AForm.BorderStyle in [bsDialog, bsSingle, bsSizeable]) and
(AForm.Parent = nil) and
(AForm.PopupParent = nil) and (AForm.PopupMode = pmNone) then
begin
if AShowSheet then
begin
TCarbonWindow(ModalForm.Handle).SheetWin := TCarbonWindow(AForm.Handle).Window;
OSError(ShowSheetWindow(TCarbonWindow(AForm.Handle).Window, TCarbonWindow(ModalForm.Handle).Window),
Self,'ShowHide','ShowSheetWindow');
end;
Result := True;
end;
end;
begin
if not CheckHandle(AWinControl, Self, 'ShowHide') then Exit;
OSError(GetWindowClass(TCarbonWindow(AWinControl.Handle).Window, ACurrentWindowClass{%H-}),
Self,'ShowHide','GetWindowClass');
if AWinControl.HandleObjectShouldBeVisible then
begin
case TCustomForm(AWinControl).WindowState of
wsFullScreen: nCmdShow := SW_SHOWFULLSCREEN;
wsMaximized: nCmdShow := SW_SHOWMAXIMIZED;
wsMinimized: nCmdShow := SW_SHOWMINIMIZED;
else
nCmdShow := SW_SHOW;
end;
if (ACurrentWindowClass <> kSheetWindowClass) and ShowNonModalOverModal(False) then
begin
CREATESHEETWINDOW := PtrUInt(AWinControl);
RecreateWnd(AWinControl);
exit;
end;
if (ACurrentWindowClass = kSheetWindowClass) and
not ShowNonModalOverModal(False) then
begin
RecreateWnd(AWinControl);
exit;
end;
if (ACurrentWindowClass = kSheetWindowClass) then
ShowNonModalOverModal(True);
TCarbonWindow(AWinControl.Handle).ShowHide(True);
TCarbonWindow(AWinControl.Handle).Show(nCmdShow);
end else
begin
if not (csDesigning in AWinControl.ComponentState) then
begin
if TCarbonWindow(AWinControl.Handle).SheetWin <> nil then
begin
HideSheetWindow(TCarbonWindow(AWinControl.Handle).SheetWin);
TCarbonWindow(AWinControl.Handle).SheetWin := nil;
end else
if (ACurrentWindowClass = kSheetWindowClass) then
HideSheetWindow(TCarbonWindow(AWinControl.Handle).Window);
end;
TCarbonWindow(AWinControl.Handle).ShowHide(False);
end;
end;
{------------------------------------------------------------------------------
Method: TCarbonWSCustomForm.SetBorderIcons
Params: AForm - LCL custom form
ABorderIcons - Border icons
Sets the border icons of window in Carbon interface
------------------------------------------------------------------------------}
class procedure TCarbonWSCustomForm.SetBorderIcons(const AForm: TCustomForm;
const ABorderIcons: TBorderIcons);
begin
if not CheckHandle(AForm, Self, 'SetBorderIcons') then Exit;
TCarbonWindow(AForm.Handle).SetBorderIcons(ABorderIcons);
end;
{------------------------------------------------------------------------------
Method: TCarbonWSCustomForm.SetFormBorderStyle
Params: AForm - LCL custom form
AFormBorderStyle - Form border style
Sets the form border style of window in Carbon interface
------------------------------------------------------------------------------}
class procedure TCarbonWSCustomForm.SetFormBorderStyle(const AForm: TCustomForm;
const AFormBorderStyle: TFormBorderStyle);
begin
if not CheckHandle(AForm, Self, 'SetFormBorderStyle') then Exit;
TCarbonWindow(AForm.Handle).SetFormBorderStyle(AFormBorderStyle);
end;
class procedure TCarbonWSCustomForm.SetAlphaBlend(const ACustomForm: TCustomForm; const AlphaBlend: Boolean; const Alpha: Byte);
var
v : single;
begin
if not CheckHandle(ACustomForm, Self, 'SetFormBorderStyle') then Exit;
if not AlphaBlend then v:=1 else v:=Alpha/255;
SetWindowAlpha( TCarbonWindow(ACustomForm.Handle).Window, v);
end;
class procedure TCarbonWSCustomForm.SetFormStyle(const ACustomForm:TCustomForm;
const ANewFormStyle,AOldFormStyle:TFormStyle);
var
newClass : WindowClass;
begin
if not CheckHandle(ACustomForm, Self, 'SetFormStyle') then Exit;
case ANewFormStyle of
fsStayOnTop, fsSplash: newClass:=kFloatingWindowClass;
fsSystemStayOnTop: newClass:=kUtilityWindowClass;
else
newClass:=kDocumentWindowClass;
end;
OSError(
SetWindowGroup( TCarbonWindow(ACustomForm.Handle).Window, GetWindowGroupOfClass(newClass)),
Self, 'SetFormStyle', 'SetWindowGroup');
end;
class procedure TCarbonWSCustomForm.SetPopupParent(const ACustomForm:TCustomForm;
const APopupMode:TPopupMode;const APopupParent:TCustomForm);
begin
//todo: better "popup-parent" hanlding
if Assigned(APopupParent) and (APopupParent.Handle<>0) then
begin
SetWindowGroup( TCarbonWindow(ACustomForm.Handle).Window, GetWindowGroupOfClass(kHelpWindowClass));
end
else
SetFormStyle(ACustomForm, ACustomForm.FormStyle, ACustomForm.FormStyle);
end;
{ TCarbonWSHintWindow }
{------------------------------------------------------------------------------
Method: TCarbonWSHintWindow.CreateHandle
Params: AWinControl - LCL control
AParams - Creation parameters
Returns: Handle to the window in Carbon interface
Creates new hint window in Carbon interface with the specified parameters
------------------------------------------------------------------------------}
class function TCarbonWSHintWindow.CreateHandle(const AWinControl: TWinControl;
const AParams: TCreateParams): TLCLIntfHandle;
begin
Result := TLCLIntfHandle(TCarbonHintWindow.Create(AWinControl, AParams));
end;
end.