Kaydet (Commit) ef3f28d0 authored tarafından Michael Stahl's avatar Michael Stahl

winaccessibility: use rtl::Reference for listener lifecycle

The manual acquire() call was apparently not coupled with a release()?

Change-Id: I069c969619e9afce2a4b836642cc1675025b11d0
üst 576ba8ce
...@@ -25,6 +25,8 @@ ...@@ -25,6 +25,8 @@
#include <oleacc.h> #include <oleacc.h>
#include <windows.h> #include <windows.h>
#include <rtl/ref.hxx>
#include <com/sun/star/accessibility/XAccessible.hpp> #include <com/sun/star/accessibility/XAccessible.hpp>
#include <com/sun/star/accessibility/XAccessibleSelection.hpp> #include <com/sun/star/accessibility/XAccessibleSelection.hpp>
#include <com/sun/star/accessibility/XAccessibleAction.hpp> #include <com/sun/star/accessibility/XAccessibleAction.hpp>
...@@ -51,7 +53,7 @@ private: ...@@ -51,7 +53,7 @@ private:
IMAccessible* m_pIMAcc; IMAccessible* m_pIMAcc;
AccObject* m_pParentObj; AccObject* m_pParentObj;
IAccChildList m_childrenList; IAccChildList m_childrenList;
AccEventListener* m_accListener; ::rtl::Reference<AccEventListener> m_pListener;
IAccSelectionList m_selectionList; IAccSelectionList m_selectionList;
::com::sun::star::uno::Reference < ::com::sun::star::accessibility::XAccessible > m_xAccRef; ::com::sun::star::uno::Reference < ::com::sun::star::accessibility::XAccessible > m_xAccRef;
...@@ -86,7 +88,7 @@ public: ...@@ -86,7 +88,7 @@ public:
void SetParentHWND(HWND hWnd);//need to set top window handle when send event to AT void SetParentHWND(HWND hWnd);//need to set top window handle when send event to AT
HWND GetParentHWND(); HWND GetParentHWND();
void SetListener( AccEventListener* Listener ); void SetListener(::rtl::Reference<AccEventListener> const& pListener);
AccEventListener* getListener(); AccEventListener* getListener();
void SetParentObj(AccObject* pParentAccObj); void SetParentObj(AccObject* pParentAccObj);
......
...@@ -26,7 +26,7 @@ ...@@ -26,7 +26,7 @@
#include <map> #include <map>
#include <windows.h> #include <windows.h>
#include <osl/mutex.hxx> #include <osl/mutex.hxx>
#include <vcl/dllapi.h> #include <rtl/ref.hxx>
#include "ResIDGenerator.hxx" #include "ResIDGenerator.hxx"
#include "UAccCOM.h" #include "UAccCOM.h"
...@@ -90,7 +90,8 @@ private: ...@@ -90,7 +90,8 @@ private:
void DeleteFromHwndXAcc(com::sun::star::accessibility::XAccessible* pXAcc ); void DeleteFromHwndXAcc(com::sun::star::accessibility::XAccessible* pXAcc );
int UpdateAccSelection(com::sun::star::accessibility::XAccessible* pXAcc); int UpdateAccSelection(com::sun::star::accessibility::XAccessible* pXAcc);
AccEventListener* createAccEventListener(com::sun::star::accessibility::XAccessible* pXAcc, AccObjectManagerAgent* Agent); ::rtl::Reference<AccEventListener> CreateAccEventListener(
com::sun::star::accessibility::XAccessible* pXAcc);
public: public:
virtual ~AccObjectWinManager(); virtual ~AccObjectWinManager();
sal_Bool InsertAccObj( com::sun::star::accessibility::XAccessible* pXAcc,com::sun::star::accessibility::XAccessible* pParentXAcc,HWND pWnd); sal_Bool InsertAccObj( com::sun::star::accessibility::XAccessible* pXAcc,com::sun::star::accessibility::XAccessible* pParentXAcc,HWND pWnd);
......
...@@ -144,12 +144,12 @@ const short ROLE_TABLE[][2] = ...@@ -144,12 +144,12 @@ const short ROLE_TABLE[][2] =
* @return. * @return.
*/ */
AccObject::AccObject(XAccessible* pAcc, AccObjectManagerAgent* pAgent, AccObject::AccObject(XAccessible* pAcc, AccObjectManagerAgent* pAgent,
AccEventListener* listener) : AccEventListener* pListener) :
m_pIMAcc (NULL), m_pIMAcc (NULL),
m_resID (NULL), m_resID (NULL),
m_pParantID (NULL), m_pParantID (NULL),
m_pParentObj(NULL), m_pParentObj(NULL),
m_accListener (listener), m_pListener (pListener),
m_bShouldDestroy(sal_False), m_bShouldDestroy(sal_False),
m_xAccRef( pAcc ) m_xAccRef( pAcc )
{ {
...@@ -1161,13 +1161,15 @@ void AccObject::SetParentHWND(HWND hWnd) ...@@ -1161,13 +1161,15 @@ void AccObject::SetParentHWND(HWND hWnd)
{ {
m_pParantID = hWnd; m_pParantID = hWnd;
} }
void AccObject::SetListener( AccEventListener* Listener )
void AccObject::SetListener(rtl::Reference<AccEventListener> const& pListener)
{ {
m_accListener = Listener; m_pListener = pListener;
} }
AccEventListener* AccObject::getListener() AccEventListener* AccObject::getListener()
{ {
return m_accListener; return m_pListener.get();
} }
long AccObject::GetResID() long AccObject::GetResID()
......
...@@ -776,24 +776,16 @@ sal_Bool AccObjectWinManager::InsertAccObj( XAccessible* pXAcc,XAccessible* pPar ...@@ -776,24 +776,16 @@ sal_Bool AccObjectWinManager::InsertAccObj( XAccessible* pXAcc,XAccessible* pPar
} }
//end of file name //end of file name
AccEventListener* listener = createAccEventListener(pXAcc, pAgent); ::rtl::Reference<AccEventListener> const pListener =
if(listener==NULL) CreateAccEventListener(pXAcc);
if (!pListener.is())
return sal_False; return sal_False;
Reference<XAccessibleComponent> xComponent(pRContext,UNO_QUERY); Reference<XAccessibleComponent> xComponent(pRContext,UNO_QUERY);
Reference<XAccessibleEventBroadcaster> broadcaster(xComponent,UNO_QUERY); Reference<XAccessibleEventBroadcaster> broadcaster(xComponent,UNO_QUERY);
if (broadcaster.is()) if (broadcaster.is())
{ {
Reference <XAccessibleEventListener> pp ( Reference<XAccessibleEventListener> const xListener(pListener.get());
static_cast< XAccessibleEventListener* >(listener),UNO_QUERY ); broadcaster->addAccessibleEventListener(xListener);
if(pp.is())
{
broadcaster->addAccessibleEventListener(pp);
}
else
{
delete listener;
return sal_False;
}
} }
else else
return sal_False; return sal_False;
...@@ -805,9 +797,7 @@ sal_Bool AccObjectWinManager::InsertAccObj( XAccessible* pXAcc,XAccessible* pPar ...@@ -805,9 +797,7 @@ sal_Bool AccObjectWinManager::InsertAccObj( XAccessible* pXAcc,XAccessible* pPar
AccObject* pCurObj = GetAccObjByXAcc(pXAcc); AccObject* pCurObj = GetAccObjByXAcc(pXAcc);
if( pCurObj ) if( pCurObj )
{ {
pCurObj->SetListener( listener ); pCurObj->SetListener(pListener);
if(listener != NULL)
listener->acquire();
} }
AccObject* pParentObj = GetAccObjByXAcc(pParentXAcc); AccObject* pParentObj = GetAccObjByXAcc(pParentXAcc);
...@@ -830,32 +820,29 @@ void AccObjectWinManager::SaveTopWindowHandle(HWND hWnd, com::sun::star::accessi ...@@ -830,32 +820,29 @@ void AccObjectWinManager::SaveTopWindowHandle(HWND hWnd, com::sun::star::accessi
} }
/** /** Create the corresponding listener.
* create the corresponding listener. * @param pXAcc XAccessible interface.
* @param pXAcc XAccessible interface. */
* @param Agent The agent kept in all listeners,it's the sole interface by which ::rtl::Reference<AccEventListener>
* listener communicate with windows manager. AccObjectWinManager::CreateAccEventListener(XAccessible* pXAcc)
* @return
*/
AccEventListener* AccObjectWinManager::createAccEventListener(XAccessible* pXAcc, AccObjectManagerAgent* /* Agent */ )
{ {
AccEventListener* listener = NULL; ::rtl::Reference<AccEventListener> pRet;
Reference<XAccessibleContext> xContext(pXAcc->getAccessibleContext(),UNO_QUERY); Reference<XAccessibleContext> xContext(pXAcc->getAccessibleContext(),UNO_QUERY);
if(xContext.is()) if(xContext.is())
{ {
switch( xContext->getAccessibleRole() ) switch( xContext->getAccessibleRole() )
{ {
case /*AccessibleRole::*/DIALOG: case /*AccessibleRole::*/DIALOG:
listener = new AccDialogEventListener(pXAcc,pAgent); pRet = new AccDialogEventListener(pXAcc,pAgent);
break; break;
case /*AccessibleRole::*/FRAME: case /*AccessibleRole::*/FRAME:
listener = new AccFrameEventListener(pXAcc,pAgent); pRet = new AccFrameEventListener(pXAcc,pAgent);
break; break;
case /*AccessibleRole::*/WINDOW: case /*AccessibleRole::*/WINDOW:
listener = new AccWindowEventListener(pXAcc,pAgent); pRet = new AccWindowEventListener(pXAcc,pAgent);
break; break;
case /*AccessibleRole::*/ROOT_PANE: case /*AccessibleRole::*/ROOT_PANE:
listener = new AccFrameEventListener(pXAcc,pAgent); pRet = new AccFrameEventListener(pXAcc,pAgent);
break; break;
//Container //Container
case /*AccessibleRole::*/CANVAS: case /*AccessibleRole::*/CANVAS:
...@@ -879,11 +866,11 @@ AccEventListener* AccObjectWinManager::createAccEventListener(XAccessible* pXAcc ...@@ -879,11 +866,11 @@ AccEventListener* AccObjectWinManager::createAccEventListener(XAccessible* pXAcc
case /*AccessibleRole::*/TABLE_CELL: case /*AccessibleRole::*/TABLE_CELL:
case /*AccessibleRole::*/TOOL_BAR: case /*AccessibleRole::*/TOOL_BAR:
case /*AccessibleRole::*/VIEW_PORT: case /*AccessibleRole::*/VIEW_PORT:
listener = new AccContainerEventListener(pXAcc,pAgent); pRet = new AccContainerEventListener(pXAcc,pAgent);
break; break;
case /*AccessibleRole::*/PARAGRAPH: case /*AccessibleRole::*/PARAGRAPH:
case /*AccessibleRole::*/HEADING: case /*AccessibleRole::*/HEADING:
listener = new AccParagraphEventListener(pXAcc,pAgent); pRet = new AccParagraphEventListener(pXAcc,pAgent);
break; break;
//Component //Component
case /*AccessibleRole::*/CHECK_BOX: case /*AccessibleRole::*/CHECK_BOX:
...@@ -901,15 +888,15 @@ AccEventListener* AccObjectWinManager::createAccEventListener(XAccessible* pXAcc ...@@ -901,15 +888,15 @@ AccEventListener* AccObjectWinManager::createAccEventListener(XAccessible* pXAcc
case /*AccessibleRole::*/TOOL_TIP: case /*AccessibleRole::*/TOOL_TIP:
case /*AccessibleRole::*/SPIN_BOX: case /*AccessibleRole::*/SPIN_BOX:
case DATE_EDITOR: case DATE_EDITOR:
listener = new AccComponentEventListener(pXAcc,pAgent); pRet = new AccComponentEventListener(pXAcc,pAgent);
break; break;
//text component //text component
case /*AccessibleRole::*/TEXT: case /*AccessibleRole::*/TEXT:
listener = new AccTextComponentEventListener(pXAcc,pAgent); pRet = new AccTextComponentEventListener(pXAcc,pAgent);
break; break;
//menu //menu
case /*AccessibleRole::*/MENU: case /*AccessibleRole::*/MENU:
listener = new AccMenuEventListener(pXAcc,pAgent); pRet = new AccMenuEventListener(pXAcc,pAgent);
break; break;
//object container //object container
case /*AccessibleRole::*/SHAPE: case /*AccessibleRole::*/SHAPE:
...@@ -917,27 +904,26 @@ AccEventListener* AccObjectWinManager::createAccEventListener(XAccessible* pXAcc ...@@ -917,27 +904,26 @@ AccEventListener* AccObjectWinManager::createAccEventListener(XAccessible* pXAcc
case /*AccessibleRole::*/EMBEDDED_OBJECT: case /*AccessibleRole::*/EMBEDDED_OBJECT:
case /*AccessibleRole::*/GRAPHIC: case /*AccessibleRole::*/GRAPHIC:
case /*AccessibleRole::*/TEXT_FRAME: case /*AccessibleRole::*/TEXT_FRAME:
listener = new AccObjectContainerEventListener(pXAcc,pAgent); pRet = new AccObjectContainerEventListener(pXAcc,pAgent);
break; break;
//descendmanager //descendmanager
case /*AccessibleRole::*/LIST: case /*AccessibleRole::*/LIST:
listener = new AccListEventListener(pXAcc,pAgent); pRet = new AccListEventListener(pXAcc,pAgent);
break; break;
case /*AccessibleRole::*/TREE: case /*AccessibleRole::*/TREE:
listener = new AccTreeEventListener(pXAcc,pAgent); pRet = new AccTreeEventListener(pXAcc,pAgent);
break; break;
//special //special
case /*AccessibleRole::*/COLUMN_HEADER: case /*AccessibleRole::*/COLUMN_HEADER:
case /*AccessibleRole::*/TABLE: case /*AccessibleRole::*/TABLE:
listener = new AccTableEventListener(pXAcc,pAgent); pRet = new AccTableEventListener(pXAcc,pAgent);
break; break;
default: default:
listener = new AccContainerEventListener(pXAcc,pAgent); pRet = new AccContainerEventListener(pXAcc,pAgent);
break; break;
} }
} }
return pRet;
return listener;
} }
/** /**
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment