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
1124 lines
37 KiB
C++
1124 lines
37 KiB
C++
/*************************************************************************
|
|
*
|
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
*
|
|
* Copyright 2008 by Sun Microsystems, Inc.
|
|
*
|
|
* OpenOffice.org - a multi-platform office productivity suite
|
|
*
|
|
* $RCSfile: dview.cxx,v $
|
|
* $Revision: 1.30 $
|
|
*
|
|
* This file is part of OpenOffice.org.
|
|
*
|
|
* 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.
|
|
*
|
|
* 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).
|
|
*
|
|
* 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.
|
|
*
|
|
************************************************************************/
|
|
|
|
// MARKER(update_precomp.py): autogen include statement, do not remove
|
|
#include "precompiled_sw.hxx"
|
|
|
|
#include "hintids.hxx"
|
|
#include <svx/protitem.hxx>
|
|
#include <svx/svdpagv.hxx>
|
|
#ifndef _FM_FMMODEL_HXX
|
|
#include <svx/fmmodel.hxx>
|
|
#endif
|
|
|
|
#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 <svx/outliner.hxx>
|
|
|
|
#include <com/sun/star/embed/EmbedMisc.hpp>
|
|
|
|
using namespace com::sun::star;
|
|
|
|
// 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>
|
|
// <--
|
|
|
|
class SwSdrHdl : public SdrHdl
|
|
{
|
|
public:
|
|
SwSdrHdl(const Point& rPnt, bool bTopRight ) :
|
|
SdrHdl( rPnt, bTopRight ? HDL_ANCHOR_TR : HDL_ANCHOR ) {}
|
|
virtual BOOL IsFocusHdl() const;
|
|
};
|
|
|
|
BOOL SwSdrHdl::IsFocusHdl() const
|
|
{
|
|
if( HDL_ANCHOR == eKind || HDL_ANCHOR_TR == eKind )
|
|
return TRUE;
|
|
return SdrHdl::IsFocusHdl();
|
|
}
|
|
|
|
const SwFrm *lcl_FindAnchor( const SdrObject *pObj, BOOL bAll )
|
|
{
|
|
const SwVirtFlyDrawObj *pVirt = pObj->ISA(SwVirtFlyDrawObj) ?
|
|
(SwVirtFlyDrawObj*)pObj : 0;
|
|
if ( pVirt )
|
|
{
|
|
if ( bAll || !pVirt->GetFlyFrm()->IsFlyInCntFrm() )
|
|
return pVirt->GetFlyFrm()->GetAnchorFrm();
|
|
}
|
|
else
|
|
{
|
|
const SwDrawContact *pCont = (const SwDrawContact*)GetUserCall(pObj);
|
|
if ( pCont )
|
|
return pCont->GetAnchorFrm( pObj );
|
|
}
|
|
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());
|
|
}
|
|
|
|
// --> OD 2009-03-05 #i99665#
|
|
sal_Bool SwDrawView::IsAntiAliasing() const
|
|
{
|
|
return getOptionsDrawinglayer().IsAntiAliasing();
|
|
}
|
|
// <--
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
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;
|
|
}
|
|
|
|
/*************************************************************************
|
|
|*
|
|
|* 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();
|
|
|
|
if(rMrkList.GetMarkCount() != 1 || !GetUserCall(rMrkList.GetMark( 0 )->GetMarkedSdrObj()))
|
|
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();
|
|
// <--
|
|
|
|
if(FLY_IN_CNTNT == rAnchor.GetAnchorId())
|
|
return;
|
|
|
|
const SwFrm* pAnch;
|
|
if(0 == (pAnch = CalcAnchor()))
|
|
return;
|
|
|
|
Point aPos(aAnchorPoint);
|
|
|
|
if ( FLY_AUTO_CNTNT == rAnchor.GetAnchorId() )
|
|
{
|
|
// --> 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();
|
|
}
|
|
}
|
|
|
|
// add anchor handle:
|
|
aHdl.AddHdl( new SwSdrHdl( aPos, pAnch->IsVertical() ||
|
|
pAnch->IsRightToLeft() ) );
|
|
}
|
|
|
|
/*************************************************************************
|
|
|*
|
|
|* 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();
|
|
|
|
if ( pO->GetOrdNumDirect() > nOrdNum )
|
|
{
|
|
const SwFrm *pTmpAnch = ::lcl_FindAnchor( pO, FALSE );
|
|
if ( pFly->IsAnLower( pTmpAnch ) )
|
|
{
|
|
nOrdNum = pO->GetOrdNumDirect();
|
|
}
|
|
}
|
|
}
|
|
if ( nOrdNum )
|
|
{
|
|
SdrPage *pTmpPage = GetModel()->GetPage( 0 );
|
|
++nOrdNum;
|
|
if ( nOrdNum < pTmpPage->GetObjCount() )
|
|
{
|
|
return pTmpPage->GetObj( nOrdNum );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
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) )
|
|
{
|
|
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
|
|
|
|
OD 2004-08-20 #110810#
|
|
|
|
@author OD
|
|
*/
|
|
sal_uInt32 SwDrawView::_GetMaxChildOrdNum( const SwFlyFrm& _rParentObj,
|
|
const SdrObject* _pExclChildObj ) const
|
|
{
|
|
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 )
|
|
{
|
|
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 ) ) )
|
|
{
|
|
nMaxChildOrdNum = pObj->GetOrdNum();
|
|
break;
|
|
}
|
|
}
|
|
|
|
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;
|
|
{
|
|
const SwContact* pContact = ::GetUserCall( _rMovedAnchoredObj.GetDrawObj() );
|
|
ASSERT( pContact,
|
|
"SwDrawView::_MoveRepeatedObjs(..) - missing contact object -> crash." );
|
|
pContact->GetAnchoredObjs( aAnchoredObjs );
|
|
}
|
|
|
|
// check, if 'repeated' objects exists.
|
|
if ( aAnchoredObjs.size() > 1 )
|
|
{
|
|
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() )
|
|
{
|
|
SwAnchoredObject* pAnchoredObj = aAnchoredObjs.back();
|
|
if ( pAnchoredObj != &_rMovedAnchoredObj )
|
|
{
|
|
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() );
|
|
}
|
|
}
|
|
aAnchoredObjs.pop_back();
|
|
}
|
|
|
|
// move 'repeated' ones of 'child' objects
|
|
for ( std::vector<SdrObject*>::const_iterator aObjIter = _rMovedChildObjs.begin();
|
|
aObjIter != _rMovedChildObjs.end(); ++aObjIter )
|
|
{
|
|
SdrObject* pChildObj = (*aObjIter);
|
|
{
|
|
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 )
|
|
{
|
|
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() );
|
|
}
|
|
}
|
|
aAnchoredObjs.pop_back();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// --> 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() )
|
|
{
|
|
return;
|
|
}
|
|
// <--
|
|
|
|
// 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();
|
|
|
|
const bool bMovedForward = nOldPos < nNewPos;
|
|
|
|
// assure for a 'child' object, that it doesn't exceed the limits of its 'parent'
|
|
if ( pParentAnchoredObj )
|
|
{
|
|
if ( bMovedForward )
|
|
{
|
|
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;
|
|
}
|
|
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 )
|
|
{
|
|
if ( bMovedForward )
|
|
{
|
|
nTmpNewPos = ::GetUserCall( pTmpObj )->GetMaxOrdNum();
|
|
pTmpObj = pDrawPage->GetObj( nTmpNewPos + 1 );
|
|
}
|
|
else
|
|
{
|
|
nTmpNewPos = ::GetUserCall( pTmpParentObj->GetDrawObj() )
|
|
->GetMinOrdNum();
|
|
pTmpObj = pTmpParentObj->GetDrawObj();
|
|
}
|
|
}
|
|
else
|
|
break;
|
|
}
|
|
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() ) ) );
|
|
}
|
|
else
|
|
{
|
|
// adjustments for accessibility API
|
|
rImp.DisposeAccessibleObj( pObj );
|
|
rImp.AddAccessibleObj( pObj );
|
|
}
|
|
|
|
_MoveRepeatedObjs( *pMovedAnchoredObj, aMovedChildObjs );
|
|
}
|
|
// <--
|
|
|
|
/*************************************************************************
|
|
|*
|
|
|* 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();
|
|
BOOL bRet = FALSE;
|
|
if( 1 == rMrkList.GetMarkCount() )
|
|
{
|
|
const SdrObject *pObj = rMrkList.GetMark( 0 )->GetMarkedSdrObj();
|
|
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()
|
|
{
|
|
const SdrMarkList &rMrkList = GetMarkedObjectList();
|
|
if ( rMrkList.GetMarkCount() != 1 )
|
|
return NULL;
|
|
|
|
SdrObject* pObj = rMrkList.GetMark( 0 )->GetMarkedSdrObj();
|
|
|
|
//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);
|
|
if ( bFly )
|
|
{
|
|
pAnch = ((SwVirtFlyDrawObj*)pObj)->GetFlyFrm()->GetAnchorFrm();
|
|
aMyRect = ((SwVirtFlyDrawObj*)pObj)->GetFlyFrm()->Frm().SVRect();
|
|
}
|
|
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 );
|
|
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 );
|
|
}
|
|
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();
|
|
}
|
|
|
|
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 );
|
|
}
|
|
else if ( !bFly )
|
|
{
|
|
const SwRect aRect( aPt.X(), aPt.Y(), 1, 1 );
|
|
|
|
SwDrawContact* pContact = (SwDrawContact*)GetUserCall(pObj);
|
|
if ( pContact->GetAnchorFrm( pObj ) &&
|
|
pContact->GetAnchorFrm( pObj )->IsPageFrm() )
|
|
pAnch = pContact->GetPageFrm();
|
|
else
|
|
pAnch = pContact->FindPage( aRect );
|
|
}
|
|
}
|
|
if( pAnch && !pAnch->IsProtected() )
|
|
aAnchorPoint = pAnch->GetFrmAnchorPos( ::HasWrap( pObj ) );
|
|
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);
|
|
|
|
if(pHdl)
|
|
{
|
|
CalcAnchor();
|
|
pHdl->SetPos(aAnchorPoint);
|
|
//OLMRefreshAllIAOManagers();
|
|
}
|
|
}
|
|
|
|
/*************************************************************************
|
|
|*
|
|
|* SwDrawView::MarkListHasChanged()
|
|
|*
|
|
|* Ersterstellung OM 02. Feb. 95
|
|
|* Letzte Aenderung OM 07. Jul. 95
|
|
|*
|
|
*************************************************************************/
|
|
|
|
|
|
void SwDrawView::MarkListHasChanged()
|
|
{
|
|
Imp().GetShell()->DrawSelChanged();
|
|
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);
|
|
}
|
|
}
|
|
}
|
|
|
|
void SwDrawView::MakeVisible( const Rectangle &rRect, Window & )
|
|
{
|
|
ASSERT( rImp.GetShell()->GetWin(), "MakeVisible, unknown Window");
|
|
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,
|
|
bSzProtect = FALSE;
|
|
for ( USHORT i = 0; !bProtect && i < rMrkList.GetMarkCount(); ++i )
|
|
{
|
|
const SdrObject *pObj = rMrkList.GetMark( i )->GetMarkedSdrObj();
|
|
const SwFrm *pFrm = NULL;
|
|
if ( pObj->ISA(SwVirtFlyDrawObj) )
|
|
{
|
|
const SwFlyFrm *pFly = ((SwVirtFlyDrawObj*)pObj)->GetFlyFrm();
|
|
if ( pFly )
|
|
{
|
|
pFrm = pFly->GetAnchorFrm();
|
|
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() )
|
|
{
|
|
// --> 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;
|
|
|
|
// <--
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
SwDrawContact *pC = (SwDrawContact*)GetUserCall(pObj);
|
|
if ( pC )
|
|
pFrm = pC->GetAnchorFrm( pObj );
|
|
}
|
|
if ( pFrm )
|
|
bProtect = pFrm->IsProtected(); //Rahmen, Bereiche usw.
|
|
// --> OD 2006-11-06 #130889# - make code robust
|
|
// if ( FLY_IN_CNTNT == ::FindFrmFmt( (SdrObject*)pObj )->GetAnchor().GetAnchorId() &&
|
|
// rMrkList.GetMarkCount() > 1 )
|
|
// bProtect = TRUE;
|
|
{
|
|
SwFrmFmt* pFrmFmt( ::FindFrmFmt( const_cast<SdrObject*>(pObj) ) );
|
|
if ( !pFrmFmt )
|
|
{
|
|
ASSERT( false,
|
|
"<SwDrawView::CheckPossibilities()> - missing frame format" );
|
|
bProtect = TRUE;
|
|
}
|
|
else if ( FLY_IN_CNTNT == pFrmFmt->GetAnchor().GetAnchorId() &&
|
|
rMrkList.GetMarkCount() > 1 )
|
|
{
|
|
bProtect = TRUE;
|
|
}
|
|
}
|
|
// <--
|
|
}
|
|
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();
|
|
}
|
|
}
|
|
|
|
void SwDrawView::DeleteMarked()
|
|
{
|
|
SwDoc* pDoc = Imp().GetShell()->GetDoc();
|
|
if ( pDoc->GetRootFrm() )
|
|
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 ) )
|
|
{
|
|
FmFormView::DeleteMarked();
|
|
::FrameNotify( Imp().GetShell(), FLY_DRAG_END );
|
|
}
|
|
pDoc->EndUndo(UNDO_EMPTY, NULL);
|
|
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
|
|
{
|
|
FlushComeBackTimer();
|
|
return FmFormView::GetMarkedObjectList();
|
|
}
|
|
*************/
|
|
|
|
|
|
|
|
|