[PATCH 5/7] add vba support for BackColor, AutoSize, Locked attributes bnc#749960

Noel Power noel.power at novell.com
Tue Mar 20 08:35:30 PDT 2012


---
 oovbaapi/UnoApi_oovbaapi.mk                  |    1 +
 oovbaapi/ooo/vba/SystemColorConstants.idl    |   31 +++++++++++++++++++
 oovbaapi/ooo/vba/msforms/XCheckBox.idl       |    3 ++
 oovbaapi/ooo/vba/msforms/XComboBox.idl       |    3 ++
 oovbaapi/ooo/vba/msforms/XCommandButton.idl  |    3 +-
 oovbaapi/ooo/vba/msforms/XImage.idl          |    1 +
 oovbaapi/ooo/vba/msforms/XLabel.idl          |    2 +
 oovbaapi/ooo/vba/msforms/XTextBox.idl        |    3 ++
 vbahelper/source/msforms/vbabutton.cxx       |   21 ++++++++++---
 vbahelper/source/msforms/vbabutton.hxx       |    2 +
 vbahelper/source/msforms/vbacheckbox.cxx     |   29 ++++++++++++++++++
 vbahelper/source/msforms/vbacheckbox.hxx     |    6 ++++
 vbahelper/source/msforms/vbacombobox.cxx     |   29 ++++++++++++++++++
 vbahelper/source/msforms/vbacombobox.hxx     |    6 ++++
 vbahelper/source/msforms/vbacontrol.cxx      |   42 ++++++++++++++++++++++++++
 vbahelper/source/msforms/vbacontrol.hxx      |    8 +++++
 vbahelper/source/msforms/vbaimage.cxx        |   10 ++++++
 vbahelper/source/msforms/vbaimage.hxx        |    2 +
 vbahelper/source/msforms/vbalabel.cxx        |   20 ++++++++++++
 vbahelper/source/msforms/vbalabel.hxx        |    4 ++
 vbahelper/source/msforms/vbatextbox.cxx      |   30 ++++++++++++++++++
 vbahelper/source/msforms/vbatextbox.hxx      |    7 ++++
 vbahelper/source/msforms/vbatogglebutton.cxx |   20 ++++++++++--
 vbahelper/source/msforms/vbatogglebutton.hxx |    2 +
 24 files changed, 275 insertions(+), 10 deletions(-)
 create mode 100644 oovbaapi/ooo/vba/SystemColorConstants.idl

diff --git a/oovbaapi/UnoApi_oovbaapi.mk b/oovbaapi/UnoApi_oovbaapi.mk
index 57a0c11..00eeb88 100644
--- a/oovbaapi/UnoApi_oovbaapi.mk
+++ b/oovbaapi/UnoApi_oovbaapi.mk
@@ -75,6 +75,7 @@ $(eval $(call gb_UnoApiTarget_add_idlfiles,oovbaapi,oovbaapi/ooo/vba,\
     VbMsgBoxStyle \
     VbQueryClose \
     VbStrConv \
+    SystemColorConstants \
     VbTriState \
     VbVarType \
 	XApplicationBase \
diff --git a/oovbaapi/ooo/vba/SystemColorConstants.idl b/oovbaapi/ooo/vba/SystemColorConstants.idl
new file mode 100644
index 0000000..e0760f1
--- /dev/null
+++ b/oovbaapi/ooo/vba/SystemColorConstants.idl
@@ -0,0 +1,31 @@
+module ooo { module vba {
+    constants SystemColorConstants {
+
+    const long vbScrollBars = -2147483648;// 0x80000000;
+    const long vbDesktop = -2147483647; //0x80000001;
+    const long vbActiveTitleBar = -2147483646; //0x80000002;
+    const long vbInactiveTitleBar = -2147483645; //0x80000003;
+    const long vbMenuBar = -2147483644; //0x80000004;
+    const long vbWindowBackground = -2147483643; //0x80000005;
+    const long vbWindowFrame = -2147483642; //0x80000006;
+    const long vbMenuText = -2147483641; //0x80000007;
+    const long vbWindowText = -2147483640; //0x80000008;
+    const long vbTitleBarText = -2147483639; //0x80000009;
+    const long vbActiveBorder = -2147483638; //0x8000000A;
+    const long vbInactiveBorder = -2147483637; //0x8000000B;
+    const long vbApplicationWorkspace = -2147483636; //0x8000000C;
+    const long vbHighlight = -2147483635; //0x8000000D;
+    const long vbHighlightText = -2147483634; //0x8000000E;
+    const long vbButtonFace = -2147483633; //0x8000000F;
+    const long vbButtonShadow = -2147483632; //0x80000010;
+    const long vbGrayText = -2147483631; //0x80000011;
+    const long vbButtonText = -2147483630; //0x80000012;
+    const long vbInactiveCaptionText = -2147483629; //0x80000013;
+    const long vb3DHighlight = -2147483628; //0x80000014;
+    const long vb3DDKShadow = -2147483627; //0x80000015;
+    const long vb3DLight = -2147483626; //0x80000016;
+    const long vbInfoText = -2147483625; //0x80000017;
+    const long vbInfoBackground = -2147483624; //0x80000018;
+
+    };
+}; };
diff --git a/oovbaapi/ooo/vba/msforms/XCheckBox.idl b/oovbaapi/ooo/vba/msforms/XCheckBox.idl
index ec2c713..fc58d3e 100644
--- a/oovbaapi/ooo/vba/msforms/XCheckBox.idl
+++ b/oovbaapi/ooo/vba/msforms/XCheckBox.idl
@@ -39,6 +39,9 @@ interface XCheckBox: com::sun::star::uno::XInterface
 {
     [attribute] string Caption;
     [attribute] any Value;
+    [attribute] long BackColor;
+    [attribute] boolean AutoSize;
+    [attribute] boolean Locked;
     [attribute, readonly] XNewFont Font;
 };
 
diff --git a/oovbaapi/ooo/vba/msforms/XComboBox.idl b/oovbaapi/ooo/vba/msforms/XComboBox.idl
index 77b5e95..7eacf25 100644
--- a/oovbaapi/ooo/vba/msforms/XComboBox.idl
+++ b/oovbaapi/ooo/vba/msforms/XComboBox.idl
@@ -49,6 +49,9 @@ interface XComboBox
     [attribute] long EnterFieldBehavior;
     [attribute] long ListStyle;
     [attribute] long TextAlign;
+    [attribute] long BackColor;
+    [attribute] boolean AutoSize;
+    [attribute] boolean Locked;
     [attribute, readonly] long TextLength;
     [attribute, readonly] XNewFont Font;
 
diff --git a/oovbaapi/ooo/vba/msforms/XCommandButton.idl b/oovbaapi/ooo/vba/msforms/XCommandButton.idl
index 0e7697c..d71472e 100644
--- a/oovbaapi/ooo/vba/msforms/XCommandButton.idl
+++ b/oovbaapi/ooo/vba/msforms/XCommandButton.idl
@@ -39,11 +39,12 @@ module ooo {  module vba {  module msforms {
 interface XCommandButton
 {
     [attribute] string Caption;
-    [attribute] boolean AutoSize;
     [attribute] boolean Cancel;
     [attribute] boolean Default;
     [attribute] long BackColor;
     [attribute] long ForeColor;
+    [attribute] boolean AutoSize;
+    [attribute] boolean Locked;
     [attribute, readonly] XNewFont Font;
 };
 
diff --git a/oovbaapi/ooo/vba/msforms/XImage.idl b/oovbaapi/ooo/vba/msforms/XImage.idl
index 2c77aac..ec40c4a 100644
--- a/oovbaapi/ooo/vba/msforms/XImage.idl
+++ b/oovbaapi/ooo/vba/msforms/XImage.idl
@@ -35,6 +35,7 @@ module ooo {  module vba {  module msforms {
 //=============================================================================
 interface XImage: com::sun::star::uno::XInterface
 {
+    [attribute] long BackColor;
 };
 
 //=============================================================================
diff --git a/oovbaapi/ooo/vba/msforms/XLabel.idl b/oovbaapi/ooo/vba/msforms/XLabel.idl
index 10a92dc..c0ed739 100644
--- a/oovbaapi/ooo/vba/msforms/XLabel.idl
+++ b/oovbaapi/ooo/vba/msforms/XLabel.idl
@@ -42,6 +42,8 @@ interface XLabel
     [attribute] string Caption;
     [attribute] any Value;
     [attribute] string Accelerator;
+    [attribute] long BackColor;
+    [attribute] boolean AutoSize;
     [attribute, readonly] XNewFont Font;
 };
 
diff --git a/oovbaapi/ooo/vba/msforms/XTextBox.idl b/oovbaapi/ooo/vba/msforms/XTextBox.idl
index 75aaf83..1dceb86 100644
--- a/oovbaapi/ooo/vba/msforms/XTextBox.idl
+++ b/oovbaapi/ooo/vba/msforms/XTextBox.idl
@@ -45,6 +45,9 @@ interface XTextBox
     [attribute] boolean Multiline;
     [attribute] long SpecialEffect;
     [attribute] long BorderStyle;
+    [attribute] long BackColor;
+    [attribute] boolean AutoSize;
+    [attribute] boolean Locked;
     [attribute, readonly] long TextLength;
     [attribute, readonly] XNewFont Font;
 };
diff --git a/vbahelper/source/msforms/vbabutton.cxx b/vbahelper/source/msforms/vbabutton.cxx
index f076333..8912b6d 100644
--- a/vbahelper/source/msforms/vbabutton.cxx
+++ b/vbahelper/source/msforms/vbabutton.cxx
@@ -55,11 +55,22 @@ ScVbaButton::setCaption( const rtl::OUString& _caption ) throw (::com::sun::star
 
 sal_Bool SAL_CALL ScVbaButton::getAutoSize() throw (uno::RuntimeException)
 {
-    return sal_False;
+    return ScVbaControl::getAutoSize();
+}
+
+void SAL_CALL ScVbaButton::setAutoSize( sal_Bool bAutoSize ) throw (uno::RuntimeException)
+{
+    ScVbaControl::setAutoSize( bAutoSize );
+}
+
+sal_Bool SAL_CALL ScVbaButton::getLocked() throw (uno::RuntimeException)
+{
+    return ScVbaControl::getLocked();
 }
 
-void SAL_CALL ScVbaButton::setAutoSize( sal_Bool /*bAutoSize*/ ) throw (uno::RuntimeException)
+void SAL_CALL ScVbaButton::setLocked( sal_Bool bLocked ) throw (uno::RuntimeException)
 {
+    ScVbaControl::setLocked( bLocked );
 }
 
 sal_Bool SAL_CALL ScVbaButton::getCancel() throw (uno::RuntimeException)
@@ -82,16 +93,16 @@ void SAL_CALL ScVbaButton::setDefault( sal_Bool /*bDefault*/ ) throw (uno::Runti
 
 sal_Int32 SAL_CALL ScVbaButton::getBackColor() throw (uno::RuntimeException)
 {
-    return 0;
+    return ScVbaControl::getBackColor();
 }
 
-void SAL_CALL ScVbaButton::setBackColor( sal_Int32 /*nBackColor*/ ) throw (uno::RuntimeException)
+void SAL_CALL ScVbaButton::setBackColor( sal_Int32 nBackColor ) throw (uno::RuntimeException)
 {
+    ScVbaControl::setBackColor( nBackColor );
 }
 
 sal_Int32 SAL_CALL ScVbaButton::getForeColor() throw (uno::RuntimeException)
 {
-    return 0;
 }
 
 void SAL_CALL ScVbaButton::setForeColor( sal_Int32 /*nForeColor*/ ) throw (uno::RuntimeException)
diff --git a/vbahelper/source/msforms/vbabutton.hxx b/vbahelper/source/msforms/vbabutton.hxx
index e999acf..48bd099 100644
--- a/vbahelper/source/msforms/vbabutton.hxx
+++ b/vbahelper/source/msforms/vbabutton.hxx
@@ -52,6 +52,8 @@ public:
     virtual void SAL_CALL setBackColor( sal_Int32 nBackColor ) throw (css::uno::RuntimeException);
     virtual sal_Int32 SAL_CALL getForeColor() throw (css::uno::RuntimeException);
     virtual void SAL_CALL setForeColor( sal_Int32 nForeColor ) throw (css::uno::RuntimeException);
+    virtual sal_Bool SAL_CALL getLocked() throw (css::uno::RuntimeException);
+    virtual void SAL_CALL setLocked( sal_Bool bAutoSize ) throw (css::uno::RuntimeException);
     virtual css::uno::Reference< ov::msforms::XNewFont > SAL_CALL getFont() throw (css::uno::RuntimeException);
     //XHelperInterface
     virtual rtl::OUString& getServiceImplName();
diff --git a/vbahelper/source/msforms/vbacheckbox.cxx b/vbahelper/source/msforms/vbacheckbox.cxx
index 290cdd1..3d91943 100644
--- a/vbahelper/source/msforms/vbacheckbox.cxx
+++ b/vbahelper/source/msforms/vbacheckbox.cxx
@@ -114,4 +114,33 @@ ScVbaCheckbox::getServiceNames()
     return aServiceNames;
 }
 
+sal_Int32 SAL_CALL ScVbaCheckbox::getBackColor() throw (uno::RuntimeException)
+{
+    return ScVbaControl::getBackColor();
+}
+
+void SAL_CALL ScVbaCheckbox::setBackColor( sal_Int32 nBackColor ) throw (uno::RuntimeException)
+{
+    ScVbaControl::setBackColor( nBackColor );
+}
+
+sal_Bool SAL_CALL ScVbaCheckbox::getAutoSize() throw (uno::RuntimeException)
+{
+    return ScVbaControl::getAutoSize();
+}
+
+void SAL_CALL ScVbaCheckbox::setAutoSize( sal_Bool bAutoSize ) throw (uno::RuntimeException)
+{
+    ScVbaControl::setAutoSize( bAutoSize );
+}
+
+sal_Bool SAL_CALL ScVbaCheckbox::getLocked() throw (uno::RuntimeException)
+{
+    return ScVbaControl::getLocked();
+}
+
+void SAL_CALL ScVbaCheckbox::setLocked( sal_Bool bLocked ) throw (uno::RuntimeException)
+{
+    ScVbaControl::setLocked( bLocked );
+}
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vbahelper/source/msforms/vbacheckbox.hxx b/vbahelper/source/msforms/vbacheckbox.hxx
index e6cc4fe..cc6cbee6 100644
--- a/vbahelper/source/msforms/vbacheckbox.hxx
+++ b/vbahelper/source/msforms/vbacheckbox.hxx
@@ -45,6 +45,12 @@ public:
     virtual css::uno::Any SAL_CALL getValue() throw (css::uno::RuntimeException);
     virtual void SAL_CALL setValue( const css::uno::Any& _value ) throw (css::uno::RuntimeException);
     virtual css::uno::Reference< ov::msforms::XNewFont > SAL_CALL getFont() throw (css::uno::RuntimeException);
+    virtual sal_Int32 SAL_CALL getBackColor() throw (css::uno::RuntimeException);
+    virtual void SAL_CALL setBackColor( sal_Int32 nBackColor ) throw (css::uno::RuntimeException);
+    virtual sal_Bool SAL_CALL getAutoSize() throw (css::uno::RuntimeException);
+    virtual void SAL_CALL setAutoSize( sal_Bool bAutoSize ) throw (css::uno::RuntimeException);
+    virtual sal_Bool SAL_CALL getLocked() throw (css::uno::RuntimeException);
+    virtual void SAL_CALL setLocked( sal_Bool bAutoSize ) throw (css::uno::RuntimeException);
     // XDefaultProperty
     rtl::OUString SAL_CALL getDefaultPropertyName(  ) throw (css::uno::RuntimeException) { return ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Value")); }
     //XHelperInterface
diff --git a/vbahelper/source/msforms/vbacombobox.cxx b/vbahelper/source/msforms/vbacombobox.cxx
index 6f5049c..689e8c4 100644
--- a/vbahelper/source/msforms/vbacombobox.cxx
+++ b/vbahelper/source/msforms/vbacombobox.cxx
@@ -278,6 +278,35 @@ ScVbaComboBox::getServiceImplName()
     static rtl::OUString sImplName( RTL_CONSTASCII_USTRINGPARAM("ScVbaComboBox") );
     return sImplName;
 }
+sal_Int32 SAL_CALL ScVbaComboBox::getBackColor() throw (uno::RuntimeException)
+{
+    return ScVbaControl::getBackColor();
+}
+
+void SAL_CALL ScVbaComboBox::setBackColor( sal_Int32 nBackColor ) throw (uno::RuntimeException)
+{
+    ScVbaControl::setBackColor( nBackColor );
+}
+
+sal_Bool SAL_CALL ScVbaComboBox::getAutoSize() throw (uno::RuntimeException)
+{
+    return ScVbaControl::getAutoSize();
+}
+
+void SAL_CALL ScVbaComboBox::setAutoSize( sal_Bool bAutoSize ) throw (uno::RuntimeException)
+{
+    ScVbaControl::setAutoSize( bAutoSize );
+}
+
+sal_Bool SAL_CALL ScVbaComboBox::getLocked() throw (uno::RuntimeException)
+{
+    return ScVbaControl::getLocked();
+}
+
+void SAL_CALL ScVbaComboBox::setLocked( sal_Bool bLocked ) throw (uno::RuntimeException)
+{
+    ScVbaControl::setLocked( bLocked );
+}
 
 uno::Sequence< rtl::OUString >
 ScVbaComboBox::getServiceNames()
diff --git a/vbahelper/source/msforms/vbacombobox.hxx b/vbahelper/source/msforms/vbacombobox.hxx
index e2b1716..8ab8855 100644
--- a/vbahelper/source/msforms/vbacombobox.hxx
+++ b/vbahelper/source/msforms/vbacombobox.hxx
@@ -73,6 +73,12 @@ public:
     virtual void SAL_CALL setTextAlign( sal_Int32 nTextAlign ) throw (css::uno::RuntimeException);
     virtual sal_Int32 SAL_CALL getTextLength() throw (css::uno::RuntimeException);
     virtual css::uno::Reference< ov::msforms::XNewFont > SAL_CALL getFont() throw (css::uno::RuntimeException);
+    virtual sal_Int32 SAL_CALL getBackColor() throw (css::uno::RuntimeException);
+    virtual void SAL_CALL setBackColor( sal_Int32 nBackColor ) throw (css::uno::RuntimeException);
+    virtual sal_Bool SAL_CALL getAutoSize() throw (css::uno::RuntimeException);
+    virtual void SAL_CALL setAutoSize( sal_Bool bAutoSize ) throw (css::uno::RuntimeException);
+    virtual sal_Bool SAL_CALL getLocked() throw (css::uno::RuntimeException);
+    virtual void SAL_CALL setLocked( sal_Bool bAutoSize ) throw (css::uno::RuntimeException);
 
     // Methods
     virtual void SAL_CALL AddItem( const css::uno::Any& pvargItem, const css::uno::Any& pvargIndex ) throw (css::uno::RuntimeException);
diff --git a/vbahelper/source/msforms/vbacontrol.cxx b/vbahelper/source/msforms/vbacontrol.cxx
index 03cd014..a2dc55f 100644
--- a/vbahelper/source/msforms/vbacontrol.cxx
+++ b/vbahelper/source/msforms/vbacontrol.cxx
@@ -614,6 +614,8 @@ void SAL_CALL ScVbaControl::setTabIndex( sal_Int32 /*nTabIndex*/ ) throw (uno::R
             return new ScVbaSpinButton( xVbaParent, xContext, xControlShape, xModel, xGeoHelper.release() );
         case form::FormComponentType::IMAGECONTROL:
             return new ScVbaImage( xVbaParent, xContext, xControlShape, xModel, xGeoHelper.release() );
+        case form::FormComponentType::SCROLLBAR:
+            return new ScVbaScrollBar( xVbaParent, xContext, xControlShape, xModel, xGeoHelper.release() );
     }
     throw uno::RuntimeException( rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Unsupported control.")), uno::Reference< uno::XInterface >() );
 }
@@ -699,6 +701,46 @@ ScVbaControl::getServiceNames()
     return aServiceNames;
 }
 
+sal_Int32 nSysCols[] = { 0xC8D0D4, 0x0, 0x6A240A, 0x808080, 0xE4E4E4, 0xFFFFFF, 0x0, 0x0, 0x0, 0xFFFFFF, 0xE4E4E4, 0xE4E4E4, 0x808080, 0x6A240A, 0xFFFFFF, 0xE4E4E4, 0x808080, 0x808080, 0x0, 0xC8D0D4, 0xFFFFFF, 0x404040, 0xE4E4E4, 0x0, 0xE1FFFF };
+
+sal_Int32 ScVbaControl::getBackColor() throw (uno::RuntimeException)
+{
+    sal_Int32 nBackColor = 0;
+    m_xProps->getPropertyValue(  rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("BackgroundColor") ) ) >>= nBackColor;
+    return nBackColor;
+}
+
+void ScVbaControl::setBackColor( sal_Int32 nBackColor ) throw (uno::RuntimeException)
+{
+    if ( ( nBackColor >= (sal_Int32)0x80000000 ) && ( nBackColor <= (sal_Int32)0x80000018 ) )
+    {
+        nBackColor = nSysCols[ nBackColor - 0x80000000 ];
+    }
+    m_xProps->setPropertyValue(  rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("BackgroundColor") ), uno::makeAny( XLRGBToOORGB( nBackColor ) ) );
+}
+
+sal_Bool ScVbaControl::getAutoSize() throw (uno::RuntimeException)
+{
+    return sal_False;
+}
+
+// currently no implementation for this
+void ScVbaControl::setAutoSize( sal_Bool /*bAutoSize*/ ) throw (uno::RuntimeException)
+{
+}
+
+sal_Bool ScVbaControl::getLocked() throw (uno::RuntimeException)
+{
+    sal_Bool bRes( sal_False );
+    m_xProps->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("ReadOnly") ) ) >>= bRes;
+    return bRes;
+}
+
+void ScVbaControl::setLocked( sal_Bool bLocked ) throw (uno::RuntimeException)
+{
+    m_xProps->setPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("ReadOnly") ), uno::makeAny( bLocked ) );
+}
+
 typedef cppu::WeakImplHelper1< XControlProvider > ControlProvider_BASE;
 class ControlProviderImpl : public ControlProvider_BASE
 {
diff --git a/vbahelper/source/msforms/vbacontrol.hxx b/vbahelper/source/msforms/vbacontrol.hxx
index 597c635..9c7c84d 100644
--- a/vbahelper/source/msforms/vbacontrol.hxx
+++ b/vbahelper/source/msforms/vbacontrol.hxx
@@ -116,6 +116,14 @@ public:
     //XHelperInterface
     virtual rtl::OUString& getServiceImplName();
     virtual css::uno::Sequence<rtl::OUString> getServiceNames();
+    //General helper methods for properties ( may or maynot be relevant for all
+    //controls
+    sal_Int32 getBackColor() throw (css::uno::RuntimeException);
+    void setBackColor( sal_Int32 nBackColor ) throw (css::uno::RuntimeException);
+    sal_Bool getAutoSize() throw (css::uno::RuntimeException);
+    void setAutoSize( sal_Bool bAutoSize ) throw (css::uno::RuntimeException);
+    sal_Bool getLocked() throw (css::uno::RuntimeException);
+    void setLocked( sal_Bool bAutoSize ) throw (css::uno::RuntimeException);
 };
 
 
diff --git a/vbahelper/source/msforms/vbaimage.cxx b/vbahelper/source/msforms/vbaimage.cxx
index 08a3007..7dfc64f 100644
--- a/vbahelper/source/msforms/vbaimage.cxx
+++ b/vbahelper/source/msforms/vbaimage.cxx
@@ -56,4 +56,14 @@ ScVbaImage::getServiceNames()
     return aServiceNames;
 }
 
+sal_Int32 SAL_CALL ScVbaImage::getBackColor() throw (uno::RuntimeException)
+{
+    return ScVbaControl::getBackColor();
+}
+
+void SAL_CALL ScVbaImage::setBackColor( sal_Int32 nBackColor ) throw (uno::RuntimeException)
+{
+    ScVbaControl::setBackColor( nBackColor );
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vbahelper/source/msforms/vbaimage.hxx b/vbahelper/source/msforms/vbaimage.hxx
index e360fe4..c5a9b1b 100644
--- a/vbahelper/source/msforms/vbaimage.hxx
+++ b/vbahelper/source/msforms/vbaimage.hxx
@@ -39,6 +39,8 @@ class ScVbaImage : public ImageImpl_BASE
 {
 public:
     ScVbaImage( const css::uno::Reference< ov::XHelperInterface >& xParent, const css::uno::Reference< css::uno::XComponentContext >& xContext, const css::uno::Reference< css::uno::XInterface >& xControl, const css::uno::Reference< css::frame::XModel >& xModel, ov::AbstractGeometryAttributes* pGeomHelper  );
+    virtual SAL_CALL sal_Int32 getBackColor() throw (css::uno::RuntimeException);
+    virtual void SAL_CALL setBackColor( sal_Int32 nBackColor ) throw (css::uno::RuntimeException);
     //XHelperInterface
     virtual rtl::OUString& getServiceImplName();
     virtual css::uno::Sequence<rtl::OUString> getServiceNames();
diff --git a/vbahelper/source/msforms/vbalabel.cxx b/vbahelper/source/msforms/vbalabel.cxx
index 4795a25..860c090 100644
--- a/vbahelper/source/msforms/vbalabel.cxx
+++ b/vbahelper/source/msforms/vbalabel.cxx
@@ -90,6 +90,26 @@ rtl::OUString& ScVbaLabel::getServiceImplName()
     return sImplName;
 }
 
+sal_Int32 SAL_CALL ScVbaLabel::getBackColor() throw (uno::RuntimeException)
+{
+    return ScVbaControl::getBackColor();
+}
+
+void SAL_CALL ScVbaLabel::setBackColor( sal_Int32 nBackColor ) throw (uno::RuntimeException)
+{
+    ScVbaControl::setBackColor( nBackColor );
+}
+
+sal_Bool SAL_CALL ScVbaLabel::getAutoSize() throw (uno::RuntimeException)
+{
+    return ScVbaControl::getAutoSize();
+}
+
+void SAL_CALL ScVbaLabel::setAutoSize( sal_Bool bAutoSize ) throw (uno::RuntimeException)
+{
+    ScVbaControl::setAutoSize( bAutoSize );
+}
+
 uno::Sequence< rtl::OUString >
 ScVbaLabel::getServiceNames()
 {
diff --git a/vbahelper/source/msforms/vbalabel.hxx b/vbahelper/source/msforms/vbalabel.hxx
index 1166f04..f656aaf 100644
--- a/vbahelper/source/msforms/vbalabel.hxx
+++ b/vbahelper/source/msforms/vbalabel.hxx
@@ -48,6 +48,10 @@ public:
     virtual rtl::OUString SAL_CALL getAccelerator() throw (css::uno::RuntimeException);
     virtual void SAL_CALL setAccelerator( const rtl::OUString& _accelerator ) throw (css::uno::RuntimeException);
     virtual css::uno::Reference< ov::msforms::XNewFont > SAL_CALL getFont() throw (css::uno::RuntimeException);
+    virtual sal_Int32 SAL_CALL getBackColor() throw (css::uno::RuntimeException);
+    virtual void SAL_CALL setBackColor( sal_Int32 nBackColor ) throw (css::uno::RuntimeException);
+    virtual sal_Bool SAL_CALL getAutoSize() throw (css::uno::RuntimeException);
+    virtual void SAL_CALL setAutoSize( sal_Bool bAutoSize ) throw (css::uno::RuntimeException);
     //XHelperInterface
     virtual rtl::OUString& getServiceImplName();
     virtual css::uno::Sequence<rtl::OUString> getServiceNames();
diff --git a/vbahelper/source/msforms/vbatextbox.cxx b/vbahelper/source/msforms/vbatextbox.cxx
index 39861b9..8ba1407 100644
--- a/vbahelper/source/msforms/vbatextbox.cxx
+++ b/vbahelper/source/msforms/vbatextbox.cxx
@@ -152,6 +152,36 @@ uno::Reference< msforms::XNewFont > SAL_CALL ScVbaTextBox::getFont() throw (uno:
     return new VbaNewFont( this, mxContext, m_xProps );
 }
 
+sal_Int32 SAL_CALL ScVbaTextBox::getBackColor() throw (uno::RuntimeException)
+{
+    return ScVbaControl::getBackColor();
+}
+
+void SAL_CALL ScVbaTextBox::setBackColor( sal_Int32 nBackColor ) throw (uno::RuntimeException)
+{
+    ScVbaControl::setBackColor( nBackColor );
+}
+
+sal_Bool SAL_CALL ScVbaTextBox::getAutoSize() throw (uno::RuntimeException)
+{
+    return ScVbaControl::getAutoSize();
+}
+
+void SAL_CALL ScVbaTextBox::setAutoSize( sal_Bool bAutoSize ) throw (uno::RuntimeException)
+{
+    ScVbaControl::setAutoSize( bAutoSize );
+}
+
+sal_Bool SAL_CALL ScVbaTextBox::getLocked() throw (uno::RuntimeException)
+{
+    return ScVbaControl::getLocked();
+}
+
+void SAL_CALL ScVbaTextBox::setLocked( sal_Bool bLocked ) throw (uno::RuntimeException)
+{
+    ScVbaControl::setLocked( bLocked );
+}
+
 rtl::OUString&
 ScVbaTextBox::getServiceImplName()
 {
diff --git a/vbahelper/source/msforms/vbatextbox.hxx b/vbahelper/source/msforms/vbatextbox.hxx
index bdbff16..a9e21ad 100644
--- a/vbahelper/source/msforms/vbatextbox.hxx
+++ b/vbahelper/source/msforms/vbatextbox.hxx
@@ -54,6 +54,13 @@ public:
     virtual void SAL_CALL setBorderStyle( sal_Int32 nBorderStyle ) throw (css::uno::RuntimeException);
     virtual sal_Int32 SAL_CALL getTextLength() throw (css::uno::RuntimeException);
     virtual css::uno::Reference< ov::msforms::XNewFont > SAL_CALL getFont() throw (css::uno::RuntimeException);
+    virtual sal_Int32 SAL_CALL getBackColor() throw (css::uno::RuntimeException);
+    virtual void SAL_CALL setBackColor( sal_Int32 nBackColor ) throw (css::uno::RuntimeException);
+    virtual sal_Bool SAL_CALL getAutoSize() throw (css::uno::RuntimeException);
+    virtual void SAL_CALL setAutoSize( sal_Bool bAutoSize ) throw (css::uno::RuntimeException);
+    virtual sal_Bool SAL_CALL getLocked() throw (css::uno::RuntimeException);
+    virtual void SAL_CALL setLocked( sal_Bool bAutoSize ) throw (css::uno::RuntimeException);
+
     // XDefaultProperty
     rtl::OUString SAL_CALL getDefaultPropertyName(  ) throw (css::uno::RuntimeException) { return ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Value")); }
     //XHelperInterface
diff --git a/vbahelper/source/msforms/vbatogglebutton.cxx b/vbahelper/source/msforms/vbatogglebutton.cxx
index b989616..0e2b056 100644
--- a/vbahelper/source/msforms/vbatogglebutton.cxx
+++ b/vbahelper/source/msforms/vbatogglebutton.cxx
@@ -99,11 +99,12 @@ ScVbaToggleButton::setValue( const uno::Any& _value ) throw (uno::RuntimeExcepti
 
 sal_Bool SAL_CALL ScVbaToggleButton::getAutoSize() throw (uno::RuntimeException)
 {
-    return sal_False;
+    return ScVbaControl::getAutoSize();
 }
 
-void SAL_CALL ScVbaToggleButton::setAutoSize( sal_Bool /*bAutoSize*/ ) throw (uno::RuntimeException)
+void SAL_CALL ScVbaToggleButton::setAutoSize( sal_Bool bAutoSize ) throw (uno::RuntimeException)
 {
+    ScVbaControl::setAutoSize( bAutoSize );
 }
 
 sal_Bool SAL_CALL ScVbaToggleButton::getCancel() throw (uno::RuntimeException)
@@ -126,11 +127,12 @@ void SAL_CALL ScVbaToggleButton::setDefault( sal_Bool /*bDefault*/ ) throw (uno:
 
 sal_Int32 SAL_CALL ScVbaToggleButton::getBackColor() throw (uno::RuntimeException)
 {
-    return 0;
+    return ScVbaControl::getBackColor();
 }
 
-void SAL_CALL ScVbaToggleButton::setBackColor( sal_Int32 /*nBackColor*/ ) throw (uno::RuntimeException)
+void SAL_CALL ScVbaToggleButton::setBackColor( sal_Int32 nBackColor ) throw (uno::RuntimeException)
 {
+    ScVbaControl::setBackColor( nBackColor );
 }
 
 sal_Int32 SAL_CALL ScVbaToggleButton::getForeColor() throw (uno::RuntimeException)
@@ -147,6 +149,16 @@ uno::Reference< msforms::XNewFont > SAL_CALL ScVbaToggleButton::getFont() throw
     return new VbaNewFont( this, mxContext, m_xProps );
 }
 
+sal_Bool SAL_CALL ScVbaToggleButton::getLocked() throw (uno::RuntimeException)
+{
+    return ScVbaControl::getLocked();
+}
+
+void SAL_CALL ScVbaToggleButton::setLocked( sal_Bool bLocked ) throw (uno::RuntimeException)
+{
+    ScVbaControl::setLocked( bLocked );
+}
+
 rtl::OUString&
 ScVbaToggleButton::getServiceImplName()
 {
diff --git a/vbahelper/source/msforms/vbatogglebutton.hxx b/vbahelper/source/msforms/vbatogglebutton.hxx
index 6e8a0cb..7394bea 100644
--- a/vbahelper/source/msforms/vbatogglebutton.hxx
+++ b/vbahelper/source/msforms/vbatogglebutton.hxx
@@ -56,6 +56,8 @@ public:
     virtual void SAL_CALL setBackColor( sal_Int32 nBackColor ) throw (css::uno::RuntimeException);
     virtual sal_Int32 SAL_CALL getForeColor() throw (css::uno::RuntimeException);
     virtual void SAL_CALL setForeColor( sal_Int32 nForeColor ) throw (css::uno::RuntimeException);
+    virtual sal_Bool SAL_CALL getLocked() throw (css::uno::RuntimeException);
+    virtual void SAL_CALL setLocked( sal_Bool bAutoSize ) throw (css::uno::RuntimeException);
     virtual css::uno::Reference< ov::msforms::XNewFont > SAL_CALL getFont() throw (css::uno::RuntimeException);
     //XHelperInterface
     virtual rtl::OUString& getServiceImplName();
-- 
1.7.3.4


--------------070704010006060703060206
Content-Type: text/plain; charset=UTF-8;
 name="0006-vba-implementation-for-Application.OnKey.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment;
 filename="0006-vba-implementation-for-Application.OnKey.patch"

=46rom a1d3cb47d2fd49ac06a49725f5ceac1376a1138d Mon Sep 17 00:00:00 2001
From: Noel Power <noel.power at novell.com>
Date: Mon, 5 Mar 2012 14:54:04 +0000
Subject: [PATCH 6/7] vba implementation for Application.OnKey

support import of key shortcut for macro ( Excel only )
---
 filter/inc/filter/msfilter/msvbahelper.hxx        |    6 +-
 filter/source/msfilter/msvbahelper.cxx            |  176 +++++++++++++++=
++++++
 oovbaapi/ooo/vba/XApplicationBase.idl             |    2 +-
 oox/source/ole/vbamodule.cxx                      |   36 ++++-
 vbahelper/inc/vbahelper/vbaapplicationbase.hxx    |    1 +
 vbahelper/source/vbahelper/vbaapplicationbase.cxx |   23 +++
 6 files changed, 240 insertions(+), 4 deletions(-)

diff --git a/filter/inc/filter/msfilter/msvbahelper.hxx b/filter/inc/filt=
er/msfilter/msvbahelper.hxx
index affc8b2..e7e6533 100644
--- a/filter/inc/filter/msfilter/msvbahelper.hxx
+++ b/filter/inc/filter/msfilter/msvbahelper.hxx
@@ -33,8 +33,9 @@
 #include <com/sun/star/lang/XInitialization.hpp>
 #include <com/sun/star/lang/XServiceInfo.hpp>
 #include <com/sun/star/script/vba/XVBAMacroResolver.hpp>
+#include <com/sun/star/awt/KeyEvent.hpp>
+#include <com/sun/star/frame/XModel.hpp>
 #include "filter/msfilter/msfilterdllapi.h"
-
 namespace ooo {
 namespace vba {
=20
@@ -55,7 +56,8 @@ MSFILTER_DLLPUBLIC ::rtl::OUString getDefaultProjectNam=
e( SfxObjectShell* pShell
 MSFILTER_DLLPUBLIC ::rtl::OUString resolveVBAMacro( SfxObjectShell* pShe=
ll, const ::rtl::OUString& rLibName, const ::rtl::OUString& rModuleName, =
const ::rtl::OUString& rMacroName );
 MSFILTER_DLLPUBLIC MacroResolvedInfo resolveVBAMacro( SfxObjectShell* pS=
hell, const ::rtl::OUString& rMacroName, bool bSearchGlobalTemplates =3D =
false );
 MSFILTER_DLLPUBLIC sal_Bool executeMacro( SfxObjectShell* pShell, const =
String& sMacroName, com::sun::star::uno::Sequence< com::sun::star::uno::A=
ny >& aArgs, com::sun::star::uno::Any& aRet, const com::sun::star::uno::A=
ny& aCaller );
-
+MSFILTER_DLLPUBLIC ::com::sun::star::awt::KeyEvent parseKeyEvent( const =
::rtl::OUString& sKey ) throw (::com::sun::star::uno::RuntimeException);
+MSFILTER_DLLPUBLIC void applyShortCutKeyBinding ( const ::com::sun::star=
::uno::Reference< com::sun::star::frame::XModel >& rxDoc, const ::com::su=
n::star::awt::KeyEvent& rKeyEvent, const ::rtl::OUString& sMacro ) throw =
(::com::sun::star::uno::RuntimeException);
 // =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
=20
 typedef ::cppu::WeakImplHelper3<
diff --git a/filter/source/msfilter/msvbahelper.cxx b/filter/source/msfil=
ter/msvbahelper.cxx
index ca0288f..962d211 100644
--- a/filter/source/msfilter/msvbahelper.cxx
+++ b/filter/source/msfilter/msvbahelper.cxx
@@ -42,6 +42,12 @@
 #include <osl/file.hxx>
 #include <unotools/pathoptions.hxx>
=20
+#include <com/sun/star/awt/KeyModifier.hpp>
+#include <svtools/acceleratorexecute.hxx>
+#include <com/sun/star/ui/XUIConfigurationManagerSupplier.hpp>
+#include <com/sun/star/ui/XUIConfigurationManager.hpp>
+#include <map>
+
 using namespace ::com::sun::star;
=20
 namespace ooo {
@@ -581,6 +587,176 @@ void SAL_CALL VBAMacroResolver::initialize( const u=
no::Sequence< uno::Any >& rAr
     throw uno::RuntimeException();
 }
=20
+bool getModifier( char c, sal_uInt16& mod )
+{
+    static const char modifiers[] =3D "+^%";
+    static const sal_uInt16 KEY_MODS[] =3D {KEY_SHIFT, KEY_MOD1, KEY_MOD=
2};
+
+    for ( unsigned int i=3D0; i<SAL_N_ELEMENTS(modifiers); ++i )
+    {
+        if ( c =3D=3D modifiers[i] )
+        {
+            mod =3D mod | KEY_MODS[ i ];
+            return true;
+        }
+    }
+    return false;
+}
+
+typedef std::map< rtl::OUString, sal_uInt16 > MSKeyCodeMap;
+
+sal_uInt16 parseChar( char c ) throw ( uno::RuntimeException )
+{
+    sal_uInt16 nVclKey =3D 0;
+    // do we care about locale here for isupper etc. ? probably not
+    if ( isalpha( c ) )
+    {
+        nVclKey |=3D ( toupper( c ) - 'A' ) + KEY_A;
+        if ( isupper( c ) )
+            nVclKey |=3D KEY_SHIFT;
+    }
+    else if ( isdigit( c ) )
+        nVclKey |=3D ( c  - '0' ) + KEY_0;
+    else if ( c =3D=3D '~' ) // special case
+        nVclKey =3D KEY_RETURN;
+    else if ( c =3D=3D ' ' ) // special case
+        nVclKey =3D KEY_SPACE;
+    else // I guess we have a problem ( but not sure if locale specific =
keys might come into play here )
+        throw uno::RuntimeException();
+    return nVclKey;
+}
+
+struct KeyCodeEntry
+{
+   const char* sName;
+   sal_uInt16 nCode;
+};
+
+KeyCodeEntry aMSKeyCodesData[] =3D {
+    { "BACKSPACE", KEY_BACKSPACE },
+    { "BS", KEY_BACKSPACE },
+    { "DELETE", KEY_DELETE },
+    { "DEL", KEY_DELETE },
+    { "DOWN", KEY_DOWN },
+    { "UP", KEY_UP },
+    { "LEFT", KEY_LEFT },
+    { "RIGHT", KEY_RIGHT },
+    { "END", KEY_END },
+    { "ESCAPE", KEY_ESCAPE },
+    { "ESC", KEY_ESCAPE },
+    { "HELP", KEY_HELP },
+    { "HOME", KEY_HOME },
+    { "PGDN", KEY_PAGEDOWN },
+    { "PGUP", KEY_PAGEUP },
+    { "INSERT", KEY_INSERT },
+    { "SCROLLLOCK", KEY_SCROLLLOCK },
+    { "NUMLOCK", KEY_NUMLOCK },
+    { "TAB", KEY_TAB },
+    { "F1", KEY_F1 },
+    { "F2", KEY_F2 },
+    { "F3", KEY_F3 },
+    { "F4", KEY_F4 },
+    { "F5", KEY_F5 },
+    { "F6", KEY_F6 },
+    { "F7", KEY_F7 },
+    { "F8", KEY_F8 },
+    { "F9", KEY_F1 },
+    { "F10", KEY_F10 },
+    { "F11", KEY_F11 },
+    { "F12", KEY_F12 },
+    { "F13", KEY_F13 },
+    { "F14", KEY_F14 },
+    { "F15", KEY_F15 },
+};
+
+awt::KeyEvent parseKeyEvent( const ::rtl::OUString& Key ) throw ( uno::R=
untimeException )
+{
+    static MSKeyCodeMap msKeyCodes;
+    if ( msKeyCodes.empty() )
+    {
+        for ( unsigned int i =3D 0; i < SAL_N_ELEMENTS( aMSKeyCodesData =
); ++i )
+        {
+            msKeyCodes[ rtl::OUString::createFromAscii( aMSKeyCodesData[=
 i ].sName ) ] =3D aMSKeyCodesData[ i ].nCode;
+        }
+    }
+    rtl::OUString sKeyCode;
+    sal_uInt16 nVclKey =3D 0;
+
+    // parse the modifier if any
+    for ( int i=3D0; i<Key.getLength(); ++i )
+    {
+        if ( ! getModifier( Key[ i ], nVclKey ) )
+        {
+            sKeyCode =3D Key.copy( i );
+            break;
+        }
+    }
+
+    // check if keycode is surrounded by '{}', if so scoop out the conte=
nts
+    // else it should be just one char of ( 'a-z,A-Z,0-9' )
+    if ( sKeyCode.getLength() =3D=3D 1 ) // ( a single char )
+    {
+        char c =3D (char)( sKeyCode[ 0 ] );
+        nVclKey |=3D parseChar( c );
+    }
+    else // key should be enclosed in '{}'
+    {
+        if ( sKeyCode.getLength() < 3 ||  !( sKeyCode[0] =3D=3D '{' && s=
KeyCode[sKeyCode.getLength() - 1 ] =3D=3D '}' ) )
+            throw uno::RuntimeException();
+
+        sKeyCode =3D sKeyCode.copy(1, sKeyCode.getLength() - 2 );
+
+        if ( sKeyCode.getLength() =3D=3D 1 )
+            nVclKey |=3D parseChar( (char)( sKeyCode[ 0 ] ) );
+        else
+        {
+            MSKeyCodeMap::iterator it =3D msKeyCodes.find( sKeyCode );
+            if ( it =3D=3D msKeyCodes.end() ) // unknown or unsupported
+                throw uno::RuntimeException();
+            nVclKey |=3D it->second;
+        }
+    }
+
+    awt::KeyEvent aKeyEvent =3D svt::AcceleratorExecute::st_VCLKey2AWTKe=
y( KeyCode( nVclKey ) );
+    return aKeyEvent;
+}
+
+void applyShortCutKeyBinding ( const uno::Reference< frame::XModel >& rx=
Model, const awt::KeyEvent& rKeyEvent, const ::rtl::OUString& rMacroName =
) throw (uno::RuntimeException)
+{
+    rtl::OUString MacroName( rMacroName );
+    if ( !MacroName.isEmpty() )
+    {
+        ::rtl::OUString sSeparator(RTL_CONSTASCII_USTRINGPARAM("/"));
+        ::rtl::OUString sMacroSeparator(RTL_CONSTASCII_USTRINGPARAM("!")=
);
+        ::rtl::OUString aMacroName =3D MacroName.trim();
+        if (0 =3D=3D aMacroName.indexOf('!'))
+            MacroName =3D aMacroName.copy(1).trim();
+        SfxObjectShell* pShell =3D NULL;
+        if ( rxModel.is() )
+        {
+            uno::Reference< lang::XUnoTunnel >  xObjShellTunnel( rxModel=
, uno::UNO_QUERY_THROW );
+            pShell =3D reinterpret_cast<SfxObjectShell*>( xObjShellTunne=
l->getSomething(SfxObjectShell::getUnoTunnelId()));
+            if ( !pShell )
+                throw uno::RuntimeException();
+        }
+        MacroResolvedInfo aMacroInfo =3D resolveVBAMacro( pShell, aMacro=
Name );
+        if( !aMacroInfo.mbFound )
+            throw uno::RuntimeException( rtl::OUString( RTL_CONSTASCII_U=
STRINGPARAM("The procedure doesn't exist") ), uno::Reference< uno::XInter=
face >() );
+       MacroName =3D aMacroInfo.msResolvedMacro;
+    }
+    uno::Reference< ui::XUIConfigurationManagerSupplier > xCfgSupplier(r=
xModel, uno::UNO_QUERY_THROW);
+    uno::Reference< ui::XUIConfigurationManager > xCfgMgr =3D xCfgSuppli=
er->getUIConfigurationManager();
+
+    uno::Reference< ui::XAcceleratorConfiguration > xAcc( xCfgMgr->getSh=
ortCutManager(), uno::UNO_QUERY_THROW );
+    if ( MacroName.isEmpty() )
+        // I believe this should really restore the [application] defaul=
t. Since
+        // afaik we don't actually setup application default bindings on=
 import
+        // we don't even know what the 'default' would be for this key
+        xAcc->removeKeyEvent( rKeyEvent );
+    else
+        xAcc->setKeyEvent( rKeyEvent, ooo::vba::makeMacroURL( MacroName =
) );
+
+}
 // =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
=20
 } // namespace vba
diff --git a/oovbaapi/ooo/vba/XApplicationBase.idl b/oovbaapi/ooo/vba/XAp=
plicationBase.idl
index d46eb24..93f39ae 100644
--- a/oovbaapi/ooo/vba/XApplicationBase.idl
+++ b/oovbaapi/ooo/vba/XApplicationBase.idl
@@ -47,7 +47,7 @@ interface XApplicationBase
     [attribute, readonly] any VBE;
=20
     void Quit();
-
+    void OnKey( [in] string Key, [in] any Procedure );
     any CommandBars( [in] any Index );
     any Run([in] string MacroName, [in] /*Optional*/ any varg1, [in] /*O=
ptional*/ any varg2, [in] /*Optional*/ any varg3, [in] /*Optional*/ any v=
arg4, [in] /*Optional*/ any varg5, [in] /*Optional*/ any varg6, [in] /*Op=
tional*/ any varg7, [in] /*Optional*/ any varg8, [in] /*Optional*/ any va=
rg9, [in] /*Optional*/ any varg10, [in] /*Optional*/ any varg11, [in] /*O=
ptional*/ any varg12, [in] /*Optional*/ any varg13, [in] /*Optional*/ any=
 varg14, [in] /*Optional*/ any varg15, [in] /*Optional*/ any varg16, [in]=
 /*Optional*/ any varg17, [in] /*Optional*/ any varg18, [in] /*Optional*/=
 any varg19, [in] /*Optional*/ any varg20, [in] /*Optional*/ any varg21, =
[in] /*Optional*/ any varg22, [in] /*Optional*/ any varg23, [in] /*Option=
al*/ any varg24, [in] /*Optional*/ any varg25, [in] /*Optional*/ any varg=
26, [in] /*Optional*/ any varg27, [in] /*Optional*/ any varg28, [in] /*Op=
tional*/ any varg29, [in] /*Optional*/ any varg30);
     void OnTime( [in] any EarliestTime, [in] string Procedure, [in] any =
LatestTime, [in] any Schedule );
diff --git a/oox/source/ole/vbamodule.cxx b/oox/source/ole/vbamodule.cxx
index cbd9744..5672f59 100644
--- a/oox/source/ole/vbamodule.cxx
+++ b/oox/source/ole/vbamodule.cxx
@@ -33,7 +33,9 @@
 #include <com/sun/star/script/ModuleInfo.hpp>
 #include <com/sun/star/script/ModuleType.hpp>
 #include <com/sun/star/script/vba/XVBAModuleInfo.hpp>
+#include <com/sun/star/awt/KeyEvent.hpp>
 #include <cppuhelper/implbase1.hxx>
+#include <filter/msfilter/msvbahelper.hxx>
 #include "oox/helper/binaryinputstream.hxx"
 #include "oox/helper/storagebase.hxx"
 #include "oox/helper/textinputstream.hxx"
@@ -54,6 +56,7 @@ using namespace ::com::sun::star::uno;
=20
 using ::rtl::OUString;
 using ::rtl::OUStringBuffer;
+using ::com::sun::star::awt::KeyEvent;
 // =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
 typedef ::cppu::WeakImplHelper1< XIndexContainer > OleIdToNameContainer_=
BASE;
 typedef boost::unordered_map< sal_Int32, rtl::OUString >  ObjIdToName;
@@ -237,7 +240,38 @@ OUString VbaModule::readSourceCode( StorageBase& rVb=
aStrg, const Reference< XNam
                 if( aCodeLine.matchAsciiL( RTL_CONSTASCII_STRINGPARAM( "=
Attribute " ) ) )
                 {
                     // attribute
-                    extractOleOverrideFromAttr( aCodeLine, rxOleNameOver=
rides );
+                    int index =3D aCodeLine.indexOf( ".VB_ProcData.VB_In=
voke_Func =3D " );
+                    if ( index !=3D -1 )
+                    {
+                        // format is
+                        //    'Attribute Procedure.VB_ProcData.VB_Invoke=
_Func =3D "*\n14"'
+                        //    where 'Procedure' is the procedure name an=
d '*' is the shortcut key
+                        // note: his is only relevant for Excel, seems t=
hat
+                        // word doesn't store the shortcut in the module=

+                        // attributes
+                        int nSpaceIndex =3D aCodeLine.indexOf(' ');
+                        rtl::OUString sProc =3D aCodeLine.copy( nSpaceIn=
dex + 1, index - nSpaceIndex - 1);
+                        // for Excel short cut key seems limited to cntr=
l+'a-z, A-Z'
+                        rtl::OUString sKey =3D aCodeLine.copy( aCodeLine=
=2ElastIndexOf("=3D ") + 3, 1 );
+                        // only alpha key valid for key shortcut, howeve=
r the api will accept other keys
+                        if ( !isalpha( (char)sKey[ 0 ] ) )
+                        {
+                            // cntrl modifier is explicit ( but could be=
 cntrl+shift ), parseKeyEvent
+                            // will handle and uppercase letter appropri=
ately
+                            rtl::OUString sApiKey =3D "^";
+                            sApiKey +=3D sKey;
+                            try
+                            {
+                                KeyEvent aKeyEvent =3D ooo::vba::parseKe=
yEvent( sApiKey );
+                                ooo::vba::applyShortCutKeyBinding( mxDoc=
Model, aKeyEvent, sProc );
+                            }
+                            catch( Exception& )
+                            {
+                            }
+                        }
+                    }
+                    else
+                        extractOleOverrideFromAttr( aCodeLine, rxOleName=
Overrides );
                 }
                 else
                 {
diff --git a/vbahelper/inc/vbahelper/vbaapplicationbase.hxx b/vbahelper/i=
nc/vbahelper/vbaapplicationbase.hxx
index 7d21d3e..a27afa5 100644
--- a/vbahelper/inc/vbahelper/vbaapplicationbase.hxx
+++ b/vbahelper/inc/vbahelper/vbaapplicationbase.hxx
@@ -58,6 +58,7 @@ public:
     virtual void SAL_CALL setInteractive( ::sal_Bool bInteractive ) thro=
w (css::uno::RuntimeException);
     virtual ::sal_Bool SAL_CALL getVisible() throw (css::uno::RuntimeExc=
eption);
     virtual void SAL_CALL setVisible( ::sal_Bool bVisible ) throw (css::=
uno::RuntimeException);
+    virtual void SAL_CALL OnKey( const ::rtl::OUString& Key, const ::com=
::sun::star::uno::Any& Procedure ) throw (::com::sun::star::uno::RuntimeE=
xception);
     virtual css::uno::Any SAL_CALL CommandBars( const css::uno::Any& aIn=
dex ) throw (css::uno::RuntimeException);
     virtual ::rtl::OUString SAL_CALL getVersion() throw (css::uno::Runti=
meException);
     virtual css::uno::Any SAL_CALL getVBE() throw (css::uno::RuntimeExce=
ption);
diff --git a/vbahelper/source/vbahelper/vbaapplicationbase.cxx b/vbahelpe=
r/source/vbahelper/vbaapplicationbase.cxx
index 162ea28..039494c 100644
--- a/vbahelper/source/vbahelper/vbaapplicationbase.cxx
+++ b/vbahelper/source/vbahelper/vbaapplicationbase.cxx
@@ -277,6 +277,29 @@ void SAL_CALL VbaApplicationBase::setVisible( sal_Bo=
ol bVisible ) throw (uno::Ru
     m_pImpl->mbVisible =3D bVisible;  // dummy implementation
 }
=20
+
+void SAL_CALL
+VbaApplicationBase::OnKey( const ::rtl::OUString& Key, const uno::Any& P=
rocedure ) throw (uno::RuntimeException)
+{
+    // parse the Key & modifiers
+    awt::KeyEvent aKeyEvent =3D parseKeyEvent( Key );
+    rtl::OUString MacroName;
+    Procedure >>=3D MacroName;
+    uno::Reference< frame::XModel > xModel;
+    SbMethod* pMeth =3D StarBASIC::GetActiveMethod();
+    if ( pMeth )
+    {
+        SbModule* pMod =3D dynamic_cast< SbModule* >( pMeth->GetParent()=
 );
+        if ( pMod )
+            xModel =3D StarBASIC::GetModelFromBasic( pMod );
+    }
+
+    if ( !xModel.is() )
+        xModel =3D getCurrentDocument();
+
+    applyShortCutKeyBinding( xModel, aKeyEvent, MacroName );
+}
+
 uno::Any SAL_CALL
 VbaApplicationBase::CommandBars( const uno::Any& aIndex ) throw (uno::Ru=
ntimeException)
 {
--=20
1.7.3.4


--------------070704010006060703060206
Content-Type: text/plain; charset=UTF-8;
 name="0007-support-Sheets.PrintPreview-bnc-757844.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename="0007-support-Sheets.PrintPreview-bnc-757844.patch"



More information about the LibreOffice mailing list