diff options
author | Steve Yin <steve_y@apache.org> | 2013-11-14 08:18:05 +0000 |
---|---|---|
committer | Michael Meeks <michael.meeks@collabora.com> | 2013-11-19 10:02:22 +0000 |
commit | a18bdb3bc05e761704cc345a66a9d642bc4f4a0a (patch) | |
tree | 534b0f54f06d684e4496370f6fff38a15bfeb9ac /winaccessibility/source/UAccCOM/MAccessible.h | |
parent | f0d9beb80f926a05bc7dd87801c6daa7bc268cec (diff) |
Integrate branch of IAccessible2
Just the winaccessibility directory initially.
Change-Id: Ia21abb8d7088646ad6c1f83b3a03e7add716b0c0
Diffstat (limited to 'winaccessibility/source/UAccCOM/MAccessible.h')
-rw-r--r-- | winaccessibility/source/UAccCOM/MAccessible.h | 294 |
1 files changed, 294 insertions, 0 deletions
diff --git a/winaccessibility/source/UAccCOM/MAccessible.h b/winaccessibility/source/UAccCOM/MAccessible.h new file mode 100644 index 000000000000..5e298e257f6a --- /dev/null +++ b/winaccessibility/source/UAccCOM/MAccessible.h @@ -0,0 +1,294 @@ +/************************************************************** + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + *************************************************************/ + +#ifndef __MACCESSIBLE_H_ +#define __MACCESSIBLE_H_ + +#include <Windows.h> +#include "resource.h" // main symbols +#include <vector> +#include <map> +#include <com/sun/star/accessibility/XAccessible.hpp> +#include <com/sun/star/accessibility/XAccessibleSelection.hpp> +#include <com/sun/star/accessibility/XAccessibleAction.hpp> +#include <AccObjectManagerAgent.hxx> +#include "EnumVariant.h" +#ifndef __ACCCOMMON_H_ +#include "acccommon.h" +#endif +#ifndef _RTL_USTRING_HXX_ +#include <rtl/ustring.hxx> +#endif + +#define CHILDID_SELF 0 +#define OBJID_WINDOW ((LONG)0x00000000) +#define OBJID_SYSMENU ((LONG)0xFFFFFFFF) +#define OBJID_TITLEBAR ((LONG)0xFFFFFFFE) +#define OBJID_MENU ((LONG)0xFFFFFFFD) +#define OBJID_CLIENT ((LONG)0xFFFFFFFC) +#define OBJID_VSCROLL ((LONG)0xFFFFFFFB) +#define OBJID_HSCROLL ((LONG)0xFFFFFFFA) +#define OBJID_SIZEGRIP ((LONG)0xFFFFFFF9) +#define OBJID_CARET ((LONG)0xFFFFFFF8) +#define OBJID_CURSOR ((LONG)0xFFFFFFF7) +#define OBJID_ALERT ((LONG)0xFFFFFFF6) +#define OBJID_SOUND ((LONG)0xFFFFFFF5) +#define OBJID_QUERYCLASSNAMEIDX ((LONG)0xFFFFFFF4) +#define OBJID_NATIVEOM ((LONG)0xFFFFFFF0) + +using namespace rtl; +/** + *This class implements IMAccessible interface, which inherits from IAccessible2, and + *in turn inherits from IAccessible. So its methods include the methods defined only in + *IAccessible, plus the methods defined only in IAccessible2, plus the methods defined + *only in IMAccessible. + */ +class ATL_NO_VTABLE CMAccessible : + public CComObjectRoot, + public CComCoClass<CMAccessible, &CLSID_MAccessible>, + public IDispatchImpl<IMAccessible, &IID_IMAccessible, &LIBID_UACCCOMLib>, + public IServiceProvider, + public IAccessibleApplication +{ + typedef map< const GUID, CComPtr<IUnknown> ,ltComp > XGUIDToComObjHash; + + typedef HRESULT (WINAPI _UNO_AGGCREATORFUNC)(void*, REFIID, LPVOID*); + + struct _UNO_AGGMAP_ENTRY + { + const IID* piid; + _UNO_AGGCREATORFUNC* pfnCreateInstance; + int XIFIndex; + }; + + enum XInterfaceIndex { + XI_COMPONENT = 0x01, + XI_TEXT = 0x02, + XI_TABLE = 0x03, + XI_EDITABLETEXT = 0x04, + XI_IMAGE = 0x05, + XI_SELECTION = 0x06, + XI_EXTENDEDCOMP = 0x07, + XI_VALUE = 0x08, + XI_KEYBINDING = 0x09, + XI_ACTION = 0x0A, + XI_HYPERTEXT = 0x0B, + XI_HYPERLINK = 0x0C, + XI_ATTRIBUTE = 0x0D, + XI_NULL = -1 + }; + +public: + CMAccessible(); + virtual ~CMAccessible(); + DECLARE_REGISTRY_RESOURCEID(IDR_MACCESSIBLE) + + DECLARE_GET_CONTROLLING_UNKNOWN() + + DECLARE_PROTECT_FINAL_CONSTRUCT() + + BEGIN_COM_MAP(CMAccessible) + COM_INTERFACE_ENTRY(IMAccessible) + COM_INTERFACE_ENTRY(IAccessible) + COM_INTERFACE_ENTRY(IAccessible2) + COM_INTERFACE_ENTRY(IDispatch) + COM_INTERFACE_ENTRY(IAccessibleApplication) + COM_INTERFACE_ENTRY(IServiceProvider) + COM_INTERFACE_ENTRY_FUNC_BLIND(NULL,_SmartQI) + END_COM_MAP() + + // AGGREGATE OBJECT MAP + BEGIN_AGGOBJECT_MAP(CMAccessible) + AGGOBJECT_ENTRY(IID_IAccessibleComponent, CLSID_AccComponent, COMPONENT) + AGGOBJECT_ENTRY(IID_IAccessibleText, CLSID_AccText, TEXT) + AGGOBJECT_ENTRY(IID_IAccessibleEditableText, CLSID_AccEditableText, EDITABLETEXT) + AGGOBJECT_ENTRY(IID_IAccessibleImage, CLSID_AccImage, IMAGE) + AGGOBJECT_ENTRY(IID_IAccessibleTable, CLSID_AccTable, TABLE) + AGGOBJECT_ENTRY(IID_IAccessibleAction, CLSID_AccAction, ACTION) + AGGOBJECT_ENTRY(IID_IAccessibleValue, CLSID_AccValue, VALUE) + AGGOBJECT_ENTRY(IID_IAccessibleHypertext, CLSID_AccHypertext, HYPERTEXT) + AGGOBJECT_ENTRY(IID_IAccessibleHyperlink, CLSID_AccHyperLink, HYPERLINK) + + + END_AGGOBJECT_MAP() + + // IMAccessible + STDMETHOD(put_accValue)(VARIANT varChild,BSTR szValue); + STDMETHOD(put_accName)(VARIANT varChild,BSTR szName); + STDMETHOD(accDoDefaultAction)(VARIANT varChild); + STDMETHOD(accHitTest)(long xLeft,long yTop,VARIANT *pvarChild); + STDMETHOD(accNavigate)(long navDir,VARIANT varStart,VARIANT *pvarEndUpAt); + STDMETHOD(accLocation)(long *pxLeft,long *pyTop,long *pcxWidth,long *pcyHeight,VARIANT varChild); + STDMETHOD(accSelect)(long flagsSelect,VARIANT varChild); + STDMETHOD(get_accDefaultAction)( VARIANT varChild,BSTR *pszDefaultAction); + STDMETHOD(get_accSelection)(VARIANT *pvarChildren); + STDMETHOD(get_accFocus)(VARIANT *pvarChild); + STDMETHOD(get_accKeyboardShortcut)( VARIANT varChild,BSTR *pszKeyboardShortcut); + STDMETHOD(get_accHelpTopic)(BSTR *pszHelpFile,VARIANT varChild,long *pidTopic); + STDMETHOD(get_accHelp)(VARIANT varChild,BSTR *pszHelp); + STDMETHOD(get_accState)(VARIANT varChild,VARIANT *pvarState); + STDMETHOD(get_accRole)(VARIANT varChild,VARIANT *pvarRole); + STDMETHOD(get_accDescription)(VARIANT varChild,BSTR *pszDescription); + STDMETHOD(get_accValue)( VARIANT varChild,BSTR *pszValue); + STDMETHOD(get_accName)(VARIANT varChild,BSTR *pszName); + STDMETHOD(get_accChild)(VARIANT varChild,IDispatch **ppdispChild); + STDMETHOD(get_accChildCount)(long *pcountChildren); + STDMETHOD(get_accParent)( IDispatch **ppdispParent); + + // methods which are defined only in the IAccessible2 + // These methods only declare here, and their implementation bodies are empty now. + STDMETHOD(get_nRelations)( long __RPC_FAR *nRelations) ; + STDMETHOD(get_relation)( long relationIndex, IAccessibleRelation __RPC_FAR *__RPC_FAR *relation) ; + STDMETHOD(get_relations)( long maxRelations, IAccessibleRelation __RPC_FAR *__RPC_FAR *relation, long __RPC_FAR *nRelations) ; + STDMETHOD(role)(long __RPC_FAR *role); + STDMETHOD(get_nActions)(long __RPC_FAR *nActions); + STDMETHOD(scrollTo)(enum IA2ScrollType scrollType); + STDMETHOD(scrollToPoint)(enum IA2CoordinateType coordinateType, long x, long y); + STDMETHOD(get_groupPosition)(long __RPC_FAR *groupLevel,long __RPC_FAR *similarItemsInGroup,long __RPC_FAR *positionInGroup); + STDMETHOD(get_states)( AccessibleStates __RPC_FAR *states ); + STDMETHOD(get_extendedRole)( BSTR __RPC_FAR *extendedRole ); + STDMETHOD(get_localizedExtendedRole)( BSTR __RPC_FAR *localizedExtendedRole ); + STDMETHOD(get_nExtendedStates)( long __RPC_FAR *nExtendedStates); + STDMETHOD(get_extendedStates)( long maxExtendedStates, BSTR __RPC_FAR *__RPC_FAR *extendedStates, long __RPC_FAR *nExtendedStates); + STDMETHOD(get_localizedExtendedStates)(long maxLocalizedExtendedStates,BSTR __RPC_FAR *__RPC_FAR *localizedExtendedStates,long __RPC_FAR *nLocalizedExtendedStates); + STDMETHOD(get_uniqueID)(long __RPC_FAR *uniqueID); + STDMETHOD(get_windowHandle)(HWND __RPC_FAR *windowHandle); + STDMETHOD(get_indexInParent)( long __RPC_FAR *accParentIndex ); + STDMETHOD(get_locale)( IA2Locale __RPC_FAR *locale ); + STDMETHOD(get_attributes)(/*[out]*/ BSTR *pAttr); + + //IServiceProvider. + STDMETHOD(QueryService)(REFGUID guidService, REFIID riid, void** ppvObject); + + //IAccessibleApplication + STDMETHOD(get_appName)(BSTR __RPC_FAR *name); + STDMETHOD(get_appVersion)(BSTR __RPC_FAR *version); + STDMETHOD(get_toolkitName)(BSTR __RPC_FAR *name); + STDMETHOD(get_toolkitVersion)(BSTR __RPC_FAR *version); + + // methods which are defined only in IMAccessible + // These methods are provided for UNO management system. + // The UNO management system use these methods to put Accessibility + // information to COM. + STDMETHOD(Put_XAccName)(const OLECHAR __RPC_FAR *pszName); + STDMETHOD(Put_XAccRole)(unsigned short pRole); + STDMETHOD(DecreaseState)(DWORD pXSate); + STDMETHOD(IncreaseState)(DWORD pXSate); + STDMETHOD(SetState)(DWORD pXSate); + STDMETHOD(Put_XAccDescription)(const OLECHAR __RPC_FAR *pszDescription); + STDMETHOD(Put_XAccValue)(const OLECHAR __RPC_FAR *pszAccValue); + STDMETHOD(Put_XAccLocation)(const Location sLocation); + STDMETHOD(Put_XAccFocus)(long dChildID); + STDMETHOD(Put_XAccParent)(IMAccessible __RPC_FAR *pIParent); + STDMETHOD(Put_XAccWindowHandle)(HWND hwnd); + STDMETHOD(Put_XAccChildID)(long dChildID); + STDMETHOD(Put_XAccAgent)(long pAgent); + STDMETHOD(NotifyDestroy)(BOOL isDestroy); + STDMETHOD(Put_ActionDescription)( const OLECHAR* szAction); + STDMETHOD(SetDefaultAction)(long pAction); + STDMETHOD(GetUNOInterface)(long*); + STDMETHOD(SetXAccessible)(long); + +private: + OLECHAR* m_pszName; + OLECHAR* m_pszValue; + OLECHAR* m_pszActionDescription; + unsigned short m_iRole; + DWORD m_dState; + OLECHAR* m_pszDescription; + IMAccessible* m_pIParent; + Location m_sLocation; + + // identify a COM object/Acc object uniquely + long m_dChildID; + // specify the focus child ID in object self and its direct children + + long m_dFocusChildID; + // parent window handle,will be used in the future application, its value comes from UNO + + HWND m_hwnd; + + // the COM class which implements IEnumVARIANT interface,currently only used in + // the implementation of get_accSelection + CEnumVariant* m_pEnumVar; + + // specify if the XAccessible is invalid + BOOL m_isDestroy; + + XAccessible* pUNOInterface; + Reference< XAccessible > pRef; + XAccessible* pAchorUNOInterface; + XAccessibleAction* m_pXAction; + XAccessibleContext* pRContextInterface; + Reference<XAccessibleContext> pRContext; + +private: + + // the helper methods in order to implement the above public methods + IMAccessible* GetChildInterface(long dChildIndex);//notice here the parameter is child index,not child id + IMAccessible* GetNavigateChildForDM(VARIANT varCur,short flags);//for decendant manage + HRESULT GetFirstChild(VARIANT varStart,VARIANT* pvarEndUpAt);//for accNavigate implementation + HRESULT GetLastChild(VARIANT varStart,VARIANT* pvarEndUpAt);//for accNavigate implementation + HRESULT GetNextSibling(VARIANT varStart,VARIANT* pvarEndUpAt);//for accNavigate implementation + HRESULT GetPreSibling(VARIANT varStart,VARIANT* pvarEndUpAt);//for accNavigate implementation + BOOL IsDecendantManage();//identify whether the current COM belongs to manage_decendant roles + + // the following private methods are used to implement accSelect method + HRESULT SelectChild(XAccessible* pItem); + HRESULT DeSelectChild(XAccessible* pItem); + HRESULT SelectMutipleChidren( XAccessible** pItem,int size ); + HRESULT DeSelectMutipleChildren( XAccessible** pItem,int size ); + XAccessibleContext* GetContextByXAcc( XAccessible* pXAcc ); + Reference< XAccessibleSelection > GetSelection(); + // end accSelect implementation methods + BOOL GetXInterfaceFromXAccessible(XAccessible*, XInterface**, int); + HRESULT WINAPI SmartQI(void* pv, REFIID iid, void** ppvObject); + +public: + STDMETHOD(Get_XAccChildID)(/*[out,retval]*/ long* childID); + // AccObjectManagerAgent is a management object in UNO, here keep its pointer for + // the implementation of accNavigate when decendant manage happens for List,Tree, or Table + // AccObjectManagerAgent and the following UNO objects XAccessble,XAccessibleSelection, + // XAccessibleAction are all used to operate UNO accessiblility information directly when + // implement some specific MSAA methods,such as accSelection,accNavigate + static AccObjectManagerAgent* g_pAgent; + + static BOOL get_IAccessibleFromXAccessible(long pXAcc,IAccessible** ppIA); + BOOL m_bRequiresSave; + XGUIDToComObjHash m_containedObjects; + + static HRESULT WINAPI _SmartQI(void* pv, + REFIID iid, void** ppvObject, DWORD) + { + return ((CMAccessible*)pv)->SmartQI(pv,iid,ppvObject); + } + + static void get_OLECHARFromAny(Any& pAny, OLECHAR* pChar); + + static void get_OLECHAR4Numbering(const Any& pAny, short numberingLevel, const OUString& numberingPrefix,OLECHAR* pChar); + + // Helper function for data conversion. + static void ConvertAnyToVariant(const ::com::sun::star::uno::Any &rAnyVal, VARIANT *pvData); +}; + + + +#endif //__MACCESSIBLE_H_ |