xref: /AOO41X/main/winaccessibility/source/UAccCOM/AccRelation.cpp (revision 5fdc4257b5e43545f8f7841d9e8303d3a99b1714)
1*5fdc4257SSteve Yin /*************************************************************************
2*5fdc4257SSteve Yin  *
3*5fdc4257SSteve Yin  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*5fdc4257SSteve Yin  *
5*5fdc4257SSteve Yin  * Copyright IBM Corporation 2010.
6*5fdc4257SSteve Yin  * Copyright 2000, 2010 Oracle and/or its affiliates.
7*5fdc4257SSteve Yin  *
8*5fdc4257SSteve Yin  * OpenOffice.org - a multi-platform office productivity suite
9*5fdc4257SSteve Yin  *
10*5fdc4257SSteve Yin  * This file is part of OpenOffice.org.
11*5fdc4257SSteve Yin  *
12*5fdc4257SSteve Yin  * OpenOffice.org is free software: you can redistribute it and/or modify
13*5fdc4257SSteve Yin  * it under the terms of the GNU Lesser General Public License version 3
14*5fdc4257SSteve Yin  * only, as published by the Free Software Foundation.
15*5fdc4257SSteve Yin  *
16*5fdc4257SSteve Yin  * OpenOffice.org is distributed in the hope that it will be useful,
17*5fdc4257SSteve Yin  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18*5fdc4257SSteve Yin  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19*5fdc4257SSteve Yin  * GNU Lesser General Public License version 3 for more details
20*5fdc4257SSteve Yin  * (a copy is included in the LICENSE file that accompanied this code).
21*5fdc4257SSteve Yin  *
22*5fdc4257SSteve Yin  * You should have received a copy of the GNU Lesser General Public License
23*5fdc4257SSteve Yin  * version 3 along with OpenOffice.org.  If not, see
24*5fdc4257SSteve Yin  * <http://www.openoffice.org/license.html>
25*5fdc4257SSteve Yin  * for a copy of the LGPLv3 License.
26*5fdc4257SSteve Yin  *
27*5fdc4257SSteve Yin  ************************************************************************/
28*5fdc4257SSteve Yin 
29*5fdc4257SSteve Yin #include "stdafx.h"
30*5fdc4257SSteve Yin #include "UAccCOM2.h"
31*5fdc4257SSteve Yin #include "AccRelation.h"
32*5fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessible.hpp>
33*5fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessibleContext.hpp>
34*5fdc4257SSteve Yin #include "MAccessible.h"
35*5fdc4257SSteve Yin 
36*5fdc4257SSteve Yin using namespace com::sun::star::accessibility;
37*5fdc4257SSteve Yin using namespace com::sun::star::uno;
38*5fdc4257SSteve Yin 
39*5fdc4257SSteve Yin /**
40*5fdc4257SSteve Yin    * Get relation type.
41*5fdc4257SSteve Yin    * @param relationType Variant to get relation type.
42*5fdc4257SSteve Yin    * @return Result.
43*5fdc4257SSteve Yin */
44*5fdc4257SSteve Yin STDMETHODIMP CAccRelation::get_relationType(BSTR * relationType)
45*5fdc4257SSteve Yin {
46*5fdc4257SSteve Yin 
47*5fdc4257SSteve Yin 	CHECK_ENABLE_INF
48*5fdc4257SSteve Yin 
49*5fdc4257SSteve Yin     ENTER_PROTECTED_BLOCK
50*5fdc4257SSteve Yin 
51*5fdc4257SSteve Yin     if (relationType == NULL)
52*5fdc4257SSteve Yin         return E_INVALIDARG;
53*5fdc4257SSteve Yin 
54*5fdc4257SSteve Yin     int type = relation.RelationType;
55*5fdc4257SSteve Yin     SAFE_SYSFREESTRING(*relationType);
56*5fdc4257SSteve Yin 
57*5fdc4257SSteve Yin     *relationType = getRelationTypeBSTR(type);
58*5fdc4257SSteve Yin     return S_OK;
59*5fdc4257SSteve Yin 
60*5fdc4257SSteve Yin     LEAVE_PROTECTED_BLOCK
61*5fdc4257SSteve Yin }
62*5fdc4257SSteve Yin 
63*5fdc4257SSteve Yin // Gets what the type of localized relation is.
64*5fdc4257SSteve Yin STDMETHODIMP CAccRelation::get_localizedRelationType(BSTR *)
65*5fdc4257SSteve Yin {
66*5fdc4257SSteve Yin 
67*5fdc4257SSteve Yin 
68*5fdc4257SSteve Yin     ENTER_PROTECTED_BLOCK
69*5fdc4257SSteve Yin 
70*5fdc4257SSteve Yin     return S_OK;
71*5fdc4257SSteve Yin 
72*5fdc4257SSteve Yin     LEAVE_PROTECTED_BLOCK
73*5fdc4257SSteve Yin }
74*5fdc4257SSteve Yin 
75*5fdc4257SSteve Yin /**
76*5fdc4257SSteve Yin    * Get targets length.
77*5fdc4257SSteve Yin    * @param nTargets Variant to get targets length.
78*5fdc4257SSteve Yin    * @return Result.
79*5fdc4257SSteve Yin */
80*5fdc4257SSteve Yin STDMETHODIMP CAccRelation::get_nTargets(long * nTargets)
81*5fdc4257SSteve Yin {
82*5fdc4257SSteve Yin 
83*5fdc4257SSteve Yin 
84*5fdc4257SSteve Yin     ENTER_PROTECTED_BLOCK
85*5fdc4257SSteve Yin 
86*5fdc4257SSteve Yin 	CHECK_ENABLE_INF
87*5fdc4257SSteve Yin     if (nTargets == NULL)
88*5fdc4257SSteve Yin         return E_INVALIDARG;
89*5fdc4257SSteve Yin 
90*5fdc4257SSteve Yin     Sequence< Reference< XInterface > > xTargets = relation.TargetSet;
91*5fdc4257SSteve Yin     *nTargets = xTargets.getLength();
92*5fdc4257SSteve Yin     return S_OK;
93*5fdc4257SSteve Yin 
94*5fdc4257SSteve Yin     LEAVE_PROTECTED_BLOCK
95*5fdc4257SSteve Yin }
96*5fdc4257SSteve Yin 
97*5fdc4257SSteve Yin /**
98*5fdc4257SSteve Yin    * Get special target.
99*5fdc4257SSteve Yin    * @param targetIndex target index.
100*5fdc4257SSteve Yin    * @param target      Variant to get special target.
101*5fdc4257SSteve Yin    * @return Result.
102*5fdc4257SSteve Yin */
103*5fdc4257SSteve Yin STDMETHODIMP CAccRelation::get_target(long targetIndex, IUnknown * * target)
104*5fdc4257SSteve Yin {
105*5fdc4257SSteve Yin 
106*5fdc4257SSteve Yin 	CHECK_ENABLE_INF
107*5fdc4257SSteve Yin 
108*5fdc4257SSteve Yin     ENTER_PROTECTED_BLOCK
109*5fdc4257SSteve Yin 
110*5fdc4257SSteve Yin     if (target == NULL)
111*5fdc4257SSteve Yin         return E_FAIL;
112*5fdc4257SSteve Yin 
113*5fdc4257SSteve Yin     Sequence< Reference< XInterface > > xTargets = relation.TargetSet;
114*5fdc4257SSteve Yin     int nCount = xTargets.getLength();
115*5fdc4257SSteve Yin     if( targetIndex >= nCount )
116*5fdc4257SSteve Yin         return E_FAIL;
117*5fdc4257SSteve Yin 
118*5fdc4257SSteve Yin     Reference<XInterface> pRAcc = xTargets[targetIndex];
119*5fdc4257SSteve Yin     IAccessible* pRet = NULL;
120*5fdc4257SSteve Yin 
121*5fdc4257SSteve Yin     BOOL isGet = CMAccessible::get_IAccessibleFromXAccessible((long)pRAcc.get(),&pRet);
122*5fdc4257SSteve Yin     if(isGet)
123*5fdc4257SSteve Yin     {
124*5fdc4257SSteve Yin         *target = /*(IAccessible2 *)*/(IUnknown*)pRet;
125*5fdc4257SSteve Yin         pRet->AddRef();
126*5fdc4257SSteve Yin         return S_OK;
127*5fdc4257SSteve Yin     }
128*5fdc4257SSteve Yin 
129*5fdc4257SSteve Yin     return E_FAIL;
130*5fdc4257SSteve Yin 
131*5fdc4257SSteve Yin     LEAVE_PROTECTED_BLOCK
132*5fdc4257SSteve Yin }
133*5fdc4257SSteve Yin 
134*5fdc4257SSteve Yin /**
135*5fdc4257SSteve Yin    * Get special targets.
136*5fdc4257SSteve Yin    * @param maxTargets Special targets count.
137*5fdc4257SSteve Yin    * @param target Variant to get special target.
138*5fdc4257SSteve Yin    * @param nTargets Variant to accept actual target length.
139*5fdc4257SSteve Yin    * @return Result.
140*5fdc4257SSteve Yin */
141*5fdc4257SSteve Yin STDMETHODIMP CAccRelation::get_targets(long, IUnknown * * target, long * nTargets)
142*5fdc4257SSteve Yin {
143*5fdc4257SSteve Yin 
144*5fdc4257SSteve Yin 	CHECK_ENABLE_INF
145*5fdc4257SSteve Yin 
146*5fdc4257SSteve Yin     ENTER_PROTECTED_BLOCK
147*5fdc4257SSteve Yin 
148*5fdc4257SSteve Yin     // #CHECK#
149*5fdc4257SSteve Yin     if(target == NULL)
150*5fdc4257SSteve Yin         return E_INVALIDARG;
151*5fdc4257SSteve Yin     if (nTargets == NULL)
152*5fdc4257SSteve Yin         return E_INVALIDARG;
153*5fdc4257SSteve Yin 
154*5fdc4257SSteve Yin     Sequence< Reference< XInterface > > xTargets = relation.TargetSet;
155*5fdc4257SSteve Yin     int nCount = xTargets.getLength();
156*5fdc4257SSteve Yin 
157*5fdc4257SSteve Yin     *target = (IUnknown*)::CoTaskMemAlloc(nCount*sizeof(IUnknown));
158*5fdc4257SSteve Yin 
159*5fdc4257SSteve Yin     // #CHECK Memory Allocation#
160*5fdc4257SSteve Yin     if(*target == NULL)
161*5fdc4257SSteve Yin     {
162*5fdc4257SSteve Yin         return E_FAIL;
163*5fdc4257SSteve Yin     }
164*5fdc4257SSteve Yin 
165*5fdc4257SSteve Yin     for(int i=0; i<nCount ; i++)
166*5fdc4257SSteve Yin     {
167*5fdc4257SSteve Yin         IUnknown* pAcc = NULL;
168*5fdc4257SSteve Yin         HRESULT hr = get_target(i,&pAcc);
169*5fdc4257SSteve Yin         if(SUCCEEDED(hr))
170*5fdc4257SSteve Yin             target[i] = pAcc;
171*5fdc4257SSteve Yin     }
172*5fdc4257SSteve Yin 
173*5fdc4257SSteve Yin     *nTargets = nCount;
174*5fdc4257SSteve Yin     return S_OK;
175*5fdc4257SSteve Yin 
176*5fdc4257SSteve Yin     LEAVE_PROTECTED_BLOCK
177*5fdc4257SSteve Yin }
178*5fdc4257SSteve Yin 
179*5fdc4257SSteve Yin /**
180*5fdc4257SSteve Yin    * Put UNO interface.
181*5fdc4257SSteve Yin    * @param pXSubInterface AccessibleRelation pointer.
182*5fdc4257SSteve Yin    * @return Result.
183*5fdc4257SSteve Yin */
184*5fdc4257SSteve Yin STDMETHODIMP CAccRelation::put_XSubInterface(long pXSubInterface)
185*5fdc4257SSteve Yin {
186*5fdc4257SSteve Yin 
187*5fdc4257SSteve Yin     relation = *((AccessibleRelation*)pXSubInterface);
188*5fdc4257SSteve Yin     return S_OK;
189*5fdc4257SSteve Yin }
190*5fdc4257SSteve Yin 
191*5fdc4257SSteve Yin /**
192*5fdc4257SSteve Yin    * Get relation type string by type.
193*5fdc4257SSteve Yin    * @param type Relation type.
194*5fdc4257SSteve Yin    * @return relation type string.
195*5fdc4257SSteve Yin */
196*5fdc4257SSteve Yin BSTR CAccRelation::getRelationTypeBSTR(int type)
197*5fdc4257SSteve Yin {
198*5fdc4257SSteve Yin     static struct TYPE_BSTR_MAP
199*5fdc4257SSteve Yin     {
200*5fdc4257SSteve Yin         LPCTSTR string;
201*5fdc4257SSteve Yin         int type;
202*5fdc4257SSteve Yin     }
203*5fdc4257SSteve Yin     map[] =
204*5fdc4257SSteve Yin         {
205*5fdc4257SSteve Yin             {_T("INVALID")				,	0},
206*5fdc4257SSteve Yin             {IA2_RELATION_FLOWS_FROM	,	1},
207*5fdc4257SSteve Yin             {IA2_RELATION_FLOWS_TO		,	2},
208*5fdc4257SSteve Yin             {IA2_RELATION_CONTROLLED_BY	,	3},
209*5fdc4257SSteve Yin             {IA2_RELATION_CONTROLLER_FOR,	4},
210*5fdc4257SSteve Yin             {IA2_RELATION_LABEL_FOR		,	5},
211*5fdc4257SSteve Yin             {IA2_RELATION_LABELED_BY	,	6},
212*5fdc4257SSteve Yin             {IA2_RELATION_MEMBER_OF		,	7},
213*5fdc4257SSteve Yin             {IA2_RELATION_SUBWINDOW_OF	,	8},
214*5fdc4257SSteve Yin 			{IA2_RELATION_NODE_CHILD_OF,	9},
215*5fdc4257SSteve Yin             {IA2_RELATION_DESCRIBED_BY	,	10},
216*5fdc4257SSteve Yin         };
217*5fdc4257SSteve Yin 
218*5fdc4257SSteve Yin     USES_CONVERSION;
219*5fdc4257SSteve Yin 
220*5fdc4257SSteve Yin     return (type >= 0 && type <= 10) ? T2BSTR(map[type].string) : _T("");
221*5fdc4257SSteve Yin }
222