diff options
Diffstat (limited to 'sw/source/filter/ascii/ascatr.cxx')
-rw-r--r-- | sw/source/filter/ascii/ascatr.cxx | 227 |
1 files changed, 227 insertions, 0 deletions
diff --git a/sw/source/filter/ascii/ascatr.cxx b/sw/source/filter/ascii/ascatr.cxx new file mode 100644 index 000000000000..c1ba4908a339 --- /dev/null +++ b/sw/source/filter/ascii/ascatr.cxx @@ -0,0 +1,227 @@ +/************************************************************************* + * + * 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_sw.hxx" +#include <hintids.hxx> +#include <tools/stream.hxx> +#ifndef _SVSTDARR_HXX +#define _SVSTDARR_USHORTS +#include <svl/svstdarr.hxx> +#endif +#include <editeng/fontitem.hxx> +#include <pam.hxx> +#include <doc.hxx> +#include <ndtxt.hxx> +#include <wrtasc.hxx> +#include <txatbase.hxx> +#include <fchrfmt.hxx> +#include <txtfld.hxx> +#include <txtatr.hxx> +#include <fmtftn.hxx> +#include <charfmt.hxx> +#include <fmtfld.hxx> +#include <fldbas.hxx> +#include <ftninfo.hxx> + +/* + * Dieses File enthaelt alle Ausgabe-Funktionen des ASCII-Writers; + * fuer alle Nodes, Attribute, Formate und Chars. + */ + +class SwASC_AttrIter +{ + SwASCWriter& rWrt; + const SwTxtNode& rNd; + xub_StrLen nAktSwPos; + + xub_StrLen SearchNext( xub_StrLen nStartPos ); + +public: + SwASC_AttrIter( SwASCWriter& rWrt, const SwTxtNode& rNd, xub_StrLen nStt ); + + void NextPos() { nAktSwPos = SearchNext( nAktSwPos + 1 ); } + + xub_StrLen WhereNext() const { return nAktSwPos; } + BOOL OutAttr( xub_StrLen nSwPos ); +}; + + +SwASC_AttrIter::SwASC_AttrIter( SwASCWriter& rWr, const SwTxtNode& rTxtNd, + xub_StrLen nStt ) + : rWrt( rWr ), rNd( rTxtNd ), nAktSwPos( 0 ) +{ + nAktSwPos = SearchNext( nStt + 1 ); +} + + +xub_StrLen SwASC_AttrIter::SearchNext( xub_StrLen nStartPos ) +{ + xub_StrLen nMinPos = STRING_MAXLEN; + const SwpHints* pTxtAttrs = rNd.GetpSwpHints(); + if( pTxtAttrs ) + { +// kann noch optimiert werden, wenn ausgenutzt wird, dass die TxtAttrs +// nach der Anfangsposition geordnet sind. Dann muessten +// allerdings noch 2 Indices gemerkt werden + for ( USHORT i = 0; i < pTxtAttrs->Count(); i++ ) + { + const SwTxtAttr* pHt = (*pTxtAttrs)[i]; + if (pHt->HasDummyChar()) + { + xub_StrLen nPos = *pHt->GetStart(); + + if( nPos >= nStartPos && nPos <= nMinPos ) + nMinPos = nPos; + + if( ( ++nPos ) >= nStartPos && nPos < nMinPos ) + nMinPos = nPos; + } + } + } + return nMinPos; +} + + +BOOL SwASC_AttrIter::OutAttr( xub_StrLen nSwPos ) +{ + BOOL bRet = FALSE; + const SwpHints* pTxtAttrs = rNd.GetpSwpHints(); + if( pTxtAttrs ) + { + USHORT i; + for( i = 0; i < pTxtAttrs->Count(); i++ ) + { + const SwTxtAttr* pHt = (*pTxtAttrs)[i]; + if ( pHt->HasDummyChar() && nSwPos == *pHt->GetStart() ) + { + bRet = TRUE; + String sOut; + switch( pHt->Which() ) + { + case RES_TXTATR_FIELD: + sOut = static_cast<SwTxtFld const*>(pHt)->GetFld().GetFld() + ->ExpandField(rWrt.pDoc->IsClipBoard()); + break; + + case RES_TXTATR_FTN: + { + const SwFmtFtn& rFtn = pHt->GetFtn(); + if( rFtn.GetNumStr().Len() ) + sOut = rFtn.GetNumStr(); + else if( rFtn.IsEndNote() ) + sOut = rWrt.pDoc->GetEndNoteInfo().aFmt. + GetNumStr( rFtn.GetNumber() ); + else + sOut = rWrt.pDoc->GetFtnInfo().aFmt. + GetNumStr( rFtn.GetNumber() ); + } + break; + } + if( sOut.Len() ) + rWrt.Strm().WriteUnicodeOrByteText( sOut ); + } + else if( nSwPos < *pHt->GetStart() ) + break; + } + } + return bRet; +} + + +//------------------------ +/* Ausgabe der Nodes */ +//------------------------ + +static Writer& OutASC_SwTxtNode( Writer& rWrt, SwCntntNode& rNode ) +{ + const SwTxtNode& rNd = (SwTxtNode&)rNode; + + xub_StrLen nStrPos = rWrt.pCurPam->GetPoint()->nContent.GetIndex(); + xub_StrLen nNodeEnde = rNd.Len(), nEnde = nNodeEnde; + BOOL bLastNd = rWrt.pCurPam->GetPoint()->nNode == rWrt.pCurPam->GetMark()->nNode; + if( bLastNd ) + nEnde = rWrt.pCurPam->GetMark()->nContent.GetIndex(); + + SwASC_AttrIter aAttrIter( (SwASCWriter&)rWrt, rNd, nStrPos ); + + if( !nStrPos && rWrt.bExportPargraphNumbering ) + { + String numString( rNd.GetNumString() ); + if (numString.Len()) + { + numString.Append(' '); + rWrt.Strm().WriteUnicodeOrByteText(numString); + } + } + + String aStr( rNd.GetTxt() ); + if( rWrt.bASCII_ParaAsBlanc ) + aStr.SearchAndReplaceAll( 0x0A, ' ' ); + + const bool bExportSoftHyphens = RTL_TEXTENCODING_UCS2 == rWrt.GetAsciiOptions().GetCharSet() || + RTL_TEXTENCODING_UTF8 == rWrt.GetAsciiOptions().GetCharSet(); + + do { + xub_StrLen nNextAttr = aAttrIter.WhereNext(); + + if( nNextAttr > nEnde ) + nNextAttr = nEnde; + + if( !aAttrIter.OutAttr( nStrPos )) + { + String aOutStr( aStr.Copy( nStrPos, nNextAttr - nStrPos ) ); + if ( !bExportSoftHyphens ) + aOutStr.EraseAllChars( CHAR_SOFTHYPHEN ); + + rWrt.Strm().WriteUnicodeOrByteText( aOutStr ); + } + nStrPos = nNextAttr; + aAttrIter.NextPos(); + } while( nStrPos < nEnde ); + + if( !bLastNd || + ( !rWrt.bWriteClipboardDoc && !rWrt.bASCII_NoLastLineEnd ) + && !nStrPos && nEnde == nNodeEnde ) + rWrt.Strm().WriteUnicodeOrByteText( ((SwASCWriter&)rWrt).GetLineEnd()); + + return rWrt; +} + +/* + * lege hier jetzt die Tabellen fuer die ASCII-Funktions-Pointer auf + * die Ausgabe-Funktionen an. + * Es sind lokale Strukturen, die nur innerhalb der ASCII-DLL + * bekannt sein muessen. + */ + +SwNodeFnTab aASCNodeFnTab = { +/* RES_TXTNODE */ OutASC_SwTxtNode, +/* RES_GRFNODE */ 0, +/* RES_OLENODE */ 0 +}; + |