1*d0626817SAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
3*d0626817SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4*d0626817SAndrew Rist * or more contributor license agreements. See the NOTICE file
5*d0626817SAndrew Rist * distributed with this work for additional information
6*d0626817SAndrew Rist * regarding copyright ownership. The ASF licenses this file
7*d0626817SAndrew Rist * to you under the Apache License, Version 2.0 (the
8*d0626817SAndrew Rist * "License"); you may not use this file except in compliance
9*d0626817SAndrew Rist * with the License. You may obtain a copy of the License at
10*d0626817SAndrew Rist *
11*d0626817SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12*d0626817SAndrew Rist *
13*d0626817SAndrew Rist * Unless required by applicable law or agreed to in writing,
14*d0626817SAndrew Rist * software distributed under the License is distributed on an
15*d0626817SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*d0626817SAndrew Rist * KIND, either express or implied. See the License for the
17*d0626817SAndrew Rist * specific language governing permissions and limitations
18*d0626817SAndrew Rist * under the License.
19*d0626817SAndrew Rist *
20*d0626817SAndrew Rist *************************************************************/
21*d0626817SAndrew Rist
22*d0626817SAndrew Rist
23cdf0e10cSrcweir
24cdf0e10cSrcweir #include "oox/xls/drawingmanager.hxx"
25cdf0e10cSrcweir
26cdf0e10cSrcweir #include <com/sun/star/awt/Rectangle.hpp>
27cdf0e10cSrcweir #include <com/sun/star/drawing/CircleKind.hpp>
28cdf0e10cSrcweir #include <com/sun/star/drawing/PointSequenceSequence.hpp>
29cdf0e10cSrcweir #include <com/sun/star/drawing/PolygonKind.hpp>
30cdf0e10cSrcweir #include <com/sun/star/drawing/XShapes.hpp>
31cdf0e10cSrcweir #include "oox/core/filterbase.hxx"
32cdf0e10cSrcweir #include "oox/drawingml/fillproperties.hxx"
33cdf0e10cSrcweir #include "oox/drawingml/lineproperties.hxx"
34cdf0e10cSrcweir #include "oox/drawingml/shapepropertymap.hxx"
35cdf0e10cSrcweir #include "oox/helper/containerhelper.hxx"
36cdf0e10cSrcweir #include "oox/token/tokens.hxx"
37cdf0e10cSrcweir #include "oox/xls/biffinputstream.hxx"
38cdf0e10cSrcweir #include "oox/xls/unitconverter.hxx"
39cdf0e10cSrcweir
40cdf0e10cSrcweir namespace oox {
41cdf0e10cSrcweir namespace xls {
42cdf0e10cSrcweir
43cdf0e10cSrcweir // ============================================================================
44cdf0e10cSrcweir
45cdf0e10cSrcweir using namespace ::com::sun::star::awt;
46cdf0e10cSrcweir using namespace ::com::sun::star::drawing;
47cdf0e10cSrcweir using namespace ::com::sun::star::lang;
48cdf0e10cSrcweir using namespace ::com::sun::star::uno;
49cdf0e10cSrcweir using namespace ::oox::drawingml;
50cdf0e10cSrcweir
51cdf0e10cSrcweir using ::rtl::OUString;
52cdf0e10cSrcweir
53cdf0e10cSrcweir // ============================================================================
54cdf0e10cSrcweir
55cdf0e10cSrcweir namespace {
56cdf0e10cSrcweir
57cdf0e10cSrcweir // OBJ record -----------------------------------------------------------------
58cdf0e10cSrcweir
59cdf0e10cSrcweir const sal_uInt16 BIFF_OBJTYPE_GROUP = 0;
60cdf0e10cSrcweir const sal_uInt16 BIFF_OBJTYPE_LINE = 1;
61cdf0e10cSrcweir const sal_uInt16 BIFF_OBJTYPE_RECTANGLE = 2;
62cdf0e10cSrcweir const sal_uInt16 BIFF_OBJTYPE_OVAL = 3;
63cdf0e10cSrcweir const sal_uInt16 BIFF_OBJTYPE_ARC = 4;
64cdf0e10cSrcweir const sal_uInt16 BIFF_OBJTYPE_CHART = 5;
65cdf0e10cSrcweir const sal_uInt16 BIFF_OBJTYPE_TEXT = 6;
66cdf0e10cSrcweir const sal_uInt16 BIFF_OBJTYPE_BUTTON = 7;
67cdf0e10cSrcweir const sal_uInt16 BIFF_OBJTYPE_PICTURE = 8;
68cdf0e10cSrcweir const sal_uInt16 BIFF_OBJTYPE_POLYGON = 9; // new in BIFF4
69cdf0e10cSrcweir const sal_uInt16 BIFF_OBJTYPE_CHECKBOX = 11; // new in BIFF5
70cdf0e10cSrcweir const sal_uInt16 BIFF_OBJTYPE_OPTIONBUTTON = 12;
71cdf0e10cSrcweir const sal_uInt16 BIFF_OBJTYPE_EDIT = 13;
72cdf0e10cSrcweir const sal_uInt16 BIFF_OBJTYPE_LABEL = 14;
73cdf0e10cSrcweir const sal_uInt16 BIFF_OBJTYPE_DIALOG = 15;
74cdf0e10cSrcweir const sal_uInt16 BIFF_OBJTYPE_SPIN = 16;
75cdf0e10cSrcweir const sal_uInt16 BIFF_OBJTYPE_SCROLLBAR = 17;
76cdf0e10cSrcweir const sal_uInt16 BIFF_OBJTYPE_LISTBOX = 18;
77cdf0e10cSrcweir const sal_uInt16 BIFF_OBJTYPE_GROUPBOX = 19;
78cdf0e10cSrcweir const sal_uInt16 BIFF_OBJTYPE_DROPDOWN = 20;
79cdf0e10cSrcweir const sal_uInt16 BIFF_OBJTYPE_NOTE = 25; // new in BIFF8
80cdf0e10cSrcweir const sal_uInt16 BIFF_OBJTYPE_DRAWING = 30;
81cdf0e10cSrcweir const sal_uInt16 BIFF_OBJTYPE_UNKNOWN = 0xFFFF; // for internal use only
82cdf0e10cSrcweir
83cdf0e10cSrcweir const sal_uInt16 BIFF_OBJ_HIDDEN = 0x0100;
84cdf0e10cSrcweir const sal_uInt16 BIFF_OBJ_VISIBLE = 0x0200;
85cdf0e10cSrcweir const sal_uInt16 BIFF_OBJ_PRINTABLE = 0x0400;
86cdf0e10cSrcweir
87cdf0e10cSrcweir // line formatting ------------------------------------------------------------
88cdf0e10cSrcweir
89cdf0e10cSrcweir const sal_uInt8 BIFF_OBJ_LINE_AUTOCOLOR = 64;
90cdf0e10cSrcweir
91cdf0e10cSrcweir const sal_uInt8 BIFF_OBJ_LINE_SOLID = 0;
92cdf0e10cSrcweir const sal_uInt8 BIFF_OBJ_LINE_DASH = 1;
93cdf0e10cSrcweir const sal_uInt8 BIFF_OBJ_LINE_DOT = 2;
94cdf0e10cSrcweir const sal_uInt8 BIFF_OBJ_LINE_DASHDOT = 3;
95cdf0e10cSrcweir const sal_uInt8 BIFF_OBJ_LINE_DASHDOTDOT = 4;
96cdf0e10cSrcweir const sal_uInt8 BIFF_OBJ_LINE_MEDTRANS = 5;
97cdf0e10cSrcweir const sal_uInt8 BIFF_OBJ_LINE_DARKTRANS = 6;
98cdf0e10cSrcweir const sal_uInt8 BIFF_OBJ_LINE_LIGHTTRANS = 7;
99cdf0e10cSrcweir const sal_uInt8 BIFF_OBJ_LINE_NONE = 255;
100cdf0e10cSrcweir
101cdf0e10cSrcweir const sal_uInt8 BIFF_OBJ_LINE_HAIR = 0;
102cdf0e10cSrcweir const sal_uInt8 BIFF_OBJ_LINE_THIN = 1;
103cdf0e10cSrcweir const sal_uInt8 BIFF_OBJ_LINE_MEDIUM = 2;
104cdf0e10cSrcweir const sal_uInt8 BIFF_OBJ_LINE_THICK = 3;
105cdf0e10cSrcweir
106cdf0e10cSrcweir const sal_uInt8 BIFF_OBJ_LINE_AUTO = 0x01;
107cdf0e10cSrcweir
108cdf0e10cSrcweir const sal_uInt8 BIFF_OBJ_ARROW_NONE = 0;
109cdf0e10cSrcweir const sal_uInt8 BIFF_OBJ_ARROW_OPEN = 1;
110cdf0e10cSrcweir const sal_uInt8 BIFF_OBJ_ARROW_FILLED = 2;
111cdf0e10cSrcweir const sal_uInt8 BIFF_OBJ_ARROW_OPENBOTH = 3;
112cdf0e10cSrcweir const sal_uInt8 BIFF_OBJ_ARROW_FILLEDBOTH = 4;
113cdf0e10cSrcweir
114cdf0e10cSrcweir const sal_uInt8 BIFF_OBJ_ARROW_NARROW = 0;
115cdf0e10cSrcweir const sal_uInt8 BIFF_OBJ_ARROW_MEDIUM = 1;
116cdf0e10cSrcweir const sal_uInt8 BIFF_OBJ_ARROW_WIDE = 2;
117cdf0e10cSrcweir
118cdf0e10cSrcweir const sal_uInt8 BIFF_OBJ_LINE_TL = 0;
119cdf0e10cSrcweir const sal_uInt8 BIFF_OBJ_LINE_TR = 1;
120cdf0e10cSrcweir const sal_uInt8 BIFF_OBJ_LINE_BR = 2;
121cdf0e10cSrcweir const sal_uInt8 BIFF_OBJ_LINE_BL = 3;
122cdf0e10cSrcweir
123cdf0e10cSrcweir const sal_uInt8 BIFF_OBJ_ARC_TR = 0;
124cdf0e10cSrcweir const sal_uInt8 BIFF_OBJ_ARC_TL = 1;
125cdf0e10cSrcweir const sal_uInt8 BIFF_OBJ_ARC_BL = 2;
126cdf0e10cSrcweir const sal_uInt8 BIFF_OBJ_ARC_BR = 3;
127cdf0e10cSrcweir
128cdf0e10cSrcweir const sal_uInt16 BIFF_OBJ_POLY_CLOSED = 0x0100;
129cdf0e10cSrcweir
130cdf0e10cSrcweir // fill formatting ------------------------------------------------------------
131cdf0e10cSrcweir
132cdf0e10cSrcweir const sal_uInt8 BIFF_OBJ_FILL_AUTOCOLOR = 65;
133cdf0e10cSrcweir
134cdf0e10cSrcweir const sal_uInt8 BIFF_OBJ_PATT_NONE = 0;
135cdf0e10cSrcweir const sal_uInt8 BIFF_OBJ_PATT_SOLID = 1;
136cdf0e10cSrcweir
137cdf0e10cSrcweir const sal_uInt8 BIFF_OBJ_FILL_AUTO = 0x01;
138cdf0e10cSrcweir
139cdf0e10cSrcweir // text formatting ------------------------------------------------------------
140cdf0e10cSrcweir
141cdf0e10cSrcweir const sal_uInt8 BIFF_OBJ_HOR_LEFT = 1;
142cdf0e10cSrcweir const sal_uInt8 BIFF_OBJ_HOR_CENTER = 2;
143cdf0e10cSrcweir const sal_uInt8 BIFF_OBJ_HOR_RIGHT = 3;
144cdf0e10cSrcweir const sal_uInt8 BIFF_OBJ_HOR_JUSTIFY = 4;
145cdf0e10cSrcweir
146cdf0e10cSrcweir const sal_uInt8 BIFF_OBJ_VER_TOP = 1;
147cdf0e10cSrcweir const sal_uInt8 BIFF_OBJ_VER_CENTER = 2;
148cdf0e10cSrcweir const sal_uInt8 BIFF_OBJ_VER_BOTTOM = 3;
149cdf0e10cSrcweir const sal_uInt8 BIFF_OBJ_VER_JUSTIFY = 4;
150cdf0e10cSrcweir
151cdf0e10cSrcweir const sal_uInt16 BIFF_OBJ_ORIENT_NONE = 0;
152cdf0e10cSrcweir const sal_uInt16 BIFF_OBJ_ORIENT_STACKED = 1; /// Stacked top to bottom.
153cdf0e10cSrcweir const sal_uInt16 BIFF_OBJ_ORIENT_90CCW = 2; /// 90 degr. counterclockwise.
154cdf0e10cSrcweir const sal_uInt16 BIFF_OBJ_ORIENT_90CW = 3; /// 90 degr. clockwise.
155cdf0e10cSrcweir
156cdf0e10cSrcweir const sal_uInt16 BIFF_OBJ_TEXT_AUTOSIZE = 0x0080;
157cdf0e10cSrcweir const sal_uInt16 BIFF_OBJ_TEXT_LOCKED = 0x0200;
158cdf0e10cSrcweir
159cdf0e10cSrcweir const sal_Int32 BIFF_OBJ_TEXT_MARGIN = 20000; /// Automatic text margin (EMUs).
160cdf0e10cSrcweir
161cdf0e10cSrcweir // BIFF8 OBJ sub records ------------------------------------------------------
162cdf0e10cSrcweir
163cdf0e10cSrcweir const sal_uInt16 BIFF_OBJCMO_PRINTABLE = 0x0010; /// Object printable.
164cdf0e10cSrcweir const sal_uInt16 BIFF_OBJCMO_AUTOLINE = 0x2000; /// Automatic line formatting.
165cdf0e10cSrcweir const sal_uInt16 BIFF_OBJCMO_AUTOFILL = 0x4000; /// Automatic fill formatting.
166cdf0e10cSrcweir
167cdf0e10cSrcweir // ----------------------------------------------------------------------------
168cdf0e10cSrcweir
operator >>(BiffInputStream & rStrm,ShapeAnchor & rAnchor)169cdf0e10cSrcweir inline BiffInputStream& operator>>( BiffInputStream& rStrm, ShapeAnchor& rAnchor )
170cdf0e10cSrcweir {
171cdf0e10cSrcweir rAnchor.importBiffAnchor( rStrm );
172cdf0e10cSrcweir return rStrm;
173cdf0e10cSrcweir }
174cdf0e10cSrcweir
175cdf0e10cSrcweir } // namespace
176cdf0e10cSrcweir
177cdf0e10cSrcweir // ============================================================================
178cdf0e10cSrcweir // Model structures for BIFF OBJ record data
179cdf0e10cSrcweir // ============================================================================
180cdf0e10cSrcweir
BiffObjLineModel()181cdf0e10cSrcweir BiffObjLineModel::BiffObjLineModel() :
182cdf0e10cSrcweir mnColorIdx( BIFF_OBJ_LINE_AUTOCOLOR ),
183cdf0e10cSrcweir mnStyle( BIFF_OBJ_LINE_SOLID ),
184cdf0e10cSrcweir mnWidth( BIFF_OBJ_LINE_HAIR ),
185cdf0e10cSrcweir mbAuto( true )
186cdf0e10cSrcweir {
187cdf0e10cSrcweir }
188cdf0e10cSrcweir
isVisible() const189cdf0e10cSrcweir bool BiffObjLineModel::isVisible() const
190cdf0e10cSrcweir {
191cdf0e10cSrcweir return mbAuto || (mnStyle != BIFF_OBJ_LINE_NONE);
192cdf0e10cSrcweir }
193cdf0e10cSrcweir
operator >>(BiffInputStream & rStrm,BiffObjLineModel & rModel)194cdf0e10cSrcweir BiffInputStream& operator>>( BiffInputStream& rStrm, BiffObjLineModel& rModel )
195cdf0e10cSrcweir {
196cdf0e10cSrcweir sal_uInt8 nFlags;
197cdf0e10cSrcweir rStrm >> rModel.mnColorIdx >> rModel.mnStyle >> rModel.mnWidth >> nFlags;
198cdf0e10cSrcweir rModel.mbAuto = getFlag( nFlags, BIFF_OBJ_LINE_AUTO );
199cdf0e10cSrcweir return rStrm;
200cdf0e10cSrcweir }
201cdf0e10cSrcweir
202cdf0e10cSrcweir // ============================================================================
203cdf0e10cSrcweir
BiffObjFillModel()204cdf0e10cSrcweir BiffObjFillModel::BiffObjFillModel() :
205cdf0e10cSrcweir mnBackColorIdx( BIFF_OBJ_LINE_AUTOCOLOR ),
206cdf0e10cSrcweir mnPattColorIdx( BIFF_OBJ_FILL_AUTOCOLOR ),
207cdf0e10cSrcweir mnPattern( BIFF_OBJ_PATT_SOLID ),
208cdf0e10cSrcweir mbAuto( true )
209cdf0e10cSrcweir {
210cdf0e10cSrcweir }
211cdf0e10cSrcweir
isFilled() const212cdf0e10cSrcweir bool BiffObjFillModel::isFilled() const
213cdf0e10cSrcweir {
214cdf0e10cSrcweir return mbAuto || (mnPattern != BIFF_OBJ_PATT_NONE);
215cdf0e10cSrcweir }
216cdf0e10cSrcweir
operator >>(BiffInputStream & rStrm,BiffObjFillModel & rModel)217cdf0e10cSrcweir BiffInputStream& operator>>( BiffInputStream& rStrm, BiffObjFillModel& rModel )
218cdf0e10cSrcweir {
219cdf0e10cSrcweir sal_uInt8 nFlags;
220cdf0e10cSrcweir rStrm >> rModel.mnBackColorIdx >> rModel.mnPattColorIdx >> rModel.mnPattern >> nFlags;
221cdf0e10cSrcweir rModel.mbAuto = getFlag( nFlags, BIFF_OBJ_FILL_AUTO );
222cdf0e10cSrcweir return rStrm;
223cdf0e10cSrcweir }
224cdf0e10cSrcweir
225cdf0e10cSrcweir // ============================================================================
226cdf0e10cSrcweir
BiffObjTextModel()227cdf0e10cSrcweir BiffObjTextModel::BiffObjTextModel() :
228cdf0e10cSrcweir mnTextLen( 0 ),
229cdf0e10cSrcweir mnFormatSize( 0 ),
230cdf0e10cSrcweir mnLinkSize( 0 ),
231cdf0e10cSrcweir mnDefFontId( 0 ),
232cdf0e10cSrcweir mnFlags( 0 ),
233cdf0e10cSrcweir mnOrientation( BIFF_OBJ_ORIENT_NONE ),
234cdf0e10cSrcweir mnButtonFlags( 0 ),
235cdf0e10cSrcweir mnShortcut( 0 ),
236cdf0e10cSrcweir mnShortcutEA( 0 )
237cdf0e10cSrcweir {
238cdf0e10cSrcweir }
239cdf0e10cSrcweir
readObj3(BiffInputStream & rStrm)240cdf0e10cSrcweir void BiffObjTextModel::readObj3( BiffInputStream& rStrm )
241cdf0e10cSrcweir {
242cdf0e10cSrcweir rStrm >> mnTextLen;
243cdf0e10cSrcweir rStrm.skip( 2 );
244cdf0e10cSrcweir rStrm >> mnFormatSize >> mnDefFontId;
245cdf0e10cSrcweir rStrm.skip( 2 );
246cdf0e10cSrcweir rStrm >> mnFlags >> mnOrientation;
247cdf0e10cSrcweir rStrm.skip( 8 );
248cdf0e10cSrcweir }
249cdf0e10cSrcweir
readObj5(BiffInputStream & rStrm)250cdf0e10cSrcweir void BiffObjTextModel::readObj5( BiffInputStream& rStrm )
251cdf0e10cSrcweir {
252cdf0e10cSrcweir rStrm >> mnTextLen;
253cdf0e10cSrcweir rStrm.skip( 2 );
254cdf0e10cSrcweir rStrm >> mnFormatSize >> mnDefFontId;
255cdf0e10cSrcweir rStrm.skip( 2 );
256cdf0e10cSrcweir rStrm >> mnFlags >> mnOrientation;
257cdf0e10cSrcweir rStrm.skip( 2 );
258cdf0e10cSrcweir rStrm >> mnLinkSize;
259cdf0e10cSrcweir rStrm.skip( 2 );
260cdf0e10cSrcweir rStrm >> mnButtonFlags >> mnShortcut >> mnShortcutEA;
261cdf0e10cSrcweir }
262cdf0e10cSrcweir
readTxo8(BiffInputStream & rStrm)263cdf0e10cSrcweir void BiffObjTextModel::readTxo8( BiffInputStream& rStrm )
264cdf0e10cSrcweir {
265cdf0e10cSrcweir rStrm >> mnFlags >> mnOrientation >> mnButtonFlags >> mnShortcut >> mnShortcutEA >> mnTextLen >> mnFormatSize;
266cdf0e10cSrcweir }
267cdf0e10cSrcweir
getHorAlign() const268cdf0e10cSrcweir sal_uInt8 BiffObjTextModel::getHorAlign() const
269cdf0e10cSrcweir {
270cdf0e10cSrcweir return extractValue< sal_uInt8 >( mnFlags, 1, 3 );
271cdf0e10cSrcweir }
272cdf0e10cSrcweir
getVerAlign() const273cdf0e10cSrcweir sal_uInt8 BiffObjTextModel::getVerAlign() const
274cdf0e10cSrcweir {
275cdf0e10cSrcweir return extractValue< sal_uInt8 >( mnFlags, 4, 3 );
276cdf0e10cSrcweir }
277cdf0e10cSrcweir
278cdf0e10cSrcweir // ============================================================================
279cdf0e10cSrcweir // BIFF drawing objects
280cdf0e10cSrcweir // ============================================================================
281cdf0e10cSrcweir
BiffDrawingObjectContainer()282cdf0e10cSrcweir BiffDrawingObjectContainer::BiffDrawingObjectContainer()
283cdf0e10cSrcweir {
284cdf0e10cSrcweir }
285cdf0e10cSrcweir
append(const BiffDrawingObjectRef & rxDrawingObj)286cdf0e10cSrcweir void BiffDrawingObjectContainer::append( const BiffDrawingObjectRef& rxDrawingObj )
287cdf0e10cSrcweir {
288cdf0e10cSrcweir maObjects.push_back( rxDrawingObj );
289cdf0e10cSrcweir }
290cdf0e10cSrcweir
insertGrouped(const BiffDrawingObjectRef & rxDrawingObj)291cdf0e10cSrcweir void BiffDrawingObjectContainer::insertGrouped( const BiffDrawingObjectRef& rxDrawingObj )
292cdf0e10cSrcweir {
293cdf0e10cSrcweir if( !maObjects.empty() )
294cdf0e10cSrcweir if( BiffGroupObject* pGroupObj = dynamic_cast< BiffGroupObject* >( maObjects.back().get() ) )
295cdf0e10cSrcweir if( pGroupObj->tryInsert( rxDrawingObj ) )
296cdf0e10cSrcweir return;
297cdf0e10cSrcweir maObjects.push_back( rxDrawingObj );
298cdf0e10cSrcweir }
299cdf0e10cSrcweir
convertAndInsert(BiffDrawingBase & rDrawing,const Reference<XShapes> & rxShapes,const Rectangle * pParentRect) const300cdf0e10cSrcweir void BiffDrawingObjectContainer::convertAndInsert( BiffDrawingBase& rDrawing, const Reference< XShapes >& rxShapes, const Rectangle* pParentRect ) const
301cdf0e10cSrcweir {
302cdf0e10cSrcweir maObjects.forEachMem( &BiffDrawingObjectBase::convertAndInsert, ::boost::ref( rDrawing ), ::boost::cref( rxShapes ), pParentRect );
303cdf0e10cSrcweir }
304cdf0e10cSrcweir
305cdf0e10cSrcweir // ============================================================================
306cdf0e10cSrcweir
BiffDrawingObjectBase(const WorksheetHelper & rHelper)307cdf0e10cSrcweir BiffDrawingObjectBase::BiffDrawingObjectBase( const WorksheetHelper& rHelper ) :
308cdf0e10cSrcweir WorksheetHelper( rHelper ),
309cdf0e10cSrcweir maAnchor( rHelper ),
310cdf0e10cSrcweir mnDffShapeId( 0 ),
311cdf0e10cSrcweir mnDffFlags( 0 ),
312cdf0e10cSrcweir mnObjId( BIFF_OBJ_INVALID_ID ),
313cdf0e10cSrcweir mnObjType( BIFF_OBJTYPE_UNKNOWN ),
314cdf0e10cSrcweir mbHasAnchor( false ),
315cdf0e10cSrcweir mbHidden( false ),
316cdf0e10cSrcweir mbVisible( true ),
317cdf0e10cSrcweir mbPrintable( true ),
318cdf0e10cSrcweir mbAreaObj( false ),
319cdf0e10cSrcweir mbAutoMargin( true ),
320cdf0e10cSrcweir mbSimpleMacro( true ),
321cdf0e10cSrcweir mbProcessShape( true ),
322cdf0e10cSrcweir mbInsertShape( true ),
323cdf0e10cSrcweir mbCustomDff( false )
324cdf0e10cSrcweir {
325cdf0e10cSrcweir }
326cdf0e10cSrcweir
~BiffDrawingObjectBase()327cdf0e10cSrcweir BiffDrawingObjectBase::~BiffDrawingObjectBase()
328cdf0e10cSrcweir {
329cdf0e10cSrcweir }
330cdf0e10cSrcweir
importObjBiff3(const WorksheetHelper & rHelper,BiffInputStream & rStrm)331cdf0e10cSrcweir /*static*/ BiffDrawingObjectRef BiffDrawingObjectBase::importObjBiff3( const WorksheetHelper& rHelper, BiffInputStream& rStrm )
332cdf0e10cSrcweir {
333cdf0e10cSrcweir BiffDrawingObjectRef xDrawingObj;
334cdf0e10cSrcweir
335cdf0e10cSrcweir if( rStrm.getRemaining() >= 30 )
336cdf0e10cSrcweir {
337cdf0e10cSrcweir sal_uInt16 nObjType;
338cdf0e10cSrcweir rStrm.skip( 4 );
339cdf0e10cSrcweir rStrm >> nObjType;
340cdf0e10cSrcweir switch( nObjType )
341cdf0e10cSrcweir {
342cdf0e10cSrcweir case BIFF_OBJTYPE_GROUP: xDrawingObj.reset( new BiffGroupObject( rHelper ) ); break;
343cdf0e10cSrcweir case BIFF_OBJTYPE_LINE: xDrawingObj.reset( new BiffLineObject( rHelper ) ); break;
344cdf0e10cSrcweir case BIFF_OBJTYPE_RECTANGLE: xDrawingObj.reset( new BiffRectObject( rHelper ) ); break;
345cdf0e10cSrcweir case BIFF_OBJTYPE_OVAL: xDrawingObj.reset( new BiffOvalObject( rHelper ) ); break;
346cdf0e10cSrcweir case BIFF_OBJTYPE_ARC: xDrawingObj.reset( new BiffArcObject( rHelper ) ); break;
347cdf0e10cSrcweir #if 0
348cdf0e10cSrcweir case BIFF_OBJTYPE_CHART: xDrawingObj.reset( new XclImpChartObj( rHelper ) ); break;
349cdf0e10cSrcweir case BIFF_OBJTYPE_TEXT: xDrawingObj.reset( new XclImpTextObj( rHelper ) ); break;
350cdf0e10cSrcweir case BIFF_OBJTYPE_BUTTON: xDrawingObj.reset( new XclImpButtonObj( rHelper ) ); break;
351cdf0e10cSrcweir case BIFF_OBJTYPE_PICTURE: xDrawingObj.reset( new XclImpPictureObj( rHelper ) ); break;
352cdf0e10cSrcweir #endif
353cdf0e10cSrcweir default:
354cdf0e10cSrcweir #if 0
355cdf0e10cSrcweir OSL_ENSURE( false, "BiffDrawingObjectBase::importObjBiff3 - unknown object type" );
356cdf0e10cSrcweir #endif
357cdf0e10cSrcweir xDrawingObj.reset( new BiffPlaceholderObject( rHelper ) );
358cdf0e10cSrcweir }
359cdf0e10cSrcweir }
360cdf0e10cSrcweir
361cdf0e10cSrcweir xDrawingObj->importObjBiff3( rStrm );
362cdf0e10cSrcweir return xDrawingObj;
363cdf0e10cSrcweir }
364cdf0e10cSrcweir
importObjBiff4(const WorksheetHelper & rHelper,BiffInputStream & rStrm)365cdf0e10cSrcweir /*static*/ BiffDrawingObjectRef BiffDrawingObjectBase::importObjBiff4( const WorksheetHelper& rHelper, BiffInputStream& rStrm )
366cdf0e10cSrcweir {
367cdf0e10cSrcweir BiffDrawingObjectRef xDrawingObj;
368cdf0e10cSrcweir
369cdf0e10cSrcweir if( rStrm.getRemaining() >= 30 )
370cdf0e10cSrcweir {
371cdf0e10cSrcweir sal_uInt16 nObjType;
372cdf0e10cSrcweir rStrm.skip( 4 );
373cdf0e10cSrcweir rStrm >> nObjType;
374cdf0e10cSrcweir switch( nObjType )
375cdf0e10cSrcweir {
376cdf0e10cSrcweir case BIFF_OBJTYPE_GROUP: xDrawingObj.reset( new BiffGroupObject( rHelper ) ); break;
377cdf0e10cSrcweir case BIFF_OBJTYPE_LINE: xDrawingObj.reset( new BiffLineObject( rHelper ) ); break;
378cdf0e10cSrcweir case BIFF_OBJTYPE_RECTANGLE: xDrawingObj.reset( new BiffRectObject( rHelper ) ); break;
379cdf0e10cSrcweir case BIFF_OBJTYPE_OVAL: xDrawingObj.reset( new BiffOvalObject( rHelper ) ); break;
380cdf0e10cSrcweir case BIFF_OBJTYPE_ARC: xDrawingObj.reset( new BiffArcObject( rHelper ) ); break;
381cdf0e10cSrcweir case BIFF_OBJTYPE_POLYGON: xDrawingObj.reset( new BiffPolygonObject( rHelper ) ); break;
382cdf0e10cSrcweir #if 0
383cdf0e10cSrcweir case BIFF_OBJTYPE_CHART: xDrawingObj.reset( new XclImpChartObj( rHelper ) ); break;
384cdf0e10cSrcweir case BIFF_OBJTYPE_TEXT: xDrawingObj.reset( new XclImpTextObj( rHelper ) ); break;
385cdf0e10cSrcweir case BIFF_OBJTYPE_BUTTON: xDrawingObj.reset( new XclImpButtonObj( rHelper ) ); break;
386cdf0e10cSrcweir case BIFF_OBJTYPE_PICTURE: xDrawingObj.reset( new XclImpPictureObj( rHelper ) ); break;
387cdf0e10cSrcweir #endif
388cdf0e10cSrcweir default:
389cdf0e10cSrcweir #if 0
390cdf0e10cSrcweir OSL_ENSURE( false, "BiffDrawingObjectBase::importObjBiff4 - unknown object type" );
391cdf0e10cSrcweir #endif
392cdf0e10cSrcweir xDrawingObj.reset( new BiffPlaceholderObject( rHelper ) );
393cdf0e10cSrcweir }
394cdf0e10cSrcweir }
395cdf0e10cSrcweir
396cdf0e10cSrcweir xDrawingObj->importObjBiff4( rStrm );
397cdf0e10cSrcweir return xDrawingObj;
398cdf0e10cSrcweir }
399cdf0e10cSrcweir
importObjBiff5(const WorksheetHelper & rHelper,BiffInputStream & rStrm)400cdf0e10cSrcweir /*static*/ BiffDrawingObjectRef BiffDrawingObjectBase::importObjBiff5( const WorksheetHelper& rHelper, BiffInputStream& rStrm )
401cdf0e10cSrcweir {
402cdf0e10cSrcweir BiffDrawingObjectRef xDrawingObj;
403cdf0e10cSrcweir
404cdf0e10cSrcweir if( rStrm.getRemaining() >= 34 )
405cdf0e10cSrcweir {
406cdf0e10cSrcweir sal_uInt16 nObjType;
407cdf0e10cSrcweir rStrm.skip( 4 );
408cdf0e10cSrcweir rStrm >> nObjType;
409cdf0e10cSrcweir switch( nObjType )
410cdf0e10cSrcweir {
411cdf0e10cSrcweir case BIFF_OBJTYPE_GROUP: xDrawingObj.reset( new BiffGroupObject( rHelper ) ); break;
412cdf0e10cSrcweir case BIFF_OBJTYPE_LINE: xDrawingObj.reset( new BiffLineObject( rHelper ) ); break;
413cdf0e10cSrcweir case BIFF_OBJTYPE_RECTANGLE: xDrawingObj.reset( new BiffRectObject( rHelper ) ); break;
414cdf0e10cSrcweir case BIFF_OBJTYPE_OVAL: xDrawingObj.reset( new BiffOvalObject( rHelper ) ); break;
415cdf0e10cSrcweir case BIFF_OBJTYPE_ARC: xDrawingObj.reset( new BiffArcObject( rHelper ) ); break;
416cdf0e10cSrcweir case BIFF_OBJTYPE_POLYGON: xDrawingObj.reset( new BiffPolygonObject( rHelper ) ); break;
417cdf0e10cSrcweir #if 0
418cdf0e10cSrcweir case BIFF_OBJTYPE_CHART: xDrawingObj.reset( new XclImpChartObj( rHelper ) ); break;
419cdf0e10cSrcweir case BIFF_OBJTYPE_TEXT: xDrawingObj.reset( new XclImpTextObj( rHelper ) ); break;
420cdf0e10cSrcweir case BIFF_OBJTYPE_BUTTON: xDrawingObj.reset( new XclImpButtonObj( rHelper ) ); break;
421cdf0e10cSrcweir case BIFF_OBJTYPE_PICTURE: xDrawingObj.reset( new XclImpPictureObj( rHelper ) ); break;
422cdf0e10cSrcweir case BIFF_OBJTYPE_CHECKBOX: xDrawingObj.reset( new XclImpCheckBoxObj( rHelper ) ); break;
423cdf0e10cSrcweir case BIFF_OBJTYPE_OPTIONBUTTON: xDrawingObj.reset( new XclImpOptionButtonObj( rHelper ) ); break;
424cdf0e10cSrcweir case BIFF_OBJTYPE_EDIT: xDrawingObj.reset( new XclImpEditObj( rHelper ) ); break;
425cdf0e10cSrcweir case BIFF_OBJTYPE_LABEL: xDrawingObj.reset( new XclImpLabelObj( rHelper ) ); break;
426cdf0e10cSrcweir case BIFF_OBJTYPE_DIALOG: xDrawingObj.reset( new XclImpDialogObj( rHelper ) ); break;
427cdf0e10cSrcweir case BIFF_OBJTYPE_SPIN: xDrawingObj.reset( new XclImpSpinButtonObj( rHelper ) ); break;
428cdf0e10cSrcweir case BIFF_OBJTYPE_SCROLLBAR: xDrawingObj.reset( new XclImpScrollBarObj( rHelper ) ); break;
429cdf0e10cSrcweir case BIFF_OBJTYPE_LISTBOX: xDrawingObj.reset( new XclImpListBoxObj( rHelper ) ); break;
430cdf0e10cSrcweir case BIFF_OBJTYPE_GROUPBOX: xDrawingObj.reset( new XclImpGroupBoxObj( rHelper ) ); break;
431cdf0e10cSrcweir case BIFF_OBJTYPE_DROPDOWN: xDrawingObj.reset( new XclImpDropDownObj( rHelper ) ); break;
432cdf0e10cSrcweir #endif
433cdf0e10cSrcweir default:
434cdf0e10cSrcweir #if 0
435cdf0e10cSrcweir OSL_ENSURE( false, "BiffDrawingObjectBase::importObjBiff5 - unknown object type" );
436cdf0e10cSrcweir #endif
437cdf0e10cSrcweir xDrawingObj.reset( new BiffPlaceholderObject( rHelper ) );
438cdf0e10cSrcweir }
439cdf0e10cSrcweir }
440cdf0e10cSrcweir
441cdf0e10cSrcweir xDrawingObj->importObjBiff5( rStrm );
442cdf0e10cSrcweir return xDrawingObj;
443cdf0e10cSrcweir }
444cdf0e10cSrcweir
importObjBiff8(const WorksheetHelper & rHelper,BiffInputStream & rStrm)445cdf0e10cSrcweir /*static*/ BiffDrawingObjectRef BiffDrawingObjectBase::importObjBiff8( const WorksheetHelper& rHelper, BiffInputStream& rStrm )
446cdf0e10cSrcweir {
447cdf0e10cSrcweir BiffDrawingObjectRef xDrawingObj;
448cdf0e10cSrcweir
449cdf0e10cSrcweir if( rStrm.getRemaining() >= 10 )
450cdf0e10cSrcweir {
451cdf0e10cSrcweir sal_uInt16 nSubRecId, nSubRecSize, nObjType;
452cdf0e10cSrcweir rStrm >> nSubRecId >> nSubRecSize >> nObjType;
453cdf0e10cSrcweir OSL_ENSURE( nSubRecId == BIFF_ID_OBJCMO, "BiffDrawingObjectBase::importObjBiff8 - OBJCMO subrecord expected" );
454cdf0e10cSrcweir if( (nSubRecId == BIFF_ID_OBJCMO) && (nSubRecSize >= 6) )
455cdf0e10cSrcweir {
456cdf0e10cSrcweir switch( nObjType )
457cdf0e10cSrcweir {
458cdf0e10cSrcweir #if 0
459cdf0e10cSrcweir // in BIFF8, all simple objects support text
460cdf0e10cSrcweir case BIFF_OBJTYPE_LINE:
461cdf0e10cSrcweir case BIFF_OBJTYPE_ARC:
462cdf0e10cSrcweir xDrawingObj.reset( new XclImpTextObj( rHelper ) );
463cdf0e10cSrcweir // lines and arcs may be 2-dimensional
464cdf0e10cSrcweir xDrawingObj->setAreaObj( false );
465cdf0e10cSrcweir break;
466cdf0e10cSrcweir
467cdf0e10cSrcweir // in BIFF8, all simple objects support text
468cdf0e10cSrcweir case BIFF_OBJTYPE_RECTANGLE:
469cdf0e10cSrcweir case BIFF_OBJTYPE_OVAL:
470cdf0e10cSrcweir case BIFF_OBJTYPE_POLYGON:
471cdf0e10cSrcweir case BIFF_OBJTYPE_DRAWING:
472cdf0e10cSrcweir case BIFF_OBJTYPE_TEXT:
473cdf0e10cSrcweir xDrawingObj.reset( new XclImpTextObj( rHelper ) );
474cdf0e10cSrcweir break;
475cdf0e10cSrcweir #endif
476cdf0e10cSrcweir
477cdf0e10cSrcweir case BIFF_OBJTYPE_GROUP: xDrawingObj.reset( new BiffGroupObject( rHelper ) ); break;
478cdf0e10cSrcweir #if 0
479cdf0e10cSrcweir case BIFF_OBJTYPE_CHART: xDrawingObj.reset( new XclImpChartObj( rHelper ) ); break;
480cdf0e10cSrcweir case BIFF_OBJTYPE_BUTTON: xDrawingObj.reset( new XclImpButtonObj( rHelper ) ); break;
481cdf0e10cSrcweir case BIFF_OBJTYPE_PICTURE: xDrawingObj.reset( new XclImpPictureObj( rHelper ) ); break;
482cdf0e10cSrcweir case BIFF_OBJTYPE_CHECKBOX: xDrawingObj.reset( new XclImpCheckBoxObj( rHelper ) ); break;
483cdf0e10cSrcweir case BIFF_OBJTYPE_OPTIONBUTTON: xDrawingObj.reset( new XclImpOptionButtonObj( rHelper ) ); break;
484cdf0e10cSrcweir case BIFF_OBJTYPE_EDIT: xDrawingObj.reset( new XclImpEditObj( rHelper ) ); break;
485cdf0e10cSrcweir case BIFF_OBJTYPE_LABEL: xDrawingObj.reset( new XclImpLabelObj( rHelper ) ); break;
486cdf0e10cSrcweir case BIFF_OBJTYPE_DIALOG: xDrawingObj.reset( new XclImpDialogObj( rHelper ) ); break;
487cdf0e10cSrcweir case BIFF_OBJTYPE_SPIN: xDrawingObj.reset( new XclImpSpinButtonObj( rHelper ) ); break;
488cdf0e10cSrcweir case BIFF_OBJTYPE_SCROLLBAR: xDrawingObj.reset( new XclImpScrollBarObj( rHelper ) ); break;
489cdf0e10cSrcweir case BIFF_OBJTYPE_LISTBOX: xDrawingObj.reset( new XclImpListBoxObj( rHelper ) ); break;
490cdf0e10cSrcweir case BIFF_OBJTYPE_GROUPBOX: xDrawingObj.reset( new XclImpGroupBoxObj( rHelper ) ); break;
491cdf0e10cSrcweir case BIFF_OBJTYPE_DROPDOWN: xDrawingObj.reset( new XclImpDropDownObj( rHelper ) ); break;
492cdf0e10cSrcweir case BIFF_OBJTYPE_NOTE: xDrawingObj.reset( new XclImpNoteObj( rHelper ) ); break;
493cdf0e10cSrcweir #endif
494cdf0e10cSrcweir
495cdf0e10cSrcweir default:
496cdf0e10cSrcweir #if 0
497cdf0e10cSrcweir OSL_ENSURE( false, "BiffDrawingObjectBase::importObjBiff8 - unknown object type" );
498cdf0e10cSrcweir #endif
499cdf0e10cSrcweir xDrawingObj.reset( new BiffPlaceholderObject( rHelper ) );
500cdf0e10cSrcweir }
501cdf0e10cSrcweir }
502cdf0e10cSrcweir }
503cdf0e10cSrcweir
504cdf0e10cSrcweir xDrawingObj->importObjBiff8( rStrm );
505cdf0e10cSrcweir return xDrawingObj;
506cdf0e10cSrcweir }
507cdf0e10cSrcweir
convertAndInsert(BiffDrawingBase & rDrawing,const Reference<XShapes> & rxShapes,const Rectangle * pParentRect) const508cdf0e10cSrcweir Reference< XShape > BiffDrawingObjectBase::convertAndInsert( BiffDrawingBase& rDrawing,
509cdf0e10cSrcweir const Reference< XShapes >& rxShapes, const Rectangle* pParentRect ) const
510cdf0e10cSrcweir {
511cdf0e10cSrcweir Reference< XShape > xShape;
512cdf0e10cSrcweir if( rxShapes.is() && mbProcessShape && !mbHidden ) // TODO: support for hidden objects?
513cdf0e10cSrcweir {
514cdf0e10cSrcweir // base class 'ShapeAnchor' calculates the shape rectangle in 1/100 mm
515cdf0e10cSrcweir // in BIFF3-BIFF5, all shapes have absolute anchor (also children of group shapes)
516cdf0e10cSrcweir Rectangle aShapeRect = maAnchor.calcAnchorRectHmm( getDrawPageSize() );
517cdf0e10cSrcweir
518cdf0e10cSrcweir // convert the shape, if the calculated rectangle is not empty
519cdf0e10cSrcweir bool bHasWidth = aShapeRect.Width > 0;
520cdf0e10cSrcweir bool bHasHeight = aShapeRect.Height > 0;
521cdf0e10cSrcweir if( mbAreaObj ? (bHasWidth && bHasHeight) : (bHasWidth || bHasHeight) )
522cdf0e10cSrcweir {
523cdf0e10cSrcweir xShape = implConvertAndInsert( rDrawing, rxShapes, aShapeRect );
524cdf0e10cSrcweir /* Notify the drawing that a new shape has been inserted (but not
525cdf0e10cSrcweir for children of group shapes). For convenience, pass the
526cdf0e10cSrcweir rectangle that contains position and size of the shape. */
527cdf0e10cSrcweir if( !pParentRect && xShape.is() )
528cdf0e10cSrcweir rDrawing.notifyShapeInserted( xShape, aShapeRect );
529cdf0e10cSrcweir }
530cdf0e10cSrcweir }
531cdf0e10cSrcweir return xShape;
532cdf0e10cSrcweir }
533cdf0e10cSrcweir
534cdf0e10cSrcweir // protected ------------------------------------------------------------------
535cdf0e10cSrcweir
readNameBiff5(BiffInputStream & rStrm,sal_uInt16 nNameLen)536cdf0e10cSrcweir void BiffDrawingObjectBase::readNameBiff5( BiffInputStream& rStrm, sal_uInt16 nNameLen )
537cdf0e10cSrcweir {
538cdf0e10cSrcweir maObjName = OUString();
539cdf0e10cSrcweir if( nNameLen > 0 )
540cdf0e10cSrcweir {
541cdf0e10cSrcweir // name length field is repeated before the name
542cdf0e10cSrcweir maObjName = rStrm.readByteStringUC( false, getTextEncoding() );
543cdf0e10cSrcweir // skip padding byte for word boundaries
544cdf0e10cSrcweir rStrm.alignToBlock( 2 );
545cdf0e10cSrcweir }
546cdf0e10cSrcweir }
547cdf0e10cSrcweir
readMacroBiff3(BiffInputStream & rStrm,sal_uInt16 nMacroSize)548cdf0e10cSrcweir void BiffDrawingObjectBase::readMacroBiff3( BiffInputStream& rStrm, sal_uInt16 nMacroSize )
549cdf0e10cSrcweir {
550cdf0e10cSrcweir maMacroName = OUString();
551cdf0e10cSrcweir rStrm.skip( nMacroSize );
552cdf0e10cSrcweir // skip padding byte for word boundaries, not contained in nMacroSize
553cdf0e10cSrcweir rStrm.alignToBlock( 2 );
554cdf0e10cSrcweir }
555cdf0e10cSrcweir
readMacroBiff4(BiffInputStream & rStrm,sal_uInt16 nMacroSize)556cdf0e10cSrcweir void BiffDrawingObjectBase::readMacroBiff4( BiffInputStream& rStrm, sal_uInt16 nMacroSize )
557cdf0e10cSrcweir {
558cdf0e10cSrcweir maMacroName = OUString();
559cdf0e10cSrcweir rStrm.skip( nMacroSize );
560cdf0e10cSrcweir }
561cdf0e10cSrcweir
readMacroBiff5(BiffInputStream & rStrm,sal_uInt16 nMacroSize)562cdf0e10cSrcweir void BiffDrawingObjectBase::readMacroBiff5( BiffInputStream& rStrm, sal_uInt16 nMacroSize )
563cdf0e10cSrcweir {
564cdf0e10cSrcweir maMacroName = OUString();
565cdf0e10cSrcweir rStrm.skip( nMacroSize );
566cdf0e10cSrcweir }
567cdf0e10cSrcweir
readMacroBiff8(BiffInputStream & rStrm)568cdf0e10cSrcweir void BiffDrawingObjectBase::readMacroBiff8( BiffInputStream& rStrm )
569cdf0e10cSrcweir {
570cdf0e10cSrcweir maMacroName = OUString();
571cdf0e10cSrcweir if( rStrm.getRemaining() > 6 )
572cdf0e10cSrcweir {
573cdf0e10cSrcweir // macro is stored in a tNameXR token containing a link to a defined name
574cdf0e10cSrcweir sal_uInt16 nFmlaSize;
575cdf0e10cSrcweir rStrm >> nFmlaSize;
576cdf0e10cSrcweir rStrm.skip( 4 );
577cdf0e10cSrcweir OSL_ENSURE( nFmlaSize == 7, "BiffDrawingObjectBase::readMacroBiff8 - unexpected formula size" );
578cdf0e10cSrcweir if( nFmlaSize == 7 )
579cdf0e10cSrcweir {
580cdf0e10cSrcweir sal_uInt8 nTokenId;
581cdf0e10cSrcweir sal_uInt16 nExtLinkId, nExtNameId;
582cdf0e10cSrcweir rStrm >> nTokenId >> nExtLinkId >> nExtNameId;
583cdf0e10cSrcweir #if 0
584cdf0e10cSrcweir OSL_ENSURE( nTokenId == XclTokenArrayHelper::GetTokenId( EXC_TOKID_NAMEX, EXC_TOKCLASS_REF ),
585cdf0e10cSrcweir "BiffDrawingObjectBase::readMacroBiff8 - tNameXR token expected" );
586cdf0e10cSrcweir if( nTokenId == XclTokenArrayHelper::GetTokenId( EXC_TOKID_NAMEX, EXC_TOKCLASS_REF ) )
587cdf0e10cSrcweir maMacroName = GetLinkManager().GetMacroName( nExtLinkId, nExtNameId );
588cdf0e10cSrcweir #endif
589cdf0e10cSrcweir }
590cdf0e10cSrcweir }
591cdf0e10cSrcweir }
592cdf0e10cSrcweir
convertLineProperties(ShapePropertyMap & rPropMap,const BiffObjLineModel & rLineModel,sal_uInt16 nArrows) const593cdf0e10cSrcweir void BiffDrawingObjectBase::convertLineProperties( ShapePropertyMap& rPropMap, const BiffObjLineModel& rLineModel, sal_uInt16 nArrows ) const
594cdf0e10cSrcweir {
595cdf0e10cSrcweir if( rLineModel.mbAuto )
596cdf0e10cSrcweir {
597cdf0e10cSrcweir BiffObjLineModel aAutoModel;
598cdf0e10cSrcweir aAutoModel.mbAuto = false;
599cdf0e10cSrcweir convertLineProperties( rPropMap, aAutoModel, nArrows );
600cdf0e10cSrcweir return;
601cdf0e10cSrcweir }
602cdf0e10cSrcweir
603cdf0e10cSrcweir /* Convert line formatting to DrawingML line formatting and let the
604cdf0e10cSrcweir DrawingML code do the hard work. */
605cdf0e10cSrcweir LineProperties aLineProps;
606cdf0e10cSrcweir
607cdf0e10cSrcweir if( rLineModel.mnStyle == BIFF_OBJ_LINE_NONE )
608cdf0e10cSrcweir {
609cdf0e10cSrcweir aLineProps.maLineFill.moFillType = XML_noFill;
610cdf0e10cSrcweir }
611cdf0e10cSrcweir else
612cdf0e10cSrcweir {
613cdf0e10cSrcweir aLineProps.maLineFill.moFillType = XML_solidFill;
614cdf0e10cSrcweir aLineProps.maLineFill.maFillColor.setPaletteClr( rLineModel.mnColorIdx );
615cdf0e10cSrcweir aLineProps.moLineCompound = XML_sng;
616cdf0e10cSrcweir aLineProps.moLineCap = XML_flat;
617cdf0e10cSrcweir aLineProps.moLineJoint = XML_round;
618cdf0e10cSrcweir
619cdf0e10cSrcweir // line width: use 0.35 mm per BIFF line width step
620cdf0e10cSrcweir sal_Int32 nLineWidth = 0;
621cdf0e10cSrcweir switch( rLineModel.mnWidth )
622cdf0e10cSrcweir {
623cdf0e10cSrcweir default:
624cdf0e10cSrcweir case BIFF_OBJ_LINE_HAIR: nLineWidth = 0; break;
625cdf0e10cSrcweir case BIFF_OBJ_LINE_THIN: nLineWidth = 20; break;
626cdf0e10cSrcweir case BIFF_OBJ_LINE_MEDIUM: nLineWidth = 40; break;
627cdf0e10cSrcweir case BIFF_OBJ_LINE_THICK: nLineWidth = 60; break;
628cdf0e10cSrcweir }
629cdf0e10cSrcweir aLineProps.moLineWidth = getLimitedValue< sal_Int32, sal_Int64 >( convertHmmToEmu( nLineWidth ), 0, SAL_MAX_INT32 );
630cdf0e10cSrcweir
631cdf0e10cSrcweir // dash style and transparency
632cdf0e10cSrcweir switch( rLineModel.mnStyle )
633cdf0e10cSrcweir {
634cdf0e10cSrcweir default:
635cdf0e10cSrcweir case BIFF_OBJ_LINE_SOLID:
636cdf0e10cSrcweir aLineProps.moPresetDash = XML_solid;
637cdf0e10cSrcweir break;
638cdf0e10cSrcweir case BIFF_OBJ_LINE_DASH:
639cdf0e10cSrcweir aLineProps.moPresetDash = XML_lgDash;
640cdf0e10cSrcweir break;
641cdf0e10cSrcweir case BIFF_OBJ_LINE_DOT:
642cdf0e10cSrcweir aLineProps.moPresetDash = XML_dot;
643cdf0e10cSrcweir break;
644cdf0e10cSrcweir case BIFF_OBJ_LINE_DASHDOT:
645cdf0e10cSrcweir aLineProps.moPresetDash = XML_lgDashDot;
646cdf0e10cSrcweir break;
647cdf0e10cSrcweir case BIFF_OBJ_LINE_DASHDOTDOT:
648cdf0e10cSrcweir aLineProps.moPresetDash = XML_lgDashDotDot;
649cdf0e10cSrcweir break;
650cdf0e10cSrcweir case BIFF_OBJ_LINE_MEDTRANS:
651cdf0e10cSrcweir aLineProps.moPresetDash = XML_solid;
652cdf0e10cSrcweir aLineProps.maLineFill.maFillColor.addTransformation( XML_alpha, 50 * PER_PERCENT );
653cdf0e10cSrcweir break;
654cdf0e10cSrcweir case BIFF_OBJ_LINE_DARKTRANS:
655cdf0e10cSrcweir aLineProps.moPresetDash = XML_solid;
656cdf0e10cSrcweir aLineProps.maLineFill.maFillColor.addTransformation( XML_alpha, 75 * PER_PERCENT );
657cdf0e10cSrcweir break;
658cdf0e10cSrcweir case BIFF_OBJ_LINE_LIGHTTRANS:
659cdf0e10cSrcweir aLineProps.moPresetDash = XML_solid;
660cdf0e10cSrcweir aLineProps.maLineFill.maFillColor.addTransformation( XML_alpha, 25 * PER_PERCENT );
661cdf0e10cSrcweir break;
662cdf0e10cSrcweir }
663cdf0e10cSrcweir
664cdf0e10cSrcweir // line ends
665cdf0e10cSrcweir bool bLineStart = false;
666cdf0e10cSrcweir bool bLineEnd = false;
667cdf0e10cSrcweir bool bFilled = false;
668cdf0e10cSrcweir switch( extractValue< sal_uInt8 >( nArrows, 0, 4 ) )
669cdf0e10cSrcweir {
670cdf0e10cSrcweir case BIFF_OBJ_ARROW_OPEN: bLineStart = false; bLineEnd = true; bFilled = false; break;
671cdf0e10cSrcweir case BIFF_OBJ_ARROW_OPENBOTH: bLineStart = true; bLineEnd = true; bFilled = false; break;
672cdf0e10cSrcweir case BIFF_OBJ_ARROW_FILLED: bLineStart = false; bLineEnd = true; bFilled = true; break;
673cdf0e10cSrcweir case BIFF_OBJ_ARROW_FILLEDBOTH: bLineStart = true; bLineEnd = true; bFilled = true; break;
674cdf0e10cSrcweir }
675cdf0e10cSrcweir if( bLineStart || bLineEnd )
676cdf0e10cSrcweir {
677cdf0e10cSrcweir // arrow type (open or closed)
678cdf0e10cSrcweir sal_Int32 nArrowType = bFilled ? XML_triangle : XML_arrow;
679cdf0e10cSrcweir aLineProps.maStartArrow.moArrowType = bLineStart ? nArrowType : XML_none;
680cdf0e10cSrcweir aLineProps.maEndArrow.moArrowType = bLineEnd ? nArrowType : XML_none;
681cdf0e10cSrcweir
682cdf0e10cSrcweir // arrow width
683cdf0e10cSrcweir sal_Int32 nArrowWidth = XML_med;
684cdf0e10cSrcweir switch( extractValue< sal_uInt8 >( nArrows, 4, 4 ) )
685cdf0e10cSrcweir {
686cdf0e10cSrcweir case BIFF_OBJ_ARROW_NARROW: nArrowWidth = XML_sm; break;
687cdf0e10cSrcweir case BIFF_OBJ_ARROW_MEDIUM: nArrowWidth = XML_med; break;
688cdf0e10cSrcweir case BIFF_OBJ_ARROW_WIDE: nArrowWidth = XML_lg; break;
689cdf0e10cSrcweir }
690cdf0e10cSrcweir aLineProps.maStartArrow.moArrowWidth = aLineProps.maEndArrow.moArrowWidth = nArrowWidth;
691cdf0e10cSrcweir
692cdf0e10cSrcweir // arrow length
693cdf0e10cSrcweir sal_Int32 nArrowLength = XML_med;
694cdf0e10cSrcweir switch( extractValue< sal_uInt8 >( nArrows, 8, 4 ) )
695cdf0e10cSrcweir {
696cdf0e10cSrcweir case BIFF_OBJ_ARROW_NARROW: nArrowLength = XML_sm; break;
697cdf0e10cSrcweir case BIFF_OBJ_ARROW_MEDIUM: nArrowLength = XML_med; break;
698cdf0e10cSrcweir case BIFF_OBJ_ARROW_WIDE: nArrowLength = XML_lg; break;
699cdf0e10cSrcweir }
700cdf0e10cSrcweir aLineProps.maStartArrow.moArrowLength = aLineProps.maEndArrow.moArrowLength = nArrowLength;
701cdf0e10cSrcweir }
702cdf0e10cSrcweir }
703cdf0e10cSrcweir
704cdf0e10cSrcweir aLineProps.pushToPropMap( rPropMap, getBaseFilter().getGraphicHelper() );
705cdf0e10cSrcweir }
706cdf0e10cSrcweir
convertFillProperties(ShapePropertyMap & rPropMap,const BiffObjFillModel & rFillModel) const707cdf0e10cSrcweir void BiffDrawingObjectBase::convertFillProperties( ShapePropertyMap& rPropMap, const BiffObjFillModel& rFillModel ) const
708cdf0e10cSrcweir {
709cdf0e10cSrcweir if( rFillModel.mbAuto )
710cdf0e10cSrcweir {
711cdf0e10cSrcweir BiffObjFillModel aAutoModel;
712cdf0e10cSrcweir aAutoModel.mbAuto = false;
713cdf0e10cSrcweir convertFillProperties( rPropMap, aAutoModel );
714cdf0e10cSrcweir return;
715cdf0e10cSrcweir }
716cdf0e10cSrcweir
717cdf0e10cSrcweir /* Convert fill formatting to DrawingML fill formatting and let the
718cdf0e10cSrcweir DrawingML code do the hard work. */
719cdf0e10cSrcweir FillProperties aFillProps;
720cdf0e10cSrcweir
721cdf0e10cSrcweir if( rFillModel.mnPattern == BIFF_OBJ_PATT_NONE )
722cdf0e10cSrcweir {
723cdf0e10cSrcweir aFillProps.moFillType = XML_noFill;
724cdf0e10cSrcweir }
725cdf0e10cSrcweir else
726cdf0e10cSrcweir {
727cdf0e10cSrcweir const sal_Int32 spnPatternPresets[] = {
728cdf0e10cSrcweir XML_TOKEN_INVALID, XML_TOKEN_INVALID, XML_pct50, XML_pct50, XML_pct25,
729cdf0e10cSrcweir XML_dkHorz, XML_dkVert, XML_dkDnDiag, XML_dkUpDiag, XML_smCheck, XML_trellis,
730cdf0e10cSrcweir XML_ltHorz, XML_ltVert, XML_ltDnDiag, XML_ltUpDiag, XML_smGrid, XML_diagCross,
731cdf0e10cSrcweir XML_pct20, XML_pct10 };
732cdf0e10cSrcweir sal_Int32 nPatternPreset = STATIC_ARRAY_SELECT( spnPatternPresets, rFillModel.mnPattern, XML_TOKEN_INVALID );
733cdf0e10cSrcweir if( nPatternPreset == XML_TOKEN_INVALID )
734cdf0e10cSrcweir {
735cdf0e10cSrcweir aFillProps.moFillType = XML_solidFill;
736cdf0e10cSrcweir aFillProps.maFillColor.setPaletteClr( rFillModel.mnPattColorIdx );
737cdf0e10cSrcweir }
738cdf0e10cSrcweir else
739cdf0e10cSrcweir {
740cdf0e10cSrcweir aFillProps.moFillType = XML_pattFill;
741cdf0e10cSrcweir aFillProps.maPatternProps.maPattFgColor.setPaletteClr( rFillModel.mnPattColorIdx );
742cdf0e10cSrcweir aFillProps.maPatternProps.maPattBgColor.setPaletteClr( rFillModel.mnBackColorIdx );
743cdf0e10cSrcweir aFillProps.maPatternProps.moPattPreset = nPatternPreset;
744cdf0e10cSrcweir }
745cdf0e10cSrcweir #if 0
746cdf0e10cSrcweir static const sal_uInt8 sppnPatterns[][ 8 ] =
747cdf0e10cSrcweir {
748cdf0e10cSrcweir { 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55 },
749cdf0e10cSrcweir { 0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD },
750cdf0e10cSrcweir { 0x88, 0x22, 0x88, 0x22, 0x88, 0x22, 0x88, 0x22 },
751cdf0e10cSrcweir { 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00 },
752cdf0e10cSrcweir { 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC },
753cdf0e10cSrcweir { 0x33, 0x66, 0xCC, 0x99, 0x33, 0x66, 0xCC, 0x99 },
754cdf0e10cSrcweir { 0xCC, 0x66, 0x33, 0x99, 0xCC, 0x66, 0x33, 0x99 },
755cdf0e10cSrcweir { 0xCC, 0xCC, 0x33, 0x33, 0xCC, 0xCC, 0x33, 0x33 },
756cdf0e10cSrcweir { 0xCC, 0xFF, 0x33, 0xFF, 0xCC, 0xFF, 0x33, 0xFF },
757cdf0e10cSrcweir { 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00 },
758cdf0e10cSrcweir { 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 },
759cdf0e10cSrcweir { 0x11, 0x22, 0x44, 0x88, 0x11, 0x22, 0x44, 0x88 },
760cdf0e10cSrcweir { 0x88, 0x44, 0x22, 0x11, 0x88, 0x44, 0x22, 0x11 },
761cdf0e10cSrcweir { 0xFF, 0x11, 0x11, 0x11, 0xFF, 0x11, 0x11, 0x11 },
762cdf0e10cSrcweir { 0xAA, 0x44, 0xAA, 0x11, 0xAA, 0x44, 0xAA, 0x11 },
763cdf0e10cSrcweir { 0x88, 0x00, 0x22, 0x00, 0x88, 0x00, 0x22, 0x00 },
764cdf0e10cSrcweir { 0x80, 0x00, 0x08, 0x00, 0x80, 0x00, 0x08, 0x00 }
765cdf0e10cSrcweir };
766cdf0e10cSrcweir const sal_uInt8* const pnPattern = sppnPatterns[ ::std::min< size_t >( rFillData.mnPattern - 2, STATIC_ARRAY_SIZE( sppnPatterns ) ) ];
767cdf0e10cSrcweir // create 2-colored 8x8 DIB
768cdf0e10cSrcweir SvMemoryStream aMemStrm;
769cdf0e10cSrcweir // { 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x01, 0x00, 0x01, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00 }
770cdf0e10cSrcweir aMemStrm << sal_uInt32( 12 ) << sal_Int16( 8 ) << sal_Int16( 8 ) << sal_uInt16( 1 ) << sal_uInt16( 1 );
771cdf0e10cSrcweir aMemStrm << sal_uInt8( 0xFF ) << sal_uInt8( 0xFF ) << sal_uInt8( 0xFF );
772cdf0e10cSrcweir aMemStrm << sal_uInt8( 0x00 ) << sal_uInt8( 0x00 ) << sal_uInt8( 0x00 );
773cdf0e10cSrcweir for( size_t nIdx = 0; nIdx < 8; ++nIdx )
774cdf0e10cSrcweir aMemStrm << sal_uInt32( pnPattern[ nIdx ] ); // 32-bit little-endian
775cdf0e10cSrcweir aMemStrm.Seek( STREAM_SEEK_TO_BEGIN );
776cdf0e10cSrcweir Bitmap aBitmap;
777cdf0e10cSrcweir aBitmap.Read( aMemStrm, FALSE );
778cdf0e10cSrcweir XOBitmap aXOBitmap( aBitmap );
779cdf0e10cSrcweir aXOBitmap.Bitmap2Array();
780cdf0e10cSrcweir aXOBitmap.SetBitmapType( XBITMAP_8X8 );
781cdf0e10cSrcweir if( aXOBitmap.GetBackgroundColor().GetColor() == COL_BLACK )
782cdf0e10cSrcweir ::std::swap( aPattColor, aBackColor );
783cdf0e10cSrcweir aXOBitmap.SetPixelColor( aPattColor );
784cdf0e10cSrcweir aXOBitmap.SetBackgroundColor( aBackColor );
785cdf0e10cSrcweir rSdrObj.SetMergedItem( XFillStyleItem( XFILL_BITMAP ) );
786cdf0e10cSrcweir rSdrObj.SetMergedItem( XFillBitmapItem( EMPTY_STRING, aXOBitmap ) );
787cdf0e10cSrcweir #endif
788cdf0e10cSrcweir }
789cdf0e10cSrcweir
790cdf0e10cSrcweir aFillProps.pushToPropMap( rPropMap, getBaseFilter().getGraphicHelper() );
791cdf0e10cSrcweir }
792cdf0e10cSrcweir
convertFrameProperties(ShapePropertyMap &,sal_uInt16) const793cdf0e10cSrcweir void BiffDrawingObjectBase::convertFrameProperties( ShapePropertyMap& /*rPropMap*/, sal_uInt16 /*nFrameFlags*/ ) const
794cdf0e10cSrcweir {
795cdf0e10cSrcweir }
796cdf0e10cSrcweir
implReadObjBiff3(BiffInputStream &,sal_uInt16)797cdf0e10cSrcweir void BiffDrawingObjectBase::implReadObjBiff3( BiffInputStream& /*rStrm*/, sal_uInt16 /*nMacroSize*/ )
798cdf0e10cSrcweir {
799cdf0e10cSrcweir }
800cdf0e10cSrcweir
implReadObjBiff4(BiffInputStream &,sal_uInt16)801cdf0e10cSrcweir void BiffDrawingObjectBase::implReadObjBiff4( BiffInputStream& /*rStrm*/, sal_uInt16 /*nMacroSize*/ )
802cdf0e10cSrcweir {
803cdf0e10cSrcweir }
804cdf0e10cSrcweir
implReadObjBiff5(BiffInputStream &,sal_uInt16,sal_uInt16)805cdf0e10cSrcweir void BiffDrawingObjectBase::implReadObjBiff5( BiffInputStream& /*rStrm*/, sal_uInt16 /*nNameLen*/, sal_uInt16 /*nMacroSize*/ )
806cdf0e10cSrcweir {
807cdf0e10cSrcweir }
808cdf0e10cSrcweir
implReadObjBiff8SubRec(BiffInputStream &,sal_uInt16,sal_uInt16)809cdf0e10cSrcweir void BiffDrawingObjectBase::implReadObjBiff8SubRec( BiffInputStream& /*rStrm*/, sal_uInt16 /*nSubRecId*/, sal_uInt16 /*nSubRecSize*/ )
810cdf0e10cSrcweir {
811cdf0e10cSrcweir }
812cdf0e10cSrcweir
813cdf0e10cSrcweir // private --------------------------------------------------------------------
814cdf0e10cSrcweir
importObjBiff3(BiffInputStream & rStrm)815cdf0e10cSrcweir void BiffDrawingObjectBase::importObjBiff3( BiffInputStream& rStrm )
816cdf0e10cSrcweir {
817cdf0e10cSrcweir // back to offset 4 (ignore object count field)
818cdf0e10cSrcweir rStrm.seek( 4 );
819cdf0e10cSrcweir
820cdf0e10cSrcweir sal_uInt16 nObjFlags, nMacroSize;
821cdf0e10cSrcweir rStrm >> mnObjType >> mnObjId >> nObjFlags >> maAnchor >> nMacroSize;
822cdf0e10cSrcweir rStrm.skip( 2 );
823cdf0e10cSrcweir
824cdf0e10cSrcweir mbHasAnchor = true;
825cdf0e10cSrcweir mbHidden = getFlag( nObjFlags, BIFF_OBJ_HIDDEN );
826cdf0e10cSrcweir mbVisible = getFlag( nObjFlags, BIFF_OBJ_VISIBLE );
827cdf0e10cSrcweir implReadObjBiff3( rStrm, nMacroSize );
828cdf0e10cSrcweir }
829cdf0e10cSrcweir
importObjBiff4(BiffInputStream & rStrm)830cdf0e10cSrcweir void BiffDrawingObjectBase::importObjBiff4( BiffInputStream& rStrm )
831cdf0e10cSrcweir {
832cdf0e10cSrcweir // back to offset 4 (ignore object count field)
833cdf0e10cSrcweir rStrm.seek( 4 );
834cdf0e10cSrcweir
835cdf0e10cSrcweir sal_uInt16 nObjFlags, nMacroSize;
836cdf0e10cSrcweir rStrm >> mnObjType >> mnObjId >> nObjFlags >> maAnchor >> nMacroSize;
837cdf0e10cSrcweir rStrm.skip( 2 );
838cdf0e10cSrcweir
839cdf0e10cSrcweir mbHasAnchor = true;
840cdf0e10cSrcweir mbHidden = getFlag( nObjFlags, BIFF_OBJ_HIDDEN );
841cdf0e10cSrcweir mbVisible = getFlag( nObjFlags, BIFF_OBJ_VISIBLE );
842cdf0e10cSrcweir mbPrintable = getFlag( nObjFlags, BIFF_OBJ_PRINTABLE );
843cdf0e10cSrcweir implReadObjBiff4( rStrm, nMacroSize );
844cdf0e10cSrcweir }
845cdf0e10cSrcweir
importObjBiff5(BiffInputStream & rStrm)846cdf0e10cSrcweir void BiffDrawingObjectBase::importObjBiff5( BiffInputStream& rStrm )
847cdf0e10cSrcweir {
848cdf0e10cSrcweir // back to offset 4 (ignore object count field)
849cdf0e10cSrcweir rStrm.seek( 4 );
850cdf0e10cSrcweir
851cdf0e10cSrcweir sal_uInt16 nObjFlags, nMacroSize, nNameLen;
852cdf0e10cSrcweir rStrm >> mnObjType >> mnObjId >> nObjFlags >> maAnchor >> nMacroSize;
853cdf0e10cSrcweir rStrm.skip( 2 );
854cdf0e10cSrcweir rStrm >> nNameLen;
855cdf0e10cSrcweir rStrm.skip( 2 );
856cdf0e10cSrcweir
857cdf0e10cSrcweir mbHasAnchor = true;
858cdf0e10cSrcweir mbHidden = getFlag( nObjFlags, BIFF_OBJ_HIDDEN );
859cdf0e10cSrcweir mbVisible = getFlag( nObjFlags, BIFF_OBJ_VISIBLE );
860cdf0e10cSrcweir mbPrintable = getFlag( nObjFlags, BIFF_OBJ_PRINTABLE );
861cdf0e10cSrcweir implReadObjBiff5( rStrm, nNameLen, nMacroSize );
862cdf0e10cSrcweir }
863cdf0e10cSrcweir
importObjBiff8(BiffInputStream & rStrm)864cdf0e10cSrcweir void BiffDrawingObjectBase::importObjBiff8( BiffInputStream& rStrm )
865cdf0e10cSrcweir {
866cdf0e10cSrcweir // back to beginning
867cdf0e10cSrcweir rStrm.seekToStart();
868cdf0e10cSrcweir
869cdf0e10cSrcweir bool bLoop = true;
870cdf0e10cSrcweir while( bLoop && (rStrm.getRemaining() >= 4) )
871cdf0e10cSrcweir {
872cdf0e10cSrcweir sal_uInt16 nSubRecId, nSubRecSize;
873cdf0e10cSrcweir rStrm >> nSubRecId >> nSubRecSize;
874cdf0e10cSrcweir sal_Int64 nStrmPos = rStrm.tell();
875cdf0e10cSrcweir // sometimes the last subrecord has an invalid length (OBJLBSDATA) -> min()
876cdf0e10cSrcweir nSubRecSize = static_cast< sal_uInt16 >( ::std::min< sal_Int64 >( nSubRecSize, rStrm.getRemaining() ) );
877cdf0e10cSrcweir
878cdf0e10cSrcweir switch( nSubRecId )
879cdf0e10cSrcweir {
880cdf0e10cSrcweir case BIFF_ID_OBJCMO:
881cdf0e10cSrcweir OSL_ENSURE( rStrm.tell() == 4, "BiffDrawingObjectBase::importObjBiff8 - unexpected OBJCMO subrecord" );
882cdf0e10cSrcweir if( (rStrm.tell() == 4) && (nSubRecSize >= 6) )
883cdf0e10cSrcweir {
884cdf0e10cSrcweir sal_uInt16 nObjFlags;
885cdf0e10cSrcweir rStrm >> mnObjType >> mnObjId >> nObjFlags;
886cdf0e10cSrcweir mbPrintable = getFlag( nObjFlags, BIFF_OBJCMO_PRINTABLE );
887cdf0e10cSrcweir }
888cdf0e10cSrcweir break;
889cdf0e10cSrcweir case BIFF_ID_OBJMACRO:
890cdf0e10cSrcweir readMacroBiff8( rStrm );
891cdf0e10cSrcweir break;
892cdf0e10cSrcweir case BIFF_ID_OBJEND:
893cdf0e10cSrcweir bLoop = false;
894cdf0e10cSrcweir break;
895cdf0e10cSrcweir default:
896cdf0e10cSrcweir implReadObjBiff8SubRec( rStrm, nSubRecId, nSubRecSize );
897cdf0e10cSrcweir }
898cdf0e10cSrcweir
899cdf0e10cSrcweir // seek to end of subrecord
900cdf0e10cSrcweir rStrm.seek( nStrmPos + nSubRecSize );
901cdf0e10cSrcweir }
902cdf0e10cSrcweir
903cdf0e10cSrcweir /* Call doReadObj8SubRec() with BIFF_ID_OBJEND for further stream
904cdf0e10cSrcweir processing (e.g. charts), even if the OBJEND subrecord is missing. */
905cdf0e10cSrcweir implReadObjBiff8SubRec( rStrm, BIFF_ID_OBJEND, 0 );
906cdf0e10cSrcweir
907cdf0e10cSrcweir /* Pictures that Excel reads from BIFF5 and writes to BIFF8 still have the
908cdf0e10cSrcweir IMGDATA record following the OBJ record (but they use the image data
909cdf0e10cSrcweir stored in DFF). The IMGDATA record may be continued by several CONTINUE
910cdf0e10cSrcweir records. But the last CONTINUE record may be in fact an MSODRAWING
911cdf0e10cSrcweir record that contains the DFF data of the next drawing object! So we
912cdf0e10cSrcweir have to skip just enough CONTINUE records to look at the next
913cdf0e10cSrcweir MSODRAWING/CONTINUE record. */
914cdf0e10cSrcweir if( (rStrm.getNextRecId() == BIFF3_ID_IMGDATA) && rStrm.startNextRecord() )
915cdf0e10cSrcweir {
916cdf0e10cSrcweir rStrm.skip( 4 );
917cdf0e10cSrcweir sal_Int64 nDataSize = rStrm.readuInt32();
918cdf0e10cSrcweir nDataSize -= rStrm.getRemaining();
919cdf0e10cSrcweir // skip following CONTINUE records until IMGDATA ends
920cdf0e10cSrcweir while( (nDataSize > 0) && (rStrm.getNextRecId() == BIFF_ID_CONT) && rStrm.startNextRecord() )
921cdf0e10cSrcweir {
922cdf0e10cSrcweir OSL_ENSURE( nDataSize >= rStrm.getRemaining(), "BiffDrawingObjectBase::importObjBiff8 - CONTINUE too long" );
923cdf0e10cSrcweir nDataSize -= ::std::min( rStrm.getRemaining(), nDataSize );
924cdf0e10cSrcweir }
925cdf0e10cSrcweir OSL_ENSURE( nDataSize == 0, "BiffDrawingObjectBase::importObjBiff8 - missing CONTINUE records" );
926cdf0e10cSrcweir // next record may be MSODRAWING or CONTINUE or anything else
927cdf0e10cSrcweir }
928cdf0e10cSrcweir }
929cdf0e10cSrcweir
930cdf0e10cSrcweir // ============================================================================
931cdf0e10cSrcweir
BiffPlaceholderObject(const WorksheetHelper & rHelper)932cdf0e10cSrcweir BiffPlaceholderObject::BiffPlaceholderObject( const WorksheetHelper& rHelper ) :
933cdf0e10cSrcweir BiffDrawingObjectBase( rHelper )
934cdf0e10cSrcweir {
935cdf0e10cSrcweir setProcessShape( false );
936cdf0e10cSrcweir }
937cdf0e10cSrcweir
implConvertAndInsert(BiffDrawingBase &,const Reference<XShapes> &,const Rectangle &) const938cdf0e10cSrcweir Reference< XShape > BiffPlaceholderObject::implConvertAndInsert( BiffDrawingBase& /*rDrawing*/,
939cdf0e10cSrcweir const Reference< XShapes >& /*rxShapes*/, const Rectangle& /*rShapeRect*/ ) const
940cdf0e10cSrcweir {
941cdf0e10cSrcweir return Reference< XShape >();
942cdf0e10cSrcweir }
943cdf0e10cSrcweir
944cdf0e10cSrcweir // ============================================================================
945cdf0e10cSrcweir
BiffGroupObject(const WorksheetHelper & rHelper)946cdf0e10cSrcweir BiffGroupObject::BiffGroupObject( const WorksheetHelper& rHelper ) :
947cdf0e10cSrcweir BiffDrawingObjectBase( rHelper ),
948cdf0e10cSrcweir mnFirstUngrouped( BIFF_OBJ_INVALID_ID )
949cdf0e10cSrcweir {
950cdf0e10cSrcweir }
951cdf0e10cSrcweir
tryInsert(const BiffDrawingObjectRef & rxDrawingObj)952cdf0e10cSrcweir bool BiffGroupObject::tryInsert( const BiffDrawingObjectRef& rxDrawingObj )
953cdf0e10cSrcweir {
954cdf0e10cSrcweir if( rxDrawingObj->getObjId() == mnFirstUngrouped )
955cdf0e10cSrcweir return false;
956cdf0e10cSrcweir // insert into own list or into nested group
957cdf0e10cSrcweir maChildren.insertGrouped( rxDrawingObj );
958cdf0e10cSrcweir return true;
959cdf0e10cSrcweir }
960cdf0e10cSrcweir
implReadObjBiff3(BiffInputStream & rStrm,sal_uInt16 nMacroSize)961cdf0e10cSrcweir void BiffGroupObject::implReadObjBiff3( BiffInputStream& rStrm, sal_uInt16 nMacroSize )
962cdf0e10cSrcweir {
963cdf0e10cSrcweir rStrm.skip( 4 );
964cdf0e10cSrcweir rStrm >> mnFirstUngrouped;
965cdf0e10cSrcweir rStrm.skip( 16 );
966cdf0e10cSrcweir readMacroBiff3( rStrm, nMacroSize );
967cdf0e10cSrcweir }
968cdf0e10cSrcweir
implReadObjBiff4(BiffInputStream & rStrm,sal_uInt16 nMacroSize)969cdf0e10cSrcweir void BiffGroupObject::implReadObjBiff4( BiffInputStream& rStrm, sal_uInt16 nMacroSize )
970cdf0e10cSrcweir {
971cdf0e10cSrcweir rStrm.skip( 4 );
972cdf0e10cSrcweir rStrm >> mnFirstUngrouped;
973cdf0e10cSrcweir rStrm.skip( 16 );
974cdf0e10cSrcweir readMacroBiff4( rStrm, nMacroSize );
975cdf0e10cSrcweir }
976cdf0e10cSrcweir
implReadObjBiff5(BiffInputStream & rStrm,sal_uInt16 nNameLen,sal_uInt16 nMacroSize)977cdf0e10cSrcweir void BiffGroupObject::implReadObjBiff5( BiffInputStream& rStrm, sal_uInt16 nNameLen, sal_uInt16 nMacroSize )
978cdf0e10cSrcweir {
979cdf0e10cSrcweir rStrm.skip( 4 );
980cdf0e10cSrcweir rStrm >> mnFirstUngrouped;
981cdf0e10cSrcweir rStrm.skip( 16 );
982cdf0e10cSrcweir readNameBiff5( rStrm, nNameLen );
983cdf0e10cSrcweir readMacroBiff5( rStrm, nMacroSize );
984cdf0e10cSrcweir }
985cdf0e10cSrcweir
implConvertAndInsert(BiffDrawingBase & rDrawing,const Reference<XShapes> & rxShapes,const Rectangle & rShapeRect) const986cdf0e10cSrcweir Reference< XShape > BiffGroupObject::implConvertAndInsert( BiffDrawingBase& rDrawing,
987cdf0e10cSrcweir const Reference< XShapes >& rxShapes, const Rectangle& rShapeRect ) const
988cdf0e10cSrcweir {
989cdf0e10cSrcweir Reference< XShape > xGroupShape;
990cdf0e10cSrcweir if( !maChildren.empty() ) try
991cdf0e10cSrcweir {
992cdf0e10cSrcweir xGroupShape = rDrawing.createAndInsertXShape( CREATE_OUSTRING( "com.sun.star.drawing.GroupShape" ), rxShapes, rShapeRect );
993cdf0e10cSrcweir Reference< XShapes > xChildShapes( xGroupShape, UNO_QUERY_THROW );
994cdf0e10cSrcweir maChildren.convertAndInsert( rDrawing, xChildShapes, &rShapeRect );
995cdf0e10cSrcweir // no child shape has been created - delete the group shape
996cdf0e10cSrcweir if( !xChildShapes->hasElements() )
997cdf0e10cSrcweir {
998cdf0e10cSrcweir rxShapes->remove( xGroupShape );
999cdf0e10cSrcweir xGroupShape.clear();
1000cdf0e10cSrcweir }
1001cdf0e10cSrcweir }
1002cdf0e10cSrcweir catch( Exception& )
1003cdf0e10cSrcweir {
1004cdf0e10cSrcweir }
1005cdf0e10cSrcweir return xGroupShape;
1006cdf0e10cSrcweir }
1007cdf0e10cSrcweir
1008cdf0e10cSrcweir // ============================================================================
1009cdf0e10cSrcweir
BiffLineObject(const WorksheetHelper & rHelper)1010cdf0e10cSrcweir BiffLineObject::BiffLineObject( const WorksheetHelper& rHelper ) :
1011cdf0e10cSrcweir BiffDrawingObjectBase( rHelper ),
1012cdf0e10cSrcweir mnArrows( 0 ),
1013cdf0e10cSrcweir mnStartPoint( BIFF_OBJ_LINE_TL )
1014cdf0e10cSrcweir {
1015cdf0e10cSrcweir setAreaObj( false );
1016cdf0e10cSrcweir }
1017cdf0e10cSrcweir
implReadObjBiff3(BiffInputStream & rStrm,sal_uInt16 nMacroSize)1018cdf0e10cSrcweir void BiffLineObject::implReadObjBiff3( BiffInputStream& rStrm, sal_uInt16 nMacroSize )
1019cdf0e10cSrcweir {
1020cdf0e10cSrcweir rStrm >> maLineModel >> mnArrows >> mnStartPoint;
1021cdf0e10cSrcweir rStrm.skip( 1 );
1022cdf0e10cSrcweir readMacroBiff3( rStrm, nMacroSize );
1023cdf0e10cSrcweir }
1024cdf0e10cSrcweir
implReadObjBiff4(BiffInputStream & rStrm,sal_uInt16 nMacroSize)1025cdf0e10cSrcweir void BiffLineObject::implReadObjBiff4( BiffInputStream& rStrm, sal_uInt16 nMacroSize )
1026cdf0e10cSrcweir {
1027cdf0e10cSrcweir rStrm >> maLineModel >> mnArrows >> mnStartPoint;
1028cdf0e10cSrcweir rStrm.skip( 1 );
1029cdf0e10cSrcweir readMacroBiff4( rStrm, nMacroSize );
1030cdf0e10cSrcweir }
1031cdf0e10cSrcweir
implReadObjBiff5(BiffInputStream & rStrm,sal_uInt16 nNameLen,sal_uInt16 nMacroSize)1032cdf0e10cSrcweir void BiffLineObject::implReadObjBiff5( BiffInputStream& rStrm, sal_uInt16 nNameLen, sal_uInt16 nMacroSize )
1033cdf0e10cSrcweir {
1034cdf0e10cSrcweir rStrm >> maLineModel >> mnArrows >> mnStartPoint;
1035cdf0e10cSrcweir rStrm.skip( 1 );
1036cdf0e10cSrcweir readNameBiff5( rStrm, nNameLen );
1037cdf0e10cSrcweir readMacroBiff5( rStrm, nMacroSize );
1038cdf0e10cSrcweir }
1039cdf0e10cSrcweir
implConvertAndInsert(BiffDrawingBase & rDrawing,const Reference<XShapes> & rxShapes,const Rectangle & rShapeRect) const1040cdf0e10cSrcweir Reference< XShape > BiffLineObject::implConvertAndInsert( BiffDrawingBase& rDrawing,
1041cdf0e10cSrcweir const Reference< XShapes >& rxShapes, const Rectangle& rShapeRect ) const
1042cdf0e10cSrcweir {
1043cdf0e10cSrcweir ShapePropertyMap aPropMap( getBaseFilter().getModelObjectHelper() );
1044cdf0e10cSrcweir convertLineProperties( aPropMap, maLineModel, mnArrows );
1045cdf0e10cSrcweir
1046cdf0e10cSrcweir // create the line polygon
1047cdf0e10cSrcweir PointSequenceSequence aPoints( 1 );
1048cdf0e10cSrcweir aPoints[ 0 ].realloc( 2 );
1049cdf0e10cSrcweir Point& rBeg = aPoints[ 0 ][ 0 ];
1050cdf0e10cSrcweir Point& rEnd = aPoints[ 0 ][ 1 ];
1051cdf0e10cSrcweir sal_Int32 nL = rShapeRect.X;
1052cdf0e10cSrcweir sal_Int32 nT = rShapeRect.Y;
1053cdf0e10cSrcweir sal_Int32 nR = rShapeRect.X + ::std::max< sal_Int32 >( rShapeRect.Width - 1, 0 );
1054cdf0e10cSrcweir sal_Int32 nB = rShapeRect.Y + ::std::max< sal_Int32 >( rShapeRect.Height - 1, 0 );
1055cdf0e10cSrcweir switch( mnStartPoint )
1056cdf0e10cSrcweir {
1057cdf0e10cSrcweir default:
1058cdf0e10cSrcweir case BIFF_OBJ_LINE_TL: rBeg.X = nL; rBeg.Y = nT; rEnd.X = nR; rEnd.Y = nB; break;
1059cdf0e10cSrcweir case BIFF_OBJ_LINE_TR: rBeg.X = nR; rBeg.Y = nT; rEnd.X = nL; rEnd.Y = nB; break;
1060cdf0e10cSrcweir case BIFF_OBJ_LINE_BR: rBeg.X = nR; rBeg.Y = nB; rEnd.X = nL; rEnd.Y = nT; break;
1061cdf0e10cSrcweir case BIFF_OBJ_LINE_BL: rBeg.X = nL; rBeg.Y = nB; rEnd.X = nR; rEnd.Y = nT; break;
1062cdf0e10cSrcweir }
1063cdf0e10cSrcweir aPropMap.setProperty( PROP_PolyPolygon, aPoints );
1064cdf0e10cSrcweir aPropMap.setProperty( PROP_PolygonKind, PolygonKind_LINE );
1065cdf0e10cSrcweir
1066cdf0e10cSrcweir // create the shape
1067cdf0e10cSrcweir Reference< XShape > xShape = rDrawing.createAndInsertXShape( CREATE_OUSTRING( "com.sun.star.drawing.LineShape" ), rxShapes, rShapeRect );
1068cdf0e10cSrcweir PropertySet( xShape ).setProperties( aPropMap );
1069cdf0e10cSrcweir return xShape;
1070cdf0e10cSrcweir }
1071cdf0e10cSrcweir
1072cdf0e10cSrcweir // ============================================================================
1073cdf0e10cSrcweir
BiffRectObject(const WorksheetHelper & rHelper)1074cdf0e10cSrcweir BiffRectObject::BiffRectObject( const WorksheetHelper& rHelper ) :
1075cdf0e10cSrcweir BiffDrawingObjectBase( rHelper ),
1076cdf0e10cSrcweir mnFrameFlags( 0 )
1077cdf0e10cSrcweir {
1078cdf0e10cSrcweir setAreaObj( true );
1079cdf0e10cSrcweir }
1080cdf0e10cSrcweir
readFrameData(BiffInputStream & rStrm)1081cdf0e10cSrcweir void BiffRectObject::readFrameData( BiffInputStream& rStrm )
1082cdf0e10cSrcweir {
1083cdf0e10cSrcweir rStrm >> maFillModel >> maLineModel >> mnFrameFlags;
1084cdf0e10cSrcweir }
1085cdf0e10cSrcweir
convertRectProperties(ShapePropertyMap & rPropMap) const1086cdf0e10cSrcweir void BiffRectObject::convertRectProperties( ShapePropertyMap& rPropMap ) const
1087cdf0e10cSrcweir {
1088cdf0e10cSrcweir convertLineProperties( rPropMap, maLineModel );
1089cdf0e10cSrcweir convertFillProperties( rPropMap, maFillModel );
1090cdf0e10cSrcweir convertFrameProperties( rPropMap, mnFrameFlags );
1091cdf0e10cSrcweir }
1092cdf0e10cSrcweir
implReadObjBiff3(BiffInputStream & rStrm,sal_uInt16 nMacroSize)1093cdf0e10cSrcweir void BiffRectObject::implReadObjBiff3( BiffInputStream& rStrm, sal_uInt16 nMacroSize )
1094cdf0e10cSrcweir {
1095cdf0e10cSrcweir readFrameData( rStrm );
1096cdf0e10cSrcweir readMacroBiff3( rStrm, nMacroSize );
1097cdf0e10cSrcweir }
1098cdf0e10cSrcweir
implReadObjBiff4(BiffInputStream & rStrm,sal_uInt16 nMacroSize)1099cdf0e10cSrcweir void BiffRectObject::implReadObjBiff4( BiffInputStream& rStrm, sal_uInt16 nMacroSize )
1100cdf0e10cSrcweir {
1101cdf0e10cSrcweir readFrameData( rStrm );
1102cdf0e10cSrcweir readMacroBiff4( rStrm, nMacroSize );
1103cdf0e10cSrcweir }
1104cdf0e10cSrcweir
implReadObjBiff5(BiffInputStream & rStrm,sal_uInt16 nNameLen,sal_uInt16 nMacroSize)1105cdf0e10cSrcweir void BiffRectObject::implReadObjBiff5( BiffInputStream& rStrm, sal_uInt16 nNameLen, sal_uInt16 nMacroSize )
1106cdf0e10cSrcweir {
1107cdf0e10cSrcweir readFrameData( rStrm );
1108cdf0e10cSrcweir readNameBiff5( rStrm, nNameLen );
1109cdf0e10cSrcweir readMacroBiff5( rStrm, nMacroSize );
1110cdf0e10cSrcweir }
1111cdf0e10cSrcweir
implConvertAndInsert(BiffDrawingBase & rDrawing,const Reference<XShapes> & rxShapes,const Rectangle & rShapeRect) const1112cdf0e10cSrcweir Reference< XShape > BiffRectObject::implConvertAndInsert( BiffDrawingBase& rDrawing,
1113cdf0e10cSrcweir const Reference< XShapes >& rxShapes, const Rectangle& rShapeRect ) const
1114cdf0e10cSrcweir {
1115cdf0e10cSrcweir ShapePropertyMap aPropMap( getBaseFilter().getModelObjectHelper() );
1116cdf0e10cSrcweir convertRectProperties( aPropMap );
1117cdf0e10cSrcweir
1118cdf0e10cSrcweir Reference< XShape > xShape = rDrawing.createAndInsertXShape( CREATE_OUSTRING( "com.sun.star.drawing.RectangleShape" ), rxShapes, rShapeRect );
1119cdf0e10cSrcweir PropertySet( xShape ).setProperties( aPropMap );
1120cdf0e10cSrcweir return xShape;
1121cdf0e10cSrcweir }
1122cdf0e10cSrcweir
1123cdf0e10cSrcweir // ============================================================================
1124cdf0e10cSrcweir
BiffOvalObject(const WorksheetHelper & rHelper)1125cdf0e10cSrcweir BiffOvalObject::BiffOvalObject( const WorksheetHelper& rHelper ) :
1126cdf0e10cSrcweir BiffRectObject( rHelper )
1127cdf0e10cSrcweir {
1128cdf0e10cSrcweir }
1129cdf0e10cSrcweir
implConvertAndInsert(BiffDrawingBase & rDrawing,const Reference<XShapes> & rxShapes,const Rectangle & rShapeRect) const1130cdf0e10cSrcweir Reference< XShape > BiffOvalObject::implConvertAndInsert( BiffDrawingBase& rDrawing,
1131cdf0e10cSrcweir const Reference< XShapes >& rxShapes, const Rectangle& rShapeRect ) const
1132cdf0e10cSrcweir {
1133cdf0e10cSrcweir ShapePropertyMap aPropMap( getBaseFilter().getModelObjectHelper() );
1134cdf0e10cSrcweir convertRectProperties( aPropMap );
1135cdf0e10cSrcweir
1136cdf0e10cSrcweir Reference< XShape > xShape = rDrawing.createAndInsertXShape( CREATE_OUSTRING( "com.sun.star.drawing.EllipseShape" ), rxShapes, rShapeRect );
1137cdf0e10cSrcweir PropertySet( xShape ).setProperties( aPropMap );
1138cdf0e10cSrcweir return xShape;
1139cdf0e10cSrcweir }
1140cdf0e10cSrcweir
1141cdf0e10cSrcweir // ============================================================================
1142cdf0e10cSrcweir
BiffArcObject(const WorksheetHelper & rHelper)1143cdf0e10cSrcweir BiffArcObject::BiffArcObject( const WorksheetHelper& rHelper ) :
1144cdf0e10cSrcweir BiffDrawingObjectBase( rHelper ),
1145cdf0e10cSrcweir mnQuadrant( BIFF_OBJ_ARC_TR )
1146cdf0e10cSrcweir {
1147cdf0e10cSrcweir setAreaObj( false ); // arc may be 2-dimensional
1148cdf0e10cSrcweir }
1149cdf0e10cSrcweir
implReadObjBiff3(BiffInputStream & rStrm,sal_uInt16 nMacroSize)1150cdf0e10cSrcweir void BiffArcObject::implReadObjBiff3( BiffInputStream& rStrm, sal_uInt16 nMacroSize )
1151cdf0e10cSrcweir {
1152cdf0e10cSrcweir rStrm >> maFillModel >> maLineModel >> mnQuadrant;
1153cdf0e10cSrcweir rStrm.skip( 1 );
1154cdf0e10cSrcweir readMacroBiff3( rStrm, nMacroSize );
1155cdf0e10cSrcweir }
1156cdf0e10cSrcweir
implReadObjBiff4(BiffInputStream & rStrm,sal_uInt16 nMacroSize)1157cdf0e10cSrcweir void BiffArcObject::implReadObjBiff4( BiffInputStream& rStrm, sal_uInt16 nMacroSize )
1158cdf0e10cSrcweir {
1159cdf0e10cSrcweir rStrm >> maFillModel >> maLineModel >> mnQuadrant;
1160cdf0e10cSrcweir rStrm.skip( 1 );
1161cdf0e10cSrcweir readMacroBiff4( rStrm, nMacroSize );
1162cdf0e10cSrcweir }
1163cdf0e10cSrcweir
implReadObjBiff5(BiffInputStream & rStrm,sal_uInt16 nNameLen,sal_uInt16 nMacroSize)1164cdf0e10cSrcweir void BiffArcObject::implReadObjBiff5( BiffInputStream& rStrm, sal_uInt16 nNameLen, sal_uInt16 nMacroSize )
1165cdf0e10cSrcweir {
1166cdf0e10cSrcweir rStrm >> maFillModel >> maLineModel >> mnQuadrant;
1167cdf0e10cSrcweir rStrm.skip( 1 );
1168cdf0e10cSrcweir readNameBiff5( rStrm, nNameLen );
1169cdf0e10cSrcweir readMacroBiff5( rStrm, nMacroSize );
1170cdf0e10cSrcweir }
1171cdf0e10cSrcweir
implConvertAndInsert(BiffDrawingBase & rDrawing,const Reference<XShapes> & rxShapes,const Rectangle & rShapeRect) const1172cdf0e10cSrcweir Reference< XShape > BiffArcObject::implConvertAndInsert( BiffDrawingBase& rDrawing,
1173cdf0e10cSrcweir const Reference< XShapes >& rxShapes, const Rectangle& rShapeRect ) const
1174cdf0e10cSrcweir {
1175cdf0e10cSrcweir ShapePropertyMap aPropMap( getBaseFilter().getModelObjectHelper() );
1176cdf0e10cSrcweir convertLineProperties( aPropMap, maLineModel );
1177cdf0e10cSrcweir convertFillProperties( aPropMap, maFillModel );
1178cdf0e10cSrcweir
1179cdf0e10cSrcweir /* Simulate arc objects with ellipse sections. While the original arc
1180cdf0e10cSrcweir object uses the entire object rectangle, only one quarter of the
1181cdf0e10cSrcweir ellipse shape will be visible. Thus, the size of the ellipse shape
1182cdf0e10cSrcweir needs to be extended and its position adjusted according to the visible
1183cdf0e10cSrcweir quadrant. */
1184cdf0e10cSrcweir Rectangle aNewRect( rShapeRect.X, rShapeRect.Y, rShapeRect.Width * 2, rShapeRect.Height * 2 );
1185cdf0e10cSrcweir long nStartAngle = 0;
1186cdf0e10cSrcweir switch( mnQuadrant )
1187cdf0e10cSrcweir {
1188cdf0e10cSrcweir default:
1189cdf0e10cSrcweir case BIFF_OBJ_ARC_TR: nStartAngle = 0; aNewRect.X -= rShapeRect.Width; break;
1190cdf0e10cSrcweir case BIFF_OBJ_ARC_TL: nStartAngle = 9000; break;
1191cdf0e10cSrcweir case BIFF_OBJ_ARC_BL: nStartAngle = 18000; aNewRect.Y -= rShapeRect.Height; break;
1192cdf0e10cSrcweir case BIFF_OBJ_ARC_BR: nStartAngle = 27000; aNewRect.X -= rShapeRect.Width; aNewRect.Y -= rShapeRect.Height; break;
1193cdf0e10cSrcweir }
1194cdf0e10cSrcweir long nEndAngle = (nStartAngle + 9000) % 36000;
1195cdf0e10cSrcweir aPropMap.setProperty( PROP_CircleKind, maFillModel.isFilled() ? CircleKind_SECTION : CircleKind_ARC );
1196cdf0e10cSrcweir aPropMap.setProperty( PROP_CircleStartAngle, nStartAngle );
1197cdf0e10cSrcweir aPropMap.setProperty( PROP_CircleEndAngle, nEndAngle );
1198cdf0e10cSrcweir
1199cdf0e10cSrcweir // create the shape
1200cdf0e10cSrcweir Reference< XShape > xShape = rDrawing.createAndInsertXShape( CREATE_OUSTRING( "com.sun.star.drawing.EllipseShape" ), rxShapes, aNewRect );
1201cdf0e10cSrcweir PropertySet( xShape ).setProperties( aPropMap );
1202cdf0e10cSrcweir return xShape;
1203cdf0e10cSrcweir }
1204cdf0e10cSrcweir
1205cdf0e10cSrcweir // ============================================================================
1206cdf0e10cSrcweir
BiffPolygonObject(const WorksheetHelper & rHelper)1207cdf0e10cSrcweir BiffPolygonObject::BiffPolygonObject( const WorksheetHelper& rHelper ) :
1208cdf0e10cSrcweir BiffRectObject( rHelper ),
1209cdf0e10cSrcweir mnPolyFlags( 0 ),
1210cdf0e10cSrcweir mnPointCount( 0 )
1211cdf0e10cSrcweir {
1212cdf0e10cSrcweir setAreaObj( false ); // polygon may be 2-dimensional
1213cdf0e10cSrcweir }
1214cdf0e10cSrcweir
implReadObjBiff4(BiffInputStream & rStrm,sal_uInt16 nMacroSize)1215cdf0e10cSrcweir void BiffPolygonObject::implReadObjBiff4( BiffInputStream& rStrm, sal_uInt16 nMacroSize )
1216cdf0e10cSrcweir {
1217cdf0e10cSrcweir readFrameData( rStrm );
1218cdf0e10cSrcweir rStrm >> mnPolyFlags;
1219cdf0e10cSrcweir rStrm.skip( 10 );
1220cdf0e10cSrcweir rStrm >> mnPointCount;
1221cdf0e10cSrcweir rStrm.skip( 8 );
1222cdf0e10cSrcweir readMacroBiff4( rStrm, nMacroSize );
1223cdf0e10cSrcweir importCoordList( rStrm );
1224cdf0e10cSrcweir }
1225cdf0e10cSrcweir
implReadObjBiff5(BiffInputStream & rStrm,sal_uInt16 nNameLen,sal_uInt16 nMacroSize)1226cdf0e10cSrcweir void BiffPolygonObject::implReadObjBiff5( BiffInputStream& rStrm, sal_uInt16 nNameLen, sal_uInt16 nMacroSize )
1227cdf0e10cSrcweir {
1228cdf0e10cSrcweir readFrameData( rStrm );
1229cdf0e10cSrcweir rStrm >> mnPolyFlags;
1230cdf0e10cSrcweir rStrm.skip( 10 );
1231cdf0e10cSrcweir rStrm >> mnPointCount;
1232cdf0e10cSrcweir rStrm.skip( 8 );
1233cdf0e10cSrcweir readNameBiff5( rStrm, nNameLen );
1234cdf0e10cSrcweir readMacroBiff5( rStrm, nMacroSize );
1235cdf0e10cSrcweir importCoordList( rStrm );
1236cdf0e10cSrcweir }
1237cdf0e10cSrcweir
1238cdf0e10cSrcweir namespace {
1239cdf0e10cSrcweir
lclGetPolyPoint(const Rectangle & rAnchorRect,const Point & rPoint)1240cdf0e10cSrcweir Point lclGetPolyPoint( const Rectangle& rAnchorRect, const Point& rPoint )
1241cdf0e10cSrcweir {
1242cdf0e10cSrcweir // polygon coordinates are given in 1/16384 of shape size
1243cdf0e10cSrcweir return Point(
1244cdf0e10cSrcweir rAnchorRect.X + static_cast< sal_Int32 >( rAnchorRect.Width * getLimitedValue< double >( static_cast< double >( rPoint.X ) / 16384.0, 0.0, 1.0 ) + 0.5 ),
1245cdf0e10cSrcweir rAnchorRect.Y + static_cast< sal_Int32 >( rAnchorRect.Height * getLimitedValue< double >( static_cast< double >( rPoint.Y ) / 16384.0, 0.0, 1.0 ) + 0.5 ) );
1246cdf0e10cSrcweir }
1247cdf0e10cSrcweir
1248cdf0e10cSrcweir } // namespace
1249cdf0e10cSrcweir
implConvertAndInsert(BiffDrawingBase & rDrawing,const Reference<XShapes> & rxShapes,const Rectangle & rShapeRect) const1250cdf0e10cSrcweir Reference< XShape > BiffPolygonObject::implConvertAndInsert( BiffDrawingBase& rDrawing,
1251cdf0e10cSrcweir const Reference< XShapes >& rxShapes, const Rectangle& rShapeRect ) const
1252cdf0e10cSrcweir {
1253cdf0e10cSrcweir Reference< XShape > xShape;
1254cdf0e10cSrcweir if( maCoords.size() >= 2 )
1255cdf0e10cSrcweir {
1256cdf0e10cSrcweir ShapePropertyMap aPropMap( getBaseFilter().getModelObjectHelper() );
1257cdf0e10cSrcweir convertRectProperties( aPropMap );
1258cdf0e10cSrcweir
1259cdf0e10cSrcweir // create the polygon
1260cdf0e10cSrcweir PointVector aPolygon;
1261cdf0e10cSrcweir for( PointVector::const_iterator aIt = maCoords.begin(), aEnd = maCoords.end(); aIt != aEnd; ++aIt )
1262cdf0e10cSrcweir aPolygon.push_back( lclGetPolyPoint( rShapeRect, *aIt ) );
1263cdf0e10cSrcweir // close polygon if specified
1264cdf0e10cSrcweir if( getFlag( mnPolyFlags, BIFF_OBJ_POLY_CLOSED ) && ((maCoords.front().X != maCoords.back().X) || (maCoords.front().Y != maCoords.back().Y)) )
1265cdf0e10cSrcweir aPolygon.push_back( aPolygon.front() );
1266cdf0e10cSrcweir PointSequenceSequence aPoints( 1 );
1267cdf0e10cSrcweir aPoints[ 0 ] = ContainerHelper::vectorToSequence( aPolygon );
1268cdf0e10cSrcweir aPropMap.setProperty( PROP_PolyPolygon, aPoints );
1269cdf0e10cSrcweir
1270cdf0e10cSrcweir // create the shape
1271cdf0e10cSrcweir OUString aService = maFillModel.isFilled() ?
1272cdf0e10cSrcweir CREATE_OUSTRING( "com.sun.star.drawing.PolyPolygonShape" ) :
1273cdf0e10cSrcweir CREATE_OUSTRING( "com.sun.star.drawing.PolyLineShape" );
1274cdf0e10cSrcweir xShape = rDrawing.createAndInsertXShape( aService, rxShapes, rShapeRect );
1275cdf0e10cSrcweir PropertySet( xShape ).setProperties( aPropMap );
1276cdf0e10cSrcweir }
1277cdf0e10cSrcweir return xShape;
1278cdf0e10cSrcweir }
1279cdf0e10cSrcweir
importCoordList(BiffInputStream & rStrm)1280cdf0e10cSrcweir void BiffPolygonObject::importCoordList( BiffInputStream& rStrm )
1281cdf0e10cSrcweir {
1282cdf0e10cSrcweir if( (rStrm.getNextRecId() == BIFF_ID_COORDLIST) && rStrm.startNextRecord() )
1283cdf0e10cSrcweir {
1284cdf0e10cSrcweir OSL_ENSURE( rStrm.getRemaining() / 4 == mnPointCount, "BiffPolygonObject::importCoordList - wrong polygon point count" );
1285cdf0e10cSrcweir while( rStrm.getRemaining() >= 4 )
1286cdf0e10cSrcweir {
1287cdf0e10cSrcweir sal_uInt16 nX, nY;
1288cdf0e10cSrcweir rStrm >> nX >> nY;
1289cdf0e10cSrcweir maCoords.push_back( Point( nX, nY ) );
1290cdf0e10cSrcweir }
1291cdf0e10cSrcweir }
1292cdf0e10cSrcweir }
1293cdf0e10cSrcweir
1294cdf0e10cSrcweir // ============================================================================
1295cdf0e10cSrcweir // BIFF drawing page
1296cdf0e10cSrcweir // ============================================================================
1297cdf0e10cSrcweir
BiffDrawingBase(const WorksheetHelper & rHelper,const Reference<XDrawPage> & rxDrawPage)1298cdf0e10cSrcweir BiffDrawingBase::BiffDrawingBase( const WorksheetHelper& rHelper, const Reference< XDrawPage >& rxDrawPage ) :
1299cdf0e10cSrcweir WorksheetHelper( rHelper ),
1300cdf0e10cSrcweir mxDrawPage( rxDrawPage )
1301cdf0e10cSrcweir {
1302cdf0e10cSrcweir }
1303cdf0e10cSrcweir
importObj(BiffInputStream & rStrm)1304cdf0e10cSrcweir void BiffDrawingBase::importObj( BiffInputStream& rStrm )
1305cdf0e10cSrcweir {
1306cdf0e10cSrcweir BiffDrawingObjectRef xDrawingObj;
1307cdf0e10cSrcweir
1308cdf0e10cSrcweir #if 0
1309cdf0e10cSrcweir /* #i61786# In BIFF8 streams, OBJ records may occur without MSODRAWING
1310cdf0e10cSrcweir records. In this case, the OBJ records are in BIFF5 format. Do a sanity
1311cdf0e10cSrcweir check here that there is no DFF data loaded before. */
1312cdf0e10cSrcweir DBG_ASSERT( maDffStrm.Tell() == 0, "BiffDrawingBase::importObj - unexpected DFF stream data, OBJ will be ignored" );
1313cdf0e10cSrcweir if( maDffStrm.Tell() == 0 ) switch( GetBiff() )
1314cdf0e10cSrcweir #else
1315cdf0e10cSrcweir switch( getBiff() )
1316cdf0e10cSrcweir #endif
1317cdf0e10cSrcweir {
1318cdf0e10cSrcweir case BIFF3:
1319cdf0e10cSrcweir xDrawingObj = BiffDrawingObjectBase::importObjBiff3( *this, rStrm );
1320cdf0e10cSrcweir break;
1321cdf0e10cSrcweir case BIFF4:
1322cdf0e10cSrcweir xDrawingObj = BiffDrawingObjectBase::importObjBiff4( *this, rStrm );
1323cdf0e10cSrcweir break;
1324cdf0e10cSrcweir case BIFF5:
1325cdf0e10cSrcweir // TODO: add BIFF8 when DFF is supported
1326cdf0e10cSrcweir // case BIFF8:
1327cdf0e10cSrcweir xDrawingObj = BiffDrawingObjectBase::importObjBiff5( *this, rStrm );
1328cdf0e10cSrcweir break;
1329cdf0e10cSrcweir default:;
1330cdf0e10cSrcweir }
1331cdf0e10cSrcweir
1332cdf0e10cSrcweir if( xDrawingObj.get() )
1333cdf0e10cSrcweir {
1334cdf0e10cSrcweir // insert into maRawObjs or into the last open group object
1335cdf0e10cSrcweir maRawObjs.insertGrouped( xDrawingObj );
1336cdf0e10cSrcweir // to be able to find objects by ID
1337cdf0e10cSrcweir maObjMapId[ xDrawingObj->getObjId() ] = xDrawingObj;
1338cdf0e10cSrcweir }
1339cdf0e10cSrcweir }
1340cdf0e10cSrcweir
setSkipObj(sal_uInt16 nObjId)1341cdf0e10cSrcweir void BiffDrawingBase::setSkipObj( sal_uInt16 nObjId )
1342cdf0e10cSrcweir {
1343cdf0e10cSrcweir /* Store identifiers of objects to be skipped in a separate list (the OBJ
1344cdf0e10cSrcweir record may not be read yet). In the finalization phase, all objects
1345cdf0e10cSrcweir registered here will be skipped. */
1346cdf0e10cSrcweir maSkipObjs.push_back( nObjId );
1347cdf0e10cSrcweir }
1348cdf0e10cSrcweir
finalizeImport()1349cdf0e10cSrcweir void BiffDrawingBase::finalizeImport()
1350cdf0e10cSrcweir {
1351cdf0e10cSrcweir Reference< XShapes > xShapes( mxDrawPage, UNO_QUERY );
1352cdf0e10cSrcweir OSL_ENSURE( xShapes.is(), "BiffDrawingBase::finalizeImport - no shapes container" );
1353cdf0e10cSrcweir if( !xShapes.is() )
1354cdf0e10cSrcweir return;
1355cdf0e10cSrcweir
1356cdf0e10cSrcweir // process list of objects to be skipped
1357cdf0e10cSrcweir for( BiffObjIdVector::const_iterator aIt = maSkipObjs.begin(), aEnd = maSkipObjs.end(); aIt != aEnd; ++aIt )
1358cdf0e10cSrcweir if( BiffDrawingObjectBase* pDrawingObj = maObjMapId.get( *aIt ).get() )
1359cdf0e10cSrcweir pDrawingObj->setProcessShape( false );
1360cdf0e10cSrcweir
1361cdf0e10cSrcweir // process drawing objects without DFF data
1362cdf0e10cSrcweir maRawObjs.convertAndInsert( *this, xShapes );
1363cdf0e10cSrcweir }
1364cdf0e10cSrcweir
createAndInsertXShape(const OUString & rService,const Reference<XShapes> & rxShapes,const Rectangle & rShapeRect) const1365cdf0e10cSrcweir Reference< XShape > BiffDrawingBase::createAndInsertXShape( const OUString& rService,
1366cdf0e10cSrcweir const Reference< XShapes >& rxShapes, const Rectangle& rShapeRect ) const
1367cdf0e10cSrcweir {
1368cdf0e10cSrcweir OSL_ENSURE( rService.getLength() > 0, "BiffDrawingBase::createAndInsertXShape - missing UNO shape service name" );
1369cdf0e10cSrcweir OSL_ENSURE( rxShapes.is(), "BiffDrawingBase::createAndInsertXShape - missing XShapes container" );
1370cdf0e10cSrcweir Reference< XShape > xShape;
1371cdf0e10cSrcweir if( (rService.getLength() > 0) && rxShapes.is() ) try
1372cdf0e10cSrcweir {
1373cdf0e10cSrcweir xShape.set( getBaseFilter().getModelFactory()->createInstance( rService ), UNO_QUERY_THROW );
1374cdf0e10cSrcweir // insert shape into passed shape collection (maybe drawpage or group shape)
1375cdf0e10cSrcweir rxShapes->add( xShape );
1376cdf0e10cSrcweir xShape->setPosition( Point( rShapeRect.X, rShapeRect.Y ) );
1377cdf0e10cSrcweir xShape->setSize( Size( rShapeRect.Width, rShapeRect.Height ) );
1378cdf0e10cSrcweir }
1379cdf0e10cSrcweir catch( Exception& )
1380cdf0e10cSrcweir {
1381cdf0e10cSrcweir }
1382cdf0e10cSrcweir OSL_ENSURE( xShape.is(), "BiffDrawingBase::createAndInsertXShape - cannot instanciate shape object" );
1383cdf0e10cSrcweir return xShape;
1384cdf0e10cSrcweir }
1385cdf0e10cSrcweir
1386cdf0e10cSrcweir // protected ------------------------------------------------------------------
1387cdf0e10cSrcweir
appendRawObject(const BiffDrawingObjectRef & rxDrawingObj)1388cdf0e10cSrcweir void BiffDrawingBase::appendRawObject( const BiffDrawingObjectRef& rxDrawingObj )
1389cdf0e10cSrcweir {
1390cdf0e10cSrcweir OSL_ENSURE( rxDrawingObj.get(), "BiffDrawingBase::appendRawObject - unexpected empty object reference" );
1391cdf0e10cSrcweir maRawObjs.append( rxDrawingObj );
1392cdf0e10cSrcweir }
1393cdf0e10cSrcweir
1394cdf0e10cSrcweir // ============================================================================
1395cdf0e10cSrcweir
BiffSheetDrawing(const WorksheetHelper & rHelper)1396cdf0e10cSrcweir BiffSheetDrawing::BiffSheetDrawing( const WorksheetHelper& rHelper ) :
1397cdf0e10cSrcweir BiffDrawingBase( rHelper, rHelper.getDrawPage() )
1398cdf0e10cSrcweir {
1399cdf0e10cSrcweir }
1400cdf0e10cSrcweir
notifyShapeInserted(const Reference<XShape> &,const Rectangle & rShapeRect)1401cdf0e10cSrcweir void BiffSheetDrawing::notifyShapeInserted( const Reference< XShape >& /*rxShape*/, const Rectangle& rShapeRect )
1402cdf0e10cSrcweir {
1403cdf0e10cSrcweir // collect all shape positions in the WorksheetHelper base class
1404cdf0e10cSrcweir extendShapeBoundingBox( rShapeRect );
1405cdf0e10cSrcweir }
1406cdf0e10cSrcweir
1407cdf0e10cSrcweir // ============================================================================
1408cdf0e10cSrcweir
1409cdf0e10cSrcweir } // namespace xls
1410cdf0e10cSrcweir } // namespace oox
1411