blob: 7f4a28921937fa8d9b73d88f791a30cac22be991 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#ifndef SC_XCL97ESC_HXX
#define SC_XCL97ESC_HXX
#include <memory>
#include <tools/table.hxx>
#include <tools/stack.hxx>
#include <filter/msfilter/escherex.hxx>
#include "xlescher.hxx"
#include "xeroot.hxx"
// 0 = Export TBX form controls, 1 = Export OCX form controls.
//#define EXC_EXP_OCX_CTRL 0
namespace utl { class TempFile; }
// ============================================================================
class SvStream;
class XclEscherExGlobal : public EscherExGlobal, protected XclExpRoot
{
public:
explicit XclEscherExGlobal( const XclExpRoot& rRoot );
private:
/** Overloaded to create a new temporary file and return its stream. */
virtual SvStream* ImplQueryPictureStream();
private:
::std::auto_ptr< ::utl::TempFile > mxPicTempFile;
::std::auto_ptr< SvStream > mxPicStrm;
};
// ============================================================================
class XclObj;
class XclExpDffAnchorBase;
class XclEscherHostAppData;
class XclEscherClientData;
class XclEscherClientTextbox;
//delete for exporting OCX
//#if EXC_EXP_OCX_CTRL
class XclExpOcxControlObj;
//#else
class XclExpTbxControlObj;
//#endif
class XclEscherEx : public EscherEx, protected XclExpRoot
{
public:
explicit XclEscherEx(
const XclExpRoot& rRoot,
XclExpObjectManager& rObjMgr,
SvStream& rStrm,
const XclEscherEx* pParent = 0 );
virtual ~XclEscherEx();
/** Called by MSODRAWING record constructors to initialize the DFF stream
fragment they will own. returns the DFF fragment identifier. */
sal_uInt32 InitNextDffFragment();
/** Called after some data has been written to the DFF stream, to update
the end position of the DFF fragment owned by an MSODRAWING record. */
void UpdateDffFragmentEnd();
/** Returns the position of the specified DFF stream fragment. */
sal_uInt32 GetDffFragmentPos( sal_uInt32 nFragmentKey );
/** Returns the size of the specified DFF stream fragment. */
sal_uInt32 GetDffFragmentSize( sal_uInt32 nFragmentKey );
/** Returns true, if there is more data left in the DFF stream than owned
by the last MSODRAWING record. */
bool HasPendingDffData();
/** Creates a new DFF client anchor object and calculates the anchor
position of the passed object. Caller takes ownership! */
XclExpDffAnchorBase* CreateDffAnchor( const SdrObject& rSdrObj ) const;
virtual EscherExHostAppData* StartShape(
const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape>& rxShape,
const Rectangle* pChildAnchor );
virtual void EndShape( sal_uInt16 nShapeType, sal_uInt32 nShapeID );
virtual EscherExHostAppData* EnterAdditionalTextGroup();
/// Flush and merge PicStream into EscherStream
void EndDocument();
//delete for exporting OCX
//#if EXC_EXP_OCX_CTRL
/** Creates an OCX form control OBJ record from the passed form control.
@descr Writes the form control data to the 'Ctls' stream. */
XclExpOcxControlObj* CreateOCXCtrlObj(
::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > xShape,
const Rectangle* pChildAnchor );
/** Creates a TBX form control OBJ record from the passed form control. */
XclExpTbxControlObj* CreateTBXCtrlObj(
::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > xShape,
const Rectangle* pChildAnchor );
private:
SotStorageStreamRef mxCtlsStrm; /// The 'Ctls' stream.
//#else
private:
/** Tries to get the name of a Basic macro from a control. */
void ConvertTbxMacro(
XclExpTbxControlObj& rTbxCtrlObj,
::com::sun::star::uno::Reference<
::com::sun::star::awt::XControlModel > xCtrlModel );
//#endif
void DeleteCurrAppData();
private:
XclExpObjectManager& mrObjMgr;
Stack aStack;
XclObj* pCurrXclObj;
XclEscherHostAppData* pCurrAppData;
XclEscherClientData* pTheClientData; // always the same
XclEscherClientTextbox* pAdditionalText;
sal_uInt16 nAdditionalText;
sal_uInt32 mnNextKey;
bool mbIsRootDff;
};
// --- class XclEscherHostAppData ------------------------------------
class XclEscherHostAppData : public EscherExHostAppData
{
private:
sal_Bool bStackedGroup;
public:
XclEscherHostAppData() : bStackedGroup( sal_False )
{}
inline void SetStackedGroup( sal_Bool b ) { bStackedGroup = b; }
inline sal_Bool IsStackedGroup() const { return bStackedGroup; }
};
// ============================================================================
// --- class XclEscherClientData -------------------------------------
class XclEscherClientData : public EscherExClientRecord_Base
{
public:
XclEscherClientData() {}
virtual void WriteData( EscherEx& rEx ) const;
};
// --- class XclEscherClientTextbox ----------------------------------
class SdrTextObj;
class XclEscherClientTextbox : public EscherExClientRecord_Base, protected XclExpRoot
{
private:
const SdrTextObj& rTextObj;
XclObj* pXclObj;
public:
XclEscherClientTextbox(
const XclExpRoot& rRoot,
const SdrTextObj& rObj,
XclObj* pObj );
//! ONLY for the AdditionalText mimic
inline void SetXclObj( XclObj* p ) { pXclObj = p; }
virtual void WriteData( EscherEx& rEx ) const;
};
#endif // _XCL97ESC_HXX