SWT Accessibility
最近由于項目的需要,研究了一下SWT的Accessibility。關于Accessibility,這是一個很難纏的search,給殘疾人用的東東,正常人基本上不會用到,網上文章少之又少??梢圆殚喌降囊黄獊碜杂贗BM developerWorks的文章:使用 Eclipse 創建易訪問的應用程序:介紹
易 訪問性是一個總括的術語,它包括生成使具有各種殘疾的人易用的產品所涉及的所有東西和人。美國已經立法,不符合Accessibility規范的軟件不能 夠在政府部門銷售。在美國,創建易訪問的應用程序的主要商業(對比人道主義)驅動力是 Rehabilitation Act 1998 年的修正法案,稱為 Section 508。Section 508 要求聯邦機構使他們的信息技術對帶有殘疾的人易于訪問。
Eclipse 擁有一個包含 API:org.eclipse.swt.accessibility 的易訪問性包。Eclipse 3.0 易訪問性特征是基于 MSAA 1.3 程序設計模型所提供的功能。您可以將 Eclipse 中的 Accessible 對象聯系到每個控件上,并且 org.eclipse.swt.accessibility 接口中的方法集對應 MSAA 1.3 IAccessible 界面中的消息集。
SWT 自身包含的控件中只有寥寥幾個用到了Accessibility,JFace里也不多。看了所有的Accessibility相關代碼,只能總結一部分規律:
易 訪問性是一個總括的術語,它包括生成使具有各種殘疾的人易用的產品所涉及的所有東西和人。美國已經立法,不符合Accessibility規范的軟件不能 夠在政府部門銷售。在美國,創建易訪問的應用程序的主要商業(對比人道主義)驅動力是 Rehabilitation Act 1998 年的修正法案,稱為 Section 508。Section 508 要求聯邦機構使他們的信息技術對帶有殘疾的人易于訪問。
Eclipse 擁有一個包含 API:org.eclipse.swt.accessibility 的易訪問性包。Eclipse 3.0 易訪問性特征是基于 MSAA 1.3 程序設計模型所提供的功能。您可以將 Eclipse 中的 Accessible 對象聯系到每個控件上,并且 org.eclipse.swt.accessibility 接口中的方法集對應 MSAA 1.3 IAccessible 界面中的消息集。
Interface Summary | |
---|---|
AccessibleControlListener | Classes that implement this interface provide methods that deal with the events that are generated when an accessibility client sends a message to a control. |
AccessibleListener | Classes that implement this interface provide methods that deal with the events that are generated when an accessibility client sends a message to a control. |
AccessibleTextListener | Classes that implement this interface provide methods that deal with the events that are generated when an accessibility client sends a message to a control. |
- 一般的復雜控件是沒有必要定義Accessibility的。
- 如果是模擬實現一個比較簡單的基本控件,比如Combo,Label,Spinner等,有必要定義Accessibility。
- 所有的自定義控件都要實現AccessibleControlListener接口。
- 所有的包含文本框的控件都要實現AccessibleTextListener接口。
- 設置AccessibleListener的getHelp( )最好是給控件加上Tooltip,因為Wineyes這些屏幕閱讀器閱讀都是根據Tooltip,無視getHelp( )的設置。
- 設置AccessibleListener的getName( ),一般來說,可以設置為這個控件相關聯的Label的Text或者該控件上的某部分文字,自己斟酌考慮設置。
- getKeyboardShortcut( ),考慮控件的快捷操作方式,如果需要的話。
以下是CCombo的Accessibility代碼:
void initAccessible() {
AccessibleAdapter accessibleAdapter = new AccessibleAdapter () {
publicvoid getName (AccessibleEvent e) {
String name = null;
Label label = getAssociatedLabel ();
if (label != null) {
name = stripMnemonic (label.getText());
}
e.result = name;
}
publicvoid getKeyboardShortcut(AccessibleEvent e) {
String shortcut = null;
Label label = getAssociatedLabel ();
if (label != null) {
String text = label.getText ();
if (text != null) {
char mnemonic = _findMnemonic (text);
if (mnemonic != '\0') {
shortcut = "Alt+"+mnemonic;
}
}
}
e.result = shortcut;
}
publicvoid getHelp (AccessibleEvent e) {
e.result = getToolTipText ();
}
};
getAccessible ().addAccessibleListener (accessibleAdapter);
text.getAccessible ().addAccessibleListener (accessibleAdapter);
list.getAccessible ().addAccessibleListener (accessibleAdapter);
arrow.getAccessible ().addAccessibleListener (new AccessibleAdapter() {
publicvoid getName (AccessibleEvent e) {
e.result = isDropped () ? SWT.getMessage ("SWT_Close") : SWT.getMessage ("SWT_Open");
}
publicvoid getKeyboardShortcut (AccessibleEvent e) {
e.result = "Alt+Down Arrow";
}
publicvoid getHelp (AccessibleEvent e) {
e.result = getToolTipText ();
}
});
getAccessible().addAccessibleTextListener (new AccessibleTextAdapter() {
publicvoid getCaretOffset (AccessibleTextEvent e) {
e.offset = text.getCaretPosition ();
}
publicvoid getSelectionRange(AccessibleTextEvent e) {
Point sel = text.getSelection();
e.offset = sel.x;
e.length = sel.y - sel.x;
}
});
getAccessible().addAccessibleControlListener (new AccessibleControlAdapter() {
publicvoid getChildAtPoint (AccessibleControlEvent e) {
Point testPoint = toControl (e.x, e.y);
if (getBounds ().contains (testPoint)) {
e.childID = ACC.CHILDID_SELF;
}
}
publicvoid getLocation (AccessibleControlEvent e) {
Rectangle location = getBounds ();
Point pt = toDisplay (location.x, location.y);
e.x = pt.x;
e.y = pt.y;
e.width = location.width;
e.height = location.height;
}
publicvoid getChildCount (AccessibleControlEvent e) {
e.detail = 0;
}
publicvoid getRole (AccessibleControlEvent e) {
e.detail = ACC.ROLE_COMBOBOX;
}
publicvoid getState (AccessibleControlEvent e) {
e.detail = ACC.STATE_NORMAL;
}
publicvoid getValue (AccessibleControlEvent e) {
e.result = getText ();
}
});
text.getAccessible ().addAccessibleControlListener (new AccessibleControlAdapter () {
publicvoid getRole (AccessibleControlEvent e) {
e.detail = text.getEditable () ? ACC.ROLE_TEXT : ACC.ROLE_LABEL;
}
});
arrow.getAccessible ().addAccessibleControlListener (new AccessibleControlAdapter() {
publicvoid getDefaultAction (AccessibleControlEvent e) {
e.result = isDropped () ? SWT.getMessage ("SWT_Close") : SWT.getMessage ("SWT_Open");
}
});
}
在SWT控件中,包含Accessibility功能的控件有:CCombo,CLabel,CTableFolder,StyledText。
在SWT控件中,包含Accessibility功能的控件有:CCombo,CLabel,CTableFolder,StyledText。
posted on 2008-03-30 02:13 gembin 閱讀(677) 評論(0) 編輯 收藏 所屬分類: SWT