summaryrefslogtreecommitdiff
path: root/sw/source/core/edit/editsh.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sw/source/core/edit/editsh.cxx')
-rw-r--r--sw/source/core/edit/editsh.cxx1191
1 files changed, 1191 insertions, 0 deletions
diff --git a/sw/source/core/edit/editsh.cxx b/sw/source/core/edit/editsh.cxx
new file mode 100644
index 000000000000..0a866b3855fb
--- /dev/null
+++ b/sw/source/core/edit/editsh.cxx
@@ -0,0 +1,1191 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: editsh.cxx,v $
+ * $Revision: 1.58 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sw.hxx"
+#include <hintids.hxx>
+#include <tools/list.hxx>
+#include <tools/urlobj.hxx>
+#include <vcl/cmdevt.hxx>
+#include <unotools/charclass.hxx>
+#include <comphelper/processfactory.hxx>
+#include <unotools/transliterationwrapper.hxx>
+#include <swwait.hxx>
+#include <fmtsrnd.hxx>
+#include <fmtinfmt.hxx>
+#include <txtinet.hxx>
+#include <frmfmt.hxx>
+#include <charfmt.hxx>
+#include <doc.hxx>
+#include <docary.hxx>
+#include <editsh.hxx>
+#include <frame.hxx>
+#include <cntfrm.hxx>
+#include <pam.hxx>
+#include <ndtxt.hxx> // fuer SwTxtNode
+#include <grfatr.hxx>
+#include <flyfrm.hxx>
+#include <swtable.hxx>
+#include <swundo.hxx> // UNDO_START, UNDO_END
+#include <calc.hxx>
+#include <edimp.hxx>
+#include <ndgrf.hxx>
+#include <ndole.hxx>
+#include <txtfrm.hxx>
+#include <rootfrm.hxx>
+#include <extinput.hxx>
+#include <crsskip.hxx>
+#include <scriptinfo.hxx>
+#include <unoobj.hxx>
+#include <section.hxx>
+#include <unochart.hxx>
+#include <numrule.hxx>
+#include <SwNodeNum.hxx>
+
+using namespace com::sun::star;
+
+SV_IMPL_PTRARR(SwGetINetAttrs, SwGetINetAttr*)
+
+/******************************************************************************
+ * void SwEditShell::Insert(char c)
+ ******************************************************************************/
+
+
+void SwEditShell::Insert( sal_Unicode c, BOOL bOnlyCurrCrsr )
+{
+ StartAllAction();
+ FOREACHPAM_START(this)
+
+ if( !GetDoc()->Insert(*PCURCRSR, c) )
+ {
+ ASSERT( FALSE, "Doc->Insert(c) failed." )
+ }
+
+ SaveTblBoxCntnt( PCURCRSR->GetPoint() );
+ if( bOnlyCurrCrsr )
+ break;
+
+ FOREACHPAM_END()
+
+ EndAllAction();
+}
+
+
+/******************************************************************************
+ * void SwEditShell::Insert(const String &rStr)
+ ******************************************************************************/
+
+
+void SwEditShell::Insert(const String &rStr)
+{
+ StartAllAction();
+ {
+ SwPaM *_pStartCrsr = getShellCrsr( true ), *__pStartCrsr = _pStartCrsr;
+ do {
+ //OPT: GetSystemCharSet
+ if( !GetDoc()->Insert( *_pStartCrsr, rStr, true ) )
+ {
+ ASSERT( FALSE, "Doc->Insert(Str) failed." )
+ }
+
+ SaveTblBoxCntnt( _pStartCrsr->GetPoint() );
+
+ } while( (_pStartCrsr=(SwPaM *)_pStartCrsr->GetNext()) != __pStartCrsr );
+ }
+
+ // calculate cursor bidi level
+ SwCursor* pTmpCrsr = _GetCrsr();
+ const BOOL bDoNotSetBidiLevel = ! pTmpCrsr ||
+ ( 0 != (SwUnoCrsr*)*pTmpCrsr );
+
+ if ( ! bDoNotSetBidiLevel )
+ {
+ SwNode& rNode = pTmpCrsr->GetPoint()->nNode.GetNode();
+ if ( rNode.IsTxtNode() )
+ {
+ SwIndex& rIdx = pTmpCrsr->GetPoint()->nContent;
+ xub_StrLen nPos = rIdx.GetIndex();
+ xub_StrLen nPrevPos = nPos;
+ if ( nPrevPos )
+ --nPrevPos;
+
+ SwScriptInfo* pSI = SwScriptInfo::GetScriptInfo( ((SwTxtNode&)rNode),
+ sal_True );
+
+ BYTE nLevel = 0;
+ if ( ! pSI )
+ {
+ // seems to be an empty paragraph.
+ Point aPt;
+ SwCntntFrm* pFrm =
+ ((SwTxtNode&)rNode).GetFrm( &aPt, pTmpCrsr->GetPoint(),
+ sal_False );
+
+ SwScriptInfo aScriptInfo;
+ aScriptInfo.InitScriptInfo( (SwTxtNode&)rNode, pFrm->IsRightToLeft() );
+ nLevel = aScriptInfo.DirType( nPrevPos );
+ }
+ else
+ {
+ if ( STRING_LEN != pSI->GetInvalidity() )
+ pSI->InitScriptInfo( (SwTxtNode&)rNode );
+ nLevel = pSI->DirType( nPrevPos );
+ }
+
+ pTmpCrsr->SetCrsrBidiLevel( nLevel );
+ }
+ }
+
+ SetInFrontOfLabel( FALSE ); // #i27615#
+
+ EndAllAction();
+}
+
+
+/******************************************************************************
+ * void SwEditShell::Overwrite(const String &rStr)
+ ******************************************************************************/
+
+
+void SwEditShell::Overwrite(const String &rStr)
+{
+ StartAllAction();
+ FOREACHPAM_START(this)
+ if( !GetDoc()->Overwrite(*PCURCRSR, rStr ) )
+ {
+ ASSERT( FALSE, "Doc->Overwrite(Str) failed." )
+ }
+ SaveTblBoxCntnt( PCURCRSR->GetPoint() );
+ FOREACHPAM_END()
+ EndAllAction();
+}
+
+
+/******************************************************************************
+ * long SwEditShell::SplitNode()
+ ******************************************************************************/
+
+long SwEditShell::SplitNode( BOOL bAutoFormat, BOOL bCheckTableStart )
+{
+ StartAllAction();
+ GetDoc()->StartUndo(UNDO_EMPTY, NULL);
+
+ FOREACHPAM_START(this)
+ // eine Tabellen Zelle wird jetzt zu einer normalen Textzelle!
+ GetDoc()->ClearBoxNumAttrs( PCURCRSR->GetPoint()->nNode );
+ GetDoc()->SplitNode( *PCURCRSR->GetPoint(), bCheckTableStart );
+ FOREACHPAM_END()
+
+ GetDoc()->EndUndo(UNDO_EMPTY, NULL);
+
+ if( bAutoFormat )
+ AutoFmtBySplitNode();
+
+ ClearTblBoxCntnt();
+
+ EndAllAction();
+ return(1L);
+}
+
+/*-- 11.05.2004 09:41:20---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+sal_Bool SwEditShell::AppendTxtNode()
+{
+ sal_Bool bRet = sal_False;
+ StartAllAction();
+ GetDoc()->StartUndo(UNDO_EMPTY, NULL);
+
+ FOREACHPAM_START(this)
+ GetDoc()->ClearBoxNumAttrs( PCURCRSR->GetPoint()->nNode );
+ bRet = GetDoc()->AppendTxtNode( *PCURCRSR->GetPoint()) || bRet;
+ FOREACHPAM_END()
+
+ GetDoc()->EndUndo(UNDO_EMPTY, NULL);
+
+ ClearTblBoxCntnt();
+
+ EndAllAction();
+ return bRet;
+}
+
+/******************************************************************************
+ * liefert einen Pointer auf einen SwGrfNode; dieser wird von
+ * GetGraphic() und GetGraphicSize() verwendet.
+ ******************************************************************************/
+
+
+SwGrfNode * SwEditShell::_GetGrfNode() const
+{
+ SwGrfNode *pGrfNode = 0;
+ SwPaM* pCrsr = GetCrsr();
+ if( !pCrsr->HasMark() ||
+ pCrsr->GetPoint()->nNode == pCrsr->GetMark()->nNode )
+ pGrfNode = pCrsr->GetPoint()->nNode.GetNode().GetGrfNode();
+
+ return pGrfNode;
+}
+/******************************************************************************
+ * liefert Pointer auf eine Graphic, wenn CurCrsr->GetPoint() auf
+ * einen SwGrfNode zeigt (und GetMark nicht gesetzt ist
+ * oder auf die gleiche Graphic zeigt)
+ ******************************************************************************/
+
+// --> OD 2005-02-09 #119353# - robust
+const Graphic* SwEditShell::GetGraphic( BOOL bWait ) const
+{
+ SwGrfNode* pGrfNode = _GetGrfNode();
+ // --> OD 2005-02-09 #119353# - robust
+ const Graphic* pGrf( 0L );
+ if ( pGrfNode )
+ {
+ pGrf = &(pGrfNode->GetGrf());
+ // --> OD 2007-03-01 #i73788#
+ // no load of linked graphic, if its not needed now (bWait = FALSE).
+ if ( bWait )
+ {
+ if( pGrf->IsSwapOut() ||
+ ( pGrfNode->IsLinkedFile() && GRAPHIC_DEFAULT == pGrf->GetType() ) )
+ {
+#ifndef PRODUCT
+ ASSERT( pGrfNode->SwapIn( bWait ) || !bWait, "Grafik konnte nicht geladen werden" );
+#else
+ pGrfNode->SwapIn( bWait );
+#endif
+ }
+ }
+ else
+ {
+ if ( pGrf->IsSwapOut() && !pGrfNode->IsLinkedFile() )
+ {
+#ifndef PRODUCT
+ ASSERT( pGrfNode->SwapIn( bWait ) || !bWait, "Grafik konnte nicht geladen werden" );
+#else
+ pGrfNode->SwapIn( bWait );
+#endif
+ }
+ }
+ // <--
+ }
+ return pGrf;
+ // <--
+}
+
+BOOL SwEditShell::IsGrfSwapOut( BOOL bOnlyLinked ) const
+{
+ SwGrfNode *pGrfNode = _GetGrfNode();
+ return pGrfNode &&
+ (bOnlyLinked ? ( pGrfNode->IsLinkedFile() &&
+ ( GRAPHIC_DEFAULT == pGrfNode->GetGrfObj().GetType()||
+ pGrfNode->GetGrfObj().IsSwappedOut()))
+ : pGrfNode->GetGrfObj().IsSwappedOut());
+}
+
+// --> OD 2005-02-09 #119353# - robust
+const GraphicObject* SwEditShell::GetGraphicObj() const
+{
+ SwGrfNode* pGrfNode = _GetGrfNode();
+ // --> OD 2005-02-09 #119353# - robust
+ return pGrfNode ? &(pGrfNode->GetGrfObj()) : 0L;
+ // <--
+}
+
+USHORT SwEditShell::GetGraphicType() const
+{
+ SwGrfNode *pGrfNode = _GetGrfNode();
+ return static_cast<USHORT>(pGrfNode ? pGrfNode->GetGrfObj().GetType() : GRAPHIC_NONE);
+}
+
+/******************************************************************************
+ * liefert die Groesse der Graphic, wenn CurCrsr->GetPoint() auf
+ * einen SwGrfNode zeigt (und GetMark nicht gesetzt ist
+ * oder auf die gleiche Graphic zeigt)
+ ******************************************************************************/
+
+BOOL SwEditShell::GetGrfSize(Size& rSz) const
+{
+ SwNoTxtNode* pNoTxtNd;
+ SwPaM* pCurrentCrsr = GetCrsr();
+ if( ( !pCurrentCrsr->HasMark()
+ || pCurrentCrsr->GetPoint()->nNode == pCurrentCrsr->GetMark()->nNode )
+ && 0 != ( pNoTxtNd = pCurrentCrsr->GetNode()->GetNoTxtNode() ) )
+ {
+ rSz = pNoTxtNd->GetTwipSize();
+ return TRUE;
+ }
+ return FALSE;
+
+}
+/******************************************************************************
+ * erneutes Einlesen, falls Graphic nicht Ok ist. Die
+ * aktuelle wird durch die neue ersetzt.
+ ******************************************************************************/
+
+void SwEditShell::ReRead( const String& rGrfName, const String& rFltName,
+ const Graphic* pGraphic, const GraphicObject* pGrfObj )
+{
+ StartAllAction();
+ pDoc->ReRead( *GetCrsr(), rGrfName, rFltName, pGraphic, pGrfObj );
+ EndAllAction();
+}
+
+
+/******************************************************************************
+ * liefert den Namen und den FilterNamen einer Graphic, wenn der Cursor
+ * auf einer Graphic steht
+ * Ist ein String-Ptr != 0 dann returne den entsp. Namen
+ ******************************************************************************/
+
+
+void SwEditShell::GetGrfNms( String* pGrfName, String* pFltName,
+ const SwFlyFrmFmt* pFmt ) const
+{
+ ASSERT( pGrfName || pFltName, "was wird denn nun erfragt?" );
+ if( pFmt )
+ GetDoc()->GetGrfNms( *pFmt, pGrfName, pFltName );
+ else
+ {
+ SwGrfNode *pGrfNode = _GetGrfNode();
+ if( pGrfNode && pGrfNode->IsLinkedFile() )
+ pGrfNode->GetFileFilterNms( pGrfName, pFltName );
+ }
+}
+
+
+// alternativen Text abfragen/setzen
+const String& SwEditShell::GetAlternateText() const
+{
+ SwPaM* pCrsr = GetCrsr();
+ const SwNoTxtNode* pNd;
+ if( !pCrsr->HasMark() && 0 != ( pNd = pCrsr->GetNode()->GetNoTxtNode()) )
+ return pNd->GetAlternateText();
+
+ return aEmptyStr;
+}
+
+
+void SwEditShell::SetAlternateText( const String& rTxt )
+{
+ SwPaM* pCrsr = GetCrsr();
+ SwNoTxtNode* pNd;
+ if( !pCrsr->HasMark() && 0 != ( pNd = pCrsr->GetNode()->GetNoTxtNode()) )
+ {
+ pNd->SetAlternateText( rTxt, sal_True );
+ GetDoc()->SetModified();
+ }
+}
+
+
+const PolyPolygon *SwEditShell::GetGraphicPolygon() const
+{
+ SwNoTxtNode *pNd = GetCrsr()->GetNode()->GetNoTxtNode();
+ return pNd->HasContour();
+}
+
+
+void SwEditShell::SetGraphicPolygon( const PolyPolygon *pPoly )
+{
+ SwNoTxtNode *pNd = GetCrsr()->GetNode()->GetNoTxtNode();
+ StartAllAction();
+ pNd->SetContour( pPoly );
+ SwFlyFrm *pFly = (SwFlyFrm*)pNd->GetFrm()->GetUpper();
+ const SwFmtSurround &rSur = pFly->GetFmt()->GetSurround();
+ pFly->GetFmt()->SwModify::Modify( (SwFmtSurround*)&rSur,
+ (SwFmtSurround*)&rSur );
+ GetDoc()->SetModified();
+ EndAllAction();
+}
+
+void SwEditShell::ClearAutomaticContour()
+{
+ SwNoTxtNode *pNd = GetCrsr()->GetNode()->GetNoTxtNode();
+ ASSERT( pNd, "is no NoTxtNode!" );
+ if( pNd->HasAutomaticContour() )
+ {
+ StartAllAction();
+ pNd->SetContour( NULL, FALSE );
+ SwFlyFrm *pFly = (SwFlyFrm*)pNd->GetFrm()->GetUpper();
+ const SwFmtSurround &rSur = pFly->GetFmt()->GetSurround();
+ pFly->GetFmt()->SwModify::Modify( (SwFmtSurround*)&rSur,
+ (SwFmtSurround*)&rSur );
+ GetDoc()->SetModified();
+ EndAllAction();
+ }
+}
+
+/******************************************************************************
+ * liefert Pointer auf ein SvInPlaceObjectRef, wenn CurCrsr->GetPoint() auf
+ * einen SwOLENode zeigt (und GetMark nicht gesetzt ist
+ * oder auf das gleiche SvInPlaceObjectRef zeigt)
+ * besorgt den Pointer vom Doc wenn das Objekt per Namen gesucht werden
+ * soll
+ ******************************************************************************/
+
+svt::EmbeddedObjectRef& SwEditShell::GetOLEObject() const
+{
+ ASSERT( CNT_OLE == GetCntType(), "GetOLEObj: kein OLENode." );
+ ASSERT( !GetCrsr()->HasMark() ||
+ (GetCrsr()->HasMark() &&
+ GetCrsr()->GetPoint()->nNode == GetCrsr()->GetMark()->nNode),
+ "GetOLEObj: kein OLENode." );
+
+ SwOLENode *pOLENode = GetCrsr()->GetNode()->GetOLENode();
+ ASSERT( pOLENode, "GetOLEObj: kein OLENode." );
+ SwOLEObj& rOObj = pOLENode->GetOLEObj();
+ return rOObj.GetObject();
+}
+
+
+BOOL SwEditShell::HasOLEObj( const String &rName ) const
+{
+ SwStartNode *pStNd;
+ SwNodeIndex aIdx( *GetNodes().GetEndOfAutotext().StartOfSectionNode(), 1 );
+ while ( 0 != (pStNd = aIdx.GetNode().GetStartNode()) )
+ {
+ aIdx++;
+ SwNode& rNd = aIdx.GetNode();
+ if( rNd.IsOLENode() &&
+ rName == ((SwOLENode&)rNd).GetChartTblName() &&
+ ((SwOLENode&)rNd).GetFrm() )
+ return TRUE;
+
+ aIdx.Assign( *pStNd->EndOfSectionNode(), + 1 );
+ }
+ return FALSE;
+}
+
+
+void SwEditShell::SetChartName( const String &rName )
+{
+ SwOLENode *pONd = GetCrsr()->GetNode()->GetOLENode();
+ ASSERT( pONd, "ChartNode not found" );
+ pONd->SetChartTblName( rName );
+}
+
+void SwEditShell::UpdateCharts( const String &rName )
+{
+ GetDoc()->UpdateCharts( rName );
+}
+
+
+/******************************************************************************
+ * Aenderung des Tabellennamens
+ ******************************************************************************/
+
+void SwEditShell::SetTableName( SwFrmFmt& rTblFmt, const String &rNewName )
+{
+ GetDoc()->SetTableName( rTblFmt, rNewName );
+}
+
+// erfragen des akt. Wortes
+
+String SwEditShell::GetCurWord()
+{
+ const SwPaM& rPaM = *GetCrsr();
+ const SwTxtNode* pNd = rPaM.GetNode()->GetTxtNode();
+ String aString = pNd ?
+ pNd->GetCurWord(rPaM.GetPoint()->nContent.GetIndex()) :
+ aEmptyStr;
+ return aString;
+}
+
+/****************************************************************************
+ * void SwEditShell::UpdateDocStat( SwDocStat& rStat )
+ ****************************************************************************/
+
+
+void SwEditShell::UpdateDocStat( SwDocStat& rStat )
+{
+ StartAllAction();
+ GetDoc()->UpdateDocStat( rStat );
+ EndAllAction();
+}
+
+// OPT: eddocinl.cxx
+
+
+ // returne zum Namen die im Doc gesetzte Referenz
+const SwFmtRefMark* SwEditShell::GetRefMark( const String& rName ) const
+{
+ return GetDoc()->GetRefMark( rName );
+}
+
+ // returne die Namen aller im Doc gesetzten Referenzen
+USHORT SwEditShell::GetRefMarks( SvStringsDtor* pStrings ) const
+{
+ return GetDoc()->GetRefMarks( pStrings );
+}
+
+/******************************************************************************
+ * DropCap-SS
+ ******************************************************************************/
+
+
+String SwEditShell::GetDropTxt( const USHORT nChars ) const
+{
+ /**
+ * pb: made changes for #i74939#
+ *
+ * always return a string even though there is a selection
+ */
+
+ String aTxt;
+ SwPaM* pCrsr = GetCrsr();
+ if ( IsMultiSelection() )
+ {
+ // if a multi selection exists, search for the first line
+ // -> it is the cursor with the lowest index
+ ULONG nIndex = pCrsr->GetMark()->nNode.GetIndex();
+ bool bPrev = true;
+ SwPaM* pLast = pCrsr;
+ SwPaM* pTemp = pCrsr;
+ while ( bPrev )
+ {
+ SwPaM* pPrev2 = dynamic_cast< SwPaM* >( pTemp->GetPrev() );
+ bPrev = ( pPrev2 && pPrev2 != pLast );
+ if ( bPrev )
+ {
+ pTemp = pPrev2;
+ ULONG nTemp = pPrev2->GetMark()->nNode.GetIndex();
+ if ( nTemp < nIndex )
+ {
+ nIndex = nTemp;
+ pCrsr = pPrev2;
+ }
+ }
+ }
+ }
+
+ SwTxtNode* pTxtNd = pCrsr->GetNode( !pCrsr->HasMark() )->GetTxtNode();
+ if( pTxtNd )
+ {
+ xub_StrLen nDropLen = pTxtNd->GetDropLen( nChars );
+ if( nDropLen )
+ aTxt = pTxtNd->GetTxt().Copy( 0, nDropLen );
+ }
+
+ return aTxt;
+}
+
+void SwEditShell::ReplaceDropTxt( const String &rStr )
+{
+ SwPaM* pCrsr = GetCrsr();
+ if( pCrsr->GetPoint()->nNode == pCrsr->GetMark()->nNode &&
+ pCrsr->GetNode()->GetTxtNode()->IsTxtNode() )
+ {
+ StartAllAction();
+
+ const SwNodeIndex& rNd = pCrsr->GetPoint()->nNode;
+ SwPaM aPam( rNd, rStr.Len(), rNd, 0 );
+ if( !GetDoc()->Overwrite( aPam, rStr ) )
+ {
+ ASSERT( FALSE, "Doc->Overwrite(Str) failed." );
+ }
+
+ EndAllAction();
+ }
+}
+
+/******************************************************************************
+ * Methode :
+ * Beschreibung:
+ * Erstellt : OK 25.04.94 13:45
+ * Aenderung :
+ ******************************************************************************/
+
+String SwEditShell::Calculate()
+{
+ String aFormel; // die entgueltige Formel
+ SwPaM *pPaMLast = (SwPaM*)GetCrsr()->GetNext(),
+ *pPaM = pPaMLast; // die Pointer auf Cursor
+ SwCalc aCalc( *GetDoc() );
+ const CharClass& rCC = GetAppCharClass();
+
+ do {
+ SwTxtNode* pTxtNd = pPaM->GetNode()->GetTxtNode();
+ if(pTxtNd)
+ {
+ const SwPosition *pStart = pPaM->Start(), *pEnd = pPaM->End();
+ xub_StrLen nStt = pStart->nContent.GetIndex();
+ String aStr = pTxtNd->GetExpandTxt( nStt, pEnd->nContent.
+ GetIndex() - nStt );
+
+ rCC.toLower( aStr );
+
+ sal_Unicode ch;
+ BOOL bValidFlds = FALSE;
+ xub_StrLen nPos = 0;
+
+ while( nPos < aStr.Len() )
+ {
+ ch = aStr.GetChar( nPos++ );
+ if( rCC.isLetter( aStr, nPos-1 ) || ch == '_' )
+ {
+ xub_StrLen nTmpStt = nPos-1;
+ while( nPos < aStr.Len() &&
+ 0 != ( ch = aStr.GetChar( nPos++ )) &&
+ (rCC.isLetterNumeric( aStr, nPos - 1 ) ||
+ ch == '_'|| ch == '.' ))
+ ;
+
+ if( nPos < aStr.Len() )
+ --nPos;
+
+ String sVar( aStr.Copy( nTmpStt, nPos - nTmpStt ));
+ if( !::FindOperator( sVar ) &&
+ (::Find( sVar, aCalc.GetVarTable(),TBLSZ) ||
+ aCalc.VarLook( sVar )) )
+ {
+ if( !bValidFlds )
+ {
+ GetDoc()->FldsToCalc( aCalc,
+ pStart->nNode.GetIndex(),
+ pStart->nContent.GetIndex() );
+ bValidFlds = TRUE;
+ }
+ (( aFormel += '(' ) +=
+ aCalc.GetStrResult( aCalc.VarLook( sVar )
+ ->nValue )) += ')';
+ }
+ else
+ aFormel += sVar;
+ }
+ else
+ aFormel += ch;
+ }
+ }
+ } while( pPaMLast != (pPaM = (SwPaM*)pPaM->GetNext()) );
+
+ return aCalc.GetStrResult( aCalc.Calculate(aFormel) );
+}
+
+
+SvxLinkManager& SwEditShell::GetLinkManager()
+{
+ return pDoc->GetLinkManager();
+}
+
+
+void *SwEditShell::GetIMapInventor() const
+{
+ //Als eindeutige Identifikation sollte der Node, auf dem der Crsr steht
+ //genuegen.
+ return (void*)GetCrsr()->GetNode();
+}
+
+// --> OD 2007-03-01 #i73788#
+// remove default parameter, because method is always called this default value
+Graphic SwEditShell::GetIMapGraphic() const
+{
+ //Liefert immer eine Graphic, wenn der Crsr in einem Fly steht.
+ SET_CURR_SHELL( (ViewShell*)this );
+ Graphic aRet;
+ SwPaM* pCrsr = GetCrsr();
+ if ( !pCrsr->HasMark() )
+ {
+ SwNode *pNd =pCrsr->GetNode();
+ if( pNd->IsGrfNode() )
+ {
+ const Graphic& rGrf = ((SwGrfNode*)pNd)->GetGrf();
+ if( rGrf.IsSwapOut() || ( ((SwGrfNode*)pNd)->IsLinkedFile() &&
+ GRAPHIC_DEFAULT == rGrf.GetType() ) )
+ {
+#ifndef PRODUCT
+ ASSERT( ((SwGrfNode*)pNd)->SwapIn( TRUE ) || !TRUE, "Grafik konnte nicht geladen werden" );
+#else
+ ((SwGrfNode*)pNd)->SwapIn( TRUE );
+#endif
+ }
+ aRet = rGrf;
+ }
+ else if ( pNd->IsOLENode() )
+ {
+ aRet = *((SwOLENode*)pNd)->GetGraphic();
+ }
+ else
+ {
+ SwFlyFrm* pFlyFrm = pNd->GetCntntNode()->GetFrm()->FindFlyFrm();
+ if(pFlyFrm)
+ aRet = pFlyFrm->GetFmt()->MakeGraphic();
+ }
+ }
+ return aRet;
+}
+
+
+BOOL SwEditShell::InsertURL( const SwFmtINetFmt& rFmt, const String& rStr, BOOL bKeepSelection )
+{
+ // URL und Hinweistext (direkt oder via Selektion) notwendig
+ if( !rFmt.GetValue().Len() || ( !rStr.Len() && !HasSelection() ) )
+ return FALSE;
+ StartAllAction();
+ GetDoc()->StartUndo( UNDO_UI_INSERT_URLTXT, NULL);
+ BOOL bInsTxt = TRUE;
+
+ if( rStr.Len() )
+ {
+ SwPaM* pCrsr = GetCrsr();
+ if( pCrsr->HasMark() && *pCrsr->GetPoint() != *pCrsr->GetMark() )
+ {
+ // Selection vorhanden, MehrfachSelektion?
+ BOOL bDelTxt = TRUE;
+ if( pCrsr->GetNext() == pCrsr )
+ {
+ // einfach Selection -> Text ueberpruefen
+ String sTxt( GetSelTxt() );
+ sTxt.EraseTrailingChars();
+ if( sTxt == rStr )
+ bDelTxt = bInsTxt = FALSE;
+ }
+ else if( rFmt.GetValue() == rStr ) // Name und URL gleich?
+ bDelTxt = bInsTxt = FALSE;
+
+ if( bDelTxt )
+ Delete();
+ }
+ else if( pCrsr->GetNext() != pCrsr && rFmt.GetValue() == rStr )
+ bInsTxt = FALSE;
+
+ if( bInsTxt )
+ {
+ Insert( rStr );
+ SetMark();
+ ExtendSelection( FALSE, rStr.Len() );
+ }
+ }
+ else
+ bInsTxt = FALSE;
+
+ SetAttr( rFmt );
+ if (bInsTxt && !IsCrsrPtAtEnd())
+ SwapPam();
+ if(!bKeepSelection)
+ ClearMark();
+ if( bInsTxt )
+ DontExpandFmt();
+ GetDoc()->EndUndo( UNDO_UI_INSERT_URLTXT, NULL );
+ EndAllAction();
+ return TRUE;
+}
+
+
+USHORT SwEditShell::GetINetAttrs( SwGetINetAttrs& rArr )
+{
+ if( rArr.Count() )
+ rArr.DeleteAndDestroy( 0, rArr.Count() );
+
+ const SwTxtNode* pTxtNd;
+ const SwCharFmts* pFmts = GetDoc()->GetCharFmts();
+ for( USHORT n = pFmts->Count(); 1 < n; )
+ {
+ SwClientIter aIter( *(*pFmts)[ --n ] );
+
+ for( SwClient* pFnd = aIter.First(TYPE( SwTxtINetFmt ));
+ pFnd; pFnd = aIter.Next() )
+ if( 0 != ( pTxtNd = ((SwTxtINetFmt*)pFnd)->GetpTxtNode()) &&
+ pTxtNd->GetNodes().IsDocNodes() )
+ {
+ SwTxtINetFmt& rAttr = *(SwTxtINetFmt*)pFnd;
+ String sTxt( pTxtNd->GetExpandTxt( *rAttr.GetStart(),
+ *rAttr.GetEnd() - *rAttr.GetStart() ) );
+
+ sTxt.EraseAllChars( 0x0a );
+ sTxt.EraseLeadingChars().EraseTrailingChars();
+
+ if( sTxt.Len() )
+ {
+ SwGetINetAttr* pNew = new SwGetINetAttr( sTxt, rAttr );
+ rArr.C40_INSERT( SwGetINetAttr, pNew, rArr.Count() );
+ }
+ }
+ }
+ return rArr.Count();
+}
+
+
+ // ist der Cursor in eine INetAttribut, dann wird das komplett
+ // geloescht; inclusive des Hinweistextes (wird beim Drag&Drop gebraucht)
+BOOL SwEditShell::DelINetAttrWithText()
+{
+ BOOL bRet = SelectTxtAttr( RES_TXTATR_INETFMT, FALSE );
+ if( bRet )
+ DeleteSel( *GetCrsr() );
+ return bRet;
+}
+
+
+// setzen an den Textzeichenattributen das DontExpand-Flag
+BOOL SwEditShell::DontExpandFmt()
+{
+ BOOL bRet = FALSE;
+ if( !IsTableMode() && GetDoc()->DontExpandFmt( *GetCrsr()->GetPoint() ))
+ {
+ bRet = TRUE;
+ CallChgLnk();
+ }
+ return bRet;
+}
+
+SvNumberFormatter* SwEditShell::GetNumberFormatter()
+{
+ return GetDoc()->GetNumberFormatter();
+}
+
+BOOL SwEditShell::RemoveInvisibleContent()
+{
+ StartAllAction();
+ BOOL bRet = GetDoc()->RemoveInvisibleContent();
+ EndAllAction();
+ return bRet;
+}
+BOOL SwEditShell::ConvertFieldsToText()
+{
+ StartAllAction();
+ BOOL bRet = GetDoc()->ConvertFieldsToText();
+ EndAllAction();
+ return bRet;
+}
+void SwEditShell::SetNumberingRestart()
+{
+ StartAllAction();
+ Push();
+ //iterate over all text contents - body, frames, header, footer, footnote text
+ SwPaM* pCrsr = GetCrsr();
+ for(sal_uInt16 i = 0; i < 2; i++)
+ {
+ if(!i)
+ MakeFindRange(DOCPOS_START, DOCPOS_END, pCrsr); //body content
+ else
+ MakeFindRange(DOCPOS_OTHERSTART, DOCPOS_OTHEREND, pCrsr); //extra content
+ SwPosition* pSttPos = pCrsr->Start(), *pEndPos = pCrsr->End();
+ ULONG nCurrNd = pSttPos->nNode.GetIndex();
+ ULONG nEndNd = pEndPos->nNode.GetIndex();
+ if( nCurrNd <= nEndNd )
+ {
+ SwCntntFrm* pCntFrm;
+ sal_Bool bGoOn = sal_True;
+ //iterate over all paragraphs
+ while( bGoOn )
+ {
+ SwNode* pNd = GetDoc()->GetNodes()[ nCurrNd ];
+ switch( pNd->GetNodeType() )
+ {
+ case ND_TEXTNODE:
+ if( 0 != ( pCntFrm = ((SwTxtNode*)pNd)->GetFrm()) )
+ {
+ //jump over hidden frames - ignore protection!
+ if( !((SwTxtFrm*)pCntFrm)->IsHiddenNow() )
+ {
+ //if the node is numbered and the starting value of the numbering equals the
+ //start value of the numbering rule then set this value as hard starting value
+
+ //get the node num
+ // OD 2005-11-09
+ SwTxtNode* pTxtNd( static_cast<SwTxtNode*>(pNd) );
+ SwNumRule* pNumRule( pTxtNd->GetNumRule() );
+
+ if ( pNumRule && pTxtNd->GetNum() &&
+ ( pTxtNd->HasNumber() || pTxtNd->HasBullet() ) &&
+ pTxtNd->IsCountedInList() &&
+ !pTxtNd->IsListRestart() &&
+ pTxtNd->GetNum()->GetNumber() ==
+ pNumRule->Get( static_cast<USHORT>(pTxtNd->GetActualListLevel()) ).GetStart() )
+ {
+ //now set a the start value as attribute
+ SwPosition aCurrentNode(*pNd);
+ GetDoc()->SetNumRuleStart( aCurrentNode, sal_True );
+ }
+ }
+ }
+ break;
+ case ND_SECTIONNODE:
+ // jump over hidden sections - ignore protection!
+ if(((SwSectionNode*)pNd)->GetSection().IsHidden() )
+ nCurrNd = pNd->EndOfSectionIndex();
+ break;
+ case ND_ENDNODE:
+ {
+ break;
+ }
+ }
+
+ bGoOn = nCurrNd < nEndNd;
+ ++nCurrNd;
+ }
+ }
+ }
+
+
+ Pop(FALSE);
+ EndAllAction();
+}
+
+USHORT SwEditShell::GetLineCount( BOOL bActPos )
+{
+ USHORT nRet = 0;
+ CalcLayout();
+ SwPaM* pPam = GetCrsr();
+ SwNodeIndex& rPtIdx = pPam->GetPoint()->nNode;
+ SwNodeIndex aStart( rPtIdx );
+ SwCntntNode* pCNd;
+ SwCntntFrm *pCntFrm = 0;
+ ULONG nTmpPos;
+
+ if( !bActPos )
+ aStart = 0;
+ else if( rPtIdx > ( nTmpPos = GetDoc()->GetNodes().GetEndOfExtras().GetIndex()) )
+ // BodyBereich => Start ist EndOfIcons + 1
+ aStart = nTmpPos + 1;
+ else
+ {
+ if( 0 != ( pCNd = pPam->GetCntntNode() ) &&
+ 0 != ( pCntFrm = pCNd->GetFrm() ) )
+ {
+ const SwStartNode *pTmp;
+ if( pCntFrm->IsInFly() ) // Fly
+ pTmp = pCNd->FindFlyStartNode();
+ else if( pCntFrm->IsInFtn() ) // Footnote
+ pTmp = pCNd->FindFootnoteStartNode();
+ else
+ { // Footer/Header
+ const USHORT nTyp = FRM_HEADER | FRM_FOOTER;
+ SwFrm* pFrm = pCntFrm;
+ while( pFrm && !(pFrm->GetType() & nTyp) )
+ pFrm = pFrm->GetUpper();
+ ASSERT( pFrm, "Wo bin ich?" );
+ if( pFrm && ( pFrm->GetType() & FRM_FOOTER ) )
+ pTmp = pCNd->FindFooterStartNode();
+ else
+ pTmp = pCNd->FindHeaderStartNode();
+ }
+ ASSERT( pTmp, "Missing StartNode" );
+ aStart = *pTmp;
+ }
+ ASSERT( pCNd && pCntFrm, "Missing Layout-Information" );
+ }
+
+ while( 0 != ( pCNd = GetDoc()->GetNodes().GoNextSection(
+ &aStart, TRUE, FALSE )) && ( !bActPos || aStart <= rPtIdx ) )
+ {
+ if( 0 != ( pCntFrm = pCNd->GetFrm() ) && pCntFrm->IsTxtFrm() )
+ {
+ xub_StrLen nActPos = bActPos && aStart == rPtIdx ?
+ pPam->GetPoint()->nContent.GetIndex() : USHRT_MAX;
+ nRet = nRet + ((SwTxtFrm*)pCntFrm)->GetLineCount( nActPos );
+ }
+ }
+ return nRet;
+}
+
+long SwEditShell::CompareDoc( const SwDoc& rDoc )
+{
+ StartAllAction();
+ long nRet = GetDoc()->CompareDoc( rDoc );
+ EndAllAction();
+ return nRet;
+}
+
+long SwEditShell::MergeDoc( const SwDoc& rDoc )
+{
+ StartAllAction();
+ long nRet = GetDoc()->MergeDoc( rDoc );
+ EndAllAction();
+ return nRet;
+}
+
+
+const SwFtnInfo& SwEditShell::GetFtnInfo() const
+{
+ return GetDoc()->GetFtnInfo();
+}
+
+void SwEditShell::SetFtnInfo(const SwFtnInfo& rInfo)
+{
+ StartAllAction();
+ SET_CURR_SHELL( this );
+ GetDoc()->SetFtnInfo(rInfo);
+ CallChgLnk();
+ EndAllAction();
+}
+
+const SwEndNoteInfo& SwEditShell::GetEndNoteInfo() const
+{
+ return GetDoc()->GetEndNoteInfo();
+}
+
+void SwEditShell::SetEndNoteInfo(const SwEndNoteInfo& rInfo)
+{
+ StartAllAction();
+ SET_CURR_SHELL( this );
+ GetDoc()->SetEndNoteInfo(rInfo);
+ EndAllAction();
+}
+
+const SwLineNumberInfo& SwEditShell::GetLineNumberInfo() const
+{
+ return GetDoc()->GetLineNumberInfo();
+}
+
+void SwEditShell::SetLineNumberInfo(const SwLineNumberInfo& rInfo)
+{
+ StartAllAction();
+ SET_CURR_SHELL( this );
+ GetDoc()->SetLineNumberInfo(rInfo);
+ AddPaintRect( GetLayout()->Frm() );
+ EndAllAction();
+}
+
+USHORT SwEditShell::GetLinkUpdMode(BOOL bDocSettings) const
+{
+ return getIDocumentSettingAccess()->getLinkUpdateMode( !bDocSettings );
+}
+
+void SwEditShell::SetLinkUpdMode( USHORT nMode )
+{
+ getIDocumentSettingAccess()->setLinkUpdateMode( nMode );
+}
+
+
+// Schnittstelle fuer die TextInputDaten - ( fuer die Texteingabe
+// von japanischen/chinesischen Zeichen)
+SwExtTextInput* SwEditShell::CreateExtTextInput(LanguageType eInputLanguage)
+{
+ SwExtTextInput* pRet = GetDoc()->CreateExtTextInput( *GetCrsr() );
+ pRet->SetLanguage(eInputLanguage);
+ pRet->SetOverwriteCursor( SwCrsrShell::IsOverwriteCrsr() );
+ return pRet;
+}
+
+String SwEditShell::DeleteExtTextInput( SwExtTextInput* pDel, BOOL bInsText )
+{
+ if( !pDel )
+ {
+ const SwPosition& rPos = *GetCrsr()->GetPoint();
+ pDel = GetDoc()->GetExtTextInput( rPos.nNode.GetNode(),
+ rPos.nContent.GetIndex() );
+ if( !pDel )
+ {
+ //JP 25.10.2001: under UNIX the cursor is moved before the Input-
+ // Engine event comes in. So take any - normally there
+ // exist only one at the time. -- Task 92016
+ pDel = GetDoc()->GetExtTextInput();
+ }
+ }
+ String sRet;
+ if( pDel )
+ {
+ rtl::OUString sTmp;
+ SwXTextCursor::getTextFromPam(*pDel, sTmp);
+ sRet = sTmp;
+ SET_CURR_SHELL( this );
+ StartAllAction();
+ pDel->SetInsText( bInsText );
+ SetOverwriteCrsr( pDel->IsOverwriteCursor() );
+ const SwPosition aPos( *pDel->GetPoint() );
+ GetDoc()->DeleteExtTextInput( pDel );
+
+ // In this case, the "replace" function did not set the cursor
+ // to the original position. Therefore we have to do this manually.
+ if ( ! bInsText && IsOverwriteCrsr() )
+ *GetCrsr()->GetPoint() = aPos;
+
+ EndAllAction();
+ }
+ return sRet;
+}
+
+void SwEditShell::SetExtTextInputData( const CommandExtTextInputData& rData )
+{
+ const SwPosition& rPos = *GetCrsr()->GetPoint();
+ SwExtTextInput* pInput = GetDoc()->GetExtTextInput( rPos.nNode.GetNode()
+ /*, rPos.nContent.GetIndex()*/ );
+ if( pInput )
+ {
+ StartAllAction();
+ SET_CURR_SHELL( this );
+
+ if( !rData.IsOnlyCursorChanged() )
+ pInput->SetInputData( rData );
+ // Cursor positionieren:
+ const SwPosition& rStt = *pInput->Start();
+ xub_StrLen nNewCrsrPos = rStt.nContent.GetIndex() + rData.GetCursorPos();
+
+ // zwar unschoen aber was hilfts
+ ShowCrsr();
+ long nDiff = nNewCrsrPos - rPos.nContent.GetIndex();
+ if( 0 > nDiff )
+ Left( (xub_StrLen)-nDiff, CRSR_SKIP_CHARS );
+ else if( 0 < nDiff )
+ Right( (xub_StrLen)nDiff, CRSR_SKIP_CHARS );
+
+ SetOverwriteCrsr( rData.IsCursorOverwrite() );
+
+ EndAllAction();
+
+ if( !rData.IsCursorVisible() ) // must be called after the EndAction
+ HideCrsr();
+ }
+}
+
+void SwEditShell::TransliterateText( sal_uInt32 nType )
+{
+ utl::TransliterationWrapper aTrans(
+ ::comphelper::getProcessServiceFactory(), nType );
+ StartAllAction();
+ SET_CURR_SHELL( this );
+
+ SwPaM* pCrsr = GetCrsr();
+ if( pCrsr->GetNext() != pCrsr )
+ {
+ GetDoc()->StartUndo(UNDO_EMPTY, NULL);
+ FOREACHPAM_START( this )
+
+ if( PCURCRSR->HasMark() )
+ GetDoc()->TransliterateText( *PCURCRSR, aTrans );
+
+ FOREACHPAM_END()
+ GetDoc()->EndUndo(UNDO_EMPTY, NULL);
+ }
+ else
+ GetDoc()->TransliterateText( *pCrsr, aTrans );
+
+ EndAllAction();
+}
+
+void SwEditShell::CountWords( SwDocStat& rStat ) const
+{
+ FOREACHPAM_START( this )
+
+ if( PCURCRSR->HasMark() )
+ GetDoc()->CountWords( *PCURCRSR, rStat );
+
+ FOREACHPAM_END()
+}
+