summaryrefslogtreecommitdiff
path: root/filter/source/svg
diff options
context:
space:
mode:
authorMarco Cecchetti <mrcekets@gmail.com>2012-08-15 22:32:42 +0200
committerThorsten Behrens <tbehrens@suse.com>2012-10-10 12:03:28 +0200
commitdd188c470acbd6151b4ed6b71b194ed0bb3c2685 (patch)
tree7a3c3a72807e86befed41bf059ba07e62af21e41 /filter/source/svg
parentb76628acb1ae4fc06f8c1b70ec2e0cf39356deef (diff)
Now MasterPage text fields work, list items are detected correctly, some effect work on text.
Date/Time, Footer and Page Number text fields are displayed correctly again. Fixed several bugs related to synchronization of the two iterations on both meta comment actions and text paragraphs/text portions enumerations. At present list items inside a table or an OLE object are not exported correctly. Enabled support for animating text paragraph. Both entrance and exit effects work on text shapes, on the contrary there is not yet support for emphasis effects such as changing font color and font properties. At present it is possible to apply an effect to the whole paragraph only, no support is provided for by word or by character effect variants. Another weak point of current implementation is that if you try to select a fragment of a text shape and in your selection is included an animatable paragraph the selection is not correct.
Diffstat (limited to 'filter/source/svg')
-rw-r--r--filter/source/svg/presentation_engine.js243
-rw-r--r--filter/source/svg/svgexport.cxx312
-rw-r--r--filter/source/svg/svgwriter.cxx392
-rw-r--r--filter/source/svg/svgwriter.hxx6
4 files changed, 665 insertions, 288 deletions
diff --git a/filter/source/svg/presentation_engine.js b/filter/source/svg/presentation_engine.js
index 186ef95f59bf..27075cdff291 100644
--- a/filter/source/svg/presentation_engine.js
+++ b/filter/source/svg/presentation_engine.js
@@ -1098,6 +1098,7 @@ var aPresentationClipPathId = 'presentation_clip_path';
var aOOOAttrNumberOfSlides = 'number-of-slides';
var aOOOAttrStartSlideNumber= 'start-slide-number';
var aOOOAttrNumberingType = 'page-numbering-type';
+var aOOOAttrListItemNumberingType= 'numbering-type';
var aOOOAttrSlide = 'slide';
var aOOOAttrMaster = 'master';
@@ -5708,6 +5709,7 @@ function AnimationBaseNode( aAnimElem, aParentNode, aNodeContext )
this.sClassName = 'AnimationBaseNode';
this.bIsContainer = false;
this.aTargetElement = null;
+ this.bIsTargetTextElement = false
this.aAnimatedElement = null;
this.aActivity = null;
@@ -5736,6 +5738,10 @@ AnimationBaseNode.prototype.parseElement = function()
log( 'AnimationBaseNode.parseElement: target element not found: ' + sTargetElementAttr );
}
+ // sub-item attribute for text animated element
+ var sSubItemAttr = aAnimElem.getAttribute( 'sub-item' );
+ this.bIsTargetTextElement = ( sSubItemAttr && ( sSubItemAttr === 'text' ) );
+
// additive attribute
var sAdditiveAttr = aAnimElem.getAttribute( 'additive' );
if( sAdditiveAttr && aAddittiveModeInMap[sAdditiveAttr] )
@@ -5765,8 +5771,16 @@ AnimationBaseNode.prototype.parseElement = function()
// create animated element
if( !this.aNodeContext.aAnimatedElementMap[ sTargetElementAttr ] )
{
- this.aNodeContext.aAnimatedElementMap[ sTargetElementAttr ]
+ if( this.bIsTargetTextElement )
+ {
+ this.aNodeContext.aAnimatedElementMap[ sTargetElementAttr ]
+ = new AnimatedTextElement( this.aTargetElement );
+ }
+ else
+ {
+ this.aNodeContext.aAnimatedElementMap[ sTargetElementAttr ]
= new AnimatedElement( this.aTargetElement );
+ }
}
this.aAnimatedElement = this.aNodeContext.aAnimatedElementMap[ sTargetElementAttr ];
@@ -7414,6 +7428,7 @@ ClippingAnimation.prototype.end = function()
{
this.aAnimatableElement.cleanClipPath();
this.bAnimationStarted = false;
+ this.aAnimatableElement.notifyAnimationEnd();
}
};
@@ -7468,7 +7483,10 @@ GenericAnimation.prototype.start = function( aAnimatableElement )
GenericAnimation.prototype.end = function()
{
if( this.bAnimationStarted )
+ {
this.bAnimationStarted = false;
+ this.aAnimatableElement.notifyAnimationEnd();
+ }
};
GenericAnimation.prototype.perform = function( aValue )
@@ -9203,6 +9221,229 @@ AnimatedElement.prototype.DBG = function( sMessage, nTime )
aAnimatedElementDebugPrinter.print( 'AnimatedElement(' + this.getId() + ')' + sMessage, nTime );
};
+// ------------------------------------------------------------------------------------------ //
+function AnimatedTextElement( aElement )
+{
+ var theDocument = document;
+
+ var sTextType = aElement.getAttribute( 'class' );
+ var bIsListItem = ( sTextType === 'ListItem' );
+ if( ( sTextType !== 'TextParagraph' ) && !bIsListItem )
+ {
+ log( 'AnimatedTextElement: passed element is not a paragraph.' );
+ return;
+ }
+ var aTextShapeElement = aElement.parentNode;
+ sTextType = aTextShapeElement.getAttribute( 'class' );
+ if( sTextType !== 'TextShape' )
+ {
+ log( 'AnimatedTextElement: element parent is not a text shape.' );
+ return;
+ }
+ var aTextShapeGroup = aTextShapeElement.parentNode;
+ // We search for the helper group element used for inserting
+ // the element copy to be animated; if it doesn't exist we create it.
+ var aAnimatedElementGroup = getElementByClassName( aTextShapeGroup, 'AnimatedElements' );
+ if( !aAnimatedElementGroup )
+ {
+ aAnimatedElementGroup = theDocument.createElementNS( NSS['svg'], 'g' );
+ aAnimatedElementGroup.setAttribute( 'class', 'AnimatedElements' );
+ aTextShapeGroup.appendChild( aAnimatedElementGroup );
+ }
+
+ // Create element used on animating
+ var aAnimatableElement = theDocument.createElementNS( NSS['svg'], 'g' );
+ var aTextElement = theDocument.createElementNS( NSS['svg'], 'text' );
+ // Clone paragraph element <tspan>
+ var aParagraphElement = aElement.cloneNode( true );
+
+ // In case we are dealing with a list item that utilizes a bullet char
+ // we need to clone the related bullet char too.
+ var aBulletCharClone = null;
+ var aBulletCharElem = null;
+ var bIsBulletCharStyle =
+ ( aElement.getAttributeNS( NSS['ooo'], aOOOAttrListItemNumberingType ) === 'bullet-style' );
+ if( bIsBulletCharStyle )
+ {
+ var aBulletCharGroupElem = getElementByClassName( aTextShapeGroup, 'BulletChars' );
+ if( aBulletCharGroupElem )
+ {
+ var aBulletPlaceholderElem = getElementByClassName( aElement.firstElementChild, 'BulletPlaceholder' );
+ if( aBulletPlaceholderElem )
+ {
+ var sId = aBulletPlaceholderElem.getAttribute( 'id' );
+ sId = 'bullet-char(' + sId + ')';
+ aBulletCharElem = theDocument.getElementById( sId );
+ if( aBulletCharElem )
+ {
+ aBulletCharClone = aBulletCharElem.cloneNode( true );
+ }
+ else
+ {
+ log( 'AnimatedTextElement: ' + sId + ' not found.' );
+ }
+ }
+ else
+ {
+ log( 'AnimatedTextElement: no bullet placeholder found' );
+ }
+ }
+ else
+ {
+ log( 'AnimatedTextElement: no bullet char group found' );
+ }
+ }
+
+ var aBitmapElemSet = new Array();
+ var aBitmapCloneSet = new Array();
+ var aBitmapPlaceholderSet = getElementsByClassName( aElement, 'BitmapPlaceholder' );
+ if( aBitmapPlaceholderSet )
+ {
+ var i;
+ for( i = 0; i < aBitmapPlaceholderSet.length; ++i )
+ {
+ sId = aBitmapPlaceholderSet[i].getAttribute( 'id' );
+ var sBitmapChecksum = sId.substring( 'bitmap-placeholder'.length + 1, sId.length - 1 );
+ sId = 'embedded-bitmap(' + sBitmapChecksum + ')';
+ aBitmapElemSet[i] = theDocument.getElementById( sId );
+ if( aBitmapElemSet[i] )
+ {
+ aBitmapCloneSet[i] = aBitmapElemSet[i].cloneNode( true );
+ }
+ else
+ {
+ log( 'AnimatedTextElement: ' + sId + ' not found.' );
+ }
+ }
+ }
+
+
+ // Change clone element id.
+ this.sParagraphId = sId = aParagraphElement.getAttribute( 'id' );
+ aParagraphElement.setAttribute( 'id', sId +'.a' );
+ if( aBulletCharClone )
+ aBulletCharClone.removeAttribute( 'id' );
+ for( i = 0; i < aBitmapCloneSet.length; ++i )
+ {
+ if( aBitmapCloneSet[i] )
+ aBitmapCloneSet[i].removeAttribute( 'id' );
+ }
+
+ // Hide original text paragraph.
+ var sVisibilityAttr = aElement.getAttribute( 'visibility' );
+ if( sVisibilityAttr === 'hidden' )
+ {
+ aAnimatableElement.setAttribute( 'visibility', 'hidden' );
+ this.eInitialVisibility = HIDDEN;
+ }
+ else
+ {
+ aElement.setAttribute( 'visibility', 'hidden' );
+ this.eInitialVisibility = VISIBLE;
+ }
+ aParagraphElement.setAttribute( 'visibility', 'inherit' );
+ if( aBulletCharClone )
+ aBulletCharClone.setAttribute( 'visibility', 'inherit' );
+ if( aBulletCharElem )
+ aBulletCharElem.setAttribute( 'visibility', 'hidden' );
+ for( i = 0; i < aBitmapCloneSet.length; ++i )
+ {
+ if( aBitmapElemSet[i] )
+ aBitmapElemSet[i].setAttribute( 'visibility', 'hidden' );
+ if( aBitmapCloneSet[i] )
+ aBitmapCloneSet[i].setAttribute( 'visibility', 'inherit' );
+ }
+
+
+ // Append each element to its parent.
+ // <g class='AnimatedElements'>
+ // <g>
+ // <text>
+ // <tspan class='TextParagraph'> ... </tspan>
+ // </text>
+ // [<g class='BulletChar'>...</g>]
+ // [<g class='EmbeddedBitmap'>...</g>]
+ // .
+ // .
+ // [<g class='EmbeddedBitmap'>...</g>]
+ // </g>
+ // </g>
+
+ aTextElement.appendChild( aParagraphElement );
+ aAnimatableElement.appendChild( aTextElement );
+ if( aBulletCharClone )
+ aAnimatableElement.appendChild( aBulletCharClone );
+ for( i = 0; i < aBitmapCloneSet.length; ++i )
+ {
+ if( aBitmapCloneSet[i] )
+ aAnimatableElement.appendChild( aBitmapCloneSet[i] );
+ }
+ aAnimatedElementGroup.appendChild( aAnimatableElement );
+
+ this.aParentTextElement = aElement.parentNode;
+ this.aParagraphElement = aElement;
+ this.aAnimatedElementGroup = aAnimatedElementGroup;
+ this.nRunningAnimations = 0;
+
+ AnimatedTextElement.superclass.constructor.call( this, aAnimatableElement );
+
+}
+extend( AnimatedTextElement, AnimatedElement );
+
+/*
+AnimatedTextElement.prototype.notifySlideStart = function()
+{
+ var aClone = this.aBaseElement.cloneNode( true );
+ this.aActiveElement.parentNode.replaceChild( aClone, this.aActiveElement );
+ this.aActiveElement = aClone;
+
+ var aAnimatedParagraphElement = this.aActiveElement.firstElementChild.firstElementChild;
+ if( aAnimatedParagraphElement )
+ {
+ var aParagraphElement = aAnimatedParagraphElement.cloneNode( true );
+ aParagraphElement.setAttribute( 'id', this.sParagraphId );
+ aParagraphElement.setAttribute( 'visibility', aVisibilityAttributeValue[ this.eInitialVisibility ] );
+ this.aParentTextElement.replaceChild( aParagraphElement, this.aParagraphElement );
+ this.aParagraphElement = aParagraphElement;
+ }
+ this.aActiveElement.setAttribute( 'visibility', 'hidden' );
+
+
+ this.initElement();
+ this.DBG( '.notifySlideStart invoked' );
+};
+
+AnimatedTextElement.prototype.notifyAnimationStart = function()
+{
+ log( 'AnimatedTextElement.notifyAnimationStart' );
+ if( this.nRunningAnimations === 0 )
+ {
+ this.aParagraphElement.setAttribute( 'visibility', 'hidden' );
+ this.aActiveElement.setAttribute( 'visibility', aVisibilityAttributeValue[ this.eInitialVisibility ] );
+ }
+ ++this.nRunningAnimations;
+};
+
+AnimatedTextElement.prototype.notifyAnimationEnd = function()
+{
+ log( 'AnimatedTextElement.notifyAnimationEnd' );
+ --this.nRunningAnimations;
+ if( this.nRunningAnimations === 0 )
+ {
+ var sVisibilityAttr = this.aActiveElement.getAttribute( 'visibility' );
+ var aAnimatedParagraphElement = this.aActiveElement.firstElementChild.firstElementChild;
+ if( aAnimatedParagraphElement )
+ {
+ var aParagraphElement = aAnimatedParagraphElement.cloneNode( true );
+ aParagraphElement.setAttribute( 'visibility', sVisibilityAttr );
+ aParagraphElement.setAttribute( 'id', this.sParagraphId );
+ this.aParentTextElement.replaceChild( aParagraphElement, this.aParagraphElement );
+ this.aParagraphElement = aParagraphElement;
+ }
+ this.aActiveElement.setAttribute( 'visibility', 'hidden' );
+ }
+};
+*/
// ------------------------------------------------------------------------------------------ //
diff --git a/filter/source/svg/svgexport.cxx b/filter/source/svg/svgexport.cxx
index ae2d6dc23403..038b2dbada10 100644
--- a/filter/source/svg/svgexport.cxx
+++ b/filter/source/svg/svgexport.cxx
@@ -1057,10 +1057,14 @@ sal_Bool SVGFilter::implGenerateMetaData()
sElemId += OUString::valueOf( i );
mpSVGExport->AddAttribute( XML_NAMESPACE_NONE, "id", sElemId );
aFieldSet[i]->elementExport( mpSVGExport );
-
- aFieldSet[i]->growCharSet( mTextFieldCharSets );
}
-
+ if( mpSVGExport->IsEmbedFonts() && mpSVGExport->IsUsePositionedCharacters() )
+ {
+ for( sal_Int32 i = 0, nSize = aFieldSet.size(); i < nSize; ++i )
+ {
+ aFieldSet[i]->growCharSet( mTextFieldCharSets );
+ }
+ }
}
// text fields are used only for generating meta info so we don't need them anymore
for( sal_uInt32 i = 0; i < aFieldSet.size(); ++i )
@@ -2018,170 +2022,184 @@ OUString SVGFilter::implGetInterfaceName( const Reference< XInterface >& rxIf )
IMPL_LINK( SVGFilter, CalcFieldHdl, EditFieldInfo*, pInfo )
{
- sal_Bool bFieldProcessed = sal_False;
+ sal_Bool bFieldProcessed = sal_False;
+
if( pInfo && mbPresentation )
{
bFieldProcessed = true;
OUString aRepresentation = B2UCONST("");
if( !mbSinglePage )
{
- // to notify to the SVGActionWriter::ImplWriteText method
- // that we are dealing with a placeholder shape
- aRepresentation = sPlaceholderTag;
-
- if( !mCreateOjectsCurrentMasterPage.is() )
+ if( mpSVGExport->IsEmbedFonts() && mpSVGExport->IsUsePositionedCharacters() )
{
- OSL_FAIL( "error: !mCreateOjectsCurrentMasterPage.is()" );
- return 0;
- }
- sal_Bool bHasCharSetMap = !( mTextFieldCharSets.find( mCreateOjectsCurrentMasterPage ) == mTextFieldCharSets.end() );
+ // to notify to the SVGActionWriter::ImplWriteText method
+ // that we are dealing with a placeholder shape
+ aRepresentation = sPlaceholderTag;
- static const ::rtl::OUString aHeaderId( B2UCONST( aOOOAttrHeaderField ) );
- static const ::rtl::OUString aFooterId( B2UCONST( aOOOAttrFooterField ) );
- static const ::rtl::OUString aDateTimeId( B2UCONST( aOOOAttrDateTimeField ) );
- static const ::rtl::OUString aVariableDateTimeId( B2UCONST( aOOOAttrDateTimeField ) + B2UCONST( "-variable" ) );
+ if( !mCreateOjectsCurrentMasterPage.is() )
+ {
+ OSL_FAIL( "error: !mCreateOjectsCurrentMasterPage.is()" );
+ return 0;
+ }
+ sal_Bool bHasCharSetMap = !( mTextFieldCharSets.find( mCreateOjectsCurrentMasterPage ) == mTextFieldCharSets.end() );
- const UCharSet * pCharSet = NULL;
- UCharSetMap * pCharSetMap = NULL;
- if( bHasCharSetMap )
- {
- pCharSetMap = &( mTextFieldCharSets[ mCreateOjectsCurrentMasterPage ] );
- }
- const SvxFieldData* pField = pInfo->GetField().GetField();
- if( bHasCharSetMap && ( pField->GetClassId() == text::textfield::Type::PRESENTATION_HEADER ) && ( pCharSetMap->find( aHeaderId ) != pCharSetMap->end() ) )
- {
- pCharSet = &( (*pCharSetMap)[ aHeaderId ] );
- }
- else if( bHasCharSetMap && ( pField->GetClassId() == text::textfield::Type::PRESENTATION_FOOTER ) && ( pCharSetMap->find( aFooterId ) != pCharSetMap->end() ) )
- {
- pCharSet = &( (*pCharSetMap)[ aFooterId ] );
- }
- else if( pField->GetClassId() == text::textfield::Type::PRESENTATION_DATE_TIME )
- {
- if( bHasCharSetMap && ( pCharSetMap->find( aDateTimeId ) != pCharSetMap->end() ) )
+ static const ::rtl::OUString aHeaderId( B2UCONST( aOOOAttrHeaderField ) );
+ static const ::rtl::OUString aFooterId( B2UCONST( aOOOAttrFooterField ) );
+ static const ::rtl::OUString aDateTimeId( B2UCONST( aOOOAttrDateTimeField ) );
+ static const ::rtl::OUString aVariableDateTimeId( B2UCONST( aOOOAttrDateTimeField ) + B2UCONST( "-variable" ) );
+
+ const UCharSet * pCharSet = NULL;
+ UCharSetMap * pCharSetMap = NULL;
+ if( bHasCharSetMap )
+ {
+ pCharSetMap = &( mTextFieldCharSets[ mCreateOjectsCurrentMasterPage ] );
+ }
+ const SvxFieldData* pField = pInfo->GetField().GetField();
+ if( bHasCharSetMap && ( pField->GetClassId() == text::textfield::Type::PRESENTATION_HEADER ) && ( pCharSetMap->find( aHeaderId ) != pCharSetMap->end() ) )
+ {
+ pCharSet = &( (*pCharSetMap)[ aHeaderId ] );
+ }
+ else if( bHasCharSetMap && ( pField->GetClassId() == text::textfield::Type::PRESENTATION_FOOTER ) && ( pCharSetMap->find( aFooterId ) != pCharSetMap->end() ) )
{
- pCharSet = &( (*pCharSetMap)[ aDateTimeId ] );
+ pCharSet = &( (*pCharSetMap)[ aFooterId ] );
}
- if( bHasCharSetMap && ( pCharSetMap->find( aVariableDateTimeId ) != pCharSetMap->end() ) && !(*pCharSetMap)[ aVariableDateTimeId ].empty() )
+ else if( pField->GetClassId() == text::textfield::Type::PRESENTATION_DATE_TIME )
{
- SvxDateFormat eDateFormat = SVXDATEFORMAT_B, eCurDateFormat;
- const UCharSet & aCharSet = (*pCharSetMap)[ aVariableDateTimeId ];
- UCharSet::const_iterator aChar = aCharSet.begin();
- // we look for the most verbose date format
- for( ; aChar != aCharSet.end(); ++aChar )
+ if( bHasCharSetMap && ( pCharSetMap->find( aDateTimeId ) != pCharSetMap->end() ) )
{
- eCurDateFormat = (SvxDateFormat)( (int)( *aChar ) & 0x0f );
- switch( eDateFormat )
+ pCharSet = &( (*pCharSetMap)[ aDateTimeId ] );
+ }
+ if( bHasCharSetMap && ( pCharSetMap->find( aVariableDateTimeId ) != pCharSetMap->end() ) && !(*pCharSetMap)[ aVariableDateTimeId ].empty() )
+ {
+ SvxDateFormat eDateFormat = SVXDATEFORMAT_B, eCurDateFormat;
+ const UCharSet & aCharSet = (*pCharSetMap)[ aVariableDateTimeId ];
+ UCharSet::const_iterator aChar = aCharSet.begin();
+ // we look for the most verbose date format
+ for( ; aChar != aCharSet.end(); ++aChar )
{
- case SVXDATEFORMAT_STDSMALL: ;
- case SVXDATEFORMAT_A: ; // 13.02.96
- case SVXDATEFORMAT_B: // 13.02.1996
- switch( eCurDateFormat )
- {
- case SVXDATEFORMAT_C: ; // 13.Feb 1996
- case SVXDATEFORMAT_D: // 13.February 1996
- case SVXDATEFORMAT_E: ; // Tue, 13.February 1996
- case SVXDATEFORMAT_STDBIG: ;
- case SVXDATEFORMAT_F: // Tuesday, 13.February 1996
- eDateFormat = eCurDateFormat;
- break;
- default:
- break;
- }
- case SVXDATEFORMAT_C: ; // 13.Feb 1996
- case SVXDATEFORMAT_D: // 13.February 1996
- switch( eCurDateFormat )
- {
- case SVXDATEFORMAT_E: ; // Tue, 13.February 1996
- case SVXDATEFORMAT_STDBIG: ;
- case SVXDATEFORMAT_F: // Tuesday, 13.February 1996
- eDateFormat = eCurDateFormat;
- break;
- default:
- break;
- }
- break;
- default:
- break;
+ eCurDateFormat = (SvxDateFormat)( (int)( *aChar ) & 0x0f );
+ switch( eDateFormat )
+ {
+ case SVXDATEFORMAT_STDSMALL: ;
+ case SVXDATEFORMAT_A: ; // 13.02.96
+ case SVXDATEFORMAT_B: // 13.02.1996
+ switch( eCurDateFormat )
+ {
+ case SVXDATEFORMAT_C: ; // 13.Feb 1996
+ case SVXDATEFORMAT_D: // 13.February 1996
+ case SVXDATEFORMAT_E: ; // Tue, 13.February 1996
+ case SVXDATEFORMAT_STDBIG: ;
+ case SVXDATEFORMAT_F: // Tuesday, 13.February 1996
+ eDateFormat = eCurDateFormat;
+ break;
+ default:
+ break;
+ }
+ case SVXDATEFORMAT_C: ; // 13.Feb 1996
+ case SVXDATEFORMAT_D: // 13.February 1996
+ switch( eCurDateFormat )
+ {
+ case SVXDATEFORMAT_E: ; // Tue, 13.February 1996
+ case SVXDATEFORMAT_STDBIG: ;
+ case SVXDATEFORMAT_F: // Tuesday, 13.February 1996
+ eDateFormat = eCurDateFormat;
+ break;
+ default:
+ break;
+ }
+ break;
+ default:
+ break;
+ }
}
- }
- // Independently of the date format, we always put all these characters by default.
- // They should be enough to cover every time format.
- aRepresentation += B2UCONST( "0123456789.:/-APM" );
+ // Independently of the date format, we always put all these characters by default.
+ // They should be enough to cover every time format.
+ aRepresentation += B2UCONST( "0123456789.:/-APM" );
- if( eDateFormat )
- {
- String sDate;
- LanguageType eLang = pInfo->GetOutliner()->GetLanguage( pInfo->GetPara(), pInfo->GetPos() );
- SvNumberFormatter * pNumberFormatter = new SvNumberFormatter( ::comphelper::getProcessServiceFactory(), LANGUAGE_SYSTEM );
- // We always collect the characters obtained by using the SVXDATEFORMAT_B (as: 13.02.1996)
- // so we are sure to include any unusual day|month|year separator.
- Date aDate( 1, 1, 1996 );
- sDate += SvxDateField::GetFormatted( aDate, SVXDATEFORMAT_B, *pNumberFormatter, eLang );
- switch( eDateFormat )
+ if( eDateFormat )
{
- case SVXDATEFORMAT_E: ; // Tue, 13.February 1996
- case SVXDATEFORMAT_STDBIG: ;
- case SVXDATEFORMAT_F: // Tuesday, 13.February 1996
- for( sal_uInt16 i = 1; i <= 7; ++i ) // we get all days in a week
- {
- aDate.SetDay( i );
- sDate += SvxDateField::GetFormatted( aDate, eDateFormat, *pNumberFormatter, eLang );
- }
- // No break here! We need months too!
- case SVXDATEFORMAT_C: ; // 13.Feb 1996
- case SVXDATEFORMAT_D: // 13.February 1996
- for( sal_uInt16 i = 1; i <= 12; ++i ) // we get all months in a year
- {
- aDate.SetMonth( i );
- sDate += SvxDateField::GetFormatted( aDate, eDateFormat, *pNumberFormatter, eLang );
- }
- break;
- case SVXDATEFORMAT_STDSMALL: ;
- case SVXDATEFORMAT_A: ; // 13.02.96
- case SVXDATEFORMAT_B: ; // 13.02.1996
- default:
- // nothing to do here, we always collect the characters needed for these cases.
- break;
+ String sDate;
+ LanguageType eLang = pInfo->GetOutliner()->GetLanguage( pInfo->GetPara(), pInfo->GetPos() );
+ SvNumberFormatter * pNumberFormatter = new SvNumberFormatter( ::comphelper::getProcessServiceFactory(), LANGUAGE_SYSTEM );
+ // We always collect the characters obtained by using the SVXDATEFORMAT_B (as: 13.02.1996)
+ // so we are sure to include any unusual day|month|year separator.
+ Date aDate( 1, 1, 1996 );
+ sDate += SvxDateField::GetFormatted( aDate, SVXDATEFORMAT_B, *pNumberFormatter, eLang );
+ switch( eDateFormat )
+ {
+ case SVXDATEFORMAT_E: ; // Tue, 13.February 1996
+ case SVXDATEFORMAT_STDBIG: ;
+ case SVXDATEFORMAT_F: // Tuesday, 13.February 1996
+ for( sal_uInt16 i = 1; i <= 7; ++i ) // we get all days in a week
+ {
+ aDate.SetDay( i );
+ sDate += SvxDateField::GetFormatted( aDate, eDateFormat, *pNumberFormatter, eLang );
+ }
+ // No break here! We need months too!
+ case SVXDATEFORMAT_C: ; // 13.Feb 1996
+ case SVXDATEFORMAT_D: // 13.February 1996
+ for( sal_uInt16 i = 1; i <= 12; ++i ) // we get all months in a year
+ {
+ aDate.SetMonth( i );
+ sDate += SvxDateField::GetFormatted( aDate, eDateFormat, *pNumberFormatter, eLang );
+ }
+ break;
+ case SVXDATEFORMAT_STDSMALL: ;
+ case SVXDATEFORMAT_A: ; // 13.02.96
+ case SVXDATEFORMAT_B: ; // 13.02.1996
+ default:
+ // nothing to do here, we always collect the characters needed for these cases.
+ break;
+ }
+ aRepresentation += sDate;
}
- aRepresentation += sDate;
}
}
- }
- else if( pField->GetClassId() == text::textfield::Type::PAGE )
- {
- switch( mVisiblePagePropSet.nPageNumberingType )
+ else if( pField->GetClassId() == text::textfield::Type::PAGE )
{
- case SVX_CHARS_UPPER_LETTER:
- aRepresentation += B2UCONST( "QWERTYUIOPASDFGHJKLZXCVBNM" );
- break;
- case SVX_CHARS_LOWER_LETTER:
- aRepresentation += B2UCONST( "qwertyuiopasdfghjklzxcvbnm" );
- break;
- case SVX_ROMAN_UPPER:
- aRepresentation += B2UCONST( "IVXLCDM" );
- break;
- case SVX_ROMAN_LOWER:
- aRepresentation += B2UCONST( "ivxlcdm" );
- break;
- // arabic numbering type is the default
- case SVX_ARABIC: ;
- // in case the numbering type is not handled we fall back on arabic numbering
- default:
- aRepresentation += B2UCONST( "0123456789" );
- break;
+ switch( mVisiblePagePropSet.nPageNumberingType )
+ {
+ case SVX_CHARS_UPPER_LETTER:
+ aRepresentation += B2UCONST( "QWERTYUIOPASDFGHJKLZXCVBNM" );
+ break;
+ case SVX_CHARS_LOWER_LETTER:
+ aRepresentation += B2UCONST( "qwertyuiopasdfghjklzxcvbnm" );
+ break;
+ case SVX_ROMAN_UPPER:
+ aRepresentation += B2UCONST( "IVXLCDM" );
+ break;
+ case SVX_ROMAN_LOWER:
+ aRepresentation += B2UCONST( "ivxlcdm" );
+ break;
+ // arabic numbering type is the default
+ case SVX_ARABIC: ;
+ // in case the numbering type is not handled we fall back on arabic numbering
+ default:
+ aRepresentation += B2UCONST( "0123456789" );
+ break;
+ }
}
- }
-
- if( pCharSet != NULL )
- {
- UCharSet::const_iterator aChar = pCharSet->begin();
- for( ; aChar != pCharSet->end(); ++aChar )
+ else
{
- aRepresentation += OUString::valueOf( *aChar );
+ bFieldProcessed = sal_False;
}
+ if( bFieldProcessed )
+ {
+ if( pCharSet != NULL )
+ {
+ UCharSet::const_iterator aChar = pCharSet->begin();
+ for( ; aChar != pCharSet->end(); ++aChar )
+ {
+ aRepresentation += OUString::valueOf( *aChar );
+ }
+ }
+ pInfo->SetRepresentation( aRepresentation );
+ }
+ }
+ else
+ {
+ bFieldProcessed = sal_False;
}
- pInfo->SetRepresentation( aRepresentation );
}
else // single page case
{
@@ -2226,8 +2244,16 @@ IMPL_LINK( SVGFilter, CalcFieldHdl, EditFieldInfo*, pInfo )
break;
}
}
+ else
+ {
+ bFieldProcessed = sal_False;
+ }
+ if( bFieldProcessed )
+ {
+ pInfo->SetRepresentation( aRepresentation );
+ }
}
- pInfo->SetRepresentation( aRepresentation );
+
}
}
return ( bFieldProcessed ? 0 : maOldFieldHdl.Call( pInfo ) );
diff --git a/filter/source/svg/svgwriter.cxx b/filter/source/svg/svgwriter.cxx
index 4880161338b9..ca3f5393c7cb 100644
--- a/filter/source/svg/svgwriter.cxx
+++ b/filter/source/svg/svgwriter.cxx
@@ -457,6 +457,7 @@ SVGTextWriter::SVGTextWriter( SVGExport& rExport, SVGFontExport& rFontExport )
mpVDev( NULL ),
mrTextShape(),
mrParagraphEnumeration(),
+ mrCurrentTextParagraph(),
mrTextPortionEnumeration(),
mrCurrentTextPortion(),
mpTextEmbeddedBitmapMtf( NULL ),
@@ -468,7 +469,7 @@ SVGTextWriter::SVGTextWriter( SVGExport& rExport, SVGFontExport& rFontExport )
maTextPos(0,0),
mnTextWidth(0),
mbPositioningNeeded( sal_False ),
- mbIsNumbering( sal_False ),
+ mbIsNewListItem( sal_False ),
maBulletListItemMap(),
mbIsListLevelStyleImage( sal_False ),
mbLineBreak( sal_False ),
@@ -575,6 +576,17 @@ sal_Bool SVGTextWriter::implGetTextPosition<MetaTextRectAction>( const MetaActio
// -----------------------------------------------------------------------------
+template<>
+sal_Bool SVGTextWriter::implGetTextPosition<MetaBmpExScaleAction>( const MetaAction* pAction, Point& raPos, sal_Bool& rbEmpty )
+{
+ const MetaBmpExScaleAction* pA = (const MetaBmpExScaleAction*) pAction;
+ raPos = pA->GetPoint();
+ rbEmpty = sal_False;
+ return sal_True;
+}
+
+// -----------------------------------------------------------------------------
+
/** setTextPosition
* Set the start position of the next line of text. In case no text is found
* the current action index is updated to the index value we reached while
@@ -628,6 +640,12 @@ sal_Int32 SVGTextWriter::setTextPosition( const GDIMetaFile& rMtf, sal_uLong& nC
}
break;
+ case( META_BMPEXSCALE_ACTION ):
+ {
+ bConfigured = implGetTextPosition<MetaBmpExScaleAction>( pAction, aPos, bEmpty );
+ }
+ break;
+
// If we reach the end of the current line, paragraph or text shape
// without finding any text we stop searching
case( META_COMMENT_ACTION ):
@@ -641,6 +659,37 @@ sal_Int32 SVGTextWriter::setTextPosition( const GDIMetaFile& rMtf, sal_uLong& nC
else if( rsComment.equalsIgnoreAsciiCaseL( RTL_CONSTASCII_STRINGPARAM( "XTEXT_EOP" ) ) )
{
bEOP = true;
+
+ ::rtl::OUString sContent;
+ while( nextTextPortion() )
+ {
+ sContent = mrCurrentTextPortion->getString();
+ if( sContent.isEmpty() )
+ {
+ continue;
+ }
+ else
+ {
+ if( sContent.equalsAscii( "\n" ) )
+ mbLineBreak = sal_True;
+ }
+ }
+ if( nextParagraph() )
+ {
+ while( nextTextPortion() )
+ {
+ sContent = mrCurrentTextPortion->getString();
+ if( sContent.isEmpty() )
+ {
+ continue;
+ }
+ else
+ {
+ if( sContent.equalsAscii( "\n" ) )
+ mbLineBreak = sal_True;
+ }
+ }
+ }
}
else if( rsComment.equalsIgnoreAsciiCaseL( RTL_CONSTASCII_STRINGPARAM( "XTEXT_PAINTSHAPE_END" ) ) )
{
@@ -858,9 +907,37 @@ void SVGTextWriter::implSetFontFamily()
// -----------------------------------------------------------------------------
+sal_Bool SVGTextWriter::createParagraphEnumeration()
+{
+ if( mrTextShape.is() )
+ {
+ Reference< XEnumerationAccess > xEnumerationAccess( mrTextShape, UNO_QUERY_THROW );
+ Reference< XEnumeration > xEnumeration( xEnumerationAccess->createEnumeration(), UNO_QUERY_THROW );
+ if( xEnumeration.is() )
+ {
+ mrParagraphEnumeration.set( xEnumeration );
+ return sal_True;
+ }
+ else
+ {
+ OSL_FAIL( "SVGTextWriter::createParagraphEnumeration: no valid xEnumeration interface found." );
+ }
+ }
+ else
+ {
+ OSL_FAIL( "SVGTextWriter::createParagraphEnumeration: no valid XText interface found." );
+ }
+ return sal_False;
+}
+
+// -----------------------------------------------------------------------------
+
sal_Bool SVGTextWriter::nextParagraph()
{
mrTextPortionEnumeration.clear();
+ mrCurrentTextParagraph.clear();
+ mbIsNewListItem = sal_False;
+ mbIsListLevelStyleImage = sal_False;
if( mrParagraphEnumeration.is() && mrParagraphEnumeration->hasMoreElements() )
{
Reference < XTextContent > xTextContent( mrParagraphEnumeration->nextElement(), UNO_QUERY_THROW );
@@ -872,16 +949,30 @@ sal_Bool SVGTextWriter::nextParagraph()
OUString sInfo;
if( xServiceInfo->supportsService( B2UCONST( "com.sun.star.text.Paragraph" ) ) )
{
+// {
+// Reference < XEnumeration> xContentEnum;
+// Reference < XContentEnumerationAccess > xCEA( xTextContent, UNO_QUERY );
+// if( xCEA.is() )
+// xContentEnum.set(xCEA->createContentEnumeration( B2UCONST( "com.sun.star.text.Paragraph" ) ));
+// const sal_Bool bHasContentEnum = xContentEnum.is() &&
+// xContentEnum->hasMoreElements();
+//
+// if( bHasContentEnum )
+// {
+// sInfo = B2UCONST( "true" );
+// mrExport.AddAttribute( XML_NAMESPACE_NONE, "has-content-enum", sInfo );
+// }
+// }
+
+ mrCurrentTextParagraph.set( xTextContent );
Reference< XPropertySet > xPropSet( xTextContent, UNO_QUERY_THROW );
Reference< XPropertySetInfo > xPropSetInfo = xPropSet->getPropertySetInfo();
- mbIsNumbering = sal_False;
- mbIsListLevelStyleImage = sal_False;
if( xPropSetInfo->hasPropertyByName( B2UCONST( "NumberingLevel" ) ) )
{
sal_Int16 nListLevel = 0;
if( xPropSet->getPropertyValue( B2UCONST( "NumberingLevel" ) ) >>= nListLevel )
{
- mbIsNumbering = sal_True;
+ mbIsNewListItem = sal_True;
sInfo = B2UCONST( "NumberingLevel: " );
sInfo += OUString::valueOf( (sal_Int32)nListLevel );
mrExport.AddAttribute( XML_NAMESPACE_NONE, "style", sInfo );
@@ -893,46 +984,66 @@ sal_Bool SVGTextWriter::nextParagraph()
}
if( xNumRules.is() && ( nListLevel < xNumRules->getCount() ) )
{
- Sequence<PropertyValue> aProps;
- if( xNumRules->getByIndex( nListLevel ) >>= aProps )
+ sal_Bool bIsNumbered = sal_True;
+ OUString msNumberingIsNumber(RTL_CONSTASCII_USTRINGPARAM("NumberingIsNumber"));
+ if( xPropSetInfo->hasPropertyByName( msNumberingIsNumber ) )
{
- sal_Int16 eType = NumberingType::CHAR_SPECIAL;
- sal_Unicode cBullet = 0xf095;
- const sal_Int32 nCount = aProps.getLength();
- const PropertyValue* pPropArray = aProps.getConstArray();
- for( sal_Int32 i = 0; i < nCount; ++i )
+ if( !(xPropSet->getPropertyValue( msNumberingIsNumber ) >>= bIsNumbered ) )
{
- const PropertyValue& rProp = pPropArray[i];
- if( rProp.Name.equalsAsciiL( XML_UNO_NAME_NRULE_NUMBERINGTYPE, sizeof(XML_UNO_NAME_NRULE_NUMBERINGTYPE)-1 ) )
- {
- rProp.Value >>= eType;
- }
- else if( rProp.Name.equalsAsciiL( XML_UNO_NAME_NRULE_BULLET_CHAR, sizeof(XML_UNO_NAME_NRULE_BULLET_CHAR)-1 ) )
+ OSL_FAIL( "numbered paragraph without number info" );
+ bIsNumbered = sal_False;
+ }
+ if( bIsNumbered )
+ {
+ sInfo = B2UCONST( "true" );
+ mrExport.AddAttribute( XML_NAMESPACE_NONE, "is-numbered", sInfo );
+ }
+ }
+ mbIsNewListItem = bIsNumbered;
+
+ if( bIsNumbered )
+ {
+ Sequence<PropertyValue> aProps;
+ if( xNumRules->getByIndex( nListLevel ) >>= aProps )
+ {
+ sal_Int16 eType = NumberingType::CHAR_SPECIAL;
+ sal_Unicode cBullet = 0xf095;
+ const sal_Int32 nCount = aProps.getLength();
+ const PropertyValue* pPropArray = aProps.getConstArray();
+ for( sal_Int32 i = 0; i < nCount; ++i )
{
- OUString sValue;
- rProp.Value >>= sValue;
- if( !sValue.isEmpty() )
+ const PropertyValue& rProp = pPropArray[i];
+ if( rProp.Name.equalsAsciiL( XML_UNO_NAME_NRULE_NUMBERINGTYPE, sizeof(XML_UNO_NAME_NRULE_NUMBERINGTYPE)-1 ) )
{
- cBullet = (sal_Unicode)sValue[0];
+ rProp.Value >>= eType;
+ }
+ else if( rProp.Name.equalsAsciiL( XML_UNO_NAME_NRULE_BULLET_CHAR, sizeof(XML_UNO_NAME_NRULE_BULLET_CHAR)-1 ) )
+ {
+ OUString sValue;
+ rProp.Value >>= sValue;
+ if( !sValue.isEmpty() )
+ {
+ cBullet = (sal_Unicode)sValue[0];
+ }
}
}
- }
- meNumberingType = eType;
- mbIsListLevelStyleImage = ( NumberingType::BITMAP == meNumberingType );
- if( NumberingType::CHAR_SPECIAL == meNumberingType )
- {
- if( cBullet )
+ meNumberingType = eType;
+ mbIsListLevelStyleImage = ( NumberingType::BITMAP == meNumberingType );
+ if( NumberingType::CHAR_SPECIAL == meNumberingType )
{
- if( cBullet < ' ' )
+ if( cBullet )
{
- cBullet = 0xF000 + 149;
+ if( cBullet < ' ' )
+ {
+ cBullet = 0xF000 + 149;
+ }
+ mcBulletChar = cBullet;
+ // text:bullet-char="..."
+ sInfo = OUString::valueOf( (sal_Int32) cBullet );
+ mrExport.AddAttribute( XML_NAMESPACE_NONE, "bullet-char", sInfo );
}
- mcBulletChar = cBullet;
- // text:bullet-char="..."
- sInfo = OUString::valueOf( (sal_Int32) cBullet );
- mrExport.AddAttribute( XML_NAMESPACE_NONE, "bullet-char", sInfo );
- }
+ }
}
}
}
@@ -960,6 +1071,11 @@ sal_Bool SVGTextWriter::nextParagraph()
mrExport.AddAttribute( XML_NAMESPACE_NONE, "class", sInfo );
SvXMLElementExport aParaElem( mrExport, XML_NAMESPACE_NONE, "desc", mbIWS, mbIWS );
}
+ else
+ {
+ OSL_FAIL( "SVGTextWriter::nextParagraph: no XServiceInfo interface available for text content." );
+ return sal_False;
+ }
Reference< XInterface > xRef( xTextContent, UNO_QUERY );
const OUString& rParagraphId = implGetValidIDFromInterface( xRef );
@@ -979,6 +1095,7 @@ sal_Bool SVGTextWriter::nextTextPortion()
{
mrCurrentTextPortion.clear();
mbIsURLField = sal_False;
+ mbIsPlacehlolderShape = sal_False;
if( mrTextPortionEnumeration.is() && mrTextPortionEnumeration->hasMoreElements() )
{
OUString sInfo;
@@ -1010,8 +1127,11 @@ sal_Bool SVGTextWriter::nextTextPortion()
if( xTextField.is() )
{
const ::rtl::OUString sServicePrefix( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.text.textfield.") );
+ const ::rtl::OUString sPresentationServicePrefix( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.presentation.TextField.") );
+
Reference< XServiceInfo > xService( xTextField, UNO_QUERY );
const Sequence< OUString > aServices = xService->getSupportedServiceNames();
+
const OUString* pNames = aServices.getConstArray();
sal_Int32 nCount = aServices.getLength();
@@ -1026,6 +1146,12 @@ sal_Bool SVGTextWriter::nextTextPortion()
sFieldName = pNames->copy( sServicePrefix.getLength() );
break;
}
+ else if( 0 == pNames->compareTo( sPresentationServicePrefix, sPresentationServicePrefix.getLength() ) )
+ {
+ // TextField found => postfix is field type!
+ sFieldName = pNames->copy( sPresentationServicePrefix.getLength() );
+ break;
+ }
++pNames;
}
@@ -1034,29 +1160,38 @@ sal_Bool SVGTextWriter::nextTextPortion()
sInfo += sFieldName;
sInfo += B2UCONST( "; " );
- mbIsURLField = sFieldName.equalsAscii( "URL" );
- if( mbIsURLField )
+ if( sFieldName.equalsAscii( "DateTime" ) || sFieldName.equalsAscii( "Header" )
+ || sFieldName.equalsAscii( "Footer" ) || sFieldName.equalsAscii( "PageNumber" ) )
{
- Reference<XPropertySet> xTextFieldPropSet(xTextField, UNO_QUERY);
- if( xTextFieldPropSet.is() )
+ mbIsPlacehlolderShape = sal_True;
+ }
+ else
+ {
+ mbIsURLField = sFieldName.equalsAscii( "URL" );
+
+ if( mbIsURLField )
{
- OUString sURL;
- if( ( xTextFieldPropSet->getPropertyValue( sFieldName ) ) >>= sURL )
+ Reference<XPropertySet> xTextFieldPropSet(xTextField, UNO_QUERY);
+ if( xTextFieldPropSet.is() )
{
- sInfo += B2UCONST( "url: " );
- sInfo += mrExport.GetRelativeReference( sURL );
-
- msUrl = mrExport.GetRelativeReference( sURL );
- if( !msUrl.isEmpty() )
+ OUString sURL;
+ if( ( xTextFieldPropSet->getPropertyValue( sFieldName ) ) >>= sURL )
{
- implRegisterInterface( xPortionTextRange );
+ sInfo += B2UCONST( "url: " );
+ sInfo += mrExport.GetRelativeReference( sURL );
- Reference< XInterface > xRef( xPortionTextRange, UNO_QUERY );
- const OUString& rTextPortionId = implGetValidIDFromInterface( xRef );
- if( !rTextPortionId.isEmpty() )
+ msUrl = mrExport.GetRelativeReference( sURL );
+ if( !msUrl.isEmpty() )
{
- msHyperlinkIdList += rTextPortionId;
- msHyperlinkIdList += B2UCONST( " " );
+ implRegisterInterface( xPortionTextRange );
+
+ Reference< XInterface > xRef( xPortionTextRange, UNO_QUERY );
+ const OUString& rTextPortionId = implGetValidIDFromInterface( xRef );
+ if( !rTextPortionId.isEmpty() )
+ {
+ msHyperlinkIdList += rTextPortionId;
+ msHyperlinkIdList += B2UCONST( " " );
+ }
}
}
}
@@ -1078,21 +1213,11 @@ sal_Bool SVGTextWriter::nextTextPortion()
void SVGTextWriter::startTextShape()
{
- if( mrTextShape.is() )
- {
- Reference< XEnumerationAccess > xEnumerationAccess( mrTextShape, UNO_QUERY_THROW );
- Reference< XEnumeration > xEnumeration( xEnumerationAccess->createEnumeration(), UNO_QUERY_THROW );
- if( xEnumeration.is() && xEnumeration->hasMoreElements() )
- {
- mrParagraphEnumeration.set( xEnumeration );
- }
- }
-
if( mpTextShapeElem )
{
OSL_FAIL( "SVGTextWriter::startTextShape: text shape already defined." );
}
- else
+
{
maParentFont = Font();
mrExport.AddAttribute( XML_NAMESPACE_NONE, "class", B2UCONST( "TextShape" ) );
@@ -1110,6 +1235,8 @@ void SVGTextWriter::endTextShape()
mrTextShape.clear();
if( mrParagraphEnumeration.is() )
mrParagraphEnumeration.clear();
+ if( mrCurrentTextParagraph.is() )
+ mrCurrentTextParagraph.clear();
if( mpTextShapeElem )
{
delete mpTextShapeElem;
@@ -1128,7 +1255,7 @@ void SVGTextWriter::startTextParagraph()
{
endTextParagraph();
nextParagraph();
- if( mbIsNumbering )
+ if( mbIsNewListItem )
{
OUString sNumberingType;
switch( meNumberingType )
@@ -1163,8 +1290,9 @@ void SVGTextWriter::startTextParagraph()
void SVGTextWriter::endTextParagraph()
{
+ mrCurrentTextPortion.clear();
endTextPosition();
- mbIsNumbering = sal_False;
+ mbIsNewListItem = sal_False;
mbIsListLevelStyleImage = sal_False;
mbPositioningNeeded = sal_False;
@@ -1237,6 +1365,7 @@ void SVGTextWriter::implWriteBulletChars()
sId += it->first;
sId += B2UCONST( ")" );
mrExport.AddAttribute( XML_NAMESPACE_NONE, "id", sId );
+ mrExport.AddAttribute( XML_NAMESPACE_NONE, "class", B2UCONST( "BulletChar" ) );
SvXMLElementExport aBulletCharElem( mrExport, XML_NAMESPACE_NONE, aXMLElemG, sal_True, sal_True );
// <g transform="translate(x,y)" >
@@ -1291,9 +1420,9 @@ void SVGTextWriter::writeBitmapPlaceholder( const MetaBmpExScaleAction* pAction
implMap( rPos, maTextPos );
startTextPosition();
mbPositioningNeeded = sal_True;
- if( mbIsNumbering )
+ if( mbIsNewListItem )
{
- mbIsNumbering = sal_False;
+ mbIsNewListItem = sal_False;
mbIsListLevelStyleImage = sal_False;
}
@@ -1302,10 +1431,13 @@ void SVGTextWriter::writeBitmapPlaceholder( const MetaBmpExScaleAction* pAction
OUString sId = B2UCONST( "bitmap-placeholder(" );
sId += OUString::valueOf( (sal_Int64)nId );
sId += B2UCONST( ")" );
- mrExport.AddAttribute( XML_NAMESPACE_NONE, "id", sId );
- mrExport.AddAttribute( XML_NAMESPACE_NONE, "class", B2UCONST( "BitmapPlaceholder" ) );
- SvXMLElementExport aSVGTspanElem( mrExport, XML_NAMESPACE_NONE, aXMLElemTspan, mbIWS, mbIWS );
+ {
+ mrExport.AddAttribute( XML_NAMESPACE_NONE, "id", sId );
+ mrExport.AddAttribute( XML_NAMESPACE_NONE, "class", B2UCONST( "BitmapPlaceholder" ) );
+ SvXMLElementExport aSVGTspanElem( mrExport, XML_NAMESPACE_NONE, aXMLElemTspan, mbIWS, mbIWS );
+ }
+ endTextPosition();
}
// -----------------------------------------------------------------------------
@@ -1334,6 +1466,7 @@ void SVGTextWriter::implWriteEmbeddedBitmaps()
sId += OUString::valueOf( (sal_Int64)nId );
sId += B2UCONST( ")" );
mrExport.AddAttribute( XML_NAMESPACE_NONE, "id", sId );
+ mrExport.AddAttribute( XML_NAMESPACE_NONE, "class", B2UCONST( "EmbeddedBitmap" ) );
SvXMLElementExport aEmbBitmapElem( mrExport, XML_NAMESPACE_NONE, aXMLElemG, sal_True, sal_True );
@@ -1374,13 +1507,13 @@ void SVGTextWriter::writeTextPortion( const Point& rPos,
mbLineBreak = sal_False;
- if( !mbIsNumbering || mbIsListLevelStyleImage )
+ if( !mbIsNewListItem || mbIsListLevelStyleImage )
{
bool bNotSync = true;
OUString sContent;
sal_Int32 nStartPos;
- do
- {
+// do
+// {
while( bNotSync )
{
if( mnLeftTextPortionLength <= 0 )
@@ -1409,7 +1542,7 @@ void SVGTextWriter::writeTextPortion( const Point& rPos,
if( sContent.match( rText, nStartPos ) )
bNotSync = false;
}
- } while( bNotSync && nextParagraph() );
+// } while( bNotSync && nextParagraph() );
}
if( !mpVDev )
@@ -1552,29 +1685,30 @@ void SVGTextWriter::implWriteTextPortion( const Point& rPos,
}
}
// we are dealing with a bullet, so set up this for the next text portion
- if( mbIsNumbering )
+ if( mbIsNewListItem )
{
- mbIsNumbering = sal_False;
+ mbIsNewListItem = sal_False;
mbPositioningNeeded = sal_True;
if( meNumberingType == NumberingType::CHAR_SPECIAL )
{
// Create an id for the current text portion
- implRegisterInterface( mrCurrentTextPortion );
+ implRegisterInterface( mrCurrentTextParagraph );
// Add the needed info to the BulletListItemMap
- Reference< XInterface > xRef( mrCurrentTextPortion, UNO_QUERY );
- const OUString& rId = implGetValidIDFromInterface( xRef );
- if( !rId.isEmpty() )
+ Reference< XInterface > xRef( mrCurrentTextParagraph, UNO_QUERY );
+ OUString sId = implGetValidIDFromInterface( xRef );
+ if( !sId.isEmpty() )
{
- BulletListItemInfo& aBulletListItemInfo = maBulletListItemMap[ rId ];
+ sId += ".bp";
+ BulletListItemInfo& aBulletListItemInfo = maBulletListItemMap[ sId ];
aBulletListItemInfo.nFontSize = rFont.GetHeight();
aBulletListItemInfo.aColor = aTextColor;
aBulletListItemInfo.aPos = maTextPos;
aBulletListItemInfo.cBulletChar = mcBulletChar;
// Make this text portion a bullet placeholder
- mrExport.AddAttribute( XML_NAMESPACE_NONE, "id", rId );
+ mrExport.AddAttribute( XML_NAMESPACE_NONE, "id", sId );
mrExport.AddAttribute( XML_NAMESPACE_NONE, "class", B2UCONST( "BulletPlaceholder" ) );
SvXMLElementExport aSVGTspanElem( mrExport, XML_NAMESPACE_NONE, aXMLElemTspan, mbIWS, mbIWS );
return;
@@ -1589,9 +1723,15 @@ void SVGTextWriter::implWriteTextPortion( const Point& rPos,
mrExport.AddAttribute( XML_NAMESPACE_NONE, "id", rTextPortionId );
}
- if( mbIsURLField && !msUrl.isEmpty() )
+ if( mbIsPlacehlolderShape )
+ {
+ mrExport.AddAttribute( XML_NAMESPACE_NONE, "class", B2UCONST( "PlaceholderText" ) );
+ mbIsPlacehlolderShape = sal_False;
+ }
+ else if( mbIsURLField && !msUrl.isEmpty() )
{
mrExport.AddAttribute( XML_NAMESPACE_NONE, aXMLAttrXLinkHRef, msUrl );
+ mbIsURLField = sal_False;
}
@@ -1599,40 +1739,9 @@ void SVGTextWriter::implWriteTextPortion( const Point& rPos,
mpContext->AddPaintAttr( COL_TRANSPARENT, aTextColor );
SvXMLElementExport aSVGTspanElem( mrExport, XML_NAMESPACE_NONE, aXMLElemTspan, mbIWS, mbIWS );
-
- sal_Bool bIsPlaceholderField = sal_False;
-
- if( false && mbIsPlacehlolderShape )
- {
- OUString sTextContent = rText;
- bIsPlaceholderField = sTextContent.match( sPlaceholderTag );
- // for a placeholder text field we export only one <text> svg element
- if( bIsPlaceholderField )
- {
- OUString sCleanTextContent;
- static const sal_Int32 nFrom = sPlaceholderTag.getLength();
- if( sTextContent.getLength() > nFrom )
- {
- sCleanTextContent = sTextContent.copy( nFrom );
- }
- mrExport.AddAttribute( XML_NAMESPACE_NONE, "class", B2UCONST( "PlaceholderText" ) );
- mrExport.AddAttribute( XML_NAMESPACE_NONE, aXMLAttrX, ::rtl::OUString::valueOf( aPos.X() ) );
- mrExport.AddAttribute( XML_NAMESPACE_NONE, aXMLAttrY, ::rtl::OUString::valueOf( aPos.Y() ) );
- {
- //SvXMLElementExport aElem( mrExport, XML_NAMESPACE_NONE, aXMLElemSpan, sal_True, sal_False );
- // At least for the single slide case we need really to export placeholder text
- mrExport.GetDocHandler()->characters( sCleanTextContent );
- }
- }
- }
-
- if( !bIsPlaceholderField )
- {
- OUString sTextContent = rText;
- mrExport.GetDocHandler()->characters( sTextContent );
- mnTextWidth += mpVDev->GetTextWidth( sTextContent );
- }
-
+ OUString sTextContent = rText;
+ mrExport.GetDocHandler()->characters( sTextContent );
+ mnTextWidth += mpVDev->GetTextWidth( sTextContent );
}
// -------------------
@@ -2648,11 +2757,9 @@ void SVGActionWriter::ImplWriteActions( const GDIMetaFile& rMtf,
}
mbIsPlacehlolderShape = false;
- maTextWriter.setPlaceholderShapeFlag( false );
if( ( pElementId != NULL ) && ( *pElementId == sPlaceholderTag ) )
{
mbIsPlacehlolderShape = true;
- maTextWriter.setPlaceholderShapeFlag( true );
// since we utilize pElementId in an improper way we reset it to NULL before to go on
pElementId = NULL;
}
@@ -3118,29 +3225,31 @@ void SVGActionWriter::ImplWriteActions( const GDIMetaFile& rMtf,
{
if( ( pA->GetComment().equalsIgnoreAsciiCaseL( RTL_CONSTASCII_STRINGPARAM( "XTEXT_PAINTSHAPE_BEGIN" ) ) ) )
{
- // nTextFound == -1 => no text found
- // nTextFound == 0 => no text found and end of text shape reached
- // nTextFound == 1 => text found!
- sal_Int32 nTextFound = -1;
- while( ( nTextFound < 0 ) && ( nCurAction < nCount ) )
- {
- nTextFound = maTextWriter.setTextPosition( rMtf, nCurAction );
- }
- // We found some text in the current text shape.
- if( nTextFound > 0 )
- {
- maTextWriter.setTextProperties( rMtf, nCurAction );
- //ImplSetCorrectFontHeight();
- maTextWriter.startTextShape();
- }
- // We reached the end of the current text shape
- // without finding any text. So we need to go back
- // by one action in order to handle the
- // XTEXT_PAINTSHAPE_END action because on the next
- // loop the nCurAction is incremented by one.
- else
+ maTextWriter.createParagraphEnumeration();
{
- --nCurAction;
+ // nTextFound == -1 => no text found
+ // nTextFound == 0 => no text found and end of text shape reached
+ // nTextFound == 1 => text found!
+ sal_Int32 nTextFound = -1;
+ while( ( nTextFound < 0 ) && ( nCurAction < nCount ) )
+ {
+ nTextFound = maTextWriter.setTextPosition( rMtf, nCurAction );
+ }
+ // We found some text in the current text shape.
+ if( nTextFound > 0 )
+ {
+ maTextWriter.setTextProperties( rMtf, nCurAction );
+ maTextWriter.startTextShape();
+ }
+ // We reached the end of the current text shape
+ // without finding any text. So we need to go back
+ // by one action in order to handle the
+ // XTEXT_PAINTSHAPE_END action because on the next
+ // loop the nCurAction is incremented by one.
+ else
+ {
+ --nCurAction;
+ }
}
}
else if( ( pA->GetComment().equalsIgnoreAsciiCaseL( RTL_CONSTASCII_STRINGPARAM( "XTEXT_PAINTSHAPE_END" ) ) ) )
@@ -3166,7 +3275,6 @@ void SVGActionWriter::ImplWriteActions( const GDIMetaFile& rMtf,
if( nTextFound > 0 )
{
maTextWriter.setTextProperties( rMtf, nCurAction );
- //ImplSetCorrectFontHeight();
maTextWriter.startTextParagraph();
}
// We reached the end of the current text shape
@@ -3199,8 +3307,6 @@ void SVGActionWriter::ImplWriteActions( const GDIMetaFile& rMtf,
// paragraph.
if( nTextFound > 0 )
{
- //maTextWriter.setTextProperties( rMtf, nCurAction );
- //ImplSetCorrectFontHeight();
maTextWriter.startTextPosition();
}
// We reached the end of the current paragraph
diff --git a/filter/source/svg/svgwriter.hxx b/filter/source/svg/svgwriter.hxx
index 3a23f5fa52ad..125c5efe157c 100644
--- a/filter/source/svg/svgwriter.hxx
+++ b/filter/source/svg/svgwriter.hxx
@@ -46,6 +46,7 @@
#include <com/sun/star/uno/Reference.h>
#include <com/sun/star/container/XEnumerationAccess.hpp>
+#include <com/sun/star/container/XContentEnumerationAccess.hpp>
#include <com/sun/star/container/XEnumeration.hpp>
#include <com/sun/star/container/XIndexReplace.hpp>
#include <com/sun/star/lang/XServiceInfo.hpp>
@@ -68,6 +69,7 @@
#include <com/sun/star/text/XTextField.hpp>
#include <com/sun/star/style/NumberingType.hpp>
+
// -----------------------------------------------------------------------------
using namespace ::com::sun::star::uno;
@@ -204,6 +206,7 @@ class SVGTextWriter
VirtualDevice* mpVDev;
Reference<XText> mrTextShape;
Reference<XEnumeration> mrParagraphEnumeration;
+ Reference<XTextContent> mrCurrentTextParagraph;
Reference<XEnumeration> mrTextPortionEnumeration;
Reference<XTextRange> mrCurrentTextPortion;
const GDIMetaFile* mpTextEmbeddedBitmapMtf;
@@ -215,7 +218,7 @@ class SVGTextWriter
Point maTextPos;
long int mnTextWidth;
sal_Bool mbPositioningNeeded;
- sal_Bool mbIsNumbering;
+ sal_Bool mbIsNewListItem;
sal_Int16 meNumberingType;
sal_Unicode mcBulletChar;
BulletListItemInfoMap maBulletListItemMap;
@@ -237,6 +240,7 @@ class SVGTextWriter
void setTextProperties( const GDIMetaFile& rMtf, sal_uLong nCurAction );
void addFontAttributes( sal_Bool bIsTextContainer );
+ sal_Bool createParagraphEnumeration();
sal_Bool nextParagraph();
sal_Bool nextTextPortion();