Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <hintids.hxx>
21 : #include <comphelper/string.hxx>
22 : #include <svl/itemiter.hxx>
23 : #include <editeng/lrspitem.hxx>
24 : #include <editeng/adjustitem.hxx>
25 : #include <editeng/formatbreakitem.hxx>
26 : #include <svx/svdobj.hxx>
27 : #include <crsrsh.hxx>
28 : #include <doc.hxx>
29 : #include <IDocumentUndoRedo.hxx>
30 : #include <IDocumentRedlineAccess.hxx>
31 : #include <IDocumentFieldsAccess.hxx>
32 : #include <IDocumentLayoutAccess.hxx>
33 : #include <pagefrm.hxx>
34 : #include <cntfrm.hxx>
35 : #include <rootfrm.hxx>
36 : #include <pam.hxx>
37 : #include <ndtxt.hxx>
38 : #include <fldbas.hxx>
39 : #include <swtable.hxx>
40 : #include <docary.hxx>
41 : #include <txtfld.hxx>
42 : #include <fmtfld.hxx>
43 : #include <txtftn.hxx>
44 : #include <txtinet.hxx>
45 : #include <fmtinfmt.hxx>
46 : #include <txttxmrk.hxx>
47 : #include <frmfmt.hxx>
48 : #include <flyfrm.hxx>
49 : #include <viscrs.hxx>
50 : #include <callnk.hxx>
51 : #include <doctxm.hxx>
52 : #include <docfld.hxx>
53 : #include <expfld.hxx>
54 : #include <reffld.hxx>
55 : #include <flddat.hxx>
56 : #include <cellatr.hxx>
57 : #include <swundo.hxx>
58 : #include <redline.hxx>
59 : #include <fmtcntnt.hxx>
60 : #include <fmthdft.hxx>
61 : #include <pagedesc.hxx>
62 : #include <fesh.hxx>
63 : #include <charfmt.hxx>
64 : #include <fmturl.hxx>
65 : #include "txtfrm.hxx"
66 : #include <wrong.hxx>
67 : #include <calbck.hxx>
68 : #include <vcl/window.hxx>
69 : #include <docufld.hxx>
70 :
71 : using namespace ::com::sun::star;
72 :
73 0 : void SwCrsrShell::MoveCrsrToNum()
74 : {
75 0 : SwCallLink aLk( *this ); // watch Crsr-Moves
76 0 : SwCrsrSaveState aSaveState( *m_pCurCrsr );
77 0 : if( ActionPend() )
78 0 : return;
79 0 : SET_CURR_SHELL( this );
80 : // try to set cursor onto this position, at half of the char-
81 : // SRectangle's height
82 0 : Point aPt( m_pCurCrsr->GetPtPos() );
83 0 : SwContentFrm * pFrm = m_pCurCrsr->GetContentNode()->getLayoutFrm( GetLayout(), &aPt,
84 0 : m_pCurCrsr->GetPoint() );
85 0 : pFrm->GetCharRect( m_aCharRect, *m_pCurCrsr->GetPoint() );
86 0 : pFrm->Calc();
87 0 : if( pFrm->IsVertical() )
88 : {
89 0 : aPt.setX(m_aCharRect.Center().getX());
90 0 : aPt.setY(pFrm->Frm().Top() + GetUpDownX());
91 : }
92 : else
93 : {
94 0 : aPt.setY(m_aCharRect.Center().getY());
95 0 : aPt.setX(pFrm->Frm().Left() + GetUpDownX());
96 : }
97 0 : pFrm->GetCrsrOfst( m_pCurCrsr->GetPoint(), aPt );
98 0 : if ( !m_pCurCrsr->IsSelOvr( nsSwCursorSelOverFlags::SELOVER_TOGGLE |
99 0 : nsSwCursorSelOverFlags::SELOVER_CHANGEPOS ))
100 : {
101 : UpdateCrsr(SwCrsrShell::UPDOWN |
102 : SwCrsrShell::SCROLLWIN | SwCrsrShell::CHKRANGE |
103 0 : SwCrsrShell::READONLY );
104 0 : }
105 : }
106 :
107 : /// go to next/previous point on the same level
108 0 : bool SwCrsrShell::GotoNextNum()
109 : {
110 0 : if (!SwDoc::GotoNextNum( *m_pCurCrsr->GetPoint() ))
111 0 : return false;
112 0 : MoveCrsrToNum();
113 0 : return true;
114 : }
115 :
116 0 : bool SwCrsrShell::GotoPrevNum()
117 : {
118 0 : if (!SwDoc::GotoPrevNum( *m_pCurCrsr->GetPoint() ))
119 0 : return false;
120 0 : MoveCrsrToNum();
121 0 : return true;
122 : }
123 :
124 : /// jump from content to header
125 0 : bool SwCrsrShell::GotoHeaderText()
126 : {
127 0 : const SwFrm* pFrm = GetCurrFrm()->FindPageFrm();
128 0 : while( pFrm && !pFrm->IsHeaderFrm() )
129 0 : pFrm = pFrm->GetLower();
130 : // found header, search 1. content frame
131 0 : while( pFrm && !pFrm->IsContentFrm() )
132 0 : pFrm = pFrm->GetLower();
133 :
134 0 : if( pFrm )
135 : {
136 0 : SET_CURR_SHELL( this );
137 : // get header frame
138 0 : SwCallLink aLk( *this ); // watch Crsr-Moves
139 0 : SwCursor *pTmpCrsr = getShellCrsr( true );
140 0 : SwCrsrSaveState aSaveState( *pTmpCrsr );
141 0 : pFrm->Calc();
142 0 : Point aPt( pFrm->Frm().Pos() + pFrm->Prt().Pos() );
143 0 : pFrm->GetCrsrOfst( pTmpCrsr->GetPoint(), aPt );
144 0 : if( !pTmpCrsr->IsSelOvr() )
145 0 : UpdateCrsr();
146 : else
147 0 : pFrm = 0;
148 : }
149 0 : return 0 != pFrm;
150 : }
151 :
152 : /// jump from content to footer
153 0 : bool SwCrsrShell::GotoFooterText()
154 : {
155 0 : const SwPageFrm* pFrm = GetCurrFrm()->FindPageFrm();
156 0 : if( pFrm )
157 : {
158 0 : const SwFrm* pLower = pFrm->GetLastLower();
159 :
160 0 : while( pLower && !pLower->IsFooterFrm() )
161 0 : pLower = pLower->GetLower();
162 : // found footer, search 1. content frame
163 0 : while( pLower && !pLower->IsContentFrm() )
164 0 : pLower = pLower->GetLower();
165 :
166 0 : if( pLower )
167 : {
168 0 : SwCursor *pTmpCrsr = getShellCrsr( true );
169 0 : SET_CURR_SHELL( this );
170 : // get position in footer
171 0 : SwCallLink aLk( *this ); // watch Crsr-Moves
172 0 : SwCrsrSaveState aSaveState( *pTmpCrsr );
173 0 : pLower->Calc();
174 0 : Point aPt( pLower->Frm().Pos() + pLower->Prt().Pos() );
175 0 : pLower->GetCrsrOfst( pTmpCrsr->GetPoint(), aPt );
176 0 : if( !pTmpCrsr->IsSelOvr() )
177 0 : UpdateCrsr();
178 : else
179 0 : pFrm = 0;
180 : }
181 : else
182 0 : pFrm = 0;
183 : }
184 : else
185 0 : pFrm = 0;
186 0 : return 0 != pFrm;
187 : }
188 :
189 0 : bool SwCrsrShell::SetCrsrInHdFt( size_t nDescNo, bool bInHeader )
190 : {
191 0 : bool bRet = false;
192 0 : SwDoc *pMyDoc = GetDoc();
193 0 : const SwPageDesc* pDesc = NULL;
194 :
195 0 : SET_CURR_SHELL( this );
196 :
197 0 : if( SIZE_MAX == nDescNo )
198 : {
199 : // take the current one
200 0 : const SwPageFrm* pPage = GetCurrFrm()->FindPageFrm();
201 0 : if( pPage && pMyDoc->ContainsPageDesc(
202 0 : pPage->GetPageDesc(), &nDescNo) )
203 0 : pDesc = pPage->GetPageDesc();
204 : }
205 : else
206 0 : if (nDescNo < pMyDoc->GetPageDescCnt())
207 0 : pDesc = &pMyDoc->GetPageDesc( nDescNo );
208 :
209 0 : if( pDesc )
210 : {
211 : // check if the attribute exists
212 0 : const SwFormatContent* pCnt = 0;
213 0 : if( bInHeader )
214 : {
215 : // mirrored pages? ignore for now
216 0 : const SwFormatHeader& rHd = pDesc->GetMaster().GetHeader();
217 0 : if( rHd.GetHeaderFormat() )
218 0 : pCnt = &rHd.GetHeaderFormat()->GetContent();
219 : }
220 : else
221 : {
222 0 : const SwFormatFooter& rFt = pDesc->GetMaster().GetFooter();
223 0 : if( rFt.GetFooterFormat() )
224 0 : pCnt = &rFt.GetFooterFormat()->GetContent();
225 : }
226 :
227 0 : if( pCnt && pCnt->GetContentIdx() )
228 : {
229 0 : SwNodeIndex aIdx( *pCnt->GetContentIdx(), 1 );
230 0 : SwContentNode* pCNd = aIdx.GetNode().GetContentNode();
231 0 : if( !pCNd )
232 0 : pCNd = pMyDoc->GetNodes().GoNext( &aIdx );
233 :
234 0 : Point aPt( m_pCurCrsr->GetPtPos() );
235 :
236 0 : if( pCNd && 0 != pCNd->getLayoutFrm( GetLayout(), &aPt, 0, false ) )
237 : {
238 : // then we can set the cursor in here
239 0 : SwCallLink aLk( *this ); // watch Crsr-Moves
240 0 : SwCrsrSaveState aSaveState( *m_pCurCrsr );
241 :
242 0 : ClearMark();
243 :
244 0 : SwPosition& rPos = *m_pCurCrsr->GetPoint();
245 0 : rPos.nNode = *pCNd;
246 0 : rPos.nContent.Assign( pCNd, 0 );
247 :
248 0 : bRet = !m_pCurCrsr->IsSelOvr();
249 0 : if( bRet )
250 : UpdateCrsr( SwCrsrShell::SCROLLWIN | SwCrsrShell::CHKRANGE |
251 0 : SwCrsrShell::READONLY );
252 0 : }
253 : }
254 : }
255 0 : return bRet;
256 : }
257 :
258 : /// jump to the next index
259 0 : bool SwCrsrShell::GotoNextTOXBase( const OUString* pName )
260 : {
261 0 : bool bRet = false;
262 :
263 0 : const SwSectionFormats& rFormats = GetDoc()->GetSections();
264 0 : SwContentNode* pFnd = 0;
265 0 : for( SwSectionFormats::size_type n = rFormats.size(); n; )
266 : {
267 0 : const SwSection* pSect = rFormats[ --n ]->GetSection();
268 0 : if (TOX_CONTENT_SECTION == pSect->GetType())
269 : {
270 : SwSectionNode const*const pSectNd(
271 0 : pSect->GetFormat()->GetSectionNode());
272 0 : if ( pSectNd
273 0 : && m_pCurCrsr->GetPoint()->nNode < pSectNd->GetIndex()
274 0 : && (!pFnd || pFnd->GetIndex() > pSectNd->GetIndex())
275 0 : && (!pName || *pName ==
276 0 : static_cast<SwTOXBaseSection const*>(pSect)->GetTOXName()))
277 : {
278 0 : SwNodeIndex aIdx(*pSectNd, 1);
279 0 : SwContentNode* pCNd = aIdx.GetNode().GetContentNode();
280 0 : if (!pCNd)
281 0 : pCNd = GetDoc()->GetNodes().GoNext( &aIdx );
282 0 : if (pCNd &&
283 0 : pCNd->EndOfSectionIndex() <= pSectNd->EndOfSectionIndex())
284 : {
285 : SwContentFrm const*const pCFrm(
286 0 : pCNd->getLayoutFrm(GetLayout()));
287 0 : if (pCFrm &&
288 0 : (IsReadOnlyAvailable() || !pCFrm->IsProtected()))
289 : {
290 0 : pFnd = pCNd;
291 : }
292 0 : }
293 : }
294 : }
295 : }
296 0 : if( pFnd )
297 : {
298 0 : SwCallLink aLk( *this ); // watch Crsr-Moves
299 0 : SwCrsrSaveState aSaveState( *m_pCurCrsr );
300 0 : m_pCurCrsr->GetPoint()->nNode = *pFnd;
301 0 : m_pCurCrsr->GetPoint()->nContent.Assign( pFnd, 0 );
302 0 : bRet = !m_pCurCrsr->IsSelOvr();
303 0 : if( bRet )
304 0 : UpdateCrsr(SwCrsrShell::SCROLLWIN|SwCrsrShell::CHKRANGE|SwCrsrShell::READONLY);
305 : }
306 0 : return bRet;
307 : }
308 :
309 : /// jump to previous index
310 0 : bool SwCrsrShell::GotoPrevTOXBase( const OUString* pName )
311 : {
312 0 : bool bRet = false;
313 :
314 0 : const SwSectionFormats& rFormats = GetDoc()->GetSections();
315 0 : SwContentNode* pFnd = 0;
316 0 : for( SwSectionFormats::size_type n = rFormats.size(); n; )
317 : {
318 0 : const SwSection* pSect = rFormats[ --n ]->GetSection();
319 0 : if (TOX_CONTENT_SECTION == pSect->GetType())
320 : {
321 : SwSectionNode const*const pSectNd(
322 0 : pSect->GetFormat()->GetSectionNode());
323 0 : if ( pSectNd
324 0 : && m_pCurCrsr->GetPoint()->nNode > pSectNd->EndOfSectionIndex()
325 0 : && (!pFnd || pFnd->GetIndex() < pSectNd->GetIndex())
326 0 : && (!pName || *pName ==
327 0 : static_cast<SwTOXBaseSection const*>(pSect)->GetTOXName()))
328 : {
329 0 : SwNodeIndex aIdx(*pSectNd, 1);
330 0 : SwContentNode* pCNd = aIdx.GetNode().GetContentNode();
331 0 : if (!pCNd)
332 0 : pCNd = GetDoc()->GetNodes().GoNext( &aIdx );
333 0 : if (pCNd &&
334 0 : pCNd->EndOfSectionIndex() <= pSectNd->EndOfSectionIndex())
335 : {
336 : SwContentFrm const*const pCFrm(
337 0 : pCNd->getLayoutFrm(GetLayout()));
338 0 : if (pCFrm &&
339 0 : (IsReadOnlyAvailable() || !pCFrm->IsProtected()))
340 : {
341 0 : pFnd = pCNd;
342 : }
343 0 : }
344 : }
345 : }
346 : }
347 :
348 0 : if( pFnd )
349 : {
350 0 : SwCallLink aLk( *this ); // watch Crsr-Moves
351 0 : SwCrsrSaveState aSaveState( *m_pCurCrsr );
352 0 : m_pCurCrsr->GetPoint()->nNode = *pFnd;
353 0 : m_pCurCrsr->GetPoint()->nContent.Assign( pFnd, 0 );
354 0 : bRet = !m_pCurCrsr->IsSelOvr();
355 0 : if( bRet )
356 0 : UpdateCrsr(SwCrsrShell::SCROLLWIN|SwCrsrShell::CHKRANGE|SwCrsrShell::READONLY);
357 : }
358 0 : return bRet;
359 : }
360 :
361 : /// jump to index of TOXMark
362 0 : bool SwCrsrShell::GotoTOXMarkBase()
363 : {
364 0 : bool bRet = false;
365 :
366 0 : SwTOXMarks aMarks;
367 0 : sal_uInt16 nCnt = SwDoc::GetCurTOXMark( *m_pCurCrsr->GetPoint(), aMarks );
368 0 : if( nCnt )
369 : {
370 : // Take the 1. and get the index type. Search in its dependency list
371 : // for the actual index
372 0 : const SwTOXType* pType = aMarks[0]->GetTOXType();
373 0 : SwIterator<SwTOXBase,SwTOXType> aIter( *pType );
374 : const SwSectionNode* pSectNd;
375 : const SwSectionFormat* pSectFormat;
376 :
377 0 : for( SwTOXBase* pTOX = aIter.First(); pTOX; pTOX = aIter.Next() )
378 : {
379 0 : if( pTOX->ISA( SwTOXBaseSection ) &&
380 0 : 0 != ( pSectFormat = static_cast<SwTOXBaseSection*>(pTOX)->GetFormat() ) &&
381 : 0 != ( pSectNd = pSectFormat->GetSectionNode() ))
382 : {
383 0 : SwNodeIndex aIdx( *pSectNd, 1 );
384 0 : SwContentNode* pCNd = aIdx.GetNode().GetContentNode();
385 0 : if( !pCNd )
386 0 : pCNd = GetDoc()->GetNodes().GoNext( &aIdx );
387 : const SwContentFrm* pCFrm;
388 0 : if( pCNd &&
389 0 : pCNd->EndOfSectionIndex() < pSectNd->EndOfSectionIndex() &&
390 0 : 0 != ( pCFrm = pCNd->getLayoutFrm( GetLayout() ) ) &&
391 0 : ( IsReadOnlyAvailable() || !pCFrm->IsProtected() ))
392 : {
393 0 : SwCallLink aLk( *this ); // watch Crsr-Moves
394 0 : SwCrsrSaveState aSaveState( *m_pCurCrsr );
395 0 : m_pCurCrsr->GetPoint()->nNode = *pCNd;
396 0 : m_pCurCrsr->GetPoint()->nContent.Assign( pCNd, 0 );
397 0 : bRet = !m_pCurCrsr->IsInProtectTable() &&
398 0 : !m_pCurCrsr->IsSelOvr();
399 0 : if( bRet )
400 0 : UpdateCrsr(SwCrsrShell::SCROLLWIN|SwCrsrShell::CHKRANGE|SwCrsrShell::READONLY);
401 0 : break;
402 0 : }
403 : }
404 0 : }
405 : }
406 0 : return bRet;
407 : }
408 :
409 : /// Jump to next/previous table formula
410 : /// Optionally it is possible to also jump to broken formulas
411 0 : bool SwCrsrShell::GotoNxtPrvTableFormula( bool bNext, bool bOnlyErrors )
412 : {
413 0 : if( IsTableMode() )
414 0 : return false;
415 :
416 0 : bool bFnd = false;
417 0 : SwPosition& rPos = *m_pCurCrsr->GetPoint();
418 :
419 0 : Point aPt;
420 0 : SwPosition aFndPos( GetDoc()->GetNodes().GetEndOfContent() );
421 0 : if( !bNext )
422 0 : aFndPos.nNode = 0;
423 0 : _SetGetExpField aFndGEF( aFndPos ), aCurGEF( rPos );
424 :
425 : {
426 0 : const SwNode* pSttNd = rPos.nNode.GetNode().FindTableBoxStartNode();
427 0 : if( pSttNd )
428 : {
429 0 : const SwTableBox* pTBox = pSttNd->FindTableNode()->GetTable().
430 0 : GetTableBox( pSttNd->GetIndex() );
431 0 : if( pTBox )
432 0 : aCurGEF = _SetGetExpField( *pTBox );
433 : }
434 : }
435 :
436 0 : if( rPos.nNode < GetDoc()->GetNodes().GetEndOfExtras() )
437 : // also at collection use only the first frame
438 0 : aCurGEF.SetBodyPos( *rPos.nNode.GetNode().GetContentNode()->getLayoutFrm( GetLayout(),
439 0 : &aPt, &rPos, false ) );
440 : {
441 : const SfxPoolItem* pItem;
442 : const SwTableBox* pTBox;
443 0 : sal_uInt32 n, nMaxItems = GetDoc()->GetAttrPool().GetItemCount2( RES_BOXATR_FORMULA );
444 :
445 0 : for( n = 0; n < nMaxItems; ++n )
446 0 : if( 0 != (pItem = GetDoc()->GetAttrPool().GetItem2(
447 0 : RES_BOXATR_FORMULA, n ) ) &&
448 0 : 0 != (pTBox = static_cast<const SwTableBoxFormula*>(pItem)->GetTableBox() ) &&
449 0 : pTBox->GetSttNd() &&
450 0 : pTBox->GetSttNd()->GetNodes().IsDocNodes() &&
451 0 : ( !bOnlyErrors ||
452 0 : !static_cast<const SwTableBoxFormula*>(pItem)->HasValidBoxes() ) )
453 : {
454 : const SwContentFrm* pCFrm;
455 0 : SwNodeIndex aIdx( *pTBox->GetSttNd() );
456 0 : const SwContentNode* pCNd = GetDoc()->GetNodes().GoNext( &aIdx );
457 0 : if( pCNd && 0 != ( pCFrm = pCNd->getLayoutFrm( GetLayout(), &aPt, 0, false ) ) &&
458 0 : (IsReadOnlyAvailable() || !pCFrm->IsProtected() ))
459 : {
460 0 : _SetGetExpField aCmp( *pTBox );
461 0 : aCmp.SetBodyPos( *pCFrm );
462 :
463 0 : if( bNext ? ( aCurGEF < aCmp && aCmp < aFndGEF )
464 0 : : ( aCmp < aCurGEF && aFndGEF < aCmp ))
465 : {
466 0 : aFndGEF = aCmp;
467 0 : bFnd = true;
468 : }
469 0 : }
470 : }
471 : }
472 :
473 0 : if( bFnd )
474 : {
475 0 : SET_CURR_SHELL( this );
476 0 : SwCallLink aLk( *this ); // watch Crsr-Moves
477 0 : SwCrsrSaveState aSaveState( *m_pCurCrsr );
478 :
479 0 : aFndGEF.GetPosOfContent( rPos );
480 0 : m_pCurCrsr->DeleteMark();
481 :
482 0 : bFnd = !m_pCurCrsr->IsSelOvr();
483 0 : if( bFnd )
484 : UpdateCrsr( SwCrsrShell::SCROLLWIN | SwCrsrShell::CHKRANGE |
485 0 : SwCrsrShell::READONLY );
486 : }
487 0 : return bFnd;
488 : }
489 :
490 : /// jump to next/previous index marker
491 0 : bool SwCrsrShell::GotoNxtPrvTOXMark( bool bNext )
492 : {
493 0 : if( IsTableMode() )
494 0 : return false;
495 :
496 0 : bool bFnd = false;
497 0 : SwPosition& rPos = *m_pCurCrsr->GetPoint();
498 :
499 0 : Point aPt;
500 0 : SwPosition aFndPos( GetDoc()->GetNodes().GetEndOfContent() );
501 0 : if( !bNext )
502 0 : aFndPos.nNode = 0;
503 0 : _SetGetExpField aFndGEF( aFndPos ), aCurGEF( rPos );
504 :
505 0 : if( rPos.nNode.GetIndex() < GetDoc()->GetNodes().GetEndOfExtras().GetIndex() )
506 : // also at collection use only the first frame
507 0 : aCurGEF.SetBodyPos( *rPos.nNode.GetNode().
508 0 : GetContentNode()->getLayoutFrm( GetLayout(), &aPt, &rPos, false ) );
509 :
510 : {
511 : const SwTextNode* pTextNd;
512 : const SwTextTOXMark* pTextTOX;
513 0 : sal_uInt32 n, nMaxItems = GetDoc()->GetAttrPool().GetItemCount2( RES_TXTATR_TOXMARK );
514 :
515 0 : for( n = 0; n < nMaxItems; ++n )
516 : {
517 : const SfxPoolItem* pItem;
518 : const SwContentFrm* pCFrm;
519 :
520 0 : if( 0 != (pItem = GetDoc()->GetAttrPool().GetItem2(
521 0 : RES_TXTATR_TOXMARK, n ) ) &&
522 0 : 0 != (pTextTOX = static_cast<const SwTOXMark*>(pItem)->GetTextTOXMark() ) &&
523 0 : ( pTextNd = &pTextTOX->GetTextNode())->GetNodes().IsDocNodes() &&
524 0 : 0 != ( pCFrm = pTextNd->getLayoutFrm( GetLayout(), &aPt, 0, false )) &&
525 0 : ( IsReadOnlyAvailable() || !pCFrm->IsProtected() ))
526 : {
527 0 : SwNodeIndex aNdIndex( *pTextNd ); // UNIX needs this object
528 0 : _SetGetExpField aCmp( aNdIndex, *pTextTOX, 0 );
529 0 : aCmp.SetBodyPos( *pCFrm );
530 :
531 0 : if( bNext ? ( aCurGEF < aCmp && aCmp < aFndGEF )
532 0 : : ( aCmp < aCurGEF && aFndGEF < aCmp ))
533 : {
534 0 : aFndGEF = aCmp;
535 0 : bFnd = true;
536 0 : }
537 : }
538 : }
539 : }
540 :
541 0 : if( bFnd )
542 : {
543 0 : SET_CURR_SHELL( this );
544 0 : SwCallLink aLk( *this ); // watch Crsr-Moves
545 0 : SwCrsrSaveState aSaveState( *m_pCurCrsr );
546 :
547 0 : aFndGEF.GetPosOfContent( rPos );
548 :
549 0 : bFnd = !m_pCurCrsr->IsSelOvr();
550 0 : if( bFnd )
551 : UpdateCrsr( SwCrsrShell::SCROLLWIN | SwCrsrShell::CHKRANGE |
552 0 : SwCrsrShell::READONLY );
553 : }
554 0 : return bFnd;
555 : }
556 :
557 : /// traveling between marks
558 0 : const SwTOXMark& SwCrsrShell::GotoTOXMark( const SwTOXMark& rStart,
559 : SwTOXSearch eDir )
560 : {
561 0 : SET_CURR_SHELL( this );
562 0 : SwCallLink aLk( *this ); // watch Crsr-Moves
563 0 : SwCrsrSaveState aSaveState( *m_pCurCrsr );
564 :
565 : const SwTOXMark& rNewMark = GetDoc()->GotoTOXMark( rStart, eDir,
566 0 : IsReadOnlyAvailable() );
567 : // set position
568 0 : SwPosition& rPos = *GetCrsr()->GetPoint();
569 0 : rPos.nNode = rNewMark.GetTextTOXMark()->GetTextNode();
570 0 : rPos.nContent.Assign( rPos.nNode.GetNode().GetContentNode(),
571 0 : rNewMark.GetTextTOXMark()->GetStart() );
572 :
573 0 : if( !m_pCurCrsr->IsSelOvr() )
574 : UpdateCrsr( SwCrsrShell::SCROLLWIN | SwCrsrShell::CHKRANGE |
575 0 : SwCrsrShell::READONLY );
576 :
577 0 : return rNewMark;
578 : }
579 :
580 : /// jump to next/previous field type
581 0 : void lcl_MakeFieldLst(
582 : _SetGetExpFields& rLst,
583 : const SwFieldType& rFieldType,
584 : const bool bInReadOnly,
585 : const bool bChkInpFlag = false )
586 : {
587 : // always search the 1. frame
588 0 : Point aPt;
589 0 : SwTextField* pTextField = NULL;
590 0 : SwIterator<SwFormatField,SwFieldType> aIter(rFieldType);
591 0 : for( SwFormatField* pFormatField = aIter.First(); pFormatField; pFormatField = aIter.Next() )
592 : {
593 0 : pTextField = pFormatField->GetTextField();
594 0 : if ( pTextField != NULL
595 0 : && ( !bChkInpFlag
596 0 : || static_cast<const SwSetExpField*>(pTextField->GetFormatField().GetField())->GetInputFlag() ) )
597 : {
598 0 : const SwTextNode& rTextNode = pTextField->GetTextNode();
599 : const SwContentFrm* pCFrm =
600 0 : rTextNode.getLayoutFrm( rTextNode.GetDoc()->getIDocumentLayoutAccess().GetCurrentLayout(), &aPt, 0, false );
601 0 : if ( pCFrm != NULL
602 0 : && ( bInReadOnly || !pCFrm->IsProtected() ) )
603 : {
604 0 : _SetGetExpField* pNew = new _SetGetExpField( SwNodeIndex( rTextNode ), pTextField );
605 0 : pNew->SetBodyPos( *pCFrm );
606 0 : rLst.insert( pNew );
607 : }
608 : }
609 0 : }
610 0 : }
611 :
612 : static _SetGetExpFields::const_iterator
613 0 : lcl_FindField(bool & o_rFound, _SetGetExpFields const& rSrtLst,
614 : SwRootFrm *const pLayout, SwTextNode *const pTextNode,
615 : SwTextField *const pTextField, SwPosition const& rPos,
616 : sal_Int32 const nContentOffset)
617 : {
618 0 : boost::scoped_ptr<_SetGetExpField> pSrch;
619 0 : boost::scoped_ptr<SwIndex> pIndex;
620 0 : if (-1 == nContentOffset)
621 : {
622 0 : pSrch.reset(new _SetGetExpField(rPos.nNode, pTextField, &rPos.nContent));
623 : }
624 : else
625 : {
626 0 : pIndex.reset(new SwIndex(rPos.nNode.GetNode().GetContentNode(), nContentOffset));
627 0 : pSrch.reset(new _SetGetExpField(rPos.nNode, pTextField, pIndex.get()));
628 : }
629 :
630 0 : if (rPos.nNode.GetIndex() < pTextNode->GetNodes().GetEndOfExtras().GetIndex())
631 : {
632 : // also at collection use only the first frame
633 0 : Point aPt;
634 0 : pSrch->SetBodyPos(*pTextNode->getLayoutFrm(pLayout, &aPt, &rPos, false));
635 : }
636 :
637 0 : _SetGetExpFields::const_iterator it = rSrtLst.lower_bound(pSrch.get());
638 :
639 0 : o_rFound = (it != rSrtLst.end()) && (**it == *pSrch);
640 0 : return it;
641 : }
642 :
643 0 : bool SwCrsrShell::MoveFieldType(
644 : const SwFieldType* pFieldType,
645 : const bool bNext,
646 : const sal_uInt16 nResType,
647 : const bool bAddSetExpressionFieldsToInputFields )
648 : {
649 : // sorted list of all fields
650 0 : _SetGetExpFields aSrtLst;
651 :
652 0 : if ( pFieldType )
653 : {
654 0 : if( RES_INPUTFLD != pFieldType->Which() && !pFieldType->HasWriterListeners() )
655 : {
656 0 : return false;
657 : }
658 :
659 : // found Modify object, add all fields to array
660 0 : ::lcl_MakeFieldLst( aSrtLst, *pFieldType, IsReadOnlyAvailable() );
661 :
662 0 : if( RES_INPUTFLD == pFieldType->Which() && bAddSetExpressionFieldsToInputFields )
663 : {
664 : // there are hidden input fields in the set exp. fields
665 0 : const SwFieldTypes& rFieldTypes = *mpDoc->getIDocumentFieldsAccess().GetFieldTypes();
666 0 : const size_t nSize = rFieldTypes.size();
667 0 : for( size_t i=0; i < nSize; ++i )
668 : {
669 0 : pFieldType = rFieldTypes[ i ];
670 0 : if ( RES_SETEXPFLD == pFieldType->Which() )
671 : {
672 0 : ::lcl_MakeFieldLst( aSrtLst, *pFieldType, IsReadOnlyAvailable(), true );
673 : }
674 : }
675 : }
676 : }
677 : else
678 : {
679 0 : const SwFieldTypes& rFieldTypes = *mpDoc->getIDocumentFieldsAccess().GetFieldTypes();
680 0 : const size_t nSize = rFieldTypes.size();
681 0 : for( size_t i=0; i < nSize; ++i )
682 : {
683 0 : pFieldType = rFieldTypes[ i ];
684 0 : if( nResType == pFieldType->Which() )
685 : {
686 0 : ::lcl_MakeFieldLst( aSrtLst, *pFieldType, IsReadOnlyAvailable() );
687 : }
688 : }
689 : }
690 :
691 : // found no fields?
692 0 : if( aSrtLst.empty() )
693 0 : return false;
694 :
695 0 : _SetGetExpFields::const_iterator it;
696 0 : SwCursor* pCrsr = getShellCrsr( true );
697 : {
698 : // (1998): Always use field for search so that the right one is found as
699 : // well some are in frames that are anchored to a paragraph that has a
700 : // field
701 0 : const SwPosition& rPos = *pCrsr->GetPoint();
702 :
703 0 : SwTextNode* pTNd = rPos.nNode.GetNode().GetTextNode();
704 : OSL_ENSURE( pTNd, "No ContentNode" );
705 :
706 0 : SwTextField * pTextField = pTNd->GetFieldTextAttrAt( rPos.nContent.GetIndex(), true );
707 0 : const bool bDelField = ( pTextField == NULL );
708 0 : sal_Int32 nContentOffset = -1;
709 :
710 0 : if( bDelField )
711 : {
712 : // create dummy for the search
713 : SwFormatField* pFormatField = new SwFormatField( SwDateTimeField(
714 0 : static_cast<SwDateTimeFieldType*>(mpDoc->getIDocumentFieldsAccess().GetSysFieldType( RES_DATETIMEFLD ) ) ) );
715 :
716 0 : pTextField = new SwTextField( *pFormatField, rPos.nContent.GetIndex(),
717 0 : mpDoc->IsClipBoard() );
718 0 : pTextField->ChgTextNode( pTNd );
719 : }
720 : else
721 : {
722 : // the cursor might be anywhere inside the input field,
723 : // but we will be searching for the field start
724 0 : if (pTextField->Which() == RES_TXTATR_INPUTFIELD
725 0 : && rPos.nContent.GetIndex() != pTextField->GetStart())
726 0 : nContentOffset = pTextField->GetStart();
727 : }
728 : bool isSrch;
729 : it = lcl_FindField(isSrch, aSrtLst,
730 0 : GetLayout(), pTNd, pTextField, rPos, nContentOffset);
731 :
732 0 : if( bDelField )
733 : {
734 0 : delete static_cast<SwFormatField*>(&pTextField->GetAttr());
735 0 : delete pTextField;
736 : }
737 :
738 0 : if( it != aSrtLst.end() && isSrch ) // found
739 : {
740 0 : if( bNext )
741 : {
742 0 : if( ++it == aSrtLst.end() )
743 0 : return false; // already at the end
744 : }
745 : else
746 : {
747 0 : if( it == aSrtLst.begin() )
748 0 : return false; // no more steps backward possible
749 0 : --it;
750 : }
751 : }
752 : else // not found
753 : {
754 0 : if( bNext )
755 : {
756 0 : if( it == aSrtLst.end() )
757 0 : return false;
758 : }
759 : else
760 : {
761 0 : if( it == aSrtLst.begin() )
762 0 : return false; // no more steps backward possible
763 0 : --it;
764 : }
765 : }
766 : }
767 0 : const _SetGetExpField& rFnd = **it;
768 :
769 0 : SET_CURR_SHELL( this );
770 0 : SwCallLink aLk( *this ); // watch Crsr-Moves
771 0 : SwCrsrSaveState aSaveState( *pCrsr );
772 :
773 0 : rFnd.GetPosOfContent( *pCrsr->GetPoint() );
774 : bool bRet = !m_pCurCrsr->IsSelOvr( nsSwCursorSelOverFlags::SELOVER_CHECKNODESSECTION |
775 0 : nsSwCursorSelOverFlags::SELOVER_TOGGLE );
776 0 : if( bRet )
777 0 : UpdateCrsr(SwCrsrShell::SCROLLWIN|SwCrsrShell::CHKRANGE|SwCrsrShell::READONLY);
778 0 : return bRet;
779 : }
780 :
781 0 : bool SwCrsrShell::GotoFormatField( const SwFormatField& rField )
782 : {
783 0 : bool bRet = false;
784 0 : if( rField.GetTextField() )
785 : {
786 0 : SET_CURR_SHELL( this );
787 0 : SwCallLink aLk( *this ); // watch Crsr-Moves
788 :
789 0 : SwCursor* pCrsr = getShellCrsr( true );
790 0 : SwCrsrSaveState aSaveState( *pCrsr );
791 :
792 0 : SwTextNode* pTNd = rField.GetTextField()->GetpTextNode();
793 0 : pCrsr->GetPoint()->nNode = *pTNd;
794 0 : pCrsr->GetPoint()->nContent.Assign( pTNd, rField.GetTextField()->GetStart() );
795 :
796 0 : bRet = !pCrsr->IsSelOvr();
797 0 : if( bRet )
798 0 : UpdateCrsr(SwCrsrShell::SCROLLWIN|SwCrsrShell::CHKRANGE|SwCrsrShell::READONLY);
799 : }
800 0 : return bRet;
801 : }
802 :
803 102422 : SwTextField * SwCrsrShell::GetTextFieldAtPos(
804 : const SwPosition* pPos,
805 : const bool bIncludeInputFieldAtStart )
806 : {
807 102422 : SwTextField* pTextField = NULL;
808 :
809 102422 : SwTextNode * const pNode = pPos->nNode.GetNode().GetTextNode();
810 102422 : if ( pNode != NULL )
811 : {
812 102422 : pTextField = pNode->GetFieldTextAttrAt( pPos->nContent.GetIndex(), bIncludeInputFieldAtStart );
813 : }
814 :
815 102422 : return pTextField;
816 : }
817 :
818 12195 : SwField* SwCrsrShell::GetFieldAtCrsr(
819 : const SwPaM* pCrsr,
820 : const bool bIncludeInputFieldAtStart )
821 : {
822 12195 : SwField* pFieldAtCrsr = NULL;
823 :
824 12195 : SwTextField* pTextField = GetTextFieldAtPos( pCrsr->Start(), bIncludeInputFieldAtStart );
825 12195 : if ( pTextField != NULL
826 12195 : && pCrsr->Start()->nNode == pCrsr->End()->nNode )
827 : {
828 : const sal_Int32 nTextFieldLength =
829 12 : pTextField->End() != NULL
830 0 : ? *(pTextField->End()) - pTextField->GetStart()
831 12 : : 1;
832 12 : if ( ( pCrsr->End()->nContent.GetIndex() - pCrsr->Start()->nContent.GetIndex() ) <= nTextFieldLength )
833 : {
834 12 : pFieldAtCrsr = const_cast<SwField*>(pTextField->GetFormatField().GetField());
835 : }
836 : }
837 :
838 12195 : return pFieldAtCrsr;
839 : }
840 :
841 1390 : SwField* SwCrsrShell::GetCurField( const bool bIncludeInputFieldAtStart ) const
842 : {
843 1390 : SwPaM* pCrsr = GetCrsr();
844 1390 : if ( pCrsr->IsMultiSelection() )
845 : {
846 : // multi selection not handled.
847 4 : return NULL;
848 : }
849 :
850 1386 : SwField* pCurField = GetFieldAtCrsr( pCrsr, bIncludeInputFieldAtStart );;
851 1386 : if ( pCurField != NULL
852 1386 : && RES_TABLEFLD == pCurField->GetTyp()->Which() )
853 : {
854 : // TabellenFormel ? wandel internen in externen Namen um
855 0 : const SwTableNode* pTableNd = IsCrsrInTable();
856 0 : static_cast<SwTableField*>(pCurField)->PtrToBoxNm( pTableNd ? &pTableNd->GetTable() : 0 );
857 : }
858 :
859 1386 : return pCurField;
860 : }
861 :
862 10692 : bool SwCrsrShell::CrsrInsideInputField() const
863 : {
864 21501 : for(SwPaM& rCrsr : GetCrsr()->GetRingContainer())
865 : {
866 10809 : if(dynamic_cast<const SwInputField*>(GetFieldAtCrsr( &rCrsr, false )))
867 0 : return true;
868 : }
869 10692 : return false;
870 : }
871 :
872 1 : bool SwCrsrShell::PosInsideInputField( const SwPosition& rPos )
873 : {
874 1 : return dynamic_cast<const SwTextInputField*>(GetTextFieldAtPos( &rPos, false )) != NULL;
875 : }
876 :
877 0 : bool SwCrsrShell::DocPtInsideInputField( const Point& rDocPt ) const
878 : {
879 0 : SwPosition aPos( *(GetCrsr()->Start()) );
880 0 : Point aDocPt( rDocPt );
881 0 : if ( GetLayout()->GetCrsrOfst( &aPos, aDocPt ) )
882 : {
883 0 : return PosInsideInputField( aPos );
884 : }
885 0 : return false;
886 : }
887 :
888 0 : sal_Int32 SwCrsrShell::StartOfInputFieldAtPos( const SwPosition& rPos )
889 : {
890 0 : const SwTextInputField* pTextInputField = dynamic_cast<const SwTextInputField*>(GetTextFieldAtPos( &rPos, true ));
891 0 : if ( pTextInputField == NULL )
892 : {
893 : OSL_ENSURE( false, "<SwEditShell::StartOfInputFieldAtPos(..)> - no Input Field at given position" );
894 0 : return 0;
895 : }
896 0 : return pTextInputField->GetStart();
897 : }
898 :
899 0 : sal_Int32 SwCrsrShell::EndOfInputFieldAtPos( const SwPosition& rPos )
900 : {
901 0 : const SwTextInputField* pTextInputField = dynamic_cast<const SwTextInputField*>(GetTextFieldAtPos( &rPos, true ));
902 0 : if ( pTextInputField == NULL )
903 : {
904 : OSL_ENSURE( false, "<SwEditShell::EndOfInputFieldAtPos(..)> - no Input Field at given position" );
905 0 : return 0;
906 : }
907 0 : return *(pTextInputField->End());
908 : }
909 :
910 0 : void SwCrsrShell::GotoOutline( sal_uInt16 nIdx )
911 : {
912 0 : SwCursor* pCrsr = getShellCrsr( true );
913 :
914 0 : SET_CURR_SHELL( this );
915 0 : SwCallLink aLk( *this ); // watch Crsr-Moves
916 0 : SwCrsrSaveState aSaveState( *pCrsr );
917 :
918 0 : const SwNodes& rNds = GetDoc()->GetNodes();
919 0 : SwTextNode* pTextNd = rNds.GetOutLineNds()[ nIdx ]->GetTextNode();
920 0 : pCrsr->GetPoint()->nNode = *pTextNd;
921 0 : pCrsr->GetPoint()->nContent.Assign( pTextNd, 0 );
922 :
923 0 : if( !pCrsr->IsSelOvr() )
924 0 : UpdateCrsr(SwCrsrShell::SCROLLWIN|SwCrsrShell::CHKRANGE|SwCrsrShell::READONLY);
925 0 : }
926 :
927 0 : bool SwCrsrShell::GotoOutline( const OUString& rName )
928 : {
929 0 : SwCursor* pCrsr = getShellCrsr( true );
930 :
931 0 : SET_CURR_SHELL( this );
932 0 : SwCallLink aLk( *this ); // watch Crsr-Moves
933 0 : SwCrsrSaveState aSaveState( *pCrsr );
934 :
935 0 : bool bRet = false;
936 0 : if( mpDoc->GotoOutline( *pCrsr->GetPoint(), rName ) && !pCrsr->IsSelOvr() )
937 : {
938 0 : UpdateCrsr(SwCrsrShell::SCROLLWIN|SwCrsrShell::CHKRANGE|SwCrsrShell::READONLY);
939 0 : bRet = true;
940 : }
941 0 : return bRet;
942 : }
943 :
944 : /// jump to next node with outline num.
945 0 : bool SwCrsrShell::GotoNextOutline()
946 : {
947 0 : SwCursor* pCrsr = getShellCrsr( true );
948 0 : const SwNodes& rNds = GetDoc()->GetNodes();
949 :
950 0 : SwNode* pNd = &(pCrsr->GetNode());
951 : sal_uInt16 nPos;
952 0 : if( rNds.GetOutLineNds().Seek_Entry( pNd, &nPos ))
953 0 : ++nPos;
954 :
955 0 : if( nPos == rNds.GetOutLineNds().size() )
956 0 : return false;
957 :
958 0 : pNd = rNds.GetOutLineNds()[ nPos ];
959 :
960 0 : SET_CURR_SHELL( this );
961 0 : SwCallLink aLk( *this ); // watch Crsr-Moves
962 0 : SwCrsrSaveState aSaveState( *pCrsr );
963 0 : pCrsr->GetPoint()->nNode = *pNd;
964 0 : pCrsr->GetPoint()->nContent.Assign( pNd->GetTextNode(), 0 );
965 :
966 0 : bool bRet = !pCrsr->IsSelOvr();
967 0 : if( bRet )
968 0 : UpdateCrsr(SwCrsrShell::SCROLLWIN|SwCrsrShell::CHKRANGE|SwCrsrShell::READONLY);
969 0 : return bRet;
970 : }
971 :
972 : /// jump to previous node with outline num.
973 0 : bool SwCrsrShell::GotoPrevOutline()
974 : {
975 0 : SwCursor* pCrsr = getShellCrsr( true );
976 0 : const SwNodes& rNds = GetDoc()->GetNodes();
977 :
978 0 : SwNode* pNd = &(pCrsr->GetNode());
979 : sal_uInt16 nPos;
980 0 : bool bRet = rNds.GetOutLineNds().Seek_Entry(pNd, &nPos);
981 0 : if (bRet && nPos)
982 : {
983 0 : --nPos; // before
984 :
985 0 : pNd = rNds.GetOutLineNds()[ nPos ];
986 0 : if( pNd->GetIndex() > pCrsr->GetPoint()->nNode.GetIndex() )
987 0 : return false;
988 :
989 0 : SET_CURR_SHELL( this );
990 0 : SwCallLink aLk( *this ); // watch Crsr-Moves
991 0 : SwCrsrSaveState aSaveState( *pCrsr );
992 0 : pCrsr->GetPoint()->nNode = *pNd;
993 0 : pCrsr->GetPoint()->nContent.Assign( pNd->GetTextNode(), 0 );
994 :
995 0 : bRet = !pCrsr->IsSelOvr();
996 0 : if( bRet )
997 0 : UpdateCrsr(SwCrsrShell::SCROLLWIN|SwCrsrShell::CHKRANGE|SwCrsrShell::READONLY);
998 : }
999 0 : return bRet;
1000 : }
1001 :
1002 : /// search "outline position" before previous outline node at given level
1003 0 : sal_uInt16 SwCrsrShell::GetOutlinePos( sal_uInt8 nLevel )
1004 : {
1005 0 : SwPaM* pCrsr = getShellCrsr( true );
1006 0 : const SwNodes& rNds = GetDoc()->GetNodes();
1007 :
1008 0 : SwNode* pNd = &(pCrsr->GetNode());
1009 : sal_uInt16 nPos;
1010 0 : if( rNds.GetOutLineNds().Seek_Entry( pNd, &nPos ))
1011 0 : nPos++; // is at correct position; take next for while
1012 :
1013 0 : while( nPos-- ) // check the one in front of the current
1014 : {
1015 0 : pNd = rNds.GetOutLineNds()[ nPos ];
1016 :
1017 0 : if( pNd->GetTextNode()->GetAttrOutlineLevel()-1 <= nLevel )
1018 0 : return nPos;
1019 :
1020 : }
1021 0 : return USHRT_MAX; // no more left
1022 : }
1023 :
1024 0 : bool SwCrsrShell::MakeOutlineSel( sal_uInt16 nSttPos, sal_uInt16 nEndPos,
1025 : bool bWithChildren )
1026 : {
1027 0 : const SwNodes& rNds = GetDoc()->GetNodes();
1028 0 : const SwOutlineNodes& rOutlNds = rNds.GetOutLineNds();
1029 0 : if( rOutlNds.empty() )
1030 0 : return false;
1031 :
1032 0 : SET_CURR_SHELL( this );
1033 0 : SwCallLink aLk( *this ); // watch Crsr-Moves
1034 :
1035 0 : if( nSttPos > nEndPos ) // parameters switched?
1036 : {
1037 : OSL_ENSURE( false, "Start > End for array access" );
1038 0 : sal_uInt16 nTmp = nSttPos;
1039 0 : nSttPos = nEndPos;
1040 0 : nEndPos = nTmp;
1041 : }
1042 :
1043 0 : SwNode* pSttNd = rOutlNds[ nSttPos ];
1044 0 : SwNode* pEndNd = rOutlNds[ nEndPos ];
1045 :
1046 0 : if( bWithChildren )
1047 : {
1048 0 : const int nLevel = pEndNd->GetTextNode()->GetAttrOutlineLevel()-1;
1049 0 : for( ++nEndPos; nEndPos < rOutlNds.size(); ++nEndPos )
1050 : {
1051 0 : pEndNd = rOutlNds[ nEndPos ];
1052 0 : const int nNxtLevel = pEndNd->GetTextNode()->GetAttrOutlineLevel()-1;
1053 0 : if( nNxtLevel <= nLevel )
1054 0 : break; // EndPos is now on the next one
1055 : }
1056 : }
1057 : // if without children then set onto next one
1058 0 : else if( ++nEndPos < rOutlNds.size() )
1059 0 : pEndNd = rOutlNds[ nEndPos ];
1060 :
1061 0 : if( nEndPos == rOutlNds.size() ) // no end found
1062 0 : pEndNd = &rNds.GetEndOfContent();
1063 :
1064 0 : KillPams();
1065 :
1066 0 : SwCrsrSaveState aSaveState( *m_pCurCrsr );
1067 :
1068 : // set end to the end of the previous content node
1069 0 : m_pCurCrsr->GetPoint()->nNode = *pSttNd;
1070 0 : m_pCurCrsr->GetPoint()->nContent.Assign( pSttNd->GetContentNode(), 0 );
1071 0 : m_pCurCrsr->SetMark();
1072 0 : m_pCurCrsr->GetPoint()->nNode = *pEndNd;
1073 0 : m_pCurCrsr->Move( fnMoveBackward, fnGoNode ); // end of predecessor
1074 :
1075 : // and everything is already selected
1076 0 : bool bRet = !m_pCurCrsr->IsSelOvr();
1077 0 : if( bRet )
1078 0 : UpdateCrsr(SwCrsrShell::SCROLLWIN|SwCrsrShell::CHKRANGE|SwCrsrShell::READONLY);
1079 0 : return bRet;
1080 : }
1081 :
1082 : /// jump to reference marker
1083 0 : bool SwCrsrShell::GotoRefMark( const OUString& rRefMark, sal_uInt16 nSubType,
1084 : sal_uInt16 nSeqNo )
1085 : {
1086 0 : SET_CURR_SHELL( this );
1087 0 : SwCallLink aLk( *this ); // watch Crsr-Moves
1088 0 : SwCrsrSaveState aSaveState( *m_pCurCrsr );
1089 :
1090 0 : sal_Int32 nPos = -1;
1091 : SwTextNode* pTextNd = SwGetRefFieldType::FindAnchor( GetDoc(), rRefMark,
1092 0 : nSubType, nSeqNo, &nPos );
1093 0 : if( pTextNd && pTextNd->GetNodes().IsDocNodes() )
1094 : {
1095 0 : m_pCurCrsr->GetPoint()->nNode = *pTextNd;
1096 0 : m_pCurCrsr->GetPoint()->nContent.Assign( pTextNd, nPos );
1097 :
1098 0 : if( !m_pCurCrsr->IsSelOvr() )
1099 : {
1100 0 : UpdateCrsr(SwCrsrShell::SCROLLWIN|SwCrsrShell::CHKRANGE|SwCrsrShell::READONLY);
1101 0 : return true;
1102 : }
1103 : }
1104 0 : return false;
1105 : }
1106 :
1107 2191 : bool SwCrsrShell::IsPageAtPos( const Point &rPt ) const
1108 : {
1109 2191 : if( GetLayout() )
1110 2191 : return 0 != GetLayout()->GetPageAtPos( rPt );
1111 0 : return false;
1112 : }
1113 :
1114 9 : bool SwCrsrShell::GetContentAtPos( const Point& rPt,
1115 : SwContentAtPos& rContentAtPos,
1116 : bool bSetCrsr,
1117 : SwRect* pFieldRect )
1118 : {
1119 9 : SET_CURR_SHELL( this );
1120 9 : bool bRet = false;
1121 :
1122 9 : if( !IsTableMode() )
1123 : {
1124 9 : Point aPt( rPt );
1125 9 : SwPosition aPos( *m_pCurCrsr->GetPoint() );
1126 :
1127 : SwTextNode* pTextNd;
1128 9 : SwContentFrm *pFrm(0);
1129 : SwTextAttr* pTextAttr;
1130 9 : SwCrsrMoveState aTmpState;
1131 9 : aTmpState.bFieldInfo = true;
1132 9 : aTmpState.bExactOnly = !( SwContentAtPos::SW_OUTLINE & rContentAtPos.eContentAtPos );
1133 9 : aTmpState.bContentCheck = (SwContentAtPos::SW_CONTENT_CHECK & rContentAtPos.eContentAtPos) != 0;
1134 9 : aTmpState.bSetInReadOnly = IsReadOnlyAvailable();
1135 :
1136 9 : SwSpecialPos aSpecialPos;
1137 9 : aTmpState.pSpecialPos = ( SwContentAtPos::SW_SMARTTAG & rContentAtPos.eContentAtPos ) ?
1138 9 : &aSpecialPos : 0;
1139 :
1140 9 : const bool bCrsrFoundExact = GetLayout()->GetCrsrOfst( &aPos, aPt, &aTmpState );
1141 9 : pTextNd = aPos.nNode.GetNode().GetTextNode();
1142 :
1143 9 : const SwNodes& rNds = GetDoc()->GetNodes();
1144 9 : if( pTextNd
1145 9 : && SwContentAtPos::SW_OUTLINE & rContentAtPos.eContentAtPos
1146 9 : && !rNds.GetOutLineNds().empty() )
1147 : {
1148 0 : const SwTextNode* pONd = pTextNd->FindOutlineNodeOfLevel( MAXLEVEL-1);
1149 0 : if( pONd )
1150 : {
1151 0 : rContentAtPos.eContentAtPos = SwContentAtPos::SW_OUTLINE;
1152 0 : rContentAtPos.sStr = pONd->GetExpandText( 0, -1, true, true );
1153 0 : bRet = true;
1154 : }
1155 : }
1156 9 : else if ( SwContentAtPos::SW_CONTENT_CHECK & rContentAtPos.eContentAtPos
1157 0 : && bCrsrFoundExact )
1158 : {
1159 0 : bRet = true;
1160 : }
1161 9 : else if( pTextNd
1162 9 : && SwContentAtPos::SW_NUMLABEL & rContentAtPos.eContentAtPos)
1163 : {
1164 4 : bRet = aTmpState.bInNumPortion;
1165 4 : rContentAtPos.aFnd.pNode = pTextNd;
1166 :
1167 4 : Size aSizeLogic(aTmpState.nInNumPostionOffset, 0);
1168 4 : Size aSizePixel = GetWin()->LogicToPixel(aSizeLogic);
1169 4 : rContentAtPos.nDist = aSizePixel.Width();
1170 : }
1171 5 : else if( bCrsrFoundExact && pTextNd )
1172 : {
1173 5 : if( !aTmpState.bPosCorr )
1174 : {
1175 0 : if ( !bRet
1176 0 : && SwContentAtPos::SW_SMARTTAG & rContentAtPos.eContentAtPos
1177 0 : && !aTmpState.bFootnoteNoInfo )
1178 : {
1179 0 : const SwWrongList* pSmartTagList = pTextNd->GetSmartTags();
1180 0 : sal_Int32 nCurrent = aPos.nContent.GetIndex();
1181 0 : const sal_Int32 nBegin = nCurrent;
1182 0 : sal_Int32 nLen = 1;
1183 :
1184 0 : if ( pSmartTagList && pSmartTagList->InWrongWord( nCurrent, nLen ) && !pTextNd->IsSymbol(nBegin) )
1185 : {
1186 0 : const sal_uInt16 nIndex = pSmartTagList->GetWrongPos( nBegin );
1187 0 : const SwWrongList* pSubList = pSmartTagList->SubList( nIndex );
1188 0 : if ( pSubList )
1189 : {
1190 0 : nCurrent = aTmpState.pSpecialPos->nCharOfst;
1191 :
1192 0 : if ( pSubList->InWrongWord( nCurrent, nLen ) )
1193 0 : bRet = true;
1194 : }
1195 : else
1196 0 : bRet = true;
1197 :
1198 0 : if( bRet && bSetCrsr )
1199 : {
1200 0 : SwCrsrSaveState aSaveState( *m_pCurCrsr );
1201 0 : SwCallLink aLk( *this ); // watch Crsr-Moves
1202 0 : m_pCurCrsr->DeleteMark();
1203 0 : *m_pCurCrsr->GetPoint() = aPos;
1204 0 : if( m_pCurCrsr->IsSelOvr( nsSwCursorSelOverFlags::SELOVER_CHECKNODESSECTION | nsSwCursorSelOverFlags::SELOVER_TOGGLE) )
1205 0 : bRet = false;
1206 : else
1207 0 : UpdateCrsr();
1208 : }
1209 0 : if( bRet )
1210 : {
1211 0 : rContentAtPos.eContentAtPos = SwContentAtPos::SW_SMARTTAG;
1212 :
1213 0 : if( pFieldRect && 0 != ( pFrm = pTextNd->getLayoutFrm( GetLayout(), &aPt ) ) )
1214 0 : pFrm->GetCharRect( *pFieldRect, aPos, &aTmpState );
1215 : }
1216 : }
1217 : }
1218 :
1219 0 : if ( !bRet
1220 0 : && ( SwContentAtPos::SW_FIELD | SwContentAtPos::SW_CLICKFIELD ) & rContentAtPos.eContentAtPos
1221 0 : && !aTmpState.bFootnoteNoInfo )
1222 : {
1223 0 : pTextAttr = pTextNd->GetFieldTextAttrAt( aPos.nContent.GetIndex() );
1224 : const SwField* pField = pTextAttr != NULL
1225 0 : ? pTextAttr->GetFormatField().GetField()
1226 0 : : 0;
1227 0 : if ( SwContentAtPos::SW_CLICKFIELD & rContentAtPos.eContentAtPos
1228 0 : && pField && !pField->HasClickHdl() )
1229 : {
1230 0 : pField = 0;
1231 : }
1232 :
1233 0 : if ( pField )
1234 : {
1235 0 : if( pFieldRect && 0 != ( pFrm = pTextNd->getLayoutFrm( GetLayout(), &aPt ) ) )
1236 0 : pFrm->GetCharRect( *pFieldRect, aPos, &aTmpState );
1237 :
1238 0 : if( bSetCrsr )
1239 : {
1240 0 : SwCallLink aLk( *this ); // watch Crsr-Moves
1241 0 : SwCrsrSaveState aSaveState( *m_pCurCrsr );
1242 0 : m_pCurCrsr->DeleteMark();
1243 0 : *m_pCurCrsr->GetPoint() = aPos;
1244 0 : if( m_pCurCrsr->IsSelOvr() )
1245 : {
1246 : // allow click fields in protected sections
1247 : // only placeholder is not possible
1248 0 : if( SwContentAtPos::SW_FIELD & rContentAtPos.eContentAtPos
1249 0 : || RES_JUMPEDITFLD == pField->Which() )
1250 0 : pField = 0;
1251 : }
1252 : else
1253 0 : UpdateCrsr();
1254 : }
1255 0 : else if( RES_TABLEFLD == pField->Which() &&
1256 0 : static_cast<const SwTableField*>(pField)->IsIntrnlName() )
1257 : {
1258 : // create from internal (for CORE) the external
1259 : // (for UI) formula
1260 0 : const SwTableNode* pTableNd = pTextNd->FindTableNode();
1261 0 : if( pTableNd ) // steht in einer Tabelle
1262 0 : const_cast<SwTableField*>(static_cast<const SwTableField*>(pField))->PtrToBoxNm( &pTableNd->GetTable() );
1263 : }
1264 : }
1265 :
1266 0 : if( pField )
1267 : {
1268 0 : rContentAtPos.aFnd.pField = pField;
1269 0 : rContentAtPos.pFndTextAttr = pTextAttr;
1270 0 : rContentAtPos.eContentAtPos = SwContentAtPos::SW_FIELD;
1271 0 : bRet = true;
1272 : }
1273 : }
1274 :
1275 0 : if( !bRet && SwContentAtPos::SW_FORMCTRL & rContentAtPos.eContentAtPos )
1276 : {
1277 0 : IDocumentMarkAccess* pMarksAccess = GetDoc()->getIDocumentMarkAccess( );
1278 0 : sw::mark::IFieldmark* pFieldBookmark = pMarksAccess->getFieldmarkFor( aPos );
1279 0 : if( bCrsrFoundExact && pTextNd && pFieldBookmark) {
1280 0 : rContentAtPos.eContentAtPos = SwContentAtPos::SW_FORMCTRL;
1281 0 : rContentAtPos.aFnd.pFieldmark = pFieldBookmark;
1282 0 : bRet=true;
1283 : }
1284 : }
1285 :
1286 0 : if( !bRet && SwContentAtPos::SW_FTN & rContentAtPos.eContentAtPos )
1287 : {
1288 0 : if( aTmpState.bFootnoteNoInfo )
1289 : {
1290 : // over the footnote's char
1291 0 : bRet = true;
1292 0 : if( bSetCrsr )
1293 : {
1294 0 : *m_pCurCrsr->GetPoint() = aPos;
1295 0 : if( !GotoFootnoteAnchor() )
1296 0 : bRet = false;
1297 : }
1298 0 : if( bRet )
1299 0 : rContentAtPos.eContentAtPos = SwContentAtPos::SW_FTN;
1300 : }
1301 0 : else if ( 0 != ( pTextAttr = pTextNd->GetTextAttrForCharAt(
1302 0 : aPos.nContent.GetIndex(), RES_TXTATR_FTN )) )
1303 : {
1304 0 : bRet = true;
1305 0 : if( bSetCrsr )
1306 : {
1307 0 : SwCallLink aLk( *this ); // watch Crsr-Moves
1308 0 : SwCrsrSaveState aSaveState( *m_pCurCrsr );
1309 0 : m_pCurCrsr->GetPoint()->nNode = *static_cast<SwTextFootnote*>(pTextAttr)->GetStartNode();
1310 0 : SwContentNode* pCNd = GetDoc()->GetNodes().GoNextSection(
1311 0 : &m_pCurCrsr->GetPoint()->nNode,
1312 0 : true, !IsReadOnlyAvailable() );
1313 :
1314 0 : if( pCNd )
1315 : {
1316 0 : m_pCurCrsr->GetPoint()->nContent.Assign( pCNd, 0 );
1317 0 : if( m_pCurCrsr->IsSelOvr( nsSwCursorSelOverFlags::SELOVER_CHECKNODESSECTION |
1318 0 : nsSwCursorSelOverFlags::SELOVER_TOGGLE ))
1319 0 : bRet = false;
1320 : else
1321 0 : UpdateCrsr();
1322 : }
1323 : else
1324 0 : bRet = false;
1325 : }
1326 :
1327 0 : if( bRet )
1328 : {
1329 0 : rContentAtPos.eContentAtPos = SwContentAtPos::SW_FTN;
1330 0 : rContentAtPos.pFndTextAttr = pTextAttr;
1331 0 : rContentAtPos.aFnd.pAttr = &pTextAttr->GetAttr();
1332 :
1333 0 : if( pFieldRect && 0 != ( pFrm = pTextNd->getLayoutFrm( GetLayout(), &aPt ) ) )
1334 0 : pFrm->GetCharRect( *pFieldRect, aPos, &aTmpState );
1335 : }
1336 : }
1337 : }
1338 :
1339 0 : if( !bRet
1340 0 : && ( SwContentAtPos::SW_TOXMARK | SwContentAtPos::SW_REFMARK ) & rContentAtPos.eContentAtPos
1341 0 : && !aTmpState.bFootnoteNoInfo )
1342 : {
1343 0 : pTextAttr = 0;
1344 0 : if( SwContentAtPos::SW_TOXMARK & rContentAtPos.eContentAtPos )
1345 : {
1346 : ::std::vector<SwTextAttr *> const marks(
1347 : pTextNd->GetTextAttrsAt(
1348 0 : aPos.nContent.GetIndex(), RES_TXTATR_TOXMARK));
1349 0 : if (marks.size())
1350 : { // hmm... can only return 1 here
1351 0 : pTextAttr = *marks.begin();
1352 0 : }
1353 : }
1354 :
1355 0 : if( !pTextAttr &&
1356 0 : SwContentAtPos::SW_REFMARK & rContentAtPos.eContentAtPos )
1357 : {
1358 : ::std::vector<SwTextAttr *> const marks(
1359 : pTextNd->GetTextAttrsAt(
1360 0 : aPos.nContent.GetIndex(), RES_TXTATR_REFMARK));
1361 0 : if (marks.size())
1362 : { // hmm... can only return 1 here
1363 0 : pTextAttr = *marks.begin();
1364 0 : }
1365 : }
1366 :
1367 0 : if( pTextAttr )
1368 : {
1369 0 : bRet = true;
1370 0 : if( bSetCrsr )
1371 : {
1372 0 : SwCallLink aLk( *this ); // watch Crsr-Moves
1373 0 : SwCrsrSaveState aSaveState( *m_pCurCrsr );
1374 0 : m_pCurCrsr->DeleteMark();
1375 0 : *m_pCurCrsr->GetPoint() = aPos;
1376 0 : if( m_pCurCrsr->IsSelOvr( nsSwCursorSelOverFlags::SELOVER_CHECKNODESSECTION | nsSwCursorSelOverFlags::SELOVER_TOGGLE ) )
1377 0 : bRet = false;
1378 : else
1379 0 : UpdateCrsr();
1380 : }
1381 :
1382 0 : if( bRet )
1383 : {
1384 0 : const sal_Int32* pEnd = pTextAttr->GetEnd();
1385 0 : if( pEnd )
1386 0 : rContentAtPos.sStr =
1387 0 : pTextNd->GetExpandText( pTextAttr->GetStart(), *pEnd - pTextAttr->GetStart() );
1388 0 : else if( RES_TXTATR_TOXMARK == pTextAttr->Which())
1389 0 : rContentAtPos.sStr =
1390 0 : pTextAttr->GetTOXMark().GetAlternativeText();
1391 :
1392 : rContentAtPos.eContentAtPos =
1393 0 : RES_TXTATR_TOXMARK == pTextAttr->Which()
1394 : ? SwContentAtPos::SW_TOXMARK
1395 0 : : SwContentAtPos::SW_REFMARK;
1396 0 : rContentAtPos.pFndTextAttr = pTextAttr;
1397 0 : rContentAtPos.aFnd.pAttr = &pTextAttr->GetAttr();
1398 :
1399 0 : if( pFieldRect && 0 != ( pFrm = pTextNd->getLayoutFrm( GetLayout(), &aPt ) ) )
1400 0 : pFrm->GetCharRect( *pFieldRect, aPos, &aTmpState );
1401 : }
1402 : }
1403 : }
1404 :
1405 0 : if ( !bRet
1406 0 : && SwContentAtPos::SW_INETATTR & rContentAtPos.eContentAtPos
1407 0 : && !aTmpState.bFootnoteNoInfo )
1408 : {
1409 : pTextAttr = pTextNd->GetTextAttrAt(
1410 0 : aPos.nContent.GetIndex(), RES_TXTATR_INETFMT);
1411 : // "detect" only INetAttrs with URLs
1412 0 : if( pTextAttr && !pTextAttr->GetINetFormat().GetValue().isEmpty() )
1413 : {
1414 0 : bRet = true;
1415 0 : if( bSetCrsr )
1416 : {
1417 0 : SwCrsrSaveState aSaveState( *m_pCurCrsr );
1418 0 : SwCallLink aLk( *this ); // watch Crsr-Moves
1419 0 : m_pCurCrsr->DeleteMark();
1420 0 : *m_pCurCrsr->GetPoint() = aPos;
1421 0 : if( m_pCurCrsr->IsSelOvr( nsSwCursorSelOverFlags::SELOVER_CHECKNODESSECTION |
1422 0 : nsSwCursorSelOverFlags::SELOVER_TOGGLE) )
1423 0 : bRet = false;
1424 : else
1425 0 : UpdateCrsr();
1426 : }
1427 0 : if( bRet )
1428 : {
1429 0 : rContentAtPos.sStr = pTextNd->GetExpandText(
1430 0 : pTextAttr->GetStart(),
1431 0 : *pTextAttr->GetEnd() - pTextAttr->GetStart() );
1432 :
1433 0 : rContentAtPos.aFnd.pAttr = &pTextAttr->GetAttr();
1434 0 : rContentAtPos.eContentAtPos = SwContentAtPos::SW_INETATTR;
1435 0 : rContentAtPos.pFndTextAttr = pTextAttr;
1436 :
1437 0 : if( pFieldRect && 0 != ( pFrm = pTextNd->getLayoutFrm( GetLayout(), &aPt ) ) )
1438 0 : pFrm->GetCharRect( *pFieldRect, aPos, &aTmpState );
1439 : }
1440 : }
1441 : }
1442 :
1443 0 : if( !bRet && SwContentAtPos::SW_REDLINE & rContentAtPos.eContentAtPos )
1444 : {
1445 0 : const SwRangeRedline* pRedl = GetDoc()->getIDocumentRedlineAccess().GetRedline(aPos, NULL);
1446 0 : if( pRedl )
1447 : {
1448 0 : rContentAtPos.aFnd.pRedl = pRedl;
1449 0 : rContentAtPos.eContentAtPos = SwContentAtPos::SW_REDLINE;
1450 0 : rContentAtPos.pFndTextAttr = 0;
1451 0 : bRet = true;
1452 :
1453 0 : if( pFieldRect && 0 != ( pFrm = pTextNd->getLayoutFrm( GetLayout(), &aPt ) ) )
1454 0 : pFrm->GetCharRect( *pFieldRect, aPos, &aTmpState );
1455 : }
1456 : }
1457 : }
1458 :
1459 5 : if( !bRet
1460 5 : && ( SwContentAtPos::SW_TABLEBOXFML & rContentAtPos.eContentAtPos
1461 : #ifdef DBG_UTIL
1462 : || SwContentAtPos::SW_TABLEBOXVALUE & rContentAtPos.eContentAtPos
1463 : #endif
1464 : ) )
1465 : {
1466 : const SwTableNode* pTableNd;
1467 : const SwTableBox* pBox;
1468 0 : const SwStartNode* pSttNd = pTextNd->FindTableBoxStartNode();
1469 : const SfxPoolItem* pItem;
1470 0 : if( pSttNd && 0 != ( pTableNd = pTextNd->FindTableNode()) &&
1471 0 : 0 != ( pBox = pTableNd->GetTable().GetTableBox(
1472 0 : pSttNd->GetIndex() )) &&
1473 : #ifdef DBG_UTIL
1474 : ( SfxItemState::SET == pBox->GetFrameFormat()->GetItemState(
1475 : RES_BOXATR_FORMULA, false, &pItem ) ||
1476 : SfxItemState::SET == pBox->GetFrameFormat()->GetItemState(
1477 : RES_BOXATR_VALUE, false, &pItem ))
1478 : #else
1479 0 : SfxItemState::SET == pBox->GetFrameFormat()->GetItemState(
1480 0 : RES_BOXATR_FORMULA, false, &pItem )
1481 : #endif
1482 : )
1483 : {
1484 0 : SwFrm* pF = pTextNd->getLayoutFrm( GetLayout(), &aPt );
1485 0 : if( pF )
1486 : {
1487 : // then the CellFrame
1488 0 : pFrm = static_cast<SwContentFrm*>(pF);
1489 0 : while( pF && !pF->IsCellFrm() )
1490 0 : pF = pF->GetUpper();
1491 : }
1492 :
1493 0 : if( aTmpState.bPosCorr )
1494 : {
1495 0 : if( pF && !pF->Frm().IsInside( aPt ))
1496 0 : pF = 0;
1497 : }
1498 0 : else if( !pF )
1499 0 : pF = pFrm;
1500 :
1501 0 : if( pF ) // only then it is valid
1502 : {
1503 : // create from internal (for CORE) the external
1504 : // (for UI) formula
1505 0 : rContentAtPos.eContentAtPos = SwContentAtPos::SW_TABLEBOXFML;
1506 : #ifdef DBG_UTIL
1507 : if( RES_BOXATR_VALUE == pItem->Which() )
1508 : rContentAtPos.eContentAtPos = SwContentAtPos::SW_TABLEBOXVALUE;
1509 : else
1510 : #endif
1511 0 : const_cast<SwTableBoxFormula*>(static_cast<const SwTableBoxFormula*>(pItem))->PtrToBoxNm( &pTableNd->GetTable() );
1512 :
1513 0 : bRet = true;
1514 0 : if( bSetCrsr )
1515 : {
1516 0 : SwCallLink aLk( *this ); // watch Crsr-Moves
1517 0 : SwCrsrSaveState aSaveState( *m_pCurCrsr );
1518 0 : *m_pCurCrsr->GetPoint() = aPos;
1519 0 : if( m_pCurCrsr->IsSelOvr( nsSwCursorSelOverFlags::SELOVER_CHECKNODESSECTION |
1520 0 : nsSwCursorSelOverFlags::SELOVER_TOGGLE) )
1521 0 : bRet = false;
1522 : else
1523 0 : UpdateCrsr();
1524 : }
1525 :
1526 0 : if( bRet )
1527 : {
1528 0 : if( pFieldRect )
1529 : {
1530 0 : *pFieldRect = pF->Prt();
1531 0 : *pFieldRect += pF->Frm().Pos();
1532 : }
1533 0 : rContentAtPos.pFndTextAttr = 0;
1534 0 : rContentAtPos.aFnd.pAttr = pItem;
1535 : }
1536 : }
1537 : }
1538 : }
1539 :
1540 : #ifdef DBG_UTIL
1541 : if( !bRet && SwContentAtPos::SW_CURR_ATTRS & rContentAtPos.eContentAtPos )
1542 : {
1543 : const sal_Int32 n = aPos.nContent.GetIndex();
1544 : SfxItemSet aSet( GetDoc()->GetAttrPool(), POOLATTR_BEGIN,
1545 : POOLATTR_END - 1 );
1546 : if( pTextNd->GetpSwpHints() )
1547 : {
1548 : for( size_t i = 0; i < pTextNd->GetSwpHints().Count(); ++i )
1549 : {
1550 : const SwTextAttr* pHt = pTextNd->GetSwpHints()[i];
1551 : const sal_Int32 nAttrStart = pHt->GetStart();
1552 : if( nAttrStart > n ) // over the section
1553 : break;
1554 :
1555 : if( 0 != pHt->End() && (
1556 : ( nAttrStart < n &&
1557 : ( pHt->DontExpand() ? n < *pHt->End()
1558 : : n <= *pHt->End() )) ||
1559 : ( n == nAttrStart &&
1560 : ( nAttrStart == *pHt->End() || !n ))) )
1561 : {
1562 : aSet.Put( pHt->GetAttr() );
1563 : }
1564 : }
1565 : if( pTextNd->HasSwAttrSet() &&
1566 : pTextNd->GetpSwAttrSet()->Count() )
1567 : {
1568 : SfxItemSet aFormatSet( pTextNd->GetSwAttrSet() );
1569 : // remove all from format set that are also in TextSet
1570 : aFormatSet.Differentiate( aSet );
1571 : // now merge all together
1572 : aSet.Put( aFormatSet );
1573 : }
1574 : }
1575 : else
1576 : pTextNd->SwContentNode::GetAttr( aSet );
1577 :
1578 : rContentAtPos.sStr = "Pos: (";
1579 : rContentAtPos.sStr += OUString::number( aPos.nNode.GetIndex());
1580 : rContentAtPos.sStr += ":";
1581 : rContentAtPos.sStr += OUString::number( aPos.nContent.GetIndex());
1582 : rContentAtPos.sStr += ")";
1583 : rContentAtPos.sStr += "\nParagraph Style: ";
1584 : rContentAtPos.sStr += pTextNd->GetFormatColl()->GetName();
1585 : if( pTextNd->GetCondFormatColl() )
1586 : {
1587 : rContentAtPos.sStr += "\nConditional Style: " + pTextNd->GetCondFormatColl()->GetName();
1588 : }
1589 :
1590 : if( aSet.Count() )
1591 : {
1592 : OUString sAttrs;
1593 : SfxItemIter aIter( aSet );
1594 : const SfxPoolItem* pItem = aIter.FirstItem();
1595 : while( true )
1596 : {
1597 : if( !IsInvalidItem( pItem ))
1598 : {
1599 : OUString aStr;
1600 : GetDoc()->GetAttrPool().GetPresentation( *pItem,
1601 : SFX_MAPUNIT_CM, aStr );
1602 : if (!sAttrs.isEmpty())
1603 : sAttrs += ", ";
1604 : sAttrs += aStr;
1605 : }
1606 : if( aIter.IsAtEnd() )
1607 : break;
1608 : pItem = aIter.NextItem();
1609 : }
1610 : if (!sAttrs.isEmpty())
1611 : {
1612 : if( !rContentAtPos.sStr.isEmpty() )
1613 : rContentAtPos.sStr += "\n";
1614 : rContentAtPos.sStr += "Attr: " + sAttrs;
1615 : }
1616 : }
1617 : bRet = true;
1618 : rContentAtPos.eContentAtPos = SwContentAtPos::SW_CURR_ATTRS;
1619 : }
1620 : #endif
1621 9 : }
1622 : }
1623 :
1624 9 : if( !bRet )
1625 : {
1626 9 : rContentAtPos.eContentAtPos = SwContentAtPos::SW_NOTHING;
1627 9 : rContentAtPos.aFnd.pField = 0;
1628 : }
1629 9 : return bRet;
1630 : }
1631 :
1632 : // #i90516#
1633 12312 : const SwPostItField* SwCrsrShell::GetPostItFieldAtCursor() const
1634 : {
1635 12312 : const SwPostItField* pPostItField = 0;
1636 :
1637 12312 : if ( !IsTableMode() )
1638 : {
1639 12297 : const SwPosition* pCursorPos = _GetCrsr()->GetPoint();
1640 12297 : const SwTextNode* pTextNd = pCursorPos->nNode.GetNode().GetTextNode();
1641 12297 : if ( pTextNd )
1642 : {
1643 12297 : SwTextAttr* pTextAttr = pTextNd->GetFieldTextAttrAt( pCursorPos->nContent.GetIndex() );
1644 12297 : const SwField* pField = pTextAttr != NULL ? pTextAttr->GetFormatField().GetField() : 0;
1645 12297 : if ( pField && pField->Which()== RES_POSTITFLD )
1646 : {
1647 10 : pPostItField = static_cast<const SwPostItField*>(pField);
1648 : }
1649 : }
1650 : }
1651 :
1652 12312 : return pPostItField;
1653 : }
1654 :
1655 : /// is the node in a protected section?
1656 0 : bool SwContentAtPos::IsInProtectSect() const
1657 : {
1658 0 : const SwTextNode* pNd = 0;
1659 0 : if( pFndTextAttr )
1660 : {
1661 0 : switch( eContentAtPos )
1662 : {
1663 : case SW_FIELD:
1664 : case SW_CLICKFIELD:
1665 0 : pNd = static_txtattr_cast<SwTextField const*>(pFndTextAttr)->GetpTextNode();
1666 0 : break;
1667 :
1668 : case SW_FTN:
1669 0 : pNd = &static_cast<const SwTextFootnote*>(pFndTextAttr)->GetTextNode();
1670 0 : break;
1671 :
1672 : case SW_INETATTR:
1673 0 : pNd = static_txtattr_cast<SwTextINetFormat const*>(pFndTextAttr)->GetpTextNode();
1674 0 : break;
1675 :
1676 : default:
1677 0 : break;
1678 : }
1679 : }
1680 :
1681 : const SwContentFrm* pFrm;
1682 0 : return pNd && ( pNd->IsInProtectSect() ||
1683 0 : ( 0 != ( pFrm = pNd->getLayoutFrm( pNd->GetDoc()->getIDocumentLayoutAccess().GetCurrentLayout(), 0, 0, false)) &&
1684 0 : pFrm->IsProtected() ));
1685 : }
1686 :
1687 0 : bool SwContentAtPos::IsInRTLText()const
1688 : {
1689 0 : bool bRet = false;
1690 0 : const SwTextNode* pNd = 0;
1691 0 : if (pFndTextAttr && (eContentAtPos == SW_FTN))
1692 : {
1693 0 : const SwTextFootnote* pTextFootnote = static_cast<const SwTextFootnote*>(pFndTextAttr);
1694 0 : if(pTextFootnote->GetStartNode())
1695 : {
1696 0 : SwStartNode* pSttNd = pTextFootnote->GetStartNode()->GetNode().GetStartNode();
1697 0 : SwPaM aTemp( *pSttNd );
1698 0 : aTemp.Move(fnMoveForward, fnGoNode);
1699 0 : SwContentNode* pContentNode = aTemp.GetContentNode();
1700 0 : if(pContentNode && pContentNode->IsTextNode())
1701 0 : pNd = pContentNode->GetTextNode();
1702 : }
1703 : }
1704 0 : if(pNd)
1705 : {
1706 0 : SwIterator<SwTextFrm,SwTextNode> aIter(*pNd);
1707 0 : SwTextFrm* pTmpFrm = aIter.First();
1708 0 : while( pTmpFrm )
1709 : {
1710 0 : if ( !pTmpFrm->IsFollow())
1711 : {
1712 0 : bRet = pTmpFrm->IsRightToLeft();
1713 0 : break;
1714 : }
1715 0 : pTmpFrm = aIter.Next();
1716 0 : }
1717 : }
1718 0 : return bRet;
1719 : }
1720 :
1721 0 : bool SwCrsrShell::SelectText( const sal_Int32 nStart,
1722 : const sal_Int32 nEnd )
1723 : {
1724 0 : SET_CURR_SHELL( this );
1725 0 : bool bRet = false;
1726 :
1727 0 : SwCallLink aLk( *this );
1728 0 : SwCrsrSaveState aSaveState( *m_pCurCrsr );
1729 :
1730 0 : SwPosition& rPos = *m_pCurCrsr->GetPoint();
1731 0 : m_pCurCrsr->DeleteMark();
1732 0 : rPos.nContent = nStart;
1733 0 : m_pCurCrsr->SetMark();
1734 0 : rPos.nContent = nEnd;
1735 :
1736 0 : if( !m_pCurCrsr->IsSelOvr() )
1737 : {
1738 0 : UpdateCrsr();
1739 0 : bRet = true;
1740 : }
1741 :
1742 0 : return bRet;
1743 : }
1744 :
1745 0 : bool SwCrsrShell::SelectTextAttr( sal_uInt16 nWhich,
1746 : bool bExpand,
1747 : const SwTextAttr* pTextAttr )
1748 : {
1749 0 : SET_CURR_SHELL( this );
1750 0 : bool bRet = false;
1751 :
1752 0 : if( !IsTableMode() )
1753 : {
1754 0 : if( !pTextAttr )
1755 : {
1756 0 : SwPosition& rPos = *m_pCurCrsr->GetPoint();
1757 0 : SwTextNode* pTextNd = rPos.nNode.GetNode().GetTextNode();
1758 : pTextAttr = (pTextNd)
1759 : ? pTextNd->GetTextAttrAt(rPos.nContent.GetIndex(),
1760 : static_cast<RES_TXTATR>(nWhich),
1761 0 : (bExpand) ? SwTextNode::EXPAND : SwTextNode::DEFAULT)
1762 0 : : 0;
1763 : }
1764 :
1765 0 : if( pTextAttr )
1766 : {
1767 0 : const sal_Int32* pEnd = pTextAttr->End();
1768 0 : bRet = SelectText( pTextAttr->GetStart(), ( pEnd ? *pEnd : pTextAttr->GetStart() + 1 ) );
1769 : }
1770 : }
1771 0 : return bRet;
1772 : }
1773 :
1774 0 : bool SwCrsrShell::GotoINetAttr( const SwTextINetFormat& rAttr )
1775 : {
1776 0 : bool bRet = false;
1777 0 : if( rAttr.GetpTextNode() )
1778 : {
1779 0 : SwCursor* pCrsr = getShellCrsr( true );
1780 :
1781 0 : SET_CURR_SHELL( this );
1782 0 : SwCallLink aLk( *this ); // watch Crsr-Moves
1783 0 : SwCrsrSaveState aSaveState( *pCrsr );
1784 :
1785 0 : pCrsr->GetPoint()->nNode = *rAttr.GetpTextNode();
1786 0 : pCrsr->GetPoint()->nContent.Assign( const_cast<SwTextNode*>(rAttr.GetpTextNode()),
1787 0 : rAttr.GetStart() );
1788 0 : bRet = !pCrsr->IsSelOvr();
1789 0 : if( bRet )
1790 0 : UpdateCrsr(SwCrsrShell::SCROLLWIN|SwCrsrShell::CHKRANGE|SwCrsrShell::READONLY);
1791 : }
1792 0 : return bRet;
1793 : }
1794 :
1795 0 : const SwFormatINetFormat* SwCrsrShell::FindINetAttr( const OUString& rName ) const
1796 : {
1797 0 : return mpDoc->FindINetAttr( rName );
1798 : }
1799 :
1800 0 : bool SwCrsrShell::GetShadowCrsrPos( const Point& rPt, SwFillMode eFillMode,
1801 : SwRect& rRect, sal_Int16& rOrient )
1802 : {
1803 :
1804 0 : SET_CURR_SHELL( this );
1805 0 : bool bRet = false;
1806 :
1807 0 : if (!IsTableMode() && !HasSelection()
1808 0 : && GetDoc()->GetIDocumentUndoRedo().DoesUndo())
1809 : {
1810 0 : Point aPt( rPt );
1811 0 : SwPosition aPos( *m_pCurCrsr->GetPoint() );
1812 :
1813 0 : SwFillCrsrPos aFPos( eFillMode );
1814 0 : SwCrsrMoveState aTmpState( &aFPos );
1815 :
1816 0 : if( GetLayout()->GetCrsrOfst( &aPos, aPt, &aTmpState ) &&
1817 0 : !aPos.nNode.GetNode().IsProtect())
1818 : {
1819 : // start position in protected section?
1820 0 : rRect = aFPos.aCrsr;
1821 0 : rOrient = aFPos.eOrient;
1822 0 : bRet = true;
1823 0 : }
1824 : }
1825 0 : return bRet;
1826 : }
1827 :
1828 0 : bool SwCrsrShell::SetShadowCrsrPos( const Point& rPt, SwFillMode eFillMode )
1829 : {
1830 0 : SET_CURR_SHELL( this );
1831 0 : bool bRet = false;
1832 :
1833 0 : if (!IsTableMode() && !HasSelection()
1834 0 : && GetDoc()->GetIDocumentUndoRedo().DoesUndo())
1835 : {
1836 0 : Point aPt( rPt );
1837 0 : SwPosition aPos( *m_pCurCrsr->GetPoint() );
1838 :
1839 0 : SwFillCrsrPos aFPos( eFillMode );
1840 0 : SwCrsrMoveState aTmpState( &aFPos );
1841 :
1842 0 : if( GetLayout()->GetCrsrOfst( &aPos, aPt, &aTmpState ) )
1843 : {
1844 0 : SwCallLink aLk( *this ); // watch Crsr-Moves
1845 0 : StartAction();
1846 :
1847 0 : SwContentNode* pCNd = aPos.nNode.GetNode().GetContentNode();
1848 0 : SwUndoId nUndoId = UNDO_INS_FROM_SHADOWCRSR;
1849 : // If only the paragraph attributes "Adjust" or "LRSpace" are set,
1850 : // then the following should not delete those again.
1851 0 : if( 0 == aFPos.nParaCnt + aFPos.nColumnCnt &&
1852 0 : ( FILL_INDENT == aFPos.eMode ||
1853 0 : ( text::HoriOrientation::NONE != aFPos.eOrient &&
1854 0 : 0 == aFPos.nTabCnt + aFPos.nSpaceCnt )) &&
1855 0 : pCNd && pCNd->Len() )
1856 0 : nUndoId = UNDO_EMPTY;
1857 :
1858 0 : GetDoc()->GetIDocumentUndoRedo().StartUndo( nUndoId, NULL );
1859 :
1860 0 : SwTextFormatColl* pNextFormat = 0;
1861 0 : SwTextNode* pTNd = pCNd ? pCNd->GetTextNode() : NULL;
1862 0 : if( pTNd )
1863 0 : pNextFormat = &pTNd->GetTextColl()->GetNextTextFormatColl();
1864 :
1865 0 : const SwSectionNode* pSectNd = pCNd ? pCNd->FindSectionNode() : NULL;
1866 0 : if( pSectNd && aFPos.nParaCnt )
1867 : {
1868 0 : SwNodeIndex aEnd( aPos.nNode, 1 );
1869 0 : while( aEnd.GetNode().IsEndNode() &&
1870 0 : &aEnd.GetNode() !=
1871 0 : pSectNd->EndOfSectionNode() )
1872 0 : ++aEnd;
1873 :
1874 0 : if( aEnd.GetNode().IsEndNode() &&
1875 0 : pCNd->Len() == aPos.nContent.GetIndex() )
1876 0 : aPos.nNode = *pSectNd->EndOfSectionNode();
1877 : }
1878 :
1879 0 : for( sal_uInt16 n = 0; n < aFPos.nParaCnt + aFPos.nColumnCnt; ++n )
1880 : {
1881 0 : GetDoc()->getIDocumentContentOperations().AppendTextNode( aPos );
1882 0 : if( !n && pNextFormat )
1883 : {
1884 0 : *m_pCurCrsr->GetPoint() = aPos;
1885 0 : GetDoc()->SetTextFormatColl( *m_pCurCrsr, pNextFormat, false );
1886 : }
1887 0 : if( n < aFPos.nColumnCnt )
1888 : {
1889 0 : *m_pCurCrsr->GetPoint() = aPos;
1890 0 : GetDoc()->getIDocumentContentOperations().InsertPoolItem( *m_pCurCrsr,
1891 0 : SvxFormatBreakItem( SVX_BREAK_COLUMN_BEFORE, RES_BREAK ) );
1892 : }
1893 : }
1894 :
1895 0 : *m_pCurCrsr->GetPoint() = aPos;
1896 0 : switch( aFPos.eMode )
1897 : {
1898 : case FILL_INDENT:
1899 0 : if( 0 != (pCNd = aPos.nNode.GetNode().GetContentNode() ))
1900 : {
1901 0 : SfxItemSet aSet( GetDoc()->GetAttrPool(),
1902 : RES_LR_SPACE, RES_LR_SPACE,
1903 : RES_PARATR_ADJUST, RES_PARATR_ADJUST,
1904 0 : 0 );
1905 : SvxLRSpaceItem aLR( static_cast<const SvxLRSpaceItem&>(
1906 0 : pCNd->GetAttr( RES_LR_SPACE ) ) );
1907 0 : aLR.SetTextLeft( aFPos.nTabCnt );
1908 0 : aLR.SetTextFirstLineOfst( 0 );
1909 0 : aSet.Put( aLR );
1910 :
1911 : const SvxAdjustItem& rAdj = static_cast<const SvxAdjustItem&>(pCNd->
1912 0 : GetAttr( RES_PARATR_ADJUST ));
1913 0 : if( SVX_ADJUST_LEFT != rAdj.GetAdjust() )
1914 0 : aSet.Put( SvxAdjustItem( SVX_ADJUST_LEFT, RES_PARATR_ADJUST ) );
1915 :
1916 0 : GetDoc()->getIDocumentContentOperations().InsertItemSet( *m_pCurCrsr, aSet );
1917 : }
1918 : else {
1919 : OSL_ENSURE( false, "No ContentNode" );
1920 : }
1921 0 : break;
1922 :
1923 : case FILL_TAB:
1924 : case FILL_SPACE:
1925 : {
1926 0 : OUStringBuffer sInsert;
1927 0 : if (aFPos.nTabCnt)
1928 0 : comphelper::string::padToLength(sInsert, aFPos.nTabCnt, '\t');
1929 0 : if (aFPos.nSpaceCnt)
1930 0 : comphelper::string::padToLength(sInsert, sInsert.getLength() + aFPos.nSpaceCnt, ' ');
1931 0 : if (!sInsert.isEmpty())
1932 0 : GetDoc()->getIDocumentContentOperations().InsertString( *m_pCurCrsr, sInsert.makeStringAndClear());
1933 : }
1934 : // no break - still need to set orientation
1935 : case FILL_MARGIN:
1936 0 : if( text::HoriOrientation::NONE != aFPos.eOrient )
1937 : {
1938 0 : SvxAdjustItem aAdj( SVX_ADJUST_LEFT, RES_PARATR_ADJUST );
1939 0 : switch( aFPos.eOrient )
1940 : {
1941 : case text::HoriOrientation::CENTER:
1942 0 : aAdj.SetAdjust( SVX_ADJUST_CENTER );
1943 0 : break;
1944 : case text::HoriOrientation::RIGHT:
1945 0 : aAdj.SetAdjust( SVX_ADJUST_RIGHT );
1946 0 : break;
1947 : default:
1948 0 : break;
1949 : }
1950 0 : GetDoc()->getIDocumentContentOperations().InsertPoolItem( *m_pCurCrsr, aAdj );
1951 : }
1952 0 : break;
1953 : }
1954 :
1955 0 : GetDoc()->GetIDocumentUndoRedo().EndUndo( nUndoId, NULL );
1956 0 : EndAction();
1957 :
1958 0 : bRet = true;
1959 0 : }
1960 : }
1961 0 : return bRet;
1962 : }
1963 :
1964 0 : const SwRangeRedline* SwCrsrShell::SelNextRedline()
1965 : {
1966 0 : const SwRangeRedline* pFnd = 0;
1967 0 : if( !IsTableMode() )
1968 : {
1969 0 : SET_CURR_SHELL( this );
1970 0 : SwCallLink aLk( *this ); // watch Crsr-Moves
1971 0 : SwCrsrSaveState aSaveState( *m_pCurCrsr );
1972 :
1973 0 : pFnd = GetDoc()->getIDocumentRedlineAccess().SelNextRedline( *m_pCurCrsr );
1974 0 : if( pFnd && !m_pCurCrsr->IsInProtectTable() && !m_pCurCrsr->IsSelOvr() )
1975 0 : UpdateCrsr( SwCrsrShell::SCROLLWIN|SwCrsrShell::CHKRANGE|SwCrsrShell::READONLY);
1976 : else
1977 0 : pFnd = 0;
1978 : }
1979 0 : return pFnd;
1980 : }
1981 :
1982 0 : const SwRangeRedline* SwCrsrShell::SelPrevRedline()
1983 : {
1984 0 : const SwRangeRedline* pFnd = 0;
1985 0 : if( !IsTableMode() )
1986 : {
1987 0 : SET_CURR_SHELL( this );
1988 0 : SwCallLink aLk( *this ); // watch Crsr-Moves
1989 0 : SwCrsrSaveState aSaveState( *m_pCurCrsr );
1990 :
1991 0 : pFnd = GetDoc()->getIDocumentRedlineAccess().SelPrevRedline( *m_pCurCrsr );
1992 0 : if( pFnd && !m_pCurCrsr->IsInProtectTable() && !m_pCurCrsr->IsSelOvr() )
1993 0 : UpdateCrsr( SwCrsrShell::SCROLLWIN|SwCrsrShell::CHKRANGE|SwCrsrShell::READONLY);
1994 : else
1995 0 : pFnd = 0;
1996 : }
1997 0 : return pFnd;
1998 : }
1999 :
2000 0 : const SwRangeRedline* SwCrsrShell::_GotoRedline( sal_uInt16 nArrPos, bool bSelect )
2001 : {
2002 0 : const SwRangeRedline* pFnd = 0;
2003 0 : SwCallLink aLk( *this ); // watch Crsr-Moves
2004 0 : SwCrsrSaveState aSaveState( *m_pCurCrsr );
2005 :
2006 0 : pFnd = GetDoc()->getIDocumentRedlineAccess().GetRedlineTable()[ nArrPos ];
2007 0 : if( pFnd )
2008 : {
2009 0 : *m_pCurCrsr->GetPoint() = *pFnd->Start();
2010 :
2011 : SwContentNode* pCNd;
2012 0 : SwNodeIndex* pIdx = &m_pCurCrsr->GetPoint()->nNode;
2013 0 : if( !pIdx->GetNode().IsContentNode() &&
2014 0 : 0 != ( pCNd = GetDoc()->GetNodes().GoNextSection( pIdx,
2015 0 : true, IsReadOnlyAvailable() )) )
2016 : {
2017 0 : if( *pIdx <= pFnd->End()->nNode )
2018 0 : m_pCurCrsr->GetPoint()->nContent.Assign( pCNd, 0 );
2019 : else
2020 0 : pFnd = 0;
2021 : }
2022 :
2023 0 : if( pFnd && bSelect )
2024 : {
2025 0 : m_pCurCrsr->SetMark();
2026 0 : if( nsRedlineType_t::REDLINE_FMTCOLL == pFnd->GetType() )
2027 : {
2028 0 : pCNd = pIdx->GetNode().GetContentNode();
2029 0 : m_pCurCrsr->GetPoint()->nContent.Assign( pCNd, pCNd->Len() );
2030 0 : m_pCurCrsr->GetMark()->nContent.Assign( pCNd, 0 );
2031 : }
2032 : else
2033 0 : *m_pCurCrsr->GetPoint() = *pFnd->End();
2034 :
2035 0 : pIdx = &m_pCurCrsr->GetPoint()->nNode;
2036 0 : if( !pIdx->GetNode().IsContentNode() &&
2037 : 0 != ( pCNd = SwNodes::GoPrevSection( pIdx,
2038 0 : true, IsReadOnlyAvailable() )) )
2039 : {
2040 0 : if( *pIdx >= m_pCurCrsr->GetMark()->nNode )
2041 0 : m_pCurCrsr->GetPoint()->nContent.Assign( pCNd, pCNd->Len() );
2042 : else
2043 0 : pFnd = 0;
2044 : }
2045 : }
2046 :
2047 0 : if( !pFnd )
2048 : {
2049 0 : m_pCurCrsr->DeleteMark();
2050 0 : m_pCurCrsr->RestoreSavePos();
2051 : }
2052 0 : else if( bSelect && *m_pCurCrsr->GetMark() == *m_pCurCrsr->GetPoint() )
2053 0 : m_pCurCrsr->DeleteMark();
2054 :
2055 0 : if( pFnd && !m_pCurCrsr->IsInProtectTable() && !m_pCurCrsr->IsSelOvr() )
2056 : UpdateCrsr( SwCrsrShell::SCROLLWIN | SwCrsrShell::CHKRANGE
2057 0 : | SwCrsrShell::READONLY );
2058 : else
2059 : {
2060 0 : pFnd = 0;
2061 0 : if( bSelect )
2062 0 : m_pCurCrsr->DeleteMark();
2063 : }
2064 : }
2065 0 : return pFnd;
2066 : }
2067 :
2068 0 : const SwRangeRedline* SwCrsrShell::GotoRedline( sal_uInt16 nArrPos, bool bSelect )
2069 : {
2070 0 : const SwRangeRedline* pFnd = 0;
2071 0 : if( !IsTableMode() )
2072 : {
2073 0 : SET_CURR_SHELL( this );
2074 :
2075 0 : const SwRedlineTable& rTable = GetDoc()->getIDocumentRedlineAccess().GetRedlineTable();
2076 0 : const SwRangeRedline* pTmp = rTable[ nArrPos ];
2077 0 : sal_uInt16 nSeqNo = pTmp->GetSeqNo();
2078 0 : if( nSeqNo && bSelect )
2079 : {
2080 0 : bool bCheck = false;
2081 0 : int nLoopCnt = 2;
2082 0 : sal_uInt16 nArrSavPos = nArrPos;
2083 :
2084 0 : do {
2085 0 : pTmp = _GotoRedline( nArrPos, true );
2086 :
2087 0 : if( !pFnd )
2088 0 : pFnd = pTmp;
2089 :
2090 0 : if( pTmp && bCheck )
2091 : {
2092 : // Check for overlaps. These can happen when FormatColl-
2093 : // Redlines were stretched over a whole paragraph
2094 0 : SwPaM* pCur = m_pCurCrsr;
2095 0 : SwPaM* pNextPam = pCur->GetNext();
2096 0 : SwPosition* pCStt = pCur->Start(), *pCEnd = pCur->End();
2097 0 : while( pCur != pNextPam )
2098 : {
2099 0 : const SwPosition *pNStt = pNextPam->Start(),
2100 0 : *pNEnd = pNextPam->End();
2101 :
2102 0 : bool bDel = true;
2103 0 : switch( ::ComparePosition( *pCStt, *pCEnd,
2104 0 : *pNStt, *pNEnd ))
2105 : {
2106 : case POS_INSIDE: // Pos1 is completely in Pos2
2107 0 : if( !pCur->HasMark() )
2108 : {
2109 0 : pCur->SetMark();
2110 0 : *pCur->GetMark() = *pNStt;
2111 : }
2112 : else
2113 0 : *pCStt = *pNStt;
2114 0 : *pCEnd = *pNEnd;
2115 0 : break;
2116 :
2117 : case POS_OUTSIDE: // Pos2 is completely in Pos1
2118 : case POS_EQUAL: // Pos1 has same size as Pos2
2119 0 : break;
2120 :
2121 : case POS_OVERLAP_BEFORE: // Pos1 overlaps Pos2 at beginning
2122 0 : if( !pCur->HasMark() )
2123 0 : pCur->SetMark();
2124 0 : *pCEnd = *pNEnd;
2125 0 : break;
2126 : case POS_OVERLAP_BEHIND: // Pos1 overlaps Pos2 at end
2127 0 : if( !pCur->HasMark() )
2128 : {
2129 0 : pCur->SetMark();
2130 0 : *pCur->GetMark() = *pNStt;
2131 : }
2132 : else
2133 0 : *pCStt = *pNStt;
2134 0 : break;
2135 :
2136 : default:
2137 0 : bDel = false;
2138 : }
2139 :
2140 0 : if( bDel )
2141 : {
2142 : // not needed anymore
2143 0 : SwPaM* pPrevPam = static_cast<SwPaM*>(pNextPam->GetPrev());
2144 0 : delete pNextPam;
2145 0 : pNextPam = pPrevPam;
2146 : }
2147 0 : pNextPam = pNextPam->GetNext();
2148 : }
2149 : }
2150 :
2151 : sal_uInt16 nFndPos = 2 == nLoopCnt
2152 0 : ? rTable.FindNextOfSeqNo( nArrPos )
2153 0 : : rTable.FindPrevOfSeqNo( nArrPos );
2154 0 : if( USHRT_MAX != nFndPos ||
2155 0 : ( 0 != ( --nLoopCnt ) && USHRT_MAX != (
2156 0 : nFndPos = rTable.FindPrevOfSeqNo( nArrSavPos ))) )
2157 : {
2158 0 : if( pTmp )
2159 : {
2160 : // create new cursor
2161 0 : CreateCrsr();
2162 0 : bCheck = true;
2163 : }
2164 0 : nArrPos = nFndPos;
2165 : }
2166 : else
2167 0 : nLoopCnt = 0;
2168 :
2169 0 : } while( nLoopCnt );
2170 : }
2171 : else
2172 0 : pFnd = _GotoRedline( nArrPos, bSelect );
2173 : }
2174 0 : return pFnd;
2175 : }
2176 :
2177 0 : bool SwCrsrShell::SelectNxtPrvHyperlink( bool bNext )
2178 : {
2179 0 : SwNodes& rNds = GetDoc()->GetNodes();
2180 0 : const SwNode* pBodyEndNd = &rNds.GetEndOfContent();
2181 0 : const SwNode* pBodySttNd = pBodyEndNd->StartOfSectionNode();
2182 0 : sal_uLong nBodySttNdIdx = pBodySttNd->GetIndex();
2183 0 : Point aPt;
2184 :
2185 0 : _SetGetExpField aCmpPos( SwPosition( bNext ? *pBodyEndNd : *pBodySttNd ) );
2186 0 : _SetGetExpField aCurPos( bNext ? *m_pCurCrsr->End() : *m_pCurCrsr->Start() );
2187 0 : if( aCurPos.GetNode() < nBodySttNdIdx )
2188 : {
2189 0 : const SwContentNode* pCNd = aCurPos.GetNodeFromContent()->GetContentNode();
2190 : SwContentFrm* pFrm;
2191 0 : if( pCNd && 0 != ( pFrm = pCNd->getLayoutFrm( GetLayout(), &aPt )) )
2192 0 : aCurPos.SetBodyPos( *pFrm );
2193 : }
2194 :
2195 : // check first all the hyperlink fields
2196 : {
2197 : const SwTextNode* pTextNd;
2198 0 : const SwCharFormats* pFormats = GetDoc()->GetCharFormats();
2199 0 : for( SwCharFormats::size_type n = pFormats->size(); 1 < n; )
2200 : {
2201 0 : SwIterator<SwTextINetFormat,SwCharFormat> aIter(*(*pFormats)[--n]);
2202 :
2203 0 : for( SwTextINetFormat* pFnd = aIter.First(); pFnd; pFnd = aIter.Next() )
2204 0 : if( 0 != ( pTextNd = pFnd->GetpTextNode()) &&
2205 0 : pTextNd->GetNodes().IsDocNodes() )
2206 : {
2207 0 : SwTextINetFormat& rAttr = *pFnd;
2208 0 : SwPosition aTmpPos( *pTextNd );
2209 0 : _SetGetExpField aPos( aTmpPos.nNode, rAttr );
2210 : SwContentFrm* pFrm;
2211 0 : if( pTextNd->GetIndex() < nBodySttNdIdx &&
2212 0 : 0 != ( pFrm = pTextNd->getLayoutFrm( GetLayout(), &aPt )) )
2213 0 : aPos.SetBodyPos( *pFrm );
2214 :
2215 0 : if( bNext
2216 0 : ? ( aPos < aCmpPos && aCurPos < aPos )
2217 0 : : ( aCmpPos < aPos && aPos < aCurPos ))
2218 : {
2219 0 : OUString sText( pTextNd->GetExpandText( rAttr.GetStart(),
2220 0 : *rAttr.GetEnd() - rAttr.GetStart() ) );
2221 :
2222 0 : sText = comphelper::string::remove(sText, 0x0a);
2223 0 : sText = comphelper::string::strip(sText, ' ');
2224 :
2225 0 : if( !sText.isEmpty() )
2226 0 : aCmpPos = aPos;
2227 0 : }
2228 : }
2229 0 : }
2230 : }
2231 :
2232 : // then check all the Flys with a URL or imapge map
2233 : {
2234 0 : const SwFrameFormats* pFormats = GetDoc()->GetSpzFrameFormats();
2235 0 : for( SwFrameFormats::size_type n = 0, nEnd = pFormats->size(); n < nEnd; ++n )
2236 : {
2237 0 : SwFlyFrameFormat* pFormat = static_cast<SwFlyFrameFormat*>((*pFormats)[ n ]);
2238 0 : const SwFormatURL& rURLItem = pFormat->GetURL();
2239 0 : if( rURLItem.GetMap() || !rURLItem.GetURL().isEmpty() )
2240 : {
2241 0 : SwFlyFrm* pFly = pFormat->GetFrm( &aPt, false );
2242 0 : SwPosition aTmpPos( *pBodySttNd );
2243 0 : if( pFly &&
2244 0 : GetBodyTextNode( *GetDoc(), aTmpPos, *pFly->GetLower() ) )
2245 : {
2246 0 : _SetGetExpField aPos( *pFormat, &aTmpPos );
2247 :
2248 0 : if( bNext
2249 0 : ? ( aPos < aCmpPos && aCurPos < aPos )
2250 0 : : ( aCmpPos < aPos && aPos < aCurPos ))
2251 0 : aCmpPos = aPos;
2252 0 : }
2253 : }
2254 : }
2255 : }
2256 :
2257 : // found any URL ?
2258 0 : bool bRet = false;
2259 0 : const SwTextINetFormat* pFndAttr = aCmpPos.GetINetFormat();
2260 0 : const SwFlyFrameFormat* pFndFormat = aCmpPos.GetFlyFormat();
2261 0 : if( pFndAttr || pFndFormat )
2262 : {
2263 0 : SET_CURR_SHELL( this );
2264 0 : SwCallLink aLk( *this );
2265 :
2266 : // found a text attribute ?
2267 0 : if( pFndAttr )
2268 : {
2269 0 : SwCrsrSaveState aSaveState( *m_pCurCrsr );
2270 :
2271 0 : aCmpPos.GetPosOfContent( *m_pCurCrsr->GetPoint() );
2272 0 : m_pCurCrsr->DeleteMark();
2273 0 : m_pCurCrsr->SetMark();
2274 0 : m_pCurCrsr->GetPoint()->nContent = *pFndAttr->End();
2275 :
2276 0 : if( !m_pCurCrsr->IsInProtectTable() && !m_pCurCrsr->IsSelOvr() )
2277 : {
2278 : UpdateCrsr( SwCrsrShell::SCROLLWIN|SwCrsrShell::CHKRANGE|
2279 0 : SwCrsrShell::READONLY );
2280 0 : bRet = true;
2281 0 : }
2282 : }
2283 : // found a draw object ?
2284 0 : else if( RES_DRAWFRMFMT == pFndFormat->Which() )
2285 : {
2286 0 : const SdrObject* pSObj = pFndFormat->FindSdrObject();
2287 0 : if (pSObj)
2288 : {
2289 0 : static_cast<SwFEShell*>(this)->SelectObj( pSObj->GetCurrentBoundRect().Center() );
2290 0 : MakeSelVisible();
2291 0 : bRet = true;
2292 : }
2293 : }
2294 : else // then is it a fly
2295 : {
2296 0 : SwFlyFrm* pFly = pFndFormat->GetFrm(&aPt, false );
2297 0 : if( pFly )
2298 : {
2299 0 : static_cast<SwFEShell*>(this)->SelectFlyFrm( *pFly, true );
2300 0 : MakeSelVisible();
2301 0 : bRet = true;
2302 : }
2303 0 : }
2304 : }
2305 0 : return bRet;
2306 177 : }
2307 :
2308 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|