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
968 lines
32 KiB
C++
968 lines
32 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: dflyobj.cxx,v $
|
|
* $Revision: 1.27.22.1 $
|
|
*
|
|
* 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/svdtrans.hxx>
|
|
#include <svx/protitem.hxx>
|
|
#include <svx/opaqitem.hxx>
|
|
#include <svx/svdpage.hxx>
|
|
|
|
|
|
#include <fmtclds.hxx>
|
|
#include <fmtornt.hxx>
|
|
#include <fmtfsize.hxx>
|
|
#include <fmturl.hxx>
|
|
#include "viewsh.hxx"
|
|
#include "viewimp.hxx"
|
|
#include "cntfrm.hxx"
|
|
#include "frmatr.hxx"
|
|
#include "doc.hxx"
|
|
#include "dview.hxx"
|
|
#include "dflyobj.hxx"
|
|
#include "flyfrm.hxx"
|
|
#include "frmfmt.hxx"
|
|
#include "viewopt.hxx"
|
|
#include "frmtool.hxx"
|
|
#include "flyfrms.hxx"
|
|
#include "ndnotxt.hxx"
|
|
#include "grfatr.hxx"
|
|
#include "pagefrm.hxx"
|
|
|
|
|
|
using namespace ::com::sun::star;
|
|
|
|
|
|
// --> OD 2004-11-22 #117958#
|
|
#include <svx/sdr/properties/defaultproperties.hxx>
|
|
// <--
|
|
#include <basegfx/range/b2drange.hxx>
|
|
#include <basegfx/polygon/b2dpolygontools.hxx>
|
|
#include <basegfx/polygon/b2dpolygon.hxx>
|
|
|
|
// AW: For VCOfDrawVirtObj and stuff
|
|
#include <svx/sdr/contact/viewcontactofvirtobj.hxx>
|
|
#include <drawinglayer/primitive2d/baseprimitive2d.hxx>
|
|
#include <drawinglayer/primitive2d/drawinglayer_primitivetypes2d.hxx>
|
|
#include <sw_primitivetypes2d.hxx>
|
|
#include <drawinglayer/primitive2d/polypolygonprimitive2d.hxx>
|
|
#include <drawinglayer/primitive2d/hittestprimitive2d.hxx>
|
|
|
|
using namespace ::com::sun::star;
|
|
|
|
static BOOL bInResize = FALSE;
|
|
|
|
TYPEINIT1( SwFlyDrawObj, SdrObject )
|
|
TYPEINIT1( SwVirtFlyDrawObj, SdrVirtObj )
|
|
|
|
/*************************************************************************
|
|
|*
|
|
|* SwFlyDrawObj::Ctor
|
|
|*
|
|
|* Ersterstellung MA 18. Apr. 95
|
|
|* Letzte Aenderung MA 28. May. 96
|
|
|*
|
|
*************************************************************************/
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
namespace sdr
|
|
{
|
|
namespace contact
|
|
{
|
|
// #i95264# currently needed since createViewIndependentPrimitive2DSequence()
|
|
// is called when RecalcBoundRect() is used. There should currently no VOCs being
|
|
// constructed since it gets not visualized (instead the corresponding SwVirtFlyDrawObj's
|
|
// referencing this one are visualized).
|
|
class VCOfSwFlyDrawObj : public ViewContactOfSdrObj
|
|
{
|
|
protected:
|
|
// This method is responsible for creating the graphical visualisation data
|
|
// ONLY based on model data
|
|
virtual drawinglayer::primitive2d::Primitive2DSequence createViewIndependentPrimitive2DSequence() const;
|
|
|
|
public:
|
|
// basic constructor, used from SdrObject.
|
|
VCOfSwFlyDrawObj(SwFlyDrawObj& rObj)
|
|
: ViewContactOfSdrObj(rObj)
|
|
{
|
|
}
|
|
virtual ~VCOfSwFlyDrawObj();
|
|
};
|
|
|
|
drawinglayer::primitive2d::Primitive2DSequence VCOfSwFlyDrawObj::createViewIndependentPrimitive2DSequence() const
|
|
{
|
|
// currently gets not visualized, return empty sequence
|
|
return drawinglayer::primitive2d::Primitive2DSequence();
|
|
}
|
|
|
|
VCOfSwFlyDrawObj::~VCOfSwFlyDrawObj()
|
|
{
|
|
}
|
|
} // end of namespace contact
|
|
} // end of namespace sdr
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
sdr::properties::BaseProperties* SwFlyDrawObj::CreateObjectSpecificProperties()
|
|
{
|
|
// --> OD 2004-11-22 #117958# - create default properties
|
|
return new sdr::properties::DefaultProperties(*this);
|
|
// <--
|
|
}
|
|
|
|
sdr::contact::ViewContact* SwFlyDrawObj::CreateObjectSpecificViewContact()
|
|
{
|
|
// #i95264# needs an own VC since createViewIndependentPrimitive2DSequence()
|
|
// is called when RecalcBoundRect() is used
|
|
return new sdr::contact::VCOfSwFlyDrawObj(*this);
|
|
}
|
|
|
|
SwFlyDrawObj::SwFlyDrawObj()
|
|
{
|
|
}
|
|
|
|
SwFlyDrawObj::~SwFlyDrawObj()
|
|
{
|
|
}
|
|
|
|
/*************************************************************************
|
|
|*
|
|
|* SwFlyDrawObj::Factory-Methoden
|
|
|*
|
|
|* Ersterstellung MA 23. Feb. 95
|
|
|* Letzte Aenderung MA 23. Feb. 95
|
|
|*
|
|
*************************************************************************/
|
|
|
|
UINT32 __EXPORT SwFlyDrawObj::GetObjInventor() const
|
|
{
|
|
return SWGInventor;
|
|
}
|
|
|
|
|
|
UINT16 __EXPORT SwFlyDrawObj::GetObjIdentifier() const
|
|
{
|
|
return SwFlyDrawObjIdentifier;
|
|
}
|
|
|
|
|
|
UINT16 __EXPORT SwFlyDrawObj::GetObjVersion() const
|
|
{
|
|
return SwDrawFirst;
|
|
}
|
|
|
|
/*************************************************************************
|
|
|*
|
|
|* SwVirtFlyDrawObj::CToren, Dtor
|
|
|*
|
|
|* Ersterstellung MA 08. Dec. 94
|
|
|* Letzte Aenderung MA 28. May. 96
|
|
|*
|
|
*************************************************************************/
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////
|
|
// AW: Need own primitive to get the FlyFrame paint working
|
|
|
|
namespace drawinglayer
|
|
{
|
|
namespace primitive2d
|
|
{
|
|
class SwVirtFlyDrawObjPrimitive : public BasePrimitive2D
|
|
{
|
|
private:
|
|
const SwVirtFlyDrawObj& mrSwVirtFlyDrawObj;
|
|
const basegfx::B2DRange maOuterRange;
|
|
|
|
protected:
|
|
// method which is to be used to implement the local decomposition of a 2D primitive
|
|
virtual Primitive2DSequence createLocalDecomposition(const geometry::ViewInformation2D& rViewInformation) const;
|
|
|
|
public:
|
|
SwVirtFlyDrawObjPrimitive(
|
|
const SwVirtFlyDrawObj& rSwVirtFlyDrawObj,
|
|
const basegfx::B2DRange &rOuterRange)
|
|
: BasePrimitive2D(),
|
|
mrSwVirtFlyDrawObj(rSwVirtFlyDrawObj),
|
|
maOuterRange(rOuterRange)
|
|
{
|
|
}
|
|
|
|
// compare operator
|
|
virtual bool operator==(const BasePrimitive2D& rPrimitive) const;
|
|
|
|
// get range
|
|
virtual basegfx::B2DRange getB2DRange(const geometry::ViewInformation2D& rViewInformation) const;
|
|
|
|
// overloaded to allow callbacks to wrap_DoPaintObject
|
|
virtual Primitive2DSequence get2DDecomposition(const geometry::ViewInformation2D& rViewInformation) const;
|
|
|
|
// data read access
|
|
const SwVirtFlyDrawObj& getSwVirtFlyDrawObj() const { return mrSwVirtFlyDrawObj; }
|
|
const basegfx::B2DRange& getOuterRange() const { return maOuterRange; }
|
|
|
|
// provide unique ID
|
|
DeclPrimitrive2DIDBlock()
|
|
};
|
|
} // end of namespace primitive2d
|
|
} // end of namespace drawinglayer
|
|
|
|
namespace drawinglayer
|
|
{
|
|
namespace primitive2d
|
|
{
|
|
Primitive2DSequence SwVirtFlyDrawObjPrimitive::createLocalDecomposition(const geometry::ViewInformation2D& /*rViewInformation*/) const
|
|
{
|
|
Primitive2DSequence aRetval;
|
|
|
|
if(!getOuterRange().isEmpty())
|
|
{
|
|
// currently this SW object has no primitive representation. As long as this is the case,
|
|
// create an invisible HitTestPrimitive to allow hitting the object. Use a filled primitive
|
|
// to get a HitTest which uses 'inside' as default object hit. The special cases from
|
|
// the old SwVirtFlyDrawObj::CheckHit implementation are handled now in SwDrawView::PickObj;
|
|
// this removed the 'hack' to get a view from inside model data or to react on noll-tolerance
|
|
// as it was done in the old implementation
|
|
const basegfx::B2DPolygon aOuterRangePolygon(basegfx::tools::createPolygonFromRect(getOuterRange()));
|
|
const basegfx::BColor aColor(0.0, 0.0, 0.0);
|
|
const Primitive2DReference aContentReference(
|
|
new PolyPolygonColorPrimitive2D(
|
|
basegfx::B2DPolyPolygon(aOuterRangePolygon),
|
|
aColor));
|
|
const Primitive2DReference aHitTestReference(
|
|
new HitTestPrimitive2D(
|
|
Primitive2DSequence(&aContentReference, 1)));
|
|
|
|
aRetval = Primitive2DSequence(&aHitTestReference, 1);
|
|
}
|
|
|
|
return aRetval;
|
|
}
|
|
|
|
bool SwVirtFlyDrawObjPrimitive::operator==(const BasePrimitive2D& rPrimitive) const
|
|
{
|
|
if(BasePrimitive2D::operator==(rPrimitive))
|
|
{
|
|
const SwVirtFlyDrawObjPrimitive& rCompare = (SwVirtFlyDrawObjPrimitive&)rPrimitive;
|
|
|
|
return (&getSwVirtFlyDrawObj() == &rCompare.getSwVirtFlyDrawObj()
|
|
&& getOuterRange() == rCompare.getOuterRange());
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
basegfx::B2DRange SwVirtFlyDrawObjPrimitive::getB2DRange(const geometry::ViewInformation2D& /*rViewInformation*/) const
|
|
{
|
|
return getOuterRange();
|
|
}
|
|
|
|
Primitive2DSequence SwVirtFlyDrawObjPrimitive::get2DDecomposition(const geometry::ViewInformation2D& rViewInformation) const
|
|
{
|
|
// This is the callback to keep the FlyFrame painting in SW alive as long as it
|
|
// is not changed to primitives. This is the method which will be called by the processors
|
|
// when they do not know this primitive (and they do not). Inside wrap_DoPaintObject
|
|
// there needs to be a test that paint is only done during SW repaints (see there).
|
|
// Using this mechanism guarantees the correct Z-Order of the VirtualObject-based FlyFrames.
|
|
getSwVirtFlyDrawObj().wrap_DoPaintObject();
|
|
|
|
// call parent
|
|
return BasePrimitive2D::get2DDecomposition(rViewInformation);
|
|
}
|
|
|
|
// provide unique ID
|
|
ImplPrimitrive2DIDBlock(SwVirtFlyDrawObjPrimitive, PRIMITIVE2D_ID_SWVIRTFLYDRAWOBJPRIMITIVE2D)
|
|
|
|
} // end of namespace primitive2d
|
|
} // end of namespace drawinglayer
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////
|
|
// AW: own sdr::contact::ViewContact (VC) sdr::contact::ViewObjectContact (VOC) needed
|
|
// since offset is defined different from SdrVirtObj's sdr::contact::ViewContactOfVirtObj.
|
|
// For paint, that offset is used by setting at the OutputDevice; for primitives this is
|
|
// not possible since we have no OutputDevice, but define the geometry itself.
|
|
|
|
namespace sdr
|
|
{
|
|
namespace contact
|
|
{
|
|
class VCOfSwVirtFlyDrawObj : public ViewContactOfVirtObj
|
|
{
|
|
protected:
|
|
// This method is responsible for creating the graphical visualisation data
|
|
// ONLY based on model data
|
|
virtual drawinglayer::primitive2d::Primitive2DSequence createViewIndependentPrimitive2DSequence() const;
|
|
|
|
public:
|
|
// basic constructor, used from SdrObject.
|
|
VCOfSwVirtFlyDrawObj(SwVirtFlyDrawObj& rObj)
|
|
: ViewContactOfVirtObj(rObj)
|
|
{
|
|
}
|
|
virtual ~VCOfSwVirtFlyDrawObj();
|
|
|
|
// access to SwVirtFlyDrawObj
|
|
SwVirtFlyDrawObj& GetSwVirtFlyDrawObj() const
|
|
{
|
|
return (SwVirtFlyDrawObj&)mrObject;
|
|
}
|
|
};
|
|
} // end of namespace contact
|
|
} // end of namespace sdr
|
|
|
|
namespace sdr
|
|
{
|
|
namespace contact
|
|
{
|
|
drawinglayer::primitive2d::Primitive2DSequence VCOfSwVirtFlyDrawObj::createViewIndependentPrimitive2DSequence() const
|
|
{
|
|
drawinglayer::primitive2d::Primitive2DSequence xRetval;
|
|
const SdrObject& rReferencedObject = GetSwVirtFlyDrawObj().GetReferencedObj();
|
|
|
|
if(rReferencedObject.ISA(SwFlyDrawObj))
|
|
{
|
|
// create an own specialized primitive which is used as repaint callpoint and HitTest
|
|
// for HitTest processor (see primitive implementation above)
|
|
const basegfx::B2DRange aOuterRange(GetSwVirtFlyDrawObj().getOuterBound());
|
|
|
|
if(!aOuterRange.isEmpty())
|
|
{
|
|
const drawinglayer::primitive2d::Primitive2DReference xPrimitive(
|
|
new drawinglayer::primitive2d::SwVirtFlyDrawObjPrimitive(
|
|
GetSwVirtFlyDrawObj(),
|
|
aOuterRange));
|
|
|
|
xRetval = drawinglayer::primitive2d::Primitive2DSequence(&xPrimitive, 1);
|
|
}
|
|
}
|
|
|
|
return xRetval;
|
|
}
|
|
|
|
VCOfSwVirtFlyDrawObj::~VCOfSwVirtFlyDrawObj()
|
|
{
|
|
}
|
|
} // end of namespace contact
|
|
} // end of namespace sdr
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
basegfx::B2DRange SwVirtFlyDrawObj::getOuterBound() const
|
|
{
|
|
basegfx::B2DRange aOuterRange;
|
|
const SdrObject& rReferencedObject = GetReferencedObj();
|
|
|
|
if(rReferencedObject.ISA(SwFlyDrawObj))
|
|
{
|
|
const SwFlyFrm* pFlyFrame = GetFlyFrm();
|
|
|
|
if(pFlyFrame)
|
|
{
|
|
const Rectangle aOuterRectangle(pFlyFrame->Frm().Pos(), pFlyFrame->Frm().SSize());
|
|
|
|
if(!aOuterRectangle.IsEmpty()
|
|
&& RECT_EMPTY != aOuterRectangle.Right()
|
|
&& RECT_EMPTY != aOuterRectangle.Bottom())
|
|
{
|
|
aOuterRange.expand(basegfx::B2DTuple(aOuterRectangle.Left(), aOuterRectangle.Top()));
|
|
aOuterRange.expand(basegfx::B2DTuple(aOuterRectangle.Right(), aOuterRectangle.Bottom()));
|
|
}
|
|
}
|
|
}
|
|
|
|
return aOuterRange;
|
|
}
|
|
|
|
basegfx::B2DRange SwVirtFlyDrawObj::getInnerBound() const
|
|
{
|
|
basegfx::B2DRange aInnerRange;
|
|
const SdrObject& rReferencedObject = GetReferencedObj();
|
|
|
|
if(rReferencedObject.ISA(SwFlyDrawObj))
|
|
{
|
|
const SwFlyFrm* pFlyFrame = GetFlyFrm();
|
|
|
|
if(pFlyFrame)
|
|
{
|
|
const Rectangle aInnerRectangle(pFlyFrame->Frm().Pos() + pFlyFrame->Prt().Pos(), pFlyFrame->Prt().SSize());
|
|
|
|
if(!aInnerRectangle.IsEmpty()
|
|
&& RECT_EMPTY != aInnerRectangle.Right()
|
|
&& RECT_EMPTY != aInnerRectangle.Bottom())
|
|
{
|
|
aInnerRange.expand(basegfx::B2DTuple(aInnerRectangle.Left(), aInnerRectangle.Top()));
|
|
aInnerRange.expand(basegfx::B2DTuple(aInnerRectangle.Right(), aInnerRectangle.Bottom()));
|
|
}
|
|
}
|
|
}
|
|
|
|
return aInnerRange;
|
|
}
|
|
|
|
sdr::contact::ViewContact* SwVirtFlyDrawObj::CreateObjectSpecificViewContact()
|
|
{
|
|
// need an own ViewContact (VC) to allow creation of a specialized primitive
|
|
// for being able to visualize the FlyFrames in primitive renderers
|
|
return new sdr::contact::VCOfSwVirtFlyDrawObj(*this);
|
|
}
|
|
|
|
SwVirtFlyDrawObj::SwVirtFlyDrawObj(SdrObject& rNew, SwFlyFrm* pFly) :
|
|
SdrVirtObj( rNew ),
|
|
pFlyFrm( pFly )
|
|
{
|
|
//#110094#-1
|
|
// bNotPersistent = bNeedColorRestore = bWriterFlyFrame = TRUE;
|
|
const SvxProtectItem &rP = pFlyFrm->GetFmt()->GetProtect();
|
|
bMovProt = rP.IsPosProtected();
|
|
bSizProt = rP.IsSizeProtected();
|
|
}
|
|
|
|
|
|
__EXPORT SwVirtFlyDrawObj::~SwVirtFlyDrawObj()
|
|
{
|
|
if ( GetPage() ) //Der SdrPage die Verantwortung entziehen.
|
|
GetPage()->RemoveObject( GetOrdNum() );
|
|
}
|
|
|
|
/*************************************************************************
|
|
|*
|
|
|* SwVirtFlyDrawObj::GetFmt()
|
|
|*
|
|
|* Ersterstellung MA 08. Dec. 94
|
|
|* Letzte Aenderung MA 08. Dec. 94
|
|
|*
|
|
*************************************************************************/
|
|
|
|
const SwFrmFmt *SwVirtFlyDrawObj::GetFmt() const
|
|
{
|
|
return GetFlyFrm()->GetFmt();
|
|
}
|
|
|
|
|
|
SwFrmFmt *SwVirtFlyDrawObj::GetFmt()
|
|
{
|
|
return GetFlyFrm()->GetFmt();
|
|
}
|
|
|
|
/*************************************************************************
|
|
|*
|
|
|* SwVirtFlyDrawObj::Paint()
|
|
|*
|
|
|* Ersterstellung MA 20. Dec. 94
|
|
|* Letzte Aenderung MA 18. Dec. 95
|
|
|*
|
|
*************************************************************************/
|
|
|
|
void SwVirtFlyDrawObj::wrap_DoPaintObject() const
|
|
{
|
|
ViewShell* pShell = pFlyFrm->GetShell();
|
|
|
|
// Only paint when we have a current shell and a DrawingLayer paint is in progress.
|
|
// This avcoids evtl. problems with renderers which do processing stuff,
|
|
// but no paints. IsPaintInProgress() depends on SW repaint, so, as long
|
|
// as SW paints self and calls DrawLayer() for Heaven and Hell, this will
|
|
// be correct
|
|
if(pShell && pShell->IsDrawingLayerPaintInProgress())
|
|
{
|
|
sal_Bool bDrawObject(sal_True);
|
|
|
|
if(!SwFlyFrm::IsPaint((SdrObject*)this, pShell))
|
|
{
|
|
bDrawObject = sal_False;
|
|
}
|
|
|
|
if(bDrawObject)
|
|
{
|
|
if(!pFlyFrm->IsFlyInCntFrm())
|
|
{
|
|
// it is also necessary to restore the VCL MapMode from ViewInformation since e.g.
|
|
// the VCL PixelRenderer resets it at the used OutputDevice. Unfortunately, this
|
|
// excludes shears and rotates which are not expressable in MapMode.
|
|
OutputDevice* pOut = pShell->GetOut();
|
|
|
|
pOut->Push(PUSH_MAPMODE);
|
|
pOut->SetMapMode(pShell->getPrePostMapMode());
|
|
|
|
// paint the FlyFrame (use standard VCL-Paint)
|
|
pFlyFrm->Paint(GetFlyFrm()->Frm());
|
|
|
|
pOut->Pop();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/*************************************************************************
|
|
|*
|
|
|* SwVirtFlyDrawObj::TakeObjInfo()
|
|
|*
|
|
|* Ersterstellung MA 03. May. 95
|
|
|* Letzte Aenderung MA 03. May. 95
|
|
|*
|
|
*************************************************************************/
|
|
|
|
void __EXPORT SwVirtFlyDrawObj::TakeObjInfo( SdrObjTransformInfoRec& rInfo ) const
|
|
{
|
|
rInfo.bSelectAllowed = rInfo.bMoveAllowed =
|
|
rInfo.bResizeFreeAllowed = rInfo.bResizePropAllowed = TRUE;
|
|
|
|
rInfo.bRotateFreeAllowed = rInfo.bRotate90Allowed =
|
|
rInfo.bMirrorFreeAllowed = rInfo.bMirror45Allowed =
|
|
rInfo.bMirror90Allowed = rInfo.bShearAllowed =
|
|
rInfo.bCanConvToPath = rInfo.bCanConvToPoly =
|
|
rInfo.bCanConvToPathLineToArea = rInfo.bCanConvToPolyLineToArea = FALSE;
|
|
}
|
|
|
|
|
|
/*************************************************************************
|
|
|*
|
|
|* SwVirtFlyDrawObj::Groessenermittlung
|
|
|*
|
|
|* Ersterstellung MA 12. Jan. 95
|
|
|* Letzte Aenderung MA 10. Nov. 95
|
|
|*
|
|
*************************************************************************/
|
|
|
|
void SwVirtFlyDrawObj::SetRect() const
|
|
{
|
|
if ( GetFlyFrm()->Frm().HasArea() )
|
|
((SwVirtFlyDrawObj*)this)->aOutRect = GetFlyFrm()->Frm().SVRect();
|
|
else
|
|
((SwVirtFlyDrawObj*)this)->aOutRect = Rectangle();
|
|
}
|
|
|
|
|
|
const Rectangle& __EXPORT SwVirtFlyDrawObj::GetCurrentBoundRect() const
|
|
{
|
|
SetRect();
|
|
return aOutRect;
|
|
}
|
|
|
|
|
|
void __EXPORT SwVirtFlyDrawObj::RecalcBoundRect()
|
|
{
|
|
SetRect();
|
|
}
|
|
|
|
|
|
void __EXPORT SwVirtFlyDrawObj::RecalcSnapRect()
|
|
{
|
|
SetRect();
|
|
}
|
|
|
|
|
|
const Rectangle& __EXPORT SwVirtFlyDrawObj::GetSnapRect() const
|
|
{
|
|
SetRect();
|
|
return aOutRect;
|
|
}
|
|
|
|
|
|
void __EXPORT SwVirtFlyDrawObj::SetSnapRect(const Rectangle& )
|
|
{
|
|
Rectangle aTmp( GetLastBoundRect() );
|
|
SetRect();
|
|
SetChanged();
|
|
BroadcastObjectChange();
|
|
if (pUserCall!=NULL)
|
|
pUserCall->Changed(*this, SDRUSERCALL_RESIZE, aTmp);
|
|
}
|
|
|
|
|
|
void __EXPORT SwVirtFlyDrawObj::NbcSetSnapRect(const Rectangle& )
|
|
{
|
|
SetRect();
|
|
}
|
|
|
|
|
|
const Rectangle& __EXPORT SwVirtFlyDrawObj::GetLogicRect() const
|
|
{
|
|
SetRect();
|
|
return aOutRect;
|
|
}
|
|
|
|
|
|
void __EXPORT SwVirtFlyDrawObj::SetLogicRect(const Rectangle& )
|
|
{
|
|
Rectangle aTmp( GetLastBoundRect() );
|
|
SetRect();
|
|
SetChanged();
|
|
BroadcastObjectChange();
|
|
if (pUserCall!=NULL)
|
|
pUserCall->Changed(*this, SDRUSERCALL_RESIZE, aTmp);
|
|
}
|
|
|
|
|
|
void __EXPORT SwVirtFlyDrawObj::NbcSetLogicRect(const Rectangle& )
|
|
{
|
|
SetRect();
|
|
}
|
|
|
|
|
|
::basegfx::B2DPolyPolygon SwVirtFlyDrawObj::TakeXorPoly() const
|
|
{
|
|
const Rectangle aSourceRectangle(GetFlyFrm()->Frm().SVRect());
|
|
const ::basegfx::B2DRange aSourceRange(aSourceRectangle.Left(), aSourceRectangle.Top(), aSourceRectangle.Right(), aSourceRectangle.Bottom());
|
|
::basegfx::B2DPolyPolygon aRetval;
|
|
|
|
aRetval.append(::basegfx::tools::createPolygonFromRect(aSourceRange));
|
|
|
|
return aRetval;
|
|
}
|
|
|
|
/*************************************************************************
|
|
|*
|
|
|* SwVirtFlyDrawObj::Move() und Resize()
|
|
|*
|
|
|* Ersterstellung MA 12. Jan. 95
|
|
|* Letzte Aenderung MA 26. Jul. 96
|
|
|*
|
|
*************************************************************************/
|
|
|
|
void __EXPORT SwVirtFlyDrawObj::NbcMove(const Size& rSiz)
|
|
{
|
|
MoveRect( aOutRect, rSiz );
|
|
const Point aOldPos( GetFlyFrm()->Frm().Pos() );
|
|
const Point aNewPos( aOutRect.TopLeft() );
|
|
const SwRect aFlyRect( aOutRect );
|
|
|
|
//Wenn der Fly eine automatische Ausrichtung hat (rechts oder oben),
|
|
//so soll die Automatik erhalten bleiben
|
|
SwFrmFmt *pFmt = GetFlyFrm()->GetFmt();
|
|
const sal_Int16 eHori = pFmt->GetHoriOrient().GetHoriOrient();
|
|
const sal_Int16 eVert = pFmt->GetVertOrient().GetVertOrient();
|
|
const sal_Int16 eRelHori = pFmt->GetHoriOrient().GetRelationOrient();
|
|
const sal_Int16 eRelVert = pFmt->GetVertOrient().GetRelationOrient();
|
|
//Bei Absatzgebundenen Flys muss ausgehend von der neuen Position ein
|
|
//neuer Anker gesetzt werden. Anker und neue RelPos werden vom Fly selbst
|
|
//berechnet und gesetzt.
|
|
if( GetFlyFrm()->IsFlyAtCntFrm() )
|
|
((SwFlyAtCntFrm*)GetFlyFrm())->SetAbsPos( aNewPos );
|
|
else
|
|
{
|
|
const SwFrmFmt *pTmpFmt = GetFmt();
|
|
const SwFmtVertOrient &rVert = pTmpFmt->GetVertOrient();
|
|
const SwFmtHoriOrient &rHori = pTmpFmt->GetHoriOrient();
|
|
long lXDiff = aNewPos.X() - aOldPos.X();
|
|
if( rHori.IsPosToggle() && text::HoriOrientation::NONE == eHori &&
|
|
!GetFlyFrm()->FindPageFrm()->OnRightPage() )
|
|
lXDiff = -lXDiff;
|
|
|
|
if( GetFlyFrm()->GetAnchorFrm()->IsRightToLeft() &&
|
|
text::HoriOrientation::NONE == eHori )
|
|
lXDiff = -lXDiff;
|
|
|
|
long lYDiff = aNewPos.Y() - aOldPos.Y();
|
|
if( GetFlyFrm()->GetAnchorFrm()->IsVertical() )
|
|
{
|
|
lXDiff -= rVert.GetPos();
|
|
lYDiff += rHori.GetPos();
|
|
}
|
|
else
|
|
{
|
|
lXDiff += rHori.GetPos();
|
|
lYDiff += rVert.GetPos();
|
|
}
|
|
|
|
if( GetFlyFrm()->GetAnchorFrm()->IsRightToLeft() &&
|
|
text::HoriOrientation::NONE != eHori )
|
|
lXDiff = GetFlyFrm()->GetAnchorFrm()->Frm().Width() -
|
|
aFlyRect.Width() - lXDiff;
|
|
|
|
const Point aTmp( lXDiff, lYDiff );
|
|
GetFlyFrm()->ChgRelPos( aTmp );
|
|
}
|
|
|
|
SwAttrSet aSet( pFmt->GetDoc()->GetAttrPool(),
|
|
RES_VERT_ORIENT, RES_HORI_ORIENT );
|
|
SwFmtHoriOrient aHori( pFmt->GetHoriOrient() );
|
|
SwFmtVertOrient aVert( pFmt->GetVertOrient() );
|
|
BOOL bPut = FALSE;
|
|
|
|
if( !GetFlyFrm()->IsFlyLayFrm() &&
|
|
::GetHtmlMode(pFmt->GetDoc()->GetDocShell()) )
|
|
{
|
|
//Im HTML-Modus sind nur automatische Ausrichtungen erlaubt.
|
|
//Einzig einen Snap auf Links/Rechts bzw. Linker-/Rechter-Rand koennen
|
|
//wir versuchen.
|
|
const SwFrm* pAnch = GetFlyFrm()->GetAnchorFrm();
|
|
BOOL bNextLine = FALSE;
|
|
|
|
if( !GetFlyFrm()->IsAutoPos() || text::RelOrientation::PAGE_FRAME != aHori.GetRelationOrient() )
|
|
{
|
|
if( text::RelOrientation::CHAR == eRelHori )
|
|
{
|
|
aHori.SetHoriOrient( text::HoriOrientation::LEFT );
|
|
aHori.SetRelationOrient( text::RelOrientation::CHAR );
|
|
}
|
|
else
|
|
{
|
|
bNextLine = TRUE;
|
|
//Horizontale Ausrichtung:
|
|
const BOOL bLeftFrm =
|
|
aFlyRect.Left() < pAnch->Frm().Left() + pAnch->Prt().Left(),
|
|
bLeftPrt = aFlyRect.Left() + aFlyRect.Width() <
|
|
pAnch->Frm().Left() + pAnch->Prt().Width()/2;
|
|
if ( bLeftFrm || bLeftPrt )
|
|
{
|
|
aHori.SetHoriOrient( text::HoriOrientation::LEFT );
|
|
aHori.SetRelationOrient( bLeftFrm ? text::RelOrientation::FRAME : text::RelOrientation::PRINT_AREA );
|
|
}
|
|
else
|
|
{
|
|
const BOOL bRightFrm = aFlyRect.Left() >
|
|
pAnch->Frm().Left() + pAnch->Prt().Width();
|
|
aHori.SetHoriOrient( text::HoriOrientation::RIGHT );
|
|
aHori.SetRelationOrient( bRightFrm ? text::RelOrientation::FRAME : text::RelOrientation::PRINT_AREA );
|
|
}
|
|
}
|
|
aSet.Put( aHori );
|
|
}
|
|
//Vertikale Ausrichtung bleibt grundsaetzlich schlicht erhalten,
|
|
//nur bei nicht automatischer Ausrichtung wird umgeschaltet.
|
|
BOOL bRelChar = text::RelOrientation::CHAR == eRelVert;
|
|
aVert.SetVertOrient( eVert != text::VertOrientation::NONE ? eVert :
|
|
GetFlyFrm()->IsFlyInCntFrm() ? text::VertOrientation::CHAR_CENTER :
|
|
bRelChar && bNextLine ? text::VertOrientation::CHAR_TOP : text::VertOrientation::TOP );
|
|
if( bRelChar )
|
|
aVert.SetRelationOrient( text::RelOrientation::CHAR );
|
|
else
|
|
aVert.SetRelationOrient( text::RelOrientation::PRINT_AREA );
|
|
aSet.Put( aVert );
|
|
bPut = TRUE;
|
|
}
|
|
|
|
//Automatische Ausrichtungen wollen wir moeglichst nicht verlieren.
|
|
if ( !bPut && bInResize )
|
|
{
|
|
if ( text::HoriOrientation::NONE != eHori )
|
|
{
|
|
aHori.SetHoriOrient( eHori );
|
|
aHori.SetRelationOrient( eRelHori );
|
|
aSet.Put( aHori );
|
|
bPut = TRUE;
|
|
}
|
|
if ( text::VertOrientation::NONE != eVert )
|
|
{
|
|
aVert.SetVertOrient( eVert );
|
|
aVert.SetRelationOrient( eRelVert );
|
|
aSet.Put( aVert );
|
|
bPut = TRUE;
|
|
}
|
|
}
|
|
if ( bPut )
|
|
pFmt->SetFmtAttr( aSet );
|
|
}
|
|
|
|
|
|
void __EXPORT SwVirtFlyDrawObj::NbcResize(const Point& rRef,
|
|
const Fraction& xFact, const Fraction& yFact)
|
|
{
|
|
ResizeRect( aOutRect, rRef, xFact, yFact );
|
|
|
|
const SwFrm* pTmpFrm = GetFlyFrm()->GetAnchorFrm();
|
|
if( !pTmpFrm )
|
|
pTmpFrm = GetFlyFrm();
|
|
const bool bVertX = pTmpFrm->IsVertical();
|
|
|
|
const sal_Bool bRTL = pTmpFrm->IsRightToLeft();
|
|
|
|
const Point aNewPos( bVertX || bRTL ?
|
|
aOutRect.Right() + 1 :
|
|
aOutRect.Left(),
|
|
aOutRect.Top() );
|
|
|
|
Size aSz( aOutRect.Right() - aOutRect.Left() + 1,
|
|
aOutRect.Bottom()- aOutRect.Top() + 1 );
|
|
if( aSz != GetFlyFrm()->Frm().SSize() )
|
|
{
|
|
//Die Breite darf bei Spalten nicht zu schmal werden
|
|
if ( GetFlyFrm()->Lower() && GetFlyFrm()->Lower()->IsColumnFrm() )
|
|
{
|
|
SwBorderAttrAccess aAccess( SwFrm::GetCache(), GetFlyFrm() );
|
|
const SwBorderAttrs &rAttrs = *aAccess.Get();
|
|
long nMin = rAttrs.CalcLeftLine()+rAttrs.CalcRightLine();
|
|
const SwFmtCol& rCol = rAttrs.GetAttrSet().GetCol();
|
|
if ( rCol.GetColumns().Count() > 1 )
|
|
{
|
|
for ( USHORT i = 0; i < rCol.GetColumns().Count(); ++i )
|
|
{
|
|
nMin += rCol.GetColumns()[i]->GetLeft() +
|
|
rCol.GetColumns()[i]->GetRight() +
|
|
MINFLY;
|
|
}
|
|
nMin -= MINFLY;
|
|
}
|
|
aSz.Width() = Max( aSz.Width(), nMin );
|
|
}
|
|
|
|
SwFrmFmt *pFmt = GetFmt();
|
|
const SwFmtFrmSize aOldFrmSz( pFmt->GetFrmSize() );
|
|
GetFlyFrm()->ChgSize( aSz );
|
|
SwFmtFrmSize aFrmSz( pFmt->GetFrmSize() );
|
|
if ( aFrmSz.GetWidthPercent() || aFrmSz.GetHeightPercent() )
|
|
{
|
|
long nRelWidth, nRelHeight;
|
|
const SwFrm *pRel = GetFlyFrm()->IsFlyLayFrm() ?
|
|
GetFlyFrm()->GetAnchorFrm() :
|
|
GetFlyFrm()->GetAnchorFrm()->GetUpper();
|
|
const ViewShell *pSh = GetFlyFrm()->GetShell();
|
|
if ( pSh && pRel->IsBodyFrm() &&
|
|
pFmt->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE) &&
|
|
pSh->VisArea().HasArea() )
|
|
{
|
|
nRelWidth = pSh->GetBrowseWidth();
|
|
nRelHeight = pSh->VisArea().Height();
|
|
const Size aBorder = pSh->GetOut()->PixelToLogic( pSh->GetBrowseBorder() );
|
|
nRelHeight -= 2*aBorder.Height();
|
|
}
|
|
else
|
|
{
|
|
nRelWidth = pRel->Prt().Width();
|
|
nRelHeight = pRel->Prt().Height();
|
|
}
|
|
if ( aFrmSz.GetWidthPercent() && aFrmSz.GetWidthPercent() != 0xFF &&
|
|
aOldFrmSz.GetWidth() != aFrmSz.GetWidth() )
|
|
aFrmSz.SetWidthPercent( BYTE(aSz.Width() * 100L / nRelWidth + 0.5) );
|
|
if ( aFrmSz.GetHeightPercent() && aFrmSz.GetHeightPercent() != 0xFF &&
|
|
aOldFrmSz.GetHeight() != aFrmSz.GetHeight() )
|
|
aFrmSz.SetHeightPercent( BYTE(aSz.Height() * 100L / nRelHeight + 0.5) );
|
|
pFmt->GetDoc()->SetAttr( aFrmSz, *pFmt );
|
|
}
|
|
}
|
|
|
|
//Position kann auch veraendert sein!
|
|
const Point aOldPos( bVertX || bRTL ?
|
|
GetFlyFrm()->Frm().TopRight() :
|
|
GetFlyFrm()->Frm().Pos() );
|
|
|
|
if ( aNewPos != aOldPos )
|
|
{
|
|
//Kann sich durch das ChgSize veraendert haben!
|
|
if( bVertX || bRTL )
|
|
{
|
|
if( aOutRect.TopRight() != aNewPos )
|
|
{
|
|
SwTwips nDeltaX = aNewPos.X() - aOutRect.Right();
|
|
SwTwips nDeltaY = aNewPos.Y() - aOutRect.Top();
|
|
MoveRect( aOutRect, Size( nDeltaX, nDeltaY ) );
|
|
}
|
|
}
|
|
else if ( aOutRect.TopLeft() != aNewPos )
|
|
aOutRect.SetPos( aNewPos );
|
|
bInResize = TRUE;
|
|
NbcMove( Size( 0, 0 ) );
|
|
bInResize = FALSE;
|
|
}
|
|
}
|
|
|
|
|
|
void __EXPORT SwVirtFlyDrawObj::Move(const Size& rSiz)
|
|
{
|
|
NbcMove( rSiz );
|
|
SetChanged();
|
|
GetFmt()->GetDoc()->SetNoDrawUndoObj( TRUE );
|
|
}
|
|
|
|
|
|
void __EXPORT SwVirtFlyDrawObj::Resize(const Point& rRef,
|
|
const Fraction& xFact, const Fraction& yFact)
|
|
{
|
|
NbcResize( rRef, xFact, yFact );
|
|
SetChanged();
|
|
GetFmt()->GetDoc()->SetNoDrawUndoObj( TRUE );
|
|
}
|
|
|
|
|
|
Pointer __EXPORT SwVirtFlyDrawObj::GetMacroPointer(
|
|
const SdrObjMacroHitRec& ) const
|
|
{
|
|
return Pointer( POINTER_REFHAND );
|
|
}
|
|
|
|
|
|
FASTBOOL __EXPORT SwVirtFlyDrawObj::HasMacro() const
|
|
{
|
|
const SwFmtURL &rURL = pFlyFrm->GetFmt()->GetURL();
|
|
return rURL.GetMap() || rURL.GetURL().Len();
|
|
}
|
|
|
|
|
|
SdrObject* SwVirtFlyDrawObj::CheckMacroHit( const SdrObjMacroHitRec& rRec ) const
|
|
{
|
|
const SwFmtURL &rURL = pFlyFrm->GetFmt()->GetURL();
|
|
if( rURL.GetMap() || rURL.GetURL().Len() )
|
|
{
|
|
SwRect aRect;
|
|
if ( pFlyFrm->Lower() && pFlyFrm->Lower()->IsNoTxtFrm() )
|
|
{
|
|
aRect = pFlyFrm->Prt();
|
|
aRect += pFlyFrm->Frm().Pos();
|
|
}
|
|
else
|
|
aRect = pFlyFrm->Frm();
|
|
|
|
if( aRect.IsInside( rRec.aPos ) )
|
|
{
|
|
SwRect aActRect( aRect );
|
|
Size aActSz( aRect.SSize() );
|
|
aRect.Pos().X() += rRec.nTol;
|
|
aRect.Pos().Y() += rRec.nTol;
|
|
aRect.SSize().Height()-= 2 * rRec.nTol;
|
|
aRect.SSize().Width() -= 2 * rRec.nTol;
|
|
|
|
if( aRect.IsInside( rRec.aPos ) )
|
|
{
|
|
if( !rURL.GetMap() ||
|
|
pFlyFrm->GetFmt()->GetIMapObject( rRec.aPos, pFlyFrm ))
|
|
return (SdrObject*)this;
|
|
|
|
return 0;
|
|
}
|
|
}
|
|
}
|
|
return SdrObject::CheckMacroHit( rRec );
|
|
}
|
|
|
|
bool SwVirtFlyDrawObj::supportsFullDrag() const
|
|
{
|
|
// call parent
|
|
return SdrVirtObj::supportsFullDrag();
|
|
}
|
|
|
|
SdrObject* SwVirtFlyDrawObj::getFullDragClone() const
|
|
{
|
|
// call parent
|
|
return SdrVirtObj::getFullDragClone();
|
|
}
|
|
|
|
// eof
|