Branch data Line data Source code
1 : : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : : /*************************************************************************
3 : : *
4 : : * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 : : *
6 : : * Copyright 2000, 2010 Oracle and/or its affiliates.
7 : : *
8 : : * OpenOffice.org - a multi-platform office productivity suite
9 : : *
10 : : * This file is part of OpenOffice.org.
11 : : *
12 : : * OpenOffice.org is free software: you can redistribute it and/or modify
13 : : * it under the terms of the GNU Lesser General Public License version 3
14 : : * only, as published by the Free Software Foundation.
15 : : *
16 : : * OpenOffice.org is distributed in the hope that it will be useful,
17 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 : : * GNU Lesser General Public License version 3 for more details
20 : : * (a copy is included in the LICENSE file that accompanied this code).
21 : : *
22 : : * You should have received a copy of the GNU Lesser General Public License
23 : : * version 3 along with OpenOffice.org. If not, see
24 : : * <http://www.openoffice.org/license.html>
25 : : * for a copy of the LGPLv3 License.
26 : : *
27 : : ************************************************************************/
28 : :
29 : :
30 : : #include "xiescher.hxx"
31 : :
32 : : #include <com/sun/star/beans/NamedValue.hpp>
33 : : #include <com/sun/star/container/XIndexContainer.hpp>
34 : : #include <com/sun/star/container/XNameContainer.hpp>
35 : : #include <com/sun/star/embed/Aspects.hpp>
36 : : #include <com/sun/star/embed/XEmbeddedObject.hpp>
37 : : #include <com/sun/star/embed/XEmbedPersist.hpp>
38 : : #include <com/sun/star/awt/PushButtonType.hpp>
39 : : #include <com/sun/star/awt/ScrollBarOrientation.hpp>
40 : : #include <com/sun/star/awt/VisualEffect.hpp>
41 : : #include <com/sun/star/style/HorizontalAlignment.hpp>
42 : : #include <com/sun/star/style/VerticalAlignment.hpp>
43 : : #include <com/sun/star/drawing/XControlShape.hpp>
44 : : #include <com/sun/star/form/XForm.hpp>
45 : : #include <com/sun/star/form/XFormsSupplier.hpp>
46 : : #include <com/sun/star/form/binding/XBindableValue.hpp>
47 : : #include <com/sun/star/form/binding/XValueBinding.hpp>
48 : : #include <com/sun/star/form/binding/XListEntrySink.hpp>
49 : : #include <com/sun/star/form/binding/XListEntrySource.hpp>
50 : : #include <com/sun/star/script/ScriptEventDescriptor.hpp>
51 : : #include <com/sun/star/script/XEventAttacherManager.hpp>
52 : :
53 : : #include <rtl/logfile.hxx>
54 : : #include <sfx2/objsh.hxx>
55 : : #include <unotools/moduleoptions.hxx>
56 : : #include <unotools/fltrcfg.hxx>
57 : : #include <svtools/wmf.hxx>
58 : : #include <comphelper/types.hxx>
59 : : #include <comphelper/classids.hxx>
60 : : #include <toolkit/helper/vclunohelper.hxx>
61 : : #include <basegfx/point/b2dpoint.hxx>
62 : : #include <basegfx/polygon/b2dpolygon.hxx>
63 : :
64 : : #include <svx/svdopath.hxx>
65 : : #include <svx/svdocirc.hxx>
66 : : #include <svx/svdoedge.hxx>
67 : : #include <svx/svdogrp.hxx>
68 : : #include <svx/svdoashp.hxx>
69 : : #include <svx/svdograf.hxx>
70 : : #include <svx/svdoole2.hxx>
71 : : #include <svx/svdocapt.hxx>
72 : : #include <svx/svdouno.hxx>
73 : : #include <svx/svdpage.hxx>
74 : : #include <editeng/editobj.hxx>
75 : : #include <editeng/outliner.hxx>
76 : : #include <editeng/outlobj.hxx>
77 : : #include <svx/unoapi.hxx>
78 : : #include <svx/svditer.hxx>
79 : : #include <editeng/writingmodeitem.hxx>
80 : :
81 : : #include "scitems.hxx"
82 : : #include <editeng/eeitem.hxx>
83 : : #include <editeng/colritem.hxx>
84 : : #include <svx/xflclit.hxx>
85 : : #include <sal/macros.h>
86 : : #include <editeng/adjitem.hxx>
87 : : #include <svx/xlineit.hxx>
88 : : #include <svx/xlinjoit.hxx>
89 : : #include <svx/xlntrit.hxx>
90 : : #include <svx/xbtmpit.hxx>
91 : :
92 : : #include "document.hxx"
93 : : #include "drwlayer.hxx"
94 : : #include "userdat.hxx"
95 : : #include "chartarr.hxx"
96 : : #include "detfunc.hxx"
97 : : #include "unonames.hxx"
98 : : #include "convuno.hxx"
99 : : #include "postit.hxx"
100 : : #include "globstr.hrc"
101 : :
102 : : #include "fprogressbar.hxx"
103 : : #include "xltracer.hxx"
104 : : #include "xistream.hxx"
105 : : #include "xihelper.hxx"
106 : : #include "xiformula.hxx"
107 : : #include "xilink.hxx"
108 : : #include "xistyle.hxx"
109 : : #include "xipage.hxx"
110 : : #include "xichart.hxx"
111 : : #include "xicontent.hxx"
112 : : #include "scextopt.hxx"
113 : :
114 : : #include "namebuff.hxx"
115 : : #include <boost/shared_ptr.hpp>
116 : : #include <comphelper/componentcontext.hxx>
117 : : #include <comphelper/processfactory.hxx>
118 : : #include <comphelper/mediadescriptor.hxx>
119 : : #include <sfx2/docfile.hxx>
120 : :
121 : : using ::rtl::OUString;
122 : : using ::rtl::OUStringBuffer;
123 : : using ::com::sun::star::uno::Any;
124 : : using ::com::sun::star::uno::Exception;
125 : : using ::com::sun::star::uno::Reference;
126 : : using ::com::sun::star::uno::Sequence;
127 : : using ::com::sun::star::uno::UNO_QUERY;
128 : : using ::com::sun::star::uno::UNO_QUERY_THROW;
129 : : using ::com::sun::star::uno::UNO_SET_THROW;
130 : : using ::com::sun::star::uno::XComponentContext;
131 : : using ::com::sun::star::beans::NamedValue;
132 : : using ::com::sun::star::lang::XMultiServiceFactory;
133 : : using ::com::sun::star::container::XIndexContainer;
134 : : using ::com::sun::star::container::XNameContainer;
135 : : using ::com::sun::star::frame::XModel;
136 : : using ::com::sun::star::awt::XControlModel;
137 : : using ::com::sun::star::embed::XEmbeddedObject;
138 : : using ::com::sun::star::embed::XEmbedPersist;
139 : : using ::com::sun::star::drawing::XControlShape;
140 : : using ::com::sun::star::drawing::XShape;
141 : : using ::com::sun::star::form::XForm;
142 : : using ::com::sun::star::form::XFormComponent;
143 : : using ::com::sun::star::form::XFormsSupplier;
144 : : using ::com::sun::star::form::binding::XBindableValue;
145 : : using ::com::sun::star::form::binding::XValueBinding;
146 : : using ::com::sun::star::form::binding::XListEntrySink;
147 : : using ::com::sun::star::form::binding::XListEntrySource;
148 : : using ::com::sun::star::script::ScriptEventDescriptor;
149 : : using ::com::sun::star::script::XEventAttacherManager;
150 : : using ::com::sun::star::table::CellAddress;
151 : : using ::com::sun::star::table::CellRangeAddress;
152 : :
153 : : // ============================================================================
154 : :
155 : : namespace {
156 : :
157 : : /** Helper class which mimics the auto_ptr< SdrObject > semantics, but calls
158 : : SdrObject::Free instead of deleting the SdrObject directly. */
159 : : template< typename SdrObjType >
160 : : class TSdrObjectPtr
161 : : {
162 : : public:
163 : 626 : inline explicit TSdrObjectPtr( SdrObjType* pObj = 0 ) : mpObj( pObj ) {}
164 : 626 : inline ~TSdrObjectPtr() { free(); }
165 : :
166 : : inline const SdrObjType* operator->() const { return mpObj; }
167 : 84 : inline SdrObjType* operator->() { return mpObj; }
168 : :
169 : : inline const SdrObjType* get() const { return mpObj; }
170 : 71 : inline SdrObjType* get() { return mpObj; }
171 : :
172 : : inline const SdrObjType& operator*() const { return *mpObj; }
173 : 139 : inline SdrObjType& operator*() { return *mpObj; }
174 : :
175 : 481 : inline bool is() const { return mpObj != 0; }
176 : 28 : inline bool operator!() const { return mpObj == 0; }
177 : :
178 : 102 : inline void reset( SdrObjType* pObj = 0 ) { free(); mpObj = pObj; }
179 : 400 : inline SdrObjType* release() { SdrObjType* pObj = mpObj; mpObj = 0; return pObj; }
180 : :
181 : : private:
182 : : TSdrObjectPtr( const TSdrObjectPtr& ); // not implemented
183 : : TSdrObjectPtr& operator=( TSdrObjectPtr& rxObj ); // not implemented
184 : :
185 [ # # ][ # # ]: 728 : inline void free() { SdrObject* pObj = mpObj; mpObj = 0; SdrObject::Free( pObj ); }
[ + - ]
186 : :
187 : : private:
188 : : SdrObjType* mpObj;
189 : : };
190 : :
191 : : typedef TSdrObjectPtr< SdrObject > SdrObjectPtr;
192 : :
193 : : } // namespace
194 : :
195 : : // Drawing objects ============================================================
196 : :
197 : 101 : XclImpDrawObjBase::XclImpDrawObjBase( const XclImpRoot& rRoot ) :
198 : : XclImpRoot( rRoot ),
199 : : mnObjId( EXC_OBJ_INVALID_ID ),
200 : : mnObjType( EXC_OBJTYPE_UNKNOWN ),
201 : : mnDffShapeId( 0 ),
202 : : mnDffFlags( 0 ),
203 : : mbHasAnchor( false ),
204 : : mbHidden( false ),
205 : : mbVisible( true ),
206 : : mbPrintable( true ),
207 : : mbAreaObj( false ),
208 : : mbAutoMargin( true ),
209 : : mbSimpleMacro( true ),
210 : : mbProcessSdr( true ),
211 : : mbInsertSdr( true ),
212 [ + - ]: 101 : mbCustomDff( false )
213 : : {
214 : 101 : }
215 : :
216 : 101 : XclImpDrawObjBase::~XclImpDrawObjBase()
217 : : {
218 [ - + ]: 101 : }
219 : :
220 : 0 : XclImpDrawObjRef XclImpDrawObjBase::ReadObj3( const XclImpRoot& rRoot, XclImpStream& rStrm )
221 : : {
222 : 0 : XclImpDrawObjRef xDrawObj;
223 : :
224 [ # # ][ # # ]: 0 : if( rStrm.GetRecLeft() >= 30 )
225 : : {
226 : : sal_uInt16 nObjType;
227 [ # # ]: 0 : rStrm.Ignore( 4 );
228 [ # # ]: 0 : rStrm >> nObjType;
229 [ # # # # : 0 : switch( nObjType )
# # # # #
# ]
230 : : {
231 [ # # ][ # # ]: 0 : case EXC_OBJTYPE_GROUP: xDrawObj.reset( new XclImpGroupObj( rRoot ) ); break;
[ # # ]
232 [ # # ][ # # ]: 0 : case EXC_OBJTYPE_LINE: xDrawObj.reset( new XclImpLineObj( rRoot ) ); break;
[ # # ]
233 [ # # ][ # # ]: 0 : case EXC_OBJTYPE_RECTANGLE: xDrawObj.reset( new XclImpRectObj( rRoot ) ); break;
[ # # ]
234 [ # # ][ # # ]: 0 : case EXC_OBJTYPE_OVAL: xDrawObj.reset( new XclImpOvalObj( rRoot ) ); break;
[ # # ]
235 [ # # ][ # # ]: 0 : case EXC_OBJTYPE_ARC: xDrawObj.reset( new XclImpArcObj( rRoot ) ); break;
[ # # ]
236 [ # # ][ # # ]: 0 : case EXC_OBJTYPE_CHART: xDrawObj.reset( new XclImpChartObj( rRoot ) ); break;
[ # # ]
237 [ # # ][ # # ]: 0 : case EXC_OBJTYPE_TEXT: xDrawObj.reset( new XclImpTextObj( rRoot ) ); break;
[ # # ]
238 [ # # ][ # # ]: 0 : case EXC_OBJTYPE_BUTTON: xDrawObj.reset( new XclImpButtonObj( rRoot ) ); break;
[ # # ]
239 [ # # ][ # # ]: 0 : case EXC_OBJTYPE_PICTURE: xDrawObj.reset( new XclImpPictureObj( rRoot ) ); break;
[ # # ]
240 : : default:
241 : : OSL_TRACE( "XclImpDrawObjBase::ReadObj3 - unknown object type 0x%04hX", nObjType );
242 [ # # ][ # # ]: 0 : rRoot.GetTracer().TraceUnsupportedObjects();
243 [ # # ][ # # ]: 0 : xDrawObj.reset( new XclImpPhObj( rRoot ) );
[ # # ]
244 : : }
245 : : }
246 : :
247 : 0 : xDrawObj->mnTab = rRoot.GetCurrScTab();
248 [ # # ]: 0 : xDrawObj->ImplReadObj3( rStrm );
249 : 0 : return xDrawObj;
250 : : }
251 : :
252 : 0 : XclImpDrawObjRef XclImpDrawObjBase::ReadObj4( const XclImpRoot& rRoot, XclImpStream& rStrm )
253 : : {
254 : 0 : XclImpDrawObjRef xDrawObj;
255 : :
256 [ # # ][ # # ]: 0 : if( rStrm.GetRecLeft() >= 30 )
257 : : {
258 : : sal_uInt16 nObjType;
259 [ # # ]: 0 : rStrm.Ignore( 4 );
260 [ # # ]: 0 : rStrm >> nObjType;
261 [ # # # # : 0 : switch( nObjType )
# # # # #
# # ]
262 : : {
263 [ # # ][ # # ]: 0 : case EXC_OBJTYPE_GROUP: xDrawObj.reset( new XclImpGroupObj( rRoot ) ); break;
[ # # ]
264 [ # # ][ # # ]: 0 : case EXC_OBJTYPE_LINE: xDrawObj.reset( new XclImpLineObj( rRoot ) ); break;
[ # # ]
265 [ # # ][ # # ]: 0 : case EXC_OBJTYPE_RECTANGLE: xDrawObj.reset( new XclImpRectObj( rRoot ) ); break;
[ # # ]
266 [ # # ][ # # ]: 0 : case EXC_OBJTYPE_OVAL: xDrawObj.reset( new XclImpOvalObj( rRoot ) ); break;
[ # # ]
267 [ # # ][ # # ]: 0 : case EXC_OBJTYPE_ARC: xDrawObj.reset( new XclImpArcObj( rRoot ) ); break;
[ # # ]
268 [ # # ][ # # ]: 0 : case EXC_OBJTYPE_CHART: xDrawObj.reset( new XclImpChartObj( rRoot ) ); break;
[ # # ]
269 [ # # ][ # # ]: 0 : case EXC_OBJTYPE_TEXT: xDrawObj.reset( new XclImpTextObj( rRoot ) ); break;
[ # # ]
270 [ # # ][ # # ]: 0 : case EXC_OBJTYPE_BUTTON: xDrawObj.reset( new XclImpButtonObj( rRoot ) ); break;
[ # # ]
271 [ # # ][ # # ]: 0 : case EXC_OBJTYPE_PICTURE: xDrawObj.reset( new XclImpPictureObj( rRoot ) ); break;
[ # # ]
272 [ # # ][ # # ]: 0 : case EXC_OBJTYPE_POLYGON: xDrawObj.reset( new XclImpPolygonObj( rRoot ) ); break;
[ # # ]
273 : : default:
274 : : OSL_TRACE( "XclImpDrawObjBase::ReadObj4 - unknown object type 0x%04hX", nObjType );
275 [ # # ][ # # ]: 0 : rRoot.GetTracer().TraceUnsupportedObjects();
276 [ # # ][ # # ]: 0 : xDrawObj.reset( new XclImpPhObj( rRoot ) );
[ # # ]
277 : : }
278 : : }
279 : :
280 : 0 : xDrawObj->mnTab = rRoot.GetCurrScTab();
281 [ # # ]: 0 : xDrawObj->ImplReadObj4( rStrm );
282 : 0 : return xDrawObj;
283 : : }
284 : :
285 : 0 : XclImpDrawObjRef XclImpDrawObjBase::ReadObj5( const XclImpRoot& rRoot, XclImpStream& rStrm )
286 : : {
287 : 0 : XclImpDrawObjRef xDrawObj;
288 : :
289 [ # # ][ # # ]: 0 : if( rStrm.GetRecLeft() >= 34 )
290 : : {
291 : 0 : sal_uInt16 nObjType(EXC_OBJTYPE_UNKNOWN);
292 [ # # ]: 0 : rStrm.Ignore( 4 );
293 [ # # ]: 0 : rStrm >> nObjType;
294 [ # # # # : 0 : switch( nObjType )
# # # # #
# # # # #
# # # # #
# # ]
295 : : {
296 [ # # ][ # # ]: 0 : case EXC_OBJTYPE_GROUP: xDrawObj.reset( new XclImpGroupObj( rRoot ) ); break;
[ # # ]
297 [ # # ][ # # ]: 0 : case EXC_OBJTYPE_LINE: xDrawObj.reset( new XclImpLineObj( rRoot ) ); break;
[ # # ]
298 [ # # ][ # # ]: 0 : case EXC_OBJTYPE_RECTANGLE: xDrawObj.reset( new XclImpRectObj( rRoot ) ); break;
[ # # ]
299 [ # # ][ # # ]: 0 : case EXC_OBJTYPE_OVAL: xDrawObj.reset( new XclImpOvalObj( rRoot ) ); break;
[ # # ]
300 [ # # ][ # # ]: 0 : case EXC_OBJTYPE_ARC: xDrawObj.reset( new XclImpArcObj( rRoot ) ); break;
[ # # ]
301 [ # # ][ # # ]: 0 : case EXC_OBJTYPE_CHART: xDrawObj.reset( new XclImpChartObj( rRoot ) ); break;
[ # # ]
302 [ # # ][ # # ]: 0 : case EXC_OBJTYPE_TEXT: xDrawObj.reset( new XclImpTextObj( rRoot ) ); break;
[ # # ]
303 [ # # ][ # # ]: 0 : case EXC_OBJTYPE_BUTTON: xDrawObj.reset( new XclImpButtonObj( rRoot ) ); break;
[ # # ]
304 [ # # ][ # # ]: 0 : case EXC_OBJTYPE_PICTURE: xDrawObj.reset( new XclImpPictureObj( rRoot ) ); break;
[ # # ]
305 [ # # ][ # # ]: 0 : case EXC_OBJTYPE_POLYGON: xDrawObj.reset( new XclImpPolygonObj( rRoot ) ); break;
[ # # ]
306 [ # # ][ # # ]: 0 : case EXC_OBJTYPE_CHECKBOX: xDrawObj.reset( new XclImpCheckBoxObj( rRoot ) ); break;
[ # # ]
307 [ # # ][ # # ]: 0 : case EXC_OBJTYPE_OPTIONBUTTON: xDrawObj.reset( new XclImpOptionButtonObj( rRoot ) ); break;
[ # # ]
308 [ # # ][ # # ]: 0 : case EXC_OBJTYPE_EDIT: xDrawObj.reset( new XclImpEditObj( rRoot ) ); break;
[ # # ]
309 [ # # ][ # # ]: 0 : case EXC_OBJTYPE_LABEL: xDrawObj.reset( new XclImpLabelObj( rRoot ) ); break;
[ # # ]
310 [ # # ][ # # ]: 0 : case EXC_OBJTYPE_DIALOG: xDrawObj.reset( new XclImpDialogObj( rRoot ) ); break;
[ # # ]
311 [ # # ][ # # ]: 0 : case EXC_OBJTYPE_SPIN: xDrawObj.reset( new XclImpSpinButtonObj( rRoot ) ); break;
[ # # ]
312 [ # # ][ # # ]: 0 : case EXC_OBJTYPE_SCROLLBAR: xDrawObj.reset( new XclImpScrollBarObj( rRoot ) ); break;
[ # # ]
313 [ # # ][ # # ]: 0 : case EXC_OBJTYPE_LISTBOX: xDrawObj.reset( new XclImpListBoxObj( rRoot ) ); break;
[ # # ]
314 [ # # ][ # # ]: 0 : case EXC_OBJTYPE_GROUPBOX: xDrawObj.reset( new XclImpGroupBoxObj( rRoot ) ); break;
[ # # ]
315 [ # # ][ # # ]: 0 : case EXC_OBJTYPE_DROPDOWN: xDrawObj.reset( new XclImpDropDownObj( rRoot ) ); break;
[ # # ]
316 : : default:
317 : : OSL_TRACE( "XclImpDrawObjBase::ReadObj5 - unknown object type 0x%04hX", nObjType );
318 [ # # ][ # # ]: 0 : rRoot.GetTracer().TraceUnsupportedObjects();
319 [ # # ][ # # ]: 0 : xDrawObj.reset( new XclImpPhObj( rRoot ) );
[ # # ]
320 : : }
321 : : }
322 : :
323 : : OSL_ENSURE(xDrawObj, "object import failed");
324 : :
325 [ # # ]: 0 : if (xDrawObj)
326 : : {
327 : 0 : xDrawObj->mnTab = rRoot.GetCurrScTab();
328 [ # # ]: 0 : xDrawObj->ImplReadObj5( rStrm );
329 : : }
330 : 0 : return xDrawObj;
331 : : }
332 : :
333 : 101 : XclImpDrawObjRef XclImpDrawObjBase::ReadObj8( const XclImpRoot& rRoot, XclImpStream& rStrm )
334 : : {
335 : 101 : XclImpDrawObjRef xDrawObj;
336 : :
337 [ + - ][ + - ]: 101 : if( rStrm.GetRecLeft() >= 10 )
338 : : {
339 : 101 : sal_uInt16 nSubRecId(0), nSubRecSize(0), nObjType(0);
340 [ + - ][ + - ]: 101 : rStrm >> nSubRecId >> nSubRecSize >> nObjType;
[ + - ]
341 : : OSL_ENSURE( nSubRecId == EXC_ID_OBJCMO, "XclImpDrawObjBase::ReadObj8 - OBJCMO subrecord expected" );
342 [ + - ][ + - ]: 101 : if( (nSubRecId == EXC_ID_OBJCMO) && (nSubRecSize >= 6) )
343 : : {
344 [ - + - + : 101 : switch( nObjType )
- + - + -
- - - - -
+ + + - ]
345 : : {
346 : : // in BIFF8, all simple objects support text
347 : : case EXC_OBJTYPE_LINE:
348 : : case EXC_OBJTYPE_ARC:
349 [ # # ][ # # ]: 0 : xDrawObj.reset( new XclImpTextObj( rRoot ) );
[ # # ]
350 : : // lines and arcs may be 2-dimensional
351 : 0 : xDrawObj->SetAreaObj( false );
352 : 0 : break;
353 : :
354 : : // in BIFF8, all simple objects support text
355 : : case EXC_OBJTYPE_RECTANGLE:
356 : : case EXC_OBJTYPE_OVAL:
357 : : case EXC_OBJTYPE_POLYGON:
358 : : case EXC_OBJTYPE_DRAWING:
359 : : case EXC_OBJTYPE_TEXT:
360 [ + - ][ + - ]: 33 : xDrawObj.reset( new XclImpTextObj( rRoot ) );
[ + - ]
361 : 33 : break;
362 : :
363 [ # # ][ # # ]: 0 : case EXC_OBJTYPE_GROUP: xDrawObj.reset( new XclImpGroupObj( rRoot ) ); break;
[ # # ]
364 [ + - ][ + - ]: 6 : case EXC_OBJTYPE_CHART: xDrawObj.reset( new XclImpChartObj( rRoot ) ); break;
[ + - ]
365 [ # # ][ # # ]: 0 : case EXC_OBJTYPE_BUTTON: xDrawObj.reset( new XclImpButtonObj( rRoot ) ); break;
[ # # ]
366 [ + - ][ + - ]: 14 : case EXC_OBJTYPE_PICTURE: xDrawObj.reset( new XclImpPictureObj( rRoot ) ); break;
[ + - ]
367 [ # # ][ # # ]: 0 : case EXC_OBJTYPE_CHECKBOX: xDrawObj.reset( new XclImpCheckBoxObj( rRoot ) ); break;
[ # # ]
368 [ + - ][ + - ]: 12 : case EXC_OBJTYPE_OPTIONBUTTON: xDrawObj.reset( new XclImpOptionButtonObj( rRoot ) ); break;
[ + - ]
369 [ # # ][ # # ]: 0 : case EXC_OBJTYPE_EDIT: xDrawObj.reset( new XclImpEditObj( rRoot ) ); break;
[ # # ]
370 [ # # ][ # # ]: 0 : case EXC_OBJTYPE_LABEL: xDrawObj.reset( new XclImpLabelObj( rRoot ) ); break;
[ # # ]
371 [ # # ][ # # ]: 0 : case EXC_OBJTYPE_DIALOG: xDrawObj.reset( new XclImpDialogObj( rRoot ) ); break;
[ # # ]
372 [ # # ][ # # ]: 0 : case EXC_OBJTYPE_SPIN: xDrawObj.reset( new XclImpSpinButtonObj( rRoot ) ); break;
[ # # ]
373 [ # # ][ # # ]: 0 : case EXC_OBJTYPE_SCROLLBAR: xDrawObj.reset( new XclImpScrollBarObj( rRoot ) ); break;
[ # # ]
374 [ # # ][ # # ]: 0 : case EXC_OBJTYPE_LISTBOX: xDrawObj.reset( new XclImpListBoxObj( rRoot ) ); break;
[ # # ]
375 [ + - ][ + - ]: 3 : case EXC_OBJTYPE_GROUPBOX: xDrawObj.reset( new XclImpGroupBoxObj( rRoot ) ); break;
[ + - ]
376 [ + - ][ + - ]: 30 : case EXC_OBJTYPE_DROPDOWN: xDrawObj.reset( new XclImpDropDownObj( rRoot ) ); break;
[ + - ]
377 [ + - ][ + - ]: 3 : case EXC_OBJTYPE_NOTE: xDrawObj.reset( new XclImpNoteObj( rRoot ) ); break;
[ + - ]
378 : :
379 : : default:
380 : : OSL_TRACE( "XclImpDrawObjBase::ReadObj8 - unknown object type 0x%04hX", nObjType );
381 [ # # ][ # # ]: 101 : rRoot.GetTracer().TraceUnsupportedObjects();
382 : : }
383 : : }
384 : : }
385 : :
386 [ - + ]: 101 : if (!xDrawObj) //ensure placeholder for unknown or broken records
387 : : {
388 : : SAL_WARN( "sc", "XclImpDrawObjBase::ReadObj8 import failed, substituting placeholder");
389 [ # # ][ # # ]: 0 : xDrawObj.reset( new XclImpPhObj( rRoot ) );
[ # # ]
390 : : }
391 : :
392 : 101 : xDrawObj->mnTab = rRoot.GetCurrScTab();
393 [ + - ]: 101 : xDrawObj->ImplReadObj8( rStrm );
394 : 101 : return xDrawObj;
395 : : }
396 : :
397 : 101 : void XclImpDrawObjBase::SetAnchor( const XclObjAnchor& rAnchor )
398 : : {
399 : 101 : maAnchor = rAnchor;
400 : 101 : mbHasAnchor = true;
401 : 101 : }
402 : :
403 : 71 : void XclImpDrawObjBase::SetDffData(
404 : : const DffObjData& rDffObjData, const rtl::OUString& rObjName, const rtl::OUString& rHyperlink,
405 : : bool bVisible, bool bAutoMargin )
406 : : {
407 : 71 : mnDffShapeId = rDffObjData.nShapeId;
408 : 71 : mnDffFlags = rDffObjData.nSpFlags;
409 : 71 : maObjName = rObjName;
410 : 71 : maHyperlink = rHyperlink;
411 : 71 : mbVisible = bVisible;
412 : 71 : mbAutoMargin = bAutoMargin;
413 : 71 : }
414 : :
415 : 75 : OUString XclImpDrawObjBase::GetObjName() const
416 : : {
417 : : /* #i51348# Always return a non-empty name. Create English
418 : : default names depending on the object type. This is not implemented as
419 : : virtual functions in derived classes, as class type and object type may
420 : : not match. */
421 [ + + ]: 75 : return maObjName.isEmpty() ? GetObjectManager().GetDefaultObjName(*this) : maObjName;
422 : : }
423 : :
424 : 0 : const XclObjAnchor* XclImpDrawObjBase::GetAnchor() const
425 : : {
426 [ # # ]: 0 : return mbHasAnchor ? &maAnchor : 0;
427 : : }
428 : :
429 : 71 : bool XclImpDrawObjBase::IsValidSize( const Rectangle& rAnchorRect ) const
430 : : {
431 : : // XclObjAnchor rounds up the width, width of 3 is the result of an Excel width of 0
432 : : return mbAreaObj ?
433 : 142 : ((rAnchorRect.GetWidth() > 3) && (rAnchorRect.GetHeight() > 1)) :
434 [ + - + - : 213 : ((rAnchorRect.GetWidth() > 3) || (rAnchorRect.GetHeight() > 1));
+ - ][ # # ]
[ # # ]
435 : : }
436 : :
437 : 68 : ScRange XclImpDrawObjBase::GetUsedArea( SCTAB nScTab ) const
438 : : {
439 : 68 : ScRange aScUsedArea( ScAddress::INITIALIZE_INVALID );
440 : : // #i44077# object inserted -> update used area for OLE object import
441 [ + - ][ + - ]: 68 : if( mbHasAnchor && GetAddressConverter().ConvertRange( aScUsedArea, maAnchor, nScTab, nScTab, false ) )
[ + - ]
442 : : {
443 : : // reduce range, if object ends directly on borders between two columns or rows
444 [ + + ][ + - ]: 68 : if( (maAnchor.mnRX == 0) && (aScUsedArea.aStart.Col() < aScUsedArea.aEnd.Col()) )
[ + + ]
445 : 3 : aScUsedArea.aEnd.IncCol( -1 );
446 [ + + ][ + - ]: 68 : if( (maAnchor.mnBY == 0) && (aScUsedArea.aStart.Row() < aScUsedArea.aEnd.Row()) )
[ + + ]
447 : 6 : aScUsedArea.aEnd.IncRow( -1 );
448 : : }
449 : 68 : return aScUsedArea;
450 : : }
451 : :
452 : 137 : sal_Size XclImpDrawObjBase::GetProgressSize() const
453 : : {
454 : 137 : return DoGetProgressSize();
455 : : }
456 : :
457 : 71 : SdrObject* XclImpDrawObjBase::CreateSdrObject( XclImpDffConverter& rDffConv, const Rectangle& rAnchorRect, bool bIsDff ) const
458 : : {
459 : 71 : SdrObjectPtr xSdrObj;
460 [ + + ][ + - ]: 71 : if( bIsDff && !mbCustomDff )
461 : : {
462 [ + - ][ + - ]: 36 : rDffConv.Progress( GetProgressSize() );
463 : : }
464 : : else
465 : : {
466 [ + - ][ + - ]: 35 : xSdrObj.reset( DoCreateSdrObj( rDffConv, rAnchorRect ) );
467 [ + + ]: 35 : if( xSdrObj.is() )
468 [ + - ]: 32 : xSdrObj->SetModel( rDffConv.GetModel() );
469 : : }
470 [ + - ]: 71 : return xSdrObj.release();
471 : : }
472 : :
473 : 71 : void XclImpDrawObjBase::PreProcessSdrObject( XclImpDffConverter& rDffConv, SdrObject& rSdrObj ) const
474 : : {
475 : : // default: front layer, derived classes may have to set other layer in DoPreProcessSdrObj()
476 : 71 : rSdrObj.NbcSetLayer( SC_LAYER_FRONT );
477 : :
478 : : // set object name (GetObjName() will always return a non-empty name)
479 [ + - ]: 71 : rSdrObj.SetName( GetObjName() );
480 : :
481 : : // #i39167# full width for all objects regardless of horizontal alignment
482 [ + - ]: 71 : rSdrObj.SetMergedItem( SdrTextHorzAdjustItem( SDRTEXTHORZADJUST_BLOCK ) );
483 : :
484 : : // automatic text margin
485 [ + + ]: 71 : if( mbAutoMargin )
486 : : {
487 : 68 : sal_Int32 nMargin = rDffConv.GetDefaultTextMargin();
488 [ + - ]: 68 : rSdrObj.SetMergedItem( SdrTextLeftDistItem( nMargin ) );
489 [ + - ]: 68 : rSdrObj.SetMergedItem( SdrTextRightDistItem( nMargin ) );
490 [ + - ]: 68 : rSdrObj.SetMergedItem( SdrTextUpperDistItem( nMargin ) );
491 [ + - ]: 68 : rSdrObj.SetMergedItem( SdrTextLowerDistItem( nMargin ) );
492 : : }
493 : :
494 : : // macro and hyperlink
495 : : // removed oracle/sun check for mbSimpleMacro ( no idea what its for )
496 [ + - ][ - + ]: 71 : if (!maMacroName.isEmpty() || !maHyperlink.isEmpty())
[ - + ]
497 : : {
498 [ # # ]: 0 : if( ScMacroInfo* pInfo = ScDrawLayer::GetMacroInfo( &rSdrObj, sal_True ) )
499 : : {
500 : 0 : pInfo->SetMacro( XclTools::GetSbMacroUrl( maMacroName, GetDocShell() ) );
501 : 0 : pInfo->SetHlink( maHyperlink );
502 : : }
503 : : }
504 : :
505 : : // call virtual function for object type specific processing
506 : 71 : DoPreProcessSdrObj( rDffConv, rSdrObj );
507 : 71 : }
508 : :
509 : 68 : void XclImpDrawObjBase::PostProcessSdrObject( XclImpDffConverter& rDffConv, SdrObject& rSdrObj ) const
510 : : {
511 : : // call virtual function for object type specific processing
512 : 68 : DoPostProcessSdrObj( rDffConv, rSdrObj );
513 : 68 : }
514 : :
515 : : // protected ------------------------------------------------------------------
516 : :
517 : 0 : void XclImpDrawObjBase::ReadName5( XclImpStream& rStrm, sal_uInt16 nNameLen )
518 : : {
519 : 0 : maObjName = rtl::OUString();
520 [ # # ]: 0 : if( nNameLen > 0 )
521 : : {
522 : : // name length field is repeated before the name
523 [ # # ]: 0 : maObjName = rStrm.ReadByteString( false );
524 : : // skip padding byte for word boundaries
525 [ # # ]: 0 : if( rStrm.GetRecPos() & 1 ) rStrm.Ignore( 1 );
526 : : }
527 : 0 : }
528 : :
529 : 0 : void XclImpDrawObjBase::ReadMacro3( XclImpStream& rStrm, sal_uInt16 nMacroSize )
530 : : {
531 : 0 : maMacroName = rtl::OUString();
532 : 0 : rStrm.Ignore( nMacroSize );
533 : : // skip padding byte for word boundaries, not contained in nMacroSize
534 [ # # ]: 0 : if( rStrm.GetRecPos() & 1 ) rStrm.Ignore( 1 );
535 : 0 : }
536 : :
537 : 0 : void XclImpDrawObjBase::ReadMacro4( XclImpStream& rStrm, sal_uInt16 nMacroSize )
538 : : {
539 : 0 : maMacroName = rtl::OUString();
540 : 0 : rStrm.Ignore( nMacroSize );
541 : 0 : }
542 : :
543 : 0 : void XclImpDrawObjBase::ReadMacro5( XclImpStream& rStrm, sal_uInt16 nMacroSize )
544 : : {
545 : 0 : maMacroName = rtl::OUString();
546 : 0 : rStrm.Ignore( nMacroSize );
547 : 0 : }
548 : :
549 : 0 : void XclImpDrawObjBase::ReadMacro8( XclImpStream& rStrm )
550 : : {
551 : 0 : maMacroName = rtl::OUString();
552 [ # # ]: 0 : if( rStrm.GetRecLeft() > 6 )
553 : : {
554 : : // macro is stored in a tNameXR token containing a link to a defined name
555 : : sal_uInt16 nFmlaSize;
556 [ # # ]: 0 : rStrm >> nFmlaSize;
557 [ # # ]: 0 : rStrm.Ignore( 4 );
558 : : OSL_ENSURE( nFmlaSize == 7, "XclImpDrawObjBase::ReadMacro - unexpected formula size" );
559 [ # # ]: 0 : if( nFmlaSize == 7 )
560 : : {
561 : : sal_uInt8 nTokenId;
562 : : sal_uInt16 nExtSheet, nExtName;
563 [ # # ][ # # ]: 0 : rStrm >> nTokenId >> nExtSheet >> nExtName;
[ # # ]
564 : : OSL_ENSURE( nTokenId == XclTokenArrayHelper::GetTokenId( EXC_TOKID_NAMEX, EXC_TOKCLASS_REF ),
565 : : "XclImpDrawObjBase::ReadMacro - tNameXR token expected" );
566 [ # # ]: 0 : if( nTokenId == XclTokenArrayHelper::GetTokenId( EXC_TOKID_NAMEX, EXC_TOKCLASS_REF ) )
567 [ # # ][ # # ]: 0 : maMacroName = GetLinkManager().GetMacroName( nExtSheet, nExtName );
[ # # ]
568 : : }
569 : : }
570 : 0 : }
571 : :
572 : 0 : void XclImpDrawObjBase::ConvertLineStyle( SdrObject& rSdrObj, const XclObjLineData& rLineData ) const
573 : : {
574 [ # # ]: 0 : if( rLineData.IsAuto() )
575 : : {
576 [ # # ]: 0 : XclObjLineData aAutoData;
577 : 0 : aAutoData.mnAuto = 0;
578 [ # # ]: 0 : ConvertLineStyle( rSdrObj, aAutoData );
579 : : }
580 : : else
581 : : {
582 : 0 : long nLineWidth = 35 * ::std::min( rLineData.mnWidth, EXC_OBJ_LINE_THICK );
583 [ # # ]: 0 : rSdrObj.SetMergedItem( XLineWidthItem( nLineWidth ) );
584 [ # # ][ # # ]: 0 : rSdrObj.SetMergedItem( XLineColorItem( EMPTY_STRING, GetPalette().GetColor( rLineData.mnColorIdx ) ) );
[ # # ][ # # ]
585 [ # # ]: 0 : rSdrObj.SetMergedItem( XLineJointItem( XLINEJOINT_MITER ) );
586 : :
587 [ # # ]: 0 : sal_uLong nDotLen = ::std::max< sal_uLong >( 70 * rLineData.mnWidth, 35 );
588 : 0 : sal_uLong nDashLen = 3 * nDotLen;
589 : 0 : sal_uLong nDist = 2 * nDotLen;
590 : :
591 [ # # # # : 0 : switch( rLineData.mnStyle )
# # # #
# ]
592 : : {
593 : : default:
594 : : case EXC_OBJ_LINE_SOLID:
595 [ # # ]: 0 : rSdrObj.SetMergedItem( XLineStyleItem( XLINE_SOLID ) );
596 : 0 : break;
597 : : case EXC_OBJ_LINE_DASH:
598 [ # # ]: 0 : rSdrObj.SetMergedItem( XLineStyleItem( XLINE_DASH ) );
599 [ # # ][ # # ]: 0 : rSdrObj.SetMergedItem( XLineDashItem( EMPTY_STRING, XDash( XDASH_RECT, 0, nDotLen, 1, nDashLen, nDist ) ) );
[ # # ][ # # ]
600 : 0 : break;
601 : : case EXC_OBJ_LINE_DOT:
602 [ # # ]: 0 : rSdrObj.SetMergedItem( XLineStyleItem( XLINE_DASH ) );
603 [ # # ][ # # ]: 0 : rSdrObj.SetMergedItem( XLineDashItem( EMPTY_STRING, XDash( XDASH_RECT, 1, nDotLen, 0, nDashLen, nDist ) ) );
[ # # ][ # # ]
604 : 0 : break;
605 : : case EXC_OBJ_LINE_DASHDOT:
606 [ # # ]: 0 : rSdrObj.SetMergedItem( XLineStyleItem( XLINE_DASH ) );
607 [ # # ][ # # ]: 0 : rSdrObj.SetMergedItem( XLineDashItem( EMPTY_STRING, XDash( XDASH_RECT, 1, nDotLen, 1, nDashLen, nDist ) ) );
[ # # ][ # # ]
608 : 0 : break;
609 : : case EXC_OBJ_LINE_DASHDOTDOT:
610 [ # # ]: 0 : rSdrObj.SetMergedItem( XLineStyleItem( XLINE_DASH ) );
611 [ # # ][ # # ]: 0 : rSdrObj.SetMergedItem( XLineDashItem( EMPTY_STRING, XDash( XDASH_RECT, 2, nDotLen, 1, nDashLen, nDist ) ) );
[ # # ][ # # ]
612 : 0 : break;
613 : : case EXC_OBJ_LINE_MEDTRANS:
614 [ # # ]: 0 : rSdrObj.SetMergedItem( XLineStyleItem( XLINE_SOLID ) );
615 [ # # ]: 0 : rSdrObj.SetMergedItem( XLineTransparenceItem( 50 ) );
616 : 0 : break;
617 : : case EXC_OBJ_LINE_DARKTRANS:
618 [ # # ]: 0 : rSdrObj.SetMergedItem( XLineStyleItem( XLINE_SOLID ) );
619 [ # # ]: 0 : rSdrObj.SetMergedItem( XLineTransparenceItem( 25 ) );
620 : 0 : break;
621 : : case EXC_OBJ_LINE_LIGHTTRANS:
622 [ # # ]: 0 : rSdrObj.SetMergedItem( XLineStyleItem( XLINE_SOLID ) );
623 [ # # ]: 0 : rSdrObj.SetMergedItem( XLineTransparenceItem( 75 ) );
624 : 0 : break;
625 : : case EXC_OBJ_LINE_NONE:
626 [ # # ]: 0 : rSdrObj.SetMergedItem( XLineStyleItem( XLINE_NONE ) );
627 : 0 : break;
628 : : }
629 : : }
630 : 0 : }
631 : :
632 : 0 : void XclImpDrawObjBase::ConvertFillStyle( SdrObject& rSdrObj, const XclObjFillData& rFillData ) const
633 : : {
634 [ # # ]: 0 : if( rFillData.IsAuto() )
635 : : {
636 [ # # ]: 0 : XclObjFillData aAutoData;
637 : 0 : aAutoData.mnAuto = 0;
638 [ # # ]: 0 : ConvertFillStyle( rSdrObj, aAutoData );
639 : : }
640 [ # # ]: 0 : else if( rFillData.mnPattern == EXC_PATT_NONE )
641 : : {
642 [ # # ]: 0 : rSdrObj.SetMergedItem( XFillStyleItem( XFILL_NONE ) );
643 : : }
644 : : else
645 : : {
646 [ # # ][ # # ]: 0 : Color aPattColor = GetPalette().GetColor( rFillData.mnPattColorIdx );
647 [ # # ][ # # ]: 0 : Color aBackColor = GetPalette().GetColor( rFillData.mnBackColorIdx );
648 [ # # ][ # # ]: 0 : if( (rFillData.mnPattern == EXC_PATT_SOLID) || (aPattColor == aBackColor) )
[ # # ]
649 : : {
650 [ # # ][ # # ]: 0 : rSdrObj.SetMergedItem( XFillStyleItem( XFILL_SOLID ) );
[ # # ]
651 [ # # ][ # # ]: 0 : rSdrObj.SetMergedItem( XFillColorItem( EMPTY_STRING, aPattColor ) );
[ # # ][ # # ]
652 : : }
653 : : else
654 : : {
655 : : static const sal_uInt8 sppnPatterns[][ 8 ] =
656 : : {
657 : : { 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55 },
658 : : { 0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD },
659 : : { 0x88, 0x22, 0x88, 0x22, 0x88, 0x22, 0x88, 0x22 },
660 : : { 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00 },
661 : : { 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC },
662 : : { 0x33, 0x66, 0xCC, 0x99, 0x33, 0x66, 0xCC, 0x99 },
663 : : { 0xCC, 0x66, 0x33, 0x99, 0xCC, 0x66, 0x33, 0x99 },
664 : : { 0xCC, 0xCC, 0x33, 0x33, 0xCC, 0xCC, 0x33, 0x33 },
665 : : { 0xCC, 0xFF, 0x33, 0xFF, 0xCC, 0xFF, 0x33, 0xFF },
666 : : { 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00 },
667 : : { 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 },
668 : : { 0x11, 0x22, 0x44, 0x88, 0x11, 0x22, 0x44, 0x88 },
669 : : { 0x88, 0x44, 0x22, 0x11, 0x88, 0x44, 0x22, 0x11 },
670 : : { 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11 },
671 : : { 0xAA, 0x44, 0xAA, 0x11, 0xAA, 0x44, 0xAA, 0x11 },
672 : : { 0x88, 0x00, 0x22, 0x00, 0x88, 0x00, 0x22, 0x00 },
673 : : { 0x80, 0x00, 0x08, 0x00, 0x80, 0x00, 0x08, 0x00 }
674 : : };
675 [ # # ]: 0 : const sal_uInt8* const pnPattern = sppnPatterns[ ::std::min< size_t >( rFillData.mnPattern - 2, SAL_N_ELEMENTS( sppnPatterns ) ) ];
676 : : // create 2-colored 8x8 DIB
677 [ # # ]: 0 : SvMemoryStream aMemStrm;
678 [ # # ][ # # ]: 0 : aMemStrm << sal_uInt32( 12 ) << sal_Int16( 8 ) << sal_Int16( 8 ) << sal_uInt16( 1 ) << sal_uInt16( 1 );
[ # # ][ # # ]
[ # # ]
679 [ # # ][ # # ]: 0 : aMemStrm << sal_uInt8( 0xFF ) << sal_uInt8( 0xFF ) << sal_uInt8( 0xFF );
[ # # ]
680 [ # # ][ # # ]: 0 : aMemStrm << sal_uInt8( 0x00 ) << sal_uInt8( 0x00 ) << sal_uInt8( 0x00 );
[ # # ]
681 [ # # ]: 0 : for( size_t nIdx = 0; nIdx < 8; ++nIdx )
682 [ # # ]: 0 : aMemStrm << sal_uInt32( pnPattern[ nIdx ] ); // 32-bit little-endian
683 [ # # ]: 0 : aMemStrm.Seek( STREAM_SEEK_TO_BEGIN );
684 [ # # ]: 0 : Bitmap aBitmap;
685 [ # # ]: 0 : aBitmap.Read( aMemStrm, false );
686 [ # # ]: 0 : XOBitmap aXOBitmap( aBitmap );
687 [ # # ]: 0 : aXOBitmap.Bitmap2Array();
688 : 0 : aXOBitmap.SetBitmapType( XBITMAP_8X8 );
689 [ # # ]: 0 : if( aXOBitmap.GetBackgroundColor().GetColor() == COL_BLACK )
690 : 0 : ::std::swap( aPattColor, aBackColor );
691 : 0 : aXOBitmap.SetPixelColor( aPattColor );
692 : 0 : aXOBitmap.SetBackgroundColor( aBackColor );
693 [ # # ][ # # ]: 0 : rSdrObj.SetMergedItem( XFillStyleItem( XFILL_BITMAP ) );
[ # # ]
694 [ # # ][ # # ]: 0 : rSdrObj.SetMergedItem( XFillBitmapItem( EMPTY_STRING, aXOBitmap ) );
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ]
695 : : }
696 : : }
697 : 0 : }
698 : :
699 : 0 : void XclImpDrawObjBase::ConvertFrameStyle( SdrObject& rSdrObj, sal_uInt16 nFrameFlags ) const
700 : : {
701 [ # # ]: 0 : if( ::get_flag( nFrameFlags, EXC_OBJ_FRAME_SHADOW ) )
702 : : {
703 [ # # ]: 0 : rSdrObj.SetMergedItem( SdrShadowItem( sal_True ) );
704 [ # # ]: 0 : rSdrObj.SetMergedItem( SdrShadowXDistItem( 35 ) );
705 [ # # ]: 0 : rSdrObj.SetMergedItem( SdrShadowYDistItem( 35 ) );
706 [ # # ][ # # ]: 0 : rSdrObj.SetMergedItem( SdrShadowColorItem( EMPTY_STRING, GetPalette().GetColor( EXC_COLOR_WINDOWTEXT ) ) );
[ # # ][ # # ]
707 : : }
708 : 0 : }
709 : :
710 : 0 : Color XclImpDrawObjBase::GetSolidLineColor( const XclObjLineData& rLineData ) const
711 : : {
712 : 0 : Color aColor( COL_TRANSPARENT );
713 [ # # ]: 0 : if( rLineData.IsAuto() )
714 : : {
715 [ # # ]: 0 : XclObjLineData aAutoData;
716 : 0 : aAutoData.mnAuto = 0;
717 [ # # ]: 0 : aColor = GetSolidLineColor( aAutoData );
718 : : }
719 [ # # ]: 0 : else if( rLineData.mnStyle != EXC_OBJ_LINE_NONE )
720 : : {
721 : 0 : aColor = GetPalette().GetColor( rLineData.mnColorIdx );
722 : : }
723 : 0 : return aColor;
724 : : }
725 : :
726 : 0 : Color XclImpDrawObjBase::GetSolidFillColor( const XclObjFillData& rFillData ) const
727 : : {
728 : 0 : Color aColor( COL_TRANSPARENT );
729 [ # # ]: 0 : if( rFillData.IsAuto() )
730 : : {
731 [ # # ]: 0 : XclObjFillData aAutoData;
732 : 0 : aAutoData.mnAuto = 0;
733 [ # # ]: 0 : aColor = GetSolidFillColor( aAutoData );
734 : : }
735 [ # # ]: 0 : else if( rFillData.mnPattern != EXC_PATT_NONE )
736 : : {
737 [ # # ][ # # ]: 0 : Color aPattColor = GetPalette().GetColor( rFillData.mnPattColorIdx );
738 [ # # ][ # # ]: 0 : Color aBackColor = GetPalette().GetColor( rFillData.mnBackColorIdx );
739 [ # # ]: 0 : aColor = XclTools::GetPatternColor( aPattColor, aBackColor, rFillData.mnPattern );
740 : : }
741 : 0 : return aColor;
742 : : }
743 : :
744 : 0 : void XclImpDrawObjBase::DoReadObj3( XclImpStream&, sal_uInt16 )
745 : : {
746 : 0 : }
747 : :
748 : 0 : void XclImpDrawObjBase::DoReadObj4( XclImpStream&, sal_uInt16 )
749 : : {
750 : 0 : }
751 : :
752 : 0 : void XclImpDrawObjBase::DoReadObj5( XclImpStream&, sal_uInt16, sal_uInt16 )
753 : : {
754 : 0 : }
755 : :
756 : 133 : void XclImpDrawObjBase::DoReadObj8SubRec( XclImpStream&, sal_uInt16, sal_uInt16 )
757 : : {
758 : 133 : }
759 : :
760 : 131 : sal_Size XclImpDrawObjBase::DoGetProgressSize() const
761 : : {
762 : 131 : return 1;
763 : : }
764 : :
765 : 0 : SdrObject* XclImpDrawObjBase::DoCreateSdrObj( XclImpDffConverter& rDffConv, const Rectangle& ) const
766 : : {
767 : 0 : rDffConv.Progress( GetProgressSize() );
768 : 0 : return 0;
769 : : }
770 : :
771 : 42 : void XclImpDrawObjBase::DoPreProcessSdrObj( XclImpDffConverter&, SdrObject& ) const
772 : : {
773 : : // trace if object is not printable
774 [ + + ]: 42 : if( !IsPrintable() )
775 : 3 : GetTracer().TraceObjectNotPrintable();
776 : 42 : }
777 : :
778 : 62 : void XclImpDrawObjBase::DoPostProcessSdrObj( XclImpDffConverter&, SdrObject& ) const
779 : : {
780 : 62 : }
781 : :
782 : 0 : void XclImpDrawObjBase::ImplReadObj3( XclImpStream& rStrm )
783 : : {
784 : : // back to offset 4 (ignore object count field)
785 [ # # ]: 0 : rStrm.Seek( 4 );
786 : :
787 : : sal_uInt16 nObjFlags, nMacroSize;
788 [ # # ][ # # ]: 0 : rStrm >> mnObjType >> mnObjId >> nObjFlags >> maAnchor >> nMacroSize;
[ # # ][ # # ]
[ # # ]
789 [ # # ]: 0 : rStrm.Ignore( 2 );
790 : :
791 : 0 : mbHasAnchor = true;
792 : 0 : mbHidden = ::get_flag( nObjFlags, EXC_OBJ_HIDDEN );
793 : 0 : mbVisible = ::get_flag( nObjFlags, EXC_OBJ_VISIBLE );
794 [ # # ]: 0 : DoReadObj3( rStrm, nMacroSize );
795 : 0 : }
796 : :
797 : 0 : void XclImpDrawObjBase::ImplReadObj4( XclImpStream& rStrm )
798 : : {
799 : : // back to offset 4 (ignore object count field)
800 [ # # ]: 0 : rStrm.Seek( 4 );
801 : :
802 : : sal_uInt16 nObjFlags, nMacroSize;
803 [ # # ][ # # ]: 0 : rStrm >> mnObjType >> mnObjId >> nObjFlags >> maAnchor >> nMacroSize;
[ # # ][ # # ]
[ # # ]
804 [ # # ]: 0 : rStrm.Ignore( 2 );
805 : :
806 : 0 : mbHasAnchor = true;
807 : 0 : mbHidden = ::get_flag( nObjFlags, EXC_OBJ_HIDDEN );
808 : 0 : mbVisible = ::get_flag( nObjFlags, EXC_OBJ_VISIBLE );
809 : 0 : mbPrintable = ::get_flag( nObjFlags, EXC_OBJ_PRINTABLE );
810 [ # # ]: 0 : DoReadObj4( rStrm, nMacroSize );
811 : 0 : }
812 : :
813 : 0 : void XclImpDrawObjBase::ImplReadObj5( XclImpStream& rStrm )
814 : : {
815 : : // back to offset 4 (ignore object count field)
816 [ # # ]: 0 : rStrm.Seek( 4 );
817 : :
818 : : sal_uInt16 nObjFlags, nMacroSize, nNameLen;
819 [ # # ][ # # ]: 0 : rStrm >> mnObjType >> mnObjId >> nObjFlags >> maAnchor >> nMacroSize;
[ # # ][ # # ]
[ # # ]
820 [ # # ]: 0 : rStrm.Ignore( 2 );
821 [ # # ]: 0 : rStrm >> nNameLen;
822 [ # # ]: 0 : rStrm.Ignore( 2 );
823 : :
824 : 0 : mbHasAnchor = true;
825 : 0 : mbHidden = ::get_flag( nObjFlags, EXC_OBJ_HIDDEN );
826 : 0 : mbVisible = ::get_flag( nObjFlags, EXC_OBJ_VISIBLE );
827 : 0 : mbPrintable = ::get_flag( nObjFlags, EXC_OBJ_PRINTABLE );
828 [ # # ]: 0 : DoReadObj5( rStrm, nNameLen, nMacroSize );
829 : 0 : }
830 : :
831 : 101 : void XclImpDrawObjBase::ImplReadObj8( XclImpStream& rStrm )
832 : : {
833 : : // back to beginning
834 : 101 : rStrm.Seek( EXC_REC_SEEK_TO_BEGIN );
835 : :
836 : 101 : bool bLoop = true;
837 [ + + ][ + + ]: 438 : while( bLoop && (rStrm.GetRecLeft() >= 4) )
[ + + ]
838 : : {
839 : : sal_uInt16 nSubRecId, nSubRecSize;
840 [ + - ][ + - ]: 337 : rStrm >> nSubRecId >> nSubRecSize;
841 [ + - ]: 337 : rStrm.PushPosition();
842 : : // sometimes the last subrecord has an invalid length (OBJLBSDATA) -> min()
843 [ + - ][ + - ]: 337 : nSubRecSize = static_cast< sal_uInt16 >( ::std::min< sal_Size >( nSubRecSize, rStrm.GetRecLeft() ) );
844 : :
845 [ + - + + ]: 337 : switch( nSubRecId )
846 : : {
847 : : case EXC_ID_OBJCMO:
848 : : OSL_ENSURE( rStrm.GetRecPos() == 4, "XclImpDrawObjBase::ImplReadObj8 - unexpected OBJCMO subrecord" );
849 [ + - ][ + - ]: 101 : if( (rStrm.GetRecPos() == 4) && (nSubRecSize >= 6) )
[ + - ][ + - ]
850 : : {
851 : : sal_uInt16 nObjFlags;
852 [ + - ][ + - ]: 101 : rStrm >> mnObjType >> mnObjId >> nObjFlags;
[ + - ]
853 : 101 : mbPrintable = ::get_flag( nObjFlags, EXC_OBJCMO_PRINTABLE );
854 : : }
855 : 101 : break;
856 : : case EXC_ID_OBJMACRO:
857 [ # # ]: 0 : ReadMacro8( rStrm );
858 : 0 : break;
859 : : case EXC_ID_OBJEND:
860 : 83 : bLoop = false;
861 : 83 : break;
862 : : default:
863 [ + - ]: 153 : DoReadObj8SubRec( rStrm, nSubRecId, nSubRecSize );
864 : : }
865 : :
866 [ + - ]: 337 : rStrm.PopPosition();
867 [ + - ]: 337 : rStrm.Ignore( nSubRecSize );
868 : : }
869 : :
870 : : /* Call DoReadObj8SubRec() with EXC_ID_OBJEND for further stream
871 : : processing (e.g. charts), even if the OBJEND subrecord is missing. */
872 : 101 : DoReadObj8SubRec( rStrm, EXC_ID_OBJEND, 0 );
873 : :
874 : : /* Pictures that Excel reads from BIFF5 and writes to BIFF8 still have the
875 : : IMGDATA record following the OBJ record (but they use the image data
876 : : stored in DFF). The IMGDATA record may be continued by several CONTINUE
877 : : records. But the last CONTINUE record may be in fact an MSODRAWING
878 : : record that contains the DFF data of the next drawing object! So we
879 : : have to skip just enough CONTINUE records to look at the next
880 : : MSODRAWING/CONTINUE record. */
881 [ # # ][ - + ]: 101 : if( (rStrm.GetNextRecId() == EXC_ID3_IMGDATA) && rStrm.StartNextRecord() )
[ - + ]
882 : : {
883 : : sal_uInt32 nDataSize;
884 [ # # ]: 0 : rStrm.Ignore( 4 );
885 [ # # ]: 0 : rStrm >> nDataSize;
886 [ # # ]: 0 : nDataSize -= rStrm.GetRecLeft();
887 : : // skip following CONTINUE records until IMGDATA ends
888 [ # # ][ # # ]: 0 : while( (nDataSize > 0) && (rStrm.GetNextRecId() == EXC_ID_CONT) && rStrm.StartNextRecord() )
[ # # ][ # # ]
[ # # ][ # # ]
889 : : {
890 : : OSL_ENSURE( nDataSize >= rStrm.GetRecLeft(), "XclImpDrawObjBase::ImplReadObj8 - CONTINUE too long" );
891 [ # # ][ # # ]: 0 : nDataSize -= ::std::min< sal_uInt32 >( rStrm.GetRecLeft(), nDataSize );
892 : : }
893 : : OSL_ENSURE( nDataSize == 0, "XclImpDrawObjBase::ImplReadObj8 - missing CONTINUE records" );
894 : : // next record may be MSODRAWING or CONTINUE or anything else
895 : : }
896 : 101 : }
897 : :
898 : : // ----------------------------------------------------------------------------
899 : :
900 : 0 : void XclImpDrawObjVector::InsertGrouped( XclImpDrawObjRef xDrawObj )
901 : : {
902 [ # # ]: 0 : if( !empty() )
903 [ # # ][ # # ]: 0 : if( XclImpGroupObj* pGroupObj = dynamic_cast< XclImpGroupObj* >( back().get() ) )
904 [ # # ][ # # ]: 0 : if( pGroupObj->TryInsert( xDrawObj ) )
905 : 0 : return;
906 : 0 : push_back( xDrawObj );
907 : : }
908 : :
909 : 86 : sal_Size XclImpDrawObjVector::GetProgressSize() const
910 : : {
911 : 86 : sal_Size nProgressSize = 0;
912 [ + - ][ - + ]: 86 : for( const_iterator aIt = begin(), aEnd = end(); aIt != aEnd; ++aIt )
913 [ # # ]: 0 : nProgressSize += (*aIt)->GetProgressSize();
914 : 86 : return nProgressSize;
915 : : }
916 : :
917 : : // ----------------------------------------------------------------------------
918 : :
919 : 0 : XclImpPhObj::XclImpPhObj( const XclImpRoot& rRoot ) :
920 : 0 : XclImpDrawObjBase( rRoot )
921 : : {
922 : 0 : SetProcessSdrObj( false );
923 : 0 : }
924 : :
925 : : // ----------------------------------------------------------------------------
926 : :
927 : 0 : XclImpGroupObj::XclImpGroupObj( const XclImpRoot& rRoot ) :
928 : : XclImpDrawObjBase( rRoot ),
929 [ # # ]: 0 : mnFirstUngrouped( 0 )
930 : : {
931 : 0 : }
932 : :
933 : 0 : bool XclImpGroupObj::TryInsert( XclImpDrawObjRef xDrawObj )
934 : : {
935 [ # # ]: 0 : if( xDrawObj->GetObjId() == mnFirstUngrouped )
936 : 0 : return false;
937 : : // insert into own list or into nested group
938 [ # # ]: 0 : maChildren.InsertGrouped( xDrawObj );
939 : 0 : return true;
940 : : }
941 : :
942 : 0 : void XclImpGroupObj::DoReadObj3( XclImpStream& rStrm, sal_uInt16 nMacroSize )
943 : : {
944 : 0 : rStrm.Ignore( 4 );
945 : 0 : rStrm >> mnFirstUngrouped;
946 : 0 : rStrm.Ignore( 16 );
947 : 0 : ReadMacro3( rStrm, nMacroSize );
948 : 0 : }
949 : :
950 : 0 : void XclImpGroupObj::DoReadObj4( XclImpStream& rStrm, sal_uInt16 nMacroSize )
951 : : {
952 : 0 : rStrm.Ignore( 4 );
953 : 0 : rStrm >> mnFirstUngrouped;
954 : 0 : rStrm.Ignore( 16 );
955 : 0 : ReadMacro4( rStrm, nMacroSize );
956 : 0 : }
957 : :
958 : 0 : void XclImpGroupObj::DoReadObj5( XclImpStream& rStrm, sal_uInt16 nNameLen, sal_uInt16 nMacroSize )
959 : : {
960 : 0 : rStrm.Ignore( 4 );
961 : 0 : rStrm >> mnFirstUngrouped;
962 : 0 : rStrm.Ignore( 16 );
963 : 0 : ReadName5( rStrm, nNameLen );
964 : 0 : ReadMacro5( rStrm, nMacroSize );
965 : 0 : }
966 : :
967 : 0 : sal_Size XclImpGroupObj::DoGetProgressSize() const
968 : : {
969 : 0 : return XclImpDrawObjBase::DoGetProgressSize() + maChildren.GetProgressSize();
970 : : }
971 : :
972 : 0 : SdrObject* XclImpGroupObj::DoCreateSdrObj( XclImpDffConverter& rDffConv, const Rectangle& /*rAnchorRect*/ ) const
973 : : {
974 [ # # ][ # # ]: 0 : TSdrObjectPtr< SdrObjGroup > xSdrObj( new SdrObjGroup );
975 : : // child objects in BIFF2-BIFF5 have absolute size, not needed to pass own anchor rectangle
976 [ # # ]: 0 : SdrObjList& rObjList = *xSdrObj->GetSubList(); // SdrObjGroup always returns existing sublist
977 [ # # ][ # # ]: 0 : for( XclImpDrawObjVector::const_iterator aIt = maChildren.begin(), aEnd = maChildren.end(); aIt != aEnd; ++aIt )
978 [ # # ]: 0 : rDffConv.ProcessObject( rObjList, **aIt );
979 [ # # ]: 0 : rDffConv.Progress();
980 [ # # ]: 0 : return xSdrObj.release();
981 : : }
982 : :
983 : : // ----------------------------------------------------------------------------
984 : :
985 : 0 : XclImpLineObj::XclImpLineObj( const XclImpRoot& rRoot ) :
986 : : XclImpDrawObjBase( rRoot ),
987 : : mnArrows( 0 ),
988 [ # # ]: 0 : mnStartPoint( EXC_OBJ_LINE_TL )
989 : : {
990 : 0 : SetAreaObj( false );
991 : 0 : }
992 : :
993 : 0 : void XclImpLineObj::DoReadObj3( XclImpStream& rStrm, sal_uInt16 nMacroSize )
994 : : {
995 : 0 : rStrm >> maLineData >> mnArrows >> mnStartPoint;
996 : 0 : rStrm.Ignore( 1 );
997 : 0 : ReadMacro3( rStrm, nMacroSize );
998 : 0 : }
999 : :
1000 : 0 : void XclImpLineObj::DoReadObj4( XclImpStream& rStrm, sal_uInt16 nMacroSize )
1001 : : {
1002 : 0 : rStrm >> maLineData >> mnArrows >> mnStartPoint;
1003 : 0 : rStrm.Ignore( 1 );
1004 : 0 : ReadMacro4( rStrm, nMacroSize );
1005 : 0 : }
1006 : :
1007 : 0 : void XclImpLineObj::DoReadObj5( XclImpStream& rStrm, sal_uInt16 nNameLen, sal_uInt16 nMacroSize )
1008 : : {
1009 : 0 : rStrm >> maLineData >> mnArrows >> mnStartPoint;
1010 : 0 : rStrm.Ignore( 1 );
1011 : 0 : ReadName5( rStrm, nNameLen );
1012 : 0 : ReadMacro5( rStrm, nMacroSize );
1013 : 0 : }
1014 : :
1015 : 0 : SdrObject* XclImpLineObj::DoCreateSdrObj( XclImpDffConverter& rDffConv, const Rectangle& rAnchorRect ) const
1016 : : {
1017 [ # # ]: 0 : ::basegfx::B2DPolygon aB2DPolygon;
1018 [ # # # # ]: 0 : switch( mnStartPoint )
1019 : : {
1020 : : default:
1021 : : case EXC_OBJ_LINE_TL:
1022 [ # # ]: 0 : aB2DPolygon.append( ::basegfx::B2DPoint( rAnchorRect.Left(), rAnchorRect.Top() ) );
1023 [ # # ]: 0 : aB2DPolygon.append( ::basegfx::B2DPoint( rAnchorRect.Right(), rAnchorRect.Bottom() ) );
1024 : 0 : break;
1025 : : case EXC_OBJ_LINE_TR:
1026 [ # # ]: 0 : aB2DPolygon.append( ::basegfx::B2DPoint( rAnchorRect.Right(), rAnchorRect.Top() ) );
1027 [ # # ]: 0 : aB2DPolygon.append( ::basegfx::B2DPoint( rAnchorRect.Left(), rAnchorRect.Bottom() ) );
1028 : 0 : break;
1029 : : case EXC_OBJ_LINE_BR:
1030 [ # # ]: 0 : aB2DPolygon.append( ::basegfx::B2DPoint( rAnchorRect.Right(), rAnchorRect.Bottom() ) );
1031 [ # # ]: 0 : aB2DPolygon.append( ::basegfx::B2DPoint( rAnchorRect.Left(), rAnchorRect.Top() ) );
1032 : 0 : break;
1033 : : case EXC_OBJ_LINE_BL:
1034 [ # # ]: 0 : aB2DPolygon.append( ::basegfx::B2DPoint( rAnchorRect.Left(), rAnchorRect.Bottom() ) );
1035 [ # # ]: 0 : aB2DPolygon.append( ::basegfx::B2DPoint( rAnchorRect.Right(), rAnchorRect.Top() ) );
1036 : 0 : break;
1037 : : }
1038 [ # # ][ # # ]: 0 : SdrObjectPtr xSdrObj( new SdrPathObj( OBJ_LINE, ::basegfx::B2DPolyPolygon( aB2DPolygon ) ) );
[ # # ][ # # ]
1039 [ # # ]: 0 : ConvertLineStyle( *xSdrObj, maLineData );
1040 : :
1041 : : // line ends
1042 : 0 : sal_uInt8 nArrowType = ::extract_value< sal_uInt8 >( mnArrows, 0, 4 );
1043 : 0 : bool bLineStart = false;
1044 : 0 : bool bLineEnd = false;
1045 : 0 : bool bFilled = false;
1046 [ # # # # : 0 : switch( nArrowType )
# ]
1047 : : {
1048 : 0 : case EXC_OBJ_ARROW_OPEN: bLineStart = false; bLineEnd = true; bFilled = false; break;
1049 : 0 : case EXC_OBJ_ARROW_OPENBOTH: bLineStart = true; bLineEnd = true; bFilled = false; break;
1050 : 0 : case EXC_OBJ_ARROW_FILLED: bLineStart = false; bLineEnd = true; bFilled = true; break;
1051 : 0 : case EXC_OBJ_ARROW_FILLEDBOTH: bLineStart = true; bLineEnd = true; bFilled = true; break;
1052 : : }
1053 [ # # ][ # # ]: 0 : if( bLineStart || bLineEnd )
1054 : : {
1055 : 0 : sal_uInt8 nArrowWidth = ::extract_value< sal_uInt8 >( mnArrows, 4, 4 );
1056 : 0 : double fArrowWidth = 3.0;
1057 [ # # # # ]: 0 : switch( nArrowWidth )
1058 : : {
1059 : 0 : case EXC_OBJ_ARROW_NARROW: fArrowWidth = 2.0; break;
1060 : 0 : case EXC_OBJ_ARROW_MEDIUM: fArrowWidth = 3.0; break;
1061 : 0 : case EXC_OBJ_ARROW_WIDE: fArrowWidth = 5.0; break;
1062 : : }
1063 : :
1064 : 0 : sal_uInt8 nArrowLength = ::extract_value< sal_uInt8 >( mnArrows, 8, 4 );
1065 : 0 : double fArrowLength = 3.0;
1066 [ # # # # ]: 0 : switch( nArrowLength )
1067 : : {
1068 : 0 : case EXC_OBJ_ARROW_NARROW: fArrowLength = 2.5; break;
1069 : 0 : case EXC_OBJ_ARROW_MEDIUM: fArrowLength = 3.5; break;
1070 : 0 : case EXC_OBJ_ARROW_WIDE: fArrowLength = 6.0; break;
1071 : : }
1072 : :
1073 [ # # ]: 0 : ::basegfx::B2DPolygon aArrowPoly;
1074 : : #define EXC_ARROW_POINT( x, y ) ::basegfx::B2DPoint( fArrowWidth * (x), fArrowLength * (y) )
1075 [ # # ]: 0 : if( bFilled )
1076 : : {
1077 [ # # ]: 0 : aArrowPoly.append( EXC_ARROW_POINT( 0, 100 ) );
1078 [ # # ]: 0 : aArrowPoly.append( EXC_ARROW_POINT( 50, 0 ) );
1079 [ # # ]: 0 : aArrowPoly.append( EXC_ARROW_POINT( 100, 100 ) );
1080 : : }
1081 : : else
1082 : : {
1083 [ # # ]: 0 : sal_uInt8 nLineWidth = ::limit_cast< sal_uInt8 >( maLineData.mnWidth, EXC_OBJ_LINE_THIN, EXC_OBJ_LINE_THICK );
1084 [ # # ]: 0 : aArrowPoly.append( EXC_ARROW_POINT( 50, 0 ) );
1085 [ # # ]: 0 : aArrowPoly.append( EXC_ARROW_POINT( 100, 100 - 3 * nLineWidth ) );
1086 [ # # ]: 0 : aArrowPoly.append( EXC_ARROW_POINT( 100 - 5 * nLineWidth, 100 ) );
1087 [ # # ]: 0 : aArrowPoly.append( EXC_ARROW_POINT( 50, 12 * nLineWidth ) );
1088 [ # # ]: 0 : aArrowPoly.append( EXC_ARROW_POINT( 5 * nLineWidth, 100 ) );
1089 [ # # ]: 0 : aArrowPoly.append( EXC_ARROW_POINT( 0, 100 - 3 * nLineWidth ) );
1090 : : }
1091 : : #undef EXC_ARROW_POINT
1092 : :
1093 [ # # ]: 0 : ::basegfx::B2DPolyPolygon aArrowPolyPoly( aArrowPoly );
1094 : 0 : long nWidth = static_cast< long >( 125 * fArrowWidth );
1095 [ # # ]: 0 : if( bLineStart )
1096 : : {
1097 [ # # ][ # # ]: 0 : xSdrObj->SetMergedItem( XLineStartItem( EMPTY_STRING, aArrowPolyPoly ) );
[ # # ][ # # ]
1098 [ # # ][ # # ]: 0 : xSdrObj->SetMergedItem( XLineStartWidthItem( nWidth ) );
[ # # ]
1099 [ # # ][ # # ]: 0 : xSdrObj->SetMergedItem( XLineStartCenterItem( false ) );
[ # # ]
1100 : : }
1101 [ # # ]: 0 : if( bLineEnd )
1102 : : {
1103 [ # # ][ # # ]: 0 : xSdrObj->SetMergedItem( XLineEndItem( EMPTY_STRING, aArrowPolyPoly ) );
[ # # ][ # # ]
1104 [ # # ][ # # ]: 0 : xSdrObj->SetMergedItem( XLineEndWidthItem( nWidth ) );
[ # # ]
1105 [ # # ][ # # ]: 0 : xSdrObj->SetMergedItem( XLineEndCenterItem( false ) );
[ # # ]
1106 [ # # ][ # # ]: 0 : }
1107 : : }
1108 [ # # ]: 0 : rDffConv.Progress();
1109 [ # # ][ # # ]: 0 : return xSdrObj.release();
1110 : : }
1111 : :
1112 : : // ----------------------------------------------------------------------------
1113 : :
1114 : 101 : XclImpRectObj::XclImpRectObj( const XclImpRoot& rRoot ) :
1115 : : XclImpDrawObjBase( rRoot ),
1116 [ + - ][ + - ]: 101 : mnFrameFlags( 0 )
1117 : : {
1118 : 101 : SetAreaObj( true );
1119 : 101 : }
1120 : :
1121 : 0 : void XclImpRectObj::ReadFrameData( XclImpStream& rStrm )
1122 : : {
1123 : 0 : rStrm >> maFillData >> maLineData >> mnFrameFlags;
1124 : 0 : }
1125 : :
1126 : 0 : void XclImpRectObj::ConvertRectStyle( SdrObject& rSdrObj ) const
1127 : : {
1128 : 0 : ConvertLineStyle( rSdrObj, maLineData );
1129 : 0 : ConvertFillStyle( rSdrObj, maFillData );
1130 : 0 : ConvertFrameStyle( rSdrObj, mnFrameFlags );
1131 : 0 : }
1132 : :
1133 : 0 : void XclImpRectObj::DoReadObj3( XclImpStream& rStrm, sal_uInt16 nMacroSize )
1134 : : {
1135 : 0 : ReadFrameData( rStrm );
1136 : 0 : ReadMacro3( rStrm, nMacroSize );
1137 : 0 : }
1138 : :
1139 : 0 : void XclImpRectObj::DoReadObj4( XclImpStream& rStrm, sal_uInt16 nMacroSize )
1140 : : {
1141 : 0 : ReadFrameData( rStrm );
1142 : 0 : ReadMacro4( rStrm, nMacroSize );
1143 : 0 : }
1144 : :
1145 : 0 : void XclImpRectObj::DoReadObj5( XclImpStream& rStrm, sal_uInt16 nNameLen, sal_uInt16 nMacroSize )
1146 : : {
1147 : 0 : ReadFrameData( rStrm );
1148 : 0 : ReadName5( rStrm, nNameLen );
1149 : 0 : ReadMacro5( rStrm, nMacroSize );
1150 : 0 : }
1151 : :
1152 : 0 : SdrObject* XclImpRectObj::DoCreateSdrObj( XclImpDffConverter& rDffConv, const Rectangle& rAnchorRect ) const
1153 : : {
1154 [ # # ][ # # ]: 0 : SdrObjectPtr xSdrObj( new SdrRectObj( rAnchorRect ) );
1155 [ # # ]: 0 : ConvertRectStyle( *xSdrObj );
1156 [ # # ]: 0 : rDffConv.Progress();
1157 [ # # ]: 0 : return xSdrObj.release();
1158 : : }
1159 : :
1160 : : // ----------------------------------------------------------------------------
1161 : :
1162 : 0 : XclImpOvalObj::XclImpOvalObj( const XclImpRoot& rRoot ) :
1163 : 0 : XclImpRectObj( rRoot )
1164 : : {
1165 : 0 : }
1166 : :
1167 : 0 : SdrObject* XclImpOvalObj::DoCreateSdrObj( XclImpDffConverter& rDffConv, const Rectangle& rAnchorRect ) const
1168 : : {
1169 [ # # ][ # # ]: 0 : SdrObjectPtr xSdrObj( new SdrCircObj( OBJ_CIRC, rAnchorRect ) );
1170 [ # # ]: 0 : ConvertRectStyle( *xSdrObj );
1171 [ # # ]: 0 : rDffConv.Progress();
1172 [ # # ]: 0 : return xSdrObj.release();
1173 : : }
1174 : :
1175 : : // ----------------------------------------------------------------------------
1176 : :
1177 : 0 : XclImpArcObj::XclImpArcObj( const XclImpRoot& rRoot ) :
1178 : : XclImpDrawObjBase( rRoot ),
1179 [ # # ][ # # ]: 0 : mnQuadrant( EXC_OBJ_ARC_TR )
1180 : : {
1181 : 0 : SetAreaObj( false ); // arc may be 2-dimensional
1182 : 0 : }
1183 : :
1184 : 0 : void XclImpArcObj::DoReadObj3( XclImpStream& rStrm, sal_uInt16 nMacroSize )
1185 : : {
1186 : 0 : rStrm >> maFillData >> maLineData >> mnQuadrant;
1187 : 0 : rStrm.Ignore( 1 );
1188 : 0 : ReadMacro3( rStrm, nMacroSize );
1189 : 0 : }
1190 : :
1191 : 0 : void XclImpArcObj::DoReadObj4( XclImpStream& rStrm, sal_uInt16 nMacroSize )
1192 : : {
1193 : 0 : rStrm >> maFillData >> maLineData >> mnQuadrant;
1194 : 0 : rStrm.Ignore( 1 );
1195 : 0 : ReadMacro4( rStrm, nMacroSize );
1196 : 0 : }
1197 : :
1198 : 0 : void XclImpArcObj::DoReadObj5( XclImpStream& rStrm, sal_uInt16 nNameLen, sal_uInt16 nMacroSize )
1199 : : {
1200 : 0 : rStrm >> maFillData >> maLineData >> mnQuadrant;
1201 : 0 : rStrm.Ignore( 1 );
1202 : 0 : ReadName5( rStrm, nNameLen );
1203 : 0 : ReadMacro5( rStrm, nMacroSize );
1204 : 0 : }
1205 : :
1206 : 0 : SdrObject* XclImpArcObj::DoCreateSdrObj( XclImpDffConverter& rDffConv, const Rectangle& rAnchorRect ) const
1207 : : {
1208 : 0 : Rectangle aNewRect = rAnchorRect;
1209 : 0 : long nStartAngle = 0;
1210 : 0 : long nEndAngle = 0;
1211 [ # # # # ]: 0 : switch( mnQuadrant )
1212 : : {
1213 : : default:
1214 : : case EXC_OBJ_ARC_TR:
1215 : 0 : nStartAngle = 0;
1216 : 0 : nEndAngle = 9000;
1217 [ # # ]: 0 : aNewRect.Left() -= rAnchorRect.GetWidth();
1218 [ # # ]: 0 : aNewRect.Bottom() += rAnchorRect.GetHeight();
1219 : 0 : break;
1220 : : case EXC_OBJ_ARC_TL:
1221 : 0 : nStartAngle = 9000;
1222 : 0 : nEndAngle = 18000;
1223 [ # # ]: 0 : aNewRect.Right() += rAnchorRect.GetWidth();
1224 [ # # ]: 0 : aNewRect.Bottom() += rAnchorRect.GetHeight();
1225 : 0 : break;
1226 : : case EXC_OBJ_ARC_BL:
1227 : 0 : nStartAngle = 18000;
1228 : 0 : nEndAngle = 27000;
1229 [ # # ]: 0 : aNewRect.Right() += rAnchorRect.GetWidth();
1230 [ # # ]: 0 : aNewRect.Top() -= rAnchorRect.GetHeight();
1231 : 0 : break;
1232 : : case EXC_OBJ_ARC_BR:
1233 : 0 : nStartAngle = 27000;
1234 : 0 : nEndAngle = 0;
1235 [ # # ]: 0 : aNewRect.Left() -= rAnchorRect.GetWidth();
1236 [ # # ]: 0 : aNewRect.Top() -= rAnchorRect.GetHeight();
1237 : 0 : break;
1238 : : }
1239 [ # # ][ # # ]: 0 : SdrObjKind eObjKind = maFillData.IsFilled() ? OBJ_SECT : OBJ_CARC;
1240 [ # # ][ # # ]: 0 : SdrObjectPtr xSdrObj( new SdrCircObj( eObjKind, aNewRect, nStartAngle, nEndAngle ) );
1241 [ # # ]: 0 : ConvertFillStyle( *xSdrObj, maFillData );
1242 [ # # ]: 0 : ConvertLineStyle( *xSdrObj, maLineData );
1243 [ # # ]: 0 : rDffConv.Progress();
1244 [ # # ]: 0 : return xSdrObj.release();
1245 : : }
1246 : :
1247 : : // ----------------------------------------------------------------------------
1248 : :
1249 : 0 : XclImpPolygonObj::XclImpPolygonObj( const XclImpRoot& rRoot ) :
1250 : : XclImpRectObj( rRoot ),
1251 : : mnPolyFlags( 0 ),
1252 [ # # ]: 0 : mnPointCount( 0 )
1253 : : {
1254 : 0 : SetAreaObj( false ); // polygon may be 2-dimensional
1255 : 0 : }
1256 : :
1257 : 0 : void XclImpPolygonObj::ReadCoordList( XclImpStream& rStrm )
1258 : : {
1259 [ # # ][ # # ]: 0 : if( (rStrm.GetNextRecId() == EXC_ID_COORDLIST) && rStrm.StartNextRecord() )
[ # # ]
1260 : : {
1261 : : OSL_ENSURE( rStrm.GetRecLeft() / 4 == mnPointCount, "XclImpPolygonObj::ReadCoordList - wrong polygon point count" );
1262 [ # # ]: 0 : while( rStrm.GetRecLeft() >= 4 )
1263 : : {
1264 : : sal_uInt16 nX, nY;
1265 [ # # ][ # # ]: 0 : rStrm >> nX >> nY;
1266 [ # # ]: 0 : maCoords.push_back( Point( nX, nY ) );
1267 : : }
1268 : : }
1269 : 0 : }
1270 : :
1271 : 0 : void XclImpPolygonObj::DoReadObj4( XclImpStream& rStrm, sal_uInt16 nMacroSize )
1272 : : {
1273 : 0 : ReadFrameData( rStrm );
1274 : 0 : rStrm >> mnPolyFlags;
1275 : 0 : rStrm.Ignore( 10 );
1276 : 0 : rStrm >> mnPointCount;
1277 : 0 : rStrm.Ignore( 8 );
1278 : 0 : ReadMacro4( rStrm, nMacroSize );
1279 : 0 : ReadCoordList( rStrm );
1280 : 0 : }
1281 : :
1282 : 0 : void XclImpPolygonObj::DoReadObj5( XclImpStream& rStrm, sal_uInt16 nNameLen, sal_uInt16 nMacroSize )
1283 : : {
1284 : 0 : ReadFrameData( rStrm );
1285 : 0 : rStrm >> mnPolyFlags;
1286 : 0 : rStrm.Ignore( 10 );
1287 : 0 : rStrm >> mnPointCount;
1288 : 0 : rStrm.Ignore( 8 );
1289 : 0 : ReadName5( rStrm, nNameLen );
1290 : 0 : ReadMacro5( rStrm, nMacroSize );
1291 : 0 : ReadCoordList( rStrm );
1292 : 0 : }
1293 : :
1294 : : namespace {
1295 : :
1296 : 0 : ::basegfx::B2DPoint lclGetPolyPoint( const Rectangle& rAnchorRect, const Point& rPoint )
1297 : : {
1298 : : return ::basegfx::B2DPoint(
1299 [ # # ][ # # ]: 0 : rAnchorRect.Left() + static_cast< sal_Int32 >( ::std::min< double >( rPoint.X(), 16384.0 ) / 16384.0 * rAnchorRect.GetWidth() + 0.5 ),
1300 [ # # ][ # # ]: 0 : rAnchorRect.Top() + static_cast< sal_Int32 >( ::std::min< double >( rPoint.Y(), 16384.0 ) / 16384.0 * rAnchorRect.GetHeight() + 0.5 ) );
1301 : : }
1302 : :
1303 : : } // namespace
1304 : :
1305 : 0 : SdrObject* XclImpPolygonObj::DoCreateSdrObj( XclImpDffConverter& rDffConv, const Rectangle& rAnchorRect ) const
1306 : : {
1307 : 0 : SdrObjectPtr xSdrObj;
1308 [ # # ]: 0 : if( maCoords.size() >= 2 )
1309 : : {
1310 : : // create the polygon
1311 [ # # ]: 0 : ::basegfx::B2DPolygon aB2DPolygon;
1312 [ # # ][ # # ]: 0 : for( PointVector::const_iterator aIt = maCoords.begin(), aEnd = maCoords.end(); aIt != aEnd; ++aIt )
1313 [ # # ][ # # ]: 0 : aB2DPolygon.append( lclGetPolyPoint( rAnchorRect, *aIt ) );
1314 : : // close polygon if specified
1315 [ # # ][ # # ]: 0 : if( ::get_flag( mnPolyFlags, EXC_OBJ_POLY_CLOSED ) && (maCoords.front() != maCoords.back()) )
[ # # ][ # # ]
1316 [ # # ][ # # ]: 0 : aB2DPolygon.append( lclGetPolyPoint( rAnchorRect, maCoords.front() ) );
1317 : : // create the SdrObject
1318 [ # # ][ # # ]: 0 : SdrObjKind eObjKind = maFillData.IsFilled() ? OBJ_PATHPOLY : OBJ_PATHPLIN;
1319 [ # # ][ # # ]: 0 : xSdrObj.reset( new SdrPathObj( eObjKind, ::basegfx::B2DPolyPolygon( aB2DPolygon ) ) );
[ # # ][ # # ]
[ # # ]
1320 [ # # ][ # # ]: 0 : ConvertRectStyle( *xSdrObj );
1321 : : }
1322 [ # # ]: 0 : rDffConv.Progress();
1323 [ # # ]: 0 : return xSdrObj.release();
1324 : : }
1325 : :
1326 : : // ----------------------------------------------------------------------------
1327 : :
1328 : 30 : void XclImpObjTextData::ReadByteString( XclImpStream& rStrm )
1329 : : {
1330 : 30 : mxString.reset();
1331 [ - + ]: 30 : if( maData.mnTextLen > 0 )
1332 : : {
1333 [ # # ][ # # ]: 0 : mxString.reset( new XclImpString( rStrm.ReadRawByteString( maData.mnTextLen ) ) );
[ # # ]
1334 : : // skip padding byte for word boundaries
1335 [ # # ]: 0 : if( rStrm.GetRecPos() & 1 ) rStrm.Ignore( 1 );
1336 : : }
1337 : 30 : }
1338 : :
1339 : 48 : void XclImpObjTextData::ReadFormats( XclImpStream& rStrm )
1340 : : {
1341 [ + - ]: 48 : if( mxString )
1342 : 48 : mxString->ReadObjFormats( rStrm, maData.mnFormatSize );
1343 : : else
1344 : 0 : rStrm.Ignore( maData.mnFormatSize );
1345 : 48 : }
1346 : :
1347 : : // ----------------------------------------------------------------------------
1348 : :
1349 : 81 : XclImpTextObj::XclImpTextObj( const XclImpRoot& rRoot ) :
1350 [ + - ]: 81 : XclImpRectObj( rRoot )
1351 : : {
1352 : 81 : }
1353 : :
1354 : 0 : void XclImpTextObj::DoReadObj3( XclImpStream& rStrm, sal_uInt16 nMacroSize )
1355 : : {
1356 : 0 : ReadFrameData( rStrm );
1357 : 0 : maTextData.maData.ReadObj3( rStrm );
1358 : 0 : ReadMacro3( rStrm, nMacroSize );
1359 : 0 : maTextData.ReadByteString( rStrm );
1360 : 0 : maTextData.ReadFormats( rStrm );
1361 : 0 : }
1362 : :
1363 : 0 : void XclImpTextObj::DoReadObj4( XclImpStream& rStrm, sal_uInt16 nMacroSize )
1364 : : {
1365 : 0 : ReadFrameData( rStrm );
1366 : 0 : maTextData.maData.ReadObj3( rStrm );
1367 : 0 : ReadMacro4( rStrm, nMacroSize );
1368 : 0 : maTextData.ReadByteString( rStrm );
1369 : 0 : maTextData.ReadFormats( rStrm );
1370 : 0 : }
1371 : :
1372 : 0 : void XclImpTextObj::DoReadObj5( XclImpStream& rStrm, sal_uInt16 nNameLen, sal_uInt16 nMacroSize )
1373 : : {
1374 : 0 : ReadFrameData( rStrm );
1375 : 0 : maTextData.maData.ReadObj5( rStrm );
1376 : 0 : ReadName5( rStrm, nNameLen );
1377 : 0 : ReadMacro5( rStrm, nMacroSize );
1378 : 0 : maTextData.ReadByteString( rStrm );
1379 : 0 : rStrm.Ignore( maTextData.maData.mnLinkSize ); // ignore text link formula
1380 : 0 : maTextData.ReadFormats( rStrm );
1381 : 0 : }
1382 : :
1383 : 0 : SdrObject* XclImpTextObj::DoCreateSdrObj( XclImpDffConverter& rDffConv, const Rectangle& rAnchorRect ) const
1384 : : {
1385 [ # # ][ # # ]: 0 : TSdrObjectPtr< SdrObjCustomShape > xSdrObj( new SdrObjCustomShape );
1386 [ # # ]: 0 : xSdrObj->NbcSetSnapRect( rAnchorRect );
1387 [ # # ]: 0 : OUString aRectType = CREATE_OUSTRING( "rectangle" );
1388 [ # # ]: 0 : xSdrObj->MergeDefaultAttributes( &aRectType );
1389 [ # # ]: 0 : ConvertRectStyle( *xSdrObj );
1390 : 0 : sal_Bool bAutoSize = ::get_flag( maTextData.maData.mnFlags, EXC_OBJ_TEXT_AUTOSIZE );
1391 [ # # ][ # # ]: 0 : xSdrObj->SetMergedItem( SdrTextAutoGrowWidthItem( bAutoSize ) );
[ # # ]
1392 [ # # ][ # # ]: 0 : xSdrObj->SetMergedItem( SdrTextAutoGrowHeightItem( bAutoSize ) );
[ # # ]
1393 [ # # ][ # # ]: 0 : xSdrObj->SetMergedItem( SdrTextWordWrapItem( sal_True ) );
[ # # ]
1394 [ # # ]: 0 : rDffConv.Progress();
1395 [ # # ]: 0 : return xSdrObj.release();
1396 : : }
1397 : :
1398 : 36 : void XclImpTextObj::DoPreProcessSdrObj( XclImpDffConverter& rDffConv, SdrObject& rSdrObj ) const
1399 : : {
1400 : : // set text data
1401 [ - + ][ + - ]: 36 : if( SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( &rSdrObj ) )
1402 : : {
1403 [ + + ]: 36 : if( maTextData.mxString )
1404 : : {
1405 [ + - ]: 33 : if( maTextData.mxString->IsRich() )
1406 : : {
1407 : : // rich text
1408 : : ::std::auto_ptr< EditTextObject > xEditObj(
1409 [ + - ]: 33 : XclImpStringHelper::CreateTextObject( GetRoot(), *maTextData.mxString ) );
1410 [ + - ][ + - ]: 33 : OutlinerParaObject* pOutlineObj = new OutlinerParaObject( *xEditObj );
[ + - ]
1411 [ + - ]: 33 : pOutlineObj->SetOutlinerMode( OUTLINERMODE_TEXTOBJECT );
1412 : : // text object takes ownership of the outliner object
1413 [ + - ][ + - ]: 33 : pTextObj->NbcSetOutlinerParaObject( pOutlineObj );
1414 : : }
1415 : : else
1416 : : {
1417 : : // plain text
1418 : 0 : pTextObj->NbcSetText( maTextData.mxString->GetText() );
1419 : : }
1420 : :
1421 : : /* #i96858# Do not apply any formatting if there is no text.
1422 : : SdrObjCustomShape::SetVerticalWriting (initiated from
1423 : : SetMergedItem) calls SdrTextObj::ForceOutlinerParaObject which
1424 : : ensures that we can erroneously write a ClientTextbox record
1425 : : (with no content) while exporting to XLS, which can cause a
1426 : : corrupted exported document. */
1427 : :
1428 : 33 : SvxAdjust eHorAlign = SVX_ADJUST_LEFT;
1429 : 33 : SdrTextVertAdjust eVerAlign = SDRTEXTVERTADJUST_TOP;
1430 : :
1431 : : // orientation (this is only a fake, drawing does not support real text orientation)
1432 : : namespace csst = ::com::sun::star::text;
1433 : 33 : csst::WritingMode eWriteMode = csst::WritingMode_LR_TB;
1434 [ + - - ]: 33 : switch( maTextData.maData.mnOrient )
1435 : : {
1436 : : default:
1437 : : case EXC_OBJ_ORIENT_NONE:
1438 : : {
1439 : 33 : eWriteMode = csst::WritingMode_LR_TB;
1440 [ + - - - : 33 : switch( maTextData.maData.GetHorAlign() )
- ]
1441 : : {
1442 : 33 : case EXC_OBJ_HOR_LEFT: eHorAlign = SVX_ADJUST_LEFT; break;
1443 : 0 : case EXC_OBJ_HOR_CENTER: eHorAlign = SVX_ADJUST_CENTER; break;
1444 : 0 : case EXC_OBJ_HOR_RIGHT: eHorAlign = SVX_ADJUST_RIGHT; break;
1445 : 0 : case EXC_OBJ_HOR_JUSTIFY: eHorAlign = SVX_ADJUST_BLOCK; break;
1446 : : }
1447 [ + - - - : 33 : switch( maTextData.maData.GetVerAlign() )
- ]
1448 : : {
1449 : 33 : case EXC_OBJ_VER_TOP: eVerAlign = SDRTEXTVERTADJUST_TOP; break;
1450 : 0 : case EXC_OBJ_VER_CENTER: eVerAlign = SDRTEXTVERTADJUST_CENTER; break;
1451 : 0 : case EXC_OBJ_VER_BOTTOM: eVerAlign = SDRTEXTVERTADJUST_BOTTOM; break;
1452 : 0 : case EXC_OBJ_VER_JUSTIFY: eVerAlign = SDRTEXTVERTADJUST_BLOCK; break;
1453 : : }
1454 : : }
1455 : 33 : break;
1456 : :
1457 : : case EXC_OBJ_ORIENT_90CCW:
1458 : : {
1459 [ # # ][ # # ]: 0 : if( SdrObjCustomShape* pObjCustomShape = dynamic_cast< SdrObjCustomShape* >( &rSdrObj ) )
1460 : : {
1461 : 0 : double fAngle = 180.0;
1462 : 0 : com::sun::star::beans::PropertyValue aTextRotateAngle;
1463 [ # # ]: 0 : aTextRotateAngle.Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM ( "TextRotateAngle" ) );
1464 [ # # ]: 0 : aTextRotateAngle.Value <<= fAngle;
1465 [ # # ][ # # ]: 0 : SdrCustomShapeGeometryItem aGeometryItem((SdrCustomShapeGeometryItem&)pObjCustomShape->GetMergedItem( SDRATTR_CUSTOMSHAPE_GEOMETRY ));
1466 [ # # ]: 0 : aGeometryItem.SetPropertyValue( aTextRotateAngle );
1467 [ # # ][ # # ]: 0 : pObjCustomShape->SetMergedItem( aGeometryItem );
1468 : : }
1469 : 0 : eWriteMode = csst::WritingMode_TB_RL;
1470 [ # # # # : 0 : switch( maTextData.maData.GetHorAlign() )
# ]
1471 : : {
1472 : 0 : case EXC_OBJ_HOR_LEFT: eVerAlign = SDRTEXTVERTADJUST_TOP; break;
1473 : 0 : case EXC_OBJ_HOR_CENTER: eVerAlign = SDRTEXTVERTADJUST_CENTER; break;
1474 : 0 : case EXC_OBJ_HOR_RIGHT: eVerAlign = SDRTEXTVERTADJUST_BOTTOM; break;
1475 : 0 : case EXC_OBJ_HOR_JUSTIFY: eVerAlign = SDRTEXTVERTADJUST_BLOCK; break;
1476 : : }
1477 : 0 : MSO_Anchor eTextAnchor = (MSO_Anchor)rDffConv.GetPropertyValue( DFF_Prop_anchorText, mso_anchorTop );
1478 [ # # ]: 0 : switch( eTextAnchor )
1479 : : {
1480 : : case mso_anchorTopCentered :
1481 : : case mso_anchorMiddleCentered :
1482 : : case mso_anchorBottomCentered :
1483 : : {
1484 : 0 : eHorAlign = SVX_ADJUST_CENTER;
1485 : : }
1486 : 0 : break;
1487 : :
1488 : : default:
1489 : : {
1490 [ # # # # : 0 : switch( maTextData.maData.GetVerAlign() )
# ]
1491 : : {
1492 : 0 : case EXC_OBJ_VER_TOP: eHorAlign = SVX_ADJUST_RIGHT; break;
1493 : 0 : case EXC_OBJ_VER_CENTER: eHorAlign = SVX_ADJUST_CENTER; break;
1494 : 0 : case EXC_OBJ_VER_BOTTOM: eHorAlign = SVX_ADJUST_LEFT; break;
1495 : 0 : case EXC_OBJ_VER_JUSTIFY: eHorAlign = SVX_ADJUST_BLOCK; break;
1496 : : }
1497 : : }
1498 : : }
1499 : : }
1500 : 0 : break;
1501 : :
1502 : : case EXC_OBJ_ORIENT_STACKED: // PASSTHROUGH INTENDED
1503 : : {
1504 : : // sj: STACKED is not supported, maybe it can be optimized here a bit
1505 : : }
1506 : : case EXC_OBJ_ORIENT_90CW:
1507 : : {
1508 : 0 : eWriteMode = csst::WritingMode_TB_RL;
1509 [ # # # # : 0 : switch( maTextData.maData.GetHorAlign() )
# ]
1510 : : {
1511 : 0 : case EXC_OBJ_HOR_LEFT: eVerAlign = SDRTEXTVERTADJUST_BOTTOM; break;
1512 : 0 : case EXC_OBJ_HOR_CENTER: eVerAlign = SDRTEXTVERTADJUST_CENTER; break;
1513 : 0 : case EXC_OBJ_HOR_RIGHT: eVerAlign = SDRTEXTVERTADJUST_TOP; break;
1514 : 0 : case EXC_OBJ_HOR_JUSTIFY: eVerAlign = SDRTEXTVERTADJUST_BLOCK; break;
1515 : : }
1516 : 0 : MSO_Anchor eTextAnchor = (MSO_Anchor)rDffConv.GetPropertyValue( DFF_Prop_anchorText, mso_anchorTop );
1517 [ # # ]: 0 : switch ( eTextAnchor )
1518 : : {
1519 : : case mso_anchorTopCentered :
1520 : : case mso_anchorMiddleCentered :
1521 : : case mso_anchorBottomCentered :
1522 : : {
1523 : 0 : eHorAlign = SVX_ADJUST_CENTER;
1524 : : }
1525 : 0 : break;
1526 : :
1527 : : default:
1528 : : {
1529 [ # # # # : 0 : switch( maTextData.maData.GetVerAlign() )
# ]
1530 : : {
1531 : 0 : case EXC_OBJ_VER_TOP: eHorAlign = SVX_ADJUST_LEFT; break;
1532 : 0 : case EXC_OBJ_VER_CENTER: eHorAlign = SVX_ADJUST_CENTER; break;
1533 : 0 : case EXC_OBJ_VER_BOTTOM: eHorAlign = SVX_ADJUST_RIGHT; break;
1534 : 0 : case EXC_OBJ_VER_JUSTIFY: eHorAlign = SVX_ADJUST_BLOCK; break;
1535 : : }
1536 : : }
1537 : : }
1538 : : }
1539 : 0 : break;
1540 : : }
1541 [ + - ]: 33 : rSdrObj.SetMergedItem( SvxAdjustItem( eHorAlign, EE_PARA_JUST ) );
1542 [ + - ]: 33 : rSdrObj.SetMergedItem( SdrTextVertAdjustItem( eVerAlign ) );
1543 [ + - ]: 33 : rSdrObj.SetMergedItem( SvxWritingModeItem( eWriteMode, SDRATTR_TEXTDIRECTION ) );
1544 : : }
1545 : : }
1546 : : // base class processing
1547 : 36 : XclImpRectObj::DoPreProcessSdrObj( rDffConv, rSdrObj );
1548 : 36 : }
1549 : :
1550 : : // ----------------------------------------------------------------------------
1551 : :
1552 : 6 : XclImpChartObj::XclImpChartObj( const XclImpRoot& rRoot, bool bOwnTab ) :
1553 : : XclImpRectObj( rRoot ),
1554 [ + - ]: 6 : mbOwnTab( bOwnTab )
1555 : : {
1556 : 6 : SetSimpleMacro( false );
1557 : 6 : SetCustomDffObj( true );
1558 : 6 : }
1559 : :
1560 : 6 : void XclImpChartObj::ReadChartSubStream( XclImpStream& rStrm )
1561 : : {
1562 [ - + ][ + - ]: 6 : if( mbOwnTab ? (rStrm.GetRecId() == EXC_ID5_BOF) : ((rStrm.GetNextRecId() == EXC_ID5_BOF) && rStrm.StartNextRecord()) )
[ + - ][ + - ]
1563 : : {
1564 : : sal_uInt16 nBofType;
1565 [ + - ]: 6 : rStrm.Seek( 2 );
1566 [ + - ]: 6 : rStrm >> nBofType;
1567 : : OSL_ENSURE( nBofType == EXC_BOF_CHART, "XclImpChartObj::ReadChartSubStream - no chart BOF record" );
1568 : :
1569 : : // read chart, even if BOF record contains wrong substream identifier
1570 [ + - ][ + - ]: 6 : mxChart.reset( new XclImpChart( GetRoot(), mbOwnTab ) );
[ + - ]
1571 [ + - ]: 6 : mxChart->ReadChartSubStream( rStrm );
1572 [ - + ]: 6 : if( mbOwnTab )
1573 [ # # ]: 6 : FinalizeTabChart();
1574 : : }
1575 : : else
1576 : : {
1577 : : OSL_FAIL( "XclImpChartObj::ReadChartSubStream - missing chart substream" );
1578 : : }
1579 : 6 : }
1580 : :
1581 : 0 : void XclImpChartObj::DoReadObj3( XclImpStream& rStrm, sal_uInt16 nMacroSize )
1582 : : {
1583 : : // read OBJ record and the following chart substream
1584 : 0 : ReadFrameData( rStrm );
1585 : 0 : rStrm.Ignore( 18 );
1586 : 0 : ReadMacro3( rStrm, nMacroSize );
1587 : : // set frame format from OBJ record, it is used if chart itself is transparent
1588 [ # # ]: 0 : if( mxChart )
1589 : 0 : mxChart->UpdateObjFrame( maLineData, maFillData );
1590 : 0 : }
1591 : :
1592 : 0 : void XclImpChartObj::DoReadObj4( XclImpStream& rStrm, sal_uInt16 nMacroSize )
1593 : : {
1594 : : // read OBJ record and the following chart substream
1595 : 0 : ReadFrameData( rStrm );
1596 : 0 : rStrm.Ignore( 18 );
1597 : 0 : ReadMacro4( rStrm, nMacroSize );
1598 : : // set frame format from OBJ record, it is used if chart itself is transparent
1599 [ # # ]: 0 : if( mxChart )
1600 : 0 : mxChart->UpdateObjFrame( maLineData, maFillData );
1601 : 0 : }
1602 : :
1603 : 0 : void XclImpChartObj::DoReadObj5( XclImpStream& rStrm, sal_uInt16 nNameLen, sal_uInt16 nMacroSize )
1604 : : {
1605 : : // read OBJ record and the following chart substream
1606 : 0 : ReadFrameData( rStrm );
1607 : 0 : rStrm.Ignore( 18 );
1608 : 0 : ReadName5( rStrm, nNameLen );
1609 : 0 : ReadMacro5( rStrm, nMacroSize );
1610 : 0 : ReadChartSubStream( rStrm );
1611 : : // set frame format from OBJ record, it is used if chart itself is transparent
1612 [ # # ]: 0 : if( mxChart )
1613 : 0 : mxChart->UpdateObjFrame( maLineData, maFillData );
1614 : 0 : }
1615 : :
1616 : 6 : void XclImpChartObj::DoReadObj8SubRec( XclImpStream& rStrm, sal_uInt16 nSubRecId, sal_uInt16 /*nSubRecSize*/ )
1617 : : {
1618 : : // read the following chart substream
1619 [ + - ]: 6 : if( nSubRecId == EXC_ID_OBJEND )
1620 : : {
1621 : : // enable CONTINUE handling for the entire chart substream
1622 : 6 : rStrm.ResetRecord( true );
1623 : 6 : ReadChartSubStream( rStrm );
1624 : : /* disable CONTINUE handling again to be able to read
1625 : : following CONTINUE records as MSODRAWING records. */
1626 : 6 : rStrm.ResetRecord( false );
1627 : : }
1628 : 6 : }
1629 : :
1630 : 6 : sal_Size XclImpChartObj::DoGetProgressSize() const
1631 : : {
1632 [ + - ]: 6 : return mxChart ? mxChart->GetProgressSize() : 1;
1633 : : }
1634 : :
1635 : 6 : SdrObject* XclImpChartObj::DoCreateSdrObj( XclImpDffConverter& rDffConv, const Rectangle& rAnchorRect ) const
1636 : : {
1637 : 6 : SdrObjectPtr xSdrObj;
1638 [ + - ]: 6 : SfxObjectShell* pDocShell = GetDocShell();
1639 [ + - ][ + - ]: 6 : if( rDffConv.SupportsOleObjects() && SvtModuleOptions().IsChart() && pDocShell && mxChart && !mxChart->IsPivotChart() )
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ + - ]
[ + - # # ]
1640 : : {
1641 : : // create embedded chart object
1642 : 6 : OUString aEmbObjName;
1643 [ + - ]: 6 : Reference< XEmbeddedObject > xEmbObj = pDocShell->GetEmbeddedObjectContainer().
1644 [ + - ][ + - ]: 12 : CreateEmbeddedObject( SvGlobalName( SO3_SCH_CLASSID ).GetByteSequence(), aEmbObjName );
[ + - ][ + - ]
[ + - ]
1645 : :
1646 : : /* Set the size to the embedded object, this prevents that font sizes
1647 : : of text objects are changed in the chart when the object is
1648 : : inserted into the draw page. */
1649 : 6 : sal_Int64 nAspect = ::com::sun::star::embed::Aspects::MSOLE_CONTENT;
1650 [ + - ][ + - ]: 6 : MapUnit aUnit = VCLUnoHelper::UnoEmbed2VCLMapUnit( xEmbObj->getMapUnit( nAspect ) );
[ + - ]
1651 [ + - ][ + - ]: 6 : Size aSize( Window::LogicToLogic( rAnchorRect.GetSize(), MapMode( MAP_100TH_MM ), MapMode( aUnit ) ) );
[ + - ][ + - ]
[ + - ][ + - ]
1652 : 6 : ::com::sun::star::awt::Size aAwtSize( aSize.Width(), aSize.Height() );
1653 [ + - ][ + - ]: 6 : xEmbObj->setVisualAreaSize( nAspect, aAwtSize );
1654 : :
1655 : : // create the container OLE object
1656 [ + - ][ + - ]: 6 : xSdrObj.reset( new SdrOle2Obj( svt::EmbeddedObjectRef( xEmbObj, nAspect ), aEmbObjName, rAnchorRect ) );
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ]
1657 : : }
1658 : :
1659 [ + - ]: 6 : return xSdrObj.release();
1660 : : }
1661 : :
1662 : 6 : void XclImpChartObj::DoPostProcessSdrObj( XclImpDffConverter& rDffConv, SdrObject& rSdrObj ) const
1663 : : {
1664 [ - + ]: 6 : const SdrOle2Obj* pSdrOleObj = dynamic_cast< const SdrOle2Obj* >( &rSdrObj );
1665 [ + - ][ + - ]: 6 : if( mxChart && pSdrOleObj )
[ + - ]
1666 : : {
1667 [ + - ]: 6 : Reference< XEmbeddedObject > xEmbObj = pSdrOleObj->GetObjRef();
1668 [ + - ][ + - ]: 6 : if( xEmbObj.is() && ::svt::EmbeddedObjectRef::TryRunningState( xEmbObj ) ) try
[ + - ][ + - ]
1669 : : {
1670 [ + - ]: 6 : Reference< XEmbedPersist > xPersist( xEmbObj, UNO_QUERY_THROW );
1671 [ + - ][ + - ]: 6 : Reference< XModel > xModel( xEmbObj->getComponent(), UNO_QUERY_THROW );
[ + - ]
1672 [ + - ][ + - ]: 6 : mxChart->Convert( xModel, rDffConv, xPersist->getEntryName(), rSdrObj.GetLogicRect() );
[ + - ][ + - ]
1673 [ + - ][ # # ]: 6 : xPersist->storeOwn();
[ + - ]
1674 : : }
1675 [ # # ]: 0 : catch( const Exception& )
1676 : : {
1677 : 6 : }
1678 : : }
1679 : 6 : }
1680 : :
1681 : 0 : void XclImpChartObj::FinalizeTabChart()
1682 : : {
1683 : : /* #i44077# Calculate and store DFF anchor for sheet charts.
1684 : : Needed to get used area if this chart is inserted as OLE object. */
1685 : : OSL_ENSURE( mbOwnTab, "XclImpChartObj::FinalizeTabChart - not allowed for embedded chart objects" );
1686 : :
1687 : : // set uninitialized page to landscape
1688 [ # # ][ # # ]: 0 : if( !GetPageSettings().GetPageData().mbValid )
1689 [ # # ][ # # ]: 0 : GetPageSettings().SetPaperSize( EXC_PAPERSIZE_DEFAULT, false );
1690 : :
1691 : : // calculate size of the chart object
1692 [ # # ]: 0 : const XclPageData& rPageData = GetPageSettings().GetPageData();
1693 [ # # ]: 0 : Size aPaperSize = rPageData.GetScPaperSize();
1694 : :
1695 [ # # ]: 0 : long nWidth = XclTools::GetHmmFromTwips( aPaperSize.Width() );
1696 [ # # ]: 0 : long nHeight = XclTools::GetHmmFromTwips( aPaperSize.Height() );
1697 : :
1698 : : // subtract page margins, give some more extra space
1699 [ # # ]: 0 : nWidth -= (XclTools::GetHmmFromInch( rPageData.mfLeftMargin + rPageData.mfRightMargin ) + 2000);
1700 [ # # ]: 0 : nHeight -= (XclTools::GetHmmFromInch( rPageData.mfTopMargin + rPageData.mfBottomMargin ) + 1000);
1701 : :
1702 : : // print column/row headers?
1703 [ # # ]: 0 : if( rPageData.mbPrintHeadings )
1704 : : {
1705 : 0 : nWidth -= 2000;
1706 : 0 : nHeight -= 1000;
1707 : : }
1708 : :
1709 : : // create the object anchor
1710 [ # # ]: 0 : XclObjAnchor aAnchor;
1711 [ # # ][ # # ]: 0 : aAnchor.SetRect( GetRoot(), GetCurrScTab(), Rectangle( 1000, 500, nWidth, nHeight ), MAP_100TH_MM );
1712 : 0 : SetAnchor( aAnchor );
1713 : 0 : }
1714 : :
1715 : : // ----------------------------------------------------------------------------
1716 : :
1717 : 3 : XclImpNoteObj::XclImpNoteObj( const XclImpRoot& rRoot ) :
1718 : : XclImpTextObj( rRoot ),
1719 : : maScPos( ScAddress::INITIALIZE_INVALID ),
1720 : 3 : mnNoteFlags( 0 )
1721 : : {
1722 : 3 : SetSimpleMacro( false );
1723 : : // caption object will be created manually
1724 : 3 : SetInsertSdrObj( false );
1725 : 3 : }
1726 : :
1727 : 3 : void XclImpNoteObj::SetNoteData( const ScAddress& rScPos, sal_uInt16 nNoteFlags )
1728 : : {
1729 : 3 : maScPos = rScPos;
1730 : 3 : mnNoteFlags = nNoteFlags;
1731 : 3 : }
1732 : :
1733 : 3 : void XclImpNoteObj::DoPreProcessSdrObj( XclImpDffConverter& rDffConv, SdrObject& rSdrObj ) const
1734 : : {
1735 : : // create formatted text
1736 : 3 : XclImpTextObj::DoPreProcessSdrObj( rDffConv, rSdrObj );
1737 : 3 : OutlinerParaObject* pOutlinerObj = rSdrObj.GetOutlinerParaObject();
1738 [ + - ][ + - ]: 3 : if( maScPos.IsValid() && pOutlinerObj )
[ + - ]
1739 : : {
1740 : : // create cell note with all data from drawing object
1741 : : ScNoteUtil::CreateNoteFromObjectData(
1742 : 3 : GetDoc(), maScPos,
1743 : 3 : rSdrObj.GetMergedItemSet().Clone(), // new object on heap expected
1744 [ + - ]: 3 : new OutlinerParaObject( *pOutlinerObj ), // new object on heap expected
1745 : 3 : rSdrObj.GetLogicRect(),
1746 : 3 : ::get_flag( mnNoteFlags, EXC_NOTE_VISIBLE ),
1747 : 9 : false );
1748 : : }
1749 : 3 : }
1750 : :
1751 : : // ----------------------------------------------------------------------------
1752 : :
1753 : 59 : XclImpControlHelper::XclImpControlHelper( const XclImpRoot& rRoot, XclCtrlBindMode eBindMode ) :
1754 : : mrRoot( rRoot ),
1755 [ + - ][ + - ]: 59 : meBindMode( eBindMode )
1756 : : {
1757 : 59 : }
1758 : :
1759 [ + - ][ + - ]: 59 : XclImpControlHelper::~XclImpControlHelper()
1760 : : {
1761 [ - + ]: 59 : }
1762 : :
1763 : 26 : SdrObject* XclImpControlHelper::CreateSdrObjectFromShape(
1764 : : const Reference< XShape >& rxShape, const Rectangle& rAnchorRect ) const
1765 : : {
1766 [ + - ]: 26 : mxShape = rxShape;
1767 [ + - ]: 26 : SdrObjectPtr xSdrObj( SdrObject::getSdrObjectFromXShape( rxShape ) );
1768 [ + - ]: 26 : if( xSdrObj.is() )
1769 : : {
1770 [ + - ]: 26 : xSdrObj->NbcSetSnapRect( rAnchorRect );
1771 : : // #i30543# insert into control layer
1772 [ + - ]: 26 : xSdrObj->NbcSetLayer( SC_LAYER_CONTROLS );
1773 : : }
1774 [ + - ]: 26 : return xSdrObj.release();
1775 : : }
1776 : :
1777 : 35 : void XclImpControlHelper::ApplySheetLinkProps() const
1778 : : {
1779 : :
1780 [ + - ]: 35 : Reference< XControlModel > xCtrlModel = XclControlHelper::GetControlModel( mxShape );
1781 [ - + ]: 35 : if( !xCtrlModel.is() )
1782 : 35 : return;
1783 [ + - ]: 35 : ScfPropertySet aPropSet( xCtrlModel );
1784 : :
1785 : : // sheet links
1786 [ + - ][ + - ]: 35 : if( SfxObjectShell* pDocShell = mrRoot.GetDocShell() )
1787 : : {
1788 [ + - ][ + - ]: 35 : Reference< XMultiServiceFactory > xFactory( pDocShell->GetModel(), UNO_QUERY );
1789 [ + - ]: 35 : if( xFactory.is() )
1790 : : {
1791 : : // cell link
1792 [ + + ]: 35 : if( mxCellLink ) try
1793 : : {
1794 [ + - ]: 12 : Reference< XBindableValue > xBindable( xCtrlModel, UNO_QUERY_THROW );
1795 : :
1796 : : // create argument sequence for createInstanceWithArguments()
1797 : 12 : CellAddress aApiAddress;
1798 : 12 : ScUnoConversion::FillApiAddress( aApiAddress, *mxCellLink );
1799 : :
1800 : 12 : NamedValue aValue;
1801 [ + - ]: 12 : aValue.Name = CREATE_OUSTRING( SC_UNONAME_BOUNDCELL );
1802 [ + - ]: 12 : aValue.Value <<= aApiAddress;
1803 : :
1804 [ + - ]: 12 : Sequence< Any > aArgs( 1 );
1805 [ + - ][ + - ]: 12 : aArgs[ 0 ] <<= aValue;
1806 : :
1807 : : // create the CellValueBinding instance and set at the control model
1808 : 12 : OUString aServiceName;
1809 [ - + - ]: 12 : switch( meBindMode )
1810 : : {
1811 [ # # ]: 0 : case EXC_CTRL_BINDCONTENT: aServiceName = CREATE_OUSTRING( SC_SERVICENAME_VALBIND ); break;
1812 [ + - ]: 12 : case EXC_CTRL_BINDPOSITION: aServiceName = CREATE_OUSTRING( SC_SERVICENAME_LISTCELLBIND ); break;
1813 : : }
1814 : : Reference< XValueBinding > xBinding(
1815 [ + - ][ + - ]: 12 : xFactory->createInstanceWithArguments( aServiceName, aArgs ), UNO_QUERY_THROW );
[ + - ]
1816 [ + - ][ + - ]: 12 : xBindable->setValueBinding( xBinding );
[ # # ][ + - ]
1817 : : }
1818 [ # # ]: 0 : catch( const Exception& )
1819 : : {
1820 : : }
1821 : :
1822 : : // source range
1823 [ - + ]: 35 : if( mxSrcRange ) try
1824 : : {
1825 [ # # ]: 0 : Reference< XListEntrySink > xEntrySink( xCtrlModel, UNO_QUERY_THROW );
1826 : :
1827 : : // create argument sequence for createInstanceWithArguments()
1828 : 0 : CellRangeAddress aApiRange;
1829 : 0 : ScUnoConversion::FillApiRange( aApiRange, *mxSrcRange );
1830 : :
1831 : 0 : NamedValue aValue;
1832 [ # # ]: 0 : aValue.Name = CREATE_OUSTRING( SC_UNONAME_CELLRANGE );
1833 [ # # ]: 0 : aValue.Value <<= aApiRange;
1834 : :
1835 [ # # ]: 0 : Sequence< Any > aArgs( 1 );
1836 [ # # ][ # # ]: 0 : aArgs[ 0 ] <<= aValue;
1837 : :
1838 : : // create the EntrySource instance and set at the control model
1839 [ # # ]: 0 : Reference< XListEntrySource > xEntrySource( xFactory->createInstanceWithArguments(
1840 [ # # ][ # # ]: 0 : CREATE_OUSTRING( SC_SERVICENAME_LISTSOURCE ), aArgs ), UNO_QUERY_THROW );
[ # # ]
1841 [ # # ][ # # ]: 0 : xEntrySink->setListEntrySource( xEntrySource );
[ # # ][ # # ]
1842 : : }
1843 [ # # ]: 0 : catch( const Exception& )
1844 : : {
1845 : : }
1846 : 35 : }
1847 [ + - ][ + - ]: 35 : }
1848 : : }
1849 : :
1850 : 26 : void XclImpControlHelper::ProcessControl( const XclImpDrawObjBase& rDrawObj ) const
1851 : : {
1852 [ + - ]: 26 : Reference< XControlModel > xCtrlModel = XclControlHelper::GetControlModel( mxShape );
1853 [ - + ]: 26 : if( !xCtrlModel.is() )
1854 : 26 : return;
1855 : :
1856 [ + - ]: 26 : ApplySheetLinkProps();
1857 : :
1858 [ + - ]: 26 : ScfPropertySet aPropSet( xCtrlModel );
1859 : :
1860 : : // #i51348# set object name at control model
1861 [ + - ][ + - ]: 26 : aPropSet.SetStringProperty( CREATE_OUSTRING( "Name" ), rDrawObj.GetObjName() );
[ + - ][ + - ]
[ + - ]
1862 : :
1863 : : // control visible and printable?
1864 [ + - ][ + - ]: 26 : aPropSet.SetBoolProperty( CREATE_OUSTRING( "EnableVisible" ), rDrawObj.IsVisible() );
1865 [ + - ][ + - ]: 26 : aPropSet.SetBoolProperty( CREATE_OUSTRING( "Printable" ), rDrawObj.IsPrintable() );
1866 : :
1867 : :
1868 : : // virtual call for type specific processing
1869 [ + - ][ + - ]: 26 : DoProcessControl( aPropSet );
[ + - ]
1870 : : }
1871 : :
1872 : 14 : void XclImpControlHelper::ReadCellLinkFormula( XclImpStream& rStrm, bool bWithBoundSize )
1873 : : {
1874 [ + - ]: 14 : ScRangeList aScRanges;
1875 [ + - ]: 14 : ReadRangeList( aScRanges, rStrm, bWithBoundSize );
1876 : : // Use first cell of first range
1877 [ + - ][ + + ]: 14 : if ( !aScRanges.empty() )
1878 : : {
1879 [ + - ]: 3 : const ScRange* pScRange = aScRanges.front();
1880 [ + - ][ + - ]: 3 : mxCellLink.reset( new ScAddress( pScRange->aStart ) );
1881 [ + - ]: 14 : }
1882 : 14 : }
1883 : :
1884 : 41 : void XclImpControlHelper::ReadSourceRangeFormula( XclImpStream& rStrm, bool bWithBoundSize )
1885 : : {
1886 [ + - ]: 41 : ScRangeList aScRanges;
1887 [ + - ]: 41 : ReadRangeList( aScRanges, rStrm, bWithBoundSize );
1888 : : // Use first range
1889 [ + - ][ - + ]: 41 : if ( !aScRanges.empty() )
1890 : : {
1891 [ # # ]: 0 : const ScRange* pScRange = aScRanges.front();
1892 [ # # ][ # # ]: 0 : mxSrcRange.reset( new ScRange( *pScRange ) );
1893 [ + - ]: 41 : }
1894 : 41 : }
1895 : :
1896 : 11 : void XclImpControlHelper::DoProcessControl( ScfPropertySet& ) const
1897 : : {
1898 : 11 : }
1899 : :
1900 : 3 : void XclImpControlHelper::ReadRangeList( ScRangeList& rScRanges, XclImpStream& rStrm )
1901 : : {
1902 [ + - ]: 3 : XclTokenArray aXclTokArr;
1903 [ + - ]: 3 : aXclTokArr.ReadSize( rStrm );
1904 [ + - ]: 3 : rStrm.Ignore( 4 );
1905 [ + - ]: 3 : aXclTokArr.ReadArray( rStrm );
1906 [ + - ][ + - ]: 3 : mrRoot.GetFormulaCompiler().CreateRangeList( rScRanges, EXC_FMLATYPE_CONTROL, aXclTokArr, rStrm );
1907 : 3 : }
1908 : :
1909 : 55 : void XclImpControlHelper::ReadRangeList( ScRangeList& rScRanges, XclImpStream& rStrm, bool bWithBoundSize )
1910 : : {
1911 [ + + ]: 55 : if( bWithBoundSize )
1912 : : {
1913 : : sal_uInt16 nSize;
1914 [ + - ]: 52 : rStrm >> nSize;
1915 [ - + ]: 52 : if( nSize > 0 )
1916 : : {
1917 [ # # ]: 0 : rStrm.PushPosition();
1918 [ # # ]: 0 : ReadRangeList( rScRanges, rStrm );
1919 [ # # ]: 0 : rStrm.PopPosition();
1920 [ # # ]: 52 : rStrm.Ignore( nSize );
1921 : : }
1922 : : }
1923 : : else
1924 : : {
1925 : 3 : ReadRangeList( rScRanges, rStrm );
1926 : : }
1927 : 55 : }
1928 : :
1929 : : // ----------------------------------------------------------------------------
1930 : :
1931 : 45 : XclImpTbxObjBase::XclImpTbxObjBase( const XclImpRoot& rRoot ) :
1932 : : XclImpTextObj( rRoot ),
1933 [ + - ]: 45 : XclImpControlHelper( rRoot, EXC_CTRL_BINDPOSITION )
1934 : : {
1935 : 45 : SetSimpleMacro( false );
1936 : 45 : SetCustomDffObj( true );
1937 : 45 : }
1938 : :
1939 : : namespace {
1940 : :
1941 : 45 : void lclExtractColor( sal_uInt8& rnColorIdx, const DffPropSet& rDffPropSet, sal_uInt32 nPropId )
1942 : : {
1943 [ + + ]: 45 : if( rDffPropSet.IsProperty( nPropId ) )
1944 : : {
1945 : 30 : sal_uInt32 nColor = rDffPropSet.GetPropertyValue( nPropId );
1946 [ + + ]: 30 : if( (nColor & 0xFF000000) == 0x08000000 )
1947 : 27 : rnColorIdx = ::extract_value< sal_uInt8 >( nColor, 0, 8 );
1948 : : }
1949 : 45 : }
1950 : :
1951 : : } // namespace
1952 : :
1953 : 15 : void XclImpTbxObjBase::SetDffProperties( const DffPropSet& rDffPropSet )
1954 : : {
1955 [ - + ]: 15 : maFillData.mnPattern = rDffPropSet.GetPropertyBool( DFF_Prop_fFilled ) ? EXC_PATT_SOLID : EXC_PATT_NONE;
1956 : 15 : lclExtractColor( maFillData.mnBackColorIdx, rDffPropSet, DFF_Prop_fillBackColor );
1957 : 15 : lclExtractColor( maFillData.mnPattColorIdx, rDffPropSet, DFF_Prop_fillColor );
1958 : 15 : ::set_flag( maFillData.mnAuto, EXC_OBJ_LINE_AUTO, false );
1959 : :
1960 [ + + ]: 15 : maLineData.mnStyle = rDffPropSet.GetPropertyBool( DFF_Prop_fLine ) ? EXC_OBJ_LINE_SOLID : EXC_OBJ_LINE_NONE;
1961 : 15 : lclExtractColor( maLineData.mnColorIdx, rDffPropSet, DFF_Prop_lineColor );
1962 : 15 : ::set_flag( maLineData.mnAuto, EXC_OBJ_FILL_AUTO, false );
1963 : 15 : }
1964 : :
1965 : 15 : bool XclImpTbxObjBase::FillMacroDescriptor( ScriptEventDescriptor& rDescriptor ) const
1966 : : {
1967 [ + - ][ + - ]: 15 : return XclControlHelper::FillMacroDescriptor( rDescriptor, DoGetEventType(), GetMacroName(), GetDocShell() );
1968 : : }
1969 : :
1970 : 15 : void XclImpTbxObjBase::ConvertFont( ScfPropertySet& rPropSet ) const
1971 : : {
1972 [ + - ]: 15 : if( maTextData.mxString )
1973 : : {
1974 : 15 : const XclFormatRunVec& rFormatRuns = maTextData.mxString->GetFormats();
1975 [ - + ]: 15 : if( rFormatRuns.empty() )
1976 : 0 : GetFontBuffer().WriteDefaultCtrlFontProperties( rPropSet );
1977 : : else
1978 : 15 : GetFontBuffer().WriteFontProperties( rPropSet, EXC_FONTPROPSET_CONTROL, rFormatRuns.front().mnFontIdx );
1979 : : }
1980 : 15 : }
1981 : :
1982 : 15 : void XclImpTbxObjBase::ConvertLabel( ScfPropertySet& rPropSet ) const
1983 : : {
1984 [ + - ]: 15 : if( maTextData.mxString )
1985 : : {
1986 [ + - ]: 15 : String aLabel = maTextData.mxString->GetText();
1987 [ - + ]: 15 : if( maTextData.maData.mnShortcut > 0 )
1988 : : {
1989 [ # # ]: 0 : xub_StrLen nPos = aLabel.Search( static_cast< sal_Unicode >( maTextData.maData.mnShortcut ) );
1990 [ # # ]: 0 : if( nPos != STRING_NOTFOUND )
1991 [ # # ]: 0 : aLabel.Insert( '~', nPos );
1992 : : }
1993 [ + - ][ + - ]: 15 : rPropSet.SetStringProperty( CREATE_OUSTRING( "Label" ), aLabel );
[ + - ]
1994 : : }
1995 : 15 : ConvertFont( rPropSet );
1996 : 15 : }
1997 : :
1998 : 15 : SdrObject* XclImpTbxObjBase::DoCreateSdrObj( XclImpDffConverter& rDffConv, const Rectangle& rAnchorRect ) const
1999 : : {
2000 [ + - ]: 15 : SdrObjectPtr xSdrObj( rDffConv.CreateSdrObject( *this, rAnchorRect ) );
2001 [ + - ]: 15 : rDffConv.Progress();
2002 [ + - ]: 15 : return xSdrObj.release();
2003 : : }
2004 : :
2005 : 15 : void XclImpTbxObjBase::DoPreProcessSdrObj( XclImpDffConverter& /*rDffConv*/, SdrObject& /*rSdrObj*/ ) const
2006 : : {
2007 : : // do not call DoPreProcessSdrObj() from base class (to skip text processing)
2008 : 15 : ProcessControl( *this );
2009 : 15 : }
2010 : :
2011 : : // ----------------------------------------------------------------------------
2012 : :
2013 : 0 : XclImpButtonObj::XclImpButtonObj( const XclImpRoot& rRoot ) :
2014 : 0 : XclImpTbxObjBase( rRoot )
2015 : : {
2016 : 0 : }
2017 : :
2018 : 0 : void XclImpButtonObj::DoProcessControl( ScfPropertySet& rPropSet ) const
2019 : : {
2020 : : // label and text formatting
2021 [ # # ]: 0 : ConvertLabel( rPropSet );
2022 : :
2023 : : /* Horizontal text alignment. For unknown reason, the property type is a
2024 : : simple sal_Int16 and not a com.sun.star.style.HorizontalAlignment. */
2025 : 0 : sal_Int16 nHorAlign = 1;
2026 [ # # ]: 0 : switch( maTextData.maData.GetHorAlign() )
[ # # # # ]
2027 : : {
2028 : 0 : case EXC_OBJ_HOR_LEFT: nHorAlign = 0; break;
2029 : 0 : case EXC_OBJ_HOR_CENTER: nHorAlign = 1; break;
2030 : 0 : case EXC_OBJ_HOR_RIGHT: nHorAlign = 2; break;
2031 : : }
2032 [ # # ][ # # ]: 0 : rPropSet.SetProperty( CREATE_OUSTRING( "Align" ), nHorAlign );
2033 : :
2034 : : // vertical text alignment
2035 : : namespace csss = ::com::sun::star::style;
2036 : 0 : csss::VerticalAlignment eVerAlign = csss::VerticalAlignment_MIDDLE;
2037 [ # # # # ]: 0 : switch( maTextData.maData.GetVerAlign() )
[ # # ]
2038 : : {
2039 : 0 : case EXC_OBJ_VER_TOP: eVerAlign = csss::VerticalAlignment_TOP; break;
2040 : 0 : case EXC_OBJ_VER_CENTER: eVerAlign = csss::VerticalAlignment_MIDDLE; break;
2041 : 0 : case EXC_OBJ_VER_BOTTOM: eVerAlign = csss::VerticalAlignment_BOTTOM; break;
2042 : : }
2043 [ # # ][ # # ]: 0 : rPropSet.SetProperty( CREATE_OUSTRING( "VerticalAlign" ), eVerAlign );
2044 : :
2045 : : // always wrap text automatically
2046 [ # # ][ # # ]: 0 : rPropSet.SetBoolProperty( CREATE_OUSTRING( "MultiLine" ), true );
2047 : :
2048 : : // default button
2049 : 0 : bool bDefButton = ::get_flag( maTextData.maData.mnButtonFlags, EXC_OBJ_BUTTON_DEFAULT );
2050 [ # # ][ # # ]: 0 : rPropSet.SetBoolProperty( CREATE_OUSTRING( "DefaultButton" ), bDefButton );
2051 : :
2052 : : // button type (flags cannot be combined in OOo)
2053 : : namespace cssa = ::com::sun::star::awt;
2054 : 0 : cssa::PushButtonType eButtonType = cssa::PushButtonType_STANDARD;
2055 [ # # ]: 0 : if( ::get_flag( maTextData.maData.mnButtonFlags, EXC_OBJ_BUTTON_CLOSE ) )
2056 : 0 : eButtonType = cssa::PushButtonType_OK;
2057 [ # # ]: 0 : else if( ::get_flag( maTextData.maData.mnButtonFlags, EXC_OBJ_BUTTON_CANCEL ) )
2058 : 0 : eButtonType = cssa::PushButtonType_CANCEL;
2059 [ # # ]: 0 : else if( ::get_flag( maTextData.maData.mnButtonFlags, EXC_OBJ_BUTTON_HELP ) )
2060 : 0 : eButtonType = cssa::PushButtonType_HELP;
2061 : : // property type is short, not enum
2062 [ # # ][ # # ]: 0 : rPropSet.SetProperty( CREATE_OUSTRING( "PushButtonType" ), sal_Int16( eButtonType ) );
2063 : 0 : }
2064 : :
2065 : 0 : OUString XclImpButtonObj::DoGetServiceName() const
2066 : : {
2067 : 0 : return CREATE_OUSTRING( "com.sun.star.form.component.CommandButton" );
2068 : : }
2069 : :
2070 : 0 : XclTbxEventType XclImpButtonObj::DoGetEventType() const
2071 : : {
2072 : 0 : return EXC_TBX_EVENT_ACTION;
2073 : : }
2074 : :
2075 : : // ----------------------------------------------------------------------------
2076 : :
2077 : 12 : XclImpCheckBoxObj::XclImpCheckBoxObj( const XclImpRoot& rRoot ) :
2078 : : XclImpTbxObjBase( rRoot ),
2079 : : mnState( EXC_OBJ_CHECKBOX_UNCHECKED ),
2080 : 12 : mnCheckBoxFlags( 0 )
2081 : : {
2082 : 12 : }
2083 : :
2084 : 0 : void XclImpCheckBoxObj::DoReadObj5( XclImpStream& rStrm, sal_uInt16 nNameLen, sal_uInt16 /*nMacroSize*/ )
2085 : : {
2086 : 0 : ReadFrameData( rStrm );
2087 : 0 : rStrm.Ignore( 10 );
2088 : 0 : rStrm >> maTextData.maData.mnFlags;
2089 : 0 : rStrm.Ignore( 20 );
2090 : 0 : ReadName5( rStrm, nNameLen );
2091 : 0 : ReadMacro5( rStrm, rStrm.ReaduInt16() ); // fist macro size invalid and unused
2092 : 0 : ReadCellLinkFormula( rStrm, true );
2093 : 0 : rStrm >> maTextData.maData.mnTextLen;
2094 : 0 : maTextData.ReadByteString( rStrm );
2095 : 0 : rStrm >> mnState >> maTextData.maData.mnShortcut >> maTextData.maData.mnShortcutEA >> mnCheckBoxFlags;
2096 : 0 : }
2097 : :
2098 : 51 : void XclImpCheckBoxObj::DoReadObj8SubRec( XclImpStream& rStrm, sal_uInt16 nSubRecId, sal_uInt16 nSubRecSize )
2099 : : {
2100 [ + + + ]: 51 : switch( nSubRecId )
2101 : : {
2102 : : case EXC_ID_OBJCBLS:
2103 : : // do not read EXC_ID_OBJCBLSDATA, not written by OOo Excel export
2104 : 12 : rStrm >> mnState;
2105 : 12 : rStrm.Ignore( 4 );
2106 : 12 : rStrm >> maTextData.maData.mnShortcut >> maTextData.maData.mnShortcutEA >> mnCheckBoxFlags;
2107 : 12 : break;
2108 : : case EXC_ID_OBJCBLSFMLA:
2109 : 3 : ReadCellLinkFormula( rStrm, false );
2110 : 3 : break;
2111 : : default:
2112 : 36 : XclImpTbxObjBase::DoReadObj8SubRec( rStrm, nSubRecId, nSubRecSize );
2113 : : }
2114 : 51 : }
2115 : :
2116 : 12 : void XclImpCheckBoxObj::DoProcessControl( ScfPropertySet& rPropSet ) const
2117 : : {
2118 : : // label and text formatting
2119 [ + - ]: 12 : ConvertLabel( rPropSet );
2120 : :
2121 : : // state
2122 : 12 : bool bSupportsTristate = GetObjType() == EXC_OBJTYPE_CHECKBOX;
2123 : 12 : sal_Int16 nApiState = 0;
2124 [ + + - - ]: 12 : switch( mnState )
2125 : : {
2126 : 9 : case EXC_OBJ_CHECKBOX_UNCHECKED: nApiState = 0; break;
2127 : 3 : case EXC_OBJ_CHECKBOX_CHECKED: nApiState = 1; break;
2128 [ # # ]: 0 : case EXC_OBJ_CHECKBOX_TRISTATE: nApiState = bSupportsTristate ? 2 : 1; break;
2129 : : }
2130 [ - + ]: 12 : if( bSupportsTristate )
2131 [ # # ][ # # ]: 0 : rPropSet.SetBoolProperty( CREATE_OUSTRING( "TriState" ), nApiState == 2 );
2132 [ + - ][ + - ]: 12 : rPropSet.SetProperty( CREATE_OUSTRING( "DefaultState" ), nApiState );
2133 : :
2134 : : // box style
2135 : : namespace AwtVisualEffect = ::com::sun::star::awt::VisualEffect;
2136 : 12 : sal_Int16 nEffect = ::get_flagvalue( mnCheckBoxFlags, EXC_OBJ_CHECKBOX_FLAT, AwtVisualEffect::FLAT, AwtVisualEffect::LOOK3D );
2137 [ + - ][ + - ]: 12 : rPropSet.SetProperty( CREATE_OUSTRING( "VisualEffect" ), nEffect );
2138 : :
2139 : : // do not wrap text automatically
2140 [ + - ][ + - ]: 12 : rPropSet.SetBoolProperty( CREATE_OUSTRING( "MultiLine" ), false );
2141 : :
2142 : : // #i40279# always centered vertically
2143 : : namespace csss = ::com::sun::star::style;
2144 [ + - ][ + - ]: 12 : rPropSet.SetProperty( CREATE_OUSTRING( "VerticalAlign" ), csss::VerticalAlignment_MIDDLE );
2145 : :
2146 : : // background color
2147 [ - + ][ + - ]: 12 : if( maFillData.IsFilled() )
2148 : : {
2149 [ # # ]: 0 : sal_Int32 nColor = static_cast< sal_Int32 >( GetSolidFillColor( maFillData ).GetColor() );
2150 [ # # ][ # # ]: 0 : rPropSet.SetProperty( CREATE_OUSTRING( "BackgroundColor" ), nColor );
2151 : : }
2152 : 12 : }
2153 : :
2154 : 0 : OUString XclImpCheckBoxObj::DoGetServiceName() const
2155 : : {
2156 : 0 : return CREATE_OUSTRING( "com.sun.star.form.component.CheckBox" );
2157 : : }
2158 : :
2159 : 0 : XclTbxEventType XclImpCheckBoxObj::DoGetEventType() const
2160 : : {
2161 : 0 : return EXC_TBX_EVENT_ACTION;
2162 : : }
2163 : :
2164 : : // ----------------------------------------------------------------------------
2165 : :
2166 : 12 : XclImpOptionButtonObj::XclImpOptionButtonObj( const XclImpRoot& rRoot ) :
2167 : : XclImpCheckBoxObj( rRoot ),
2168 : : mnNextInGroup( 0 ),
2169 : 12 : mnFirstInGroup( 1 )
2170 : : {
2171 : 12 : }
2172 : :
2173 : 0 : void XclImpOptionButtonObj::DoReadObj5( XclImpStream& rStrm, sal_uInt16 nNameLen, sal_uInt16 /*nMacroSize*/ )
2174 : : {
2175 : 0 : ReadFrameData( rStrm );
2176 : 0 : rStrm.Ignore( 10 );
2177 : 0 : rStrm >> maTextData.maData.mnFlags;
2178 : 0 : rStrm.Ignore( 32 );
2179 : 0 : ReadName5( rStrm, nNameLen );
2180 : 0 : ReadMacro5( rStrm, rStrm.ReaduInt16() ); // fist macro size invalid and unused
2181 : 0 : ReadCellLinkFormula( rStrm, true );
2182 : 0 : rStrm >> maTextData.maData.mnTextLen;
2183 : 0 : maTextData.ReadByteString( rStrm );
2184 : 0 : rStrm >> mnState >> maTextData.maData.mnShortcut >> maTextData.maData.mnShortcutEA;
2185 : 0 : rStrm >> mnCheckBoxFlags >> mnNextInGroup >> mnFirstInGroup;
2186 : 0 : }
2187 : :
2188 : 63 : void XclImpOptionButtonObj::DoReadObj8SubRec( XclImpStream& rStrm, sal_uInt16 nSubRecId, sal_uInt16 nSubRecSize )
2189 : : {
2190 [ + + ]: 63 : switch( nSubRecId )
2191 : : {
2192 : : case EXC_ID_OBJRBODATA:
2193 : 12 : rStrm >> mnNextInGroup >> mnFirstInGroup;
2194 : 12 : break;
2195 : : default:
2196 : 51 : XclImpCheckBoxObj::DoReadObj8SubRec( rStrm, nSubRecId, nSubRecSize );
2197 : : }
2198 : 63 : }
2199 : :
2200 : 12 : void XclImpOptionButtonObj::DoProcessControl( ScfPropertySet& rPropSet ) const
2201 : : {
2202 : 12 : XclImpCheckBoxObj::DoProcessControl( rPropSet );
2203 : : // TODO: grouping
2204 [ - + ]: 12 : XclImpOptionButtonObj* pTbxObj = dynamic_cast< XclImpOptionButtonObj* >( GetObjectManager().GetSheetDrawing( GetTab() ).FindDrawObj( mnNextInGroup ).get() );
2205 [ + + ][ + - ]: 12 : if ( ( pTbxObj && pTbxObj->mnFirstInGroup ) )
2206 : : {
2207 : : // Group has terminated
2208 : : // traverse each RadioButton in group and
2209 : : // a) apply the groupname
2210 : : // b) propagate the linked cell from the lead radiobutton
2211 : : // c) apply the correct Ref value
2212 : 3 : XclImpOptionButtonObj* pLeader = pTbxObj;
2213 : : ;
2214 : 3 : sal_Int32 nRefVal = 1;
2215 : : OSL_TRACE( "0x%x start group ", pLeader->GetObjId()/*.mnObjId */);
2216 [ + + ][ + + ]: 12 : do
[ + - ]
2217 : : {
2218 : :
2219 [ + - ]: 12 : Reference< XControlModel > xCtrlModel = XclControlHelper::GetControlModel( pTbxObj->mxShape );
2220 [ + - ]: 12 : if ( xCtrlModel.is() )
2221 : : {
2222 [ + - ]: 12 : ScfPropertySet aProps( xCtrlModel );
2223 : 12 : rtl::OUString sGroupName = rtl::OUString::valueOf( static_cast< sal_Int32 >( pLeader->GetDffShapeId() ) );
2224 : :
2225 [ + - ][ + - ]: 12 : aProps.SetStringProperty( CREATE_OUSTRING( "GroupName" ), sGroupName );
[ + - ][ + - ]
2226 [ + - ][ + - ]: 12 : aProps.SetStringProperty( CREATE_OUSTRING( "RefValue" ), rtl::OUString::valueOf( nRefVal++ ) );
[ + - ][ + - ]
2227 [ + - ][ + - ]: 12 : if ( pLeader->HasCellLink() && !pTbxObj->HasCellLink() )
[ + + ][ + + ]
[ + - ]
2228 : : {
2229 : : // propagate cell link info
2230 [ + - ][ + - ]: 9 : pTbxObj->mxCellLink.reset( new ScAddress( *pLeader->mxCellLink.get() ) );
2231 [ + - ]: 9 : pTbxObj->ApplySheetLinkProps();
2232 : : }
2233 [ + - ][ + - ]: 12 : pTbxObj = dynamic_cast< XclImpOptionButtonObj* >( GetObjectManager().GetSheetDrawing( GetTab() ).FindDrawObj( pTbxObj->mnNextInGroup ).get() );
[ + - ][ - + ]
[ + - ][ + - ]
2234 : : }
2235 : : else
2236 : 12 : pTbxObj = NULL;
2237 : 12 : } while ( pTbxObj && !( pTbxObj->mnFirstInGroup == 1 ) );
2238 : : }
2239 : : else
2240 : : {
2241 : : // not the leader? try and find it
2242 : : }
2243 : 12 : }
2244 : :
2245 : 12 : OUString XclImpOptionButtonObj::DoGetServiceName() const
2246 : : {
2247 : 12 : return CREATE_OUSTRING( "com.sun.star.form.component.RadioButton" );
2248 : : }
2249 : :
2250 : 12 : XclTbxEventType XclImpOptionButtonObj::DoGetEventType() const
2251 : : {
2252 : 12 : return EXC_TBX_EVENT_ACTION;
2253 : : }
2254 : :
2255 : : // ----------------------------------------------------------------------------
2256 : :
2257 : 0 : XclImpLabelObj::XclImpLabelObj( const XclImpRoot& rRoot ) :
2258 : 0 : XclImpTbxObjBase( rRoot )
2259 : : {
2260 : 0 : }
2261 : :
2262 : 0 : void XclImpLabelObj::DoProcessControl( ScfPropertySet& rPropSet ) const
2263 : : {
2264 : : // label and text formatting
2265 : 0 : ConvertLabel( rPropSet );
2266 : :
2267 : : // text alignment (always top/left aligned)
2268 [ # # ][ # # ]: 0 : rPropSet.SetProperty( CREATE_OUSTRING( "Align" ), sal_Int16( 0 ) );
2269 : : namespace csss = ::com::sun::star::style;
2270 [ # # ][ # # ]: 0 : rPropSet.SetProperty( CREATE_OUSTRING( "VerticalAlign" ), csss::VerticalAlignment_TOP );
2271 : :
2272 : : // always wrap text automatically
2273 [ # # ]: 0 : rPropSet.SetBoolProperty( CREATE_OUSTRING( "MultiLine" ), true );
2274 : 0 : }
2275 : :
2276 : 0 : OUString XclImpLabelObj::DoGetServiceName() const
2277 : : {
2278 : 0 : return CREATE_OUSTRING( "com.sun.star.form.component.FixedText" );
2279 : : }
2280 : :
2281 : 0 : XclTbxEventType XclImpLabelObj::DoGetEventType() const
2282 : : {
2283 : 0 : return EXC_TBX_EVENT_MOUSE;
2284 : : }
2285 : :
2286 : : // ----------------------------------------------------------------------------
2287 : :
2288 : 3 : XclImpGroupBoxObj::XclImpGroupBoxObj( const XclImpRoot& rRoot ) :
2289 : : XclImpTbxObjBase( rRoot ),
2290 : 3 : mnGroupBoxFlags( 0 )
2291 : : {
2292 : 3 : }
2293 : :
2294 : 0 : void XclImpGroupBoxObj::DoReadObj5( XclImpStream& rStrm, sal_uInt16 nNameLen, sal_uInt16 /*nMacroSize*/ )
2295 : : {
2296 : 0 : ReadFrameData( rStrm );
2297 : 0 : rStrm.Ignore( 10 );
2298 : 0 : rStrm >> maTextData.maData.mnFlags;
2299 : 0 : rStrm.Ignore( 26 );
2300 : 0 : ReadName5( rStrm, nNameLen );
2301 : 0 : ReadMacro5( rStrm, rStrm.ReaduInt16() ); // fist macro size invalid and unused
2302 : 0 : rStrm >> maTextData.maData.mnTextLen;
2303 : 0 : maTextData.ReadByteString( rStrm );
2304 : 0 : rStrm >> maTextData.maData.mnShortcut >> maTextData.maData.mnShortcutEA >> mnGroupBoxFlags;
2305 : 0 : }
2306 : :
2307 : 6 : void XclImpGroupBoxObj::DoReadObj8SubRec( XclImpStream& rStrm, sal_uInt16 nSubRecId, sal_uInt16 nSubRecSize )
2308 : : {
2309 [ + + ]: 6 : switch( nSubRecId )
2310 : : {
2311 : : case EXC_ID_OBJGBODATA:
2312 : 3 : rStrm >> maTextData.maData.mnShortcut >> maTextData.maData.mnShortcutEA >> mnGroupBoxFlags;
2313 : 3 : break;
2314 : : default:
2315 : 3 : XclImpTbxObjBase::DoReadObj8SubRec( rStrm, nSubRecId, nSubRecSize );
2316 : : }
2317 : 6 : }
2318 : :
2319 : 3 : void XclImpGroupBoxObj::DoProcessControl( ScfPropertySet& rPropSet ) const
2320 : : {
2321 : : // label and text formatting
2322 : 3 : ConvertLabel( rPropSet );
2323 : 3 : }
2324 : :
2325 : 3 : OUString XclImpGroupBoxObj::DoGetServiceName() const
2326 : : {
2327 : 3 : return CREATE_OUSTRING( "com.sun.star.form.component.GroupBox" );
2328 : : }
2329 : :
2330 : 3 : XclTbxEventType XclImpGroupBoxObj::DoGetEventType() const
2331 : : {
2332 : 3 : return EXC_TBX_EVENT_MOUSE;
2333 : : }
2334 : :
2335 : : // ----------------------------------------------------------------------------
2336 : :
2337 : 0 : XclImpDialogObj::XclImpDialogObj( const XclImpRoot& rRoot ) :
2338 : 0 : XclImpTbxObjBase( rRoot )
2339 : : {
2340 : 0 : }
2341 : :
2342 : 0 : void XclImpDialogObj::DoProcessControl( ScfPropertySet& rPropSet ) const
2343 : : {
2344 : : // label and text formatting
2345 : 0 : ConvertLabel( rPropSet );
2346 : 0 : }
2347 : :
2348 : 0 : OUString XclImpDialogObj::DoGetServiceName() const
2349 : : {
2350 : : // dialog frame faked by a groupbox
2351 : 0 : return CREATE_OUSTRING( "com.sun.star.form.component.GroupBox" );
2352 : : }
2353 : :
2354 : 0 : XclTbxEventType XclImpDialogObj::DoGetEventType() const
2355 : : {
2356 : 0 : return EXC_TBX_EVENT_MOUSE;
2357 : : }
2358 : :
2359 : : // ----------------------------------------------------------------------------
2360 : :
2361 : 0 : XclImpEditObj::XclImpEditObj( const XclImpRoot& rRoot ) :
2362 : : XclImpTbxObjBase( rRoot ),
2363 : : mnContentType( EXC_OBJ_EDIT_TEXT ),
2364 : : mnMultiLine( 0 ),
2365 : : mnScrollBar( 0 ),
2366 : 0 : mnListBoxObjId( 0 )
2367 : : {
2368 : 0 : }
2369 : :
2370 : 0 : bool XclImpEditObj::IsNumeric() const
2371 : : {
2372 [ # # ][ # # ]: 0 : return (mnContentType == EXC_OBJ_EDIT_INTEGER) || (mnContentType == EXC_OBJ_EDIT_DOUBLE);
2373 : : }
2374 : :
2375 : 0 : void XclImpEditObj::DoReadObj5( XclImpStream& rStrm, sal_uInt16 nNameLen, sal_uInt16 /*nMacroSize*/ )
2376 : : {
2377 : 0 : ReadFrameData( rStrm );
2378 : 0 : rStrm.Ignore( 10 );
2379 : 0 : rStrm >> maTextData.maData.mnFlags;
2380 : 0 : rStrm.Ignore( 14 );
2381 : 0 : ReadName5( rStrm, nNameLen );
2382 : 0 : ReadMacro5( rStrm, rStrm.ReaduInt16() ); // fist macro size invalid and unused
2383 : 0 : rStrm >> maTextData.maData.mnTextLen;
2384 : 0 : maTextData.ReadByteString( rStrm );
2385 : 0 : rStrm >> mnContentType >> mnMultiLine >> mnScrollBar >> mnListBoxObjId;
2386 : 0 : }
2387 : :
2388 : 0 : void XclImpEditObj::DoReadObj8SubRec( XclImpStream& rStrm, sal_uInt16 nSubRecId, sal_uInt16 nSubRecSize )
2389 : : {
2390 [ # # ]: 0 : switch( nSubRecId )
2391 : : {
2392 : : case EXC_ID_OBJEDODATA:
2393 : 0 : rStrm >> mnContentType >> mnMultiLine >> mnScrollBar >> mnListBoxObjId;
2394 : 0 : break;
2395 : : default:
2396 : 0 : XclImpTbxObjBase::DoReadObj8SubRec( rStrm, nSubRecId, nSubRecSize );
2397 : : }
2398 : 0 : }
2399 : :
2400 : 0 : void XclImpEditObj::DoProcessControl( ScfPropertySet& rPropSet ) const
2401 : : {
2402 [ # # ]: 0 : if( maTextData.mxString )
2403 : : {
2404 [ # # ]: 0 : OUString aText = maTextData.mxString->GetText();
2405 [ # # ]: 0 : if( IsNumeric() )
2406 : : {
2407 : : // TODO: OUString::toDouble() does not handle local decimal separator
2408 [ # # ][ # # ]: 0 : rPropSet.SetProperty( CREATE_OUSTRING( "DefaultValue" ), aText.toDouble() );
2409 [ # # ][ # # ]: 0 : rPropSet.SetBoolProperty( CREATE_OUSTRING( "Spin" ), mnScrollBar != 0 );
2410 : : }
2411 : : else
2412 : : {
2413 [ # # ][ # # ]: 0 : rPropSet.SetProperty( CREATE_OUSTRING( "DefaultText" ), aText );
2414 [ # # ][ # # ]: 0 : rPropSet.SetBoolProperty( CREATE_OUSTRING( "MultiLine" ), mnMultiLine != 0 );
2415 [ # # ][ # # ]: 0 : rPropSet.SetBoolProperty( CREATE_OUSTRING( "VScroll" ), mnScrollBar != 0 );
2416 : 0 : }
2417 : : }
2418 : 0 : ConvertFont( rPropSet );
2419 : 0 : }
2420 : :
2421 : 0 : OUString XclImpEditObj::DoGetServiceName() const
2422 : : {
2423 : 0 : return IsNumeric() ?
2424 : : CREATE_OUSTRING( "com.sun.star.form.component.NumericField" ) :
2425 [ # # ]: 0 : CREATE_OUSTRING( "com.sun.star.form.component.TextField" );
2426 : : }
2427 : :
2428 : 0 : XclTbxEventType XclImpEditObj::DoGetEventType() const
2429 : : {
2430 : 0 : return EXC_TBX_EVENT_TEXT;
2431 : : }
2432 : :
2433 : : // ----------------------------------------------------------------------------
2434 : :
2435 : 30 : XclImpTbxObjScrollableBase::XclImpTbxObjScrollableBase( const XclImpRoot& rRoot ) :
2436 : : XclImpTbxObjBase( rRoot ),
2437 : : mnValue( 0 ),
2438 : : mnMin( 0 ),
2439 : : mnMax( 100 ),
2440 : : mnStep( 1 ),
2441 : : mnPageStep( 10 ),
2442 : : mnOrient( 0 ),
2443 : : mnThumbWidth( 1 ),
2444 : 30 : mnScrollFlags( 0 )
2445 : : {
2446 : 30 : }
2447 : :
2448 : 30 : void XclImpTbxObjScrollableBase::ReadSbs( XclImpStream& rStrm )
2449 : : {
2450 : 30 : rStrm.Ignore( 4 );
2451 : 30 : rStrm >> mnValue >> mnMin >> mnMax >> mnStep >> mnPageStep >> mnOrient >> mnThumbWidth >> mnScrollFlags;
2452 : 30 : }
2453 : :
2454 : 60 : void XclImpTbxObjScrollableBase::DoReadObj8SubRec( XclImpStream& rStrm, sal_uInt16 nSubRecId, sal_uInt16 nSubRecSize )
2455 : : {
2456 [ + - + ]: 60 : switch( nSubRecId )
2457 : : {
2458 : : case EXC_ID_OBJSBS:
2459 : 30 : ReadSbs( rStrm );
2460 : 30 : break;
2461 : : case EXC_ID_OBJSBSFMLA:
2462 : 0 : ReadCellLinkFormula( rStrm, false );
2463 : 0 : break;
2464 : : default:
2465 : 30 : XclImpTbxObjBase::DoReadObj8SubRec( rStrm, nSubRecId, nSubRecSize );
2466 : : }
2467 : 60 : }
2468 : :
2469 : : // ----------------------------------------------------------------------------
2470 : :
2471 : 0 : XclImpSpinButtonObj::XclImpSpinButtonObj( const XclImpRoot& rRoot ) :
2472 : 0 : XclImpTbxObjScrollableBase( rRoot )
2473 : : {
2474 : 0 : }
2475 : :
2476 : 0 : void XclImpSpinButtonObj::DoReadObj5( XclImpStream& rStrm, sal_uInt16 nNameLen, sal_uInt16 /*nMacroSize*/ )
2477 : : {
2478 : 0 : ReadFrameData( rStrm );
2479 : 0 : ReadSbs( rStrm );
2480 : 0 : ReadName5( rStrm, nNameLen );
2481 : 0 : ReadMacro5( rStrm, rStrm.ReaduInt16() ); // fist macro size invalid and unused
2482 : 0 : ReadCellLinkFormula( rStrm, true );
2483 : 0 : }
2484 : :
2485 : 0 : void XclImpSpinButtonObj::DoProcessControl( ScfPropertySet& rPropSet ) const
2486 : : {
2487 : : // Calc's "Border" property is not the 3D/flat style effect in Excel (#i34712#)
2488 [ # # ]: 0 : rPropSet.SetProperty( CREATE_OUSTRING( "Border" ), ::com::sun::star::awt::VisualEffect::NONE );
2489 [ # # ][ # # ]: 0 : rPropSet.SetProperty< sal_Int32 >( CREATE_OUSTRING( "DefaultSpinValue" ), mnValue );
2490 [ # # ][ # # ]: 0 : rPropSet.SetProperty< sal_Int32 >( CREATE_OUSTRING( "SpinValueMin" ), mnMin );
2491 [ # # ][ # # ]: 0 : rPropSet.SetProperty< sal_Int32 >( CREATE_OUSTRING( "SpinValueMax" ), mnMax );
2492 [ # # ][ # # ]: 0 : rPropSet.SetProperty< sal_Int32 >( CREATE_OUSTRING( "SpinIncrement" ), mnStep );
2493 : :
2494 : : // Excel spin buttons always vertical
2495 [ # # ]: 0 : rPropSet.SetProperty( CREATE_OUSTRING( "Orientation" ), ::com::sun::star::awt::ScrollBarOrientation::VERTICAL );
2496 : 0 : }
2497 : :
2498 : 0 : OUString XclImpSpinButtonObj::DoGetServiceName() const
2499 : : {
2500 : 0 : return CREATE_OUSTRING( "com.sun.star.form.component.SpinButton" );
2501 : : }
2502 : :
2503 : 0 : XclTbxEventType XclImpSpinButtonObj::DoGetEventType() const
2504 : : {
2505 : 0 : return EXC_TBX_EVENT_VALUE;
2506 : : }
2507 : :
2508 : : // ----------------------------------------------------------------------------
2509 : :
2510 : 0 : XclImpScrollBarObj::XclImpScrollBarObj( const XclImpRoot& rRoot ) :
2511 : 0 : XclImpTbxObjScrollableBase( rRoot )
2512 : : {
2513 : 0 : }
2514 : :
2515 : 0 : void XclImpScrollBarObj::DoReadObj5( XclImpStream& rStrm, sal_uInt16 nNameLen, sal_uInt16 /*nMacroSize*/ )
2516 : : {
2517 : 0 : ReadFrameData( rStrm );
2518 : 0 : ReadSbs( rStrm );
2519 : 0 : ReadName5( rStrm, nNameLen );
2520 : 0 : ReadMacro5( rStrm, rStrm.ReaduInt16() ); // fist macro size invalid and unused
2521 : 0 : ReadCellLinkFormula( rStrm, true );
2522 : 0 : }
2523 : :
2524 : 0 : void XclImpScrollBarObj::DoProcessControl( ScfPropertySet& rPropSet ) const
2525 : : {
2526 : : // Calc's "Border" property is not the 3D/flat style effect in Excel (#i34712#)
2527 [ # # ][ # # ]: 0 : rPropSet.SetProperty( CREATE_OUSTRING( "Border" ), ::com::sun::star::awt::VisualEffect::NONE );
2528 [ # # ][ # # ]: 0 : rPropSet.SetProperty< sal_Int32 >( CREATE_OUSTRING( "DefaultScrollValue" ), mnValue );
2529 [ # # ][ # # ]: 0 : rPropSet.SetProperty< sal_Int32 >( CREATE_OUSTRING( "ScrollValueMin" ), mnMin );
2530 [ # # ][ # # ]: 0 : rPropSet.SetProperty< sal_Int32 >( CREATE_OUSTRING( "ScrollValueMax" ), mnMax );
2531 [ # # ][ # # ]: 0 : rPropSet.SetProperty< sal_Int32 >( CREATE_OUSTRING( "LineIncrement" ), mnStep );
2532 [ # # ][ # # ]: 0 : rPropSet.SetProperty< sal_Int32 >( CREATE_OUSTRING( "BlockIncrement" ), mnPageStep );
2533 [ # # ][ # # ]: 0 : rPropSet.SetProperty( CREATE_OUSTRING( "VisibleSize" ), ::std::min< sal_Int32 >( mnPageStep, 1 ) );
[ # # ]
2534 : :
2535 : : namespace AwtScrollOrient = ::com::sun::star::awt::ScrollBarOrientation;
2536 : 0 : sal_Int32 nApiOrient = ::get_flagvalue( mnOrient, EXC_OBJ_SCROLLBAR_HOR, AwtScrollOrient::HORIZONTAL, AwtScrollOrient::VERTICAL );
2537 [ # # ][ # # ]: 0 : rPropSet.SetProperty( CREATE_OUSTRING( "Orientation" ), nApiOrient );
2538 : 0 : }
2539 : :
2540 : 0 : OUString XclImpScrollBarObj::DoGetServiceName() const
2541 : : {
2542 : 0 : return CREATE_OUSTRING( "com.sun.star.form.component.ScrollBar" );
2543 : : }
2544 : :
2545 : 0 : XclTbxEventType XclImpScrollBarObj::DoGetEventType() const
2546 : : {
2547 : 0 : return EXC_TBX_EVENT_VALUE;
2548 : : }
2549 : :
2550 : : // ----------------------------------------------------------------------------
2551 : :
2552 : 30 : XclImpTbxObjListBase::XclImpTbxObjListBase( const XclImpRoot& rRoot ) :
2553 : : XclImpTbxObjScrollableBase( rRoot ),
2554 : : mnEntryCount( 0 ),
2555 : : mnSelEntry( 0 ),
2556 : : mnListFlags( 0 ),
2557 : : mnEditObjId( 0 ),
2558 : 30 : mbHasDefFontIdx( false )
2559 : : {
2560 : 30 : }
2561 : :
2562 : 30 : void XclImpTbxObjListBase::ReadLbsData( XclImpStream& rStrm )
2563 : : {
2564 : 30 : ReadSourceRangeFormula( rStrm, true );
2565 : 30 : rStrm >> mnEntryCount >> mnSelEntry >> mnListFlags >> mnEditObjId;
2566 : 30 : }
2567 : :
2568 : 0 : void XclImpTbxObjListBase::SetBoxFormatting( ScfPropertySet& rPropSet ) const
2569 : : {
2570 : : // border style
2571 : : namespace AwtVisualEffect = ::com::sun::star::awt::VisualEffect;
2572 : 0 : sal_Int16 nApiBorder = ::get_flagvalue( mnListFlags, EXC_OBJ_LISTBOX_FLAT, AwtVisualEffect::FLAT, AwtVisualEffect::LOOK3D );
2573 [ # # ][ # # ]: 0 : rPropSet.SetProperty( CREATE_OUSTRING( "Border" ), nApiBorder );
2574 : :
2575 : : // font formatting
2576 [ # # ]: 0 : if( mbHasDefFontIdx )
2577 [ # # ][ # # ]: 0 : GetFontBuffer().WriteFontProperties( rPropSet, EXC_FONTPROPSET_CONTROL, maTextData.maData.mnDefFontIdx );
2578 : : else
2579 [ # # ][ # # ]: 0 : GetFontBuffer().WriteDefaultCtrlFontProperties( rPropSet );
2580 : 0 : }
2581 : :
2582 : : // ----------------------------------------------------------------------------
2583 : :
2584 : 0 : XclImpListBoxObj::XclImpListBoxObj( const XclImpRoot& rRoot ) :
2585 [ # # ]: 0 : XclImpTbxObjListBase( rRoot )
2586 : : {
2587 : 0 : }
2588 : :
2589 : 0 : void XclImpListBoxObj::ReadFullLbsData( XclImpStream& rStrm, sal_Size nRecLeft )
2590 : : {
2591 : 0 : sal_Size nRecEnd = rStrm.GetRecPos() + nRecLeft;
2592 : 0 : ReadLbsData( rStrm );
2593 : : OSL_ENSURE( (rStrm.GetRecPos() == nRecEnd) || (rStrm.GetRecPos() + mnEntryCount == nRecEnd),
2594 : : "XclImpListBoxObj::ReadFullLbsData - invalid size of OBJLBSDATA record" );
2595 [ # # ][ # # ]: 0 : while( rStrm.IsValid() && (rStrm.GetRecPos() < nRecEnd) )
[ # # ]
2596 [ # # ]: 0 : maSelection.push_back( rStrm.ReaduInt8() );
2597 : 0 : }
2598 : :
2599 : 0 : void XclImpListBoxObj::DoReadObj5( XclImpStream& rStrm, sal_uInt16 nNameLen, sal_uInt16 /*nMacroSize*/ )
2600 : : {
2601 : 0 : ReadFrameData( rStrm );
2602 : 0 : ReadSbs( rStrm );
2603 : 0 : rStrm.Ignore( 18 );
2604 : 0 : rStrm >> maTextData.maData.mnDefFontIdx;
2605 : 0 : rStrm.Ignore( 4 );
2606 : 0 : ReadName5( rStrm, nNameLen );
2607 : 0 : ReadMacro5( rStrm, rStrm.ReaduInt16() ); // fist macro size invalid and unused
2608 : 0 : ReadCellLinkFormula( rStrm, true );
2609 : 0 : ReadFullLbsData( rStrm, rStrm.GetRecLeft() );
2610 : 0 : mbHasDefFontIdx = true;
2611 : 0 : }
2612 : :
2613 : 0 : void XclImpListBoxObj::DoReadObj8SubRec( XclImpStream& rStrm, sal_uInt16 nSubRecId, sal_uInt16 nSubRecSize )
2614 : : {
2615 [ # # ]: 0 : switch( nSubRecId )
2616 : : {
2617 : : case EXC_ID_OBJLBSDATA:
2618 : 0 : ReadFullLbsData( rStrm, nSubRecSize );
2619 : 0 : break;
2620 : : default:
2621 : 0 : XclImpTbxObjListBase::DoReadObj8SubRec( rStrm, nSubRecId, nSubRecSize );
2622 : : }
2623 : 0 : }
2624 : :
2625 : 0 : void XclImpListBoxObj::DoProcessControl( ScfPropertySet& rPropSet ) const
2626 : : {
2627 : : // listbox formatting
2628 : 0 : SetBoxFormatting( rPropSet );
2629 : :
2630 : : // selection type
2631 : 0 : sal_uInt8 nSelType = ::extract_value< sal_uInt8 >( mnListFlags, 4, 2 );
2632 : 0 : bool bMultiSel = nSelType != EXC_OBJ_LISTBOX_SINGLE;
2633 [ # # ]: 0 : rPropSet.SetBoolProperty( CREATE_OUSTRING( "MultiSelection" ), bMultiSel );
2634 : :
2635 : : // selection (do not set, if listbox is linked to a cell)
2636 [ # # ]: 0 : if( !HasCellLink() )
2637 : : {
2638 [ # # ]: 0 : ScfInt16Vec aSelVec;
2639 : :
2640 : : // multi selection: API expects sequence of list entry indexes
2641 [ # # ]: 0 : if( bMultiSel )
2642 : : {
2643 [ # # ][ # # ]: 0 : for( ScfUInt8Vec::const_iterator aBeg = maSelection.begin(), aIt = aBeg, aEnd = maSelection.end(); aIt != aEnd; ++aIt )
[ # # ]
2644 [ # # ][ # # ]: 0 : if( *aIt != 0 )
2645 [ # # ][ # # ]: 0 : aSelVec.push_back( static_cast< sal_Int16 >( aIt - aBeg ) );
2646 : : }
2647 : : // single selection: mnSelEntry is one-based, API expects zero-based
2648 [ # # ]: 0 : else if( mnSelEntry > 0 )
2649 [ # # ]: 0 : aSelVec.push_back( static_cast< sal_Int16 >( mnSelEntry - 1 ) );
2650 : :
2651 [ # # ]: 0 : if( !aSelVec.empty() )
2652 : : {
2653 [ # # ][ # # ]: 0 : Sequence< sal_Int16 > aSelSeq( &aSelVec.front(), static_cast< sal_Int32 >( aSelVec.size() ) );
2654 [ # # ][ # # ]: 0 : rPropSet.SetProperty( CREATE_OUSTRING( "DefaultSelection" ), aSelSeq );
[ # # ]
2655 : 0 : }
2656 : : }
2657 : 0 : }
2658 : :
2659 : 0 : OUString XclImpListBoxObj::DoGetServiceName() const
2660 : : {
2661 : 0 : return CREATE_OUSTRING( "com.sun.star.form.component.ListBox" );
2662 : : }
2663 : :
2664 : 0 : XclTbxEventType XclImpListBoxObj::DoGetEventType() const
2665 : : {
2666 : 0 : return EXC_TBX_EVENT_CHANGE;
2667 : : }
2668 : :
2669 : : // ----------------------------------------------------------------------------
2670 : :
2671 : 30 : XclImpDropDownObj::XclImpDropDownObj( const XclImpRoot& rRoot ) :
2672 : : XclImpTbxObjListBase( rRoot ),
2673 : : mnLeft( 0 ),
2674 : : mnTop( 0 ),
2675 : : mnRight( 0 ),
2676 : : mnBottom( 0 ),
2677 : : mnDropDownFlags( 0 ),
2678 : : mnLineCount( 0 ),
2679 : 30 : mnMinWidth( 0 )
2680 : : {
2681 : 30 : }
2682 : :
2683 : 30 : sal_uInt16 XclImpDropDownObj::GetDropDownType() const
2684 : : {
2685 : 30 : return ::extract_value< sal_uInt8 >( mnDropDownFlags, 0, 2 );
2686 : : }
2687 : :
2688 : 30 : void XclImpDropDownObj::ReadFullLbsData( XclImpStream& rStrm )
2689 : : {
2690 : 30 : ReadLbsData( rStrm );
2691 : 30 : rStrm >> mnDropDownFlags >> mnLineCount >> mnMinWidth >> maTextData.maData.mnTextLen;
2692 : 30 : maTextData.ReadByteString( rStrm );
2693 : : // dropdowns of auto-filters have 'simple' style, they don't have a text area
2694 [ + - ]: 30 : if( GetDropDownType() == EXC_OBJ_DROPDOWN_SIMPLE )
2695 : 30 : SetProcessSdrObj( false );
2696 : 30 : }
2697 : :
2698 : 0 : void XclImpDropDownObj::DoReadObj5( XclImpStream& rStrm, sal_uInt16 nNameLen, sal_uInt16 /*nMacroSize*/ )
2699 : : {
2700 : 0 : ReadFrameData( rStrm );
2701 : 0 : ReadSbs( rStrm );
2702 : 0 : rStrm.Ignore( 18 );
2703 : 0 : rStrm >> maTextData.maData.mnDefFontIdx;
2704 : 0 : rStrm.Ignore( 14 );
2705 : 0 : rStrm >> mnLeft >> mnTop >> mnRight >> mnBottom;
2706 : 0 : rStrm.Ignore( 4 );
2707 : 0 : ReadName5( rStrm, nNameLen );
2708 : 0 : ReadMacro5( rStrm, rStrm.ReaduInt16() ); // fist macro size invalid and unused
2709 : 0 : ReadCellLinkFormula( rStrm, true );
2710 : 0 : ReadFullLbsData( rStrm );
2711 : 0 : mbHasDefFontIdx = true;
2712 : 0 : }
2713 : :
2714 : 90 : void XclImpDropDownObj::DoReadObj8SubRec( XclImpStream& rStrm, sal_uInt16 nSubRecId, sal_uInt16 nSubRecSize )
2715 : : {
2716 [ + + ]: 90 : switch( nSubRecId )
2717 : : {
2718 : : case EXC_ID_OBJLBSDATA:
2719 : 30 : ReadFullLbsData( rStrm );
2720 : 30 : break;
2721 : : default:
2722 : 60 : XclImpTbxObjListBase::DoReadObj8SubRec( rStrm, nSubRecId, nSubRecSize );
2723 : : }
2724 : 90 : }
2725 : :
2726 : 0 : void XclImpDropDownObj::DoProcessControl( ScfPropertySet& rPropSet ) const
2727 : : {
2728 : : // dropdown listbox formatting
2729 : 0 : SetBoxFormatting( rPropSet );
2730 : : // enable dropdown button
2731 [ # # ]: 0 : rPropSet.SetBoolProperty( CREATE_OUSTRING( "Dropdown" ), true );
2732 : : // dropdown line count
2733 [ # # ]: 0 : rPropSet.SetProperty( CREATE_OUSTRING( "LineCount" ), mnLineCount );
2734 : :
2735 [ # # ]: 0 : if( GetDropDownType() == EXC_OBJ_DROPDOWN_COMBOBOX )
2736 : : {
2737 : : // text of editable combobox
2738 [ # # ]: 0 : if( maTextData.mxString )
2739 [ # # ]: 0 : rPropSet.SetStringProperty( CREATE_OUSTRING( "DefaultText" ), maTextData.mxString->GetText() );
2740 : : }
2741 : : else
2742 : : {
2743 : : // selection (do not set, if dropdown is linked to a cell)
2744 [ # # ][ # # ]: 0 : if( !HasCellLink() && (mnSelEntry > 0) )
[ # # ]
2745 : : {
2746 [ # # ]: 0 : Sequence< sal_Int16 > aSelSeq( 1 );
2747 [ # # ]: 0 : aSelSeq[ 0 ] = mnSelEntry - 1;
2748 [ # # ][ # # ]: 0 : rPropSet.SetProperty( CREATE_OUSTRING( "DefaultSelection" ), aSelSeq );
[ # # ]
2749 : : }
2750 : : }
2751 : 0 : }
2752 : :
2753 : 0 : OUString XclImpDropDownObj::DoGetServiceName() const
2754 : : {
2755 : 0 : return (GetDropDownType() == EXC_OBJ_DROPDOWN_COMBOBOX) ?
2756 : : CREATE_OUSTRING( "com.sun.star.form.component.ComboBox" ) :
2757 [ # # ]: 0 : CREATE_OUSTRING( "com.sun.star.form.component.ListBox" );
2758 : : }
2759 : :
2760 : 0 : XclTbxEventType XclImpDropDownObj::DoGetEventType() const
2761 : : {
2762 [ # # ]: 0 : return (GetDropDownType() == EXC_OBJ_DROPDOWN_COMBOBOX) ? EXC_TBX_EVENT_TEXT : EXC_TBX_EVENT_CHANGE;
2763 : : }
2764 : :
2765 : : // ----------------------------------------------------------------------------
2766 : :
2767 : 14 : XclImpPictureObj::XclImpPictureObj( const XclImpRoot& rRoot ) :
2768 : : XclImpRectObj( rRoot ),
2769 : : XclImpControlHelper( rRoot, EXC_CTRL_BINDCONTENT ),
2770 : : mnStorageId( 0 ),
2771 : : mnCtlsStrmPos( 0 ),
2772 : : mnCtlsStrmSize( 0 ),
2773 : : mbEmbedded( false ),
2774 : : mbLinked( false ),
2775 : : mbSymbol( false ),
2776 : : mbControl( false ),
2777 [ + - ][ + - ]: 14 : mbUseCtlsStrm( false )
[ + - ][ + - ]
2778 : : {
2779 : 14 : SetAreaObj( true );
2780 : 14 : SetSimpleMacro( false );
2781 : 14 : SetCustomDffObj( true );
2782 : 14 : }
2783 : :
2784 : 3 : String XclImpPictureObj::GetOleStorageName() const
2785 : : {
2786 : 3 : String aStrgName;
2787 [ - + ][ # # ]: 3 : if( (mbEmbedded || mbLinked) && !mbControl && (mnStorageId > 0) )
[ # # ][ + - ]
2788 : : {
2789 [ # # ][ # # ]: 0 : aStrgName = mbEmbedded ? EXC_STORAGE_OLE_EMBEDDED : EXC_STORAGE_OLE_LINKED;
[ # # ][ # # ]
[ # # ]
2790 : : static const sal_Char spcHexChars[] = "0123456789ABCDEF";
2791 [ # # ]: 0 : for( sal_uInt8 nIndex = 32; nIndex > 0; nIndex -= 4 )
2792 [ # # ]: 0 : aStrgName.Append( sal_Unicode( spcHexChars[ ::extract_value< sal_uInt8 >( mnStorageId, nIndex - 4, 4 ) ] ) );
2793 : : }
2794 : 3 : return aStrgName;
2795 : : }
2796 : :
2797 : 0 : void XclImpPictureObj::DoReadObj3( XclImpStream& rStrm, sal_uInt16 nMacroSize )
2798 : : {
2799 : : sal_uInt16 nLinkSize;
2800 [ # # ]: 0 : ReadFrameData( rStrm );
2801 [ # # ]: 0 : rStrm.Ignore( 6 );
2802 [ # # ]: 0 : rStrm >> nLinkSize;
2803 [ # # ]: 0 : rStrm.Ignore( 2 );
2804 [ # # ]: 0 : ReadFlags3( rStrm );
2805 [ # # ]: 0 : ReadMacro3( rStrm, nMacroSize );
2806 [ # # ]: 0 : ReadPictFmla( rStrm, nLinkSize );
2807 : :
2808 [ # # ][ # # ]: 0 : if( (rStrm.GetNextRecId() == EXC_ID3_IMGDATA) && rStrm.StartNextRecord() )
[ # # ][ # # ]
[ # # ]
2809 [ # # ][ # # ]: 0 : maGraphic = XclImpDrawing::ReadImgData( GetRoot(), rStrm );
[ # # ]
2810 : 0 : }
2811 : :
2812 : 0 : void XclImpPictureObj::DoReadObj4( XclImpStream& rStrm, sal_uInt16 nMacroSize )
2813 : : {
2814 : : sal_uInt16 nLinkSize;
2815 [ # # ]: 0 : ReadFrameData( rStrm );
2816 [ # # ]: 0 : rStrm.Ignore( 6 );
2817 [ # # ]: 0 : rStrm >> nLinkSize;
2818 [ # # ]: 0 : rStrm.Ignore( 2 );
2819 [ # # ]: 0 : ReadFlags3( rStrm );
2820 [ # # ]: 0 : ReadMacro4( rStrm, nMacroSize );
2821 [ # # ]: 0 : ReadPictFmla( rStrm, nLinkSize );
2822 : :
2823 [ # # ][ # # ]: 0 : if( (rStrm.GetNextRecId() == EXC_ID3_IMGDATA) && rStrm.StartNextRecord() )
[ # # ][ # # ]
[ # # ]
2824 [ # # ][ # # ]: 0 : maGraphic = XclImpDrawing::ReadImgData( GetRoot(), rStrm );
[ # # ]
2825 : 0 : }
2826 : :
2827 : 0 : void XclImpPictureObj::DoReadObj5( XclImpStream& rStrm, sal_uInt16 nNameLen, sal_uInt16 nMacroSize )
2828 : : {
2829 : : sal_uInt16 nLinkSize;
2830 [ # # ]: 0 : ReadFrameData( rStrm );
2831 [ # # ]: 0 : rStrm.Ignore( 6 );
2832 [ # # ]: 0 : rStrm >> nLinkSize;
2833 [ # # ]: 0 : rStrm.Ignore( 2 );
2834 [ # # ]: 0 : ReadFlags3( rStrm );
2835 [ # # ]: 0 : rStrm.Ignore( 4 );
2836 [ # # ]: 0 : ReadName5( rStrm, nNameLen );
2837 [ # # ]: 0 : ReadMacro5( rStrm, nMacroSize );
2838 [ # # ]: 0 : ReadPictFmla( rStrm, nLinkSize );
2839 : :
2840 [ # # ][ # # ]: 0 : if( (rStrm.GetNextRecId() == EXC_ID3_IMGDATA) && rStrm.StartNextRecord() )
[ # # ][ # # ]
[ # # ]
2841 : : {
2842 : : // page background is stored as hidden picture with name "__BkgndObj"
2843 [ # # ][ # # ]: 0 : if ( IsHidden() && (GetObjName() == "__BkgndObj") )
[ # # ][ # # ]
[ # # # # ]
2844 [ # # ][ # # ]: 0 : GetPageSettings().ReadImgData( rStrm );
2845 : : else
2846 [ # # ][ # # ]: 0 : maGraphic = XclImpDrawing::ReadImgData( GetRoot(), rStrm );
[ # # ]
2847 : : }
2848 : 0 : }
2849 : :
2850 : 53 : void XclImpPictureObj::DoReadObj8SubRec( XclImpStream& rStrm, sal_uInt16 nSubRecId, sal_uInt16 nSubRecSize )
2851 : : {
2852 [ + + + ]: 53 : switch( nSubRecId )
2853 : : {
2854 : : case EXC_ID_OBJFLAGS:
2855 : 14 : ReadFlags8( rStrm );
2856 : 14 : break;
2857 : : case EXC_ID_OBJPICTFMLA:
2858 : 11 : ReadPictFmla( rStrm, rStrm.ReaduInt16() );
2859 : 11 : break;
2860 : : default:
2861 : 28 : XclImpDrawObjBase::DoReadObj8SubRec( rStrm, nSubRecId, nSubRecSize );
2862 : : }
2863 : 53 : }
2864 : :
2865 : 14 : SdrObject* XclImpPictureObj::DoCreateSdrObj( XclImpDffConverter& rDffConv, const Rectangle& rAnchorRect ) const
2866 : : {
2867 : : // try to create an OLE object or form control
2868 [ + - ]: 14 : SdrObjectPtr xSdrObj( rDffConv.CreateSdrObject( *this, rAnchorRect ) );
2869 : :
2870 : : // insert a graphic replacement for unsupported ole object ( if none already
2871 : : // exists ) Hmm ok, it's possibly that there has been some imported
2872 : : // graphic at a base level but unlikely, normally controls have a valid
2873 : : // preview in the IMGDATA record ( see below )
2874 : : // It might be possible to push such an imported graphic up to this
2875 : : // XclImpPictureObj instance but there are somany layers of indirection I
2876 : : // don't see an easy way. This way at least ensures that we can
2877 : : // avoid a 'blank' shape that can result from a failed control import
2878 [ - + ][ # # ]: 14 : if ( !xSdrObj && IsOcxControl() && maGraphic.GetType() == GRAPHIC_NONE )
[ # # ][ - + ]
[ + + ]
2879 : : {
2880 [ # # ][ # # ]: 0 : Graphic aReplacement( SdrOle2Obj::GetEmtyOLEReplacementBitmap() );
[ # # ]
2881 [ # # ][ # # ]: 0 : const_cast< XclImpPictureObj* >( this )->maGraphic = aReplacement;
2882 : : }
2883 : : // no OLE - create a plain picture from IMGDATA record data
2884 [ + + ][ + - ]: 14 : if( !xSdrObj && (maGraphic.GetType() != GRAPHIC_NONE) )
[ - + ][ - + ]
2885 : : {
2886 [ # # ][ # # ]: 0 : xSdrObj.reset( new SdrGrafObj( maGraphic, rAnchorRect ) );
[ # # ]
2887 [ # # ]: 0 : ConvertRectStyle( *xSdrObj );
2888 : : }
2889 : :
2890 [ + - ]: 14 : rDffConv.Progress();
2891 [ + - ]: 14 : return xSdrObj.release();
2892 : : }
2893 : :
2894 : 36 : OUString XclImpPictureObj::GetObjName() const
2895 : : {
2896 [ + + ]: 36 : if( IsOcxControl() )
2897 : : {
2898 [ + - ][ + - ]: 33 : OUString sName( GetObjectManager().GetOleNameOverride( GetTab(), GetObjId() ) );
[ + - ][ + - ]
2899 [ + - ]: 33 : if (!sName.isEmpty())
2900 [ - + ]: 33 : return sName;
2901 : : }
2902 : 36 : return XclImpDrawObjBase::GetObjName();
2903 : : }
2904 : :
2905 : 14 : void XclImpPictureObj::DoPreProcessSdrObj( XclImpDffConverter& rDffConv, SdrObject& rSdrObj ) const
2906 : : {
2907 [ + + ]: 14 : if( IsOcxControl() )
2908 : : {
2909 : : // do not call XclImpRectObj::DoPreProcessSdrObj(), it would trace missing "printable" feature
2910 : 11 : ProcessControl( *this );
2911 : : }
2912 [ + - ][ - + ]: 3 : else if( mbEmbedded || mbLinked )
2913 : : {
2914 : : // trace missing "printable" feature
2915 : 0 : XclImpRectObj::DoPreProcessSdrObj( rDffConv, rSdrObj );
2916 : :
2917 : 0 : SfxObjectShell* pDocShell = GetDocShell();
2918 [ # # ]: 0 : SdrOle2Obj* pOleSdrObj = dynamic_cast< SdrOle2Obj* >( &rSdrObj );
2919 [ # # ][ # # ]: 0 : if( pOleSdrObj && pDocShell )
2920 : : {
2921 [ # # ]: 0 : comphelper::EmbeddedObjectContainer& rEmbObjCont = pDocShell->GetEmbeddedObjectContainer();
2922 [ # # ]: 0 : Reference< XEmbeddedObject > xEmbObj = pOleSdrObj->GetObjRef();
2923 [ # # ][ # # ]: 0 : OUString aOldName( pOleSdrObj->GetPersistName() );
[ # # ]
2924 : :
2925 : : /* The object persistence should be already in the storage, but
2926 : : the object still might not be inserted into the container. */
2927 [ # # ][ # # ]: 0 : if( rEmbObjCont.HasEmbeddedObject( aOldName ) )
2928 : : {
2929 [ # # ][ # # ]: 0 : if( !rEmbObjCont.HasEmbeddedObject( xEmbObj ) )
2930 : : // filter code is allowed to call the following method
2931 [ # # ]: 0 : rEmbObjCont.AddEmbeddedObject( xEmbObj, aOldName );
2932 : : }
2933 : : else
2934 : : {
2935 : : /* If the object is still not in container it must be inserted
2936 : : there, the name must be generated in this case. */
2937 : 0 : OUString aNewName;
2938 [ # # ]: 0 : rEmbObjCont.InsertEmbeddedObject( xEmbObj, aNewName );
2939 [ # # ]: 0 : if( aOldName != aNewName )
2940 : : // SetPersistName, not SetName
2941 [ # # ][ # # ]: 0 : pOleSdrObj->SetPersistName( aNewName );
[ # # ]
2942 : 0 : }
2943 : : }
2944 : : }
2945 : 14 : }
2946 : :
2947 : 0 : void XclImpPictureObj::ReadFlags3( XclImpStream& rStrm )
2948 : : {
2949 : : sal_uInt16 nFlags;
2950 [ # # ]: 0 : rStrm >> nFlags;
2951 : 0 : mbSymbol = ::get_flag( nFlags, EXC_OBJ_PIC_SYMBOL );
2952 : 0 : }
2953 : :
2954 : 14 : void XclImpPictureObj::ReadFlags8( XclImpStream& rStrm )
2955 : : {
2956 : : sal_uInt16 nFlags;
2957 [ + - ]: 14 : rStrm >> nFlags;
2958 : 14 : mbSymbol = ::get_flag( nFlags, EXC_OBJ_PIC_SYMBOL );
2959 : 14 : mbControl = ::get_flag( nFlags, EXC_OBJ_PIC_CONTROL );
2960 : 14 : mbUseCtlsStrm = ::get_flag( nFlags, EXC_OBJ_PIC_CTLSSTREAM );
2961 : : OSL_ENSURE( mbControl || !mbUseCtlsStrm, "XclImpPictureObj::ReadFlags8 - CTLS stream for controls only" );
2962 [ + - ][ + + ]: 14 : SetProcessSdrObj( mbControl || !mbUseCtlsStrm );
2963 : 14 : }
2964 : :
2965 : 11 : void XclImpPictureObj::ReadPictFmla( XclImpStream& rStrm, sal_uInt16 nLinkSize )
2966 : : {
2967 : 11 : sal_Size nLinkEnd = rStrm.GetRecPos() + nLinkSize;
2968 [ + - ]: 11 : if( nLinkSize >= 6 )
2969 : : {
2970 : : sal_uInt16 nFmlaSize;
2971 [ + - ]: 11 : rStrm >> nFmlaSize;
2972 : : OSL_ENSURE( nFmlaSize > 0, "XclImpPictureObj::ReadPictFmla - missing link formula" );
2973 : : // BIFF3/BIFF4 do not support storages, nothing to do here
2974 [ + - ][ + - ]: 11 : if( (nFmlaSize > 0) && (GetBiff() >= EXC_BIFF5) )
[ + - ]
2975 : : {
2976 [ + - ]: 11 : rStrm.Ignore( 4 );
2977 : : sal_uInt8 nToken;
2978 [ + - ]: 11 : rStrm >> nToken;
2979 : :
2980 : : // different processing for linked vs. embedded OLE objects
2981 [ - + ]: 11 : if( nToken == XclTokenArrayHelper::GetTokenId( EXC_TOKID_NAMEX, EXC_TOKCLASS_REF ) )
2982 : : {
2983 : 0 : mbLinked = true;
2984 [ # # # ]: 0 : switch( GetBiff() )
2985 : : {
2986 : : case EXC_BIFF5:
2987 : : {
2988 : : sal_Int16 nRefIdx;
2989 : : sal_uInt16 nNameIdx;
2990 [ # # ]: 0 : rStrm >> nRefIdx;
2991 [ # # ]: 0 : rStrm.Ignore( 8 );
2992 [ # # ]: 0 : rStrm >> nNameIdx;
2993 [ # # ]: 0 : rStrm.Ignore( 12 );
2994 [ # # ][ # # ]: 0 : const ExtName* pExtName = GetOldRoot().pExtNameBuff->GetNameByIndex( nRefIdx, nNameIdx );
2995 [ # # ][ # # ]: 0 : if( pExtName && pExtName->IsOLE() )
[ # # ][ # # ]
2996 : 0 : mnStorageId = pExtName->nStorageId;
2997 : : }
2998 : 0 : break;
2999 : : case EXC_BIFF8:
3000 : : {
3001 : : sal_uInt16 nXti, nExtName;
3002 [ # # ][ # # ]: 0 : rStrm >> nXti >> nExtName;
3003 [ # # ][ # # ]: 0 : const XclImpExtName* pExtName = GetLinkManager().GetExternName( nXti, nExtName );
3004 [ # # ][ # # ]: 0 : if( pExtName && (pExtName->GetType() == xlExtOLE) )
[ # # ]
3005 : 0 : mnStorageId = pExtName->GetStorageId();
3006 : : }
3007 : 0 : break;
3008 : : default:
3009 : : DBG_ERROR_BIFF();
3010 : : }
3011 : : }
3012 [ + - ]: 11 : else if( nToken == XclTokenArrayHelper::GetTokenId( EXC_TOKID_TBL, EXC_TOKCLASS_NONE ) )
3013 : : {
3014 : 11 : mbEmbedded = true;
3015 : : OSL_ENSURE( nFmlaSize == 5, "XclImpPictureObj::ReadPictFmla - unexpected formula size" );
3016 [ + - ]: 11 : rStrm.Ignore( nFmlaSize - 1 ); // token ID already read
3017 [ + - ]: 11 : if( nFmlaSize & 1 )
3018 [ + - ]: 11 : rStrm.Ignore( 1 ); // padding byte
3019 : :
3020 : : // a class name may follow inside the picture link
3021 [ + - ][ + - ]: 11 : if( rStrm.GetRecPos() + 2 <= nLinkEnd )
3022 : : {
3023 : : sal_uInt16 nLen;
3024 [ + - ]: 11 : rStrm >> nLen;
3025 [ + - ]: 11 : if( nLen > 0 )
3026 [ + - ][ + - ]: 11 : maClassName = (GetBiff() == EXC_BIFF8) ? rStrm.ReadUniString( nLen ) : rStrm.ReadRawByteString( nLen );
[ # # ][ + - ]
[ + - ]
3027 : : }
3028 : : }
3029 : : // else: ignore other formulas, e.g. pictures linked to cell ranges
3030 : : }
3031 : : }
3032 : :
3033 : : // seek behind picture link data
3034 : 11 : rStrm.Seek( nLinkEnd );
3035 : :
3036 : : // read additional data for embedded OLE objects following the picture link
3037 [ + - ]: 11 : if( IsOcxControl() )
3038 : : {
3039 : : // #i26521# form controls to be ignored
3040 [ + - ][ - + ]: 11 : if( maClassName.EqualsAscii( "Forms.HTML:Hidden.1" ) )
3041 : : {
3042 : 0 : SetProcessSdrObj( false );
3043 : : return;
3044 : : }
3045 : :
3046 [ + - ][ + - ]: 11 : if( rStrm.GetRecLeft() <= 8 ) return;
3047 : :
3048 : : // position and size of control data in 'Ctls' stream
3049 [ + - ]: 11 : mnCtlsStrmPos = static_cast< sal_Size >( rStrm.ReaduInt32() );
3050 [ + - ]: 11 : mnCtlsStrmSize = static_cast< sal_Size >( rStrm.ReaduInt32() );
3051 : :
3052 [ + - ][ + - ]: 11 : if( rStrm.GetRecLeft() <= 8 ) return;
3053 : :
3054 : : // additional string (16-bit characters), e.g. for progress bar control
3055 : : sal_uInt32 nAddStrSize;
3056 [ + - ]: 11 : rStrm >> nAddStrSize;
3057 : : OSL_ENSURE( rStrm.GetRecLeft() >= nAddStrSize + 4, "XclImpPictureObj::ReadPictFmla - missing data" );
3058 [ + - ][ + - ]: 11 : if( rStrm.GetRecLeft() >= nAddStrSize + 4 )
3059 : : {
3060 [ + - ]: 11 : rStrm.Ignore( nAddStrSize );
3061 : : // cell link and source range
3062 [ + - ]: 11 : ReadCellLinkFormula( rStrm, true );
3063 [ + - ]: 11 : ReadSourceRangeFormula( rStrm, true );
3064 : : }
3065 : : }
3066 [ # # ][ # # ]: 0 : else if( mbEmbedded && (rStrm.GetRecLeft() >= 4) )
[ # # ]
3067 : : {
3068 : 11 : rStrm >> mnStorageId;
3069 : : }
3070 : : }
3071 : :
3072 : : // DFF stream conversion ======================================================
3073 : :
3074 : 68 : void XclImpSolverContainer::InsertSdrObjectInfo( SdrObject& rSdrObj, sal_uInt32 nDffShapeId, sal_uInt32 nDffFlags )
3075 : : {
3076 [ + - ]: 68 : if( nDffShapeId > 0 )
3077 : : {
3078 : 68 : maSdrInfoMap[ nDffShapeId ].Set( &rSdrObj, nDffFlags );
3079 [ + - ]: 68 : maSdrObjMap[ &rSdrObj ] = nDffShapeId;
3080 : : }
3081 : 68 : }
3082 : :
3083 : 0 : void XclImpSolverContainer::RemoveSdrObjectInfo( SdrObject& rSdrObj )
3084 : : {
3085 : : // remove info of passed object from the maps
3086 [ # # ]: 0 : XclImpSdrObjMap::iterator aIt = maSdrObjMap.find( &rSdrObj );
3087 [ # # ][ # # ]: 0 : if( aIt != maSdrObjMap.end() )
3088 : : {
3089 [ # # ][ # # ]: 0 : maSdrInfoMap.erase( aIt->second );
3090 [ # # ]: 0 : maSdrObjMap.erase( aIt );
3091 : : }
3092 : :
3093 : : // remove info of all child objects of a group object
3094 [ # # ][ # # ]: 0 : if( SdrObjGroup* pGroupObj = dynamic_cast< SdrObjGroup* >( &rSdrObj ) )
3095 : : {
3096 [ # # ][ # # ]: 0 : if( SdrObjList* pSubList = pGroupObj->GetSubList() )
3097 : : {
3098 : : // iterate flat over the list because this function already works recursively
3099 [ # # ]: 0 : SdrObjListIter aObjIt( *pSubList, IM_FLAT );
3100 [ # # ][ # # ]: 0 : for( SdrObject* pChildObj = aObjIt.Next(); pChildObj; pChildObj = aObjIt.Next() )
[ # # ]
3101 [ # # ]: 0 : RemoveSdrObjectInfo( *pChildObj );
3102 : : }
3103 : : }
3104 : 0 : }
3105 : :
3106 : 62 : void XclImpSolverContainer::UpdateConnectorRules()
3107 : : {
3108 [ - + ]: 62 : for ( size_t i = 0, n = aCList.size(); i < n; ++i )
3109 : : {
3110 : 0 : SvxMSDffConnectorRule* pRule = aCList[ i ];
3111 : 0 : UpdateConnection( pRule->nShapeA, pRule->pAObj, &pRule->nSpFlagsA );
3112 : 0 : UpdateConnection( pRule->nShapeB, pRule->pBObj, &pRule->nSpFlagsB );
3113 : 0 : UpdateConnection( pRule->nShapeC, pRule->pCObj );
3114 : : }
3115 : 62 : }
3116 : :
3117 : 62 : void XclImpSolverContainer::RemoveConnectorRules()
3118 : : {
3119 : : // base class from SVX uses plain untyped tools/List
3120 [ - + ]: 62 : for ( size_t i = 0, n = aCList.size(); i < n; ++i ) {
3121 : 0 : delete aCList[ i ];
3122 : : }
3123 : 62 : aCList.clear();
3124 : 62 : maSdrInfoMap.clear();
3125 : 62 : maSdrObjMap.clear();
3126 : 62 : }
3127 : :
3128 : 0 : void XclImpSolverContainer::UpdateConnection( sal_uInt32 nDffShapeId, SdrObject*& rpSdrObj, sal_uInt32* pnDffFlags )
3129 : : {
3130 [ # # ]: 0 : XclImpSdrInfoMap::const_iterator aIt = maSdrInfoMap.find( nDffShapeId );
3131 [ # # ]: 0 : if( aIt != maSdrInfoMap.end() )
3132 : : {
3133 : 0 : rpSdrObj = aIt->second.mpSdrObj;
3134 [ # # ]: 0 : if( pnDffFlags )
3135 : 0 : *pnDffFlags = aIt->second.mnDffFlags;
3136 : : }
3137 : 0 : }
3138 : :
3139 : : // ----------------------------------------------------------------------------
3140 : :
3141 : 17 : XclImpSimpleDffConverter::XclImpSimpleDffConverter( const XclImpRoot& rRoot, SvStream& rDffStrm ) :
3142 : 17 : SvxMSDffManager( rDffStrm, rRoot.GetBasePath(), 0, 0, rRoot.GetDoc().GetDrawLayer(), 1440, COL_DEFAULT, 24, 0 ),
3143 [ + - ]: 17 : XclImpRoot( rRoot )
3144 : : {
3145 : 17 : SetSvxMSDffSettings( SVXMSDFF_SETTINGS_CROP_BITMAPS | SVXMSDFF_SETTINGS_IMPORT_EXCEL );
3146 : 17 : }
3147 : :
3148 [ + - ]: 17 : XclImpSimpleDffConverter::~XclImpSimpleDffConverter()
3149 : : {
3150 [ - + ]: 17 : }
3151 : :
3152 : 99 : bool XclImpSimpleDffConverter::GetColorFromPalette( sal_uInt16 nIndex, Color& rColor ) const
3153 : : {
3154 : 99 : ColorData nColor = GetPalette().GetColorData( static_cast< sal_uInt16 >( nIndex ) );
3155 : :
3156 [ - + ]: 99 : if( nColor == COL_AUTO )
3157 : 0 : return 0;
3158 : :
3159 : 99 : rColor.SetColor( nColor );
3160 : 99 : return 1;
3161 : : }
3162 : :
3163 : : // ----------------------------------------------------------------------------
3164 : : Reference< XComponentContext >
3165 : 0 : lcl_getUnoCtx()
3166 : : {
3167 [ # # ][ # # ]: 0 : comphelper::ComponentContext aCtx( ::comphelper::getProcessServiceFactory() );
3168 [ # # ][ # # ]: 0 : return aCtx.getUNOContext();
3169 : : }
3170 : :
3171 : 62 : XclImpDffConverter::XclImpDffConvData::XclImpDffConvData(
3172 : : XclImpDrawing& rDrawing, SdrModel& rSdrModel, SdrPage& rSdrPage ) :
3173 : : mrDrawing( rDrawing ),
3174 : : mrSdrModel( rSdrModel ),
3175 : : mrSdrPage( rSdrPage ),
3176 : : mnLastCtrlIndex( -1 ),
3177 : 62 : mbHasCtrlForm( false )
3178 : : {
3179 : 62 : }
3180 : : // ----------------------------------------------------------------------------
3181 : :
3182 : 17 : XclImpDffConverter::XclImpDffConverter( const XclImpRoot& rRoot, SvStream& rDffStrm ) :
3183 : : XclImpSimpleDffConverter( rRoot, rDffStrm ),
3184 : : oox::ole::MSConvertOCXControls( rRoot.GetDocShell()->GetModel() ),
3185 : : maStdFormName( CREATE_OUSTRING( "Standard" ) ),
3186 [ + - ][ + - ]: 17 : mnOleImpFlags( 0 )
[ + - ][ + - ]
[ + - ][ + - ]
3187 : : {
3188 [ + - ]: 17 : const SvtFilterOptions& rFilterOpt = SvtFilterOptions::Get();
3189 [ + - ][ + - ]: 17 : if( rFilterOpt.IsMathType2Math() )
3190 : 17 : mnOleImpFlags |= OLE_MATHTYPE_2_STARMATH;
3191 [ + - ][ + - ]: 17 : if( rFilterOpt.IsWinWord2Writer() )
3192 : 17 : mnOleImpFlags |= OLE_WINWORD_2_STARWRITER;
3193 [ + - ][ + - ]: 17 : if( rFilterOpt.IsPowerPoint2Impress() )
3194 : 17 : mnOleImpFlags |= OLE_POWERPOINT_2_STARIMPRESS;
3195 : :
3196 : : // try to open the 'Ctls' storage stream containing OCX control properties
3197 [ + - ][ + - ]: 17 : mxCtlsStrm = OpenStream( EXC_STREAM_CTLS );
[ + - ][ + - ]
[ + - ]
3198 : :
3199 : : // default text margin (convert EMU to drawing layer units)
3200 : 17 : mnDefTextMargin = EXC_OBJ_TEXT_MARGIN;
3201 [ + - ]: 17 : ScaleEmu( mnDefTextMargin );
3202 : 17 : }
3203 : :
3204 [ + - ][ + - ]: 17 : XclImpDffConverter::~XclImpDffConverter()
[ + - ]
3205 : : {
3206 [ - + ]: 17 : }
3207 : :
3208 : 33 : String XclImpObjectManager::GetOleNameOverride( SCTAB nTab, sal_uInt16 nObjId )
3209 : : {
3210 : 33 : rtl::OUString sOleName;
3211 [ + - ][ + - ]: 33 : String sCodeName = GetExtDocOptions().GetCodeName( nTab );
[ + - ]
3212 : :
3213 [ + - ][ + - ]: 33 : if ( mxOleCtrlNameOverride->hasByName( sCodeName ) )
[ + - ][ + - ]
3214 : : {
3215 : 33 : Reference< XIndexContainer > xIdToOleName;
3216 [ + - ][ + - ]: 33 : mxOleCtrlNameOverride->getByName( sCodeName ) >>= xIdToOleName;
[ + - ][ + - ]
3217 [ + - ][ + - ]: 33 : xIdToOleName->getByIndex( nObjId ) >>= sOleName;
3218 : : }
3219 : : OSL_TRACE("XclImpObjectManager::GetOleNameOverride tab %d, ( module %s ) object id ( %d ) is %s", nTab,
3220 : : rtl::OUStringToOString( sCodeName, RTL_TEXTENCODING_UTF8 ).getStr(), nObjId,
3221 : : rtl::OUStringToOString( sOleName, RTL_TEXTENCODING_UTF8 ).getStr() );
3222 : :
3223 [ + - ][ + - ]: 33 : return sOleName;
3224 : : }
3225 : :
3226 : 17 : void XclImpDffConverter::StartProgressBar( sal_Size nProgressSize )
3227 : : {
3228 [ + - ]: 17 : mxProgress.reset( new ScfProgressBar( GetDocShell(), STR_PROGRESS_CALCULATING ) );
3229 : 17 : mxProgress->AddSegment( nProgressSize );
3230 : 17 : mxProgress->Activate();
3231 : 17 : }
3232 : :
3233 : 77 : void XclImpDffConverter::Progress( sal_Size nDelta )
3234 : : {
3235 : : OSL_ENSURE( mxProgress, "XclImpDffConverter::Progress - invalid call, no progress bar" );
3236 : 77 : mxProgress->Progress( nDelta );
3237 : 77 : }
3238 : :
3239 : 62 : void XclImpDffConverter::InitializeDrawing( XclImpDrawing& rDrawing, SdrModel& rSdrModel, SdrPage& rSdrPage )
3240 : : {
3241 [ + - ][ + - ]: 62 : XclImpDffConvDataRef xConvData( new XclImpDffConvData( rDrawing, rSdrModel, rSdrPage ) );
[ + - ]
3242 [ + - ]: 62 : maDataStack.push_back( xConvData );
3243 [ + - ][ + - ]: 62 : SetModel( &xConvData->mrSdrModel, 1440 );
3244 : 62 : }
3245 : :
3246 : 0 : void XclImpDffConverter::ProcessObject( SdrObjList& rObjList, const XclImpDrawObjBase& rDrawObj )
3247 : : {
3248 [ # # ]: 0 : if( rDrawObj.IsProcessSdrObj() )
3249 : : {
3250 [ # # ]: 0 : if( const XclObjAnchor* pAnchor = rDrawObj.GetAnchor() )
3251 : : {
3252 [ # # ][ # # ]: 0 : Rectangle aAnchorRect = GetConvData().mrDrawing.CalcAnchorRect( *pAnchor, false );
3253 [ # # ][ # # ]: 0 : if( rDrawObj.IsValidSize( aAnchorRect ) )
3254 : : {
3255 : : // CreateSdrObject() recursively creates embedded child objects
3256 [ # # ]: 0 : SdrObjectPtr xSdrObj( rDrawObj.CreateSdrObject( *this, aAnchorRect, false ) );
3257 [ # # ]: 0 : if( xSdrObj.is() )
3258 [ # # ]: 0 : rDrawObj.PreProcessSdrObject( *this, *xSdrObj );
3259 : : // call InsertSdrObject() also, if SdrObject is missing
3260 [ # # ][ # # ]: 0 : InsertSdrObject( rObjList, rDrawObj, xSdrObj.release() );
3261 : : }
3262 : : }
3263 : : }
3264 : 0 : }
3265 : :
3266 : 62 : void XclImpDffConverter::ProcessDrawing( const XclImpDrawObjVector& rDrawObjs )
3267 : : {
3268 : 62 : SdrPage& rSdrPage = GetConvData().mrSdrPage;
3269 [ + - ][ - + ]: 62 : for( XclImpDrawObjVector::const_iterator aIt = rDrawObjs.begin(), aEnd = rDrawObjs.end(); aIt != aEnd; ++aIt )
3270 [ # # ]: 0 : ProcessObject( rSdrPage, **aIt );
3271 : 62 : }
3272 : :
3273 : 62 : void XclImpDffConverter::ProcessDrawing( SvStream& rDffStrm )
3274 : : {
3275 : 62 : rDffStrm.Seek( STREAM_SEEK_TO_END );
3276 [ + - ]: 62 : if( rDffStrm.Tell() > 0 )
3277 : : {
3278 [ + - ]: 62 : rDffStrm.Seek( STREAM_SEEK_TO_BEGIN );
3279 : 62 : DffRecordHeader aHeader;
3280 [ + - ]: 62 : rDffStrm >> aHeader;
3281 : : OSL_ENSURE( aHeader.nRecType == DFF_msofbtDgContainer, "XclImpDffConverter::ProcessDrawing - unexpected record" );
3282 [ + - ]: 62 : if( aHeader.nRecType == DFF_msofbtDgContainer )
3283 [ + - ]: 62 : ProcessDgContainer( rDffStrm, aHeader );
3284 : : }
3285 : 62 : }
3286 : :
3287 : 62 : void XclImpDffConverter::FinalizeDrawing()
3288 : : {
3289 : : OSL_ENSURE( !maDataStack.empty(), "XclImpDffConverter::FinalizeDrawing - no drawing manager on stack" );
3290 : 62 : maDataStack.pop_back();
3291 : : // restore previous model at core DFF converter
3292 [ - + ]: 62 : if( !maDataStack.empty() )
3293 : 0 : SetModel( &maDataStack.back()->mrSdrModel, 1440 );
3294 : 62 : }
3295 : :
3296 : 15 : SdrObject* XclImpDffConverter::CreateSdrObject( const XclImpTbxObjBase& rTbxObj, const Rectangle& rAnchorRect )
3297 : : {
3298 : 15 : SdrObjectPtr xSdrObj;
3299 : :
3300 [ + - ]: 15 : OUString aServiceName = rTbxObj.GetServiceName();
3301 [ + - ][ + - ]: 15 : if( SupportsOleObjects() && !aServiceName.isEmpty() ) try
[ + - ][ + - ]
3302 : : {
3303 : : // create the form control from scratch
3304 [ + - ][ + - ]: 15 : Reference< XFormComponent > xFormComp( ScfApiHelper::CreateInstance( GetDocShell(), aServiceName ), UNO_QUERY_THROW );
[ + - ]
3305 : : // set controls form, needed in virtual function InsertControl()
3306 [ + - ]: 15 : InitControlForm();
3307 : : // try to insert the control into the form
3308 : 15 : ::com::sun::star::awt::Size aDummySize;
3309 : 15 : Reference< XShape > xShape;
3310 [ + - ]: 15 : XclImpDffConvData& rConvData = GetConvData();
3311 [ + - ][ + - ]: 15 : if( rConvData.mxCtrlForm.is() && InsertControl( xFormComp, aDummySize, &xShape, sal_True ) )
[ + - ][ + - ]
3312 : : {
3313 [ + - ][ + - ]: 15 : xSdrObj.reset( rTbxObj.CreateSdrObjectFromShape( xShape, rAnchorRect ) );
3314 : : // try to attach a macro to the control
3315 : 15 : ScriptEventDescriptor aDescriptor;
3316 [ + - ][ - + ]: 15 : if( (rConvData.mnLastCtrlIndex >= 0) && rTbxObj.FillMacroDescriptor( aDescriptor ) )
[ - + ][ + - ]
3317 : : {
3318 [ # # ]: 0 : Reference< XEventAttacherManager > xEventMgr( rConvData.mxCtrlForm, UNO_QUERY_THROW );
3319 [ # # ][ # # ]: 0 : xEventMgr->registerScriptEvent( rConvData.mnLastCtrlIndex, aDescriptor );
3320 : 15 : }
3321 [ # # ]: 15 : }
3322 : : }
3323 [ # # ]: 0 : catch( const Exception& )
3324 : : {
3325 : : }
3326 : :
3327 [ + - ]: 15 : return xSdrObj.release();
3328 : : }
3329 : :
3330 : 14 : SdrObject* XclImpDffConverter::CreateSdrObject( const XclImpPictureObj& rPicObj, const Rectangle& rAnchorRect )
3331 : : {
3332 : 14 : SdrObjectPtr xSdrObj;
3333 : :
3334 [ + - ][ + - ]: 14 : if( SupportsOleObjects() )
3335 : : {
3336 [ + + ]: 14 : if( rPicObj.IsOcxControl() )
3337 : : {
3338 [ + - ]: 11 : if( mxCtlsStrm.Is() ) try
3339 : : {
3340 : : /* set controls form, needed in virtual function InsertControl()
3341 : : called from ReadOCXExcelKludgeStream() */
3342 [ + - ]: 11 : InitControlForm();
3343 : :
3344 : : // read from mxCtlsStrm into xShape, insert the control model into the form
3345 : 11 : Reference< XShape > xShape;
3346 [ + - ][ + - ]: 11 : if( GetConvData().mxCtrlForm.is() )
3347 : : {
3348 : 11 : Reference< XFormComponent > xFComp;
3349 : 11 : com::sun::star::awt::Size aSz; // not used in import
3350 [ + - ]: 11 : ReadOCXCtlsStream( mxCtlsStrm, xFComp, rPicObj.GetCtlsStreamPos(), rPicObj.GetCtlsStreamSize() );
3351 : : // recreate the method formally known as
3352 : : // ReadOCXExcelKludgeStream( )
3353 [ + - ]: 11 : if ( xFComp.is() )
3354 : : {
3355 [ + - ]: 11 : ScfPropertySet aPropSet( xFComp );
3356 [ + - ][ + - ]: 11 : aPropSet.SetStringProperty( CREATE_OUSTRING( "Name" ), rPicObj.GetObjName() );
[ + - ][ + - ]
[ + - ]
3357 [ + - ]: 11 : InsertControl( xFComp, aSz,&xShape,true);
3358 [ + - ][ + - ]: 11 : xSdrObj.reset( rPicObj.CreateSdrObjectFromShape( xShape, rAnchorRect ) );
[ + - ]
3359 : 11 : }
3360 [ # # ]: 11 : }
3361 : : }
3362 [ # # ]: 0 : catch( const Exception& )
3363 : : {
3364 : : }
3365 : : }
3366 : : else
3367 : : {
3368 [ + - ]: 3 : SfxObjectShell* pDocShell = GetDocShell();
3369 [ + - ]: 3 : SotStorageRef xSrcStrg = GetRootStorage();
3370 [ + - ]: 3 : String aStrgName = rPicObj.GetOleStorageName();
3371 [ + - ][ + - ]: 3 : if( pDocShell && xSrcStrg.Is() && (aStrgName.Len() > 0) )
[ - + ][ - + ]
3372 : : {
3373 : : // first try to resolve graphic from DFF storage
3374 [ # # ]: 0 : Graphic aGraphic;
3375 [ # # ]: 0 : Rectangle aVisArea;
3376 [ # # ][ # # ]: 0 : if( !GetBLIP( GetPropertyValue( DFF_Prop_pib ), aGraphic, &aVisArea ) )
[ # # ]
3377 : : {
3378 : : // if not found, use graphic from object (imported from IMGDATA record)
3379 [ # # ]: 0 : aGraphic = rPicObj.GetGraphic();
3380 : 0 : aVisArea = rPicObj.GetVisArea();
3381 : : }
3382 [ # # ][ # # ]: 0 : if( aGraphic.GetType() != GRAPHIC_NONE )
3383 : : {
3384 : 0 : ErrCode nError = ERRCODE_NONE;
3385 : : namespace cssea = ::com::sun::star::embed::Aspects;
3386 [ # # ]: 0 : sal_Int64 nAspects = rPicObj.IsSymbol() ? cssea::MSOLE_ICON : cssea::MSOLE_CONTENT;
3387 : : xSdrObj.reset( CreateSdrOLEFromStorage(
3388 : : aStrgName, xSrcStrg, pDocShell->GetStorage(), aGraphic,
3389 [ # # ][ # # ]: 0 : rAnchorRect, aVisArea, 0, nError, mnOleImpFlags, nAspects ) );
[ # # ]
3390 [ # # ]: 0 : }
3391 [ + - ][ + - ]: 3 : }
3392 : : }
3393 : : }
3394 : :
3395 [ + - ]: 14 : return xSdrObj.release();
3396 : : }
3397 : :
3398 : 40 : bool XclImpDffConverter::SupportsOleObjects() const
3399 : : {
3400 : 40 : return GetConvData().mrDrawing.SupportsOleObjects();
3401 : : }
3402 : :
3403 : : // virtual functions ----------------------------------------------------------
3404 : :
3405 : 101 : void XclImpDffConverter::ProcessClientAnchor2( SvStream& rDffStrm,
3406 : : DffRecordHeader& rHeader, void* /*pClientData*/, DffObjData& rObjData )
3407 : : {
3408 : : // find the OBJ record data related to the processed shape
3409 : 101 : XclImpDffConvData& rConvData = GetConvData();
3410 [ + - ]: 101 : if( XclImpDrawObjBase* pDrawObj = rConvData.mrDrawing.FindDrawObj( rObjData.rSpHd ).get() )
3411 : : {
3412 : : OSL_ENSURE( rHeader.nRecType == DFF_msofbtClientAnchor, "XclImpDffConverter::ProcessClientAnchor2 - no client anchor record" );
3413 [ + - ]: 101 : XclObjAnchor aAnchor;
3414 [ + - ]: 101 : rHeader.SeekToContent( rDffStrm );
3415 [ + - ]: 101 : rDffStrm.SeekRel( 2 ); // flags
3416 [ + - ]: 101 : rDffStrm >> aAnchor; // anchor format equal to BIFF5 OBJ records
3417 : 101 : pDrawObj->SetAnchor( aAnchor );
3418 [ + - ]: 101 : rObjData.aChildAnchor = rConvData.mrDrawing.CalcAnchorRect( aAnchor, true );
3419 : 101 : rObjData.bChildAnchor = sal_True;
3420 : : }
3421 : 101 : }
3422 : :
3423 : 163 : SdrObject* XclImpDffConverter::ProcessObj( SvStream& rDffStrm, DffObjData& rDffObjData,
3424 : : void* pClientData, Rectangle& /*rTextRect*/, SdrObject* pOldSdrObj )
3425 : : {
3426 [ + - ]: 163 : XclImpDffConvData& rConvData = GetConvData();
3427 : :
3428 : : /* pOldSdrObj passes a generated SdrObject. This function owns this object
3429 : : and can modify it. The function has either to return it back to caller
3430 : : or to delete it by itself. */
3431 : 163 : SdrObjectPtr xSdrObj( pOldSdrObj );
3432 : :
3433 : : // find the OBJ record data related to the processed shape
3434 [ + - ]: 163 : XclImpDrawObjRef xDrawObj = rConvData.mrDrawing.FindDrawObj( rDffObjData.rSpHd );
3435 : 163 : const Rectangle& rAnchorRect = rDffObjData.aChildAnchor;
3436 : :
3437 : : // Do not process the global page group shape (flag SP_FPATRIARCH)
3438 : 163 : bool bGlobalPageGroup = ::get_flag< sal_uInt32 >( rDffObjData.nSpFlags, SP_FPATRIARCH );
3439 [ + + ][ - + ]: 163 : if( !xDrawObj || !xDrawObj->IsProcessSdrObj() || bGlobalPageGroup )
[ + + ][ + + ]
3440 : 92 : return 0; // simply return, xSdrObj will be destroyed
3441 : :
3442 : : /* Pass pointer to top-level object back to caller. If the processed
3443 : : object is embedded in a group, the pointer is already set to the
3444 : : top-level parent object. */
3445 : 71 : XclImpDrawObjBase** ppTopLevelObj = reinterpret_cast< XclImpDrawObjBase** >( pClientData );
3446 [ + - ][ + - ]: 71 : bool bIsTopLevel = !ppTopLevelObj || !*ppTopLevelObj;
3447 [ + - ][ + - ]: 71 : if( ppTopLevelObj && bIsTopLevel )
3448 : 71 : *ppTopLevelObj = xDrawObj.get();
3449 : :
3450 : : // connectors don't have to be area objects
3451 [ + + ][ - + ]: 71 : if( dynamic_cast< SdrEdgeObj* >( xSdrObj.get() ) )
[ - + ]
3452 : 0 : xDrawObj->SetAreaObj( false );
3453 : :
3454 : : /* Check for valid size for all objects. Needed to ignore lots of invisible
3455 : : phantom objects from deleted rows or columns (for performance reasons).
3456 : : #i30816# Include objects embedded in groups.
3457 : : #i58780# Ignore group shapes, size is not initialized. */
3458 [ - + ][ # # ]: 71 : bool bEmbeddedGroup = !bIsTopLevel && dynamic_cast< SdrObjGroup* >( xSdrObj.get() );
[ # # ]
3459 [ + - ][ + - ]: 71 : if( !bEmbeddedGroup && !xDrawObj->IsValidSize( rAnchorRect ) )
[ - + ][ - + ]
3460 : 0 : return 0; // simply return, xSdrObj will be destroyed
3461 : :
3462 : : // set shape information from DFF stream
3463 [ + - ][ + - ]: 71 : String aObjName = GetPropertyString( DFF_Prop_wzName, rDffStrm );
3464 [ + - ]: 71 : String aHyperlink = ReadHlinkProperty( rDffStrm );
3465 [ + - ]: 71 : bool bVisible = !GetPropertyBool( DFF_Prop_fHidden );
3466 [ + - ]: 71 : bool bAutoMargin = GetPropertyBool( DFF_Prop_AutoTextMargin );
3467 [ + - ][ + - ]: 71 : xDrawObj->SetDffData( rDffObjData, aObjName, aHyperlink, bVisible, bAutoMargin );
3468 : :
3469 : : /* Connect textbox data (string, alignment, text orientation) to object.
3470 : : don't ask for a text-ID, DFF export doesn't set one. */
3471 [ + + ][ - + ]: 71 : if( XclImpTextObj* pTextObj = dynamic_cast< XclImpTextObj* >( xDrawObj.get() ) )
3472 [ + - ][ + + ]: 51 : if( const XclImpObjTextData* pTextData = rConvData.mrDrawing.FindTextData( rDffObjData.rSpHd ) )
3473 [ + - ]: 48 : pTextObj->SetTextData( *pTextData );
3474 : :
3475 : : // copy line and fill formatting of TBX form controls from DFF properties
3476 [ - + ][ + + ]: 71 : if( XclImpTbxObjBase* pTbxObj = dynamic_cast< XclImpTbxObjBase* >( xDrawObj.get() ) )
3477 [ + - ]: 15 : pTbxObj->SetDffProperties( *this );
3478 : :
3479 : : // try to create a custom SdrObject that overwrites the passed object
3480 [ + - ]: 71 : SdrObjectPtr xNewSdrObj( xDrawObj->CreateSdrObject( *this, rAnchorRect, true ) );
3481 [ + + ]: 71 : if( xNewSdrObj.is() )
3482 [ + - ]: 32 : xSdrObj.reset( xNewSdrObj.release() );
3483 : :
3484 : : // process the SdrObject
3485 [ + - ]: 71 : if( xSdrObj.is() )
3486 : : {
3487 : : // filled without color -> set system window color
3488 [ + - ][ + + ]: 71 : if( GetPropertyBool( DFF_Prop_fFilled ) && !IsProperty( DFF_Prop_fillColor ) )
[ - + ][ - + ]
3489 [ # # ][ # # ]: 0 : xSdrObj->SetMergedItem( XFillColorItem( EMPTY_STRING, GetPalette().GetColor( EXC_COLOR_WINDOWBACK ) ) );
[ # # ][ # # ]
[ # # ][ # # ]
3490 : :
3491 : : // additional processing on the SdrObject
3492 [ + - ]: 71 : xDrawObj->PreProcessSdrObject( *this, *xSdrObj );
3493 : :
3494 : : /* If the SdrObject will not be inserted into the draw page, delete it
3495 : : here. Happens e.g. for notes: The PreProcessSdrObject() call above
3496 : : has inserted the note into the document, and the SdrObject is not
3497 : : needed anymore. */
3498 [ + + ]: 71 : if( !xDrawObj->IsInsertSdrObj() )
3499 [ + - ]: 3 : xSdrObj.reset();
3500 : : }
3501 : :
3502 [ + + ]: 71 : if( xSdrObj.is() )
3503 : : {
3504 : : /* Store the relation between shape ID and SdrObject for connectors.
3505 : : Must be done here (and not in InsertSdrObject() function),
3506 : : otherwise all SdrObjects embedded in groups would be lost. */
3507 [ + - ]: 68 : rConvData.maSolverCont.InsertSdrObjectInfo( *xSdrObj, xDrawObj->GetDffShapeId(), xDrawObj->GetDffFlags() );
3508 : :
3509 : : /* If the drawing object is embedded in a group object, call
3510 : : PostProcessSdrObject() here. For top-level objects this will be
3511 : : done automatically in InsertSdrObject() but grouped shapes are
3512 : : inserted into their groups somewhere in the SvxMSDffManager base
3513 : : class without chance of notification. Unfortunately, now this is
3514 : : called before the object is really inserted into its group object,
3515 : : but that should not have any effect for grouped objects. */
3516 [ - + ]: 68 : if( !bIsTopLevel )
3517 [ # # ]: 0 : xDrawObj->PostProcessSdrObject( *this, *xSdrObj );
3518 : : }
3519 : :
3520 [ + - ][ + - ]: 163 : return xSdrObj.release();
[ + - ][ + - ]
[ + - ]
3521 : : }
3522 : :
3523 : 0 : sal_uLong XclImpDffConverter::Calc_nBLIPPos( sal_uLong /*nOrgVal*/, sal_uLong nStreamPos ) const
3524 : : {
3525 : 0 : return nStreamPos + 4;
3526 : : }
3527 : :
3528 : 26 : sal_Bool XclImpDffConverter::InsertControl( const Reference< XFormComponent >& rxFormComp,
3529 : : const ::com::sun::star::awt::Size& /*rSize*/, Reference< XShape >* pxShape,
3530 : : sal_Bool /*bFloatingCtrl*/ )
3531 : : {
3532 [ + - ]: 26 : if( GetDocShell() ) try
3533 : : {
3534 [ + - ]: 26 : XclImpDffConvData& rConvData = GetConvData();
3535 [ + - ]: 26 : Reference< XIndexContainer > xFormIC( rConvData.mxCtrlForm, UNO_QUERY_THROW );
3536 [ + - ]: 26 : Reference< XControlModel > xCtrlModel( rxFormComp, UNO_QUERY_THROW );
3537 : :
3538 : : // create the control shape
3539 [ + - ][ + - ]: 26 : Reference< XShape > xShape( ScfApiHelper::CreateInstance( GetDocShell(), CREATE_OUSTRING( "com.sun.star.drawing.ControlShape" ) ), UNO_QUERY_THROW );
[ + - ][ + - ]
3540 [ + - ]: 26 : Reference< XControlShape > xCtrlShape( xShape, UNO_QUERY_THROW );
3541 : :
3542 : : // insert the new control into the form
3543 [ + - ][ + - ]: 26 : sal_Int32 nNewIndex = xFormIC->getCount();
3544 [ + - ][ + - ]: 26 : xFormIC->insertByIndex( nNewIndex, Any( rxFormComp ) );
[ + - ]
3545 : : // on success: store new index of the control for later use (macro events)
3546 : 26 : rConvData.mnLastCtrlIndex = nNewIndex;
3547 : :
3548 : : // set control model at control shape and pass back shape to caller
3549 [ + - ][ + - ]: 26 : xCtrlShape->setControl( xCtrlModel );
3550 [ + - ][ + - ]: 26 : if( pxShape ) *pxShape = xShape;
3551 [ # # ]: 26 : return sal_True;
3552 : : }
3553 : 0 : catch( const Exception& )
3554 : : {
3555 : : OSL_FAIL( "XclImpDffConverter::InsertControl - cannot create form control" );
3556 : : }
3557 : :
3558 : 26 : return false;
3559 : : }
3560 : :
3561 : : // private --------------------------------------------------------------------
3562 : :
3563 : 614 : XclImpDffConverter::XclImpDffConvData& XclImpDffConverter::GetConvData()
3564 : : {
3565 : : OSL_ENSURE( !maDataStack.empty(), "XclImpDffConverter::GetConvData - no drawing manager on stack" );
3566 : 614 : return *maDataStack.back();
3567 : : }
3568 : :
3569 : 40 : const XclImpDffConverter::XclImpDffConvData& XclImpDffConverter::GetConvData() const
3570 : : {
3571 : : OSL_ENSURE( !maDataStack.empty(), "XclImpDffConverter::GetConvData - no drawing manager on stack" );
3572 : 40 : return *maDataStack.back();
3573 : : }
3574 : :
3575 : 71 : String XclImpDffConverter::ReadHlinkProperty( SvStream& rDffStrm ) const
3576 : : {
3577 : : /* Reads hyperlink data from a complex DFF property. Contents of this
3578 : : property are equal to the HLINK record, import of this record is
3579 : : implemented in class XclImpHyperlink. This function has to create an
3580 : : instance of the XclImpStream class to be able to reuse the
3581 : : functionality of XclImpHyperlink. */
3582 : 71 : String aString;
3583 [ + - ]: 71 : sal_uInt32 nBufferSize = GetPropertyValue( DFF_Prop_pihlShape );
3584 [ - + ][ # # ]: 71 : if( (0 < nBufferSize) && (nBufferSize <= 0xFFFF) && SeekToContent( DFF_Prop_pihlShape, rDffStrm ) )
[ # # ][ # # ]
[ - + ]
3585 : : {
3586 : : // create a faked BIFF record that can be read by XclImpStream class
3587 [ # # ]: 0 : SvMemoryStream aMemStream;
3588 [ # # ][ # # ]: 0 : aMemStream << sal_uInt16( 0 ) << static_cast< sal_uInt16 >( nBufferSize );
3589 : :
3590 : : // copy from DFF stream to memory stream
3591 [ # # ]: 0 : ::std::vector< sal_uInt8 > aBuffer( nBufferSize );
3592 [ # # ]: 0 : sal_uInt8* pnData = &aBuffer.front();
3593 [ # # ][ # # ]: 0 : if( rDffStrm.Read( pnData, nBufferSize ) == nBufferSize )
3594 : : {
3595 [ # # ]: 0 : aMemStream.Write( pnData, nBufferSize );
3596 : :
3597 : : // create BIFF import stream to be able to use XclImpHyperlink class
3598 [ # # ]: 0 : XclImpStream aXclStrm( aMemStream, GetRoot() );
3599 [ # # ][ # # ]: 0 : if( aXclStrm.StartNextRecord() )
3600 [ # # ][ # # ]: 0 : aString = XclImpHyperlink::ReadEmbeddedData( aXclStrm );
[ # # ][ # # ]
3601 [ # # ]: 0 : }
3602 : : }
3603 : 71 : return aString;
3604 : : }
3605 : :
3606 : 62 : void XclImpDffConverter::ProcessDgContainer( SvStream& rDffStrm, const DffRecordHeader& rDgHeader )
3607 : : {
3608 : 62 : sal_Size nEndPos = rDgHeader.GetRecEndFilePos();
3609 [ + + ]: 198 : while( rDffStrm.Tell() < nEndPos )
3610 : : {
3611 : 136 : DffRecordHeader aHeader;
3612 [ + - ]: 136 : rDffStrm >> aHeader;
3613 [ + + + ]: 136 : switch( aHeader.nRecType )
3614 : : {
3615 : : case DFF_msofbtSolverContainer:
3616 [ + - ]: 12 : ProcessSolverContainer( rDffStrm, aHeader );
3617 : 12 : break;
3618 : : case DFF_msofbtSpgrContainer:
3619 [ + - ]: 62 : ProcessShGrContainer( rDffStrm, aHeader );
3620 : 62 : break;
3621 : : default:
3622 [ + - ]: 136 : aHeader.SeekToEndOfRecord( rDffStrm );
3623 : : }
3624 : : }
3625 : : // seek to end of drawing page container
3626 : 62 : rDgHeader.SeekToEndOfRecord( rDffStrm );
3627 : :
3628 : : // #i12638# #i37900# connector rules
3629 : 62 : XclImpSolverContainer& rSolverCont = GetConvData().maSolverCont;
3630 : 62 : rSolverCont.UpdateConnectorRules();
3631 : 62 : SolveSolver( rSolverCont );
3632 : 62 : rSolverCont.RemoveConnectorRules();
3633 : 62 : }
3634 : :
3635 : 62 : void XclImpDffConverter::ProcessShGrContainer( SvStream& rDffStrm, const DffRecordHeader& rShGrHeader )
3636 : : {
3637 : 62 : sal_Size nEndPos = rShGrHeader.GetRecEndFilePos();
3638 [ + + ]: 225 : while( rDffStrm.Tell() < nEndPos )
3639 : : {
3640 : 163 : DffRecordHeader aHeader;
3641 [ + - ]: 163 : rDffStrm >> aHeader;
3642 [ + - ]: 163 : switch( aHeader.nRecType )
3643 : : {
3644 : : case DFF_msofbtSpgrContainer:
3645 : : case DFF_msofbtSpContainer:
3646 [ + - ]: 163 : ProcessShContainer( rDffStrm, aHeader );
3647 : 163 : break;
3648 : : default:
3649 [ # # ]: 163 : aHeader.SeekToEndOfRecord( rDffStrm );
3650 : : }
3651 : : }
3652 : : // seek to end of shape group container
3653 : 62 : rShGrHeader.SeekToEndOfRecord( rDffStrm );
3654 : 62 : }
3655 : :
3656 : 12 : void XclImpDffConverter::ProcessSolverContainer( SvStream& rDffStrm, const DffRecordHeader& rSolverHeader )
3657 : : {
3658 : : // solver container wants to read the solver container header again
3659 : 12 : rSolverHeader.SeekToBegOfRecord( rDffStrm );
3660 : : // read the entire solver container
3661 : 12 : rDffStrm >> GetConvData().maSolverCont;
3662 : : // seek to end of solver container
3663 : 12 : rSolverHeader.SeekToEndOfRecord( rDffStrm );
3664 : 12 : }
3665 : :
3666 : 163 : void XclImpDffConverter::ProcessShContainer( SvStream& rDffStrm, const DffRecordHeader& rShHeader )
3667 : : {
3668 [ + - ]: 163 : rShHeader.SeekToBegOfRecord( rDffStrm );
3669 [ + - ]: 163 : Rectangle aDummy;
3670 : 163 : const XclImpDrawObjBase* pDrawObj = 0;
3671 : : /* The call to ImportObj() creates and returns a new SdrObject for the
3672 : : processed shape. We take ownership of the returned object here. If the
3673 : : shape is a group object, all embedded objects are created recursively,
3674 : : and the returned group object contains them all. ImportObj() calls the
3675 : : virtual functions ProcessClientAnchor2() and ProcessObj() and writes
3676 : : the pointer to the related draw object data (OBJ record) into pDrawObj. */
3677 [ + - ]: 163 : SdrObjectPtr xSdrObj( ImportObj( rDffStrm, &pDrawObj, aDummy, aDummy, 0, 0 ) );
3678 [ + + ][ + + ]: 163 : if( pDrawObj && xSdrObj.is() )
[ + + ]
3679 [ + - ][ + - ]: 68 : InsertSdrObject( GetConvData().mrSdrPage, *pDrawObj, xSdrObj.release() );
3680 [ + - ][ + - ]: 163 : rShHeader.SeekToEndOfRecord( rDffStrm );
3681 : 163 : }
3682 : :
3683 : 68 : void XclImpDffConverter::InsertSdrObject( SdrObjList& rObjList, const XclImpDrawObjBase& rDrawObj, SdrObject* pSdrObj )
3684 : : {
3685 [ + - ]: 68 : XclImpDffConvData& rConvData = GetConvData();
3686 : : /* Take ownership of the passed object. If insertion fails (e.g. rDrawObj
3687 : : states to skip insertion), the object is automatically deleted. */
3688 : 68 : SdrObjectPtr xSdrObj( pSdrObj );
3689 [ + - ][ + - ]: 68 : if( xSdrObj.is() && rDrawObj.IsInsertSdrObj() )
[ + - ]
3690 : : {
3691 [ + - ]: 68 : rObjList.NbcInsertObject( xSdrObj.release() );
3692 : : // callback to drawing manager for e.g. tracking of used sheet area
3693 [ + - ]: 68 : rConvData.mrDrawing.OnObjectInserted( rDrawObj );
3694 : : // callback to drawing object for post processing (use pSdrObj, xSdrObj already released)
3695 [ + - ]: 68 : rDrawObj.PostProcessSdrObject( *this, *pSdrObj );
3696 : : }
3697 : : /* SdrObject still here? Insertion failed, remove data from shape ID map.
3698 : : The SdrObject will be destructed then. */
3699 [ - + ]: 68 : if( xSdrObj.is() )
3700 [ # # ][ + - ]: 68 : rConvData.maSolverCont.RemoveSdrObjectInfo( *xSdrObj );
3701 : 68 : }
3702 : :
3703 : 26 : void XclImpDffConverter::InitControlForm()
3704 : : {
3705 : 26 : XclImpDffConvData& rConvData = GetConvData();
3706 [ + + ]: 26 : if( rConvData.mbHasCtrlForm )
3707 : 26 : return;
3708 : :
3709 : 5 : rConvData.mbHasCtrlForm = true;
3710 [ + - ]: 5 : if( SupportsOleObjects() ) try
3711 : : {
3712 [ + - ][ + - ]: 5 : Reference< XFormsSupplier > xFormsSupplier( rConvData.mrSdrPage.getUnoPage(), UNO_QUERY_THROW );
3713 [ + - ][ + - ]: 5 : Reference< XNameContainer > xFormsNC( xFormsSupplier->getForms(), UNO_SET_THROW );
[ + - ]
3714 : : // find or create the Standard form used to insert the imported controls
3715 [ + - ][ - + ]: 5 : if( xFormsNC->hasByName( maStdFormName ) )
[ + - ]
3716 : : {
3717 [ # # ][ # # ]: 0 : xFormsNC->getByName( maStdFormName ) >>= rConvData.mxCtrlForm;
[ # # ]
3718 : : }
3719 [ + - ][ + - ]: 5 : else if( SfxObjectShell* pDocShell = GetDocShell() )
3720 : : {
3721 [ + - ][ + - ]: 5 : rConvData.mxCtrlForm.set( ScfApiHelper::CreateInstance( pDocShell, CREATE_OUSTRING( "com.sun.star.form.component.Form" ) ), UNO_QUERY_THROW );
[ + - ]
3722 [ + - ][ + - ]: 5 : xFormsNC->insertByName( maStdFormName, Any( rConvData.mxCtrlForm ) );
[ + - ]
3723 [ # # ]: 5 : }
3724 : : }
3725 : 0 : catch( const Exception& )
3726 : : {
3727 : : }
3728 : : }
3729 : :
3730 : : // Drawing manager ============================================================
3731 : :
3732 : 86 : XclImpDrawing::XclImpDrawing( const XclImpRoot& rRoot, bool bOleObjects ) :
3733 : : XclImpRoot( rRoot ),
3734 [ + - ][ + - ]: 86 : mbOleObjs( bOleObjects )
[ + - ][ + - ]
[ + - ][ + - ]
3735 : : {
3736 : 86 : }
3737 : :
3738 [ + - ]: 86 : XclImpDrawing::~XclImpDrawing()
3739 : : {
3740 [ - + ]: 86 : }
3741 : :
3742 : 0 : Graphic XclImpDrawing::ReadImgData( const XclImpRoot& rRoot, XclImpStream& rStrm )
3743 : : {
3744 [ # # ]: 0 : Graphic aGraphic;
3745 : : sal_uInt16 nFormat, nEnv;
3746 : : sal_uInt32 nDataSize;
3747 [ # # ][ # # ]: 0 : rStrm >> nFormat >> nEnv >> nDataSize;
[ # # ]
3748 [ # # ][ # # ]: 0 : if( nDataSize <= rStrm.GetRecLeft() )
3749 : : {
3750 [ # # # ]: 0 : switch( nFormat )
3751 : : {
3752 [ # # ]: 0 : case EXC_IMGDATA_WMF: ReadWmf( aGraphic, rRoot, rStrm ); break;
3753 [ # # ]: 0 : case EXC_IMGDATA_BMP: ReadBmp( aGraphic, rRoot, rStrm ); break;
3754 : : default: OSL_FAIL( "XclImpDrawing::ReadImgData - unknown image format" );
3755 : : }
3756 : : }
3757 : 0 : return aGraphic;
3758 : : }
3759 : :
3760 : 0 : void XclImpDrawing::ReadObj( XclImpStream& rStrm )
3761 : : {
3762 [ # # ]: 0 : XclImpDrawObjRef xDrawObj;
3763 : :
3764 : : /* #i61786# In BIFF8 streams, OBJ records may occur without MSODRAWING
3765 : : records. In this case, the OBJ records are in BIFF5 format. Do a sanity
3766 : : check here that there is no DFF data loaded before. */
3767 : : OSL_ENSURE( maDffStrm.Tell() == 0, "XclImpDrawing::ReadObj - unexpected DFF stream data, OBJ will be ignored" );
3768 [ # # ]: 0 : if( maDffStrm.Tell() == 0 ) switch( GetBiff() )
[ # # # # ]
3769 : : {
3770 : : case EXC_BIFF3:
3771 [ # # ][ # # ]: 0 : xDrawObj = XclImpDrawObjBase::ReadObj3( GetRoot(), rStrm );
[ # # ]
3772 : 0 : break;
3773 : : case EXC_BIFF4:
3774 [ # # ][ # # ]: 0 : xDrawObj = XclImpDrawObjBase::ReadObj4( GetRoot(), rStrm );
[ # # ]
3775 : 0 : break;
3776 : : case EXC_BIFF5:
3777 : : case EXC_BIFF8:
3778 [ # # ][ # # ]: 0 : xDrawObj = XclImpDrawObjBase::ReadObj5( GetRoot(), rStrm );
[ # # ]
3779 : 0 : break;
3780 : : default:
3781 : : DBG_ERROR_BIFF();
3782 : : }
3783 : :
3784 [ # # ]: 0 : if( xDrawObj )
3785 : : {
3786 : : // insert into maRawObjs or into the last open group object
3787 [ # # ][ # # ]: 0 : maRawObjs.InsertGrouped( xDrawObj );
[ # # ]
3788 : : // to be able to find objects by ID
3789 [ # # ][ # # ]: 0 : maObjMapId[ xDrawObj->GetObjId() ] = xDrawObj;
3790 [ # # ]: 0 : }
3791 : 0 : }
3792 : :
3793 : 86 : void XclImpDrawing::ReadMsoDrawing( XclImpStream& rStrm )
3794 : : {
3795 : : OSL_ENSURE_BIFF( GetBiff() == EXC_BIFF8 );
3796 : : // disable internal CONTINUE handling
3797 : 86 : rStrm.ResetRecord( false );
3798 : : // read leading MSODRAWING record
3799 : 86 : ReadDffRecord( rStrm );
3800 : :
3801 : : // read following drawing records, but do not start following unrelated record
3802 : 86 : bool bLoop = true;
3803 [ + + + + ]: 450 : while( bLoop ) switch( rStrm.GetNextRecId() )
[ + + ]
3804 : : {
3805 : : case EXC_ID_MSODRAWING:
3806 : : case EXC_ID_MSODRAWINGSEL:
3807 : : case EXC_ID_CONT:
3808 : 129 : rStrm.StartNextRecord();
3809 : 129 : ReadDffRecord( rStrm );
3810 : 129 : break;
3811 : : case EXC_ID_OBJ:
3812 : 101 : rStrm.StartNextRecord();
3813 : 101 : ReadObj8( rStrm );
3814 : 101 : break;
3815 : : case EXC_ID_TXO:
3816 : 48 : rStrm.StartNextRecord();
3817 : 48 : ReadTxo( rStrm );
3818 : 48 : break;
3819 : : default:
3820 : 86 : bLoop = false;
3821 : : }
3822 : :
3823 : : // re-enable internal CONTINUE handling
3824 : 86 : rStrm.ResetRecord( true );
3825 : 86 : }
3826 : :
3827 : 264 : XclImpDrawObjRef XclImpDrawing::FindDrawObj( const DffRecordHeader& rHeader ) const
3828 : : {
3829 : : /* maObjMap stores objects by position of the client data (OBJ record) in
3830 : : the DFF stream, which is always behind shape start position of the
3831 : : passed header. The function upper_bound() finds the first element in
3832 : : the map whose key is greater than the start position of the header. Its
3833 : : end position is used to test whether the found object is really related
3834 : : to the shape. */
3835 [ + - ]: 264 : XclImpDrawObjRef xDrawObj;
3836 [ + - ]: 264 : XclImpObjMap::const_iterator aIt = maObjMap.upper_bound( rHeader.GetRecBegFilePos() );
3837 [ + + ][ + + ]: 264 : if( (aIt != maObjMap.end()) && (aIt->first <= rHeader.GetRecEndFilePos()) )
[ + - ][ + + ]
3838 [ + - ]: 264 : xDrawObj = aIt->second;
3839 : 264 : return xDrawObj;
3840 : : }
3841 : :
3842 : 30 : XclImpDrawObjRef XclImpDrawing::FindDrawObj( sal_uInt16 nObjId ) const
3843 : : {
3844 [ + - ]: 30 : XclImpDrawObjRef xDrawObj;
3845 [ + - ]: 30 : XclImpObjMapById::const_iterator aIt = maObjMapId.find( nObjId );
3846 [ + - ]: 30 : if( aIt != maObjMapId.end() )
3847 [ + - ]: 30 : xDrawObj = aIt->second;
3848 : 30 : return xDrawObj;
3849 : : }
3850 : :
3851 : 51 : const XclImpObjTextData* XclImpDrawing::FindTextData( const DffRecordHeader& rHeader ) const
3852 : : {
3853 : : /* maTextMap stores textbox data by position of the client data (TXO
3854 : : record) in the DFF stream, which is always behind shape start position
3855 : : of the passed header. The function upper_bound() finds the first
3856 : : element in the map whose key is greater than the start position of the
3857 : : header. Its end position is used to test whether the found object is
3858 : : really related to the shape. */
3859 [ + - ]: 51 : XclImpObjTextMap::const_iterator aIt = maTextMap.upper_bound( rHeader.GetRecBegFilePos() );
3860 [ + + ][ + - ]: 51 : if( (aIt != maTextMap.end()) && (aIt->first <= rHeader.GetRecEndFilePos()) )
[ + - ][ + + ]
3861 : 48 : return aIt->second.get();
3862 : 51 : return 0;
3863 : : }
3864 : :
3865 : 3 : void XclImpDrawing::SetSkipObj( sal_uInt16 nObjId )
3866 : : {
3867 : 3 : maSkipObjs.push_back( nObjId );
3868 : 3 : }
3869 : :
3870 : 86 : sal_Size XclImpDrawing::GetProgressSize() const
3871 : : {
3872 : 86 : sal_Size nProgressSize = maRawObjs.GetProgressSize();
3873 [ + + ]: 187 : for( XclImpObjMap::const_iterator aIt = maObjMap.begin(), aEnd = maObjMap.end(); aIt != aEnd; ++aIt )
3874 [ + - ]: 101 : nProgressSize += aIt->second->GetProgressSize();
3875 : 86 : return nProgressSize;
3876 : : }
3877 : :
3878 : 62 : void XclImpDrawing::ImplConvertObjects( XclImpDffConverter& rDffConv, SdrModel& rSdrModel, SdrPage& rSdrPage )
3879 : : {
3880 : : //rhbz#636521, disable undo during conversion. faster, smaller and stops
3881 : : //temp objects being inserted into the undo list
3882 : 62 : bool bOrigUndoStatus = rSdrModel.IsUndoEnabled();
3883 : 62 : rSdrModel.EnableUndo(false);
3884 : : // register this drawing manager at the passed (global) DFF manager
3885 : 62 : rDffConv.InitializeDrawing( *this, rSdrModel, rSdrPage );
3886 : : // process list of objects to be skipped
3887 [ + - ][ + - ]: 65 : for( ScfUInt16Vec::const_iterator aIt = maSkipObjs.begin(), aEnd = maSkipObjs.end(); aIt != aEnd; ++aIt )
[ + - ][ + + ]
[ + - ]
3888 [ + - ][ + - ]: 3 : if( XclImpDrawObjBase* pDrawObj = FindDrawObj( *aIt ).get() )
[ + - ][ + - ]
3889 : 3 : pDrawObj->SetProcessSdrObj( false );
3890 : : // process drawing objects without DFF data
3891 : 62 : rDffConv.ProcessDrawing( maRawObjs );
3892 : : // process all objects in the DFF stream
3893 : 62 : rDffConv.ProcessDrawing( maDffStrm );
3894 : : // unregister this drawing manager at the passed (global) DFF manager
3895 : 62 : rDffConv.FinalizeDrawing();
3896 : 62 : rSdrModel.EnableUndo(bOrigUndoStatus);
3897 : 62 : }
3898 : :
3899 : : // protected ------------------------------------------------------------------
3900 : :
3901 : 0 : void XclImpDrawing::AppendRawObject( const XclImpDrawObjRef& rxDrawObj )
3902 : : {
3903 : : OSL_ENSURE( rxDrawObj, "XclImpDrawing::AppendRawObject - unexpected empty reference" );
3904 : 0 : maRawObjs.push_back( rxDrawObj );
3905 : 0 : }
3906 : :
3907 : : // private --------------------------------------------------------------------
3908 : :
3909 : 0 : void XclImpDrawing::ReadWmf( Graphic& rGraphic, const XclImpRoot&, XclImpStream& rStrm ) // static helper
3910 : : {
3911 : : // extract graphic data from IMGDATA and following CONTINUE records
3912 [ # # ]: 0 : rStrm.Ignore( 8 );
3913 [ # # ]: 0 : SvMemoryStream aMemStrm;
3914 [ # # ][ # # ]: 0 : rStrm.CopyToStream( aMemStrm, rStrm.GetRecLeft() );
3915 [ # # ]: 0 : aMemStrm.Seek( STREAM_SEEK_TO_BEGIN );
3916 : : // import the graphic from memory stream
3917 [ # # ]: 0 : GDIMetaFile aGDIMetaFile;
3918 [ # # ][ # # ]: 0 : if( ::ReadWindowMetafile( aMemStrm, aGDIMetaFile, 0 ) )
3919 [ # # ][ # # ]: 0 : rGraphic = aGDIMetaFile;
[ # # ][ # # ]
[ # # ]
3920 : 0 : }
3921 : :
3922 : 0 : void XclImpDrawing::ReadBmp( Graphic& rGraphic, const XclImpRoot& rRoot, XclImpStream& rStrm ) // static helper
3923 : : {
3924 : : // extract graphic data from IMGDATA and following CONTINUE records
3925 [ # # ]: 0 : SvMemoryStream aMemStrm;
3926 : :
3927 : : /* Excel 3 and 4 seem to write broken BMP data. Usually they write a
3928 : : DIBCOREHEADER (12 bytes) containing width, height, planes = 1, and
3929 : : pixel depth = 32 bit. After that, 3 unused bytes are added before the
3930 : : actual pixel data. This does even confuse Excel 5 and later, which
3931 : : cannot read the image data correctly. */
3932 [ # # ]: 0 : if( rRoot.GetBiff() <= EXC_BIFF4 )
3933 : : {
3934 [ # # ]: 0 : rStrm.PushPosition();
3935 : : sal_uInt32 nHdrSize;
3936 : : sal_uInt16 nWidth, nHeight, nPlanes, nDepth;
3937 [ # # ][ # # ]: 0 : rStrm >> nHdrSize >> nWidth >> nHeight >> nPlanes >> nDepth;
[ # # ][ # # ]
[ # # ]
3938 [ # # ][ # # ]: 0 : if( (nHdrSize == 12) && (nPlanes == 1) && (nDepth == 32) )
[ # # ]
3939 : : {
3940 [ # # ]: 0 : rStrm.Ignore( 3 );
3941 [ # # ]: 0 : aMemStrm.SetNumberFormatInt( NUMBERFORMAT_INT_LITTLEENDIAN );
3942 [ # # ][ # # ]: 0 : aMemStrm << nHdrSize << nWidth << nHeight << nPlanes << nDepth;
[ # # ][ # # ]
[ # # ]
3943 [ # # ][ # # ]: 0 : rStrm.CopyToStream( aMemStrm, rStrm.GetRecLeft() );
3944 : : }
3945 [ # # ]: 0 : rStrm.PopPosition();
3946 : : }
3947 : :
3948 : : // no special handling above -> just copy the remaining record data
3949 [ # # ]: 0 : if( aMemStrm.Tell() == 0 )
3950 [ # # ][ # # ]: 0 : rStrm.CopyToStream( aMemStrm, rStrm.GetRecLeft() );
3951 : :
3952 : : // import the graphic from memory stream
3953 [ # # ]: 0 : aMemStrm.Seek( STREAM_SEEK_TO_BEGIN );
3954 [ # # ]: 0 : Bitmap aBitmap;
3955 [ # # ][ # # ]: 0 : if( aBitmap.Read( aMemStrm, false ) ) // read DIB without file header
3956 [ # # ][ # # ]: 0 : rGraphic = aBitmap;
[ # # ][ # # ]
[ # # ]
3957 : 0 : }
3958 : :
3959 : 215 : void XclImpDrawing::ReadDffRecord( XclImpStream& rStrm )
3960 : : {
3961 : 215 : maDffStrm.Seek( STREAM_SEEK_TO_END );
3962 : 215 : rStrm.CopyRecordToStream( maDffStrm );
3963 : 215 : }
3964 : :
3965 : 101 : void XclImpDrawing::ReadObj8( XclImpStream& rStrm )
3966 : : {
3967 [ + - ]: 101 : XclImpDrawObjRef xDrawObj = XclImpDrawObjBase::ReadObj8( GetRoot(), rStrm );
3968 : : // store the new object in the internal containers
3969 [ + - ][ + - ]: 101 : maObjMap[ maDffStrm.Tell() ] = xDrawObj;
3970 [ + - ][ + - ]: 101 : maObjMapId[ xDrawObj->GetObjId() ] = xDrawObj;
[ + - ]
3971 : 101 : }
3972 : :
3973 : 48 : void XclImpDrawing::ReadTxo( XclImpStream& rStrm )
3974 : : {
3975 [ + - ][ + - ]: 48 : XclImpObjTextRef xTextData( new XclImpObjTextData );
[ + - ]
3976 [ + - ][ + - ]: 48 : maTextMap[ maDffStrm.Tell() ] = xTextData;
3977 : :
3978 : : // 1) read the TXO record
3979 [ + - ]: 48 : xTextData->maData.ReadTxo8( rStrm );
3980 : :
3981 : : // 2) first CONTINUE with string
3982 [ + - ]: 48 : xTextData->mxString.reset();
3983 : 48 : bool bValid = true;
3984 [ + - ]: 48 : if( xTextData->maData.mnTextLen > 0 )
3985 : : {
3986 [ + - ][ + - ]: 48 : bValid = (rStrm.GetNextRecId() == EXC_ID_CONT) && rStrm.StartNextRecord();
[ + - ][ + - ]
3987 : : OSL_ENSURE( bValid, "XclImpDrawing::ReadTxo - missing CONTINUE record" );
3988 [ + - ]: 48 : if( bValid )
3989 [ + - ][ + - ]: 48 : xTextData->mxString.reset( new XclImpString( rStrm.ReadUniString( xTextData->maData.mnTextLen ) ) );
[ + - ][ + - ]
[ + - ]
3990 : : }
3991 : :
3992 : : // 3) second CONTINUE with formatting runs
3993 [ + - ]: 48 : if( xTextData->maData.mnFormatSize > 0 )
3994 : : {
3995 [ + - ][ + - ]: 48 : bValid = (rStrm.GetNextRecId() == EXC_ID_CONT) && rStrm.StartNextRecord();
[ + - ][ + - ]
3996 : : OSL_ENSURE( bValid, "XclImpDrawing::ReadTxo - missing CONTINUE record" );
3997 [ + - ]: 48 : if( bValid )
3998 [ + - ]: 48 : xTextData->ReadFormats( rStrm );
3999 [ + - ]: 48 : }
4000 : 48 : }
4001 : :
4002 : : // ----------------------------------------------------------------------------
4003 : :
4004 : 86 : XclImpSheetDrawing::XclImpSheetDrawing( const XclImpRoot& rRoot, SCTAB nScTab ) :
4005 : : XclImpDrawing( rRoot, true ),
4006 : 86 : maScUsedArea( ScAddress::INITIALIZE_INVALID )
4007 : : {
4008 : 86 : maScUsedArea.aStart.SetTab( nScTab );
4009 : 86 : maScUsedArea.aEnd.SetTab( nScTab );
4010 : 86 : }
4011 : :
4012 : 3 : void XclImpSheetDrawing::ReadNote( XclImpStream& rStrm )
4013 : : {
4014 [ - + - ]: 3 : switch( GetBiff() )
4015 : : {
4016 : : case EXC_BIFF2:
4017 : : case EXC_BIFF3:
4018 : : case EXC_BIFF4:
4019 : : case EXC_BIFF5:
4020 : 0 : ReadNote3( rStrm );
4021 : 0 : break;
4022 : : case EXC_BIFF8:
4023 : 3 : ReadNote8( rStrm );
4024 : 3 : break;
4025 : : default:
4026 : : DBG_ERROR_BIFF();
4027 : : }
4028 : 3 : }
4029 : :
4030 : 0 : void XclImpSheetDrawing::ReadTabChart( XclImpStream& rStrm )
4031 : : {
4032 : : OSL_ENSURE_BIFF( GetBiff() >= EXC_BIFF5 );
4033 [ # # ][ # # ]: 0 : boost::shared_ptr< XclImpChartObj > xChartObj( new XclImpChartObj( GetRoot(), true ) );
[ # # ]
4034 [ # # ]: 0 : xChartObj->ReadChartSubStream( rStrm );
4035 : : // insert the chart as raw object without connected DFF data
4036 [ # # ][ # # ]: 0 : AppendRawObject( xChartObj );
[ # # ][ # # ]
4037 : 0 : }
4038 : :
4039 : 62 : void XclImpSheetDrawing::ConvertObjects( XclImpDffConverter& rDffConv )
4040 : : {
4041 [ + - ]: 62 : if( SdrModel* pSdrModel = GetDoc().GetDrawLayer() )
4042 [ + - ]: 62 : if( SdrPage* pSdrPage = GetSdrPage( maScUsedArea.aStart.Tab() ) )
4043 : 62 : ImplConvertObjects( rDffConv, *pSdrModel, *pSdrPage );
4044 : 62 : }
4045 : :
4046 : 101 : Rectangle XclImpSheetDrawing::CalcAnchorRect( const XclObjAnchor& rAnchor, bool /*bDffAnchor*/ ) const
4047 : : {
4048 : 101 : return rAnchor.GetRect( GetRoot(), maScUsedArea.aStart.Tab(), MAP_100TH_MM );
4049 : : }
4050 : :
4051 : 68 : void XclImpSheetDrawing::OnObjectInserted( const XclImpDrawObjBase& rDrawObj )
4052 : : {
4053 [ + - ]: 68 : ScRange aScObjArea = rDrawObj.GetUsedArea( maScUsedArea.aStart.Tab() );
4054 [ + - ]: 68 : if( aScObjArea.IsValid() )
4055 [ + - ]: 68 : maScUsedArea.ExtendTo( aScObjArea );
4056 : 68 : }
4057 : :
4058 : : // private --------------------------------------------------------------------
4059 : :
4060 : 0 : void XclImpSheetDrawing::ReadNote3( XclImpStream& rStrm )
4061 : : {
4062 : 0 : XclAddress aXclPos;
4063 : : sal_uInt16 nTotalLen;
4064 [ # # ][ # # ]: 0 : rStrm >> aXclPos >> nTotalLen;
4065 : :
4066 : 0 : ScAddress aScNotePos( ScAddress::UNINITIALIZED );
4067 [ # # ][ # # ]: 0 : if( GetAddressConverter().ConvertAddress( aScNotePos, aXclPos, maScUsedArea.aStart.Tab(), true ) )
[ # # ]
4068 : : {
4069 [ # # ][ # # ]: 0 : sal_uInt16 nPartLen = ::std::min( nTotalLen, static_cast< sal_uInt16 >( rStrm.GetRecLeft() ) );
4070 [ # # ]: 0 : String aNoteText = rStrm.ReadRawByteString( nPartLen );
4071 : 0 : nTotalLen = nTotalLen - nPartLen;
4072 [ # # ][ # # ]: 0 : while( (nTotalLen > 0) && (rStrm.GetNextRecId() == EXC_ID_NOTE) && rStrm.StartNextRecord() )
[ # # ][ # # ]
[ # # ][ # # ]
4073 : : {
4074 [ # # ][ # # ]: 0 : rStrm >> aXclPos >> nPartLen;
4075 : : OSL_ENSURE( aXclPos.mnRow == 0xFFFF, "XclImpObjectManager::ReadNote3 - missing continuation NOTE record" );
4076 [ # # ]: 0 : if( aXclPos.mnRow == 0xFFFF )
4077 : : {
4078 : : OSL_ENSURE( nPartLen <= nTotalLen, "XclImpObjectManager::ReadNote3 - string too long" );
4079 [ # # ][ # # ]: 0 : aNoteText.Append( rStrm.ReadRawByteString( nPartLen ) );
[ # # ]
4080 [ # # ]: 0 : nTotalLen = nTotalLen - ::std::min( nTotalLen, nPartLen );
4081 : : }
4082 : : else
4083 : : {
4084 : : // seems to be a new note, record already started -> load the note
4085 [ # # ]: 0 : rStrm.Seek( EXC_REC_SEEK_TO_BEGIN );
4086 [ # # ]: 0 : ReadNote( rStrm );
4087 : 0 : nTotalLen = 0;
4088 : : }
4089 : : }
4090 [ # # ][ # # ]: 0 : ScNoteUtil::CreateNoteFromString( GetDoc(), aScNotePos, aNoteText, false, false );
[ # # ]
4091 : : }
4092 : 0 : }
4093 : :
4094 : 3 : void XclImpSheetDrawing::ReadNote8( XclImpStream& rStrm )
4095 : : {
4096 : 3 : XclAddress aXclPos;
4097 : : sal_uInt16 nFlags, nObjId;
4098 [ + - ][ + - ]: 3 : rStrm >> aXclPos >> nFlags >> nObjId;
[ + - ]
4099 : :
4100 : 3 : ScAddress aScNotePos( ScAddress::UNINITIALIZED );
4101 [ + - ][ + - ]: 3 : if( GetAddressConverter().ConvertAddress( aScNotePos, aXclPos, maScUsedArea.aStart.Tab(), true ) )
[ + - ]
4102 [ + - ]: 3 : if( nObjId != EXC_OBJ_INVALID_ID )
4103 [ + - ][ - + ]: 3 : if( XclImpNoteObj* pNoteObj = dynamic_cast< XclImpNoteObj* >( FindDrawObj( nObjId ).get() ) )
[ + - ][ + - ]
4104 : 3 : pNoteObj->SetNoteData( aScNotePos, nFlags );
4105 : 3 : }
4106 : :
4107 : : // The object manager =========================================================
4108 : :
4109 : 55 : XclImpObjectManager::XclImpObjectManager( const XclImpRoot& rRoot ) :
4110 [ + - ][ + - ]: 55 : XclImpRoot( rRoot )
[ + - ]
4111 : : {
4112 [ + - ][ + - ]: 55 : maDefObjNames[ EXC_OBJTYPE_GROUP ] = CREATE_STRING( "Group" );
[ + - ][ + - ]
4113 [ + - ][ + - ]: 55 : maDefObjNames[ EXC_OBJTYPE_LINE ] = ScGlobal::GetRscString( STR_SHAPE_LINE );
[ + - ]
4114 [ + - ][ + - ]: 55 : maDefObjNames[ EXC_OBJTYPE_RECTANGLE ] = ScGlobal::GetRscString( STR_SHAPE_RECTANGLE );
[ + - ]
4115 [ + - ][ + - ]: 55 : maDefObjNames[ EXC_OBJTYPE_OVAL ] = ScGlobal::GetRscString( STR_SHAPE_OVAL );
[ + - ]
4116 [ + - ][ + - ]: 55 : maDefObjNames[ EXC_OBJTYPE_ARC ] = CREATE_STRING( "Arc" );
[ + - ][ + - ]
4117 [ + - ][ + - ]: 55 : maDefObjNames[ EXC_OBJTYPE_CHART ] = CREATE_STRING( "Chart" );
[ + - ][ + - ]
4118 [ + - ][ + - ]: 55 : maDefObjNames[ EXC_OBJTYPE_TEXT ] = CREATE_STRING( "Text" );
[ + - ][ + - ]
4119 [ + - ][ + - ]: 55 : maDefObjNames[ EXC_OBJTYPE_BUTTON ] = ScGlobal::GetRscString( STR_FORM_BUTTON );
[ + - ]
4120 [ + - ][ + - ]: 55 : maDefObjNames[ EXC_OBJTYPE_PICTURE ] = CREATE_STRING( "Picture" );
[ + - ][ + - ]
4121 [ + - ][ + - ]: 55 : maDefObjNames[ EXC_OBJTYPE_POLYGON ] = CREATE_STRING( "Freeform" );
[ + - ][ + - ]
4122 [ + - ][ + - ]: 55 : maDefObjNames[ EXC_OBJTYPE_CHECKBOX ] = ScGlobal::GetRscString( STR_FORM_CHECKBOX );
[ + - ]
4123 [ + - ][ + - ]: 55 : maDefObjNames[ EXC_OBJTYPE_OPTIONBUTTON ] = ScGlobal::GetRscString( STR_FORM_OPTIONBUTTON );
[ + - ]
4124 [ + - ][ + - ]: 55 : maDefObjNames[ EXC_OBJTYPE_EDIT ] = CREATE_STRING( "Edit Box" );
[ + - ][ + - ]
4125 [ + - ][ + - ]: 55 : maDefObjNames[ EXC_OBJTYPE_LABEL ] = ScGlobal::GetRscString( STR_FORM_LABEL );
[ + - ]
4126 [ + - ][ + - ]: 55 : maDefObjNames[ EXC_OBJTYPE_DIALOG ] = CREATE_STRING( "Dialog Frame" );
[ + - ][ + - ]
4127 [ + - ][ + - ]: 55 : maDefObjNames[ EXC_OBJTYPE_SPIN ] = ScGlobal::GetRscString( STR_FORM_SPINNER );
[ + - ]
4128 [ + - ][ + - ]: 55 : maDefObjNames[ EXC_OBJTYPE_SCROLLBAR ] = ScGlobal::GetRscString( STR_FORM_SCROLLBAR );
[ + - ]
4129 [ + - ][ + - ]: 55 : maDefObjNames[ EXC_OBJTYPE_LISTBOX ] = ScGlobal::GetRscString( STR_FORM_LISTBOX );
[ + - ]
4130 [ + - ][ + - ]: 55 : maDefObjNames[ EXC_OBJTYPE_GROUPBOX ] = ScGlobal::GetRscString( STR_FORM_GROUPBOX );
[ + - ]
4131 [ + - ][ + - ]: 55 : maDefObjNames[ EXC_OBJTYPE_DROPDOWN ] = ScGlobal::GetRscString( STR_FORM_DROPDOWN );
[ + - ]
4132 [ + - ][ + - ]: 55 : maDefObjNames[ EXC_OBJTYPE_NOTE ] = CREATE_STRING( "Comment" );
[ + - ][ + - ]
4133 [ + - ][ + - ]: 55 : maDefObjNames[ EXC_OBJTYPE_DRAWING ] = ScGlobal::GetRscString( STR_SHAPE_AUTOSHAPE );
[ + - ]
4134 : 55 : }
4135 : :
4136 [ + - ]: 55 : XclImpObjectManager::~XclImpObjectManager()
4137 : : {
4138 [ - + ]: 110 : }
4139 : :
4140 : 29 : void XclImpObjectManager::ReadMsoDrawingGroup( XclImpStream& rStrm )
4141 : : {
4142 : : OSL_ENSURE_BIFF( GetBiff() == EXC_BIFF8 );
4143 : : // Excel continues this record with MSODRAWINGGROUP and CONTINUE records, hmm.
4144 : 29 : rStrm.ResetRecord( true, EXC_ID_MSODRAWINGGROUP );
4145 : 29 : maDggStrm.Seek( STREAM_SEEK_TO_END );
4146 : 29 : rStrm.CopyRecordToStream( maDggStrm );
4147 : 29 : }
4148 : :
4149 : 116 : XclImpSheetDrawing& XclImpObjectManager::GetSheetDrawing( SCTAB nScTab )
4150 : : {
4151 : 116 : XclImpSheetDrawingRef& rxDrawing = maSheetDrawings[ nScTab ];
4152 [ + + ]: 116 : if( !rxDrawing )
4153 [ + - ]: 86 : rxDrawing.reset( new XclImpSheetDrawing( GetRoot(), nScTab ) );
4154 : 116 : return *rxDrawing;
4155 : : }
4156 : :
4157 : 55 : void XclImpObjectManager::ConvertObjects()
4158 : : {
4159 : : RTL_LOGFILE_CONTEXT_AUTHOR( aLog, "sc", "dr104026", "XclImpObjectManager::ConvertObjects" );
4160 : :
4161 : : // do nothing if the document does not contain a drawing layer
4162 [ + - ][ + - ]: 55 : if( !GetDoc().GetDrawLayer() )
4163 : : return;
4164 : :
4165 : : // get total progress bar size for all sheet drawing managers
4166 : 55 : sal_Size nProgressSize = 0;
4167 [ + + ]: 141 : for( XclImpSheetDrawingMap::iterator aIt = maSheetDrawings.begin(), aEnd = maSheetDrawings.end(); aIt != aEnd; ++aIt )
4168 [ + - ]: 86 : nProgressSize += aIt->second->GetProgressSize();
4169 : : // nothing to do if progress bar is zero (no objects present)
4170 [ + + ]: 55 : if( nProgressSize == 0 )
4171 : : return;
4172 : :
4173 [ + - ]: 17 : XclImpDffConverter aDffConv( GetRoot(), maDggStrm );
4174 [ + - ]: 17 : aDffConv.StartProgressBar( nProgressSize );
4175 [ + + ]: 79 : for( XclImpSheetDrawingMap::iterator aIt = maSheetDrawings.begin(), aEnd = maSheetDrawings.end(); aIt != aEnd; ++aIt )
4176 [ + - ][ + - ]: 117 : aIt->second->ConvertObjects( aDffConv );
4177 : :
4178 : : // #i112436# don't call ScChartListenerCollection::SetDirty here,
4179 : : // instead use InterpretDirtyCells in ScDocument::CalcAfterLoad.
4180 : : }
4181 : :
4182 : 72 : OUString XclImpObjectManager::GetDefaultObjName( const XclImpDrawObjBase& rDrawObj ) const
4183 : : {
4184 : 72 : rtl::OUStringBuffer aDefName;
4185 [ + - ]: 72 : DefObjNameMap::const_iterator aIt = maDefObjNames.find( rDrawObj.GetObjType() );
4186 [ + - ][ + - ]: 72 : if( aIt != maDefObjNames.end() )
4187 [ + - ][ + - ]: 72 : aDefName.append(aIt->second);
[ + - ]
4188 [ + - ][ + - ]: 72 : return aDefName.append(' ').append(static_cast<sal_Int32>(rDrawObj.GetObjId())).makeStringAndClear();
[ + - ]
4189 : : }
4190 : :
4191 : 55 : ScRange XclImpObjectManager::GetUsedArea( SCTAB nScTab ) const
4192 : : {
4193 [ + - ]: 55 : XclImpSheetDrawingMap::const_iterator aIt = maSheetDrawings.find( nScTab );
4194 [ + + ]: 55 : if( aIt != maSheetDrawings.end() )
4195 : 29 : return aIt->second->GetUsedArea();
4196 : 55 : return ScRange( ScAddress::INITIALIZE_INVALID );
4197 : : }
4198 : :
4199 : : // DFF property set helper ====================================================
4200 : :
4201 : 0 : XclImpDffPropSet::XclImpDffPropSet( const XclImpRoot& rRoot ) :
4202 : : XclImpRoot( rRoot ),
4203 [ # # ][ # # ]: 0 : maDffConv( rRoot, maDummyStrm )
4204 : : {
4205 : 0 : }
4206 : :
4207 : 0 : void XclImpDffPropSet::Read( XclImpStream& rStrm )
4208 : : {
4209 : : sal_uInt32 nPropSetSize;
4210 : :
4211 [ # # ]: 0 : rStrm.PushPosition();
4212 [ # # ]: 0 : rStrm.Ignore( 4 );
4213 [ # # ]: 0 : rStrm >> nPropSetSize;
4214 [ # # ]: 0 : rStrm.PopPosition();
4215 : :
4216 [ # # ][ # # ]: 0 : mxMemStrm.reset( new SvMemoryStream );
4217 [ # # ]: 0 : rStrm.CopyToStream( *mxMemStrm, 8 + nPropSetSize );
4218 [ # # ]: 0 : mxMemStrm->Seek( STREAM_SEEK_TO_BEGIN );
4219 [ # # ]: 0 : maDffConv.ReadPropSet( *mxMemStrm, 0 );
4220 : 0 : }
4221 : :
4222 : 0 : sal_uInt32 XclImpDffPropSet::GetPropertyValue( sal_uInt16 nPropId, sal_uInt32 nDefault ) const
4223 : : {
4224 : 0 : return maDffConv.GetPropertyValue( nPropId, nDefault );
4225 : : }
4226 : :
4227 : 0 : void XclImpDffPropSet::FillToItemSet( SfxItemSet& rItemSet ) const
4228 : : {
4229 [ # # ]: 0 : if( mxMemStrm.get() )
4230 : 0 : maDffConv.ApplyAttributes( *mxMemStrm, rItemSet );
4231 : 0 : }
4232 : :
4233 : 0 : XclImpStream& operator>>( XclImpStream& rStrm, XclImpDffPropSet& rPropSet )
4234 : : {
4235 : 0 : rPropSet.Read( rStrm );
4236 : 0 : return rStrm;
4237 [ + - ][ + - ]: 24 : }
4238 : :
4239 : : // ============================================================================
4240 : :
4241 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|