1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23
24
25 #include "precompiled_sw.hxx"
26
27 #include <SidebarWinAcc.hxx>
28
29 #include <SidebarWin.hxx>
30 #include <viewsh.hxx>
31 #include <accmap.hxx>
32 #include <toolkit/awt/vclxaccessiblecomponent.hxx>
33
34 #include <com/sun/star/accessibility/AccessibleRole.hpp>
35
36 namespace css = ::com::sun::star;
37
38 namespace sw { namespace sidebarwindows {
39
40 // =============================================================================
41 // declaration and implementation of accessible context for <SidebarWinAccessible> instance
42 // =============================================================================
43 class SidebarWinAccessibleContext : public VCLXAccessibleComponent
44 {
45 public:
SidebarWinAccessibleContext(SwSidebarWin & rSidebarWin,ViewShell & rViewShell,const SwFrm * pAnchorFrm)46 explicit SidebarWinAccessibleContext( SwSidebarWin& rSidebarWin,
47 ViewShell& rViewShell,
48 const SwFrm* pAnchorFrm )
49 : VCLXAccessibleComponent( rSidebarWin.GetWindowPeer() )
50 , mrViewShell( rViewShell )
51 , mpAnchorFrm( pAnchorFrm )
52 , maMutex()
53 {
54 rSidebarWin.SetAccessibleRole( css::accessibility::AccessibleRole::COMMENT );
55 }
56
~SidebarWinAccessibleContext()57 virtual ~SidebarWinAccessibleContext()
58 {}
59
ChangeAnchor(const SwFrm * pAnchorFrm)60 void ChangeAnchor( const SwFrm* pAnchorFrm )
61 {
62 vos::OGuard aGuard(maMutex);
63
64 mpAnchorFrm = pAnchorFrm;
65 }
66
67 virtual css::uno::Reference< css::accessibility::XAccessible > SAL_CALL
getAccessibleParent()68 getAccessibleParent() throw (css::uno::RuntimeException)
69 {
70 vos::OGuard aGuard(maMutex);
71
72 css::uno::Reference< css::accessibility::XAccessible > xAccParent;
73
74 if ( mpAnchorFrm &&
75 mrViewShell.GetAccessibleMap() )
76 {
77 xAccParent = mrViewShell.GetAccessibleMap()->GetContext( mpAnchorFrm, sal_False );
78 }
79
80 return xAccParent;
81 }
82
getAccessibleIndexInParent()83 virtual sal_Int32 SAL_CALL getAccessibleIndexInParent() throw (css::uno::RuntimeException)
84 {
85 vos::OGuard aGuard(maMutex);
86
87 sal_Int32 nIndex( -1 );
88
89 if ( mpAnchorFrm && GetWindow() &&
90 mrViewShell.GetAccessibleMap() )
91 {
92 nIndex = mrViewShell.GetAccessibleMap()->GetChildIndex( *mpAnchorFrm,
93 *GetWindow() );
94 }
95
96 return nIndex;
97 }
98
99 private:
100 ViewShell& mrViewShell;
101 const SwFrm* mpAnchorFrm;
102
103 ::vos::OMutex maMutex;
104 };
105
106 // =============================================================================
107 // implementaion of accessible for <SwSidebarWin> instance
108 // =============================================================================
SidebarWinAccessible(SwSidebarWin & rSidebarWin,ViewShell & rViewShell,const SwSidebarItem & rSidebarItem)109 SidebarWinAccessible::SidebarWinAccessible( SwSidebarWin& rSidebarWin,
110 ViewShell& rViewShell,
111 const SwSidebarItem& rSidebarItem )
112 : VCLXWindow()
113 , mrSidebarWin( rSidebarWin )
114 , mrViewShell( rViewShell )
115 , mpAnchorFrm( rSidebarItem.maLayoutInfo.mpAnchorFrm )
116 , bAccContextCreated( false )
117 {
118 SetWindow( &mrSidebarWin );
119 }
120
~SidebarWinAccessible()121 SidebarWinAccessible::~SidebarWinAccessible()
122 {
123 }
124
ChangeSidebarItem(const SwSidebarItem & rSidebarItem)125 void SidebarWinAccessible::ChangeSidebarItem( const SwSidebarItem& rSidebarItem )
126 {
127 if ( bAccContextCreated )
128 {
129 css::uno::Reference< css::accessibility::XAccessibleContext > xAcc
130 = getAccessibleContext();
131 if ( xAcc.is() )
132 {
133 SidebarWinAccessibleContext* pAccContext =
134 dynamic_cast<SidebarWinAccessibleContext*>(xAcc.get());
135 if ( pAccContext )
136 {
137 pAccContext->ChangeAnchor( rSidebarItem.maLayoutInfo.mpAnchorFrm );
138 }
139 }
140 }
141 }
142
CreateAccessibleContext()143 css::uno::Reference< css::accessibility::XAccessibleContext > SidebarWinAccessible::CreateAccessibleContext()
144 {
145 SidebarWinAccessibleContext* pAccContext =
146 new SidebarWinAccessibleContext( mrSidebarWin,
147 mrViewShell,
148 mpAnchorFrm );
149 css::uno::Reference< css::accessibility::XAccessibleContext > xAcc( pAccContext );
150 bAccContextCreated = true;
151 return xAcc;
152 }
153
154 } } // end of namespace sw::sidebarwindows
155
156