Files
loongoffice/oox/source/drawingml/transform2dcontext.cxx
Zolnai Tamás 98dd0f2bb5 Related bnc#862510: extend handling of txXfrm
We don't actually need to check mbAnchorCtr to change
text spacing. This txXfrm workaround works only with rectangles,
because other shapes' text area can be smaller then the shape
size. So add some condition to avoid using it for
other shapes.

Plus fix typos cause regression introduced in:
53c376d35b7223d53e8c9403390afe53d1f69089

Change-Id: I87917b8e0b2bb97ae1bba773e7dda7f81682736f
2014-06-10 19:08:59 +02:00

122 lines
5.4 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
#include "oox/drawingml/transform2dcontext.hxx"
#include "oox/helper/attributelist.hxx"
#include "oox/drawingml/shape.hxx"
#include "oox/drawingml/textbody.hxx"
using namespace ::com::sun::star;
using ::com::sun::star::uno::Reference;
using ::com::sun::star::uno::RuntimeException;
using ::com::sun::star::xml::sax::SAXException;
using ::com::sun::star::xml::sax::XFastAttributeList;
using ::com::sun::star::xml::sax::XFastContextHandler;
using ::oox::core::ContextHandlerRef;
namespace oox {
namespace drawingml {
/** context to import a CT_Transform2D */
Transform2DContext::Transform2DContext( ContextHandler2Helper& rParent, const AttributeList& rAttribs, Shape& rShape, bool btxXfrm ) throw()
: ContextHandler2( rParent )
, mrShape( rShape )
, mbtxXfrm ( btxXfrm )
{
if( !btxXfrm )
{
mrShape.setRotation( rAttribs.getInteger( XML_rot, 0 ) ); // 60000ths of a degree Positive angles are clockwise; negative angles are counter-clockwise
mrShape.setFlip( rAttribs.getBool( XML_flipH, false ), rAttribs.getBool( XML_flipV, false ) );
}
else
{
if( rAttribs.hasAttribute( XML_rot ) )
mrShape.getTextBody()->getTextProperties().moRotation = -rAttribs.getInteger( XML_rot ).get();
}
}
ContextHandlerRef Transform2DContext::onCreateContext( sal_Int32 aElementToken, const AttributeList& rAttribs )
{
if( mbtxXfrm )
{
// Workaround: only for rectangles
const sal_Int32 nType = mrShape.getCustomShapeProperties()->getShapePresetType();
if( nType == XML_rect || nType == XML_roundRect )
{
switch( aElementToken )
{
case A_TOKEN( off ):
{
const OUString sXValue = rAttribs.getString( XML_x ).get();
const OUString sYValue = rAttribs.getString( XML_y ).get();
if( !sXValue.isEmpty() && nType == XML_rect )
mrShape.getTextBody()->getTextProperties().moTextOffLeft = GetCoordinate( sXValue.toInt32() - mrShape.getPosition().X );
if( !sYValue.isEmpty() )
mrShape.getTextBody()->getTextProperties().moTextOffUpper = GetCoordinate( sYValue.toInt32() - mrShape.getPosition().Y );
}
break;
case A_TOKEN( ext ):
{
const OUString sXValue = rAttribs.getString( XML_cx ).get();
const OUString sYValue = rAttribs.getString( XML_cy ).get();
if( !sXValue.isEmpty() && nType == XML_rect )
{
mrShape.getTextBody()->getTextProperties().moTextOffRight = GetCoordinate(mrShape.getSize().Width - sXValue.toInt32());
if( mrShape.getTextBody()->getTextProperties().moTextOffLeft )
*mrShape.getTextBody()->getTextProperties().moTextOffRight -= *mrShape.getTextBody()->getTextProperties().moTextOffLeft;
}
if( !sYValue.isEmpty() )
{
mrShape.getTextBody()->getTextProperties().moTextOffLower = GetCoordinate(mrShape.getSize().Height - sYValue.toInt32());
if( mrShape.getTextBody()->getTextProperties().moTextOffUpper )
*mrShape.getTextBody()->getTextProperties().moTextOffLower -= *mrShape.getTextBody()->getTextProperties().moTextOffUpper;
}
}
break;
}
}
return 0;
}
switch( aElementToken )
{
case A_TOKEN( off ): // horz/vert translation
mrShape.setPosition( awt::Point( rAttribs.getString( XML_x ).get().toInt32(), rAttribs.getString( XML_y ).get().toInt32() ) );
break;
case A_TOKEN( ext ): // horz/vert size
mrShape.setSize( awt::Size( rAttribs.getString( XML_cx ).get().toInt32(), rAttribs.getString( XML_cy ).get().toInt32() ) );
break;
case A_TOKEN( chOff ): // horz/vert translation of children
mrShape.setChildPosition( awt::Point( rAttribs.getString( XML_x ).get().toInt32(), rAttribs.getString( XML_y ).get().toInt32() ) );
break;
case A_TOKEN( chExt ): // horz/vert size of children
mrShape.setChildSize( awt::Size( rAttribs.getString( XML_cx ).get().toInt32(), rAttribs.getString( XML_cy ).get().toInt32() ) );
break;
}
return 0;
}
} // namespace drawingml
} // namespace oox
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */