Author: alg
Date: Mon Feb 10 22:24:18 2014
New Revision: 1566765

URL: http://svn.apache.org/r1566765
Log:
i15508 keep trhe original file and format AFAP when breaking links to graphic 
contents in Writer

Modified:
    openoffice/trunk/main/sw/source/core/graphic/ndgrf.cxx

Modified: openoffice/trunk/main/sw/source/core/graphic/ndgrf.cxx
URL: 
http://svn.apache.org/viewvc/openoffice/trunk/main/sw/source/core/graphic/ndgrf.cxx?rev=1566765&r1=1566764&r2=1566765&view=diff
==============================================================================
--- openoffice/trunk/main/sw/source/core/graphic/ndgrf.cxx (original)
+++ openoffice/trunk/main/sw/source/core/graphic/ndgrf.cxx Mon Feb 10 22:24:18 
2014
@@ -739,21 +739,57 @@ void SwGrfNode::InsertLink( const String
 
 void SwGrfNode::ReleaseLink()
 {
-       if( refLink.Is() )
-       {
-               // erst die Grafik reinswappen!
-//             if( aGraphic.IsSwapOut() || !refLink->IsSynchron() )
-               {
-                       bInSwapIn = sal_True;
+    if( refLink.Is() )
+    {
+        // #15508# remember some stuff from the linked graphic
+        const String aFileName(maGrfObj.GetLink());
+        const Graphic aLocalGraphic(maGrfObj.GetGraphic());
+        const bool bHasOriginalData(aLocalGraphic.IsLink());
+
+        {
+            bInSwapIn = sal_True;
             SwBaseLink* pLink = (SwBaseLink*)(::sfx2::SvBaseLink*) refLink;
             //TODO pLink->setInputStream(getInputStream());
-                       pLink->SwapIn( sal_True, sal_True );
-                       bInSwapIn = sal_False;
-               }
+            pLink->SwapIn( sal_True, sal_True );
+            bInSwapIn = sal_False;
+        }
+
         getIDocumentLinksAdministration()->GetLinkManager().Remove( refLink );
-               refLink.Clear();
-               maGrfObj.SetLink();
-       }
+        refLink.Clear();
+        maGrfObj.SetLink();
+
+        // #15508# added extra processing after getting rid of the link. Use 
whatever is
+        // known from the formally linked graphic to get to a state as close 
to a directly
+        // unlinked insterted graphic as possible. Goal is to have a valid 
GfxLink at the
+        // ImplGraphic (see there) that holds temporary data to the original 
data and type
+        // information about the original data. Only when this is given will
+        // SvXMLGraphicHelper::ImplInsertGraphicURL which is used at export 
use that type
+        // and use the original graphic at export for the ODF, without evtl. 
recoding
+        // of trhe bitmap graphic data to something without loss (e.g. PNG) 
but bigger
+        if(bHasOriginalData)
+        {
+            // #15508# if we have the original data at the Graphic, let it 
survive
+            // by using that Graphic again, this time at a GraphicObject 
without link.
+            // This happens e.g. when inserting a linked graphic and breaking 
the link
+            maGrfObj.SetGraphic(aLocalGraphic);
+        }
+        else if(aFileName.Len())
+        {
+            // #15508# we have no original data, but a file name. This happens 
e.g.
+            // when inserting a linked graphic and save, reload document. Try 
to access
+            // that data from the original file; if this works, use it. Else 
use the
+            // data we have (but without knowing the original format)
+            int nRes = GRFILTER_OK;
+            GraphicFilter* pFlt = GraphicFilter::GetGraphicFilter();
+            Graphic aNew;
+            nRes = GraphicFilter::LoadGraphic( aFileName, String(), aNew, 
pFlt);
+
+            if(GRFILTER_OK == nRes)
+            {
+                maGrfObj.SetGraphic(aNew);
+            }
+        }
+    }
 }
 
 


Reply via email to