xref: /AOO41X/main/sw/source/core/crsr/unocrsr.cxx (revision efeef26f81c84063fb0a91bde3856d4a51172d90)
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 
28 #include <unocrsr.hxx>
29 #include <doc.hxx>
30 #include <swtable.hxx>
31 #include <docary.hxx>
32 #include <rootfrm.hxx>
33 
SV_IMPL_PTRARR(SwUnoCrsrTbl,SwUnoCrsrPtr)34 SV_IMPL_PTRARR( SwUnoCrsrTbl, SwUnoCrsrPtr )
35 
36 IMPL_FIXEDMEMPOOL_NEWDEL( SwUnoCrsr, 10, 10 )
37 
38 SwUnoCrsr::SwUnoCrsr( const SwPosition &rPos, SwPaM* pRing )
39     : SwCursor( rPos, pRing, false ), SwModify( 0 ),
40     bRemainInSection( sal_True ),
41     bSkipOverHiddenSections( sal_False ),
42     bSkipOverProtectSections( sal_False )
43 
44 {}
45 
~SwUnoCrsr()46 SwUnoCrsr::~SwUnoCrsr()
47 {
48     SwDoc* pDoc = GetDoc();
49     if( !pDoc->IsInDtor() )
50     {
51         // dann muss der Cursor aus dem Array ausgetragen werden
52         SwUnoCrsrTbl& rTbl = (SwUnoCrsrTbl&)pDoc->GetUnoCrsrTbl();
53         sal_uInt16 nDelPos = rTbl.GetPos( this );
54 
55         if( USHRT_MAX != nDelPos )
56             rTbl.Remove( nDelPos );
57         else {
58             ASSERT( !this, "UNO Cursor nicht mehr im Array" );
59         }
60     }
61 
62     // den gesamten Ring loeschen!
63     while( GetNext() != this )
64     {
65         Ring* pNxt = GetNext();
66         pNxt->MoveTo( 0 );      // ausketten
67         delete pNxt;            // und loeschen
68     }
69 }
70 
Clone() const71 SwUnoCrsr * SwUnoCrsr::Clone() const
72 {
73     SwUnoCrsr * pNewCrsr = GetDoc()->CreateUnoCrsr( *GetPoint() );
74     if (HasMark())
75     {
76         pNewCrsr->SetMark();
77         *pNewCrsr->GetMark() = *GetMark();
78     }
79     return pNewCrsr;
80 }
81 
Clone() const82 SwUnoTableCrsr * SwUnoTableCrsr::Clone() const
83 {
84     SwUnoTableCrsr * pNewCrsr = dynamic_cast<SwUnoTableCrsr*>(
85         GetDoc()->CreateUnoCrsr(
86             *GetPoint(), sal_True /* create SwUnoTableCrsr */ ) );
87     OSL_ENSURE(pNewCrsr, "Clone: cannot create SwUnoTableCrsr?");
88     if (HasMark())
89     {
90         pNewCrsr->SetMark();
91         *pNewCrsr->GetMark() = *GetMark();
92     }
93     return pNewCrsr;
94 }
95 
96 
IsReadOnlyAvailable() const97 bool SwUnoCrsr::IsReadOnlyAvailable() const
98 {
99     return true;
100 }
101 
102 const SwCntntFrm*
DoSetBidiLevelLeftRight(sal_Bool &,sal_Bool,sal_Bool)103 SwUnoCrsr::DoSetBidiLevelLeftRight( sal_Bool &, sal_Bool, sal_Bool )
104 {
105     return 0; // not for uno cursor
106 }
107 
DoSetBidiLevelUpDown()108 void SwUnoCrsr::DoSetBidiLevelUpDown()
109 {
110     return; // not for uno cursor
111 }
112 
IsSelOvr(int eFlags)113 sal_Bool SwUnoCrsr::IsSelOvr( int eFlags )
114 {
115     if( bRemainInSection )
116     {
117         SwDoc* pDoc = GetDoc();
118         SwNodeIndex aOldIdx( *pDoc->GetNodes()[ GetSavePos()->nNode ] );
119         SwNodeIndex& rPtIdx = GetPoint()->nNode;
120         SwStartNode *pOldSttNd = aOldIdx.GetNode().StartOfSectionNode(),
121                     *pNewSttNd = rPtIdx.GetNode().StartOfSectionNode();
122         if( pOldSttNd != pNewSttNd )
123         {
124             sal_Bool bMoveDown = GetSavePos()->nNode < rPtIdx.GetIndex();
125             sal_Bool bValidPos = sal_False;
126 
127             // search the correct surrounded start node - which the index
128             // can't leave.
129             while( pOldSttNd->IsSectionNode() )
130                 pOldSttNd = pOldSttNd->StartOfSectionNode();
131 
132             // is the new index inside this surrounded section?
133             if( rPtIdx > *pOldSttNd &&
134                 rPtIdx < pOldSttNd->EndOfSectionIndex() )
135             {
136                 // check if it a valid move inside this section
137                 // (only over SwSection's !)
138                 const SwStartNode* pInvalidNode;
139                 do {
140                     pInvalidNode = 0;
141                     pNewSttNd = rPtIdx.GetNode().StartOfSectionNode();
142 
143                     const SwStartNode *pSttNd = pNewSttNd, *pEndNd = pOldSttNd;
144                     if( pSttNd->EndOfSectionIndex() >
145                         pEndNd->EndOfSectionIndex() )
146                     {
147                         pEndNd = pNewSttNd;
148                         pSttNd = pOldSttNd;
149                     }
150 
151                     while( pSttNd->GetIndex() > pEndNd->GetIndex() )
152                     {
153                         if( !pSttNd->IsSectionNode() )
154                             pInvalidNode = pSttNd;
155                         pSttNd = pSttNd->StartOfSectionNode();
156                     }
157                     if( pInvalidNode )
158                     {
159                         if( bMoveDown )
160                         {
161                             rPtIdx.Assign( *pInvalidNode->EndOfSectionNode(), 1 );
162 
163                             if( !rPtIdx.GetNode().IsCntntNode() &&
164                                 ( !pDoc->GetNodes().GoNextSection( &rPtIdx ) ||
165                                   rPtIdx > pOldSttNd->EndOfSectionIndex() ) )
166                                 break;
167                         }
168                         else
169                         {
170                             rPtIdx.Assign( *pInvalidNode, -1 );
171 
172                             if( !rPtIdx.GetNode().IsCntntNode() &&
173                                 ( !pDoc->GetNodes().GoPrevSection( &rPtIdx ) ||
174                                   rPtIdx < *pOldSttNd ) )
175                                 break;
176                         }
177                     }
178                     else
179                         bValidPos = sal_True;
180                 } while ( pInvalidNode );
181             }
182 
183             if( bValidPos )
184             {
185                 SwCntntNode* pCNd = GetCntntNode();
186                 sal_uInt16 nCnt = 0;
187                 if( pCNd && !bMoveDown )
188                     nCnt = pCNd->Len();
189                 GetPoint()->nContent.Assign( pCNd, nCnt );
190             }
191             else
192             {
193                 rPtIdx = GetSavePos()->nNode;
194                 GetPoint()->nContent.Assign( GetCntntNode(), GetSavePos()->nCntnt );
195                 return sal_True;
196             }
197         }
198     }
199     return SwCursor::IsSelOvr( eFlags );
200 }
201 
202 
203 /*  */
204 
SwUnoTableCrsr(const SwPosition & rPos)205 SwUnoTableCrsr::SwUnoTableCrsr(const SwPosition& rPos)
206     : SwCursor(rPos,0,false), SwUnoCrsr(rPos), SwTableCursor(rPos), aTblSel(rPos,0,false)
207 {
208     SetRemainInSection(sal_False);
209 }
210 
~SwUnoTableCrsr()211 SwUnoTableCrsr::~SwUnoTableCrsr()
212 {
213     while( aTblSel.GetNext() != &aTblSel )
214         delete aTblSel.GetNext();           // und loeschen
215 }
216 
217 
218 /*
219 SwCursor* SwUnoTableCrsr::Create( SwPaM* pRing ) const
220 {
221     return SwUnoCrsr::Create( pRing );
222 }
223 */
224 
IsSelOvr(int eFlags)225 sal_Bool SwUnoTableCrsr::IsSelOvr( int eFlags )
226 {
227     sal_Bool bRet = SwUnoCrsr::IsSelOvr( eFlags );
228     if( !bRet )
229     {
230         const SwTableNode* pTNd = GetPoint()->nNode.GetNode().FindTableNode();
231         bRet = !(pTNd == GetDoc()->GetNodes()[ GetSavePos()->nNode ]->
232                 FindTableNode() && (!HasMark() ||
233                 pTNd == GetMark()->nNode.GetNode().FindTableNode() ));
234     }
235     return bRet;
236 }
237 
MakeBoxSels()238 void SwUnoTableCrsr::MakeBoxSels()
239 {
240     const SwCntntNode* pCNd;
241     bool bMakeTblCrsrs = true;
242     if( GetPoint()->nNode.GetIndex() && GetMark()->nNode.GetIndex() &&
243             0 != ( pCNd = GetCntntNode() ) && pCNd->getLayoutFrm( pCNd->GetDoc()->GetCurrentLayout() ) &&
244             0 != ( pCNd = GetCntntNode(sal_False) ) && pCNd->getLayoutFrm( pCNd->GetDoc()->GetCurrentLayout() ) )
245         bMakeTblCrsrs = GetDoc()->GetCurrentLayout()->MakeTblCrsrs( *this );
246 
247     if ( !bMakeTblCrsrs )
248     {
249         SwSelBoxes& rTmpBoxes = (SwSelBoxes&)GetBoxes();
250         sal_uInt16 nCount = 0;
251         while( nCount < rTmpBoxes.Count() )
252             DeleteBox( nCount );
253     }
254 
255     if( IsChgd() )
256     {
257         SwTableCursor::MakeBoxSels( &aTblSel );
258         if( !GetBoxesCount() )
259         {
260             const SwTableBox* pBox;
261             const SwNode* pBoxNd = GetPoint()->nNode.GetNode().FindTableBoxStartNode();
262             const SwTableNode* pTblNd = pBoxNd ? pBoxNd->FindTableNode() : 0;
263             if( pTblNd && 0 != ( pBox = pTblNd->GetTable().GetTblBox( pBoxNd->GetIndex() )) )
264                 InsertBox( *pBox );
265         }
266     }
267 }
268 
269