summaryrefslogtreecommitdiff
path: root/sw/source/filter/rtf/rtffld.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sw/source/filter/rtf/rtffld.cxx')
-rw-r--r--sw/source/filter/rtf/rtffld.cxx958
1 files changed, 0 insertions, 958 deletions
diff --git a/sw/source/filter/rtf/rtffld.cxx b/sw/source/filter/rtf/rtffld.cxx
index b7e06308251a..6afe16666f08 100644
--- a/sw/source/filter/rtf/rtffld.cxx
+++ b/sw/source/filter/rtf/rtffld.cxx
@@ -78,113 +78,6 @@ enum RTF_FLD_TYPES {
RTFFLD_INCLUDETEXT
};
-static RTF_FLD_TYPES _WhichFld( String& rName, String& rNext )
-{
- // Strings sind PascalStrings; Laenge steht an 1. Stellen, dadurch wird
- // sich der Aufruf von strlen erspart!!!
- sal_Char const sTOC[]= "\x03""toc";
- sal_Char const sIMPORT[]= "\x06""import";
- sal_Char const sINDEX[]= "\x05""index";
- sal_Char const sSYMBOL[]= "\x06""symbol";
- sal_Char const sPAGE[]= "\x04""page";
- sal_Char const sNUMPAGES[]= "\x08""numpages";
- sal_Char const sDATE[]= "\x04""date";
- sal_Char const sTIME[]= "\x04""time";
- sal_Char const sDATA[]= "\x04""data";
- sal_Char const sMERGEFLD[]= "\x0A""mergefield";
- sal_Char const sIMPORT2[]= "\x0E""includepicture";
- sal_Char const sHYPERLINK[]= "\x09""hyperlink";
- sal_Char const sREF[]= "\x03""ref";
- sal_Char const sPAGEREF[]= "\x07""pageref";
- sal_Char const sEQ[]= "\x02""eq";
- sal_Char const sINCLUDETEXT[]="\x0B""includetext";
-
- struct _Dummy_RTF_FLD_TYPES
- {
- RTF_FLD_TYPES eFldType;
- const sal_Char* pFldNm;
- };
- const _Dummy_RTF_FLD_TYPES aFldNmArr[RTFFLD_INCLUDETEXT + 1] = {
- {RTFFLD_TOC, sTOC},
- {RTFFLD_IMPORT, sIMPORT},
- {RTFFLD_INDEX, sINDEX},
- {RTFFLD_SYMBOL, sSYMBOL},
- {RTFFLD_PAGE, sPAGE},
- {RTFFLD_NUMPAGES, sNUMPAGES},
- {RTFFLD_DATE, sDATE},
- {RTFFLD_TIME, sTIME},
- {RTFFLD_DATA, sDATA},
- {RTFFLD_MERGEFLD, sMERGEFLD},
- {RTFFLD_IMPORT, sIMPORT2},
- {RTFFLD_HYPERLINK, sHYPERLINK},
- {RTFFLD_REF, sREF},
- {RTFFLD_PAGEREF, sPAGEREF},
- {RTFFLD_EQ, sEQ},
- {RTFFLD_INCLUDETEXT, sINCLUDETEXT}
- };
-
-
- if( !rName.Len() )
- return RTFFLD_UNKNOWN;
-
- String sNm(comphelper::string::stripStart(rName, ' ').getToken(0, ' '));
- OSL_ENSURE( sNm.Len(), "Feldname hat keine Laenge!" );
- if( !sNm.Len() )
- return RTFFLD_UNKNOWN;
-
- xub_StrLen nTokenStt = rName.Search( sNm );
- sNm.ToLowerAscii();
-
- for (size_t n = 0; n < sizeof(aFldNmArr) / sizeof(aFldNmArr[0]); ++n)
- {
- const sal_Char* pCmp = aFldNmArr[n].pFldNm;
- int nLen = *pCmp++;
- xub_StrLen nFndPos = sNm.SearchAscii( pCmp );
- if( STRING_NOTFOUND != nFndPos &&
- ( !nFndPos || !isalpha(sNm.GetChar( static_cast< xub_StrLen >(nFndPos-1) )) ) &&
- ( nFndPos+nLen == sNm.Len() || !isalpha(sNm.GetChar( static_cast< xub_StrLen >(nFndPos+nLen) ) ) ) )
- {
- rName = rName.Copy( nFndPos, static_cast< xub_StrLen >(nLen) );
- nFndPos += nTokenStt + static_cast< xub_StrLen >(nLen);
- while ((nFndPos < rNext.Len()) && (rNext.GetChar(nFndPos) == ' '))
- {
- ++nFndPos;
- }
- rNext.Erase( 0, nFndPos );
- rNext = comphelper::string::stripEnd(rNext, ' ');
- return aFldNmArr[n].eFldType;
- }
- }
- return RTFFLD_UNKNOWN; // nichts gefunden.
-}
-
-static sal_uInt16 CheckNumberFmtStr( const String& rNStr )
-{
- const static sal_Char* aNumberTypeTab[] =
- {
- "\x0A""ALPHABETIC", /* CHARS_UPPER_LETTER*/
- "\x0A""alphabetic", /* CHARS_LOWER_LETTER*/
- "\x05""ROMAN", /* ROMAN_UPPER */
- "\x05""roman", /* ROMAN_LOWER */
- "\x06""ARABIC", /* ARABIC */
- "\x04""NONE", /* NUMBER_NONE */
- "\x04""CHAR", /* CHAR_SPECIAL */
- "\x04""PAGE" /* PAGEDESC */
- };
-
- OSL_ENSURE(sizeof(aNumberTypeTab) / sizeof(sal_Char *)
- >= SVX_NUM_PAGEDESC - SVX_NUM_CHARS_UPPER_LETTER, "impossible");
-
- for (sal_uInt16 n = SVX_NUM_CHARS_UPPER_LETTER; n <= SVX_NUM_PAGEDESC; ++n)
- {
- const sal_Char* pCmp = aNumberTypeTab[n - SVX_NUM_CHARS_UPPER_LETTER];
- int nLen = *pCmp++;
- if( rNStr.EqualsAscii( pCmp, 0, static_cast< xub_StrLen >(nLen) ))
- return static_cast< sal_uInt16 >(2 <= n ? n : (n + SVX_NUM_CHARS_UPPER_LETTER_N));
- }
- return SVX_NUM_PAGEDESC; // default-Wert
-}
-
class RtfFieldSwitch
{
String sParam;
@@ -368,855 +261,4 @@ static void lcl_ScanEquationField( const String& rStr, RTF_EquationData& rData,
}
}
-int SwRTFParser::MakeFieldInst( String& rFieldStr )
-{
- // sicher den Original-String fuer die FeldNamen (User/Datenbank)
- String aSaveStr( rFieldStr );
- SwFieldType * pFldType;
- int nRet = _WhichFld(rFieldStr, aSaveStr);
-
- //Strip Mergeformat from fields
- xub_StrLen nPos=0;
- while (STRING_NOTFOUND != ( nPos = aSaveStr.SearchAscii("\\*", nPos)))
- {
- xub_StrLen nStartDel = nPos;
- nPos += 2;
- while ((nPos < aSaveStr.Len()) && (aSaveStr.GetChar(nPos) == ' '))
- {
- ++nPos;
- }
- if (aSaveStr.EqualsIgnoreCaseAscii("MERGEFORMAT", nPos, 11))
- {
- xub_StrLen nNoDel = (nPos + 11 ) - nStartDel;
- aSaveStr.Erase(nStartDel, nNoDel);
- nPos -= (nStartDel - nPos);
- }
- }
-
- nPos = 0;
- switch (nRet)
- {
- case RTFFLD_INCLUDETEXT:
- break;
- case RTFFLD_IMPORT:
- {
-
- aSaveStr = comphelper::string::strip(aSaveStr, ' ');
- if( aSaveStr.Len() )
- {
- sal_Unicode c = aSaveStr.GetChar( 0 );
- if( '"' == c || '\'' == c )
- {
- aSaveStr.Erase( 0, 1 );
- aSaveStr = aSaveStr.GetToken( 0, c );
- }
-
- rFieldStr = URIHelper::SmartRel2Abs(
- INetURLObject(GetBaseURL()), aSaveStr,
- URIHelper::GetMaybeFileHdl() );
- }
-
- }
- break;
-
- case RTFFLD_NUMPAGES:
- {
- SwDocStatField aFld( (SwDocStatFieldType*)pDoc->GetSysFldType( RES_DOCSTATFLD ),
- DS_PAGE, SVX_NUM_ARABIC );
- if( STRING_NOTFOUND != ( nPos = aSaveStr.SearchAscii( "\\*" )) )
- {
- nPos += 2;
- while ((nPos < aSaveStr.Len()) &&
- (aSaveStr.GetChar(nPos) == ' '))
- { nPos++; }
- aSaveStr.Erase( 0, nPos );
-
- // steht jetzt geanu auf dem Format-Namen
- aFld.ChangeFormat( CheckNumberFmtStr( aSaveStr ));
- }
- pDoc->InsertPoolItem( *pPam, SwFmtFld( aFld ), 0 );
- SkipGroup();
- }
- break;
-
- case RTFFLD_PAGE:
- {
- pFldType = pDoc->GetSysFldType( RES_PAGENUMBERFLD );
- SwPageNumberField aPF( (SwPageNumberFieldType*)pFldType,
- PG_RANDOM, SVX_NUM_ARABIC);
- if( STRING_NOTFOUND != ( nPos = aSaveStr.SearchAscii( "\\*" )) )
- {
- nPos += 2;
- while ((nPos < aSaveStr.Len()) &&
- (aSaveStr.GetChar(nPos) == ' '))
- { nPos++; }
- aSaveStr.Erase( 0, nPos );
-
- // steht jetzt geanu auf dem Format-Namen
- aPF.ChangeFormat( CheckNumberFmtStr( aSaveStr ));
- }
- pDoc->InsertPoolItem( *pPam, SwFmtFld( aPF ), 0 );
- SkipGroup(); // ueberlese den Rest
- }
- break;
- case RTFFLD_DATE:
- case RTFFLD_TIME:
- {
- if( STRING_NOTFOUND == ( nPos = aSaveStr.SearchAscii( "\\@" )) )
- {
- // es fehlt die Format - Angabe: defaulten auf Datum
- pFldType = pDoc->GetSysFldType( RES_DATETIMEFLD );
- pDoc->InsertPoolItem( *pPam, SwFmtFld( SwDateTimeField(
- static_cast<SwDateTimeFieldType*>(pFldType), DATEFLD)), 0);
- }
- else
- {
- // versuche aus dem Formatstring zu erkennen, ob es ein
- // Datum oder Zeit oder Datum & Zeit Field ist
- // nur das Format interressiert
- aSaveStr.Erase( 0, aSaveStr.Search( '\"' )+1 );
- // alles hinter dem Format interressiert auch nicht mehr.
- aSaveStr.Erase( aSaveStr.Search( '\"' ) );
- aSaveStr.SearchAndReplaceAscii( "AM", aEmptyStr );
- aSaveStr.SearchAndReplaceAscii( "PM", aEmptyStr );
-
- // Put the word date and time formatter stuff in a common area
- // and get the rtf filter to use it
- SwField *pFld = 0;
- short nNumFmtType = NUMBERFORMAT_UNDEFINED;
- sal_uLong nFmtIdx = NUMBERFORMAT_UNDEFINED;
-
- sal_uInt16 rLang(0);
- RES_CHRATR eLang = maPageDefaults.mbRTLdoc ? RES_CHRATR_CTL_LANGUAGE : RES_CHRATR_LANGUAGE;
- const SvxLanguageItem *pLang = (SvxLanguageItem*)&pDoc->GetAttrPool().GetDefaultItem( static_cast< sal_uInt16 >(eLang) );
- rLang = pLang ? pLang->GetValue() : LANGUAGE_ENGLISH_US;
-
- SvNumberFormatter* pFormatter = pDoc->GetNumberFormatter();
- bool bHijri = false;
-
- if( pFormatter )
- {
- nFmtIdx = sw::ms::MSDateTimeFormatToSwFormat(aSaveStr, pFormatter, rLang, bHijri, rLang);
- if (nFmtIdx)
- nNumFmtType = pFormatter->GetType(nFmtIdx);
- }
-
- pFldType = pDoc->GetSysFldType( RES_DATETIMEFLD );
-
- if(nNumFmtType & NUMBERFORMAT_DATE)
- pFld = new SwDateTimeField( (SwDateTimeFieldType*)pFldType, DATEFLD, nFmtIdx );
- else if(nNumFmtType == NUMBERFORMAT_TIME)
- pFld = new SwDateTimeField( (SwDateTimeFieldType*)pFldType, TIMEFLD, nFmtIdx );
-
- if( pFld )
- {
- pDoc->InsertPoolItem( *pPam, SwFmtFld( *pFld ), 0);
- delete pFld;
- }
- }
- SkipGroup(); // ueberlese den Rest
- }
- break;
-
- case RTFFLD_DATA:
- {
- // Datenbank-FileName: nur der Filename interressiert
- // Zur Zeit werden nur SDF-Files verarbeitet, also suche nach
- // der Extension
-
- // im SWG geben die DATA Felder den Namen der Datenbank
- // an. Dieser kann als Field oder als DBInfo interpretiert
- // werden:
- // \\data -> Datenbank-Name als Field
- // DATA -> Datenbank-Info
- bool const bField = rFieldStr.Len() && rFieldStr.GetChar(0) != 'D';
-
- // nur der Name interressiert
- if( STRING_NOTFOUND != (nPos = aSaveStr.Search( '.' )) )
- aSaveStr.Erase( nPos );
- SwDBData aData;
- aData.sDataSource = aSaveStr;
- if( bField )
- {
- pFldType = pDoc->GetSysFldType( RES_DBNAMEFLD );
- pDoc->InsertPoolItem( *pPam, SwFmtFld( SwDBNameField(
- static_cast<SwDBNameFieldType*>(pFldType), SwDBData())), 0);
- }
- else
- pDoc->ChgDBData( aData ); // MS: Keine DBInfo verwenden
- SkipGroup(); // ueberlese den Rest
- }
- break;
- case RTFFLD_MERGEFLD:
- {
- // ein Datenbank - Feld: nur der Name interressiert
- // bis zum Ende vom String ist das der Feldname
- SwDBFieldType aTmp( pDoc, aSaveStr, SwDBData() ); //
- SwDBField aDBFld( (SwDBFieldType*)pDoc->InsertFldType( aTmp ));
-
- aDBFld.ChangeFormat( UF_STRING );
- pDoc->InsertPoolItem(*pPam, SwFmtFld( aDBFld ), 0);
- SkipGroup(); // ueberlese den Rest
- }
- break;
-
- case RTFFLD_SYMBOL:
- {
- // loesche fuehrende Blanks
- if( IsNewGroup() )
- GetAttrSet();
- SetNewGroup( sal_True );
-
- SfxItemSet& rSet = GetAttrSet();
-
- sal_Bool bCharIns = sal_False;
- RtfFieldSwitch aRFS( aSaveStr );
- while( !aRFS.IsAtEnd() )
- {
- String sParam;
- sal_Unicode cKey = aRFS.GetSwitch( sParam );
- if( sParam.Len() )
- switch( cKey )
- {
- case 0:
- if( !bCharIns )
- {
- sal_Unicode cChar = (sal_Unicode)sParam.ToInt32();
- if( cChar )
- {
- pDoc->InsertString( *pPam, rtl::OUString(cChar) );
- bCharIns = sal_True;
- }
- }
- break;
-
- case 'f': case 'F':
- // Font setzen
- {
- SvxRTFFontTbl& rTbl = GetFontTbl();
-
- for( SvxRTFFontTbl::iterator it = rTbl.begin();
- it != rTbl.end(); ++it )
- {
- Font* pFont = it->second;
- if( pFont->GetName() == sParam )
- {
- rSet.Put( SvxFontItem(
- pFont->GetFamily(),
- sParam,
- pFont->GetStyleName(),
- pFont->GetPitch(),
- pFont->GetCharSet(),
- RES_CHRATR_FONT ));
- break;
- }
- }
- }
- break;
- case 'h': case 'H':
- //??
- break;
- case 's': case 'S':
- // Fontsize setzen
- {
- const sal_uInt16 nVal = (sal_uInt16)(sParam.ToInt32() * 20);
- rSet.Put( SvxFontHeightItem( nVal,
- 100, RES_CHRATR_FONTSIZE ));
- }
- break;
- }
- }
-
- if( !IsNewGroup() ) AttrGroupEnd();
- SetNewGroup( sal_False );
-
- SkipGroup(); // ueberlese den Rest
- }
- break;
-
- case RTFFLD_HYPERLINK:
- rFieldStr.Erase();
- if( aSaveStr.Len() )
- {
- // return String ist URL, # Mark, \1 Frame
- String sMark, sFrame;
- RtfFieldSwitch aRFS( aSaveStr );
- while( !aRFS.IsAtEnd() )
- {
- String sParam;
- sal_Unicode cKey = aRFS.GetSwitch( sParam );
- if( sParam.Len() )
- switch( cKey )
- {
- case 0:
- if( !rFieldStr.Len() )
- rFieldStr = URIHelper::SmartRel2Abs(
- INetURLObject(GetBaseURL()), sParam,
- URIHelper::GetMaybeFileHdl() );
- break;
-
- case 'l': case 'L': sMark = sParam; break;
- case 't': case 'T': sFrame = sParam; break;
- }
- }
-
- if( sMark.Len() )
- ( rFieldStr += INET_MARK_TOKEN ) += sMark;
- if( sFrame.Len() )
- ( rFieldStr += '\1' ) += sFrame;
- }
- break;
-
- case RTFFLD_EQ:
- rFieldStr.Erase();
- if( aSaveStr.Len() )
- {
- RTF_EquationData aData;
- ::lcl_ScanEquationField( aSaveStr, aData, 0 );
-
- // is it a ruby attr?
- if( aData.sText.Len() && aData.sFontName.Len() &&
- aData.nFontSize && aData.sUp.Len() && !aData.sDown.Len() )
- {
- //Translate and apply
- switch( aData.nJustificationCode )
- {
- case 0: aData.nJustificationCode = 1; break;
- case 1: aData.nJustificationCode = 3; break;
- case 2: aData.nJustificationCode = 4; break;
- case 4: aData.nJustificationCode = 2; break;
- default: aData.nJustificationCode = 0; break;
- }
-
- SwFmtRuby aRuby( aData.sUp );
- SwCharFmt * pCharFmt = NULL;
-
- if ( aData.nStyleNo != -1)
- {
- std::map<sal_Int32,SwCharFmt*>::iterator iter = aCharFmtTbl.find(aData.nStyleNo);
-
- if (iter != aCharFmtTbl.end())
- pCharFmt = iter->second;
- }
-
- if( !pCharFmt )
- {
- //Make a guess at which of asian of western we should be setting
- sal_uInt16 nScript;
- if (pBreakIt->GetBreakIter().is())
- nScript = pBreakIt->GetBreakIter()->getScriptType( aData.sUp, 0);
- else
- nScript = i18n::ScriptType::ASIAN;
-
- sal_uInt16 nFntHWhich = GetWhichOfScript( RES_CHRATR_FONTSIZE, nScript ),
- nFntWhich = GetWhichOfScript( RES_CHRATR_FONT, nScript );
-
- //Check to see if we already have a ruby charstyle that this fits
- for(sal_uInt16 i=0; i < aRubyCharFmts.size(); ++i )
- {
- SwCharFmt *pFmt = aRubyCharFmts[i];
- const SvxFontHeightItem &rF = (const SvxFontHeightItem &)
- pFmt->GetFmtAttr( nFntHWhich );
- if( rF.GetHeight() == sal_uInt16(aData.nFontSize * 10 ))
- {
- const SvxFontItem &rFI = (const SvxFontItem &)
- pFmt->GetFmtAttr( nFntWhich );
- if( rFI.GetFamilyName().Equals( aData.sFontName ))
- {
- pCharFmt = pFmt;
- break;
- }
- }
- }
-
- //Create a new char style if necessary
- if( !pCharFmt )
- {
- String sNm;
- //Take this as the base name
- SwStyleNameMapper::FillUIName( RES_POOLCHR_RUBYTEXT, sNm );
- sNm += String::CreateFromInt32( aRubyCharFmts.size() + 1 );
- pCharFmt = pDoc->MakeCharFmt( sNm,
- ( SwCharFmt*)pDoc->GetDfltCharFmt() );
-
- SvxFontHeightItem aHeightItem( aData.nFontSize * 10, 100, RES_CHRATR_FONTSIZE );
- aHeightItem.SetWhich( nFntHWhich );
-
- SvxFontItem aFontItem( FAMILY_DONTKNOW, aData.sFontName,
- aEmptyStr, PITCH_DONTKNOW, RTL_TEXTENCODING_DONTKNOW, nFntWhich );
-
- pCharFmt->SetFmtAttr( aHeightItem );
- pCharFmt->SetFmtAttr( aFontItem );
- aRubyCharFmts.push_back( pCharFmt );
- }
- }
-
- //Set the charstyle and justification
- aRuby.SetCharFmtName( pCharFmt->GetName() );
- aRuby.SetCharFmtId( pCharFmt->GetPoolFmtId() );
- aRuby.SetAdjustment( (sal_uInt16)aData.nJustificationCode );
-
- // im FieldStr steht der anzuzeigenden Text, im
- pDoc->InsertString( *pPam, aData.sText );
- pPam->SetMark();
- pPam->GetMark()->nContent -= aData.sText.Len();
- pDoc->InsertPoolItem( *pPam, aRuby,
- nsSetAttrMode::SETATTR_DONTEXPAND );
- pPam->DeleteMark();
- }
- // or a combined character field?
- else if( aData.sUp.Len() && aData.sDown.Len() &&
- !aData.sText.Len() && !aData.sFontName.Len() &&
- !aData.nFontSize )
- {
- String sFld( aData.sUp );
- sFld += aData.sDown;
- SwCombinedCharField aFld((SwCombinedCharFieldType*)pDoc->
- GetSysFldType( RES_COMBINED_CHARS ), sFld );
- pDoc->InsertPoolItem( *pPam, SwFmtFld( aFld ), 0);
-
- }
- SkipGroup(); // ueberlese den Rest
- }
- break;
-
- case RTFFLD_PAGEREF:
- {
- String sOrigBkmName;
- RtfFieldSwitch aRFS( aSaveStr );
- while( !aRFS.IsAtEnd() )
- {
- String sParam;
- sal_Unicode cKey = aRFS.GetSwitch( sParam );
- switch( cKey )
- {
- // In the case of pageref the only parameter we are
- // interested in, is the name of the bookmark
- case 0:
- if( !sOrigBkmName.Len() ) // get name of bookmark
- sOrigBkmName = sParam;
- break;
- }
- }
- SwGetRefField aFld(
- (SwGetRefFieldType*)pDoc->GetSysFldType( RES_GETREFFLD ),
- sOrigBkmName,REF_BOOKMARK,0,REF_PAGE);
-
- if(!bNestedField)
- {
- pDoc->InsertPoolItem( *pPam, SwFmtFld( aFld ), 0 );
- }
- else
- bNestedField = false;
- }
- break;
-
- case RTFFLD_REF:
- {
- String sOrigBkmName;
- REFERENCEMARK eFormat = REF_CONTENT;
-
- RtfFieldSwitch aRFS( aSaveStr );
- while( !aRFS.IsAtEnd() )
- {
- String sParam;
- sal_Unicode cKey = aRFS.GetSwitch( sParam );
- switch( cKey )
- {
- case 0:
- if( !sOrigBkmName.Len() ) // get name of bookmark
- sOrigBkmName = sParam;
- break;
-
- /* References to numbers in Word could be either to a numbered
- paragraph or to a chapter number. However Word does not seem to
- have the capability we do, of refering to the chapter number some
- other bookmark is in. As a result, cross-references to chapter
- numbers in a word document will be cross-references to a numbered
- paragraph, being the chapter heading paragraph. As it happens, our
- cross-references to numbered paragraphs will do the right thing
- when the target is a numbered chapter heading, so there is no need
- for us to use the REF_CHAPTER bookmark format on import.
- */
- case 'n':
- eFormat = REF_NUMBER_NO_CONTEXT;
- break;
- case 'r':
- eFormat = REF_NUMBER;
- break;
- case 'w':
- eFormat = REF_NUMBER_FULL_CONTEXT;
- break;
-
- case 'p':
- eFormat = REF_UPDOWN;
- break;
- }
- }
- SwGetRefField aFld(
- (SwGetRefFieldType*)pDoc->GetSysFldType( RES_GETREFFLD ),
- sOrigBkmName,REF_BOOKMARK,0,eFormat);
- pDoc->InsertPoolItem( *pPam, SwFmtFld( aFld ), 0 );
- }
- break;
-
- case RTFFLD_TOC:
- case RTFFLD_INDEX:
- break;
-
- default:
- {
- // keines von den bekannten Feldern, also eine neues UserField
- aSaveStr = comphelper::string::strip(aSaveStr, ' ');
- SwUserFieldType aTmp( pDoc, aSaveStr );
- SwUserField aUFld( (SwUserFieldType*)pDoc->InsertFldType( aTmp ));
- aUFld.ChangeFormat( UF_STRING );
- pDoc->InsertPoolItem( *pPam, SwFmtFld( aUFld ), 0);
- nRet = RTFFLD_UNKNOWN;
- }
- break;
- }
- return nRet;
-}
-
-
-void SwRTFParser::ReadXEField()
-{
- bReadSwFly = false; //#it may be that any uses of this need to be removed and replaced
- int nNumOpenBrakets = 1;
- rtl::OUStringBuffer sFieldStr;
- sal_uInt8 cCh;
-
- int nToken;
- while (nNumOpenBrakets && IsParserWorking())
- {
- switch (nToken = GetNextToken())
- {
- case '}':
- {
- --nNumOpenBrakets;
-
- if (sFieldStr.getLength())
- {
- String sXE(sFieldStr.makeStringAndClear());
- sXE.Insert('\"', 0);
- sXE.Append('\"');
-
- // we have to make sure the hidden text flag is not on
- // otherwise the index will not see this index mark
- SfxItemSet& rSet = GetAttrSet();
- const SfxPoolItem* pItem;
- if( SFX_ITEM_SET == rSet.GetItemState( RES_CHRATR_HIDDEN, sal_True, &pItem ) )
- {
- SvxCharHiddenItem aCharHidden(*(SvxCharHiddenItem*)pItem);
- aCharHidden.SetValue(sal_False);
- rSet.Put(aCharHidden);
- }
-
- sw::ms::ImportXE(*pDoc, *pPam, sXE);
- }
- }
- break;
-
- case '{':
- if( RTF_IGNOREFLAG != GetNextToken() )
- SkipToken( -1 );
- // Unknown und alle bekannten nicht ausgewerteten Gruppen
- // sofort ueberspringen
- else if( RTF_UNKNOWNCONTROL != GetNextToken() )
- SkipToken( -2 );
- else
- {
- // gleich herausfiltern
- ReadUnknownData();
- if( '}' != GetNextToken() )
- eState = SVPAR_ERROR;
- break;
- }
- ++nNumOpenBrakets;
- break;
-
- case RTF_U:
- {
- if( nTokenValue )
- sFieldStr.append(static_cast<sal_Unicode>(nTokenValue));
- else
- sFieldStr.append(aToken);
- }
- break;
-
- case RTF_LINE: cCh = '\n'; goto INSINGLECHAR;
- case RTF_TAB: cCh = '\t'; goto INSINGLECHAR;
- case RTF_SUBENTRYINDEX: cCh = ':'; goto INSINGLECHAR;
- case RTF_EMDASH: cCh = 151; goto INSINGLECHAR;
- case RTF_ENDASH: cCh = 150; goto INSINGLECHAR;
- case RTF_BULLET: cCh = 149; goto INSINGLECHAR;
- case RTF_LQUOTE: cCh = 145; goto INSINGLECHAR;
- case RTF_RQUOTE: cCh = 146; goto INSINGLECHAR;
- case RTF_LDBLQUOTE: cCh = 147; goto INSINGLECHAR;
- case RTF_RDBLQUOTE: cCh = 148; goto INSINGLECHAR;
-INSINGLECHAR:
- //convert single byte from MS1252 to unicode and append
- sFieldStr.append(rtl::OUString(
- reinterpret_cast<const sal_Char*>(&cCh), 1,
- RTL_TEXTENCODING_MS_1252));
- break;
-
- // kein Break, aToken wird als Text gesetzt
- case RTF_TEXTTOKEN:
- sFieldStr.append(aToken);
- break;
-
- case RTF_BKMK_KEY:
- case RTF_TC:
- case RTF_NEXTFILE:
- case RTF_TEMPLATE:
- case RTF_SHPRSLT:
- SkipGroup();
- break;
-
- case RTF_PAR:
- sFieldStr.append(static_cast<sal_Unicode>('\x0a'));
- break;
- default:
- SvxRTFParser::NextToken( nToken );
- break;
- }
- }
-
- SkipToken( -1 ); // die schliesende Klammer wird "oben" ausgewertet
-}
-
-
-void SwRTFParser::ReadField()
-{
- bReadSwFly = false; //#it may be that any uses of this need to be removed and replaced
- int nRet = 0;
- int nNumOpenBrakets = 1; // die erste wurde schon vorher erkannt !!
- int bFldInst = sal_False, bFldRslt = sal_False;
- String sFieldStr, sFieldNm;
- sal_Unicode cCh;
-
- int nToken;
- while (nNumOpenBrakets && IsParserWorking())
- {
- switch (nToken = GetNextToken())
- {
- case '}':
- {
- --nNumOpenBrakets;
- if( 1 != nNumOpenBrakets || !bFldInst )
- break;
-
- if( !bFldRslt )
- {
- // FieldInst vollstaendig eingelesen, was ist es denn?
- nRet = MakeFieldInst( sFieldStr );
- switch ( nRet )
- {
- case RTFFLD_INCLUDETEXT:
- case RTFFLD_TOC:
- case RTFFLD_INDEX:
- // erstmal Index/Inhaltsverzeichniss ueberspringen
- // und als normalen Text einfuegen. Spaeter mal auch dem
- // SwPaM darum aufspannen.
- return ;
-
- case RTFFLD_IMPORT:
- case RTFFLD_HYPERLINK:
- sFieldNm = sFieldStr;
- break;
- }
- sFieldStr.Erase();
- }
- else if (RTFFLD_UNKNOWN == nRet)
- {
- // FieldResult wurde eingelesen
- if (SwTxtNode* pTxtNd = pPam->GetPoint()->nNode.GetNode().GetTxtNode())
- {
- SwTxtAttr* const pFldAttr =
- pTxtNd->GetTxtAttrForCharAt(
- pPam->GetPoint()->nContent.GetIndex()-1 );
-
- if (pFldAttr)
- {
- const SwField *pFld = pFldAttr->GetFld().GetFld();
- SwFieldType *pTyp = pFld ? pFld->GetTyp() : 0;
- OSL_ENSURE(pTyp->Which() == RES_USERFLD, "expected a user field");
- if (pTyp->Which() == RES_USERFLD)
- {
- SwUserFieldType *pUsrTyp = (SwUserFieldType*)pTyp;
- pUsrTyp->SetContent(sFieldStr);
- }
- }
- }
- }
- else if( sFieldNm.Len() )
- {
- switch ( nRet )
- {
- case RTFFLD_IMPORT:
- // Grafik einfuegen
- InsPicture( sFieldNm );
- nRet = INT_MAX;
- break;
- case RTFFLD_HYPERLINK:
- if( sFieldStr.Len() )
- {
- if(sNestedFieldStr.Len())
- sFieldStr.Insert(sNestedFieldStr);
-
- sNestedFieldStr.Erase();
- // im FieldStr steht der anzuzeigenden Text, im
- pDoc->InsertString( *pPam, sFieldStr );
-
- String sTarget( sFieldNm.GetToken( 1, '\1' ));
- if( sTarget.Len() )
- sFieldNm.Erase( sFieldNm.Len() - sTarget.Len() -1 );
-
- // oder ueber den Stack setzen??
- pPam->SetMark();
- pPam->GetMark()->nContent -= sFieldStr.Len();
- pDoc->InsertPoolItem( *pPam,
- SwFmtINetFmt( sFieldNm, sTarget ),
- nsSetAttrMode::SETATTR_DONTEXPAND );
- pPam->DeleteMark();
-
- // #i117947#: insert result only once in case
- // field result is followed by invalid tokens
- sFieldStr.Erase();
- }
- break;
- }
- }
- else if(bNestedField)
- {
- if(nRet == RTFFLD_PAGEREF)
- {
- // Nasty hack to get a pageref within a hyperlink working
- sNestedFieldStr = sFieldStr;
- }
-
- }
-
- }
- break;
-
- case '{':
- if( RTF_IGNOREFLAG != GetNextToken() )
- SkipToken( -1 );
- // Unknown und alle bekannten nicht ausgewerteten Gruppen
- // sofort ueberspringen
- else if( RTF_UNKNOWNCONTROL != GetNextToken() )
- SkipToken( -2 );
- else
- {
- // gleich herausfiltern
- ReadUnknownData();
- if( '}' != GetNextToken() )
- eState = SVPAR_ERROR;
- break;
- }
- ++nNumOpenBrakets;
- break;
-
- case RTF_DATAFIELD:
- SkipGroup();
- break;
-
- case RTF_FIELD:
- bNestedField = true;
- ReadField();
- break;
-
- case RTF_FLDINST:
- bFldInst = sal_True;
- break;
-
- case RTF_FLDRSLT:
- bFldRslt = sal_True;
- break;
-
- case RTF_U:
- {
- if( nTokenValue )
- sFieldStr += (sal_Unicode)nTokenValue;
- else
- sFieldStr += aToken;
- }
- break;
-
- case RTF_LINE: cCh = '\n'; goto INSINGLECHAR;
- case RTF_TAB: cCh = '\t'; goto INSINGLECHAR;
- case RTF_SUBENTRYINDEX: cCh = ':'; goto INSINGLECHAR;
- case RTF_EMDASH: cCh = 0x2014; goto INSINGLECHAR;
- case RTF_ENDASH: cCh = 0x2013; goto INSINGLECHAR;
- case RTF_BULLET: cCh = 0x2022; goto INSINGLECHAR;
- case RTF_LQUOTE: cCh = 0x2018; goto INSINGLECHAR;
- case RTF_RQUOTE: cCh = 0x2019; goto INSINGLECHAR;
- case RTF_LDBLQUOTE: cCh = 0x201C; goto INSINGLECHAR;
- case RTF_RDBLQUOTE: cCh = 0x201D; goto INSINGLECHAR;
-INSINGLECHAR:
- sFieldStr += cCh;
- break;
-
- // kein Break, aToken wird als Text gesetzt
- case RTF_TEXTTOKEN:
- sFieldStr += aToken;
- break;
-
- case RTF_PICT: // Pic-Daten einlesen!
- if( RTFFLD_IMPORT == nRet )
- {
- Graphic aGrf;
- SvxRTFPictureType aPicType;
- if( ReadBmpData( aGrf, aPicType ) )
- {
- InsPicture( sFieldNm, &aGrf, &aPicType );
- nRet = INT_MAX;
- }
- SkipGroup();
- }
- break;
-
- case RTF_BKMK_KEY:
- case RTF_XE:
- case RTF_TC:
- case RTF_NEXTFILE:
- case RTF_TEMPLATE:
- case RTF_SHPRSLT:
- SkipGroup();
- break;
-
- case RTF_CS:
- // we write every time "EQ "
- if( bFldInst && 0 == sFieldStr.SearchAscii( "EQ " ))
- {
- // insert behind the EQ the "\*cs<NO> " string. This is utilize
- // in the MakeFieldInst
- String sTmp;
- (sTmp.AssignAscii( "\\* cs" )
- += String::CreateFromInt32( nTokenValue )) += ' ';
- sFieldStr.Insert( sTmp, 3 );
- }
- break;
- case RTF_FFNAME:
- case RTF_FORMFIELD:
- break;
- case RTF_PAR:
- sFieldStr.Append('\x0a');
- break;
- default:
- SvxRTFParser::NextToken( nToken );
- break;
- }
- }
-
- // Grafik einfuegen
- if (RTFFLD_IMPORT == nRet && sFieldNm.Len())
- InsPicture( sFieldNm );
-
- SkipToken( -1 ); // die schliesende Klammer wird "oben" ausgewertet
-}
-
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */