diff options
author | dtseng@chromium.org <dtseng@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-06-16 16:22:05 +0000 |
---|---|---|
committer | dtseng@chromium.org <dtseng@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-06-16 16:22:05 +0000 |
commit | ba7ac5388517567ba47dcefa3718d2bacfe7bae5 (patch) | |
tree | 034ba186b088edbedfbc2ef1f365996cbec6b2b4 | |
parent | 145bd92616228f20095e3ecd50ba0ccb190ebc59 (diff) | |
download | chromium_src-ba7ac5388517567ba47dcefa3718d2bacfe7bae5.zip chromium_src-ba7ac5388517567ba47dcefa3718d2bacfe7bae5.tar.gz chromium_src-ba7ac5388517567ba47dcefa3718d2bacfe7bae5.tar.bz2 |
Add accessibility support for Textfields in Windows.
BUG=none
TEST=none
Review URL: http://codereview.chromium.org/2791003
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@49955 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | views/controls/textfield/native_textfield_win.cc | 75 | ||||
-rw-r--r-- | views/controls/textfield/native_textfield_win.h | 9 |
2 files changed, 84 insertions, 0 deletions
diff --git a/views/controls/textfield/native_textfield_win.cc b/views/controls/textfield/native_textfield_win.cc index f3edb9b4..be1a0bae 100644 --- a/views/controls/textfield/native_textfield_win.cc +++ b/views/controls/textfield/native_textfield_win.cc @@ -19,6 +19,7 @@ #include "gfx/native_theme_win.h" #include "grit/app_strings.h" #include "skia/ext/skia_utils_win.h" +#include "views/controls/label.h" #include "views/controls/menu/menu_win.h" #include "views/controls/menu/menu_2.h" #include "views/controls/native/native_view_host.h" @@ -119,6 +120,8 @@ NativeTextfieldWin::NativeTextfieldWin(Textfield* textfield) ole_interface.Attach(GetOleInterface()); if (ole_interface) text_object_model_.QueryFrom(ole_interface); + + InitializeAccessibilityInfo(); } NativeTextfieldWin::~NativeTextfieldWin() { @@ -158,6 +161,7 @@ void NativeTextfieldWin::UpdateText() { if (textfield_->style() & Textfield::STYLE_LOWERCASE) text_to_set = l10n_util::ToLower(text_to_set); SetWindowText(text_to_set.c_str()); + UpdateAccessibleValue(text_to_set); } void NativeTextfieldWin::AppendText(const string16& text) { @@ -217,6 +221,7 @@ void NativeTextfieldWin::UpdateBackgroundColor() { void NativeTextfieldWin::UpdateReadOnly() { SendMessage(m_hWnd, EM_SETREADONLY, textfield_->read_only(), 0); + UpdateAccessibleState(STATE_SYSTEM_READONLY, textfield_->read_only()); } void NativeTextfieldWin::UpdateFont() { @@ -228,10 +233,12 @@ void NativeTextfieldWin::UpdateFont() { void NativeTextfieldWin::UpdateIsPassword() { // TODO: Need to implement for Windows. + UpdateAccessibleState(STATE_SYSTEM_PROTECTED, textfield_->IsPassword()); } void NativeTextfieldWin::UpdateEnabled() { SendMessage(m_hWnd, WM_ENABLE, textfield_->IsEnabled(), 0); + UpdateAccessibleState(STATE_SYSTEM_UNAVAILABLE, !textfield_->IsEnabled()); } gfx::Insets NativeTextfieldWin::CalculateInsets() { @@ -331,6 +338,73 @@ void NativeTextfieldWin::ExecuteCommand(int command_id) { OnAfterPossibleChange(true); } +void NativeTextfieldWin::InitializeAccessibilityInfo() { + // Set the accessible state. + accessibility_state_ = 0; + + ScopedComPtr<IAccPropServices> pAccPropServices; + HRESULT hr = CoCreateInstance(CLSID_AccPropServices, NULL, CLSCTX_SERVER, + IID_IAccPropServices, reinterpret_cast<void**>(&pAccPropServices)); + if (!SUCCEEDED(hr)) + return; + + VARIANT var; + + // Set the accessible role. + var.vt = VT_I4; + var.lVal = ROLE_SYSTEM_TEXT; + hr = pAccPropServices->SetHwndProp(m_hWnd, OBJID_CLIENT, + CHILDID_SELF, PROPID_ACC_ROLE, var); + + // Set the accessible name by getting the label text. + View* parent = textfield_->GetParent(); + int label_index = parent->GetChildIndex(textfield_) - 1; + if (label_index >= 0) { + // Try to find the name of this text field. + // We expect it to be a Label preceeding this view (if it exists). + std::wstring name; + View* label_view = parent->GetChildViewAt(label_index ); + if (label_view ->GetClassName() == Label::kViewClassName && + label_view ->GetAccessibleName(&name)) { + hr = pAccPropServices->SetHwndPropStr(m_hWnd, OBJID_CLIENT, + CHILDID_SELF, PROPID_ACC_NAME, name.c_str()); + } + } +} + +void NativeTextfieldWin::UpdateAccessibleState(uint32 state_flag, + bool set_value) { + ScopedComPtr<IAccPropServices> pAccPropServices; + HRESULT hr = CoCreateInstance(CLSID_AccPropServices, NULL, CLSCTX_SERVER, + IID_IAccPropServices, reinterpret_cast<void**>(&pAccPropServices)); + if (!SUCCEEDED(hr)) + return; + + VARIANT var; + var.vt = VT_I4; + var.lVal = set_value ? accessibility_state_ | state_flag + : accessibility_state_ & ~state_flag; + hr = pAccPropServices->SetHwndProp(m_hWnd, OBJID_CLIENT, + CHILDID_SELF, PROPID_ACC_STATE, var); + + ::NotifyWinEvent(EVENT_OBJECT_STATECHANGE, m_hWnd, OBJID_CLIENT, + CHILDID_SELF); +} + +void NativeTextfieldWin::UpdateAccessibleValue(const std::wstring& value) { + ScopedComPtr<IAccPropServices> pAccPropServices; + HRESULT hr = CoCreateInstance(CLSID_AccPropServices, NULL, CLSCTX_SERVER, + IID_IAccPropServices, reinterpret_cast<void**>(&pAccPropServices)); + if (!SUCCEEDED(hr)) + return; + + hr = pAccPropServices->SetHwndPropStr(m_hWnd, OBJID_CLIENT, + CHILDID_SELF, PROPID_ACC_VALUE, value.c_str()); + + ::NotifyWinEvent(EVENT_OBJECT_VALUECHANGE, m_hWnd, OBJID_CLIENT, + CHILDID_SELF); +} + //////////////////////////////////////////////////////////////////////////////// // NativeTextfieldWin, private: @@ -859,6 +933,7 @@ void NativeTextfieldWin::OnAfterPossibleChange(bool should_redraw_text) { return; } textfield_->SyncText(); + UpdateAccessibleValue(textfield_->text()); if (textfield_->GetController()) textfield_->GetController()->ContentsChanged(textfield_, new_text); diff --git a/views/controls/textfield/native_textfield_win.h b/views/controls/textfield/native_textfield_win.h index f3b4d5e..abb3357 100644 --- a/views/controls/textfield/native_textfield_win.h +++ b/views/controls/textfield/native_textfield_win.h @@ -10,6 +10,7 @@ #include <atlcrack.h> #include <atlctrls.h> #include <atlmisc.h> +#include <oleacc.h> #include <tom.h> // For ITextDocument, a COM interface to CRichEditCtrl #include <vsstyle.h> @@ -71,6 +72,11 @@ class NativeTextfieldWin menus::Accelerator* accelerator); virtual void ExecuteCommand(int command_id); + // Update accessibility information. + void InitializeAccessibilityInfo(); + void UpdateAccessibleState(uint32 state_flag, bool set_value); + void UpdateAccessibleValue(const std::wstring& value); + // CWindowImpl BEGIN_MSG_MAP(Edit) MSG_WM_CHAR(OnChar) @@ -242,6 +248,9 @@ class NativeTextfieldWin COLORREF bg_color_; + // The accessibility state of this object. + int accessibility_state_; + DISALLOW_COPY_AND_ASSIGN(NativeTextfieldWin); }; |