summaryrefslogtreecommitdiff
path: root/binfilter/bf_svx/source/svdraw/svx_svdoole2.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'binfilter/bf_svx/source/svdraw/svx_svdoole2.cxx')
-rw-r--r--binfilter/bf_svx/source/svdraw/svx_svdoole2.cxx902
1 files changed, 902 insertions, 0 deletions
diff --git a/binfilter/bf_svx/source/svdraw/svx_svdoole2.cxx b/binfilter/bf_svx/source/svdraw/svx_svdoole2.cxx
new file mode 100644
index 000000000000..dc40cbf0cd52
--- /dev/null
+++ b/binfilter/bf_svx/source/svdraw/svx_svdoole2.cxx
@@ -0,0 +1,902 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * 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.
+ *
+ ************************************************************************/
+
+#include <com/sun/star/util/XModifyBroadcaster.hpp>
+
+
+#include <bf_sfx2/interno.hxx>
+#include <comphelper/classids.hxx>
+
+
+
+
+#include "svdoole2.hxx"
+#include <bf_svtools/solar.hrc>
+
+#include "svdio.hxx"
+#include "svdstr.hrc" // Objektname
+#include "svdetc.hxx"
+#include "svdview.hxx"
+#include "unomlstr.hxx"
+#include <bf_so3/client.hxx>
+
+namespace binfilter {
+
+using namespace ::rtl;
+using namespace ::com::sun::star;
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+#ifndef SO2_DECL_SVINPLACEOBJECT_DEFINED
+#define SO2_DECL_SVINPLACEOBJECT_DEFINED
+SO2_DECL_REF(SvInPlaceObject)
+#endif
+
+/*N*/ class SdrOle2ObjImpl
+/*N*/ {
+/*N*/ public:
+/*N*/ GDIMetaFile* pMetaFile; // Metafile fuer GetMtf kopieren und merken
+/*N*/ BfGraphicObject* pGraphicObject;
+/*N*/ String aPersistName; // name of object in persist
+/*N*/
+/*N*/ // #107645#
+/*N*/ // New local var to avoid repeated loading if load of OLE2 fails
+/*N*/ sal_Bool mbLoadingOLEObjectFailed;
+/*N*/
+/*N*/ bool mbConnected;
+/*N*/
+/*N*/ };
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+// Predicate determining whether the given OLE is an internal math
+// object
+/*N*/ static bool ImplIsMathObj( const SvInPlaceObjectRef& rObjRef )
+/*N*/ {
+/*N*/ if( !rObjRef.Is() )
+/*N*/ return false;
+/*N*/
+/*N*/ SvGlobalName aClassName( rObjRef->GetClassName() );
+/*N*/
+/*N*/ if( aClassName == SvGlobalName(BF_SO3_SM_CLASSID_30) ||
+/*N*/ aClassName == SvGlobalName(BF_SO3_SM_CLASSID_40) ||
+/*N*/ aClassName == SvGlobalName(BF_SO3_SM_CLASSID_50) ||
+/*N*/ aClassName == SvGlobalName(BF_SO3_SM_CLASSID_60) ||
+/*N*/ aClassName == SvGlobalName(BF_SO3_SM_CLASSID) )
+/*N*/ {
+/*N*/ return true;
+/*N*/ }
+/*N*/ else
+/*N*/ {
+/*N*/ return false;
+/*N*/ }
+/*N*/ }
+
+// -----------------------------------------------------------------------------
+
+/*N*/ TYPEINIT1(SdrOle2Obj,SdrRectObj);
+/*N*/
+/*N*/ SdrOle2Obj::SdrOle2Obj(FASTBOOL bFrame_)
+/*N*/ {
+/*N*/ bInDestruction = FALSE;
+/*N*/ Init();
+/*N*/
+/*N*/ ppObjRef=new SvInPlaceObjectRef;
+/*N*/ bFrame=bFrame_;
+/*N*/ }
+
+// -----------------------------------------------------------------------------
+
+/*N*/ SdrOle2Obj::SdrOle2Obj(const SvInPlaceObjectRef& rNewObjRef, const XubString& rNewObjName, const Rectangle& rNewRect, FASTBOOL bFrame_):
+/*N*/ SdrRectObj(rNewRect)
+/*N*/ {DBG_BF_ASSERT(0, "STRIP"); //STRIP001
+/*N*/ }
+
+// -----------------------------------------------------------------------------
+
+/*N*/ void SdrOle2Obj::Init()
+/*N*/ {
+/*N*/ mpImpl = new SdrOle2ObjImpl;
+/*N*/ pModifyListener = NULL;
+/*N*/ pGraphic=NULL;
+/*N*/ mpImpl->pMetaFile=NULL;
+/*N*/ mpImpl->pGraphicObject=NULL;
+/*N*/
+/*N*/ // #107645#
+/*N*/ // init to start situation, loading did not fail
+/*N*/ mpImpl->mbLoadingOLEObjectFailed = sal_False;
+/*N*/
+/*N*/ mpImpl->mbConnected = false;
+/*N*/ }
+
+// -----------------------------------------------------------------------------
+
+/*N*/ SdrOle2Obj::~SdrOle2Obj()
+/*N*/ {
+/*N*/ bInDestruction = TRUE;
+/*N*/ // Aus Cache entfernen
+/*N*/ GetSdrGlobalData().GetOLEObjCache().RemoveObj(this);
+/*N*/
+/*N*/ SvInPlaceObjectRef aRef( *ppObjRef );
+/*N*/
+/*N*/ Disconnect();
+/*N*/
+/*N*/ if(pModel && aRef.Is())
+/*N*/ {
+/*N*/ SvPersist* pPers=pModel->GetPersist();
+/*N*/ if(pPers!=NULL)
+/*N*/ {
+/*?*/ pPers->Remove(aRef);
+/*N*/ }
+/*N*/ }
+/*N*/ aRef.Clear();
+/*N*/
+/*N*/ delete ppObjRef;
+/*N*/
+/*N*/ if(pGraphic!=NULL)
+/*?*/ delete pGraphic;
+/*N*/
+/*N*/ if(mpImpl->pMetaFile!=NULL)
+/*?*/ delete mpImpl->pMetaFile;
+/*N*/
+/*N*/ if(mpImpl->pGraphicObject!=NULL)
+/*?*/ delete mpImpl->pGraphicObject;
+/*N*/
+/*N*/ if(pModifyListener)
+/*N*/ {
+/*N*/ pModifyListener->invalidate();
+/*N*/ pModifyListener->release();
+/*N*/ pModifyListener = NULL;
+/*N*/ }
+/*N*/ delete mpImpl;
+/*N*/ }
+
+// -----------------------------------------------------------------------------
+
+/*N*/ void SdrOle2Obj::SetGraphic(const Graphic* pGrf)
+/*N*/ {
+/*N*/ if ( pGraphic )
+/*N*/ {
+/*?*/ delete pGraphic;
+/*?*/ pGraphic = NULL;
+/*?*/ delete mpImpl->pGraphicObject;
+/*?*/ mpImpl->pGraphicObject = NULL;
+/*N*/ }
+/*N*/
+/*N*/ if (pGrf!=NULL)
+/*N*/ {
+/*?*/ pGraphic = new Graphic(*pGrf);
+/*?*/ mpImpl->pGraphicObject = new BfGraphicObject( *pGraphic );
+/*N*/ }
+/*N*/
+/*N*/ if ( ppObjRef->Is() && pGrf )
+/*?*/ SendRepaintBroadcast();
+/*N*/
+/*N*/ SetChanged();
+/*N*/ }
+
+// -----------------------------------------------------------------------------
+
+/*N*/ FASTBOOL SdrOle2Obj::IsEmpty() const
+/*N*/ {
+/*N*/ return !ppObjRef->Is();
+/*N*/ }
+
+// -----------------------------------------------------------------------------
+
+/*N*/ void SdrOle2Obj::Connect()
+/*N*/ {
+/*N*/ if(pModel && mpImpl->aPersistName.Len())
+/*N*/ {
+/*N*/ SvPersist* pPers=pModel->GetPersist();
+/*N*/ if (pPers!=NULL)
+/*N*/ {
+/*N*/ SvInfoObjectRef xIObj;
+/*N*/ SvInfoObject* pInfo = pPers->Find(mpImpl->aPersistName);
+/*N*/
+/*N*/ if (!pInfo)
+/*N*/ {
+/*?*/ if ( !ppObjRef->Is() )
+/*?*/ GetObjRef(); // try to load inplace object
+/*?*/
+/*?*/ xIObj = pInfo = new SvEmbeddedInfoObject(*ppObjRef,mpImpl->aPersistName);
+/*N*/ }
+/*N*/
+/*N*/ if ( !pPers->HasObject(mpImpl->aPersistName) )
+/*N*/ {
+/*?*/ pPers->Move(pInfo, mpImpl->aPersistName);
+/*N*/ }
+/*N*/ else
+/*N*/ {
+/*N*/ pInfo->SetDeleted(FALSE);
+/*N*/ }
+/*N*/ }
+/*N*/
+/*N*/ // In Cache einfuegen
+/*N*/ GetSdrGlobalData().GetOLEObjCache().InsertObj(this);
+/*N*/ }
+/*N*/
+/*N*/ if ( ppObjRef->Is() && (*ppObjRef)->GetMiscStatus() & SVOBJ_MISCSTATUS_RESIZEONPRINTERCHANGE )
+/*N*/ {
+/*N*/ if (pModel && pModel->GetRefDevice() &&
+/*N*/ pModel->GetRefDevice()->GetOutDevType() == OUTDEV_PRINTER)
+/*N*/ {
+/*?*/ // Kein RefDevice oder RefDevice kein Printer
+/*?*/ BOOL bModified = (*ppObjRef)->IsModified();
+/*?*/ Printer* pPrinter = (Printer*) pModel->GetRefDevice();
+/*?*/ (*ppObjRef)->OnDocumentPrinterChanged( pPrinter );
+/*?*/ (*ppObjRef)->SetModified( bModified );
+/*N*/ }
+/*N*/ }
+/*N*/
+/*N*/ if( !IsEmpty() )
+/*N*/ {
+/*?*/ // register modify listener
+/*?*/ if( pModifyListener == NULL )
+/*?*/ {
+/*?*/ ((SdrOle2Obj*)this)->pModifyListener = new SvxUnoShapeModifyListener( (SdrOle2Obj*)this );
+/*?*/ pModifyListener->acquire();
+/*?*/ }
+/*?*/
+/*?*/ uno::Reference< util::XModifyBroadcaster > xBC( getXModel(), uno::UNO_QUERY );
+/*?*/ if( xBC.is() && pModifyListener )
+/*?*/ {
+/*?*/ uno::Reference< util::XModifyListener > xListener( pModifyListener );
+/*?*/ xBC->addModifyListener( xListener );
+/*?*/ }
+/*?*/
+/*?*/ mpImpl->mbConnected = true;
+/*N*/ }
+/*N*/ }
+
+// -----------------------------------------------------------------------------
+
+/*N*/ void SdrOle2Obj::Disconnect()
+/*N*/ {
+/*N*/ if( !mpImpl->mbConnected )
+/*N*/ return;
+/*N*/
+/*N*/ if( !IsEmpty() && mpImpl->aPersistName.Len() )
+/*N*/ {
+/*N*/ uno::Reference< util::XModifyBroadcaster > xBC( getXModel(), uno::UNO_QUERY );
+/*N*/ if( xBC.is() && pModifyListener )
+/*N*/ {
+/*N*/ uno::Reference< util::XModifyListener > xListener( pModifyListener );
+/*N*/ xBC->removeModifyListener( xListener );
+/*N*/ }
+/*N*/ }
+/*N*/
+/*N*/ if (pModel && mpImpl->aPersistName.Len() )
+/*N*/ {
+/*N*/ if( pModel->IsInDestruction() )
+/*N*/ {
+/*N*/ *ppObjRef = NULL;
+/*N*/ }
+/*N*/ else
+/*N*/ {
+/*N*/ SvPersist* pPers = pModel->GetPersist();
+/*N*/
+/*N*/ if (pPers)
+/*N*/ {
+/*N*/ SvInfoObject* pInfo = pPers->Find(mpImpl->aPersistName);
+/*N*/
+/*N*/ if (pInfo)
+/*N*/ {
+/*N*/ pInfo->SetDeleted(TRUE);
+/*N*/ pInfo->SetObj(0);
+/*N*/ }
+/*N*/ }
+/*N*/
+/*N*/ if ( ppObjRef->Is() )
+/*N*/ (*ppObjRef)->DoClose();
+/*N*/ }
+/*N*/
+/*N*/ // Aus Cache entfernen
+/*N*/ GetSdrGlobalData().GetOLEObjCache().RemoveObj(this);
+/*N*/
+/*N*/ if ( ppObjRef->Is() )
+/*N*/ ppObjRef->Clear();
+/*N*/ }
+/*N*/
+/*N*/ mpImpl->mbConnected = false;
+/*N*/ }
+
+// -----------------------------------------------------------------------------
+
+/*N*/ void SdrOle2Obj::SetModel(SdrModel* pNewModel)
+/*N*/ {
+/*N*/ FASTBOOL bChg = pNewModel!=pModel;
+/*N*/
+/*N*/ if( bChg )
+/*N*/ Disconnect(); // mit dem alten Namen
+/*N*/
+/*N*/ if( pModel && pNewModel )
+/*N*/ {
+/*?*/ SvPersist* pDestPers = pNewModel->GetPersist();
+/*?*/ SvPersist* pSrcPers = pModel->GetPersist();
+/*?*/
+/*?*/ if( pDestPers && pSrcPers && ( pDestPers != pSrcPers ) )
+/*?*/ {
+/*?*/ {DBG_BF_ASSERT(0, "STRIP");} //STRIP001 ImpCopyObject( *pSrcPers, *pDestPers, mpImpl->aPersistName );
+/*?*/ }
+/*N*/ }
+/*N*/
+/*N*/ SdrRectObj::SetModel( pNewModel );
+/*N*/
+/*N*/ if( bChg )
+/*N*/ Connect();
+/*N*/ }
+
+// -----------------------------------------------------------------------------
+
+/*N*/ void SdrOle2Obj::SetPage(SdrPage* pNewPage)
+/*N*/ {
+/*N*/ FASTBOOL bRemove=pNewPage==NULL && pPage!=NULL;
+/*N*/ FASTBOOL bInsert=pNewPage!=NULL && pPage==NULL;
+/*N*/
+/*N*/ if (bRemove) Disconnect();
+/*N*/
+/*N*/ SdrRectObj::SetPage(pNewPage);
+/*N*/
+/*N*/ if (bInsert) Connect();
+/*N*/ }
+
+// -----------------------------------------------------------------------------
+
+/*N*/ void SdrOle2Obj::SetObjRef(const SvInPlaceObjectRef& rNewObjRef)
+/*N*/ {
+/*N*/ if( rNewObjRef == *ppObjRef )
+/*N*/ return;
+/*N*/
+/*N*/ Disconnect();
+/*N*/
+/*N*/ *ppObjRef=rNewObjRef;
+/*N*/
+/*N*/ SvInPlaceObjectRef& rIPRef = *ppObjRef;
+/*N*/
+/*N*/ if (rIPRef.Is() &&
+/*N*/ (rIPRef->GetMiscStatus() & SVOBJ_MISCSTATUS_NOTRESIZEABLE) )
+/*N*/ {
+/*N*/ SetResizeProtect(TRUE);
+/*N*/ }
+/*N*/
+/*N*/ // #108759# For math objects, set closed state to transparent
+/*N*/ if( ImplIsMathObj( *ppObjRef ) )
+/*N*/ SetClosedObj( false );
+/*N*/
+/*N*/ Connect();
+/*N*/ SetChanged();
+/*N*/ SendRepaintBroadcast();
+/*N*/ }
+
+// -----------------------------------------------------------------------------
+
+/*N*/ void SdrOle2Obj::SetClosedObj( bool bIsClosed )
+/*N*/ {
+/*N*/ // #108759# Allow changes to the closed state of OLE objects
+/*N*/ bClosedObj = bIsClosed;
+/*N*/ }
+
+// -----------------------------------------------------------------------------
+
+
+// -----------------------------------------------------------------------------
+
+
+// -----------------------------------------------------------------------------
+
+/*N*/ XubString SdrOle2Obj::GetName() const
+/*N*/ {
+/*N*/ return aName;
+/*N*/ }
+
+// -----------------------------------------------------------------------------
+
+/*N*/ void SdrOle2Obj::SetPersistName( const String& rPersistName )
+/*N*/ {
+/*N*/ mpImpl->aPersistName = rPersistName;
+/*N*/ SetChanged();
+/*N*/ }
+
+// -----------------------------------------------------------------------------
+
+/*N*/ String SdrOle2Obj::GetPersistName() const
+/*N*/ {
+/*N*/ return mpImpl->aPersistName;
+/*N*/ }
+
+// -----------------------------------------------------------------------------
+
+
+// -----------------------------------------------------------------------------
+
+/*N*/ UINT16 SdrOle2Obj::GetObjIdentifier() const
+/*N*/ {
+/*N*/ return bFrame ? UINT16(OBJ_FRAME) : UINT16(OBJ_OLE2);
+/*N*/ }
+
+// -----------------------------------------------------------------------------
+
+
+// -----------------------------------------------------------------------------
+
+/*N*/ SdrObject* SdrOle2Obj::CheckHit(const Point& rPnt, USHORT nTol, const SetOfByte* pVisiLayer) const
+/*N*/ {
+/*N*/ return ImpCheckHit(rPnt,nTol,pVisiLayer,TRUE,TRUE);
+/*N*/ }
+
+// -----------------------------------------------------------------------------
+
+
+// -----------------------------------------------------------------------------
+
+
+// -----------------------------------------------------------------------------
+
+
+// -----------------------------------------------------------------------------
+
+
+// -----------------------------------------------------------------------------
+
+
+// -----------------------------------------------------------------------------
+
+
+// -----------------------------------------------------------------------------
+
+
+// -----------------------------------------------------------------------------
+
+/*NBFF*/ void SdrOle2Obj::ImpSetVisAreaSize()
+/*NBFF*/ {
+/*NBFF*/ GetObjRef(); // try to load inplace object
+/*NBFF*/ SvInPlaceObjectRef& rIPRef=*ppObjRef;
+/*NBFF*/
+/*NBFF*/ if (rIPRef.Is())
+/*NBFF*/ {
+/*NBFF*/ if (rIPRef->GetMiscStatus() & SVOBJ_MISCSTATUS_SERVERRESIZE)
+/*NBFF*/ {
+/*NBFF*/ // Server resized selbst (StarChart)
+/*NBFF*/ // Neue VisArea setzen
+/*NBFF*/ Rectangle aVisArea = OutputDevice::LogicToLogic( aRect,
+/*NBFF*/ pModel->GetScaleUnit(), rIPRef->GetMapUnit() );
+/*NBFF*/ rIPRef->SetVisArea(aVisArea);
+/*NBFF*/
+/*NBFF*/ // Wurde die VisArea akzeptiert?
+/*NBFF*/ Rectangle aAcceptedVisArea(rIPRef->GetVisArea());
+/*NBFF*/
+/*NBFF*/ if (aVisArea.GetSize() != aAcceptedVisArea.GetSize())
+/*NBFF*/ {
+/*NBFF*/ // VisArea wurde nicht akzeptiert -> korrigieren
+/*NBFF*/ aRect.SetSize(OutputDevice::LogicToLogic( aAcceptedVisArea.GetSize(),
+/*NBFF*/ rIPRef->GetMapUnit(), pModel->GetScaleUnit()));
+/*NBFF*/ }
+/*NBFF*/ }
+/*NBFF*/ else
+/*NBFF*/ {
+/*NBFF*/ ///**********************************************************************
+/*NBFF*/ //* Nun wird nicht mehr die VisArea gesetzt, sondern es erfolgt eine
+/*NBFF*/ //* Skalierung
+/*NBFF*/ //**********************************************************************/
+/*NBFF*/ SvEmbeddedClient* pClient = (*ppObjRef)->GetClient();
+/*NBFF*/
+/*NBFF*/ if (pClient)
+/*NBFF*/ {
+/*NBFF*/ SvClientData* pData = pClient->GetClientData();
+/*NBFF*/ Size aObjAreaSize = rIPRef->GetVisArea().GetSize();
+/*NBFF*/ aObjAreaSize = OutputDevice::LogicToLogic( aObjAreaSize,
+/*NBFF*/ rIPRef->GetMapUnit(),
+/*NBFF*/ pModel->GetScaleUnit() );
+/*NBFF*/
+/*NBFF*/ Size aSize = aRect.GetSize();
+/*NBFF*/ Fraction aScaleWidth (aSize.Width(), aObjAreaSize.Width() );
+/*NBFF*/ Fraction aScaleHeight(aSize.Height(), aObjAreaSize.Height() );
+/*NBFF*/ // Nun auf 10 Binaerstellen kuerzen
+/*NBFF*/ Kuerzen(aScaleHeight, 10);
+/*NBFF*/ Kuerzen(aScaleWidth, 10);
+/*NBFF*/
+/*NBFF*/ pData->SetSizeScale(aScaleWidth, aScaleHeight);
+/*NBFF*/
+/*NBFF*/ Rectangle aScaleRect(aRect.TopLeft(), aObjAreaSize);
+/*NBFF*/ pData->SetObjArea(aScaleRect);
+/*NBFF*/ }
+/*NBFF*/ }
+/*NBFF*/ }
+/*NBFF*/ }
+
+// -----------------------------------------------------------------------------
+
+/*N*/ void SdrOle2Obj::NbcResize(const Point& rRef, const Fraction& xFact, const Fraction& yFact)
+/*N*/ {
+/*N*/ SdrRectObj::NbcResize(rRef,xFact,yFact);
+/*N*/ if (aGeo.nShearWink!=0 || aGeo.nDrehWink!=0) { // kleine Korrekturen
+/*?*/ if (aGeo.nDrehWink>=9000 && aGeo.nDrehWink<27000) {
+/*?*/ aRect.Move(aRect.Left()-aRect.Right(),aRect.Top()-aRect.Bottom());
+/*?*/ }
+/*?*/ aGeo.nDrehWink=0;
+/*?*/ aGeo.nShearWink=0;
+/*?*/ aGeo.nSin=0.0;
+/*?*/ aGeo.nCos=1.0;
+/*?*/ aGeo.nTan=0.0;
+/*?*/ SetRectsDirty();
+/*N*/ }
+/*N*/ if( (NULL == pModel) || !pModel->isLocked() )
+/*NBFF*/ ImpSetVisAreaSize();
+/*N*/ }
+
+// -----------------------------------------------------------------------------
+
+
+// -----------------------------------------------------------------------------
+
+/*N*/ void SdrOle2Obj::NbcSetSnapRect(const Rectangle& rRect)
+/*N*/ {
+/*N*/ SdrRectObj::NbcSetSnapRect(rRect);
+/*N*/ if( (NULL == pModel) || !pModel->isLocked() )
+/*NBFF*/ ImpSetVisAreaSize();
+/*N*/ }
+
+// -----------------------------------------------------------------------------
+
+/*N*/ void SdrOle2Obj::NbcSetLogicRect(const Rectangle& rRect)
+/*N*/ {
+/*N*/ SdrRectObj::NbcSetLogicRect(rRect);
+/*N*/ if( (NULL == pModel) || !pModel->isLocked() )
+/*NBFF*/ ImpSetVisAreaSize();
+/*N*/ }
+
+// -----------------------------------------------------------------------------
+
+/*N*/ FASTBOOL SdrOle2Obj::HasGDIMetaFile() const
+/*N*/ {DBG_BF_ASSERT(0, "STRIP"); return FALSE;//STRIP001
+/*N*/ }
+
+// -----------------------------------------------------------------------------
+
+/*N*/ const GDIMetaFile* SdrOle2Obj::GetGDIMetaFile() const
+/*N*/ {DBG_BF_ASSERT(0, "STRIP");return NULL; //STRIP001
+/*N*/ }
+
+// -----------------------------------------------------------------------------
+
+/*N*/ void SdrOle2Obj::WriteData(SvStream& rOut) const
+/*N*/ {
+/*N*/ SdrRectObj::WriteData(rOut);
+/*N*/ SdrDownCompat aCompat(rOut,STREAM_WRITE); // Fuer Abwaertskompatibilitaet (Lesen neuer Daten mit altem Code)
+/*N*/ #ifdef DBG_UTIL
+/*N*/ aCompat.SetID("SdrOle2Obj");
+/*N*/ #endif
+/*N*/
+/*N*/ // UNICODE: rOut<<mpImpl->aPersistName;
+/*N*/ rOut.WriteByteString(mpImpl->aPersistName);
+/*N*/
+/*N*/ // UNICODE: rOut<<aProgName;
+/*N*/ rOut.WriteByteString(aProgName);
+/*N*/
+/*N*/ GetObjRef();
+/*N*/ BOOL bObjRefValid=ppObjRef->Is();
+/*N*/ rOut<<bObjRefValid;
+/*N*/ BOOL bPreview = FALSE;
+/*N*/ if( !IsEmptyPresObj() && pModel && pModel->IsSaveOLEPreview() )
+/*N*/ bPreview = TRUE;
+/*N*/
+/*N*/ if( bPreview )
+/*N*/ {DBG_BF_ASSERT(0, "STRIP"); //STRIP001
+/*N*/ }
+
+/*N*/ BOOL bHasGraphic=pGraphic!=NULL;
+
+ // #i27418# If there actually is no graphic, do not write one. This will lead
+ // to loading an empty bitmap in older OOo versions which sets an error code at
+ // the stream -> load breaks.
+ if(bHasGraphic)
+ {
+ if(GRAPHIC_NONE == pGraphic->GetType())
+ {
+ bHasGraphic = false;
+ }
+ }
+
+/*N*/ rOut<<bHasGraphic;
+/*N*/ if (bHasGraphic)
+/*N*/ {
+/*?*/ SdrDownCompat aGrafCompat(rOut,STREAM_WRITE); // ab V11 eingepackt
+/*?*/ #ifdef DBG_UTIL
+/*?*/ aGrafCompat.SetID("SdrOle2Obj(Graphic)");
+/*?*/ #endif
+/*?*/ rOut<<*pGraphic;
+/*N*/ }
+/*N*/
+/*N*/ if( bPreview )
+/*?*/ ( (SdrOle2Obj*) this )->SetGraphic( NULL ); // remove preview graphic
+/*N*/ }
+
+// -----------------------------------------------------------------------------
+
+/*N*/ void SdrOle2Obj::ReadData(const SdrObjIOHeader& rHead, SvStream& rIn)
+/*N*/ {
+/*N*/ rIn.SetError( 0 );
+/*N*/
+/*N*/ if (rIn.GetError()!=0) return;
+/*N*/ SdrRectObj::ReadData(rHead,rIn);
+/*N*/ SdrDownCompat aCompat(rIn,STREAM_READ); // Fuer Abwaertskompatibilitaet (Lesen neuer Daten mit altem Code)
+/*N*/ #ifdef DBG_UTIL
+/*N*/ aCompat.SetID("SdrOle2Obj");
+/*N*/ #endif
+/*N*/
+/*N*/ // UNICODE: rIn >> mpImpl->aPersistName;
+/*N*/ rIn.ReadByteString(mpImpl->aPersistName);
+/*N*/
+/*N*/ // UNICODE: rIn >> aProgName;
+/*N*/ rIn.ReadByteString(aProgName);
+/*N*/
+/*N*/ BOOL bObjRefValid;
+/*N*/ rIn>>bObjRefValid;
+/*N*/
+/*N*/ BOOL bHasGraphic;
+/*N*/ rIn>>bHasGraphic;
+/*N*/ if (bHasGraphic)
+/*N*/ {
+/*?*/ if(pGraphic==NULL)
+/*?*/ pGraphic=new Graphic;
+/*?*/
+
+ // #i27418# Remember stream position to decide if something was read
+ const sal_Size nFilePosition(rIn.Tell());
+
+/*?*/ if(rHead.GetVersion()>=11)
+/*?*/ { // ab V11 eingepackt
+/*?*/ SdrDownCompat aGrafCompat(rIn,STREAM_READ);
+/*?*/ #ifdef DBG_UTIL
+/*?*/ aGrafCompat.SetID("SdrOle2Obj(Graphic)");
+/*?*/ #endif
+/*?*/ rIn>>*pGraphic;
+/*?*/ }
+/*?*/ else
+/*?*/ rIn>>*pGraphic;
+/*?*/
+
+ // #i27418# If 4 bytes were read but an error is set, it was tried to read an empty
+ // bitmap into the Graphic. This a follow-up error from previously wrong saves.
+ // Reset error code here, it's not really an error but leads to a crash in SO7
+ if(0L != rIn.GetError() && (nFilePosition + 4L) == rIn.Tell())
+ {
+ rIn.ResetError();
+ }
+
+/*?*/ if( mpImpl->pGraphicObject )
+/*?*/ delete mpImpl->pGraphicObject;
+/*?*/
+/*?*/ mpImpl->pGraphicObject = new BfGraphicObject( *pGraphic );
+/*N*/ }
+/*N*/ }
+
+// -----------------------------------------------------------------------------
+
+/*N*/ void SdrOle2Obj::NbcMove(const Size& rSize)
+/*N*/ {
+/*N*/ SdrRectObj::NbcMove(rSize);
+/*N*/ if( (NULL == pModel) || !pModel->isLocked() )
+/*NBFF*/ ImpSetVisAreaSize();
+/*N*/ }
+
+// -----------------------------------------------------------------------------
+
+/*N*/ BOOL SdrOle2Obj::Unload()
+/*N*/ {
+/*N*/ BOOL bUnloaded = FALSE;
+/*N*/
+/*N*/ if( ppObjRef && ppObjRef->Is() )
+/*N*/ {
+/*N*/ //Nicht notwendig im Doc DTor (MM)
+/*N*/ ULONG nRefCount = (*ppObjRef)->GetRefCount();
+/*N*/ // prevent Unload if there are external references
+/*N*/ if( nRefCount > 2 )
+/*N*/ return FALSE;
+/*N*/ DBG_ASSERT( nRefCount == 2, "Wrong RefCount for unload" );
+/*N*/ }
+/*N*/ else
+/*N*/ bUnloaded = TRUE;
+/*N*/
+/*N*/ if (pModel && ppObjRef && ppObjRef->Is() &&
+/*N*/ SVOBJ_MISCSTATUS_ALWAYSACTIVATE != (*ppObjRef)->GetMiscStatus() &&
+/*N*/ 1 < (*ppObjRef)->GetRefCount() &&
+/*N*/ !(*ppObjRef)->IsModified() &&
+/*N*/ !(*ppObjRef)->GetProtocol().IsInPlaceActive() )
+/*N*/ {
+/*N*/ SvPersist* pPersist = pModel->GetPersist();
+/*N*/
+/*N*/ if (pPersist)
+/*N*/ {
+/*N*/ SvPersist* pO = *ppObjRef;
+/*N*/ if( pO->IsModified() )
+/*N*/ {
+/*?*/ pO->DoSave();
+/*?*/ pO->DoSaveCompleted();
+/*N*/ }
+/*N*/ ppObjRef->Clear();
+/*N*/ if (pPersist->Unload(pO))
+/*N*/ bUnloaded = TRUE;
+/*N*/ else
+/*?*/ *ppObjRef = pO;
+/*N*/ }
+/*N*/ }
+/*N*/
+/*N*/ return bUnloaded;
+/*N*/ }
+
+// -----------------------------------------------------------------------------
+
+
+// -----------------------------------------------------------------------------
+
+/*N*/ const SvInPlaceObjectRef& SdrOle2Obj::GetObjRef() const
+/*N*/ {
+/*N*/ if ( !ppObjRef->Is() && pModel && pModel->GetPersist() && !pModel->GetPersist()->IsHandsOff() )
+/*N*/ {
+/*N*/ // #107645#
+/*N*/ // Only try loading if it did not wrent wrong up to now
+/*N*/ if(!mpImpl->mbLoadingOLEObjectFailed)
+/*N*/ {
+/*N*/ // Objekt laden
+/*N*/ (*ppObjRef) = &( pModel->GetPersist()->GetObject( mpImpl->aPersistName ) );
+/*N*/
+/*N*/ // #107645#
+/*N*/ // If loading of OLE object failed, remember that to not invoke a endless
+/*N*/ // loop trying to load it again and again.
+/*N*/ if(!ppObjRef->Is())
+/*N*/ {
+/*N*/ mpImpl->mbLoadingOLEObjectFailed = sal_True;
+/*N*/ }
+/*N*/
+/*N*/ // #108759# For math objects, set closed state to transparent
+/*N*/ if( ImplIsMathObj( *ppObjRef ) )
+/*N*/ const_cast<SdrOle2Obj*>(this)->SetClosedObj( false );
+/*N*/ }
+/*N*/
+/*N*/ if ( ppObjRef->Is() )
+/*N*/ {
+/*N*/ if( !IsEmptyPresObj() )
+/*N*/ {
+/*N*/ // #75637# remember modified status of model
+/*N*/ BOOL bWasChanged(pModel ? pModel->IsChanged() : FALSE);
+/*N*/
+/*N*/ // perhaps preview not valid anymore
+/*N*/ // #75637# This line changes the modified state of the model
+/*N*/ ( (SdrOle2Obj*) this )->SetGraphic( NULL );
+/*N*/
+/*N*/ // #75637# if status was not set before, force it back
+/*N*/ // to not set, so that SetGraphic(0L) above does not
+/*N*/ // set the modified state of the model.
+/*N*/ if(!bWasChanged && pModel && pModel->IsChanged())
+/*N*/ pModel->SetChanged(FALSE);
+/*N*/ }
+/*N*/
+/*N*/ if ( (*ppObjRef)->GetMiscStatus() & SVOBJ_MISCSTATUS_RESIZEONPRINTERCHANGE )
+/*N*/ {
+/*N*/ if (pModel && pModel->GetRefDevice() &&
+/*N*/ pModel->GetRefDevice()->GetOutDevType() == OUTDEV_PRINTER)
+/*N*/ {
+/*N*/ if(!bInDestruction)
+/*N*/ {
+/*N*/ // prevent SetModified (don't want no update here)
+/*N*/ sal_Bool bWasEnabled = (*ppObjRef)->IsEnableSetModified();
+/*N*/ if ( bWasEnabled )
+/*N*/ (*ppObjRef)->EnableSetModified( sal_False );
+/*N*/
+/*N*/ // Kein RefDevice oder RefDevice kein Printer
+/*N*/ Printer* pPrinter = (Printer*) pModel->GetRefDevice();
+/*N*/ (*ppObjRef)->OnDocumentPrinterChanged( pPrinter );
+/*N*/
+/*N*/ // reset state
+/*N*/ (*ppObjRef)->EnableSetModified( bWasEnabled );
+/*N*/ }
+/*N*/ }
+/*N*/ }
+/*N*/
+/*N*/ // register modify listener on initial load
+/*N*/ if( pModifyListener == NULL )
+/*N*/ {
+/*N*/ ((SdrOle2Obj*)this)->pModifyListener = new SvxUnoShapeModifyListener( (SdrOle2Obj*)this );
+/*N*/ pModifyListener->acquire();
+/*N*/
+/*N*/ uno::Reference< util::XModifyBroadcaster > xBC( getXModel(), uno::UNO_QUERY );
+/*N*/ if( xBC.is() && pModifyListener )
+/*N*/ {
+/*N*/ uno::Reference< util::XModifyListener > xListener( pModifyListener );
+/*N*/ xBC->addModifyListener( xListener );
+/*N*/ }
+/*N*/ }
+/*N*/ }
+/*N*/ }
+/*N*/
+/*N*/ if (ppObjRef->Is())
+/*N*/ {
+/*N*/ // In Cache einfuegen
+/*N*/ GetSdrGlobalData().GetOLEObjCache().InsertObj((SdrOle2Obj*) this);
+/*N*/ }
+/*N*/
+/*N*/ return *ppObjRef;
+/*N*/ }
+
+// -----------------------------------------------------------------------------
+
+/*N*/ uno::Reference< frame::XModel > SdrOle2Obj::getXModel() const
+/*N*/ {
+/*N*/ uno::Reference< frame::XModel > xModel;
+/*N*/
+/*N*/ if( pModel )
+/*N*/ {
+/*N*/ SvInPlaceObjectRef xSvIPO( GetObjRef() );
+/*N*/ SfxInPlaceObjectRef xIPO( xSvIPO );
+/*N*/ if( xIPO.Is() )
+/*N*/ {
+/*N*/ SfxObjectShell* pShell = xIPO->GetObjectShell();
+/*N*/
+/*N*/ if( pShell )
+/*N*/ xModel = pShell->GetModel();
+/*N*/ }
+/*N*/ }
+/*N*/
+/*N*/ return xModel;
+/*N*/ }
+
+// -----------------------------------------------------------------------------
+
+/// #110015# sets the visible area at the SvInPlaceObject and SvEmbeddedInfoObject
+/*N*/ void SdrOle2Obj::SetVisibleArea( const Rectangle& rVisArea )
+/*N*/ {
+/*N*/ const SvInPlaceObjectRef& xInplace = GetObjRef();
+/*N*/ if( xInplace.Is() )
+/*N*/ {
+/*N*/ xInplace->SetVisArea( rVisArea );
+/*N*/
+/*N*/ if( pModel && (!pModel->GetPersist()->IsEnableSetModified()) )
+/*N*/ xInplace->SetModified(FALSE);
+/*N*/ }
+/*N*/
+/*N*/ if(pModel && mpImpl->aPersistName.Len() )
+/*N*/ {
+/*N*/ SvPersist* pPers = pModel->GetPersist();
+/*N*/
+/*N*/ if (pPers)
+/*N*/ {
+/*N*/ SvInfoObject* pInfo = pPers->Find(mpImpl->aPersistName);
+/*N*/ SvEmbeddedInfoObject * pEmbed = PTR_CAST(SvEmbeddedInfoObject, pInfo );
+/*N*/
+/*N*/ if( pEmbed )
+/*N*/ pEmbed->SetInfoVisArea( rVisArea );
+/*N*/ }
+/*N*/ }
+/*N*/ }
+
+// -----------------------------------------------------------------------------
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */