Commits

Armin Le Grand  committed 101ee2b

aw080: cleanups, corrections to selection, bezier editor, etc.

  • Participants
  • Parent commits 01486c2

Comments (0)

Files changed (62)

File chart2/source/controller/main/SelectionHelper.cxx

                 return false;
         }
 
-		const basegfx::B2DPoint aB2DPos(pSubObj->getObjectRange(rHdlList.GetView()->getAsSdrView()).getCenter());
+		const basegfx::B2DPoint aB2DPos(pSubObj->getObjectRange(rHdlList.GetViewFromSdrHdlList().getAsSdrView()).getCenter());
 	    new SdrHdl(rHdlList, pSubObj, HDL_POLY, aB2DPos);
     }
     return true;

File reportdesign/source/ui/report/ReportSection.cxx

                     if ( m_xSection.is() && (static_cast<sal_uInt32>(aRet.getHeight() + aRet.Top()) > m_xSection->getHeight()) )
 			            m_xSection->setHeight(aRet.getHeight() + aRet.Top());
 
-                    pObject->ActionChanged/*formallyinvalidateobjectrange*/(); // TTTT: needed?
+                    pObject->ActionChanged();
                 }
                 pBase->StartListening();
             }

File sd/source/ui/animations/motionpathtag.cxx

 		{
 			if( !mrView.IsFrameHandles() )
 			{
-				SdrHdlList aTemp( rHandlerList.GetView() );
+				SdrHdlList aTemp( rHandlerList.GetViewFromSdrHdlList() );
 				mpPathObj->AddToHdlList( aTemp );
 				sal_uInt32 nHandle;
 				for( nHandle = 0; nHandle < aTemp.GetHdlCount(); ++nHandle )

File sd/source/ui/func/fucon3d.cxx

 	p3DObj->SetMergedItemSet(aAttr);
 	
 	// make object interactive at once
-	pScene->ActionChanged/*formallyinvalidateobjectrange*/();
+	pScene->ActionChanged();
 
 	// Take care of restrictions for the rectangle
 	basegfx::B2DRange aRange(rRange);

File sd/source/ui/func/fusel.cxx

             /******************************************************************
             * Klebepunkt selektieren
             ******************************************************************/
-            if (!rMEvt.IsShift())
+            if(!rMEvt.IsShift())
+			{
                 mpView->MarkPoints(0, true); // unmarkall
+			}
 
-            if ( ! rMEvt.IsRight())
+            if(!rMEvt.IsRight())
+			{
                 mpView->BegMarkPoints(aMDPos);
+			}
         }
         else if (eHit == SDRHIT_MARKEDOBJECT && !rMEvt.IsShift() && !rMEvt.IsMod2())
         {
                 if (!rMEvt.IsShift())
                 {
                     mpView->MarkPoints(0, true); // unmarkall
+					mpView->forceSelectionChange();
                     pHdl = mpView->PickHandle(aMDPos);
                 }
                 else
                     }
                 }
 
-                if (pHdl)
-                {
-                    mpView->MarkPoint(*pHdl);
-                    if ( ! rMEvt.IsRight())
-                        mpView->BegDragObj(aMDPos, pHdl, fDrgLog);
-                }
+				if(pHdl)
+				{
+					// mark this point. If it was not yet marked, this will change
+					// the selection (seel below)
+					mpView->MarkPoint(*pHdl);
+
+					if(!rMEvt.IsRight())
+					{
+						// here HAVE to check for pending selection change; if this
+						// is the case, pHdl WILL be deleted on the next execution of this
+						// pending change and a new one will be created. Need to force
+						// that change to get the new created pHdl to not continue
+						// processing on the dying one
+						if(mpView->isSelectionChangePending())
+						{
+							mpView->forceSelectionChange();
+							pHdl = mpView->PickHandle(aMDPos);
+						}
+
+						if(pHdl)
+						{
+							mpView->BegDragObj(aMDPos, pHdl, fDrgLog);
+						}
+						else
+						{
+							OSL_ENSURE(false, "OOps, got no new SdrHdl after after selection change (!)");
+						}
+					}
+				}
             }
 			else
 			{
                 /**************************************************************
                 * Klebepunkt selektieren
                 **************************************************************/
-                if (!rMEvt.IsShift())
+                if(!rMEvt.IsShift())
+				{
                     mpView->MarkPoints(0, true); // unmarkall
+				}
 
-                if ( ! rMEvt.IsRight())
+                if(!rMEvt.IsRight())
+				{
                     mpView->BegMarkPoints(aMDPos);
+				}
             }
             else
             {
                 /**************************************************************
                 * Objekt selektieren
                 **************************************************************/
-                if ( ! rMEvt.IsRight())
+                if(!rMEvt.IsRight())
+				{
                     mpView->BegMarkObj(aMDPos);
+				}
             }
 
             ForcePointer(&rMEvt);

File sd/source/ui/func/futext.cxx

 				if( pTextObj )
 				{
 					OutlinerParaObject* pOPO = pTextObj->GetOutlinerParaObject();
+					const basegfx::B2DPoint aLogicPos(mpWindow->GetInverseViewTransformation() * basegfx::B2DPoint(rMEvt.GetPosPixel().X(), rMEvt.GetPosPixel().Y()));
+
 					if( ( pOPO && pOPO->IsVertical() ) || (nSlotId == SID_ATTR_CHAR_VERTICAL) || (nSlotId == SID_TEXT_FITTOSIZE_VERTICAL) )
 						pOutl->SetVertical( true );
 
 					if( pTextObj->getTextCount() > 1 )
 					{
-						const basegfx::B2DPoint aLogicPos(mpWindow->GetInverseViewTransformation() * basegfx::B2DPoint(rMEvt.GetPosPixel().X(), rMEvt.GetPosPixel().Y()));
 						pTextObj->setActiveText( pTextObj->CheckTextHit(aLogicPos) );
 					}
 
 					if (mpView->SdrBeginTextEdit(pTextObj, mpWindow, sal_True, pOutl) && mxTextObj->GetObjInventor() == SdrInventor)
 					{
+						OutlinerView* pOLV = mpView->GetTextEditOutlinerView();
+						OSL_ENSURE(pOLV, "TextEdit start, but no OLV");
+						
 						bFirstObjCreated = true;
 						DeleteDefaultText();
+						nSdrObjKind = mxTextObj->GetObjIdentifier();
+						SdrViewEvent aVEvt;
+						Point aHitMousePosition(rMEvt.GetPosPixel());
+						
+						if(pTextObj->isRotatedOrSheared() || pTextObj->isMirrored())
+						{
+							// need to adapt HitMousePosition. Activated TextEdit is centered at
+							// fully transformed text, but without shear, rotate and mirror, see
+							// getScaledCenteredTextRange() and it's usages. Without that adaption
+							// the MouseButtonDown would not set the text cursor to the correct
+							// position.
+							basegfx::B2DHomMatrix aTransform(pTextObj->getSdrObjectTransformation());
 
-						OutlinerView* pOLV = mpView->GetTextEditOutlinerView();
+							// Candidate is aLogicPos, MousePos in logic coordinates. Transform
+							// to unified object coordinates
+							aTransform.invert();
 
-						nSdrObjKind = mxTextObj->GetObjIdentifier();
+							// move to object center
+							aTransform.translate(-0.5, -0.5);
 
-						SdrViewEvent aVEvt;
-						SdrHitKind eHit = mpView->PickAnything(rMEvt, SDRMOUSEBUTTONDOWN, aVEvt);
+							// scale by absolute object size, leave out mirroring
+							aTransform.scale(basegfx::absolute(pTextObj->getSdrObjectScale()));
+
+							// translate new center to curent object center
+							aTransform.translate(pTextObj->getSdrObjectTransformation() * basegfx::B2DPoint(0.5, 0.5));
+
+							// go back to discrete (pixel) coordinates
+							aTransform *= mpWindow->GetViewTransformation();
+
+							// apply and use
+							const basegfx::B2DPoint aCorrected(aTransform * aLogicPos);
+							aHitMousePosition = Point(basegfx::fround(aCorrected.getX()), basegfx::fround(aCorrected.getY()));
+						}
+
+						const MouseEvent aAdaptedEvent(aHitMousePosition, rMEvt.GetClicks(), rMEvt.GetMode(), rMEvt.GetButtons(), rMEvt.GetModifier());
+						const SdrHitKind eHit(mpView->PickAnything(aAdaptedEvent, SDRMOUSEBUTTONDOWN, aVEvt));
 
 						if (eHit == SDRHIT_TEXTEDIT)
 						{
 								nSlotId == SID_TEXTEDIT ||
 								!bQuickDrag)
 							{
-								pOLV->MouseButtonDown(rMEvt);
-								pOLV->MouseMove(rMEvt);
-								pOLV->MouseButtonUp(rMEvt);
+								pOLV->MouseButtonDown(aAdaptedEvent);
+								pOLV->MouseMove(aAdaptedEvent);
+								pOLV->MouseButtonUp(aAdaptedEvent);
 							}
 
 							if (mpViewShell->GetFrameView()->IsQuickEdit() && bQuickDrag && GetTextObj()->GetOutlinerParaObject())
 							{
-								pOLV->MouseButtonDown(rMEvt);
+								pOLV->MouseButtonDown(aAdaptedEvent);
 							}
 						}
 						else

File sd/source/ui/view/viewoverlaymanager.cxx

 void ImageButtonHdl::onMouseEnter(const MouseEvent& rMEvt)
 {
 	int nHighlightId = 0;
+	OutputDevice* pDev = mrHdlList.GetViewFromSdrHdlList().GetFirstOutputDevice();
+	if( pDev == 0 )
+		pDev = Application::GetDefaultDevice();
 
-	if( mrHdlList.GetView())
+	Point aMDPos( rMEvt.GetPosPixel() );
+	const basegfx::B2DPoint aPosPixel(pDev->GetViewTransformation() * getPosition());
+	const Point aPointPixel(basegfx::fround(aPosPixel.getX()), basegfx::fround(aPosPixel.getY()));
+	aMDPos -= aPointPixel;
+
+	nHighlightId += aMDPos.X() > maImageSize.Width() ? 1 : 0;
+	nHighlightId += aMDPos.Y() > maImageSize.Height() ? 2 : 0;
+
+	if( mnHighlightId != nHighlightId )
 	{
-		OutputDevice* pDev = mrHdlList.GetView()->GetFirstOutputDevice();
-		if( pDev == 0 )
-			pDev = Application::GetDefaultDevice();
+		HideTip();
 
-		Point aMDPos( rMEvt.GetPosPixel() );
-		const basegfx::B2DPoint aPosPixel(pDev->GetViewTransformation() * getPosition());
-		const Point aPointPixel(basegfx::fround(aPosPixel.getX()), basegfx::fround(aPosPixel.getY()));
-		aMDPos -= aPointPixel;
+		mnHighlightId = nHighlightId;
+		SdResId aResId( gButtonToolTips[mnHighlightId] );
+		aResId.SetRT( RSC_STRING );
 
-		nHighlightId += aMDPos.X() > maImageSize.Width() ? 1 : 0;
-		nHighlightId += aMDPos.Y() > maImageSize.Height() ? 2 : 0;
-
-		if( mnHighlightId != nHighlightId )
-		{
-			HideTip();
-
-			mnHighlightId = nHighlightId;
-			SdResId aResId( gButtonToolTips[mnHighlightId] );
-			aResId.SetRT( RSC_STRING );
-
-			String aHelpText( aResId );
-			Rectangle aScreenRect( aPointPixel, maImageSize );
-			mnTip = Help::ShowTip( static_cast< ::Window* >( mrHdlList.GetView()->GetFirstOutputDevice() ), aScreenRect, aHelpText, 0 ) ;
-			Touch();
-		}
+		String aHelpText( aResId );
+		Rectangle aScreenRect( aPointPixel, maImageSize );
+		mnTip = Help::ShowTip( static_cast< ::Window* >( mrHdlList.GetViewFromSdrHdlList().GetFirstOutputDevice() ), aScreenRect, aHelpText, 0 ) ;
+		Touch();
 	}
 }
 

File svx/inc/svx/scene3d.hxx

 	/// create a copy, evtl. with a different target model (if given)
 	virtual SdrObject* CloneSdrObject(SdrModel* pTargetModel = 0) const;
 
-//	E3dScene();
 	E3dScene(
 		SdrModel& rSdrModel, 
 		const E3dDefaultAttributes& rDefault);
 	virtual SdrObjList* getChildrenOfSdrObject() const;
 
 	// react on model change
-//	virtual void handleModelChange(SdrModel* pOldModel, SdrModel* pNewModel);
 	virtual void handlePageChange(SdrPage* pOldPage, SdrPage* pNewPage);
 
 	virtual void StructureChanged();
-//	virtual void invalidateObjectRange();
 	virtual void SetBoundVolInvalid();
 
     virtual void SetLayer(SdrLayerID nLayer);

File svx/inc/svx/sdr/properties/attributeproperties.hxx

 			// Move properties to a new ItemPool.
 			virtual void MoveToItemPool(SfxItemPool* pSrcPool, SfxItemPool* pDestPool, SdrModel* pNewModel = 0L);
 
-			// Set new model.
-//			virtual void handleModelChange(SdrModel* pOldModel, SdrModel* pNewModel);
-//			virtual void SetModel(SdrModel* pOldModel, SdrModel* pNewModel);
-
 			// force all attributes which come from styles to hard attributes
 			// to be able to live without the style.
 			virtual void ForceStyleToHardAttributes();

File svx/inc/svx/sdr/properties/properties.hxx

 			// overloaded to do it for hierarchical objects like e.g. groups.
 			virtual void MoveToItemPool(SfxItemPool* pSrcPool, SfxItemPool* pDestPool, SdrModel* pNewModel = 0L);
 
-			// Set new model.
-//			virtual void handleModelChange(SdrModel* pOldModel, SdrModel* pNewModel);
-//			virtual void SetModel(SdrModel* pOldModel, SdrModel* pNewModel);
-
 			// force all attributes which come from styles to hard attributes
 			// to be able to live without the style.
 			virtual void ForceStyleToHardAttributes();

File svx/inc/svx/sdrselection.hxx

 			virtual void Timeout();
 
 		public:
+			/// constructor
 			Selection(SdrView& rSdrView);
 
+			/// test if selection change is pending
+			bool isSelectionChangePending() const;
+
 			/// force evtl. delayed SelectionChange to be broadcasted
 			void forceSelectionChange();
 

File svx/inc/svx/svdhdl.hxx

 
 protected:
 	sal_uInt32				mnFocusIndex;
-	SdrMarkView*			mpView;
+	SdrMarkView&			mrView;
 	SdrHdlContainerType		maList;
 	sal_uInt16				mnHdlSize;
 
 	bool					mbFineHandles : 1;
 
 public:
-	SdrHdlList(SdrMarkView* pV); // TTTT: use reference?
+	SdrHdlList(SdrMarkView& rV); // TTTT: use reference?
 	~SdrHdlList();
 	
 	void Clear();
 	void ResetFocusHdl();
 
 	// Access to View
-	SdrMarkView* GetView() const { return mpView; }
+	SdrMarkView& GetViewFromSdrHdlList() const { return mrView; }
 
 	// Sortierung: 1.Level Erst Refpunkt-Handles, dann normale Handles, dann Glue, dann User, dann Plushandles
 	//             2.Level PageView (Pointer)

File svx/inc/svx/svdmrkv.hxx

 	void SetMoveOutside(bool bOn);
 	bool IsMoveOutside() const;
 
-	// possibility to force SelectionChange
-	void forceSelectionChange() { maSelection.forceSelectionChange(); }
-
 	// #i71538# make constructors of SdrView sub-components protected to avoid incomplete incarnations which may get casted to SdrView
     SdrMarkView(SdrModel& rModel1, OutputDevice* pOut = 0);
 	virtual ~SdrMarkView();
 	////////////////////////////////////////////////////////////////////////////////////////////////////
 	// new interface to selection, a direct wrapper to sdr::selection::Selection
 	
-	// tests, checks and const accesses to selection
+	// selection const accesses
 	SdrObjectVector getSelectedSdrObjectVectorFromSdrMarkView() const { return maSelection.getVector(); }
 	SdrObject* getSelectedIfSingle() const { return maSelection.getSingle(); }
 	bool areSdrObjectsSelected() const { return !maSelection.empty(); }
     sal_uInt32 getSelectedSdrObjectCount() const { return maSelection.size(); }
 	bool isSdrObjectSelected(const SdrObject& rObject) const { return maSelection.isSdrObject(rObject); }
 
-	// selection changers
+	// selection const accesses: possibility to ask for pending SelectionChange and to force it
+	bool isSelectionChangePending() const { return maSelection.isSelectionChangePending(); }
+	void forceSelectionChange() { maSelection.forceSelectionChange(); }
+
+	// selection const accesses: point selection
+	sdr::selection::Indices getSelectedPointsForSelectedSdrObject(const SdrObject& rObject) const { return maSelection.getIndicesForSdrObject(rObject, true); }
+	String getSelectedPointsDescription() const { return maSelection.getIndexDescription(true); }
+	bool arePointsSelected() const { return maSelection.hasIndices(true); }
+
+	// selection const accesses: gluepoint selection
+	sdr::selection::Indices getSelectedGluesForSelectedSdrObject(const SdrObject& rObject) const { return maSelection.getIndicesForSdrObject(rObject, false); }
+	String getSelectedGluesDescription() const { return maSelection.getIndexDescription(false); }
+	bool areGluesSelected() const { return maSelection.hasIndices(false); }
+
+	// selection changers. These will trigger a delayedSelectionChanged() which will
+	// on forceSelectionChange() or timer event trigger handleSelectionChange(). This will
+	// recreate e.g. the SdrHdl. This means that ALL code which works with SdrHdl and selection
+	// has to take care of working woith valid SdrHdl when changing the selection (!)
 	void removeSdrObjectFromSelection(const SdrObject& rObject) { maSelection.removeSdrObject(rObject); }
 	void addSdrObjectToSelection(const SdrObject& rObject) { maSelection.addSdrObject(rObject); }
 	void setSdrObjectSelection(const SdrObjectVector& rSdrObjectVector) { maSelection.setSdrObjects(rSdrObjectVector); }
 	void clearSdrObjectSelection() { maSelection.clear(); }
 
-	// point selection
-	sdr::selection::Indices getSelectedPointsForSelectedSdrObject(const SdrObject& rObject) const { return maSelection.getIndicesForSdrObject(rObject, true); }
+	// selection changers for points
 	void setSelectedPointsForSelectedSdrObject(const SdrObject& rObject, const sdr::selection::Indices& rNew) { maSelection.setIndicesForSdrObject(rObject, rNew, true); }
 	void clearSelectedPointsForSelectedSdrObject(const SdrObject& rObject) { maSelection.clearIndicesForSdrObject(rObject, true); }
-	String getSelectedPointsDescription() const { return maSelection.getIndexDescription(true); }
-	bool arePointsSelected() const { return maSelection.hasIndices(true); }
 
-	// gluepoint selection
-	sdr::selection::Indices getSelectedGluesForSelectedSdrObject(const SdrObject& rObject) const { return maSelection.getIndicesForSdrObject(rObject, false); }
+	// selection changers for glues
 	void setSelectedGluesForSelectedSdrObject(const SdrObject& rObject, const sdr::selection::Indices& rNew) { maSelection.setIndicesForSdrObject(rObject, rNew, false); }
 	void clearSelectedGluesForSelectedSdrObject(const SdrObject& rObject) { maSelection.clearIndicesForSdrObject(rObject, false); }
-	String getSelectedGluesDescription() const { return maSelection.getIndexDescription(false); }
-	bool areGluesSelected() const { return maSelection.hasIndices(false); }
 
 	// react on selection changes
 	virtual void handleSelectionChange();

File svx/inc/svx/svdoashp.hxx

 	virtual SdrObject* CloneSdrObject(SdrModel* pTargetModel = 0) const;
 
 	// react on model/page change
-//	virtual void handleModelChange(SdrModel* pOldModel, SdrModel* pNewModel);
 	virtual void handlePageChange(SdrPage* pOldPage, SdrPage* pNewPage);
 
 	bool UseNoFillStyle() const;
 	virtual basegfx::B2DPolyPolygon TakeCreatePoly( const SdrDragStat& rDrag) const;
 
 	virtual basegfx::B2DPolyPolygon TakeXorPoly() const;
-//	virtual basegfx::B2DPolyPolygon TakeContour() const;
-
-	//using SdrTextObj::SetOutlinerParaObject;
-	//virtual void SetOutlinerParaObject(OutlinerParaObject* pTextObject);
-
 	virtual SdrObject* DoConvertToPolygonObject(bool bBezier) const;
 	virtual SdrObjGeoData *NewGeoData() const;
 	virtual void          SaveGeoData(SdrObjGeoData &rGeo) const;

File svx/inc/svx/svdobj.hxx

 	// Moechte man ein geschlossenes Polygon, so muss man es explizit schliessen.
 	virtual basegfx::B2DPolyPolygon TakeXorPoly() const;
 
-	// Die Kontur fuer TextToContour
-//	virtual basegfx::B2DPolyPolygon TakeContour() const;
-
 	// Ueber GetHdlCount gibt ein Objekt die Anzahl seiner Handles preis.
 	// Im Normalfall werden dies 8 sein, bei einer Strecke 2. Bei Polygonobjekten
 	// (Polygon,Spline,Bezier) kann die Handleanzahl wesentlich groesser werden.
 	// Ein Objekt, das bei HasSpacialDrag() true liefert muss diese Methoden
 	// zur Verfuegung stellen (inkl. FillHdlList).
 	virtual sal_uInt32 GetPlusHdlCount(const SdrHdl& rHdl) const;
-	virtual SdrHdl* GetPlusHdl(SdrHdlList& rHdlList, const SdrObject& rSdrObject, const SdrHdl& rHdl, sal_uInt32 nPlNum) const;
+	virtual void GetPlusHdl(SdrHdlList& rHdlList, const SdrObject& rSdrObject, const SdrHdl& rHdl, sal_uInt32 nPlNum) const;
 	virtual void AddToHdlList(SdrHdlList& rHdlList) const;
 
 	// Die Standardtransformationen (Move,Resize,Rotate,Mirror,Shear) werden von der

File svx/inc/svx/svdograf.hxx

 	virtual SdrObject* CloneSdrObject(SdrModel* pTargetModel = 0) const;
 
 	// react on model/page change
-//	virtual void handleModelChange(SdrModel* pOldModel, SdrModel* pNewModel);
 	virtual void handlePageChange(SdrPage* pOldPage, SdrPage* pNewPage);
 
-//	SdrGrafObj();
 	SdrGrafObj(
 		SdrModel& rSdrModel, 
 		const Graphic& rGrf, 

File svx/inc/svx/svdopath.hxx

 	virtual void TakeObjNamePlural(String& rName) const;
 	virtual basegfx::B2DPolyPolygon TakeXorPoly() const;
 	virtual sal_uInt32 GetPlusHdlCount(const SdrHdl& rHdl) const;
-	virtual SdrHdl* GetPlusHdl(SdrHdlList& rHdlList, const SdrObject& rSdrObject, const SdrHdl& rHdl, sal_uInt32 nPlNum) const;
+	virtual void GetPlusHdl(SdrHdlList& rHdlList, const SdrObject& rSdrObject, const SdrHdl& rHdl, sal_uInt32 nPlNum) const;
 	virtual void AddToHdlList(SdrHdlList& rHdlList) const;
 
     // special drag methods

File svx/inc/svx/svdotable.hxx

 		sal_Int32 nRows = 1);
 	virtual bool IsClosedObj() const;
 
-	// react on model change
-//	virtual void handleModelChange(SdrModel* pOldModel, SdrModel* pNewModel);
-
 	// table stuff
 	SdrTableObj* CloneRange( const CellPos& rStartPos, const CellPos& rEndPos );
 	void DistributeColumns( sal_Int32 nFirstColumn, sal_Int32 nLastColumn );
 	virtual void TakeObjNameSingul(String& rName) const;
 	virtual void TakeObjNamePlural(String& rName) const;
 	virtual basegfx::B2DPolyPolygon TakeXorPoly() const;
-//	virtual basegfx::B2DPolyPolygon TakeContour() const;
-
 	virtual void AdjustToMaxRange( const basegfx::B2DRange& rMaxRange, bool bShrinkOnly = false );
 
 	virtual sal_uInt32 GetSnapPointCount() const;

File svx/inc/svx/svdotext.hxx

 	basegfx::B2DPoint		maTextEditOffset;
 
 public:
+	// exclusively for SW to force a offset for the activated TextEdit when
+	// not the real but the virtual object is edited. May be removed when SW
+	// will be changed to use a better concept that the SdrVirtObjs
 	const basegfx::B2DPoint& GetTextEditOffset() const { return maTextEditOffset; }
 	void SetTextEditOffset(const basegfx::B2DPoint& rNew) { maTextEditOffset = rNew; }
 
 	SdrObject* ImpConvertAddText(SdrObject* pObj, bool bBezier) const;
 	void ImpSetTextStyleSheetListeners();
 	void ImpSetCharStretching(SdrOutliner& rOutliner, const basegfx::B2DRange& rTextRange, const basegfx::B2DRange& rAnchorRange) const;
-	void ImpJustifyRect(Rectangle& rRect) const;
 	void ImpSetTextEditParams() const;
 	void SetTextSizeDirty() { bTextSizeDirty=true; }
 
-	// rAnchorRect ist InOut-Parameter!
-//	void ImpSetContourPolygon(SdrOutliner& rOutliner) const;
-
 	void SetEdgeRadius(sal_Int32 nRad);
 	bool SetMinTextFrameHeight(sal_Int32 nHgt);
 	bool SetMinTextFrameWidth(sal_Int32 nWdt);
 	virtual void TakeObjNameSingul(String& rName) const;
 	virtual void TakeObjNamePlural(String& rName) const;
 	virtual basegfx::B2DPolyPolygon TakeXorPoly() const;
-//	virtual basegfx::B2DPolyPolygon TakeContour() const;
-
 	virtual sal_uInt32 GetSnapPointCount() const;
 	virtual basegfx::B2DPoint GetSnapPoint(sal_uInt32 i) const;
 	
 	virtual void EndTextEdit(SdrOutliner& rOutl);
 	virtual sal_uInt16 GetOutlinerViewAnchorMode() const;
 
-	void StartTextAnimation(OutputDevice* pOutDev, const Point& rOffset, sal_Int32 nExtraData=0);
-	void StopTextAnimation(OutputDevice* pOutDev=0, sal_Int32 nExtraData=0);
-
 	virtual void SetOutlinerParaObject(OutlinerParaObject* pTextObject);
 	void SetOutlinerParaObjectForText( OutlinerParaObject* pTextObject, SdrText* pText );
 	virtual OutlinerParaObject* GetOutlinerParaObject() const;
 	// ItemChange(), PostItemChange() and ItemSetChanged() calls.
 	void SetObjectItemNoBroadcast(const SfxPoolItem& rItem);
 
-public:
 	//////////////////////////////////////////////////////////////////////////////
 	// text primitive decomposition helpers
 	void impDecomposeContourTextPrimitive(

File svx/source/customshapes/EnhancedCustomShape3d.cxx

 			rCamera.SetFocalLength( 1.0 );
 			rCamera.SetProjection( eProjectionType );
 			pScene->SetCamera( rCamera );
-			pScene->ActionChanged/*formallyinvalidateobjectrange*/();
+			pScene->ActionChanged();
 
 			double fOriginX, fOriginY;
 			GetOrigin( rGeometryItem, fOriginX, fOriginY );

File svx/source/customshapes/EnhancedCustomShapeEngine.cxx

 //			}
 
 			pRenderedShape->SetStyleSheet( pSdrObjCustomShape->GetStyleSheet(), sal_True );
-//			pRenderedShape->ActionChanged/*formallyinvalidateobjectrange*/();
 		}
 
 		if ( mbForceGroupWithText )

File svx/source/dialog/dlgctl3d.cxx

 	mpScene->SetB3DTransform(aRotation * mpScene->GetB3DTransform());
 
 	// invalidate SnapRects of objects
-	mpScene->ActionChanged/*formallyinvalidateobjectrange*/();
+	mpScene->ActionChanged();
 
 	SfxItemSet aSet( mpScene->GetObjectItemPool(),
 		XATTR_LINESTYLE, XATTR_LINESTYLE,
 	}
 
 	// invalidate SnapRects of objects
-	mpScene->ActionChanged/*formallyinvalidateobjectrange*/();
+	mpScene->ActionChanged();
 }
 
 void Svx3DLightControl::ConstructLightObjects()

File svx/source/engine3d/dragmt3d.cxx

 			// Neuberechnung beim Setzen der Marker zu erzwingen
 			if(bDoInvalidate)
 			{
-				pE3dObj->ActionChanged/*formallyinvalidateobjectrange*/();
+				pE3dObj->ActionChanged();
 			}
 
 			if(!mbMoveFull)

File svx/source/engine3d/scene3d.cxx

 			((sdr::properties::E3dSceneProperties&)GetProperties()).SetSceneItemsFromCamera();
 			InvalidateBoundVolume();
 			RebuildLists();
-			// ActionChanged/*formallyinvalidateobjectrange*/();
 			ImpCleanup3DDepthMapper();
 			GetViewContact().ActionChanged();
 		}
 	aCamera = rNewCamera;
 	((sdr::properties::E3dSceneProperties&)GetProperties()).SetSceneItemsFromCamera();
 
-	ActionChanged/*formallyinvalidateobjectrange*/();
+	ActionChanged();
 
 	// Neue Kamera aus alter fuellen
 	Camera3D& rCam = (Camera3D&)GetCamera();
 void E3dScene::StructureChanged()
 {
 	E3dObject::StructureChanged();
-	ActionChanged/*formallyinvalidateobjectrange*/();
+	ActionChanged();
 
 	// #110988#
 	ImpCleanup3DDepthMapper();
 
 void E3dScene::Notify(SfxBroadcaster &rBC, const SfxHint  &rHint)
 {
-	ActionChanged/*formallyinvalidateobjectrange*/();
+	ActionChanged();
 	E3dObject::Notify(rBC, rHint);
 }
 
 	}
 }
 
-//void E3dScene::handleModelChange(SdrModel* pOldModel, SdrModel* pNewModel)
-//{
-//	if(pOldModel != pNewModel)
-//	{
-//		// call parent
-//		E3dObject::handleModelChange(pOldModel, pNewModel);
-//
-//		for(sal_uInt32 a(0); a < GetObjCount(); a++)
-//		{
-//			E3dObject* pCandidate = dynamic_cast< E3dObject* >(GetObj(a));
-//
-//			if(pCandidate)
-//			{
-//				pCandidate->handleModelChange(pOldModel, pNewModel);
-//			}
-//			else
-//			{
-//				OSL_ENSURE(false, "E3dScene::handleModelChange invalid object list (!)");
-//			}
-//		}
-//	}
-//}
-
-/*************************************************************************
-|*
-|* liefere die Sublist, aber nur dann, wenn darin Objekte enthalten sind !
-|*
-\************************************************************************/
-
-//SdrObjList* E3dScene::GetSubList() const
-//{
-//	return &(const_cast< E3dObjList& >(maSubList));
-//}
-
 /*************************************************************************
 |*
 |* SnapRect berechnen

File svx/source/engine3d/view3d.cxx

         pScene->SetCamera (aCamera);
 
 		// SnapRects der Objekte ungueltig
-		//pScene->ActionChanged/*formallyinvalidateobjectrange*/();
 		InsertObjectAtView(*pScene);
 
 		// SnapRects der Objekte ungueltig
-		pScene->ActionChanged/*formallyinvalidateobjectrange*/();
+		pScene->ActionChanged();
     }
 }
 

File svx/source/form/fmobj.cxx

 }
 
 //------------------------------------------------------------------
-//void FmFormObj::handleModelChange(SdrModel* pOldModel, SdrModel* pNewModel)
-//{
-//	SdrUnoObj::handleModelChange(pOldModel, pNewModel);
-//
-//	impl_checkRefDevice_nothrow();
-//}
-
-//------------------------------------------------------------------
 FmFormObj* FmFormObj::GetFormObject( SdrObject* _pSdrObject )
 {
     FmFormObj* pFormObject = dynamic_cast< FmFormObj* >( _pSdrObject );

File svx/source/form/fmpage.cxx

 }
 
 //------------------------------------------------------------------
-//void FmFormPage::handleModelChange(SdrModel* pOldModel, SdrModel* pNewModel)
-//{
-//    RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFormPage::SetModel" );
-//    /* #35055# */
-//    // we want to call the super's "SetModel" method even if the model is the
-//    // same, in case code somewhere in the system depends on it.  But our code
-//    // doesn't, so get the old model to do a check.
-//	if(pOldModel != pNewModel)
-//	{
-//		// call parent
-//		SdrPage::handleModelChange(pOldModel, pNewModel);
-//
-//		/* #35055# */
-//		FmFormModel* pDrawModel = dynamic_cast< FmFormModel* >(pNewModel);
-//
-//		if ( m_pImpl && pDrawModel )
-//		{
-//			try
-//			{
-//				Reference< XNameContainer > xForms( m_pImpl->getForms( false ) );
-//				if ( xForms.is() )
-//				{
-//					// we want to keep the current collection, just reset the model
-//					// with which it's associated.
-//					Reference< XChild > xAsChild( xForms, UNO_QUERY );
-//					if ( xAsChild.is() )
-//					{
-//						SfxObjectShell* pObjShell = pDrawModel->GetObjectShell();
-//						if ( pObjShell )
-//							xAsChild->setParent( pObjShell->GetModel() );
-//					}
-//				}
-//			}
-//			catch( ::com::sun::star::uno::Exception ex )
-//			{
-//				OSL_ENSURE( sal_False, "UNO Exception caught resetting model for m_pImpl (FmFormPageImpl) in FmFormPage::SetModel" );
-//			}
-//		}
-//	}
-//}
-
-//------------------------------------------------------------------
 void FmFormPage::InsertObjectToSdrObjList(SdrObject* pObj, sal_uInt32 nPos)
 {
     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFormPage::InsertObjectToSdrObjList" );

File svx/source/inc/fmobj.hxx

             const ::com::sun::star::uno::Sequence< ::com::sun::star::script::ScriptEventDescriptor >& rEvts );
     void ClearObjEnv();
 
-	// react on model/page change
-//	virtual void handleModelChange(SdrModel* pOldModel, SdrModel* pNewModel);
+	// react on page change
 	virtual void handlePageChange(SdrPage* pOldPage, SdrPage* pNewPage);
 
 	virtual sal_uInt32 GetObjInventor() const;

File svx/source/sdr/primitive2d/sdrdecompositiontools.cxx

 
 					// scale back to unit polygon
 					aScaledUnitPolyPolygon.transform(basegfx::tools::createScaleB2DHomMatrix(
-						0.0 != aScale.getX() ? 1.0 / aScale.getX() : 1.0,
-						0.0 != aScale.getY() ? 1.0 / aScale.getY() : 1.0));
+						0.0 != aScale.getX() ? 1.0 / fabs(aScale.getX()) : 1.0,
+						0.0 != aScale.getY() ? 1.0 / fabs(aScale.getY()) : 1.0));
 
 					// create with unit polygon
 					pNew = new SdrContourTextPrimitive2D(

File svx/source/sdr/properties/attributeproperties.cxx

 				}
 
 				SdrObject& rObj = GetSdrObject();
-				rObj.ActionChanged/*formallyinvalidateobjectrange*/();
+				rObj.ActionChanged();
 			}
 
 			mpStyleSheet = 0L;
 			// own modifications
 			SdrObject& rObj = GetSdrObject();
 
-			//rObj.ActionChanged/*formallyinvalidateobjectrange*/();
 			rObj.SetChanged();
 		}
 
 			ImpAddStyleSheet(pNewStyleSheet, bDontRemoveHardAttr);
 
 			SdrObject& rObj = GetSdrObject();
-			rObj.ActionChanged/*formallyinvalidateobjectrange*/();
+			rObj.ActionChanged();
 		}
 
 		SfxStyleSheet* AttributeProperties::GetStyleSheet() const
 				mpItemSet = pDestItemSet;
 
 				// set necessary changes like in RemoveStyleSheet()
-				GetSdrObject().ActionChanged/*formallyinvalidateobjectrange*/();
+				GetSdrObject().ActionChanged();
 
 				mpStyleSheet = NULL;
 			}
 
 				// Get old BoundRect. Do this after the style change is handled
 				// in the ItemSet parts because GetBoundRect() may calculate a new
-				//rObj.ActionChanged/*formallyinvalidateobjectrange*/invalidateObjectRange();
 				rObj.SetChanged();
 
 				bHintUsed = sal_True;

File svx/source/sdr/properties/properties.cxx

 			// Overload where an ItemSet is implemented.
 		}
 
-//		void BaseProperties::handleModelChange(SdrModel* /*pOldModel*/, SdrModel* /*pNewModel*/)
-//		{
-//			// Set new model. Default implementation does nothing.
-//			// Overload where an ItemSet is implemented.
-//		}
-
 		void BaseProperties::ForceStyleToHardAttributes()
 		{
 			// force all attributes which come from styles to hard attributes

File svx/source/svdraw/sdrselection.cxx

 			Start();
 		}
 
+		bool Selection::isSelectionChangePending() const
+		{
+			return IsActive();
+		}
+
 		void Selection::forceSelectionChange()
 		{
 			if(IsActive())

File svx/source/svdraw/sdrtexthelpers.cxx

 
 		if(aRetval.count())
 		{
-			// the outliner needs the contour polygon scaled and aligned to
-			// top-left of the object
+			// for editing the polygon needs to be free from mirror, shear and rotation
 			basegfx::B2DHomMatrix aMatrix(rText.getSdrObjectTransformation());
+
+			// remove full object transform
 			aMatrix.invert();
+
+			// move to object center
+			aMatrix.translate(-0.5, -0.5);
+
+			// apply absolute object scale
 			aMatrix.scale(basegfx::absolute(rText.getSdrObjectScale()));
 
+			// move to current object center
+			aMatrix.translate(rText.getSdrObjectTransformation() * basegfx::B2DPoint(0.5, 0.5));
+
+			// apply
 			aRetval.transform(aMatrix);
 		}
 	}

File svx/source/svdraw/svdedxv.cxx

 					else 
 					{
                         pTextEditOutliner->SetControlWord(pTextEditOutliner->GetControlWord() &~EE_CNTRL_AUTOPAGESIZE);
-						const basegfx::B2DPolyPolygon aOutline(getAlignedTextContourPolyPolygon(*pTextObj));
-						pTextEditOutliner->SetPolygon(aOutline);
+						basegfx::B2DPolyPolygon aContourOutline(getAlignedTextContourPolyPolygon(*pTextObj));
+						aContourOutline.transform(basegfx::tools::createTranslateB2DHomMatrix(-aContourOutline.getB2DRange().getMinimum()));
+						pTextEditOutliner->SetPolygon(aContourOutline);
                     }
                     
 					for(sal_uInt32 nOV(0); nOV < nOutlViewAnz; nOV++) 

File svx/source/svdraw/svdhdl.cxx

 	// first throw away old one
 	GetRidOfIAObject();
 	
-	if(mrHdlList.GetView())
+	SdrPageView* pPageView = mrHdlList.GetViewFromSdrHdlList().GetSdrPageView();
+
+	if(pPageView)
 	{
-		SdrPageView* pPageView = mrHdlList.GetView()->GetSdrPageView();
+		for(sal_uInt32 a(0); a < pPageView->PageWindowCount(); a++)
+		{
+			const SdrPageWindow& rPageWindow = *pPageView->GetPageWindow(a);
 
-		if(pPageView)
-		{
-			for(sal_uInt32 a(0); a < pPageView->PageWindowCount(); a++)
+			if(rPageWindow.GetPaintWindow().OutputToWindow())
 			{
-				const SdrPageWindow& rPageWindow = *pPageView->GetPageWindow(a);
+				::sdr::overlay::OverlayManager* pOverlayManager = rPageWindow.GetOverlayManager();
 
-				if(rPageWindow.GetPaintWindow().OutputToWindow())
+				if(pOverlayManager)
 				{
-					::sdr::overlay::OverlayManager* pOverlayManager = rPageWindow.GetOverlayManager();
-
-					if(pOverlayManager)
-					{
-						CreateB2dIAObject(*pOverlayManager);
-					}
+					CreateB2dIAObject(*pOverlayManager);
 				}
 			}
 		}
 	Start();
 }
 
-SdrHdlList::SdrHdlList(SdrMarkView* pV)
+SdrHdlList::SdrHdlList(SdrMarkView& rV)
 :	boost::noncopyable(),
 	Timer(),
 	mnFocusIndex(CONTAINER_ENTRY_NOTFOUND), 
-	mpView(pV),
+	mrView(rV),
 	maList(),
 	mnHdlSize(3),
 	mbRotateShear(false),
 
 void SdrHdlBezWgt::CreateB2dIAObject(::sdr::overlay::OverlayManager& rOverlayManager)
 {
+	// call parent, create control point handle
+	SdrHdl::CreateB2dIAObject(rOverlayManager);
+
+	// create striped line part
 	if(pHdl1 && !pHdl1->getPosition().equal(maPosition))
 	{
 		::sdr::overlay::OverlayObject* pNewOverlayObject = new 

File svx/source/svdraw/svdmrkv.cxx

 	maRef1(),
 	maRef2(),
 	maLastCrookCenter(),
-	maViewHandleList(this),
+	maViewHandleList(*this),
 	maSelection(*getAsSdrView()),
 	maMarkedPointRange(),
 	maMarkedGluePointRange(),

File svx/source/svdraw/svdoashp.cxx

 	}
 }
 
-//void SdrObjCustomShape::handleModelChange(SdrModel* pOldModel, SdrModel* pNewModel)
-//{
-//	if(pOldModel != pNewModel)
-//	{
-//		// call parent
-//		SdrTextObj::handleModelChange(pOldModel, pNewModel);
-//
-//		mXRenderedCustomShape.clear();
-//	}
-//}
-
 sal_uInt16 SdrObjCustomShape::GetObjIdentifier() const
 {
 	return sal_uInt16(OBJ_CUSTOMSHAPE);
 		{
 			rDrag.SetEndDragChangesGeoAndAttributes(true);
 		    DragMoveCustomShapeHdl( rDrag.GetNow(), pHdl->GetPointNum(), this );
-		    //ActionChanged/*formallyinvalidateobjectrange*/();
 		    InvalidateRenderGeometry();
 		    SetChanged();
             break;
 		aIter++;
 	}
 
-	ActionChanged/*formallyinvalidateobjectrange*/();
+	ActionChanged();
 }
 
 bool SdrObjCustomShape::MovCreate(SdrDragStat& rStat)
 		InvalidateRenderGeometry();
 	}
 	DragCreateObject( rStat );
-	ActionChanged/*formallyinvalidateobjectrange*/();
+	ActionChanged();
 	
 	return true;
 }
 		// Textrahmen neu berechnen
 		AdjustTextFrameWidthAndHeight();
 	}
-	ActionChanged/*formallyinvalidateobjectrange*/();
+	ActionChanged();
 	return ( eCmd == SDRCREATE_FORCEEND || rStat.GetPointAnz() >= 2 );
 }
 
 	rTextRange = basegfx::B2DRange(aTextPos, aTextPos + aTextSiz);
 }
 
-//void SdrObjCustomShape::SetOutlinerParaObject(OutlinerParaObject* pTextObject)
-//{
-//	SdrTextObj::SetOutlinerParaObject( pTextObject );
-//
-//	//ActionChanged/*formallyinvalidateobjectrange*/();
-//	// SetChanged();
-//	//InvalidateRenderGeometry();
-//}
-
 void SdrObjCustomShape::SetChanged()
 {
 	// call parent
 	return GetLineGeometry( (SdrObjCustomShape*)this, false );
 }
 
-//basegfx::B2DPolyPolygon SdrObjCustomShape::TakeContour() const
-//{
-//	const SdrObject* pSdrObject = GetSdrObjectFromCustomShape();
-//	if ( pSdrObject )
-//		return pSdrObject->TakeContour();
-//	return basegfx::B2DPolyPolygon();
-//}
-
 SdrObject* SdrObjCustomShape::DoConvertToPolygonObject(bool bBezier) const
 {
 	// #i37011#
 		{
 			// invalidating rectangles by invalidateObjectRange is not sufficient,
 			// AdjustTextFrameWidthAndHeight() also has to be made
-			ActionChanged/*formallyinvalidateobjectrange*/();
+			ActionChanged();
 			AdjustTextFrameWidthAndHeight();
 		}
 	}

File svx/source/svdraw/svdoattr.cxx

 {
 }
 
-//void SdrAttrObj::handleModelChange(SdrModel* pOldModel, SdrModel* pNewModel)
-//{
-//	if(pOldModel != pNewModel)
-//	{
-//		// test for correct pool in ItemSet; move to new pool if necessary
-//		if(pNewModel && &GetObjectItemPool() != &pNewModel->GetItemPool())
-//		{
-//			MigrateItemPool(&GetObjectItemPool(), &pNewModel->GetItemPool(), pNewModel);
-//		}
-//
-//		// call parent
-//		SdrObject::handleModelChange(pOldModel, pNewModel);
-//
-//		// modify properties
-//		GetProperties().handleModelChange(pOldModel, pNewModel);
-//	}
-//}
-
 void __EXPORT SdrAttrObj::Notify(SfxBroadcaster& /*rBC*/, const SfxHint& rHint)
 {
 	const SfxSimpleHint *pSimple = dynamic_cast< const SfxSimpleHint* >(&rHint);
 	if(bDataChg)
 	{
         const SdrObjectChangeBroadcaster aSdrObjectChangeBroadcaster(*this, HINT_OBJCHG_ATTR);
-		//ActionChanged/*formallyinvalidateobjectrange*/();
 		SetChanged();
 	}
 }

File svx/source/svdraw/svdobj.cxx

 
 #define _USE_MATH_DEFINES
 #include <math.h>
-//#include <vcl/metaact.hxx>   // fuer TakeContour
 #include <vcl/cvtsvm.hxx>
 #include <tools/line.hxx>
 #include <tools/bigint.hxx>
 	return basegfx::B2DPolyPolygon(basegfx::tools::createPolygonFromRect(getObjectRange(0)));
 }
 
-//basegfx::B2DPolyPolygon SdrObject::TakeContour() const
-//{
-//	basegfx::B2DPolyPolygon aRetval;
-//
-//    // create cloned object without text, but with XLINE_SOLID,
-//    // COL_BLACK as line color and XFILL_NONE
-//	SdrObject* pClone = CloneSdrObject();
-//
-//    if(pClone)
-//    {
-//        const SdrTextObj* pTextObj = dynamic_cast< const SdrTextObj* >(this);
-//
-//        if(pTextObj)
-//	    {
-//            // no text and no text animation
-//		    pClone->SetMergedItem(SdrTextAniKindItem(SDRTEXTANI_NONE));
-//            pClone->SetOutlinerParaObject(0);
-//	    }
-//
-//        const SdrEdgeObj* pEdgeObj = dynamic_cast< const SdrEdgeObj* >(this);
-//
-//        if(pEdgeObj)
-//	    {
-//            // create connections if connector, will be cleaned up when
-//            // deleting the connector again
-//		    SdrObject* pLeft = pEdgeObj->GetConnectedNode(true);
-//		    SdrObject* pRight = pEdgeObj->GetConnectedNode(false);
-//	        SdrEdgeObj* pEdgeClone = dynamic_cast< SdrEdgeObj* >(pClone);
-//			OSL_ENSURE(pEdgeClone, "OOps, clone of SdrEdgeObj is no SdrEdgeObj (!)");
-//
-//		    if(pLeft)
-//		    {
-//			    pEdgeClone->ConnectToNode(true, pLeft);
-//		    }
-//
-//		    if(pRight)
-//		    {
-//			    pEdgeClone->ConnectToNode(false, pRight);
-//		    }
-//	    }
-//
-//	    SfxItemSet aNewSet(pClone->GetObjectItemPool());
-//
-//        // #i101980# ignore LineWidth; that's what the old implementation
-//        // did. With linewidth, the result may be huge due to fat/thick
-//        // line decompositions
-//    	aNewSet.Put(XLineWidthItem(0));
-//
-//        // solid black lines and no fill
-//        aNewSet.Put(XLineStyleItem(XLINE_SOLID));
-//	    aNewSet.Put(XLineColorItem(String(), Color(COL_BLACK)));
-//	    aNewSet.Put(XFillStyleItem(XFILL_NONE));
-//	    
-//		pClone->SetMergedItemSet(aNewSet);
-//
-//        // get sequence from clone
-//	    const sdr::contact::ViewContact& rVC(pClone->GetViewContact());
-//	    const drawinglayer::primitive2d::Primitive2DSequence xSequence(rVC.getViewIndependentPrimitive2DSequence());
-//
-//	    if(xSequence.hasElements())
-//	    {
-//		    // use neutral ViewInformation
-//		    const drawinglayer::geometry::ViewInformation2D aViewInformation2D;
-//
-//		    // create extractor, process and get result
-//		    drawinglayer::processor2d::ContourExtractor2D aExtractor(aViewInformation2D);
-//		    aExtractor.process(xSequence);
-//            const std::vector< basegfx::B2DPolyPolygon >& rResult(aExtractor.getExtractedContour());
-//            const sal_uInt32 nSize(rResult.size());
-//
-//            // when count is one, it is implied that the object has only it's normal
-//            // contour anyways and TakeCountour() is to return an empty PolyPolygon
-//            // (see old implementation for historical reasons)
-//            if(nSize > 1)
-//            {
-//                // the topology for contour is correctly a vector of PolyPolygons; for
-//                // historical reasons cut it back to a single PolyPolygon here
-//                for(sal_uInt32 a(0); a < nSize; a++)
-//                {
-//                    aRetval.append(rResult[a]);
-//                }
-//            }
-//        }
-//
-//    	delete pClone;
-//    }
-//
-//	return aRetval;
-//}
-
 void SdrObject::AddToHdlList(SdrHdlList& rHdlList) const
 {
 	const basegfx::B2DHomMatrix& rObjTrans = getSdrObjectTransformation();
 	return 0;
 }
 
-SdrHdl* SdrObject::GetPlusHdl(SdrHdlList& /*rHdlList*/, const SdrObject& /*rSdrObject*/, const SdrHdl& /*rHdl*/, sal_uInt32 /*nPlNum*/) const
+void SdrObject::GetPlusHdl(SdrHdlList& /*rHdlList*/, const SdrObject& /*rSdrObject*/, const SdrHdl& /*rHdl*/, sal_uInt32 /*nPlNum*/) const
 {
-	return 0;
 }
 
 bool SdrObject::hasSpecialDrag() const
 
 void SdrObject::RestGeoData(const SdrObjGeoData& rGeo)
 {
-	ActionChanged/*formallyinvalidateobjectrange*/();
-
-	//maObjectRange = rGeo.maObjectRange;
+	ActionChanged();
+
 	maSdrObjectTransformation.setB2DHomMatrix(rGeo.maSdrObjectTransformation);
 	maObjectAnchor = rGeo.maObjectAnchor;
 	mbMoveProtect = rGeo.mbMoveProtect;
         const SdrObjectChangeBroadcaster aSdrObjectChangeBroadcaster(*this);
 		maSdrObjectTransformation.setB2DHomMatrix(rTransformation);
 		SetChanged();
-		//ActionChanged/*formallyinvalidateobjectrange*/();
 	}
 }
 

File svx/source/svdraw/svdocapt.cxx

 	ImpGetCaptParams(aPara);
 	Rectangle aRect(sdr::legacy::GetSnapRect(*this));
 	ImpCalcTail(aPara, aTailPoly, aRect);
-	ActionChanged/*formallyinvalidateobjectrange*/();
+	ActionChanged();
 }
 
 // #i35971#
 	return basegfx::B2DPoint(0.0, 0.0);
 }
 
-//void SdrCaptionObj::handleModelChange(SdrModel* pOldModel, SdrModel* pNewModel)
-//{
-//	if(pOldModel != pNewModel)
-//	{
-//		// call parent
-//		SdrRectObj::handleModelChange(pOldModel, pNewModel);
-//
-//		ImpRecalcTail();
-//	}
-//}
-
 void SdrCaptionObj::Notify(SfxBroadcaster& rBC, const SfxHint& rHint)
 {
 	SdrRectObj::Notify(rBC,rHint);

File svx/source/svdraw/svdocirc.cxx

         const SdrObjectChangeBroadcaster aSdrObjectChangeBroadcaster(*this);
 		mfStartAngle = fNew;
 		SetChanged();
-		//ActionChanged/*formallyinvalidateobjectrange*/();
 	}
 }
 
         const SdrObjectChangeBroadcaster aSdrObjectChangeBroadcaster(*this);
 		mfEndAngle = fNew;
 		SetChanged();
-		//ActionChanged/*formallyinvalidateobjectrange*/();
 	}
 }
 
         const SdrObjectChangeBroadcaster aSdrObjectChangeBroadcaster(*this);
 		meCircleKind = eNew;
 		SetChanged();
-		//ActionChanged/*formallyinvalidateobjectrange*/();
 	}
 }
 

File svx/source/svdraw/svdoedge.cxx

         {   // use local scope to trigger locally
             const SdrObjectChangeBroadcaster aSdrObjectChangeBroadcaster(*this);
 
-		    //ActionChanged/*formallyinvalidateobjectrange*/();
 		    // #110094#-14 if (!bEdgeTrackDirty) SendRepaintBroadcast();
 		    *pEdgeTrack=ImpCalcEdgeTrack(*pEdgeTrack,aCon1,aCon2,&aEdgeInfo);
 		    ImpSetEdgeInfoToAttr(); // Die Werte aus aEdgeInfo in den Pool kopieren
 		rDragStat.GetSdrViewFromSdrDragStat().SetConnectMarker(aCon2);
 
 	}
-	ActionChanged/*formallyinvalidateobjectrange*/();
+	ActionChanged();
 	ConnectToNode(false,aCon2.pObj);
 	*pEdgeTrack=ImpCalcEdgeTrack(*pEdgeTrack,aCon1,aCon2,&aEdgeInfo);
 	bEdgeTrackDirty=false;
 		rDragStat.GetSdrViewFromSdrDragStat().HideConnectMarker();
 		ImpSetEdgeInfoToAttr(); // Die Werte aus aEdgeInfo in den Pool kopieren
 	}
-	ActionChanged/*formallyinvalidateobjectrange*/();
+	ActionChanged();
 	
 	return bOk;
 }
 	if (1L == i) 
 		(*pEdgeTrack)[nAnz-1]=aOldPoint;
 	SetEdgeTrackDirty();
-	ActionChanged/*formallyinvalidateobjectrange*/();
+	ActionChanged();
 }
 
 SdrEdgeObjGeoData::SdrEdgeObjGeoData()
 	rConn1.SetConnectorId( (sal_uInt16)nIndex );
 
 	SetChanged();
-	//ActionChanged/*formallyinvalidateobjectrange*/();
 	ImpRecalcEdgeTrack();
 	// bEdgeTrackDirty=true;
 }

File svx/source/svdraw/svdograf.cxx

 	aGrafInfo.SetDrawMode( ( (SdrGrafModeItem&) rSet.Get( SDRATTR_GRAFMODE ) ).GetValue() );
 	aGrafInfo.SetCrop( rCrop.GetLeft(), rCrop.GetTop(), rCrop.GetRight(), rCrop.GetBottom() );
 
-	ActionChanged/*formallyinvalidateobjectrange*/();
+	ActionChanged();
 }
 
 // -----------------------------------------------------------------------------

File svx/source/svdraw/svdogrp.cxx

 
 	// needed object updates
 	SetChanged();
-	//ActionChanged/*formallyinvalidateobjectrange*/();
 
 	// reset local transformation to allow on-demand recalculation
 	maSdrObjectTransformation.setB2DHomMatrix(basegfx::B2DHomMatrix());

File svx/source/svdraw/svdomeas.cxx

 { 
     bTextDirty = true; 
     SetTextSizeDirty(); 
-    
-//    if(!maObjectRange.isEmpty()) 
-//    { 
-        ActionChanged/*formallyinvalidateobjectrange*/(); 
-//    } 
+    ActionChanged(); 
 }
 
 void SdrMeasureObj::TakeRepresentation( XubString& rStr, SdrMeasureFieldKind eMeasureFieldKind ) const
 		}
 	} // switch
 
-    //ActionChanged/*formallyinvalidateobjectrange*/();
 	SetChanged();
 
     return true;
 		aPt1-=Point(basegfx::fround(rStat.GetNow().getX()), basegfx::fround(rStat.GetNow().getY()));
 	}
 	SetTextDirty();
-	ActionChanged/*formallyinvalidateobjectrange*/();
+	ActionChanged();
 	
 	return true;
 }
 bool SdrMeasureObj::EndCreate(SdrDragStat& rStat, SdrCreateCmd eCmd)
 {
 	SetTextDirty();
-	ActionChanged/*formallyinvalidateobjectrange*/();
+	ActionChanged();
 
 	return (eCmd==SDRCREATE_FORCEEND || rStat.GetPointAnz()>=2);
 }
 		aPt2 = Point(basegfx::fround(rPnt.getX()), basegfx::fround(rPnt.getY()));
 	}
 
-	ActionChanged/*formallyinvalidateobjectrange*/();
+	ActionChanged();
 	SetTextDirty();
 }
 

File svx/source/svdraw/svdoole2.cxx

 
 // -----------------------------------------------------------------------------
 
-//void SdrOle2Obj::handleModelChange(SdrModel* pOldModel, SdrModel* pNewModel)
-//{
-//	if(pOldModel != pNewModel)
-//	{
-//		::comphelper::IEmbeddedHelper* pDestPers = pNewModel ? pNewModel->GetPersist() : 0;
-//		::comphelper::IEmbeddedHelper* pSrcPers = pOldModel ? pOldModel->GetPersist() : 0;
-//
-//		// assignment to model has changed
-//		DBG_ASSERT( pSrcPers || !mpImpl->mbConnected, "Connected object without a model?!" );
-//		DBG_ASSERT( pDestPers, "The destination model must have a persistence! Please submit an issue!" );
-//		DBG_ASSERT( pDestPers != pSrcPers, "The source and the destination models should have different persistences! Problems are possible!" );
-//
-//		// this is a bug if the target model has no persistence
-//		// no error handling is possible so just do nothing in this method
-//		if ( pNewModel && !pDestPers )
-//		{
-//			return;
-//		}
-//
-//		RemoveListeners_Impl();
-//
-//		if( pDestPers && pSrcPers && !IsEmptyPresObj() )
-//		{
-//			try
-//			{
-//				// move the objects' storage; ObjectRef remains the same, but PersistName may change
-//				::rtl::OUString aTmp;
-//				comphelper::EmbeddedObjectContainer& rContainer = pSrcPers->getEmbeddedObjectContainer();
-//				uno::Reference < embed::XEmbeddedObject > xObj = rContainer.GetEmbeddedObject( mpImpl->aPersistName );
-//				DBG_ASSERT( !xObjRef.is() || xObjRef.GetObject() == xObj, "Wrong object identity!" );
-//				if ( xObj.is() )
-//				{
-//					pDestPers->getEmbeddedObjectContainer().MoveEmbeddedObject( rContainer, xObj, aTmp );
-//					mpImpl->aPersistName = aTmp;
-//					xObjRef.AssignToContainer( &pDestPers->getEmbeddedObjectContainer(), aTmp );
-//				}
-//				DBG_ASSERT( aTmp.getLength(), "Copying embedded object failed!" );
-//			}
-//			catch( ::com::sun::star::uno::Exception& e )
-//			{
-//				(void)e;
-//				DBG_ERROR(
-//					(OString("SdrOle2Obj::SetModel(), "
-//							"exception caught: ") +
-//					rtl::OUStringToOString(
-//						comphelper::anyToString( cppu::getCaughtException() ),
-//						RTL_TEXTENCODING_UTF8 )).getStr() );
-//			}
-//		}
-//
-//		// call parent
-//		SdrRectObj::handleModelChange(pOldModel, pNewModel);
-//
-//		// #i43086#
-//		// #i85304 redo the change for charts for the above bugfix, as #i43086# does not ocur anymore
-//		//so maybe the ImpSetVisAreaSize call can be removed here completely
-//		//Nevertheless I leave it in for other objects as I am not sure about the side effects when removing now
-//		if( pNewModel && !pNewModel->isLocked() && !IsChart() )
-//		{
-//			ImpSetVisAreaSize();
-//		}
-//
-//		if( pDestPers && !IsEmptyPresObj() )
-//		{
-//			if ( !pSrcPers || IsEmptyPresObj() )
-//			{
-//				// object wasn't connected, now it should
-//				Connect_Impl();
-//			}
-//			else
-//			{
-//				Reconnect_Impl();
-//			}
-//		}
-//
-//		AddListeners_Impl();
-//
-//		// moved here from old SdrPage::SetInserted since SdrOage insert/remove
-//		// triggers handleModelChange anyways, also over the SdrObject hierarchy
-//		if(pNewModel)
-//		{
-//			Connect();
-//		}
-//		else
-//		{
-//			Disconnect();
-//		}
-//	}
-//}
-
-// -----------------------------------------------------------------------------
-
 void SdrOle2Obj::handlePageChange(SdrPage* pOldPage, SdrPage* pNewPage)
 {
 	if(pOldPage != pNewPage)

File svx/source/svdraw/svdopath.cxx

 	return nCnt;
 }
 
-SdrHdl* SdrPathObj::GetPlusHdl(SdrHdlList& rHdlList, const SdrObject& rSdrObject, const SdrHdl& rHdl, sal_uInt32 nPlusNum) const
+void SdrPathObj::GetPlusHdl(SdrHdlList& rHdlList, const SdrObject& rSdrObject, const SdrHdl& rHdl, sal_uInt32 nPlusNum) const
 {
 	// keep old stuff to be able to keep old SdrHdl stuff, too
 	const XPolyPolygon aOldPathPolygon(getB2DPolyPolygonInObjectCoordinates());
 			}
 		}
 	}
-	return pHdl;
 }
 
 ////////////////////////////////////////////////////////////////////////////////////////////////////
 		maPathPolygon = rPathPoly;
 		ImpForceKind();
 		impAdaptTransformation(); 
-		//ActionChanged/*formallyinvalidateobjectrange*/();
 		SetChanged();
 	}
 }
     const SdrObjectChangeBroadcaster aSdrObjectChangeBroadcaster(*this);
 	ImpSetClosed(!IsClosed()); // neuen ObjKind setzen
 	ImpForceKind(); // wg. Line->Poly->PolyLine statt Line->Poly->Line
-	//ActionChanged/*formallyinvalidateobjectrange*/();
 	SetChanged();
 }
 

File svx/source/svdraw/svdotext.cxx

 	return eRet;
 } // defaults: TOP fuer Textrahmen, CENTER fuer beschriftete Grafikobjekte
 
-void SdrTextObj::ImpJustifyRect(Rectangle& rRect) const
-{
-	if (!rRect.IsEmpty()) {
-		rRect.Justify();
-		if (rRect.Left()==rRect.Right()) rRect.Right()++;
-		if (rRect.Top()==rRect.Bottom()) rRect.Bottom()++;
-	}
-}
-
 void SdrTextObj::TakeObjInfo(SdrObjTransformInfoRec& rInfo) const
 {
 	bool bNoTextFrame = !IsTextFrame();
 	}
 }
 
-//void SdrTextObj::handleModelChange(SdrModel* pOldModel, SdrModel* pNewModel)
-//{
-//	if(pOldModel != pNewModel)
-//	{
-//		const bool bLinked(IsLinkedText());
-//
-//		if(bLinked)
-//		{
-//			ImpLinkAbmeldung();
-//		}
-//
-//		// call parent
-//		SdrAttrObj::handleModelChange(pOldModel, pNewModel);
-//
-//		if(pNewModel && pOldModel)
-//		{
-//			SetTextSizeDirty();
-//		}
-//
-//		const sal_Int32 nCount(getTextCount());
-//
-//		for(sal_Int32 nText(0); nText < nCount; nText++)
-//		{
-//			SdrText* pText = getText(nText);
-//
-//			if(pText)
-//			{
-//				pText->handleModelChange(pOldModel, pNewModel);
-//			}
-//		}
-//
-//		if(bLinked)
-//		{
-//			ImpLinkAnmeldung();
-//		}
-//	}
-//}
-
 void SdrTextObj::SetEdgeRadius(sal_Int32 nRad)
 {
 	if(nRad != GetEdgeRadius())
 	return false;
 }
 
-//void SdrTextObj::ImpSetContourPolygon(SdrOutliner& rOutliner) const
-//{
-//	basegfx::B2DPolyPolygon aXorPolyPolygon(TakeXorPoly());
-//	basegfx::B2DHomMatrix aMatrix;
-//
-//	if(isRotated() || isSheared() || isMirroredX() || isMirroredY())
-//	{
-//		// create a transformation which takes out rotation/shear/mirror
-//		// and centers at current object
-//		// TTTT: needed getUnifiedTextRange before, check
-//		aMatrix = getSdrObjectTransformation();
-//		aMatrix.invert();
-//		aMatrix *= basegfx::tools::createScaleTranslateB2DHomMatrix(
-//			basegfx::absolute(getSdrObjectScale()),
-//			getSdrObjectTranslate());
-//
-//		const basegfx::B2DPoint aOldCenter(getSdrObjectTransformation() * basegfx::B2DPoint(0.5, 0.5));
-//		const basegfx::B2DPoint aNewCenter(aMatrix * basegfx::B2DPoint(0.5, 0.5));
-//
-//		aMatrix.translate(aNewCenter - aOldCenter);
-//	}
-//
-//	aXorPolyPolygon.transform(aMatrix);
-//
-//	// Strichstaerke beruecksichtigen
-//	// Beim Hittest muss das unterbleiben (Performance!)
-//	basegfx::B2DPolyPolygon aContourPolyPolygon;
-//
-//	// #86258# test if shadow needs to be avoided for TakeContour()
-//	const SfxItemSet& rSet = GetObjectItemSet();
-//	bool bShadowOn = ((SdrOnOffItem&)(rSet.Get(SDRATTR_SHADOW))).GetValue();
-//
-//	// #i33696#
-//	// Remember TextObject currently set at the DrawOutliner, it WILL be
-//	// replaced during calculating the outline since it uses an own paint
-//	// and that one uses the DrawOutliner, too.
-//	const SdrTextObj* pLastTextObject = rOutliner.GetTextObj();
-//
-//	if(bShadowOn)
-//	{
-//		// #86258# force shadow off
-//		SdrObject* pCopy = CloneSdrObject();
-//		pCopy->SetMergedItem(SdrOnOffItem(SDRATTR_SHADOW, false));
-//		aContourPolyPolygon = pCopy->TakeContour();
-//		deleteSdrObjectSafeAndClearPointer( pCopy );
-//	}
-//	else
-//	{
-//		aContourPolyPolygon = TakeContour();
-//	}
-//
-//	// #i33696#
-//	// restore remembered text object
-//	if(pLastTextObject != rOutliner.GetTextObj())
-//	{
-//		rOutliner.SetTextObj(pLastTextObject);
-//	}
-//
-//	aContourPolyPolygon.transform(aMatrix);
-//	rOutliner.SetPolygon(aXorPolyPolygon, &aContourPolyPolygon);
-//}
-
 basegfx::B2DRange SdrTextObj::getUnifiedTextRange() const
 {
 	// per default the text range is the whole object range
 
 	rOutliner.SetPaperSize(aNullSize);
 
-	if(bContourFrame)
-	{
-		const basegfx::B2DPolyPolygon aOutline(getAlignedTextContourPolyPolygon(*this));
-
-		rOutliner.SetPolygon(aOutline);
-	}
-
 	// put text into the outliner, if available from the edit outliner
 	SdrText* pText = getActiveText();
 	OutlinerParaObject* pOutlinerParaObject = pText ? pText->GetOutlinerParaObject() : 0;
 
 	if(bContourFrame)
 	{
-		rTextRange = rAnchorRange;
+		basegfx::B2DPolyPolygon aContourOutline(getAlignedTextContourPolyPolygon(*this));
+		rTextRange = rAnchorRange = aContourOutline.getB2DRange();
+		aContourOutline.transform(basegfx::tools::createTranslateB2DHomMatrix(-aContourOutline.getB2DRange().getMinimum()));
+		rOutliner.SetPolygon(aContourOutline);
 	}
 	else
 	{
+        rOutliner.ClearPolygon();
 		rTextRange = basegfx::B2DRange(aTextPos, aTextPos + aTextSiz);
 	}
 }
 
 void SdrTextObj::ImpSetCharStretching(SdrOutliner& rOutliner, const basegfx::B2DRange& rTextRange, const basegfx::B2DRange& rAnchorRange) const
 {
-	OutputDevice* pOut = rOutliner.GetRefDevice();
-	bool bNoStretching(false);
+	const basegfx::B2DVector aOutlinerScale(
+		basegfx::fTools::equalZero(rTextRange.getWidth()) ? 1.0 : rTextRange.getWidth(), 
+		basegfx::fTools::equalZero(rTextRange.getHeight()) ? 1.0 : rTextRange.getHeight());
 
-	if(pOut && pOut->GetOutDevType() == OUTDEV_PRINTER)
-	{
-		// #35762#: Checken ob CharStretching ueberhaupt moeglich
-		GDIMetaFile* pMtf = pOut->GetConnectMetaFile();
-		UniString aTestString(sal_Unicode('J'));
+    // calculate global char stretching scale parameters. Use non-mirrored sizes
+	// to layout without mirroring
+	const double fScaleX(fabs(rAnchorRange.getWidth()) / aOutlinerScale.getX());
+	const double fScaleY(fabs(rAnchorRange.getHeight()) / aOutlinerScale.getY());
 
-		if(pMtf && (!pMtf->IsRecord() || pMtf->IsPause()))
-			pMtf = 0;
-
-		if(pMtf)
-			pMtf->Pause(true);
-
-		Font aFontMerk(pOut->GetFont());
-		Font aTmpFont( OutputDevice::GetDefaultFont( DEFAULTFONT_SERIF, LANGUAGE_SYSTEM, DEFAULTFONT_FLAGS_ONLYONE ) );
-
-		aTmpFont.SetSize(Size(0,100));
-		pOut->SetFont(aTmpFont);
-		Size aSize1(pOut->GetTextWidth(aTestString), pOut->GetTextHeight());
-		aTmpFont.SetSize(Size(800,100));
-		pOut->SetFont(aTmpFont);
-		Size aSize2(pOut->GetTextWidth(aTestString), pOut->GetTextHeight());
-		pOut->SetFont(aFontMerk);
-
-		if(pMtf)
-			pMtf->Pause(false);
-
-		bNoStretching = (aSize1 == aSize2);
-
-#ifdef WNT
-		// #35762# Windows vergroessert bei Size(100,500) den Font proportional
-		// Und das finden wir nicht so schoen.
-		if(aSize2.Height() >= aSize1.Height() * 2)
-		{
-			bNoStretching = true;
-		}
-#endif
-	}
-	unsigned nLoopCount=0;
-	bool bNoMoreLoop=false;
-	sal_Int32 nXDiff0=0x7FFFFFFF;
-	sal_Int32 nWantWdt=basegfx::fround(rAnchorRange.getWidth());
-	sal_Int32 nIsWdt=basegfx::fround(rTextRange.getWidth());
-	if (nIsWdt==0) nIsWdt=1;
-
-	sal_Int32 nWantHgt=basegfx::fround(rAnchorRange.getHeight());
-	sal_Int32 nIsHgt=basegfx::fround(rTextRange.getHeight());
-	if (nIsHgt==0) nIsHgt=1;
-
-	sal_Int32 nXTolPl=nWantWdt/100; // Toleranz +1%
-	sal_Int32 nXTolMi=nWantWdt/25;  // Toleranz -4%
-	sal_Int32 nXKorr =nWantWdt/20;  // Korrekturmasstab 5%
-
-	sal_Int32 nX=(nWantWdt*100) /nIsWdt; // X-Stretching berechnen
-	sal_Int32 nY=(nWantHgt*100) /nIsHgt; // Y-Stretching berechnen
-	bool bChkX=true;
-	bool bChkY=true;
-	if (bNoStretching) { // #35762# evtl. nur proportional moeglich
-		if (nX>nY) { nX=nY; bChkX=false; }
-		else { nY=nX; bChkY=false; }
-	}
-
-	while (nLoopCount<5 && !bNoMoreLoop) {
-		if (nX<0) nX=-nX;
-		if (nX<1) { nX=1; bNoMoreLoop=true; }
-		if (nX>65535) { nX=65535; bNoMoreLoop=true; }
-
-		if (nY<0) nY=-nY;
-		if (nY<1) { nY=1; bNoMoreLoop=true; }
-		if (nY>65535) { nY=65535; bNoMoreLoop=true; }
-
-		// exception, there is no text yet (horizontal case)
-		if(nIsWdt <= 1)
-		{
-			nX = nY;
-			bNoMoreLoop = true;
-		}
-
-		// #87877# exception, there is no text yet (vertical case)
-		if(nIsHgt <= 1)
-		{
-			nY = nX;
-			bNoMoreLoop = true;
-		}
-
-		rOutliner.SetGlobalCharStretching((sal_uInt16)nX,(sal_uInt16)nY);
-		nLoopCount++;
-		Size aSiz(rOutliner.CalcTextSize());
-		sal_Int32 nXDiff=aSiz.Width()-nWantWdt;
-		if (((nXDiff>=nXTolMi || !bChkX) && nXDiff<=nXTolPl) || nXDiff==nXDiff0/*&& Abs(nYDiff)<=nYTol*/) {
-			bNoMoreLoop=true;
-		} else {
-			// Stretchingfaktoren korregieren
-			sal_Int32 nMul=nWantWdt;
-			sal_Int32 nDiv=aSiz.Width();
-			if (Abs(nXDiff)<=2*nXKorr) {
-				if (nMul>nDiv) nDiv+=(nMul-nDiv)/2; // und zwar nur um die haelfte des berechneten
-				else nMul+=(nDiv-nMul)/2;           // weil die EE ja eh wieder falsch rechnet
-			}
-			nX=nX*nMul/nDiv;
-			if (bNoStretching) nY=nX;
-		}
-		nXDiff0=nXDiff;
-	}
-}
-
-void SdrTextObj::StartTextAnimation(OutputDevice* /*pOutDev*/, const Point& /*rOffset*/, sal_Int32 /*nExtraData*/)
-{
-	// #111096#
-	// use new text animation
-	SetTextAnimationAllowed(sal_True);
-}
-
-void SdrTextObj::StopTextAnimation(OutputDevice* /*pOutDev*/, sal_Int32 /*nExtraData*/)
-{
-	// #111096#
-	// use new text animation
-	SetTextAnimationAllowed(sal_False);
+	rOutliner.SetGlobalCharStretching((sal_Int16)basegfx::fround(fScaleX * 100.0), (sal_Int16)basegfx::fround(fScaleY * 100.0));
 }