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

Alex Ivan alexnivan at yahoo.com
Sat Sep 7 09:46:12 PDT 2013


 sw/inc/node.hxx                 |    1 
 sw/source/core/doc/swtblfmt.cxx |   42 ++++++++++++++++++++++++++++++++++++++++
 sw/source/core/docnode/node.cxx |   23 +++++++++++++++++++++
 sw/source/core/text/atrstck.cxx |   20 ++++---------------
 4 files changed, 71 insertions(+), 15 deletions(-)

New commits:
commit a96a03be3d8ccc36bb43b3af0f1e569d8e7257b5
Author: Alex Ivan <alexnivan at yahoo.com>
Date:   Sat Sep 7 19:38:48 2013 +0300

    Correctly set the parent attribute set of the SwCntntNode
    
    The text properties are set on the SwCntntNode, similar to how it
    was done in the AutoFormat system. However, rather than setting
    them directly on the node's attribute set, they are put into the
    attribute set's parent.
    
    There are some minor issues with updating the allignment of the
    text within the cell.
    
    Change-Id: I814b3b7d67744895deeb4e551a968f21e47cc77a

diff --git a/sw/inc/node.hxx b/sw/inc/node.hxx
index 7690cf8..9cebf4e 100644
--- a/sw/inc/node.hxx
+++ b/sw/inc/node.hxx
@@ -439,6 +439,7 @@ public:
     /// If bInParent is FALSE search for attribute only in this node.
     const SfxPoolItem& GetAttr( sal_uInt16 nWhich, sal_Bool bInParent=sal_True ) const;
     sal_Bool GetAttr( SfxItemSet& rSet, sal_Bool bInParent=sal_True ) const;
+    void SetAttrParent( const SfxItemSet* pParentSet );
     /// made virtual
     virtual sal_Bool SetAttr( const SfxPoolItem& );
     virtual sal_Bool SetAttr( const SfxItemSet& rSet );
diff --git a/sw/source/core/doc/swtblfmt.cxx b/sw/source/core/doc/swtblfmt.cxx
index ee5c3f0..072ef5a 100644
--- a/sw/source/core/doc/swtblfmt.cxx
+++ b/sw/source/core/doc/swtblfmt.cxx
@@ -367,6 +367,27 @@ void SwTableFmt::AssignBoxParents( SwTableLineFmt* pSrcLineFmt, SwTableLine &rLi
 
         if( rLine.GetTabBoxes()[ n ]->GetTabLines().size() )
             AssignLineParents_Complex( pSrcLineFmt, pFmt, *rLine.GetTabBoxes()[ n ] );
+        else
+        {
+            SfxItemSet* pCharSet = NULL;
+            if( pFmt )
+            {
+                pCharSet = new SfxItemSet( pBoxFmt->GetDoc()->GetAttrPool(),
+                                 RES_CHRATR_BEGIN, RES_PARATR_LIST_END - 1 );
+                pCharSet->Put( pFmt->GetAttrSet() );
+            }
+
+            sal_uLong nSttNd = rLine.GetTabBoxes()[ n ]->GetSttIdx() + 1;
+            sal_uLong nEndNd = rLine.GetTabBoxes()[ n ]->GetSttNd()->EndOfSectionIndex();
+            for( ; nSttNd < nEndNd; ++nSttNd )
+            {
+                SwCntntNode* pNd = pBoxFmt->GetDoc()->GetNodes()[ nSttNd ]->GetCntntNode();
+                if( pNd )
+                {
+                    pNd->SetAttrParent( pCharSet );
+                }
+            }
+        }
 
         ((SwModify*)pBoxFmt)->CheckCaching( RES_BOX );
     }
@@ -416,6 +437,27 @@ void SwTableFmt::AssignBoxParents_Complex( SwTableLineFmt* pSrcLineFmt, SwTableB
 
         if( rLine.GetTabBoxes()[ n ]->GetTabLines().size() )
             AssignLineParents_Complex( pSrcLineFmt, pSrcBoxFmt, *rLine.GetTabBoxes()[ n ] );
+        else
+        {
+            SfxItemSet* pCharSet = NULL;
+            if( pSrcBoxFmt )
+            {
+                pCharSet = new SfxItemSet( pBoxFmt->GetDoc()->GetAttrPool(),
+                                 RES_CHRATR_BEGIN, RES_PARATR_LIST_END - 1 );
+                pCharSet->Put( pSrcBoxFmt->GetAttrSet() );
+            }
+
+            sal_uLong nSttNd = rLine.GetTabBoxes()[ n ]->GetSttIdx() + 1;
+            sal_uLong nEndNd = rLine.GetTabBoxes()[ n ]->GetSttNd()->EndOfSectionIndex();
+            for( ; nSttNd < nEndNd; ++nSttNd )
+            {
+                SwCntntNode* pNd = pBoxFmt->GetDoc()->GetNodes()[ nSttNd ]->GetCntntNode();
+                if( pNd )
+                {
+                    pNd->SetAttrParent( pCharSet );
+                }
+            }
+        }
 
         ((SwModify*)pBoxFmt)->CheckCaching( RES_BOX );
     }
diff --git a/sw/source/core/docnode/node.cxx b/sw/source/core/docnode/node.cxx
index 90f371c..b4ebf6c 100644
--- a/sw/source/core/docnode/node.cxx
+++ b/sw/source/core/docnode/node.cxx
@@ -130,6 +130,22 @@ void SetParent( boost::shared_ptr<const SfxItemSet>& mrpAttrSet,
     }
 }
 
+void SetParent( boost::shared_ptr<const SfxItemSet>& mrpAttrSet,
+                const SwCntntNode& rNode,
+                const SfxItemSet* pParentSet )
+{
+    const SwAttrSet* pAttrSet = static_cast<const SwAttrSet*>(mrpAttrSet.get());
+    OSL_ENSURE( pAttrSet, "no SwAttrSet" );
+
+    if ( pParentSet != pAttrSet->GetParent() )
+    {
+        SwAttrSet aNewSet( *pAttrSet );
+        aNewSet.SetParent( pParentSet );
+
+        GetNewAutoStyle( mrpAttrSet, rNode, aNewSet );
+    }
+}
+
 const SfxPoolItem* Put( boost::shared_ptr<const SfxItemSet>& mrpAttrSet,
                         const SwCntntNode& rNode,
                         const SfxPoolItem& rAttr )
@@ -1569,6 +1585,13 @@ sal_uInt16 SwCntntNode::ResetAllAttr()
     return aNew.Count();
 }
 
+void SwCntntNode::SetAttrParent( const SfxItemSet* pParentSet )
+{
+    if( !GetpSwAttrSet() )
+        NewAttrSet( GetDoc()->GetAttrPool() );
+
+    AttrSetHandleHelper::SetParent( mpAttrSet, *this, pParentSet );
+}
 
 sal_Bool SwCntntNode::GetAttr( SfxItemSet& rSet, sal_Bool bInParent ) const
 {
commit d1b17ec6e6a994f7e835bb25117f335bed90783d
Author: Alex Ivan <alexnivan at yahoo.com>
Date:   Sat Sep 7 19:29:59 2013 +0300

    Fix SwAttrHandler::Init to take parent attribute set into account
    
    The new implementation might not be as efficient as the previous, but
    the functionality is preserved. The change allows the correct text
    properties from the table style to be taken into consideration.
    
    Change-Id: Icf1460a40baa0c10c6234b05113b1c75848cb4da

diff --git a/sw/source/core/text/atrstck.cxx b/sw/source/core/text/atrstck.cxx
index 2747f26..a7dac25 100644
--- a/sw/source/core/text/atrstck.cxx
+++ b/sw/source/core/text/atrstck.cxx
@@ -419,26 +419,16 @@ void SwAttrHandler::Init( const SfxPoolItem** pPoolItem, const SwAttrSet* pAS,
     // do we have to apply additional paragraph attributes?
     bVertLayout = bVL;
 
-    if ( pAS && pAS->Count() )
-    {
-        SfxItemIter aIter( *pAS );
-        sal_uInt16 nWhich;
-        const SfxPoolItem* pItem = aIter.GetCurItem();
-        while( true )
+    if( pAS )
+        for ( sal_uInt16 i = RES_CHRATR_BEGIN; i < RES_CHRATR_END; i++ )
         {
-            nWhich = pItem->Which();
-            if (isCHRATR(nWhich))
+            const SfxPoolItem* pItem = 0;
+            if( SFX_ITEM_SET == pAS->GetItemState( i, sal_True, &pItem ) )
             {
-                pDefaultArray[ StackPos[ nWhich ] ] = pItem;
+                pDefaultArray[ StackPos[ i ] ] = pItem;
                 FontChg( *pItem, rFnt, sal_True );
             }
-
-            if( aIter.IsAtEnd() )
-                break;
-
-            pItem = aIter.NextItem();
         }
-    }
 
     // It is possible, that Init is called more than once, e.g., in a
     // SwTxtFrm::FormatOnceMore situation.


More information about the Libreoffice-commits mailing list