xref: /trunk/main/sw/source/core/access/accfrmobjmap.cxx (revision 4d7c9de063a797b8b4f3d45e3561e82ad1f8ef1f)
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 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sw.hxx"
26 
27 #include <accfrmobjmap.hxx>
28 #include <accframe.hxx>
29 #include <accmap.hxx>
30 #include <acccontext.hxx>
31 
32 #include <viewsh.hxx>
33 #include <doc.hxx>
34 #include <frmfmt.hxx>
35 #include <pagefrm.hxx>
36 #include <txtfrm.hxx>
37 #include <node.hxx>
38 #include <sortedobjs.hxx>
39 #include <anchoredobject.hxx>
40 
41 #include <svx/svdobj.hxx>
42 
43 using namespace sw::access;
44 
45 SwAccessibleChildMap::SwAccessibleChildMap( const SwRect& rVisArea,
46                                             const SwFrm& rFrm,
47                                             SwAccessibleMap& rAccMap )
48     : nHellId( rAccMap.GetShell()->GetDoc()->GetHellId() )
49     , nControlsId( rAccMap.GetShell()->GetDoc()->GetControlsId() )
50 {
51     const bool bVisibleChildrenOnly = SwAccessibleChild( &rFrm ).IsVisibleChildrenOnly();
52 
53     sal_uInt32 nPos = 0;
54     SwAccessibleChild aLower( rFrm.GetLower() );
55     while( aLower.GetSwFrm() )
56     {
57         if ( !bVisibleChildrenOnly ||
58              aLower.AlwaysIncludeAsChild() ||
59              aLower.GetBox( rAccMap ).IsOver( rVisArea ) )
60         {
61             insert( nPos++, SwAccessibleChildMapKey::TEXT, aLower );
62         }
63 
64         aLower = aLower.GetSwFrm()->GetNext();
65     }
66 
67     if ( rFrm.IsPageFrm() )
68     {
69         ASSERT( bVisibleChildrenOnly, "page frame within tab frame???" );
70         const SwPageFrm *pPgFrm =
71             static_cast< const SwPageFrm * >( &rFrm );
72         const SwSortedObjs *pObjs = pPgFrm->GetSortedObjs();
73         if ( pObjs )
74         {
75             for( sal_uInt16 i=0; i<pObjs->Count(); i++ )
76             {
77                 aLower = (*pObjs)[i]->GetDrawObj();
78                 if ( aLower.GetBox( rAccMap ).IsOver( rVisArea ) )
79                 {
80                     insert( aLower.GetDrawObject(), aLower );
81                 }
82             }
83         }
84     }
85     else if( rFrm.IsTxtFrm() )
86     {
87         const SwSortedObjs *pObjs = rFrm.GetDrawObjs();
88         if ( pObjs )
89         {
90             for( sal_uInt16 i=0; i<pObjs->Count(); i++ )
91             {
92                 aLower = (*pObjs)[i]->GetDrawObj();
93                 if ( aLower.IsBoundAsChar() &&
94                      ( !bVisibleChildrenOnly ||
95                        aLower.AlwaysIncludeAsChild() ||
96                        aLower.GetBox( rAccMap ).IsOver( rVisArea ) ) )
97                 {
98                     insert( aLower.GetDrawObject(), aLower );
99                 }
100             }
101         }
102 
103         {
104             ::vos::ORef < SwAccessibleContext > xAccImpl =
105                                 rAccMap.GetContextImpl( &rFrm, sal_False );
106             if( xAccImpl.isValid() )
107             {
108                 SwAccessibleContext* pAccImpl = xAccImpl.getBodyPtr();
109                 if ( pAccImpl &&
110                      pAccImpl->HasAdditionalAccessibleChildren() )
111                 {
112                     std::vector< Window* >* pAdditionalChildren =
113                                                 new std::vector< Window* >();
114                     pAccImpl->GetAdditionalAccessibleChildren( pAdditionalChildren );
115 
116                     sal_Int32 nCounter( 0 );
117                     for ( std::vector< Window* >::iterator aIter = pAdditionalChildren->begin();
118                           aIter != pAdditionalChildren->end();
119                           ++aIter )
120                     {
121                         aLower = (*aIter);
122                         insert( ++nCounter, SwAccessibleChildMapKey::XWINDOW, aLower );
123                     }
124 
125                     delete pAdditionalChildren;
126                 }
127             }
128         }
129     }
130 }
131 
132 ::std::pair< SwAccessibleChildMap::iterator, bool > SwAccessibleChildMap::insert(
133                                                 const sal_uInt32 nPos,
134                                                 const SwAccessibleChildMapKey::LayerId eLayerId,
135                                                 const SwAccessibleChild& rLower )
136 {
137     SwAccessibleChildMapKey aKey( eLayerId, nPos );
138     value_type aEntry( aKey, rLower );
139     return _SwAccessibleChildMap::insert( aEntry );
140 }
141 
142 ::std::pair< SwAccessibleChildMap::iterator, bool > SwAccessibleChildMap::insert(
143                                                 const SdrObject *pObj,
144                                                 const SwAccessibleChild& rLower )
145 {
146     const SdrLayerID nLayer = pObj->GetLayer();
147     SwAccessibleChildMapKey::LayerId eLayerId =
148                     (nHellId == nLayer)
149                     ? SwAccessibleChildMapKey::HELL
150                     : ( (nControlsId == nLayer)
151                         ? SwAccessibleChildMapKey::CONTROLS
152                         : SwAccessibleChildMapKey::HEAVEN );
153     SwAccessibleChildMapKey aKey( eLayerId, pObj->GetOrdNum() );
154     value_type aEntry( aKey, rLower );
155     return _SwAccessibleChildMap::insert( aEntry );
156 }
157 
158 /* static */ sal_Bool SwAccessibleChildMap::IsSortingRequired( const SwFrm& rFrm )
159 {
160     return ( rFrm.IsPageFrm() &&
161              static_cast< const SwPageFrm& >( rFrm ).GetSortedObjs() ) ||
162            ( rFrm.IsTxtFrm() &&
163              rFrm.GetDrawObjs() );
164 }
165 
166 /* MT: The two insert methods had been introduced in the IA2 CWS (OOO310m11), but meanwhile we also have some in DEV300m80 (above)
167        Not sure if they have something which needs to be update in above methods.
168        Also, since there is no SwFrmOrObjMap CTOR anymore, the updated code in DEV300 might need some of the changes flagged with
169 ::std::pair< SwFrmOrObjMap::iterator, bool > SwFrmOrObjMap::insert(
170         sal_uInt32 nOrd,  Point nPos, const SwFrmOrObj& rLower )
171 {
172     SwFrmOrObjMapKey aKey( SwFrmOrObjMapKey::TEXT, nOrd, nPos );
173     value_type aEntry( aKey, rLower );
174     return _SwFrmOrObjMap::insert( aEntry );
175 }
176 
177 ::std::pair< SwFrmOrObjMap::iterator, bool > SwFrmOrObjMap::insert(
178         const SdrObject *pObj, const SwFrmOrObj& rLower, const SwDoc *pDoc , Point nPos)
179 {
180     if( !bLayerIdsValid )
181     {
182         nHellId = pDoc->GetHellId();
183         nControlsId = pDoc->GetControlsId();
184         bLayerIdsValid = sal_True;
185     }
186 
187     SdrLayerID nLayer = pObj->GetLayer();
188     SwFrmOrObjMapKey::LayerId eLayerId = (nHellId == nLayer)
189                     ? SwFrmOrObjMapKey::HELL
190                     : ((nControlsId == nLayer) ? SwFrmOrObjMapKey::CONTROLS
191                                                : SwFrmOrObjMapKey::HEAVEN);
192     SwFrmOrObjMapKey aKey( eLayerId, pObj->GetOrdNum(), nPos );
193     value_type aEntry( aKey, rLower );
194     return _SwFrmOrObjMap::insert( aEntry );
195 }
196 
197 SwFrmOrObjMap::SwFrmOrObjMap(
198         const SwRect& rVisArea, const SwFrm *pFrm ) :
199     bLayerIdsValid( sal_False )
200 {
201     SwFrmOrObj aFrm( pFrm );
202     sal_Bool bVisibleOnly = aFrm.IsVisibleChildrenOnly();
203 
204     sal_uInt32 nPos = 0;
205     SwFrmOrObj aLower( pFrm->GetLower() );
206     while( aLower.GetSwFrm() )
207     {
208         if( !bVisibleOnly || aLower.GetBox().IsOver( rVisArea ) )
209             insert( nPos++, aLower.GetBounds().Pos(), aLower );
210         aLower = aLower.GetSwFrm()->GetNext();
211     }
212 
213     if( pFrm->IsPageFrm() )
214     {
215         ASSERT( bVisibleOnly, "page frame within tab frame???" );
216         const SwPageFrm *pPgFrm =
217             static_cast< const SwPageFrm * >( pFrm );
218         const SwSortedObjs *pObjs = pPgFrm->GetSortedObjs();
219         if( pObjs )
220         {
221             const SwDoc *pDoc = pPgFrm->GetFmt()->GetDoc();
222             for( sal_uInt16 i=0; i<pObjs->Count(); i++ )
223             {
224                 aLower = (*pObjs)[i]->GetDrawObj();
225                 if( aLower.GetBox().IsOver( rVisArea ) )
226                     insert( aLower.GetSdrObject(), aLower, pDoc , aLower.GetBounds().Pos() );
227             }
228         }
229     }
230     else if( pFrm->IsTxtFrm() )
231     {
232         const SwDoc *pDoc = static_cast< const SwTxtFrm * >( pFrm )->GetNode()
233                                                                    ->GetDoc();
234         const SwSortedObjs *pObjs = pFrm->GetDrawObjs();
235         if( pObjs )
236         {
237             for( sal_uInt16 i=0; i<pObjs->Count(); i++ )
238             {
239                 aLower = (*pObjs)[i]->GetDrawObj();
240                 if( aLower.IsBoundAsChar() &&
241                     (!bVisibleOnly || aLower.GetBox().IsOver( rVisArea )) )
242                     insert( aLower.GetSdrObject(), aLower, pDoc , Point(aLower.GetAnchorPosition(),0) );
243             }
244         }
245     }
246 }
247 
248 */
249 
250