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