summaryrefslogtreecommitdiff
path: root/filter/source/msfilter/msocximex.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'filter/source/msfilter/msocximex.cxx')
-rw-r--r--filter/source/msfilter/msocximex.cxx5960
1 files changed, 5960 insertions, 0 deletions
diff --git a/filter/source/msfilter/msocximex.cxx b/filter/source/msfilter/msocximex.cxx
new file mode 100644
index 000000000000..f55873c41ebc
--- /dev/null
+++ b/filter/source/msfilter/msocximex.cxx
@@ -0,0 +1,5960 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: msocximex.cxx,v $
+ * $Revision: 1.38 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_filter.hxx"
+
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */
+#include <com/sun/star/uno/Any.h>
+#include <com/sun/star/text/VertOrientation.hpp>
+#include <com/sun/star/text/XText.hpp>
+#ifndef _COM_SUN_STAR_LANG_XSERVICEINFO_HDL_
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#endif
+#include <com/sun/star/text/TextContentAnchorType.hpp>
+#include <com/sun/star/drawing/XShape.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/drawing/XDrawPage.hpp>
+#include <com/sun/star/drawing/XShapes.hpp>
+#include <com/sun/star/drawing/XControlShape.hpp>
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#include <com/sun/star/container/XIndexContainer.hpp>
+#include <com/sun/star/drawing/XDrawPageSupplier.hpp>
+#include <com/sun/star/form/XFormsSupplier.hpp>
+#include <com/sun/star/form/XForm.hpp>
+#include <com/sun/star/form/FormComponentType.hpp>
+#include <com/sun/star/awt/FontWeight.hpp>
+#include <com/sun/star/awt/FontSlant.hpp>
+#include <com/sun/star/awt/FontUnderline.hpp>
+#include <com/sun/star/awt/FontStrikeout.hpp>
+#include <com/sun/star/awt/ScrollBarOrientation.hpp>
+#include <com/sun/star/style/VerticalAlignment.hpp>
+#include <comphelper/extract.hxx>
+#include <com/sun/star/awt/XControlModel.hpp>
+#include <com/sun/star/io/XInputStreamProvider.hpp>
+#include <rtl/ustrbuf.hxx>
+#include <vcl/svapp.hxx>
+#include <sfx2/objsh.hxx>
+#include <xmlscript/xmldlg_imexp.hxx>
+#include <filter/msfilter/msocximex.hxx>
+#include <osl/file.hxx>
+#include <unotools/ucbstreamhelper.hxx>
+#include <com/sun/star/embed/XStorage.hpp>
+#include <com/sun/star/embed/XTransactedObject.hpp>
+#include <com/sun/star/embed/ElementModes.hpp>
+#include <comphelper/processfactory.hxx> // shouldn't be needed
+#include <com/sun/star/ucb/XSimpleFileAccess.hpp>
+#include <algorithm>
+#include <memory>
+
+#ifndef C2S
+#define C2S(cChar) String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM(cChar))
+#endif
+#ifndef C2U
+#define C2U(cChar) rtl::OUString::createFromAscii(cChar)
+#endif
+
+using namespace ::com::sun::star;
+using namespace ::rtl;
+using namespace cppu;
+
+
+#define WW8_ASCII2STR(s) String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM(s))
+
+
+static char sWW8_form[] = "WW-Standard";
+
+
+struct SortOrderByTabPos
+{
+ bool operator()( const OCX_Control* a, const OCX_Control* b )
+ {
+ return a->mnTabPos < b->mnTabPos;
+ }
+};
+
+
+sal_uInt8 __READONLY_DATA OCX_Control::aObjInfo[4] = { 0x00, 0x12, 0x03, 0x00 };
+
+long ReadAlign(SvStorageStream *pS, long nPos, int nAmount)
+{
+ if (long nAlign = nPos % nAmount)
+ {
+
+ long nLen = nAmount - nAlign;
+ pS->SeekRel(nLen);
+ return nLen;
+ }
+ return 0;
+}
+
+
+// NP - Images in controls in OO2.0/SO8 exist as links, e.g. they are not part of the document so are
+// referenced externally. On import from ms document try to save images for controls here.
+// Images are stored in directory called temp in the user installation directory. Next version of OO/SO
+// hopefully will address this issue and allow a choice e.g. images for controls to be stored as links
+// or embeded in the document.
+
+// [out]location path to the stream to where the image is to be stored,
+// if same name exists in folder then this function calcuates a new name
+// [in] data raw bytes of image to be stored.
+// [in] dataLen no. byte to be stored
+//
+// returns, true if successful
+
+bool storePictureInFileSystem( OUString& location, sal_uInt8* data, sal_uInt32 dataLen )
+{
+ bool result = true;
+ OUString origPath = location;
+ try
+ {
+ uno::Reference<lang::XMultiServiceFactory > xMSF( ::comphelper::getProcessServiceFactory(),
+ uno::UNO_QUERY_THROW );
+ uno::Reference< com::sun::star::ucb::XSimpleFileAccess> xSFA( xMSF->createInstance(
+ S2U("com.sun.star.ucb.SimpleFileAccess" ) ),
+ uno::UNO_QUERY_THROW );
+ OUString ext;
+ sal_Int32 index = 0;
+ while ( xSFA->exists( location ) )
+ {
+ ext = OUString::valueOf( ++index );
+ location = origPath + ext;
+ }
+
+ SvStream* pStream = ::utl::UcbStreamHelper::CreateStream( location, STREAM_WRITE | STREAM_TRUNC );
+ if ( pStream )
+ {
+ pStream->Write(data, dataLen);
+ delete pStream;
+ }
+ else
+ {
+ result = false;
+ }
+ }
+ catch( uno::Exception& )
+ {
+ result = false;
+ }
+ return result;
+}
+
+// NP - Images in controls in OO2.0/SO8 exist as links, e.g. they are not part of the document so are
+// referenced externally. On import from ms document try to save images from controls here so this
+// at least a macro programmer has a chance to accessed them manually later. Next version of OO/SO
+// hopefully will address this issue.
+// Images will be stored in a top level folder in the document package, folder is named "MigratedImages"
+
+// [in] pDocSh* the document shell.
+// [in] name name of stream image to stored in.
+// [in] data raw bytes of image to be stored.
+// [in] dataLen no. byte to be stored
+
+bool storePictureInDoc( SfxObjectShell* pDocSh, OUString& name, sal_uInt8* data, sal_uInt32 dataLen )
+{
+ uno::Reference < embed::XStorage > xStor;
+ if (pDocSh)
+ {
+ xStor = pDocSh->GetStorage();
+ if( xStor.is() )
+ {
+ try
+ {
+ uno::Reference< embed::XStorage > xPictures = xStor->openStorageElement(
+ OUString( RTL_CONSTASCII_USTRINGPARAM( "MigratedImages" ) ),
+ embed::ElementModes::READWRITE );
+ uno::Reference< beans::XPropertySet > xPropSet( xPictures, uno::UNO_QUERY );
+
+ // Set media type of folder MigratedImages to something ( that is unknown ) so that
+ // it will get copied to exported OO/SO format after SaveAs
+ if ( xPropSet.is() )
+ {
+ OUString aMediaType = C2U("MigrationImages");
+ uno::Any a;
+ a <<= aMediaType;
+ xPropSet->setPropertyValue( C2U("MediaType"), a );
+ }
+
+ uno::Reference< io::XStream > xObjReplStr = xPictures->openStreamElement(
+ name,
+ embed::ElementModes::READWRITE | embed::ElementModes::TRUNCATE );
+ uno::Reference< io::XOutputStream > xOutStream( xObjReplStr->getOutputStream(), uno::UNO_QUERY_THROW );
+ uno::Sequence< sal_Int8 > imageBytes( (sal_Int8*)data, dataLen );
+ xOutStream->writeBytes( imageBytes );
+ xOutStream->closeOutput();
+
+ uno::Reference< embed::XTransactedObject > xTransact( xPictures, uno::UNO_QUERY );
+ if ( xTransact.is() )
+ {
+ xTransact->commit();
+ }
+ }
+ catch( uno::Exception& )
+ {
+ return false;
+ }
+
+ }
+ else
+ {
+ // no storage something wrong
+ return false;
+ }
+ }
+ else
+ {
+ //No doc shell
+ return false;
+ }
+ return true;
+}
+
+long WriteAlign(SvStorageStream *pS, int nAmount)
+{
+ if (long nAlign = pS->Tell() % nAmount)
+ {
+ long nLen = nAmount - nAlign;
+ for (long i=0; i< nLen; ++i)
+ *pS << sal_uInt8(0x00);
+ return nLen;
+ }
+ return 0;
+}
+// string import/export =======================================================
+/** #117832# import of form control names
+* control name is located in stream ("\3OCXNAME")
+* a strings in "\3OCXNAME" stream seem to be terminated by 4 trailing bytes of 0's.
+* ====
+* Note: If the string in the stream is overwritten by a shorter string
+* some characters from the original string may remain, the new string however
+* will still be terminated in the same way e.g. by 4 bytes with value 0.
+*/
+
+bool writeOCXNAME( const OUString& sOCXName, SvStorageStream* pStream )
+{
+ const sal_Unicode* buffer = sOCXName.getStr();
+ for ( sal_Int32 index=0; index < sOCXName.getLength(); index++ )
+ {
+ sal_uInt16 ch = static_cast< sal_uInt16 >( buffer[ index ] );
+ *pStream << ch;
+ }
+ // write
+ *pStream << sal_uInt32(0);
+ return ( SVSTREAM_OK == pStream->GetError() );
+
+}
+
+bool readOCXNAME( OUString& sCName, SvStorageStream* pStream )
+{
+ /*
+ * Read uniCode until no data or 0 encountered
+ */
+ OUStringBuffer buf(40);
+ do
+ {
+ sal_uInt16 ch = 0;
+ *pStream >> ch;
+ sal_Unicode uni = static_cast< sal_Unicode >( ch );
+ if ( uni == 0 )
+ {
+ break;
+ }
+ buf.append( &uni, 1 );
+
+ } while ( !pStream->IsEof() );
+
+ sCName = buf.makeStringAndClear();
+ return ( SVSTREAM_OK == pStream->GetError() );
+}
+
+
+/* #110435# (DR, 2003-11-12) ** Import of Unicode strings in form controls **
+
+ Strings may be stored either as compressed or uncompressed Unicode
+ character array. There are no encoded byte strings anywhere.
+
+ The string length field stores the length of the character array (not the
+ character count of the string) in the lower 31 bits, and the compression
+ state in the highest bit.
+
+ A set bit means the character array is compressed. This means all Unicode
+ characters are <=0xFF. Therefore the high bytes of all characters are left
+ out, and the character array size is equal to the string length.
+
+ A cleared bit means the character array is not compressed. The buffer
+ contains Little-Endian Unicode characters, and the resulting string length
+ is half the buffer size.
+
+ TODO: This implementation of the new string import is a hack to keep
+ msocximex.hxx unchanged. A better implementation would replace the char*
+ members of all classes by something more reasonable.
+ */
+
+namespace {
+
+const sal_uInt32 SVX_MSOCX_SIZEMASK = 0x7FFFFFFF; /// Mask for character buffer size.
+const sal_uInt32 SVX_MSOCX_COMPRESSED = 0x80000000; /// 1 = compressed Unicode array.
+
+
+/** Returns true, if the passed length field specifies a compressed character array.
+ */
+inline bool lclIsCompressed( sal_uInt32 nLenFld )
+{
+ return (nLenFld & SVX_MSOCX_COMPRESSED) != 0;
+}
+
+
+/** Extracts and returns the memory size of the character buffer.
+ @return Character buffer size (may differ from resulting string length!).
+ */
+inline sal_uInt32 lclGetBufferSize( sal_uInt32 nLenFld )
+{
+ return nLenFld & SVX_MSOCX_SIZEMASK;
+}
+
+
+// import ---------------------------------------------------------------------
+
+/** Reads the character array of a string in a form control.
+
+ Creates a new character array containing the character data.
+ The length field must be read before and passed to this function.
+ Aligns stream position to multiple of 4 before.
+
+ @param rStrm
+ The input stream.
+
+ @param rpcCharArr
+ (out-param) Will point to the created character array,
+ or will be 0 if string is empty. The array is NOT null-terminated.
+ If the passed pointer points to an old existing array, it will be
+ deleted before. Caller must delete the returned array.
+
+ @param nLenFld
+ The corresponding string length field read somewhere before.
+ */
+void lclReadCharArray( SvStorageStream& rStrm, char*& rpcCharArr, sal_uInt32 nLenFld, long nPos )
+{
+ delete[] rpcCharArr;
+ rpcCharArr = 0;
+ sal_uInt32 nBufSize = lclGetBufferSize( nLenFld );
+ DBG_ASSERT( nBufSize <= 0xFFFF, "lclReadCharArray - possible read error: char array is too big" );
+ if( nBufSize && nBufSize <= 0xFFFF )
+ {
+ rpcCharArr = new char[ nBufSize ];
+ if( rpcCharArr )
+ {
+ ReadAlign( &rStrm, nPos, 4 );
+ rStrm.Read( rpcCharArr, nBufSize );
+ }
+ }
+}
+
+
+/** Creates an OUString from a character array created with lclReadCharArray().
+
+ The passed parameters must match, that means the length field must be the
+ same used to create the passed character array.
+
+ @param pcCharArr
+ The character array returned by lclReadCharArray(). May be compressed
+ or uncompressed, next parameter nLenFld will specify this.
+
+ @param nLenFld
+ MUST be the same string length field that has been passed to
+ lclReadCharArray() to create the character array in previous parameter
+ pcCharArr.
+
+ @return
+ An OUString containing the decoded string data. Will be empty if
+ pcCharArr is 0.
+ */
+OUString lclCreateOUString( const char* pcCharArr, sal_uInt32 nLenFld )
+{
+ OUStringBuffer aBuffer;
+ sal_uInt32 nBufSize = lclGetBufferSize( nLenFld );
+ if( lclIsCompressed( nLenFld ) )
+ {
+ // buffer contains compressed Unicode, not encoded bytestring
+ sal_Int32 nStrLen = static_cast< sal_Int32 >( nBufSize );
+ aBuffer.setLength( nStrLen );
+ const char* pcCurrChar = pcCharArr;
+ for( sal_Int32 nChar = 0; nChar < nStrLen; ++nChar, ++pcCurrChar )
+ /* *pcCurrChar may contain negative values and therefore MUST be
+ casted to unsigned char, before assigned to a sal_Unicode. */
+ aBuffer.setCharAt( nChar, static_cast< unsigned char >( *pcCurrChar ) );
+ }
+ else
+ {
+ // buffer contains Little-Endian Unicode
+ sal_Int32 nStrLen = static_cast< sal_Int32 >( nBufSize ) / 2;
+ aBuffer.setLength( nStrLen );
+ const char* pcCurrChar = pcCharArr;
+ for( sal_Int32 nChar = 0; nChar < nStrLen; ++nChar )
+ {
+ /* *pcCurrChar may contain negative values and therefore MUST be
+ casted to unsigned char, before assigned to a sal_Unicode. */
+ sal_Unicode cChar = static_cast< unsigned char >( *pcCurrChar++ );
+ cChar |= (static_cast< unsigned char >( *pcCurrChar++ ) << 8);
+ aBuffer.setCharAt( nChar, cChar );
+ }
+ }
+ return aBuffer.makeStringAndClear();
+}
+
+// export ---------------------------------------------------------------------
+
+/** This class implements writing a character array from a Unicode string.
+
+ Usage:
+ 1) Construct an instance, either directly with an OUString, or with an UNO
+ Any containing an OUString.
+ 2) Check with HasData(), if there is something to write.
+ 3) Write the string length field with WriteLenField() at the right place.
+ 4) Write the encoded character array with WriteCharArray().
+ */
+class SvxOcxString
+{
+public:
+ /** Constructs an empty string. String data may be set later by assignment. */
+ inline explicit SvxOcxString() : mnLenFld( 0 ) {}
+ /** Constructs the string from the passed OUString. */
+ inline explicit SvxOcxString( const OUString& rStr ) { Init( rStr ); }
+ /** Constructs the string from the passed UNO Any. */
+ inline explicit SvxOcxString( const uno::Any& rAny ) { Init( rAny ); }
+
+ /** Assigns the passed string to the object. */
+ inline SvxOcxString& operator=( const OUString& rStr ) { Init( rStr ); return *this; }
+ /** Assigns the string in the passed UNO Any to the object. */
+ inline SvxOcxString& operator=( const uno::Any& rAny ) { Init( rAny ); return *this; }
+
+ /** Returns true, if the string contains at least one character to write. */
+ inline bool HasData() const { return maString.getLength() > 0; }
+
+ /** Writes the encoded 32-bit string length field. Aligns stream position to mult. of 4 before. */
+ void WriteLenField( SvStorageStream& rStrm ) const;
+ /** Writes the encoded character array. Aligns stream position to mult. of 4 before. */
+ void WriteCharArray( SvStorageStream& rStrm ) const;
+
+private:
+ inline void Init( const OUString& rStr ) { maString = rStr; Init(); }
+ void Init( const uno::Any& rAny );
+ void Init();
+
+ OUString maString; /// The initial string data.
+ sal_uInt32 mnLenFld; /// The encoded string length field.
+};
+
+void SvxOcxString::Init( const uno::Any& rAny )
+{
+ if( !(rAny >>= maString) )
+ maString = OUString();
+ Init();
+}
+
+void SvxOcxString::Init()
+{
+ mnLenFld = static_cast< sal_uInt32 >( maString.getLength() );
+ bool bCompr = true;
+ // try to find a character >= 0x100 -> character array will be stored uncompressed then
+ if( const sal_Unicode* pChar = maString.getStr() )
+ for( const sal_Unicode* pEnd = pChar + maString.getLength(); bCompr && (pChar < pEnd); ++pChar )
+ bCompr = (*pChar < 0x100);
+ if( bCompr )
+ mnLenFld |= SVX_MSOCX_COMPRESSED;
+ else
+ mnLenFld *= 2;
+}
+
+void SvxOcxString::WriteLenField( SvStorageStream& rStrm ) const
+{
+ if( HasData() )
+ {
+ WriteAlign( &rStrm, 4);
+ rStrm << mnLenFld;
+ }
+}
+
+void SvxOcxString::WriteCharArray( SvStorageStream& rStrm ) const
+{
+ if( HasData() )
+ {
+ const sal_Unicode* pChar = maString.getStr();
+ const sal_Unicode* pEnd = pChar + maString.getLength();
+ bool bCompr = lclIsCompressed( mnLenFld );
+
+ WriteAlign( &rStrm, 4);
+ for( ; pChar < pEnd; ++pChar )
+ {
+ // write compressed Unicode (not encoded bytestring), or Little-Endian Unicode
+ rStrm << static_cast< sal_uInt8 >( *pChar );
+ if( !bCompr )
+ rStrm << static_cast< sal_uInt8 >( *pChar >> 8 );
+ }
+ }
+}
+
+const sal_uInt16 USERFORM = (sal_uInt16)0xFF;
+const sal_uInt16 STDCONTAINER = (sal_uInt16)0xFE;
+
+const sal_uInt16 PAGE = (sal_uInt16)0x07;
+
+const sal_uInt16 IMAGE = (sal_uInt16)0x0C;
+const sal_uInt16 FRAME = (sal_uInt16)0x0E;
+
+const sal_uInt16 SPINBUTTON = (sal_uInt16)0x10;
+const sal_uInt16 CMDBUTTON = (sal_uInt16)0x11;
+const sal_uInt16 TABSTRIP = (sal_uInt16)0x12;
+
+const sal_uInt16 LABEL = (sal_uInt16)0x15;
+
+const sal_uInt16 TEXTBOX = (sal_uInt16)0x17;
+const sal_uInt16 LISTBOX = (sal_uInt16)0x18;
+const sal_uInt16 COMBOBOX = (sal_uInt16)0x19;
+const sal_uInt16 CHECKBOX = (sal_uInt16)0x1A;
+
+const sal_uInt16 OPTIONBUTTON = (sal_uInt16)0x1B;
+const sal_uInt16 TOGGLEBUTTON = (sal_uInt16)0x1C;
+
+const sal_uInt16 SCROLLBAR = (sal_uInt16)0x2F;
+
+const sal_uInt16 MULTIPAGE = (sal_uInt16)0x39;
+const sal_uInt16 PROGRESSBAR = (sal_uInt16)0x8000;
+
+typedef std::vector< ContainerRecord > ContainerRecordList;
+
+class ContainerRecReader
+{
+ public:
+
+ virtual ~ContainerRecReader() {}
+
+ virtual bool Read( OCX_ContainerControl* pContainerControl, SvStorageStream *pS)
+ {
+ *pS >> nNoRecords;
+ *pS >> nTotalLen;
+
+ if ( isMultiPage )
+ {
+ if ( !handleMultiPageHdr( pS ) )
+ {
+ return false;
+ }
+ }
+ else
+ {
+ if ( !handleStandardHdr( pS ) )
+ {
+ return false;
+ }
+ }
+
+ records.clear();
+ for (sal_uInt32 nRecord = 0; nRecord < nNoRecords; ++nRecord)
+ {
+ // DR #134146# redo loading of FrameChild data
+
+ ContainerRecord rec;
+
+ // record header
+ sal_uInt16 nId, nSize;
+ *pS >> nId >> nSize;
+ sal_Size nStartPos = pS->Tell();
+
+ // content flags
+ sal_uInt32 nContentFlags;
+ *pS >> nContentFlags;
+
+ // length of control name
+ sal_uInt32 nNameLen = 0;
+ if( nContentFlags & 0x00000001 )
+ *pS >> nNameLen;
+ // length of control tag
+ sal_uInt32 nTagLen = 0;
+ if( nContentFlags & 0x00000002 )
+ *pS >> nTagLen;
+ // substorage id for frames
+ if( nContentFlags & 0x00000004 )
+ *pS >> rec.nSubStorageId;
+ // help-context id
+ if( nContentFlags & 0x00000008 )
+ pS->SeekRel( 4 );
+ // option flags
+ if( nContentFlags & 0x00000010 )
+ {
+ sal_uInt32 nBitFlags = 0;
+ *pS >> nBitFlags;
+ rec.bVisible = ( ( nBitFlags & 0x02 ) == 0x02 );
+ }
+ // substream size
+ if( nContentFlags & 0x00000020 )
+ *pS >> rec.nSubStreamLen;
+ // tabstop position
+ if( nContentFlags & 0x00000040 )
+ *pS >> rec.nTabPos;
+ // control type
+ if( nContentFlags & 0x00000080 )
+ *pS >> rec.nTypeIdent;
+ // length of infotip
+ sal_uInt32 nTipLen = 0;
+ if( nContentFlags & 0x00000800 )
+ {
+ ReadAlign( pS, pS->Tell() - nStartPos, 4 );
+ *pS >> nTipLen;
+ }
+
+ sal_uInt32 nCntrlIdLen = 0;
+ if( nContentFlags & 0x00001000 )
+ *pS >> nCntrlIdLen;
+
+ // length of control source name
+ sal_uInt32 nCtrlSrcLen = 0;
+ if( nContentFlags & 0x00002000 )
+ {
+ ReadAlign( pS, pS->Tell() - nStartPos, 4 );
+ *pS >> nCtrlSrcLen;
+ }
+
+ // length of row source name
+ sal_uInt32 nRowSrcLen = 0;
+ if( nContentFlags & 0x00004000 )
+ {
+ ReadAlign( pS, pS->Tell() - nStartPos, 4 );
+ *pS >> nRowSrcLen;
+ }
+
+ // control name
+ sal_Char* pName = 0;
+ sal_uInt32 nNameBufSize = lclGetBufferSize( nNameLen );
+ if( nNameBufSize > 0 )
+ {
+ pName = new char[ nNameBufSize ];
+ ReadAlign( pS, pS->Tell() - nStartPos, 4 );
+ pS->Read( pName, nNameBufSize );
+ }
+ // control tag
+ sal_uInt32 nTagBufSize = lclGetBufferSize( nTagLen );
+ if( nTagBufSize > 0 )
+ {
+ ReadAlign( pS, pS->Tell() - nStartPos, 4 );
+ pS->SeekRel( nTagBufSize );
+ }
+
+ // control position
+ if( nContentFlags & 0x00000100 )
+ {
+ ReadAlign( pS, pS->Tell() - nStartPos, 4 );
+ *pS >> rec.nLeft >> rec.nTop;
+ }
+
+ // control infotip
+ sal_uInt32 nTipBufSize = lclGetBufferSize( nTipLen );
+ if( nTipBufSize > 0 )
+ {
+ std::auto_ptr< sal_Char > pTipName;
+ pTipName.reset( new sal_Char[ nTipBufSize ] );
+ ReadAlign( pS, pS->Tell() - nStartPos, 4 );
+ pS->Read( pTipName.get(), nTipBufSize );
+ rec.controlTip = lclCreateOUString( pTipName.get(), nTipLen );
+ }
+ // control id
+ sal_uInt32 nCntrlIdSize = lclGetBufferSize( nCntrlIdLen );
+ if( nCntrlIdSize > 0 )
+ {
+ ReadAlign( pS, pS->Tell() - nStartPos, 4 );
+ pS->SeekRel( nCntrlIdSize );
+ }
+ // control source name
+ sal_uInt32 nCtrlSrcBufSize = lclGetBufferSize( nCtrlSrcLen );
+ if( nCtrlSrcBufSize > 0 )
+ {
+ ReadAlign( pS, pS->Tell() - nStartPos, 4 );
+ pS->SeekRel( nCtrlSrcBufSize );
+ }
+ // row source name
+ sal_uInt32 nRowSrcBufSize = lclGetBufferSize( nRowSrcLen );
+ if( nRowSrcBufSize > 0 )
+ {
+ ReadAlign( pS, pS->Tell() - nStartPos, 4 );
+ pS->SeekRel( nRowSrcBufSize );
+ }
+
+ // seek to end of data
+ pS->Seek( nStartPos + nSize );
+
+ rec.cName = lclCreateOUString(pName, nNameLen);
+ delete[] pName;
+
+ OCX_Control* pControl = NULL;
+ if( pContainerControl->createFromContainerRecord( rec, pControl ) &&
+ pControl )
+ {
+ // propagate doc shell from parent
+ pControl->pDocSh = pContainerControl->pDocSh;
+ pContainerControl->ProcessControl( pControl, pS, rec );
+ }
+ else
+ {
+ DBG_ERROR("Terminating import, unexpected error");
+ return false;
+ }
+ }
+ return true;
+ }
+
+ protected:
+ ContainerRecReader() : isMultiPage(false){}
+ bool isMultiPage;
+ sal_uInt32 nNoRecords;
+ sal_uInt32 nTotalLen;
+
+ private:
+ bool handleStandardHdr( SvStorageStream* pS )
+ {
+ sal_uInt8 aUnknown11[4];
+ pS->Read(aUnknown11, sizeof(aUnknown11));
+ return true;
+ }
+
+ bool handleMultiPageHdr( SvStorageStream* pS )
+ {
+ sal_uInt32 nUnknown_32b; // unknown 32 bit structure, flags ?
+ sal_uInt16 nUnknown_16b; // unknown 16 bit structure
+ sal_uInt16 nMysteryLen; // lenght of unknown sub record
+
+ *pS >> nUnknown_32b;
+ *pS >> nUnknown_16b;
+ *pS >> nMysteryLen;
+
+ pS->SeekRel( nMysteryLen );
+ return true;
+ }
+ ContainerRecordList records;
+};
+
+class StdContainerRecReader : public ContainerRecReader
+{
+ public:
+ StdContainerRecReader(){}
+};
+
+class MultiPageContainerRecReader : public ContainerRecReader
+{
+ public:
+ MultiPageContainerRecReader()
+ {
+ // NP ( 27-01-05 )
+ // Strictly speaking this approach shouldn't be necessary.
+ // It should be possible to have a common routine read the
+ // container record array and by examining the flags present in
+ // the record to determine we expect to read or not.
+ // In this case for a MultPage control there is no Top or Left
+ // values in the control record array, however time contraints
+ // and associated risk prevent further investigation of this
+ // at the moment.
+ // similar situation exists for the start of the container record
+ // which in the case of the MultiPage is different from
+ // UserForm & Frame ( the other containers )
+
+ isMultiPage = true; // tell the base class skip
+ }
+};
+
+class ContainerRecordReaderFac
+{
+ public:
+ static ContainerRecReader* instance( sal_uInt32 containerType )
+ {
+ switch( containerType )
+ {
+ case PAGE:
+ case FRAME:
+ case USERFORM:
+ case STDCONTAINER:
+ return new StdContainerRecReader();
+ case MULTIPAGE:
+ return new MultiPageContainerRecReader();
+ default:
+ DBG_ERROR("Illegal container type for factory");
+ return NULL;
+ }
+ }
+ private:
+ ContainerRecordReaderFac();
+};
+
+} // namespace
+
+// ============================================================================
+
+void RBGroup::add(OCX_Control* pRB)
+{
+ // The tab index for the group is calculated as
+ // the lowest tab index found in the list of RadioButtons
+ if ( pRB->mnTabPos < mRBGroupPos )
+ {
+ mRBGroupPos = pRB->mnTabPos;
+ CtrlIterator aEnd = mpControls.end();
+ for (CtrlIterator aIter = mpControls.begin(); aIter != aEnd; ++ aIter )
+ {
+ (*aIter)->mnTabPos = mRBGroupPos;
+ }
+ }
+ mpControls.push_back( pRB );
+}
+
+struct SortGroupByTabPos
+{
+ bool operator()( const RBGroup* a, const RBGroup* b )
+ {
+ return a->tabPos() < b->tabPos();
+ }
+};
+
+RBGroupManager::RBGroupManager( String& defaultName ):mSDefaultName( defaultName ),
+ numRadioButtons(0)
+{
+ groupList.reserve( 8 ); // reserve far more than we expect
+}
+
+RBGroupManager::~RBGroupManager()
+{
+ for ( GroupIterator gIter=groupList.begin(); gIter!=groupList.end(); ++gIter )
+ {
+ delete( *gIter );
+ }
+}
+
+// Loose description of the method below ( I sure there is a better way to do
+// this )
+// In order to "fake" MS grouping behavior for OptionButtons the OptionButtons
+// in the same group need to have consecutive tab indices ( regardless of the
+// imported tab indices of the RadioButtons ). Additionally if two
+// groups of OptionButtons end up having all consecutive indices they
+// will be treated as a single group by OpenOffice. In this case
+// a dummy seperator control needs to be inserted between the groups.
+//
+// This method returns a new list "destinationList" containing the controls
+// passed in "sourceList" and the OptionButtons contained in the various
+// Groups maintained by this class.
+// Controls are ordered in the destination list by tab index.
+// Each RadioButtonGroup has a tab index associated with it.
+// ( Tab index of a RadioGroup is determined as the tab index of the
+// OptionButton control with the lowest tab index in the group )
+
+
+void RBGroupManager::addRadioButton( OCX_OptionButton* pRButton )
+{
+ if ( pRButton )
+ {
+ OUString groupName = mSDefaultName;
+ if ( pRButton->nGroupNameLen )
+ {
+ groupName =
+ lclCreateOUString(pRButton->pGroupName,
+ pRButton->nGroupNameLen);
+ }
+ ++numRadioButtons;
+ RBGroupHash::iterator iter = rbGroups.find( groupName );
+ if ( iter != rbGroups.end() )
+ {
+ iter->second->controls().push_back( pRButton );
+ }
+ else
+ {
+ RBGroup* newGroup = new RBGroup(pRButton->mnTabPos);
+ newGroup->controls().push_back( pRButton );
+ rbGroups[ groupName ] = newGroup;
+ groupList.push_back( newGroup );
+ }
+
+ }
+}
+
+CtrlList RBGroupManager::insertGroupsIntoControlList( const CtrlList& sourceList )
+{
+ ::std::sort( groupList.begin(), groupList.end(), SortGroupByTabPos() );
+ std::vector<OCX_Control*> destinationList;
+ if ( groupList.size() )
+ {
+ destinationList.reserve( sourceList.size() + numRadioButtons );
+
+ GroupIterator groupEnd = groupList.end();
+ CtrlIteratorConst sourceEnd = sourceList.end();
+
+ size_t prevGroupListSize = 0;
+
+ CtrlIteratorConst containees = sourceList.begin();
+ GroupIterator groupIter=groupList.begin();
+ while ( containees != sourceEnd ||
+ groupIter != groupEnd )
+ {
+ bool addGroupSeperator = false;
+ if ( containees != sourceEnd )
+ {
+ if ( groupIter != groupEnd )
+ {
+ sal_Int16 groupTabPos = (*groupIter)->tabPos();
+ if ( (*containees)->mnTabPos >= groupTabPos )
+ {
+ if ( !(destinationList.size() >= prevGroupListSize ))
+ {
+ addGroupSeperator = true;
+ }
+ copyList( (*groupIter)->controls(), destinationList, addGroupSeperator );
+ ++groupIter;
+
+ prevGroupListSize = destinationList.size();
+ }
+ }
+ destinationList.push_back(*containees);
+ ++containees;
+ }
+ else
+ {
+ if ( groupIter != groupEnd )
+ {
+ if ( !(destinationList.size() > prevGroupListSize ))
+ {
+ addGroupSeperator = true;
+ }
+ copyList( (*groupIter)->controls(), destinationList, addGroupSeperator );
+ ++groupIter;
+ prevGroupListSize = destinationList.size();
+ }
+ }
+ }
+ }
+ else
+ {
+ destinationList = sourceList;
+ }
+ return destinationList;
+
+}
+
+
+void RBGroupManager::addSeperator( std::vector< OCX_Control* >& dest )
+{
+ OCX_Control* seperator = new OCX_CommandButton;
+ seperator->SetInDialog(true);
+ seperator->sName = C2S("GroupSeperator");
+ dest.push_back( seperator );
+}
+
+void RBGroupManager::copyList( std::vector< OCX_Control* >& src,
+ std::vector< OCX_Control* >& dest,
+ bool addGroupSeperator )
+{
+ if ( addGroupSeperator )
+ {
+ addSeperator( dest );
+ }
+
+ for ( CtrlIterator rbIter = src.begin(); rbIter != src.end(); ++rbIter )
+ {
+ dest.push_back( *rbIter );
+ }
+}
+
+class OCX_UserFormLabel : public OCX_Label
+{
+public:
+ OCX_UserFormLabel(OCX_Control* pParent ) : OCX_Label( pParent )
+ {
+ mnForeColor = 0x80000012L;
+ mnBackColor = 0x8000000FL;
+ }
+};
+
+
+sal_uInt16 OCX_Control::nStandardId(0x0200);
+sal_uInt16 OCX_FontData::nStandardId(0x0200);
+
+sal_uInt32 OCX_Control::pColor[25] = {
+0xC0C0C0, 0x008080, 0x000080, 0x808080, 0xC0C0C0, 0xFFFFFF, 0x000000,
+0x000000, 0x000000, 0xFFFFFF, 0xC0C0C0, 0xC0C0C0, 0x808080, 0x000080,
+0xFFFFFF, 0xC0C0C0, 0x808080, 0x808080, 0x000000, 0xC0C0C0, 0xFFFFFF,
+0x000000, 0xC0C0C0, 0x000000, 0xFFFFC0 };
+
+void OCX_Control::FillSystemColors()
+{
+ // overwrite the predefined colors with available system colors
+ const StyleSettings& rSett = Application::GetSettings().GetStyleSettings();
+
+ pColor[ 0x00 ] = rSett.GetFaceColor().GetColor();
+ pColor[ 0x01 ] = rSett.GetWorkspaceColor().GetColor();
+ pColor[ 0x02 ] = rSett.GetActiveColor().GetColor();
+ pColor[ 0x03 ] = rSett.GetDeactiveColor().GetColor();
+ pColor[ 0x04 ] = rSett.GetMenuBarColor().GetColor();
+ pColor[ 0x05 ] = rSett.GetWindowColor().GetColor();
+ pColor[ 0x07 ] = rSett.GetMenuTextColor().GetColor();
+ pColor[ 0x08 ] = rSett.GetWindowTextColor().GetColor();
+ pColor[ 0x09 ] = rSett.GetActiveTextColor().GetColor();
+ pColor[ 0x0A ] = rSett.GetActiveBorderColor().GetColor();
+ pColor[ 0x0B ] = rSett.GetDeactiveBorderColor().GetColor();
+ pColor[ 0x0C ] = rSett.GetWorkspaceColor().GetColor();
+ pColor[ 0x0D ] = rSett.GetHighlightColor().GetColor();
+ pColor[ 0x0E ] = rSett.GetHighlightTextColor().GetColor();
+ pColor[ 0x0F ] = rSett.GetFaceColor().GetColor();
+ pColor[ 0x10 ] = rSett.GetShadowColor().GetColor();
+ pColor[ 0x12 ] = rSett.GetButtonTextColor().GetColor();
+ pColor[ 0x13 ] = rSett.GetDeactiveTextColor().GetColor();
+ pColor[ 0x14 ] = rSett.GetHighlightColor().GetColor();
+ pColor[ 0x15 ] = rSett.GetDarkShadowColor().GetColor();
+ pColor[ 0x16 ] = rSett.GetShadowColor().GetColor();
+ pColor[ 0x17 ] = rSett.GetHelpTextColor().GetColor();
+ pColor[ 0x18 ] = rSett.GetHelpColor().GetColor();
+}
+
+sal_uInt32 OCX_Control::ImportColor(sal_uInt32 nColor) const
+{
+ sal_uInt8 nUpper = (sal_uInt8)( nColor >> 24 );
+ if (nUpper & 0x80) //Palette color, should be switch on bottom 24 bits
+ {
+ /*Might as well use my systems ones in the absence of any other ideas*/
+ nColor = nColor&0x00FFFFFF;
+ DBG_ASSERT (nColor <= 24,"Unknown Palette Index");
+ if (nColor > 24)
+ nColor = 0xFFFFFF;
+ else
+ nColor = pColor[nColor];
+ }
+ else
+ {
+ //Stored in bgr! rather than rgb
+ nColor = SwapColor(nColor);
+ }
+ return nColor;
+}
+
+sal_Int16 OCX_FontData::ImportAlign(sal_uInt8 _nJustification) const
+{
+ sal_Int16 nRet;
+ switch (_nJustification)
+ {
+ default:
+ case 1:
+ nRet = 0;
+ break;
+ case 2:
+ nRet = 2;
+ break;
+ case 3:
+ nRet = 1;
+ break;
+ }
+ return nRet;
+}
+
+sal_uInt8 OCX_FontData::ExportAlign(sal_Int16 nAlign) const
+{
+ sal_Int8 nRet;
+ switch (nAlign)
+ {
+ default:
+ case 0:
+ nRet = 1;
+ break;
+ case 2:
+ nRet = 2;
+ break;
+ case 1:
+ nRet = 3;
+ break;
+ }
+ return nRet;
+}
+
+sal_uInt32 OCX_Control::SwapColor(sal_uInt32 nColor) const
+{
+ sal_uInt8
+ r(static_cast<sal_uInt8>(nColor&0xFF)),
+ g(static_cast<sal_uInt8>(((nColor)>>8)&0xFF)),
+ b(static_cast<sal_uInt8>((nColor>>16)&0xFF));
+ nColor = (r<<16) + (g<<8) + b;
+ return nColor;
+}
+
+sal_uInt32 OCX_Control::ExportColor(sal_uInt32 nColor) const
+{
+ sal_uInt8 nUpper = (sal_uInt8)( nColor >> 24 );
+ if (nUpper & 0x80) //Palette color, should be switch on bottom 24 bits
+ {
+ /*Might as well use my systems ones in the absence of any other ideas*/
+ nColor = nColor&0x00FFFFFF;
+ DBG_ASSERT (nColor <= 24,"Unknown Palette Index");
+ if (nColor > 24)
+ nColor = 0xFFFFFF;
+ else
+ nColor = pColor[nColor];
+ }
+
+ //Stored in bgr! rather than rgb
+ nColor = SwapColor(nColor);
+ return nColor;
+}
+
+sal_Bool OCX_Control::Import(
+ const uno::Reference< lang::XMultiServiceFactory > &rServiceFactory,
+ uno::Reference< form::XFormComponent > &rFComp, awt::Size &rSz)
+{
+
+ if(msFormType.getLength() == 0)
+ return sal_False;
+
+ rSz.Width = nWidth;
+ rSz.Height = nHeight;
+
+ uno::Reference<uno::XInterface> xCreate =
+ rServiceFactory->createInstance(msFormType);
+ if (!xCreate.is())
+ return sal_False;
+
+ rFComp = uno::Reference<form::XFormComponent>(xCreate,uno::UNO_QUERY);
+ if (!rFComp.is())
+ return sal_False;
+ uno::Reference<beans::XPropertySet> xPropSet(xCreate,uno::UNO_QUERY);
+ if (!xPropSet.is())
+ return sal_False;
+ return Import(xPropSet);
+}
+
+sal_Bool OCX_Control::Import(uno::Reference<container::XNameContainer> &rDialog
+ )
+{
+ uno::Reference<lang::XMultiServiceFactory>
+ xFactory(rDialog, uno::UNO_QUERY);
+
+ uno::Reference<uno::XInterface> xCreate =
+ xFactory->createInstance(msDialogType);
+ if (!xCreate.is())
+ return sal_False;
+
+ uno::Reference<awt::XControlModel> xModel(xCreate, uno::UNO_QUERY);
+ if (!xModel.is())
+ return sal_False;
+
+ /* #147900# sometimes insertion of a control fails due to existing name,
+ do not break entire form import then... */
+ try
+ {
+ rDialog->insertByName(sName, uno::makeAny(xModel));
+ }
+ catch( uno::Exception& )
+ {
+ DBG_ERRORFILE(
+ ByteString( "OCX_Control::Import - cannot insert control \"" ).
+ Append( ByteString( sName, RTL_TEXTENCODING_UTF8 ) ).
+ Append( '"' ).GetBuffer() );
+ }
+
+ uno::Reference<beans::XPropertySet> xPropSet(xCreate, uno::UNO_QUERY);
+ if (!xPropSet.is())
+ return sal_False;
+
+ if (!Import(xPropSet))
+ return sal_False;
+
+ uno::Any aTmp;
+ aTmp <<= sal_Int32((mnLeft * 2) / 100);
+ xPropSet->setPropertyValue(WW8_ASCII2STR("PositionX"), aTmp);
+ aTmp <<= sal_Int32((mnTop * 2) / 100);
+ xPropSet->setPropertyValue(WW8_ASCII2STR("PositionY"), aTmp);
+ aTmp <<= sal_Int32((nWidth * 2) / 100);
+ xPropSet->setPropertyValue(WW8_ASCII2STR("Width"), aTmp);
+ aTmp <<= sal_Int32((nHeight * 2) / 100);
+ xPropSet->setPropertyValue(WW8_ASCII2STR("Height"), aTmp);
+ if ( msToolTip.Len() > 0 )
+ xPropSet->setPropertyValue(WW8_ASCII2STR("HelpText"), uno::Any(OUString(msToolTip)));
+
+ if ( mnStep )
+ {
+ aTmp <<= mnStep;
+ xPropSet->setPropertyValue(WW8_ASCII2STR("Step"), aTmp);
+ }
+
+ try
+ {
+ xPropSet->setPropertyValue(WW8_ASCII2STR("EnableVisible"), uno::makeAny( mbVisible ) );
+ }
+ catch( uno::Exception& )
+ {
+ }
+ return sal_True;
+}
+
+sal_Int16 OCX_Control::ImportBorder(sal_uInt16 nSpecialEffect,
+ sal_uInt16 nBorderStyle) const
+{
+ if ((nSpecialEffect == 0) && (nBorderStyle == 0))
+ return 0; //No Border
+ else if ((nSpecialEffect == 0) && (nBorderStyle == 1))
+ return 2; //Flat Border
+ return 1; //3D Border
+}
+
+sal_uInt8 OCX_Control::ExportBorder(sal_uInt16 nBorder,sal_uInt8 &rBorderStyle)
+ const
+{
+ sal_uInt8 nRet;
+ switch(nBorder)
+ {
+ case 0:
+ nRet = rBorderStyle = 0;
+ break;
+ default:
+ case 1:
+ nRet = 2;
+ rBorderStyle = 0;
+ break;
+ case 2:
+ nRet = 0;
+ rBorderStyle = 1;
+ break;
+ }
+ return nRet;
+}
+
+sal_Int16 OCX_Control::ImportSpecEffect( sal_uInt8 nSpecialEffect ) const
+{
+ return (nSpecialEffect == 0) ? 2 : 1;
+}
+
+sal_uInt8 OCX_Control::ExportSpecEffect( sal_Int16 nApiEffect ) const
+{
+ return (nApiEffect == 2) ? 0 : 2;
+}
+
+sal_Bool OCX_Control::ReadFontData(SvStorageStream *pS)
+{
+ return aFontData.Read(pS);
+}
+
+
+const uno::Reference< drawing::XDrawPage >&
+ SvxMSConvertOCXControls::GetDrawPage()
+{
+ if( !xDrawPage.is() && pDocSh )
+ {
+ uno::Reference< drawing::XDrawPageSupplier > xTxtDoc(pDocSh->GetModel(),
+ uno::UNO_QUERY);
+ DBG_ASSERT(xTxtDoc.is(),"XDrawPageSupplier nicht vom XModel erhalten");
+ xDrawPage = xTxtDoc->getDrawPage();
+ DBG_ASSERT( xDrawPage.is(), "XDrawPage nicht erhalten" );
+ }
+
+ return xDrawPage;
+}
+
+
+const uno::Reference< lang::XMultiServiceFactory >&
+ SvxMSConvertOCXControls::GetServiceFactory()
+{
+ if( !xServiceFactory.is() && pDocSh )
+ {
+ xServiceFactory = uno::Reference< lang::XMultiServiceFactory >
+ (pDocSh->GetBaseModel(), uno::UNO_QUERY);
+ DBG_ASSERT( xServiceFactory.is(),
+ "XMultiServiceFactory nicht vom Model erhalten" );
+ }
+
+ return xServiceFactory;
+}
+
+const uno::Reference< drawing::XShapes >& SvxMSConvertOCXControls::GetShapes()
+{
+ if( !xShapes.is() )
+ {
+ GetDrawPage();
+ if( xDrawPage.is() )
+ {
+
+ xShapes = uno::Reference< drawing::XShapes >(xDrawPage,
+ uno::UNO_QUERY);
+ DBG_ASSERT( xShapes.is(), "XShapes nicht vom XDrawPage erhalten" );
+ }
+ }
+ return xShapes;
+}
+
+const uno::Reference< container::XIndexContainer >&
+ SvxMSConvertOCXControls::GetFormComps()
+{
+ if( !xFormComps.is() )
+ {
+ GetDrawPage();
+ if( xDrawPage.is() )
+ {
+ uno::Reference< form::XFormsSupplier > xFormsSupplier( xDrawPage,
+ uno::UNO_QUERY );
+ DBG_ASSERT( xFormsSupplier.is(),
+ "XFormsSupplier nicht vom XDrawPage erhalten" );
+
+ uno::Reference< container::XNameContainer > xNameCont =
+ xFormsSupplier->getForms();
+
+ // Das Formular bekommt einen Namen wie "WW-Standard[n]" und
+ // wird in jedem Fall neu angelegt.
+ UniString sName( sWW8_form, RTL_TEXTENCODING_MS_1252 );
+ sal_uInt16 n = 0;
+
+ while( xNameCont->hasByName( sName ) )
+ {
+ sName.AssignAscii( sWW8_form );
+ sName += String::CreateFromInt32( ++n );
+ }
+
+ const uno::Reference< lang::XMultiServiceFactory > &rServiceFactory
+ = GetServiceFactory();
+ if( !rServiceFactory.is() )
+ return xFormComps;
+
+ uno::Reference< uno::XInterface > xCreate =
+ rServiceFactory->createInstance(WW8_ASCII2STR(
+ "com.sun.star.form.component.Form"));
+ if( xCreate.is() )
+ {
+ uno::Reference< beans::XPropertySet > xFormPropSet( xCreate,
+ uno::UNO_QUERY );
+
+ uno::Any aTmp(&sName,getCppuType((OUString *)0));
+ xFormPropSet->setPropertyValue( WW8_ASCII2STR("Name"), aTmp );
+
+ uno::Reference< form::XForm > xForm( xCreate, uno::UNO_QUERY );
+ DBG_ASSERT(xForm.is(), "keine Form?");
+
+ uno::Reference< container::XIndexContainer > xForms( xNameCont,
+ uno::UNO_QUERY );
+ DBG_ASSERT( xForms.is(), "XForms nicht erhalten" );
+
+ aTmp.setValue( &xForm,
+ ::getCppuType((uno::Reference < form::XForm >*)0));
+ xForms->insertByIndex( xForms->getCount(), aTmp );
+
+ xFormComps = uno::Reference< container::XIndexContainer >
+ (xCreate, uno::UNO_QUERY);
+ }
+ }
+ }
+
+ return xFormComps;
+}
+
+sal_Bool OCX_CommandButton::Import( com::sun::star::uno::Reference<
+ com::sun::star::beans::XPropertySet> &rPropSet)
+{
+ uno::Any aTmp(&sName,getCppuType((OUString *)0));
+ rPropSet->setPropertyValue( WW8_ASCII2STR("Name"), aTmp );
+
+ aTmp <<= ImportColor(mnForeColor);
+ rPropSet->setPropertyValue( WW8_ASCII2STR("TextColor"), aTmp);
+
+ // fake transparent push button by setting window background color
+ if( !fBackStyle )
+ mnBackColor = 0x80000005;
+ aTmp <<= ImportColor(mnBackColor);
+ rPropSet->setPropertyValue( WW8_ASCII2STR("BackgroundColor"), aTmp);
+
+ sal_Bool bTemp;
+ if ((!(fEnabled)) || (fLocked))
+ bTemp = sal_False;
+ else
+ bTemp = sal_True;
+ aTmp = bool2any(bTemp);
+
+ rPropSet->setPropertyValue( WW8_ASCII2STR("Enabled"), aTmp);
+
+ bTemp = fWordWrap != 0;
+ aTmp = bool2any(bTemp);
+ rPropSet->setPropertyValue( WW8_ASCII2STR("MultiLine"), aTmp);
+
+ if (pCaption)
+ {
+ aTmp <<= lclCreateOUString( pCaption, nCaptionLen );
+ rPropSet->setPropertyValue( WW8_ASCII2STR("Label"), aTmp);
+ }
+
+ aTmp = bool2any( mbTakeFocus );
+ rPropSet->setPropertyValue( WW8_ASCII2STR( "FocusOnClick" ), aTmp );
+
+ aFontData.Import(rPropSet);
+ return sal_True;
+}
+
+sal_Bool OCX_GroupBox::Export(SvStorageRef& /* rObj */,
+ const uno::Reference< beans::XPropertySet >& /* rPropSet */,
+ const awt::Size& /* rSize */ )
+{
+ sal_Bool bRet=sal_True;
+ return bRet;
+}
+
+sal_Bool OCX_GroupBox::WriteContents(SvStorageStreamRef& /* rObj */,
+ const uno::Reference< beans::XPropertySet >& /* rPropSet */,
+ const awt::Size& /* rSize */)
+{
+ sal_Bool bRet=sal_True;
+ return bRet;
+}
+
+sal_Bool OCX_CommandButton::WriteContents(SvStorageStreamRef& rContents,
+ const uno::Reference< beans::XPropertySet >& rPropSet,
+ const awt::Size& rSize )
+{
+ sal_Bool bRet=sal_True;
+
+ sal_uInt32 nOldPos = rContents->Tell();
+ rContents->SeekRel(8);
+
+ uno::Any aTmp = rPropSet->getPropertyValue(WW8_ASCII2STR("TextColor"));
+ if (aTmp.hasValue())
+ aTmp >>= mnForeColor;
+ *rContents << ExportColor(mnForeColor);
+
+ aTmp = rPropSet->getPropertyValue(WW8_ASCII2STR("BackgroundColor"));
+ if (aTmp.hasValue())
+ aTmp >>= mnBackColor;
+ *rContents << ExportColor(mnBackColor);
+
+ aTmp = rPropSet->getPropertyValue(WW8_ASCII2STR("Enabled"));
+ fEnabled = any2bool(aTmp);
+ sal_uInt8 nTemp=0;//fEnabled;
+ if (fEnabled)
+ nTemp |= 0x02;
+ if (fBackStyle)
+ nTemp |= 0x08;
+ *rContents << nTemp;
+ *rContents << sal_uInt8(0x00);
+
+ nTemp = 0;
+ aTmp = rPropSet->getPropertyValue(WW8_ASCII2STR("MultiLine"));
+ fWordWrap = any2bool(aTmp);
+ if (fWordWrap)
+ nTemp |= 0x80;
+ *rContents << nTemp;
+ *rContents << sal_uInt8(0x00);
+
+ SvxOcxString aCaption( rPropSet->getPropertyValue(WW8_ASCII2STR("Label")) );
+ aCaption.WriteLenField( *rContents );
+ aCaption.WriteCharArray( *rContents );
+
+ WriteAlign(rContents,4);
+
+ *rContents << rSize.Width;
+ *rContents << rSize.Height;
+
+ // "take focus on click" is directly in content flags, not in option field...
+ mbTakeFocus = any2bool( rPropSet->getPropertyValue( WW8_ASCII2STR( "FocusOnClick" ) ) );
+
+ nFixedAreaLen = static_cast<sal_uInt16>(rContents->Tell()-nOldPos-4);
+
+ bRet = aFontData.Export(rContents,rPropSet);
+
+ rContents->Seek(nOldPos);
+ *rContents << nStandardId;
+ *rContents << nFixedAreaLen;
+
+ sal_uInt8 nTmp = 0x27;
+ if (aCaption.HasData())
+ nTmp |= 0x08;
+ *rContents << nTmp;
+ nTmp = 0x00;
+ if( !mbTakeFocus ) // flag is set, if option is off
+ nTmp |= 0x02;
+ *rContents << nTmp;
+ *rContents << sal_uInt8(0x00);
+ *rContents << sal_uInt8(0x00);
+
+ DBG_ASSERT((rContents.Is() && (SVSTREAM_OK==rContents->GetError())),"damn");
+ return bRet;
+}
+
+
+
+sal_Bool OCX_CommandButton::Export(SvStorageRef &rObj,
+ const uno::Reference< beans::XPropertySet > &rPropSet,
+ const awt::Size &rSize)
+{
+ static sal_uInt8 __READONLY_DATA aCompObj[] = {
+ 0x01, 0x00, 0xFE, 0xFF, 0x03, 0x0A, 0x00, 0x00,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0x40, 0x32, 0x05, 0xD7,
+ 0x69, 0xCE, 0xCD, 0x11, 0xA7, 0x77, 0x00, 0xDD,
+ 0x01, 0x14, 0x3C, 0x57, 0x22, 0x00, 0x00, 0x00,
+ 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66,
+ 0x74, 0x20, 0x46, 0x6F, 0x72, 0x6d, 0x73, 0x20,
+ 0x32, 0x2e, 0x30, 0x20, 0x43, 0x6F, 0x6D, 0x6D,
+ 0x61, 0x6E, 0x64, 0x42, 0x75, 0x74, 0x74, 0x6F,
+ 0x6E, 0x00, 0x10, 0x00, 0x00, 0x00, 0x45, 0x6D,
+ 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x20, 0x4F,
+ 0x62, 0x6A, 0x65, 0x63, 0x74, 0x00, 0x16, 0x00,
+ 0x00, 0x00, 0x46, 0x6F, 0x72, 0x6D, 0x73, 0x2E,
+ 0x43, 0x6F, 0x6D, 0x6D, 0x61, 0x6E, 0x64, 0x42,
+ 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x2E, 0x31, 0x00,
+ 0xF4, 0x39, 0xB2, 0x71, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ };
+
+ {
+ SvStorageStreamRef xStor( rObj->OpenSotStream( C2S("\1CompObj")));
+ xStor->Write(aCompObj,sizeof(aCompObj));
+ DBG_ASSERT((xStor.Is() && (SVSTREAM_OK == xStor->GetError())),"damn");
+ }
+
+ {
+ SvStorageStreamRef xStor3( rObj->OpenSotStream( C2S("\3ObjInfo")));
+ xStor3->Write(aObjInfo,sizeof(aObjInfo));
+ DBG_ASSERT((xStor3.Is() && (SVSTREAM_OK == xStor3->GetError())),"damn");
+ }
+
+ static sal_uInt8 __READONLY_DATA aOCXNAME[] = {
+ 0x43, 0x00, 0x6F, 0x00, 0x6D, 0x00, 0x6D, 0x00,
+ 0x61, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x42, 0x00,
+ 0x75, 0x00, 0x74, 0x00, 0x74, 0x00, 0x6F, 0x00,
+ 0x6E, 0x00, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00
+ };
+
+ {
+ SvStorageStreamRef xStor2( rObj->OpenSotStream( C2S("\3OCXNAME")));
+ xStor2->Write(aOCXNAME,sizeof(aOCXNAME));
+ DBG_ASSERT((xStor2.Is() && (SVSTREAM_OK == xStor2->GetError())),"damn");
+ }
+
+ SvStorageStreamRef xContents( rObj->OpenSotStream( C2S("contents")));
+
+ return WriteContents(xContents,rPropSet,rSize);
+}
+
+sal_Bool OCX_ImageButton::WriteContents(SvStorageStreamRef &rContents,
+ const uno::Reference< beans::XPropertySet > &rPropSet,
+ const awt::Size &rSize)
+{
+ sal_Bool bRet=sal_True;
+
+ sal_uInt32 nOldPos = rContents->Tell();
+ rContents->SeekRel(8);
+
+ uno::Any aTmp=rPropSet->getPropertyValue(WW8_ASCII2STR("BackgroundColor"));
+ if (aTmp.hasValue())
+ aTmp >>= mnBackColor;
+ *rContents << ExportColor(mnBackColor);
+
+ aTmp = rPropSet->getPropertyValue(WW8_ASCII2STR("Enabled"));
+ fEnabled = any2bool(aTmp);
+ sal_uInt8 nTemp=0;//fEnabled;
+ if (fEnabled)
+ nTemp |= 0x02;
+ *rContents << nTemp;
+ *rContents << sal_uInt8(0x00);
+ *rContents << sal_uInt8(0x00);
+ *rContents << sal_uInt8(0x00);
+
+ WriteAlign(rContents,4);
+
+ *rContents << rSize.Width;
+ *rContents << rSize.Height;
+
+ nFixedAreaLen = static_cast<sal_uInt16>(rContents->Tell()-nOldPos-4);
+
+ bRet = aFontData.Export(rContents,rPropSet);
+
+ rContents->Seek(nOldPos);
+ *rContents << nStandardId;
+ *rContents << nFixedAreaLen;
+
+ sal_uInt8 nTmp = 0x26;
+ *rContents << nTmp;
+ *rContents << sal_uInt8(0x00);
+ *rContents << sal_uInt8(0x00);
+ *rContents << sal_uInt8(0x00);
+
+ DBG_ASSERT((rContents.Is() && (SVSTREAM_OK==rContents->GetError())),"damn");
+ return bRet;
+}
+
+
+
+sal_Bool OCX_ImageButton::Export(SvStorageRef &rObj,
+ const uno::Reference< beans::XPropertySet > &rPropSet,
+ const awt::Size &rSize)
+{
+ static sal_uInt8 __READONLY_DATA aCompObj[] = {
+ 0x01, 0x00, 0xFE, 0xFF, 0x03, 0x0A, 0x00, 0x00,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0x40, 0x32, 0x05, 0xD7,
+ 0x69, 0xCE, 0xCD, 0x11, 0xA7, 0x77, 0x00, 0xDD,
+ 0x01, 0x14, 0x3C, 0x57, 0x22, 0x00, 0x00, 0x00,
+ 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66,
+ 0x74, 0x20, 0x46, 0x6F, 0x72, 0x6d, 0x73, 0x20,
+ 0x32, 0x2e, 0x30, 0x20, 0x43, 0x6F, 0x6D, 0x6D,
+ 0x61, 0x6E, 0x64, 0x42, 0x75, 0x74, 0x74, 0x6F,
+ 0x6E, 0x00, 0x10, 0x00, 0x00, 0x00, 0x45, 0x6D,
+ 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x20, 0x4F,
+ 0x62, 0x6A, 0x65, 0x63, 0x74, 0x00, 0x16, 0x00,
+ 0x00, 0x00, 0x46, 0x6F, 0x72, 0x6D, 0x73, 0x2E,
+ 0x43, 0x6F, 0x6D, 0x6D, 0x61, 0x6E, 0x64, 0x42,
+ 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x2E, 0x31, 0x00,
+ 0xF4, 0x39, 0xB2, 0x71, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ };
+
+ {
+ SvStorageStreamRef xStor( rObj->OpenSotStream( C2S("\1CompObj")));
+ xStor->Write(aCompObj,sizeof(aCompObj));
+ DBG_ASSERT((xStor.Is() && (SVSTREAM_OK == xStor->GetError())),"damn");
+ }
+
+ {
+ SvStorageStreamRef xStor3( rObj->OpenSotStream( C2S("\3ObjInfo")));
+ xStor3->Write(aObjInfo,sizeof(aObjInfo));
+ DBG_ASSERT((xStor3.Is() && (SVSTREAM_OK == xStor3->GetError())),"damn");
+ }
+
+ static sal_uInt8 __READONLY_DATA aOCXNAME[] = {
+ 0x43, 0x00, 0x6F, 0x00, 0x6D, 0x00, 0x6D, 0x00,
+ 0x61, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x42, 0x00,
+ 0x75, 0x00, 0x74, 0x00, 0x74, 0x00, 0x6F, 0x00,
+ 0x6E, 0x00, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00
+ };
+
+ {
+ SvStorageStreamRef xStor2( rObj->OpenSotStream( C2S("\3OCXNAME")));
+ xStor2->Write(aOCXNAME,sizeof(aOCXNAME));
+ DBG_ASSERT((xStor2.Is() && (SVSTREAM_OK == xStor2->GetError())),"damn");
+ }
+
+ SvStorageStreamRef xContents( rObj->OpenSotStream( C2S("contents")));
+ return WriteContents(xContents,rPropSet,rSize);
+}
+
+
+sal_Bool OCX_OptionButton::Import(com::sun::star::uno::Reference<
+ com::sun::star::beans::XPropertySet> &rPropSet)
+{
+ uno::Any aTmp(&sName,getCppuType((OUString *)0));
+ rPropSet->setPropertyValue( WW8_ASCII2STR("Name"), aTmp );
+
+ // background color: fBackStyle==0 -> transparent
+ if( fBackStyle )
+ aTmp <<= ImportColor(mnBackColor);
+ else
+ aTmp = uno::Any();
+ rPropSet->setPropertyValue( WW8_ASCII2STR("BackgroundColor"), aTmp);
+
+ sal_Bool bTemp;
+ if ((!(fEnabled)) || (fLocked))
+ bTemp = sal_False;
+ else
+ bTemp = sal_True;
+ aTmp = bool2any(bTemp);
+ rPropSet->setPropertyValue( WW8_ASCII2STR("Enabled"), aTmp);
+
+ bTemp = fWordWrap != 0;
+ aTmp = bool2any(bTemp);
+ rPropSet->setPropertyValue( WW8_ASCII2STR("MultiLine"), aTmp);
+
+ aTmp <<= ImportColor(mnForeColor);
+ rPropSet->setPropertyValue( WW8_ASCII2STR("TextColor"), aTmp);
+
+ aTmp <<= ImportSpecEffect( nSpecialEffect );
+ rPropSet->setPropertyValue( WW8_ASCII2STR("VisualEffect"), aTmp);
+
+ if (pValue && !bSetInDialog)
+ {
+ INT16 nTmp = pValue[0]-0x30;
+ aTmp <<= nTmp;
+ rPropSet->setPropertyValue( WW8_ASCII2STR("DefaultState"), aTmp);
+ }
+
+ if (pCaption)
+ {
+ aTmp <<= lclCreateOUString( pCaption, nCaptionLen );
+ rPropSet->setPropertyValue( WW8_ASCII2STR("Label"), aTmp);
+ }
+
+ // #i40279# always centered vertically
+ aTmp <<= ::com::sun::star::style::VerticalAlignment_MIDDLE;
+ rPropSet->setPropertyValue( WW8_ASCII2STR("VerticalAlign"), aTmp );
+
+ aFontData.Import(rPropSet);
+ return sal_True;
+}
+
+sal_Bool OCX_OptionButton::WriteContents(SvStorageStreamRef &rContents,
+ const uno::Reference< beans::XPropertySet > &rPropSet,
+ const awt::Size &rSize)
+{
+ sal_Bool bRet=sal_True;
+
+ sal_uInt32 nOldPos = rContents->Tell();
+ rContents->SeekRel(12);
+
+ pBlockFlags[0] = 0;
+ pBlockFlags[1] = 0x01;
+ pBlockFlags[2] = 0;
+ pBlockFlags[3] = 0x80;
+ pBlockFlags[4] = 0;
+ pBlockFlags[5] = 0;
+ pBlockFlags[6] = 0;
+ pBlockFlags[7] = 0;
+
+ uno::Any aTmp = rPropSet->getPropertyValue(WW8_ASCII2STR("Enabled"));
+ fEnabled = any2bool(aTmp);
+
+ aTmp = rPropSet->getPropertyValue(WW8_ASCII2STR("BackgroundColor"));
+ if (aTmp.hasValue())
+ aTmp >>= mnBackColor;
+ else
+ fBackStyle = 0;
+
+ sal_uInt8 nTemp=0;//=fEnabled;
+ if (fEnabled)
+ nTemp |= 0x02;
+ if (fBackStyle)
+ nTemp |= 0x08;
+ *rContents << nTemp;
+ pBlockFlags[0] |= 0x01;
+ *rContents << sal_uInt8(0x00);
+ nTemp = 0;
+ aTmp = rPropSet->getPropertyValue(WW8_ASCII2STR("MultiLine"));
+ fWordWrap = any2bool(aTmp);
+ if (fWordWrap)
+ nTemp |= 0x80;
+ *rContents << nTemp;
+ *rContents << sal_uInt8(0x00);
+
+ *rContents << ExportColor(mnBackColor);
+ pBlockFlags[0] |= 0x02;
+
+ aTmp = rPropSet->getPropertyValue(WW8_ASCII2STR("TextColor"));
+ if (aTmp.hasValue())
+ aTmp >>= mnForeColor;
+ *rContents << ExportColor(mnForeColor);
+ pBlockFlags[0] |= 0x04;
+
+ nStyle = 5;
+ *rContents << nStyle;
+ pBlockFlags[0] |= 0x40;
+
+ WriteAlign(rContents,4);
+ nValueLen = 1|SVX_MSOCX_COMPRESSED;
+ aTmp = rPropSet->getPropertyValue(WW8_ASCII2STR("DefaultState"));
+ sal_Int16 nDefault = sal_Int16();
+ aTmp >>= nDefault;
+ *rContents << nValueLen;
+ pBlockFlags[2] |= 0x40;
+
+
+ SvxOcxString aCaption( rPropSet->getPropertyValue(WW8_ASCII2STR("Label")) );
+ if (aCaption.HasData())
+ pBlockFlags[2] |= 0x80;
+ aCaption.WriteLenField( *rContents );
+
+ aTmp = rPropSet->getPropertyValue(WW8_ASCII2STR("VisualEffect"));
+ if (aTmp.hasValue())
+ {
+ sal_Int16 nApiSpecEffect = sal_Int16();
+ aTmp >>= nApiSpecEffect;
+ nSpecialEffect = ExportSpecEffect( nApiSpecEffect );
+ }
+ *rContents << nSpecialEffect;
+ pBlockFlags[3] |= 0x04;
+
+ WriteAlign(rContents,4);
+ *rContents << rSize.Width;
+ *rContents << rSize.Height;
+
+ nDefault += 0x30;
+ *rContents << sal_uInt8(nDefault);
+ *rContents << sal_uInt8(0x00);
+
+ aCaption.WriteCharArray( *rContents );
+
+ WriteAlign(rContents,4);
+ nFixedAreaLen = static_cast<sal_uInt16>(rContents->Tell()-nOldPos-4);
+ bRet = aFontData.Export(rContents,rPropSet);
+
+ rContents->Seek(nOldPos);
+ *rContents << nStandardId;
+ *rContents << nFixedAreaLen;
+
+ *rContents << pBlockFlags[0];
+ *rContents << pBlockFlags[1];
+ *rContents << pBlockFlags[2];
+ *rContents << pBlockFlags[3];
+ *rContents << pBlockFlags[4];
+ *rContents << pBlockFlags[5];
+ *rContents << pBlockFlags[6];
+ *rContents << pBlockFlags[7];
+
+ DBG_ASSERT((rContents.Is() &&
+ (SVSTREAM_OK==rContents->GetError())),"damn");
+ return bRet;
+}
+
+
+
+sal_Bool OCX_OptionButton::Export(SvStorageRef &rObj,
+ const uno::Reference< beans::XPropertySet > &rPropSet,
+ const awt::Size &rSize)
+{
+ static sal_uInt8 __READONLY_DATA aCompObj[] = {
+ 0x01, 0x00, 0xFE, 0xFF, 0x03, 0x0A, 0x00, 0x00,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0x50, 0x1D, 0xD2, 0x8B,
+ 0x42, 0xEC, 0xCE, 0x11, 0x9E, 0x0D, 0x00, 0xAA,
+ 0x00, 0x60, 0x02, 0xF3, 0x21, 0x00, 0x00, 0x00,
+ 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66,
+ 0x74, 0x20, 0x46, 0x6F, 0x72, 0x6D, 0x73, 0x20,
+ 0x32, 0x2E, 0x30, 0x20, 0x4F, 0x70, 0x74, 0x69,
+ 0x6F, 0x6E, 0x42, 0x75, 0x74, 0x74, 0x6F, 0x6E,
+ 0x00, 0x10, 0x00, 0x00, 0x00, 0x45, 0x6D, 0x62,
+ 0x65, 0x64, 0x64, 0x65, 0x64, 0x20, 0x4F, 0x62,
+ 0x6A, 0x65, 0x63, 0x74, 0x00, 0x15, 0x00, 0x00,
+ 0x00, 0x46, 0x6F, 0x72, 0x6D, 0x73, 0x2E, 0x4F,
+ 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x42, 0x75, 0x74,
+ 0x74, 0x6F, 0x6E, 0x2E, 0x31, 0x00, 0xF4, 0x39,
+ 0xB2, 0x71, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ };
+
+ {
+ SvStorageStreamRef xStor( rObj->OpenSotStream( C2S("\1CompObj")));
+ xStor->Write(aCompObj,sizeof(aCompObj));
+ DBG_ASSERT((xStor.Is() && (SVSTREAM_OK == xStor->GetError())),"damn");
+ }
+
+ {
+ SvStorageStreamRef xStor3( rObj->OpenSotStream( C2S("\3ObjInfo")));
+ xStor3->Write(aObjInfo,sizeof(aObjInfo));
+ DBG_ASSERT((xStor3.Is() && (SVSTREAM_OK == xStor3->GetError())),"damn");
+ }
+
+ static sal_uInt8 __READONLY_DATA aOCXNAME[] = {
+ 0x4F, 0x00, 0x70, 0x00, 0x74, 0x00, 0x69, 0x00,
+ 0x6F, 0x00, 0x6E, 0x00, 0x42, 0x00, 0x75, 0x00,
+ 0x74, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x6E, 0x00,
+ 0x31, 0x00, 0x00, 0x00, 0x00, 0x00
+ };
+
+ {
+ SvStorageStreamRef xStor2( rObj->OpenSotStream( C2S("\3OCXNAME")));
+ xStor2->Write(aOCXNAME,sizeof(aOCXNAME));
+ DBG_ASSERT((xStor2.Is() && (SVSTREAM_OK == xStor2->GetError())),"damn");
+ }
+
+ SvStorageStreamRef xContents( rObj->OpenSotStream( C2S("contents")));
+ return WriteContents(xContents, rPropSet, rSize);
+}
+
+
+sal_Bool OCX_TextBox::Import(com::sun::star::uno::Reference<
+ com::sun::star::beans::XPropertySet> &rPropSet)
+{
+ uno::Any aTmp(&sName,getCppuType((OUString *)0));
+ rPropSet->setPropertyValue( WW8_ASCII2STR("Name"), aTmp );
+
+ aTmp = bool2any( fEnabled != 0 );
+ rPropSet->setPropertyValue( WW8_ASCII2STR("Enabled"), aTmp);
+
+ aTmp = bool2any( fLocked != 0 );
+ rPropSet->setPropertyValue( WW8_ASCII2STR("ReadOnly"), aTmp);
+
+ aTmp = bool2any( fHideSelection != 0 );
+ rPropSet->setPropertyValue( WW8_ASCII2STR( "HideInactiveSelection" ), aTmp);
+
+ aTmp <<= ImportColor(mnForeColor);
+ rPropSet->setPropertyValue( WW8_ASCII2STR("TextColor"), aTmp);
+
+ aTmp <<= ImportColor(mnBackColor);
+ rPropSet->setPropertyValue( WW8_ASCII2STR("BackgroundColor"), aTmp);
+
+ aTmp <<= ImportBorder(nSpecialEffect,nBorderStyle);
+ rPropSet->setPropertyValue( WW8_ASCII2STR("Border"), aTmp);
+
+ aTmp <<= ImportColor( nBorderColor );
+ rPropSet->setPropertyValue( WW8_ASCII2STR("BorderColor"), aTmp);
+
+ aTmp = bool2any( fMultiLine != 0 );
+ rPropSet->setPropertyValue( WW8_ASCII2STR("MultiLine"), aTmp);
+
+ sal_uInt16 nTmp = static_cast<sal_uInt16>(nMaxLength);
+ aTmp <<= nTmp;
+ rPropSet->setPropertyValue( WW8_ASCII2STR("MaxTextLen"), aTmp);
+
+
+ sal_Bool bTemp1,bTemp2;
+ uno::Any aBarsH,aBarsV;
+ switch(nScrollBars)
+ {
+ case 1:
+ bTemp1 = sal_True;
+ bTemp2 = sal_False;
+ break;
+ case 2:
+ bTemp1 = sal_False;
+ bTemp2 = sal_True;
+ break;
+ case 3:
+ bTemp1 = sal_True;
+ bTemp2 = sal_True;
+ break;
+ case 0:
+ default:
+ bTemp1 = sal_False;
+ bTemp2 = sal_False;
+ break;
+ }
+
+ aBarsH = bool2any(bTemp1);
+ aBarsV = bool2any(bTemp2);
+ rPropSet->setPropertyValue( WW8_ASCII2STR("HScroll"), aBarsH);
+ rPropSet->setPropertyValue( WW8_ASCII2STR("VScroll"), aBarsV);
+
+ nTmp = nPasswordChar;
+ aTmp <<= nTmp;
+ rPropSet->setPropertyValue( WW8_ASCII2STR("EchoChar"), aTmp);
+
+ if (pValue)
+ {
+ aTmp <<= lclCreateOUString( pValue, nValueLen );
+ // DefaultText seems to no longer be in UnoEditControlModel
+ if ( bSetInDialog )
+ {
+ rPropSet->setPropertyValue( WW8_ASCII2STR("Text"), aTmp);
+ }
+ else
+ {
+ rPropSet->setPropertyValue( WW8_ASCII2STR("DefaultText"), aTmp);
+ }
+ }
+
+ aFontData.Import(rPropSet);
+ return sal_True;
+}
+
+sal_Bool OCX_TextBox::WriteContents(SvStorageStreamRef &rContents,
+ const uno::Reference< beans::XPropertySet > &rPropSet,
+ const awt::Size &rSize)
+{
+ sal_Bool bRet=sal_True;
+ sal_uInt32 nOldPos = rContents->Tell();
+ rContents->SeekRel(12);
+
+ pBlockFlags[0] = 0;
+ pBlockFlags[1] = 0x01;
+ pBlockFlags[2] = 0x00;
+ pBlockFlags[3] = 0x80;
+ pBlockFlags[4] = 0;
+ pBlockFlags[5] = 0;
+ pBlockFlags[6] = 0;
+ pBlockFlags[7] = 0;
+
+
+ sal_uInt8 nTemp=0x19;
+ uno::Any aTmp = rPropSet->getPropertyValue(WW8_ASCII2STR("Enabled"));
+ fEnabled = any2bool(aTmp);
+ if (fEnabled)
+ nTemp |= 0x02;
+
+ aTmp = rPropSet->getPropertyValue(WW8_ASCII2STR("ReadOnly"));
+ fLocked = any2bool(aTmp);
+ if (fLocked)
+ nTemp |= 0x04;
+
+ *rContents << nTemp;
+ pBlockFlags[0] |= 0x01;
+ *rContents << sal_uInt8(0x48);
+ *rContents << sal_uInt8(0x80);
+
+ fMultiLine = any2bool(rPropSet->getPropertyValue(WW8_ASCII2STR("MultiLine")));
+ fHideSelection = any2bool(rPropSet->getPropertyValue(WW8_ASCII2STR("HideInactiveSelection")));
+ nTemp = 0x0C;
+ if (fMultiLine)
+ nTemp |= 0x80;
+ if( fHideSelection )
+ nTemp |= 0x20;
+ *rContents << nTemp;
+
+ aTmp = rPropSet->getPropertyValue(WW8_ASCII2STR("BackgroundColor"));
+ if (aTmp.hasValue())
+ aTmp >>= mnBackColor;
+ *rContents << ExportColor(mnBackColor);
+ pBlockFlags[0] |= 0x02;
+
+ aTmp = rPropSet->getPropertyValue(WW8_ASCII2STR("TextColor"));
+ if (aTmp.hasValue())
+ aTmp >>= mnForeColor;
+ *rContents << ExportColor(mnForeColor);
+ pBlockFlags[0] |= 0x04;
+
+ aTmp = rPropSet->getPropertyValue( WW8_ASCII2STR("MaxTextLen"));
+ aTmp >>= nMaxLength;
+ *rContents << nMaxLength;
+ pBlockFlags[0] |= 0x08;
+
+ aTmp = rPropSet->getPropertyValue(WW8_ASCII2STR("Border"));
+ sal_Int16 nBorder = sal_Int16();
+ aTmp >>= nBorder;
+ nSpecialEffect = ExportBorder(nBorder,nBorderStyle);
+ *rContents << nBorderStyle;
+ pBlockFlags[0] |= 0x10;
+
+ aTmp = rPropSet->getPropertyValue( WW8_ASCII2STR("HScroll"));
+ sal_Bool bTemp1 = any2bool(aTmp);
+ aTmp = rPropSet->getPropertyValue( WW8_ASCII2STR("VScroll"));
+ sal_Bool bTemp2 = any2bool(aTmp);
+ if (!bTemp1 && !bTemp2)
+ nScrollBars =0;
+ else if (bTemp1 && bTemp2)
+ nScrollBars = 3;
+ else if (!bTemp1 && bTemp2)
+ nScrollBars = 2;
+ else
+ nScrollBars = 1;
+ *rContents << nScrollBars;
+ pBlockFlags[0] |= 0x20;
+
+ aTmp = rPropSet->getPropertyValue(WW8_ASCII2STR("EchoChar"));
+ sal_uInt16 nTmp = sal_uInt16();
+ aTmp >>= nTmp;
+ nPasswordChar = static_cast<sal_uInt8>(nTmp);
+ *rContents << nPasswordChar;
+ pBlockFlags[1] |= 0x02;
+
+ SvxOcxString aValue( rPropSet->getPropertyValue(WW8_ASCII2STR("DefaultText")) );
+ aValue.WriteLenField( *rContents );
+ if (aValue.HasData())
+ pBlockFlags[2] |= 0x40;
+
+ WriteAlign(rContents,4);
+ aTmp = rPropSet->getPropertyValue(WW8_ASCII2STR("BorderColor"));
+ if (aTmp.hasValue())
+ aTmp >>= nBorderColor;
+ *rContents << ExportColor(nBorderColor);
+ pBlockFlags[3] |= 0x02;
+
+ *rContents << nSpecialEffect;
+ pBlockFlags[3] |= 0x04;
+
+ WriteAlign(rContents,4);
+ *rContents << rSize.Width;
+ *rContents << rSize.Height;
+
+ aValue.WriteCharArray( *rContents );
+
+ WriteAlign(rContents,4);
+
+ nFixedAreaLen = static_cast<sal_uInt16>(rContents->Tell()-nOldPos-4);
+
+ bRet = aFontData.Export(rContents,rPropSet);
+
+ rContents->Seek(nOldPos);
+ *rContents << nStandardId;
+ *rContents << nFixedAreaLen;
+
+ *rContents << pBlockFlags[0];
+ *rContents << pBlockFlags[1];
+ *rContents << pBlockFlags[2];
+ *rContents << pBlockFlags[3];
+ *rContents << pBlockFlags[4];
+ *rContents << pBlockFlags[5];
+ *rContents << pBlockFlags[6];
+ *rContents << pBlockFlags[7];
+
+ DBG_ASSERT((rContents.Is() &&
+ (SVSTREAM_OK == rContents->GetError())),"damn");
+ return bRet;
+}
+
+
+sal_Bool OCX_TextBox::Export(SvStorageRef &rObj,
+ const uno::Reference< beans::XPropertySet > &rPropSet,
+ const awt::Size &rSize)
+{
+ static sal_uInt8 __READONLY_DATA aCompObj[] = {
+ 0x01, 0x00, 0xFE, 0xFF, 0x03, 0x0A, 0x00, 0x00,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0x10, 0x1D, 0xD2, 0x8B,
+ 0x42, 0xEC, 0xCE, 0x11, 0x9E, 0x0D, 0x00, 0xAA,
+ 0x00, 0x60, 0x02, 0xF3, 0x1C, 0x00, 0x00, 0x00,
+ 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66,
+ 0x74, 0x20, 0x46, 0x6F, 0x72, 0x6D, 0x73, 0x20,
+ 0x32, 0x2E, 0x30, 0x20, 0x54, 0x65, 0x78, 0x74,
+ 0x42, 0x6F, 0x78, 0x00, 0x10, 0x00, 0x00, 0x00,
+ 0x45, 0x6D, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64,
+ 0x20, 0x4F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x00,
+ 0x10, 0x00, 0x00, 0x00, 0x46, 0x6F, 0x72, 0x6D,
+ 0x73, 0x2E, 0x54, 0x65, 0x78, 0x74, 0x42, 0x6F,
+ 0x78, 0x2E, 0x31, 0x00, 0xF4, 0x39, 0xB2, 0x71,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00
+ };
+
+ {
+ SvStorageStreamRef xStor( rObj->OpenSotStream( C2S("\1CompObj")));
+ xStor->Write(aCompObj,sizeof(aCompObj));
+ DBG_ASSERT((xStor.Is() && (SVSTREAM_OK == xStor->GetError())),"damn");
+ }
+
+ {
+ SvStorageStreamRef xStor3( rObj->OpenSotStream( C2S("\3ObjInfo")));
+ xStor3->Write(aObjInfo,sizeof(aObjInfo));
+ DBG_ASSERT((xStor3.Is() && (SVSTREAM_OK == xStor3->GetError())),"damn");
+ }
+
+ static sal_uInt8 __READONLY_DATA aOCXNAME[] = {
+ 0x54, 0x00, 0x65, 0x00, 0x78, 0x00, 0x74, 0x00,
+ 0x42, 0x00, 0x6F, 0x00, 0x78, 0x00, 0x31, 0x00,
+ 0x00, 0x00, 0x00, 0x00
+ };
+
+ {
+ SvStorageStreamRef xStor2( rObj->OpenSotStream( C2S("\3OCXNAME")));
+ xStor2->Write(aOCXNAME,sizeof(aOCXNAME));
+ DBG_ASSERT((xStor2.Is() && (SVSTREAM_OK == xStor2->GetError())),"damn");
+ }
+
+ SvStorageStreamRef xContents( rObj->OpenSotStream( C2S("contents")));
+ return WriteContents(xContents, rPropSet, rSize);
+}
+
+sal_Bool OCX_FieldControl::WriteContents(SvStorageStreamRef &rContents,
+ const uno::Reference< beans::XPropertySet > &rPropSet,
+ const awt::Size &rSize)
+{
+ sal_Bool bRet=sal_True;
+ sal_uInt32 nOldPos = rContents->Tell();
+ rContents->SeekRel(12);
+
+ pBlockFlags[0] = 0;
+ pBlockFlags[1] = 0x01;
+ pBlockFlags[2] = 0x00;
+ pBlockFlags[3] = 0x80;
+ pBlockFlags[4] = 0;
+ pBlockFlags[5] = 0;
+ pBlockFlags[6] = 0;
+ pBlockFlags[7] = 0;
+
+
+ sal_uInt8 nTemp=0x19;
+ uno::Any aTmp = rPropSet->getPropertyValue(WW8_ASCII2STR("Enabled"));
+ fEnabled = any2bool(aTmp);
+ if (fEnabled)
+ nTemp |= 0x02;
+
+ aTmp = rPropSet->getPropertyValue(WW8_ASCII2STR("ReadOnly"));
+ fLocked = any2bool(aTmp);
+ if (fLocked)
+ nTemp |= 0x04;
+
+ *rContents << nTemp;
+ pBlockFlags[0] |= 0x01;
+ *rContents << sal_uInt8(0x48);
+ *rContents << sal_uInt8(0x80);
+
+ nTemp = 0x2C;
+ *rContents << nTemp;
+
+ aTmp = rPropSet->getPropertyValue(WW8_ASCII2STR("BackgroundColor"));
+ if (aTmp.hasValue())
+ aTmp >>= mnBackColor;
+ *rContents << ExportColor(mnBackColor);
+ pBlockFlags[0] |= 0x02;
+
+ aTmp = rPropSet->getPropertyValue(WW8_ASCII2STR("TextColor"));
+ if (aTmp.hasValue())
+ aTmp >>= mnForeColor;
+ *rContents << ExportColor(mnForeColor);
+ pBlockFlags[0] |= 0x04;
+
+ aTmp = rPropSet->getPropertyValue(WW8_ASCII2STR("Border"));
+ sal_Int16 nBorder = sal_Int16();
+ aTmp >>= nBorder;
+ nSpecialEffect = ExportBorder(nBorder,nBorderStyle);
+ *rContents << nBorderStyle;
+ pBlockFlags[0] |= 0x10;
+
+#if 0 //Each control has a different Value format, and how to convert each to text has to be found out
+ SvxOcxString aValue( rPropSet->getPropertyValue(WW8_ASCII2STR("DefaultText")) );
+ aValue.WriteLenField( *rContents );
+ if (aValue.HasData())
+ pBlockFlags[2] |= 0x40;
+#endif
+
+ *rContents << nSpecialEffect;
+ pBlockFlags[3] |= 0x04;
+
+ WriteAlign(rContents,4);
+ *rContents << rSize.Width;
+ *rContents << rSize.Height;
+
+#if 0
+ aValue.WriteCharArray( *rContents );
+#endif
+
+ WriteAlign(rContents,4);
+
+ nFixedAreaLen = static_cast<sal_uInt16>(rContents->Tell()-nOldPos-4);
+
+ bRet = aFontData.Export(rContents,rPropSet);
+
+ rContents->Seek(nOldPos);
+ *rContents << nStandardId;
+ *rContents << nFixedAreaLen;
+
+ *rContents << pBlockFlags[0];
+ *rContents << pBlockFlags[1];
+ *rContents << pBlockFlags[2];
+ *rContents << pBlockFlags[3];
+ *rContents << pBlockFlags[4];
+ *rContents << pBlockFlags[5];
+ *rContents << pBlockFlags[6];
+ *rContents << pBlockFlags[7];
+
+ DBG_ASSERT((rContents.Is() &&
+ (SVSTREAM_OK==rContents->GetError())),"damn");
+ return bRet;
+}
+
+sal_Bool OCX_FieldControl::Export(SvStorageRef &rObj,
+ const uno::Reference< beans::XPropertySet > &rPropSet,
+ const awt::Size &rSize)
+{
+ static sal_uInt8 __READONLY_DATA aCompObj[] = {
+ 0x01, 0x00, 0xFE, 0xFF, 0x03, 0x0A, 0x00, 0x00,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0x10, 0x1D, 0xD2, 0x8B,
+ 0x42, 0xEC, 0xCE, 0x11, 0x9E, 0x0D, 0x00, 0xAA,
+ 0x00, 0x60, 0x02, 0xF3, 0x1C, 0x00, 0x00, 0x00,
+ 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66,
+ 0x74, 0x20, 0x46, 0x6F, 0x72, 0x6D, 0x73, 0x20,
+ 0x32, 0x2E, 0x30, 0x20, 0x54, 0x65, 0x78, 0x74,
+ 0x42, 0x6F, 0x78, 0x00, 0x10, 0x00, 0x00, 0x00,
+ 0x45, 0x6D, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64,
+ 0x20, 0x4F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x00,
+ 0x10, 0x00, 0x00, 0x00, 0x46, 0x6F, 0x72, 0x6D,
+ 0x73, 0x2E, 0x54, 0x65, 0x78, 0x74, 0x42, 0x6F,
+ 0x78, 0x2E, 0x31, 0x00, 0xF4, 0x39, 0xB2, 0x71,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00
+ };
+
+ {
+ SvStorageStreamRef xStor( rObj->OpenSotStream( C2S("\1CompObj")));
+ xStor->Write(aCompObj,sizeof(aCompObj));
+ DBG_ASSERT((xStor.Is() && (SVSTREAM_OK == xStor->GetError())),"damn");
+ }
+
+ {
+ SvStorageStreamRef xStor3( rObj->OpenSotStream( C2S("\3ObjInfo")));
+ xStor3->Write(aObjInfo,sizeof(aObjInfo));
+ DBG_ASSERT((xStor3.Is() && (SVSTREAM_OK == xStor3->GetError())),"damn");
+ }
+
+ static sal_uInt8 __READONLY_DATA aOCXNAME[] = {
+ 0x54, 0x00, 0x65, 0x00, 0x78, 0x00, 0x74, 0x00,
+ 0x42, 0x00, 0x6F, 0x00, 0x78, 0x00, 0x31, 0x00,
+ 0x00, 0x00, 0x00, 0x00
+ };
+
+ {
+ SvStorageStreamRef xStor2( rObj->OpenSotStream( C2S("\3OCXNAME")));
+ xStor2->Write(aOCXNAME,sizeof(aOCXNAME));
+ DBG_ASSERT((xStor2.Is() && (SVSTREAM_OK == xStor2->GetError())),"damn");
+ }
+
+ SvStorageStreamRef xContents( rObj->OpenSotStream( C2S("contents")));
+ return WriteContents(xContents, rPropSet, rSize);
+}
+
+
+
+sal_Bool OCX_ToggleButton::Import(com::sun::star::uno::Reference<
+ com::sun::star::beans::XPropertySet> &rPropSet)
+{
+ uno::Any aTmp(&sName,getCppuType((OUString *)0));
+ rPropSet->setPropertyValue( WW8_ASCII2STR("Name"), aTmp );
+
+ aTmp = bool2any(true);
+ rPropSet->setPropertyValue( WW8_ASCII2STR("Toggle"), aTmp );
+
+ sal_Bool bTemp;
+ if ((!(fEnabled)) || (fLocked))
+ bTemp = sal_False;
+ else
+ bTemp = sal_True;
+ aTmp = bool2any(bTemp);
+ rPropSet->setPropertyValue( WW8_ASCII2STR("Enabled"), aTmp);
+
+ bTemp = fWordWrap != 0;
+ aTmp = bool2any(bTemp);
+ rPropSet->setPropertyValue( WW8_ASCII2STR("MultiLine"), aTmp);
+
+ aTmp <<= ImportColor(mnForeColor);
+ rPropSet->setPropertyValue( WW8_ASCII2STR("TextColor"), aTmp);
+
+ // fake transparent toggle button by setting window background color
+ if( !fBackStyle )
+ mnBackColor = 0x80000005;
+ aTmp <<= ImportColor(mnBackColor);
+ rPropSet->setPropertyValue( WW8_ASCII2STR("BackgroundColor"), aTmp);
+
+ if (pValue)
+ {
+ INT16 nTmp=pValue[0]-0x30;
+ aTmp <<= nTmp;
+ rPropSet->setPropertyValue( WW8_ASCII2STR("State"), aTmp);
+ }
+
+ if (pCaption)
+ {
+ aTmp <<= lclCreateOUString( pCaption, nCaptionLen );
+ rPropSet->setPropertyValue( WW8_ASCII2STR("Label"), aTmp);
+ }
+
+ aFontData.Import(rPropSet);
+ return sal_True;
+}
+
+sal_Bool OCX_ToggleButton::Export(
+ SvStorageRef &rObj, const uno::Reference< beans::XPropertySet> &rPropSet,
+ const awt::Size& rSize )
+{
+ static sal_uInt8 __READONLY_DATA aCompObj[] = {
+ 0x01, 0x00, 0xFE, 0xFF, 0x03, 0x0A, 0x00, 0x00,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0x60, 0x1D, 0xD2, 0x8B,
+ 0x42, 0xEC, 0xCE, 0x11, 0x9E, 0x0D, 0x00, 0xAA,
+ 0x00, 0x60, 0x02, 0xF3, 0x21, 0x00, 0x00, 0x00,
+ 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66,
+ 0x74, 0x20, 0x46, 0x6F, 0x72, 0x6D, 0x73, 0x20,
+ 0x32, 0x2E, 0x30, 0x20, 0x54, 0x6F, 0x67, 0x67,
+ 0x6C, 0x65, 0x42, 0x75, 0x74, 0x74, 0x6F, 0x6E,
+ 0x00, 0x10, 0x00, 0x00, 0x00, 0x45, 0x6D, 0x62,
+ 0x65, 0x64, 0x64, 0x65, 0x64, 0x20, 0x4F, 0x62,
+ 0x6A, 0x65, 0x63, 0x74, 0x00, 0x15, 0x00, 0x00,
+ 0x00, 0x46, 0x6F, 0x72, 0x6D, 0x73, 0x2E, 0x54,
+ 0x6F, 0x67, 0x67, 0x6C, 0x65, 0x42, 0x75, 0x74,
+ 0x74, 0x6F, 0x6E, 0x2E, 0x31, 0x00, 0xF4, 0x39,
+ 0xB2, 0x71, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ };
+
+ {
+ SvStorageStreamRef xStor( rObj->OpenSotStream( C2S("\1CompObj")));
+ xStor->Write(aCompObj,sizeof(aCompObj));
+ DBG_ASSERT((xStor.Is() && (SVSTREAM_OK == xStor->GetError())),"damn");
+ }
+
+ {
+ SvStorageStreamRef xStor3( rObj->OpenSotStream( C2S("\3ObjInfo")));
+ xStor3->Write(aObjInfo,sizeof(aObjInfo));
+ DBG_ASSERT((xStor3.Is() && (SVSTREAM_OK == xStor3->GetError())),"damn");
+ }
+
+ static sal_uInt8 __READONLY_DATA aOCXNAME[] = {
+ 0x54, 0x00, 0x6F, 0x00, 0x67, 0x00, 0x67, 0x00,
+ 0x6C, 0x00, 0x65, 0x00, 0x42, 0x00, 0x75, 0x00,
+ 0x74, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x6E, 0x00,
+ 0x31, 0x00, 0x00, 0x00, 0x00, 0x00
+ };
+
+ {
+ SvStorageStreamRef xStor2( rObj->OpenSotStream( C2S("\3OCXNAME")));
+ xStor2->Write(aOCXNAME,sizeof(aOCXNAME));
+ DBG_ASSERT((xStor2.Is() && (SVSTREAM_OK == xStor2->GetError())),"damn");
+ }
+
+ SvStorageStreamRef xContents( rObj->OpenSotStream( C2S("contents")));
+
+ return WriteContents(xContents,rPropSet,rSize);
+}
+
+sal_Bool OCX_ToggleButton::WriteContents(SvStorageStreamRef &rContents,
+ const uno::Reference< beans::XPropertySet > &rPropSet,
+ const awt::Size &rSize)
+{
+ sal_Bool bRet=sal_True;
+ sal_uInt32 nOldPos = rContents->Tell();
+ rContents->SeekRel(12);
+
+ pBlockFlags[0] = 0;
+ pBlockFlags[1] = 0x01;
+ pBlockFlags[2] = 0;
+ pBlockFlags[3] = 0x80;
+ pBlockFlags[4] = 0;
+ pBlockFlags[5] = 0;
+ pBlockFlags[6] = 0;
+ pBlockFlags[7] = 0;
+
+ uno::Any aTmp = rPropSet->getPropertyValue(WW8_ASCII2STR("Enabled"));
+ fEnabled = any2bool(aTmp);
+
+ sal_uInt8 nTemp=fEnabled;
+ if (fEnabled)
+ nTemp = nTemp << 1;
+ if (fBackStyle)
+ nTemp |= 0x08;
+ *rContents << nTemp;
+ pBlockFlags[0] |= 0x01;
+ *rContents << sal_uInt8(0x00);
+ nTemp = 0;
+ aTmp = rPropSet->getPropertyValue(WW8_ASCII2STR("MultiLine"));
+ fWordWrap = any2bool(aTmp);
+ if (fWordWrap)
+ nTemp |= 0x80;
+ *rContents << nTemp;
+ *rContents << sal_uInt8(0x00);
+
+ aTmp = rPropSet->getPropertyValue(WW8_ASCII2STR("BackgroundColor"));
+ if (aTmp.hasValue())
+ aTmp >>= mnBackColor;
+ *rContents << ExportColor(mnBackColor);
+ pBlockFlags[0] |= 0x02;
+
+ aTmp = rPropSet->getPropertyValue(WW8_ASCII2STR("TextColor"));
+ if (aTmp.hasValue())
+ aTmp >>= mnForeColor;
+ *rContents << ExportColor(mnForeColor);
+ pBlockFlags[0] |= 0x04;
+
+ nStyle = 6;
+ *rContents << nStyle;
+ pBlockFlags[0] |= 0x40;
+
+ WriteAlign(rContents,4);
+ nValueLen = 1|SVX_MSOCX_COMPRESSED;
+ aTmp = rPropSet->getPropertyValue(WW8_ASCII2STR("State"));
+ sal_Int16 nDefault = sal_Int16();
+ aTmp >>= nDefault;
+ *rContents << nValueLen;
+ pBlockFlags[2] |= 0x40;
+
+ SvxOcxString aCaption( rPropSet->getPropertyValue(WW8_ASCII2STR("Label")) );
+ aCaption.WriteLenField( *rContents );
+ if (aCaption.HasData())
+ pBlockFlags[2] |= 0x80;
+
+ WriteAlign(rContents,4);
+ *rContents << rSize.Width;
+ *rContents << rSize.Height;
+
+ nDefault += 0x30;
+ *rContents << sal_uInt8(nDefault);
+ *rContents << sal_uInt8(0x00);
+
+ aCaption.WriteCharArray( *rContents );
+
+ WriteAlign(rContents,4);
+ nFixedAreaLen = static_cast<sal_uInt16>(rContents->Tell()-nOldPos-4);
+ bRet = aFontData.Export(rContents,rPropSet);
+ rContents->Seek(nOldPos);
+ *rContents << nStandardId;
+ *rContents << nFixedAreaLen;
+
+ *rContents << pBlockFlags[0];
+ *rContents << pBlockFlags[1];
+ *rContents << pBlockFlags[2];
+ *rContents << pBlockFlags[3];
+ *rContents << pBlockFlags[4];
+ *rContents << pBlockFlags[5];
+ *rContents << pBlockFlags[6];
+ *rContents << pBlockFlags[7];
+
+ DBG_ASSERT((rContents.Is() &&
+ (SVSTREAM_OK==rContents->GetError())),"damn");
+ return bRet;
+}
+
+sal_Bool OCX_Label::Import(uno::Reference< beans::XPropertySet > &rPropSet)
+{
+ uno::Any aTmp(&sName,getCppuType((OUString *)0));
+ rPropSet->setPropertyValue( WW8_ASCII2STR("Name"), aTmp );
+
+ sal_Bool bTemp;
+ if ((!(fEnabled)) || (fLocked))
+ bTemp = sal_False;
+ else
+ bTemp = sal_True;
+ aTmp = bool2any(bTemp);
+ rPropSet->setPropertyValue( WW8_ASCII2STR("Enabled"), aTmp);
+
+ aTmp <<= ImportColor(mnForeColor);
+ rPropSet->setPropertyValue( WW8_ASCII2STR("TextColor"), aTmp);
+
+ // background color: fBackStyle==0 -> transparent
+ if( fBackStyle )
+ {
+ aTmp <<= ImportColor(mnBackColor);
+ }
+ else
+ {
+ // try fake transparent by using parents backColor
+ if ( bSetInDialog && mpParent != NULL )
+ {
+ aTmp <<= ImportColor( mpParent->mnBackColor );
+ }
+ else
+ {
+ aTmp = uno::Any(); // use SO default
+ }
+ }
+ rPropSet->setPropertyValue( WW8_ASCII2STR("BackgroundColor"), aTmp);
+
+ aTmp <<= ImportBorder(nSpecialEffect,nBorderStyle);
+ rPropSet->setPropertyValue( WW8_ASCII2STR("Border"), aTmp);
+
+ aTmp <<= ImportColor( nBorderColor );
+ rPropSet->setPropertyValue( WW8_ASCII2STR("BorderColor"), aTmp);
+
+ bTemp=fWordWrap;
+ aTmp = bool2any(bTemp);
+ rPropSet->setPropertyValue( WW8_ASCII2STR("MultiLine"), aTmp);
+
+ if (pCaption)
+ {
+ aTmp <<= lclCreateOUString( pCaption, nCaptionLen );
+ rPropSet->setPropertyValue( WW8_ASCII2STR("Label"), aTmp);
+ }
+
+ aFontData.Import(rPropSet);
+ return sal_True;
+}
+
+sal_Bool OCX_ComboBox::Import(com::sun::star::uno::Reference<
+ com::sun::star::beans::XPropertySet> &rPropSet)
+{
+
+ uno::Any aTmp(&sName,getCppuType((OUString *)0));
+ rPropSet->setPropertyValue( WW8_ASCII2STR("Name"), aTmp );
+
+ aTmp = bool2any(fEnabled != 0);
+ rPropSet->setPropertyValue( WW8_ASCII2STR("Enabled"), aTmp);
+
+ aTmp = bool2any(fLocked != 0);
+ rPropSet->setPropertyValue( WW8_ASCII2STR("ReadOnly"), aTmp);
+
+ aTmp = bool2any( nDropButtonStyle != 0 );
+ rPropSet->setPropertyValue( WW8_ASCII2STR("Dropdown"), aTmp);
+
+ aTmp = bool2any( fHideSelection != 0 );
+ rPropSet->setPropertyValue( WW8_ASCII2STR( "HideInactiveSelection" ), aTmp);
+
+ aTmp <<= ImportColor(mnForeColor);
+ rPropSet->setPropertyValue( WW8_ASCII2STR("TextColor"), aTmp);
+
+ if (pValue)
+ {
+ aTmp <<= lclCreateOUString( pValue, nValueLen );
+ if ( bSetInDialog )
+ {
+ rPropSet->setPropertyValue( WW8_ASCII2STR("Text"), aTmp);
+ }
+ else
+ {
+ rPropSet->setPropertyValue( WW8_ASCII2STR("DefaultText"), aTmp);
+ }
+ }
+
+ aTmp <<= ImportColor(mnBackColor);
+ rPropSet->setPropertyValue( WW8_ASCII2STR("BackgroundColor"), aTmp);
+
+ aTmp <<= ImportBorder(nSpecialEffect,nBorderStyle);
+ rPropSet->setPropertyValue( WW8_ASCII2STR("Border"), aTmp);
+
+ aTmp <<= ImportColor( nBorderColor );
+ rPropSet->setPropertyValue( WW8_ASCII2STR("BorderColor"), aTmp);
+
+ sal_Int16 nTmp=static_cast<sal_Int16>(nMaxLength);
+ aTmp <<= nTmp;
+ rPropSet->setPropertyValue( WW8_ASCII2STR("MaxTextLen"), aTmp);
+
+ aFontData.Import(rPropSet);
+ return sal_True;
+}
+
+sal_Bool OCX_ComboBox::WriteContents(SvStorageStreamRef &rContents,
+ const uno::Reference< beans::XPropertySet > &rPropSet,
+ const awt::Size &rSize)
+{
+ sal_Bool bRet=sal_True;
+ sal_uInt32 nOldPos = rContents->Tell();
+ rContents->SeekRel(12);
+
+ pBlockFlags[0] = 0;
+ pBlockFlags[1] = 0x01;
+ pBlockFlags[2] = 0x00;
+ pBlockFlags[3] = 0x80;
+ pBlockFlags[4] = 0;
+ pBlockFlags[5] = 0;
+ pBlockFlags[6] = 0;
+ pBlockFlags[7] = 0;
+
+
+ sal_uInt8 nTemp=0x19;//fEnabled;
+ uno::Any aTmp = rPropSet->getPropertyValue(WW8_ASCII2STR("Enabled"));
+ fEnabled = any2bool(aTmp);
+ if (fEnabled)
+ nTemp |= 0x02;
+
+ aTmp = rPropSet->getPropertyValue(WW8_ASCII2STR("ReadOnly"));
+ fLocked = any2bool(aTmp);
+ if (fLocked)
+ nTemp |= 0x04;
+
+ *rContents << nTemp;
+ pBlockFlags[0] |= 0x01;
+ *rContents << sal_uInt8(0x48);
+ *rContents << sal_uInt8(0x80);
+
+ nTemp = 0x0C;
+ fHideSelection = any2bool(rPropSet->getPropertyValue(WW8_ASCII2STR("HideInactiveSelection")));
+ if( fHideSelection )
+ nTemp |= 0x20;
+ *rContents << nTemp;
+
+ aTmp = rPropSet->getPropertyValue(WW8_ASCII2STR("BackgroundColor"));
+ if (aTmp.hasValue())
+ aTmp >>= mnBackColor;
+ *rContents << ExportColor(mnBackColor);
+ pBlockFlags[0] |= 0x02;
+
+ aTmp = rPropSet->getPropertyValue(WW8_ASCII2STR("TextColor"));
+ if (aTmp.hasValue())
+ aTmp >>= mnForeColor;
+ *rContents << ExportColor(mnForeColor);
+ pBlockFlags[0] |= 0x04;
+
+ aTmp = rPropSet->getPropertyValue(WW8_ASCII2STR("Border"));
+ sal_Int16 nBorder = sal_Int16();
+ aTmp >>= nBorder;
+ nSpecialEffect = ExportBorder(nBorder,nBorderStyle);
+ *rContents << nBorderStyle;
+ pBlockFlags[0] |= 0x10;
+
+ nStyle = 3;
+ *rContents << nStyle;
+ pBlockFlags[0] |= 0x40;
+
+ WriteAlign(rContents,2);
+
+ aTmp = rPropSet->getPropertyValue(WW8_ASCII2STR("LineCount"));
+ aTmp >>= nListRows;
+ *rContents << nListRows;
+ pBlockFlags[1] |= 0x40;
+
+ *rContents << sal_uInt8(1); //DefaultSelected One
+ pBlockFlags[2] |= 0x01;
+
+ aTmp = rPropSet->getPropertyValue(WW8_ASCII2STR("Dropdown"));
+ nDropButtonStyle = any2bool(aTmp);
+ if (nDropButtonStyle)
+ nDropButtonStyle=0x02;
+ *rContents << nDropButtonStyle;
+ pBlockFlags[2] |= 0x04;
+
+ SvxOcxString aValue( rPropSet->getPropertyValue(WW8_ASCII2STR("Text")) );
+ aValue.WriteLenField( *rContents );
+ if (aValue.HasData())
+ pBlockFlags[2] |= 0x40;
+
+ WriteAlign(rContents,4);
+ aTmp = rPropSet->getPropertyValue(WW8_ASCII2STR("BorderColor"));
+ if (aTmp.hasValue())
+ aTmp >>= nBorderColor;
+ *rContents << ExportColor(nBorderColor);
+ pBlockFlags[3] |= 0x02;
+
+ *rContents << nSpecialEffect;
+ pBlockFlags[3] |= 0x04;
+
+ WriteAlign(rContents,4);
+ *rContents << rSize.Width;
+ *rContents << rSize.Height;
+
+ aValue.WriteCharArray( *rContents );
+
+ WriteAlign(rContents,4);
+
+ nFixedAreaLen = static_cast<sal_uInt16>(rContents->Tell()-nOldPos-4);
+
+ bRet = aFontData.Export(rContents,rPropSet);
+
+ rContents->Seek(nOldPos);
+ *rContents << nStandardId;
+ *rContents << nFixedAreaLen;
+
+ *rContents << pBlockFlags[0];
+ *rContents << pBlockFlags[1];
+ *rContents << pBlockFlags[2];
+ *rContents << pBlockFlags[3];
+ *rContents << pBlockFlags[4];
+ *rContents << pBlockFlags[5];
+ *rContents << pBlockFlags[6];
+ *rContents << pBlockFlags[7];
+
+ DBG_ASSERT((rContents.Is() &&
+ (SVSTREAM_OK==rContents->GetError())),"damn");
+ return bRet;
+}
+
+
+sal_Bool OCX_ComboBox::Export(SvStorageRef &rObj,
+ const uno::Reference< beans::XPropertySet > &rPropSet,
+ const awt::Size &rSize)
+{
+ static sal_uInt8 __READONLY_DATA aCompObj[] = {
+ 0x01, 0x00, 0xFE, 0xFF, 0x03, 0x0A, 0x00, 0x00,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0x30, 0x1D, 0xD2, 0x8B,
+ 0x42, 0xEC, 0xCE, 0x11, 0x9E, 0x0D, 0x00, 0xAA,
+ 0x00, 0x60, 0x02, 0xF3, 0x1D, 0x00, 0x00, 0x00,
+ 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66,
+ 0x74, 0x20, 0x46, 0x6F, 0x72, 0x6D, 0x73, 0x20,
+ 0x32, 0x2E, 0x30, 0x20, 0x43, 0x6F, 0x6D, 0x62,
+ 0x6F, 0x42, 0x6F, 0x78, 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x45, 0x6D, 0x62, 0x65, 0x64, 0x64, 0x65,
+ 0x64, 0x20, 0x4F, 0x62, 0x6A, 0x65, 0x63, 0x74,
+ 0x00, 0x11, 0x00, 0x00, 0x00, 0x46, 0x6F, 0x72,
+ 0x6D, 0x73, 0x2E, 0x43, 0x6F, 0x6D, 0x62, 0x6F,
+ 0x42, 0x6F, 0x78, 0x2E, 0x31, 0x00, 0xF4, 0x39,
+ 0xB2, 0x71, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ };
+
+ {
+ SvStorageStreamRef xStor( rObj->OpenSotStream( C2S("\1CompObj")));
+ xStor->Write(aCompObj,sizeof(aCompObj));
+ DBG_ASSERT((xStor.Is() && (SVSTREAM_OK == xStor->GetError())),"damn");
+ }
+
+ {
+ SvStorageStreamRef xStor3( rObj->OpenSotStream( C2S("\3ObjInfo")));
+ xStor3->Write(aObjInfo,sizeof(aObjInfo));
+ DBG_ASSERT((xStor3.Is() && (SVSTREAM_OK == xStor3->GetError())),"damn");
+ }
+
+ static sal_uInt8 __READONLY_DATA aOCXNAME[] = {
+ 0x43, 0x00, 0x6F, 0x00, 0x6D, 0x00, 0x62, 0x00,
+ 0x6F, 0x00, 0x42, 0x00, 0x6F, 0x00, 0x78, 0x00,
+ 0x31, 0x00, 0x00, 0x00, 0x00, 0x00
+ };
+
+ {
+ SvStorageStreamRef xStor2( rObj->OpenSotStream( C2S("\3OCXNAME")));
+ xStor2->Write(aOCXNAME,sizeof(aOCXNAME));
+ DBG_ASSERT((xStor2.Is() && (SVSTREAM_OK == xStor2->GetError())),"damn");
+ }
+
+ SvStorageStreamRef xContents( rObj->OpenSotStream( C2S("contents")));
+ return WriteContents(xContents, rPropSet, rSize);
+}
+
+
+
+sal_Bool OCX_ListBox::Import(com::sun::star::uno::Reference<
+ com::sun::star::beans::XPropertySet> &rPropSet)
+{
+
+ uno::Any aTmp(&sName,getCppuType((OUString *)0));
+ rPropSet->setPropertyValue( WW8_ASCII2STR("Name"), aTmp );
+
+ sal_Bool bTmp=fEnabled;
+ aTmp = bool2any(bTmp);
+ rPropSet->setPropertyValue( WW8_ASCII2STR("Enabled"), aTmp);
+
+ bTmp=fLocked;
+ aTmp = bool2any(bTmp);
+ rPropSet->setPropertyValue( WW8_ASCII2STR("ReadOnly"), aTmp);
+
+ aTmp <<= ImportColor(mnForeColor);
+ rPropSet->setPropertyValue( WW8_ASCII2STR("TextColor"), aTmp);
+
+ sal_Bool bTemp = nMultiState;
+ aTmp = bool2any(bTemp);
+ rPropSet->setPropertyValue( WW8_ASCII2STR("MultiSelection"), aTmp);
+
+#if 0 //Don't delete this for now until I figure out if I can make this
+ if (pValue)
+ {
+ aTmp <<= lclCreateOUString( pValue, nValueLen );
+ xPropSet->setPropertyValue( WW8_ASCII2STR("DefaultText"), aTmp);
+ }
+#endif
+
+ aTmp <<= ImportColor(mnBackColor);
+ rPropSet->setPropertyValue( WW8_ASCII2STR("BackgroundColor"), aTmp);
+
+ aTmp <<= ImportBorder(nSpecialEffect,nBorderStyle);
+ rPropSet->setPropertyValue( WW8_ASCII2STR("Border"), aTmp);
+
+ aTmp <<= ImportColor( nBorderColor );
+ rPropSet->setPropertyValue( WW8_ASCII2STR("BorderColor"), aTmp);
+
+ aFontData.Import(rPropSet);
+ return sal_True;
+}
+
+sal_Bool OCX_ListBox::WriteContents(SvStorageStreamRef &rContents,
+ const uno::Reference< beans::XPropertySet > &rPropSet,
+ const awt::Size &rSize)
+{
+ sal_Bool bRet=sal_True;
+ sal_uInt32 nOldPos = rContents->Tell();
+ rContents->SeekRel(12);
+
+ pBlockFlags[0] = 0;
+ pBlockFlags[1] = 0x01;
+ pBlockFlags[2] = 0x01;
+ pBlockFlags[3] = 0x80;
+ pBlockFlags[4] = 0;
+ pBlockFlags[5] = 0;
+ pBlockFlags[6] = 0;
+ pBlockFlags[7] = 0;
+
+ uno::Any aTmp = rPropSet->getPropertyValue(WW8_ASCII2STR("Enabled"));
+ fEnabled = any2bool(aTmp);
+ sal_uInt8 nTemp=fEnabled;
+ if (fEnabled)
+ nTemp = nTemp << 1;
+
+ aTmp = rPropSet->getPropertyValue(WW8_ASCII2STR("ReadOnly"));
+ fLocked = any2bool(aTmp);
+ if (fLocked)
+ nTemp |= 0x04;
+
+ *rContents << nTemp;
+ pBlockFlags[0] |= 0x01;
+ *rContents << sal_uInt8(0x00);
+ *rContents << sal_uInt8(0x00);
+ *rContents << sal_uInt8(0x00);
+
+ aTmp = rPropSet->getPropertyValue(WW8_ASCII2STR("BackgroundColor"));
+ if (aTmp.hasValue())
+ aTmp >>= mnBackColor;
+ *rContents << ExportColor(mnBackColor);
+ pBlockFlags[0] |= 0x02;
+
+ aTmp = rPropSet->getPropertyValue(WW8_ASCII2STR("TextColor"));
+ if (aTmp.hasValue())
+ aTmp >>= mnForeColor;
+ *rContents << ExportColor(mnForeColor);
+ pBlockFlags[0] |= 0x04;
+
+ aTmp = rPropSet->getPropertyValue(WW8_ASCII2STR("Border"));
+ sal_Int16 nBorder = sal_Int16();
+ aTmp >>= nBorder;
+ nSpecialEffect = ExportBorder(nBorder,nBorderStyle);
+ WriteAlign(rContents,2);
+ *rContents << nBorderStyle;
+ pBlockFlags[0] |= 0x10;
+
+ aTmp = rPropSet->getPropertyValue(WW8_ASCII2STR("MultiSelection"));
+ nMultiState = any2bool(aTmp);
+
+ if (nMultiState)
+ {
+ *rContents << nMultiState;
+ pBlockFlags[0] |= 0x20;
+ }
+
+ nStyle = 2;
+ *rContents << nStyle;
+ pBlockFlags[0] |= 0x40;
+
+
+ WriteAlign(rContents,4);
+
+#if 0
+ SvxOcxString aValue( rPropSet->getPropertyValue(WW8_ASCII2STR("DefaultText")) );
+ aValue.WriteLenField( *rContents );
+ if (aValue.HasData())
+ pBlockFlags[2] |= 0x40;
+
+ WriteAlign(rContents,4);
+#endif
+
+ WriteAlign(rContents,4);
+ aTmp = rPropSet->getPropertyValue(WW8_ASCII2STR("BorderColor"));
+ if (aTmp.hasValue())
+ aTmp >>= nBorderColor;
+ *rContents << ExportColor(nBorderColor);
+ pBlockFlags[3] |= 0x02;
+
+ *rContents << nSpecialEffect;
+ pBlockFlags[3] |= 0x04;
+
+ WriteAlign(rContents,4);
+ *rContents << rSize.Width;
+ *rContents << rSize.Height;
+
+#if 0
+ aValue.WriteCharArray( *rContents );
+#endif
+
+ WriteAlign(rContents,4);
+
+ nFixedAreaLen = static_cast<sal_uInt16>(rContents->Tell()-nOldPos-4);
+
+ bRet = aFontData.Export(rContents,rPropSet);
+
+ rContents->Seek(nOldPos);
+ *rContents << nStandardId;
+ *rContents << nFixedAreaLen;
+
+ *rContents << pBlockFlags[0];
+ *rContents << pBlockFlags[1];
+ *rContents << pBlockFlags[2];
+ *rContents << pBlockFlags[3];
+ *rContents << pBlockFlags[4];
+ *rContents << pBlockFlags[5];
+ *rContents << pBlockFlags[6];
+ *rContents << pBlockFlags[7];
+
+ DBG_ASSERT((rContents.Is() &&
+ (SVSTREAM_OK==rContents->GetError())),"damn");
+ return bRet;
+}
+
+sal_Bool OCX_ListBox::Export(SvStorageRef &rObj,
+ const uno::Reference< beans::XPropertySet > &rPropSet,
+ const awt::Size &rSize)
+{
+ static sal_uInt8 __READONLY_DATA aCompObj[] = {
+ 0x01, 0x00, 0xFE, 0xFF, 0x03, 0x0A, 0x00, 0x00,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0x20, 0x1D, 0xD2, 0x8B,
+ 0x42, 0xEC, 0xCE, 0x11, 0x9E, 0x0D, 0x00, 0xAA,
+ 0x00, 0x60, 0x02, 0xF3, 0x1C, 0x00, 0x00, 0x00,
+ 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66,
+ 0x74, 0x20, 0x46, 0x6F, 0x72, 0x6D, 0x73, 0x20,
+ 0x32, 0x2E, 0x30, 0x20, 0x4C, 0x69, 0x73, 0x74,
+ 0x42, 0x6F, 0x78, 0x00, 0x10, 0x00, 0x00, 0x00,
+ 0x45, 0x6D, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64,
+ 0x20, 0x4F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x00,
+ 0x10, 0x00, 0x00, 0x00, 0x46, 0x6F, 0x72, 0x6D,
+ 0x73, 0x2E, 0x4C, 0x69, 0x73, 0x74, 0x42, 0x6F,
+ 0x78, 0x2E, 0x31, 0x00, 0xF4, 0x39, 0xB2, 0x71,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00
+ };
+
+ {
+ SvStorageStreamRef xStor( rObj->OpenSotStream( C2S("\1CompObj")));
+ xStor->Write(aCompObj,sizeof(aCompObj));
+ DBG_ASSERT((xStor.Is() && (SVSTREAM_OK == xStor->GetError())),"damn");
+ }
+
+ {
+ SvStorageStreamRef xStor3( rObj->OpenSotStream( C2S("\3ObjInfo")));
+ xStor3->Write(aObjInfo,sizeof(aObjInfo));
+ DBG_ASSERT((xStor3.Is() && (SVSTREAM_OK == xStor3->GetError())),"damn");
+ }
+
+ static sal_uInt8 __READONLY_DATA aOCXNAME[] = {
+ 0x4C, 0x00, 0x69, 0x00, 0x73, 0x00, 0x74, 0x00,
+ 0x42, 0x00, 0x6F, 0x00, 0x78, 0x00, 0x31, 0x00,
+ 0x00, 0x00, 0x00, 0x00
+ };
+
+ {
+ SvStorageStreamRef xStor2( rObj->OpenSotStream( C2S("\3OCXNAME")));
+ xStor2->Write(aOCXNAME,sizeof(aOCXNAME));
+ DBG_ASSERT((xStor2.Is() && (SVSTREAM_OK == xStor2->GetError())),"damn");
+ }
+
+ SvStorageStreamRef xContents( rObj->OpenSotStream( C2S("contents")));
+ return WriteContents(xContents, rPropSet, rSize);
+}
+
+sal_Bool OCX_Control::Read(SvStorageStream *pS)
+{
+ sal_uInt16 nIdentifier, nFixedAreaLen;
+ *pS >> nIdentifier;
+ DBG_ASSERT(nStandardId==nIdentifier,
+ "A control that has a different identifier");
+ *pS >> nFixedAreaLen;
+ pS->SeekRel(nFixedAreaLen);
+ return true;
+}
+
+sal_Bool OCX_ModernControl::Read(SvStorageStream *pS)
+{
+ long nStart = pS->Tell();
+ *pS >> nIdentifier;
+ DBG_ASSERT(nIdentifier==nStandardId,
+ "A control that has a different identifier");
+ *pS >> nFixedAreaLen;
+ pS->Read(pBlockFlags,8);
+
+ if (pBlockFlags[0] & 0x01)
+ {
+ sal_uInt8 nTemp;
+ *pS >> nTemp;
+
+ fEnabled = (nTemp & 0x02) >> 1;
+ fLocked = (nTemp & 0x04) >> 2;
+ fBackStyle = (nTemp & 0x08) >> 3;
+
+ *pS >> nTemp;
+
+ fColumnHeads = (nTemp & 0x04) >> 2;
+ fIntegralHeight = (nTemp & 0x08) >> 3;
+ fMatchRequired = (nTemp & 0x10) >> 4;
+ fAlignment = (nTemp & 0x20) >> 5;
+
+ *pS >> nTemp;
+
+ fDragBehaviour = (nTemp & 0x08) >> 3;
+ fEnterKeyBehaviour = (nTemp & 0x10) >> 4;
+ fEnterFieldBehaviour = (nTemp & 0x20) >> 5;
+ fTabKeyBehaviour = (nTemp & 0x40) >> 6;
+ fWordWrap = (nTemp & 0x80) >> 7;
+
+ *pS >> nTemp;
+ fSelectionMargin = (nTemp & 0x04) >> 2;
+ fAutoWordSelect = (nTemp & 0x08) >> 3;
+ fAutoSize = (nTemp & 0x10) >> 4;
+ fHideSelection = (nTemp & 0x20) >> 5;
+ fAutoTab = (nTemp & 0x40) >> 6;
+ fMultiLine = (nTemp & 0x80) >> 7;
+
+ }
+
+ /*If any of these are set they follow eachother in this order one after
+ another padded out to the next U32 boundary with 0's
+ U8 can abut each other U16 must start on a U16 boundary and are padded to
+ that with 0's. A standardish word alignment structure*/
+
+ if (pBlockFlags[0] & 0x02)
+ *pS >> mnBackColor;
+ if (pBlockFlags[0] & 0x04)
+ *pS >> mnForeColor;
+ if (pBlockFlags[0] & 0x08)
+ *pS >> nMaxLength;
+
+ if (pBlockFlags[0] & 0x10)
+ *pS >> nBorderStyle;
+ if (pBlockFlags[0] & 0x20)
+ *pS >> nScrollBars;
+ if (pBlockFlags[0] & 0x40)
+ *pS >> nStyle;// (UI 0 == Data 3, UI 2 = Data 7)
+ if (pBlockFlags[0] & 0x80)
+ *pS >> nMousePointer;
+
+ if (pBlockFlags[1] & 0x02)
+ *pS >> nPasswordChar; //HUH ??? always 0 ??? not sure maybe just padding
+
+ if (pBlockFlags[1] & 0x04)
+ {
+ ReadAlign(pS, pS->Tell() - nStart, 4);
+ *pS >> nListWidth;
+ }
+
+ if (pBlockFlags[1] & 0x08)
+ {
+ ReadAlign(pS, pS->Tell() - nStart, 2);
+ *pS >> nBoundColumn;
+ }
+ if (pBlockFlags[1] & 0x10)
+ {
+ ReadAlign(pS, pS->Tell() - nStart, 2);
+ *pS >> nTextColumn;
+ }
+ if (pBlockFlags[1] & 0x20)
+ {
+ ReadAlign(pS, pS->Tell() - nStart, 2);
+ *pS >> nColumnCount;
+ }
+ if (pBlockFlags[1] & 0x40)
+ {
+ ReadAlign(pS, pS->Tell() - nStart, 2);
+ *pS >> nListRows;
+ }
+ if (pBlockFlags[1] & 0x80)
+ {
+ ReadAlign(pS, pS->Tell() - nStart, 2);
+ *pS >> nUnknown8; //something to do with ColumnWidths
+ }
+ if (pBlockFlags[2] & 0x01)
+ *pS >> nMatchEntry;
+ if (pBlockFlags[2] & 0x02)
+ *pS >> nListStyle;
+ if (pBlockFlags[2] & 0x04)
+ *pS >> nShowDropButtonWhen;
+ if (pBlockFlags[2] & 0x10)
+ *pS >> nDropButtonStyle;
+ if (pBlockFlags[2] & 0x20)
+ *pS >> nMultiState;
+
+ bool bValue = (pBlockFlags[2] & 0x40) != 0;
+ if (bValue)
+ {
+ ReadAlign(pS, pS->Tell() - nStart, 4);
+ *pS >> nValueLen;
+ }
+ bool bCaption = (pBlockFlags[2] & 0x80) != 0;
+ if (bCaption)
+ {
+ ReadAlign(pS, pS->Tell() - nStart, 4);
+ *pS >> nCaptionLen;
+ }
+ if (pBlockFlags[3] & 0x01)
+ {
+ ReadAlign(pS, pS->Tell() - nStart, 4);
+ *pS >> nHorzPos;
+ *pS >> nVertPos;
+ }
+ if (pBlockFlags[3] & 0x02)
+ {
+ ReadAlign(pS, pS->Tell() - nStart, 4);
+ *pS >> nBorderColor;
+ }
+ if (pBlockFlags[3] & 0x04)
+ {
+ ReadAlign(pS, pS->Tell() - nStart, 4); // NEW
+ *pS >> nSpecialEffect;
+ pS->SeekRel( 3 ); // special effect is 32bit, not 8bit
+ }
+ if (pBlockFlags[3] & 0x08)
+ {
+ ReadAlign(pS, pS->Tell() - nStart, 2);
+ *pS >> nIcon;
+ DBG_ASSERT(nIcon == 0xFFFF, "Unexpected nIcon");
+ }
+ if (pBlockFlags[3] & 0x10)
+ {
+ ReadAlign(pS, pS->Tell() - nStart, 2);
+ *pS >> nPicture;
+ DBG_ASSERT(nPicture == 0xFFFF, "Unexpected nIcon");
+ }
+ if (pBlockFlags[3] & 0x20)
+ *pS >> nAccelerator;
+ /*
+ if (pBlockFlags[3] & 0x80)
+ *pS >> nUnknown9;
+ */
+ bool bGroupName = (pBlockFlags[4] & 0x01) != 0;
+ if (bGroupName)
+ {
+ ReadAlign(pS, pS->Tell() - nStart, 4);
+ *pS >> nGroupNameLen;
+ }
+
+ //End
+
+ ReadAlign(pS, pS->Tell() - nStart, 4);
+ *pS >> nWidth;
+ *pS >> nHeight;
+
+ if (bValue)
+ lclReadCharArray( *pS, pValue, nValueLen, pS->Tell() - nStart);
+
+ if (bCaption)
+ lclReadCharArray( *pS, pCaption, nCaptionLen, pS->Tell() - nStart);
+
+ if (bGroupName)
+ lclReadCharArray( *pS, pGroupName, nGroupNameLen, pS->Tell() - nStart);
+
+ ReadAlign(pS, pS->Tell() - nStart, 4);
+ if (nIcon)
+ {
+ pS->Read(pIconHeader,20);
+ *pS >> nIconLen;
+ pIcon = new sal_uInt8[nIconLen];
+ pS->Read(pIcon,nIconLen);
+ }
+
+ if (nPicture)
+ {
+ pS->Read(pPictureHeader,20);
+ *pS >> nPictureLen;
+ pPicture = new sal_uInt8[nPictureLen];
+ pS->Read(pPicture,nPictureLen);
+ }
+
+ return sal_True;
+}
+
+
+sal_Bool OCX_CommandButton::Read(SvStorageStream *pS)
+{
+ long nStart = pS->Tell();
+ *pS >> nIdentifier;
+ DBG_ASSERT(nStandardId==nIdentifier,
+ "A control that has a different identifier");
+ *pS >> nFixedAreaLen;
+ pS->Read(pBlockFlags,4);
+
+
+ if (pBlockFlags[0] & 0x01)
+ *pS >> mnForeColor;
+ if (pBlockFlags[0] & 0x02)
+ *pS >> mnBackColor;
+
+ if (pBlockFlags[0] & 0x04)
+ {
+ sal_uInt8 nTemp;
+ *pS >> nTemp;
+ fEnabled = (nTemp&0x02)>>1;
+ fLocked = (nTemp&0x04)>>2;
+ fBackStyle = (nTemp&0x08)>>3;
+ *pS >> nTemp;
+ *pS >> nTemp;
+ fWordWrap = (nTemp&0x80)>>7;
+ *pS >> nTemp;
+ fAutoSize = (nTemp&0x10)>>4;
+ }
+
+ bool bCaption = (pBlockFlags[0] & 0x08) != 0;
+ if (bCaption)
+ {
+ *pS >> nCaptionLen;
+ }
+ if (pBlockFlags[0] & 0x10) /*Picture Position, a strange mechanism here*/
+ {
+ *pS >> nVertPos;
+ *pS >> nHorzPos;
+ }
+
+ if (pBlockFlags[0] & 0x40) /*MousePointer*/
+ *pS >> nMousePointer;
+
+ if (pBlockFlags[0] & 0x80)
+ {
+ ReadAlign(pS, pS->Tell() - nStart, 2);
+ *pS >> nPicture;
+ }
+
+ if (pBlockFlags[1] & 0x01)
+ {
+ ReadAlign(pS, pS->Tell() - nStart, 2);
+ *pS >> nAccelerator;
+ }
+
+ // "take focus on click" is directly in content flags, not in option field...
+ mbTakeFocus = (pBlockFlags[1] & 0x02) == 0; // option is on, if flag is not set
+
+ if (pBlockFlags[1] & 0x04)
+ {
+ ReadAlign(pS, pS->Tell() - nStart, 2);
+ *pS >> nIcon;
+ }
+
+ if (bCaption)
+ lclReadCharArray( *pS, pCaption, nCaptionLen, pS->Tell() - nStart);
+
+ ReadAlign(pS, pS->Tell() - nStart, 4);
+ *pS >> nWidth;
+ *pS >> nHeight;
+
+ if (nIcon)
+ {
+ pS->Read(pIconHeader,20);
+ *pS >> nIconLen;
+ pIcon = new sal_uInt8[nIconLen];
+ pS->Read(pIcon,nIconLen);
+ }
+
+ if (nPicture)
+ {
+ pS->Read(pPictureHeader,20);
+ *pS >> nPictureLen;
+ pPicture = new sal_uInt8[nPictureLen];
+ pS->Read(pPicture,nPictureLen);
+ }
+
+ return sal_True;
+}
+
+sal_Bool OCX_Label::Read(SvStorageStream *pS)
+{
+ long nStart = pS->Tell();
+ *pS >> nIdentifier;
+ DBG_ASSERT(nStandardId==nIdentifier,
+ "A control that has a different identifier");
+ *pS >> nFixedAreaLen;
+ pS->Read(pBlockFlags,4);
+
+
+ if (pBlockFlags[0] & 0x01)
+ *pS >> mnForeColor;
+ if (pBlockFlags[0] & 0x02)
+ *pS >> mnBackColor;
+
+
+ if (pBlockFlags[0] & 0x04)
+ {
+ sal_uInt8 nTemp;
+ *pS >> nTemp;
+ fEnabled = (nTemp&0x02)>>1;
+ fLocked = (nTemp&0x04)>>2;
+ fBackStyle = (nTemp&0x08)>>3;
+ *pS >> nTemp;
+ *pS >> nTemp;
+ fWordWrap = (nTemp&0x80)>>7;
+ *pS >> nTemp;
+ fAutoSize = (nTemp&0x10)>>4;
+ }
+ bool bCaption = (pBlockFlags[0] & 0x08) != 0;
+ if (bCaption)
+ *pS >> nCaptionLen;
+
+ if (pBlockFlags[0] & 0x10)
+ {
+ *pS >> nVertPos;
+ *pS >> nHorzPos;
+ }
+
+ if (pBlockFlags[0] & 0x40)
+ *pS >> nMousePointer;
+
+ if (pBlockFlags[0] & 0x80)
+ {
+ ReadAlign(pS,pS->Tell() - nStart, 4);
+ *pS >> nBorderColor;
+ }
+
+ if (pBlockFlags[1] & 0x01)
+ {
+ ReadAlign(pS, pS->Tell() - nStart, 2);
+ *pS >> nBorderStyle;
+ }
+
+ if (pBlockFlags[1] & 0x02)
+ {
+ ReadAlign(pS, pS->Tell() - nStart, 2);
+ *pS >> nSpecialEffect;
+ }
+
+ if (pBlockFlags[1] & 0x04)
+ {
+ ReadAlign(pS, pS->Tell() - nStart, 2);
+ *pS >> nPicture;
+ }
+
+ if (pBlockFlags[1] & 0x08)
+ {
+ ReadAlign(pS, pS->Tell() - nStart, 2);
+ *pS >> nAccelerator;
+ }
+
+ if (pBlockFlags[1] & 0x10)
+ {
+ ReadAlign(pS, pS->Tell() - nStart, 2);
+ *pS >> nIcon;
+ }
+
+ if (bCaption)
+ lclReadCharArray( *pS, pCaption, nCaptionLen, pS->Tell() - nStart);
+
+ ReadAlign(pS, pS->Tell() - nStart, 4);
+ *pS >> nWidth;
+ *pS >> nHeight;
+
+ if (nPicture)
+ {
+ pS->Read(pPictureHeader,20);
+ *pS >> nPictureLen;
+ pPicture = new sal_uInt8[nPictureLen];
+ pS->Read(pPicture,nPictureLen);
+ }
+ if (nIcon)
+ {
+ pS->Read(pIconHeader,20);
+ *pS >> nIconLen;
+ pIcon = new sal_uInt8[nIconLen];
+ pS->Read(pIcon,nIconLen);
+ }
+
+ return sal_True;
+}
+
+TypeName::TypeName(sal_Char *pName, sal_uInt32 nStoreId, sal_uInt32 nLen, sal_uInt16 nType, sal_Int32 nLeft,
+ sal_Int32 nTop)
+ : msName(lclCreateOUString(pName, nLen)), mnType(nType), mnLeft(nLeft),
+ mnTop(nTop),mnStoreId(nStoreId)
+{
+}
+
+OCX_ContainerControl::OCX_ContainerControl( SotStorageRef& parent,
+ const ::rtl::OUString& storageName,
+ const ::rtl::OUString& sN,
+ const uno::Reference< container::XNameContainer > &rParent,
+ OCX_Control* pParent ) :
+ OCX_Control(sN, pParent), rbGroupMgr( sName ), mxParent(rParent), nNoRecords(0), nTotalLen(0), containerType( STDCONTAINER )
+{
+
+ mContainerStorage = parent->OpenSotStorage(storageName,
+ STREAM_READWRITE |
+ STREAM_NOCREATE |
+ STREAM_SHARE_DENYALL);
+ mContainerStream = mContainerStorage->OpenSotStream(
+ String(RTL_CONSTASCII_STRINGPARAM("f"),
+ RTL_TEXTENCODING_MS_1252),
+ STREAM_STD_READ | STREAM_NOCREATE);
+ mContainedControlsStream = mContainerStorage->OpenSotStream( String(RTL_CONSTASCII_STRINGPARAM("o"),
+ RTL_TEXTENCODING_MS_1252),
+ STREAM_STD_READ | STREAM_NOCREATE);
+}
+OCX_ContainerControl::~OCX_ContainerControl()
+{
+ CtrlIterator aEnd = mpControls.end();
+ for (CtrlIterator aIter = mpControls.begin(); aIter != aEnd; ++ aIter )
+ {
+ delete *aIter;
+ }
+}
+
+// Really import should receive the parent e.g. a Userform, Frame or Multi Page
+// and call import on its containees with itself ( up-called from
+// the base class ) but... the reality is we have no containment model
+// so we make sure rPropSet is always the parent Dialog
+
+sal_Bool OCX_ContainerControl::Import(uno::Reference<beans::XPropertySet>& /* rProps */ )
+{
+ if ( !mxParent.is() )
+ {
+ return sal_False;
+ }
+ CtrlIterator aEnd = mpControls.end();
+// int count = 0;
+ for (CtrlIterator aIter = mpControls.begin(); aIter != aEnd; ++ aIter )
+ {
+ if ( !(*aIter)->Import( mxParent ) )
+ {
+ return sal_False;
+ }
+ }
+ return sal_True;
+}
+
+OUString OCX_ContainerControl::createSubStreamName( const sal_uInt32& subStorageId )
+{
+ static OUString sI = OUString::createFromAscii("i");
+ static OUString sZero = OUString::createFromAscii( "0" );
+ OUStringBuffer buf( 6 );
+ buf.append( sI );
+ // for subStorage id < 10 stream name has leading '0'
+ // eg "i07"
+ if ( subStorageId < 10 )
+ {
+ buf.append( sZero );
+ }
+ buf.append( OUString::valueOf( (sal_Int32)subStorageId ) );
+ return buf.makeStringAndClear();
+}
+
+bool OCX_ContainerControl::createFromContainerRecord( const ContainerRecord& record, OCX_Control*& pControl )
+{
+ pControl = NULL;
+ switch ( record.nTypeIdent)
+ {
+ case CMDBUTTON:
+ pControl = new OCX_CommandButton;
+ break;
+ case LABEL:
+ pControl = new OCX_UserFormLabel(this);
+ break;
+ case TEXTBOX:
+ pControl = new OCX_TextBox;
+ break;
+ case LISTBOX:
+ pControl = new OCX_ListBox;
+ break;
+ case COMBOBOX:
+ pControl = new OCX_ComboBox;
+ break;
+ case CHECKBOX:
+ pControl = new OCX_CheckBox;
+ break;
+ case OPTIONBUTTON:
+ pControl = new OCX_OptionButton;
+ break;
+ case TOGGLEBUTTON:
+ pControl = new OCX_ToggleButton;
+ break;
+ case IMAGE: //Image
+ {
+ pControl = new OCX_Image;
+ break;
+ }
+ case PAGE: // Page
+ {
+ OUString sMSStore = createSubStreamName( record.nSubStorageId );
+ pControl = new OCX_Page(mContainerStorage, sMSStore,
+ record.cName, mxParent, this);
+ break;
+ }
+ case MULTIPAGE: // MultiPage
+ {
+ OUString sMSStore = createSubStreamName( record.nSubStorageId );
+ pControl = new OCX_MultiPage( mContainerStorage, sMSStore,
+ record.cName, mxParent, this);
+ break;
+ }
+ case FRAME: //Frame
+ {
+ OUString sFrameStore = createSubStreamName( record.nSubStorageId );
+ pControl = new OCX_Frame(mContainerStorage, sFrameStore,
+ record.cName, mxParent, this);
+
+ break;
+ }
+ case SPINBUTTON: //SpinButton
+ {
+ pControl = new OCX_SpinButton;
+ break;
+ }
+ case TABSTRIP: //TabStrip
+ {
+ pControl = new OCX_TabStrip;
+ break;
+ }
+ case SCROLLBAR: //ScrollBar
+ pControl = new OCX_ScrollBar;
+ break;
+ case PROGRESSBAR: //ProgressBar Active X control
+ pControl = new OCX_ProgressBar;
+ break;
+ default:
+ OSL_TRACE( "**** Unknown control 0x%x", record.nTypeIdent );
+ DBG_ERROR( "Unknown control");
+ return false;
+ }
+ pControl->sName = record.cName;
+ return true;
+}
+
+
+void addSeperator( std::vector< OCX_Control* >& dest )
+{
+ OCX_Control* seperator = new OCX_CommandButton;
+ seperator->SetInDialog(true);
+ seperator->sName = C2S("GroupSeperator");
+ dest.push_back( seperator );
+}
+
+void addRButtons( std::vector< OCX_Control* >& src,
+ std::vector< OCX_Control* >& dest,
+ bool addGroupSeperator )
+{
+ if ( addGroupSeperator )
+ {
+ addSeperator( dest );
+ }
+
+ for ( CtrlIterator rbIter = src.begin(); rbIter != src.end(); ++rbIter )
+ {
+ dest.push_back( *rbIter );
+ }
+}
+
+void OCX_ContainerControl::ProcessControl(OCX_Control* pControl,SvStorageStream* /* pS */, ContainerRecord& rec )
+{
+ SotStorageStreamRef oStream = mContainedControlsStream;
+
+ // can insert into OO Dialog (e.g is this a supported dialog control)??
+ if ( rec.nTypeIdent == SPINBUTTON ||
+ rec.nTypeIdent == TABSTRIP)
+ {
+ // skip the record in the stream, discard the control
+ oStream->SeekRel( rec.nSubStreamLen );
+ delete pControl;
+ }
+ else
+ {
+ // A container control needs to read the f stream in
+ // the folder ( substorage ) associated with this control
+ if ( rec.nTypeIdent == FRAME ||
+ rec.nTypeIdent == MULTIPAGE||
+ rec.nTypeIdent == PAGE )
+ {
+ OCX_ContainerControl* pContainer =
+ static_cast< OCX_ContainerControl* >( pControl );
+ oStream = pContainer->getContainerStream();
+ }
+
+ pControl->sName = rec.cName;
+ pControl->msToolTip = rec.controlTip;
+ // Position of controls is relative to the container
+ pControl->mnTop = rec.nTop + mnTop;
+ pControl->mnLeft = rec.nLeft + mnLeft;
+ // MS tabIndex, pretty useless in OpenOffice land
+ // as tab indexes in MS are relative to parent container.
+ // However we need this value in order to set
+ // OpenOffice tab indices in a sensible way to
+ // reflect the ms tabbing from orig MS UserForm, see below
+ pControl->mnTabPos = rec.nTabPos;
+ pControl->SetInDialog(true);
+ pControl->mbVisible = rec.bVisible;
+ if ( mnStep )
+ {
+ // If the container has a step then it should be
+ // applied to all containees
+ pControl->mnStep = mnStep;
+ }
+
+ // #117490# DR: container records provide size of substream, use it here...
+
+ // remember initial position to set correct stream position
+ ULONG nStrmPos = oStream->Tell();
+ // import control, may return with invalid stream position
+ pControl->FullRead(oStream);
+ // set stream to position behind substream of this control
+ oStream->Seek( nStrmPos + rec.nSubStreamLen );
+
+ //need to fake grouping behaviour for radio ( option ) buttons
+ if ( rec.nTypeIdent == OPTIONBUTTON )
+ {
+ OCX_OptionButton* pRButton =
+ static_cast< OCX_OptionButton*>(pControl);
+ rbGroupMgr.addRadioButton( pRButton );
+ }
+ else
+ {
+ mpControls.push_back( pControl );
+ }
+ }
+}
+
+sal_Bool OCX_ContainerControl::Read(SvStorageStream *pS)
+{
+
+ if ( mpParent )
+ {
+ mnBackColor = mpParent->mnBackColor;
+ }
+
+ std::auto_ptr< ContainerRecReader > reader (
+ ContainerRecordReaderFac::instance( containerType ) );
+
+ reader->Read( this, pS );
+ // Need to honour the MS Tab Indexes. However MS tab indexes are
+ // relative to parent, this hack sorts the controls in each container
+ // based on the ms tab indexes. When import is called we create the
+ // controls in Open/Star office based on the order of the tab indexes,
+ // this ensures that the default tab index created by Star/Open office
+ // reflects the "flattened" ms tab order.
+ ::std::sort( mpControls.begin(), mpControls.end(), SortOrderByTabPos() );
+ mpControls = rbGroupMgr.insertGroupsIntoControlList( mpControls );
+ return true;
+}
+
+OCX_MultiPage::OCX_MultiPage( SotStorageRef& parent,
+ const ::rtl::OUString& storageName,
+ const ::rtl::OUString& sN,
+ const uno::Reference< container::XNameContainer > &rDialog,
+ OCX_Control* pParent):
+ OCX_ContainerControl(parent, storageName, sN, rDialog, pParent ), fUnknown1(0), fEnabled(1),
+ fLocked(0), fBackStyle(1), fWordWrap(1), fAutoSize(0), nCaptionLen(0),
+ nVertPos(1), nHorzPos(7), nMousePointer(0), nBorderColor(0x80000012),
+ nKeepScrollBarsVisible(3), nCycle(0), nBorderStyle(0), nSpecialEffect(0),
+ nPicture(0), nPictureAlignment(2), nPictureSizeMode(0),
+ bPictureTiling(FALSE), nAccelerator(0), nIcon(0), pCaption(0),
+ nScrollWidth(0), nScrollHeight(0), nIconLen(0), pIcon(0), nPictureLen(0),
+ pPicture(0)
+{
+ msDialogType = C2U("NotSupported");
+ mnForeColor = 0x80000012L,
+ mnBackColor = 0x8000000FL;
+ bSetInDialog = true;// UserForm control only
+ aFontData.SetHasAlign(TRUE);
+ containerType = MULTIPAGE;
+ mnCurrentPageStep = 0;
+}
+
+void OCX_MultiPage::ProcessControl(OCX_Control* pControl, SvStorageStream* /* pS */, ContainerRecord& rec )
+{
+ SotStorageStreamRef oStream = mContainedControlsStream;
+
+ OCX_Page *pPage = NULL;
+ if ( rec.nTypeIdent == PAGE )
+ pPage = static_cast< OCX_Page* >( pControl );
+ if ( pPage != NULL )
+ {
+ pPage->mnStep = ++mnCurrentPageStep;
+
+ pPage->mnTop = mnTop;// move these to Page::import ?
+ pPage->mnLeft = mnLeft;
+ pPage->mnBackColor = mnBackColor;
+
+ oStream = pPage->getContainerStream();;
+ // Position of controls is relative to pos of this MuliPage
+ // Control
+ pPage->FullRead( oStream );
+
+ mpControls.push_back( pPage );
+ }
+ else
+ {
+ OSL_TRACE("!!!! Unsupported Control 0x%x ", rec.nTypeIdent);
+ DBG_ERROR("MultiPage error expected Page control");
+ }
+
+}
+
+sal_Bool OCX_MultiPage::Read(SvStorageStream *pS)
+{
+ // Unlike the other containers e.g. UserForm & Frame
+ // the o stream is does not contain info for the contained controls
+ // ( e.g. the pages themselves ) but seems to be for the MultiPage
+ // itself - need to check this in more detail
+
+ // For the moment skip read of the MultiPage specific properties
+ // not much point reading these as we can't display the multi page
+ // control or in fact any sort of tabbed layout, best we can do is
+ // import just the contained controls of the individual pages
+ // Note: the record skipped below ( does not contain the expected
+ // info on this control, that seems to be contained in the o stream,
+ // see comment above)
+ OCX_Control skip(C2S("Dummy"));
+ skip.Read( pS );
+ mnCurrentPageStep = mnStep; //( set step of of pages relative to step
+ //of this MultiPage ( e.g. emulate containment )
+ return OCX_ContainerControl::Read(pS);
+}
+
+
+sal_Bool OCX_MultiPage::Import(com::sun::star::uno::Reference<
+ com::sun::star::beans::XPropertySet> &rPropSet)
+{
+ // Calls import on contained controls
+ OCX_ContainerControl::Import( rPropSet );
+ return sal_True;
+}
+
+sal_Bool OCX_MultiPage::Import(com::sun::star::uno::Reference<
+ com::sun::star::container::XNameContainer>
+ &rDialog)
+{
+ uno::Reference<beans::XPropertySet> xPropSet( rDialog, uno::UNO_QUERY );
+
+ // Although MultiPage is not represeted by a "real" control we still
+ // need to propagate the backcolor of this logical parent
+ // ( the dialog or Frame or whatever ) to the children of this control.
+ // For example the controls contained in the Page of a
+ // MultiPage control use the parents backcolor ( e,g,
+ // Pages backcolor ) when trying to fake transparency
+ mnBackColor = mpParent->mnBackColor;
+
+ if ( xPropSet.is() )
+ {
+ // Calls import on contained pages
+ return OCX_ContainerControl::Import( xPropSet );
+ }
+ OSL_TRACE("*** Major problem, no dialog to add controls to ");
+ DBG_ERROR(" Major problem, no dialog to add controls to ");
+ return false;
+}
+
+
+
+OCX_Page::OCX_Page( SotStorageRef& parent,
+ const ::rtl::OUString& storageName,
+ const ::rtl::OUString& sN,
+ const uno::Reference< container::XNameContainer > &rDialog,
+ OCX_Control* pParent):
+ OCX_ContainerControl(parent, storageName, sN, rDialog, pParent ),
+ fUnknown1(0), fEnabled(1), fLocked(0),
+ fBackStyle(1), fWordWrap(1), fAutoSize(0), nCaptionLen(0), nVertPos(1),
+ nHorzPos(7), nMousePointer(0), nBorderColor(0x80000012),
+ nKeepScrollBarsVisible(3), nCycle(0), nBorderStyle(0), nSpecialEffect(0),
+ nPicture(0), nPictureAlignment(2), nPictureSizeMode(0),
+ bPictureTiling(FALSE), nAccelerator(0), nIcon(0), pCaption(0),
+ nScrollWidth(0), nScrollHeight(0), nIconLen(0), pIcon(0), nPictureLen(0),
+ pPicture(0)
+{
+ msDialogType = C2U("NotSupported");
+ mnForeColor = 0x80000012,
+ mnBackColor = 0x8000000F,
+ bSetInDialog = true;// UserForm control only
+ aFontData.SetHasAlign(TRUE);
+}
+
+
+sal_Bool OCX_Page::Read(SvStorageStream *pS)
+{
+ long nStart = pS->Tell();
+ *pS >> nIdentifier;
+ DBG_ASSERT(0x400==nIdentifier,
+ "A control that has a different identifier");
+ *pS >> nFixedAreaLen;
+ pS->Read(pBlockFlags,4);
+
+ pS->SeekRel( nFixedAreaLen - sizeof( pBlockFlags ) );
+
+ ReadAlign( pS, pS->Tell() - nStart, 4);
+
+ if (pBlockFlags[2] & 0x10)
+ {
+ //Font Stuff..
+ pS->SeekRel(0x1a);
+ sal_uInt8 nFontLen;
+ *pS >> nFontLen;
+ pS->SeekRel(nFontLen);
+ }
+ return OCX_ContainerControl::Read(pS);
+
+}
+
+sal_Bool OCX_Page::Import(com::sun::star::uno::Reference<
+ com::sun::star::container::XNameContainer>
+ &rDialog)
+{
+
+ uno::Reference<beans::XPropertySet> xPropSet( rDialog, uno::UNO_QUERY );
+ if ( xPropSet.is() )
+ {
+ // apply Step to contained controls
+ CtrlIterator aEnd = mpControls.end();
+ for (CtrlIterator aIter = mpControls.begin(); aIter != aEnd; ++ aIter )
+ {
+ (*aIter)->mnStep = mnStep;
+ }
+ // Calls import on contained pages
+ return OCX_ContainerControl::Import( xPropSet );
+ }
+ OSL_TRACE("*** Major problem, no dialog to add controls to ");
+ DBG_ERROR("*** Major problem, no dialog to add controls to ");
+ return sal_False;
+}
+
+OCX_Frame::OCX_Frame( SotStorageRef& parent,
+ const ::rtl::OUString& storageName,
+ const ::rtl::OUString& sN,
+ const uno::Reference< container::XNameContainer > &rDialog, OCX_Control* pParent):
+ OCX_ContainerControl(parent, storageName, sN, rDialog, pParent ),fUnknown1(0),fEnabled(1), fLocked(0),
+ fBackStyle(1), fWordWrap(1), fAutoSize(0), nCaptionLen(0), nVertPos(1),
+ nHorzPos(7), nMousePointer(0), nBorderColor(0x80000012),
+ nKeepScrollBarsVisible(3), nCycle(0), nBorderStyle(0), nSpecialEffect(0),
+ nPicture(0), nPictureAlignment(2), nPictureSizeMode(0),
+ bPictureTiling(FALSE), nAccelerator(0), nIcon(0), pCaption(0),
+ nScrollWidth(0), nScrollHeight(0), nScrollLeft(0), nScrollTop(0), nIconLen(0), pIcon(0), nPictureLen(0),
+ pPicture(0)
+{
+ msDialogType = C2U("com.sun.star.awt.UnoControlGroupBoxModel");
+ mnForeColor = 0x80000012;
+ mnBackColor = 0x8000000F;
+ bSetInDialog = true;// UserForm control only
+ aFontData.SetHasAlign(TRUE);
+}
+
+
+sal_Bool OCX_Frame::Read(SvStorageStream *pS)
+{
+ long nStart = pS->Tell();
+ *pS >> nIdentifier;
+ DBG_ASSERT(0x400==nIdentifier,
+ "A control that has a different identifier");
+ *pS >> nFixedAreaLen;
+ pS->Read(pBlockFlags,4);
+
+ if (pBlockFlags[0] & 0x01)
+ {
+ DBG_ASSERT(!this, "ARSE");
+ }
+ if (pBlockFlags[0] & 0x02)
+ *pS >> mnBackColor;
+ if (pBlockFlags[0] & 0x04)
+ *pS >> mnForeColor;
+ if (pBlockFlags[0] & 0x08)
+ *pS >> fUnknown1;
+ if (pBlockFlags[0] & 0x40)
+ {
+ sal_uInt8 nTemp;
+ *pS >> nTemp;
+ fEnabled = (nTemp&0x04)>>2;
+ fBackStyle = (nTemp&0x08)>>3;
+ *pS >> nTemp;
+ *pS >> nTemp;
+ fWordWrap = (nTemp&0x80)>>7;
+ *pS >> nTemp;
+ fAutoSize = (nTemp&0x10)>>4;
+ }
+ if (pBlockFlags[0] & 0x80)
+ {
+ *pS >> nBorderStyle;
+ }
+
+ ReadAlign(pS, pS->Tell() - nStart, 4);
+
+ if (pBlockFlags[1] & 0x01)
+ *pS >> nMousePointer;
+ if (pBlockFlags[1] & 0x02)
+ *pS >> nKeepScrollBarsVisible;
+ if (pBlockFlags[1] & 0x20)
+ *pS >> fUnknown1; // another unknown 32 bit ( or is 8 or 16 bit with padding ? )
+
+ if (pBlockFlags[1] & 0x80)
+ {
+ ReadAlign(pS, pS->Tell() - nStart, 2);
+ *pS >> nIcon;
+ DBG_ASSERT(nIcon == 0xFFFF, "Unexpected nIcon");
+ }
+
+ bool bCaption = false;
+
+ if (pBlockFlags[2] & 0x01)
+ *pS >> nCycle;
+ if (pBlockFlags[2] & 0x02)
+ *pS >> nSpecialEffect;
+
+ if (pBlockFlags[2] & 0x04)
+ {
+ ReadAlign(pS, pS->Tell() - nStart, 4);
+ *pS >> nBorderColor;
+ }
+
+ if (pBlockFlags[2] & 0x08)
+ {
+ ReadAlign(pS, pS->Tell() - nStart, 4);
+ *pS >> nCaptionLen;
+ bCaption = true;
+ }
+
+ if (pBlockFlags[2] & 0x10)
+ {
+ ReadAlign(pS, pS->Tell() - nStart, 2);
+ sal_uInt16 nNoIdea;
+ *pS >> nNoIdea;
+ DBG_ASSERT(nNoIdea == 0xFFFF, "Expected 0xFFFF, (related to font ?)");
+ }
+
+ if (pBlockFlags[2] & 0x20)
+ {
+ ReadAlign(pS, pS->Tell() - nStart, 2);
+ *pS >> nPicture;
+ DBG_ASSERT(nPicture == 0xFFFF, "Unexpected nIcon");
+ }
+
+ if (pBlockFlags[2] & 0x80)
+ *pS >> nPictureAlignment;
+
+ if (pBlockFlags[3] & 0x01)
+ bPictureTiling = true;
+
+ if (pBlockFlags[3] & 0x02)
+ *pS >> nPictureSizeMode;
+
+ if (pBlockFlags[3] & 0x04)
+ {
+ ReadAlign(pS, pS->Tell() - nStart, 4);
+ *pS >> fUnknown8;
+ }
+
+ if (pBlockFlags[3] & 0x08)
+ {
+ ReadAlign(pS, pS->Tell() - nStart, 4);
+ *pS >> fUnknown9;
+ }
+
+ ReadAlign(pS, pS->Tell() - nStart, 4);
+ *pS >> nWidth;
+ *pS >> nHeight;
+ *pS >> nScrollWidth;
+ *pS >> nScrollHeight;
+
+ if (pBlockFlags[1] & 0x10)
+ {
+ *pS >> nScrollLeft;
+ *pS >> nScrollTop;
+ }
+
+ if ( bCaption )
+ {
+ lclReadCharArray( *pS, pCaption, nCaptionLen, pS->Tell() - nStart);
+ }
+
+ OUString tempCaption = lclCreateOUString( pCaption, nCaptionLen );
+
+ if (nIcon)
+ {
+ pS->Read(pIconHeader,20);
+ *pS >> nIconLen;
+ pIcon = new sal_uInt8[nIconLen];
+ pS->Read(pIcon,nIconLen);
+ }
+
+ if (nPicture)
+ {
+ pS->Read(pPictureHeader,20);
+ *pS >> nPictureLen;
+ pPicture = new sal_uInt8[nPictureLen];
+ pS->Read(pPicture,nPictureLen);
+ }
+
+ ReadAlign( pS, pS->Tell() - nStart, 4);
+
+ if (pBlockFlags[2] & 0x10)
+ {
+ //Font Stuff..
+ pS->SeekRel(0x1a);
+ sal_uInt8 nFontLen;
+ *pS >> nFontLen;
+ pS->SeekRel(nFontLen);
+ }
+
+ return OCX_ContainerControl::Read( pS );
+}
+
+sal_Bool OCX_Frame::Import(com::sun::star::uno::Reference<
+ com::sun::star::beans::XPropertySet> &rPropSet)
+{
+ uno::Any aTmp(&sName,getCppuType((OUString *)0));
+ rPropSet->setPropertyValue(
+ OUString(RTL_CONSTASCII_USTRINGPARAM("Name")), aTmp);
+ if ( pCaption )
+ {
+ aTmp <<= lclCreateOUString( pCaption, nCaptionLen );
+ rPropSet->setPropertyValue( WW8_ASCII2STR("Label"), aTmp);
+ }
+
+ // Calls import on contained controls
+ OCX_ContainerControl::Import( rPropSet );
+ return sal_True;
+}
+OCX_UserForm::OCX_UserForm( SotStorageRef& parent,
+ const OUString& storageName,
+ const OUString& sN,
+ const ::uno::Reference< container::XNameContainer > &rDialog,
+ const ::uno::Reference< lang::XMultiServiceFactory >& rMsf):
+ OCX_ContainerControl(parent, storageName, sN, rDialog),
+ nChildrenA(0), fEnabled(1), fLocked(0),
+ fBackStyle(1), fWordWrap(1), fAutoSize(0), nCaptionLen(0), nVertPos(1),
+ nHorzPos(7), nMousePointer(0), nBorderColor(0x80000012), nChildrenB(0),
+ nKeepScrollBarsVisible(3), nCycle(0), nBorderStyle(0), nSpecialEffect(0),
+ nPicture(0), nPictureAlignment(2), nPictureSizeMode(0),
+ bPictureTiling(FALSE), nAccelerator(0), nIcon(0), pCaption(0),
+ nScrollWidth(0), nScrollHeight(0), nScrollLeft(0), nScrollTop(0), nIconLen(0), pIcon(0), nPictureLen(0),
+ pPicture(0)
+ {
+ mnForeColor = 0x80000012;
+ mnBackColor = 0x8000000F;
+ uno::Reference< beans::XPropertySet> xProps( rMsf, uno::UNO_QUERY);
+ if ( xProps.is() )
+ {
+ xProps->getPropertyValue(C2S("DefaultContext")) >>= mxCtx;
+ }
+ aFontData.SetHasAlign(TRUE);
+ }
+sal_Bool OCX_UserForm::Read(SvStorageStream *pS)
+{
+ long nStart = pS->Tell();
+ *pS >> nIdentifier;
+ DBG_ASSERT(0x400==nIdentifier,
+ "A control that has a different identifier");
+ *pS >> nFixedAreaLen;
+ pS->Read(pBlockFlags,4);
+
+ if (pBlockFlags[0] & 0x01)
+ {
+ DBG_ASSERT(!this, "ARSE");
+ }
+ if (pBlockFlags[0] & 0x02)
+ *pS >> mnBackColor;
+ if (pBlockFlags[0] & 0x04)
+ *pS >> mnForeColor;
+ if (pBlockFlags[0] & 0x08)
+ *pS >> nChildrenA;
+ if (pBlockFlags[0] & 0x40)
+ {
+ sal_uInt8 nTemp;
+ *pS >> nTemp;
+ fEnabled = (nTemp&0x04)>>2;
+ fBackStyle = (nTemp&0x08)>>3;
+ *pS >> nTemp;
+ *pS >> nTemp;
+ fWordWrap = (nTemp&0x80)>>7;
+ *pS >> nTemp;
+ fAutoSize = (nTemp&0x10)>>4;
+ }
+ if (pBlockFlags[0] & 0x80)
+ {
+ ReadAlign(pS, pS->Tell() - nStart, 4);
+ *pS >> nBorderStyle;
+ }
+#if 0
+ sal_uInt16 nFixedOrAlign;
+ *pS >> nFixedOrAlign;
+#endif
+ if (pBlockFlags[1] & 0x01)
+ *pS >> nMousePointer;
+ if (pBlockFlags[1] & 0x02)
+ *pS >> nKeepScrollBarsVisible;
+ if (pBlockFlags[1] & 0x20)
+ {
+ sal_uInt32 nUnknown32;
+ *pS >> nUnknown32;
+ }
+ if (pBlockFlags[1] & 0x80)
+ {
+ ReadAlign(pS, pS->Tell() - nStart, 2);
+ *pS >> nIcon;
+ DBG_ASSERT(nIcon == 0xFFFF, "Unexpected nIcon");
+ }
+ if (pBlockFlags[2] & 0x01)
+ *pS >> nCycle;
+ if (pBlockFlags[2] & 0x02)
+ *pS >> nSpecialEffect;
+
+ if (pBlockFlags[2] & 0x04)
+ {
+ ReadAlign(pS, pS->Tell() - nStart, 4);
+ *pS >> nBorderColor;
+ }
+
+ if (pBlockFlags[2] & 0x10)
+ {
+ ReadAlign(pS, pS->Tell() - nStart, 2);
+ sal_uInt16 nNoIdea;
+ *pS >> nNoIdea;
+ DBG_ASSERT(nNoIdea == 0xFFFF, "Expected 0xFFFF, (related to font ?)");
+ }
+
+ if (pBlockFlags[2] & 0x20)
+ {
+ ReadAlign(pS, pS->Tell() - nStart, 2);
+ *pS >> nPicture;
+ DBG_ASSERT(nPicture == 0xFFFF, "Unexpected nIcon");
+ }
+
+ if (pBlockFlags[2] & 0x80)
+ *pS >> nPictureAlignment;
+
+ if (pBlockFlags[3] & 0x01)
+ bPictureTiling = true;
+
+ if (pBlockFlags[3] & 0x02)
+ *pS >> nPictureSizeMode;
+
+ if (pBlockFlags[3] & 0x04)
+ {
+ ReadAlign(pS, pS->Tell() - nStart, 4);
+ *pS >> nChildrenB;
+ }
+
+ ReadAlign(pS, pS->Tell() - nStart, 4);
+ *pS >> nDrawBuffer;
+
+ ReadAlign(pS, pS->Tell() - nStart, 4);
+ *pS >> nWidth;
+ *pS >> nHeight;
+ *pS >> nScrollWidth;
+ *pS >> nScrollHeight;
+
+ if (pBlockFlags[1] & 0x10)
+ {
+ *pS >> nScrollLeft;
+ *pS >> nScrollTop;
+ }
+
+ if (nIcon)
+ {
+ pS->Read(pIconHeader,20);
+ *pS >> nIconLen;
+ pIcon = new sal_uInt8[nIconLen];
+ pS->Read(pIcon,nIconLen);
+ }
+
+ if (nPicture)
+ {
+ pS->Read(pPictureHeader,20);
+ *pS >> nPictureLen;
+ pPicture = new sal_uInt8[nPictureLen];
+ pS->Read(pPicture,nPictureLen);
+ }
+
+ ReadAlign( pS, pS->Tell() - nStart, 4);
+
+ if (pBlockFlags[2] & 0x10)
+ {
+ //Font Stuff..
+ pS->SeekRel(0x1a);
+ sal_uInt8 nFontLen;
+ *pS >> nFontLen;
+ pS->SeekRel(nFontLen);
+ }
+
+ sal_Int16 numTrailingRecs = 0;
+ *pS >> numTrailingRecs;
+ // seems to be no. of trailing records,
+ // before container record starts proper
+ // ( unknown what these trailing records are for)
+ if ( numTrailingRecs )
+ {
+ for ( ; numTrailingRecs ; --numTrailingRecs )
+ {
+ OCX_Control skip(C2S("dummy")) ;
+ skip.Read( pS );
+ }
+ }
+ return OCX_ContainerControl::Read( pS );
+}
+
+sal_Bool OCX_UserForm::Import(
+ uno::Reference<container::XNameContainer> &rLib )
+{
+ uno::Reference<beans::XPropertySet>
+ xDialogPropSet(mxParent, uno::UNO_QUERY);
+ uno::Any aTmp(&sName,getCppuType((OUString *)0));
+ xDialogPropSet->setPropertyValue(
+ OUString(RTL_CONSTASCII_USTRINGPARAM("Name")), aTmp);
+ xDialogPropSet->setPropertyValue(
+ OUString(RTL_CONSTASCII_USTRINGPARAM("Title")), aTmp);
+ aTmp <<= ImportColor(mnBackColor);
+ xDialogPropSet->setPropertyValue( WW8_ASCII2STR("BackgroundColor"), aTmp);
+
+ aTmp <<= sal_Int32((nWidth * 2) / 100);
+ xDialogPropSet->setPropertyValue(WW8_ASCII2STR("Width"), aTmp);
+ aTmp <<= sal_Int32((nHeight * 2) / 100);
+ xDialogPropSet->setPropertyValue(WW8_ASCII2STR("Height"), aTmp);
+
+ uno::Reference<beans::XPropertySet> xPropSet( mxParent, uno::UNO_QUERY );
+ OCX_ContainerControl::Import( xPropSet );
+
+ uno::Reference<io::XInputStreamProvider> xSource =
+ xmlscript::exportDialogModel(mxParent, mxCtx);
+ uno::Any aSourceAny(uno::makeAny(xSource));
+ if (rLib->hasByName(sName))
+ rLib->replaceByName(sName, aSourceAny);
+ else
+ rLib->insertByName(sName, aSourceAny);
+ return sal_True;
+}
+
+sal_Bool OCX_Label::WriteContents(SvStorageStreamRef &rContents,
+ const uno::Reference< beans::XPropertySet > &rPropSet,
+ const awt::Size &rSize)
+{
+ sal_Bool bRet = sal_True;
+ sal_uInt32 nOldPos = rContents->Tell();
+ rContents->SeekRel(8);
+ pBlockFlags[0] = 0x20;
+ pBlockFlags[1] = 0;
+ pBlockFlags[2] = 0;
+ pBlockFlags[3] = 0;
+
+ uno::Any aTmp = rPropSet->getPropertyValue(WW8_ASCII2STR("TextColor"));
+ if (aTmp.hasValue())
+ aTmp >>= mnForeColor;
+ *rContents << ExportColor(mnForeColor);
+ pBlockFlags[0] |= 0x01;
+
+ aTmp = rPropSet->getPropertyValue(WW8_ASCII2STR("BackgroundColor"));
+ if (aTmp.hasValue())
+ aTmp >>= mnBackColor;
+ *rContents << ExportColor(mnBackColor);
+ pBlockFlags[0] |= 0x02;
+
+ aTmp = rPropSet->getPropertyValue(WW8_ASCII2STR("Enabled"));
+ fEnabled = any2bool(aTmp);
+ sal_uInt8 nTemp=fEnabled;
+ if (fEnabled)
+ nTemp = nTemp << 1;
+ *rContents << nTemp;
+ *rContents << sal_uInt8(0x00);
+
+ aTmp = rPropSet->getPropertyValue(WW8_ASCII2STR("MultiLine"));
+ fWordWrap = any2bool(aTmp);
+ nTemp=fWordWrap;
+ nTemp = nTemp << 7;
+ *rContents << nTemp;
+ *rContents << sal_uInt8(0x00);
+ pBlockFlags[0] |= 0x04;
+
+ SvxOcxString aCaption( rPropSet->getPropertyValue(WW8_ASCII2STR("Label")) );
+ aCaption.WriteLenField( *rContents );
+ if (aCaption.HasData())
+ pBlockFlags[0] |= 0x08;
+
+ WriteAlign(rContents,4);
+ aTmp = rPropSet->getPropertyValue(WW8_ASCII2STR("BorderColor"));
+ if (aTmp.hasValue())
+ aTmp >>= nBorderColor;
+ *rContents << ExportColor(nBorderColor);
+ pBlockFlags[0] |= 0x80;
+
+ aTmp = rPropSet->getPropertyValue(WW8_ASCII2STR("Border"));
+ sal_Int16 nBorder = sal_Int16();
+ aTmp >>= nBorder;
+ sal_uInt8 nNewBorder;
+ nSpecialEffect = ExportBorder(nBorder,nNewBorder);
+ nBorderStyle = nNewBorder;
+ *rContents << nBorderStyle;
+ pBlockFlags[1] |= 0x01;
+ *rContents << nSpecialEffect;
+ pBlockFlags[1] |= 0x02;
+
+ aCaption.WriteCharArray( *rContents );
+
+ WriteAlign(rContents,4);
+ *rContents << rSize.Width;
+ *rContents << rSize.Height;
+ nFixedAreaLen = static_cast<sal_uInt16>(rContents->Tell()-nOldPos-4);
+
+ bRet = aFontData.Export(rContents,rPropSet);
+
+ rContents->Seek(nOldPos);
+ *rContents << nStandardId;
+ *rContents << nFixedAreaLen;
+
+ *rContents << pBlockFlags[0];
+ *rContents << pBlockFlags[1];
+ *rContents << pBlockFlags[2];
+ *rContents << pBlockFlags[3];
+
+ DBG_ASSERT((rContents.Is() &&
+ (SVSTREAM_OK==rContents->GetError())),"damn");
+ return bRet;
+}
+
+
+
+sal_Bool OCX_Label::Export(SvStorageRef &rObj,
+ const uno::Reference< beans::XPropertySet > &rPropSet,
+ const awt::Size &rSize)
+{
+ static sal_uInt8 __READONLY_DATA aCompObj[] = {
+ 0x01, 0x00, 0xFE, 0xFF, 0x03, 0x0A, 0x00, 0x00,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0x23, 0x9E, 0x8C, 0x97,
+ 0xB0, 0xD4, 0xCE, 0x11, 0xBF, 0x2D, 0x00, 0xAA,
+ 0x00, 0x3F, 0x40, 0xD0, 0x1A, 0x00, 0x00, 0x00,
+ 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66,
+ 0x74, 0x20, 0x46, 0x6F, 0x72, 0x6D, 0x73, 0x20,
+ 0x32, 0x2E, 0x30, 0x20, 0x4C, 0x61, 0x62, 0x65,
+ 0x6C, 0x00, 0x10, 0x00, 0x00, 0x00, 0x45, 0x6D,
+ 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x20, 0x4F,
+ 0x62, 0x6A, 0x65, 0x63, 0x74, 0x00, 0x0E, 0x00,
+ 0x00, 0x00, 0x46, 0x6F, 0x72, 0x6D, 0x73, 0x2E,
+ 0x4C, 0x61, 0x62, 0x65, 0x6C, 0x2E, 0x31, 0x00,
+ 0xF4, 0x39, 0xB2, 0x71, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ };
+
+ {
+ SvStorageStreamRef xStor( rObj->OpenSotStream( C2S("\1CompObj")));
+ xStor->Write(aCompObj,sizeof(aCompObj));
+ DBG_ASSERT((xStor.Is() && (SVSTREAM_OK == xStor->GetError())),"damn");
+ }
+
+ {
+ SvStorageStreamRef xStor3( rObj->OpenSotStream( C2S("\3ObjInfo")));
+ xStor3->Write(aObjInfo,sizeof(aObjInfo));
+ DBG_ASSERT((xStor3.Is() && (SVSTREAM_OK == xStor3->GetError())),"damn");
+ }
+
+ static sal_uInt8 __READONLY_DATA aOCXNAME[] = {
+ 0x4C, 0x00, 0x61, 0x00, 0x62, 0x00, 0x65, 0x00,
+ 0x6C, 0x00, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00
+ };
+
+ {
+ SvStorageStreamRef xStor2( rObj->OpenSotStream( C2S("\3OCXNAME")));
+ xStor2->Write(aOCXNAME,sizeof(aOCXNAME));
+ DBG_ASSERT((xStor2.Is() && (SVSTREAM_OK == xStor2->GetError())),"damn");
+ }
+/*
+ static sal_uInt8 __READONLY_DATA aTest[] = {
+ 0x00, 0x02, 0x20, 0x00, 0x2B, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00,
+ 0x06, 0x00, 0x00, 0x80, 0x4C, 0x61, 0x62, 0x65,
+ 0x6C, 0x31, 0x18, 0x00, 0xEC, 0x09, 0x00, 0x00,
+ 0x7B, 0x02, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00,
+ 0x35, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x80,
+ 0xC3, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
+ 0x54, 0x69, 0x6D, 0x65, 0x73, 0x20, 0x4E, 0x65,
+ 0x77, 0x20, 0x52, 0x6F, 0x6D, 0x61, 0x6E, 0x00,
+ };
+*/
+ SvStorageStreamRef xContents( rObj->OpenSotStream( C2S("contents")));
+ return WriteContents(xContents, rPropSet, rSize);
+}
+
+typedef OCX_Control *(*FNCreate)();
+
+
+struct OCX_map
+{
+ FNCreate pCreate;
+ const char *sId;
+ sal_Int16 nId;
+ const char *sName;
+};
+
+OCX_map aOCXTab[] =
+{
+ // Command button MUST be at index 0
+ {&OCX_CommandButton::Create,"D7053240-CE69-11CD-a777-00dd01143c57",
+ form::FormComponentType::COMMANDBUTTON,"CommandButton"},
+ // Toggle button MUST be at index 1
+ {&OCX_ToggleButton::Create,"8BD21D60-EC42-11CE-9e0d-00aa006002f3",
+ form::FormComponentType::COMMANDBUTTON,"ToggleButton"},
+ {&OCX_Label::Create, "978C9E23-D4B0-11CE-bf2d-00aa003f40d0",
+ form::FormComponentType::FIXEDTEXT,"Label"},
+ {&OCX_TextBox::Create,"8BD21D10-EC42-11CE-9e0d-00aa006002f3",
+ form::FormComponentType::TEXTFIELD,"TextBox"},
+ {&OCX_ListBox::Create,"8BD21D20-EC42-11CE-9e0d-00aa006002f3",
+ form::FormComponentType::LISTBOX,"ListBox"},
+ {&OCX_ComboBox::Create,"8BD21D30-EC42-11CE-9e0d-00aa006002f3",
+ form::FormComponentType::COMBOBOX,"ComboBox"},
+ {&OCX_CheckBox::Create,"8BD21D40-EC42-11CE-9e0d-00aa006002f3",
+ form::FormComponentType::CHECKBOX,"CheckBox"},
+ {&OCX_OptionButton::Create,"8BD21D50-EC42-11CE-9e0d-00aa006002f3",
+ form::FormComponentType::RADIOBUTTON,"OptionButton"},
+ {&OCX_Image::Create,"4C599241-6926-101B-9992-00000b65c6f9",
+ form::FormComponentType::IMAGECONTROL,"Image"},
+ {&OCX_FieldControl::Create,"8BD21D10-EC42-11CE-9e0d-00aa006002f3",
+ form::FormComponentType::DATEFIELD,"TextBox"},
+ {&OCX_FieldControl::Create,"8BD21D10-EC42-11CE-9e0d-00aa006002f3",
+ form::FormComponentType::TIMEFIELD,"TextBox"},
+ {&OCX_FieldControl::Create,"8BD21D10-EC42-11CE-9e0d-00aa006002f3",
+ form::FormComponentType::NUMERICFIELD,"TextBox"},
+ {&OCX_FieldControl::Create,"8BD21D10-EC42-11CE-9e0d-00aa006002f3",
+ form::FormComponentType::CURRENCYFIELD,"TextBox"},
+ {&OCX_FieldControl::Create,"8BD21D10-EC42-11CE-9e0d-00aa006002f3",
+ form::FormComponentType::PATTERNFIELD,"TextBox"},
+#if 0
+ {&OCX_FieldControl::Create,"8BD21D10-EC42-11CE-9e0d-00aa006002f3",
+ form::FormComponentType::FORMULAFIELD,"TextBox"},
+#endif
+ {&OCX_ImageButton::Create,"D7053240-CE69-11CD-a777-00dd01143c57",
+ form::FormComponentType::IMAGEBUTTON,"CommandButton"},
+ {&OCX_SpinButton::Create,"79176FB0-B7F2-11CE-97ef-00aa006d2776",
+ form::FormComponentType::SPINBUTTON,"SpinButton"},
+ {&OCX_ScrollBar::Create,"DFD181E0-5E2F-11CE-a449-00aa004a803d",
+ form::FormComponentType::SCROLLBAR,"ScrollBar"},
+ {&OCX_GroupBox::Create,"",
+ form::FormComponentType::GROUPBOX,""},
+ {&OCX_ProgressBar::Create,"",
+ form::FormComponentType::CONTROL,""}
+};
+
+const int NO_OCX = sizeof( aOCXTab ) / sizeof( *aOCXTab );
+
+SvxMSConvertOCXControls::SvxMSConvertOCXControls(SfxObjectShell *pDSh, SwPaM *pP) :
+ pDocSh(pDSh), pPaM(pP), nEdit(0), nCheckbox(0)
+{
+ DBG_ASSERT( pDocSh, "No DocShell, Cannot do Controls" );
+ OCX_Control::FillSystemColors();
+}
+
+SvxMSConvertOCXControls::~SvxMSConvertOCXControls()
+{
+}
+
+OCX_Control * SvxMSConvertOCXControls::OCX_Factory(const String &sName)
+{
+ for (int i=0;i<NO_OCX;i++)
+ {
+ if ( sName.EqualsIgnoreCaseAscii( aOCXTab[i].sId ))
+ return(aOCXTab[i].pCreate());
+ }
+ return(NULL);
+}
+
+OCX_Control * SvxMSConvertOCXControls::OCX_Factory(
+ const uno::Reference< awt::XControlModel > &rControlModel,
+ String &rId, String &rName)
+{
+ rName.Erase();
+ rId.Erase();
+
+ uno::Reference< beans::XPropertySet > xPropSet(
+ rControlModel,uno::UNO_QUERY);
+
+ uno::Any aTmp = xPropSet->getPropertyValue(
+ OUString::createFromAscii("ClassId"));
+ sal_Int16 nClassId = *(sal_Int16*) aTmp.getValue();
+
+//Begin nasty hack
+ /*
+ There is a truly horrible thing with EditControls and FormattedField
+ Controls, they both pretend to have an EDITBOX ClassId for compability
+ reasons, at some stage in the future hopefully there will be a proper
+ FormulaField ClassId rather than this piggybacking two controls onto the
+ same ClassId, when this happens uncomment the FORMULAFIELD in the OCX_Tab
+ and delete this block, cmc.
+
+ And also the nClassId for ImageControls is being reported as "CONTROL"
+ rather than IMAGECONTROL
+ */
+ if (nClassId == form::FormComponentType::TEXTFIELD)
+ {
+ uno::Reference< lang::XServiceInfo > xInfo(rControlModel,
+ uno::UNO_QUERY);
+ if (xInfo->
+ supportsService(OUString::createFromAscii(
+ "com.sun.star.form.component.FormattedField")))
+ {
+ rId.AppendAscii("8BD21D10-EC42-11CE-9e0d-00aa006002f3");
+ rName.AppendAscii("TextBox");
+ return new OCX_FieldControl;
+ }
+ }
+ else if (nClassId == form::FormComponentType::CONTROL)
+ {
+ uno::Reference< lang::XServiceInfo > xInfo(rControlModel,
+ uno::UNO_QUERY);
+ if (xInfo->
+ supportsService(OUString::createFromAscii(
+ "com.sun.star.form.component.ImageControl")))
+ nClassId = form::FormComponentType::IMAGECONTROL;
+ }
+//End nasty hack
+
+ const OCX_map* pEntry = 0;
+
+ // distinguish between push button and toggle button
+ if( nClassId == form::FormComponentType::COMMANDBUTTON )
+ {
+ pEntry = any2bool(xPropSet->getPropertyValue(WW8_ASCII2STR("Toggle"))) ?
+ (aOCXTab + 1) : aOCXTab;
+ }
+ else
+ {
+ for( int i = 2; (i < NO_OCX) && !pEntry; ++i )
+ if( nClassId == aOCXTab[ i ].nId )
+ pEntry = aOCXTab + i;
+ }
+
+ if( pEntry )
+ {
+ rId.AppendAscii( pEntry->sId );
+ rName.AppendAscii( pEntry->sName );
+ return pEntry->pCreate();
+ }
+
+ return 0;
+}
+
+
+sal_Bool SvxMSConvertOCXControls::ReadOCXStream( SvStorageRef& rSrc1,
+ uno::Reference < drawing::XShape > *pShapeRef,BOOL bFloatingCtrl)
+{
+
+ SvStorageStreamRef xCrash = rSrc1->OpenSotStream( WW8_ASCII2STR("contents") );
+ sal_Bool bRet=sal_False;
+
+ SvStorageStreamRef xSrc2 = rSrc1->OpenSotStream( WW8_ASCII2STR("\3OCXNAME") );
+ SvStorageStream* pSt = xSrc2;
+ pSt->SetNumberFormatInt( NUMBERFORMAT_INT_LITTLEENDIAN );
+
+ /* #117832# import control name */
+ OUString controlName;
+ bool hasCName = readOCXNAME( controlName, pSt );
+
+ xSrc2 = rSrc1->OpenSotStream( WW8_ASCII2STR("contents") );
+ pSt = xSrc2;
+ pSt->SetNumberFormatInt( NUMBERFORMAT_INT_LITTLEENDIAN );
+
+ /*Get Class Id of this object, see if it is one of the types
+ *that this importer can handle, call the appropiate handler
+ to read that control, and call the appropiate handler to
+ insert that control
+ */
+
+ SvGlobalName aTest = rSrc1->GetClassName();
+ OCX_Control *pObj = OCX_Factory(aTest.GetHexName());
+ if (pObj)
+ {
+ pObj->pDocSh = pDocSh;
+ /* #117832# set imported control name */
+ if ( hasCName )
+ {
+ pObj->sName = controlName;
+ }
+ com::sun::star::awt::Size aSz;
+ uno::Reference< form::XFormComponent > xFComp;
+ const uno::Reference< lang::XMultiServiceFactory > & rServiceFactory =
+ GetServiceFactory();
+ if(!rServiceFactory.is())
+ return(sal_False);
+ bRet = pObj->FullRead(pSt);
+ if(bRet)
+ if (pObj->Import(rServiceFactory,xFComp,aSz))
+ bRet = InsertControl( xFComp, aSz,pShapeRef,bFloatingCtrl);
+ delete pObj;
+ }
+ return bRet;
+}
+
+
+sal_Bool SvxMSConvertOCXControls::ReadOCXExcelKludgeStream(
+ SvStorageStreamRef& rSrc1, uno::Reference < drawing::XShape > *
+ pShapeRef,BOOL bFloatingCtrl)
+{
+ sal_Bool bRet=sal_False;
+ /*Get Class Id of this object, see if it is one of the types
+ *that this importer can handle, call the appropiate handler
+ to read that control, and call the appropiate handler to
+ insert that control
+ */
+ /*The Excel Kludge is to concatenate a class id with a contents
+ * stream, and then concatenate all the controls together,
+ * This means that you should have the cnts stream wound to the
+ * correct location before passing the control stream in here*/
+ SvStream *pSt = rSrc1;
+ pSt->SetNumberFormatInt( NUMBERFORMAT_INT_LITTLEENDIAN );
+ SvGlobalName aTest;
+ *pSt >> aTest;
+ OCX_Control *pObj = OCX_Factory(aTest.GetHexName());
+ if (pObj)
+ {
+
+ com::sun::star::awt::Size aSz;
+ uno::Reference< form::XFormComponent > xFComp;
+ const uno::Reference< lang::XMultiServiceFactory > & rServiceFactory =
+ GetServiceFactory();
+ if(!rServiceFactory.is())
+ return(sal_False);
+ bRet = pObj->FullRead(rSrc1);
+ if(bRet)
+ if (pObj->Import(rServiceFactory,xFComp,aSz))
+ bRet = InsertControl( xFComp, aSz,pShapeRef,bFloatingCtrl);
+ delete pObj;
+ }
+ return bRet;
+}
+
+
+sal_Bool SvxMSConvertOCXControls::WriteOCXStream( SvStorageRef& rSrc1,
+ const uno::Reference< awt::XControlModel > &rControlModel,
+ const awt::Size &rSize, String &rName)
+{
+ sal_Bool bRet=sal_False;
+
+ DBG_ASSERT( rControlModel.is(), "UNO-Control missing Model, panic!" );
+ if( !rControlModel.is() )
+ return sal_False;
+
+#if 0
+ uno::Any aTmp = xPropSet->getPropertyValue(
+ OUString::createFromAscii("ClassId"));
+ sal_Int16 nClassId = *(sal_Int16*) aTmp.getValue();
+#endif
+
+ String sId;
+ OCX_Control *pObj = OCX_Factory(rControlModel,sId,rName);
+ if (pObj != NULL)
+ {
+ uno::Reference<beans::XPropertySet> xPropSet(rControlModel,
+ uno::UNO_QUERY);
+
+ /* #117832# - also enable export of control name */
+ OUString sCName;
+ xPropSet->getPropertyValue(C2S("Name")) >>= sCName;
+ pObj->sName = sCName;
+
+ SvGlobalName aName;
+ aName.MakeId(sId);
+ String sFullName(String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM(
+ "Microsoft Forms 2.0 ")));
+ sFullName.Append(rName);
+ rSrc1->SetClass(aName,0x5C,sFullName);
+ // ^^^^, this pathetic 0x5c is the magic number
+ // which the lack of originally blocked the implementation of
+ // the controls export
+ // cmc
+
+ bRet = pObj->Export(rSrc1,xPropSet,rSize);
+ SvStorageStreamRef xStor2( rSrc1->OpenSotStream( WW8_ASCII2STR("\3OCXNAME")));
+ /* #117832# - also enable export of control name */
+ writeOCXNAME( sCName, xStor2 );
+ delete pObj;
+ }
+ return bRet;
+}
+
+
+//I think this should work for excel documents, create the "Ctls" stream
+//and give it here as rContents, we'll append out streams ole id and
+//contents here and that appears to be what Excel is doing
+sal_Bool SvxMSConvertOCXControls::WriteOCXExcelKludgeStream(
+ SvStorageStreamRef& rContents,
+ const uno::Reference< awt::XControlModel > &rControlModel,
+ const awt::Size &rSize, String &rName)
+{
+ sal_Bool bRet=sal_False;
+
+ DBG_ASSERT( rControlModel.is(), "UNO-Control missing Model, panic!" );
+ if( !rControlModel.is() )
+ return sal_False;
+
+ String sId;
+ OCX_Control *pObj = OCX_Factory(rControlModel,sId,rName);
+ if (pObj != NULL)
+ {
+ uno::Reference<beans::XPropertySet> xPropSet(rControlModel,
+ uno::UNO_QUERY);
+
+ SvGlobalName aName;
+ aName.MakeId(sId);
+ String sFullName(String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM(
+ "Microsoft Forms 2.0 ")));
+ sFullName.Append(rName);
+ SvStream *pS=rContents;
+ *pS << aName;
+ bRet = pObj->WriteContents(rContents,xPropSet,rSize);
+ delete pObj;
+ // export needs correct stream position
+ rContents->Seek( STREAM_SEEK_TO_END );
+ }
+ return bRet;
+}
+
+
+
+
+
+
+
+sal_Bool OCX_CheckBox::Import(com::sun::star::uno::Reference<
+ com::sun::star::beans::XPropertySet> &rPropSet)
+{
+ uno::Any aTmp(&sName,getCppuType((OUString *)0));
+ rPropSet->setPropertyValue( WW8_ASCII2STR("Name"), aTmp );
+
+ // background color: fBackStyle==0 -> transparent
+ if( fBackStyle )
+ aTmp <<= ImportColor(mnBackColor);
+ else
+ aTmp = uno::Any();
+ rPropSet->setPropertyValue( WW8_ASCII2STR("BackgroundColor"), aTmp);
+
+ sal_Bool bTemp;
+ if ((!(fEnabled)) || (fLocked))
+ bTemp = sal_False;
+ else
+ bTemp = sal_True;
+ aTmp = bool2any(bTemp);
+ rPropSet->setPropertyValue( WW8_ASCII2STR("Enabled"), aTmp);
+
+ bTemp = fWordWrap != 0;
+ aTmp = bool2any(bTemp);
+ rPropSet->setPropertyValue( WW8_ASCII2STR("MultiLine"), aTmp);
+
+ aTmp <<= ImportColor(mnForeColor);
+ rPropSet->setPropertyValue( WW8_ASCII2STR("TextColor"), aTmp);
+
+ bTemp = nMultiState;
+ aTmp = bool2any(bTemp);
+ rPropSet->setPropertyValue( WW8_ASCII2STR("TriState"), aTmp);
+
+ aTmp <<= ImportSpecEffect( nSpecialEffect );
+ rPropSet->setPropertyValue( WW8_ASCII2STR("VisualEffect"), aTmp);
+
+ if (pValue && !bSetInDialog)
+ {
+ INT16 nTmp=pValue[0]-0x30;
+ aTmp <<= nTmp;
+ rPropSet->setPropertyValue( WW8_ASCII2STR("DefaultState"), aTmp);
+ }
+
+ if (pCaption)
+ {
+ aTmp <<= lclCreateOUString( pCaption, nCaptionLen );
+ rPropSet->setPropertyValue( WW8_ASCII2STR("Label"), aTmp);
+ }
+
+ // #i40279# always centered vertically
+ aTmp <<= ::com::sun::star::style::VerticalAlignment_MIDDLE;
+ rPropSet->setPropertyValue( WW8_ASCII2STR("VerticalAlign"), aTmp );
+
+ aFontData.Import(rPropSet);
+ return(sal_True);
+}
+
+sal_Bool OCX_CheckBox::WriteContents(SvStorageStreamRef &rContents,
+ const uno::Reference< beans::XPropertySet > &rPropSet,
+ const awt::Size &rSize)
+
+{
+ sal_Bool bRet=sal_True;
+ sal_uInt32 nOldPos = rContents->Tell();
+ rContents->SeekRel(12);
+
+ pBlockFlags[0] = 0;
+ pBlockFlags[1] = 0x01;
+ pBlockFlags[2] = 0;
+ pBlockFlags[3] = 0x80;
+ pBlockFlags[4] = 0;
+ pBlockFlags[5] = 0;
+ pBlockFlags[6] = 0;
+ pBlockFlags[7] = 0;
+
+ uno::Any aTmp = rPropSet->getPropertyValue(WW8_ASCII2STR("Enabled"));
+ fEnabled = any2bool(aTmp);
+
+ aTmp = rPropSet->getPropertyValue(WW8_ASCII2STR("BackgroundColor"));
+ fBackStyle = aTmp.hasValue() ? 1 : 0;
+ if (fBackStyle)
+ aTmp >>= mnBackColor;
+
+ sal_uInt8 nTemp=fEnabled;
+ if (fEnabled)
+ nTemp = nTemp << 1;
+ if (fBackStyle)
+ nTemp |= 0x08;
+ *rContents << nTemp;
+ pBlockFlags[0] |= 0x01;
+ *rContents << sal_uInt8(0x00);
+ nTemp = 0;
+ aTmp = rPropSet->getPropertyValue(WW8_ASCII2STR("MultiLine"));
+ fWordWrap = any2bool(aTmp);
+ if (fWordWrap)
+ nTemp |= 0x80;
+ *rContents << nTemp;
+ *rContents << sal_uInt8(0x00);
+
+ *rContents << ExportColor(mnBackColor);
+ pBlockFlags[0] |= 0x02;
+
+ aTmp = rPropSet->getPropertyValue(WW8_ASCII2STR("TextColor"));
+ if (aTmp.hasValue())
+ aTmp >>= mnForeColor;
+ *rContents << ExportColor(mnForeColor);
+ pBlockFlags[0] |= 0x04;
+
+ nStyle = 4;
+ *rContents << nStyle;
+ pBlockFlags[0] |= 0x40;
+
+ aTmp = rPropSet->getPropertyValue(WW8_ASCII2STR("TriState"));
+ nMultiState = any2bool(aTmp);
+ *rContents << nMultiState;
+ pBlockFlags[2] |= 0x20;
+
+ WriteAlign(rContents,4);
+ nValueLen = 1|SVX_MSOCX_COMPRESSED;
+ aTmp = rPropSet->getPropertyValue(WW8_ASCII2STR("DefaultState"));
+ sal_Int16 nDefault = sal_Int16();
+ aTmp >>= nDefault;
+ *rContents << nValueLen;
+ pBlockFlags[2] |= 0x40;
+
+ SvxOcxString aCaption( rPropSet->getPropertyValue(WW8_ASCII2STR("Label")) );
+ aCaption.WriteLenField( *rContents );
+ if (aCaption.HasData())
+ pBlockFlags[2] |= 0x80;
+
+ aTmp = rPropSet->getPropertyValue(WW8_ASCII2STR("VisualEffect"));
+ if (aTmp.hasValue())
+ {
+ sal_Int16 nApiSpecEffect = sal_Int16();
+ aTmp >>= nApiSpecEffect;
+ nSpecialEffect = ExportSpecEffect( nApiSpecEffect );
+ }
+ WriteAlign(rContents,4);
+ *rContents << nSpecialEffect;
+ pBlockFlags[3] |= 0x04;
+
+ WriteAlign(rContents,4);
+ *rContents << rSize.Width;
+ *rContents << rSize.Height;
+
+ nDefault += 0x30;
+ *rContents << sal_uInt8(nDefault);
+ *rContents << sal_uInt8(0x00);
+
+ aCaption.WriteCharArray( *rContents );
+
+ WriteAlign(rContents,4);
+ nFixedAreaLen = static_cast<sal_uInt16>(rContents->Tell()-nOldPos-4);
+ bRet = aFontData.Export(rContents,rPropSet);
+ rContents->Seek(nOldPos);
+ *rContents << nStandardId;
+ *rContents << nFixedAreaLen;
+
+ *rContents << pBlockFlags[0];
+ *rContents << pBlockFlags[1];
+ *rContents << pBlockFlags[2];
+ *rContents << pBlockFlags[3];
+ *rContents << pBlockFlags[4];
+ *rContents << pBlockFlags[5];
+ *rContents << pBlockFlags[6];
+ *rContents << pBlockFlags[7];
+
+ DBG_ASSERT((rContents.Is() &&
+ (SVSTREAM_OK==rContents->GetError())),"damn");
+ return bRet;
+}
+
+
+sal_Bool OCX_CheckBox::Export(SvStorageRef &rObj,
+ const uno::Reference< beans::XPropertySet > &rPropSet,
+ const awt::Size &rSize)
+
+{
+ static sal_uInt8 __READONLY_DATA aCompObj[] = {
+ 0x01, 0x00, 0xFE, 0xFF, 0x03, 0x0A, 0x00, 0x00,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0x40, 0x1D, 0xD2, 0x8B,
+ 0x42, 0xEC, 0xCE, 0x11, 0x9E, 0x0D, 0x00, 0xAA,
+ 0x00, 0x60, 0x02, 0xF3, 0x1D, 0x00, 0x00, 0x00,
+ 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66,
+ 0x74, 0x20, 0x46, 0x6F, 0x72, 0x6D, 0x73, 0x20,
+ 0x32, 0x2E, 0x30, 0x20, 0x43, 0x68, 0x65, 0x63,
+ 0x6B, 0x42, 0x6F, 0x78, 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x45, 0x6D, 0x62, 0x65, 0x64, 0x64, 0x65,
+ 0x64, 0x20, 0x4F, 0x62, 0x6A, 0x65, 0x63, 0x74,
+ 0x00, 0x11, 0x00, 0x00, 0x00, 0x46, 0x6F, 0x72,
+ 0x6D, 0x73, 0x2E, 0x43, 0x68, 0x65, 0x63, 0x6B,
+ 0x42, 0x6F, 0x78, 0x2E, 0x31, 0x00, 0xF4, 0x39,
+ 0xB2, 0x71, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ };
+
+ {
+ SvStorageStreamRef xStor( rObj->OpenSotStream( C2S("\1CompObj")));
+ xStor->Write(aCompObj,sizeof(aCompObj));
+ DBG_ASSERT((xStor.Is() && (SVSTREAM_OK == xStor->GetError())),"damn");
+ }
+
+ {
+ SvStorageStreamRef xStor3( rObj->OpenSotStream( C2S("\3ObjInfo")));
+ xStor3->Write(aObjInfo,sizeof(aObjInfo));
+ DBG_ASSERT((xStor3.Is() && (SVSTREAM_OK == xStor3->GetError())),"damn");
+ }
+
+ static sal_uInt8 __READONLY_DATA aOCXNAME[] = {
+ 0x43, 0x00, 0x68, 0x00, 0x65, 0x00, 0x63, 0x00,
+ 0x6B, 0x00, 0x42, 0x00, 0x6F, 0x00, 0x78, 0x00,
+ 0x31, 0x00, 0x00, 0x00, 0x00, 0x00
+ };
+ {
+ SvStorageStreamRef xStor2( rObj->OpenSotStream( C2S("\3OCXNAME")));
+ xStor2->Write(aOCXNAME,sizeof(aOCXNAME));
+ DBG_ASSERT((xStor2.Is() && (SVSTREAM_OK == xStor2->GetError())),"damn");
+ }
+/*
+ static sal_uInt8 __READONLY_DATA aTest[] = {
+ 0x00, 0x02, 0x34, 0x00, 0x46, 0x01, 0xC0, 0x80,
+ 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x80, 0x09, 0x00, 0x00, 0x80,
+ 0xE2, 0x0E, 0x00, 0x00, 0x95, 0x02, 0x00, 0x00,
+ 0x30, 0x69, 0x1D, 0x00, 0x43, 0x68, 0x65, 0x63,
+ 0x6B, 0x42, 0x6F, 0x78, 0x31, 0x20, 0x52, 0x6F,
+ 0x00, 0x02, 0x20, 0x00, 0x35, 0x00, 0x00, 0x00,
+ 0x0F, 0x00, 0x00, 0x80, 0xC3, 0x00, 0x00, 0x00,
+ 0x00, 0x02, 0x00, 0x00, 0x54, 0x69, 0x6D, 0x65,
+ 0x73, 0x20, 0x4E, 0x65, 0x77, 0x20, 0x52, 0x6F,
+ 0x6D, 0x61, 0x6E, 0x00,
+ };
+*/
+ SvStorageStreamRef xContents( rObj->OpenSotStream( C2S("contents")));
+ return WriteContents(xContents, rPropSet, rSize);
+}
+
+
+sal_Bool OCX_FontData::Read(SvStorageStream *pS)
+{
+ long nStart = pS->Tell();
+ *pS >> nIdentifier;
+ *pS >> nFixedAreaLen;
+ pS->Read(pBlockFlags,4);
+
+ bool bFontName = (pBlockFlags[0] & 0x01) != 0;
+ if (bFontName)
+ *pS >> nFontNameLen;
+ if (pBlockFlags[0] & 0x02)
+ {
+ sal_uInt8 nTmp;
+ *pS >> nTmp;
+ fBold = nTmp & 0x01;
+ fItalic = (nTmp & 0x02) >> 1;
+ fUnderline = (nTmp & 0x04) >> 2;
+ fStrike = (nTmp & 0x08) >> 3;
+ fUnknown1 = (nTmp & 0xF0) >> 4;
+ *pS >> nUnknown2;
+ *pS >> nUnknown3;
+ *pS >> nUnknown4;
+ }
+ if (pBlockFlags[0] & 0x04)
+ {
+ ReadAlign(pS, pS->Tell() - nStart, 4);
+ *pS >> nFontSize;
+ }
+ else
+ nFontSize = 240;
+ if (pBlockFlags[0] & 0x10)
+ {
+ ReadAlign(pS, pS->Tell() - nStart, 2);
+ *pS >> nLanguageID;
+ }
+ if (pBlockFlags[0] & 0x40)
+ {
+ *pS >> nJustification;
+ }
+ if (pBlockFlags[0] & 0x80) // font weight before font name
+ {
+ ReadAlign(pS, pS->Tell() - nStart, 2);
+ *pS >> nFontWeight;
+ }
+
+ if (bFontName)
+ lclReadCharArray( *pS, pFontName, nFontNameLen, pS->Tell() - nStart);
+
+ ReadAlign(pS, pS->Tell() - nStart, 4);
+ return(TRUE);
+}
+
+void OCX_FontData::Import(uno::Reference< beans::XPropertySet > &rPropSet)
+{
+ uno::Any aTmp;
+ if (pFontName)
+ {
+ aTmp <<= lclCreateOUString( pFontName, nFontNameLen );
+ rPropSet->setPropertyValue( WW8_ASCII2STR("FontName"), aTmp);
+ }
+
+ if (bHasAlign)
+ {
+ sal_Int16 nAlign = ImportAlign(nJustification);
+ aTmp <<= nAlign;
+ rPropSet->setPropertyValue( WW8_ASCII2STR("Align"), aTmp);
+ }
+
+ if (fBold)
+ {
+ aTmp <<= awt::FontWeight::BOLD;
+ rPropSet->setPropertyValue( WW8_ASCII2STR("FontWeight"), aTmp);
+ }
+
+ if (fItalic)
+ {
+ aTmp <<= (sal_Int16)awt::FontSlant_ITALIC;
+ rPropSet->setPropertyValue( WW8_ASCII2STR("FontSlant"), aTmp);
+ }
+
+ if (fUnderline)
+ {
+ aTmp <<= awt::FontUnderline::SINGLE;
+ rPropSet->setPropertyValue( WW8_ASCII2STR("FontUnderline"), aTmp);
+ }
+
+ if (fStrike)
+ {
+ aTmp <<= awt::FontStrikeout::SINGLE;
+ rPropSet->setPropertyValue( WW8_ASCII2STR("FontStrikeout"), aTmp);
+ }
+
+ // 2004-09-17: very strange way of storing font sizes...
+ // 1pt->30, 2pt->45, 3pt->60, 4pt->75, 5pt->105, 6pt->120, 7pt->135
+ // 8pt->165, 9pt->180, 10pt->195, 11pt->225, ...
+ aTmp <<= sal_Int16( (nFontSize <= 30) ? 1 : ((nFontSize + 10) / 20) );
+ rPropSet->setPropertyValue( WW8_ASCII2STR("FontHeight"), aTmp);
+}
+
+sal_Bool OCX_FontData::Export(SvStorageStreamRef &rContent,
+ const uno::Reference< beans::XPropertySet > &rPropSet)
+{
+ sal_uInt8 nFlags=0x00;
+ sal_uInt32 nOldPos = rContent->Tell();
+ rContent->SeekRel(8);
+ SvxOcxString aFontName;
+ uno::Any aTmp;
+
+ if (bHasFont)
+ aFontName = rPropSet->getPropertyValue(WW8_ASCII2STR("FontName"));
+ if (!aFontName.HasData())
+ aFontName = OUString( RTL_CONSTASCII_USTRINGPARAM( "Times New Roman" ) );
+ aFontName.WriteLenField( *rContent );
+ nFlags |= 0x01;
+
+ if (bHasFont)
+ {
+ aTmp = rPropSet->getPropertyValue(WW8_ASCII2STR("FontWeight"));
+ float nBold = 0;
+ aTmp >>= nBold;
+
+ if (nBold >= 150)
+ {
+ nFlags |= 0x02;
+ sal_uInt8 nTmp=0x01;
+ *rContent << nTmp;
+ nTmp=0x00;
+ *rContent << nTmp;
+ *rContent << nTmp;
+ *rContent << nTmp;
+ }
+
+ aTmp = rPropSet->getPropertyValue(WW8_ASCII2STR("FontHeight"));
+ float nFontHeight = 0;
+ aTmp >>= nFontHeight;
+ if (nFontHeight)
+ {
+ nFlags |= 0x04;
+ // 2004-09-17: very strange way of storing font sizes:
+ // 1pt->30, 2pt->45, 3pt->60, 4pt->75, 5pt->105, 6pt->120, 7pt->135
+ // 8pt->165, 9pt->180, 10pt->195, 11pt->225, ...
+ nFontSize = (nFontHeight == 1) ? 30 : (static_cast<sal_uInt32>((nFontHeight*4+1)/3)*15);
+ *rContent << nFontSize;
+ }
+
+ if (bHasAlign)
+ {
+ *rContent << sal_uInt16(0x0200);
+ nFlags |= 0x10;
+
+ nFlags |= 0x20; // ?
+
+ aTmp = rPropSet->getPropertyValue(WW8_ASCII2STR("Align"));
+ nFlags |= 0x40;
+ sal_Int16 nAlign(0);
+ if (aTmp.hasValue())
+ aTmp >>= nAlign;
+ nJustification = ExportAlign(nAlign);
+ *rContent << nJustification;
+ }
+ }
+
+ aFontName.WriteCharArray( *rContent );
+ WriteAlign(rContent,4);
+
+ sal_uInt16 nFixedAreaLn = static_cast<sal_uInt16>(rContent->Tell()-nOldPos-4);
+ rContent->Seek(nOldPos);
+ *rContent << nStandardId;
+ *rContent << nFixedAreaLn;
+ *rContent << nFlags;
+ *rContent << sal_uInt8(0x00);
+ *rContent << sal_uInt8(0x00);
+ *rContent << sal_uInt8(0x00);
+
+ WriteAlign(rContent,4);
+ return sal_True;
+}
+
+// Doesn't really read anything but just skips the
+// record.
+sal_Bool OCX_TabStrip::Read(SotStorageStream *pS)
+{
+ const long skipLen = 0x18;
+ *pS >> nIdentifier;
+ DBG_ASSERT(nStandardId==nIdentifier,
+ "A control that has a different identifier");
+ *pS >> nFixedAreaLen;
+
+ pS->Read(pBlockFlags, sizeof(pBlockFlags));
+ pS->SeekRel(skipLen);
+ *pS >> nNumTabs;
+ // skip to end of control
+ pS->SeekRel(nFixedAreaLen - sizeof(pBlockFlags) - sizeof(nNumTabs) - skipLen );
+ return sal_True;
+}
+
+sal_Bool OCX_TabStrip::ReadFontData(SotStorageStream *pS)
+{
+ // Seems like there is a real font record followed by
+ // a number of blank records ( e.g. nFixedAreaLen = 0 )
+ // The number of trailing blank records is equal to the number of tabs
+ OCX_Control::ReadFontData(pS);
+ for ( sal_uInt16 index = 0; index < nNumTabs; index++ )
+ {
+ OCX_Control::Read(pS); // read trailing records
+ }
+ return sal_True;
+}
+
+sal_Bool OCX_Image::Read(SotStorageStream *pS)
+{
+ if ( !bSetInDialog )
+ {
+ // preserve the present behavior at the moment.
+ // only import image control for UserForms
+ return sal_False;
+ }
+ ULONG nStart = pS->Tell();
+ *pS >> nIdentifier;
+ DBG_ASSERT(nStandardId==nIdentifier,
+ "A control that has a different identifier");
+ *pS >> nFixedAreaLen;
+
+ pS->Read(pBlockFlags, sizeof(pBlockFlags));
+
+ bool hasEmbeddedImage = false;
+
+ if ( pBlockFlags[0] & 0x04 )
+ {
+ bAutoSize = true;
+ }
+ if ( pBlockFlags[0] & 0x08 )
+ {
+ *pS >> nBorderColor;
+ }
+ if ( pBlockFlags[0] & 0x10 )
+ {
+ *pS >> mnBackColor;
+ }
+ if ( pBlockFlags[0] & 0x20 )
+ {
+ *pS >> nBorderStyle;
+ }
+ if ( pBlockFlags[0] & 0x40 )
+ {
+ *pS >> nMousePointer;
+ }
+ if ( pBlockFlags[0] & 0x80 )
+ {
+ *pS >> nPictureSizeMode;
+ }
+
+ if ( pBlockFlags[ 1 ] & 0x1 )
+ {
+ *pS >> nSpecialEffect;
+ }
+ // investigate if valid also for formcontrols, although for controls
+ // images themselves seem to come through from escher ( as shape, think
+ // its probably a preview? )
+
+ // np a bit of a guess ( until proved incorrect )
+ if ( pBlockFlags[ 1 ] & 0x4 )
+ {
+ ReadAlign(pS, pS->Tell() - nStart, 2);
+ hasEmbeddedImage = true;
+ sal_uInt16 unknown;
+ *pS >> unknown;
+ }
+
+
+ if ( pBlockFlags[ 1 ] & 0x8 )
+ {
+ ReadAlign(pS, pS->Tell() - nStart, 2);
+ *pS >> nPictureAlignment;
+
+ }
+ if ( pBlockFlags[ 1 ] & 0x10 )
+ {
+ bPictureTiling = true;
+ }
+ if ( pBlockFlags[1] & 0x20 )
+ {
+ ReadAlign(pS, pS->Tell() - nStart, 4);
+ sal_uInt8 nTemp;
+ *pS >> nTemp;
+ fEnabled = (nTemp&0x02)>>1;
+ fBackStyle = (nTemp&0x08)>>3;
+ // padding?
+ *pS >> nTemp;
+ *pS >> nTemp;
+ *pS >> nTemp;
+ }
+ ReadAlign(pS, pS->Tell() - nStart, 4);
+ *pS >> nWidth;
+ *pS >> nHeight;
+
+ if ( hasEmbeddedImage )
+ {
+ //image follows this block
+ //len of image is 0x14 relative to end of this block
+ pS->Seek( pS->Tell() + 0x14 );
+
+ sal_uInt32 nImageLen = 0;
+ *pS >> nImageLen;
+
+ long imagePos = pS->Tell();
+
+ pS->Seek( imagePos );
+
+ sImageUrl = C2U("vnd.sun.star.expand:${$BRAND_BASE_DIR/program/") + C2U( SAL_CONFIGFILE( "bootstrap" ) ) + C2U("::UserInstallation}/user/temp/") + sName;
+
+ sal_uInt8* pImage = new sal_uInt8[ nImageLen ];
+ pS->Read(pImage, nImageLen);
+ bool result = storePictureInFileSystem( sImageUrl, pImage, nImageLen );
+ OUString pictName = sImageUrl.copy( sImageUrl.lastIndexOf('/') + 1 );
+ result = storePictureInDoc( pDocSh, pictName, pImage, nImageLen );
+ delete [] pImage;
+ }
+ return sal_True;
+}
+
+sal_Bool OCX_Image::Import( uno::Reference< beans::XPropertySet > &rPropSet )
+{
+ uno::Any aTmp(&sName,getCppuType((OUString *)0));
+ rPropSet->setPropertyValue( WW8_ASCII2STR("Name"), aTmp );
+
+ if( fBackStyle )
+ aTmp <<= ImportColor(mnBackColor);
+ else
+ aTmp = uno::Any();
+ rPropSet->setPropertyValue( WW8_ASCII2STR("BackgroundColor"), aTmp);
+
+ sal_Bool bTemp;
+ if (fEnabled)
+ bTemp = sal_True;
+ else
+ bTemp = sal_False;
+ aTmp = bool2any(bTemp);
+ rPropSet->setPropertyValue( WW8_ASCII2STR("Enabled"), aTmp);
+ if ( sImageUrl.getLength() )
+ {
+ aTmp <<= sImageUrl;
+ rPropSet->setPropertyValue( WW8_ASCII2STR("ImageURL"), aTmp);
+ }
+ return sal_True;
+}
+
+sal_Bool OCX_Image::WriteContents(SvStorageStreamRef &rContents,
+ const uno::Reference< beans::XPropertySet > &rPropSet,
+ const awt::Size &rSize)
+{
+ sal_Bool bRet=sal_True;
+ sal_uInt32 nOldPos = rContents->Tell();
+ rContents->SeekRel(8);
+
+ pBlockFlags[0] = 0;
+ pBlockFlags[1] = 0x02;
+ pBlockFlags[2] = 0;
+ pBlockFlags[3] = 0;
+
+ uno::Any aTmp = rPropSet->getPropertyValue(
+ WW8_ASCII2STR("BackgroundColor"));
+ if (aTmp.hasValue())
+ aTmp >>= mnBackColor;
+ *rContents << ExportColor(mnBackColor);
+ pBlockFlags[0] |= 0x10;
+
+
+ aTmp = rPropSet->getPropertyValue(WW8_ASCII2STR("Border"));
+ sal_Int16 nBorder = sal_Int16();
+ aTmp >>= nBorder;
+ nSpecialEffect = ExportBorder(nBorder,nBorderStyle);
+ *rContents << nBorderStyle;
+ pBlockFlags[0] |= 0x20;
+
+ *rContents << nSpecialEffect;
+ pBlockFlags[1] |= 0x01;
+
+ WriteAlign(rContents,4);
+
+ aTmp = rPropSet->getPropertyValue(WW8_ASCII2STR("Enabled"));
+ fEnabled = any2bool(aTmp);
+ if (fEnabled)
+ {
+ sal_uInt8 nTemp = 0x19;
+ *rContents << nTemp;
+ pBlockFlags[1] |= 0x20;
+ *rContents << sal_uInt8(0x00);
+ *rContents << sal_uInt8(0x00);
+ *rContents << sal_uInt8(0x00);
+ }
+
+ aTmp = rPropSet->getPropertyValue(WW8_ASCII2STR("ImageURL"));
+// OUString *pStr = (OUString *)aTmp.getValue();
+ /*Magically fetch that image and turn it into something that
+ *we can store in ms controls, wmf,png,jpg are almost certainly
+ *the options we have for export...*/
+
+ WriteAlign(rContents,4);
+ *rContents << rSize.Width;
+ *rContents << rSize.Height;
+
+ WriteAlign(rContents,4);
+ nFixedAreaLen = static_cast<sal_uInt16>(rContents->Tell()-nOldPos-4);
+
+ rContents->Seek(nOldPos);
+ *rContents << nStandardId;
+ *rContents << nFixedAreaLen;
+
+ *rContents << pBlockFlags[0];
+ *rContents << pBlockFlags[1];
+ *rContents << pBlockFlags[2];
+ *rContents << pBlockFlags[3];
+ DBG_ASSERT((rContents.Is() &&
+ (SVSTREAM_OK==rContents->GetError())),"damn");
+ return bRet;
+}
+
+
+sal_Bool OCX_Image::Export(SvStorageRef &rObj,
+ const uno::Reference< beans::XPropertySet > &rPropSet,
+ const awt::Size &rSize)
+{
+ static sal_uInt8 __READONLY_DATA aCompObj[] = {
+ 0x01, 0x00, 0xFE, 0xFF, 0x03, 0x0A, 0x00, 0x00,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0x41, 0x92, 0x59, 0x4C,
+ 0x26, 0x69, 0x1B, 0x10, 0x99, 0x92, 0x00, 0x00,
+ 0x0B, 0x65, 0xC6, 0xF9, 0x1A, 0x00, 0x00, 0x00,
+ 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66,
+ 0x74, 0x20, 0x46, 0x6F, 0x72, 0x6D, 0x73, 0x20,
+ 0x32, 0x2E, 0x30, 0x20, 0x49, 0x6D, 0x61, 0x67,
+ 0x65, 0x00, 0x10, 0x00, 0x00, 0x00, 0x45, 0x6D,
+ 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x20, 0x4F,
+ 0x62, 0x6A, 0x65, 0x63, 0x74, 0x00, 0x0E, 0x00,
+ 0x00, 0x00, 0x46, 0x6F, 0x72, 0x6D, 0x73, 0x2E,
+ 0x49, 0x6D, 0x61, 0x67, 0x65, 0x2E, 0x31, 0x00,
+ 0xF4, 0x39, 0xB2, 0x71, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ };
+
+ {
+ SvStorageStreamRef xStor( rObj->OpenSotStream( C2S("\1CompObj")));
+ xStor->Write(aCompObj,sizeof(aCompObj));
+ DBG_ASSERT((xStor.Is() && (SVSTREAM_OK == xStor->GetError())),"damn");
+ }
+
+ {
+ SvStorageStreamRef xStor3( rObj->OpenSotStream( C2S("\3ObjInfo")));
+ xStor3->Write(aObjInfo,sizeof(aObjInfo));
+ DBG_ASSERT((xStor3.Is() && (SVSTREAM_OK == xStor3->GetError())),"damn");
+ }
+
+ static sal_uInt8 __READONLY_DATA aOCXNAME[] = {
+ 0x49, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x67, 0x00,
+ 0x65, 0x00, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00
+ };
+
+ {
+ SvStorageStreamRef xStor2( rObj->OpenSotStream( C2S("\3OCXNAME")));
+ xStor2->Write(aOCXNAME,sizeof(aOCXNAME));
+ DBG_ASSERT((xStor2.Is() && (SVSTREAM_OK == xStor2->GetError())),"damn");
+ }
+
+ SvStorageStreamRef xContents( rObj->OpenSotStream( C2S("contents")));
+ return WriteContents(xContents, rPropSet, rSize);
+}
+
+// ============================================================================
+
+OCX_SpinButton::OCX_SpinButton() :
+ OCX_Control( OUString( RTL_CONSTASCII_USTRINGPARAM( "SpinButton" ) ) ),
+ mnBlockFlags( 0 ),
+ mnValue( 0 ),
+ mnMin( 0 ),
+ mnMax( 100 ),
+ mnSmallStep( 1 ),
+ mnPageStep( 1 ),
+ mnOrient( -1 ),
+ mnDelay( 50 ),
+ mbEnabled( true ),
+ mbLocked( false ),
+ mbPropThumb( true )
+{
+ msFormType = C2U("com.sun.star.form.component.SpinButton");
+ msDialogType = C2U("com.sun.star.awt.UnoControlSpinButtonModel");
+ mnBackColor = 0x8000000F;
+ mnForeColor = 0x80000012;
+}
+
+OCX_Control* OCX_SpinButton::Create()
+{
+ return new OCX_SpinButton;
+}
+
+sal_Bool OCX_SpinButton::Read( SvStorageStream *pS )
+{
+ if( !pS ) return sal_False;
+
+ SvStream& rStrm = *pS;
+ sal_uInt16 nId, nSize;
+ sal_Int32 nIcon = 0;
+
+ rStrm >> nId >> nSize >> mnBlockFlags;
+
+ DBG_ASSERT( nStandardId == nId, "OCX_SpinButton::Read - unknown identifier" );
+
+ if( mnBlockFlags & 0x00000001 ) rStrm >> mnForeColor;
+ if( mnBlockFlags & 0x00000002 ) rStrm >> mnBackColor;
+ if( mnBlockFlags & 0x00000004 )
+ {
+ sal_Int32 nFlags;
+ rStrm >> nFlags;
+ mbEnabled = (nFlags & 0x00000002) != 0;
+ mbLocked = (nFlags & 0x00000004) != 0;
+ }
+ if( mnBlockFlags & 0x00000010 ) rStrm.SeekRel( 4 ); // mouse pointer
+ if( mnBlockFlags & 0x00000020 ) rStrm >> mnMin;
+ if( mnBlockFlags & 0x00000040 ) rStrm >> mnMax;
+ if( mnBlockFlags & 0x00000080 ) rStrm >> mnValue;
+ if( mnBlockFlags & 0x00000100 ) rStrm.SeekRel( 4 ); // unknown
+ if( mnBlockFlags & 0x00000200 ) rStrm.SeekRel( 4 ); // unknown
+ if( mnBlockFlags & 0x00000400 ) rStrm.SeekRel( 4 ); // unknown
+ if( mnBlockFlags & 0x00000800 ) rStrm >> mnSmallStep;
+ if( mnBlockFlags & 0x00001000 ) rStrm >> mnPageStep;
+ if( mnBlockFlags & 0x00002000 ) rStrm >> mnOrient;
+ if( mnBlockFlags & 0x00004000 )
+ {
+ sal_Int32 nThumb;
+ *pS >> nThumb;
+ mbPropThumb = nThumb != 0;
+ }
+ if( mnBlockFlags & 0x00008000 ) rStrm >> mnDelay;
+ if( mnBlockFlags & 0x00010000 ) rStrm >> nIcon;
+ if( mnBlockFlags & 0x00000008 ) rStrm >> nWidth >> nHeight;
+
+ if( nIcon )
+ {
+ sal_Int32 nIconSize;
+ pS->SeekRel( 20 );
+ *pS >> nIconSize;
+ pS->SeekRel( nIconSize );
+ }
+
+ return sal_True;
+}
+
+sal_Bool OCX_SpinButton::ReadFontData( SvStorageStream* /* pS */ )
+{
+ // spin buttons and scroll bars do not support font data
+ return sal_True;
+}
+
+sal_Bool OCX_SpinButton::Import(com::sun::star::uno::Reference<
+ com::sun::star::beans::XPropertySet> &rPropSet)
+{
+ if( (nWidth < 1) || (nHeight < 1) )
+ return sal_False;
+
+ uno::Any aTmp( &sName, getCppuType((OUString *)0) );
+ rPropSet->setPropertyValue( WW8_ASCII2STR( "Name" ), aTmp );
+
+ aTmp <<= ImportColor( mnForeColor );
+ rPropSet->setPropertyValue( WW8_ASCII2STR("SymbolColor"), aTmp);
+
+ aTmp <<= ImportColor( mnBackColor );
+ rPropSet->setPropertyValue( WW8_ASCII2STR("BackgroundColor"), aTmp);
+
+ aTmp = bool2any( mbEnabled && !mbLocked );
+ rPropSet->setPropertyValue( WW8_ASCII2STR("Enabled"), aTmp);
+
+ aTmp <<= mnValue;
+ if ( bSetInDialog )
+ {
+ rPropSet->setPropertyValue( WW8_ASCII2STR("SpinValue"), aTmp );
+ }
+ else
+ {
+ rPropSet->setPropertyValue( WW8_ASCII2STR("DefaultSpinValue"), aTmp );
+ }
+
+ aTmp <<= mnMin;
+ rPropSet->setPropertyValue( WW8_ASCII2STR("SpinValueMin"), aTmp );
+
+ aTmp <<= mnMax;
+ rPropSet->setPropertyValue( WW8_ASCII2STR("SpinValueMax"), aTmp );
+
+ aTmp <<= mnSmallStep;
+ rPropSet->setPropertyValue( WW8_ASCII2STR("SpinIncrement"), aTmp );
+
+ namespace AwtScrollOrient = ::com::sun::star::awt::ScrollBarOrientation;
+ switch( mnOrient )
+ {
+ case 0: aTmp <<= AwtScrollOrient::VERTICAL; break;
+ case 1: aTmp <<= AwtScrollOrient::HORIZONTAL; break;
+ default: aTmp <<= (nWidth < nHeight) ? AwtScrollOrient::VERTICAL : AwtScrollOrient::HORIZONTAL;
+ }
+ rPropSet->setPropertyValue( WW8_ASCII2STR("Orientation"), aTmp );
+
+ aTmp = bool2any( true );
+ rPropSet->setPropertyValue( WW8_ASCII2STR("Repeat"), aTmp );
+
+ aTmp <<= mnDelay;
+ rPropSet->setPropertyValue( WW8_ASCII2STR("RepeatDelay"), aTmp );
+
+ aTmp <<= sal_Int16( 0 );
+ rPropSet->setPropertyValue( WW8_ASCII2STR("Border"), aTmp);
+
+ return sal_True;
+}
+
+sal_Bool OCX_SpinButton::Export(
+ SvStorageRef &rObj,
+ const uno::Reference< beans::XPropertySet>& rPropSet,
+ const awt::Size& rSize )
+{
+ static sal_uInt8 __READONLY_DATA aCompObj[] =
+ {
+ 0x01, 0x00, 0xFE, 0xFF, 0x03, 0x0A, 0x00, 0x00,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xB0, 0x6F, 0x17, 0x79,
+ 0xF2, 0xB7, 0xCE, 0x11, 0x97, 0xEF, 0x00, 0xAA,
+ 0x00, 0x6D, 0x27, 0x76, 0x1F, 0x00, 0x00, 0x00,
+ 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66,
+ 0x74, 0x20, 0x46, 0x6F, 0x72, 0x6D, 0x73, 0x20,
+ 0x32, 0x2E, 0x30, 0x20, 0x53, 0x70, 0x69, 0x6E,
+ 0x42, 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0x45, 0x6D, 0x62, 0x65, 0x64,
+ 0x64, 0x65, 0x64, 0x20, 0x4F, 0x62, 0x6A, 0x65,
+ 0x63, 0x74, 0x00, 0x13, 0x00, 0x00, 0x00, 0x46,
+ 0x6E, 0x42, 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x2E,
+ 0x31, 0x00, 0xF4, 0x39, 0xB2, 0x71, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00
+ };
+
+ {
+ SvStorageStreamRef xStor( rObj->OpenSotStream( C2S("\1CompObj")));
+ xStor->Write(aCompObj,sizeof(aCompObj));
+ DBG_ASSERT((xStor.Is() && (SVSTREAM_OK == xStor->GetError())),"damn");
+ }
+
+ {
+ SvStorageStreamRef xStor3( rObj->OpenSotStream( C2S("\3ObjInfo")));
+ xStor3->Write(aObjInfo,sizeof(aObjInfo));
+ DBG_ASSERT((xStor3.Is() && (SVSTREAM_OK == xStor3->GetError())),"damn");
+ }
+
+ static sal_uInt8 __READONLY_DATA aOCXNAME[] =
+ {
+ 0x53, 0x00, 0x70, 0x00, 0x69, 0x00, 0x6E, 0x00,
+ 0x42, 0x00, 0x75, 0x00, 0x74, 0x00, 0x74, 0x00,
+ 0x6F, 0x00, 0x6E, 0x00, 0x31, 0x00, 0x00, 0x00,
+ 0x00, 0x00
+ };
+
+ {
+ SvStorageStreamRef xStor2( rObj->OpenSotStream( C2S("\3OCXNAME")));
+ xStor2->Write(aOCXNAME,sizeof(aOCXNAME));
+ DBG_ASSERT((xStor2.Is() && (SVSTREAM_OK == xStor2->GetError())),"damn");
+ }
+
+ SvStorageStreamRef xContents( rObj->OpenSotStream( C2S("contents")));
+ return WriteContents(xContents, rPropSet, rSize);
+}
+
+sal_Bool OCX_SpinButton::WriteContents(
+ SvStorageStreamRef &rObj,
+ const uno::Reference< beans::XPropertySet> &rPropSet,
+ const awt::Size& rSize )
+{
+ if( !rObj.Is() )
+ return sal_False;
+
+ mnBlockFlags = 0x00000008;
+ nWidth = rSize.Width;
+ nHeight = rSize.Height;
+
+ GetInt32Property( mnForeColor, rPropSet, WW8_ASCII2STR( "SymbolColor" ), 0x00000001 );
+ GetInt32Property( mnBackColor, rPropSet, WW8_ASCII2STR( "BackgroundColor" ), 0x00000002 );
+ GetBoolProperty( mbEnabled, rPropSet, WW8_ASCII2STR( "Enabled" ), 0x00000304 );
+ GetInt32Property( mnMin, rPropSet, WW8_ASCII2STR( "SpinValueMin" ), 0x00000020 );
+ GetInt32Property( mnMax, rPropSet, WW8_ASCII2STR( "SpinValueMax" ), 0x00000040 );
+ GetInt32Property( mnValue, rPropSet, WW8_ASCII2STR( "SpinValue" ), 0x00000080 );
+ GetInt32Property( mnSmallStep, rPropSet, WW8_ASCII2STR( "SpinIncrement" ), 0x00000800 );
+ GetInt32Property( mnDelay, rPropSet, WW8_ASCII2STR( "RepeatDelay" ), 0x00008000 );
+
+ namespace AwtScrollOrient = ::com::sun::star::awt::ScrollBarOrientation;
+ sal_Int16 nApiOrient = sal_Int16();
+ if( rPropSet->getPropertyValue( WW8_ASCII2STR( "Orientation" ) ) >>= nApiOrient )
+ UpdateInt32Property( mnOrient, (nApiOrient == AwtScrollOrient::VERTICAL) ? 0 : 1, 0x00002000 );
+
+ return WriteData( *rObj );
+}
+
+void OCX_SpinButton::UpdateInt32Property(
+ sal_Int32& rnCoreValue, sal_Int32 nNewValue, sal_Int32 nBlockFlag )
+{
+ if( nNewValue != rnCoreValue )
+ {
+ rnCoreValue = nNewValue;
+ mnBlockFlags |= nBlockFlag;
+ }
+}
+
+void OCX_SpinButton::GetInt32Property(
+ sal_Int32& rnCoreValue, const uno::Reference< beans::XPropertySet>& rxPropSet,
+ const OUString& rPropName, sal_Int32 nBlockFlag )
+{
+ sal_Int32 nNewValue = 0;
+ if( rxPropSet->getPropertyValue( rPropName ) >>= nNewValue )
+ UpdateInt32Property( rnCoreValue, nNewValue, nBlockFlag );
+}
+
+void OCX_SpinButton::UpdateBoolProperty(
+ bool& rbCoreValue, bool bNewValue, sal_Int32 nBlockFlag )
+{
+ if( bNewValue != rbCoreValue )
+ {
+ rbCoreValue = bNewValue;
+ mnBlockFlags |= nBlockFlag;
+ }
+}
+
+void OCX_SpinButton::GetBoolProperty(
+ bool& rbCoreValue, const uno::Reference< beans::XPropertySet>& rxPropSet,
+ const OUString& rPropName, sal_Int32 nBlockFlag )
+{
+ UpdateBoolProperty( rbCoreValue,
+ any2bool( rxPropSet->getPropertyValue( rPropName ) ), nBlockFlag );
+}
+
+sal_Bool OCX_SpinButton::WriteData( SvStream& rStrm ) const
+{
+ sal_Bool bRet = sal_True;
+ ULONG nStartPos = rStrm.Tell();
+
+ rStrm << sal_Int32( 0 ) << mnBlockFlags;
+
+ if( mnBlockFlags & 0x00000001 ) rStrm << ExportColor( mnForeColor );
+ if( mnBlockFlags & 0x00000002 ) rStrm << ExportColor( mnBackColor );
+ if( mnBlockFlags & 0x00000004 )
+ {
+ sal_Int32 nFlags = 0x00000019; // always set
+ if( mbEnabled ) nFlags |= 0x00000002;
+ if( mbLocked ) nFlags |= 0x00000004;
+ rStrm << nFlags;
+ }
+ if( mnBlockFlags & 0x00000020 ) rStrm << mnMin;
+ if( mnBlockFlags & 0x00000040 ) rStrm << mnMax;
+ if( mnBlockFlags & 0x00000080 ) rStrm << mnValue;
+ if( mnBlockFlags & 0x00000100 ) rStrm << sal_Int32( 0 ); // unknown
+ if( mnBlockFlags & 0x00000200 ) rStrm << sal_Int32( 0 ); // unknown
+ if( mnBlockFlags & 0x00000400 ) rStrm << sal_Int32( 0 ); // unknown
+ if( mnBlockFlags & 0x00000800 ) rStrm << mnSmallStep;
+ if( mnBlockFlags & 0x00001000 ) rStrm << mnPageStep;
+ if( mnBlockFlags & 0x00002000 ) rStrm << mnOrient;
+ if( mnBlockFlags & 0x00004000 ) rStrm << sal_Int32( mbPropThumb ? 1 : 0 );
+ if( mnBlockFlags & 0x00008000 ) rStrm << mnDelay;
+ if( mnBlockFlags & 0x00000008 ) rStrm << nWidth << nHeight;
+
+ sal_uInt16 nSize = static_cast< sal_uInt16 >( rStrm.Tell() - nStartPos - 4 );
+ rStrm.Seek( nStartPos );
+ rStrm << nStandardId << nSize;
+
+ DBG_ASSERT( rStrm.GetError() == SVSTREAM_OK, "OCX_SpinButton::WriteData - error in stream" );
+ return bRet;
+}
+
+// ============================================================================
+
+OCX_ScrollBar::OCX_ScrollBar()
+{
+ sName = OUString( RTL_CONSTASCII_USTRINGPARAM( "ScrollBar" ) );
+ mnMax = 32767;
+ msFormType = C2U("com.sun.star.form.component.ScrollBar");
+ msDialogType = C2U("com.sun.star.awt.UnoControlScrollBarModel");
+
+}
+
+OCX_Control* OCX_ScrollBar::Create()
+{
+ return new OCX_ScrollBar;
+}
+
+sal_Bool OCX_ScrollBar::Import(com::sun::star::uno::Reference<
+ com::sun::star::beans::XPropertySet> &rPropSet)
+{
+ if( (nWidth < 1) || (nHeight < 1) )
+ return sal_False;
+
+ uno::Any aTmp( &sName, getCppuType((OUString *)0) );
+ rPropSet->setPropertyValue( WW8_ASCII2STR( "Name" ), aTmp );
+
+ aTmp <<= ImportColor( mnForeColor );
+ rPropSet->setPropertyValue( WW8_ASCII2STR("SymbolColor"), aTmp);
+
+ aTmp <<= ImportColor( mnBackColor );
+ rPropSet->setPropertyValue( WW8_ASCII2STR("BackgroundColor"), aTmp);
+
+ aTmp = bool2any( mbEnabled && !mbLocked );
+ rPropSet->setPropertyValue( WW8_ASCII2STR("Enabled"), aTmp);
+
+ aTmp <<= mnValue;
+ if ( bSetInDialog )
+ {
+ rPropSet->setPropertyValue( WW8_ASCII2STR("ScrollValue"), aTmp );
+ }
+ else
+ {
+ rPropSet->setPropertyValue( WW8_ASCII2STR("DefaultScrollValue"), aTmp );
+ }
+
+ aTmp <<= mnMin;
+ rPropSet->setPropertyValue( WW8_ASCII2STR("ScrollValueMin"), aTmp );
+
+ aTmp <<= mnMax;
+ rPropSet->setPropertyValue( WW8_ASCII2STR("ScrollValueMax"), aTmp );
+
+ aTmp <<= mnSmallStep;
+ rPropSet->setPropertyValue( WW8_ASCII2STR("LineIncrement"), aTmp );
+
+ aTmp <<= mnPageStep;
+ rPropSet->setPropertyValue( WW8_ASCII2STR("BlockIncrement"), aTmp );
+ if( mbPropThumb && (mnPageStep > 0) )
+ rPropSet->setPropertyValue( WW8_ASCII2STR("VisibleSize"), aTmp );
+
+ namespace AwtScrollOrient = ::com::sun::star::awt::ScrollBarOrientation;
+ switch( mnOrient )
+ {
+ case 0: aTmp <<= AwtScrollOrient::VERTICAL; break;
+ case 1: aTmp <<= AwtScrollOrient::HORIZONTAL; break;
+ default: aTmp <<= (nWidth < nHeight) ? AwtScrollOrient::VERTICAL : AwtScrollOrient::HORIZONTAL;
+ }
+ rPropSet->setPropertyValue( WW8_ASCII2STR("Orientation"), aTmp );
+
+ aTmp <<= mnDelay;
+ rPropSet->setPropertyValue( WW8_ASCII2STR("RepeatDelay"), aTmp );
+
+ aTmp <<= sal_Int16( 0 );
+ rPropSet->setPropertyValue( WW8_ASCII2STR("Border"), aTmp);
+
+ return sal_True;
+}
+
+sal_Bool OCX_ScrollBar::Export(
+ SvStorageRef &rObj,
+ const uno::Reference< beans::XPropertySet>& rPropSet,
+ const awt::Size& rSize )
+{
+ static sal_uInt8 __READONLY_DATA aCompObj[] =
+ {
+ 0x01, 0x00, 0xFE, 0xFF, 0x03, 0x0A, 0x00, 0x00,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x81, 0xD1, 0xDF,
+ 0x2F, 0x5E, 0xCE, 0x11, 0xA4, 0x49, 0x00, 0xAA,
+ 0x00, 0x4A, 0x80, 0x3D, 0x1E, 0x00, 0x00, 0x00,
+ 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66,
+ 0x74, 0x20, 0x46, 0x6F, 0x72, 0x6D, 0x73, 0x20,
+ 0x32, 0x2E, 0x30, 0x20, 0x53, 0x63, 0x72, 0x6F,
+ 0x6C, 0x6C, 0x42, 0x61, 0x72, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x45, 0x6D, 0x62, 0x65, 0x64, 0x64,
+ 0x65, 0x64, 0x20, 0x4F, 0x62, 0x6A, 0x65, 0x63,
+ 0x74, 0x00, 0x12, 0x00, 0x00, 0x00, 0x46, 0x6F,
+ 0x72, 0x6D, 0x73, 0x2E, 0x53, 0x63, 0x72, 0x6F,
+ 0x6C, 0x6C, 0x42, 0x61, 0x72, 0x2E, 0x31, 0x00,
+ 0xF4, 0x39, 0xB2, 0x71, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ };
+
+ {
+ SvStorageStreamRef xStor( rObj->OpenSotStream( C2S("\1CompObj")));
+ xStor->Write(aCompObj,sizeof(aCompObj));
+ DBG_ASSERT((xStor.Is() && (SVSTREAM_OK == xStor->GetError())),"damn");
+ }
+
+ {
+ SvStorageStreamRef xStor3( rObj->OpenSotStream( C2S("\3ObjInfo")));
+ xStor3->Write(aObjInfo,sizeof(aObjInfo));
+ DBG_ASSERT((xStor3.Is() && (SVSTREAM_OK == xStor3->GetError())),"damn");
+ }
+
+ static sal_uInt8 __READONLY_DATA aOCXNAME[] =
+ {
+ 0x53, 0x00, 0x63, 0x00, 0x72, 0x00, 0x6F, 0x00,
+ 0x6C, 0x00, 0x6C, 0x00, 0x42, 0x00, 0x61, 0x00,
+ 0x72, 0x00, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00
+ };
+
+ {
+ SvStorageStreamRef xStor2( rObj->OpenSotStream( C2S("\3OCXNAME")));
+ xStor2->Write(aOCXNAME,sizeof(aOCXNAME));
+ DBG_ASSERT((xStor2.Is() && (SVSTREAM_OK == xStor2->GetError())),"damn");
+ }
+
+ SvStorageStreamRef xContents( rObj->OpenSotStream( C2S("contents")));
+ return WriteContents(xContents, rPropSet, rSize);
+}
+
+sal_Bool OCX_ScrollBar::WriteContents(
+ SvStorageStreamRef &rObj,
+ const uno::Reference< beans::XPropertySet> &rPropSet,
+ const awt::Size& rSize )
+{
+ if( !rObj.Is() )
+ return sal_False;
+
+ mnBlockFlags = 0x00000008;
+ nWidth = rSize.Width;
+ nHeight = rSize.Height;
+
+ GetInt32Property( mnForeColor, rPropSet, WW8_ASCII2STR( "SymbolColor" ), 0x00000001 );
+ GetInt32Property( mnBackColor, rPropSet, WW8_ASCII2STR( "BackgroundColor" ), 0x00000002 );
+ GetBoolProperty( mbEnabled, rPropSet, WW8_ASCII2STR( "Enabled" ), 0x00000304 );
+ GetInt32Property( mnMin, rPropSet, WW8_ASCII2STR( "ScrollValueMin" ), 0x00000020 );
+ GetInt32Property( mnMax, rPropSet, WW8_ASCII2STR( "ScrollValueMax" ), 0x00000040 );
+ GetInt32Property( mnValue, rPropSet, WW8_ASCII2STR( "ScrollValue" ), 0x00000080 );
+ GetInt32Property( mnSmallStep, rPropSet, WW8_ASCII2STR( "LineIncrement" ), 0x00000800 );
+ GetInt32Property( mnPageStep, rPropSet, WW8_ASCII2STR( "BlockIncrement" ), 0x00001000 );
+ GetInt32Property( mnDelay, rPropSet, WW8_ASCII2STR( "RepeatDelay" ), 0x00008000 );
+
+ namespace AwtScrollOrient = ::com::sun::star::awt::ScrollBarOrientation;
+ sal_Int16 nApiOrient = sal_Int16();
+ if( rPropSet->getPropertyValue( WW8_ASCII2STR( "Orientation" ) ) >>= nApiOrient )
+ UpdateInt32Property( mnOrient, (nApiOrient == AwtScrollOrient::VERTICAL) ? 0 : 1, 0x00002000 );
+
+ UpdateBoolProperty( mbPropThumb, true, 0x00004000 );
+
+ return WriteData( *rObj );
+}
+
+OCX_ProgressBar::OCX_ProgressBar() :
+ OCX_Control( OUString( RTL_CONSTASCII_USTRINGPARAM( "ProgressBar" ) ) ),
+ nMin( 0 ),
+ nMax( 0 ),
+ bFixedSingle(true),
+ bEnabled( true ),
+ b3d( true )
+{
+ msDialogType = C2U("com.sun.star.awt.UnoControlProgressBarModel");
+ bSetInDialog = true;
+}
+
+sal_Bool OCX_ProgressBar::Read( SvStorageStream *pS )
+{
+ pS->SeekRel( 8 );
+ *pS >> nWidth >> nHeight;
+ pS->SeekRel( 12 );
+
+ float fMin, fMax;
+ *pS >> fMin >> fMax;
+ nMin = static_cast< sal_Int32 >( fMin );
+ nMax = static_cast< sal_Int32 >( fMax );
+ bool bVisible = true;
+ sal_uInt8 pUnknownFlags[4];
+ pS->Read(pUnknownFlags,4);
+
+ // complete guess, but we don't handle visible anyway
+ if ( ( pUnknownFlags[2] & 0x8 ) && ( pUnknownFlags[2] & 0x2 ) )
+ bVisible = false;
+
+ sal_uInt32 nFlags;
+ *pS >> nFlags;
+
+ // seems these work out
+ bFixedSingle = (nFlags & 0x01) != 0;
+ bEnabled = (nFlags & 0x02) != 0;
+ b3d = (nFlags & 0x04) != 0;
+
+ return true;
+}
+
+OCX_Control* OCX_ProgressBar::Create()
+{
+ return new OCX_ProgressBar;
+}
+
+sal_Bool OCX_ProgressBar::Import(uno::Reference< beans::XPropertySet > &rPropSet)
+{
+ uno::Any aTmp(&sName,getCppuType((OUString *)0));
+ rPropSet->setPropertyValue( WW8_ASCII2STR("Name"), aTmp );
+ aTmp <<= nMax;
+ rPropSet->setPropertyValue( WW8_ASCII2STR("ProgressValueMax"), aTmp );
+ aTmp <<= nMin;
+ rPropSet->setPropertyValue( WW8_ASCII2STR("ProgressValueMin"), aTmp );
+
+ if ( !bEnabled )
+ rPropSet->setPropertyValue( WW8_ASCII2STR("Enabled"), uno::makeAny( sal_False ) );
+ return sal_True;
+}
+// ============================================================================
+
+/* vi:set tabstop=4 shiftwidth=4 expandtab: */