xref: /trunk/main/sw/source/core/access/acchyperlink.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1  /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_sw.hxx"
30 #include <comphelper/accessiblekeybindinghelper.hxx>
31 #include <swurl.hxx>
32 #include <vos/mutex.hxx>
33 #include <vcl/svapp.hxx>
34 #include <ndtxt.hxx>
35 #include <txtinet.hxx>
36 #include <accpara.hxx>
37 #include <acchyperlink.hxx>
38 
39 using namespace ::com::sun::star;
40 using namespace ::com::sun::star::accessibility;
41 using ::rtl::OUString;
42 
43 SwAccessibleHyperlink::SwAccessibleHyperlink( sal_uInt16 nHPos,
44     SwAccessibleParagraph *p, sal_Int32 nStt, sal_Int32 nEnd ) :
45     nHintPos( nHPos ),
46     xPara( p ),
47     nStartIdx( nStt ),
48     nEndIdx( nEnd )
49 {
50 }
51 
52 const SwTxtAttr *SwAccessibleHyperlink::GetTxtAttr() const
53 {
54     const SwTxtAttr *pTxtAttr = 0;
55     if( xPara.isValid() && xPara->GetMap() )
56     {
57         const SwTxtNode *pTxtNd = xPara->GetTxtNode();
58         const SwpHints *pHints = pTxtNd->GetpSwpHints();
59         if( pHints && nHintPos < pHints->Count() )
60         {
61             const SwTxtAttr *pHt = (*pHints)[nHintPos];
62             if( RES_TXTATR_INETFMT == pHt->Which() )
63                 pTxtAttr = pHt;
64         }
65     }
66 
67     return pTxtAttr;
68 }
69 
70 
71 // XAccessibleAction
72 sal_Int32 SAL_CALL SwAccessibleHyperlink::getAccessibleActionCount()
73         throw (uno::RuntimeException)
74 {
75      return isValid() ? 1 : 0;
76 }
77 
78 sal_Bool SAL_CALL SwAccessibleHyperlink::doAccessibleAction( sal_Int32 nIndex )
79         throw (lang::IndexOutOfBoundsException, uno::RuntimeException)
80 {
81     vos::OGuard aGuard(Application::GetSolarMutex());
82 
83     sal_Bool bRet = sal_False;
84 
85     const SwTxtAttr *pTxtAttr = GetTxtAttr();
86     if( pTxtAttr && 0 == nIndex )
87     {
88         const SwFmtINetFmt& rINetFmt = pTxtAttr->GetINetFmt();
89         if( rINetFmt.GetValue().Len() )
90         {
91             ViewShell *pVSh = xPara->GetShell();
92             if( pVSh )
93             {
94                 LoadURL( rINetFmt.GetValue(), pVSh, URLLOAD_NOFILTER,
95                          &rINetFmt.GetTargetFrame() );
96                 ASSERT( pTxtAttr == rINetFmt.GetTxtINetFmt(),
97                         "lost my txt attr" );
98                 const SwTxtINetFmt* pTxtAttr2 = rINetFmt.GetTxtINetFmt();
99                 if( pTxtAttr2 )
100                 {
101                     const_cast<SwTxtINetFmt*>(pTxtAttr2)->SetVisited(true);
102                     const_cast<SwTxtINetFmt*>(pTxtAttr2)->SetVisitedValid(true);
103                 }
104                 bRet = sal_True;
105             }
106         }
107     }
108 
109     return bRet;
110 }
111 
112 OUString SAL_CALL SwAccessibleHyperlink::getAccessibleActionDescription(
113         sal_Int32 nIndex )
114         throw (lang::IndexOutOfBoundsException, uno::RuntimeException)
115 {
116     OUString sDesc;
117 
118     const SwTxtAttr *pTxtAttr = GetTxtAttr();
119     if( pTxtAttr && 0 == nIndex )
120     {
121         const SwFmtINetFmt& rINetFmt = pTxtAttr->GetINetFmt();
122         sDesc = OUString( rINetFmt.GetValue() );
123     }
124 
125     return sDesc;
126 }
127 
128 uno::Reference< XAccessibleKeyBinding > SAL_CALL
129     SwAccessibleHyperlink::getAccessibleActionKeyBinding( sal_Int32 nIndex )
130     throw (lang::IndexOutOfBoundsException, uno::RuntimeException)
131 {
132     uno::Reference< XAccessibleKeyBinding > xKeyBinding;
133 
134     if( isValid() && 0==nIndex )
135     {
136         ::comphelper::OAccessibleKeyBindingHelper* pKeyBindingHelper =
137             new ::comphelper::OAccessibleKeyBindingHelper();
138         xKeyBinding = pKeyBindingHelper;
139 
140         awt::KeyStroke aKeyStroke;
141         aKeyStroke.Modifiers = 0;
142         aKeyStroke.KeyCode = KEY_RETURN;
143         aKeyStroke.KeyChar = 0;
144         aKeyStroke.KeyFunc = 0;
145         pKeyBindingHelper->AddKeyBinding( aKeyStroke );
146     }
147 
148     return xKeyBinding;
149 }
150 
151 // XAccessibleHyperlink
152 uno::Any SAL_CALL SwAccessibleHyperlink::getAccessibleActionAnchor(
153         sal_Int32 /*nIndex*/ )
154         throw (lang::IndexOutOfBoundsException, uno::RuntimeException)
155 {
156     return uno::Any();
157 }
158 
159 uno::Any SAL_CALL SwAccessibleHyperlink::getAccessibleActionObject(
160             sal_Int32 /*nIndex*/ )
161     throw (lang::IndexOutOfBoundsException, uno::RuntimeException)
162 {
163     return uno::Any();
164 }
165 
166 sal_Int32 SAL_CALL SwAccessibleHyperlink::getStartIndex()
167         throw (uno::RuntimeException)
168 {
169     return nStartIdx;
170 }
171 
172 sal_Int32 SAL_CALL SwAccessibleHyperlink::getEndIndex()
173         throw (uno::RuntimeException)
174 {
175     return nEndIdx;
176 }
177 
178 sal_Bool SAL_CALL SwAccessibleHyperlink::isValid(  )
179         throw (uno::RuntimeException)
180 {
181     vos::OGuard aGuard(Application::GetSolarMutex());
182     return xPara.isValid();
183 }
184 
185 void SwAccessibleHyperlink::Invalidate()
186 {
187     vos::OGuard aGuard(Application::GetSolarMutex());
188     xPara = 0;
189 }
190 
191