xref: /trunk/main/sw/source/core/unocore/unoframe.cxx (revision 26c3ced7f18cd4f621132aba7f30248f91e78ddc)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 // MARKER(update_precomp.py): autogen include statement, do not remove
23 #include "precompiled_sw.hxx"
24 
25 #include <com/sun/star/embed/NoVisualAreaSizeException.hpp>
26 #include <com/sun/star/container/XChild.hpp>
27 #include <com/sun/star/embed/XClassifiedObject.hpp>
28 #include <com/sun/star/embed/XVisualObject.hpp>
29 #include <com/sun/star/embed/XComponentSupplier.hpp>
30 #include <com/sun/star/embed/EmbedStates.hpp>
31 #include <com/sun/star/embed/Aspects.hpp>
32 #include <com/sun/star/graphic/XGraphicProvider.hpp>
33 #include <svx/svxids.hrc>
34 #include <editeng/memberids.hrc>
35 
36 #include <swtypes.hxx>
37 #include <cmdid.h>
38 
39 #include <memory>
40 #include <hints.hxx>
41 #include <doc.hxx>
42 #include <IDocumentUndoRedo.hxx>
43 #include <docsh.hxx>
44 #include <editsh.hxx>
45 #include <swcli.hxx>
46 #include <ndindex.hxx>
47 #include <pam.hxx>
48 #include <ndnotxt.hxx>
49 #include <svx/unomid.hxx>
50 #include <unocrsr.hxx>
51 #include <unocrsrhelper.hxx>
52 #include <docstyle.hxx>
53 #include <dcontact.hxx>
54 #include <fmtcnct.hxx>
55 #include <ndole.hxx>
56 #include <frmfmt.hxx>
57 #include <frame.hxx>
58 #include <unotextrange.hxx>
59 #include <unotextcursor.hxx>
60 #include <unoparagraph.hxx>
61 #include <unomap.hxx>
62 #include <unoprnms.hxx>
63 #include <unoevent.hxx>
64 #include <com/sun/star/table/BorderLine.hpp>
65 #include <com/sun/star/util/XModifyBroadcaster.hpp>
66 #include <com/sun/star/table/ShadowFormat.hpp>
67 #include <com/sun/star/style/GraphicLocation.hpp>
68 #include <com/sun/star/text/GraphicCrop.hpp>
69 #include <com/sun/star/text/TextContentAnchorType.hpp>
70 #include <com/sun/star/text/XTextColumns.hpp>
71 #include <com/sun/star/text/WrapTextMode.hpp>
72 #include <com/sun/star/beans/PropertyAttribute.hpp>
73 #include <com/sun/star/drawing/PointSequenceSequence.hpp>
74 #include <com/sun/star/drawing/PointSequence.hpp>
75 #include <com/sun/star/drawing/ColorMode.hpp>
76 #include <tools/poly.hxx>
77 #include <swundo.hxx>
78 #include <unostyle.hxx>
79 #include <svx/svdmodel.hxx>
80 #include <svx/svdpage.hxx>
81 #include <editeng/brshitem.hxx>
82 #include <editeng/protitem.hxx>
83 #include <fmtornt.hxx>
84 #include <fmturl.hxx>
85 #include <editeng/lrspitem.hxx>
86 #include <editeng/ulspitem.hxx>
87 #include <editeng/boxitem.hxx>
88 #include <editeng/opaqitem.hxx>
89 #include <editeng/prntitem.hxx>
90 #include <editeng/shaditem.hxx>
91 #include <fmtsrnd.hxx>
92 #include <fmtfsize.hxx>
93 #include <grfatr.hxx>
94 #include <unoframe.hxx>
95 #include <fmtanchr.hxx>
96 #include <fmtclds.hxx>
97 #include <fmtcntnt.hxx>
98 #include <frmatr.hxx>
99 #include <ndtxt.hxx>
100 #include <ndgrf.hxx>
101 #include <vos/mutex.hxx>
102 #include <vcl/svapp.hxx>
103 #include <sfx2/printer.hxx>
104 //Begin Bug 119922
105 #include <sfx2/docfile.hxx>
106 #include <sfx2/docfilt.hxx>
107 //End Bug 119922
108 #include <SwStyleNameMapper.hxx>
109 #include <xmloff/xmlcnitm.hxx>
110 #include <poolfmt.hxx>
111 #include <pagedesc.hxx>
112 #include <com/sun/star/style/XStyleFamiliesSupplier.hpp>
113 #include <tools/urlobj.hxx>
114 #include <editeng/frmdiritem.hxx>
115 #include <fmtfollowtextflow.hxx>
116 #include <fmtwrapinfluenceonobjpos.hxx>
117 #include <toolkit/helper/vclunohelper.hxx>
118 #include <switerator.hxx>
119 
120 //UUUU
121 #include <unobrushitemhelper.hxx>
122 #include <svx/xfillit0.hxx>
123 #include <svx/xbtmpit.hxx>
124 #include <svx/xgrscit.hxx>
125 #include <svx/xflbmtit.hxx>
126 #include <svx/xflbmpit.hxx>
127 #include <svx/xflbmsxy.hxx>
128 #include <svx/xflbmsxy.hxx>
129 #include <svx/xflftrit.hxx>
130 #include <svx/xsflclit.hxx>
131 #include <svx/xflbmsli.hxx>
132 #include <svx/xflbtoxy.hxx>
133 #include <svx/xflbstit.hxx>
134 #include <svx/xflboxy.hxx>
135 #include <svx/xflbckit.hxx>
136 #include <svx/unoshape.hxx>
137 
138 // from fefly1.cxx
139 extern sal_Bool lcl_ChkAndSetNewAnchor( SwEditShell& rEditShell, const SwFlyFrm& rFly, SfxItemSet& rSet );
140 
141 using namespace ::com::sun::star;
142 using ::rtl::OUString;
143 
144 using ::com::sun::star::frame::XModel;
145 using ::com::sun::star::container::XNameAccess;
146 using ::com::sun::star::style::XStyleFamiliesSupplier;
147 
148 const sal_Char __FAR_DATA sPackageProtocol[] = "vnd.sun.star.Package:";
149 const sal_Char __FAR_DATA sGraphicObjectProtocol[] = "vnd.sun.star.GraphicObject:";
150 
151 //UUUU
152 #define OWN_ATTR_FILLBMP_MODE   (OWN_ATTR_VALUE_START+45)
153 
154 /****************************************************************************
155     Rahmenbeschreibung
156 ****************************************************************************/
157 class BaseFrameProperties_Impl
158 {
159     SwUnoCursorHelper::SwAnyMapHelper aAnyMap;
160 
161 public:
162     virtual ~BaseFrameProperties_Impl();
163 
164     void            SetProperty(sal_uInt16 nWID, sal_uInt8 nMemberId, const uno::Any& rVal);
165     sal_Bool        GetProperty(sal_uInt16 nWID, sal_uInt8 nMemberId, const uno::Any*& pAny );
166 //    void          GetProperty(const OUString &rPropertyName, const uno::Reference < beans::XPropertySet > &rxPropertySet, uno::Any& rAny );
167 
168 //    const SfxItemPropertyMap*       GetMap() const {return _pMap;}
169     //Begin Bug 119922:Graphic in header and footer can not be displayed correctly.
170     //Set default value for "Follow text flow" to false if a previous version didn't support "Follow text flow".
171     sal_Bool                        FillBaseProperties(SfxItemSet& rToSet,
172                                                         const SfxItemSet &rFromSet,
173                                                         sal_Bool& rSizeFound,
174                                                         const sal_Bool bOasis = sal_False );
175     //End Bug 119922
176 
177     virtual sal_Bool                AnyToItemSet( SwDoc* pDoc, SfxItemSet& rFrmSet, SfxItemSet& rSet, sal_Bool& rSizeFound) = 0;
178 };
179 
180 BaseFrameProperties_Impl::~BaseFrameProperties_Impl()
181 {
182 }
183 
184 void BaseFrameProperties_Impl::SetProperty(sal_uInt16 nWID, sal_uInt8 nMemberId, const uno::Any& rVal)
185 {
186     aAnyMap.SetValue( nWID, nMemberId, rVal );
187 }
188 
189 sal_Bool BaseFrameProperties_Impl::GetProperty(sal_uInt16 nWID, sal_uInt8 nMemberId, const uno::Any*& rpAny)
190 {
191     return aAnyMap.FillValue( nWID, nMemberId, rpAny );
192 }
193 
194 //Begin Bug 119922:Graphic in header and footer can not be displayed correctly.
195 //Set default value for "Follow text flow" to false if a previous version didn't support "Follow text flow".
196 sal_Bool BaseFrameProperties_Impl::FillBaseProperties(SfxItemSet& rToSet,
197                                                       const SfxItemSet& rFromSet,
198                                                       sal_Bool& rSizeFound,
199                                                       const sal_Bool bOasis /*sal_False*/ )
200 //End Bug 119922
201 {
202     sal_Bool bRet = sal_True;
203     //Anker kommt auf jeden Fall in den Set
204     SwFmtAnchor aAnchor ( static_cast < const SwFmtAnchor & > ( rFromSet.Get ( RES_ANCHOR ) ) );
205     {
206         const ::uno::Any* pAnchorPgNo;
207         if(GetProperty(RES_ANCHOR, MID_ANCHOR_PAGENUM, pAnchorPgNo))
208             bRet &= ((SfxPoolItem&)aAnchor).PutValue(*pAnchorPgNo, MID_ANCHOR_PAGENUM);
209         const ::uno::Any* pAnchorType;
210         if(GetProperty(RES_ANCHOR, MID_ANCHOR_ANCHORTYPE, pAnchorType))
211             bRet &= ((SfxPoolItem&)aAnchor).PutValue(*pAnchorType, MID_ANCHOR_ANCHORTYPE);
212     }
213 
214     rToSet.Put(aAnchor);
215 
216     //UUUU check for SvxBrushItem (RES_BACKGROUND) properties
217     const ::uno::Any* pCol = 0; GetProperty(RES_BACKGROUND, MID_BACK_COLOR, pCol );
218     const ::uno::Any* pRGBCol = 0; GetProperty(RES_BACKGROUND, MID_BACK_COLOR_R_G_B, pRGBCol );
219     const ::uno::Any* pColTrans = 0; GetProperty(RES_BACKGROUND, MID_BACK_COLOR_TRANSPARENCY, pColTrans);
220     const ::uno::Any* pTrans = 0; GetProperty(RES_BACKGROUND, MID_GRAPHIC_TRANSPARENT, pTrans );
221     const ::uno::Any* pGrLoc = 0; GetProperty(RES_BACKGROUND, MID_GRAPHIC_POSITION, pGrLoc );
222     const ::uno::Any* pGrURL = 0; GetProperty(RES_BACKGROUND, MID_GRAPHIC_URL, pGrURL     );
223     const ::uno::Any* pGrFilter = 0; GetProperty(RES_BACKGROUND, MID_GRAPHIC_FILTER, pGrFilter     );
224     const ::uno::Any* pGrTranparency = 0; GetProperty(RES_BACKGROUND, MID_GRAPHIC_TRANSPARENCY, pGrTranparency     );
225     const bool bSvxBrushItemPropertiesUsed(
226         pCol ||
227         pTrans ||
228         pGrURL ||
229         pGrFilter ||
230         pGrLoc ||
231         pGrTranparency ||
232         pColTrans ||
233         pRGBCol);
234 
235     //UUUU check for FillStyle properties in the range XATTR_FILL_FIRST, XATTR_FILL_LAST
236     const uno::Any* pXFillStyleItem = 0; GetProperty(XATTR_FILLSTYLE, 0, pXFillStyleItem);
237     const uno::Any* pXFillColorItem = 0; GetProperty(XATTR_FILLCOLOR, 0, pXFillColorItem);
238 
239     // XFillGradientItem: two possible slots supported in UNO API
240     const uno::Any* pXFillGradientItem = 0; GetProperty(XATTR_FILLGRADIENT, MID_FILLGRADIENT, pXFillGradientItem);
241     const uno::Any* pXFillGradientNameItem = 0; GetProperty(XATTR_FILLGRADIENT, MID_NAME, pXFillGradientNameItem);
242 
243     // XFillHatchItem: two possible slots supported in UNO API
244     const uno::Any* pXFillHatchItem = 0; GetProperty(XATTR_FILLHATCH, MID_FILLHATCH, pXFillHatchItem);
245     const uno::Any* pXFillHatchNameItem = 0; GetProperty(XATTR_FILLHATCH, MID_NAME, pXFillHatchNameItem);
246 
247     // XFillBitmapItem: three possible slots supported in UNO API
248     const uno::Any* pXFillBitmapItem = 0; GetProperty(XATTR_FILLBITMAP, MID_BITMAP, pXFillBitmapItem);
249     const uno::Any* pXFillBitmapNameItem = 0; GetProperty(XATTR_FILLBITMAP, MID_NAME, pXFillBitmapNameItem);
250     const uno::Any* pXFillBitmapURLItem = 0; GetProperty(XATTR_FILLBITMAP, MID_GRAFURL, pXFillBitmapURLItem);
251 
252     const uno::Any* pXFillTransparenceItem = 0; GetProperty(XATTR_FILLTRANSPARENCE, 0, pXFillTransparenceItem);
253     const uno::Any* pXGradientStepCountItem = 0; GetProperty(XATTR_GRADIENTSTEPCOUNT, 0, pXGradientStepCountItem);
254     const uno::Any* pXFillBmpPosItem = 0; GetProperty(XATTR_FILLBMP_POS, 0, pXFillBmpPosItem);
255     const uno::Any* pXFillBmpSizeXItem = 0; GetProperty(XATTR_FILLBMP_SIZEX, 0, pXFillBmpSizeXItem);
256     const uno::Any* pXFillBmpSizeYItem = 0; GetProperty(XATTR_FILLBMP_SIZEY, 0, pXFillBmpSizeYItem);
257 
258     // XFillFloatTransparenceItem: two possible slots supported in UNO API
259     const uno::Any* pXFillFloatTransparenceItem = 0; GetProperty(XATTR_FILLFLOATTRANSPARENCE, MID_FILLGRADIENT, pXFillFloatTransparenceItem);
260     const uno::Any* pXFillFloatTransparenceNameItem = 0; GetProperty(XATTR_FILLFLOATTRANSPARENCE, MID_NAME, pXFillFloatTransparenceNameItem);
261 
262     const uno::Any* pXSecondaryFillColorItem = 0; GetProperty(XATTR_SECONDARYFILLCOLOR, 0, pXSecondaryFillColorItem);
263     const uno::Any* pXFillBmpSizeLogItem = 0; GetProperty(XATTR_FILLBMP_SIZELOG, 0, pXFillBmpSizeLogItem);
264     const uno::Any* pXFillBmpTileOffsetXItem = 0; GetProperty(XATTR_FILLBMP_TILEOFFSETX, 0, pXFillBmpTileOffsetXItem);
265     const uno::Any* pXFillBmpTileOffsetYItem = 0; GetProperty(XATTR_FILLBMP_TILEOFFSETY, 0, pXFillBmpTileOffsetYItem);
266     const uno::Any* pXFillBmpPosOffsetXItem = 0; GetProperty(XATTR_FILLBMP_POSOFFSETX, 0, pXFillBmpPosOffsetXItem);
267     const uno::Any* pXFillBmpPosOffsetYItem = 0; GetProperty(XATTR_FILLBMP_POSOFFSETY, 0, pXFillBmpPosOffsetYItem);
268     const uno::Any* pXFillBackgroundItem = 0; GetProperty(XATTR_FILLBACKGROUND, 0, pXFillBackgroundItem);
269     const uno::Any* pOwnAttrFillBmpItem = 0; GetProperty(OWN_ATTR_FILLBMP_MODE, 0, pOwnAttrFillBmpItem);
270 
271     const bool bXFillStyleItemUsed(
272         pXFillStyleItem ||
273         pXFillColorItem ||
274         pXFillGradientItem || pXFillGradientNameItem ||
275         pXFillHatchItem || pXFillHatchNameItem ||
276         pXFillBitmapItem || pXFillBitmapNameItem || pXFillBitmapURLItem ||
277         pXFillTransparenceItem ||
278         pXGradientStepCountItem ||
279         pXFillBmpPosItem ||
280         pXFillBmpSizeXItem ||
281         pXFillBmpSizeYItem ||
282         pXFillFloatTransparenceItem || pXFillFloatTransparenceNameItem ||
283         pXSecondaryFillColorItem ||
284         pXFillBmpSizeLogItem ||
285         pXFillBmpTileOffsetXItem ||
286         pXFillBmpTileOffsetYItem ||
287         pXFillBmpPosOffsetXItem ||
288         pXFillBmpPosOffsetYItem ||
289         pXFillBackgroundItem ||
290         pOwnAttrFillBmpItem);
291 
292     // use brush items, but *only* if no FillStyle properties are used; if both are used and when applying both
293     // in the obvious order some attributes may be wrong since they are set by the 1st set, but not
294     // redefined as needed by the 2nd set when they are default (and thus no tset) in the 2nd set. If
295     // it is necessary for any reason to set both (it should not) a in-between step will be needed
296     // that resets the items for FillAttributes in rToSet to default
297     if(bSvxBrushItemPropertiesUsed && !bXFillStyleItemUsed)
298     {
299         //UUUU create a temporary SvxBrushItem, fill the attributes to it and use it to set
300         // the corresponding FillAttributes
301         SvxBrushItem aBrush(RES_BACKGROUND);
302 
303         if(pCol)
304         {
305             bRet &= ((SfxPoolItem&)aBrush).PutValue(*pCol,MID_BACK_COLOR    );
306         }
307 
308         if(pColTrans)
309         {
310             bRet &= ((SfxPoolItem&)aBrush).PutValue(*pColTrans, MID_BACK_COLOR_TRANSPARENCY);
311         }
312 
313         if(pRGBCol)
314         {
315             bRet &= ((SfxPoolItem&)aBrush).PutValue(*pRGBCol, MID_BACK_COLOR_R_G_B);
316         }
317 
318         if(pTrans)
319         {
320             // don't overwrite transparency with a non-transparence flag
321             if(!pColTrans || Any2Bool( *pTrans ))
322                 bRet &= ((SfxPoolItem&)aBrush).PutValue(*pTrans, MID_GRAPHIC_TRANSPARENT);
323         }
324 
325         if(pGrURL)
326         {
327             bRet &= ((SfxPoolItem&)aBrush).PutValue(*pGrURL, MID_GRAPHIC_URL);
328         }
329 
330         if(pGrFilter)
331         {
332             bRet &= ((SfxPoolItem&)aBrush).PutValue(*pGrFilter, MID_GRAPHIC_FILTER);
333         }
334 
335         if(pGrLoc)
336         {
337             bRet &= ((SfxPoolItem&)aBrush).PutValue(*pGrLoc, MID_GRAPHIC_POSITION);
338         }
339 
340         if(pGrTranparency)
341         {
342             bRet &= ((SfxPoolItem&)aBrush).PutValue(*pGrTranparency, MID_GRAPHIC_TRANSPARENCY);
343         }
344 
345         setSvxBrushItemAsFillAttributesToTargetSet(aBrush, rToSet);
346     }
347 
348     if(bXFillStyleItemUsed)
349     {
350         if(pXFillStyleItem)
351         {
352             XFillStyleItem aXFillStyleItem;
353 
354             aXFillStyleItem.PutValue(*pXFillStyleItem);
355             rToSet.Put(aXFillStyleItem);
356         }
357 
358         if(pXFillColorItem)
359         {
360             const XubString aNullStr;
361             const Color aNullCol(COL_DEFAULT_SHAPE_FILLING);
362             XFillColorItem aXFillColorItem(aNullStr, aNullCol);
363 
364             aXFillColorItem.PutValue(*pXFillColorItem);
365             rToSet.Put(aXFillColorItem);
366         }
367 
368         if(pXFillGradientItem || pXFillGradientNameItem)
369         {
370             if(pXFillGradientItem)
371             {
372                 const XGradient aNullGrad(RGB_Color(COL_BLACK), RGB_Color(COL_WHITE));
373                 XFillGradientItem aXFillGradientItem(rToSet.GetPool(), aNullGrad);
374 
375                 aXFillGradientItem.PutValue(*pXFillGradientItem, MID_FILLGRADIENT);
376                 rToSet.Put(aXFillGradientItem);
377             }
378 
379             if(pXFillGradientNameItem)
380             {
381                 OUString aTempName;
382 
383                 if(!(*pXFillGradientNameItem >>= aTempName ))
384                 {
385                     throw lang::IllegalArgumentException();
386                 }
387 
388                 bRet &= SvxShape::SetFillAttribute(XATTR_FILLGRADIENT, aTempName, rToSet);
389             }
390         }
391 
392         if(pXFillHatchItem || pXFillHatchNameItem)
393         {
394             if(pXFillHatchItem)
395             {
396                 const Color aNullCol(COL_DEFAULT_SHAPE_STROKE);
397                 const XHatch aNullHatch(aNullCol);
398                 XFillHatchItem aXFillHatchItem(rToSet.GetPool(), aNullHatch);
399 
400                 aXFillHatchItem.PutValue(*pXFillHatchItem, MID_FILLHATCH);
401                 rToSet.Put(aXFillHatchItem);
402             }
403 
404             if(pXFillHatchNameItem)
405             {
406                 OUString aTempName;
407 
408                 if(!(*pXFillHatchNameItem >>= aTempName ))
409                 {
410                     throw lang::IllegalArgumentException();
411                 }
412 
413                 bRet &= SvxShape::SetFillAttribute(XATTR_FILLHATCH, aTempName, rToSet);
414             }
415         }
416 
417         if(pXFillBitmapItem || pXFillBitmapNameItem || pXFillBitmapURLItem)
418         {
419             if(pXFillBitmapItem)
420             {
421                 const Graphic aNullGraphic;
422                 XFillBitmapItem aXFillBitmapItem(rToSet.GetPool(), aNullGraphic);
423 
424                 aXFillBitmapItem.PutValue(*pXFillBitmapItem, MID_BITMAP);
425                 rToSet.Put(aXFillBitmapItem);
426             }
427 
428             if(pXFillBitmapNameItem)
429             {
430                 OUString aTempName;
431 
432                 if(!(*pXFillBitmapNameItem >>= aTempName ))
433                 {
434                     throw lang::IllegalArgumentException();
435                 }
436 
437                 bRet &= SvxShape::SetFillAttribute(XATTR_FILLBITMAP, aTempName, rToSet);
438             }
439 
440             if(pXFillBitmapURLItem)
441             {
442                 const Graphic aNullGraphic;
443                 XFillBitmapItem aXFillBitmapItem(rToSet.GetPool(), aNullGraphic);
444 
445                 aXFillBitmapItem.PutValue(*pXFillBitmapURLItem, MID_GRAFURL);
446                 rToSet.Put(aXFillBitmapItem);
447             }
448         }
449 
450         if(pXFillTransparenceItem)
451         {
452             const XGradient aNullGrad(RGB_Color(COL_BLACK), RGB_Color(COL_WHITE));
453             XFillTransparenceItem aXFillTransparenceItem;
454 
455             aXFillTransparenceItem.PutValue(*pXFillTransparenceItem);
456             rToSet.Put(aXFillTransparenceItem);
457         }
458 
459         if(pXGradientStepCountItem)
460         {
461             XGradientStepCountItem aXGradientStepCountItem;
462 
463             aXGradientStepCountItem.PutValue(*pXGradientStepCountItem);
464             rToSet.Put(aXGradientStepCountItem);
465         }
466 
467         if(pXFillBmpPosItem)
468         {
469             XFillBmpPosItem aXFillBmpPosItem;
470 
471             aXFillBmpPosItem.PutValue(*pXFillBmpPosItem);
472             rToSet.Put(aXFillBmpPosItem);
473         }
474 
475         if(pXFillBmpSizeXItem)
476         {
477             XFillBmpSizeXItem aXFillBmpSizeXItem;
478 
479             aXFillBmpSizeXItem.PutValue(*pXFillBmpSizeXItem);
480             rToSet.Put(aXFillBmpSizeXItem);
481         }
482 
483         if(pXFillBmpSizeYItem)
484         {
485             XFillBmpSizeYItem aXFillBmpSizeYItem;
486 
487             aXFillBmpSizeYItem.PutValue(*pXFillBmpSizeYItem);
488             rToSet.Put(aXFillBmpSizeYItem);
489         }
490 
491         if(pXFillFloatTransparenceItem || pXFillFloatTransparenceNameItem)
492         {
493             if(pXFillFloatTransparenceItem)
494             {
495                 const XGradient aNullGrad(RGB_Color(COL_BLACK), RGB_Color(COL_WHITE));
496                 XFillFloatTransparenceItem aXFillFloatTransparenceItem(rToSet.GetPool(), aNullGrad, false);
497 
498                 aXFillFloatTransparenceItem.PutValue(*pXFillFloatTransparenceItem, MID_FILLGRADIENT);
499                 rToSet.Put(aXFillFloatTransparenceItem);
500             }
501 
502             if(pXFillFloatTransparenceNameItem)
503             {
504                 OUString aTempName;
505 
506                 if(!(*pXFillFloatTransparenceNameItem >>= aTempName ))
507                 {
508                     throw lang::IllegalArgumentException();
509                 }
510 
511                 bRet &= SvxShape::SetFillAttribute(XATTR_FILLFLOATTRANSPARENCE, aTempName, rToSet);
512             }
513         }
514 
515         if(pXSecondaryFillColorItem)
516         {
517             const XubString aNullStr;
518             const Color aNullCol(COL_DEFAULT_SHAPE_FILLING);
519             XSecondaryFillColorItem aXSecondaryFillColorItem(aNullStr, aNullCol);
520 
521             aXSecondaryFillColorItem.PutValue(*pXSecondaryFillColorItem);
522             rToSet.Put(aXSecondaryFillColorItem);
523         }
524 
525         if(pXFillBmpSizeLogItem)
526         {
527             XFillBmpSizeLogItem aXFillBmpSizeLogItem;
528 
529             aXFillBmpSizeLogItem.PutValue(*pXFillBmpSizeLogItem);
530             rToSet.Put(aXFillBmpSizeLogItem);
531         }
532 
533         if(pXFillBmpTileOffsetXItem)
534         {
535             XFillBmpTileOffsetXItem aXFillBmpTileOffsetXItem;
536 
537             aXFillBmpTileOffsetXItem.PutValue(*pXFillBmpTileOffsetXItem);
538             rToSet.Put(aXFillBmpTileOffsetXItem);
539         }
540 
541         if(pXFillBmpTileOffsetYItem)
542         {
543             XFillBmpTileOffsetYItem aXFillBmpTileOffsetYItem;
544 
545             aXFillBmpTileOffsetYItem.PutValue(*pXFillBmpTileOffsetYItem);
546             rToSet.Put(aXFillBmpTileOffsetYItem);
547         }
548 
549         if(pXFillBmpPosOffsetXItem)
550         {
551             XFillBmpPosOffsetXItem aXFillBmpPosOffsetXItem;
552 
553             aXFillBmpPosOffsetXItem.PutValue(*pXFillBmpPosOffsetXItem);
554             rToSet.Put(aXFillBmpPosOffsetXItem);
555         }
556 
557         if(pXFillBmpPosOffsetYItem)
558         {
559             XFillBmpPosOffsetYItem aXFillBmpPosOffsetYItem;
560 
561             aXFillBmpPosOffsetYItem.PutValue(*pXFillBmpPosOffsetYItem);
562             rToSet.Put(aXFillBmpPosOffsetYItem);
563         }
564 
565         if(pXFillBackgroundItem)
566         {
567             XFillBackgroundItem aXFillBackgroundItem;
568 
569             aXFillBackgroundItem.PutValue(*pXFillBackgroundItem);
570             rToSet.Put(aXFillBackgroundItem);
571         }
572 
573         if(pOwnAttrFillBmpItem)
574         {
575             drawing::BitmapMode eMode;
576 
577             if(!(*pOwnAttrFillBmpItem >>= eMode))
578             {
579                 sal_Int32 nMode = 0;
580 
581                 if(!(*pOwnAttrFillBmpItem >>= nMode))
582                 {
583                     throw lang::IllegalArgumentException();
584                 }
585 
586                 eMode = (drawing::BitmapMode)nMode;
587             }
588 
589             rToSet.Put(XFillBmpStretchItem(drawing::BitmapMode_STRETCH == eMode));
590             rToSet.Put(XFillBmpTileItem(drawing::BitmapMode_REPEAT == eMode));
591         }
592     }
593     {
594         const ::uno::Any* pCont = 0;
595         GetProperty(RES_PROTECT, MID_PROTECT_CONTENT, pCont );
596         const ::uno::Any* pPos = 0;
597         GetProperty(RES_PROTECT,MID_PROTECT_POSITION, pPos );
598         const ::uno::Any* pName = 0;
599         GetProperty(RES_PROTECT, MID_PROTECT_SIZE, pName );
600         if(pCont||pPos||pName)
601         {
602             SvxProtectItem aProt ( static_cast < const :: SvxProtectItem & > ( rFromSet.Get ( RES_PROTECT ) ) );
603             if(pCont)
604                 bRet &= ((SfxPoolItem&)aProt).PutValue(*pCont, MID_PROTECT_CONTENT);
605             if(pPos )
606                 bRet &= ((SfxPoolItem&)aProt).PutValue(*pPos, MID_PROTECT_POSITION);
607             if(pName)
608                 bRet &= ((SfxPoolItem&)aProt).PutValue(*pName, MID_PROTECT_SIZE);
609             rToSet.Put(aProt);
610         }
611     }
612     {
613         const ::uno::Any* pHori  = 0;
614         GetProperty(RES_HORI_ORIENT, MID_HORIORIENT_ORIENT, pHori );
615         const ::uno::Any* pHoriP = 0;
616         GetProperty(RES_HORI_ORIENT, MID_HORIORIENT_POSITION|CONVERT_TWIPS, pHoriP );
617         const ::uno::Any* pHoriR = 0;
618         GetProperty(RES_HORI_ORIENT, MID_HORIORIENT_RELATION, pHoriR );
619         const ::uno::Any* pPageT = 0;
620         GetProperty(RES_HORI_ORIENT, MID_HORIORIENT_PAGETOGGLE, pPageT);
621         if(pHori||pHoriP||pHoriR||pPageT)
622         {
623             SwFmtHoriOrient aOrient ( static_cast < const :: SwFmtHoriOrient & > ( rFromSet.Get ( RES_HORI_ORIENT ) ) );
624             if(pHori )
625                 bRet &= ((SfxPoolItem&)aOrient).PutValue(*pHori, MID_HORIORIENT_ORIENT);
626             if(pHoriP)
627                 bRet &= ((SfxPoolItem&)aOrient).PutValue(*pHoriP, MID_HORIORIENT_POSITION|CONVERT_TWIPS);
628             if(pHoriR)
629                 bRet &= ((SfxPoolItem&)aOrient).PutValue(*pHoriR, MID_HORIORIENT_RELATION);
630             if(pPageT)
631                 bRet &= ((SfxPoolItem&)aOrient).PutValue(*pPageT, MID_HORIORIENT_PAGETOGGLE);
632             rToSet.Put(aOrient);
633         }
634     }
635 
636     {
637         const ::uno::Any* pVert  = 0;
638         GetProperty(RES_VERT_ORIENT, MID_VERTORIENT_ORIENT, pVert);
639         const ::uno::Any* pVertP = 0;
640         GetProperty(RES_VERT_ORIENT, MID_VERTORIENT_POSITION|CONVERT_TWIPS, pVertP );
641         const ::uno::Any* pVertR = 0;
642         GetProperty(RES_VERT_ORIENT, MID_VERTORIENT_RELATION, pVertR );
643         if(pVert||pVertP||pVertR)
644         {
645             SwFmtVertOrient aOrient ( static_cast < const :: SwFmtVertOrient & > ( rFromSet.Get ( RES_VERT_ORIENT ) ) );
646             if(pVert )
647                 bRet &= ((SfxPoolItem&)aOrient).PutValue(*pVert, MID_VERTORIENT_ORIENT);
648             if(pVertP)
649                 bRet &= ((SfxPoolItem&)aOrient).PutValue(*pVertP, MID_VERTORIENT_POSITION|CONVERT_TWIPS);
650             if(pVertR)
651                 bRet &= ((SfxPoolItem&)aOrient).PutValue(*pVertR, MID_VERTORIENT_RELATION);
652             rToSet.Put(aOrient);
653         }
654     }
655     {
656         const ::uno::Any* pURL = 0;
657         GetProperty(RES_URL, MID_URL_URL, pURL );
658         const ::uno::Any* pTarget = 0;
659         GetProperty(RES_URL, MID_URL_TARGET, pTarget );
660         const ::uno::Any* pHyLNm = 0;
661         GetProperty(RES_URL, MID_URL_HYPERLINKNAME, pHyLNm );
662         const ::uno::Any* pHySMp = 0;
663         GetProperty(RES_URL, MID_URL_SERVERMAP, pHySMp );
664         if(pURL||pTarget||pHyLNm||pHySMp)
665         {
666             SwFmtURL aURL ( static_cast < const :: SwFmtURL & > ( rFromSet.Get ( RES_URL ) ) );
667             if(pURL)
668                 bRet &= ((SfxPoolItem&)aURL).PutValue(*pURL, MID_URL_URL);
669             if(pTarget)
670                 bRet &= ((SfxPoolItem&)aURL).PutValue(*pTarget, MID_URL_TARGET);
671             if(pHyLNm)
672                 bRet &= ((SfxPoolItem&)aURL).PutValue(*pHyLNm, MID_URL_HYPERLINKNAME  );
673             if(pHySMp)
674                 bRet &= ((SfxPoolItem&)aURL).PutValue(*pHySMp, MID_URL_SERVERMAP);
675             rToSet.Put(aURL);
676         }
677     }
678     const ::uno::Any* pL = 0;
679     GetProperty(RES_LR_SPACE, MID_L_MARGIN|CONVERT_TWIPS, pL );
680     const ::uno::Any* pR = 0;
681     GetProperty(RES_LR_SPACE, MID_R_MARGIN|CONVERT_TWIPS, pR );
682     if(pL||pR)
683     {
684         SvxLRSpaceItem aLR ( static_cast < const :: SvxLRSpaceItem & > ( rFromSet.Get ( RES_LR_SPACE ) ) );
685         if(pL)
686             bRet &= ((SfxPoolItem&)aLR).PutValue(*pL, MID_L_MARGIN|CONVERT_TWIPS);
687         if(pR)
688             bRet &= ((SfxPoolItem&)aLR).PutValue(*pR, MID_R_MARGIN|CONVERT_TWIPS);
689         rToSet.Put(aLR);
690     }
691     const ::uno::Any* pT = 0;
692     GetProperty(RES_UL_SPACE, MID_UP_MARGIN|CONVERT_TWIPS, pT );
693     const ::uno::Any* pB = 0;
694     GetProperty(RES_UL_SPACE, MID_LO_MARGIN|CONVERT_TWIPS, pB );
695     if(pT||pB)
696     {
697         SvxULSpaceItem aTB ( static_cast < const :: SvxULSpaceItem &> ( rFromSet.Get ( RES_UL_SPACE ) ) );
698         if(pT)
699             bRet &= ((SfxPoolItem&)aTB).PutValue(*pT, MID_UP_MARGIN|CONVERT_TWIPS);
700         if(pB)
701             bRet &= ((SfxPoolItem&)aTB).PutValue(*pB, MID_LO_MARGIN|CONVERT_TWIPS);
702         rToSet.Put(aTB);
703     }
704     const ::uno::Any* pOp;
705     if(GetProperty(RES_OPAQUE, 0, pOp))
706     {
707         SvxOpaqueItem aOp ( static_cast < const :: SvxOpaqueItem& > ( rFromSet.Get ( RES_OPAQUE ) ) );
708         bRet &= ((SfxPoolItem&)aOp).PutValue(*pOp, 0);
709         rToSet.Put(aOp);
710     }
711     const ::uno::Any* pPrt;
712     if(GetProperty(RES_PRINT, 0, pPrt))
713     {
714         SvxPrintItem aPrt ( static_cast < const :: SvxPrintItem & > ( rFromSet.Get ( RES_PRINT ) ) );
715         bRet &= ((SfxPoolItem&)aPrt).PutValue(*pPrt, 0);
716         rToSet.Put(aPrt);
717     }
718     const ::uno::Any* pSh;
719     if(GetProperty(RES_SHADOW, CONVERT_TWIPS, pSh))
720     {
721         SvxShadowItem aSh ( static_cast < const :: SvxShadowItem& > ( rFromSet.Get ( RES_SHADOW ) ) );
722         bRet &= ((SfxPoolItem&)aSh).PutValue(*pSh, CONVERT_TWIPS);
723         rToSet.Put(aSh);
724     }
725     const ::uno::Any* pSur      = 0;
726     GetProperty(RES_SURROUND, MID_SURROUND_SURROUNDTYPE, pSur);
727     const ::uno::Any* pSurAnch = 0;
728     GetProperty(RES_SURROUND, MID_SURROUND_ANCHORONLY, pSurAnch);
729     if(pSur || pSurAnch)
730     {
731         SwFmtSurround aSrnd ( static_cast < const :: SwFmtSurround & > ( rFromSet.Get ( RES_SURROUND ) ) );
732         if(pSur)
733             bRet &= ((SfxPoolItem&)aSrnd).PutValue(*pSur, MID_SURROUND_SURROUNDTYPE );
734         if(pSurAnch)
735             bRet &= ((SfxPoolItem&)aSrnd).PutValue(*pSurAnch, MID_SURROUND_ANCHORONLY);
736         rToSet.Put(aSrnd);
737     }
738     const ::uno::Any* pLeft        = 0;
739     GetProperty(RES_BOX, LEFT_BORDER  |CONVERT_TWIPS,    pLeft  );
740     const ::uno::Any* pRight       = 0;
741     GetProperty(RES_BOX, CONVERT_TWIPS|RIGHT_BORDER ,    pRight );
742     const ::uno::Any* pTop         = 0;
743     GetProperty(RES_BOX, CONVERT_TWIPS|TOP_BORDER     , pTop   );
744     const ::uno::Any* pBottom  = 0;
745     GetProperty(RES_BOX, CONVERT_TWIPS|BOTTOM_BORDER,    pBottom);
746     const ::uno::Any* pDistance    = 0;
747     GetProperty(RES_BOX, CONVERT_TWIPS|BORDER_DISTANCE,  pDistance);
748     const ::uno::Any* pLeftDistance    = 0;
749     GetProperty(RES_BOX, CONVERT_TWIPS|LEFT_BORDER_DISTANCE, pLeftDistance);
750     const ::uno::Any* pRightDistance   = 0;
751     GetProperty(RES_BOX, CONVERT_TWIPS|RIGHT_BORDER_DISTANCE,    pRightDistance);
752     const ::uno::Any* pTopDistance     = 0;
753     GetProperty(RES_BOX, CONVERT_TWIPS|TOP_BORDER_DISTANCE,  pTopDistance);
754     const ::uno::Any* pBottomDistance  = 0;
755     GetProperty(RES_BOX, CONVERT_TWIPS|BOTTOM_BORDER_DISTANCE,   pBottomDistance);
756     if( pLeft || pRight || pTop ||  pBottom || pDistance ||
757         pLeftDistance  || pRightDistance || pTopDistance || pBottomDistance )
758     {
759         SvxBoxItem aBox ( static_cast < const :: SvxBoxItem & > ( rFromSet.Get ( RES_BOX ) ) );
760         if( pLeft )
761             bRet &= ((SfxPoolItem&)aBox).PutValue(*pLeft, CONVERT_TWIPS|LEFT_BORDER );
762         if( pRight )
763             bRet &= ((SfxPoolItem&)aBox).PutValue(*pRight, CONVERT_TWIPS|RIGHT_BORDER );
764         if( pTop )
765             bRet &= ((SfxPoolItem&)aBox).PutValue(*pTop, CONVERT_TWIPS|TOP_BORDER);
766         if( pBottom )
767             bRet &= ((SfxPoolItem&)aBox).PutValue(*pBottom, CONVERT_TWIPS|BOTTOM_BORDER);
768         if( pDistance )
769             bRet &= ((SfxPoolItem&)aBox).PutValue(*pDistance, CONVERT_TWIPS|BORDER_DISTANCE);
770         if( pLeftDistance )
771             bRet &= ((SfxPoolItem&)aBox).PutValue(*pLeftDistance, CONVERT_TWIPS|LEFT_BORDER_DISTANCE);
772         if( pRightDistance )
773             bRet &= ((SfxPoolItem&)aBox).PutValue(*pRightDistance, CONVERT_TWIPS|RIGHT_BORDER_DISTANCE);
774         if( pTopDistance )
775             bRet &= ((SfxPoolItem&)aBox).PutValue(*pTopDistance, CONVERT_TWIPS|TOP_BORDER_DISTANCE);
776         if( pBottomDistance )
777             bRet &= ((SfxPoolItem&)aBox).PutValue(*pBottomDistance, CONVERT_TWIPS|BOTTOM_BORDER_DISTANCE);
778         rToSet.Put(aBox);
779     }
780     {
781         const ::uno::Any* pRelH = 0;
782         GetProperty(RES_FRM_SIZE, MID_FRMSIZE_REL_HEIGHT, pRelH);
783         const ::uno::Any* pRelW = 0;
784         GetProperty(RES_FRM_SIZE, MID_FRMSIZE_REL_WIDTH, pRelW);
785         const ::uno::Any* pSyncWidth = 0;
786         GetProperty(RES_FRM_SIZE, MID_FRMSIZE_IS_SYNC_WIDTH_TO_HEIGHT, pSyncWidth);
787         const ::uno::Any* pSyncHeight = 0;
788         GetProperty(RES_FRM_SIZE, MID_FRMSIZE_IS_SYNC_HEIGHT_TO_WIDTH, pSyncHeight);
789         const ::uno::Any* pWidth = 0;
790         GetProperty(RES_FRM_SIZE, MID_FRMSIZE_WIDTH|CONVERT_TWIPS, pWidth);
791         const ::uno::Any* pHeight = 0;
792         GetProperty(RES_FRM_SIZE, MID_FRMSIZE_HEIGHT|CONVERT_TWIPS, pHeight);
793         const ::uno::Any* pSize = 0;
794         GetProperty(RES_FRM_SIZE, MID_FRMSIZE_SIZE|CONVERT_TWIPS, pSize);
795         const ::uno::Any* pSizeType = 0;
796         GetProperty(RES_FRM_SIZE, MID_FRMSIZE_SIZE_TYPE, pSizeType);
797         const ::uno::Any* pWidthType = 0;
798         GetProperty(RES_FRM_SIZE, MID_FRMSIZE_WIDTH_TYPE, pWidthType);
799         if( pWidth || pHeight ||pRelH || pRelW || pSize ||pSizeType ||
800             pWidthType ||pSyncWidth || pSyncHeight )
801         {
802             rSizeFound = sal_True;
803             SwFmtFrmSize aFrmSz ( static_cast < const :: SwFmtFrmSize& > ( rFromSet.Get ( RES_FRM_SIZE ) ) );
804             if(pWidth)
805                 bRet &= ((SfxPoolItem&)aFrmSz).PutValue(*pWidth, MID_FRMSIZE_WIDTH|CONVERT_TWIPS);
806             if(pHeight)
807                 bRet &= ((SfxPoolItem&)aFrmSz).PutValue(*pHeight, MID_FRMSIZE_HEIGHT|CONVERT_TWIPS);
808             if(pRelH )
809                 bRet &= ((SfxPoolItem&)aFrmSz).PutValue(*pRelH, MID_FRMSIZE_REL_HEIGHT);
810             if(pRelW )
811                 bRet &= ((SfxPoolItem&)aFrmSz).PutValue(*pRelW, MID_FRMSIZE_REL_WIDTH);
812             if(pSyncWidth)
813                 bRet &= ((SfxPoolItem&)aFrmSz).PutValue(*pSyncWidth, MID_FRMSIZE_IS_SYNC_WIDTH_TO_HEIGHT);
814             if(pSyncHeight)
815                 bRet &= ((SfxPoolItem&)aFrmSz).PutValue(*pSyncHeight, MID_FRMSIZE_IS_SYNC_HEIGHT_TO_WIDTH);
816             if(pSize)
817                 bRet &= ((SfxPoolItem&)aFrmSz).PutValue(*pSize, MID_FRMSIZE_SIZE|CONVERT_TWIPS);
818             if(pSizeType)
819                 bRet &= ((SfxPoolItem&)aFrmSz).PutValue(*pSizeType, MID_FRMSIZE_SIZE_TYPE);
820             if(pWidthType)
821                 bRet &= ((SfxPoolItem&)aFrmSz).PutValue(*pWidthType, MID_FRMSIZE_WIDTH_TYPE);
822             if(!aFrmSz.GetWidth())
823                 aFrmSz.SetWidth(MINFLY);
824             if(!aFrmSz.GetHeight())
825                 aFrmSz.SetHeight(MINFLY);
826             rToSet.Put(aFrmSz);
827         }
828         else
829         {
830             rSizeFound = sal_False;
831             SwFmtFrmSize aFrmSz;
832             awt::Size aSize;
833             aSize.Width = 2 * MM50;
834             aSize.Height = 2 * MM50;
835             ::uno::Any aSizeVal;
836             aSizeVal <<= aSize;
837             ((SfxPoolItem&)aFrmSz).PutValue(aSizeVal, MID_FRMSIZE_SIZE|CONVERT_TWIPS);
838             rToSet.Put(aFrmSz);
839         }
840     }
841     const ::uno::Any* pFrameDirection = 0;
842     GetProperty(RES_FRAMEDIR, 0, pFrameDirection);
843     if(pFrameDirection)
844     {
845         SvxFrameDirectionItem aAttr(FRMDIR_HORI_LEFT_TOP, RES_FRAMEDIR);
846         aAttr.PutValue(*pFrameDirection, 0);
847         rToSet.Put(aAttr);
848     }
849     const ::uno::Any* pUnknown = 0;
850     GetProperty(RES_UNKNOWNATR_CONTAINER, 0, pUnknown);
851     if(pUnknown)
852     {
853         SvXMLAttrContainerItem aAttr(RES_UNKNOWNATR_CONTAINER);
854         aAttr.PutValue(*pUnknown, 0);
855         rToSet.Put(aAttr);
856     }
857 
858     // DVO, OD 01.10.2003 #i18732#
859     const ::uno::Any* pFollowTextFlow = 0;
860     GetProperty(RES_FOLLOW_TEXT_FLOW, 0, pFollowTextFlow);
861     if ( pFollowTextFlow )
862     {
863         SwFmtFollowTextFlow aFmtFollowTextFlow;
864         aFmtFollowTextFlow.PutValue(*pFollowTextFlow, 0);
865         rToSet.Put(aFmtFollowTextFlow);
866     }
867     //Begin Bug 119922
868     else if ( bOasis )
869         rToSet.Put( SwFmtFollowTextFlow() );
870     //End Bug 119922
871 
872     // OD 2004-05-04 #i28701# - RES_WRAP_INFLUENCE_ON_OBJPOS
873     const ::uno::Any* pWrapInfluenceOnObjPos = 0;
874     GetProperty(RES_WRAP_INFLUENCE_ON_OBJPOS, MID_WRAP_INFLUENCE, pWrapInfluenceOnObjPos);
875     if ( pWrapInfluenceOnObjPos )
876     {
877         SwFmtWrapInfluenceOnObjPos aFmtWrapInfluenceOnObjPos;
878         aFmtWrapInfluenceOnObjPos.PutValue( *pWrapInfluenceOnObjPos, MID_WRAP_INFLUENCE );
879         rToSet.Put(aFmtWrapInfluenceOnObjPos);
880     }
881 
882     return bRet;
883 }
884 
885 class SwFrameProperties_Impl : public BaseFrameProperties_Impl
886 {
887 public:
888     SwFrameProperties_Impl();
889     virtual ~SwFrameProperties_Impl(){}
890 
891     virtual sal_Bool        AnyToItemSet( SwDoc* pDoc, SfxItemSet& rFrmSet, SfxItemSet& rSet, sal_Bool& rSizeFound);
892 };
893 
894 SwFrameProperties_Impl::SwFrameProperties_Impl():
895     BaseFrameProperties_Impl(/*aSwMapProvider.GetPropertyMap(PROPERTY_MAP_TEXT_FRAME)*/ )
896 {
897 }
898 
899 inline void lcl_FillCol ( SfxItemSet &rToSet, const :: SfxItemSet &rFromSet, const :: uno::Any *pAny)
900 {
901     if ( pAny )
902     {
903         SwFmtCol aCol ( static_cast < const :: SwFmtCol & > ( rFromSet.Get ( RES_COL ) ) );
904         ((SfxPoolItem&)aCol).PutValue( *pAny, MID_COLUMNS);
905         rToSet.Put(aCol);
906     }
907 }
908 sal_Bool    SwFrameProperties_Impl::AnyToItemSet(SwDoc *pDoc, SfxItemSet& rSet, SfxItemSet&, sal_Bool& rSizeFound)
909 {
910     //Properties fuer alle Frames
911     const ::uno::Any *pStyleName;
912     SwDocStyleSheet* pStyle = NULL;
913     sal_Bool bRet;
914 
915     if ( GetProperty ( FN_UNO_FRAME_STYLE_NAME, 0, pStyleName ) )
916     {
917         OUString sStyle;
918         *pStyleName >>= sStyle;
919         pStyle = (SwDocStyleSheet*)pDoc->GetDocShell()->GetStyleSheetPool()->Find(sStyle,
920                                                     SFX_STYLE_FAMILY_FRAME);
921     }
922 
923     const ::uno::Any* pColumns = NULL;
924     GetProperty (RES_COL, MID_COLUMNS, pColumns);
925     if ( pStyle )
926     {
927         rtl::Reference< SwDocStyleSheet > xStyle( new SwDocStyleSheet( *pStyle ) );
928         const :: SfxItemSet *pItemSet = &xStyle->GetItemSet();
929         bRet = FillBaseProperties( rSet, *pItemSet, rSizeFound );
930         lcl_FillCol ( rSet, *pItemSet, pColumns );
931     }
932     else
933     {
934         const :: SfxItemSet *pItemSet = &pDoc->GetFrmFmtFromPool( RES_POOLFRM_FRAME )->GetAttrSet();
935         bRet = FillBaseProperties( rSet, *pItemSet, rSizeFound );
936         lcl_FillCol ( rSet, *pItemSet, pColumns );
937     }
938     const ::uno::Any* pEdit;
939     if(GetProperty(RES_EDIT_IN_READONLY, 0, pEdit))
940     {
941         SfxBoolItem aBool(RES_EDIT_IN_READONLY);
942         ((SfxPoolItem&)aBool).PutValue(*pEdit, 0);
943         rSet.Put(aBool);
944     }
945     return bRet;
946 }
947 /****************************************************************************
948     Grafik-Descriptor
949 ****************************************************************************/
950 class SwGraphicProperties_Impl : public BaseFrameProperties_Impl
951 {
952 public:
953     SwGraphicProperties_Impl();
954     virtual ~SwGraphicProperties_Impl(){}
955 
956     virtual sal_Bool                AnyToItemSet( SwDoc* pDoc, SfxItemSet& rFrmSet, SfxItemSet& rSet, sal_Bool& rSizeFound);
957 };
958 
959 SwGraphicProperties_Impl::SwGraphicProperties_Impl( ) :
960     BaseFrameProperties_Impl(/*aSwMapProvider.GetPropertyMap(PROPERTY_MAP_TEXT_GRAPHIC)*/ )
961 {
962 }
963 
964 
965 inline void lcl_FillMirror ( SfxItemSet &rToSet, const :: SfxItemSet &rFromSet, const ::uno::Any *pHEvenMirror, const ::uno::Any *pHOddMirror, const ::uno::Any *pVMirror, sal_Bool &rRet )
966 {
967     if(pHEvenMirror || pHOddMirror || pVMirror )
968     {
969         SwMirrorGrf aMirror ( static_cast < const :: SwMirrorGrf& > ( rFromSet.Get ( RES_GRFATR_MIRRORGRF ) ) );
970         if(pHEvenMirror)
971             rRet &= ((SfxPoolItem&)aMirror).PutValue(*pHEvenMirror, MID_MIRROR_HORZ_EVEN_PAGES);
972         if(pHOddMirror)
973             rRet &= ((SfxPoolItem&)aMirror).PutValue(*pHOddMirror, MID_MIRROR_HORZ_ODD_PAGES);
974         if(pVMirror)
975             rRet &= ((SfxPoolItem&)aMirror).PutValue(*pVMirror, MID_MIRROR_VERT);
976         rToSet.Put(aMirror);
977     }
978 }
979 
980 sal_Bool    SwGraphicProperties_Impl::AnyToItemSet(
981             SwDoc* pDoc,
982             SfxItemSet& rFrmSet,
983             SfxItemSet& rGrSet,
984             sal_Bool& rSizeFound)
985 {
986     //Properties fuer alle Frames
987     sal_Bool bRet;
988     const ::uno::Any *pStyleName;
989     SwDocStyleSheet* pStyle = NULL;
990 
991     if ( GetProperty ( FN_UNO_FRAME_STYLE_NAME, 0, pStyleName ) )
992     {
993         OUString sStyle;
994         *pStyleName >>= sStyle;
995         pStyle = (SwDocStyleSheet*)pDoc->GetDocShell()->GetStyleSheetPool()->Find(sStyle,
996                                                     SFX_STYLE_FAMILY_FRAME);
997     }
998 
999     const ::uno::Any* pHEvenMirror = 0;
1000     const ::uno::Any* pHOddMirror = 0;
1001     const ::uno::Any* pVMirror = 0;
1002     GetProperty(RES_GRFATR_MIRRORGRF, MID_MIRROR_HORZ_EVEN_PAGES, pHEvenMirror);
1003     GetProperty(RES_GRFATR_MIRRORGRF, MID_MIRROR_HORZ_ODD_PAGES, pHOddMirror);
1004     GetProperty(RES_GRFATR_MIRRORGRF, MID_MIRROR_VERT, pVMirror);
1005 
1006     if ( pStyle )
1007     {
1008         rtl::Reference< SwDocStyleSheet > xStyle( new SwDocStyleSheet(*pStyle) );
1009         const :: SfxItemSet *pItemSet = &xStyle->GetItemSet();
1010         //Begin Bug 119922
1011         sal_Bool bOasis = sal_False;
1012         {
1013             const SfxMedium* pMedium = pDoc->GetDocShell()->GetMedium();
1014             const SfxFilter * pFilter = pMedium
1015                 ? pMedium->GetFilter()
1016                 : NULL;
1017             if ( pMedium && pFilter )
1018             {
1019                 bOasis = pFilter->GetVersion() > SOFFICE_FILEFORMAT_60;
1020             }
1021         }
1022         bRet = FillBaseProperties( rFrmSet, *pItemSet, rSizeFound, bOasis );
1023         //End Bug 119922
1024         lcl_FillMirror ( rGrSet, *pItemSet, pHEvenMirror, pHOddMirror, pVMirror, bRet );
1025     }
1026     else
1027     {
1028         const :: SfxItemSet *pItemSet = &pDoc->GetFrmFmtFromPool( RES_POOLFRM_GRAPHIC )->GetAttrSet();
1029         bRet = FillBaseProperties(rFrmSet, *pItemSet, rSizeFound);
1030         lcl_FillMirror ( rGrSet, *pItemSet, pHEvenMirror, pHOddMirror, pVMirror, bRet );
1031     }
1032 
1033 
1034     static const :: sal_uInt16 nIDs[] =
1035     {
1036         RES_GRFATR_CROPGRF,
1037         RES_GRFATR_ROTATION,
1038         RES_GRFATR_LUMINANCE,
1039         RES_GRFATR_CONTRAST,
1040         RES_GRFATR_CHANNELR,
1041         RES_GRFATR_CHANNELG,
1042         RES_GRFATR_CHANNELB,
1043         RES_GRFATR_GAMMA,
1044         RES_GRFATR_INVERT,
1045         RES_GRFATR_TRANSPARENCY,
1046         RES_GRFATR_DRAWMODE,
1047         0
1048     };
1049     const ::uno::Any* pAny;
1050     for(sal_Int16 nIndex = 0; nIDs[nIndex]; nIndex++)
1051     {
1052         sal_uInt8 nMId = RES_GRFATR_CROPGRF == nIDs[nIndex] ? CONVERT_TWIPS : 0;
1053         if(GetProperty(nIDs[nIndex], nMId, pAny ))
1054         {
1055             SfxPoolItem* pItem = ::GetDfltAttr( nIDs[nIndex] )->Clone();
1056             bRet &= pItem->PutValue(*pAny, nMId );
1057             rGrSet.Put(*pItem);
1058             delete pItem;
1059         }
1060     }
1061 
1062     return bRet;
1063 }
1064 
1065 class SwOLEProperties_Impl : public SwFrameProperties_Impl
1066 {
1067 public:
1068     SwOLEProperties_Impl() :
1069         SwFrameProperties_Impl(/*aSwMapProvider.GetPropertyMap(PROPERTY_MAP_EMBEDDED_OBJECT)*/ ){}
1070     virtual ~SwOLEProperties_Impl(){}
1071 
1072     virtual sal_Bool        AnyToItemSet( SwDoc* pDoc, SfxItemSet& rFrmSet, SfxItemSet& rSet, sal_Bool& rSizeFound);
1073 };
1074 
1075 sal_Bool  SwOLEProperties_Impl::AnyToItemSet(
1076         SwDoc* pDoc, SfxItemSet& rFrmSet, SfxItemSet& rSet, sal_Bool& rSizeFound)
1077 {
1078     const ::uno::Any* pTemp;
1079     if(!GetProperty(FN_UNO_CLSID, 0, pTemp) && !GetProperty(FN_UNO_STREAM_NAME, 0, pTemp) )
1080         return sal_False;
1081     SwFrameProperties_Impl::AnyToItemSet( pDoc, rFrmSet, rSet, rSizeFound);
1082     //
1083     return sal_True;
1084 }
1085 
1086 /******************************************************************
1087  *  SwXFrame
1088  ******************************************************************/
1089 
1090 const :: uno::Sequence< sal_Int8 > & SwXFrame::getUnoTunnelId()
1091 {
1092     static uno::Sequence< sal_Int8 > aSeq = ::CreateUnoTunnelId();
1093     return aSeq;
1094 }
1095 
1096 sal_Int64 SAL_CALL SwXFrame::getSomething( const :: uno::Sequence< sal_Int8 >& rId )
1097     throw(uno::RuntimeException)
1098 {
1099     if( rId.getLength() == 16
1100         && 0 == rtl_compareMemory( getUnoTunnelId().getConstArray(),
1101                                         rId.getConstArray(), 16 ) )
1102     {
1103         return sal::static_int_cast< sal_Int64 >( reinterpret_cast< sal_IntPtr >(this) );
1104     }
1105     return 0;
1106 }
1107 
1108 TYPEINIT1(SwXFrame, SwClient);
1109 
1110 OUString SwXFrame::getImplementationName(void) throw( uno::RuntimeException )
1111 {
1112     return C2U("SwXFrame");
1113 }
1114 
1115 sal_Bool SwXFrame::supportsService(const :: OUString& rServiceName) throw( uno::RuntimeException )
1116 {
1117     return !rServiceName.compareToAscii("com.sun.star.text.BaseFrame")||
1118                 !rServiceName.compareToAscii("com.sun.star.text.TextContent") ||
1119                     !rServiceName.compareToAscii("com.sun.star.document.LinkTarget");
1120 }
1121 
1122 uno::Sequence< OUString > SwXFrame::getSupportedServiceNames(void) throw( uno::RuntimeException )
1123 {
1124     uno::Sequence< OUString > aRet(3);
1125     OUString* pArray = aRet.getArray();
1126     pArray[0] = C2U("com.sun.star.text.BaseFrame");
1127     pArray[1] = C2U("com.sun.star.text.TextContent");
1128     pArray[2] = C2U("com.sun.star.document.LinkTarget");
1129     return aRet;
1130 }
1131 
1132 
1133 SwXFrame::SwXFrame(FlyCntType eSet, const :: SfxItemPropertySet* pSet, SwDoc *pDoc) :
1134     aLstnrCntnr( (container::XNamed*)this),
1135     m_pPropSet(pSet),
1136     m_pDoc ( pDoc ),
1137     eType(eSet),
1138     bIsDescriptor(sal_True),
1139     m_pCopySource( 0 )
1140 {
1141     // Register ourselves as a listener to the document (via the page descriptor)
1142     pDoc->GetPageDescFromPool(RES_POOLPAGE_STANDARD)->Add(this);
1143     // get the property set for the default style data
1144     // First get the model
1145     uno::Reference < XModel > xModel = pDoc->GetDocShell()->GetBaseModel();
1146     // Ask the model for it's family supplier interface
1147     uno::Reference < XStyleFamiliesSupplier > xFamilySupplier ( xModel, uno::UNO_QUERY );
1148     // Get the style families
1149     uno::Reference < XNameAccess > xFamilies = xFamilySupplier->getStyleFamilies();
1150     // Get the Frame family (and keep it for later)
1151     const ::uno::Any aAny = xFamilies->getByName ( OUString ( RTL_CONSTASCII_USTRINGPARAM ( "FrameStyles" ) ) );
1152     aAny >>= mxStyleFamily;
1153     // In the derived class, we'll ask mxStyleFamily for the relevant default style
1154     // mxStyleFamily is initialised in the SwXFrame constructor
1155     switch(eType)
1156     {
1157         case FLYCNTTYPE_FRM:
1158         {
1159             uno::Any aAny2 = mxStyleFamily->getByName ( OUString ( RTL_CONSTASCII_USTRINGPARAM ( "Frame" ) ) );
1160             aAny2 >>= mxStyleData;
1161             pProps = new SwFrameProperties_Impl( );
1162         }
1163         break;
1164         case FLYCNTTYPE_GRF:
1165         {
1166             uno::Any aAny2 = mxStyleFamily->getByName ( OUString ( RTL_CONSTASCII_USTRINGPARAM ( "Graphics" ) ) );
1167             aAny2 >>= mxStyleData;
1168             pProps = new SwGraphicProperties_Impl( );
1169         }
1170         break;
1171         case FLYCNTTYPE_OLE:
1172         {
1173             uno::Any aAny2 = mxStyleFamily->getByName ( OUString ( RTL_CONSTASCII_USTRINGPARAM ( "OLE" ) ) );
1174             aAny2 >>= mxStyleData;
1175             pProps = new SwOLEProperties_Impl( );
1176         }
1177         break;
1178 
1179         default:
1180             ;
1181     }
1182 }
1183 
1184 
1185 SwXFrame::SwXFrame(SwFrmFmt& rFrmFmt, FlyCntType eSet, const :: SfxItemPropertySet* pSet) :
1186     SwClient( &rFrmFmt ),
1187     aLstnrCntnr( (container::XNamed*)this),
1188     m_pPropSet(pSet),
1189     m_pDoc( 0 ),
1190     eType(eSet),
1191     pProps(0),
1192     bIsDescriptor(sal_False),
1193     m_pCopySource(0)
1194 {
1195 
1196 }
1197 
1198 SwXFrame::~SwXFrame()
1199 {
1200     delete m_pCopySource;
1201     delete pProps;
1202 }
1203 
1204 OUString SwXFrame::getName(void) throw( uno::RuntimeException )
1205 {
1206     vos::OGuard aGuard(Application::GetSolarMutex());
1207     String sRet;
1208     SwFrmFmt* pFmt = GetFrmFmt();
1209     if(pFmt)
1210         sRet = pFmt->GetName();
1211     else if(bIsDescriptor)
1212         sRet = sName;
1213     else
1214         throw uno::RuntimeException();
1215     return sRet;
1216 }
1217 
1218 void SwXFrame::setName(const :: OUString& rName) throw( uno::RuntimeException )
1219 {
1220     vos::OGuard aGuard(Application::GetSolarMutex());
1221     SwFrmFmt* pFmt = GetFrmFmt();
1222     String sTmpName(rName);
1223     if(pFmt)
1224     {
1225         pFmt->GetDoc()->SetFlyName((SwFlyFrmFmt&)*pFmt, sTmpName);
1226         if(pFmt->GetName() != sTmpName)
1227         {
1228             throw uno::RuntimeException();
1229         }
1230     }
1231     else if(bIsDescriptor)
1232         sName = sTmpName;
1233     else
1234         throw uno::RuntimeException();
1235 }
1236 
1237 uno::Reference< beans::XPropertySetInfo >  SwXFrame::getPropertySetInfo(void) throw( uno::RuntimeException )
1238 {
1239     uno::Reference< beans::XPropertySetInfo >  xRef;
1240     static uno::Reference< beans::XPropertySetInfo >  xFrmRef;
1241     static uno::Reference< beans::XPropertySetInfo >  xGrfRef;
1242     static uno::Reference< beans::XPropertySetInfo >  xOLERef;
1243     switch(eType)
1244     {
1245     case FLYCNTTYPE_FRM:
1246         if( !xFrmRef.is() )
1247             xFrmRef = m_pPropSet->getPropertySetInfo();
1248         xRef = xFrmRef;
1249         break;
1250     case FLYCNTTYPE_GRF:
1251         if( !xGrfRef.is() )
1252             xGrfRef = m_pPropSet->getPropertySetInfo();
1253         xRef = xGrfRef;
1254         break;
1255     case FLYCNTTYPE_OLE:
1256         if( !xOLERef.is() )
1257             xOLERef = m_pPropSet->getPropertySetInfo();
1258         xRef = xOLERef;
1259         break;
1260     default:
1261         ;
1262     }
1263     return xRef;
1264 }
1265 
1266 void SwXFrame::SetSelection(SwPaM& rCopySource)
1267 {
1268     if(m_pCopySource)
1269         delete m_pCopySource;
1270     m_pCopySource = new SwPaM( *rCopySource.Start() );
1271     m_pCopySource->SetMark();
1272     *m_pCopySource->GetMark() = *rCopySource.End();
1273 }
1274 
1275 SdrObject *SwXFrame::GetOrCreateSdrObject( SwFlyFrmFmt *pFmt )
1276 {
1277     SdrObject* pObject = pFmt->FindSdrObject();
1278     if( !pObject )
1279     {
1280         SwDoc *pDoc = pFmt->GetDoc();
1281         // --> OD 2005-08-08 #i52858# - method name changed
1282         SdrModel *pDrawModel = pDoc->GetOrCreateDrawModel();
1283         // <--
1284         SwFlyDrawContact* pContactObject
1285                     = new SwFlyDrawContact( pFmt, pDrawModel );
1286         pObject = pContactObject->GetMaster();
1287 
1288         const :: SwFmtSurround& rSurround = pFmt->GetSurround();
1289         pObject->SetLayer(
1290             ( SURROUND_THROUGHT == rSurround.GetSurround() &&
1291               !pFmt->GetOpaque().GetValue() ) ? pDoc->GetHellId()
1292                                              : pDoc->GetHeavenId() );
1293 
1294         pDrawModel->GetPage(0)->InsertObject( pObject );
1295     }
1296 
1297     return pObject;
1298 }
1299 
1300 SwFrmFmt *lcl_GetFrmFmt( const :: uno::Any& rValue, SwDoc *pDoc )
1301 {
1302     SwFrmFmt *pRet = 0;
1303     SwDocShell* pDocSh = pDoc->GetDocShell();
1304     if(pDocSh)
1305     {
1306         OUString uTemp;
1307         rValue >>= uTemp;
1308         String sStyle;
1309         SwStyleNameMapper::FillUIName(String (uTemp), sStyle, nsSwGetPoolIdFromName::GET_POOLID_FRMFMT, sal_True );
1310         SwDocStyleSheet* pStyle =
1311                 (SwDocStyleSheet*)pDocSh->GetStyleSheetPool()->Find(sStyle,
1312                                                     SFX_STYLE_FAMILY_FRAME);
1313         if(pStyle)
1314             pRet = pStyle->GetFrmFmt();
1315     }
1316 
1317     return pRet;
1318 }
1319 
1320 void SwXFrame::setPropertyValue(const :: OUString& rPropertyName, const :: uno::Any& _rValue)
1321     throw( beans::UnknownPropertyException, beans::PropertyVetoException, lang::IllegalArgumentException, lang::WrappedTargetException, uno::RuntimeException )
1322 {
1323     vos::OGuard aGuard(Application::GetSolarMutex());
1324     SwFrmFmt* pFmt = GetFrmFmt();
1325     const :: SfxItemPropertySimpleEntry* pEntry = m_pPropSet->getPropertyMap()->getByName(rPropertyName);
1326 
1327     if (!pEntry)
1328         throw beans::UnknownPropertyException(OUString ( RTL_CONSTASCII_USTRINGPARAM ( "Unknown property: " ) ) + rPropertyName, static_cast < cppu::OWeakObject * > ( this ) );
1329 
1330     //UUUU
1331     const sal_uInt8 nMemberId(pEntry->nMemberId & (~SFX_METRIC_ITEM));
1332     uno::Any aValue(_rValue);
1333 
1334     //UUUU check for needed metric translation
1335     if(pEntry->nMemberId & SFX_METRIC_ITEM)
1336     {
1337         bool bDoIt(true);
1338 
1339         if(XATTR_FILLBMP_SIZEX == pEntry->nWID || XATTR_FILLBMP_SIZEY == pEntry->nWID)
1340         {
1341             // exception: If these ItemTypes are used, do not convert when these are negative
1342             // since this means they are intended as percent values
1343             sal_Int32 nValue = 0;
1344 
1345             if(aValue >>= nValue)
1346             {
1347                 bDoIt = nValue > 0;
1348             }
1349         }
1350 
1351         if(bDoIt)
1352         {
1353             const SwDoc* pDoc = (IsDescriptor() ? m_pDoc : GetFrmFmt()->GetDoc());
1354             const SfxItemPool& rPool = pDoc->GetAttrPool();
1355             const SfxMapUnit eMapUnit(rPool.GetMetric(pEntry->nWID));
1356 
1357             if(eMapUnit != SFX_MAPUNIT_100TH_MM)
1358             {
1359                 SvxUnoConvertFromMM(eMapUnit, aValue);
1360             }
1361         }
1362     }
1363 
1364     if(pFmt)
1365     {
1366         sal_Bool bNextFrame = sal_False;
1367         if ( pEntry->nFlags & beans::PropertyAttribute::READONLY)
1368             throw beans::PropertyVetoException( OUString ( RTL_CONSTASCII_USTRINGPARAM ( "Property is read-only: " ) ) + rPropertyName, static_cast < cppu::OWeakObject * > ( this ) );
1369 
1370         SwDoc* pDoc = pFmt->GetDoc();
1371         if ((eType == FLYCNTTYPE_GRF) && isGRFATR(pEntry->nWID) ||
1372             (FN_PARAM_COUNTOUR_PP        == pEntry->nWID) ||
1373             (FN_UNO_IS_AUTOMATIC_CONTOUR == pEntry->nWID) ||
1374             (FN_UNO_IS_PIXEL_CONTOUR     == pEntry->nWID) )
1375         {
1376             const :: SwNodeIndex* pIdx = pFmt->GetCntnt().GetCntntIdx();
1377             if(pIdx)
1378             {
1379                 SwNodeIndex aIdx(*pIdx, 1);
1380                 SwNoTxtNode* pNoTxt = aIdx.GetNode().GetNoTxtNode();
1381                 if(pEntry->nWID == FN_PARAM_COUNTOUR_PP)
1382                 {
1383                     drawing::PointSequenceSequence aParam;
1384                     if(!aValue.hasValue())
1385                         pNoTxt->SetContour(0);
1386                     else if(aValue >>= aParam)
1387                     {
1388                         PolyPolygon aPoly((sal_uInt16)aParam.getLength());
1389                         for(sal_Int32 i = 0; i < aParam.getLength(); i++)
1390                         {
1391                             const :: drawing::PointSequence* pPointSeq = aParam.getConstArray();
1392                             sal_Int32 nPoints = pPointSeq[i].getLength();
1393                             const :: awt::Point* pPoints = pPointSeq[i].getConstArray();
1394                             Polygon aSet( (sal_uInt16)nPoints );
1395                             for(sal_Int32 j = 0; j < nPoints; j++)
1396                             {
1397                                 Point aPoint(pPoints[j].X, pPoints[j].Y);
1398                                 aSet.SetPoint(aPoint, (sal_uInt16)j);
1399                             }
1400                             // Close polygon if it isn't closed already.
1401                             aSet.Optimize( POLY_OPTIMIZE_CLOSE );
1402                             aPoly.Insert( aSet );
1403                         }
1404                         pNoTxt->SetContourAPI( &aPoly );
1405                     }
1406                     else
1407                         throw lang::IllegalArgumentException();
1408                 }
1409                 else if(pEntry->nWID == FN_UNO_IS_AUTOMATIC_CONTOUR )
1410                 {
1411                     pNoTxt->SetAutomaticContour( *(sal_Bool *)aValue.getValue() );
1412                 }
1413                 else if(pEntry->nWID == FN_UNO_IS_PIXEL_CONTOUR )
1414                 {
1415                     // The IsPixelContour property can only be set if there
1416                     // is no contour, or if the contour has been set by the
1417                     // API itself (or in other words, if the contour isn't
1418                     // used already).
1419                     if( !pNoTxt->_HasContour() ||
1420                         !pNoTxt->IsContourMapModeValid() )
1421                         pNoTxt->SetPixelContour( *(sal_Bool *)aValue.getValue() );
1422                     else
1423                         throw lang::IllegalArgumentException();
1424                 }
1425                 else
1426                 {
1427                     SfxItemSet aSet(pNoTxt->GetSwAttrSet());
1428                     m_pPropSet->setPropertyValue(*pEntry, aValue, aSet);
1429                     pNoTxt->SetAttr(aSet);
1430                 }
1431             }
1432         }
1433         // New attribute Title
1434         else if( FN_UNO_TITLE == pEntry->nWID )
1435         {
1436             SwFlyFrmFmt* pFlyFmt = dynamic_cast<SwFlyFrmFmt*>(pFmt);
1437             ASSERT( pFmt,
1438                     "unexpected type of <pFmt> --> crash" );
1439             OUString uTemp;
1440             aValue >>= uTemp;
1441             const String sTitle(uTemp);
1442             // assure that <SdrObject> instance exists.
1443             GetOrCreateSdrObject( pFlyFmt );
1444             pFlyFmt->GetDoc()->SetFlyFrmTitle( *(pFlyFmt), sTitle );
1445         }
1446         // New attribute Description
1447         else if( FN_UNO_DESCRIPTION == pEntry->nWID )
1448         {
1449             SwFlyFrmFmt* pFlyFmt = dynamic_cast<SwFlyFrmFmt*>(pFmt);
1450             ASSERT( pFmt,
1451                     "unexpected type of <pFmt> --> crash" );
1452             OUString uTemp;
1453             aValue >>= uTemp;
1454             const String sDescription(uTemp);
1455             // assure that <SdrObject> instance exists.
1456             GetOrCreateSdrObject( pFlyFmt );
1457             pFlyFmt->GetDoc()->SetFlyFrmDescription( *(pFlyFmt), sDescription );
1458         }
1459         // <--
1460         else if(FN_UNO_FRAME_STYLE_NAME == pEntry->nWID)
1461         {
1462             SwFrmFmt *pFrmFmt = lcl_GetFrmFmt( aValue, pFmt->GetDoc() );
1463             if( pFrmFmt )
1464             {
1465                 UnoActionContext aAction(pFmt->GetDoc());
1466 
1467                 SfxItemSet* pSet = 0;
1468                 // --> OD 2004-08-13 #i31771#, #i25798# - No adjustment of
1469                 // anchor ( no call of method <::lcl_ChkAndSetNewAnchor(..)> ),
1470                 // if document is currently in reading mode.
1471                 if ( !pFmt->GetDoc()->IsInReading() )
1472                 {
1473                     // see SwFEShell::SetFrmFmt( SwFrmFmt *pNewFmt, sal_Bool bKeepOrient, Point* pDocPos )
1474                     SwFlyFrm *pFly = 0;
1475                     {
1476                         const :: SwFrmFmt* pFmtXX = pFmt;
1477                         if (PTR_CAST(SwFlyFrmFmt, pFmtXX))
1478                             pFly = ((SwFlyFrmFmt*)pFmtXX)->GetFrm();
1479                     }
1480                     if ( pFly )
1481                     {
1482                         const :: SfxPoolItem* pItem;
1483                         if( SFX_ITEM_SET == pFrmFmt->GetItemState( RES_ANCHOR, sal_False, &pItem ))
1484                         {
1485                             pSet = new SfxItemSet( pDoc->GetAttrPool(), aFrmFmtSetRange );
1486                             pSet->Put( *pItem );
1487                             if ( pFmt->GetDoc()->GetEditShell() != NULL
1488                                  && !::lcl_ChkAndSetNewAnchor( *(pFmt->GetDoc()->GetEditShell()), *pFly, *pSet ) )
1489                                 delete pSet, pSet = 0;
1490                         }
1491                     }
1492                 }
1493                 // <--
1494 
1495                 pFmt->GetDoc()->SetFrmFmtToFly( *pFmt, *pFrmFmt, pSet, sal_False );
1496                 delete pSet;
1497             }
1498             else
1499                 throw lang::IllegalArgumentException();
1500         }
1501         else if( FN_UNO_GRAPHIC_U_R_L == pEntry->nWID ||
1502                 FN_UNO_GRAPHIC_FILTER == pEntry->nWID)
1503         {
1504             String sGrfName, sFltName;
1505             GraphicObject *pGrfObj = 0;
1506             pFmt->GetDoc()->GetGrfNms( *(SwFlyFrmFmt*)pFmt, &sGrfName, &sFltName );
1507             OUString uTemp;
1508             aValue >>= uTemp;
1509             String sTmp(uTemp);
1510             UnoActionContext aAction(pFmt->GetDoc());
1511             if(FN_UNO_GRAPHIC_U_R_L == pEntry->nWID)
1512             {
1513                 if( sTmp.EqualsAscii( sPackageProtocol,
1514                                       0, sizeof( sPackageProtocol )-1 ) )
1515                 {
1516                     pGrfObj = new GraphicObject;
1517                     pGrfObj->SetUserData( sTmp );
1518                     pGrfObj->SetSwapState();
1519                     sGrfName.Erase();
1520                 }
1521                 else if( sTmp.EqualsAscii( sGraphicObjectProtocol,
1522                                            0, sizeof(sGraphicObjectProtocol)-1 ) )
1523                 {
1524                     ByteString sId( sTmp.Copy(sizeof(sGraphicObjectProtocol)-1),
1525                                     RTL_TEXTENCODING_ASCII_US );
1526                     pGrfObj = new GraphicObject( sId );
1527                     sGrfName.Erase();
1528                 }
1529                 else
1530                 {
1531                     sGrfName = sTmp;
1532                 }
1533             }
1534             else
1535             {
1536                 sFltName = sTmp;
1537             }
1538 
1539             const :: SwNodeIndex* pIdx = pFmt->GetCntnt().GetCntntIdx();
1540             if(pIdx)
1541             {
1542                 SwNodeIndex aIdx(*pIdx, 1);
1543 //              SwNoTxtNode* pNoTxt = aIdx.GetNode().GetNoTxtNode();
1544                 SwGrfNode* pGrfNode = aIdx.GetNode().GetGrfNode();
1545                 if(!pGrfNode)
1546                 {
1547                     delete pGrfObj;
1548                     throw uno::RuntimeException();
1549                 }
1550                 SwPaM aGrfPaM(*pGrfNode);
1551                 pFmt->GetDoc()->ReRead( aGrfPaM, sGrfName, sFltName, 0,
1552                                         pGrfObj );
1553             }
1554             delete pGrfObj;
1555         }
1556         else if( FN_UNO_GRAPHIC == pEntry->nWID )
1557         {
1558             uno::Reference< graphic::XGraphic > xGraphic;
1559             aValue >>= xGraphic;
1560             if(xGraphic.is())
1561             {
1562                 const :: SwNodeIndex* pIdx = pFmt->GetCntnt().GetCntntIdx();
1563                 if(pIdx)
1564                 {
1565                     SwNodeIndex aIdx(*pIdx, 1);
1566                     SwGrfNode* pGrfNode = aIdx.GetNode().GetGrfNode();
1567                     if(!pGrfNode)
1568                     {
1569                         throw uno::RuntimeException();
1570                     }
1571                     SwPaM aGrfPaM(*pGrfNode);
1572                     Graphic aGraphic( xGraphic );
1573                     pFmt->GetDoc()->ReRead( aGrfPaM, String(), String(), &aGraphic, 0 );
1574                 }
1575             }
1576         }
1577         else if( FN_UNO_REPLACEMENT_GRAPHIC_URL == pEntry->nWID || FN_UNO_REPLACEMENT_GRAPHIC == pEntry->nWID )
1578         {
1579             bool bURL = FN_UNO_REPLACEMENT_GRAPHIC_URL == pEntry->nWID;
1580             bool bApply = false;
1581             Graphic aGraphic;
1582             if( bURL )
1583             {
1584                 GraphicObject *pGrfObj = 0;
1585                 OUString aGrfUrl;
1586                 aValue >>= aGrfUrl;
1587 
1588                 // the package URL based graphics are handled in different way currently
1589                 // TODO/LATER: actually this is the correct place to handle them
1590                 ::rtl::OUString aGraphicProtocol( RTL_CONSTASCII_USTRINGPARAM( sGraphicObjectProtocol ) );
1591                 if( aGrfUrl.compareTo( aGraphicProtocol, aGraphicProtocol.getLength() ) == 0 )
1592                 {
1593                     ByteString sId( aGrfUrl.copy(sizeof(sGraphicObjectProtocol)-1).getStr(), RTL_TEXTENCODING_ASCII_US );
1594                     pGrfObj = new GraphicObject( sId );
1595                     aGraphic = pGrfObj->GetGraphic();
1596                     bApply = true;
1597                 }
1598             }
1599             else
1600             {
1601                 uno::Reference< graphic::XGraphic > xGraphic;
1602                 aValue >>= xGraphic;
1603                 if( xGraphic.is() )
1604                 {
1605                     aGraphic = Graphic( xGraphic );
1606                     bApply = true;
1607                 }
1608             }
1609 
1610             if ( bApply )
1611             {
1612                 const :: SwFmtCntnt* pCnt = &pFmt->GetCntnt();
1613                 if ( pCnt->GetCntntIdx() && pDoc->GetNodes()[ pCnt->GetCntntIdx()->GetIndex() + 1 ] )
1614                 {
1615                     SwOLENode* pOleNode =  pDoc->GetNodes()[ pCnt->GetCntntIdx()->GetIndex() + 1 ]->GetOLENode();
1616 
1617                     if ( pOleNode )
1618                     {
1619                         svt::EmbeddedObjectRef xObj = pOleNode->GetOLEObj().GetObject();
1620 
1621                         ::rtl::OUString aMediaType;
1622                         xObj.SetGraphic( aGraphic, aMediaType );
1623                     }
1624                 }
1625             }
1626         }
1627         else if(0 != (bNextFrame = (rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_CHAIN_NEXT_NAME))))
1628             || rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_CHAIN_PREV_NAME)))
1629         {
1630             OUString uTemp;
1631             aValue >>= uTemp;
1632             String sChainName(uTemp);
1633             if(!sChainName.Len())
1634             {
1635                 if(bNextFrame)
1636                     pDoc->Unchain(*pFmt);
1637                 else
1638                 {
1639                     SwFmtChain aChain( pFmt->GetChain() );
1640                     SwFrmFmt *pPrev = aChain.GetPrev();
1641                     if(pPrev)
1642                         pDoc->Unchain(*pPrev);
1643                 }
1644             }
1645             else
1646             {
1647                 sal_uInt16 nCount = pDoc->GetFlyCount(FLYCNTTYPE_FRM);
1648 
1649                 SwFrmFmt* pChain = 0;
1650                 for( sal_uInt16 i = 0; i < nCount; i++)
1651                 {
1652                     SwFrmFmt* pFmt2 = pDoc->GetFlyNum(i, FLYCNTTYPE_FRM);
1653                     if(sChainName == pFmt2->GetName() )
1654                     {
1655                         pChain = pFmt2;
1656                         break;
1657                     }
1658                 }
1659                 if(pChain)
1660                 {
1661                     SwFrmFmt* pSource = bNextFrame ? pFmt : pChain;
1662                     SwFrmFmt* pDest = bNextFrame ? pChain: pFmt;
1663                     pDoc->Chain(*pSource, *pDest);
1664                 }
1665             }
1666         }
1667         else if(FN_UNO_Z_ORDER == pEntry->nWID)
1668         {
1669             sal_Int32 nZOrder = - 1;
1670             aValue >>= nZOrder;
1671             if( nZOrder >= 0)
1672             {
1673                 SdrObject* pObject =
1674                     GetOrCreateSdrObject( (SwFlyFrmFmt*)pFmt );
1675                 SdrModel *pDrawModel = pDoc->GetDrawModel();
1676                 pDrawModel->GetPage(0)->
1677                             SetObjectOrdNum(pObject->GetOrdNum(), nZOrder);
1678             }
1679         }
1680         else if(RES_ANCHOR == pEntry->nWID && MID_ANCHOR_ANCHORFRAME == nMemberId)
1681         {
1682             sal_Bool bDone = sal_False;
1683             uno::Reference<text::XTextFrame> xFrame;
1684             if(aValue >>= xFrame)
1685             {
1686                 uno::Reference<lang::XUnoTunnel> xTunnel(xFrame, uno::UNO_QUERY);
1687                 SwXFrame* pFrame = xTunnel.is() ?
1688                         reinterpret_cast< SwXFrame * >( sal::static_int_cast< sal_IntPtr >( xTunnel->getSomething(SwXFrame::getUnoTunnelId()) ))
1689                         : 0;
1690                 if(pFrame && this != pFrame && pFrame->GetFrmFmt() && pFrame->GetFrmFmt()->GetDoc() == pDoc)
1691                 {
1692                     SfxItemSet aSet( pDoc->GetAttrPool(),
1693                                 RES_FRMATR_BEGIN, RES_FRMATR_END - 1 );
1694                     aSet.SetParent(&pFmt->GetAttrSet());
1695                     SwFmtAnchor aAnchor = (const :: SwFmtAnchor&)aSet.Get(pEntry->nWID);
1696 
1697 
1698                     SwPosition aPos(*pFrame->GetFrmFmt()->GetCntnt().GetCntntIdx());
1699                     aAnchor.SetAnchor(&aPos);
1700                     aAnchor.SetType(FLY_AT_FLY);
1701                     aSet.Put(aAnchor);
1702                     pDoc->SetFlyFrmAttr( *pFmt, aSet );
1703                     bDone = sal_True;
1704                 }
1705             }
1706             if(!bDone)
1707                 throw lang::IllegalArgumentException();
1708         }
1709         else
1710         {   //UUUU
1711             // standard UNO API write attributes
1712             // adapt former attr from SvxBrushItem::PutValue to new items XATTR_FILL_FIRST, XATTR_FILL_LAST
1713             SfxItemSet aSet( pDoc->GetAttrPool(),
1714                 RES_FRMATR_BEGIN, RES_FRMATR_END - 1,
1715                 RES_UNKNOWNATR_CONTAINER, RES_UNKNOWNATR_CONTAINER,
1716 
1717                 //UUUU FillAttribute support
1718                 XATTR_FILL_FIRST, XATTR_FILL_LAST,
1719 
1720                 0L);
1721             bool bDone(false);
1722 
1723             aSet.SetParent(&pFmt->GetAttrSet());
1724 
1725             if(RES_BACKGROUND == pEntry->nWID)
1726             {
1727                 const SwAttrSet& rSet = pFmt->GetAttrSet();
1728                 const SvxBrushItem aOriginalBrushItem(getSvxBrushItemFromSourceSet(rSet));
1729                 SvxBrushItem aChangedBrushItem(aOriginalBrushItem);
1730 
1731                 aChangedBrushItem.PutValue(aValue, nMemberId);
1732 
1733                 if(!(aChangedBrushItem == aOriginalBrushItem))
1734                 {
1735                     setSvxBrushItemAsFillAttributesToTargetSet(aChangedBrushItem, aSet);
1736                     pFmt->GetDoc()->SetFlyFrmAttr( *pFmt, aSet );
1737                 }
1738 
1739                 bDone = true;
1740             }
1741             else if(OWN_ATTR_FILLBMP_MODE == pEntry->nWID)
1742             {
1743                 //UUUU
1744                 drawing::BitmapMode eMode;
1745 
1746                 if(!(aValue >>= eMode))
1747                 {
1748                     sal_Int32 nMode = 0;
1749 
1750                     if(!(aValue >>= nMode))
1751                     {
1752                         throw lang::IllegalArgumentException();
1753                     }
1754 
1755                     eMode = (drawing::BitmapMode)nMode;
1756                 }
1757 
1758                 aSet.Put(XFillBmpStretchItem(drawing::BitmapMode_STRETCH == eMode));
1759                 aSet.Put(XFillBmpTileItem(drawing::BitmapMode_REPEAT == eMode));
1760                 pFmt->GetDoc()->SetFlyFrmAttr( *pFmt, aSet );
1761                 bDone = true;
1762             }
1763 
1764             if(!bDone)
1765             {
1766                 m_pPropSet->setPropertyValue(*pEntry, aValue, aSet);
1767             }
1768 
1769             if(RES_ANCHOR == pEntry->nWID && MID_ANCHOR_ANCHORTYPE == nMemberId)
1770             {
1771                 SwFmtAnchor aAnchor = (const :: SwFmtAnchor&)aSet.Get(pEntry->nWID);
1772                 if(aAnchor.GetAnchorId() == FLY_AT_FLY)
1773                 {
1774                     const :: SwPosition* pPosition = aAnchor.GetCntntAnchor();
1775                     SwFrmFmt* pFlyFmt = pPosition ? pPosition->nNode.GetNode().GetFlyFmt() : 0;
1776                     if(!pFlyFmt || pFlyFmt->Which() == RES_DRAWFRMFMT)
1777                     {
1778                         lang::IllegalArgumentException aExcept;
1779                         aExcept.Message = C2U("Anchor to frame: no frame found");
1780                         throw aExcept;
1781                     }
1782                     else
1783                     {
1784                         SwPosition aPos = *pPosition;
1785                         aPos.nNode = *pFlyFmt->GetCntnt().GetCntntIdx();
1786                         aAnchor.SetAnchor(&aPos);
1787                         aSet.Put(aAnchor);
1788                     }
1789                 }
1790                 else if ((aAnchor.GetAnchorId() != FLY_AT_PAGE) &&
1791                          !aAnchor.GetCntntAnchor())
1792                 {
1793                     SwNode& rNode = pDoc->GetNodes().GetEndOfContent();
1794                     SwPaM aPam(rNode);
1795                     aPam.Move( fnMoveBackward, fnGoDoc );
1796                     aAnchor.SetAnchor( aPam.Start() );
1797                     aSet.Put(aAnchor);
1798                 }
1799 
1800                 // --> OD 2004-08-13 #i31771#, #i25798# - No adjustment of
1801                 // anchor ( no call of method <::lcl_ChkAndSetNewAnchor(..)> ),
1802                 // if document is currently in reading mode.
1803                 if ( !pFmt->GetDoc()->IsInReading() )
1804                 {
1805                     // see SwFEShell::SetFlyFrmAttr( SfxItemSet& rSet )
1806                     SwFlyFrm *pFly = 0;
1807                     if (PTR_CAST(SwFlyFrmFmt, pFmt))
1808                         pFly = ((SwFlyFrmFmt*)pFmt)->GetFrm();
1809                     if (pFly)
1810                     {
1811                         const :: SfxPoolItem* pItem;
1812                         if( SFX_ITEM_SET == aSet.GetItemState( RES_ANCHOR, sal_False, &pItem ))
1813                         {
1814                             aSet.Put( *pItem );
1815                             if ( pFmt->GetDoc()->GetEditShell() != NULL )
1816                             {
1817                                 ::lcl_ChkAndSetNewAnchor( *(pFmt->GetDoc()->GetEditShell()), *pFly, aSet );
1818                             }
1819                         }
1820                     }
1821                 }
1822                 // <--
1823 
1824                 pFmt->GetDoc()->SetFlyFrmAttr( *pFmt, aSet );
1825             }
1826             else if(FN_UNO_CLSID == pEntry->nWID || FN_UNO_STREAM_NAME == pEntry->nWID)
1827             {
1828                 throw lang::IllegalArgumentException();
1829             }
1830             else
1831                 pFmt->SetFmtAttr(aSet);
1832         }
1833     }
1834     else if(IsDescriptor())
1835     {
1836         pProps->SetProperty(pEntry->nWID, nMemberId, aValue);
1837         if( FN_UNO_FRAME_STYLE_NAME == pEntry->nWID )
1838         {
1839             OUString sStyleName;
1840             aValue >>= sStyleName;
1841             try
1842             {
1843                 uno::Any aAny = mxStyleFamily->getByName ( sStyleName );
1844                 aAny >>= mxStyleData;
1845             }
1846             catch ( container::NoSuchElementException const & )
1847             {
1848             }
1849             catch ( lang::WrappedTargetException const  & )
1850             {
1851             }
1852             catch ( uno::RuntimeException const & )
1853             {
1854             }
1855         }
1856     }
1857     else
1858         throw uno::RuntimeException();
1859 }
1860 
1861 uno::Any SwXFrame::getPropertyValue(const OUString& rPropertyName)
1862     throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
1863 {
1864     vos::OGuard aGuard(Application::GetSolarMutex());
1865     uno::Any aAny;
1866     SwFrmFmt* pFmt = GetFrmFmt();
1867     const SfxItemPropertySimpleEntry* pEntry = m_pPropSet->getPropertyMap()->getByName(rPropertyName);
1868     if (!pEntry)
1869         throw beans::UnknownPropertyException(OUString ( RTL_CONSTASCII_USTRINGPARAM ( "Unknown property: " ) ) + rPropertyName, static_cast < cppu::OWeakObject * > ( this ) );
1870 
1871     //UUUU
1872     const sal_uInt8 nMemberId(pEntry->nMemberId & (~SFX_METRIC_ITEM));
1873 
1874     if(FN_UNO_ANCHOR_TYPES == pEntry->nWID)
1875     {
1876         uno::Sequence<text::TextContentAnchorType> aTypes(5);
1877         text::TextContentAnchorType* pArray = aTypes.getArray();
1878         pArray[0] = text::TextContentAnchorType_AT_PARAGRAPH;
1879         pArray[1] = text::TextContentAnchorType_AS_CHARACTER;
1880         pArray[2] = text::TextContentAnchorType_AT_PAGE;
1881         pArray[3] = text::TextContentAnchorType_AT_FRAME;
1882         pArray[4] = text::TextContentAnchorType_AT_CHARACTER;
1883         aAny.setValue(&aTypes, ::getCppuType(static_cast<uno::Sequence<text::TextContentAnchorType>*>(0)));
1884     }
1885     else if(pFmt)
1886     {
1887         if( ((eType == FLYCNTTYPE_GRF) || (eType == FLYCNTTYPE_OLE)) &&
1888                 pEntry &&
1889                 (isGRFATR(pEntry->nWID) ||
1890                         pEntry->nWID == FN_PARAM_COUNTOUR_PP ||
1891                         pEntry->nWID == FN_UNO_IS_AUTOMATIC_CONTOUR ||
1892                         pEntry->nWID == FN_UNO_IS_PIXEL_CONTOUR ))
1893         {
1894             const SwNodeIndex* pIdx = pFmt->GetCntnt().GetCntntIdx();
1895             if(pIdx)
1896             {
1897                 SwNodeIndex aIdx(*pIdx, 1);
1898                 SwNoTxtNode* pNoTxt = aIdx.GetNode().GetNoTxtNode();
1899                 if(pEntry->nWID == FN_PARAM_COUNTOUR_PP)
1900                 {
1901                     PolyPolygon aContour;
1902                     if( pNoTxt->GetContourAPI( aContour ) )
1903                     {
1904                         drawing::PointSequenceSequence aPtSeq(aContour.Count());
1905                         drawing::PointSequence* pPSeq = aPtSeq.getArray();
1906                         for(sal_uInt16 i = 0; i < aContour.Count(); i++)
1907                         {
1908                             const Polygon& rPoly = aContour.GetObject(i);
1909                             pPSeq[i].realloc(rPoly.GetSize());
1910                             awt::Point* pPoints = pPSeq[i].getArray();
1911                             for(sal_uInt16 j = 0; j < rPoly.GetSize(); j++)
1912                             {
1913                                 const Point& rPoint = rPoly.GetPoint(j);
1914                                 pPoints[j].X = rPoint.X();
1915                                 pPoints[j].Y = rPoint.Y();
1916                             }
1917                         }
1918                         aAny <<= aPtSeq;
1919                     }
1920                 }
1921                 else if(pEntry->nWID == FN_UNO_IS_AUTOMATIC_CONTOUR )
1922                 {
1923                     sal_Bool bValue = pNoTxt->HasAutomaticContour();
1924                     aAny.setValue( &bValue, ::getBooleanCppuType() );
1925                 }
1926                 else if(pEntry->nWID == FN_UNO_IS_PIXEL_CONTOUR )
1927                 {
1928                     sal_Bool bValue = pNoTxt->IsPixelContour();
1929                     aAny.setValue( &bValue, ::getBooleanCppuType() );
1930                 }
1931                 else
1932                 {
1933                     SfxItemSet aSet(pNoTxt->GetSwAttrSet());
1934                     m_pPropSet->getPropertyValue(*pEntry, aSet, aAny);
1935                 }
1936             }
1937         }
1938         else if( FN_UNO_GRAPHIC_U_R_L == pEntry->nWID)
1939         {
1940             String sGrfName;
1941             const SwNodeIndex* pIdx = pFmt->GetCntnt().GetCntntIdx();
1942             if(pIdx)
1943             {
1944                 SwNodeIndex aIdx(*pIdx, 1);
1945 //              SwNoTxtNode* pNoTxt = aIdx.GetNode().GetNoTxtNode();
1946                 SwGrfNode* pGrfNode = aIdx.GetNode().GetGrfNode();
1947                 if(!pGrfNode)
1948                     throw uno::RuntimeException();
1949                 if( pGrfNode->IsGrfLink() )
1950                 {
1951                     pFmt->GetDoc()->GetGrfNms( *(SwFlyFrmFmt*)pFmt, &sGrfName, 0 );
1952                 }
1953                 else
1954                 {
1955                     String sPrefix( RTL_CONSTASCII_STRINGPARAM(sGraphicObjectProtocol) );
1956                     String sId( pGrfNode->GetGrfObj().GetUniqueID(),
1957                                 RTL_TEXTENCODING_ASCII_US );
1958                     (sGrfName = sPrefix) += sId;
1959                 }
1960             }
1961             aAny <<= OUString(sGrfName);
1962         }
1963         else if( FN_UNO_REPLACEMENT_GRAPHIC_U_R_L == pEntry->nWID)
1964         {
1965             String sGrfName;
1966             const SwNodeIndex* pIdx = pFmt->GetCntnt().GetCntntIdx();
1967 
1968             if(pIdx)
1969             {
1970                 SwNodeIndex aIdx(*pIdx, 1);
1971                 SwGrfNode* pGrfNode = aIdx.GetNode().GetGrfNode();
1972                 if(!pGrfNode)
1973                     throw uno::RuntimeException();
1974 
1975                 const GraphicObject* pGraphicObject = pGrfNode->GetReplacementGrfObj();
1976 
1977                 if(pGraphicObject)
1978                 {
1979                     String sPrefix( RTL_CONSTASCII_STRINGPARAM(sGraphicObjectProtocol) );
1980                     String sId( pGraphicObject->GetUniqueID(), RTL_TEXTENCODING_ASCII_US );
1981                     (sGrfName = sPrefix) += sId;
1982                 }
1983             }
1984 
1985             aAny <<= OUString(sGrfName);
1986         }
1987         else if( FN_UNO_GRAPHIC_FILTER == pEntry->nWID )
1988         {
1989             String sFltName;
1990             pFmt->GetDoc()->GetGrfNms( *(SwFlyFrmFmt*)pFmt, 0, &sFltName );
1991                 aAny <<= OUString(sFltName);
1992         }
1993         else if( FN_UNO_GRAPHIC == pEntry->nWID )
1994         {
1995             const SwNodeIndex* pIdx = pFmt->GetCntnt().GetCntntIdx();
1996             if(pIdx)
1997             {
1998                 SwNodeIndex aIdx(*pIdx, 1);
1999                 SwGrfNode* pGrfNode = aIdx.GetNode().GetGrfNode();
2000                 if(!pGrfNode)
2001                     throw uno::RuntimeException();
2002                 aAny <<= pGrfNode->GetGrf().GetXGraphic();
2003             }
2004         }
2005         else if(FN_UNO_FRAME_STYLE_NAME == pEntry->nWID)
2006         {
2007             aAny <<= OUString(SwStyleNameMapper::GetProgName(pFmt->DerivedFrom()->GetName(), nsSwGetPoolIdFromName::GET_POOLID_FRMFMT ) );
2008         }
2009         // --> OD 2009-07-13 #i73249#
2010         // Attribute AlternativeText was never published.
2011         // Now it has been replaced by Attribute Title - valid for all <SwXFrame> instances
2012 //        else if(eType != FLYCNTTYPE_FRM &&
2013 //                FN_UNO_ALTERNATIVE_TEXT == pEntry->nWID)
2014 //        {
2015 //            const SwNodeIndex* pIdx = pFmt->GetCntnt().GetCntntIdx();
2016 //            if(pIdx)
2017 //            {
2018 //                SwNodeIndex aIdx(*pIdx, 1);
2019 //                SwNoTxtNode* pNoTxt = aIdx.GetNode().GetNoTxtNode();
2020 //                aAny <<= OUString(pNoTxt->GetAlternateText());
2021 //            }
2022 //        }
2023         else if( FN_UNO_TITLE == pEntry->nWID )
2024         {
2025             SwFlyFrmFmt* pFlyFmt = dynamic_cast<SwFlyFrmFmt*>(pFmt);
2026             ASSERT( pFmt,
2027                     "unexpected type of <pFmt> --> crash" );
2028             // assure that <SdrObject> instance exists.
2029             GetOrCreateSdrObject( pFlyFmt );
2030             aAny <<= OUString(pFlyFmt->GetObjTitle());
2031         }
2032         // New attribute Description
2033         else if( FN_UNO_DESCRIPTION == pEntry->nWID )
2034         {
2035             SwFlyFrmFmt* pFlyFmt = dynamic_cast<SwFlyFrmFmt*>(pFmt);
2036             ASSERT( pFmt,
2037                     "unexpected type of <pFmt> --> crash" );
2038             // assure that <SdrObject> instance exists.
2039             GetOrCreateSdrObject( pFlyFmt );
2040             aAny <<= OUString(pFlyFmt->GetObjDescription());
2041         }
2042         // <--
2043         else if(eType == FLYCNTTYPE_GRF &&
2044                 (rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_ACTUAL_SIZE))))
2045         {
2046             const SwNodeIndex* pIdx = pFmt->GetCntnt().GetCntntIdx();
2047             if(pIdx)
2048             {
2049                 SwNodeIndex aIdx(*pIdx, 1);
2050                 // --> OD #i85105#
2051 //                SwNoTxtNode* pNoTxt = aIdx.GetNode().GetNoTxtNode();
2052 //                Size aActSize = ((SwGrfNode*)pNoTxt)->GetTwipSize();
2053                 Size aActSize;
2054                 {
2055                     SwGrfNode* pGrfNode = dynamic_cast<SwGrfNode*>(aIdx.GetNode().GetNoTxtNode());
2056                     if ( pGrfNode )
2057                     {
2058                         aActSize = pGrfNode->GetTwipSize();
2059                         if ( aActSize.Width() == 0 && aActSize.Height() == 0 &&
2060                              pGrfNode->IsLinkedFile() )
2061                         {
2062                             pGrfNode->SwapIn( sal_True );
2063                             aActSize = pGrfNode->GetTwipSize();
2064                         }
2065                     }
2066                 }
2067                 // <--
2068                 awt::Size aTmp;
2069                 aTmp.Width = TWIP_TO_MM100(aActSize.Width());
2070                 aTmp.Height = TWIP_TO_MM100(aActSize.Height());
2071                 aAny.setValue(&aTmp, ::getCppuType(static_cast<const awt::Size*>(0)));
2072             }
2073         }
2074         else if(FN_PARAM_LINK_DISPLAY_NAME == pEntry->nWID)
2075         {
2076             aAny <<= OUString(pFmt->GetName());
2077         }
2078         else if(FN_UNO_Z_ORDER == pEntry->nWID)
2079         {
2080             const SdrObject* pObj = pFmt->FindRealSdrObject();
2081             if( pObj )
2082             {
2083                 aAny <<= (sal_Int32)pObj->GetOrdNum();
2084             }
2085         }
2086         else if(FN_UNO_CLSID == pEntry->nWID || FN_UNO_MODEL == pEntry->nWID||
2087                 FN_UNO_COMPONENT == pEntry->nWID ||FN_UNO_STREAM_NAME == pEntry->nWID||
2088                 FN_EMBEDDED_OBJECT == pEntry->nWID)
2089         {
2090             SwDoc* pDoc = pFmt->GetDoc();
2091             const SwFmtCntnt* pCnt = &pFmt->GetCntnt();
2092             DBG_ASSERT( pCnt->GetCntntIdx() &&
2093                            pDoc->GetNodes()[ pCnt->GetCntntIdx()->
2094                                             GetIndex() + 1 ]->GetOLENode(), "kein OLE-Node?");
2095 
2096             SwOLENode* pOleNode =  pDoc->GetNodes()[ pCnt->GetCntntIdx()
2097                                             ->GetIndex() + 1 ]->GetOLENode();
2098             uno::Reference < embed::XEmbeddedObject > xIP = pOleNode->GetOLEObj().GetOleRef();
2099             OUString aHexCLSID;
2100             {
2101                 SvGlobalName aClassName( xIP->getClassID() );
2102                 aHexCLSID = aClassName.GetHexName();
2103                 if(FN_UNO_CLSID != pEntry->nWID)
2104                 {
2105                     if ( svt::EmbeddedObjectRef::TryRunningState( xIP ) )
2106                     {
2107                         uno::Reference < lang::XComponent > xComp( xIP->getComponent(), uno::UNO_QUERY );
2108                         uno::Reference < frame::XModel > xModel( xComp, uno::UNO_QUERY );
2109                         if ( FN_EMBEDDED_OBJECT == pEntry->nWID )
2110                         {
2111                             // ensure the
2112                             ASSERT( pDoc->GetDocShell(), "no doc shell => no client site" );
2113                             if ( pDoc->GetDocShell() )
2114                                 pDoc->GetDocShell()->GetIPClient( svt::EmbeddedObjectRef( xIP, embed::Aspects::MSOLE_CONTENT ) );
2115                             aAny <<= xIP;
2116                         }
2117                         else if ( xModel.is() )
2118                             aAny <<= xModel;
2119                         else if ( FN_UNO_COMPONENT == pEntry->nWID )
2120                             aAny <<= xComp;
2121                     }
2122                 }
2123             }
2124 
2125             if(FN_UNO_CLSID == pEntry->nWID)
2126                 aAny <<= aHexCLSID;
2127             else if(FN_UNO_STREAM_NAME == pEntry->nWID)
2128             {
2129                 aAny <<= ::rtl::OUString(pOleNode->GetOLEObj().GetCurrentPersistName());
2130             }
2131         }
2132         else if(WID_LAYOUT_SIZE == pEntry->nWID)
2133         {
2134             // format document completely in order to get correct value
2135             pFmt->GetDoc()->GetEditShell()->CalcLayout();
2136 
2137             SwFrm* pTmpFrm = SwIterator<SwFrm,SwFmt>::FirstElement( *pFmt );
2138             if ( pTmpFrm )
2139             {
2140                 DBG_ASSERT( pTmpFrm->IsValid(), "frame not valid" );
2141                 const SwRect &rRect = pTmpFrm->Frm();
2142                 Size aMM100Size = OutputDevice::LogicToLogic(
2143                         Size( rRect.Width(), rRect.Height() ),
2144                         MapMode( MAP_TWIP ), MapMode( MAP_100TH_MM ));
2145                 aAny <<= awt::Size( aMM100Size.Width(), aMM100Size.Height() );
2146             }
2147         }
2148         else
2149         {   //UUUU
2150             // standard UNO API read attributes
2151             // adapt former attr from SvxBrushItem::PutValue to new items XATTR_FILL_FIRST, XATTR_FILL_LAST
2152             const SwAttrSet& rSet = pFmt->GetAttrSet();
2153             bool bDone(false);
2154 
2155             if(RES_BACKGROUND == pEntry->nWID)
2156             {
2157                 //UUUU
2158                 const SvxBrushItem aOriginalBrushItem(getSvxBrushItemFromSourceSet(rSet));
2159 
2160                 if(!aOriginalBrushItem.QueryValue(aAny, nMemberId))
2161                 {
2162                     OSL_ENSURE(false, "Error getting attribute from RES_BACKGROUND (!)");
2163                 }
2164 
2165                 bDone = true;
2166             }
2167             else if(OWN_ATTR_FILLBMP_MODE == pEntry->nWID)
2168             {
2169                 //UUUU
2170                 const XFillBmpStretchItem* pStretchItem = dynamic_cast< const XFillBmpStretchItem* >(&rSet.Get(XATTR_FILLBMP_STRETCH));
2171                 const XFillBmpTileItem* pTileItem = dynamic_cast< const XFillBmpTileItem* >(&rSet.Get(XATTR_FILLBMP_TILE));
2172 
2173                 if( pTileItem && pTileItem->GetValue() )
2174                 {
2175                     aAny <<= drawing::BitmapMode_REPEAT;
2176                 }
2177                 else if( pStretchItem && pStretchItem->GetValue() )
2178                 {
2179                     aAny <<= drawing::BitmapMode_STRETCH;
2180                 }
2181                 else
2182                 {
2183                     aAny <<= drawing::BitmapMode_NO_REPEAT;
2184                 }
2185 
2186                 bDone = true;
2187             }
2188 
2189             if(!bDone)
2190             {
2191                 m_pPropSet->getPropertyValue(*pEntry, rSet, aAny);
2192             }
2193         }
2194     }
2195     else if(IsDescriptor())
2196     {
2197         if ( ! m_pDoc )
2198             throw uno::RuntimeException();
2199         if(WID_LAYOUT_SIZE != pEntry->nWID)  // there is no LayoutSize in a descriptor
2200         {
2201             const uno::Any* pAny = 0;
2202             if( !pProps->GetProperty( pEntry->nWID, nMemberId, pAny ) )
2203                 aAny = mxStyleData->getPropertyValue( rPropertyName );
2204             else if ( pAny )
2205                 aAny = *pAny;
2206         }
2207     }
2208     else
2209         throw uno::RuntimeException();
2210 
2211     //UUUU
2212     if(pEntry && pEntry->pType && *(pEntry->pType) == ::getCppuType((const sal_Int16*)0) && *(pEntry->pType) != aAny.getValueType())
2213     {
2214         // since the sfx uint16 item now exports a sal_Int32, we may have to fix this here
2215         sal_Int32 nValue = 0;
2216         aAny >>= nValue;
2217         aAny <<= (sal_Int16)nValue;
2218     }
2219 
2220     //UUUU check for needed metric translation
2221     if(pEntry->nMemberId & SFX_METRIC_ITEM)
2222     {
2223         bool bDoIt(true);
2224 
2225         if(XATTR_FILLBMP_SIZEX == pEntry->nWID || XATTR_FILLBMP_SIZEY == pEntry->nWID)
2226         {
2227             // exception: If these ItemTypes are used, do not convert when these are negative
2228             // since this means they are intended as percent values
2229             sal_Int32 nValue = 0;
2230 
2231             if(aAny >>= nValue)
2232             {
2233                 bDoIt = nValue > 0;
2234             }
2235         }
2236 
2237         if(bDoIt)
2238         {
2239             const SwDoc* pDoc = (IsDescriptor() ? m_pDoc : GetFrmFmt()->GetDoc());
2240             const SfxItemPool& rPool = pDoc->GetAttrPool();
2241             const SfxMapUnit eMapUnit(rPool.GetMetric(pEntry->nWID));
2242 
2243             if(eMapUnit != SFX_MAPUNIT_100TH_MM)
2244             {
2245                 SvxUnoConvertToMM(eMapUnit, aAny);
2246             }
2247         }
2248     }
2249 
2250     return aAny;
2251 }
2252 
2253 void SwXFrame::addPropertyChangeListener(const OUString& /*PropertyName*/,
2254     const uno::Reference< beans::XPropertyChangeListener > & /*aListener*/)
2255     throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
2256 {
2257     DBG_WARNING("not implemented");
2258 }
2259 
2260 void SwXFrame::removePropertyChangeListener(const OUString& /*PropertyName*/,
2261     const uno::Reference< beans::XPropertyChangeListener > & /*aListener*/)
2262     throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
2263 {
2264     DBG_WARNING("not implemented");
2265 }
2266 
2267 void SwXFrame::addVetoableChangeListener(const OUString& /*PropertyName*/,
2268                                 const uno::Reference< beans::XVetoableChangeListener > & /*aListener*/)
2269     throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
2270 {
2271     DBG_WARNING("not implemented");
2272 }
2273 
2274 void SwXFrame::removeVetoableChangeListener(
2275     const OUString& /*PropertyName*/, const uno::Reference< beans::XVetoableChangeListener > & /*aListener*/)
2276         throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
2277 {
2278     DBG_WARNING("not implemented");
2279 }
2280 
2281 beans::PropertyState SwXFrame::getPropertyState( const OUString& rPropertyName )
2282     throw(beans::UnknownPropertyException, uno::RuntimeException)
2283 {
2284     vos::OGuard aGuard(Application::GetSolarMutex());
2285     uno::Sequence< OUString > aPropertyNames(1);
2286     OUString* pNames = aPropertyNames.getArray();
2287     pNames[0] = rPropertyName;
2288     uno::Sequence< beans::PropertyState > aStates = getPropertyStates(aPropertyNames);
2289     return aStates.getConstArray()[0];
2290 }
2291 
2292 //UUUU
2293 bool SwXFrame::needToMapFillItemsToSvxBrushItemTypes() const
2294 {
2295     SwFrmFmt* pFmt = GetFrmFmt();
2296 
2297     if(!pFmt)
2298     {
2299         return false;
2300     }
2301 
2302     const SwAttrSet& rFmtSet = pFmt->GetAttrSet();
2303     const XFillStyleItem* pXFillStyleItem(static_cast< const XFillStyleItem*  >(rFmtSet.GetItem(XATTR_FILLSTYLE, false)));
2304 
2305     if(!pXFillStyleItem)
2306     {
2307         return false;
2308     }
2309 
2310     //UUUU here different FillStyles can be excluded for export; it will depend on the
2311     // quality these fallbacks can reach. That again is done in getSvxBrushItemFromSourceSet,
2312     // take a look there how the superset of DrawObject FillStyles is mapped to SvxBrushItem.
2313     // For now, take them all - except XFILL_NONE
2314 
2315     if(XFILL_NONE != pXFillStyleItem->GetValue())
2316     {
2317         return true;
2318     }
2319 
2320     //if(XFILL_SOLID == pXFillStyleItem->GetValue() || XFILL_BITMAP == pXFillStyleItem->GetValue())
2321     //{
2322     //    return true;
2323     //}
2324 
2325     return false;
2326 }
2327 
2328 uno::Sequence< beans::PropertyState > SwXFrame::getPropertyStates(
2329     const uno::Sequence< OUString >& aPropertyNames )
2330         throw(beans::UnknownPropertyException, uno::RuntimeException)
2331 {
2332     vos::OGuard aGuard(Application::GetSolarMutex());
2333     uno::Sequence< beans::PropertyState > aStates(aPropertyNames.getLength());
2334     beans::PropertyState* pStates = aStates.getArray();
2335     SwFrmFmt* pFmt = GetFrmFmt();
2336     if(pFmt)
2337     {
2338         const OUString* pNames = aPropertyNames.getConstArray();
2339         const SwAttrSet& rFmtSet = pFmt->GetAttrSet();
2340         for(int i = 0; i < aPropertyNames.getLength(); i++)
2341         {
2342             const SfxItemPropertySimpleEntry* pEntry = m_pPropSet->getPropertyMap()->getByName(pNames[i]);
2343             if (!pEntry)
2344                 throw beans::UnknownPropertyException(OUString ( RTL_CONSTASCII_USTRINGPARAM ( "Unknown property: " ) ) + pNames[i], static_cast < cppu::OWeakObject * > ( this ) );
2345 
2346             if(pEntry->nWID == FN_UNO_ANCHOR_TYPES||
2347                 pEntry->nWID == FN_PARAM_LINK_DISPLAY_NAME||
2348                 FN_UNO_FRAME_STYLE_NAME == pEntry->nWID||
2349                 FN_UNO_GRAPHIC_U_R_L == pEntry->nWID||
2350                 FN_UNO_GRAPHIC_FILTER     == pEntry->nWID||
2351                 FN_UNO_ACTUAL_SIZE == pEntry->nWID||
2352                 FN_UNO_ALTERNATIVE_TEXT == pEntry->nWID)
2353             {
2354                 pStates[i] = beans::PropertyState_DIRECT_VALUE;
2355             }
2356             else if(OWN_ATTR_FILLBMP_MODE == pEntry->nWID)
2357             {
2358                 //UUUU
2359                 if(SFX_ITEM_SET == rFmtSet.GetItemState(XATTR_FILLBMP_STRETCH, false)
2360                     || SFX_ITEM_SET == rFmtSet.GetItemState(XATTR_FILLBMP_TILE, false))
2361                 {
2362                     pStates[i] = beans::PropertyState_DIRECT_VALUE;
2363                 }
2364                 else
2365                 {
2366                     pStates[i] = beans::PropertyState_AMBIGUOUS_VALUE;
2367                 }
2368             }
2369             //UUUU for FlyFrames we need to mark all properties from type RES_BACKGROUND
2370             // as beans::PropertyState_DIRECT_VALUE to let users of this property call
2371             // getPropertyValue where the member properties will be mapped from the
2372             // fill attributes to the according SvxBrushItem entries
2373             else if(RES_BACKGROUND == pEntry->nWID && needToMapFillItemsToSvxBrushItemTypes())
2374             {
2375                 pStates[i] = beans::PropertyState_DIRECT_VALUE;
2376             }
2377             else
2378             {
2379                 if ((eType == FLYCNTTYPE_GRF) &&
2380                         pEntry && isGRFATR(pEntry->nWID))
2381                 {
2382                     const SwNodeIndex* pIdx = pFmt->GetCntnt().GetCntntIdx();
2383                     if(pIdx)
2384                     {
2385                         SwNodeIndex aIdx(*pIdx, 1);
2386                         SwNoTxtNode* pNoTxt = aIdx.GetNode().GetNoTxtNode();
2387                         SfxItemSet aSet(pNoTxt->GetSwAttrSet());
2388                         aSet.GetItemState(pEntry->nWID);
2389                         if(SFX_ITEM_SET == aSet.GetItemState( pEntry->nWID, sal_False ))
2390                             pStates[i] = beans::PropertyState_DIRECT_VALUE;
2391                     }
2392                 }
2393                 else
2394                 {
2395                     if(SFX_ITEM_SET == rFmtSet.GetItemState( pEntry->nWID, sal_False ))
2396                         pStates[i] = beans::PropertyState_DIRECT_VALUE;
2397                     else
2398                         pStates[i] = beans::PropertyState_DEFAULT_VALUE;
2399                 }
2400             }
2401         }
2402     }
2403     else if(IsDescriptor())
2404     {
2405         for(int i = 0; i < aPropertyNames.getLength(); i++)
2406             pStates[i] = beans::PropertyState_DIRECT_VALUE;
2407     }
2408     else
2409         throw uno::RuntimeException();
2410     return aStates;
2411 }
2412 
2413 void SwXFrame::setPropertyToDefault( const OUString& rPropertyName )
2414     throw(beans::UnknownPropertyException, uno::RuntimeException)
2415 {
2416     vos::OGuard aGuard(Application::GetSolarMutex());
2417     SwFrmFmt* pFmt = GetFrmFmt();
2418     if(pFmt)
2419     {
2420         const SfxItemPropertySimpleEntry* pEntry = m_pPropSet->getPropertyMap()->getByName(rPropertyName);
2421         if (!pEntry)
2422             throw beans::UnknownPropertyException(OUString ( RTL_CONSTASCII_USTRINGPARAM ( "Unknown property: " ) ) + rPropertyName, static_cast < cppu::OWeakObject * > ( this ) );
2423         if ( pEntry->nFlags & beans::PropertyAttribute::READONLY)
2424             throw uno::RuntimeException( OUString ( RTL_CONSTASCII_USTRINGPARAM ( "setPropertyToDefault: property is read-only: " ) ) + rPropertyName, static_cast < cppu::OWeakObject * > ( this ) );
2425 
2426         sal_Bool bNextFrame;
2427 
2428         if(OWN_ATTR_FILLBMP_MODE == pEntry->nWID)
2429         {
2430             //UUUU
2431             SwDoc* pDoc = pFmt->GetDoc();
2432             SfxItemSet aSet(pDoc->GetAttrPool(), XATTR_FILL_FIRST, XATTR_FILL_LAST);
2433             aSet.SetParent(&pFmt->GetAttrSet());
2434 
2435             aSet.ClearItem(XATTR_FILLBMP_STRETCH);
2436             aSet.ClearItem(XATTR_FILLBMP_TILE);
2437 
2438             pFmt->SetFmtAttr(aSet);
2439         }
2440         else if( pEntry->nWID &&
2441             pEntry->nWID != FN_UNO_ANCHOR_TYPES &&
2442             pEntry->nWID != FN_PARAM_LINK_DISPLAY_NAME)
2443         {
2444             if ( (eType == FLYCNTTYPE_GRF) && isGRFATR(pEntry->nWID) )
2445             {
2446                 const SwNodeIndex* pIdx = pFmt->GetCntnt().GetCntntIdx();
2447                 if(pIdx)
2448                 {
2449                     SwNodeIndex aIdx(*pIdx, 1);
2450                     SwNoTxtNode* pNoTxt = aIdx.GetNode().GetNoTxtNode();
2451                     {
2452                         SfxItemSet aSet(pNoTxt->GetSwAttrSet());
2453                         aSet.ClearItem(pEntry->nWID);
2454                         pNoTxt->SetAttr(aSet);
2455                     }
2456                 }
2457             }
2458             // --> OD 2009-07-13 #i73249#
2459             // Attribute AlternativeText was never published.
2460             // Now it has been replaced by Attribute Title - valid for all <SwXFrame> instances
2461 //            else if( eType != FLYCNTTYPE_FRM && FN_UNO_ALTERNATIVE_TEXT == pEntry->nWID )
2462 //            {
2463 //                const SwNodeIndex* pIdx = pFmt->GetCntnt().GetCntntIdx();
2464 //                if(pIdx)
2465 //                {
2466 //                    SwNodeIndex aIdx(*pIdx, 1);
2467 //                    SwNoTxtNode* pNoTxt = aIdx.GetNode().GetNoTxtNode();
2468 //                    pNoTxt->SetAlternateText(aEmptyStr);
2469 //                }
2470 //            }
2471             // New attribute Title
2472             else if( FN_UNO_TITLE == pEntry->nWID )
2473             {
2474                 SwFlyFrmFmt* pFlyFmt = dynamic_cast<SwFlyFrmFmt*>(pFmt);
2475                 ASSERT( pFmt,
2476                         "unexpected type of <pFmt> --> crash" );
2477                 // assure that <SdrObject> instance exists.
2478                 GetOrCreateSdrObject( pFlyFmt );
2479                 pFlyFmt->GetDoc()->SetFlyFrmTitle( *(pFlyFmt), aEmptyStr );
2480             }
2481             // New attribute Description
2482             else if( FN_UNO_DESCRIPTION == pEntry->nWID )
2483             {
2484                 SwFlyFrmFmt* pFlyFmt = dynamic_cast<SwFlyFrmFmt*>(pFmt);
2485                 ASSERT( pFmt,
2486                         "unexpected type of <pFmt> --> crash" );
2487                 // assure that <SdrObject> instance exists.
2488                 GetOrCreateSdrObject( pFlyFmt );
2489                 pFlyFmt->GetDoc()->SetFlyFrmDescription( *(pFlyFmt), aEmptyStr );
2490             }
2491             // <--
2492             else
2493             {
2494                 SwDoc* pDoc = pFmt->GetDoc();
2495                 SfxItemSet aSet( pDoc->GetAttrPool(),
2496                     RES_FRMATR_BEGIN, RES_FRMATR_END - 1 );
2497                 aSet.SetParent(&pFmt->GetAttrSet());
2498                 aSet.ClearItem(pEntry->nWID);
2499                 if(!rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_ANCHOR_TYPE)))
2500                     pFmt->SetFmtAttr(aSet);
2501             }
2502         }
2503         else if(0 != (bNextFrame = (rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_CHAIN_NEXT_NAME))))
2504                 || rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_CHAIN_PREV_NAME)))
2505         {
2506             SwDoc* pDoc = pFmt->GetDoc();
2507             if(bNextFrame)
2508                 pDoc->Unchain(*pFmt);
2509             else
2510             {
2511                 SwFmtChain aChain( pFmt->GetChain() );
2512                 SwFrmFmt *pPrev = aChain.GetPrev();
2513                 if(pPrev)
2514                     pDoc->Unchain(*pPrev);
2515             }
2516         }
2517     }
2518     else if(!IsDescriptor())
2519         throw uno::RuntimeException();
2520 
2521 }
2522 
2523 uno::Any SwXFrame::getPropertyDefault( const OUString& rPropertyName )
2524     throw(beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
2525 {
2526     vos::OGuard aGuard(Application::GetSolarMutex());
2527     uno::Any aRet;
2528     SwFrmFmt* pFmt = GetFrmFmt();
2529     if(pFmt)
2530     {
2531         const SfxItemPropertySimpleEntry* pEntry = m_pPropSet->getPropertyMap()->getByName(rPropertyName);
2532         if(pEntry)
2533         {
2534             if ( pEntry->nWID < RES_FRMATR_END )
2535             {
2536                 const SfxPoolItem& rDefItem =
2537                     pFmt->GetDoc()->GetAttrPool().GetDefaultItem(pEntry->nWID);
2538                 //UUUU
2539                 const sal_uInt8 nMemberId(pEntry->nMemberId & (~SFX_METRIC_ITEM));
2540 
2541                 rDefItem.QueryValue(aRet, nMemberId);
2542             }
2543         }
2544         else
2545             throw beans::UnknownPropertyException(OUString ( RTL_CONSTASCII_USTRINGPARAM ( "Unknown property: " ) ) + rPropertyName, static_cast < cppu::OWeakObject * > ( this ) );
2546     }
2547     else if(!IsDescriptor())
2548         throw uno::RuntimeException();
2549     return aRet;
2550 }
2551 
2552 void SwXFrame::addEventListener(const uno::Reference< lang::XEventListener > & aListener) throw( uno::RuntimeException )
2553 {
2554     if(!GetRegisteredIn())
2555         throw uno::RuntimeException();
2556     aLstnrCntnr.AddListener(aListener);
2557 }
2558 
2559 void SwXFrame::removeEventListener(const uno::Reference< lang::XEventListener > & aListener) throw( uno::RuntimeException )
2560 {
2561     if(!GetRegisteredIn() || !aLstnrCntnr.RemoveListener(aListener))
2562         throw uno::RuntimeException();
2563 }
2564 
2565 void    SwXFrame::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew)
2566 {
2567     ClientModify(this, pOld, pNew);
2568     if(!GetRegisteredIn())
2569     {
2570         mxStyleData.clear();
2571         mxStyleFamily.clear();
2572         m_pDoc = 0;
2573         aLstnrCntnr.Disposing();
2574     }
2575 }
2576 
2577 
2578 void SwXFrame::dispose(void) throw( uno::RuntimeException )
2579 {
2580     vos::OGuard aGuard(Application::GetSolarMutex());
2581     SwFrmFmt* pFmt = GetFrmFmt();
2582     if ( pFmt )
2583     {
2584         SdrObject* pObj = pFmt->FindSdrObject();
2585         // OD 11.09.2003 #112039# - add condition to perform delete of
2586         // format/anchor sign, not only if the object is inserted, but also
2587         // if a contact object is registered, which isn't in the destruction.
2588         if ( pObj &&
2589              ( pObj->IsInserted() ||
2590                ( pObj->GetUserCall() &&
2591                  !static_cast<SwContact*>(pObj->GetUserCall())->IsInDTOR() ) ) )
2592         {
2593             if (pFmt->GetAnchor().GetAnchorId() == FLY_AS_CHAR)
2594             {
2595                 const SwPosition &rPos = *(pFmt->GetAnchor().GetCntntAnchor());
2596                 SwTxtNode *pTxtNode = rPos.nNode.GetNode().GetTxtNode();
2597                 const xub_StrLen nIdx = rPos.nContent.GetIndex();
2598                 pTxtNode->DeleteAttributes( RES_TXTATR_FLYCNT, nIdx, nIdx );
2599             }
2600             else
2601                 pFmt->GetDoc()->DelLayoutFmt(pFmt);
2602         }
2603     }
2604 
2605 }
2606 
2607 uno::Reference< text::XTextRange >  SwXFrame::getAnchor(void) throw( uno::RuntimeException )
2608 {
2609     vos::OGuard aGuard(Application::GetSolarMutex());
2610     uno::Reference< text::XTextRange >  aRef;
2611     SwFrmFmt* pFmt = GetFrmFmt();
2612     if(pFmt)
2613     {
2614         const SwFmtAnchor& rAnchor = pFmt->GetAnchor();
2615         // return an anchor for non-page bound frames
2616         // and for page bound frames that have a page no == NULL and a content position
2617         if ((rAnchor.GetAnchorId() != FLY_AT_PAGE) ||
2618             (rAnchor.GetCntntAnchor() && !rAnchor.GetPageNum()))
2619         {
2620             const SwPosition &rPos = *(rAnchor.GetCntntAnchor());
2621             aRef = SwXTextRange::CreateXTextRange(*pFmt->GetDoc(), rPos, 0);
2622         }
2623     }
2624     else
2625         throw uno::RuntimeException();
2626     return aRef;
2627 }
2628 
2629 void SwXFrame::ResetDescriptor()
2630 {
2631     bIsDescriptor = sal_False;
2632     mxStyleData.clear();
2633     mxStyleFamily.clear();
2634     DELETEZ(pProps);
2635 }
2636 
2637 void SwXFrame::attachToRange(const uno::Reference< text::XTextRange > & xTextRange)
2638             throw( lang::IllegalArgumentException, uno::RuntimeException )
2639 {
2640     vos::OGuard aGuard(Application::GetSolarMutex());
2641     if(!IsDescriptor())
2642         throw uno::RuntimeException();
2643     uno::Reference<lang::XUnoTunnel> xRangeTunnel( xTextRange, uno::UNO_QUERY);
2644     SwXTextRange* pRange = 0;
2645     OTextCursorHelper* pCursor = 0;
2646     if(xRangeTunnel.is())
2647     {
2648         pRange  = reinterpret_cast< SwXTextRange * >(
2649                 sal::static_int_cast< sal_IntPtr >( xRangeTunnel->getSomething( SwXTextRange::getUnoTunnelId()) ));
2650         pCursor = reinterpret_cast< OTextCursorHelper * >(
2651                 sal::static_int_cast< sal_IntPtr >( xRangeTunnel->getSomething( OTextCursorHelper::getUnoTunnelId()) ));
2652     }
2653 
2654     SwDoc* pDoc = pRange ? (SwDoc*)pRange->GetDoc() : pCursor ? (SwDoc*)pCursor->GetDoc() : 0;
2655     if(pDoc)
2656     {
2657         SwUnoInternalPaM aIntPam(*pDoc);
2658         //das muss jetzt sal_True liefern
2659         ::sw::XTextRangeToSwPaM(aIntPam, xTextRange);
2660 
2661         SwNode& rNode = pDoc->GetNodes().GetEndOfContent();
2662         SwPaM aPam(rNode);
2663         aPam.Move( fnMoveBackward, fnGoDoc );
2664         static sal_uInt16 __READONLY_DATA aFrmAttrRange[] =
2665         {
2666             RES_FRMATR_BEGIN,       RES_FRMATR_END-1,
2667             RES_UNKNOWNATR_CONTAINER, RES_UNKNOWNATR_CONTAINER,
2668 
2669             //UUUU FillAttribute support
2670             XATTR_FILL_FIRST, XATTR_FILL_LAST,
2671 
2672             SID_ATTR_BORDER_INNER,  SID_ATTR_BORDER_INNER,
2673             0
2674         };
2675         static sal_uInt16 __READONLY_DATA aGrAttrRange[] =
2676         {
2677             RES_GRFATR_BEGIN,       RES_GRFATR_END-1,
2678             0
2679         };
2680         SfxItemSet aGrSet(pDoc->GetAttrPool(), aGrAttrRange );
2681 
2682         SfxItemSet aFrmSet(pDoc->GetAttrPool(), aFrmAttrRange );
2683         //jetzt muessen die passenden Items in den Set
2684         sal_Bool bSizeFound;
2685         if(!pProps->AnyToItemSet( pDoc, aFrmSet, aGrSet, bSizeFound))
2686             throw lang::IllegalArgumentException();
2687         //der TextRange wird einzeln behandelt
2688         *aPam.GetPoint() = *aIntPam.GetPoint();
2689         if(aIntPam.HasMark())
2690         {
2691             aPam.SetMark();
2692             *aPam.GetMark() = *aIntPam.GetMark();
2693         }
2694 
2695         const SfxPoolItem* pItem;
2696         RndStdIds eAnchorId = FLY_AT_PARA;
2697         if(SFX_ITEM_SET == aFrmSet.GetItemState(RES_ANCHOR, sal_False, &pItem) )
2698         {
2699             eAnchorId = ((const SwFmtAnchor*)pItem)->GetAnchorId();
2700             if( FLY_AT_FLY == eAnchorId &&
2701                 !aPam.GetNode()->FindFlyStartNode())
2702             {
2703                 //rahmengebunden geht nur dort, wo ein Rahmen ist!
2704                 SwFmtAnchor aAnchor(FLY_AT_PARA);
2705                 aFrmSet.Put(aAnchor);
2706             }
2707             else if ((FLY_AT_PAGE == eAnchorId) &&
2708                      0 == ((const SwFmtAnchor*)pItem)->GetPageNum() )
2709             {
2710                 SwFmtAnchor aAnchor( *((const SwFmtAnchor*)pItem) );
2711                 aAnchor.SetAnchor( aPam.GetPoint() );
2712                 aFrmSet.Put(aAnchor);
2713             }
2714         }
2715 
2716         const ::uno::Any* pStyle;
2717         SwFrmFmt *pParentFrmFmt = 0;
2718         if(pProps->GetProperty(FN_UNO_FRAME_STYLE_NAME, 0, pStyle))
2719             pParentFrmFmt = lcl_GetFrmFmt( *pStyle, pDoc );
2720 
2721         SwFlyFrmFmt* pFmt = 0;
2722         if( eType == FLYCNTTYPE_FRM)
2723         {
2724             UnoActionContext aCont(pDoc);
2725             if(m_pCopySource)
2726             {
2727                 SwFmtAnchor* pAnchorItem = 0;
2728                 // the frame is inserted bound to page
2729                 // to prevent conflicts if the to-be-anchored position is part of the to-be-copied text
2730                 if (eAnchorId != FLY_AT_PAGE)
2731                 {
2732                     pAnchorItem = static_cast<SwFmtAnchor*>(aFrmSet.Get(RES_ANCHOR).Clone());
2733                     aFrmSet.Put( SwFmtAnchor( FLY_AT_PAGE, 1 ));
2734                 }
2735 
2736                 aPam.DeleteMark(); // mark position node will be deleted!
2737                 aIntPam.DeleteMark(); // mark position node will be deleted!
2738                 pFmt = pDoc->MakeFlyAndMove( *m_pCopySource, aFrmSet,
2739                                0,
2740                                pParentFrmFmt );
2741                 if(pAnchorItem && pFmt)
2742                 {
2743                     pFmt->DelFrms();
2744                     pAnchorItem->SetAnchor( m_pCopySource->Start() );
2745                     SfxItemSet aAnchorSet( pDoc->GetAttrPool(), RES_ANCHOR, RES_ANCHOR );
2746                     aAnchorSet.Put( *pAnchorItem );
2747                     pDoc->SetFlyFrmAttr( *pFmt, aAnchorSet );
2748                     delete pAnchorItem;
2749                 }
2750                 DELETEZ( m_pCopySource );
2751             }
2752             else
2753             {
2754                 pFmt = pDoc->MakeFlySection( FLY_AT_PARA, aPam.GetPoint(),
2755                                          &aFrmSet, pParentFrmFmt );
2756             }
2757             if(pFmt)
2758             {
2759                 pFmt->Add(this);
2760                 if(sName.Len())
2761                     pDoc->SetFlyName((SwFlyFrmFmt&)*pFmt, sName);
2762             }
2763             //den SwXText wecken
2764             ((SwXTextFrame*)this)->SetDoc( bIsDescriptor ? m_pDoc : GetFrmFmt()->GetDoc() );
2765         }
2766         else if( eType == FLYCNTTYPE_GRF)
2767         {
2768             UnoActionContext aCont(pDoc);
2769             const ::uno::Any* pGraphicURL;
2770             String sGraphicURL;
2771             GraphicObject *pGrfObj = 0;
2772             if(pProps->GetProperty(FN_UNO_GRAPHIC_U_R_L, 0, pGraphicURL))
2773             {
2774                 OUString uTemp;
2775                 (*pGraphicURL) >>= uTemp;
2776                 sGraphicURL = String(uTemp);
2777                 if( sGraphicURL.EqualsAscii( sPackageProtocol,
2778                                              0, sizeof( sPackageProtocol )-1 ) )
2779                 {
2780                     pGrfObj = new GraphicObject;
2781                     pGrfObj->SetUserData( sGraphicURL );
2782                     pGrfObj->SetSwapState();
2783                     sGraphicURL.Erase();
2784                 }
2785                 else if( sGraphicURL.EqualsAscii( sGraphicObjectProtocol,
2786                                        0, sizeof(sGraphicObjectProtocol)-1 ) )
2787                 {
2788                     ByteString sId( sGraphicURL.Copy( sizeof(sGraphicObjectProtocol)-1 ),
2789                                     RTL_TEXTENCODING_ASCII_US );
2790                     pGrfObj = new GraphicObject( sId );
2791                     sGraphicURL.Erase();
2792                 }
2793             }
2794             Graphic aGraphic;
2795             const ::uno::Any* pGraphic;
2796             if( pProps->GetProperty( FN_UNO_GRAPHIC, 0, pGraphic ))
2797             {
2798                 uno::Reference< graphic::XGraphic > xGraphic;
2799                 (*pGraphic) >>= xGraphic;
2800                 aGraphic = Graphic( xGraphic );
2801             }
2802 
2803             String sFltName;
2804             const ::uno::Any* pFilter;
2805             if(pProps->GetProperty(FN_UNO_GRAPHIC_FILTER, 0, pFilter))
2806             {
2807                 OUString uTemp;
2808                 (*pFilter) >>= uTemp;
2809                 sFltName = String(uTemp);
2810             }
2811 
2812             pFmt =
2813                 pGrfObj ? pDoc->Insert( aPam, *pGrfObj, &aFrmSet, &aGrSet,
2814                                         pParentFrmFmt )
2815                         : pDoc->Insert( aPam, sGraphicURL, sFltName, &aGraphic,
2816                                         &aFrmSet, &aGrSet, pParentFrmFmt  );
2817             delete pGrfObj;
2818             if(pFmt)
2819             {
2820                 SwGrfNode *pGrfNd = pDoc->GetNodes()[ pFmt->GetCntnt().GetCntntIdx()
2821                                             ->GetIndex()+1 ]->GetGrfNode();
2822                 pGrfNd->SetChgTwipSize( !bSizeFound );
2823                 pFmt->Add(this);
2824                 if(sName.Len())
2825                     pDoc->SetFlyName((SwFlyFrmFmt&)*pFmt, sName);
2826 
2827             }
2828             const ::uno::Any* pSurroundContour;
2829             if(pProps->GetProperty(RES_SURROUND, MID_SURROUND_CONTOUR, pSurroundContour))
2830                 setPropertyValue(C2U(SW_PROP_NAME_STR(UNO_NAME_SURROUND_CONTOUR)), *pSurroundContour);
2831             const ::uno::Any* pContourOutside;
2832             if(pProps->GetProperty(RES_SURROUND, MID_SURROUND_CONTOUROUTSIDE, pContourOutside))
2833                 setPropertyValue(C2U(SW_PROP_NAME_STR(UNO_NAME_CONTOUR_OUTSIDE)), *pContourOutside);
2834             const ::uno::Any* pContourPoly;
2835             if(pProps->GetProperty(FN_PARAM_COUNTOUR_PP, 0, pContourPoly))
2836                 setPropertyValue(C2U(SW_PROP_NAME_STR(UNO_NAME_CONTOUR_POLY_POLYGON)), *pContourPoly);
2837             const ::uno::Any* pPixelContour;
2838             if(pProps->GetProperty(FN_UNO_IS_PIXEL_CONTOUR, 0, pPixelContour))
2839                 setPropertyValue(C2U(SW_PROP_NAME_STR(UNO_NAME_IS_PIXEL_CONTOUR)), *pPixelContour);
2840             const ::uno::Any* pAutoContour;
2841             if(pProps->GetProperty(FN_UNO_IS_AUTOMATIC_CONTOUR, 0, pAutoContour))
2842                 setPropertyValue(C2U(SW_PROP_NAME_STR(UNO_NAME_IS_AUTOMATIC_CONTOUR)), *pAutoContour);
2843 //            const ::uno::Any* pAltText;
2844 //            if(pProps->GetProperty(FN_UNO_ALTERNATIVE_TEXT, 0, pAltText))
2845 //                setPropertyValue(C2U(SW_PROP_NAME_STR(UNO_NAME_ALTERNATIVE_TEXT)), *pAltText);
2846         }
2847         else
2848         {
2849             const ::uno::Any* pCLSID = 0;
2850             const ::uno::Any* pStreamName = 0;
2851             if(!pProps->GetProperty(FN_UNO_CLSID, 0, pCLSID) && !pProps->GetProperty( FN_UNO_STREAM_NAME, 0, pStreamName ))
2852                 throw uno::RuntimeException();
2853             if(pCLSID)
2854             {
2855                 OUString aCLSID;
2856                 SvGlobalName aClassName;
2857                 uno::Reference < embed::XEmbeddedObject > xIPObj;
2858                 std::auto_ptr < comphelper::EmbeddedObjectContainer > pCnt;
2859                 if( (*pCLSID) >>= aCLSID )
2860                 {
2861                     if( !aClassName.MakeId( aCLSID ) )
2862                     {
2863                         lang::IllegalArgumentException aExcept;
2864                         aExcept.Message = OUString::createFromAscii("CLSID invalid");
2865                         throw aExcept;
2866                     }
2867 
2868                     pCnt.reset( new comphelper::EmbeddedObjectContainer );
2869                     ::rtl::OUString aName;
2870                     xIPObj = pCnt->CreateEmbeddedObject( aClassName.GetByteSequence(), aName );
2871                 }
2872                 if ( xIPObj.is() )
2873                 {
2874                     //TODO/LATER: MISCSTATUS_RESIZEONPRINTERCHANGE
2875                     //if( SVOBJ_MISCSTATUS_RESIZEONPRINTERCHANGE & xIPObj->GetMiscStatus() && pDoc->getPrinter( false ) )
2876                     //    xIPObj->OnDocumentPrinterChanged( pDoc->getPrinter( false ) );
2877 
2878                     UnoActionContext aAction(pDoc);
2879                     pDoc->GetIDocumentUndoRedo().StartUndo(UNDO_INSERT, NULL);
2880                     if(!bSizeFound)
2881                     {
2882                         //TODO/LATER: from where do I get a ViewAspect? And how do I transport it to the OLENode?
2883                         sal_Int64 nAspect = embed::Aspects::MSOLE_CONTENT;
2884 
2885                         // TODO/LEAN: VisualArea still needs running state
2886                         svt::EmbeddedObjectRef::TryRunningState( xIPObj );
2887 
2888                         // set parent to get correct VisArea(in case of object needing parent printer)
2889                         uno::Reference < container::XChild > xChild( xIPObj, uno::UNO_QUERY );
2890                         if ( xChild.is() )
2891                             xChild->setParent( pDoc->GetDocShell()->GetModel() );
2892 
2893                         //The Size should be suggested by the OLE server if not manually set
2894                         MapUnit aRefMap = VCLUnoHelper::UnoEmbed2VCLMapUnit( xIPObj->getMapUnit( nAspect ) );
2895                         awt::Size aSize;
2896                         try
2897                         {
2898                             aSize = xIPObj->getVisualAreaSize( nAspect );
2899                         }
2900                         catch ( embed::NoVisualAreaSizeException& )
2901                         {
2902                             // the default size will be set later
2903                         }
2904 
2905                         Size aSz( aSize.Width, aSize.Height );
2906                         if ( !aSz.Width() || !aSz.Height() )
2907                         {
2908                             aSz.Width() = aSz.Height() = 5000;
2909                             aSz = OutputDevice::LogicToLogic
2910                                                     ( aSz, MapMode( MAP_100TH_MM ), aRefMap );
2911                         }
2912                         MapMode aMyMap( MAP_TWIP );
2913                         aSz = OutputDevice::LogicToLogic( aSz, aRefMap, aMyMap );
2914                         SwFmtFrmSize aFrmSz;
2915                         aFrmSz.SetSize(aSz);
2916                         aFrmSet.Put(aFrmSz);
2917                     }
2918                     SwFlyFrmFmt* pFmt2 = 0;
2919 
2920                     // TODO/LATER: Is it the only possible aspect here?
2921                     sal_Int64 nAspect = embed::Aspects::MSOLE_CONTENT;
2922                     ::svt::EmbeddedObjectRef xObjRef( xIPObj, nAspect );
2923                     pFmt2 = pDoc->Insert(aPam, xObjRef, &aFrmSet, NULL, NULL );
2924                     ASSERT( pFmt2, "Doc->Insert(notxt) failed." );
2925 
2926                     pDoc->GetIDocumentUndoRedo().EndUndo(UNDO_INSERT, NULL);
2927                     pFmt2->Add(this);
2928                     if(sName.Len())
2929                         pDoc->SetFlyName((SwFlyFrmFmt&)*pFmt2, sName);
2930                 }
2931             }
2932             else if( pStreamName )
2933             {
2934                 ::rtl::OUString sStreamName;
2935                 (*pStreamName) >>= sStreamName;
2936                 pDoc->GetIDocumentUndoRedo().StartUndo(UNDO_INSERT, NULL);
2937 
2938                 SwFlyFrmFmt* pFrmFmt = 0;
2939                 pFrmFmt = pDoc->InsertOLE( aPam, sStreamName, embed::Aspects::MSOLE_CONTENT, &aFrmSet, NULL, NULL );
2940                 pDoc->GetIDocumentUndoRedo().EndUndo(UNDO_INSERT, NULL);
2941                 pFrmFmt->Add(this);
2942                 if(sName.Len())
2943                     pDoc->SetFlyName((SwFlyFrmFmt&)*pFrmFmt, sName);
2944             }
2945         }
2946         if( pFmt && pDoc->GetDrawModel() )
2947             GetOrCreateSdrObject( pFmt );
2948         const ::uno::Any* pOrder;
2949         if( pProps->GetProperty(FN_UNO_Z_ORDER, 0, pOrder) )
2950             setPropertyValue(C2U(SW_PROP_NAME_STR(UNO_NAME_Z_ORDER)), *pOrder);
2951         const ::uno::Any* pReplacement;
2952         if( pProps->GetProperty(FN_UNO_REPLACEMENT_GRAPHIC, 0, pReplacement) )
2953             setPropertyValue(C2U(SW_PROP_NAME_STR(UNO_NAME_GRAPHIC)), *pReplacement);
2954         // --> OD 2009-07-13 #i73249#
2955         // new attribute Title
2956         const ::uno::Any* pTitle;
2957         if ( pProps->GetProperty(FN_UNO_TITLE, 0, pTitle) )
2958         {
2959             setPropertyValue(C2U(SW_PROP_NAME_STR(UNO_NAME_TITLE)), *pTitle);
2960         }
2961         // new attribute Description
2962         const ::uno::Any* pDescription;
2963         if ( pProps->GetProperty(FN_UNO_DESCRIPTION, 0, pDescription) )
2964         {
2965             setPropertyValue(C2U(SW_PROP_NAME_STR(UNO_NAME_DESCRIPTION)), *pDescription);
2966         }
2967         // <--
2968     }
2969     else
2970         throw lang::IllegalArgumentException();
2971     //setzt das Flag zurueck und loescht den Descriptor-Pointer
2972     ResetDescriptor();
2973 }
2974 
2975 void SwXFrame::attach(const uno::Reference< text::XTextRange > & xTextRange)
2976     throw( lang::IllegalArgumentException, uno::RuntimeException )
2977 {
2978     SwFrmFmt* pFmt;
2979     if(IsDescriptor())
2980         attachToRange(xTextRange);
2981     else if(0 != (pFmt = GetFrmFmt()))
2982     {
2983         uno::Reference<lang::XUnoTunnel> xRangeTunnel( xTextRange, uno::UNO_QUERY);
2984         SwXTextRange* pRange = 0;
2985         OTextCursorHelper* pCursor = 0;
2986         if(xRangeTunnel.is())
2987         {
2988             pRange  = reinterpret_cast< SwXTextRange * >(
2989                     sal::static_int_cast< sal_IntPtr >( xRangeTunnel->getSomething( SwXTextRange::getUnoTunnelId()) ));
2990             pCursor = reinterpret_cast< OTextCursorHelper * >(
2991                     sal::static_int_cast< sal_IntPtr >( xRangeTunnel->getSomething( OTextCursorHelper::getUnoTunnelId()) ));
2992         }
2993         SwDoc* pDoc = pFmt->GetDoc();
2994         SwUnoInternalPaM aIntPam(*pDoc);
2995         if (::sw::XTextRangeToSwPaM(aIntPam, xTextRange))
2996         {
2997             SfxItemSet aSet( pDoc->GetAttrPool(),
2998                         RES_ANCHOR, RES_ANCHOR );
2999             aSet.SetParent(&pFmt->GetAttrSet());
3000             SwFmtAnchor aAnchor = (const SwFmtAnchor&)aSet.Get(RES_ANCHOR);
3001             aAnchor.SetAnchor( aIntPam.Start() );
3002             aSet.Put(aAnchor);
3003             pDoc->SetFlyFrmAttr( *pFmt, aSet );
3004         }
3005         else
3006             throw lang::IllegalArgumentException();
3007     }
3008 }
3009 
3010 awt::Point SwXFrame::getPosition(void) throw( uno::RuntimeException )
3011 {
3012     vos::OGuard aGuard(Application::GetSolarMutex());
3013     uno::RuntimeException aRuntime;
3014     aRuntime.Message = C2U("position cannot be determined with this method");
3015     throw aRuntime;
3016 }
3017 
3018 void SwXFrame::setPosition(const awt::Point& /*aPosition*/) throw( uno::RuntimeException )
3019 {
3020     vos::OGuard aGuard(Application::GetSolarMutex());
3021     uno::RuntimeException aRuntime;
3022     aRuntime.Message = C2U("position cannot be changed with this method");
3023     throw aRuntime;
3024 }
3025 
3026 awt::Size SwXFrame::getSize(void) throw( uno::RuntimeException )
3027 {
3028     const ::uno::Any aVal = getPropertyValue(C2U("Size"));
3029     awt::Size* pRet =  (awt::Size*)aVal.getValue();
3030     return *pRet;
3031 }
3032 
3033 void SwXFrame::setSize(const awt::Size& aSize)
3034     throw( beans::PropertyVetoException, uno::RuntimeException )
3035 {
3036     const ::uno::Any aVal(&aSize, ::getCppuType(static_cast<const awt::Size*>(0)));
3037     setPropertyValue(C2U("Size"), aVal);
3038 }
3039 
3040 OUString SwXFrame::getShapeType(void) throw( uno::RuntimeException )
3041 {
3042     return C2U("FrameShape");
3043 }
3044 
3045 
3046 /******************************************************************
3047  *  SwXTextFrame
3048  ******************************************************************/
3049 
3050 SwXTextFrame::SwXTextFrame( SwDoc *_pDoc ) :
3051     SwXText(0, CURSOR_FRAME),
3052     SwXFrame(FLYCNTTYPE_FRM, aSwMapProvider.GetPropertySet(PROPERTY_MAP_TEXT_FRAME), _pDoc )
3053 {
3054 }
3055 
3056 SwXTextFrame::SwXTextFrame(SwFrmFmt& rFmt) :
3057     SwXText(rFmt.GetDoc(), CURSOR_FRAME),
3058     SwXFrame(rFmt, FLYCNTTYPE_FRM, aSwMapProvider.GetPropertySet(PROPERTY_MAP_TEXT_FRAME))
3059 {
3060 
3061 }
3062 
3063 SwXTextFrame::~SwXTextFrame()
3064 {
3065 }
3066 
3067 void SAL_CALL SwXTextFrame::acquire(  )throw()
3068 {
3069     SwXFrame::acquire();
3070 }
3071 
3072 void SAL_CALL SwXTextFrame::release(  )throw()
3073 {
3074     SwXFrame::release();
3075 }
3076 
3077 ::uno::Any SAL_CALL SwXTextFrame::queryInterface( const uno::Type& aType )
3078     throw (uno::RuntimeException)
3079 {
3080     ::uno::Any aRet = SwXFrame::queryInterface(aType);
3081     if(aRet.getValueType() == ::getCppuVoidType())
3082         aRet = SwXText::queryInterface(aType);
3083     if(aRet.getValueType() == ::getCppuVoidType())
3084         aRet = SwXTextFrameBaseClass::queryInterface(aType);
3085     return aRet;
3086 }
3087 
3088 uno::Sequence< uno::Type > SAL_CALL SwXTextFrame::getTypes(  ) throw(uno::RuntimeException)
3089 {
3090     uno::Sequence< uno::Type > aTextFrameTypes = SwXTextFrameBaseClass::getTypes();
3091     uno::Sequence< uno::Type > aFrameTypes = SwXFrame::getTypes();
3092     uno::Sequence< uno::Type > aTextTypes = SwXText::getTypes();
3093 
3094     long nIndex = aTextFrameTypes.getLength();
3095     aTextFrameTypes.realloc(
3096         aTextFrameTypes.getLength() +
3097         aFrameTypes.getLength() +
3098         aTextTypes.getLength());
3099 
3100     uno::Type* pTextFrameTypes = aTextFrameTypes.getArray();
3101     const uno::Type* pFrameTypes = aFrameTypes.getConstArray();
3102     long nPos;
3103     for(nPos = 0; nPos <aFrameTypes.getLength(); nPos++)
3104         pTextFrameTypes[nIndex++] = pFrameTypes[nPos];
3105 
3106     const uno::Type* pTextTypes = aTextTypes.getConstArray();
3107     for(nPos = 0; nPos <aTextTypes.getLength(); nPos++)
3108         pTextFrameTypes[nIndex++] = pTextTypes[nPos];
3109 
3110     return aTextFrameTypes;
3111 }
3112 
3113 uno::Sequence< sal_Int8 > SAL_CALL SwXTextFrame::getImplementationId(  ) throw(uno::RuntimeException)
3114 {
3115     vos::OGuard aGuard(Application::GetSolarMutex());
3116     static uno::Sequence< sal_Int8 > aId( 16 );
3117     static sal_Bool bInit = sal_False;
3118     if(!bInit)
3119     {
3120         rtl_createUuid( (sal_uInt8 *)(aId.getArray() ), 0, sal_True );
3121         bInit = sal_True;
3122     }
3123     return aId;
3124 }
3125 
3126 uno::Reference< text::XText >  SwXTextFrame::getText(void) throw( uno::RuntimeException )
3127 {
3128     return this;
3129 }
3130 
3131 const SwStartNode *SwXTextFrame::GetStartNode() const
3132 {
3133     const SwStartNode *pSttNd = 0;
3134 
3135     SwFrmFmt* pFmt = GetFrmFmt();
3136     if(pFmt)
3137     {
3138         const SwFmtCntnt& rFlyCntnt = pFmt->GetCntnt();
3139         if( rFlyCntnt.GetCntntIdx() )
3140             pSttNd = rFlyCntnt.GetCntntIdx()->GetNode().GetStartNode();
3141     }
3142 
3143     return pSttNd;
3144 }
3145 
3146 uno::Reference< text::XTextCursor >
3147 SwXTextFrame::CreateCursor() throw (uno::RuntimeException)
3148 {
3149     return createTextCursor();
3150 }
3151 
3152 uno::Reference< text::XTextCursor >  SwXTextFrame::createTextCursor(void) throw( uno::RuntimeException )
3153 {
3154     vos::OGuard aGuard(Application::GetSolarMutex());
3155     uno::Reference< text::XTextCursor >  aRef;
3156     SwFrmFmt* pFmt = GetFrmFmt();
3157     if(pFmt)
3158     {
3159         //save current start node to be able to check if there is content after the table -
3160         //otherwise the cursor would be in the body text!
3161         const SwNode& rNode = pFmt->GetCntnt().GetCntntIdx()->GetNode();
3162         const SwStartNode* pOwnStartNode = rNode.FindSttNodeByType(SwFlyStartNode);
3163 
3164         SwPaM aPam(rNode);
3165         aPam.Move(fnMoveForward, fnGoNode);
3166         SwTableNode* pTblNode = aPam.GetNode()->FindTableNode();
3167         SwCntntNode* pCont = 0;
3168         while( pTblNode )
3169         {
3170             aPam.GetPoint()->nNode = *pTblNode->EndOfSectionNode();
3171             pCont = GetDoc()->GetNodes().GoNext(&aPam.GetPoint()->nNode);
3172             pTblNode = pCont->FindTableNode();
3173         }
3174         if(pCont)
3175             aPam.GetPoint()->nContent.Assign(pCont, 0);
3176 
3177         const SwStartNode* pNewStartNode =
3178             aPam.GetNode()->FindSttNodeByType(SwFlyStartNode);
3179         if(!pNewStartNode || pNewStartNode != pOwnStartNode)
3180         {
3181             uno::RuntimeException aExcept;
3182             aExcept.Message = C2U("no text available");
3183             throw aExcept;
3184         }
3185 
3186         SwXTextCursor *const pXCursor = new SwXTextCursor(
3187                  *pFmt->GetDoc(), this, CURSOR_FRAME, *aPam.GetPoint());
3188         aRef =  static_cast<text::XWordCursor*>(pXCursor);
3189 #if OSL_DEBUG_LEVEL > 1
3190         SwUnoCrsr *const pUnoCrsr = pXCursor->GetCursor();
3191         (void) pUnoCrsr;
3192 #endif
3193     }
3194     else
3195         throw uno::RuntimeException();
3196     return aRef;
3197 }
3198 
3199 uno::Reference< text::XTextCursor >  SwXTextFrame::createTextCursorByRange(const uno::Reference< text::XTextRange > & aTextPosition) throw( uno::RuntimeException )
3200 {
3201     vos::OGuard aGuard(Application::GetSolarMutex());
3202     uno::Reference< text::XTextCursor >  aRef;
3203     SwFrmFmt* pFmt = GetFrmFmt();
3204     SwUnoInternalPaM aPam(*GetDoc());
3205     if (pFmt && ::sw::XTextRangeToSwPaM(aPam, aTextPosition))
3206     {
3207         SwNode& rNode = pFmt->GetCntnt().GetCntntIdx()->GetNode();
3208 #if OSL_DEBUG_LEVEL > 1
3209         const SwStartNode* p1 = aPam.GetNode()->FindFlyStartNode();
3210         const SwStartNode* p2 = rNode.FindFlyStartNode();
3211         (void)p1;
3212         (void)p2;
3213 #endif
3214         if(aPam.GetNode()->FindFlyStartNode() == rNode.FindFlyStartNode())
3215         {
3216             aRef = static_cast<text::XWordCursor*>(
3217                     new SwXTextCursor(*pFmt->GetDoc(), this, CURSOR_FRAME,
3218                         *aPam.GetPoint(), aPam.GetMark()));
3219         }
3220     }
3221     else
3222         throw uno::RuntimeException();
3223     return aRef;
3224 }
3225 
3226 uno::Reference< container::XEnumeration >  SwXTextFrame::createEnumeration(void) throw( uno::RuntimeException )
3227 {
3228     vos::OGuard aGuard(Application::GetSolarMutex());
3229     uno::Reference< container::XEnumeration >  aRef;
3230     SwFrmFmt* pFmt = GetFrmFmt();
3231     if(pFmt)
3232     {
3233         SwPosition aPos(pFmt->GetCntnt().GetCntntIdx()->GetNode());
3234         ::std::auto_ptr<SwUnoCrsr> pUnoCursor(
3235                 GetDoc()->CreateUnoCrsr(aPos, sal_False));
3236         pUnoCursor->Move(fnMoveForward, fnGoNode);
3237 //      // no Cursor in protected sections
3238 //      SwCrsrSaveState aSave( *pUnoCrsr );
3239 //      if(pUnoCrsr->IsInProtectTable( sal_True ) ||
3240 //          pUnoCrsr->IsSelOvr( SELOVER_TOGGLE | SELOVER_CHANGEPOS ))
3241 //          throw  uno::RuntimeException() );
3242         aRef = new SwXParagraphEnumeration(this, pUnoCursor, CURSOR_FRAME);
3243     }
3244     return aRef;
3245 }
3246 
3247 uno::Type  SwXTextFrame::getElementType(void) throw( uno::RuntimeException )
3248 {
3249     return ::getCppuType(static_cast<uno::Reference<text::XTextRange>*>(0));
3250 }
3251 
3252 sal_Bool SwXTextFrame::hasElements(void) throw( uno::RuntimeException )
3253 {
3254     return sal_True;
3255 }
3256 
3257 void SwXTextFrame::attach(const uno::Reference< text::XTextRange > & xTextRange)
3258     throw( lang::IllegalArgumentException, uno::RuntimeException )
3259 {
3260     SwXFrame::attach(xTextRange);
3261 }
3262 
3263 uno::Reference< text::XTextRange >  SwXTextFrame::getAnchor(void) throw( uno::RuntimeException )
3264 {
3265     vos::OGuard aGuard(Application::GetSolarMutex());
3266     return SwXFrame::getAnchor();
3267 }
3268 
3269 void SwXTextFrame::dispose(void) throw( uno::RuntimeException )
3270 {
3271     vos::OGuard aGuard(Application::GetSolarMutex());
3272     SwXFrame::dispose();
3273 }
3274 
3275 void SwXTextFrame::addEventListener(const uno::Reference< lang::XEventListener > & aListener) throw( uno::RuntimeException )
3276 {
3277     SwXFrame::addEventListener(aListener);
3278 }
3279 
3280 void SwXTextFrame::removeEventListener(const uno::Reference< lang::XEventListener > & aListener) throw( uno::RuntimeException )
3281 {
3282     SwXFrame::removeEventListener(aListener);
3283 }
3284 
3285 OUString SwXTextFrame::getImplementationName(void) throw( uno::RuntimeException )
3286 {
3287     return C2U("SwXTextFrame");
3288 }
3289 
3290 sal_Bool SwXTextFrame::supportsService(const OUString& rServiceName) throw( uno::RuntimeException )
3291 {
3292     return COMPARE_EQUAL == rServiceName.compareToAscii("com.sun.star.text.Text")||
3293             COMPARE_EQUAL == rServiceName.compareToAscii("com.sun.star.text.TextFrame")||
3294                     SwXFrame::supportsService(rServiceName);
3295 }
3296 
3297 uno::Sequence< OUString > SwXTextFrame::getSupportedServiceNames(void) throw( uno::RuntimeException )
3298 {
3299     uno::Sequence < OUString > aRet = SwXFrame::getSupportedServiceNames();
3300     aRet.realloc(aRet.getLength() + 2);
3301     OUString* pArray = aRet.getArray();
3302     pArray[aRet.getLength() - 2] = C2U("com.sun.star.text.TextFrame");
3303     pArray[aRet.getLength() - 1] = C2U("com.sun.star.text.Text");
3304     return aRet;
3305 }
3306 
3307 void * SAL_CALL SwXTextFrame::operator new( size_t t) throw()
3308 {
3309     return SwXTextFrameBaseClass::operator new( t);
3310 }
3311 
3312 void SAL_CALL SwXTextFrame::operator delete( void * p) throw()
3313 {
3314     SwXTextFrameBaseClass::operator delete(p);
3315 }
3316 
3317 uno::Reference<container::XNameReplace > SAL_CALL SwXTextFrame::getEvents()
3318     throw(uno::RuntimeException)
3319 {
3320     return new SwFrameEventDescriptor( *this );
3321 }
3322 
3323 sal_Int64 SAL_CALL SwXTextFrame::getSomething( const uno::Sequence< sal_Int8 >& rId )
3324     throw(uno::RuntimeException)
3325 {
3326     sal_Int64 nRet = SwXFrame::getSomething( rId );
3327     if( !nRet )
3328         nRet = SwXText::getSomething( rId );
3329 
3330     return nRet;
3331 }
3332 
3333 ::uno::Any SwXTextFrame::getPropertyValue(const OUString& rPropertyName)
3334     throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
3335 {
3336     vos::OGuard aGuard(Application::GetSolarMutex());
3337     ::uno::Any aRet;
3338     if(rPropertyName.equalsAsciiL(SW_PROP_NAME(UNO_NAME_START_REDLINE))||
3339             rPropertyName.equalsAsciiL(SW_PROP_NAME(UNO_NAME_END_REDLINE)))
3340     {
3341         //redline can only be returned if it's a living object
3342         if(!IsDescriptor())
3343             aRet = SwXText::getPropertyValue(rPropertyName);
3344     }
3345     else
3346         aRet = SwXFrame::getPropertyValue(rPropertyName);
3347     return aRet;
3348 }
3349 /******************************************************************
3350  *  SwXTextGraphicObject
3351  ******************************************************************/
3352 
3353 SwXTextGraphicObject::SwXTextGraphicObject( SwDoc *pDoc ) :
3354     SwXFrame(FLYCNTTYPE_GRF, aSwMapProvider.GetPropertySet(PROPERTY_MAP_TEXT_GRAPHIC), pDoc)
3355 {
3356 }
3357 
3358 SwXTextGraphicObject::SwXTextGraphicObject(SwFrmFmt& rFmt) :
3359     SwXFrame(rFmt, FLYCNTTYPE_GRF, aSwMapProvider.GetPropertySet(PROPERTY_MAP_TEXT_GRAPHIC))
3360 {
3361 
3362 }
3363 
3364 SwXTextGraphicObject::~SwXTextGraphicObject()
3365 {
3366 
3367 }
3368 
3369 void SAL_CALL SwXTextGraphicObject::acquire(  )throw()
3370 {
3371     SwXFrame::acquire();
3372 }
3373 
3374 void SAL_CALL SwXTextGraphicObject::release(  )throw()
3375 {
3376     SwXFrame::release();
3377 }
3378 
3379 ::uno::Any SAL_CALL SwXTextGraphicObject::queryInterface( const uno::Type& aType )
3380     throw(uno::RuntimeException)
3381 {
3382     ::uno::Any aRet = SwXFrame::queryInterface(aType);
3383     if(aRet.getValueType() == ::getCppuVoidType())
3384         aRet = SwXTextGraphicObjectBaseClass::queryInterface(aType);
3385     return aRet;
3386 }
3387 
3388 uno::Sequence< uno::Type > SAL_CALL
3389     SwXTextGraphicObject::getTypes(  ) throw(uno::RuntimeException)
3390 {
3391     uno::Sequence< uno::Type > aGraphicTypes = SwXTextGraphicObjectBaseClass::getTypes();
3392     uno::Sequence< uno::Type > aFrameTypes = SwXFrame::getTypes();
3393 
3394     long nIndex = aGraphicTypes.getLength();
3395     aGraphicTypes.realloc(
3396         aGraphicTypes.getLength() +
3397         aFrameTypes.getLength());
3398 
3399     uno::Type* pGraphicTypes = aGraphicTypes.getArray();
3400     const uno::Type* pFrameTypes = aFrameTypes.getConstArray();
3401     long nPos;
3402     for(nPos = 0; nPos <aFrameTypes.getLength(); nPos++)
3403         pGraphicTypes[nIndex++] = pFrameTypes[nPos];
3404 
3405     return aGraphicTypes;
3406 }
3407 
3408 uno::Sequence< sal_Int8 > SAL_CALL SwXTextGraphicObject::getImplementationId(  ) throw(uno::RuntimeException)
3409 {
3410     vos::OGuard aGuard(Application::GetSolarMutex());
3411     static uno::Sequence< sal_Int8 > aId( 16 );
3412     static sal_Bool bInit = sal_False;
3413     if(!bInit)
3414     {
3415         rtl_createUuid( (sal_uInt8 *)(aId.getArray() ), 0, sal_True );
3416         bInit = sal_True;
3417     }
3418     return aId;
3419 }
3420 
3421 void SwXTextGraphicObject::attach(const uno::Reference< text::XTextRange > & xTextRange) throw( lang::IllegalArgumentException, uno::RuntimeException )
3422 {
3423     SwXFrame::attach(xTextRange);
3424 }
3425 
3426 uno::Reference< text::XTextRange >  SwXTextGraphicObject::getAnchor(void) throw( uno::RuntimeException )
3427 {
3428     vos::OGuard aGuard(Application::GetSolarMutex());
3429     return SwXFrame::getAnchor();
3430 }
3431 
3432 void SwXTextGraphicObject::dispose(void) throw( uno::RuntimeException )
3433 {
3434     vos::OGuard aGuard(Application::GetSolarMutex());
3435     SwXFrame::dispose();
3436 }
3437 
3438 void SwXTextGraphicObject::addEventListener(const uno::Reference< lang::XEventListener > & aListener)
3439                                                     throw( uno::RuntimeException )
3440 {
3441     SwXFrame::addEventListener(aListener);
3442 }
3443 
3444 void SwXTextGraphicObject::removeEventListener(const uno::Reference< lang::XEventListener > & aListener)
3445                                                     throw( uno::RuntimeException )
3446 {
3447     SwXFrame::removeEventListener(aListener);
3448 }
3449 
3450 OUString SwXTextGraphicObject::getImplementationName(void) throw( uno::RuntimeException )
3451 {
3452     return C2U("SwXTextGraphicObject");
3453 }
3454 
3455 sal_Bool SwXTextGraphicObject::supportsService(const OUString& rServiceName) throw( uno::RuntimeException )
3456 {
3457     return COMPARE_EQUAL == rServiceName.compareToAscii("com.sun.star.text.TextGraphicObject") ||
3458                     SwXFrame::supportsService(rServiceName);
3459 }
3460 
3461 uno::Sequence< OUString > SwXTextGraphicObject::getSupportedServiceNames(void)
3462         throw( uno::RuntimeException )
3463 {
3464     uno::Sequence < OUString > aRet = SwXFrame::getSupportedServiceNames();
3465     aRet.realloc(aRet.getLength() + 1);
3466     OUString* pArray = aRet.getArray();
3467     pArray[aRet.getLength() - 1] = C2U("com.sun.star.text.TextGraphicObject");
3468     return aRet;
3469 }
3470 
3471 void * SAL_CALL SwXTextGraphicObject::operator new( size_t t) throw()
3472 {
3473     return SwXTextGraphicObjectBaseClass::operator new(t);
3474 }
3475 
3476 void SAL_CALL SwXTextGraphicObject::operator delete( void * p) throw()
3477 {
3478     SwXTextGraphicObjectBaseClass::operator delete(p);
3479 }
3480 
3481 uno::Reference<container::XNameReplace> SAL_CALL
3482     SwXTextGraphicObject::getEvents()
3483         throw(uno::RuntimeException)
3484 {
3485     return new SwFrameEventDescriptor( *this );
3486 }
3487 
3488 /******************************************************************
3489  *
3490  ******************************************************************/
3491 
3492 SwXTextEmbeddedObject::SwXTextEmbeddedObject( SwDoc *pDoc ) :
3493     SwXFrame(FLYCNTTYPE_OLE, aSwMapProvider.GetPropertySet(PROPERTY_MAP_EMBEDDED_OBJECT), pDoc)
3494 {
3495 }
3496 
3497 SwXTextEmbeddedObject::SwXTextEmbeddedObject(SwFrmFmt& rFmt) :
3498     SwXFrame(rFmt, FLYCNTTYPE_OLE, aSwMapProvider.GetPropertySet(PROPERTY_MAP_EMBEDDED_OBJECT))
3499 {
3500 
3501 }
3502 
3503 SwXTextEmbeddedObject::~SwXTextEmbeddedObject()
3504 {
3505 
3506 }
3507 
3508 void SAL_CALL SwXTextEmbeddedObject::acquire()throw()
3509 {
3510     SwXFrame::acquire();
3511 }
3512 
3513 void SAL_CALL SwXTextEmbeddedObject::release()throw()
3514 {
3515     SwXFrame::release();
3516 }
3517 
3518 ::uno::Any SAL_CALL SwXTextEmbeddedObject::queryInterface( const uno::Type& aType )
3519     throw( uno::RuntimeException)
3520 {
3521     ::uno::Any aRet = SwXFrame::queryInterface(aType);;
3522     if(aRet.getValueType() == ::getCppuVoidType())
3523         aRet = SwXTextEmbeddedObjectBaseClass::queryInterface(aType);
3524     return aRet;
3525 }
3526 
3527 uno::Sequence< uno::Type > SAL_CALL SwXTextEmbeddedObject::getTypes(  ) throw(uno::RuntimeException)
3528 {
3529     uno::Sequence< uno::Type > aTextEmbeddedTypes = SwXTextEmbeddedObjectBaseClass::getTypes();
3530     uno::Sequence< uno::Type > aFrameTypes = SwXFrame::getTypes();
3531 
3532     long nIndex = aTextEmbeddedTypes.getLength();
3533     aTextEmbeddedTypes.realloc(
3534         aTextEmbeddedTypes.getLength() +
3535         aFrameTypes.getLength());
3536 
3537     uno::Type* pTextEmbeddedTypes = aTextEmbeddedTypes.getArray();
3538 
3539     const uno::Type* pFrameTypes = aFrameTypes.getConstArray();
3540     long nPos;
3541     for(nPos = 0; nPos <aFrameTypes.getLength(); nPos++)
3542         pTextEmbeddedTypes[nIndex++] = pFrameTypes[nPos];
3543 
3544     return aTextEmbeddedTypes;
3545 }
3546 
3547 uno::Sequence< sal_Int8 > SAL_CALL SwXTextEmbeddedObject::getImplementationId(  ) throw(uno::RuntimeException)
3548 {
3549     vos::OGuard aGuard(Application::GetSolarMutex());
3550     static uno::Sequence< sal_Int8 > aId( 16 );
3551     static sal_Bool bInit = sal_False;
3552     if(!bInit)
3553     {
3554         rtl_createUuid( (sal_uInt8 *)(aId.getArray() ), 0, sal_True );
3555         bInit = sal_True;
3556     }
3557     return aId;
3558 }
3559 
3560 void SwXTextEmbeddedObject::attach(const uno::Reference< text::XTextRange > & xTextRange) throw( lang::IllegalArgumentException, uno::RuntimeException )
3561 {
3562     SwXFrame::attach(xTextRange);
3563 }
3564 
3565 uno::Reference< text::XTextRange >  SwXTextEmbeddedObject::getAnchor(void) throw( uno::RuntimeException )
3566 {
3567     vos::OGuard aGuard(Application::GetSolarMutex());
3568     return SwXFrame::getAnchor();
3569 }
3570 
3571 void SwXTextEmbeddedObject::dispose(void) throw( uno::RuntimeException )
3572 {
3573     vos::OGuard aGuard(Application::GetSolarMutex());
3574     SwXFrame::dispose();
3575 }
3576 
3577 void SwXTextEmbeddedObject::addEventListener(const uno::Reference< lang::XEventListener > & aListener) throw( uno::RuntimeException )
3578 {
3579     SwXFrame::addEventListener(aListener);
3580 }
3581 
3582 void SwXTextEmbeddedObject::removeEventListener(const uno::Reference< lang::XEventListener > & aListener) throw( uno::RuntimeException )
3583 {
3584     SwXFrame::removeEventListener(aListener);
3585 }
3586 
3587 uno::Reference< lang::XComponent >  SwXTextEmbeddedObject::getEmbeddedObject(void) throw( uno::RuntimeException )
3588 {
3589     uno::Reference< lang::XComponent >  xRet;
3590     SwFrmFmt*   pFmt = GetFrmFmt();
3591     if(pFmt)
3592     {
3593         SwDoc* pDoc = pFmt->GetDoc();
3594         const SwFmtCntnt* pCnt = &pFmt->GetCntnt();
3595         DBG_ASSERT( pCnt->GetCntntIdx() &&
3596                        pDoc->GetNodes()[ pCnt->GetCntntIdx()->
3597                                         GetIndex() + 1 ]->GetOLENode(), "kein OLE-Node?");
3598 
3599         SwOLENode* pOleNode =  pDoc->GetNodes()[ pCnt->GetCntntIdx()
3600                                         ->GetIndex() + 1 ]->GetOLENode();
3601         uno::Reference < embed::XEmbeddedObject > xIP = pOleNode->GetOLEObj().GetOleRef();
3602         if ( svt::EmbeddedObjectRef::TryRunningState( xIP ) )
3603         {
3604             // TODO/LATER: the listener registered after client creation should be able to handle scaling, after that the client is not necessary here
3605             if ( pDoc->GetDocShell() )
3606                 pDoc->GetDocShell()->GetIPClient( svt::EmbeddedObjectRef( xIP, embed::Aspects::MSOLE_CONTENT ) );
3607 
3608             xRet = uno::Reference < lang::XComponent >( xIP->getComponent(), uno::UNO_QUERY );
3609             uno::Reference< util::XModifyBroadcaster >  xBrdcst( xRet, uno::UNO_QUERY);
3610             uno::Reference< frame::XModel > xModel( xRet, uno::UNO_QUERY);
3611             if( xBrdcst.is() && xModel.is() )
3612             {
3613                 SwXOLEListener* pListener = SwIterator<SwXOLEListener,SwFmt>::FirstElement( *pFmt );
3614                 //create a new one if the OLE object doesn't have one already
3615                 if( !pListener )
3616                 {
3617                     uno::Reference< util::XModifyListener > xOLEListener = new SwXOLEListener(*pFmt, xModel);
3618                     xBrdcst->addModifyListener( xOLEListener );
3619                 }
3620             }
3621         }
3622     }
3623     return xRet;
3624 }
3625 
3626 uno::Reference< embed::XEmbeddedObject > SAL_CALL SwXTextEmbeddedObject::getExtendedControlOverEmbeddedObject()
3627         throw( uno::RuntimeException )
3628 {
3629     uno::Reference< embed::XEmbeddedObject > xResult;
3630     SwFrmFmt*   pFmt = GetFrmFmt();
3631     if(pFmt)
3632     {
3633         SwDoc* pDoc = pFmt->GetDoc();
3634         const SwFmtCntnt* pCnt = &pFmt->GetCntnt();
3635         DBG_ASSERT( pCnt->GetCntntIdx() &&
3636                        pDoc->GetNodes()[ pCnt->GetCntntIdx()->
3637                                         GetIndex() + 1 ]->GetOLENode(), "kein OLE-Node?");
3638 
3639         SwOLENode* pOleNode =  pDoc->GetNodes()[ pCnt->GetCntntIdx()
3640                                         ->GetIndex() + 1 ]->GetOLENode();
3641         xResult = pOleNode->GetOLEObj().GetOleRef();
3642         if ( svt::EmbeddedObjectRef::TryRunningState( xResult ) )
3643         {
3644             // TODO/LATER: the listener registered after client creation should be able to handle scaling, after that the client is not necessary here
3645             if ( pDoc->GetDocShell() )
3646                 pDoc->GetDocShell()->GetIPClient( svt::EmbeddedObjectRef( xResult, embed::Aspects::MSOLE_CONTENT ) );
3647 
3648             uno::Reference < lang::XComponent > xComp( xResult->getComponent(), uno::UNO_QUERY );
3649             uno::Reference< util::XModifyBroadcaster >  xBrdcst( xComp, uno::UNO_QUERY);
3650             uno::Reference< frame::XModel > xModel( xComp, uno::UNO_QUERY);
3651             if( xBrdcst.is() && xModel.is() )
3652             {
3653                 SwXOLEListener* pListener = SwIterator<SwXOLEListener,SwFmt>::FirstElement( *pFmt );
3654                 //create a new one if the OLE object doesn't have one already
3655                 if( !pListener )
3656                 {
3657                     uno::Reference< util::XModifyListener > xOLEListener = new SwXOLEListener(*pFmt, xModel);
3658                     xBrdcst->addModifyListener( xOLEListener );
3659                 }
3660             }
3661         }
3662     }
3663     return xResult;
3664 }
3665 
3666 sal_Int64 SAL_CALL SwXTextEmbeddedObject::getAspect() throw (uno::RuntimeException)
3667 {
3668     SwFrmFmt*   pFmt = GetFrmFmt();
3669     if(pFmt)
3670     {
3671         SwDoc* pDoc = pFmt->GetDoc();
3672         const SwFmtCntnt* pCnt = &pFmt->GetCntnt();
3673         DBG_ASSERT( pCnt->GetCntntIdx() &&
3674                        pDoc->GetNodes()[ pCnt->GetCntntIdx()->
3675                                         GetIndex() + 1 ]->GetOLENode(), "kein OLE-Node?");
3676 
3677         return pDoc->GetNodes()[ pCnt->GetCntntIdx()->GetIndex() + 1 ]->GetOLENode()->GetAspect();
3678     }
3679 
3680     return embed::Aspects::MSOLE_CONTENT; // return the default value
3681 }
3682 
3683 void SAL_CALL SwXTextEmbeddedObject::setAspect( sal_Int64 nAspect ) throw (uno::RuntimeException)
3684 {
3685     SwFrmFmt*   pFmt = GetFrmFmt();
3686     if(pFmt)
3687     {
3688         SwDoc* pDoc = pFmt->GetDoc();
3689         const SwFmtCntnt* pCnt = &pFmt->GetCntnt();
3690         DBG_ASSERT( pCnt->GetCntntIdx() &&
3691                        pDoc->GetNodes()[ pCnt->GetCntntIdx()->
3692                                         GetIndex() + 1 ]->GetOLENode(), "kein OLE-Node?");
3693 
3694         pDoc->GetNodes()[ pCnt->GetCntntIdx()->GetIndex() + 1 ]->GetOLENode()->SetAspect( nAspect );
3695     }
3696 }
3697 
3698 uno::Reference< graphic::XGraphic > SAL_CALL SwXTextEmbeddedObject::getReplacementGraphic() throw (uno::RuntimeException)
3699 {
3700     SwFrmFmt*   pFmt = GetFrmFmt();
3701     if(pFmt)
3702     {
3703         SwDoc* pDoc = pFmt->GetDoc();
3704         const SwFmtCntnt* pCnt = &pFmt->GetCntnt();
3705         DBG_ASSERT( pCnt->GetCntntIdx() &&
3706                        pDoc->GetNodes()[ pCnt->GetCntntIdx()->
3707                                         GetIndex() + 1 ]->GetOLENode(), "kein OLE-Node?");
3708 
3709         Graphic* pGraphic = pDoc->GetNodes()[ pCnt->GetCntntIdx()->GetIndex() + 1 ]->GetOLENode()->GetGraphic();
3710         if ( pGraphic )
3711             return pGraphic->GetXGraphic();
3712     }
3713 
3714     return uno::Reference< graphic::XGraphic >();
3715 }
3716 
3717 
3718 OUString SwXTextEmbeddedObject::getImplementationName(void) throw( uno::RuntimeException )
3719 
3720 {
3721     return C2U("SwXTextEmbeddedObject");
3722 }
3723 
3724 sal_Bool SwXTextEmbeddedObject::supportsService(const OUString& rServiceName) throw( uno::RuntimeException )
3725 {
3726     return  COMPARE_EQUAL == rServiceName.compareToAscii("com.sun.star.text.TextEmbeddedObject")||
3727                     SwXFrame::supportsService(rServiceName);
3728 }
3729 
3730 uno::Sequence< OUString > SwXTextEmbeddedObject::getSupportedServiceNames(void)
3731         throw( uno::RuntimeException )
3732 {
3733     uno::Sequence < OUString > aRet = SwXFrame::getSupportedServiceNames();
3734     aRet.realloc(aRet.getLength() + 1);
3735     OUString* pArray = aRet.getArray();
3736     pArray[aRet.getLength() - 1] = C2U("com.sun.star.text.TextEmbeddedObject");
3737     return aRet;
3738 }
3739 
3740 void * SAL_CALL SwXTextEmbeddedObject::operator new( size_t t) throw()
3741 {
3742     return SwXTextEmbeddedObjectBaseClass::operator new(t);
3743 }
3744 
3745 void SAL_CALL SwXTextEmbeddedObject::operator delete( void * p) throw()
3746 {
3747     SwXTextEmbeddedObjectBaseClass::operator delete(p);
3748 }
3749 
3750 uno::Reference<container::XNameReplace> SAL_CALL
3751     SwXTextEmbeddedObject::getEvents()
3752         throw(uno::RuntimeException)
3753 {
3754     return new SwFrameEventDescriptor( *this );
3755 }
3756 
3757 
3758 /******************************************************************
3759  *
3760  ******************************************************************/
3761 TYPEINIT1(SwXOLEListener, SwClient);
3762 
3763 SwXOLEListener::SwXOLEListener( SwFmt& rOLEFmt, uno::Reference< XModel > xOLE) :
3764     SwClient(&rOLEFmt),
3765     xOLEModel(xOLE)
3766 {
3767 }
3768 
3769 SwXOLEListener::~SwXOLEListener()
3770 {}
3771 
3772 void SwXOLEListener::modified( const lang::EventObject& /*rEvent*/ )
3773                                         throw( uno::RuntimeException )
3774 {
3775     vos::OGuard aGuard(Application::GetSolarMutex());
3776 
3777     SwOLENode* pNd = 0;
3778     SwFmt* pFmt = GetFmt();
3779     if(pFmt)
3780     {const SwNodeIndex* pIdx = pFmt->GetCntnt().GetCntntIdx();
3781         if(pIdx)
3782         {
3783             SwNodeIndex aIdx(*pIdx, 1);
3784             SwNoTxtNode* pNoTxt = aIdx.GetNode().GetNoTxtNode();
3785             pNd = pNoTxt->GetOLENode();
3786         }
3787     }
3788     if(!pNd)
3789         throw uno::RuntimeException();
3790 
3791     uno::Reference < embed::XEmbeddedObject > xIP = pNd->GetOLEObj().GetOleRef();
3792     if ( xIP.is() )
3793     {
3794         sal_Int32 nState = xIP->getCurrentState();
3795         if ( nState == embed::EmbedStates::INPLACE_ACTIVE || nState == embed::EmbedStates::UI_ACTIVE )
3796             return;
3797     }
3798 
3799     // if the OLE-Node is UI-Active do nothing
3800     pNd->SetOLESizeInvalid( sal_True );
3801     pNd->GetDoc()->SetOLEObjModified();
3802 }
3803 
3804 /* ---------------------------------------------------------------------------
3805 
3806  ---------------------------------------------------------------------------*/
3807 void SwXOLEListener::disposing( const lang::EventObject& rEvent )
3808                         throw( uno::RuntimeException )
3809 {
3810     vos::OGuard aGuard(Application::GetSolarMutex());
3811 
3812     uno::Reference< util::XModifyListener >  xListener( this );
3813 
3814 
3815     uno::Reference< frame::XModel >  xModel( rEvent.Source, uno::UNO_QUERY );
3816     uno::Reference< util::XModifyBroadcaster >  xBrdcst(xModel, uno::UNO_QUERY);
3817 
3818     try
3819     {
3820         if( xBrdcst.is() )
3821             xBrdcst->removeModifyListener( xListener );
3822     }
3823     catch(uno::Exception const &)
3824     {
3825         DBG_ERROR("OLE Listener couldn't be removed");
3826     }
3827 }
3828 /* ---------------------------------------------------------------------------
3829 
3830  ---------------------------------------------------------------------------*/
3831 void SwXOLEListener::Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew )
3832 {
3833     ClientModify(this, pOld, pNew);
3834     if(!GetRegisteredIn())
3835         xOLEModel = 0;
3836 }
3837 
3838