On 14/02/12 19:17, Petr Mladek wrote:
It did not work because the test document used linked picture. It
works well with the updated test document. The changes look
reasonable. They work well => I have pushed them into the 3-5 branch,
see
http://cgit.freedesktop.org/libreoffice/core/commit/?h=libreoffice-3-5&id=4ea4f80121eedc7f87d950ea8e15336fb691e52f
http://cgit.freedesktop.org/libreoffice/core/commit/?h=libreoffice-3-5&id=8015cd2cdbdb05b0048753e12b39fa940add2021
Noel, please ask for review once you have a working solution for 3.4
branch.
the solution for 3.4 is the same, the bogus test document fooled me into
thinking that the part addressed by
http://cgit.freedesktop.org/libreoffice/core/commit/?h=libreoffice-3-5&id=4ea4f80121eedc7f87d950ea8e15336fb691e52f
was already working in 3.4. I attach a version of that patch back-ported
to 3.4
thanks again
Noel
diff --git toolkit/inc/toolkit/controls/controlmodelcontainerbase.hxx
toolkit/inc/toolkit/controls/controlmodelcontainerbase.hxx
index 673f4d6..c4d2dd5 100644
--- toolkit/inc/toolkit/controls/controlmodelcontainerbase.hxx
+++ toolkit/inc/toolkit/controls/controlmodelcontainerbase.hxx
@@ -233,7 +233,6 @@ protected:
virtual void ImplSetPosSize( ::com::sun::star::uno::Reference<
::com::sun::star::awt::XControl >& rxCtrl );
void ImplUpdateResourceResolver();
void ImplStartListingForResourceEvents();
- ::com::sun::star::uno::Reference< ::com::sun::star::graphic::XGraphic >
Impl_getGraphicFromURL_nothrow( const ::rtl::OUString& _rURL );
ControlContainerBase();
diff --git toolkit/inc/toolkit/controls/dialogcontrol.hxx
toolkit/inc/toolkit/controls/dialogcontrol.hxx
index 78fc078..cf6717c 100644
--- toolkit/inc/toolkit/controls/dialogcontrol.hxx
+++ toolkit/inc/toolkit/controls/dialogcontrol.hxx
@@ -33,6 +33,7 @@
#include <com/sun/star/awt/XDialog2.hpp>
#include <com/sun/star/awt/XSimpleTabController.hpp>
#include <com/sun/star/resource/XStringResourceResolver.hpp>
+#include <com/sun/star/graphic/XGraphicObject.hpp>
#include "toolkit/helper/servicenames.hxx"
#include "toolkit/helper/macros.hxx"
#include <toolkit/controls/unocontrolcontainer.hxx>
@@ -47,8 +48,11 @@
class UnoControlDialogModel : public ControlModelContainerBase
{
protected:
+ ::com::sun::star::uno::Reference< ::com::sun::star::graphic::XGraphicObject > mxGrfObj;
::com::sun::star::uno::Any ImplGetDefaultValue( sal_uInt16 nPropId ) const;
::cppu::IPropertyArrayHelper& SAL_CALL getInfoHelper();
+ // ::cppu::OPropertySetHelper
+ void SAL_CALL setFastPropertyValue_NoBroadcast( sal_Int32 nHandle, const
::com::sun::star::uno::Any& rValue ) throw (::com::sun::star::uno::Exception);
public:
UnoControlDialogModel( const ::com::sun::star::uno::Reference<
::com::sun::star::lang::XMultiServiceFactory >& i_factory );
UnoControlDialogModel( const UnoControlDialogModel& rModel );
diff --git toolkit/inc/toolkit/controls/unocontrols.hxx toolkit/inc/toolkit/controls/unocontrols.hxx
index 91b8e2a..3fffee3 100644
--- toolkit/inc/toolkit/controls/unocontrols.hxx
+++ toolkit/inc/toolkit/controls/unocontrols.hxx
@@ -72,6 +72,19 @@
#define UNO_NAME_GRAPHOBJ_URLPREFIX "vnd.sun.star.GraphicObject:"
#define UNO_NAME_GRAPHOBJ_URLPKGPREFIX "vnd.sun.star.Package:"
+class ImageHelper
+{
+public:
+ // The routine will always attempt to return a valid XGraphic for the
+ // passed _rURL, additionallly xOutGraphicObject will contain the
+ // associated XGraphicObject ( if url is valid for that ) and is set
+ // appropriately ( e.g. NULL if non GraphicObject scheme ) or a valid
+ // object if the rURL points to a valid object
+ static ::com::sun::star::uno::Reference< ::com::sun::star::graphic::XGraphic >
getGraphicAndGraphicObjectFromURL_nothrow( ::com::sun::star::uno::Reference<
::com::sun::star::graphic::XGraphicObject >& xOutGraphicObject, const ::rtl::OUString& _rURL );
+ static ::com::sun::star::uno::Reference< ::com::sun::star::graphic::XGraphic >
getGraphicFromURL_nothrow( const ::rtl::OUString& _rURL );
+
+};
+
// ----------------------------------------------------
// class UnoControlEditModel
// ----------------------------------------------------
diff --git toolkit/source/controls/controlmodelcontainerbase.cxx
toolkit/source/controls/controlmodelcontainerbase.cxx
index 2be6fa2..f2dd50a 100644
--- toolkit/source/controls/controlmodelcontainerbase.cxx
+++ toolkit/source/controls/controlmodelcontainerbase.cxx
@@ -1842,31 +1842,6 @@ void ControlContainerBase::ImplUpdateResourceResolver()
}
}
-
-uno::Reference< graphic::XGraphic > ControlContainerBase::Impl_getGraphicFromURL_nothrow( const
::rtl::OUString& _rURL )
-{
- uno::Reference< graphic::XGraphic > xGraphic;
- if ( !_rURL.getLength() )
- return xGraphic;
-
- try
- {
- uno::Reference< graphic::XGraphicProvider > xProvider;
- if ( maContext.createComponent( "com.sun.star.graphic.GraphicProvider", xProvider ) )
- {
- uno::Sequence< beans::PropertyValue > aMediaProperties(1);
- aMediaProperties[0].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "URL" ) );
- aMediaProperties[0].Value <<= _rURL;
- xGraphic = xProvider->queryGraphic( aMediaProperties );
- }
- }
- catch( const Exception& )
- {
- DBG_UNHANDLED_EXCEPTION();
- }
-
- return xGraphic;
-}
//// ----------------------------------------------------
//// Helper Method to convert relative url to physical location
//// ----------------------------------------------------
diff --git toolkit/source/controls/dialogcontrol.cxx toolkit/source/controls/dialogcontrol.cxx
index 4aece91..8d565dd 100644
--- toolkit/source/controls/dialogcontrol.cxx
+++ toolkit/source/controls/dialogcontrol.cxx
@@ -62,6 +62,7 @@
#include <vcl/tabctrl.hxx>
#include <toolkit/awt/vclxwindows.hxx>
+#include "toolkit/controls/unocontrols.hxx"
using namespace ::com::sun::star;
using namespace ::com::sun::star::uno;
@@ -244,6 +245,23 @@ Reference< XPropertySetInfo > UnoControlDialogModel::getPropertySetInfo( )
thro
return xInfo;
}
+void SAL_CALL UnoControlDialogModel::setFastPropertyValue_NoBroadcast( sal_Int32 nHandle, const
::com::sun::star::uno::Any& rValue ) throw (::com::sun::star::uno::Exception)
+{
+ ControlModelContainerBase::setFastPropertyValue_NoBroadcast( nHandle, rValue );
+ try
+ {
+ if ( nHandle == BASEPROPERTY_IMAGEURL && ImplHasProperty( BASEPROPERTY_GRAPHIC ) )
+ {
+ ::rtl::OUString sImageURL;
+ OSL_VERIFY( rValue >>= sImageURL );
+ setPropertyValue( GetPropertyName( BASEPROPERTY_GRAPHIC ), uno::makeAny(
ImageHelper::getGraphicAndGraphicObjectFromURL_nothrow( mxGrfObj, sImageURL ) ) );
+ }
+ }
+ catch( const ::com::sun::star::uno::Exception& )
+ {
+ OSL_ENSURE( sal_False, "UnoControlDialogModel::setFastPropertyValue_NoBroadcast: caught an
exception while setting ImageURL properties!" );
+ }
+}
// ============================================================================
// = class UnoDialogControl
// ============================================================================
@@ -341,11 +359,12 @@ void UnoDialogControl::PrepareWindowDescriptor(
::com::sun::star::awt::WindowDes
if (( ImplGetPropertyValue( PROPERTY_IMAGEURL ) >>= aImageURL ) &&
( aImageURL.getLength() > 0 ))
{
- ::rtl::OUString absoluteUrl =
- getPhysicalLocation( ImplGetPropertyValue( PROPERTY_DIALOGSOURCEURL ),
- ImplGetPropertyValue( PROPERTY_IMAGEURL ));
+ ::rtl::OUString absoluteUrl = aImageURL;
+ if ( aImageURL.compareToAscii( UNO_NAME_GRAPHOBJ_URLPREFIX, RTL_CONSTASCII_LENGTH(
UNO_NAME_GRAPHOBJ_URLPREFIX ) ) != 0 )
+ absoluteUrl = getPhysicalLocation( ImplGetPropertyValue( PROPERTY_DIALOGSOURCEURL ),
+ uno::makeAny( aImageURL ) );
- xGraphic = ControlContainerBase::Impl_getGraphicFromURL_nothrow( absoluteUrl );
+ xGraphic = ImageHelper::getGraphicFromURL_nothrow( absoluteUrl );
ImplSetPropertyValue( PROPERTY_GRAPHIC, uno::makeAny( xGraphic ), sal_True );
}
}
@@ -566,11 +585,13 @@ void UnoDialogControl::ImplModelPropertiesChanged( const Sequence<
PropertyChang
if (( ImplGetPropertyValue( GetPropertyName( BASEPROPERTY_IMAGEURL ) ) >>= aImageURL )
&&
( aImageURL.getLength() > 0 ))
{
- ::rtl::OUString absoluteUrl =
- getPhysicalLocation( ImplGetPropertyValue( GetPropertyName(
BASEPROPERTY_DIALOGSOURCEURL )),
+ ::rtl::OUString absoluteUrl = aImageURL;
+ if ( aImageURL.compareToAscii( UNO_NAME_GRAPHOBJ_URLPREFIX, RTL_CONSTASCII_LENGTH(
UNO_NAME_GRAPHOBJ_URLPREFIX ) ) != 0 )
+
+ absoluteUrl = getPhysicalLocation( ImplGetPropertyValue( GetPropertyName(
BASEPROPERTY_DIALOGSOURCEURL )),
uno::makeAny(aImageURL));
- xGraphic = Impl_getGraphicFromURL_nothrow( absoluteUrl );
+ xGraphic = ImageHelper::getGraphicFromURL_nothrow( absoluteUrl );
}
ImplSetPropertyValue( GetPropertyName( BASEPROPERTY_GRAPHIC), uno::makeAny( xGraphic
), sal_True );
break;
diff --git toolkit/source/controls/unocontrols.cxx toolkit/source/controls/unocontrols.cxx
index 3fb2d18..7ee2193 100644
--- toolkit/source/controls/unocontrols.cxx
+++ toolkit/source/controls/unocontrols.cxx
@@ -89,7 +89,49 @@ using namespace ::toolkit;
} \
+uno::Reference< graphic::XGraphic >
+ImageHelper::getGraphicAndGraphicObjectFromURL_nothrow( uno::Reference< graphic::XGraphicObject >&
xOutGraphicObj, const ::rtl::OUString& _rURL )
+{
+ if( ( _rURL.compareToAscii( UNO_NAME_GRAPHOBJ_URLPREFIX, RTL_CONSTASCII_LENGTH(
UNO_NAME_GRAPHOBJ_URLPREFIX ) ) == 0 ) )
+ {
+ // graphic manager uniqueid
+ rtl::OUString sID = _rURL.copy( sizeof( UNO_NAME_GRAPHOBJ_URLPREFIX ) - 1 );
+ // get the DefaultContext
+ ::comphelper::ComponentContext aContext( ::comphelper::getProcessServiceFactory() );
+ xOutGraphicObj = graphic::GraphicObject::createWithId( aContext.getUNOContext(), sID );
+ }
+ else // linked
+ xOutGraphicObj = NULL; // release the GraphicObject
+
+ return ImageHelper::getGraphicFromURL_nothrow( _rURL );
+}
+::com::sun::star::uno::Reference< ::com::sun::star::graphic::XGraphic >
+ImageHelper::getGraphicFromURL_nothrow( const ::rtl::OUString& _rURL )
+{
+ uno::Reference< graphic::XGraphic > xGraphic;
+ if ( _rURL.isEmpty() )
+ return xGraphic;
+
+ try
+ {
+ uno::Reference< graphic::XGraphicProvider > xProvider;
+ ::comphelper::ComponentContext aContext( ::comphelper::getProcessServiceFactory() );
+ if ( aContext.createComponent( "com.sun.star.graphic.GraphicProvider", xProvider ) )
+ {
+ uno::Sequence< beans::PropertyValue > aMediaProperties(1);
+ aMediaProperties[0].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "URL" ) );
+ aMediaProperties[0].Value <<= _rURL;
+ xGraphic = xProvider->queryGraphic( aMediaProperties );
+ }
+ }
+ catch (const Exception&)
+ {
+ DBG_UNHANDLED_EXCEPTION();
+ }
+
+ return xGraphic;
+}
// ----------------------------------------------------
// class UnoControlEditModel
// ----------------------------------------------------
@@ -593,7 +635,7 @@ void SAL_CALL GraphicControlModel::setFastPropertyValue_NoBroadcast( sal_Int32 n
mbAdjustingGraphic = true;
::rtl::OUString sImageURL;
OSL_VERIFY( rValue >>= sImageURL );
- setDependentFastPropertyValue( BASEPROPERTY_GRAPHIC, uno::makeAny(
getGraphicFromURL_nothrow( sImageURL ) ) );
+ setDependentFastPropertyValue( BASEPROPERTY_GRAPHIC, uno::makeAny(
ImageHelper::getGraphicFromURL_nothrow( sImageURL ) ) );
mbAdjustingGraphic = false;
}
break;
Context
Privacy Policy |
Impressum (Legal Info) |
Copyright information: Unless otherwise specified, all text and images
on this website are licensed under the
Creative Commons Attribution-Share Alike 3.0 License.
This does not include the source code of LibreOffice, which is
licensed under the Mozilla Public License (
MPLv2).
"LibreOffice" and "The Document Foundation" are
registered trademarks of their corresponding registered owners or are
in actual use as trademarks in one or more countries. Their respective
logos and icons are also subject to international copyright laws. Use
thereof is explained in our
trademark policy.