[Libreoffice-commits] .: Branch 'libreoffice-3-6' - oox/inc oox/source sc/source

Libreoffice Gerrit user logerrit at kemper.freedesktop.org
Mon Dec 17 21:04:59 PST 2012


 oox/inc/oox/core/relations.hxx            |    2 ++
 oox/source/core/relations.cxx             |    6 ++++++
 oox/source/drawingml/hyperlinkcontext.cxx |    5 +++++
 sc/source/filter/inc/worksheetbuffer.hxx  |    4 ++++
 sc/source/filter/oox/drawingfragment.cxx  |   21 ++++++++++++++++++++-
 sc/source/filter/oox/worksheetbuffer.cxx  |   19 +++++++++++++++++++
 6 files changed, 56 insertions(+), 1 deletion(-)

New commits:
commit 9f576bac2267bb143058a343255ab2ad47869847
Author: Noel Power <noel.power at suse.com>
Date:   Thu Dec 13 16:26:58 2012 +0000

    fix fdo#58237 import hyperlinks for shapes in xlsx documents
    
    Change-Id: Ib0c661dbb3ce9a2f8c8d29707a1cf0c65aadc81f
    Reviewed-on: https://gerrit.libreoffice.org/1337
    Reviewed-by: Kohei Yoshida <kohei.yoshida at gmail.com>
    Tested-by: Kohei Yoshida <kohei.yoshida at gmail.com>

diff --git a/oox/inc/oox/core/relations.hxx b/oox/inc/oox/core/relations.hxx
index e7d558b..67f298e 100644
--- a/oox/inc/oox/core/relations.hxx
+++ b/oox/inc/oox/core/relations.hxx
@@ -88,6 +88,8 @@ public:
 
     /** Returns the external target of the relation with the passed relation identifier. */
     ::rtl::OUString     getExternalTargetFromRelId( const ::rtl::OUString& rRelId ) const;
+    /** Returns the internal target of the relation with the passed relation identifier. */
+    ::rtl::OUString     getInternalTargetFromRelId( const ::rtl::OUString& rRelId ) const;
 
     /** Returns the full fragment path for the target of the passed relation. */
     ::rtl::OUString     getFragmentPathFromRelation( const Relation& rRelation ) const;
diff --git a/oox/source/core/relations.cxx b/oox/source/core/relations.cxx
index ef9510c..ad39489 100644
--- a/oox/source/core/relations.cxx
+++ b/oox/source/core/relations.cxx
@@ -92,6 +92,12 @@ OUString Relations::getExternalTargetFromRelId( const OUString& rRelId ) const
     return (pRelation && pRelation->mbExternal) ? pRelation->maTarget : OUString();
 }
 
+OUString Relations::getInternalTargetFromRelId( const OUString& rRelId ) const
+{
+    const Relation* pRelation = getRelationFromRelId( rRelId );
+    return (pRelation && !pRelation->mbExternal) ? pRelation->maTarget : OUString();
+}
+
 OUString Relations::getFragmentPathFromRelation( const Relation& rRelation ) const
 {
     // no target, no fragment path
diff --git a/oox/source/drawingml/hyperlinkcontext.cxx b/oox/source/drawingml/hyperlinkcontext.cxx
index 06958aa..ed03ddd 100644
--- a/oox/source/drawingml/hyperlinkcontext.cxx
+++ b/oox/source/drawingml/hyperlinkcontext.cxx
@@ -59,6 +59,11 @@ HyperLinkContext::HyperLinkContext( ContextHandler& rParent,
             OSL_TRACE("OOX: URI href %s", ::rtl::OUStringToOString (sHref, RTL_TEXTENCODING_UTF8).pData->buffer);
             sURL = getFilter().getAbsoluteUrl( sHref );
         }
+        else
+        {
+            // not sure if we also need to set sHref to the internal target
+            sURL = getRelations().getInternalTargetFromRelId( aRelId );
+        }
     }
     OUString sTooltip = xAttributes->getOptionalValue( R_TOKEN( tooltip ) );
     if ( !sTooltip.isEmpty() )
diff --git a/sc/source/filter/inc/worksheetbuffer.hxx b/sc/source/filter/inc/worksheetbuffer.hxx
index e527a72..3402518 100644
--- a/sc/source/filter/inc/worksheetbuffer.hxx
+++ b/sc/source/filter/inc/worksheetbuffer.hxx
@@ -90,6 +90,10 @@ public:
     sal_Int16           getCalcSheetIndex( const ::rtl::OUString& rWorksheetName ) const;
     /** Returns the finalized name of the sheet with the passed worksheet name. */
     ::rtl::OUString     getCalcSheetName( const ::rtl::OUString& rWorksheetName ) const;
+    /** Converts sSheetNameRef (e.g. '#SheetName!A1' to '#SheetName.A1' )
+        if sSheetNameRef doesn't start with '#' it is ignored and not modified
+    */
+    void                convertSheetNameRef( ::rtl::OUString& sSheetNameRef ) const;
 
 private:
     struct SheetInfo : public SheetInfoModel
diff --git a/sc/source/filter/oox/drawingfragment.cxx b/sc/source/filter/oox/drawingfragment.cxx
index 73e6b47..6e8dc5e 100644
--- a/sc/source/filter/oox/drawingfragment.cxx
+++ b/sc/source/filter/oox/drawingfragment.cxx
@@ -35,6 +35,9 @@
 #include <com/sun/star/script/ScriptEventDescriptor.hpp>
 #include <com/sun/star/script/XEventAttacherManager.hpp>
 #include <rtl/strbuf.hxx>
+#include <svx/svdobj.hxx>
+#include "drwlayer.hxx"
+#include "userdat.hxx"
 #include "oox/drawingml/connectorshapecontext.hxx"
 #include "oox/drawingml/graphicshapecontext.hxx"
 #include "oox/helper/attributelist.hxx"
@@ -45,7 +48,7 @@
 #include "stylesbuffer.hxx"
 #include "themebuffer.hxx"
 #include "unitconverter.hxx"
-
+#include "worksheetbuffer.hxx"
 namespace oox {
 namespace xls {
 
@@ -66,6 +69,10 @@ using namespace ::oox::core;
 using namespace ::oox::drawingml;
 using namespace ::oox::ole;
 
+using ::com::sun::star::awt::Size;
+using ::com::sun::star::awt::Point;
+using ::com::sun::star::awt::Rectangle;
+using ::com::sun::star::awt::XControlModel;
 using ::rtl::OStringBuffer;
 using ::rtl::OUString;
 using ::rtl::OUStringToOString;
@@ -110,12 +117,24 @@ Shape::Shape( const WorksheetHelper& rHelper, const AttributeList& rAttribs, con
 
 void Shape::finalizeXShape( XmlFilterBase& rFilter, const Reference< XShapes >& rxShapes )
 {
+    rtl::OUString sURL;
+    getShapeProperties()[ PROP_URL ] >>= sURL;
+    getWorksheets().convertSheetNameRef( sURL );
     if( !maMacroName.isEmpty() && mxShape.is() )
     {
         VbaMacroAttacherRef xAttacher( new ShapeMacroAttacher( maMacroName, mxShape ) );
         getBaseFilter().getVbaProject().registerMacroAttacher( xAttacher );
     }
     ::oox::drawingml::Shape::finalizeXShape( rFilter, rxShapes );
+    if ( !sURL.isEmpty() )
+    {
+        SdrObject* pObj = SdrObject::getSdrObjectFromXShape( mxShape );
+        if ( pObj )
+        {
+            if ( ScMacroInfo* pInfo = ScDrawLayer::GetMacroInfo( pObj, sal_True ) )
+                pInfo->SetHlink( sURL );
+        }
+    }
 }
 
 // ============================================================================
diff --git a/sc/source/filter/oox/worksheetbuffer.cxx b/sc/source/filter/oox/worksheetbuffer.cxx
index 8e092ac..f315eeb 100644
--- a/sc/source/filter/oox/worksheetbuffer.cxx
+++ b/sc/source/filter/oox/worksheetbuffer.cxx
@@ -119,6 +119,25 @@ OUString WorksheetBuffer::getCalcSheetName( sal_Int32 nWorksheet ) const
     return pSheetInfo ? pSheetInfo->maCalcName : OUString();
 }
 
+void WorksheetBuffer::convertSheetNameRef( ::rtl::OUString& sSheetNameRef ) const
+{
+    // convert '#SheetName!A1' to '#SheetName.A1'
+    if( !sSheetNameRef.isEmpty() && (sSheetNameRef[ 0 ] == '#') )
+    {
+        sal_Int32 nSepPos = sSheetNameRef.lastIndexOf( '!' );
+        if( nSepPos > 0 )
+        {
+            // replace the exclamation mark with a period
+            sSheetNameRef = sSheetNameRef.replaceAt( nSepPos, 1, OUString( sal_Unicode( '.' ) ) );
+            // #i66592# convert sheet names that have been renamed on import
+            OUString aSheetName = sSheetNameRef.copy( 1, nSepPos - 1 );
+            OUString aCalcName = getCalcSheetName( aSheetName );
+            if( !aCalcName.isEmpty() )
+                sSheetNameRef = sSheetNameRef.replaceAt( 1, nSepPos - 1, aCalcName );
+        }
+    }
+}
+
 sal_Int16 WorksheetBuffer::getCalcSheetIndex( const OUString& rWorksheetName ) const
 {
     const SheetInfo* pSheetInfo = maSheetInfosByName.get( rWorksheetName ).get();


More information about the Libreoffice-commits mailing list