summaryrefslogtreecommitdiff
path: root/sw/source/filter/rtf/rtftbl.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sw/source/filter/rtf/rtftbl.cxx')
-rw-r--r--sw/source/filter/rtf/rtftbl.cxx928
1 files changed, 0 insertions, 928 deletions
diff --git a/sw/source/filter/rtf/rtftbl.cxx b/sw/source/filter/rtf/rtftbl.cxx
deleted file mode 100644
index ae920d449e7d..000000000000
--- a/sw/source/filter/rtf/rtftbl.cxx
+++ /dev/null
@@ -1,928 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * This file incorporates work covered by the following license notice:
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed
- * with this work for additional information regarding copyright
- * ownership. The ASF licenses this file to you under the Apache
- * License, Version 2.0 (the "License"); you may not use this file
- * except in compliance with the License. You may obtain a copy of
- * the License at http://www.apache.org/licenses/LICENSE-2.0 .
- */
-
-
-#include <hintids.hxx>
-#include <editeng/lrspitem.hxx>
-#include <editeng/boxitem.hxx>
-#include <editeng/frmdiritem.hxx>
-#include <svtools/rtftoken.h>
-#include <fmtfsize.hxx>
-#include <fmtpdsc.hxx>
-#include <ndtxt.hxx>
-#include <doc.hxx>
-#include <pam.hxx>
-#include <swparrtf.hxx>
-#include <swtable.hxx>
-#include <tblsel.hxx>
-#include <swtblfmt.hxx>
-#include <wrtswtbl.hxx>
-#include <tblenum.hxx>
-#include <frmatr.hxx>
-#include <fmtrowsplt.hxx>
-#include <vector>
-
-using namespace ::com::sun::star;
-
-typedef std::vector<SwTableBoxFmt*> SwBoxFrmFmts;
-
-class SwShareBoxFmts;
-extern void _DeleteBox( SwTable& rTbl, SwTableBox* pBox, SwUndo* = 0,
- bool = true, const bool = true, SwShareBoxFmts* = 0 );
-
-struct Row
-{
- bool mbUseLeftRowPad, mbUseRightRowPad, mbUseTopRowPad, mbUseBottomRowPad;
- long mnLeftRowPad, mnRightRowPad, mnTopRowPad, mnBottomRowPad;
- sal_uInt16 mnBrdDist;
- Row() :
- mbUseLeftRowPad(false), mbUseRightRowPad(false),
- mbUseTopRowPad(false), mbUseBottomRowPad(false),
- mnLeftRowPad(0), mnRightRowPad(0), mnTopRowPad(0), mnBottomRowPad(0),
- mnBrdDist(MIN_BORDER_DIST)
- {}
-};
-
-static void SetRowBorder(SfxItemSet& rSet, const Row &rRow)
-{
- SvxBoxItem aBox((const SvxBoxItem&)rSet.Get(RES_BOX, false));
- aBox.SetDistance( static_cast< sal_uInt16 >(rRow.mbUseLeftRowPad ? rRow.mnLeftRowPad : rRow.mnBrdDist),
- BOX_LINE_LEFT);
-
- aBox.SetDistance( static_cast< sal_uInt16 >(rRow.mbUseRightRowPad ? rRow.mnRightRowPad : rRow.mnBrdDist),
- BOX_LINE_RIGHT);
-
- aBox.SetDistance( static_cast< sal_uInt16 >(rRow.mbUseTopRowPad ? rRow.mnTopRowPad : 0),
- BOX_LINE_TOP);
-
- aBox.SetDistance( static_cast< sal_uInt16 >(rRow.mbUseBottomRowPad ? rRow.mnBottomRowPad : 0),
- BOX_LINE_BOTTOM);
-
- rSet.Put(aBox);
-}
-
-void rtfSections::PrependedInlineNode(const SwPosition &rPos,
- const SwNode &rNode)
-{
- OSL_ENSURE(!mrReader.IsNewDoc() || !maSegments.empty(),
- "should not be possible, must be at least one segment in a new document");
- if ((!maSegments.empty()) && (maSegments.back().maStart == rPos.nNode))
- maSegments.back().maStart = SwNodeIndex(rNode);
-}
-
-bool SwRTFParser::IsBorderToken(int nToken)
-{
- /*
- i30222 i28983
- Our ability to sense border tokens is broken rtftoken.h is
- organised in a way that ignores some border tokens. ReadBorderAttr
- still doesn't support the more exotic borders but at least this
- won't cause the parser to prematuerely exit the table
- */
- bool bResult = false;
-
- bResult = (nToken >= RTF_BRDRDASHD && nToken <= RTF_BRDRTHTNMG) ||
- (nToken >= RTF_BRDRTNTHSG && nToken <= RTF_BRDRWAVY);
-
- return bResult;
-}
-
-void SwRTFParser::ReadTable( int nToken )
-{
- nInsTblRow = USHRT_MAX;
-
- if (CantUseTables())
- {
- // alle Tabellen-Tokens ueberlesen
- nToken = GetNextToken(); // RTF_TROWD ueberlesen
- do {
- if( RTF_TABLEDEF != (nToken & ~(0xff | RTF_SWGDEFS)) &&
- RTF_UNKNOWNCONTROL != nToken )
- {
- SkipToken( -1 );
- break;
- }
- nToken = GetNextToken();
- } while( IsParserWorking() );
- return ;
- }
-
- // verhinder Tabelle in Tabelle/Footnote
- SwTwips nTblSz = 0;
- int bReadNewCell = sal_False, bChkExistTbl = sal_False;
-
-
- enum Limits {eMAXCELLS=64000};
-
- std::vector<bool> aMergeBackup(aMergeBoxes);
-
- // kein TROWD aber ein TabellenToken -> zwischen TROWD und Tab.Token
- // waren andere Zeichen (siehe Bug 27445.rtf)
- if( RTF_TROWD == nToken || !pTableNode )
- {
- if( RTF_TROWD == nToken )
- nToken = GetNextToken(); // RTF_TROWD ueberlesen
-
- // Flag for delete merged boxes
- aMergeBoxes.clear();
- aMergeBoxes.push_back(false);
- m_nCurrentBox = 0;
-
- // wenn schon in einer Tabellen, dann splitte oder benutze
- // die bisherigen Boxen weiter
- bChkExistTbl = 0 != pPam->GetPoint()->nNode.GetNode().FindTableNode();
- }
- else
- {
- bReadNewCell = sal_True;
- SwTableLines& rLns = pTableNode->GetTable().GetTabLines();
- SwTableLine* pLine = rLns.back();
- // very robust to avoid crashes like bug 127425 + crash reports 118743
- if( pLine )
- {
- sal_uInt16 nTmpBox = m_nCurrentBox;
- if( nTmpBox > pLine->GetTabBoxes().size() )
- nTmpBox = pLine->GetTabBoxes().size();
-
- for (sal_uInt16 n = nTmpBox; n; )
- {
- const SwTableBox *pTmp = pLine->GetTabBoxes()[ --n ];
- if( pTmp )
- {
- const SwFrmFmt* pTmpFmt = pTmp->GetFrmFmt();
- if( pTmpFmt )
- nTblSz += pTmpFmt->GetFrmSize().GetWidth();
- }
- }
- }
- }
-
-
- sal_Int16 eAdjust = text::HoriOrientation::LEFT; // default fuer Tabellen
- SwTwips nLSpace = 0;
- Row aRow;
-
- bool bUseLeftCellPad = false, bUseRightCellPad = false,
- bUseTopCellPad = false, bUseBottomCellPad = false;
- long nLeftCellPad = 0, nRightCellPad = 0, nTopCellPad = 0,
- nBottomCellPad = 0;
-
- sal_Int16 eVerOrient = text::VertOrientation::NONE;
- long nLineHeight = 0;
- if (aMergeBoxes.empty()) // can this actually happen?
- {
- OSL_ASSERT(false);
- aMergeBoxes.push_back(sal_False);
- }
- SwBoxFrmFmts aBoxFmts;
- SwTableBoxFmt* pBoxFmt = pDoc->MakeTableBoxFmt();
- SvxFrameDirection eDir = FRMDIR_HORI_LEFT_TOP;
- bool bCantSplit = false;
-
- int bWeiter = sal_True;
- do {
- switch( nToken )
- {
- case RTF_TRPADDFL:
- aRow.mbUseLeftRowPad = (nTokenValue == 3) ? true : false;
- break;
- case RTF_TRPADDFT:
- aRow.mbUseTopRowPad = (nTokenValue == 3) ? true : false;
- break;
- case RTF_TRPADDFR:
- aRow.mbUseRightRowPad = (nTokenValue == 3) ? true : false;
- break;
- case RTF_TRPADDFB:
- aRow.mbUseBottomRowPad = (nTokenValue == 3) ? true : false;
- break;
- case RTF_TRPADDL:
- aRow.mnLeftRowPad = nTokenValue;
- break;
- case RTF_TRPADDT:
- aRow.mnTopRowPad = nTokenValue;
- break;
- case RTF_TRPADDR:
- aRow.mnRightRowPad = nTokenValue;
- break;
- case RTF_TRPADDB:
- aRow.mnBottomRowPad = nTokenValue;
- break;
-
- case RTF_CLPADFL:
- bUseLeftCellPad = (nTokenValue == 3) ? true : false;
- break;
- case RTF_CLPADFT:
- bUseTopCellPad = (nTokenValue == 3) ? true : false;
- break;
- case RTF_CLPADFR:
- bUseRightCellPad = (nTokenValue == 3) ? true : false;
- break;
- case RTF_CLPADFB:
- bUseBottomCellPad = (nTokenValue == 3) ? true : false;
- break;
- case RTF_CLPADL:
- nLeftCellPad = nTokenValue;
- break;
- case RTF_CLPADT:
- nTopCellPad = nTokenValue;
- break;
- case RTF_CLPADR:
- nRightCellPad = nTokenValue;
- break;
- case RTF_CLPADB:
- nBottomCellPad = nTokenValue;
- break;
-
- case RTF_TRRH:
- nLineHeight = nTokenValue;
- break;
-
- case RTF_CLMRG:
- // would crash later on reading \cellx (#i112657#):
- // the first cell cannot be merged with earlier ones.
- if (aMergeBoxes.size() > 1)
- {
- aMergeBoxes.back() = sal_True;
- }
- break;
-
- case RTF_CELLX:
- if (!bTrowdRead && (aMergeBoxes.size() < (SAL_MAX_UINT16 - 1)))
- {
- SwTableBoxFmt* pFmt = pBoxFmt;
- SwTwips nSize = nTokenValue - nTblSz;
- if( aMergeBoxes.back() )
- {
- // neue Zellen lesen und noch keine Formate vorhanden,
- // dann benutze das der vorhergebende
- if( bReadNewCell && aBoxFmts.empty() )
- {
- SwTableLines& rLns = pTableNode->GetTable().GetTabLines();
- SwTableLine* pLine = rLns.back();
- if (m_nCurrentBox != 0)
- {
- --m_nCurrentBox;
- }
- if (m_nCurrentBox < pLine->GetTabBoxes().size())
- {
- pFmt = static_cast<SwTableBoxFmt*>(
- pLine->GetTabBoxes()[m_nCurrentBox]->GetFrmFmt());
- }
- }
- else
- pFmt = aBoxFmts.back();
-
- // #i73790# - method renamed
- pBoxFmt->ResetAllFmtAttr();
-
- nSize += pFmt->GetFrmSize().GetWidth();
- }
- else
- {
- //
- if (nSize<=2*aRow.mnBrdDist) {
- aRow.mnRightRowPad=0;
- aRow.mbUseRightRowPad=sal_True;
- }
- SetRowBorder((SfxItemSet&)pBoxFmt->GetAttrSet(), aRow);
- aBoxFmts.push_back( pBoxFmt );
- pBoxFmt = pDoc->MakeTableBoxFmt();
- }
-
- if( !nSize )
- nSize = COL_DFLT_WIDTH;
- pFmt->SetFmtAttr( SwFmtFrmSize( ATT_VAR_SIZE, nSize, 0 ));
- nTblSz = nTokenValue;
- aMergeBoxes.push_back(sal_False);
-
- SvxBoxItem aBox(pFmt->GetBox());
-
- if (bUseRightCellPad)
- aBox.SetDistance( static_cast< sal_uInt16 >(nRightCellPad), BOX_LINE_RIGHT);
- if (bUseBottomCellPad)
- aBox.SetDistance( static_cast< sal_uInt16 >(nBottomCellPad), BOX_LINE_BOTTOM);
-
- //Yes, these are the wrong way around, there appears to
- //be a bug in word where these are swapped.
- if (bUseLeftCellPad)
- aBox.SetDistance( static_cast< sal_uInt16 >(nLeftCellPad), BOX_LINE_TOP);
- if (bUseTopCellPad)
- aBox.SetDistance( static_cast< sal_uInt16 >(nTopCellPad), BOX_LINE_LEFT);
-
-
- pFmt->SetFmtAttr(aBox);
-
- bUseLeftCellPad = false;
- bUseRightCellPad = false;
- bUseTopCellPad = false;
- bUseBottomCellPad = false;
- }
- break;
-
- case RTF_TRGAPH:
- //bug: RTF: wrong internal table cell margin imported (A13)
- aRow.mnBrdDist = (nTokenValue>0?(sal_uInt16)nTokenValue:0); // filter out negative values of \trgaph
- break;
-
- case RTF_TRQL: eAdjust = text::HoriOrientation::LEFT; break;
- case RTF_TRQR: eAdjust = text::HoriOrientation::RIGHT; break;
- case RTF_TRQC: eAdjust = text::HoriOrientation::CENTER; break;
-
- // mit text::VertOrientation::TOP kommt der Dialog nicht klar!
- case RTF_CLVERTALT: eVerOrient = text::VertOrientation::NONE; break;
-
- case RTF_CLVERTALC: eVerOrient = text::VertOrientation::CENTER; break;
- case RTF_CLVERTALB: eVerOrient = text::VertOrientation::BOTTOM; break;
-
- case RTF_TRLEFT:
- if( text::HoriOrientation::LEFT == eAdjust )
- eAdjust = text::HoriOrientation::LEFT_AND_WIDTH;
- nLSpace = nTokenValue;
- nTblSz = nTokenValue;
- break;
-
- case RTF_TRHDR:
- nRowsToRepeat++;
- break;
-
- case RTF_CLTXLRTB:
- case RTF_CLTXTBRL:
- case RTF_INTBL: // das wissen wir !
- case RTF_CLMGF:
- case RTF_CLVMGF:
- case RTF_CLVMRG:
- break;
- case RTF_LTRROW:
- eDir = FRMDIR_HORI_LEFT_TOP;
- break;
- case RTF_RTLROW:
- eDir = FRMDIR_HORI_RIGHT_TOP;
- break;
- case RTF_TRBRDRB:
- case RTF_TRBRDRH:
- case RTF_TRBRDRL:
- case RTF_TRBRDRR:
- case RTF_TRBRDRT:
- case RTF_TRBRDRV:
- break;
- case RTF_TRKEEP:
- bCantSplit = true;
- break;
-
- default:
- if( ( nToken & ~(0xff | RTF_TABLEDEF)) == RTF_SHADINGDEF )
- {
- if( aMergeBoxes.back() )
- break;
- ReadBackgroundAttr( nToken,
- (SfxItemSet&)pBoxFmt->GetAttrSet(), sal_True );
- }
- else if( ( nToken & ~(0xff | RTF_TABLEDEF) ) == RTF_BRDRDEF ||
- IsBorderToken(nToken))
- {
- if( aMergeBoxes.back() )
- break;
-
- SfxItemSet& rSet = (SfxItemSet&)pBoxFmt->GetAttrSet();
- if(!IsBorderToken( nToken ))
- ReadBorderAttr( nToken, rSet, sal_True );
- else
- NextToken( nToken );
- }
- else if( RTF_TABLEDEF != (nToken & ~(0xff | RTF_SWGDEFS)) )
- {
- if( RTF_UNKNOWNCONTROL == nToken )
- NextToken( nToken );
- else
- bWeiter = sal_False;
- }
- break;
- }
-
- if( text::VertOrientation::NONE != eVerOrient )
- {
- if( !aMergeBoxes.back() )
- pBoxFmt->SetFmtAttr( SwFmtVertOrient( 0, eVerOrient ));
- eVerOrient = text::VertOrientation::NONE;
- }
- if( bWeiter )
- nToken = GetNextToken();
- } while( bWeiter && IsParserWorking() );
-
- // das letzte temp. BoxFmt loeschen
- delete pBoxFmt;
-
- // It has been recognized as not single box
- if( m_nCurrentBox == aMergeBoxes.size()-1 || ( bReadNewCell && !pTableNode ))
- {
- aMergeBoxes.insert(aMergeBoxes.begin(), aMergeBackup.begin(), aMergeBackup.end());
- return;
- }
-
- nTblSz -= nLSpace;
-
- int bNewTbl = sal_True;
- SwTableLine* pNewLine;
- bTrowdRead=true;
-
- // lege eine neue Tabelle an oder erweiter die aktuelle um eine neue Line
- // oder Box !
- SwNode* pNd;
-
- if( bChkExistTbl )
- {
- // es ist eine Tabelle vorhanden, teste mal ob die weiter benutzt
- // werden kann oder ob sie abgesplittet und neu gefuellt werden
- // muss.
- pTableNode = pPam->GetNode()->FindTableNode();
-
- // Cursor kann nur in der letzten Line stehen
-
- // das Attribut darf nicht ueber das Modify an der
- // Tabelle gesetzt werden, denn sonst werden alle
- // Boxen wieder auf 0 zurueck gesetzt !!!!!
- SwFrmFmt* pFmt = pTableNode->GetTable().GetFrmFmt();
- const SwFmtFrmSize& rTblSz = pFmt->GetFrmSize();
- const SwFmtHoriOrient& rHoriz = pFmt->GetHoriOrient();
-
- const SwTableLines* pLns = &pTableNode->GetTable().GetTabLines();
-
- if( 1 == pLns->size() )
- {
- if( eAdjust != rHoriz.GetHoriOrient() )
- {
- ((SfxItemSet&)pFmt->GetAttrSet()).Put( SwFmtHoriOrient( 0,
- eAdjust ) );
- }
- if( rTblSz.GetWidth() != nTblSz )
- {
- SwFmtFrmSize aSz( rTblSz );
- aSz.SetWidth( nTblSz );
- ((SfxItemSet&)pFmt->GetAttrSet()).Put( aSz );
- }
-
- if( text::HoriOrientation::LEFT_AND_WIDTH == eAdjust &&
- nLSpace != pFmt->GetLRSpace().GetLeft() )
- {
- SvxLRSpaceItem aL( RES_LR_SPACE ); aL.SetLeft( nLSpace );
- ((SfxItemSet&)pFmt->GetAttrSet()).Put( aL );
- }
- }
- else if
- (
- 1 < pLns->size() &&
- (
- rTblSz.GetWidth() != nTblSz ||
- rHoriz.GetHoriOrient() != eAdjust ||
- (
- text::HoriOrientation::LEFT_AND_WIDTH == eAdjust &&
- nLSpace != pFmt->GetLRSpace().GetLeft()
- ) ||
- pTableNode->GetTable().GetTabSortBoxes().size() >= eMAXCELLS
- )
- )
- {
- // Tabelle ab der PaM-Position splitten
- // die vorherige Line!
- pNewLine = (*pLns)[ pLns->size() - 2 ];
- SwTableBox* pBox = pNewLine->GetTabBoxes().front();
- while( ( pLns = &pBox->GetTabLines() )->size() )
- pBox = pLns->front()->GetTabBoxes().front();
-
- SwNodeIndex aTmpIdx( *pBox->GetSttNd() );
- pDoc->GetNodes().SplitTable( aTmpIdx, HEADLINE_NONE, sal_False );
- pTableNode = pPam->GetNode()->FindTableNode();
- pFmt = pTableNode->GetTable().GetFrmFmt();
-
- SwFmtFrmSize aSz( rTblSz );
- aSz.SetWidth( nTblSz );
- ((SfxItemSet&)pFmt->GetAttrSet()).Put( aSz );
- ((SfxItemSet&)pFmt->GetAttrSet()).Put( SwFmtHoriOrient( 0,
- eAdjust ) );
- if( text::HoriOrientation::LEFT_AND_WIDTH == eAdjust && nLSpace )
- {
- SvxLRSpaceItem aL( RES_LR_SPACE ); aL.SetLeft( nLSpace );
- ((SfxItemSet&)pFmt->GetAttrSet()).Put( aL );
- }
- }
-
- pLns = &pTableNode->GetTable().GetTabLines();
- pNewLine = pLns->back();
-
- // jetzt die Boxen abgleichen
- sal_uInt16 nBoxes = Min( pNewLine->GetTabBoxes().size(), aBoxFmts.size() );
- sal_uInt16 n;
-
- for( n = 0; n < nBoxes; ++n )
- {
- SwTableBox* pBox = pNewLine->GetTabBoxes()[ n ];
- *pBox->GetFrmFmt() = *aBoxFmts[ n ];
- delete aBoxFmts[ n ];
- }
- aBoxFmts.erase( aBoxFmts.begin(), aBoxFmts.begin() + n );
-
- if( !aBoxFmts.empty() ) // es muessen noch neue zugefuegt werden
- {
- m_nCurrentBox = n;
- }
- else // es mussen noch Boxen geloescht werden
- {
- // remove ContentIndex of other Bound
- pPam->SetMark(); pPam->DeleteMark();
- while( n < pNewLine->GetTabBoxes().size() )
- _DeleteBox( pTableNode->GetTable(),
- pNewLine->GetTabBoxes()[ n ], 0, false, false );
- }
-
- pOldTblNd = pTableNode;
- bNewTbl = sal_False;
- }
- else
- {
- if( !bReadNewCell && ( pNd = pDoc->GetNodes()[
- pPam->GetPoint()->nNode.GetIndex()-1 ])->IsEndNode() )
- {
- pTableNode = pNd->StartOfSectionNode()->GetTableNode();
- if( pTableNode )
- {
- // dann test mal ob wirklich nur eine neue Line eingefuegt
- // werden soll!
- SwTable &rTable = pTableNode->GetTable();
- SwFrmFmt* pFmt = rTable.GetFrmFmt();
- const SwFmtFrmSize& rTblSz = pFmt->GetFrmSize();
- const SwFmtHoriOrient& rHoriz = pFmt->GetHoriOrient();
- if (
- rTblSz.GetWidth() != nTblSz ||
- rHoriz.GetHoriOrient() != eAdjust ||
- rTable.GetTabSortBoxes().size() >= eMAXCELLS
- )
- {
- pTableNode = 0;
- }
- }
- }
-
- if( pTableNode && !bForceNewTable)
- {
-
- // das Attribut darf nicht ueber das Modify an der
- // Tabelle gesetzt werden, denn sonst werden alle
- // Boxen wieder auf 0 zurueck gesetzt !!!!!
- SwFrmFmt* pFmt = pTableNode->GetTable().GetFrmFmt();
- const SwFmtFrmSize& rTblSz = pFmt->GetFrmSize();
- if( rTblSz.GetWidth() < nTblSz )
- {
- SwFmtFrmSize aSz( rTblSz );
- aSz.SetWidth( nTblSz );
- ((SfxItemSet&)pFmt->GetAttrSet()).Put( aSz );
- }
-
- SwTableLines& rLns = pTableNode->GetTable().GetTabLines();
-
- if( bReadNewCell )
- pNewLine = rLns.back();
- else
- {
- pNewLine = new SwTableLine(
- (SwTableLineFmt*)rLns.back()->GetFrmFmt(),
- aBoxFmts.size(), 0 );
- pNewLine->ClaimFrmFmt();
- pNewLine->GetFrmFmt()->ResetFmtAttr( RES_FRM_SIZE );
- rLns.push_back( pNewLine );
- }
- bNewTbl = sal_False;
- }
- else
- {
- bForceNewTable = false;
- const SwTable *pTable =
- pDoc->InsertTable(
- SwInsertTableOptions( tabopts::HEADLINE_NO_BORDER, 0 ),
- *pPam->GetPoint(), 1, 1, eAdjust, 0, 0, sal_False, sal_False );
- bContainsTablePara=true;
- pTableNode = pTable ? pTable->GetTableNode() : 0;
-
- if (pTableNode)
- {
- maSegments.PrependedInlineNode(*pPam->GetPoint(),
- *pTableNode);
- }
- else
- {
- SkipToken( -1 ); // zum Letzen gueltigen zurueck
- return;
- }
-
- SwTableLines& rLns = pTableNode->GetTable().GetTabLines();
- pNewLine = rLns.back();
-
- SwFrmFmt* pFmt = pTableNode->GetTable().GetFrmFmt();
- SwFmtFrmSize aSz( pFmt->GetFrmSize() );
- aSz.SetWidth( nTblSz );
- ((SfxItemSet&)pFmt->GetAttrSet()).Put( aSz );
- ((SfxItemSet&)pFmt->GetAttrSet()).Put(SvxFrameDirectionItem(eDir, RES_FRAMEDIR));
-
- if( text::HoriOrientation::LEFT_AND_WIDTH == eAdjust && nLSpace )
- {
- SvxLRSpaceItem aL( RES_LR_SPACE ); aL.SetLeft( nLSpace );
- ((SfxItemSet&)pFmt->GetAttrSet()).Put( aL );
- }
-
- m_nCurrentBox = 0;
- pOldTblNd = pTableNode;
- }
- }
-
- if( nLineHeight )
- {
- SwFrmSize eSize;
- if( 0 > nLineHeight )
- eSize = ATT_FIX_SIZE, nLineHeight = -nLineHeight;
- else
- eSize = ATT_MIN_SIZE;
- pNewLine->ClaimFrmFmt()->SetFmtAttr(SwFmtFrmSize(eSize, 0, nLineHeight));
- }
-
- pNewLine->ClaimFrmFmt()->SetFmtAttr(SwFmtRowSplit(!bCantSplit));
-
- if( !aBoxFmts.empty() )
- {
- // setze das default Style
- SwTxtFmtColl* pColl = NULL;
- std::map<sal_Int32,SwTxtFmtColl*>::iterator iter = aTxtCollTbl.find(0);
-
- if( iter == aTxtCollTbl.end() )
- pColl = pDoc->GetTxtCollFromPool( RES_POOLCOLL_STANDARD, false );
- else
- pColl = iter->second;
-
- sal_uInt16 nStt = 0;
- if( bNewTbl )
- {
- SwTableBox* pBox = pNewLine->GetTabBoxes()[0];
- pBoxFmt = (SwTableBoxFmt*)pBox->GetFrmFmt();
- pBox->ForgetFrmFmt();
- delete pBoxFmt;
- pBox->RegisterToFormat( *aBoxFmts[0] );
- SwTxtNode* pTNd = pDoc->GetNodes()[ pBox->GetSttIdx()+1 ]
- ->GetTxtNode();
- OSL_ENSURE( pTNd, "wo ist der Textnode dieser Box?" );
- pTNd->ChgFmtColl( pColl );
- ++nStt;
- nRowsToRepeat=0;
- }
-
- for( ; nStt < aBoxFmts.size(); ++nStt )
- {
- pDoc->GetNodes().InsBoxen( pTableNode, pNewLine,
- aBoxFmts[ nStt ],
- // Formate fuer den TextNode der Box
- pColl, 0,
- m_nCurrentBox + nStt, 1 );
- }
- }
-
- if( bChkExistTbl )
- {
- m_nCurrentBox = 0;
- }
-
- maInsertedTables.InsertTable(*pTableNode, *pPam);
-
- SwNodeIndex aOldIdx(pPam->GetPoint()->nNode);
- SwNodeIdx aOldPos(aOldIdx);
- SwPaM aRg(*pPam);
-
- bool bFailure = true;
- if (pNewLine)
- {
- SwTableBoxes &rBoxes = pNewLine->GetTabBoxes();
- if (SwTableBox* pBox = ((m_nCurrentBox < rBoxes.size())
- ? rBoxes[m_nCurrentBox] : 0))
- {
- if (const SwStartNode *pStart = pBox->GetSttNd())
- {
- if (const SwEndNode *pEnd = pStart->EndOfSectionNode())
- {
- pPam->GetPoint()->nNode = *pEnd;
- pPam->Move( fnMoveBackward, fnGoCntnt );
- bFailure = false;
- }
- }
- }
- }
-
- OSL_ENSURE(!bFailure, "RTF Table failure");
- if (bFailure)
- {
- SkipToken( -1 ); // zum Letzen gueltigen zurueck
- return;
- }
-
- //It might be that there was content at this point which is not already in
- //a table, but which is being followed by properties to place it into the
- //table. If this is the case then move the para/char
- //properties inside the table, and move any content of that paragraph into
- //the table
- bool bInTable = aRg.GetPoint()->nNode.GetNode().FindTableNode();
- if (!bInTable)
- {
- SwNodeIndex aNewIdx(pPam->GetPoint()->nNode);
- SwNodeIdx aNewPos(aNewIdx);
-
- if (aRg.GetPoint()->nContent.GetIndex())
- {
- //If there is content in this node then move it entirely inside the
- //table
- aRg.SetMark();
- aRg.GetMark()->nContent.Assign(aRg.GetCntntNode(), 0);
- pDoc->MoveRange(aRg, *pPam->GetPoint(),
- IDocumentContentOperations::DOC_MOVEDEFAULT);
- }
-
- //Update the attribute stack entries to reflect that the properties
- //which were intended to be inside the tablerow are now left outside
- //the table after the row was placed before the current insertion point
- SvxRTFItemStack& rAttrStk = GetAttrStack();
- for (size_t n = 0; n < rAttrStk.size(); ++n)
- {
- SvxRTFItemStackType* pStk = rAttrStk[n];
- pStk->MoveFullNode(aOldPos, aNewPos);
- }
- }
- SkipToken( -1 ); // zum Letzen gueltigen zurueck
-}
-
-// in die naechste Box dieser Line (opt.: falls es nicht die letzte ist)
-void SwRTFParser::GotoNextBox()
-{
- nInsTblRow = USHRT_MAX;
-
- OSL_ENSURE( pTableNode, "Kein Tabellennode, dann auch keine Box" );
-
- if (!pTableNode)
- return;
-
- SwTableLines& rLns = pTableNode->GetTable().GetTabLines();
- SwTableLine* pLine = rLns.back();
- SwTableBoxes& rBoxes = pLine->GetTabBoxes();
- SwTableBox* pBox = rBoxes.back();
-
- if( ++m_nCurrentBox >= aMergeBoxes.size() )
- m_nCurrentBox = aMergeBoxes.size()-1;
-
- if (!aMergeBoxes[ m_nCurrentBox ])
- {
- int bMove = sal_True;
- if( pBox->GetSttIdx() > pPam->GetPoint()->nNode.GetIndex() )
- {
- sal_uInt16 nRealBox = 0;
- for (sal_uInt16 nTmp = 0; nTmp < m_nCurrentBox; ++nTmp)
- if( !aMergeBoxes[ nTmp ] )
- ++nRealBox;
-
- if( nRealBox < rBoxes.size() )
- {
- pPam->GetPoint()->nNode = *rBoxes[ nRealBox ]->GetSttNd()->EndOfSectionNode();
- pPam->Move( fnMoveBackward, fnGoCntnt );
- bMove = sal_False;
- }
- }
-
- if( bMove && m_nCurrentBox + 1U == aMergeBoxes.size() )
- // dann hinter die Tabelle
- pPam->Move( fnMoveForward, fnGoNode );
- }
- else if (pPam->GetPoint()->nNode.GetNode().IsCntntNode())
- // dann in die vorherige ans Ende
- pPam->Move( fnMoveBackward, fnGoCntnt );
-}
-
-
-void SwRTFParser::NewTblLine()
-{
- nInsTblRow = USHRT_MAX;
-
- // erweiter die aktuelle um eine neue Line
- bool bMakeCopy = false;
- SwNode* pNd = pDoc->GetNodes()[ pPam->GetPoint()->nNode.GetIndex()-1 ];
- if( !pNd->IsEndNode() ||
- !(pNd = pNd->StartOfSectionNode())->IsTableNode() )
- {
- if( !pOldTblNd )
- return ;
-
- bMakeCopy = true;
- pNd = pOldTblNd;
- }
- pTableNode = (SwTableNode*)pNd;
-
- SwTableLines* pLns = &pTableNode->GetTable().GetTabLines();
- SwTableLine* pLine = pLns->back();
- SwTableBoxes& rBoxes = pLine->GetTabBoxes();
- SwTableBox* pBox = rBoxes.back();
-
- if(nRowsToRepeat>0)
- pTableNode->GetTable().SetRowsToRepeat( nRowsToRepeat );
-
- if( !bMakeCopy &&
- 64000 < pTableNode->GetTable().GetTabSortBoxes().size() )
- {
- bMakeCopy = true; // spaetestens jetzt eine neue anfangen!
- }
-
- if( bMakeCopy )
- {
- // und die Selektion kopieren
- SwSelBoxes aBoxes;
- pTableNode->GetTable().SelLineFromBox( pBox, aBoxes );
- pTableNode->GetTable().MakeCopy( pDoc, *pPam->GetPoint(),
- aBoxes, false );
- sal_uLong nNd = pPam->GetPoint()->nNode.GetIndex()-1;
- pTableNode = pDoc->GetNodes()[ nNd ]->FindTableNode();
- pOldTblNd = pTableNode;
-
- nRowsToRepeat=0;
- pTableNode->GetTable().SetRowsToRepeat(nRowsToRepeat);
- pLns = &pTableNode->GetTable().GetTabLines();
- }
- else
- pTableNode->GetTable().AppendRow( pDoc );
-
- pBox = pLns->back()->GetTabBoxes().front();
-
- sal_uLong nOldPos = pPam->GetPoint()->nNode.GetIndex();
- pPam->GetPoint()->nNode = *pBox->GetSttNd();
- pPam->Move( fnMoveForward );
- m_nCurrentBox = 0;
-
- // alle Nodes in den Boxen auf die "default" Vorlage setzten
- {
- SwTxtFmtColl* pColl = NULL;
- std::map<sal_Int32,SwTxtFmtColl*>::iterator iter = aTxtCollTbl.find( 0 );
-
- if( iter == aTxtCollTbl.end() )
- pColl = pDoc->GetTxtCollFromPool( RES_POOLCOLL_STANDARD, false );
- else
- pColl = iter->second;
-
- pPam->SetMark();
-
- pLine = pLns->back();
- pBox = pLine->GetTabBoxes().back();
- pPam->GetPoint()->nNode = *pBox->GetSttNd()->EndOfSectionNode();
- pPam->Move( fnMoveBackward );
- pDoc->SetTxtFmtColl( *pPam, pColl );
- // Bug 73940 - remove ALL attributes (NumRules/Break/etc.)
- {
- SwNodeIndex aIdx( pPam->GetMark()->nNode );
- SwNodeIndex& rEndIdx = pPam->GetPoint()->nNode;
- while( aIdx <= rEndIdx )
- {
- SwCntntNode* pCNd = aIdx.GetNode().GetCntntNode();
- if( pCNd && pCNd->HasSwAttrSet() )
- pCNd->ResetAllAttr();
- ++aIdx;
- }
- }
- pPam->Exchange();
- pPam->DeleteMark();
- }
-
- // all attributes which will be displayed in new Box
- SvxRTFItemStack& rAttrStk = GetAttrStack();
- const SvxRTFItemStackType* pStk;
- for( size_t n = 0; n < rAttrStk.size(); ++n )
- if( ( pStk = rAttrStk[ n ])->GetSttNodeIdx() == sal_uLong(nOldPos) &&
- !pStk->GetSttCnt() )
- ((SvxRTFItemStackType*)pStk)->SetStartPos( SwxPosition( pPam ) );
-}
-
-void SwRTFParser::CheckInsNewTblLine()
-{
- if( USHRT_MAX != nInsTblRow )
- {
- if( nInsTblRow > GetOpenBrakets() || IsPardTokenRead() )
- nInsTblRow = USHRT_MAX;
- else if( !pTableNode ) // Tabelle nicht mehr vorhanden ?
- NewTblLine(); // evt. Line copieren
- }
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */