1*efeef26fSAndrew Rist /************************************************************** 2*efeef26fSAndrew Rist * 3*efeef26fSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*efeef26fSAndrew Rist * or more contributor license agreements. See the NOTICE file 5*efeef26fSAndrew Rist * distributed with this work for additional information 6*efeef26fSAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*efeef26fSAndrew Rist * to you under the Apache License, Version 2.0 (the 8*efeef26fSAndrew Rist * "License"); you may not use this file except in compliance 9*efeef26fSAndrew Rist * with the License. You may obtain a copy of the License at 10*efeef26fSAndrew Rist * 11*efeef26fSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12*efeef26fSAndrew Rist * 13*efeef26fSAndrew Rist * Unless required by applicable law or agreed to in writing, 14*efeef26fSAndrew Rist * software distributed under the License is distributed on an 15*efeef26fSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*efeef26fSAndrew Rist * KIND, either express or implied. See the License for the 17*efeef26fSAndrew Rist * specific language governing permissions and limitations 18*efeef26fSAndrew Rist * under the License. 19*efeef26fSAndrew Rist * 20*efeef26fSAndrew Rist *************************************************************/ 21*efeef26fSAndrew Rist 22cdf0e10cSrcweir #include "vbafont.hxx" 23cdf0e10cSrcweir #include <com/sun/star/awt/FontUnderline.hpp> 24cdf0e10cSrcweir #include <ooo/vba/word/WdUnderline.hpp> 25cdf0e10cSrcweir #include <hash_map> 26cdf0e10cSrcweir #include <ooo/vba/word/WdColorIndex.hpp> 27cdf0e10cSrcweir 28cdf0e10cSrcweir using namespace ::ooo::vba; 29cdf0e10cSrcweir using namespace ::com::sun::star; 30cdf0e10cSrcweir 31cdf0e10cSrcweir const uno::Any aLongAnyTrue( sal_Int16(-1) ); 32cdf0e10cSrcweir const uno::Any aLongAnyFalse( sal_Int16( 0 ) ); 33cdf0e10cSrcweir 34cdf0e10cSrcweir struct MapPair 35cdf0e10cSrcweir { 36cdf0e10cSrcweir sal_Int32 nMSOConst; 37cdf0e10cSrcweir sal_Int32 nOOOConst; 38cdf0e10cSrcweir }; 39cdf0e10cSrcweir 40cdf0e10cSrcweir static MapPair UnderLineTable[] = { 41cdf0e10cSrcweir { word::WdUnderline::wdUnderlineNone, com::sun::star::awt::FontUnderline::NONE }, 42cdf0e10cSrcweir { word::WdUnderline::wdUnderlineSingle, com::sun::star::awt::FontUnderline::SINGLE }, 43cdf0e10cSrcweir { word::WdUnderline::wdUnderlineWords, com::sun::star::awt::FontUnderline::SINGLE }, 44cdf0e10cSrcweir { word::WdUnderline::wdUnderlineDouble, com::sun::star::awt::FontUnderline::DOUBLE }, 45cdf0e10cSrcweir { word::WdUnderline::wdUnderlineDotted, com::sun::star::awt::FontUnderline::DOTTED }, 46cdf0e10cSrcweir { word::WdUnderline::wdUnderlineThick, com::sun::star::awt::FontUnderline::BOLDDASH }, 47cdf0e10cSrcweir { word::WdUnderline::wdUnderlineDash, com::sun::star::awt::FontUnderline::DASH }, 48cdf0e10cSrcweir { word::WdUnderline::wdUnderlineDotDash, com::sun::star::awt::FontUnderline::DASHDOT }, 49cdf0e10cSrcweir { word::WdUnderline::wdUnderlineDotDotDash, com::sun::star::awt::FontUnderline::DASHDOTDOT }, 50cdf0e10cSrcweir { word::WdUnderline::wdUnderlineWavy, com::sun::star::awt::FontUnderline::WAVE }, 51cdf0e10cSrcweir { word::WdUnderline::wdUnderlineDottedHeavy, com::sun::star::awt::FontUnderline::BOLDDOTTED }, 52cdf0e10cSrcweir { word::WdUnderline::wdUnderlineDashHeavy, com::sun::star::awt::FontUnderline::BOLDDASH }, 53cdf0e10cSrcweir { word::WdUnderline::wdUnderlineDotDashHeavy, com::sun::star::awt::FontUnderline::BOLDDASHDOT }, 54cdf0e10cSrcweir { word::WdUnderline::wdUnderlineDotDotDashHeavy, com::sun::star::awt::FontUnderline::BOLDDASHDOTDOT }, 55cdf0e10cSrcweir { word::WdUnderline::wdUnderlineWavyHeavy, com::sun::star::awt::FontUnderline::BOLDWAVE }, 56cdf0e10cSrcweir { word::WdUnderline::wdUnderlineDashLong, com::sun::star::awt::FontUnderline::LONGDASH }, 57cdf0e10cSrcweir { word::WdUnderline::wdUnderlineWavyDouble, com::sun::star::awt::FontUnderline::DOUBLEWAVE }, 58cdf0e10cSrcweir { word::WdUnderline::wdUnderlineDashLongHeavy, com::sun::star::awt::FontUnderline::BOLDLONGDASH }, 59cdf0e10cSrcweir }; 60cdf0e10cSrcweir 61cdf0e10cSrcweir typedef std::hash_map< sal_Int32, sal_Int32 > ConstToConst; 62cdf0e10cSrcweir class UnderLineMapper 63cdf0e10cSrcweir { 64cdf0e10cSrcweir ConstToConst MSO2OOO; 65cdf0e10cSrcweir ConstToConst OOO2MSO; 66cdf0e10cSrcweir private: 67cdf0e10cSrcweir UnderLineMapper() 68cdf0e10cSrcweir { 69cdf0e10cSrcweir sal_Int32 nLen = sizeof( UnderLineTable )/ sizeof( UnderLineTable[0] ); 70cdf0e10cSrcweir 71cdf0e10cSrcweir for ( sal_Int32 index=0; index<nLen; ++index ) 72cdf0e10cSrcweir { 73cdf0e10cSrcweir MSO2OOO[ UnderLineTable[ index ].nMSOConst ] = UnderLineTable[ index ].nOOOConst; 74cdf0e10cSrcweir OOO2MSO[ UnderLineTable[ index ].nOOOConst ] = UnderLineTable[ index ].nMSOConst; 75cdf0e10cSrcweir } 76cdf0e10cSrcweir } 77cdf0e10cSrcweir public: 78cdf0e10cSrcweir static rtl::OUString propName() 79cdf0e10cSrcweir { 80cdf0e10cSrcweir static rtl::OUString sPropName( RTL_CONSTASCII_USTRINGPARAM("CharUnderline") ); 81cdf0e10cSrcweir return sPropName; 82cdf0e10cSrcweir } 83cdf0e10cSrcweir 84cdf0e10cSrcweir static UnderLineMapper& instance() 85cdf0e10cSrcweir { 86cdf0e10cSrcweir static UnderLineMapper theMapper; 87cdf0e10cSrcweir return theMapper; 88cdf0e10cSrcweir } 89cdf0e10cSrcweir 90cdf0e10cSrcweir sal_Int32 getOOOFromMSO( sal_Int32 nMSOConst ) throw( lang::IllegalArgumentException ) 91cdf0e10cSrcweir { 92cdf0e10cSrcweir ConstToConst::iterator it = MSO2OOO.find( nMSOConst ); 93cdf0e10cSrcweir if ( it == MSO2OOO.end() ) 94cdf0e10cSrcweir throw lang::IllegalArgumentException(); 95cdf0e10cSrcweir return it->second; 96cdf0e10cSrcweir } 97cdf0e10cSrcweir sal_Int32 getMSOFromOOO( sal_Int32 nOOOConst ) throw( lang::IllegalArgumentException ) 98cdf0e10cSrcweir { 99cdf0e10cSrcweir ConstToConst::iterator it = OOO2MSO.find( nOOOConst ); 100cdf0e10cSrcweir if ( it == OOO2MSO.end() ) 101cdf0e10cSrcweir throw lang::IllegalArgumentException(); 102cdf0e10cSrcweir return it->second; 103cdf0e10cSrcweir } 104cdf0e10cSrcweir }; 105cdf0e10cSrcweir 106cdf0e10cSrcweir SwVbaFont::SwVbaFont( const uno::Reference< XHelperInterface >& xParent, const uno::Reference< uno::XComponentContext >& xContext, const uno::Reference< container::XIndexAccess >& xPalette, uno::Reference< css::beans::XPropertySet > xPropertySet ) throw ( css::uno::RuntimeException ) : SwVbaFont_BASE( xParent, xContext, xPalette, xPropertySet ) 107cdf0e10cSrcweir { 108cdf0e10cSrcweir } 109cdf0e10cSrcweir 110cdf0e10cSrcweir uno::Any SAL_CALL 111cdf0e10cSrcweir SwVbaFont::getUnderline() throw (uno::RuntimeException) 112cdf0e10cSrcweir { 113cdf0e10cSrcweir sal_Int32 nOOVal = 0; 114cdf0e10cSrcweir mxFont->getPropertyValue( UnderLineMapper::propName() ) >>= nOOVal; 115cdf0e10cSrcweir return uno::makeAny( UnderLineMapper::instance().getMSOFromOOO( nOOVal ) ); 116cdf0e10cSrcweir } 117cdf0e10cSrcweir 118cdf0e10cSrcweir void SAL_CALL 119cdf0e10cSrcweir SwVbaFont::setUnderline( const uno::Any& _underline ) throw (uno::RuntimeException) 120cdf0e10cSrcweir { 121cdf0e10cSrcweir sal_Int32 nMSOVal = 0; 122cdf0e10cSrcweir 123cdf0e10cSrcweir if ( _underline >>= nMSOVal ) 124cdf0e10cSrcweir { 125cdf0e10cSrcweir sal_Int32 nOOVal = UnderLineMapper::instance().getOOOFromMSO( nMSOVal ); 126cdf0e10cSrcweir mxFont->setPropertyValue( UnderLineMapper::propName(), uno::makeAny( nOOVal ) ); 127cdf0e10cSrcweir } 128cdf0e10cSrcweir } 129cdf0e10cSrcweir 130cdf0e10cSrcweir rtl::OUString& 131cdf0e10cSrcweir SwVbaFont::getServiceImplName() 132cdf0e10cSrcweir { 133cdf0e10cSrcweir static rtl::OUString sImplName( RTL_CONSTASCII_USTRINGPARAM("SwVbaFont") ); 134cdf0e10cSrcweir return sImplName; 135cdf0e10cSrcweir } 136cdf0e10cSrcweir 137cdf0e10cSrcweir void SAL_CALL 138cdf0e10cSrcweir SwVbaFont::setColorIndex( const uno::Any& _colorindex ) throw( uno::RuntimeException ) 139cdf0e10cSrcweir { 140cdf0e10cSrcweir sal_Int32 nIndex = 0; 141cdf0e10cSrcweir _colorindex >>= nIndex; 142cdf0e10cSrcweir return setColor( OORGBToXLRGB(mxPalette->getByIndex( nIndex )) ); 143cdf0e10cSrcweir } 144cdf0e10cSrcweir 145cdf0e10cSrcweir uno::Any SAL_CALL 146cdf0e10cSrcweir SwVbaFont::getColorIndex() throw ( uno::RuntimeException ) 147cdf0e10cSrcweir { 148cdf0e10cSrcweir sal_Int32 nColor = 0; 149cdf0e10cSrcweir 150cdf0e10cSrcweir XLRGBToOORGB( getColor() ) >>= nColor; 151cdf0e10cSrcweir sal_Int32 nElems = mxPalette->getCount(); 152cdf0e10cSrcweir sal_Int32 nIndex = 0; 153cdf0e10cSrcweir for ( sal_Int32 count=0; count<nElems; ++count ) 154cdf0e10cSrcweir { 155cdf0e10cSrcweir sal_Int32 nPaletteColor = 0; 156cdf0e10cSrcweir mxPalette->getByIndex( count ) >>= nPaletteColor; 157cdf0e10cSrcweir if ( nPaletteColor == nColor ) 158cdf0e10cSrcweir { 159cdf0e10cSrcweir nIndex = count; 160cdf0e10cSrcweir break; 161cdf0e10cSrcweir } 162cdf0e10cSrcweir } 163cdf0e10cSrcweir return uno::makeAny( nIndex ); 164cdf0e10cSrcweir } 165cdf0e10cSrcweir uno::Any SAL_CALL 166cdf0e10cSrcweir SwVbaFont::getSubscript() throw ( uno::RuntimeException ) 167cdf0e10cSrcweir { 168cdf0e10cSrcweir sal_Bool bRes = sal_False; 169cdf0e10cSrcweir SwVbaFont_BASE::getSubscript() >>= bRes; 170cdf0e10cSrcweir if ( bRes ) 171cdf0e10cSrcweir return aLongAnyTrue; 172cdf0e10cSrcweir return aLongAnyFalse; 173cdf0e10cSrcweir } 174cdf0e10cSrcweir 175cdf0e10cSrcweir uno::Any SAL_CALL 176cdf0e10cSrcweir SwVbaFont::getSuperscript() throw ( uno::RuntimeException ) 177cdf0e10cSrcweir { 178cdf0e10cSrcweir sal_Bool bRes = sal_False; 179cdf0e10cSrcweir SwVbaFont_BASE::getSuperscript() >>= bRes; 180cdf0e10cSrcweir if ( bRes ) 181cdf0e10cSrcweir return aLongAnyTrue; 182cdf0e10cSrcweir return aLongAnyFalse; 183cdf0e10cSrcweir } 184cdf0e10cSrcweir 185cdf0e10cSrcweir uno::Any SAL_CALL 186cdf0e10cSrcweir SwVbaFont::getBold() throw (uno::RuntimeException) 187cdf0e10cSrcweir { 188cdf0e10cSrcweir sal_Bool bRes = sal_False; 189cdf0e10cSrcweir SwVbaFont_BASE::getBold() >>= bRes; 190cdf0e10cSrcweir if ( bRes ) 191cdf0e10cSrcweir return aLongAnyTrue; 192cdf0e10cSrcweir return aLongAnyFalse; 193cdf0e10cSrcweir } 194cdf0e10cSrcweir 195cdf0e10cSrcweir uno::Any SAL_CALL 196cdf0e10cSrcweir SwVbaFont::getItalic() throw (uno::RuntimeException) 197cdf0e10cSrcweir { 198cdf0e10cSrcweir sal_Bool bRes = sal_False; 199cdf0e10cSrcweir SwVbaFont_BASE::getItalic() >>= bRes; 200cdf0e10cSrcweir if ( bRes ) 201cdf0e10cSrcweir return aLongAnyTrue; 202cdf0e10cSrcweir return aLongAnyFalse; 203cdf0e10cSrcweir } 204cdf0e10cSrcweir 205cdf0e10cSrcweir uno::Any SAL_CALL 206cdf0e10cSrcweir SwVbaFont::getStrikethrough() throw (css::uno::RuntimeException) 207cdf0e10cSrcweir { 208cdf0e10cSrcweir sal_Bool bRes = sal_False; 209cdf0e10cSrcweir SwVbaFont_BASE::getStrikethrough() >>= bRes; 210cdf0e10cSrcweir if ( bRes ) 211cdf0e10cSrcweir return aLongAnyTrue; 212cdf0e10cSrcweir return aLongAnyFalse; 213cdf0e10cSrcweir } 214cdf0e10cSrcweir 215cdf0e10cSrcweir uno::Any SAL_CALL 216cdf0e10cSrcweir SwVbaFont::getShadow() throw (uno::RuntimeException) 217cdf0e10cSrcweir { 218cdf0e10cSrcweir sal_Bool bRes = sal_False; 219cdf0e10cSrcweir SwVbaFont_BASE::getShadow() >>= bRes; 220cdf0e10cSrcweir if ( bRes ) 221cdf0e10cSrcweir return aLongAnyTrue; 222cdf0e10cSrcweir return aLongAnyFalse; 223cdf0e10cSrcweir } 224cdf0e10cSrcweir 225cdf0e10cSrcweir uno::Sequence< rtl::OUString > 226cdf0e10cSrcweir SwVbaFont::getServiceNames() 227cdf0e10cSrcweir { 228cdf0e10cSrcweir static uno::Sequence< rtl::OUString > aServiceNames; 229cdf0e10cSrcweir if ( aServiceNames.getLength() == 0 ) 230cdf0e10cSrcweir { 231cdf0e10cSrcweir aServiceNames.realloc( 1 ); 232cdf0e10cSrcweir aServiceNames[ 0 ] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("ooo.vba.word.Font" ) ); 233cdf0e10cSrcweir } 234cdf0e10cSrcweir return aServiceNames; 235cdf0e10cSrcweir } 236cdf0e10cSrcweir 237cdf0e10cSrcweir 238