oox/source/export/drawingml.cxx | 18 +++++++++++- oox/source/export/preset-definitions-to-shape-types.pl | 25 +++++++++++++++++ sw/qa/extras/ooxmlexport/ooxmlexport.cxx | 3 ++ 3 files changed, 45 insertions(+), 1 deletion(-)
New commits: commit 33227dbf270bec5b7aa079b9b5e2e7e036796e20 Author: Miklos Vajna <vmik...@collabora.co.uk> Date: Thu Jan 2 18:43:39 2014 +0100 fdo#73215 oox: don't assume single adjustment is adj during export So far adjustment names were either taken from the document model, or in case there the name was empty, either "adj" was used (in case of a single adjustment) or "adj1", "adj2", etc. The problem is that there is no consistency here, e.g. this behavior was correct for "cube" (single adjustment is called "adj"), but not for "bentConnector3", where the single argument is called "adj1". Instead of trying to guess or build a long list manually, use the new ooxDrawingMLGetAdjNames() to write the correct names. Change-Id: I3d609975d89c7c79f4a70c7a739cab8e01f9667f diff --git a/oox/source/export/drawingml.cxx b/oox/source/export/drawingml.cxx index a338170..030beb5 100644 --- a/oox/source/export/drawingml.cxx +++ b/oox/source/export/drawingml.cxx @@ -96,6 +96,9 @@ using ::sax_fastparser::FSHelperPtr; DBG(extern void dump_pset(Reference< XPropertySet > rXPropSet)); +// Defined in generated code. +extern std::map< OString, std::vector<OString> > ooxDrawingMLGetAdjNames(); + namespace oox { namespace drawingml { @@ -1408,6 +1411,12 @@ void DrawingML::WritePresetShape( const char* pShape ) void DrawingML::WritePresetShape( const char* pShape, MSO_SPT eShapeType, sal_Bool bPredefinedHandlesUsed, sal_Int32 nAdjustmentsWhichNeedsToBeConverted, const PropertyValue& rProp ) { + static std::map< OString, std::vector<OString> > aAdjMap = ooxDrawingMLGetAdjNames(); + // If there are predefined adj names for this shape type, look them up now. + std::vector<OString> aAdjustments; + if (aAdjMap.find(OString(pShape)) != aAdjMap.end()) + aAdjustments = aAdjMap[OString(pShape)]; + mpFS->startElementNS( XML_a, XML_prstGeom, XML_prst, pShape, FSEND ); @@ -1425,10 +1434,17 @@ void DrawingML::WritePresetShape( const char* pShape, MSO_SPT eShapeType, sal_Bo sal_Int32 nValue, nLength = aAdjustmentSeq.getLength(); for( sal_Int32 i=0; i < nLength; i++ ) if( EscherPropertyContainer::GetAdjustmentValue( aAdjustmentSeq[ i ], i, nAdjustmentsWhichNeedsToBeConverted, nValue ) ) + { + // If the document model doesn't have an adjustment name (e.g. shape was created from VML), then take it from the predefined list. + OString aAdjName; + if (aAdjustmentSeq[i].Name.isEmpty() && static_cast<sal_uInt32>(i) < aAdjustments.size()) + aAdjName = aAdjustments[i]; + mpFS->singleElementNS( XML_a, XML_gd, - XML_name, aAdjustmentSeq[ i ].Name.getLength() > 0 ? USS(aAdjustmentSeq[ i ].Name) : (nLength > 1 ? OString( "adj" + OString::number( i + 1 ) ).getStr() : "adj"), + XML_name, aAdjustmentSeq[ i ].Name.getLength() > 0 ? USS(aAdjustmentSeq[ i ].Name) : aAdjName.getStr(), XML_fmla, OString("val " + OString::number( nValue )).getStr(), FSEND ); + } } mpFS->endElementNS( XML_a, XML_avLst ); diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx index 7e1b91d..1e20734 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx @@ -2192,6 +2192,9 @@ DECLARE_OOXMLEXPORT_TEST(testFdo73215, "fdo73215.docx") // 'rect' was 'pictureFrame', which isn't valid. assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:r/mc:AlternateContent/mc:Choice/w:drawing/wp:inline/a:graphic/a:graphicData/wpg:wgp/wps:wsp[1]/wps:spPr/a:prstGeom", "prst", "rect"); + // 'adj1' was 'adj', which is not valid for bentConnector3. + assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:r/mc:AlternateContent/mc:Choice/w:drawing/wp:inline/a:graphic/a:graphicData/wpg:wgp/wps:wsp[9]/wps:spPr/a:prstGeom/a:avLst/a:gd", + "name", "adj1"); } DECLARE_OOXMLEXPORT_TEST(testTrackChangesDeletedParagraphMark, "testTrackChangesDeletedParagraphMark.docx") commit 65e25963e06c295ae8101f49da2774586d0110d5 Author: Miklos Vajna <vmik...@collabora.co.uk> Date: Thu Jan 2 18:27:11 2014 +0100 oox: extract adjustment names by type from spec XML The naming of adjustments is not consistent for drawingML shapes, some of them have the first parameter as "adj1", some of them have it as "adj". We already have a script that generates some code based on these XML files, make it generate a function that returns the naming for each type. Change-Id: I2250f72854295055e1b31f2df9aec25a997db749 diff --git a/oox/source/export/preset-definitions-to-shape-types.pl b/oox/source/export/preset-definitions-to-shape-types.pl index fc0b781..8f5904d 100644 --- a/oox/source/export/preset-definitions-to-shape-types.pl +++ b/oox/source/export/preset-definitions-to-shape-types.pl @@ -59,6 +59,7 @@ my $shape_name = ""; my $state = ""; my $path = ""; my $adjust = ""; +my %adj_names; my $max_adj_no = 0; my @formulas = (); my %variables = (); @@ -887,6 +888,10 @@ sub start_element( $% ) elsif ( $state eq "adjust" ) { if ( $element eq "gd" ) { my $adj_no = $attr{'name'}; + + # Save this adj number for this type for later use. + push(@{$adj_names{$shape_name}}, $adj_no); + my $is_const = 0; $adj_no =~ s/^adj//; @@ -1189,6 +1194,7 @@ print <<EOF; // '$src_text' // which are part of the OOXML documentation +#include <map> #include <filter/msfilter/escherex.hxx> const char* pShapeTypes[ ESCHER_ShpInst_COUNT ] = @@ -1224,4 +1230,23 @@ for ( my $i = 0; $i < 203; ++$i ) { print <<EOF; }; + +std::map< OString, std::vector<OString> > ooxDrawingMLGetAdjNames() +{ + std::map< OString, std::vector<OString> > aMap; EOF + +foreach my $adj_name (keys %adj_names) +{ + foreach my $adj (@{$adj_names{$adj_name}}) + { + print " aMap[\"$adj_name\"].push_back(\"$adj\");\n"; + } +} + +print <<EOF; + return aMap; +} +EOF + +# vim:set ft=perl shiftwidth=4 softtabstop=4 expandtab: # _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits