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 #include "oox/helper/modelobjecthelper.hxx" 25 26 #include <com/sun/star/awt/Gradient.hpp> 27 #include <com/sun/star/container/XNameContainer.hpp> 28 #include <com/sun/star/drawing/LineDash.hpp> 29 #include <com/sun/star/drawing/PolyPolygonBezierCoords.hpp> 30 #include <com/sun/star/lang/XMultiServiceFactory.hpp> 31 #include "oox/helper/containerhelper.hxx" 32 #include "oox/helper/helper.hxx" 33 34 namespace oox { 35 36 // ============================================================================ 37 38 using namespace ::com::sun::star::awt; 39 using namespace ::com::sun::star::drawing; 40 using namespace ::com::sun::star::lang; 41 using namespace ::com::sun::star::uno; 42 43 using ::rtl::OUString; 44 45 // ============================================================================ 46 47 ObjectContainer::ObjectContainer( const Reference< XMultiServiceFactory >& rxModelFactory, const OUString& rServiceName ) : 48 mxModelFactory( rxModelFactory ), 49 maServiceName( rServiceName ), 50 mnIndex( 0 ) 51 { 52 OSL_ENSURE( mxModelFactory.is(), "ObjectContainer::ObjectContainer - missing service factory" ); 53 } 54 55 ObjectContainer::~ObjectContainer() 56 { 57 } 58 59 bool ObjectContainer::hasObject( const OUString& rObjName ) const 60 { 61 createContainer(); 62 return mxContainer.is() && mxContainer->hasByName( rObjName ); 63 } 64 65 Any ObjectContainer::getObject( const OUString& rObjName ) const 66 { 67 createContainer(); 68 if( mxContainer.is() ) try 69 { 70 return mxContainer->getByName( rObjName ); 71 } 72 catch( Exception& ) 73 { 74 } 75 return Any(); 76 } 77 78 OUString ObjectContainer::insertObject( const OUString& rObjName, const Any& rObj, bool bInsertByUnusedName ) 79 { 80 createContainer(); 81 if( mxContainer.is() ) 82 { 83 if( bInsertByUnusedName ) 84 return ContainerHelper::insertByUnusedName( mxContainer, rObjName + OUString::valueOf( ++mnIndex ), ' ', rObj ); 85 if( ContainerHelper::insertByName( mxContainer, rObjName, rObj ) ) 86 return rObjName; 87 } 88 return OUString(); 89 } 90 91 void ObjectContainer::createContainer() const 92 { 93 if( !mxContainer.is() && mxModelFactory.is() ) try 94 { 95 mxContainer.set( mxModelFactory->createInstance( maServiceName ), UNO_QUERY_THROW ); 96 mxModelFactory.clear(); 97 } 98 catch( Exception& ) 99 { 100 } 101 OSL_ENSURE( mxContainer.is(), "ObjectContainer::createContainer - container not found" ); 102 } 103 104 // ============================================================================ 105 106 ModelObjectHelper::ModelObjectHelper( const Reference< XMultiServiceFactory >& rxModelFactory ) : 107 maMarkerContainer( rxModelFactory, CREATE_OUSTRING( "com.sun.star.drawing.MarkerTable" ) ), 108 maDashContainer( rxModelFactory, CREATE_OUSTRING( "com.sun.star.drawing.DashTable" ) ), 109 maGradientContainer( rxModelFactory, CREATE_OUSTRING( "com.sun.star.drawing.GradientTable" ) ), 110 maBitmapUrlContainer( rxModelFactory, CREATE_OUSTRING( "com.sun.star.drawing.BitmapTable" ) ), 111 maDashNameBase( CREATE_OUSTRING( "msLineDash " ) ), 112 maGradientNameBase( CREATE_OUSTRING( "msFillGradient " ) ), 113 maBitmapUrlNameBase( CREATE_OUSTRING( "msFillBitmap " ) ) 114 { 115 } 116 117 bool ModelObjectHelper::hasLineMarker( const OUString& rMarkerName ) const 118 { 119 return maMarkerContainer.hasObject( rMarkerName ); 120 } 121 122 bool ModelObjectHelper::insertLineMarker( const OUString& rMarkerName, const PolyPolygonBezierCoords& rMarker ) 123 { 124 OSL_ENSURE( rMarker.Coordinates.hasElements(), "ModelObjectHelper::insertLineMarker - line marker without coordinates" ); 125 if( rMarker.Coordinates.hasElements() ) 126 return maMarkerContainer.insertObject( rMarkerName, Any( rMarker ), false ).getLength() > 0; 127 return false; 128 } 129 130 OUString ModelObjectHelper::insertLineDash( const LineDash& rDash ) 131 { 132 return maDashContainer.insertObject( maDashNameBase, Any( rDash ), true ); 133 } 134 135 OUString ModelObjectHelper::insertFillGradient( const Gradient& rGradient ) 136 { 137 return maGradientContainer.insertObject( maGradientNameBase, Any( rGradient ), true ); 138 } 139 140 OUString ModelObjectHelper::insertFillBitmapUrl( const OUString& rGraphicUrl ) 141 { 142 if( rGraphicUrl.getLength() > 0 ) 143 return maBitmapUrlContainer.insertObject( maBitmapUrlNameBase, Any( rGraphicUrl ), true ); 144 return OUString(); 145 } 146 147 // ============================================================================ 148 149 } // namespace oox 150