1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* 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 .
*/
#ifndef INCLUDED_SC_SOURCE_FILTER_INC_XCL97ESC_HXX
#define INCLUDED_SC_SOURCE_FILTER_INC_XCL97ESC_HXX
#include <memory>
#include <stack>
#include <filter/msfilter/escherex.hxx>
#include "xlescher.hxx"
#include "xeroot.hxx"
#include <vector>
namespace utl { class TempFile; }
class SvStream;
class XclEscherExGlobal : public EscherExGlobal, protected XclExpRoot
{
public:
explicit XclEscherExGlobal( const XclExpRoot& rRoot );
private:
/** Override to create a new temporary file and return its stream. */
virtual SvStream* ImplQueryPictureStream() SAL_OVERRIDE;
private:
::std::unique_ptr< ::utl::TempFile > mxPicTempFile;
::std::unique_ptr< SvStream > mxPicStrm;
};
class XclObj;
class XclExpDffAnchorBase;
class XclEscherHostAppData;
class XclEscherClientData;
class XclEscherClientTextbox;
class XclExpOcxControlObj;
class XclExpTbxControlObj;
class XclExpShapeObj;
class EscherExHostAppData;
class ShapeInteractionHelper
{
public:
static XclExpShapeObj* CreateShapeObj( XclExpObjectManager& rObjMgr, const ::com::sun::star::uno::Reference<
::com::sun::star::drawing::XShape >& xShape );
static void PopulateShapeInteractionInfo( XclExpObjectManager& rObjMgr, const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape >& xShape, EscherExHostAppData& rHostAppData );
};
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 ) SAL_OVERRIDE;
virtual void EndShape( sal_uInt16 nShapeType, sal_uInt32 nShapeID ) SAL_OVERRIDE;
virtual EscherExHostAppData* EnterAdditionalTextGroup() SAL_OVERRIDE;
/// Flush and merge PicStream into EscherStream
void EndDocument();
/** 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 );
private:
SotStorageStreamRef mxCtlsStrm; /// The 'Ctls' stream.
/** 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:
/** 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 );
void DeleteCurrAppData();
private:
XclExpObjectManager& mrObjMgr;
std::stack< std::pair< XclObj*, XclEscherHostAppData* > > 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:
bool bStackedGroup;
public:
XclEscherHostAppData() : bStackedGroup( false )
{}
inline void SetStackedGroup( bool b ) { bStackedGroup = b; }
inline bool IsStackedGroup() const { return bStackedGroup; }
};
// --- class XclEscherClientData -------------------------------------
class XclEscherClientData : public EscherExClientRecord_Base
{
public:
XclEscherClientData() {}
virtual void WriteData( EscherEx& rEx ) const SAL_OVERRIDE;
};
// --- 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 SAL_OVERRIDE;
};
#endif // _XCL97ESC_HXX
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|