LCOV - code coverage report
Current view: top level - libreoffice/oox/source/ole - axcontrol.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 368 1384 26.6 %
Date: 2012-12-17 Functions: 48 173 27.7 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include "oox/ole/axcontrol.hxx"
      21             : 
      22             : #include <com/sun/star/awt/FontSlant.hpp>
      23             : #include <com/sun/star/awt/FontStrikeout.hpp>
      24             : #include <com/sun/star/awt/FontUnderline.hpp>
      25             : #include <com/sun/star/awt/FontWeight.hpp>
      26             : #include <com/sun/star/awt/ImagePosition.hpp>
      27             : #include <com/sun/star/awt/ImageScaleMode.hpp>
      28             : #include <com/sun/star/awt/Point.hpp>
      29             : #include <com/sun/star/awt/ScrollBarOrientation.hpp>
      30             : #include <com/sun/star/awt/Size.hpp>
      31             : #include <com/sun/star/awt/TextAlign.hpp>
      32             : #include <com/sun/star/awt/VisualEffect.hpp>
      33             : #include <com/sun/star/awt/XControlModel.hpp>
      34             : #include <com/sun/star/beans/NamedValue.hpp>
      35             : #include <com/sun/star/container/XIndexContainer.hpp>
      36             : #include <com/sun/star/form/XForm.hpp>
      37             : #include <com/sun/star/form/XFormComponent.hpp>
      38             : #include <com/sun/star/form/XFormsSupplier.hpp>
      39             : #include <com/sun/star/form/binding/XBindableValue.hpp>
      40             : #include <com/sun/star/form/binding/XListEntrySink.hpp>
      41             : #include <com/sun/star/form/binding/XListEntrySource.hpp>
      42             : #include <com/sun/star/form/binding/XValueBinding.hpp>
      43             : #include <com/sun/star/lang/XMultiServiceFactory.hpp>
      44             : #include <com/sun/star/sheet/XCellRangeAddressable.hpp>
      45             : #include <com/sun/star/sheet/XCellRangeReferrer.hpp>
      46             : #include <com/sun/star/style/VerticalAlignment.hpp>
      47             : #include <com/sun/star/table/CellAddress.hpp>
      48             : #include <com/sun/star/table/CellRangeAddress.hpp>
      49             : #include <comphelper/string.hxx>
      50             : #include <rtl/tencinfo.h>
      51             : #include "oox/helper/attributelist.hxx"
      52             : #include "oox/helper/binaryinputstream.hxx"
      53             : #include "oox/helper/containerhelper.hxx"
      54             : #include "oox/helper/graphichelper.hxx"
      55             : #include "oox/helper/propertymap.hxx"
      56             : #include "oox/ole/axbinarywriter.hxx"
      57             : #include "tools/string.hxx"
      58             : namespace oox {
      59             : namespace ole {
      60             : 
      61             : using namespace ::com::sun::star;
      62             : using namespace ::com::sun::star::awt;
      63             : using namespace ::com::sun::star::beans;
      64             : using namespace ::com::sun::star::container;
      65             : using namespace ::com::sun::star::drawing;
      66             : using namespace ::com::sun::star::form;
      67             : using namespace ::com::sun::star::form::binding;
      68             : using namespace ::com::sun::star::frame;
      69             : using namespace ::com::sun::star::lang;
      70             : using namespace ::com::sun::star::sheet;
      71             : using namespace ::com::sun::star::style;
      72             : using namespace ::com::sun::star::table;
      73             : using namespace ::com::sun::star::uno;
      74             : 
      75             : namespace {
      76             : 
      77             : const sal_uInt32 COMCTL_ID_SIZE             = 0x12344321;
      78             : 
      79             : const sal_uInt32 COMCTL_ID_COMMONDATA       = 0xABCDEF01;
      80             : const sal_uInt32 COMCTL_COMMON_FLATBORDER   = 0x00000001;
      81             : const sal_uInt32 COMCTL_COMMON_ENABLED      = 0x00000002;
      82             : const sal_uInt32 COMCTL_COMMON_3DBORDER     = 0x00000004;
      83             : const sal_uInt32 COMCTL_COMMON_OLEDROPMAN   = 0x00002000;
      84             : 
      85             : const sal_uInt32 COMCTL_ID_COMPLEXDATA      = 0xBDECDE1F;
      86             : const sal_uInt32 COMCTL_COMPLEX_FONT        = 0x00000001;
      87             : const sal_uInt32 COMCTL_COMPLEX_MOUSEICON   = 0x00000002;
      88             : 
      89             : const sal_uInt32 COMCTL_ID_SCROLLBAR_60     = 0x99470A83;
      90             : const sal_uInt32 COMCTL_SCROLLBAR_HOR       = 0x00000010;
      91             : const sal_Int32 COMCTL_SCROLLBAR_3D         = 0;
      92             : const sal_Int32 COMCTL_SCROLLBAR_FLAT       = 1;
      93             : const sal_Int32 COMCTL_SCROLLBAR_TRACK3D    = 2;
      94             : 
      95             : const sal_uInt32 COMCTL_ID_PROGRESSBAR_50   = 0xE6E17E84;
      96             : const sal_uInt32 COMCTL_ID_PROGRESSBAR_60   = 0x97AB8A01;
      97             : 
      98             : // ----------------------------------------------------------------------------
      99             : 
     100             : const sal_uInt32 AX_CMDBUTTON_DEFFLAGS      = 0x0000001B;
     101             : const sal_uInt32 AX_LABEL_DEFFLAGS          = 0x0080001B;
     102             : const sal_uInt32 AX_IMAGE_DEFFLAGS          = 0x0000001B;
     103             : const sal_uInt32 AX_MORPHDATA_DEFFLAGS      = 0x2C80081B;
     104             : const sal_uInt32 AX_SPINBUTTON_DEFFLAGS     = 0x0000001B;
     105             : const sal_uInt32 AX_SCROLLBAR_DEFFLAGS      = 0x0000001B;
     106             : const sal_uInt32 AX_TABSTRIP_DEFFLAGS       = 0x0000001B;
     107             : 
     108             : const sal_uInt16 AX_POS_TOPLEFT             = 0;
     109             : const sal_uInt16 AX_POS_TOP                 = 1;
     110             : const sal_uInt16 AX_POS_TOPRIGHT            = 2;
     111             : const sal_uInt16 AX_POS_LEFT                = 3;
     112             : const sal_uInt16 AX_POS_CENTER              = 4;
     113             : const sal_uInt16 AX_POS_RIGHT               = 5;
     114             : const sal_uInt16 AX_POS_BOTTOMLEFT          = 6;
     115             : const sal_uInt16 AX_POS_BOTTOM              = 7;
     116             : const sal_uInt16 AX_POS_BOTTOMRIGHT         = 8;
     117             : 
     118             : #define AX_PICPOS_IMPL( label, image ) ((AX_POS_##label << 16) | AX_POS_##image)
     119             : const sal_uInt32 AX_PICPOS_LEFTTOP          = AX_PICPOS_IMPL( TOPRIGHT,    TOPLEFT );
     120             : const sal_uInt32 AX_PICPOS_LEFTCENTER       = AX_PICPOS_IMPL( RIGHT,       LEFT );
     121             : const sal_uInt32 AX_PICPOS_LEFTBOTTOM       = AX_PICPOS_IMPL( BOTTOMRIGHT, BOTTOMLEFT );
     122             : const sal_uInt32 AX_PICPOS_RIGHTTOP         = AX_PICPOS_IMPL( TOPLEFT,     TOPRIGHT );
     123             : const sal_uInt32 AX_PICPOS_RIGHTCENTER      = AX_PICPOS_IMPL( LEFT,        RIGHT );
     124             : const sal_uInt32 AX_PICPOS_RIGHTBOTTOM      = AX_PICPOS_IMPL( BOTTOMLEFT,  BOTTOMRIGHT );
     125             : const sal_uInt32 AX_PICPOS_ABOVELEFT        = AX_PICPOS_IMPL( BOTTOMLEFT,  TOPLEFT );
     126             : const sal_uInt32 AX_PICPOS_ABOVECENTER      = AX_PICPOS_IMPL( BOTTOM,      TOP  );
     127             : const sal_uInt32 AX_PICPOS_ABOVERIGHT       = AX_PICPOS_IMPL( BOTTOMRIGHT, TOPRIGHT );
     128             : const sal_uInt32 AX_PICPOS_BELOWLEFT        = AX_PICPOS_IMPL( TOPLEFT,     BOTTOMLEFT );
     129             : const sal_uInt32 AX_PICPOS_BELOWCENTER      = AX_PICPOS_IMPL( TOP,         BOTTOM );
     130             : const sal_uInt32 AX_PICPOS_BELOWRIGHT       = AX_PICPOS_IMPL( TOPRIGHT,    BOTTOMRIGHT );
     131             : const sal_uInt32 AX_PICPOS_CENTER           = AX_PICPOS_IMPL( CENTER,      CENTER  );
     132             : #undef AX_PICPOS_IMPL
     133             : 
     134             : const sal_Int32 AX_MATCHENTRY_FIRSTLETTER   = 0;
     135             : const sal_Int32 AX_MATCHENTRY_COMPLETE      = 1;
     136             : const sal_Int32 AX_MATCHENTRY_NONE          = 2;
     137             : 
     138             : const sal_Int32 AX_ORIENTATION_AUTO         = -1;
     139             : const sal_Int32 AX_ORIENTATION_VERTICAL     = 0;
     140             : const sal_Int32 AX_ORIENTATION_HORIZONTAL   = 1;
     141             : 
     142             : const sal_Int32 AX_PROPTHUMB_ON             = -1;
     143             : const sal_Int32 AX_PROPTHUMB_OFF            = 0;
     144             : 
     145             : const sal_uInt32 AX_TABSTRIP_TABS           = 0;
     146             : const sal_uInt32 AX_TABSTRIP_BUTTONS        = 1;
     147             : const sal_uInt32 AX_TABSTRIP_NONE           = 2;
     148             : 
     149             : const sal_uInt32 AX_CONTAINER_ENABLED       = 0x00000004;
     150             : const sal_uInt32 AX_CONTAINER_HASDESIGNEXT  = 0x00004000;
     151             : const sal_uInt32 AX_CONTAINER_NOCLASSTABLE  = 0x00008000;
     152             : 
     153             : const sal_uInt32 AX_CONTAINER_DEFFLAGS      = 0x00000004;
     154             : 
     155             : const sal_Int32 AX_CONTAINER_DEFWIDTH       = 4000;
     156             : const sal_Int32 AX_CONTAINER_DEFHEIGHT      = 3000;
     157             : 
     158             : const sal_Int32 AX_CONTAINER_CYCLEALL       = 0;
     159             : const sal_Int32 AX_CONTAINER_CYCLECURRENT   = 2;
     160             : 
     161             : const sal_Int32 AX_CONTAINER_SCR_NONE       = 0x00;
     162             : const sal_Int32 AX_CONTAINER_SCR_HOR        = 0x01;
     163             : const sal_Int32 AX_CONTAINER_SCR_VER        = 0x02;
     164             : const sal_Int32 AX_CONTAINER_SCR_KEEP_HOR   = 0x04;
     165             : const sal_Int32 AX_CONTAINER_SCR_KEEP_VER   = 0x08;
     166             : const sal_Int32 AX_CONTAINER_SCR_SHOW_LEFT  = 0x10;
     167             : 
     168             : // ----------------------------------------------------------------------------
     169             : 
     170             : const sal_Int16 API_BORDER_NONE             = 0;
     171             : const sal_Int16 API_BORDER_SUNKEN           = 1;
     172             : const sal_Int16 API_BORDER_FLAT             = 2;
     173             : 
     174             : const sal_Int16 API_STATE_UNCHECKED         = 0;
     175             : const sal_Int16 API_STATE_CHECKED           = 1;
     176             : const sal_Int16 API_STATE_DONTKNOW          = 2;
     177             : 
     178             : // ----------------------------------------------------------------------------
     179             : 
     180             : /** Tries to extract a range address from a defined name. */
     181           0 : bool lclExtractRangeFromName( CellRangeAddress& orRangeAddr, const Reference< XModel >& rxDocModel, const OUString& rAddressString )
     182             : {
     183             :     try
     184             :     {
     185           0 :         PropertySet aPropSet( rxDocModel );
     186           0 :         Reference< XNameAccess > xRangesNA( aPropSet.getAnyProperty( PROP_NamedRanges ), UNO_QUERY_THROW );
     187           0 :         Reference< XCellRangeReferrer > xReferrer( xRangesNA->getByName( rAddressString ), UNO_QUERY_THROW );
     188           0 :         Reference< XCellRangeAddressable > xAddressable( xReferrer->getReferredCells(), UNO_QUERY_THROW );
     189           0 :         orRangeAddr = xAddressable->getRangeAddress();
     190           0 :         return true;
     191             :     }
     192           0 :     catch (const Exception& e)
     193             :     {
     194             :         SAL_WARN("oox", "exception: " << e.Message);
     195             :     }
     196           0 :     return false;
     197             : }
     198             : 
     199           0 : bool lclExtractAddressFromName( CellAddress& orAddress, const Reference< XModel >& rxDocModel, const OUString& rAddressString )
     200             : {
     201           0 :     CellRangeAddress aRangeAddr;
     202           0 :     if( lclExtractRangeFromName( aRangeAddr, rxDocModel, rAddressString ) &&
     203             :         (aRangeAddr.StartColumn == aRangeAddr.EndColumn) &&
     204             :         (aRangeAddr.StartRow == aRangeAddr.EndRow) )
     205             :     {
     206           0 :         orAddress.Sheet = aRangeAddr.Sheet;
     207           0 :         orAddress.Column = aRangeAddr.StartColumn;
     208           0 :         orAddress.Row = aRangeAddr.StartRow;
     209           0 :         return true;
     210             :     }
     211           0 :     return false;
     212             : }
     213             : 
     214           0 : void lclPrepareConverter( PropertySet& rConverter, const Reference< XModel >& rxDocModel,
     215             :         const OUString& rAddressString, sal_Int32 nRefSheet, bool bRange )
     216             : {
     217           0 :     if( !rConverter.is() ) try
     218             :     {
     219           0 :         Reference< XMultiServiceFactory > xModelFactory( rxDocModel, UNO_QUERY_THROW );
     220             :         OUString aServiceName = bRange ?
     221             :             CREATE_OUSTRING( "com.sun.star.table.CellRangeAddressConversion" ) :
     222           0 :             CREATE_OUSTRING( "com.sun.star.table.CellAddressConversion" );
     223           0 :         rConverter.set( xModelFactory->createInstance( aServiceName ) );
     224             :     }
     225           0 :     catch (const Exception& e)
     226             :     {
     227             :         SAL_WARN("oox", "exception: " << e.Message);
     228             :     }
     229           0 :     rConverter.setProperty( PROP_XLA1Representation, rAddressString );
     230           0 :     rConverter.setProperty( PROP_ReferenceSheet, nRefSheet );
     231           0 : }
     232             : 
     233             : } // namespace
     234             : 
     235             : // ============================================================================
     236             : 
     237          64 : ControlConverter::ControlConverter( const Reference< XModel >& rxDocModel,
     238             :         const GraphicHelper& rGraphicHelper, bool bDefaultColorBgr ) :
     239             :     mxDocModel( rxDocModel ),
     240             :     mrGraphicHelper( rGraphicHelper ),
     241          64 :     mbDefaultColorBgr( bDefaultColorBgr )
     242             : {
     243             :     OSL_ENSURE( mxDocModel.is(), "ControlConverter::ControlConverter - missing document model" );
     244          64 : }
     245             : 
     246          64 : ControlConverter::~ControlConverter()
     247             : {
     248          64 : }
     249             : 
     250             : // Generic conversion ---------------------------------------------------------
     251             : 
     252           0 : void ControlConverter::convertPosition( PropertyMap& rPropMap, const AxPairData& rPos ) const
     253             : {
     254             :     // position is given in 1/100 mm, UNO needs AppFont units
     255           0 :     awt::Point aAppFontPos = mrGraphicHelper.convertHmmToAppFont( awt::Point( rPos.first, rPos.second ) );
     256           0 :     rPropMap.setProperty( PROP_PositionX, aAppFontPos.X );
     257           0 :     rPropMap.setProperty( PROP_PositionY, aAppFontPos.Y );
     258           0 : }
     259             : 
     260           0 : void ControlConverter::convertSize( PropertyMap& rPropMap, const AxPairData& rSize ) const
     261             : {
     262             :     // size is given in 1/100 mm, UNO needs AppFont units
     263           0 :     awt::Size aAppFontSize = mrGraphicHelper.convertHmmToAppFont( awt::Size( rSize.first, rSize.second ) );
     264           0 :     rPropMap.setProperty( PROP_Width, aAppFontSize.Width );
     265           0 :     rPropMap.setProperty( PROP_Height, aAppFontSize.Height );
     266           0 : }
     267             : 
     268          24 : void ControlConverter::convertColor( PropertyMap& rPropMap, sal_Int32 nPropId, sal_uInt32 nOleColor ) const
     269             : {
     270          24 :     rPropMap.setProperty( nPropId, OleHelper::decodeOleColor( mrGraphicHelper, nOleColor, mbDefaultColorBgr ) );
     271          24 : }
     272             : 
     273           4 : void ControlConverter::convertToMSColor( PropertySet& rPropSet, sal_Int32 nPropId, sal_uInt32& nOleColor, sal_uInt32 nDefault ) const
     274             : {
     275           4 :     sal_uInt32 nRGB = 0;
     276           4 :     if (rPropSet.getProperty( nRGB, nPropId ))
     277           0 :         nOleColor = OleHelper::encodeOleColor( nRGB );
     278             :     else
     279           4 :         nOleColor = nDefault;
     280           4 : }
     281          10 : void ControlConverter::convertPicture( PropertyMap& rPropMap, const StreamDataSequence& rPicData ) const
     282             : {
     283          10 :     if( rPicData.hasElements() )
     284             :     {
     285           0 :         OUString aGraphicUrl = mrGraphicHelper.importGraphicObject( rPicData );
     286           0 :         if( !aGraphicUrl.isEmpty() )
     287           0 :             rPropMap.setProperty( PROP_ImageURL, aGraphicUrl );
     288             :     }
     289          10 : }
     290             : 
     291           0 : void ControlConverter::convertOrientation( PropertyMap& rPropMap, bool bHorizontal ) const
     292             : {
     293           0 :     sal_Int32 nScrollOrient = bHorizontal ? ScrollBarOrientation::HORIZONTAL : ScrollBarOrientation::VERTICAL;
     294           0 :     rPropMap.setProperty( PROP_Orientation, nScrollOrient );
     295           0 : }
     296             : 
     297           0 : void ControlConverter::convertToMSOrientation( PropertySet& rPropSet, bool& bHorizontal ) const
     298             : {
     299           0 :     sal_Int32 nScrollOrient = ScrollBarOrientation::HORIZONTAL;
     300           0 :     if ( rPropSet.getProperty( nScrollOrient, PROP_Orientation ) )
     301           0 :         bHorizontal = ( nScrollOrient == ScrollBarOrientation::HORIZONTAL );
     302           0 : }
     303             : 
     304          10 : void ControlConverter::convertVerticalAlign( PropertyMap& rPropMap, sal_Int32 nVerticalAlign ) const
     305             : {
     306          10 :     VerticalAlignment eAlign = VerticalAlignment_TOP;
     307          10 :     switch( nVerticalAlign )
     308             :     {
     309           0 :         case XML_Top:       eAlign = VerticalAlignment_TOP;     break;
     310          10 :         case XML_Center:    eAlign = VerticalAlignment_MIDDLE;  break;
     311           0 :         case XML_Bottom:    eAlign = VerticalAlignment_BOTTOM;  break;
     312             :     }
     313          10 :     rPropMap.setProperty( PROP_VerticalAlign, eAlign );
     314          10 : }
     315             : 
     316           0 : void ControlConverter::convertScrollabilitySettings( PropertyMap& rPropMap,
     317             :                                          const AxPairData& rScrollPos, const AxPairData& rScrollArea,
     318             :                                          sal_Int32 nScrollBars ) const
     319             : {
     320           0 :     awt::Size tmpSize = mrGraphicHelper.convertHmmToAppFont( awt::Size( rScrollArea.first, rScrollArea.second ) );
     321           0 :     awt::Point tmpPos = mrGraphicHelper.convertHmmToAppFont( awt::Point( rScrollPos.first, rScrollPos.second ) );
     322           0 :     rPropMap.setProperty( PROP_ScrollHeight, tmpSize.Height );
     323           0 :     rPropMap.setProperty( PROP_ScrollWidth, tmpSize.Width );
     324           0 :     rPropMap.setProperty( PROP_ScrollTop, tmpPos.Y );
     325           0 :     rPropMap.setProperty( PROP_ScrollLeft, tmpPos.X );
     326           0 :     rPropMap.setProperty( PROP_HScroll, ( nScrollBars & 0x1 ) == 0x1 );
     327           0 :     rPropMap.setProperty( PROP_VScroll, ( nScrollBars & 0x2 ) == 0x2 );
     328           0 : }
     329             : 
     330           0 : void ControlConverter::convertScrollBar( PropertyMap& rPropMap,
     331             :         sal_Int32 nMin, sal_Int32 nMax, sal_Int32 nPosition,
     332             :         sal_Int32 nSmallChange, sal_Int32 nLargeChange, bool bAwtModel ) const
     333             : {
     334           0 :     rPropMap.setProperty( PROP_ScrollValueMin, ::std::min( nMin, nMax ) );
     335           0 :     rPropMap.setProperty( PROP_ScrollValueMax, ::std::max( nMin, nMax ) );
     336           0 :     rPropMap.setProperty( PROP_LineIncrement, nSmallChange );
     337           0 :     rPropMap.setProperty( PROP_BlockIncrement, nLargeChange );
     338           0 :     rPropMap.setProperty( bAwtModel ? PROP_ScrollValue : PROP_DefaultScrollValue, nPosition );
     339           0 : }
     340             : 
     341           0 : void ControlConverter::bindToSources( const Reference< XControlModel >& rxCtrlModel,
     342             :         const OUString& rCtrlSource, const OUString& rRowSource, sal_Int32 nRefSheet ) const
     343             : {
     344             :     // value binding
     345           0 :     if( !rCtrlSource.isEmpty() ) try
     346             :     {
     347             :         // first check if the XBindableValue interface is supported
     348           0 :         Reference< XBindableValue > xBindable( rxCtrlModel, UNO_QUERY_THROW );
     349             : 
     350             :         // convert address string to cell address struct
     351           0 :         CellAddress aAddress;
     352           0 :         if( !lclExtractAddressFromName( aAddress, mxDocModel, rCtrlSource ) )
     353             :         {
     354           0 :             lclPrepareConverter( maAddressConverter, mxDocModel, rCtrlSource, nRefSheet, false );
     355           0 :             if( !maAddressConverter.getProperty( aAddress, PROP_Address ) )
     356           0 :                 throw RuntimeException();
     357             :         }
     358             : 
     359             :         // create argument sequence
     360           0 :         NamedValue aValue;
     361           0 :         aValue.Name = CREATE_OUSTRING( "BoundCell" );
     362           0 :         aValue.Value <<= aAddress;
     363           0 :         Sequence< Any > aArgs( 1 );
     364           0 :         aArgs[ 0 ] <<= aValue;
     365             : 
     366             :         // create the CellValueBinding instance and set at the control model
     367           0 :         Reference< XMultiServiceFactory > xModelFactory( mxDocModel, UNO_QUERY_THROW );
     368           0 :         Reference< XValueBinding > xBinding( xModelFactory->createInstanceWithArguments(
     369           0 :             CREATE_OUSTRING( "com.sun.star.table.CellValueBinding" ), aArgs ), UNO_QUERY_THROW );
     370           0 :         xBindable->setValueBinding( xBinding );
     371             :     }
     372           0 :     catch (const Exception& e)
     373             :     {
     374             :         SAL_WARN("oox", "exception: " << e.Message);
     375             :     }
     376             : 
     377             :     // list entry source
     378           0 :     if( !rRowSource.isEmpty() ) try
     379             :     {
     380             :         // first check if the XListEntrySink interface is supported
     381           0 :         Reference< XListEntrySink > xEntrySink( rxCtrlModel, UNO_QUERY_THROW );
     382             : 
     383             :         // convert address string to cell range address struct
     384           0 :         CellRangeAddress aRangeAddr;
     385           0 :         if( !lclExtractRangeFromName( aRangeAddr, mxDocModel, rRowSource ) )
     386             :         {
     387           0 :             lclPrepareConverter( maRangeConverter, mxDocModel, rRowSource, nRefSheet, true );
     388           0 :             if( !maRangeConverter.getProperty( aRangeAddr, PROP_Address ) )
     389           0 :                 throw RuntimeException();
     390             :         }
     391             : 
     392             :         // create argument sequence
     393           0 :         NamedValue aValue;
     394           0 :         aValue.Name = CREATE_OUSTRING( "CellRange" );
     395           0 :         aValue.Value <<= aRangeAddr;
     396           0 :         Sequence< Any > aArgs( 1 );
     397           0 :         aArgs[ 0 ] <<= aValue;
     398             : 
     399             :         // create the EntrySource instance and set at the control model
     400           0 :         Reference< XMultiServiceFactory > xModelFactory( mxDocModel, UNO_QUERY_THROW );
     401           0 :         Reference< XListEntrySource > xEntrySource( xModelFactory->createInstanceWithArguments(
     402           0 :             CREATE_OUSTRING( "com.sun.star.table.CellRangeListSource"  ), aArgs ), UNO_QUERY_THROW );
     403           0 :         xEntrySink->setListEntrySource( xEntrySource );
     404             :     }
     405           0 :     catch (const Exception& e)
     406             :     {
     407             :         SAL_WARN("oox", "exception: " << e.Message);
     408             :     }
     409           0 : }
     410             : 
     411             : // ActiveX (Forms 2.0) specific conversion ------------------------------------
     412             : 
     413          12 : void ControlConverter::convertAxBackground( PropertyMap& rPropMap,
     414             :         sal_uInt32 nBackColor, sal_uInt32 nFlags, ApiTransparencyMode eTranspMode ) const
     415             : {
     416          12 :     bool bOpaque = getFlag( nFlags, AX_FLAGS_OPAQUE );
     417          12 :     switch( eTranspMode )
     418             :     {
     419             :         case API_TRANSPARENCY_NOTSUPPORTED:
     420             :             // fake transparency by using system window background if needed
     421           8 :             convertColor( rPropMap, PROP_BackgroundColor, bOpaque ? nBackColor : AX_SYSCOLOR_WINDOWBACK );
     422           8 :         break;
     423             :         case API_TRANSPARENCY_PAINTTRANSPARENT:
     424           0 :             rPropMap.setProperty( PROP_PaintTransparent, !bOpaque );
     425             :             // run-through intended!
     426             :         case API_TRANSPARENCY_VOID:
     427             :             // keep transparency by leaving the (void) default property value
     428           4 :             if( bOpaque )
     429           2 :                 convertColor( rPropMap, PROP_BackgroundColor, nBackColor );
     430           4 :         break;
     431             :     }
     432          12 : }
     433             : 
     434           2 : void ControlConverter::convertAxBorder( PropertyMap& rPropMap,
     435             :         sal_uInt32 nBorderColor, sal_Int32 nBorderStyle, sal_Int32 nSpecialEffect ) const
     436             : {
     437             :     sal_Int16 nBorder = (nBorderStyle == AX_BORDERSTYLE_SINGLE) ? API_BORDER_FLAT :
     438           2 :         ((nSpecialEffect == AX_SPECIALEFFECT_FLAT) ? API_BORDER_NONE : API_BORDER_SUNKEN);
     439           2 :     rPropMap.setProperty( PROP_Border, nBorder );
     440           2 :     convertColor( rPropMap, PROP_BorderColor, nBorderColor );
     441           2 : }
     442             : 
     443           2 : void ControlConverter::convertToAxBorder( PropertySet& rPropSet,
     444             :         sal_uInt32& nBorderColor, sal_Int32& nBorderStyle, sal_Int32& nSpecialEffect ) const
     445             : {
     446           2 :     sal_Int16 nBorder = API_BORDER_NONE;
     447           2 :     rPropSet.getProperty( nBorder, PROP_Border );
     448           2 :     nBorderStyle = AX_BORDERSTYLE_NONE;
     449           2 :     nSpecialEffect =  AX_SPECIALEFFECT_FLAT;
     450           2 :     switch ( nBorder )
     451             :     {
     452             :         case API_BORDER_FLAT:
     453           0 :             nBorderStyle = AX_BORDERSTYLE_SINGLE;
     454           0 :             break;
     455             :         case API_BORDER_SUNKEN:
     456           2 :             nSpecialEffect =  AX_SPECIALEFFECT_SUNKEN;
     457             :         case API_BORDER_NONE:
     458             :         default:
     459           2 :             break;
     460             :     };
     461           2 :     convertToMSColor( rPropSet, PROP_BorderColor, nBorderColor );
     462           2 : }
     463             : 
     464           2 : void ControlConverter::convertAxVisualEffect( PropertyMap& rPropMap, sal_Int32 nSpecialEffect ) const
     465             : {
     466           2 :     sal_Int16 nVisualEffect = (nSpecialEffect == AX_SPECIALEFFECT_FLAT) ? VisualEffect::FLAT : VisualEffect::LOOK3D;
     467           2 :     rPropMap.setProperty( PROP_VisualEffect, nVisualEffect );
     468           2 : }
     469             : 
     470           0 : void ControlConverter::convertToAxVisualEffect( PropertySet& rPropSet, sal_Int32& nSpecialEffect ) const
     471             : {
     472           0 :     sal_Int16 nVisualEffect = AX_SPECIALEFFECT_FLAT;
     473           0 :     rPropSet.getProperty( nVisualEffect, PROP_VisualEffect );
     474             :     // is this appropriate AX_SPECIALEFFECT_XXXX value ?
     475           0 :     if (nVisualEffect == VisualEffect::LOOK3D )
     476           0 :         nSpecialEffect = AX_SPECIALEFFECT_RAISED;
     477           0 : }
     478             : 
     479          10 : void ControlConverter::convertAxPicture( PropertyMap& rPropMap, const StreamDataSequence& rPicData, sal_uInt32 nPicPos ) const
     480             : {
     481             :     // the picture
     482          10 :     convertPicture( rPropMap, rPicData );
     483             : 
     484             :     // picture position
     485          10 :     sal_Int16 nImagePos = ImagePosition::LeftCenter;
     486          10 :     switch( nPicPos )
     487             :     {
     488           0 :         case AX_PICPOS_LEFTTOP:     nImagePos = ImagePosition::LeftTop;     break;
     489           0 :         case AX_PICPOS_LEFTCENTER:  nImagePos = ImagePosition::LeftCenter;  break;
     490           0 :         case AX_PICPOS_LEFTBOTTOM:  nImagePos = ImagePosition::LeftBottom;  break;
     491           0 :         case AX_PICPOS_RIGHTTOP:    nImagePos = ImagePosition::RightTop;    break;
     492           0 :         case AX_PICPOS_RIGHTCENTER: nImagePos = ImagePosition::RightCenter; break;
     493           0 :         case AX_PICPOS_RIGHTBOTTOM: nImagePos = ImagePosition::RightBottom; break;
     494           0 :         case AX_PICPOS_ABOVELEFT:   nImagePos = ImagePosition::AboveLeft;   break;
     495          10 :         case AX_PICPOS_ABOVECENTER: nImagePos = ImagePosition::AboveCenter; break;
     496           0 :         case AX_PICPOS_ABOVERIGHT:  nImagePos = ImagePosition::AboveRight;  break;
     497           0 :         case AX_PICPOS_BELOWLEFT:   nImagePos = ImagePosition::BelowLeft;   break;
     498           0 :         case AX_PICPOS_BELOWCENTER: nImagePos = ImagePosition::BelowCenter; break;
     499           0 :         case AX_PICPOS_BELOWRIGHT:  nImagePos = ImagePosition::BelowRight;  break;
     500           0 :         case AX_PICPOS_CENTER:      nImagePos = ImagePosition::Centered;    break;
     501             :         default:    OSL_FAIL( "ControlConverter::convertAxPicture - unknown picture position" );
     502             :     }
     503          10 :     rPropMap.setProperty( PROP_ImagePosition, nImagePos );
     504          10 : }
     505             : 
     506           0 : void ControlConverter::convertAxPicture( PropertyMap& rPropMap, const StreamDataSequence& rPicData,
     507             :         sal_Int32 nPicSizeMode, sal_Int32 /*nPicAlign*/, bool /*bPicTiling*/ ) const
     508             : {
     509             :     // the picture
     510           0 :     convertPicture( rPropMap, rPicData );
     511             : 
     512             :     // picture scale mode
     513           0 :     sal_Int16 nScaleMode = ImageScaleMode::None;
     514           0 :     switch( nPicSizeMode )
     515             :     {
     516           0 :         case AX_PICSIZE_CLIP:       nScaleMode = ImageScaleMode::None;          break;
     517           0 :         case AX_PICSIZE_STRETCH:    nScaleMode = ImageScaleMode::Anisotropic;   break;
     518           0 :         case AX_PICSIZE_ZOOM:       nScaleMode = ImageScaleMode::Isotropic;     break;
     519             :         default:    OSL_FAIL( "ControlConverter::convertAxPicture - unknown picture size mode" );
     520             :     }
     521           0 :     rPropMap.setProperty( PROP_ScaleMode, nScaleMode );
     522           0 : }
     523             : 
     524           2 : void ControlConverter::convertAxState( PropertyMap& rPropMap,
     525             :         const OUString& rValue, sal_Int32 nMultiSelect, ApiDefaultStateMode eDefStateMode, bool bAwtModel ) const
     526             : {
     527           2 :     bool bBooleanState = eDefStateMode == API_DEFAULTSTATE_BOOLEAN;
     528           2 :     bool bSupportsTriState = eDefStateMode == API_DEFAULTSTATE_TRISTATE;
     529             : 
     530             :     // state
     531           2 :     sal_Int16 nState = bSupportsTriState ? API_STATE_DONTKNOW : API_STATE_UNCHECKED;
     532           2 :     if( rValue.getLength() == 1 ) switch( rValue[ 0 ] )
     533             :     {
     534           0 :         case '0':   nState = API_STATE_UNCHECKED;   break;
     535           2 :         case '1':   nState = API_STATE_CHECKED;     break;
     536             :         // any other string (also empty) means 'dontknow'
     537             :     }
     538           2 :     sal_Int32 nPropId = bAwtModel ? PROP_State : PROP_DefaultState;
     539           2 :     if( bBooleanState )
     540           0 :         rPropMap.setProperty( nPropId, nState != API_STATE_UNCHECKED );
     541             :     else
     542           2 :         rPropMap.setProperty( nPropId, nState );
     543             : 
     544             :     // tristate
     545           2 :     if( bSupportsTriState )
     546           2 :         rPropMap.setProperty( PROP_TriState, nMultiSelect == AX_SELCTION_MULTI );
     547           2 : }
     548             : 
     549           0 : void ControlConverter::convertToAxState( PropertySet& rPropSet,
     550             :         OUString& rValue, sal_Int32& nMultiSelect, ApiDefaultStateMode eDefStateMode, bool /*bAwtModel*/ ) const
     551             : {
     552           0 :     bool bSupportsTriState = eDefStateMode == API_DEFAULTSTATE_TRISTATE;
     553             : 
     554           0 :     sal_Int16 nState = API_STATE_DONTKNOW;
     555             : 
     556           0 :     sal_Bool bTmp = sal_False;
     557             :     // need to use State for current state ( I think this is regardless of whether
     558             :     // control is awt or not )
     559           0 :     rPropSet.getProperty( nState, PROP_State );
     560             : 
     561           0 :     rValue = rtl::OUString(); // empty e.g. 'don't know'
     562           0 :     if ( nState == API_STATE_UNCHECKED )
     563           0 :         rValue = rtl::OUString( '0' );
     564           0 :     else if ( nState == API_STATE_CHECKED )
     565           0 :         rValue = rtl::OUString( '1' );
     566             : 
     567             :     // tristate
     568           0 :     if( bSupportsTriState && rPropSet.getProperty( bTmp, PROP_TriState ) )
     569           0 :         nMultiSelect = AX_SELCTION_MULTI;
     570           0 : }
     571             : 
     572           0 : void ControlConverter::convertAxOrientation( PropertyMap& rPropMap,
     573             :         const AxPairData& rSize, sal_Int32 nOrientation ) const
     574             : {
     575           0 :     bool bHorizontal = true;
     576           0 :     switch( nOrientation )
     577             :     {
     578           0 :         case AX_ORIENTATION_AUTO:       bHorizontal = rSize.first > rSize.second;   break;
     579           0 :         case AX_ORIENTATION_VERTICAL:   bHorizontal = false;                        break;
     580           0 :         case AX_ORIENTATION_HORIZONTAL: bHorizontal = true;                         break;
     581             :         default:    OSL_FAIL( "ControlConverter::convertAxOrientation - unknown orientation" );
     582             :     }
     583           0 :     convertOrientation( rPropMap, bHorizontal );
     584           0 : }
     585             : 
     586           0 : void ControlConverter::convertToAxOrientation( PropertySet& rPropSet,
     587             :         const AxPairData& /*rSize*/, sal_Int32& nOrientation ) const
     588             : {
     589           0 :     bool bHorizontal = true;
     590           0 :     convertToMSOrientation( rPropSet, bHorizontal );
     591             : 
     592           0 :     if ( bHorizontal )
     593           0 :         nOrientation = AX_ORIENTATION_HORIZONTAL;
     594             :     else
     595           0 :         nOrientation = AX_ORIENTATION_VERTICAL;
     596           0 : }
     597             : 
     598             : // ============================================================================
     599             : 
     600          14 : ControlModelBase::ControlModelBase() :
     601             :     maSize( 0, 0 ),
     602          14 :     mbAwtModel( false )
     603             : {
     604          14 : }
     605             : 
     606          14 : ControlModelBase::~ControlModelBase()
     607             : {
     608          14 : }
     609             : 
     610          12 : OUString ControlModelBase::getServiceName() const
     611             : {
     612          12 :     ApiControlType eCtrlType = getControlType();
     613          12 :     if( mbAwtModel ) switch( eCtrlType )
     614             :     {
     615           0 :         case API_CONTROL_BUTTON:        return CREATE_OUSTRING( "com.sun.star.awt.UnoControlButtonModel" );
     616           0 :         case API_CONTROL_FIXEDTEXT:     return CREATE_OUSTRING( "com.sun.star.awt.UnoControlFixedTextModel" );
     617           0 :         case API_CONTROL_IMAGE:         return CREATE_OUSTRING( "com.sun.star.awt.UnoControlImageControlModel" );
     618           0 :         case API_CONTROL_CHECKBOX:      return CREATE_OUSTRING( "com.sun.star.awt.UnoControlCheckBoxModel" );
     619           0 :         case API_CONTROL_RADIOBUTTON:   return CREATE_OUSTRING( "com.sun.star.form.component.RadioButton" );
     620           0 :         case API_CONTROL_EDIT:          return CREATE_OUSTRING( "com.sun.star.awt.UnoControlEditModel" );
     621           0 :         case API_CONTROL_NUMERIC:       return CREATE_OUSTRING( "com.sun.star.awt.UnoControlNumericFieldModel" );
     622           0 :         case API_CONTROL_LISTBOX:       return CREATE_OUSTRING( "com.sun.star.form.component.ListBox" );
     623           0 :         case API_CONTROL_COMBOBOX:      return CREATE_OUSTRING( "com.sun.star.form.component.ComboBox" );
     624           0 :         case API_CONTROL_SPINBUTTON:    return CREATE_OUSTRING( "com.sun.star.form.component.SpinButton" );
     625           0 :         case API_CONTROL_SCROLLBAR:     return CREATE_OUSTRING( "com.sun.star.form.component.ScrollBar" );
     626           0 :         case API_CONTROL_PROGRESSBAR:   return CREATE_OUSTRING( "com.sun.star.awt.UnoControlProgressBarModel" );
     627           0 :         case API_CONTROL_GROUPBOX:      return CREATE_OUSTRING( "com.sun.star.form.component.GroupBox" );
     628           0 :         case API_CONTROL_PAGE:          return CREATE_OUSTRING( "com.sun.star.awt.UnoPageModel" );
     629           0 :         case API_CONTROL_MULTIPAGE:     return CREATE_OUSTRING( "com.sun.star.awt.UnoMultiPageModel" );
     630           0 :         case API_CONTROL_DIALOG:        return CREATE_OUSTRING( "com.sun.star.awt.UnoControlDialogModel" );
     631             :         default:    OSL_FAIL( "ControlModelBase::getServiceName - no AWT model service supported" );
     632             :     }
     633          12 :     else switch( eCtrlType )
     634             :     {
     635           8 :         case API_CONTROL_BUTTON:        return CREATE_OUSTRING( "com.sun.star.form.component.CommandButton" );
     636           0 :         case API_CONTROL_FIXEDTEXT:     return CREATE_OUSTRING( "com.sun.star.form.component.FixedText" );
     637           0 :         case API_CONTROL_IMAGE:         return CREATE_OUSTRING( "com.sun.star.form.component.DatabaseImageControl" );
     638           2 :         case API_CONTROL_CHECKBOX:      return CREATE_OUSTRING( "com.sun.star.form.component.CheckBox" );
     639           0 :         case API_CONTROL_RADIOBUTTON:   return CREATE_OUSTRING( "com.sun.star.form.component.RadioButton" );
     640           2 :         case API_CONTROL_EDIT:          return CREATE_OUSTRING( "com.sun.star.form.component.TextField" );
     641           0 :         case API_CONTROL_NUMERIC:       return CREATE_OUSTRING( "com.sun.star.form.component.NumericField" );
     642           0 :         case API_CONTROL_LISTBOX:       return CREATE_OUSTRING( "com.sun.star.form.component.ListBox" );
     643           0 :         case API_CONTROL_COMBOBOX:      return CREATE_OUSTRING( "com.sun.star.form.component.ComboBox" );
     644           0 :         case API_CONTROL_SPINBUTTON:    return CREATE_OUSTRING( "com.sun.star.form.component.SpinButton" );
     645           0 :         case API_CONTROL_SCROLLBAR:     return CREATE_OUSTRING( "com.sun.star.form.component.ScrollBar" );
     646           0 :         case API_CONTROL_GROUPBOX:      return CREATE_OUSTRING( "com.sun.star.form.component.GroupBox" );
     647             :         default:    OSL_FAIL( "ControlModelBase::getServiceName - no form component service supported" );
     648             :     }
     649           0 :     return OUString();
     650             : }
     651             : 
     652           0 : void ControlModelBase::importProperty( sal_Int32 /*nPropId*/, const OUString& /*rValue*/ )
     653             : {
     654           0 : }
     655             : 
     656           0 : void ControlModelBase::importPictureData( sal_Int32 /*nPropId*/, BinaryInputStream& /*rInStrm*/ )
     657             : {
     658           0 : }
     659             : 
     660          12 : void ControlModelBase::convertProperties( PropertyMap& /*rPropMap*/, const ControlConverter& /*rConv*/ ) const
     661             : {
     662          12 : }
     663             : 
     664           0 : void ControlModelBase::convertFromProperties( PropertySet& /*rPropMap*/, const ControlConverter& /*rConv*/ )
     665             : {
     666           0 : }
     667             : 
     668           0 : void ControlModelBase::convertSize( PropertyMap& rPropMap, const ControlConverter& rConv ) const
     669             : {
     670           0 :     rConv.convertSize( rPropMap, maSize );
     671           0 : }
     672             : 
     673             : // ============================================================================
     674             : 
     675           0 : ComCtlModelBase::ComCtlModelBase( sal_uInt32 nDataPartId5, sal_uInt32 nDataPartId6,
     676             :         sal_uInt16 nVersion, bool bCommonPart, bool bComplexPart ) :
     677             :     maFontData( CREATE_OUSTRING( "Tahoma" ), 82500 ),
     678             :     mnFlags( 0 ),
     679             :     mnVersion( nVersion ),
     680             :     mnDataPartId5( nDataPartId5 ),
     681             :     mnDataPartId6( nDataPartId6 ),
     682             :     mbCommonPart( bCommonPart ),
     683           0 :     mbComplexPart( bComplexPart )
     684             : {
     685           0 : }
     686             : 
     687           0 : bool ComCtlModelBase::importBinaryModel( BinaryInputStream& rInStrm )
     688             : {
     689             :     // read initial size part and header of the control data part
     690           0 :     if( importSizePart( rInStrm ) && readPartHeader( rInStrm, getDataPartId(), mnVersion ) )
     691             :     {
     692             :         // if flags part exists, the first int32 of the data part contains its size
     693           0 :         sal_uInt32 nCommonPartSize = mbCommonPart ? rInStrm.readuInt32() : 0;
     694             :         // implementations must read the exact amount of data, stream must point to its end afterwards
     695           0 :         importControlData( rInStrm );
     696             :         // read following parts
     697           0 :         if( !rInStrm.isEof() &&
     698           0 :             (!mbCommonPart || importCommonPart( rInStrm, nCommonPartSize )) &&
     699           0 :             (!mbComplexPart || importComplexPart( rInStrm )) )
     700             :         {
     701           0 :             return !rInStrm.isEof();
     702             :         }
     703             :     }
     704           0 :     return false;
     705             : }
     706             : 
     707           0 : void ComCtlModelBase::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const
     708             : {
     709           0 :     if( mbCommonPart )
     710           0 :         rPropMap.setProperty( PROP_Enabled, getFlag( mnFlags, COMCTL_COMMON_ENABLED ) );
     711           0 :     ControlModelBase::convertProperties( rPropMap, rConv );
     712           0 : }
     713             : 
     714           0 : void ComCtlModelBase::importCommonExtraData( BinaryInputStream& /*rInStrm*/ )
     715             : {
     716           0 : }
     717             : 
     718           0 : void ComCtlModelBase::importCommonTrailingData( BinaryInputStream& /*rInStrm*/ )
     719             : {
     720           0 : }
     721             : 
     722           0 : sal_uInt32 ComCtlModelBase::getDataPartId() const
     723             : {
     724           0 :     switch( mnVersion )
     725             :     {
     726           0 :         case COMCTL_VERSION_50: return mnDataPartId5;
     727           0 :         case COMCTL_VERSION_60: return mnDataPartId6;
     728             :     }
     729             :     OSL_FAIL( "ComCtlObjectBase::getDataPartId - unxpected version" );
     730           0 :     return SAL_MAX_UINT32;
     731             : }
     732             : 
     733           0 : bool ComCtlModelBase::readPartHeader( BinaryInputStream& rInStrm, sal_uInt32 nExpPartId, sal_uInt16 nExpMajor, sal_uInt16 nExpMinor )
     734             : {
     735             :     // no idea if all this is correct...
     736             :     sal_uInt32 nPartId;
     737             :     sal_uInt16 nMajor, nMinor;
     738           0 :     rInStrm >> nPartId >> nMinor >> nMajor;
     739           0 :     bool bPartId = nPartId == nExpPartId;
     740             :     OSL_ENSURE( bPartId, "ComCtlObjectBase::readPartHeader - unexpected part identifier" );
     741           0 :     bool bVersion = ((nExpMajor == SAL_MAX_UINT16) || (nExpMajor == nMajor)) && ((nExpMinor == SAL_MAX_UINT16) || (nExpMinor == nMinor));
     742             :     OSL_ENSURE( bVersion, "ComCtlObjectBase::readPartHeader - unexpected part version" );
     743           0 :     return !rInStrm.isEof() && bPartId && bVersion;
     744             : }
     745             : 
     746           0 : bool ComCtlModelBase::importSizePart( BinaryInputStream& rInStrm )
     747             : {
     748           0 :     if( readPartHeader( rInStrm, COMCTL_ID_SIZE, 0, 8 ) )
     749             :     {
     750           0 :         rInStrm >> maSize.first >> maSize.second;
     751           0 :         return !rInStrm.isEof();
     752             :     }
     753           0 :     return false;
     754             : }
     755             : 
     756           0 : bool ComCtlModelBase::importCommonPart( BinaryInputStream& rInStrm, sal_uInt32 nPartSize )
     757             : {
     758           0 :     sal_Int64 nEndPos = rInStrm.tell() + nPartSize;
     759           0 :     if( (nPartSize >= 16) && readPartHeader( rInStrm, COMCTL_ID_COMMONDATA, 5, 0 ) )
     760             :     {
     761           0 :         rInStrm.skip( 4 );
     762           0 :         rInStrm >> mnFlags;
     763             :         // implementations may read less than the exact amount of data
     764           0 :         importCommonExtraData( rInStrm );
     765           0 :         rInStrm.seek( nEndPos );
     766             :         // implementations must read the exact amount of data, stream must point to its end afterwards
     767           0 :         importCommonTrailingData( rInStrm );
     768           0 :         return !rInStrm.isEof();
     769             :     }
     770           0 :     return false;
     771             : }
     772             : 
     773           0 : bool ComCtlModelBase::importComplexPart( BinaryInputStream& rInStrm )
     774             : {
     775           0 :     if( readPartHeader( rInStrm, COMCTL_ID_COMPLEXDATA, 5, 1 ) )
     776             :     {
     777             :         sal_uInt32 nContFlags;
     778           0 :         rInStrm >> nContFlags;
     779             :         bool bReadOk =
     780           0 :             (!getFlag( nContFlags, COMCTL_COMPLEX_FONT ) || OleHelper::importStdFont( maFontData, rInStrm, true )) &&
     781           0 :             (!getFlag( nContFlags, COMCTL_COMPLEX_MOUSEICON ) || OleHelper::importStdPic( maMouseIcon, rInStrm, true ));
     782           0 :         return bReadOk && !rInStrm.isEof();
     783             :     }
     784           0 :     return false;
     785             : }
     786             : 
     787             : // ============================================================================
     788             : 
     789           0 : ComCtlScrollBarModel::ComCtlScrollBarModel( sal_uInt16 nVersion ) :
     790             :     ComCtlModelBase( SAL_MAX_UINT32, COMCTL_ID_SCROLLBAR_60, nVersion, true, true ),
     791             :     mnScrollBarFlags( 0x00000011 ),
     792             :     mnLargeChange( 1 ),
     793             :     mnSmallChange( 1 ),
     794             :     mnMin( 0 ),
     795             :     mnMax( 32767 ),
     796           0 :     mnPosition( 0 )
     797             : {
     798           0 : }
     799             : 
     800           0 : ApiControlType ComCtlScrollBarModel::getControlType() const
     801             : {
     802           0 :     return API_CONTROL_SCROLLBAR;
     803             : }
     804             : 
     805           0 : void ComCtlScrollBarModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const
     806             : {
     807           0 :     rPropMap.setProperty( PROP_Border, API_BORDER_NONE );
     808           0 :     rConv.convertOrientation( rPropMap, getFlag( mnScrollBarFlags, COMCTL_SCROLLBAR_HOR ) );
     809           0 :     rConv.convertScrollBar( rPropMap, mnMin, mnMax, mnPosition, mnSmallChange, mnLargeChange, mbAwtModel );
     810           0 :     ComCtlModelBase::convertProperties( rPropMap, rConv );
     811           0 : }
     812             : 
     813           0 : void ComCtlScrollBarModel::importControlData( BinaryInputStream& rInStrm )
     814             : {
     815           0 :     rInStrm >> mnScrollBarFlags >> mnLargeChange >> mnSmallChange >> mnMin >> mnMax >> mnPosition;
     816           0 : }
     817             : 
     818             : // ============================================================================
     819             : 
     820           0 : ComCtlProgressBarModel::ComCtlProgressBarModel( sal_uInt16 nVersion ) :
     821             :     ComCtlModelBase( COMCTL_ID_PROGRESSBAR_50, COMCTL_ID_PROGRESSBAR_60, nVersion, true, true ),
     822             :     mfMin( 0.0 ),
     823             :     mfMax( 100.0 ),
     824             :     mnVertical( 0 ),
     825           0 :     mnSmooth( 0 )
     826             : {
     827           0 : }
     828             : 
     829           0 : ApiControlType ComCtlProgressBarModel::getControlType() const
     830             : {
     831           0 :     return API_CONTROL_PROGRESSBAR;
     832             : }
     833             : 
     834           0 : void ComCtlProgressBarModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const
     835             : {
     836           0 :     sal_uInt16 nBorder = getFlag( mnFlags, COMCTL_COMMON_3DBORDER ) ? API_BORDER_SUNKEN :
     837           0 :         (getFlag( mnFlags, COMCTL_COMMON_FLATBORDER ) ? API_BORDER_FLAT : API_BORDER_NONE);
     838           0 :     rPropMap.setProperty( PROP_Border, nBorder );
     839           0 :     rPropMap.setProperty( PROP_ProgressValueMin, getLimitedValue< sal_Int32, double >( ::std::min( mfMin, mfMax ), 0.0, SAL_MAX_INT32 ) );
     840           0 :     rPropMap.setProperty( PROP_ProgressValueMax, getLimitedValue< sal_Int32, double >( ::std::max( mfMin, mfMax ), 0.0, SAL_MAX_INT32 ) );
     841             :     // ComCtl model does not provide current value?
     842           0 :     ComCtlModelBase::convertProperties( rPropMap, rConv );
     843           0 : }
     844             : 
     845           0 : void ComCtlProgressBarModel::importControlData( BinaryInputStream& rInStrm )
     846             : {
     847           0 :     rInStrm >> mfMin >> mfMax;
     848           0 :     if( mnVersion == COMCTL_VERSION_60 )
     849           0 :         rInStrm >> mnVertical >> mnSmooth;
     850           0 : }
     851             : 
     852             : // ============================================================================
     853             : 
     854          14 : AxControlModelBase::AxControlModelBase()
     855             : {
     856          14 : }
     857             : 
     858           0 : void AxControlModelBase::importProperty( sal_Int32 nPropId, const OUString& rValue )
     859             : {
     860           0 :     switch( nPropId )
     861             :     {
     862             :         // size of the control shape: format is "width;height"
     863             :         case XML_Size:
     864             :         {
     865           0 :             sal_Int32 nSepPos = rValue.indexOf( ';' );
     866             :             OSL_ENSURE( nSepPos >= 0, "AxControlModelBase::importProperty - missing separator in 'Size' property" );
     867           0 :             if( nSepPos >= 0 )
     868             :             {
     869           0 :                 maSize.first = rValue.copy( 0, nSepPos ).toInt32();
     870           0 :                 maSize.second = rValue.copy( nSepPos + 1 ).toInt32();
     871             :             }
     872             :         }
     873           0 :         break;
     874             :     }
     875           0 : }
     876             : 
     877             : // ============================================================================
     878             : 
     879          14 : AxFontDataModel::AxFontDataModel( bool bSupportsAlign ) :
     880          14 :     mbSupportsAlign( bSupportsAlign )
     881             : {
     882          14 : }
     883             : 
     884           0 : void AxFontDataModel::importProperty( sal_Int32 nPropId, const OUString& rValue )
     885             : {
     886           0 :     switch( nPropId )
     887             :     {
     888           0 :         case XML_FontName:          maFontData.maFontName = rValue;                                             break;
     889           0 :         case XML_FontEffects:       maFontData.mnFontEffects = AttributeConversion::decodeUnsigned( rValue );   break;
     890           0 :         case XML_FontHeight:        maFontData.mnFontHeight = AttributeConversion::decodeInteger( rValue );     break;
     891           0 :         case XML_FontCharSet:       maFontData.mnFontCharSet = AttributeConversion::decodeInteger( rValue );    break;
     892           0 :         case XML_ParagraphAlign:    maFontData.mnHorAlign = AttributeConversion::decodeInteger( rValue );       break;
     893           0 :         default:                    AxControlModelBase::importProperty( nPropId, rValue );
     894             :     }
     895           0 : }
     896             : 
     897          10 : bool AxFontDataModel::importBinaryModel( BinaryInputStream& rInStrm )
     898             : {
     899          10 :     return maFontData.importBinaryModel( rInStrm );
     900             : }
     901             : 
     902           2 : void AxFontDataModel::exportBinaryModel( BinaryOutputStream& rOutStrm )
     903             : {
     904           2 :     maFontData.exportBinaryModel( rOutStrm );
     905           2 : }
     906          12 : void AxFontDataModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const
     907             : {
     908             :     // font name
     909          12 :     if( !maFontData.maFontName.isEmpty() )
     910           6 :         rPropMap.setProperty( PROP_FontName, maFontData.maFontName );
     911             : 
     912             :     // font effects
     913          12 :     rPropMap.setProperty( PROP_FontWeight, getFlagValue( maFontData.mnFontEffects, AX_FONTDATA_BOLD, awt::FontWeight::BOLD, awt::FontWeight::NORMAL ) );
     914          12 :     rPropMap.setProperty( PROP_FontSlant, getFlagValue< sal_Int16 >( maFontData.mnFontEffects, AX_FONTDATA_ITALIC, FontSlant_ITALIC, FontSlant_NONE ) );
     915          12 :     rPropMap.setProperty( PROP_FontUnderline, getFlagValue( maFontData.mnFontEffects, AX_FONTDATA_UNDERLINE, maFontData.mbDblUnderline ? awt::FontUnderline::DOUBLE : awt::FontUnderline::SINGLE, awt::FontUnderline::NONE ) );
     916          12 :     rPropMap.setProperty( PROP_FontStrikeout, getFlagValue( maFontData.mnFontEffects, AX_FONTDATA_STRIKEOUT, awt::FontStrikeout::SINGLE, awt::FontStrikeout::NONE ) );
     917          12 :     rPropMap.setProperty( PROP_FontHeight, maFontData.getHeightPoints() );
     918             : 
     919             :     // font character set
     920          12 :     rtl_TextEncoding eFontEnc = RTL_TEXTENCODING_DONTKNOW;
     921          12 :     if( (0 <= maFontData.mnFontCharSet) && (maFontData.mnFontCharSet <= SAL_MAX_UINT8) )
     922          12 :         eFontEnc = rtl_getTextEncodingFromWindowsCharset( static_cast< sal_uInt8 >( maFontData.mnFontCharSet ) );
     923          12 :     if( eFontEnc != RTL_TEXTENCODING_DONTKNOW )
     924           8 :         rPropMap.setProperty( PROP_FontCharset, static_cast< sal_Int16 >( eFontEnc ) );
     925             : 
     926             :     // text alignment
     927          12 :     if( mbSupportsAlign )
     928             :     {
     929          12 :         sal_Int32 nAlign = awt::TextAlign::LEFT;
     930          12 :         switch( maFontData.mnHorAlign )
     931             :         {
     932           4 :             case AX_FONTDATA_LEFT:      nAlign = awt::TextAlign::LEFT;   break;
     933           0 :             case AX_FONTDATA_RIGHT:     nAlign = awt::TextAlign::RIGHT;  break;
     934           8 :             case AX_FONTDATA_CENTER:    nAlign = awt::TextAlign::CENTER; break;
     935             :             default:    OSL_FAIL( "AxFontDataModel::convertProperties - unknown text alignment" );
     936             :         }
     937             :         // form controls expect short value
     938          12 :         rPropMap.setProperty( PROP_Align, static_cast< sal_Int16 >( nAlign ) );
     939             :     }
     940             : 
     941             :     // process base class properties
     942          12 :     AxControlModelBase::convertProperties( rPropMap, rConv );
     943          12 : }
     944             : 
     945           2 : void AxFontDataModel::convertFromProperties( PropertySet& rPropSet, const ControlConverter& /*rConv */)
     946             : {
     947           2 :     rPropSet.getProperty( maFontData.maFontName, PROP_FontName );
     948           2 :     float fontWeight = (float)0;
     949           2 :     if ( rPropSet.getProperty(fontWeight, PROP_FontWeight ) )
     950           2 :         setFlag( maFontData.mnFontEffects, AX_FONTDATA_BOLD, ( fontWeight == awt::FontWeight::BOLD ) );
     951           2 :     sal_Int16 nSlant = FontSlant_NONE;
     952           2 :     if ( rPropSet.getProperty( nSlant, PROP_FontSlant ) )
     953           0 :         setFlag( maFontData.mnFontEffects, AX_FONTDATA_ITALIC, ( nSlant == FontSlant_ITALIC ) );
     954             : 
     955           2 :     sal_Int16 nUnderLine = awt::FontUnderline::NONE;
     956           2 :     if ( rPropSet.getProperty( nUnderLine, PROP_FontUnderline ) )
     957           2 :         setFlag( maFontData.mnFontEffects, AX_FONTDATA_UNDERLINE, nUnderLine != awt::FontUnderline::NONE );
     958           2 :     sal_Int16 nStrikeout = awt::FontStrikeout::NONE ;
     959           2 :     if ( rPropSet.getProperty( nStrikeout, PROP_FontStrikeout ) )
     960           2 :         setFlag( maFontData.mnFontEffects, AX_FONTDATA_STRIKEOUT, nStrikeout != awt::FontStrikeout::NONE );
     961             : 
     962           2 :     float fontHeight = 0.0;
     963           2 :     if ( rPropSet.getProperty( fontHeight, PROP_FontHeight ) )
     964           2 :         maFontData.setHeightPoints( static_cast< sal_Int16 >( fontHeight ) );
     965             : 
     966             :     // TODO - handle textencoding
     967           2 :     sal_Int16 nAlign = 0;
     968           2 :     if ( rPropSet.getProperty( nAlign, PROP_Align ) )
     969             :     {
     970           2 :         switch ( nAlign )
     971             :         {
     972           2 :             case awt::TextAlign::LEFT: maFontData.mnHorAlign = AX_FONTDATA_LEFT;   break;
     973           0 :             case awt::TextAlign::RIGHT: maFontData.mnHorAlign = AX_FONTDATA_RIGHT;  break;
     974           0 :             case awt::TextAlign::CENTER: maFontData.mnHorAlign = AX_FONTDATA_CENTER; break;
     975             :             default:    OSL_FAIL( "AxFontDataModel::convertFromProperties - unknown text alignment" );
     976             :         }
     977             :     }
     978           2 : }
     979             : 
     980             : // ============================================================================
     981             : 
     982           8 : AxCommandButtonModel::AxCommandButtonModel() :
     983             :     mnTextColor( AX_SYSCOLOR_BUTTONTEXT ),
     984             :     mnBackColor( AX_SYSCOLOR_BUTTONFACE ),
     985             :     mnFlags( AX_CMDBUTTON_DEFFLAGS ),
     986             :     mnPicturePos( AX_PICPOS_ABOVECENTER ),
     987             :     mnVerticalAlign( XML_Center ),
     988           8 :     mbFocusOnClick( true )
     989             : {
     990           8 : }
     991             : 
     992           0 : void AxCommandButtonModel::importProperty( sal_Int32 nPropId, const OUString& rValue )
     993             : {
     994           0 :     switch( nPropId )
     995             :     {
     996           0 :         case XML_Caption:               maCaption = rValue;                                                 break;
     997           0 :         case XML_ForeColor:             mnTextColor = AttributeConversion::decodeUnsigned( rValue );        break;
     998           0 :         case XML_BackColor:             mnBackColor = AttributeConversion::decodeUnsigned( rValue );        break;
     999           0 :         case XML_VariousPropertyBits:   mnFlags = AttributeConversion::decodeUnsigned( rValue );            break;
    1000           0 :         case XML_PicturePosition:       mnPicturePos = AttributeConversion::decodeUnsigned( rValue );       break;
    1001           0 :         case XML_TakeFocusOnClick:      mbFocusOnClick = AttributeConversion::decodeInteger( rValue ) != 0; break;
    1002           0 :         default:                        AxFontDataModel::importProperty( nPropId, rValue );
    1003             :     }
    1004           0 : }
    1005             : 
    1006           0 : void AxCommandButtonModel::importPictureData( sal_Int32 nPropId, BinaryInputStream& rInStrm )
    1007             : {
    1008           0 :     switch( nPropId )
    1009             :     {
    1010           0 :         case XML_Picture:   OleHelper::importStdPic( maPictureData, rInStrm, true );    break;
    1011           0 :         default:            AxFontDataModel::importPictureData( nPropId, rInStrm );
    1012             :     }
    1013           0 : }
    1014             : 
    1015           8 : bool AxCommandButtonModel::importBinaryModel( BinaryInputStream& rInStrm )
    1016             : {
    1017           8 :     AxBinaryPropertyReader aReader( rInStrm );
    1018           8 :     aReader.readIntProperty< sal_uInt32 >( mnTextColor );
    1019           8 :     aReader.readIntProperty< sal_uInt32 >( mnBackColor );
    1020           8 :     aReader.readIntProperty< sal_uInt32 >( mnFlags );
    1021           8 :     aReader.readStringProperty( maCaption );
    1022           8 :     aReader.readIntProperty< sal_uInt32 >( mnPicturePos );
    1023           8 :     aReader.readPairProperty( maSize );
    1024           8 :     aReader.skipIntProperty< sal_uInt8 >(); // mouse pointer
    1025           8 :     aReader.readPictureProperty( maPictureData );
    1026           8 :     aReader.skipIntProperty< sal_uInt16 >(); // accelerator
    1027           8 :     aReader.readBoolProperty( mbFocusOnClick, true ); // binary flag means "do not take focus"
    1028           8 :     aReader.skipPictureProperty(); // mouse icon
    1029           8 :     return aReader.finalizeImport() && AxFontDataModel::importBinaryModel( rInStrm );
    1030             : }
    1031             : 
    1032             : 
    1033           0 : void AxCommandButtonModel::exportBinaryModel( BinaryOutputStream& rOutStrm )
    1034             : {
    1035           0 :     AxBinaryPropertyWriter aWriter( rOutStrm );
    1036           0 :     aWriter.writeIntProperty< sal_uInt32 >( mnTextColor );
    1037           0 :     aWriter.writeIntProperty< sal_uInt32 >( mnBackColor );
    1038           0 :     aWriter.writeIntProperty< sal_uInt32 >( mnFlags );
    1039           0 :     aWriter.writeStringProperty( maCaption );
    1040           0 :     aWriter.skipProperty(); // pict pos
    1041           0 :     aWriter.writePairProperty( maSize );
    1042           0 :     aWriter.skipProperty(); // mouse pointer
    1043           0 :     aWriter.skipProperty(); // picture data
    1044           0 :     aWriter.skipProperty(); // accelerator
    1045           0 :     aWriter.writeBoolProperty( mbFocusOnClick ); // binary flag means "do not take focus"
    1046           0 :     aWriter.skipProperty(); // mouse icon
    1047           0 :     aWriter.finalizeExport();
    1048           0 :     AxFontDataModel::exportBinaryModel( rOutStrm );
    1049           0 : }
    1050             : 
    1051           0 : void AxCommandButtonModel::exportCompObj( BinaryOutputStream& rOutStream )
    1052             : {
    1053             :     // should be able to replace this hardcoded foo with
    1054             :     // proper export info from MS-OLEDS spec.
    1055             :     static sal_uInt8 const aCompObj[] = {
    1056             :         0x01, 0x00, 0xFE, 0xFF, 0x03, 0x0A, 0x00, 0x00,
    1057             :         0xFF, 0xFF, 0xFF, 0xFF, 0x40, 0x32, 0x05, 0xD7,
    1058             :         0x69, 0xCE, 0xCD, 0x11, 0xA7, 0x77, 0x00, 0xDD,
    1059             :         0x01, 0x14, 0x3C, 0x57, 0x22, 0x00, 0x00, 0x00,
    1060             :         0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66,
    1061             :         0x74, 0x20, 0x46, 0x6F, 0x72, 0x6d, 0x73, 0x20,
    1062             :         0x32, 0x2e, 0x30, 0x20, 0x43, 0x6F, 0x6D, 0x6D,
    1063             :         0x61, 0x6E, 0x64, 0x42, 0x75, 0x74, 0x74, 0x6F,
    1064             :         0x6E, 0x00, 0x10, 0x00, 0x00, 0x00, 0x45, 0x6D,
    1065             :         0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x20, 0x4F,
    1066             :         0x62, 0x6A, 0x65, 0x63, 0x74, 0x00, 0x16, 0x00,
    1067             :         0x00, 0x00, 0x46, 0x6F, 0x72, 0x6D, 0x73, 0x2E,
    1068             :         0x43, 0x6F, 0x6D, 0x6D, 0x61, 0x6E, 0x64, 0x42,
    1069             :         0x75, 0x74, 0x74, 0x6F, 0x6E, 0x2E, 0x31, 0x00,
    1070             :         0xF4, 0x39, 0xB2, 0x71, 0x00, 0x00, 0x00, 0x00,
    1071             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
    1072             :     };
    1073           0 :     rOutStream.writeMemory( aCompObj, sizeof( aCompObj ) );
    1074           0 : }
    1075             : 
    1076           8 : ApiControlType AxCommandButtonModel::getControlType() const
    1077             : {
    1078           8 :     return API_CONTROL_BUTTON;
    1079             : }
    1080             : 
    1081           8 : void AxCommandButtonModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const
    1082             : {
    1083           8 :     rPropMap.setProperty( PROP_Label, maCaption );
    1084           8 :     rPropMap.setProperty( PROP_Enabled, getFlag( mnFlags, AX_FLAGS_ENABLED ) );
    1085           8 :     rPropMap.setProperty( PROP_MultiLine, getFlag( mnFlags, AX_FLAGS_WORDWRAP ) );
    1086           8 :     rPropMap.setProperty( PROP_FocusOnClick, mbFocusOnClick );
    1087           8 :     rConv.convertColor( rPropMap, PROP_TextColor, mnTextColor );
    1088           8 :     rConv.convertVerticalAlign( rPropMap, mnVerticalAlign );
    1089           8 :     rConv.convertAxBackground( rPropMap, mnBackColor, mnFlags, API_TRANSPARENCY_NOTSUPPORTED );
    1090           8 :     rConv.convertAxPicture( rPropMap, maPictureData, mnPicturePos );
    1091           8 :     AxFontDataModel::convertProperties( rPropMap, rConv );
    1092           8 : }
    1093             : 
    1094           0 : void AxCommandButtonModel::convertFromProperties( PropertySet& rPropSet, const ControlConverter& rConv )
    1095             : {
    1096           0 :     rPropSet.getProperty( maCaption, PROP_Label );
    1097           0 :     bool bRes = false;
    1098           0 :     if ( rPropSet.getProperty( bRes, PROP_Enabled ) )
    1099           0 :         setFlag( mnFlags, AX_FLAGS_ENABLED, bRes );
    1100           0 :     if ( rPropSet.getProperty( bRes,  PROP_MultiLine ) )
    1101           0 :         setFlag( mnFlags, AX_FLAGS_WORDWRAP, bRes );
    1102           0 :     rPropSet.getProperty( mbFocusOnClick, PROP_FocusOnClick );
    1103             : 
    1104           0 :     rConv.convertToMSColor( rPropSet, PROP_TextColor, mnTextColor );
    1105           0 :     rConv.convertToMSColor( rPropSet, PROP_BackgroundColor, mnBackColor );
    1106             : 
    1107           0 :     AxFontDataModel::convertFromProperties( rPropSet, rConv );
    1108           0 : }
    1109             : // ============================================================================
    1110             : 
    1111           0 : AxLabelModel::AxLabelModel() :
    1112             :     mnTextColor( AX_SYSCOLOR_BUTTONTEXT ),
    1113             :     mnBackColor( AX_SYSCOLOR_BUTTONFACE ),
    1114             :     mnFlags( AX_LABEL_DEFFLAGS ),
    1115             :     mnBorderColor( AX_SYSCOLOR_WINDOWFRAME ),
    1116             :     mnBorderStyle( AX_BORDERSTYLE_NONE ),
    1117             :     mnSpecialEffect( AX_SPECIALEFFECT_FLAT ),
    1118           0 :     mnVerticalAlign( XML_Top )
    1119             : {
    1120           0 : }
    1121             : 
    1122           0 : void AxLabelModel::importProperty( sal_Int32 nPropId, const OUString& rValue )
    1123             : {
    1124           0 :     switch( nPropId )
    1125             :     {
    1126           0 :         case XML_Caption:               maCaption = rValue;                                             break;
    1127           0 :         case XML_ForeColor:             mnTextColor = AttributeConversion::decodeUnsigned( rValue );    break;
    1128           0 :         case XML_BackColor:             mnBackColor = AttributeConversion::decodeUnsigned( rValue );    break;
    1129           0 :         case XML_VariousPropertyBits:   mnFlags = AttributeConversion::decodeUnsigned( rValue );        break;
    1130           0 :         case XML_BorderColor:           mnBorderColor = AttributeConversion::decodeUnsigned( rValue );  break;
    1131           0 :         case XML_BorderStyle:           mnBorderStyle = AttributeConversion::decodeInteger( rValue );   break;
    1132           0 :         case XML_SpecialEffect:         mnSpecialEffect = AttributeConversion::decodeInteger( rValue ); break;
    1133           0 :         default:                        AxFontDataModel::importProperty( nPropId, rValue );
    1134             :     }
    1135           0 : }
    1136             : 
    1137           0 : bool AxLabelModel::importBinaryModel( BinaryInputStream& rInStrm )
    1138             : {
    1139           0 :     AxBinaryPropertyReader aReader( rInStrm );
    1140           0 :     aReader.readIntProperty< sal_uInt32 >( mnTextColor );
    1141           0 :     aReader.readIntProperty< sal_uInt32 >( mnBackColor );
    1142           0 :     aReader.readIntProperty< sal_uInt32 >( mnFlags );
    1143           0 :     aReader.readStringProperty( maCaption );
    1144           0 :     aReader.skipIntProperty< sal_uInt32 >(); // picture position
    1145           0 :     aReader.readPairProperty( maSize );
    1146           0 :     aReader.skipIntProperty< sal_uInt8 >(); // mouse pointer
    1147           0 :     aReader.readIntProperty< sal_uInt32 >( mnBorderColor );
    1148           0 :     aReader.readIntProperty< sal_uInt16 >( mnBorderStyle );
    1149           0 :     aReader.readIntProperty< sal_uInt16 >( mnSpecialEffect );
    1150           0 :     aReader.skipPictureProperty(); // picture
    1151           0 :     aReader.skipIntProperty< sal_uInt16 >(); // accelerator
    1152           0 :     aReader.skipPictureProperty(); // mouse icon
    1153           0 :     return aReader.finalizeImport() && AxFontDataModel::importBinaryModel( rInStrm );
    1154             : }
    1155             : 
    1156           0 : void AxLabelModel::exportBinaryModel( BinaryOutputStream& rOutStrm )
    1157             : {
    1158           0 :     AxBinaryPropertyWriter aWriter( rOutStrm );
    1159           0 :     aWriter.writeIntProperty< sal_uInt32 >( mnTextColor );
    1160           0 :     aWriter.writeIntProperty< sal_uInt32 >( mnBackColor );
    1161           0 :     aWriter.writeIntProperty< sal_uInt32 >( mnFlags );
    1162           0 :     aWriter.writeStringProperty( maCaption );
    1163           0 :     aWriter.skipProperty(); // picture position
    1164           0 :     aWriter.writePairProperty( maSize );
    1165           0 :     aWriter.skipProperty(); // mouse pointer
    1166           0 :     aWriter.writeIntProperty< sal_uInt32 >( mnBorderColor );
    1167           0 :     aWriter.writeIntProperty< sal_uInt16 >( mnBorderStyle );
    1168           0 :     aWriter.writeIntProperty< sal_uInt16 >( mnSpecialEffect );
    1169           0 :     aWriter.skipProperty(); // picture
    1170           0 :     aWriter.skipProperty(); // accelerator
    1171           0 :     aWriter.skipProperty(); // mouse icon
    1172           0 :     aWriter.finalizeExport();
    1173           0 :     AxFontDataModel::exportBinaryModel( rOutStrm );
    1174           0 : }
    1175             : 
    1176           0 : void AxLabelModel::convertFromProperties( PropertySet& rPropSet, const ControlConverter& rConv )
    1177             : {
    1178           0 :     rPropSet.getProperty( maCaption, PROP_Label );
    1179           0 :     bool bRes = false;
    1180           0 :     if ( rPropSet.getProperty( bRes, PROP_Enabled ) )
    1181           0 :         setFlag( mnFlags, AX_FLAGS_ENABLED, bRes );
    1182           0 :     if ( rPropSet.getProperty( bRes,  PROP_MultiLine ) )
    1183           0 :         setFlag( mnFlags, AX_FLAGS_WORDWRAP, bRes );
    1184             : 
    1185           0 :     rConv.convertToMSColor( rPropSet, PROP_TextColor, mnTextColor );
    1186             :     // VerticleAlign doesn't seem to be read from binary
    1187             : 
    1188             :     // not sure about background color, how do we decide when to set
    1189             :     // AX_FLAGS_OPAQUE ?
    1190           0 :     rConv.convertToMSColor( rPropSet, PROP_BackgroundColor, mnBackColor  );
    1191           0 :     rConv.convertToAxBorder( rPropSet, mnBorderColor, mnBorderStyle, mnSpecialEffect );
    1192             : 
    1193           0 :     AxFontDataModel::convertFromProperties( rPropSet, rConv );
    1194           0 : }
    1195             : 
    1196           0 : void AxLabelModel::exportCompObj( BinaryOutputStream& rOutStream )
    1197             : {
    1198             :     // should be able to replace this hardcoded foo with
    1199             :     // proper export info from MS-OLEDS spec.
    1200             :     static sal_uInt8 const aCompObj[] = {
    1201             :         0x01, 0x00, 0xFE, 0xFF, 0x03, 0x0A, 0x00, 0x00,
    1202             :         0xFF, 0xFF, 0xFF, 0xFF, 0x23, 0x9E, 0x8C, 0x97,
    1203             :         0xB0, 0xD4, 0xCE, 0x11, 0xBF, 0x2D, 0x00, 0xAA,
    1204             :         0x00, 0x3F, 0x40, 0xD0, 0x1A, 0x00, 0x00, 0x00,
    1205             :         0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66,
    1206             :         0x74, 0x20, 0x46, 0x6F, 0x72, 0x6D, 0x73, 0x20,
    1207             :         0x32, 0x2E, 0x30, 0x20, 0x4C, 0x61, 0x62, 0x65,
    1208             :         0x6C, 0x00, 0x10, 0x00, 0x00, 0x00, 0x45, 0x6D,
    1209             :         0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x20, 0x4F,
    1210             :         0x62, 0x6A, 0x65, 0x63, 0x74, 0x00, 0x0E, 0x00,
    1211             :         0x00, 0x00, 0x46, 0x6F, 0x72, 0x6D, 0x73, 0x2E,
    1212             :         0x4C, 0x61, 0x62, 0x65, 0x6C, 0x2E, 0x31, 0x00,
    1213             :         0xF4, 0x39, 0xB2, 0x71, 0x00, 0x00, 0x00, 0x00,
    1214             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
    1215             :     };
    1216           0 :     rOutStream.writeMemory( aCompObj, sizeof( aCompObj ) );
    1217           0 : }
    1218             : 
    1219           0 : ApiControlType AxLabelModel::getControlType() const
    1220             : {
    1221           0 :     return API_CONTROL_FIXEDTEXT;
    1222             : }
    1223             : 
    1224           0 : void AxLabelModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const
    1225             : {
    1226           0 :     rPropMap.setProperty( PROP_Label, maCaption );
    1227           0 :     rPropMap.setProperty( PROP_Enabled, getFlag( mnFlags, AX_FLAGS_ENABLED ) );
    1228           0 :     rPropMap.setProperty( PROP_MultiLine, getFlag( mnFlags, AX_FLAGS_WORDWRAP ) );
    1229           0 :     rConv.convertColor( rPropMap, PROP_TextColor, mnTextColor );
    1230           0 :     rConv.convertVerticalAlign( rPropMap, mnVerticalAlign );
    1231           0 :     rConv.convertAxBackground( rPropMap, mnBackColor, mnFlags, API_TRANSPARENCY_VOID );
    1232           0 :     rConv.convertAxBorder( rPropMap, mnBorderColor, mnBorderStyle, mnSpecialEffect );
    1233           0 :     AxFontDataModel::convertProperties( rPropMap, rConv );
    1234           0 : }
    1235             : 
    1236             : // ============================================================================
    1237             : 
    1238           0 : AxImageModel::AxImageModel() :
    1239             :     mnBackColor( AX_SYSCOLOR_BUTTONFACE ),
    1240             :     mnFlags( AX_IMAGE_DEFFLAGS ),
    1241             :     mnBorderColor( AX_SYSCOLOR_WINDOWFRAME ),
    1242             :     mnBorderStyle( AX_BORDERSTYLE_SINGLE ),
    1243             :     mnSpecialEffect( AX_SPECIALEFFECT_FLAT ),
    1244             :     mnPicSizeMode( AX_PICSIZE_CLIP ),
    1245             :     mnPicAlign( AX_PICALIGN_CENTER ),
    1246           0 :     mbPicTiling( false )
    1247             : {
    1248           0 : }
    1249             : 
    1250           0 : void AxImageModel::importProperty( sal_Int32 nPropId, const OUString& rValue )
    1251             : {
    1252           0 :     switch( nPropId )
    1253             :     {
    1254           0 :         case XML_BackColor:             mnBackColor = AttributeConversion::decodeUnsigned( rValue );      break;
    1255           0 :         case XML_VariousPropertyBits:   mnFlags = AttributeConversion::decodeUnsigned( rValue );          break;
    1256           0 :         case XML_BorderColor:           mnBorderColor = AttributeConversion::decodeUnsigned( rValue );    break;
    1257           0 :         case XML_BorderStyle:           mnBorderStyle = AttributeConversion::decodeInteger( rValue );     break;
    1258           0 :         case XML_SpecialEffect:         mnSpecialEffect = AttributeConversion::decodeInteger( rValue );   break;
    1259           0 :         case XML_SizeMode:              mnPicSizeMode = AttributeConversion::decodeInteger( rValue );     break;
    1260           0 :         case XML_PictureAlignment:      mnPicAlign = AttributeConversion::decodeInteger( rValue );        break;
    1261           0 :         case XML_PictureTiling:         mbPicTiling = AttributeConversion::decodeInteger( rValue ) != 0;  break;
    1262           0 :         default:                        AxControlModelBase::importProperty( nPropId, rValue );
    1263             :     }
    1264           0 : }
    1265             : 
    1266           0 : void AxImageModel::importPictureData( sal_Int32 nPropId, BinaryInputStream& rInStrm )
    1267             : {
    1268           0 :     switch( nPropId )
    1269             :     {
    1270           0 :         case XML_Picture:   OleHelper::importStdPic( maPictureData, rInStrm, true );    break;
    1271           0 :         default:            AxControlModelBase::importPictureData( nPropId, rInStrm );
    1272             :     }
    1273           0 : }
    1274             : 
    1275           0 : bool AxImageModel::importBinaryModel( BinaryInputStream& rInStrm )
    1276             : {
    1277           0 :     AxBinaryPropertyReader aReader( rInStrm );
    1278           0 :     aReader.skipUndefinedProperty();
    1279           0 :     aReader.skipUndefinedProperty();
    1280           0 :     aReader.skipBoolProperty(); // auto-size
    1281           0 :     aReader.readIntProperty< sal_uInt32 >( mnBorderColor );
    1282           0 :     aReader.readIntProperty< sal_uInt32 >( mnBackColor );
    1283           0 :     aReader.readIntProperty< sal_uInt8 >( mnBorderStyle );
    1284           0 :     aReader.skipIntProperty< sal_uInt8 >(); // mouse pointer
    1285           0 :     aReader.readIntProperty< sal_uInt8 >( mnPicSizeMode );
    1286           0 :     aReader.readIntProperty< sal_uInt8 >( mnSpecialEffect );
    1287           0 :     aReader.readPairProperty( maSize );
    1288           0 :     aReader.readPictureProperty( maPictureData );
    1289           0 :     aReader.readIntProperty< sal_uInt8 >( mnPicAlign );
    1290           0 :     aReader.readBoolProperty( mbPicTiling );
    1291           0 :     aReader.readIntProperty< sal_uInt32 >( mnFlags );
    1292           0 :     aReader.skipPictureProperty(); // mouse icon
    1293           0 :     return aReader.finalizeImport();
    1294             : }
    1295             : 
    1296           0 : void AxImageModel::exportBinaryModel( BinaryOutputStream& rOutStrm )
    1297             : {
    1298           0 :     AxBinaryPropertyWriter aWriter( rOutStrm );
    1299           0 :     aWriter.skipProperty(); //undefined
    1300           0 :     aWriter.skipProperty(); //undefined
    1301           0 :     aWriter.skipProperty(); //auto-size
    1302           0 :     aWriter.writeIntProperty< sal_uInt32 >( mnBorderColor );
    1303           0 :     aWriter.writeIntProperty< sal_uInt32 >( mnBackColor );
    1304           0 :     aWriter.writeIntProperty< sal_uInt8 >( mnBorderStyle );
    1305           0 :     aWriter.skipProperty(); // mouse pointer
    1306           0 :     aWriter.writeIntProperty< sal_uInt8 >( mnPicSizeMode );
    1307           0 :     aWriter.writeIntProperty< sal_uInt8 >( mnSpecialEffect );
    1308           0 :     aWriter.writePairProperty( maSize );
    1309           0 :     aWriter.skipProperty(); //maPictureData );
    1310           0 :     aWriter.writeIntProperty< sal_uInt8 >( mnPicAlign );
    1311           0 :     aWriter.writeBoolProperty( mbPicTiling );
    1312           0 :     aWriter.writeIntProperty< sal_uInt32 >( mnFlags );
    1313           0 :     aWriter.skipProperty(); // mouse icon
    1314           0 :     aWriter.finalizeExport();
    1315           0 : }
    1316             : 
    1317           0 : void AxImageModel::exportCompObj( BinaryOutputStream& rOutStream )
    1318             : {
    1319             :     // should be able to replace this hardcoded foo with
    1320             :     // proper export info from MS-OLEDS spec.
    1321             :     static sal_uInt8 const aCompObj[] = {
    1322             :         0x01, 0x00, 0xFE, 0xFF, 0x03, 0x0A, 0x00, 0x00,
    1323             :         0xFF, 0xFF, 0xFF, 0xFF, 0x41, 0x92, 0x59, 0x4C,
    1324             :         0x26, 0x69, 0x1B, 0x10, 0x99, 0x92, 0x00, 0x00,
    1325             :         0x0B, 0x65, 0xC6, 0xF9, 0x1A, 0x00, 0x00, 0x00,
    1326             :         0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66,
    1327             :         0x74, 0x20, 0x46, 0x6F, 0x72, 0x6D, 0x73, 0x20,
    1328             :         0x32, 0x2E, 0x30, 0x20, 0x49, 0x6D, 0x61, 0x67,
    1329             :         0x65, 0x00, 0x10, 0x00, 0x00, 0x00, 0x45, 0x6D,
    1330             :         0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x20, 0x4F,
    1331             :         0x62, 0x6A, 0x65, 0x63, 0x74, 0x00, 0x0E, 0x00,
    1332             :         0x00, 0x00, 0x46, 0x6F, 0x72, 0x6D, 0x73, 0x2E,
    1333             :         0x49, 0x6D, 0x61, 0x67, 0x65, 0x2E, 0x31, 0x00,
    1334             :         0xF4, 0x39, 0xB2, 0x71, 0x00, 0x00, 0x00, 0x00,
    1335             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
    1336             :     };
    1337           0 :     rOutStream.writeMemory( aCompObj, sizeof( aCompObj ) );
    1338           0 : }
    1339             : 
    1340           0 : ApiControlType AxImageModel::getControlType() const
    1341             : {
    1342           0 :     return API_CONTROL_IMAGE;
    1343             : }
    1344             : 
    1345           0 : void AxImageModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const
    1346             : {
    1347           0 :     rPropMap.setProperty( PROP_Enabled, getFlag( mnFlags, AX_FLAGS_ENABLED ) );
    1348           0 :     rConv.convertAxBackground( rPropMap, mnBackColor, mnFlags, API_TRANSPARENCY_VOID );
    1349           0 :     rConv.convertAxBorder( rPropMap, mnBorderColor, mnBorderStyle, mnSpecialEffect );
    1350           0 :     rConv.convertAxPicture( rPropMap, maPictureData, mnPicSizeMode, mnPicAlign, mbPicTiling );
    1351           0 :     AxControlModelBase::convertProperties( rPropMap, rConv );
    1352           0 : }
    1353             : 
    1354             : // ============================================================================
    1355             : 
    1356           6 : AxMorphDataModelBase::AxMorphDataModelBase() :
    1357             :     mnTextColor( AX_SYSCOLOR_WINDOWTEXT ),
    1358             :     mnBackColor( AX_SYSCOLOR_WINDOWBACK ),
    1359             :     mnFlags( AX_MORPHDATA_DEFFLAGS ),
    1360             :     mnPicturePos( AX_PICPOS_ABOVECENTER ),
    1361             :     mnBorderColor( AX_SYSCOLOR_WINDOWFRAME ),
    1362             :     mnBorderStyle( AX_BORDERSTYLE_NONE ),
    1363             :     mnSpecialEffect( AX_SPECIALEFFECT_SUNKEN ),
    1364             :     mnDisplayStyle( AX_DISPLAYSTYLE_TEXT ),
    1365             :     mnMultiSelect( AX_SELCTION_SINGLE ),
    1366             :     mnScrollBars( AX_SCROLLBAR_NONE ),
    1367             :     mnMatchEntry( AX_MATCHENTRY_NONE ),
    1368             :     mnShowDropButton( AX_SHOWDROPBUTTON_NEVER ),
    1369             :     mnMaxLength( 0 ),
    1370             :     mnPasswordChar( 0 ),
    1371             :     mnListRows( 8 ),
    1372           6 :     mnVerticalAlign( XML_Center )
    1373             : {
    1374           6 : }
    1375             : 
    1376           0 : void AxMorphDataModelBase::importProperty( sal_Int32 nPropId, const OUString& rValue )
    1377             : {
    1378           0 :     switch( nPropId )
    1379             :     {
    1380           0 :         case XML_Caption:               maCaption = rValue;                                             break;
    1381           0 :         case XML_Value:                 maValue = rValue;                                               break;
    1382           0 :         case XML_GroupName:             maGroupName = rValue;                                           break;
    1383           0 :         case XML_ForeColor:             mnTextColor = AttributeConversion::decodeUnsigned( rValue );    break;
    1384           0 :         case XML_BackColor:             mnBackColor = AttributeConversion::decodeUnsigned( rValue );    break;
    1385           0 :         case XML_VariousPropertyBits:   mnFlags = AttributeConversion::decodeUnsigned( rValue );        break;
    1386           0 :         case XML_PicturePosition:       mnPicturePos = AttributeConversion::decodeUnsigned( rValue );   break;
    1387           0 :         case XML_BorderColor:           mnBorderColor = AttributeConversion::decodeUnsigned( rValue );  break;
    1388           0 :         case XML_BorderStyle:           mnBorderStyle = AttributeConversion::decodeInteger( rValue );   break;
    1389           0 :         case XML_SpecialEffect:         mnSpecialEffect = AttributeConversion::decodeInteger( rValue ); break;
    1390           0 :         case XML_DisplayStyle:          mnDisplayStyle = AttributeConversion::decodeInteger( rValue );  break;
    1391           0 :         case XML_MultiSelect:           mnMultiSelect = AttributeConversion::decodeInteger( rValue );   break;
    1392           0 :         case XML_ScrollBars:            mnScrollBars = AttributeConversion::decodeInteger( rValue );    break;
    1393           0 :         case XML_MatchEntry:            mnMatchEntry = AttributeConversion::decodeInteger( rValue );    break;
    1394           0 :         case XML_ShowDropButtonWhen:    mnShowDropButton = AttributeConversion::decodeInteger( rValue );break;
    1395           0 :         case XML_MaxLength:             mnMaxLength = AttributeConversion::decodeInteger( rValue );     break;
    1396           0 :         case XML_PasswordChar:          mnPasswordChar = AttributeConversion::decodeInteger( rValue );  break;
    1397           0 :         case XML_ListRows:              mnListRows = AttributeConversion::decodeInteger( rValue );      break;
    1398           0 :         default:                        AxFontDataModel::importProperty( nPropId, rValue );
    1399             :     }
    1400           0 : }
    1401             : 
    1402           0 : void AxMorphDataModelBase::importPictureData( sal_Int32 nPropId, BinaryInputStream& rInStrm )
    1403             : {
    1404           0 :     switch( nPropId )
    1405             :     {
    1406           0 :         case XML_Picture:   OleHelper::importStdPic( maPictureData, rInStrm, true );    break;
    1407           0 :         default:            AxFontDataModel::importPictureData( nPropId, rInStrm );
    1408             :     }
    1409           0 : }
    1410             : 
    1411           2 : bool AxMorphDataModelBase::importBinaryModel( BinaryInputStream& rInStrm )
    1412             : {
    1413           2 :     AxBinaryPropertyReader aReader( rInStrm, true );
    1414           2 :     aReader.readIntProperty< sal_uInt32 >( mnFlags );
    1415           2 :     aReader.readIntProperty< sal_uInt32 >( mnBackColor );
    1416           2 :     aReader.readIntProperty< sal_uInt32 >( mnTextColor );
    1417           2 :     aReader.readIntProperty< sal_Int32 >( mnMaxLength );
    1418           2 :     aReader.readIntProperty< sal_uInt8 >( mnBorderStyle );
    1419           2 :     aReader.readIntProperty< sal_uInt8 >( mnScrollBars );
    1420           2 :     aReader.readIntProperty< sal_uInt8 >( mnDisplayStyle );
    1421           2 :     aReader.skipIntProperty< sal_uInt8 >(); // mouse pointer
    1422           2 :     aReader.readPairProperty( maSize );
    1423           2 :     aReader.readIntProperty< sal_uInt16 >( mnPasswordChar );
    1424           2 :     aReader.skipIntProperty< sal_uInt32 >(); // list width
    1425           2 :     aReader.skipIntProperty< sal_uInt16 >(); // bound column
    1426           2 :     aReader.skipIntProperty< sal_Int16 >(); // text column
    1427           2 :     aReader.skipIntProperty< sal_Int16 >(); // column count
    1428           2 :     aReader.readIntProperty< sal_uInt16 >( mnListRows );
    1429           2 :     aReader.skipIntProperty< sal_uInt16 >(); // column info count
    1430           2 :     aReader.readIntProperty< sal_uInt8 >( mnMatchEntry );
    1431           2 :     aReader.skipIntProperty< sal_uInt8 >(); // list style
    1432           2 :     aReader.readIntProperty< sal_uInt8 >( mnShowDropButton );
    1433           2 :     aReader.skipUndefinedProperty();
    1434           2 :     aReader.skipIntProperty< sal_uInt8 >(); // drop down style
    1435           2 :     aReader.readIntProperty< sal_uInt8 >( mnMultiSelect );
    1436           2 :     aReader.readStringProperty( maValue );
    1437           2 :     aReader.readStringProperty( maCaption );
    1438           2 :     aReader.readIntProperty< sal_uInt32 >( mnPicturePos );
    1439           2 :     aReader.readIntProperty< sal_uInt32 >( mnBorderColor );
    1440           2 :     aReader.readIntProperty< sal_uInt32 >( mnSpecialEffect );
    1441           2 :     aReader.skipPictureProperty(); // mouse icon
    1442           2 :     aReader.readPictureProperty( maPictureData );
    1443           2 :     aReader.skipIntProperty< sal_uInt16 >(); // accelerator
    1444           2 :     aReader.skipUndefinedProperty();
    1445           2 :     aReader.skipBoolProperty();
    1446           2 :     aReader.readStringProperty( maGroupName );
    1447           2 :     return aReader.finalizeImport() && AxFontDataModel::importBinaryModel( rInStrm );
    1448             : }
    1449             : 
    1450           2 : void AxMorphDataModelBase::exportBinaryModel( BinaryOutputStream& rOutStrm )
    1451             : {
    1452           2 :     AxBinaryPropertyWriter aWriter( rOutStrm, true );
    1453           2 :     aWriter.writeIntProperty< sal_uInt32 >( mnFlags );
    1454           2 :     aWriter.writeIntProperty< sal_uInt32 >( mnBackColor );
    1455           2 :     aWriter.writeIntProperty< sal_uInt32 >( mnTextColor );
    1456           2 :     aWriter.writeIntProperty< sal_Int32 >( mnMaxLength );
    1457           2 :     aWriter.writeIntProperty< sal_uInt8 >( mnBorderStyle );
    1458           2 :     aWriter.writeIntProperty< sal_uInt8 >( mnScrollBars );
    1459           2 :     aWriter.writeIntProperty< sal_uInt8 >( mnDisplayStyle );
    1460           2 :     aWriter.skipProperty(); // mouse pointer
    1461           2 :     aWriter.writePairProperty( maSize );
    1462           2 :     aWriter.writeIntProperty< sal_uInt16 >( mnPasswordChar );
    1463           2 :     aWriter.skipProperty(); // list width
    1464           2 :     aWriter.skipProperty(); // bound column
    1465           2 :     aWriter.skipProperty(); // text column
    1466           2 :     aWriter.skipProperty(); // column count
    1467           2 :     aWriter.skipProperty(); // mnListRows
    1468           2 :     aWriter.skipProperty(); // column info count
    1469           2 :     aWriter.skipProperty(); // mnMatchEntry
    1470           2 :     aWriter.skipProperty(); // list style
    1471           2 :     aWriter.skipProperty(); // mnShowDropButton );
    1472           2 :     aWriter.skipProperty();
    1473           2 :     aWriter.skipProperty(); // drop down style
    1474           2 :     aWriter.writeIntProperty< sal_uInt8 >( mnMultiSelect );
    1475           2 :     aWriter.writeStringProperty( maValue );
    1476           2 :     aWriter.writeStringProperty( maCaption );
    1477           2 :     aWriter.skipProperty(); // mnPicturePos );
    1478           2 :     aWriter.writeIntProperty< sal_uInt32 >( mnBorderColor );
    1479           2 :     aWriter.writeIntProperty< sal_uInt32 >( mnSpecialEffect );
    1480           2 :     aWriter.skipProperty(); // mouse icon
    1481           2 :     aWriter.skipProperty(); // maPictureData
    1482           2 :     aWriter.skipProperty(); // accelerator
    1483           2 :     aWriter.skipProperty(); // undefined
    1484           2 :     aWriter.writeBoolProperty(true); // must be 1 for morph
    1485           2 :     aWriter.writeStringProperty( maGroupName );
    1486           2 :     aWriter.finalizeExport();
    1487           2 :     AxFontDataModel::exportBinaryModel( rOutStrm );
    1488           2 : }
    1489             : 
    1490           4 : void AxMorphDataModelBase::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const
    1491             : {
    1492           4 :     rPropMap.setProperty( PROP_Enabled, getFlag( mnFlags, AX_FLAGS_ENABLED ) );
    1493           4 :     rConv.convertColor( rPropMap, PROP_TextColor, mnTextColor );
    1494           4 :     AxFontDataModel::convertProperties( rPropMap, rConv );
    1495           4 : }
    1496             : 
    1497             : // ============================================================================
    1498             : 
    1499           0 : AxToggleButtonModel::AxToggleButtonModel()
    1500             : {
    1501           0 :     mnDisplayStyle = AX_DISPLAYSTYLE_TOGGLE;
    1502           0 : }
    1503             : 
    1504           0 : ApiControlType AxToggleButtonModel::getControlType() const
    1505             : {
    1506             :     OSL_ENSURE( mnDisplayStyle == AX_DISPLAYSTYLE_TOGGLE, "AxToggleButtonModel::getControlType - invalid control type" );
    1507           0 :     return API_CONTROL_BUTTON;
    1508             : }
    1509             : 
    1510           0 : void AxToggleButtonModel::convertFromProperties( PropertySet& rPropSet, const ControlConverter& rConv )
    1511             : {
    1512           0 :     rPropSet.getProperty( maCaption, PROP_Label );
    1513             : 
    1514           0 :     bool bRes = false;
    1515           0 :     if ( rPropSet.getProperty( bRes,  PROP_MultiLine ) )
    1516           0 :         setFlag( mnFlags, AX_FLAGS_WORDWRAP, bRes );
    1517             : 
    1518           0 :     rConv.convertToMSColor( rPropSet, PROP_BackgroundColor, mnBackColor );
    1519             :     // need to process the image if one exists
    1520           0 :     rConv.convertToAxState( rPropSet, maValue, mnMultiSelect, API_DEFAULTSTATE_BOOLEAN, mbAwtModel );
    1521           0 :     AxMorphDataModelBase::convertFromProperties( rPropSet, rConv );
    1522           0 : }
    1523             : 
    1524           0 : void AxToggleButtonModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const
    1525             : {
    1526           0 :     rPropMap.setProperty( PROP_Label, maCaption );
    1527           0 :     rPropMap.setProperty( PROP_MultiLine, getFlag( mnFlags, AX_FLAGS_WORDWRAP ) );
    1528           0 :     rPropMap.setProperty( PROP_Toggle, true );
    1529           0 :     rConv.convertVerticalAlign( rPropMap, mnVerticalAlign );
    1530           0 :     rConv.convertAxBackground( rPropMap, mnBackColor, mnFlags, API_TRANSPARENCY_NOTSUPPORTED );
    1531           0 :     rConv.convertAxPicture( rPropMap, maPictureData, mnPicturePos );
    1532           0 :     rConv.convertAxState( rPropMap, maValue, mnMultiSelect, API_DEFAULTSTATE_BOOLEAN, mbAwtModel );
    1533           0 :     AxMorphDataModelBase::convertProperties( rPropMap, rConv );
    1534           0 : }
    1535             : 
    1536           0 : void AxToggleButtonModel::exportCompObj( BinaryOutputStream& rOutStream )
    1537             : {
    1538             :     // should be able to replace this hardcoded foo with
    1539             :     // proper export info from MS-OLEDS spec.
    1540             :     static sal_uInt8 const aCompObj[] = {
    1541             :             0x01, 0x00, 0xFE, 0xFF, 0x03, 0x0A, 0x00, 0x00,
    1542             :             0xFF, 0xFF, 0xFF, 0xFF, 0x60, 0x1D, 0xD2, 0x8B,
    1543             :             0x42, 0xEC, 0xCE, 0x11, 0x9E, 0x0D, 0x00, 0xAA,
    1544             :             0x00, 0x60, 0x02, 0xF3, 0x21, 0x00, 0x00, 0x00,
    1545             :             0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66,
    1546             :             0x74, 0x20, 0x46, 0x6F, 0x72, 0x6D, 0x73, 0x20,
    1547             :             0x32, 0x2E, 0x30, 0x20, 0x54, 0x6F, 0x67, 0x67,
    1548             :             0x6C, 0x65, 0x42, 0x75, 0x74, 0x74, 0x6F, 0x6E,
    1549             :             0x00, 0x10, 0x00, 0x00, 0x00, 0x45, 0x6D, 0x62,
    1550             :             0x65, 0x64, 0x64, 0x65, 0x64, 0x20, 0x4F, 0x62,
    1551             :             0x6A, 0x65, 0x63, 0x74, 0x00, 0x15, 0x00, 0x00,
    1552             :             0x00, 0x46, 0x6F, 0x72, 0x6D, 0x73, 0x2E, 0x54,
    1553             :             0x6F, 0x67, 0x67, 0x6C, 0x65, 0x42, 0x75, 0x74,
    1554             :             0x74, 0x6F, 0x6E, 0x2E, 0x31, 0x00, 0xF4, 0x39,
    1555             :             0xB2, 0x71, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1556             :             0x00, 0x00, 0x00, 0x00, 0x00, 0x00
    1557             :     };
    1558           0 :     rOutStream.writeMemory( aCompObj, sizeof( aCompObj ) );
    1559           0 : }
    1560             : 
    1561             : // ============================================================================
    1562             : 
    1563           2 : AxCheckBoxModel::AxCheckBoxModel()
    1564             : {
    1565           2 :     mnDisplayStyle = AX_DISPLAYSTYLE_CHECKBOX;
    1566           2 : }
    1567             : 
    1568           2 : ApiControlType AxCheckBoxModel::getControlType() const
    1569             : {
    1570             :     OSL_ENSURE( mnDisplayStyle == AX_DISPLAYSTYLE_CHECKBOX, "AxCheckBoxModel::getControlType - invalid control type" );
    1571           2 :     return API_CONTROL_CHECKBOX;
    1572             : }
    1573             : 
    1574           2 : void AxCheckBoxModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const
    1575             : {
    1576           2 :     rPropMap.setProperty( PROP_Label, maCaption );
    1577           2 :     rPropMap.setProperty( PROP_MultiLine, getFlag( mnFlags, AX_FLAGS_WORDWRAP ) );
    1578           2 :     rConv.convertVerticalAlign( rPropMap, mnVerticalAlign );
    1579           2 :     rConv.convertAxBackground( rPropMap, mnBackColor, mnFlags, API_TRANSPARENCY_VOID );
    1580           2 :     rConv.convertAxVisualEffect( rPropMap, mnSpecialEffect );
    1581           2 :     rConv.convertAxPicture( rPropMap, maPictureData, mnPicturePos );
    1582           2 :     rConv.convertAxState( rPropMap, maValue, mnMultiSelect, API_DEFAULTSTATE_TRISTATE, mbAwtModel );
    1583           2 :     AxMorphDataModelBase::convertProperties( rPropMap, rConv );
    1584           2 : }
    1585             : 
    1586           0 : void AxCheckBoxModel::convertFromProperties( PropertySet& rPropSet, const ControlConverter& rConv )
    1587             : {
    1588           0 :     rPropSet.getProperty( maCaption, PROP_Label );
    1589             : 
    1590           0 :     bool bRes = false;
    1591           0 :     if ( rPropSet.getProperty( bRes,  PROP_MultiLine ) )
    1592           0 :         setFlag( mnFlags, AX_FLAGS_WORDWRAP, bRes );
    1593             : 
    1594           0 :     rConv.convertToAxVisualEffect( rPropSet, mnSpecialEffect );
    1595           0 :     rConv.convertToMSColor( rPropSet, PROP_BackgroundColor, mnBackColor );
    1596             :     // need to process the image if one exists
    1597           0 :     rConv.convertToAxState( rPropSet, maValue, mnMultiSelect, API_DEFAULTSTATE_BOOLEAN, mbAwtModel );
    1598           0 :     AxMorphDataModelBase::convertFromProperties( rPropSet, rConv );
    1599           0 : }
    1600             : 
    1601           0 : void AxCheckBoxModel::exportCompObj( BinaryOutputStream& rOutStream )
    1602             : {
    1603             :     // should be able to replace this hardcoded foo with
    1604             :     // proper export info from MS-OLEDS spec.
    1605             :     static sal_uInt8 const aCompObj[] = {
    1606             :         0x01, 0x00, 0xFE, 0xFF, 0x03, 0x0A, 0x00, 0x00,
    1607             :         0xFF, 0xFF, 0xFF, 0xFF, 0x40, 0x1D, 0xD2, 0x8B,
    1608             :         0x42, 0xEC, 0xCE, 0x11, 0x9E, 0x0D, 0x00, 0xAA,
    1609             :         0x00, 0x60, 0x02, 0xF3, 0x1D, 0x00, 0x00, 0x00,
    1610             :         0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66,
    1611             :         0x74, 0x20, 0x46, 0x6F, 0x72, 0x6D, 0x73, 0x20,
    1612             :         0x32, 0x2E, 0x30, 0x20, 0x43, 0x68, 0x65, 0x63,
    1613             :         0x6B, 0x42, 0x6F, 0x78, 0x00, 0x10, 0x00, 0x00,
    1614             :         0x00, 0x45, 0x6D, 0x62, 0x65, 0x64, 0x64, 0x65,
    1615             :         0x64, 0x20, 0x4F, 0x62, 0x6A, 0x65, 0x63, 0x74,
    1616             :         0x00, 0x11, 0x00, 0x00, 0x00, 0x46, 0x6F, 0x72,
    1617             :         0x6D, 0x73, 0x2E, 0x43, 0x68, 0x65, 0x63, 0x6B,
    1618             :         0x42, 0x6F, 0x78, 0x2E, 0x31, 0x00, 0xF4, 0x39,
    1619             :         0xB2, 0x71, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1620             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00
    1621             :     };
    1622           0 :     rOutStream.writeMemory( aCompObj, sizeof( aCompObj ) );
    1623           0 : }
    1624             : // ============================================================================
    1625             : 
    1626           0 : AxOptionButtonModel::AxOptionButtonModel()
    1627             : {
    1628           0 :     mnDisplayStyle = AX_DISPLAYSTYLE_OPTBUTTON;
    1629           0 : }
    1630             : 
    1631           0 : ApiControlType AxOptionButtonModel::getControlType() const
    1632             : {
    1633             :     OSL_ENSURE( mnDisplayStyle == AX_DISPLAYSTYLE_OPTBUTTON, "AxOptionButtonModel::getControlType - invalid control type" );
    1634           0 :     return API_CONTROL_RADIOBUTTON;
    1635             : }
    1636             : 
    1637           0 : void AxOptionButtonModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const
    1638             : {
    1639           0 :     rPropMap.setProperty( PROP_Label, maCaption );
    1640           0 :     rPropMap.setProperty( PROP_MultiLine, getFlag( mnFlags, AX_FLAGS_WORDWRAP ) );
    1641           0 :     rConv.convertVerticalAlign( rPropMap, mnVerticalAlign );
    1642           0 :     rConv.convertAxBackground( rPropMap, mnBackColor, mnFlags, API_TRANSPARENCY_VOID );
    1643           0 :     rConv.convertAxVisualEffect( rPropMap, mnSpecialEffect );
    1644           0 :     rConv.convertAxPicture( rPropMap, maPictureData, mnPicturePos );
    1645           0 :     rConv.convertAxState( rPropMap, maValue, mnMultiSelect, API_DEFAULTSTATE_SHORT, mbAwtModel );
    1646           0 :     AxMorphDataModelBase::convertProperties( rPropMap, rConv );
    1647           0 : }
    1648             : 
    1649           0 : void AxOptionButtonModel::convertFromProperties( PropertySet& rPropSet, const ControlConverter& rConv )
    1650             : {
    1651           0 :     rPropSet.getProperty( maCaption, PROP_Label );
    1652             : 
    1653           0 :     bool bRes = false;
    1654           0 :     if ( rPropSet.getProperty( bRes,  PROP_MultiLine ) )
    1655           0 :         setFlag( mnFlags, AX_FLAGS_WORDWRAP, bRes );
    1656             : 
    1657           0 :     rConv.convertToAxVisualEffect( rPropSet, mnSpecialEffect );
    1658           0 :     rConv.convertToMSColor( rPropSet, PROP_BackgroundColor, mnBackColor );
    1659             :     // need to process the image if one exists
    1660           0 :     rConv.convertToAxState( rPropSet, maValue, mnMultiSelect, API_DEFAULTSTATE_BOOLEAN, mbAwtModel );
    1661           0 :     AxMorphDataModelBase::convertFromProperties( rPropSet, rConv );
    1662           0 : }
    1663             : 
    1664           0 : void AxOptionButtonModel::exportCompObj( BinaryOutputStream& rOutStream )
    1665             : {
    1666             :     // should be able to replace this hardcoded foo with
    1667             :     // proper export info from MS-OLEDS spec.
    1668             :     static sal_uInt8 const aCompObj[] = {
    1669             :         0x01, 0x00, 0xFE, 0xFF, 0x03, 0x0A, 0x00, 0x00,
    1670             :         0xFF, 0xFF, 0xFF, 0xFF, 0x50, 0x1D, 0xD2, 0x8B,
    1671             :         0x42, 0xEC, 0xCE, 0x11, 0x9E, 0x0D, 0x00, 0xAA,
    1672             :         0x00, 0x60, 0x02, 0xF3, 0x21, 0x00, 0x00, 0x00,
    1673             :         0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66,
    1674             :         0x74, 0x20, 0x46, 0x6F, 0x72, 0x6D, 0x73, 0x20,
    1675             :         0x32, 0x2E, 0x30, 0x20, 0x4F, 0x70, 0x74, 0x69,
    1676             :         0x6F, 0x6E, 0x42, 0x75, 0x74, 0x74, 0x6F, 0x6E,
    1677             :         0x00, 0x10, 0x00, 0x00, 0x00, 0x45, 0x6D, 0x62,
    1678             :         0x65, 0x64, 0x64, 0x65, 0x64, 0x20, 0x4F, 0x62,
    1679             :         0x6A, 0x65, 0x63, 0x74, 0x00, 0x15, 0x00, 0x00,
    1680             :         0x00, 0x46, 0x6F, 0x72, 0x6D, 0x73, 0x2E, 0x4F,
    1681             :         0x70, 0x74, 0x69, 0x6F, 0x6E, 0x42, 0x75, 0x74,
    1682             :         0x74, 0x6F, 0x6E, 0x2E, 0x31, 0x00, 0xF4, 0x39,
    1683             :         0xB2, 0x71, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1684             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00
    1685             :     };
    1686           0 :     rOutStream.writeMemory( aCompObj, sizeof( aCompObj ) );
    1687           0 : }
    1688             : 
    1689             : // ============================================================================
    1690             : 
    1691           4 : AxTextBoxModel::AxTextBoxModel()
    1692             : {
    1693           4 :     mnDisplayStyle = AX_DISPLAYSTYLE_TEXT;
    1694           4 : }
    1695             : 
    1696           4 : ApiControlType AxTextBoxModel::getControlType() const
    1697             : {
    1698             :     OSL_ENSURE( mnDisplayStyle == AX_DISPLAYSTYLE_TEXT, "AxTextBoxModel::getControlType - invalid control type" );
    1699           4 :     return API_CONTROL_EDIT;
    1700             : }
    1701             : 
    1702           2 : void AxTextBoxModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const
    1703             : {
    1704           2 :     rPropMap.setProperty( PROP_MultiLine, getFlag( mnFlags, AX_FLAGS_MULTILINE ) );
    1705           2 :     rPropMap.setProperty( PROP_HideInactiveSelection, getFlag( mnFlags, AX_FLAGS_HIDESELECTION ) );
    1706           2 :     rPropMap.setProperty( mbAwtModel ? PROP_Text : PROP_DefaultText, maValue );
    1707           2 :     rPropMap.setProperty( PROP_MaxTextLen, getLimitedValue< sal_Int16, sal_Int32 >( mnMaxLength, 0, SAL_MAX_INT16 ) );
    1708           2 :     if( (0 < mnPasswordChar) && (mnPasswordChar <= SAL_MAX_INT16) )
    1709           0 :         rPropMap.setProperty( PROP_EchoChar, static_cast< sal_Int16 >( mnPasswordChar ) );
    1710           2 :     rPropMap.setProperty( PROP_HScroll, getFlag( mnScrollBars, AX_SCROLLBAR_HORIZONTAL ) );
    1711           2 :     rPropMap.setProperty( PROP_VScroll, getFlag( mnScrollBars, AX_SCROLLBAR_VERTICAL ) );
    1712           2 :     rConv.convertAxBackground( rPropMap, mnBackColor, mnFlags, API_TRANSPARENCY_VOID );
    1713           2 :     rConv.convertAxBorder( rPropMap, mnBorderColor, mnBorderStyle, mnSpecialEffect );
    1714           2 :     AxMorphDataModelBase::convertProperties( rPropMap, rConv );
    1715           2 : }
    1716             : 
    1717           2 : void AxTextBoxModel::convertFromProperties( PropertySet& rPropSet, const ControlConverter& rConv )
    1718             : {
    1719           2 :     bool bRes = false;
    1720           2 :     if ( rPropSet.getProperty( bRes,  PROP_MultiLine ) )
    1721           2 :         setFlag( mnFlags, AX_FLAGS_WORDWRAP, bRes );
    1722           2 :     if ( rPropSet.getProperty( bRes,  PROP_HideInactiveSelection ) )
    1723           2 :         setFlag( mnFlags, AX_FLAGS_HIDESELECTION, bRes );
    1724           2 :     rPropSet.getProperty( maValue, ( mbAwtModel ? PROP_Text : PROP_DefaultText ) );
    1725           2 :     if (maValue.isEmpty() && !mbAwtModel)
    1726             :         // No default value? Then try exporting the current one.
    1727           2 :         rPropSet.getProperty( maValue, PROP_Text);
    1728           2 :     sal_Int16 nTmp(0);
    1729           2 :     if ( rPropSet.getProperty( nTmp, PROP_MaxTextLen ) )
    1730           2 :         mnMaxLength = nTmp;
    1731           2 :     if ( rPropSet.getProperty( nTmp, PROP_EchoChar ) )
    1732           2 :         mnPasswordChar = nTmp;
    1733           2 :     if ( rPropSet.getProperty( bRes,  PROP_HScroll ) )
    1734           2 :         setFlag( mnScrollBars, AX_SCROLLBAR_HORIZONTAL, bRes );
    1735           2 :     if ( rPropSet.getProperty( bRes,  PROP_VScroll ) )
    1736           2 :         setFlag( mnScrollBars, AX_SCROLLBAR_VERTICAL, bRes );
    1737             : 
    1738           2 :     rConv.convertToMSColor( rPropSet, PROP_BackgroundColor, mnBackColor, 0x80000005L );
    1739             : 
    1740           2 :     rConv.convertToAxBorder( rPropSet, mnBorderColor, mnBorderStyle, mnSpecialEffect );
    1741           2 :     AxMorphDataModelBase::convertFromProperties( rPropSet, rConv );
    1742           2 : }
    1743             : 
    1744           0 : void AxTextBoxModel::exportCompObj( BinaryOutputStream& rOutStream )
    1745             : {
    1746             :     // should be able to replace this hardcoded foo with
    1747             :     // proper export info from MS-OLEDS spec.
    1748             :     static sal_uInt8 const aCompObj[] = {
    1749             :         0x01, 0x00, 0xFE, 0xFF, 0x03, 0x0A, 0x00, 0x00,
    1750             :         0xFF, 0xFF, 0xFF, 0xFF, 0x10, 0x1D, 0xD2, 0x8B,
    1751             :         0x42, 0xEC, 0xCE, 0x11, 0x9E, 0x0D, 0x00, 0xAA,
    1752             :         0x00, 0x60, 0x02, 0xF3, 0x1C, 0x00, 0x00, 0x00,
    1753             :         0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66,
    1754             :         0x74, 0x20, 0x46, 0x6F, 0x72, 0x6D, 0x73, 0x20,
    1755             :         0x32, 0x2E, 0x30, 0x20, 0x54, 0x65, 0x78, 0x74,
    1756             :         0x42, 0x6F, 0x78, 0x00, 0x10, 0x00, 0x00, 0x00,
    1757             :         0x45, 0x6D, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64,
    1758             :         0x20, 0x4F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x00,
    1759             :         0x10, 0x00, 0x00, 0x00, 0x46, 0x6F, 0x72, 0x6D,
    1760             :         0x73, 0x2E, 0x54, 0x65, 0x78, 0x74, 0x42, 0x6F,
    1761             :         0x78, 0x2E, 0x31, 0x00, 0xF4, 0x39, 0xB2, 0x71,
    1762             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1763             :         0x00, 0x00, 0x00, 0x00
    1764             :     };
    1765           0 :     rOutStream.writeMemory( aCompObj, sizeof( aCompObj ) );
    1766           0 : }
    1767             : // ============================================================================
    1768             : 
    1769           0 : AxNumericFieldModel::AxNumericFieldModel()
    1770             : {
    1771           0 :     mnDisplayStyle = AX_DISPLAYSTYLE_TEXT;
    1772           0 : }
    1773             : 
    1774           0 : ApiControlType AxNumericFieldModel::getControlType() const
    1775             : {
    1776             :     OSL_ENSURE( mnDisplayStyle == AX_DISPLAYSTYLE_TEXT, "AxNumericFieldModel::getControlType - invalid control type" );
    1777           0 :     return API_CONTROL_NUMERIC;
    1778             : }
    1779             : 
    1780           0 : void AxNumericFieldModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const
    1781             : {
    1782           0 :     rPropMap.setProperty( PROP_HideInactiveSelection, getFlag( mnFlags, AX_FLAGS_HIDESELECTION ) );
    1783             :     // TODO: OUString::toDouble() does not handle local decimal separator
    1784           0 :     rPropMap.setProperty( mbAwtModel ? PROP_Value : PROP_DefaultValue, maValue.toDouble() );
    1785           0 :     rPropMap.setProperty( PROP_Spin, getFlag( mnScrollBars, AX_SCROLLBAR_VERTICAL ) );
    1786           0 :     rPropMap.setProperty( PROP_Repeat, true );
    1787           0 :     rConv.convertAxBackground( rPropMap, mnBackColor, mnFlags, API_TRANSPARENCY_VOID );
    1788           0 :     rConv.convertAxBorder( rPropMap, mnBorderColor, mnBorderStyle, mnSpecialEffect );
    1789           0 :     AxMorphDataModelBase::convertProperties( rPropMap, rConv );
    1790           0 : }
    1791             : 
    1792           0 : void AxNumericFieldModel::convertFromProperties( PropertySet& rPropSet, const ControlConverter& rConv )
    1793             : {
    1794           0 :     bool bRes = false;
    1795           0 :     if ( rPropSet.getProperty( bRes,  PROP_HideInactiveSelection ) )
    1796           0 :         setFlag( mnFlags, AX_FLAGS_HIDESELECTION, bRes );
    1797           0 :     rPropSet.getProperty( maValue, ( mbAwtModel ? PROP_Text : PROP_DefaultText ) );
    1798           0 :     if ( rPropSet.getProperty( bRes,  PROP_Spin ) )
    1799           0 :         setFlag( mnScrollBars, AX_SCROLLBAR_VERTICAL, bRes );
    1800             : 
    1801           0 :     rConv.convertToMSColor( rPropSet, PROP_BackgroundColor, mnBackColor );
    1802             : 
    1803           0 :     rConv.convertToAxBorder( rPropSet, mnBorderColor, mnBorderStyle, mnSpecialEffect );
    1804           0 :     AxMorphDataModelBase::convertFromProperties( rPropSet, rConv );
    1805           0 : }
    1806             : 
    1807           0 : void AxNumericFieldModel::exportCompObj( BinaryOutputStream& rOutStream )
    1808             : {
    1809             :     // should be able to replace this hardcoded foo with
    1810             :     // proper export info from MS-OLEDS spec.
    1811             :     static sal_uInt8 const aCompObj[] = {
    1812             :         0x01, 0x00, 0xFE, 0xFF, 0x03, 0x0A, 0x00, 0x00,
    1813             :         0xFF, 0xFF, 0xFF, 0xFF, 0x10, 0x1D, 0xD2, 0x8B,
    1814             :         0x42, 0xEC, 0xCE, 0x11, 0x9E, 0x0D, 0x00, 0xAA,
    1815             :         0x00, 0x60, 0x02, 0xF3, 0x1C, 0x00, 0x00, 0x00,
    1816             :         0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66,
    1817             :         0x74, 0x20, 0x46, 0x6F, 0x72, 0x6D, 0x73, 0x20,
    1818             :         0x32, 0x2E, 0x30, 0x20, 0x54, 0x65, 0x78, 0x74,
    1819             :         0x42, 0x6F, 0x78, 0x00, 0x10, 0x00, 0x00, 0x00,
    1820             :         0x45, 0x6D, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64,
    1821             :         0x20, 0x4F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x00,
    1822             :         0x10, 0x00, 0x00, 0x00, 0x46, 0x6F, 0x72, 0x6D,
    1823             :         0x73, 0x2E, 0x54, 0x65, 0x78, 0x74, 0x42, 0x6F,
    1824             :         0x78, 0x2E, 0x31, 0x00, 0xF4, 0x39, 0xB2, 0x71,
    1825             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1826             :         0x00, 0x00, 0x00, 0x00
    1827             :     };
    1828           0 :     rOutStream.writeMemory( aCompObj, sizeof( aCompObj ) );
    1829           0 : }
    1830             : // ============================================================================
    1831             : 
    1832           0 : AxListBoxModel::AxListBoxModel()
    1833             : {
    1834           0 :     mnDisplayStyle = AX_DISPLAYSTYLE_LISTBOX;
    1835           0 : }
    1836             : 
    1837           0 : ApiControlType AxListBoxModel::getControlType() const
    1838             : {
    1839             :     OSL_ENSURE( mnDisplayStyle == AX_DISPLAYSTYLE_LISTBOX, "AxListBoxModel::getControlType - invalid control type" );
    1840           0 :     return API_CONTROL_LISTBOX;
    1841             : }
    1842             : 
    1843           0 : void AxListBoxModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const
    1844             : {
    1845           0 :     bool bMultiSelect = (mnMultiSelect == AX_SELCTION_MULTI) || (mnMultiSelect == AX_SELCTION_EXTENDED);
    1846           0 :     rPropMap.setProperty( PROP_MultiSelection, bMultiSelect );
    1847           0 :     rPropMap.setProperty( PROP_Dropdown, false );
    1848           0 :     rConv.convertAxBackground( rPropMap, mnBackColor, mnFlags, API_TRANSPARENCY_VOID );
    1849           0 :     rConv.convertAxBorder( rPropMap, mnBorderColor, mnBorderStyle, mnSpecialEffect );
    1850           0 :     AxMorphDataModelBase::convertProperties( rPropMap, rConv );
    1851           0 : }
    1852             : 
    1853           0 : void AxListBoxModel::convertFromProperties( PropertySet& rPropSet, const ControlConverter& rConv )
    1854             : {
    1855           0 :     bool bRes = false;
    1856           0 :     if ( rPropSet.getProperty( bRes, PROP_MultiSelection ) )
    1857             : 
    1858           0 :         rConv.convertToMSColor( rPropSet, PROP_BackgroundColor, mnBackColor );
    1859             : 
    1860           0 :     rConv.convertToAxBorder( rPropSet, mnBorderColor, mnBorderStyle, mnSpecialEffect );
    1861           0 :     AxMorphDataModelBase::convertFromProperties( rPropSet, rConv );
    1862           0 : }
    1863             : 
    1864           0 : void AxListBoxModel::exportCompObj( BinaryOutputStream& rOutStream )
    1865             : {
    1866             :     // should be able to replace this hardcoded foo with
    1867             :     // proper export info from MS-OLEDS spec.
    1868             :     static sal_uInt8 const aCompObj[] = {
    1869             :         0x01, 0x00, 0xFE, 0xFF, 0x03, 0x0A, 0x00, 0x00,
    1870             :         0xFF, 0xFF, 0xFF, 0xFF, 0x20, 0x1D, 0xD2, 0x8B,
    1871             :         0x42, 0xEC, 0xCE, 0x11, 0x9E, 0x0D, 0x00, 0xAA,
    1872             :         0x00, 0x60, 0x02, 0xF3, 0x1C, 0x00, 0x00, 0x00,
    1873             :         0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66,
    1874             :         0x74, 0x20, 0x46, 0x6F, 0x72, 0x6D, 0x73, 0x20,
    1875             :         0x32, 0x2E, 0x30, 0x20, 0x4C, 0x69, 0x73, 0x74,
    1876             :         0x42, 0x6F, 0x78, 0x00, 0x10, 0x00, 0x00, 0x00,
    1877             :         0x45, 0x6D, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64,
    1878             :         0x20, 0x4F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x00,
    1879             :         0x10, 0x00, 0x00, 0x00, 0x46, 0x6F, 0x72, 0x6D,
    1880             :         0x73, 0x2E, 0x4C, 0x69, 0x73, 0x74, 0x42, 0x6F,
    1881             :         0x78, 0x2E, 0x31, 0x00, 0xF4, 0x39, 0xB2, 0x71,
    1882             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1883             :         0x00, 0x00, 0x00, 0x00
    1884             :     };
    1885           0 :     rOutStream.writeMemory( aCompObj, sizeof( aCompObj ) );
    1886           0 : }
    1887             : // ============================================================================
    1888             : 
    1889           0 : AxComboBoxModel::AxComboBoxModel()
    1890             : {
    1891           0 :     mnDisplayStyle = AX_DISPLAYSTYLE_COMBOBOX;
    1892           0 : }
    1893             : 
    1894           0 : ApiControlType AxComboBoxModel::getControlType() const
    1895             : {
    1896             :     OSL_ENSURE( (mnDisplayStyle == AX_DISPLAYSTYLE_COMBOBOX) || (mnDisplayStyle == AX_DISPLAYSTYLE_DROPDOWN), "AxComboBoxModel::getControlType - invalid control type" );
    1897           0 :     return (mnDisplayStyle == AX_DISPLAYSTYLE_DROPDOWN) ? API_CONTROL_LISTBOX : API_CONTROL_COMBOBOX;
    1898             : }
    1899             : 
    1900           0 : void AxComboBoxModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const
    1901             : {
    1902           0 :     if( mnDisplayStyle != AX_DISPLAYSTYLE_DROPDOWN )
    1903             :     {
    1904           0 :         rPropMap.setProperty( PROP_HideInactiveSelection, getFlag( mnFlags, AX_FLAGS_HIDESELECTION ) );
    1905           0 :         rPropMap.setProperty( mbAwtModel ? PROP_Text : PROP_DefaultText, maValue );
    1906           0 :         rPropMap.setProperty( PROP_MaxTextLen, getLimitedValue< sal_Int16, sal_Int32 >( mnMaxLength, 0, SAL_MAX_INT16 ) );
    1907           0 :         bool bAutoComplete = (mnMatchEntry == AX_MATCHENTRY_FIRSTLETTER) || (mnMatchEntry == AX_MATCHENTRY_COMPLETE);
    1908           0 :         rPropMap.setProperty( PROP_Autocomplete, bAutoComplete );
    1909             :     }
    1910           0 :     bool bShowDropdown = (mnShowDropButton == AX_SHOWDROPBUTTON_FOCUS) || (mnShowDropButton == AX_SHOWDROPBUTTON_ALWAYS);
    1911           0 :     rPropMap.setProperty( PROP_Dropdown, bShowDropdown );
    1912           0 :     rPropMap.setProperty( PROP_LineCount, getLimitedValue< sal_Int16, sal_Int32 >( mnListRows, 1, SAL_MAX_INT16 ) );
    1913           0 :     rConv.convertAxBackground( rPropMap, mnBackColor, mnFlags, API_TRANSPARENCY_VOID );
    1914           0 :     rConv.convertAxBorder( rPropMap, mnBorderColor, mnBorderStyle, mnSpecialEffect );
    1915           0 :     AxMorphDataModelBase::convertProperties( rPropMap, rConv );
    1916           0 : }
    1917             : 
    1918           0 : void AxComboBoxModel::convertFromProperties( PropertySet& rPropSet, const ControlConverter& rConv )
    1919             : {
    1920             :     // when would we have mnDisplayStyle = AX_DISPLAYSTYLE_DROPDOWN ?
    1921             :     // #TODO check against msocximex
    1922           0 :     mnDisplayStyle = AX_DISPLAYSTYLE_COMBOBOX;
    1923           0 :     bool bRes = false;
    1924             : 
    1925           0 :     if ( rPropSet.getProperty( bRes, PROP_HideInactiveSelection ) )
    1926           0 :         setFlag( mnFlags, AX_FLAGS_HIDESELECTION, bRes );
    1927           0 :     rPropSet.getProperty( maValue, ( mbAwtModel ? PROP_Text : PROP_DefaultText ) );
    1928             : 
    1929           0 :     sal_Int16 nTmp(0);
    1930           0 :     if ( rPropSet.getProperty( nTmp, PROP_MaxTextLen ) )
    1931           0 :         mnMaxLength = nTmp;
    1932           0 :     if ( rPropSet.getProperty( bRes, PROP_Autocomplete ) )
    1933             :     {
    1934             :         // when to choose AX_MATCHENTRY_FIRSTLETTER ?
    1935             :         // #TODO check against msocximex
    1936           0 :         if ( bRes )
    1937           0 :             mnMatchEntry = AX_MATCHENTRY_COMPLETE;
    1938             :     }
    1939           0 :     if ( rPropSet.getProperty( bRes, PROP_Dropdown ) )
    1940             :     {
    1941           0 :         rPropSet.getProperty( mnListRows, PROP_LineCount );
    1942           0 :         if ( !mnListRows )
    1943           0 :             mnListRows = 1;
    1944             :     }
    1945           0 :     rConv.convertToMSColor( rPropSet, PROP_BackgroundColor, mnBackColor );
    1946             : 
    1947           0 :     rConv.convertToAxBorder( rPropSet, mnBorderColor, mnBorderStyle, mnSpecialEffect );
    1948           0 :     AxMorphDataModelBase::convertFromProperties( rPropSet, rConv );
    1949           0 : }
    1950             : 
    1951           0 : void AxComboBoxModel::exportCompObj( BinaryOutputStream& rOutStream )
    1952             : {
    1953             :     // should be able to replace this hardcoded foo with
    1954             :     // proper export info from MS-OLEDS spec.
    1955             :     static sal_uInt8 const aCompObj[] = {
    1956             :         0x01, 0x00, 0xFE, 0xFF, 0x03, 0x0A, 0x00, 0x00,
    1957             :         0xFF, 0xFF, 0xFF, 0xFF, 0x30, 0x1D, 0xD2, 0x8B,
    1958             :         0x42, 0xEC, 0xCE, 0x11, 0x9E, 0x0D, 0x00, 0xAA,
    1959             :         0x00, 0x60, 0x02, 0xF3, 0x1D, 0x00, 0x00, 0x00,
    1960             :         0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66,
    1961             :         0x74, 0x20, 0x46, 0x6F, 0x72, 0x6D, 0x73, 0x20,
    1962             :         0x32, 0x2E, 0x30, 0x20, 0x43, 0x6F, 0x6D, 0x62,
    1963             :         0x6F, 0x42, 0x6F, 0x78, 0x00, 0x10, 0x00, 0x00,
    1964             :         0x00, 0x45, 0x6D, 0x62, 0x65, 0x64, 0x64, 0x65,
    1965             :         0x64, 0x20, 0x4F, 0x62, 0x6A, 0x65, 0x63, 0x74,
    1966             :         0x00, 0x11, 0x00, 0x00, 0x00, 0x46, 0x6F, 0x72,
    1967             :         0x6D, 0x73, 0x2E, 0x43, 0x6F, 0x6D, 0x62, 0x6F,
    1968             :         0x42, 0x6F, 0x78, 0x2E, 0x31, 0x00, 0xF4, 0x39,
    1969             :         0xB2, 0x71, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1970             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00
    1971             :     };
    1972           0 :     rOutStream.writeMemory( aCompObj, sizeof( aCompObj ) );
    1973           0 : }
    1974             : // ============================================================================
    1975             : 
    1976           0 : AxSpinButtonModel::AxSpinButtonModel() :
    1977             :     mnArrowColor( AX_SYSCOLOR_BUTTONTEXT ),
    1978             :     mnBackColor( AX_SYSCOLOR_BUTTONFACE ),
    1979             :     mnFlags( AX_SPINBUTTON_DEFFLAGS ),
    1980             :     mnOrientation( AX_ORIENTATION_AUTO ),
    1981             :     mnMin( 0 ),
    1982             :     mnMax( 100 ),
    1983             :     mnPosition( 0 ),
    1984             :     mnSmallChange( 1 ),
    1985           0 :     mnDelay( 50 )
    1986             : {
    1987           0 : }
    1988             : 
    1989           0 : ApiControlType AxSpinButtonModel::getControlType() const
    1990             : {
    1991           0 :     return API_CONTROL_SPINBUTTON;
    1992             : }
    1993             : 
    1994           0 : void AxSpinButtonModel::importProperty( sal_Int32 nPropId, const OUString& rValue )
    1995             : {
    1996           0 :     switch( nPropId )
    1997             :     {
    1998           0 :         case XML_ForeColor:             mnArrowColor = AttributeConversion::decodeUnsigned( rValue );   break;
    1999           0 :         case XML_BackColor:             mnBackColor = AttributeConversion::decodeUnsigned( rValue );    break;
    2000           0 :         case XML_VariousPropertyBits:   mnFlags = AttributeConversion::decodeUnsigned( rValue );        break;
    2001           0 :         case XML_Orientation:           mnOrientation = AttributeConversion::decodeInteger( rValue );   break;
    2002           0 :         case XML_Min:                   mnMin = AttributeConversion::decodeInteger( rValue );           break;
    2003           0 :         case XML_Max:                   mnMax = AttributeConversion::decodeInteger( rValue );           break;
    2004           0 :         case XML_Position:              mnPosition = AttributeConversion::decodeInteger( rValue );      break;
    2005           0 :         case XML_SmallChange:           mnSmallChange = AttributeConversion::decodeInteger( rValue );   break;
    2006           0 :         case XML_Delay:                 mnDelay = AttributeConversion::decodeInteger( rValue );         break;
    2007           0 :         default:                        AxControlModelBase::importProperty( nPropId, rValue );
    2008             :     }
    2009           0 : }
    2010             : 
    2011           0 : bool AxSpinButtonModel::importBinaryModel( BinaryInputStream& rInStrm )
    2012             : {
    2013           0 :     AxBinaryPropertyReader aReader( rInStrm );
    2014           0 :     aReader.readIntProperty< sal_uInt32 >( mnArrowColor );
    2015           0 :     aReader.readIntProperty< sal_uInt32 >( mnBackColor );
    2016           0 :     aReader.readIntProperty< sal_uInt32 >( mnFlags );
    2017           0 :     aReader.readPairProperty( maSize );
    2018           0 :     aReader.skipIntProperty< sal_uInt32 >(); // unused
    2019           0 :     aReader.readIntProperty< sal_Int32 >( mnMin );
    2020           0 :     aReader.readIntProperty< sal_Int32 >( mnMax );
    2021           0 :     aReader.readIntProperty< sal_Int32 >( mnPosition );
    2022           0 :     aReader.skipIntProperty< sal_uInt32 >(); // prev enabled
    2023           0 :     aReader.skipIntProperty< sal_uInt32 >(); // next enabled
    2024           0 :     aReader.readIntProperty< sal_Int32 >( mnSmallChange );
    2025           0 :     aReader.readIntProperty< sal_Int32 >( mnOrientation );
    2026           0 :     aReader.readIntProperty< sal_Int32 >( mnDelay );
    2027           0 :     aReader.skipPictureProperty(); // mouse icon
    2028           0 :     aReader.skipIntProperty< sal_uInt8 >(); // mouse pointer
    2029           0 :     return aReader.finalizeImport();
    2030             : }
    2031             : 
    2032           0 : void AxSpinButtonModel::exportBinaryModel( BinaryOutputStream& rOutStrm )
    2033             : {
    2034           0 :     AxBinaryPropertyWriter aWriter( rOutStrm );
    2035           0 :     aWriter.writeIntProperty< sal_uInt32 >( mnArrowColor );
    2036           0 :     aWriter.writeIntProperty< sal_uInt32 >( mnBackColor );
    2037           0 :     aWriter.writeIntProperty< sal_uInt32 >( mnFlags );
    2038           0 :     aWriter.writePairProperty( maSize );
    2039           0 :     aWriter.skipProperty(); // unused
    2040           0 :     aWriter.writeIntProperty< sal_Int32 >( mnMin );
    2041           0 :     aWriter.writeIntProperty< sal_Int32 >( mnMax );
    2042           0 :     aWriter.writeIntProperty< sal_Int32 >( mnPosition );
    2043           0 :     aWriter.skipProperty(); // prev enabled
    2044           0 :     aWriter.skipProperty(); // next enabled
    2045           0 :     aWriter.writeIntProperty< sal_Int32 >( mnSmallChange );
    2046           0 :     aWriter.writeIntProperty< sal_Int32 >( mnOrientation );
    2047           0 :     aWriter.writeIntProperty< sal_Int32 >( mnDelay );
    2048           0 :     aWriter.skipProperty(); // mouse icon
    2049           0 :     aWriter.skipProperty(); // mouse pointer
    2050             : 
    2051           0 :     aWriter.finalizeExport();
    2052           0 : }
    2053             : 
    2054           0 : void AxSpinButtonModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const
    2055             : {
    2056           0 :     sal_Int32 nMin = ::std::min( mnMin, mnMax );
    2057           0 :     sal_Int32 nMax = ::std::max( mnMin, mnMax );
    2058           0 :     rPropMap.setProperty( PROP_Enabled, getFlag( mnFlags, AX_FLAGS_ENABLED ) );
    2059           0 :     rPropMap.setProperty( PROP_SpinValueMin, nMin );
    2060           0 :     rPropMap.setProperty( PROP_SpinValueMax, nMax );
    2061           0 :     rPropMap.setProperty( PROP_SpinIncrement, mnSmallChange );
    2062           0 :     rPropMap.setProperty( mbAwtModel ? PROP_SpinValue : PROP_DefaultSpinValue, mnPosition );
    2063           0 :     rPropMap.setProperty( PROP_Repeat, true );
    2064           0 :     rPropMap.setProperty( PROP_RepeatDelay, mnDelay );
    2065           0 :     rPropMap.setProperty( PROP_Border, API_BORDER_NONE );
    2066           0 :     rConv.convertColor( rPropMap, PROP_SymbolColor, mnArrowColor );
    2067           0 :     rConv.convertAxBackground( rPropMap, mnBackColor, mnFlags, API_TRANSPARENCY_NOTSUPPORTED );
    2068           0 :     rConv.convertAxOrientation( rPropMap, maSize, mnOrientation );
    2069           0 :     AxControlModelBase::convertProperties( rPropMap, rConv );
    2070           0 : }
    2071             : 
    2072           0 : void AxSpinButtonModel::convertFromProperties( PropertySet& rPropSet, const ControlConverter& rConv )
    2073             : {
    2074           0 :     bool bRes = false;
    2075           0 :     if ( rPropSet.getProperty( bRes,  PROP_Enabled ) )
    2076           0 :         setFlag( mnFlags, AX_FLAGS_ENABLED, bRes );
    2077           0 :     rPropSet.getProperty( mnMin, PROP_SpinValueMin );
    2078           0 :     rPropSet.getProperty( mnMax, PROP_SpinValueMax );
    2079           0 :     rPropSet.getProperty( mnSmallChange, PROP_SpinIncrement );
    2080           0 :     rPropSet.getProperty( mnPosition, ( mbAwtModel ? PROP_SpinValue : PROP_DefaultSpinValue ) );
    2081           0 :     rPropSet.getProperty( mnDelay, PROP_RepeatDelay );
    2082           0 :     rConv.convertToMSColor( rPropSet, PROP_SymbolColor, mnArrowColor);
    2083           0 :     rConv.convertToMSColor( rPropSet, PROP_BackgroundColor, mnBackColor );
    2084             : 
    2085           0 :     rConv.convertToAxOrientation( rPropSet, maSize, mnOrientation );
    2086           0 : }
    2087             : 
    2088           0 : void AxSpinButtonModel::exportCompObj( BinaryOutputStream& rOutStream )
    2089             : {
    2090             :     // should be able to replace this hardcoded foo with
    2091             :     // proper export info from MS-OLEDS spec.
    2092             :     static sal_uInt8 const aCompObj[] =
    2093             :     {
    2094             :         0x01, 0x00, 0xFE, 0xFF, 0x03, 0x0A, 0x00, 0x00,
    2095             :         0xFF, 0xFF, 0xFF, 0xFF, 0xB0, 0x6F, 0x17, 0x79,
    2096             :         0xF2, 0xB7, 0xCE, 0x11, 0x97, 0xEF, 0x00, 0xAA,
    2097             :         0x00, 0x6D, 0x27, 0x76, 0x1F, 0x00, 0x00, 0x00,
    2098             :         0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66,
    2099             :         0x74, 0x20, 0x46, 0x6F, 0x72, 0x6D, 0x73, 0x20,
    2100             :         0x32, 0x2E, 0x30, 0x20, 0x53, 0x70, 0x69, 0x6E,
    2101             :         0x42, 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x00, 0x10,
    2102             :         0x00, 0x00, 0x00, 0x45, 0x6D, 0x62, 0x65, 0x64,
    2103             :         0x64, 0x65, 0x64, 0x20, 0x4F, 0x62, 0x6A, 0x65,
    2104             :         0x63, 0x74, 0x00, 0x13, 0x00, 0x00, 0x00, 0x46,
    2105             :         0x6E, 0x42, 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x2E,
    2106             :         0x31, 0x00, 0xF4, 0x39, 0xB2, 0x71, 0x00, 0x00,
    2107             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    2108             :         0x00, 0x00
    2109             :     };
    2110             : 
    2111           0 :     rOutStream.writeMemory( aCompObj, sizeof( aCompObj ) );
    2112           0 : }
    2113             : // ============================================================================
    2114             : 
    2115           0 : AxScrollBarModel::AxScrollBarModel() :
    2116             :     mnArrowColor( AX_SYSCOLOR_BUTTONTEXT ),
    2117             :     mnBackColor( AX_SYSCOLOR_BUTTONFACE ),
    2118             :     mnFlags( AX_SCROLLBAR_DEFFLAGS ),
    2119             :     mnOrientation( AX_ORIENTATION_AUTO ),
    2120             :     mnPropThumb( AX_PROPTHUMB_ON ),
    2121             :     mnMin( 0 ),
    2122             :     mnMax( 32767 ),
    2123             :     mnPosition( 0 ),
    2124             :     mnSmallChange( 1 ),
    2125             :     mnLargeChange( 1 ),
    2126           0 :     mnDelay( 50 )
    2127             : {
    2128           0 : }
    2129             : 
    2130           0 : ApiControlType AxScrollBarModel::getControlType() const
    2131             : {
    2132           0 :     return API_CONTROL_SCROLLBAR;
    2133             : }
    2134             : 
    2135           0 : void AxScrollBarModel::importProperty( sal_Int32 nPropId, const OUString& rValue )
    2136             : {
    2137           0 :     switch( nPropId )
    2138             :     {
    2139           0 :         case XML_ForeColor:             mnArrowColor = AttributeConversion::decodeUnsigned( rValue );   break;
    2140           0 :         case XML_BackColor:             mnBackColor = AttributeConversion::decodeUnsigned( rValue );    break;
    2141           0 :         case XML_VariousPropertyBits:   mnFlags = AttributeConversion::decodeUnsigned( rValue );        break;
    2142           0 :         case XML_Orientation:           mnOrientation = AttributeConversion::decodeInteger( rValue );   break;
    2143           0 :         case XML_ProportionalThumb:     mnPropThumb = AttributeConversion::decodeInteger( rValue );     break;
    2144           0 :         case XML_Min:                   mnMin = AttributeConversion::decodeInteger( rValue );           break;
    2145           0 :         case XML_Max:                   mnMax = AttributeConversion::decodeInteger( rValue );           break;
    2146           0 :         case XML_Position:              mnPosition = AttributeConversion::decodeInteger( rValue );      break;
    2147           0 :         case XML_SmallChange:           mnSmallChange = AttributeConversion::decodeInteger( rValue );   break;
    2148           0 :         case XML_LargeChange:           mnLargeChange = AttributeConversion::decodeInteger( rValue );   break;
    2149           0 :         case XML_Delay:                 mnDelay = AttributeConversion::decodeInteger( rValue );         break;
    2150           0 :         default:                        AxControlModelBase::importProperty( nPropId, rValue );
    2151             :     }
    2152           0 : }
    2153             : 
    2154           0 : bool AxScrollBarModel::importBinaryModel( BinaryInputStream& rInStrm )
    2155             : {
    2156           0 :     AxBinaryPropertyReader aReader( rInStrm );
    2157           0 :     aReader.readIntProperty< sal_uInt32 >( mnArrowColor );
    2158           0 :     aReader.readIntProperty< sal_uInt32 >( mnBackColor );
    2159           0 :     aReader.readIntProperty< sal_uInt32 >( mnFlags );
    2160           0 :     aReader.readPairProperty( maSize );
    2161           0 :     aReader.skipIntProperty< sal_uInt8 >(); // mouse pointer
    2162           0 :     aReader.readIntProperty< sal_Int32 >( mnMin );
    2163           0 :     aReader.readIntProperty< sal_Int32 >( mnMax );
    2164           0 :     aReader.readIntProperty< sal_Int32 >( mnPosition );
    2165           0 :     aReader.skipIntProperty< sal_uInt32 >(); // unused
    2166           0 :     aReader.skipIntProperty< sal_uInt32 >(); // prev enabled
    2167           0 :     aReader.skipIntProperty< sal_uInt32 >(); // next enabled
    2168           0 :     aReader.readIntProperty< sal_Int32 >( mnSmallChange );
    2169           0 :     aReader.readIntProperty< sal_Int32 >( mnLargeChange );
    2170           0 :     aReader.readIntProperty< sal_Int32 >( mnOrientation );
    2171           0 :     aReader.readIntProperty< sal_Int16 >( mnPropThumb );
    2172           0 :     aReader.readIntProperty< sal_Int32 >( mnDelay );
    2173           0 :     aReader.skipPictureProperty(); // mouse icon
    2174           0 :     return aReader.finalizeImport();
    2175             : }
    2176             : 
    2177           0 : void AxScrollBarModel::exportBinaryModel( BinaryOutputStream& rOutStrm )
    2178             : {
    2179           0 :     AxBinaryPropertyWriter aWriter( rOutStrm );
    2180           0 :     aWriter.writeIntProperty< sal_uInt32 >( mnArrowColor );
    2181           0 :     aWriter.writeIntProperty< sal_uInt32 >( mnBackColor );
    2182           0 :     aWriter.writeIntProperty< sal_uInt32 >( mnFlags );
    2183           0 :     aWriter.writePairProperty( maSize );
    2184           0 :     aWriter.skipProperty(); // mouse pointer
    2185           0 :     aWriter.writeIntProperty< sal_Int32 >( mnMin );
    2186           0 :     aWriter.writeIntProperty< sal_Int32 >( mnMax );
    2187           0 :     aWriter.writeIntProperty< sal_Int32 >( mnPosition );
    2188           0 :     aWriter.skipProperty(); // unused
    2189           0 :     aWriter.skipProperty(); // prev enabled
    2190           0 :     aWriter.skipProperty(); // next enabled
    2191           0 :     aWriter.writeIntProperty< sal_Int32 >( mnSmallChange );
    2192           0 :     aWriter.writeIntProperty< sal_Int32 >( mnLargeChange );
    2193           0 :     aWriter.writeIntProperty< sal_Int32 >( mnOrientation );
    2194           0 :     aWriter.writeIntProperty< sal_Int16 >( mnPropThumb );
    2195           0 :     aWriter.writeIntProperty< sal_Int32 >( mnDelay );
    2196           0 :     aWriter.skipProperty(); // mouse icon
    2197           0 :     aWriter.finalizeExport();
    2198           0 : }
    2199             : 
    2200           0 : void AxScrollBarModel::exportCompObj( BinaryOutputStream& rOutStream )
    2201             : {
    2202             :     // should be able to replace this hardcoded foo with
    2203             :     // proper export info from MS-OLEDS spec.
    2204             :     static sal_uInt8 const aCompObj[] =
    2205             :     {
    2206             :         0x01, 0x00, 0xFE, 0xFF, 0x03, 0x0A, 0x00, 0x00,
    2207             :         0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x81, 0xD1, 0xDF,
    2208             :         0x2F, 0x5E, 0xCE, 0x11, 0xA4, 0x49, 0x00, 0xAA,
    2209             :         0x00, 0x4A, 0x80, 0x3D, 0x1E, 0x00, 0x00, 0x00,
    2210             :         0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66,
    2211             :         0x74, 0x20, 0x46, 0x6F, 0x72, 0x6D, 0x73, 0x20,
    2212             :         0x32, 0x2E, 0x30, 0x20, 0x53, 0x63, 0x72, 0x6F,
    2213             :         0x6C, 0x6C, 0x42, 0x61, 0x72, 0x00, 0x10, 0x00,
    2214             :         0x00, 0x00, 0x45, 0x6D, 0x62, 0x65, 0x64, 0x64,
    2215             :         0x65, 0x64, 0x20, 0x4F, 0x62, 0x6A, 0x65, 0x63,
    2216             :         0x74, 0x00, 0x12, 0x00, 0x00, 0x00, 0x46, 0x6F,
    2217             :         0x72, 0x6D, 0x73, 0x2E, 0x53, 0x63, 0x72, 0x6F,
    2218             :         0x6C, 0x6C, 0x42, 0x61, 0x72, 0x2E, 0x31, 0x00,
    2219             :         0xF4, 0x39, 0xB2, 0x71, 0x00, 0x00, 0x00, 0x00,
    2220             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
    2221             :     };
    2222           0 :     rOutStream.writeMemory( aCompObj, sizeof( aCompObj ) );
    2223           0 : }
    2224             : 
    2225           0 : void AxScrollBarModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const
    2226             : {
    2227           0 :     rPropMap.setProperty( PROP_Enabled, getFlag( mnFlags, AX_FLAGS_ENABLED ) );
    2228           0 :     rPropMap.setProperty( PROP_RepeatDelay, mnDelay );
    2229           0 :     rPropMap.setProperty( PROP_Border, API_BORDER_NONE );
    2230           0 :     if( (mnPropThumb == AX_PROPTHUMB_ON) && (mnMin != mnMax) && (mnLargeChange > 0) )
    2231             :     {
    2232             :         // use double to prevent integer overflow in division (fInterval+mnLargeChange may become 0 when performed as int)
    2233           0 :         double fInterval = fabs( static_cast< double >( mnMax - mnMin ) );
    2234           0 :         sal_Int32 nThumbLen = getLimitedValue< sal_Int32, double >( (fInterval * mnLargeChange) / (fInterval + mnLargeChange), 1, SAL_MAX_INT32 );
    2235           0 :         rPropMap.setProperty( PROP_VisibleSize, nThumbLen );
    2236             :     }
    2237           0 :     rConv.convertColor( rPropMap, PROP_SymbolColor, mnArrowColor );
    2238           0 :     rConv.convertAxBackground( rPropMap, mnBackColor, mnFlags, API_TRANSPARENCY_NOTSUPPORTED );
    2239           0 :     rConv.convertAxOrientation( rPropMap, maSize, mnOrientation );
    2240           0 :     rConv.convertScrollBar( rPropMap, mnMin, mnMax, mnPosition, mnSmallChange, mnLargeChange, mbAwtModel );
    2241           0 :     AxControlModelBase::convertProperties( rPropMap, rConv );
    2242           0 : }
    2243             : 
    2244           0 : void AxScrollBarModel::convertFromProperties( PropertySet& rPropSet, const ControlConverter& rConv )
    2245             : {
    2246           0 :     bool bRes = false;
    2247           0 :     if ( rPropSet.getProperty( bRes,  PROP_Enabled ) )
    2248           0 :         setFlag( mnFlags, AX_FLAGS_ENABLED, bRes );
    2249           0 :     rPropSet.getProperty( mnDelay, PROP_RepeatDelay );
    2250           0 :     mnPropThumb = AX_PROPTHUMB_ON; // default
    2251           0 :     rConv.convertToMSColor( rPropSet, PROP_SymbolColor, mnArrowColor);
    2252           0 :     rConv.convertToMSColor( rPropSet, PROP_BackgroundColor, mnBackColor );
    2253           0 :     rConv.convertToAxOrientation( rPropSet, maSize, mnOrientation );
    2254             : 
    2255           0 :     rPropSet.getProperty( mnMin, PROP_ScrollValueMin );
    2256           0 :     rPropSet.getProperty( mnMax, PROP_ScrollValueMax );
    2257           0 :     rPropSet.getProperty( mnSmallChange, PROP_LineIncrement );
    2258           0 :     rPropSet.getProperty( mnLargeChange, PROP_BlockIncrement );
    2259           0 :     rPropSet.getProperty( mnPosition, ( mbAwtModel ? PROP_ScrollValue : PROP_DefaultScrollValue ) );
    2260             : 
    2261           0 : }
    2262             : 
    2263             : // ============================================================================
    2264             : 
    2265           0 : AxContainerModelBase::AxContainerModelBase( bool bFontSupport ) :
    2266             :     AxFontDataModel( false ),   // no support for alignment properties
    2267             :     maLogicalSize( AX_CONTAINER_DEFWIDTH, AX_CONTAINER_DEFHEIGHT ),
    2268             :     maScrollPos( 0, 0 ),
    2269             :     mnBackColor( AX_SYSCOLOR_BUTTONFACE ),
    2270             :     mnTextColor( AX_SYSCOLOR_BUTTONTEXT ),
    2271             :     mnFlags( AX_CONTAINER_DEFFLAGS ),
    2272             :     mnBorderColor( AX_SYSCOLOR_BUTTONTEXT ),
    2273             :     mnBorderStyle( AX_BORDERSTYLE_NONE ),
    2274             :     mnScrollBars( AX_CONTAINER_SCR_NONE ),
    2275             :     mnCycleType( AX_CONTAINER_CYCLEALL ),
    2276             :     mnSpecialEffect( AX_SPECIALEFFECT_FLAT ),
    2277             :     mnPicAlign( AX_PICALIGN_CENTER ),
    2278             :     mnPicSizeMode( AX_PICSIZE_CLIP ),
    2279             :     mbPicTiling( false ),
    2280           0 :     mbFontSupport( bFontSupport )
    2281             : {
    2282           0 :     setAwtModelMode();
    2283             :     // different default size for frame
    2284           0 :     maSize = AxPairData( AX_CONTAINER_DEFWIDTH, AX_CONTAINER_DEFHEIGHT );
    2285           0 : }
    2286             : 
    2287           0 : void AxContainerModelBase::importProperty( sal_Int32 nPropId, const OUString& rValue )
    2288             : {
    2289           0 :     if( nPropId == XML_Caption )
    2290           0 :         maCaption = rValue;
    2291           0 : }
    2292             : 
    2293           0 : bool AxContainerModelBase::importBinaryModel( BinaryInputStream& rInStrm )
    2294             : {
    2295           0 :     AxBinaryPropertyReader aReader( rInStrm );
    2296           0 :     aReader.skipUndefinedProperty();
    2297           0 :     aReader.readIntProperty< sal_uInt32 >( mnBackColor );
    2298           0 :     aReader.readIntProperty< sal_uInt32 >( mnTextColor );
    2299           0 :     aReader.skipIntProperty< sal_uInt32 >(); // next availbale control ID
    2300           0 :     aReader.skipUndefinedProperty();
    2301           0 :     aReader.skipUndefinedProperty();
    2302           0 :     aReader.readIntProperty< sal_uInt32 >( mnFlags );
    2303           0 :     aReader.readIntProperty< sal_uInt8 >( mnBorderStyle );
    2304           0 :     aReader.skipIntProperty< sal_uInt8 >(); // mouse pointer
    2305           0 :     aReader.readIntProperty< sal_uInt8 >( mnScrollBars );
    2306           0 :     aReader.readPairProperty( maSize );
    2307           0 :     aReader.readPairProperty( maLogicalSize );
    2308           0 :     aReader.readPairProperty( maScrollPos );
    2309           0 :     aReader.skipIntProperty< sal_uInt32 >(); // number of control groups
    2310           0 :     aReader.skipUndefinedProperty();
    2311           0 :     aReader.skipPictureProperty(); // mouse icon
    2312           0 :     aReader.readIntProperty< sal_uInt8 >( mnCycleType );
    2313           0 :     aReader.readIntProperty< sal_uInt8 >( mnSpecialEffect );
    2314           0 :     aReader.readIntProperty< sal_uInt32 >( mnBorderColor );
    2315           0 :     aReader.readStringProperty( maCaption );
    2316           0 :     aReader.readFontProperty( maFontData );
    2317           0 :     aReader.readPictureProperty( maPictureData );
    2318           0 :     aReader.skipIntProperty< sal_Int32 >(); // zoom
    2319           0 :     aReader.readIntProperty< sal_uInt8 >( mnPicAlign );
    2320           0 :     aReader.readBoolProperty( mbPicTiling );
    2321           0 :     aReader.readIntProperty< sal_uInt8 >( mnPicSizeMode );
    2322           0 :     aReader.skipIntProperty< sal_uInt32 >(); // shape cookie
    2323           0 :     aReader.skipIntProperty< sal_uInt32 >(); // draw buffer size
    2324           0 :     return aReader.finalizeImport();
    2325             : }
    2326             : 
    2327           0 : void AxContainerModelBase::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const
    2328             : {
    2329           0 :     if( mbFontSupport )
    2330             :     {
    2331           0 :         rConv.convertColor( rPropMap, PROP_TextColor, mnTextColor );
    2332           0 :         AxFontDataModel::convertProperties( rPropMap, rConv );
    2333             :     }
    2334           0 : }
    2335             : 
    2336           0 : bool AxContainerModelBase::importClassTable( BinaryInputStream& rInStrm, AxClassTable& orClassTable )
    2337             : {
    2338           0 :     bool bValid = true;
    2339           0 :     orClassTable.clear();
    2340           0 :     if( !getFlag( mnFlags, AX_CONTAINER_NOCLASSTABLE ) )
    2341             :     {
    2342           0 :         sal_uInt16 nCount = rInStrm.readuInt16();
    2343           0 :         for( sal_uInt16 nIndex = 0; bValid && (nIndex < nCount); ++nIndex )
    2344             :         {
    2345           0 :             orClassTable.push_back( OUString() );
    2346           0 :             AxBinaryPropertyReader aReader( rInStrm );
    2347           0 :             aReader.readGuidProperty( orClassTable.back() );
    2348           0 :             aReader.skipGuidProperty(); // source interface GUID
    2349           0 :             aReader.skipUndefinedProperty();
    2350           0 :             aReader.skipGuidProperty(); // default interface GUID
    2351           0 :             aReader.skipIntProperty< sal_uInt32 >(); // class table and var flags
    2352           0 :             aReader.skipIntProperty< sal_uInt32 >(); // method count
    2353           0 :             aReader.skipIntProperty< sal_Int32 >(); // IDispatch identifier for linked cell access
    2354           0 :             aReader.skipIntProperty< sal_uInt16 >(); // get function index for linked cell access
    2355           0 :             aReader.skipIntProperty< sal_uInt16 >(); // put function index for linked cell access
    2356           0 :             aReader.skipIntProperty< sal_uInt16 >(); // linked cell access property type
    2357           0 :             aReader.skipIntProperty< sal_uInt16 >(); // get function index of value
    2358           0 :             aReader.skipIntProperty< sal_uInt16 >(); // put function index of value
    2359           0 :             aReader.skipIntProperty< sal_uInt16 >(); // value type
    2360           0 :             aReader.skipIntProperty< sal_Int32 >(); // IDispatch identifier for source range access
    2361           0 :             aReader.skipIntProperty< sal_uInt16 >(); // get function index for source range access
    2362           0 :             bValid = aReader.finalizeImport();
    2363           0 :         }
    2364             :     }
    2365           0 :     return bValid;
    2366             : }
    2367             : 
    2368             : // ============================================================================
    2369             : 
    2370           0 : AxFrameModel::AxFrameModel() :
    2371           0 :     AxContainerModelBase( true )
    2372             : {
    2373           0 : }
    2374             : 
    2375           0 : ApiControlType AxFrameModel::getControlType() const
    2376             : {
    2377           0 :     return mbAwtModel ? API_CONTROL_FRAME : API_CONTROL_GROUPBOX;
    2378             : }
    2379             : 
    2380           0 : void AxFrameModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const
    2381             : {
    2382           0 :     rPropMap.setProperty( PROP_Label, maCaption );
    2383           0 :     rPropMap.setProperty( PROP_Enabled, getFlag( mnFlags, AX_CONTAINER_ENABLED ) );
    2384             : #if SCROLLABLEFRAME
    2385             :     rConv.convertScrollabilitySettings( rPropMap, maScrollPos, maLogicalSize, mnScrollBars );
    2386             : #endif
    2387           0 :     AxContainerModelBase::convertProperties( rPropMap, rConv );
    2388           0 : }
    2389             : 
    2390             : // ============================================================================
    2391             : 
    2392           0 : AxUserFormModel::AxUserFormModel()
    2393             : {
    2394           0 : }
    2395             : 
    2396           0 : ApiControlType AxUserFormModel::getControlType() const
    2397             : {
    2398           0 :     return API_CONTROL_DIALOG;
    2399             : }
    2400             : 
    2401           0 : void AxUserFormModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const
    2402             : {
    2403           0 :     rPropMap.setProperty( PROP_Title, maCaption );
    2404           0 :     rConv.convertColor( rPropMap, PROP_BackgroundColor, mnBackColor );
    2405           0 :     rConv.convertAxPicture( rPropMap, maPictureData, AX_PICPOS_CENTER  );
    2406           0 :     rConv.convertScrollabilitySettings( rPropMap, maScrollPos, maLogicalSize, mnScrollBars );
    2407           0 :     AxContainerModelBase::convertProperties( rPropMap, rConv );
    2408           0 : }
    2409             : 
    2410           0 : HtmlSelectModel::HtmlSelectModel()
    2411             : {
    2412           0 : }
    2413             : 
    2414             : bool
    2415           0 : HtmlSelectModel::importBinaryModel( BinaryInputStream& rInStrm )
    2416             : {
    2417           0 :     static String sMultiple( RTL_CONSTASCII_USTRINGPARAM("<SELECT MULTIPLE") );
    2418           0 :     static String sSelected( RTL_CONSTASCII_USTRINGPARAM("OPTION SELECTED") );
    2419             : 
    2420           0 :     OUString sStringContents = rInStrm.readUnicodeArray( rInStrm.size() );
    2421             : 
    2422           0 :     String data = sStringContents;
    2423             : 
    2424             :     // replace crlf with lf
    2425           0 :     data.SearchAndReplaceAll( String( RTL_CONSTASCII_USTRINGPARAM( "\x0D\x0A" ) ), String( RTL_CONSTASCII_USTRINGPARAM( "\x0A" ) ) );
    2426           0 :     std::vector< rtl::OUString > listValues;
    2427           0 :     std::vector< sal_Int16 > selectedIndices;
    2428             : 
    2429             :     // Ultra hacky parser for the info
    2430           0 :     sal_Int32 nTokenCount = comphelper::string::getTokenCount(data, '\n');
    2431             : 
    2432           0 :     for ( sal_Int32 nToken = 0; nToken < nTokenCount; ++nToken )
    2433             :     {
    2434           0 :         String sLine( data.GetToken( nToken, '\n' ) );
    2435           0 :         if ( !nToken ) // first line will tell us if multiselect is enabled
    2436             :         {
    2437           0 :             if ( sLine.CompareTo( sMultiple, sMultiple.Len() ) == COMPARE_EQUAL )
    2438           0 :                 mnMultiSelect = true;
    2439             :         }
    2440             :         // skip first and last lines, no data there
    2441           0 :         else if ( nToken < nTokenCount - 1)
    2442             :         {
    2443           0 :             if ( comphelper::string::getTokenCount(sLine, '>') )
    2444             :             {
    2445           0 :                 String displayValue  = sLine.GetToken( 1, '>' );
    2446           0 :                 if ( displayValue.Len() )
    2447             :                 {
    2448             :                     // Really we should be using a proper html parser
    2449             :                     // escaping some common bits to be escaped
    2450           0 :                     displayValue.SearchAndReplace( String( RTL_CONSTASCII_USTRINGPARAM( "&lt;" ) ), String( RTL_CONSTASCII_USTRINGPARAM("<") ) );
    2451           0 :                     displayValue.SearchAndReplace( String( RTL_CONSTASCII_USTRINGPARAM( "&gt;" ) ), String( RTL_CONSTASCII_USTRINGPARAM(">") ) );
    2452           0 :                     displayValue.SearchAndReplace( String( RTL_CONSTASCII_USTRINGPARAM( "&quot;" ) ), String( RTL_CONSTASCII_USTRINGPARAM("\"") ) );
    2453           0 :                     displayValue.SearchAndReplace( String( RTL_CONSTASCII_USTRINGPARAM( "&amp;" ) ), String( RTL_CONSTASCII_USTRINGPARAM("&") ) );
    2454           0 :                     listValues.push_back( displayValue );
    2455           0 :                     if( sLine.Search( sSelected ) != STRING_NOTFOUND )
    2456           0 :                         selectedIndices.push_back( static_cast< sal_Int16 >( listValues.size() ) - 1 );
    2457           0 :                 }
    2458             :             }
    2459             :         }
    2460           0 :     }
    2461           0 :     if ( !listValues.empty() )
    2462             :     {
    2463           0 :         msListData.realloc( listValues.size() );
    2464           0 :         sal_Int32 index = 0;
    2465           0 :         for( std::vector< rtl::OUString >::iterator it = listValues.begin(); it != listValues.end(); ++it, ++index )
    2466           0 :              msListData[ index ] = *it;
    2467             :     }
    2468           0 :     if ( !selectedIndices.empty() )
    2469             :     {
    2470           0 :         msIndices.realloc( selectedIndices.size() );
    2471           0 :         sal_Int32 index = 0;
    2472           0 :         for( std::vector< sal_Int16 >::iterator it = selectedIndices.begin(); it != selectedIndices.end(); ++it, ++index )
    2473           0 :              msIndices[ index ] = *it;
    2474             :     }
    2475           0 :     return sal_True;
    2476             : }
    2477             : 
    2478             : 
    2479             : void
    2480           0 : HtmlSelectModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const
    2481             : {
    2482           0 :    rPropMap.setProperty( PROP_StringItemList, msListData );
    2483           0 :    rPropMap.setProperty( PROP_SelectedItems, msIndices );
    2484           0 :    rPropMap.setProperty( PROP_Dropdown, true );
    2485           0 :    AxListBoxModel::convertProperties( rPropMap, rConv );
    2486           0 : }
    2487             : 
    2488           0 : HtmlTextBoxModel::HtmlTextBoxModel()
    2489             : {
    2490           0 : }
    2491             : 
    2492             : bool
    2493           0 : HtmlTextBoxModel::importBinaryModel( BinaryInputStream& rInStrm )
    2494             : {
    2495             : #ifdef DEBUG
    2496             :     OUString sStringContents = rInStrm.readUnicodeArray( rInStrm.size() );
    2497             :     // in msocximex ( where this is ported from, it appears *nothing* is read
    2498             :     // from the control stream ), surely there is some useful info there ?
    2499             :     OSL_TRACE("HtmlTextBoxModel::importBinaryModel - string contents of stream :");
    2500             :     OSL_TRACE("%s", rtl::OUStringToOString( sStringContents, RTL_TEXTENCODING_UTF8 ).getStr() );
    2501             : #else
    2502             :     (void) rInStrm;
    2503             : #endif
    2504           0 :     return true;
    2505             : }
    2506             : // ============================================================================
    2507             : 
    2508          24 : EmbeddedControl::EmbeddedControl( const OUString& rName ) :
    2509          24 :     maName( rName )
    2510             : {
    2511          24 : }
    2512             : 
    2513          24 : EmbeddedControl::~EmbeddedControl()
    2514             : {
    2515          24 : }
    2516             : 
    2517          20 : ControlModelBase* EmbeddedControl::createModelFromGuid( const OUString& rClassId )
    2518             : {
    2519          20 :     OUString aClassId = rClassId;//.toAsciiUpperCase();
    2520             : 
    2521          20 :     if( aClassId.equalsIgnoreAsciiCaseAscii( AX_GUID_COMMANDBUTTON ) )     return &createModel< AxCommandButtonModel >();
    2522          12 :     if( aClassId.equalsIgnoreAsciiCaseAscii( AX_GUID_LABEL ) )             return &createModel< AxLabelModel >();
    2523          12 :     if( aClassId.equalsIgnoreAsciiCaseAscii( AX_GUID_IMAGE ) )             return &createModel< AxImageModel >();
    2524          12 :     if( aClassId.equalsIgnoreAsciiCaseAscii( AX_GUID_TOGGLEBUTTON ) )      return &createModel< AxToggleButtonModel >();
    2525          12 :     if( aClassId.equalsIgnoreAsciiCaseAscii( AX_GUID_CHECKBOX ) )          return &createModel< AxCheckBoxModel >();
    2526          12 :     if( aClassId.equalsIgnoreAsciiCaseAscii( AX_GUID_OPTIONBUTTON ) )      return &createModel< AxOptionButtonModel >();
    2527          12 :     if( aClassId.equalsIgnoreAsciiCaseAscii( AX_GUID_TEXTBOX ) )           return &createModel< AxTextBoxModel >();
    2528           8 :     if( aClassId.equalsIgnoreAsciiCaseAscii( AX_GUID_LISTBOX ) )           return &createModel< AxListBoxModel >();
    2529           8 :     if( aClassId.equalsIgnoreAsciiCaseAscii( AX_GUID_COMBOBOX ) )          return &createModel< AxComboBoxModel >();
    2530           8 :     if( aClassId.equalsIgnoreAsciiCaseAscii( AX_GUID_SPINBUTTON ) )        return &createModel< AxSpinButtonModel >();
    2531           8 :     if( aClassId.equalsIgnoreAsciiCaseAscii( AX_GUID_SCROLLBAR ) )         return &createModel< AxScrollBarModel >();
    2532           8 :     if( aClassId.equalsIgnoreAsciiCaseAscii( AX_GUID_FRAME ) )             return &createModel< AxFrameModel >();
    2533           8 :     if( aClassId.equalsIgnoreAsciiCaseAscii( COMCTL_GUID_SCROLLBAR_60 ) )  return &createModel< ComCtlScrollBarModel >( COMCTL_VERSION_60 );
    2534           8 :     if( aClassId.equalsIgnoreAsciiCaseAscii( HTML_GUID_SELECT ) )  return &createModel< HtmlSelectModel >();
    2535           8 :     if( aClassId.equalsIgnoreAsciiCaseAscii( HTML_GUID_TEXTBOX ) ) return &createModel< HtmlTextBoxModel >();
    2536             : 
    2537           8 :     mxModel.reset();
    2538           8 :     return 0;
    2539             : }
    2540             : 
    2541           2 : OUString EmbeddedControl::getServiceName() const
    2542             : {
    2543           2 :     return mxModel.get() ? mxModel->getServiceName() : OUString();
    2544             : }
    2545             : 
    2546          12 : bool EmbeddedControl::convertProperties( const Reference< XControlModel >& rxCtrlModel, const ControlConverter& rConv ) const
    2547             : {
    2548          12 :     if( mxModel.get() && rxCtrlModel.is() && !maName.isEmpty() )
    2549             :     {
    2550          12 :         PropertyMap aPropMap;
    2551          12 :         aPropMap.setProperty( PROP_Name, maName );
    2552             :         try
    2553             :         {
    2554          12 :             aPropMap.setProperty( PROP_GenerateVbaEvents, true);
    2555             :         }
    2556           0 :         catch (const Exception& e)
    2557             :         {
    2558             :             SAL_WARN("oox", "exception: " << e.Message);
    2559             :         }
    2560          12 :         mxModel->convertProperties( aPropMap, rConv );
    2561          12 :         PropertySet aPropSet( rxCtrlModel );
    2562          12 :         aPropSet.setProperties( aPropMap );
    2563          12 :         return true;
    2564             :     }
    2565           0 :     return false;
    2566             : }
    2567             : 
    2568           2 : bool EmbeddedControl::convertFromProperties( const Reference< XControlModel >& rxCtrlModel, const ControlConverter& rConv )
    2569             : {
    2570           2 :     if( mxModel.get() && rxCtrlModel.is() && !maName.isEmpty() )
    2571             :     {
    2572           2 :         PropertySet aPropSet( rxCtrlModel );
    2573           2 :         aPropSet.getProperty( maName, PROP_Name );
    2574           2 :         mxModel->convertFromProperties( aPropSet, rConv );
    2575           2 :         return true;
    2576             :     }
    2577           0 :     return false;
    2578             : }
    2579             : 
    2580             : // ============================================================================
    2581             : 
    2582           2 : EmbeddedForm::EmbeddedForm( const Reference< XModel >& rxDocModel,
    2583             :         const Reference< XDrawPage >& rxDrawPage, const GraphicHelper& rGraphicHelper, bool bDefaultColorBgr ) :
    2584             :     maControlConv( rxDocModel, rGraphicHelper, bDefaultColorBgr ),
    2585             :     mxModelFactory( rxDocModel, UNO_QUERY ),
    2586           2 :     mxFormsSupp( rxDrawPage, UNO_QUERY )
    2587             : {
    2588             :     OSL_ENSURE( mxModelFactory.is(), "EmbeddedForm::EmbeddedForm - missing service factory" );
    2589           2 : }
    2590             : 
    2591           2 : Reference< XControlModel > EmbeddedForm::convertAndInsert( const EmbeddedControl& rControl, sal_Int32& rnCtrlIndex )
    2592             : {
    2593           2 :     if( mxModelFactory.is() && rControl.hasModel() ) try
    2594             :     {
    2595             :         // create the UNO control model
    2596           2 :         OUString aServiceName = rControl.getServiceName();
    2597           2 :         Reference< XFormComponent > xFormComp( mxModelFactory->createInstance( aServiceName ), UNO_QUERY_THROW );
    2598           2 :         Reference< XControlModel > xCtrlModel( xFormComp, UNO_QUERY_THROW );
    2599             : 
    2600             :         // insert the control into the form
    2601           2 :         Reference< XIndexContainer > xFormIC( createXForm(), UNO_SET_THROW );
    2602           2 :         rnCtrlIndex = xFormIC->getCount();
    2603           2 :         xFormIC->insertByIndex( rnCtrlIndex, Any( xFormComp ) );
    2604             : 
    2605             :         // convert the control properties
    2606           2 :         if( rControl.convertProperties( xCtrlModel, maControlConv ) )
    2607           2 :             return xCtrlModel;
    2608             :     }
    2609           0 :     catch (const Exception& e)
    2610             :     {
    2611             :         SAL_WARN("oox", "exception creating Control: " << e.Message);
    2612             :     }
    2613           0 :     return Reference< XControlModel >();
    2614             : }
    2615             : 
    2616           2 : Reference< XIndexContainer > EmbeddedForm::createXForm()
    2617             : {
    2618           2 :     if( mxFormsSupp.is() )
    2619             :     {
    2620             :         try
    2621             :         {
    2622           2 :             Reference< XNameContainer > xFormsNC( mxFormsSupp->getForms(), UNO_SET_THROW );
    2623           2 :             OUString aFormName = CREATE_OUSTRING( "Standard" );
    2624           2 :             if( xFormsNC->hasByName( aFormName ) )
    2625             :             {
    2626           0 :                 mxFormIC.set( xFormsNC->getByName( aFormName ), UNO_QUERY_THROW );
    2627             :             }
    2628           2 :             else if( mxModelFactory.is() )
    2629             :             {
    2630           2 :                 Reference< XForm > xForm( mxModelFactory->createInstance( CREATE_OUSTRING( "com.sun.star.form.component.Form" ) ), UNO_QUERY_THROW );
    2631           2 :                 xFormsNC->insertByName( aFormName, Any( xForm ) );
    2632           2 :                 mxFormIC.set( xForm, UNO_QUERY_THROW );
    2633           2 :             }
    2634             :         }
    2635           0 :         catch (const Exception& e)
    2636             :         {
    2637             :             SAL_WARN("oox", "exception creating Form: " << e.Message);
    2638             :         }
    2639             :         // always clear the forms supplier to not try to create the form again
    2640           2 :         mxFormsSupp.clear();
    2641             :     }
    2642           2 :     return mxFormIC;
    2643             : }
    2644             : 
    2645             : // ============================================================================
    2646             : 
    2647             : } // namespace ole
    2648         174 : } // namespace oox
    2649             : 
    2650             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10