text: /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
  /* vim:expandtab:shiftwidth=2:tabstop=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/. */
  
  #include "ia2AccessibleEditableText.h"
  
  #include "AccessibleEditableText_i.c"
  #include "HyperTextAccessibleWrap.h"
  
  #include "nsCOMPtr.h"
  #include "nsString.h"
  
  // IAccessibleEditableText
  
  STDMETHODIMP
  ia2AccessibleEditableText::copyText(long aStartOffset, long aEndOffset)
  {
  __try {
    HyperTextAccessible* textAcc = static_cast<HyperTextAccessibleWrap*>(this);
    if (textAcc->IsDefunct())
      return CO_E_OBJNOTCONNECTED;
  
    nsresult rv = textAcc->CopyText(aStartOffset, aEndOffset);
    return GetHRESULT(rv);
  
  } __except(nsAccessNodeWrap::FilterA11yExceptions(::GetExceptionCode(), GetExceptionInformation())) { }
    return E_FAIL;
  }
  
  STDMETHODIMP
  ia2AccessibleEditableText::deleteText(long aStartOffset, long aEndOffset)
  {
  __try {
    HyperTextAccessible* textAcc = static_cast<HyperTextAccessibleWrap*>(this);
    if (textAcc->IsDefunct())
      return CO_E_OBJNOTCONNECTED;
  
    nsresult rv = textAcc->DeleteText(aStartOffset, aEndOffset);
    return GetHRESULT(rv);
  
  } __except(nsAccessNodeWrap::FilterA11yExceptions(::GetExceptionCode(), GetExceptionInformation())) { }
    return E_FAIL;
  }
  
  STDMETHODIMP
  ia2AccessibleEditableText::insertText(long aOffset, BSTR *aText)
  {
  __try {
    HyperTextAccessible* textAcc = static_cast<HyperTextAccessibleWrap*>(this);
    if (textAcc->IsDefunct())
      return CO_E_OBJNOTCONNECTED;
  
    uint32_t length = ::SysStringLen(*aText);
    nsAutoString text(*aText, length);
  
    nsresult rv = textAcc->InsertText(text, aOffset);
    return GetHRESULT(rv);
  
  } __except(nsAccessNodeWrap::FilterA11yExceptions(::GetExceptionCode(), GetExceptionInformation())) { }
    return E_FAIL;
  }
  
  STDMETHODIMP
  ia2AccessibleEditableText::cutText(long aStartOffset, long aEndOffset)
  {
  __try {
    HyperTextAccessible* textAcc = static_cast<HyperTextAccessibleWrap*>(this);
    if (textAcc->IsDefunct())
      return CO_E_OBJNOTCONNECTED;
  
    nsresult rv = textAcc->CutText(aStartOffset, aEndOffset);
    return GetHRESULT(rv);
  
  } __except(nsAccessNodeWrap::FilterA11yExceptions(::GetExceptionCode(), GetExceptionInformation())) { }
    return E_FAIL;
  }
  
  STDMETHODIMP
  ia2AccessibleEditableText::pasteText(long aOffset)
  {
  __try {
    HyperTextAccessible* textAcc = static_cast<HyperTextAccessibleWrap*>(this);
    if (textAcc->IsDefunct())
      return CO_E_OBJNOTCONNECTED;
  
    nsresult rv = textAcc->PasteText(aOffset);
    return GetHRESULT(rv);
  
  } __except(nsAccessNodeWrap::FilterA11yExceptions(::GetExceptionCode(), GetExceptionInformation())) { }
    return E_FAIL;
  }
  
  STDMETHODIMP
  ia2AccessibleEditableText::replaceText(long aStartOffset, long aEndOffset,
                                         BSTR *aText)
  {
  __try {
    HyperTextAccessible* textAcc = static_cast<HyperTextAccessibleWrap*>(this);
    if (textAcc->IsDefunct())
      return CO_E_OBJNOTCONNECTED;
  
    nsresult rv = textAcc->DeleteText(aStartOffset, aEndOffset);
    if (NS_FAILED(rv))
      return GetHRESULT(rv);
  
    uint32_t length = ::SysStringLen(*aText);
    nsAutoString text(*aText, length);
  
    rv = textAcc->InsertText(text, aStartOffset);
    return GetHRESULT(rv);
  
  } __except(nsAccessNodeWrap::FilterA11yExceptions(::GetExceptionCode(), GetExceptionInformation())) { }
    return E_FAIL;
  }
  
  STDMETHODIMP
  ia2AccessibleEditableText::setAttributes(long aStartOffset, long aEndOffset,
                                           BSTR *aAttributes)
  {
  __try {
  
  } __except(nsAccessNodeWrap::FilterA11yExceptions(::GetExceptionCode(), GetExceptionInformation())) { }
    return E_NOTIMPL;
  }
  