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