Partial fix for bug 30711

This commit is contained in:
Brennan Vincent
2012-04-08 14:45:01 -07:00
committed by Miklos Vajna
parent 628d2e71ac
commit 7a1c5e54af
2 changed files with 94 additions and 4 deletions

View File

@@ -110,6 +110,9 @@ class XMLOFF_DLLPUBLIC XMLTextParagraphExport : public XMLStyleExport
::std::vector< XMLTextListsHelper* > maTextListsHelperStack;
enum FrameType { FT_TEXT, FT_GRAPHIC, FT_EMBEDDED, FT_SHAPE };
public:
enum FieldmarkType { NONE, TEXT, CHECK }; // Used for simulating fieldmarks in OpenDocument 1.n Strict (for n <= 2). CHECK currently ignored.
protected:
@@ -430,7 +433,8 @@ protected:
const ::com::sun::star::uno::Reference <
::com::sun::star::text::XTextRange > & rTextRange,
sal_Bool bAutoStyles,
bool& rPrevCharWasSpace );
bool& rPrevCharWasSpace,
FieldmarkType& openFieldmarkType );
void exportListChange( const XMLTextNumRuleInfo& rPrvInfo,
const XMLTextNumRuleInfo& rNextInfo );

View File

@@ -2182,6 +2182,10 @@ void XMLTextParagraphExport::exportTextRangeEnumeration(
static OUString sMeta(RTL_CONSTASCII_USTRINGPARAM("InContentMetadata"));
bool bPrevCharIsSpace = bPrvChrIsSpc;
/* This is used for exporting to strict OpenDocument 1.2, in which case traditional
* bookmarks are used instead of fieldmarks. */
FieldmarkType openFieldMark = NONE;
while( rTextEnum->hasMoreElements() )
{
Reference<XPropertySet> xPropSet(rTextEnum->nextElement(), UNO_QUERY);
@@ -2196,7 +2200,7 @@ void XMLTextParagraphExport::exportTextRangeEnumeration(
if( sType.equals(sText))
{
exportTextRange( xTxtRange, bAutoStyles,
bPrevCharIsSpace );
bPrevCharIsSpace, openFieldMark);
}
else if( sType.equals(sTextField))
{
@@ -2261,6 +2265,7 @@ void XMLTextParagraphExport::exportTextRangeEnumeration(
}
else if (sType.equals(sTextFieldStart))
{
/* As of now, textmarks are a proposed extension to the OpenDocument standard. */
if ( GetExport().getDefaultVersion() == SvtSaveOptions::ODFVER_LATEST )
{
Reference<XNamed> xBookmark(xPropSet->getPropertyValue(sBookmark), UNO_QUERY);
@@ -2280,6 +2285,46 @@ void XMLTextParagraphExport::exportTextRangeEnumeration(
}
GetExport().EndElement(XML_NAMESPACE_FIELD, XML_FIELDMARK_START, sal_False);
}
/* The OpenDocument standard does not include support for TextMarks for now, so use bookmarks instead. */
else
{
Reference< ::com::sun::star::text::XFormField > xFormField(xPropSet->getPropertyValue(sBookmark), UNO_QUERY);
if (xFormField.is())
{
Reference< ::com::sun::star::container::XNameAccess > xParameters(xFormField->getParameters(), UNO_QUERY);
if (xParameters.is() && xParameters->hasByName("Name"))
{
const Any aValue = xParameters->getByName("Name");
const Type aValueType = aValue.getValueType();
if (aValueType == ::getCppuType((OUString*)0))
{
OUString sValue;
aValue >>= sValue;
GetExport().AddAttribute(XML_NAMESPACE_TEXT, XML_NAME, sValue);
}
}
GetExport().StartElement(XML_NAMESPACE_TEXT, XML_BOOKMARK_START, sal_False);
GetExport().EndElement(XML_NAMESPACE_TEXT, XML_BOOKMARK_START, sal_False);
const OUString sFieldType = xFormField->getFieldType();
if (sFieldType == ODF_FORMTEXT)
{
openFieldMark = TEXT;
}
else if (sFieldType == ODF_FORMCHECKBOX)
{
openFieldMark = CHECK;
}
else
{
openFieldMark = NONE;
}
}
else
{
GetExport().StartElement(XML_NAMESPACE_TEXT, XML_BOOKMARK_START, sal_False);
GetExport().EndElement(XML_NAMESPACE_TEXT, XML_BOOKMARK_START, sal_False);
}
}
}
else if (sType.equals(sTextFieldEnd))
{
@@ -2288,6 +2333,27 @@ void XMLTextParagraphExport::exportTextRangeEnumeration(
GetExport().StartElement(XML_NAMESPACE_FIELD, XML_FIELDMARK_END, sal_False);
GetExport().EndElement(XML_NAMESPACE_FIELD, XML_FIELDMARK_END, sal_False);
}
else
{
Reference< ::com::sun::star::text::XFormField > xFormField(xPropSet->getPropertyValue(sBookmark), UNO_QUERY);
if (xFormField.is())
{
Reference< ::com::sun::star::container::XNameAccess > xParameters(xFormField->getParameters(), UNO_QUERY);
if (xParameters.is() && xParameters->hasByName("Name"))
{
const Any aValue = xParameters->getByName("Name");
const Type aValueType = aValue.getValueType();
if (aValueType == ::getCppuType((OUString*)0))
{
OUString sValue;
aValue >>= sValue;
GetExport().AddAttribute(XML_NAMESPACE_TEXT, XML_NAME, sValue);
}
}
}
GetExport().StartElement(XML_NAMESPACE_TEXT, XML_BOOKMARK_END, sal_False);
GetExport().EndElement(XML_NAMESPACE_TEXT,XML_BOOKMARK_END, sal_False);
}
}
else if (sType.equals(sTextFieldStartEnd))
{
@@ -2310,6 +2376,16 @@ void XMLTextParagraphExport::exportTextRangeEnumeration(
}
GetExport().EndElement(XML_NAMESPACE_FIELD, XML_FIELDMARK, sal_False);
}
else
{
Reference<XNamed> xBookmark(xPropSet->getPropertyValue(sBookmark), UNO_QUERY);
if (xBookmark.is())
{
GetExport().AddAttribute(XML_NAMESPACE_TEXT, XML_NAME, xBookmark->getName());
}
GetExport().StartElement(XML_NAMESPACE_TEXT, XML_BOOKMARK, sal_False);
GetExport().EndElement(XML_NAMESPACE_TEXT, XML_BOOKMARK, sal_False);
}
}
else if (sType.equals(sSoftPageBreak))
{
@@ -2330,7 +2406,7 @@ void XMLTextParagraphExport::exportTextRangeEnumeration(
else
{
// no TextPortionType property -> non-Writer app -> text
exportTextRange( xTxtRange, bAutoStyles, bPrevCharIsSpace );
exportTextRange( xTxtRange, bAutoStyles, bPrevCharIsSpace, openFieldMark );
}
}
}
@@ -3218,7 +3294,8 @@ sal_Bool XMLTextParagraphExport::addHyperlinkAttributes(
void XMLTextParagraphExport::exportTextRange(
const Reference < XTextRange > & rTextRange,
sal_Bool bAutoStyles,
bool& rPrevCharIsSpace )
bool& rPrevCharIsSpace,
FieldmarkType& openFieldMark )
{
Reference < XPropertySet > xPropSet( rTextRange, UNO_QUERY );
if( bAutoStyles )
@@ -3271,7 +3348,16 @@ void XMLTextParagraphExport::exportTextRange(
SvXMLElementExport aElement( GetExport(), !sStyle.isEmpty(),
XML_NAMESPACE_TEXT, XML_SPAN, sal_False,
sal_False );
if (openFieldMark == TEXT)
{
GetExport().StartElement( XML_NAMESPACE_TEXT, XML_TEXT_INPUT, sal_False );
}
exportText( aText, rPrevCharIsSpace );
if (openFieldMark == TEXT)
{
GetExport().EndElement( XML_NAMESPACE_TEXT, XML_TEXT_INPUT, sal_False );
}
openFieldMark = NONE;
}
}
}