1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_chart2.hxx" 26 #include "TitleItemConverter.hxx" 27 #include "SchWhichPairs.hxx" 28 #include "macros.hxx" 29 #include "ItemPropertyMap.hxx" 30 #include "GraphicPropertyItemConverter.hxx" 31 #include "CharacterPropertyItemConverter.hxx" 32 #include "MultipleItemConverter.hxx" 33 #include <svl/intitem.hxx> 34 #include <rtl/math.hxx> 35 36 #include <com/sun/star/chart2/XTitled.hpp> 37 38 #include <functional> 39 #include <algorithm> 40 41 using namespace ::com::sun::star; 42 43 namespace 44 { 45 ::comphelper::ItemPropertyMapType & lcl_GetTitlePropertyMap() 46 { 47 static ::comphelper::ItemPropertyMapType aTitlePropertyMap( 48 ::comphelper::MakeItemPropertyMap 49 IPM_MAP_ENTRY( SCHATTR_TEXT_STACKED, "StackCharacters", 0 ) 50 ); 51 52 return aTitlePropertyMap; 53 }; 54 } // anonymous namespace 55 56 namespace chart 57 { 58 namespace wrapper 59 { 60 61 // ======================================== 62 63 class FormattedStringsConverter : public ::comphelper::MultipleItemConverter 64 { 65 public: 66 FormattedStringsConverter( 67 const uno::Sequence< uno::Reference< chart2::XFormattedString > > & aStrings, 68 SfxItemPool & rItemPool, 69 ::std::auto_ptr< awt::Size > pRefSize, 70 const uno::Reference< beans::XPropertySet > & xParentProp ); 71 virtual ~FormattedStringsConverter(); 72 73 protected: 74 virtual const sal_uInt16 * GetWhichPairs() const; 75 }; 76 77 // ---------------------------------------- 78 79 FormattedStringsConverter::FormattedStringsConverter( 80 const uno::Sequence< uno::Reference< chart2::XFormattedString > > & aStrings, 81 SfxItemPool & rItemPool, 82 ::std::auto_ptr< ::com::sun::star::awt::Size > pRefSize, 83 const uno::Reference< beans::XPropertySet > & xParentProp ) : 84 MultipleItemConverter( rItemPool ) 85 { 86 bool bHasRefSize = (pRefSize.get() && xParentProp.is()); 87 for( sal_Int32 i = 0; i < aStrings.getLength(); ++i ) 88 { 89 uno::Reference< beans::XPropertySet > xProp( aStrings[ i ], uno::UNO_QUERY ); 90 if( xProp.is()) 91 { 92 if( bHasRefSize ) 93 m_aConverters.push_back( new CharacterPropertyItemConverter( 94 xProp, rItemPool, 95 ::std::auto_ptr< awt::Size >( new awt::Size( *pRefSize )), 96 C2U( "ReferencePageSize" ), 97 xParentProp )); 98 else 99 m_aConverters.push_back( new CharacterPropertyItemConverter( xProp, rItemPool )); 100 } 101 } 102 } 103 104 FormattedStringsConverter::~FormattedStringsConverter() 105 { 106 } 107 108 const sal_uInt16 * FormattedStringsConverter::GetWhichPairs() const 109 { 110 return nCharacterPropertyWhichPairs; 111 } 112 113 // ======================================== 114 115 TitleItemConverter::TitleItemConverter( 116 const ::com::sun::star::uno::Reference< 117 ::com::sun::star::beans::XPropertySet > & rPropertySet, 118 SfxItemPool& rItemPool, 119 SdrModel& rDrawModel, 120 const uno::Reference< lang::XMultiServiceFactory > & xNamedPropertyContainerFactory, 121 ::std::auto_ptr< ::com::sun::star::awt::Size > pRefSize ) : 122 ItemConverter( rPropertySet, rItemPool ) 123 { 124 m_aConverters.push_back( new GraphicPropertyItemConverter( 125 rPropertySet, rItemPool, rDrawModel, 126 xNamedPropertyContainerFactory, 127 GraphicPropertyItemConverter::LINE_AND_FILL_PROPERTIES )); 128 129 // CharacterProperties are not at the title but at its contained XFormattedString objects 130 // take the first formatted string in the sequence 131 uno::Reference< chart2::XTitle > xTitle( rPropertySet, uno::UNO_QUERY ); 132 if( xTitle.is()) 133 { 134 uno::Sequence< uno::Reference< chart2::XFormattedString > > aStringSeq( xTitle->getText()); 135 if( aStringSeq.getLength() > 0 ) 136 { 137 m_aConverters.push_back( 138 new FormattedStringsConverter( aStringSeq, rItemPool, pRefSize, rPropertySet )); 139 } 140 } 141 } 142 143 TitleItemConverter::~TitleItemConverter() 144 { 145 ::std::for_each( m_aConverters.begin(), m_aConverters.end(), 146 ::comphelper::DeleteItemConverterPtr() ); 147 } 148 149 void TitleItemConverter::FillItemSet( SfxItemSet & rOutItemSet ) const 150 { 151 ::std::for_each( m_aConverters.begin(), m_aConverters.end(), 152 ::comphelper::FillItemSetFunc( rOutItemSet )); 153 154 // own items 155 ItemConverter::FillItemSet( rOutItemSet ); 156 } 157 158 bool TitleItemConverter::ApplyItemSet( const SfxItemSet & rItemSet ) 159 { 160 bool bResult = false; 161 162 ::std::for_each( m_aConverters.begin(), m_aConverters.end(), 163 ::comphelper::ApplyItemSetFunc( rItemSet, bResult )); 164 165 // own items 166 return ItemConverter::ApplyItemSet( rItemSet ) || bResult; 167 } 168 169 const sal_uInt16 * TitleItemConverter::GetWhichPairs() const 170 { 171 // must span all used items! 172 return nTitleWhichPairs; 173 } 174 175 bool TitleItemConverter::GetItemProperty( tWhichIdType nWhichId, tPropertyNameWithMemberId & rOutProperty ) const 176 { 177 ::comphelper::ItemPropertyMapType & rMap( lcl_GetTitlePropertyMap()); 178 ::comphelper::ItemPropertyMapType::const_iterator aIt( rMap.find( nWhichId )); 179 180 if( aIt == rMap.end()) 181 return false; 182 183 rOutProperty =(*aIt).second; 184 return true; 185 } 186 187 188 bool TitleItemConverter::ApplySpecialItem( 189 sal_uInt16 nWhichId, const SfxItemSet & rItemSet ) 190 throw( uno::Exception ) 191 { 192 bool bChanged = false; 193 194 switch( nWhichId ) 195 { 196 case SCHATTR_TEXT_DEGREES: 197 { 198 // convert int to double (divided by 100) 199 double fVal = static_cast< double >( 200 static_cast< const SfxInt32Item & >( 201 rItemSet.Get( nWhichId )).GetValue()) / 100.0; 202 double fOldVal = 0.0; 203 bool bPropExisted = 204 ( GetPropertySet()->getPropertyValue( C2U( "TextRotation" )) >>= fOldVal ); 205 206 if( ! bPropExisted || 207 ( bPropExisted && fOldVal != fVal )) 208 { 209 GetPropertySet()->setPropertyValue( C2U( "TextRotation" ), uno::makeAny( fVal )); 210 bChanged = true; 211 } 212 } 213 break; 214 } 215 216 return bChanged; 217 } 218 219 void TitleItemConverter::FillSpecialItem( 220 sal_uInt16 nWhichId, SfxItemSet & rOutItemSet ) const 221 throw( uno::Exception ) 222 { 223 switch( nWhichId ) 224 { 225 case SCHATTR_TEXT_DEGREES: 226 { 227 // convert double to int (times 100) 228 double fVal = 0; 229 230 if( GetPropertySet()->getPropertyValue( C2U( "TextRotation" )) >>= fVal ) 231 { 232 rOutItemSet.Put( SfxInt32Item( nWhichId, static_cast< sal_Int32 >( 233 ::rtl::math::round( fVal * 100.0 ) ) )); 234 } 235 } 236 break; 237 } 238 } 239 240 } // namespace wrapper 241 } // namespace chart 242