xref: /trunk/main/sw/source/core/access/accnotexthyperlink.cxx (revision cf6516809c57e1bb0a940545cca99cdad54d4ce2)
1*d3553c6bSHerbert Dürr /**************************************************************
2ca62e2c2SSteve Yin  *
3*d3553c6bSHerbert Dürr  * Licensed to the Apache Software Foundation (ASF) under one
4*d3553c6bSHerbert Dürr  * or more contributor license agreements.  See the NOTICE file
5*d3553c6bSHerbert Dürr  * distributed with this work for additional information
6*d3553c6bSHerbert Dürr  * regarding copyright ownership.  The ASF licenses this file
7*d3553c6bSHerbert Dürr  * to you under the Apache License, Version 2.0 (the
8*d3553c6bSHerbert Dürr  * "License"); you may not use this file except in compliance
9*d3553c6bSHerbert Dürr  * with the License.  You may obtain a copy of the License at
10ca62e2c2SSteve Yin  *
11*d3553c6bSHerbert Dürr  *   http://www.apache.org/licenses/LICENSE-2.0
12ca62e2c2SSteve Yin  *
13*d3553c6bSHerbert Dürr  * Unless required by applicable law or agreed to in writing,
14*d3553c6bSHerbert Dürr  * software distributed under the License is distributed on an
15*d3553c6bSHerbert Dürr  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*d3553c6bSHerbert Dürr  * KIND, either express or implied.  See the License for the
17*d3553c6bSHerbert Dürr  * specific language governing permissions and limitations
18*d3553c6bSHerbert Dürr  * under the License.
19ca62e2c2SSteve Yin  *
20*d3553c6bSHerbert Dürr  *************************************************************/
21*d3553c6bSHerbert Dürr 
22ca62e2c2SSteve Yin // MARKER(update_precomp.py): autogen include statement, do not remove
23ca62e2c2SSteve Yin #include "precompiled_sw.hxx"
24ca62e2c2SSteve Yin 
25ca62e2c2SSteve Yin #include <comphelper/accessiblekeybindinghelper.hxx>
26ca62e2c2SSteve Yin #include <swurl.hxx>
27ca62e2c2SSteve Yin #include <vos/mutex.hxx>
28ca62e2c2SSteve Yin #include <vcl/svapp.hxx>
29ca62e2c2SSteve Yin #include <ndtxt.hxx>
30ca62e2c2SSteve Yin #include <txtinet.hxx>
31ca62e2c2SSteve Yin #include <frmfmt.hxx>
32ca62e2c2SSteve Yin 
33ca62e2c2SSteve Yin #include <accnotexthyperlink.hxx>
34ca62e2c2SSteve Yin 
35ca62e2c2SSteve Yin #include <fmturl.hxx>
36ca62e2c2SSteve Yin 
37ca62e2c2SSteve Yin #include <svtools/imap.hxx>
38ca62e2c2SSteve Yin #include <svtools/imapobj.hxx>
39ca62e2c2SSteve Yin 
40ca62e2c2SSteve Yin #include <accmap.hxx>
41ca62e2c2SSteve Yin using namespace ::com::sun::star::lang;
42ca62e2c2SSteve Yin using namespace ::com::sun::star::uno;
43ca62e2c2SSteve Yin using namespace ::com::sun::star::accessibility;
44ca62e2c2SSteve Yin //using namespace ::rtl;
45ca62e2c2SSteve Yin 
SwAccessibleNoTextHyperlink(SwAccessibleNoTextFrame * p,const SwFrm * aFrm,sal_uInt16 nIndex)46ca62e2c2SSteve Yin SwAccessibleNoTextHyperlink::SwAccessibleNoTextHyperlink( SwAccessibleNoTextFrame *p, const SwFrm *aFrm, sal_uInt16 nIndex) :
47ca62e2c2SSteve Yin     xFrame( p ),
48ca62e2c2SSteve Yin     mpFrm( aFrm ),
49ca62e2c2SSteve Yin     mnIndex(nIndex)
50ca62e2c2SSteve Yin {
51ca62e2c2SSteve Yin }
52ca62e2c2SSteve Yin 
53ca62e2c2SSteve Yin // XAccessibleAction
getAccessibleActionCount()54ca62e2c2SSteve Yin sal_Int32 SAL_CALL SwAccessibleNoTextHyperlink::getAccessibleActionCount()
55ca62e2c2SSteve Yin         throw (RuntimeException)
56ca62e2c2SSteve Yin {
57ca62e2c2SSteve Yin     SwFmtURL aURL( GetFmt()->GetURL() );
58ca62e2c2SSteve Yin     ImageMap* pMap = aURL.GetMap();
59ca62e2c2SSteve Yin     if( pMap != NULL )
60ca62e2c2SSteve Yin     {
61ca62e2c2SSteve Yin         return  pMap->GetIMapObjectCount();
62ca62e2c2SSteve Yin     }else if( aURL.GetURL().Len() )
63ca62e2c2SSteve Yin     {
64ca62e2c2SSteve Yin         return 1;
65ca62e2c2SSteve Yin     }
66ca62e2c2SSteve Yin 
67ca62e2c2SSteve Yin     return 0;
68ca62e2c2SSteve Yin }
69ca62e2c2SSteve Yin 
doAccessibleAction(sal_Int32 nIndex)70ca62e2c2SSteve Yin sal_Bool SAL_CALL SwAccessibleNoTextHyperlink::doAccessibleAction( sal_Int32 nIndex )
71ca62e2c2SSteve Yin         throw (IndexOutOfBoundsException, RuntimeException)
72ca62e2c2SSteve Yin {
73ca62e2c2SSteve Yin     vos::OGuard aGuard(Application::GetSolarMutex());
74ca62e2c2SSteve Yin 
75ca62e2c2SSteve Yin     if(nIndex < 0 || nIndex >= getAccessibleActionCount())
76ca62e2c2SSteve Yin         throw new IndexOutOfBoundsException;
77ca62e2c2SSteve Yin 
78ca62e2c2SSteve Yin     sal_Bool bRet = sal_False;
79ca62e2c2SSteve Yin     SwFmtURL aURL( GetFmt()->GetURL() );
80ca62e2c2SSteve Yin     ImageMap* pMap = aURL.GetMap();
81ca62e2c2SSteve Yin     if( pMap != NULL )
82ca62e2c2SSteve Yin     {
83ca62e2c2SSteve Yin         IMapObject* pMapObj = pMap->GetIMapObject(nIndex);
84ca62e2c2SSteve Yin         if(pMapObj->GetURL().Len())
85ca62e2c2SSteve Yin         {
86ca62e2c2SSteve Yin             ViewShell *pVSh = xFrame->GetShell();
87ca62e2c2SSteve Yin             if( pVSh )
88ca62e2c2SSteve Yin             {
89ca62e2c2SSteve Yin                 LoadURL( pMapObj->GetURL(), pVSh, URLLOAD_NOFILTER,
90ca62e2c2SSteve Yin                          &pMapObj->GetTarget() );
91ca62e2c2SSteve Yin                 bRet = sal_True;
92ca62e2c2SSteve Yin             }
93ca62e2c2SSteve Yin         }
94ca62e2c2SSteve Yin     }
95ca62e2c2SSteve Yin     else if( aURL.GetURL().Len() )
96ca62e2c2SSteve Yin     {
97ca62e2c2SSteve Yin         ViewShell *pVSh = xFrame->GetShell();
98ca62e2c2SSteve Yin         if( pVSh )
99ca62e2c2SSteve Yin         {
100ca62e2c2SSteve Yin             LoadURL( aURL.GetURL(), pVSh, URLLOAD_NOFILTER,
101ca62e2c2SSteve Yin                      &aURL.GetTargetFrameName() );
102ca62e2c2SSteve Yin             bRet = sal_True;
103ca62e2c2SSteve Yin         }
104ca62e2c2SSteve Yin     }
105ca62e2c2SSteve Yin 
106ca62e2c2SSteve Yin     return bRet;
107ca62e2c2SSteve Yin }
108ca62e2c2SSteve Yin 
getAccessibleActionDescription(sal_Int32 nIndex)109ca62e2c2SSteve Yin rtl::OUString SAL_CALL SwAccessibleNoTextHyperlink::getAccessibleActionDescription(
110ca62e2c2SSteve Yin         sal_Int32 nIndex )
111ca62e2c2SSteve Yin         throw (IndexOutOfBoundsException, RuntimeException)
112ca62e2c2SSteve Yin {
113ca62e2c2SSteve Yin     rtl::OUString sDesc;
114ca62e2c2SSteve Yin 
115ca62e2c2SSteve Yin     if(nIndex < 0 || nIndex >= getAccessibleActionCount())
116ca62e2c2SSteve Yin         throw new IndexOutOfBoundsException;
117ca62e2c2SSteve Yin 
118ca62e2c2SSteve Yin     SwFmtURL aURL( GetFmt()->GetURL() );
119ca62e2c2SSteve Yin     ImageMap* pMap = aURL.GetMap();
120ca62e2c2SSteve Yin     if( pMap != NULL )
121ca62e2c2SSteve Yin     {
122ca62e2c2SSteve Yin         IMapObject* pMapObj = pMap->GetIMapObject(nIndex);
123ca62e2c2SSteve Yin         if(pMapObj->GetDesc().Len())
124ca62e2c2SSteve Yin             sDesc = rtl::OUString( pMapObj->GetDesc() );
125ca62e2c2SSteve Yin         else if(pMapObj->GetURL().Len())
126ca62e2c2SSteve Yin             sDesc = rtl::OUString( pMapObj->GetURL() );
127ca62e2c2SSteve Yin     }
128ca62e2c2SSteve Yin     else if( aURL.GetURL().Len() )
129ca62e2c2SSteve Yin         sDesc = rtl::OUString( aURL.GetName() );
130ca62e2c2SSteve Yin         //sDesc = rtl::OUString( aURL.GetName() );
131ca62e2c2SSteve Yin 
132ca62e2c2SSteve Yin     return sDesc;
133ca62e2c2SSteve Yin }
134ca62e2c2SSteve Yin 
135ca62e2c2SSteve Yin Reference< XAccessibleKeyBinding > SAL_CALL
getAccessibleActionKeyBinding(sal_Int32 nIndex)136ca62e2c2SSteve Yin     SwAccessibleNoTextHyperlink::getAccessibleActionKeyBinding( sal_Int32 nIndex )
137ca62e2c2SSteve Yin     throw (IndexOutOfBoundsException, RuntimeException)
138ca62e2c2SSteve Yin {
139ca62e2c2SSteve Yin     Reference< XAccessibleKeyBinding > xKeyBinding;
140ca62e2c2SSteve Yin 
141ca62e2c2SSteve Yin     if(nIndex < 0 || nIndex >= getAccessibleActionCount())
142ca62e2c2SSteve Yin         throw new IndexOutOfBoundsException;
143ca62e2c2SSteve Yin 
144ca62e2c2SSteve Yin     bool bIsValid = sal_False;
145ca62e2c2SSteve Yin     SwFmtURL aURL( GetFmt()->GetURL() );
146ca62e2c2SSteve Yin     ImageMap* pMap = aURL.GetMap();
147ca62e2c2SSteve Yin     if( pMap != NULL )
148ca62e2c2SSteve Yin     {
149ca62e2c2SSteve Yin         IMapObject* pMapObj = pMap->GetIMapObject(nIndex);
150ca62e2c2SSteve Yin         if(pMapObj->GetURL().Len())
151ca62e2c2SSteve Yin             bIsValid = sal_True;
152ca62e2c2SSteve Yin     }else if( aURL.GetURL().Len() )
153ca62e2c2SSteve Yin         bIsValid = sal_True;
154ca62e2c2SSteve Yin 
155ca62e2c2SSteve Yin     if(bIsValid)
156ca62e2c2SSteve Yin     {
157ca62e2c2SSteve Yin         ::comphelper::OAccessibleKeyBindingHelper* pKeyBindingHelper =
158ca62e2c2SSteve Yin             new ::comphelper::OAccessibleKeyBindingHelper();
159ca62e2c2SSteve Yin         xKeyBinding = pKeyBindingHelper;
160ca62e2c2SSteve Yin 
161ca62e2c2SSteve Yin         ::com::sun::star::awt::KeyStroke aKeyStroke;
162ca62e2c2SSteve Yin         aKeyStroke.Modifiers = 0;
163ca62e2c2SSteve Yin         aKeyStroke.KeyCode = KEY_RETURN;
164ca62e2c2SSteve Yin         aKeyStroke.KeyChar = 0;
165ca62e2c2SSteve Yin         aKeyStroke.KeyFunc = 0;
166ca62e2c2SSteve Yin         pKeyBindingHelper->AddKeyBinding( aKeyStroke );
167ca62e2c2SSteve Yin     }
168ca62e2c2SSteve Yin 
169ca62e2c2SSteve Yin     return xKeyBinding;
170ca62e2c2SSteve Yin }
171ca62e2c2SSteve Yin 
172ca62e2c2SSteve Yin // XAccessibleHyperlink
getAccessibleActionAnchor(sal_Int32 nIndex)173ca62e2c2SSteve Yin Any SAL_CALL SwAccessibleNoTextHyperlink::getAccessibleActionAnchor(
174ca62e2c2SSteve Yin         sal_Int32 nIndex )
175ca62e2c2SSteve Yin         throw (IndexOutOfBoundsException, RuntimeException)
176ca62e2c2SSteve Yin {
177ca62e2c2SSteve Yin     if(nIndex < 0 || nIndex >= getAccessibleActionCount())
178ca62e2c2SSteve Yin         throw new IndexOutOfBoundsException;
179ca62e2c2SSteve Yin 
180ca62e2c2SSteve Yin     Any aRet;
181ca62e2c2SSteve Yin     //SwFrm* pAnchor = ((SwFlyFrm*)mpFrm)->GetAnchor();
182ca62e2c2SSteve Yin     Reference< XAccessible > xAnchor = xFrame->GetAccessibleMap()->GetContext(mpFrm, sal_True);
183ca62e2c2SSteve Yin     //SwAccessibleNoTextFrame* pFrame = xFrame.get();
184ca62e2c2SSteve Yin     //Reference< XAccessible > xAnchor = (XAccessible*)pFrame;
185ca62e2c2SSteve Yin     aRet <<= xAnchor;
186ca62e2c2SSteve Yin     return aRet;
187ca62e2c2SSteve Yin }
188ca62e2c2SSteve Yin 
getAccessibleActionObject(sal_Int32 nIndex)189ca62e2c2SSteve Yin Any SAL_CALL SwAccessibleNoTextHyperlink::getAccessibleActionObject(
190ca62e2c2SSteve Yin             sal_Int32 nIndex )
191ca62e2c2SSteve Yin     throw (IndexOutOfBoundsException, RuntimeException)
192ca62e2c2SSteve Yin {
193ca62e2c2SSteve Yin     if(nIndex < 0 || nIndex >= getAccessibleActionCount())
194ca62e2c2SSteve Yin         throw new IndexOutOfBoundsException;
195ca62e2c2SSteve Yin 
196ca62e2c2SSteve Yin     SwFmtURL aURL( GetFmt()->GetURL() );
197ca62e2c2SSteve Yin     ::rtl::OUString retText;
198ca62e2c2SSteve Yin     ImageMap* pMap = aURL.GetMap();
199ca62e2c2SSteve Yin     if( pMap != NULL )
200ca62e2c2SSteve Yin     {
201ca62e2c2SSteve Yin         IMapObject* pMapObj = pMap->GetIMapObject(nIndex);
202ca62e2c2SSteve Yin         if(pMapObj->GetURL().Len())
203ca62e2c2SSteve Yin             retText = rtl::OUString( pMapObj->GetURL() );
204ca62e2c2SSteve Yin     }else if( aURL.GetURL().Len() )
205ca62e2c2SSteve Yin         retText = rtl::OUString( aURL.GetURL() );
206ca62e2c2SSteve Yin 
207ca62e2c2SSteve Yin     Any aRet;
208ca62e2c2SSteve Yin     aRet <<= retText;
209ca62e2c2SSteve Yin     return aRet;
210ca62e2c2SSteve Yin }
211ca62e2c2SSteve Yin 
getStartIndex()212ca62e2c2SSteve Yin sal_Int32 SAL_CALL SwAccessibleNoTextHyperlink::getStartIndex()
213ca62e2c2SSteve Yin         throw (RuntimeException)
214ca62e2c2SSteve Yin {
215ca62e2c2SSteve Yin     return 0;
216ca62e2c2SSteve Yin }
217ca62e2c2SSteve Yin 
getEndIndex()218ca62e2c2SSteve Yin sal_Int32 SAL_CALL SwAccessibleNoTextHyperlink::getEndIndex()
219ca62e2c2SSteve Yin         throw (RuntimeException)
220ca62e2c2SSteve Yin {
221ca62e2c2SSteve Yin     return 0;
222ca62e2c2SSteve Yin }
223ca62e2c2SSteve Yin 
isValid()224ca62e2c2SSteve Yin sal_Bool SAL_CALL SwAccessibleNoTextHyperlink::isValid(  )
225ca62e2c2SSteve Yin         throw (::com::sun::star::uno::RuntimeException)
226ca62e2c2SSteve Yin {
227ca62e2c2SSteve Yin     SwFmtURL aURL( GetFmt()->GetURL() );
228ca62e2c2SSteve Yin 
229ca62e2c2SSteve Yin     if( aURL.GetMap() || aURL.GetURL().Len() )
230ca62e2c2SSteve Yin         return sal_True;
231ca62e2c2SSteve Yin     return sal_False;
232ca62e2c2SSteve Yin }
233