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