1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: eertfpar.cxx,v $
12 * This file is part of OpenOffice.org.
14 * OpenOffice.org is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU Lesser General Public License version 3
16 * only, as published by the Free Software Foundation.
18 * OpenOffice.org is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Lesser General Public License version 3 for more details
22 * (a copy is included in the LICENSE file that accompanied this code).
24 * You should have received a copy of the GNU Lesser General Public License
25 * version 3 along with OpenOffice.org. If not, see
26 * <http://www.openoffice.org/license.html>
27 * for a copy of the LGPLv3 License.
29 ************************************************************************/
31 // MARKER(update_precomp.py): autogen include statement, do not remove
32 #include "precompiled_svx.hxx"
34 #include <eeng_pch.hxx>
36 #include <eertfpar.hxx>
37 #include <impedit.hxx>
38 #include <svtools/intitem.hxx>
39 #include <svx/escpitem.hxx>
40 #include <svx/fhgtitem.hxx>
41 #include "fontitem.hxx"
42 #include <svx/flditem.hxx>
44 #include <svtools/rtftoken.h>
46 // alle Werte auf default; wird nach einlesen der Bitmap aufgerufen !
47 void SvxRTFPictureType::ResetValues()
48 { // setze alle Werte RTF-Defaults
51 nType
= nGoalWidth
= nGoalHeight
= 0;
52 nWidth
= nHeight
= nWidthBytes
= 0;
54 nBitsPerPixel
= nPlanes
= 1;
55 nScalX
= nScalY
= 100; // Skalierung in Prozent
56 nCropT
= nCropB
= nCropL
= nCropR
= 0;
59 ImportInfo::ImportInfo( ImportState eSt
, SvParser
* pPrsrs
, const ESelection
& rSel
)
70 ImportInfo::~ImportInfo()
74 EditRTFParser::EditRTFParser( SvStream
& rIn
, EditSelection aSel
, SfxItemPool
& rAttrPool
, ImpEditEngine
* pImpEE
)
75 : SvxRTFParser( rAttrPool
, rIn
, 0 ), aRTFMapMode( MAP_TWIP
)
78 pImpEditEngine
= pImpEE
;
80 eDestCharSet
= RTL_TEXTENCODING_DONTKNOW
;
86 SetInsPos( EditPosition( pImpEditEngine
, &aCurSel
) );
88 // Umwandeln der Twips-Werte...
90 SetChkStyleAttr( pImpEE
->GetStatus().DoImportRTFStyleSheets() );
91 SetNewDoc( FALSE
); // damit die Pool-Defaults nicht
92 // ueberschrieben werden...
93 aEditMapMode
= MapMode( pImpEE
->GetRefDevice()->GetMapMode().GetMapUnit() );
96 EditRTFParser::~EditRTFParser()
100 SvParserState __EXPORT
EditRTFParser::CallParser()
102 DBG_ASSERT( !aCurSel
.HasRange(), "Selection bei CallParser!" );
103 // Den Teil, in den importiert wird, vom Rest abtrennen.
104 // Diese Mimik sollte fuer alle Imports verwendet werden.
105 // aStart1PaM: Letzte Position vor dem importierten Inhalt
106 // aEnd1PaM: Erste Position nach dem importierten Inhalt
107 // aStart2PaM: Erste Position des importierten Inhaltes
108 // aEnd2PaM: Letzte Position des importierten Inhaltes
109 EditPaM
aStart1PaM( aCurSel
.Min().GetNode(), aCurSel
.Min().GetIndex() );
110 aCurSel
= pImpEditEngine
->ImpInsertParaBreak( aCurSel
);
111 EditPaM aStart2PaM
= aCurSel
.Min();
112 // Sinnvoll oder nicht?:
113 aStart2PaM
.GetNode()->GetContentAttribs().GetItems().ClearItem();
114 AddRTFDefaultValues( aStart2PaM
, aStart2PaM
);
115 EditPaM
aEnd1PaM( pImpEditEngine
->ImpInsertParaBreak( aCurSel
.Max() ) );
116 // aCurCel zeigt jetzt auf den Zwischenraum
118 if ( pImpEditEngine
->aImportHdl
.IsSet() )
120 ImportInfo
aImportInfo( RTFIMP_START
, this, pImpEditEngine
->CreateESel( aCurSel
) );
121 pImpEditEngine
->aImportHdl
.Call( &aImportInfo
);
124 SvParserState _eState
= SvxRTFParser::CallParser();
126 if ( pImpEditEngine
->aImportHdl
.IsSet() )
128 ImportInfo
aImportInfo( RTFIMP_END
, this, pImpEditEngine
->CreateESel( aCurSel
) );
129 pImpEditEngine
->aImportHdl
.Call( &aImportInfo
);
132 if ( nLastAction
== ACTION_INSERTPARABRK
)
134 ContentNode
* pCurNode
= aCurSel
.Max().GetNode();
135 USHORT nPara
= pImpEditEngine
->GetEditDoc().GetPos( pCurNode
);
136 ContentNode
* pPrevNode
= pImpEditEngine
->GetEditDoc().SaveGetObject( nPara
-1 );
137 DBG_ASSERT( pPrevNode
, "Ungueltiges RTF-Dokument ?!" );
139 aSel
.Min() = EditPaM( pPrevNode
, pPrevNode
->Len() );
140 aSel
.Max() = EditPaM( pCurNode
, 0 );
141 aCurSel
.Max() = pImpEditEngine
->ImpDeleteSelection( aSel
);
143 EditPaM
aEnd2PaM( aCurSel
.Max() );
144 //AddRTFDefaultValues( aStart2PaM, aEnd2PaM );
145 BOOL bOnlyOnePara
= ( aEnd2PaM
.GetNode() == aStart2PaM
.GetNode() );
146 // Den Brocken wieder einfuegen...
147 // Problem: Absatzattribute duerfen ggf. nicht uebernommen werden
148 // => Zeichenattribute machen.
150 BOOL bSpecialBackward
= aStart1PaM
.GetNode()->Len() ? FALSE
: TRUE
;
151 if ( bOnlyOnePara
|| aStart1PaM
.GetNode()->Len() )
152 pImpEditEngine
->ParaAttribsToCharAttribs( aStart2PaM
.GetNode() );
153 aCurSel
.Min() = pImpEditEngine
->ImpConnectParagraphs(
154 aStart1PaM
.GetNode(), aStart2PaM
.GetNode(), bSpecialBackward
);
155 bSpecialBackward
= aEnd1PaM
.GetNode()->Len() ? TRUE
: FALSE
;
156 // wenn bOnlyOnePara, dann ist der Node beim Connect verschwunden.
157 if ( !bOnlyOnePara
&& aEnd1PaM
.GetNode()->Len() )
158 pImpEditEngine
->ParaAttribsToCharAttribs( aEnd2PaM
.GetNode() );
159 aCurSel
.Max() = pImpEditEngine
->ImpConnectParagraphs(
160 ( bOnlyOnePara
? aStart1PaM
.GetNode() : aEnd2PaM
.GetNode() ),
161 aEnd1PaM
.GetNode(), bSpecialBackward
);
166 void EditRTFParser::AddRTFDefaultValues( const EditPaM
& rStart
, const EditPaM
& rEnd
)
168 // Problem: DefFont und DefFontHeight
170 MapMode
aPntMode( MAP_POINT
);
171 MapMode
_aEditMapMode( pImpEditEngine
->GetRefDevice()->GetMapMode().GetMapUnit() );
172 aSz
= pImpEditEngine
->GetRefDevice()->LogicToLogic( aSz
, &aPntMode
, &_aEditMapMode
);
173 SvxFontHeightItem
aFontHeightItem( aSz
.Width(), 100, EE_CHAR_FONTHEIGHT
);
174 Font
aDefFont( GetDefFont() );
175 SvxFontItem
aFontItem( aDefFont
.GetFamily(), aDefFont
.GetName(),
176 aDefFont
.GetStyleName(), aDefFont
.GetPitch(), aDefFont
.GetCharSet(), EE_CHAR_FONTINFO
);
178 USHORT nStartPara
= pImpEditEngine
->GetEditDoc().GetPos( rStart
.GetNode() );
179 USHORT nEndPara
= pImpEditEngine
->GetEditDoc().GetPos( rEnd
.GetNode() );
180 for ( USHORT nPara
= nStartPara
; nPara
<= nEndPara
; nPara
++ )
182 ContentNode
* pNode
= pImpEditEngine
->GetEditDoc().SaveGetObject( nPara
);
183 DBG_ASSERT( pNode
, "AddRTFDefaultValues - Kein Absatz ?!" );
184 if ( !pNode
->GetContentAttribs().HasItem( EE_CHAR_FONTINFO
) )
185 pNode
->GetContentAttribs().GetItems().Put( aFontItem
);
186 if ( !pNode
->GetContentAttribs().HasItem( EE_CHAR_FONTHEIGHT
) )
187 pNode
->GetContentAttribs().GetItems().Put( aFontHeightItem
);
191 void __EXPORT
EditRTFParser::NextToken( int nToken
)
197 nDefFont
= USHORT(nTokenValue
);
202 nDefTab
= USHORT(nTokenValue
);
207 aCurSel
= pImpEditEngine
->ImpInsertParaBreak( aCurSel
);
212 aCurSel
= pImpEditEngine
->InsertLineBreak( aCurSel
);
220 case RTF_PGDSCTBL
: // #i29453# ignore \*\pgdsctbl destination
228 SvxRTFParser::NextToken( nToken
);
229 if ( nToken
== RTF_STYLESHEET
)
234 if ( pImpEditEngine
->aImportHdl
.IsSet() )
236 ImportInfo
aImportInfo( RTFIMP_NEXTTOKEN
, this, pImpEditEngine
->CreateESel( aCurSel
) );
237 aImportInfo
.nToken
= nToken
;
238 aImportInfo
.nTokenValue
= short(nTokenValue
);
239 pImpEditEngine
->aImportHdl
.Call( &aImportInfo
);
243 void __EXPORT
EditRTFParser::UnknownAttrToken( int nToken
, SfxItemSet
* )
245 // fuer Tokens, die im ReadAttr nicht ausgewertet werden
246 // Eigentlich nur fuer Calc (RTFTokenHdl), damit RTF_INTBL
247 if ( pImpEditEngine
->aImportHdl
.IsSet() )
249 ImportInfo
aImportInfo( RTFIMP_UNKNOWNATTR
, this, pImpEditEngine
->CreateESel( aCurSel
) );
250 aImportInfo
.nToken
= nToken
;
251 aImportInfo
.nTokenValue
= short(nTokenValue
);
252 pImpEditEngine
->aImportHdl
.Call( &aImportInfo
);
256 void __EXPORT
EditRTFParser::InsertText()
258 String
aText( aToken
);
259 if ( pImpEditEngine
->aImportHdl
.IsSet() )
261 ImportInfo
aImportInfo( RTFIMP_INSERTTEXT
, this, pImpEditEngine
->CreateESel( aCurSel
) );
262 aImportInfo
.aText
= aText
;
263 pImpEditEngine
->aImportHdl
.Call( &aImportInfo
);
265 aCurSel
= pImpEditEngine
->ImpInsertText( aCurSel
, aText
);
266 nLastAction
= ACTION_INSERTTEXT
;
269 void __EXPORT
EditRTFParser::InsertPara()
271 if ( pImpEditEngine
->aImportHdl
.IsSet() )
273 ImportInfo
aImportInfo( RTFIMP_INSERTPARA
, this, pImpEditEngine
->CreateESel( aCurSel
) );
274 pImpEditEngine
->aImportHdl
.Call( &aImportInfo
);
276 aCurSel
= pImpEditEngine
->ImpInsertParaBreak( aCurSel
);
277 nLastAction
= ACTION_INSERTPARABRK
;
280 void __EXPORT
EditRTFParser::MovePos( int bForward
)
283 aCurSel
= pImpEditEngine
->CursorRight( aCurSel
.Max(), ::com::sun::star::i18n::CharacterIteratorMode::SKIPCHARACTER
);
285 aCurSel
= pImpEditEngine
->CursorLeft( aCurSel
.Max(), ::com::sun::star::i18n::CharacterIteratorMode::SKIPCHARACTER
);
288 void __EXPORT
EditRTFParser::SetEndPrevPara( SvxNodeIdx
*& rpNodePos
,
291 // Gewollt ist: von der aktuellen Einfuegeposition den vorherigen
292 // Absatz bestimmen und von dem das Ende setzen.
293 // Dadurch wird "\pard" immer auf den richtigen Absatz
296 ContentNode
* pN
= aCurSel
.Max().GetNode();
297 USHORT nCurPara
= pImpEditEngine
->GetEditDoc().GetPos( pN
);
298 DBG_ASSERT( nCurPara
!= 0, "Absatz gleich 0: SetEnfPrevPara" );
301 ContentNode
* pPrevNode
= pImpEditEngine
->GetEditDoc().SaveGetObject( nCurPara
);
302 DBG_ASSERT( pPrevNode
, "pPrevNode = 0!" );
303 rpNodePos
= new EditNodeIdx( pImpEditEngine
, pPrevNode
);
304 rCntPos
= pPrevNode
->Len();
307 int __EXPORT
EditRTFParser::IsEndPara( SvxNodeIdx
* pNd
, USHORT nCnt
) const
309 return ( nCnt
== ( ((EditNodeIdx
*)pNd
)->GetNode()->Len()) );
312 void __EXPORT
EditRTFParser::SetAttrInDoc( SvxRTFItemStackType
&rSet
)
314 ContentNode
* pSttNode
= ((EditNodeIdx
&)rSet
.GetSttNode()).GetNode();
315 ContentNode
* pEndNode
= ((EditNodeIdx
&)rSet
.GetEndNode()).GetNode();
317 EditPaM
aStartPaM( pSttNode
, rSet
.GetSttCnt() );
318 EditPaM
aEndPaM( pEndNode
, rSet
.GetEndCnt() );
320 // ggf. noch das Escapemant-Item umbiegen:
321 const SfxPoolItem
* pItem
;
323 // #i66167# adapt font heights to destination MapUnit if necessary
324 const MapUnit eDestUnit
= ( MapUnit
)( pImpEditEngine
->GetEditDoc().GetItemPool().GetMetric(0) );
325 const MapUnit eSrcUnit
= aRTFMapMode
.GetMapUnit();
326 if (eDestUnit
!= eSrcUnit
)
328 USHORT aFntHeightIems
[3] = { EE_CHAR_FONTHEIGHT
, EE_CHAR_FONTHEIGHT_CJK
, EE_CHAR_FONTHEIGHT_CTL
};
329 for (int i
= 0; i
< 2; ++i
)
331 if (SFX_ITEM_SET
== rSet
.GetAttrSet().GetItemState( aFntHeightIems
[i
], FALSE
, &pItem
))
333 UINT32 nHeight
= ((SvxFontHeightItem
*)pItem
)->GetHeight();
335 nNewHeight
= pImpEditEngine
->GetRefDevice()->LogicToLogic( (long)nHeight
, eSrcUnit
, eDestUnit
);
337 SvxFontHeightItem
aFntHeightItem( nNewHeight
, ((SvxFontHeightItem
*)pItem
)->GetProp(), aFntHeightIems
[i
] );
338 rSet
.GetAttrSet().Put( aFntHeightItem
);
343 if( SFX_ITEM_SET
== rSet
.GetAttrSet().GetItemState( EE_CHAR_ESCAPEMENT
, FALSE
, &pItem
))
346 long nEsc
= ((SvxEscapementItem
*)pItem
)->GetEsc();
348 if( ( DFLT_ESC_AUTO_SUPER
!= nEsc
) && ( DFLT_ESC_AUTO_SUB
!= nEsc
) )
350 nEsc
*= 10; //HalPoints => Twips wurde in RTFITEM.CXX unterschlagen!
352 pImpEditEngine
->SeekCursor( aStartPaM
.GetNode(), aStartPaM
.GetIndex()+1, aFont
);
353 nEsc
= nEsc
* 100 / aFont
.GetSize().Height();
355 SvxEscapementItem
aEscItem( (short) nEsc
, ((SvxEscapementItem
*)pItem
)->GetProp(), EE_CHAR_ESCAPEMENT
);
356 rSet
.GetAttrSet().Put( aEscItem
);
360 if ( pImpEditEngine
->aImportHdl
.IsSet() )
362 EditSelection
aSel( aStartPaM
, aEndPaM
);
363 ImportInfo
aImportInfo( RTFIMP_SETATTR
, this, pImpEditEngine
->CreateESel( aSel
) );
364 aImportInfo
.pAttrs
= &rSet
;
365 pImpEditEngine
->aImportHdl
.Call( &aImportInfo
);
368 ContentNode
* pSN
= aStartPaM
.GetNode();
369 ContentNode
* pEN
= aEndPaM
.GetNode();
370 USHORT nStartNode
= pImpEditEngine
->GetEditDoc().GetPos( pSN
);
371 USHORT nEndNode
= pImpEditEngine
->GetEditDoc().GetPos( pEN
);
372 sal_Int16 nOutlLevel
= 0xff;
374 if ( rSet
.StyleNo() && pImpEditEngine
->GetStyleSheetPool() && pImpEditEngine
->GetStatus().DoImportRTFStyleSheets() )
376 SvxRTFStyleType
* pS
= GetStyleTbl().Get( rSet
.StyleNo() );
377 DBG_ASSERT( pS
, "Vorlage in RTF nicht definiert!" );
380 pImpEditEngine
->SetStyleSheet( EditSelection( aStartPaM
, aEndPaM
), (SfxStyleSheet
*)pImpEditEngine
->GetStyleSheetPool()->Find( pS
->sName
, SFX_STYLE_FAMILY_ALL
) );
381 nOutlLevel
= pS
->nOutlineNo
;
385 // Wenn ein Attribut von 0 bis aktuelle Absatzlaenge geht,
386 // soll es ein Absatz-Attribut sein!
388 // Achtung: Selektion kann ueber mehrere Absaetze gehen.
389 // Alle vollstaendigen Absaetze sind Absatzattribute...
390 for ( USHORT z
= nStartNode
+1; z
< nEndNode
; z
++ )
392 DBG_ASSERT( pImpEditEngine
->GetEditDoc().SaveGetObject( z
), "Node existiert noch nicht(RTF)" );
393 pImpEditEngine
->SetParaAttribs( z
, rSet
.GetAttrSet() );
396 if ( aStartPaM
.GetNode() != aEndPaM
.GetNode() )
398 // Den Rest des StartNodes...
399 if ( aStartPaM
.GetIndex() == 0 )
400 pImpEditEngine
->SetParaAttribs( nStartNode
, rSet
.GetAttrSet() );
402 pImpEditEngine
->SetAttribs( EditSelection( aStartPaM
, EditPaM( aStartPaM
.GetNode(), aStartPaM
.GetNode()->Len() ) ), rSet
.GetAttrSet() );
404 // Den Anfang des EndNodes....
405 if ( aEndPaM
.GetIndex() == aEndPaM
.GetNode()->Len() )
406 pImpEditEngine
->SetParaAttribs( nEndNode
, rSet
.GetAttrSet() );
408 pImpEditEngine
->SetAttribs( EditSelection( EditPaM( aEndPaM
.GetNode(), 0 ), aEndPaM
), rSet
.GetAttrSet() );
412 if ( ( aStartPaM
.GetIndex() == 0 ) && ( aEndPaM
.GetIndex() == aEndPaM
.GetNode()->Len() ) )
414 // #96298# When settings char attribs as para attribs, we must merge with existing attribs, not overwrite the ItemSet!
415 SfxItemSet aAttrs
= pImpEditEngine
->GetParaAttribs( nStartNode
);
416 aAttrs
.Put( rSet
.GetAttrSet() );
417 pImpEditEngine
->SetParaAttribs( nStartNode
, aAttrs
);
421 pImpEditEngine
->SetAttribs( EditSelection( aStartPaM
, aEndPaM
), rSet
.GetAttrSet() );
426 if ( nOutlLevel
!= 0xff )
428 for ( USHORT n
= nStartNode
; n
<= nEndNode
; n
++ )
430 ContentNode
* pNode
= pImpEditEngine
->GetEditDoc().SaveGetObject( n
);
431 pNode
->GetContentAttribs().GetItems().Put( SfxInt16Item( EE_PARA_OUTLLEVEL
, nOutlLevel
) );
436 SvxRTFStyleType
* EditRTFParser::FindStyleSheet( const XubString
& rName
)
438 SvxRTFStyleType
* pS
= GetStyleTbl().First();
439 while ( pS
&& ( pS
->sName
!= rName
) )
440 pS
= GetStyleTbl().Next();
445 SfxStyleSheet
* EditRTFParser::CreateStyleSheet( SvxRTFStyleType
* pRTFStyle
)
447 // Prueffen, ob so eine Vorlage existiert....
448 // dann wird sie auch nicht geaendert!
449 SfxStyleSheet
* pStyle
= (SfxStyleSheet
*)pImpEditEngine
->GetStyleSheetPool()->Find( pRTFStyle
->sName
, SFX_STYLE_FAMILY_ALL
);
453 String
aName( pRTFStyle
->sName
);
455 if ( pRTFStyle
->nBasedOn
)
457 SvxRTFStyleType
* pS
= GetStyleTbl().Get( pRTFStyle
->nBasedOn
);
458 if ( pS
&& ( pS
!=pRTFStyle
) )
462 pStyle
= (SfxStyleSheet
*) &pImpEditEngine
->GetStyleSheetPool()->Make( aName
, SFX_STYLE_FAMILY_PARA
);
464 // 1) Items konvertieren und uebernehmen...
465 ConvertAndPutItems( pStyle
->GetItemSet(), pRTFStyle
->aAttrSet
);
467 // 2) Solange Parent nicht im Pool, auch diesen kreieren...
468 if ( aParent
.Len() && ( aParent
!= aName
) )
470 SfxStyleSheet
* pS
= (SfxStyleSheet
*)pImpEditEngine
->GetStyleSheetPool()->Find( aParent
, SFX_STYLE_FAMILY_ALL
);
473 // Wenn nirgendwo gefunden, aus RTF erzeugen...
474 SvxRTFStyleType
* _pRTFStyle
= FindStyleSheet( aParent
);
476 pS
= CreateStyleSheet( _pRTFStyle
);
478 // 2b) ItemSet mit Parent verknuepfen...
480 pStyle
->GetItemSet().SetParent( &pS
->GetItemSet() );
485 void EditRTFParser::CreateStyleSheets()
487 // der SvxRTFParser hat jetzt die Vorlagen erzeugt...
488 if ( pImpEditEngine
->GetStyleSheetPool() && pImpEditEngine
->GetStatus().DoImportRTFStyleSheets() )
490 SvxRTFStyleType
* pRTFStyle
= GetStyleTbl().First();
493 CreateStyleSheet( pRTFStyle
);
495 pRTFStyle
= GetStyleTbl().Next();
500 void __EXPORT
EditRTFParser::CalcValue()
502 const MapUnit eDestUnit
= static_cast< MapUnit
>( aEditMapMode
.GetMapUnit() );
503 const MapUnit eSrcUnit
= aRTFMapMode
.GetMapUnit();
504 if (eDestUnit
!= eSrcUnit
)
505 nTokenValue
= OutputDevice::LogicToLogic( (long)nTokenValue
, eSrcUnit
, eDestUnit
);
508 void EditRTFParser::ReadField()
510 // Aus SwRTFParser::ReadField()
511 int _nOpenBrakets
= 1; // die erste wurde schon vorher erkannt
512 BOOL bFldInst
= FALSE
;
513 BOOL bFldRslt
= FALSE
;
517 while( _nOpenBrakets
&& IsParserWorking() )
519 switch( GetNextToken() )
524 if ( _nOpenBrakets
== 1 )
532 case '{': _nOpenBrakets
++;
535 case RTF_FIELD
: SkipGroup();
538 case RTF_FLDINST
: bFldInst
= TRUE
;
541 case RTF_FLDRSLT
: bFldRslt
= TRUE
;
554 if ( aFldInst
.Len() )
556 String
aHyperLinkMarker( RTL_CONSTASCII_USTRINGPARAM( "HYPERLINK " ) );
557 if ( aFldInst
.CompareIgnoreCaseToAscii( aHyperLinkMarker
, aHyperLinkMarker
.Len() ) == COMPARE_EQUAL
)
559 aFldInst
.Erase( 0, aHyperLinkMarker
.Len() );
560 aFldInst
.EraseLeadingChars();
561 aFldInst
.EraseTrailingChars();
562 aFldInst
.Erase( 0, 1 ); // "
563 aFldInst
.Erase( aFldInst
.Len()-1, 1 ); // "
565 if ( !aFldRslt
.Len() )
568 SvxFieldItem
aField( SvxURLField( aFldInst
, aFldRslt
, SVXURLFORMAT_REPR
), EE_FEATURE_FIELD
);
569 aCurSel
= pImpEditEngine
->InsertField( aCurSel
, aField
);
570 pImpEditEngine
->UpdateFields();
571 nLastAction
= ACTION_INSERTTEXT
;
575 SkipToken( -1 ); // die schliesende Klammer wird "oben" ausgewertet
578 void EditRTFParser::SkipGroup()
580 int _nOpenBrakets
= 1; // die erste wurde schon vorher erkannt
582 while( _nOpenBrakets
&& IsParserWorking() )
584 switch( GetNextToken() )
600 SkipToken( -1 ); // die schliesende Klammer wird "oben" ausgewertet
603 ULONG __EXPORT
EditNodeIdx::GetIdx() const
605 return pImpEditEngine
->GetEditDoc().GetPos( pNode
);
608 SvxNodeIdx
* __EXPORT
EditNodeIdx::Clone() const
610 return new EditNodeIdx( pImpEditEngine
, pNode
);
613 SvxPosition
* __EXPORT
EditPosition::Clone() const
615 return new EditPosition( pImpEditEngine
, pCurSel
);
618 SvxNodeIdx
* __EXPORT
EditPosition::MakeNodeIdx() const
620 return new EditNodeIdx( pImpEditEngine
, pCurSel
->Max().GetNode() );
623 ULONG __EXPORT
EditPosition::GetNodeIdx() const
625 ContentNode
* pN
= pCurSel
->Max().GetNode();
626 return pImpEditEngine
->GetEditDoc().GetPos( pN
);
629 USHORT __EXPORT
EditPosition::GetCntIdx() const
631 return pCurSel
->Max().GetIndex();