[ooo-build-commit] .: 14 commits - basctl/source forms/source javainstaller2/src setup_native/scripts

Jan Holesovsky kendy at kemper.freedesktop.org
Wed Oct 6 07:09:42 PDT 2010


 basctl/source/basicide/basidesh.cxx                                                |    2 
 forms/source/component/FormComponent.cxx                                           |  104 +--
 forms/source/component/ImageControl.cxx                                            |  177 ++++--
 forms/source/component/ImageControl.hxx                                            |   15 
 forms/source/component/imgprod.cxx                                                 |    3 
 forms/source/inc/FormComponent.hxx                                                 |   22 
 forms/source/inc/frm_strings.hxx                                                   |    1 
 forms/source/inc/property.hrc                                                      |    2 
 forms/source/misc/property.cxx                                                     |    1 
 javainstaller2/src/JavaSetup/org/openoffice/setup/InstallData.java                 |    9 
 javainstaller2/src/JavaSetup/org/openoffice/setup/Installer/LinuxInstaller.java    |  265 +++-------
 javainstaller2/src/JavaSetup/org/openoffice/setup/InstallerHelper/LinuxHelper.java |   38 -
 setup_native/scripts/admin.pl                                                      |    1 
 13 files changed, 325 insertions(+), 315 deletions(-)

New commits:
commit ef6e968454c64f874a284c807c062624eeb946d6
Merge: ec6a518... 8e36ae2...
Author: Jan Holesovsky <kendy at suse.cz>
Date:   Wed Oct 6 14:40:56 2010 +0200

    Merge branch 'master' of ssh://git.freedesktop.org/git/libreoffice/components

commit ec6a51873a939bdc95619c6d5da0c5bd8f6a4d9b
Merge: c3b9446... 414f166...
Author: Jan Holesovsky <kendy at suse.cz>
Date:   Wed Oct 6 13:31:28 2010 +0200

    Merge commit 'ooo/OOO330_m9'

commit 414f16693f0828efb240d64cfa1a99fa8486ca4b
Merge: 9f245ff... ce53dcd...
Author: Kurt Zenker <kz at openoffice.org>
Date:   Fri Sep 24 15:25:02 2010 +0200

    CWS-TOOLING: integrate CWS native330

commit ce53dcd5bacb13b47afcec9662f98bc729dc1a5e
Author: Ingo Schmidt <is at openoffice.org>
Date:   Fri Sep 17 14:48:05 2010 +0200

    native330 #i113835# fix

diff --git a/setup_native/scripts/admin.pl b/setup_native/scripts/admin.pl
index 466182b..d90c766 100644
--- a/setup_native/scripts/admin.pl
+++ b/setup_native/scripts/admin.pl
@@ -66,7 +66,6 @@ sub usage
 {
     print <<Ende;
 ----------------------------------------------------------------------
-$prog V1.0 (c) Sun Microsystems 2009
 This program installs a Windows Installer installation set
 without using msiexec.exe. The installation is comparable
 with an administrative installation using the Windows Installer
commit 9158068afebb908d7273ec6b4ee25936abec3192
Author: Ingo Schmidt <is at openoffice.org>
Date:   Tue Sep 14 12:00:24 2010 +0200

    native330 #i114487# fixing installation on Cent OS

diff --git a/javainstaller2/src/JavaSetup/org/openoffice/setup/InstallData.java b/javainstaller2/src/JavaSetup/org/openoffice/setup/InstallData.java
index e472d2b..30a222d 100755
--- a/javainstaller2/src/JavaSetup/org/openoffice/setup/InstallData.java
+++ b/javainstaller2/src/JavaSetup/org/openoffice/setup/InstallData.java
@@ -76,7 +76,7 @@ public class InstallData
     static private boolean useRtl = false;
     static private boolean installedProductMinorSet = false;
     static private boolean isDebianSystem = false;
-    static private boolean useForceDebian = false;
+    static private boolean useForceDebian = false;  /* --force-debian */
     static private boolean debianInvestigated = false;
     static private String installType;            /* custom or typical installation */
     static private String osType;                 /* Linux, SunOS, ...              */
diff --git a/javainstaller2/src/JavaSetup/org/openoffice/setup/Installer/LinuxInstaller.java b/javainstaller2/src/JavaSetup/org/openoffice/setup/Installer/LinuxInstaller.java
index 2906f7a..204c9e1 100755
--- a/javainstaller2/src/JavaSetup/org/openoffice/setup/Installer/LinuxInstaller.java
+++ b/javainstaller2/src/JavaSetup/org/openoffice/setup/Installer/LinuxInstaller.java
@@ -227,7 +227,7 @@ public class LinuxInstaller extends Installer {
                 }
                 
                 // Defining a Vector that contains the full rpm command. Then the string array can be 
-                // created dynamically.
+                // created dynamically. Otherwise there would be too many different scenarios.
                 
                 Vector rpmVector = new Vector();
                 
@@ -361,7 +361,7 @@ public class LinuxInstaller extends Installer {
             }
 
             // Defining a Vector that contains the full rpm command. Then the string array can be 
-            // created dynamically.
+            // created dynamically. Otherwise there would be too many different scenarios.
                 
             Vector rpmVector = new Vector();
                 
diff --git a/javainstaller2/src/JavaSetup/org/openoffice/setup/InstallerHelper/LinuxHelper.java b/javainstaller2/src/JavaSetup/org/openoffice/setup/InstallerHelper/LinuxHelper.java
index b21123c..fb8bfa9 100755
--- a/javainstaller2/src/JavaSetup/org/openoffice/setup/InstallerHelper/LinuxHelper.java
+++ b/javainstaller2/src/JavaSetup/org/openoffice/setup/InstallerHelper/LinuxHelper.java
@@ -391,7 +391,8 @@ import java.util.Vector;public class LinuxHelper {
             
             data.setIsDebianSystem(true);
         
-            // Second check: If this is a Debian system, is "--force-debian" required?
+            // Second check: If this is a Debian system, is "--force-debian" required? Older
+            // versions do not support "--force-debian".
         
             // String rpmQuery = "rpm --help;
             String[] rpmQueryArray = new String[2];
commit 9f245ff0a3cc039304c4a4e5205baedaf76dbacc
Merge: 214f550... 61bf1db...
Author: obo <obo at openoffice.org>
Date:   Tue Sep 14 09:05:18 2010 +0200

    CWS-TOOLING: integrate CWS dba33i

commit 214f5506324ab242201e140da8291cc3f33c22d6
Merge: e8b8fec... fdcca5c...
Author: obo <obo at openoffice.org>
Date:   Tue Sep 14 08:56:44 2010 +0200

    CWS-TOOLING: integrate CWS dba33h

commit 2cab1ad00d080b85294350ed02a3d39e0522a15c
Author: Ingo Schmidt <is at openoffice.org>
Date:   Mon Sep 13 17:33:53 2010 +0200

    native330 #163564# fixing installation on Cent OS

diff --git a/javainstaller2/src/JavaSetup/org/openoffice/setup/InstallData.java b/javainstaller2/src/JavaSetup/org/openoffice/setup/InstallData.java
index d3ba4ab..e472d2b 100755
--- a/javainstaller2/src/JavaSetup/org/openoffice/setup/InstallData.java
+++ b/javainstaller2/src/JavaSetup/org/openoffice/setup/InstallData.java
@@ -76,6 +76,7 @@ public class InstallData
     static private boolean useRtl = false;
     static private boolean installedProductMinorSet = false;
     static private boolean isDebianSystem = false;
+    static private boolean useForceDebian = false;
     static private boolean debianInvestigated = false;
     static private String installType;            /* custom or typical installation */
     static private String osType;                 /* Linux, SunOS, ...              */
@@ -667,6 +668,14 @@ public class InstallData
         isDebianSystem = value;
     }
 
+    public boolean useForceDebian() {
+        return useForceDebian;
+    }
+
+    public void setUseForceDebian(boolean value) {
+        useForceDebian = value;
+    }
+
     public boolean databaseQueried() {
         return databaseQueried;
     }
diff --git a/javainstaller2/src/JavaSetup/org/openoffice/setup/Installer/LinuxInstaller.java b/javainstaller2/src/JavaSetup/org/openoffice/setup/Installer/LinuxInstaller.java
index c66c84a..2906f7a 100755
--- a/javainstaller2/src/JavaSetup/org/openoffice/setup/Installer/LinuxInstaller.java
+++ b/javainstaller2/src/JavaSetup/org/openoffice/setup/Installer/LinuxInstaller.java
@@ -202,12 +202,13 @@ public class LinuxInstaller extends Installer {
                 }
                 
                 if ( data.isDebianSystem() ) {
-                    forceDebianString = "--force-debian";
                     nodepsString = "--nodeps";
+                    
+                    if ( data.useForceDebian() ) {
+                        forceDebianString = "--force-debian";
+                    }
                 }
                 
-                String rpmCommand = "";
-                String[] rpmCommandArray;
                 String databasePath = null;
                 String databaseString = "";
                 boolean useLocalDatabase = false;
@@ -225,130 +226,57 @@ public class LinuxInstaller extends Installer {
                     useLocalDatabase = true;
                 }
                 
-                if (useForce) {
-                    if (useLocalDatabase) {
-                        if ( relocations != null ) {
-                            rpmCommand = "rpm --upgrade --ignoresize --force " + forceDebianString + " " + nodepsString + " -vh " +
-                                    "--relocate " + relocations + " " + databaseString +
-                                    " " + databasePath + " " + packageName;
-                            rpmCommandArray = new String[12];
-                            rpmCommandArray[0] = "rpm";
-                            rpmCommandArray[1] = "--upgrade";
-                            rpmCommandArray[2] = "--ignoresize";
-                            rpmCommandArray[3] = "--force";
-                            rpmCommandArray[4] = forceDebianString;
-                            rpmCommandArray[5] = nodepsString;
-                            rpmCommandArray[6] = "-vh";
-                            rpmCommandArray[7] = "--relocate";
-                            rpmCommandArray[8] = relocations;
-                            rpmCommandArray[9] = databaseString;
-                            rpmCommandArray[10] = databasePath;
-                            rpmCommandArray[11] = packageName;                    
-                        } else {
-                            rpmCommand = "rpm --upgrade --ignoresize --force " + forceDebianString + " " + nodepsString + " -vh " + 
-                                    databaseString + " " + databasePath + " " + packageName;
-                            rpmCommandArray = new String[10];
-                            rpmCommandArray[0] = "rpm";
-                            rpmCommandArray[1] = "--upgrade";
-                            rpmCommandArray[2] = "--ignoresize";
-                            rpmCommandArray[3] = "--force";
-                            rpmCommandArray[4] = forceDebianString;
-                            rpmCommandArray[5] = nodepsString;
-                            rpmCommandArray[6] = "-vh";
-                            rpmCommandArray[7] = databaseString;
-                            rpmCommandArray[8] = databasePath;
-                            rpmCommandArray[9] = packageName;
-                        }
-                    } else {
-                        if ( relocations != null )
-                        {
-                            rpmCommand = "rpm --upgrade --ignoresize --force " + forceDebianString + " " + nodepsString + " -vh " +
-                                    "--relocate " + relocations + " " + packageName;
-                            rpmCommandArray = new String[10];
-                            rpmCommandArray[0] = "rpm";
-                            rpmCommandArray[1] = "--upgrade";
-                            rpmCommandArray[2] = "--ignoresize";
-                            rpmCommandArray[3] = "--force";
-                            rpmCommandArray[4] = forceDebianString;
-                            rpmCommandArray[5] = nodepsString;
-                            rpmCommandArray[6] = "-vh";
-                            rpmCommandArray[7] = "--relocate";
-                            rpmCommandArray[8] = relocations;
-                            rpmCommandArray[9] = packageName;
-                        } else {
-                            rpmCommand = "rpm --upgrade --ignoresize --force " + forceDebianString + " " + nodepsString + " -vh " + packageName;
-                            rpmCommandArray = new String[8];
-                            rpmCommandArray[0] = "rpm";
-                            rpmCommandArray[1] = "--upgrade";
-                            rpmCommandArray[2] = "--ignoresize";
-                            rpmCommandArray[3] = "--force";
-                            rpmCommandArray[4] = forceDebianString;
-                            rpmCommandArray[5] = nodepsString;
-                            rpmCommandArray[6] = "-vh";
-                            rpmCommandArray[7] = packageName;
-                        }
-                    }                
-                } else {
-                    if (useLocalDatabase) {
-                        if ( relocations != null ) {
-                            rpmCommand = "rpm --upgrade --ignoresize " + forceDebianString + " " + nodepsString + " -vh " +
-                                    "--relocate " + relocations + " " + databaseString +
-                                    " " + databasePath + " " + packageName;
-                            rpmCommandArray = new String[11];
-                            rpmCommandArray[0] = "rpm";
-                            rpmCommandArray[1] = "--upgrade";
-                            rpmCommandArray[2] = "--ignoresize";
-                            rpmCommandArray[3] = forceDebianString;
-                            rpmCommandArray[4] = nodepsString;
-                            rpmCommandArray[5] = "-vh";
-                            rpmCommandArray[6] = "--relocate";
-                            rpmCommandArray[7] = relocations;
-                            rpmCommandArray[8] = databaseString;
-                            rpmCommandArray[9] = databasePath;
-                            rpmCommandArray[10] = packageName;                    
-                        } else {
-                            rpmCommand = "rpm --upgrade --ignoresize " + forceDebianString + " " + nodepsString + " -vh " +
-                                    databaseString + " " + databasePath + " " + packageName;
-                            rpmCommandArray = new String[9];
-                            rpmCommandArray[0] = "rpm";
-                            rpmCommandArray[1] = "--upgrade";
-                            rpmCommandArray[2] = "--ignoresize";
-                            rpmCommandArray[3] = forceDebianString;
-                            rpmCommandArray[4] = nodepsString;
-                            rpmCommandArray[5] = "-vh";
-                            rpmCommandArray[6] = databaseString;
-                            rpmCommandArray[7] = databasePath;
-                            rpmCommandArray[8] = packageName;
-                        }
-                    } else {
-                        if ( relocations != null )
-                        {
-                            rpmCommand = "rpm --upgrade --ignoresize " + forceDebianString + " " + nodepsString + " -vh " +
-                                    "--relocate " + relocations + " " + packageName;
-                            rpmCommandArray = new String[9];
-                            rpmCommandArray[0] = "rpm";
-                            rpmCommandArray[1] = "--upgrade";
-                            rpmCommandArray[2] = "--ignoresize";
-                            rpmCommandArray[3] = forceDebianString;
-                            rpmCommandArray[4] = nodepsString;
-                            rpmCommandArray[5] = "-vh";
-                            rpmCommandArray[6] = "--relocate";
-                            rpmCommandArray[7] = relocations;
-                            rpmCommandArray[8] = packageName;
-                        } else {
-                            rpmCommand = "rpm --upgrade --ignoresize " + forceDebianString + " " + nodepsString + " -vh " + packageName;
-                            rpmCommandArray = new String[7];
-                            rpmCommandArray[0] = "rpm";
-                            rpmCommandArray[1] = "--upgrade";
-                            rpmCommandArray[2] = "--ignoresize";
-                            rpmCommandArray[3] = forceDebianString;
-                            rpmCommandArray[4] = nodepsString;
-                            rpmCommandArray[5] = "-vh";
-                            rpmCommandArray[6] = packageName;
-                        }
-                    }
+                // Defining a Vector that contains the full rpm command. Then the string array can be 
+                // created dynamically.
+                
+                Vector rpmVector = new Vector();
+                
+                rpmVector.add("rpm");
+                rpmVector.add("--upgrade");
+                rpmVector.add("--ignoresize");
+                
+                if ( useForce ) {
+                    rpmVector.add("--force");
                 }
-
+                
+                if ( ! forceDebianString.equals("") ) {
+                    rpmVector.add(forceDebianString);
+                }
+                
+                if ( ! nodepsString.equals("") ) {
+                    rpmVector.add(nodepsString);
+                }
+                
+                rpmVector.add("-vh");
+                
+                if ( relocations != null ) {
+                    rpmVector.add("--relocate");
+                    rpmVector.add(relocations);
+                }
+                
+                if ( useLocalDatabase ) {
+                    rpmVector.add(databaseString);
+                    rpmVector.add(databasePath);
+                }
+                
+                rpmVector.add(packageName);
+                
+                // Creating String and StringArray for rpm command
+                
+                int capacity = rpmVector.size();
+                
+                String rpmCommand = "";
+                String[] rpmCommandArray = new String[capacity];
+                                
+                for (int i = 0; i < rpmVector.size(); i++) {
+                    rpmCommandArray[i] = (String)rpmVector.get(i);
+                    rpmCommand = rpmCommand + " " + (String)rpmVector.get(i);
+                }
+                
+                rpmCommand = rpmCommand.trim();
+                
+                // Staring rpm process
+                
                 Vector returnVector = new Vector();
                 Vector returnErrorVector = new Vector();
                 // int returnValue = SystemManager.executeProcessReturnVector(rpmCommand, returnVector, returnErrorVector);
@@ -407,8 +335,6 @@ public class LinuxInstaller extends Installer {
             String databasePath = data.getDatabasePath();
             String databaseString = "";
             boolean useLocalDatabase = false;
-            String rpmCommand;
-            String[] rpmCommandArray;
         
             if (( databasePath != null ) && (! databasePath.equalsIgnoreCase("null"))) {
                 databaseString = "--dbpath";
@@ -427,51 +353,52 @@ public class LinuxInstaller extends Installer {
             }
                 
             if ( data.isDebianSystem() ) {
-                forceDebianString = "--force-debian";
                 nodepsString = "--nodeps";
+                    
+                if ( data.useForceDebian() ) {
+                    forceDebianString = "--force-debian";
+                }
             }
-          
-            // Code duplication for isDebianSystem is necessary, because there is no valid position 
-            // for forceDebianString, if it is empty. This is no problem in installPackage.
 
-            if ( data.isDebianSystem() ) {
-            
-                if (useLocalDatabase) {
-                    rpmCommand = "rpm " + forceDebianString + " " + nodepsString + " -ev" + " " + databaseString + " " + databasePath + " " + packageName;
-                    rpmCommandArray = new String[7];
-                    rpmCommandArray[0] = "rpm";
-                    rpmCommandArray[1] = forceDebianString;
-                    rpmCommandArray[2] = nodepsString;
-                    rpmCommandArray[3] = "-ev";
-                    rpmCommandArray[4] = databaseString;
-                    rpmCommandArray[5] = databasePath;
-                    rpmCommandArray[6] = packageName;                
-                } else {
-                    rpmCommand = "rpm " + forceDebianString + " " + nodepsString + " -ev" + " " + packageName;
-                    rpmCommandArray = new String[5];
-                    rpmCommandArray[0] = "rpm";
-                    rpmCommandArray[1] = forceDebianString;
-                    rpmCommandArray[2] = nodepsString;
-                    rpmCommandArray[3] = "-ev";
-                    rpmCommandArray[4] = packageName;
-                }
-            } else {
-                if (useLocalDatabase) {
-                    rpmCommand = "rpm -ev" + " " + databaseString + " " + databasePath + " " + packageName;
-                    rpmCommandArray = new String[5];
-                    rpmCommandArray[0] = "rpm";
-                    rpmCommandArray[1] = "-ev";
-                    rpmCommandArray[2] = databaseString;
-                    rpmCommandArray[3] = databasePath;
-                    rpmCommandArray[4] = packageName;                
-                } else {
-                    rpmCommand = "rpm -ev" + " " + packageName;
-                    rpmCommandArray = new String[3];
-                    rpmCommandArray[0] = "rpm";
-                    rpmCommandArray[1] = "-ev";
-                    rpmCommandArray[2] = packageName;
-                }            	
+            // Defining a Vector that contains the full rpm command. Then the string array can be 
+            // created dynamically.
+                
+            Vector rpmVector = new Vector();
+                
+            rpmVector.add("rpm");
+                
+            if ( ! forceDebianString.equals("") ) {
+                rpmVector.add(forceDebianString);
             }
+                
+            if ( ! nodepsString.equals("") ) {
+                rpmVector.add(nodepsString);
+            }
+                
+            rpmVector.add("-ev");
+                
+            if ( useLocalDatabase ) {
+                rpmVector.add(databaseString);
+                rpmVector.add(databasePath);
+            }
+                
+            rpmVector.add(packageName);
+                
+            // Creating String and StringArray for rpm command
+                
+            int capacity = rpmVector.size();
+                
+            String rpmCommand = "";
+            String[] rpmCommandArray = new String[capacity];
+                                
+            for (int i = 0; i < rpmVector.size(); i++) {
+                rpmCommandArray[i] = (String)rpmVector.get(i);
+                rpmCommand = rpmCommand + " " + (String)rpmVector.get(i);
+            }
+            
+            rpmCommand = rpmCommand.trim();
+
+            // Starting rpm process
 
             Vector returnVector = new Vector();
             Vector returnErrorVector = new Vector();
diff --git a/javainstaller2/src/JavaSetup/org/openoffice/setup/InstallerHelper/LinuxHelper.java b/javainstaller2/src/JavaSetup/org/openoffice/setup/InstallerHelper/LinuxHelper.java
index 9ce41da..b21123c 100755
--- a/javainstaller2/src/JavaSetup/org/openoffice/setup/InstallerHelper/LinuxHelper.java
+++ b/javainstaller2/src/JavaSetup/org/openoffice/setup/InstallerHelper/LinuxHelper.java
@@ -383,21 +383,32 @@ import java.util.Vector;public class LinuxHelper {
   
     public void investigateDebian(InstallData data) {
         
-        // String rpmQuery = "rpm --help;
-        String[] rpmQueryArray = new String[2];
-        rpmQueryArray[0] = "rpm";
-        rpmQueryArray[1] = "--help";
-
-        Vector returnVector = new Vector();
-        Vector returnErrorVector = new Vector();
-        int returnValue = ExecuteProcess.executeProcessReturnVector(rpmQueryArray, returnVector, returnErrorVector);
+        // First check: Is this a Debian system?
         
-        // Checking if the return vector contains the string "force-debian"
+        String dpkgFile = "/usr/bin/dpkg";
+        
+        if ( new File(dpkgFile).exists() ) {
+            
+            data.setIsDebianSystem(true);
+        
+            // Second check: If this is a Debian system, is "--force-debian" required?
+        
+            // String rpmQuery = "rpm --help;
+            String[] rpmQueryArray = new String[2];
+            rpmQueryArray[0] = "rpm";
+            rpmQueryArray[1] = "--help";
+
+            Vector returnVector = new Vector();
+            Vector returnErrorVector = new Vector();
+            int returnValue = ExecuteProcess.executeProcessReturnVector(rpmQueryArray, returnVector, returnErrorVector);
+        
+            // Checking if the return vector contains the string "force-debian"
        
-        for (int i = 0; i < returnVector.size(); i++) {
-            String line = (String) returnVector.get(i);
-            if ( line.indexOf("force-debian") > -1 ) {
-                data.setIsDebianSystem(true);
+            for (int i = 0; i < returnVector.size(); i++) {
+                String line = (String) returnVector.get(i);
+                if ( line.indexOf("force-debian") > -1 ) {
+                    data.setUseForceDebian(true);
+                }
             }
         }
     } 
commit 61bf1db52942cc7a3d50181e078be2854a6e274a
Author: Frank Schoenheit [fs] <frank.schoenheit at sun.com>
Date:   Wed Sep 1 14:59:07 2010 +0200

    dba33i: #i111146# migrated all SFX-based applications to use named views

diff --git a/basctl/source/basicide/basidesh.cxx b/basctl/source/basicide/basidesh.cxx
index 6e4e2cf..6cd3917 100644
--- a/basctl/source/basicide/basidesh.cxx
+++ b/basctl/source/basicide/basidesh.cxx
@@ -155,7 +155,7 @@ public:
 
 TYPEINIT1( BasicIDEShell, SfxViewShell );
 
-SFX_IMPL_VIEWFACTORY( BasicIDEShell, IDEResId( SVX_INTERFACE_BASIDE_VIEWSH ) )
+SFX_IMPL_NAMED_VIEWFACTORY( BasicIDEShell, "Default" )
 {
     SFX_VIEW_REGISTRATION( BasicDocShell );
 }
commit fdcca5cd5d150e36a9697892ebeaaf95e99d6a75
Merge: 2f78daf... b221612...
Author: Frank Schoenheit [fs] <frank.schoenheit at oracle.com>
Date:   Mon Aug 30 14:10:40 2010 +0200

    dba33h: merge after pulling OOO330.m6

commit 2f78daf7769342a7016599915e1ae2ef8b6a74ea
Author: Frank Schoenheit [fs] <frank.schoenheit at oracle.com>
Date:   Thu Aug 26 17:14:25 2010 +0200

    dba33h: #i114122# don't set GraphicObject-URLs at the image control/model, instead, just set the XGraphic, and let the implementation manage the respective XGraphicObject instance and its life time

diff --git a/forms/source/component/ImageControl.cxx b/forms/source/component/ImageControl.cxx
index f710696..e9e2ce3 100644
--- a/forms/source/component/ImageControl.cxx
+++ b/forms/source/component/ImageControl.cxx
@@ -151,9 +151,10 @@ OImageControlModel::OImageControlModel(const Reference<XMultiServiceFactory>& _r
     :OBoundControlModel( _rxFactory, VCL_CONTROLMODEL_IMAGECONTROL, FRM_SUN_CONTROL_IMAGECONTROL, sal_False, sal_False, sal_False )
                     // use the old control name for compytibility reasons
     ,m_pImageProducer( NULL )
+    ,m_bExternalGraphic( true )
     ,m_bReadOnly( sal_False )
     ,m_sImageURL()
-    ,m_xGraphic()
+    ,m_xGraphicObject()
 {
     DBG_CTOR( OImageControlModel, NULL );
     m_nClassId = FormComponentType::IMAGECONTROL;
@@ -167,9 +168,10 @@ OImageControlModel::OImageControlModel( const OImageControlModel* _pOriginal, co
     :OBoundControlModel( _pOriginal, _rxFactory )
                 // use the old control name for compytibility reasons
     ,m_pImageProducer( NULL )
+    ,m_bExternalGraphic( true )
     ,m_bReadOnly( _pOriginal->m_bReadOnly )
     ,m_sImageURL( _pOriginal->m_sImageURL )
-    ,m_xGraphic( _pOriginal->m_xGraphic )
+    ,m_xGraphicObject( _pOriginal->m_xGraphicObject )
 {
     DBG_CTOR( OImageControlModel, NULL );
     implConstruct();
@@ -255,7 +257,7 @@ void OImageControlModel::getFastPropertyValue(Any& rValue, sal_Int32 nHandle) co
             rValue <<= m_sImageURL;
             break;
         case PROPERTY_ID_GRAPHIC:
-            rValue <<= m_xGraphic;
+            rValue <<= m_xGraphicObject.is() ? m_xGraphicObject->getGraphic() : Reference< XGraphic >();
             break;
         default:
             OBoundControlModel::getFastPropertyValue(rValue, nHandle);
@@ -284,8 +286,35 @@ void OImageControlModel::setFastPropertyValue_NoBroadcast(sal_Int32 nHandle, con
             break;
 
         case PROPERTY_ID_GRAPHIC:
-            OSL_VERIFY( rValue >>= m_xGraphic );
-            break;
+        {
+            Reference< XGraphic > xGraphic;
+            OSL_VERIFY( rValue >>= xGraphic );
+            if ( !xGraphic.is() )
+                m_xGraphicObject.clear();
+            else
+            {
+                m_xGraphicObject = GraphicObject::create( m_aContext.getUNOContext() );
+                m_xGraphicObject->setGraphic( xGraphic );
+            }
+
+            if ( m_bExternalGraphic )
+            {
+                // if that's an external graphic, i.e. one which has not been loaded by ourselves in response to a
+                // new image URL, then also adjust our ImageURL.
+                ::rtl::OUString sNewImageURL;
+                if ( m_xGraphicObject.is() )
+                {
+                    sNewImageURL = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "vnd.sun.star.GraphicObject:" ) );
+                    sNewImageURL = sNewImageURL + m_xGraphicObject->getUniqueID();
+                }
+                m_sImageURL = sNewImageURL;
+                // TODO: speaking strictly, this would need to be notified, since ImageURL is a bound property. However,
+                // this method here is called with a locked mutex, so we cannot simply call listeners ...
+                // I think the missing notification (and thus clients which potentially cannot observe the change)
+                // is less severe than the potential deadlock ...
+            }
+        }
+        break;
 
         default:
             OBoundControlModel::setFastPropertyValue_NoBroadcast(nHandle, rValue);
@@ -306,7 +335,10 @@ sal_Bool OImageControlModel::convertFastPropertyValue(Any& rConvertedValue, Any&
             return tryPropertyValue( rConvertedValue, rOldValue, rValue, m_sImageURL );
 
         case PROPERTY_ID_GRAPHIC:
-            return tryPropertyValue( rConvertedValue, rOldValue, rValue, m_xGraphic );
+        {
+            const Reference< XGraphic > xGraphic( getFastPropertyValue( PROPERTY_ID_GRAPHIC ), UNO_QUERY );
+            return tryPropertyValue( rConvertedValue, rOldValue, rValue, xGraphic );
+        }
 
         default:
             return OBoundControlModel::convertFastPropertyValue(rConvertedValue, rOldValue, nHandle, rValue);
@@ -660,10 +692,16 @@ void SAL_CALL OImageControlModel::startProduction(  ) throw (RuntimeException)
 IMPL_LINK( OImageControlModel, OnImageImportDone, ::Graphic*, i_pGraphic )
 {
     const Reference< XGraphic > xGraphic( i_pGraphic != NULL ? Image( i_pGraphic->GetBitmapEx() ).GetXGraphic() : NULL );
-    setPropertyValue(
-        ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Graphic" ) ),
-        makeAny( xGraphic )
-    );
+    m_bExternalGraphic = false;
+    try
+    {
+        setPropertyValue( PROPERTY_GRAPHIC, makeAny( xGraphic ) );
+    }
+    catch ( const Exception& )
+    {
+        DBG_UNHANDLED_EXCEPTION();
+    }
+    m_bExternalGraphic = true;
     return 1L;
 }
 
@@ -828,12 +866,7 @@ bool OImageControlControl::implInsertGraphics()
             {
                 Graphic aGraphic;
                 aDialog.GetGraphic( aGraphic );
-                                
-                Reference< graphic::XGraphicObject > xGrfObj = graphic::GraphicObject::create( m_aContext.getUNOContext() );
-                xGrfObj->setGraphic( aGraphic.GetXGraphic() );
-                rtl::OUString sObjectID( RTL_CONSTASCII_USTRINGPARAM( "vnd.sun.star.GraphicObject:" ) );
-                sObjectID = sObjectID + xGrfObj->getUniqueID();
-                xSet->setPropertyValue( PROPERTY_IMAGE_URL, makeAny( ::rtl::OUString( sObjectID ) ) );
+                 xSet->setPropertyValue( PROPERTY_GRAPHIC, makeAny( aGraphic.GetXGraphic() ) );
             }
             else
                 xSet->setPropertyValue( PROPERTY_IMAGE_URL, makeAny( ::rtl::OUString( aDialog.GetPath() ) ) );
diff --git a/forms/source/component/ImageControl.hxx b/forms/source/component/ImageControl.hxx
index 78eb4a8..cd47e15 100644
--- a/forms/source/component/ImageControl.hxx
+++ b/forms/source/component/ImageControl.hxx
@@ -33,7 +33,7 @@
 #include <com/sun/star/form/XImageProducerSupplier.hpp>
 #include <com/sun/star/awt/XMouseListener.hpp>
 #include <com/sun/star/util/XModifyBroadcaster.hpp>
-#include <com/sun/star/graphic/XGraphic.hpp>
+#include <com/sun/star/graphic/XGraphicObject.hpp>
 #include <comphelper/propmultiplex.hxx>
 #include <comphelper/implementationreference.hxx>
 #include <cppuhelper/implbase2.hxx>
@@ -58,10 +58,11 @@ class OImageControlModel
 {
     ::com::sun::star::uno::Reference< ::com::sun::star::awt::XImageProducer> 	m_xImageProducer;
     ImageProducer*									m_pImageProducer;
+    bool                                            m_bExternalGraphic;
     sal_Bool										m_bReadOnly;
     ::rtl::OUString                                 m_sImageURL;
-    ::com::sun::star::uno::Reference< ::com::sun::star::graphic::XGraphic > 
-                                                    m_xGraphic;
+    ::com::sun::star::uno::Reference< ::com::sun::star::graphic::XGraphicObject > 
+                                                    m_xGraphicObject;
     ::rtl::OUString                                 m_sDocumentURL;
 
 protected:
commit 0e743fea1a7d8dac9dfd04ebe60c72b2108d52e3
Author: Frank Schoenheit [fs] <frank.schoenheit at oracle.com>
Date:   Thu Aug 26 15:24:03 2010 +0200

    dba33h: #i113991# handle ImageURL and Graphic properties ourselves, do not leave this to the aggregate. Otherwise, both the aggregate and we try to sync those, which is good for some problems ...

diff --git a/forms/source/component/FormComponent.cxx b/forms/source/component/FormComponent.cxx
index 2513636..902f853 100644
--- a/forms/source/component/FormComponent.cxx
+++ b/forms/source/component/FormComponent.cxx
@@ -507,14 +507,12 @@ DBG_NAME(OControlModel)
 //------------------------------------------------------------------
 Sequence<sal_Int8> SAL_CALL OControlModel::getImplementationId() throw(RuntimeException)
 {
-    // RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "forms", "dev at dba.openoffice.org", "OControlModel::getImplementationId" );
     return OImplementationIds::getImplementationId(getTypes());
 }
 
 //------------------------------------------------------------------
 Sequence<Type> SAL_CALL OControlModel::getTypes() throw(RuntimeException)
 {
-    // RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "forms", "dev at dba.openoffice.org", "OControlModel::getTypes" );
     TypeBag aTypes( _getTypes() );
 
     Reference< XTypeProvider > xProv;
@@ -527,7 +525,6 @@ Sequence<Type> SAL_CALL OControlModel::getTypes() throw(RuntimeException)
 //------------------------------------------------------------------------------
 Sequence<Type> OControlModel::_getTypes()
 {
-    // RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "forms", "dev at dba.openoffice.org", "OControlModel::_getTypes" );
     return TypeBag( OComponentHelper::getTypes(),
         OPropertySetAggregationHelper::getTypes(),
         OControlModel_BASE::getTypes()
@@ -537,7 +534,6 @@ Sequence<Type> OControlModel::_getTypes()
 //------------------------------------------------------------------
 Any SAL_CALL OControlModel::queryAggregation(const Type& _rType) throw (RuntimeException)
 {
-    // RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "forms", "dev at dba.openoffice.org", "OControlModel::queryAggregation" );
     // base class 1
     Any aReturn(OComponentHelper::queryAggregation(_rType));
 
@@ -561,7 +557,6 @@ Any SAL_CALL OControlModel::queryAggregation(const Type& _rType) throw (RuntimeE
 //------------------------------------------------------------------------------
 void OControlModel::readHelpTextCompatibly(const staruno::Reference< stario::XObjectInputStream >& _rxInStream)
 {
-    // RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "forms", "dev at dba.openoffice.org", "OControlModel::readHelpTextCompatibly" );
     ::rtl::OUString sHelpText;
     ::comphelper::operator>>( _rxInStream, sHelpText);
     try
@@ -578,7 +573,6 @@ void OControlModel::readHelpTextCompatibly(const staruno::Reference< stario::XOb
 //------------------------------------------------------------------------------
 void OControlModel::writeHelpTextCompatibly(const staruno::Reference< stario::XObjectOutputStream >& _rxOutStream)
 {
-    // RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "forms", "dev at dba.openoffice.org", "OControlModel::writeHelpTextCompatibly" );
     ::rtl::OUString sHelpText;
     try
     {
@@ -609,7 +603,6 @@ OControlModel::OControlModel(
         // the native look is ugly ....
         // #i37342# / 2004-11-19 / frank.schoenheit at sun.com
 {
-    // RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "forms", "dev at dba.openoffice.org", "OControlModel::OControlModel" );
     DBG_CTOR(OControlModel, NULL);
     if (_rUnoControlModelTypeName.getLength())	// the is a model we have to aggregate
     {
@@ -651,7 +644,6 @@ OControlModel::OControlModel( const OControlModel* _pOriginal, const Reference<
     ,m_nTabIndex( FRM_DEFAULT_TABINDEX )
     ,m_nClassId( FormComponentType::CONTROL )
 {
-    // RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "forms", "dev at dba.openoffice.org", "OControlModel::OControlModel(copy)" );
     DBG_CTOR( OControlModel, NULL );
     DBG_ASSERT( _pOriginal, "OControlModel::OControlModel: invalid original!" );
 
@@ -696,14 +688,12 @@ OControlModel::~OControlModel()
 //------------------------------------------------------------------
 void OControlModel::clonedFrom( const OControlModel* /*_pOriginal*/ )
 {
-    // RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "forms", "dev at dba.openoffice.org", "OControlModel::clonedFrom" );
     // nothing to do in this base class
 }
 
 //------------------------------------------------------------------------------
 void OControlModel::doResetDelegator()
 {
-    // RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "forms", "dev at dba.openoffice.org", "OControlModel::doResetDelegator" );
     if (m_xAggregate.is())
         m_xAggregate->setDelegator(NULL);
 }
@@ -711,7 +701,6 @@ void OControlModel::doResetDelegator()
 //------------------------------------------------------------------------------
 void OControlModel::doSetDelegator()
 {
-    // RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "forms", "dev at dba.openoffice.org", "OControlModel::doSetDelegator" );
     increment(m_refCount);
     if (m_xAggregate.is())
     {
@@ -724,14 +713,12 @@ void OControlModel::doSetDelegator()
 //------------------------------------------------------------------------------
 InterfaceRef SAL_CALL OControlModel::getParent() throw(RuntimeException)
 {
-    // RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "forms", "dev at dba.openoffice.org", "OControlModel::getParent" );
     return m_xParent;
 }
 
 //------------------------------------------------------------------------------
 void SAL_CALL OControlModel::setParent(const InterfaceRef& _rxParent) throw(com::sun::star::lang::NoSupportException, RuntimeException)
 {
-    // RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "forms", "dev at dba.openoffice.org", "OControlModel::setParent" );
     osl::MutexGuard aGuard(m_aMutex);
 
     Reference<XComponent> xComp(m_xParent, UNO_QUERY);
@@ -749,7 +736,6 @@ void SAL_CALL OControlModel::setParent(const InterfaceRef& _rxParent) throw(com:
 //------------------------------------------------------------------------------
 ::rtl::OUString SAL_CALL OControlModel::getName() throw(RuntimeException)
 {
-    // RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "forms", "dev at dba.openoffice.org", "OControlModel::getName" );
     ::rtl::OUString aReturn;
     OPropertySetHelper::getFastPropertyValue(PROPERTY_ID_NAME) >>= aReturn;
     return aReturn;
@@ -758,7 +744,6 @@ void SAL_CALL OControlModel::setParent(const InterfaceRef& _rxParent) throw(com:
 //------------------------------------------------------------------------------
 void SAL_CALL OControlModel::setName(const ::rtl::OUString& _rName) throw(RuntimeException)
 {
-    // RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "forms", "dev at dba.openoffice.org", "OControlModel::setName" );
         setFastPropertyValue(PROPERTY_ID_NAME, makeAny(_rName));
 }
 
@@ -766,7 +751,6 @@ void SAL_CALL OControlModel::setName(const ::rtl::OUString& _rName) throw(Runtim
 //------------------------------------------------------------------------------
 sal_Bool SAL_CALL OControlModel::supportsService(const rtl::OUString& _rServiceName) throw ( RuntimeException)
 {
-    // RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "forms", "dev at dba.openoffice.org", "OControlModel::supportsService" );
     Sequence<rtl::OUString> aSupported = getSupportedServiceNames();
     const rtl::OUString* pSupported = aSupported.getConstArray();
     for (sal_Int32 i=0; i<aSupported.getLength(); ++i, ++pSupported)
@@ -778,7 +762,6 @@ sal_Bool SAL_CALL OControlModel::supportsService(const rtl::OUString& _rServiceN
 //------------------------------------------------------------------------------
 Sequence< ::rtl::OUString > OControlModel::getAggregateServiceNames()
 {
-    // RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "forms", "dev at dba.openoffice.org", "OControlModel::getAggregateServiceNames" );
     Sequence< ::rtl::OUString > aAggServices;
     Reference< XServiceInfo > xInfo;
     if ( query_aggregation( m_xAggregate, xInfo ) )
@@ -789,7 +772,6 @@ Sequence< ::rtl::OUString > OControlModel::getAggregateServiceNames()
 //------------------------------------------------------------------------------
 Sequence<rtl::OUString> SAL_CALL OControlModel::getSupportedServiceNames() throw(RuntimeException)
 {
-    // RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "forms", "dev at dba.openoffice.org", "OControlModel::getSupportedServiceNames" );
     return ::comphelper::concatSequences(
         getAggregateServiceNames(),
         getSupportedServiceNames_Static()
@@ -799,7 +781,6 @@ Sequence<rtl::OUString> SAL_CALL OControlModel::getSupportedServiceNames() throw
 //------------------------------------------------------------------------------
 Sequence< ::rtl::OUString > SAL_CALL OControlModel::getSupportedServiceNames_Static() throw( RuntimeException )
 {
-    // RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "forms", "dev at dba.openoffice.org", "OControlModel::getSupportedServiceNames_Static" );
     Sequence< ::rtl::OUString > aServiceNames( 2 );
     aServiceNames[ 0 ] = FRM_SUN_FORMCOMPONENT;
     aServiceNames[ 1 ] = ::rtl::OUString::createFromAscii( "com.sun.star.form.FormControlModel" );
@@ -810,7 +791,6 @@ Sequence< ::rtl::OUString > SAL_CALL OControlModel::getSupportedServiceNames_Sta
 //------------------------------------------------------------------------------
 void SAL_CALL OControlModel::disposing(const com::sun::star::lang::EventObject& _rSource) throw (RuntimeException)
 {
-    // RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "forms", "dev at dba.openoffice.org", "OControlModel::disposing" );
     // release the parent
     if (_rSource.Source == m_xParent)
     {
@@ -832,7 +812,6 @@ void SAL_CALL OControlModel::disposing(const com::sun::star::lang::EventObject&
 //-----------------------------------------------------------------------------
 void OControlModel::disposing()
 {
-    // RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "forms", "dev at dba.openoffice.org", "OControlModel::disposing" );
     OPropertySetAggregationHelper::disposing();
 
     Reference<com::sun::star::lang::XComponent> xComp;
@@ -847,7 +826,6 @@ void OControlModel::disposing()
 //------------------------------------------------------------------------------
 void OControlModel::writeAggregate( const Reference< XObjectOutputStream >& _rxOutStream ) const
 {
-    // RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "forms", "dev at dba.openoffice.org", "OControlModel::writeAggregate" );
     Reference< XPersistObject > xPersist;
     if ( query_aggregation( m_xAggregate, xPersist ) )
         xPersist->write( _rxOutStream );
@@ -856,7 +834,6 @@ void OControlModel::writeAggregate( const Reference< XObjectOutputStream >& _rxO
 //------------------------------------------------------------------------------
 void OControlModel::readAggregate( const Reference< XObjectInputStream >& _rxInStream )
 {
-    // RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "forms", "dev at dba.openoffice.org", "OControlModel::readAggregate" );
     Reference< XPersistObject > xPersist;
     if ( query_aggregation( m_xAggregate, xPersist ) )
         xPersist->read( _rxInStream );
@@ -866,7 +843,6 @@ void OControlModel::readAggregate( const Reference< XObjectInputStream >& _rxInS
 void SAL_CALL OControlModel::write(const Reference<stario::XObjectOutputStream>& _rxOutStream)
                         throw(stario::IOException, RuntimeException)
 {
-    // RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "forms", "dev at dba.openoffice.org", "OControlModel::write" );
     osl::MutexGuard aGuard(m_aMutex);
 
     // 1. Schreiben des UnoControls
@@ -912,7 +888,6 @@ void SAL_CALL OControlModel::write(const Reference<stario::XObjectOutputStream>&
 //------------------------------------------------------------------------------
 void OControlModel::read(const Reference<stario::XObjectInputStream>& InStream) throw (::com::sun::star::io::IOException, RuntimeException)
 {
-    // RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "forms", "dev at dba.openoffice.org", "OControlModel::read" );
     osl::MutexGuard aGuard(m_aMutex);
 
     Reference<stario::XMarkableStream> xMark(InStream, UNO_QUERY);
@@ -966,7 +941,6 @@ void OControlModel::read(const Reference<stario::XObjectInputStream>& InStream)
 //------------------------------------------------------------------------------
 PropertyState OControlModel::getPropertyStateByHandle( sal_Int32 _nHandle )
 {
-    // RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "forms", "dev at dba.openoffice.org", "OControlModel::getPropertyStateByHandle" );
     // simply compare the current and the default value
     Any aCurrentValue = getPropertyDefaultByHandle( _nHandle );
     Any aDefaultValue;  getFastPropertyValue( aDefaultValue, _nHandle );
@@ -983,7 +957,6 @@ PropertyState OControlModel::getPropertyStateByHandle( sal_Int32 _nHandle )
 //------------------------------------------------------------------------------
 void OControlModel::setPropertyToDefaultByHandle( sal_Int32 _nHandle)
 {
-    // RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "forms", "dev at dba.openoffice.org", "OControlModel::setPropertyToDefaultByHandle" );
     Any aDefault = getPropertyDefaultByHandle( _nHandle );
 
     Any aConvertedValue, aOldValue;
@@ -997,7 +970,6 @@ void OControlModel::setPropertyToDefaultByHandle( sal_Int32 _nHandle)
 //------------------------------------------------------------------------------
 Any OControlModel::getPropertyDefaultByHandle( sal_Int32 _nHandle ) const
 {
-    // RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "forms", "dev at dba.openoffice.org", "OControlModel::getPropertyDefaultByHandle" );
     Any aReturn;
     switch ( _nHandle )
     {
@@ -1030,7 +1002,6 @@ Any OControlModel::getPropertyDefaultByHandle( sal_Int32 _nHandle ) const
 //------------------------------------------------------------------------------
 void OControlModel::getFastPropertyValue( Any& _rValue, sal_Int32 _nHandle ) const
 {
-    // RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "forms", "dev at dba.openoffice.org", "OControlModel::getFastPropertyValue" );
     switch ( _nHandle )
     {
         case PROPERTY_ID_NAME:
@@ -1062,7 +1033,6 @@ sal_Bool OControlModel::convertFastPropertyValue(
                         Any& _rConvertedValue, Any& _rOldValue, sal_Int32 _nHandle, const Any& _rValue)
                         throw (com::sun::star::lang::IllegalArgumentException)
 {
-    // RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "forms", "dev at dba.openoffice.org", "OControlModel::convertFastPropertyValue" );
     sal_Bool bModified(sal_False);
     switch (_nHandle)
     {
@@ -1092,7 +1062,6 @@ sal_Bool OControlModel::convertFastPropertyValue(
 void OControlModel::setFastPropertyValue_NoBroadcast(sal_Int32 _nHandle, const Any& _rValue)
                         throw (Exception)
 {
-    // RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "forms", "dev at dba.openoffice.org", "OControlModel::setFastPropertyValue_NoBroadcast" );
     switch (_nHandle)
     {
         case PROPERTY_ID_NAME:
@@ -1125,7 +1094,6 @@ void OControlModel::setFastPropertyValue_NoBroadcast(sal_Int32 _nHandle, const A
 //------------------------------------------------------------------------------
 void OControlModel::describeFixedProperties( Sequence< Property >& _rProps ) const
 {
-    // RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "forms", "dev at dba.openoffice.org", "OControlModel::describeFixedProperties" );
     BEGIN_DESCRIBE_BASE_PROPERTIES( 4 )
         DECL_PROP2      (CLASSID,     sal_Int16,        READONLY, TRANSIENT);
         DECL_PROP1      (NAME,        ::rtl::OUString,  BOUND);
@@ -1137,7 +1105,6 @@ void OControlModel::describeFixedProperties( Sequence< Property >& _rProps ) con
 //------------------------------------------------------------------------------
 void OControlModel::describeAggregateProperties( Sequence< Property >& /* [out] */ _rAggregateProps ) const
 {
-    // RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "forms", "dev at dba.openoffice.org", "OControlModel::describeAggregateProperties" );
     if ( m_xAggregateSet.is() )
     {
         Reference< XPropertySetInfo > xPSI( m_xAggregateSet->getPropertySetInfo() );
@@ -1149,14 +1116,12 @@ void OControlModel::describeAggregateProperties( Sequence< Property >& /* [out]
 //------------------------------------------------------------------------------
 ::osl::Mutex& OControlModel::getMutex()
 {
-    // RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "forms", "dev at dba.openoffice.org", "OControlModel::getMutex" );
     return m_aMutex;
 }
 
 //------------------------------------------------------------------------------
 void OControlModel::describeFixedAndAggregateProperties( Sequence< Property >& _out_rFixedProperties, Sequence< Property >& _out_rAggregateProperties ) const
 {
-    // RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "forms", "dev at dba.openoffice.org", "OControlModel::describeFixedAndAggregateProperties" );
     describeFixedProperties( _out_rFixedProperties );
     describeAggregateProperties( _out_rAggregateProperties );
 }
@@ -1164,49 +1129,42 @@ void OControlModel::describeFixedAndAggregateProperties( Sequence< Property >& _
 //------------------------------------------------------------------------------
 Reference< XMultiPropertySet > OControlModel::getPropertiesInterface()
 {
-    // RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "forms", "dev at dba.openoffice.org", "OControlModel::getPropertiesInterface" );
     return Reference< XMultiPropertySet >( *this, UNO_QUERY );
 }
 
 //------------------------------------------------------------------------------
 Reference< XPropertySetInfo> SAL_CALL OControlModel::getPropertySetInfo() throw( RuntimeException)
 {
-    // RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "forms", "dev at dba.openoffice.org", "OControlModel::getPropertySetInfo" );
     return createPropertySetInfo( getInfoHelper() );
 }
 
 //------------------------------------------------------------------------------
 ::cppu::IPropertyArrayHelper& OControlModel::getInfoHelper()
 {
-    // RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "forms", "dev at dba.openoffice.org", "OControlModel::getInfoHelper" );
     return m_aPropertyBagHelper.getInfoHelper();
 }
 
 //--------------------------------------------------------------------
 void SAL_CALL OControlModel::addProperty( const ::rtl::OUString& _rName, ::sal_Int16 _nAttributes, const Any& _rInitialValue ) throw (PropertyExistException, IllegalTypeException, IllegalArgumentException, RuntimeException)
 {
-    // RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "forms", "dev at dba.openoffice.org", "OControlModel::addProperty" );
     m_aPropertyBagHelper.addProperty( _rName, _nAttributes, _rInitialValue );
 }
 
 //--------------------------------------------------------------------
 void SAL_CALL OControlModel::removeProperty( const ::rtl::OUString& _rName ) throw (UnknownPropertyException, NotRemoveableException, RuntimeException)
 {
-    // RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "forms", "dev at dba.openoffice.org", "OControlModel::removeProperty" );
     m_aPropertyBagHelper.removeProperty( _rName );
 }
 
 //--------------------------------------------------------------------
 Sequence< PropertyValue > SAL_CALL OControlModel::getPropertyValues() throw (RuntimeException)
 {
-    // RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "forms", "dev at dba.openoffice.org", "OControlModel::getPropertyValues" );
     return m_aPropertyBagHelper.getPropertyValues();
 }
 
 //--------------------------------------------------------------------
 void SAL_CALL OControlModel::setPropertyValues( const Sequence< PropertyValue >& _rProps ) throw (UnknownPropertyException, PropertyVetoException, IllegalArgumentException, WrappedTargetException, RuntimeException)
 {
-    // RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "forms", "dev at dba.openoffice.org", "OControlModel::setPropertyValues" );
     m_aPropertyBagHelper.setPropertyValues( _rProps );
 }
 
@@ -1249,7 +1207,6 @@ Any SAL_CALL OBoundControlModel::queryAggregation( const Type& _rType ) throw (R
     Any aReturn( OControlModel::queryAggregation(_rType) );
     if (!aReturn.hasValue())
     {
-        // RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "forms", "dev at dba.openoffice.org", "OControlModel::queryAggregation" );
         aReturn = OBoundControlModel_BASE1::queryInterface(_rType);
 
         if ( !aReturn.hasValue() && m_bCommitable )
@@ -1427,10 +1384,19 @@ void OBoundControlModel::implInitValuePropertyListening( ) const
 }
 
 //-----------------------------------------------------------------------------
+void OBoundControlModel::initOwnValueProperty( const ::rtl::OUString& i_rValuePropertyName )
+{
+    OSL_PRECOND( !m_sValuePropertyName.getLength() && -1 == m_nValuePropertyAggregateHandle,
+        "OBoundControlModel::initOwnValueProperty: value property is already initialized!" );
+    OSL_ENSURE( i_rValuePropertyName.getLength(), "OBoundControlModel::initOwnValueProperty: invalid property name!" );
+    m_sValuePropertyName = i_rValuePropertyName;
+}
+
+//-----------------------------------------------------------------------------
 void OBoundControlModel::initValueProperty( const ::rtl::OUString& _rValuePropertyName, sal_Int32 _nValuePropertyExternalHandle )
 {
     OSL_PRECOND( !m_sValuePropertyName.getLength() && -1 == m_nValuePropertyAggregateHandle,
-        "OBoundControlModel::initValueProperty: already called before!" );
+        "OBoundControlModel::initValueProperty: value property is already initialized!" );
     OSL_ENSURE( _rValuePropertyName.getLength(), "OBoundControlModel::initValueProperty: invalid property name!" );
     OSL_ENSURE( _nValuePropertyExternalHandle != -1, "OBoundControlModel::initValueProperty: invalid property handle!" );
 
@@ -1495,7 +1461,6 @@ Sequence< Type > OBoundControlModel::_getTypes()
 //-----------------------------------------------------------------------------
 void OBoundControlModel::disposing()
 {
-    // RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "forms", "dev at dba.openoffice.org", "OControlModel::_getTypes" );
     OControlModel::disposing();
 
     ::osl::ClearableMutexGuard aGuard(m_aMutex);
@@ -1533,6 +1498,29 @@ void OBoundControlModel::disposing()
 }
 
 //------------------------------------------------------------------------------
+void OBoundControlModel::onValuePropertyChange( ControlModelLock& i_rControLock )
+{
+    if ( hasExternalValueBinding() )
+    {   // the control value changed, while we have an external value binding
+        // -> forward the value to it
+        if ( m_eControlValueChangeInstigator != eExternalBinding )
+            transferControlValueToExternal( i_rControLock );
+    }
+    else if ( !m_bCommitable && m_xColumnUpdate.is() )
+    {   // the control value changed, while we are  bound to a database column,
+        // but not committable (which means changes in the control have to be reflected to
+        // the underlying database column immediately)
+        // -> forward the value to the database column
+        if ( m_eControlValueChangeInstigator != eDbColumnBinding )
+            commitControlValueToDbColumn( false );
+    }
+
+    // validate the new value
+    if ( m_bSupportsValidation )
+        recheckValidity( true );
+}
+
+//------------------------------------------------------------------------------
 void OBoundControlModel::_propertyChanged( const PropertyChangeEvent& _rEvt ) throw ( RuntimeException )
 {
     ControlModelLock aLock( *this );
@@ -1543,26 +1531,8 @@ void OBoundControlModel::_propertyChanged( const PropertyChangeEvent& _rEvt ) th
         "OBoundControlModel::_propertyChanged: where did this come from (2)?" );
 
     if ( _rEvt.PropertyName == m_sValuePropertyName )
-    {   // our control value changed
-
-        if ( hasExternalValueBinding() )
-        {   // the control value changed, while we have an external value binding
-            // -> forward the value to it
-            if ( m_eControlValueChangeInstigator != eExternalBinding )
-                transferControlValueToExternal( aLock );
-        }
-        else if ( !m_bCommitable && m_xColumnUpdate.is() )
-        {   // the control value changed, while we are  bound to a database column,
-            // but not committable (which means changes in the control have to be reflected to
-            // the underlying database column immediately)
-            // -> forward the value to the database column
-            if ( m_eControlValueChangeInstigator !=  eDbColumnBinding )
-                commitControlValueToDbColumn( false );
-        }
-
-        // validate the new value
-        if ( m_bSupportsValidation )
-            recheckValidity( true );
+    {
+        onValuePropertyChange( aLock );
     }
 }
 
@@ -1673,7 +1643,6 @@ void SAL_CALL OBoundControlModel::disposing(const com::sun::star::lang::EventObj
 //------------------------------------------------------------------------------
 StringSequence SAL_CALL OBoundControlModel::getSupportedServiceNames() throw(RuntimeException)
 {
-    // RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "forms", "dev at dba.openoffice.org", "OControlModel::disposing" );
     return ::comphelper::concatSequences(
         getAggregateServiceNames(),
         getSupportedServiceNames_Static()
@@ -1696,7 +1665,6 @@ Sequence< ::rtl::OUString > SAL_CALL OBoundControlModel::getSupportedServiceName
 //------------------------------------------------------------------------------
 void SAL_CALL OBoundControlModel::write( const Reference<stario::XObjectOutputStream>& _rxOutStream ) throw(stario::IOException, RuntimeException)
 {
-    // RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "forms", "dev at dba.openoffice.org", "OControlModel::getSupportedServiceNames_Static" );
     OControlModel::write(_rxOutStream);
 
     osl::MutexGuard aGuard(m_aMutex);
@@ -1797,7 +1765,6 @@ void SAL_CALL OBoundControlModel::read( const Reference< stario::XObjectInputStr
 //------------------------------------------------------------------------------
 void OBoundControlModel::getFastPropertyValue(Any& rValue, sal_Int32 nHandle) const
 {
-    // RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "forms", "dev at dba.openoffice.org", "OBoundControlModel::getFastPropertyValue" );
     switch (nHandle)
     {
         case PROPERTY_ID_INPUT_REQUIRED:
@@ -1866,7 +1833,6 @@ sal_Bool OBoundControlModel::convertFastPropertyValue(
 //------------------------------------------------------------------------------
 Any OBoundControlModel::getPropertyDefaultByHandle( sal_Int32 _nHandle ) const
 {
-    // RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "forms", "dev at dba.openoffice.org", "OControlModel::convertFastPropertyValue" );
     Any aDefault;
     switch ( _nHandle )
     {
diff --git a/forms/source/component/ImageControl.cxx b/forms/source/component/ImageControl.cxx
index 671d0bd..f710696 100644
--- a/forms/source/component/ImageControl.cxx
+++ b/forms/source/component/ImageControl.cxx
@@ -152,10 +152,12 @@ OImageControlModel::OImageControlModel(const Reference<XMultiServiceFactory>& _r
                     // use the old control name for compytibility reasons
     ,m_pImageProducer( NULL )
     ,m_bReadOnly( sal_False )
+    ,m_sImageURL()
+    ,m_xGraphic()
 {
     DBG_CTOR( OImageControlModel, NULL );
     m_nClassId = FormComponentType::IMAGECONTROL;
-    initValueProperty( PROPERTY_IMAGE_URL, PROPERTY_ID_IMAGE_URL);
+    initOwnValueProperty( PROPERTY_IMAGE_URL );
 
     implConstruct();
 }
@@ -165,22 +167,19 @@ OImageControlModel::OImageControlModel( const OImageControlModel* _pOriginal, co
     :OBoundControlModel( _pOriginal, _rxFactory )
                 // use the old control name for compytibility reasons
     ,m_pImageProducer( NULL )
+    ,m_bReadOnly( _pOriginal->m_bReadOnly )
+    ,m_sImageURL( _pOriginal->m_sImageURL )
+    ,m_xGraphic( _pOriginal->m_xGraphic )
 {
     DBG_CTOR( OImageControlModel, NULL );
     implConstruct();
-    m_bReadOnly = _pOriginal->m_bReadOnly;
 
     osl_incrementInterlockedCount( &m_refCount );
     {
         // simulate a propertyChanged event for the ImageURL
         // 2003-05-15 - #109591# - fs at openoffice.org
-        Any aImageURL;
-        getFastPropertyValue( aImageURL, PROPERTY_ID_IMAGE_URL );
-        ::rtl::OUString sImageURL;
-        aImageURL >>= sImageURL;
-
         ::osl::MutexGuard aGuard( m_aMutex );
-        impl_handleNewImageURL_lck( sImageURL, eOther );
+        impl_handleNewImageURL_lck( eOther );
     }
     osl_decrementInterlockedCount( &m_refCount );
 }
@@ -244,32 +243,20 @@ sal_Bool OImageControlModel::approveDbColumnType( sal_Int32 _nColumnType )
     return ImageStoreInvalid != lcl_getImageStoreType( _nColumnType );
 }
 
-
-//------------------------------------------------------------------------------
-void OImageControlModel::_propertyChanged( const PropertyChangeEvent& _rEvent )
-                                            throw( RuntimeException )
-{
-    if ( m_xColumnUpdate.is() )
-    {
-        OBoundControlModel::_propertyChanged( _rEvent );
-    }
-    else
-    {   // we're not bound. In this case, we have to manually care for updating the
-        // image producer, since the base class will not do this
-        ::rtl::OUString sImageURL;
-        _rEvent.NewValue >>= sImageURL;
-
-        ::osl::MutexGuard aGuard( m_aMutex );
-        impl_handleNewImageURL_lck( sImageURL, eOther );
-    }
-}
-
 //------------------------------------------------------------------------------
 void OImageControlModel::getFastPropertyValue(Any& rValue, sal_Int32 nHandle) const
 {
     switch (nHandle)
     {
-        case PROPERTY_ID_READONLY       : rValue <<= (sal_Bool)m_bReadOnly; break;
+        case PROPERTY_ID_READONLY:
+            rValue <<= (sal_Bool)m_bReadOnly;
+            break;
+        case PROPERTY_ID_IMAGE_URL:
+            rValue <<= m_sImageURL;
+            break;
+        case PROPERTY_ID_GRAPHIC:
+            rValue <<= m_xGraphic;
+            break;
         default:
             OBoundControlModel::getFastPropertyValue(rValue, nHandle);
     }
@@ -285,8 +272,24 @@ void OImageControlModel::setFastPropertyValue_NoBroadcast(sal_Int32 nHandle, con
             m_bReadOnly = getBOOL(rValue);
             break;
 
+        case PROPERTY_ID_IMAGE_URL:
+            OSL_VERIFY( rValue >>= m_sImageURL );
+            impl_handleNewImageURL_lck( eOther );
+            {
+                ControlModelLock aLock( *this );
+                    // that's a fake ... onValuePropertyChange expects to receive the only lock to our instance,
+                    // but we're already called with our mutex locked ...
+                onValuePropertyChange( aLock );
+            }
+            break;
+
+        case PROPERTY_ID_GRAPHIC:
+            OSL_VERIFY( rValue >>= m_xGraphic );
+            break;
+
         default:
             OBoundControlModel::setFastPropertyValue_NoBroadcast(nHandle, rValue);
+            break;
     }
 }
 
@@ -299,6 +302,12 @@ sal_Bool OImageControlModel::convertFastPropertyValue(Any& rConvertedValue, Any&
         case PROPERTY_ID_READONLY :
             return tryPropertyValue(rConvertedValue, rOldValue, rValue, m_bReadOnly);
 
+        case PROPERTY_ID_IMAGE_URL:
+            return tryPropertyValue( rConvertedValue, rOldValue, rValue, m_sImageURL );
+
+        case PROPERTY_ID_GRAPHIC:
+            return tryPropertyValue( rConvertedValue, rOldValue, rValue, m_xGraphic );
+
         default:
             return OBoundControlModel::convertFastPropertyValue(rConvertedValue, rOldValue, nHandle, rValue);
     }
@@ -307,13 +316,25 @@ sal_Bool OImageControlModel::convertFastPropertyValue(Any& rConvertedValue, Any&
 //------------------------------------------------------------------------------
 void OImageControlModel::describeFixedProperties( Sequence< Property >& _rProps ) const
 {
-    BEGIN_DESCRIBE_PROPERTIES( 2, OBoundControlModel )
-        DECL_BOOL_PROP1 ( READONLY,             BOUND );
-        DECL_PROP1      ( TABINDEX, sal_Int16,  BOUND );
+    BEGIN_DESCRIBE_PROPERTIES( 4, OBoundControlModel )
+        DECL_IFACE_PROP2( GRAPHIC,   XGraphic,        BOUND, TRANSIENT );
+        DECL_PROP1      ( IMAGE_URL, ::rtl::OUString, BOUND );
+        DECL_BOOL_PROP1 ( READONLY,                   BOUND );
+        DECL_PROP1      ( TABINDEX,  sal_Int16,       BOUND );
     END_DESCRIBE_PROPERTIES();
 }
 
 //------------------------------------------------------------------------------
+void OImageControlModel::describeAggregateProperties( Sequence< Property >& /* [out] */ o_rAggregateProperties ) const
+{
+    OBoundControlModel::describeAggregateProperties( o_rAggregateProperties );
+    // remove ImageULR and Graphic properties, we "overload" them. This is because our aggregate synchronizes those
+    // two, but we have an own sychronization mechanism.
+    RemoveProperty( o_rAggregateProperties, PROPERTY_IMAGE_URL );
+    RemoveProperty( o_rAggregateProperties, PROPERTY_GRAPHIC );
+}
+
+//------------------------------------------------------------------------------
 ::rtl::OUString OImageControlModel::getServiceName() throw ( ::com::sun::star::uno::RuntimeException)
 {
     return FRM_COMPONENT_IMAGECONTROL;	// old (non-sun) name for compatibility !
@@ -411,18 +432,18 @@ sal_Bool OImageControlModel::impl_updateStreamForURL_lck( const ::rtl::OUString&
 }
 
 //------------------------------------------------------------------------------
-sal_Bool OImageControlModel::impl_handleNewImageURL_lck( const ::rtl::OUString& _rURL, ValueChangeInstigator _eInstigator )
+sal_Bool OImageControlModel::impl_handleNewImageURL_lck( ValueChangeInstigator _eInstigator )
 {
     switch ( lcl_getImageStoreType( getFieldType() ) )
     {
     case ImageStoreBinary:
-        if ( impl_updateStreamForURL_lck( _rURL, _eInstigator ) )
+        if ( impl_updateStreamForURL_lck( m_sImageURL, _eInstigator ) )
             return sal_True;
         break;
 
     case ImageStoreLink:
     {
-        ::rtl::OUString sCommitURL( _rURL );
+        ::rtl::OUString sCommitURL( m_sImageURL );
         if ( m_sDocumentURL.getLength() )
             sCommitURL = URIHelper::simpleNormalizedMakeRelative( m_sDocumentURL, sCommitURL );
         OSL_ENSURE( m_xColumnUpdate.is(), "OImageControlModel::impl_handleNewImageURL_lck: no bound field, but ImageStoreLink?!" );
@@ -435,7 +456,7 @@ sal_Bool OImageControlModel::impl_handleNewImageURL_lck( const ::rtl::OUString&
     break;
 
     case ImageStoreInvalid:
-        OSL_ENSURE( false, "OImageControlModel::impl_handleNewImageURL_lck: invalid current field type!" );
+        OSL_ENSURE( false, "OImageControlModel::impl_handleNewImageURL_lck: image storage type type!" );
         break;
     }
 
@@ -462,10 +483,7 @@ sal_Bool OImageControlModel::commitControlValueToDbColumn( bool _bPostReset )
     else
     {
         ::osl::MutexGuard aGuard(m_aMutex);
-
-        ::rtl::OUString sImageURL;
-        m_xAggregateSet->getPropertyValue( PROPERTY_IMAGE_URL ) >>= sImageURL;
-        return impl_handleNewImageURL_lck( sImageURL, eDbColumnBinding );
+        return impl_handleNewImageURL_lck( eDbColumnBinding );
     }
 
     return sal_True;
@@ -545,6 +563,12 @@ Any OImageControlModel::translateDbColumnToControlValue()
 }
 
 //------------------------------------------------------------------------------
+Any OImageControlModel::getControlValue( ) const
+{
+    return makeAny( m_sImageURL );
+}
+
+//------------------------------------------------------------------------------
 void OImageControlModel::doSetControlValue( const Any& _rValue )
 {
     DBG_ASSERT( GetImageProducer() && m_xImageProducer.is(), "OImageControlModel::doSetControlValue: no image producer!" );
@@ -599,11 +623,6 @@ void OImageControlModel::doSetControlValue( const Any& _rValue )
 void SAL_CALL OImageControlModel::disposing()
 {
     OBoundControlModel::disposing();
-
-    {
-        ::osl::MutexGuard aGuard( m_aMutex ); // setControlValue expects this
-        setControlValue( Any(), eOther );
-    }
 }
 
 //------------------------------------------------------------------------------
diff --git a/forms/source/component/ImageControl.hxx b/forms/source/component/ImageControl.hxx
index 8099fed..78eb4a8 100644
--- a/forms/source/component/ImageControl.hxx
+++ b/forms/source/component/ImageControl.hxx
@@ -33,6 +33,7 @@
 #include <com/sun/star/form/XImageProducerSupplier.hpp>
 #include <com/sun/star/awt/XMouseListener.hpp>
 #include <com/sun/star/util/XModifyBroadcaster.hpp>
+#include <com/sun/star/graphic/XGraphic.hpp>
 #include <comphelper/propmultiplex.hxx>
 #include <comphelper/implementationreference.hxx>
 #include <cppuhelper/implbase2.hxx>
@@ -58,6 +59,9 @@ class OImageControlModel
     ::com::sun::star::uno::Reference< ::com::sun::star::awt::XImageProducer> 	m_xImageProducer;
     ImageProducer*									m_pImageProducer;
     sal_Bool										m_bReadOnly;
+    ::rtl::OUString                                 m_sImageURL;
+    ::com::sun::star::uno::Reference< ::com::sun::star::graphic::XGraphic > 
+                                                    m_xGraphic;
     ::rtl::OUString                                 m_sDocumentURL;
 
 protected:
@@ -86,9 +90,6 @@ public:
     // OComponentHelper
     virtual void SAL_CALL disposing();
 
-    // OPropertyChangeListener
-    virtual void _propertyChanged( const ::com::sun::star::beans::PropertyChangeEvent& ) throw(::com::sun::star::uno::RuntimeException);
-
     // XPersistObject
     virtual ::rtl::OUString SAL_CALL getServiceName() throw ( ::com::sun::star::uno::RuntimeException);
     virtual void SAL_CALL write(const ::com::sun::star::uno::Reference< ::com::sun::star::io::XObjectOutputStream>& _rxOutStream) throw ( ::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException);
@@ -103,6 +104,9 @@ public:
     virtual void SAL_CALL startProduction(  ) throw (::com::sun::star::uno::RuntimeException);
 
     // OControlModel's property handling
+    virtual void describeAggregateProperties(
+        ::com::sun::star::uno::Sequence< ::com::sun::star::beans::Property >& /* [out] */ _rAggregateProps
+    ) const;
     virtual void describeFixedProperties(
         ::com::sun::star::uno::Sequence< ::com::sun::star::beans::Property >& /* [out] */ _rProps
     ) const;
@@ -119,6 +123,8 @@ protected:
                             translateDbColumnToControlValue( );
     virtual sal_Bool        commitControlValueToDbColumn( bool _bPostReset );
 
+    virtual ::com::sun::star::uno::Any
+                            getControlValue( ) const;
     virtual void            doSetControlValue( const ::com::sun::star::uno::Any& _rValue );
 
     virtual sal_Bool		approveDbColumnType(sal_Int32 _nColumnType);
@@ -134,7 +140,7 @@ protected:
         @precond
             our own mutex is locked
     */
-    sal_Bool    impl_handleNewImageURL_lck( const ::rtl::OUString& _rURL, ValueChangeInstigator _eInstigator );
+    sal_Bool    impl_handleNewImageURL_lck( ValueChangeInstigator _eInstigator );
 
     /** updates the binary stream, created from loading the file which the given URL points to, into our
         bound field, or the control itself if there is no bound field
diff --git a/forms/source/inc/FormComponent.hxx b/forms/source/inc/FormComponent.hxx
index deb57bd..040a690 100644
--- a/forms/source/inc/FormComponent.hxx
+++ b/forms/source/inc/FormComponent.hxx
@@ -759,6 +759,18 @@ protected:
                                 sal_Int32 _nValuePropertyExternalHandle
                             );
 
+    /** initializes the part of the class which is related to the control value.
+
+        <p>In opposite to ->initValueProperty, this method is to be used for value properties which are <em>not</em>
+        implemented by our aggregate, but by ourselves.</p>
+
+        <p>Certain functionality is not available when using own value properties. This includes binding to an external
+        value and external validation. (This is not a conceptual limit, but simply missing implementation.)</p>
+    */
+    void                    initOwnValueProperty(
+                                const ::rtl::OUString& i_rValuePropertyName
+                            );
+
     /** suspends listening at the value property
 
         <p>As long as this listening is suspended, changes in the value property will not be
@@ -782,6 +794,16 @@ protected:
     */
     void                    resumeValueListening( );
 
+    /** (to be) called when the value property changed
+
+        Normally, this is done automatically, since the value property is a property of our aggregate, and we're
+        a listener at this property.
+        However, in some cases the value property might not be an aggregate property, but a property of the
+        delegator instance. In this case, you'll need to call <code>onValuePropertyChange</code> whenever this
+        property changes.
+    */
+    void                    onValuePropertyChange( ControlModelLock& i_rControLock );
+
     /** starts listening at the aggregate, for changes in the given property
 
         <p>The OBoundControlModel automatically registers a multiplexer which listens for
diff --git a/forms/source/inc/frm_strings.hxx b/forms/source/inc/frm_strings.hxx
index 1f57f42..74581b9 100644
--- a/forms/source/inc/frm_strings.hxx
+++ b/forms/source/inc/frm_strings.hxx
@@ -141,6 +141,7 @@ namespace frm
     FORMS_CONSTASCII_STRING( PROPERTY_SUBMIT_METHOD,            "SubmitMethod" );
     FORMS_CONSTASCII_STRING( PROPERTY_SUBMIT_ENCODING,          "SubmitEncoding" );
     FORMS_CONSTASCII_STRING( PROPERTY_IMAGE_URL,                "ImageURL" );
+    FORMS_CONSTASCII_STRING( PROPERTY_GRAPHIC,                  "Graphic" );
     FORMS_CONSTASCII_STRING( PROPERTY_IMAGE_POSITION,           "ImagePosition" );
     FORMS_CONSTASCII_STRING( PROPERTY_EMPTY_IS_NULL,            "ConvertEmptyToNull" );
     FORMS_CONSTASCII_STRING( PROPERTY_LISTSOURCETYPE,           "ListSourceType" );
diff --git a/forms/source/inc/property.hrc b/forms/source/inc/property.hrc
index e70dff4..3eddaa3 100644
--- a/forms/source/inc/property.hrc
+++ b/forms/source/inc/property.hrc
@@ -61,7 +61,7 @@ namespace frm
 #define PROPERTY_ID_WRITING_MODE        (PROPERTY_ID_START + 20)
 #define PROPERTY_ID_CONTEXT_WRITING_MODE    (PROPERTY_ID_START + 21)
 #define PROPERTY_ID_VERTICAL_ALIGN      (PROPERTY_ID_START + 22)
-    // free
+#define PROPERTY_ID_GRAPHIC             (PROPERTY_ID_START + 23)
     // free
     // free
     // free
diff --git a/forms/source/misc/property.cxx b/forms/source/misc/property.cxx
index 11d08f9..21498cc 100644
--- a/forms/source/misc/property.cxx
+++ b/forms/source/misc/property.cxx
@@ -134,6 +134,7 @@ void PropertyInfoService::initialize()
     ADD_PROP_ASSIGNMENT(SUBMIT_METHOD);
     ADD_PROP_ASSIGNMENT(SUBMIT_ENCODING);
     ADD_PROP_ASSIGNMENT(IMAGE_URL);
+    ADD_PROP_ASSIGNMENT(GRAPHIC);
     ADD_PROP_ASSIGNMENT(EMPTY_IS_NULL);
     ADD_PROP_ASSIGNMENT(LISTSOURCETYPE);
     ADD_PROP_ASSIGNMENT(LISTSOURCE);
commit 6ceaf7dd12df2f66e0f3bbc42ad5ff8d14042e14
Author: Frank Schoenheit [fs] <frank.schoenheit at oracle.com>
Date:   Thu Aug 26 12:02:20 2010 +0200

    dba33h: #i112659# ensure bound image controls never embed their image in the surrounding document

diff --git a/forms/source/component/ImageControl.cxx b/forms/source/component/ImageControl.cxx
index c3556b4..671d0bd 100644
--- a/forms/source/component/ImageControl.cxx
+++ b/forms/source/component/ImageControl.cxx
@@ -800,6 +800,11 @@ bool OImageControlControl::implInsertGraphics()
             implClearGraphics( sal_False );
             sal_Bool bIsLink = sal_False;
             xController->getValue(ExtendedFilePickerElementIds::CHECKBOX_LINK, 0) >>= bIsLink;
+            // Force bIsLink to be TRUE if we're bound to a field. Though we initialized the file picker with IsLink=TRUE
+            // in this case, and disabled the respective control, there might be picker implementations which do not
+            // respect this, and return IsLink=FALSE here. In this case, "normalize" the flag.
+            // #i112659# / 2010-08-26 / frank.schoenheit at oracle.com
+            bIsLink |= bHasField;
             if ( !bIsLink )
             {
                 Graphic aGraphic;
commit a579e848e0b0e55eda9b9da94fc6e5d89ca995ca
Author: Frank Schoenheit [fs] <frank.schoenheit at oracle.com>
Date:   Wed Aug 25 16:14:14 2010 +0200

    dba33h: #i114022# properly handle new/empty images

diff --git a/forms/source/component/ImageControl.cxx b/forms/source/component/ImageControl.cxx
index da88d6b..c3556b4 100644
--- a/forms/source/component/ImageControl.cxx
+++ b/forms/source/component/ImageControl.cxx
@@ -523,7 +523,13 @@ Any OImageControlModel::translateDbColumnToControlValue()
 {
     switch ( lcl_getImageStoreType( getFieldType() ) )
     {
-    case ImageStoreBinary:  return makeAny( m_xColumn->getBinaryStream() );
+    case ImageStoreBinary: 
+    {
+        Reference< XInputStream > xImageStream( m_xColumn->getBinaryStream() );
+        if ( m_xColumn->wasNull() )
+            xImageStream.clear();
+        return makeAny( xImageStream );
+    }
     case ImageStoreLink:
     {
         ::rtl::OUString sImageLink( m_xColumn->getString() );
@@ -634,10 +640,10 @@ void SAL_CALL OImageControlModel::startProduction(  ) throw (RuntimeException)
 //------------------------------------------------------------------------------
 IMPL_LINK( OImageControlModel, OnImageImportDone, ::Graphic*, i_pGraphic )
 {
-    ENSURE_OR_RETURN( i_pGraphic, "OImageControlModel::OnImageImportDone: illegal graphic!", 0L );
+    const Reference< XGraphic > xGraphic( i_pGraphic != NULL ? Image( i_pGraphic->GetBitmapEx() ).GetXGraphic() : NULL );
     setPropertyValue(
         ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Graphic" ) ),
-        makeAny( Image( i_pGraphic->GetBitmapEx() ).GetXGraphic() )
+        makeAny( xGraphic )
     );
     return 1L;
 }
diff --git a/forms/source/component/imgprod.cxx b/forms/source/component/imgprod.cxx
index 60143f9..f064772 100644
--- a/forms/source/component/imgprod.cxx
+++ b/forms/source/component/imgprod.cxx
@@ -351,6 +351,9 @@ void ImageProducer::startProduction() throw(::com::sun::star::uno::RuntimeExcept
             // delete interfaces in temporary list
             for( pCons = aTmp.First(); pCons; pCons = aTmp.Next() )
                 delete (::com::sun::star::uno::Reference< ::com::sun::star::awt::XImageConsumer > *) pCons;
+
+            if ( maDoneHdl.IsSet() )
+                maDoneHdl.Call( NULL );
         }
     }
 }


More information about the ooo-build-commit mailing list