mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-13 06:09:14 +02:00
Various improvements and attempts at creating a WS implementation for TLazAccessibleObject
git-svn-id: trunk@34712 -
This commit is contained in:
parent
eae537252c
commit
61d31cd4c2
@ -2654,14 +2654,6 @@ type
|
|||||||
tvimAsPrevSibling
|
tvimAsPrevSibling
|
||||||
);
|
);
|
||||||
|
|
||||||
{ TTreeViewAccessibleObject }
|
|
||||||
|
|
||||||
TTreeViewAccessibleObject = class(TLazAccessibleObject)
|
|
||||||
public
|
|
||||||
function GetSelectedChildAccessibleObject: TLazAccessibleObject; override;
|
|
||||||
function GetChildAccessibleObjectAtPos(APos: TPoint): TLazAccessibleObject; override;
|
|
||||||
end;
|
|
||||||
|
|
||||||
TCustomTreeView = class(TCustomControl)
|
TCustomTreeView = class(TCustomControl)
|
||||||
private
|
private
|
||||||
FBackgroundColor: TColor;
|
FBackgroundColor: TColor;
|
||||||
@ -2860,7 +2852,9 @@ type
|
|||||||
procedure WMSetFocus(var Message: TLMSetFocus); message LM_SETFOCUS;
|
procedure WMSetFocus(var Message: TLMSetFocus); message LM_SETFOCUS;
|
||||||
procedure WMKillFocus(var Message: TLMKillFocus); message LM_KILLFOCUS;
|
procedure WMKillFocus(var Message: TLMKillFocus); message LM_KILLFOCUS;
|
||||||
procedure Resize; override;
|
procedure Resize; override;
|
||||||
function CreateAccessibleObject: TLazAccessibleObject; override;
|
// Accessibility
|
||||||
|
function GetSelectedChildAccessibleObject: TLazAccessibleObject; override;
|
||||||
|
function GetChildAccessibleObjectAtPos(APos: TPoint): TLazAccessibleObject; override;
|
||||||
protected
|
protected
|
||||||
property AutoExpand: Boolean read GetAutoExpand write SetAutoExpand default False;
|
property AutoExpand: Boolean read GetAutoExpand write SetAutoExpand default False;
|
||||||
property BorderStyle default bsSingle;
|
property BorderStyle default bsSingle;
|
||||||
|
@ -895,17 +895,20 @@ type
|
|||||||
{ TLazAccessibleObject }
|
{ TLazAccessibleObject }
|
||||||
|
|
||||||
TLazAccessibleObject = class
|
TLazAccessibleObject = class
|
||||||
|
private
|
||||||
|
FHandle: PtrInt;
|
||||||
|
function GetHandle: PtrInt;
|
||||||
protected
|
protected
|
||||||
FChildren: TFPList; // of TLazAccessibleObject
|
FChildren: TFPList; // of TLazAccessibleObject
|
||||||
|
class procedure WSRegisterClass; virtual;//override;
|
||||||
public
|
public
|
||||||
AccessibleDescription: TCaption;
|
AccessibleDescription: TCaption;
|
||||||
AccessibleName: TCaption;
|
AccessibleName: TCaption;
|
||||||
AccessibleRole: TLazAccessibilityRole;
|
AccessibleRole: TLazAccessibilityRole;
|
||||||
ParentControl: TControl;
|
OwnerControl: TControl;
|
||||||
Parent: TLazAccessibleObject;
|
Parent: TLazAccessibleObject;
|
||||||
DataObject: TObject; // Availble to be used to connect to an object
|
DataObject: TObject; // Availble to be used to connect to an object
|
||||||
Handle: PtrInt;
|
constructor Create(AOwner: TControl); virtual;
|
||||||
constructor Create; virtual;
|
|
||||||
destructor Destroy; override;
|
destructor Destroy; override;
|
||||||
function AddChildAccessibleObject: TLazAccessibleObject; virtual;
|
function AddChildAccessibleObject: TLazAccessibleObject; virtual;
|
||||||
procedure ClearChildAccessibleObjects;
|
procedure ClearChildAccessibleObjects;
|
||||||
@ -915,6 +918,7 @@ type
|
|||||||
function GetChildAccessibleObjectsCount: Integer;
|
function GetChildAccessibleObjectsCount: Integer;
|
||||||
function GetSelectedChildAccessibleObject: TLazAccessibleObject; virtual;
|
function GetSelectedChildAccessibleObject: TLazAccessibleObject; virtual;
|
||||||
function GetChildAccessibleObjectAtPos(APos: TPoint): TLazAccessibleObject; virtual;
|
function GetChildAccessibleObjectAtPos(APos: TPoint): TLazAccessibleObject; virtual;
|
||||||
|
property Handle: PtrInt read GetHandle;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{* Note on TControl.Caption
|
{* Note on TControl.Caption
|
||||||
@ -934,7 +938,6 @@ type
|
|||||||
|
|
||||||
TControl = class(TLCLComponent)
|
TControl = class(TLCLComponent)
|
||||||
private
|
private
|
||||||
FAccessibleObject: TLazAccessibleObject;
|
|
||||||
FActionLink: TControlActionLink;
|
FActionLink: TControlActionLink;
|
||||||
FAlign: TAlign;
|
FAlign: TAlign;
|
||||||
FAnchors: TAnchors;
|
FAnchors: TAnchors;
|
||||||
@ -1092,6 +1095,7 @@ type
|
|||||||
procedure SetTop(Value: Integer);
|
procedure SetTop(Value: Integer);
|
||||||
procedure SetWidth(Value: Integer);
|
procedure SetWidth(Value: Integer);
|
||||||
protected
|
protected
|
||||||
|
FAccessibleObject: TLazAccessibleObject;
|
||||||
FControlState: TControlState;
|
FControlState: TControlState;
|
||||||
FCursor: TCursor;
|
FCursor: TCursor;
|
||||||
class procedure WSRegisterClass; override;
|
class procedure WSRegisterClass; override;
|
||||||
@ -1346,6 +1350,8 @@ type
|
|||||||
procedure SetAccesibilityFields(const ADescription, AName: string; const ARole: TLazAccessibilityRole);
|
procedure SetAccesibilityFields(const ADescription, AName: string; const ARole: TLazAccessibilityRole);
|
||||||
function GetAccessibleObject: TLazAccessibleObject;
|
function GetAccessibleObject: TLazAccessibleObject;
|
||||||
function CreateAccessibleObject: TLazAccessibleObject; virtual;
|
function CreateAccessibleObject: TLazAccessibleObject; virtual;
|
||||||
|
function GetSelectedChildAccessibleObject: TLazAccessibleObject; virtual;
|
||||||
|
function GetChildAccessibleObjectAtPos(APos: TPoint): TLazAccessibleObject; virtual;
|
||||||
public
|
public
|
||||||
// size
|
// size
|
||||||
procedure AdjustSize; virtual;// smart calling DoAutoSize
|
procedure AdjustSize; virtual;// smart calling DoAutoSize
|
||||||
|
@ -28,15 +28,29 @@
|
|||||||
|
|
||||||
{ TLazAccessibleObject }
|
{ TLazAccessibleObject }
|
||||||
|
|
||||||
constructor TLazAccessibleObject.Create;
|
function TLazAccessibleObject.GetHandle: PtrInt;
|
||||||
begin
|
begin
|
||||||
inherited Create;
|
// if FHandle = 0 then FHandle := TWSLazAccessibleObject(WidgetsetClass).CreateHandle(Self);
|
||||||
|
Result := FHandle;
|
||||||
|
end;
|
||||||
|
|
||||||
|
class procedure TLazAccessibleObject.WSRegisterClass;
|
||||||
|
begin
|
||||||
|
// inherited WSRegisterClass;
|
||||||
|
// RegisterLazAccessibleObject;
|
||||||
|
end;
|
||||||
|
|
||||||
|
constructor TLazAccessibleObject.Create(AOwner: TControl);
|
||||||
|
begin
|
||||||
|
inherited Create;//(AOwner);
|
||||||
|
OwnerControl := AOwner;
|
||||||
FChildren := TFPList.Create;
|
FChildren := TFPList.Create;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
destructor TLazAccessibleObject.Destroy;
|
destructor TLazAccessibleObject.Destroy;
|
||||||
begin
|
begin
|
||||||
ClearChildAccessibleObjects();
|
ClearChildAccessibleObjects();
|
||||||
|
// if FHandle <> 0 then TWSLazAccessibleObject(WidgetsetClass).DestroyHandle(Self);
|
||||||
inherited Destroy;
|
inherited Destroy;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -44,9 +58,8 @@ function TLazAccessibleObject.AddChildAccessibleObject: TLazAccessibleObject;
|
|||||||
begin
|
begin
|
||||||
Result := nil;
|
Result := nil;
|
||||||
if FChildren = nil then Exit;
|
if FChildren = nil then Exit;
|
||||||
Result := TLazAccessibleObject.Create;
|
Result := TLazAccessibleObject.Create(OwnerControl);
|
||||||
Result.Parent := Self;
|
Result.Parent := Self;
|
||||||
Result.ParentControl := Self.ParentControl;
|
|
||||||
FChildren.Add(Result);
|
FChildren.Add(Result);
|
||||||
//DebugLn('[TControl.AddChildAccessibleObject] Name=%s', [Name]);
|
//DebugLn('[TControl.AddChildAccessibleObject] Name=%s', [Name]);
|
||||||
end;
|
end;
|
||||||
@ -101,11 +114,15 @@ end;
|
|||||||
function TLazAccessibleObject.GetSelectedChildAccessibleObject: TLazAccessibleObject;
|
function TLazAccessibleObject.GetSelectedChildAccessibleObject: TLazAccessibleObject;
|
||||||
begin
|
begin
|
||||||
Result := nil;
|
Result := nil;
|
||||||
|
if OwnerControl = nil then Exit;
|
||||||
|
Result := OwnerControl.GetSelectedChildAccessibleObject();
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TLazAccessibleObject.GetChildAccessibleObjectAtPos(APos: TPoint): TLazAccessibleObject;
|
function TLazAccessibleObject.GetChildAccessibleObjectAtPos(APos: TPoint): TLazAccessibleObject;
|
||||||
begin
|
begin
|
||||||
Result := nil;
|
Result := nil;
|
||||||
|
if OwnerControl = nil then Exit;
|
||||||
|
Result := OwnerControl.GetChildAccessibleObjectAtPos(APos);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{------------------------------------------------------------------------------
|
{------------------------------------------------------------------------------
|
||||||
@ -1502,8 +1519,17 @@ end;
|
|||||||
|
|
||||||
function TControl.CreateAccessibleObject: TLazAccessibleObject;
|
function TControl.CreateAccessibleObject: TLazAccessibleObject;
|
||||||
begin
|
begin
|
||||||
Result := TLazAccessibleObject.Create;
|
Result := TLazAccessibleObject.Create(Self);
|
||||||
Result.ParentControl := Self;
|
end;
|
||||||
|
|
||||||
|
function TControl.GetSelectedChildAccessibleObject: TLazAccessibleObject;
|
||||||
|
begin
|
||||||
|
Result := nil;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TControl.GetChildAccessibleObjectAtPos(APos: TPoint): TLazAccessibleObject;
|
||||||
|
begin
|
||||||
|
Result := nil;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{------------------------------------------------------------------------------
|
{------------------------------------------------------------------------------
|
||||||
|
@ -31,32 +31,6 @@
|
|||||||
|
|
||||||
{ TTreeViewAccessibleObject }
|
{ TTreeViewAccessibleObject }
|
||||||
|
|
||||||
function TTreeViewAccessibleObject.GetSelectedChildAccessibleObject: TLazAccessibleObject;
|
|
||||||
var
|
|
||||||
lTreeView: TCustomTreeView;
|
|
||||||
lNode: TTreeNode;
|
|
||||||
begin
|
|
||||||
Result := inherited GetSelectedChildAccessibleObject();
|
|
||||||
if (Result <> nil) or (ParentControl = nil) then Exit;
|
|
||||||
lTreeView := TCustomTreeView(ParentControl);
|
|
||||||
lNode := lTreeView.GetSelection();
|
|
||||||
if lNode = nil then Exit;
|
|
||||||
Result := GetChildAccessibleObjectWithDataObject(lNode);
|
|
||||||
end;
|
|
||||||
|
|
||||||
function TTreeViewAccessibleObject.GetChildAccessibleObjectAtPos(APos: TPoint): TLazAccessibleObject;
|
|
||||||
var
|
|
||||||
lTreeView: TCustomTreeView;
|
|
||||||
lNode: TTreeNode;
|
|
||||||
begin
|
|
||||||
Result := inherited GetChildAccessibleObjectAtPos(APos);
|
|
||||||
if (Result <> nil) or (ParentControl = nil) then Exit;
|
|
||||||
lTreeView := TCustomTreeView(ParentControl);
|
|
||||||
lNode := lTreeView.GetNodeAt(APos.X, APos.Y);
|
|
||||||
if lNode = nil then Exit;
|
|
||||||
Result := GetChildAccessibleObjectWithDataObject(lNode);
|
|
||||||
end;
|
|
||||||
|
|
||||||
const
|
const
|
||||||
TTreeNodeWithPointerStreamVersion : word = 1;
|
TTreeNodeWithPointerStreamVersion : word = 1;
|
||||||
TTreeNodeStreamVersion : word = 2;
|
TTreeNodeStreamVersion : word = 2;
|
||||||
@ -5347,10 +5321,24 @@ begin
|
|||||||
inherited Resize;
|
inherited Resize;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TCustomTreeView.CreateAccessibleObject: TLazAccessibleObject;
|
function TCustomTreeView.GetSelectedChildAccessibleObject: TLazAccessibleObject;
|
||||||
|
var
|
||||||
|
lNode: TTreeNode;
|
||||||
begin
|
begin
|
||||||
Result := TTreeViewAccessibleObject.Create;
|
Result := nil;
|
||||||
Result.ParentControl := Self;
|
lNode := GetSelection();
|
||||||
|
if lNode = nil then Exit;
|
||||||
|
Result := FAccessibleObject.GetChildAccessibleObjectWithDataObject(lNode);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TCustomTreeView.GetChildAccessibleObjectAtPos(APos: TPoint): TLazAccessibleObject;
|
||||||
|
var
|
||||||
|
lNode: TTreeNode;
|
||||||
|
begin
|
||||||
|
Result := nil;
|
||||||
|
lNode := GetNodeAt(APos.X, APos.Y);
|
||||||
|
if lNode = nil then Exit;
|
||||||
|
Result := FAccessibleObject.GetChildAccessibleObjectWithDataObject(lNode);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TCustomTreeView.InternalSelectionChanged;
|
procedure TCustomTreeView.InternalSelectionChanged;
|
||||||
|
@ -176,6 +176,7 @@ var
|
|||||||
lCount: Integer;
|
lCount: Integer;
|
||||||
i: Integer;
|
i: Integer;
|
||||||
lAccessibleObj: TLazAccessibleObject;
|
lAccessibleObj: TLazAccessibleObject;
|
||||||
|
lHandle: PtrInt;
|
||||||
const SName = 'CarbonControl_Accessibility';
|
const SName = 'CarbonControl_Accessibility';
|
||||||
begin
|
begin
|
||||||
{$IF defined(VerboseControlEvent) or defined(VerboseAccessibilityEvent)}
|
{$IF defined(VerboseControlEvent) or defined(VerboseAccessibilityEvent)}
|
||||||
@ -207,8 +208,9 @@ begin
|
|||||||
if lAccessibleObj = nil then Exit;
|
if lAccessibleObj = nil then Exit;
|
||||||
lAccessibleObj := lAccessibleObj.GetChildAccessibleObjectAtPos(lInputPoint);
|
lAccessibleObj := lAccessibleObj.GetChildAccessibleObjectAtPos(lInputPoint);
|
||||||
if (lAccessibleObj = nil) or (lAccessibleObj.Handle = 0) then Exit;
|
if (lAccessibleObj = nil) or (lAccessibleObj.Handle = 0) then Exit;
|
||||||
|
lHandle := lAccessibleObj.Handle;
|
||||||
SetEventParameter(AEvent, kEventParamAccessibleChild, typeCFTypeRef,
|
SetEventParameter(AEvent, kEventParamAccessibleChild, typeCFTypeRef,
|
||||||
SizeOf(AXUIElementRef), @lAccessibleObj.Handle);
|
SizeOf(AXUIElementRef), @lHandle);
|
||||||
end;
|
end;
|
||||||
kEventAccessibleGetAllAttributeNames:
|
kEventAccessibleGetAllAttributeNames:
|
||||||
begin
|
begin
|
||||||
@ -320,17 +322,9 @@ begin
|
|||||||
lArray := CFArrayCreateMutable(kCFAllocatorDefault, lCount, @kCFTypeArrayCallBacks);
|
lArray := CFArrayCreateMutable(kCFAllocatorDefault, lCount, @kCFTypeArrayCallBacks);
|
||||||
for i := 0 to lCount - 1 do
|
for i := 0 to lCount - 1 do
|
||||||
begin
|
begin
|
||||||
if lLazControl.GetAccessibleObject().Handle <> 0 then
|
//lElement := AXUIElementRef(lLazControl.GetAccessibleObject().Handle);
|
||||||
begin
|
lElement := MacOSAll.AXUIElementCreateSystemWide();
|
||||||
lElement := AXUIElementRef(lLazControl.GetAccessibleObject().Handle)
|
|
||||||
end
|
|
||||||
else
|
|
||||||
begin
|
|
||||||
lElement := MacOSAll.AXUIElementCreateSystemWide();
|
|
||||||
lLazControl.GetAccessibleObject().Handle := PtrInt(lElement);
|
|
||||||
end;
|
|
||||||
CFArrayAppendValue(lArray, lElement);
|
CFArrayAppendValue(lArray, lElement);
|
||||||
//CFRelease(lElement);
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
SetEventParameter(AEvent, kEventParamAccessibleAttributeValue, typeCFTypeRef,
|
SetEventParameter(AEvent, kEventParamAccessibleAttributeValue, typeCFTypeRef,
|
||||||
|
@ -67,6 +67,17 @@ type
|
|||||||
|
|
||||||
TWSDragImageListClass = class of TWSDragImageList;
|
TWSDragImageListClass = class of TWSDragImageList;
|
||||||
|
|
||||||
|
{ TWSLazAccessibleObject }
|
||||||
|
|
||||||
|
{ TWSLazAccessibleObject = class(TWSLCLComponent)
|
||||||
|
published
|
||||||
|
class procedure SetFields(const AObject: TLazAccessibleObject; const ADescription, AName: string; const ARole: TLazAccessibilityRole); virtual;
|
||||||
|
class function CreateHandle(const AObject: TLazAccessibleObject): HWND; virtual;
|
||||||
|
class procedure DestroyHandle(const AObject: TLazAccessibleObject); virtual;
|
||||||
|
end;}
|
||||||
|
//lElement := MacOSAll.AXUIElementCreateSystemWide();
|
||||||
|
//CFRelease(lElement);
|
||||||
|
|
||||||
{ TWSControl }
|
{ TWSControl }
|
||||||
|
|
||||||
TWSControl = class(TWSLCLComponent)
|
TWSControl = class(TWSLCLComponent)
|
||||||
@ -76,7 +87,6 @@ type
|
|||||||
class function GetDefaultColor(const AControl: TControl; const ADefaultColorType: TDefaultColorType): TColor; virtual;
|
class function GetDefaultColor(const AControl: TControl; const ADefaultColorType: TDefaultColorType): TColor; virtual;
|
||||||
class procedure ConstraintWidth(const AControl: TControl; const AConstraints: TObject; var aWidth: integer); virtual;
|
class procedure ConstraintWidth(const AControl: TControl; const AConstraints: TObject; var aWidth: integer); virtual;
|
||||||
class procedure ConstraintHeight(const AControl: TControl; const AConstraints: TObject; var aHeight: integer); virtual;
|
class procedure ConstraintHeight(const AControl: TControl; const AConstraints: TObject; var aHeight: integer); virtual;
|
||||||
//class procedure LazAccessibility_SetFields(const AControl: TControl; const ADescription, AName: string; const ARole: TLazAccessibilityRole); virtual;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
TWSControlClass = class of TWSControl;
|
TWSControlClass = class of TWSControl;
|
||||||
@ -144,14 +154,35 @@ type
|
|||||||
published
|
published
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure RegisterDragImageList;
|
procedure RegisterDragImageList;
|
||||||
procedure RegisterControl;
|
//procedure RegisterLazAccessibleObject;
|
||||||
procedure RegisterWinControl;
|
procedure RegisterControl;
|
||||||
procedure RegisterGraphicControl;
|
procedure RegisterWinControl;
|
||||||
procedure RegisterCustomControl;
|
procedure RegisterGraphicControl;
|
||||||
|
procedure RegisterCustomControl;
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
|
{ TWSLazAccessibleObject }
|
||||||
|
|
||||||
|
(*class procedure TWSLazAccessibleObject.SetFields(
|
||||||
|
const AObject: TLazAccessibleObject; const ADescription, AName: string;
|
||||||
|
const ARole: TLazAccessibilityRole);
|
||||||
|
begin
|
||||||
|
|
||||||
|
end;
|
||||||
|
|
||||||
|
class function TWSLazAccessibleObject.CreateHandle(
|
||||||
|
const AObject: TLazAccessibleObject): HWND;
|
||||||
|
begin
|
||||||
|
Result := 0;
|
||||||
|
end;
|
||||||
|
|
||||||
|
class procedure TWSLazAccessibleObject.DestroyHandle(
|
||||||
|
const AObject: TLazAccessibleObject);
|
||||||
|
begin
|
||||||
|
|
||||||
|
end;*)
|
||||||
|
|
||||||
{ TWSControl }
|
{ TWSControl }
|
||||||
|
|
||||||
@ -181,12 +212,6 @@ begin
|
|||||||
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{class procedure TWSControl.LazAccessibility_SetFields(const AControl: TControl;
|
|
||||||
const ADescription, AName: string; const ARole: TLazAccessibilityRole);
|
|
||||||
begin
|
|
||||||
|
|
||||||
end;}
|
|
||||||
|
|
||||||
{ TWSWinControl }
|
{ TWSWinControl }
|
||||||
|
|
||||||
class procedure TWSWinControl.AdaptBounds(const AWinControl: TWinControl;
|
class procedure TWSWinControl.AdaptBounds(const AWinControl: TWinControl;
|
||||||
@ -384,6 +409,16 @@ begin
|
|||||||
Done := True;
|
Done := True;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
{procedure RegisterLazAccessibleObject;
|
||||||
|
const
|
||||||
|
Done: Boolean = False;
|
||||||
|
begin
|
||||||
|
if Done then exit;
|
||||||
|
if not WSRegisterControl then
|
||||||
|
RegisterWSComponent(TLazAccessibleObject, TWSLazAccessibleObject);
|
||||||
|
Done := True;
|
||||||
|
end;}
|
||||||
|
|
||||||
procedure RegisterControl;
|
procedure RegisterControl;
|
||||||
const
|
const
|
||||||
Done: Boolean = False;
|
Done: Boolean = False;
|
||||||
|
Loading…
Reference in New Issue
Block a user