Kaydet (Commit) 1b5839f4 authored tarafından Michael Stahl's avatar Michael Stahl

fdo#60842: sw ODF import: support value-type="string" on cells:

According to ODF 1.2 part 1 19.385 office:value-type, the attributes of
table:table-cell, namely office:value-type="string" and
office:string-value="foo", should override the element content of the
cell.

Change-Id: Ic580307effb046d127c4d64a4f963f0e91b3a2d1
üst 0e49d87d
...@@ -95,6 +95,7 @@ enum SwXMLTableCellAttrTokens ...@@ -95,6 +95,7 @@ enum SwXMLTableCellAttrTokens
XML_TOK_TABLE_BOOLEAN_VALUE, XML_TOK_TABLE_BOOLEAN_VALUE,
XML_TOK_TABLE_PROTECTED, XML_TOK_TABLE_PROTECTED,
XML_TOK_TABLE_STRING_VALUE, XML_TOK_TABLE_STRING_VALUE,
XML_TOK_TABLE_VALUE_TYPE,
XML_TOK_TABLE_CELL_ATTR_END=XML_TOK_UNKNOWN XML_TOK_TABLE_CELL_ATTR_END=XML_TOK_UNKNOWN
}; };
...@@ -136,6 +137,7 @@ static SvXMLTokenMapEntry aTableCellAttrTokenMap[] = ...@@ -136,6 +137,7 @@ static SvXMLTokenMapEntry aTableCellAttrTokenMap[] =
{ XML_NAMESPACE_TABLE, XML_PROTECTED, XML_TOK_TABLE_PROTECTED }, { XML_NAMESPACE_TABLE, XML_PROTECTED, XML_TOK_TABLE_PROTECTED },
{ XML_NAMESPACE_TABLE, XML_PROTECT, XML_TOK_TABLE_PROTECTED }, // for backwards compatibility with SRC629 (and before) { XML_NAMESPACE_TABLE, XML_PROTECT, XML_TOK_TABLE_PROTECTED }, // for backwards compatibility with SRC629 (and before)
{ XML_NAMESPACE_OFFICE, XML_STRING_VALUE, XML_TOK_TABLE_STRING_VALUE }, { XML_NAMESPACE_OFFICE, XML_STRING_VALUE, XML_TOK_TABLE_STRING_VALUE },
{ XML_NAMESPACE_OFFICE, XML_VALUE_TYPE, XML_TOK_TABLE_VALUE_TYPE },
XML_TOKEN_MAP_END XML_TOKEN_MAP_END
}; };
...@@ -162,6 +164,7 @@ class SwXMLTableCell_Impl ...@@ -162,6 +164,7 @@ class SwXMLTableCell_Impl
OUString aStyleName; OUString aStyleName;
OUString mXmlId; OUString mXmlId;
OUString m_StringValue;
OUString sFormula; // cell formula; valid if length > 0 OUString sFormula; // cell formula; valid if length > 0
double dValue; // formula value double dValue; // formula value
...@@ -175,7 +178,7 @@ class SwXMLTableCell_Impl ...@@ -175,7 +178,7 @@ class SwXMLTableCell_Impl
sal_Bool bProtected : 1; sal_Bool bProtected : 1;
sal_Bool bHasValue; // determines whether dValue attribute is valid sal_Bool bHasValue; // determines whether dValue attribute is valid
sal_Bool mbCovered; sal_Bool mbCovered;
sal_Bool mbTextValue; bool m_bHasStringValue;
public: public:
...@@ -185,18 +188,19 @@ public: ...@@ -185,18 +188,19 @@ public:
nColSpan( nCSpan ), nColSpan( nCSpan ),
bProtected( sal_False ), bProtected( sal_False ),
mbCovered( sal_False ) mbCovered( sal_False )
, m_bHasStringValue(false)
{} {}
inline void Set( const OUString& rStyleName, inline void Set( const OUString& rStyleName,
sal_uInt32 nRSpan, sal_uInt32 nCSpan, sal_uInt32 nRSpan, sal_uInt32 nCSpan,
const SwStartNode *pStNd, SwXMLTableContext *pTable, const SwStartNode *pStNd, SwXMLTableContext *pTable,
sal_Bool bProtect = sal_False, sal_Bool bProtect,
const OUString* pFormula = NULL, const OUString* pFormula,
sal_Bool bHasValue = sal_False, sal_Bool bHasValue,
sal_Bool mbCovered = sal_False, sal_Bool bCovered,
double dVal = 0.0, double dVal,
sal_Bool mbTextValue = sal_False, OUString const*const pStringValue,
OUString const& i_rXmlId = OUString()); OUString const& i_rXmlId);
bool IsUsed() const { return pStartNode!=0 || bool IsUsed() const { return pStartNode!=0 ||
xSubTable.Is() || bProtected;} xSubTable.Is() || bProtected;}
...@@ -210,7 +214,10 @@ public: ...@@ -210,7 +214,10 @@ public:
sal_Bool HasValue() const { return bHasValue; } sal_Bool HasValue() const { return bHasValue; }
sal_Bool IsProtected() const { return bProtected; } sal_Bool IsProtected() const { return bProtected; }
sal_Bool IsCovered() const { return mbCovered; } sal_Bool IsCovered() const { return mbCovered; }
sal_Bool HasTextValue() const { return mbTextValue; } bool HasStringValue() const { return m_bHasStringValue; }
OUString const* GetStringValue() const {
return (m_bHasStringValue) ? &m_StringValue : 0;
}
const OUString& GetXmlId() const { return mXmlId; } const OUString& GetXmlId() const { return mXmlId; }
const SwStartNode *GetStartNode() const { return pStartNode; } const SwStartNode *GetStartNode() const { return pStartNode; }
...@@ -230,7 +237,7 @@ inline void SwXMLTableCell_Impl::Set( const OUString& rStyleName, ...@@ -230,7 +237,7 @@ inline void SwXMLTableCell_Impl::Set( const OUString& rStyleName,
sal_Bool bHasVal, sal_Bool bHasVal,
sal_Bool bCov, sal_Bool bCov,
double dVal, double dVal,
sal_Bool bTextVal, OUString const*const pStringValue,
OUString const& i_rXmlId ) OUString const& i_rXmlId )
{ {
aStyleName = rStyleName; aStyleName = rStyleName;
...@@ -241,7 +248,11 @@ inline void SwXMLTableCell_Impl::Set( const OUString& rStyleName, ...@@ -241,7 +248,11 @@ inline void SwXMLTableCell_Impl::Set( const OUString& rStyleName,
dValue = dVal; dValue = dVal;
bHasValue = bHasVal; bHasValue = bHasVal;
mbCovered = bCov; mbCovered = bCov;
mbTextValue = bTextVal; if (pStringValue)
{
m_StringValue = *pStringValue;
}
m_bHasStringValue = (pStringValue != 0);
bProtected = bProtect; bProtected = bProtect;
if (!mbCovered) // ensure uniqueness if (!mbCovered) // ensure uniqueness
...@@ -396,12 +407,14 @@ class SwXMLTableCellContext_Impl : public SvXMLImportContext ...@@ -396,12 +407,14 @@ class SwXMLTableCellContext_Impl : public SvXMLImportContext
OUString sFormula; OUString sFormula;
OUString sSaveParaDefault; OUString sSaveParaDefault;
OUString mXmlId; OUString mXmlId;
OUString m_StringValue;
SvXMLImportContextRef xMyTable; SvXMLImportContextRef xMyTable;
double fValue; double fValue;
sal_Bool bHasValue; sal_Bool bHasValue;
sal_Bool bHasTextValue; bool m_bHasStringValue;
bool m_bValueTypeIsString;
sal_Bool bProtect; sal_Bool bProtect;
sal_uInt32 nRowSpan; sal_uInt32 nRowSpan;
...@@ -445,7 +458,8 @@ SwXMLTableCellContext_Impl::SwXMLTableCellContext_Impl( ...@@ -445,7 +458,8 @@ SwXMLTableCellContext_Impl::SwXMLTableCellContext_Impl(
xMyTable( pTable ), xMyTable( pTable ),
fValue( 0.0 ), fValue( 0.0 ),
bHasValue( sal_False ), bHasValue( sal_False ),
bHasTextValue( sal_False ), m_bHasStringValue(false),
m_bValueTypeIsString(false),
bProtect( sal_False ), bProtect( sal_False ),
nRowSpan( 1UL ), nRowSpan( 1UL ),
nColSpan( 1UL ), nColSpan( 1UL ),
...@@ -550,7 +564,19 @@ SwXMLTableCellContext_Impl::SwXMLTableCellContext_Impl( ...@@ -550,7 +564,19 @@ SwXMLTableCellContext_Impl::SwXMLTableCellContext_Impl(
break; break;
case XML_TOK_TABLE_STRING_VALUE: case XML_TOK_TABLE_STRING_VALUE:
{ {
bHasTextValue = sal_True; m_StringValue = rValue;
m_bHasStringValue = true;
}
break;
case XML_TOK_TABLE_VALUE_TYPE:
{
if ("string" == rValue)
{
m_bValueTypeIsString = true;
}
// ignore other types - it would be correct to require
// matching value-type and $type-value attributes,
// but we've been reading those without checking forever.
} }
break; break;
} }
...@@ -566,7 +592,8 @@ inline void SwXMLTableCellContext_Impl::_InsertContent() ...@@ -566,7 +592,8 @@ inline void SwXMLTableCellContext_Impl::_InsertContent()
GetTable()->InsertCell( aStyleName, nRowSpan, nColSpan, GetTable()->InsertCell( aStyleName, nRowSpan, nColSpan,
GetTable()->InsertTableSection(), GetTable()->InsertTableSection(),
mXmlId, mXmlId,
NULL, bProtect, &sFormula, bHasValue, fValue, bHasTextValue ); NULL, bProtect, &sFormula, bHasValue, fValue,
(m_bHasStringValue && m_bValueTypeIsString) ? &m_StringValue : 0);
} }
inline void SwXMLTableCellContext_Impl::InsertContent() inline void SwXMLTableCellContext_Impl::InsertContent()
...@@ -643,9 +670,13 @@ SvXMLImportContext *SwXMLTableCellContext_Impl::CreateChildContext( ...@@ -643,9 +670,13 @@ SvXMLImportContext *SwXMLTableCellContext_Impl::CreateChildContext(
{ {
if( GetTable()->IsValid() ) if( GetTable()->IsValid() )
InsertContentIfNotThere(); InsertContentIfNotThere();
pContext = GetImport().GetTextImport()->CreateTextChildContext( // fdo#60842: "office:string-value" overrides text content -> no import
if (!(m_bValueTypeIsString && m_bHasStringValue))
{
pContext = GetImport().GetTextImport()->CreateTextChildContext(
GetImport(), nPrefix, rLocalName, xAttrList, GetImport(), nPrefix, rLocalName, xAttrList,
XML_TEXT_TYPE_CELL ); XML_TEXT_TYPE_CELL );
}
} }
if( !pContext ) if( !pContext )
...@@ -1579,7 +1610,7 @@ void SwXMLTableContext::InsertCell( const OUString& rStyleName, ...@@ -1579,7 +1610,7 @@ void SwXMLTableContext::InsertCell( const OUString& rStyleName,
const OUString* pFormula, const OUString* pFormula,
sal_Bool bHasValue, sal_Bool bHasValue,
double fValue, double fValue,
sal_Bool bTextValue ) OUString const*const pStringValue )
{ {
OSL_ENSURE( nCurCol < GetColumnCount(), OSL_ENSURE( nCurCol < GetColumnCount(),
"SwXMLTableContext::InsertCell: row is full" ); "SwXMLTableContext::InsertCell: row is full" );
...@@ -1673,7 +1704,7 @@ void SwXMLTableContext::InsertCell( const OUString& rStyleName, ...@@ -1673,7 +1704,7 @@ void SwXMLTableContext::InsertCell( const OUString& rStyleName,
GetCell( nRowsReq-j, nColsReq-i ) GetCell( nRowsReq-j, nColsReq-i )
->Set( sStyleName, j, i, pStartNode, ->Set( sStyleName, j, i, pStartNode,
pTable, bProtect, pFormula, bHasValue, bCovered, fValue, pTable, bProtect, pFormula, bHasValue, bCovered, fValue,
bTextValue, i_rXmlId ); pStringValue, i_rXmlId );
} }
} }
...@@ -1742,7 +1773,7 @@ void SwXMLTableContext::InsertRepRows( sal_uInt32 nCount ) ...@@ -1742,7 +1773,7 @@ void SwXMLTableContext::InsertRepRows( sal_uInt32 nCount )
0, pSrcCell->IsProtected(), 0, pSrcCell->IsProtected(),
&pSrcCell->GetFormula(), &pSrcCell->GetFormula(),
pSrcCell->HasValue(), pSrcCell->GetValue(), pSrcCell->HasValue(), pSrcCell->GetValue(),
pSrcCell->HasTextValue() ); pSrcCell->GetStringValue() );
} }
} }
FinishRow(); FinishRow();
...@@ -2076,6 +2107,18 @@ SwTableBox *SwXMLTableContext::MakeTableBox( ...@@ -2076,6 +2107,18 @@ SwTableBox *SwXMLTableContext::MakeTableBox(
if( pCell->GetStartNode() ) if( pCell->GetStartNode() )
{ {
if (pCell->HasStringValue())
{
SwNodeIndex const aNodeIndex(*(pCell->GetStartNode()), 1);
SwTxtNode *const pTxtNode(aNodeIndex.GetNode().GetTxtNode());
SAL_WARN_IF(!pTxtNode, "sw", "Should have a text node in cell?");
if (pTxtNode)
{
SAL_WARN_IF(pTxtNode->GetTxt().Len(), "sw", "why text here?");
pTxtNode->InsertText(*pCell->GetStringValue(),
SwIndex(pTxtNode, 0));
}
}
// try to rescue broken documents with a certain pattern // try to rescue broken documents with a certain pattern
// if: 1) the cell has a default number format (number 0) // if: 1) the cell has a default number format (number 0)
...@@ -2139,7 +2182,7 @@ SwTableBox *SwXMLTableContext::MakeTableBox( ...@@ -2139,7 +2182,7 @@ SwTableBox *SwXMLTableContext::MakeTableBox(
SwTblBoxFormula aFormulaItem( rFormula ); SwTblBoxFormula aFormulaItem( rFormula );
pBoxFmt2->SetFmtAttr( aFormulaItem ); pBoxFmt2->SetFmtAttr( aFormulaItem );
} }
else if( !pCell->HasValue() && pCell->HasTextValue() ) else if (!pCell->HasValue() && pCell->HasStringValue())
{ {
// Check for another inconsistency: // Check for another inconsistency:
// No value but a non-textual format, i.e. a number format // No value but a non-textual format, i.e. a number format
......
...@@ -177,7 +177,7 @@ public: ...@@ -177,7 +177,7 @@ public:
const ::rtl::OUString *pFormula=0, const ::rtl::OUString *pFormula=0,
sal_Bool bHasValue = sal_False, sal_Bool bHasValue = sal_False,
double fValue = 0.0, double fValue = 0.0,
sal_Bool bTextValue = sal_False ); ::rtl::OUString const*const pStringValue = 0);
void InsertRow( const ::rtl::OUString& rStyleName, void InsertRow( const ::rtl::OUString& rStyleName,
const ::rtl::OUString& rDfltCellStyleName, const ::rtl::OUString& rDfltCellStyleName,
bool bInHead, bool bInHead,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment