Starts implementing accessibility support for TEdit in LCL-CustomDrawn-Cocoa

git-svn-id: trunk@38200 -
This commit is contained in:
sekelsenmat 2012-08-08 06:13:53 +00:00
parent 1be9d080b5
commit 80ab27d495
2 changed files with 148 additions and 16 deletions

View File

@ -81,6 +81,8 @@ begin
FAutoSelect := True;
FAutoSelected := False;
AutoSize := True;
// Accessibility
AccessibleRole := larTextEditorSingleline;
end;
{------------------------------------------------------------------------------

View File

@ -110,6 +110,8 @@ type
LCLInjectedControl: TCustomControl;
LCLBaseControl: TCDBaseControl;
procedure ReadInjectedAndBaseControl; message 'ReadInjectedAndBaseControl';
function GetSelectedText: PChar; message 'GetSelectedText';
function GetSelectedTextStart: Integer; message 'GetSelectedTextStart';
//NSAccessibilityCategory = objccategory external (NSObject)
function accessibilityAttributeNames: NSArray; override;
function accessibilityAttributeValue(attribute: NSString): id; override;
@ -1047,39 +1049,98 @@ begin
end;
end;
function TCocoaAccessibleObject.GetSelectedText: PChar;
begin
Result := '';
end;
function TCocoaAccessibleObject.GetSelectedTextStart: Integer;
begin
Result := 0;
end;
{
See the documentation about accessibility Roles and their required attributes:
http://developer.apple.com/library/mac/documentation/UserExperience/Reference/Accessibility_RoleAttribute_Ref/Role.html
}
function TCocoaAccessibleObject.accessibilityAttributeNames: NSArray;
var
lResult: NSMutableArray;
lCocoaRole: NSString;
// Basic elements which most roles have
procedure AddBasicAttributes;
begin
lResult.addObject(NSAccessibilityDescriptionAttribute);
lResult.addObject(NSAccessibilityEnabledAttribute);
lResult.addObject(NSAccessibilityFocusedAttribute);
lResult.addObject(NSAccessibilityParentAttribute);
lResult.addObject(NSAccessibilityPositionAttribute);
lResult.addObject(NSAccessibilityRoleAttribute);
lResult.addObject(NSAccessibilitySizeAttribute);
lResult.addObject(NSAccessibilityTitleAttribute);
lResult.addObject(NSAccessibilityTopLevelUIElementAttribute);
lResult.addObject(NSAccessibilityWindowAttribute);
end;
begin
{$ifdef VerboseCDAccessibility}
DebugLn(Format('[TCocoaAccessibleObject.accessibilityAttributeNames] Self=%x', [PtrUInt(Self)]));
{$endif}
lResult := NSMutableArray.array_();
// Basic elements which all roles have
lResult.addObject(NSAccessibilityDescriptionAttribute);
lResult.addObject(NSAccessibilityEnabledAttribute);
lResult.addObject(NSAccessibilityFocusedAttribute);
lResult.addObject(NSAccessibilityParentAttribute);
lResult.addObject(NSAccessibilityPositionAttribute);
lResult.addObject(NSAccessibilityRoleAttribute);
lResult.addObject(NSAccessibilitySizeAttribute);
lResult.addObject(NSAccessibilityTitleAttribute);
lResult.addObject(NSAccessibilityTopLevelUIElementAttribute);
lResult.addObject(NSAccessibilityWindowAttribute);
lCocoaRole := TCocoaCustomControl.LazRoleToCocoaRole(LCLAcc.AccessibleRole);
//larAnimation
//larButton
if lCocoaRole.isEqualToString(NSAccessibilityButtonRole) then
begin
AddBasicAttributes();
lResult.addObject(NSAccessibilityRoleDescriptionAttribute);
end
else if lCocoaRole.isEqualToString(NSAccessibilityStaticTextRole) then
//larCell
//larChart
//larCheckBox
//larClock
//larColorPicker
//larComboBox
//larDateField
//larGrid
//larGroup
//larImage
//larLabel
else if lCocoaRole.isEqualToString(NSAccessibilityStaticTextRole) then
begin
AddBasicAttributes();
lResult.addObject(NSAccessibilityValueAttribute);
end
//larListBox
//larListItem
//larMenuBar
//larMenuItem
//larProgressIndicator
//larRadioButton
//larResizeGrip
//larScrollBar
//larSpinner
//larTabControl
//larTextEditorMultiline
//larTextEditorSingleline
else if lCocoaRole.isEqualToString(NSAccessibilityTextFieldRole) then
begin
AddBasicAttributes();
lResult.addObject(NSAccessibilityNumberOfCharactersAttribute); // Number of characters in an editable text field. Must not be settable.
lResult.addObject(NSAccessibilitySelectedTextAttribute); // Currently selected text of a UI element. May be settable.
lResult.addObject(NSAccessibilitySelectedTextRangeAttribute); // Position and length (in characters) of a selected portion of text in the UI element. May be settable.
lResult.addObject(NSAccessibilityValueAttribute); // The elements value. May be settable.
lResult.addObject(NSAccessibilityVisibleCharacterRangeAttribute); // Range of characters that are scrolled into view in an editable text element. May be settable.
end
//larTrackBar
//larTreeView
//larTreeItem
//larWindow
else
begin
AddBasicAttributes();
end;
// This one we use to put LCL object and class names to help debugging =)
@ -1093,19 +1154,29 @@ end;
function TCocoaAccessibleObject.accessibilityAttributeValue(attribute: NSString): id;
var
lStrAttr: String;
lTmpStr: string;
//
lSize: TSize;
lPoint: TPoint;
lBool: Boolean;
lInt: Integer;
//
lAResult: NSArray;
lMAResult: NSMutableArray;
lSize: TSize;
lNSSize: NSSize;
lPoint: TPoint;
lNSPoint: NSPoint;
lBool: Boolean;
lNSRange: NSRange;
//
i: Integer;
lChildAcc: TLazAccessibleObject;
lForm: TCustomForm;
lParent: TWinControl;
function GetControlText: string;
begin
Result := LCLControl.Caption;
end;
begin
//Result := inherited accessibilityAttributeValue(attribute); -> This raises errors, so don't
Result := nil;
@ -1137,6 +1208,8 @@ begin
//
// Value
//
// The elements value. May be settable.
//
else if attribute.isEqualToString(NSAccessibilityValueAttribute) then
begin
Result := NSStringUtf8(LCLControl.Caption);
@ -1254,6 +1327,63 @@ begin
{$endif}
end
//
// NumberOfCharacters
//
// Number of characters in an editable text field. Must not be settable.
//
else if attribute.isEqualToString(NSAccessibilityNumberOfCharactersAttribute) then
begin
lTmpStr := LCLControl.Caption;
lInt := UTF8Length(lTmpStr);
Result := NSNumber.numberWithInt(lInt);
{$ifdef VerboseCDAccessibility}
DebugLn(Format(':<[TCocoaAccessibleObject.accessibilityAttributeValue] NSAccessibilityNumberOfCharactersAttribute Text=%s Result=%d', [lTmpStr, lInt]));
{$endif}
end
//
// SelectedText
//
// Currently selected text of a UI element. May be settable.
//
else if attribute.isEqualToString(NSAccessibilitySelectedTextAttribute) then
begin
lTmpStr := GetSelectedText();
Result := NSStringUtf8(lTmpStr);
//{$ifdef VerboseCDAccessibility}
//DebugLn(Format(':<[TCocoaAccessibleObject.accessibilityAttributeValue] NSAccessibilitySizeAttribute Result=%d,%d', [lSize.CX, lSize.CY]));
//{$endif}
end
//
// SelectedTextRange
//
// Position and length (in characters) of a selected portion of text in the UI element. May be settable.
//
else if attribute.isEqualToString(NSAccessibilitySelectedTextRangeAttribute) then
begin
lTmpStr := GetSelectedText();
lNSRange.location := GetSelectedTextStart();
lNSRange.length := UTF8Length(lTmpStr);
Result := NSValue.valueWithRange(lNSRange);
//{$ifdef VerboseCDAccessibility}
//DebugLn(Format(':<[TCocoaAccessibleObject.accessibilityAttributeValue] NSAccessibilitySizeAttribute Result=%d,%d', [lSize.CX, lSize.CY]));
//{$endif}
end
//
// VisibleCharacterRange
//
// Range of characters that are scrolled into view in an editable text element. May be settable.
//
else if attribute.isEqualToString(NSAccessibilityVisibleCharacterRangeAttribute) then
begin
lTmpStr := GetControlText();
lNSRange.location := 0;
lNSRange.length := UTF8Length(lTmpStr);
Result := NSValue.valueWithRange(lNSRange);
{$ifdef VerboseCDAccessibility}
DebugLn(Format(':<[TCocoaAccessibleObject.accessibilityAttributeValue] NSAccessibilitySizeAttribute Result=%d,%d', [lSize.CX, lSize.CY]));
{$endif}
end
//
// This one we use to put LCL object and class names to help debugging =)
//
else if attribute.isEqualToString(NSAccessibilityUnitDescriptionAttribute) then