xref: /trunk/main/oox/source/ole/axcontrol.cxx (revision ca5ec200)
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/ole/axcontrol.hxx"
25 
26 #include <com/sun/star/awt/FontSlant.hpp>
27 #include <com/sun/star/awt/FontStrikeout.hpp>
28 #include <com/sun/star/awt/FontUnderline.hpp>
29 #include <com/sun/star/awt/FontWeight.hpp>
30 #include <com/sun/star/awt/ImagePosition.hpp>
31 #include <com/sun/star/awt/ImageScaleMode.hpp>
32 #include <com/sun/star/awt/Point.hpp>
33 #include <com/sun/star/awt/ScrollBarOrientation.hpp>
34 #include <com/sun/star/awt/Size.hpp>
35 #include <com/sun/star/awt/TextAlign.hpp>
36 #include <com/sun/star/awt/VisualEffect.hpp>
37 #include <com/sun/star/awt/XControlModel.hpp>
38 #include <com/sun/star/beans/NamedValue.hpp>
39 #include <com/sun/star/container/XIndexContainer.hpp>
40 #include <com/sun/star/form/XForm.hpp>
41 #include <com/sun/star/form/XFormComponent.hpp>
42 #include <com/sun/star/form/XFormsSupplier.hpp>
43 #include <com/sun/star/form/binding/XBindableValue.hpp>
44 #include <com/sun/star/form/binding/XListEntrySink.hpp>
45 #include <com/sun/star/form/binding/XListEntrySource.hpp>
46 #include <com/sun/star/form/binding/XValueBinding.hpp>
47 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
48 #include <com/sun/star/sheet/XCellRangeAddressable.hpp>
49 #include <com/sun/star/sheet/XCellRangeReferrer.hpp>
50 #include <com/sun/star/style/VerticalAlignment.hpp>
51 #include <com/sun/star/table/CellAddress.hpp>
52 #include <com/sun/star/table/CellRangeAddress.hpp>
53 #include <rtl/tencinfo.h>
54 #include "oox/helper/attributelist.hxx"
55 #include "oox/helper/binaryinputstream.hxx"
56 #include "oox/helper/containerhelper.hxx"
57 #include "oox/helper/graphichelper.hxx"
58 #include "oox/helper/propertymap.hxx"
59 
60 namespace oox {
61 namespace ole {
62 
63 // ============================================================================
64 
65 using namespace ::com::sun::star::awt;
66 using namespace ::com::sun::star::beans;
67 using namespace ::com::sun::star::container;
68 using namespace ::com::sun::star::drawing;
69 using namespace ::com::sun::star::form;
70 using namespace ::com::sun::star::form::binding;
71 using namespace ::com::sun::star::frame;
72 using namespace ::com::sun::star::lang;
73 using namespace ::com::sun::star::sheet;
74 using namespace ::com::sun::star::style;
75 using namespace ::com::sun::star::table;
76 using namespace ::com::sun::star::uno;
77 
78 using ::rtl::OUString;
79 
80 // ============================================================================
81 
82 namespace {
83 
84 const sal_uInt32 COMCTL_ID_SIZE             = 0x12344321;
85 
86 const sal_uInt32 COMCTL_ID_COMMONDATA       = 0xABCDEF01;
87 const sal_uInt32 COMCTL_COMMON_FLATBORDER   = 0x00000001;
88 const sal_uInt32 COMCTL_COMMON_ENABLED      = 0x00000002;
89 const sal_uInt32 COMCTL_COMMON_3DBORDER     = 0x00000004;
90 const sal_uInt32 COMCTL_COMMON_OLEDROPMAN   = 0x00002000;
91 
92 const sal_uInt32 COMCTL_ID_COMPLEXDATA      = 0xBDECDE1F;
93 const sal_uInt32 COMCTL_COMPLEX_FONT        = 0x00000001;
94 const sal_uInt32 COMCTL_COMPLEX_MOUSEICON   = 0x00000002;
95 
96 const sal_uInt32 COMCTL_ID_SCROLLBAR_60     = 0x99470A83;
97 const sal_uInt32 COMCTL_SCROLLBAR_HOR       = 0x00000010;
98 const sal_Int32 COMCTL_SCROLLBAR_3D         = 0;
99 const sal_Int32 COMCTL_SCROLLBAR_FLAT       = 1;
100 const sal_Int32 COMCTL_SCROLLBAR_TRACK3D    = 2;
101 
102 const sal_uInt32 COMCTL_ID_PROGRESSBAR_50   = 0xE6E17E84;
103 const sal_uInt32 COMCTL_ID_PROGRESSBAR_60   = 0x97AB8A01;
104 
105 // ----------------------------------------------------------------------------
106 
107 const sal_uInt32 AX_CMDBUTTON_DEFFLAGS      = 0x0000001B;
108 const sal_uInt32 AX_LABEL_DEFFLAGS          = 0x0080001B;
109 const sal_uInt32 AX_IMAGE_DEFFLAGS          = 0x0000001B;
110 const sal_uInt32 AX_MORPHDATA_DEFFLAGS      = 0x2C80081B;
111 const sal_uInt32 AX_SPINBUTTON_DEFFLAGS     = 0x0000001B;
112 const sal_uInt32 AX_SCROLLBAR_DEFFLAGS      = 0x0000001B;
113 const sal_uInt32 AX_TABSTRIP_DEFFLAGS       = 0x0000001B;
114 
115 const sal_uInt16 AX_POS_TOPLEFT             = 0;
116 const sal_uInt16 AX_POS_TOP                 = 1;
117 const sal_uInt16 AX_POS_TOPRIGHT            = 2;
118 const sal_uInt16 AX_POS_LEFT                = 3;
119 const sal_uInt16 AX_POS_CENTER              = 4;
120 const sal_uInt16 AX_POS_RIGHT               = 5;
121 const sal_uInt16 AX_POS_BOTTOMLEFT          = 6;
122 const sal_uInt16 AX_POS_BOTTOM              = 7;
123 const sal_uInt16 AX_POS_BOTTOMRIGHT         = 8;
124 
125 #define AX_PICPOS_IMPL( label, image ) ((AX_POS_##label << 16) | AX_POS_##image)
126 const sal_uInt32 AX_PICPOS_LEFTTOP          = AX_PICPOS_IMPL( TOPRIGHT,    TOPLEFT );
127 const sal_uInt32 AX_PICPOS_LEFTCENTER       = AX_PICPOS_IMPL( RIGHT,       LEFT );
128 const sal_uInt32 AX_PICPOS_LEFTBOTTOM       = AX_PICPOS_IMPL( BOTTOMRIGHT, BOTTOMLEFT );
129 const sal_uInt32 AX_PICPOS_RIGHTTOP         = AX_PICPOS_IMPL( TOPLEFT,     TOPRIGHT );
130 const sal_uInt32 AX_PICPOS_RIGHTCENTER      = AX_PICPOS_IMPL( LEFT,        RIGHT );
131 const sal_uInt32 AX_PICPOS_RIGHTBOTTOM      = AX_PICPOS_IMPL( BOTTOMLEFT,  BOTTOMRIGHT );
132 const sal_uInt32 AX_PICPOS_ABOVELEFT        = AX_PICPOS_IMPL( BOTTOMLEFT,  TOPLEFT );
133 const sal_uInt32 AX_PICPOS_ABOVECENTER      = AX_PICPOS_IMPL( BOTTOM,      TOP  );
134 const sal_uInt32 AX_PICPOS_ABOVERIGHT       = AX_PICPOS_IMPL( BOTTOMRIGHT, TOPRIGHT );
135 const sal_uInt32 AX_PICPOS_BELOWLEFT        = AX_PICPOS_IMPL( TOPLEFT,     BOTTOMLEFT );
136 const sal_uInt32 AX_PICPOS_BELOWCENTER      = AX_PICPOS_IMPL( TOP,         BOTTOM );
137 const sal_uInt32 AX_PICPOS_BELOWRIGHT       = AX_PICPOS_IMPL( TOPRIGHT,    BOTTOMRIGHT );
138 const sal_uInt32 AX_PICPOS_CENTER           = AX_PICPOS_IMPL( CENTER,      CENTER  );
139 #undef AX_PICPOS_IMPL
140 
141 const sal_Int32 AX_MATCHENTRY_FIRSTLETTER   = 0;
142 const sal_Int32 AX_MATCHENTRY_COMPLETE      = 1;
143 const sal_Int32 AX_MATCHENTRY_NONE          = 2;
144 
145 const sal_Int32 AX_ORIENTATION_AUTO         = -1;
146 const sal_Int32 AX_ORIENTATION_VERTICAL     = 0;
147 const sal_Int32 AX_ORIENTATION_HORIZONTAL   = 1;
148 
149 const sal_Int32 AX_PROPTHUMB_ON             = -1;
150 const sal_Int32 AX_PROPTHUMB_OFF            = 0;
151 
152 const sal_uInt32 AX_TABSTRIP_TABS           = 0;
153 const sal_uInt32 AX_TABSTRIP_BUTTONS        = 1;
154 const sal_uInt32 AX_TABSTRIP_NONE           = 2;
155 
156 const sal_uInt32 AX_CONTAINER_ENABLED       = 0x00000004;
157 const sal_uInt32 AX_CONTAINER_HASDESIGNEXT  = 0x00004000;
158 const sal_uInt32 AX_CONTAINER_NOCLASSTABLE  = 0x00008000;
159 
160 const sal_uInt32 AX_CONTAINER_DEFFLAGS      = 0x00000004;
161 
162 const sal_Int32 AX_CONTAINER_DEFWIDTH       = 4000;
163 const sal_Int32 AX_CONTAINER_DEFHEIGHT      = 3000;
164 
165 const sal_Int32 AX_CONTAINER_CYCLEALL       = 0;
166 const sal_Int32 AX_CONTAINER_CYCLECURRENT   = 2;
167 
168 const sal_Int32 AX_CONTAINER_SCR_NONE       = 0x00;
169 const sal_Int32 AX_CONTAINER_SCR_HOR        = 0x01;
170 const sal_Int32 AX_CONTAINER_SCR_VER        = 0x02;
171 const sal_Int32 AX_CONTAINER_SCR_KEEP_HOR   = 0x04;
172 const sal_Int32 AX_CONTAINER_SCR_KEEP_VER   = 0x08;
173 const sal_Int32 AX_CONTAINER_SCR_SHOW_LEFT  = 0x10;
174 
175 // ----------------------------------------------------------------------------
176 
177 const sal_Int16 API_BORDER_NONE             = 0;
178 const sal_Int16 API_BORDER_SUNKEN           = 1;
179 const sal_Int16 API_BORDER_FLAT             = 2;
180 
181 const sal_Int16 API_STATE_UNCHECKED         = 0;
182 const sal_Int16 API_STATE_CHECKED           = 1;
183 const sal_Int16 API_STATE_DONTKNOW          = 2;
184 
185 // ----------------------------------------------------------------------------
186 
187 /** Tries to extract a range address from a defined name. */
188 bool lclExtractRangeFromName( CellRangeAddress& orRangeAddr, const Reference< XModel >& rxDocModel, const OUString& rAddressString )
189 {
190     try
191     {
192         PropertySet aPropSet( rxDocModel );
193         Reference< XNameAccess > xRangesNA( aPropSet.getAnyProperty( PROP_NamedRanges ), UNO_QUERY_THROW );
194         Reference< XCellRangeReferrer > xReferrer( xRangesNA->getByName( rAddressString ), UNO_QUERY_THROW );
195         Reference< XCellRangeAddressable > xAddressable( xReferrer->getReferredCells(), UNO_QUERY_THROW );
196         orRangeAddr = xAddressable->getRangeAddress();
197         return true;
198     }
199     catch( Exception& )
200     {
201     }
202     return false;
203 }
204 
205 bool lclExtractAddressFromName( CellAddress& orAddress, const Reference< XModel >& rxDocModel, const OUString& rAddressString )
206 {
207     CellRangeAddress aRangeAddr;
208     if( lclExtractRangeFromName( aRangeAddr, rxDocModel, rAddressString ) &&
209         (aRangeAddr.StartColumn == aRangeAddr.EndColumn) &&
210         (aRangeAddr.StartRow == aRangeAddr.EndRow) )
211     {
212         orAddress.Sheet = aRangeAddr.Sheet;
213         orAddress.Column = aRangeAddr.StartColumn;
214         orAddress.Row = aRangeAddr.StartRow;
215         return true;
216     }
217     return false;
218 }
219 
220 void lclPrepareConverter( PropertySet& rConverter, const Reference< XModel >& rxDocModel,
221         const OUString& rAddressString, sal_Int32 nRefSheet, bool bRange )
222 {
223     if( !rConverter.is() ) try
224     {
225         Reference< XMultiServiceFactory > xModelFactory( rxDocModel, UNO_QUERY_THROW );
226         OUString aServiceName = bRange ?
227             CREATE_OUSTRING( "com.sun.star.table.CellRangeAddressConversion" ) :
228             CREATE_OUSTRING( "com.sun.star.table.CellAddressConversion" );
229         rConverter.set( xModelFactory->createInstance( aServiceName ) );
230     }
231     catch( Exception& )
232     {
233     }
234     rConverter.setProperty( PROP_XLA1Representation, rAddressString );
235     rConverter.setProperty( PROP_ReferenceSheet, nRefSheet );
236 }
237 
238 } // namespace
239 
240 // ============================================================================
241 
242 ControlConverter::ControlConverter( const Reference< XModel >& rxDocModel,
243         const GraphicHelper& rGraphicHelper, bool bDefaultColorBgr ) :
244     mxDocModel( rxDocModel ),
245     mrGraphicHelper( rGraphicHelper ),
246     mbDefaultColorBgr( bDefaultColorBgr )
247 {
248     OSL_ENSURE( mxDocModel.is(), "ControlConverter::ControlConverter - missing document model" );
249 }
250 
251 ControlConverter::~ControlConverter()
252 {
253 }
254 
255 // Generic conversion ---------------------------------------------------------
256 
257 void ControlConverter::convertPosition( PropertyMap& rPropMap, const AxPairData& rPos ) const
258 {
259     // position is given in 1/100 mm, UNO needs AppFont units
260     Point aAppFontPos = mrGraphicHelper.convertHmmToAppFont( Point( rPos.first, rPos.second ) );
261     rPropMap.setProperty( PROP_PositionX, aAppFontPos.X );
262     rPropMap.setProperty( PROP_PositionY, aAppFontPos.Y );
263 }
264 
265 void ControlConverter::convertSize( PropertyMap& rPropMap, const AxPairData& rSize ) const
266 {
267     // size is given in 1/100 mm, UNO needs AppFont units
268     Size aAppFontSize = mrGraphicHelper.convertHmmToAppFont( Size( rSize.first, rSize.second ) );
269     rPropMap.setProperty( PROP_Width, aAppFontSize.Width );
270     rPropMap.setProperty( PROP_Height, aAppFontSize.Height );
271 }
272 
273 void ControlConverter::convertColor( PropertyMap& rPropMap, sal_Int32 nPropId, sal_uInt32 nOleColor ) const
274 {
275     rPropMap.setProperty( nPropId, OleHelper::decodeOleColor( mrGraphicHelper, nOleColor, mbDefaultColorBgr ) );
276 }
277 
278 void ControlConverter::convertPicture( PropertyMap& rPropMap, const StreamDataSequence& rPicData ) const
279 {
280     if( rPicData.hasElements() )
281     {
282         OUString aGraphicUrl = mrGraphicHelper.importGraphicObject( rPicData );
283         if( aGraphicUrl.getLength() > 0 )
284             rPropMap.setProperty( PROP_ImageURL, aGraphicUrl );
285     }
286 }
287 
288 void ControlConverter::convertOrientation( PropertyMap& rPropMap, bool bHorizontal ) const
289 {
290     sal_Int32 nScrollOrient = bHorizontal ? ScrollBarOrientation::HORIZONTAL : ScrollBarOrientation::VERTICAL;
291     rPropMap.setProperty( PROP_Orientation, nScrollOrient );
292 }
293 
294 void ControlConverter::convertVerticalAlign( PropertyMap& rPropMap, sal_Int32 nVerticalAlign ) const
295 {
296     VerticalAlignment eAlign = VerticalAlignment_TOP;
297     switch( nVerticalAlign )
298     {
299         case XML_Top:       eAlign = VerticalAlignment_TOP;     break;
300         case XML_Center:    eAlign = VerticalAlignment_MIDDLE;  break;
301         case XML_Bottom:    eAlign = VerticalAlignment_BOTTOM;  break;
302     }
303     rPropMap.setProperty( PROP_VerticalAlign, eAlign );
304 }
305 
306 void ControlConverter::convertScrollBar( PropertyMap& rPropMap,
307         sal_Int32 nMin, sal_Int32 nMax, sal_Int32 nPosition,
308         sal_Int32 nSmallChange, sal_Int32 nLargeChange, bool bAwtModel ) const
309 {
310     rPropMap.setProperty( PROP_ScrollValueMin, ::std::min( nMin, nMax ) );
311     rPropMap.setProperty( PROP_ScrollValueMax, ::std::max( nMin, nMax ) );
312     rPropMap.setProperty( PROP_LineIncrement, nSmallChange );
313     rPropMap.setProperty( PROP_BlockIncrement, nLargeChange );
314     rPropMap.setProperty( bAwtModel ? PROP_ScrollValue : PROP_DefaultScrollValue, nPosition );
315 }
316 
317 void ControlConverter::bindToSources( const Reference< XControlModel >& rxCtrlModel,
318         const OUString& rCtrlSource, const OUString& rRowSource, sal_Int32 nRefSheet ) const
319 {
320     // value binding
321     if( rCtrlSource.getLength() > 0 ) try
322     {
323         // first check if the XBindableValue interface is supported
324         Reference< XBindableValue > xBindable( rxCtrlModel, UNO_QUERY_THROW );
325 
326         // convert address string to cell address struct
327         CellAddress aAddress;
328         if( !lclExtractAddressFromName( aAddress, mxDocModel, rCtrlSource ) )
329         {
330             lclPrepareConverter( maAddressConverter, mxDocModel, rCtrlSource, nRefSheet, false );
331             if( !maAddressConverter.getProperty( aAddress, PROP_Address ) )
332                 throw RuntimeException();
333         }
334 
335         // create argument sequence
336         NamedValue aValue;
337         aValue.Name = CREATE_OUSTRING( "BoundCell" );
338         aValue.Value <<= aAddress;
339         Sequence< Any > aArgs( 1 );
340         aArgs[ 0 ] <<= aValue;
341 
342         // create the CellValueBinding instance and set at the control model
343         Reference< XMultiServiceFactory > xModelFactory( mxDocModel, UNO_QUERY_THROW );
344         Reference< XValueBinding > xBinding( xModelFactory->createInstanceWithArguments(
345             CREATE_OUSTRING( "com.sun.star.table.CellValueBinding" ), aArgs ), UNO_QUERY_THROW );
346         xBindable->setValueBinding( xBinding );
347     }
348     catch( Exception& )
349     {
350     }
351 
352     // list entry source
353     if( rRowSource.getLength() > 0 ) try
354     {
355         // first check if the XListEntrySink interface is supported
356         Reference< XListEntrySink > xEntrySink( rxCtrlModel, UNO_QUERY_THROW );
357 
358         // convert address string to cell range address struct
359         CellRangeAddress aRangeAddr;
360         if( !lclExtractRangeFromName( aRangeAddr, mxDocModel, rRowSource ) )
361         {
362             lclPrepareConverter( maRangeConverter, mxDocModel, rRowSource, nRefSheet, true );
363             if( !maRangeConverter.getProperty( aRangeAddr, PROP_Address ) )
364                 throw RuntimeException();
365         }
366 
367         // create argument sequence
368         NamedValue aValue;
369         aValue.Name = CREATE_OUSTRING( "CellRange" );
370         aValue.Value <<= aRangeAddr;
371         Sequence< Any > aArgs( 1 );
372         aArgs[ 0 ] <<= aValue;
373 
374         // create the EntrySource instance and set at the control model
375         Reference< XMultiServiceFactory > xModelFactory( mxDocModel, UNO_QUERY_THROW );
376         Reference< XListEntrySource > xEntrySource( xModelFactory->createInstanceWithArguments(
377             CREATE_OUSTRING( "com.sun.star.table.CellRangeListSource"  ), aArgs ), UNO_QUERY_THROW );
378         xEntrySink->setListEntrySource( xEntrySource );
379     }
380     catch( Exception& )
381     {
382     }
383 }
384 
385 // ActiveX (Forms 2.0) specific conversion ------------------------------------
386 
387 void ControlConverter::convertAxBackground( PropertyMap& rPropMap,
388         sal_uInt32 nBackColor, sal_uInt32 nFlags, ApiTransparencyMode eTranspMode ) const
389 {
390     bool bOpaque = getFlag( nFlags, AX_FLAGS_OPAQUE );
391     switch( eTranspMode )
392     {
393         case API_TRANSPARENCY_NOTSUPPORTED:
394             // fake transparency by using system window background if needed
395             convertColor( rPropMap, PROP_BackgroundColor, bOpaque ? nBackColor : AX_SYSCOLOR_WINDOWBACK );
396         break;
397         case API_TRANSPARENCY_PAINTTRANSPARENT:
398             rPropMap.setProperty( PROP_PaintTransparent, !bOpaque );
399             // run-through intended!
400         case API_TRANSPARENCY_VOID:
401             // keep transparency by leaving the (void) default property value
402             if( bOpaque )
403                 convertColor( rPropMap, PROP_BackgroundColor, nBackColor );
404         break;
405     }
406 }
407 
408 void ControlConverter::convertAxBorder( PropertyMap& rPropMap,
409         sal_uInt32 nBorderColor, sal_Int32 nBorderStyle, sal_Int32 nSpecialEffect ) const
410 {
411     sal_Int16 nBorder = (nBorderStyle == AX_BORDERSTYLE_SINGLE) ? API_BORDER_FLAT :
412         ((nSpecialEffect == AX_SPECIALEFFECT_FLAT) ? API_BORDER_NONE : API_BORDER_SUNKEN);
413     rPropMap.setProperty( PROP_Border, nBorder );
414     convertColor( rPropMap, PROP_BorderColor, nBorderColor );
415 }
416 
417 void ControlConverter::convertAxVisualEffect( PropertyMap& rPropMap, sal_Int32 nSpecialEffect ) const
418 {
419     sal_Int16 nVisualEffect = (nSpecialEffect == AX_SPECIALEFFECT_FLAT) ? VisualEffect::FLAT : VisualEffect::LOOK3D;
420     rPropMap.setProperty( PROP_VisualEffect, nVisualEffect );
421 }
422 
423 void ControlConverter::convertAxPicture( PropertyMap& rPropMap, const StreamDataSequence& rPicData, sal_uInt32 nPicPos ) const
424 {
425     // the picture
426     convertPicture( rPropMap, rPicData );
427 
428     // picture position
429     sal_Int16 nImagePos = ImagePosition::LeftCenter;
430     switch( nPicPos )
431     {
432         case AX_PICPOS_LEFTTOP:     nImagePos = ImagePosition::LeftTop;     break;
433         case AX_PICPOS_LEFTCENTER:  nImagePos = ImagePosition::LeftCenter;  break;
434         case AX_PICPOS_LEFTBOTTOM:  nImagePos = ImagePosition::LeftBottom;  break;
435         case AX_PICPOS_RIGHTTOP:    nImagePos = ImagePosition::RightTop;    break;
436         case AX_PICPOS_RIGHTCENTER: nImagePos = ImagePosition::RightCenter; break;
437         case AX_PICPOS_RIGHTBOTTOM: nImagePos = ImagePosition::RightBottom; break;
438         case AX_PICPOS_ABOVELEFT:   nImagePos = ImagePosition::AboveLeft;   break;
439         case AX_PICPOS_ABOVECENTER: nImagePos = ImagePosition::AboveCenter; break;
440         case AX_PICPOS_ABOVERIGHT:  nImagePos = ImagePosition::AboveRight;  break;
441         case AX_PICPOS_BELOWLEFT:   nImagePos = ImagePosition::BelowLeft;   break;
442         case AX_PICPOS_BELOWCENTER: nImagePos = ImagePosition::BelowCenter; break;
443         case AX_PICPOS_BELOWRIGHT:  nImagePos = ImagePosition::BelowRight;  break;
444         case AX_PICPOS_CENTER:      nImagePos = ImagePosition::Centered;    break;
445         default:    OSL_ENSURE( false, "ControlConverter::convertAxPicture - unknown picture position" );
446     }
447     rPropMap.setProperty( PROP_ImagePosition, nImagePos );
448 }
449 
450 void ControlConverter::convertAxPicture( PropertyMap& rPropMap, const StreamDataSequence& rPicData,
451         sal_Int32 nPicSizeMode, sal_Int32 /*nPicAlign*/, bool /*bPicTiling*/ ) const
452 {
453     // the picture
454     convertPicture( rPropMap, rPicData );
455 
456     // picture scale mode
457     sal_Int16 nScaleMode = ImageScaleMode::None;
458     switch( nPicSizeMode )
459     {
460         case AX_PICSIZE_CLIP:       nScaleMode = ImageScaleMode::None;          break;
461         case AX_PICSIZE_STRETCH:    nScaleMode = ImageScaleMode::Anisotropic;   break;
462         case AX_PICSIZE_ZOOM:       nScaleMode = ImageScaleMode::Isotropic;     break;
463         default:    OSL_ENSURE( false, "ControlConverter::convertAxPicture - unknown picture size mode" );
464     }
465     rPropMap.setProperty( PROP_ScaleMode, nScaleMode );
466 }
467 
468 void ControlConverter::convertAxState( PropertyMap& rPropMap,
469         const OUString& rValue, sal_Int32 nMultiSelect, ApiDefaultStateMode eDefStateMode, bool bAwtModel ) const
470 {
471     bool bBooleanState = eDefStateMode == API_DEFAULTSTATE_BOOLEAN;
472     bool bSupportsTriState = eDefStateMode == API_DEFAULTSTATE_TRISTATE;
473 
474     // state
475     sal_Int16 nState = bSupportsTriState ? API_STATE_DONTKNOW : API_STATE_UNCHECKED;
476     if( rValue.getLength() == 1 ) switch( rValue[ 0 ] )
477     {
478         case '0':   nState = API_STATE_UNCHECKED;   break;
479         case '1':   nState = API_STATE_CHECKED;     break;
480         // any other string (also empty) means 'dontknow'
481     }
482     sal_Int32 nPropId = bAwtModel ? PROP_State : PROP_DefaultState;
483     if( bBooleanState )
484         rPropMap.setProperty( nPropId, nState != API_STATE_UNCHECKED );
485     else
486         rPropMap.setProperty( nPropId, nState );
487 
488     // tristate
489     if( bSupportsTriState )
490         rPropMap.setProperty( PROP_TriState, nMultiSelect == AX_SELCTION_MULTI );
491 }
492 
493 void ControlConverter::convertAxOrientation( PropertyMap& rPropMap,
494         const AxPairData& rSize, sal_Int32 nOrientation ) const
495 {
496     bool bHorizontal = true;
497     switch( nOrientation )
498     {
499         case AX_ORIENTATION_AUTO:       bHorizontal = rSize.first > rSize.second;   break;
500         case AX_ORIENTATION_VERTICAL:   bHorizontal = false;                        break;
501         case AX_ORIENTATION_HORIZONTAL: bHorizontal = true;                         break;
502         default:    OSL_ENSURE( false, "ControlConverter::convertAxOrientation - unknown orientation" );
503     }
504     convertOrientation( rPropMap, bHorizontal );
505 }
506 
507 // ============================================================================
508 
509 ControlModelBase::ControlModelBase() :
510     maSize( 0, 0 ),
511     mbAwtModel( false )
512 {
513 }
514 
515 ControlModelBase::~ControlModelBase()
516 {
517 }
518 
519 OUString ControlModelBase::getServiceName() const
520 {
521     ApiControlType eCtrlType = getControlType();
522     if( mbAwtModel ) switch( eCtrlType )
523     {
524         case API_CONTROL_BUTTON:        return CREATE_OUSTRING( "com.sun.star.awt.UnoControlButtonModel" );
525         case API_CONTROL_FIXEDTEXT:     return CREATE_OUSTRING( "com.sun.star.awt.UnoControlFixedTextModel" );
526         case API_CONTROL_IMAGE:         return CREATE_OUSTRING( "com.sun.star.awt.UnoControlImageControlModel" );
527         case API_CONTROL_CHECKBOX:      return CREATE_OUSTRING( "com.sun.star.awt.UnoControlCheckBoxModel" );
528         case API_CONTROL_RADIOBUTTON:   return CREATE_OUSTRING( "com.sun.star.awt.UnoControlRadioButtonModel" );
529         case API_CONTROL_EDIT:          return CREATE_OUSTRING( "com.sun.star.awt.UnoControlEditModel" );
530         case API_CONTROL_NUMERIC:       return CREATE_OUSTRING( "com.sun.star.awt.UnoControlNumericFieldModel" );
531         case API_CONTROL_LISTBOX:       return CREATE_OUSTRING( "com.sun.star.awt.UnoControlListBoxModel" );
532         case API_CONTROL_COMBOBOX:      return CREATE_OUSTRING( "com.sun.star.awt.UnoControlComboBoxModel" );
533         case API_CONTROL_SPINBUTTON:    return CREATE_OUSTRING( "com.sun.star.awt.UnoControlSpinButtonModel" );
534         case API_CONTROL_SCROLLBAR:     return CREATE_OUSTRING( "com.sun.star.awt.UnoControlScrollBarModel" );
535         case API_CONTROL_PROGRESSBAR:   return CREATE_OUSTRING( "com.sun.star.awt.UnoControlProgressBarModel" );
536         case API_CONTROL_GROUPBOX:      return CREATE_OUSTRING( "com.sun.star.awt.UnoControlGroupBoxModel" );
537         case API_CONTROL_DIALOG:        return CREATE_OUSTRING( "com.sun.star.awt.UnoControlDialogModel" );
538         default:    OSL_ENSURE( false, "ControlModelBase::getServiceName - no AWT model service supported" );
539     }
540     else switch( eCtrlType )
541     {
542         case API_CONTROL_BUTTON:        return CREATE_OUSTRING( "com.sun.star.form.component.CommandButton" );
543         case API_CONTROL_FIXEDTEXT:     return CREATE_OUSTRING( "com.sun.star.form.component.FixedText" );
544         case API_CONTROL_IMAGE:         return CREATE_OUSTRING( "com.sun.star.form.component.DatabaseImageControl" );
545         case API_CONTROL_CHECKBOX:      return CREATE_OUSTRING( "com.sun.star.form.component.CheckBox" );
546         case API_CONTROL_RADIOBUTTON:   return CREATE_OUSTRING( "com.sun.star.form.component.RadioButton" );
547         case API_CONTROL_EDIT:          return CREATE_OUSTRING( "com.sun.star.form.component.TextField" );
548         case API_CONTROL_NUMERIC:       return CREATE_OUSTRING( "com.sun.star.form.component.NumericField" );
549         case API_CONTROL_LISTBOX:       return CREATE_OUSTRING( "com.sun.star.form.component.ListBox" );
550         case API_CONTROL_COMBOBOX:      return CREATE_OUSTRING( "com.sun.star.form.component.ComboBox" );
551         case API_CONTROL_SPINBUTTON:    return CREATE_OUSTRING( "com.sun.star.form.component.SpinButton" );
552         case API_CONTROL_SCROLLBAR:     return CREATE_OUSTRING( "com.sun.star.form.component.ScrollBar" );
553         case API_CONTROL_GROUPBOX:      return CREATE_OUSTRING( "com.sun.star.form.component.GroupBox" );
554         default:    OSL_ENSURE( false, "ControlModelBase::getServiceName - no form component service supported" );
555     }
556     return OUString();
557 }
558 
559 void ControlModelBase::importProperty( sal_Int32 /*nPropId*/, const OUString& /*rValue*/ )
560 {
561 }
562 
563 void ControlModelBase::importPictureData( sal_Int32 /*nPropId*/, BinaryInputStream& /*rInStrm*/ )
564 {
565 }
566 
567 void ControlModelBase::convertProperties( PropertyMap& /*rPropMap*/, const ControlConverter& /*rConv*/ ) const
568 {
569 }
570 
571 void ControlModelBase::convertSize( PropertyMap& rPropMap, const ControlConverter& rConv ) const
572 {
573     rConv.convertSize( rPropMap, maSize );
574 }
575 
576 // ============================================================================
577 
578 ComCtlModelBase::ComCtlModelBase( sal_uInt32 nDataPartId5, sal_uInt32 nDataPartId6,
579         sal_uInt16 nVersion, bool bCommonPart, bool bComplexPart ) :
580     maFontData( CREATE_OUSTRING( "Tahoma" ), 82500 ),
581     mnFlags( 0 ),
582     mnVersion( nVersion ),
583     mnDataPartId5( nDataPartId5 ),
584     mnDataPartId6( nDataPartId6 ),
585     mbCommonPart( bCommonPart ),
586     mbComplexPart( bComplexPart )
587 {
588 }
589 
590 bool ComCtlModelBase::importBinaryModel( BinaryInputStream& rInStrm )
591 {
592     // read initial size part and header of the control data part
593     if( importSizePart( rInStrm ) && readPartHeader( rInStrm, getDataPartId(), mnVersion ) )
594     {
595         // if flags part exists, the first int32 of the data part contains its size
596         sal_uInt32 nCommonPartSize = mbCommonPart ? rInStrm.readuInt32() : 0;
597         // implementations must read the exact amount of data, stream must point to its end afterwards
598         importControlData( rInStrm );
599         // read following parts
600         if( !rInStrm.isEof() &&
601             (!mbCommonPart || importCommonPart( rInStrm, nCommonPartSize )) &&
602             (!mbComplexPart || importComplexPart( rInStrm )) )
603         {
604             return !rInStrm.isEof();
605         }
606     }
607     return false;
608 }
609 
610 void ComCtlModelBase::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const
611 {
612     if( mbCommonPart )
613         rPropMap.setProperty( PROP_Enabled, getFlag( mnFlags, COMCTL_COMMON_ENABLED ) );
614     ControlModelBase::convertProperties( rPropMap, rConv );
615 }
616 
617 void ComCtlModelBase::importCommonExtraData( BinaryInputStream& /*rInStrm*/ )
618 {
619 }
620 
621 void ComCtlModelBase::importCommonTrailingData( BinaryInputStream& /*rInStrm*/ )
622 {
623 }
624 
625 sal_uInt32 ComCtlModelBase::getDataPartId() const
626 {
627     switch( mnVersion )
628     {
629         case COMCTL_VERSION_50: return mnDataPartId5;
630         case COMCTL_VERSION_60: return mnDataPartId6;
631     }
632     OSL_ENSURE( false, "ComCtlObjectBase::getDataPartId - unxpected version" );
633     return SAL_MAX_UINT32;
634 }
635 
636 bool ComCtlModelBase::readPartHeader( BinaryInputStream& rInStrm, sal_uInt32 nExpPartId, sal_uInt16 nExpMajor, sal_uInt16 nExpMinor )
637 {
638     // no idea if all this is correct...
639     sal_uInt32 nPartId;
640     sal_uInt16 nMajor, nMinor;
641     rInStrm >> nPartId >> nMinor >> nMajor;
642     bool bPartId = nPartId == nExpPartId;
643     OSL_ENSURE( bPartId, "ComCtlObjectBase::readPartHeader - unexpected part identifier" );
644     bool bVersion = ((nExpMajor == SAL_MAX_UINT16) || (nExpMajor == nMajor)) && ((nExpMinor == SAL_MAX_UINT16) || (nExpMinor == nMinor));
645     OSL_ENSURE( bVersion, "ComCtlObjectBase::readPartHeader - unexpected part version" );
646     return !rInStrm.isEof() && bPartId && bVersion;
647 }
648 
649 bool ComCtlModelBase::importSizePart( BinaryInputStream& rInStrm )
650 {
651     if( readPartHeader( rInStrm, COMCTL_ID_SIZE, 0, 8 ) )
652     {
653         rInStrm >> maSize.first >> maSize.second;
654         return !rInStrm.isEof();
655     }
656     return false;
657 }
658 
659 bool ComCtlModelBase::importCommonPart( BinaryInputStream& rInStrm, sal_uInt32 nPartSize )
660 {
661     sal_Int64 nEndPos = rInStrm.tell() + nPartSize;
662     if( (nPartSize >= 16) && readPartHeader( rInStrm, COMCTL_ID_COMMONDATA, 5, 0 ) )
663     {
664         rInStrm.skip( 4 );
665         rInStrm >> mnFlags;
666         // implementations may read less than the exact amount of data
667         importCommonExtraData( rInStrm );
668         rInStrm.seek( nEndPos );
669         // implementations must read the exact amount of data, stream must point to its end afterwards
670         importCommonTrailingData( rInStrm );
671         return !rInStrm.isEof();
672     }
673     return false;
674 }
675 
676 bool ComCtlModelBase::importComplexPart( BinaryInputStream& rInStrm )
677 {
678     if( readPartHeader( rInStrm, COMCTL_ID_COMPLEXDATA, 5, 1 ) )
679     {
680         sal_uInt32 nContFlags;
681         rInStrm >> nContFlags;
682         bool bReadOk =
683             (!getFlag( nContFlags, COMCTL_COMPLEX_FONT ) || OleHelper::importStdFont( maFontData, rInStrm, true )) &&
684             (!getFlag( nContFlags, COMCTL_COMPLEX_MOUSEICON ) || OleHelper::importStdPic( maMouseIcon, rInStrm, true ));
685         return bReadOk && !rInStrm.isEof();
686     }
687     return false;
688 }
689 
690 // ============================================================================
691 
692 ComCtlScrollBarModel::ComCtlScrollBarModel( sal_uInt16 nVersion ) :
693     ComCtlModelBase( SAL_MAX_UINT32, COMCTL_ID_SCROLLBAR_60, nVersion, true, true ),
694     mnScrollBarFlags( 0x00000011 ),
695     mnLargeChange( 1 ),
696     mnSmallChange( 1 ),
697     mnMin( 0 ),
698     mnMax( 32767 ),
699     mnPosition( 0 )
700 {
701 }
702 
703 ApiControlType ComCtlScrollBarModel::getControlType() const
704 {
705     return API_CONTROL_SCROLLBAR;
706 }
707 
708 void ComCtlScrollBarModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const
709 {
710     rPropMap.setProperty( PROP_Border, API_BORDER_NONE );
711     rConv.convertOrientation( rPropMap, getFlag( mnScrollBarFlags, COMCTL_SCROLLBAR_HOR ) );
712     rConv.convertScrollBar( rPropMap, mnMin, mnMax, mnPosition, mnSmallChange, mnLargeChange, mbAwtModel );
713     ComCtlModelBase::convertProperties( rPropMap, rConv );
714 }
715 
716 void ComCtlScrollBarModel::importControlData( BinaryInputStream& rInStrm )
717 {
718     rInStrm >> mnScrollBarFlags >> mnLargeChange >> mnSmallChange >> mnMin >> mnMax >> mnPosition;
719 }
720 
721 // ============================================================================
722 
723 ComCtlProgressBarModel::ComCtlProgressBarModel( sal_uInt16 nVersion ) :
724     ComCtlModelBase( COMCTL_ID_PROGRESSBAR_50, COMCTL_ID_PROGRESSBAR_60, nVersion, true, true ),
725     mfMin( 0.0 ),
726     mfMax( 100.0 ),
727     mnVertical( 0 ),
728     mnSmooth( 0 )
729 {
730 }
731 
732 ApiControlType ComCtlProgressBarModel::getControlType() const
733 {
734     return API_CONTROL_PROGRESSBAR;
735 }
736 
737 void ComCtlProgressBarModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const
738 {
739     sal_uInt16 nBorder = getFlag( mnFlags, COMCTL_COMMON_3DBORDER ) ? API_BORDER_SUNKEN :
740         (getFlag( mnFlags, COMCTL_COMMON_FLATBORDER ) ? API_BORDER_FLAT : API_BORDER_NONE);
741     rPropMap.setProperty( PROP_Border, nBorder );
742     rPropMap.setProperty( PROP_ProgressValueMin, getLimitedValue< sal_Int32, double >( ::std::min( mfMin, mfMax ), 0.0, SAL_MAX_INT32 ) );
743     rPropMap.setProperty( PROP_ProgressValueMax, getLimitedValue< sal_Int32, double >( ::std::max( mfMin, mfMax ), 0.0, SAL_MAX_INT32 ) );
744     // ComCtl model does not provide current value?
745     ComCtlModelBase::convertProperties( rPropMap, rConv );
746 }
747 
748 void ComCtlProgressBarModel::importControlData( BinaryInputStream& rInStrm )
749 {
750     rInStrm >> mfMin >> mfMax;
751     if( mnVersion == COMCTL_VERSION_60 )
752         rInStrm >> mnVertical >> mnSmooth;
753 }
754 
755 // ============================================================================
756 
757 AxControlModelBase::AxControlModelBase()
758 {
759 }
760 
761 void AxControlModelBase::importProperty( sal_Int32 nPropId, const OUString& rValue )
762 {
763     switch( nPropId )
764     {
765         // size of the control shape: format is "width;height"
766         case XML_Size:
767         {
768             sal_Int32 nSepPos = rValue.indexOf( ';' );
769             OSL_ENSURE( nSepPos >= 0, "AxControlModelBase::importProperty - missing separator in 'Size' property" );
770             if( nSepPos >= 0 )
771             {
772                 maSize.first = rValue.copy( 0, nSepPos ).toInt32();
773                 maSize.second = rValue.copy( nSepPos + 1 ).toInt32();
774             }
775         }
776         break;
777     }
778 }
779 
780 // ============================================================================
781 
782 AxFontDataModel::AxFontDataModel( bool bSupportsAlign ) :
783     mbSupportsAlign( bSupportsAlign )
784 {
785 }
786 
787 void AxFontDataModel::importProperty( sal_Int32 nPropId, const OUString& rValue )
788 {
789     switch( nPropId )
790     {
791         case XML_FontName:          maFontData.maFontName = rValue;                                             break;
792         case XML_FontEffects:       maFontData.mnFontEffects = AttributeConversion::decodeUnsigned( rValue );   break;
793         case XML_FontHeight:        maFontData.mnFontHeight = AttributeConversion::decodeInteger( rValue );     break;
794         case XML_FontCharSet:       maFontData.mnFontCharSet = AttributeConversion::decodeInteger( rValue );    break;
795         case XML_ParagraphAlign:    maFontData.mnHorAlign = AttributeConversion::decodeInteger( rValue );       break;
796         default:                    AxControlModelBase::importProperty( nPropId, rValue );
797     }
798 }
799 
800 bool AxFontDataModel::importBinaryModel( BinaryInputStream& rInStrm )
801 {
802     return maFontData.importBinaryModel( rInStrm );
803 }
804 
805 void AxFontDataModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const
806 {
807     // font name
808     if( maFontData.maFontName.getLength() > 0 )
809         rPropMap.setProperty( PROP_FontName, maFontData.maFontName );
810 
811     // font effects
812     rPropMap.setProperty( PROP_FontWeight, getFlagValue( maFontData.mnFontEffects, AX_FONTDATA_BOLD, FontWeight::BOLD, FontWeight::NORMAL ) );
813     rPropMap.setProperty( PROP_FontSlant, getFlagValue< sal_Int16 >( maFontData.mnFontEffects, AX_FONTDATA_ITALIC, FontSlant_ITALIC, FontSlant_NONE ) );
814     rPropMap.setProperty( PROP_FontUnderline, getFlagValue( maFontData.mnFontEffects, AX_FONTDATA_UNDERLINE, maFontData.mbDblUnderline ? FontUnderline::DOUBLE : FontUnderline::SINGLE, FontUnderline::NONE ) );
815     rPropMap.setProperty( PROP_FontStrikeout, getFlagValue( maFontData.mnFontEffects, AX_FONTDATA_STRIKEOUT, FontStrikeout::SINGLE, FontStrikeout::NONE ) );
816     rPropMap.setProperty( PROP_FontHeight, maFontData.getHeightPoints() );
817 
818     // font character set
819     rtl_TextEncoding eFontEnc = RTL_TEXTENCODING_DONTKNOW;
820     if( (0 <= maFontData.mnFontCharSet) && (maFontData.mnFontCharSet <= SAL_MAX_UINT8) )
821         eFontEnc = rtl_getTextEncodingFromWindowsCharset( static_cast< sal_uInt8 >( maFontData.mnFontCharSet ) );
822     if( eFontEnc != RTL_TEXTENCODING_DONTKNOW )
823         rPropMap.setProperty( PROP_FontCharset, static_cast< sal_Int16 >( eFontEnc ) );
824 
825     // text alignment
826     if( mbSupportsAlign )
827     {
828         sal_Int32 nAlign = TextAlign::LEFT;
829         switch( maFontData.mnHorAlign )
830         {
831             case AX_FONTDATA_LEFT:      nAlign = TextAlign::LEFT;   break;
832             case AX_FONTDATA_RIGHT:     nAlign = TextAlign::RIGHT;  break;
833             case AX_FONTDATA_CENTER:    nAlign = TextAlign::CENTER; break;
834             default:    OSL_ENSURE( false, "AxFontDataModel::convertProperties - unknown text alignment" );
835         }
836         // form controls expect short value
837         rPropMap.setProperty( PROP_Align, static_cast< sal_Int16 >( nAlign ) );
838     }
839 
840     // process base class properties
841     AxControlModelBase::convertProperties( rPropMap, rConv );
842 }
843 
844 // ============================================================================
845 
846 AxCommandButtonModel::AxCommandButtonModel() :
847     mnTextColor( AX_SYSCOLOR_BUTTONTEXT ),
848     mnBackColor( AX_SYSCOLOR_BUTTONFACE ),
849     mnFlags( AX_CMDBUTTON_DEFFLAGS ),
850     mnPicturePos( AX_PICPOS_ABOVECENTER ),
851     mnVerticalAlign( XML_Center ),
852     mbFocusOnClick( true )
853 {
854 }
855 
856 void AxCommandButtonModel::importProperty( sal_Int32 nPropId, const OUString& rValue )
857 {
858     switch( nPropId )
859     {
860         case XML_Caption:               maCaption = rValue;                                                 break;
861         case XML_ForeColor:             mnTextColor = AttributeConversion::decodeUnsigned( rValue );        break;
862         case XML_BackColor:             mnBackColor = AttributeConversion::decodeUnsigned( rValue );        break;
863         case XML_VariousPropertyBits:   mnFlags = AttributeConversion::decodeUnsigned( rValue );            break;
864         case XML_PicturePosition:       mnPicturePos = AttributeConversion::decodeUnsigned( rValue );       break;
865         case XML_TakeFocusOnClick:      mbFocusOnClick = AttributeConversion::decodeInteger( rValue ) != 0; break;
866         default:                        AxFontDataModel::importProperty( nPropId, rValue );
867     }
868 }
869 
870 void AxCommandButtonModel::importPictureData( sal_Int32 nPropId, BinaryInputStream& rInStrm )
871 {
872     switch( nPropId )
873     {
874         case XML_Picture:   OleHelper::importStdPic( maPictureData, rInStrm, true );    break;
875         default:            AxFontDataModel::importPictureData( nPropId, rInStrm );
876     }
877 }
878 
879 bool AxCommandButtonModel::importBinaryModel( BinaryInputStream& rInStrm )
880 {
881     AxBinaryPropertyReader aReader( rInStrm );
882     aReader.readIntProperty< sal_uInt32 >( mnTextColor );
883     aReader.readIntProperty< sal_uInt32 >( mnBackColor );
884     aReader.readIntProperty< sal_uInt32 >( mnFlags );
885     aReader.readStringProperty( maCaption );
886     aReader.readIntProperty< sal_uInt32 >( mnPicturePos );
887     aReader.readPairProperty( maSize );
888     aReader.skipIntProperty< sal_uInt8 >(); // mouse pointer
889     aReader.readPictureProperty( maPictureData );
890     aReader.skipIntProperty< sal_uInt16 >(); // accelerator
891     aReader.readBoolProperty( mbFocusOnClick, true ); // binary flag means "do not take focus"
892     aReader.skipPictureProperty(); // mouse icon
893     return aReader.finalizeImport() && AxFontDataModel::importBinaryModel( rInStrm );
894 }
895 
896 ApiControlType AxCommandButtonModel::getControlType() const
897 {
898     return API_CONTROL_BUTTON;
899 }
900 
901 void AxCommandButtonModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const
902 {
903     rPropMap.setProperty( PROP_Label, maCaption );
904     rPropMap.setProperty( PROP_Enabled, getFlag( mnFlags, AX_FLAGS_ENABLED ) );
905     rPropMap.setProperty( PROP_MultiLine, getFlag( mnFlags, AX_FLAGS_WORDWRAP ) );
906     rPropMap.setProperty( PROP_FocusOnClick, mbFocusOnClick );
907     rConv.convertColor( rPropMap, PROP_TextColor, mnTextColor );
908     rConv.convertVerticalAlign( rPropMap, mnVerticalAlign );
909     rConv.convertAxBackground( rPropMap, mnBackColor, mnFlags, API_TRANSPARENCY_NOTSUPPORTED );
910     rConv.convertAxPicture( rPropMap, maPictureData, mnPicturePos );
911     AxFontDataModel::convertProperties( rPropMap, rConv );
912 }
913 
914 // ============================================================================
915 
916 AxLabelModel::AxLabelModel() :
917     mnTextColor( AX_SYSCOLOR_BUTTONTEXT ),
918     mnBackColor( AX_SYSCOLOR_BUTTONFACE ),
919     mnFlags( AX_LABEL_DEFFLAGS ),
920     mnBorderColor( AX_SYSCOLOR_WINDOWFRAME ),
921     mnBorderStyle( AX_BORDERSTYLE_NONE ),
922     mnSpecialEffect( AX_SPECIALEFFECT_FLAT ),
923     mnVerticalAlign( XML_Top )
924 {
925 }
926 
927 void AxLabelModel::importProperty( sal_Int32 nPropId, const OUString& rValue )
928 {
929     switch( nPropId )
930     {
931         case XML_Caption:               maCaption = rValue;                                             break;
932         case XML_ForeColor:             mnTextColor = AttributeConversion::decodeUnsigned( rValue );    break;
933         case XML_BackColor:             mnBackColor = AttributeConversion::decodeUnsigned( rValue );    break;
934         case XML_VariousPropertyBits:   mnFlags = AttributeConversion::decodeUnsigned( rValue );        break;
935         case XML_BorderColor:           mnBorderColor = AttributeConversion::decodeUnsigned( rValue );  break;
936         case XML_BorderStyle:           mnBorderStyle = AttributeConversion::decodeInteger( rValue );   break;
937         case XML_SpecialEffect:         mnSpecialEffect = AttributeConversion::decodeInteger( rValue ); break;
938         default:                        AxFontDataModel::importProperty( nPropId, rValue );
939     }
940 }
941 
942 bool AxLabelModel::importBinaryModel( BinaryInputStream& rInStrm )
943 {
944     AxBinaryPropertyReader aReader( rInStrm );
945     aReader.readIntProperty< sal_uInt32 >( mnTextColor );
946     aReader.readIntProperty< sal_uInt32 >( mnBackColor );
947     aReader.readIntProperty< sal_uInt32 >( mnFlags );
948     aReader.readStringProperty( maCaption );
949     aReader.skipIntProperty< sal_uInt32 >(); // picture position
950     aReader.readPairProperty( maSize );
951     aReader.skipIntProperty< sal_uInt8 >(); // mouse pointer
952     aReader.readIntProperty< sal_uInt32 >( mnBorderColor );
953     aReader.readIntProperty< sal_uInt16 >( mnBorderStyle );
954     aReader.readIntProperty< sal_uInt16 >( mnSpecialEffect );
955     aReader.skipPictureProperty(); // picture
956     aReader.skipIntProperty< sal_uInt16 >(); // accelerator
957     aReader.skipPictureProperty(); // mouse icon
958     return aReader.finalizeImport() && AxFontDataModel::importBinaryModel( rInStrm );
959 }
960 
961 ApiControlType AxLabelModel::getControlType() const
962 {
963     return API_CONTROL_FIXEDTEXT;
964 }
965 
966 void AxLabelModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const
967 {
968     rPropMap.setProperty( PROP_Label, maCaption );
969     rPropMap.setProperty( PROP_Enabled, getFlag( mnFlags, AX_FLAGS_ENABLED ) );
970     rPropMap.setProperty( PROP_MultiLine, getFlag( mnFlags, AX_FLAGS_WORDWRAP ) );
971     rConv.convertColor( rPropMap, PROP_TextColor, mnTextColor );
972     rConv.convertVerticalAlign( rPropMap, mnVerticalAlign );
973     rConv.convertAxBackground( rPropMap, mnBackColor, mnFlags, API_TRANSPARENCY_VOID );
974     rConv.convertAxBorder( rPropMap, mnBorderColor, mnBorderStyle, mnSpecialEffect );
975     AxFontDataModel::convertProperties( rPropMap, rConv );
976 }
977 
978 // ============================================================================
979 
980 AxImageModel::AxImageModel() :
981     mnBackColor( AX_SYSCOLOR_BUTTONFACE ),
982     mnFlags( AX_IMAGE_DEFFLAGS ),
983     mnBorderColor( AX_SYSCOLOR_WINDOWFRAME ),
984     mnBorderStyle( AX_BORDERSTYLE_SINGLE ),
985     mnSpecialEffect( AX_SPECIALEFFECT_FLAT ),
986     mnPicSizeMode( AX_PICSIZE_CLIP ),
987     mnPicAlign( AX_PICALIGN_CENTER ),
988     mbPicTiling( false )
989 {
990 }
991 
992 void AxImageModel::importProperty( sal_Int32 nPropId, const OUString& rValue )
993 {
994     switch( nPropId )
995     {
996         case XML_BackColor:             mnBackColor = AttributeConversion::decodeUnsigned( rValue );      break;
997         case XML_VariousPropertyBits:   mnFlags = AttributeConversion::decodeUnsigned( rValue );          break;
998         case XML_BorderColor:           mnBorderColor = AttributeConversion::decodeUnsigned( rValue );    break;
999         case XML_BorderStyle:           mnBorderStyle = AttributeConversion::decodeInteger( rValue );     break;
1000         case XML_SpecialEffect:         mnSpecialEffect = AttributeConversion::decodeInteger( rValue );   break;
1001         case XML_SizeMode:              mnPicSizeMode = AttributeConversion::decodeInteger( rValue );     break;
1002         case XML_PictureAlignment:      mnPicAlign = AttributeConversion::decodeInteger( rValue );        break;
1003         case XML_PictureTiling:         mbPicTiling = AttributeConversion::decodeInteger( rValue ) != 0;  break;
1004         default:                        AxControlModelBase::importProperty( nPropId, rValue );
1005     }
1006 }
1007 
1008 void AxImageModel::importPictureData( sal_Int32 nPropId, BinaryInputStream& rInStrm )
1009 {
1010     switch( nPropId )
1011     {
1012         case XML_Picture:   OleHelper::importStdPic( maPictureData, rInStrm, true );    break;
1013         default:            AxControlModelBase::importPictureData( nPropId, rInStrm );
1014     }
1015 }
1016 
1017 bool AxImageModel::importBinaryModel( BinaryInputStream& rInStrm )
1018 {
1019     AxBinaryPropertyReader aReader( rInStrm );
1020     aReader.skipUndefinedProperty();
1021     aReader.skipUndefinedProperty();
1022     aReader.skipBoolProperty(); // auto-size
1023     aReader.readIntProperty< sal_uInt32 >( mnBorderColor );
1024     aReader.readIntProperty< sal_uInt32 >( mnBackColor );
1025     aReader.readIntProperty< sal_uInt8 >( mnBorderStyle );
1026     aReader.skipIntProperty< sal_uInt8 >(); // mouse pointer
1027     aReader.readIntProperty< sal_uInt8 >( mnPicSizeMode );
1028     aReader.readIntProperty< sal_uInt8 >( mnSpecialEffect );
1029     aReader.readPairProperty( maSize );
1030     aReader.readPictureProperty( maPictureData );
1031     aReader.readIntProperty< sal_uInt8 >( mnPicAlign );
1032     aReader.readBoolProperty( mbPicTiling );
1033     aReader.readIntProperty< sal_uInt32 >( mnFlags );
1034     aReader.skipPictureProperty(); // mouse icon
1035     return aReader.finalizeImport();
1036 }
1037 
1038 ApiControlType AxImageModel::getControlType() const
1039 {
1040     return API_CONTROL_IMAGE;
1041 }
1042 
1043 void AxImageModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const
1044 {
1045     rPropMap.setProperty( PROP_Enabled, getFlag( mnFlags, AX_FLAGS_ENABLED ) );
1046     rConv.convertAxBackground( rPropMap, mnBackColor, mnFlags, API_TRANSPARENCY_VOID );
1047     rConv.convertAxBorder( rPropMap, mnBorderColor, mnBorderStyle, mnSpecialEffect );
1048     rConv.convertAxPicture( rPropMap, maPictureData, mnPicSizeMode, mnPicAlign, mbPicTiling );
1049     AxControlModelBase::convertProperties( rPropMap, rConv );
1050 }
1051 
1052 // ============================================================================
1053 
1054 AxMorphDataModelBase::AxMorphDataModelBase() :
1055     mnTextColor( AX_SYSCOLOR_WINDOWTEXT ),
1056     mnBackColor( AX_SYSCOLOR_WINDOWBACK ),
1057     mnFlags( AX_MORPHDATA_DEFFLAGS ),
1058     mnPicturePos( AX_PICPOS_ABOVECENTER ),
1059     mnBorderColor( AX_SYSCOLOR_WINDOWFRAME ),
1060     mnBorderStyle( AX_BORDERSTYLE_NONE ),
1061     mnSpecialEffect( AX_SPECIALEFFECT_SUNKEN ),
1062     mnDisplayStyle( AX_DISPLAYSTYLE_TEXT ),
1063     mnMultiSelect( AX_SELCTION_SINGLE ),
1064     mnScrollBars( AX_SCROLLBAR_NONE ),
1065     mnMatchEntry( AX_MATCHENTRY_NONE ),
1066     mnShowDropButton( AX_SHOWDROPBUTTON_NEVER ),
1067     mnMaxLength( 0 ),
1068     mnPasswordChar( 0 ),
1069     mnListRows( 8 ),
1070     mnVerticalAlign( XML_Center )
1071 {
1072 }
1073 
1074 void AxMorphDataModelBase::importProperty( sal_Int32 nPropId, const OUString& rValue )
1075 {
1076     switch( nPropId )
1077     {
1078         case XML_Caption:               maCaption = rValue;                                             break;
1079         case XML_Value:                 maValue = rValue;                                               break;
1080         case XML_GroupName:             maGroupName = rValue;                                           break;
1081         case XML_ForeColor:             mnTextColor = AttributeConversion::decodeUnsigned( rValue );    break;
1082         case XML_BackColor:             mnBackColor = AttributeConversion::decodeUnsigned( rValue );    break;
1083         case XML_VariousPropertyBits:   mnFlags = AttributeConversion::decodeUnsigned( rValue );        break;
1084         case XML_PicturePosition:       mnPicturePos = AttributeConversion::decodeUnsigned( rValue );   break;
1085         case XML_BorderColor:           mnBorderColor = AttributeConversion::decodeUnsigned( rValue );  break;
1086         case XML_BorderStyle:           mnBorderStyle = AttributeConversion::decodeInteger( rValue );   break;
1087         case XML_SpecialEffect:         mnSpecialEffect = AttributeConversion::decodeInteger( rValue ); break;
1088         case XML_DisplayStyle:          mnDisplayStyle = AttributeConversion::decodeInteger( rValue );  break;
1089         case XML_MultiSelect:           mnMultiSelect = AttributeConversion::decodeInteger( rValue );   break;
1090         case XML_ScrollBars:            mnScrollBars = AttributeConversion::decodeInteger( rValue );    break;
1091         case XML_MatchEntry:            mnMatchEntry = AttributeConversion::decodeInteger( rValue );    break;
1092         case XML_ShowDropButtonWhen:    mnShowDropButton = AttributeConversion::decodeInteger( rValue );break;
1093         case XML_MaxLength:             mnMaxLength = AttributeConversion::decodeInteger( rValue );     break;
1094         case XML_PasswordChar:          mnPasswordChar = AttributeConversion::decodeInteger( rValue );  break;
1095         case XML_ListRows:              mnListRows = AttributeConversion::decodeInteger( rValue );      break;
1096         default:                        AxFontDataModel::importProperty( nPropId, rValue );
1097     }
1098 }
1099 
1100 void AxMorphDataModelBase::importPictureData( sal_Int32 nPropId, BinaryInputStream& rInStrm )
1101 {
1102     switch( nPropId )
1103     {
1104         case XML_Picture:   OleHelper::importStdPic( maPictureData, rInStrm, true );    break;
1105         default:            AxFontDataModel::importPictureData( nPropId, rInStrm );
1106     }
1107 }
1108 
1109 bool AxMorphDataModelBase::importBinaryModel( BinaryInputStream& rInStrm )
1110 {
1111     AxBinaryPropertyReader aReader( rInStrm, true );
1112     aReader.readIntProperty< sal_uInt32 >( mnFlags );
1113     aReader.readIntProperty< sal_uInt32 >( mnBackColor );
1114     aReader.readIntProperty< sal_uInt32 >( mnTextColor );
1115     aReader.readIntProperty< sal_Int32 >( mnMaxLength );
1116     aReader.readIntProperty< sal_uInt8 >( mnBorderStyle );
1117     aReader.readIntProperty< sal_uInt8 >( mnScrollBars );
1118     aReader.readIntProperty< sal_uInt8 >( mnDisplayStyle );
1119     aReader.skipIntProperty< sal_uInt8 >(); // mouse pointer
1120     aReader.readPairProperty( maSize );
1121     aReader.readIntProperty< sal_uInt16 >( mnPasswordChar );
1122     aReader.skipIntProperty< sal_uInt32 >(); // list width
1123     aReader.skipIntProperty< sal_uInt16 >(); // bound column
1124     aReader.skipIntProperty< sal_Int16 >(); // text column
1125     aReader.skipIntProperty< sal_Int16 >(); // column count
1126     aReader.readIntProperty< sal_uInt16 >( mnListRows );
1127     aReader.skipIntProperty< sal_uInt16 >(); // column info count
1128     aReader.readIntProperty< sal_uInt8 >( mnMatchEntry );
1129     aReader.skipIntProperty< sal_uInt8 >(); // list style
1130     aReader.readIntProperty< sal_uInt8 >( mnShowDropButton );
1131     aReader.skipUndefinedProperty();
1132     aReader.skipIntProperty< sal_uInt8 >(); // drop down style
1133     aReader.readIntProperty< sal_uInt8 >( mnMultiSelect );
1134     aReader.readStringProperty( maValue );
1135     aReader.readStringProperty( maCaption );
1136     aReader.readIntProperty< sal_uInt32 >( mnPicturePos );
1137     aReader.readIntProperty< sal_uInt32 >( mnBorderColor );
1138     aReader.readIntProperty< sal_uInt32 >( mnSpecialEffect );
1139     aReader.skipPictureProperty(); // mouse icon
1140     aReader.readPictureProperty( maPictureData );
1141     aReader.skipIntProperty< sal_uInt16 >(); // accelerator
1142     aReader.skipUndefinedProperty();
1143     aReader.skipBoolProperty();
1144     aReader.readStringProperty( maGroupName );
1145     return aReader.finalizeImport() && AxFontDataModel::importBinaryModel( rInStrm );
1146 }
1147 
1148 void AxMorphDataModelBase::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const
1149 {
1150     rPropMap.setProperty( PROP_Enabled, getFlag( mnFlags, AX_FLAGS_ENABLED ) );
1151     rConv.convertColor( rPropMap, PROP_TextColor, mnTextColor );
1152     AxFontDataModel::convertProperties( rPropMap, rConv );
1153 }
1154 
1155 // ============================================================================
1156 
1157 AxToggleButtonModel::AxToggleButtonModel()
1158 {
1159     mnDisplayStyle = AX_DISPLAYSTYLE_TOGGLE;
1160 }
1161 
1162 ApiControlType AxToggleButtonModel::getControlType() const
1163 {
1164     OSL_ENSURE( mnDisplayStyle == AX_DISPLAYSTYLE_TOGGLE, "AxToggleButtonModel::getControlType - invalid control type" );
1165     return API_CONTROL_BUTTON;
1166 }
1167 
1168 void AxToggleButtonModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const
1169 {
1170     rPropMap.setProperty( PROP_Label, maCaption );
1171     rPropMap.setProperty( PROP_MultiLine, getFlag( mnFlags, AX_FLAGS_WORDWRAP ) );
1172     rPropMap.setProperty( PROP_Toggle, true );
1173     rConv.convertVerticalAlign( rPropMap, mnVerticalAlign );
1174     rConv.convertAxBackground( rPropMap, mnBackColor, mnFlags, API_TRANSPARENCY_NOTSUPPORTED );
1175     rConv.convertAxPicture( rPropMap, maPictureData, mnPicturePos );
1176     rConv.convertAxState( rPropMap, maValue, mnMultiSelect, API_DEFAULTSTATE_BOOLEAN, mbAwtModel );
1177     AxMorphDataModelBase::convertProperties( rPropMap, rConv );
1178 }
1179 
1180 // ============================================================================
1181 
1182 AxCheckBoxModel::AxCheckBoxModel()
1183 {
1184     mnDisplayStyle = AX_DISPLAYSTYLE_CHECKBOX;
1185 }
1186 
1187 ApiControlType AxCheckBoxModel::getControlType() const
1188 {
1189     OSL_ENSURE( mnDisplayStyle == AX_DISPLAYSTYLE_CHECKBOX, "AxCheckBoxModel::getControlType - invalid control type" );
1190     return API_CONTROL_CHECKBOX;
1191 }
1192 
1193 void AxCheckBoxModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const
1194 {
1195     rPropMap.setProperty( PROP_Label, maCaption );
1196     rPropMap.setProperty( PROP_MultiLine, getFlag( mnFlags, AX_FLAGS_WORDWRAP ) );
1197     rConv.convertVerticalAlign( rPropMap, mnVerticalAlign );
1198     rConv.convertAxBackground( rPropMap, mnBackColor, mnFlags, API_TRANSPARENCY_VOID );
1199     rConv.convertAxVisualEffect( rPropMap, mnSpecialEffect );
1200     rConv.convertAxPicture( rPropMap, maPictureData, mnPicturePos );
1201     rConv.convertAxState( rPropMap, maValue, mnMultiSelect, API_DEFAULTSTATE_TRISTATE, mbAwtModel );
1202     AxMorphDataModelBase::convertProperties( rPropMap, rConv );
1203 }
1204 
1205 // ============================================================================
1206 
1207 AxOptionButtonModel::AxOptionButtonModel()
1208 {
1209     mnDisplayStyle = AX_DISPLAYSTYLE_OPTBUTTON;
1210 }
1211 
1212 ApiControlType AxOptionButtonModel::getControlType() const
1213 {
1214     OSL_ENSURE( mnDisplayStyle == AX_DISPLAYSTYLE_OPTBUTTON, "AxOptionButtonModel::getControlType - invalid control type" );
1215     return API_CONTROL_RADIOBUTTON;
1216 }
1217 
1218 void AxOptionButtonModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const
1219 {
1220     rPropMap.setProperty( PROP_Label, maCaption );
1221     rPropMap.setProperty( PROP_MultiLine, getFlag( mnFlags, AX_FLAGS_WORDWRAP ) );
1222     rConv.convertVerticalAlign( rPropMap, mnVerticalAlign );
1223     rConv.convertAxBackground( rPropMap, mnBackColor, mnFlags, API_TRANSPARENCY_VOID );
1224     rConv.convertAxVisualEffect( rPropMap, mnSpecialEffect );
1225     rConv.convertAxPicture( rPropMap, maPictureData, mnPicturePos );
1226     rConv.convertAxState( rPropMap, maValue, mnMultiSelect, API_DEFAULTSTATE_SHORT, mbAwtModel );
1227     AxMorphDataModelBase::convertProperties( rPropMap, rConv );
1228 }
1229 
1230 // ============================================================================
1231 
1232 AxTextBoxModel::AxTextBoxModel()
1233 {
1234     mnDisplayStyle = AX_DISPLAYSTYLE_TEXT;
1235 }
1236 
1237 ApiControlType AxTextBoxModel::getControlType() const
1238 {
1239     OSL_ENSURE( mnDisplayStyle == AX_DISPLAYSTYLE_TEXT, "AxTextBoxModel::getControlType - invalid control type" );
1240     return API_CONTROL_EDIT;
1241 }
1242 
1243 void AxTextBoxModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const
1244 {
1245     rPropMap.setProperty( PROP_MultiLine, getFlag( mnFlags, AX_FLAGS_MULTILINE ) );
1246     rPropMap.setProperty( PROP_HideInactiveSelection, getFlag( mnFlags, AX_FLAGS_HIDESELECTION ) );
1247     rPropMap.setProperty( mbAwtModel ? PROP_Text : PROP_DefaultText, maValue );
1248     rPropMap.setProperty( PROP_MaxTextLen, getLimitedValue< sal_Int16, sal_Int32 >( mnMaxLength, 0, SAL_MAX_INT16 ) );
1249     if( (0 < mnPasswordChar) && (mnPasswordChar <= SAL_MAX_INT16) )
1250         rPropMap.setProperty( PROP_EchoChar, static_cast< sal_Int16 >( mnPasswordChar ) );
1251     rPropMap.setProperty( PROP_HScroll, getFlag( mnScrollBars, AX_SCROLLBAR_HORIZONTAL ) );
1252     rPropMap.setProperty( PROP_VScroll, getFlag( mnScrollBars, AX_SCROLLBAR_VERTICAL ) );
1253     rConv.convertAxBackground( rPropMap, mnBackColor, mnFlags, API_TRANSPARENCY_VOID );
1254     rConv.convertAxBorder( rPropMap, mnBorderColor, mnBorderStyle, mnSpecialEffect );
1255     AxMorphDataModelBase::convertProperties( rPropMap, rConv );
1256 }
1257 
1258 // ============================================================================
1259 
1260 AxNumericFieldModel::AxNumericFieldModel()
1261 {
1262     mnDisplayStyle = AX_DISPLAYSTYLE_TEXT;
1263 }
1264 
1265 ApiControlType AxNumericFieldModel::getControlType() const
1266 {
1267     OSL_ENSURE( mnDisplayStyle == AX_DISPLAYSTYLE_TEXT, "AxNumericFieldModel::getControlType - invalid control type" );
1268     return API_CONTROL_NUMERIC;
1269 }
1270 
1271 void AxNumericFieldModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const
1272 {
1273     rPropMap.setProperty( PROP_HideInactiveSelection, getFlag( mnFlags, AX_FLAGS_HIDESELECTION ) );
1274     // TODO: OUString::toDouble() does not handle local decimal separator
1275     rPropMap.setProperty( mbAwtModel ? PROP_Value : PROP_DefaultValue, maValue.toDouble() );
1276     rPropMap.setProperty( PROP_Spin, getFlag( mnScrollBars, AX_SCROLLBAR_VERTICAL ) );
1277     rPropMap.setProperty( PROP_Repeat, true );
1278     rConv.convertAxBackground( rPropMap, mnBackColor, mnFlags, API_TRANSPARENCY_VOID );
1279     rConv.convertAxBorder( rPropMap, mnBorderColor, mnBorderStyle, mnSpecialEffect );
1280     AxMorphDataModelBase::convertProperties( rPropMap, rConv );
1281 }
1282 
1283 // ============================================================================
1284 
1285 AxListBoxModel::AxListBoxModel()
1286 {
1287     mnDisplayStyle = AX_DISPLAYSTYLE_LISTBOX;
1288 }
1289 
1290 ApiControlType AxListBoxModel::getControlType() const
1291 {
1292     OSL_ENSURE( mnDisplayStyle == AX_DISPLAYSTYLE_LISTBOX, "AxListBoxModel::getControlType - invalid control type" );
1293     return API_CONTROL_LISTBOX;
1294 }
1295 
1296 void AxListBoxModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const
1297 {
1298     bool bMultiSelect = (mnMultiSelect == AX_SELCTION_MULTI) || (mnMultiSelect == AX_SELCTION_EXTENDED);
1299     rPropMap.setProperty( PROP_MultiSelection, bMultiSelect );
1300     rPropMap.setProperty( PROP_Dropdown, false );
1301     rConv.convertAxBackground( rPropMap, mnBackColor, mnFlags, API_TRANSPARENCY_VOID );
1302     rConv.convertAxBorder( rPropMap, mnBorderColor, mnBorderStyle, mnSpecialEffect );
1303     AxMorphDataModelBase::convertProperties( rPropMap, rConv );
1304 }
1305 
1306 // ============================================================================
1307 
1308 AxComboBoxModel::AxComboBoxModel()
1309 {
1310     mnDisplayStyle = AX_DISPLAYSTYLE_COMBOBOX;
1311 }
1312 
1313 ApiControlType AxComboBoxModel::getControlType() const
1314 {
1315     OSL_ENSURE( (mnDisplayStyle == AX_DISPLAYSTYLE_COMBOBOX) || (mnDisplayStyle == AX_DISPLAYSTYLE_DROPDOWN), "AxComboBoxModel::getControlType - invalid control type" );
1316     return (mnDisplayStyle == AX_DISPLAYSTYLE_DROPDOWN) ? API_CONTROL_LISTBOX : API_CONTROL_COMBOBOX;
1317 }
1318 
1319 void AxComboBoxModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const
1320 {
1321     if( mnDisplayStyle != AX_DISPLAYSTYLE_DROPDOWN )
1322     {
1323         rPropMap.setProperty( PROP_HideInactiveSelection, getFlag( mnFlags, AX_FLAGS_HIDESELECTION ) );
1324         rPropMap.setProperty( mbAwtModel ? PROP_Text : PROP_DefaultText, maValue );
1325         rPropMap.setProperty( PROP_MaxTextLen, getLimitedValue< sal_Int16, sal_Int32 >( mnMaxLength, 0, SAL_MAX_INT16 ) );
1326         bool bAutoComplete = (mnMatchEntry == AX_MATCHENTRY_FIRSTLETTER) || (mnMatchEntry == AX_MATCHENTRY_COMPLETE);
1327         rPropMap.setProperty( PROP_Autocomplete, bAutoComplete );
1328     }
1329     bool bShowDropdown = (mnShowDropButton == AX_SHOWDROPBUTTON_FOCUS) || (mnShowDropButton == AX_SHOWDROPBUTTON_ALWAYS);
1330     rPropMap.setProperty( PROP_Dropdown, bShowDropdown );
1331     rPropMap.setProperty( PROP_LineCount, getLimitedValue< sal_Int16, sal_Int32 >( mnListRows, 1, SAL_MAX_INT16 ) );
1332     rConv.convertAxBackground( rPropMap, mnBackColor, mnFlags, API_TRANSPARENCY_VOID );
1333     rConv.convertAxBorder( rPropMap, mnBorderColor, mnBorderStyle, mnSpecialEffect );
1334     AxMorphDataModelBase::convertProperties( rPropMap, rConv );
1335 }
1336 
1337 // ============================================================================
1338 
1339 AxSpinButtonModel::AxSpinButtonModel() :
1340     mnArrowColor( AX_SYSCOLOR_BUTTONTEXT ),
1341     mnBackColor( AX_SYSCOLOR_BUTTONFACE ),
1342     mnFlags( AX_SPINBUTTON_DEFFLAGS ),
1343     mnOrientation( AX_ORIENTATION_AUTO ),
1344     mnMin( 0 ),
1345     mnMax( 100 ),
1346     mnPosition( 0 ),
1347     mnSmallChange( 1 ),
1348     mnDelay( 50 )
1349 {
1350 }
1351 
1352 ApiControlType AxSpinButtonModel::getControlType() const
1353 {
1354     return API_CONTROL_SPINBUTTON;
1355 }
1356 
1357 void AxSpinButtonModel::importProperty( sal_Int32 nPropId, const OUString& rValue )
1358 {
1359     switch( nPropId )
1360     {
1361         case XML_ForeColor:             mnArrowColor = AttributeConversion::decodeUnsigned( rValue );   break;
1362         case XML_BackColor:             mnBackColor = AttributeConversion::decodeUnsigned( rValue );    break;
1363         case XML_VariousPropertyBits:   mnFlags = AttributeConversion::decodeUnsigned( rValue );        break;
1364         case XML_Orientation:           mnOrientation = AttributeConversion::decodeInteger( rValue );   break;
1365         case XML_Min:                   mnMin = AttributeConversion::decodeInteger( rValue );           break;
1366         case XML_Max:                   mnMax = AttributeConversion::decodeInteger( rValue );           break;
1367         case XML_Position:              mnPosition = AttributeConversion::decodeInteger( rValue );      break;
1368         case XML_SmallChange:           mnSmallChange = AttributeConversion::decodeInteger( rValue );   break;
1369         case XML_Delay:                 mnDelay = AttributeConversion::decodeInteger( rValue );         break;
1370         default:                        AxControlModelBase::importProperty( nPropId, rValue );
1371     }
1372 }
1373 
1374 bool AxSpinButtonModel::importBinaryModel( BinaryInputStream& rInStrm )
1375 {
1376     AxBinaryPropertyReader aReader( rInStrm );
1377     aReader.readIntProperty< sal_uInt32 >( mnArrowColor );
1378     aReader.readIntProperty< sal_uInt32 >( mnBackColor );
1379     aReader.readIntProperty< sal_uInt32 >( mnFlags );
1380     aReader.readPairProperty( maSize );
1381     aReader.skipIntProperty< sal_uInt32 >(); // unused
1382     aReader.readIntProperty< sal_Int32 >( mnMin );
1383     aReader.readIntProperty< sal_Int32 >( mnMax );
1384     aReader.readIntProperty< sal_Int32 >( mnPosition );
1385     aReader.skipIntProperty< sal_uInt32 >(); // prev enabled
1386     aReader.skipIntProperty< sal_uInt32 >(); // next enabled
1387     aReader.readIntProperty< sal_Int32 >( mnSmallChange );
1388     aReader.readIntProperty< sal_Int32 >( mnOrientation );
1389     aReader.readIntProperty< sal_Int32 >( mnDelay );
1390     aReader.skipPictureProperty(); // mouse icon
1391     aReader.skipIntProperty< sal_uInt8 >(); // mouse pointer
1392     return aReader.finalizeImport();
1393 }
1394 
1395 void AxSpinButtonModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const
1396 {
1397     sal_Int32 nMin = ::std::min( mnMin, mnMax );
1398     sal_Int32 nMax = ::std::max( mnMin, mnMax );
1399     rPropMap.setProperty( PROP_Enabled, getFlag( mnFlags, AX_FLAGS_ENABLED ) );
1400     rPropMap.setProperty( PROP_SpinValueMin, nMin );
1401     rPropMap.setProperty( PROP_SpinValueMax, nMax );
1402     rPropMap.setProperty( PROP_SpinIncrement, mnSmallChange );
1403     rPropMap.setProperty( mbAwtModel ? PROP_SpinValue : PROP_DefaultSpinValue, mnPosition );
1404     rPropMap.setProperty( PROP_Repeat, true );
1405     rPropMap.setProperty( PROP_RepeatDelay, mnDelay );
1406     rPropMap.setProperty( PROP_Border, API_BORDER_NONE );
1407     rConv.convertColor( rPropMap, PROP_SymbolColor, mnArrowColor );
1408     rConv.convertAxBackground( rPropMap, mnBackColor, mnFlags, API_TRANSPARENCY_NOTSUPPORTED );
1409     rConv.convertAxOrientation( rPropMap, maSize, mnOrientation );
1410     AxControlModelBase::convertProperties( rPropMap, rConv );
1411 }
1412 
1413 // ============================================================================
1414 
1415 AxScrollBarModel::AxScrollBarModel() :
1416     mnArrowColor( AX_SYSCOLOR_BUTTONTEXT ),
1417     mnBackColor( AX_SYSCOLOR_BUTTONFACE ),
1418     mnFlags( AX_SCROLLBAR_DEFFLAGS ),
1419     mnOrientation( AX_ORIENTATION_AUTO ),
1420     mnPropThumb( AX_PROPTHUMB_ON ),
1421     mnMin( 0 ),
1422     mnMax( 32767 ),
1423     mnPosition( 0 ),
1424     mnSmallChange( 1 ),
1425     mnLargeChange( 1 ),
1426     mnDelay( 50 )
1427 {
1428 }
1429 
1430 ApiControlType AxScrollBarModel::getControlType() const
1431 {
1432     return API_CONTROL_SCROLLBAR;
1433 }
1434 
1435 void AxScrollBarModel::importProperty( sal_Int32 nPropId, const OUString& rValue )
1436 {
1437     switch( nPropId )
1438     {
1439         case XML_ForeColor:             mnArrowColor = AttributeConversion::decodeUnsigned( rValue );   break;
1440         case XML_BackColor:             mnBackColor = AttributeConversion::decodeUnsigned( rValue );    break;
1441         case XML_VariousPropertyBits:   mnFlags = AttributeConversion::decodeUnsigned( rValue );        break;
1442         case XML_Orientation:           mnOrientation = AttributeConversion::decodeInteger( rValue );   break;
1443         case XML_ProportionalThumb:     mnPropThumb = AttributeConversion::decodeInteger( rValue );     break;
1444         case XML_Min:                   mnMin = AttributeConversion::decodeInteger( rValue );           break;
1445         case XML_Max:                   mnMax = AttributeConversion::decodeInteger( rValue );           break;
1446         case XML_Position:              mnPosition = AttributeConversion::decodeInteger( rValue );      break;
1447         case XML_SmallChange:           mnSmallChange = AttributeConversion::decodeInteger( rValue );   break;
1448         case XML_LargeChange:           mnLargeChange = AttributeConversion::decodeInteger( rValue );   break;
1449         case XML_Delay:                 mnDelay = AttributeConversion::decodeInteger( rValue );         break;
1450         default:                        AxControlModelBase::importProperty( nPropId, rValue );
1451     }
1452 }
1453 
1454 bool AxScrollBarModel::importBinaryModel( BinaryInputStream& rInStrm )
1455 {
1456     AxBinaryPropertyReader aReader( rInStrm );
1457     aReader.readIntProperty< sal_uInt32 >( mnArrowColor );
1458     aReader.readIntProperty< sal_uInt32 >( mnBackColor );
1459     aReader.readIntProperty< sal_uInt32 >( mnFlags );
1460     aReader.readPairProperty( maSize );
1461     aReader.skipIntProperty< sal_uInt8 >(); // mouse pointer
1462     aReader.readIntProperty< sal_Int32 >( mnMin );
1463     aReader.readIntProperty< sal_Int32 >( mnMax );
1464     aReader.readIntProperty< sal_Int32 >( mnPosition );
1465     aReader.skipIntProperty< sal_uInt32 >(); // unused
1466     aReader.skipIntProperty< sal_uInt32 >(); // prev enabled
1467     aReader.skipIntProperty< sal_uInt32 >(); // next enabled
1468     aReader.readIntProperty< sal_Int32 >( mnSmallChange );
1469     aReader.readIntProperty< sal_Int32 >( mnLargeChange );
1470     aReader.readIntProperty< sal_Int32 >( mnOrientation );
1471     aReader.readIntProperty< sal_Int16 >( mnPropThumb );
1472     aReader.readIntProperty< sal_Int32 >( mnDelay );
1473     aReader.skipPictureProperty(); // mouse icon
1474     return aReader.finalizeImport();
1475 }
1476 
1477 void AxScrollBarModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const
1478 {
1479     rPropMap.setProperty( PROP_Enabled, getFlag( mnFlags, AX_FLAGS_ENABLED ) );
1480     rPropMap.setProperty( PROP_RepeatDelay, mnDelay );
1481     rPropMap.setProperty( PROP_Border, API_BORDER_NONE );
1482     if( (mnPropThumb == AX_PROPTHUMB_ON) && (mnMin != mnMax) && (mnLargeChange > 0) )
1483     {
1484         // use double to prevent integer overflow in division (fInterval+mnLargeChange may become 0 when performed as int)
1485         double fInterval = fabs( static_cast< double >( mnMax - mnMin ) );
1486         sal_Int32 nThumbLen = getLimitedValue< sal_Int32, double >( (fInterval * mnLargeChange) / (fInterval + mnLargeChange), 1, SAL_MAX_INT32 );
1487         rPropMap.setProperty( PROP_VisibleSize, nThumbLen );
1488     }
1489     rConv.convertColor( rPropMap, PROP_SymbolColor, mnArrowColor );
1490     rConv.convertAxBackground( rPropMap, mnBackColor, mnFlags, API_TRANSPARENCY_NOTSUPPORTED );
1491     rConv.convertAxOrientation( rPropMap, maSize, mnOrientation );
1492     rConv.convertScrollBar( rPropMap, mnMin, mnMax, mnPosition, mnSmallChange, mnLargeChange, mbAwtModel );
1493     AxControlModelBase::convertProperties( rPropMap, rConv );
1494 }
1495 
1496 // ============================================================================
1497 
1498 AxTabStripModel::AxTabStripModel() :
1499     AxFontDataModel( false ),   // no support for alignment properties
1500     mnBackColor( AX_SYSCOLOR_BUTTONFACE ),
1501     mnTextColor( AX_SYSCOLOR_BUTTONTEXT ),
1502     mnFlags( AX_TABSTRIP_DEFFLAGS ),
1503     mnSelectedTab( -1 ),
1504     mnTabStyle( AX_TABSTRIP_TABS ),
1505     mnTabFlagCount( 0 )
1506 {
1507 }
1508 
1509 bool AxTabStripModel::importBinaryModel( BinaryInputStream& rInStrm )
1510 {
1511     AxBinaryPropertyReader aReader( rInStrm );
1512     aReader.readIntProperty< sal_Int32 >( mnSelectedTab );
1513     aReader.readIntProperty< sal_uInt32 >( mnBackColor );
1514     aReader.readIntProperty< sal_uInt32 >( mnTextColor );
1515     aReader.skipUndefinedProperty();
1516     aReader.readPairProperty( maSize );
1517     aReader.readStringArrayProperty( maCaptions );
1518     aReader.skipIntProperty< sal_uInt8 >(); // mouse pointer
1519     aReader.skipUndefinedProperty();
1520     aReader.skipIntProperty< sal_uInt32 >(); // tab orientation
1521     aReader.readIntProperty< sal_uInt32 >( mnTabStyle );
1522     aReader.skipBoolProperty(); // multiple rows
1523     aReader.skipIntProperty< sal_uInt32 >(); // fixed width
1524     aReader.skipIntProperty< sal_uInt32 >(); // fixed height
1525     aReader.skipBoolProperty(); // tooltips
1526     aReader.skipUndefinedProperty();
1527     aReader.skipStringArrayProperty(); // tooltip strings
1528     aReader.skipUndefinedProperty();
1529     aReader.skipStringArrayProperty(); // tab names
1530     aReader.readIntProperty< sal_uInt32 >( mnFlags );
1531     aReader.skipBoolProperty(); // new version
1532     aReader.skipIntProperty< sal_uInt32 >(); // tabs allocated
1533     aReader.skipStringArrayProperty(); // tags
1534     aReader.readIntProperty< sal_uInt32 >( mnTabFlagCount );
1535     aReader.skipStringArrayProperty(); // accelerators
1536     aReader.skipPictureProperty(); // mouse icon
1537     return aReader.finalizeImport() && AxFontDataModel::importBinaryModel( rInStrm );
1538 }
1539 
1540 ApiControlType AxTabStripModel::getControlType() const
1541 {
1542     return API_CONTROL_TABSTRIP;
1543 }
1544 
1545 void AxTabStripModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const
1546 {
1547     rPropMap.setProperty( PROP_Decoration, mnTabStyle != AX_TABSTRIP_NONE );
1548     rPropMap.setProperty( PROP_MultiPageValue, mnSelectedTab );
1549     rConv.convertColor( rPropMap, PROP_BackgroundColor, mnBackColor );
1550     AxFontDataModel::convertProperties( rPropMap, rConv );
1551 }
1552 
1553 OUString AxTabStripModel::getCaption( sal_Int32 nIndex ) const
1554 {
1555     return ContainerHelper::getVectorElement( maCaptions, nIndex, OUString() );
1556 }
1557 
1558 // ============================================================================
1559 
1560 AxContainerModelBase::AxContainerModelBase( bool bFontSupport ) :
1561     AxFontDataModel( false ),   // no support for alignment properties
1562     maLogicalSize( AX_CONTAINER_DEFWIDTH, AX_CONTAINER_DEFHEIGHT ),
1563     maScrollPos( 0, 0 ),
1564     mnBackColor( AX_SYSCOLOR_BUTTONFACE ),
1565     mnTextColor( AX_SYSCOLOR_BUTTONTEXT ),
1566     mnFlags( AX_CONTAINER_DEFFLAGS ),
1567     mnBorderColor( AX_SYSCOLOR_BUTTONTEXT ),
1568     mnBorderStyle( AX_BORDERSTYLE_NONE ),
1569     mnScrollBars( AX_CONTAINER_SCR_NONE ),
1570     mnCycleType( AX_CONTAINER_CYCLEALL ),
1571     mnSpecialEffect( AX_SPECIALEFFECT_FLAT ),
1572     mnPicAlign( AX_PICALIGN_CENTER ),
1573     mnPicSizeMode( AX_PICSIZE_CLIP ),
1574     mbPicTiling( false ),
1575     mbFontSupport( bFontSupport )
1576 {
1577     setAwtModelMode();
1578     // different default size for frame
1579     maSize = AxPairData( AX_CONTAINER_DEFWIDTH, AX_CONTAINER_DEFHEIGHT );
1580 }
1581 
1582 void AxContainerModelBase::importProperty( sal_Int32 nPropId, const OUString& rValue )
1583 {
1584     if( nPropId == XML_Caption )
1585         maCaption = rValue;
1586 }
1587 
1588 bool AxContainerModelBase::importBinaryModel( BinaryInputStream& rInStrm )
1589 {
1590     AxBinaryPropertyReader aReader( rInStrm );
1591     aReader.skipUndefinedProperty();
1592     aReader.readIntProperty< sal_uInt32 >( mnBackColor );
1593     aReader.readIntProperty< sal_uInt32 >( mnTextColor );
1594     aReader.skipIntProperty< sal_uInt32 >(); // next availbale control ID
1595     aReader.skipUndefinedProperty();
1596     aReader.skipUndefinedProperty();
1597     aReader.readIntProperty< sal_uInt32 >( mnFlags );
1598     aReader.readIntProperty< sal_uInt8 >( mnBorderStyle );
1599     aReader.skipIntProperty< sal_uInt8 >(); // mouse pointer
1600     aReader.readIntProperty< sal_uInt8 >( mnScrollBars );
1601     aReader.readPairProperty( maSize );
1602     aReader.readPairProperty( maLogicalSize );
1603     aReader.readPairProperty( maScrollPos );
1604     aReader.skipIntProperty< sal_uInt32 >(); // number of control groups
1605     aReader.skipUndefinedProperty();
1606     aReader.skipPictureProperty(); // mouse icon
1607     aReader.readIntProperty< sal_uInt8 >( mnCycleType );
1608     aReader.readIntProperty< sal_uInt8 >( mnSpecialEffect );
1609     aReader.readIntProperty< sal_uInt32 >( mnBorderColor );
1610     aReader.readStringProperty( maCaption );
1611     aReader.readFontProperty( maFontData );
1612     aReader.readPictureProperty( maPictureData );
1613     aReader.skipIntProperty< sal_Int32 >(); // zoom
1614     aReader.readIntProperty< sal_uInt8 >( mnPicAlign );
1615     aReader.readBoolProperty( mbPicTiling );
1616     aReader.readIntProperty< sal_uInt8 >( mnPicSizeMode );
1617     aReader.skipIntProperty< sal_uInt32 >(); // shape cookie
1618     aReader.skipIntProperty< sal_uInt32 >(); // draw buffer size
1619     return aReader.finalizeImport();
1620 }
1621 
1622 void AxContainerModelBase::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const
1623 {
1624     if( mbFontSupport )
1625     {
1626         rConv.convertColor( rPropMap, PROP_TextColor, mnTextColor );
1627         AxFontDataModel::convertProperties( rPropMap, rConv );
1628     }
1629 }
1630 
1631 bool AxContainerModelBase::importClassTable( BinaryInputStream& rInStrm, AxClassTable& orClassTable )
1632 {
1633     bool bValid = true;
1634     orClassTable.clear();
1635     if( !getFlag( mnFlags, AX_CONTAINER_NOCLASSTABLE ) )
1636     {
1637         sal_uInt16 nCount = rInStrm.readuInt16();
1638         for( sal_uInt16 nIndex = 0; bValid && (nIndex < nCount); ++nIndex )
1639         {
1640             orClassTable.push_back( OUString() );
1641             AxBinaryPropertyReader aReader( rInStrm );
1642             aReader.readGuidProperty( orClassTable.back() );
1643             aReader.skipGuidProperty(); // source interface GUID
1644             aReader.skipUndefinedProperty();
1645             aReader.skipGuidProperty(); // default interface GUID
1646             aReader.skipIntProperty< sal_uInt32 >(); // class table and var flags
1647             aReader.skipIntProperty< sal_uInt32 >(); // method count
1648             aReader.skipIntProperty< sal_Int32 >(); // IDispatch identifier for linked cell access
1649             aReader.skipIntProperty< sal_uInt16 >(); // get function index for linked cell access
1650             aReader.skipIntProperty< sal_uInt16 >(); // put function index for linked cell access
1651             aReader.skipIntProperty< sal_uInt16 >(); // linked cell access property type
1652             aReader.skipIntProperty< sal_uInt16 >(); // get function index of value
1653             aReader.skipIntProperty< sal_uInt16 >(); // put function index of value
1654             aReader.skipIntProperty< sal_uInt16 >(); // value type
1655             aReader.skipIntProperty< sal_Int32 >(); // IDispatch identifier for source range access
1656             aReader.skipIntProperty< sal_uInt16 >(); // get function index for source range access
1657             bValid = aReader.finalizeImport();
1658         }
1659     }
1660     return bValid;
1661 }
1662 
1663 // ============================================================================
1664 
1665 AxFrameModel::AxFrameModel() :
1666     AxContainerModelBase( true )
1667 {
1668 }
1669 
1670 ApiControlType AxFrameModel::getControlType() const
1671 {
1672     return API_CONTROL_GROUPBOX;
1673 }
1674 
1675 void AxFrameModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const
1676 {
1677     rPropMap.setProperty( PROP_Label, maCaption );
1678     rPropMap.setProperty( PROP_Enabled, getFlag( mnFlags, AX_CONTAINER_ENABLED ) );
1679     AxContainerModelBase::convertProperties( rPropMap, rConv );
1680 }
1681 
1682 // ============================================================================
1683 
1684 AxFormPageModel::AxFormPageModel()
1685 {
1686 }
1687 
1688 ApiControlType AxFormPageModel::getControlType() const
1689 {
1690     return API_CONTROL_PAGE;
1691 }
1692 
1693 void AxFormPageModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const
1694 {
1695     rPropMap.setProperty( PROP_Title, maCaption );
1696     rPropMap.setProperty( PROP_Enabled, getFlag( mnFlags, AX_CONTAINER_ENABLED ) );
1697     rConv.convertColor( rPropMap, PROP_BackgroundColor, mnBackColor );
1698     AxContainerModelBase::convertProperties( rPropMap, rConv );
1699 }
1700 
1701 // ============================================================================
1702 
1703 AxMultiPageModel::AxMultiPageModel()
1704 {
1705 }
1706 
1707 ApiControlType AxMultiPageModel::getControlType() const
1708 {
1709     return API_CONTROL_MULTIPAGE;
1710 }
1711 
1712 void AxMultiPageModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const
1713 {
1714     rPropMap.setProperty( PROP_Enabled, getFlag( mnFlags, AX_CONTAINER_ENABLED ) );
1715     if( mxTabStrip.get() )
1716         mxTabStrip->convertProperties( rPropMap, rConv );
1717     AxContainerModelBase::convertProperties( rPropMap, rConv );
1718 }
1719 
1720 void AxMultiPageModel::setTabStripModel( const AxTabStripModelRef& rxTabStrip )
1721 {
1722     mxTabStrip = rxTabStrip;
1723 }
1724 
1725 // ============================================================================
1726 
1727 AxUserFormModel::AxUserFormModel()
1728 {
1729 }
1730 
1731 ApiControlType AxUserFormModel::getControlType() const
1732 {
1733     return API_CONTROL_DIALOG;
1734 }
1735 
1736 void AxUserFormModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const
1737 {
1738     rPropMap.setProperty( PROP_Title, maCaption );
1739     rConv.convertColor( rPropMap, PROP_BackgroundColor, mnBackColor );
1740     AxContainerModelBase::convertProperties( rPropMap, rConv );
1741 }
1742 
1743 // ============================================================================
1744 
1745 EmbeddedControl::EmbeddedControl( const OUString& rName ) :
1746     maName( rName )
1747 {
1748 }
1749 
1750 EmbeddedControl::~EmbeddedControl()
1751 {
1752 }
1753 
1754 ControlModelBase* EmbeddedControl::createModelFromGuid( const OUString& rClassId )
1755 {
1756     OUString aClassId = rClassId.toAsciiUpperCase();
1757 
1758     if( aClassId.equalsAscii( AX_GUID_COMMANDBUTTON ) )     return &createModel< AxCommandButtonModel >();
1759     if( aClassId.equalsAscii( AX_GUID_LABEL ) )             return &createModel< AxLabelModel >();
1760     if( aClassId.equalsAscii( AX_GUID_IMAGE ) )             return &createModel< AxImageModel >();
1761     if( aClassId.equalsAscii( AX_GUID_TOGGLEBUTTON ) )      return &createModel< AxToggleButtonModel >();
1762     if( aClassId.equalsAscii( AX_GUID_CHECKBOX ) )          return &createModel< AxCheckBoxModel >();
1763     if( aClassId.equalsAscii( AX_GUID_OPTIONBUTTON ) )      return &createModel< AxOptionButtonModel >();
1764     if( aClassId.equalsAscii( AX_GUID_TEXTBOX ) )           return &createModel< AxTextBoxModel >();
1765     if( aClassId.equalsAscii( AX_GUID_LISTBOX ) )           return &createModel< AxListBoxModel >();
1766     if( aClassId.equalsAscii( AX_GUID_COMBOBOX ) )          return &createModel< AxComboBoxModel >();
1767     if( aClassId.equalsAscii( AX_GUID_SPINBUTTON ) )        return &createModel< AxSpinButtonModel >();
1768     if( aClassId.equalsAscii( AX_GUID_SCROLLBAR ) )         return &createModel< AxScrollBarModel >();
1769     if( aClassId.equalsAscii( AX_GUID_FRAME ) )             return &createModel< AxFrameModel >();
1770     if( aClassId.equalsAscii( COMCTL_GUID_SCROLLBAR_60 ) )  return &createModel< ComCtlScrollBarModel >( COMCTL_VERSION_60 );
1771 
1772     mxModel.reset();
1773     return 0;
1774 }
1775 
1776 OUString EmbeddedControl::getServiceName() const
1777 {
1778     return mxModel.get() ? mxModel->getServiceName() : OUString();
1779 }
1780 
1781 bool EmbeddedControl::convertProperties( const Reference< XControlModel >& rxCtrlModel, const ControlConverter& rConv ) const
1782 {
1783     if( mxModel.get() && rxCtrlModel.is() && (maName.getLength() > 0) )
1784     {
1785         PropertyMap aPropMap;
1786         aPropMap.setProperty( PROP_Name, maName );
1787         mxModel->convertProperties( aPropMap, rConv );
1788         PropertySet aPropSet( rxCtrlModel );
1789         aPropSet.setProperties( aPropMap );
1790         return true;
1791     }
1792     return false;
1793 }
1794 
1795 // ============================================================================
1796 
1797 EmbeddedForm::EmbeddedForm( const Reference< XModel >& rxDocModel,
1798         const Reference< XDrawPage >& rxDrawPage, const GraphicHelper& rGraphicHelper, bool bDefaultColorBgr ) :
1799     maControlConv( rxDocModel, rGraphicHelper, bDefaultColorBgr ),
1800     mxModelFactory( rxDocModel, UNO_QUERY ),
1801     mxFormsSupp( rxDrawPage, UNO_QUERY )
1802 {
1803     OSL_ENSURE( mxModelFactory.is(), "EmbeddedForm::EmbeddedForm - missing service factory" );
1804 }
1805 
1806 Reference< XControlModel > EmbeddedForm::convertAndInsert( const EmbeddedControl& rControl, sal_Int32& rnCtrlIndex )
1807 {
1808     if( mxModelFactory.is() && rControl.hasModel() ) try
1809     {
1810         // create the UNO control model
1811         OUString aServiceName = rControl.getServiceName();
1812         Reference< XFormComponent > xFormComp( mxModelFactory->createInstance( aServiceName ), UNO_QUERY_THROW );
1813         Reference< XControlModel > xCtrlModel( xFormComp, UNO_QUERY_THROW );
1814 
1815         // insert the control into the form
1816         Reference< XIndexContainer > xFormIC( createXForm(), UNO_SET_THROW );
1817         rnCtrlIndex = xFormIC->getCount();
1818         xFormIC->insertByIndex( rnCtrlIndex, Any( xFormComp ) );
1819 
1820         // convert the control properties
1821         if( rControl.convertProperties( xCtrlModel, maControlConv ) )
1822             return xCtrlModel;
1823     }
1824     catch( Exception& )
1825     {
1826     }
1827     return Reference< XControlModel >();
1828 }
1829 
1830 Reference< XIndexContainer > EmbeddedForm::createXForm()
1831 {
1832     if( mxFormsSupp.is() )
1833     {
1834         try
1835         {
1836             Reference< XNameContainer > xFormsNC( mxFormsSupp->getForms(), UNO_SET_THROW );
1837             OUString aFormName = CREATE_OUSTRING( "Standard" );
1838             if( xFormsNC->hasByName( aFormName ) )
1839             {
1840                 mxFormIC.set( xFormsNC->getByName( aFormName ), UNO_QUERY_THROW );
1841             }
1842             else if( mxModelFactory.is() )
1843             {
1844                 Reference< XForm > xForm( mxModelFactory->createInstance( CREATE_OUSTRING( "com.sun.star.form.component.Form" ) ), UNO_QUERY_THROW );
1845                 xFormsNC->insertByName( aFormName, Any( xForm ) );
1846                 mxFormIC.set( xForm, UNO_QUERY_THROW );
1847             }
1848         }
1849         catch( Exception& )
1850         {
1851         }
1852         // always clear the forms supplier to not try to create the form again
1853         mxFormsSupp.clear();
1854     }
1855     return mxFormIC;
1856 }
1857 
1858 // ============================================================================
1859 
1860 } // namespace ole
1861 } // namespace oox
1862