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 "common.hxx" 25 #include "misc.hxx" 26 #include <xmlscript/xmldlg_imexp.hxx> 27 #include <xmlscript/xml_helper.hxx> 28 #include <osl/diagnose.h> 29 #include <com/sun/star/xml/sax/XAttributeList.hpp> 30 #include <com/sun/star/beans/XPropertySet.hpp> 31 #include <com/sun/star/beans/XPropertyState.hpp> 32 #include <com/sun/star/awt/FontDescriptor.hpp> 33 #include <com/sun/star/awt/FontEmphasisMark.hpp> 34 #include <com/sun/star/awt/FontRelief.hpp> 35 #include <vector> 36 37 38 namespace css = ::com::sun::star; 39 40 namespace xmlscript 41 { 42 43 struct Style 44 { 45 sal_uInt32 _backgroundColor; 46 sal_uInt32 _textColor; 47 sal_uInt32 _textLineColor; 48 sal_Int16 _border; 49 sal_Int32 _borderColor; 50 css::awt::FontDescriptor _descr; 51 sal_uInt16 _fontRelief; 52 sal_uInt16 _fontEmphasisMark; 53 sal_uInt32 _fillColor; 54 sal_Int16 _visualEffect; 55 56 // current highest mask: 0x40 57 short _all; 58 short _set; 59 60 ::rtl::OUString _id; 61 62 inline Style( short all_ ) SAL_THROW( () ) 63 : _fontRelief( css::awt::FontRelief::NONE ) 64 , _fontEmphasisMark( css::awt::FontEmphasisMark::NONE ) 65 , _all( all_ ) 66 , _set( 0 ) 67 {} 68 69 css::uno::Reference< css::xml::sax::XAttributeList > createElement(); 70 }; 71 class StyleBag 72 { 73 ::std::vector< Style * > _styles; 74 75 public: 76 ~StyleBag() SAL_THROW( () ); 77 78 ::rtl::OUString getStyleId( Style const & rStyle ) SAL_THROW( () ); 79 80 void dump( css::uno::Reference< css::xml::sax::XExtendedDocumentHandler > 81 const & xOut ); 82 }; 83 84 class ElementDescriptor 85 : public ::xmlscript::XMLElement 86 { 87 css::uno::Reference< css::beans::XPropertySet > _xProps; 88 css::uno::Reference< css::beans::XPropertyState > _xPropState; 89 90 public: 91 inline ElementDescriptor( 92 css::uno::Reference< css::beans::XPropertySet > const & xProps, 93 css::uno::Reference< css::beans::XPropertyState > const & xPropState, 94 ::rtl::OUString const & name ) 95 SAL_THROW( () ) 96 : XMLElement( name ) 97 , _xProps( xProps ) 98 , _xPropState( xPropState ) 99 {} 100 inline ElementDescriptor( 101 ::rtl::OUString const & name ) 102 SAL_THROW( () ) 103 : XMLElement( name ) 104 {} 105 106 template<typename T> 107 inline void read( 108 ::rtl::OUString const & propName, ::rtl::OUString const & attrName, 109 bool forceAttribute = false ); 110 111 // 112 template<typename T> 113 inline bool readProp( T * ret, ::rtl::OUString const & rPropName ); 114 css::uno::Any readProp( ::rtl::OUString const & rPropName ); 115 // 116 void readDefaults( bool supportPrintable = true, bool supportVisible = true ); 117 // 118 void readStringAttr( 119 ::rtl::OUString const & rPropName, ::rtl::OUString const & rAttrName ); 120 inline void readDoubleAttr( 121 ::rtl::OUString const & rPropName, ::rtl::OUString const & rAttrName ) 122 { read<double>( rPropName, rAttrName ); } 123 inline void readLongAttr( 124 ::rtl::OUString const & rPropName, ::rtl::OUString const & rAttrName, 125 bool forceAttribute = false ) 126 { read<sal_Int32>( rPropName, rAttrName, forceAttribute ); } 127 void readHexLongAttr( 128 ::rtl::OUString const & rPropName, ::rtl::OUString const & rAttrName ); 129 inline void readShortAttr( 130 ::rtl::OUString const & rPropName, ::rtl::OUString const & rAttrName ) 131 { read<sal_Int32>( rPropName, rAttrName ); } 132 inline void readBoolAttr( 133 ::rtl::OUString const & rPropName, ::rtl::OUString const & rAttrName ) 134 { read<sal_Bool>( rPropName, rAttrName ); } 135 136 void readAlignAttr( 137 ::rtl::OUString const & rPropName, ::rtl::OUString const & rAttrName ); 138 void readVerticalAlignAttr( 139 ::rtl::OUString const & rPropName, ::rtl::OUString const & rAttrName ); 140 void readImageAlignAttr( 141 ::rtl::OUString const & rPropName, ::rtl::OUString const & rAttrName ); 142 void readImagePositionAttr( 143 ::rtl::OUString const & rPropName, ::rtl::OUString const & rAttrName ); 144 void readDateFormatAttr( 145 ::rtl::OUString const & rPropName, ::rtl::OUString const & rAttrName ); 146 void readTimeFormatAttr( 147 ::rtl::OUString const & rPropName, ::rtl::OUString const & rAttrName ); 148 void readOrientationAttr( 149 ::rtl::OUString const & rPropName, ::rtl::OUString const & rAttrName ); 150 void readButtonTypeAttr( 151 ::rtl::OUString const & rPropName, ::rtl::OUString const & rAttrName ); 152 void readLineEndFormatAttr( 153 ::rtl::OUString const & rPropName, ::rtl::OUString const & rAttrName ); 154 void readSelectionTypeAttr( 155 ::rtl::OUString const & rPropName, ::rtl::OUString const & rAttrName ); 156 // 157 inline void addBoolAttr( 158 ::rtl::OUString const & rAttrName, sal_Bool bValue ) 159 { addAttribute( rAttrName, ::rtl::OUString::valueOf(bValue) ); } 160 void addNumberFormatAttr( 161 css::uno::Reference< css::beans::XPropertySet > 162 const & xFormatProperties, 163 ::rtl::OUString const & rAttrName ); 164 165 // 166 void readEvents() SAL_THROW( (css::uno::Exception) ); 167 // 168 void readDialogModel( StyleBag * all_styles ) 169 SAL_THROW( (css::uno::Exception) ); 170 void readButtonModel( StyleBag * all_styles ) 171 SAL_THROW( (css::uno::Exception) ); 172 void readEditModel( StyleBag * all_styles ) 173 SAL_THROW( (css::uno::Exception) ); 174 void readCheckBoxModel( StyleBag * all_styles ) 175 SAL_THROW( (css::uno::Exception) ); 176 void readRadioButtonModel( StyleBag * all_styles ) 177 SAL_THROW( (css::uno::Exception) ); 178 void readComboBoxModel( StyleBag * all_styles ) 179 SAL_THROW( (css::uno::Exception) ); 180 void readCurrencyFieldModel( StyleBag * all_styles ) 181 SAL_THROW( (css::uno::Exception) ); 182 void readDateFieldModel( StyleBag * all_styles ) 183 SAL_THROW( (css::uno::Exception) ); 184 void readFileControlModel( StyleBag * all_styles ) 185 SAL_THROW( (css::uno::Exception) ); 186 void readTreeControlModel( StyleBag * all_styles ) 187 SAL_THROW( (css::uno::Exception) ); 188 void readFixedTextModel( StyleBag * all_styles ) 189 SAL_THROW( (css::uno::Exception) ); 190 void readGroupBoxModel( StyleBag * all_styles ) 191 SAL_THROW( (css::uno::Exception) ); 192 void readImageControlModel( StyleBag * all_styles ) 193 SAL_THROW( (css::uno::Exception) ); 194 void readListBoxModel( StyleBag * all_styles ) 195 SAL_THROW( (css::uno::Exception) ); 196 void readNumericFieldModel( StyleBag * all_styles ) 197 SAL_THROW( (css::uno::Exception) ); 198 void readPatternFieldModel( StyleBag * all_styles ) 199 SAL_THROW( (css::uno::Exception) ); 200 void readFormattedFieldModel( StyleBag * all_styles ) 201 SAL_THROW( (css::uno::Exception) ); 202 void readTimeFieldModel( StyleBag * all_styles ) 203 SAL_THROW( (css::uno::Exception) ); 204 void readFixedLineModel( StyleBag * all_styles ) 205 SAL_THROW( (css::uno::Exception) ); 206 void readProgressBarModel( StyleBag * all_styles ) 207 SAL_THROW( (css::uno::Exception) ); 208 void readScrollBarModel( StyleBag * all_styles ) 209 SAL_THROW( (css::uno::Exception) ); 210 void readFixedHyperLinkModel( StyleBag * all_styles ) 211 SAL_THROW( (css::uno::Exception) ); 212 }; 213 214 template<typename T> 215 inline void ElementDescriptor::read( 216 ::rtl::OUString const & propName, ::rtl::OUString const & attrName, 217 bool forceAttribute ) 218 { 219 if (forceAttribute || 220 css::beans::PropertyState_DEFAULT_VALUE != 221 _xPropState->getPropertyState( propName )) 222 { 223 css::uno::Any a( _xProps->getPropertyValue( propName ) ); 224 T v = T(); 225 if (a >>= v) 226 addAttribute( attrName, ::rtl::OUString::valueOf(v) ); 227 else 228 OSL_ENSURE( 0, "### unexpected property type!" ); 229 } 230 } 231 232 template<typename T> 233 inline bool ElementDescriptor::readProp( 234 T * ret, ::rtl::OUString const & rPropName ) 235 { 236 _xProps->getPropertyValue( rPropName ) >>= *ret; 237 return css::beans::PropertyState_DEFAULT_VALUE != 238 _xPropState->getPropertyState( rPropName ); 239 } 240 241 } 242