xpcAccessibleSelectable.cpp (3482B)
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim: set ts=2 et sw=2 tw=80: */ 3 /* This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this file, 5 * You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #include "nsComponentManagerUtils.h" 8 #include "nsIAccessible.h" 9 #include "nsIMutableArray.h" 10 #include "xpcAccessibleDocument.h" 11 #include "xpcAccessibleSelectable.h" 12 13 using namespace mozilla::a11y; 14 15 NS_IMETHODIMP 16 xpcAccessibleSelectable::GetSelectedItems(nsIArray** aSelectedItems) { 17 NS_ENSURE_ARG_POINTER(aSelectedItems); 18 *aSelectedItems = nullptr; 19 20 if (!Intl()) return NS_ERROR_FAILURE; 21 MOZ_ASSERT(Intl()->IsSelect(), "Called on non selectable widget!"); 22 23 AutoTArray<Accessible*, 10> items; 24 Intl()->SelectedItems(&items); 25 26 uint32_t itemCount = items.Length(); 27 if (itemCount == 0) return NS_OK; 28 29 nsresult rv = NS_OK; 30 nsCOMPtr<nsIMutableArray> xpcItems = 31 do_CreateInstance(NS_ARRAY_CONTRACTID, &rv); 32 NS_ENSURE_SUCCESS(rv, rv); 33 34 for (uint32_t idx = 0; idx < itemCount; idx++) { 35 xpcItems->AppendElement(static_cast<nsIAccessible*>(ToXPC(items[idx]))); 36 } 37 38 NS_ADDREF(*aSelectedItems = xpcItems); 39 return NS_OK; 40 } 41 42 NS_IMETHODIMP 43 xpcAccessibleSelectable::GetSelectedItemCount(uint32_t* aSelectionCount) { 44 NS_ENSURE_ARG_POINTER(aSelectionCount); 45 *aSelectionCount = 0; 46 47 if (!Intl()) return NS_ERROR_FAILURE; 48 MOZ_ASSERT(Intl()->IsSelect(), "Called on non selectable widget!"); 49 50 *aSelectionCount = Intl()->SelectedItemCount(); 51 return NS_OK; 52 } 53 54 NS_IMETHODIMP 55 xpcAccessibleSelectable::GetSelectedItemAt(uint32_t aIndex, 56 nsIAccessible** aSelected) { 57 NS_ENSURE_ARG_POINTER(aSelected); 58 *aSelected = nullptr; 59 60 if (!Intl()) return NS_ERROR_FAILURE; 61 MOZ_ASSERT(Intl()->IsSelect(), "Called on non selectable widget!"); 62 63 *aSelected = ToXPC(Intl()->GetSelectedItem(aIndex)); 64 if (*aSelected) { 65 NS_ADDREF(*aSelected); 66 return NS_OK; 67 } 68 69 return NS_ERROR_INVALID_ARG; 70 } 71 72 NS_IMETHODIMP 73 xpcAccessibleSelectable::IsItemSelected(uint32_t aIndex, bool* aIsSelected) { 74 NS_ENSURE_ARG_POINTER(aIsSelected); 75 *aIsSelected = false; 76 77 if (!Intl()) return NS_ERROR_FAILURE; 78 MOZ_ASSERT(Intl()->IsSelect(), "Called on non selectable widget!"); 79 80 *aIsSelected = Intl()->IsItemSelected(aIndex); 81 return NS_OK; 82 } 83 84 NS_IMETHODIMP 85 xpcAccessibleSelectable::AddItemToSelection(uint32_t aIndex) { 86 if (!Intl()) return NS_ERROR_FAILURE; 87 MOZ_ASSERT(Intl()->IsSelect(), "Called on non selectable widget!"); 88 89 return Intl()->AddItemToSelection(aIndex) ? NS_OK : NS_ERROR_INVALID_ARG; 90 } 91 92 NS_IMETHODIMP 93 xpcAccessibleSelectable::RemoveItemFromSelection(uint32_t aIndex) { 94 if (!Intl()) return NS_ERROR_FAILURE; 95 MOZ_ASSERT(Intl()->IsSelect(), "Called on non selectable widget!"); 96 97 return Intl()->RemoveItemFromSelection(aIndex) ? NS_OK : NS_ERROR_INVALID_ARG; 98 } 99 100 NS_IMETHODIMP 101 xpcAccessibleSelectable::SelectAll(bool* aIsMultiSelect) { 102 NS_ENSURE_ARG_POINTER(aIsMultiSelect); 103 *aIsMultiSelect = false; 104 105 if (!Intl()) return NS_ERROR_FAILURE; 106 MOZ_ASSERT(Intl()->IsSelect(), "Called on non selectable widget!"); 107 108 *aIsMultiSelect = Intl()->SelectAll(); 109 return NS_OK; 110 } 111 112 NS_IMETHODIMP 113 xpcAccessibleSelectable::UnselectAll() { 114 if (!Intl()) return NS_ERROR_FAILURE; 115 MOZ_ASSERT(Intl()->IsSelect(), "Called on non selectable widget!"); 116 117 Intl()->UnselectAll(); 118 return NS_OK; 119 }