summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sw/inc/unocrsrhelper.hxx4
-rw-r--r--sw/source/core/unocore/unocrsrhelper.cxx57
-rw-r--r--sw/source/core/unocore/unotbl.cxx100
-rw-r--r--writerfilter/source/dmapper/TablePropertiesHandler.cxx35
4 files changed, 157 insertions, 39 deletions
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 <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 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 <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
{