diff options
Diffstat (limited to 'xmloff/source/text')
-rw-r--r-- | xmloff/source/text/XMLTextMarkImportContext.cxx | 165 | ||||
-rw-r--r-- | xmloff/source/text/XMLTextMarkImportContext.hxx | 26 | ||||
-rw-r--r-- | xmloff/source/text/txtflde.cxx | 15 | ||||
-rw-r--r-- | xmloff/source/text/txtparae.cxx | 57 | ||||
-rw-r--r-- | xmloff/source/text/txtparai.cxx | 256 | ||||
-rw-r--r-- | xmloff/source/text/txtparaimphint.hxx | 23 |
6 files changed, 290 insertions, 252 deletions
diff --git a/xmloff/source/text/XMLTextMarkImportContext.cxx b/xmloff/source/text/XMLTextMarkImportContext.cxx index 1091636c9d3f..5e6f47ed5b6a 100644 --- a/xmloff/source/text/XMLTextMarkImportContext.cxx +++ b/xmloff/source/text/XMLTextMarkImportContext.cxx @@ -47,6 +47,7 @@ #include <com/sun/star/beans/XPropertySet.hpp> #include <com/sun/star/lang/XMultiServiceFactory.hpp> #include <com/sun/star/container/XNamed.hpp> +#include <com/sun/star/rdf/XMetadatable.hpp> #include <com/sun/star/text/XFormField.hpp> @@ -111,9 +112,10 @@ XMLTextMarkImportContext::XMLTextMarkImportContext( SvXMLImport& rImport, XMLTextImportHelper& rHlp, sal_uInt16 nPrefix, - const OUString& rLocalName ) : - SvXMLImportContext(rImport, nPrefix, rLocalName), - rHelper(rHlp) + const OUString& rLocalName ) + : SvXMLImportContext(rImport, nPrefix, rLocalName) + , m_rHelper(rHlp) + , m_bHaveAbout(false) { } @@ -139,19 +141,24 @@ static SvXMLEnumMapEntry __READONLY_DATA lcl_aMarkTypeMap[] = void XMLTextMarkImportContext::StartElement( const Reference<XAttributeList> & xAttrList) { - if (!FindName(GetImport(), xAttrList, sBookmarkName, m_XmlId, &sFieldName)) - sBookmarkName=OUString(); + if (!FindName(GetImport(), xAttrList)) + { + m_sBookmarkName = OUString(); + } if (IsXMLToken(GetLocalName(), XML_FIELDMARK_END)) - sBookmarkName=rHelper.FindActiveBookmarkName(); + { + m_sBookmarkName = m_rHelper.FindActiveBookmarkName(); + } if (IsXMLToken(GetLocalName(), XML_FIELDMARK_START) || IsXMLToken(GetLocalName(), XML_FIELDMARK)) { - if (sBookmarkName.getLength()==0) - sBookmarkName=::rtl::OUString::createFromAscii("Unknown"); - rHelper.pushFieldCtx( sBookmarkName, sFieldName ); + if (m_sBookmarkName.getLength() == 0) + { + m_sBookmarkName = ::rtl::OUString::createFromAscii("Unknown"); + } + m_rHelper.pushFieldCtx( m_sBookmarkName, m_sFieldName ); } - } void XMLTextMarkImportContext::EndElement() @@ -167,7 +174,7 @@ void XMLTextMarkImportContext::EndElement() const OUString sAPI_formfieldmark( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.text.FormFieldmark")); - if (sBookmarkName.getLength()>0) + if (m_sBookmarkName.getLength() > 0) { sal_uInt16 nTmp; if (SvXMLUnitConverter::convertEnum(nTmp, GetLocalName(), @@ -178,34 +185,42 @@ void XMLTextMarkImportContext::EndElement() case TypeReference: // export point reference mark CreateAndInsertMark(GetImport(), - sAPI_reference_mark, - sBookmarkName, - rHelper.GetCursorAsRange()->getStart(), - ::rtl::OUString()); + sAPI_reference_mark, + m_sBookmarkName, + m_rHelper.GetCursorAsRange()->getStart(), + ::rtl::OUString()); break; case TypeFieldmark: case TypeBookmark: { - bool bImportAsField=((lcl_MarkType)nTmp==TypeFieldmark && sFieldName.compareToAscii("msoffice.field.FORMCHECKBOX")==0); // for now only import FORMCHECKBOX boxes + bool bImportAsField=((lcl_MarkType)nTmp==TypeFieldmark && m_sFieldName.compareToAscii("msoffice.field.FORMCHECKBOX")==0); // for now only import FORMCHECKBOX boxes // export point bookmark - Reference<XInterface> xIfc=CreateAndInsertMark(GetImport(), + const Reference<XInterface> xContent( + CreateAndInsertMark(GetImport(), (bImportAsField?sAPI_formfieldmark:sAPI_bookmark), - sBookmarkName, - rHelper.GetCursorAsRange()->getStart(), - m_XmlId); + m_sBookmarkName, + m_rHelper.GetCursorAsRange()->getStart(), + m_sXmlId) ); + if (m_bHaveAbout) + { + const Reference<com::sun::star::rdf::XMetadatable> + xMeta( xContent, UNO_QUERY); + GetImport().AddRDFa(xMeta, + m_sAbout, m_sProperty, m_sContent, m_sDatatype); + } if ((lcl_MarkType)nTmp==TypeFieldmark) { - if (xIfc.is() && bImportAsField) { + if (xContent.is() && bImportAsField) { // setup fieldmark... - Reference< ::com::sun::star::text::XFormField> xFormField(xIfc, UNO_QUERY); + Reference< ::com::sun::star::text::XFormField> xFormField(xContent, UNO_QUERY); xFormField->setType(1); // Checkbox... - if (xFormField.is() && rHelper.hasCurrentFieldCtx()) { + if (xFormField.is() && m_rHelper.hasCurrentFieldCtx()) { // xFormField->setDescription(::rtl::OUString::createFromAscii("HELLO CHECKBOX")); // xFormField->setRes(1); - rHelper.setCurrentFieldParamsTo(xFormField); + m_rHelper.setCurrentFieldParamsTo(xFormField); } } - rHelper.popFieldCtx(); + m_rHelper.popFieldCtx(); } } break; @@ -213,9 +228,9 @@ void XMLTextMarkImportContext::EndElement() case TypeFieldmarkStart: case TypeBookmarkStart: // save XTextRange for later construction of bookmark - rHelper.InsertBookmarkStartRange( - sBookmarkName, rHelper.GetCursorAsRange()->getStart(), - m_XmlId); + m_rHelper.InsertBookmarkStartRange( + m_sBookmarkName, m_rHelper.GetCursorAsRange()->getStart(), + m_sXmlId); break; case TypeFieldmarkEnd: @@ -223,18 +238,18 @@ void XMLTextMarkImportContext::EndElement() { // get old range, and construct Reference<XTextRange> xStartRange; - if (rHelper.FindAndRemoveBookmarkStartRange(sBookmarkName, - xStartRange, m_XmlId)) + if (m_rHelper.FindAndRemoveBookmarkStartRange(m_sBookmarkName, + xStartRange, m_sXmlId)) { Reference<XTextRange> xEndRange( - rHelper.GetCursorAsRange()->getStart()); + m_rHelper.GetCursorAsRange()->getStart()); // check if beginning and end are in same XText if (xStartRange->getText() == xEndRange->getText()) { // create range for insertion Reference<XTextCursor> xInsertionCursor = - rHelper.GetText()->createTextCursorByRange( + m_rHelper.GetText()->createTextCursorByRange( xEndRange); xInsertionCursor->gotoRange(xStartRange, sal_True); @@ -247,30 +262,39 @@ void XMLTextMarkImportContext::EndElement() Reference<XTextRange> xInsertionRange( xInsertionCursor, UNO_QUERY); - bool bImportAsField=((lcl_MarkType)nTmp==TypeFieldmarkEnd && rHelper.hasCurrentFieldCtx()); + bool bImportAsField=((lcl_MarkType)nTmp==TypeFieldmarkEnd && m_rHelper.hasCurrentFieldCtx()); if (bImportAsField) { - ::rtl::OUString currentFieldType=rHelper.getCurrentFieldType(); + ::rtl::OUString currentFieldType = + m_rHelper.getCurrentFieldType(); bImportAsField=currentFieldType.compareToAscii("msoffice.field.FORMTEXT")==0; // for now only import FORMTEXT boxes } // insert reference - Reference<XInterface> xIfc=CreateAndInsertMark(GetImport(), + const Reference<XInterface> xContent( + CreateAndInsertMark(GetImport(), (bImportAsField?sAPI_fieldmark:sAPI_bookmark), - sBookmarkName, - xInsertionRange, - m_XmlId); + m_sBookmarkName, + xInsertionRange, + m_sXmlId) ); + if (m_bHaveAbout) + { + const Reference<com::sun::star::rdf::XMetadatable> + xMeta( xContent, UNO_QUERY); + GetImport().AddRDFa(xMeta, + m_sAbout, m_sProperty, m_sContent, m_sDatatype); + } if ((lcl_MarkType)nTmp==TypeFieldmarkEnd) { - if (xIfc.is() && bImportAsField) { + if (xContent.is() && bImportAsField) { // setup fieldmark... - Reference< ::com::sun::star::text::XFormField> xFormField(xIfc, UNO_QUERY); + Reference< ::com::sun::star::text::XFormField> xFormField(xContent, UNO_QUERY); xFormField->setType(0); // Text - if (xFormField.is() && rHelper.hasCurrentFieldCtx()) { - rHelper.setCurrentFieldParamsTo(xFormField); + if (xFormField.is() && m_rHelper.hasCurrentFieldCtx()) { + m_rHelper.setCurrentFieldParamsTo(xFormField); // xFormField->setDescription(::rtl::OUString::createFromAscii("HELLO")); } } - rHelper.popFieldCtx(); + m_rHelper.popFieldCtx(); } } // else: beginning/end in different XText -> ignore! @@ -296,11 +320,12 @@ SvXMLImportContext *XMLTextMarkImportContext::CreateChildContext( USHORT nPrefix const ::rtl::OUString& rLocalName, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& ) { - return new XMLFieldParamImportContext(GetImport(), rHelper, nPrefix, rLocalName); + return new XMLFieldParamImportContext(GetImport(), m_rHelper, + nPrefix, rLocalName); } -Reference<XInterface> XMLTextMarkImportContext::CreateAndInsertMark( +Reference<XTextContent> XMLTextMarkImportContext::CreateAndInsertMark( SvXMLImport& rImport, const OUString& sServiceName, const OUString& sMarkName, @@ -337,9 +362,6 @@ Reference<XInterface> XMLTextMarkImportContext::CreateAndInsertMark( } } - // xml:id for RDF metadata - rImport.SetXmlId(xIfc, i_rXmlId); - // cast to XTextContent and attach to document const Reference<XTextContent> xTextContent(xIfc, UNO_QUERY); if (xTextContent.is()) @@ -350,6 +372,11 @@ Reference<XInterface> XMLTextMarkImportContext::CreateAndInsertMark( // collapsing of the given XTextRange. rImport.GetTextImport()->GetText()->insertTextContent(rRange, xTextContent, sal_True); + + // xml:id for RDF metadata -- after insertion! + rImport.SetXmlId(xIfc, i_rXmlId); + + return xTextContent; } catch (com::sun::star::lang::IllegalArgumentException &) { @@ -358,44 +385,60 @@ Reference<XInterface> XMLTextMarkImportContext::CreateAndInsertMark( } } } - return xIfc; + return 0; } sal_Bool XMLTextMarkImportContext::FindName( SvXMLImport& rImport, - const Reference<XAttributeList> & xAttrList, - OUString& sName, - OUString& o_rXmlId, - ::rtl::OUString *pFieldName) + const Reference<XAttributeList> & xAttrList) { sal_Bool bNameOK = sal_False; // find name attribute first - sal_Int16 nLength = xAttrList->getLength(); + const sal_Int16 nLength = xAttrList->getLength(); for(sal_Int16 nAttr = 0; nAttr < nLength; nAttr++) { OUString sLocalName; - sal_uInt16 nPrefix = rImport.GetNamespaceMap(). + const sal_uInt16 nPrefix = rImport.GetNamespaceMap(). GetKeyByAttrName( xAttrList->getNameByIndex(nAttr), &sLocalName ); if ( (XML_NAMESPACE_TEXT == nPrefix) && IsXMLToken(sLocalName, XML_NAME) ) { - sName = xAttrList->getValueByIndex(nAttr); + m_sBookmarkName = xAttrList->getValueByIndex(nAttr); bNameOK = sal_True; } else if ( (XML_NAMESPACE_XML == nPrefix) && IsXMLToken(sLocalName, XML_ID) ) { - o_rXmlId = xAttrList->getValueByIndex(nAttr); + m_sXmlId = xAttrList->getValueByIndex(nAttr); + } + else if ( XML_NAMESPACE_XHTML == nPrefix ) + { + // RDFa + if ( IsXMLToken( sLocalName, XML_ABOUT) ) + { + m_sAbout = xAttrList->getValueByIndex(nAttr); + m_bHaveAbout = true; + } + else if ( IsXMLToken( sLocalName, XML_PROPERTY) ) + { + m_sProperty = xAttrList->getValueByIndex(nAttr); + } + else if ( IsXMLToken( sLocalName, XML_CONTENT) ) + { + m_sContent = xAttrList->getValueByIndex(nAttr); + } + else if ( IsXMLToken( sLocalName, XML_DATATYPE) ) + { + m_sDatatype = xAttrList->getValueByIndex(nAttr); + } } -//FIXME: RDFa (text:bookmark-start) - else if ( pFieldName!=NULL && - (XML_NAMESPACE_FIELD == nPrefix) && + else if ( (XML_NAMESPACE_FIELD == nPrefix) && IsXMLToken(sLocalName, XML_TYPE) ) { - *pFieldName = xAttrList->getValueByIndex(nAttr); + m_sFieldName = xAttrList->getValueByIndex(nAttr); } } diff --git a/xmloff/source/text/XMLTextMarkImportContext.hxx b/xmloff/source/text/XMLTextMarkImportContext.hxx index 4491524e9ec2..0269a3b4622d 100644 --- a/xmloff/source/text/XMLTextMarkImportContext.hxx +++ b/xmloff/source/text/XMLTextMarkImportContext.hxx @@ -39,6 +39,7 @@ namespace com { namespace sun { namespace star { namespace text { class XTextRange; + class XTextContent; } namespace xml { namespace sax { class XAttributeList; @@ -75,10 +76,16 @@ public: class XMLTextMarkImportContext : public SvXMLImportContext { - XMLTextImportHelper& rHelper; - ::rtl::OUString m_XmlId; - ::rtl::OUString sBookmarkName; - ::rtl::OUString sFieldName; + XMLTextImportHelper & m_rHelper; + ::rtl::OUString m_sBookmarkName; + ::rtl::OUString m_sFieldName; + ::rtl::OUString m_sXmlId; + // RDFa + bool m_bHaveAbout; + ::rtl::OUString m_sAbout; + ::rtl::OUString m_sProperty; + ::rtl::OUString m_sContent; + ::rtl::OUString m_sDatatype; public: @@ -90,7 +97,6 @@ public: sal_uInt16 nPrfx, const ::rtl::OUString& rLocalName ); - protected: virtual void StartElement( @@ -103,7 +109,8 @@ protected: const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& xAttrList ); public: - static ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > CreateAndInsertMark( + static ::com::sun::star::uno::Reference< + ::com::sun::star::text::XTextContent > CreateAndInsertMark( SvXMLImport& rImport, const ::rtl::OUString& sServiceName, const ::rtl::OUString& sMarkName, @@ -111,13 +118,10 @@ public: ::com::sun::star::text::XTextRange> & rRange, const ::rtl::OUString& i_rXmlId = ::rtl::OUString()); - static sal_Bool FindName( + sal_Bool FindName( SvXMLImport& rImport, const ::com::sun::star::uno::Reference< - ::com::sun::star::xml::sax::XAttributeList> & xAttrList, - ::rtl::OUString& sName, - ::rtl::OUString& o_rXmlId, - ::rtl::OUString *pFieldName=NULL); + ::com::sun::star::xml::sax::XAttributeList> & xAttrList); }; #endif diff --git a/xmloff/source/text/txtflde.cxx b/xmloff/source/text/txtflde.cxx index 873a4a42f02c..198938fdc8f6 100644 --- a/xmloff/source/text/txtflde.cxx +++ b/xmloff/source/text/txtflde.cxx @@ -148,7 +148,7 @@ static sal_Char __READONLY_DATA FIELD_SERVICE_BIBLIOGRAPHY[] = "Bibliography"; static sal_Char __READONLY_DATA FIELD_SERVICE_SCRIPT[] = "Script"; static sal_Char __READONLY_DATA FIELD_SERVICE_ANNOTATION[] = "Annotation"; static sal_Char __READONLY_DATA FIELD_SERVICE_COMBINED_CHARACTERS[] = "CombinedCharacters"; -static sal_Char __READONLY_DATA FIELD_SERVICE_META[] = "MetaField"; +static sal_Char __READONLY_DATA FIELD_SERVICE_META[] = "MetadataField"; static sal_Char __READONLY_DATA FIELD_SERVICE_MEASURE[] = "Measure"; static sal_Char __READONLY_DATA FIELD_SERVICE_TABLE_FORMULA[] = "TableFormula"; static sal_Char __READONLY_DATA FIELD_SERVICE_DROP_DOWN[] = "DropDown"; @@ -263,7 +263,7 @@ XMLTextFieldExport::XMLTextFieldExport( SvXMLExport& rExp, XMLPropertyState* pCombinedCharState) : rExport(rExp), pUsedMasters(NULL), - sServicePrefix(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.text.TextField.")), + sServicePrefix(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.text.textfield.")), sFieldMasterPrefix(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.text.FieldMaster.")), sPresentationServicePrefix(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.presentation.TextField.")), @@ -645,7 +645,7 @@ sal_Bool XMLTextFieldExport::IsStringField( return !bRet; } - case FIELD_ID_META://FIXME ?????? no idea... + case FIELD_ID_META: return 0 > GetIntProperty(sPropertyNumberFormat, xPropSet); case FIELD_ID_DATABASE_DISPLAY: @@ -740,7 +740,8 @@ sal_Bool XMLTextFieldExport::IsStringField( /// export the styles needed by the given field. Called on first pass /// through document void XMLTextFieldExport::ExportFieldAutoStyle( - const Reference<XTextField> & rTextField, sal_Bool bProgress ) + const Reference<XTextField> & rTextField, const sal_Bool bProgress, + const sal_Bool bRecursive ) { // get property set Reference<XPropertySet> xPropSet(rTextField, UNO_QUERY); @@ -835,7 +836,10 @@ void XMLTextFieldExport::ExportFieldAutoStyle( case FIELD_ID_META: // recurse into content (does not export element, so can be done first) - ExportMetaField(xPropSet, true, bProgress); + if (bRecursive) + { + ExportMetaField(xPropSet, true, bProgress); + } // fall-through: for the meta-field itself! case FIELD_ID_DOCINFO_PRINT_TIME: case FIELD_ID_DOCINFO_PRINT_DATE: @@ -2263,7 +2267,6 @@ void XMLTextFieldExport::ExportMacro( GetExport().Characters(rContent); } -// FIXME: this is untested void XMLTextFieldExport::ExportMetaField( const Reference<XPropertySet> & i_xMeta, bool i_bAutoStyles, sal_Bool i_bProgress ) diff --git a/xmloff/source/text/txtparae.cxx b/xmloff/source/text/txtparae.cxx index 6a3b66ec58ee..2c160eabd334 100644 --- a/xmloff/source/text/txtparae.cxx +++ b/xmloff/source/text/txtparae.cxx @@ -1461,8 +1461,8 @@ bool XMLTextParagraphExport::collectTextAutoStylesOptimized( sal_Bool bIsProgres { Any aAny = xTextFieldsEnum->nextElement(); Reference< XTextField > xTextField = *(Reference<XTextField>*)aAny.getValue(); - exportTextField( xTextField->getAnchor(), bAutoStyles, - bIsProgress ); + exportTextField( xTextField, bAutoStyles, bIsProgress, + !xAutoStylesSupp.is() ); try { Reference < XPropertySet > xSet( xTextField, UNO_QUERY ); @@ -1470,8 +1470,11 @@ bool XMLTextParagraphExport::collectTextAutoStylesOptimized( sal_Bool bIsProgres Any a = xSet->getPropertyValue( ::rtl::OUString::createFromAscii("TextRange") ); a >>= xText; if ( xText.is() ) + { exportText( xText, sal_True, bIsProgress, bExportContent ); - GetExport().GetTextParagraphExport()->collectTextAutoStyles( xText ); + GetExport().GetTextParagraphExport() + ->collectTextAutoStyles( xText ); + } } catch (Exception&) { @@ -2145,7 +2148,7 @@ void XMLTextParagraphExport::exportTextRangeEnumeration( sal_Bool bAutoStyles, sal_Bool bIsProgress, sal_Bool bPrvChrIsSpc ) { - static OUString sMeta(RTL_CONSTASCII_USTRINGPARAM("Meta")); // FIXME + static OUString sMeta(RTL_CONSTASCII_USTRINGPARAM("InContentMetadata")); sal_Bool bPrevCharIsSpace = bPrvChrIsSpc; while( rTextEnum->hasMoreElements() ) @@ -2305,7 +2308,8 @@ void XMLTextParagraphExport::exportTextRangeEnumeration( } } - DBG_ASSERT( !bOpenRuby, "Red Alert: Ruby still open!" ); +// now that there are nested enumerations for meta(-field), this may be valid! +// DBG_ASSERT( !bOpenRuby, "Red Alert: Ruby still open!" ); } void XMLTextParagraphExport::exportTable( @@ -2326,21 +2330,29 @@ void XMLTextParagraphExport::exportTextField( DBG_ASSERT( xTxtFld.is(), "text field missing" ); if( xTxtFld.is() ) { - if( bAutoStyles ) - { - pFieldExport->ExportFieldAutoStyle( xTxtFld, bIsProgress ); - } - else - { - pFieldExport->ExportField( xTxtFld, bIsProgress ); - } + exportTextField(xTxtFld, bAutoStyles, bIsProgress, sal_True); } else { // write only characters GetExport().Characters(rTextRange->getString()); } + } +} +void XMLTextParagraphExport::exportTextField( + const Reference < XTextField > & xTextField, + const sal_Bool bAutoStyles, const sal_Bool bIsProgress, + const sal_Bool bRecursive ) +{ + if ( bAutoStyles ) + { + pFieldExport->ExportFieldAutoStyle( xTextField, bIsProgress, + bRecursive ); + } + else + { + pFieldExport->ExportField( xTextField, bIsProgress ); } } @@ -2385,9 +2397,12 @@ void XMLTextParagraphExport::exportTextMark( nElement = *(sal_Bool *)rPropSet->getPropertyValue(sIsStart).getValue() ? 1 : 2; } - // bookmark, bookmark-start: xml:id for RDF metadata + // bookmark, bookmark-start: xml:id and RDFa for RDF metadata if( nElement < 2 ) { GetExport().AddAttributeXmlId(xName); + const uno::Reference<text::XTextContent> xTextContent( + xName, uno::UNO_QUERY_THROW); + GetExport().AddAttributesRDFa(xTextContent); } // export element @@ -3664,11 +3679,12 @@ void XMLTextParagraphExport::exportRuby( } } -// FIXME: this is untested void XMLTextParagraphExport::exportMeta( - const Reference<XPropertySet> & i_xMeta, + const Reference<XPropertySet> & i_xPortion, sal_Bool i_bAutoStyles, sal_Bool i_isProgress) { + static OUString sMeta(RTL_CONSTASCII_USTRINGPARAM("InContentMetadata")); + bool doExport(!i_bAutoStyles); // do not export element if autostyles // check version >= 1.2 switch (GetExport().getDefaultVersion()) { @@ -3677,13 +3693,14 @@ void XMLTextParagraphExport::exportMeta( default: break; } - const Reference < XEnumerationAccess > xEA( i_xMeta, UNO_QUERY_THROW ); - const Reference < XEnumeration > xTextEnum( xEA->createEnumeration() ); + const Reference< XTextContent > xTextContent( + i_xPortion->getPropertyValue(sMeta), UNO_QUERY_THROW); + const Reference< XEnumerationAccess > xEA( xTextContent, UNO_QUERY_THROW ); + const Reference< XEnumeration > xTextEnum( xEA->createEnumeration() ); if (doExport) { - const Reference<rdf::XMetadatable> xMeta( i_xMeta, UNO_QUERY_THROW ); - const Reference<XTextContent> xTextContent( i_xMeta, UNO_QUERY_THROW ); + const Reference<rdf::XMetadatable> xMeta(xTextContent, UNO_QUERY_THROW); // text:meta with neither xml:id nor RDFa is invalid xMeta->ensureMetadataReference(); diff --git a/xmloff/source/text/txtparai.cxx b/xmloff/source/text/txtparai.cxx index 6fb213f43642..dda2c3d49030 100644 --- a/xmloff/source/text/txtparai.cxx +++ b/xmloff/source/text/txtparai.cxx @@ -190,6 +190,11 @@ public: const OUString& rLocalName, XMLHints_Impl& rHnts, const Reference<xml::sax::XAttributeList> & xAttrList); + + static sal_Bool FindName( + SvXMLImport& rImport, + const Reference<xml::sax::XAttributeList> & xAttrList, + OUString& rName); }; TYPEINIT1( XMLStartReferenceContext_Impl, SvXMLImportContext ); @@ -203,11 +208,8 @@ XMLStartReferenceContext_Impl::XMLStartReferenceContext_Impl( SvXMLImportContext(rImport, nPrefix, rLocalName) { OUString sName; - OUString dummy; - // borrow FindName from XMLTextMarkImportContext, where bookmarks - // and point references are handled. - if (XMLTextMarkImportContext::FindName(GetImport(), xAttrList, sName, dummy)) + if (FindName(GetImport(), xAttrList, sName)) { XMLHint_Impl* pHint = new XMLReferenceHint_Impl( sName, rImport.GetTextImport()->GetCursor()->getStart() ); @@ -219,6 +221,33 @@ XMLStartReferenceContext_Impl::XMLStartReferenceContext_Impl( } } +sal_Bool XMLStartReferenceContext_Impl::FindName( + SvXMLImport& rImport, + const Reference<xml::sax::XAttributeList> & xAttrList, + OUString& rName) +{ + sal_Bool bNameOK( sal_False ); + + // find name attribute first + const sal_Int16 nLength( xAttrList->getLength() ); + for (sal_Int16 nAttr = 0; nAttr < nLength; nAttr++) + { + OUString sLocalName; + const sal_uInt16 nPrefix = rImport.GetNamespaceMap(). + GetKeyByAttrName( xAttrList->getNameByIndex(nAttr), + &sLocalName ); + + if ( (XML_NAMESPACE_TEXT == nPrefix) && + IsXMLToken(sLocalName, XML_NAME) ) + { + rName = xAttrList->getValueByIndex(nAttr); + bNameOK = sal_True; + } + } + + return bNameOK; +} + // --------------------------------------------------------------------- /** import end of reference (<text:reference-end>) */ @@ -247,10 +276,9 @@ XMLEndReferenceContext_Impl::XMLEndReferenceContext_Impl( SvXMLImportContext(rImport, nPrefix, rLocalName) { OUString sName; - OUString dummy; - // borrow from XMLTextMarkImportContext - if (XMLTextMarkImportContext::FindName(GetImport(), xAttrList, sName, dummy)) + // borrow from XMLStartReferenceContext_Impl + if (XMLStartReferenceContext_Impl::FindName(GetImport(), xAttrList, sName)) { // search for reference start sal_uInt16 nCount = rHints.Count(); @@ -511,9 +539,44 @@ void XMLImpRubyBaseContext_Impl::Characters( const OUString& rChars ) // --------------------------------------------------------------------- +class XMLImpRubyContext_Impl : public SvXMLImportContext +{ + XMLHints_Impl& rHints; + + sal_Bool& rIgnoreLeadingSpace; + + Reference < XTextRange > m_xStart; + OUString m_sStyleName; + OUString m_sTextStyleName; + OUString m_sText; + +public: + + TYPEINFO(); + + XMLImpRubyContext_Impl( + SvXMLImport& rImport, + sal_uInt16 nPrfx, + const OUString& rLName, + const Reference< xml::sax::XAttributeList > & xAttrList, + XMLHints_Impl& rHnts, + sal_Bool& rIgnLeadSpace ); + + virtual ~XMLImpRubyContext_Impl(); + + virtual SvXMLImportContext *CreateChildContext( + sal_uInt16 nPrefix, const OUString& rLocalName, + const Reference< xml::sax::XAttributeList > & xAttrList ); + + void SetTextStyleName( const OUString& s ) { m_sTextStyleName = s; } + void AppendText( const OUString& s ) { m_sText += s; } +}; + +// --------------------------------------------------------------------- + class XMLImpRubyTextContext_Impl : public SvXMLImportContext { - XMLRubyHint_Impl *pHint; + XMLImpRubyContext_Impl & m_rRubyContext; public: @@ -524,7 +587,7 @@ public: sal_uInt16 nPrfx, const OUString& rLName, const Reference< xml::sax::XAttributeList > & xAttrList, - XMLRubyHint_Impl *pHint ); + XMLImpRubyContext_Impl & rParent ); virtual ~XMLImpRubyTextContext_Impl(); @@ -538,9 +601,9 @@ XMLImpRubyTextContext_Impl::XMLImpRubyTextContext_Impl( sal_uInt16 nPrfx, const OUString& rLName, const Reference< xml::sax::XAttributeList > & xAttrList, - XMLRubyHint_Impl *pHt ) : - SvXMLImportContext( rImport, nPrfx, rLName ), - pHint( pHt ) + XMLImpRubyContext_Impl & rParent ) + : SvXMLImportContext( rImport, nPrfx, rLName ) + , m_rRubyContext( rParent ) { sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; for( sal_Int16 i=0; i < nAttrCount; i++ ) @@ -555,7 +618,7 @@ XMLImpRubyTextContext_Impl::XMLImpRubyTextContext_Impl( if( XML_NAMESPACE_TEXT == nPrefix && IsXMLToken( aLocalName, XML_STYLE_NAME ) ) { - pHint->SetTextStyleName( rValue ); + m_rRubyContext.SetTextStyleName( rValue ); break; } } @@ -567,37 +630,11 @@ XMLImpRubyTextContext_Impl::~XMLImpRubyTextContext_Impl() void XMLImpRubyTextContext_Impl::Characters( const OUString& rChars ) { - pHint->AppendText( rChars ); + m_rRubyContext.AppendText( rChars ); } // --------------------------------------------------------------------- -class XMLImpRubyContext_Impl : public SvXMLImportContext -{ - XMLHints_Impl& rHints; - XMLRubyHint_Impl *pHint; - - sal_Bool& rIgnoreLeadingSpace; - -public: - - TYPEINFO(); - - XMLImpRubyContext_Impl( - SvXMLImport& rImport, - sal_uInt16 nPrfx, - const OUString& rLName, - const Reference< xml::sax::XAttributeList > & xAttrList, - XMLHints_Impl& rHnts, - sal_Bool& rIgnLeadSpace ); - - virtual ~XMLImpRubyContext_Impl(); - - virtual SvXMLImportContext *CreateChildContext( - sal_uInt16 nPrefix, const OUString& rLocalName, - const Reference< xml::sax::XAttributeList > & xAttrList ); -}; - TYPEINIT1( XMLImpRubyContext_Impl, SvXMLImportContext ); XMLImpRubyContext_Impl::XMLImpRubyContext_Impl( @@ -609,9 +646,8 @@ XMLImpRubyContext_Impl::XMLImpRubyContext_Impl( sal_Bool& rIgnLeadSpace ) : SvXMLImportContext( rImport, nPrfx, rLName ), rHints( rHnts ), - pHint( new XMLRubyHint_Impl( - GetImport().GetTextImport()->GetCursorAsRange()->getStart() ) ), rIgnoreLeadingSpace( rIgnLeadSpace ) + , m_xStart( GetImport().GetTextImport()->GetCursorAsRange()->getStart() ) { sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; for( sal_Int16 i=0; i < nAttrCount; i++ ) @@ -626,18 +662,22 @@ XMLImpRubyContext_Impl::XMLImpRubyContext_Impl( if( XML_NAMESPACE_TEXT == nPrefix && IsXMLToken( aLocalName, XML_STYLE_NAME ) ) { - pHint->SetStyleName( rValue ); + m_sStyleName = rValue; break; } } - rHints.Insert( pHint, rHints.Count() ); } XMLImpRubyContext_Impl::~XMLImpRubyContext_Impl() { - if( pHint ) - pHint->SetEnd( GetImport().GetTextImport() - ->GetCursorAsRange()->getStart() ); + const UniReference < XMLTextImportHelper > xTextImport( + GetImport().GetTextImport()); + const Reference < XTextCursor > xAttrCursor( + xTextImport->GetText()->createTextCursorByRange( m_xStart )); + xAttrCursor->gotoRange(xTextImport->GetCursorAsRange()->getStart(), + sal_True); + xTextImport->SetRuby( GetImport(), xAttrCursor, + m_sStyleName, m_sTextStyleName, m_sText ); } SvXMLImportContext *XMLImpRubyContext_Impl::CreateChildContext( @@ -657,7 +697,7 @@ SvXMLImportContext *XMLImpRubyContext_Impl::CreateChildContext( pContext = new XMLImpRubyTextContext_Impl( GetImport(), nPrefix, rLocalName, xAttrList, - pHint ); + *this ); else pContext = new SvXMLImportContext( GetImport(), nPrefix, rLocalName ); @@ -672,7 +712,6 @@ SvXMLImportContext *XMLImpRubyContext_Impl::CreateChildContext( // --------------------------------------------------------------------- /** for text:meta and text:meta-field -//FIXME not tested */ class XMLMetaImportContextBase : public SvXMLImportContext { @@ -691,19 +730,21 @@ public: XMLMetaImportContextBase( SvXMLImport& i_rImport, - sal_uInt16 i_nPrefix, + const sal_uInt16 i_nPrefix, const OUString& i_rLocalName, - const Reference< xml::sax::XAttributeList > & i_xAttrList, XMLHints_Impl& i_rHints, sal_Bool & i_rIgnoreLeadingSpace ); virtual ~XMLMetaImportContextBase(); + virtual void StartElement( + const Reference<xml::sax::XAttributeList> & i_xAttrList); + virtual void EndElement(); virtual SvXMLImportContext *CreateChildContext( sal_uInt16 i_nPrefix, const OUString& i_rLocalName, - const Reference< xml::sax::XAttributeList > & i_xAttrList ); + const Reference< xml::sax::XAttributeList > & i_xAttrList); virtual void Characters( const OUString& i_rChars ); @@ -718,33 +759,36 @@ TYPEINIT1( XMLMetaImportContextBase, SvXMLImportContext ); XMLMetaImportContextBase::XMLMetaImportContextBase( SvXMLImport& i_rImport, - sal_uInt16 i_nPrefix, + const sal_uInt16 i_nPrefix, const OUString& i_rLocalName, - const Reference< xml::sax::XAttributeList > & i_xAttrList, XMLHints_Impl& i_rHints, sal_Bool & i_rIgnoreLeadingSpace ) : SvXMLImportContext( i_rImport, i_nPrefix, i_rLocalName ) , m_rHints( i_rHints ) , m_rIgnoreLeadingSpace( i_rIgnoreLeadingSpace ) - , m_xStart() + , m_xStart( GetImport().GetTextImport()->GetCursorAsRange()->getStart() ) +{ +} + +XMLMetaImportContextBase::~XMLMetaImportContextBase() +{ +} + +void XMLMetaImportContextBase::StartElement( + const Reference<xml::sax::XAttributeList> & i_xAttrList) { const sal_Int16 nAttrCount(i_xAttrList.is() ? i_xAttrList->getLength() : 0); - for ( sal_Int16 i=0; i < nAttrCount; i++ ) + for ( sal_Int16 i = 0; i < nAttrCount; ++i ) { const OUString& rAttrName( i_xAttrList->getNameByIndex( i ) ); const OUString& rValue( i_xAttrList->getValueByIndex( i ) ); OUString sLocalName; - sal_uInt16 nPrefix = + const sal_uInt16 nPrefix( GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName, - &sLocalName ); + &sLocalName )); ProcessAttribute(nPrefix, sLocalName, rValue); } - m_xStart = GetImport().GetTextImport()->GetCursorAsRange()->getStart(); -} - -XMLMetaImportContextBase::~XMLMetaImportContextBase() -{ } void XMLMetaImportContextBase::EndElement() @@ -764,41 +808,15 @@ void XMLMetaImportContextBase::EndElement() const Reference<XTextRange> xInsertionRange(xInsertionCursor, UNO_QUERY); InsertMeta(xInsertionRange); -//FIXME -#if 0 - Reference<XMultiServiceFactory> xFactory(rImport.GetModel(), UNO_QUERY); - if ( xFactory.is() ) - { - Reference<XInterface> xIfc = xFactory->createInstance(sServiceName); - - // xml:id for RDF metadata - rImport.SetXmlId(xIfc, i_rXmlId); - - // cast to XTextContent and attach to document - Reference<XTextContent> xTextContent(xIfc, UNO_QUERY); - if (xTextContent.is()) - { - try - { - rImport.GetTextImport()->GetText()->insertTextContent( - xInsertionRange, xTextContent, sal_True); - } - catch (com::sun::star::lang::IllegalArgumentException &) - { - OSL_ENSURE(false, "XMLMetaImportContext::EndElement: iae"); - } - } - } -#endif } SvXMLImportContext * XMLMetaImportContextBase::CreateChildContext( sal_uInt16 i_nPrefix, const OUString& i_rLocalName, const Reference< xml::sax::XAttributeList > & i_xAttrList ) { - const SvXMLTokenMap& rTokenMap = - GetImport().GetTextImport()->GetTextPElemTokenMap(); - sal_uInt16 nToken = rTokenMap.Get( i_nPrefix, i_rLocalName ); + const SvXMLTokenMap& rTokenMap( + GetImport().GetTextImport()->GetTextPElemTokenMap() ); + const sal_uInt16 nToken( rTokenMap.Get( i_nPrefix, i_rLocalName ) ); return XMLImpSpanContext_Impl::CreateChildContext( GetImport(), i_nPrefix, i_rLocalName, i_xAttrList, nToken, m_rHints, m_rIgnoreLeadingSpace ); @@ -812,8 +830,7 @@ void XMLMetaImportContextBase::Characters( const OUString& i_rChars ) void XMLMetaImportContextBase::ProcessAttribute(sal_uInt16 const i_nPrefix, OUString const & i_rLocalName, OUString const & i_rValue) { - if ( (XML_NAMESPACE_XML == i_nPrefix) && - IsXMLToken(i_rLocalName, XML_ID) ) + if ( (XML_NAMESPACE_XML == i_nPrefix) && IsXMLToken(i_rLocalName, XML_ID) ) { m_XmlId = i_rValue; } @@ -822,9 +839,7 @@ void XMLMetaImportContextBase::ProcessAttribute(sal_uInt16 const i_nPrefix, // --------------------------------------------------------------------- -/** text:meta -//FIXME not tested - */ +/** text:meta */ class XMLMetaImportContext : public XMLMetaImportContextBase { // RDFa @@ -839,9 +854,8 @@ public: XMLMetaImportContext( SvXMLImport& i_rImport, - sal_uInt16 i_nPrefix, + const sal_uInt16 i_nPrefix, const OUString& i_rLocalName, - const Reference< xml::sax::XAttributeList > & i_xAttrList, XMLHints_Impl& i_rHints, sal_Bool & i_rIgnoreLeadingSpace ); @@ -855,13 +869,12 @@ TYPEINIT1( XMLMetaImportContext, XMLMetaImportContextBase ); XMLMetaImportContext::XMLMetaImportContext( SvXMLImport& i_rImport, - sal_uInt16 i_nPrefix, + const sal_uInt16 i_nPrefix, const OUString& i_rLocalName, - const Reference< xml::sax::XAttributeList > & i_xAttrList, XMLHints_Impl& i_rHints, sal_Bool & i_rIgnoreLeadingSpace ) : XMLMetaImportContextBase( i_rImport, i_nPrefix, i_rLocalName, - i_xAttrList, i_rHints, i_rIgnoreLeadingSpace ) + i_rHints, i_rIgnoreLeadingSpace ) , m_bHaveAbout(false) { } @@ -929,9 +942,7 @@ void XMLMetaImportContext::InsertMeta( // --------------------------------------------------------------------- -/** text:meta-field -//FIXME not tested - */ +/** text:meta-field */ class XMLMetaFieldImportContext : public XMLMetaImportContextBase { OUString m_DataStyleName; @@ -941,9 +952,8 @@ public: XMLMetaFieldImportContext( SvXMLImport& i_rImport, - sal_uInt16 i_nPrefix, + const sal_uInt16 i_nPrefix, const OUString& i_rLocalName, - const Reference< xml::sax::XAttributeList > & i_xAttrList, XMLHints_Impl& i_rHints, sal_Bool & i_rIgnoreLeadingSpace ); @@ -957,21 +967,20 @@ TYPEINIT1( XMLMetaFieldImportContext, XMLMetaImportContextBase ); XMLMetaFieldImportContext::XMLMetaFieldImportContext( SvXMLImport& i_rImport, - sal_uInt16 i_nPrefix, + const sal_uInt16 i_nPrefix, const OUString& i_rLocalName, - const Reference< xml::sax::XAttributeList > & i_xAttrList, XMLHints_Impl& i_rHints, sal_Bool & i_rIgnoreLeadingSpace ) : XMLMetaImportContextBase( i_rImport, i_nPrefix, i_rLocalName, - i_xAttrList, i_rHints, i_rIgnoreLeadingSpace ) + i_rHints, i_rIgnoreLeadingSpace ) { } void XMLMetaFieldImportContext::ProcessAttribute(sal_uInt16 const i_nPrefix, OUString const & i_rLocalName, OUString const & i_rValue) { - if( XML_NAMESPACE_STYLE == i_nPrefix && - IsXMLToken( i_rLocalName, XML_DATA_STYLE_NAME ) ) + if ( XML_NAMESPACE_STYLE == i_nPrefix && + IsXMLToken( i_rLocalName, XML_DATA_STYLE_NAME ) ) { m_DataStyleName = i_rValue; } @@ -1811,18 +1820,15 @@ SvXMLImportContext *XMLImpSpanContext_Impl::CreateChildContext( sal_False); break; -// FIXME: should test before enabling... -#if 0 case XML_TOK_TEXT_META: pContext = new XMLMetaImportContext(rImport, nPrefix, rLocalName, - xAttrList, rHints, rIgnoreLeadingSpace ); + rHints, rIgnoreLeadingSpace ); break; case XML_TOK_TEXT_META_FIELD: pContext = new XMLMetaFieldImportContext(rImport, nPrefix, rLocalName, - xAttrList, rHints, rIgnoreLeadingSpace ); + rHints, rIgnoreLeadingSpace ); break; -#endif default: // none of the above? then it's probably a text field! @@ -2190,17 +2196,6 @@ XMLParaContext::~XMLParaContext() pHHint->GetEventsContext() ); } break; - case XML_HINT_RUBY: - { - const XMLRubyHint_Impl *pRHint = - (const XMLRubyHint_Impl *)pHint; - xTxtImport->SetRuby( GetImport(), - xAttrCursor, - pRHint->GetStyleName(), - pRHint->GetTextStyleName(), - pRHint->GetText() ); - } - break; case XML_HINT_INDEX_MARK: { Reference<beans::XPropertySet> xMark( @@ -2341,7 +2336,6 @@ XMLNumberedParaContext::XMLNumberedParaContext( m_xNumRules() { ::rtl::OUString StyleName; - bool ContinuteNumbering(false); const SvXMLTokenMap& rTokenMap( i_rImport.GetTextImport()->GetTextNumberedParagraphAttrTokenMap() ); @@ -2378,8 +2372,8 @@ XMLNumberedParaContext::XMLNumberedParaContext( StyleName = rValue; break; case XML_TOK_TEXT_NUMBERED_PARAGRAPH_CONTINUE_NUMBERING: - ContinuteNumbering = IsXMLToken(rValue, XML_TRUE); -// ??? what in Fred's name is this supposed to do? + // this attribute is deprecated +// ContinuteNumbering = IsXMLToken(rValue, XML_TRUE); break; case XML_TOK_TEXT_NUMBERED_PARAGRAPH_START_VALUE: { diff --git a/xmloff/source/text/txtparaimphint.hxx b/xmloff/source/text/txtparaimphint.hxx index 2012764e38b7..f3c8da0bcf03 100644 --- a/xmloff/source/text/txtparaimphint.hxx +++ b/xmloff/source/text/txtparaimphint.hxx @@ -49,7 +49,6 @@ using namespace ::xmloff::token; #define XML_HINT_STYLE 1 #define XML_HINT_REFERENCE 2 #define XML_HINT_HYPERLINK 3 -#define XML_HINT_RUBY 4 #define XML_HINT_INDEX_MARK 5 #define XML_HINT_TEXT_FRAME 6 // --> DVO, OD 2004-07-14 #i26791# @@ -209,28 +208,6 @@ public: const OUString& GetID() const { return sID; } }; -class XMLRubyHint_Impl : public XMLHint_Impl -{ - OUString sStyleName; - OUString sTextStyleName; - OUString sText; - -public: - - XMLRubyHint_Impl( const Reference < XTextRange > & rPos ) : - XMLHint_Impl( XML_HINT_RUBY, rPos, rPos ) - { - } - - virtual ~XMLRubyHint_Impl() {} - - void SetStyleName( const OUString& s ) { sStyleName = s; } - const OUString& GetStyleName() const { return sStyleName; } - void SetTextStyleName( const OUString& s ) { sTextStyleName = s; } - const OUString& GetTextStyleName() const { return sTextStyleName; } - void AppendText( const OUString& s ) { sText += s; } - const OUString& GetText() const { return sText; } -}; class XMLTextFrameHint_Impl : public XMLHint_Impl { |