[Libreoffice-commits] core.git: Branch 'distro/suse/suse-3.6' - 7 commits - editeng/source offapi/com oox/inc oox/source svtools/inc svtools/source writerfilter/source
Miklos Vajna
vmiklos at suse.cz
Thu May 30 08:01:58 PDT 2013
editeng/source/items/borderline.cxx | 11 ++-
editeng/source/items/frmitems.cxx | 2
offapi/com/sun/star/table/BorderLineStyle.idl | 8 ++
oox/inc/oox/vml/vmlformatting.hxx | 16 ++++
oox/inc/oox/vml/vmlshape.hxx | 1
oox/source/vml/vmlformatting.cxx | 56 +++++++++++++++
oox/source/vml/vmlshape.cxx | 76 ++++++++++++---------
oox/source/vml/vmlshapecontext.cxx | 3
svtools/inc/svtools/ctrlbox.hxx | 1
svtools/source/control/ctrlbox.cxx | 7 +
writerfilter/source/dmapper/BorderHandler.cxx | 9 ++
writerfilter/source/dmapper/BorderHandler.hxx | 2
writerfilter/source/dmapper/DomainMapper.cxx | 5 +
writerfilter/source/dmapper/DomainMapper_Impl.cxx | 5 +
writerfilter/source/dmapper/DomainMapper_Impl.hxx | 3
writerfilter/source/dmapper/PageBordersHandler.cxx | 6 +
writerfilter/source/dmapper/PageBordersHandler.hxx | 1
writerfilter/source/dmapper/PropertyIds.cxx | 1
writerfilter/source/dmapper/PropertyIds.hxx | 1
writerfilter/source/dmapper/PropertyMap.cxx | 26 ++++++-
writerfilter/source/dmapper/PropertyMap.hxx | 3
writerfilter/source/ooxml/model.xml | 2
22 files changed, 205 insertions(+), 40 deletions(-)
New commits:
commit f74e7998ce04d54e10aa25eae45d94315768b120
Author: Miklos Vajna <vmiklos at suse.cz>
Date: Thu May 30 11:55:37 2013 +0200
bnc#817956 DOCX import of page border shadow
See the comment in SectionPropertyMap::ApplyBorderToPageStyles() on what and
how is mapped. The control flow is like this: BorderHandler::lcl_attribute()
notices w:shadow, then PageBordersHandler::lcl_sprm() gets it, passes it to
SectionPropertyMap::SetBorder(), finally
SectionPropertyMap::ApplyBorderToPageStyles() uses the UNO API.
(cherry picked from commit f0aa209390aea68f4c23cf16df9d1577aaea91b5)
Change-Id: Ib0aef3245f58c62655769357f1f4dd07eef77f62
diff --git a/writerfilter/source/dmapper/BorderHandler.cxx b/writerfilter/source/dmapper/BorderHandler.cxx
index 5bb53fd..9e66147 100644
--- a/writerfilter/source/dmapper/BorderHandler.cxx
+++ b/writerfilter/source/dmapper/BorderHandler.cxx
@@ -48,6 +48,7 @@ m_nLineWidth(15), // Word default, in twips
m_nLineType(0),
m_nLineColor(0),
m_nLineDistance(0),
+m_bShadow(false),
m_bOOXML( bOOXML )
{
const int nBorderCount(BORDER_COUNT);
@@ -92,7 +93,8 @@ void BorderHandler::lcl_attribute(Id rName, Value & rVal)
m_nLineDistance = ConversionHelper::convertTwipToMM100( nIntValue * 20 );
break;
case NS_rtf::LN_FSHADOW: // 0x2875
- //if 1 then line has shadow - unsupported
+ m_bShadow = nIntValue;
+ break;
case NS_rtf::LN_FFRAME: // 0x2876
case NS_rtf::LN_UNUSED2_15: // 0x2877
// ignored
@@ -182,6 +184,11 @@ table::BorderLine2 BorderHandler::getBorderLine()
return aBorderLine;
}
+bool BorderHandler::getShadow()
+{
+ return m_bShadow;
+}
+
} //namespace dmapper
} //namespace writerfilter
diff --git a/writerfilter/source/dmapper/BorderHandler.hxx b/writerfilter/source/dmapper/BorderHandler.hxx
index 6d23f12..8214bdb 100644
--- a/writerfilter/source/dmapper/BorderHandler.hxx
+++ b/writerfilter/source/dmapper/BorderHandler.hxx
@@ -59,6 +59,7 @@ private:
sal_Int32 m_nLineType;
sal_Int32 m_nLineColor;
sal_Int32 m_nLineDistance;
+ bool m_bShadow;
bool m_bOOXML;
bool m_aFilledLines[BORDER_COUNT];
@@ -75,6 +76,7 @@ public:
::boost::shared_ptr<PropertyMap> getProperties();
::com::sun::star::table::BorderLine2 getBorderLine();
sal_Int32 getLineDistance() const { return m_nLineDistance;}
+ bool getShadow();
};
typedef boost::shared_ptr< BorderHandler > BorderHandlerPtr;
}}
diff --git a/writerfilter/source/dmapper/DomainMapper.cxx b/writerfilter/source/dmapper/DomainMapper.cxx
index 1dd4acf..3defa79 100644
--- a/writerfilter/source/dmapper/DomainMapper.cxx
+++ b/writerfilter/source/dmapper/DomainMapper.cxx
@@ -2718,7 +2718,7 @@ void DomainMapper::sprmWithProps( Sprm& rSprm, PropertyMapPtr rContext, SprmType
BORDER_BOTTOM,
BORDER_RIGHT
};
- pSectionContext->SetBorder( aPositions[nSprmId - NS_sprm::LN_SBrcTop], nLineDistance, aBorderLine );
+ pSectionContext->SetBorder( aPositions[nSprmId - NS_sprm::LN_SBrcTop], nLineDistance, aBorderLine, /*bShadow =*/ false );
}
}
break;
diff --git a/writerfilter/source/dmapper/PageBordersHandler.cxx b/writerfilter/source/dmapper/PageBordersHandler.cxx
index 41469d6..ea6e450 100644
--- a/writerfilter/source/dmapper/PageBordersHandler.cxx
+++ b/writerfilter/source/dmapper/PageBordersHandler.cxx
@@ -10,7 +10,8 @@ namespace dmapper {
_PgBorder::_PgBorder( ) :
m_nDistance( 0 ),
- m_ePos( BORDER_RIGHT )
+ m_ePos( BORDER_RIGHT ),
+ m_bShadow(false)
{
}
@@ -105,6 +106,7 @@ void PageBordersHandler::lcl_sprm( Sprm& rSprm )
aPgBorder.m_rLine = pBorderHandler->getBorderLine( );
aPgBorder.m_nDistance = pBorderHandler->getLineDistance( );
aPgBorder.m_ePos = ePos;
+ aPgBorder.m_bShadow = pBorderHandler->getShadow();
m_aBorders.push_back( aPgBorder );
}
}
@@ -118,7 +120,7 @@ void PageBordersHandler::SetBorders( SectionPropertyMap* pSectContext )
for ( int i = 0, length = m_aBorders.size( ); i < length; i++ )
{
_PgBorder aBorder = m_aBorders[i];
- pSectContext->SetBorder( aBorder.m_ePos, aBorder.m_nDistance, aBorder.m_rLine );
+ pSectContext->SetBorder( aBorder.m_ePos, aBorder.m_nDistance, aBorder.m_rLine, aBorder.m_bShadow );
}
}
diff --git a/writerfilter/source/dmapper/PageBordersHandler.hxx b/writerfilter/source/dmapper/PageBordersHandler.hxx
index d238a71..6f4ce9e 100644
--- a/writerfilter/source/dmapper/PageBordersHandler.hxx
+++ b/writerfilter/source/dmapper/PageBordersHandler.hxx
@@ -23,6 +23,7 @@ public:
com::sun::star::table::BorderLine2 m_rLine;
sal_Int32 m_nDistance;
BorderPosition m_ePos;
+ bool m_bShadow;
_PgBorder( );
~_PgBorder( );
diff --git a/writerfilter/source/dmapper/PropertyIds.cxx b/writerfilter/source/dmapper/PropertyIds.cxx
index 0a2a313..2189f4d 100644
--- a/writerfilter/source/dmapper/PropertyIds.cxx
+++ b/writerfilter/source/dmapper/PropertyIds.cxx
@@ -327,6 +327,7 @@ const rtl::OUString& PropertyNameSupplier::GetName( PropertyIds eId ) const
case PROP_Z_ORDER: sName = "ZOrder"; break;
case PROP_RELATIVE_WIDTH: sName = "RelativeWidth"; break;
case PROP_IS_WIDTH_RELATIVE: sName = "IsWidthRelative"; break;
+ case PROP_SHADOW_FORMAT: sName = "ShadowFormat"; break;
}
::std::pair<PropertyNameMap_t::iterator,bool> aInsertIt =
m_pImpl->aNameMap.insert( PropertyNameMap_t::value_type( eId, sName ));
diff --git a/writerfilter/source/dmapper/PropertyIds.hxx b/writerfilter/source/dmapper/PropertyIds.hxx
index 1d39dbb..4e33082 100644
--- a/writerfilter/source/dmapper/PropertyIds.hxx
+++ b/writerfilter/source/dmapper/PropertyIds.hxx
@@ -300,6 +300,7 @@ enum PropertyIds
,PROP_Z_ORDER
,PROP_RELATIVE_WIDTH
,PROP_IS_WIDTH_RELATIVE
+ ,PROP_SHADOW_FORMAT
};
struct PropertyNameSupplier_Impl;
class PropertyNameSupplier
diff --git a/writerfilter/source/dmapper/PropertyMap.cxx b/writerfilter/source/dmapper/PropertyMap.cxx
index 4781a67..5f34542 100644
--- a/writerfilter/source/dmapper/PropertyMap.cxx
+++ b/writerfilter/source/dmapper/PropertyMap.cxx
@@ -40,6 +40,7 @@
#include <com/sun/star/container/XNameContainer.hpp>
#include <com/sun/star/style/BreakType.hpp>
#include <com/sun/star/style/PageStyleLayout.hpp>
+#include <com/sun/star/table/ShadowFormat.hpp>
#include <com/sun/star/text/RelOrientation.hpp>
#include <com/sun/star/text/WritingMode.hpp>
#include <com/sun/star/text/XTextColumns.hpp>
@@ -296,7 +297,10 @@ SectionPropertyMap::SectionPropertyMap(bool bIsFirstSection) :
nSectionNumber = nNumber++;
memset(&m_pBorderLines, 0x00, sizeof(m_pBorderLines));
for( sal_Int32 nBorder = 0; nBorder < 4; ++nBorder )
+ {
m_nBorderDistances[ nBorder ] = -1;
+ m_bBorderShadows[nBorder] = false;
+ }
//todo: set defaults in ApplyPropertiesToPageStyles
//initialize defaults
PaperInfo aLetter(PAPER_LETTER);
@@ -414,11 +418,12 @@ uno::Reference< beans::XPropertySet > SectionPropertyMap::GetPageStyle(
}
-void SectionPropertyMap::SetBorder( BorderPosition ePos, sal_Int32 nLineDistance, const table::BorderLine2& rBorderLine )
+void SectionPropertyMap::SetBorder( BorderPosition ePos, sal_Int32 nLineDistance, const table::BorderLine2& rBorderLine, bool bShadow )
{
delete m_pBorderLines[ePos];
m_pBorderLines[ePos] = new table::BorderLine2( rBorderLine );
m_nBorderDistances[ePos] = nLineDistance;
+ m_bBorderShadows[ePos] = bShadow;
}
@@ -511,6 +516,22 @@ void SectionPropertyMap::ApplyBorderToPageStyles(
m_nBorderDistances[nBorder], nOffsetFrom, nLineWidth );
}
}
+
+ if (m_bBorderShadows[BORDER_RIGHT])
+ {
+ // In Word UI, shadow is a boolean property, in OOXML, it's a boolean
+ // property of each 4 border type, finally in Writer the border is a
+ // property of the page style, with shadow location, distance and
+ // color. See SwWW8ImplReader::SetShadow().
+ table::ShadowFormat aFormat;
+ aFormat.Color = COL_BLACK;
+ aFormat.Location = table::ShadowLocation_BOTTOM_RIGHT;
+ aFormat.ShadowWidth = m_pBorderLines[BORDER_RIGHT]->LineWidth;
+ if (xFirst.is())
+ xFirst->setPropertyValue(rPropNameSupplier.GetName(PROP_SHADOW_FORMAT), uno::makeAny(aFormat));
+ if (xSecond.is())
+ xSecond->setPropertyValue(rPropNameSupplier.GetName(PROP_SHADOW_FORMAT), uno::makeAny(aFormat));
+ }
}
void SectionPropertyMap::SetBorderDistance( uno::Reference< beans::XPropertySet > xStyle,
diff --git a/writerfilter/source/dmapper/PropertyMap.hxx b/writerfilter/source/dmapper/PropertyMap.hxx
index baf2d69..1c58e45 100644
--- a/writerfilter/source/dmapper/PropertyMap.hxx
+++ b/writerfilter/source/dmapper/PropertyMap.hxx
@@ -160,6 +160,7 @@ class SectionPropertyMap : public PropertyMap
::com::sun::star::table::BorderLine2* m_pBorderLines[4];
sal_Int32 m_nBorderDistances[4];
sal_Int32 m_nBorderParams;
+ bool m_bBorderShadows[4];
bool m_bTitlePage;
sal_Int16 m_nColumnCount;
@@ -230,7 +231,7 @@ public:
const ::com::sun::star::uno::Reference < ::com::sun::star::lang::XMultiServiceFactory >& xTextFactory,
bool bFirst );
- void SetBorder( BorderPosition ePos, sal_Int32 nLineDistance, const ::com::sun::star::table::BorderLine2& rBorderLine );
+ void SetBorder( BorderPosition ePos, sal_Int32 nLineDistance, const ::com::sun::star::table::BorderLine2& rBorderLine, bool bShadow );
void SetBorderParams( sal_Int32 nSet ) { m_nBorderParams = nSet; }
void SetColumnCount( sal_Int16 nCount ) { m_nColumnCount = nCount; }
commit 429b722cb63e3da76527540fb3754e11531e2cf6
Author: Miklos Vajna <vmiklos at suse.cz>
Date: Wed May 29 14:47:54 2013 +0200
bnc#817956 VML import of mso-position-vertical-relative:margin
(cherry picked from commit f2720b87093968670e3fb47d24d4952f1631a654)
Conflicts:
oox/source/vml/vmlshape.cxx
Change-Id: I86464c44022ef8c8a8037d4228bb2a6409fc77af
diff --git a/oox/source/vml/vmlshape.cxx b/oox/source/vml/vmlshape.cxx
index 9c4ff10..32ab756 100644
--- a/oox/source/vml/vmlshape.cxx
+++ b/oox/source/vml/vmlshape.cxx
@@ -413,6 +413,11 @@ void lcl_SetAnchorType(PropertySet& rPropSet, const ShapeTypeModel& rTypeModel)
else
// Map to as-character by default, that fixes vertical position of some textframes.
rPropSet.setProperty(PROP_AnchorType, text::TextContentAnchorType_AT_CHARACTER);
+
+ if ( rTypeModel.maPositionVerticalRelative == "margin" )
+ {
+ rPropSet.setProperty(PROP_VertOrientRelation, text::RelOrientation::PAGE_PRINT_AREA);
+ }
}
else if( rTypeModel.maPosition == "relative" )
{ // I'm not very sure this is correct either.
commit e242e44038dd6ffbb3f3e51148336bbdbddb90e9
Author: Miklos Vajna <vmiklos at suse.cz>
Date: Thu May 30 15:43:55 2013 +0200
bnc#817956 fix VML import of rotation
In VML, positive rotation angles are clockwise, we have them as
counter-clockwise. This wasn't noticed earlier, as the n751117.docx
testcase also had flip:x. (For example, rotation with angle 90 + flip:x
is presented as 270 by the UI.)
Fix this, and also mirror the angle when flip:x is present.
(cherry picked from commit b2c16f6c1b8bd3c96e0549eb3036c820094a795f
Conflicts:
oox/source/vml/vmlshape.cxx
Change-Id: I591ec3369a5bdca53f9684006a459d11e37fbc33
diff --git a/oox/source/vml/vmlshape.cxx b/oox/source/vml/vmlshape.cxx
index 1c22024..9c4ff10 100644
--- a/oox/source/vml/vmlshape.cxx
+++ b/oox/source/vml/vmlshape.cxx
@@ -27,6 +27,7 @@
************************************************************************/
#include <algorithm>
+#include <boost/optional.hpp>
#include "oox/vml/vmlshape.hxx"
@@ -49,6 +50,7 @@
#include <rtl/math.hxx>
#include <rtl/ustrbuf.hxx>
#include <rtl/oustringostreaminserter.hxx>
+#include <svx/svdtrans.hxx>
#include "oox/drawingml/shapepropertymap.hxx"
#include "oox/helper/graphichelper.hxx"
#include "oox/helper/propertyset.hxx"
@@ -91,21 +93,21 @@ const sal_Int32 VML_SHAPETYPE_HOSTCONTROL = 201;
// ----------------------------------------------------------------------------
-Point lclGetAbsPoint( const Point& rRelPoint, const Rectangle& rShapeRect, const Rectangle& rCoordSys )
+awt::Point lclGetAbsPoint( const awt::Point& rRelPoint, const awt::Rectangle& rShapeRect, const awt::Rectangle& rCoordSys )
{
double fWidthRatio = static_cast< double >( rShapeRect.Width ) / rCoordSys.Width;
double fHeightRatio = static_cast< double >( rShapeRect.Height ) / rCoordSys.Height;
- Point aAbsPoint;
+ awt::Point aAbsPoint;
aAbsPoint.X = static_cast< sal_Int32 >( rShapeRect.X + fWidthRatio * (rRelPoint.X - rCoordSys.X) + 0.5 );
aAbsPoint.Y = static_cast< sal_Int32 >( rShapeRect.Y + fHeightRatio * (rRelPoint.Y - rCoordSys.Y) + 0.5 );
return aAbsPoint;
}
-Rectangle lclGetAbsRect( const Rectangle& rRelRect, const Rectangle& rShapeRect, const Rectangle& rCoordSys )
+awt::Rectangle lclGetAbsRect( const awt::Rectangle& rRelRect, const awt::Rectangle& rShapeRect, const awt::Rectangle& rCoordSys )
{
double fWidthRatio = static_cast< double >( rShapeRect.Width ) / rCoordSys.Width;
double fHeightRatio = static_cast< double >( rShapeRect.Height ) / rCoordSys.Height;
- Rectangle aAbsRect;
+ awt::Rectangle aAbsRect;
aAbsRect.X = static_cast< sal_Int32 >( rShapeRect.X + fWidthRatio * (rRelRect.X - rCoordSys.X) + 0.5 );
aAbsRect.Y = static_cast< sal_Int32 >( rShapeRect.Y + fHeightRatio * (rRelRect.Y - rCoordSys.Y) + 0.5 );
aAbsRect.Width = static_cast< sal_Int32 >( fWidthRatio * rRelRect.Width + 0.5 );
@@ -156,21 +158,21 @@ OUString ShapeType::getGraphicPath() const
return maTypeModel.moGraphicPath.get( OUString() );
}
-Rectangle ShapeType::getCoordSystem() const
+awt::Rectangle ShapeType::getCoordSystem() const
{
Int32Pair aCoordPos = maTypeModel.moCoordPos.get( Int32Pair( 0, 0 ) );
Int32Pair aCoordSize = maTypeModel.moCoordSize.get( Int32Pair( 1000, 1000 ) );
- return Rectangle( aCoordPos.first, aCoordPos.second, aCoordSize.first, aCoordSize.second );
+ return awt::Rectangle( aCoordPos.first, aCoordPos.second, aCoordSize.first, aCoordSize.second );
}
-Rectangle ShapeType::getRectangle( const ShapeParentAnchor* pParentAnchor ) const
+awt::Rectangle ShapeType::getRectangle( const ShapeParentAnchor* pParentAnchor ) const
{
return pParentAnchor ?
lclGetAbsRect( getRelRectangle(), pParentAnchor->maShapeRect, pParentAnchor->maCoordSys ) :
getAbsRectangle();
}
-Rectangle ShapeType::getAbsRectangle() const
+awt::Rectangle ShapeType::getAbsRectangle() const
{
const GraphicHelper& rGraphicHelper = mrDrawing.getFilter().getGraphicHelper();
@@ -182,15 +184,15 @@ Rectangle ShapeType::getAbsRectangle() const
if ( nHeight == 0 )
nHeight = 1;
- return Rectangle(
+ return awt::Rectangle(
ConversionHelper::decodeMeasureToHmm( rGraphicHelper, maTypeModel.maLeft, 0, true, true ) + ConversionHelper::decodeMeasureToHmm( rGraphicHelper, maTypeModel.maMarginLeft, 0, true, true ),
ConversionHelper::decodeMeasureToHmm( rGraphicHelper, maTypeModel.maTop, 0, false, true ) + ConversionHelper::decodeMeasureToHmm( rGraphicHelper, maTypeModel.maMarginTop, 0, false, true ),
nWidth, nHeight );
}
-Rectangle ShapeType::getRelRectangle() const
+awt::Rectangle ShapeType::getRelRectangle() const
{
- return Rectangle(
+ return awt::Rectangle(
maTypeModel.maLeft.toInt32(),
maTypeModel.maTop.toInt32(),
maTypeModel.maWidth.toInt32(),
@@ -296,7 +298,7 @@ Reference< XShape > ShapeBase::convertAndInsert( const Reference< XShapes >& rxS
{
/* Calculate shape rectangle. Applications may do something special
according to some imported shape client data (e.g. Excel cell anchor). */
- Rectangle aShapeRect = calcShapeRectangle( pParentAnchor );
+ awt::Rectangle aShapeRect = calcShapeRectangle( pParentAnchor );
if( ((aShapeRect.Width > 0) || (aShapeRect.Height > 0)) && rxShapes.is() )
{
@@ -332,13 +334,13 @@ void ShapeBase::convertFormatting( const Reference< XShape >& rxShape, const Sha
{
/* Calculate shape rectangle. Applications may do something special
according to some imported shape client data (e.g. Excel cell anchor). */
- Rectangle aShapeRect = calcShapeRectangle( pParentAnchor );
+ awt::Rectangle aShapeRect = calcShapeRectangle( pParentAnchor );
// convert the shape, if the calculated rectangle is not empty
if( (aShapeRect.Width > 0) || (aShapeRect.Height > 0) )
{
- rxShape->setPosition( Point( aShapeRect.X, aShapeRect.Y ) );
- rxShape->setSize( Size( aShapeRect.Width, aShapeRect.Height ) );
+ rxShape->setPosition( awt::Point( aShapeRect.X, aShapeRect.Y ) );
+ rxShape->setSize( awt::Size( aShapeRect.Width, aShapeRect.Height ) );
convertShapeProperties( rxShape );
}
}
@@ -346,11 +348,11 @@ void ShapeBase::convertFormatting( const Reference< XShape >& rxShape, const Sha
// protected ------------------------------------------------------------------
-Rectangle ShapeBase::calcShapeRectangle( const ShapeParentAnchor* pParentAnchor ) const
+awt::Rectangle ShapeBase::calcShapeRectangle( const ShapeParentAnchor* pParentAnchor ) const
{
/* Calculate shape rectangle. Applications may do something special
according to some imported shape client data (e.g. Excel cell anchor). */
- Rectangle aShapeRect;
+ awt::Rectangle aShapeRect;
const ClientData* pClientData = getClientData();
if( !pClientData || !mrDrawing.convertClientAnchor( aShapeRect, pClientData->maAnchor ) )
aShapeRect = getRectangle( pParentAnchor );
@@ -422,15 +424,20 @@ void lcl_SetAnchorType(PropertySet& rPropSet, const ShapeTypeModel& rTypeModel)
}
}
-Reference< XShape > SimpleShape::implConvertAndInsert( const Reference< XShapes >& rxShapes, const Rectangle& rShapeRect ) const
+Reference< XShape > SimpleShape::implConvertAndInsert( const Reference< XShapes >& rxShapes, const awt::Rectangle& rShapeRect ) const
{
- Rectangle aShapeRect(rShapeRect);
+ awt::Rectangle aShapeRect(rShapeRect);
+ boost::optional<sal_Int32> oRotation;
+ if (!maTypeModel.maRotation.isEmpty())
+ oRotation.reset(maTypeModel.maRotation.toInt32());
if (!maTypeModel.maFlip.isEmpty())
{
if (maTypeModel.maFlip.equalsAscii("x"))
{
aShapeRect.X += aShapeRect.Width;
aShapeRect.Width *= -1;
+ if (oRotation)
+ oRotation.reset(360 - *oRotation);
}
else if (maTypeModel.maFlip.equalsAscii("y"))
{
@@ -497,9 +504,11 @@ Reference< XShape > SimpleShape::implConvertAndInsert( const Reference< XShapes
}
PropertySet aPropertySet(xShape);
- if (xShape.is() && !maTypeModel.maRotation.isEmpty())
+ if (xShape.is() && oRotation)
{
- aPropertySet.setAnyProperty(PROP_RotateAngle, makeAny(maTypeModel.maRotation.toInt32() * 100));
+ // See DffPropertyReader::Fix16ToAngle(): in VML, positive rotation angles are clockwise, we have them as counter-clockwise.
+ // Additionally, VML type is 0..360, our is 0.36000.
+ aPropertySet.setAnyProperty(PROP_RotateAngle, makeAny(sal_Int32(NormAngle360((*oRotation) * -100))));
// If rotation is used, simple setPosition() is not enough.
aPropertySet.setAnyProperty(PROP_HoriOrientPosition, makeAny( aShapeRect.X ) );
aPropertySet.setAnyProperty(PROP_VertOrientPosition, makeAny( aShapeRect.Y ) );
@@ -510,7 +519,7 @@ Reference< XShape > SimpleShape::implConvertAndInsert( const Reference< XShapes
return xShape;
}
-Reference< XShape > SimpleShape::createPictureObject( const Reference< XShapes >& rxShapes, const Rectangle& rShapeRect, OUString& rGraphicPath ) const
+Reference< XShape > SimpleShape::createPictureObject( const Reference< XShapes >& rxShapes, const awt::Rectangle& rShapeRect, OUString& rGraphicPath ) const
{
Reference< XShape > xShape = mrDrawing.createAndInsertXShape( "com.sun.star.drawing.GraphicObjectShape", rxShapes, rShapeRect );
if( xShape.is() )
@@ -548,7 +557,7 @@ RectangleShape::RectangleShape( Drawing& rDrawing ) :
{
}
-Reference<XShape> RectangleShape::implConvertAndInsert(const Reference<XShapes>& rxShapes, const Rectangle& rShapeRect) const
+Reference<XShape> RectangleShape::implConvertAndInsert(const Reference<XShapes>& rxShapes, const awt::Rectangle& rShapeRect) const
{
OUString aGraphicPath = getGraphicPath();
@@ -589,14 +598,14 @@ PolyLineShape::PolyLineShape( Drawing& rDrawing ) :
{
}
-Reference< XShape > PolyLineShape::implConvertAndInsert( const Reference< XShapes >& rxShapes, const Rectangle& rShapeRect ) const
+Reference< XShape > PolyLineShape::implConvertAndInsert( const Reference< XShapes >& rxShapes, const awt::Rectangle& rShapeRect ) const
{
Reference< XShape > xShape = SimpleShape::implConvertAndInsert( rxShapes, rShapeRect );
// polygon path
- Rectangle aCoordSys = getCoordSystem();
+ awt::Rectangle aCoordSys = getCoordSystem();
if( !maShapeModel.maPoints.empty() && (aCoordSys.Width > 0) && (aCoordSys.Height > 0) )
{
- ::std::vector< Point > aAbsPoints;
+ ::std::vector< awt::Point > aAbsPoints;
for( ShapeModel::PointVector::const_iterator aIt = maShapeModel.maPoints.begin(), aEnd = maShapeModel.maPoints.end(); aIt != aEnd; ++aIt )
aAbsPoints.push_back( lclGetAbsPoint( *aIt, rShapeRect, aCoordSys ) );
PointSequenceSequence aPointSeq( 1 );
@@ -646,7 +655,7 @@ CustomShape::CustomShape( Drawing& rDrawing ) :
{
}
-Reference< XShape > CustomShape::implConvertAndInsert( const Reference< XShapes >& rxShapes, const Rectangle& rShapeRect ) const
+Reference< XShape > CustomShape::implConvertAndInsert( const Reference< XShapes >& rxShapes, const awt::Rectangle& rShapeRect ) const
{
// try to create a custom shape
Reference< XShape > xShape = SimpleShape::implConvertAndInsert( rxShapes, rShapeRect );
@@ -671,7 +680,7 @@ ComplexShape::ComplexShape( Drawing& rDrawing ) :
{
}
-Reference< XShape > ComplexShape::implConvertAndInsert( const Reference< XShapes >& rxShapes, const Rectangle& rShapeRect ) const
+Reference< XShape > ComplexShape::implConvertAndInsert( const Reference< XShapes >& rxShapes, const awt::Rectangle& rShapeRect ) const
{
XmlFilterBase& rFilter = mrDrawing.getFilter();
sal_Int32 nShapeType = getShapeType();
@@ -687,7 +696,7 @@ Reference< XShape > ComplexShape::implConvertAndInsert( const Reference< XShapes
return Reference< XShape >();
PropertyMap aOleProps;
- Size aOleSize( rShapeRect.Width, rShapeRect.Height );
+ awt::Size aOleSize( rShapeRect.Width, rShapeRect.Height );
if( rFilter.getOleObjectHelper().importOleObject( aOleProps, *pOleObjectInfo, aOleSize ) )
{
Reference< XShape > xShape = mrDrawing.createAndInsertXShape( CREATE_OUSTRING( "com.sun.star.drawing.OLE2Shape" ), rxShapes, rShapeRect );
@@ -779,7 +788,7 @@ const ShapeBase* GroupShape::getChildById( const OUString& rShapeId ) const
return mxChildren->getShapeById( rShapeId, true );
}
-Reference< XShape > GroupShape::implConvertAndInsert( const Reference< XShapes >& rxShapes, const Rectangle& rShapeRect ) const
+Reference< XShape > GroupShape::implConvertAndInsert( const Reference< XShapes >& rxShapes, const awt::Rectangle& rShapeRect ) const
{
Reference< XShape > xGroupShape;
// check that this shape contains children and a valid coordinate system
commit 0819da6b65d6fafde81fa55e3744f49ed11ad53d
Author: Miklos Vajna <vmiklos at suse.cz>
Date: Tue May 28 17:44:25 2013 +0200
bnc#817956 VML import of v:textpath
Word exposes this as Watermark in its UI.
(cherry picked from commit 290695c785ef831abb6e78cd3675bc071f05f643)
Conflicts:
oox/inc/oox/vml/vmlformatting.hxx
oox/inc/oox/vml/vmlshape.hxx
oox/source/vml/vmlformatting.cxx
oox/source/vml/vmlshapecontext.cxx
Change-Id: I23d9b2aab2dab60a98c7f456b0592c2b74bcaf81
diff --git a/oox/inc/oox/vml/vmlformatting.hxx b/oox/inc/oox/vml/vmlformatting.hxx
index 428e2bd..4d80fc1 100644
--- a/oox/inc/oox/vml/vmlformatting.hxx
+++ b/oox/inc/oox/vml/vmlformatting.hxx
@@ -31,6 +31,11 @@
#include "oox/helper/helper.hxx"
#include "oox/dllapi.h"
+#include <com/sun/star/awt/Point.hpp>
+#include <com/sun/star/drawing/PolyPolygonBezierCoords.hpp>
+#include <com/sun/star/drawing/XShape.hpp>
+
+#include <vector>
namespace oox {
class GraphicHelper;
@@ -213,6 +218,17 @@ struct FillModel
// ============================================================================
+/** The shadow model structure contains all shape textpath properties. */
+struct OOX_DLLPUBLIC TextpathModel
+{
+ OptValue<rtl::OUString> moString; ///< Specifies the string of the textpath.
+
+ TextpathModel();
+
+ /** Writes the properties to the passed property map. */
+ void pushToPropMap(oox::drawingml::ShapePropertyMap& rPropMap, com::sun::star::uno::Reference<com::sun::star::drawing::XShape> xShape) const;
+};
+
} // namespace vml
} // namespace oox
diff --git a/oox/inc/oox/vml/vmlshape.hxx b/oox/inc/oox/vml/vmlshape.hxx
index 7216941..e73eaa8 100644
--- a/oox/inc/oox/vml/vmlshape.hxx
+++ b/oox/inc/oox/vml/vmlshape.hxx
@@ -96,6 +96,7 @@ struct ShapeTypeModel
StrokeModel maStrokeModel; ///< Border line formatting.
FillModel maFillModel; ///< Shape fill formatting.
::rtl::OUString maArcsize; /// round rectangles arc size
+ TextpathModel maTextpathModel; ///< Shape textpath formatting.
OptValue< ::rtl::OUString > moGraphicPath; ///< Path to a graphic for this shape.
OptValue< ::rtl::OUString > moGraphicTitle; ///< Title of the graphic.
diff --git a/oox/source/vml/vmlformatting.cxx b/oox/source/vml/vmlformatting.cxx
index 6d20276..63f54d6 100644
--- a/oox/source/vml/vmlformatting.cxx
+++ b/oox/source/vml/vmlformatting.cxx
@@ -28,6 +28,10 @@
#include "oox/vml/vmlformatting.hxx"
+#include <com/sun/star/beans/PropertyValue.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/drawing/EnhancedCustomShapeTextPathMode.hpp>
+#include <com/sun/star/text/XTextRange.hpp>
#include <rtl/strbuf.hxx>
#include "oox/drawingml/color.hxx"
#include "oox/drawingml/drawingmltypes.hxx"
@@ -43,6 +47,7 @@ namespace vml {
// ============================================================================
using namespace ::com::sun::star::geometry;
+using namespace ::com::sun::star;
using ::oox::drawingml::Color;
using ::oox::drawingml::FillProperties;
@@ -587,6 +592,57 @@ void FillModel::pushToPropMap( ShapePropertyMap& rPropMap, const GraphicHelper&
// ============================================================================
+TextpathModel::TextpathModel()
+{
+}
+
+beans::PropertyValue lcl_createTextpathProps()
+{
+ uno::Sequence<beans::PropertyValue> aTextpathPropSeq(4);
+ aTextpathPropSeq[0].Name = "TextPath";
+ aTextpathPropSeq[0].Value <<= sal_True;
+ aTextpathPropSeq[1].Name = "TextPathMode";
+ aTextpathPropSeq[1].Value <<= drawing::EnhancedCustomShapeTextPathMode_SHAPE;
+ aTextpathPropSeq[2].Name = "ScaleX";
+ aTextpathPropSeq[2].Value <<= sal_False;
+ aTextpathPropSeq[3].Name = "SameLetterHeights";
+ aTextpathPropSeq[3].Value <<= sal_False;
+
+ beans::PropertyValue aRet;
+ aRet.Name = "TextPath";
+ aRet.Value <<= aTextpathPropSeq;
+ return aRet;
+}
+
+void TextpathModel::pushToPropMap(ShapePropertyMap& rPropMap, uno::Reference<drawing::XShape> xShape) const
+{
+ if (moString.has())
+ {
+ uno::Reference<text::XTextRange> xTextRange(xShape, uno::UNO_QUERY);
+ xTextRange->setString(moString.get());
+
+ uno::Reference<beans::XPropertySet> xPropertySet(xShape, uno::UNO_QUERY);
+ uno::Sequence<beans::PropertyValue> aGeomPropSeq = xPropertySet->getPropertyValue("CustomShapeGeometry").get< uno::Sequence<beans::PropertyValue> >();
+ bool bFound = false;
+ for (int i = 0; i < aGeomPropSeq.getLength(); ++i)
+ {
+ beans::PropertyValue& rProp = aGeomPropSeq[i];
+ if (rProp.Name == "TextPath")
+ {
+ bFound = true;
+ rProp = lcl_createTextpathProps();
+ }
+ }
+ if (!bFound)
+ {
+ sal_Int32 nSize = aGeomPropSeq.getLength();
+ aGeomPropSeq.realloc(nSize+1);
+ aGeomPropSeq[nSize] = lcl_createTextpathProps();
+ }
+ rPropMap.setAnyProperty(PROP_CustomShapeGeometry, uno::makeAny(aGeomPropSeq));
+ }
+}
+
} // namespace vml
} // namespace oox
diff --git a/oox/source/vml/vmlshape.cxx b/oox/source/vml/vmlshape.cxx
index e61820c..1c22024 100644
--- a/oox/source/vml/vmlshape.cxx
+++ b/oox/source/vml/vmlshape.cxx
@@ -371,6 +371,8 @@ void ShapeBase::convertShapeProperties( const Reference< XShape >& rxShape ) con
aPropMap.setProperty(PROP_BackColor, aPropMap[PROP_FillColor]);
aPropMap.erase(PROP_FillColor);
}
+ else if (xSInfo->supportsService("com.sun.star.drawing.CustomShape"))
+ maTypeModel.maTextpathModel.pushToPropMap(aPropMap, rxShape);
PropertySet( rxShape ).setProperties( aPropMap );
}
diff --git a/oox/source/vml/vmlshapecontext.cxx b/oox/source/vml/vmlshapecontext.cxx
index 4e21ce9..15010db 100644
--- a/oox/source/vml/vmlshapecontext.cxx
+++ b/oox/source/vml/vmlshapecontext.cxx
@@ -339,6 +339,9 @@ ContextHandlerRef ShapeTypeContext::onCreateContext( sal_Int32 nElement, const A
mrTypeModel.moWrapAnchorY = rAttribs.getString(XML_anchory);
break;
break;
+ case VML_TOKEN( textpath ):
+ mrTypeModel.maTextpathModel.moString.assignIfUsed(rAttribs.getString(XML_string));
+ break;
}
return 0;
}
commit a481759a903e077bc09a7160ff658f5afa9379c8
Author: Miklos Vajna <vmiklos at suse.cz>
Date: Tue May 28 16:11:38 2013 +0200
bnc#817956 DOCX import: missing last character of shape text
Make sure writerfilter only removes the last character of the text if
it's a newline.
Change-Id: I96980e2d148ced93363b3147545afdd0dd070e5d
(cherry picked from commit 4eaabc45f76aefe82558b283975ab9df3aea7fce)
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
index 827b72a..ccabf6b5 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
@@ -321,7 +321,10 @@ void DomainMapper_Impl::RemoveLastParagraph( )
else
{
xCursor->goLeft( 1, true );
- xCursor->setString(OUString());
+ // If this is a text on a shape, possibly the text has the trailing
+ // newline removed already.
+ if (xCursor->getString() == "\n")
+ xCursor->setString(OUString());
}
}
catch( const uno::Exception& rEx)
commit b532f43821d83134e413186d385060a75d851cf7
Author: Miklos Vajna <vmiklos at suse.cz>
Date: Mon May 27 17:09:44 2013 +0200
bnc#817956 DOCX import of document background color
See wwSectionManager::SetSegmentToPageDesc(), this has to be applied to
every page style.
(cherry picked from commit 992da0d5cf04497bad55637f6a6ebfcdaec03e16)
Conflicts:
sw/qa/extras/ooxmlimport/ooxmlimport.cxx
Change-Id: Iea2707ae665a55eabda3ed7575cf3658f7af5237
diff --git a/writerfilter/source/dmapper/DomainMapper.cxx b/writerfilter/source/dmapper/DomainMapper.cxx
index 58cbb4d..1dd4acf 100644
--- a/writerfilter/source/dmapper/DomainMapper.cxx
+++ b/writerfilter/source/dmapper/DomainMapper.cxx
@@ -1506,6 +1506,9 @@ void DomainMapper::lcl_attribute(Id nName, Value & val)
case NS_ooxml::LN_CT_SdtListItem_value:
m_pImpl->m_pSdtHelper->getDropDownItems().push_back(sStringValue);
break;
+ case NS_ooxml::LN_CT_Background_color:
+ m_pImpl->m_oBackgroundColor.reset(nIntValue);
+ break;
default:
{
#if OSL_DEBUG_LEVEL > 0
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.hxx b/writerfilter/source/dmapper/DomainMapper_Impl.hxx
index cc6fd63..5906a42 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.hxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.hxx
@@ -661,6 +661,9 @@ public:
bool IsNewDoc();
SdtHelper* m_pSdtHelper;
+
+ /// Document background color, applied to every page style.
+ boost::optional<sal_Int32> m_oBackgroundColor;
};
} //namespace dmapper
} //namespace writerfilter
diff --git a/writerfilter/source/dmapper/PropertyMap.cxx b/writerfilter/source/dmapper/PropertyMap.cxx
index 4dcea8e..4781a67 100644
--- a/writerfilter/source/dmapper/PropertyMap.cxx
+++ b/writerfilter/source/dmapper/PropertyMap.cxx
@@ -885,6 +885,9 @@ void SectionPropertyMap::CloseSectionGroup( DomainMapper_Impl& rDM_Impl )
operator[]( PropertyDefinition( PROP_LEFT_MARGIN, false )) = uno::makeAny( m_nLeftMargin );
operator[]( PropertyDefinition( PROP_RIGHT_MARGIN, false )) = uno::makeAny( m_nRightMargin );
+ if (rDM_Impl.m_oBackgroundColor)
+ operator[](PropertyDefinition(PROP_BACK_COLOR, false)) = uno::makeAny(*rDM_Impl.m_oBackgroundColor);
+
/*** if headers/footers are available then the top/bottom margins of the
header/footer are copied to the top/bottom margin of the page
*/
diff --git a/writerfilter/source/ooxml/model.xml b/writerfilter/source/ooxml/model.xml
index 47971ff..a4d4069 100644
--- a/writerfilter/source/ooxml/model.xml
+++ b/writerfilter/source/ooxml/model.xml
@@ -14974,7 +14974,7 @@
<ref name="CT_PictureBase"/>
<optional>
<attribute name="color">
- <text/>
+ <ref name="ST_HexColor"/>
<xs:documentation>Background Color</xs:documentation>
</attribute>
</optional>
commit 487e34c741231b939b314442b091edb6ab7216a8
Author: Eilidh McAdam <eilidh at lanedo.com>
Date: Thu Nov 15 00:29:58 2012 +0000
Support added for fine dashing on table borders.
When reading in docx documents, fine dashing provides a better visual
match for some border types.
Added in this patch:
- FINE_DASHED in BorderLineStyle UNO enum and in internals
- Import of docx table borders using this border style
Change-Id: I39cfa18c915ec94d8e4ecfc6a2ca637076d1e468
Reviewed-on: https://gerrit.libreoffice.org/1123
Reviewed-by: Fridrich Strba <fridrich at documentfoundation.org>
Tested-by: Fridrich Strba <fridrich at documentfoundation.org>
(cherry picked from commit 7d632ff29e601c2e680c4a689997fbf552592a4b)
diff --git a/editeng/source/items/borderline.cxx b/editeng/source/items/borderline.cxx
index 6fdefe2..0ce62a7 100644
--- a/editeng/source/items/borderline.cxx
+++ b/editeng/source/items/borderline.cxx
@@ -140,9 +140,11 @@ ConvertBorderStyleFromWord(int const nWordLineStyle)
return DOTTED;
break;
case 7:
- case 22:
return DASHED;
break;
+ case 22:
+ return FINE_DASHED;
+ break;
// then the shading beams which we represent by a double line
case 23:
return DOUBLE;
@@ -228,6 +230,10 @@ ConvertBorderWidthFromWord(SvxBorderStyle const eStyle, double const fWidth,
case DOTTED:
case DASHED:
return fWidth;
+
+ // Display a minimum effective border width of 1pt
+ case FINE_DASHED:
+ return (fWidth > 0 && fWidth < 20) ? 20 : fWidth;
break;
// Double lines
@@ -282,6 +288,7 @@ ConvertBorderWidthToWord(SvxBorderStyle const eStyle, double const fWidth)
case SOLID:
case DOTTED:
case DASHED:
+ case FINE_DASHED:
return fWidth;
break;
@@ -347,6 +354,7 @@ BorderWidthImpl SvxBorderLine::getWidthImpl( SvxBorderStyle nStyle )
case SOLID:
case DOTTED:
case DASHED:
+ case FINE_DASHED:
aImpl = BorderWidthImpl( CHANGE_LINE1, 1.0 );
break;
@@ -526,6 +534,7 @@ void SvxBorderLine::GuessLinesWidths( SvxBorderStyle nStyle, sal_uInt16 nOut, sa
case SOLID:
case DOTTED:
case DASHED:
+ case FINE_DASHED:
::std::swap( nOut, nIn);
break;
default:
diff --git a/editeng/source/items/frmitems.cxx b/editeng/source/items/frmitems.cxx
index dbcde63..c1953df 100644
--- a/editeng/source/items/frmitems.cxx
+++ b/editeng/source/items/frmitems.cxx
@@ -1808,7 +1808,7 @@ sal_Bool
SvxBoxItem::LineToSvxLine(const ::com::sun::star::table::BorderLine2& rLine, SvxBorderLine& rSvxLine, sal_Bool bConvert)
{
SvxBorderStyle const nStyle =
- (rLine.LineStyle < 0 || INSET < rLine.LineStyle)
+ (rLine.LineStyle < 0 || BORDER_LINE_STYLE_MAX < rLine.LineStyle)
? SOLID // default
: rLine.LineStyle;
diff --git a/offapi/com/sun/star/table/BorderLineStyle.idl b/offapi/com/sun/star/table/BorderLineStyle.idl
index 29cfe0d..781473e 100644
--- a/offapi/com/sun/star/table/BorderLineStyle.idl
+++ b/offapi/com/sun/star/table/BorderLineStyle.idl
@@ -101,6 +101,14 @@ constants BorderLineStyle
/** Inset border line.
*/
const short INSET = 13;
+
+ /** Finely dashed border line.
+ */
+ const short FINE_DASHED = 14;
+
+ /** Maximum valid border line style value.
+ */
+ const short BORDER_LINE_STYLE_MAX = 14;
};
//=============================================================================
diff --git a/svtools/inc/svtools/ctrlbox.hxx b/svtools/inc/svtools/ctrlbox.hxx
index 5cb20ef..dac419d 100644
--- a/svtools/inc/svtools/ctrlbox.hxx
+++ b/svtools/inc/svtools/ctrlbox.hxx
@@ -54,6 +54,7 @@ typedef ::std::vector< ImplFontNameListData* > ImplFontList;
#define STYLE_SOLID ( ( sal_uInt16 ) 0 )
#define STYLE_DOTTED ( ( sal_uInt16 ) 1 )
#define STYLE_DASHED ( ( sal_uInt16 ) 2 )
+#define STYLE_FINE_DASHED ( ( sal_uInt16 ) 14 )
#define STYLE_NONE ( ( sal_uInt16 ) -1)
#define CHANGE_LINE1 ( ( sal_uInt16 ) 1 )
diff --git a/svtools/source/control/ctrlbox.cxx b/svtools/source/control/ctrlbox.cxx
index 4a44d03..554cbf3 100644
--- a/svtools/source/control/ctrlbox.cxx
+++ b/svtools/source/control/ctrlbox.cxx
@@ -596,6 +596,13 @@ namespace svtools
aPattern.push_back( 20 );
}
break;
+ case STYLE_FINE_DASHED:
+ if ( eUnit == MAP_PIXEL )
+ {
+ aPattern.push_back( 4 );
+ aPattern.push_back( 1 );
+ }
+ break;
default:
break;
}
More information about the Libreoffice-commits
mailing list