ia2AccessibleValue.cpp (2773B)
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim:expandtab:shiftwidth=2:tabstop=2: 3 */ 4 /* This Source Code Form is subject to the terms of the Mozilla Public 5 * License, v. 2.0. If a copy of the MPL was not distributed with this 6 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 7 8 #include "ia2AccessibleValue.h" 9 10 #include "AccessibleValue_i.c" 11 12 #include "AccessibleWrap.h" 13 #include "LocalAccessible-inl.h" 14 #include "IUnknownImpl.h" 15 #include "MsaaAccessible.h" 16 17 using namespace mozilla::a11y; 18 19 AccessibleWrap* ia2AccessibleValue::LocalAcc() { 20 return static_cast<MsaaAccessible*>(this)->LocalAcc(); 21 } 22 23 Accessible* ia2AccessibleValue::Acc() { 24 return static_cast<MsaaAccessible*>(this)->Acc(); 25 } 26 27 // IUnknown 28 29 STDMETHODIMP 30 ia2AccessibleValue::QueryInterface(REFIID iid, void** ppv) { 31 if (!ppv) return E_INVALIDARG; 32 33 *ppv = nullptr; 34 35 if (IID_IAccessibleValue == iid) { 36 Accessible* valueAcc = Acc(); 37 if (valueAcc && valueAcc->HasNumericValue()) { 38 RefPtr<IAccessibleValue> result = this; 39 result.forget(ppv); 40 return S_OK; 41 } 42 43 return E_NOINTERFACE; 44 } 45 46 return E_NOINTERFACE; 47 } 48 49 // IAccessibleValue 50 51 STDMETHODIMP 52 ia2AccessibleValue::get_currentValue(VARIANT* aCurrentValue) { 53 if (!aCurrentValue) return E_INVALIDARG; 54 55 VariantInit(aCurrentValue); 56 57 Accessible* valueAcc = Acc(); 58 if (!valueAcc) { 59 return CO_E_OBJNOTCONNECTED; 60 } 61 double currentValue; 62 63 currentValue = valueAcc->CurValue(); 64 65 if (std::isnan(currentValue)) return S_FALSE; 66 67 aCurrentValue->vt = VT_R8; 68 aCurrentValue->dblVal = currentValue; 69 return S_OK; 70 } 71 72 STDMETHODIMP 73 ia2AccessibleValue::setCurrentValue(VARIANT aValue) { 74 if (aValue.vt != VT_R8) return E_INVALIDARG; 75 76 Accessible* valueAcc = Acc(); 77 if (!valueAcc) { 78 return CO_E_OBJNOTCONNECTED; 79 } 80 81 return valueAcc->SetCurValue(aValue.dblVal) ? S_OK : E_FAIL; 82 } 83 84 STDMETHODIMP 85 ia2AccessibleValue::get_maximumValue(VARIANT* aMaximumValue) { 86 if (!aMaximumValue) return E_INVALIDARG; 87 88 VariantInit(aMaximumValue); 89 90 Accessible* valueAcc = Acc(); 91 if (!valueAcc) { 92 return CO_E_OBJNOTCONNECTED; 93 } 94 double maximumValue; 95 96 maximumValue = valueAcc->MaxValue(); 97 98 if (std::isnan(maximumValue)) return S_FALSE; 99 100 aMaximumValue->vt = VT_R8; 101 aMaximumValue->dblVal = maximumValue; 102 return S_OK; 103 } 104 105 STDMETHODIMP 106 ia2AccessibleValue::get_minimumValue(VARIANT* aMinimumValue) { 107 if (!aMinimumValue) return E_INVALIDARG; 108 109 VariantInit(aMinimumValue); 110 111 Accessible* valueAcc = Acc(); 112 if (!valueAcc) { 113 return CO_E_OBJNOTCONNECTED; 114 } 115 double minimumValue; 116 117 minimumValue = valueAcc->MinValue(); 118 119 if (std::isnan(minimumValue)) return S_FALSE; 120 121 aMinimumValue->vt = VT_R8; 122 aMinimumValue->dblVal = minimumValue; 123 return S_OK; 124 }