/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#ifndef mozilla_a11y_ProxyAccessibleShared_h
#define mozilla_a11y_ProxyAccessibleShared_h

/**
 * These are function declarations shared between win/ProxyAccessible.h and
 * other/ProxyAccessible.h.
 */

/*
 * Return the states for the proxied accessible.
 */
uint64_t State() const;

/*
 * Return the native states for the proxied accessible.
 */
uint64_t NativeState() const;

/*
 * Set aName to the name of the proxied accessible.
 */
void Name(nsString& aName) const;

/*
 * Set aValue to the value of the proxied accessible.
 */
void Value(nsString& aValue) const;

/*
 * Set aHelp to the help string of the proxied accessible.
 */
void Help(nsString& aHelp) const;

/**
 * Set aDesc to the description of the proxied accessible.
 */
void Description(nsString& aDesc) const;

/**
 * Get the set of attributes on the proxied accessible.
 */
void Attributes(nsTArray<Attribute> *aAttrs) const;

/**
 * Return set of targets of given relation type.
 */
nsTArray<ProxyAccessible*> RelationByType(RelationType aType) const;

/**
 * Get all relations for this accessible.
 */
void Relations(nsTArray<RelationType>* aTypes,
    nsTArray<nsTArray<ProxyAccessible*>>* aTargetSets) const;

bool IsSearchbox() const;

nsIAtom* LandmarkRole() const;

nsIAtom* ARIARoleAtom() const;

int32_t GetLevelInternal();
void ScrollTo(uint32_t aScrollType);
void ScrollToPoint(uint32_t aScrollType, int32_t aX, int32_t aY);

int32_t CaretLineNumber();
int32_t CaretOffset();
void SetCaretOffset(int32_t aOffset);

int32_t CharacterCount();
int32_t SelectionCount();

/**
 * Get the text between the given offsets.
 */
bool TextSubstring(int32_t aStartOffset, int32_t aEndOfset,
    nsString& aText) const;

void GetTextAfterOffset(int32_t aOffset, AccessibleTextBoundary aBoundaryType,
    nsString& aText, int32_t* aStartOffset,
    int32_t* aEndOffset);

void GetTextAtOffset(int32_t aOffset, AccessibleTextBoundary aBoundaryType,
    nsString& aText, int32_t* aStartOffset,
    int32_t* aEndOffset);

void GetTextBeforeOffset(int32_t aOffset, AccessibleTextBoundary aBoundaryType,
    nsString& aText, int32_t* aStartOffset,
    int32_t* aEndOffset);

char16_t CharAt(int32_t aOffset);

void TextAttributes(bool aIncludeDefAttrs,
    const int32_t aOffset,
    nsTArray<Attribute>* aAttributes,
    int32_t* aStartOffset,
    int32_t* aEndOffset);
void DefaultTextAttributes(nsTArray<Attribute>* aAttrs);

nsIntRect TextBounds(int32_t aStartOffset, int32_t aEndOffset,
    uint32_t aCoordType = nsIAccessibleCoordinateType::COORDTYPE_SCREEN_RELATIVE);

nsIntRect CharBounds(int32_t aOffset, uint32_t aCoordType);

int32_t OffsetAtPoint(int32_t aX, int32_t aY, uint32_t aCoordType);

bool SelectionBoundsAt(int32_t aSelectionNum,
    nsString& aData,
    int32_t* aStartOffset,
    int32_t* aEndOffset);

bool SetSelectionBoundsAt(int32_t aSelectionNum,
    int32_t aStartOffset,
    int32_t aEndOffset);

bool AddToSelection(int32_t aStartOffset,
    int32_t aEndOffset);

bool RemoveFromSelection(int32_t aSelectionNum);

void ScrollSubstringTo(int32_t aStartOffset, int32_t aEndOffset,
    uint32_t aScrollType);

void ScrollSubstringToPoint(int32_t aStartOffset,
    int32_t aEndOffset,
    uint32_t aCoordinateType,
    int32_t aX, int32_t aY);

void Text(nsString* aText);

void ReplaceText(const nsString& aText);

bool InsertText(const nsString& aText, int32_t aPosition);

bool CopyText(int32_t aStartPos, int32_t aEndPos);

bool CutText(int32_t aStartPos, int32_t aEndPos);

bool DeleteText(int32_t aStartPos, int32_t aEndPos);

bool PasteText(int32_t aPosition);

nsIntPoint ImagePosition(uint32_t aCoordType);

nsIntSize ImageSize();

uint32_t StartOffset(bool* aOk);

uint32_t EndOffset(bool* aOk);

bool IsLinkValid();

uint32_t AnchorCount(bool* aOk);

void AnchorURIAt(uint32_t aIndex, nsCString& aURI, bool* aOk);

ProxyAccessible* AnchorAt(uint32_t aIndex);

uint32_t LinkCount();

ProxyAccessible* LinkAt(const uint32_t& aIndex);

int32_t LinkIndexOf(ProxyAccessible* aLink);

int32_t LinkIndexAtOffset(uint32_t aOffset);

ProxyAccessible* TableOfACell();

uint32_t ColIdx();

uint32_t RowIdx();

void GetPosition(uint32_t* aColIdx, uint32_t* aRowIdx);

uint32_t ColExtent();

uint32_t RowExtent();

void GetColRowExtents(uint32_t* aColIdx, uint32_t* aRowIdx,
                      uint32_t* aColExtent, uint32_t* aRowExtent);

void ColHeaderCells(nsTArray<ProxyAccessible*>* aCells);

void RowHeaderCells(nsTArray<ProxyAccessible*>* aCells);

bool IsCellSelected();

ProxyAccessible* TableCaption();
void TableSummary(nsString& aSummary);
uint32_t TableColumnCount();
uint32_t TableRowCount();
ProxyAccessible* TableCellAt(uint32_t aRow, uint32_t aCol);
int32_t TableCellIndexAt(uint32_t aRow, uint32_t aCol);
int32_t TableColumnIndexAt(uint32_t aCellIndex);
int32_t TableRowIndexAt(uint32_t aCellIndex);
void TableRowAndColumnIndicesAt(uint32_t aCellIndex,
    int32_t* aRow, int32_t* aCol);
uint32_t TableColumnExtentAt(uint32_t aRow, uint32_t aCol);
uint32_t TableRowExtentAt(uint32_t aRow, uint32_t aCol);
void TableColumnDescription(uint32_t aCol, nsString& aDescription);
void TableRowDescription(uint32_t aRow, nsString& aDescription);
bool TableColumnSelected(uint32_t aCol);
bool TableRowSelected(uint32_t aRow);
bool TableCellSelected(uint32_t aRow, uint32_t aCol);
uint32_t TableSelectedCellCount();
uint32_t TableSelectedColumnCount();
uint32_t TableSelectedRowCount();
void TableSelectedCells(nsTArray<ProxyAccessible*>* aCellIDs);
void TableSelectedCellIndices(nsTArray<uint32_t>* aCellIndices);
void TableSelectedColumnIndices(nsTArray<uint32_t>* aColumnIndices);
void TableSelectedRowIndices(nsTArray<uint32_t>* aRowIndices);
void TableSelectColumn(uint32_t aCol);
void TableSelectRow(uint32_t aRow);
void TableUnselectColumn(uint32_t aCol);
void TableUnselectRow(uint32_t aRow);
bool TableIsProbablyForLayout();
ProxyAccessible* AtkTableColumnHeader(int32_t aCol);
ProxyAccessible* AtkTableRowHeader(int32_t aRow);

void SelectedItems(nsTArray<ProxyAccessible*>* aSelectedItems);
uint32_t SelectedItemCount();
ProxyAccessible* GetSelectedItem(uint32_t aIndex);
bool IsItemSelected(uint32_t aIndex);
bool AddItemToSelection(uint32_t aIndex);
bool RemoveItemFromSelection(uint32_t aIndex);
bool SelectAll();
bool UnselectAll();

void TakeSelection();
void SetSelected(bool aSelect);

bool DoAction(uint8_t aIndex);
uint8_t ActionCount();
void ActionDescriptionAt(uint8_t aIndex, nsString& aDescription);
void ActionNameAt(uint8_t aIndex, nsString& aName);
KeyBinding AccessKey();
KeyBinding KeyboardShortcut();
void AtkKeyBinding(nsString& aBinding);

double CurValue();
bool SetCurValue(double aValue);
double MinValue();
double MaxValue();
double Step();

void TakeFocus();
ProxyAccessible* FocusedChild();
ProxyAccessible* ChildAtPoint(int32_t aX, int32_t aY,
    Accessible::EWhichChildAtPoint aWhichChild);
nsIntRect Bounds();

void Language(nsString& aLocale);
void DocType(nsString& aType);
void Title(nsString& aTitle);
void URL(nsString& aURL);
void MimeType(nsString aMime);
void URLDocTypeMimeType(nsString& aURL, nsString& aDocType,
    nsString& aMimeType);

ProxyAccessible* AccessibleAtPoint(int32_t aX, int32_t aY,
    bool aNeedsScreenCoords);

void Extents(bool aNeedsScreenCoords, int32_t* aX, int32_t* aY,
    int32_t* aWidth, int32_t* aHeight);

/**
 * Return the id of the dom node this accessible represents.  Note this
 * should probably only be used for testing.
 */
void DOMNodeID(nsString& aID);

#endif
