Files
libreoffice/sw/source/core/draw/dview.cxx

1116 lines
37 KiB
C++
Raw Normal View History

2000-09-18 23:08:29 +00:00
/*************************************************************************
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
2000-09-18 23:08:29 +00:00
*
* Copyright 2000, 2010 Oracle and/or its affiliates.
2000-09-18 23:08:29 +00:00
*
* OpenOffice.org - a multi-platform office productivity suite
2000-09-18 23:08:29 +00:00
*
* This file is part of OpenOffice.org.
2000-09-18 23:08:29 +00:00
*
* OpenOffice.org is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
2000-09-18 23:08:29 +00:00
*
* OpenOffice.org is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
2000-09-18 23:08:29 +00:00
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenOffice.org. If not, see
* <http://www.openoffice.org/license.html>
* for a copy of the LGPLv3 License.
2000-09-18 23:08:29 +00:00
*
************************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_sw.hxx"
2000-09-18 23:08:29 +00:00
#include "hintids.hxx"
#include <editeng/protitem.hxx>
2000-09-18 23:08:29 +00:00
#include <svx/svdpagv.hxx>
#include <svx/fmmodel.hxx>
#include "swtypes.hxx"
#include "pagefrm.hxx"
#include "rootfrm.hxx"
#include "cntfrm.hxx"
#include "flyfrm.hxx"
#include "frmfmt.hxx"
#include "dflyobj.hxx"
#include "dcontact.hxx"
#include "frmatr.hxx"
#include "viewsh.hxx"
#include "viewimp.hxx"
#include "dview.hxx"
#include "dpage.hxx"
#include "doc.hxx"
#include "mdiexp.hxx"
#include <ndole.hxx>
#include <fmtanchr.hxx>
#include "shellres.hxx"
// #i7672#
#include <editeng/outliner.hxx>
#include <com/sun/star/embed/EmbedMisc.hpp>
// OD 18.06.2003 #108784#
//#ifndef _SVDVMARK_HXX //autogen
//#include <svx/svdvmark.hxx>
//#endif
#include <vector>
// --> OD 2004-06-24 #i28701#
#include <sortedobjs.hxx>
#include <flyfrms.hxx>
// <--
using namespace com::sun::star;
2002-05-28 13:05:17 +00:00
class SwSdrHdl : public SdrHdl
{
public:
SwSdrHdl(const Point& rPnt, bool bTopRight ) :
SdrHdl( rPnt, bTopRight ? HDL_ANCHOR_TR : HDL_ANCHOR ) {}
2002-05-28 13:05:17 +00:00
virtual BOOL IsFocusHdl() const;
};
BOOL SwSdrHdl::IsFocusHdl() const
{
if( HDL_ANCHOR == eKind || HDL_ANCHOR_TR == eKind )
2002-05-28 13:05:17 +00:00
return TRUE;
return SdrHdl::IsFocusHdl();
}
2000-09-18 23:08:29 +00:00
const SwFrm *lcl_FindAnchor( const SdrObject *pObj, BOOL bAll )
2000-09-18 23:08:29 +00:00
{
const SwVirtFlyDrawObj *pVirt = pObj->ISA(SwVirtFlyDrawObj) ?
2000-09-18 23:08:29 +00:00
(SwVirtFlyDrawObj*)pObj : 0;
if ( pVirt )
{
if ( bAll || !pVirt->GetFlyFrm()->IsFlyInCntFrm() )
return pVirt->GetFlyFrm()->GetAnchorFrm();
2000-09-18 23:08:29 +00:00
}
else
{
const SwDrawContact *pCont = (const SwDrawContact*)GetUserCall(pObj);
if ( pCont )
return pCont->GetAnchorFrm( pObj );
2000-09-18 23:08:29 +00:00
}
return 0;
}
/*************************************************************************
|*
|* SwDrawView::Ctor
|*
|* Ersterstellung OK 18.11.94
|* Letzte Aenderung MA 22. Jul. 96
|*
*************************************************************************/
SwDrawView::SwDrawView( SwViewImp &rI, SdrModel *pMd, OutputDevice *pOutDev) :
FmFormView( (FmFormModel*)pMd, pOutDev ),
rImp( rI )
{
SetPageVisible( FALSE );
SetBordVisible( FALSE );
SetGridVisible( FALSE );
SetHlplVisible( FALSE );
SetGlueVisible( FALSE );
SetFrameDragSingles( TRUE );
SetVirtualObjectBundling( TRUE );
SetSwapAsynchron( TRUE );
EnableExtendedKeyInputDispatcher( FALSE );
EnableExtendedMouseEventDispatcher( FALSE );
EnableExtendedCommandEventDispatcher( FALSE );
SetHitTolerancePixel( GetMarkHdlSizePixel()/2 );
SetPrintPreview( rI.GetShell()->IsPreView() );
// #i73602# Use default from the configuration
SetBufferedOverlayAllowed(getOptionsDrawinglayer().IsOverlayBuffer_Writer());
// #i74769#, #i75172# Use default from the configuration
SetBufferedOutputAllowed(getOptionsDrawinglayer().IsPaintBuffer_Writer());
2000-09-18 23:08:29 +00:00
}
// --> OD 2009-03-05 #i99665#
sal_Bool SwDrawView::IsAntiAliasing() const
{
return getOptionsDrawinglayer().IsAntiAliasing();
}
// <--
CWS-TOOLING: integrate CWS aw065 2009-06-17 13:48:12 +0200 aw r273068 : #99385# corrected small error in SCs selection visualisation 2009-06-16 15:45:28 +0200 wg r273021 : i102838 2009-06-16 12:46:07 +0200 wg r273016 : i102833 2009-06-11 17:40:29 +0200 aw r272895 : #i98870# added implementation for getPageCount helper 2009-06-11 16:39:54 +0200 aw r272885 : #i102663#, #i102667#, #i98870# incluide file typo corrected 2009-06-11 16:24:07 +0200 aw r272881 : #i102663#, #i102667#, #i98870# changes to SdrText, it's usage in SdrTextPrimitive2D and to OverlayObject base implementation. Also support for PageCountField added 2009-06-11 16:23:52 +0200 aw r272880 : #i102663#, #i102667#, #i98870# changes to SdrText, it's usage in SdrTextPrimitive2D and to OverlayObject base implementation. Also support for PageCountField added 2009-06-09 13:50:29 +0200 aw r272769 : #i98917# added support for the OverlayHatchRectanglePrimitive to follow rotation with it's hatch; simplified OverlayHatchRect 2009-06-09 13:04:06 +0200 aw r272766 : #i98870# re-added PageNumber identification in SdrTextPrimitive2D::get2DDecomposition 2009-06-08 18:56:05 +0200 aw r272744 : #i99385# added some last corrections to OverlayObjects in SD (had to do some merges on resync, needed to optically check and correct) 2009-06-08 11:17:57 +0200 aw r272725 : cws aw065: corrections after resync 2009-06-08 11:02:25 +0200 aw r272723 : cws aw065: corrections after resync 2009-06-08 10:36:22 +0200 aw r272722 : cws aw065: corrections after resync 2009-06-05 18:57:06 +0200 aw r272712 : CWS-TOOLING: rebase CWS aw065 to trunk@272291 (milestone: DEV300:m49) 2009-06-05 14:56:34 +0200 aw r272690 : #i89784# stripped old stuff no longer needed due to text-to-polygon conversion using primitives 2009-06-05 14:50:07 +0200 aw r272688 : #102091# removed on-model-lock suppression for SdrObject::ActionChanged() 2009-06-05 14:47:29 +0200 aw r272687 : #102091# corrected local value buffering in ScenePrimitive2D::get2DDecomposition 2009-06-03 17:53:32 +0200 aw r272599 : #i89784# version before stripping 2009-06-03 17:52:18 +0200 aw r272598 : #i89784# version before stripping 2009-05-28 17:15:47 +0200 aw r272420 : #i101872# old stuff removed/stripped 2009-05-28 17:15:32 +0200 aw r272419 : #i101872# old stuff removed/stripped 2009-05-28 17:15:15 +0200 aw r272418 : #i101872# old stuff removed/stripped 2009-05-28 17:14:45 +0200 aw r272417 : #i101872# old stuff removed/stripped 2009-05-28 12:13:56 +0200 aw r272396 : #i101872# stable hybrid state 2009-05-28 12:13:46 +0200 aw r272395 : #i101872# stable hybrid state 2009-05-28 12:13:35 +0200 aw r272394 : #i101872# stable hybrid state 2009-05-28 12:13:20 +0200 aw r272393 : #i101872# stable hybrid state 2009-05-28 12:13:05 +0200 aw r272392 : #i101872# stable hybrid state 2009-05-28 12:12:51 +0200 aw r272391 : #i101872# stable hybrid state 2009-05-15 16:56:02 +0200 aw r271952 : #i101872# HitTest unifications 2009-05-15 16:55:22 +0200 aw r271951 : #i101872# HitTest unifications 2009-05-15 16:55:12 +0200 aw r271950 : #i101872# HitTest unifications 2009-05-15 16:55:01 +0200 aw r271949 : #i101872# HitTest unifications 2009-05-15 16:54:51 +0200 aw r271948 : #i101872# HitTest unifications 2009-05-15 16:54:35 +0200 aw r271947 : #i101872# HitTest unifications 2009-05-15 16:54:22 +0200 aw r271946 : #i101872# HitTest unifications 2009-05-12 19:08:38 +0200 aw r271834 : #i101684# corrected AutoShape's preparation of text transformation due to different definitions in TextBounds 2009-05-12 15:44:49 +0200 aw r271827 : #i89784# expanded TextLayouterDevice::getTextOutlines() to support DXArray and X-Font scaling 2009-05-11 19:40:40 +0200 aw r271790 : #i99385# extended HitTest primitive usage, removed IsHdlHit implementations; prepared further HitTest simplifications 2009-05-11 19:40:25 +0200 aw r271789 : #i99385# extended HitTest primitive usage, removed IsHdlHit implementations; prepared further HitTest simplifications 2009-05-11 19:40:12 +0200 aw r271788 : #i99385# extended HitTest primitive usage, removed IsHdlHit implementations; prepared further HitTest simplifications 2009-05-11 13:01:53 +0200 aw r271765 : #i99385# corrections and optimizations 2009-05-08 14:48:40 +0200 aw r271718 : #i1016180# added optimizations in model operations when model is locked 2009-05-08 14:11:45 +0200 aw r271716 : #i101679# added flush() calls to OverlayManager when interaction step is prepared 2009-05-07 17:44:03 +0200 aw r271689 : #i99385# last corrections/changes 2009-05-07 17:43:47 +0200 aw r271688 : #i99385# last corrections/changes 2009-05-07 13:20:09 +0200 aw r271654 : #i99385# added changes from WFH 2009-05-07 13:19:38 +0200 aw r271653 : #i99385# added changes from WFH 2009-05-07 13:19:11 +0200 aw r271652 : #i99385# added changes from WFH 2009-05-07 11:33:17 +0200 aw r271643 : #i99385# corrections after resync 2009-05-07 11:17:31 +0200 aw r271642 : #i99385# corrections after resync 2009-05-06 18:46:53 +0200 aw r271609 : CWS-TOOLING: rebase CWS aw065 to trunk@271427 (milestone: DEV300:m47) 2009-05-05 18:24:03 +0200 aw r271548 : #i101443# force new text decomposition when TextBackgroundColor has changed 2009-05-05 17:44:42 +0200 aw r271542 : #i99385# 3rd round, simplifications and corrections done 2009-05-05 17:44:32 +0200 aw r271541 : #i99385# 3rd round, simplifications and corrections done 2009-05-05 17:44:20 +0200 aw r271540 : #i99385# 3rd round, simplifications and corrections done 2009-05-05 17:44:09 +0200 aw r271539 : #i99385# 3rd round, simplifications and corrections done 2009-05-05 15:48:38 +0200 aw r271527 : #i99385# 2nd round, usages checked and corrected 2009-05-05 15:48:15 +0200 aw r271526 : #i99385# 2nd round, usages checked and corrected 2009-05-05 15:48:03 +0200 aw r271525 : #i99385# 2nd round, usages checked and corrected 2009-05-05 15:47:51 +0200 aw r271524 : #i99385# 2nd round, usages checked and corrected 2009-04-27 18:33:10 +0200 aw r271300 : #i99385# state commit after all implementations are done 2009-04-27 15:36:53 +0200 aw r271283 : #i99385# state commit after all implementations are done 2009-04-27 15:27:49 +0200 aw r271280 : #i99385# state commit after all implementations are done 2009-04-27 15:27:33 +0200 aw r271279 : #i99385# state commit after all implementations are done 2009-04-27 15:27:00 +0200 aw r271278 : #i99385# state commit after all implementations are done 2009-04-27 15:26:15 +0200 aw r271277 : #i99385# state commit after all implementations are done 2009-04-27 15:25:40 +0200 aw r271275 : #i99385# state commit after all implementations are done 2009-04-27 15:25:19 +0200 aw r271274 : #i99385# state commit after all implementations are done 2009-04-27 15:24:00 +0200 aw r271272 : #i99385# state commit after all implementations are done 2009-03-19 17:12:00 +0100 aw r269757 : #i100360# corrected bitmap's PefSize calculation for bitmap filled objects when Bitmap is Pixel-based on it's mapping 2009-02-19 17:09:47 +0100 aw r268298 : #i98917# corrected attributes 2009-02-19 17:09:30 +0100 aw r268297 : #i98917# corrected attributes 2009-02-19 17:08:22 +0100 aw r268296 : #i98917# corrected attributes 2009-02-19 11:56:25 +0100 aw r268268 : #i98870# added extra code to react on PageNumber change 2009-02-18 16:57:24 +0100 aw r268243 : #i98917# in OverlayHatchRect::getGeometry the rotation was not applied to the TopLeft of the centered rectangle, but to the already extended one, thus the visualisation was rotating around the wrong edge
2009-07-02 14:28:15 +00:00
//////////////////////////////////////////////////////////////////////////////
SdrObject* impLocalHitCorrection(SdrObject* pRetval, const Point& rPnt, USHORT nTol, const SdrMarkList &rMrkList)
{
if(!nTol)
{
// the old method forced back to outer bounds test when nTol == 0, so
// do not try to correct when nTol is not set (used from HelpContent)
}
else
{
// rebuild logic from former SwVirtFlyDrawObj::CheckSdrObjectHit. This is needed since
// the SdrObject-specific CheckHit implementations are now replaced with primitives and
// 'tricks' like in the old implementation (e.g. using a view from a model-data class to
// detect if object is selected) are no longer valid.
// The standard primitive hit-test for SwVirtFlyDrawObj now is the outer bound. The old
// implementation reduced this excluding the inner bound when the object was not selected.
SwVirtFlyDrawObj* pSwVirtFlyDrawObj = dynamic_cast< SwVirtFlyDrawObj* >(pRetval);
if(pSwVirtFlyDrawObj)
{
if(pSwVirtFlyDrawObj->GetFlyFrm()->Lower() && pSwVirtFlyDrawObj->GetFlyFrm()->Lower()->IsNoTxtFrm())
{
// the old method used IsNoTxtFrm (should be for SW's own OLE and
// graphic's) to accept hit only based on outer bounds; nothing to do
}
else
{
// check if the object is selected in this view
const sal_uInt32 nMarkCount(rMrkList.GetMarkCount());
bool bSelected(false);
for(sal_uInt32 a(0); !bSelected && a < nMarkCount; a++)
{
if(pSwVirtFlyDrawObj == rMrkList.GetMark(a)->GetMarkedSdrObj())
{
bSelected = true;
}
}
if(!bSelected)
{
// when not selected, the object is not hit when hit position is inside
// inner range. Get and shrink inner range
basegfx::B2DRange aInnerBound(pSwVirtFlyDrawObj->getInnerBound());
aInnerBound.grow(-1.0 * nTol);
if(aInnerBound.isInside(basegfx::B2DPoint(rPnt.X(), rPnt.Y())))
{
// exclude this hit
pRetval = 0;
}
}
}
}
}
return pRetval;
}
SdrObject* SwDrawView::CheckSingleSdrObjectHit(const Point& rPnt, USHORT nTol, SdrObject* pObj, SdrPageView* pPV, ULONG nOptions, const SetOfByte* pMVisLay) const
{
// call parent
SdrObject* pRetval = FmFormView::CheckSingleSdrObjectHit(rPnt, nTol, pObj, pPV, nOptions, pMVisLay);
if(pRetval)
{
// overloaded to allow extra handling when picking SwVirtFlyDrawObj's
pRetval = impLocalHitCorrection(pRetval, rPnt, nTol, GetMarkedObjectList());
}
return pRetval;
}
2000-09-18 23:08:29 +00:00
/*************************************************************************
|*
|* SwDrawView::AddCustomHdl()
|*
|* Gets called every time the handles need to be build
|*
|* Ersterstellung AW 06. Sep. 99
|* Letzte Aenderung AW 06. Sep. 99
|*
*************************************************************************/
void SwDrawView::AddCustomHdl()
{
const SdrMarkList &rMrkList = GetMarkedObjectList();
2000-09-18 23:08:29 +00:00
if(rMrkList.GetMarkCount() != 1 || !GetUserCall(rMrkList.GetMark( 0 )->GetMarkedSdrObj()))
2000-09-18 23:08:29 +00:00
return;
SdrObject *pObj = rMrkList.GetMark(0)->GetMarkedSdrObj();
// --> OD 2006-11-06 #130889# - make code robust
// const SwFmtAnchor &rAnchor = ::FindFrmFmt(pObj)->GetAnchor();
SwFrmFmt* pFrmFmt( ::FindFrmFmt( pObj ) );
if ( !pFrmFmt )
{
ASSERT( false, "<SwDrawView::AddCustomHdl()> - missing frame format!" );
return;
}
const SwFmtAnchor &rAnchor = pFrmFmt->GetAnchor();
// <--
2000-09-18 23:08:29 +00:00
if (FLY_AS_CHAR == rAnchor.GetAnchorId())
2000-09-18 23:08:29 +00:00
return;
const SwFrm* pAnch;
if(0 == (pAnch = CalcAnchor()))
return;
Point aPos(aAnchorPoint);
if ( FLY_AT_CHAR == rAnchor.GetAnchorId() )
2000-09-18 23:08:29 +00:00
{
// --> OD 2004-06-24 #i28701# - use last character rectangle saved at object
// in order to avoid a format of the anchor frame
SwAnchoredObject* pAnchoredObj = ::GetUserCall( pObj )->GetAnchoredObj( pObj );
SwRect aAutoPos = pAnchoredObj->GetLastCharRect();
if ( aAutoPos.Height() )
{
aPos = aAutoPos.Pos();
}
2000-09-18 23:08:29 +00:00
}
// add anchor handle:
aHdl.AddHdl( new SwSdrHdl( aPos, pAnch->IsVertical() ||
pAnch->IsRightToLeft() ) );
2000-09-18 23:08:29 +00:00
}
/*************************************************************************
|*
|* SwDrawView::GetMaxToTopObj(), _GetMaxToTopObj()
|*
|* Ersterstellung MA 13. Jan. 95
|* Letzte Aenderung MA 18. Mar. 97
|*
*************************************************************************/
SdrObject* SwDrawView::GetMaxToTopObj( SdrObject* pObj ) const
{
if ( GetUserCall(pObj) )
{
const SwFrm *pAnch = ::lcl_FindAnchor( pObj, FALSE );
if ( pAnch )
{
//Das oberste Obj innerhalb des Ankers darf nicht ueberholt
//werden.
const SwFlyFrm *pFly = pAnch->FindFlyFrm();
if ( pFly )
{
const SwPageFrm *pPage = pFly->FindPageFrm();
if ( pPage->GetSortedObjs() )
{
UINT32 nOrdNum = 0;
for ( USHORT i = 0; i < pPage->GetSortedObjs()->Count(); ++i )
{
const SdrObject *pO =
(*pPage->GetSortedObjs())[i]->GetDrawObj();
2000-09-18 23:08:29 +00:00
if ( pO->GetOrdNumDirect() > nOrdNum )
{
const SwFrm *pTmpAnch = ::lcl_FindAnchor( pO, FALSE );
if ( pFly->IsAnLower( pTmpAnch ) )
2000-09-18 23:08:29 +00:00
{
nOrdNum = pO->GetOrdNumDirect();
}
}
}
if ( nOrdNum )
{
SdrPage *pTmpPage = GetModel()->GetPage( 0 );
2000-09-18 23:08:29 +00:00
++nOrdNum;
if ( nOrdNum < pTmpPage->GetObjCount() )
2000-09-18 23:08:29 +00:00
{
return pTmpPage->GetObj( nOrdNum );
2000-09-18 23:08:29 +00:00
}
}
}
}
}
}
return 0;
}
/*************************************************************************
|*
|* SwDrawView::GetMaxToBtmObj()
|*
|* Ersterstellung MA 13. Jan. 95
|* Letzte Aenderung MA 05. Sep. 96
|*
*************************************************************************/
SdrObject* SwDrawView::GetMaxToBtmObj(SdrObject* pObj) const
{
if ( GetUserCall(pObj) )
{
const SwFrm *pAnch = ::lcl_FindAnchor( pObj, FALSE );
if ( pAnch )
{
//Der Fly des Ankers darf nicht "unterflogen" werden.
const SwFlyFrm *pFly = pAnch->FindFlyFrm();
if ( pFly )
{
SdrObject *pRet = (SdrObject*)pFly->GetVirtDrawObj();
return pRet != pObj ? pRet : 0;
}
}
}
return 0;
}
/*************************************************************************
|*
|* SwDrawView::ObjOrderChanged()
|*
|* Ersterstellung MA 31. Jul. 95
|* Letzte Aenderung MA 18. Mar. 97
|*
*************************************************************************/
inline BOOL lcl_IsChild( SdrObject *pParent, SdrObject *pChild )
{
if ( pParent->ISA(SwVirtFlyDrawObj) )
2000-09-18 23:08:29 +00:00
{
const SwFrm *pAnch = lcl_FindAnchor( pChild, FALSE );
if ( pAnch && ((SwVirtFlyDrawObj*)pParent)->GetFlyFrm()->IsAnLower( pAnch ))
{
return TRUE;
}
}
return FALSE;
}
inline SdrObject *lcl_FindParent( SdrObject *pObj )
{
const SwFrm *pAnch = lcl_FindAnchor( pObj, FALSE );
if ( pAnch && pAnch->IsInFly() )
return (SdrObject*)pAnch->FindFlyFrm()->GetVirtDrawObj();
return 0;
}
/** determine maximal order number for a 'child' object of given 'parent' object
2000-09-18 23:08:29 +00:00
OD 2004-08-20 #110810#
2000-09-18 23:08:29 +00:00
@author OD
*/
sal_uInt32 SwDrawView::_GetMaxChildOrdNum( const SwFlyFrm& _rParentObj,
const SdrObject* _pExclChildObj ) const
2000-09-18 23:08:29 +00:00
{
sal_uInt32 nMaxChildOrdNum = _rParentObj.GetDrawObj()->GetOrdNum();
const SdrPage* pDrawPage = _rParentObj.GetDrawObj()->GetPage();
ASSERT( pDrawPage,
"<SwDrawView::_GetMaxChildOrdNum(..) - missing drawing page at parent object - crash!" );
sal_uInt32 nObjCount = pDrawPage->GetObjCount();
for ( sal_uInt32 i = nObjCount-1; i > _rParentObj.GetDrawObj()->GetOrdNum() ; --i )
2000-09-18 23:08:29 +00:00
{
const SdrObject* pObj = pDrawPage->GetObj( i );
// Don't consider 'child' object <_pExclChildObj>
if ( pObj == _pExclChildObj )
{
continue;
}
if ( pObj->GetOrdNum() > nMaxChildOrdNum &&
_rParentObj.IsAnLower( lcl_FindAnchor( pObj, TRUE ) ) )
2000-09-18 23:08:29 +00:00
{
nMaxChildOrdNum = pObj->GetOrdNum();
break;
2000-09-18 23:08:29 +00:00
}
}
return nMaxChildOrdNum;
}
/** method to move 'repeated' objects of the given moved object to the
according level
OD 2004-08-23 #110810#
@author OD
*/
void SwDrawView::_MoveRepeatedObjs( const SwAnchoredObject& _rMovedAnchoredObj,
const std::vector<SdrObject*>& _rMovedChildObjs ) const
{
// determine 'repeated' objects of already moved object <_rMovedAnchoredObj>
std::vector<SwAnchoredObject*> aAnchoredObjs;
2000-09-18 23:08:29 +00:00
{
const SwContact* pContact = ::GetUserCall( _rMovedAnchoredObj.GetDrawObj() );
ASSERT( pContact,
"SwDrawView::_MoveRepeatedObjs(..) - missing contact object -> crash." );
pContact->GetAnchoredObjs( aAnchoredObjs );
2000-09-18 23:08:29 +00:00
}
// check, if 'repeated' objects exists.
if ( aAnchoredObjs.size() > 1 )
2000-09-18 23:08:29 +00:00
{
SdrPage* pDrawPage = GetModel()->GetPage( 0 );
// move 'repeated' ones to the same order number as the already moved one.
sal_uInt32 nNewPos = _rMovedAnchoredObj.GetDrawObj()->GetOrdNum();
while ( !aAnchoredObjs.empty() )
2000-09-18 23:08:29 +00:00
{
SwAnchoredObject* pAnchoredObj = aAnchoredObjs.back();
if ( pAnchoredObj != &_rMovedAnchoredObj )
2000-09-18 23:08:29 +00:00
{
pDrawPage->SetObjectOrdNum( pAnchoredObj->GetDrawObj()->GetOrdNum(),
nNewPos );
pDrawPage->RecalcObjOrdNums();
// adjustments for accessibility API
if ( pAnchoredObj->ISA(SwFlyFrm) )
{
const SwFlyFrm *pTmpFlyFrm = static_cast<SwFlyFrm*>(pAnchoredObj);
rImp.DisposeAccessibleFrm( pTmpFlyFrm );
rImp.AddAccessibleFrm( pTmpFlyFrm );
}
else
{
rImp.DisposeAccessibleObj( pAnchoredObj->GetDrawObj() );
rImp.AddAccessibleObj( pAnchoredObj->GetDrawObj() );
}
2000-09-18 23:08:29 +00:00
}
aAnchoredObjs.pop_back();
2000-09-18 23:08:29 +00:00
}
// move 'repeated' ones of 'child' objects
for ( std::vector<SdrObject*>::const_iterator aObjIter = _rMovedChildObjs.begin();
aObjIter != _rMovedChildObjs.end(); ++aObjIter )
2000-09-18 23:08:29 +00:00
{
SdrObject* pChildObj = (*aObjIter);
2000-09-18 23:08:29 +00:00
{
const SwContact* pContact = ::GetUserCall( pChildObj );
ASSERT( pContact,
"SwDrawView::_MoveRepeatedObjs(..) - missing contact object -> crash." );
pContact->GetAnchoredObjs( aAnchoredObjs );
}
// move 'repeated' ones to the same order number as the already moved one.
const sal_uInt32 nTmpNewPos = pChildObj->GetOrdNum();
while ( !aAnchoredObjs.empty() )
{
SwAnchoredObject* pAnchoredObj = aAnchoredObjs.back();
if ( pAnchoredObj->GetDrawObj() != pChildObj )
2000-09-18 23:08:29 +00:00
{
pDrawPage->SetObjectOrdNum( pAnchoredObj->GetDrawObj()->GetOrdNum(),
nTmpNewPos );
pDrawPage->RecalcObjOrdNums();
// adjustments for accessibility API
if ( pAnchoredObj->ISA(SwFlyFrm) )
{
const SwFlyFrm *pTmpFlyFrm = static_cast<SwFlyFrm*>(pAnchoredObj);
rImp.DisposeAccessibleFrm( pTmpFlyFrm );
rImp.AddAccessibleFrm( pTmpFlyFrm );
}
else
{
rImp.DisposeAccessibleObj( pAnchoredObj->GetDrawObj() );
rImp.AddAccessibleObj( pAnchoredObj->GetDrawObj() );
}
2000-09-18 23:08:29 +00:00
}
aAnchoredObjs.pop_back();
2000-09-18 23:08:29 +00:00
}
}
}
}
// --> OD 2004-08-20 #110810# - adjustment and re-factoring of method
void SwDrawView::ObjOrderChanged( SdrObject* pObj, ULONG nOldPos,
ULONG nNewPos )
{
// --> OD 2004-08-17 #110810# - nothing to do for group members
if ( pObj->GetUpGroup() )
2000-09-18 23:08:29 +00:00
{
return;
2000-09-18 23:08:29 +00:00
}
// <--
// determine drawing page and assure that the order numbers are correct.
SdrPage* pDrawPage = GetModel()->GetPage( 0 );
if ( pDrawPage->IsObjOrdNumsDirty() )
pDrawPage->RecalcObjOrdNums();
const sal_uInt32 nObjCount = pDrawPage->GetObjCount();
SwAnchoredObject* pMovedAnchoredObj =
::GetUserCall( pObj )->GetAnchoredObj( pObj );
const SwFlyFrm* pParentAnchoredObj =
pMovedAnchoredObj->GetAnchorFrm()->FindFlyFrm();
2000-09-18 23:08:29 +00:00
const bool bMovedForward = nOldPos < nNewPos;
// assure for a 'child' object, that it doesn't exceed the limits of its 'parent'
if ( pParentAnchoredObj )
2000-09-18 23:08:29 +00:00
{
if ( bMovedForward )
2000-09-18 23:08:29 +00:00
{
sal_uInt32 nMaxChildOrdNumWithoutMoved =
_GetMaxChildOrdNum( *pParentAnchoredObj, pMovedAnchoredObj->GetDrawObj() );
if ( nNewPos > nMaxChildOrdNumWithoutMoved+1 )
{
// set position to the top of the 'child' object group
pDrawPage->SetObjectOrdNum( nNewPos, nMaxChildOrdNumWithoutMoved+1 );
nNewPos = nMaxChildOrdNumWithoutMoved+1;
}
}
else
{
const sal_uInt32 nParentOrdNum = pParentAnchoredObj->GetDrawObj()->GetOrdNum();
if ( nNewPos < nParentOrdNum )
{
// set position to the bottom of the 'child' object group
pDrawPage->SetObjectOrdNum( nNewPos, nParentOrdNum );
nNewPos = nParentOrdNum;
}
}
if ( pDrawPage->IsObjOrdNumsDirty() )
pDrawPage->RecalcObjOrdNums();
}
// Assure, that object isn't positioned between 'repeated' ones
if ( ( bMovedForward && nNewPos < nObjCount - 1 ) ||
( !bMovedForward && nNewPos > 0 ) )
{
const SdrObject* pTmpObj =
pDrawPage->GetObj( bMovedForward ? nNewPos - 1 : nNewPos + 1 );
if ( pTmpObj )
{
sal_uInt32 nTmpNewPos( nNewPos );
if ( bMovedForward )
{
// move before the top 'repeated' object
const sal_uInt32 nTmpMaxOrdNum =
::GetUserCall( pTmpObj )->GetMaxOrdNum();
if ( nTmpMaxOrdNum > nNewPos )
nTmpNewPos = nTmpMaxOrdNum;
}
2000-09-18 23:08:29 +00:00
else
{
// move behind the bottom 'repeated' object
const sal_uInt32 nTmpMinOrdNum =
::GetUserCall( pTmpObj )->GetMinOrdNum();
if ( nTmpMinOrdNum < nNewPos )
nTmpNewPos = nTmpMinOrdNum;
}
if ( nTmpNewPos != nNewPos )
{
pDrawPage->SetObjectOrdNum( nNewPos, nTmpNewPos );
nNewPos = nTmpNewPos;
pDrawPage->RecalcObjOrdNums();
}
}
}
// On move forward, assure that object is moved before its own childs.
// Only Writer fly frames can have childs.
if ( pMovedAnchoredObj->ISA(SwFlyFrm) &&
bMovedForward && nNewPos < nObjCount - 1 )
{
sal_uInt32 nMaxChildOrdNum =
_GetMaxChildOrdNum( *(static_cast<const SwFlyFrm*>(pMovedAnchoredObj)) );
if ( nNewPos < nMaxChildOrdNum )
{
// determine position before the object before its top 'child' object
const SdrObject* pTmpObj = pDrawPage->GetObj( nMaxChildOrdNum );
sal_uInt32 nTmpNewPos = ::GetUserCall( pTmpObj )->GetMaxOrdNum() + 1;
if ( nTmpNewPos >= nObjCount )
{
--nTmpNewPos;
}
// assure, that determined position isn't between 'repeated' objects
pTmpObj = pDrawPage->GetObj( nTmpNewPos );
nTmpNewPos = ::GetUserCall( pTmpObj )->GetMaxOrdNum();
// apply new position
pDrawPage->SetObjectOrdNum( nNewPos, nTmpNewPos );
nNewPos = nTmpNewPos;
pDrawPage->RecalcObjOrdNums();
}
}
// Assure, that object isn't positioned between nested objects
if ( ( bMovedForward && nNewPos < nObjCount - 1 ) ||
( !bMovedForward && nNewPos > 0 ) )
{
sal_uInt32 nTmpNewPos( nNewPos );
const SwFrmFmt* pParentFrmFmt =
pParentAnchoredObj ? &(pParentAnchoredObj->GetFrmFmt()) : 0L;
const SdrObject* pTmpObj = pDrawPage->GetObj( nNewPos + 1 );
while ( pTmpObj )
{
// --> OD 2004-12-07 #i38563# - assure, that anchor frame exists.
// If object is anchored inside a invisible part of the document
// (e.g. page header, whose page style isn't applied, or hidden
// section), no anchor frame exists.
const SwFrm* pTmpAnchorFrm = lcl_FindAnchor( pTmpObj, TRUE );
const SwFlyFrm* pTmpParentObj = pTmpAnchorFrm
? pTmpAnchorFrm->FindFlyFrm() : 0L;
// <--
if ( pTmpParentObj &&
&(pTmpParentObj->GetFrmFmt()) != pParentFrmFmt )
2000-09-18 23:08:29 +00:00
{
if ( bMovedForward )
{
nTmpNewPos = ::GetUserCall( pTmpObj )->GetMaxOrdNum();
pTmpObj = pDrawPage->GetObj( nTmpNewPos + 1 );
}
else
2002-04-05 11:27:40 +00:00
{
nTmpNewPos = ::GetUserCall( pTmpParentObj->GetDrawObj() )
->GetMinOrdNum();
pTmpObj = pTmpParentObj->GetDrawObj();
2002-04-05 11:27:40 +00:00
}
2000-09-18 23:08:29 +00:00
}
else
break;
2000-09-18 23:08:29 +00:00
}
if ( nTmpNewPos != nNewPos )
{
pDrawPage->SetObjectOrdNum( nNewPos, nTmpNewPos );
nNewPos = nTmpNewPos;
pDrawPage->RecalcObjOrdNums();
}
}
// setup collection of moved 'child' objects to move its 'repeated' objects.
std::vector< SdrObject* > aMovedChildObjs;
// move 'childs' accordingly
if ( pMovedAnchoredObj->ISA(SwFlyFrm) )
{
const SwFlyFrm* pFlyFrm = static_cast<SwFlyFrm*>(pMovedAnchoredObj);
// adjustments for accessibility API
rImp.DisposeAccessibleFrm( pFlyFrm );
rImp.AddAccessibleFrm( pFlyFrm );
const sal_uInt32 nChildNewPos = bMovedForward ? nNewPos : nNewPos+1;
sal_uInt32 i = bMovedForward ? nOldPos : nObjCount-1;
do
{
SdrObject* pTmpObj = pDrawPage->GetObj( i );
if ( pTmpObj == pObj )
break;
// --> OD 2004-12-07 #i38563# - assure, that anchor frame exists.
// If object is anchored inside a invisible part of the document
// (e.g. page header, whose page style isn't applied, or hidden
// section), no anchor frame exists.
const SwFrm* pTmpAnchorFrm = lcl_FindAnchor( pTmpObj, TRUE );
const SwFlyFrm* pTmpParentObj = pTmpAnchorFrm
? pTmpAnchorFrm->FindFlyFrm() : 0L;
// <--
if ( pTmpParentObj &&
( ( pTmpParentObj == pFlyFrm ) ||
( pFlyFrm->IsUpperOf( *pTmpParentObj ) ) ) )
{
// move child object.,
pDrawPage->SetObjectOrdNum( i, nChildNewPos );
pDrawPage->RecalcObjOrdNums();
// collect 'child' object
aMovedChildObjs.push_back( pTmpObj );
// adjustments for accessibility API
if ( pTmpObj->ISA(SwVirtFlyDrawObj) )
{
const SwFlyFrm *pTmpFlyFrm =
static_cast<SwVirtFlyDrawObj*>(pTmpObj)->GetFlyFrm();
rImp.DisposeAccessibleFrm( pTmpFlyFrm );
rImp.AddAccessibleFrm( pTmpFlyFrm );
}
else
{
rImp.DisposeAccessibleObj( pTmpObj );
rImp.AddAccessibleObj( pTmpObj );
}
}
else
{
// adjust loop counter
if ( bMovedForward )
++i;
else if ( !bMovedForward && i > 0 )
--i;
}
} while ( ( bMovedForward && i < ( nObjCount - aMovedChildObjs.size() ) ) ||
( !bMovedForward && i > ( nNewPos + aMovedChildObjs.size() ) ) );
2000-09-18 23:08:29 +00:00
}
2002-05-15 12:32:21 +00:00
else
{
// adjustments for accessibility API
2002-05-15 12:32:21 +00:00
rImp.DisposeAccessibleObj( pObj );
rImp.AddAccessibleObj( pObj );
}
_MoveRepeatedObjs( *pMovedAnchoredObj, aMovedChildObjs );
2000-09-18 23:08:29 +00:00
}
// <--
2000-09-18 23:08:29 +00:00
/*************************************************************************
|*
|* SwDrawView::TakeDragLimit()
|*
|* Ersterstellung AMA 26. Apr. 96
|* Letzte Aenderung MA 03. May. 96
|*
*************************************************************************/
BOOL SwDrawView::TakeDragLimit( SdrDragMode eMode,
Rectangle& rRect ) const
{
const SdrMarkList &rMrkList = GetMarkedObjectList();
2000-09-18 23:08:29 +00:00
BOOL bRet = FALSE;
if( 1 == rMrkList.GetMarkCount() )
{
const SdrObject *pObj = rMrkList.GetMark( 0 )->GetMarkedSdrObj();
2000-09-18 23:08:29 +00:00
SwRect aRect;
if( ::CalcClipRect( pObj, aRect, eMode == SDRDRAG_MOVE ) )
{
rRect = aRect.SVRect();
bRet = TRUE;
}
}
return bRet;
}
/*************************************************************************
|*
|* SwDrawView::CalcAnchor()
|*
|* Ersterstellung MA 13. Jan. 95
|* Letzte Aenderung MA 08. Nov. 96
|*
*************************************************************************/
const SwFrm* SwDrawView::CalcAnchor()
2000-09-18 23:08:29 +00:00
{
const SdrMarkList &rMrkList = GetMarkedObjectList();
2000-09-18 23:08:29 +00:00
if ( rMrkList.GetMarkCount() != 1 )
return NULL;
SdrObject* pObj = rMrkList.GetMark( 0 )->GetMarkedSdrObj();
2000-09-18 23:08:29 +00:00
//Fuer Absatzgebundene Objekte suchen, andernfalls einfach nur
//der aktuelle Anker. Nur suchen wenn wir gerade draggen.
const SwFrm* pAnch;
Rectangle aMyRect;
const BOOL bFly = pObj->ISA(SwVirtFlyDrawObj);
2000-09-18 23:08:29 +00:00
if ( bFly )
{
pAnch = ((SwVirtFlyDrawObj*)pObj)->GetFlyFrm()->GetAnchorFrm();
aMyRect = ((SwVirtFlyDrawObj*)pObj)->GetFlyFrm()->Frm().SVRect();
2000-09-18 23:08:29 +00:00
}
else
{
SwDrawContact *pC = (SwDrawContact*)GetUserCall(pObj);
// OD 17.06.2003 #108784# - determine correct anchor position for
// 'virtual' drawing objects.
// OD 2004-03-25 #i26791#
pAnch = pC->GetAnchorFrm( pObj );
2000-09-18 23:08:29 +00:00
if( !pAnch )
{
pC->ConnectToLayout();
// OD 17.06.2003 #108784# - determine correct anchor position for
// 'virtual' drawing objects.
// OD 2004-03-25 #i26791#
pAnch = pC->GetAnchorFrm( pObj );
2000-09-18 23:08:29 +00:00
}
aMyRect = pObj->GetSnapRect();
}
const sal_Bool bTopRight = pAnch && ( pAnch->IsVertical() ||
pAnch->IsRightToLeft() );
const Point aMyPt = bTopRight ? aMyRect.TopRight() : aMyRect.TopLeft();
Point aPt;
if ( IsAction() )
{
if ( !TakeDragObjAnchorPos( aPt, bTopRight ) )
return NULL;
}
else
{
Rectangle aRect = pObj->GetSnapRect();
aPt = bTopRight ? aRect.TopRight() : aRect.TopLeft();
2000-09-18 23:08:29 +00:00
}
if ( aPt != aMyPt )
{
if ( pAnch->IsCntntFrm() )
{
// OD 26.06.2003 #108784# - allow drawing objects in header/footer,
// but exclude control objects.
bool bBodyOnly = CheckControlLayer( pObj );
pAnch = ::FindAnchor( (SwCntntFrm*)pAnch, aPt, bBodyOnly );
}
2000-09-18 23:08:29 +00:00
else if ( !bFly )
{
const SwRect aRect( aPt.X(), aPt.Y(), 1, 1 );
2000-09-18 23:08:29 +00:00
SwDrawContact* pContact = (SwDrawContact*)GetUserCall(pObj);
if ( pContact->GetAnchorFrm( pObj ) &&
pContact->GetAnchorFrm( pObj )->IsPageFrm() )
pAnch = pContact->GetPageFrm();
2000-09-18 23:08:29 +00:00
else
pAnch = pContact->FindPage( aRect );
}
}
if( pAnch && !pAnch->IsProtected() )
aAnchorPoint = pAnch->GetFrmAnchorPos( ::HasWrap( pObj ) );
2000-09-18 23:08:29 +00:00
else
pAnch = 0;
return pAnch;
}
/*************************************************************************
|*
|* SwDrawView::ShowDragXor(), HideDragXor()
|*
|* Ersterstellung MA 17. Jan. 95
|* Letzte Aenderung MA 27. Jan. 95
|*
*************************************************************************/
void SwDrawView::ShowDragAnchor()
{
SdrHdl* pHdl = aHdl.GetHdl(HDL_ANCHOR);
if ( ! pHdl )
pHdl = aHdl.GetHdl(HDL_ANCHOR_TR);
2000-09-18 23:08:29 +00:00
if(pHdl)
{
CalcAnchor();
pHdl->SetPos(aAnchorPoint);
//OLMRefreshAllIAOManagers();
2000-09-18 23:08:29 +00:00
}
}
/*************************************************************************
|*
|* SwDrawView::MarkListHasChanged()
|*
|* Ersterstellung OM 02. Feb. 95
|* Letzte Aenderung OM 07. Jul. 95
|*
*************************************************************************/
void SwDrawView::MarkListHasChanged()
{
Imp().GetShell()->DrawSelChanged();
2000-09-18 23:08:29 +00:00
FmFormView::MarkListHasChanged();
}
// #i7672#
void SwDrawView::ModelHasChanged()
{
// The ModelHasChanged() call in DrawingLayer also updates
// a eventually active text edit view (OutlinerView). This also leads
// to newly setting the background color for that edit view. Thus,
// this method rescues the current background color if a OutlinerView
// exists and re-establishes it then. To be more safe, the OutlinerView
// will be fetched again (maybe textedit has ended).
OutlinerView* pView = GetTextEditOutlinerView();
Color aBackColor;
sal_Bool bColorWasSaved(sal_False);
if(pView)
{
aBackColor = pView->GetBackgroundColor();
bColorWasSaved = sal_True;
}
// call parent
FmFormView::ModelHasChanged();
if(bColorWasSaved)
{
pView = GetTextEditOutlinerView();
if(pView)
{
pView->SetBackgroundColor(aBackColor);
}
}
}
2000-09-18 23:08:29 +00:00
void SwDrawView::MakeVisible( const Rectangle &rRect, Window & )
2000-09-18 23:08:29 +00:00
{
ASSERT( rImp.GetShell()->GetWin(), "MakeVisible, unknown Window");
2000-09-18 23:08:29 +00:00
rImp.GetShell()->MakeVisible( SwRect( rRect ) );
}
void SwDrawView::CheckPossibilities()
{
FmFormView::CheckPossibilities();
//Zusaetzlich zu den bestehenden Flags der Objekte selbst, die von der
//DrawingEngine ausgewertet werden, koennen weitere Umstaende zu einem
//Schutz fuehren.
//Objekte, die in Rahmen verankert sind, muessen genau dann geschuetzt
//sein, wenn der Inhalt des Rahmens geschuetzt ist.
//OLE-Objekte konnen selbst einen Resize-Schutz wuenschen (StarMath)
const SdrMarkList &rMrkList = GetMarkedObjectList();
BOOL bProtect = FALSE,
2000-09-18 23:08:29 +00:00
bSzProtect = FALSE;
for ( USHORT i = 0; !bProtect && i < rMrkList.GetMarkCount(); ++i )
{
const SdrObject *pObj = rMrkList.GetMark( i )->GetMarkedSdrObj();
2000-09-18 23:08:29 +00:00
const SwFrm *pFrm = NULL;
if ( pObj->ISA(SwVirtFlyDrawObj) )
2000-09-18 23:08:29 +00:00
{
const SwFlyFrm *pFly = ((SwVirtFlyDrawObj*)pObj)->GetFlyFrm();
if ( pFly )
{
pFrm = pFly->GetAnchorFrm();
2000-09-18 23:08:29 +00:00
if ( pFly->Lower() && pFly->Lower()->IsNoTxtFrm() )
{
SwOLENode *pNd = ((SwCntntFrm*)pFly->Lower())->GetNode()->GetOLENode();
if ( pNd )
{
uno::Reference < embed::XEmbeddedObject > xObj = pNd->GetOLEObj().GetOleRef();
if ( xObj.is() )
2000-09-18 23:08:29 +00:00
{
// --> OD 2004-08-16 #110810# - improvement for
// the future, when more than one Writer fly frame
// can be selected.
// TODO/LATER: retrieve Aspect - from where?!
bSzProtect |= ( embed::EmbedMisc::EMBED_NEVERRESIZE & xObj->getStatus( embed::Aspects::MSOLE_CONTENT ) ) ? TRUE : FALSE;
// <--
2000-09-18 23:08:29 +00:00
}
}
}
}
}
else
{
SwDrawContact *pC = (SwDrawContact*)GetUserCall(pObj);
if ( pC )
pFrm = pC->GetAnchorFrm( pObj );
2000-09-18 23:08:29 +00:00
}
if ( pFrm )
bProtect = pFrm->IsProtected(); //Rahmen, Bereiche usw.
{
SwFrmFmt* pFrmFmt( ::FindFrmFmt( const_cast<SdrObject*>(pObj) ) );
if ( !pFrmFmt )
{
ASSERT( false,
"<SwDrawView::CheckPossibilities()> - missing frame format" );
bProtect = TRUE;
}
else if ((FLY_AS_CHAR == pFrmFmt->GetAnchor().GetAnchorId()) &&
rMrkList.GetMarkCount() > 1 )
{
bProtect = TRUE;
}
}
2000-09-18 23:08:29 +00:00
}
bMoveProtect |= bProtect;
bResizeProtect |= bProtect | bSzProtect;
}
/** replace marked <SwDrawVirtObj>-objects by its reference object for delete
marked objects.
OD 18.06.2003 #108784#
@author OD
*/
void SwDrawView::ReplaceMarkedDrawVirtObjs( SdrMarkView& _rMarkView )
{
SdrPageView* pDrawPageView = _rMarkView.GetSdrPageView();
const SdrMarkList& rMarkList = _rMarkView.GetMarkedObjectList();
if( rMarkList.GetMarkCount() )
{
// collect marked objects in a local data structure
std::vector<SdrObject*> aMarkedObjs;
for( sal_uInt32 i = 0; i < rMarkList.GetMarkCount(); ++i )
{
SdrObject* pMarkedObj = rMarkList.GetMark( i )->GetMarkedSdrObj();
aMarkedObjs.push_back( pMarkedObj );
}
// unmark all objects
_rMarkView.UnmarkAllObj();
// re-mark objects, but for marked <SwDrawVirtObj>-objects marked its
// reference object.
while ( !aMarkedObjs.empty() )
{
SdrObject* pMarkObj = aMarkedObjs.back();
if ( pMarkObj->ISA(SwDrawVirtObj) )
{
SdrObject* pRefObj = &(static_cast<SwDrawVirtObj*>(pMarkObj)->ReferencedObj());
if ( !_rMarkView.IsObjMarked( pRefObj ) )
{
_rMarkView.MarkObj( pRefObj, pDrawPageView );
}
}
else
{
_rMarkView.MarkObj( pMarkObj, pDrawPageView );
}
aMarkedObjs.pop_back();
}
// sort marked list in order to assure consistent state in drawing layer
_rMarkView.SortMarkedObjects();
}
}
2000-09-18 23:08:29 +00:00
void SwDrawView::DeleteMarked()
{
SwDoc* pDoc = Imp().GetShell()->GetDoc();
if ( pDoc->GetRootFrm() )
2000-09-18 23:08:29 +00:00
pDoc->GetRootFrm()->StartAllAction();
pDoc->StartUndo(UNDO_EMPTY, NULL);
// OD 18.06.2003 #108784# - replace marked <SwDrawVirtObj>-objects by its
// reference objects.
{
SdrPageView* pDrawPageView = rImp.GetPageView();
if ( pDrawPageView )
{
SdrMarkView* pMarkView = PTR_CAST( SdrMarkView, &(pDrawPageView->GetView()) );
if ( pMarkView )
{
ReplaceMarkedDrawVirtObjs( *pMarkView );
}
}
}
if ( pDoc->DeleteSelection( *this ) )
2000-09-18 23:08:29 +00:00
{
FmFormView::DeleteMarked();
::FrameNotify( Imp().GetShell(), FLY_DRAG_END );
}
pDoc->EndUndo(UNDO_EMPTY, NULL);
2000-09-18 23:08:29 +00:00
if( pDoc->GetRootFrm() )
pDoc->GetRootFrm()->EndAllAction();
}
/********
JP 02.10.98: sollte als Fix fuer 57153 gelten, hatte aber Nebenwirkungen,
wie Bug 57475
const SdrMarkList& SwDrawView::GetMarkedObjectList() const
2000-09-18 23:08:29 +00:00
{
FlushComeBackTimer();
return FmFormView::GetMarkedObjectList();
2000-09-18 23:08:29 +00:00
}
*************/