summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Ivan <alexnivan@yahoo.com>2013-07-13 19:41:47 +0300
committerAlex Ivan <alexnivan@yahoo.com>2013-07-13 19:41:47 +0300
commit2a5e7162fa3b916cd1a4925bec8e474896d98739 (patch)
tree45ae862b27971db551f33df4ba10cf2927ddf862
parentf05f7f6723dafb90637907c427343478c390158c (diff)
Modify InsertTable and TableToText methods
The mentioned methods have been modified in order to use the table style provided as parameter, if present, and the default frame format if not. Furthermore, the style is just assigned to the table, rather than applying the properties immediately. Currently, the style is not applied, but it will be at render time once the neccesary modifications are made. Change-Id: I982ad0539da27e87f3d7443e6a9756503d83be27
-rw-r--r--sw/source/core/docnode/ndtbl.cxx229
1 files changed, 32 insertions, 197 deletions
diff --git a/sw/source/core/docnode/ndtbl.cxx b/sw/source/core/docnode/ndtbl.cxx
index f8b224fdd977..a243333a7333 100644
--- a/sw/source/core/docnode/ndtbl.cxx
+++ b/sw/source/core/docnode/ndtbl.cxx
@@ -134,77 +134,16 @@ static void lcl_SetDfltBoxAttr( SwFrmFmt& rFmt, sal_uInt8 nId )
rFmt.SetFmtAttr( aBox );
}
-typedef std::map<SwFrmFmt *, SwTableBoxFmt *> DfltBoxAttrMap_t;
-typedef std::vector<DfltBoxAttrMap_t *> DfltBoxAttrList_t;
-
-static void
-lcl_SetDfltBoxAttr(SwTableBox& rBox, DfltBoxAttrList_t & rBoxFmtArr,
- sal_uInt8 const nId, SwTableAutoFmt const*const pAutoFmt = 0)
-{
- DfltBoxAttrMap_t * pMap = rBoxFmtArr[ nId ];
- if (!pMap)
- {
- pMap = new DfltBoxAttrMap_t;
- rBoxFmtArr[ nId ] = pMap;
- }
-
- SwTableBoxFmt* pNewTableBoxFmt = 0;
- SwFrmFmt* pBoxFrmFmt = rBox.GetFrmFmt();
- DfltBoxAttrMap_t::iterator const iter(pMap->find(pBoxFrmFmt));
- if (pMap->end() != iter)
- {
- pNewTableBoxFmt = iter->second;
- }
- else
- {
- SwDoc* pDoc = pBoxFrmFmt->GetDoc();
- // format does not exist, so create it
- pNewTableBoxFmt = pDoc->MakeTableBoxFmt();
- pNewTableBoxFmt->SetFmtAttr( pBoxFrmFmt->GetAttrSet().Get( RES_FRM_SIZE ) );
-
- if( pAutoFmt )
- pAutoFmt->UpdateToSet( nId, (SfxItemSet&)pNewTableBoxFmt->GetAttrSet(),
- SwTableAutoFmt::UPDATE_BOX,
- pDoc->GetNumberFormatter( sal_True ) );
- else
- ::lcl_SetDfltBoxAttr( *pNewTableBoxFmt, nId );
-
- (*pMap)[pBoxFrmFmt] = pNewTableBoxFmt;
- }
- rBox.ChgFrmFmt( pNewTableBoxFmt );
-}
-
-static SwTableBoxFmt *lcl_CreateDfltBoxFmt( SwDoc &rDoc, std::vector<SwTableBoxFmt*> &rBoxFmtArr,
- sal_uInt16 nCols, sal_uInt8 nId )
-{
- if ( !rBoxFmtArr[nId] )
- {
- SwTableBoxFmt* pBoxFmt = rDoc.MakeTableBoxFmt();
- if( USHRT_MAX != nCols )
- pBoxFmt->SetFmtAttr( SwFmtFrmSize( ATT_VAR_SIZE,
- USHRT_MAX / nCols, 0 ));
- ::lcl_SetDfltBoxAttr( *pBoxFmt, nId );
- rBoxFmtArr[ nId ] = pBoxFmt;
- }
- return rBoxFmtArr[nId];
-}
-
-static SwTableBoxFmt *lcl_CreateAFmtBoxFmt( SwDoc &rDoc, std::vector<SwTableBoxFmt*> &rBoxFmtArr,
- const SwTableAutoFmt& rAutoFmt,
- sal_uInt16 nCols, sal_uInt8 nId )
+static void lcl_SetDfltBorders( SwTableFmt* pFmt )
{
- if( !rBoxFmtArr[nId] )
+ for( sal_uInt8 n = 0; n < 4; ++n )
{
- SwTableBoxFmt* pBoxFmt = rDoc.MakeTableBoxFmt();
- rAutoFmt.UpdateToSet( nId, (SfxItemSet&)pBoxFmt->GetAttrSet(),
- SwTableAutoFmt::UPDATE_BOX,
- rDoc.GetNumberFormatter( sal_True ) );
- if( USHRT_MAX != nCols )
- pBoxFmt->SetFmtAttr( SwFmtFrmSize( ATT_VAR_SIZE,
- USHRT_MAX / nCols, 0 ));
- rBoxFmtArr[ nId ] = pBoxFmt;
+ for( sal_uInt8 i = 0; i < 4; i++ )
+ {
+ sal_uInt8 nId = (i < 3 ? 0 : 1) + (n ? 2 : 0);
+ ::lcl_SetDfltBoxAttr( *pFmt->GetBoxFmt( 4 * n + i ), nId );
+ }
}
- return rBoxFmtArr[nId];
}
SwTableNode* SwDoc::IsIdxInTbl(const SwNodeIndex& rIdx)
@@ -390,7 +329,8 @@ const SwTable* SwDoc::InsertTable( const SwInsertTableOptions& rInsTblOpts,
// Create the Box/Line/Table construct
SwTableLineFmt* pLineFmt = MakeTableLineFmt();
- SwTableFmt* pTableFmt = MakeTblFrmFmt( aTblName, GetDfltFrmFmt() );
+ SwTableFmt* pTableFmt = pTAFmt ? pTAFmt->GetTableStyle()
+ : MakeTblFrmFmt( aTblName, GetDfltFrmFmt() );
/* If the node to insert the table at is a context node and has a
non-default FRAMEDIR propagate it to the table. */
@@ -409,7 +349,11 @@ const SwTable* SwDoc::InsertTable( const SwInsertTableOptions& rInsTblOpts,
// Set Orientation at the Table's Fmt
pTableFmt->SetFmtAttr( SwFmtHoriOrient( 0, eAdjust ) );
// All lines use the left-to-right Fill-Order!
- pLineFmt->SetFmtAttr( SwFmtFillOrder( ATT_LEFT_TO_RIGHT ));
+ pLineFmt->SetFmtAttr( SwFmtFillOrder( ATT_LEFT_TO_RIGHT ) );
+ pTableFmt->GetFirstLineFmt()->SetFmtAttr( SwFmtFillOrder( ATT_LEFT_TO_RIGHT ) );
+ pTableFmt->GetOddLineFmt()->SetFmtAttr( SwFmtFillOrder( ATT_LEFT_TO_RIGHT ) );
+ pTableFmt->GetEvenLineFmt()->SetFmtAttr( SwFmtFillOrder( ATT_LEFT_TO_RIGHT ) );
+ pTableFmt->GetLastLineFmt()->SetFmtAttr( SwFmtFillOrder( ATT_LEFT_TO_RIGHT ) );
// Set USHRT_MAX as the Table's default SSize
SwTwips nWidth = USHRT_MAX;
@@ -456,26 +400,15 @@ const SwTable* SwDoc::InsertTable( const SwInsertTableOptions& rInsTblOpts,
}
}
+ if( !pTAFmt && bDfltBorders )
+ ::lcl_SetDfltBorders( pTableFmt );
+
SwTable * pNdTbl = &pTblNd->GetTable();
pNdTbl->RegisterToFormat( *pTableFmt );
pNdTbl->SetRowsToRepeat( nRowsToRepeat );
pNdTbl->SetTableModel( bNewModel );
- std::vector<SwTableBoxFmt*> aBoxFmtArr;
- SwTableBoxFmt* pBoxFmt = 0;
- if( !bDfltBorders && !pTAFmt )
- {
- pBoxFmt = MakeTableBoxFmt();
- pBoxFmt->SetFmtAttr( SwFmtFrmSize( ATT_VAR_SIZE, USHRT_MAX / nCols, 0 ));
- }
- else
- {
- const sal_uInt16 nBoxArrLen = pTAFmt ? 16 : 4;
- aBoxFmtArr.resize( nBoxArrLen, NULL );
- }
- SfxItemSet aCharSet( GetAttrPool(), RES_CHRATR_BEGIN, RES_PARATR_LIST_END-1 );
-
SwNodeIndex aNdIdx( *pTblNd, 1 ); // Set to StartNode of first Box
SwTableLines& rLines = pNdTbl->GetTabLines();
for( sal_uInt16 n = 0; n < nRows; ++n )
@@ -485,34 +418,10 @@ const SwTable* SwDoc::InsertTable( const SwInsertTableOptions& rInsTblOpts,
SwTableBoxes& rBoxes = pLine->GetTabBoxes();
for( sal_uInt16 i = 0; i < nCols; ++i )
{
- SwTableBoxFmt *pBoxF;
- if( pTAFmt )
- {
- sal_uInt8 nId = static_cast<sal_uInt8>(!n ? 0 : (( n+1 == nRows )
- ? 12 : (4 * (1 + ((n-1) & 1 )))));
- nId = nId + static_cast<sal_uInt8>( !i ? 0 :
- ( i+1 == nCols ? 3 : (1 + ((i-1) & 1))));
- pBoxF = ::lcl_CreateAFmtBoxFmt( *this, aBoxFmtArr, *pTAFmt,
- nCols, nId );
-
- // Set the Paragraph/Character Attributes if needed
- if( pTAFmt->IsFont() || pTAFmt->IsJustify() )
- {
- aCharSet.ClearItem();
- pTAFmt->UpdateToSet( nId, aCharSet,
- SwTableAutoFmt::UPDATE_CHAR, 0 );
- if( aCharSet.Count() )
- GetNodes()[ aNdIdx.GetIndex()+1 ]->GetCntntNode()->
- SetAttr( aCharSet );
- }
- }
- else if( bDfltBorders )
- {
- sal_uInt8 nBoxId = (i < nCols - 1 ? 0 : 1) + (n ? 2 : 0 );
- pBoxF = ::lcl_CreateDfltBoxFmt( *this, aBoxFmtArr, nCols, nBoxId);
- }
- else
- pBoxF = pBoxFmt;
+ SwTableBoxFmt *pBoxF = MakeTableBoxFmt();
+ if( USHRT_MAX != nCols )
+ pBoxF->SetFmtAttr( SwFmtFrmSize( ATT_VAR_SIZE,
+ USHRT_MAX / nCols, 0 ) );
// For AutoFormat on input: the columns are set when inserting the Table
// The Array contains the columns positions and not their widths!
@@ -694,10 +603,15 @@ const SwTable* SwDoc::TextToTable( const SwInsertTableOptions& rInsTblOpts,
// Create the Box/Line/Table construct
SwTableBoxFmt* pBoxFmt = MakeTableBoxFmt();
SwTableLineFmt* pLineFmt = MakeTableLineFmt();
- SwTableFmt* pTableFmt = MakeTblFrmFmt( GetUniqueTblName(), GetDfltFrmFmt() );
+ SwTableFmt* pTableFmt = pTAFmt ? pTAFmt->GetTableStyle()
+ : MakeTblFrmFmt( GetUniqueTblName(), GetDfltFrmFmt() );
// All Lines have a left-to-right Fill Order
pLineFmt->SetFmtAttr( SwFmtFillOrder( ATT_LEFT_TO_RIGHT ));
+ pTableFmt->GetFirstLineFmt()->SetFmtAttr( SwFmtFillOrder( ATT_LEFT_TO_RIGHT ));
+ pTableFmt->GetOddLineFmt()->SetFmtAttr( SwFmtFillOrder( ATT_LEFT_TO_RIGHT ));
+ pTableFmt->GetEvenLineFmt()->SetFmtAttr( SwFmtFillOrder( ATT_LEFT_TO_RIGHT ));
+ pTableFmt->GetLastLineFmt()->SetFmtAttr( SwFmtFillOrder( ATT_LEFT_TO_RIGHT ));
// The Table's SSize is USHRT_MAX
pTableFmt->SetFmtAttr( SwFmtFrmSize( ATT_VAR_SIZE, USHRT_MAX ));
if( !(rInsTblOpts.mnInsMode & tabopts::SPLIT_LAYOUT) )
@@ -746,26 +660,12 @@ const SwTable* SwDoc::TextToTable( const SwInsertTableOptions& rInsTblOpts,
pTableFmt->SetFmtAttr( SwFmtHoriOrient( 0, eAdjust ) );
pNdTbl->RegisterToFormat( *pTableFmt );
- if( pTAFmt || ( rInsTblOpts.mnInsMode & tabopts::DEFAULT_BORDER) )
+ if( rInsTblOpts.mnInsMode & tabopts::DEFAULT_BORDER )
{
- sal_uInt8 nBoxArrLen = pTAFmt ? 16 : 4;
- boost::scoped_ptr< DfltBoxAttrList_t > aBoxFmtArr1;
- boost::scoped_ptr< std::vector<SwTableBoxFmt*> > aBoxFmtArr2;
- if( bUseBoxFmt )
- {
- aBoxFmtArr1.reset(new DfltBoxAttrList_t( nBoxArrLen, NULL ));
- }
- else
- {
- aBoxFmtArr2.reset(new std::vector<SwTableBoxFmt*>( nBoxArrLen, NULL ));
- }
-
-
- SfxItemSet aCharSet( GetAttrPool(), RES_CHRATR_BEGIN, RES_PARATR_LIST_END-1 );
+ if( !pTAFmt )
+ ::lcl_SetDfltBorders( pTableFmt );
- SwHistory* pHistory = pUndo ? &pUndo->GetHistory() : 0;
-
- SwTableBoxFmt *pBoxF = 0;
+ SwTableBoxFmt *pBoxF = MakeTableBoxFmt();
SwTableLines& rLines = pNdTbl->GetTabLines();
sal_uInt16 nRows = rLines.size();
for( sal_uInt16 n = 0; n < nRows; ++n )
@@ -775,79 +675,14 @@ const SwTable* SwDoc::TextToTable( const SwInsertTableOptions& rInsTblOpts,
for( sal_uInt16 i = 0; i < nCols; ++i )
{
SwTableBox* pBox = rBoxes[ i ];
- bool bChgSz = false;
-
- if( pTAFmt )
- {
- sal_uInt8 nId = static_cast<sal_uInt8>(!n ? 0 : (( n+1 == nRows )
- ? 12 : (4 * (1 + ((n-1) & 1 )))));
- nId = nId + static_cast<sal_uInt8>(!i ? 0 :
- ( i+1 == nCols ? 3 : (1 + ((i-1) & 1))));
- if( bUseBoxFmt )
- ::lcl_SetDfltBoxAttr( *pBox, *aBoxFmtArr1, nId, pTAFmt );
- else
- {
- bChgSz = 0 == (*aBoxFmtArr2)[ nId ];
- pBoxF = ::lcl_CreateAFmtBoxFmt( *this, *aBoxFmtArr2,
- *pTAFmt, USHRT_MAX, nId );
- }
-
- // Set Paragraph/Character Attributes if needed
- if( pTAFmt->IsFont() || pTAFmt->IsJustify() )
- {
- aCharSet.ClearItem();
- pTAFmt->UpdateToSet( nId, aCharSet,
- SwTableAutoFmt::UPDATE_CHAR, 0 );
- if( aCharSet.Count() )
- {
- sal_uLong nSttNd = pBox->GetSttIdx()+1;
- sal_uLong nEndNd = pBox->GetSttNd()->EndOfSectionIndex();
- for( ; nSttNd < nEndNd; ++nSttNd )
- {
- SwCntntNode* pNd = GetNodes()[ nSttNd ]->GetCntntNode();
- if( pNd )
- {
- if( pHistory )
- {
- SwRegHistory aReg( pNd, *pNd, pHistory );
- pNd->SetAttr( aCharSet );
- }
- else
- pNd->SetAttr( aCharSet );
- }
- }
- }
- }
- }
- else
- {
- sal_uInt8 nId = (i < nCols - 1 ? 0 : 1) + (n ? 2 : 0 );
- if( bUseBoxFmt )
- ::lcl_SetDfltBoxAttr( *pBox, *aBoxFmtArr1, nId );
- else
- {
- bChgSz = 0 == (*aBoxFmtArr2)[ nId ];
- pBoxF = ::lcl_CreateDfltBoxFmt( *this, *aBoxFmtArr2,
- USHRT_MAX, nId );
- }
- }
if( !bUseBoxFmt )
{
- if( bChgSz )
- pBoxF->SetFmtAttr( pBox->GetFrmFmt()->GetFrmSize() );
+ pBoxF->SetFmtAttr( pBox->GetFrmFmt()->GetFrmSize() );
pBox->ChgFrmFmt( pBoxF );
}
}
}
-
- if( bUseBoxFmt )
- {
- for( sal_uInt8 i = 0; i < nBoxArrLen; ++i )
- {
- delete (*aBoxFmtArr1)[ i ];
- }
- }
}
// Check the Boxes' for Numbers