summaryrefslogtreecommitdiff
path: root/editeng/source/editeng/eertfpar.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'editeng/source/editeng/eertfpar.cxx')
-rw-r--r--editeng/source/editeng/eertfpar.cxx632
1 files changed, 632 insertions, 0 deletions
diff --git a/editeng/source/editeng/eertfpar.cxx b/editeng/source/editeng/eertfpar.cxx
new file mode 100644
index 000000000000..9f919afb39d6
--- /dev/null
+++ b/editeng/source/editeng/eertfpar.cxx
@@ -0,0 +1,632 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * 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_editeng.hxx"
+
+#include <vcl/wrkwin.hxx>
+#include <vcl/dialog.hxx>
+#include <vcl/msgbox.hxx>
+#include <vcl/svapp.hxx>
+
+#include <eertfpar.hxx>
+#include <impedit.hxx>
+#include <svl/intitem.hxx>
+#include <editeng/escpitem.hxx>
+#include <editeng/fhgtitem.hxx>
+#include <editeng/fontitem.hxx>
+#include <editeng/flditem.hxx>
+
+#include <svtools/rtftoken.h>
+
+// alle Werte auf default; wird nach einlesen der Bitmap aufgerufen !
+void SvxRTFPictureType::ResetValues()
+{ // setze alle Werte RTF-Defaults
+ eStyle = RTF_BITMAP;
+ nMode = HEX_MODE;
+ nType = nGoalWidth = nGoalHeight = 0;
+ nWidth = nHeight = nWidthBytes = 0;
+ uPicLen = 0;
+ nBitsPerPixel = nPlanes = 1;
+ nScalX = nScalY = 100; // Skalierung in Prozent
+ nCropT = nCropB = nCropL = nCropR = 0;
+}
+
+ImportInfo::ImportInfo( ImportState eSt, SvParser* pPrsrs, const ESelection& rSel )
+ : aSelection( rSel )
+{
+ pParser = pPrsrs,
+ eState = eSt;
+
+ nToken = 0;
+ nTokenValue = 0;
+ pAttrs = NULL;
+}
+
+ImportInfo::~ImportInfo()
+{
+}
+
+EditRTFParser::EditRTFParser( SvStream& rIn, EditSelection aSel, SfxItemPool& rAttrPool, ImpEditEngine* pImpEE )
+ : SvxRTFParser( rAttrPool, rIn, 0 ), aRTFMapMode( MAP_TWIP )
+{
+
+ pImpEditEngine = pImpEE;
+ aCurSel = aSel;
+ eDestCharSet = RTL_TEXTENCODING_DONTKNOW;
+ nDefFont = 0;
+ nDefTab = 0;
+ nLastAction = 0;
+ nDefFontHeight = 0;
+
+ SetInsPos( EditPosition( pImpEditEngine, &aCurSel ) );
+
+ // Umwandeln der Twips-Werte...
+ SetCalcValue( TRUE );
+ SetChkStyleAttr( pImpEE->GetStatus().DoImportRTFStyleSheets() );
+ SetNewDoc( FALSE ); // damit die Pool-Defaults nicht
+ // ueberschrieben werden...
+ aEditMapMode = MapMode( pImpEE->GetRefDevice()->GetMapMode().GetMapUnit() );
+}
+
+EditRTFParser::~EditRTFParser()
+{
+}
+
+SvParserState __EXPORT EditRTFParser::CallParser()
+{
+ DBG_ASSERT( !aCurSel.HasRange(), "Selection bei CallParser!" );
+ // Den Teil, in den importiert wird, vom Rest abtrennen.
+ // Diese Mimik sollte fuer alle Imports verwendet werden.
+ // aStart1PaM: Letzte Position vor dem importierten Inhalt
+ // aEnd1PaM: Erste Position nach dem importierten Inhalt
+ // aStart2PaM: Erste Position des importierten Inhaltes
+ // aEnd2PaM: Letzte Position des importierten Inhaltes
+ EditPaM aStart1PaM( aCurSel.Min().GetNode(), aCurSel.Min().GetIndex() );
+ aCurSel = pImpEditEngine->ImpInsertParaBreak( aCurSel );
+ EditPaM aStart2PaM = aCurSel.Min();
+ // Sinnvoll oder nicht?:
+ aStart2PaM.GetNode()->GetContentAttribs().GetItems().ClearItem();
+ AddRTFDefaultValues( aStart2PaM, aStart2PaM );
+ EditPaM aEnd1PaM( pImpEditEngine->ImpInsertParaBreak( aCurSel.Max() ) );
+ // aCurCel zeigt jetzt auf den Zwischenraum
+
+ if ( pImpEditEngine->aImportHdl.IsSet() )
+ {
+ ImportInfo aImportInfo( RTFIMP_START, this, pImpEditEngine->CreateESel( aCurSel ) );
+ pImpEditEngine->aImportHdl.Call( &aImportInfo );
+ }
+
+ SvParserState _eState = SvxRTFParser::CallParser();
+
+ if ( pImpEditEngine->aImportHdl.IsSet() )
+ {
+ ImportInfo aImportInfo( RTFIMP_END, this, pImpEditEngine->CreateESel( aCurSel ) );
+ pImpEditEngine->aImportHdl.Call( &aImportInfo );
+ }
+
+ if ( nLastAction == ACTION_INSERTPARABRK )
+ {
+ ContentNode* pCurNode = aCurSel.Max().GetNode();
+ USHORT nPara = pImpEditEngine->GetEditDoc().GetPos( pCurNode );
+ ContentNode* pPrevNode = pImpEditEngine->GetEditDoc().SaveGetObject( nPara-1 );
+ DBG_ASSERT( pPrevNode, "Ungueltiges RTF-Dokument ?!" );
+ EditSelection aSel;
+ aSel.Min() = EditPaM( pPrevNode, pPrevNode->Len() );
+ aSel.Max() = EditPaM( pCurNode, 0 );
+ aCurSel.Max() = pImpEditEngine->ImpDeleteSelection( aSel );
+ }
+ EditPaM aEnd2PaM( aCurSel.Max() );
+ //AddRTFDefaultValues( aStart2PaM, aEnd2PaM );
+ BOOL bOnlyOnePara = ( aEnd2PaM.GetNode() == aStart2PaM.GetNode() );
+ // Den Brocken wieder einfuegen...
+ // Problem: Absatzattribute duerfen ggf. nicht uebernommen werden
+ // => Zeichenattribute machen.
+
+ BOOL bSpecialBackward = aStart1PaM.GetNode()->Len() ? FALSE : TRUE;
+ if ( bOnlyOnePara || aStart1PaM.GetNode()->Len() )
+ pImpEditEngine->ParaAttribsToCharAttribs( aStart2PaM.GetNode() );
+ aCurSel.Min() = pImpEditEngine->ImpConnectParagraphs(
+ aStart1PaM.GetNode(), aStart2PaM.GetNode(), bSpecialBackward );
+ bSpecialBackward = aEnd1PaM.GetNode()->Len() ? TRUE : FALSE;
+ // wenn bOnlyOnePara, dann ist der Node beim Connect verschwunden.
+ if ( !bOnlyOnePara && aEnd1PaM.GetNode()->Len() )
+ pImpEditEngine->ParaAttribsToCharAttribs( aEnd2PaM.GetNode() );
+ aCurSel.Max() = pImpEditEngine->ImpConnectParagraphs(
+ ( bOnlyOnePara ? aStart1PaM.GetNode() : aEnd2PaM.GetNode() ),
+ aEnd1PaM.GetNode(), bSpecialBackward );
+
+ return _eState;
+}
+
+void EditRTFParser::AddRTFDefaultValues( const EditPaM& rStart, const EditPaM& rEnd )
+{
+ // Problem: DefFont und DefFontHeight
+ Size aSz( 12, 0 );
+ MapMode aPntMode( MAP_POINT );
+ MapMode _aEditMapMode( pImpEditEngine->GetRefDevice()->GetMapMode().GetMapUnit() );
+ aSz = pImpEditEngine->GetRefDevice()->LogicToLogic( aSz, &aPntMode, &_aEditMapMode );
+ SvxFontHeightItem aFontHeightItem( aSz.Width(), 100, EE_CHAR_FONTHEIGHT );
+ Font aDefFont( GetDefFont() );
+ SvxFontItem aFontItem( aDefFont.GetFamily(), aDefFont.GetName(),
+ aDefFont.GetStyleName(), aDefFont.GetPitch(), aDefFont.GetCharSet(), EE_CHAR_FONTINFO );
+
+ USHORT nStartPara = pImpEditEngine->GetEditDoc().GetPos( rStart.GetNode() );
+ USHORT nEndPara = pImpEditEngine->GetEditDoc().GetPos( rEnd.GetNode() );
+ for ( USHORT nPara = nStartPara; nPara <= nEndPara; nPara++ )
+ {
+ ContentNode* pNode = pImpEditEngine->GetEditDoc().SaveGetObject( nPara );
+ DBG_ASSERT( pNode, "AddRTFDefaultValues - Kein Absatz ?!" );
+ if ( !pNode->GetContentAttribs().HasItem( EE_CHAR_FONTINFO ) )
+ pNode->GetContentAttribs().GetItems().Put( aFontItem );
+ if ( !pNode->GetContentAttribs().HasItem( EE_CHAR_FONTHEIGHT ) )
+ pNode->GetContentAttribs().GetItems().Put( aFontHeightItem );
+ }
+}
+
+void __EXPORT EditRTFParser::NextToken( int nToken )
+{
+ switch( nToken )
+ {
+ case RTF_DEFF:
+ {
+ nDefFont = USHORT(nTokenValue);
+ }
+ break;
+ case RTF_DEFTAB:
+ {
+ nDefTab = USHORT(nTokenValue);
+ }
+ break;
+ case RTF_CELL:
+ {
+ aCurSel = pImpEditEngine->ImpInsertParaBreak( aCurSel );
+ }
+ break;
+ case RTF_LINE:
+ {
+ aCurSel = pImpEditEngine->InsertLineBreak( aCurSel );
+ }
+ break;
+ case RTF_FIELD:
+ {
+ ReadField();
+ }
+ break;
+ case RTF_PGDSCTBL: // #i29453# ignore \*\pgdsctbl destination
+ case RTF_LISTTEXT:
+ {
+ SkipGroup();
+ }
+ break;
+ default:
+ {
+ SvxRTFParser::NextToken( nToken );
+ if ( nToken == RTF_STYLESHEET )
+ CreateStyleSheets();
+ }
+ break;
+ }
+ if ( pImpEditEngine->aImportHdl.IsSet() )
+ {
+ ImportInfo aImportInfo( RTFIMP_NEXTTOKEN, this, pImpEditEngine->CreateESel( aCurSel ) );
+ aImportInfo.nToken = nToken;
+ aImportInfo.nTokenValue = short(nTokenValue);
+ pImpEditEngine->aImportHdl.Call( &aImportInfo );
+ }
+}
+
+void __EXPORT EditRTFParser::UnknownAttrToken( int nToken, SfxItemSet* )
+{
+ // fuer Tokens, die im ReadAttr nicht ausgewertet werden
+ // Eigentlich nur fuer Calc (RTFTokenHdl), damit RTF_INTBL
+ if ( pImpEditEngine->aImportHdl.IsSet() )
+ {
+ ImportInfo aImportInfo( RTFIMP_UNKNOWNATTR, this, pImpEditEngine->CreateESel( aCurSel ) );
+ aImportInfo.nToken = nToken;
+ aImportInfo.nTokenValue = short(nTokenValue);
+ pImpEditEngine->aImportHdl.Call( &aImportInfo );
+ }
+}
+
+void __EXPORT EditRTFParser::InsertText()
+{
+ String aText( aToken );
+ if ( pImpEditEngine->aImportHdl.IsSet() )
+ {
+ ImportInfo aImportInfo( RTFIMP_INSERTTEXT, this, pImpEditEngine->CreateESel( aCurSel ) );
+ aImportInfo.aText = aText;
+ pImpEditEngine->aImportHdl.Call( &aImportInfo );
+ }
+ aCurSel = pImpEditEngine->ImpInsertText( aCurSel, aText );
+ nLastAction = ACTION_INSERTTEXT;
+}
+
+void __EXPORT EditRTFParser::InsertPara()
+{
+ if ( pImpEditEngine->aImportHdl.IsSet() )
+ {
+ ImportInfo aImportInfo( RTFIMP_INSERTPARA, this, pImpEditEngine->CreateESel( aCurSel ) );
+ pImpEditEngine->aImportHdl.Call( &aImportInfo );
+ }
+ aCurSel = pImpEditEngine->ImpInsertParaBreak( aCurSel );
+ nLastAction = ACTION_INSERTPARABRK;
+}
+
+void __EXPORT EditRTFParser::MovePos( int bForward )
+{
+ if( bForward )
+ aCurSel = pImpEditEngine->CursorRight( aCurSel.Max(), ::com::sun::star::i18n::CharacterIteratorMode::SKIPCHARACTER );
+ else
+ aCurSel = pImpEditEngine->CursorLeft( aCurSel.Max(), ::com::sun::star::i18n::CharacterIteratorMode::SKIPCHARACTER );
+}
+
+void __EXPORT EditRTFParser::SetEndPrevPara( SvxNodeIdx*& rpNodePos,
+ USHORT& rCntPos )
+{
+ // Gewollt ist: von der aktuellen Einfuegeposition den vorherigen
+ // Absatz bestimmen und von dem das Ende setzen.
+ // Dadurch wird "\pard" immer auf den richtigen Absatz
+ // angewendet.
+
+ ContentNode* pN = aCurSel.Max().GetNode();
+ USHORT nCurPara = pImpEditEngine->GetEditDoc().GetPos( pN );
+ DBG_ASSERT( nCurPara != 0, "Absatz gleich 0: SetEnfPrevPara" );
+ if ( nCurPara )
+ nCurPara--;
+ ContentNode* pPrevNode = pImpEditEngine->GetEditDoc().SaveGetObject( nCurPara );
+ DBG_ASSERT( pPrevNode, "pPrevNode = 0!" );
+ rpNodePos = new EditNodeIdx( pImpEditEngine, pPrevNode );
+ rCntPos = pPrevNode->Len();
+}
+
+int __EXPORT EditRTFParser::IsEndPara( SvxNodeIdx* pNd, USHORT nCnt ) const
+{
+ return ( nCnt == ( ((EditNodeIdx*)pNd)->GetNode()->Len()) );
+}
+
+void __EXPORT EditRTFParser::SetAttrInDoc( SvxRTFItemStackType &rSet )
+{
+ ContentNode* pSttNode = ((EditNodeIdx&)rSet.GetSttNode()).GetNode();
+ ContentNode* pEndNode = ((EditNodeIdx&)rSet.GetEndNode()).GetNode();
+
+ EditPaM aStartPaM( pSttNode, rSet.GetSttCnt() );
+ EditPaM aEndPaM( pEndNode, rSet.GetEndCnt() );
+
+ // ggf. noch das Escapemant-Item umbiegen:
+ const SfxPoolItem* pItem;
+
+ // #i66167# adapt font heights to destination MapUnit if necessary
+ const MapUnit eDestUnit = ( MapUnit )( pImpEditEngine->GetEditDoc().GetItemPool().GetMetric(0) );
+ const MapUnit eSrcUnit = aRTFMapMode.GetMapUnit();
+ if (eDestUnit != eSrcUnit)
+ {
+ USHORT aFntHeightIems[3] = { EE_CHAR_FONTHEIGHT, EE_CHAR_FONTHEIGHT_CJK, EE_CHAR_FONTHEIGHT_CTL };
+ for (int i = 0; i < 2; ++i)
+ {
+ if (SFX_ITEM_SET == rSet.GetAttrSet().GetItemState( aFntHeightIems[i], FALSE, &pItem ))
+ {
+ UINT32 nHeight = ((SvxFontHeightItem*)pItem)->GetHeight();
+ long nNewHeight;
+ nNewHeight = pImpEditEngine->GetRefDevice()->LogicToLogic( (long)nHeight, eSrcUnit, eDestUnit );
+
+ SvxFontHeightItem aFntHeightItem( nNewHeight, ((SvxFontHeightItem*)pItem)->GetProp(), aFntHeightIems[i] );
+ rSet.GetAttrSet().Put( aFntHeightItem );
+ }
+ }
+ }
+
+ if( SFX_ITEM_SET == rSet.GetAttrSet().GetItemState( EE_CHAR_ESCAPEMENT, FALSE, &pItem ))
+ {
+ // die richtige
+ long nEsc = ((SvxEscapementItem*)pItem)->GetEsc();
+
+ if( ( DFLT_ESC_AUTO_SUPER != nEsc ) && ( DFLT_ESC_AUTO_SUB != nEsc ) )
+ {
+ nEsc *= 10; //HalPoints => Twips wurde in RTFITEM.CXX unterschlagen!
+ SvxFont aFont;
+ pImpEditEngine->SeekCursor( aStartPaM.GetNode(), aStartPaM.GetIndex()+1, aFont );
+ nEsc = nEsc * 100 / aFont.GetSize().Height();
+
+ SvxEscapementItem aEscItem( (short) nEsc, ((SvxEscapementItem*)pItem)->GetProp(), EE_CHAR_ESCAPEMENT );
+ rSet.GetAttrSet().Put( aEscItem );
+ }
+ }
+
+ if ( pImpEditEngine->aImportHdl.IsSet() )
+ {
+ EditSelection aSel( aStartPaM, aEndPaM );
+ ImportInfo aImportInfo( RTFIMP_SETATTR, this, pImpEditEngine->CreateESel( aSel ) );
+ aImportInfo.pAttrs = &rSet;
+ pImpEditEngine->aImportHdl.Call( &aImportInfo );
+ }
+
+ ContentNode* pSN = aStartPaM.GetNode();
+ ContentNode* pEN = aEndPaM.GetNode();
+ USHORT nStartNode = pImpEditEngine->GetEditDoc().GetPos( pSN );
+ USHORT nEndNode = pImpEditEngine->GetEditDoc().GetPos( pEN );
+ sal_Int16 nOutlLevel = 0xff;
+
+ if ( rSet.StyleNo() && pImpEditEngine->GetStyleSheetPool() && pImpEditEngine->GetStatus().DoImportRTFStyleSheets() )
+ {
+ SvxRTFStyleType* pS = GetStyleTbl().Get( rSet.StyleNo() );
+ DBG_ASSERT( pS, "Vorlage in RTF nicht definiert!" );
+ if ( pS )
+ {
+ pImpEditEngine->SetStyleSheet( EditSelection( aStartPaM, aEndPaM ), (SfxStyleSheet*)pImpEditEngine->GetStyleSheetPool()->Find( pS->sName, SFX_STYLE_FAMILY_ALL ) );
+ nOutlLevel = pS->nOutlineNo;
+ }
+ }
+
+ // Wenn ein Attribut von 0 bis aktuelle Absatzlaenge geht,
+ // soll es ein Absatz-Attribut sein!
+
+ // Achtung: Selektion kann ueber mehrere Absaetze gehen.
+ // Alle vollstaendigen Absaetze sind Absatzattribute...
+ for ( USHORT z = nStartNode+1; z < nEndNode; z++ )
+ {
+ DBG_ASSERT( pImpEditEngine->GetEditDoc().SaveGetObject( z ), "Node existiert noch nicht(RTF)" );
+ pImpEditEngine->SetParaAttribs( z, rSet.GetAttrSet() );
+ }
+
+ if ( aStartPaM.GetNode() != aEndPaM.GetNode() )
+ {
+ // Den Rest des StartNodes...
+ if ( aStartPaM.GetIndex() == 0 )
+ pImpEditEngine->SetParaAttribs( nStartNode, rSet.GetAttrSet() );
+ else
+ pImpEditEngine->SetAttribs( EditSelection( aStartPaM, EditPaM( aStartPaM.GetNode(), aStartPaM.GetNode()->Len() ) ), rSet.GetAttrSet() );
+
+ // Den Anfang des EndNodes....
+ if ( aEndPaM.GetIndex() == aEndPaM.GetNode()->Len() )
+ pImpEditEngine->SetParaAttribs( nEndNode, rSet.GetAttrSet() );
+ else
+ pImpEditEngine->SetAttribs( EditSelection( EditPaM( aEndPaM.GetNode(), 0 ), aEndPaM ), rSet.GetAttrSet() );
+ }
+ else
+ {
+ if ( ( aStartPaM.GetIndex() == 0 ) && ( aEndPaM.GetIndex() == aEndPaM.GetNode()->Len() ) )
+ {
+ // #96298# When settings char attribs as para attribs, we must merge with existing attribs, not overwrite the ItemSet!
+ SfxItemSet aAttrs = pImpEditEngine->GetParaAttribs( nStartNode );
+ aAttrs.Put( rSet.GetAttrSet() );
+ pImpEditEngine->SetParaAttribs( nStartNode, aAttrs );
+ }
+ else
+ {
+ pImpEditEngine->SetAttribs( EditSelection( aStartPaM, aEndPaM ), rSet.GetAttrSet() );
+ }
+ }
+
+ // OutlLevel...
+ if ( nOutlLevel != 0xff )
+ {
+ for ( USHORT n = nStartNode; n <= nEndNode; n++ )
+ {
+ ContentNode* pNode = pImpEditEngine->GetEditDoc().SaveGetObject( n );
+ pNode->GetContentAttribs().GetItems().Put( SfxInt16Item( EE_PARA_OUTLLEVEL, nOutlLevel ) );
+ }
+ }
+}
+
+SvxRTFStyleType* EditRTFParser::FindStyleSheet( const XubString& rName )
+{
+ SvxRTFStyleType* pS = GetStyleTbl().First();
+ while ( pS && ( pS->sName != rName ) )
+ pS = GetStyleTbl().Next();
+
+ return pS;
+}
+
+SfxStyleSheet* EditRTFParser::CreateStyleSheet( SvxRTFStyleType* pRTFStyle )
+{
+ // Prueffen, ob so eine Vorlage existiert....
+ // dann wird sie auch nicht geaendert!
+ SfxStyleSheet* pStyle = (SfxStyleSheet*)pImpEditEngine->GetStyleSheetPool()->Find( pRTFStyle->sName, SFX_STYLE_FAMILY_ALL );
+ if ( pStyle )
+ return pStyle;
+
+ String aName( pRTFStyle->sName );
+ String aParent;
+ if ( pRTFStyle->nBasedOn )
+ {
+ SvxRTFStyleType* pS = GetStyleTbl().Get( pRTFStyle->nBasedOn );
+ if ( pS && ( pS !=pRTFStyle ) )
+ aParent = pS->sName;
+ }
+
+ pStyle = (SfxStyleSheet*) &pImpEditEngine->GetStyleSheetPool()->Make( aName, SFX_STYLE_FAMILY_PARA );
+
+ // 1) Items konvertieren und uebernehmen...
+ ConvertAndPutItems( pStyle->GetItemSet(), pRTFStyle->aAttrSet );
+
+ // 2) Solange Parent nicht im Pool, auch diesen kreieren...
+ if ( aParent.Len() && ( aParent != aName ) )
+ {
+ SfxStyleSheet* pS = (SfxStyleSheet*)pImpEditEngine->GetStyleSheetPool()->Find( aParent, SFX_STYLE_FAMILY_ALL );
+ if ( !pS )
+ {
+ // Wenn nirgendwo gefunden, aus RTF erzeugen...
+ SvxRTFStyleType* _pRTFStyle = FindStyleSheet( aParent );
+ if ( _pRTFStyle )
+ pS = CreateStyleSheet( _pRTFStyle );
+ }
+ // 2b) ItemSet mit Parent verknuepfen...
+ if ( pS )
+ pStyle->GetItemSet().SetParent( &pS->GetItemSet() );
+ }
+ return pStyle;
+}
+
+void EditRTFParser::CreateStyleSheets()
+{
+ // der SvxRTFParser hat jetzt die Vorlagen erzeugt...
+ if ( pImpEditEngine->GetStyleSheetPool() && pImpEditEngine->GetStatus().DoImportRTFStyleSheets() )
+ {
+ SvxRTFStyleType* pRTFStyle = GetStyleTbl().First();
+ while ( pRTFStyle )
+ {
+ CreateStyleSheet( pRTFStyle );
+
+ pRTFStyle = GetStyleTbl().Next();
+ }
+ }
+}
+
+void __EXPORT EditRTFParser::CalcValue()
+{
+ const MapUnit eDestUnit = static_cast< MapUnit >( aEditMapMode.GetMapUnit() );
+ const MapUnit eSrcUnit = aRTFMapMode.GetMapUnit();
+ if (eDestUnit != eSrcUnit)
+ nTokenValue = OutputDevice::LogicToLogic( (long)nTokenValue, eSrcUnit, eDestUnit );
+}
+
+void EditRTFParser::ReadField()
+{
+ // Aus SwRTFParser::ReadField()
+ int _nOpenBrakets = 1; // die erste wurde schon vorher erkannt
+ BOOL bFldInst = FALSE;
+ BOOL bFldRslt = FALSE;
+ String aFldInst;
+ String aFldRslt;
+
+ while( _nOpenBrakets && IsParserWorking() )
+ {
+ switch( GetNextToken() )
+ {
+ case '}':
+ {
+ _nOpenBrakets--;
+ if ( _nOpenBrakets == 1 )
+ {
+ bFldInst = FALSE;
+ bFldRslt = FALSE;
+ }
+ }
+ break;
+
+ case '{': _nOpenBrakets++;
+ break;
+
+ case RTF_FIELD: SkipGroup();
+ break;
+
+ case RTF_FLDINST: bFldInst = TRUE;
+ break;
+
+ case RTF_FLDRSLT: bFldRslt = TRUE;
+ break;
+
+ case RTF_TEXTTOKEN:
+ {
+ if ( bFldInst )
+ aFldInst += aToken;
+ else if ( bFldRslt )
+ aFldRslt += aToken;
+ }
+ break;
+ }
+ }
+ if ( aFldInst.Len() )
+ {
+ String aHyperLinkMarker( RTL_CONSTASCII_USTRINGPARAM( "HYPERLINK " ) );
+ if ( aFldInst.CompareIgnoreCaseToAscii( aHyperLinkMarker, aHyperLinkMarker.Len() ) == COMPARE_EQUAL )
+ {
+ aFldInst.Erase( 0, aHyperLinkMarker.Len() );
+ aFldInst.EraseLeadingChars();
+ aFldInst.EraseTrailingChars();
+ aFldInst.Erase( 0, 1 ); // "
+ aFldInst.Erase( aFldInst.Len()-1, 1 ); // "
+
+ if ( !aFldRslt.Len() )
+ aFldRslt = aFldInst;
+
+ SvxFieldItem aField( SvxURLField( aFldInst, aFldRslt, SVXURLFORMAT_REPR ), EE_FEATURE_FIELD );
+ aCurSel = pImpEditEngine->InsertField( aCurSel, aField );
+ pImpEditEngine->UpdateFields();
+ nLastAction = ACTION_INSERTTEXT;
+ }
+ }
+
+ SkipToken( -1 ); // die schliesende Klammer wird "oben" ausgewertet
+}
+
+void EditRTFParser::SkipGroup()
+{
+ int _nOpenBrakets = 1; // die erste wurde schon vorher erkannt
+
+ while( _nOpenBrakets && IsParserWorking() )
+ {
+ switch( GetNextToken() )
+ {
+ case '}':
+ {
+ _nOpenBrakets--;
+ }
+ break;
+
+ case '{':
+ {
+ _nOpenBrakets++;
+ }
+ break;
+ }
+ }
+
+ SkipToken( -1 ); // die schliesende Klammer wird "oben" ausgewertet
+}
+
+ULONG __EXPORT EditNodeIdx::GetIdx() const
+{
+ return pImpEditEngine->GetEditDoc().GetPos( pNode );
+}
+
+SvxNodeIdx* __EXPORT EditNodeIdx::Clone() const
+{
+ return new EditNodeIdx( pImpEditEngine, pNode );
+}
+
+SvxPosition* __EXPORT EditPosition::Clone() const
+{
+ return new EditPosition( pImpEditEngine, pCurSel );
+}
+
+SvxNodeIdx* __EXPORT EditPosition::MakeNodeIdx() const
+{
+ return new EditNodeIdx( pImpEditEngine, pCurSel->Max().GetNode() );
+}
+
+ULONG __EXPORT EditPosition::GetNodeIdx() const
+{
+ ContentNode* pN = pCurSel->Max().GetNode();
+ return pImpEditEngine->GetEditDoc().GetPos( pN );
+}
+
+USHORT __EXPORT EditPosition::GetCntIdx() const
+{
+ return pCurSel->Max().GetIndex();
+}