Kaydet (Commit) 5deba0e7 authored tarafından Noel Power's avatar Noel Power

fix fdo#58237 import hyperlinks for shapes in xlsx documents

Change-Id: I9c64c0f4d1eb8533b65f35d5e85e1ab4881a2b67
üst 64f98aa1
helpcontent2 @ 56562e9b
Subproject commit ca261267f5f67d4932e0046e0358e8d0fb8b4d1b
Subproject commit 56562e9b04dcbfd63012eecddb53b76dc4cee84b
......@@ -79,6 +79,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;
......
......@@ -83,6 +83,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
......
......@@ -49,6 +49,11 @@ HyperLinkContext::HyperLinkContext( ContextHandler& rParent,
OSL_TRACE("OOX: URI href %s", 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() )
......
......@@ -81,6 +81,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
......
......@@ -26,6 +26,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"
......@@ -36,11 +39,10 @@
#include "stylesbuffer.hxx"
#include "themebuffer.hxx"
#include "unitconverter.hxx"
#include "worksheetbuffer.hxx"
namespace oox {
namespace xls {
using namespace ::com::sun::star::awt;
using namespace ::com::sun::star::beans;
using namespace ::com::sun::star::container;
using namespace ::com::sun::star::document;
......@@ -53,6 +55,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;
......@@ -97,12 +103,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 );
}
}
}
// ============================================================================
......
......@@ -110,6 +110,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();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment