From 91b58363c15426765c87613f2debfb589e5977cf Mon Sep 17 00:00:00 2001 From: Eitan Isaacson Date: Fri, 9 Mar 2012 20:52:13 -0500 Subject: [PATCH] Bug 729384 - Create an interface for virtual cursor changed events. r=surkov.alexander --- accessible/public/nsIAccessibleEvent.idl | 23 +++++++++++++++ accessible/src/base/AccEvent.cpp | 21 ++++++++++++++ accessible/src/base/AccEvent.h | 34 +++++++++++++++++++++- accessible/src/base/nsDocAccessible.cpp | 3 +- accessible/src/xpcom/nsAccEvent.cpp | 37 ++++++++++++++++++++++++ accessible/src/xpcom/nsAccEvent.h | 20 +++++++++++++ 6 files changed, 136 insertions(+), 2 deletions(-) diff --git a/accessible/public/nsIAccessibleEvent.idl b/accessible/public/nsIAccessibleEvent.idl index 853e659057e..41019646c73 100644 --- a/accessible/public/nsIAccessibleEvent.idl +++ b/accessible/public/nsIAccessibleEvent.idl @@ -571,3 +571,26 @@ interface nsIAccessibleTableChangeEvent: nsISupports readonly attribute long numRowsOrCols; }; + +/* + * An interface for virtual cursor changed events. + * Passes previous cursor position and text offsets. + */ +[scriptable, uuid(370e8b9b-2bbc-4bff-a9c7-16ddc54aea21)] +interface nsIAccessibleVirtualCursorChangeEvent : nsISupports +{ + /** + * Previous object pointed at by virtual cursor. null if none. + */ + readonly attribute nsIAccessible oldAccessible; + + /** + * Previous start offset of pivot. -1 if none. + */ + readonly attribute long oldStartOffset; + + /** + * Previous end offset of pivot. -1 if none. + */ + readonly attribute long oldEndOffset; +}; diff --git a/accessible/src/base/AccEvent.cpp b/accessible/src/base/AccEvent.cpp index bf2e812ebd5..942c5f1cebe 100644 --- a/accessible/src/base/AccEvent.cpp +++ b/accessible/src/base/AccEvent.cpp @@ -380,3 +380,24 @@ AccTableChangeEvent::CreateXPCOMObject() return event; } + +//////////////////////////////////////////////////////////////////////////////// +// AccVCChangeEvent +//////////////////////////////////////////////////////////////////////////////// + +AccVCChangeEvent:: + AccVCChangeEvent(nsAccessible* aAccessible, + nsIAccessible* aOldAccessible, + PRInt32 aOldStart, PRInt32 aOldEnd) : + AccEvent(::nsIAccessibleEvent::EVENT_VIRTUALCURSOR_CHANGED, aAccessible), + mOldAccessible(aOldAccessible), mOldStart(aOldStart), mOldEnd(aOldEnd) +{ +} + +already_AddRefed +AccVCChangeEvent::CreateXPCOMObject() +{ + nsAccEvent* event = new nsAccVirtualCursorChangeEvent(this); + NS_ADDREF(event); + return event; +} diff --git a/accessible/src/base/AccEvent.h b/accessible/src/base/AccEvent.h index 3dc39ee1d75..19cc2ed59be 100644 --- a/accessible/src/base/AccEvent.h +++ b/accessible/src/base/AccEvent.h @@ -129,7 +129,8 @@ public: eShowEvent, eCaretMoveEvent, eSelectionChangeEvent, - eTableChangeEvent + eTableChangeEvent, + eVirtualCursorChangeEvent }; static const EventGroup kEventGroup = eGenericEvent; @@ -399,6 +400,37 @@ private: PRUint32 mNumRowsOrCols; // the number of inserted/deleted rows/columns }; +/** + * Accessible virtual cursor change event. + */ +class AccVCChangeEvent : public AccEvent +{ +public: + AccVCChangeEvent(nsAccessible* aAccessible, + nsIAccessible* aOldAccessible, + PRInt32 aOldStart, PRInt32 aOldEnd); + + virtual ~AccVCChangeEvent() { } + + // AccEvent + virtual already_AddRefed CreateXPCOMObject(); + + static const EventGroup kEventGroup = eVirtualCursorChangeEvent; + virtual unsigned int GetEventGroups() const + { + return AccEvent::GetEventGroups() | (1U << eVirtualCursorChangeEvent); + } + + // AccTableChangeEvent + nsIAccessible* OldAccessible() const { return mOldAccessible; } + PRInt32 OldStartOffset() const { return mOldStart; } + PRInt32 OldEndOffset() const { return mOldEnd; } + +private: + nsRefPtr mOldAccessible; + PRInt32 mOldStart; + PRInt32 mOldEnd; +}; /** * Downcast the generic accessible event object to derived type. diff --git a/accessible/src/base/nsDocAccessible.cpp b/accessible/src/base/nsDocAccessible.cpp index 8eeb28aa06c..a958cd290bd 100644 --- a/accessible/src/base/nsDocAccessible.cpp +++ b/accessible/src/base/nsDocAccessible.cpp @@ -923,7 +923,8 @@ nsDocAccessible::OnPivotChanged(nsIAccessiblePivot* aPivot, nsIAccessible* aOldAccessible, PRInt32 aOldStart, PRInt32 aOldEnd) { - nsRefPtr event = new AccEvent(nsIAccessibleEvent::EVENT_VIRTUALCURSOR_CHANGED, this); + nsRefPtr event = new AccVCChangeEvent(this, aOldAccessible, + aOldStart, aOldEnd); nsEventShell::FireEvent(event); return NS_OK; diff --git a/accessible/src/xpcom/nsAccEvent.cpp b/accessible/src/xpcom/nsAccEvent.cpp index 8904cfe1075..8e5d69b15e2 100644 --- a/accessible/src/xpcom/nsAccEvent.cpp +++ b/accessible/src/xpcom/nsAccEvent.cpp @@ -253,3 +253,40 @@ nsAccTableChangeEvent::GetNumRowsOrCols(PRInt32* aNumRowsOrCols) return NS_OK; } +//////////////////////////////////////////////////////////////////////////////// +// nsAccVirtualCursorChangeEvent +//////////////////////////////////////////////////////////////////////////////// + +NS_IMPL_ISUPPORTS_INHERITED1(nsAccVirtualCursorChangeEvent, nsAccEvent, + nsIAccessibleVirtualCursorChangeEvent) + +NS_IMETHODIMP +nsAccVirtualCursorChangeEvent::GetOldAccessible(nsIAccessible** aOldAccessible) +{ + NS_ENSURE_ARG_POINTER(aOldAccessible); + + *aOldAccessible = + static_cast(mEvent.get())->OldAccessible(); + NS_IF_ADDREF(*aOldAccessible); + return NS_OK; +} + +NS_IMETHODIMP +nsAccVirtualCursorChangeEvent::GetOldStartOffset(PRInt32* aOldStartOffset) +{ + NS_ENSURE_ARG_POINTER(aOldStartOffset); + + *aOldStartOffset = + static_cast(mEvent.get())->OldStartOffset(); + return NS_OK; +} + +NS_IMETHODIMP +nsAccVirtualCursorChangeEvent::GetOldEndOffset(PRInt32* aOldEndOffset) +{ + NS_ENSURE_ARG_POINTER(aOldEndOffset); + + *aOldEndOffset = + static_cast(mEvent.get())->OldEndOffset(); + return NS_OK; +} diff --git a/accessible/src/xpcom/nsAccEvent.h b/accessible/src/xpcom/nsAccEvent.h index c014d87bf8d..5209c1e39c7 100644 --- a/accessible/src/xpcom/nsAccEvent.h +++ b/accessible/src/xpcom/nsAccEvent.h @@ -164,5 +164,25 @@ private: nsAccTableChangeEvent& operator =(const nsAccTableChangeEvent&); }; +/** + * Accessible virtual cursor change event. + */ +class nsAccVirtualCursorChangeEvent : public nsAccEvent, + public nsIAccessibleVirtualCursorChangeEvent +{ +public: + nsAccVirtualCursorChangeEvent(AccVCChangeEvent* aEvent) : + nsAccEvent(aEvent) { } + virtual ~nsAccVirtualCursorChangeEvent() { } + + NS_DECL_ISUPPORTS_INHERITED + NS_DECL_NSIACCESSIBLEVIRTUALCURSORCHANGEEVENT + +private: + nsAccVirtualCursorChangeEvent() MOZ_DELETE; + nsAccVirtualCursorChangeEvent(const nsAccVirtualCursorChangeEvent&) MOZ_DELETE; + nsAccVirtualCursorChangeEvent& operator =(const nsAccVirtualCursorChangeEvent&) MOZ_DELETE; +}; + #endif