mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-12-10 00:17:18 +01:00
Changes a little bit the Accessibility API. Removes notifications which were added to reflect the Mac API and are redundant. Splitted the setters for accessibility fields.
git-svn-id: trunk@34820 -
This commit is contained in:
parent
19cc5a8868
commit
5f9824929d
@ -889,11 +889,6 @@ type
|
||||
lapAutoAdjustForDPI // For desktops using High DPI, scale x and y to fit the DPI
|
||||
);
|
||||
|
||||
TLazAccessibilityNotification = (
|
||||
lanSelectedTextChanged,
|
||||
lanValueChanged
|
||||
);
|
||||
|
||||
TLazAccessibilityRole = (
|
||||
larAnimation, // An object that displays an animation.
|
||||
larButton, // A button.
|
||||
@ -937,22 +932,20 @@ type
|
||||
function GetHandle: PtrInt;
|
||||
protected
|
||||
FChildren: TFPList; // of TLazAccessibleObject
|
||||
FAccessibleDescription: TCaption;
|
||||
FAccessibleValue: TCaption;
|
||||
FAccessibleRole: TLazAccessibilityRole;
|
||||
class procedure WSRegisterClass; virtual;//override;
|
||||
public
|
||||
// Primary information
|
||||
AccessibleDescription: TCaption;
|
||||
AccessibleValue: TCaption;
|
||||
AccessibleRole: TLazAccessibilityRole;
|
||||
// Secondary information for notifications
|
||||
SelectedText: string;
|
||||
//
|
||||
OwnerControl: TControl;
|
||||
Parent: TLazAccessibleObject;
|
||||
DataObject: TObject; // Available to be used to connect to an object
|
||||
SecondaryHandle: PtrInt; // Available for Widgetsets to use
|
||||
constructor Create(AOwner: TControl); virtual;
|
||||
destructor Destroy; override;
|
||||
procedure SetAccesibilityFields(const ADescription, AValue: string; const ARole: TLazAccessibilityRole);
|
||||
procedure SetAccessibleDescription(const ADescription: TCaption);
|
||||
procedure SetAccessibleValue(const AValue: TCaption);
|
||||
procedure SetAccessibleRole(const ARole: TLazAccessibilityRole);
|
||||
function FindOwnerWinControl: TWinControl;
|
||||
function AddChildAccessibleObject: TLazAccessibleObject; virtual;
|
||||
procedure ClearChildAccessibleObjects;
|
||||
@ -962,7 +955,10 @@ type
|
||||
function GetChildAccessibleObjectsCount: Integer;
|
||||
function GetSelectedChildAccessibleObject: TLazAccessibleObject; virtual;
|
||||
function GetChildAccessibleObjectAtPos(APos: TPoint): TLazAccessibleObject; virtual;
|
||||
procedure SendNotification(ANotification: TLazAccessibilityNotification);
|
||||
// Primary information
|
||||
property AccessibleDescription: TCaption read FAccessibleDescription write SetAccessibleDescription;
|
||||
property AccessibleValue: TCaption read FAccessibleValue write SetAccessibleValue;
|
||||
property AccessibleRole: TLazAccessibilityRole read FAccessibleRole write SetAccessibleRole;
|
||||
property Handle: PtrInt read GetHandle;
|
||||
end;
|
||||
|
||||
@ -1392,7 +1388,6 @@ type
|
||||
DropControl: TControl; ControlSide: TAlign): Boolean;
|
||||
function Dragging: Boolean;
|
||||
// accessibility
|
||||
procedure SetAccesibilityFields(const ADescription, AValue: string; const ARole: TLazAccessibilityRole);
|
||||
function GetAccessibleObject: TLazAccessibleObject;
|
||||
function CreateAccessibleObject: TLazAccessibleObject; virtual;
|
||||
function GetSelectedChildAccessibleObject: TLazAccessibleObject; virtual;
|
||||
|
||||
@ -64,16 +64,34 @@ begin
|
||||
inherited Destroy;
|
||||
end;
|
||||
|
||||
procedure TLazAccessibleObject.SetAccesibilityFields(const ADescription,
|
||||
AValue: string; const ARole: TLazAccessibilityRole);
|
||||
procedure TLazAccessibleObject.SetAccessibleDescription(const ADescription: TCaption);
|
||||
var
|
||||
WidgetsetClass: TWSLazAccessibleObjectClass;
|
||||
begin
|
||||
AccessibleDescription := ADescription;
|
||||
AccessibleValue := AValue;
|
||||
AccessibleRole := ARole;
|
||||
if FAccessibleDescription=ADescription then Exit;
|
||||
FAccessibleDescription := ADescription;
|
||||
WidgetsetClass := TWSLazAccessibleObjectClass(GetWSLazAccessibleObject());
|
||||
WidgetsetClass.SetFields(Self, ADescription, AValue, ARole);
|
||||
WidgetsetClass.SetAccessibleDescription(Self, ADescription);
|
||||
end;
|
||||
|
||||
procedure TLazAccessibleObject.SetAccessibleValue(const AValue: TCaption);
|
||||
var
|
||||
WidgetsetClass: TWSLazAccessibleObjectClass;
|
||||
begin
|
||||
if FAccessibleValue=AValue then Exit;
|
||||
FAccessibleValue := AValue;
|
||||
WidgetsetClass := TWSLazAccessibleObjectClass(GetWSLazAccessibleObject());
|
||||
WidgetsetClass.SetAccessibleValue(Self, AValue);
|
||||
end;
|
||||
|
||||
procedure TLazAccessibleObject.SetAccessibleRole(const ARole: TLazAccessibilityRole);
|
||||
var
|
||||
WidgetsetClass: TWSLazAccessibleObjectClass;
|
||||
begin
|
||||
if FAccessibleRole=ARole then Exit;
|
||||
FAccessibleRole := ARole;
|
||||
WidgetsetClass := TWSLazAccessibleObjectClass(GetWSLazAccessibleObject());
|
||||
WidgetsetClass.SetAccessibleRole(Self, ARole);
|
||||
end;
|
||||
|
||||
function TLazAccessibleObject.FindOwnerWinControl: TWinControl;
|
||||
@ -155,15 +173,6 @@ begin
|
||||
Result := OwnerControl.GetChildAccessibleObjectAtPos(APos);
|
||||
end;
|
||||
|
||||
procedure TLazAccessibleObject.SendNotification(
|
||||
ANotification: TLazAccessibilityNotification);
|
||||
var
|
||||
WidgetsetClass: TWSLazAccessibleObjectClass;
|
||||
begin
|
||||
WidgetsetClass := TWSLazAccessibleObjectClass(GetWSLazAccessibleObject());
|
||||
WidgetsetClass.SendNotification(Self, ANotification);
|
||||
end;
|
||||
|
||||
{------------------------------------------------------------------------------
|
||||
TControl.AdjustSize
|
||||
|
||||
@ -1477,20 +1486,17 @@ end;
|
||||
|
||||
procedure TControl.SetAccessibleDescription(AValue: TCaption);
|
||||
begin
|
||||
if FAccessibleObject.AccessibleDescription=AValue then Exit;
|
||||
SetAccesibilityFields(AValue, FAccessibleObject.AccessibleValue, FAccessibleObject.AccessibleRole);
|
||||
FAccessibleObject.AccessibleDescription := AValue;
|
||||
end;
|
||||
|
||||
procedure TControl.SetAccessibleValue(AValue: TCaption);
|
||||
begin
|
||||
if FAccessibleObject.AccessibleValue=AValue then Exit;
|
||||
SetAccesibilityFields(FAccessibleObject.AccessibleDescription, AValue, FAccessibleObject.AccessibleRole);
|
||||
FAccessibleObject.AccessibleValue := AValue;
|
||||
end;
|
||||
|
||||
procedure TControl.SetAccessibleRole(AValue: TLazAccessibilityRole);
|
||||
begin
|
||||
if FAccessibleObject.AccessibleRole=AValue then Exit;
|
||||
SetAccesibilityFields(FAccessibleObject.AccessibleDescription, FAccessibleObject.AccessibleValue, AValue);
|
||||
FAccessibleObject.AccessibleRole := AValue;
|
||||
end;
|
||||
|
||||
{------------------------------------------------------------------------------
|
||||
@ -1543,11 +1549,6 @@ begin
|
||||
end;
|
||||
|
||||
// accessibility
|
||||
procedure TControl.SetAccesibilityFields(const ADescription, AValue: string; const ARole: TLazAccessibilityRole);
|
||||
begin
|
||||
FAccessibleObject.SetAccesibilityFields(ADescription, AValue, ARole);
|
||||
end;
|
||||
|
||||
function TControl.GetAccessibleObject: TLazAccessibleObject;
|
||||
begin
|
||||
Result := FAccessibleObject;
|
||||
|
||||
@ -1939,7 +1939,8 @@ begin
|
||||
BiDiMode := Application.BidiMode;
|
||||
|
||||
// Accessibility
|
||||
SetAccesibilityFields('A window', 'T Form', larWindow);
|
||||
AccessibleDescription := 'A window';
|
||||
AccessibleRole := larWindow;
|
||||
|
||||
// the EndFormUpdate is done in AfterConstruction
|
||||
end;
|
||||
|
||||
@ -3032,7 +3032,9 @@ begin
|
||||
FTreeLineColor := clWindowFrame;
|
||||
FTreeLinePenStyle := psPattern;
|
||||
FExpandSignColor := clWindowFrame;
|
||||
SetAccesibilityFields('A tree of items', '', larTreeView);
|
||||
// Accessibility
|
||||
AccessibleDescription := 'A tree of items';
|
||||
AccessibleRole := larTreeView;
|
||||
end;
|
||||
|
||||
destructor TCustomTreeView.Destroy;
|
||||
@ -4284,15 +4286,14 @@ procedure TCustomTreeView.DoSelectionChanged;
|
||||
var
|
||||
lAccessibleObject: TLazAccessibleObject;
|
||||
lSelection: TTreeNode;
|
||||
lSelectedText: string;
|
||||
begin
|
||||
// Update the accessibility information
|
||||
lAccessibleObject := GetAccessibleObject();
|
||||
lSelection := Self.Selected;
|
||||
if lSelection = nil then lAccessibleObject.SelectedText := ''
|
||||
else lAccessibleObject.SelectedText := lSelection.Text;
|
||||
lAccessibleObject.SetAccesibilityFields(lAccessibleObject.AccessibleDescription,
|
||||
lAccessibleObject.SelectedText, lAccessibleObject.AccessibleRole);
|
||||
lAccessibleObject.SendNotification(lanValueChanged);
|
||||
if lSelection = nil then lSelectedText := ''
|
||||
else lSelectedText := lSelection.Text;
|
||||
lAccessibleObject.AccessibleValue := lSelectedText;
|
||||
|
||||
if Assigned(OnSelectionChanged) then OnSelectionChanged(Self);
|
||||
end;
|
||||
|
||||
@ -54,10 +54,11 @@ type
|
||||
private
|
||||
class procedure GetCarbonAXIdentifiers(const AObject: TLazAccessibleObject; out AHIObject: HIObjectRef; out AID64: UInt64);
|
||||
public
|
||||
class procedure SetFields(const AObject: TLazAccessibleObject; const ADescription, AValue: string; const ARole: TLazAccessibilityRole); override;
|
||||
class function CreateHandle(const AObject: TLazAccessibleObject): HWND; override;
|
||||
class procedure DestroyHandle(const AObject: TLazAccessibleObject); override;
|
||||
class procedure SendNotification(const AObject: TLazAccessibleObject; ANotification: TLazAccessibilityNotification); override;
|
||||
class procedure SetAccessibleDescription(const AObject: TLazAccessibleObject; const ADescription: string); override;
|
||||
class procedure SetAccessibleValue(const AObject: TLazAccessibleObject; const AValue: string); override;
|
||||
class procedure SetAccessibleRole(const AObject: TLazAccessibleObject; const ARole: TLazAccessibilityRole); override;
|
||||
end;
|
||||
|
||||
{ TCarbonWSControl }
|
||||
@ -151,23 +152,6 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
class procedure TCarbonWSLazAccessibleObject.SetFields(
|
||||
const AObject: TLazAccessibleObject; const ADescription, AValue: string;
|
||||
const ARole: TLazAccessibilityRole);
|
||||
var
|
||||
lElement: AXUIElementRef;
|
||||
lHIObject: HIObjectRef;
|
||||
lID64: UInt64;
|
||||
lValueStr: CFStringRef;
|
||||
begin
|
||||
GetCarbonAXIdentifiers(AObject, lHIObject, lID64);
|
||||
if lHIObject = nil then Exit;
|
||||
|
||||
CreateCFString(AValue, lValueStr);
|
||||
HIObjectSetAuxiliaryAccessibilityAttribute(lHIObject, lID64, CFStr('AXValue'), lValueStr);
|
||||
FreeCFString(lValueStr);
|
||||
end;
|
||||
|
||||
class function TCarbonWSLazAccessibleObject.CreateHandle(
|
||||
const AObject: TLazAccessibleObject): HWND;
|
||||
var
|
||||
@ -192,27 +176,34 @@ begin
|
||||
CFRelease(lElement);
|
||||
end;
|
||||
|
||||
class procedure TCarbonWSLazAccessibleObject.SendNotification(
|
||||
const AObject: TLazAccessibleObject;
|
||||
ANotification: TLazAccessibilityNotification);
|
||||
class procedure TCarbonWSLazAccessibleObject.SetAccessibleDescription(const AObject: TLazAccessibleObject; const ADescription: string);
|
||||
begin
|
||||
|
||||
end;
|
||||
|
||||
class procedure TCarbonWSLazAccessibleObject.SetAccessibleValue(const AObject: TLazAccessibleObject; const AValue: string);
|
||||
var
|
||||
lNotification: CFStringRef;
|
||||
lElement: AXUIElementRef;
|
||||
lHIObject: HIObjectRef;
|
||||
lID64: UInt64;
|
||||
lValueStr, lNotification: CFStringRef;
|
||||
begin
|
||||
GetCarbonAXIdentifiers(AObject, lHIObject, lID64);
|
||||
if lHIObject = nil then Exit;
|
||||
|
||||
case ANotification of
|
||||
lanSelectedTextChanged: lNotification := CFSTR('AXValueChanged');
|
||||
lanValueChanged: lNotification := CFSTR('AXValueChanged');
|
||||
else
|
||||
Exit;
|
||||
end;
|
||||
CreateCFString(AValue, lValueStr);
|
||||
HIObjectSetAuxiliaryAccessibilityAttribute(lHIObject, lID64, CFStr('AXValue'), lValueStr);
|
||||
FreeCFString(lValueStr);
|
||||
|
||||
lNotification := CFSTR('AXValueChanged');
|
||||
AXNotificationHIObjectNotify(lNotification, lHIObject, lID64);
|
||||
end;
|
||||
|
||||
class procedure TCarbonWSLazAccessibleObject.SetAccessibleRole(const AObject: TLazAccessibleObject; const ARole: TLazAccessibilityRole);
|
||||
begin
|
||||
|
||||
end;
|
||||
|
||||
{ TCarbonWSWinControl }
|
||||
|
||||
{------------------------------------------------------------------------------
|
||||
|
||||
@ -71,10 +71,11 @@ type
|
||||
|
||||
TWSLazAccessibleObject = class(TWSObject)
|
||||
public
|
||||
class procedure SetFields(const AObject: TLazAccessibleObject; const ADescription, AValue: string; const ARole: TLazAccessibilityRole); virtual;
|
||||
class function CreateHandle(const AObject: TLazAccessibleObject): HWND; virtual;
|
||||
class procedure DestroyHandle(const AObject: TLazAccessibleObject); virtual;
|
||||
class procedure SendNotification(const AObject: TLazAccessibleObject; ANotification: TLazAccessibilityNotification); virtual;
|
||||
class procedure SetAccessibleDescription(const AObject: TLazAccessibleObject; const ADescription: string); virtual;
|
||||
class procedure SetAccessibleValue(const AObject: TLazAccessibleObject; const AValue: string); virtual;
|
||||
class procedure SetAccessibleRole(const AObject: TLazAccessibleObject; const ARole: TLazAccessibilityRole); virtual;
|
||||
end;
|
||||
TWSLazAccessibleObjectClass = class of TWSLazAccessibleObject;
|
||||
|
||||
@ -165,13 +166,6 @@ implementation
|
||||
|
||||
{ TWSLazAccessibleObject }
|
||||
|
||||
class procedure TWSLazAccessibleObject.SetFields(
|
||||
const AObject: TLazAccessibleObject; const ADescription, AValue: string;
|
||||
const ARole: TLazAccessibilityRole);
|
||||
begin
|
||||
|
||||
end;
|
||||
|
||||
class function TWSLazAccessibleObject.CreateHandle(
|
||||
const AObject: TLazAccessibleObject): HWND;
|
||||
begin
|
||||
@ -184,9 +178,17 @@ begin
|
||||
|
||||
end;
|
||||
|
||||
class procedure TWSLazAccessibleObject.SendNotification(
|
||||
const AObject: TLazAccessibleObject;
|
||||
ANotification: TLazAccessibilityNotification);
|
||||
class procedure TWSLazAccessibleObject.SetAccessibleDescription(const AObject: TLazAccessibleObject; const ADescription: string);
|
||||
begin
|
||||
|
||||
end;
|
||||
|
||||
class procedure TWSLazAccessibleObject.SetAccessibleValue(const AObject: TLazAccessibleObject; const AValue: string);
|
||||
begin
|
||||
|
||||
end;
|
||||
|
||||
class procedure TWSLazAccessibleObject.SetAccessibleRole(const AObject: TLazAccessibleObject; const ARole: TLazAccessibilityRole);
|
||||
begin
|
||||
|
||||
end;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user