2011-02-07 20:48:41 -08:00
|
|
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
2012-05-21 04:12:37 -07:00
|
|
|
/* 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/. */
|
2011-02-07 20:48:41 -08:00
|
|
|
|
|
|
|
#ifndef TextUpdater_h_
|
|
|
|
#define TextUpdater_h_
|
|
|
|
|
|
|
|
#include "AccEvent.h"
|
|
|
|
#include "nsHyperTextAccessible.h"
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Used to find a difference between old and new text and fire text change
|
|
|
|
* events.
|
|
|
|
*/
|
|
|
|
class TextUpdater
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
/**
|
|
|
|
* Start text of the text leaf update.
|
|
|
|
*/
|
2012-05-23 11:05:57 -07:00
|
|
|
static void Run(nsDocAccessible* aDocument,
|
|
|
|
mozilla::a11y::TextLeafAccessible* aTextLeaf,
|
2011-02-07 20:48:41 -08:00
|
|
|
const nsAString& aNewText);
|
|
|
|
|
|
|
|
private:
|
2012-05-23 11:05:57 -07:00
|
|
|
TextUpdater(nsDocAccessible* aDocument,
|
|
|
|
mozilla::a11y::TextLeafAccessible* aTextLeaf) :
|
2011-02-07 20:48:41 -08:00
|
|
|
mDocument(aDocument), mTextLeaf(aTextLeaf), mHyperText(nsnull),
|
|
|
|
mTextOffset(-1) { }
|
|
|
|
|
|
|
|
~TextUpdater()
|
|
|
|
{ mDocument = nsnull; mTextLeaf = nsnull; mHyperText = nsnull; }
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Update text of the text leaf accessible, fire text change and value change
|
|
|
|
* (if applicable) events for its container hypertext accessible.
|
|
|
|
*/
|
|
|
|
void DoUpdate(const nsAString& aNewText, const nsAString& aOldText,
|
|
|
|
PRUint32 aSkipStart);
|
|
|
|
|
|
|
|
private:
|
|
|
|
TextUpdater();
|
|
|
|
TextUpdater(const TextUpdater&);
|
|
|
|
TextUpdater& operator=(const TextUpdater&);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Fire text change events based on difference between strings.
|
|
|
|
*/
|
|
|
|
void ComputeTextChangeEvents(const nsAString& aStr1,
|
|
|
|
const nsAString& aStr2,
|
|
|
|
PRUint32* aEntries,
|
|
|
|
nsTArray<nsRefPtr<AccEvent> >& aEvents);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Helper to create text change events for inserted text.
|
|
|
|
*/
|
|
|
|
inline void FireInsertEvent(const nsAString& aText, PRUint32 aAddlOffset,
|
|
|
|
nsTArray<nsRefPtr<AccEvent> >& aEvents)
|
|
|
|
{
|
|
|
|
nsRefPtr<AccEvent> event =
|
|
|
|
new AccTextChangeEvent(mHyperText, mTextOffset + aAddlOffset,
|
2011-10-17 07:59:28 -07:00
|
|
|
aText, true);
|
2011-02-07 20:48:41 -08:00
|
|
|
aEvents.AppendElement(event);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Helper to create text change events for removed text.
|
|
|
|
*/
|
|
|
|
inline void FireDeleteEvent(const nsAString& aText, PRUint32 aAddlOffset,
|
|
|
|
nsTArray<nsRefPtr<AccEvent> >& aEvents)
|
|
|
|
{
|
|
|
|
nsRefPtr<AccEvent> event =
|
|
|
|
new AccTextChangeEvent(mHyperText, mTextOffset + aAddlOffset,
|
2011-10-17 07:59:28 -07:00
|
|
|
aText, false);
|
2011-02-07 20:48:41 -08:00
|
|
|
aEvents.AppendElement(event);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2011-08-03 20:57:08 -07:00
|
|
|
* The constant used to skip string difference calculation in case of long
|
|
|
|
* strings.
|
2011-02-07 20:48:41 -08:00
|
|
|
*/
|
2011-08-03 20:57:08 -07:00
|
|
|
const static PRUint32 kMaxStrLen = 1 << 6;
|
2011-02-07 20:48:41 -08:00
|
|
|
|
|
|
|
private:
|
|
|
|
nsDocAccessible* mDocument;
|
2012-05-23 11:05:57 -07:00
|
|
|
mozilla::a11y::TextLeafAccessible* mTextLeaf;
|
2011-02-07 20:48:41 -08:00
|
|
|
nsHyperTextAccessible* mHyperText;
|
|
|
|
PRInt32 mTextOffset;
|
|
|
|
};
|
|
|
|
|
|
|
|
#endif
|