[Libreoffice-commits] core.git: sw/inc sw/source writerfilter/source

Adam Co rattles2013 at gmail.com
Wed Feb 12 00:41:34 PST 2014


 sw/inc/unocrsrhelper.hxx                               |    4 
 sw/source/core/unocore/unocrsrhelper.cxx               |   57 +++++++++
 sw/source/core/unocore/unotbl.cxx                      |  100 ++++++++++-------
 writerfilter/source/dmapper/TablePropertiesHandler.cxx |   35 +++++
 4 files changed, 157 insertions(+), 39 deletions(-)

New commits:
commit 50eb0490e328e6d0ceb9b0550d97d5fc4220a82f
Author: Adam Co <rattles2013 at gmail.com>
Date:   Mon Feb 3 18:00:23 2014 +0200

    DOCX import sends 'table row redline' to SW core, and core stores it
    
    This patch adds support in the DOCX importer for the 'table row redline'
    to be sent from the DOCX importer, using UNO (as a property of the
    table row) to the SW core. Once it reaches the 'table row' - the
    'set property' detects this property - and creates an
    'SwTableRowRedline' object for it, and adds it to the 'SwExtraRedlineTbl'
    object.
    
    Change-Id: Ifd9ba680a722b54116b07dca54841dcba599c517
    Reviewed-on: https://gerrit.libreoffice.org/7822
    Reviewed-by: Miklos Vajna <vmiklos at collabora.co.uk>
    Tested-by: Miklos Vajna <vmiklos at collabora.co.uk>

diff --git a/sw/inc/unocrsrhelper.hxx b/sw/inc/unocrsrhelper.hxx
index ae5ffd9..b50e372 100644
--- a/sw/inc/unocrsrhelper.hxx
+++ b/sw/inc/unocrsrhelper.hxx
@@ -121,6 +121,10 @@ namespace SwUnoCursorHelper
             const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& RedlineProperties )
                 throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException);
 
+    void    makeTableRedline( SwTableLine& rTableLine, const OUString& RedlineType,
+            const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& RedlineProperties )
+                throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException);
+
 
     /// @param bTableMode: attributes should be applied to a table selection
     void SetCrsrAttr(SwPaM & rPam, const SfxItemSet & rSet,
diff --git a/sw/source/core/unocore/unocrsrhelper.cxx b/sw/source/core/unocore/unocrsrhelper.cxx
index f08021c8..116b8b4 100644
--- a/sw/source/core/unocore/unocrsrhelper.cxx
+++ b/sw/source/core/unocore/unocrsrhelper.cxx
@@ -1292,6 +1292,63 @@ void makeRedline( SwPaM& rPaM,
         throw lang::IllegalArgumentException();
 }
 
+void makeTableRedline( SwTableLine& rTableLine,
+    const OUString& rRedlineType,
+    const uno::Sequence< beans::PropertyValue >& rRedlineProperties )
+        throw (lang::IllegalArgumentException, uno::RuntimeException)
+{
+    IDocumentRedlineAccess* pRedlineAccess = rTableLine.GetFrmFmt()->GetDoc();
+
+    RedlineType_t eType;
+    if ( rRedlineType == "TableRowInsert" )
+    {
+        eType = nsRedlineType_t::REDLINE_TABLE_ROW_INSERT;
+    }
+    else if ( rRedlineType == "TableRowDelete" )
+    {
+        eType = nsRedlineType_t::REDLINE_TABLE_ROW_DELETE;
+    }
+    else
+    {
+        throw lang::IllegalArgumentException();
+    }
+
+    comphelper::SequenceAsHashMap aPropMap( rRedlineProperties );
+    uno::Any aAuthorValue;
+    aAuthorValue = aPropMap.getUnpackedValueOrDefault("RedlineAuthor", aAuthorValue);
+    sal_uInt16 nAuthor = 0;
+    OUString sAuthor;
+    if( aAuthorValue >>= sAuthor )
+        nAuthor = pRedlineAccess->InsertRedlineAuthor(sAuthor);
+
+    OUString sComment;
+    uno::Any aCommentValue;
+    aCommentValue = aPropMap.getUnpackedValueOrDefault("RedlineComment", aCommentValue);
+
+    SwRedlineData aRedlineData( eType, nAuthor );
+    if( aCommentValue >>= sComment )
+        aRedlineData.SetComment( sComment );
+
+    ::util::DateTime aStamp;
+    uno::Any aDateTimeValue;
+    aDateTimeValue = aPropMap.getUnpackedValueOrDefault("RedlineDateTime", aDateTimeValue);
+    if( aDateTimeValue >>= aStamp )
+    {
+       aRedlineData.SetTimeStamp(
+        DateTime( Date( aStamp.Day, aStamp.Month, aStamp.Year ), Time( aStamp.Hours, aStamp.Minutes, aStamp.Seconds ) ) );
+    }
+
+    SwTableRowRedline* pRedline = new SwTableRowRedline( aRedlineData, rTableLine );
+    RedlineMode_t nPrevMode = pRedlineAccess->GetRedlineMode( );
+    pRedline->SetExtraData( NULL );
+
+    pRedlineAccess->SetRedlineMode_intern(nsRedlineMode_t::REDLINE_ON);
+    bool bRet = pRedlineAccess->AppendTableRowRedline( pRedline, false );
+    pRedlineAccess->SetRedlineMode_intern( nPrevMode );
+    if( !bRet )
+        throw lang::IllegalArgumentException();
+}
+
 SwAnyMapHelper::~SwAnyMapHelper()
 {
     AnyMapHelper_t::iterator aIt = begin();
diff --git a/sw/source/core/unocore/unotbl.cxx b/sw/source/core/unocore/unotbl.cxx
index ac05c38..e177150 100644
--- a/sw/source/core/unocore/unotbl.cxx
+++ b/sw/source/core/unocore/unotbl.cxx
@@ -95,6 +95,7 @@
 #include <comphelper/servicehelper.hxx>
 #include <comphelper/string.hxx>
 #include <cppuhelper/supportsservice.hxx>
+#include <comphelper/sequenceashashmap.hxx>
 
 using namespace ::com::sun::star;
 using ::editeng::SvxBorderLine;
@@ -1353,51 +1354,74 @@ void SwXTextTableRow::setPropertyValue(const OUString& rPropertyName,
         SwTableLine* pLn = SwXTextTableRow::FindLine(pTable, pLine);
         if(pLn)
         {
-            const SfxItemPropertySimpleEntry* pEntry =
-                m_pPropSet->getPropertyMap().getByName(rPropertyName);
-            SwDoc* pDoc = pFmt->GetDoc();
-            if (!pEntry)
-                throw beans::UnknownPropertyException(OUString( "Unknown property: " ) + rPropertyName, static_cast < cppu::OWeakObject * > ( this ) );
-            if ( pEntry->nFlags & beans::PropertyAttribute::READONLY)
-                throw beans::PropertyVetoException("Property is read-only: " + rPropertyName, static_cast < cppu::OWeakObject * > ( this ) );
-
-            switch(pEntry->nWID)
+            // Check for a specific property
+            if  ( rPropertyName == "TableRedlineParams" )
             {
-                case FN_UNO_ROW_HEIGHT:
-                case FN_UNO_ROW_AUTO_HEIGHT:
+                // Get the table row properties
+                uno::Sequence< beans::PropertyValue > tableRowProperties;
+                tableRowProperties = aValue.get< uno::Sequence< beans::PropertyValue > >();
+                comphelper::SequenceAsHashMap aPropMap( tableRowProperties );
+                OUString sRedlineType;
+                uno::Any sRedlineTypeValue;
+                sRedlineTypeValue = aPropMap.getUnpackedValueOrDefault("RedlineType", sRedlineTypeValue);
+                if( sRedlineTypeValue >>= sRedlineType )
                 {
-                    SwFmtFrmSize aFrmSize(pLn->GetFrmFmt()->GetFrmSize());
-                    if(FN_UNO_ROW_AUTO_HEIGHT== pEntry->nWID)
+                    // Create a 'Table Redline' object
+                    SwUnoCursorHelper::makeTableRedline( *pLn, sRedlineType, tableRowProperties);
+                }
+                else
+                {
+                    throw beans::UnknownPropertyException(OUString( "No redline type property: " ), static_cast < cppu::OWeakObject * > ( this ) );
+                }
+            }
+            else
+            {
+                const SfxItemPropertySimpleEntry* pEntry =
+                    m_pPropSet->getPropertyMap().getByName(rPropertyName);
+                SwDoc* pDoc = pFmt->GetDoc();
+                if (!pEntry)
+                    throw beans::UnknownPropertyException(OUString( "Unknown property: " ) + rPropertyName, static_cast < cppu::OWeakObject * > ( this ) );
+                if ( pEntry->nFlags & beans::PropertyAttribute::READONLY)
+                    throw beans::PropertyVetoException("Property is read-only: " + rPropertyName, static_cast < cppu::OWeakObject * > ( this ) );
+
+                switch(pEntry->nWID)
+                {
+                    case FN_UNO_ROW_HEIGHT:
+                    case FN_UNO_ROW_AUTO_HEIGHT:
                     {
-                        sal_Bool bSet = *(sal_Bool*)aValue.getValue();
-                        aFrmSize.SetHeightSizeType(bSet ? ATT_VAR_SIZE : ATT_FIX_SIZE);
+                        SwFmtFrmSize aFrmSize(pLn->GetFrmFmt()->GetFrmSize());
+                        if(FN_UNO_ROW_AUTO_HEIGHT== pEntry->nWID)
+                        {
+                            sal_Bool bSet = *(sal_Bool*)aValue.getValue();
+                            aFrmSize.SetHeightSizeType(bSet ? ATT_VAR_SIZE : ATT_FIX_SIZE);
+                        }
+                        else
+                        {
+                            sal_Int32 nHeight = 0;
+                            aValue >>= nHeight;
+                             Size aSz(aFrmSize.GetSize());
+                            aSz.Height() = MM100_TO_TWIP(nHeight);
+                            aFrmSize.SetSize(aSz);
+                        }
+                        pDoc->SetAttr(aFrmSize, *pLn->ClaimFrmFmt());
                     }
-                    else
+                    break;
+
+                    case FN_UNO_TABLE_COLUMN_SEPARATORS:
                     {
-                        sal_Int32 nHeight = 0;
-                        aValue >>= nHeight;
-                         Size aSz(aFrmSize.GetSize());
-                        aSz.Height() = MM100_TO_TWIP(nHeight);
-                        aFrmSize.SetSize(aSz);
+                        UnoActionContext aContext(pDoc);
+                        SwTable* pTable2 = SwTable::FindTable( pFmt );
+                        lcl_SetTblSeparators(aValue, pTable2, pLine->GetTabBoxes()[0], sal_True, pDoc);
                     }
-                    pDoc->SetAttr(aFrmSize, *pLn->ClaimFrmFmt());
-                }
-                break;
-
-                case FN_UNO_TABLE_COLUMN_SEPARATORS:
-                {
-                    UnoActionContext aContext(pDoc);
-                    SwTable* pTable2 = SwTable::FindTable( pFmt );
-                    lcl_SetTblSeparators(aValue, pTable2, pLine->GetTabBoxes()[0], sal_True, pDoc);
-                }
-                break;
+                    break;
 
-                default:
-                {
-                    SwFrmFmt* pLnFmt = pLn->ClaimFrmFmt();
-                    SwAttrSet aSet(pLnFmt->GetAttrSet());
-                    m_pPropSet->setPropertyValue(*pEntry, aValue, aSet);
-                    pDoc->SetAttr(aSet, *pLnFmt);
+                    default:
+                    {
+                        SwFrmFmt* pLnFmt = pLn->ClaimFrmFmt();
+                        SwAttrSet aSet(pLnFmt->GetAttrSet());
+                        m_pPropSet->setPropertyValue(*pEntry, aValue, aSet);
+                        pDoc->SetAttr(aSet, *pLnFmt);
+                    }
                 }
             }
         }
diff --git a/writerfilter/source/dmapper/TablePropertiesHandler.cxx b/writerfilter/source/dmapper/TablePropertiesHandler.cxx
index 6854f92..0500ddb 100644
--- a/writerfilter/source/dmapper/TablePropertiesHandler.cxx
+++ b/writerfilter/source/dmapper/TablePropertiesHandler.cxx
@@ -22,6 +22,7 @@
 #include "CellMarginHandler.hxx"
 #include "ConversionHelper.hxx"
 #include "MeasureHandler.hxx"
+#include "TrackChangesHandler.hxx"
 #include "TablePropertiesHandler.hxx"
 #include "TDefTableHandler.hxx"
 #include "DomainMapperTableManager.hxx"
@@ -32,6 +33,7 @@
 #include <com/sun/star/text/SizeType.hpp>
 #include <com/sun/star/text/VertOrientation.hpp>
 #include <dmapperLoggers.hxx>
+#include <ooxml/OOXMLFastTokens.hxx>
 
 
 namespace writerfilter {
@@ -63,7 +65,7 @@ namespace dmapper {
         Value::Pointer_t pValue = rSprm.getValue();
         sal_Int32 nIntValue = ((pValue.get() != NULL) ? pValue->getInt() : 0);
         switch( nSprmId )
-       {
+        {
             case NS_ooxml::LN_CT_TrPrBase_jc: //90706
             case NS_ooxml::LN_CT_TblPrBase_jc:
             case 0x5400: // sprmTJc
@@ -105,6 +107,37 @@ namespace dmapper {
                 }
             }
             break;
+            case NS_ooxml::LN_CT_TrPr_ins:
+            case NS_ooxml::LN_CT_TrPr_del:
+            {
+                writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
+                if( pProperties.get())
+                {
+                    sal_Int32 nToken;
+                    switch( nSprmId )
+                    {
+                        case NS_ooxml::LN_CT_TrPr_ins:
+                            nToken = ooxml::OOXML_tableRowInsert;
+                            break;
+                        case NS_ooxml::LN_CT_TrPr_del:
+                            nToken = ooxml::OOXML_tableRowDelete;
+                            break;
+                        default:
+                            throw ::com::sun::star::lang::IllegalArgumentException("illegal redline token type", NULL, 0);
+                            break;
+                    };
+                    TrackChangesHandlerPtr pTrackChangesHandler( new TrackChangesHandler( nToken ) );
+                    pProperties->resolve(*pTrackChangesHandler);
+                    TablePropertyMapPtr pPropMap( new TablePropertyMap );
+
+                    // Add the 'track changes' properties to the 'table row' via UNO.
+                    // This way - in the SW core - when it receives this - it will create a new 'Table Redline' object for that row
+                    uno::Sequence<beans::PropertyValue> aTableRedlineProperties = pTrackChangesHandler->getRedlineProperties();
+                    pPropMap->Insert( PROP_TABLE_REDLINE_PARAMS , uno::makeAny( aTableRedlineProperties ));
+                    insertRowProps(pPropMap);
+                }
+            }
+            break;
             case 0x3403: // sprmTFCantSplit
             case NS_sprm::LN_TCantSplit: // 0x3644
             {


More information about the Libreoffice-commits mailing list