[PATCH] ooxmlimport: conditional table styles fixed

Sven Jacobi (via Code Review) gerrit at gerrit.libreoffice.org
Tue Apr 2 09:35:07 PDT 2013


Hi,

I have submitted a patch for review:

    https://gerrit.libreoffice.org/3175

To pull it, you can do:

    git pull ssh://gerrit.libreoffice.org:29418/core refs/changes/75/3175/1

ooxmlimport: conditional table styles fixed

Change-Id: I84f1d7c718dfc120b76364479ca68f63d2549b9f
---
A sw/qa/extras/ooxmlimport/data/conditionalstyles-tbllook.docx
A writerfilter/source/.DS_Store
M writerfilter/source/dmapper/DomainMapperTableHandler.cxx
M writerfilter/source/dmapper/DomainMapperTableManager.cxx
M writerfilter/source/dmapper/PropertyIds.cxx
M writerfilter/source/dmapper/PropertyIds.hxx
M writerfilter/source/dmapper/StyleSheetTable.cxx
7 files changed, 111 insertions(+), 69 deletions(-)



diff --git a/sw/qa/extras/ooxmlimport/data/conditionalstyles-tbllook.docx b/sw/qa/extras/ooxmlimport/data/conditionalstyles-tbllook.docx
new file mode 100644
index 0000000..4222d63
--- /dev/null
+++ b/sw/qa/extras/ooxmlimport/data/conditionalstyles-tbllook.docx
Binary files differ
diff --git a/writerfilter/source/.DS_Store b/writerfilter/source/.DS_Store
new file mode 100644
index 0000000..83b7315
--- /dev/null
+++ b/writerfilter/source/.DS_Store
Binary files differ
diff --git a/writerfilter/source/dmapper/DomainMapperTableHandler.cxx b/writerfilter/source/dmapper/DomainMapperTableHandler.cxx
index 176f3c9..6a0609b 100644
--- a/writerfilter/source/dmapper/DomainMapperTableHandler.cxx
+++ b/writerfilter/source/dmapper/DomainMapperTableHandler.cxx
@@ -263,6 +263,7 @@
     sal_Int32 nRightBorderDistance;
     sal_Int32 nTopBorderDistance;
     sal_Int32 nBottomBorderDistance;
+    sal_Int32 nTblLook;
     sal_Int32 nNestLevel;
     PropertyMapPtr pTableDefaults;
     PropertyMapPtr pTableBorders;
@@ -274,6 +275,7 @@
     , nRightBorderDistance(DEF_BORDER_DIST)
     , nTopBorderDistance(0)
     , nBottomBorderDistance(0)
+    , nTblLook(0x4a0)
     , nNestLevel(0)
     , pTableDefaults(new PropertyMap)
     , pTableBorders(new PropertyMap)
@@ -358,6 +360,14 @@
                 dmapper_logger->endElement();
 #endif
             }
+        }
+
+        PropertyMap::iterator aTblLookIter =
+        aTblLookIter = m_aTableProperties->find( PropertyDefinition( PROP_TBL_LOOK, false ) );
+        if(aTblLookIter != m_aTableProperties->end())
+        {
+            aTblLookIter->second >>= rInfo.nTblLook;
+            m_aTableProperties->erase( aTblLookIter );
         }
 
         // Set the table default attributes for the cells
@@ -494,6 +504,19 @@
     return pTableStyle;
 }
 
+#define CNF_FIRST_ROW               0x800
+#define CNF_LAST_ROW                0x400
+#define CNF_FIRST_COLUMN            0x200
+#define CNF_LAST_COLUMN             0x100
+#define CNF_ODD_VBAND               0x080
+#define CNF_EVEN_VBAND              0x040
+#define CNF_ODD_HBAND               0x020
+#define CNF_EVEN_HBAND              0x010
+#define CNF_FIRST_ROW_LAST_COLUMN   0x008
+#define CNF_FIRST_ROW_FIRST_COLUMN  0x004
+#define CNF_LAST_ROW_LAST_COLUMN    0x002
+#define CNF_LAST_ROW_FIRST_COLUMN   0x001
+
 CellPropertyValuesSeq_t DomainMapperTableHandler::endTableGetCellProperties(TableInfo & rInfo)
 {
 #ifdef DEBUG_DMAPPER_TABLE_HANDLER
@@ -523,21 +546,30 @@
         PropertyMapVector1::const_iterator aCellIterator = aRowOfCellsIterator->begin();
         PropertyMapVector1::const_iterator aCellIteratorEnd = aRowOfCellsIterator->end();
 
-        // Get the row style properties
-        sal_Int32 nRowStyleMask = sal_Int32( 0 );
-        PropertyMapPtr pRowProps = m_aRowProperties[nRow];
-        if ( pRowProps.get( ) )
+        sal_Int32 nRowStyleMask = 0;
+
+        if (aRowOfCellsIterator==m_aCellProperties.begin())
         {
-            PropertyMap::iterator pTcCnfStyleIt = pRowProps->find( PropertyDefinition( PROP_CNF_STYLE, true ) );
-            if ( pTcCnfStyleIt != pRowProps->end( ) )
-            {
-                if ( rInfo.pTableStyle )
-                {
-                    OUString sMask;
-                    pTcCnfStyleIt->second >>= sMask;
-                    nRowStyleMask = sMask.toInt32( 2 );
-                }
-                pRowProps->erase( pTcCnfStyleIt );
+            if(rInfo.nTblLook&0x20)
+                nRowStyleMask |= CNF_FIRST_ROW;     // first row style used
+        }
+        else if (aRowOfCellsIterator==aLastRowIterator)
+        {
+            if(rInfo.nTblLook&0x40)
+                nRowStyleMask |= CNF_LAST_ROW;      // last row style used
+        }
+        if(!nRowStyleMask)                          // if no row style used yet
+        {
+            // banding used only if not first and or last row style used
+            if(!(rInfo.nTblLook&0x200))
+            {   // hbanding used
+                int n = nRow + 1;
+                if(rInfo.nTblLook&0x20)
+                    n++;
+                if(n & 1)
+                    nRowStyleMask = CNF_ODD_HBAND;
+                else
+                    nRowStyleMask = CNF_EVEN_HBAND;
             }
         }
 
@@ -558,24 +590,44 @@
                 if ( rInfo.pTableDefaults->size( ) )
                     pAllCellProps->InsertProps(rInfo.pTableDefaults);
 
-                // Fill the cell properties with the ones of the style
                 sal_Int32 nCellStyleMask = 0;
-                const PropertyMap::iterator aCnfStyleIter =
-                    aCellIterator->get()->find( PropertyDefinition( PROP_CNF_STYLE, false ) );
-                if ( aCnfStyleIter != aCellIterator->get( )->end( ) )
+                if (aCellIterator==aRowOfCellsIterator->begin())
                 {
-                    if ( rInfo.pTableStyle ) {
-                        OUString sMask;
-                        aCnfStyleIter->second >>= sMask;
-                        nCellStyleMask = sMask.toInt32( 2 );
-                    }
-                    aCellIterator->get( )->erase( aCnfStyleIter );
+                    if(rInfo.nTblLook&0x80)
+                        nCellStyleMask = CNF_FIRST_COLUMN;      // first col style used
                 }
+                else if (bIsEndCol)
+                {
+                    if(rInfo.nTblLook&0x100)
+                        nCellStyleMask = CNF_LAST_COLUMN;       // last col style used
+                }
+                if(!nCellStyleMask)                 // if no cell style is used yet
+                {
+                    if(!(rInfo.nTblLook&0x400))
+                    {   // vbanding used
+                        int n = nCell + 1;
+                        if(rInfo.nTblLook&0x80)
+                            n++;
+                        if(n & 1)
+                            nCellStyleMask = CNF_ODD_VBAND;
+                        else
+                            nCellStyleMask = CNF_EVEN_VBAND;
+                    }
+                }
+                sal_Int32 nCnfStyleMask = nCellStyleMask + nRowStyleMask;
+                if(nCnfStyleMask == CNF_FIRST_COLUMN + CNF_FIRST_ROW)
+                    nCnfStyleMask |= CNF_FIRST_ROW_FIRST_COLUMN;
+                else if(nCnfStyleMask == CNF_FIRST_COLUMN + CNF_LAST_ROW)
+                    nCnfStyleMask |= CNF_LAST_ROW_FIRST_COLUMN;
+                else if(nCnfStyleMask == CNF_LAST_COLUMN + CNF_FIRST_ROW)
+                    nCnfStyleMask |= CNF_FIRST_ROW_LAST_COLUMN;
+                else if(nCnfStyleMask == CNF_LAST_COLUMN + CNF_LAST_ROW)
+                    nCnfStyleMask |= CNF_LAST_ROW_LAST_COLUMN;
 
                 if ( rInfo.pTableStyle )
                 {
-                    PropertyMapPtr pStyleProps = rInfo.pTableStyle->GetProperties( nCellStyleMask + nRowStyleMask );
-                    pAllCellProps->InsertProps(pStyleProps);
+                    PropertyMapPtr pStyleProps = rInfo.pTableStyle->GetProperties( nCnfStyleMask );
+                    pAllCellProps->InsertProps( pStyleProps );
                 }
 
                 // Remove properties from style/row that aren't allowed in cells
diff --git a/writerfilter/source/dmapper/DomainMapperTableManager.cxx b/writerfilter/source/dmapper/DomainMapperTableManager.cxx
index cb96046..bbdb53d 100644
--- a/writerfilter/source/dmapper/DomainMapperTableManager.cxx
+++ b/writerfilter/source/dmapper/DomainMapperTableManager.cxx
@@ -267,7 +267,12 @@
             }
             break;
             case NS_ooxml::LN_CT_TblPrBase_tblLook:
-                break; //todo: table look specifier
+            {
+                TablePropertyMapPtr pPropMap( new TablePropertyMap );
+                pPropMap->Insert( PROP_TBL_LOOK, false, uno::makeAny( nIntValue ));
+                insertTableProps(pPropMap);
+            }
+            break;
             case NS_ooxml::LN_CT_TcPrBase_textDirection:
             {
                 TablePropertyMapPtr pPropMap( new TablePropertyMap );
@@ -328,22 +333,12 @@
                 }
                 break;
             case NS_ooxml::LN_CT_TrPrBase_cnfStyle:
-                {
-                    TablePropertyMapPtr pProps( new TablePropertyMap );
-                    pProps->Insert( PROP_CNF_STYLE, true, uno::makeAny( pValue->getString( ) ) );
-                    insertRowProps( pProps );
-                }
-                break;
+                break;  // the cnfStyle doesn't matter, instead the tblLook property is used to specify conditional styles that are to be used
             case NS_ooxml::LN_CT_PPrBase_cnfStyle:
                 // TODO cnfStyle on a paragraph
                 break;
             case NS_ooxml::LN_CT_TcPrBase_cnfStyle:
-                {
-                    TablePropertyMapPtr pProps( new TablePropertyMap );
-                    pProps->Insert( PROP_CNF_STYLE, true, uno::makeAny( pValue->getString( ) ) );
-                    cellProps( pProps );
-                }
-                break;
+                break;  // the cnfStyle doesn't matter, instead the tblLook property is used to specify conditional styles that are to be used
             case NS_ooxml::LN_CT_TblPrBase_tblpPr:
                 {
                     writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
diff --git a/writerfilter/source/dmapper/PropertyIds.cxx b/writerfilter/source/dmapper/PropertyIds.cxx
index 1d432fc..1ad4c11 100644
--- a/writerfilter/source/dmapper/PropertyIds.cxx
+++ b/writerfilter/source/dmapper/PropertyIds.cxx
@@ -279,7 +279,8 @@
             case PROP_SOURCE_NAME:    sName = "SourceName"; break;
             case PROP_REFERENCE_FIELD_SOURCE :    sName = "ReferenceFieldSource"; break;
             case PROP_WIDTH_TYPE :    sName = "WidthType"; break;
-            case  PROP_TEXT_RANGE:    sName = "TextRange"; break;
+            case PROP_TBL_LOOK : sName = "TblLook"; break;
+            case PROP_TEXT_RANGE:    sName = "TextRange"; break;
             case PROP_SERVICE_CHAR_STYLE       :    sName = "com.sun.star.style.CharacterStyle"; break;
             case PROP_SERVICE_PARA_STYLE       :    sName = "com.sun.star.style.ParagraphStyle"; break;
             case PROP_CHARACTER_STYLES :    sName = "CharacterStyles"; break;
@@ -302,7 +303,6 @@
             case PROP_BITMAP :    sName = "Bitmap"; break;
             case PROP_IS_DATE :   sName = "IsDate"; break;
             case PROP_TAB_STOP_DISTANCE :    sName = "TabStopDistance"; break;
-            case PROP_CNF_STYLE  :    sName = "CnfStyle"; break;
             case PROP_INDENT_AT :    sName = "IndentAt"; break;
             case PROP_FIRST_LINE_INDENT :    sName = "FirstLineIndent"; break;
             case PROP_NUMBERING_STYLE_NAME  :    sName = "NumberingStyleName"; break;
diff --git a/writerfilter/source/dmapper/PropertyIds.hxx b/writerfilter/source/dmapper/PropertyIds.hxx
index c61283c..460ff33 100644
--- a/writerfilter/source/dmapper/PropertyIds.hxx
+++ b/writerfilter/source/dmapper/PropertyIds.hxx
@@ -107,7 +107,6 @@
         ,PROP_CHAR_WEIGHT_ASIAN
         ,PROP_CHAR_WEIGHT_COMPLEX
         ,PROP_CHAR_WORD_MODE
-        ,PROP_CNF_STYLE
         ,PROP_CONTENT
         ,PROP_CONTOUR_OUTSIDE
         ,PROP_CONTOUR_POLY_POLYGON
@@ -283,6 +282,7 @@
         ,PROP_VERT_ORIENT_RELATION
         ,PROP_WIDTH
         ,PROP_WIDTH_TYPE
+        ,PROP_TBL_LOOK
         ,PROP_WRITING_MODE
 /*253*/ ,PROP_FRM_DIRECTION
         ,PROP_EMBEDDED_OBJECT
diff --git a/writerfilter/source/dmapper/StyleSheetTable.cxx b/writerfilter/source/dmapper/StyleSheetTable.cxx
index 6e38673..2a216fe 100644
--- a/writerfilter/source/dmapper/StyleSheetTable.cxx
+++ b/writerfilter/source/dmapper/StyleSheetTable.cxx
@@ -217,40 +217,35 @@
 PropertyMapPtr TableStyleSheetEntry::GetLocalPropertiesFromMask( sal_Int32 nMask )
 {
     // Order from right to left
-    static const TblStyleType aBitsOrder[] =
+    struct TblStyleTypeAndMask {
+        sal_Int32       mask;
+        TblStyleType    type;
+    };
+
+    static const TblStyleTypeAndMask aOrderedStyleTable[] =
     {
-        TBL_STYLE_SWCELL,
-        TBL_STYLE_SECELL,
-        TBL_STYLE_NWCELL,
-        TBL_STYLE_NECELL,
-        TBL_STYLE_BAND2HORZ,
-        TBL_STYLE_BAND1HORZ,
-        TBL_STYLE_BAND2VERT,
-        TBL_STYLE_BAND1VERT,
-        TBL_STYLE_LASTCOL,
-        TBL_STYLE_FIRSTCOL,
-        TBL_STYLE_LASTROW,
-        TBL_STYLE_FIRSTROW,
-        TBL_STYLE_UNKNOWN
+        { 0x010, TBL_STYLE_BAND2HORZ },
+        { 0x020, TBL_STYLE_BAND1HORZ },
+        { 0x040, TBL_STYLE_BAND2VERT },
+        { 0x080, TBL_STYLE_BAND1VERT },
+        { 0x100, TBL_STYLE_LASTCOL  },
+        { 0x200, TBL_STYLE_FIRSTCOL },
+        { 0x400, TBL_STYLE_LASTROW  },
+        { 0x800, TBL_STYLE_FIRSTROW },
+        { 0x001, TBL_STYLE_SWCELL },
+        { 0x002, TBL_STYLE_SECELL },
+        { 0x004, TBL_STYLE_NWCELL },
+        { 0x008, TBL_STYLE_NECELL }
     };
 
     // Get the properties applying according to the mask
     PropertyMapPtr pProps( new PropertyMap( ) );
-    short nBit = 0;
-    do
+    for( int i = 0; i < sizeof( aOrderedStyleTable ); i++ )
     {
-        TblStyleType nStyleId = aBitsOrder[nBit];
-        TblStylePrs::iterator pIt = m_aStyles.find( nStyleId );
-
-        short nTestBit = 1 << nBit;
-        sal_Int32 nBitMask = sal_Int32( nTestBit );
-        if ( ( nMask & nBitMask ) && ( pIt != m_aStyles.end( ) ) )
-            lcl_mergeProps( pProps, pIt->second, nStyleId );
-
-        nBit++;
+        TblStylePrs::iterator pIt = m_aStyles.find( aOrderedStyleTable[ i ].type );
+        if ( ( nMask & aOrderedStyleTable[ i ].mask ) && ( pIt != m_aStyles.end( ) ) )
+            lcl_mergeProps( pProps, pIt->second, aOrderedStyleTable[ i ].type );
     }
-    while ( nBit < 13 );
-
     return pProps;
 }
 

-- 
To view, visit https://gerrit.libreoffice.org/3175
To unsubscribe, visit https://gerrit.libreoffice.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I84f1d7c718dfc120b76364479ca68f63d2549b9f
Gerrit-PatchSet: 1
Gerrit-Project: core
Gerrit-Branch: master
Gerrit-Owner: Sven Jacobi <Sven-Jacobi at gmx.de>



More information about the LibreOffice mailing list