diff options
author | Frank Schoenheit [fs] <frank.schoenheit@oracle.com> | 2010-12-16 13:15:45 +0100 |
---|---|---|
committer | Frank Schoenheit [fs] <frank.schoenheit@oracle.com> | 2010-12-16 13:15:45 +0100 |
commit | 2ac8765b19c8ccb5cc7f65911d7a2510f34f79cd (patch) | |
tree | 1573d6a1aa43f8b73521a695733c2d88d1f593cb /svx | |
parent | edb57aae4be8253104c5dc9282234cc3f12c7ece (diff) | |
parent | 5e5f32868925e3fc20bad2b7cc1c23b77b524d5e (diff) |
undoapi: merged DEV300m95
Diffstat (limited to 'svx')
-rw-r--r-- | svx/inc/svx/sdr/contact/objectcontactofobjlistpainter.hxx | 9 | ||||
-rw-r--r-- | svx/inc/svx/svdograf.hxx | 3 | ||||
-rw-r--r-- | svx/source/sdr/contact/objectcontactofobjlistpainter.cxx | 19 | ||||
-rw-r--r-- | svx/source/sdr/contact/viewobjectcontactofgraphic.cxx | 36 | ||||
-rw-r--r-- | svx/source/svdraw/svdmodel.cxx | 2 | ||||
-rw-r--r-- | svx/source/svdraw/svdograf.cxx | 192 |
6 files changed, 221 insertions, 40 deletions
diff --git a/svx/inc/svx/sdr/contact/objectcontactofobjlistpainter.hxx b/svx/inc/svx/sdr/contact/objectcontactofobjlistpainter.hxx index 3f7211aa9dc0..870192c9b151 100644 --- a/svx/inc/svx/sdr/contact/objectcontactofobjlistpainter.hxx +++ b/svx/inc/svx/sdr/contact/objectcontactofobjlistpainter.hxx @@ -95,6 +95,15 @@ namespace sdr // Process the whole displaying virtual void ProcessDisplay(DisplayInfo& rDisplayInfo); + // VirtualDevice? Default is false + virtual bool isOutputToVirtualDevice() const; + + // recording MetaFile? Default is false + virtual bool isOutputToRecordingMetaFile() const; + + // pdf export? Default is false + virtual bool isOutputToPDFFile() const; + // access to OutputDevice. May return 0L like the default implementations do. Needs to be overloaded as needed. virtual OutputDevice* TryToGetOutputDevice() const; }; diff --git a/svx/inc/svx/svdograf.hxx b/svx/inc/svx/svdograf.hxx index 23d9204ca891..1eba8822402a 100644 --- a/svx/inc/svx/svdograf.hxx +++ b/svx/inc/svx/svdograf.hxx @@ -120,7 +120,8 @@ protected: void ImpLinkAnmeldung(); void ImpLinkAbmeldung(); - sal_Bool ImpUpdateGraphicLink() const; + sal_Bool ImpUpdateGraphicLink( sal_Bool bAsynchron = sal_True ) const; + void ImpSetLinkedGraphic( const Graphic& rGraphic ); DECL_LINK( ImpSwapHdl, GraphicObject* ); public: diff --git a/svx/source/sdr/contact/objectcontactofobjlistpainter.cxx b/svx/source/sdr/contact/objectcontactofobjlistpainter.cxx index da8518d7f1a1..c6965fcd40fb 100644 --- a/svx/source/sdr/contact/objectcontactofobjlistpainter.cxx +++ b/svx/source/sdr/contact/objectcontactofobjlistpainter.cxx @@ -151,6 +151,25 @@ namespace sdr } } + // VirtualDevice? + bool ObjectContactOfObjListPainter::isOutputToVirtualDevice() const + { + return (OUTDEV_VIRDEV == mrTargetOutputDevice.GetOutDevType()); + } + + // recording MetaFile? + bool ObjectContactOfObjListPainter::isOutputToRecordingMetaFile() const + { + GDIMetaFile* pMetaFile = mrTargetOutputDevice.GetConnectMetaFile(); + return (pMetaFile && pMetaFile->IsRecord() && !pMetaFile->IsPause()); + } + + // pdf export? + bool ObjectContactOfObjListPainter::isOutputToPDFFile() const + { + return (0 != mrTargetOutputDevice.GetPDFWriter()); + } + OutputDevice* ObjectContactOfObjListPainter::TryToGetOutputDevice() const { return &mrTargetOutputDevice; diff --git a/svx/source/sdr/contact/viewobjectcontactofgraphic.cxx b/svx/source/sdr/contact/viewobjectcontactofgraphic.cxx index cd2d9670bf7c..110186d41bf4 100644 --- a/svx/source/sdr/contact/viewobjectcontactofgraphic.cxx +++ b/svx/source/sdr/contact/viewobjectcontactofgraphic.cxx @@ -177,7 +177,7 @@ namespace sdr if(rGrafObj.IsLinkedGraphic()) { // update graphic link - rGrafObj.ImpUpdateGraphicLink(); + rGrafObj.ImpUpdateGraphicLink( sal_False ); } else { @@ -196,7 +196,7 @@ namespace sdr rGrafObj.mbInsidePaint = sal_True; rGrafObj.ForceSwapIn(); rGrafObj.mbInsidePaint = sal_False; - } + } bRetval = true; } @@ -252,19 +252,27 @@ namespace sdr // prepare primitive generation with evtl. loading the graphic when it's swapped out SdrGrafObj& rGrafObj = const_cast< ViewObjectContactOfGraphic* >(this)->getSdrGrafObj(); bool bDoAsynchronGraphicLoading(rGrafObj.GetModel() && rGrafObj.GetModel()->IsSwapGraphics()); - static bool bSuppressAsynchLoading(false); bool bSwapInDone(false); + bool bSwapInExclusive(false); - if(bDoAsynchronGraphicLoading - && rGrafObj.IsSwappedOut() - && rGrafObj.GetPage() - && rGrafObj.GetPage()->IsMasterPage()) + if( bDoAsynchronGraphicLoading && rGrafObj.IsSwappedOut() ) { - // #i102380# force Swap-In for GraphicObjects on MasterPage to have a nicer visualisation - bDoAsynchronGraphicLoading = false; + // sometimes it is needed that each graphic is completely available and swapped in + // for these cases a ForceSwapIn is called later at the graphic object + if ( rGrafObj.GetPage() && rGrafObj.GetPage()->IsMasterPage() ) + { + // #i102380# force Swap-In for GraphicObjects on MasterPage to have a nicer visualisation + bDoAsynchronGraphicLoading = false; + } + else if ( GetObjectContact().isOutputToPrinter() + || GetObjectContact().isOutputToRecordingMetaFile() + || GetObjectContact().isOutputToPDFFile() ) + { + bDoAsynchronGraphicLoading = false; + bSwapInExclusive = true; + } } - - if(bDoAsynchronGraphicLoading && !bSuppressAsynchLoading) + if( bDoAsynchronGraphicLoading ) { bSwapInDone = const_cast< ViewObjectContactOfGraphic* >(this)->impPrepareGraphicWithAsynchroniousLoading(); } @@ -293,10 +301,8 @@ namespace sdr } } - // if swap in was forced only for printing, swap out again - const bool bSwapInExclusiveForPrinting(bSwapInDone && GetObjectContact().isOutputToPrinter()); - - if(bSwapInExclusiveForPrinting) + // if swap in was forced only for printing metafile and pdf, swap out again + if( bSwapInDone && bSwapInExclusive ) { rGrafObj.ForceSwapOut(); } diff --git a/svx/source/svdraw/svdmodel.cxx b/svx/source/svdraw/svdmodel.cxx index 2f268db7910b..015631d6d11d 100644 --- a/svx/source/svdraw/svdmodel.cxx +++ b/svx/source/svdraw/svdmodel.cxx @@ -207,6 +207,8 @@ void SdrModel::ImpCtor(SfxItemPool* pPool, ::comphelper::IEmbeddedHelper* _pEmbe else nDefTextHgt = SdrEngineDefaults::GetFontHeight(); + pItemPool->SetPoolDefaultItem( SdrTextWordWrapItem( sal_False ) ); + SetTextDefaults(); pLayerAdmin=new SdrLayerAdmin; pLayerAdmin->SetModel(this); diff --git a/svx/source/svdraw/svdograf.cxx b/svx/source/svdraw/svdograf.cxx index d1f65c30050d..27c96f6c819d 100644 --- a/svx/source/svdraw/svdograf.cxx +++ b/svx/source/svdraw/svdograf.cxx @@ -45,6 +45,7 @@ #include <vcl/svapp.hxx> #include <sfx2/linkmgr.hxx> +#include <sfx2/docfile.hxx> #include <svx/svdetc.hxx> #include "svdglob.hxx" #include "svdstr.hrc" @@ -69,6 +70,8 @@ #include <svx/sdr/contact/viewcontactofgraphic.hxx> #include <basegfx/polygon/b2dpolygon.hxx> #include <basegfx/polygon/b2dpolygontools.hxx> +#include <osl/thread.hxx> +#include <vos/mutex.hxx> using namespace ::com::sun::star::uno; using namespace ::com::sun::star::io; @@ -80,13 +83,48 @@ using namespace ::com::sun::star::io; #define GRAFSTREAMPOS_INVALID 0xffffffff #define SWAPGRAPHIC_TIMEOUT 5000 + // ------------------ // - SdrGraphicLink - // ------------------ + +const Graphic ImpLoadLinkedGraphic( const String& rFileName, const String& rFilterName ) +{ + Graphic aGraphic; + + SfxMedium xMed( rFileName, STREAM_STD_READ, TRUE ); + xMed.DownLoad(); + + SvStream* pInStrm = xMed.GetInStream(); + if ( pInStrm ) + { + pInStrm->Seek( STREAM_SEEK_TO_BEGIN ); + GraphicFilter* pGF = GraphicFilter::GetGraphicFilter(); + + const USHORT nFilter = rFilterName.Len() && pGF->GetImportFormatCount() + ? pGF->GetImportFormatNumber( rFilterName ) + : GRFILTER_FORMAT_DONTKNOW; + + String aEmptyStr; + com::sun::star::uno::Sequence< com::sun::star::beans::PropertyValue > aFilterData( 1 ); + + // Room for improvment: + // As this is a linked graphic the GfxLink is not needed if saving/loading our own format. + // But this link is required by some filters to access the native graphic (pdf export/ms export), + // there we should create a new service to provide this data if needed + aFilterData[ 0 ].Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "CreateNativeLink" ) ); + aFilterData[ 0 ].Value = Any( sal_True ); + pGF->ImportGraphic( aGraphic, aEmptyStr, *pInStrm, nFilter, NULL, 0, &aFilterData ); + } + return aGraphic; +} + +class SdrGraphicUpdater; class SdrGraphicLink : public sfx2::SvBaseLink { SdrGrafObj* pGrafObj; + SdrGraphicUpdater* pGraphicUpdater; public: SdrGraphicLink(SdrGrafObj* pObj); @@ -95,16 +133,87 @@ public: virtual void Closed(); virtual void DataChanged( const String& rMimeType, const ::com::sun::star::uno::Any & rValue ); + void DataChanged( const Graphic& rGraphic ); BOOL Connect() { return 0 != GetRealObject(); } - void UpdateSynchron(); + void UpdateAsynchron(); + void RemoveGraphicUpdater(); }; +class SdrGraphicUpdater : public ::osl::Thread +{ +public: + SdrGraphicUpdater( const String& rFileName, const String& rFilterName, SdrGraphicLink& ); + virtual ~SdrGraphicUpdater( void ); + + void SAL_CALL Terminate( void ); + + sal_Bool GraphicLinkChanged( const String& rFileName ){ return mrFileName != rFileName; }; + +protected: + + /** is called from the inherited create method and acts as the + main function of this thread. + */ + virtual void SAL_CALL run(void); + + /** Called after the thread is terminated via the terminate + method. Used to kill the thread by calling delete on this. + */ + virtual void SAL_CALL onTerminated(void); + +private: + + ::osl::Mutex maMutex; + const String& mrFileName; + const String& mrFilterName; + SdrGraphicLink& mrGraphicLink; + + volatile bool mbIsTerminated; +}; + +SdrGraphicUpdater::SdrGraphicUpdater( const String& rFileName, const String& rFilterName, SdrGraphicLink& rGraphicLink ) +: mrFileName( rFileName ) +, mrFilterName( rFilterName ) +, mrGraphicLink( rGraphicLink ) +, mbIsTerminated( sal_False ) +{ + create(); +} + +SdrGraphicUpdater::~SdrGraphicUpdater( void ) +{ +} + +void SdrGraphicUpdater::Terminate() +{ + ::osl::MutexGuard aGuard( maMutex ); + mbIsTerminated = sal_True; +} + +void SAL_CALL SdrGraphicUpdater::onTerminated(void) +{ + delete this; +} + +void SAL_CALL SdrGraphicUpdater::run(void) +{ + Graphic aGraphic( ImpLoadLinkedGraphic( mrFileName, mrFilterName ) ); + ::osl::MutexGuard aGuard(maMutex); + vos::OGuard aSolarGuard( Application::GetSolarMutex() ); + if ( !mbIsTerminated ) + { + mrGraphicLink.DataChanged( aGraphic ); + mrGraphicLink.RemoveGraphicUpdater(); + } +} + // ----------------------------------------------------------------------------- -SdrGraphicLink::SdrGraphicLink(SdrGrafObj* pObj): - ::sfx2::SvBaseLink( ::sfx2::LINKUPDATE_ONCALL, SOT_FORMATSTR_ID_SVXB ), - pGrafObj(pObj) +SdrGraphicLink::SdrGraphicLink(SdrGrafObj* pObj) +: ::sfx2::SvBaseLink( ::sfx2::LINKUPDATE_ONCALL, SOT_FORMATSTR_ID_SVXB ) +, pGrafObj( pObj ) +, pGraphicUpdater( NULL ) { SetSynchron( FALSE ); } @@ -113,6 +222,22 @@ SdrGraphicLink::SdrGraphicLink(SdrGrafObj* pObj): SdrGraphicLink::~SdrGraphicLink() { + if ( pGraphicUpdater ) + pGraphicUpdater->Terminate(); +} + +// ----------------------------------------------------------------------------- + +void SdrGraphicLink::DataChanged( const Graphic& rGraphic ) +{ + pGrafObj->ImpSetLinkedGraphic( rGraphic ); +} + +// ----------------------------------------------------------------------------- + +void SdrGraphicLink::RemoveGraphicUpdater() +{ + pGraphicUpdater = NULL; } // ----------------------------------------------------------------------------- @@ -135,9 +260,8 @@ void SdrGraphicLink::DataChanged( const String& rMimeType, } else if( SotExchange::GetFormatIdFromMimeType( rMimeType ) != sfx2::LinkManager::RegisterStatusInfoId() ) { - // only repaint, no objectchange - pGrafObj->ActionChanged(); - // pGrafObj->BroadcastObjectChange(); + // broadcasting, to update slidesorter + pGrafObj->BroadcastObjectChange(); } } } @@ -155,14 +279,20 @@ void SdrGraphicLink::Closed() // ----------------------------------------------------------------------------- -void SdrGraphicLink::UpdateSynchron() +void SdrGraphicLink::UpdateAsynchron() { if( GetObj() ) { - String aMimeType( SotExchange::GetFormatMimeType( GetContentType() )); - ::com::sun::star::uno::Any aValue; - GetObj()->GetData( aValue, aMimeType, TRUE ); - DataChanged( aMimeType, aValue ); + if ( pGraphicUpdater ) + { + if ( pGraphicUpdater->GraphicLinkChanged( pGrafObj->GetFileName() ) ) + { + pGraphicUpdater->Terminate(); + pGraphicUpdater = new SdrGraphicUpdater( pGrafObj->GetFileName(), pGrafObj->GetFilterName(), *this ); + } + } + else + pGraphicUpdater = new SdrGraphicUpdater( pGrafObj->GetFileName(), pGrafObj->GetFilterName(), *this ); } } @@ -447,8 +577,10 @@ void SdrGrafObj::ForceSwapIn() const const_cast< SdrGrafObj* >( this )->mbIsPreview = sal_False; } - - pGraphic->FireSwapInRequest(); + if ( pGraphicLink && pGraphic->IsSwappedOut() ) + ImpUpdateGraphicLink( sal_False ); + else + pGraphic->FireSwapInRequest(); if( pGraphic->IsSwappedOut() || ( pGraphic->GetType() == GRAPHIC_NONE ) || @@ -558,24 +690,36 @@ UINT16 SdrGrafObj::GetObjIdentifier() const // ----------------------------------------------------------------------------- -sal_Bool SdrGrafObj::ImpUpdateGraphicLink() const +/* The graphic of the GraphicLink will be loaded. If it is called with + bAsynchron = true then the graphic will be set later via DataChanged +*/ +sal_Bool SdrGrafObj::ImpUpdateGraphicLink( sal_Bool bAsynchron ) const { - sal_Bool bRet = sal_False; - + sal_Bool bRet = sal_False; if( pGraphicLink ) { - const sal_Bool bIsChanged = pModel->IsChanged(); - pGraphicLink->UpdateSynchron(); - pModel->SetChanged( bIsChanged ); - + if ( bAsynchron ) + pGraphicLink->UpdateAsynchron(); + else + pGraphicLink->DataChanged( ImpLoadLinkedGraphic( aFileName, aFilterName ) ); bRet = sal_True; } - return bRet; } // ----------------------------------------------------------------------------- +void SdrGrafObj::ImpSetLinkedGraphic( const Graphic& rGraphic ) +{ + const sal_Bool bIsChanged = GetModel()->IsChanged(); + NbcSetGraphic( rGraphic ); + ActionChanged(); + BroadcastObjectChange(); + GetModel()->SetChanged( bIsChanged ); +} + +// ----------------------------------------------------------------------------- + void SdrGrafObj::TakeObjNameSingul(XubString& rName) const { switch( pGraphic->GetType() ) @@ -1095,7 +1239,7 @@ IMPL_LINK( SdrGrafObj, ImpSwapHdl, GraphicObject*, pO ) if( ( pGraphic->HasUserData() || pGraphicLink ) && ( nSwapMode & SDR_SWAPGRAPHICSMODE_PURGE ) ) { - pRet = NULL; + pRet = GRFMGR_AUTOSWAPSTREAM_LINK; } else if( nSwapMode & SDR_SWAPGRAPHICSMODE_TEMP ) { @@ -1180,7 +1324,7 @@ IMPL_LINK( SdrGrafObj, ImpSwapHdl, GraphicObject*, pO ) } } } - else if( !ImpUpdateGraphicLink() ) + else if( !ImpUpdateGraphicLink( sal_False ) ) { pRet = GRFMGR_AUTOSWAPSTREAM_TEMP; } |