2007-03-22 10:30:00 -07:00
|
|
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
|
|
/* ***** BEGIN LICENSE BLOCK *****
|
|
|
|
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
|
|
|
*
|
|
|
|
* The contents of this file are subject to the Mozilla Public License Version
|
|
|
|
* 1.1 (the "License"); you may not use this file except in compliance with
|
|
|
|
* the License. You may obtain a copy of the License at
|
|
|
|
* http://www.mozilla.org/MPL/
|
|
|
|
*
|
|
|
|
* Software distributed under the License is distributed on an "AS IS" basis,
|
|
|
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
|
|
|
* for the specific language governing rights and limitations under the
|
|
|
|
* License.
|
|
|
|
*
|
|
|
|
* The Original Code is mozilla.org code.
|
|
|
|
*
|
|
|
|
* The Initial Developer of the Original Code is
|
|
|
|
* Netscape Communications Corporation.
|
|
|
|
* Portions created by the Initial Developer are Copyright (C) 1998
|
|
|
|
* the Initial Developer. All Rights Reserved.
|
|
|
|
*
|
|
|
|
* Contributor(s):
|
2009-09-10 18:07:56 -07:00
|
|
|
* Aaron Leventhal <aaronl@netscape.com> (original author)
|
|
|
|
* Kyle Yuan <kyle.yuan@sun.com>
|
|
|
|
* Alexander Surkov <surkov.alexander@gmail.com>
|
2007-03-22 10:30:00 -07:00
|
|
|
*
|
|
|
|
* Alternatively, the contents of this file may be used under the terms of
|
|
|
|
* either of the GNU General Public License Version 2 or later (the "GPL"),
|
|
|
|
* or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
|
|
|
* in which case the provisions of the GPL or the LGPL are applicable instead
|
|
|
|
* of those above. If you wish to allow use of your version of this file only
|
|
|
|
* under the terms of either the GPL or the LGPL, and not to allow others to
|
|
|
|
* use your version of this file under the terms of the MPL, indicate your
|
|
|
|
* decision by deleting the provisions above and replace them with the notice
|
|
|
|
* and other provisions required by the GPL or the LGPL. If you do not delete
|
|
|
|
* the provisions above, a recipient may use your version of this file under
|
|
|
|
* the terms of any one of the MPL, the GPL or the LGPL.
|
|
|
|
*
|
|
|
|
* ***** END LICENSE BLOCK ***** */
|
|
|
|
|
2009-09-10 18:07:56 -07:00
|
|
|
#include "nsXULListboxAccessible.h"
|
|
|
|
|
2010-04-26 23:52:03 -07:00
|
|
|
#include "nsAccessibilityService.h"
|
|
|
|
#include "nsAccUtils.h"
|
|
|
|
|
2008-01-23 15:49:10 -08:00
|
|
|
#include "nsIDOMXULPopupElement.h"
|
2008-03-05 20:14:10 -08:00
|
|
|
#include "nsIDOMXULMultSelectCntrlEl.h"
|
2007-03-22 10:30:00 -07:00
|
|
|
#include "nsIDOMXULSelectCntrlItemEl.h"
|
|
|
|
|
2007-09-18 20:31:14 -07:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// nsXULColumnsAccessible
|
2009-09-10 18:07:56 -07:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
2007-09-18 20:31:14 -07:00
|
|
|
|
|
|
|
nsXULColumnsAccessible::
|
2010-06-11 01:23:18 -07:00
|
|
|
nsXULColumnsAccessible(nsIContent *aContent, nsIWeakReference *aShell) :
|
|
|
|
nsAccessibleWrap(aContent, aShell)
|
2007-09-18 20:31:14 -07:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2009-03-07 07:38:58 -08:00
|
|
|
nsresult
|
|
|
|
nsXULColumnsAccessible::GetRoleInternal(PRUint32 *aRole)
|
2007-09-18 20:31:14 -07:00
|
|
|
{
|
|
|
|
*aRole = nsIAccessibleRole::ROLE_LIST;
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2008-11-03 19:37:46 -08:00
|
|
|
nsresult
|
|
|
|
nsXULColumnsAccessible::GetStateInternal(PRUint32 *aState,
|
|
|
|
PRUint32 *aExtraState)
|
2007-09-18 20:31:14 -07:00
|
|
|
{
|
|
|
|
NS_ENSURE_ARG_POINTER(aState);
|
2008-11-26 20:04:05 -08:00
|
|
|
*aState = 0;
|
|
|
|
|
|
|
|
if (IsDefunct()) {
|
|
|
|
if (aExtraState)
|
|
|
|
*aExtraState = nsIAccessibleStates::EXT_STATE_DEFUNCT;
|
|
|
|
|
|
|
|
return NS_OK_DEFUNCT_OBJECT;
|
2007-11-15 11:53:40 -08:00
|
|
|
}
|
2008-11-26 20:04:05 -08:00
|
|
|
|
|
|
|
*aState = nsIAccessibleStates::STATE_READONLY;
|
|
|
|
|
|
|
|
if (aExtraState)
|
|
|
|
*aExtraState = 0;
|
|
|
|
|
2007-09-18 20:31:14 -07:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2009-09-10 18:07:56 -07:00
|
|
|
|
2007-09-18 20:31:14 -07:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// nsXULColumnItemAccessible
|
2009-09-10 18:07:56 -07:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
2007-09-18 20:31:14 -07:00
|
|
|
|
|
|
|
nsXULColumnItemAccessible::
|
2010-06-11 01:23:18 -07:00
|
|
|
nsXULColumnItemAccessible(nsIContent *aContent, nsIWeakReference *aShell) :
|
|
|
|
nsLeafAccessible(aContent, aShell)
|
2007-09-18 20:31:14 -07:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2009-03-07 07:38:58 -08:00
|
|
|
nsresult
|
|
|
|
nsXULColumnItemAccessible::GetRoleInternal(PRUint32 *aRole)
|
2007-09-18 20:31:14 -07:00
|
|
|
{
|
|
|
|
*aRole = nsIAccessibleRole::ROLE_COLUMNHEADER;
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2008-11-03 19:37:46 -08:00
|
|
|
nsresult
|
|
|
|
nsXULColumnItemAccessible::GetStateInternal(PRUint32 *aState,
|
|
|
|
PRUint32 *aExtraState)
|
2007-09-18 20:31:14 -07:00
|
|
|
{
|
|
|
|
NS_ENSURE_ARG_POINTER(aState);
|
2008-11-26 20:04:05 -08:00
|
|
|
|
|
|
|
if (IsDefunct()) {
|
|
|
|
if (aExtraState)
|
|
|
|
*aExtraState = nsIAccessibleStates::EXT_STATE_DEFUNCT;
|
|
|
|
|
|
|
|
return NS_OK_DEFUNCT_OBJECT;
|
2007-11-15 11:53:40 -08:00
|
|
|
}
|
2008-11-26 20:04:05 -08:00
|
|
|
|
|
|
|
*aState = nsIAccessibleStates::STATE_READONLY;
|
|
|
|
if (aExtraState)
|
|
|
|
*aExtraState = 0;
|
|
|
|
|
2007-09-18 20:31:14 -07:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
nsXULColumnItemAccessible::GetNumActions(PRUint8 *aNumActions)
|
|
|
|
{
|
|
|
|
NS_ENSURE_ARG_POINTER(aNumActions);
|
|
|
|
|
|
|
|
*aNumActions = 1;
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
nsXULColumnItemAccessible::GetActionName(PRUint8 aIndex, nsAString& aName)
|
|
|
|
{
|
|
|
|
if (aIndex != eAction_Click)
|
|
|
|
return NS_ERROR_INVALID_ARG;
|
|
|
|
|
|
|
|
aName.AssignLiteral("click");
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
nsXULColumnItemAccessible::DoAction(PRUint8 aIndex)
|
|
|
|
{
|
|
|
|
if (aIndex != eAction_Click)
|
|
|
|
return NS_ERROR_INVALID_ARG;
|
|
|
|
|
2010-01-25 07:09:25 -08:00
|
|
|
DoCommand();
|
|
|
|
return NS_OK;
|
2007-09-18 20:31:14 -07:00
|
|
|
}
|
2007-03-22 10:30:00 -07:00
|
|
|
|
2007-09-18 20:31:14 -07:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// nsXULListboxAccessible
|
2009-09-10 18:07:56 -07:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
2007-03-22 10:30:00 -07:00
|
|
|
|
2008-02-19 01:07:35 -08:00
|
|
|
nsXULListboxAccessible::
|
2010-06-11 01:23:18 -07:00
|
|
|
nsXULListboxAccessible(nsIContent *aContent, nsIWeakReference *aShell) :
|
|
|
|
nsXULSelectableAccessible(aContent, aShell)
|
2007-03-22 10:30:00 -07:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2008-02-19 01:07:35 -08:00
|
|
|
NS_IMPL_ADDREF_INHERITED(nsXULListboxAccessible, nsXULSelectableAccessible)
|
|
|
|
NS_IMPL_RELEASE_INHERITED(nsXULListboxAccessible, nsXULSelectableAccessible)
|
|
|
|
|
|
|
|
nsresult
|
|
|
|
nsXULListboxAccessible::QueryInterface(REFNSIID aIID, void** aInstancePtr)
|
|
|
|
{
|
|
|
|
nsresult rv = nsXULSelectableAccessible::QueryInterface(aIID, aInstancePtr);
|
|
|
|
if (*aInstancePtr)
|
|
|
|
return rv;
|
|
|
|
|
2009-09-10 18:07:56 -07:00
|
|
|
if (aIID.Equals(NS_GET_IID(nsIAccessibleTable)) && IsMulticolumn()) {
|
2008-02-19 01:07:35 -08:00
|
|
|
*aInstancePtr = static_cast<nsIAccessibleTable*>(this);
|
|
|
|
NS_ADDREF_THIS();
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
return NS_ERROR_NO_INTERFACE;
|
|
|
|
}
|
|
|
|
|
|
|
|
PRBool
|
2009-09-10 18:07:56 -07:00
|
|
|
nsXULListboxAccessible::IsMulticolumn()
|
2008-02-19 01:07:35 -08:00
|
|
|
{
|
|
|
|
PRInt32 numColumns = 0;
|
2009-09-10 18:07:56 -07:00
|
|
|
nsresult rv = GetColumnCount(&numColumns);
|
2008-02-19 01:07:35 -08:00
|
|
|
if (NS_FAILED(rv))
|
|
|
|
return PR_FALSE;
|
2009-09-10 18:07:56 -07:00
|
|
|
|
2008-02-19 01:07:35 -08:00
|
|
|
return numColumns > 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// nsXULListboxAccessible. nsIAccessible
|
|
|
|
|
2008-11-03 19:37:46 -08:00
|
|
|
nsresult
|
|
|
|
nsXULListboxAccessible::GetStateInternal(PRUint32 *aState,
|
|
|
|
PRUint32 *aExtraState)
|
2007-03-22 10:30:00 -07:00
|
|
|
{
|
2008-02-19 01:07:35 -08:00
|
|
|
// As a nsXULListboxAccessible we can have the following states:
|
|
|
|
// STATE_FOCUSED
|
|
|
|
// STATE_READONLY
|
|
|
|
// STATE_FOCUSABLE
|
|
|
|
|
2007-03-22 10:30:00 -07:00
|
|
|
// Get focus status from base class
|
2008-11-03 19:37:46 -08:00
|
|
|
nsresult rv = nsAccessible::GetStateInternal(aState, aExtraState);
|
2008-11-26 20:04:05 -08:00
|
|
|
NS_ENSURE_A11Y_SUCCESS(rv, rv);
|
2007-03-22 10:30:00 -07:00
|
|
|
|
2010-06-11 01:23:18 -07:00
|
|
|
// see if we are multiple select if so set ourselves as such
|
|
|
|
|
|
|
|
if (mContent->AttrValueIs(kNameSpaceID_None, nsAccessibilityAtoms::seltype,
|
|
|
|
nsAccessibilityAtoms::multiple, eCaseMatters)) {
|
2007-03-22 10:30:00 -07:00
|
|
|
*aState |= nsIAccessibleStates::STATE_MULTISELECTABLE |
|
|
|
|
nsIAccessibleStates::STATE_EXTSELECTABLE;
|
|
|
|
}
|
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Our value is the label of our ( first ) selected child.
|
|
|
|
*/
|
|
|
|
NS_IMETHODIMP nsXULListboxAccessible::GetValue(nsAString& _retval)
|
|
|
|
{
|
|
|
|
_retval.Truncate();
|
2010-06-11 01:23:18 -07:00
|
|
|
nsCOMPtr<nsIDOMXULSelectControlElement> select(do_QueryInterface(mContent));
|
2007-03-22 10:30:00 -07:00
|
|
|
if (select) {
|
|
|
|
nsCOMPtr<nsIDOMXULSelectControlItemElement> selectedItem;
|
|
|
|
select->GetSelectedItem(getter_AddRefs(selectedItem));
|
|
|
|
if (selectedItem)
|
|
|
|
return selectedItem->GetLabel(_retval);
|
|
|
|
}
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
|
2009-03-07 07:38:58 -08:00
|
|
|
nsresult
|
|
|
|
nsXULListboxAccessible::GetRoleInternal(PRUint32 *aRole)
|
2007-03-22 10:30:00 -07:00
|
|
|
{
|
2010-06-11 01:23:18 -07:00
|
|
|
// A richlistbox is used with the new autocomplete URL bar, and has a parent
|
|
|
|
// popup <panel>.
|
|
|
|
nsCOMPtr<nsIDOMXULPopupElement> xulPopup =
|
|
|
|
do_QueryInterface(mContent->GetParent());
|
|
|
|
if (xulPopup) {
|
|
|
|
*aRole = nsIAccessibleRole::ROLE_COMBOBOX_LIST;
|
|
|
|
return NS_OK;
|
2008-01-23 15:49:10 -08:00
|
|
|
}
|
2008-02-19 01:07:35 -08:00
|
|
|
|
2009-09-10 18:07:56 -07:00
|
|
|
if (IsMulticolumn())
|
2008-02-19 01:07:35 -08:00
|
|
|
*aRole = nsIAccessibleRole::ROLE_TABLE;
|
|
|
|
else
|
|
|
|
*aRole = nsIAccessibleRole::ROLE_LISTBOX;
|
|
|
|
|
2007-03-22 10:30:00 -07:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2008-02-19 01:07:35 -08:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// nsXULListboxAccessible. nsIAccessibleTable
|
2007-03-22 10:30:00 -07:00
|
|
|
|
2008-02-19 01:07:35 -08:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsXULListboxAccessible::GetCaption(nsIAccessible **aCaption)
|
|
|
|
{
|
|
|
|
NS_ENSURE_ARG_POINTER(aCaption);
|
|
|
|
*aCaption = nsnull;
|
|
|
|
|
2008-03-05 20:14:10 -08:00
|
|
|
return NS_OK;
|
2008-02-19 01:07:35 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
nsXULListboxAccessible::GetSummary(nsAString &aSummary)
|
|
|
|
{
|
|
|
|
aSummary.Truncate();
|
|
|
|
|
2008-03-05 20:14:10 -08:00
|
|
|
return NS_OK;
|
2008-02-19 01:07:35 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
2009-09-10 18:07:56 -07:00
|
|
|
nsXULListboxAccessible::GetColumnCount(PRInt32 *aColumnsCout)
|
2008-02-19 01:07:35 -08:00
|
|
|
{
|
2009-09-10 18:07:56 -07:00
|
|
|
NS_ENSURE_ARG_POINTER(aColumnsCout);
|
|
|
|
*aColumnsCout = 0;
|
2008-02-19 01:07:35 -08:00
|
|
|
|
2009-09-10 18:07:56 -07:00
|
|
|
if (IsDefunct())
|
2008-02-19 01:07:35 -08:00
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
|
2010-06-11 01:23:18 -07:00
|
|
|
nsIContent* headContent = nsnull;
|
2008-02-19 01:07:35 -08:00
|
|
|
|
2010-06-11 01:23:18 -07:00
|
|
|
PRUint32 count = mContent->GetChildCount();
|
2008-02-19 01:07:35 -08:00
|
|
|
for (PRUint32 index = 0; index < count; ++index) {
|
2010-06-11 01:23:18 -07:00
|
|
|
nsIContent* childContent = mContent->GetChildAt(index);
|
2008-03-05 20:14:10 -08:00
|
|
|
if (childContent->NodeInfo()->Equals(nsAccessibilityAtoms::listcols,
|
2008-02-19 01:07:35 -08:00
|
|
|
kNameSpaceID_XUL)) {
|
|
|
|
headContent = childContent;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!headContent)
|
|
|
|
return NS_OK;
|
|
|
|
|
|
|
|
PRUint32 columnCount = 0;
|
|
|
|
|
2010-06-11 01:23:18 -07:00
|
|
|
count = headContent->GetChildCount();
|
2008-02-19 01:07:35 -08:00
|
|
|
for (PRUint32 index = 0; index < count; ++index) {
|
2010-06-11 01:23:18 -07:00
|
|
|
nsIContent* childContent = headContent->GetChildAt(index);
|
2008-03-05 20:14:10 -08:00
|
|
|
if (childContent->NodeInfo()->Equals(nsAccessibilityAtoms::listcol,
|
2008-02-19 01:07:35 -08:00
|
|
|
kNameSpaceID_XUL)) {
|
|
|
|
columnCount++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-09-10 18:07:56 -07:00
|
|
|
*aColumnsCout = columnCount;
|
2008-02-19 01:07:35 -08:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
2010-06-11 01:23:18 -07:00
|
|
|
nsXULListboxAccessible::GetRowCount(PRInt32 *aRowCount)
|
2008-02-19 01:07:35 -08:00
|
|
|
{
|
2010-06-11 01:23:18 -07:00
|
|
|
NS_ENSURE_ARG_POINTER(aRowCount);
|
|
|
|
*aRowCount = 0;
|
2008-02-19 01:07:35 -08:00
|
|
|
|
2009-09-10 18:07:56 -07:00
|
|
|
if (IsDefunct())
|
2008-02-19 01:07:35 -08:00
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
|
2010-06-11 01:23:18 -07:00
|
|
|
nsCOMPtr<nsIDOMXULSelectControlElement> element(do_QueryInterface(mContent));
|
2008-02-19 01:07:35 -08:00
|
|
|
NS_ENSURE_STATE(element);
|
|
|
|
|
|
|
|
PRUint32 itemCount = 0;
|
|
|
|
nsresult rv = element->GetItemCount(&itemCount);
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
2010-06-11 01:23:18 -07:00
|
|
|
*aRowCount = itemCount;
|
2008-02-19 01:07:35 -08:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
2009-09-10 18:07:56 -07:00
|
|
|
nsXULListboxAccessible::GetCellAt(PRInt32 aRow, PRInt32 aColumn,
|
2008-02-19 01:07:35 -08:00
|
|
|
nsIAccessible **aAccessibleCell)
|
|
|
|
{
|
|
|
|
NS_ENSURE_ARG_POINTER(aAccessibleCell);
|
|
|
|
*aAccessibleCell = nsnull;
|
|
|
|
|
|
|
|
if (IsDefunct())
|
|
|
|
return NS_OK;
|
|
|
|
|
|
|
|
nsCOMPtr<nsIDOMXULSelectControlElement> control =
|
2010-06-11 01:23:18 -07:00
|
|
|
do_QueryInterface(mContent);
|
2008-02-19 01:07:35 -08:00
|
|
|
|
|
|
|
nsCOMPtr<nsIDOMXULSelectControlItemElement> item;
|
|
|
|
control->GetItemAtIndex(aRow, getter_AddRefs(item));
|
|
|
|
NS_ENSURE_TRUE(item, NS_ERROR_INVALID_ARG);
|
|
|
|
|
2010-06-11 01:23:18 -07:00
|
|
|
nsCOMPtr<nsIContent> itemContent(do_QueryInterface(item));
|
2009-09-10 18:07:56 -07:00
|
|
|
|
2010-05-25 01:05:52 -07:00
|
|
|
nsAccessible *row =
|
2010-06-11 01:23:18 -07:00
|
|
|
GetAccService()->GetAccessibleInWeakShell(itemContent, mWeakShell);
|
2010-05-25 01:05:52 -07:00
|
|
|
NS_ENSURE_STATE(row);
|
2008-02-19 01:07:35 -08:00
|
|
|
|
2010-05-25 01:05:52 -07:00
|
|
|
nsresult rv = row->GetChildAt(aColumn, aAccessibleCell);
|
2008-02-19 01:07:35 -08:00
|
|
|
NS_ENSURE_SUCCESS(rv, NS_ERROR_INVALID_ARG);
|
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
2009-09-10 18:07:56 -07:00
|
|
|
nsXULListboxAccessible::GetCellIndexAt(PRInt32 aRow, PRInt32 aColumn,
|
|
|
|
PRInt32 *aIndex)
|
2008-02-19 01:07:35 -08:00
|
|
|
{
|
|
|
|
NS_ENSURE_ARG_POINTER(aIndex);
|
|
|
|
*aIndex = -1;
|
|
|
|
|
|
|
|
PRInt32 rowCount = 0;
|
2009-09-10 18:07:56 -07:00
|
|
|
nsresult rv = GetRowCount(&rowCount);
|
2008-02-19 01:07:35 -08:00
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
NS_ENSURE_TRUE(0 <= aRow && aRow <= rowCount, NS_ERROR_INVALID_ARG);
|
|
|
|
|
|
|
|
PRInt32 columnCount = 0;
|
2009-09-10 18:07:56 -07:00
|
|
|
rv = GetColumnCount(&columnCount);
|
2008-02-19 01:07:35 -08:00
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
NS_ENSURE_TRUE(0 <= aColumn && aColumn <= columnCount, NS_ERROR_INVALID_ARG);
|
|
|
|
|
|
|
|
*aIndex = aRow * columnCount + aColumn;
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
2009-09-10 18:07:56 -07:00
|
|
|
nsXULListboxAccessible::GetColumnIndexAt(PRInt32 aIndex, PRInt32 *aColumn)
|
2008-02-19 01:07:35 -08:00
|
|
|
{
|
|
|
|
NS_ENSURE_ARG_POINTER(aColumn);
|
|
|
|
*aColumn = -1;
|
|
|
|
|
|
|
|
PRInt32 columnCount = 0;
|
2009-09-10 18:07:56 -07:00
|
|
|
nsresult rv = GetColumnCount(&columnCount);
|
2008-02-19 01:07:35 -08:00
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
|
|
|
*aColumn = aIndex % columnCount;
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
2009-09-10 18:07:56 -07:00
|
|
|
nsXULListboxAccessible::GetRowIndexAt(PRInt32 aIndex, PRInt32 *aRow)
|
2008-02-19 01:07:35 -08:00
|
|
|
{
|
|
|
|
NS_ENSURE_ARG_POINTER(aRow);
|
|
|
|
*aRow = -1;
|
|
|
|
|
|
|
|
PRInt32 columnCount = 0;
|
2009-09-10 18:07:56 -07:00
|
|
|
nsresult rv = GetColumnCount(&columnCount);
|
2008-02-19 01:07:35 -08:00
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
|
|
|
*aRow = aIndex / columnCount;
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
nsXULListboxAccessible::GetColumnExtentAt(PRInt32 aRow, PRInt32 aColumn,
|
|
|
|
PRInt32 *aCellSpans)
|
|
|
|
{
|
|
|
|
NS_ENSURE_ARG_POINTER(aCellSpans);
|
|
|
|
*aCellSpans = 1;
|
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
nsXULListboxAccessible::GetRowExtentAt(PRInt32 aRow, PRInt32 aColumn,
|
|
|
|
PRInt32 *aCellSpans)
|
|
|
|
{
|
|
|
|
NS_ENSURE_ARG_POINTER(aCellSpans);
|
|
|
|
*aCellSpans = 1;
|
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
nsXULListboxAccessible::GetColumnDescription(PRInt32 aColumn,
|
|
|
|
nsAString& aDescription)
|
|
|
|
{
|
2008-03-05 20:14:10 -08:00
|
|
|
aDescription.Truncate();
|
|
|
|
return NS_OK;
|
2008-02-19 01:07:35 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
nsXULListboxAccessible::GetRowDescription(PRInt32 aRow, nsAString& aDescription)
|
|
|
|
{
|
2008-03-05 20:14:10 -08:00
|
|
|
aDescription.Truncate();
|
|
|
|
return NS_OK;
|
2008-02-19 01:07:35 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
nsXULListboxAccessible::IsColumnSelected(PRInt32 aColumn, PRBool *aIsSelected)
|
|
|
|
{
|
|
|
|
NS_ENSURE_ARG_POINTER(aIsSelected);
|
2008-03-05 20:14:10 -08:00
|
|
|
*aIsSelected = PR_FALSE;
|
2008-02-19 01:07:35 -08:00
|
|
|
|
2008-03-05 20:14:10 -08:00
|
|
|
if (IsDefunct())
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
|
|
|
|
nsCOMPtr<nsIDOMXULMultiSelectControlElement> control =
|
2010-06-11 01:23:18 -07:00
|
|
|
do_QueryInterface(mContent);
|
2008-03-05 20:14:10 -08:00
|
|
|
NS_ASSERTION(control,
|
|
|
|
"Doesn't implement nsIDOMXULMultiSelectControlElement.");
|
|
|
|
|
2009-09-10 18:07:56 -07:00
|
|
|
PRInt32 selectedrowCount = 0;
|
|
|
|
nsresult rv = control->GetSelectedCount(&selectedrowCount);
|
2008-03-05 20:14:10 -08:00
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
2009-09-10 18:07:56 -07:00
|
|
|
PRInt32 rowCount = 0;
|
|
|
|
rv = GetRowCount(&rowCount);
|
2008-03-05 20:14:10 -08:00
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
2009-09-10 18:07:56 -07:00
|
|
|
*aIsSelected = (selectedrowCount == rowCount);
|
2008-03-05 20:14:10 -08:00
|
|
|
return NS_OK;
|
2008-02-19 01:07:35 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
nsXULListboxAccessible::IsRowSelected(PRInt32 aRow, PRBool *aIsSelected)
|
|
|
|
{
|
|
|
|
NS_ENSURE_ARG_POINTER(aIsSelected);
|
2008-03-05 20:14:10 -08:00
|
|
|
*aIsSelected = PR_FALSE;
|
2008-02-19 01:07:35 -08:00
|
|
|
|
2008-03-05 20:14:10 -08:00
|
|
|
if (IsDefunct())
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
|
|
|
|
nsCOMPtr<nsIDOMXULSelectControlElement> control =
|
2010-06-11 01:23:18 -07:00
|
|
|
do_QueryInterface(mContent);
|
2008-03-05 20:14:10 -08:00
|
|
|
NS_ASSERTION(control,
|
|
|
|
"Doesn't implement nsIDOMXULSelectControlElement.");
|
|
|
|
|
|
|
|
nsCOMPtr<nsIDOMXULSelectControlItemElement> item;
|
|
|
|
control->GetItemAtIndex(aRow, getter_AddRefs(item));
|
|
|
|
NS_ENSURE_TRUE(item, NS_ERROR_INVALID_ARG);
|
|
|
|
|
|
|
|
return item->GetSelected(aIsSelected);
|
2008-02-19 01:07:35 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
2009-09-10 18:07:56 -07:00
|
|
|
nsXULListboxAccessible::IsCellSelected(PRInt32 aRowIndex, PRInt32 aColumnIndex,
|
2008-02-19 01:07:35 -08:00
|
|
|
PRBool *aIsSelected)
|
|
|
|
{
|
2009-09-10 18:07:56 -07:00
|
|
|
return IsRowSelected(aRowIndex, aIsSelected);
|
2008-02-19 01:07:35 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
2009-09-10 18:07:56 -07:00
|
|
|
nsXULListboxAccessible::GetSelectedCellCount(PRUint32* aCount)
|
2008-02-19 01:07:35 -08:00
|
|
|
{
|
|
|
|
NS_ENSURE_ARG_POINTER(aCount);
|
2008-03-05 20:14:10 -08:00
|
|
|
*aCount = 0;
|
2008-02-19 01:07:35 -08:00
|
|
|
|
2008-03-05 20:14:10 -08:00
|
|
|
nsCOMPtr<nsIDOMXULMultiSelectControlElement> control =
|
2010-06-11 01:23:18 -07:00
|
|
|
do_QueryInterface(mContent);
|
2008-03-05 20:14:10 -08:00
|
|
|
NS_ASSERTION(control,
|
|
|
|
"Doesn't implement nsIDOMXULMultiSelectControlElement.");
|
|
|
|
|
|
|
|
nsCOMPtr<nsIDOMNodeList> selectedItems;
|
|
|
|
control->GetSelectedItems(getter_AddRefs(selectedItems));
|
|
|
|
if (!selectedItems)
|
|
|
|
return NS_OK;
|
|
|
|
|
|
|
|
PRUint32 selectedItemsCount = 0;
|
|
|
|
nsresult rv = selectedItems->GetLength(&selectedItemsCount);
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
|
|
|
if (!selectedItemsCount)
|
|
|
|
return NS_OK;
|
|
|
|
|
2009-09-10 18:07:56 -07:00
|
|
|
PRInt32 columnCount = 0;
|
|
|
|
rv = GetColumnCount(&columnCount);
|
2008-03-05 20:14:10 -08:00
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
2009-09-10 18:07:56 -07:00
|
|
|
*aCount = selectedItemsCount * columnCount;
|
2008-03-05 20:14:10 -08:00
|
|
|
return NS_OK;
|
2008-02-19 01:07:35 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
2009-09-10 18:07:56 -07:00
|
|
|
nsXULListboxAccessible::GetSelectedColumnCount(PRUint32* aCount)
|
2008-02-19 01:07:35 -08:00
|
|
|
{
|
|
|
|
NS_ENSURE_ARG_POINTER(aCount);
|
2008-03-05 20:14:10 -08:00
|
|
|
*aCount = 0;
|
2008-02-19 01:07:35 -08:00
|
|
|
|
2008-03-05 20:14:10 -08:00
|
|
|
if (IsDefunct())
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
|
|
|
|
nsCOMPtr<nsIDOMXULMultiSelectControlElement> control =
|
2010-06-11 01:23:18 -07:00
|
|
|
do_QueryInterface(mContent);
|
2008-03-05 20:14:10 -08:00
|
|
|
NS_ASSERTION(control,
|
|
|
|
"Doesn't implement nsIDOMXULMultiSelectControlElement.");
|
|
|
|
|
2009-09-10 18:07:56 -07:00
|
|
|
PRInt32 selectedrowCount = 0;
|
|
|
|
nsresult rv = control->GetSelectedCount(&selectedrowCount);
|
2008-03-05 20:14:10 -08:00
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
2009-09-10 18:07:56 -07:00
|
|
|
PRInt32 rowCount = 0;
|
|
|
|
rv = GetRowCount(&rowCount);
|
2008-03-05 20:14:10 -08:00
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
2009-09-10 18:07:56 -07:00
|
|
|
if (selectedrowCount != rowCount)
|
2008-03-05 20:14:10 -08:00
|
|
|
return NS_OK;
|
|
|
|
|
2009-09-10 18:07:56 -07:00
|
|
|
PRInt32 columnCount = 0;
|
|
|
|
rv = GetColumnCount(&columnCount);
|
2008-03-05 20:14:10 -08:00
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
2009-09-10 18:07:56 -07:00
|
|
|
*aCount = columnCount;
|
2008-03-05 20:14:10 -08:00
|
|
|
return NS_OK;
|
2008-02-19 01:07:35 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
2009-09-10 18:07:56 -07:00
|
|
|
nsXULListboxAccessible::GetSelectedRowCount(PRUint32* aCount)
|
2008-02-19 01:07:35 -08:00
|
|
|
{
|
|
|
|
NS_ENSURE_ARG_POINTER(aCount);
|
2008-03-05 20:14:10 -08:00
|
|
|
*aCount = 0;
|
2008-02-19 01:07:35 -08:00
|
|
|
|
2008-03-05 20:14:10 -08:00
|
|
|
if (IsDefunct())
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
|
|
|
|
nsCOMPtr<nsIDOMXULMultiSelectControlElement> control =
|
2010-06-11 01:23:18 -07:00
|
|
|
do_QueryInterface(mContent);
|
2008-03-05 20:14:10 -08:00
|
|
|
NS_ASSERTION(control,
|
|
|
|
"Doesn't implement nsIDOMXULMultiSelectControlElement.");
|
|
|
|
|
2009-09-10 18:07:56 -07:00
|
|
|
PRInt32 selectedrowCount = 0;
|
|
|
|
nsresult rv = control->GetSelectedCount(&selectedrowCount);
|
2008-03-05 20:14:10 -08:00
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
2009-09-10 18:07:56 -07:00
|
|
|
*aCount = selectedrowCount;
|
2008-03-05 20:14:10 -08:00
|
|
|
return NS_OK;
|
2008-02-19 01:07:35 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
2009-09-10 18:07:56 -07:00
|
|
|
nsXULListboxAccessible::GetSelectedCells(nsIArray **aCells)
|
|
|
|
{
|
|
|
|
NS_ENSURE_ARG_POINTER(aCells);
|
|
|
|
*aCells = nsnull;
|
|
|
|
|
|
|
|
if (IsDefunct())
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
|
|
|
|
nsresult rv = NS_OK;
|
|
|
|
nsCOMPtr<nsIMutableArray> selCells =
|
|
|
|
do_CreateInstance(NS_ARRAY_CONTRACTID, &rv);
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
|
|
|
nsCOMPtr<nsIDOMXULMultiSelectControlElement> control =
|
2010-06-11 01:23:18 -07:00
|
|
|
do_QueryInterface(mContent);
|
2009-09-10 18:07:56 -07:00
|
|
|
NS_ASSERTION(control,
|
|
|
|
"Doesn't implement nsIDOMXULMultiSelectControlElement.");
|
|
|
|
|
|
|
|
nsCOMPtr<nsIDOMNodeList> selectedItems;
|
|
|
|
control->GetSelectedItems(getter_AddRefs(selectedItems));
|
|
|
|
if (!selectedItems)
|
|
|
|
return NS_OK;
|
|
|
|
|
|
|
|
PRUint32 selectedItemsCount = 0;
|
|
|
|
rv = selectedItems->GetLength(&selectedItemsCount);
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
|
|
|
PRUint32 index = 0;
|
|
|
|
for (; index < selectedItemsCount; index++) {
|
|
|
|
nsCOMPtr<nsIDOMNode> itemNode;
|
|
|
|
selectedItems->Item(index, getter_AddRefs(itemNode));
|
2010-06-11 01:23:18 -07:00
|
|
|
nsCOMPtr<nsIContent> itemContent(do_QueryInterface(itemNode));
|
2010-05-25 01:05:52 -07:00
|
|
|
nsAccessible *item =
|
2010-06-11 01:23:18 -07:00
|
|
|
GetAccService()->GetAccessibleInWeakShell(itemContent, mWeakShell);
|
2009-09-10 18:07:56 -07:00
|
|
|
|
|
|
|
if (item) {
|
2010-04-23 17:40:51 -07:00
|
|
|
PRInt32 cellCount = item->GetChildCount();
|
|
|
|
for (PRInt32 cellIdx = 0; cellIdx < cellCount; cellIdx++) {
|
|
|
|
nsAccessible *cell = mChildren[cellIdx];
|
2009-09-10 18:07:56 -07:00
|
|
|
if (nsAccUtils::Role(cell) == nsIAccessibleRole::ROLE_CELL)
|
2010-04-23 17:40:51 -07:00
|
|
|
selCells->AppendElement(static_cast<nsIAccessible*>(cell), PR_FALSE);
|
2009-09-10 18:07:56 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_ADDREF(*aCells = selCells);
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
nsXULListboxAccessible::GetSelectedCellIndices(PRUint32 *aNumCells,
|
|
|
|
PRInt32 **aCells)
|
2008-02-19 01:07:35 -08:00
|
|
|
{
|
|
|
|
NS_ENSURE_ARG_POINTER(aNumCells);
|
2008-03-05 20:14:10 -08:00
|
|
|
*aNumCells = 0;
|
2008-02-19 01:07:35 -08:00
|
|
|
NS_ENSURE_ARG_POINTER(aCells);
|
2008-03-05 20:14:10 -08:00
|
|
|
*aCells = nsnull;
|
2008-02-19 01:07:35 -08:00
|
|
|
|
2008-03-05 20:14:10 -08:00
|
|
|
if (IsDefunct())
|
|
|
|
return NS_ERROR_FAILURE;
|
2009-09-10 18:07:56 -07:00
|
|
|
|
2008-03-05 20:14:10 -08:00
|
|
|
nsCOMPtr<nsIDOMXULMultiSelectControlElement> control =
|
2010-06-11 01:23:18 -07:00
|
|
|
do_QueryInterface(mContent);
|
2008-03-05 20:14:10 -08:00
|
|
|
NS_ASSERTION(control,
|
|
|
|
"Doesn't implement nsIDOMXULMultiSelectControlElement.");
|
|
|
|
|
|
|
|
nsCOMPtr<nsIDOMNodeList> selectedItems;
|
|
|
|
control->GetSelectedItems(getter_AddRefs(selectedItems));
|
|
|
|
if (!selectedItems)
|
|
|
|
return NS_OK;
|
|
|
|
|
|
|
|
PRUint32 selectedItemsCount = 0;
|
|
|
|
nsresult rv = selectedItems->GetLength(&selectedItemsCount);
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
2009-09-10 18:07:56 -07:00
|
|
|
PRInt32 columnCount = 0;
|
|
|
|
rv = GetColumnCount(&columnCount);
|
2008-03-05 20:14:10 -08:00
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
2009-09-10 18:07:56 -07:00
|
|
|
PRUint32 cellsCount = selectedItemsCount * columnCount;
|
2008-03-05 20:14:10 -08:00
|
|
|
|
|
|
|
PRInt32 *cellsIdxArray =
|
|
|
|
static_cast<PRInt32*>(nsMemory::Alloc((cellsCount) * sizeof(PRInt32)));
|
|
|
|
NS_ENSURE_TRUE(cellsIdxArray, NS_ERROR_OUT_OF_MEMORY);
|
|
|
|
|
|
|
|
PRUint32 index = 0, cellsIdx = 0;
|
|
|
|
for (; index < selectedItemsCount; index++) {
|
|
|
|
nsCOMPtr<nsIDOMNode> itemNode;
|
|
|
|
selectedItems->Item(index, getter_AddRefs(itemNode));
|
|
|
|
nsCOMPtr<nsIDOMXULSelectControlItemElement> item =
|
|
|
|
do_QueryInterface(itemNode);
|
|
|
|
|
|
|
|
if (item) {
|
|
|
|
PRInt32 itemIdx = -1;
|
|
|
|
control->GetIndexOfItem(item, &itemIdx);
|
|
|
|
if (itemIdx != -1) {
|
|
|
|
PRInt32 colIdx = 0;
|
2009-09-10 18:07:56 -07:00
|
|
|
for (; colIdx < columnCount; colIdx++)
|
|
|
|
cellsIdxArray[cellsIdx++] = itemIdx * columnCount + colIdx;
|
2008-03-05 20:14:10 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
*aNumCells = cellsCount;
|
|
|
|
*aCells = cellsIdxArray;
|
|
|
|
|
|
|
|
return NS_OK;
|
2008-02-19 01:07:35 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
2009-09-10 18:07:56 -07:00
|
|
|
nsXULListboxAccessible::GetSelectedColumnIndices(PRUint32 *aNumColumns,
|
|
|
|
PRInt32 **aColumns)
|
2008-02-19 01:07:35 -08:00
|
|
|
{
|
|
|
|
NS_ENSURE_ARG_POINTER(aNumColumns);
|
2008-03-05 20:14:10 -08:00
|
|
|
*aNumColumns = 0;
|
2008-02-19 01:07:35 -08:00
|
|
|
NS_ENSURE_ARG_POINTER(aColumns);
|
2008-03-05 20:14:10 -08:00
|
|
|
*aColumns = nsnull;
|
2008-02-19 01:07:35 -08:00
|
|
|
|
2008-03-05 20:14:10 -08:00
|
|
|
if (IsDefunct())
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
|
2009-09-10 18:07:56 -07:00
|
|
|
PRUint32 columnCount = 0;
|
|
|
|
nsresult rv = GetSelectedColumnCount(&columnCount);
|
2008-03-05 20:14:10 -08:00
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
2009-09-10 18:07:56 -07:00
|
|
|
if (!columnCount)
|
2008-03-05 20:14:10 -08:00
|
|
|
return NS_OK;
|
|
|
|
|
|
|
|
PRInt32 *colsIdxArray =
|
2009-09-10 18:07:56 -07:00
|
|
|
static_cast<PRInt32*>(nsMemory::Alloc((columnCount) * sizeof(PRInt32)));
|
2008-03-05 20:14:10 -08:00
|
|
|
NS_ENSURE_TRUE(colsIdxArray, NS_ERROR_OUT_OF_MEMORY);
|
|
|
|
|
|
|
|
PRUint32 colIdx = 0;
|
2009-09-10 18:07:56 -07:00
|
|
|
for (; colIdx < columnCount; colIdx++)
|
2008-03-05 20:14:10 -08:00
|
|
|
colsIdxArray[colIdx] = colIdx;
|
|
|
|
|
2009-09-10 18:07:56 -07:00
|
|
|
*aNumColumns = columnCount;
|
2008-03-05 20:14:10 -08:00
|
|
|
*aColumns = colsIdxArray;
|
|
|
|
|
|
|
|
return NS_OK;
|
2008-02-19 01:07:35 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
2009-09-10 18:07:56 -07:00
|
|
|
nsXULListboxAccessible::GetSelectedRowIndices(PRUint32 *aNumRows,
|
|
|
|
PRInt32 **aRows)
|
2008-02-19 01:07:35 -08:00
|
|
|
{
|
|
|
|
NS_ENSURE_ARG_POINTER(aNumRows);
|
2008-03-05 20:14:10 -08:00
|
|
|
*aNumRows = 0;
|
2008-02-19 01:07:35 -08:00
|
|
|
NS_ENSURE_ARG_POINTER(aRows);
|
2008-03-05 20:14:10 -08:00
|
|
|
*aRows = nsnull;
|
2008-02-19 01:07:35 -08:00
|
|
|
|
2008-03-05 20:14:10 -08:00
|
|
|
if (IsDefunct())
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
|
|
|
|
nsCOMPtr<nsIDOMXULMultiSelectControlElement> control =
|
2010-06-11 01:23:18 -07:00
|
|
|
do_QueryInterface(mContent);
|
2008-03-05 20:14:10 -08:00
|
|
|
NS_ASSERTION(control,
|
|
|
|
"Doesn't implement nsIDOMXULMultiSelectControlElement.");
|
|
|
|
|
|
|
|
nsCOMPtr<nsIDOMNodeList> selectedItems;
|
|
|
|
control->GetSelectedItems(getter_AddRefs(selectedItems));
|
|
|
|
if (!selectedItems)
|
|
|
|
return NS_OK;
|
|
|
|
|
|
|
|
PRUint32 selectedItemsCount = 0;
|
|
|
|
nsresult rv = selectedItems->GetLength(&selectedItemsCount);
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
|
|
|
if (!selectedItemsCount)
|
|
|
|
return NS_OK;
|
|
|
|
|
|
|
|
PRInt32 *rowsIdxArray =
|
|
|
|
static_cast<PRInt32*>(nsMemory::Alloc((selectedItemsCount) * sizeof(PRInt32)));
|
|
|
|
NS_ENSURE_TRUE(rowsIdxArray, NS_ERROR_OUT_OF_MEMORY);
|
|
|
|
|
|
|
|
PRUint32 index = 0;
|
|
|
|
for (; index < selectedItemsCount; index++) {
|
|
|
|
nsCOMPtr<nsIDOMNode> itemNode;
|
|
|
|
selectedItems->Item(index, getter_AddRefs(itemNode));
|
|
|
|
nsCOMPtr<nsIDOMXULSelectControlItemElement> item =
|
|
|
|
do_QueryInterface(itemNode);
|
|
|
|
|
|
|
|
if (item) {
|
|
|
|
PRInt32 itemIdx = -1;
|
|
|
|
control->GetIndexOfItem(item, &itemIdx);
|
|
|
|
if (itemIdx != -1)
|
|
|
|
rowsIdxArray[index] = itemIdx;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
*aNumRows = selectedItemsCount;
|
|
|
|
*aRows = rowsIdxArray;
|
|
|
|
|
|
|
|
return NS_OK;
|
2008-02-19 01:07:35 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
nsXULListboxAccessible::SelectRow(PRInt32 aRow)
|
|
|
|
{
|
2008-03-05 20:14:10 -08:00
|
|
|
if (IsDefunct())
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
|
|
|
|
nsCOMPtr<nsIDOMXULMultiSelectControlElement> control =
|
2010-06-11 01:23:18 -07:00
|
|
|
do_QueryInterface(mContent);
|
2008-03-05 20:14:10 -08:00
|
|
|
NS_ASSERTION(control,
|
|
|
|
"Doesn't implement nsIDOMXULMultiSelectControlElement.");
|
|
|
|
|
|
|
|
nsCOMPtr<nsIDOMXULSelectControlItemElement> item;
|
|
|
|
control->GetItemAtIndex(aRow, getter_AddRefs(item));
|
|
|
|
NS_ENSURE_TRUE(item, NS_ERROR_INVALID_ARG);
|
|
|
|
|
|
|
|
return control->SelectItem(item);
|
2008-02-19 01:07:35 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
nsXULListboxAccessible::SelectColumn(PRInt32 aColumn)
|
|
|
|
{
|
2008-03-05 20:14:10 -08:00
|
|
|
// xul:listbox and xul:richlistbox support row selection only.
|
|
|
|
return NS_OK;
|
2008-02-19 01:07:35 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
nsXULListboxAccessible::UnselectRow(PRInt32 aRow)
|
|
|
|
{
|
2008-03-05 20:14:10 -08:00
|
|
|
if (IsDefunct())
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
|
|
|
|
nsCOMPtr<nsIDOMXULMultiSelectControlElement> control =
|
2010-06-11 01:23:18 -07:00
|
|
|
do_QueryInterface(mContent);
|
2008-03-05 20:14:10 -08:00
|
|
|
NS_ASSERTION(control,
|
|
|
|
"Doesn't implement nsIDOMXULMultiSelectControlElement.");
|
|
|
|
|
|
|
|
nsCOMPtr<nsIDOMXULSelectControlItemElement> item;
|
|
|
|
control->GetItemAtIndex(aRow, getter_AddRefs(item));
|
|
|
|
NS_ENSURE_TRUE(item, NS_ERROR_INVALID_ARG);
|
|
|
|
|
|
|
|
return control->RemoveItemFromSelection(item);
|
2008-02-19 01:07:35 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
nsXULListboxAccessible::UnselectColumn(PRInt32 aColumn)
|
|
|
|
{
|
2008-03-05 20:14:10 -08:00
|
|
|
// xul:listbox and xul:richlistbox support row selection only.
|
|
|
|
return NS_OK;
|
2008-02-19 01:07:35 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
nsXULListboxAccessible::IsProbablyForLayout(PRBool *aIsProbablyForLayout)
|
|
|
|
{
|
|
|
|
NS_ENSURE_ARG_POINTER(aIsProbablyForLayout);
|
|
|
|
*aIsProbablyForLayout = PR_FALSE;
|
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// nsXULListitemAccessible
|
2009-09-10 18:07:56 -07:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
2008-02-19 01:07:35 -08:00
|
|
|
|
|
|
|
nsXULListitemAccessible::
|
2010-06-11 01:23:18 -07:00
|
|
|
nsXULListitemAccessible(nsIContent *aContent, nsIWeakReference *aShell) :
|
|
|
|
nsXULMenuitemAccessible(aContent, aShell)
|
2007-03-22 10:30:00 -07:00
|
|
|
{
|
2010-06-11 01:23:18 -07:00
|
|
|
mIsCheckbox = mContent->AttrValueIs(kNameSpaceID_None,
|
|
|
|
nsAccessibilityAtoms::type,
|
|
|
|
nsAccessibilityAtoms::checkbox,
|
|
|
|
eCaseMatters);
|
2007-03-22 10:30:00 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
/** Inherit the ISupports impl from nsAccessible, we handle nsIAccessibleSelectable */
|
|
|
|
NS_IMPL_ISUPPORTS_INHERITED0(nsXULListitemAccessible, nsAccessible)
|
|
|
|
|
2010-05-25 01:05:52 -07:00
|
|
|
nsAccessible *
|
2008-02-19 01:07:35 -08:00
|
|
|
nsXULListitemAccessible::GetListAccessible()
|
|
|
|
{
|
|
|
|
if (IsDefunct())
|
|
|
|
return nsnull;
|
|
|
|
|
|
|
|
nsCOMPtr<nsIDOMXULSelectControlItemElement> listItem =
|
2010-06-11 01:23:18 -07:00
|
|
|
do_QueryInterface(mContent);
|
2008-02-22 03:07:54 -08:00
|
|
|
if (!listItem)
|
|
|
|
return nsnull;
|
|
|
|
|
2008-02-19 01:07:35 -08:00
|
|
|
nsCOMPtr<nsIDOMXULSelectControlElement> list;
|
|
|
|
listItem->GetControl(getter_AddRefs(list));
|
2008-06-11 01:36:57 -07:00
|
|
|
|
2010-06-11 01:23:18 -07:00
|
|
|
nsCOMPtr<nsIContent> listContent(do_QueryInterface(list));
|
|
|
|
if (!listContent)
|
2008-02-19 01:07:35 -08:00
|
|
|
return nsnull;
|
|
|
|
|
2010-06-11 01:23:18 -07:00
|
|
|
return GetAccService()->GetAccessibleInWeakShell(listContent, mWeakShell);
|
2008-02-19 01:07:35 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// nsXULListitemAccessible. nsIAccessible
|
|
|
|
|
2007-03-22 10:30:00 -07:00
|
|
|
/**
|
|
|
|
* If there is a Listcell as a child ( not anonymous ) use it, otherwise
|
|
|
|
* default to getting the name from GetXULName
|
|
|
|
*/
|
2008-10-10 05:26:55 -07:00
|
|
|
nsresult
|
|
|
|
nsXULListitemAccessible::GetNameInternal(nsAString& aName)
|
2007-03-22 10:30:00 -07:00
|
|
|
{
|
2010-06-11 01:23:18 -07:00
|
|
|
nsIContent* child = mContent->GetChildAt(0);
|
|
|
|
if (child) {
|
|
|
|
if (child->NodeInfo()->Equals(nsAccessibilityAtoms::listcell,
|
|
|
|
kNameSpaceID_XUL)) {
|
|
|
|
child->GetAttr(kNameSpaceID_None, nsAccessibilityAtoms::label, aName);
|
|
|
|
return NS_OK;
|
2007-03-22 10:30:00 -07:00
|
|
|
}
|
|
|
|
}
|
2008-08-24 09:45:56 -07:00
|
|
|
return GetXULName(aName);
|
2007-03-22 10:30:00 -07:00
|
|
|
}
|
|
|
|
|
2009-03-07 07:38:58 -08:00
|
|
|
nsresult
|
|
|
|
nsXULListitemAccessible::GetRoleInternal(PRUint32 *aRole)
|
2007-03-22 10:30:00 -07:00
|
|
|
{
|
2010-05-25 01:05:52 -07:00
|
|
|
nsAccessible *list = GetListAccessible();
|
|
|
|
NS_ENSURE_STATE(list);
|
2008-02-19 01:07:35 -08:00
|
|
|
|
2010-05-25 01:05:52 -07:00
|
|
|
if (nsAccUtils::Role(list) == nsIAccessibleRole::ROLE_TABLE) {
|
2008-02-19 01:07:35 -08:00
|
|
|
*aRole = nsIAccessibleRole::ROLE_ROW;
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2007-03-22 10:30:00 -07:00
|
|
|
if (mIsCheckbox)
|
|
|
|
*aRole = nsIAccessibleRole::ROLE_CHECKBUTTON;
|
2008-10-17 03:10:43 -07:00
|
|
|
else if (nsAccUtils::Role(mParent) == nsIAccessibleRole::ROLE_COMBOBOX_LIST)
|
2008-01-23 15:49:10 -08:00
|
|
|
*aRole = nsIAccessibleRole::ROLE_COMBOBOX_OPTION;
|
2007-03-22 10:30:00 -07:00
|
|
|
else
|
2007-11-15 11:46:29 -08:00
|
|
|
*aRole = nsIAccessibleRole::ROLE_RICH_OPTION;
|
2007-03-22 10:30:00 -07:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2008-11-03 19:37:46 -08:00
|
|
|
nsresult
|
|
|
|
nsXULListitemAccessible::GetStateInternal(PRUint32 *aState,
|
|
|
|
PRUint32 *aExtraState)
|
2007-03-22 10:30:00 -07:00
|
|
|
{
|
|
|
|
if (mIsCheckbox) {
|
2008-11-03 19:37:46 -08:00
|
|
|
return nsXULMenuitemAccessible::GetStateInternal(aState, aExtraState);
|
2007-11-15 11:53:40 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
*aState = 0;
|
2008-11-26 20:04:05 -08:00
|
|
|
|
|
|
|
if (IsDefunct()) {
|
|
|
|
if (aExtraState)
|
2007-11-15 11:53:40 -08:00
|
|
|
*aExtraState = nsIAccessibleStates::EXT_STATE_DEFUNCT;
|
2008-11-26 20:04:05 -08:00
|
|
|
|
|
|
|
return NS_OK_DEFUNCT_OBJECT;
|
2007-03-22 10:30:00 -07:00
|
|
|
}
|
2008-11-26 20:04:05 -08:00
|
|
|
|
2007-11-15 11:53:40 -08:00
|
|
|
if (aExtraState)
|
|
|
|
*aExtraState = 0;
|
2007-03-22 10:30:00 -07:00
|
|
|
|
|
|
|
*aState = nsIAccessibleStates::STATE_FOCUSABLE |
|
|
|
|
nsIAccessibleStates::STATE_SELECTABLE;
|
2009-09-10 18:07:56 -07:00
|
|
|
|
|
|
|
nsCOMPtr<nsIDOMXULSelectControlItemElement> listItem =
|
2010-06-11 01:23:18 -07:00
|
|
|
do_QueryInterface(mContent);
|
2009-09-10 18:07:56 -07:00
|
|
|
|
2007-03-22 10:30:00 -07:00
|
|
|
if (listItem) {
|
|
|
|
PRBool isSelected;
|
|
|
|
listItem->GetSelected(&isSelected);
|
|
|
|
if (isSelected)
|
|
|
|
*aState |= nsIAccessibleStates::STATE_SELECTED;
|
|
|
|
|
2010-06-11 01:23:18 -07:00
|
|
|
if (gLastFocusedNode == mContent)
|
2007-03-22 10:30:00 -07:00
|
|
|
*aState |= nsIAccessibleStates::STATE_FOCUSED;
|
2010-06-11 01:23:18 -07:00
|
|
|
|
2007-03-22 10:30:00 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP nsXULListitemAccessible::GetActionName(PRUint8 aIndex, nsAString& aName)
|
|
|
|
{
|
|
|
|
if (aIndex == eAction_Click && mIsCheckbox) {
|
|
|
|
// check or uncheck
|
|
|
|
PRUint32 state;
|
2008-11-03 19:37:46 -08:00
|
|
|
nsresult rv = GetStateInternal(&state, nsnull);
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
2007-03-22 10:30:00 -07:00
|
|
|
|
|
|
|
if (state & nsIAccessibleStates::STATE_CHECKED)
|
|
|
|
aName.AssignLiteral("uncheck");
|
|
|
|
else
|
|
|
|
aName.AssignLiteral("check");
|
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
return NS_ERROR_INVALID_ARG;
|
|
|
|
}
|
|
|
|
|
2009-06-18 00:37:38 -07:00
|
|
|
PRBool
|
|
|
|
nsXULListitemAccessible::GetAllowsAnonChildAccessibles()
|
2007-04-30 23:03:08 -07:00
|
|
|
{
|
|
|
|
// That indicates we should walk anonymous children for listitems
|
2009-06-18 00:37:38 -07:00
|
|
|
return PR_TRUE;
|
2007-04-30 23:03:08 -07:00
|
|
|
}
|
|
|
|
|
2010-01-06 02:36:50 -08:00
|
|
|
void
|
|
|
|
nsXULListitemAccessible::GetPositionAndSizeInternal(PRInt32 *aPosInSet,
|
|
|
|
PRInt32 *aSetSize)
|
2008-02-19 05:47:19 -08:00
|
|
|
{
|
2010-06-11 01:23:18 -07:00
|
|
|
nsAccUtils::GetPositionAndSizeForXULSelectControlItem(mContent, aPosInSet,
|
2010-01-06 02:36:50 -08:00
|
|
|
aSetSize);
|
2008-02-19 05:47:19 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2008-02-19 01:07:35 -08:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// nsXULListCellAccessible
|
2009-09-10 18:07:56 -07:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
2008-02-19 01:07:35 -08:00
|
|
|
nsXULListCellAccessible::
|
2010-06-11 01:23:18 -07:00
|
|
|
nsXULListCellAccessible(nsIContent *aContent, nsIWeakReference *aShell) :
|
|
|
|
nsHyperTextAccessibleWrap(aContent, aShell)
|
2008-02-19 01:07:35 -08:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2009-09-10 18:07:56 -07:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// nsISupports
|
2008-02-19 01:07:35 -08:00
|
|
|
|
2009-09-10 18:07:56 -07:00
|
|
|
NS_IMPL_ISUPPORTS_INHERITED1(nsXULListCellAccessible,
|
|
|
|
nsHyperTextAccessible,
|
|
|
|
nsIAccessibleTableCell)
|
2007-03-22 10:30:00 -07:00
|
|
|
|
2009-09-10 18:07:56 -07:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// nsXULListCellAccessible: nsIAccessibleTableCell implementation
|
2007-03-22 10:30:00 -07:00
|
|
|
|
2009-09-10 18:07:56 -07:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsXULListCellAccessible::GetTable(nsIAccessibleTable **aTable)
|
2007-03-22 10:30:00 -07:00
|
|
|
{
|
2009-09-10 18:07:56 -07:00
|
|
|
NS_ENSURE_ARG_POINTER(aTable);
|
|
|
|
*aTable = nsnull;
|
2007-03-22 10:30:00 -07:00
|
|
|
|
2009-09-10 18:07:56 -07:00
|
|
|
if (IsDefunct())
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
|
|
|
|
nsCOMPtr<nsIAccessible> thisRow;
|
|
|
|
GetParent(getter_AddRefs(thisRow));
|
|
|
|
if (nsAccUtils::Role(thisRow) != nsIAccessibleRole::ROLE_ROW)
|
|
|
|
return NS_OK;
|
|
|
|
|
|
|
|
nsCOMPtr<nsIAccessible> table;
|
|
|
|
thisRow->GetParent(getter_AddRefs(table));
|
|
|
|
if (nsAccUtils::Role(table) != nsIAccessibleRole::ROLE_TABLE)
|
|
|
|
return NS_OK;
|
|
|
|
|
|
|
|
CallQueryInterface(table, aTable);
|
|
|
|
return NS_OK;
|
2007-03-22 10:30:00 -07:00
|
|
|
}
|
|
|
|
|
2009-09-10 18:07:56 -07:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsXULListCellAccessible::GetColumnIndex(PRInt32 *aColumnIndex)
|
2007-03-22 10:30:00 -07:00
|
|
|
{
|
2009-09-10 18:07:56 -07:00
|
|
|
NS_ENSURE_ARG_POINTER(aColumnIndex);
|
|
|
|
*aColumnIndex = -1;
|
|
|
|
|
|
|
|
if (IsDefunct())
|
2007-03-22 10:30:00 -07:00
|
|
|
return NS_ERROR_FAILURE;
|
2009-09-10 18:07:56 -07:00
|
|
|
|
|
|
|
*aColumnIndex = 0;
|
|
|
|
|
|
|
|
nsCOMPtr<nsIAccessible> prevCell, tmpAcc;
|
|
|
|
GetPreviousSibling(getter_AddRefs(prevCell));
|
|
|
|
|
|
|
|
while (prevCell) {
|
|
|
|
PRUint32 role = nsAccUtils::Role(prevCell);
|
|
|
|
if (role == nsIAccessibleRole::ROLE_CELL ||
|
|
|
|
role == nsIAccessibleRole::ROLE_GRID_CELL ||
|
|
|
|
role == nsIAccessibleRole::ROLE_ROWHEADER ||
|
|
|
|
role == nsIAccessibleRole::ROLE_COLUMNHEADER)
|
|
|
|
(*aColumnIndex)++;
|
|
|
|
|
|
|
|
prevCell->GetPreviousSibling(getter_AddRefs(tmpAcc));
|
|
|
|
tmpAcc.swap(prevCell);
|
2007-03-22 10:30:00 -07:00
|
|
|
}
|
2009-09-10 18:07:56 -07:00
|
|
|
|
2007-03-22 10:30:00 -07:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2009-09-10 18:07:56 -07:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsXULListCellAccessible::GetRowIndex(PRInt32 *aRowIndex)
|
2007-03-22 10:30:00 -07:00
|
|
|
{
|
2009-09-10 18:07:56 -07:00
|
|
|
NS_ENSURE_ARG_POINTER(aRowIndex);
|
|
|
|
*aRowIndex = -1;
|
2007-03-22 10:30:00 -07:00
|
|
|
|
2009-09-10 18:07:56 -07:00
|
|
|
if (IsDefunct())
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
|
|
|
|
nsCOMPtr<nsIAccessible> row, prevRow;
|
|
|
|
GetParent(getter_AddRefs(row));
|
|
|
|
|
|
|
|
while (row) {
|
|
|
|
if (nsAccUtils::Role(row) == nsIAccessibleRole::ROLE_ROW)
|
|
|
|
(*aRowIndex)++;
|
2007-03-22 10:30:00 -07:00
|
|
|
|
2009-09-10 18:07:56 -07:00
|
|
|
row->GetPreviousSibling(getter_AddRefs(prevRow));
|
|
|
|
row.swap(prevRow);
|
|
|
|
}
|
2007-03-22 10:30:00 -07:00
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2009-09-10 18:07:56 -07:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsXULListCellAccessible::GetColumnExtent(PRInt32 *aExtentCount)
|
2007-03-22 10:30:00 -07:00
|
|
|
{
|
2009-09-10 18:07:56 -07:00
|
|
|
NS_ENSURE_ARG_POINTER(aExtentCount);
|
|
|
|
*aExtentCount = 0;
|
2007-03-22 10:30:00 -07:00
|
|
|
|
2009-09-10 18:07:56 -07:00
|
|
|
if (IsDefunct())
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
|
|
|
|
*aExtentCount = 1;
|
|
|
|
return NS_OK;
|
2007-03-22 10:30:00 -07:00
|
|
|
}
|
|
|
|
|
2009-09-10 18:07:56 -07:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsXULListCellAccessible::GetRowExtent(PRInt32 *aExtentCount)
|
2007-03-22 10:30:00 -07:00
|
|
|
{
|
2009-09-10 18:07:56 -07:00
|
|
|
NS_ENSURE_ARG_POINTER(aExtentCount);
|
|
|
|
*aExtentCount = 0;
|
|
|
|
|
|
|
|
if (IsDefunct())
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
|
|
|
|
*aExtentCount = 1;
|
2007-03-22 10:30:00 -07:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2009-09-10 18:07:56 -07:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsXULListCellAccessible::GetColumnHeaderCells(nsIArray **aHeaderCells)
|
2007-03-22 10:30:00 -07:00
|
|
|
{
|
2009-09-10 18:07:56 -07:00
|
|
|
NS_ENSURE_ARG_POINTER(aHeaderCells);
|
|
|
|
*aHeaderCells = nsnull;
|
2007-03-22 10:30:00 -07:00
|
|
|
|
2009-09-10 18:07:56 -07:00
|
|
|
if (IsDefunct())
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
|
|
|
|
nsCOMPtr<nsIAccessibleTable> table;
|
|
|
|
GetTable(getter_AddRefs(table));
|
2009-11-17 13:14:45 -08:00
|
|
|
NS_ENSURE_STATE(table); // we expect to be in a listbox (table)
|
2009-09-10 18:07:56 -07:00
|
|
|
|
|
|
|
// Get column header cell from XUL listhead.
|
2010-05-18 07:03:56 -07:00
|
|
|
nsAccessible *list = nsnull;
|
|
|
|
|
|
|
|
nsRefPtr<nsAccessible> tableAcc(do_QueryObject(table));
|
|
|
|
PRInt32 tableChildCount = tableAcc->GetChildCount();
|
|
|
|
for (PRInt32 childIdx = 0; childIdx < tableChildCount; childIdx++) {
|
|
|
|
nsAccessible *child = tableAcc->GetChildAt(childIdx);
|
|
|
|
if (nsAccUtils::Role(child) == nsIAccessibleRole::ROLE_LIST) {
|
|
|
|
list = child;
|
2009-09-10 18:07:56 -07:00
|
|
|
break;
|
2010-05-18 07:03:56 -07:00
|
|
|
}
|
2007-03-22 10:30:00 -07:00
|
|
|
}
|
2009-06-18 00:37:38 -07:00
|
|
|
|
2009-09-10 18:07:56 -07:00
|
|
|
if (list) {
|
|
|
|
PRInt32 colIdx = -1;
|
|
|
|
GetColumnIndex(&colIdx);
|
|
|
|
|
2010-05-18 07:03:56 -07:00
|
|
|
nsIAccessible *headerCell = list->GetChildAt(colIdx);
|
2009-09-10 18:07:56 -07:00
|
|
|
if (headerCell) {
|
|
|
|
nsresult rv = NS_OK;
|
|
|
|
nsCOMPtr<nsIMutableArray> headerCells =
|
|
|
|
do_CreateInstance(NS_ARRAY_CONTRACTID, &rv);
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
|
|
|
headerCells->AppendElement(headerCell, PR_FALSE);
|
|
|
|
NS_ADDREF(*aHeaderCells = headerCells);
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// No column header cell from XUL markup, try to get it from ARIA markup.
|
|
|
|
return nsAccUtils::GetHeaderCellsFor(table, this,
|
|
|
|
nsAccUtils::eColumnHeaderCells,
|
|
|
|
aHeaderCells);
|
2007-03-22 10:30:00 -07:00
|
|
|
}
|
|
|
|
|
2009-09-10 18:07:56 -07:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsXULListCellAccessible::GetRowHeaderCells(nsIArray **aHeaderCells)
|
2007-03-22 10:30:00 -07:00
|
|
|
{
|
2009-09-10 18:07:56 -07:00
|
|
|
NS_ENSURE_ARG_POINTER(aHeaderCells);
|
|
|
|
*aHeaderCells = nsnull;
|
|
|
|
|
|
|
|
if (IsDefunct())
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
|
|
|
|
nsCOMPtr<nsIAccessibleTable> table;
|
|
|
|
GetTable(getter_AddRefs(table));
|
2009-11-17 13:14:45 -08:00
|
|
|
NS_ENSURE_STATE(table); // we expect to be in a listbox (table)
|
2009-09-10 18:07:56 -07:00
|
|
|
|
|
|
|
// Calculate row header cells from ARIA markup.
|
|
|
|
return nsAccUtils::GetHeaderCellsFor(table, this,
|
|
|
|
nsAccUtils::eRowHeaderCells,
|
|
|
|
aHeaderCells);
|
2007-03-22 10:30:00 -07:00
|
|
|
}
|
|
|
|
|
2009-09-10 18:07:56 -07:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsXULListCellAccessible::IsSelected(PRBool *aIsSelected)
|
2007-03-22 10:30:00 -07:00
|
|
|
{
|
2009-09-10 18:07:56 -07:00
|
|
|
NS_ENSURE_ARG_POINTER(aIsSelected);
|
|
|
|
*aIsSelected = PR_FALSE;
|
2007-03-22 10:30:00 -07:00
|
|
|
|
2009-09-10 18:07:56 -07:00
|
|
|
if (IsDefunct())
|
2007-03-22 10:30:00 -07:00
|
|
|
return NS_ERROR_FAILURE;
|
2009-09-10 18:07:56 -07:00
|
|
|
|
|
|
|
nsCOMPtr<nsIAccessibleTable> table;
|
|
|
|
GetTable(getter_AddRefs(table));
|
2009-11-17 13:14:45 -08:00
|
|
|
NS_ENSURE_STATE(table); // we expect to be in a listbox (table)
|
2009-09-10 18:07:56 -07:00
|
|
|
|
|
|
|
PRInt32 rowIdx = -1;
|
|
|
|
GetRowIndex(&rowIdx);
|
|
|
|
|
|
|
|
return table->IsRowSelected(rowIdx, aIsSelected);
|
2007-03-22 10:30:00 -07:00
|
|
|
}
|
|
|
|
|
2009-09-10 18:07:56 -07:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// nsXULListCellAccessible. nsAccessible implementation
|
|
|
|
|
|
|
|
nsresult
|
|
|
|
nsXULListCellAccessible::GetRoleInternal(PRUint32 *aRole)
|
2007-03-22 10:30:00 -07:00
|
|
|
{
|
2009-09-10 18:07:56 -07:00
|
|
|
*aRole = nsIAccessibleRole::ROLE_CELL;
|
|
|
|
return NS_OK;
|
|
|
|
}
|
2007-03-22 10:30:00 -07:00
|
|
|
|
2009-09-10 18:07:56 -07:00
|
|
|
nsresult
|
|
|
|
nsXULListCellAccessible::GetAttributesInternal(nsIPersistentProperties *aAttributes)
|
|
|
|
{
|
|
|
|
NS_ENSURE_ARG_POINTER(aAttributes);
|
|
|
|
|
|
|
|
if (IsDefunct())
|
2007-03-22 10:30:00 -07:00
|
|
|
return NS_ERROR_FAILURE;
|
2009-09-10 18:07:56 -07:00
|
|
|
|
|
|
|
// "table-cell-index" attribute
|
|
|
|
nsCOMPtr<nsIAccessibleTable> table;
|
|
|
|
GetTable(getter_AddRefs(table));
|
2009-11-17 13:14:45 -08:00
|
|
|
NS_ENSURE_STATE(table); // we expect to be in a listbox (table)
|
2009-09-10 18:07:56 -07:00
|
|
|
|
|
|
|
PRInt32 rowIdx = -1;
|
|
|
|
GetRowIndex(&rowIdx);
|
|
|
|
PRInt32 colIdx = -1;
|
|
|
|
GetColumnIndex(&colIdx);
|
|
|
|
|
|
|
|
PRInt32 cellIdx = -1;
|
|
|
|
table->GetCellIndexAt(rowIdx, colIdx, &cellIdx);
|
|
|
|
|
|
|
|
nsAutoString stringIdx;
|
|
|
|
stringIdx.AppendInt(cellIdx);
|
|
|
|
nsAccUtils::SetAccAttr(aAttributes, nsAccessibilityAtoms::tableCellIndex,
|
|
|
|
stringIdx);
|
2007-03-22 10:30:00 -07:00
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|