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