diff --git a/sw/inc/unocrsrhelper.hxx b/sw/inc/unocrsrhelper.hxx index ae5ffd920f74..b50e372b7c84 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 f08021c87f54..116b8b429cc2 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 ac05c38801a5..e177150e1758 100644 --- a/sw/source/core/unocore/unotbl.cxx +++ b/sw/source/core/unocore/unotbl.cxx @@ -95,6 +95,7 @@ #include #include #include +#include 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) - { - 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()); + // Create a 'Table Redline' object + SwUnoCursorHelper::makeTableRedline( *pLn, sRedlineType, tableRowProperties); } - break; - - case FN_UNO_TABLE_COLUMN_SEPARATORS: + else { - UnoActionContext aContext(pDoc); - SwTable* pTable2 = SwTable::FindTable( pFmt ); - lcl_SetTblSeparators(aValue, pTable2, pLine->GetTabBoxes()[0], sal_True, pDoc); + throw beans::UnknownPropertyException(OUString( "No redline type property: " ), static_cast < cppu::OWeakObject * > ( this ) ); } - break; + } + 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 ) ); - default: + switch(pEntry->nWID) { - SwFrmFmt* pLnFmt = pLn->ClaimFrmFmt(); - SwAttrSet aSet(pLnFmt->GetAttrSet()); - m_pPropSet->setPropertyValue(*pEntry, aValue, aSet); - pDoc->SetAttr(aSet, *pLnFmt); + case FN_UNO_ROW_HEIGHT: + case FN_UNO_ROW_AUTO_HEIGHT: + { + 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()); + } + 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; + + 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 6854f92d7a21..0500ddbde295 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 #include #include +#include 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::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 aTableRedlineProperties = pTrackChangesHandler->getRedlineProperties(); + pPropMap->Insert( PROP_TABLE_REDLINE_PARAMS , uno::makeAny( aTableRedlineProperties )); + insertRowProps(pPropMap); + } + } + break; case 0x3403: // sprmTFCantSplit case NS_sprm::LN_TCantSplit: // 0x3644 {