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 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 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 71 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 82 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 97 bool SwUnoCrsr::IsReadOnlyAvailable() const 98 { 99 return true; 100 } 101 102 const SwCntntFrm* 103 SwUnoCrsr::DoSetBidiLevelLeftRight( sal_Bool &, sal_Bool, sal_Bool ) 104 { 105 return 0; // not for uno cursor 106 } 107 108 void SwUnoCrsr::DoSetBidiLevelUpDown() 109 { 110 return; // not for uno cursor 111 } 112 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 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 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 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 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