blob: da046a67ce0044da4d967c861e913c2d839a97a2 [file] [log] [blame]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>Designing Accessible Applications in Eclipse</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
<link href="../article.css" type="text/css" rel="stylesheet">
</head>
<body>
<h1>Designing Accessible Plug-ins in Eclipse</h1>
<div class="summary">
<h2>Summary</h2>
<p>Accessibility for disabled users is now a priority in application development
as advances in techniques and support within operating systems have now made
this possible. This article covers the Eclipse accessibility support, general
tips for creating accessible plug-ins, and the types of disabilities that the
Eclipse accessibility support assists. This is all illustrated using an example
of making a view accessible. </p>
<p>For information about accessibility in Eclipse 3.5 or later, please see
the <a href="/articles/article.php?file=Article-Accessibility351/index.html">updated version of this document</a>.</p>
<div class="author">By Tod Creasey, IBM OTI Labs</div>
<div class="copyright">Copyright &copy; 2003,2006 IBM Corporation.</div>
<div class="date">Originally published May 20, 2003</div>
<div class="date">Updated for Eclipse 3.2 July 25, 2006</div>
</div>
<div class="content">
<h2>Introduction</h2>
<p>A major goal of Eclipse 2.0 was to supply support for the use of Eclipse by
people with disabilities. This article deals with the support provided in Eclipse
for use of accessibility tools in the Microsoft&reg; Windows&reg; operating
systems as well as general UI design tips for people who want to make accessible
applications. It also covers the US Federal government section 508 accessibility
regulations and the IBM<font size="-2">TM</font> accessibility checklist.</p>
<h2>Regulations and other Resources</h2>
<p>Much of the work in the industry in accessibility has been driven by the US
Federal Government <a href="http://www.section508.gov/" target="_blank">Section
508 Regulations</a>. This regulation is a set of criteria that computing applications
must satisfy in order to be sold to the US government.&nbsp;</p>
<p>The Section 508 regulations are fairly general so IBM has provided a more detailed
checklist for developers of accessible applications - see the <a href="http://www.ibm.com/able/guidelines/index.html" target="_blank">IBM Accessibility
Guidelines</a>. Microsoft&reg; has an accessibility section on their Web site
as well - see <a href="http://www.microsoft.com/enable" target="_blank">Microsoft
Accessibility</a>.</p>
<h2>Types of Accessibility Support</h2>
<p>There are several types of disability that can be dealt with in an accessible
application. The main categories are mobility issues, contrast, sound and color
issues and the use of screen readers.</p>
<p>Mobility enablement covers a wide range of issues. The main issue is the mouse.
Initially a mouse was added to a computer as a labor saving option; now many
applications cannot be operated without it. Many people cannot or prefer not
to use the mouse because of problems with repetitive strain injuries or poor
motor control. Other mobility issues deal with being able to hold multiple keys
at once (accelerators), required response time to messages and visual focus
indication.</p>
<p>Contrast and color is an issue for people who are not blind but cannot see
small fonts or subtle color differences. Some people work in High Contrast mode
where the only colors they use are black and white. As a result of this, color
should never be used as the only way of presenting information - there should
be an alternative way as well. The same issue is true for sound because not
only do deaf people require visual stimulus but many people turn off their sound
while working. Windows, dialogs and icons should also avoid using background
and foreground colors that are too close to each other.</p>
<p>Screen readers such as JAWS&reg; from Freedom Scientific make use of the Microsoft
Active Accessibility support (MSAA) to read the contents of windows and dialogs
to the user. SWT supports MSAA so most of the support for screen readers will
come by default. Screen readers infer content from the control that has focus
and its associated widgets (labels and parents). Developers also need to be
careful of tab support for screen readers because this is how someone using
one will navigate your application. An application using screen readers also
should assume that a mouse will not be used - it is very difficult to position
a pointer if you cannot see a fine detailed thing such as a mouse pointer.&nbsp;</p>
<h2>Showing Accessibility by Building an Accessible View</h2>
<p>We will illustrate the main accessibility issues and how to solve them in Eclipse
with a simple example of a view. This view will be a simple entry view with
fields for name and password and an OK button. To jazz it up we have an image
instead of text for a title and have set the background to be yellow to blend
in with the image. We have also made the text of our title for the entry fields
bold so that it catches the eye more. Because we are trying to keep good contrast
for readability we are using black text on the background. We have also added
a couple of entries in the drop-down menu to allow the user to reset the view
and to enter the values for an anonymous login.</p>
<p><strong><img alt="Starting look of view example" src="images/beforescreen.gif" height="215" width="370"></strong></p>
<p><strong>Figure 1. Screen shot of input example</strong></p>
<p>Here is the code that is interesting for this discussion.</p><pre>public void createPartControl(Composite parent) {
// We have created a label at the top for our label image with
// a welcome label underneath. We have set its font to be a bold
// font so it is more visible. We have then defined the titles
// for our text entry fields and then the fields. Finally, we add
// a button at the bottom of the fields.
Composite workArea =
new Composite(parent, SWT.BORDER);
setBackground(workArea);
Label topLabel = new Label(workArea, SWT.NONE);
topLabel.setImage(
AccessibilityPlugin.getDefault()
.getImageRegistry().get(
AccessibilityPlugin.LOGIN_IMAGE));
Label titleLabel = new Label(workArea, SWT.NONE);
setLabelColors(titleLabel);
titleLabel.setText("Welcome to our online store!");
FontData labelFontData =
new FontData("Arial", 10, SWT.BOLD);
titleLabel.setFont(new Font(parent.getDisplay(), labelFontData));
Label nameTitle = new Label(workArea, SWT.NONE);
nameTitle.setText("Name:");
setBackground(nameTitle);
Label passwordTitle = new Label(workArea, SWT.NONE);
passwordTitle.setText("Password:");
setBackground(passwordTitle);
nameEntryField = new Text(workArea, SWT.BORDER);
passwordEntryField = new Text(workArea, SWT.BORDER);
Button enterButton = new Button(workArea, SWT.PUSH);
enterButton.setText("Login");
}
private void setBackground(Control control) {
control.setBackground(
WorkbenchColors.getSystemColor(SWT.COLOR_YELLOW));
}
private void setActionText(){
resetAction.setText("Reset Fields");
anonymousAction.setText("Anonymous Settings");
}</pre>
<p>So far it looks fine, right? We have a drop-down menu to make some common operations
easier, we have good contrasting colors (black on a yellow background), bold
fonts for our welcome title and our code organized to handle the titles first
and then the fields.</p>
<h2>Presenting Information Accessibly</h2>
<p>A common accessibility problem is presenting something that looks great with
your operating system settings but that is unusable with other people's settings.
This generally manifests itself as hard-coded font or color values or images
that are the only source of information.</p>
<h2>Colors and Images</h2>
<p>We have a problem image in our example. Our title image contains information
that the user must have in order to use our application and if the user cannot
read the image they cannot use our application. Users who reverse their colors
or who need larger fonts won't be able to read this.</p>
<p><img alt="Title icon" src="images/namepassword.gif" height="36" width="216"></p>
<p><strong>Figure 2. The title icon</strong></p>
<p>The most common setup for this case is the High Contrast mode in the Windows
environment. In High Contrast text is generally shown as white on a black background
and all of the fonts are increased in size. High Contrast themes and modes are
provided by the Windows operating system for those who cannot easily see subtle
differences in shade. High Contrast comes in both white on black and black on
white and any accessible application should handle both of these. Because of
these settings any application that forces a background or foreground to a hard-coded
color will likely fail accessibility testing. Eclipse is tested using all of
the high contrast modes provided by Microsoft.</p>
<p>Here is the Eclipse Resource Navigator in both Normal and High Contrast modes.</p>
<p><img alt="Navigator view in High Contrast" src="images/navhighcontrast.gif" height="200" width="600"></p>
<p><strong>Figure 3. The Navigator View in Normal and High Contrast modes</strong></p>
<p>By contrast here is our view in Normal and High Contrast modes:</p>
<p><img alt="High contrast comparison" src="images/highcontraststart.gif" height="250" width="675"></p>
<p><strong>Figure 4. The Entrance View in Normal and High Contrast modes</strong></p>
<p>The first problem we will tackle is in unreadable text and image. The yellow
background makes the white text unreadable in High Contrast Mode and the image
still has black text (because it is an image) despite the text being white everywhere
else.</p>
<p>First we will fix the image. It conveys information to users that they need
to know in order to proceed. Because it is an image it cannot be changed in
any way to be more readable to someone who cannot read black text on a yellow
background or who needs a larger font than the one we created it with.</p>
<p>We will replace this in our new design with an image that is decoration only
and with a label that has the important information by switching around the
text in the title and the text in the image because the title information is
currently just a welcome banner. That way when users set their fonts in Eclipse
to something they can read the information they need will be readable too. We
will discuss fonts more in the next section.</p>
<p><img alt="View with info on dialog" src="images/welcomesnapshot.gif" height="196" width="294"></p>
<p><strong>Figure 5. View with the required information moved to a label</strong></p>
<p>Now we have replaced the image with something that just adds aesthetic appeal,
and we have made the required text a label so that it can have the same font
as the others.</p>
<p>The next issue with our view is color. Although the yellow background blends
in nicely with our image, the contrast will not work for all settings as we
can see in Figure 4. People using the High Contrast settings will not be able
to use this view because they are trying to see white on black.</p>
<p>So clearly our yellow label backgrounds will not work. The easiest solution
is to just leave the colors of their widgets and let SWT do the work using the
operating system settings. This is what we will do in order to stay consistent
with the workbench. Most developers choose this option (as does Eclipse). There
are places such as in banners in dialogs where we use a setting other than the
default (Eclipse uses SWT.COLOR_LIST_FOREGROUND for the title). JFace provides
an API for accessing these color choices in the JFaceColors class.</p>
<p>For those who want to choose system colors SWT provides a series of colors
that allow us to pick up user settings. They are:</p>
<ul>
<li><font size="2">COLOR_WIDGET_FOREGROUND: system color used to paint
foreground areas</font>
</li><li><font size="2">COLOR_WIDGET_BACKGROUND: system color used to paint
background areas</font>
</li><li><font size="2">COLOR_WIDGET_BORDER:</font> <font size="2">system color used to
paint border areas</font>
</li><li><font size="2">COLOR_WIDGET_DARK_SHADOW : system color used to paint dark
shadow areas</font>
</li><li><font size="2">COLOR_WIDGET_NORMAL_SHADOW : system color used to paint
normal shadow areas&nbsp;</font>
</li><li><font size="2">COLOR_WIDGET_LIGHT_SHADOW: system color used to paint light
shadow areas</font>
</li><li><font size="2">COLOR_WIDGET_HIGHLIGHT_SHADOW: system color used to paint
highlight shadow areas</font>
</li><li><font size="2">COLOR_LIST_FOREGROUND: system color used to paint list
foreground areas</font>
</li><li><font size="2">COLOR_LIST_BACKGROUND : system color used to paint list
background areas&nbsp;</font>
</li><li><font size="2">COLOR_LIST_SELECTION: system color used to paint list
selection background areas&nbsp;</font>
</li><li><font size="2">COLOR_LIST_SELECTION_TEXT: system color used to paint list
selected text</font>
</li><li><font size="2">COLOR_INFO_FOREGROUND : system color used to paint tool tip
text&nbsp;</font>
</li><li><font size="2">COLOR_INFO_BACKGROUND: system color used to paint tool tip
background areas</font>
</li><li><font size="2">COLOR_TITLE_FOREGROUND: system color used to paint title
text</font>
</li><li><font size="2">COLOR_TITLE_BACKGROUND: system color used to paint title
background areas&nbsp;</font>
</li><li><font size="2">COLOR_TITLE_BACKGROUND_GRADIENT : system color used to paint
title background gradient&nbsp;</font>
</li><li><font size="2">COLOR_TITLE_INACTIVE_FOREGROUND: system color used to paint
inactive title text&nbsp;</font>
</li><li><font size="2">COLOR_TITLE_INACTIVE_BACKGROUND: system color used to paint
inactive title background areas&nbsp;</font>
</li><li><font size="2">COLOR_TITLE_INACTIVE_BACKGROUND_GRADIENT: system color used
to paint inactive title background gradient&nbsp;</font> </li></ul>
<p>We will just delete the code that sets backgrounds and we will end up with
the view shown next. The yellow background for the Composites and labels has
been replaced with the system default color (gray on Windows XP).</p>
<p><img alt="View using system colors" src="images/fixedcolors.gif" height="195" width="294"></p>
<p><strong>Figure 6. View using system colors</strong></p>
<p>If you still want to have a color that you set yourself you must have a way
to adjust it for different color settings. Most developers use a ColorFieldEditor
to allow the user to change these values. It is recommended that you only do
this if there really is no system color you want to use because it adds extra
complexity to the accessible setup for a user.</p>
<p>Color is frequently used to liven up the look of an application but remember
the following guidelines:</p>
<ol>
<li>Color must not be used as the only means of conveying information
</li><li>Color must be configurable for people who cannot use a given color option
</li>
</ol>
<h2>Fonts</h2>
<p>Like colors, fonts also need to be configurable for those users who cannot
see small fonts. The Windows operating system offers Large and Extra Large font
size modes (see Properties&gt;Appearance from the Windows desktop) for setting
the fonts to be more readable to those with poor eyesight. All dialogs and windows
should be tested with the fonts set to these sizes to be sure that none of the
text is cut off and that it fits in the visible window. Eclipse is tested for
sizing using the Windows High Contrast Mode in Windows XP at 1152x864 resolution
using the fonts provided by the High Contrast mode. High Contrast mode can be
set by selecting Control Panel-&gt;Accessibility Options -&gt; Display -&gt;
High Contrast Mode.</p>
<p>As with colors, applications often require more font choice than the OS provides
- the only font SWT can get from the OS is the default font for that widget.
The default font can be found from any Display by calling getSystemFont(). Eclipse
also defines these fonts.</p>
<ul>
<li>Banner Font: used in dialogs for the main title
</li><li>Header Font: used for headers in pages like the Welcome Page.
</li><li>Text Font: used for editors like the text editor and is also the default
for the Java<font size="-2">TM</font> editor.
</li><li>Dialog Font: used in all widgets in Dialogs. (Added for Eclipse release
2.1). </li></ul>
<p>In our example we defined our own font for use in the dialog using the FontData
API provided by SWT because we wanted a bold font.</p>
<pre>FontData labelFontData = new FontData("Arial", 10, SWT.BOLD);
Font labelFont = new Font(parent.getDisplay(), labelFontData);
</pre>
<p>We currently have no way for the user to change this. For the sake of
consistency we will use the banner font for our main title and remove the fonts
from elsewhere. Now our font creation code will be:</p><pre>Font labelFont = JFaceResources.getBannerFont();</pre>
<p>Using the Eclipse banner font we can pick up the setting an Eclipse user has
made for the banner font in Eclipse and apply it to our views. These fonts are
set in General&gt;&gt;Appearance&gt;&gt;Fonts and Colors preference page. </p>
<p>As of Eclipse 3.2 the System Default theme has been added. This theme uses
the system fonts for the JFace fonts (banner, dialog and header fonts) and system
colors for all of it's colors so that all fonts and colors are readable in every
environment. This is the default theme for High Contrast mode. Themes are found
in the General&gt;&gt;Appearance preference page and are a convenient way to
set up a set of fonts and colors for the whole Workbench so that the user does
not need to set them all individually. Themes are added using the org.eclipse.ui.themes
extension point.</p>
<p>Here is the view with the new font and colors in both Normal and High Contrast
modes. </p>
<p><img alt="View using system fonts" src="images/fixedfonts.gif" height="252" width="612"></p>
<p><strong>Figure 7. View Using System Fonts</strong></p>
<p>There is also a way for you to register your own font within the workbench
using a declaration in your plugin.xml. If you register it using the org.eclipse.ui.fontDefinitions
extension point you can get a font that is managed within the Workbench &gt;
Fonts preference page and in the JFace font registry. Most developers just use
one of the provided fonts because they are adequate for most applications.</p>
<p>As of Eclipse 3.0 it is also possible to get a bold or italic version of any
registered font by calling <code>FontRegistry#getBold(String)</code> or <code>FontRegistry#getItalic(String).</code>
</p>
<p>The only accessibility rule for fonts is that users must be able to change
any font they wish somewhere in the application or the operating system.</p>
<h2>Keyboard and Mouse</h2>
<p>The most significant requirement for accessibility is that everything in an
application must be reachable using the keyboard. Without keyboard access people
who do not have the motor control to get a mouse where you they want it will
not be able to use your application. Many other people do everything using the
keyboard as a way of preventing repetitive strain injuries so this is likely
the most used accessibility feature.</p>
<p>Menus on any of the views provided by Eclipse are already accessible. F10 will
give the main window menu focus, Shift+F10 will bring up the context menu for
a view, Ctrl+F10 will activate the pull-down menu for a view if there is one
and Alt+- will bring up the view menu.&nbsp;</p>
<p>To make a menu more accessible, you can define the label for the menu using
a mnemonic. A mnemonic appears as an underlined letter in a menu entry label.
Selecting that letter will move the menu selection to that entry. This is done
by defining the mnemonic letter in the plugin.xml for a label with an <i><b>&amp;</b></i>
prefix. For instance a label specified as &amp;Copy would show up on a menu
as <u>C</u>opy; popping up the menu that has it and selecting the letter C would
move the menu selection to that entry. If you want to check your mnemonics in
the Windows environment then hold down the Alt key and they will appear in the
active window.</p>
<p>You can do the same thing with widgets in a view. If you add a mnemonic in
a label that is associated with a widget, selecting Alt+ the letter will move
the focus to that widget. This is especially important where there are a lot
of widgets in a view or dialog because tabbing through all of them can be very
time-consuming.</p>
<p>The developer of a plug-in normally has to be concerned with mouse access when
designing a view or dialog. Every piece of information within the view or dialog
should be reachable using the keyboard. That means two things:</p>
<p>1) Every control that the user needs to manipulate (such as combo boxes, text
fields, and buttons) the user should be able to navigate to it with a keystroke
- usually the tab key. You can also supplement this behavior with an action
using a hot key - for instance Eclipse uses Ctrl+F6, Ctrl+ F7, and Ctrl+F8 to
switch between editors, views and perspectives respectively.</p>
<p>2) Everything that needs scrolling to be seen needs to have that scrolling
accessible to the keyboard. The usual way to do this is to listen for tabs or
the page up and page down keys and to move the viewing area appropriately.</p>
<p>In the case of our view we did not try to do anything special with tabs or
widget entry so we don't need to worry about keyboard access - the behavior
Eclipse gives us by default is fine. The keyboard-related problem was that our
drop-down menus and widgets did not use mnemonics. All we need to do is add
an &amp; prefix before the letters we want in the mnemonic.</p>
<pre>private void setActionText(){
resetAction.setText("&amp;Reset Fields");
anonymousAction.setText("&amp;Anonymous Settings");
}</pre>
<p>In the case of text field and combo boxes that have other labels associated
with them, all we have to do is add the mnemonic to the label widget. However
the operating system must know which text widget is associated with which label
widget when the mnemonic is selected. It does this by inferring this association
using the z-order.</p>
<p>Default Z-ordering is determined by the creation order of widgets. The
z-order is by default the order in which the widgets are created but it can be
modified using Control.moveAbove() and Control.moveBelow(). A label widget must
be immediately before the text widget or combo box that it is labeling in the
z-order of its parent for it to be associated with it. This also implies that
the two widgets must have the same parent for this behavior to occur. We take
care of this by changing our code so that each label widget is created before
the text widget we wish to associate it with.</p>
<p>All we need to do is to create the label and then its associated text rather
than creating both labels first. For the sake of usability we are also going
to put the name before the text horizontally rather than vertically because
this is the way that people are used to reading a computer screen.</p>
<pre>public void createPartControl(Composite parent) {
Composite workArea = new Composite(parent, SWT.BORDER);
Label titleLabel = new Label(workArea, SWT.NONE);
titleLabel.setText("Enter Name and Password:");
titleLabel.setFont(JFaceResources.getBannerFont());
Label nameTitle = new Label(workArea, SWT.NONE);
nameTitle.setText("&amp;Name:");
nameEntryField = new Text(workArea, SWT.BORDER);
Label passwordTitle = new Label(workArea, SWT.NONE);
passwordTitle.setText("&amp;Password:");
passwordEntryField = new Text(workArea, SWT.BORDER);
Button enterButton = new Button(workArea, SWT.PUSH);
enterButton.setText("&amp;Login");
}</pre>
<p>To see this in action we select Alt+N when our view has focus and you will
see the cursor going to the text field beside Name:.</p>
<img alt="Menu with mnemonics" src="images/menumnemonics.gif" height="188" width="424">
<p><strong>Figure 8. View with mnemonics for menus and widgets and corrected label
placement</strong></p>
<h2>Accommodating Screen Readers</h2>
<p>There are now numerous screen readers that can read aloud elements of the
user interface. One of the most popular screen readers is the JAWS product from
Freedom Scientific. Screen readers attempt to infer the relevant information
about a widget and those that surround it and present that information to the
user. They do this by taking the widget that has focus and inferring which of
its siblings and parents has useful information.</p>
<p>As a text and combo box widgets do not have a label associated with them we
have several ways that we can get a screen reader to infer a label for a widget
with focus:</p>
<ol>
<li>A label immediately precedes the focus widget in the z-order.
</li><li>The focus widget is the direct child of the shell (in this case the shell
label gets read).
</li><li>It is the parent of a widget that has a label and is labeled itself. For
instance, a labeled text inside of a group box will have both its label and
the label of the group box read. But if there is an unlabeled widget (say
an intermediate Composite) between the label and the group box, the group
box will not be read. </li>
</ol>
<p>Our example had text and labels created in the wrong z-order. We created both
the labels and then both of the entry fields. Not only does this cause problems
for the mnemonics, it also prevents screen readers from providing usual information
to users.</p>
<p>Screen readers also use the z-order to determine labeling for text and combo
box widgets. Any tool that tries to infer a label for the text fields with our
initial example.will assume that "Password:" is the title of the Name: text
widget because the "Name:" text widget was created after the "Password:"
label. It will not find any label for the "Password:" text widget
because it was created right after the "Name:" text widget. With our
new implementation, a screen reader will use "Name:" as the label
for the name field and "Password:" for the label of the password field.</p>
<p>A screen reader will not only read the label of a widget with focus but it
will also read the labels of any parents of that widget that have one (such
as a group) and the title of the dialog or window. A screen reader will generally
stop at the first unlabelled parent so be sure that you have no intermediate
Composites between labels you want read.&nbsp; If you wish to label a group
of widgets, you should contain them in a group box.</p>
<p>&nbsp;Our example should use a group box instead of a label for the Name and
Password entry field. By adding a group box we would make a screen reader say
"Enter Name and Password: Name:" when the first text widget had focus.</p>
<p>Here is what the final view looks like with the group box.</p>
<p align="left"><img alt="Final view" src="images/finalview.gif" height="189" width="373"></p>
<p align="left"><strong>Figure 9. Entrance View with a Group box</strong></p>
<h2 align="left">Using the SWT Accessibility API</h2>
<p align="left">We have changed the view so that the entry fields are created directly
after their labels (to ensure z-order) and we have switched the title from a
label to a group box. When one of the entry fields is selected a screen reader
will read the group box title and then the field title.</p>
<p align="left">Now that everything that we can see is set up, we can do one more
thing we can do to really make this usable. We have no critical information
in our welcome graphic, but we have not provided a way to let a user using a
screen reader know that. A screen reader will associate a random name with the
label widget if we do not provide one, so visually impared users will have to
assume the graphic contains no information that is of use to them.</p>
<p align="left">SWT provides two interfaces for enabling accessibility in a
control.<code>org.eclipse.swt.accessibility.AccessibleListener </code>is the
interface that is implemented by existing SWT controls.
<code>org.eclipse.swt.accessibility.AccessibleControlListener</code> is an
interface for custom widgets so it is not a concern if you are using the widgets
provided by SWT.</p>
<p align="left"><code>org.eclipse.swt.accessibility.AccessibleAdapter</code> is
a class with implementations of all of the methods in AccessibleListener that
do nothing. We want to make it so that our banner graphic has a consistent name
so we add an AccessibleListener to it that implements getName().We will subclass
this in an inner class because we only want to override getName(). Here is how
we implement this:
</p><pre>topLabel.getAccessible().addAccessibleListener(
new AccessibleAdapter() {
public void getName(AccessibleEvent e) {
e.result = "Welcome to our online store!"
}});</pre>
After we have made this change we can verify it on the Windows operating system
using the Microsoft Active Accessibility support (see the Bibliography). When
we use the Microsoft Inspect Objects tool from that package we can see that when
we hover over the label we get a value to use with accessibility tools.
<p><img alt="Results using MSAA tools" src="images/accessibility.gif" height="233" width="519"></p>
<p><strong>Figure 10. Verification of the AccessibleControlAdapter on the Welcome
Banner using MSAA tools</strong></p>
<p>The final version of our Entrance View is in AccessibleEntranceView in the
code included in the Appendix.</p>
<h2><br>Conclusions</h2>
<p>Accessibility support is an important part of UI development; it not only enables
products for disabled users but also teaches good general UI design techniques.
We showed how to take a simple view and analyze and correct the accessibility
issues with it using the Eclipse accessibility support.</p>
<h2>Appendix</h2>
<p><a href="/articles/Article-Accessibility/org.eclipse.ui.articles.accessibility.zip">The
Accessibility Example project</a></p>
<h2>Windows Accessibility Support&nbsp;</h2>
<p>Sunce the release of Eclipse 2.0 the accessibility support has focused on the
Windows operating system. Windows 2000 and Windows XP provide a series of built-in
accessibility features that Eclipse is compatible with.&nbsp;The accessibility
settings in Windows XP are found in Control Panel&gt;Accessibility Options.</p>
<p><img alt="Windows Accessibility Dialog" src="images/windowsdialog.gif" height="450" width="367"></p>
<p><strong>Figure 11. Windows XP Accessibility Options Dialog</strong></p>
<p>Extra large fonts is a setting that enlarges all of the fonts on the desktop.
In Windows XP this is found on the Appearance Page of the Desktop Properties
dialog. In Windows 2000 there are several themes that have extra large fonts
(e.g. Windows Extra Large). Themes can also be shown in High Contrast mode for
people who have difficulty differentiating colors. You should test in both High
Contrast White and High Contrast Black selections.</p>
<p>Sticky keys is a Windows function for people who have difficulty holding down
two keys at once. Sticky Keys allows the user to select a modifier key (Ctrl,
Alt or Shift), release it and select another key as if they had the modifiers
depressed. Normally this is only an issue if you have some time-dependent functionality
in your application or if you are listening for a key release.</p>
<p>Filter keys is another function for people who have a slow response time. Generally
holding a key down will result in the keystroke being sent multiple times which
can be very frustrating for someone who cannot lift their finger in time to
avoid the extra keystrokes. Filter keys either ignores duplicate keystrokes
or slows down the repeat rate, or both, according to user preference.</p>
<p>Mouse keys is a function that allows the user to replace the mouse support
with a keyboard equivalent in order to get mouse functionality without the mouse.
You should not rely on this support in your accessibility plan however because
an application must be fully keyboard-accessible to pass most accessibility
guidelines (including the IBM guidelines).</p>
<p>Sound support is a function added for the deaf and hard-of-hearing users. It
gives a visual cue when a system sound has occurred. However, it is bad accessibility
design to use sound as the only source of information. If a user needs to use
sound to use your application you should make sure there are alternative ways
to access the information.&nbsp;</p>
<h2>Bibliography</h2>
<p><a href="http://www.ibm.com/able/guidelines/index.html" target="_blank">IBM
Accessibility Guidelines</a></p>
<p><a href="http://www.section508.gov/" target="_blank">Section 508
Regulations</a></p>
<p><a href="http://www.microsoft.com/enable" target="_blank">Microsoft
Accessibility&nbsp;</a></p>
<p><a href="http://www.msdn.microsoft.com/library/default.asp?url=/library/en-us/msaa/msaastart_9w2t.asp?frame=true%29" target="_blank">Microsoft Active Accessibility (MSAA)</a></p>
</div>
<div class="notices"><p>IBM is a registered trademark of International Business Machines Corporation
in the United States, other countries, or both.</p>
<p>Java and all Java-based trademarks are trademarks of Sun Microsystems,
Inc. in the United States, other countries, or both.</p>
<p>Microsoft and Windows are registered trademarks of Microsoft Corporation
in the United States, other countries, or both.</p>
<p>Other company, product, and service names may be trademarks or service marks of others.</p>
</div>
</body></html>