1 diff --git sc/source/filter/excel/xeescher.cxx sc/source/filter/excel/xeescher.cxx
2 index e3273e2..ced9e61 100644
3 --- sc/source/filter/excel/xeescher.cxx
4 +++ sc/source/filter/excel/xeescher.cxx
9 +#include "userdat.hxx"
10 +#include "drwlayer.hxx"
11 +#include "svx/unoapi.hxx"
13 #include <oox/core/tokens.hxx>
15 @@ -329,7 +332,7 @@ void XclExpOcxControlObj::WriteSubRecs( XclExpStream& rStrm )
17 XclExpTbxControlObj::XclExpTbxControlObj( const XclExpRoot& rRoot, Reference< XShape > xShape ) :
18 XclObj( rRoot, EXC_OBJTYPE_UNKNOWN, true ),
19 - XclExpControlHelper( rRoot ),
20 + XclMacroHelper( rRoot ),
24 @@ -576,6 +579,8 @@ XclExpTbxControlObj::XclExpTbxControlObj( const XclExpRoot& rRoot, Reference< XS
26 bool XclExpTbxControlObj::SetMacroLink( const ScriptEventDescriptor& rEvent )
28 + return XclMacroHelper::SetMacroLink( rEvent, meEventType );
30 String aMacroName = XclControlHelper::ExtractFromMacroDescriptor( rEvent, meEventType );
31 if( aMacroName.Len() )
33 @@ -585,6 +590,7 @@ bool XclExpTbxControlObj::SetMacroLink( const ScriptEventDescriptor& rEvent )
40 void XclExpTbxControlObj::WriteSubRecs( XclExpStream& rStrm )
41 @@ -723,12 +729,6 @@ void XclExpTbxControlObj::WriteSubRecs( XclExpStream& rStrm )
45 -void XclExpTbxControlObj::WriteMacroSubRec( XclExpStream& rStrm )
47 - if( mxMacroLink.is() )
48 - WriteFormulaSubRec( rStrm, EXC_ID_OBJMACRO, *mxMacroLink );
51 void XclExpTbxControlObj::WriteCellLinkSubRec( XclExpStream& rStrm, sal_uInt16 nSubRecId )
53 if( const XclTokenArray* pCellLink = GetCellLinkTokArr() )
54 @@ -757,6 +757,7 @@ void XclExpTbxControlObj::WriteSbs( XclExpStream& rStrm )
59 // ----------------------------------------------------------------------------
61 XclExpChartObj::XclExpChartObj( const XclExpRoot& rRoot, Reference< XShape > xShape ) :
62 @@ -947,6 +948,7 @@ void XclExpNote::Save( XclExpStream& rStrm )
67 void XclExpNote::WriteBody( XclExpStream& rStrm )
69 // BIFF5/BIFF7 is written separately
70 @@ -983,6 +985,70 @@ void XclExpNote::WriteXml( sal_Int32 nAuthorId, XclExpXmlStream& rStrm )
72 // ============================================================================
74 +XclMacroHelper::XclMacroHelper( const XclExpRoot& rRoot ) :
75 + XclExpControlHelper( rRoot )
79 +XclMacroHelper::~XclMacroHelper()
83 +void XclMacroHelper::WriteMacroSubRec( XclExpStream& rStrm )
85 + if( mxMacroLink.is() )
86 + WriteFormulaSubRec( rStrm, EXC_ID_OBJMACRO, *mxMacroLink );
90 +XclMacroHelper::SetMacroLink( const ScriptEventDescriptor& rEvent, const XclTbxEventType& nEventType )
92 + String aMacroName = XclControlHelper::ExtractFromMacroDescriptor( rEvent, nEventType );
93 + if( aMacroName.Len() )
95 + return SetMacroLink( aMacroName );
101 +XclMacroHelper::SetMacroLink( const String& rMacroName )
103 + OSL_TRACE("SetMacroLink( macroname:=%s )", rtl::OUStringToOString( rMacroName, RTL_TEXTENCODING_UTF8 ).getStr() );
104 + if( rMacroName.Len() )
106 + sal_uInt16 nExtSheet = GetLocalLinkManager().FindExtSheet( EXC_EXTSH_OWNDOC );
107 + sal_uInt16 nNameIdx = GetNameManager().InsertMacroCall( rMacroName, true, false );
108 + mxMacroLink = GetFormulaCompiler().CreateNameXFormula( nExtSheet, nNameIdx );
114 +XclExpShapeObj::XclExpShapeObj( const XclExpRoot& rRoot, ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > xShape ) :
115 + XclObjAny( rRoot ),
116 + XclMacroHelper( rRoot )
118 + if( SdrObject* pSdrObj = ::GetSdrObjectFromXShape( xShape ) )
120 + ScMacroInfo* pInfo = ScDrawLayer::GetMacroInfo( pSdrObj );
121 + if ( pInfo && pInfo->GetMacro().getLength() )
122 + SetMacroLink( XclControlHelper::GetXclMacroName( pInfo->GetMacro() ) );
126 +XclExpShapeObj::~XclExpShapeObj()
130 +void XclExpShapeObj::WriteSubRecs( XclExpStream& rStrm )
132 + XclObjAny::WriteSubRecs( rStrm );
133 + WriteMacroSubRec( rStrm );
136 +// ============================================================================
138 XclExpComments::XclExpComments( SCTAB nTab, XclExpRecordList< XclExpNote >& rNotes )
139 : mnTab( nTab ), mrNotes( rNotes )
141 diff --git sc/source/filter/inc/xcl97esc.hxx sc/source/filter/inc/xcl97esc.hxx
142 index 9ef6c91..efb9076 100644
143 --- sc/source/filter/inc/xcl97esc.hxx
144 +++ sc/source/filter/inc/xcl97esc.hxx
145 @@ -54,6 +54,14 @@ class XclExpOcxControlObj;
147 class XclExpTbxControlObj;
149 +class XclExpShapeObj;
151 +class ShapeInteractionHelper
154 + static XclExpShapeObj* CreateShapeObj(const XclExpRoot& rRoot, const ::com::sun::star::uno::Reference<
155 + ::com::sun::star::drawing::XShape >& xShape );
158 class XclEscherEx : public EscherEx, protected XclExpRoot
160 diff --git sc/source/filter/inc/xcl97rec.hxx sc/source/filter/inc/xcl97rec.hxx
161 index 7517cb9..c0bd309 100644
162 --- sc/source/filter/inc/xcl97rec.hxx
163 +++ sc/source/filter/inc/xcl97rec.hxx
164 @@ -285,7 +285,7 @@ public:
166 class XclObjAny : public XclObj
170 virtual void WriteSubRecs( XclExpStream& rStrm );
173 diff --git sc/source/filter/inc/xeescher.hxx sc/source/filter/inc/xeescher.hxx
174 index cbbad6e..8a9a143 100644
175 --- sc/source/filter/inc/xeescher.hxx
176 +++ sc/source/filter/inc/xeescher.hxx
177 @@ -88,6 +88,34 @@ private:
178 sal_uInt16 mnEntryCount; /// Number of entries in source range.
181 +class XclMacroHelper : public XclExpControlHelper
184 + XclTokenArrayRef mxMacroLink; /// Token array containing a link to an attached macro.
187 + explicit XclMacroHelper( const XclExpRoot& rRoot );
188 + virtual ~XclMacroHelper();
189 + /** Writes an ftMacro subrecord containing a macro link, or nothing, if no macro present. */
190 + void WriteMacroSubRec( XclExpStream& rStrm );
191 + /** Sets the name of a macro for object of passed type
192 + @return true = The passed event descriptor was valid, macro name has been found. */
193 + bool SetMacroLink( const ::com::sun::star::script::ScriptEventDescriptor& rEvent, const XclTbxEventType& nEventType );
195 + /** Sets the name of a macro
196 + @return true = The passed macro name has been found. */
197 + bool SetMacroLink( const String& rMacro );
200 +class XclExpShapeObj : public XclObjAny, public XclMacroHelper
203 + explicit XclExpShapeObj( const XclExpRoot& rRoot, ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > xShape );
204 + virtual ~XclExpShapeObj();
206 + virtual void WriteSubRecs( XclExpStream& rStrm );
209 // ----------------------------------------------------------------------------
212 @@ -114,7 +142,7 @@ private:
215 /** Represents an OBJ record for an TBX form control. */
216 -class XclExpTbxControlObj : public XclObj, public XclExpControlHelper
217 +class XclExpTbxControlObj : public XclObj, public XclMacroHelper
220 explicit XclExpTbxControlObj(
221 @@ -128,8 +156,6 @@ public:
223 virtual void WriteSubRecs( XclExpStream& rStrm );
225 - /** Writes an ftMacro subrecord containing a macro link, or nothing, if no macro present. */
226 - void WriteMacroSubRec( XclExpStream& rStrm );
227 /** Writes a subrecord containing a cell link, or nothing, if no link present. */
228 void WriteCellLinkSubRec( XclExpStream& rStrm, sal_uInt16 nSubRecId );
229 /** Writes the ftSbs sub structure containing scrollbar data. */
230 @@ -137,7 +163,6 @@ private:
233 ScfInt16Vec maMultiSel; /// Indexes of all selected entries in a multi selection.
234 - XclTokenArrayRef mxMacroLink; /// Token array containing a link to an attached macro.
235 XclTbxEventType meEventType; /// Type of supported macro event.
236 sal_Int32 mnHeight; /// Height of the control.
237 sal_uInt16 mnState; /// Checked/unchecked state.
238 diff --git sc/source/filter/xcl97/xcl97esc.cxx sc/source/filter/xcl97/xcl97esc.cxx
239 index 30a5041..3aa49c4 100644
240 --- sc/source/filter/xcl97/xcl97esc.cxx
241 +++ sc/source/filter/xcl97/xcl97esc.cxx
242 @@ -232,7 +232,7 @@ EscherExHostAppData* XclEscherEx::StartShape( const com::sun::star::uno::Referen
244 // #107540# ignore permanent note shapes
245 // #i12190# do not ignore callouts (do not filter by object type ID)
246 - pCurrXclObj = new XclObjAny( GetRoot() ); // just a metafile
247 + pCurrXclObj = ShapeInteractionHelper::CreateShapeObj( GetRoot(), rShape );
251 @@ -576,4 +576,8 @@ void XclEscherClientTextbox::WriteData( EscherEx& /*rEx*/ ) const
252 pXclObj->SetText( GetRoot(), rTextObj );
257 +ShapeInteractionHelper::CreateShapeObj(const XclExpRoot& rRoot, const Reference< XShape >& xShape )
259 + return new XclExpShapeObj( rRoot, xShape );