/************************************************************** * * 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 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_chart2.hxx" #include "VTitle.hxx" #include "CommonConverters.hxx" #include "macros.hxx" #include "PropertyMapper.hxx" #include "ShapeFactory.hxx" #include "RelativeSizeHelper.hxx" #include #include #include #include #include #include #include #include //............................................................................. namespace chart { //............................................................................. using namespace ::com::sun::star; using namespace ::com::sun::star::chart2; VTitle::VTitle( const uno::Reference< XTitle > & xTitle ) : m_xTarget(NULL) , m_xShapeFactory(NULL) , m_xTitle(xTitle) , m_xShape(NULL) , m_aCID() , m_fRotationAngleDegree(0.0) , m_nXPos(0) , m_nYPos(0) { } VTitle::~VTitle() { } void VTitle::init( const uno::Reference< drawing::XShapes >& xTargetPage , const uno::Reference< lang::XMultiServiceFactory >& xFactory , const rtl::OUString& rCID ) { m_xTarget = xTargetPage; m_xShapeFactory = xFactory; m_aCID = rCID; } double VTitle::getRotationAnglePi() const { return m_fRotationAngleDegree*F_PI/180.0; } awt::Size VTitle::getUnrotatedSize() const //size before rotation { awt::Size aRet; if(m_xShape.is()) aRet = m_xShape->getSize(); return aRet; } awt::Size VTitle::getFinalSize() const //size after rotation { return ShapeFactory::getSizeAfterRotation( m_xShape, m_fRotationAngleDegree ); } void VTitle::changePosition( const awt::Point& rPos ) { if(!m_xShape.is()) return; uno::Reference< beans::XPropertySet > xShapeProp( m_xShape, uno::UNO_QUERY ); if(!xShapeProp.is()) return; try { m_nXPos = rPos.X; m_nYPos = rPos.Y; //set position matrix //the matrix needs to be set at the end behind autogrow and such position influencing properties ::basegfx::B2DHomMatrix aM; aM.rotate( -m_fRotationAngleDegree*F_PI/180.0 );//#i78696#->#i80521# aM.translate( m_nXPos, m_nYPos); xShapeProp->setPropertyValue( C2U( "Transformation" ), uno::makeAny( B2DHomMatrixToHomogenMatrix3(aM) ) ); } catch( uno::Exception& e ) { ASSERT_EXCEPTION( e ); } } void VTitle::createShapes( const awt::Point& rPos , const awt::Size& rReferenceSize ) { try { if(!m_xTitle.is()) return; uno::Sequence< uno::Reference< XFormattedString > > aStringList = m_xTitle->getText(); if(aStringList.getLength()<=0) return; //create shape and add to page uno::Reference< drawing::XShape > xShape( m_xShapeFactory->createInstance( C2U( "com.sun.star.drawing.TextShape" ) ), uno::UNO_QUERY ); m_xTarget->add(xShape); m_xShape = xShape; //set text and text properties uno::Reference< text::XText > xText( xShape, uno::UNO_QUERY ); uno::Reference< text::XTextCursor > xTextCursor( xText->createTextCursor() ); uno::Reference< text::XTextRange > xTextRange( xTextCursor, uno::UNO_QUERY ); uno::Reference< beans::XPropertySet > xShapeProp( xShape, uno::UNO_QUERY ); uno::Reference< beans::XPropertySet > xTitleProperties( m_xTitle, uno::UNO_QUERY ); if( !xText.is() || !xTextRange.is() || !xTextCursor.is() || !xShapeProp.is() || !xTitleProperties.is() ) return; tPropertyNameValueMap aValueMap; //fill line-, fill- and paragraph-properties into the ValueMap { tMakePropertyNameMap aNameMap = PropertyMapper::getPropertyNameMapForParagraphProperties(); aNameMap( PropertyMapper::getPropertyNameMapForFillAndLineProperties() ); PropertyMapper::getValueMap( aValueMap, aNameMap, xTitleProperties ); } //fill some more shape properties into the ValueMap { drawing::TextHorizontalAdjust eHorizontalAdjust = drawing::TextHorizontalAdjust_CENTER; drawing::TextVerticalAdjust eVerticalAdjust = drawing::TextVerticalAdjust_CENTER; //text::WritingMode eWritingMode = text::WritingMode_LR_TB;//@todo get correct one aValueMap.insert( tPropertyNameValueMap::value_type( C2U("TextHorizontalAdjust"), uno::makeAny(eHorizontalAdjust) ) ); // drawing::TextHorizontalAdjust aValueMap.insert( tPropertyNameValueMap::value_type( C2U("TextVerticalAdjust"), uno::makeAny(eVerticalAdjust) ) ); //drawing::TextVerticalAdjust //aValueMap.insert( tPropertyNameValueMap::value_type( C2U("TextWritingMode"), uno::makeAny(eWritingMode) ) ); //text::WritingMode aValueMap.insert( tPropertyNameValueMap::value_type( C2U("TextAutoGrowHeight"), uno::makeAny(sal_True) ) ); // sal_Bool aValueMap.insert( tPropertyNameValueMap::value_type( C2U("TextAutoGrowWidth"), uno::makeAny(sal_True) ) ); // sal_Bool ////aValueMap.insert( tPropertyNameValueMap::value_type( C2U("TextMaximumFrameWidth"), uno::makeAny(rSize.Width) ) ); //sal_Int32 ////aValueMap.insert( tPropertyNameValueMap::value_type( C2U("TextMaximumFrameHeight"), uno::makeAny(rSize.Height) ) ); //sal_Int32 //set name/classified ObjectID (CID) if( !m_aCID.isEmpty() ) aValueMap.insert( tPropertyNameValueMap::value_type( C2U("Name"), uno::makeAny( m_aCID ) ) ); //CID rtl::OUString } //set global title properties { tNameSequence aPropNames; tAnySequence aPropValues; PropertyMapper::getMultiPropertyListsFromValueMap( aPropNames, aPropValues, aValueMap ); PropertyMapper::setMultiProperties( aPropNames, aPropValues, xShapeProp ); } sal_Bool bStackCharacters(sal_False); try { xTitleProperties->getPropertyValue( C2U( "StackCharacters" ) ) >>= bStackCharacters; } catch( uno::Exception& e ) { ASSERT_EXCEPTION( e ); } if(bStackCharacters) { //if the characters should be stacked we use only the first character properties for code simplicity if( aStringList.getLength()>0 ) { rtl::OUString aLabel; for( sal_Int32 nN=0; nNgetString(); aLabel = ShapeFactory::getStackedString( aLabel, bStackCharacters ); xTextCursor->gotoEnd(false); xText->insertString( xTextRange, aLabel, false ); xTextCursor->gotoEnd(true); uno::Reference< beans::XPropertySet > xTargetProps( xShape, uno::UNO_QUERY ); uno::Reference< beans::XPropertySet > xSourceProps( aStringList[0], uno::UNO_QUERY ); PropertyMapper::setMappedProperties( xTargetProps, xSourceProps , PropertyMapper::getPropertyNameMapForCharacterProperties() ); // adapt font size according to page size awt::Size aOldRefSize; if( xTitleProperties->getPropertyValue( C2U("ReferencePageSize")) >>= aOldRefSize ) { RelativeSizeHelper::adaptFontSizes( xTargetProps, aOldRefSize, rReferenceSize ); } } } else { uno::Sequence< uno::Reference< text::XTextCursor > > aCursorList( aStringList.getLength() ); sal_Int32 nN = 0; for( nN=0; nNgotoEnd(false); xText->insertString( xTextRange, aStringList[nN]->getString(), false ); xTextCursor->gotoEnd(true); aCursorList[nN] = xText->createTextCursorByRange( uno::Reference< text::XTextRange >(xTextCursor,uno::UNO_QUERY) ); } awt::Size aOldRefSize; bool bHasRefPageSize = ( xTitleProperties->getPropertyValue( C2U("ReferencePageSize")) >>= aOldRefSize ); //for( nN=0; nN0 ) { //uno::Reference< beans::XPropertySet > xTargetProps( aCursorList[nN], uno::UNO_QUERY ); //uno::Reference< beans::XPropertySet > xSourceProps( aStringList[nN], uno::UNO_QUERY ); uno::Reference< beans::XPropertySet > xTargetProps( xShape, uno::UNO_QUERY ); uno::Reference< beans::XPropertySet > xSourceProps( aStringList[0], uno::UNO_QUERY ); PropertyMapper::setMappedProperties( xTargetProps, xSourceProps, PropertyMapper::getPropertyNameMapForCharacterProperties() ); // adapt font size according to page size if( bHasRefPageSize ) { RelativeSizeHelper::adaptFontSizes( xTargetProps, aOldRefSize, rReferenceSize ); } } } // #i109336# Improve auto positioning in chart float fFontHeight = 0.0; if ( xShapeProp.is() && ( xShapeProp->getPropertyValue( C2U( "CharHeight" ) ) >>= fFontHeight ) ) { fFontHeight *= ( 2540. / 72. ); // pt -> 1/100 mm float fXFraction = 0.18; sal_Int32 nXDistance = static_cast< sal_Int32 >( ::rtl::math::round( fFontHeight * fXFraction ) ); float fYFraction = 0.30; sal_Int32 nYDistance = static_cast< sal_Int32 >( ::rtl::math::round( fFontHeight * fYFraction ) ); xShapeProp->setPropertyValue( C2U( "TextLeftDistance" ), uno::makeAny( nXDistance ) ); xShapeProp->setPropertyValue( C2U( "TextRightDistance" ), uno::makeAny( nXDistance ) ); xShapeProp->setPropertyValue( C2U( "TextUpperDistance" ), uno::makeAny( nYDistance ) ); xShapeProp->setPropertyValue( C2U( "TextLowerDistance" ), uno::makeAny( nYDistance ) ); } try { double fAngleDegree = 0; xTitleProperties->getPropertyValue( C2U( "TextRotation" ) ) >>= fAngleDegree; m_fRotationAngleDegree += fAngleDegree; } catch( uno::Exception& e ) { ASSERT_EXCEPTION( e ); } m_nXPos = rPos.X; m_nYPos = rPos.Y; //set position matrix //the matrix needs to be set at the end behind autogrow and such position influencing properties ::basegfx::B2DHomMatrix aM; aM.rotate( -m_fRotationAngleDegree*F_PI/180.0 );//#i78696#->#i80521# aM.translate( m_nXPos, m_nYPos ); xShapeProp->setPropertyValue( C2U( "Transformation" ), uno::makeAny( B2DHomMatrixToHomogenMatrix3(aM) ) ); } catch( uno::Exception& e ) { ASSERT_EXCEPTION( e ); } } //............................................................................. } //namespace chart //.............................................................................