[Libreoffice-commits] core.git: Branch 'feature/table-style' - sw/inc sw/source

Alex Ivan alexnivan at yahoo.com
Thu Aug 1 10:45:04 PDT 2013


 sw/inc/swtblfmt.hxx              |    5 ++
 sw/source/core/doc/swtblfmt.cxx  |   95 +++++++++++++++++++++++++++++++++++++++
 sw/source/core/docnode/ndtbl.cxx |   23 ++++-----
 3 files changed, 111 insertions(+), 12 deletions(-)

New commits:
commit ee61450df68e7cc539720d95c7f470f7b56c4cda
Author: Alex Ivan <alexnivan at yahoo.com>
Date:   Thu Aug 1 20:39:52 2013 +0300

    Register SwFmts to correct parents for each element of table
    
    Insert table, text to table and set autoformat methods now set the
    parent of each SwFmt to the correct element in the table style.
    For more complex tables, i.e. boxes contain other lines and so on,
    the parents for these are set to the same as the line/box in which
    they are found.
    
    Change-Id: I24bc35323414bc8bdceda610da7ba53da043f09b

diff --git a/sw/inc/swtblfmt.hxx b/sw/inc/swtblfmt.hxx
index 0443cbd..e61a0bb 100644
--- a/sw/inc/swtblfmt.hxx
+++ b/sw/inc/swtblfmt.hxx
@@ -124,6 +124,11 @@ public:
     static void RestoreTableProperties( SwTableFmt* pSrcFmt, SwTable &table );
     static SwTableFmt* StoreTableProperties( const SwTable &table );
 
+    static void AssignLineParents( SwTableFmt* pSrcFmt, SwTable &table );
+    static void AssignBoxParents( SwTableLineFmt* pSrcLineFmt, SwTableLine &line );
+    static void AssignLineParents_Complex( SwTableLineFmt* pSrcLineFmt, SwTableBoxFmt* pSrcBoxFmt, SwTableBox& rBox );
+    static void AssignBoxParents_Complex( SwTableLineFmt* pSrcLineFmt, SwTableBoxFmt* pSrcBoxFmt, SwTableLine& rLine );
+
     sal_Bool Load( SvStream& rStream, const SwAfVersions& rVersions, SwDoc* pDoc, sal_uInt16 nVal );
 
     TYPEINFO();     // Already in base class Content.
diff --git a/sw/source/core/doc/swtblfmt.cxx b/sw/source/core/doc/swtblfmt.cxx
index db24264..c771894 100644
--- a/sw/source/core/doc/swtblfmt.cxx
+++ b/sw/source/core/doc/swtblfmt.cxx
@@ -269,6 +269,8 @@ void SwTableFmt::RestoreTableProperties( SwTableFmt* pSrcFmt, SwTable &table )
     else
         pTableStyle->Remove( pHardFmt );
 
+    AssignLineParents( pSrcFmt, table );
+
     SwEditShell *pShell = pDoc->GetEditShell();
     pDoc->SetRowSplit( *pShell->getShellCrsr( false ), SwFmtRowSplit( bRowSplit ) );
 
@@ -284,6 +286,99 @@ SwTableFmt* SwTableFmt::StoreTableProperties( const SwTable &table )
     return (SwTableFmt*)pHardFmt->GetRegisteredIn();
 }
 
+void SwTableFmt::AssignLineParents( SwTableFmt* pSrcFmt, SwTable &rTable )
+{
+    sal_uInt16 nLines = rTable.GetTabLines().size();
+    for( sal_uInt16 n = 0; n < nLines; ++n )
+    {
+        SwTableLineFmt* pLineFmt = (SwTableLineFmt*)rTable.GetTabLines()[ n ]->GetFrmFmt();
+        SwTableLineFmt* pFmt = 0;
+
+        if( pSrcFmt )
+        {
+            if( !n )
+                pFmt = pSrcFmt->GetFirstLineFmt();
+            else if( n == nLines - 1 )
+                pFmt = pSrcFmt->GetLastLineFmt();
+            else if( n & 1 )
+                pFmt = pSrcFmt->GetEvenLineFmt();
+            else
+                pFmt = pSrcFmt->GetOddLineFmt();
+        }
+
+        if( pFmt )
+            pLineFmt->RegisterToFormat( *pFmt );
+        else if( pLineFmt->GetRegisteredIn() )
+            ((SwTableLineFmt*)pLineFmt->GetRegisteredIn())->Remove( pLineFmt );
+
+        AssignBoxParents( pFmt, *rTable.GetTabLines()[ n ] );
+    }
+}
+
+void SwTableFmt::AssignBoxParents( SwTableLineFmt* pSrcLineFmt, SwTableLine &rLine )
+{
+    sal_uInt16 nBoxes = rLine.GetTabBoxes().size();
+    for( sal_uInt16 n = 0; n < nBoxes; ++n )
+    {
+        SwTableBoxFmt* pBoxFmt = (SwTableBoxFmt*)rLine.GetTabBoxes()[ n ]->GetFrmFmt();
+        SwTableBoxFmt* pFmt = 0;
+
+        if( pSrcLineFmt )
+        {
+            if( !n )
+                pFmt = pSrcLineFmt->GetFirstBoxFmt();
+            else if( n == nBoxes - 1 )
+                pFmt = pSrcLineFmt->GetLastBoxFmt();
+            else if( n & 1 )
+                pFmt = pSrcLineFmt->GetEvenBoxFmt();
+            else
+                pFmt = pSrcLineFmt->GetOddBoxFmt();
+        }
+
+        if( pFmt )
+            pBoxFmt->RegisterToFormat( *pFmt );
+        else if( pBoxFmt->GetRegisteredIn() )
+            ((SwTableBoxFmt*)pBoxFmt->GetRegisteredIn())->Remove( pBoxFmt );
+
+
+        if( rLine.GetTabBoxes()[ n ]->GetTabLines().size() )
+            AssignLineParents_Complex( pSrcLineFmt, pFmt, *rLine.GetTabBoxes()[ n ] );
+    }
+}
+
+void SwTableFmt::AssignLineParents_Complex( SwTableLineFmt* pSrcLineFmt, SwTableBoxFmt* pSrcBoxFmt, SwTableBox& rBox )
+{
+    sal_uInt16 nLines = rBox.GetTabLines().size();
+    for( sal_uInt16 n = 0; n < nLines; ++n )
+    {
+        SwTableLineFmt* pLineFmt = (SwTableLineFmt*)rBox.GetTabLines()[ n ]->GetFrmFmt();
+
+        if( pSrcLineFmt )
+            pLineFmt->RegisterToFormat( *pSrcLineFmt );
+        else
+            ((SwTableLineFmt*)pLineFmt->GetRegisteredIn())->Remove( pLineFmt );
+
+        AssignBoxParents_Complex( pSrcLineFmt, pSrcBoxFmt, *rBox.GetTabLines()[ n ] );
+    }
+}
+
+void SwTableFmt::AssignBoxParents_Complex( SwTableLineFmt* pSrcLineFmt, SwTableBoxFmt* pSrcBoxFmt, SwTableLine& rLine )
+{
+    sal_uInt16 nBoxes = rLine.GetTabBoxes().size();
+    for( sal_uInt16 n = 0; n < nBoxes; ++n )
+    {
+        SwTableBoxFmt* pBoxFmt = (SwTableBoxFmt*)rLine.GetTabBoxes()[ n ]->GetFrmFmt();
+
+        if( pSrcBoxFmt )
+            pBoxFmt->RegisterToFormat( *pSrcBoxFmt );
+        else
+            ((SwTableBoxFmt*)pBoxFmt->GetRegisteredIn())->Remove( pBoxFmt );
+
+        if( rLine.GetTabBoxes()[ n ]->GetTabLines().size() )
+            AssignLineParents_Complex( pSrcLineFmt, pSrcBoxFmt, *rLine.GetTabBoxes()[ n ] );
+    }
+}
+
 SwTableLineFmt::SwTableLineFmt( SwAttrPool& rPool, const sal_Char* pFmtNm,
                     SwFrmFmt *pDrvdFrm )
     : SwFrmFmt( rPool, pFmtNm, pDrvdFrm, RES_FRMFMT, aTableLineSetRange )
diff --git a/sw/source/core/docnode/ndtbl.cxx b/sw/source/core/docnode/ndtbl.cxx
index a8635a3..8b117c5 100644
--- a/sw/source/core/docnode/ndtbl.cxx
+++ b/sw/source/core/docnode/ndtbl.cxx
@@ -162,16 +162,11 @@ lcl_SetDfltBoxAttr(SwTableBox& rBox, DfltBoxAttrList_t & rBoxFmtArr,
         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 );
+        ::lcl_SetDfltBoxAttr( *pNewTableBoxFmt, nId );
 
         (*pMap)[pBoxFrmFmt] = pNewTableBoxFmt;
     }
-    rBox.ChgFrmFmt( pNewTableBoxFmt );
+    rBox.ChgFrmFmt( new SwTableBoxFmt( *pNewTableBoxFmt) );
 }
 
 static SwTableBoxFmt *lcl_CreateDfltBoxFmt( SwDoc &rDoc, std::vector<SwTableBoxFmt*> &rBoxFmtArr,
@@ -459,7 +454,7 @@ const SwTable* SwDoc::InsertTable( const SwInsertTableOptions& rInsTblOpts,
     SwTableLines& rLines = pNdTbl->GetTabLines();
     for( sal_uInt16 n = 0; n < nRows; ++n )
     {
-        SwTableLine* pLine = new SwTableLine( pLineFmt, nCols, 0 );
+        SwTableLine* pLine = new SwTableLine( new SwTableLineFmt( *pLineFmt ), nCols, 0 );
         rLines.insert( rLines.begin() + n, pLine );
         SwTableBoxes& rBoxes = pLine->GetTabBoxes();
         for( sal_uInt16 i = 0; i < nCols; ++i )
@@ -468,10 +463,10 @@ const SwTable* SwDoc::InsertTable( const SwInsertTableOptions& rInsTblOpts,
             if( bDfltBorders )
             {
                 sal_uInt8 nBoxId = (i < nCols - 1 ? 0 : 1) + (n ? 2 : 0 );
-                pBoxF = ::lcl_CreateDfltBoxFmt( *this, aBoxFmtArr, nCols, nBoxId);
+                pBoxF = new SwTableBoxFmt( *::lcl_CreateDfltBoxFmt( *this, aBoxFmtArr, nCols, nBoxId) );
             }
             else
-                pBoxF = pBoxFmt;
+                pBoxF = new SwTableBoxFmt( *pBoxFmt );
 
             // For AutoFormat on input: the columns are set when inserting the Table
             // The Array contains the columns positions and not their widths!
@@ -495,6 +490,9 @@ const SwTable* SwDoc::InsertTable( const SwInsertTableOptions& rInsTblOpts,
             aNdIdx += 3; // StartNode, TextNode, EndNode  == 3 Nodes
         }
     }
+
+    SwTableFmt::AssignLineParents( pTableStyle, *pNdTbl );
+
     // Insert Frms
     GetNodes().GoNext( &aNdIdx ); // Go to the next ContentNode
     pTblNd->MakeFrms( &aNdIdx );
@@ -739,8 +737,7 @@ const SwTable* SwDoc::TextToTable( const SwInsertTableOptions& rInsTblOpts,
                 else
                 {
                     bChgSz = 0 == (*aBoxFmtArr2)[ nId ];
-                    pBoxF = ::lcl_CreateDfltBoxFmt( *this, *aBoxFmtArr2,
-                                                    USHRT_MAX, nId );
+                    pBoxF = new SwTableBoxFmt ( *::lcl_CreateDfltBoxFmt( *this, *aBoxFmtArr2, USHRT_MAX, nId ) );
                     if( bChgSz )
                         pBoxF->SetFmtAttr( pBox->GetFrmFmt()->GetFrmSize() );
                     pBox->ChgFrmFmt( pBoxF );
@@ -749,6 +746,8 @@ const SwTable* SwDoc::TextToTable( const SwInsertTableOptions& rInsTblOpts,
         }
     }
 
+    SwTableFmt::AssignLineParents( pTableStyle, *pNdTbl );
+
     // Check the Boxes' for Numbers
     if( IsInsTblFormatNum() )
     {


More information about the Libreoffice-commits mailing list