1 /************************************************************************* 2 * 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * Copyright 2000, 2010 Oracle and/or its affiliates. 6 * 7 * OpenOffice.org - a multi-platform office productivity suite 8 * 9 * This file is part of OpenOffice.org. 10 * 11 * OpenOffice.org is free software: you can redistribute it and/or modify 12 * it under the terms of the GNU Lesser General Public License version 3 13 * only, as published by the Free Software Foundation. 14 * 15 * OpenOffice.org is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU Lesser General Public License version 3 for more details 19 * (a copy is included in the LICENSE file that accompanied this code). 20 * 21 * You should have received a copy of the GNU Lesser General Public License 22 * version 3 along with OpenOffice.org. If not, see 23 * <http://www.openoffice.org/license.html> 24 * for a copy of the LGPLv3 License. 25 * 26 ************************************************************************/ 27 28 // MARKER(update_precomp.py): autogen include statement, do not remove 29 #include "precompiled_xmloff.hxx" 30 #include <com/sun/star/container/XNameContainer.hpp> 31 #include "FillStyleContext.hxx" 32 #include <xmloff/xmlimp.hxx> 33 #include "xmloff/GradientStyle.hxx" 34 #include "xmloff/HatchStyle.hxx" 35 #include "xmloff/ImageStyle.hxx" 36 #include "TransGradientStyle.hxx" 37 #include "xmloff/MarkerStyle.hxx" 38 #include "xmloff/DashStyle.hxx" 39 #include <xmloff/families.hxx> 40 #include <xmloff/nmspmap.hxx> 41 #include "xmloff/xmlnmspe.hxx" 42 #include <xmloff/XMLBase64ImportContext.hxx> 43 44 using namespace ::com::sun::star; 45 using ::rtl::OUString; 46 using ::rtl::OUStringBuffer; 47 48 49 ////////////////////////////////////////////////////////////////////////////// 50 ////////////////////////////////////////////////////////////////////////////// 51 52 TYPEINIT1( XMLGradientStyleContext, SvXMLStyleContext ); 53 54 XMLGradientStyleContext::XMLGradientStyleContext( SvXMLImport& rImport, sal_uInt16 nPrfx, 55 const OUString& rLName, 56 const uno::Reference< xml::sax::XAttributeList >& xAttrList) 57 : SvXMLStyleContext(rImport, nPrfx, rLName, xAttrList) 58 { 59 // set Family 60 // SetFamily( XML_STYLE_FAMILY_FILLSTYLE_GRADIENT_ID ); 61 62 // start import 63 XMLGradientStyleImport aGradientStyle( GetImport() ); 64 aGradientStyle.importXML( xAttrList, maAny, maStrName ); 65 } 66 67 XMLGradientStyleContext::~XMLGradientStyleContext() 68 { 69 } 70 71 void XMLGradientStyleContext::EndElement() 72 { 73 uno::Reference< container::XNameContainer > xGradient( GetImport().GetGradientHelper() ); 74 75 try 76 { 77 if(xGradient.is()) 78 { 79 if( xGradient->hasByName( maStrName ) ) 80 { 81 xGradient->replaceByName( maStrName, maAny ); 82 } 83 else 84 { 85 xGradient->insertByName( maStrName, maAny ); 86 } 87 } 88 } 89 catch( container::ElementExistException& ) 90 {} 91 } 92 93 sal_Bool XMLGradientStyleContext::IsTransient() const 94 { 95 return sal_True; 96 } 97 98 ////////////////////////////////////////////////////////////////////////////// 99 ////////////////////////////////////////////////////////////////////////////// 100 101 TYPEINIT1( XMLHatchStyleContext, SvXMLStyleContext ); 102 103 XMLHatchStyleContext::XMLHatchStyleContext( SvXMLImport& rImport, sal_uInt16 nPrfx, 104 const OUString& rLName, 105 const uno::Reference< xml::sax::XAttributeList >& xAttrList) 106 : SvXMLStyleContext(rImport, nPrfx, rLName, xAttrList) 107 { 108 // start import 109 XMLHatchStyleImport aHatchStyle( GetImport() ); 110 aHatchStyle.importXML( xAttrList, maAny, maStrName ); 111 } 112 113 XMLHatchStyleContext::~XMLHatchStyleContext() 114 { 115 } 116 117 void XMLHatchStyleContext::EndElement() 118 { 119 uno::Reference< container::XNameContainer > xHatch( GetImport().GetHatchHelper() ); 120 121 try 122 { 123 if(xHatch.is()) 124 { 125 if( xHatch->hasByName( maStrName ) ) 126 { 127 xHatch->replaceByName( maStrName, maAny ); 128 } 129 else 130 { 131 xHatch->insertByName( maStrName, maAny ); 132 } 133 } 134 } 135 catch( container::ElementExistException& ) 136 {} 137 } 138 139 sal_Bool XMLHatchStyleContext::IsTransient() const 140 { 141 return sal_True; 142 } 143 144 ////////////////////////////////////////////////////////////////////////////// 145 ////////////////////////////////////////////////////////////////////////////// 146 147 TYPEINIT1( XMLBitmapStyleContext, SvXMLStyleContext ); 148 149 XMLBitmapStyleContext::XMLBitmapStyleContext( SvXMLImport& rImport, sal_uInt16 nPrfx, 150 const OUString& rLName, 151 const uno::Reference< xml::sax::XAttributeList >& xAttrList) 152 : SvXMLStyleContext(rImport, nPrfx, rLName, xAttrList) 153 { 154 // start import 155 XMLImageStyle aBitmapStyle; 156 aBitmapStyle.importXML( xAttrList, maAny, maStrName, rImport ); 157 } 158 159 XMLBitmapStyleContext::~XMLBitmapStyleContext() 160 { 161 } 162 163 SvXMLImportContext* XMLBitmapStyleContext::CreateChildContext( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList > & xAttrList ) 164 { 165 SvXMLImportContext *pContext = 0; 166 if( (XML_NAMESPACE_OFFICE == nPrefix) && xmloff::token::IsXMLToken( rLocalName, xmloff::token::XML_BINARY_DATA ) ) 167 { 168 OUString sURL; 169 maAny >>= sURL; 170 if( !sURL.getLength() && !mxBase64Stream.is() ) 171 { 172 mxBase64Stream = GetImport().GetStreamForGraphicObjectURLFromBase64(); 173 if( mxBase64Stream.is() ) 174 pContext = new XMLBase64ImportContext( GetImport(), nPrefix, 175 rLocalName, xAttrList, 176 mxBase64Stream ); 177 } 178 } 179 if( !pContext ) 180 { 181 pContext = new SvXMLImportContext( GetImport(), nPrefix, rLocalName ); 182 } 183 184 return pContext; 185 } 186 187 void XMLBitmapStyleContext::EndElement() 188 { 189 OUString sURL; 190 maAny >>= sURL; 191 192 if( !sURL.getLength() && mxBase64Stream.is() ) 193 { 194 sURL = GetImport().ResolveGraphicObjectURLFromBase64( mxBase64Stream ); 195 mxBase64Stream = 0; 196 maAny <<= sURL; 197 } 198 199 uno::Reference< container::XNameContainer > xBitmap( GetImport().GetBitmapHelper() ); 200 201 try 202 { 203 if(xBitmap.is()) 204 { 205 if( xBitmap->hasByName( maStrName ) ) 206 { 207 xBitmap->replaceByName( maStrName, maAny ); 208 } 209 else 210 { 211 xBitmap->insertByName( maStrName, maAny ); 212 } 213 } 214 } 215 catch( container::ElementExistException& ) 216 {} 217 } 218 219 sal_Bool XMLBitmapStyleContext::IsTransient() const 220 { 221 return sal_True; 222 } 223 224 225 ////////////////////////////////////////////////////////////////////////////// 226 ////////////////////////////////////////////////////////////////////////////// 227 228 TYPEINIT1( XMLTransGradientStyleContext, SvXMLStyleContext ); 229 230 XMLTransGradientStyleContext::XMLTransGradientStyleContext( SvXMLImport& rImport, sal_uInt16 nPrfx, 231 const OUString& rLName, 232 const uno::Reference< xml::sax::XAttributeList >& xAttrList) 233 : SvXMLStyleContext(rImport, nPrfx, rLName, xAttrList) 234 { 235 // start import 236 XMLTransGradientStyleImport aTransGradientStyle( GetImport() ); 237 aTransGradientStyle.importXML( xAttrList, maAny, maStrName ); 238 } 239 240 XMLTransGradientStyleContext::~XMLTransGradientStyleContext() 241 { 242 } 243 244 void XMLTransGradientStyleContext::EndElement() 245 { 246 uno::Reference< container::XNameContainer > xTransGradient( GetImport().GetTransGradientHelper() ); 247 248 try 249 { 250 if(xTransGradient.is()) 251 { 252 if( xTransGradient->hasByName( maStrName ) ) 253 { 254 xTransGradient->replaceByName( maStrName, maAny ); 255 } 256 else 257 { 258 xTransGradient->insertByName( maStrName, maAny ); 259 } 260 } 261 } 262 catch( container::ElementExistException& ) 263 {} 264 } 265 266 sal_Bool XMLTransGradientStyleContext::IsTransient() const 267 { 268 return sal_True; 269 } 270 271 ////////////////////////////////////////////////////////////////////////////// 272 ////////////////////////////////////////////////////////////////////////////// 273 274 TYPEINIT1( XMLMarkerStyleContext, SvXMLStyleContext ); 275 276 XMLMarkerStyleContext::XMLMarkerStyleContext( SvXMLImport& rImport, sal_uInt16 nPrfx, 277 const OUString& rLName, 278 const uno::Reference< xml::sax::XAttributeList >& xAttrList) 279 : SvXMLStyleContext(rImport, nPrfx, rLName, xAttrList) 280 { 281 // start import 282 XMLMarkerStyleImport aMarkerStyle( GetImport() ); 283 aMarkerStyle.importXML( xAttrList, maAny, maStrName ); 284 } 285 286 XMLMarkerStyleContext::~XMLMarkerStyleContext() 287 { 288 } 289 290 void XMLMarkerStyleContext::EndElement() 291 { 292 uno::Reference< container::XNameContainer > xMarker( GetImport().GetMarkerHelper() ); 293 294 try 295 { 296 if(xMarker.is()) 297 { 298 if( xMarker->hasByName( maStrName ) ) 299 { 300 xMarker->replaceByName( maStrName, maAny ); 301 } 302 else 303 { 304 xMarker->insertByName( maStrName, maAny ); 305 } 306 } 307 } 308 catch( container::ElementExistException& ) 309 {} 310 } 311 312 sal_Bool XMLMarkerStyleContext::IsTransient() const 313 { 314 return sal_True; 315 } 316 317 ////////////////////////////////////////////////////////////////////////////// 318 ////////////////////////////////////////////////////////////////////////////// 319 320 TYPEINIT1( XMLDashStyleContext, SvXMLStyleContext ); 321 322 XMLDashStyleContext::XMLDashStyleContext( SvXMLImport& rImport, sal_uInt16 nPrfx, 323 const OUString& rLName, 324 const uno::Reference< xml::sax::XAttributeList >& xAttrList) 325 : SvXMLStyleContext(rImport, nPrfx, rLName, xAttrList) 326 { 327 // start import 328 XMLDashStyleImport aDashStyle( GetImport() ); 329 aDashStyle.importXML( xAttrList, maAny, maStrName ); 330 } 331 332 XMLDashStyleContext::~XMLDashStyleContext() 333 { 334 } 335 336 void XMLDashStyleContext::EndElement() 337 { 338 uno::Reference< container::XNameContainer > xDashes( GetImport().GetDashHelper() ); 339 340 try 341 { 342 if(xDashes.is()) 343 { 344 if( xDashes->hasByName( maStrName ) ) 345 { 346 xDashes->replaceByName( maStrName, maAny ); 347 } 348 else 349 { 350 xDashes->insertByName( maStrName, maAny ); 351 } 352 } 353 } 354 catch( container::ElementExistException& ) 355 {} 356 } 357 358 sal_Bool XMLDashStyleContext::IsTransient() const 359 { 360 return sal_True; 361 } 362