summaryrefslogtreecommitdiff
path: root/vbahelper
diff options
context:
space:
mode:
authorDaniel Rentz [dr] <daniel.rentz@oracle.com>2010-12-27 12:33:29 +0100
committerDaniel Rentz [dr] <daniel.rentz@oracle.com>2010-12-27 12:33:29 +0100
commita0d5accc1e43aa906b9f46297cd8a5460d0c51eb (patch)
tree779391a5f99ee2457b64e1a48c5037b7b6fc7100 /vbahelper
parent0f4dfb2e5e4ebd3b508696459571a84bcd70a714 (diff)
parent794c821e4d48c34aa376cdc7b6ab2cb029d9574d (diff)
dr77: rebase to DEV300m96
Diffstat (limited to 'vbahelper')
-rw-r--r--vbahelper/inc/vbahelper/vbadocumentsbase.hxx8
-rwxr-xr-xvbahelper/inc/vbahelper/vbaeventshelperbase.hxx26
-rw-r--r--vbahelper/inc/vbahelper/vbahelper.hxx7
-rw-r--r--vbahelper/prj/build.lst2
-rw-r--r--vbahelper/source/msforms/makefile.mk9
-rw-r--r--vbahelper/source/msforms/vbacontrol.cxx1
-rw-r--r--vbahelper/source/msforms/vbauserform.cxx36
-rw-r--r--vbahelper/source/vbahelper/makefile.mk8
-rw-r--r--vbahelper/source/vbahelper/vbaapplicationbase.cxx55
-rw-r--r--vbahelper/source/vbahelper/vbacommandbarcontrol.cxx40
-rw-r--r--vbahelper/source/vbahelper/vbadocumentbase.cxx91
-rw-r--r--vbahelper/source/vbahelper/vbadocumentsbase.cxx21
-rwxr-xr-xvbahelper/source/vbahelper/vbaeventshelperbase.cxx29
-rw-r--r--vbahelper/source/vbahelper/vbahelper.cxx286
14 files changed, 260 insertions, 359 deletions
diff --git a/vbahelper/inc/vbahelper/vbadocumentsbase.hxx b/vbahelper/inc/vbahelper/vbadocumentsbase.hxx
index 36bc0a4963ee..8e4554b74b3d 100644
--- a/vbahelper/inc/vbahelper/vbadocumentsbase.hxx
+++ b/vbahelper/inc/vbahelper/vbadocumentsbase.hxx
@@ -57,10 +57,10 @@ public:
// VbaDocumentsBase_BASE
virtual css::uno::Any createCollectionObject( const css::uno::Any& aSource ) = 0;
- // XDocumentsBase
- virtual css::uno::Any SAL_CALL Add() throw (css::uno::RuntimeException);
- virtual void SAL_CALL Close( ) throw (css::uno::RuntimeException);
- virtual css::uno::Any SAL_CALL Open( const ::rtl::OUString& Filename, const css::uno::Any& ReadOnly, const css::uno::Sequence< css::beans::PropertyValue >& rProps ) throw (css::uno::RuntimeException);
+protected:
+ css::uno::Any createDocument() throw (css::uno::RuntimeException);
+ void closeDocuments() throw (css::uno::RuntimeException);
+ css::uno::Any openDocument( const ::rtl::OUString& Filename, const css::uno::Any& ReadOnly, const css::uno::Sequence< css::beans::PropertyValue >& rProps ) throw (css::uno::RuntimeException);
};
#endif /* SC_VBA_WORKBOOKS_HXX */
diff --git a/vbahelper/inc/vbahelper/vbaeventshelperbase.hxx b/vbahelper/inc/vbahelper/vbaeventshelperbase.hxx
index 89d355db71f9..659837535ace 100755
--- a/vbahelper/inc/vbahelper/vbaeventshelperbase.hxx
+++ b/vbahelper/inc/vbahelper/vbaeventshelperbase.hxx
@@ -58,6 +58,17 @@ public:
// XEventListener
virtual void SAL_CALL disposing( const css::lang::EventObject& aSource ) throw (css::uno::RuntimeException);
+ // little helpers ---------------------------------------------------------
+
+ /** Throws, if the passed sequence does not contain a value at the specified index. */
+ static inline void checkArgument( const css::uno::Sequence< css::uno::Any >& rArgs, sal_Int32 nIndex ) throw (css::lang::IllegalArgumentException)
+ { if( (nIndex < 0) || (nIndex >= rArgs.getLength()) ) throw css::lang::IllegalArgumentException(); }
+
+ /** Throws, if the passed sequence does not contain a value of a specific at the specified index. */
+ template< typename Type >
+ static inline void checkArgumentType( const css::uno::Sequence< css::uno::Any >& rArgs, sal_Int32 nIndex ) throw (css::lang::IllegalArgumentException)
+ { checkArgument( rArgs, nIndex ); if( !rArgs[ nIndex ].has< Type >() ) throw css::lang::IllegalArgumentException(); }
+
protected:
// ------------------------------------------------------------------------
@@ -73,7 +84,7 @@ protected:
/** Registers a supported event handler.
- @param nEventId Event identifier from com.sun.star.script.vba.EventIdentifier.
+ @param nEventId Event identifier from com.sun.star.script.vba.VBAEventId.
@param pcMacroName Name of the associated VBA event handler macro.
@param eType Document event or global event.
@param nCancelIndex 0-based index of Cancel parameter, or -1.
@@ -85,15 +96,6 @@ protected:
sal_Int32 nCancelIndex = -1,
const css::uno::Any& rUserData = css::uno::Any() );
- /** Throws, if the passed sequence does not contain a value at the specified index. */
- static inline void checkArgument( const css::uno::Sequence< css::uno::Any >& rArgs, sal_Int32 nIndex ) throw (css::lang::IllegalArgumentException)
- { if( rArgs.getLength() <= nIndex ) throw css::lang::IllegalArgumentException(); }
-
- /** Throws, if the passed sequence does not contain a value of a specific at the specified index. */
- template< typename Type >
- static inline void checkArgumentType( const css::uno::Sequence< css::uno::Any >& rArgs, sal_Int32 nIndex ) throw (css::lang::IllegalArgumentException)
- { if( (rArgs.getLength() <= nIndex) || !rArgs[ nIndex ].has< Type >() ) throw css::lang::IllegalArgumentException(); }
-
// ------------------------------------------------------------------------
struct EventQueueEntry
@@ -105,10 +107,6 @@ protected:
};
typedef ::std::deque< EventQueueEntry > EventQueue;
- /** Derived classes return whether event processing is enabled. Throws if
- the instance is in an invalid state. */
- virtual bool implEventsEnabled() throw (css::uno::RuntimeException) = 0;
-
/** Derived classes do additional prpeparations and return whether the
event handler has to be called. */
virtual bool implPrepareEvent(
diff --git a/vbahelper/inc/vbahelper/vbahelper.hxx b/vbahelper/inc/vbahelper/vbahelper.hxx
index ccabb9114f2d..4c4a9f5d7204 100644
--- a/vbahelper/inc/vbahelper/vbahelper.hxx
+++ b/vbahelper/inc/vbahelper/vbahelper.hxx
@@ -194,11 +194,8 @@ public:
#define VBA_WIDTH "Width"
class VBAHELPER_DLLPUBLIC UserFormGeometryHelper : public AbstractGeometryAttributes
{
- css::uno::Reference< css::awt::XUnitConversion > mxControlUnits;
- css::uno::Reference< css::beans::XPropertySet > mxModel;
-
- sal_Int32 ConvertLogicToPixel( sal_Int32 nValue, sal_Bool bIsPoint, sal_Bool bIsX, sal_Int16 nSourceUnit );
- sal_Int32 ConvertPixelToLogic( sal_Int32 nValue, sal_Bool bIsPoint, sal_Bool bIsX, sal_Int16 nTargetUnit );
+ css::uno::Reference< css::awt::XWindow > mxWindow;
+ sal_Bool mbDialog;
public:
UserFormGeometryHelper( const css::uno::Reference< css::uno::XComponentContext >& xContext, const css::uno::Reference< css::awt::XControl >& xControl );
diff --git a/vbahelper/prj/build.lst b/vbahelper/prj/build.lst
index 20001db859c8..0fadb0c94625 100644
--- a/vbahelper/prj/build.lst
+++ b/vbahelper/prj/build.lst
@@ -1,4 +1,4 @@
-vba vbahelper : oovbaapi basic sfx2 svx filter cppuhelper vcl comphelper svtools tools sal NULL
+vba vbahelper : oovbaapi offuh basic sfx2 svx filter cppuhelper vcl comphelper svtools tools sal LIBXSLT:libxslt NULL
vba vbahelper usr1 - all vba_mkout NULL
#vba vbahelper\inc nmake - all vba_inc NULL
vba vbahelper\source\vbahelper nmake - all vba_vbahelper NULL
diff --git a/vbahelper/source/msforms/makefile.mk b/vbahelper/source/msforms/makefile.mk
index 5fce64649dcb..40a6b8350fd4 100644
--- a/vbahelper/source/msforms/makefile.mk
+++ b/vbahelper/source/msforms/makefile.mk
@@ -70,12 +70,3 @@ SLOFILES=\
.INCLUDE : target.mk
-ALLTAR : \
- $(MISC)$/$(TARGET).don \
-
-$(SLOFILES) : $(MISC)$/$(TARGET).don
-
-$(MISC)$/$(TARGET).don : $(SOLARBINDIR)$/oovbaapi.rdb
- +$(CPPUMAKER) -O$(INCCOM)$/$(TARGET) -BUCR $(SOLARBINDIR)$/oovbaapi.rdb -X$(SOLARBINDIR)$/types.rdb && echo > $@
- echo $@
-
diff --git a/vbahelper/source/msforms/vbacontrol.cxx b/vbahelper/source/msforms/vbacontrol.cxx
index 82b68bbd5be7..ed9f83a7c647 100644
--- a/vbahelper/source/msforms/vbacontrol.cxx
+++ b/vbahelper/source/msforms/vbacontrol.cxx
@@ -227,7 +227,6 @@ void SAL_CALL
ScVbaControl::setLeft( double _left ) throw (uno::RuntimeException)
{
mpGeometryHelper->setLeft( _left );
-
}
double SAL_CALL
diff --git a/vbahelper/source/msforms/vbauserform.cxx b/vbahelper/source/msforms/vbauserform.cxx
index a1333e0a655b..16bc97babd7d 100644
--- a/vbahelper/source/msforms/vbauserform.cxx
+++ b/vbahelper/source/msforms/vbauserform.cxx
@@ -28,7 +28,9 @@
#include "vbauserform.hxx"
#include <com/sun/star/awt/XControl.hpp>
#include <com/sun/star/awt/XControlContainer.hpp>
+#include <com/sun/star/awt/PosSize.hpp>
#include <com/sun/star/beans/PropertyConcept.hpp>
+#include <com/sun/star/util/MeasureUnit.hpp>
#include <basic/sbx.hxx>
#include <basic/sbstar.hxx>
#include <basic/sbmeth.hxx>
@@ -64,9 +66,28 @@ ScVbaUserForm::Show( ) throw (uno::RuntimeException)
{
OSL_TRACE("ScVbaUserForm::Show( )");
short aRet = 0;
- mbDispose = true;
+ mbDispose = true;
+
if ( m_xDialog.is() )
+ {
+ // try to center dialog on model window
+ if( m_xModel.is() ) try
+ {
+ uno::Reference< frame::XController > xController( m_xModel->getCurrentController(), uno::UNO_SET_THROW );
+ uno::Reference< frame::XFrame > xFrame( xController->getFrame(), uno::UNO_SET_THROW );
+ uno::Reference< awt::XWindow > xWindow( xFrame->getContainerWindow(), uno::UNO_SET_THROW );
+ awt::Rectangle aPosSize = xWindow->getPosSize(); // already in pixel
+
+ uno::Reference< awt::XControl > xControl( m_xDialog, uno::UNO_QUERY_THROW );
+ uno::Reference< awt::XWindow > xControlWindow( xControl->getPeer(), uno::UNO_QUERY_THROW );
+ xControlWindow->setPosSize( (aPosSize.Width - getWidth()) / 2.0, (aPosSize.Height - getHeight()) / 2.0, 0, 0, awt::PosSize::POS );
+ }
+ catch( uno::Exception& )
+ {
+ }
+
aRet = m_xDialog->execute();
+ }
OSL_TRACE("ScVbaUserForm::Show() execute returned %d", aRet);
if ( mbDispose )
{
@@ -180,11 +201,14 @@ ScVbaUserForm::getValue( const ::rtl::OUString& aPropertyName ) throw (beans::Un
uno::Reference< awt::XControl > xDialogControl( m_xDialog, uno::UNO_QUERY_THROW );
uno::Reference< awt::XControlContainer > xContainer( m_xDialog, uno::UNO_QUERY_THROW );
uno::Reference< awt::XControl > xControl = xContainer->getControl( aPropertyName );
- ScVbaControlFactory aFac( mxContext, xControl, m_xModel );
- uno::Reference< msforms::XControl > xVBAControl( aFac.createControl( xDialogControl->getModel() ) );
- ScVbaControl* pControl = dynamic_cast< ScVbaControl* >( xVBAControl.get() );
- pControl->setGeometryHelper( new UserFormGeometryHelper( mxContext, xControl ) );
- aResult = uno::makeAny( xVBAControl );
+ if ( xControl.is() )
+ {
+ ScVbaControlFactory aFac( mxContext, xControl, m_xModel );
+ uno::Reference< msforms::XControl > xVBAControl( aFac.createControl( xDialogControl->getModel() ) );
+ ScVbaControl* pControl = dynamic_cast< ScVbaControl* >( xVBAControl.get() );
+ pControl->setGeometryHelper( new UserFormGeometryHelper( mxContext, xControl ) );
+ aResult = uno::makeAny( xVBAControl );
+ }
}
return aResult;
diff --git a/vbahelper/source/vbahelper/makefile.mk b/vbahelper/source/vbahelper/makefile.mk
index 22ed40a3adfa..51fa5b449d23 100644
--- a/vbahelper/source/vbahelper/makefile.mk
+++ b/vbahelper/source/vbahelper/makefile.mk
@@ -71,12 +71,4 @@ SLOFILES=\
.INCLUDE : target.mk
-ALLTAR : \
- $(MISC)$/$(TARGET).don \
-
-$(SLOFILES) : $(MISC)$/$(TARGET).don
-
-$(MISC)$/$(TARGET).don : $(SOLARBINDIR)$/oovbaapi.rdb
- +$(CPPUMAKER) -O$(INCCOM)$/$(TARGET) -BUCR $(SOLARBINDIR)$/oovbaapi.rdb -X$(SOLARBINDIR)$/types.rdb && echo > $@
- echo $@
diff --git a/vbahelper/source/vbahelper/vbaapplicationbase.cxx b/vbahelper/source/vbahelper/vbaapplicationbase.cxx
index 7c636f238777..bddd756f6836 100644
--- a/vbahelper/source/vbahelper/vbaapplicationbase.cxx
+++ b/vbahelper/source/vbahelper/vbaapplicationbase.cxx
@@ -295,54 +295,23 @@ VbaApplicationBase::getVersion() throw (uno::RuntimeException)
void SAL_CALL VbaApplicationBase::Run( const ::rtl::OUString& MacroName, const uno::Any& varg1, const uno::Any& varg2, const uno::Any& varg3, const uno::Any& varg4, const uno::Any& varg5, const uno::Any& varg6, const uno::Any& varg7, const uno::Any& varg8, const uno::Any& varg9, const uno::Any& varg10, const uno::Any& varg11, const uno::Any& varg12, const uno::Any& varg13, const uno::Any& varg14, const uno::Any& varg15, const uno::Any& varg16, const uno::Any& varg17, const uno::Any& varg18, const uno::Any& varg19, const uno::Any& varg20, const uno::Any& varg21, const uno::Any& varg22, const uno::Any& varg23, const uno::Any& varg24, const uno::Any& varg25, const uno::Any& varg26, const uno::Any& varg27, const uno::Any& varg28, const uno::Any& varg29, const uno::Any& varg30 ) throw (uno::RuntimeException)
{
- ::rtl::OUString sSeparator = ::rtl::OUString::createFromAscii("/");
- ::rtl::OUString sMacroSeparator = ::rtl::OUString::createFromAscii("!");
- ::rtl::OUString sMacro_only_Name;
- sal_Int32 Position_MacroSeparator = MacroName.indexOf(sMacroSeparator);
+ ::rtl::OUString aMacroName = MacroName.trim();
+ if (0 == aMacroName.indexOf('!'))
+ aMacroName = aMacroName.copy(1).trim();
- uno::Reference< frame::XModel > aMacroDocumentModel;
- if (-1 != Position_MacroSeparator)
- {
- uno::Reference< container::XEnumerationAccess > xComponentEnumAccess;
- uno::Reference< lang::XMultiComponentFactory > xServiceManager = mxContext->getServiceManager();
- try
- {
- uno::Reference< frame::XDesktop > xDesktop (xServiceManager->createInstanceWithContext( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.frame.Desktop" )),mxContext ), uno::UNO_QUERY_THROW );
- xComponentEnumAccess = xDesktop->getComponents();
- }
- catch(uno::Exception&)
- {
- }
-
- //rem look for the name of the document in the cmpoonents collection
- uno::Reference < container::XEnumeration > xEnum = xComponentEnumAccess->createEnumeration();
-
- // iterate through the collection by name
- while (xEnum->hasMoreElements())
- {
- // get the next element as a UNO Any
- uno::Any aComponentHelper = xEnum->nextElement();
- uno::Reference <frame::XModel> xDocModel( aComponentHelper, uno::UNO_QUERY_THROW );
-
- // get the name of the sheet from its XNamed interface
- ::rtl::OUString aName = xDocModel->getURL();
-
-
- if (aName.match(MacroName.copy(0,Position_MacroSeparator-1),aName.lastIndexOf(sSeparator)+1))
- {
- aMacroDocumentModel = xDocModel;
- sMacro_only_Name = MacroName.copy(Position_MacroSeparator+1);
- }
- }
- }
- else
+ uno::Reference< frame::XModel > xModel;
+ SbMethod* pMeth = StarBASIC::GetActiveMethod();
+ if ( pMeth )
{
- aMacroDocumentModel = getCurrentDocument();
- sMacro_only_Name = MacroName.copy(0);
+ SbModule* pMod = dynamic_cast< SbModule* >( pMeth->GetParent() );
+ if ( pMod )
+ xModel = StarBASIC::GetModelFromBasic( pMod );
}
+ if ( !xModel.is() )
+ xModel = getCurrentDocument();
- MacroResolvedInfo aMacroInfo = resolveVBAMacro( getSfxObjShell( aMacroDocumentModel ), sMacro_only_Name );
+ MacroResolvedInfo aMacroInfo = resolveVBAMacro( getSfxObjShell( xModel ), aMacroName );
if( aMacroInfo.mbFound )
{
// handle the arguments
diff --git a/vbahelper/source/vbahelper/vbacommandbarcontrol.cxx b/vbahelper/source/vbahelper/vbacommandbarcontrol.cxx
index 551d18ab59b2..157d54eca7d5 100644
--- a/vbahelper/source/vbahelper/vbacommandbarcontrol.cxx
+++ b/vbahelper/source/vbahelper/vbacommandbarcontrol.cxx
@@ -91,27 +91,33 @@ ScVbaCommandBarControl::setOnAction( const ::rtl::OUString& _onaction ) throw (u
::sal_Bool SAL_CALL
ScVbaCommandBarControl::getVisible() throw (uno::RuntimeException)
{
- sal_Bool bVisible = sal_True;
+ /*sal_Bool bVisible = sal_True;
uno::Any aValue = getPropertyValue( m_aPropertyValues, rtl::OUString::createFromAscii("IsVisible") );
if( aValue.hasValue() )
aValue >>= bVisible;
- return bVisible;
+ return bVisible;*/
+ return getEnabled();
+
}
void SAL_CALL
ScVbaCommandBarControl::setVisible( ::sal_Bool _visible ) throw (uno::RuntimeException)
{
- uno::Any aValue = getPropertyValue( m_aPropertyValues, rtl::OUString::createFromAscii("IsVisible") );
+ /*uno::Any aValue = getPropertyValue( m_aPropertyValues, rtl::OUString::createFromAscii("IsVisible") );
if( aValue.hasValue() )
{
setPropertyValue( m_aPropertyValues, rtl::OUString::createFromAscii("IsVisible"), uno::makeAny( _visible ) );
ApplyChange();
- }
+ }*/
+ setEnabled( _visible);
}
::sal_Bool SAL_CALL
ScVbaCommandBarControl::getEnabled() throw (uno::RuntimeException)
{
sal_Bool bEnabled = sal_True;
+ rtl::OUString aCommandURLappendix = rtl::OUString::createFromAscii("___");
+ rtl::OUString aCommandURL ;
+
if( m_xParentMenu.is() )
{
// currently only the menu in the MenuBat support Enable/Disable
@@ -121,7 +127,14 @@ ScVbaCommandBarControl::getEnabled() throw (uno::RuntimeException)
else
{
// emulated with Visible
- bEnabled = getVisible();
+ //bEnabled = getVisible();
+ uno::Any aValue = getPropertyValue( m_aPropertyValues, rtl::OUString::createFromAscii("CommandURL") );
+ if (aValue >>= aCommandURL){
+ if (0 == aCommandURL.indexOf(aCommandURLappendix)){
+ bEnabled = sal_False;
+ }
+ }
+
}
return bEnabled;
}
@@ -129,6 +142,9 @@ ScVbaCommandBarControl::getEnabled() throw (uno::RuntimeException)
void SAL_CALL
ScVbaCommandBarControl::setEnabled( sal_Bool _enabled ) throw (uno::RuntimeException)
{
+ rtl::OUString aCommandURL ;
+ rtl::OUString aCommandURLappendix = rtl::OUString::createFromAscii("___");
+ rtl::OUStringBuffer aCommandURLSringBuffer;
if( m_xParentMenu.is() )
{
// currently only the menu in the MenuBat support Enable/Disable
@@ -136,8 +152,20 @@ ScVbaCommandBarControl::setEnabled( sal_Bool _enabled ) throw (uno::RuntimeExcep
}
else
{
+ uno::Any aValue = getPropertyValue( m_aPropertyValues, rtl::OUString::createFromAscii("CommandURL") );
+ if (aValue >>= aCommandURL){
+ if (0 == aCommandURL.indexOf(aCommandURLappendix)){
+ aCommandURL = aCommandURL.copy(3);
+ }
+ if (false == _enabled){
+ aCommandURLSringBuffer = aCommandURLappendix;
+ }
+ aCommandURLSringBuffer.append(aCommandURL);
+ setPropertyValue( m_aPropertyValues, rtl::OUString::createFromAscii("CommandURL"), uno::makeAny( aCommandURLSringBuffer.makeStringAndClear()) );
+ ApplyChange();
+ }
// emulated with Visible
- setVisible( _enabled );
+ //setVisible( _enabled );
}
}
diff --git a/vbahelper/source/vbahelper/vbadocumentbase.cxx b/vbahelper/source/vbahelper/vbadocumentbase.cxx
index 65f7f4bcfbeb..0df38b003556 100644
--- a/vbahelper/source/vbahelper/vbadocumentbase.cxx
+++ b/vbahelper/source/vbahelper/vbadocumentbase.cxx
@@ -28,14 +28,18 @@
#include "vbahelper/vbadocumentbase.hxx"
#include "vbahelper/helperdecl.hxx"
+#include <com/sun/star/lang/DisposedException.hpp>
+#include <com/sun/star/lang/WrappedTargetRuntimeException.hpp>
#include <com/sun/star/util/XModifiable.hpp>
#include <com/sun/star/util/XProtectable.hpp>
#include <com/sun/star/util/XCloseable.hpp>
+#include <com/sun/star/util/XURLTransformer.hpp>
#include <com/sun/star/frame/XStorable.hpp>
#include <com/sun/star/frame/XFrame.hpp>
#include <com/sun/star/document/XEmbeddedScripts.hpp> //Michael E. Bohn
#include <com/sun/star/beans/XPropertySet.hpp>
+#include <cppuhelper/exc_hlp.hxx>
#include <comphelper/unwrapargs.hxx>
#include <tools/urlobj.hxx>
#include <osl/file.hxx>
@@ -74,7 +78,8 @@ VbaDocumentBase::getName() throw (uno::RuntimeException)
uno::Reference< beans::XPropertySet > xProps( xFrame, uno::UNO_QUERY_THROW );
xProps->getPropertyValue(sTitle ) >>= sName;
sal_Int32 pos = 0;
- sName = sName.getToken(0,' ',pos);
+ sName = sName.getToken(0,'-',pos);
+ sName = sName.trim();
}
return sName;
}
@@ -92,8 +97,8 @@ VbaDocumentBase::getPath() throw (uno::RuntimeException)
::rtl::OUString
VbaDocumentBase::getFullName() throw (uno::RuntimeException)
{
- rtl::OUString sPath;
- ::osl::File::getSystemPathFromFileURL( getModel()->getURL(), sPath );
+ rtl::OUString sPath = getName();
+ //::osl::File::getSystemPathFromFileURL( getModel()->getURL(), sPath );
return sPath;
}
@@ -127,23 +132,56 @@ VbaDocumentBase::Close( const uno::Any &rSaveArg, const uno::Any &rFileArg,
else
xModifiable->setModified( false );
- uno::Reference< util::XCloseable > xCloseable( getModel(), uno::UNO_QUERY );
+ // first try to close the document using UI dispatch functionality
+ sal_Bool bUIClose = sal_False;
+ try
+ {
+ uno::Reference< frame::XController > xController( getModel()->getCurrentController(), uno::UNO_SET_THROW );
+ uno::Reference< frame::XDispatchProvider > xDispatchProvider( xController->getFrame(), uno::UNO_QUERY_THROW );
+
+ uno::Reference< lang::XMultiComponentFactory > xServiceManager( mxContext->getServiceManager(), uno::UNO_SET_THROW );
+ uno::Reference< util::XURLTransformer > xURLTransformer(
+ xServiceManager->createInstanceWithContext(
+ rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.util.URLTransformer" ) ),
+ mxContext ),
+ uno::UNO_QUERY_THROW );
- if( xCloseable.is() )
- // use close(boolean DeliverOwnership)
+ util::URL aURL;
+ aURL.Complete = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:CloseDoc" ) );
+ xURLTransformer->parseStrict( aURL );
- // The boolean parameter DeliverOwnership tells objects vetoing the close process that they may
- // assume ownership if they object the closure by throwing a CloseVetoException
- // Here we give up ownership. To be on the safe side, catch possible veto exception anyway.
- xCloseable->close(sal_True);
- // If close is not supported by this model - try to dispose it.
- // But if the model disagree with a reset request for the modify state
- // we shouldn't do so. Otherwhise some strange things can happen.
- else
+ uno::Reference< css::frame::XDispatch > xDispatch(
+ xDispatchProvider->queryDispatch( aURL, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "_self" ) ), 0 ),
+ uno::UNO_SET_THROW );
+ xDispatch->dispatch( aURL, uno::Sequence< beans::PropertyValue >() );
+ bUIClose = sal_True;
+ }
+ catch( uno::Exception& )
{
- uno::Reference< lang::XComponent > xDisposable ( getModel(), uno::UNO_QUERY );
- if ( xDisposable.is() )
- xDisposable->dispose();
+ }
+
+ if ( !bUIClose )
+ {
+ // if it is not possible to use UI dispatch, try to close the model directly
+ uno::Reference< util::XCloseable > xCloseable( getModel(), uno::UNO_QUERY );
+ if( xCloseable.is() )
+ {
+ // use close(boolean DeliverOwnership)
+
+ // The boolean parameter DeliverOwnership tells objects vetoing the close process that they may
+ // assume ownership if they object the closure by throwing a CloseVetoException
+ // Here we give up ownership. To be on the safe side, catch possible veto exception anyway.
+ xCloseable->close(sal_True);
+ }
+ else
+ {
+ // If close is not supported by this model - try to dispose it.
+ // But if the model disagree with a reset request for the modify state
+ // we shouldn't do so. Otherwhise some strange things can happen.
+ uno::Reference< lang::XComponent > xDisposable ( getModel(), uno::UNO_QUERY );
+ if ( xDisposable.is() )
+ xDisposable->dispose();
+ }
}
}
@@ -181,7 +219,22 @@ void
VbaDocumentBase::setSaved( sal_Bool bSave ) throw (uno::RuntimeException)
{
uno::Reference< util::XModifiable > xModifiable( getModel(), uno::UNO_QUERY_THROW );
- xModifiable->setModified( !bSave );
+ try
+ {
+ xModifiable->setModified( !bSave );
+ }
+ catch ( lang::DisposedException& )
+ {
+ // impossibility to set the modified state on disposed document should not trigger an error
+ }
+ catch ( beans::PropertyVetoException& )
+ {
+ uno::Any aCaught( ::cppu::getCaughtException() );
+ throw lang::WrappedTargetRuntimeException(
+ ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Can't change modified state of model!" ) ),
+ uno::Reference< uno::XInterface >(),
+ aCaught );
+ }
}
sal_Bool
@@ -213,7 +266,7 @@ VbaDocumentBase::getVBProject() throw (uno::RuntimeException)
{
uno::Sequence< uno::Any > aArgs( 2 );
aArgs[ 0 ] <<= uno::Reference< XHelperInterface >( this );
- aArgs[ 1 ] <<= mxModel;
+ aArgs[ 1 ] <<= getModel();
uno::Reference< lang::XMultiComponentFactory > xServiceManager( mxContext->getServiceManager(), uno::UNO_SET_THROW );
uno::Reference< uno::XInterface > xVBProjects = xServiceManager->createInstanceWithArgumentsAndContext(
::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ooo.vba.VBProject" ) ), aArgs, mxContext );
diff --git a/vbahelper/source/vbahelper/vbadocumentsbase.cxx b/vbahelper/source/vbahelper/vbadocumentsbase.cxx
index 2d4175b90939..f2b70ab231c7 100644
--- a/vbahelper/source/vbahelper/vbadocumentsbase.cxx
+++ b/vbahelper/source/vbahelper/vbadocumentsbase.cxx
@@ -25,6 +25,7 @@
*
************************************************************************/
#include <vbahelper/vbadocumentsbase.hxx>
+#include <comphelper/mediadescriptor.hxx>
#include <comphelper/processfactory.hxx>
#include <cppuhelper/implbase1.hxx>
#include <cppuhelper/implbase3.hxx>
@@ -212,10 +213,9 @@ VbaDocumentsBase::VbaDocumentsBase( const uno::Reference< XHelperInterface >& xP
{
}
-uno::Any SAL_CALL
-VbaDocumentsBase::Add() throw (uno::RuntimeException)
+uno::Any VbaDocumentsBase::createDocument() throw (uno::RuntimeException)
{
- uno::Reference< lang::XMultiComponentFactory > xSMgr(
+ uno::Reference< lang::XMultiComponentFactory > xSMgr(
mxContext->getServiceManager(), uno::UNO_QUERY_THROW );
uno::Reference< frame::XComponentLoader > xLoader(
@@ -229,15 +229,21 @@ VbaDocumentsBase::Add() throw (uno::RuntimeException)
sURL = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("private:factory/scalc") );
else
throw uno::RuntimeException( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("Not implemented") ), uno::Reference< uno::XInterface >() );
+
+ // prepare the media descriptor
+ ::comphelper::MediaDescriptor aMediaDesc;
+ aMediaDesc[ ::comphelper::MediaDescriptor::PROP_MACROEXECUTIONMODE() ] <<= document::MacroExecMode::USE_CONFIG;
+ aMediaDesc.setComponentDataEntry( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ApplyFormDesignMode" ) ), uno::Any( false ) );
+
+ // craete the new document
uno::Reference< lang::XComponent > xComponent = xLoader->loadComponentFromURL(
sURL ,
rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("_blank") ), 0,
- uno::Sequence< beans::PropertyValue >(0) );
+ aMediaDesc.getAsConstPropertyValueList() );
return uno::makeAny( xComponent );
}
-void
-VbaDocumentsBase::Close() throw (uno::RuntimeException)
+void VbaDocumentsBase::closeDocuments() throw (uno::RuntimeException)
{
// #FIXME this *MUST* be wrong documents::close surely closes ALL documents
// in the collection, use of getCurrentDocument here is totally wrong
@@ -251,8 +257,7 @@ VbaDocumentsBase::Close() throw (uno::RuntimeException)
}
// #TODO# #FIXME# can any of the unused params below be used?
-uno::Any
-VbaDocumentsBase::Open( const rtl::OUString& rFileName, const uno::Any& ReadOnly, const uno::Sequence< beans::PropertyValue >& rProps ) throw (uno::RuntimeException)
+uno::Any VbaDocumentsBase::openDocument( const rtl::OUString& rFileName, const uno::Any& ReadOnly, const uno::Sequence< beans::PropertyValue >& rProps ) throw (uno::RuntimeException)
{
// we need to detect if this is a URL, if not then assume its a file path
rtl::OUString aURL;
diff --git a/vbahelper/source/vbahelper/vbaeventshelperbase.cxx b/vbahelper/source/vbahelper/vbaeventshelperbase.cxx
index 59cb83cd7645..8000a7cdf66e 100755
--- a/vbahelper/source/vbahelper/vbaeventshelperbase.cxx
+++ b/vbahelper/source/vbahelper/vbaeventshelperbase.cxx
@@ -74,10 +74,6 @@ void SAL_CALL VbaEventsHelperBase::processVbaEvent( sal_Int32 nEventId, const un
EventQueue aEventQueue;
aEventQueue.push_back( EventQueueEntry( nEventId, rArgs ) );
- /* bEnabled will track if event processing is enabled. Every event handler
- may disable handling of other events. */
- bool bEnabled = true;
-
/* bCancel will contain the current Cancel value. It is possible that
multiple events will try to modify the Cancel value. Every event
handler receives the Cancel value of the previous event handler. */
@@ -87,10 +83,10 @@ void SAL_CALL VbaEventsHelperBase::processVbaEvent( sal_Int32 nEventId, const un
executed successfully. */
bool bSuccess = false;
- /* Loop as long as there are more events to be processed, and as event
- handling is still enabled. Derived classes may add new events to be
- processed in the virtual implPrepareEvent() function. */
- while( bEnabled && !aEventQueue.empty() )
+ /* Loop as long as there are more events to be processed. Derived classes
+ may add new events to be processed in the virtual implPrepareEvent()
+ function. */
+ while( !aEventQueue.empty() )
{
/* Check that all class members are available, and that we are not
disposed (this may have happened at any time during execution of
@@ -103,14 +99,14 @@ void SAL_CALL VbaEventsHelperBase::processVbaEvent( sal_Int32 nEventId, const un
uno::Sequence< uno::Any > aEventArgs = aEventQueue.front().maArgs;
aEventQueue.pop_front();
- // let derived classes decide whether event processing is still enabled
- bEnabled = implEventsEnabled();
- // let derived classes prepare the event, they may add new events for next iteration
- if( bEnabled && implPrepareEvent( aEventQueue, rInfo, aEventArgs ) )
+ /* Let derived classes prepare the event, they may add new events for
+ next iteration. If false is returned, the event handler must not be
+ called. */
+ bool bEventSuccess = false;
+ if( implPrepareEvent( aEventQueue, rInfo, aEventArgs ) )
{
// search the event handler macro in the document
::rtl::OUString aMacroPath = getEventHandlerPath( rInfo, aEventArgs );
- bool bEventSuccess = false;
if( aMacroPath.getLength() > 0 )
{
// build the argument list
@@ -139,11 +135,11 @@ void SAL_CALL VbaEventsHelperBase::processVbaEvent( sal_Int32 nEventId, const un
bCancel = nNewCancel != 0;
}
}
- // post processing (also, if event handler does not exist, or on error
- implPostProcessEvent( aEventQueue, rInfo, bEventSuccess, bCancel );
// global success, if at least one event handler succeeded
bSuccess |= bEventSuccess;
}
+ // post processing (also, if event handler does not exist, or disabled, or on error
+ implPostProcessEvent( aEventQueue, rInfo, bEventSuccess, bCancel );
}
// if event handlers want to cancel the event, do so regardless of any errors
@@ -200,7 +196,8 @@ const VbaEventsHelperBase::EventHandlerInfo& VbaEventsHelperBase::getEventHandle
append( sal_Unicode( '.' ) ).append( rInfo.maMacroName ).makeStringAndClear();
break;
}
- return resolveVBAMacro( mpShell, aMacroName ).msResolvedMacro;
+ MacroResolvedInfo aMacroInfo = resolveVBAMacro( mpShell, aMacroName, false );
+ return aMacroInfo.mbFound ? ::rtl::OUString( aMacroInfo.msResolvedMacro ) : ::rtl::OUString();
}
void VbaEventsHelperBase::stopListening()
diff --git a/vbahelper/source/vbahelper/vbahelper.cxx b/vbahelper/source/vbahelper/vbahelper.cxx
index 14f4e3ff1363..65974738c3f4 100644
--- a/vbahelper/source/vbahelper/vbahelper.cxx
+++ b/vbahelper/source/vbahelper/vbahelper.cxx
@@ -39,6 +39,9 @@
#include <com/sun/star/beans/XPropertySet.hpp>
#include <com/sun/star/beans/XIntrospection.hpp>
#include <com/sun/star/util/MeasureUnit.hpp>
+#include <com/sun/star/awt/XWindow.hpp>
+#include <com/sun/star/awt/XDialog.hpp>
+#include <com/sun/star/awt/PosSize.hpp>
#include <ooo/vba/msforms/XShape.hpp>
@@ -989,277 +992,122 @@ sal_Bool setPropertyValue( uno::Sequence< beans::PropertyValue >& aProp, const r
// ====UserFormGeomentryHelper====
//---------------------------------------------
UserFormGeometryHelper::UserFormGeometryHelper( const uno::Reference< uno::XComponentContext >& /*xContext*/, const uno::Reference< awt::XControl >& xControl )
+: mbDialog( uno::Reference< awt::XDialog >( xControl, uno::UNO_QUERY ).is() )
{
if ( !xControl.is() )
- throw uno::RuntimeException();
-
- mxControlUnits.set( xControl->getPeer(), uno::UNO_QUERY_THROW );
- mxModel.set( xControl->getModel(), uno::UNO_QUERY_THROW );
-}
-
-//---------------------------------------------
-sal_Int32 UserFormGeometryHelper::ConvertPixelToLogic( sal_Int32 nValue, sal_Bool bIsPoint, sal_Bool bIsX, sal_Int16 nTargetUnit )
-{
- sal_Int32 nResult = 0;
- if ( bIsPoint )
- {
- // conversion for a point
- awt::Point aPixelPoint( 0, 0 );
- ( bIsX ? aPixelPoint.X : aPixelPoint.Y ) = nValue;
- awt::Point aTargetPoint( 0, 0 );
- aTargetPoint = mxControlUnits->convertPointToLogic( aPixelPoint, nTargetUnit );
-
- nResult = bIsX ? aTargetPoint.X : aTargetPoint.Y;
- }
- else
- {
- // conversion for a size
- awt::Size aPixelSize( 0, 0 );
- ( bIsX ? aPixelSize.Width : aPixelSize.Height ) = nValue;
- awt::Size aTargetSize( 0, 0 );
- aTargetSize = mxControlUnits->convertSizeToLogic( aPixelSize, nTargetUnit );
-
- nResult = bIsX ? aTargetSize.Width : aTargetSize.Height;
- }
+ throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "No control is provided!" ) ),
+ uno::Reference< uno::XInterface >() );
- return nResult;
+ mxWindow.set( xControl->getPeer(), uno::UNO_QUERY_THROW );
}
//---------------------------------------------
-sal_Int32 UserFormGeometryHelper::ConvertLogicToPixel( sal_Int32 nValue, sal_Bool bIsPoint, sal_Bool bIsX, sal_Int16 nSourceUnit )
-{
- sal_Int32 nResult = 0;
- if ( bIsPoint )
- {
- // conversion for a point
- awt::Point aSourcePoint( 0, 0 );
- ( bIsX ? aSourcePoint.X : aSourcePoint.Y ) = nValue;
-
- awt::Point aPixelPoint( 0, 0 );
- aPixelPoint = mxControlUnits->convertPointToPixel( aSourcePoint, nSourceUnit );
-
- nResult = bIsX ? aPixelPoint.X : aPixelPoint.Y;
- }
- else
- {
- // conversion for a size
- awt::Size aSourceSize( 0, 0 );
- ( bIsX ? aSourceSize.Width : aSourceSize.Height ) = nValue;
-
- awt::Size aPixelSize( 0, 0 );
- aPixelSize = mxControlUnits->convertSizeToPixel( aSourceSize, nSourceUnit );
-
- nResult = bIsX ? aPixelSize.Width : aPixelSize.Height;
- }
-
- return nResult;
-}
-//---------------------------------------------
double UserFormGeometryHelper::getLeft()
{
- double nResult = 0;
-
- try
- {
- sal_Int32 nLeft = 0;
- mxModel->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( VBA_LEFT ) ) ) >>= nLeft;
- nResult = ConvertLogicToPixel( nLeft,
- sal_True, // Point
- sal_True, // X
- util::MeasureUnit::APPFONT );
- }
- catch ( uno::RuntimeException& )
- {
- throw;
- }
- catch ( uno::Exception& e )
- {
- throw lang::WrappedTargetException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Can not get position X!" ) ),
- uno::Reference< uno::XInterface >(),
- uno::makeAny( e ) );
- }
-
- return nResult;
+ return mxWindow->getPosSize().X;
}
//---------------------------------------------
void UserFormGeometryHelper::setLeft( double nLeft )
{
- try
- {
- mxModel->setPropertyValue(
- rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( VBA_LEFT ) ),
- uno::makeAny( ConvertPixelToLogic( nLeft,
- sal_True, // Point
- sal_True, // X
- util::MeasureUnit::APPFONT ) ) );
- }
- catch ( uno::RuntimeException& )
- {
- throw;
- }
- catch ( uno::Exception& e )
- {
- throw lang::WrappedTargetException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Can not set position X!" ) ),
- uno::Reference< uno::XInterface >(),
- uno::makeAny( e ) );
- }
+ mxWindow->setPosSize( nLeft, mxWindow->getPosSize().Y, 0, 0, awt::PosSize::POS );
}
//---------------------------------------------
double UserFormGeometryHelper::getTop()
{
- double nResult = 0;
-
- try
- {
- sal_Int32 nTop = 0;
- mxModel->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( VBA_TOP ) ) ) >>= nTop;
- nResult = ConvertLogicToPixel( nTop,
- sal_True, // Point
- sal_False, // Y
- util::MeasureUnit::APPFONT );
- }
- catch ( uno::RuntimeException& )
- {
- throw;
- }
- catch ( uno::Exception& e )
- {
- throw lang::WrappedTargetException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Can not get position Y!" ) ),
- uno::Reference< uno::XInterface >(),
- uno::makeAny( e ) );
- }
-
- return nResult;
+ return mxWindow->getPosSize().Y;
}
//---------------------------------------------
void UserFormGeometryHelper::setTop( double nTop )
{
- try
- {
- mxModel->setPropertyValue(
- rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( VBA_TOP ) ),
- uno::makeAny( ConvertPixelToLogic( nTop,
- sal_True, // Point
- sal_False, // Y
- util::MeasureUnit::APPFONT ) ) );
- }
- catch ( uno::RuntimeException& )
- {
- throw;
- }
- catch ( uno::Exception& e )
- {
- throw lang::WrappedTargetException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Can not set position X!" ) ),
- uno::Reference< uno::XInterface >(),
- uno::makeAny( e ) );
- }
+ mxWindow->setPosSize( mxWindow->getPosSize().X, nTop, 0, 0, awt::PosSize::POS );
}
//---------------------------------------------
double UserFormGeometryHelper::getWidth()
{
- double nResult = 0;
-
- try
+ if ( mbDialog )
{
- sal_Int32 nWidth = 0;
- mxModel->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( VBA_WIDTH ) ) ) >>= nWidth;
- nResult = ConvertLogicToPixel( nWidth,
- sal_False, // Size
- sal_True, // X
- util::MeasureUnit::APPFONT );
- }
- catch ( uno::RuntimeException& )
- {
- throw;
- }
- catch ( uno::Exception& e )
- {
- throw lang::WrappedTargetException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Can not get width!" ) ),
- uno::Reference< uno::XInterface >(),
- uno::makeAny( e ) );
+ const Window* pWindow = VCLUnoHelper::GetWindow( mxWindow );
+ if ( pWindow )
+ {
+ // get the size with decoration
+ Rectangle aResult = pWindow->GetWindowExtentsRelative( NULL );
+ return aResult.getWidth();
+ }
}
- return nResult;
+ return mxWindow->getPosSize().Width;
}
//---------------------------------------------
-void UserFormGeometryHelper::setWidth( double nWidth)
+void UserFormGeometryHelper::setWidth( double nWidth )
{
- try
- {
- mxModel->setPropertyValue(
- rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( VBA_WIDTH ) ),
- uno::makeAny( ConvertPixelToLogic( nWidth,
- sal_False, // Size
- sal_True, // X
- util::MeasureUnit::APPFONT ) ) );
- }
- catch ( uno::RuntimeException& )
- {
- throw;
- }
- catch ( uno::Exception& e )
+ sal_Int64 nNewWidth = nWidth;
+
+ if ( mbDialog )
{
- throw lang::WrappedTargetException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Can not set width!" ) ),
- uno::Reference< uno::XInterface >(),
- uno::makeAny( e ) );
+ const Window* pWindow = VCLUnoHelper::GetWindow( mxWindow );
+ if ( pWindow )
+ {
+ // set the size with decoration
+ Rectangle aRDecor = pWindow->GetWindowExtentsRelative( NULL );
+ if ( !aRDecor.IsEmpty() )
+ {
+ sal_Int64 nDecor = aRDecor.getWidth();
+ sal_Int64 nUnDecor = mxWindow->getPosSize().Width;
+ if ( nWidth < nDecor - nUnDecor )
+ nUnDecor = nDecor - nWidth; // avoid negative size
+ nNewWidth = nWidth + nUnDecor - nDecor;
+ }
+ }
}
+
+ mxWindow->setPosSize( 0, 0, nNewWidth, 0, awt::PosSize::WIDTH );
}
//---------------------------------------------
double UserFormGeometryHelper::getHeight()
{
- double nResult = 0;
-
- try
+ if ( mbDialog )
{
- sal_Int32 nHeight = 0;
- mxModel->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( VBA_HEIGHT ) ) ) >>= nHeight;
- nResult = ConvertLogicToPixel( nHeight,
- sal_False, // Size
- sal_False, // Y
- util::MeasureUnit::APPFONT );
- }
- catch ( uno::RuntimeException& )
- {
- throw;
- }
- catch ( uno::Exception& e )
- {
- throw lang::WrappedTargetException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Can not get height!" ) ),
- uno::Reference< uno::XInterface >(),
- uno::makeAny( e ) );
+ const Window* pWindow = VCLUnoHelper::GetWindow( mxWindow );
+ if ( pWindow )
+ {
+ // get the size with decoration
+ Rectangle aResult = pWindow->GetWindowExtentsRelative( NULL );
+ return aResult.getHeight();
+ }
}
- return nResult;
+ return mxWindow->getPosSize().Height;
}
//---------------------------------------------
void UserFormGeometryHelper::setHeight( double nHeight )
{
- try
- {
- mxModel->setPropertyValue(
- rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( VBA_HEIGHT ) ),
- uno::makeAny( ConvertPixelToLogic( nHeight,
- sal_False, // Size
- sal_False, // Y
- util::MeasureUnit::APPFONT ) ) );
- }
- catch ( uno::RuntimeException& )
- {
- throw;
- }
- catch ( uno::Exception& e )
+ sal_Int64 nNewHeight = nHeight;
+ if ( mbDialog )
{
- throw lang::WrappedTargetException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Can not set height!" ) ),
- uno::Reference< uno::XInterface >(),
- uno::makeAny( e ) );
+ const Window* pWindow = VCLUnoHelper::GetWindow( mxWindow );
+ if ( pWindow )
+ {
+ // set the size with decoration
+ Rectangle aRDecor = pWindow->GetWindowExtentsRelative( NULL );
+ if ( !aRDecor.IsEmpty() )
+ {
+ sal_Int64 nDecor = aRDecor.getHeight();
+ sal_Int64 nUnDecor = mxWindow->getPosSize().Height;
+ if ( nHeight < nDecor - nUnDecor )
+ nUnDecor = nDecor - nHeight; // avoid negative size
+ nNewHeight = nHeight + nUnDecor - nDecor;
+ }
+ }
}
+
+ mxWindow->setPosSize( 0, 0, 0, nNewHeight, awt::PosSize::HEIGHT );
}
// ============