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:
sekelsenmat 2012-01-20 12:59:10 +00:00
parent 19cc5a8868
commit 5f9824929d
6 changed files with 80 additions and 89 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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 }
{------------------------------------------------------------------------------

View File

@ -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;