xref: /trunk/main/sw/source/ui/frmdlg/frmmgr.cxx (revision cf6516809c57e1bb0a940545cca99cdad54d4ce2)
1efeef26fSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3efeef26fSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4efeef26fSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5efeef26fSAndrew Rist  * distributed with this work for additional information
6efeef26fSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7efeef26fSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8efeef26fSAndrew Rist  * "License"); you may not use this file except in compliance
9efeef26fSAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11efeef26fSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13efeef26fSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14efeef26fSAndrew Rist  * software distributed under the License is distributed on an
15efeef26fSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16efeef26fSAndrew Rist  * KIND, either express or implied.  See the License for the
17efeef26fSAndrew Rist  * specific language governing permissions and limitations
18efeef26fSAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20efeef26fSAndrew Rist  *************************************************************/
21efeef26fSAndrew Rist 
22efeef26fSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_sw.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #include "cmdid.h"
28cdf0e10cSrcweir #include "hintids.hxx"
29cdf0e10cSrcweir 
30cdf0e10cSrcweir #include <svl/stritem.hxx>
31cdf0e10cSrcweir #include <editeng/protitem.hxx>
32cdf0e10cSrcweir #include <editeng/boxitem.hxx>
33cdf0e10cSrcweir #include <editeng/opaqitem.hxx>
34cdf0e10cSrcweir #include <editeng/lrspitem.hxx>
35cdf0e10cSrcweir #include <editeng/ulspitem.hxx>
36cdf0e10cSrcweir #include <editeng/shaditem.hxx>
37cdf0e10cSrcweir #include <svx/swframevalidation.hxx>
38*3f09c2ceSJürgen Schmidt #include <svx/xdef.hxx>
39cdf0e10cSrcweir #include <fmtclds.hxx>
40cdf0e10cSrcweir #include "wrtsh.hxx"
41cdf0e10cSrcweir #include "view.hxx"
42cdf0e10cSrcweir #include "viewopt.hxx"
43cdf0e10cSrcweir #include "uitool.hxx"
44cdf0e10cSrcweir #include "frmmgr.hxx"
45cdf0e10cSrcweir #include "format.hxx"
46cdf0e10cSrcweir #include "mdiexp.hxx"
47cdf0e10cSrcweir #include "poolfmt.hxx"
48cdf0e10cSrcweir #include <com/sun/star/text/TextContentAnchorType.hpp>
49cdf0e10cSrcweir #include <com/sun/star/text/HoriOrientation.hpp>
50cdf0e10cSrcweir #include <com/sun/star/text/VertOrientation.hpp>
51cdf0e10cSrcweir #include <com/sun/star/text/RelOrientation.hpp>
52cdf0e10cSrcweir 
53cdf0e10cSrcweir using namespace ::com::sun::star;
54cdf0e10cSrcweir //using namespace text;
55cdf0e10cSrcweir 
56cdf0e10cSrcweir static sal_uInt16 __FAR_DATA aFrmMgrRange[] = {
57cdf0e10cSrcweir                             RES_FRMATR_BEGIN, RES_FRMATR_END-1,
5864b14621SArmin Le Grand 
5964b14621SArmin Le Grand                             //UUUU FillAttribute support
6064b14621SArmin Le Grand                             XATTR_FILL_FIRST, XATTR_FILL_LAST,
6164b14621SArmin Le Grand 
62cdf0e10cSrcweir                             SID_ATTR_BORDER_INNER, SID_ATTR_BORDER_INNER,
63cdf0e10cSrcweir                             FN_SET_FRM_NAME, FN_SET_FRM_NAME,
64cdf0e10cSrcweir                             0};
65cdf0e10cSrcweir 
66cdf0e10cSrcweir /*--------------------------------------------------------------------
67cdf0e10cSrcweir      Beschreibung: Rahmen-Attribute ueber Shell ermitteln
68cdf0e10cSrcweir  --------------------------------------------------------------------*/
69cdf0e10cSrcweir 
SwFlyFrmAttrMgr(sal_Bool bNew,SwWrtShell * pSh,sal_uInt8 nType)70cdf0e10cSrcweir SwFlyFrmAttrMgr::SwFlyFrmAttrMgr( sal_Bool bNew, SwWrtShell* pSh, sal_uInt8 nType ) :
71cdf0e10cSrcweir     aSet( (SwAttrPool&)pSh->GetAttrPool(), aFrmMgrRange ),
72cdf0e10cSrcweir     pOwnSh( pSh ),
73cdf0e10cSrcweir     bAbsPos( sal_False ),
74cdf0e10cSrcweir     bNewFrm( bNew ),
75cdf0e10cSrcweir     bIsInVertical( sal_False ),
76cdf0e10cSrcweir     bIsInVerticalL2R( sal_False )
77cdf0e10cSrcweir {
78cdf0e10cSrcweir     if ( bNewFrm )
79cdf0e10cSrcweir     {
80cdf0e10cSrcweir         // Defaults einstellen:
81cdf0e10cSrcweir         sal_uInt16 nId = 0;
82cdf0e10cSrcweir         switch ( nType )
83cdf0e10cSrcweir         {
84cdf0e10cSrcweir             case FRMMGR_TYPE_TEXT:  nId = RES_POOLFRM_FRAME;    break;
85cdf0e10cSrcweir             case FRMMGR_TYPE_OLE:   nId = RES_POOLFRM_OLE;      break;
86cdf0e10cSrcweir             case FRMMGR_TYPE_GRF:   nId = RES_POOLFRM_GRAPHIC;  break;
87cdf0e10cSrcweir         }
88cdf0e10cSrcweir         aSet.SetParent( &pOwnSh->GetFmtFromPool( nId )->GetAttrSet());
89cdf0e10cSrcweir         aSet.Put( SwFmtFrmSize( ATT_MIN_SIZE, DFLT_WIDTH, DFLT_HEIGHT ));
90cdf0e10cSrcweir         if ( 0 != ::GetHtmlMode(pSh->GetView().GetDocShell()) )
91cdf0e10cSrcweir             aSet.Put( SwFmtHoriOrient( 0, text::HoriOrientation::LEFT, text::RelOrientation::PRINT_AREA ) );
92cdf0e10cSrcweir     }
93cdf0e10cSrcweir     else if ( nType == FRMMGR_TYPE_NONE )
94cdf0e10cSrcweir     {
95cdf0e10cSrcweir         pOwnSh->GetFlyFrmAttr( aSet );
96cdf0e10cSrcweir         sal_Bool bRightToLeft;
97cdf0e10cSrcweir         bIsInVertical = pOwnSh->IsFrmVertical(sal_True, bRightToLeft, bIsInVerticalL2R);
98cdf0e10cSrcweir     }
99cdf0e10cSrcweir     ::PrepareBoxInfo( aSet, *pOwnSh );
100cdf0e10cSrcweir }
101cdf0e10cSrcweir 
SwFlyFrmAttrMgr(sal_Bool bNew,SwWrtShell * pSh,const SfxItemSet & rSet)102cdf0e10cSrcweir SwFlyFrmAttrMgr::SwFlyFrmAttrMgr( sal_Bool bNew, SwWrtShell* pSh, const SfxItemSet &rSet ) :
103cdf0e10cSrcweir     aSet( rSet ),
104cdf0e10cSrcweir     pOwnSh( pSh ),
105cdf0e10cSrcweir     bAbsPos( sal_False ),
106cdf0e10cSrcweir     bNewFrm( bNew ),
107cdf0e10cSrcweir     bIsInVertical(sal_False),
108cdf0e10cSrcweir     bIsInVerticalL2R(sal_False)
109cdf0e10cSrcweir {
110cdf0e10cSrcweir     if(!bNew)
111cdf0e10cSrcweir     {
112cdf0e10cSrcweir         sal_Bool bRightToLeft;
113cdf0e10cSrcweir         bIsInVertical = pSh->IsFrmVertical(sal_True, bRightToLeft, bIsInVerticalL2R);
114cdf0e10cSrcweir     }
115cdf0e10cSrcweir }
116cdf0e10cSrcweir 
117cdf0e10cSrcweir 
118cdf0e10cSrcweir /*--------------------------------------------------------------------
119cdf0e10cSrcweir      Beschreibung:  Initialisieren
120cdf0e10cSrcweir  --------------------------------------------------------------------*/
121cdf0e10cSrcweir 
UpdateAttrMgr()122cdf0e10cSrcweir void SwFlyFrmAttrMgr::UpdateAttrMgr()
123cdf0e10cSrcweir {
124cdf0e10cSrcweir     if ( !bNewFrm && pOwnSh->IsFrmSelected() )
125cdf0e10cSrcweir         pOwnSh->GetFlyFrmAttr( aSet );
126cdf0e10cSrcweir     ::PrepareBoxInfo( aSet, *pOwnSh );
127cdf0e10cSrcweir }
128cdf0e10cSrcweir 
_UpdateFlyFrm()129cdf0e10cSrcweir void SwFlyFrmAttrMgr::_UpdateFlyFrm()
130cdf0e10cSrcweir {
131cdf0e10cSrcweir     const SfxPoolItem* pItem = 0;
132cdf0e10cSrcweir 
133cdf0e10cSrcweir     if (aSet.GetItemState(FN_SET_FRM_NAME, sal_False, &pItem) == SFX_ITEM_SET)
134cdf0e10cSrcweir         pOwnSh->SetFlyName(((SfxStringItem *)pItem)->GetValue());
135cdf0e10cSrcweir 
136cdf0e10cSrcweir     pOwnSh->SetModified();
137cdf0e10cSrcweir 
138cdf0e10cSrcweir     if ( bAbsPos )
139cdf0e10cSrcweir     {
140cdf0e10cSrcweir         pOwnSh->SetFlyPos( aAbsPos );
141cdf0e10cSrcweir         bAbsPos = sal_False;
142cdf0e10cSrcweir     }
143cdf0e10cSrcweir }
144cdf0e10cSrcweir 
145cdf0e10cSrcweir /*--------------------------------------------------------------------
146cdf0e10cSrcweir     Beschreibung: Bestehenden Fly-Frame aendern
147cdf0e10cSrcweir  --------------------------------------------------------------------*/
148cdf0e10cSrcweir 
UpdateFlyFrm()149cdf0e10cSrcweir void SwFlyFrmAttrMgr::UpdateFlyFrm()
150cdf0e10cSrcweir {
151cdf0e10cSrcweir     ASSERT( pOwnSh->IsFrmSelected(),
152cdf0e10cSrcweir         "Kein Rahmen selektiert oder keine Shell, Update nicht moeglich");
153cdf0e10cSrcweir 
154cdf0e10cSrcweir     if( pOwnSh->IsFrmSelected() )
155cdf0e10cSrcweir     {
156cdf0e10cSrcweir         //JP 6.8.2001: set never an invalid anchor into the core.
157cdf0e10cSrcweir         const SfxPoolItem *pGItem, *pItem;
158cdf0e10cSrcweir         if( SFX_ITEM_SET == aSet.GetItemState( RES_ANCHOR, sal_False, &pItem ))
159cdf0e10cSrcweir         {
160cdf0e10cSrcweir             SfxItemSet aGetSet( *aSet.GetPool(), RES_ANCHOR, RES_ANCHOR );
161cdf0e10cSrcweir             if( pOwnSh->GetFlyFrmAttr( aGetSet ) && 1 == aGetSet.Count() &&
162cdf0e10cSrcweir                 SFX_ITEM_SET == aGetSet.GetItemState( RES_ANCHOR, sal_False, &pGItem )
163cdf0e10cSrcweir                 && ((SwFmtAnchor*)pGItem)->GetAnchorId() ==
164cdf0e10cSrcweir                    ((SwFmtAnchor*)pItem)->GetAnchorId() )
165cdf0e10cSrcweir                 aSet.ClearItem( RES_ANCHOR );
166cdf0e10cSrcweir         }
167cdf0e10cSrcweir 
168cdf0e10cSrcweir         // return wg. BASIC
169cdf0e10cSrcweir         if( aSet.Count() )
170cdf0e10cSrcweir         {
171cdf0e10cSrcweir             pOwnSh->StartAllAction();
172cdf0e10cSrcweir             pOwnSh->SetFlyFrmAttr( aSet );
173cdf0e10cSrcweir             _UpdateFlyFrm();
174cdf0e10cSrcweir             pOwnSh->EndAllAction();
175cdf0e10cSrcweir         }
176cdf0e10cSrcweir     }
177cdf0e10cSrcweir }
178cdf0e10cSrcweir 
179cdf0e10cSrcweir /*--------------------------------------------------------------------
180cdf0e10cSrcweir      Beschreibung:  Rahmen einfuegen
181cdf0e10cSrcweir  --------------------------------------------------------------------*/
182cdf0e10cSrcweir 
InsertFlyFrm()183cdf0e10cSrcweir sal_Bool SwFlyFrmAttrMgr::InsertFlyFrm()
184cdf0e10cSrcweir {
185cdf0e10cSrcweir     pOwnSh->StartAllAction();
186cdf0e10cSrcweir 
187cdf0e10cSrcweir     sal_Bool bRet = 0 != pOwnSh->NewFlyFrm( aSet );
188cdf0e10cSrcweir 
189cdf0e10cSrcweir     // richtigen Mode an der Shell einschalten, Rahmen wurde aut. selektiert.
190cdf0e10cSrcweir     if ( bRet )
191cdf0e10cSrcweir     {
192cdf0e10cSrcweir         _UpdateFlyFrm();
193cdf0e10cSrcweir         pOwnSh->EnterSelFrmMode();
194cdf0e10cSrcweir         FrameNotify(pOwnSh, FLY_DRAG_START);
195cdf0e10cSrcweir     }
196cdf0e10cSrcweir     pOwnSh->EndAllAction();
197cdf0e10cSrcweir     return bRet;
198cdf0e10cSrcweir }
199cdf0e10cSrcweir 
200cdf0e10cSrcweir /*------------------------------------------------------------------------
201cdf0e10cSrcweir  Beschreibung:  Rahmen des Typs eAnchorType einfuegen. Position und
202cdf0e10cSrcweir                 Groesse werden explizit angegeben.
203cdf0e10cSrcweir                 Nicht erlaubte Werte des Aufzaehlungstypes werden
204cdf0e10cSrcweir                 korrigiert.
205cdf0e10cSrcweir ------------------------------------------------------------------------*/
206cdf0e10cSrcweir 
InsertFlyFrm(RndStdIds eAnchorType,const Point & rPos,const Size & rSize,sal_Bool bAbs)207cdf0e10cSrcweir void SwFlyFrmAttrMgr::InsertFlyFrm(RndStdIds    eAnchorType,
208cdf0e10cSrcweir                                    const Point  &rPos,
209cdf0e10cSrcweir                                    const Size   &rSize,
210cdf0e10cSrcweir                                    sal_Bool bAbs )
211cdf0e10cSrcweir {
212cdf0e10cSrcweir     ASSERT( eAnchorType == FLY_AT_PAGE ||
213cdf0e10cSrcweir             eAnchorType == FLY_AT_PARA ||
214cdf0e10cSrcweir             eAnchorType == FLY_AT_CHAR ||
215cdf0e10cSrcweir             eAnchorType == FLY_AT_FLY  ||
216cdf0e10cSrcweir             eAnchorType == FLY_AS_CHAR,     "invalid frame type" );
217cdf0e10cSrcweir 
218cdf0e10cSrcweir     if ( bAbs )
219cdf0e10cSrcweir         SetAbsPos( rPos );
220cdf0e10cSrcweir     else
221cdf0e10cSrcweir         SetPos( rPos );
222cdf0e10cSrcweir 
223cdf0e10cSrcweir     SetSize( rSize );
224cdf0e10cSrcweir     SetAnchor( eAnchorType );
225cdf0e10cSrcweir     InsertFlyFrm();
226cdf0e10cSrcweir }
227cdf0e10cSrcweir 
228cdf0e10cSrcweir /*--------------------------------------------------------------------
229cdf0e10cSrcweir      Beschreibung:  Anker setzen
230cdf0e10cSrcweir  --------------------------------------------------------------------*/
231cdf0e10cSrcweir 
SetAnchor(RndStdIds eId)232cdf0e10cSrcweir void SwFlyFrmAttrMgr::SetAnchor( RndStdIds eId )
233cdf0e10cSrcweir {
234cdf0e10cSrcweir     sal_uInt16 nPhyPageNum, nVirtPageNum;
235cdf0e10cSrcweir     pOwnSh->GetPageNum( nPhyPageNum, nVirtPageNum );
236cdf0e10cSrcweir 
237cdf0e10cSrcweir     aSet.Put( SwFmtAnchor( eId, nPhyPageNum ) );
238cdf0e10cSrcweir     if ((FLY_AT_PAGE == eId) || (FLY_AT_PARA == eId) || (FLY_AT_CHAR == eId)
239cdf0e10cSrcweir         || (FLY_AT_FLY == eId))
240cdf0e10cSrcweir     {
241cdf0e10cSrcweir         SwFmtVertOrient aVertOrient( GetVertOrient() );
242cdf0e10cSrcweir         SwFmtHoriOrient aHoriOrient( GetHoriOrient() );
243cdf0e10cSrcweir         aHoriOrient.SetRelationOrient( text::RelOrientation::FRAME );
244cdf0e10cSrcweir         aVertOrient.SetRelationOrient( text::RelOrientation::FRAME );
245cdf0e10cSrcweir         aSet.Put( aVertOrient );
246cdf0e10cSrcweir         aSet.Put( aHoriOrient );
247cdf0e10cSrcweir     }
248cdf0e10cSrcweir }
249cdf0e10cSrcweir 
250cdf0e10cSrcweir /*------------------------------------------------------------------------
251cdf0e10cSrcweir  Beschreibung:  Setzen des Attributs fuer Spalten
252cdf0e10cSrcweir ------------------------------------------------------------------------*/
253cdf0e10cSrcweir 
SetCol(const SwFmtCol & rCol)254cdf0e10cSrcweir void SwFlyFrmAttrMgr::SetCol( const SwFmtCol &rCol )
255cdf0e10cSrcweir {
256cdf0e10cSrcweir     aSet.Put( rCol );
257cdf0e10cSrcweir }
258cdf0e10cSrcweir /*--------------------------------------------------------------------
259cdf0e10cSrcweir      Beschreibung:  Absolute Position setzen
260cdf0e10cSrcweir  --------------------------------------------------------------------*/
261cdf0e10cSrcweir 
SetAbsPos(const Point & rPoint)262cdf0e10cSrcweir void SwFlyFrmAttrMgr::SetAbsPos( const Point& rPoint )
263cdf0e10cSrcweir {
264cdf0e10cSrcweir     bAbsPos = sal_True;
265cdf0e10cSrcweir     aAbsPos = rPoint;
266cdf0e10cSrcweir 
267cdf0e10cSrcweir     SwFmtVertOrient aVertOrient( GetVertOrient() );
268cdf0e10cSrcweir     SwFmtHoriOrient aHoriOrient( GetHoriOrient() );
269cdf0e10cSrcweir     aHoriOrient.SetHoriOrient( text::HoriOrientation::NONE );
270cdf0e10cSrcweir     aVertOrient.SetVertOrient( text::VertOrientation::NONE );
271cdf0e10cSrcweir     aSet.Put( aVertOrient );
272cdf0e10cSrcweir     aSet.Put( aHoriOrient );
273cdf0e10cSrcweir }
274cdf0e10cSrcweir 
275cdf0e10cSrcweir /*--------------------------------------------------------------------
276cdf0e10cSrcweir     Beschreibung: Metriken auf Korrektheit pruefen
277cdf0e10cSrcweir  --------------------------------------------------------------------*/
ValidateMetrics(SvxSwFrameValidation & rVal,const SwPosition * pToCharCntntPos,sal_Bool bOnlyPercentRefValue)278cdf0e10cSrcweir void SwFlyFrmAttrMgr::ValidateMetrics( SvxSwFrameValidation& rVal,
279cdf0e10cSrcweir         const SwPosition* pToCharCntntPos,
280cdf0e10cSrcweir         sal_Bool bOnlyPercentRefValue )
281cdf0e10cSrcweir {
282cdf0e10cSrcweir     if (!bOnlyPercentRefValue)
283cdf0e10cSrcweir     {
284cdf0e10cSrcweir         rVal.nMinHeight = MINFLY + CalcTopSpace() + CalcBottomSpace();
285cdf0e10cSrcweir         rVal.nMinWidth =  MINFLY + CalcLeftSpace()+ CalcRightSpace();
286cdf0e10cSrcweir     }
287cdf0e10cSrcweir 
288cdf0e10cSrcweir     SwRect aBoundRect;
289cdf0e10cSrcweir 
290cdf0e10cSrcweir     // OD 18.09.2003 #i18732# - adjustment for allowing vertical position
291cdf0e10cSrcweir     //      aligned to page for fly frame anchored to paragraph or to character.
292cdf0e10cSrcweir     const RndStdIds eAnchorType = static_cast<RndStdIds >(rVal.nAnchorType);
293cdf0e10cSrcweir     pOwnSh->CalcBoundRect( aBoundRect, eAnchorType,
294cdf0e10cSrcweir                            rVal.nHRelOrient,
295cdf0e10cSrcweir                            rVal.nVRelOrient,
296cdf0e10cSrcweir                            pToCharCntntPos,
297cdf0e10cSrcweir                            rVal.bFollowTextFlow,
298cdf0e10cSrcweir                            rVal.bMirror, NULL, &rVal.aPercentSize);
299cdf0e10cSrcweir 
300cdf0e10cSrcweir     if (bOnlyPercentRefValue)
301cdf0e10cSrcweir         return;
302cdf0e10cSrcweir 
303cdf0e10cSrcweir     // --> OD 2009-09-01 #mongolianlayout#
304cdf0e10cSrcweir     if ( bIsInVertical || bIsInVerticalL2R )
305cdf0e10cSrcweir     // <--
306cdf0e10cSrcweir     {
307cdf0e10cSrcweir         Point aPos(aBoundRect.Pos());
308cdf0e10cSrcweir         long nTmp = aPos.X();
309cdf0e10cSrcweir         aPos.X() = aPos.Y();
310cdf0e10cSrcweir         aPos.Y() = nTmp;
311cdf0e10cSrcweir         Size aSize(aBoundRect.SSize());
312cdf0e10cSrcweir         nTmp = aSize.Width();
313cdf0e10cSrcweir         aSize.Width() = aSize.Height();
314cdf0e10cSrcweir         aSize.Height() = nTmp;
315cdf0e10cSrcweir         aBoundRect.Chg( aPos, aSize );
316cdf0e10cSrcweir         //exchange width/height to enable correct values
317cdf0e10cSrcweir         nTmp = rVal.nWidth;
318cdf0e10cSrcweir         rVal.nWidth = rVal.nHeight;
319cdf0e10cSrcweir         rVal.nHeight = nTmp;
320cdf0e10cSrcweir     }
321cdf0e10cSrcweir     if ((eAnchorType == FLY_AT_PAGE) || (eAnchorType == FLY_AT_FLY))
322cdf0e10cSrcweir     {
323cdf0e10cSrcweir         // MinimalPosition
324cdf0e10cSrcweir         rVal.nMinHPos = aBoundRect.Left();
325cdf0e10cSrcweir         rVal.nMinVPos = aBoundRect.Top();
326cdf0e10cSrcweir         SwTwips nH = rVal.nHPos;
327cdf0e10cSrcweir         SwTwips nV = rVal.nVPos;
328cdf0e10cSrcweir 
329cdf0e10cSrcweir         if (rVal.nHPos + rVal.nWidth > aBoundRect.Right())
330cdf0e10cSrcweir         {
331cdf0e10cSrcweir             if (rVal.nHoriOrient == text::HoriOrientation::NONE)
332cdf0e10cSrcweir             {
333cdf0e10cSrcweir                 rVal.nHPos -= ((rVal.nHPos + rVal.nWidth) - aBoundRect.Right());
334cdf0e10cSrcweir                 nH = rVal.nHPos;
335cdf0e10cSrcweir             }
336cdf0e10cSrcweir             else
337cdf0e10cSrcweir                 rVal.nWidth = aBoundRect.Right() - rVal.nHPos;
338cdf0e10cSrcweir         }
339cdf0e10cSrcweir 
340cdf0e10cSrcweir         if (rVal.nHPos + rVal.nWidth > aBoundRect.Right())
341cdf0e10cSrcweir             rVal.nWidth = aBoundRect.Right() - rVal.nHPos;
342cdf0e10cSrcweir 
343cdf0e10cSrcweir         if (rVal.nVPos + rVal.nHeight > aBoundRect.Bottom())
344cdf0e10cSrcweir         {
345cdf0e10cSrcweir             if (rVal.nVertOrient == text::VertOrientation::NONE)
346cdf0e10cSrcweir             {
347cdf0e10cSrcweir                 rVal.nVPos -= ((rVal.nVPos + rVal.nHeight) - aBoundRect.Bottom());
348cdf0e10cSrcweir                 nV = rVal.nVPos;
349cdf0e10cSrcweir             }
350cdf0e10cSrcweir             else
351cdf0e10cSrcweir                 rVal.nHeight = aBoundRect.Bottom() - rVal.nVPos;
352cdf0e10cSrcweir         }
353cdf0e10cSrcweir 
354cdf0e10cSrcweir         if (rVal.nVPos + rVal.nHeight > aBoundRect.Bottom())
355cdf0e10cSrcweir             rVal.nHeight = aBoundRect.Bottom() - rVal.nVPos;
356cdf0e10cSrcweir 
357cdf0e10cSrcweir         if ( rVal.nVertOrient != text::VertOrientation::NONE )
358cdf0e10cSrcweir             nV = aBoundRect.Top();
359cdf0e10cSrcweir 
360cdf0e10cSrcweir         if ( rVal.nHoriOrient != text::HoriOrientation::NONE )
361cdf0e10cSrcweir             nH = aBoundRect.Left();
362cdf0e10cSrcweir 
363cdf0e10cSrcweir         rVal.nMaxHPos   = aBoundRect.Right()  - rVal.nWidth;
364cdf0e10cSrcweir         rVal.nMaxHeight = aBoundRect.Bottom() - nV;
365cdf0e10cSrcweir 
366cdf0e10cSrcweir         rVal.nMaxVPos   = aBoundRect.Bottom() - rVal.nHeight;
367cdf0e10cSrcweir         rVal.nMaxWidth  = aBoundRect.Right()  - nH;
368cdf0e10cSrcweir     }
369cdf0e10cSrcweir     // OD 12.11.2003 #i22341# - handle to character anchored objects vertical
370cdf0e10cSrcweir     // aligned at character or top of line in a special case
371cdf0e10cSrcweir     else if ((eAnchorType == FLY_AT_PARA) ||
372cdf0e10cSrcweir                 ((eAnchorType == FLY_AT_CHAR) &&
373cdf0e10cSrcweir                 !(rVal.nVRelOrient == text::RelOrientation::CHAR) &&
374cdf0e10cSrcweir                 !(rVal.nVRelOrient == text::RelOrientation::TEXT_LINE) ) )
375cdf0e10cSrcweir     {
376cdf0e10cSrcweir         if (rVal.nHPos + rVal.nWidth > aBoundRect.Right())
377cdf0e10cSrcweir         {
378cdf0e10cSrcweir             if (rVal.nHoriOrient == text::HoriOrientation::NONE)
379cdf0e10cSrcweir             {
380cdf0e10cSrcweir                 rVal.nHPos -= ((rVal.nHPos + rVal.nWidth) - aBoundRect.Right());
381cdf0e10cSrcweir             }
382cdf0e10cSrcweir             else
383cdf0e10cSrcweir                 rVal.nWidth = aBoundRect.Right() - rVal.nHPos;
384cdf0e10cSrcweir         }
385cdf0e10cSrcweir 
386cdf0e10cSrcweir         // OD 29.09.2003 #i17567#, #i18732# - consider following the text flow
387cdf0e10cSrcweir         // and alignment at page areas.
388cdf0e10cSrcweir         const bool bMaxVPosAtBottom = !rVal.bFollowTextFlow ||
389cdf0e10cSrcweir                                       rVal.nVRelOrient == text::RelOrientation::PAGE_FRAME ||
390cdf0e10cSrcweir                                       rVal.nVRelOrient == text::RelOrientation::PAGE_PRINT_AREA;
391cdf0e10cSrcweir         {
392cdf0e10cSrcweir             SwTwips nTmpMaxVPos = ( bMaxVPosAtBottom
393cdf0e10cSrcweir                                     ? aBoundRect.Bottom()
394cdf0e10cSrcweir                                     : aBoundRect.Height() ) -
395cdf0e10cSrcweir                                   rVal.nHeight;
396cdf0e10cSrcweir             if ( rVal.nVPos > nTmpMaxVPos )
397cdf0e10cSrcweir             {
398cdf0e10cSrcweir                 if (rVal.nVertOrient == text::VertOrientation::NONE)
399cdf0e10cSrcweir                 {
400cdf0e10cSrcweir                     rVal.nVPos = nTmpMaxVPos;
401cdf0e10cSrcweir                 }
402cdf0e10cSrcweir                 else
403cdf0e10cSrcweir                 {
404cdf0e10cSrcweir                     rVal.nHeight = ( bMaxVPosAtBottom
405cdf0e10cSrcweir                                      ? aBoundRect.Bottom()
406cdf0e10cSrcweir                                      : aBoundRect.Height() ) - rVal.nVPos;
407cdf0e10cSrcweir                 }
408cdf0e10cSrcweir             }
409cdf0e10cSrcweir         }
410cdf0e10cSrcweir 
411cdf0e10cSrcweir         rVal.nMinHPos  = aBoundRect.Left();
412cdf0e10cSrcweir         rVal.nMaxHPos  = aBoundRect.Right() - rVal.nWidth;
413cdf0e10cSrcweir 
414cdf0e10cSrcweir         rVal.nMinVPos  = aBoundRect.Top();
415cdf0e10cSrcweir         // OD 26.09.2003 #i17567#, #i18732# - determine maximum vertical position
416cdf0e10cSrcweir         if ( bMaxVPosAtBottom )
417cdf0e10cSrcweir         {
418cdf0e10cSrcweir             rVal.nMaxVPos  = aBoundRect.Bottom() - rVal.nHeight;
419cdf0e10cSrcweir         }
420cdf0e10cSrcweir         else
421cdf0e10cSrcweir         {
422cdf0e10cSrcweir             rVal.nMaxVPos  = aBoundRect.Height() - rVal.nHeight;
423cdf0e10cSrcweir         }
424cdf0e10cSrcweir 
425cdf0e10cSrcweir         // Maximale Breite Hoehe
426cdf0e10cSrcweir         const SwTwips nH = ( rVal.nHoriOrient != text::HoriOrientation::NONE )
427cdf0e10cSrcweir                            ? aBoundRect.Left()
428cdf0e10cSrcweir                            : rVal.nHPos;
429cdf0e10cSrcweir         const SwTwips nV = ( rVal.nVertOrient != text::VertOrientation::NONE )
430cdf0e10cSrcweir                            ? aBoundRect.Top()
431cdf0e10cSrcweir                            : rVal.nVPos;
432cdf0e10cSrcweir         rVal.nMaxHeight  = rVal.nMaxVPos + rVal.nHeight - nV;
433cdf0e10cSrcweir         rVal.nMaxWidth   = rVal.nMaxHPos + rVal.nWidth - nH;
434cdf0e10cSrcweir     }
435cdf0e10cSrcweir     // OD 12.11.2003 #i22341# - special case for to character anchored objects
436cdf0e10cSrcweir     // vertical aligned at character or top of line.
437cdf0e10cSrcweir     // Note: (1) positive vertical values are positions above the top of line
438cdf0e10cSrcweir     //       (2) negative vertical values are positions below the top of line
439cdf0e10cSrcweir     else if ( (eAnchorType == FLY_AT_CHAR) &&
440cdf0e10cSrcweir               ( rVal.nVRelOrient == text::RelOrientation::CHAR ||
441cdf0e10cSrcweir                 rVal.nVRelOrient == text::RelOrientation::TEXT_LINE ) )
442cdf0e10cSrcweir     {
443cdf0e10cSrcweir         // determine horizontal values
444cdf0e10cSrcweir         rVal.nMinHPos  = aBoundRect.Left();
445cdf0e10cSrcweir 
446cdf0e10cSrcweir         rVal.nMaxHPos  = aBoundRect.Right() - rVal.nWidth;
447cdf0e10cSrcweir         if (rVal.nHPos + rVal.nWidth > aBoundRect.Right())
448cdf0e10cSrcweir         {
449cdf0e10cSrcweir             if (rVal.nHoriOrient == text::HoriOrientation::NONE)
450cdf0e10cSrcweir             {
451cdf0e10cSrcweir                 rVal.nHPos -= ((rVal.nHPos + rVal.nWidth) - aBoundRect.Right());
452cdf0e10cSrcweir             }
453cdf0e10cSrcweir             else
454cdf0e10cSrcweir                 rVal.nWidth = aBoundRect.Right() - rVal.nHPos;
455cdf0e10cSrcweir         }
456cdf0e10cSrcweir 
457cdf0e10cSrcweir         const SwTwips nH = ( rVal.nHoriOrient != text::HoriOrientation::NONE )
458cdf0e10cSrcweir                            ? aBoundRect.Left()
459cdf0e10cSrcweir                            : rVal.nHPos;
460cdf0e10cSrcweir         rVal.nMaxWidth   = rVal.nMaxHPos + rVal.nWidth - nH;
461cdf0e10cSrcweir 
462cdf0e10cSrcweir         // determine vertical values
463cdf0e10cSrcweir         rVal.nMinVPos = -( aBoundRect.Bottom() - rVal.nHeight );
464cdf0e10cSrcweir         if ( rVal.nVPos < rVal.nMinVPos &&
465cdf0e10cSrcweir              rVal.nVertOrient == text::VertOrientation::NONE )
466cdf0e10cSrcweir         {
467cdf0e10cSrcweir             rVal.nVPos = rVal.nMinVPos;
468cdf0e10cSrcweir         }
469cdf0e10cSrcweir 
470cdf0e10cSrcweir         rVal.nMaxVPos  = -aBoundRect.Top();
471cdf0e10cSrcweir         if ( rVal.nVPos > rVal.nMaxVPos &&
472cdf0e10cSrcweir              rVal.nVertOrient == text::VertOrientation::NONE )
473cdf0e10cSrcweir         {
474cdf0e10cSrcweir             rVal.nVPos = rVal.nMaxVPos;
475cdf0e10cSrcweir         }
476cdf0e10cSrcweir 
477cdf0e10cSrcweir         if ( rVal.nVertOrient == text::VertOrientation::NONE )
478cdf0e10cSrcweir         {
479cdf0e10cSrcweir             rVal.nMaxHeight = aBoundRect.Bottom() + rVal.nVPos;
480cdf0e10cSrcweir         }
481cdf0e10cSrcweir         else
482cdf0e10cSrcweir         {
483cdf0e10cSrcweir             rVal.nMaxHeight = aBoundRect.Height();
484cdf0e10cSrcweir         }
485cdf0e10cSrcweir     }
486cdf0e10cSrcweir     else if ( eAnchorType == FLY_AS_CHAR )
487cdf0e10cSrcweir     {
488cdf0e10cSrcweir         rVal.nMinHPos = 0;
489cdf0e10cSrcweir         rVal.nMaxHPos = 0;
490cdf0e10cSrcweir 
491cdf0e10cSrcweir         rVal.nMaxHeight = aBoundRect.Height();
492cdf0e10cSrcweir         rVal.nMaxWidth  = aBoundRect.Width();
493cdf0e10cSrcweir 
494cdf0e10cSrcweir         rVal.nMaxVPos   = aBoundRect.Height();
495cdf0e10cSrcweir         rVal.nMinVPos   = -aBoundRect.Height() + rVal.nHeight;
496cdf0e10cSrcweir         if (rVal.nMaxVPos < rVal.nMinVPos)
497cdf0e10cSrcweir         {
498cdf0e10cSrcweir             rVal.nMinVPos = rVal.nMaxVPos;
499cdf0e10cSrcweir             rVal.nMaxVPos = -aBoundRect.Height();
500cdf0e10cSrcweir         }
501cdf0e10cSrcweir     }
502cdf0e10cSrcweir     // --> OD 2009-09-01 #mongolianlayout#
503cdf0e10cSrcweir     if ( bIsInVertical || bIsInVerticalL2R )
504cdf0e10cSrcweir     // <--
505cdf0e10cSrcweir     {
506cdf0e10cSrcweir         //restore width/height exchange
507cdf0e10cSrcweir         long nTmp = rVal.nWidth;
508cdf0e10cSrcweir         rVal.nWidth = rVal.nHeight;
509cdf0e10cSrcweir         rVal.nHeight = nTmp;
510cdf0e10cSrcweir     }
511cdf0e10cSrcweir 
512cdf0e10cSrcweir     if (rVal.nMaxWidth < rVal.nWidth)
513cdf0e10cSrcweir         rVal.nWidth = rVal.nMaxWidth;
514cdf0e10cSrcweir     if (rVal.nMaxHeight < rVal.nHeight)
515cdf0e10cSrcweir         rVal.nHeight = rVal.nMaxHeight;
516cdf0e10cSrcweir }
517cdf0e10cSrcweir 
518cdf0e10cSrcweir /*--------------------------------------------------------------------
519cdf0e10cSrcweir     Beschreibung: Korrektur fuer Umrandung
520cdf0e10cSrcweir  --------------------------------------------------------------------*/
521cdf0e10cSrcweir 
CalcTopSpace()522cdf0e10cSrcweir SwTwips SwFlyFrmAttrMgr::CalcTopSpace()
523cdf0e10cSrcweir {
524cdf0e10cSrcweir     const SvxShadowItem& rShadow = GetShadow();
525cdf0e10cSrcweir     const SvxBoxItem&    rBox    = GetBox();
526cdf0e10cSrcweir     return rShadow.CalcShadowSpace(SHADOW_TOP ) + rBox.CalcLineSpace(BOX_LINE_TOP);
527cdf0e10cSrcweir }
528cdf0e10cSrcweir 
CalcBottomSpace()529cdf0e10cSrcweir SwTwips SwFlyFrmAttrMgr::CalcBottomSpace()
530cdf0e10cSrcweir {
531cdf0e10cSrcweir     const SvxShadowItem& rShadow = GetShadow();
532cdf0e10cSrcweir     const SvxBoxItem& rBox       = GetBox();
533cdf0e10cSrcweir     return rShadow.CalcShadowSpace(SHADOW_BOTTOM) + rBox.CalcLineSpace(BOX_LINE_BOTTOM);
534cdf0e10cSrcweir }
535cdf0e10cSrcweir 
CalcLeftSpace()536cdf0e10cSrcweir SwTwips SwFlyFrmAttrMgr::CalcLeftSpace()
537cdf0e10cSrcweir {
538cdf0e10cSrcweir     const SvxShadowItem& rShadow = GetShadow();
539cdf0e10cSrcweir     const SvxBoxItem&    rBox    = GetBox();
540cdf0e10cSrcweir     return rShadow.CalcShadowSpace(SHADOW_LEFT) + rBox.CalcLineSpace(BOX_LINE_LEFT);
541cdf0e10cSrcweir }
542cdf0e10cSrcweir 
CalcRightSpace()543cdf0e10cSrcweir SwTwips SwFlyFrmAttrMgr::CalcRightSpace()
544cdf0e10cSrcweir {
545cdf0e10cSrcweir     const SvxShadowItem& rShadow = GetShadow();
546cdf0e10cSrcweir     const SvxBoxItem&    rBox    = GetBox();
547cdf0e10cSrcweir     return rShadow.CalcShadowSpace(SHADOW_RIGHT) + rBox.CalcLineSpace(BOX_LINE_RIGHT);
548cdf0e10cSrcweir }
549cdf0e10cSrcweir 
550cdf0e10cSrcweir 
551cdf0e10cSrcweir /*--------------------------------------------------------------------
552cdf0e10cSrcweir     Beschreibung: Attribut aus dem Set loeschen
553cdf0e10cSrcweir  --------------------------------------------------------------------*/
DelAttr(sal_uInt16 nId)554cdf0e10cSrcweir void SwFlyFrmAttrMgr::DelAttr( sal_uInt16 nId )
555cdf0e10cSrcweir {
556cdf0e10cSrcweir     aSet.ClearItem( nId );
557cdf0e10cSrcweir }
558cdf0e10cSrcweir 
SetLRSpace(long nLeft,long nRight)559cdf0e10cSrcweir void SwFlyFrmAttrMgr::SetLRSpace( long nLeft, long nRight )
560cdf0e10cSrcweir {
561cdf0e10cSrcweir     ASSERT( LONG_MAX != nLeft && LONG_MAX != nRight, "Welchen Raend setzen?" );
562cdf0e10cSrcweir 
563cdf0e10cSrcweir     SvxLRSpaceItem aTmp( (SvxLRSpaceItem&)aSet.Get( RES_LR_SPACE ) );
564cdf0e10cSrcweir     if( LONG_MAX != nLeft )
565cdf0e10cSrcweir         aTmp.SetLeft( sal_uInt16(nLeft) );
566cdf0e10cSrcweir     if( LONG_MAX != nRight )
567cdf0e10cSrcweir         aTmp.SetRight( sal_uInt16(nRight) );
568cdf0e10cSrcweir     aSet.Put( aTmp );
569cdf0e10cSrcweir }
570cdf0e10cSrcweir 
SetULSpace(long nTop,long nBottom)571cdf0e10cSrcweir void SwFlyFrmAttrMgr::SetULSpace( long nTop, long nBottom )
572cdf0e10cSrcweir {
573cdf0e10cSrcweir     ASSERT(LONG_MAX != nTop && LONG_MAX != nBottom, "Welchen Raend setzen?" );
574cdf0e10cSrcweir 
575cdf0e10cSrcweir     SvxULSpaceItem aTmp( (SvxULSpaceItem&)aSet.Get( RES_UL_SPACE ) );
576cdf0e10cSrcweir     if( LONG_MAX != nTop )
577cdf0e10cSrcweir         aTmp.SetUpper( sal_uInt16(nTop) );
578cdf0e10cSrcweir     if( LONG_MAX != nBottom )
579cdf0e10cSrcweir         aTmp.SetLower( sal_uInt16(nBottom) );
580cdf0e10cSrcweir     aSet.Put( aTmp );
581cdf0e10cSrcweir }
582cdf0e10cSrcweir 
SetPos(const Point & rPoint)583cdf0e10cSrcweir void SwFlyFrmAttrMgr::SetPos( const Point& rPoint )
584cdf0e10cSrcweir {
585cdf0e10cSrcweir     SwFmtVertOrient aVertOrient( GetVertOrient() );
586cdf0e10cSrcweir     SwFmtHoriOrient aHoriOrient( GetHoriOrient() );
587cdf0e10cSrcweir 
588cdf0e10cSrcweir     aHoriOrient.SetPos       ( rPoint.X() );
589cdf0e10cSrcweir     aHoriOrient.SetHoriOrient( text::HoriOrientation::NONE  );
590cdf0e10cSrcweir 
591cdf0e10cSrcweir     aVertOrient.SetPos       ( rPoint.Y() );
592cdf0e10cSrcweir     aVertOrient.SetVertOrient( text::VertOrientation::NONE  );
593cdf0e10cSrcweir 
594cdf0e10cSrcweir     aSet.Put( aVertOrient );
595cdf0e10cSrcweir     aSet.Put( aHoriOrient );
596cdf0e10cSrcweir }
597cdf0e10cSrcweir 
SetHorzOrientation(sal_Int16 eOrient)598cdf0e10cSrcweir void SwFlyFrmAttrMgr::SetHorzOrientation( sal_Int16 eOrient )
599cdf0e10cSrcweir {
600cdf0e10cSrcweir     SwFmtHoriOrient aHoriOrient( GetHoriOrient() );
601cdf0e10cSrcweir     aHoriOrient.SetHoriOrient( eOrient );
602cdf0e10cSrcweir     aSet.Put( aHoriOrient );
603cdf0e10cSrcweir }
604cdf0e10cSrcweir 
SetVertOrientation(sal_Int16 eOrient)605cdf0e10cSrcweir void SwFlyFrmAttrMgr::SetVertOrientation( sal_Int16 eOrient )
606cdf0e10cSrcweir {
607cdf0e10cSrcweir     SwFmtVertOrient aVertOrient( GetVertOrient() );
608cdf0e10cSrcweir     aVertOrient.SetVertOrient( eOrient );
609cdf0e10cSrcweir     aSet.Put( aVertOrient );
610cdf0e10cSrcweir }
611cdf0e10cSrcweir 
SetHeightSizeType(SwFrmSize eType)612cdf0e10cSrcweir void SwFlyFrmAttrMgr::SetHeightSizeType( SwFrmSize eType )
613cdf0e10cSrcweir {
614cdf0e10cSrcweir     SwFmtFrmSize aSize( GetFrmSize() );
615cdf0e10cSrcweir     aSize.SetHeightSizeType( eType );
616cdf0e10cSrcweir     aSet.Put( aSize );
617cdf0e10cSrcweir }
618cdf0e10cSrcweir 
SetSize(const Size & rSize)619cdf0e10cSrcweir void SwFlyFrmAttrMgr::SetSize( const Size& rSize )
620cdf0e10cSrcweir {
621cdf0e10cSrcweir     SwFmtFrmSize aSize( GetFrmSize() );
622cdf0e10cSrcweir     aSize.SetSize(Size(Max(rSize.Width(), long(MINFLY)), Max(rSize.Height(), long(MINFLY))));
623cdf0e10cSrcweir     aSet.Put( aSize );
624cdf0e10cSrcweir }
625cdf0e10cSrcweir 
SetAttrSet(const SfxItemSet & rSet)626cdf0e10cSrcweir void SwFlyFrmAttrMgr::SetAttrSet(const SfxItemSet& rSet)
627cdf0e10cSrcweir {
628cdf0e10cSrcweir     aSet.ClearItem();
629cdf0e10cSrcweir     aSet.Put( rSet );
630cdf0e10cSrcweir }
631