LCOV - code coverage report
Current view: top level - sw/source/core/frmedt - fefly1.cxx (source / functions) Hit Total Coverage
Test: commit e02a6cb2c3e2b23b203b422e4e0680877f232636 Lines: 0 1018 0.0 %
Date: 2014-04-14 Functions: 0 47 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include <hintids.hxx>
      21             : #include <svl/itemiter.hxx>
      22             : #include <svtools/imapobj.hxx>
      23             : #include <svtools/soerr.hxx>
      24             : #include <editeng/protitem.hxx>
      25             : #include <svx/svdogrp.hxx>
      26             : #include <svx/svdouno.hxx>
      27             : #include <svx/fmglob.hxx>
      28             : #include <com/sun/star/form/FormButtonType.hpp>
      29             : #include <com/sun/star/beans/XPropertySet.hpp>
      30             : #include <fmtanchr.hxx>
      31             : #include <txtflcnt.hxx>
      32             : #include <fmtcntnt.hxx>
      33             : #include <fmtornt.hxx>
      34             : #include <fmtflcnt.hxx>
      35             : #include <fmturl.hxx>
      36             : #include <fmtclds.hxx>
      37             : #include <fmtfsize.hxx>
      38             : #include <docary.hxx>
      39             : #include <fesh.hxx>
      40             : #include <rootfrm.hxx>
      41             : #include <pagefrm.hxx>
      42             : #include <cntfrm.hxx>
      43             : #include <txtfrm.hxx>
      44             : #include <viewimp.hxx>
      45             : #include <viscrs.hxx>
      46             : #include <doc.hxx>
      47             : #include <IDocumentUndoRedo.hxx>
      48             : #include <dview.hxx>
      49             : #include <dflyobj.hxx>
      50             : #include <dcontact.hxx>
      51             : #include <frmfmt.hxx>
      52             : #include <flyfrm.hxx>
      53             : #include <ndtxt.hxx>
      54             : #include <edimp.hxx>
      55             : #include <swtable.hxx>
      56             : #include <mvsave.hxx>
      57             : #include <ndgrf.hxx>
      58             : #include <flyfrms.hxx>
      59             : #include <flypos.hxx>
      60             : #include <fldbas.hxx>
      61             : #include <fmtfld.hxx>
      62             : #include <swundo.hxx>
      63             : #include <frame.hxx>
      64             : #include <notxtfrm.hxx>
      65             : #include <HandleAnchorNodeChg.hxx>
      66             : #include <frmatr.hxx>
      67             : #include <fmtsrnd.hxx>
      68             : #include <ndole.hxx>
      69             : #include <editeng/opaqitem.hxx>
      70             : 
      71             : using namespace ::com::sun::star;
      72             : 
      73             : // To register Flys in Flys in ...
      74             : // as defined in layout/frmtool.cxx
      75             : void RegistFlys( SwPageFrm*, const SwLayoutFrm* );
      76             : 
      77             : /***********************************************************************
      78             : #*  Class       :  SwDoc
      79             : #*  Methode     :  UseSpzLayoutFmt
      80             : #*  Description :  based on the request, changes to the specific layouts
      81             : #*                 will be made, to fit to the format
      82             : #***********************************************************************/
      83             : 
      84           0 : static bool lcl_SetNewFlyPos( const SwNode& rNode, SwFmtAnchor& rAnchor,
      85             :                         const Point& rPt )
      86             : {
      87           0 :     bool bRet = false;
      88           0 :     const SwStartNode* pStNode = rNode.FindFlyStartNode();
      89           0 :     if( pStNode )
      90             :     {
      91           0 :         SwPosition aPos( *pStNode );
      92           0 :         rAnchor.SetAnchor( &aPos );
      93           0 :         bRet = true;
      94             :     }
      95             :     else
      96             :     {
      97           0 :         const SwCntntNode *pCntNd = rNode.GetCntntNode();
      98           0 :         const SwCntntFrm* pCFrm = pCntNd ? pCntNd->getLayoutFrm( pCntNd->GetDoc()->GetCurrentLayout(), &rPt, 0, false ) : 0;
      99           0 :         const SwPageFrm *pPg = pCFrm ? pCFrm->FindPageFrm() : 0;
     100             : 
     101           0 :         rAnchor.SetPageNum( pPg ? pPg->GetPhyPageNum() : 1 );
     102           0 :         rAnchor.SetType( FLY_AT_PAGE );
     103             :     }
     104           0 :     return bRet;
     105             : }
     106             : 
     107           0 : static sal_Bool lcl_FindAnchorPos(
     108             :     SwEditShell& rEditShell,
     109             :     SwDoc& rDoc,
     110             :     const Point& rPt,
     111             :     const SwFrm& rFrm,
     112             :     SfxItemSet& rSet )
     113             : {
     114           0 :     sal_Bool bRet = sal_True;
     115           0 :     SwFmtAnchor aNewAnch( (SwFmtAnchor&)rSet.Get( RES_ANCHOR ) );
     116           0 :     RndStdIds nNew = aNewAnch.GetAnchorId();
     117             :     const SwFrm *pNewAnch;
     118             : 
     119             :     //determine new anchor
     120           0 :     Point aTmpPnt( rPt );
     121           0 :     switch( nNew )
     122             :     {
     123             :     case FLY_AS_CHAR:  // also include this?
     124             :     case FLY_AT_PARA:
     125             :     case FLY_AT_CHAR: // LAYER_IMPL
     126             :         {
     127             :             // starting from the upper-left corner of the Fly,
     128             :             // search nearest CntntFrm
     129           0 :             const SwFrm* pFrm = rFrm.IsFlyFrm() ? ((SwFlyFrm&)rFrm).GetAnchorFrm()
     130           0 :                                                 : &rFrm;
     131           0 :             pNewAnch = ::FindAnchor( pFrm, aTmpPnt );
     132           0 :             if( pNewAnch->IsProtected() )
     133             :             {
     134           0 :                 bRet = sal_False;
     135           0 :                 break;
     136             :             }
     137             : 
     138           0 :             SwPosition aPos( *((SwCntntFrm*)pNewAnch)->GetNode() );
     139           0 :             if ((FLY_AT_CHAR == nNew) || (FLY_AS_CHAR == nNew))
     140             :             {
     141             :                 // textnode should be found, as only in those
     142             :                 // a content bound frame can be anchored
     143           0 :                 SwCrsrMoveState aState( MV_SETONLYTEXT );
     144           0 :                 aTmpPnt.setX(aTmpPnt.getX() - 1);                   // do not land in the fly!
     145           0 :                 if( !pNewAnch->GetCrsrOfst( &aPos, aTmpPnt, &aState ) )
     146             :                 {
     147           0 :                     SwCntntNode* pCNd = ((SwCntntFrm*)pNewAnch)->GetNode();
     148           0 :                     if( pNewAnch->Frm().Bottom() < aTmpPnt.Y() )
     149           0 :                         pCNd->MakeStartIndex( &aPos.nContent );
     150             :                     else
     151           0 :                         pCNd->MakeEndIndex( &aPos.nContent );
     152             :                 }
     153             :                 else
     154             :                 {
     155           0 :                     if ( rEditShell.PosInsideInputFld( aPos ) )
     156             :                     {
     157           0 :                         aPos.nContent = rEditShell.StartOfInputFldAtPos( aPos );
     158             :                     }
     159             :                 }
     160             :             }
     161           0 :             aNewAnch.SetAnchor( &aPos );
     162             :         }
     163           0 :         break;
     164             : 
     165             :     case FLY_AT_FLY: // LAYER_IMPL
     166             :         {
     167             :             // starting from the upper-left corner of the Fly
     168             :             // search nearest SwFlyFrm
     169           0 :             SwCrsrMoveState aState( MV_SETONLYTEXT );
     170           0 :             SwPosition aPos( rDoc.GetNodes() );
     171           0 :             aTmpPnt.setX(aTmpPnt.getX() - 1);                   // do not land in the fly!
     172           0 :             rDoc.GetCurrentLayout()->GetCrsrOfst( &aPos, aTmpPnt, &aState );
     173             :             pNewAnch = ::FindAnchor(
     174           0 :                 aPos.nNode.GetNode().GetCntntNode()->getLayoutFrm( rFrm.getRootFrm(), 0, 0, false ),
     175           0 :                 aTmpPnt )->FindFlyFrm();
     176             : 
     177           0 :             if( pNewAnch && &rFrm != pNewAnch && !pNewAnch->IsProtected() )
     178             :             {
     179           0 :                 aPos.nNode = *((SwFlyFrm*)pNewAnch)->GetFmt()->GetCntnt().
     180           0 :                                 GetCntntIdx();
     181           0 :                 aNewAnch.SetAnchor( &aPos );
     182           0 :                 break;
     183           0 :             }
     184             :         }
     185             : 
     186           0 :         aNewAnch.SetType( nNew = FLY_AT_PAGE );
     187             :         // no break
     188             : 
     189             :     case FLY_AT_PAGE:
     190           0 :         pNewAnch = rFrm.FindPageFrm();
     191           0 :         aNewAnch.SetPageNum( pNewAnch->GetPhyPageNum() );
     192           0 :         break;
     193             : 
     194             :     default:
     195             :         OSL_ENSURE( !&rDoc, "Falsche ID fuer neuen Anker." );
     196             :     }
     197             : 
     198           0 :     rSet.Put( aNewAnch );
     199           0 :     return bRet;
     200             : }
     201             : 
     202             : //! also used in unoframe.cxx
     203             : 
     204           0 : sal_Bool sw_ChkAndSetNewAnchor(
     205             :     SwEditShell& rEditShell,
     206             :     const SwFlyFrm& rFly,
     207             :     SfxItemSet& rSet )
     208             : {
     209           0 :     const SwFrmFmt& rFmt = *rFly.GetFmt();
     210           0 :     const SwFmtAnchor &rOldAnch = rFmt.GetAnchor();
     211           0 :     const RndStdIds nOld = rOldAnch.GetAnchorId();
     212             : 
     213           0 :     RndStdIds nNew = ((SwFmtAnchor&)rSet.Get( RES_ANCHOR )).GetAnchorId();
     214             : 
     215           0 :     if( nOld == nNew )
     216           0 :         return sal_False;
     217             : 
     218           0 :     SwDoc* pDoc = (SwDoc*)rFmt.GetDoc();
     219             : 
     220             : #if OSL_DEBUG_LEVEL > 0
     221             :     OSL_ENSURE( !(nNew == FLY_AT_PAGE &&
     222             :         (FLY_AT_PARA==nOld || FLY_AT_CHAR==nOld || FLY_AS_CHAR==nOld ) &&
     223             :         pDoc->IsInHeaderFooter( rOldAnch.GetCntntAnchor()->nNode )),
     224             :             "forbidden anchor change in Head/Foot." );
     225             : #endif
     226             : 
     227           0 :     return ::lcl_FindAnchorPos( rEditShell, *pDoc, rFly.Frm().Pos(), rFly, rSet );
     228             : }
     229             : 
     230           0 : void SwFEShell::SelectFlyFrm( SwFlyFrm& rFrm, sal_Bool bNew )
     231             : {
     232           0 :     SET_CURR_SHELL( this );
     233             : 
     234             :     // The frame is new, thus select it.
     235             :     // !! Always select the frame, if it's not selected.
     236             :     // - it could be a new "old" one because the anchor was changed
     237             :     // - "old" frames have had to be selected previously otherwise they could
     238             :     //   not have been changed
     239             :     // The frames should not be selected by the document position, because
     240             :     // it should have been selected!
     241           0 :     SwViewImp *pImpl = Imp();
     242           0 :     if( GetWin() && (bNew || !pImpl->GetDrawView()->AreObjectsMarked()) )
     243             :     {
     244             :         OSL_ENSURE( rFrm.IsFlyFrm(), "SelectFlyFrm will einen Fly" );
     245             : 
     246             :        // nothing to be done if the Fly already was selected
     247           0 :         if ( FindFlyFrm() == &rFrm )
     248           0 :             return;
     249             : 
     250             :         // assure the anchor is drawn
     251           0 :         if( rFrm.IsFlyInCntFrm() && rFrm.GetAnchorFrm() )
     252           0 :              rFrm.GetAnchorFrm()->SetCompletePaint();
     253             : 
     254           0 :         if( pImpl->GetDrawView()->AreObjectsMarked() )
     255           0 :             pImpl->GetDrawView()->UnmarkAll();
     256             : 
     257           0 :         pImpl->GetDrawView()->MarkObj( rFrm.GetVirtDrawObj(),
     258           0 :                                       pImpl->GetPageView(), false, false );
     259           0 :         KillPams();
     260           0 :         ClearMark();
     261           0 :         SelFlyGrabCrsr();
     262           0 :     }
     263             : }
     264             : 
     265             : /*************************************************************************
     266             : |*
     267             : |*  SwFEShell::FindFlyFrm()
     268             : |*
     269             : |*  Description        returns a Fly if one is selected
     270             : |*
     271             : *************************************************************************/
     272             : 
     273           0 : SwFlyFrm *SwFEShell::FindFlyFrm() const
     274             : {
     275           0 :     if ( Imp()->HasDrawView() )
     276             :     {
     277             :         // A Fly is only accessible if it is selected
     278           0 :         const SdrMarkList &rMrkList = Imp()->GetDrawView()->GetMarkedObjectList();
     279           0 :         if( rMrkList.GetMarkCount() != 1 )
     280           0 :             return 0;
     281             : 
     282           0 :         SdrObject *pO = rMrkList.GetMark( 0 )->GetMarkedSdrObj();
     283           0 :         return ( pO && pO->ISA(SwVirtFlyDrawObj) ) ? ((SwVirtFlyDrawObj*)pO)->GetFlyFrm() : 0;
     284             :     }
     285           0 :     return 0;
     286             : }
     287             : 
     288             : /*************************************************************************
     289             : |*
     290             : |*  SwFEShell::IsFlyInFly()
     291             : |*
     292             : |*  Description        Returns sal_True, if the current Fly could be anchored
     293             : |*                     to another one (so it is inside)
     294             : |*
     295             : *************************************************************************/
     296             : 
     297           0 : const SwFrmFmt* SwFEShell::IsFlyInFly()
     298             : {
     299           0 :     SET_CURR_SHELL( this );
     300             : 
     301           0 :     if ( !Imp()->HasDrawView() )
     302           0 :         return NULL;
     303             : 
     304           0 :     const SdrMarkList &rMrkList = Imp()->GetDrawView()->GetMarkedObjectList();
     305           0 :     if ( !rMrkList.GetMarkCount() )
     306             :     {
     307           0 :         SwCntntFrm *pCntnt = GetCurrFrm( sal_False );
     308           0 :         if( !pCntnt )
     309           0 :             return NULL;
     310           0 :         SwFlyFrm *pFly = pCntnt->FindFlyFrm();
     311           0 :         if ( !pFly )
     312           0 :             return NULL;
     313           0 :         return pFly->GetFmt();
     314             :     }
     315           0 :     else if ( rMrkList.GetMarkCount() != 1 ||
     316           0 :          !GetUserCall(rMrkList.GetMark( 0 )->GetMarkedSdrObj()) )
     317           0 :         return NULL;
     318             : 
     319           0 :     SdrObject *pObj = rMrkList.GetMark( 0 )->GetMarkedSdrObj();
     320             : 
     321           0 :     SwFrmFmt *pFmt = FindFrmFmt( pObj );
     322           0 :     if( pFmt && FLY_AT_FLY == pFmt->GetAnchor().GetAnchorId() )
     323             :     {
     324           0 :         const SwFrm* pFly = pObj->ISA(SwVirtFlyDrawObj) ?
     325           0 :             ((SwVirtFlyDrawObj*)pObj)->GetFlyFrm()->GetAnchorFrm() :
     326           0 :             ((SwDrawContact*)GetUserCall(pObj))->GetAnchorFrm( pObj );
     327             :         OSL_ENSURE( pFly, "IsFlyInFly: Where's my anchor?" );
     328             :         OSL_ENSURE( pFly->IsFlyFrm(), "IsFlyInFly: Funny anchor!" );
     329           0 :         return ((SwFlyFrm*)pFly)->GetFmt();
     330             :     }
     331             : 
     332           0 :     Point aTmpPos = pObj->GetCurrentBoundRect().TopLeft();
     333             : 
     334             :     SwFrm *pTxtFrm;
     335             :     {
     336           0 :         SwCrsrMoveState aState( MV_SETONLYTEXT );
     337           0 :         SwNodeIndex aSwNodeIndex( GetDoc()->GetNodes() );
     338           0 :         SwPosition aPos( aSwNodeIndex );
     339           0 :         Point aPoint( aTmpPos );
     340           0 :         aPoint.setX(aPoint.getX() - 1);                    //do not land in the fly!!
     341           0 :         GetLayout()->GetCrsrOfst( &aPos, aPoint, &aState );
     342             :         // determine text frame by left-top-corner of object
     343           0 :         pTxtFrm = aPos.nNode.GetNode().GetCntntNode()->getLayoutFrm( GetLayout(), &aTmpPos, 0, false );
     344             :     }
     345           0 :     const SwFrm *pTmp = ::FindAnchor( pTxtFrm, aTmpPos );
     346           0 :     const SwFlyFrm *pFly = pTmp->FindFlyFrm();
     347           0 :     if( pFly )
     348           0 :         return pFly->GetFmt();
     349           0 :     return NULL;
     350             : }
     351             : 
     352             : /*************************************************************************
     353             : |*
     354             : |*  SwFEShell::SetFlyPos
     355             : |*
     356             : *************************************************************************/
     357             : 
     358           0 : void SwFEShell::SetFlyPos( const Point& rAbsPos )
     359             : {
     360           0 :     SET_CURR_SHELL( this );
     361             : 
     362             :     // Determine reference point in document coordinates
     363           0 :     SwCntntFrm *pCntnt = GetCurrFrm( sal_False );
     364           0 :     if( !pCntnt )
     365           0 :         return;
     366           0 :     SwFlyFrm *pFly = pCntnt->FindFlyFrm();
     367           0 :     if ( !pFly )
     368           0 :         return;
     369             : 
     370             :     //SwSaveHdl aSaveX( Imp() );
     371             : 
     372             :     // Set an anchor starting from the absolute position for paragraph bound Flys
     373             :     // Anchor and new RelPos will be calculated and set by the Fly
     374           0 :     if ( pFly->IsFlyAtCntFrm() )
     375           0 :         ((SwFlyAtCntFrm*)pFly)->SetAbsPos( rAbsPos );
     376             :     else
     377             :     {
     378           0 :             const SwFrm *pAnch = pFly->GetAnchorFrm();
     379           0 :             Point aOrient( pAnch->Frm().Pos() );
     380             : 
     381           0 :         if ( pFly->IsFlyInCntFrm() )
     382           0 :             aOrient.setX(rAbsPos.getX());
     383             : 
     384             :         // calculate RelPos.
     385           0 :         aOrient.setX(rAbsPos.getX() - aOrient.getX());
     386           0 :         aOrient.setY(rAbsPos.getY() - aOrient.getY());
     387           0 :         pFly->ChgRelPos( aOrient );
     388             :     }
     389           0 :     CallChgLnk();       // call the AttrChangeNotify on the UI-side.
     390             : }
     391             : 
     392             : /*************************************************************************
     393             : |*
     394             : |*  SwFEShell::FindAnchorPos
     395             : |*
     396             : *************************************************************************/
     397             : 
     398           0 : Point SwFEShell::FindAnchorPos( const Point& rAbsPos, sal_Bool bMoveIt )
     399             : {
     400           0 :     Point aRet;
     401             : 
     402           0 :     SET_CURR_SHELL( this );
     403             : 
     404           0 :     if ( !Imp()->HasDrawView() )
     405           0 :         return aRet;
     406             : 
     407           0 :     const SdrMarkList &rMrkList = Imp()->GetDrawView()->GetMarkedObjectList();
     408           0 :     if ( rMrkList.GetMarkCount() != 1 ||
     409           0 :          !GetUserCall(rMrkList.GetMark( 0 )->GetMarkedSdrObj()) )
     410           0 :         return aRet;
     411             : 
     412           0 :     SdrObject* pObj = rMrkList.GetMark( 0 )->GetMarkedSdrObj();
     413             :     // #i28701#
     414           0 :     SwAnchoredObject* pAnchoredObj = ::GetUserCall( pObj )->GetAnchoredObj( pObj );
     415           0 :     SwFrmFmt& rFmt = pAnchoredObj->GetFrmFmt();
     416           0 :     const RndStdIds nAnchorId = rFmt.GetAnchor().GetAnchorId();
     417             : 
     418           0 :     if ( FLY_AS_CHAR == nAnchorId )
     419           0 :         return aRet;
     420             : 
     421           0 :     sal_Bool bFlyFrame = pObj->ISA(SwVirtFlyDrawObj);
     422             : 
     423           0 :     SwFlyFrm* pFly = 0L;
     424             :     const SwFrm* pOldAnch;
     425           0 :     const SwFrm* pFooterOrHeader = NULL;
     426             : 
     427           0 :     if( bFlyFrame )
     428             :     {
     429             :         // Calculate reference point in document coordinates
     430           0 :         SwCntntFrm *pCntnt = GetCurrFrm( sal_False );
     431           0 :         if( !pCntnt )
     432           0 :             return aRet;
     433           0 :         pFly = pCntnt->FindFlyFrm();
     434           0 :         if ( !pFly )
     435           0 :             return aRet;
     436           0 :         pOldAnch = pFly->GetAnchorFrm();
     437           0 :         if( !pOldAnch )
     438           0 :             return aRet;
     439           0 :         if ( FLY_AT_PAGE != nAnchorId )
     440             :         {
     441           0 :             pFooterOrHeader = pCntnt->FindFooterOrHeader();
     442             :         }
     443             :     }
     444             :     // set <pFooterOrHeader> also for drawing
     445             :     // objects, but not for control objects.
     446             :     // Necessary for moving 'anchor symbol' at the user interface inside header/footer.
     447           0 :     else if ( !::CheckControlLayer( pObj ) )
     448             :     {
     449           0 :         SwCntntFrm *pCntnt = GetCurrFrm( sal_False );
     450           0 :         if( !pCntnt )
     451           0 :             return aRet;
     452           0 :         pFooterOrHeader = pCntnt->FindFooterOrHeader();
     453             :     }
     454             : 
     455             :     // Search nearest SwFlyFrm starting from the upper-left corner
     456             :     // of the fly
     457           0 :     SwCntntFrm *pTxtFrm = NULL;
     458             :     {
     459           0 :         SwCrsrMoveState aState( MV_SETONLYTEXT );
     460           0 :         SwPosition aPos( GetDoc()->GetNodes().GetEndOfExtras() );
     461           0 :         Point aTmpPnt( rAbsPos );
     462           0 :         GetLayout()->GetCrsrOfst( &aPos, aTmpPnt, &aState );
     463           0 :         if ( nAnchorId != FLY_AT_CHAR
     464           0 :              || !PosInsideInputFld( aPos ) )
     465             :         {
     466           0 :             pTxtFrm = aPos.nNode.GetNode().GetCntntNode()->getLayoutFrm( GetLayout(), 0, &aPos, false );
     467           0 :         }
     468             :     }
     469           0 :     const SwFrm *pNewAnch = NULL;
     470           0 :     if( pTxtFrm != NULL )
     471             :     {
     472           0 :         if ( FLY_AT_PAGE == nAnchorId )
     473             :         {
     474           0 :             pNewAnch = pTxtFrm->FindPageFrm();
     475             :         }
     476             :         else
     477             :         {
     478           0 :             pNewAnch = ::FindAnchor( pTxtFrm, rAbsPos );
     479             : 
     480           0 :             if( FLY_AT_FLY == nAnchorId ) // LAYER_IMPL
     481             :             {
     482           0 :                 pNewAnch = pNewAnch->FindFlyFrm();
     483             :             }
     484             :         }
     485             :     }
     486             : 
     487           0 :     if( pNewAnch && !pNewAnch->IsProtected() )
     488             :     {
     489           0 :         const SwFlyFrm* pCheck = bFlyFrame ? pNewAnch->FindFlyFrm() : 0;
     490             :         // If we land inside the frame, make sure
     491             :         // that the frame does not land inside its own content
     492           0 :         while( pCheck )
     493             :         {
     494           0 :             if( pCheck == pFly )
     495           0 :                 break;
     496           0 :             const SwFrm *pTmp = pCheck->GetAnchorFrm();
     497           0 :             pCheck = pTmp ? pTmp->FindFlyFrm() : NULL;
     498             :         }
     499             : 
     500             :         // Do not switch from header/footer to another area,
     501             :         // do not switch to a header/footer
     502           0 :         if( !pCheck &&
     503           0 :             pFooterOrHeader == pNewAnch->FindFooterOrHeader() )
     504             :         {
     505           0 :             aRet = pNewAnch->GetFrmAnchorPos( ::HasWrap( pObj ) );
     506             : 
     507           0 :             if ( bMoveIt || (nAnchorId == FLY_AT_CHAR) )
     508             :             {
     509           0 :                 SwFmtAnchor aAnch( rFmt.GetAnchor() );
     510           0 :                 switch ( nAnchorId )
     511             :                 {
     512             :                     case FLY_AT_PARA:
     513             :                     {
     514           0 :                         SwPosition *pPos = (SwPosition*)aAnch.GetCntntAnchor();
     515           0 :                         pPos->nNode = *pTxtFrm->GetNode();
     516           0 :                         pPos->nContent.Assign(0,0);
     517           0 :                         break;
     518             :                     }
     519             :                     case FLY_AT_PAGE:
     520             :                     {
     521             :                         aAnch.SetPageNum( ((const SwPageFrm*)pNewAnch)->
     522           0 :                                           GetPhyPageNum() );
     523           0 :                         break;
     524             :                     }
     525             : 
     526             :                     case FLY_AT_FLY:
     527             :                     {
     528           0 :                         SwPosition aPos( *((SwFlyFrm*)pNewAnch)->GetFmt()->
     529           0 :                                                   GetCntnt().GetCntntIdx() );
     530           0 :                         aAnch.SetAnchor( &aPos );
     531           0 :                         break;
     532             :                     }
     533             : 
     534             :                     case FLY_AT_CHAR:
     535             :                         {
     536           0 :                             SwPosition *pPos = (SwPosition*)aAnch.GetCntntAnchor();
     537           0 :                             Point aTmpPnt( rAbsPos );
     538           0 :                             if( pTxtFrm->GetCrsrOfst( pPos, aTmpPnt, NULL ) )
     539             :                             {
     540           0 :                                 SwRect aTmpRect;
     541           0 :                                 pTxtFrm->GetCharRect( aTmpRect, *pPos );
     542           0 :                                 aRet = aTmpRect.Pos();
     543             :                             }
     544             :                             else
     545             :                             {
     546           0 :                                 pPos->nNode = *pTxtFrm->GetNode();
     547           0 :                                 pPos->nContent.Assign(0,0);
     548             :                             }
     549           0 :                             break;
     550             :                         }
     551             :                     default:
     552           0 :                         break;
     553             : 
     554             :                 }
     555             : 
     556           0 :                 if( bMoveIt )
     557             :                 {
     558           0 :                     StartAllAction();
     559             :                     // --> handle change of anchor node:
     560             :                     // if count of the anchor frame also change, the fly frames have to be
     561             :                     // re-created. Thus, delete all fly frames except the <this> before the
     562             :                     // anchor attribute is change and re-create them afterwards.
     563             :                     {
     564           0 :                         SwHandleAnchorNodeChg* pHandleAnchorNodeChg( 0L );
     565           0 :                         SwFlyFrmFmt* pFlyFrmFmt( dynamic_cast<SwFlyFrmFmt*>(&rFmt) );
     566           0 :                         if ( pFlyFrmFmt )
     567             :                         {
     568             :                             pHandleAnchorNodeChg =
     569           0 :                                 new SwHandleAnchorNodeChg( *pFlyFrmFmt, aAnch );
     570             :                         }
     571           0 :                         rFmt.GetDoc()->SetAttr( aAnch, rFmt );
     572           0 :                         delete pHandleAnchorNodeChg;
     573             :                     }
     574             :                     // #i28701# - no call of method
     575             :                     // <CheckCharRectAndTopOfLine()> for to-character anchored
     576             :                     // Writer fly frame needed. This method call can cause a
     577             :                     // format of the anchor frame, which is no longer intended.
     578             :                     // Instead clear the anchor character rectangle and
     579             :                     // the top of line values for all to-character anchored objects.
     580           0 :                     pAnchoredObj->ClearCharRectAndTopOfLine();
     581           0 :                     EndAllAction();
     582           0 :                 }
     583             :             }
     584             : 
     585           0 :             SwRect aTmpRect( aRet, rAbsPos );
     586           0 :             if( aTmpRect.HasArea() )
     587           0 :                 MakeVisible( aTmpRect );
     588             : #if OSL_DEBUG_LEVEL > 0
     589             :             //TODO: That doesn't seem to be intended
     590             :             if( Color(COL_TRANSPARENT) != GetOut()->GetLineColor() )
     591             :             {
     592             :                 OSL_FAIL( "Hey, Joe: Where's my Null Pen?" );
     593             :                 GetOut()->SetLineColor( Color(COL_TRANSPARENT) );
     594             :             }
     595             : #endif
     596             :         }
     597             :     }
     598             : 
     599           0 :     return aRet;
     600             : }
     601             : 
     602             : /***********************************************************************
     603             : #*  Class       :  SwFEShell
     604             : #*  Methode     :  NewFlyFrm
     605             : #*  Description :
     606             : #***********************************************************************/
     607             : 
     608           0 : const SwFrmFmt *SwFEShell::NewFlyFrm( const SfxItemSet& rSet, sal_Bool bAnchValid,
     609             :                            SwFrmFmt *pParent )
     610             : {
     611           0 :     SET_CURR_SHELL( this );
     612           0 :     StartAllAction();
     613             : 
     614           0 :     SwPaM* pCrsr = GetCrsr();
     615           0 :     const Point aPt( GetCrsrDocPos() );
     616             : 
     617           0 :     SwSelBoxes aBoxes;
     618           0 :     sal_Bool bMoveCntnt = sal_True;
     619           0 :     if( IsTableMode() )
     620             :     {
     621           0 :         GetTblSel( *this, aBoxes );
     622           0 :         if( !aBoxes.empty() )
     623             :         {
     624             :             // Crsr should be removed from the removal area.
     625             :             // Always put it after/on the table; via the
     626             :             // document position they will be set to the old
     627             :             // position
     628           0 :             ParkCrsr( SwNodeIndex( *aBoxes[0]->GetSttNd() ));
     629             : 
     630             :             // #i127787# pCurCrsr will be deleted in ParkCrsr,
     631             :             // we better get the current pCurCrsr instead of working with the
     632             :             // deleted one:
     633           0 :             pCrsr = GetCrsr();
     634             :         }
     635             :         else
     636           0 :             bMoveCntnt = sal_False;
     637             :     }
     638           0 :     else if( !pCrsr->HasMark() && pCrsr->GetNext() == pCrsr )
     639           0 :         bMoveCntnt = sal_False;
     640             : 
     641           0 :     const SwPosition& rPos = *pCrsr->Start();
     642             : 
     643           0 :     SwFmtAnchor& rAnch = (SwFmtAnchor&)rSet.Get( RES_ANCHOR );
     644           0 :     RndStdIds eRndId = rAnch.GetAnchorId();
     645           0 :     switch( eRndId )
     646             :     {
     647             :     case FLY_AT_PAGE:
     648           0 :         if( !rAnch.GetPageNum() )       //HotFix: Bug in UpdateByExample
     649           0 :             rAnch.SetPageNum( 1 );
     650           0 :         break;
     651             : 
     652             :     case FLY_AT_FLY:
     653             :     case FLY_AT_PARA:
     654             :     case FLY_AT_CHAR:
     655             :     case FLY_AS_CHAR:
     656           0 :         if( !bAnchValid )
     657             :         {
     658           0 :             if( FLY_AT_FLY != eRndId )
     659             :             {
     660           0 :                 rAnch.SetAnchor( &rPos );
     661             :             }
     662           0 :             else if( lcl_SetNewFlyPos( rPos.nNode.GetNode(), rAnch, aPt ) )
     663             :             {
     664           0 :                 eRndId = FLY_AT_PAGE;
     665             :             }
     666             :         }
     667           0 :         break;
     668             : 
     669             :     default:
     670             :         OSL_ENSURE( !this, "What is the purpose of this Fly?" );
     671           0 :         break;
     672             :     }
     673             : 
     674             :     SwFlyFrmFmt *pRet;
     675           0 :     if( bMoveCntnt )
     676             :     {
     677           0 :         GetDoc()->GetIDocumentUndoRedo().StartUndo( UNDO_INSLAYFMT, NULL );
     678           0 :         SwFmtAnchor* pOldAnchor = 0;
     679           0 :         bool bHOriChgd = false, bVOriChgd = false;
     680           0 :         SwFmtVertOrient aOldV;
     681           0 :         SwFmtHoriOrient aOldH;
     682             : 
     683           0 :         if ( FLY_AT_PAGE != eRndId )
     684             :         {
     685             :            // First as with page link. Paragraph/character link on if
     686             :             // everything was shifted. Then the position is valid!
     687             :             // JP 13.05.98: if necessary also convert the horizontal/vertical
     688             :             //              orientation, to prevent correction during re-anchoring
     689           0 :             pOldAnchor = new SwFmtAnchor( rAnch );
     690           0 :             const_cast<SfxItemSet&>(rSet).Put( SwFmtAnchor( FLY_AT_PAGE, 1 ) );
     691             : 
     692             :             const SfxPoolItem* pItem;
     693           0 :             if( SFX_ITEM_SET == rSet.GetItemState( RES_HORI_ORIENT, false, &pItem )
     694           0 :                 && text::HoriOrientation::NONE == ((SwFmtHoriOrient*)pItem)->GetHoriOrient() )
     695             :             {
     696           0 :                 bHOriChgd = true;
     697           0 :                 aOldH = *((SwFmtHoriOrient*)pItem);
     698           0 :                 ((SfxItemSet&)rSet).Put( SwFmtHoriOrient( 0, text::HoriOrientation::LEFT ) );
     699             :             }
     700           0 :             if( SFX_ITEM_SET == rSet.GetItemState( RES_VERT_ORIENT, false, &pItem )
     701           0 :                 && text::VertOrientation::NONE == ((SwFmtVertOrient*)pItem)->GetVertOrient() )
     702             :             {
     703           0 :                 bVOriChgd = true;
     704           0 :                 aOldV = *((SwFmtVertOrient*)pItem);
     705           0 :                 ((SfxItemSet&)rSet).Put( SwFmtVertOrient( 0, text::VertOrientation::TOP ) );
     706             :             }
     707             :         }
     708             : 
     709           0 :         pRet = GetDoc()->MakeFlyAndMove( *pCrsr, rSet, &aBoxes, pParent );
     710             : 
     711           0 :         KillPams();
     712             : 
     713           0 :         if( pOldAnchor )
     714             :         {
     715           0 :             if( pRet )
     716             :             {
     717             :                 // calculate new position
     718             :                 // JP 24.03.97: also go via page links
     719             :                 //              chaos::anchor should not lie in the shifted area
     720           0 :                 pRet->DelFrms();
     721             : 
     722           0 :                 const SwFrm* pAnch = ::FindAnchor( GetLayout(), aPt, sal_False );
     723           0 :                 SwPosition aPos( *((SwCntntFrm*)pAnch)->GetNode() );
     724           0 :                 if ( FLY_AS_CHAR == eRndId )
     725             :                 {
     726           0 :                     aPos.nContent.Assign( ((SwCntntFrm*)pAnch)->GetNode(), 0 );
     727             :                 }
     728           0 :                 pOldAnchor->SetAnchor( &aPos );
     729             : 
     730             :                 // shifting of table selection is not Undo-capable. therefore
     731             :                 // changing the anchors should not be recorded
     732             :                 bool const bDoesUndo =
     733           0 :                     GetDoc()->GetIDocumentUndoRedo().DoesUndo();
     734           0 :                 SwUndoId nLastUndoId(UNDO_EMPTY);
     735           0 :                 if (bDoesUndo &&
     736           0 :                     GetDoc()->GetIDocumentUndoRedo().GetLastUndoInfo(0,
     737           0 :                         & nLastUndoId))
     738             :                 {
     739           0 :                     if (UNDO_INSLAYFMT == nLastUndoId)
     740             :                     {
     741           0 :                         GetDoc()->GetIDocumentUndoRedo().DoUndo(false);
     742             :                     }
     743             :                 }
     744             : 
     745           0 :                 ((SfxItemSet&)rSet).Put( *pOldAnchor );
     746             : 
     747           0 :                 if( bHOriChgd )
     748           0 :                     ((SfxItemSet&)rSet).Put( aOldH );
     749           0 :                 if( bVOriChgd )
     750           0 :                     ((SfxItemSet&)rSet).Put( aOldV );
     751             : 
     752           0 :                 GetDoc()->SetFlyFrmAttr( *pRet, (SfxItemSet&)rSet );
     753           0 :                 GetDoc()->GetIDocumentUndoRedo().DoUndo(bDoesUndo);
     754             :             }
     755           0 :             delete pOldAnchor;
     756             :         }
     757           0 :         GetDoc()->GetIDocumentUndoRedo().EndUndo( UNDO_INSLAYFMT, NULL );
     758             :     }
     759             :     else
     760             :         /* If called from a shell try to propagate an
     761             :             existing adjust item from rPos to the content node of the
     762             :             new frame. */
     763           0 :         pRet = GetDoc()->MakeFlySection( eRndId, &rPos, &rSet, pParent, true );
     764             : 
     765           0 :     if( pRet )
     766             :     {
     767           0 :         SwFlyFrm* pFrm = pRet->GetFrm( &aPt );
     768           0 :         if( pFrm )
     769           0 :             SelectFlyFrm( *pFrm, sal_True );
     770             :         else
     771             :         {
     772           0 :             GetLayout()->SetAssertFlyPages();
     773           0 :             pRet = 0;
     774             :         }
     775             :     }
     776           0 :     EndAllActionAndCall();
     777             : 
     778           0 :     return pRet;
     779             : }
     780             : 
     781             : /***********************************************************************
     782             : #*  Class       :  SwFEShell
     783             : #*  Methode     :  Insert
     784             : #***********************************************************************/
     785             : 
     786           0 : void SwFEShell::Insert( const OUString& rGrfName, const OUString& rFltName,
     787             :                         const Graphic* pGraphic,
     788             :                         const SfxItemSet* pFlyAttrSet,
     789             :                         const SfxItemSet* pGrfAttrSet,
     790             :                         SwFrmFmt* pFrmFmt )
     791             : {
     792           0 :     SwFlyFrmFmt* pFmt = 0;
     793           0 :     SET_CURR_SHELL( this );
     794           0 :     StartAllAction();
     795           0 :     SwShellCrsr *pStartCursor = dynamic_cast<SwShellCrsr*>(this->GetSwCrsr());
     796           0 :     SwShellCrsr *pCursor = pStartCursor;
     797           0 :     do
     798             :     {
     799           0 :         if (!pCursor)
     800           0 :             break;
     801             : 
     802             :         // Has the anchor not been set or been set incompletely?
     803           0 :         if( pFlyAttrSet )
     804             :         {
     805             :             const SfxPoolItem* pItem;
     806           0 :             if( SFX_ITEM_SET == pFlyAttrSet->GetItemState( RES_ANCHOR, false,
     807           0 :                     &pItem ) )
     808             :             {
     809           0 :                 SwFmtAnchor* pAnchor = (SwFmtAnchor*)pItem;
     810           0 :                 switch( pAnchor->GetAnchorId())
     811             :                 {
     812             :                 case FLY_AT_PARA:
     813             :                 case FLY_AT_CHAR: // LAYER_IMPL
     814             :                 case FLY_AS_CHAR:
     815           0 :                     if( !pAnchor->GetCntntAnchor() )
     816             :                     {
     817           0 :                         pAnchor->SetAnchor( pCursor->GetPoint() );
     818             :                     }
     819           0 :                     break;
     820             :                 case FLY_AT_FLY:
     821           0 :                     if( !pAnchor->GetCntntAnchor() )
     822             :                     {
     823           0 :                         lcl_SetNewFlyPos( *pCursor->GetNode(),
     824           0 :                                 *pAnchor, GetCrsrDocPos() );
     825             :                     }
     826           0 :                     break;
     827             :                 case FLY_AT_PAGE:
     828           0 :                     if( !pAnchor->GetPageNum() )
     829             :                     {
     830             :                         pAnchor->SetPageNum( pCursor->GetPageNum(
     831           0 :                                 true, &pCursor->GetPtPos() ) );
     832             :                     }
     833           0 :                     break;
     834             :                 default :
     835           0 :                     break;
     836             :                 }
     837             :             }
     838             :         }
     839           0 :         pFmt = GetDoc()->Insert(*pCursor, rGrfName,
     840             :                                 rFltName, pGraphic,
     841             :                                 pFlyAttrSet,
     842           0 :                                 pGrfAttrSet, pFrmFmt );
     843             :         OSL_ENSURE( pFmt, "Doc->Insert(notxt) failed." );
     844             : 
     845           0 :         pCursor = dynamic_cast<SwShellCrsr*>(pCursor->GetNext());
     846             :     } while( pCursor != pStartCursor );
     847             : 
     848           0 :     EndAllAction();
     849             : 
     850           0 :     if( pFmt )
     851             :     {
     852           0 :         const Point aPt( GetCrsrDocPos() );
     853           0 :         SwFlyFrm* pFrm = pFmt->GetFrm( &aPt );
     854             : 
     855           0 :         if( pFrm )
     856             :         {
     857             :             // fdo#36681: Invalidate the content and layout to refresh
     858             :             // the picture anchoring properly
     859           0 :             SwPageFrm* pPageFrm = pFrm->FindPageFrmOfAnchor();
     860           0 :             pPageFrm->InvalidateFlyLayout();
     861           0 :             pPageFrm->InvalidateCntnt();
     862             : 
     863           0 :             SelectFlyFrm( *pFrm, sal_True );
     864             :         }
     865             :         else
     866           0 :             GetLayout()->SetAssertFlyPages();
     867           0 :     }
     868           0 : }
     869             : 
     870           0 : SwFlyFrmFmt* SwFEShell::InsertObject( const svt::EmbeddedObjectRef&  xObj,
     871             :                         const SfxItemSet* pFlyAttrSet,
     872             :                         const SfxItemSet* pGrfAttrSet,
     873             :                         SwFrmFmt* pFrmFmt )
     874             : {
     875           0 :     SwFlyFrmFmt* pFmt = 0;
     876           0 :     SET_CURR_SHELL( this );
     877           0 :     StartAllAction();
     878           0 :         FOREACHPAM_START(GetCrsr())
     879           0 :             pFmt = GetDoc()->Insert(*PCURCRSR, xObj,
     880           0 :                                     pFlyAttrSet, pGrfAttrSet, pFrmFmt );
     881             :             OSL_ENSURE( pFmt, "Doc->Insert(notxt) failed." );
     882             : 
     883           0 :         FOREACHPAM_END()
     884           0 :     EndAllAction();
     885             : 
     886           0 :     if( pFmt )
     887             :     {
     888           0 :         const Point aPt( GetCrsrDocPos() );
     889           0 :         SwFlyFrm* pFrm = pFmt->GetFrm( &aPt );
     890             : 
     891           0 :         if( pFrm )
     892           0 :             SelectFlyFrm( *pFrm, sal_True );
     893             :         else
     894           0 :             GetLayout()->SetAssertFlyPages();
     895             :     }
     896             : 
     897           0 :     return pFmt;
     898             : }
     899             : 
     900           0 : void SwFEShell::InsertDrawObj( SdrObject& rDrawObj,
     901             :                                const Point& rInsertPosition )
     902             : {
     903           0 :     SET_CURR_SHELL( this );
     904             : 
     905           0 :     SfxItemSet rFlyAttrSet( GetDoc()->GetAttrPool(), aFrmFmtSetRange );
     906           0 :     rFlyAttrSet.Put( SwFmtAnchor( FLY_AT_PARA ));
     907             :     // #i89920#
     908           0 :     rFlyAttrSet.Put( SwFmtSurround( SURROUND_THROUGHT ) );
     909           0 :     rDrawObj.SetLayer( getIDocumentDrawModelAccess()->GetHeavenId() );
     910             : 
     911             :     // find anchor position
     912           0 :     SwPaM aPam( mpDoc->GetNodes() );
     913             :     {
     914           0 :         SwCrsrMoveState aState( MV_SETONLYTEXT );
     915           0 :         Point aTmpPt( rInsertPosition );
     916           0 :         GetLayout()->GetCrsrOfst( aPam.GetPoint(), aTmpPt, &aState );
     917           0 :         const SwFrm* pFrm = aPam.GetCntntNode()->getLayoutFrm( GetLayout(), 0, 0, false );
     918           0 :         const Point aRelPos( rInsertPosition.X() - pFrm->Frm().Left(),
     919           0 :                              rInsertPosition.Y() - pFrm->Frm().Top() );
     920           0 :         rDrawObj.SetRelativePos( aRelPos );
     921           0 :         ::lcl_FindAnchorPos( *this, *GetDoc(), rInsertPosition, *pFrm, rFlyAttrSet );
     922             :     }
     923             :     // insert drawing object into the document creating a new <SwDrawFrmFmt> instance
     924           0 :     SwDrawFrmFmt* pFmt = GetDoc()->InsertDrawObj( aPam, rDrawObj, rFlyAttrSet );
     925             : 
     926             :     // move object to visible layer
     927           0 :     SwContact* pContact = static_cast<SwContact*>(rDrawObj.GetUserCall());
     928           0 :     if ( pContact )
     929             :     {
     930           0 :         pContact->MoveObjToVisibleLayer( &rDrawObj );
     931             :     }
     932             : 
     933           0 :     if ( pFmt )
     934             :     {
     935             :         // select drawing object
     936           0 :         Imp()->GetDrawView()->MarkObj( &rDrawObj, Imp()->GetPageView(),
     937           0 :                                        false, false );
     938             :     }
     939             :     else
     940             :     {
     941           0 :         GetLayout()->SetAssertFlyPages();
     942           0 :     }
     943           0 : }
     944             : 
     945             : /***********************************************************************
     946             : #*  Class       :  SwFEShell
     947             : #*  Methode     :  GetPageObjs
     948             : #***********************************************************************/
     949             : 
     950           0 : void SwFEShell::GetPageObjs( std::vector<SwFrmFmt*>& rFillArr )
     951             : {
     952           0 :     rFillArr.clear();
     953             : 
     954           0 :     for( sal_uInt16 n = 0; n < mpDoc->GetSpzFrmFmts()->size(); ++n )
     955             :     {
     956           0 :         SwFrmFmt* pFmt = (*mpDoc->GetSpzFrmFmts())[n];
     957           0 :         if (FLY_AT_PAGE == pFmt->GetAnchor().GetAnchorId())
     958             :         {
     959           0 :             rFillArr.push_back( pFmt );
     960             :         }
     961             :     }
     962           0 : }
     963             : 
     964             : /***********************************************************************
     965             : #*  Class       :  SwFEShell
     966             : #*  Methode     :  SetPageFlysNewPage
     967             : #***********************************************************************/
     968             : 
     969           0 : void SwFEShell::SetPageObjsNewPage( std::vector<SwFrmFmt*>& rFillArr, int nOffset )
     970             : {
     971           0 :     if( rFillArr.empty() || !nOffset )
     972           0 :         return;
     973             : 
     974           0 :     StartAllAction();
     975           0 :     StartUndo();
     976             : 
     977             :     long nNewPage;
     978           0 :     SwRootFrm* pTmpRootFrm = GetLayout();
     979           0 :     sal_uInt16 nMaxPage = pTmpRootFrm->GetPageNum();
     980           0 :     bool bTmpAssert = false;
     981           0 :     for( sal_uInt16 n = 0; n < rFillArr.size(); ++n )
     982             :     {
     983           0 :         SwFrmFmt* pFmt = rFillArr[n];
     984           0 :         if( mpDoc->GetSpzFrmFmts()->Contains( pFmt ))
     985             :         {
     986             :             // FlyFmt is still valid, therefore process
     987             : 
     988           0 :             SwFmtAnchor aNewAnchor( pFmt->GetAnchor() );
     989           0 :             if ((FLY_AT_PAGE != aNewAnchor.GetAnchorId()) ||
     990           0 :                 0 >= ( nNewPage = aNewAnchor.GetPageNum() + nOffset ) )
     991             :                 // chaos::Anchor has been changed or invalid page number,
     992             :                 // therefore: do not change!
     993           0 :                 continue;
     994             : 
     995           0 :             if( sal_uInt16(nNewPage) > nMaxPage )
     996             :             {
     997           0 :                 if ( RES_DRAWFRMFMT == pFmt->Which() )
     998             :                 {
     999           0 :                     SwContact *pCon = pFmt->FindContactObj();
    1000           0 :                     if( pCon )
    1001           0 :                         ((SwDrawContact*)pCon)->DisconnectFromLayout();
    1002             :                 }
    1003             :                 else
    1004           0 :                     pFmt->DelFrms();
    1005           0 :                 bTmpAssert = true;
    1006             :             }
    1007           0 :             aNewAnchor.SetPageNum( sal_uInt16(nNewPage) );
    1008           0 :             mpDoc->SetAttr( aNewAnchor, *pFmt );
    1009             :         }
    1010             :     }
    1011             : 
    1012           0 :     if( bTmpAssert )
    1013           0 :         pTmpRootFrm->SetAssertFlyPages();
    1014             : 
    1015           0 :     EndUndo();
    1016           0 :     EndAllAction();
    1017             : }
    1018             : 
    1019             : /***********************************************************************
    1020             : #*  Class       :  SwFEShell
    1021             : #*  Methode     :  GetFlyFrmAttr
    1022             : #*  Description :  all attributes in the "baskets" will be filled
    1023             : #*                 with the attributes of the current FlyFrms.
    1024             : #*                 Attributes which cannot be filled due to being at the wrong place
    1025             : #*                 or which are ambiguous (multiple selections) will be removed.
    1026             : #*
    1027             : #***********************************************************************/
    1028             : 
    1029           0 : sal_Bool SwFEShell::GetFlyFrmAttr( SfxItemSet &rSet ) const
    1030             : {
    1031           0 :     SwFlyFrm *pFly = FindFlyFrm();
    1032           0 :     if ( !pFly )
    1033             :     {
    1034           0 :         SwFrm* pCurrFrm( GetCurrFrm() );
    1035           0 :         if ( !pCurrFrm )
    1036             :         {
    1037             :             OSL_FAIL( "<SwFEShell::GetFlyFrmAttr(..)> - missing current frame. This is a serious defect, please inform OD." );
    1038           0 :             return sal_False;
    1039             :         }
    1040           0 :         pFly = GetCurrFrm()->FindFlyFrm();
    1041           0 :         if ( !pFly )
    1042             :         {
    1043             :             OSL_ENSURE( !this, "GetFlyFrmAttr, no Fly selected." );
    1044           0 :             return sal_False;
    1045             :         }
    1046             :     }
    1047             : 
    1048           0 :     SET_CURR_SHELL( (SwViewShell*)this );
    1049             : 
    1050           0 :     if( !rSet.Set( pFly->GetFmt()->GetAttrSet(), true ) )
    1051           0 :         return sal_False;
    1052             : 
    1053             :     // now examine all attributes. Remove forbidden attributes, then
    1054             :     // get all remaining attributes and enter them
    1055             :     const SfxPoolItem* pItem;
    1056           0 :     if( SFX_ITEM_SET == rSet.GetItemState( RES_ANCHOR, false, &pItem ) )
    1057             :     {
    1058           0 :         SwFmtAnchor* pAnchor = (SwFmtAnchor*)pItem;
    1059           0 :         RndStdIds eType = pAnchor->GetAnchorId();
    1060             : 
    1061           0 :         if ( FLY_AT_PAGE != eType )
    1062             :         {
    1063             :             // OD 12.11.2003 #i22341# - content anchor of anchor item is needed.
    1064             :             // Thus, don't overwrite anchor item by default contructed anchor item.
    1065           0 :             if ( FLY_AS_CHAR == eType )
    1066             :             {
    1067           0 :                 rSet.ClearItem( RES_OPAQUE );
    1068           0 :                 rSet.ClearItem( RES_SURROUND );
    1069             :             }
    1070             :         }
    1071             :     }
    1072           0 :     rSet.SetParent( pFly->GetFmt()->GetAttrSet().GetParent() );
    1073             :     // attributes must be removed
    1074           0 :     rSet.ClearItem( RES_FILL_ORDER );
    1075           0 :     rSet.ClearItem( RES_CNTNT );
    1076             :     //MA: remove first (Template by example etc.)
    1077           0 :     rSet.ClearItem( RES_CHAIN );
    1078           0 :     return sal_True;
    1079             : }
    1080             : /***********************************************************************
    1081             : #*  Class       :  SwFEShell
    1082             : #*  Methode     :  SetFlyFrmAttr
    1083             : #*  Description :  Attributes of the current fly will change.
    1084             : #***********************************************************************/
    1085             : 
    1086           0 : bool SwFEShell::SetFlyFrmAttr( SfxItemSet& rSet )
    1087             : {
    1088           0 :     SET_CURR_SHELL( this );
    1089           0 :     bool bRet = false;
    1090             : 
    1091           0 :     if( rSet.Count() )
    1092             :     {
    1093           0 :         SwFlyFrm *pFly = FindFlyFrm();
    1094           0 :         if( !pFly )
    1095             :         {
    1096             :             OSL_ENSURE( GetCurrFrm(), "Crsr in parking zone" );
    1097           0 :             pFly = GetCurrFrm()->FindFlyFrm();
    1098             :             OSL_ENSURE( pFly, "SetFlyFrmAttr, no Fly selected." );
    1099             :         }
    1100           0 :         if( pFly )
    1101             :         {
    1102           0 :             StartAllAction();
    1103           0 :             const Point aPt( pFly->Frm().Pos() );
    1104             : 
    1105           0 :             if( SFX_ITEM_SET == rSet.GetItemState( RES_ANCHOR, false ))
    1106           0 :                 sw_ChkAndSetNewAnchor( *this, *pFly, rSet );
    1107           0 :             SwFlyFrmFmt* pFlyFmt = (SwFlyFrmFmt*)pFly->GetFmt();
    1108             : 
    1109           0 :             if( GetDoc()->SetFlyFrmAttr( *pFlyFmt, rSet ))
    1110             :             {
    1111           0 :                 bRet = true;
    1112           0 :                 SwFlyFrm* pFrm = pFlyFmt->GetFrm( &aPt );
    1113           0 :                 if( pFrm )
    1114           0 :                     SelectFlyFrm( *pFrm, sal_True );
    1115             :                 else
    1116           0 :                     GetLayout()->SetAssertFlyPages();
    1117             :             }
    1118             : 
    1119           0 :             EndAllActionAndCall();
    1120             :         }
    1121             :     }
    1122           0 :     return bRet;
    1123             : }
    1124             : 
    1125           0 : sal_Bool SwFEShell::SetDrawingAttr( SfxItemSet& rSet )
    1126             : {
    1127           0 :     sal_Bool bRet = sal_False;
    1128           0 :     SET_CURR_SHELL( this );
    1129           0 :     if ( !rSet.Count() ||
    1130           0 :             !Imp()->HasDrawView() )
    1131           0 :         return bRet;
    1132             : 
    1133           0 :     const SdrMarkList &rMrkList = Imp()->GetDrawView()->GetMarkedObjectList();
    1134           0 :     if ( rMrkList.GetMarkCount() != 1 )
    1135           0 :         return bRet;
    1136             : 
    1137           0 :     StartUndo();
    1138           0 :     SdrObject *pObj = rMrkList.GetMark( 0 )->GetMarkedSdrObj();
    1139           0 :     SwFrmFmt *pFmt = FindFrmFmt( pObj );
    1140           0 :     StartAllAction();
    1141           0 :     if( SFX_ITEM_SET == rSet.GetItemState( RES_ANCHOR, false ))
    1142             :     {
    1143           0 :         RndStdIds nNew = ((SwFmtAnchor&)rSet.Get( RES_ANCHOR )).GetAnchorId();
    1144           0 :         if ( nNew != pFmt->GetAnchor().GetAnchorId() )
    1145             :         {
    1146           0 :             ChgAnchor( nNew );
    1147             :             // #i26791# - clear anchor attribute in item set,
    1148             :             // because method <ChgAnchor(..)> takes care of it.
    1149           0 :             rSet.ClearItem( RES_ANCHOR );
    1150             :         }
    1151             :     }
    1152             : 
    1153           0 :     if( GetDoc()->SetFlyFrmAttr( *pFmt, rSet ))
    1154             :     {
    1155           0 :         bRet = sal_True;
    1156           0 :         Point aTmp;
    1157           0 :         SelectObj( aTmp, 0, pObj );
    1158             :     }
    1159           0 :     EndAllActionAndCall();
    1160           0 :     EndUndo();
    1161           0 :     return bRet;
    1162             : }
    1163             : 
    1164             : /***********************************************************************
    1165             : #*  Class       :  SwFEShell
    1166             : #*  Methode     :  ResetFlyFrmAttr
    1167             : #*  Description :  Reset requested attributes or the ones contained in
    1168             : #*                 the set.
    1169             : #***********************************************************************/
    1170             : 
    1171           0 : sal_Bool SwFEShell::ResetFlyFrmAttr( sal_uInt16 nWhich, const SfxItemSet* pSet )
    1172             : {
    1173           0 :     sal_Bool bRet = sal_False;
    1174             : 
    1175           0 :     if( RES_ANCHOR != nWhich && RES_CHAIN != nWhich && RES_CNTNT != nWhich )
    1176             :     {
    1177           0 :         SET_CURR_SHELL( this );
    1178             : 
    1179           0 :         SwFlyFrm *pFly = FindFlyFrm();
    1180           0 :         if( !pFly )
    1181             :         {
    1182             :             OSL_ENSURE( GetCurrFrm(), "Crsr in parking zone" );
    1183           0 :             pFly = GetCurrFrm()->FindFlyFrm();
    1184             :             OSL_ENSURE( pFly, "SetFlyFrmAttr, no Fly selected." );
    1185             :         }
    1186             : 
    1187           0 :         if( pFly )
    1188             :         {
    1189           0 :             StartAllAction();
    1190             : 
    1191           0 :             if( pSet )
    1192             :             {
    1193           0 :                 SfxItemIter aIter( *pSet );
    1194           0 :                 const SfxPoolItem* pItem = aIter.FirstItem();
    1195           0 :                 while( pItem )
    1196             :                 {
    1197           0 :                     if( !IsInvalidItem( pItem ) &&
    1198           0 :                         RES_ANCHOR != ( nWhich = pItem->Which() ) &&
    1199           0 :                         RES_CHAIN != nWhich && RES_CNTNT != nWhich )
    1200           0 :                         pFly->GetFmt()->ResetFmtAttr( nWhich );
    1201           0 :                     pItem = aIter.NextItem();
    1202           0 :                 }
    1203             :             }
    1204             :             else
    1205           0 :                 pFly->GetFmt()->ResetFmtAttr( nWhich );
    1206             : 
    1207           0 :             bRet = sal_True;
    1208           0 :             EndAllActionAndCall();
    1209           0 :             GetDoc()->SetModified();
    1210           0 :         }
    1211             :     }
    1212           0 :     return bRet;
    1213             : }
    1214             : 
    1215             : /***********************************************************************
    1216             : #*  Class       :  SwFEShell
    1217             : #*  Methode     :  GetCurFrmFmt
    1218             : #*  Description :  Returns frame-format if frame, otherwise 0
    1219             : #***********************************************************************/
    1220             : 
    1221           0 : SwFrmFmt* SwFEShell::GetCurFrmFmt() const
    1222             : {
    1223           0 :     SwFrmFmt* pRet = 0;
    1224           0 :     SwLayoutFrm *pFly = FindFlyFrm();
    1225           0 :     if( pFly && ( pRet = (SwFrmFmt*)pFly->GetFmt()->DerivedFrom() ) ==
    1226           0 :                                             GetDoc()->GetDfltFrmFmt() )
    1227           0 :         pRet = 0;
    1228           0 :     return pRet;
    1229             : }
    1230             : 
    1231             : /******************************************************************************
    1232             :  *  Methode     :   void SwFEShell::SetFrmFmt(SwFrmFmt *pNewFmt)
    1233             :  *  Description :
    1234             :  ******************************************************************************/
    1235             : 
    1236           0 : void SwFEShell::SetFrmFmt( SwFrmFmt *pNewFmt, bool bKeepOrient, Point* pDocPos )
    1237             : {
    1238           0 :     SwFlyFrm *pFly = 0;
    1239           0 :     if(pDocPos)
    1240             :     {
    1241           0 :         const SwFrmFmt* pFmt = GetFmtFromObj( *pDocPos );
    1242             : 
    1243           0 :         if(PTR_CAST(SwFlyFrmFmt, pFmt))
    1244           0 :             pFly = ((SwFlyFrmFmt*)pFmt)->GetFrm();
    1245             :     }
    1246             :     else
    1247           0 :         pFly = FindFlyFrm();
    1248             :     OSL_ENSURE( pFly, "SetFrmFmt: no frame" );
    1249           0 :     if( pFly )
    1250             :     {
    1251           0 :         StartAllAction();
    1252           0 :         SET_CURR_SHELL( this );
    1253             : 
    1254           0 :         SwFlyFrmFmt* pFlyFmt = (SwFlyFrmFmt*)pFly->GetFmt();
    1255           0 :         const Point aPt( pFly->Frm().Pos() );
    1256             : 
    1257           0 :         SfxItemSet* pSet = 0;
    1258             :         const SfxPoolItem* pItem;
    1259           0 :         if( SFX_ITEM_SET == pNewFmt->GetItemState( RES_ANCHOR, sal_False, &pItem ))
    1260             :         {
    1261           0 :             pSet = new SfxItemSet( GetDoc()->GetAttrPool(), aFrmFmtSetRange );
    1262           0 :             pSet->Put( *pItem );
    1263           0 :             if( !sw_ChkAndSetNewAnchor( *this, *pFly, *pSet ))
    1264           0 :                 delete pSet, pSet = 0;
    1265             :         }
    1266             : 
    1267           0 :         if( GetDoc()->SetFrmFmtToFly( *pFlyFmt, *pNewFmt, pSet, bKeepOrient ))
    1268             :         {
    1269           0 :             SwFlyFrm* pFrm = pFlyFmt->GetFrm( &aPt );
    1270           0 :             if( pFrm )
    1271           0 :                 SelectFlyFrm( *pFrm, sal_True );
    1272             :             else
    1273           0 :                 GetLayout()->SetAssertFlyPages();
    1274             :         }
    1275           0 :         delete pSet;
    1276             : 
    1277           0 :         EndAllActionAndCall();
    1278             :     }
    1279           0 : }
    1280             : 
    1281             : /*************************************************************************
    1282             : |*
    1283             : |*  SwFEShell::GetFlyFrmFmt()
    1284             : |*
    1285             : *************************************************************************/
    1286             : 
    1287           0 : const SwFrmFmt* SwFEShell::GetFlyFrmFmt() const
    1288             : {
    1289           0 :     const SwFlyFrm* pFly = FindFlyFrm();
    1290           0 :     if ( !pFly )
    1291             :     {
    1292           0 :         SwFrm* pCurrFrm = GetCurrFrm();
    1293           0 :         pFly = pCurrFrm ? pCurrFrm->FindFlyFrm() : 0;
    1294             :     }
    1295           0 :     if( pFly )
    1296           0 :         return pFly->GetFmt();
    1297           0 :     return 0;
    1298             : }
    1299             : 
    1300           0 : SwFrmFmt* SwFEShell::GetFlyFrmFmt()
    1301             : {
    1302           0 :     SwFlyFrm* pFly = FindFlyFrm();
    1303           0 :     if ( !pFly )
    1304             :     {
    1305           0 :         SwFrm* pCurrFrm = GetCurrFrm();
    1306           0 :         pFly = pCurrFrm ? pCurrFrm->FindFlyFrm() : 0;
    1307             :     }
    1308           0 :     if( pFly )
    1309           0 :         return pFly->GetFmt();
    1310           0 :     return 0;
    1311             : }
    1312             : 
    1313             : /*************************************************************************
    1314             : |*
    1315             : |*  SwFEShell::GetFlyRect()
    1316             : |*
    1317             : *************************************************************************/
    1318             : 
    1319           0 : SwRect SwFEShell::GetFlyRect() const
    1320             : {
    1321           0 :     SwCntntFrm *pCntnt = GetCurrFrm( sal_False );
    1322           0 :     SwFlyFrm *pFly = pCntnt ? pCntnt->FindFlyFrm() : 0;
    1323           0 :     if ( !pFly )
    1324             :     {
    1325           0 :         SwRect aRect;
    1326           0 :         return aRect;
    1327             :     }
    1328             :     else
    1329           0 :         return pFly->Frm();
    1330             : }
    1331             : 
    1332             : /*************************************************************************
    1333             : |*
    1334             : |*  SwFEShell::GetObjRect()
    1335             : |*
    1336             : *************************************************************************/
    1337             : 
    1338           0 : SwRect SwFEShell::GetObjRect() const
    1339             : {
    1340           0 :     if( Imp()->HasDrawView() )
    1341           0 :         return Imp()->GetDrawView()->GetAllMarkedRect();
    1342             :     else
    1343             :     {
    1344           0 :         SwRect aRect;
    1345           0 :         return aRect;
    1346             :     }
    1347             : }
    1348             : 
    1349           0 : void SwFEShell::SetObjRect( const SwRect& rRect )
    1350             : {
    1351           0 :     if ( Imp()->HasDrawView() )
    1352             :     {
    1353           0 :         Imp()->GetDrawView()->SetAllMarkedRect( rRect.SVRect() );
    1354           0 :         CallChgLnk();   // call AttrChangeNotify on the UI-side.
    1355             :     }
    1356           0 : }
    1357             : 
    1358             : /***********************************************************************
    1359             : #*  Class       :  SwFEShell
    1360             : #*  Methode     :  RequestObjectResize()
    1361             : #***********************************************************************/
    1362             : 
    1363           0 : Size SwFEShell::RequestObjectResize( const SwRect &rRect, const uno::Reference < embed::XEmbeddedObject >& xObj )
    1364             : {
    1365           0 :     Size aResult;
    1366             : 
    1367           0 :     SwFlyFrm *pFly = FindFlyFrm( xObj );
    1368           0 :     if ( !pFly )
    1369             :     {
    1370           0 :         aResult = rRect.SSize();
    1371           0 :         return aResult;
    1372             :     }
    1373             : 
    1374           0 :     aResult = pFly->Prt().SSize();
    1375             : 
    1376           0 :     sal_Bool bPosProt = pFly->GetFmt()->GetProtect().IsPosProtected();
    1377           0 :     sal_Bool bSizeProt = pFly->GetFmt()->GetProtect().IsSizeProtected();
    1378             : 
    1379           0 :     StartAllAction();
    1380             : 
    1381             :     // MA we do not allow to clip the Fly, as the OLE server can
    1382             :     // request various wishes. Clipping is done via the formatting.
    1383             :     // Correct display is done by scaling.
    1384             :     // Scaling is done by SwNoTxtFrm::Format by calling
    1385             :     // SwWrtShell::CalcAndSetScale()
    1386           0 :     if ( rRect.SSize() != pFly->Prt().SSize() && !bSizeProt )
    1387             :     {
    1388           0 :          Size aSz( rRect.SSize() );
    1389             : 
    1390             :         //JP 28.02.2001: Task 74707 - ask for fly in fly with automatic size
    1391             : 
    1392             :         const SwFrm* pAnchor;
    1393             :         const SwTxtNode* pTNd;
    1394             :         const SwpHints* pHts;
    1395           0 :         const SwFmtFrmSize& rFrmSz = pFly->GetFmt()->GetFrmSize();
    1396           0 :         if( bCheckForOLEInCaption &&
    1397           0 :             0 != rFrmSz.GetWidthPercent() &&
    1398           0 :             0 != (pAnchor = pFly->GetAnchorFrm()) &&
    1399           0 :             pAnchor->IsTxtFrm() &&
    1400           0 :             !pAnchor->GetNext() && !pAnchor->GetPrev() &&
    1401           0 :             pAnchor->GetUpper()->IsFlyFrm() &&
    1402           0 :             0 != ( pTNd = ((SwTxtFrm*)pAnchor)->GetNode()->GetTxtNode()) &&
    1403             :             0 != ( pHts = pTNd->GetpSwpHints() ))
    1404             :         {
    1405             :             // search for a sequence field:
    1406             :             const SfxPoolItem* pItem;
    1407           0 :             for( sal_uInt16 n = 0, nEnd = pHts->Count(); n < nEnd; ++n )
    1408           0 :                 if( RES_TXTATR_FIELD == ( pItem = &(*pHts)[ n ]->GetAttr())->Which()
    1409           0 :                     && TYP_SEQFLD == ((SwFmtFld*)pItem)->GetField()->GetTypeId() )
    1410             :                 {
    1411             :                     // sequence field found
    1412           0 :                     SwFlyFrm* pChgFly = (SwFlyFrm*)pAnchor->GetUpper();
    1413             :                     // calculate the changed size:
    1414             :                     // width must change, height can change
    1415           0 :                     Size aNewSz( aSz.Width() + pChgFly->Frm().Width() -
    1416           0 :                                    pFly->Prt().Width(), aSz.Height() );
    1417             : 
    1418           0 :                     SwFrmFmt *pFmt = pChgFly->GetFmt();
    1419           0 :                     SwFmtFrmSize aFrmSz( pFmt->GetFrmSize() );
    1420           0 :                     aFrmSz.SetWidth( aNewSz.Width() );
    1421           0 :                     if( ATT_MIN_SIZE != aFrmSz.GetHeightSizeType() )
    1422             :                     {
    1423           0 :                         aNewSz.Height() += pChgFly->Frm().Height() -
    1424           0 :                                                pFly->Prt().Height();
    1425           0 :                         if( std::abs( aNewSz.Height() - pChgFly->Frm().Height()) > 1 )
    1426           0 :                             aFrmSz.SetHeight( aNewSz.Height() );
    1427             :                     }
    1428             :                     // via Doc for the Undo!
    1429           0 :                     pFmt->GetDoc()->SetAttr( aFrmSz, *pFmt );
    1430           0 :                     break;
    1431             :                 }
    1432             :         }
    1433             : 
    1434             :         // set the new Size at the fly themself
    1435           0 :         if ( pFly->Prt().Height() > 0 && pFly->Prt().Width() > 0 )
    1436             :         {
    1437           0 :             aSz.Width() += pFly->Frm().Width() - pFly->Prt().Width();
    1438           0 :             aSz.Height()+= pFly->Frm().Height()- pFly->Prt().Height();
    1439             :         }
    1440           0 :         aResult = pFly->ChgSize( aSz );
    1441             : 
    1442             :         // if the object changes, the contour is outside the object
    1443             :         OSL_ENSURE( pFly->Lower()->IsNoTxtFrm(), "Request without NoTxt" );
    1444           0 :         SwNoTxtNode *pNd = ((SwCntntFrm*)pFly->Lower())->GetNode()->GetNoTxtNode();
    1445             :         OSL_ENSURE( pNd, "Request without Node" );
    1446           0 :         pNd->SetContour( 0 );
    1447           0 :         ClrContourCache();
    1448             :     }
    1449             : 
    1450             :     // if only the size is to be adjusted, a position is transported with
    1451             :     // allocated values
    1452           0 :     Point aPt( pFly->Prt().Pos() );
    1453           0 :     aPt += pFly->Frm().Pos();
    1454           0 :     if ( rRect.Top() != LONG_MIN && rRect.Pos() != aPt && !bPosProt )
    1455             :     {
    1456           0 :         aPt = rRect.Pos();
    1457           0 :         aPt.setX(aPt.getX() - pFly->Prt().Left());
    1458           0 :         aPt.setY(aPt.getY() - pFly->Prt().Top());
    1459             : 
    1460             :         // in case of paragraph-bound Flys, starting from the new position,
    1461             :         // a new anchor is to be set. The anchor and the new RelPos are
    1462             :         // calculated by the Fly and set
    1463           0 :         if( pFly->IsFlyAtCntFrm() )
    1464           0 :             ((SwFlyAtCntFrm*)pFly)->SetAbsPos( aPt );
    1465             :         else
    1466             :         {
    1467           0 :             const SwFrmFmt *pFmt = pFly->GetFmt();
    1468           0 :             const SwFmtVertOrient &rVert = pFmt->GetVertOrient();
    1469           0 :             const SwFmtHoriOrient &rHori = pFmt->GetHoriOrient();
    1470           0 :             const long lXDiff = aPt.getX() - pFly->Frm().Left();
    1471           0 :             const long lYDiff = aPt.getY() - pFly->Frm().Top();
    1472           0 :             const Point aTmp( rHori.GetPos() + lXDiff,
    1473           0 :                               rVert.GetPos() + lYDiff );
    1474           0 :             pFly->ChgRelPos( aTmp );
    1475             :         }
    1476             :     }
    1477             : 
    1478           0 :     SwFlyFrmFmt *pFlyFrmFmt = pFly->GetFmt();
    1479             :     OSL_ENSURE( pFlyFrmFmt, "fly frame format missing!" );
    1480           0 :     if ( pFlyFrmFmt )
    1481           0 :         pFlyFrmFmt->SetLastFlyFrmPrtRectPos( pFly->Prt().Pos() ); //stores the value of last Prt rect
    1482             : 
    1483           0 :     EndAllAction();
    1484             : 
    1485           0 :     return aResult;
    1486             : }
    1487             : 
    1488             : /***********************************************************************
    1489             : #*  Class       :  SwFEShell
    1490             : #*  Methode     :  WizzardFindCurFrmFmt
    1491             : #***********************************************************************/
    1492             : 
    1493           0 : SwFrmFmt* SwFEShell::WizzardGetFly()
    1494             : {
    1495             :     // do not search the Fly via the layout. Now we can delete a frame
    1496             :     // without a valid layout. ( e.g. for the wizards )
    1497           0 :     SwFrmFmts& rSpzArr = *mpDoc->GetSpzFrmFmts();
    1498           0 :     sal_uInt16 nCnt = rSpzArr.size();
    1499           0 :     if( nCnt )
    1500             :     {
    1501           0 :         SwNodeIndex& rCrsrNd = GetCrsr()->GetPoint()->nNode;
    1502           0 :         if( rCrsrNd.GetIndex() > mpDoc->GetNodes().GetEndOfExtras().GetIndex() )
    1503             :             // Cursor is in the body area!
    1504           0 :             return 0;
    1505             : 
    1506           0 :         for( sal_uInt16 n = 0; n < nCnt; ++n )
    1507             :         {
    1508           0 :             SwFrmFmt* pFmt = rSpzArr[ n ];
    1509           0 :             const SwNodeIndex* pIdx = pFmt->GetCntnt( sal_False ).GetCntntIdx();
    1510             :             SwStartNode* pSttNd;
    1511           0 :             if( pIdx &&
    1512           0 :                 0 != ( pSttNd = pIdx->GetNode().GetStartNode() ) &&
    1513           0 :                 pSttNd->GetIndex() < rCrsrNd.GetIndex() &&
    1514           0 :                 rCrsrNd.GetIndex() < pSttNd->EndOfSectionIndex() )
    1515             :             {
    1516             :                 // found: return immediately
    1517           0 :                 return pFmt;
    1518             :             }
    1519             :         }
    1520             :     }
    1521           0 :     return 0;
    1522             : }
    1523             : 
    1524           0 : void SwFEShell::SetFlyName( const OUString& rName )
    1525             : {
    1526           0 :     SwLayoutFrm *pFly = FindFlyFrm();
    1527           0 :     if( pFly )
    1528           0 :         GetDoc()->SetFlyName( *(SwFlyFrmFmt*)pFly->GetFmt(), rName );
    1529             :     else {
    1530             :         OSL_ENSURE( !this, "no FlyFrame selected" );
    1531             :     }
    1532           0 : }
    1533             : 
    1534           0 : OUString SwFEShell::GetFlyName() const
    1535             : {
    1536           0 :     SwLayoutFrm *pFly = FindFlyFrm();
    1537           0 :     if( pFly )
    1538           0 :         return pFly->GetFmt()->GetName();
    1539             : 
    1540             :     OSL_ENSURE( !this, "no FlyFrame selected" );
    1541           0 :     return OUString();
    1542             : }
    1543             : 
    1544           0 : const uno::Reference < embed::XEmbeddedObject > SwFEShell::GetOleRef() const
    1545             : {
    1546           0 :     uno::Reference < embed::XEmbeddedObject > xObj;
    1547           0 :     SwFlyFrm * pFly = FindFlyFrm();
    1548           0 :     if (pFly && pFly->Lower() && pFly->Lower()->IsNoTxtFrm())
    1549             :     {
    1550           0 :         SwOLENode *pNd = ((SwNoTxtFrm*)pFly->Lower())->GetNode()->GetOLENode();
    1551           0 :         if (pNd)
    1552           0 :             xObj = pNd->GetOLEObj().GetOleRef();
    1553             :     }
    1554           0 :     return xObj;
    1555             : }
    1556             : 
    1557           0 : OUString SwFEShell::GetUniqueGrfName() const
    1558             : {
    1559           0 :     return GetDoc()->GetUniqueGrfName();
    1560             : }
    1561             : 
    1562           0 : const SwFrmFmt* SwFEShell::IsURLGrfAtPos( const Point& rPt, OUString* pURL,
    1563             :                                         OUString *pTargetFrameName,
    1564             :                                         OUString *pDescription ) const
    1565             : {
    1566           0 :     if( !Imp()->HasDrawView() )
    1567           0 :         return 0;
    1568             : 
    1569             :     SdrObject* pObj;
    1570             :     SdrPageView* pPV;
    1571           0 :     const SwFrmFmt* pRet = 0;
    1572           0 :     SwDrawView *pDView = (SwDrawView*)Imp()->GetDrawView();
    1573             : 
    1574           0 :     sal_uInt16 nOld = pDView->GetHitTolerancePixel();
    1575           0 :     pDView->SetHitTolerancePixel( 2 );
    1576             : 
    1577           0 :     if( pDView->PickObj( rPt, pDView->getHitTolLog(), pObj, pPV,SDRSEARCH_PICKMACRO ) &&
    1578           0 :         pObj->ISA(SwVirtFlyDrawObj) )
    1579             :     {
    1580           0 :         SwFlyFrm *pFly = ((SwVirtFlyDrawObj*)pObj)->GetFlyFrm();
    1581           0 :         const SwFmtURL &rURL = pFly->GetFmt()->GetURL();
    1582           0 :         if( !rURL.GetURL().isEmpty() || rURL.GetMap() )
    1583             :         {
    1584           0 :             bool bSetTargetFrameName = pTargetFrameName != 0;
    1585           0 :             bool bSetDescription = pDescription != 0;
    1586           0 :             if ( rURL.GetMap() )
    1587             :             {
    1588           0 :                 IMapObject *pObject = pFly->GetFmt()->GetIMapObject( rPt, pFly );
    1589           0 :                 if ( pObject && !pObject->GetURL().isEmpty() )
    1590             :                 {
    1591           0 :                     if( pURL )
    1592           0 :                         *pURL = pObject->GetURL();
    1593           0 :                     if ( bSetTargetFrameName && !pObject->GetTarget().isEmpty() )
    1594             :                     {
    1595           0 :                         bSetTargetFrameName = false;
    1596           0 :                         *pTargetFrameName = pObject->GetTarget();
    1597             :                     }
    1598           0 :                     if ( bSetDescription )
    1599             :                     {
    1600           0 :                         bSetDescription = false;
    1601           0 :                         *pDescription = pObject->GetAltText();
    1602             :                     }
    1603           0 :                     pRet = pFly->GetFmt();
    1604             :                 }
    1605             :             }
    1606             :             else
    1607             :             {
    1608           0 :                 if( pURL )
    1609             :                 {
    1610           0 :                     *pURL = rURL.GetURL();
    1611           0 :                     if( rURL.IsServerMap() )
    1612             :                     {
    1613             :                        // append the relative pixel position !!
    1614           0 :                         Point aPt( rPt );
    1615           0 :                         aPt -= pFly->Frm().Pos();
    1616             :                         // without MapMode-Offset, without Offset, o ... !!!!!
    1617             :                         aPt = GetOut()->LogicToPixel(
    1618           0 :                                 aPt, MapMode( MAP_TWIP ) );
    1619           0 :                         ((( *pURL += "?" ) += OUString::number( aPt.getX() ))
    1620           0 :                                   += "," ) += OUString::number(aPt.getY() );
    1621             :                     }
    1622             :                 }
    1623           0 :                 pRet = pFly->GetFmt();
    1624             :             }
    1625           0 :             if ( bSetTargetFrameName )
    1626           0 :                 *pTargetFrameName = rURL.GetTargetFrameName();
    1627           0 :             if ( bSetDescription )
    1628           0 :                 *pDescription = pFly->GetFmt()->GetName();
    1629             :         }
    1630             :     }
    1631           0 :     pDView->SetHitTolerancePixel( nOld );
    1632           0 :     return pRet;
    1633             : }
    1634             : 
    1635           0 : const Graphic *SwFEShell::GetGrfAtPos( const Point &rPt,
    1636             :                                        OUString &rName, sal_Bool &rbLink ) const
    1637             : {
    1638           0 :     if( !Imp()->HasDrawView() )
    1639           0 :         return 0;
    1640             : 
    1641             :     SdrObject* pObj;
    1642             :     SdrPageView* pPV;
    1643           0 :     SwDrawView *pDView = (SwDrawView*)Imp()->GetDrawView();
    1644             : 
    1645           0 :     if( pDView->PickObj( rPt, pDView->getHitTolLog(), pObj, pPV ) && pObj->ISA(SwVirtFlyDrawObj) )
    1646             :     {
    1647           0 :         SwFlyFrm *pFly = ((SwVirtFlyDrawObj*)pObj)->GetFlyFrm();
    1648           0 :         if ( pFly->Lower() && pFly->Lower()->IsNoTxtFrm() )
    1649             :         {
    1650           0 :             SwGrfNode *pNd = ((SwCntntFrm*)pFly->Lower())->GetNode()->GetGrfNode();
    1651           0 :             if ( pNd )
    1652             :             {
    1653           0 :                 if ( pNd->IsGrfLink() )
    1654             :                 {
    1655             :                     // halfway ready graphic?
    1656           0 :                     ::sfx2::SvLinkSource* pLnkObj = pNd->GetLink()->GetObj();
    1657           0 :                     if( pLnkObj && pLnkObj->IsPending() )
    1658           0 :                         return 0;
    1659           0 :                     rbLink = sal_True;
    1660             :                 }
    1661             : 
    1662           0 :                 pNd->GetFileFilterNms( &rName, 0 );
    1663           0 :                 if ( rName.isEmpty() )
    1664           0 :                     rName = pFly->GetFmt()->GetName();
    1665           0 :                 pNd->SwapIn( true );
    1666           0 :                 return &pNd->GetGrf();
    1667             :             }
    1668             :         }
    1669             :     }
    1670           0 :     return 0;
    1671             : }
    1672             : 
    1673           0 : const SwFrmFmt* SwFEShell::GetFmtFromObj( const Point& rPt, SwRect** pRectToFill ) const
    1674             : {
    1675           0 :     SwFrmFmt* pRet = 0;
    1676             : 
    1677           0 :     if( Imp()->HasDrawView() )
    1678             :     {
    1679             :         SdrObject* pObj;
    1680             :         SdrPageView* pPView;
    1681             : 
    1682           0 :         SwDrawView *pDView = (SwDrawView*)Imp()->GetDrawView();
    1683             : 
    1684           0 :         sal_uInt16 nOld = pDView->GetHitTolerancePixel();
    1685             :         // tolerance for Drawing-SS
    1686           0 :         pDView->SetHitTolerancePixel( pDView->GetMarkHdlSizePixel()/2 );
    1687             : 
    1688           0 :         if( pDView->PickObj( rPt, pDView->getHitTolLog(), pObj, pPView, SDRSEARCH_PICKMARKABLE ) )
    1689             :         {
    1690             :            // first check it:
    1691           0 :             if ( pObj->ISA(SwVirtFlyDrawObj) )
    1692           0 :                 pRet = ((SwVirtFlyDrawObj*)pObj)->GetFmt();
    1693           0 :             else if ( pObj->GetUserCall() ) //not for group objects
    1694           0 :                 pRet = ((SwDrawContact*)pObj->GetUserCall())->GetFmt();
    1695           0 :             if(pRet && pRectToFill)
    1696           0 :                 **pRectToFill = pObj->GetCurrentBoundRect();
    1697             :         }
    1698           0 :         pDView->SetHitTolerancePixel( nOld );
    1699             :     }
    1700           0 :     return pRet;
    1701             : }
    1702             : 
    1703             : // returns a format too, if the point is over the text of any fly
    1704           0 : const SwFrmFmt* SwFEShell::GetFmtFromAnyObj( const Point& rPt ) const
    1705             : {
    1706           0 :     const SwFrmFmt* pRet = GetFmtFromObj( rPt );
    1707           0 :     if( !pRet || RES_FLYFRMFMT == pRet->Which() )
    1708             :     {
    1709           0 :         SwPosition aPos( *GetCrsr()->GetPoint() );
    1710           0 :         Point aPt( rPt );
    1711           0 :         GetLayout()->GetCrsrOfst( &aPos, aPt );
    1712           0 :         SwCntntNode *pNd = aPos.nNode.GetNode().GetCntntNode();
    1713           0 :         SwFrm* pFrm = pNd->getLayoutFrm( GetLayout(), &rPt, 0, false )->FindFlyFrm();
    1714           0 :         pRet = pFrm ? ((SwLayoutFrm*)pFrm)->GetFmt() : 0;
    1715             :     }
    1716           0 :     return pRet;
    1717             : }
    1718             : 
    1719           0 : ObjCntType SwFEShell::GetObjCntType( const SdrObject& rObj ) const
    1720             : {
    1721           0 :     ObjCntType eType = OBJCNT_NONE;
    1722             : 
    1723             :     // investigate 'master' drawing object, if method
    1724             :     // is called for a 'virtual' drawing object.
    1725             :     const SdrObject* pInvestigatedObj;
    1726           0 :     if ( rObj.ISA(SwDrawVirtObj) )
    1727             :     {
    1728           0 :         const SwDrawVirtObj* pDrawVirtObj = static_cast<const SwDrawVirtObj*>(&rObj);
    1729           0 :         pInvestigatedObj = &(pDrawVirtObj->GetReferencedObj());
    1730             :     }
    1731             :     else
    1732             :     {
    1733           0 :         pInvestigatedObj = &rObj;
    1734             :     }
    1735             : 
    1736           0 :     if( FmFormInventor == pInvestigatedObj->GetObjInventor() )
    1737             :     {
    1738           0 :         eType = OBJCNT_CONTROL;
    1739             :         uno::Reference< awt::XControlModel >  xModel =
    1740           0 :                 ((SdrUnoObj&)(*pInvestigatedObj)).GetUnoControlModel();
    1741           0 :         if( xModel.is() )
    1742             :         {
    1743           0 :             uno::Any aVal;
    1744           0 :             OUString sName("ButtonType");
    1745           0 :             uno::Reference< beans::XPropertySet >  xSet(xModel, uno::UNO_QUERY);
    1746             : 
    1747           0 :             uno::Reference< beans::XPropertySetInfo >  xInfo = xSet->getPropertySetInfo();
    1748           0 :             if(xInfo->hasPropertyByName( sName ))
    1749             :             {
    1750           0 :                 beans::Property xProperty = xInfo->getPropertyByName( sName );
    1751           0 :                 aVal = xSet->getPropertyValue( sName );
    1752           0 :                 if( aVal.getValue() && form::FormButtonType_URL == *((form::FormButtonType*)aVal.getValue()) )
    1753           0 :                     eType = OBJCNT_URLBUTTON;
    1754           0 :             }
    1755           0 :         }
    1756             :     }
    1757           0 :     else if( pInvestigatedObj->ISA(SwVirtFlyDrawObj) )
    1758             :     {
    1759           0 :         SwFlyFrm *pFly = ((SwVirtFlyDrawObj&)(*pInvestigatedObj)).GetFlyFrm();
    1760           0 :         if ( pFly->Lower() && pFly->Lower()->IsNoTxtFrm() )
    1761             :         {
    1762           0 :             if ( ((SwCntntFrm*)pFly->Lower())->GetNode()->GetGrfNode() )
    1763           0 :                 eType = OBJCNT_GRF;
    1764             :             else
    1765           0 :                 eType = OBJCNT_OLE;
    1766             :         }
    1767             :         else
    1768           0 :             eType = OBJCNT_FLY;
    1769             :     }
    1770           0 :     else if ( pInvestigatedObj->ISA( SdrObjGroup ) )
    1771             :     {
    1772           0 :         SwDrawContact* pDrawContact( dynamic_cast<SwDrawContact*>(GetUserCall( pInvestigatedObj ) ) );
    1773           0 :         if ( !pDrawContact )
    1774             :         {
    1775             :             OSL_FAIL( "<SwFEShell::GetObjCntType(..)> - missing draw contact object" );
    1776           0 :             eType = OBJCNT_NONE;
    1777             :         }
    1778             :         else
    1779             :         {
    1780           0 :             SwFrmFmt* pFrmFmt( pDrawContact->GetFmt() );
    1781           0 :             if ( !pFrmFmt )
    1782             :             {
    1783             :                 OSL_FAIL( "<SwFEShell::GetObjCntType(..)> - missing frame format" );
    1784           0 :                 eType = OBJCNT_NONE;
    1785             :             }
    1786           0 :             else if ( FLY_AS_CHAR != pFrmFmt->GetAnchor().GetAnchorId() )
    1787             :             {
    1788           0 :                 eType = OBJCNT_GROUPOBJ;
    1789             :             }
    1790             :         }
    1791             :     }
    1792             :     else
    1793           0 :         eType = OBJCNT_SIMPLE;
    1794           0 :     return eType;
    1795             : }
    1796             : 
    1797           0 : ObjCntType SwFEShell::GetObjCntType( const Point &rPt, SdrObject *&rpObj ) const
    1798             : {
    1799           0 :     ObjCntType eType = OBJCNT_NONE;
    1800             : 
    1801           0 :     if( Imp()->HasDrawView() )
    1802             :     {
    1803             :         SdrObject* pObj;
    1804             :         SdrPageView* pPView;
    1805             : 
    1806           0 :         SwDrawView *pDView = (SwDrawView*)Imp()->GetDrawView();
    1807             : 
    1808           0 :         sal_uInt16 nOld = pDView->GetHitTolerancePixel();
    1809             :         // tolerance for Drawing-SS
    1810           0 :         pDView->SetHitTolerancePixel( pDView->GetMarkHdlSizePixel()/2 );
    1811             : 
    1812           0 :         if( pDView->PickObj( rPt, pDView->getHitTolLog(), pObj, pPView, SDRSEARCH_PICKMARKABLE ) )
    1813           0 :             eType = GetObjCntType( *(rpObj = pObj) );
    1814             : 
    1815           0 :         pDView->SetHitTolerancePixel( nOld );
    1816             :     }
    1817           0 :     return eType;
    1818             : }
    1819             : 
    1820           0 : ObjCntType SwFEShell::GetObjCntTypeOfSelection( SdrObject** ppObj ) const
    1821             : {
    1822           0 :     ObjCntType eType = OBJCNT_NONE;
    1823             : 
    1824           0 :     if( Imp()->HasDrawView() )
    1825             :     {
    1826           0 :         const SdrMarkList &rMrkList = Imp()->GetDrawView()->GetMarkedObjectList();
    1827           0 :         for( sal_uInt32 i = 0, nE = rMrkList.GetMarkCount(); i < nE; ++i )
    1828             :         {
    1829           0 :             SdrObject* pObj = rMrkList.GetMark( i )->GetMarkedSdrObj();
    1830           0 :             if( !pObj )
    1831           0 :                 continue;
    1832           0 :             ObjCntType eTmp = GetObjCntType( *pObj );
    1833           0 :             if( !i )
    1834             :             {
    1835           0 :                 eType = eTmp;
    1836           0 :                 if( ppObj ) *ppObj = pObj;
    1837             :             }
    1838           0 :             else if( eTmp != eType )
    1839             :             {
    1840           0 :                 eType = OBJCNT_DONTCARE;
    1841             :                 // once DontCare, always DontCare!
    1842           0 :                 break;
    1843             :             }
    1844             :         }
    1845             :     }
    1846           0 :     return eType;
    1847             : }
    1848             : 
    1849           0 : sal_Bool SwFEShell::ReplaceSdrObj( const OUString& rGrfName, const OUString& rFltName,
    1850             :                                 const Graphic* pGrf )
    1851             : {
    1852           0 :     SET_CURR_SHELL( this );
    1853             : 
    1854           0 :     sal_Bool bRet = sal_False;
    1855             :     const SdrMarkList *pMrkList;
    1856           0 :     if( Imp()->HasDrawView() &&  1 ==
    1857           0 :         ( pMrkList = &Imp()->GetDrawView()->GetMarkedObjectList())->GetMarkCount() )
    1858             :     {
    1859           0 :         SdrObject* pObj = pMrkList->GetMark( 0 )->GetMarkedSdrObj();
    1860           0 :         SwFrmFmt *pFmt = FindFrmFmt( pObj );
    1861             : 
    1862             :         // store attributes, then set the graphic
    1863           0 :         SfxItemSet aFrmSet( mpDoc->GetAttrPool(),
    1864           0 :                             pFmt->GetAttrSet().GetRanges() );
    1865           0 :         aFrmSet.Set( pFmt->GetAttrSet() );
    1866             : 
    1867             :         // set size and position?
    1868           0 :         if( !pObj->ISA(SwVirtFlyDrawObj) )
    1869             :         {
    1870             :             // then let's do it:
    1871           0 :             const Rectangle &rBound = pObj->GetSnapRect();
    1872           0 :             Point aRelPos( pObj->GetRelativePos() );
    1873             : 
    1874           0 :             const long nWidth = rBound.Right()  - rBound.Left();
    1875           0 :             const long nHeight= rBound.Bottom() - rBound.Top();
    1876             :             aFrmSet.Put( SwFmtFrmSize( ATT_MIN_SIZE,
    1877           0 :                                 std::max( nWidth,  long(MINFLY) ),
    1878           0 :                                 std::max( nHeight, long(MINFLY) )));
    1879             : 
    1880           0 :             if( SFX_ITEM_SET != aFrmSet.GetItemState( RES_HORI_ORIENT ))
    1881           0 :                 aFrmSet.Put( SwFmtHoriOrient( aRelPos.getX(), text::HoriOrientation::NONE, text::RelOrientation::FRAME ));
    1882             : 
    1883           0 :             if( SFX_ITEM_SET != aFrmSet.GetItemState( RES_VERT_ORIENT ))
    1884           0 :                 aFrmSet.Put( SwFmtVertOrient( aRelPos.getY(), text::VertOrientation::NONE, text::RelOrientation::FRAME ));
    1885             : 
    1886             :         }
    1887             : 
    1888           0 :         pObj->GetOrdNum();
    1889             : 
    1890           0 :         StartAllAction();
    1891           0 :         StartUndo();
    1892             : 
    1893             :         // delete "Sdr-Object", insert the graphic instead
    1894           0 :         DelSelectedObj();
    1895             : 
    1896           0 :         GetDoc()->Insert( *GetCrsr(), rGrfName, rFltName, pGrf, &aFrmSet, NULL, NULL );
    1897             : 
    1898           0 :         EndUndo();
    1899           0 :         EndAllAction();
    1900           0 :         bRet = sal_True;
    1901             :     }
    1902           0 :     return bRet;
    1903             : }
    1904             : 
    1905           0 : static sal_uInt16 SwFmtGetPageNum(const SwFlyFrmFmt * pFmt)
    1906             : {
    1907             :     OSL_ENSURE(pFmt != NULL, "invalid argument");
    1908             : 
    1909           0 :     SwFlyFrm * pFrm = pFmt->GetFrm();
    1910             : 
    1911             :     sal_uInt16 aResult;
    1912             : 
    1913           0 :     if (pFrm != NULL)
    1914           0 :         aResult = pFrm->GetPhyPageNum();
    1915             :     else
    1916           0 :         aResult = pFmt->GetAnchor().GetPageNum();
    1917             : 
    1918           0 :     return aResult;
    1919             : }
    1920             : 
    1921             : #include <fmtcnct.hxx>
    1922             : 
    1923           0 : void SwFEShell::GetConnectableFrmFmts(SwFrmFmt & rFmt,
    1924             :                                       const OUString & rReference,
    1925             :                                       sal_Bool bSuccessors,
    1926             :                                       ::std::vector< OUString > & aPrevPageVec,
    1927             :                                       ::std::vector< OUString > & aThisPageVec,
    1928             :                                       ::std::vector< OUString > & aNextPageVec,
    1929             :                                       ::std::vector< OUString > & aRestVec)
    1930             : {
    1931           0 :     StartAction();
    1932             : 
    1933           0 :     SwFmtChain rChain = rFmt.GetChain();
    1934           0 :     SwFrmFmt * pOldChainNext = (SwFrmFmt *) rChain.GetNext();
    1935           0 :     SwFrmFmt * pOldChainPrev = (SwFrmFmt *) rChain.GetPrev();
    1936             : 
    1937           0 :     if (pOldChainNext)
    1938           0 :         mpDoc->Unchain(rFmt);
    1939             : 
    1940           0 :     if (pOldChainPrev)
    1941           0 :         mpDoc->Unchain(*pOldChainPrev);
    1942             : 
    1943           0 :     sal_uInt16 nCnt = mpDoc->GetFlyCount(FLYCNTTYPE_FRM);
    1944             : 
    1945             :     /* potential successors resp. predecessors */
    1946           0 :     ::std::vector< const SwFrmFmt * > aTmpSpzArray;
    1947             : 
    1948           0 :     mpDoc->FindFlyByName(rReference);
    1949             : 
    1950           0 :     for (sal_uInt16 n = 0; n < nCnt; n++)
    1951             :     {
    1952           0 :         const SwFrmFmt & rFmt1 = *(mpDoc->GetFlyNum(n, FLYCNTTYPE_FRM));
    1953             : 
    1954             :         /*
    1955             :            pFmt is a potential successor of rFmt if it is chainable after
    1956             :            rFmt.
    1957             : 
    1958             :            pFmt is a potential predecessor of rFmt if rFmt is chainable
    1959             :            after pFmt.
    1960             :         */
    1961             : 
    1962             :         int nChainState;
    1963             : 
    1964           0 :         if (bSuccessors)
    1965           0 :             nChainState = mpDoc->Chainable(rFmt, rFmt1);
    1966             :         else
    1967           0 :             nChainState = mpDoc->Chainable(rFmt1, rFmt);
    1968             : 
    1969           0 :         if (nChainState == SW_CHAIN_OK)
    1970             :         {
    1971           0 :             aTmpSpzArray.push_back(&rFmt1);
    1972             : 
    1973             :         }
    1974             : 
    1975             :     }
    1976             : 
    1977           0 :     if  (aTmpSpzArray.size() > 0)
    1978             :     {
    1979           0 :         aPrevPageVec.clear();
    1980           0 :         aThisPageVec.clear();
    1981           0 :         aNextPageVec.clear();
    1982           0 :         aRestVec.clear();
    1983             : 
    1984             :         /* number of page rFmt resides on */
    1985           0 :         sal_uInt16 nPageNum = SwFmtGetPageNum((SwFlyFrmFmt *) &rFmt);
    1986             : 
    1987           0 :         ::std::vector< const SwFrmFmt * >::const_iterator aIt;
    1988             : 
    1989           0 :         for (aIt = aTmpSpzArray.begin(); aIt != aTmpSpzArray.end(); ++aIt)
    1990             :         {
    1991           0 :             const OUString aString = (*aIt)->GetName();
    1992             : 
    1993             :             /* rFmt is not a vaild successor or predecessor of
    1994             :                itself */
    1995           0 :             if (aString != rReference && aString != rFmt.GetName())
    1996             :             {
    1997             :                 sal_uInt16 nNum1 =
    1998           0 :                     SwFmtGetPageNum((SwFlyFrmFmt *) *aIt);
    1999             : 
    2000           0 :                 if (nNum1 == nPageNum -1)
    2001           0 :                     aPrevPageVec.push_back(aString);
    2002           0 :                 else if (nNum1 == nPageNum)
    2003           0 :                     aThisPageVec.push_back(aString);
    2004           0 :                 else if (nNum1 == nPageNum + 1)
    2005           0 :                     aNextPageVec.push_back(aString);
    2006             :                 else
    2007           0 :                     aRestVec.push_back(aString);
    2008             :             }
    2009           0 :         }
    2010             : 
    2011             :     }
    2012             : 
    2013           0 :     if (pOldChainNext)
    2014           0 :         mpDoc->Chain(rFmt, *pOldChainNext);
    2015             : 
    2016           0 :     if (pOldChainPrev)
    2017           0 :         mpDoc->Chain(*pOldChainPrev, rFmt);
    2018             : 
    2019           0 :     EndAction();
    2020           0 : }
    2021             : 
    2022             : // #i73249#
    2023           0 : OUString SwFEShell::GetObjTitle() const
    2024             : {
    2025           0 :     if ( Imp()->HasDrawView() )
    2026             :     {
    2027           0 :         const SdrMarkList *pMrkList = &Imp()->GetDrawView()->GetMarkedObjectList();
    2028           0 :         if ( pMrkList->GetMarkCount() == 1 )
    2029             :         {
    2030           0 :             const SdrObject* pObj = pMrkList->GetMark( 0 )->GetMarkedSdrObj();
    2031           0 :             const SwFrmFmt* pFmt = FindFrmFmt( pObj );
    2032           0 :             if ( pFmt->Which() == RES_FLYFRMFMT )
    2033             :             {
    2034           0 :                 return dynamic_cast<const SwFlyFrmFmt*>(pFmt)->GetObjTitle();
    2035             :             }
    2036           0 :             return pObj->GetTitle();
    2037             :         }
    2038             :     }
    2039             : 
    2040           0 :     return OUString();
    2041             : }
    2042             : 
    2043           0 : void SwFEShell::SetObjTitle( const OUString& rTitle )
    2044             : {
    2045           0 :     if ( Imp()->HasDrawView() )
    2046             :     {
    2047           0 :         const SdrMarkList *pMrkList = &Imp()->GetDrawView()->GetMarkedObjectList();
    2048           0 :         if ( pMrkList->GetMarkCount() == 1 )
    2049             :         {
    2050           0 :             SdrObject* pObj = pMrkList->GetMark( 0 )->GetMarkedSdrObj();
    2051           0 :             SwFrmFmt* pFmt = FindFrmFmt( pObj );
    2052           0 :             if ( pFmt->Which() == RES_FLYFRMFMT )
    2053             :             {
    2054             :                 GetDoc()->SetFlyFrmTitle( *(dynamic_cast<SwFlyFrmFmt*>(pFmt)),
    2055           0 :                                           rTitle );
    2056             :             }
    2057             :             else
    2058             :             {
    2059           0 :                 pObj->SetTitle( rTitle );
    2060             :             }
    2061             :         }
    2062             :     }
    2063           0 : }
    2064             : 
    2065           0 : OUString SwFEShell::GetObjDescription() const
    2066             : {
    2067           0 :     if ( Imp()->HasDrawView() )
    2068             :     {
    2069           0 :         const SdrMarkList *pMrkList = &Imp()->GetDrawView()->GetMarkedObjectList();
    2070           0 :         if ( pMrkList->GetMarkCount() == 1 )
    2071             :         {
    2072           0 :             const SdrObject* pObj = pMrkList->GetMark( 0 )->GetMarkedSdrObj();
    2073           0 :             const SwFrmFmt* pFmt = FindFrmFmt( pObj );
    2074           0 :             if ( pFmt->Which() == RES_FLYFRMFMT )
    2075             :             {
    2076           0 :                 return dynamic_cast<const SwFlyFrmFmt*>(pFmt)->GetObjDescription();
    2077             :             }
    2078           0 :             return pObj->GetDescription();
    2079             :         }
    2080             :     }
    2081             : 
    2082           0 :     return OUString();
    2083             : }
    2084             : 
    2085           0 : void SwFEShell::SetObjDescription( const OUString& rDescription )
    2086             : {
    2087           0 :     if ( Imp()->HasDrawView() )
    2088             :     {
    2089           0 :         const SdrMarkList *pMrkList = &Imp()->GetDrawView()->GetMarkedObjectList();
    2090           0 :         if ( pMrkList->GetMarkCount() == 1 )
    2091             :         {
    2092           0 :             SdrObject* pObj = pMrkList->GetMark( 0 )->GetMarkedSdrObj();
    2093           0 :             SwFrmFmt* pFmt = FindFrmFmt( pObj );
    2094           0 :             if ( pFmt->Which() == RES_FLYFRMFMT )
    2095             :             {
    2096           0 :                 GetDoc()->SetFlyFrmDescription(dynamic_cast<SwFlyFrmFmt&>(*pFmt),
    2097           0 :                                                rDescription);
    2098             :             }
    2099             :             else
    2100             :             {
    2101           0 :                 pObj->SetDescription( rDescription );
    2102             :             }
    2103             :         }
    2104             :     }
    2105           0 : }
    2106             : 
    2107           0 : void SwFEShell::AlignFormulaToBaseline( const uno::Reference < embed::XEmbeddedObject >& xObj, SwFlyFrm * pFly )
    2108             : {
    2109             : #if OSL_DEBUG_LEVEL > 0
    2110             :     SvGlobalName aCLSID( xObj->getClassID() );
    2111             :     const bool bStarMath = ( SotExchange::IsMath( aCLSID ) != 0 );
    2112             :     OSL_ENSURE( bStarMath, "AlignFormulaToBaseline should only be called for Math objects" );
    2113             : 
    2114             :     if ( !bStarMath )
    2115             :         return;
    2116             : #endif
    2117             : 
    2118           0 :     if (!pFly)
    2119           0 :         pFly = FindFlyFrm( xObj );
    2120             :     OSL_ENSURE( pFly , "No fly frame!" );
    2121           0 :     SwFrmFmt * pFrmFmt = pFly ? pFly->GetFmt() : 0;
    2122             : 
    2123             :     // baseline to baseline alignment should only be applied to formulas anchored as char
    2124           0 :     if ( pFly && pFrmFmt && FLY_AS_CHAR == pFrmFmt->GetAnchor().GetAnchorId() )
    2125             :     {
    2126             :         // get baseline from Math object
    2127           0 :         uno::Any aBaseline;
    2128           0 :         if( svt::EmbeddedObjectRef::TryRunningState( xObj ) )
    2129             :         {
    2130           0 :             uno::Reference < beans::XPropertySet > xSet( xObj->getComponent(), uno::UNO_QUERY );
    2131           0 :             if ( xSet.is() )
    2132             :             {
    2133             :                 try
    2134             :                 {
    2135           0 :                     aBaseline = xSet->getPropertyValue("BaseLine");
    2136             :                 }
    2137           0 :                 catch ( uno::Exception& )
    2138             :                 {
    2139             :                     OSL_FAIL( "Baseline could not be retrieved from Starmath!" );
    2140             :                 }
    2141           0 :             }
    2142             :         }
    2143             : 
    2144           0 :         sal_Int32 nBaseline = ::comphelper::getINT32(aBaseline);
    2145           0 :         const MapMode aSourceMapMode( MAP_100TH_MM );
    2146           0 :         const MapMode aTargetMapMode( MAP_TWIP );
    2147           0 :         nBaseline = OutputDevice::LogicToLogic( nBaseline, aSourceMapMode.GetMapUnit(), aTargetMapMode.GetMapUnit() );
    2148             : 
    2149             :         OSL_ENSURE( nBaseline > 0, "Wrong value of Baseline while retrieving from Starmath!" );
    2150             :         //nBaseline must be moved by aPrt position
    2151           0 :         const SwFlyFrmFmt *pFlyFrmFmt = pFly->GetFmt();
    2152             :         OSL_ENSURE( pFlyFrmFmt, "fly frame format missing!" );
    2153           0 :         if ( pFlyFrmFmt )
    2154           0 :             nBaseline += pFlyFrmFmt->GetLastFlyFrmPrtRectPos().Y();
    2155             : 
    2156           0 :         const SwFmtVertOrient &rVert = pFrmFmt->GetVertOrient();
    2157           0 :         SwFmtVertOrient aVert( rVert );
    2158           0 :         aVert.SetPos( -nBaseline );
    2159           0 :         aVert.SetVertOrient( com::sun::star::text::VertOrientation::NONE );
    2160             : 
    2161           0 :         pFrmFmt->LockModify();
    2162           0 :         pFrmFmt->SetFmtAttr( aVert );
    2163           0 :         pFrmFmt->UnlockModify();
    2164           0 :         pFly->InvalidatePos();
    2165             :     }
    2166           0 : }
    2167             : 
    2168           0 : void SwFEShell::AlignAllFormulasToBaseline()
    2169             : {
    2170           0 :     StartAllAction();
    2171             : 
    2172             :     SwStartNode *pStNd;
    2173           0 :     SwNodeIndex aIdx( *GetNodes().GetEndOfAutotext().StartOfSectionNode(), 1 );
    2174           0 :     while ( 0 != (pStNd = aIdx.GetNode().GetStartNode()) )
    2175             :     {
    2176           0 :         ++aIdx;
    2177           0 :         SwOLENode *pOleNode = dynamic_cast< SwOLENode * >( &aIdx.GetNode() );
    2178           0 :         if ( pOleNode )
    2179             :         {
    2180           0 :             const uno::Reference < embed::XEmbeddedObject > & xObj( pOleNode->GetOLEObj().GetOleRef() );
    2181           0 :             if (xObj.is())
    2182             :             {
    2183           0 :                 SvGlobalName aCLSID( xObj->getClassID() );
    2184           0 :                 if ( SotExchange::IsMath( aCLSID ) )
    2185           0 :                     AlignFormulaToBaseline( xObj );
    2186           0 :             }
    2187             :         }
    2188             : 
    2189           0 :         aIdx.Assign( *pStNd->EndOfSectionNode(), + 1 );
    2190             :     }
    2191             : 
    2192           0 :     EndAllAction();
    2193           0 : }
    2194             : 
    2195             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10