1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 29*cdf0e10cSrcweir #include "precompiled_xmloff.hxx" 30*cdf0e10cSrcweir #include <com/sun/star/text/XTextColumns.hpp> 31*cdf0e10cSrcweir #include <com/sun/star/text/TextColumn.hpp> 32*cdf0e10cSrcweir #include <com/sun/star/lang/XMultiServiceFactory.hpp> 33*cdf0e10cSrcweir #include <com/sun/star/style/VerticalAlignment.hpp> 34*cdf0e10cSrcweir #include <com/sun/star/beans/XPropertySet.hpp> 35*cdf0e10cSrcweir #include <xmloff/xmltkmap.hxx> 36*cdf0e10cSrcweir #include <xmloff/xmluconv.hxx> 37*cdf0e10cSrcweir #include <xmloff/nmspmap.hxx> 38*cdf0e10cSrcweir #include "xmloff/xmlnmspe.hxx" 39*cdf0e10cSrcweir #include <xmloff/xmlimp.hxx> 40*cdf0e10cSrcweir #include <xmloff/xmltoken.hxx> 41*cdf0e10cSrcweir #include "XMLTextColumnsContext.hxx" 42*cdf0e10cSrcweir #define _SVSTDARR_USHORTS 43*cdf0e10cSrcweir #include <svl/svstdarr.hxx> 44*cdf0e10cSrcweir 45*cdf0e10cSrcweir using ::rtl::OUString; 46*cdf0e10cSrcweir using ::rtl::OUStringBuffer; 47*cdf0e10cSrcweir 48*cdf0e10cSrcweir using namespace ::com::sun::star; 49*cdf0e10cSrcweir using namespace ::com::sun::star::uno; 50*cdf0e10cSrcweir using namespace ::com::sun::star::lang; 51*cdf0e10cSrcweir using namespace ::com::sun::star::text; 52*cdf0e10cSrcweir using namespace ::com::sun::star::style; 53*cdf0e10cSrcweir using namespace ::com::sun::star::beans; 54*cdf0e10cSrcweir using namespace ::xmloff::token; 55*cdf0e10cSrcweir 56*cdf0e10cSrcweir enum SvXMLTokenMapAttrs 57*cdf0e10cSrcweir { 58*cdf0e10cSrcweir XML_TOK_COLUMN_WIDTH, 59*cdf0e10cSrcweir XML_TOK_COLUMN_MARGIN_LEFT, 60*cdf0e10cSrcweir XML_TOK_COLUMN_MARGIN_RIGHT, 61*cdf0e10cSrcweir XML_TOK_COLUMN_END=XML_TOK_UNKNOWN 62*cdf0e10cSrcweir }; 63*cdf0e10cSrcweir 64*cdf0e10cSrcweir enum SvXMLSepTokenMapAttrs 65*cdf0e10cSrcweir { 66*cdf0e10cSrcweir XML_TOK_COLUMN_SEP_WIDTH, 67*cdf0e10cSrcweir XML_TOK_COLUMN_SEP_HEIGHT, 68*cdf0e10cSrcweir XML_TOK_COLUMN_SEP_COLOR, 69*cdf0e10cSrcweir XML_TOK_COLUMN_SEP_ALIGN, 70*cdf0e10cSrcweir XML_TOK_COLUMN_SEP_END=XML_TOK_UNKNOWN 71*cdf0e10cSrcweir }; 72*cdf0e10cSrcweir 73*cdf0e10cSrcweir static __FAR_DATA SvXMLTokenMapEntry aColAttrTokenMap[] = 74*cdf0e10cSrcweir { 75*cdf0e10cSrcweir { XML_NAMESPACE_STYLE, XML_REL_WIDTH, XML_TOK_COLUMN_WIDTH }, 76*cdf0e10cSrcweir { XML_NAMESPACE_FO, XML_START_INDENT, XML_TOK_COLUMN_MARGIN_LEFT }, 77*cdf0e10cSrcweir { XML_NAMESPACE_FO, XML_END_INDENT, XML_TOK_COLUMN_MARGIN_RIGHT }, 78*cdf0e10cSrcweir XML_TOKEN_MAP_END 79*cdf0e10cSrcweir }; 80*cdf0e10cSrcweir 81*cdf0e10cSrcweir static __FAR_DATA SvXMLTokenMapEntry aColSepAttrTokenMap[] = 82*cdf0e10cSrcweir { 83*cdf0e10cSrcweir { XML_NAMESPACE_STYLE, XML_WIDTH, XML_TOK_COLUMN_SEP_WIDTH }, 84*cdf0e10cSrcweir { XML_NAMESPACE_STYLE, XML_COLOR, XML_TOK_COLUMN_SEP_COLOR }, 85*cdf0e10cSrcweir { XML_NAMESPACE_STYLE, XML_HEIGHT, XML_TOK_COLUMN_SEP_HEIGHT }, 86*cdf0e10cSrcweir { XML_NAMESPACE_STYLE, XML_VERTICAL_ALIGN, XML_TOK_COLUMN_SEP_ALIGN }, 87*cdf0e10cSrcweir XML_TOKEN_MAP_END 88*cdf0e10cSrcweir }; 89*cdf0e10cSrcweir 90*cdf0e10cSrcweir SvXMLEnumMapEntry __READONLY_DATA pXML_Sep_Align_Enum[] = 91*cdf0e10cSrcweir { 92*cdf0e10cSrcweir { XML_TOP, VerticalAlignment_TOP }, 93*cdf0e10cSrcweir { XML_MIDDLE, VerticalAlignment_MIDDLE }, 94*cdf0e10cSrcweir { XML_BOTTOM, VerticalAlignment_BOTTOM }, 95*cdf0e10cSrcweir { XML_TOKEN_INVALID, 0 } 96*cdf0e10cSrcweir }; 97*cdf0e10cSrcweir 98*cdf0e10cSrcweir class XMLTextColumnContext_Impl: public SvXMLImportContext 99*cdf0e10cSrcweir { 100*cdf0e10cSrcweir text::TextColumn aColumn; 101*cdf0e10cSrcweir 102*cdf0e10cSrcweir public: 103*cdf0e10cSrcweir TYPEINFO(); 104*cdf0e10cSrcweir 105*cdf0e10cSrcweir XMLTextColumnContext_Impl( SvXMLImport& rImport, sal_uInt16 nPrfx, 106*cdf0e10cSrcweir const OUString& rLName, 107*cdf0e10cSrcweir const uno::Reference< 108*cdf0e10cSrcweir xml::sax::XAttributeList > & xAttrList, 109*cdf0e10cSrcweir const SvXMLTokenMap& rTokenMap ); 110*cdf0e10cSrcweir 111*cdf0e10cSrcweir virtual ~XMLTextColumnContext_Impl(); 112*cdf0e10cSrcweir 113*cdf0e10cSrcweir text::TextColumn& getTextColumn() { return aColumn; } 114*cdf0e10cSrcweir }; 115*cdf0e10cSrcweir 116*cdf0e10cSrcweir TYPEINIT1( XMLTextColumnContext_Impl, SvXMLImportContext ); 117*cdf0e10cSrcweir 118*cdf0e10cSrcweir XMLTextColumnContext_Impl::XMLTextColumnContext_Impl( 119*cdf0e10cSrcweir SvXMLImport& rImport, sal_uInt16 nPrfx, 120*cdf0e10cSrcweir const OUString& rLName, 121*cdf0e10cSrcweir const uno::Reference< 122*cdf0e10cSrcweir xml::sax::XAttributeList > & xAttrList, 123*cdf0e10cSrcweir const SvXMLTokenMap& rTokenMap ) : 124*cdf0e10cSrcweir SvXMLImportContext( rImport, nPrfx, rLName ) 125*cdf0e10cSrcweir { 126*cdf0e10cSrcweir aColumn.Width = 0; 127*cdf0e10cSrcweir aColumn.LeftMargin = 0; 128*cdf0e10cSrcweir aColumn.RightMargin = 0; 129*cdf0e10cSrcweir 130*cdf0e10cSrcweir sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; 131*cdf0e10cSrcweir for( sal_Int16 i=0; i < nAttrCount; i++ ) 132*cdf0e10cSrcweir { 133*cdf0e10cSrcweir const OUString& rAttrName = xAttrList->getNameByIndex( i ); 134*cdf0e10cSrcweir OUString aLocalName; 135*cdf0e10cSrcweir sal_uInt16 nPrefix = 136*cdf0e10cSrcweir GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName, 137*cdf0e10cSrcweir &aLocalName ); 138*cdf0e10cSrcweir const OUString& rValue = xAttrList->getValueByIndex( i ); 139*cdf0e10cSrcweir 140*cdf0e10cSrcweir sal_Int32 nVal; 141*cdf0e10cSrcweir switch( rTokenMap.Get( nPrefix, aLocalName ) ) 142*cdf0e10cSrcweir { 143*cdf0e10cSrcweir case XML_TOK_COLUMN_WIDTH: 144*cdf0e10cSrcweir { 145*cdf0e10cSrcweir sal_Int32 nPos = rValue.indexOf( (sal_Unicode)'*' ); 146*cdf0e10cSrcweir if( nPos != -1 && nPos+1 == rValue.getLength() ) 147*cdf0e10cSrcweir { 148*cdf0e10cSrcweir OUString sTmp( rValue.copy( 0, nPos ) ); 149*cdf0e10cSrcweir if( GetImport().GetMM100UnitConverter(). 150*cdf0e10cSrcweir convertNumber( nVal, sTmp, 0, USHRT_MAX ) ) 151*cdf0e10cSrcweir aColumn.Width = nVal; 152*cdf0e10cSrcweir } 153*cdf0e10cSrcweir } 154*cdf0e10cSrcweir break; 155*cdf0e10cSrcweir case XML_TOK_COLUMN_MARGIN_LEFT: 156*cdf0e10cSrcweir if( GetImport().GetMM100UnitConverter(). 157*cdf0e10cSrcweir convertMeasure( nVal, rValue ) ) 158*cdf0e10cSrcweir aColumn.LeftMargin = nVal; 159*cdf0e10cSrcweir break; 160*cdf0e10cSrcweir case XML_TOK_COLUMN_MARGIN_RIGHT: 161*cdf0e10cSrcweir 162*cdf0e10cSrcweir if( GetImport().GetMM100UnitConverter(). 163*cdf0e10cSrcweir convertMeasure( nVal, rValue ) ) 164*cdf0e10cSrcweir aColumn.RightMargin = nVal; 165*cdf0e10cSrcweir break; 166*cdf0e10cSrcweir default: 167*cdf0e10cSrcweir break; 168*cdf0e10cSrcweir } 169*cdf0e10cSrcweir } 170*cdf0e10cSrcweir } 171*cdf0e10cSrcweir 172*cdf0e10cSrcweir XMLTextColumnContext_Impl::~XMLTextColumnContext_Impl() 173*cdf0e10cSrcweir { 174*cdf0e10cSrcweir } 175*cdf0e10cSrcweir 176*cdf0e10cSrcweir // -------------------------------------------------------------------------- 177*cdf0e10cSrcweir 178*cdf0e10cSrcweir class XMLTextColumnSepContext_Impl: public SvXMLImportContext 179*cdf0e10cSrcweir { 180*cdf0e10cSrcweir sal_Int32 nWidth; 181*cdf0e10cSrcweir sal_Int32 nColor; 182*cdf0e10cSrcweir sal_Int8 nHeight; 183*cdf0e10cSrcweir VerticalAlignment eVertAlign; 184*cdf0e10cSrcweir 185*cdf0e10cSrcweir 186*cdf0e10cSrcweir public: 187*cdf0e10cSrcweir TYPEINFO(); 188*cdf0e10cSrcweir 189*cdf0e10cSrcweir XMLTextColumnSepContext_Impl( SvXMLImport& rImport, sal_uInt16 nPrfx, 190*cdf0e10cSrcweir const OUString& rLName, 191*cdf0e10cSrcweir const uno::Reference< 192*cdf0e10cSrcweir xml::sax::XAttributeList > & xAttrList, 193*cdf0e10cSrcweir const SvXMLTokenMap& rTokenMap ); 194*cdf0e10cSrcweir 195*cdf0e10cSrcweir virtual ~XMLTextColumnSepContext_Impl(); 196*cdf0e10cSrcweir 197*cdf0e10cSrcweir sal_Int32 GetWidth() const { return nWidth; } 198*cdf0e10cSrcweir sal_Int32 GetColor() const { return nColor; } 199*cdf0e10cSrcweir sal_Int8 GetHeight() const { return nHeight; } 200*cdf0e10cSrcweir VerticalAlignment GetVertAlign() const { return eVertAlign; } 201*cdf0e10cSrcweir }; 202*cdf0e10cSrcweir 203*cdf0e10cSrcweir 204*cdf0e10cSrcweir TYPEINIT1( XMLTextColumnSepContext_Impl, SvXMLImportContext ); 205*cdf0e10cSrcweir 206*cdf0e10cSrcweir XMLTextColumnSepContext_Impl::XMLTextColumnSepContext_Impl( 207*cdf0e10cSrcweir SvXMLImport& rImport, sal_uInt16 nPrfx, 208*cdf0e10cSrcweir const OUString& rLName, 209*cdf0e10cSrcweir const uno::Reference< 210*cdf0e10cSrcweir xml::sax::XAttributeList > & xAttrList, 211*cdf0e10cSrcweir const SvXMLTokenMap& rTokenMap ) : 212*cdf0e10cSrcweir SvXMLImportContext( rImport, nPrfx, rLName ), 213*cdf0e10cSrcweir nWidth( 2 ), 214*cdf0e10cSrcweir nColor( 0 ), 215*cdf0e10cSrcweir nHeight( 100 ), 216*cdf0e10cSrcweir eVertAlign( VerticalAlignment_TOP ) 217*cdf0e10cSrcweir { 218*cdf0e10cSrcweir sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; 219*cdf0e10cSrcweir for( sal_Int16 i=0; i < nAttrCount; i++ ) 220*cdf0e10cSrcweir { 221*cdf0e10cSrcweir const OUString& rAttrName = xAttrList->getNameByIndex( i ); 222*cdf0e10cSrcweir OUString aLocalName; 223*cdf0e10cSrcweir sal_uInt16 nPrefix = 224*cdf0e10cSrcweir GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName, 225*cdf0e10cSrcweir &aLocalName ); 226*cdf0e10cSrcweir const OUString& rValue = xAttrList->getValueByIndex( i ); 227*cdf0e10cSrcweir 228*cdf0e10cSrcweir sal_Int32 nVal; 229*cdf0e10cSrcweir switch( rTokenMap.Get( nPrefix, aLocalName ) ) 230*cdf0e10cSrcweir { 231*cdf0e10cSrcweir case XML_TOK_COLUMN_SEP_WIDTH: 232*cdf0e10cSrcweir if( GetImport().GetMM100UnitConverter(). 233*cdf0e10cSrcweir convertMeasure( nVal, rValue ) ) 234*cdf0e10cSrcweir nWidth = nVal; 235*cdf0e10cSrcweir break; 236*cdf0e10cSrcweir case XML_TOK_COLUMN_SEP_HEIGHT: 237*cdf0e10cSrcweir if( GetImport().GetMM100UnitConverter(). 238*cdf0e10cSrcweir convertPercent( nVal, rValue ) && 239*cdf0e10cSrcweir nVal >=1 && nVal <= 100 ) 240*cdf0e10cSrcweir nHeight = (sal_Int8)nVal; 241*cdf0e10cSrcweir break; 242*cdf0e10cSrcweir case XML_TOK_COLUMN_SEP_COLOR: 243*cdf0e10cSrcweir { 244*cdf0e10cSrcweir Color aColor; 245*cdf0e10cSrcweir if( GetImport().GetMM100UnitConverter(). 246*cdf0e10cSrcweir convertColor( aColor, rValue ) ) 247*cdf0e10cSrcweir nColor = (sal_Int32)aColor.GetColor(); 248*cdf0e10cSrcweir } 249*cdf0e10cSrcweir break; 250*cdf0e10cSrcweir case XML_TOK_COLUMN_SEP_ALIGN: 251*cdf0e10cSrcweir { 252*cdf0e10cSrcweir sal_uInt16 nAlign; 253*cdf0e10cSrcweir if( GetImport().GetMM100UnitConverter(). 254*cdf0e10cSrcweir convertEnum( nAlign, rValue, 255*cdf0e10cSrcweir pXML_Sep_Align_Enum ) ) 256*cdf0e10cSrcweir eVertAlign = (VerticalAlignment)nAlign; 257*cdf0e10cSrcweir } 258*cdf0e10cSrcweir break; 259*cdf0e10cSrcweir } 260*cdf0e10cSrcweir } 261*cdf0e10cSrcweir } 262*cdf0e10cSrcweir 263*cdf0e10cSrcweir XMLTextColumnSepContext_Impl::~XMLTextColumnSepContext_Impl() 264*cdf0e10cSrcweir { 265*cdf0e10cSrcweir } 266*cdf0e10cSrcweir 267*cdf0e10cSrcweir // -------------------------------------------------------------------------- 268*cdf0e10cSrcweir 269*cdf0e10cSrcweir typedef XMLTextColumnContext_Impl *XMLTextColumnContext_ImplPtr; 270*cdf0e10cSrcweir SV_DECL_PTRARR( XMLTextColumnsArray_Impl, XMLTextColumnContext_ImplPtr, 5, 5 ) 271*cdf0e10cSrcweir 272*cdf0e10cSrcweir TYPEINIT1( XMLTextColumnsContext, XMLElementPropertyContext ); 273*cdf0e10cSrcweir 274*cdf0e10cSrcweir XMLTextColumnsContext::XMLTextColumnsContext( 275*cdf0e10cSrcweir SvXMLImport& rImport, sal_uInt16 nPrfx, 276*cdf0e10cSrcweir const OUString& rLName, 277*cdf0e10cSrcweir const Reference< xml::sax::XAttributeList >& 278*cdf0e10cSrcweir xAttrList, 279*cdf0e10cSrcweir const XMLPropertyState& rProp, 280*cdf0e10cSrcweir ::std::vector< XMLPropertyState > &rProps ) 281*cdf0e10cSrcweir : XMLElementPropertyContext( rImport, nPrfx, rLName, rProp, rProps ) 282*cdf0e10cSrcweir , sSeparatorLineIsOn(RTL_CONSTASCII_USTRINGPARAM("SeparatorLineIsOn")) 283*cdf0e10cSrcweir , sSeparatorLineWidth(RTL_CONSTASCII_USTRINGPARAM("SeparatorLineWidth")) 284*cdf0e10cSrcweir , sSeparatorLineColor(RTL_CONSTASCII_USTRINGPARAM("SeparatorLineColor")) 285*cdf0e10cSrcweir , sSeparatorLineRelativeHeight(RTL_CONSTASCII_USTRINGPARAM("SeparatorLineRelativeHeight")) 286*cdf0e10cSrcweir , sSeparatorLineVerticalAlignment(RTL_CONSTASCII_USTRINGPARAM("SeparatorLineVerticalAlignment")) 287*cdf0e10cSrcweir , sIsAutomatic(RTL_CONSTASCII_USTRINGPARAM("IsAutomatic")) 288*cdf0e10cSrcweir , sAutomaticDistance(RTL_CONSTASCII_USTRINGPARAM("AutomaticDistance")) 289*cdf0e10cSrcweir , pColumns( 0 ) 290*cdf0e10cSrcweir , pColumnSep( 0 ) 291*cdf0e10cSrcweir , pColumnAttrTokenMap( new SvXMLTokenMap(aColAttrTokenMap) ) 292*cdf0e10cSrcweir , pColumnSepAttrTokenMap( new SvXMLTokenMap(aColSepAttrTokenMap) ) 293*cdf0e10cSrcweir , nCount( 0 ) 294*cdf0e10cSrcweir , bAutomatic( sal_False ) 295*cdf0e10cSrcweir , nAutomaticDistance( 0 ) 296*cdf0e10cSrcweir { 297*cdf0e10cSrcweir sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; 298*cdf0e10cSrcweir sal_Int32 nVal; 299*cdf0e10cSrcweir for( sal_Int16 i=0; i < nAttrCount; i++ ) 300*cdf0e10cSrcweir { 301*cdf0e10cSrcweir const OUString& rAttrName = xAttrList->getNameByIndex( i ); 302*cdf0e10cSrcweir OUString aLocalName; 303*cdf0e10cSrcweir sal_uInt16 nPrefix = 304*cdf0e10cSrcweir GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName, 305*cdf0e10cSrcweir &aLocalName ); 306*cdf0e10cSrcweir const OUString& rValue = xAttrList->getValueByIndex( i ); 307*cdf0e10cSrcweir if( XML_NAMESPACE_FO == nPrefix ) 308*cdf0e10cSrcweir { 309*cdf0e10cSrcweir if( IsXMLToken( aLocalName, XML_COLUMN_COUNT ) && 310*cdf0e10cSrcweir GetImport().GetMM100UnitConverter(). 311*cdf0e10cSrcweir convertNumber( nVal, rValue, 0, SHRT_MAX ) ) 312*cdf0e10cSrcweir { 313*cdf0e10cSrcweir nCount = (sal_Int16)nVal; 314*cdf0e10cSrcweir } 315*cdf0e10cSrcweir else if( IsXMLToken( aLocalName, XML_COLUMN_GAP ) ) 316*cdf0e10cSrcweir { 317*cdf0e10cSrcweir bAutomatic = GetImport().GetMM100UnitConverter(). 318*cdf0e10cSrcweir convertMeasure( nAutomaticDistance, rValue ); 319*cdf0e10cSrcweir } 320*cdf0e10cSrcweir } 321*cdf0e10cSrcweir } 322*cdf0e10cSrcweir } 323*cdf0e10cSrcweir 324*cdf0e10cSrcweir XMLTextColumnsContext::~XMLTextColumnsContext() 325*cdf0e10cSrcweir { 326*cdf0e10cSrcweir if( pColumns ) 327*cdf0e10cSrcweir { 328*cdf0e10cSrcweir sal_uInt16 nColCount = pColumns->Count(); 329*cdf0e10cSrcweir while( nColCount ) 330*cdf0e10cSrcweir { 331*cdf0e10cSrcweir nColCount--; 332*cdf0e10cSrcweir XMLTextColumnContext_Impl *pColumn = (*pColumns)[nColCount]; 333*cdf0e10cSrcweir pColumns->Remove( nColCount, 1 ); 334*cdf0e10cSrcweir pColumn->ReleaseRef(); 335*cdf0e10cSrcweir } 336*cdf0e10cSrcweir } 337*cdf0e10cSrcweir if( pColumnSep ) 338*cdf0e10cSrcweir pColumnSep->ReleaseRef(); 339*cdf0e10cSrcweir 340*cdf0e10cSrcweir delete pColumns; 341*cdf0e10cSrcweir delete pColumnAttrTokenMap; 342*cdf0e10cSrcweir delete pColumnSepAttrTokenMap; 343*cdf0e10cSrcweir } 344*cdf0e10cSrcweir 345*cdf0e10cSrcweir SvXMLImportContext *XMLTextColumnsContext::CreateChildContext( 346*cdf0e10cSrcweir sal_uInt16 nPrefix, 347*cdf0e10cSrcweir const OUString& rLocalName, 348*cdf0e10cSrcweir const uno::Reference< xml::sax::XAttributeList > & xAttrList ) 349*cdf0e10cSrcweir { 350*cdf0e10cSrcweir SvXMLImportContext *pContext = 0; 351*cdf0e10cSrcweir 352*cdf0e10cSrcweir if( XML_NAMESPACE_STYLE == nPrefix && 353*cdf0e10cSrcweir IsXMLToken( rLocalName, XML_COLUMN ) ) 354*cdf0e10cSrcweir { 355*cdf0e10cSrcweir XMLTextColumnContext_Impl *pColumn = 356*cdf0e10cSrcweir new XMLTextColumnContext_Impl( GetImport(), nPrefix, rLocalName, 357*cdf0e10cSrcweir xAttrList, *pColumnAttrTokenMap ); 358*cdf0e10cSrcweir 359*cdf0e10cSrcweir // add new tabstop to array of tabstops 360*cdf0e10cSrcweir if( !pColumns ) 361*cdf0e10cSrcweir pColumns = new XMLTextColumnsArray_Impl; 362*cdf0e10cSrcweir 363*cdf0e10cSrcweir pColumns->Insert( pColumn, pColumns->Count() ); 364*cdf0e10cSrcweir pColumn->AddRef(); 365*cdf0e10cSrcweir 366*cdf0e10cSrcweir pContext = pColumn; 367*cdf0e10cSrcweir } 368*cdf0e10cSrcweir else if( XML_NAMESPACE_STYLE == nPrefix && 369*cdf0e10cSrcweir IsXMLToken( rLocalName, XML_COLUMN_SEP ) ) 370*cdf0e10cSrcweir { 371*cdf0e10cSrcweir pColumnSep = 372*cdf0e10cSrcweir new XMLTextColumnSepContext_Impl( GetImport(), nPrefix, rLocalName, 373*cdf0e10cSrcweir xAttrList, *pColumnSepAttrTokenMap ); 374*cdf0e10cSrcweir pColumnSep->AddRef(); 375*cdf0e10cSrcweir 376*cdf0e10cSrcweir pContext = pColumnSep; 377*cdf0e10cSrcweir } 378*cdf0e10cSrcweir else 379*cdf0e10cSrcweir { 380*cdf0e10cSrcweir pContext = new SvXMLImportContext( GetImport(), nPrefix, rLocalName ); 381*cdf0e10cSrcweir } 382*cdf0e10cSrcweir 383*cdf0e10cSrcweir return pContext; 384*cdf0e10cSrcweir } 385*cdf0e10cSrcweir 386*cdf0e10cSrcweir void XMLTextColumnsContext::EndElement( ) 387*cdf0e10cSrcweir { 388*cdf0e10cSrcweir Reference<XMultiServiceFactory> xFactory(GetImport().GetModel(),UNO_QUERY); 389*cdf0e10cSrcweir if( !xFactory.is() ) 390*cdf0e10cSrcweir return; 391*cdf0e10cSrcweir 392*cdf0e10cSrcweir Reference<XInterface> xIfc = xFactory->createInstance( 393*cdf0e10cSrcweir OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.text.TextColumns"))); 394*cdf0e10cSrcweir if( !xIfc.is() ) 395*cdf0e10cSrcweir return; 396*cdf0e10cSrcweir 397*cdf0e10cSrcweir Reference< XTextColumns > xColumns( xIfc, UNO_QUERY ); 398*cdf0e10cSrcweir if ( 0 == nCount ) 399*cdf0e10cSrcweir { 400*cdf0e10cSrcweir // zero columns = no columns -> 1 column 401*cdf0e10cSrcweir xColumns->setColumnCount( 1 ); 402*cdf0e10cSrcweir } 403*cdf0e10cSrcweir else if( !bAutomatic && pColumns && 404*cdf0e10cSrcweir pColumns->Count() == (sal_uInt16)nCount ) 405*cdf0e10cSrcweir { 406*cdf0e10cSrcweir // if we have column descriptions, one per column, and we don't use 407*cdf0e10cSrcweir // automatic width, then set the column widths 408*cdf0e10cSrcweir 409*cdf0e10cSrcweir sal_Int32 nRelWidth = 0; 410*cdf0e10cSrcweir sal_uInt16 nColumnsWithWidth = 0; 411*cdf0e10cSrcweir sal_Int16 i; 412*cdf0e10cSrcweir 413*cdf0e10cSrcweir for( i = 0; i < nCount; i++ ) 414*cdf0e10cSrcweir { 415*cdf0e10cSrcweir const TextColumn& rColumn = 416*cdf0e10cSrcweir (*pColumns)[(sal_uInt16)i]->getTextColumn(); 417*cdf0e10cSrcweir if( rColumn.Width > 0 ) 418*cdf0e10cSrcweir { 419*cdf0e10cSrcweir nRelWidth += rColumn.Width; 420*cdf0e10cSrcweir nColumnsWithWidth++; 421*cdf0e10cSrcweir } 422*cdf0e10cSrcweir } 423*cdf0e10cSrcweir if( nColumnsWithWidth < nCount ) 424*cdf0e10cSrcweir { 425*cdf0e10cSrcweir sal_Int32 nColWidth = 0==nRelWidth 426*cdf0e10cSrcweir ? USHRT_MAX / nCount 427*cdf0e10cSrcweir : nRelWidth / nColumnsWithWidth; 428*cdf0e10cSrcweir 429*cdf0e10cSrcweir for( i=0; i < nCount; i++ ) 430*cdf0e10cSrcweir { 431*cdf0e10cSrcweir TextColumn& rColumn = 432*cdf0e10cSrcweir (*pColumns)[(sal_uInt16)i]->getTextColumn(); 433*cdf0e10cSrcweir if( rColumn.Width == 0 ) 434*cdf0e10cSrcweir { 435*cdf0e10cSrcweir rColumn.Width = nColWidth; 436*cdf0e10cSrcweir nRelWidth += rColumn.Width; 437*cdf0e10cSrcweir if( 0 == --nColumnsWithWidth ) 438*cdf0e10cSrcweir break; 439*cdf0e10cSrcweir } 440*cdf0e10cSrcweir } 441*cdf0e10cSrcweir } 442*cdf0e10cSrcweir 443*cdf0e10cSrcweir Sequence< TextColumn > aColumns( (sal_Int32)nCount ); 444*cdf0e10cSrcweir TextColumn *pTextColumns = aColumns.getArray(); 445*cdf0e10cSrcweir for( i=0; i < nCount; i++ ) 446*cdf0e10cSrcweir *pTextColumns++ = (*pColumns)[(sal_uInt16)i]->getTextColumn(); 447*cdf0e10cSrcweir 448*cdf0e10cSrcweir xColumns->setColumns( aColumns ); 449*cdf0e10cSrcweir } 450*cdf0e10cSrcweir else 451*cdf0e10cSrcweir { 452*cdf0e10cSrcweir // only set column count (and let the columns be distributed 453*cdf0e10cSrcweir // automatically) 454*cdf0e10cSrcweir 455*cdf0e10cSrcweir xColumns->setColumnCount( nCount ); 456*cdf0e10cSrcweir } 457*cdf0e10cSrcweir 458*cdf0e10cSrcweir Reference < XPropertySet > xPropSet( xColumns, UNO_QUERY ); 459*cdf0e10cSrcweir if( xPropSet.is() ) 460*cdf0e10cSrcweir { 461*cdf0e10cSrcweir Any aAny; 462*cdf0e10cSrcweir sal_Bool bOn = pColumnSep != 0; 463*cdf0e10cSrcweir 464*cdf0e10cSrcweir aAny.setValue( &bOn, ::getBooleanCppuType() ); 465*cdf0e10cSrcweir xPropSet->setPropertyValue( sSeparatorLineIsOn, aAny ); 466*cdf0e10cSrcweir 467*cdf0e10cSrcweir if( pColumnSep ) 468*cdf0e10cSrcweir { 469*cdf0e10cSrcweir if( pColumnSep->GetWidth() ) 470*cdf0e10cSrcweir { 471*cdf0e10cSrcweir aAny <<= pColumnSep->GetWidth(); 472*cdf0e10cSrcweir xPropSet->setPropertyValue( sSeparatorLineWidth, aAny ); 473*cdf0e10cSrcweir } 474*cdf0e10cSrcweir if( pColumnSep->GetHeight() ) 475*cdf0e10cSrcweir { 476*cdf0e10cSrcweir aAny <<= pColumnSep->GetHeight(); 477*cdf0e10cSrcweir xPropSet->setPropertyValue( sSeparatorLineRelativeHeight, 478*cdf0e10cSrcweir aAny ); 479*cdf0e10cSrcweir } 480*cdf0e10cSrcweir 481*cdf0e10cSrcweir 482*cdf0e10cSrcweir aAny <<= pColumnSep->GetColor(); 483*cdf0e10cSrcweir xPropSet->setPropertyValue( sSeparatorLineColor, aAny ); 484*cdf0e10cSrcweir 485*cdf0e10cSrcweir 486*cdf0e10cSrcweir aAny <<= pColumnSep->GetVertAlign(); 487*cdf0e10cSrcweir xPropSet->setPropertyValue( sSeparatorLineVerticalAlignment, aAny ); 488*cdf0e10cSrcweir } 489*cdf0e10cSrcweir 490*cdf0e10cSrcweir // handle 'automatic columns': column distance 491*cdf0e10cSrcweir if( bAutomatic ) 492*cdf0e10cSrcweir { 493*cdf0e10cSrcweir aAny <<= nAutomaticDistance; 494*cdf0e10cSrcweir xPropSet->setPropertyValue( sAutomaticDistance, aAny ); 495*cdf0e10cSrcweir } 496*cdf0e10cSrcweir } 497*cdf0e10cSrcweir 498*cdf0e10cSrcweir aProp.maValue <<= xColumns; 499*cdf0e10cSrcweir 500*cdf0e10cSrcweir SetInsert( sal_True ); 501*cdf0e10cSrcweir XMLElementPropertyContext::EndElement(); 502*cdf0e10cSrcweir 503*cdf0e10cSrcweir } 504