603 lines
15 KiB
Plaintext
603 lines
15 KiB
Plaintext
unit VA508DelphiCompatibility;
|
|
|
|
interface
|
|
|
|
uses
|
|
SysUtils, Classes, Controls, Windows, StdCtrls, CheckLst, ExtCtrls, Forms,
|
|
ValEdit, DBGrids, Calendar, ComCtrls, VA508AccessibilityManager;
|
|
|
|
function GetCheckBoxComponentName(AllowGrayed: boolean): string;
|
|
function GetCheckBoxInstructionMessage(Checked: boolean): string;
|
|
function GetCheckBoxStateText(State: TCheckBoxState): String;
|
|
|
|
procedure ListViewIndexQueryProc(Sender: TObject; ItemIndex: integer; var Text: string);
|
|
|
|
type
|
|
TVA508StaticTextManager = class(TVA508ManagedComponentClass)
|
|
public
|
|
constructor Create; override;
|
|
function GetComponentName(Component: TWinControl): string; override;
|
|
function GetCaption(Component: TWinControl): string; override;
|
|
function GetValue(Component: TWinControl): string; override;
|
|
end;
|
|
|
|
implementation
|
|
|
|
uses Grids, VA508AccessibilityRouter, VA508AccessibilityConst, VA508MSAASupport,
|
|
VAUtils;
|
|
|
|
type
|
|
TCheckBox508Manager = class(TVA508ManagedComponentClass)
|
|
public
|
|
constructor Create; override;
|
|
function GetComponentName(Component: TWinControl): string; override;
|
|
function GetInstructions(Component: TWinControl): string; override;
|
|
function GetState(Component: TWinControl): string; override;
|
|
end;
|
|
|
|
TCheckListBox508Manager = class(TVA508ManagedComponentClass)
|
|
private
|
|
function GetIndex(Component: TWinControl): integer;
|
|
public
|
|
constructor Create; override;
|
|
function GetComponentName(Component: TWinControl): string; override;
|
|
function GetState(Component: TWinControl): string; override;
|
|
function GetItem(Component: TWinControl): TObject; override;
|
|
function GetItemInstructions(Component: TWinControl): string; override;
|
|
end;
|
|
|
|
TVA508EditManager = class(TVA508ManagedComponentClass)
|
|
public
|
|
constructor Create; override;
|
|
function GetValue(Component: TWinControl): string; override;
|
|
end;
|
|
|
|
TVA508ComboManager = class(TVA508ManagedComponentClass)
|
|
public
|
|
constructor Create; override;
|
|
function GetValue(Component: TWinControl): string; override;
|
|
end;
|
|
|
|
TCustomGrid508Manager = class(TVA508ManagedComponentClass)
|
|
private
|
|
public
|
|
constructor Create; override;
|
|
function GetComponentName(Component: TWinControl): string; override;
|
|
function GetInstructions(Component: TWinControl): string; override;
|
|
function GetValue(Component: TWinControl): string; override;
|
|
function GetItem(Component: TWinControl): TObject; override;
|
|
// function GetData(Component: TWinControl; Value: string): string; override;
|
|
end;
|
|
|
|
TVA508RegistrationScreenReader = class(TVA508ScreenReader);
|
|
|
|
function CustomComboAlternateHandle(Component: TWinControl): HWnd; forward;
|
|
|
|
procedure ListViewIndexQueryProc(Sender: TObject; ItemIndex: integer; var Text: string);
|
|
var
|
|
temp: string;
|
|
view: TListView;
|
|
item: TListItem;
|
|
i: integer;
|
|
include: boolean;
|
|
|
|
procedure Append(txt: string);
|
|
begin
|
|
if txt = '' then exit;
|
|
if text <> '' then
|
|
text := text + ' ';
|
|
text := text + txt + ',';
|
|
end;
|
|
|
|
procedure AppendHeader(txt: string);
|
|
begin
|
|
if txt = '' then
|
|
txt := 'blank header';
|
|
Append(txt);
|
|
end;
|
|
|
|
begin
|
|
view := TListView(Sender);
|
|
Text := '';
|
|
include := TRUE;
|
|
if (ItemIndex < 0) or (ItemIndex >= view.Items.Count) then exit;
|
|
item := view.Items.Item[ItemIndex];
|
|
if (view.ViewStyle = vsReport) and (view.Columns.Count > 0) then
|
|
begin
|
|
if view.Columns[0].Width < 1 then
|
|
include := FALSE
|
|
else
|
|
AppendHeader(view.Columns[0].Caption);
|
|
end;
|
|
if include then
|
|
begin
|
|
temp := item.Caption;
|
|
if temp = '' then
|
|
temp := 'blank';
|
|
Append(temp);
|
|
end;
|
|
|
|
if view.ViewStyle = vsReport then
|
|
begin
|
|
for i := 1 to view.Columns.Count - 1 do
|
|
begin
|
|
if view.Columns[i].Width > 0 then
|
|
begin
|
|
AppendHeader(view.Columns[i].Caption);
|
|
if (i-1) < item.SubItems.Count then
|
|
temp := item.SubItems[i-1]
|
|
else
|
|
temp := '';
|
|
if temp = '' then
|
|
temp := 'blank';
|
|
Append(temp);
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure RegisterStandardDelphiComponents;
|
|
begin
|
|
RegisterAlternateHandleComponent(TCustomCombo, CustomComboAlternateHandle);
|
|
RegisterManagedComponentClass(TCheckBox508Manager.Create);
|
|
RegisterManagedComponentClass(TCheckListBox508Manager.Create);
|
|
RegisterManagedComponentClass(TCustomGrid508Manager.Create);
|
|
RegisterManagedComponentClass(TVA508StaticTextManager.Create);
|
|
RegisterManagedComponentClass(TVA508EditManager.Create);
|
|
RegisterManagedComponentClass(TVA508ComboManager.Create);
|
|
|
|
with TVA508RegistrationScreenReader(GetScreenReader) do
|
|
begin
|
|
// even though TListView is in Default.JCF, we add it here to clear out previous MSAA setting
|
|
RegisterCustomClassBehavior(TListView.ClassName, CLASS_BEHAVIOR_LIST_VIEW);
|
|
RegisterCustomClassBehavior(TVA508StaticText.ClassName, CLASS_BEHAVIOR_STATIC_TEXT);
|
|
end;
|
|
|
|
RegisterMSAAQueryListClassProc(TListView, ListViewIndexQueryProc);
|
|
|
|
{ TODO -oJeremy Merrill -c508 :
|
|
Add these components as ones that need an alternate handle
|
|
TColorBox
|
|
TValueListEditor ?? - may be fixed because it's a TStringGrid
|
|
TCaptionStringGrid
|
|
TToolBar (not needed when the tool bar doesn't have focus)
|
|
TPageScroller
|
|
|
|
add stuff for image processing
|
|
descendents of TCustomTabControl
|
|
|
|
|
|
}
|
|
|
|
{ TODO -oJeremy Merrill -c508 :Need to create a fix for the list box stuff here}
|
|
end;
|
|
|
|
{ TCustomCombo Alternate Handle }
|
|
|
|
type
|
|
TExposedCustomCombo = class(TCustomCombo)
|
|
public
|
|
property EditHandle;
|
|
end;
|
|
|
|
function CustomComboAlternateHandle(Component: TWinControl): HWnd;
|
|
begin
|
|
Result := TExposedCustomCombo(Component).EditHandle;
|
|
end;
|
|
|
|
{ Check Box Utils - used by multiple classes }
|
|
|
|
function GetCheckBoxComponentName(AllowGrayed: boolean): string;
|
|
begin
|
|
if AllowGrayed then
|
|
Result := 'Three State Check Box'
|
|
else
|
|
Result := 'Check Box';
|
|
end;
|
|
|
|
function GetCheckBoxInstructionMessage(Checked: boolean): string;
|
|
begin
|
|
if not Checked then // handles clear and gray entries
|
|
Result := 'to check press space bar'
|
|
else
|
|
Result := 'to clear check mark press space bar';
|
|
end;
|
|
|
|
function GetCheckBoxStateText(State: TCheckBoxState): String;
|
|
begin
|
|
case State of
|
|
cbUnchecked: Result := 'not checked';
|
|
cbChecked: Result := 'checked';
|
|
cbGrayed: Result := 'Partially Checked';
|
|
else Result := '';
|
|
end;
|
|
end;
|
|
{ TCheckBox508Manager }
|
|
|
|
constructor TCheckBox508Manager.Create;
|
|
begin
|
|
inherited Create(TCheckBox, [mtComponentName, mtInstructions, mtState, mtStateChange]);
|
|
end;
|
|
|
|
function TCheckBox508Manager.GetComponentName(Component: TWinControl): string;
|
|
begin
|
|
Result := GetCheckBoxComponentName(TCheckBox(Component).AllowGrayed);
|
|
end;
|
|
|
|
function TCheckBox508Manager.GetInstructions(Component: TWinControl): string;
|
|
begin
|
|
Result := GetCheckBoxInstructionMessage(TCheckBox(Component).Checked);
|
|
end;
|
|
|
|
function TCheckBox508Manager.GetState(Component: TWinControl): string;
|
|
begin
|
|
Result := GetCheckBoxStateText(TCheckBox(Component).State);
|
|
end;
|
|
|
|
{ TCheckListBox508Manager }
|
|
|
|
constructor TCheckListBox508Manager.Create;
|
|
begin
|
|
inherited Create(TCheckListBox, [mtComponentName, mtState, mtStateChange, mtItemChange, mtItemInstructions]);
|
|
end;
|
|
|
|
function TCheckListBox508Manager.GetComponentName(
|
|
Component: TWinControl): string;
|
|
var
|
|
lb : TCheckListBox;
|
|
begin
|
|
lb := TCheckListBox(Component);
|
|
if lb.AllowGrayed then
|
|
Result := 'Three State Check List Box'
|
|
else
|
|
Result := 'Check List Box';
|
|
end;
|
|
|
|
function TCheckListBox508Manager.GetItemInstructions(
|
|
Component: TWinControl): string;
|
|
var
|
|
lb : TCheckListBox;
|
|
idx: integer;
|
|
begin
|
|
lb := TCheckListBox(Component);
|
|
idx := GetIndex(Component);
|
|
if (idx < 0) then
|
|
Result := ''
|
|
else
|
|
Result := GetCheckBoxInstructionMessage(lb.Checked[idx]);
|
|
end;
|
|
|
|
function TCheckListBox508Manager.GetIndex(Component: TWinControl): integer;
|
|
var
|
|
lb : TCheckListBox;
|
|
begin
|
|
lb := TCheckListBox(Component);
|
|
if (lb.ItemIndex < 0) then
|
|
begin
|
|
if lb.Count > 0 then
|
|
Result := 0
|
|
else
|
|
Result := -1
|
|
end
|
|
else
|
|
Result := lb.ItemIndex;
|
|
end;
|
|
|
|
function TCheckListBox508Manager.GetItem(Component: TWinControl): TObject;
|
|
var
|
|
lb : TCheckListBox;
|
|
begin
|
|
lb := TCheckListBox(Component);
|
|
Result := TObject((lb.items.Count * 10000) + (lb.ItemIndex + 2));
|
|
end;
|
|
|
|
function TCheckListBox508Manager.GetState(Component: TWinControl): string;
|
|
var
|
|
lb : TCheckListBox;
|
|
idx: integer;
|
|
begin
|
|
lb := TCheckListBox(Component);
|
|
idx := GetIndex(Component);
|
|
if idx < 0 then
|
|
Result := ''
|
|
else
|
|
Result := GetCheckBoxStateText(lb.State[idx]);
|
|
end;
|
|
|
|
{ TCustomForm508Manager }
|
|
|
|
type
|
|
TAccessGrid = class(TCustomGrid);
|
|
|
|
constructor TCustomGrid508Manager.Create;
|
|
begin
|
|
{ TODO : Add support for other string grid features - like state changes for editing or selecting cells }
|
|
// inherited Create(TStringGrid, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE);
|
|
inherited Create(TCustomGrid, [mtComponentName, mtInstructions, mtValue, mtItemChange], TRUE);
|
|
// FLastX := -1;
|
|
// FLastY := -1;
|
|
end;
|
|
|
|
// Data pieces
|
|
// 1 = Column header, if any
|
|
// 2 = Column #
|
|
// 3 = number of columns
|
|
// 4 = Row header, if any
|
|
// 5 = Row #
|
|
// 6 = number of rows
|
|
// 7 = Cell #
|
|
// 8 = total # of cells
|
|
// 9 = cell contents
|
|
|
|
const
|
|
DELIM = '^';
|
|
|
|
function TCustomGrid508Manager.GetComponentName(Component: TWinControl): string;
|
|
begin
|
|
Result := ' grid ';
|
|
// don't use 'grid' - we're abandoning the special code in the JAWS scripts for
|
|
// grids - it's too messy, and based on the 'grid' component name
|
|
end;
|
|
{
|
|
function TCustomGrid508Manager.GetData(Component: TWinControl; Value: string): string;
|
|
|
|
var
|
|
grid: TAccessGrid;
|
|
row, col: integer;
|
|
cnt, x, y, max, mult: integer;
|
|
txt: string;
|
|
|
|
procedure Add(txt: integer); overload;
|
|
begin
|
|
Result := Result + inttostr(txt) + DELIM;
|
|
end;
|
|
|
|
procedure Add(txt: string); overload;
|
|
begin
|
|
Result := Result + Piece(txt,DELIM,1) + DELIM;
|
|
end;
|
|
|
|
begin
|
|
grid := TAccessGrid(Component);
|
|
row := grid.Row;
|
|
col := grid.Col;
|
|
if (row >= 0) and (col >= 0) then
|
|
begin
|
|
if grid.FixedRows > 0 then
|
|
Add(grid.GetEditText(col, 0))
|
|
else
|
|
Add('');
|
|
Add(col - grid.FixedCols + 1);
|
|
Add(grid.ColCount - grid.FixedCols);
|
|
|
|
if grid.FixedCols > 0 then
|
|
Add(grid.GetEditText(0, row))
|
|
else
|
|
Add('');
|
|
Add(row - grid.FixedRows + 1);
|
|
Add(grid.RowCount - grid.FixedRows);
|
|
|
|
x := grid.ColCount - grid.FixedCols;
|
|
y := grid.RowCount - grid.FixedRows;
|
|
max := x * y;
|
|
x := grid.Col - grid.FixedCols;
|
|
y := grid.Row - grid.FixedRows;
|
|
mult := grid.ColCount - grid.FixedCols;
|
|
|
|
if (mult > 0) and
|
|
(x >= 0) and (x < grid.ColCount) and
|
|
(y >= 0) and (y < grid.RowCount) then
|
|
begin
|
|
cnt := (y * mult) + x + 1;
|
|
Add(cnt);
|
|
end
|
|
else
|
|
Add(0);
|
|
Add(max);
|
|
|
|
if Value = '' then
|
|
txt := grid.GetEditText(col, row)
|
|
else
|
|
txt := Value;
|
|
|
|
Add(txt);
|
|
delete(Result,length(Result),1); // remove trailing delimeter
|
|
end
|
|
else
|
|
Result := '';
|
|
end; }
|
|
|
|
function TCustomGrid508Manager.GetInstructions(Component: TWinControl): string;
|
|
var
|
|
grid: TAccessGrid;
|
|
// cnt, x, y, max, mult: integer;
|
|
begin
|
|
Result := '';
|
|
grid := TAccessGrid(Component);
|
|
// x := grid.ColCount - grid.FixedCols;
|
|
// y := grid.RowCount - grid.FixedRows;
|
|
// max := x * y;
|
|
// x := grid.Col - grid.FixedCols;
|
|
// y := grid.Row - grid.FixedRows;
|
|
// mult := grid.ColCount - grid.FixedCols;
|
|
//
|
|
// if (mult > 0) and
|
|
// (x >= 0) and (x < grid.ColCount) and
|
|
// (y >= 0) and (y < grid.RowCount) then
|
|
// begin
|
|
// cnt := (y * mult) + x + 1;
|
|
// Result := IntToStr(cnt) + ' of ' + inttostr(max) + ', ';
|
|
// end;
|
|
Result := Result + 'To move to items use the arrow ';
|
|
if goTabs in grid.Options then
|
|
Result := Result + ' or tab ';
|
|
Result := Result + 'keys';
|
|
end;
|
|
|
|
// if
|
|
// key
|
|
//end;
|
|
(*
|
|
listbox
|
|
column 120 row 430
|
|
|
|
unavailable (text of cell?) read only
|
|
|
|
20 or 81
|
|
|
|
|
|
|
|
listbox
|
|
column 3 of 10
|
|
row 6 of 10
|
|
|
|
unavailable (text of cell?) read only
|
|
|
|
20 or 81
|
|
|
|
|
|
|
|
with each navigation:
|
|
|
|
column 3 of 10
|
|
row 6 of 10
|
|
|
|
unavailable (text of cell?) read only
|
|
*)
|
|
|
|
|
|
function TCustomGrid508Manager.GetItem(Component: TWinControl): TObject;
|
|
var
|
|
grid: TAccessGrid;
|
|
row, col, maxRow: integer;
|
|
begin
|
|
grid := TAccessGrid(Component);
|
|
row := grid.Row + 2;
|
|
col := grid.Col + 2;
|
|
MaxRow := grid.RowCount + 3;
|
|
if MaxRow < 1000 then
|
|
MaxRow := 1000;
|
|
Result := TObject((row * maxRow) + col);
|
|
end;
|
|
|
|
//function TCustomGrid508Manager.GetValue(Component: TWinControl): string;
|
|
//var
|
|
// grid: TAccessGrid;
|
|
//begin
|
|
// grid := TAccessGrid(Component);
|
|
// Result := Piece(grid.GetEditText(grid.Col, grid.Row), DELIM, 1);
|
|
//end;
|
|
|
|
|
|
function TCustomGrid508Manager.GetValue(Component: TWinControl): string;
|
|
var
|
|
grid: TAccessGrid;
|
|
row, col: integer;
|
|
colHdr, rowHdr, txt: string;
|
|
|
|
begin
|
|
grid := TAccessGrid(Component);
|
|
row := grid.Row;
|
|
col := grid.Col;
|
|
if (row >= 0) and (col >= 0) then
|
|
begin
|
|
// if col <> FLastX then
|
|
// begin
|
|
if grid.FixedRows > 0 then
|
|
colHdr := Piece(grid.GetEditText(col, 0), DELIM, 1)
|
|
else
|
|
colHdr := '';
|
|
if colHdr = '' then
|
|
colHdr := inttostr(col+1-grid.FixedCols) + ' of ' + inttostr(grid.ColCount-grid.FixedCols);
|
|
colHdr := 'column ' + colhdr + ', ';
|
|
// end
|
|
// else
|
|
// colHdr := '';
|
|
// FLastX := col;
|
|
|
|
// if row <> FLastY then
|
|
// begin
|
|
if grid.FixedCols > 0 then
|
|
rowHdr := Piece(grid.GetEditText(0, row), DELIM, 1)
|
|
else
|
|
rowHdr := '';
|
|
if rowHdr = '' then
|
|
rowHdr := inttostr(row+1-grid.FixedRows) + ' of ' + inttostr(grid.RowCount-grid.FixedRows);
|
|
rowHdr := 'row ' + rowhdr + ', ';
|
|
// end
|
|
// else
|
|
// rowHdr := '';
|
|
// FLastY := row;
|
|
|
|
txt := Piece(grid.GetEditText(col, row), DELIM, 1);
|
|
if txt = '' then
|
|
txt := 'blank';
|
|
Result := colHdr + rowHdr + txt;
|
|
end
|
|
else
|
|
Result := ' ';
|
|
end;
|
|
|
|
|
|
{ TVA508StaticTextManager }
|
|
|
|
constructor TVA508StaticTextManager.Create;
|
|
begin
|
|
inherited Create(TVA508StaticText, [mtComponentName, mtCaption, mtValue], TRUE);
|
|
end;
|
|
|
|
function TVA508StaticTextManager.GetCaption(Component: TWinControl): string;
|
|
begin
|
|
Result := ' ';
|
|
end;
|
|
|
|
function TVA508StaticTextManager.GetComponentName(
|
|
Component: TWinControl): string;
|
|
begin
|
|
Result := 'label';
|
|
end;
|
|
|
|
function TVA508StaticTextManager.GetValue(Component: TWinControl): string;
|
|
var
|
|
next: TVA508ChainedLabel;
|
|
comp: TVA508StaticText;
|
|
begin
|
|
comp := TVA508StaticText(Component);
|
|
Result := comp.Caption;
|
|
next := comp.NextLabel;
|
|
while assigned(next) do
|
|
begin
|
|
Result := Result + ' ' + next.Caption;
|
|
next := next.NextLabel;
|
|
end;
|
|
end;
|
|
|
|
{ TVA508EditManager }
|
|
|
|
constructor TVA508EditManager.Create;
|
|
begin
|
|
inherited Create(TEdit, [mtValue], TRUE);
|
|
end;
|
|
|
|
function TVA508EditManager.GetValue(Component: TWinControl): string;
|
|
begin
|
|
Result := TEdit(Component).Text;
|
|
end;
|
|
|
|
{ TVA508ComboManager }
|
|
|
|
constructor TVA508ComboManager.Create;
|
|
begin
|
|
inherited Create(TComboBox, [mtValue], TRUE);
|
|
end;
|
|
|
|
function TVA508ComboManager.GetValue(Component: TWinControl): string;
|
|
begin
|
|
Result := TComboBox(Component).Text;
|
|
end;
|
|
|
|
initialization
|
|
RegisterStandardDelphiComponents;
|
|
|
|
end.
|