[Libreoffice-commits] core.git: embeddedobj/source include/svx sc/inc sc/source sd/source svx/source sw/source

Caolán McNamara caolanm at redhat.com
Thu Sep 15 11:56:30 UTC 2016


 embeddedobj/source/commonembedding/visobj.cxx             |    5 ++
 include/svx/svdoole2.hxx                                  |   16 ++++++++
 sc/inc/documentlinkmgr.hxx                                |    5 ++
 sc/source/ui/docshell/docsh.cxx                           |    7 ++-
 sc/source/ui/docshell/docsh4.cxx                          |   12 +++++-
 sc/source/ui/docshell/documentlinkmgr.cxx                 |   26 ++++++++++++--
 sc/source/ui/view/tabvwsh4.cxx                            |    2 -
 sd/source/core/drawdoc.cxx                                |    6 +++
 sd/source/ui/docshell/docshel4.cxx                        |    4 +-
 svx/source/svdraw/svdoole2.cxx                            |   16 --------
 sw/source/core/doc/DocumentLinksAdministrationManager.cxx |   21 +++++++----
 sw/source/uibase/app/docshini.cxx                         |    5 ++
 12 files changed, 90 insertions(+), 35 deletions(-)

New commits:
commit 74844277cc2194c9e43f5bd7a6f78a9603da32f3
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Tue Sep 13 15:26:41 2016 +0100

    disable generation of ole previews in ODF format until after load
    
    so the user update links dialog can control their generation
    
    SdrEmbedObjectLink becomes exposed to calc so it can
    detect if the link dialog needs to be used to update
    ole links.
    
    Change-Id: Id1dd7ea17342140eab9307d546528747e3a98090
    Reviewed-on: https://gerrit.libreoffice.org/28879
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>
    Tested-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/embeddedobj/source/commonembedding/visobj.cxx b/embeddedobj/source/commonembedding/visobj.cxx
index fea7c3a..6bf9c49 100644
--- a/embeddedobj/source/commonembedding/visobj.cxx
+++ b/embeddedobj/source/commonembedding/visobj.cxx
@@ -174,7 +174,10 @@ embed::VisualRepresentation SAL_CALL OCommonEmbeddedObject::getPreferredVisualRe
     bool bBackToLoaded = false;
     if ( m_nObjectState == embed::EmbedStates::LOADED )
     {
-        changeState( embed::EmbedStates::RUNNING );
+        awt::Size aOrigSize = getVisualAreaSize(nAspect);
+        changeState(embed::EmbedStates::RUNNING);
+        if (aOrigSize != getVisualAreaSize(nAspect))
+            setVisualAreaSize(nAspect, aOrigSize);
 
         // the links should be switched back to loaded state for now to avoid locking problems
         bBackToLoaded = m_bIsLink;
diff --git a/include/svx/svdoole2.hxx b/include/svx/svdoole2.hxx
index 3d78224..345f6eb 100644
--- a/include/svx/svdoole2.hxx
+++ b/include/svx/svdoole2.hxx
@@ -22,6 +22,7 @@
 
 #include <svx/svdorect.hxx>
 #include <svx/svxdllapi.h>
+#include <sfx2/linkmgr.hxx>
 
 #include <com/sun/star/uno/Reference.h>
 
@@ -175,6 +176,21 @@ public:
     virtual SdrObject* DoConvertToPolyObj(bool bBezier, bool bAddText) const override;
 };
 
+class SVX_DLLPUBLIC SdrEmbedObjectLink : public sfx2::SvBaseLink
+{
+    SdrOle2Obj*         pObj;
+
+public:
+    explicit            SdrEmbedObjectLink(SdrOle2Obj* pObj);
+    virtual             ~SdrEmbedObjectLink() override;
+
+    virtual void        Closed() override;
+    virtual ::sfx2::SvBaseLink::UpdateResult DataChanged(
+        const OUString& rMimeType, const css::uno::Any & rValue ) override;
+
+    bool                Connect() { return GetRealObject() != nullptr; }
+};
+
 #endif // INCLUDED_SVX_SVDOOLE2_HXX
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/inc/documentlinkmgr.hxx b/sc/inc/documentlinkmgr.hxx
index 4553470..d5d801a 100644
--- a/sc/inc/documentlinkmgr.hxx
+++ b/sc/inc/documentlinkmgr.hxx
@@ -55,14 +55,17 @@ public:
     bool idleCheckLinks();
 
     bool hasDdeLinks() const;
+    bool hasDdeOrOleLinks() const;
 
-    bool updateDdeLinks( vcl::Window* pWin );
+    bool updateDdeOrOleLinks(vcl::Window* pWin);
 
     void updateDdeLink( const OUString& rAppl, const OUString& rTopic, const OUString& rItem );
 
     size_t getDdeLinkCount() const;
 
     void disconnectDdeLinks();
+private:
+    bool hasDdeOrOleLinks(bool bDde, bool bOle) const;
 };
 
 }
diff --git a/sc/source/ui/docshell/docsh.cxx b/sc/source/ui/docshell/docsh.cxx
index 175059a..dadb9c5 100644
--- a/sc/source/ui/docshell/docsh.cxx
+++ b/sc/source/ui/docshell/docsh.cxx
@@ -567,9 +567,12 @@ bool ScDocShell::Load( SfxMedium& rMedium )
 
     GetUndoManager()->Clear();
 
-    bool bRet = SfxObjectShell::Load( rMedium );
-    if( bRet )
+    bool bRet = SfxObjectShell::Load(rMedium);
+    if (bRet)
     {
+        comphelper::EmbeddedObjectContainer& rEmbeddedObjectContainer = getEmbeddedObjectContainer();
+        rEmbeddedObjectContainer.setUserAllowsLinkUpdate(false);
+
         if (GetMedium())
         {
             const SfxUInt16Item* pUpdateDocItem = SfxItemSet::GetItem<SfxUInt16Item>(rMedium.GetItemSet(), SID_UPDATEDOCMODE, false);
diff --git a/sc/source/ui/docshell/docsh4.cxx b/sc/source/ui/docshell/docsh4.cxx
index 9d3fcb3..6d0f62a 100644
--- a/sc/source/ui/docshell/docsh4.cxx
+++ b/sc/source/ui/docshell/docsh4.cxx
@@ -30,6 +30,7 @@ using namespace ::com::sun::star;
 #include "scitems.hxx"
 #include <editeng/flstitem.hxx>
 #include <sfx2/fcontnr.hxx>
+#include <sfx2/linkmgr.hxx>
 #include <sfx2/objface.hxx>
 #include <sfx2/docfile.hxx>
 #include <svtools/ehdl.hxx>
@@ -42,6 +43,7 @@ using namespace ::com::sun::star;
 #include <svx/dataaccessdescriptor.hxx>
 #include <svx/drawitem.hxx>
 #include <svx/fmshell.hxx>
+#include <svx/svdoole2.hxx>
 #include <sfx2/passwd.hxx>
 #include <sfx2/filedlghelper.hxx>
 #include <sfx2/dispatch.hxx>
@@ -402,6 +404,9 @@ void ScDocShell::Execute( SfxRequest& rReq )
             break;
         case SID_UPDATETABLINKS:
             {
+                comphelper::EmbeddedObjectContainer& rEmbeddedObjectContainer = getEmbeddedObjectContainer();
+                rEmbeddedObjectContainer.setUserAllowsLinkUpdate(true);
+
                 ScDocument& rDoc = GetDocument();
 
                 ScLkUpdMode nSet = rDoc.GetLinkMode();
@@ -445,9 +450,9 @@ void ScDocShell::Execute( SfxRequest& rReq )
                     ReloadTabLinks();
                     aDocument.UpdateExternalRefLinks(GetActiveDialogParent());
 
-                    bool bAny = aDocument.GetDocLinkManager().updateDdeLinks(GetActiveDialogParent());
+                    bool bAnyDde = aDocument.GetDocLinkManager().updateDdeOrOleLinks(GetActiveDialogParent());
 
-                    if (bAny)
+                    if (bAnyDde)
                     {
                         //  Formeln berechnen und painten wie im TrackTimeHdl
                         aDocument.TrackFormulas();
@@ -463,7 +468,10 @@ void ScDocShell::Execute( SfxRequest& rReq )
                     rReq.Done();
                 }
                 else
+                {
+                    rEmbeddedObjectContainer.setUserAllowsLinkUpdate(false);
                     rReq.Ignore();
+                }
             }
             break;
 
diff --git a/sc/source/ui/docshell/documentlinkmgr.cxx b/sc/source/ui/docshell/documentlinkmgr.cxx
index 02f00e9..520b854 100644
--- a/sc/source/ui/docshell/documentlinkmgr.cxx
+++ b/sc/source/ui/docshell/documentlinkmgr.cxx
@@ -23,7 +23,7 @@
 #include <sc.hrc>
 #include <scresid.hxx>
 
-#include <sfx2/linkmgr.hxx>
+#include <svx/svdoole2.hxx>
 #include <vcl/layout.hxx>
 
 #include <memory>
@@ -115,6 +115,16 @@ bool DocumentLinkManager::idleCheckLinks()
 
 bool DocumentLinkManager::hasDdeLinks() const
 {
+    return hasDdeOrOleLinks(true, false);
+}
+
+bool DocumentLinkManager::hasDdeOrOleLinks() const
+{
+    return hasDdeOrOleLinks(true, true);
+}
+
+bool DocumentLinkManager::hasDdeOrOleLinks(bool bDde, bool bOle) const
+{
     if (!mpImpl->mpLinkManager)
         return false;
 
@@ -122,14 +132,16 @@ bool DocumentLinkManager::hasDdeLinks() const
     for (const auto & rLink : rLinks)
     {
         sfx2::SvBaseLink* pBase = rLink.get();
-        if (dynamic_cast<ScDdeLink*>(pBase))
+        if (bDde && dynamic_cast<ScDdeLink*>(pBase))
+            return true;
+        if (bOle && dynamic_cast<SdrEmbedObjectLink*>(pBase))
             return true;
     }
 
     return false;
 }
 
-bool DocumentLinkManager::updateDdeLinks( vcl::Window* pWin )
+bool DocumentLinkManager::updateDdeOrOleLinks( vcl::Window* pWin )
 {
     if (!mpImpl->mpLinkManager)
         return false;
@@ -143,6 +155,14 @@ bool DocumentLinkManager::updateDdeLinks( vcl::Window* pWin )
     for (const auto & rLink : rLinks)
     {
         sfx2::SvBaseLink* pBase = rLink.get();
+
+        SdrEmbedObjectLink* pOleLink = dynamic_cast<SdrEmbedObjectLink*>(pBase);
+        if (pOleLink)
+        {
+            pOleLink->Update();
+            continue;
+        }
+
         ScDdeLink* pDdeLink = dynamic_cast<ScDdeLink*>(pBase);
         if (!pDdeLink)
             continue;
diff --git a/sc/source/ui/view/tabvwsh4.cxx b/sc/source/ui/view/tabvwsh4.cxx
index 7e7dba3..6da7a8a 100644
--- a/sc/source/ui/view/tabvwsh4.cxx
+++ b/sc/source/ui/view/tabvwsh4.cxx
@@ -1566,7 +1566,7 @@ void ScTabViewShell::Construct( TriState nForceDesignMode )
             if (!bLink)
             {
                 const sc::DocumentLinkManager& rMgr = rDoc.GetDocLinkManager();
-                if (rMgr.hasDdeLinks() || rDoc.HasAreaLinks())
+                if (rMgr.hasDdeOrOleLinks() || rDoc.HasAreaLinks())
                     bLink = true;
             }
             if (bLink)
diff --git a/sd/source/core/drawdoc.cxx b/sd/source/core/drawdoc.cxx
index c448609..809ed3e 100644
--- a/sd/source/core/drawdoc.cxx
+++ b/sd/source/core/drawdoc.cxx
@@ -720,6 +720,12 @@ void SdDrawDocument::UpdateAllLinks()
     {
         s_pDocLockedInsertingLinks = this; // lock inserting links. only links in this document should by resolved
 
+        if (mpDocSh)
+        {
+            comphelper::EmbeddedObjectContainer& rEmbeddedObjectContainer = mpDocSh->getEmbeddedObjectContainer();
+            rEmbeddedObjectContainer.setUserAllowsLinkUpdate(true);
+        }
+
         pLinkManager->UpdateAllLinks();  // query box: update all links?
 
         if (s_pDocLockedInsertingLinks == this)
diff --git a/sd/source/ui/docshell/docshel4.cxx b/sd/source/ui/docshell/docshel4.cxx
index 71746fd..3668a95 100644
--- a/sd/source/ui/docshell/docshel4.cxx
+++ b/sd/source/ui/docshell/docshel4.cxx
@@ -293,8 +293,10 @@ bool DrawDocShell::Load( SfxMedium& rMedium )
     }
 
     bRet = SfxObjectShell::Load( rMedium );
-    if( bRet )
+    if (bRet)
     {
+        comphelper::EmbeddedObjectContainer& rEmbeddedObjectContainer = getEmbeddedObjectContainer();
+        rEmbeddedObjectContainer.setUserAllowsLinkUpdate(false);
         bRet = SdXMLFilter( rMedium, *this, SDXMLMODE_Normal, SotStorage::GetVersion( rMedium.GetStorage() ) ).Import( nError );
     }
 
diff --git a/svx/source/svdraw/svdoole2.cxx b/svx/source/svdraw/svdoole2.cxx
index 4bc6459..2c9bdca 100644
--- a/svx/source/svdraw/svdoole2.cxx
+++ b/svx/source/svdraw/svdoole2.cxx
@@ -58,7 +58,6 @@
 #include <comphelper/classids.hxx>
 
 #include <sot/formats.hxx>
-#include <sfx2/linkmgr.hxx>
 #include <svtools/transfer.hxx>
 #include <cppuhelper/implbase.hxx>
 
@@ -569,21 +568,6 @@ void SdrLightEmbeddedClient_Impl::setWindow(const uno::Reference< awt::XWindow >
     m_xWindow = _xWindow;
 }
 
-class SdrEmbedObjectLink : public sfx2::SvBaseLink
-{
-    SdrOle2Obj*         pObj;
-
-public:
-    explicit            SdrEmbedObjectLink(SdrOle2Obj* pObj);
-    virtual             ~SdrEmbedObjectLink() override;
-
-    virtual void        Closed() override;
-    virtual ::sfx2::SvBaseLink::UpdateResult DataChanged(
-        const OUString& rMimeType, const css::uno::Any & rValue ) override;
-
-    bool                Connect() { return GetRealObject() != nullptr; }
-};
-
 SdrEmbedObjectLink::SdrEmbedObjectLink(SdrOle2Obj* pObject):
     ::sfx2::SvBaseLink( ::SfxLinkUpdateMode::ONCALL, SotClipboardFormatId::SVXB ),
     pObj(pObject)
diff --git a/sw/source/core/doc/DocumentLinksAdministrationManager.cxx b/sw/source/core/doc/DocumentLinksAdministrationManager.cxx
index ea88e9a..0949aa7 100644
--- a/sw/source/core/doc/DocumentLinksAdministrationManager.cxx
+++ b/sw/source/core/doc/DocumentLinksAdministrationManager.cxx
@@ -201,12 +201,6 @@ void DocumentLinksAdministrationManager::UpdateLinks()
 {
     if (!m_rDoc.GetDocShell())
         return;
-    sal_uInt16 nLinkMode = m_rDoc.GetDocumentSettingManager().getLinkUpdateMode(true);
-    sal_uInt16 nUpdateDocMode = m_rDoc.GetDocShell()->GetUpdateDocMode();
-    if (nLinkMode == NEVER && nUpdateDocMode != document::UpdateDocMode::FULL_UPDATE)
-        return;
-    if (GetLinkManager().GetLinks().empty())
-        return;
     SfxObjectCreateMode eMode = m_rDoc.GetDocShell()->GetCreateMode();
     if (eMode == SfxObjectCreateMode::INTERNAL)
         return;
@@ -216,6 +210,12 @@ void DocumentLinksAdministrationManager::UpdateLinks()
         return;
     if (m_rDoc.GetDocShell()->IsPreview())
         return;
+    if (GetLinkManager().GetLinks().empty())
+        return;
+    sal_uInt16 nLinkMode = m_rDoc.GetDocumentSettingManager().getLinkUpdateMode(true);
+    sal_uInt16 nUpdateDocMode = m_rDoc.GetDocShell()->GetUpdateDocMode();
+    if (nLinkMode == NEVER && nUpdateDocMode != document::UpdateDocMode::FULL_UPDATE)
+        return;
 
     bool bAskUpdate = nLinkMode == MANUAL;
     bool bUpdate = true;
@@ -234,14 +234,21 @@ void DocumentLinksAdministrationManager::UpdateLinks()
             bAskUpdate = true;
         }
     }
-    if( bUpdate )
+    comphelper::EmbeddedObjectContainer& rEmbeddedObjectContainer = m_rDoc.GetDocShell()->getEmbeddedObjectContainer();
+    if (bUpdate)
     {
+        rEmbeddedObjectContainer.setUserAllowsLinkUpdate(true);
+
         SfxMedium* pMedium = m_rDoc.GetDocShell()->GetMedium();
         SfxFrame* pFrame = pMedium ? pMedium->GetLoadTargetFrame() : nullptr;
         vcl::Window* pDlgParent = pFrame ? &pFrame->GetWindow() : nullptr;
 
         GetLinkManager().UpdateAllLinks( bAskUpdate, true, false, pDlgParent );
     }
+    else
+    {
+        rEmbeddedObjectContainer.setUserAllowsLinkUpdate(false);
+    }
 }
 
 bool DocumentLinksAdministrationManager::GetData( const OUString& rItem, const OUString& rMimeType,
diff --git a/sw/source/uibase/app/docshini.cxx b/sw/source/uibase/app/docshini.cxx
index 5cb5c5c..51955a3 100644
--- a/sw/source/uibase/app/docshini.cxx
+++ b/sw/source/uibase/app/docshini.cxx
@@ -500,8 +500,11 @@ bool  SwDocShell::Load( SfxMedium& rMedium )
             m_pDoc->getIDocumentDrawModelAccess().GetDrawModel()->SetAnchoredTextOverflowLegacy(true);
     }
 
-    if( SfxObjectShell::Load( rMedium ))
+    if (SfxObjectShell::Load(rMedium))
     {
+        comphelper::EmbeddedObjectContainer& rEmbeddedObjectContainer = getEmbeddedObjectContainer();
+        rEmbeddedObjectContainer.setUserAllowsLinkUpdate(false);
+
         SAL_INFO( "sw.ui", "after SfxInPlaceObject::Load" );
         if (m_pDoc)              // for last version!!
             RemoveLink();       // release the existing


More information about the Libreoffice-commits mailing list