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 <vcl/cmdevt.hxx>
22 : #include <unotools/charclass.hxx>
23 : #include <comphelper/processfactory.hxx>
24 : #include <comphelper/string.hxx>
25 : #include <unotools/transliterationwrapper.hxx>
26 : #include <swwait.hxx>
27 : #include <fmtsrnd.hxx>
28 : #include <fmtinfmt.hxx>
29 : #include <txtinet.hxx>
30 : #include <frmfmt.hxx>
31 : #include <charfmt.hxx>
32 : #include <doc.hxx>
33 : #include <IDocumentUndoRedo.hxx>
34 : #include <IDocumentSettingAccess.hxx>
35 : #include <IDocumentLinksAdministration.hxx>
36 : #include <IDocumentFieldsAccess.hxx>
37 : #include <IDocumentStatistics.hxx>
38 : #include <IDocumentState.hxx>
39 : #include <docary.hxx>
40 : #include <editsh.hxx>
41 : #include <frame.hxx>
42 : #include <cntfrm.hxx>
43 : #include <pam.hxx>
44 : #include <ndtxt.hxx>
45 : #include <grfatr.hxx>
46 : #include <flyfrm.hxx>
47 : #include <swtable.hxx>
48 : #include <swundo.hxx>
49 : #include <calc.hxx>
50 : #include <edimp.hxx>
51 : #include <ndgrf.hxx>
52 : #include <ndole.hxx>
53 : #include <txtfrm.hxx>
54 : #include <rootfrm.hxx>
55 : #include <extinput.hxx>
56 : #include <crsskip.hxx>
57 : #include <scriptinfo.hxx>
58 : #include <unocrsrhelper.hxx>
59 : #include <section.hxx>
60 : #include <unochart.hxx>
61 : #include <numrule.hxx>
62 : #include <SwNodeNum.hxx>
63 : #include <unocrsr.hxx>
64 : #include <calbck.hxx>
65 :
66 : using namespace com::sun::star;
67 :
68 0 : void SwEditShell::Insert( sal_Unicode c, bool bOnlyCurrCrsr )
69 : {
70 0 : StartAllAction();
71 0 : for(SwPaM& rPaM : GetCrsr()->GetRingContainer())
72 : {
73 0 : const bool bSuccess = GetDoc()->getIDocumentContentOperations().InsertString(rPaM, OUString(c));
74 : OSL_ENSURE( bSuccess, "Doc->Insert() failed." );
75 : (void) bSuccess;
76 :
77 0 : SaveTableBoxContent( rPaM.GetPoint() );
78 0 : if( bOnlyCurrCrsr )
79 0 : break;
80 :
81 : }
82 :
83 0 : EndAllAction();
84 0 : }
85 :
86 18 : void SwEditShell::Insert2(const OUString &rStr, const bool bForceExpandHints )
87 : {
88 18 : StartAllAction();
89 : {
90 : const SwInsertFlags nInsertFlags =
91 : (bForceExpandHints)
92 18 : ? (SwInsertFlags::FORCEHINTEXPAND | SwInsertFlags::EMPTYEXPAND)
93 36 : : SwInsertFlags::EMPTYEXPAND;
94 :
95 36 : for(SwPaM& rCurrentCrsr : getShellCrsr( true )->GetRingContainer())
96 : {
97 : //OPT: GetSystemCharSet
98 : const bool bSuccess =
99 18 : GetDoc()->getIDocumentContentOperations().InsertString(rCurrentCrsr, rStr, nInsertFlags);
100 : OSL_ENSURE( bSuccess, "Doc->Insert() failed." );
101 :
102 18 : if (bSuccess)
103 : {
104 18 : GetDoc()->UpdateRsid( rCurrentCrsr, rStr.getLength() );
105 :
106 : // Set paragraph rsid if beginning of paragraph
107 : SwTextNode *const pTextNode =
108 18 : rCurrentCrsr.GetPoint()->nNode.GetNode().GetTextNode();
109 18 : if( pTextNode && pTextNode->Len() == 1)
110 4 : GetDoc()->UpdateParRsid( pTextNode );
111 : }
112 :
113 18 : SaveTableBoxContent( rCurrentCrsr.GetPoint() );
114 :
115 : }
116 : }
117 :
118 : // calculate cursor bidi level
119 18 : SwCursor* pTmpCrsr = _GetCrsr();
120 18 : const bool bDoNotSetBidiLevel = ! pTmpCrsr ||
121 36 : ( 0 != dynamic_cast<SwUnoCrsr*>(pTmpCrsr) );
122 :
123 18 : if ( ! bDoNotSetBidiLevel )
124 : {
125 18 : SwNode& rNode = pTmpCrsr->GetPoint()->nNode.GetNode();
126 18 : if ( rNode.IsTextNode() )
127 : {
128 18 : SwIndex& rIdx = pTmpCrsr->GetPoint()->nContent;
129 18 : sal_Int32 nPos = rIdx.GetIndex();
130 18 : sal_Int32 nPrevPos = nPos;
131 18 : if ( nPrevPos )
132 18 : --nPrevPos;
133 :
134 18 : SwScriptInfo* pSI = SwScriptInfo::GetScriptInfo( static_cast<SwTextNode&>(rNode), true );
135 :
136 18 : sal_uInt8 nLevel = 0;
137 18 : if ( ! pSI )
138 : {
139 : // seems to be an empty paragraph.
140 10 : Point aPt;
141 : SwContentFrm* pFrm =
142 10 : static_cast<SwTextNode&>(rNode).getLayoutFrm( GetLayout(), &aPt, pTmpCrsr->GetPoint(),
143 10 : false );
144 :
145 10 : SwScriptInfo aScriptInfo;
146 10 : aScriptInfo.InitScriptInfo( static_cast<SwTextNode&>(rNode), pFrm->IsRightToLeft() );
147 10 : nLevel = aScriptInfo.DirType( nPrevPos );
148 : }
149 : else
150 : {
151 8 : if ( COMPLETE_STRING != pSI->GetInvalidityA() )
152 8 : pSI->InitScriptInfo( static_cast<SwTextNode&>(rNode) );
153 8 : nLevel = pSI->DirType( nPrevPos );
154 : }
155 :
156 18 : pTmpCrsr->SetCrsrBidiLevel( nLevel );
157 : }
158 : }
159 :
160 18 : SetInFrontOfLabel( false ); // #i27615#
161 :
162 18 : EndAllAction();
163 18 : }
164 :
165 0 : void SwEditShell::Overwrite(const OUString &rStr)
166 : {
167 0 : StartAllAction();
168 0 : for(SwPaM& rPaM : GetCrsr()->GetRingContainer())
169 : {
170 0 : if( !GetDoc()->getIDocumentContentOperations().Overwrite(rPaM, rStr ) )
171 : {
172 : OSL_FAIL( "Doc->getIDocumentContentOperations().Overwrite(Str) failed." );
173 : }
174 0 : SaveTableBoxContent( rPaM.GetPoint() );
175 : }
176 0 : EndAllAction();
177 0 : }
178 :
179 48 : long SwEditShell::SplitNode( bool bAutoFormat, bool bCheckTableStart )
180 : {
181 48 : StartAllAction();
182 48 : GetDoc()->GetIDocumentUndoRedo().StartUndo(UNDO_EMPTY, NULL);
183 :
184 96 : for(SwPaM& rPaM : GetCrsr()->GetRingContainer())
185 : {
186 : // Here, a table cell becomes a normal text cell.
187 48 : GetDoc()->ClearBoxNumAttrs( rPaM.GetPoint()->nNode );
188 48 : GetDoc()->getIDocumentContentOperations().SplitNode( *rPaM.GetPoint(), bCheckTableStart );
189 : }
190 :
191 48 : GetDoc()->GetIDocumentUndoRedo().EndUndo(UNDO_EMPTY, NULL);
192 :
193 48 : if( bAutoFormat )
194 0 : AutoFormatBySplitNode();
195 :
196 48 : ClearTableBoxContent();
197 :
198 48 : EndAllAction();
199 48 : return 1L;
200 : }
201 :
202 0 : bool SwEditShell::AppendTextNode()
203 : {
204 0 : bool bRet = false;
205 0 : StartAllAction();
206 0 : GetDoc()->GetIDocumentUndoRedo().StartUndo(UNDO_EMPTY, NULL);
207 :
208 0 : for(SwPaM& rPaM : GetCrsr()->GetRingContainer())
209 : {
210 0 : GetDoc()->ClearBoxNumAttrs( rPaM.GetPoint()->nNode );
211 0 : bRet = GetDoc()->getIDocumentContentOperations().AppendTextNode( *rPaM.GetPoint()) || bRet;
212 : }
213 :
214 0 : GetDoc()->GetIDocumentUndoRedo().EndUndo(UNDO_EMPTY, NULL);
215 :
216 0 : ClearTableBoxContent();
217 :
218 0 : EndAllAction();
219 0 : return bRet;
220 : }
221 :
222 : // the returned SwGrfNode pointer is used in GetGraphic() and GetGraphicSize()
223 0 : SwGrfNode * SwEditShell::_GetGrfNode() const
224 : {
225 0 : SwGrfNode *pGrfNode = 0;
226 0 : SwPaM* pCrsr = GetCrsr();
227 0 : if( !pCrsr->HasMark() ||
228 0 : pCrsr->GetPoint()->nNode == pCrsr->GetMark()->nNode )
229 0 : pGrfNode = pCrsr->GetPoint()->nNode.GetNode().GetGrfNode();
230 :
231 0 : return pGrfNode;
232 : }
233 :
234 : // returns a Graphic pointer if CurCrsr->GetPoint() points to a SwGrfNode and
235 : // GetMark is not set or points to the same Graphic
236 0 : const Graphic* SwEditShell::GetGraphic( bool bWait ) const
237 : {
238 0 : SwGrfNode* pGrfNode = _GetGrfNode();
239 0 : const Graphic* pGrf( 0L );
240 0 : if ( pGrfNode )
241 : {
242 0 : pGrf = &(pGrfNode->GetGrf(bWait && GRAPHIC_DEFAULT == pGrfNode->GetGrf().GetType()));
243 : }
244 0 : return pGrf;
245 : }
246 :
247 0 : bool SwEditShell::IsGrfSwapOut( bool bOnlyLinked ) const
248 : {
249 0 : SwGrfNode *pGrfNode = _GetGrfNode();
250 0 : return pGrfNode &&
251 0 : (bOnlyLinked ? ( pGrfNode->IsLinkedFile() &&
252 0 : ( GRAPHIC_DEFAULT == pGrfNode->GetGrfObj().GetType()||
253 0 : pGrfNode->GetGrfObj().IsSwappedOut()))
254 0 : : pGrfNode->GetGrfObj().IsSwappedOut());
255 : }
256 :
257 0 : const GraphicObject* SwEditShell::GetGraphicObj() const
258 : {
259 0 : SwGrfNode* pGrfNode = _GetGrfNode();
260 0 : return pGrfNode ? &(pGrfNode->GetGrfObj()) : 0L;
261 : }
262 :
263 0 : sal_uInt16 SwEditShell::GetGraphicType() const
264 : {
265 0 : SwGrfNode *pGrfNode = _GetGrfNode();
266 0 : return static_cast<sal_uInt16>(pGrfNode ? pGrfNode->GetGrfObj().GetType() : GRAPHIC_NONE);
267 : }
268 :
269 : // returns the size of a graphic in <rSz> if CurCrsr->GetPoint() points to a SwGrfNode and
270 : // GetMark is not set or points to the same graphic
271 0 : bool SwEditShell::GetGrfSize(Size& rSz) const
272 : {
273 : SwNoTextNode* pNoTextNd;
274 0 : SwPaM* pCurrentCrsr = GetCrsr();
275 0 : if( ( !pCurrentCrsr->HasMark()
276 0 : || pCurrentCrsr->GetPoint()->nNode == pCurrentCrsr->GetMark()->nNode )
277 0 : && 0 != ( pNoTextNd = pCurrentCrsr->GetNode().GetNoTextNode() ) )
278 : {
279 0 : rSz = pNoTextNd->GetTwipSize();
280 0 : return true;
281 : }
282 0 : return false;
283 :
284 : }
285 :
286 : /// Read again if graphic is not OK and replace old one
287 0 : void SwEditShell::ReRead( const OUString& rGrfName, const OUString& rFltName,
288 : const Graphic* pGraphic, const GraphicObject* pGrfObj )
289 : {
290 0 : StartAllAction();
291 0 : mpDoc->getIDocumentContentOperations().ReRead( *GetCrsr(), rGrfName, rFltName, pGraphic, pGrfObj );
292 0 : EndAllAction();
293 0 : }
294 :
295 : /// Returns the name and the filter name of a graphic if the pointer is on a graphic.
296 : /// If a String-pointer is != 0 then return corresponding name.
297 0 : void SwEditShell::GetGrfNms( OUString* pGrfName, OUString* pFltName,
298 : const SwFlyFrameFormat* pFormat ) const
299 : {
300 : OSL_ENSURE( pGrfName || pFltName, "No parameters" );
301 0 : if( pFormat )
302 0 : SwDoc::GetGrfNms( *pFormat, pGrfName, pFltName );
303 : else
304 : {
305 0 : SwGrfNode *pGrfNode = _GetGrfNode();
306 0 : if( pGrfNode && pGrfNode->IsLinkedFile() )
307 0 : pGrfNode->GetFileFilterNms( pGrfName, pFltName );
308 : }
309 0 : }
310 :
311 0 : const tools::PolyPolygon *SwEditShell::GetGraphicPolygon() const
312 : {
313 0 : SwNoTextNode *pNd = GetCrsr()->GetNode().GetNoTextNode();
314 0 : return pNd->HasContour();
315 : }
316 :
317 0 : void SwEditShell::SetGraphicPolygon( const tools::PolyPolygon *pPoly )
318 : {
319 0 : SwNoTextNode *pNd = GetCrsr()->GetNode().GetNoTextNode();
320 0 : StartAllAction();
321 0 : pNd->SetContour( pPoly );
322 0 : SwFlyFrm *pFly = static_cast<SwFlyFrm*>(pNd->getLayoutFrm(GetLayout())->GetUpper());
323 0 : const SwFormatSurround &rSur = pFly->GetFormat()->GetSurround();
324 0 : pFly->GetFormat()->NotifyClients( &rSur, &rSur );
325 0 : GetDoc()->getIDocumentState().SetModified();
326 0 : EndAllAction();
327 0 : }
328 :
329 0 : void SwEditShell::ClearAutomaticContour()
330 : {
331 0 : SwNoTextNode *pNd = GetCrsr()->GetNode().GetNoTextNode();
332 : OSL_ENSURE( pNd, "is no NoTextNode!" );
333 0 : if( pNd->HasAutomaticContour() )
334 : {
335 0 : StartAllAction();
336 0 : pNd->SetContour( NULL, false );
337 0 : SwFlyFrm *pFly = static_cast<SwFlyFrm*>(pNd->getLayoutFrm(GetLayout())->GetUpper());
338 0 : const SwFormatSurround &rSur = pFly->GetFormat()->GetSurround();
339 0 : pFly->GetFormat()->NotifyClients( &rSur, &rSur );
340 0 : GetDoc()->getIDocumentState().SetModified();
341 0 : EndAllAction();
342 : }
343 0 : }
344 :
345 : /** Get OLE object at pointer.
346 : *
347 : * Returns a pointer to a SvInPlaceObjectRef if CurCrsr->GetPoint() points to a SwOLENode and
348 : * GetMark is not set or points to the same object reference. Gets this pointer from the Doc
349 : * if the object should be searched by name.
350 : */
351 0 : svt::EmbeddedObjectRef& SwEditShell::GetOLEObject() const
352 : {
353 : OSL_ENSURE( CNT_OLE == GetCntType(), "GetOLEObj: no OLENode." );
354 : OSL_ENSURE( !GetCrsr()->HasMark() ||
355 : (GetCrsr()->HasMark() &&
356 : GetCrsr()->GetPoint()->nNode == GetCrsr()->GetMark()->nNode),
357 : "GetOLEObj: no OLENode." );
358 :
359 0 : SwOLENode *pOLENode = GetCrsr()->GetNode().GetOLENode();
360 : OSL_ENSURE( pOLENode, "GetOLEObj: no OLENode." );
361 0 : SwOLEObj& rOObj = pOLENode->GetOLEObj();
362 0 : return rOObj.GetObject();
363 : }
364 :
365 0 : bool SwEditShell::HasOLEObj( const OUString &rName ) const
366 : {
367 : SwStartNode *pStNd;
368 0 : SwNodeIndex aIdx( *GetNodes().GetEndOfAutotext().StartOfSectionNode(), 1 );
369 0 : while ( 0 != (pStNd = aIdx.GetNode().GetStartNode()) )
370 : {
371 0 : ++aIdx;
372 0 : SwNode& rNd = aIdx.GetNode();
373 0 : if( rNd.IsOLENode() &&
374 0 : rName == static_cast<SwOLENode&>(rNd).GetChartTableName() &&
375 0 : static_cast<SwOLENode&>(rNd).getLayoutFrm( GetLayout() ) )
376 0 : return true;
377 :
378 0 : aIdx.Assign( *pStNd->EndOfSectionNode(), + 1 );
379 : }
380 0 : return false;
381 : }
382 :
383 0 : void SwEditShell::SetChartName( const OUString &rName )
384 : {
385 0 : SwOLENode *pONd = GetCrsr()->GetNode().GetOLENode();
386 : OSL_ENSURE( pONd, "ChartNode not found" );
387 0 : pONd->SetChartTableName( rName );
388 0 : }
389 :
390 0 : void SwEditShell::UpdateCharts( const OUString &rName )
391 : {
392 0 : GetDoc()->UpdateCharts( rName );
393 0 : }
394 :
395 : /// change table name
396 0 : void SwEditShell::SetTableName( SwFrameFormat& rTableFormat, const OUString &rNewName )
397 : {
398 0 : GetDoc()->SetTableName( rTableFormat, rNewName );
399 0 : }
400 :
401 : /// request current word
402 0 : OUString SwEditShell::GetCurWord()
403 : {
404 0 : const SwPaM& rPaM = *GetCrsr();
405 0 : const SwTextNode* pNd = rPaM.GetNode().GetTextNode();
406 : OUString aString = pNd ?
407 0 : pNd->GetCurWord(rPaM.GetPoint()->nContent.GetIndex()) :
408 0 : OUString();
409 0 : return aString;
410 : }
411 :
412 0 : void SwEditShell::UpdateDocStat( )
413 : {
414 0 : StartAllAction();
415 0 : GetDoc()->getIDocumentStatistics().UpdateDocStat( false, true );
416 0 : EndAllAction();
417 0 : }
418 :
419 0 : const SwDocStat& SwEditShell::GetUpdatedDocStat()
420 : {
421 0 : StartAllAction();
422 0 : const SwDocStat &rRet = GetDoc()->getIDocumentStatistics().GetUpdatedDocStat( false, true );
423 0 : EndAllAction();
424 0 : return rRet;
425 : }
426 :
427 : // OPT: eddocinl.cxx
428 :
429 : /// get the reference of a given name in the Doc
430 0 : const SwFormatRefMark* SwEditShell::GetRefMark( const OUString& rName ) const
431 : {
432 0 : return GetDoc()->GetRefMark( rName );
433 : }
434 :
435 : /// get the names of all references in a Doc
436 40 : sal_uInt16 SwEditShell::GetRefMarks( std::vector<OUString>* pStrings ) const
437 : {
438 40 : return GetDoc()->GetRefMarks( pStrings );
439 : }
440 :
441 0 : OUString SwEditShell::GetDropText( const sal_Int32 nChars ) const
442 : {
443 : /*
444 : * pb: made changes for #i74939#
445 : *
446 : * always return a string even though there is a selection
447 : */
448 :
449 0 : OUString aText;
450 0 : SwPaM* pCrsr = GetCrsr();
451 0 : if ( IsMultiSelection() )
452 : {
453 : // if a multi selection exists, search for the first line
454 : // -> it is the cursor with the lowest index
455 0 : sal_uLong nIndex = pCrsr->GetMark()->nNode.GetIndex();
456 0 : bool bPrev = true;
457 0 : SwPaM* pLast = pCrsr;
458 0 : SwPaM* pTemp = pCrsr;
459 0 : while ( bPrev )
460 : {
461 0 : SwPaM* pPrev2 = dynamic_cast< SwPaM* >( pTemp->GetPrev() );
462 0 : bPrev = ( pPrev2 && pPrev2 != pLast );
463 0 : if ( bPrev )
464 : {
465 0 : pTemp = pPrev2;
466 0 : sal_uLong nTemp = pPrev2->GetMark()->nNode.GetIndex();
467 0 : if ( nTemp < nIndex )
468 : {
469 0 : nIndex = nTemp;
470 0 : pCrsr = pPrev2;
471 : }
472 : }
473 : }
474 : }
475 :
476 0 : SwTextNode* pTextNd = pCrsr->GetNode( !pCrsr->HasMark() ).GetTextNode();
477 0 : if( pTextNd )
478 : {
479 0 : sal_Int32 nDropLen = pTextNd->GetDropLen( nChars );
480 0 : if( nDropLen )
481 0 : aText = pTextNd->GetText().copy(0, nDropLen);
482 : }
483 :
484 0 : return aText;
485 : }
486 :
487 0 : void SwEditShell::ReplaceDropText( const OUString &rStr, SwPaM* pPaM )
488 : {
489 0 : SwPaM* pCrsr = pPaM ? pPaM : GetCrsr();
490 0 : if( pCrsr->GetPoint()->nNode == pCrsr->GetMark()->nNode &&
491 0 : pCrsr->GetNode().GetTextNode()->IsTextNode() )
492 : {
493 0 : StartAllAction();
494 :
495 0 : const SwNodeIndex& rNd = pCrsr->GetPoint()->nNode;
496 0 : SwPaM aPam( rNd, rStr.getLength(), rNd, 0 );
497 0 : if( !GetDoc()->getIDocumentContentOperations().Overwrite( aPam, rStr ) )
498 : {
499 : OSL_FAIL( "Doc->getIDocumentContentOperations().Overwrite(Str) failed." );
500 : }
501 :
502 0 : EndAllAction();
503 : }
504 0 : }
505 :
506 0 : OUString SwEditShell::Calculate()
507 : {
508 0 : OUString aFormel; // the final formula
509 0 : SwCalc aCalc( *GetDoc() );
510 0 : const CharClass& rCC = GetAppCharClass();
511 :
512 0 : for(SwPaM& rCurrentPaM : GetCrsr()->GetNext()->GetRingContainer())
513 : {
514 0 : SwTextNode* pTextNd = rCurrentPaM.GetNode().GetTextNode();
515 0 : if(pTextNd)
516 : {
517 0 : const SwPosition *pStart = rCurrentPaM.Start(), *pEnd = rCurrentPaM.End();
518 0 : const sal_Int32 nStt = pStart->nContent.GetIndex();
519 : OUString aStr = pTextNd->GetExpandText( nStt, pEnd->nContent.
520 0 : GetIndex() - nStt );
521 :
522 0 : aStr = rCC.lowercase( aStr );
523 :
524 : sal_Unicode ch;
525 0 : bool bValidFields = false;
526 0 : sal_Int32 nPos = 0;
527 :
528 0 : while( nPos < aStr.getLength() )
529 : {
530 0 : ch = aStr[ nPos++ ];
531 0 : if( rCC.isLetter( aStr, nPos-1 ) || ch == '_' )
532 : {
533 0 : sal_Int32 nTmpStt = nPos-1;
534 0 : while( nPos < aStr.getLength() &&
535 0 : 0 != ( ch = aStr[ nPos++ ]) &&
536 0 : (rCC.isLetterNumeric( aStr, nPos - 1 ) ||
537 0 : ch == '_'|| ch == '.' ))
538 : ;
539 :
540 0 : if( nPos < aStr.getLength() )
541 0 : --nPos;
542 :
543 0 : OUString sVar = aStr.copy( nTmpStt, nPos - nTmpStt );
544 0 : if( !::FindOperator( sVar ) &&
545 0 : (::Find( sVar, aCalc.GetVarTable(),TBLSZ) ||
546 0 : aCalc.VarLook( sVar )) )
547 : {
548 0 : if( !bValidFields )
549 : {
550 0 : GetDoc()->getIDocumentFieldsAccess().FieldsToCalc( aCalc,
551 : pStart->nNode.GetIndex(),
552 0 : pStart->nContent.GetIndex() );
553 0 : bValidFields = true;
554 : }
555 0 : aFormel += "(" + aCalc.GetStrResult( aCalc.VarLook( sVar )->nValue ) + ")";
556 : }
557 : else
558 0 : aFormel += sVar;
559 : }
560 : else
561 0 : aFormel += OUString(ch);
562 0 : }
563 : }
564 : }
565 :
566 0 : return aCalc.GetStrResult( aCalc.Calculate(aFormel) );
567 : }
568 :
569 11 : sfx2::LinkManager& SwEditShell::GetLinkManager()
570 : {
571 11 : return mpDoc->getIDocumentLinksAdministration().GetLinkManager();
572 : }
573 :
574 0 : void *SwEditShell::GetIMapInventor() const
575 : {
576 : // The node on which the cursor points should be sufficient as a unique identifier
577 0 : return static_cast<void*>(&(GetCrsr()->GetNode()));
578 : }
579 :
580 : // #i73788#
581 0 : Graphic SwEditShell::GetIMapGraphic() const
582 : {
583 : // returns always a graphic if the cursor is in a Fly
584 0 : SET_CURR_SHELL( const_cast<SwViewShell*>(static_cast<SwViewShell const *>(this)) );
585 0 : Graphic aRet;
586 0 : SwPaM* pCrsr = GetCrsr();
587 0 : if ( !pCrsr->HasMark() )
588 : {
589 0 : SwNode& rNd =pCrsr->GetNode();
590 0 : if( rNd.IsGrfNode() )
591 : {
592 0 : SwGrfNode & rGrfNode(static_cast<SwGrfNode&>(rNd));
593 0 : aRet = rGrfNode.GetGrf(GRAPHIC_DEFAULT == rGrfNode.GetGrf().GetType());
594 : }
595 0 : else if ( rNd.IsOLENode() )
596 : {
597 0 : aRet = *static_cast<SwOLENode&>(rNd).GetGraphic();
598 : }
599 : else
600 : {
601 0 : SwFlyFrm* pFlyFrm = rNd.GetContentNode()->getLayoutFrm( GetLayout() )->FindFlyFrm();
602 0 : if(pFlyFrm)
603 0 : aRet = pFlyFrm->GetFormat()->MakeGraphic();
604 : }
605 : }
606 0 : return aRet;
607 : }
608 :
609 0 : bool SwEditShell::InsertURL( const SwFormatINetFormat& rFormat, const OUString& rStr, bool bKeepSelection )
610 : {
611 : // URL and hint text (directly or via selection) necessary
612 0 : if( rFormat.GetValue().isEmpty() || ( rStr.isEmpty() && !HasSelection() ) )
613 0 : return false;
614 0 : StartAllAction();
615 0 : GetDoc()->GetIDocumentUndoRedo().StartUndo( UNDO_UI_INSERT_URLTXT, NULL);
616 0 : bool bInsText = true;
617 :
618 0 : if( !rStr.isEmpty() )
619 : {
620 0 : SwPaM* pCrsr = GetCrsr();
621 0 : if( pCrsr->HasMark() && *pCrsr->GetPoint() != *pCrsr->GetMark() )
622 : {
623 : // Selection existent, multi selection?
624 0 : bool bDelText = true;
625 0 : if( !pCrsr->IsMultiSelection() )
626 : {
627 : // einfach Selection -> Text ueberpruefen
628 0 : const OUString sText(comphelper::string::stripEnd(GetSelText(), ' '));
629 0 : if( sText == rStr )
630 0 : bDelText = bInsText = false;
631 : }
632 0 : else if( rFormat.GetValue() == rStr ) // Are Name and URL equal?
633 0 : bDelText = bInsText = false;
634 :
635 0 : if( bDelText )
636 0 : Delete();
637 : }
638 0 : else if( pCrsr->IsMultiSelection() && rFormat.GetValue() == rStr )
639 0 : bInsText = false;
640 :
641 0 : if( bInsText )
642 : {
643 0 : Insert2( rStr );
644 0 : SetMark();
645 0 : ExtendSelection( false, rStr.getLength() );
646 : }
647 : }
648 : else
649 0 : bInsText = false;
650 :
651 0 : SetAttrItem( rFormat );
652 0 : if (bInsText && !IsCrsrPtAtEnd())
653 0 : SwapPam();
654 0 : if(!bKeepSelection)
655 0 : ClearMark();
656 0 : if( bInsText )
657 0 : DontExpandFormat();
658 0 : GetDoc()->GetIDocumentUndoRedo().EndUndo( UNDO_UI_INSERT_URLTXT, NULL );
659 0 : EndAllAction();
660 0 : return true;
661 : }
662 :
663 40 : void SwEditShell::GetINetAttrs( SwGetINetAttrs& rArr )
664 : {
665 40 : rArr.clear();
666 :
667 : const SwTextNode* pTextNd;
668 40 : const SwCharFormats* pFormats = GetDoc()->GetCharFormats();
669 112 : for( auto n = pFormats->size(); 1 < n; )
670 : {
671 32 : SwIterator<SwTextINetFormat,SwCharFormat> aIter(*(*pFormats)[--n]);
672 32 : for( SwTextINetFormat* pFnd = aIter.First(); pFnd; pFnd = aIter.Next() )
673 : {
674 0 : if( 0 != ( pTextNd = pFnd->GetpTextNode()) &&
675 0 : pTextNd->GetNodes().IsDocNodes() )
676 : {
677 0 : SwTextINetFormat& rAttr = *pFnd;
678 0 : OUString sText( pTextNd->GetExpandText( rAttr.GetStart(),
679 0 : *rAttr.GetEnd() - rAttr.GetStart() ) );
680 :
681 0 : sText = comphelper::string::remove(sText, 0x0a);
682 0 : sText = comphelper::string::strip(sText, ' ');
683 :
684 0 : if( !sText.isEmpty() )
685 : {
686 0 : SwGetINetAttr* pNew = new SwGetINetAttr( sText, rAttr );
687 0 : rArr.push_back( pNew );
688 0 : }
689 : }
690 : }
691 32 : }
692 40 : }
693 :
694 : /// If the cursor is in a INetAttribute then it will be deleted completely (incl. hint text, the
695 : /// latter is needed for drag & drop)
696 0 : bool SwEditShell::DelINetAttrWithText()
697 : {
698 0 : bool bRet = SelectTextAttr( RES_TXTATR_INETFMT, false );
699 0 : if( bRet )
700 0 : DeleteSel( *GetCrsr() );
701 0 : return bRet;
702 : }
703 :
704 : /// Set the DontExpand flag at the text character attributes
705 0 : bool SwEditShell::DontExpandFormat()
706 : {
707 0 : bool bRet = false;
708 0 : if( !IsTableMode() && GetDoc()->DontExpandFormat( *GetCrsr()->GetPoint() ))
709 : {
710 0 : bRet = true;
711 0 : CallChgLnk();
712 : }
713 0 : return bRet;
714 : }
715 :
716 0 : SvNumberFormatter* SwEditShell::GetNumberFormatter()
717 : {
718 0 : return GetDoc()->GetNumberFormatter();
719 : }
720 :
721 44 : bool SwEditShell::ConvertFieldsToText()
722 : {
723 44 : StartAllAction();
724 44 : bool bRet = GetDoc()->ConvertFieldsToText();
725 44 : EndAllAction();
726 44 : return bRet;
727 : }
728 :
729 44 : void SwEditShell::SetNumberingRestart()
730 : {
731 44 : StartAllAction();
732 44 : Push();
733 : // iterate over all text contents - body, frames, header, footer, footnote text
734 44 : SwPaM* pCrsr = GetCrsr();
735 132 : for(int i = 0; i < 2; i++)
736 : {
737 88 : if(!i)
738 44 : MakeFindRange(DOCPOS_START, DOCPOS_END, pCrsr); // body content
739 : else
740 44 : MakeFindRange(DOCPOS_OTHERSTART, DOCPOS_OTHEREND, pCrsr); // extra content
741 88 : SwPosition* pSttPos = pCrsr->Start(), *pEndPos = pCrsr->End();
742 88 : sal_uLong nCurrNd = pSttPos->nNode.GetIndex();
743 88 : sal_uLong nEndNd = pEndPos->nNode.GetIndex();
744 88 : if( nCurrNd <= nEndNd )
745 : {
746 : SwContentFrm* pCntFrm;
747 88 : bool bGoOn = true;
748 : // iterate over all paragraphs
749 432 : while( bGoOn )
750 : {
751 256 : SwNode* pNd = GetDoc()->GetNodes()[ nCurrNd ];
752 256 : switch( pNd->GetNodeType() )
753 : {
754 : case ND_TEXTNODE:
755 212 : if( 0 != ( pCntFrm = static_cast<SwTextNode*>(pNd)->getLayoutFrm( GetLayout() )) )
756 : {
757 : // skip hidden frames - ignore protection!
758 212 : if( !static_cast<SwTextFrm*>(pCntFrm)->IsHiddenNow() )
759 : {
760 : // if the node is numbered and the starting value of the numbering equals the
761 : // start value of the numbering rule then set this value as hard starting value
762 :
763 : // get the node num
764 : // OD 2005-11-09
765 212 : SwTextNode* pTextNd( pNd->GetTextNode() );
766 212 : SwNumRule* pNumRule( pTextNd->GetNumRule() );
767 :
768 : bool bIsNodeNum =
769 40 : ( pNumRule && pTextNd->GetNum() &&
770 60 : ( pTextNd->HasNumber() || pTextNd->HasBullet() ) &&
771 252 : pTextNd->IsCountedInList() &&
772 232 : !pTextNd->IsListRestart() );
773 212 : if (bIsNodeNum)
774 : {
775 20 : int nListLevel = pTextNd->GetActualListLevel();
776 :
777 20 : if (nListLevel < 0)
778 0 : nListLevel = 0;
779 :
780 20 : if (nListLevel >= MAXLEVEL)
781 0 : nListLevel = MAXLEVEL - 1;
782 :
783 40 : bIsNodeNum = pTextNd->GetNum()->GetNumber() ==
784 40 : pNumRule->Get( static_cast<sal_uInt16>(nListLevel) ).GetStart();
785 : }
786 212 : if (bIsNodeNum)
787 : {
788 : // now set a the start value as attribute
789 10 : SwPosition aCurrentNode(*pNd);
790 10 : GetDoc()->SetNumRuleStart( aCurrentNode, true );
791 : }
792 : }
793 : }
794 212 : break;
795 : case ND_SECTIONNODE:
796 : // skip hidden sections - ignore protection!
797 0 : if(static_cast<SwSectionNode*>(pNd)->GetSection().IsHidden() )
798 0 : nCurrNd = pNd->EndOfSectionIndex();
799 0 : break;
800 : case ND_ENDNODE:
801 : {
802 0 : break;
803 : }
804 : }
805 :
806 256 : bGoOn = nCurrNd < nEndNd;
807 256 : ++nCurrNd;
808 : }
809 : }
810 : }
811 :
812 44 : Pop(false);
813 44 : EndAllAction();
814 44 : }
815 :
816 0 : sal_uInt16 SwEditShell::GetLineCount( bool bActPos )
817 : {
818 0 : sal_uInt16 nRet = 0;
819 0 : CalcLayout();
820 0 : SwPaM* pPam = GetCrsr();
821 0 : SwNodeIndex& rPtIdx = pPam->GetPoint()->nNode;
822 0 : SwNodeIndex aStart( rPtIdx );
823 : SwContentNode* pCNd;
824 0 : SwContentFrm *pCntFrm = 0;
825 : sal_uLong nTmpPos;
826 :
827 0 : if( !bActPos )
828 0 : aStart = 0;
829 0 : else if( rPtIdx > ( nTmpPos = GetDoc()->GetNodes().GetEndOfExtras().GetIndex()) )
830 : // BodyArea => Start is EndOfIcons + 1
831 0 : aStart = nTmpPos + 1;
832 : else
833 : {
834 0 : if( 0 != ( pCNd = pPam->GetContentNode() ) &&
835 0 : 0 != ( pCntFrm = pCNd->getLayoutFrm( GetLayout() ) ) )
836 : {
837 : const SwStartNode *pTmp;
838 0 : if( pCntFrm->IsInFly() ) // Fly
839 0 : pTmp = pCNd->FindFlyStartNode();
840 0 : else if( pCntFrm->IsInFootnote() ) // Footnote
841 0 : pTmp = pCNd->FindFootnoteStartNode();
842 : else
843 : { // Footer/Header
844 0 : const sal_uInt16 nTyp = FRM_HEADER | FRM_FOOTER;
845 0 : SwFrm* pFrm = pCntFrm;
846 0 : while( pFrm && !(pFrm->GetType() & nTyp) )
847 0 : pFrm = pFrm->GetUpper();
848 : OSL_ENSURE( pFrm, "Wo bin ich?" );
849 0 : if( pFrm && ( pFrm->GetType() & FRM_FOOTER ) )
850 0 : pTmp = pCNd->FindFooterStartNode();
851 : else
852 0 : pTmp = pCNd->FindHeaderStartNode();
853 : }
854 : OSL_ENSURE( pTmp, "Missing StartNode" );
855 0 : aStart = *pTmp;
856 : }
857 : OSL_ENSURE( pCNd && pCntFrm, "Missing Layout-Information" );
858 : }
859 :
860 0 : while( 0 != ( pCNd = GetDoc()->GetNodes().GoNextSection(
861 0 : &aStart, true, false )) && ( !bActPos || aStart <= rPtIdx ) )
862 : {
863 0 : if( 0 != ( pCntFrm = pCNd->getLayoutFrm( GetLayout() ) ) && pCntFrm->IsTextFrm() )
864 : {
865 0 : const sal_Int32 nActPos = bActPos && aStart == rPtIdx ?
866 0 : pPam->GetPoint()->nContent.GetIndex() : COMPLETE_STRING;
867 0 : nRet = nRet + static_cast<SwTextFrm*>(pCntFrm)->GetLineCount( nActPos );
868 : }
869 : }
870 0 : return nRet;
871 : }
872 :
873 0 : long SwEditShell::CompareDoc( const SwDoc& rDoc )
874 : {
875 0 : StartAllAction();
876 0 : long nRet = GetDoc()->CompareDoc( rDoc );
877 0 : EndAllAction();
878 0 : return nRet;
879 : }
880 :
881 1 : long SwEditShell::MergeDoc( const SwDoc& rDoc )
882 : {
883 1 : StartAllAction();
884 1 : long nRet = GetDoc()->MergeDoc( rDoc );
885 1 : EndAllAction();
886 1 : return nRet;
887 : }
888 :
889 0 : const SwFootnoteInfo& SwEditShell::GetFootnoteInfo() const
890 : {
891 0 : return GetDoc()->GetFootnoteInfo();
892 : }
893 :
894 0 : void SwEditShell::SetFootnoteInfo(const SwFootnoteInfo& rInfo)
895 : {
896 0 : StartAllAction();
897 0 : SET_CURR_SHELL( this );
898 0 : GetDoc()->SetFootnoteInfo(rInfo);
899 0 : CallChgLnk();
900 0 : EndAllAction();
901 0 : }
902 :
903 0 : const SwEndNoteInfo& SwEditShell::GetEndNoteInfo() const
904 : {
905 0 : return GetDoc()->GetEndNoteInfo();
906 : }
907 :
908 0 : void SwEditShell::SetEndNoteInfo(const SwEndNoteInfo& rInfo)
909 : {
910 0 : StartAllAction();
911 0 : SET_CURR_SHELL( this );
912 0 : GetDoc()->SetEndNoteInfo(rInfo);
913 0 : EndAllAction();
914 0 : }
915 :
916 0 : const SwLineNumberInfo& SwEditShell::GetLineNumberInfo() const
917 : {
918 0 : return GetDoc()->GetLineNumberInfo();
919 : }
920 :
921 0 : void SwEditShell::SetLineNumberInfo(const SwLineNumberInfo& rInfo)
922 : {
923 0 : StartAllAction();
924 0 : SET_CURR_SHELL( this );
925 0 : GetDoc()->SetLineNumberInfo(rInfo);
926 0 : AddPaintRect( GetLayout()->Frm() );
927 0 : EndAllAction();
928 0 : }
929 :
930 0 : sal_uInt16 SwEditShell::GetLinkUpdMode(bool bDocSettings) const
931 : {
932 0 : return getIDocumentSettingAccess()->getLinkUpdateMode( !bDocSettings );
933 : }
934 :
935 0 : void SwEditShell::SetLinkUpdMode( sal_uInt16 nMode )
936 : {
937 0 : getIDocumentSettingAccess()->setLinkUpdateMode( nMode );
938 0 : }
939 :
940 : // Interface for TextInputData - (for text input of japanese/chinese characters)
941 0 : SwExtTextInput* SwEditShell::CreateExtTextInput(LanguageType eInputLanguage)
942 : {
943 0 : SwExtTextInput* pRet = GetDoc()->CreateExtTextInput( *GetCrsr() );
944 0 : pRet->SetLanguage(eInputLanguage);
945 0 : pRet->SetOverwriteCursor( SwCrsrShell::IsOverwriteCrsr() );
946 0 : return pRet;
947 : }
948 :
949 0 : OUString SwEditShell::DeleteExtTextInput( SwExtTextInput* pDel, bool bInsText )
950 : {
951 0 : if( !pDel )
952 : {
953 0 : const SwPosition& rPos = *GetCrsr()->GetPoint();
954 0 : pDel = GetDoc()->GetExtTextInput( rPos.nNode.GetNode(),
955 0 : rPos.nContent.GetIndex() );
956 0 : if( !pDel )
957 : {
958 : //JP 25.10.2001: under UNIX the cursor is moved before the Input-
959 : // Engine event comes in. So take any - normally there
960 : // exist only one at the time. -- Task 92016
961 0 : pDel = GetDoc()->GetExtTextInput();
962 : }
963 : }
964 0 : OUString sRet;
965 0 : if( pDel )
966 : {
967 0 : OUString sTmp;
968 0 : SwUnoCursorHelper::GetTextFromPam(*pDel, sTmp);
969 0 : sRet = sTmp;
970 0 : SET_CURR_SHELL( this );
971 0 : StartAllAction();
972 0 : pDel->SetInsText( bInsText );
973 0 : SetOverwriteCrsr( pDel->IsOverwriteCursor() );
974 0 : const SwPosition aPos( *pDel->GetPoint() );
975 0 : GetDoc()->DeleteExtTextInput( pDel );
976 :
977 : // In this case, the "replace" function did not set the cursor
978 : // to the original position. Therefore we have to do this manually.
979 0 : if ( ! bInsText && IsOverwriteCrsr() )
980 0 : *GetCrsr()->GetPoint() = aPos;
981 :
982 0 : EndAllAction();
983 : }
984 0 : return sRet;
985 : }
986 :
987 0 : void SwEditShell::SetExtTextInputData( const CommandExtTextInputData& rData )
988 : {
989 0 : const SwPosition& rPos = *GetCrsr()->GetPoint();
990 0 : SwExtTextInput* pInput = GetDoc()->GetExtTextInput( rPos.nNode.GetNode() );
991 0 : if( pInput )
992 : {
993 0 : StartAllAction();
994 0 : SET_CURR_SHELL( this );
995 :
996 0 : if( !rData.IsOnlyCursorChanged() )
997 0 : pInput->SetInputData( rData );
998 : // position cursor
999 0 : const SwPosition& rStt = *pInput->Start();
1000 0 : const sal_Int32 nNewCrsrPos = rStt.nContent.GetIndex() + rData.GetCursorPos();
1001 :
1002 : // ugly but works
1003 0 : ShowCrsr();
1004 0 : const sal_Int32 nDiff = nNewCrsrPos - rPos.nContent.GetIndex();
1005 0 : if( 0 > nDiff )
1006 0 : Left( (sal_Int32)-nDiff, CRSR_SKIP_CHARS );
1007 0 : else if( 0 < nDiff )
1008 0 : Right( (sal_Int32)nDiff, CRSR_SKIP_CHARS );
1009 :
1010 0 : SetOverwriteCrsr( rData.IsCursorOverwrite() );
1011 :
1012 0 : EndAllAction();
1013 :
1014 0 : if( !rData.IsCursorVisible() ) // must be called after the EndAction
1015 0 : HideCrsr();
1016 : }
1017 0 : }
1018 :
1019 0 : void SwEditShell::TransliterateText( sal_uInt32 nType )
1020 : {
1021 0 : utl::TransliterationWrapper aTrans( ::comphelper::getProcessComponentContext(), nType );
1022 0 : StartAllAction();
1023 0 : SET_CURR_SHELL( this );
1024 :
1025 0 : SwPaM* pCrsr = GetCrsr();
1026 0 : if( pCrsr->GetNext() != pCrsr )
1027 : {
1028 0 : GetDoc()->GetIDocumentUndoRedo().StartUndo(UNDO_EMPTY, NULL);
1029 0 : for(SwPaM& rPaM : GetCrsr()->GetRingContainer())
1030 : {
1031 0 : if( rPaM.HasMark() )
1032 0 : GetDoc()->getIDocumentContentOperations().TransliterateText( rPaM, aTrans );
1033 : }
1034 0 : GetDoc()->GetIDocumentUndoRedo().EndUndo(UNDO_EMPTY, NULL);
1035 : }
1036 : else
1037 0 : GetDoc()->getIDocumentContentOperations().TransliterateText( *pCrsr, aTrans );
1038 :
1039 0 : EndAllAction();
1040 0 : }
1041 :
1042 887 : void SwEditShell::CountWords( SwDocStat& rStat ) const
1043 : {
1044 1780 : for(SwPaM& rPaM : GetCrsr()->GetRingContainer())
1045 : {
1046 893 : if( rPaM.HasMark() )
1047 12 : SwDoc::CountWords( rPaM, rStat );
1048 :
1049 : }
1050 887 : }
1051 :
1052 1167 : void SwEditShell::ApplyViewOptions( const SwViewOption &rOpt )
1053 : {
1054 1167 : SwCrsrShell::StartAction();
1055 1167 : SwViewShell::ApplyViewOptions( rOpt );
1056 1167 : SwEditShell::EndAction();
1057 1344 : }
1058 :
1059 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|