Date: prev next · Thread: first prev next last
2012 Archives by date, by thread · List index


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.