diff options
121 files changed, 5946 insertions, 3839 deletions
diff --git a/basic/inc/basic/basmgr.hxx b/basic/inc/basic/basmgr.hxx index 5c62c347fbdd..720a6efd2182 100644 --- a/basic/inc/basic/basmgr.hxx +++ b/basic/inc/basic/basmgr.hxx @@ -237,6 +237,13 @@ public: */ bool LegacyPsswdBinaryLimitExceeded( ::com::sun::star::uno::Sequence< rtl::OUString >& _out_rModuleNames ); + /// determines whether the Basic Manager has a given macro, given by fully qualified name + bool HasMacro( String const& i_fullyQualifiedName ) const; + /// executes a given macro + ErrCode ExecuteMacro( String const& i_fullyQualifiedName, SbxArray* i_arguments, SbxValue* i_retValue ); + /// executes a given macro + ErrCode ExecuteMacro( String const& i_fullyQualifiedName, String const& i_commaSeparatedArgs, SbxValue* i_retValue ); + private: BOOL IsReference( USHORT nLib ); diff --git a/basic/source/basmgr/basmgr.cxx b/basic/source/basmgr/basmgr.cxx index 84763468e64c..a491b957fef6 100644 --- a/basic/source/basmgr/basmgr.cxx +++ b/basic/source/basmgr/basmgr.cxx @@ -42,6 +42,8 @@ #include <tools/diagnose_ex.h> #include <basic/sbmod.hxx> #include <basic/sbobjmod.hxx> +#include <unotools/intlwrapper.hxx> +#include <comphelper/processfactory.hxx> #include <basic/sbuno.hxx> #include <basic/basmgr.hxx> @@ -1868,6 +1870,116 @@ bool BasicManager::LegacyPsswdBinaryLimitExceeded( ::com::sun::star::uno::Sequen return false; } + +namespace +{ + SbMethod* lcl_queryMacro( BasicManager* i_manager, String const& i_fullyQualifiedName ) + { + sal_uInt16 nLast = 0; + String sMacro = i_fullyQualifiedName; + String sLibName = sMacro.GetToken( 0, '.', nLast ); + String sModule = sMacro.GetToken( 0, '.', nLast ); + sMacro.Erase( 0, nLast ); + + IntlWrapper aIntlWrapper( ::comphelper::getProcessServiceFactory(), Application::GetSettings().GetLocale() ); + const CollatorWrapper* pCollator = aIntlWrapper.getCollator(); + sal_uInt16 nLibCount = i_manager->GetLibCount(); + for ( sal_uInt16 nLib = 0; nLib < nLibCount; ++nLib ) + { + if ( COMPARE_EQUAL == pCollator->compareString( i_manager->GetLibName( nLib ), sLibName ) ) + { + StarBASIC* pLib = i_manager->GetLib( nLib ); + if( !pLib ) + { + i_manager->LoadLib( nLib ); + pLib = i_manager->GetLib( nLib ); + } + + if( pLib ) + { + sal_uInt16 nModCount = pLib->GetModules()->Count(); + for( sal_uInt16 nMod = 0; nMod < nModCount; ++nMod ) + { + SbModule* pMod = (SbModule*)pLib->GetModules()->Get( nMod ); + if ( pMod && COMPARE_EQUAL == pCollator->compareString( pMod->GetName(), sModule ) ) + { + SbMethod* pMethod = (SbMethod*)pMod->Find( sMacro, SbxCLASS_METHOD ); + if( pMethod ) + return pMethod; + } + } + } + } + } + return 0; + } +} + +bool BasicManager::HasMacro( String const& i_fullyQualifiedName ) const +{ + return ( NULL != lcl_queryMacro( const_cast< BasicManager* >( this ), i_fullyQualifiedName ) ); +} + +ErrCode BasicManager::ExecuteMacro( String const& i_fullyQualifiedName, SbxArray* i_arguments, SbxValue* i_retValue ) +{ + SbMethod* pMethod = lcl_queryMacro( this, i_fullyQualifiedName ); + ErrCode nError = 0; + if ( pMethod ) + { + if ( i_arguments ) + pMethod->SetParameters( i_arguments ); + nError = pMethod->Call( i_retValue ); + } + else + nError = ERRCODE_BASIC_PROC_UNDEFINED; + return nError; +} + +ErrCode BasicManager::ExecuteMacro( String const& i_fullyQualifiedName, String const& i_commaSeparatedArgs, SbxValue* i_retValue ) +{ + SbMethod* pMethod = lcl_queryMacro( this, i_fullyQualifiedName ); + if ( !pMethod ) + return ERRCODE_BASIC_PROC_UNDEFINED; + + // arguments must be quoted + String sQuotedArgs; + String sArgs( i_commaSeparatedArgs ); + if ( sArgs.Len()<2 || sArgs.GetBuffer()[1] == '\"') + // no args or already quoted args + sQuotedArgs = sArgs; + else + { + // quote parameters + sArgs.Erase( 0, 1 ); + sArgs.Erase( sArgs.Len()-1, 1 ); + + sQuotedArgs = '('; + + sal_uInt16 nCount = sArgs.GetTokenCount(','); + for ( sal_uInt16 n=0; n<nCount; ++n ) + { + sQuotedArgs += '\"'; + sQuotedArgs += sArgs.GetToken( n, ',' ); + sQuotedArgs += '\"'; + if ( n<nCount-1 ) + sQuotedArgs += ','; + } + + sQuotedArgs += ')'; + } + + // add quoted arguments and do the call + String sCall( '[' ); + sCall += pMethod->GetName(); + sCall += sQuotedArgs; + sCall += ']'; + + SbxVariable* pRet = pMethod->GetParent()->Execute( sCall ); + if ( pRet ) + *i_retValue = *pRet; + return SbxBase::GetError(); +} + //===================================================================== class ModuleInfo_Impl : public ModuleInfoHelper diff --git a/editeng/inc/editeng/editeng.hxx b/editeng/inc/editeng/editeng.hxx index 84f4802e7b44..642c290f4853 100644..100755 --- a/editeng/inc/editeng/editeng.hxx +++ b/editeng/inc/editeng/editeng.hxx @@ -33,7 +33,6 @@ class EditView; class OutputDevice; class EditUndo; class SvxFont; -class SfxUndoManager; class SfxItemPool; class SfxStyleSheet; class String; @@ -83,6 +82,9 @@ namespace svx{ struct SpellPortion; typedef std::vector<SpellPortion> SpellPortions; } +namespace svl{ +class IUndoManager; +} namespace basegfx { class B2DPolyPolygon; } #include <rsc/rscsfx.hxx> @@ -268,7 +270,8 @@ public: void ShowParagraph( USHORT nParagraph, BOOL bShow = TRUE ); BOOL IsParagraphVisible( USHORT nParagraph ); - SfxUndoManager& GetUndoManager(); + ::svl::IUndoManager& + GetUndoManager(); void UndoActionStart( USHORT nId ); void UndoActionEnd( USHORT nId ); BOOL IsInUndo(); diff --git a/editeng/inc/editeng/editund2.hxx b/editeng/inc/editeng/editund2.hxx index 4d037a72c9b9..14091ea3e1a7 100644 --- a/editeng/inc/editeng/editund2.hxx +++ b/editeng/inc/editeng/editund2.hxx @@ -33,7 +33,7 @@ class ImpEditEngine; -class EDITENG_DLLPUBLIC EditUndoManager : public SfxUndoManager +class EDITENG_DLLPRIVATE EditUndoManager : public SfxUndoManager { using SfxUndoManager::Undo; using SfxUndoManager::Redo; @@ -43,8 +43,8 @@ private: public: EditUndoManager( ImpEditEngine* pImpEE ); - virtual BOOL Undo( USHORT nCount=1 ); - virtual BOOL Redo( USHORT nCount=1 ); + virtual BOOL Undo(); + virtual BOOL Redo(); }; // ----------------------------------------------------------------------- diff --git a/editeng/inc/editeng/outliner.hxx b/editeng/inc/editeng/outliner.hxx index d167d2a30f8f..900ee69af2d5 100644 --- a/editeng/inc/editeng/outliner.hxx +++ b/editeng/inc/editeng/outliner.hxx @@ -74,10 +74,15 @@ class SfxItemSet; class SvxNumBulletItem; class SvxNumberFormat; class SvxLRSpaceItem; -class SfxUndoManager; class EditEngine; class SvKeyValueIterator; class SvxForbiddenCharactersTable; + +namespace svl +{ + class IUndoManager; +} + #include <com/sun/star/uno/Reference.h> #include <vos/ref.hxx> @@ -938,7 +943,8 @@ public: // nFormat muss ein Wert aus dem enum EETextFormat sein (wg.CLOOKS) ULONG Read( SvStream& rInput, const String& rBaseURL, USHORT, SvKeyValueIterator* pHTTPHeaderAttrs = NULL ); - SfxUndoManager& GetUndoManager(); + ::svl::IUndoManager& + GetUndoManager(); void QuickSetAttribs( const SfxItemSet& rSet, const ESelection& rSel ); void QuickInsertField( const SvxFieldItem& rFld, const ESelection& rSel ); diff --git a/editeng/source/editeng/editeng.cxx b/editeng/source/editeng/editeng.cxx index 1b61a405dc18..74527ec2b86f 100644 --- a/editeng/source/editeng/editeng.cxx +++ b/editeng/source/editeng/editeng.cxx @@ -145,7 +145,7 @@ sal_Bool EditEngine::IsInUndo() return pImpEditEngine->IsInUndo(); } -SfxUndoManager& EditEngine::GetUndoManager() +::svl::IUndoManager& EditEngine::GetUndoManager() { DBG_CHKTHIS( EditEngine, 0 ); return pImpEditEngine->GetUndoManager(); diff --git a/editeng/source/editeng/editundo.cxx b/editeng/source/editeng/editundo.cxx index 054971c240fd..f2f28642209c 100644 --- a/editeng/source/editeng/editundo.cxx +++ b/editeng/source/editeng/editundo.cxx @@ -74,7 +74,7 @@ EditUndoManager::EditUndoManager( ImpEditEngine* p ) pImpEE = p; } -BOOL __EXPORT EditUndoManager::Undo( USHORT nCount ) +BOOL __EXPORT EditUndoManager::Undo() { if ( GetUndoActionCount() == 0 ) return FALSE; @@ -95,7 +95,7 @@ BOOL __EXPORT EditUndoManager::Undo( USHORT nCount ) pImpEE->GetActiveView()->GetImpEditView()->DrawSelection(); // alte Selektion entfernen pImpEE->SetUndoMode( TRUE ); - BOOL bDone = SfxUndoManager::Undo( nCount ); + BOOL bDone = SfxUndoManager::Undo(); pImpEE->SetUndoMode( FALSE ); EditSelection aNewSel( pImpEE->GetActiveView()->GetImpEditView()->GetEditSelection() ); @@ -109,7 +109,7 @@ BOOL __EXPORT EditUndoManager::Undo( USHORT nCount ) return bDone; } -BOOL __EXPORT EditUndoManager::Redo( USHORT nCount ) +BOOL __EXPORT EditUndoManager::Redo() { if ( GetRedoActionCount() == 0 ) return FALSE; @@ -130,7 +130,7 @@ BOOL __EXPORT EditUndoManager::Redo( USHORT nCount ) pImpEE->GetActiveView()->GetImpEditView()->DrawSelection(); // alte Selektion entfernen pImpEE->SetUndoMode( TRUE ); - BOOL bDone = SfxUndoManager::Redo( nCount ); + BOOL bDone = SfxUndoManager::Redo(); pImpEE->SetUndoMode( FALSE ); EditSelection aNewSel( pImpEE->GetActiveView()->GetImpEditView()->GetEditSelection() ); diff --git a/editeng/source/editeng/impedit5.cxx b/editeng/source/editeng/impedit5.cxx index 2efbb60b6c0f..d03f6bc40cea 100644 --- a/editeng/source/editeng/impedit5.cxx +++ b/editeng/source/editeng/impedit5.cxx @@ -310,7 +310,7 @@ BOOL ImpEditEngine::Undo( EditView* pView ) if ( HasUndoManager() && GetUndoManager().GetUndoActionCount() ) { SetActiveView( pView ); - GetUndoManager().Undo( 1 ); + GetUndoManager().Undo(); return TRUE; } return FALSE; @@ -321,7 +321,7 @@ BOOL ImpEditEngine::Redo( EditView* pView ) if ( HasUndoManager() && GetUndoManager().GetRedoActionCount() ) { SetActiveView( pView ); - GetUndoManager().Redo( 0 ); + GetUndoManager().Redo(); return TRUE; } return FALSE; diff --git a/editeng/source/outliner/outliner.cxx b/editeng/source/outliner/outliner.cxx index 328a762fec54..19b5b67e28d4 100644 --- a/editeng/source/outliner/outliner.cxx +++ b/editeng/source/outliner/outliner.cxx @@ -1227,7 +1227,7 @@ void Outliner::ImpFilterIndents( ULONG nFirstPara, ULONG nLastPara ) pEditEngine->SetUpdateMode( bUpdate ); } -SfxUndoManager& Outliner::GetUndoManager() +::svl::IUndoManager& Outliner::GetUndoManager() { DBG_CHKTHIS(Outliner,0); return pEditEngine->GetUndoManager(); diff --git a/embeddedobj/source/commonembedding/embedobj.cxx b/embeddedobj/source/commonembedding/embedobj.cxx index 3d360245f1ea..ae5c0043153e 100644 --- a/embeddedobj/source/commonembedding/embedobj.cxx +++ b/embeddedobj/source/commonembedding/embedobj.cxx @@ -235,7 +235,10 @@ void OCommonEmbeddedObject::SwitchStateTo_Impl( sal_Int32 nNextState ) if ( nNextState == embed::EmbedStates::INPLACE_ACTIVE ) { if ( !m_xClientSite.is() ) - throw embed::WrongStateException(); //TODO: client site is not set! + throw embed::WrongStateException( + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "client site not set, yet" ) ), + *this + ); uno::Reference< embed::XInplaceClient > xInplaceClient( m_xClientSite, uno::UNO_QUERY ); if ( xInplaceClient.is() && xInplaceClient->canInplaceActivate() ) @@ -538,7 +541,7 @@ void SAL_CALL OCommonEmbeddedObject::doVerb( sal_Int32 nVerbID ) { RTL_LOGFILE_CONTEXT( aLog, "embeddedobj (mv76033) OCommonEmbeddedObject::doVerb" ); - ::osl::MutexGuard aGuard( m_aMutex ); + ::osl::ClearableMutexGuard aGuard( m_aMutex ); if ( m_bDisposed ) throw lang::DisposedException(); // TODO @@ -561,7 +564,10 @@ void SAL_CALL OCommonEmbeddedObject::doVerb( sal_Int32 nVerbID ) // TODO/LATER: check if the verb is a supported one and if it is produce related operation } else + { + aGuard.clear(); changeState( nNewState ); + } } //---------------------------------------------- diff --git a/framework/inc/framework/iguard.hxx b/framework/inc/framework/iguard.hxx new file mode 100755 index 000000000000..7c00858b208d --- /dev/null +++ b/framework/inc/framework/iguard.hxx @@ -0,0 +1,69 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef __FRAMEWORK_THREADHELP_IGUARD_H_ +#define __FRAMEWORK_THREADHELP_IGUARD_H_ + +//_________________________________________________________________________________________________________________ +// includes +//_________________________________________________________________________________________________________________ + +#include <sal/types.h> + +//_________________________________________________________________________________________________________________ +// namespace +//_________________________________________________________________________________________________________________ + +namespace framework{ + +//_________________________________________________________________________________________________________________ +// declarations +//_________________________________________________________________________________________________________________ + +/*-************************************************************************************************************//** + @descr interface for guarding a lock +*//*-*************************************************************************************************************/ +class SAL_NO_VTABLE IGuard +{ + //------------------------------------------------------------------------------------------------------------- + // public methods + //------------------------------------------------------------------------------------------------------------- + public: + + /** clears the lock. If the guard does not currently hold the lock, nothing happens. + */ + virtual void clear() = 0; + + /** attempts to re-establishes the lock, blocking until the attempt is successful. + */ + virtual void reset() = 0; + +}; // class IGuard + +} // namespace framework + +#endif // #ifndef __FRAMEWORK_THREADHELP_IGUARD_H_ diff --git a/framework/inc/threadhelp/imutex.h b/framework/inc/framework/imutex.hxx index 70784c312b87..5466edc4cf76 100644 --- a/framework/inc/threadhelp/imutex.h +++ b/framework/inc/framework/imutex.hxx @@ -32,6 +32,8 @@ // includes //_________________________________________________________________________________________________________________ +#include <sal/types.h> + //_________________________________________________________________________________________________________________ // namespace //_________________________________________________________________________________________________________________ @@ -45,7 +47,7 @@ namespace framework{ /*-************************************************************************************************************//** @descr We need this interface to support using of different mutex implementations in a generic way. *//*-*************************************************************************************************************/ -class IMutex +class SAL_NO_VTABLE IMutex { //------------------------------------------------------------------------------------------------------------- // public methods diff --git a/framework/inc/helper/documentundoguard.hxx b/framework/inc/helper/documentundoguard.hxx new file mode 100755 index 000000000000..d5856341e30e --- /dev/null +++ b/framework/inc/helper/documentundoguard.hxx @@ -0,0 +1,68 @@ +/************************************************************************* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef FRAMEWORK_DOCUMENTUNDOGUARD_HXX +#define FRAMEWORK_DOCUMENTUNDOGUARD_HXX + +/** === begin UNO includes === **/ +#include <com/sun/star/uno/XInterface.hpp> +/** === end UNO includes === **/ + +#include <boost/scoped_ptr.hpp> + +//...................................................................................................................... +namespace framework +{ +//...................................................................................................................... + + //================================================================================================================== + //= DocumentUndoGuard + //================================================================================================================== + struct DocumentUndoGuard_Data; + /** a helper class guarding the Undo manager of a document + + This class guards, within a given scope, the Undo Manager of a document (or another component supporting + the XUndoManagerSupplier interface). When entering the scope (i.e. when the <code>DocumentUndoGuard</code> + instances is constructed), the current state of the undo contexts of the undo manager is examined. + Upon leaving the scope (i.e. when the <code>DocumentUndoGuard</code> is destructed), the guard will execute + as many calls to <member scope="com::sun::star::document">XUndoManager::leaveUndoContext</member> as are + necessary to restore the manager's initial state. + */ + class DocumentUndoGuard + { + public: + DocumentUndoGuard( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& i_undoSupplierComponent ); + ~DocumentUndoGuard(); + + private: + ::boost::scoped_ptr< DocumentUndoGuard_Data > m_pData; + }; + +//...................................................................................................................... +} // namespace framework +//...................................................................................................................... + +#endif // FRAMEWORK_DOCUMENTUNDOGUARD_HXX diff --git a/framework/inc/helper/undomanagerhelper.hxx b/framework/inc/helper/undomanagerhelper.hxx new file mode 100755 index 000000000000..e72f6fbdc173 --- /dev/null +++ b/framework/inc/helper/undomanagerhelper.hxx @@ -0,0 +1,159 @@ +/************************************************************************* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef FRAMEWORK_UNDOMANAGERHELPER_HXX +#define FRAMEWORK_UNDOMANAGERHELPER_HXX + +#include "framework/iguard.hxx" +#include "framework/imutex.hxx" + +/** === begin UNO includes === **/ +#include <com/sun/star/document/XUndoManager.hpp> +#include <com/sun/star/util/XModifyListener.hpp> +/** === end UNO includes === **/ + +#include <boost/scoped_ptr.hpp> + +namespace svl +{ + class IUndoManager; +} + +//...................................................................................................................... +namespace framework +{ +//...................................................................................................................... + + //================================================================================================================== + //= IMutexGuard + //================================================================================================================== + class SAL_NO_VTABLE IMutexGuard : public IGuard + { + public: + /** returns the mutex guarded by the instance. + + Even if the guard currently has not a lock on the mutex, this method must succeed. + */ + virtual IMutex& getGuardedMutex() = 0; + }; + + //================================================================================================================== + //= IUndoManagerImplementation + //================================================================================================================== + class SAL_NO_VTABLE IUndoManagerImplementation + { + public: + /** returns the IUndoManager interface to the actual Undo stack + + @throws com::sun::star::lang::DisposedException + when the instance is already disposed, and no IUndoManager can be provided + + @throws com::sun::star::lang::NotInitializedException + when the instance is not initialized, yet, and no IUndoManager can be provided + */ + virtual ::svl::IUndoManager& getImplUndoManager() = 0; + + /** provides access to an UNO interface for the XUndoManager implementation. Used when throwing exceptions. + */ + virtual ::com::sun::star::uno::Reference< ::com::sun::star::document::XUndoManager > + getThis() = 0; + }; + + //================================================================================================================== + //= UndoManagerHelper + //================================================================================================================== + class UndoManagerHelper_Impl; + /** helper class for implementing an XUndoManager + + Several of the methods of the class take an IMutexGuard instance. It is assumed that this guard has a lock on + its mutext at the moment the method is entered. The lock will be released before any notifications to the + registered XUndoManagerListeners happen. + + The following locking strategy is used for this mutex: + <ul><li>Any notifications to the registered XUndoManagerListeners are after the guard has been cleared. i.e. + without the mutex being locked.</p> + <li>Any calls into the <code>IUndoManager</code> implementation is made without the mutex being locked. + Note that this implies that the <code>IUndoManager</code> implementation must be thread-safe in itself + (which is true for the default implementation, SfxUndoManager).</li> + <li>An exception to the previous item are the <member>IUndoManager::Undo</member> and + <member>IUndoManager::Redo</member> methods: They're called with the given external mutex being + locked.</li> + </ul> + + The reason for the exception for IUndoManager::Undo and IUndoManager::Redo is that those are expected to + modify the actual document which the UndoManager works for. And as long as our documents are not thread-safe, + and as long as we do not re-fit <strong>all</strong> existing SfxUndoImplementations to <em>not</em> expect + the dreaded SolarMutex being locked when they're called, the above behavior is a compromise between "how it should + be" and "how it can realistically be". + */ + class UndoManagerHelper + { + public: + UndoManagerHelper( IUndoManagerImplementation& i_undoManagerImpl ); + ~UndoManagerHelper(); + + // life time control + void disposing(); + + // XUndoManager equivalents + void enterUndoContext( const ::rtl::OUString& i_title, IMutexGuard& i_instanceLock ); + void enterHiddenUndoContext( IMutexGuard& i_instanceLock ); + void leaveUndoContext( IMutexGuard& i_instanceLock ); + void addUndoAction( const ::com::sun::star::uno::Reference< ::com::sun::star::document::XUndoAction >& i_action, IMutexGuard& i_instanceLock ); + void undo( IMutexGuard& i_instanceLock ); + void redo( IMutexGuard& i_instanceLock ); + ::sal_Bool isUndoPossible() const; + ::sal_Bool isRedoPossible() const; + ::rtl::OUString getCurrentUndoActionTitle() const; + ::rtl::OUString getCurrentRedoActionTitle() const; + ::com::sun::star::uno::Sequence< ::rtl::OUString > + getAllUndoActionTitles() const; + ::com::sun::star::uno::Sequence< ::rtl::OUString > + getAllRedoActionTitles() const; + void clear( IMutexGuard& i_instanceLock ); + void clearRedo( IMutexGuard& i_instanceLock ); + void reset( IMutexGuard& i_instanceLock ); + void addUndoManagerListener( const ::com::sun::star::uno::Reference< ::com::sun::star::document::XUndoManagerListener >& i_listener ); + void removeUndoManagerListener( const ::com::sun::star::uno::Reference< ::com::sun::star::document::XUndoManagerListener >& i_listener ); + + // XLockable, base of XUndoManager, equivalents + void lock(); + void unlock(); + ::sal_Bool isLocked(); + + // XModifyBroadcaster equivalents + void addModifyListener( const ::com::sun::star::uno::Reference< ::com::sun::star::util::XModifyListener >& i_listener ); + void removeModifyListener( const ::com::sun::star::uno::Reference< ::com::sun::star::util::XModifyListener >& i_listener ); + + private: + ::boost::scoped_ptr< UndoManagerHelper_Impl > m_pImpl; + }; + +//...................................................................................................................... +} // namespace framework +//...................................................................................................................... + +#endif // FRAMEWORK_UNDOMANAGERHELPER_HXX diff --git a/framework/inc/threadhelp/lockhelper.hxx b/framework/inc/threadhelp/lockhelper.hxx index 5677350b5349..27ad3fa178d6 100644 --- a/framework/inc/threadhelp/lockhelper.hxx +++ b/framework/inc/threadhelp/lockhelper.hxx @@ -33,7 +33,7 @@ //_________________________________________________________________________________________________________________ #include <threadhelp/inoncopyable.h> -#include <threadhelp/imutex.h> +#include <framework/imutex.hxx> #include <threadhelp/irwlock.h> #include <threadhelp/fairrwlock.hxx> diff --git a/framework/inc/threadhelp/resetableguard.hxx b/framework/inc/threadhelp/resetableguard.hxx index 58830189e052..3b88294a80e3 100644 --- a/framework/inc/threadhelp/resetableguard.hxx +++ b/framework/inc/threadhelp/resetableguard.hxx @@ -33,7 +33,7 @@ //_________________________________________________________________________________________________________________ #include <threadhelp/inoncopyable.h> -#include <threadhelp/imutex.h> +#include <framework/imutex.hxx> //#ifndef __FRAMEWORK_THREADHELP_THREADHELPBASE_HXX_ //#include <threadhelp/threadhelpbase.hxx> diff --git a/framework/prj/d.lst b/framework/prj/d.lst index d3a3d6dd153c..a3c3f382da1e 100644 --- a/framework/prj/d.lst +++ b/framework/prj/d.lst @@ -43,6 +43,10 @@ mkdir: %_DEST%\xml%_EXT%\uiconfig\modules\StartModule\statusbar ..\inc\interaction\preventduplicateinteraction.hxx %_DEST%\inc%_EXT%\framework\preventduplicateinteraction.hxx ..\inc\helper\titlehelper.hxx %_DEST%\inc%_EXT%\framework\titlehelper.hxx ..\inc\classes\framelistanalyzer.hxx %_DEST%\inc%_EXT%\framework\framelistanalyzer.hxx +..\inc\helper\documentundoguard.hxx %_DEST%\inc%_EXT%\framework\documentundoguard.hxx +..\inc\helper\undomanagerhelper.hxx %_DEST%\inc%_EXT%\framework\undomanagerhelper.hxx +..\inc\framework\imutex.hxx %_DEST%\inc%_EXT%\framework\imutex.hxx +..\inc\framework\iguard.hxx %_DEST%\inc%_EXT%\framework\iguard.hxx ..\uiconfig\startmodule\menubar\*.xml %_DEST%\xml%_EXT%\uiconfig\modules\StartModule\menubar\*.xml ..\uiconfig\startmodule\toolbar\*.xml %_DEST%\xml%_EXT%\uiconfig\modules\StartModule\toolbar\*.xml diff --git a/framework/source/helper/documentundoguard.cxx b/framework/source/helper/documentundoguard.cxx new file mode 100755 index 000000000000..1227c5afbd93 --- /dev/null +++ b/framework/source/helper/documentundoguard.cxx @@ -0,0 +1,271 @@ +/************************************************************************* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#include "precompiled_framework.hxx" + +#include <helper/documentundoguard.hxx> + +/** === begin UNO includes === **/ +#include <com/sun/star/document/XUndoManagerSupplier.hpp> +/** === end UNO includes === **/ + +#include <cppuhelper/implbase1.hxx> +#include <rtl/ref.hxx> +#include <tools/diagnose_ex.h> + +//...................................................................................................................... +namespace framework +{ +//...................................................................................................................... + + /** === begin UNO using === **/ + using ::com::sun::star::uno::Reference; + using ::com::sun::star::uno::XInterface; + using ::com::sun::star::uno::UNO_QUERY; + using ::com::sun::star::uno::UNO_QUERY_THROW; + using ::com::sun::star::uno::Exception; + using ::com::sun::star::uno::RuntimeException; + using ::com::sun::star::uno::Any; + using ::com::sun::star::uno::makeAny; + using ::com::sun::star::uno::Sequence; + using ::com::sun::star::uno::Type; + using ::com::sun::star::document::XUndoManagerSupplier; + using ::com::sun::star::document::XUndoManager; + using ::com::sun::star::document::XUndoManagerListener; + using ::com::sun::star::document::UndoManagerEvent; + using ::com::sun::star::lang::EventObject; + /** === end UNO using === **/ + + //================================================================================================================== + //= UndoManagerContextListener + //================================================================================================================== + typedef ::cppu::WeakImplHelper1 < XUndoManagerListener + > UndoManagerContextListener_Base; + class UndoManagerContextListener : public UndoManagerContextListener_Base + { + public: + UndoManagerContextListener( const Reference< XUndoManager >& i_undoManager ) + :m_xUndoManager( i_undoManager, UNO_QUERY_THROW ) + ,m_nRelativeContextDepth( 0 ) + ,m_documentDisposed( false ) + { + osl_incrementInterlockedCount( &m_refCount ); + { + m_xUndoManager->addUndoManagerListener( this ); + } + osl_decrementInterlockedCount( &m_refCount ); + } + + UndoManagerContextListener() + { + } + + void finish() + { + OSL_ENSURE( m_nRelativeContextDepth >= 0, "UndoManagerContextListener: more contexts left than entered?" ); + + if ( m_documentDisposed ) + return; + + // work with a copy of m_nRelativeContextDepth, to be independent from possible bugs in the + // listener notifications (where it would be decremented with every leaveUndoContext) + sal_Int32 nDepth = m_nRelativeContextDepth; + while ( nDepth-- > 0 ) + { + m_xUndoManager->leaveUndoContext(); + } + m_xUndoManager->removeUndoManagerListener( this ); + } + + // XUndoManagerListener + virtual void SAL_CALL undoActionAdded( const UndoManagerEvent& i_event ) throw (RuntimeException); + virtual void SAL_CALL actionUndone( const UndoManagerEvent& i_event ) throw (RuntimeException); + virtual void SAL_CALL actionRedone( const UndoManagerEvent& i_event ) throw (RuntimeException); + virtual void SAL_CALL allActionsCleared( const EventObject& i_event ) throw (RuntimeException); + virtual void SAL_CALL redoActionsCleared( const EventObject& i_event ) throw (RuntimeException); + virtual void SAL_CALL resetAll( const EventObject& i_event ) throw (RuntimeException); + virtual void SAL_CALL enteredContext( const UndoManagerEvent& i_event ) throw (RuntimeException); + virtual void SAL_CALL enteredHiddenContext( const UndoManagerEvent& i_event ) throw (RuntimeException); + virtual void SAL_CALL leftContext( const UndoManagerEvent& i_event ) throw (RuntimeException); + virtual void SAL_CALL leftHiddenContext( const UndoManagerEvent& i_event ) throw (RuntimeException); + virtual void SAL_CALL cancelledContext( const UndoManagerEvent& i_event ) throw (RuntimeException); + + // XEventListener + virtual void SAL_CALL disposing( const EventObject& i_event ) throw (RuntimeException); + + private: + Reference< XUndoManager > const m_xUndoManager; + oslInterlockedCount m_nRelativeContextDepth; + bool m_documentDisposed; + }; + + //------------------------------------------------------------------------------------------------------------------ + void SAL_CALL UndoManagerContextListener::undoActionAdded( const UndoManagerEvent& i_event ) throw (RuntimeException) + { + (void)i_event; + // not interested in + } + + //------------------------------------------------------------------------------------------------------------------ + void SAL_CALL UndoManagerContextListener::actionUndone( const UndoManagerEvent& i_event ) throw (RuntimeException) + { + (void)i_event; + // not interested in + } + + //------------------------------------------------------------------------------------------------------------------ + void SAL_CALL UndoManagerContextListener::actionRedone( const UndoManagerEvent& i_event ) throw (RuntimeException) + { + (void)i_event; + // not interested in + } + + //------------------------------------------------------------------------------------------------------------------ + void SAL_CALL UndoManagerContextListener::allActionsCleared( const EventObject& i_event ) throw (RuntimeException) + { + (void)i_event; + // not interested in + } + + //------------------------------------------------------------------------------------------------------------------ + void SAL_CALL UndoManagerContextListener::redoActionsCleared( const EventObject& i_event ) throw (RuntimeException) + { + (void)i_event; + // not interested in + } + + //------------------------------------------------------------------------------------------------------------------ + void SAL_CALL UndoManagerContextListener::resetAll( const EventObject& i_event ) throw (RuntimeException) + { + (void)i_event; + m_nRelativeContextDepth = 0; + } + + //------------------------------------------------------------------------------------------------------------------ + void SAL_CALL UndoManagerContextListener::enteredContext( const UndoManagerEvent& i_event ) throw (RuntimeException) + { + (void)i_event; + osl_incrementInterlockedCount( &m_nRelativeContextDepth ); + } + + //------------------------------------------------------------------------------------------------------------------ + void SAL_CALL UndoManagerContextListener::enteredHiddenContext( const UndoManagerEvent& i_event ) throw (RuntimeException) + { + (void)i_event; + osl_incrementInterlockedCount( &m_nRelativeContextDepth ); + } + + //------------------------------------------------------------------------------------------------------------------ + void SAL_CALL UndoManagerContextListener::leftContext( const UndoManagerEvent& i_event ) throw (RuntimeException) + { + (void)i_event; + osl_decrementInterlockedCount( &m_nRelativeContextDepth ); + } + + //------------------------------------------------------------------------------------------------------------------ + void SAL_CALL UndoManagerContextListener::leftHiddenContext( const UndoManagerEvent& i_event ) throw (RuntimeException) + { + (void)i_event; + osl_decrementInterlockedCount( &m_nRelativeContextDepth ); + } + + //------------------------------------------------------------------------------------------------------------------ + void SAL_CALL UndoManagerContextListener::cancelledContext( const UndoManagerEvent& i_event ) throw (RuntimeException) + { + (void)i_event; + osl_decrementInterlockedCount( &m_nRelativeContextDepth ); + } + + //------------------------------------------------------------------------------------------------------------------ + void SAL_CALL UndoManagerContextListener::disposing( const EventObject& i_event ) throw (RuntimeException) + { + (void)i_event; + m_documentDisposed = true; + } + + //================================================================================================================== + //= DocumentUndoGuard_Data + //================================================================================================================== + struct DocumentUndoGuard_Data + { + Reference< XUndoManager > xUndoManager; + ::rtl::Reference< UndoManagerContextListener > pContextListener; + }; + + namespace + { + //-------------------------------------------------------------------------------------------------------------- + void lcl_init( DocumentUndoGuard_Data& i_data, const Reference< XInterface >& i_undoSupplierComponent ) + { + try + { + Reference< XUndoManagerSupplier > xUndoSupplier( i_undoSupplierComponent, UNO_QUERY ); + if ( xUndoSupplier.is() ) + i_data.xUndoManager.set( xUndoSupplier->getUndoManager(), UNO_QUERY_THROW ); + + if ( i_data.xUndoManager.is() ) + i_data.pContextListener.set( new UndoManagerContextListener( i_data.xUndoManager ) ); + } + catch( const Exception& ) + { + DBG_UNHANDLED_EXCEPTION(); + } + } + + //-------------------------------------------------------------------------------------------------------------- + void lcl_restore( DocumentUndoGuard_Data& i_data ) + { + try + { + if ( i_data.pContextListener.is() ) + i_data.pContextListener->finish(); + i_data.pContextListener.clear(); + } + catch( const Exception& ) + { + DBG_UNHANDLED_EXCEPTION(); + } + } + } + + //================================================================================================================== + //= DocumentUndoGuard + //================================================================================================================== + //------------------------------------------------------------------------------------------------------------------ + DocumentUndoGuard::DocumentUndoGuard( const Reference< XInterface >& i_undoSupplierComponent ) + :m_pData( new DocumentUndoGuard_Data ) + { + lcl_init( *m_pData, i_undoSupplierComponent ); + } + + DocumentUndoGuard::~DocumentUndoGuard() + { + lcl_restore( *m_pData ); + } + +//...................................................................................................................... +} // namespace framework +//...................................................................................................................... diff --git a/framework/source/helper/makefile.mk b/framework/source/helper/makefile.mk index ed54c381160c..9199f556ff2d 100644 --- a/framework/source/helper/makefile.mk +++ b/framework/source/helper/makefile.mk @@ -24,7 +24,7 @@ # for a copy of the LGPLv3 License. # #************************************************************************* -PRJ=..$/.. +PRJ=../.. PRJNAME= framework TARGET= fwk_helper @@ -41,28 +41,30 @@ CDEFS+=-DCOMPMOD_NAMESPACE=framework # --- Generate ----------------------------------------------------- -SLOFILES= $(SLO)$/ocomponentaccess.obj \ - $(SLO)$/ocomponentenumeration.obj \ - $(SLO)$/oframes.obj \ - $(SLO)$/statusindicatorfactory.obj \ - $(SLO)$/statusindicator.obj \ - $(SLO)$/imageproducer.obj \ - $(SLO)$/propertysetcontainer.obj \ - $(SLO)$/actiontriggerhelper.obj \ - $(SLO)$/persistentwindowstate.obj \ - $(SLO)$/networkdomain.obj \ - $(SLO)$/acceleratorinfo.obj \ - $(SLO)$/uielementwrapperbase.obj \ - $(SLO)$/dockingareadefaultacceptor.obj \ - $(SLO)$/uiconfigelementwrapperbase.obj \ - $(SLO)$/shareablemutex.obj \ - $(SLO)$/vclstatusindicator.obj \ - $(SLO)$/wakeupthread.obj \ - $(SLO)$/configimporter.obj \ - $(SLO)$/tagwindowasmodified.obj \ - $(SLO)$/titlebarupdate.obj \ - $(SLO)$/titlehelper.obj \ - $(SLO)$/mischelper.obj +SLOFILES= $(SLO)/ocomponentaccess.obj \ + $(SLO)/ocomponentenumeration.obj \ + $(SLO)/oframes.obj \ + $(SLO)/statusindicatorfactory.obj \ + $(SLO)/statusindicator.obj \ + $(SLO)/imageproducer.obj \ + $(SLO)/propertysetcontainer.obj \ + $(SLO)/actiontriggerhelper.obj \ + $(SLO)/persistentwindowstate.obj \ + $(SLO)/networkdomain.obj \ + $(SLO)/acceleratorinfo.obj \ + $(SLO)/uielementwrapperbase.obj \ + $(SLO)/dockingareadefaultacceptor.obj \ + $(SLO)/uiconfigelementwrapperbase.obj \ + $(SLO)/shareablemutex.obj \ + $(SLO)/vclstatusindicator.obj \ + $(SLO)/wakeupthread.obj \ + $(SLO)/configimporter.obj \ + $(SLO)/tagwindowasmodified.obj \ + $(SLO)/titlebarupdate.obj \ + $(SLO)/titlehelper.obj \ + $(SLO)/mischelper.obj \ + $(SLO)/documentundoguard.obj \ + $(SLO)/undomanagerhelper.obj \ # --- Targets ------------------------------------------------------ diff --git a/framework/source/helper/undomanagerhelper.cxx b/framework/source/helper/undomanagerhelper.cxx new file mode 100755 index 000000000000..e2cfd13c5bb7 --- /dev/null +++ b/framework/source/helper/undomanagerhelper.cxx @@ -0,0 +1,1160 @@ +/************************************************************************* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#include "precompiled_framework.hxx" + +#include "helper/undomanagerhelper.hxx" + +/** === begin UNO includes === **/ +#include <com/sun/star/lang/XComponent.hpp> +/** === end UNO includes === **/ + +#include <cppuhelper/interfacecontainer.hxx> +#include <cppuhelper/exc_hlp.hxx> +#include <comphelper/flagguard.hxx> +#include <comphelper/asyncnotification.hxx> +#include <svl/undo.hxx> +#include <tools/diagnose_ex.h> +#include <osl/conditn.hxx> + +#include <stack> +#include <queue> +#include <boost/function.hpp> + +//...................................................................................................................... +namespace framework +{ +//...................................................................................................................... + + /** === begin UNO using === **/ + using ::com::sun::star::uno::Reference; + using ::com::sun::star::uno::XInterface; + using ::com::sun::star::uno::UNO_QUERY; + using ::com::sun::star::uno::UNO_QUERY_THROW; + using ::com::sun::star::uno::UNO_SET_THROW; + using ::com::sun::star::uno::Exception; + using ::com::sun::star::uno::RuntimeException; + using ::com::sun::star::uno::Any; + using ::com::sun::star::uno::makeAny; + using ::com::sun::star::uno::Sequence; + using ::com::sun::star::uno::Type; + using ::com::sun::star::document::XUndoManagerListener; + using ::com::sun::star::document::UndoManagerEvent; + using ::com::sun::star::document::EmptyUndoStackException; + using ::com::sun::star::document::UndoContextNotClosedException; + using ::com::sun::star::document::UndoFailedException; + using ::com::sun::star::util::NotLockedException; + using ::com::sun::star::lang::EventObject; + using ::com::sun::star::document::XUndoAction; + using ::com::sun::star::lang::XComponent; + using ::com::sun::star::document::XUndoManager; + using ::com::sun::star::util::InvalidStateException; + using ::com::sun::star::lang::IllegalArgumentException; + using ::com::sun::star::util::XModifyListener; + /** === end UNO using === **/ + using ::svl::IUndoManager; + + //================================================================================================================== + //= UndoActionWrapper + //================================================================================================================== + class UndoActionWrapper : public SfxUndoAction + { + public: + UndoActionWrapper( + Reference< XUndoAction > const& i_undoAction + ); + virtual ~UndoActionWrapper(); + + virtual String GetComment() const; + virtual void Undo(); + virtual void Redo(); + virtual BOOL CanRepeat(SfxRepeatTarget&) const; + + private: + const Reference< XUndoAction > m_xUndoAction; + }; + + //------------------------------------------------------------------------------------------------------------------ + UndoActionWrapper::UndoActionWrapper( Reference< XUndoAction > const& i_undoAction ) + :SfxUndoAction() + ,m_xUndoAction( i_undoAction ) + { + ENSURE_OR_THROW( m_xUndoAction.is(), "illegal undo action" ); + } + + //------------------------------------------------------------------------------------------------------------------ + UndoActionWrapper::~UndoActionWrapper() + { + try + { + Reference< XComponent > xComponent( m_xUndoAction, UNO_QUERY ); + if ( xComponent.is() ) + xComponent->dispose(); + } + catch( const Exception& ) + { + DBG_UNHANDLED_EXCEPTION(); + } + } + + //------------------------------------------------------------------------------------------------------------------ + String UndoActionWrapper::GetComment() const + { + String sComment; + try + { + sComment = m_xUndoAction->getTitle(); + } + catch( const Exception& ) + { + DBG_UNHANDLED_EXCEPTION(); + } + return sComment; + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoActionWrapper::Undo() + { + m_xUndoAction->undo(); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoActionWrapper::Redo() + { + m_xUndoAction->redo(); + } + + //------------------------------------------------------------------------------------------------------------------ + BOOL UndoActionWrapper::CanRepeat(SfxRepeatTarget&) const + { + return FALSE; + } + + //================================================================================================================== + //= UndoManagerRequest + //================================================================================================================== + class UndoManagerRequest : public ::comphelper::AnyEvent + { + public: + UndoManagerRequest( ::boost::function0< void > const& i_request ) + :m_request( i_request ) + ,m_caughtException() + ,m_finishCondition() + { + m_finishCondition.reset(); + } + + void execute() + { + try + { + m_request(); + } + catch( const Exception& ) + { + m_caughtException = ::cppu::getCaughtException(); + } + m_finishCondition.set(); + } + + void wait() + { + m_finishCondition.wait(); + if ( m_caughtException.hasValue() ) + ::cppu::throwException( m_caughtException ); + } + + void cancel( const Reference< XInterface >& i_context ) + { + m_caughtException <<= RuntimeException( + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Concurrency error: an ealier operation on the stack failed." ) ), + i_context + ); + m_finishCondition.set(); + } + + protected: + ~UndoManagerRequest() + { + } + + private: + ::boost::function0< void > m_request; + Any m_caughtException; + ::osl::Condition m_finishCondition; + }; + + //------------------------------------------------------------------------------------------------------------------ + + //================================================================================================================== + //= UndoManagerHelper_Impl + //================================================================================================================== + class UndoManagerHelper_Impl : public SfxUndoListener + { + private: + ::osl::Mutex m_aMutex; + ::osl::Mutex m_aQueueMutex; + bool m_disposed; + bool m_bAPIActionRunning; + bool m_bProcessingEvents; + ::cppu::OInterfaceContainerHelper m_aUndoListeners; + ::cppu::OInterfaceContainerHelper m_aModifyListeners; + IUndoManagerImplementation& m_rUndoManagerImplementation; + UndoManagerHelper& m_rAntiImpl; + ::std::stack< bool > m_aContextVisibilities; +#if OSL_DEBUG_LEVEL > 0 + ::std::stack< bool > m_aContextAPIFlags; +#endif + ::std::queue< ::rtl::Reference< UndoManagerRequest > > + m_aEventQueue; + + public: + ::osl::Mutex& getMutex() { return m_aMutex; } + + public: + UndoManagerHelper_Impl( UndoManagerHelper& i_antiImpl, IUndoManagerImplementation& i_undoManagerImpl ) + :m_aMutex() + ,m_aQueueMutex() + ,m_disposed( false ) + ,m_bAPIActionRunning( false ) + ,m_bProcessingEvents( false ) + ,m_aUndoListeners( m_aMutex ) + ,m_aModifyListeners( m_aMutex ) + ,m_rUndoManagerImplementation( i_undoManagerImpl ) + ,m_rAntiImpl( i_antiImpl ) + { + getUndoManager().AddUndoListener( *this ); + } + + virtual ~UndoManagerHelper_Impl() + { + } + + //.............................................................................................................. + IUndoManager& getUndoManager() const + { + return m_rUndoManagerImplementation.getImplUndoManager(); + } + + //.............................................................................................................. + Reference< XUndoManager > getXUndoManager() const + { + return m_rUndoManagerImplementation.getThis(); + } + + // SfxUndoListener + virtual void actionUndone( const String& i_actionComment ); + virtual void actionRedone( const String& i_actionComment ); + virtual void undoActionAdded( const String& i_actionComment ); + virtual void cleared(); + virtual void clearedRedo(); + virtual void resetAll(); + virtual void listActionEntered( const String& i_comment ); + virtual void listActionLeft( const String& i_comment ); + virtual void listActionLeftAndMerged(); + virtual void listActionCancelled(); + virtual void undoManagerDying(); + + // public operations + void disposing(); + + void enterUndoContext( const ::rtl::OUString& i_title, const bool i_hidden, IMutexGuard& i_instanceLock ); + void leaveUndoContext( IMutexGuard& i_instanceLock ); + void addUndoAction( const Reference< XUndoAction >& i_action, IMutexGuard& i_instanceLock ); + void undo( IMutexGuard& i_instanceLock ); + void redo( IMutexGuard& i_instanceLock ); + void clear( IMutexGuard& i_instanceLock ); + void clearRedo( IMutexGuard& i_instanceLock ); + void reset( IMutexGuard& i_instanceLock ); + + void addUndoManagerListener( const Reference< XUndoManagerListener >& i_listener ) + { + m_aUndoListeners.addInterface( i_listener ); + } + + void removeUndoManagerListener( const Reference< XUndoManagerListener >& i_listener ) + { + m_aUndoListeners.removeInterface( i_listener ); + } + + void addModifyListener( const Reference< XModifyListener >& i_listener ) + { + m_aModifyListeners.addInterface( i_listener ); + } + + void removeModifyListener( const Reference< XModifyListener >& i_listener ) + { + m_aModifyListeners.removeInterface( i_listener ); + } + + UndoManagerEvent + buildEvent( ::rtl::OUString const& i_title ) const; + + void impl_notifyModified(); + void notify( ::rtl::OUString const& i_title, + void ( SAL_CALL XUndoManagerListener::*i_notificationMethod )( const UndoManagerEvent& ) + ); + void notify( void ( SAL_CALL XUndoManagerListener::*i_notificationMethod )( const UndoManagerEvent& ) ) + { + notify( ::rtl::OUString(), i_notificationMethod ); + } + + void notify( void ( SAL_CALL XUndoManagerListener::*i_notificationMethod )( const EventObject& ) ); + + private: + /// adds a function to be called to the request processor's queue + void impl_processRequest( ::boost::function0< void > const& i_request, IMutexGuard& i_instanceLock ); + + /// impl-versions of the XUndoManager API. + void impl_enterUndoContext( const ::rtl::OUString& i_title, const bool i_hidden ); + void impl_leaveUndoContext(); + void impl_addUndoAction( const Reference< XUndoAction >& i_action ); + void impl_doUndoRedo( IMutexGuard& i_externalLock, const bool i_undo ); + void impl_clear(); + void impl_clearRedo(); + void impl_reset(); + }; + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper_Impl::disposing() + { + EventObject aEvent; + aEvent.Source = getXUndoManager(); + m_aUndoListeners.disposeAndClear( aEvent ); + m_aModifyListeners.disposeAndClear( aEvent ); + + ::osl::MutexGuard aGuard( m_aMutex ); + + getUndoManager().RemoveUndoListener( *this ); + + m_disposed = true; + } + + //------------------------------------------------------------------------------------------------------------------ + UndoManagerEvent UndoManagerHelper_Impl::buildEvent( ::rtl::OUString const& i_title ) const + { + UndoManagerEvent aEvent; + aEvent.Source = getXUndoManager(); + aEvent.UndoActionTitle = i_title; + aEvent.UndoContextDepth = getUndoManager().GetListActionDepth(); + return aEvent; + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper_Impl::impl_notifyModified() + { + const EventObject aEvent( getXUndoManager() ); + m_aModifyListeners.notifyEach( &XModifyListener::modified, aEvent ); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper_Impl::notify( ::rtl::OUString const& i_title, + void ( SAL_CALL XUndoManagerListener::*i_notificationMethod )( const UndoManagerEvent& ) ) + { + const UndoManagerEvent aEvent( buildEvent( i_title ) ); + + // TODO: this notification method here is used by UndoManagerHelper_Impl, to multiplex the notifications we + // receive from the IUndoManager. Those notitications are sent with a locked SolarMutex, which means + // we're doing the multiplexing here with a locked SM, too. Which is Bad (TM). + // Fixing this properly would require outsourcing all the notifications into an own thread - which might lead + // to problems of its own, since clients might expect synchronous notifications. + + m_aUndoListeners.notifyEach( i_notificationMethod, aEvent ); + impl_notifyModified(); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper_Impl::notify( void ( SAL_CALL XUndoManagerListener::*i_notificationMethod )( const EventObject& ) ) + { + const EventObject aEvent( getXUndoManager() ); + + // TODO: the same comment as in the other notify, regarding SM locking applies here ... + + m_aUndoListeners.notifyEach( i_notificationMethod, aEvent ); + impl_notifyModified(); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper_Impl::enterUndoContext( const ::rtl::OUString& i_title, const bool i_hidden, IMutexGuard& i_instanceLock ) + { + impl_processRequest( + ::boost::bind( + &UndoManagerHelper_Impl::impl_enterUndoContext, + this, + ::boost::cref( i_title ), + i_hidden + ), + i_instanceLock + ); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper_Impl::leaveUndoContext( IMutexGuard& i_instanceLock ) + { + impl_processRequest( + ::boost::bind( + &UndoManagerHelper_Impl::impl_leaveUndoContext, + this + ), + i_instanceLock + ); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper_Impl::addUndoAction( const Reference< XUndoAction >& i_action, IMutexGuard& i_instanceLock ) + { + if ( !i_action.is() ) + throw IllegalArgumentException( + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "illegal undo action object" ) ), + getXUndoManager(), + 1 + ); + + impl_processRequest( + ::boost::bind( + &UndoManagerHelper_Impl::impl_addUndoAction, + this, + ::boost::ref( i_action ) + ), + i_instanceLock + ); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper_Impl::clear( IMutexGuard& i_instanceLock ) + { + impl_processRequest( + ::boost::bind( + &UndoManagerHelper_Impl::impl_clear, + this + ), + i_instanceLock + ); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper_Impl::clearRedo( IMutexGuard& i_instanceLock ) + { + impl_processRequest( + ::boost::bind( + &UndoManagerHelper_Impl::impl_clearRedo, + this + ), + i_instanceLock + ); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper_Impl::reset( IMutexGuard& i_instanceLock ) + { + impl_processRequest( + ::boost::bind( + &UndoManagerHelper_Impl::impl_reset, + this + ), + i_instanceLock + ); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper_Impl::impl_processRequest( ::boost::function0< void > const& i_request, IMutexGuard& i_instanceLock ) + { + // create the request, and add it to our queue + ::rtl::Reference< UndoManagerRequest > pRequest( new UndoManagerRequest( i_request ) ); + { + ::osl::MutexGuard aQueueGuard( m_aQueueMutex ); + m_aEventQueue.push( pRequest ); + } + + i_instanceLock.clear(); + + if ( m_bProcessingEvents ) + { + // another thread is processing the event queue currently => it will also process the event which we just added + pRequest->wait(); + return; + } + + m_bProcessingEvents = true; + do + { + pRequest.clear(); + { + ::osl::MutexGuard aQueueGuard( m_aQueueMutex ); + if ( m_aEventQueue.empty() ) + { + // reset the flag before releasing the queue mutex, otherwise it's possible that another thread + // could add an event after we release the mutex, but before we reset the flag. If then this other + // thread checks the flag before be reset it, this thread's event would starve. + m_bProcessingEvents = false; + return; + } + pRequest = m_aEventQueue.front(); + m_aEventQueue.pop(); + } + try + { + pRequest->execute(); + pRequest->wait(); + } + catch( ... ) + { + { + // no chance to process further requests, if the current one failed + // => discard them + ::osl::MutexGuard aQueueGuard( m_aQueueMutex ); + while ( !m_aEventQueue.empty() ) + { + pRequest = m_aEventQueue.front(); + m_aEventQueue.pop(); + pRequest->cancel( getXUndoManager() ); + } + m_bProcessingEvents = false; + } + // re-throw the error + throw; + } + } + while ( true ); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper_Impl::impl_enterUndoContext( const ::rtl::OUString& i_title, const bool i_hidden ) + { + // SYNCHRONIZED ---> + ::osl::ClearableMutexGuard aGuard( m_aMutex ); + + IUndoManager& rUndoManager = getUndoManager(); + if ( !rUndoManager.IsUndoEnabled() ) + // ignore this request if the manager is locked + return; + + if ( i_hidden && ( rUndoManager.GetUndoActionCount( IUndoManager::CurrentLevel ) == 0 ) ) + throw EmptyUndoStackException( + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "can't enter a hidden context without a previous Undo action" ) ), + m_rUndoManagerImplementation.getThis() + ); + + { + ::comphelper::FlagGuard aNotificationGuard( m_bAPIActionRunning ); + rUndoManager.EnterListAction( i_title, ::rtl::OUString() ); + } + + m_aContextVisibilities.push( i_hidden ); + + const UndoManagerEvent aEvent( buildEvent( i_title ) ); + aGuard.clear(); + // <--- SYNCHRONIZED + + m_aUndoListeners.notifyEach( i_hidden ? &XUndoManagerListener::enteredHiddenContext : &XUndoManagerListener::enteredContext, aEvent ); + impl_notifyModified(); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper_Impl::impl_leaveUndoContext() + { + // SYNCHRONIZED ---> + ::osl::ClearableMutexGuard aGuard( m_aMutex ); + + IUndoManager& rUndoManager = getUndoManager(); + if ( !rUndoManager.IsUndoEnabled() ) + // ignore this request if the manager is locked + return; + + if ( !rUndoManager.IsInListAction() ) + throw InvalidStateException( + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "no active undo context" ) ), + getXUndoManager() + ); + + USHORT nContextElements = 0; + + const bool isHiddenContext = m_aContextVisibilities.top();; + m_aContextVisibilities.pop(); + + { + ::comphelper::FlagGuard aNotificationGuard( m_bAPIActionRunning ); + if ( isHiddenContext ) + nContextElements = rUndoManager.LeaveAndMergeListAction(); + else + nContextElements = rUndoManager.LeaveListAction(); + } + + // prepare notification + void ( SAL_CALL XUndoManagerListener::*notificationMethod )( const UndoManagerEvent& ) = NULL; + + UndoManagerEvent aEvent( buildEvent( ::rtl::OUString() ) ); + if ( nContextElements == 0 ) + { + notificationMethod = &XUndoManagerListener::cancelledContext; + } + else if ( isHiddenContext ) + { + notificationMethod = &XUndoManagerListener::leftHiddenContext; + } + else + { + aEvent.UndoActionTitle = rUndoManager.GetUndoActionComment( 0, IUndoManager::CurrentLevel ); + notificationMethod = &XUndoManagerListener::leftContext; + } + + aGuard.clear(); + // <--- SYNCHRONIZED + + m_aUndoListeners.notifyEach( notificationMethod, aEvent ); + impl_notifyModified(); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper_Impl::impl_doUndoRedo( IMutexGuard& i_externalLock, const bool i_undo ) + { + ::osl::Guard< ::framework::IMutex > aExternalGuard( i_externalLock.getGuardedMutex() ); + // note that this assumes that the mutex has been released in the thread which added the + // Undo/Redo request, so we can successfully acquire it + + // SYNCHRONIZED ---> + ::osl::ClearableMutexGuard aGuard( m_aMutex ); + + IUndoManager& rUndoManager = getUndoManager(); + if ( rUndoManager.IsInListAction() ) + throw UndoContextNotClosedException( ::rtl::OUString(), getXUndoManager() ); + + const USHORT nElements = i_undo + ? rUndoManager.GetUndoActionCount( IUndoManager::TopLevel ) + : rUndoManager.GetRedoActionCount( IUndoManager::TopLevel ); + if ( nElements == 0 ) + throw EmptyUndoStackException( ::rtl::OUString::createFromAscii( "stack is empty" ), getXUndoManager() ); + + aGuard.clear(); + // <--- SYNCHRONIZED + + try + { + if ( i_undo ) + rUndoManager.Undo(); + else + rUndoManager.Redo(); + } + catch( const RuntimeException& ) { /* allowed to leave here */ throw; } + catch( const UndoFailedException& ) { /* allowed to leave here */ throw; } + catch( const Exception& ) + { + // not allowed to leave + const Any aError( ::cppu::getCaughtException() ); + throw UndoFailedException( ::rtl::OUString(), getXUndoManager(), aError ); + } + + // note that in opposite to all of the other methods, we do *not* have our mutex locked when calling + // into the IUndoManager implementation. This ensures that an actual XUndoAction::undo/redo is also + // called without our mutex being locked. + // As a consequence, we do not set m_bAPIActionRunning here. Instead, our actionUndone/actionRedone methods + // *always* multiplex the event to our XUndoManagerListeners, not only when m_bAPIActionRunning is FALSE (This + // again is different from all other SfxUndoListener methods). + // So, we do not need to do this notification here ourself. + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper_Impl::impl_addUndoAction( const Reference< XUndoAction >& i_action ) + { + // SYNCHRONIZED ---> + ::osl::ClearableMutexGuard aGuard( m_aMutex ); + + IUndoManager& rUndoManager = getUndoManager(); + if ( !rUndoManager.IsUndoEnabled() ) + // ignore the request if the manager is locked + return; + + const UndoManagerEvent aEventAdd( buildEvent( i_action->getTitle() ) ); + const EventObject aEventClear( getXUndoManager() ); + + const bool bHadRedoActions = ( rUndoManager.GetRedoActionCount( IUndoManager::CurrentLevel ) > 0 ); + { + ::comphelper::FlagGuard aNotificationGuard( m_bAPIActionRunning ); + rUndoManager.AddUndoAction( new UndoActionWrapper( i_action ) ); + } + const bool bHasRedoActions = ( rUndoManager.GetRedoActionCount( IUndoManager::CurrentLevel ) > 0 ); + + aGuard.clear(); + // <--- SYNCHRONIZED + + m_aUndoListeners.notifyEach( &XUndoManagerListener::undoActionAdded, aEventAdd ); + if ( bHadRedoActions && !bHasRedoActions ) + m_aUndoListeners.notifyEach( &XUndoManagerListener::redoActionsCleared , aEventClear ); + impl_notifyModified(); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper_Impl::impl_clear() + { + // SYNCHRONIZED ---> + ::osl::ClearableMutexGuard aGuard( m_aMutex ); + + IUndoManager& rUndoManager = getUndoManager(); + if ( rUndoManager.IsInListAction() ) + throw UndoContextNotClosedException( ::rtl::OUString(), getXUndoManager() ); + + { + ::comphelper::FlagGuard aNotificationGuard( m_bAPIActionRunning ); + rUndoManager.Clear(); + } + + const EventObject aEvent( getXUndoManager() ); + aGuard.clear(); + // <--- SYNCHRONIZED + + m_aUndoListeners.notifyEach( &XUndoManagerListener::allActionsCleared, aEvent ); + impl_notifyModified(); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper_Impl::impl_clearRedo() + { + // SYNCHRONIZED ---> + ::osl::ClearableMutexGuard aGuard( m_aMutex ); + + IUndoManager& rUndoManager = getUndoManager(); + if ( rUndoManager.IsInListAction() ) + throw UndoContextNotClosedException( ::rtl::OUString(), getXUndoManager() ); + + { + ::comphelper::FlagGuard aNotificationGuard( m_bAPIActionRunning ); + rUndoManager.ClearRedo(); + } + + const EventObject aEvent( getXUndoManager() ); + aGuard.clear(); + // <--- SYNCHRONIZED + + m_aUndoListeners.notifyEach( &XUndoManagerListener::redoActionsCleared, aEvent ); + impl_notifyModified(); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper_Impl::impl_reset() + { + // SYNCHRONIZED ---> + ::osl::ClearableMutexGuard aGuard( m_aMutex ); + + IUndoManager& rUndoManager = getUndoManager(); + { + ::comphelper::FlagGuard aNotificationGuard( m_bAPIActionRunning ); + rUndoManager.Reset(); + } + + const EventObject aEvent( getXUndoManager() ); + aGuard.clear(); + // <--- SYNCHRONIZED + + m_aUndoListeners.notifyEach( &XUndoManagerListener::resetAll, aEvent ); + impl_notifyModified(); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper_Impl::actionUndone( const String& i_actionComment ) + { + UndoManagerEvent aEvent; + aEvent.Source = getXUndoManager(); + aEvent.UndoActionTitle = i_actionComment; + aEvent.UndoContextDepth = 0; // Undo can happen on level 0 only + m_aUndoListeners.notifyEach( &XUndoManagerListener::actionUndone, aEvent ); + impl_notifyModified(); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper_Impl::actionRedone( const String& i_actionComment ) + { + UndoManagerEvent aEvent; + aEvent.Source = getXUndoManager(); + aEvent.UndoActionTitle = i_actionComment; + aEvent.UndoContextDepth = 0; // Redo can happen on level 0 only + m_aUndoListeners.notifyEach( &XUndoManagerListener::actionRedone, aEvent ); + impl_notifyModified(); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper_Impl::undoActionAdded( const String& i_actionComment ) + { + if ( m_bAPIActionRunning ) + return; + + notify( i_actionComment, &XUndoManagerListener::undoActionAdded ); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper_Impl::cleared() + { + if ( m_bAPIActionRunning ) + return; + + notify( &XUndoManagerListener::allActionsCleared ); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper_Impl::clearedRedo() + { + if ( m_bAPIActionRunning ) + return; + + notify( &XUndoManagerListener::redoActionsCleared ); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper_Impl::resetAll() + { + if ( m_bAPIActionRunning ) + return; + + notify( &XUndoManagerListener::resetAll ); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper_Impl::listActionEntered( const String& i_comment ) + { +#if OSL_DEBUG_LEVEL > 0 + m_aContextAPIFlags.push( m_bAPIActionRunning ); +#endif + + if ( m_bAPIActionRunning ) + return; + + notify( i_comment, &XUndoManagerListener::enteredContext ); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper_Impl::listActionLeft( const String& i_comment ) + { +#if OSL_DEBUG_LEVEL > 0 + const bool bCurrentContextIsAPIContext = m_aContextAPIFlags.top(); + m_aContextAPIFlags.pop(); + OSL_ENSURE( bCurrentContextIsAPIContext == m_bAPIActionRunning, "UndoManagerHelper_Impl::listActionLeft: API and non-API contexts interwoven!" ); +#endif + + if ( m_bAPIActionRunning ) + return; + + notify( i_comment, &XUndoManagerListener::leftContext ); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper_Impl::listActionLeftAndMerged() + { +#if OSL_DEBUG_LEVEL > 0 + const bool bCurrentContextIsAPIContext = m_aContextAPIFlags.top(); + m_aContextAPIFlags.pop(); + OSL_ENSURE( bCurrentContextIsAPIContext == m_bAPIActionRunning, "UndoManagerHelper_Impl::listActionLeftAndMerged: API and non-API contexts interwoven!" ); +#endif + + if ( m_bAPIActionRunning ) + return; + + notify( &XUndoManagerListener::leftHiddenContext ); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper_Impl::listActionCancelled() + { +#if OSL_DEBUG_LEVEL > 0 + const bool bCurrentContextIsAPIContext = m_aContextAPIFlags.top(); + m_aContextAPIFlags.pop(); + OSL_ENSURE( bCurrentContextIsAPIContext == m_bAPIActionRunning, "UndoManagerHelper_Impl::listActionCancelled: API and non-API contexts interwoven!" ); +#endif + + if ( m_bAPIActionRunning ) + return; + + notify( &XUndoManagerListener::cancelledContext ); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper_Impl::undoManagerDying() + { + // TODO: do we need to care? Or is this the responsibility of our owner? + } + + //================================================================================================================== + //= UndoManagerHelper + //================================================================================================================== + //------------------------------------------------------------------------------------------------------------------ + UndoManagerHelper::UndoManagerHelper( IUndoManagerImplementation& i_undoManagerImpl ) + :m_pImpl( new UndoManagerHelper_Impl( *this, i_undoManagerImpl ) ) + { + } + + //------------------------------------------------------------------------------------------------------------------ + UndoManagerHelper::~UndoManagerHelper() + { + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper::disposing() + { + m_pImpl->disposing(); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper::enterUndoContext( const ::rtl::OUString& i_title, IMutexGuard& i_instanceLock ) + { + m_pImpl->enterUndoContext( i_title, false, i_instanceLock ); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper::enterHiddenUndoContext( IMutexGuard& i_instanceLock ) + { + m_pImpl->enterUndoContext( ::rtl::OUString(), true, i_instanceLock ); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper::leaveUndoContext( IMutexGuard& i_instanceLock ) + { + m_pImpl->leaveUndoContext( i_instanceLock ); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper_Impl::undo( IMutexGuard& i_instanceLock ) + { + impl_processRequest( + ::boost::bind( + &UndoManagerHelper_Impl::impl_doUndoRedo, + this, + ::boost::ref( i_instanceLock ), + true + ), + i_instanceLock + ); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper_Impl::redo( IMutexGuard& i_instanceLock ) + { + impl_processRequest( + ::boost::bind( + &UndoManagerHelper_Impl::impl_doUndoRedo, + this, + ::boost::ref( i_instanceLock ), + false + ), + i_instanceLock + ); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper::addUndoAction( const Reference< XUndoAction >& i_action, IMutexGuard& i_instanceLock ) + { + m_pImpl->addUndoAction( i_action, i_instanceLock ); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper::undo( IMutexGuard& i_instanceLock ) + { + m_pImpl->undo( i_instanceLock ); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper::redo( IMutexGuard& i_instanceLock ) + { + m_pImpl->redo( i_instanceLock ); + } + + //------------------------------------------------------------------------------------------------------------------ + ::sal_Bool UndoManagerHelper::isUndoPossible() const + { + // SYNCHRONIZED ---> + ::osl::MutexGuard aGuard( m_pImpl->getMutex() ); + IUndoManager& rUndoManager = m_pImpl->getUndoManager(); + if ( rUndoManager.IsInListAction() ) + return sal_False; + return rUndoManager.GetUndoActionCount( IUndoManager::TopLevel ) > 0; + // <--- SYNCHRONIZED + } + + //------------------------------------------------------------------------------------------------------------------ + ::sal_Bool UndoManagerHelper::isRedoPossible() const + { + // SYNCHRONIZED ---> + ::osl::MutexGuard aGuard( m_pImpl->getMutex() ); + const IUndoManager& rUndoManager = m_pImpl->getUndoManager(); + if ( rUndoManager.IsInListAction() ) + return sal_False; + return rUndoManager.GetRedoActionCount( IUndoManager::TopLevel ) > 0; + // <--- SYNCHRONIZED + } + + //------------------------------------------------------------------------------------------------------------------ + namespace + { + //.............................................................................................................. + ::rtl::OUString lcl_getCurrentActionTitle( UndoManagerHelper_Impl& i_impl, const bool i_undo ) + { + // SYNCHRONIZED ---> + ::osl::MutexGuard aGuard( i_impl.getMutex() ); + + const IUndoManager& rUndoManager = i_impl.getUndoManager(); + const USHORT nActionCount = i_undo + ? rUndoManager.GetUndoActionCount( IUndoManager::TopLevel ) + : rUndoManager.GetRedoActionCount( IUndoManager::TopLevel ); + if ( nActionCount == 0 ) + throw EmptyUndoStackException( + i_undo ? ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "no action on the undo stack" ) ) + : ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "no action on the redo stack" ) ), + i_impl.getXUndoManager() + ); + return i_undo + ? rUndoManager.GetUndoActionComment( 0, IUndoManager::TopLevel ) + : rUndoManager.GetRedoActionComment( 0, IUndoManager::TopLevel ); + // <--- SYNCHRONIZED + } + + //.............................................................................................................. + Sequence< ::rtl::OUString > lcl_getAllActionTitles( UndoManagerHelper_Impl& i_impl, const bool i_undo ) + { + // SYNCHRONIZED ---> + ::osl::MutexGuard aGuard( i_impl.getMutex() ); + + const IUndoManager& rUndoManager = i_impl.getUndoManager(); + const USHORT nCount = i_undo + ? rUndoManager.GetUndoActionCount( IUndoManager::TopLevel ) + : rUndoManager.GetRedoActionCount( IUndoManager::TopLevel ); + + Sequence< ::rtl::OUString > aTitles( nCount ); + for ( USHORT i=0; i<nCount; ++i ) + { + aTitles[i] = i_undo + ? rUndoManager.GetUndoActionComment( i, IUndoManager::TopLevel ) + : rUndoManager.GetRedoActionComment( i, IUndoManager::TopLevel ); + } + return aTitles; + // <--- SYNCHRONIZED + } + } + + //------------------------------------------------------------------------------------------------------------------ + ::rtl::OUString UndoManagerHelper::getCurrentUndoActionTitle() const + { + return lcl_getCurrentActionTitle( *m_pImpl, true ); + } + + //------------------------------------------------------------------------------------------------------------------ + ::rtl::OUString UndoManagerHelper::getCurrentRedoActionTitle() const + { + return lcl_getCurrentActionTitle( *m_pImpl, false ); + } + + //------------------------------------------------------------------------------------------------------------------ + Sequence< ::rtl::OUString > UndoManagerHelper::getAllUndoActionTitles() const + { + return lcl_getAllActionTitles( *m_pImpl, true ); + } + + //------------------------------------------------------------------------------------------------------------------ + Sequence< ::rtl::OUString > UndoManagerHelper::getAllRedoActionTitles() const + { + return lcl_getAllActionTitles( *m_pImpl, false ); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper::clear( IMutexGuard& i_instanceLock ) + { + m_pImpl->clear( i_instanceLock ); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper::clearRedo( IMutexGuard& i_instanceLock ) + { + m_pImpl->clearRedo( i_instanceLock ); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper::reset( IMutexGuard& i_instanceLock ) + { + m_pImpl->reset( i_instanceLock ); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper::lock() + { + // SYNCHRONIZED ---> + ::osl::MutexGuard aGuard( m_pImpl->getMutex() ); + + IUndoManager& rUndoManager = m_pImpl->getUndoManager(); + rUndoManager.EnableUndo( false ); + // <--- SYNCHRONIZED + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper::unlock() + { + // SYNCHRONIZED ---> + ::osl::MutexGuard aGuard( m_pImpl->getMutex() ); + + IUndoManager& rUndoManager = m_pImpl->getUndoManager(); + if ( rUndoManager.IsUndoEnabled() ) + throw NotLockedException( ::rtl::OUString::createFromAscii( "Undo manager is not locked" ), m_pImpl->getXUndoManager() ); + rUndoManager.EnableUndo( true ); + // <--- SYNCHRONIZED + } + + //------------------------------------------------------------------------------------------------------------------ + ::sal_Bool UndoManagerHelper::isLocked() + { + // SYNCHRONIZED ---> + ::osl::MutexGuard aGuard( m_pImpl->getMutex() ); + + IUndoManager& rUndoManager = m_pImpl->getUndoManager(); + return !rUndoManager.IsUndoEnabled(); + // <--- SYNCHRONIZED + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper::addUndoManagerListener( const Reference< XUndoManagerListener >& i_listener ) + { + if ( i_listener.is() ) + m_pImpl->addUndoManagerListener( i_listener ); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper::removeUndoManagerListener( const Reference< XUndoManagerListener >& i_listener ) + { + if ( i_listener.is() ) + m_pImpl->removeUndoManagerListener( i_listener ); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper::addModifyListener( const Reference< XModifyListener >& i_listener ) + { + if ( i_listener.is() ) + m_pImpl->addModifyListener( i_listener ); + } + + //------------------------------------------------------------------------------------------------------------------ + void UndoManagerHelper::removeModifyListener( const Reference< XModifyListener >& i_listener ) + { + if ( i_listener.is() ) + m_pImpl->removeModifyListener( i_listener ); + } + +//...................................................................................................................... +} // namespace framework +//...................................................................................................................... diff --git a/framework/util/makefile.mk b/framework/util/makefile.mk index 698ba37d5d3d..8ea615b5b31b 100644 --- a/framework/util/makefile.mk +++ b/framework/util/makefile.mk @@ -99,7 +99,9 @@ LIB2OBJFILES= \ $(SLO)$/menuextensionsupplier.obj \ $(SLO)$/preventduplicateinteraction.obj \ $(SLO)$/framelistanalyzer.obj \ - $(SLO)$/titlehelper.obj + $(SLO)$/titlehelper.obj \ + $(SLO)$/documentundoguard.obj \ + $(SLO)$/undomanagerhelper.obj \ # --- import classes library --------------------------------------------------- @@ -157,7 +159,7 @@ SHL2STDLIBS= \ $(CPPUHELPERLIB) \ $(CPPULIB) \ $(VOSLIB) \ - $(SALLIB) + $(SALLIB) \ SHL2DEF= $(MISC)$/$(SHL2TARGET).def SHL2DEPN= $(SHL1IMPLIBN) $(SHL1TARGETN) @@ -427,6 +429,8 @@ $(MISC)$/$(SHL2TARGET).flt: makefile.mk @echo WEP>>$@ @echo m_pLoader>$@ @echo _TI2>>$@ + @echo _TI3>>$@ + @echo _TI8>>$@ @echo LIBMAIN>>$@ @echo LibMain>>$@ diff --git a/officecfg/registry/schema/org/openoffice/Office/Scripting.xcs b/officecfg/registry/schema/org/openoffice/Office/Scripting.xcs index b77cb00f8cac..90acb2a110bf 100644 --- a/officecfg/registry/schema/org/openoffice/Office/Scripting.xcs +++ b/officecfg/registry/schema/org/openoffice/Office/Scripting.xcs @@ -48,28 +48,5 @@ <desc>Lists the registered Scripting Framework runtimes.</desc> </info> </set> - <group oor:name="ScriptDisplaySettings"> - <info> - <desc> Specifies display settings for assignment dialogs </desc> - </info> - <prop oor:name="ShowBasic" oor:type="xs:boolean"> - <info> - <desc>Show Basic scripts in assignment dialogs</desc> - </info> - <value>false</value> - </prop> - <prop oor:name="ShowSF" oor:type="xs:boolean"> - <info> - <desc>Show Scripting Framework scripts in assignment dialogs</desc> - </info> - <value>true</value> - </prop> - <prop oor:name="UseNewToolsConfigure" oor:type="xs:boolean"> - <info> - <desc>Use New Tools Configure dialog</desc> - </info> - <value>true</value> - </prop> - </group> </component> </oor:component-schema> diff --git a/scripting/source/inc/util/util.hxx b/scripting/source/inc/util/util.hxx index 27e5c19ccc91..a07d66452e0d 100644 --- a/scripting/source/inc/util/util.hxx +++ b/scripting/source/inc/util/util.hxx @@ -29,21 +29,6 @@ #ifndef _COM_SUN_STAR_SCRIPTING_UTIL_UTIL_HXX_ #define _COM_SUN_STAR_SCRIPTING_UTIL_UTIL_HXX_ -#include <rtl/ustrbuf.hxx> -#include <osl/diagnose.h> - #define OUSTR(x) ::rtl::OUString( ::rtl::OUString::createFromAscii(x) ) -namespace scripting_util -{ - inline void validateXRef(::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > xRef, const sal_Char* Msg) throw (::com::sun::star::uno::RuntimeException) - { - OSL_ENSURE( xRef.is(), Msg ); - - if(!xRef.is()) - { - throw ::com::sun::star::uno::RuntimeException(OUSTR(Msg), ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >()); - } - } -} #endif //_COM_SUN_STAR_SCRIPTING_UTIL_UTIL_HXX_ diff --git a/scripting/source/protocolhandler/makefile.mk b/scripting/source/protocolhandler/makefile.mk index ec69c00b209d..5a2e92bbbac3 100644 --- a/scripting/source/protocolhandler/makefile.mk +++ b/scripting/source/protocolhandler/makefile.mk @@ -45,6 +45,7 @@ SHL1TARGET= $(TARGET)$(DLLPOSTFIX) SHL1STDLIBS= \ $(SFXLIB) \ + $(FWELIB) \ $(CPPULIB) \ $(CPPUHELPERLIB) \ $(VCLLIB) \ diff --git a/scripting/source/protocolhandler/scripthandler.cxx b/scripting/source/protocolhandler/scripthandler.cxx index 4e81426d7d53..e9d12be12b5e 100644 --- a/scripting/source/protocolhandler/scripthandler.cxx +++ b/scripting/source/protocolhandler/scripthandler.cxx @@ -49,10 +49,12 @@ #include <sfx2/frame.hxx> #include <sfx2/sfxdlg.hxx> #include <vcl/abstdlg.hxx> +#include <tools/diagnose_ex.h> #include <cppuhelper/factory.hxx> #include <cppuhelper/exc_hlp.hxx> #include <util/util.hxx> +#include <framework/documentundoguard.hxx> #include "com/sun/star/uno/XComponentContext.hpp" #include "com/sun/star/uri/XUriReference.hpp" @@ -69,7 +71,6 @@ using namespace ::com::sun::star::lang; using namespace ::com::sun::star::script; using namespace ::com::sun::star::script::provider; using namespace ::com::sun::star::document; -using namespace ::scripting_util; namespace scripting_protocolhandler { @@ -97,8 +98,7 @@ void SAL_CALL ScriptProtocolHandler::initialize( throw RuntimeException( temp, Reference< XInterface >() ); } - validateXRef( m_xFactory, - "ScriptProtocolHandler::initialize: No Service Manager available" ); + ENSURE_OR_THROW( m_xFactory.is(), "ScriptProtocolHandler::initialize: No Service Manager available" ); m_bInitialised = true; } @@ -162,7 +162,7 @@ void SAL_CALL ScriptProtocolHandler::dispatchWithNotification( { try { - bool bIsDocumentScript = ( aURL.Complete.indexOf( ::rtl::OUString::createFromAscii( "document" ) ) !=-1 ); + bool bIsDocumentScript = ( aURL.Complete.indexOfAsciiL( RTL_CONSTASCII_STRINGPARAM( "document" ) ) !=-1 ); // TODO: isn't this somewhat strange? This should be a test for a location=document parameter, shouldn't it? if ( bIsDocumentScript ) @@ -182,7 +182,7 @@ void SAL_CALL ScriptProtocolHandler::dispatchWithNotification( Reference< provider::XScript > xFunc = m_xScriptProvider->getScript( aURL.Complete ); - validateXRef( xFunc, + ENSURE_OR_THROW( xFunc.is(), "ScriptProtocolHandler::dispatchWithNotification: validate xFunc - unable to obtain XScript interface" ); @@ -207,6 +207,11 @@ void SAL_CALL ScriptProtocolHandler::dispatchWithNotification( } } + // attempt to protect the document against the script tampering with its Undo Context + ::std::auto_ptr< ::framework::DocumentUndoGuard > pUndoGuard; + if ( bIsDocumentScript ) + pUndoGuard.reset( new ::framework::DocumentUndoGuard( m_xScriptInvocation ) ); + bSuccess = sal_False; while ( !bSuccess ) { @@ -248,16 +253,6 @@ void SAL_CALL ScriptProtocolHandler::dispatchWithNotification( bCaughtException = TRUE; } -#ifdef _DEBUG - catch ( ... ) - { - ::rtl::OUString reason = ::rtl::OUString::createFromAscii( - "ScriptProtocolHandler::dispatch: caught unknown exception" ); - - invokeResult <<= reason; - } -#endif - } else { @@ -358,13 +353,11 @@ ScriptProtocolHandler::getScriptInvocation() return m_xScriptInvocation.is(); } -void -ScriptProtocolHandler::createScriptProvider() +void ScriptProtocolHandler::createScriptProvider() { if ( m_xScriptProvider.is() ) - { return; - } + try { // first, ask the component supporting the XScriptInvocationContext interface @@ -397,6 +390,7 @@ ScriptProtocolHandler::createScriptProvider() m_xScriptProvider = xSPS->getScriptProvider(); } + // if nothing of this is successful, use the master script provider if ( !m_xScriptProvider.is() ) { Reference< XPropertySet > xProps( m_xFactory, UNO_QUERY_THROW ); @@ -430,15 +424,6 @@ ScriptProtocolHandler::createScriptProvider() ::rtl::OUString temp = OUSTR( "ScriptProtocolHandler::createScriptProvider: " ); throw RuntimeException( temp.concat( e.Message ), Reference< XInterface >() ); } -#ifdef _DEBUG - catch ( ... ) - { - throw RuntimeException( - OUSTR( "ScriptProtocolHandler::createScriptProvider: UnknownException: " ), - Reference< XInterface > () ); - } -#endif - } ScriptProtocolHandler::ScriptProtocolHandler( diff --git a/scripting/source/provider/ActiveMSPList.cxx b/scripting/source/provider/ActiveMSPList.cxx index 3c6206d8d051..bbabbb21405c 100644 --- a/scripting/source/provider/ActiveMSPList.cxx +++ b/scripting/source/provider/ActiveMSPList.cxx @@ -49,7 +49,6 @@ using namespace com::sun::star; using namespace com::sun::star::uno; using namespace com::sun::star::script; -using namespace ::scripting_util; using namespace ::sf_misc; namespace func_provider diff --git a/scripting/source/provider/MasterScriptProvider.cxx b/scripting/source/provider/MasterScriptProvider.cxx index 94ea78f80c73..33d371e3d51b 100755 --- a/scripting/source/provider/MasterScriptProvider.cxx +++ b/scripting/source/provider/MasterScriptProvider.cxx @@ -33,6 +33,8 @@ #include <cppuhelper/implementationentry.hxx> #include <cppuhelper/exc_hlp.hxx> #include <cppuhelper/factory.hxx> +#include <tools/diagnose_ex.h> + #include <com/sun/star/frame/XModel.hpp> #include <com/sun/star/lang/EventObject.hpp> #include <com/sun/star/container/XContentEnumerationAccess.hpp> @@ -60,7 +62,6 @@ using namespace ::com::sun::star::uno; using namespace ::com::sun::star::script; using namespace ::com::sun::star::document; using namespace ::sf_misc; -using namespace ::scripting_util; namespace func_provider { @@ -95,10 +96,9 @@ MasterScriptProvider::MasterScriptProvider( const Reference< XComponentContext > m_xContext( xContext ), m_bIsValid( false ), m_bInitialised( false ), m_bIsPkgMSP( false ), m_pPCache( 0 ) { - validateXRef( m_xContext, "MasterScriptProvider::MasterScriptProvider: No context available\n" ); + ENSURE_OR_THROW( m_xContext.is(), "MasterScriptProvider::MasterScriptProvider: No context available\n" ); m_xMgr = m_xContext->getServiceManager(); - validateXRef( m_xMgr, - "MasterScriptProvider::MasterScriptProvider: No service manager available\n" ); + ENSURE_OR_THROW( m_xMgr.is(), "MasterScriptProvider::MasterScriptProvider: No service manager available\n" ); m_bIsValid = true; } diff --git a/scripting/source/provider/ProviderCache.cxx b/scripting/source/provider/ProviderCache.cxx index 5d3350f635e3..bea38a67a8f1 100644 --- a/scripting/source/provider/ProviderCache.cxx +++ b/scripting/source/provider/ProviderCache.cxx @@ -29,6 +29,7 @@ #include "precompiled_scripting.hxx" #include <cppuhelper/implementationentry.hxx> #include <cppuhelper/factory.hxx> +#include <tools/diagnose_ex.h> #include <util/scriptingconstants.hxx> #include <util/util.hxx> @@ -39,7 +40,6 @@ using namespace com::sun::star; using namespace com::sun::star::uno; using namespace com::sun::star::script; -using namespace ::scripting_util; namespace func_provider { @@ -51,7 +51,7 @@ ProviderCache::ProviderCache( const Reference< XComponentContext >& xContext, co // will use createContentEnumeration m_xMgr = m_xContext->getServiceManager(); - validateXRef( m_xMgr, "ProviderCache::ProviderCache() failed to obtain ServiceManager" ); + ENSURE_OR_THROW( m_xMgr.is(), "ProviderCache::ProviderCache() failed to obtain ServiceManager" ); populateCache(); } @@ -64,7 +64,7 @@ ProviderCache::ProviderCache( const Reference< XComponentContext >& xContext, co // will use createContentEnumeration m_xMgr = m_xContext->getServiceManager(); - validateXRef( m_xMgr, "ProviderCache::ProviderCache() failed to obtain ServiceManager" ); + ENSURE_OR_THROW( m_xMgr.is(), "ProviderCache::ProviderCache() failed to obtain ServiceManager" ); populateCache(); } @@ -163,14 +163,8 @@ ProviderCache::populateCache() throw ( RuntimeException ) while ( xEnum->hasMoreElements() ) { - Reference< lang::XSingleComponentFactory > factory; - if ( sal_False == ( xEnum->nextElement() >>= factory ) ) - { - throw new RuntimeException( ::rtl::OUString::createFromAscii( " error extracting XSingleComponentFactory from Content enumeration. " ), Reference< XInterface >() ); - } - validateXRef( factory, "ProviderCache::populateCache() invalid factory" ); + Reference< lang::XSingleComponentFactory > factory( xEnum->nextElement(), UNO_QUERY_THROW ); Reference< lang::XServiceInfo > xServiceInfo( factory, UNO_QUERY_THROW ); - validateXRef( xServiceInfo, "ProviderCache::populateCache() failed to get XServiceInfo from factory" ); Sequence< ::rtl::OUString > serviceNames = xServiceInfo->getSupportedServiceNames(); @@ -207,9 +201,8 @@ ProviderCache::createProvider( ProviderDetails& details ) throw ( RuntimeExcepti { try { - details.provider = Reference< provider::XScriptProvider >( + details.provider.set( details.factory->createInstanceWithArgumentsAndContext( m_Sctx, m_xContext ), UNO_QUERY_THROW ); - validateXRef( details.provider, "ProviderCache::createProvider, failed to create provider"); } catch ( RuntimeException& e ) { diff --git a/scripting/source/provider/ScriptImpl.cxx b/scripting/source/provider/ScriptImpl.cxx index f5b93a802138..08d548e3461c 100644 --- a/scripting/source/provider/ScriptImpl.cxx +++ b/scripting/source/provider/ScriptImpl.cxx @@ -46,15 +46,11 @@ ScriptImpl::ScriptImpl( const Reference< runtime::XScriptInvocation > & runtimeMgr, const ::rtl::OUString& scriptURI ) throw ( RuntimeException ) : - m_XScriptingContext( scriptingContext ), - m_RunTimeManager( runtimeMgr ), + m_XScriptingContext( scriptingContext, UNO_SET_THROW ), + m_RunTimeManager( runtimeMgr, UNO_SET_THROW ), m_ScriptURI( scriptURI ) { OSL_TRACE( "<!constucting a ScriptImpl>\n" ); - validateXRef( m_XScriptingContext, - "ScriptImpl::ScriptImpl: No XScriptingContext\n" ); - validateXRef( m_RunTimeManager, - "ScriptImpl::ScriptImpl: No XScriptInvocation\n" ); } //************************************************************************* diff --git a/scripting/source/provider/ScriptingContext.cxx b/scripting/source/provider/ScriptingContext.cxx index 08a27a19562f..0394bd3653d1 100755 --- a/scripting/source/provider/ScriptingContext.cxx +++ b/scripting/source/provider/ScriptingContext.cxx @@ -55,13 +55,10 @@ namespace func_provider //************************************************************************* ScriptingContext::ScriptingContext( const Reference< XComponentContext > & xContext ) : //ScriptingContextImpl_BASE( GetMutex()), OPropertyContainer( GetBroadcastHelper() ), - m_xContext( xContext ) + m_xContext( xContext, UNO_SET_THROW ) { OSL_TRACE( "< ScriptingContext ctor called >\n" ); - validateXRef( m_xContext, - "ScriptingContext::ScriptingContext: No context available\n" ); - Any nullAny; scripting_constants::ScriptingConstantsPool& scriptingConstantsPool = diff --git a/scripting/source/runtimemgr/ScriptNameResolverImpl.cxx b/scripting/source/runtimemgr/ScriptNameResolverImpl.cxx index 48b960c6c9aa..8dafab0e8d4c 100644 --- a/scripting/source/runtimemgr/ScriptNameResolverImpl.cxx +++ b/scripting/source/runtimemgr/ScriptNameResolverImpl.cxx @@ -70,13 +70,11 @@ static ::std::vector< sal_Int32 >* m_pSearchIDs = NULL; //************************************************************************* ScriptNameResolverImpl::ScriptNameResolverImpl( const Reference< XComponentContext > & xContext ) : - m_xContext( xContext ) + m_xContext( xContext, UNO_SET_THROW ) { OSL_TRACE( "< ScriptNameResolverImpl ctor called >\n" ); validateXRef( m_xContext, "ScriptNameResolverImpl::ScriptNameResolverImpl: invalid context" ); - m_xMultiComFac = m_xContext->getServiceManager(); - - validateXRef( m_xMultiComFac, "ScriptNameResolverImpl::ScriptNameResolverImpl: invalid XMultiComponentFactory " ); + m_xMultiComFac.set( m_xContext->getServiceManager(), UNO_SET_THROW ); if( !m_pSearchIDs ) { @@ -220,11 +218,13 @@ throw ( lang::IllegalArgumentException, script::CannotConvertException, RuntimeE OUString temp = OUSTR( "ScriptNameResolverImpl::resolve: " ); throw RuntimeException( temp.concat( e.Message ), Reference< XInterface >() ); } - Reference< XInterface > xInterface = m_xMultiComFac->createInstanceWithContext( - ::rtl::OUString::createFromAscii( - "com.sun.star.ucb.SimpleFileAccess" ), m_xContext ); - validateXRef( xInterface, - "ScriptProvider::initialise: cannot get SimpleFileAccess Service\n" ); + Reference< XInterface > xInterface( + m_xMultiComFac->createInstanceWithContext( + ::rtl::OUString::createFromAscii( "com.sun.star.ucb.SimpleFileAccess" ), + m_xContext + ), + UNO_SET_THROW + ); Reference < ucb::XSimpleFileAccess > xSimpleFileAccess = Reference < ucb::XSimpleFileAccess > ( xInterface, UNO_QUERY_THROW ); @@ -236,15 +236,8 @@ throw ( lang::IllegalArgumentException, script::CannotConvertException, RuntimeE try { // need to get the ScriptStorageManager - Any a = m_xContext->getValueByName( - scriptingConstantsPool.SCRIPTSTORAGEMANAGER_SERVICE ); - if ( sal_False == ( a >>= xScriptStorageMgr ) ) - { - OUString temp = OUSTR( "ScriptNameResolverImpl::resolve: failed to get ScriptStorageManager" ); - throw RuntimeException( temp, Reference< XInterface >() ); - // need to throw - } - validateXRef( xScriptStorageMgr, "Cannot get ScriptStorageManager" ); + xScriptStorageMgr.set( m_xContext->getValueByName( + scriptingConstantsPool.SCRIPTSTORAGEMANAGER_SERVICE ), UNO_QUERY_THROW ); filesysScriptStorageID = xScriptStorageMgr->createScriptStorageWithURI( xSimpleFileAccess, filesysURL ); @@ -364,20 +357,12 @@ throw ( lang::IllegalArgumentException, script::CannotConvertException, RuntimeE if( filesysScriptStorageID > 2 ) { // get the filesys storage and dispose of it - Reference< XInterface > xScriptStorage = - xScriptStorageMgr->getScriptStorage( filesysScriptStorageID ); - validateXRef( xScriptStorage, - "ScriptNameResolverImpl::getStorageInstance: cannot get Script Storage service" ); + Reference< XInterface > xScriptStorage( xScriptStorageMgr->getScriptStorage( filesysScriptStorageID ), UNO_SET_THROW ); Reference< storage::XScriptInfoAccess > xScriptInfoAccess = Reference< storage::XScriptInfoAccess > ( xScriptStorage, UNO_QUERY_THROW ); - validateXRef( xScriptInfoAccess, - "ScriptNameResolverImpl::resolveURIFromStorageID: cannot get XScriptInfoAccess" ); Sequence< Reference< storage::XScriptInfo > > results = xScriptInfoAccess->getAllImplementations( ); - Reference < lang::XEventListener > xEL_ScriptStorageMgr = - Reference< lang::XEventListener > - ( xScriptStorageMgr ,UNO_QUERY_THROW ); - validateXRef( xEL_ScriptStorageMgr, "ScriptNameResolverImpl::resolve: can't get ScriptStorageManager XEventListener interface when trying to dispose of filesystem storage" ); + Reference < lang::XEventListener > xEL_ScriptStorageMgr(( xScriptStorageMgr ,UNO_QUERY_THROW ); lang::EventObject event( results[ 0 ] ); xEL_ScriptStorageMgr->disposing( event ); } @@ -447,9 +432,7 @@ SAL_THROW ( ( lang::IllegalArgumentException, css::security::AccessControlExcept throw RuntimeException( temp.concat( e.Message ), Reference< XInterface >() ); } } - Reference< storage::XScriptInfoAccess > storage = getStorageInstance( sid, permissionURI ); - validateXRef( storage, - "ScriptNameResolverImpl::resolveURIFromStorageID: cannot get XScriptInfoAccess" ); + Reference< storage::XScriptInfoAccess > storage( getStorageInstance( sid, permissionURI ), UNO_SET_THROW ); Sequence< Reference< storage::XScriptInfo > > results = storage->getImplementations( scriptURI ); @@ -516,22 +499,10 @@ const ::rtl::OUString & permissionURI ) SAL_THROW ( ( RuntimeException, css::sec Reference< storage::XScriptInfoAccess > xScriptInfoAccess; try { - Reference< XInterface > xInterface; - - Any a = m_xContext->getValueByName( - OUString::createFromAscii( SCRIPTSTORAGEMANAGER_SERVICE ) ); - if ( sal_False == ( a >>= xInterface ) ) - { - throw RuntimeException( - OUSTR( "ScriptNameResolverImpl::getStorageInstance: could not obtain ScriptStorageManager singleton" ), - Reference< XInterface >() ); - } - validateXRef( xInterface, - "ScriptNameResolverImpl::getStorageInstance: cannot get Storage service" ); + Reference< XInterface > xInterface( m_xContext->getValueByName( + OUString::createFromAscii( SCRIPTSTORAGEMANAGER_SERVICE ) ), UNO_QUERY_THROW ); // check that we have permissions for this storage Reference< dcsssf::security::XScriptSecurity > xScriptSecurity( xInterface, UNO_QUERY_THROW ); - validateXRef( xScriptSecurity, - "ScriptNameResolverImpl::getStorageInstance: cannot get Script Security service" ); scripting_constants::ScriptingConstantsPool& scriptingConstantsPool = scripting_constants::ScriptingConstantsPool::instance(); // if we dealing with a document storage (ie. not user or share @@ -546,14 +517,8 @@ const ::rtl::OUString & permissionURI ) SAL_THROW ( ( RuntimeException, css::sec OSL_TRACE( "ScriptNameResolverImpl::getStorageInstance: got execute permission for ID=%d", sid ); } Reference< storage::XScriptStorageManager > xScriptStorageManager( xInterface, UNO_QUERY_THROW ); - validateXRef( xScriptStorageManager, - "ScriptNameResolverImpl::getStorageInstance: cannot get Script Storage Manager service" ); - Reference< XInterface > xScriptStorage = - xScriptStorageManager->getScriptStorage( sid ); - validateXRef( xScriptStorage, - "ScriptNameResolverImpl::getStorageInstance: cannot get Script Storage service" ); - xScriptInfoAccess = Reference< - storage::XScriptInfoAccess > ( xScriptStorage, UNO_QUERY_THROW ); + Reference< XInterface > xScriptStorage( ScriptStorageManager->getScriptStorage( sid ), UNO_SET_THROW ); + xScriptInfoAccess.set( xScriptStorage, UNO_QUERY_THROW ); } catch ( lang::IllegalArgumentException & e ) { diff --git a/scripting/source/runtimemgr/ScriptRuntimeManager.cxx b/scripting/source/runtimemgr/ScriptRuntimeManager.cxx index 4780d58acc88..79a44bebce7d 100755 --- a/scripting/source/runtimemgr/ScriptRuntimeManager.cxx +++ b/scripting/source/runtimemgr/ScriptRuntimeManager.cxx @@ -37,6 +37,7 @@ #include <util/scriptingconstants.hxx> #include <cppuhelper/implementationentry.hxx> +#include <tools/diagnose_ex.h> #include <com/sun/star/beans/XPropertySet.hpp> #include <com/sun/star/lang/XEventListener.hpp> @@ -68,14 +69,10 @@ static Sequence< OUString > s_serviceNames = Sequence< OUString >( &s_serviceNam // ScriptRuntimeManager Constructor ScriptRuntimeManager::ScriptRuntimeManager( const Reference< XComponentContext > & xContext ) : - m_xContext( xContext ) + m_xContext( xContext, UNO_SET_THROW ) { OSL_TRACE( "< ScriptRuntimeManager ctor called >\n" ); - validateXRef( m_xContext, - "ScriptRuntimeManager::ScriptRuntimeManager: invalid context" ); - m_xMgr = m_xContext->getServiceManager(); - validateXRef( m_xMgr, - "ScriptRuntimeManager::ScriptRuntimeManager: cannot get ServiceManager" ); + m_xMgr.set( m_xContext->getServiceManager(), UNO_SET_THROW ); s_moduleCount.modCnt.acquire( &s_moduleCount.modCnt ); // test //scripting_securitymgr::ScriptSecurityManager ssm(xContext); @@ -106,22 +103,12 @@ throw( RuntimeException ) Reference< storage::XScriptInfo > sinfo = Reference< storage::XScriptInfo >( scriptInfo, UNO_QUERY_THROW ); - OUStringBuffer *buf = new OUStringBuffer(80); - buf->appendAscii("/singletons/drafts.com.sun.star.script.framework.runtime.theScriptRuntimeFor"); - buf->append(sinfo->getLanguage()); + OUStringBuffer* buf( 80 ); + buf.appendAscii("/singletons/drafts.com.sun.star.script.framework.runtime.theScriptRuntimeFor"); + buf.append(sinfo->getLanguage()); - Any a = m_xContext->getValueByName(buf->makeStringAndClear()); - - if ( sal_False == ( a >>= xInterface ) ) - { - throw RuntimeException( - sinfo->getLanguage().concat( OUSTR( " runtime support is not installed for this language" ) ), - Reference< XInterface >() ); - } - validateXRef( xInterface, - "ScriptRuntimeManager::GetScriptRuntime: cannot get appropriate ScriptRuntime Service" - ); - xScriptInvocation = Reference< runtime::XScriptInvocation >( xInterface, UNO_QUERY_THROW ); + xInterface.set( m_xContext->getValueByName( buf.makeStringAndClear() ), UNO_QUERY_THROW ); + xScriptInvocation.set( xInterface, UNO_QUERY_THROW ); } catch ( Exception & e ) { @@ -143,13 +130,14 @@ throw( RuntimeException ) try { - Reference< XInterface > xInterface = m_xMgr->createInstanceWithContext( - OUString::createFromAscii( - "drafts.com.sun.star.script.framework.runtime.DefaultScriptNameResolver" ), - m_xContext ); - validateXRef( xInterface, - "ScriptRuntimeManager::GetScriptRuntime: cannot get instance of DefaultScriptNameResolver" ); - xScriptNameResolver = Reference< runtime::XScriptNameResolver >( xInterface, UNO_QUERY_THROW ); + Reference< XInterface > xInterface( + m_xMgr->createInstanceWithContext( + OUString::createFromAscii("drafts.com.sun.star.script.framework.runtime.DefaultScriptNameResolver" ), + m_xContext + ), + UNO_SET_THROW + ); + xScriptNameResolver.set( xInterface, UNO_QUERY_THROW ); } catch ( Exception & e ) { @@ -182,9 +170,8 @@ Any SAL_CALL ScriptRuntimeManager::invoke( try { - Reference< storage::XScriptInfo > resolvedScript = resolve( scriptURI, - resolvedCtx ); - validateXRef( resolvedScript, "ScriptRuntimeManager::invoke: No resolvedURI" ); + Reference< storage::XScriptInfo > resolvedScript = resolve( scriptURI, resolvedCtx ); + ENSURE_OR_THROW( resolvedScript.is(), "ScriptRuntimeManager::invoke: No resolvedURI" ); Reference< beans::XPropertySet > xPropSetResolvedCtx; if ( sal_False == ( resolvedCtx >>= xPropSetResolvedCtx ) ) @@ -216,7 +203,7 @@ Any SAL_CALL ScriptRuntimeManager::invoke( Reference< runtime::XScriptInvocation > xScriptInvocation = getScriptRuntime( resolvedScript ); - validateXRef( xScriptInvocation, + ENSURE_OR_THROW( xScriptInvocation.is(), "ScriptRuntimeManager::invoke: cannot get instance of language specific runtime." ); // the scriptURI is currently passed to the language-dept runtime but @@ -232,13 +219,7 @@ Any SAL_CALL ScriptRuntimeManager::invoke( { Any a = m_xContext->getValueByName( scriptingConstantsPool.SCRIPTSTORAGEMANAGER_SERVICE ); - Reference < lang::XEventListener > xEL_ScriptStorageManager; - if ( sal_False == ( a >>= xEL_ScriptStorageManager ) ) - { - throw RuntimeException( OUSTR( "ScriptRuntimeManager::invoke: can't get ScriptStorageManager XEventListener interface when trying to dispose of filesystem storage" ), - Reference< XInterface > () ); - } - validateXRef( xEL_ScriptStorageManager, "Cannot get XEventListener from ScriptStorageManager" ); + Reference < lang::XEventListener > xEL_ScriptStorageManager( a, UNO_QUERY_THROW ); lang::EventObject event(resolvedScript); xEL_ScriptStorageManager->disposing( event ); } @@ -310,7 +291,7 @@ throw( lang::IllegalArgumentException, script::CannotConvertException, RuntimeEx Reference< storage::XScriptInfo > resolvedURI; Reference< runtime::XScriptNameResolver > xScriptNameResolver = getScriptNameResolver(); - validateXRef( xScriptNameResolver, + ENSURE_OR_THROW( xScriptNameResolver.is(), "ScriptRuntimeManager::resolve: No ScriptNameResolver" ); try diff --git a/scripting/source/runtimemgr/StorageBridge.cxx b/scripting/source/runtimemgr/StorageBridge.cxx index d1915afba9e5..1e15cf808870 100644 --- a/scripting/source/runtimemgr/StorageBridge.cxx +++ b/scripting/source/runtimemgr/StorageBridge.cxx @@ -54,9 +54,8 @@ const int STORAGEPROXY = 0; //************************************************************************* // StorageBridge Constructor StorageBridge::StorageBridge( const Reference< XComponentContext >& xContext, - sal_Int32 sid ) : m_xContext( xContext ), m_sid( sid ) + sal_Int32 sid ) : m_xContext( xContext, UNO_SET_THROW ), m_sid( sid ) { - validateXRef( m_xContext, "StorageBridge::StorageBridge: invalid context" ); try { initStorage(); @@ -74,31 +73,12 @@ StorageBridge::initStorage() throw ( ::com::sun::star::uno::RuntimeException ) { try { - Reference< lang::XMultiComponentFactory > xMultiComFac = - m_xContext->getServiceManager(); - validateXRef( xMultiComFac, - "StorageBridge::StorageBridge: cannot get multicomponentfactory from multiservice factory" ); - Reference< XInterface > temp; - - Any a = m_xContext->getValueByName( - OUString::createFromAscii( SCRIPTSTORAGEMANAGER_SERVICE ) ); - if ( sal_False == ( a >>= temp ) ) - { - throw RuntimeException( - OUSTR( "StorageBridge::StorageBridge: could not obtain ScriptStorageManager singleton" ), - Reference< XInterface >() ); - } - validateXRef( temp, - "StorageBridge::StorageBridge: cannot get Storage service" ); + Reference< lang::XMultiComponentFactory > xMultiComFac( m_xContext->getServiceManager(), UNO_SET_THROW ); + Reference< XInterface > temp( m_xContext->getValueByName( + OUString::createFromAscii( SCRIPTSTORAGEMANAGER_SERVICE ) ), UNO_QUERY_THROW ); Reference< storage::XScriptStorageManager > xScriptStorageManager( temp, UNO_QUERY_THROW ); - validateXRef( xScriptStorageManager, - "StorageBridge::StorageBridge: cannot get Script Storage Manager service" ); - Reference< XInterface > xScriptStorage = - xScriptStorageManager->getScriptStorage( m_sid ); - validateXRef( xScriptStorage, - "StorageBridge::StorageBridge: cannot get Script Storage service" ); - m_xScriptInfoAccess = - Reference< storage::XScriptInfoAccess > ( xScriptStorage, UNO_QUERY_THROW ); + Reference< XInterface > xScriptStorage( xScriptStorageManager->getScriptStorage( m_sid ), UNO_SET_THROW ); + m_xScriptInfoAccess.set( xScriptStorage, UNO_QUERY_THROW ); } catch ( RuntimeException & re ) { diff --git a/scripting/source/storage/ScriptMetadataImporter.cxx b/scripting/source/storage/ScriptMetadataImporter.cxx index 64dd87b2546b..96faf6e9c1f4 100644 --- a/scripting/source/storage/ScriptMetadataImporter.cxx +++ b/scripting/source/storage/ScriptMetadataImporter.cxx @@ -38,7 +38,7 @@ #include <com/sun/star/xml/sax/XParser.hpp> #include <rtl/string.h> - +#include <tools/diagnose_ex.h> #include <util/util.hxx> @@ -82,31 +82,14 @@ void ScriptMetadataImporter::parseMetaData( ms_parcelURI = parcelURI; //Get the parser service - validateXRef( m_xContext, + ENSURE_OR_THROW( m_xContext.is(), "ScriptMetadataImporter::parseMetaData: No context available" ); - Reference< lang::XMultiComponentFactory > xMgr = - m_xContext->getServiceManager(); - - validateXRef( xMgr, - "ScriptMetadataImporter::parseMetaData: No service manager available" ); - - Reference< XInterface > xInterface = xMgr->createInstanceWithContext( - OUString::createFromAscii( "com.sun.star.xml.sax.Parser" ), m_xContext ); + Reference< lang::XMultiComponentFactory > xMgr( m_xContext->getServiceManager(), UNO_SET_THROW ); - validateXRef( xInterface, "ScriptMetadataImporter::parseMetaData: cannot get SAX Parser" ); - Reference< xml::sax::XParser > xParser; - try - { - xParser.set( xInterface ,UNO_QUERY_THROW ); - } - catch (RuntimeException & re ) - { - OUString msg = OUString::createFromAscii( - "ScriptMetadata:Importer::parserMetaData cannot get XParser" ); - msg.concat( re.Message ); - throw RuntimeException( msg, Reference< XInterface > () ); - } + Reference< xml::sax::XParser > xParser( + xMgr->createInstanceWithContext( OUString::createFromAscii( "com.sun.star.xml.sax.Parser" ), m_xContext ), + UNO_QUERY_THROW ); // xxx todo: error handler, entity resolver omitted // This class is the document handler for the parser diff --git a/scripting/source/storage/ScriptSecurityManager.cxx b/scripting/source/storage/ScriptSecurityManager.cxx index 3fde4e466974..fbe6f41b4663 100755 --- a/scripting/source/storage/ScriptSecurityManager.cxx +++ b/scripting/source/storage/ScriptSecurityManager.cxx @@ -47,7 +47,7 @@ #include "ScriptSecurityManager.hxx" #include <util/util.hxx> #include <util/scriptingconstants.hxx> - +#include <tools/diagnose_ex.h> using namespace ::rtl; using namespace ::osl; @@ -85,28 +85,15 @@ static const int ADD_TO_PATH = 2; // ScriptSecurityManager Constructor ScriptSecurityManager::ScriptSecurityManager( const Reference< XComponentContext > & xContext ) throw ( RuntimeException ) - : m_xContext( xContext) + : m_xContext( xContext, UNO_SET_THROW ) { OSL_TRACE( "< ScriptSecurityManager ctor called >\n" ); - validateXRef( m_xContext, - "ScriptSecurityManager::ScriptSecurityManager: invalid context" ); // get the service manager from the context - Reference< lang::XMultiComponentFactory > xMgr = m_xContext->getServiceManager(); - validateXRef( xMgr, - "ScriptSecurityManager::ScriptSecurityManager: cannot get ServiceManager" ); + Reference< lang::XMultiComponentFactory > xMgr( m_xContext->getServiceManager(), UNO_SET_THROW ); // create an instance of the ConfigurationProvider - Reference< XInterface > xInterface = xMgr->createInstanceWithContext( - s_configProv, m_xContext ); - validateXRef( xInterface, - "ScriptSecurityManager::ScriptSecurityManager: cannot get ConfigurationProvider" ); - // create an instance of the ConfigurationAccess for accessing the - // scripting security settings - m_xConfigProvFactory = Reference < lang::XMultiServiceFactory > ( xInterface, UNO_QUERY ); - validateXRef( m_xConfigProvFactory, - "ScriptSecurityManager::ScriptSecurityManager: cannot get XMultiServiceFactory interface from ConfigurationProvider" ); - + m_xConfigProvFactory.set( xMgr->createInstanceWithContext( s_configProv, m_xContext ), UNO_QUERY_THROW ); } void ScriptSecurityManager::addScriptStorage( rtl::OUString scriptStorageURL, @@ -131,35 +118,6 @@ throw ( RuntimeException ) //need to check if storage has any scripts try { - /* need to replace this with something better, now logical names are - * gone - - Reference< XInterface > xInterface; - Any a = m_xContext->getValueByName( - OUString::createFromAscii( SCRIPTSTORAGEMANAGER_SERVICE ) ); - if ( sal_False == ( a >>= xInterface ) ) - { - throw RuntimeException( - OUSTR( "ScriptSecurityManager::addScriptStorage: could not obtain ScriptStorageManager singleton" ), - Reference< XInterface >() ); - } - validateXRef( xInterface, - "ScriptSecurityManager::addScriptStorage: cannot get Storage service" ); - Reference< storage::XScriptStorageManager > xScriptStorageManager( - xInterface, UNO_QUERY_THROW ); - Reference< XInterface > xScriptStorage = - xScriptStorageManager->getScriptStorage( storageID ); - validateXRef( xScriptStorage, - "ScriptNameResolverImpl::getStorageInstance: cannot get Script Storage service" ); - Reference< storage::XScriptInfoAccess > xScriptInfoAccess = - Reference< storage::XScriptInfoAccess > ( xScriptStorage, - UNO_QUERY_THROW ); - Sequence< ::rtl::OUString > logicalNames = xScriptInfoAccess->getScriptLogicalNames(); - if( !logicalNames.getLength() ) // we have no logical names - { - return; - } */ - // we have some scripts so read config & decide on that basis // Setup flags: m_runMacroSetting, m_warning, m_confirmationRequired, readConfiguration(); @@ -317,17 +275,12 @@ throw ( RuntimeException ) short result; try { - Reference< lang::XMultiComponentFactory > xMgr = m_xContext->getServiceManager(); - validateXRef( xMgr, - "ScriptSecurityManager::executeDialog: cannot get ServiceManager" ); - Reference< XInterface > xInterface = - xMgr->createInstanceWithArgumentsAndContext( s_securityDialog, - aArgs, m_xContext ); - validateXRef( xInterface, "ScriptSecurityManager::executeDialog: Can't create SecurityDialog" ); - Reference< awt::XDialog > xDialog( xInterface, UNO_QUERY_THROW ); + Reference< lang::XMultiComponentFactory > xMgr( m_xContext->getServiceManager(), UNO_SET_THROW ); + Reference< awt::XDialog > xDialog( + xMgr->createInstanceWithArgumentsAndContext( s_securityDialog, aArgs, m_xContext ), + UNO_QUERY_THROW ); result = xDialog->execute(); - Reference< lang::XComponent > xComponent( xInterface, UNO_QUERY_THROW ); - validateXRef( xInterface, "ScriptSecurityManager::executeDialog: Can't get XComponent to dispose dialog" ); + Reference< lang::XComponent > xComponent( xDialog, UNO_QUERY_THROW ); xComponent->dispose(); } catch ( RuntimeException & rte ) @@ -410,31 +363,20 @@ void ScriptSecurityManager::removePermissionSettings ( ::rtl::OUString & scriptS void ScriptSecurityManager::readConfiguration() throw ( RuntimeException) { - Reference< XInterface > xInterface; try { - beans::PropertyValue configPath; - configPath.Name = ::rtl::OUString::createFromAscii( "nodepath" ); - configPath.Value <<= ::rtl::OUString::createFromAscii( "org.openoffice.Office.Common/Security/Scripting" ); - Sequence < Any > aargs( 1 ); - aargs[ 0 ] <<= configPath; - validateXRef( m_xConfigProvFactory, - "ScriptSecurityManager::readConfiguration: ConfigProviderFactory no longer valid!" ); - xInterface = m_xConfigProvFactory->createInstanceWithArguments( s_configAccess, - aargs ); - validateXRef( xInterface, - "ScriptSecurityManager::readConfiguration: cannot get ConfigurationAccess" ); - // get the XPropertySet interface from the ConfigurationAccess service - Reference < beans::XPropertySet > xPropSet( xInterface, UNO_QUERY ); - Any value; - - value=xPropSet->getPropertyValue( OUSTR( "Confirmation" ) ); - if ( sal_False == ( value >>= m_confirmationRequired ) ) - { - throw RuntimeException( - OUSTR( "ScriptSecurityManager:readConfiguration: can't get Confirmation setting" ), - Reference< XInterface > () ); - } + beans::PropertyValue configPath; + configPath.Name = ::rtl::OUString::createFromAscii( "nodepath" ); + configPath.Value <<= ::rtl::OUString::createFromAscii( "org.openoffice.Office.Common/Security/Scripting" ); + Sequence < Any > aargs( 1 ); + aargs[ 0 ] <<= configPath; + ENSURE_OR_THROW( m_xConfigProvFactory.is(), + "ScriptSecurityManager::readConfiguration: ConfigProviderFactory no longer valid!" ); + // get the XPropertySet interface from the ConfigurationAccess service + Reference < beans::XPropertySet > xPropSet( m_xConfigProvFactory->createInstanceWithArguments( s_configAccess, aargs ), UNO_QUERY_THROW ); + + m_confirmationRequired = sal_True; + OSL_VERIFY( xPropSet->getPropertyValue( OUSTR( "Confirmation" ) ) >>= m_confirmationRequired ); if ( m_confirmationRequired == sal_True ) { OSL_TRACE( "ScriptSecurityManager:readConfiguration: confirmation is true" ); @@ -443,13 +385,10 @@ void ScriptSecurityManager::readConfiguration() { OSL_TRACE( "ScriptSecurityManager:readConfiguration: confirmation is false" ); } - value=xPropSet->getPropertyValue( OUSTR( "Warning" ) ); - if ( sal_False == ( value >>= m_warning ) ) - { - throw RuntimeException( - OUSTR( "ScriptSecurityManager:readConfiguration: can't get Warning setting" ), - Reference< XInterface > () ); - } + + m_warning = true; + OSL_VERIFY( xPropSet->getPropertyValue( OUSTR( "Warning" ) ) >>= m_warning ); + if ( m_warning == sal_True ) { OSL_TRACE( "ScriptSecurityManager:readConfiguration: warning is true" ); @@ -458,21 +397,13 @@ void ScriptSecurityManager::readConfiguration() { OSL_TRACE( "ScriptSecurityManager:readConfiguration: warning is false" ); } - value=xPropSet->getPropertyValue( OUSTR( "OfficeBasic" ) ); - if ( sal_False == ( value >>= m_runMacroSetting ) ) - { - throw RuntimeException( - OUSTR( "ScriptSecurityManager:readConfiguration: can't get OfficeBasic setting" ), - Reference< XInterface > () ); - } + + m_runMacroSetting = sal_True; + OSL_VERIFY( xPropSet->getPropertyValue( OUSTR( "OfficeBasic" ) ) >>= m_runMacroSetting ); OSL_TRACE( "ScriptSecurityManager:readConfiguration: OfficeBasic = %d", m_runMacroSetting ); - value=xPropSet->getPropertyValue( OUSTR( "SecureURL" ) ); - if ( sal_False == ( value >>= m_secureURL ) ) - { - throw RuntimeException( - OUSTR( "ScriptSecurityManager:readConfiguration: can't get SecureURL setting" ), - Reference< XInterface > () ); - } + + m_secureURL = ::rtl::OUString(); + OSL_VERIFY( xPropSet->getPropertyValue( OUSTR( "SecureURL" ) ) >>= m_secureURL ); } catch ( beans::UnknownPropertyException & upe ) { @@ -508,18 +439,14 @@ void ScriptSecurityManager::readConfiguration() int length = m_secureURL.getLength(); // PathSubstitution needed to interpret variables found in config - Reference< lang::XMultiComponentFactory > xMgr = m_xContext->getServiceManager(); - validateXRef( xMgr, - "ScriptSecurityManager::readConfiguration: cannot get XMultiComponentFactory" ); - xInterface = xMgr->createInstanceWithContext( - ::rtl::OUString::createFromAscii( - "com.sun.star.util.PathSubstitution"), m_xContext); - validateXRef( xInterface, - "ScriptSecurityManager::readConfiguration: cannot get ConfigurationProvider" ); + Reference< lang::XMultiComponentFactory > xMgr( m_xContext->getServiceManager(), UNO_SET_THROW ); + Reference< XInterface > xInterface = ); Reference< util::XStringSubstitution > xStringSubstitution( - xInterface, UNO_QUERY); - validateXRef( xStringSubstitution, - "ScriptSecurityManager::readConfiguration: cannot get ConfigurationProvider" ); + xMgr->createInstanceWithContext( + ::rtl::OUString::createFromAscii( "com.sun.star.util.PathSubstitution" ), m_xContext + ), + UNO_QUERY_THROW + ); for( int i = 0; i < length; i++ ) { OSL_TRACE( "ScriptSecurityManager:readConfiguration path = %s", @@ -552,16 +479,9 @@ throw ( RuntimeException ) configPath.Value <<= ::rtl::OUString::createFromAscii( "org.openoffice.Office.Common/Security/Scripting" ); Sequence < Any > aargs( 1 ); aargs[ 0 ] <<= configPath; - Reference< XInterface > xInterface = m_xConfigProvFactory->createInstanceWithArguments( s_configUpdate, - aargs ); - validateXRef( xInterface, - "ScriptSecurityManager::addToSecurePaths: ScriptSecurityManager: cannot get ConfigurationUpdateAccess" ); - Reference < container::XNameReplace > xNameReplace( xInterface, UNO_QUERY ); - validateXRef( xNameReplace, - "ScriptSecurityManager::addToSecurePaths: ScriptSecurityManager: cannot get XNameReplace" ); - Reference < util::XChangesBatch > xChangesBatch( xInterface, UNO_QUERY ); - validateXRef( xChangesBatch, - "ScriptSecurityManager::addToSecurePaths: cannot get XChangesBatch" ); + Reference < container::XNameReplace > xNameReplace( + m_xConfigProvFactory->createInstanceWithArguments( s_configUpdate, aargs ), UNO_QUERY_THROW ); + Reference < util::XChangesBatch > xChangesBatch( xNameReplace, UNO_QUERY_THROW ); OSL_TRACE( "--->ScriptSecurityManager::addToSecurePaths: after if stuff" ); Reference < beans::XPropertySet > xPropSet( xInterface, UNO_QUERY ); diff --git a/scripting/source/storage/ScriptStorage.cxx b/scripting/source/storage/ScriptStorage.cxx index 7315e9d35dd5..e4ea5f231f47 100644 --- a/scripting/source/storage/ScriptStorage.cxx +++ b/scripting/source/storage/ScriptStorage.cxx @@ -84,16 +84,11 @@ const sal_uInt16 NUMBER_STORAGE_INITIALIZE_ARGS = 3; ScriptStorage::ScriptStorage( const Reference < XComponentContext > & xContext ) throw ( RuntimeException ) - : m_xContext( xContext ), m_bInitialised( false ) + : m_xContext( xContext, UNO_SET_THROW ), m_bInitialised( false ) { OSL_TRACE( "< ScriptStorage ctor called >\n" ); - validateXRef( m_xContext, - "ScriptStorage::ScriptStorage : cannot get component context" ); - - m_xMgr = m_xContext->getServiceManager(); - validateXRef( m_xMgr, - "ScriptStorage::ScriptStorage : cannot get service manager" ); + m_xMgr.set( m_xContext->getServiceManager(), UNO_SET_THROW ); if( !mh_scriptLangs ) { @@ -101,47 +96,30 @@ throw ( RuntimeException ) if( !mh_scriptLangs ) { mh_scriptLangs = new ScriptLanguages_hash(); - Reference< XInterface > xInterface = - m_xMgr->createInstanceWithContext( - OUString::createFromAscii( - "com.sun.star.configuration.ConfigurationProvider" ) - , m_xContext ); - validateXRef( xInterface, - "ScriptStorage::ScriptStorage: cannot get ConfigurationProvider" ); + Reference< lang::XMultiServiceFactory > xConfigProvFactory( + m_xMgr->createInstanceWithContext( OUString::createFromAscii( "com.sun.star.configuration.ConfigurationProvider" ), m_xContext ), + UNO_QUERY_THROW ); // create an instance of the ConfigurationAccess for accessing the // scripting runtime settings - Reference< lang::XMultiServiceFactory > xConfigProvFactory = - Reference < lang::XMultiServiceFactory > - ( xInterface, UNO_QUERY_THROW ); - validateXRef( xConfigProvFactory, - "ScriptStorage::ScriptStorage: cannot get XMultiServiceFactory interface from ConfigurationProvider" ); beans::PropertyValue configPath; configPath.Name = ::rtl::OUString::createFromAscii( "nodepath" ); configPath.Value <<= ::rtl::OUString::createFromAscii( "org.openoffice.Office.Scripting/ScriptRuntimes" ); Sequence < Any > aargs( 1 ); aargs[ 0 ] <<= configPath; - xInterface = xConfigProvFactory->createInstanceWithArguments( - OUString::createFromAscii( - "com.sun.star.configuration.ConfigurationAccess"), - aargs ); - validateXRef( xInterface, - "ScriptStorage::ScriptStorage: cannot get ConfigurationAccess" ); - Reference< container::XNameAccess > xNameAccess = - Reference < container::XNameAccess > ( xInterface, - UNO_QUERY_THROW ); - validateXRef( xNameAccess, - "ScriptStorage::ScriptStorage: cannot get ConfigurationAccess" ); + Reference< container::XNameAccess > xNameAccess( + xConfigProvFactory->createInstanceWithArguments( + OUString::createFromAscii( "com.sun.star.configuration.ConfigurationAccess" ), + aargs + ), + UNO_QUERY_THROW ); + Sequence< OUString > names = xNameAccess->getElementNames(); for( int i = 0 ; i < names.getLength() ; i++ ) { OSL_TRACE( "Getting propertyset for Lang=%s", ::rtl::OUStringToOString( names[i], RTL_TEXTENCODING_ASCII_US ).pData->buffer ); - Reference< beans::XPropertySet > xPropSet = - Reference< beans::XPropertySet >( xNameAccess->getByName(names[i]), - UNO_QUERY_THROW ); - validateXRef( xPropSet, - "ScriptStorage::ScriptStorage: cannot get XPropertySet for name" ); + Reference< beans::XPropertySet > xPropSet( xNameAccess->getByName( names[i] ), UNO_QUERY_THROW ); Any aProp = xPropSet->getPropertyValue( OUString::createFromAscii( "SupportedFileExtensions") ); Sequence< OUString > extns; @@ -285,9 +263,7 @@ throw ( RuntimeException, Exception ) OUString xStringUri(m_stringUri); ScriptMetadataImporter* SMI = new ScriptMetadataImporter( m_xContext ); - Reference< xml::sax::XExtendedDocumentHandler > xSMI( SMI ); - - validateXRef( xSMI, "ScriptStorage::create: failed to obtain valid XExtendedDocumentHandler" ); + Reference< xml::sax::XExtendedDocumentHandler > xSMI( SMI, UNO_SET_THROW ); xStringUri = xStringUri.concat( ::rtl::OUString::createFromAscii( SCRIPT_DIR ) ); @@ -587,15 +563,14 @@ throw ( RuntimeException ) "/parcel.xml" ) ), RTL_TEXTENCODING_ASCII_US ).pData->buffer ); - Reference< XInterface > xInterface = + xHandler.set( m_xMgr->createInstanceWithContext( - OUString::createFromAscii( "com.sun.star.xml.sax.Writer" ), - m_xContext ); - validateXRef( xInterface, "ScriptStorage::save: cannot get sax.Writer" ); - xHandler = Reference<xml::sax::XExtendedDocumentHandler>( - xInterface, UNO_QUERY_THROW ); - xSource = Reference< io::XActiveDataSource >( - xHandler, UNO_QUERY_THROW ); + OUString::createFromAscii( "com.sun.star.xml.sax.Writer" ), + m_xContext + ), + UNO_QUERY_THROW + ); + xSource.set( xHandler, UNO_QUERY_THROW ); xSource->setOutputStream( xOS ); writeMetadataHeader( xHandler ); diff --git a/scripting/source/storage/ScriptStorageManager.cxx b/scripting/source/storage/ScriptStorageManager.cxx index 77ca5a45dd15..424f2752bc47 100644 --- a/scripting/source/storage/ScriptStorageManager.cxx +++ b/scripting/source/storage/ScriptStorageManager.cxx @@ -45,6 +45,7 @@ #include "ScriptStorageManager.hxx" #include <util/util.hxx> #include <util/scriptingconstants.hxx> +#include <tools/diagnose_ex.h> using namespace ::rtl; using namespace ::com::sun::star; @@ -70,32 +71,19 @@ static Sequence< OUString > s_serviceNames = Sequence< OUString >( &s_serviceNam // ScriptStorageManager Constructor ScriptStorageManager::ScriptStorageManager( const Reference< XComponentContext > & xContext ) SAL_THROW ( ( RuntimeException ) ) - : m_xContext( xContext ), m_count( 0 ), m_securityMgr( xContext ) + : m_xContext( xContext, UNO_SET_THROW ), m_count( 0 ), m_securityMgr( xContext ) { OSL_TRACE( "< ScriptStorageManager ctor called >\n" ); //s_moduleCount.modCnt.acquire( &s_moduleCount.modCnt ); - validateXRef( m_xContext, - "ScriptStorageManager::ScriptStorageManager : cannot get component context" ); - - m_xMgr = m_xContext->getServiceManager(); - validateXRef( m_xMgr, - "ScriptStorageManager::ScriptStorageManager : cannot get service manager" ); + m_xMgr.set( m_xContext->getServiceManager(), UNO_SET_THROW ); try { // obtain the macro expander singleton to use in determining the // location of the application script storage - Any aAny = m_xContext->getValueByName( OUString::createFromAscii( - "/singletons/com.sun.star.util.theMacroExpander" ) ); - Reference< util::XMacroExpander > xME; - if ( sal_False == ( aAny >>= xME ) ) - { - throw RuntimeException( - OUSTR( "ScriptStorageManager::ScriptStorageManager: can't get XMacroExpander" ), - Reference< XInterface >() ); - } - validateXRef( xME, "ScriptStorageManager constructor: can't get MacroExpander" ); + Reference< util::XMacroExpander > xME( m_xContext->getValueByName( OUString::createFromAscii( + "/singletons/com.sun.star.util.theMacroExpander" ) ), UNO_QUERY_THROW ); OUString base = OUString::createFromAscii( SAL_CONFIGFILE( "${$BRAND_BASE_DIR/program/bootstrap" ) ); @@ -126,12 +114,13 @@ SAL_THROW ( ( RuntimeException ) ) { try { - Reference< XInterface > xInterface = + Reference< ucb::XSimpleFileAccess > xSFA( m_xMgr->createInstanceWithContext( - OUString::createFromAscii( "com.sun.star.ucb.SimpleFileAccess" ), m_xContext ); - validateXRef( xInterface, - "ScriptStorageManager constructor: can't get SimpleFileAccess XInterface" ); - Reference< ucb::XSimpleFileAccess > xSFA( xInterface, UNO_QUERY_THROW ); + OUString::createFromAscii( "com.sun.star.ucb.SimpleFileAccess" ), + m_xContext + ), + UNO_QUERY_THROW + ); setupAnyStorage( xSFA, xME->expandMacros( storageStr ), appStr ); } @@ -168,13 +157,14 @@ SAL_THROW ( ( RuntimeException ) ) ::rtl::OUStringToOString( storageStr, RTL_TEXTENCODING_ASCII_US ).pData->buffer ); - Reference< XInterface > xInterface = + Reference< XInterface > xInterface( m_xMgr->createInstanceWithArgumentsAndContext( - OUString::createFromAscii( - "drafts.com.sun.star.script.framework.storage.ScriptStorage" ), - aArgs, m_xContext ); - - validateXRef( xInterface, "ScriptStorageManager:: setupAnyStorage: Can't create ScriptStorage for share" ); + OUString::createFromAscii( "drafts.com.sun.star.script.framework.storage.ScriptStorage" ), + aArgs, + m_xContext + ), + UNO_QUERY_THROW + ); // and place it in the hash_map. Increment the counter m_ScriptStorageMap[ m_count++ ] = xInterface; @@ -215,8 +205,7 @@ ScriptStorageManager::createScriptStorage( throw ( RuntimeException ) { OSL_TRACE( "** ==> ScriptStorageManager in createScriptingStorage\n" ); - validateXRef( xSFA, - "ScriptStorageManager::createScriptStorage: XSimpleFileAccess is not valid" ); + ENSURE_OR_THROW( xSFA.is(), "ScriptStorageManager::createScriptStorage: XSimpleFileAccess is not valid" ); return setupAnyStorage( xSFA, ::rtl::OUString::createFromAscii( "" ), ::rtl::OUString::createFromAscii( "" ) ); @@ -229,7 +218,7 @@ ScriptStorageManager::createScriptStorageWithURI( throw ( RuntimeException ) { OSL_TRACE( "** ==> ScriptStorageManager in createScriptingStorageWithURI\n" ); - validateXRef( xSFA, "ScriptStorageManager::createScriptStorage: XSimpleFileAccess is not valid" ); + ENSURE_OR_THROW( xSFA.is(), "ScriptStorageManager::createScriptStorage: XSimpleFileAccess is not valid" ); // related to issue 11866 // warning dialog gets launched when adding binding to script in doc @@ -313,7 +302,7 @@ throw( RuntimeException ) OUSTR( "ScriptStorageManager::getScriptStorage: invalid storage ID" ), Reference< XInterface >() ); } - validateXRef( itr->second, + ENSURE_OR_THROW( itr->second.is(), "ScriptStorageManager::getScriptStorage: Cannot get ScriptStorage from ScriptStorageHash" ); return itr->second; } diff --git a/sfx2/inc/sfx2/app.hxx b/sfx2/inc/sfx2/app.hxx index 980eec04cfa6..964b684fdb21 100644 --- a/sfx2/inc/sfx2/app.hxx +++ b/sfx2/inc/sfx2/app.hxx @@ -31,6 +31,7 @@ #include "sfx2/dllapi.h" #include "sal/types.h" #include <tools/solar.h> +#include <tools/errcode.hxx> #include <svl/smplhint.hxx> #include <svl/poolitem.hxx> #include <vcl/image.hxx> @@ -98,6 +99,8 @@ struct SfxStbCtrlFactory; struct SfxTbxCtrlFactory; class SimpleResMgr; class ModalDialog; +class SbxArray; +class SbxValue; namespace sfx2 { @@ -218,17 +221,18 @@ public: // members SfxFilterMatcher& GetFilterMatcher(); - SfxMacroConfig* GetMacroConfig() const; SfxProgress* GetProgress() const; const String& GetLastSaveDirectory() const; USHORT GetFreeIndex(); void ReleaseIndex(USHORT i); - SfxEventConfiguration* GetEventConfig() const; // Basic/Scripting static sal_Bool IsXScriptURL( const String& rScriptURL ); static ::rtl::OUString ChooseScript(); static void MacroOrganizer( INT16 nTabId ); + static ErrCode CallBasic( const String&, BasicManager*, SbxArray *pArgs, SbxValue *pRet ); + static ErrCode CallAppBasic( const String& i_macroName, SbxArray* i_args = NULL, SbxValue* i_ret = NULL ) + { return CallBasic( i_macroName, SfxApplication::GetOrCreate()->GetBasicManager(), i_args, i_ret ); } BasicManager* GetBasicManager(); com::sun::star::uno::Reference< com::sun::star::script::XLibraryContainer > GetDialogContainer(); @@ -237,9 +241,6 @@ public: StarBASIC* GetBasic(); USHORT SaveBasicManager() const; USHORT SaveBasicAndDialogContainer() const; - void EnterBasicCall(); - FASTBOOL IsInBasicCall() const; - void LeaveBasicCall(); void RegisterBasicConstants( const char *pPrefix, const SfxConstant *pConsts, USHORT nCount ); @@ -293,8 +294,6 @@ public: SAL_DLLPRIVATE void MiscState_Impl(SfxItemSet &); SAL_DLLPRIVATE void PropExec_Impl(SfxRequest &); SAL_DLLPRIVATE void PropState_Impl(SfxItemSet &); - SAL_DLLPRIVATE void MacroExec_Impl(SfxRequest &); - SAL_DLLPRIVATE void MacroState_Impl(SfxItemSet &); SAL_DLLPRIVATE void INetExecute_Impl(SfxRequest &); SAL_DLLPRIVATE void INetState_Impl(SfxItemSet &); SAL_DLLPRIVATE void OfaExec_Impl(SfxRequest &); @@ -303,7 +302,6 @@ public: SAL_DLLPRIVATE void SetProgress_Impl(SfxProgress *); SAL_DLLPRIVATE const String& GetLastDir_Impl() const; SAL_DLLPRIVATE void SetLastDir_Impl( const String & ); - SAL_DLLPRIVATE void PlayMacro_Impl( SfxRequest &rReq, StarBASIC *pBas ); SAL_DLLPRIVATE void EnterAsynchronCall_Impl(); SAL_DLLPRIVATE FASTBOOL IsInAsynchronCall_Impl() const; diff --git a/sfx2/inc/sfx2/evntconf.hxx b/sfx2/inc/sfx2/evntconf.hxx index 17080ec2d51e..5b41d3a32935 100644 --- a/sfx2/inc/sfx2/evntconf.hxx +++ b/sfx2/inc/sfx2/evntconf.hxx @@ -45,10 +45,6 @@ #define ITEMID_MACRO SID_ATTR_MACROITEM #include <svl/macitem.hxx> -class SfxMacroInfo; -class SfxMacroInfoArr_Impl; -class SfxEventConfigItem_Impl; -class SfxEventInfoArr_Impl; class SfxObjectShell; class SvxMacroTableDtor; diff --git a/sfx2/inc/sfx2/macrconf.hxx b/sfx2/inc/sfx2/macrconf.hxx deleted file mode 100644 index 6b50ddf3497a..000000000000 --- a/sfx2/inc/sfx2/macrconf.hxx +++ /dev/null @@ -1,155 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ -#ifndef _SFX_MACROCONF_HXX -#define _SFX_MACROCONF_HXX - -#include "sal/config.h" -#include "sfx2/dllapi.h" -#include "sal/types.h" -#include <tools/errcode.hxx> -#define _SVSTDARR_USHORTS -#include <svl/svstdarr.hxx> // SvUShorts -#include <sfx2/evntconf.hxx> - -class SfxMacroInfo; -class SfxSlot; -class SfxMacroInfoItem; -class SfxObjectShell; -class BasicManager; -struct SfxMacroConfig_Impl; -class SbMethod; -class SbxValue; -class SbxObject; -class SbxArray; -class SvStream; -class SvxMacro; - -typedef SfxMacroInfo* SfxMacroInfoPtr; -//#if 0 // _SOLAR__PRIVATE -SV_DECL_PTRARR(SfxMacroInfoArr_Impl, SfxMacroInfoPtr, 5, 5) -//#else -//class SfxMacroInfoArr_Impl; -//#endif - -class SFX2_DLLPUBLIC SfxMacroInfo -{ -friend class SfxMacroConfig; -friend class SfxEventConfiguration; -friend SvStream& operator >> (SvStream& rStream, SfxMacroInfo& rInfo); -friend SvStream& operator << (SvStream& rStream, const SfxMacroInfo& rInfo); - - String* pHelpText; - sal_uInt16 nRefCnt; - sal_Bool bAppBasic; - String aLibName; - String aModuleName; - String aMethodName; - sal_uInt16 nSlotId; - SfxSlot* pSlot; - -public: - SfxMacroInfo( const String& rURL ); - SfxMacroInfo( bool _bAppBasic = true ); - SfxMacroInfo( bool _bAppBasic, const String& rQualifiedName ); - SfxMacroInfo(SfxMacroInfo& rOther); - SfxMacroInfo(bool _bAppBasic, const String& rLibName, - const String& rModuleName, const String& rMethodName); - ~SfxMacroInfo(); - sal_Bool operator==(const SfxMacroInfo& rOther) const; - int Load (SvStream&); - int Store (SvStream&); - String GetMacroName() const; - String GetQualifiedName() const; - String GetFullQualifiedName() const; - BasicManager* GetBasicManager() const; - String GetBasicName() const; - String GetHelpText() const; - sal_Bool IsAppMacro() const - { return bAppBasic; } - const String& GetModuleName() const - { return aModuleName; } - const String& GetLibName() const - { return aLibName; } - const String& GetMethodName() const - { return aMethodName; } - sal_uInt16 GetSlotId() const - { return nSlotId; } - SfxSlot* GetSlot() const - { return pSlot; } - - sal_Bool Compare( const SvxMacro& ) const; - void SetHelpText( const String& rText ); - String GetURL() const; -}; - -//ASDBG obsolete >= 582 -//ASDBG class ::com::sun::star::uno::Reference< ::com::sun::star::script::XEngine > ; -//ASDBG class ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > ; - -class SFX2_DLLPUBLIC SfxMacroConfig -{ -friend class SfxEventConfiguration; - - SAL_DLLPRIVATE static SfxMacroConfig* pMacroConfig; - - SfxMacroConfig_Impl* pImp; - SvUShorts aIdArray; - -public: - SfxMacroConfig(); - ~SfxMacroConfig(); - - static SfxMacroConfig* GetOrCreate(); - - static String RequestHelp( sal_uInt16 nId ); - static sal_Bool IsMacroSlot( sal_uInt16 nId ); - static sal_Bool IsBasic( SbxObject*, const String&, BasicManager* ); - static ErrCode Call( SbxObject*, const String&, BasicManager*, - SbxArray *pArgs=NULL, SbxValue *pRet=NULL ); -//ASDBG obsolete >= 582 -//ASDBG static void CallStarScript( const ::com::sun::star::uno::Reference< ::com::sun::star::script::XEngine > & rxEngine, const String & rCode, -//ASDBG const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > & rSource, void *pArgs, void *pRet ); - static SbMethod* GetMethod_Impl( const String&, BasicManager* ); - - sal_uInt16 GetSlotId(SfxMacroInfoPtr); - void ReleaseSlotId(sal_uInt16 nId); - void RegisterSlotId(sal_uInt16 nId); - SfxMacroInfo* GetMacroInfo(sal_uInt16 nId) const; - sal_Bool ExecuteMacro(sal_uInt16 nId, const String& rArgs ) const; - sal_Bool ExecuteMacro( SfxObjectShell*, const SvxMacro*, const String& ) const; - sal_Bool CheckMacro(sal_uInt16 nId) const; - sal_Bool CheckMacro( SfxObjectShell*, const SvxMacro* ) const; - -//#if 0 // _SOLAR__PRIVATE - SAL_DLLPRIVATE static void Release_Impl(); - SAL_DLLPRIVATE const SfxMacroInfo* GetMacroInfo_Impl( const SvxMacro *pMacro ) const; - DECL_DLLPRIVATE_LINK( CallbackHdl_Impl, SfxMacroConfig*); - DECL_DLLPRIVATE_LINK( EventHdl_Impl, SfxMacroInfo*); -//#endif -}; - -#endif diff --git a/sfx2/inc/sfx2/objsh.hxx b/sfx2/inc/sfx2/objsh.hxx index 9473ac126bd7..4fe7f53a7015 100644 --- a/sfx2/inc/sfx2/objsh.hxx +++ b/sfx2/inc/sfx2/objsh.hxx @@ -73,7 +73,6 @@ class BasicManager; class SfxMedium; class SfxObjectFactory; class SfxDocumentInfoDialog; -class SfxEventConfigItem_Impl; class SfxStyleSheetBasePool; class INote; class SfxStyleSheetPool; @@ -195,12 +194,6 @@ in fremde Objekte integriert werden k"onnen. ----------------------------------------------------------------------*/ -enum SfxTitleQuery -{ - SFX_TITLE_QUERY_SAVE_NAME_PROPOSAL -}; - - class SfxToolBoxConfig; struct TransferableObjectDescriptor; @@ -367,36 +360,11 @@ public: sal_uInt16 GetScriptingSignatureState(); void SignScriptingContent(); - virtual String QueryTitle( SfxTitleQuery ) const; virtual SfxDocumentInfoDialog* CreateDocumentInfoDialog( Window *pParent, const SfxItemSet& ); - sal_Bool IsBasic( const String & rCode, SbxObject * pVCtrl = NULL ); ErrCode CallBasic( const String& rMacro, const String& rBasicName, - SbxObject* pVCtrl, SbxArray* pArgs = 0, SbxValue* pRet = 0 ); - ErrCode Call( const String & rCode, sal_Bool bIsBasicReturn, SbxObject * pVCtrl = NULL ); - - ErrCode CallScript( - const String & rScriptType, const String & rCode, const void* pArgs = NULL, void* pRet = NULL ); - - /** calls a StarBasic script without magic - @param _rMacroName - specifies the name of the method to execute - @param _rLocation - specifies the location of the script to execute. Allowed values are "application" and "document". - @param _pArguments - This is a pointer to a Sequence< Any >. All elements of the Sequence are wrapped into Basic objects - and passed as arguments to the method specified by <arg>_rMacroName</arg> - @param _pReturn - If not <NULL/>, the Any pointed to by this argument contains the return value of the (synchronous) call - to the StarBasic macro - */ - ErrCode CallStarBasicScript( - const String& _rMacroName, - const String& _rLocation, - const void* _pArguments = NULL, - void* _pReturn = NULL - ); + SbxArray* pArgs = 0, SbxValue* pRet = 0 ); ErrCode CallXScript( const String& rScriptURL, @@ -791,7 +759,6 @@ public: SAL_DLLPRIVATE SfxObjectShell* GetParentShellByModel_Impl(); // configuration items - SAL_DLLPRIVATE SfxEventConfigItem_Impl* GetEventConfig_Impl( sal_Bool bForce=sal_False ); SAL_DLLPRIVATE SfxToolBoxConfig* GetToolBoxConfig_Impl(); SAL_DLLPRIVATE sal_uInt16 ImplGetSignatureState( sal_Bool bScriptingContent = FALSE ); diff --git a/sfx2/inc/sfx2/sfx.hrc b/sfx2/inc/sfx2/sfx.hrc index a49b003b5b49..498cdcdaef55 100755 --- a/sfx2/inc/sfx2/sfx.hrc +++ b/sfx2/inc/sfx2/sfx.hrc @@ -222,7 +222,6 @@ #define RID_BUILDVERSION (RID_SFX_START+5) #define RID_DOCALREADYLOADED_DLG (RID_SFX_START+1) -#define RID_CANTLOADDOC_DLG (RID_SFX_START+2) #define TP_DOCINFODESC (RID_SFX_START+3) #define TP_DOCINFODOC (RID_SFX_START+4) @@ -313,16 +312,8 @@ // ------------------------------------------------------------------------ -#define BMP_COLS 21 -#define BMP_SFX_SMALL 1 -#define BMP_SFX_LARGE 2 - #define RID_SFX_GLOBALS 1000 -#define BMP_SFX_COLOR (RID_SFX_GLOBALS + 1) -#define BMP_SFX_MONO (RID_SFX_GLOBALS + 2) -#define SFX_MSG_RES (RID_SFX_GLOBALS + 3) - // ========================================================================= #define RID_OPTIONS_START (SID_LIB_START + 2000) @@ -330,24 +321,6 @@ // ResId's ------------------------------------------------------------------ -#define RID_SFXLANG_BEGIN (RID_OPTIONS_START + 0) -#define RID_SFXLANG_NO (RID_SFXLANG_BEGIN + 0) -#define RID_SFXLANG_GERMAN (RID_SFXLANG_BEGIN + 1) -#define RID_SFXLANG_SWISS_GERMAN (RID_SFXLANG_BEGIN + 2) -#define RID_SFXLANG_US_ENGLISH (RID_SFXLANG_BEGIN + 3) -#define RID_SFXLANG_UK_ENGLISH (RID_SFXLANG_BEGIN + 4) -#define RID_SFXLANG_FRENCH (RID_SFXLANG_BEGIN + 5) -#define RID_SFXLANG_ITALIAN (RID_SFXLANG_BEGIN + 6) -#define RID_SFXLANG_CAST_SPANISH (RID_SFXLANG_BEGIN + 7) -#define RID_SFXLANG_PORTUGUESE (RID_SFXLANG_BEGIN + 8) -#define RID_SFXLANG_DANISH (RID_SFXLANG_BEGIN + 9) -#define RID_SFXLANG_DUTCH (RID_SFXLANG_BEGIN + 10) -#define RID_SFXLANG_SWEDISH (RID_SFXLANG_BEGIN + 11) -#define RID_SFXLANG_FINNISH (RID_SFXLANG_BEGIN + 12) -#define RID_SFXLANG_NORWEG_BOKMAL (RID_SFXLANG_BEGIN + 13) -#define RID_SFXLANG_NORWEG_NYNORSK (RID_SFXLANG_BEGIN + 14) -#define RID_SFXLANG_ALL (RID_SFXLANG_BEGIN + 15) - #define RID_SFXPAGE_SAVE (RID_OPTIONS_START + 0) #define RID_SFXPAGE_GENERAL (RID_OPTIONS_START + 1) #define RID_SFXPAGE_SPELL (RID_OPTIONS_START + 2) @@ -356,10 +329,7 @@ #define RID_SFXQB_DELDICT (RID_OPTIONS_START + 5) #define RID_SFXPAGE_PATH (RID_OPTIONS_START + 6) #define RID_SFXPAGE_LINGU (RID_OPTIONS_START + 7) -#define RID_SFXPAGE_INET (RID_OPTIONS_START + 8) -#define RID_SFXQB_DEL_IGNORELIST (RID_OPTIONS_START + 9) #define RID_SFXQB_SET_LANGUAGE (RID_OPTIONS_START + 10) -#define RID_ITEMLIST_LINGU (RID_OPTIONS_START + 11) #define RID_SFXPAGE_PRINTOPTIONS (RID_OPTIONS_START + 12) #define STR_UNDO (RID_SFX_VIEW_START+11) diff --git a/sfx2/inc/sfx2/sfxbasemodel.hxx b/sfx2/inc/sfx2/sfxbasemodel.hxx index 00ee49a18004..2ba73f4034fc 100644 --- a/sfx2/inc/sfx2/sfxbasemodel.hxx +++ b/sfx2/inc/sfx2/sfxbasemodel.hxx @@ -44,6 +44,7 @@ #include <com/sun/star/document/XDocumentInfoSupplier.hpp> #include <com/sun/star/document/XDocumentPropertiesSupplier.hpp> #include <com/sun/star/document/XDocumentRecovery.hpp> +#include <com/sun/star/document/XUndoManagerSupplier.hpp> #include <com/sun/star/rdf/XDocumentMetadataAccess.hpp> @@ -96,9 +97,9 @@ #include <com/sun/star/task/XInteractionHandler.hpp> //________________________________________________________________________________________________________ -#if ! defined(INCLUDED_COMPHELPER_IMPLBASE_VAR_HXX_30) -#define INCLUDED_COMPHELPER_IMPLBASE_VAR_HXX_30 -#define COMPHELPER_IMPLBASE_INTERFACE_NUMBER 30 +#if ! defined(INCLUDED_COMPHELPER_IMPLBASE_VAR_HXX_31) +#define INCLUDED_COMPHELPER_IMPLBASE_VAR_HXX_31 +#define COMPHELPER_IMPLBASE_INTERFACE_NUMBER 31 #include <comphelper/implbase_var.hxx> #endif @@ -237,11 +238,12 @@ namespace sfx { namespace intern { SfxListener */ -typedef ::comphelper::WeakImplHelper30 < XCHILD +typedef ::comphelper::WeakImplHelper31 < XCHILD , XDOCUMENTINFOSUPPLIER , ::com::sun::star::document::XDocumentPropertiesSupplier , ::com::sun::star::rdf::XDocumentMetadataAccess , ::com::sun::star::document::XDocumentRecovery + , ::com::sun::star::document::XUndoManagerSupplier , XEVENTBROADCASTER , XEVENTLISTENER , XEVENTSSUPPLIER @@ -1306,6 +1308,9 @@ public: ::com::sun::star::io::IOException, ::com::sun::star::lang::WrappedTargetException ); + // css.document.XUndoManagerSupplier + virtual ::com::sun::star::uno::Reference< ::com::sun::star::document::XUndoManager > SAL_CALL getUndoManager( ) throw (::com::sun::star::uno::RuntimeException); + //____________________________________________________________________________________________________ // ::com::sun::star::rdf::XNode: @@ -1470,22 +1475,11 @@ public: SfxObjectShell* GetObjectShell() const ; SAL_DLLPRIVATE SfxObjectShell* impl_getObjectShell() const ; - /**___________________________________________________________________________________________________ - @short - - @descr - - - @seealso - - - @param - - - @return - - - @onerror - - */ - SAL_DLLPRIVATE sal_Bool impl_isDisposed() const ; sal_Bool IsInitialized() const; + sal_Bool IsDisposed() const { return impl_isDisposed(); } void MethodEntryCheck( const bool i_mustBeInitialized ) const; + ::osl::Mutex& getMutex() const { return m_aMutex; } ::com::sun::star::uno::Reference < ::com::sun::star::container::XIndexAccess > SAL_CALL getViewData() throw (::com::sun::star::uno::RuntimeException); void SAL_CALL setViewData( const ::com::sun::star::uno::Reference < ::com::sun::star::container::XIndexAccess >& aData ) throw (::com::sun::star::uno::RuntimeException); @@ -1559,6 +1553,44 @@ private: } ; // class SfxBaseModel +/** base class for sub components of an SfxBaseModel, which share their ref count and lifetime with the SfxBaseModel +*/ +class SFX2_DLLPUBLIC SfxModelSubComponent +{ +public: + /** checks whether the instance is alive, i.e. properly initialized, and not yet disposed + */ + void MethodEntryCheck() + { + m_rModel.MethodEntryCheck( true ); + } + + // called when the SfxBaseModel which the component is superordinate of is being disposed + virtual void disposing(); + +protected: + SfxModelSubComponent( SfxBaseModel& i_model ) + :m_rModel( i_model ) + { + } + virtual ~SfxModelSubComponent(); + + // helpers for implementing XInterface - delegates ref counting to the SfxBaseModel + void acquire() { m_rModel.acquire(); } + void release() { m_rModel.release(); } + + bool isDisposed() const { return m_rModel.IsDisposed(); } + +protected: + const SfxBaseModel& getBaseModel() const { return m_rModel; } + SfxBaseModel& getBaseModel() { return m_rModel; } + + ::osl::Mutex& getMutex() { return m_rModel.getMutex(); } + +private: + SfxBaseModel& m_rModel; +}; + class SFX2_DLLPUBLIC SfxModelGuard { public: @@ -1575,17 +1607,27 @@ public: { i_rModel.MethodEntryCheck( i_eState != E_INITIALIZING ); } + SfxModelGuard( SfxModelSubComponent& i_rSubComponent ) + :m_aGuard( Application::GetSolarMutex() ) + { + i_rSubComponent.MethodEntryCheck(); + } ~SfxModelGuard() { } + void reset() + { + m_aGuard.reset(); + } + void clear() { m_aGuard.clear(); } private: - ::vos::OClearableGuard m_aGuard; + ::osl::ResettableGuard< ::vos::IMutex > m_aGuard; }; #undef css diff --git a/sfx2/inc/sfx2/sfxcommands.h b/sfx2/inc/sfx2/sfxcommands.h index bdf27baac7b3..035f2f187bb8 100644..100755 --- a/sfx2/inc/sfx2/sfxcommands.h +++ b/sfx2/inc/sfx2/sfxcommands.h @@ -1,345 +1,342 @@ -/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-#ifndef SFX2_SFXCOMMANDS_HRC
-#define SFX2_SFXCOMMANDS_HRC
-
-#define CMD_SID_VIEWSHELL0 ".uno:_SwitchViewShell0"
-#define CMD_SID_VIEWSHELL1 ".uno:_SwitchViewShell1"
-#define CMD_SID_VIEWSHELL2 ".uno:_SwitchViewShell2"
-#define CMD_SID_VIEWSHELL3 ".uno:_SwitchViewShell3"
-#define CMD_SID_VIEWSHELL4 ".uno:_SwitchViewShell4"
-#define CMD_SID_ABOUT ".uno:About"
-#define CMD_SID_ACTIVATE ".uno:Activate"
-#define CMD_SID_HELPBALLOONS ".uno:ActiveHelp"
-#define CMD_SID_STYLE_FAMILY ".uno:ActualStyleFamily"
-#define CMD_SID_NEWDOC ".uno:NewDoc"
-#define CMD_SID_CREATELINK ".uno:AddBookmark"
-#define CMD_SID_NEWDOCDIRECT ".uno:AddDirect"
-#define CMD_SID_TEMPLATE_ADDRESSBOKSOURCE ".uno:AddressBookSource"
-#define CMD_SID_BASICIDE_ADDWATCH ".uno:AddWatch"
-#define CMD_SID_DOCINFO_AUTHOR ".uno:Author"
-#define CMD_SID_AUTOHIDE ".uno:AutoHide"
-#define CMD_SID_AUTOPILOTMENU ".uno:AutoPilotMenu"
-#define CMD_SID_GALLERY_BG_BRUSH ".uno:BackgroundImage"
-#define CMD_SID_BACKSPACE ".uno:Backspace"
-#define CMD_SID_BASICBREAK ".uno:BasicBreak"
-#define CMD_SID_BASICIDE_APPEAR ".uno:BasicIDEAppear"
-#define CMD_SID_BASICSTEPINTO ".uno:BasicStepInto"
-#define CMD_SID_BASICSTEPOUT ".uno:BasicStepOut"
-#define CMD_SID_BASICSTEPOVER ".uno:BasicStepOver"
-#define CMD_SID_BASICSTOP ".uno:BasicStop"
-#define CMD_SID_BROWSER ".uno:Beamer"
-#define CMD_SID_BASICIDE_BRKPNTSCHANGED ".uno:BreakPointsChanged"
-#define CMD_SID_BROWSE_BACKWARD ".uno:BrowseBackward"
-#define CMD_SID_BROWSE_FORWARD ".uno:BrowseForward"
-#define CMD_SID_BROWSER_MODE ".uno:BrowseView"
-#define CMD_SID_BUILD_VERSION ".uno:BuildVersion"
-#define CMD_SID_CAPTION ".uno:Caption"
-#define CMD_SID_STYLE_FAMILY1 ".uno:CharStyle"
-#define CMD_SID_CHECK_KEY ".uno:CheckKey"
-#define CMD_SID_BASICIDE_CHOOSEMACRO ".uno:ChooseMacro"
-#define CMD_SID_CLEARHISTORY ".uno:ClearHistory"
-#define CMD_SID_CLOSEWINS ".uno:CloseWins"
-#define CMD_SID_CLOSEDOCS ".uno:CloseDocs"
-#define CMD_SID_CLOSEDOC ".uno:CloseDoc"
-#define CMD_SID_CLOSEWIN ".uno:CloseWin"
-#define CMD_SID_CLOSING ".uno:Closing"
-#define CMD_SID_DOCINFO_COMMENTS ".uno:Comments"
-#define CMD_SID_OFFICE_COMMERCIAL_USE ".uno:CommercialUse"
-#define CMD_SID_DOCUMENT_COMPARE ".uno:CompareDocuments"
-#define CMD_SID_BASICCOMPILE ".uno:CompileBasic"
-#define CMD_SID_CONFIG ".uno:ConfigureDialog"
-#define CMD_SID_CONTEXT ".uno:Context"
-#define CMD_SID_COPY ".uno:Copy"
-#define CMD_SID_CRASH ".uno:Crash"
-#define CMD_SID_BASICIDE_CREATEMACRO ".uno:CreateMacro"
-#define CMD_SID_CURRENT_URL ".uno:CurrentURL"
-#define CMD_SID_CURSORENDOFSCREEN ".uno:CursorEndOfScreen"
-#define CMD_SID_CURSORTOPOFSCREEN ".uno:CursorTopOfScreen"
-#define CMD_SID_OFFICE_CUSTOMERNUMBER ".uno:CustomerNumber"
-#define CMD_SID_CUT ".uno:Cut"
-#define CMD_SID_DEFAULTFILEPATH ".uno:DefaultFilePath"
-#define CMD_SID_DEFAULTFILENAME ".uno:DefaultFileName"
-#define CMD_SID_DELETE ".uno:Delete"
-#define CMD_SID_BASICIDE_DELETECURRENT ".uno:DeleteCurrent"
-#define CMD_SID_STYLE_DELETE ".uno:DeleteStyle"
-#define CMD_SID_STYLE_DESIGNER ".uno:DesignerDialog"
-#define CMD_SID_STYLE_DRAGHIERARCHIE ".uno:DragHierarchy"
-#define CMD_SID_EDITDOC ".uno:EditDoc"
-#define CMD_SID_BASICIDE_EDITMACRO ".uno:EditMacro"
-#define CMD_SID_STYLE_EDIT ".uno:EditStyle"
-#define CMD_FID_SEARCH_NOW ".uno:ExecuteSearch"
-#define CMD_SID_EXTENDEDHELP ".uno:ExtendedHelp"
-#define CMD_SID_FILE_NAME ".uno:FileName"
-#define CMD_SID_FOCUSURLBOX ".uno:FocusUrlBox"
-#define CMD_SID_FORMATMENU ".uno:FormatMenu"
-#define CMD_SID_STYLE_FAMILY3 ".uno:FrameStyle"
-#define CMD_SID_FRAMETITLE ".uno:FrameTitle"
-#define CMD_SID_PROGFILENAME ".uno:FullName"
-#define CMD_SID_DOCFULLNAME ".uno:FullName"
-#define CMD_SID_WIN_FULLSCREEN ".uno:FullScreen"
-#define CMD_SID_FILLFRAME ".uno:GetFrameWindow"
-#define CMD_SID_CURSORDOWN ".uno:GoDown"
-#define CMD_SID_CURSORPAGEDOWN ".uno:GoDownBlock"
-#define CMD_SID_CURSORPAGEDOWN_SEL ".uno:GoDownBlockSel"
-#define CMD_SID_CURSORDOWN_SEL ".uno:GoDownSel"
-#define CMD_SID_CURSORLEFT ".uno:GoLeft"
-#define CMD_SID_CURSORPAGELEFT ".uno:GoLeftBlock"
-#define CMD_SID_CURSORPAGELEFT_SEL ".uno:GoLeftBlockSel"
-#define CMD_SID_CURSORLEFT_SEL ".uno:GoLeftSel"
-#define CMD_SID_CURSORRIGHT ".uno:GoRight"
-#define CMD_SID_CURSORRIGHT_SEL ".uno:GoRightSel"
-#define CMD_SID_CURSORENDOFFILE ".uno:GoToEndOfData"
-#define CMD_SID_CURSORENDOFFILE_SEL ".uno:GoToEndOfDataSel"
-#define CMD_SID_CURSOREND ".uno:GoToEndOfRow"
-#define CMD_SID_CURSOREND_SEL ".uno:GoToEndOfRowSel"
-#define CMD_SID_CURSORTOPOFFILE ".uno:GoToStart"
-#define CMD_SID_CURSORHOME ".uno:GoToStartOfRow"
-#define CMD_SID_CURSORHOME_SEL ".uno:GoToStartOfRowSel"
-#define CMD_SID_CURSORTOPOFFILE_SEL ".uno:GoToStartSel"
-#define CMD_SID_CURSORUP ".uno:GoUp"
-#define CMD_SID_CURSORPAGEUP ".uno:GoUpBlock"
-#define CMD_SID_CURSORPAGEUP_SEL ".uno:GoUpBlockSel"
-#define CMD_SID_CURSORUP_SEL ".uno:GoUpSel"
-#define CMD_SID_HELP_ANNOTATE ".uno:HelpAnnotate"
-#define CMD_SID_HELP_BOOKMARK ".uno:HelpBookmark"
-#define CMD_SID_HELP_HELPFILEBOX ".uno:HelpChooseFile"
-#define CMD_SID_HELP_DOWNLOAD ".uno:HelpDownload"
-#define CMD_SID_HELP_PI ".uno:HelperDialog"
-#define CMD_SID_HELPINDEX ".uno:HelpIndex"
-#define CMD_SID_HELPMENU ".uno:HelpMenu"
-#define CMD_SID_HELPONHELP ".uno:HelpOnHelp"
-#define CMD_SID_HELP_SEARCH ".uno:HelpSearch"
-#define CMD_SID_HELPTIPS ".uno:HelpTip"
-#define CMD_SID_HELP_ZOOMIN ".uno:HelpZoomIn"
-#define CMD_SID_HELP_ZOOMOUT ".uno:HelpZoomOut"
-#define CMD_SID_BASICIDE_HIDECURPAGE ".uno:HideCurPage"
-#define CMD_SID_HYPERLINK_DIALOG ".uno:HyperlinkDialog"
-#define CMD_SID_INSERTDOC ".uno:InsertDoc"
-#define CMD_SID_HYPERLINK_INSERT ".uno:InsertHyperlink"
-#define CMD_SID_INSERT_FLOATINGFRAME ".uno:InsertObjectFloatingFrame"
-#define CMD_SID_INTERNET_ONLINE ".uno:InternetOnline"
-#define CMD_SID_INTERNET_SEARCH ".uno:InternetSearch"
-#define CMD_SID_DOC_LOADING ".uno:IsLoading"
-#define CMD_SID_IMG_LOADING ".uno:IsLoadingImages"
-#define CMD_SID_PRINTOUT ".uno:IsPrinting"
-#define CMD_SID_JUMPTOMARK ".uno:JumpToMark"
-#define CMD_SID_DOCINFO_KEYWORDS ".uno:Keywords"
-#define CMD_SID_BASICIDE_LIBLOADED ".uno:LibLoaded"
-#define CMD_SID_BASICIDE_LIBREMOVED ".uno:LibRemoved"
-#define CMD_SID_BASICIDE_LIBSELECTED ".uno:LibSelect"
-#define CMD_SID_BASICIDE_LIBSELECTOR ".uno:LibSelector"
-#define CMD_SID_OFFICE_PLK ".uno:LicenceKey"
-#define CMD_SID_CONFIGACCEL ".uno:LoadAccel"
-#define CMD_SID_BASICLOAD ".uno:LoadBasic"
-#define CMD_SID_LOADCONFIG ".uno:LoadConfiguration"
-#define CMD_SID_CONFIGEVENT ".uno:LoadEvents"
-#define CMD_SID_CONFIGMENU ".uno:LoadMenu"
-#define CMD_SID_CONFIGSTATUSBAR ".uno:LoadStatusBar"
-#define CMD_SID_TOOLBOXOPTIONS ".uno:LoadToolBox"
-#define CMD_SID_LOGOUT ".uno:Logout"
-#define CMD_SID_SCRIPTORGANIZER ".uno:ScriptOrganizer"
-#define CMD_SID_MACROORGANIZER ".uno:MacroOrganizer"
-#define CMD_SID_RUNMACRO ".uno:RunMacro"
-#define CMD_SID_BASICCHOOSER ".uno:MacroDialog"
-#define CMD_SID_MAIL_NOTIFY ".uno:MailReceipt"
-#define CMD_SID_MAIL_CHILDWIN ".uno:MailWindow"
-#define CMD_SID_BASICIDE_MATCHGROUP ".uno:MatchGroup"
-#define CMD_SID_TOGGLE_MENUBAR ".uno:MenuBarVisible"
-#define CMD_SID_DOCUMENT_MERGE ".uno:MergeDocuments"
-#define CMD_SID_ATTR_METRIC ".uno:MetricUnit"
-#define CMD_SID_MODIFIED ".uno:Modified"
-#define CMD_SID_DOC_MODIFIED ".uno:ModifiedStatus"
-#define CMD_SID_BASICIDE_MODULEDLG ".uno:ModuleDialog"
-#define CMD_SID_BASICIDE_NAMECHANGEDONTAB ".uno:NameChangedOnTab"
-#define CMD_SID_NAVIGATOR ".uno:Navigator"
-#define CMD_SID_RESTORE_EDITING_VIEW ".uno:RestoreEditingView"
-#define CMD_SID_BASICIDE_NEWDIALOG ".uno:NewDialog"
-#define CMD_SID_BASICIDE_NEWMODULE ".uno:NewModule"
-#define CMD_SID_CREATE_BASICOBJECT ".uno:NewObject"
-#define CMD_SID_STYLE_NEW ".uno:NewStyle"
-#define CMD_SID_NEWWINDOW ".uno:NewWindow"
-#define CMD_SID_BASICIDE_OBJCAT ".uno:ObjectCatalog"
-#define CMD_SID_OBJECT ".uno:ObjectMenue"
-#define CMD_SID_OLD_PALK ".uno:OldPALK"
-#define CMD_SID_OPENDOC ".uno:Open"
-#define CMD_SID_WEBHTML ".uno:WebHtml"
-#define CMD_SID_OPENHYPERLINK ".uno:OpenHyperlink"
-#define CMD_SID_DOCINFO_TITLE ".uno:DocInfoTitle"
-#define CMD_SID_OPENTEMPLATE ".uno:OpenTemplate"
-#define CMD_SID_OPENURL ".uno:OpenUrl"
-#define CMD_SID_OPTIONS ".uno:Options"
-#define CMD_SID_ORGANIZER ".uno:Organizer"
-#define CMD_SID_STYLE_FAMILY4 ".uno:PageStyle"
-#define CMD_SID_STYLE_FAMILY2 ".uno:ParaStyle"
-#define CMD_SID_PARTWIN ".uno:PartWindow"
-#define CMD_SID_PASTE ".uno:Paste"
-#define CMD_SID_CLIPBOARD_FORMAT_ITEMS ".uno:ClipboardFormatItems"
-#define CMD_SID_PASTE_SPECIAL ".uno:PasteSpecial"
-#define CMD_SID_DOCPATH ".uno:DocPath"
-#define CMD_SID_PICKLIST ".uno:PickList"
-#define CMD_SID_PLAYMACRO ".uno:PlayMacro"
-#define CMD_SID_PLUGINS_ACTIVE ".uno:PlugInsActive"
-#define CMD_SID_PRINTDOC ".uno:Print"
-#define CMD_SID_PRINTDOCDIRECT ".uno:PrintDefault"
-#define CMD_SID_PRINTER_NAME ".uno:Printer"
-#define CMD_SID_SETUPPRINTER ".uno:PrinterSetup"
-#define CMD_SID_PRINTPREVIEW ".uno:PrintPreview"
-#define CMD_SID_OFFICE_PRIVATE_USE ".uno:PrivateUse"
-#define CMD_SID_DOCINFO ".uno:SetDocumentProperties"
-#define CMD_SID_QUITAPP ".uno:Quit"
-#define CMD_SID_DOC_READONLY ".uno:ReadOnly"
-#define CMD_SID_RECORDMACRO ".uno:MacroRecorder"
-#define CMD_SID_STOP_RECORDING ".uno:StopRecording"
-#define CMD_SID_RECORDING_FLOATWINDOW ".uno:MacroRecordingFloat"
-#define CMD_SID_REDO ".uno:Redo"
-#define CMD_SID_DELETE_BASICOBJECT ".uno:ReleaseObject"
-#define CMD_SID_RELOAD ".uno:Reload"
-#define CMD_SID_BASICIDE_REMOVEWATCH ".uno:RemoveWatch"
-#define CMD_SID_BASICIDE_RENAMECURRENT ".uno:RenameCurrent"
-#define CMD_SID_REPAINT ".uno:Repaint"
-#define CMD_SID_REPEAT ".uno:RepeatAction"
-#define CMD_SID_RUBY_DIALOG ".uno:RubyDialog"
-#define CMD_SID_BASICRUN ".uno:RunBasic"
-#define CMD_SID_STARTSW ".uno:RunStarWriter"
-#define CMD_SID_SAVEDOC ".uno:Save"
-#define CMD_SID_SAVEDOCS ".uno:SaveAll"
-#define CMD_SID_SAVEASDOC ".uno:SaveAs"
-#define CMD_SID_DOCTEMPLATE ".uno:SaveAsTemplate"
-#define CMD_SID_BASICSAVEAS ".uno:SaveBasicAs"
-#define CMD_SID_EXPORT_DIALOG ".uno:ExportDialog"
-#define CMD_SID_IMPORT_DIALOG ".uno:ImportDialog"
-#define CMD_SID_SAVECONFIG ".uno:SaveConfiguration"
-#define CMD_SID_DOC_SAVED ".uno:Saved"
-#define CMD_SID_BASICIDE_SBXDELETED ".uno:SbxDeleted"
-#define CMD_SID_BASICIDE_SBXINSERTED ".uno:SbxInserted"
-#define CMD_SID_BASICIDE_SBXRENAMED ".uno:SbxRenamed"
-#define CMD_SID_MAIL_SCROLLBODY_PAGEDOWN ".uno:ScrollBodyPageDown"
-#define CMD_SID_SEARCH_DLG ".uno:SearchDialog"
-#define CMD_SID_SEARCH_OPTIONS ".uno:SearchOptions"
-#define CMD_SID_SEARCH_ITEM ".uno:SearchProperties"
-#define CMD_SID_SELECTALL ".uno:SelectAll"
-#define CMD_FN_FAX ".uno:SendFax"
-#define CMD_SID_MAIL_SENDDOC ".uno:SendMail"
-#define CMD_SID_MAIL_SENDDOCASPDF ".uno:SendMailDocAsPDF"
-#define CMD_SID_MAIL_SENDDOCASFORMAT ".uno:SendMailDocAsFormat"
-#define CMD_SID_MAIL_SENDDOCASMS ".uno:SendMailDocAsMS"
-#define CMD_SID_MAIL_SENDDOCASOOO ".uno:SendMailDocAsOOo"
-#define CMD_SID_SETOPTIONS ".uno:SetOptions"
-#define CMD_SID_OFFICE_PALK ".uno:SetPALK"
-#define CMD_SID_SHOW_BROWSER ".uno:ShowBrowser"
-#define CMD_SID_SHOWPOPUPS ".uno:ShowPopups"
-#define CMD_SID_BASICIDE_SHOWSBX ".uno:ShowSbx"
-#define CMD_SID_SOURCEVIEW ".uno:SourceView"
-#define CMD_SID_ONLINE_REGISTRATION_DLG ".uno:StartRegistrationDialog"
-#define CMD_SID_STATUSBARTEXT ".uno:StatusBar"
-#define CMD_SID_TOGGLESTATUSBAR ".uno:StatusBarVisible"
-#define CMD_SID_BASICIDE_STAT_DATE ".uno:StatusGetDate"
-#define CMD_SID_BASICIDE_STAT_POS ".uno:StatusGetPosition"
-#define CMD_SID_BASICIDE_STAT_TITLE ".uno:StatusGetTitle"
-#define CMD_SID_BASICIDE_STOREALLMODULESOURCES ".uno:StoreAllModuleSources"
-#define CMD_SID_BASICIDE_STOREMODULESOURCE ".uno:StoreModuleSource"
-#define CMD_SID_STYLE_APPLY ".uno:StyleApplyState"
-#define CMD_SID_STYLE_CATALOG ".uno:StyleCatalog"
-#define CMD_SID_STYLE_NEW_BY_EXAMPLE ".uno:StyleNewByExample"
-#define CMD_SID_STYLE_UPDATE_BY_EXAMPLE ".uno:StyleUpdateByExample"
-#define CMD_SID_STYLE_WATERCAN ".uno:StyleWatercanMode"
-#define CMD_SID_VIEWSHELL ".uno:SwitchViewShell"
-#define CMD_SID_TASKBAR ".uno:TaskBarVisible"
-#define CMD_SID_STYLE_FAMILY5 ".uno:ListStyle"
-#define CMD_SID_TIPWINDOW ".uno:TipsDialog"
-#define CMD_SID_DOCTITLE ".uno:Title"
-#define CMD_SID_TITLE ".uno:Title"
-#define CMD_SID_BASICIDE_TOGGLEBRKPNT ".uno:ToggleBreakPoint"
-#define CMD_SID_BASICIDE_SHOWWINDOW ".uno:BasicIDEShowWindow"
-#define CMD_SID_EDITMACRO ".uno:ToolsMacroEdit"
-#define CMD_SID_UNDO ".uno:Undo"
-#define CMD_SID_FORMATPAINTBRUSH ".uno:FormatPaintbrush"
-#define CMD_SID_ATTR_UNDO_COUNT ".uno:UndoCount"
-#define CMD_SID_BASICIDE_UPDATEALLMODULESOURCES ".uno:UpdateAllModuleSources"
-#define CMD_SID_BASICIDE_UPDATEMODULESOURCE ".uno:UpdateModuleSource"
-#define CMD_SID_BASICIDE_MANAGEBRKPNTS ".uno:ManageBreakPoints"
-#define CMD_SID_BASICIDE_TOGGLEBRKPNTENABLED ".uno:ToggleBreakPointEnabled"
-#define CMD_SID_UPDATE_VERSION ".uno:UpdateVersion"
-#define CMD_SID_VERSION ".uno:VersionDialog"
-#define CMD_SID_SIGNATURE ".uno:Signature"
-#define CMD_SID_MACRO_SIGNATURE ".uno:MacroSignature"
-#define CMD_SID_VERSION_VISIBLE ".uno:VersionVisible"
-#define CMD_SID_VIEW_DATA_SOURCE_BROWSER ".uno:ViewDataSourceBrowser"
-#define CMD_SID_WIN_VISIBLE ".uno:WinVisible"
-#define CMD_SID_MDIWINDOWLIST ".uno:WindowList"
-#define CMD_SID_ZOOM_IN ".uno:ZoomMinus"
-#define CMD_SID_ZOOM ".uno:Zooming"
-#define CMD_SID_ZOOM_NEXT ".uno:ZoomNext"
-#define CMD_SID_ZOOM_OUT ".uno:ZoomPlus"
-#define CMD_SID_ZOOM_PREV ".uno:ZoomPrevious"
-#define CMD_SID_ZOOM_TOOLBOX ".uno:ZoomToolBox"
-#define CMD_SID_EXPORTDOC ".uno:ExportTo"
-#define CMD_SID_EXPORTDOCASPDF ".uno:ExportToPDF"
-#define CMD_SID_DIRECTEXPORTDOCASPDF ".uno:ExportDirectToPDF"
-#define CMD_SID_IMAGE_ORIENTATION ".uno:ImageOrientation"
-#define CMD_SID_SAVE_VERSION_ON_CLOSE ".uno:SaveVersionOnClose"
-#define CMD_SID_ADDONS ".uno:Addons"
-#define CMD_SID_SHOW_IME_STATUS_WINDOW ".uno:ShowImeStatusWindow"
-#define CMD_SID_UPDATE_CONFIG ".uno:UpdateConfiguration"
-#define CMD_SID_HELP_SUPPORTPAGE ".uno:HelpSupport"
-#define CMD_SID_HELP_TUTORIALS ".uno:HelpTutorials"
-#define CMD_SID_ADDONHELP ".uno:AddonHelp"
-#define CMD_SID_FORMATMENUSTATE ".uno:FormatMenuState"
-#define CMD_SID_INET_DLG ".uno:InternetDialog"
-#define CMD_SID_ONLINE_REGISTRATION ".uno:OnlineRegistrationDlg"
-#define CMD_SID_OFFICE_CHECK_PLZ ".uno:CheckPLZ"
-#define CMD_SID_ADDRESS_DATA_SOURCE ".uno:AutoPilotAddressDataSource"
-#define CMD_FN_BUSINESS_CARD ".uno:InsertBusinessCard"
-#define CMD_FN_LABEL ".uno:InsertLabels"
-#define CMD_FN_XFORMS_INIT ".uno:NewXForms"
-#define CMD_SID_SD_AUTOPILOT ".uno:AutoPilotPresentations"
-#define CMD_SID_NEWSD ".uno:NewPresentation"
-#define CMD_SID_COMP_BIBLIOGRAPHY ".uno:BibliographyComponent"
-#define CMD_SID_MINIMIZED ".uno:Minimized"
-#define CMD_SID_AUTO_CORRECT_DLG ".uno:AutoCorrectDlg"
-#define CMD_SID_OPTIONS_TREEDIALOG ".uno:OptionsTreeDialog"
-#define CMD_SID_TERMINATE_INPLACEACTIVATION ".uno:TerminateInplaceActivation"
-#define CMD_SID_RECENTFILELIST ".uno:RecentFileList"
-#define CMD_SID_AVAILABLE_TOOLBARS ".uno:AvailableToolbars"
-#define CMD_SID_AVMEDIA_PLAYER ".uno:AVMediaPlayer"
-#define CMD_SID_INSERT_AVMEDIA ".uno:InsertAVMedia"
-#define CMD_SID_MORE_DICTIONARIES ".uno:MoreDictionaries"
-#define CMD_SID_ACTIVATE_STYLE_APPLY ".uno:ActivateStyleApply"
-#define CMD_SID_DOCKWIN_0 ".uno:DockingWindow0"
-#define CMD_SID_DOCKWIN_1 ".uno:DockingWindow1"
-#define CMD_SID_DOCKWIN_2 ".uno:DockingWindow2"
-#define CMD_SID_DOCKWIN_3 ".uno:DockingWindow3"
-#define CMD_SID_DOCKWIN_4 ".uno:DockingWindow4"
-#define CMD_SID_DOCKWIN_5 ".uno:DockingWindow5"
-#define CMD_SID_DOCKWIN_6 ".uno:DockingWindow6"
-#define CMD_SID_DOCKWIN_7 ".uno:DockingWindow7"
-#define CMD_SID_DOCKWIN_8 ".uno:DockingWindow8"
-#define CMD_SID_DOCKWIN_9 ".uno:DockingWindow9"
-#define CMD_SID_PASTE_UNFORMATTED ".uno:PasteUnformatted"
-
-#endif
+/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ +#ifndef SFX2_SFXCOMMANDS_HRC +#define SFX2_SFXCOMMANDS_HRC + +#define CMD_SID_VIEWSHELL0 ".uno:_SwitchViewShell0" +#define CMD_SID_VIEWSHELL1 ".uno:_SwitchViewShell1" +#define CMD_SID_VIEWSHELL2 ".uno:_SwitchViewShell2" +#define CMD_SID_VIEWSHELL3 ".uno:_SwitchViewShell3" +#define CMD_SID_VIEWSHELL4 ".uno:_SwitchViewShell4" +#define CMD_SID_ABOUT ".uno:About" +#define CMD_SID_ACTIVATE ".uno:Activate" +#define CMD_SID_HELPBALLOONS ".uno:ActiveHelp" +#define CMD_SID_STYLE_FAMILY ".uno:ActualStyleFamily" +#define CMD_SID_NEWDOC ".uno:NewDoc" +#define CMD_SID_CREATELINK ".uno:AddBookmark" +#define CMD_SID_NEWDOCDIRECT ".uno:AddDirect" +#define CMD_SID_TEMPLATE_ADDRESSBOKSOURCE ".uno:AddressBookSource" +#define CMD_SID_BASICIDE_ADDWATCH ".uno:AddWatch" +#define CMD_SID_DOCINFO_AUTHOR ".uno:Author" +#define CMD_SID_AUTOHIDE ".uno:AutoHide" +#define CMD_SID_AUTOPILOTMENU ".uno:AutoPilotMenu" +#define CMD_SID_GALLERY_BG_BRUSH ".uno:BackgroundImage" +#define CMD_SID_BACKSPACE ".uno:Backspace" +#define CMD_SID_BASICBREAK ".uno:BasicBreak" +#define CMD_SID_BASICIDE_APPEAR ".uno:BasicIDEAppear" +#define CMD_SID_BASICSTEPINTO ".uno:BasicStepInto" +#define CMD_SID_BASICSTEPOUT ".uno:BasicStepOut" +#define CMD_SID_BASICSTEPOVER ".uno:BasicStepOver" +#define CMD_SID_BASICSTOP ".uno:BasicStop" +#define CMD_SID_BROWSER ".uno:Beamer" +#define CMD_SID_BASICIDE_BRKPNTSCHANGED ".uno:BreakPointsChanged" +#define CMD_SID_BROWSE_BACKWARD ".uno:BrowseBackward" +#define CMD_SID_BROWSE_FORWARD ".uno:BrowseForward" +#define CMD_SID_BROWSER_MODE ".uno:BrowseView" +#define CMD_SID_BUILD_VERSION ".uno:BuildVersion" +#define CMD_SID_CAPTION ".uno:Caption" +#define CMD_SID_STYLE_FAMILY1 ".uno:CharStyle" +#define CMD_SID_CHECK_KEY ".uno:CheckKey" +#define CMD_SID_BASICIDE_CHOOSEMACRO ".uno:ChooseMacro" +#define CMD_SID_CLEARHISTORY ".uno:ClearHistory" +#define CMD_SID_CLOSEWINS ".uno:CloseWins" +#define CMD_SID_CLOSEDOCS ".uno:CloseDocs" +#define CMD_SID_CLOSEDOC ".uno:CloseDoc" +#define CMD_SID_CLOSEWIN ".uno:CloseWin" +#define CMD_SID_CLOSING ".uno:Closing" +#define CMD_SID_DOCINFO_COMMENTS ".uno:Comments" +#define CMD_SID_OFFICE_COMMERCIAL_USE ".uno:CommercialUse" +#define CMD_SID_DOCUMENT_COMPARE ".uno:CompareDocuments" +#define CMD_SID_BASICCOMPILE ".uno:CompileBasic" +#define CMD_SID_CONFIG ".uno:ConfigureDialog" +#define CMD_SID_CONTEXT ".uno:Context" +#define CMD_SID_COPY ".uno:Copy" +#define CMD_SID_CRASH ".uno:Crash" +#define CMD_SID_BASICIDE_CREATEMACRO ".uno:CreateMacro" +#define CMD_SID_CURRENT_URL ".uno:CurrentURL" +#define CMD_SID_CURSORENDOFSCREEN ".uno:CursorEndOfScreen" +#define CMD_SID_CURSORTOPOFSCREEN ".uno:CursorTopOfScreen" +#define CMD_SID_OFFICE_CUSTOMERNUMBER ".uno:CustomerNumber" +#define CMD_SID_CUT ".uno:Cut" +#define CMD_SID_DEFAULTFILEPATH ".uno:DefaultFilePath" +#define CMD_SID_DEFAULTFILENAME ".uno:DefaultFileName" +#define CMD_SID_DELETE ".uno:Delete" +#define CMD_SID_BASICIDE_DELETECURRENT ".uno:DeleteCurrent" +#define CMD_SID_STYLE_DELETE ".uno:DeleteStyle" +#define CMD_SID_STYLE_DESIGNER ".uno:DesignerDialog" +#define CMD_SID_STYLE_DRAGHIERARCHIE ".uno:DragHierarchy" +#define CMD_SID_EDITDOC ".uno:EditDoc" +#define CMD_SID_BASICIDE_EDITMACRO ".uno:EditMacro" +#define CMD_SID_STYLE_EDIT ".uno:EditStyle" +#define CMD_FID_SEARCH_NOW ".uno:ExecuteSearch" +#define CMD_SID_EXTENDEDHELP ".uno:ExtendedHelp" +#define CMD_SID_FILE_NAME ".uno:FileName" +#define CMD_SID_FOCUSURLBOX ".uno:FocusUrlBox" +#define CMD_SID_FORMATMENU ".uno:FormatMenu" +#define CMD_SID_STYLE_FAMILY3 ".uno:FrameStyle" +#define CMD_SID_FRAMETITLE ".uno:FrameTitle" +#define CMD_SID_PROGFILENAME ".uno:FullName" +#define CMD_SID_DOCFULLNAME ".uno:FullName" +#define CMD_SID_WIN_FULLSCREEN ".uno:FullScreen" +#define CMD_SID_FILLFRAME ".uno:GetFrameWindow" +#define CMD_SID_CURSORDOWN ".uno:GoDown" +#define CMD_SID_CURSORPAGEDOWN ".uno:GoDownBlock" +#define CMD_SID_CURSORPAGEDOWN_SEL ".uno:GoDownBlockSel" +#define CMD_SID_CURSORDOWN_SEL ".uno:GoDownSel" +#define CMD_SID_CURSORLEFT ".uno:GoLeft" +#define CMD_SID_CURSORPAGELEFT ".uno:GoLeftBlock" +#define CMD_SID_CURSORPAGELEFT_SEL ".uno:GoLeftBlockSel" +#define CMD_SID_CURSORLEFT_SEL ".uno:GoLeftSel" +#define CMD_SID_CURSORRIGHT ".uno:GoRight" +#define CMD_SID_CURSORRIGHT_SEL ".uno:GoRightSel" +#define CMD_SID_CURSORENDOFFILE ".uno:GoToEndOfData" +#define CMD_SID_CURSORENDOFFILE_SEL ".uno:GoToEndOfDataSel" +#define CMD_SID_CURSOREND ".uno:GoToEndOfRow" +#define CMD_SID_CURSOREND_SEL ".uno:GoToEndOfRowSel" +#define CMD_SID_CURSORTOPOFFILE ".uno:GoToStart" +#define CMD_SID_CURSORHOME ".uno:GoToStartOfRow" +#define CMD_SID_CURSORHOME_SEL ".uno:GoToStartOfRowSel" +#define CMD_SID_CURSORTOPOFFILE_SEL ".uno:GoToStartSel" +#define CMD_SID_CURSORUP ".uno:GoUp" +#define CMD_SID_CURSORPAGEUP ".uno:GoUpBlock" +#define CMD_SID_CURSORPAGEUP_SEL ".uno:GoUpBlockSel" +#define CMD_SID_CURSORUP_SEL ".uno:GoUpSel" +#define CMD_SID_HELP_ANNOTATE ".uno:HelpAnnotate" +#define CMD_SID_HELP_BOOKMARK ".uno:HelpBookmark" +#define CMD_SID_HELP_HELPFILEBOX ".uno:HelpChooseFile" +#define CMD_SID_HELP_DOWNLOAD ".uno:HelpDownload" +#define CMD_SID_HELP_PI ".uno:HelperDialog" +#define CMD_SID_HELPINDEX ".uno:HelpIndex" +#define CMD_SID_HELPMENU ".uno:HelpMenu" +#define CMD_SID_HELPONHELP ".uno:HelpOnHelp" +#define CMD_SID_HELP_SEARCH ".uno:HelpSearch" +#define CMD_SID_HELPTIPS ".uno:HelpTip" +#define CMD_SID_HELP_ZOOMIN ".uno:HelpZoomIn" +#define CMD_SID_HELP_ZOOMOUT ".uno:HelpZoomOut" +#define CMD_SID_BASICIDE_HIDECURPAGE ".uno:HideCurPage" +#define CMD_SID_HYPERLINK_DIALOG ".uno:HyperlinkDialog" +#define CMD_SID_INSERTDOC ".uno:InsertDoc" +#define CMD_SID_HYPERLINK_INSERT ".uno:InsertHyperlink" +#define CMD_SID_INSERT_FLOATINGFRAME ".uno:InsertObjectFloatingFrame" +#define CMD_SID_INTERNET_ONLINE ".uno:InternetOnline" +#define CMD_SID_INTERNET_SEARCH ".uno:InternetSearch" +#define CMD_SID_DOC_LOADING ".uno:IsLoading" +#define CMD_SID_IMG_LOADING ".uno:IsLoadingImages" +#define CMD_SID_PRINTOUT ".uno:IsPrinting" +#define CMD_SID_JUMPTOMARK ".uno:JumpToMark" +#define CMD_SID_DOCINFO_KEYWORDS ".uno:Keywords" +#define CMD_SID_BASICIDE_LIBLOADED ".uno:LibLoaded" +#define CMD_SID_BASICIDE_LIBREMOVED ".uno:LibRemoved" +#define CMD_SID_BASICIDE_LIBSELECTED ".uno:LibSelect" +#define CMD_SID_BASICIDE_LIBSELECTOR ".uno:LibSelector" +#define CMD_SID_OFFICE_PLK ".uno:LicenceKey" +#define CMD_SID_CONFIGACCEL ".uno:LoadAccel" +#define CMD_SID_BASICLOAD ".uno:LoadBasic" +#define CMD_SID_LOADCONFIG ".uno:LoadConfiguration" +#define CMD_SID_CONFIGEVENT ".uno:LoadEvents" +#define CMD_SID_CONFIGMENU ".uno:LoadMenu" +#define CMD_SID_CONFIGSTATUSBAR ".uno:LoadStatusBar" +#define CMD_SID_TOOLBOXOPTIONS ".uno:LoadToolBox" +#define CMD_SID_LOGOUT ".uno:Logout" +#define CMD_SID_SCRIPTORGANIZER ".uno:ScriptOrganizer" +#define CMD_SID_MACROORGANIZER ".uno:MacroOrganizer" +#define CMD_SID_RUNMACRO ".uno:RunMacro" +#define CMD_SID_BASICCHOOSER ".uno:MacroDialog" +#define CMD_SID_MAIL_NOTIFY ".uno:MailReceipt" +#define CMD_SID_MAIL_CHILDWIN ".uno:MailWindow" +#define CMD_SID_BASICIDE_MATCHGROUP ".uno:MatchGroup" +#define CMD_SID_TOGGLE_MENUBAR ".uno:MenuBarVisible" +#define CMD_SID_DOCUMENT_MERGE ".uno:MergeDocuments" +#define CMD_SID_ATTR_METRIC ".uno:MetricUnit" +#define CMD_SID_MODIFIED ".uno:Modified" +#define CMD_SID_DOC_MODIFIED ".uno:ModifiedStatus" +#define CMD_SID_BASICIDE_MODULEDLG ".uno:ModuleDialog" +#define CMD_SID_BASICIDE_NAMECHANGEDONTAB ".uno:NameChangedOnTab" +#define CMD_SID_NAVIGATOR ".uno:Navigator" +#define CMD_SID_RESTORE_EDITING_VIEW ".uno:RestoreEditingView" +#define CMD_SID_BASICIDE_NEWDIALOG ".uno:NewDialog" +#define CMD_SID_BASICIDE_NEWMODULE ".uno:NewModule" +#define CMD_SID_CREATE_BASICOBJECT ".uno:NewObject" +#define CMD_SID_STYLE_NEW ".uno:NewStyle" +#define CMD_SID_NEWWINDOW ".uno:NewWindow" +#define CMD_SID_BASICIDE_OBJCAT ".uno:ObjectCatalog" +#define CMD_SID_OBJECT ".uno:ObjectMenue" +#define CMD_SID_OLD_PALK ".uno:OldPALK" +#define CMD_SID_OPENDOC ".uno:Open" +#define CMD_SID_WEBHTML ".uno:WebHtml" +#define CMD_SID_OPENHYPERLINK ".uno:OpenHyperlink" +#define CMD_SID_DOCINFO_TITLE ".uno:DocInfoTitle" +#define CMD_SID_OPENTEMPLATE ".uno:OpenTemplate" +#define CMD_SID_OPENURL ".uno:OpenUrl" +#define CMD_SID_OPTIONS ".uno:Options" +#define CMD_SID_ORGANIZER ".uno:Organizer" +#define CMD_SID_STYLE_FAMILY4 ".uno:PageStyle" +#define CMD_SID_STYLE_FAMILY2 ".uno:ParaStyle" +#define CMD_SID_PARTWIN ".uno:PartWindow" +#define CMD_SID_PASTE ".uno:Paste" +#define CMD_SID_CLIPBOARD_FORMAT_ITEMS ".uno:ClipboardFormatItems" +#define CMD_SID_PASTE_SPECIAL ".uno:PasteSpecial" +#define CMD_SID_DOCPATH ".uno:DocPath" +#define CMD_SID_PICKLIST ".uno:PickList" +#define CMD_SID_PLUGINS_ACTIVE ".uno:PlugInsActive" +#define CMD_SID_PRINTDOC ".uno:Print" +#define CMD_SID_PRINTDOCDIRECT ".uno:PrintDefault" +#define CMD_SID_PRINTER_NAME ".uno:Printer" +#define CMD_SID_SETUPPRINTER ".uno:PrinterSetup" +#define CMD_SID_PRINTPREVIEW ".uno:PrintPreview" +#define CMD_SID_OFFICE_PRIVATE_USE ".uno:PrivateUse" +#define CMD_SID_DOCINFO ".uno:SetDocumentProperties" +#define CMD_SID_QUITAPP ".uno:Quit" +#define CMD_SID_DOC_READONLY ".uno:ReadOnly" +#define CMD_SID_RECORDMACRO ".uno:MacroRecorder" +#define CMD_SID_STOP_RECORDING ".uno:StopRecording" +#define CMD_SID_RECORDING_FLOATWINDOW ".uno:MacroRecordingFloat" +#define CMD_SID_REDO ".uno:Redo" +#define CMD_SID_DELETE_BASICOBJECT ".uno:ReleaseObject" +#define CMD_SID_RELOAD ".uno:Reload" +#define CMD_SID_BASICIDE_REMOVEWATCH ".uno:RemoveWatch" +#define CMD_SID_BASICIDE_RENAMECURRENT ".uno:RenameCurrent" +#define CMD_SID_REPAINT ".uno:Repaint" +#define CMD_SID_REPEAT ".uno:RepeatAction" +#define CMD_SID_RUBY_DIALOG ".uno:RubyDialog" +#define CMD_SID_BASICRUN ".uno:RunBasic" +#define CMD_SID_SAVEDOC ".uno:Save" +#define CMD_SID_SAVEDOCS ".uno:SaveAll" +#define CMD_SID_SAVEASDOC ".uno:SaveAs" +#define CMD_SID_DOCTEMPLATE ".uno:SaveAsTemplate" +#define CMD_SID_BASICSAVEAS ".uno:SaveBasicAs" +#define CMD_SID_EXPORT_DIALOG ".uno:ExportDialog" +#define CMD_SID_IMPORT_DIALOG ".uno:ImportDialog" +#define CMD_SID_SAVECONFIG ".uno:SaveConfiguration" +#define CMD_SID_DOC_SAVED ".uno:Saved" +#define CMD_SID_BASICIDE_SBXDELETED ".uno:SbxDeleted" +#define CMD_SID_BASICIDE_SBXINSERTED ".uno:SbxInserted" +#define CMD_SID_BASICIDE_SBXRENAMED ".uno:SbxRenamed" +#define CMD_SID_MAIL_SCROLLBODY_PAGEDOWN ".uno:ScrollBodyPageDown" +#define CMD_SID_SEARCH_DLG ".uno:SearchDialog" +#define CMD_SID_SEARCH_OPTIONS ".uno:SearchOptions" +#define CMD_SID_SEARCH_ITEM ".uno:SearchProperties" +#define CMD_SID_SELECTALL ".uno:SelectAll" +#define CMD_FN_FAX ".uno:SendFax" +#define CMD_SID_MAIL_SENDDOC ".uno:SendMail" +#define CMD_SID_MAIL_SENDDOCASPDF ".uno:SendMailDocAsPDF" +#define CMD_SID_MAIL_SENDDOCASFORMAT ".uno:SendMailDocAsFormat" +#define CMD_SID_MAIL_SENDDOCASMS ".uno:SendMailDocAsMS" +#define CMD_SID_MAIL_SENDDOCASOOO ".uno:SendMailDocAsOOo" +#define CMD_SID_SETOPTIONS ".uno:SetOptions" +#define CMD_SID_OFFICE_PALK ".uno:SetPALK" +#define CMD_SID_SHOW_BROWSER ".uno:ShowBrowser" +#define CMD_SID_SHOWPOPUPS ".uno:ShowPopups" +#define CMD_SID_BASICIDE_SHOWSBX ".uno:ShowSbx" +#define CMD_SID_SOURCEVIEW ".uno:SourceView" +#define CMD_SID_ONLINE_REGISTRATION_DLG ".uno:StartRegistrationDialog" +#define CMD_SID_STATUSBARTEXT ".uno:StatusBar" +#define CMD_SID_TOGGLESTATUSBAR ".uno:StatusBarVisible" +#define CMD_SID_BASICIDE_STAT_DATE ".uno:StatusGetDate" +#define CMD_SID_BASICIDE_STAT_POS ".uno:StatusGetPosition" +#define CMD_SID_BASICIDE_STAT_TITLE ".uno:StatusGetTitle" +#define CMD_SID_BASICIDE_STOREALLMODULESOURCES ".uno:StoreAllModuleSources" +#define CMD_SID_BASICIDE_STOREMODULESOURCE ".uno:StoreModuleSource" +#define CMD_SID_STYLE_APPLY ".uno:StyleApplyState" +#define CMD_SID_STYLE_CATALOG ".uno:StyleCatalog" +#define CMD_SID_STYLE_NEW_BY_EXAMPLE ".uno:StyleNewByExample" +#define CMD_SID_STYLE_UPDATE_BY_EXAMPLE ".uno:StyleUpdateByExample" +#define CMD_SID_STYLE_WATERCAN ".uno:StyleWatercanMode" +#define CMD_SID_VIEWSHELL ".uno:SwitchViewShell" +#define CMD_SID_TASKBAR ".uno:TaskBarVisible" +#define CMD_SID_STYLE_FAMILY5 ".uno:ListStyle" +#define CMD_SID_TIPWINDOW ".uno:TipsDialog" +#define CMD_SID_DOCTITLE ".uno:Title" +#define CMD_SID_TITLE ".uno:Title" +#define CMD_SID_BASICIDE_TOGGLEBRKPNT ".uno:ToggleBreakPoint" +#define CMD_SID_BASICIDE_SHOWWINDOW ".uno:BasicIDEShowWindow" +#define CMD_SID_UNDO ".uno:Undo" +#define CMD_SID_FORMATPAINTBRUSH ".uno:FormatPaintbrush" +#define CMD_SID_ATTR_UNDO_COUNT ".uno:UndoCount" +#define CMD_SID_BASICIDE_UPDATEALLMODULESOURCES ".uno:UpdateAllModuleSources" +#define CMD_SID_BASICIDE_UPDATEMODULESOURCE ".uno:UpdateModuleSource" +#define CMD_SID_BASICIDE_MANAGEBRKPNTS ".uno:ManageBreakPoints" +#define CMD_SID_BASICIDE_TOGGLEBRKPNTENABLED ".uno:ToggleBreakPointEnabled" +#define CMD_SID_UPDATE_VERSION ".uno:UpdateVersion" +#define CMD_SID_VERSION ".uno:VersionDialog" +#define CMD_SID_SIGNATURE ".uno:Signature" +#define CMD_SID_MACRO_SIGNATURE ".uno:MacroSignature" +#define CMD_SID_VERSION_VISIBLE ".uno:VersionVisible" +#define CMD_SID_VIEW_DATA_SOURCE_BROWSER ".uno:ViewDataSourceBrowser" +#define CMD_SID_WIN_VISIBLE ".uno:WinVisible" +#define CMD_SID_MDIWINDOWLIST ".uno:WindowList" +#define CMD_SID_ZOOM_IN ".uno:ZoomMinus" +#define CMD_SID_ZOOM ".uno:Zooming" +#define CMD_SID_ZOOM_NEXT ".uno:ZoomNext" +#define CMD_SID_ZOOM_OUT ".uno:ZoomPlus" +#define CMD_SID_ZOOM_PREV ".uno:ZoomPrevious" +#define CMD_SID_ZOOM_TOOLBOX ".uno:ZoomToolBox" +#define CMD_SID_EXPORTDOC ".uno:ExportTo" +#define CMD_SID_EXPORTDOCASPDF ".uno:ExportToPDF" +#define CMD_SID_DIRECTEXPORTDOCASPDF ".uno:ExportDirectToPDF" +#define CMD_SID_IMAGE_ORIENTATION ".uno:ImageOrientation" +#define CMD_SID_SAVE_VERSION_ON_CLOSE ".uno:SaveVersionOnClose" +#define CMD_SID_ADDONS ".uno:Addons" +#define CMD_SID_SHOW_IME_STATUS_WINDOW ".uno:ShowImeStatusWindow" +#define CMD_SID_UPDATE_CONFIG ".uno:UpdateConfiguration" +#define CMD_SID_HELP_SUPPORTPAGE ".uno:HelpSupport" +#define CMD_SID_HELP_TUTORIALS ".uno:HelpTutorials" +#define CMD_SID_ADDONHELP ".uno:AddonHelp" +#define CMD_SID_FORMATMENUSTATE ".uno:FormatMenuState" +#define CMD_SID_INET_DLG ".uno:InternetDialog" +#define CMD_SID_ONLINE_REGISTRATION ".uno:OnlineRegistrationDlg" +#define CMD_SID_OFFICE_CHECK_PLZ ".uno:CheckPLZ" +#define CMD_SID_ADDRESS_DATA_SOURCE ".uno:AutoPilotAddressDataSource" +#define CMD_FN_BUSINESS_CARD ".uno:InsertBusinessCard" +#define CMD_FN_LABEL ".uno:InsertLabels" +#define CMD_FN_XFORMS_INIT ".uno:NewXForms" +#define CMD_SID_SD_AUTOPILOT ".uno:AutoPilotPresentations" +#define CMD_SID_NEWSD ".uno:NewPresentation" +#define CMD_SID_COMP_BIBLIOGRAPHY ".uno:BibliographyComponent" +#define CMD_SID_MINIMIZED ".uno:Minimized" +#define CMD_SID_AUTO_CORRECT_DLG ".uno:AutoCorrectDlg" +#define CMD_SID_OPTIONS_TREEDIALOG ".uno:OptionsTreeDialog" +#define CMD_SID_TERMINATE_INPLACEACTIVATION ".uno:TerminateInplaceActivation" +#define CMD_SID_RECENTFILELIST ".uno:RecentFileList" +#define CMD_SID_AVAILABLE_TOOLBARS ".uno:AvailableToolbars" +#define CMD_SID_AVMEDIA_PLAYER ".uno:AVMediaPlayer" +#define CMD_SID_INSERT_AVMEDIA ".uno:InsertAVMedia" +#define CMD_SID_MORE_DICTIONARIES ".uno:MoreDictionaries" +#define CMD_SID_ACTIVATE_STYLE_APPLY ".uno:ActivateStyleApply" +#define CMD_SID_DOCKWIN_0 ".uno:DockingWindow0" +#define CMD_SID_DOCKWIN_1 ".uno:DockingWindow1" +#define CMD_SID_DOCKWIN_2 ".uno:DockingWindow2" +#define CMD_SID_DOCKWIN_3 ".uno:DockingWindow3" +#define CMD_SID_DOCKWIN_4 ".uno:DockingWindow4" +#define CMD_SID_DOCKWIN_5 ".uno:DockingWindow5" +#define CMD_SID_DOCKWIN_6 ".uno:DockingWindow6" +#define CMD_SID_DOCKWIN_7 ".uno:DockingWindow7" +#define CMD_SID_DOCKWIN_8 ".uno:DockingWindow8" +#define CMD_SID_DOCKWIN_9 ".uno:DockingWindow9" +#define CMD_SID_PASTE_UNFORMATTED ".uno:PasteUnformatted" + +#endif diff --git a/sfx2/inc/sfx2/sfxsids.hrc b/sfx2/inc/sfx2/sfxsids.hrc index b5dd2623ae35..f5cd82376c72 100644 --- a/sfx2/inc/sfx2/sfxsids.hrc +++ b/sfx2/inc/sfx2/sfxsids.hrc @@ -520,41 +520,29 @@ #define SID_CURSORTOPOFSCREEN (SID_SFX_START + 744) #define SID_CURSORHOME (SID_SFX_START + 745) #define SID_CURSOREND (SID_SFX_START + 746) -#define SID_SCROLLDOWN (SID_SFX_START + 751) -#define SID_SCROLLUP (SID_SFX_START + 752) #define SID_FORMATMENU (SID_SFX_START + 780) #define SID_OBJECTMENU0 SID_FORMATMENU #define SID_OBJECTMENU1 (SID_SFX_START + 781) #define SID_OBJECTMENU2 (SID_SFX_START + 782) #define SID_OBJECTMENU3 (SID_SFX_START + 783) #define SID_OBJECTMENU_LAST SID_OBJECTMENU3 -#define SID_EDITMENU (SID_SFX_START + 790) #define SID_FORMATMENUSTATE (SID_SFX_START + 791) // default-ids for macros #define SID_RECORDING_FLOATWINDOW (SID_SFX_START + 800) #define SID_RECORDMACRO (SID_SFX_START + 1669) -#define SID_PLAYMACRO (SID_SFX_START + 801) -#define SID_EDITMACRO (SID_SFX_START + 802) -#define SID_MACROLIBMANAGER (SID_SFX_START + 803) -#define SID_LOADMACROLIB (SID_SFX_START + 804) -#define SID_RELEASEMACROLIB (SID_SFX_START + 805) -#define SID_BASICNAME (SID_SFX_START + 806) -#define SID_LIBNAME (SID_SFX_START + 807) -#define SID_MODULENAME (SID_SFX_START + 808) -#define SID_STATEMENT (SID_SFX_START + 810) + // FREE: SID_SFX_START + 801 + // FREE: SID_SFX_START + 802 + // FREE: SID_SFX_START + 803 + // FREE: SID_SFX_START + 804 + // FREE: SID_SFX_START + 805 + // FREE: SID_SFX_START + 806 + // FREE: SID_SFX_START + 807 + // FREE: SID_SFX_START + 808 + // FREE: SID_SFX_START + 809 + // FREE: SID_SFX_START + 810 #define SID_ASYNCHRON (SID_SFX_START + 811) -#define SID_START_APP (SID_SFX_START + 820) -#define SID_START_BEGIN (SID_SFX_START + 821) -#define SID_STARTSW SID_START_BEGIN -#define SID_STARTSC (SID_START_BEGIN + 1) -#define SID_STARTSD (SID_START_BEGIN + 2) -#define SID_STARTSIM (SID_START_BEGIN + 3) -#define SID_STARTSCH (SID_START_BEGIN + 4) -#define SID_STARTSMA (SID_START_BEGIN + 5) -#define SID_START_END SID_STARTSMA - // default-ids for configuration #define SID_RESTOREMENU (SID_SFX_START + 901) #define SID_RESTOREACCELS (SID_SFX_START + 902) @@ -620,11 +608,9 @@ #define SID_OBJECTRESIZE (SID_SFX_START + 1000) #define SID_INSERT_TEXT (SID_SFX_START + 1001) -#define SID_MACRO_START (SID_SFX_START + 1002) -#define SID_MACRO_END (SID_SFX_START + 1100) -#define SID_EVENTCONFIG (SID_MACRO_END + 1) -#define SID_VERB_START (SID_MACRO_END + 2) -#define SID_VERB_END (SID_MACRO_END + 21) +#define SID_EVENTCONFIG (SID_SFX_START + 1101) +#define SID_VERB_START (SID_SFX_START + 1100) +#define SID_VERB_END (SID_SFX_START + 1121) #define SID_BROWSER_TASK (SID_MACRO_END + 22) diff --git a/sfx2/inc/sfx2/shell.hxx b/sfx2/inc/sfx2/shell.hxx index 314c16fdbf1f..4d93a7b422aa 100644 --- a/sfx2/inc/sfx2/shell.hxx +++ b/sfx2/inc/sfx2/shell.hxx @@ -65,12 +65,16 @@ class SfxShellSubObject; class SfxDispatcher; class SfxViewFrame; class SfxSlot; -class SfxUndoManager; class SfxRepeatTarget; class SbxVariable; class SbxBase; class SfxBindings; +namespace svl +{ + class IUndoManager; +} + //==================================================================== enum SfxInterfaceId @@ -162,7 +166,7 @@ class SFX2_DLLPUBLIC SfxShell: public SfxBroadcaster SfxShell_Impl* pImp; SfxItemPool* pPool; - SfxUndoManager* pUndoMgr; + ::svl::IUndoManager* pUndoMgr; private: SfxShell( const SfxShell & ); // n.i. @@ -212,8 +216,9 @@ public: inline SfxItemPool& GetPool() const; inline void SetPool( SfxItemPool *pNewPool ) ; - virtual SfxUndoManager* GetUndoManager(); - void SetUndoManager( SfxUndoManager *pNewUndoMgr ); + virtual ::svl::IUndoManager* + GetUndoManager(); + void SetUndoManager( ::svl::IUndoManager *pNewUndoMgr ); SfxRepeatTarget* GetRepeatTarget() const; void SetRepeatTarget( SfxRepeatTarget *pTarget ); diff --git a/sfx2/inc/sfx2/viewsh.hxx b/sfx2/inc/sfx2/viewsh.hxx index ee8dfb1ca57c..d19b5b04b04d 100644 --- a/sfx2/inc/sfx2/viewsh.hxx +++ b/sfx2/inc/sfx2/viewsh.hxx @@ -214,6 +214,7 @@ public: virtual String GetSelectionText( BOOL bCompleteWords = FALSE ); virtual BOOL HasSelection( BOOL bText = TRUE ) const; virtual SdrView* GetDrawView() const; + void SetSubShell( SfxShell *pShell ); SfxShell* GetSubShell() const { return pSubShell; } void AddSubShell( SfxShell& rShell ); diff --git a/sfx2/prj/build.lst b/sfx2/prj/build.lst index 1e471312c6cf..f8e01c7bcf05 100644 --- a/sfx2/prj/build.lst +++ b/sfx2/prj/build.lst @@ -1,31 +1,26 @@ -sf sfx2 : l10n idl basic xmlscript framework readlicense_oo shell setup_native sax SYSTRAY_GTK:libegg LIBXML2:libxml2 NULL -sf sfx2 usr1 - all sf_mkout NULL -sf sfx2\inc nmake - all sf_inc NULL -sf sfx2\prj get - all sf_prj NULL -sf sfx2\mac\res get - all sf_mres NULL -sf sfx2\source\inc get - all sf_sinc NULL -sf sfx2\sdi nmake - all sf_sdi NULL -sf sfx2\source\appl nmake - all sf_appl sf_sdi sf_inc NULL -sf sfx2\source\view nmake - all sf_view sf_sdi sf_inc NULL -sf sfx2\source\bastyp nmake - all sf_bast sf_sdi sf_inc NULL -sf sfx2\source\config nmake - all sf_cnfg sf_sdi sf_inc NULL -sf sfx2\source\control nmake - all sf_ctrl sf_sdi sf_inc NULL -sf sfx2\source\dialog nmake - all sf_dlg sf_sdi sf_inc NULL -sf sfx2\source\doc nmake - all sf_doc sf_sdi sf_inc NULL -sf sfx2\source\layout nmake - all sf_layout sf_sdi sf_inc NULL -sf sfx2\source\menu nmake - all sf_menu sf_sdi sf_inc NULL -sf sfx2\source\notify nmake - all sf_noti sf_sdi sf_inc NULL -sf sfx2\source\statbar nmake - all sf_sbar sf_sdi sf_inc NULL -sf sfx2\source\toolbox nmake - all sf_tbox sf_sdi sf_inc NULL -sf sfx2\source\inet nmake - all sf_inet sf_sdi sf_inc NULL -sf sfx2\source\explorer nmake - all sf_expl sf_sdi sf_inc NULL -sf sfx2\workben\custompanel nmake - all sf_wb_custompanel NULL -sf sfx2\util nmake - all sf_util sf_appl sf_bast sf_cnfg sf_ctrl sf_dlg sf_doc sf_expl sf_inet sf_menu sf_layout sf_noti sf_sbar sf_tbox sf_view NULL -sf sfx2\qa\unoapi nmake - all sf_qa_unoapi NULL -sf sfx2\qa\cppunit nmake - all sf_qa_cppunit sf_util NULL - -# fails on unxsoli4 -# sf sfx2\qa\complex\standalonedocumentinfo nmake - all sf_qa_complex_standalonedocumentinfo sf_util NULL - -# sf sfx2\qa\complex\framework nmake - all sf_qa_complex_framework sf_qa_complex_framework_dochelper NULL -# sf sfx2\qa\complex\docinfo nmake - all sf_qa_complex_docinfo sf_util NULL +sf sfx2 : l10n idl basic xmlscript framework readlicense_oo shell setup_native sax SYSTRAY_GTK:libegg LIBXML2:libxml2 test NULL +sf sfx2 usr1 - all sf_mkout NULL +sf sfx2\inc nmake - all sf_inc NULL +sf sfx2\prj get - all sf_prj NULL +sf sfx2\mac\res get - all sf_mres NULL +sf sfx2\source\inc get - all sf_sinc NULL +sf sfx2\sdi nmake - all sf_sdi NULL +sf sfx2\source\appl nmake - all sf_appl sf_sdi sf_inc NULL +sf sfx2\source\view nmake - all sf_view sf_sdi sf_inc NULL +sf sfx2\source\bastyp nmake - all sf_bast sf_sdi sf_inc NULL +sf sfx2\source\config nmake - all sf_cnfg sf_sdi sf_inc NULL +sf sfx2\source\control nmake - all sf_ctrl sf_sdi sf_inc NULL +sf sfx2\source\dialog nmake - all sf_dlg sf_sdi sf_inc NULL +sf sfx2\source\doc nmake - all sf_doc sf_sdi sf_inc NULL +sf sfx2\source\layout nmake - all sf_layout sf_sdi sf_inc NULL +sf sfx2\source\menu nmake - all sf_menu sf_sdi sf_inc NULL +sf sfx2\source\notify nmake - all sf_noti sf_sdi sf_inc NULL +sf sfx2\source\statbar nmake - all sf_sbar sf_sdi sf_inc NULL +sf sfx2\source\toolbox nmake - all sf_tbox sf_sdi sf_inc NULL +sf sfx2\source\inet nmake - all sf_inet sf_sdi sf_inc NULL +sf sfx2\source\explorer nmake - all sf_expl sf_sdi sf_inc NULL +sf sfx2\workben\custompanel nmake - all sf_wb_custompanel NULL +sf sfx2\util nmake - all sf_util sf_appl sf_bast sf_cnfg sf_ctrl sf_dlg sf_doc sf_expl sf_inet sf_menu sf_layout sf_noti sf_sbar sf_tbox sf_view NULL +sf sfx2\qa\unoapi nmake - all sf_qa_unoapi NULL +sf sfx2\qa\cppunit nmake - all sf_qa_cppunit sf_util NULL +sf sfx2\qa\complex\sfx2 nmake - all sf_qa_complex_docinfo sf_util NULL diff --git a/sfx2/qa/complex/docinfo/makefile.mk b/sfx2/qa/complex/docinfo/makefile.mk deleted file mode 100644 index 626b648a6d06..000000000000 --- a/sfx2/qa/complex/docinfo/makefile.mk +++ /dev/null @@ -1,63 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -.IF "$(OOO_SUBSEQUENT_TESTS)" == "" -nothing .PHONY: -.ELSE - -PRJ = ../../.. -PRJNAME = sfx2 -TARGET = qa_complex_docinfo - -.IF "$(OOO_JUNIT_JAR)" != "" -PACKAGE = complex/docinfo -JAVATESTFILES = \ - DocumentProperties.java - -JAVAFILES = $(JAVATESTFILES) - - -JARFILES = OOoRunner.jar ridl.jar test.jar unoil.jar -EXTRAJARFILES = $(OOO_JUNIT_JAR) - -# Sample how to debug -# JAVAIFLAGS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=9003,suspend=y - -.END - -.INCLUDE: settings.mk -.INCLUDE: target.mk -.INCLUDE: installationtest.mk - -ALLTAR : javatest - -.END - - - - - diff --git a/sfx2/qa/complex/framework/makefile.mk b/sfx2/qa/complex/framework/makefile.mk deleted file mode 100644 index 325135b9133c..000000000000 --- a/sfx2/qa/complex/framework/makefile.mk +++ /dev/null @@ -1,65 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -.IF "$(OOO_SUBSEQUENT_TESTS)" == "" -nothing .PHONY: -.ELSE - -PRJ = ../../.. -PRJNAME = sfx2 -TARGET = qa_complex_framework - -.IF "$(OOO_JUNIT_JAR)" != "" -PACKAGE = complex/framework -JAVATESTFILES = \ - DocumentPropertiesTest.java \ - DocumentMetadataAccessTest.java \ - CheckGlobalEventBroadcaster_writer1.java - -JAVAFILES = $(JAVATESTFILES) \ - TestDocument.java \ - WriterHelper.java \ - DialogThread.java - - -JARFILES = OOoRunner.jar ridl.jar test.jar unoil.jar -EXTRAJARFILES = $(OOO_JUNIT_JAR) - -# Sample how to debug -# JAVAIFLAGS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=9003,suspend=y - -.END - -.INCLUDE: settings.mk -.INCLUDE: target.mk -.INCLUDE: installationtest.mk - -ALLTAR : javatest - -.END - - diff --git a/sfx2/qa/complex/docinfo/DocumentProperties.java b/sfx2/qa/complex/sfx2/DocumentInfo.java index 0c4eb44c4a35..ca7ae8b1dda0 100644 --- a/sfx2/qa/complex/docinfo/DocumentProperties.java +++ b/sfx2/qa/complex/sfx2/DocumentInfo.java @@ -24,9 +24,9 @@ * for a copy of the LGPLv3 License. * ************************************************************************/ -package complex.docinfo; +package complex.sfx2; -import com.sun.star.beans.*; +import com.sun.star.beans.PropertyAttribute; import com.sun.star.beans.Property; import com.sun.star.beans.PropertyValue; import com.sun.star.beans.XPropertyContainer; @@ -49,22 +49,17 @@ import util.WriterTools; import org.junit.After; import org.junit.AfterClass; -// import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.openoffice.test.OfficeConnection; import static org.junit.Assert.*; -public class DocumentProperties +public class DocumentInfo { - XMultiServiceFactory m_xMSF = null; XTextDocument xTextDoc = null; XTextDocument xTextDocSecond = null; -// public String[] getTestMethodNames() { -// return new String[] {"checkDocInfo", "cleanup"}; -// } @Test public void checkDocInfo() { m_xMSF = getMSF(); @@ -349,14 +344,18 @@ public class DocumentProperties // setup and close connections @BeforeClass public static void setUpConnection() throws Exception { - System.out.println("setUpConnection()"); + System.out.println( "------------------------------------------------------------" ); + System.out.println( "starting class: " + DocumentInfo.class.getName() ); + System.out.println( "------------------------------------------------------------" ); connection.setUp(); } @AfterClass public static void tearDownConnection() throws InterruptedException, com.sun.star.uno.Exception { - System.out.println("tearDownConnection()"); + System.out.println( "------------------------------------------------------------" ); + System.out.println( "finishing class: " + DocumentInfo.class.getName() ); + System.out.println( "------------------------------------------------------------" ); connection.tearDown(); } private static final OfficeConnection connection = new OfficeConnection(); diff --git a/sfx2/qa/complex/framework/DocumentMetadataAccessTest.java b/sfx2/qa/complex/sfx2/DocumentMetadataAccess.java index 3f61cb21b3dd..d145b9028473 100644 --- a/sfx2/qa/complex/framework/DocumentMetadataAccessTest.java +++ b/sfx2/qa/complex/sfx2/DocumentMetadataAccess.java @@ -25,9 +25,27 @@ * ************************************************************************/ -package complex.framework; +package complex.sfx2; // import complexlib.ComplexTestCase; +import com.sun.star.beans.Pair; +import com.sun.star.rdf.Literal; +import com.sun.star.rdf.XLiteral; +import com.sun.star.rdf.XNamedGraph; +import com.sun.star.rdf.BlankNode; +import com.sun.star.rdf.XQuerySelectResult; +import com.sun.star.rdf.XNode; +import com.sun.star.rdf.XDocumentRepository; +import com.sun.star.rdf.XMetadatable; +import com.sun.star.rdf.Statement; +import com.sun.star.rdf.FileFormat; +import com.sun.star.rdf.URIs; +import com.sun.star.rdf.URI; +import com.sun.star.rdf.XDocumentMetadataAccess; +import com.sun.star.rdf.XRepositorySupplier; +import com.sun.star.rdf.XRepository; +import com.sun.star.rdf.XBlankNode; +import com.sun.star.rdf.XURI; import helper.StreamSimulator; import com.sun.star.uno.UnoRuntime; @@ -41,7 +59,6 @@ import com.sun.star.lang.WrappedTargetException; import com.sun.star.lang.WrappedTargetRuntimeException; import com.sun.star.beans.XPropertySet; import com.sun.star.beans.PropertyValue; -import com.sun.star.beans.Pair; import com.sun.star.beans.StringPair; import com.sun.star.container.XEnumerationAccess; import com.sun.star.container.XEnumeration; @@ -51,7 +68,7 @@ import com.sun.star.frame.XStorable; import com.sun.star.text.XTextDocument; import com.sun.star.text.XTextRange; import com.sun.star.text.XText; -import com.sun.star.rdf.*; +import complex.sfx2.tools.TestDocument; import lib.TestParameters; @@ -73,7 +90,7 @@ import static org.junit.Assert.*; * * @author mst */ -public class DocumentMetadataAccessTest +public class DocumentMetadataAccess { XMultiServiceFactory xMSF; XComponentContext xContext; @@ -196,22 +213,22 @@ public class DocumentMetadataAccessTest PropertyValue[] loadProps = new PropertyValue[1]; loadProps[0] = new PropertyValue(); loadProps[0].Name = "Hidden"; - loadProps[0].Value = new Boolean(true); + loadProps[0].Value = true; xComp = util.DesktopTools.openNewDoc(xMSF, "swriter", loadProps); XTextDocument xText = UnoRuntime.queryInterface(XTextDocument.class, xComp); - XRepositorySupplier xRS = UnoRuntime.queryInterface(XRepositorySupplier.class, xComp); - assertNotNull("xRS null", xRS); - XDocumentMetadataAccess xDMA = UnoRuntime.queryInterface(XDocumentMetadataAccess.class, xRS); - assertNotNull("xDMA null", xDMA); - xRep = xRS.getRDFRepository(); + XRepositorySupplier xRepoSupplier = UnoRuntime.queryInterface(XRepositorySupplier.class, xComp); + assertNotNull("xRS null", xRepoSupplier); + XDocumentMetadataAccess xDocMDAccess = UnoRuntime.queryInterface(XDocumentMetadataAccess.class, xRepoSupplier); + assertNotNull("xDMA null", xDocMDAccess); + xRep = xRepoSupplier.getRDFRepository(); assertNotNull("xRep null", xRep); System.out.println("...done"); System.out.println("Checking that new repository is initialized..."); - XURI xBaseURI = (XURI) xDMA; + XURI xBaseURI = (XURI) xDocMDAccess; String baseURI = xBaseURI.getStringValue(); assertNotNull("new: baseURI", xBaseURI ); assertTrue("new: baseURI", !xBaseURI.getStringValue().equals("")); @@ -235,79 +252,79 @@ public class DocumentMetadataAccessTest XMetadatable xM = (XMetadatable) xTR; try { - xDMA.getElementByURI(null); + xDocMDAccess.getElementByURI(null); fail("getElementByURI: null allowed"); } catch (IllegalArgumentException e) { // ignore } try { - xDMA.getMetadataGraphsWithType(null); + xDocMDAccess.getMetadataGraphsWithType(null); fail("getMetadataGraphsWithType: null URI allowed"); } catch (IllegalArgumentException e) { // ignore } try { - xDMA.addMetadataFile("", new XURI[0]); + xDocMDAccess.addMetadataFile("", new XURI[0]); fail("addMetadataFile: empty filename allowed"); } catch (IllegalArgumentException e) { // ignore } try { - xDMA.addMetadataFile("/foo", new XURI[0]); + xDocMDAccess.addMetadataFile("/foo", new XURI[0]); fail("addMetadataFile: absolute filename allowed"); } catch (IllegalArgumentException e) { // ignore } try { - xDMA.addMetadataFile("fo\"o", new XURI[0]); + xDocMDAccess.addMetadataFile("fo\"o", new XURI[0]); fail("addMetadataFile: invalid filename allowed"); } catch (IllegalArgumentException e) { // ignore } try { - xDMA.addMetadataFile("../foo", new XURI[0]); + xDocMDAccess.addMetadataFile("../foo", new XURI[0]); fail("addMetadataFile: filename with .. allowed"); } catch (IllegalArgumentException e) { // ignore } try { - xDMA.addMetadataFile("foo/../../bar", new XURI[0]); + xDocMDAccess.addMetadataFile("foo/../../bar", new XURI[0]); fail("addMetadataFile: filename with nest .. allowed"); } catch (IllegalArgumentException e) { // ignore } try { - xDMA.addMetadataFile("foo/././bar", new XURI[0]); + xDocMDAccess.addMetadataFile("foo/././bar", new XURI[0]); fail("addMetadataFile: filename with nest . allowed"); } catch (IllegalArgumentException e) { // ignore } try { - xDMA.addMetadataFile("content.xml", new XURI[0]); + xDocMDAccess.addMetadataFile("content.xml", new XURI[0]); fail("addMetadataFile: content.xml allowed"); } catch (IllegalArgumentException e) { // ignore } try { - xDMA.addMetadataFile("styles.xml", new XURI[0]); + xDocMDAccess.addMetadataFile("styles.xml", new XURI[0]); fail("addMetadataFile: styles.xml allowed"); } catch (IllegalArgumentException e) { // ignore } try { - xDMA.addMetadataFile("meta.xml", new XURI[0]); + xDocMDAccess.addMetadataFile("meta.xml", new XURI[0]); fail("addMetadataFile: meta.xml allowed"); } catch (IllegalArgumentException e) { // ignore } try { - xDMA.addMetadataFile("settings.xml", new XURI[0]); + xDocMDAccess.addMetadataFile("settings.xml", new XURI[0]); fail("addMetadataFile: settings.xml allowed"); } catch (IllegalArgumentException e) { // ignore } try { - xDMA.importMetadataFile(FileFormat.RDF_XML, null, "foo", + xDocMDAccess.importMetadataFile(FileFormat.RDF_XML, null, "foo", foo, new XURI[0]); fail("importMetadataFile: null stream allowed"); } catch (IllegalArgumentException e) { @@ -317,7 +334,7 @@ public class DocumentMetadataAccessTest final String sEmptyRDF = TestDocument.getUrl("empty.rdf"); try { XInputStream xFooIn = new StreamSimulator(sEmptyRDF, true, param); - xDMA.importMetadataFile(FileFormat.RDF_XML, xFooIn, "", + xDocMDAccess.importMetadataFile(FileFormat.RDF_XML, xFooIn, "", foo, new XURI[0]); fail("importMetadataFile: empty filename allowed"); } catch (IllegalArgumentException e) { @@ -326,7 +343,7 @@ public class DocumentMetadataAccessTest try { XInputStream xFooIn = new StreamSimulator(sEmptyRDF, true, param); - xDMA.importMetadataFile(FileFormat.RDF_XML, xFooIn, "meta.xml", + xDocMDAccess.importMetadataFile(FileFormat.RDF_XML, xFooIn, "meta.xml", foo, new XURI[0]); fail("importMetadataFile: meta.xml filename allowed"); } catch (IllegalArgumentException e) { @@ -335,7 +352,7 @@ public class DocumentMetadataAccessTest try { XInputStream xFooIn = new StreamSimulator(sEmptyRDF, true, param); - xDMA.importMetadataFile(FileFormat.RDF_XML, + xDocMDAccess.importMetadataFile(FileFormat.RDF_XML, xFooIn, "foo", null, new XURI[0]); fail("importMetadataFile: null base URI allowed"); } catch (IllegalArgumentException e) { @@ -344,62 +361,62 @@ public class DocumentMetadataAccessTest try { XInputStream xFooIn = new StreamSimulator(sEmptyRDF, true, param); - xDMA.importMetadataFile(FileFormat.RDF_XML, + xDocMDAccess.importMetadataFile(FileFormat.RDF_XML, xFooIn, "foo", rdf_type, new XURI[0]); fail("importMetadataFile: non-absolute base URI allowed"); } catch (IllegalArgumentException e) { // ignore } try { - xDMA.removeMetadataFile(null); + xDocMDAccess.removeMetadataFile(null); fail("removeMetadataFile: null URI allowed"); } catch (IllegalArgumentException e) { // ignore } try { - xDMA.addContentOrStylesFile(""); + xDocMDAccess.addContentOrStylesFile(""); fail("addContentOrStylesFile: empty filename allowed"); } catch (IllegalArgumentException e) { // ignore } try { - xDMA.addContentOrStylesFile("/content.xml"); + xDocMDAccess.addContentOrStylesFile("/content.xml"); fail("addContentOrStylesFile: absolute filename allowed"); } catch (IllegalArgumentException e) { // ignore } try { - xDMA.addContentOrStylesFile("foo.rdf"); + xDocMDAccess.addContentOrStylesFile("foo.rdf"); fail("addContentOrStylesFile: invalid filename allowed"); } catch (IllegalArgumentException e) { // ignore } try { - xDMA.removeContentOrStylesFile(""); + xDocMDAccess.removeContentOrStylesFile(""); fail("removeContentOrStylesFile: empty filename allowed"); } catch (IllegalArgumentException e) { // ignore } try { - xDMA.loadMetadataFromStorage(null, foo, null); + xDocMDAccess.loadMetadataFromStorage(null, foo, null); fail("loadMetadataFromStorage: null storage allowed"); } catch (IllegalArgumentException e) { // ignore } try { - xDMA.storeMetadataToStorage(null/*, base*/); + xDocMDAccess.storeMetadataToStorage(null/*, base*/); fail("storeMetadataToStorage: null storage allowed"); } catch (IllegalArgumentException e) { // ignore } try { - xDMA.loadMetadataFromMedium(new PropertyValue[0]); + xDocMDAccess.loadMetadataFromMedium(new PropertyValue[0]); fail("loadMetadataFromMedium: empty medium allowed"); } catch (IllegalArgumentException e) { // ignore } try { - xDMA.storeMetadataToMedium(new PropertyValue[0]); + xDocMDAccess.storeMetadataToMedium(new PropertyValue[0]); fail("storeMetadataToMedium: empty medium allowed"); } catch (IllegalArgumentException e) { // ignore @@ -409,26 +426,26 @@ public class DocumentMetadataAccessTest System.out.println("Checking file addition/removal..."); - xDMA.removeContentOrStylesFile(contentPath); + xDocMDAccess.removeContentOrStylesFile(contentPath); xStmtsEnum = xManifest.getStatements(null, null, null); assertTrue("removeContentOrStylesFile (content)", eq(xStmtsEnum, new Statement[] { manifestStmts[0], manifestStmts[2], manifestStmts[4] })); - xDMA.addContentOrStylesFile(contentPath); + xDocMDAccess.addContentOrStylesFile(contentPath); xStmtsEnum = xManifest.getStatements(null, null, null); assertTrue("addContentOrStylesFile (content)", eq(xStmtsEnum, manifestStmts)); - xDMA.removeContentOrStylesFile(stylesPath); + xDocMDAccess.removeContentOrStylesFile(stylesPath); xStmtsEnum = xManifest.getStatements(null, null, null); assertTrue("removeContentOrStylesFile (styles)", eq(xStmtsEnum, new Statement[] { manifestStmts[0], manifestStmts[1], manifestStmts[3] })); - xDMA.addContentOrStylesFile(stylesPath); + xDocMDAccess.addContentOrStylesFile(stylesPath); xStmtsEnum = xManifest.getStatements(null, null, null); assertTrue("addContentOrStylesFile (styles)", eq(xStmtsEnum, manifestStmts)); @@ -441,19 +458,19 @@ public class DocumentMetadataAccessTest new Statement(xFoo, rdf_type, pkg_MetadataFile, manifest); Statement xM_FooTypeBar = new Statement(xFoo, rdf_type, bar, manifest); - xDMA.addMetadataFile(fooPath, new XURI[] { bar }); + xDocMDAccess.addMetadataFile(fooPath, new XURI[] { bar }); xStmtsEnum = xManifest.getStatements(null, null, null); assertTrue("addMetadataFile", eq(xStmtsEnum, merge(manifestStmts, new Statement[] { xM_BaseHaspartFoo, xM_FooTypeMetadata, xM_FooTypeBar }))); - XURI[] graphsBar = xDMA.getMetadataGraphsWithType(bar); + XURI[] graphsBar = xDocMDAccess.getMetadataGraphsWithType(bar); assertTrue("getMetadataGraphsWithType", graphsBar.length == 1 && eq(graphsBar[0], xFoo)); - xDMA.removeMetadataFile(xFoo); + xDocMDAccess.removeMetadataFile(xFoo); xStmtsEnum = xManifest.getStatements(null, null, null); assertTrue("removeMetadataFile", eq(xStmtsEnum, manifestStmts)); @@ -468,7 +485,7 @@ public class DocumentMetadataAccessTest XURI uri; XMetadatable xMeta; - xMeta = xDMA.getElementByURI(xMeta1); + xMeta = xDocMDAccess.getElementByURI(xMeta1); assertTrue("getElementByURI: null", null != xMeta); String XmlId = xMeta.getMetadataReference().Second; String XmlId1 = xMeta1.getMetadataReference().Second; @@ -483,7 +500,7 @@ public class DocumentMetadataAccessTest fooBarPath); Statement[] metadataStmts = getMetadataFileStmts(xBaseURI, fooBarPath); - xDMA.addMetadataFile(fooBarPath, new XURI[0]); + xDocMDAccess.addMetadataFile(fooBarPath, new XURI[0]); xStmtsEnum = xRep.getStatements(null, null, null); assertTrue("addMetadataFile", eq(xStmtsEnum, merge(manifestStmts, metadataStmts ))); @@ -520,15 +537,15 @@ public class DocumentMetadataAccessTest xStmtsEnum = xRep.getStatements(null, null, null); XURI[] graphs = xRep.getGraphNames(); - xDMA.storeMetadataToMedium(args); + xDocMDAccess.storeMetadataToMedium(args); // this should re-init - xDMA.loadMetadataFromMedium(argsEmptyNoContent); - xRep = xRS.getRDFRepository(); + xDocMDAccess.loadMetadataFromMedium(argsEmptyNoContent); + xRep = xRepoSupplier.getRDFRepository(); assertTrue("xRep null", null != xRep); assertTrue("baseURI still tdoc?", - !baseURI.equals(xDMA.getStringValue())); - Statement[] manifestStmts2 = getManifestStmts((XURI) xDMA); + !baseURI.equals(xDocMDAccess.getStringValue())); + Statement[] manifestStmts2 = getManifestStmts((XURI) xDocMDAccess); xStmtsEnum = xRep.getStatements(null, null, null); // there is no content or styles file in here, so we have just // the package stmt @@ -536,29 +553,29 @@ public class DocumentMetadataAccessTest eq(xStmtsEnum, new Statement[] { manifestStmts2[0] })); // this should re-init - xDMA.loadMetadataFromMedium(argsEmpty); - xRep = xRS.getRDFRepository(); + xDocMDAccess.loadMetadataFromMedium(argsEmpty); + xRep = xRepoSupplier.getRDFRepository(); assertTrue("xRep null", null != xRep); assertTrue("baseURI still tdoc?", - !baseURI.equals(xDMA.getStringValue())); - Statement[] manifestStmts3 = getManifestStmts((XURI) xDMA); + !baseURI.equals(xDocMDAccess.getStringValue())); + Statement[] manifestStmts3 = getManifestStmts((XURI) xDocMDAccess); xStmtsEnum = xRep.getStatements(null, null, null); assertTrue("loadMetadataFromMedium (no metadata)", eq(xStmtsEnum, manifestStmts3)); - xDMA.loadMetadataFromMedium(args); - xRep = xRS.getRDFRepository(); + xDocMDAccess.loadMetadataFromMedium(args); + xRep = xRepoSupplier.getRDFRepository(); assertTrue("xRep null", null != xRep); - Statement[] manifestStmts4 = getManifestStmts((XURI) xDMA); - Statement[] metadataStmts4 = getMetadataFileStmts((XURI) xDMA, + Statement[] manifestStmts4 = getManifestStmts((XURI) xDocMDAccess); + Statement[] metadataStmts4 = getMetadataFileStmts((XURI) xDocMDAccess, fooBarPath); xStmtsEnum = xRep.getStatements(null, null, null); assertTrue("some graph(s) not reloaded", graphs.length == xRep.getGraphNames().length); - XURI xFoobar4 = URI.createNS(xContext, xDMA.getStringValue(), + XURI xFoobar4 = URI.createNS(xContext, xDocMDAccess.getStringValue(), fooBarPath); Statement xFoobar_FooBarFoo4 = new Statement(foo, bar, foo, xFoobar4); @@ -572,7 +589,7 @@ public class DocumentMetadataAccessTest String f = tempDir + "TESTPARA.odt"; - XStorable xStor = UnoRuntime.queryInterface(XStorable.class, xRS); + XStorable xStor = UnoRuntime.queryInterface(XStorable.class, xRepoSupplier); xStor.storeToURL(f, new PropertyValue[0]); @@ -656,17 +673,17 @@ public class DocumentMetadataAccessTest PropertyValue[] loadProps = new PropertyValue[1]; loadProps[0] = new PropertyValue(); loadProps[0].Name = "Hidden"; - loadProps[0].Value = new Boolean(true); + loadProps[0].Value = true; xComp = util.DesktopTools.loadDoc(xMSF, file, loadProps); - XRepositorySupplier xRS = UnoRuntime.queryInterface(XRepositorySupplier.class, xComp); - assertTrue("xRS null", null != xRS); + XRepositorySupplier xRepoSupplier = UnoRuntime.queryInterface(XRepositorySupplier.class, xComp); + assertTrue("xRS null", null != xRepoSupplier); - XDocumentRepository xRep = UnoRuntime.queryInterface(XDocumentRepository.class, xRS.getRDFRepository()); - assertTrue("xRep null", null != xRep); + XDocumentRepository xDocRepository = UnoRuntime.queryInterface(XDocumentRepository.class, xRepoSupplier.getRDFRepository()); + assertTrue("xRep null", null != xDocRepository); XTextDocument xTextDoc = UnoRuntime.queryInterface(XTextDocument.class, xComp); @@ -684,7 +701,7 @@ public class DocumentMetadataAccessTest Statement x_FooBarLit1 = new Statement(foo, bar, mkLit("1"), null); xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); - result = xRep.getStatementRDFa(xPara); + result = xDocRepository.getStatementRDFa(xPara); assertTrue("RDFa: 1", !result.Second && eq(result.First, new Statement[] { @@ -693,7 +710,7 @@ public class DocumentMetadataAccessTest Statement x_FooBarLit2 = new Statement(foo, bar, mkLit("2"), null); xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); - result = xRep.getStatementRDFa(xPara); + result = xDocRepository.getStatementRDFa(xPara); assertTrue("RDFa: 2", !result.Second && eq(result.First, new Statement[] { @@ -703,7 +720,7 @@ public class DocumentMetadataAccessTest Statement x_BlankBarLit3 = new Statement(blank1, bar, mkLit("3"), null); xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); - result = xRep.getStatementRDFa(xPara); + result = xDocRepository.getStatementRDFa(xPara); assertTrue("RDFa: 3", !result.Second && eq(result.First, new Statement[] { @@ -714,7 +731,7 @@ public class DocumentMetadataAccessTest Statement x_BlankBarLit4 = new Statement(blank2, bar, mkLit("4"), null); xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); - result = xRep.getStatementRDFa(xPara); + result = xDocRepository.getStatementRDFa(xPara); assertTrue("RDFa: 4", !result.Second && eq(result.First, new Statement[] { @@ -725,7 +742,7 @@ public class DocumentMetadataAccessTest Statement x_BlankBarLit5 = new Statement(blank1, bar, mkLit("5"), null); xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); - result = xRep.getStatementRDFa(xPara); + result = xDocRepository.getStatementRDFa(xPara); assertTrue("RDFa: 5", !result.Second && eq(result.First, new Statement[] { @@ -741,7 +758,7 @@ public class DocumentMetadataAccessTest Statement x_FooBarLit6 = new Statement(foo, bar, mkLit("6"), null); Statement x_FooBazLit6 = new Statement(foo, baz, mkLit("6"), null); xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); - result = xRep.getStatementRDFa(xPara); + result = xDocRepository.getStatementRDFa(xPara); assertTrue("RDFa: 6", !result.Second && eq(result.First, new Statement[] { @@ -752,7 +769,7 @@ public class DocumentMetadataAccessTest Statement x_FooBazLit7 = new Statement(foo, baz, mkLit("7"), null); Statement x_FooFooLit7 = new Statement(foo, foo, mkLit("7"), null); xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); - result = xRep.getStatementRDFa(xPara); + result = xDocRepository.getStatementRDFa(xPara); assertTrue("RDFa: 7", !result.Second && eq(result.First, new Statement[] { @@ -765,7 +782,7 @@ public class DocumentMetadataAccessTest Statement x_FooBarLittype = new Statement(foo, bar, lit_type, null); xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); - result = xRep.getStatementRDFa(xPara); + result = xDocRepository.getStatementRDFa(xPara); assertTrue("RDFa: 8", result.Second && eq(result.First, new Statement[] { @@ -773,7 +790,7 @@ public class DocumentMetadataAccessTest })); xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); - result = xRep.getStatementRDFa(xPara); + result = xDocRepository.getStatementRDFa(xPara); assertTrue("RDFa: 9", result.Second && eq(result.First, new Statement[] { @@ -781,7 +798,7 @@ public class DocumentMetadataAccessTest })); xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); - result = xRep.getStatementRDFa(xPara); + result = xDocRepository.getStatementRDFa(xPara); assertTrue("RDFa: 10", result.Second && eq(result.First, new Statement[] { @@ -791,7 +808,7 @@ public class DocumentMetadataAccessTest Statement x_FooBarLit11 = new Statement(foo, bar, mkLit("11", bar), null); xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); - result = xRep.getStatementRDFa(xPara); + result = xDocRepository.getStatementRDFa(xPara); assertTrue("RDFa: 11", !result.Second && eq(result.First, new Statement[] { @@ -802,7 +819,7 @@ public class DocumentMetadataAccessTest Statement x_FileBarLit12 = new Statement(xFile, bar, mkLit("12"), null); xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); - result = xRep.getStatementRDFa(xPara); + result = xDocRepository.getStatementRDFa(xPara); assertTrue("RDFa: 12", !result.Second && eq(result.First, new Statement[] { @@ -810,7 +827,7 @@ public class DocumentMetadataAccessTest })); xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); - result = xRep.getStatementRDFa(xPara); + result = xDocRepository.getStatementRDFa(xPara); assertTrue("RDFa: 13", result.Second && eq(result.First, new Statement[] { @@ -820,7 +837,7 @@ public class DocumentMetadataAccessTest Statement x_FooLabelLit14 = new Statement(foo, rdfs_label, mkLit("14"), null); xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); - result = xRep.getStatementRDFa(xPara); + result = xDocRepository.getStatementRDFa(xPara); assertTrue("RDFa: 14", result.Second && eq(result.First, new Statement[] { @@ -828,33 +845,33 @@ public class DocumentMetadataAccessTest })); xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); - result = xRep.getStatementRDFa(xPara); + result = xDocRepository.getStatementRDFa(xPara); assertTrue("RDFa: 15", eq(result.First, new Statement[] { } )); xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); - result = xRep.getStatementRDFa(xPara); + result = xDocRepository.getStatementRDFa(xPara); assertTrue("RDFa: 16", eq(result.First, new Statement[] { } )); xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); - result = xRep.getStatementRDFa(xPara); + result = xDocRepository.getStatementRDFa(xPara); assertTrue("RDFa: 17", eq(result.First, new Statement[] { } )); xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); - result = xRep.getStatementRDFa(xPara); + result = xDocRepository.getStatementRDFa(xPara); assertTrue("RDFa: 18", eq(result.First, new Statement[] { } )); xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); - result = xRep.getStatementRDFa(xPara); + result = xDocRepository.getStatementRDFa(xPara); assertTrue("RDFa: 19", eq(result.First, new Statement[] { } )); xPara = UnoRuntime.queryInterface( XMetadatable.class, xEnum.nextElement()); - result = xRep.getStatementRDFa(xPara); + result = xDocRepository.getStatementRDFa(xPara); assertTrue("RDFa: 20", eq(result.First, new Statement[] { } )); xPara = UnoRuntime.queryInterface( XMetadatable.class, xEnum.nextElement()); - result = xRep.getStatementRDFa(xPara); + result = xDocRepository.getStatementRDFa(xPara); assertTrue("RDFa: 21", eq(result.First, new Statement[] { } )); System.out.println("...done"); @@ -889,7 +906,7 @@ public class DocumentMetadataAccessTest public void report(Exception e) { System.out.println("Exception occurred:"); - e.printStackTrace(); + e.printStackTrace(System.out); report2(e); fail(); } @@ -1275,14 +1292,18 @@ public class DocumentMetadataAccessTest // setup and close connections @BeforeClass public static void setUpConnection() throws Exception { - System.out.println("setUpConnection()"); + System.out.println( "------------------------------------------------------------" ); + System.out.println( "starting class: " + DocumentMetadataAccess.class.getName() ); + System.out.println( "------------------------------------------------------------" ); connection.setUp(); } @AfterClass public static void tearDownConnection() throws InterruptedException, com.sun.star.uno.Exception { - System.out.println("tearDownConnection() DocumentMetadataAccessTest"); + System.out.println( "------------------------------------------------------------" ); + System.out.println( "finishing class: " + DocumentMetadataAccess.class.getName() ); + System.out.println( "------------------------------------------------------------" ); connection.tearDown(); } diff --git a/sfx2/qa/complex/framework/DocumentPropertiesTest.java b/sfx2/qa/complex/sfx2/DocumentProperties.java index 20a0746c8322..01ccaa21619b 100644 --- a/sfx2/qa/complex/framework/DocumentPropertiesTest.java +++ b/sfx2/qa/complex/sfx2/DocumentProperties.java @@ -25,9 +25,10 @@ * ************************************************************************/ -package complex.framework; +package complex.sfx2; +import complex.sfx2.tools.TestDocument; import com.sun.star.uno.UnoRuntime; import com.sun.star.uno.XComponentContext; import com.sun.star.lang.XInitialization; @@ -53,7 +54,6 @@ import com.sun.star.document.XDocumentProperties; import org.junit.After; import org.junit.AfterClass; -import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.openoffice.test.OfficeConnection; @@ -66,12 +66,8 @@ import static org.junit.Assert.*; * * @author mst */ -public class DocumentPropertiesTest +public class DocumentProperties { -// public String[] getTestMethodNames () { -// return new String[] { "check", "cleanup" }; -// } - @After public void cleanup() { // nothing to do } @@ -80,7 +76,7 @@ public class DocumentPropertiesTest class Listener implements XModifyListener { private boolean m_Called; - public Listener() { + Listener() { m_Called = false; } @@ -235,8 +231,7 @@ public class DocumentPropertiesTest new NamedValue("PageCount", new Integer(1)))); XPropertyContainer udpc = xDP.getUserDefinedProperties(); - XPropertySet udps = (XPropertySet) UnoRuntime.queryInterface( - XPropertySet.class, udpc); + XPropertySet udps = UnoRuntime.queryInterface( XPropertySet.class, udpc ); assertTrue("UserDefined 1", "Dies ist ein wichtiger Hinweis" .equals(udps.getPropertyValue("Hinweis"))); assertTrue("UserDefined 2", ("Kann Spuren von N" @@ -366,8 +361,7 @@ public class DocumentPropertiesTest dur.Seconds = 555; dur.MilliSeconds = 444; - udpc.addProperty("Frobnicate", PropertyAttribute.REMOVEABLE, - new Boolean(b)); + udpc.addProperty("Frobnicate", PropertyAttribute.REMOVEABLE, b); udpc.addProperty("FrobDuration", PropertyAttribute.REMOVEABLE, dur); udpc.addProperty("FrobDuration2", PropertyAttribute.REMOVEABLE, t); udpc.addProperty("FrobEndDate", PropertyAttribute.REMOVEABLE, date); @@ -433,8 +427,7 @@ public class DocumentPropertiesTest System.out.println("Checking user-defined meta-data from stored file..."); udpc = xDP.getUserDefinedProperties(); - udps = (XPropertySet) UnoRuntime.queryInterface( - XPropertySet.class, udpc); + udps = UnoRuntime.queryInterface( XPropertySet.class, udpc ); assertTrue("UserDefined bool", new Boolean(b).equals( udps.getPropertyValue("Frobnicate"))); @@ -467,8 +460,7 @@ public class DocumentPropertiesTest System.out.println("Checking notification listener interface..."); Listener listener = new Listener(); - XModifyBroadcaster xMB = (XModifyBroadcaster) - UnoRuntime.queryInterface(XModifyBroadcaster.class, xDP); + XModifyBroadcaster xMB = UnoRuntime.queryInterface( XModifyBroadcaster.class, xDP ); xMB.addModifyListener(listener); xDP.setAuthor("not me"); assertTrue("Listener Author", listener.reset()); @@ -542,20 +534,24 @@ public class DocumentPropertiesTest private XMultiServiceFactory getMSF() { - final XMultiServiceFactory xMSF1 = UnoRuntime.queryInterface(XMultiServiceFactory.class, connection.getComponentContext().getServiceManager()); + final XMultiServiceFactory xMSF1 = UnoRuntime.queryInterface( XMultiServiceFactory.class, connection.getComponentContext().getServiceManager() ); return xMSF1; } // setup and close connections @BeforeClass public static void setUpConnection() throws Exception { - System.out.println("setUpConnection()"); + System.out.println( "------------------------------------------------------------" ); + System.out.println( "starting class: " + DocumentProperties.class.getName() ); + System.out.println( "------------------------------------------------------------" ); connection.setUp(); } @AfterClass public static void tearDownConnection() throws InterruptedException, com.sun.star.uno.Exception { - System.out.println("tearDownConnection() DocumentPropertiesTest"); + System.out.println( "------------------------------------------------------------" ); + System.out.println( "finishing class: " + DocumentProperties.class.getName() ); + System.out.println( "------------------------------------------------------------" ); connection.tearDown(); } diff --git a/sfx2/qa/complex/framework/CheckGlobalEventBroadcaster_writer1.java b/sfx2/qa/complex/sfx2/GlobalEventBroadcaster.java index c6dc073095b1..41bd66ccb5b9 100644 --- a/sfx2/qa/complex/framework/CheckGlobalEventBroadcaster_writer1.java +++ b/sfx2/qa/complex/sfx2/GlobalEventBroadcaster.java @@ -24,7 +24,7 @@ * for a copy of the LGPLv3 License. * ************************************************************************/ -package complex.framework; +package complex.sfx2; import com.sun.star.awt.XWindow; import com.sun.star.document.XEventBroadcaster; @@ -33,7 +33,7 @@ import com.sun.star.lang.XMultiServiceFactory; import com.sun.star.sheet.XSpreadsheetDocument; import com.sun.star.text.XTextDocument; import com.sun.star.uno.UnoRuntime; -import complex.framework.DocHelper.WriterHelper; +import complex.sfx2.tools.WriterHelper; import java.util.ArrayList; @@ -53,7 +53,7 @@ import static org.junit.Assert.*; * it will add an XEventListener and verify the Events * raised when opening/changing and closing Office Documents */ -public class CheckGlobalEventBroadcaster_writer1 { +public class GlobalEventBroadcaster { XMultiServiceFactory m_xMSF = null; XEventBroadcaster m_xEventBroadcaster = null; ArrayList notifyEvents = new ArrayList(); @@ -61,12 +61,6 @@ public class CheckGlobalEventBroadcaster_writer1 { XSpreadsheetDocument xSheetDoc; XEventListener m_xEventListener = new EventListenerImpl(); -// public String[] getTestMethodNames() { -// return new String[] { -// "initialize", "checkWriter", "cleanup" -// }; -// } - @Before public void initialize() { m_xMSF = getMSF(); System.out.println("check wether there is a valid MultiServiceFactory"); @@ -79,7 +73,6 @@ public class CheckGlobalEventBroadcaster_writer1 { "Create an instance of com.sun.star.frame.GlobalEventBroadcaster"); Object GlobalEventBroadcaster = null; - Object dispatcher = null; try { GlobalEventBroadcaster = m_xMSF.createInstance( @@ -116,7 +109,6 @@ public class CheckGlobalEventBroadcaster_writer1 { WriterHelper wHelper = new WriterHelper(m_xMSF); String[] expected; - boolean locRes = true; System.out.println("opening an empty writer doc"); notifyEvents.clear(); { diff --git a/sfx2/qa/complex/standalonedocumentinfo/StandaloneDocumentInfoUnitTest.java b/sfx2/qa/complex/sfx2/StandaloneDocumentInfo.java index 29fcaba8cb7a..1e9cbb1f4738 100644 --- a/sfx2/qa/complex/standalonedocumentinfo/StandaloneDocumentInfoUnitTest.java +++ b/sfx2/qa/complex/sfx2/StandaloneDocumentInfo.java @@ -24,10 +24,12 @@ * for a copy of the LGPLv3 License. * ************************************************************************/ -package complex.standalonedocumentinfo; +package complex.sfx2; import com.sun.star.lang.XMultiServiceFactory; import com.sun.star.uno.UnoRuntime; +import complex.sfx2.standalonedocinfo.StandaloneDocumentInfoTest; +import complex.sfx2.standalonedocinfo.Test01; import org.junit.After; import org.junit.AfterClass; @@ -40,18 +42,9 @@ import static org.junit.Assert.*; /* Document here */ -public class StandaloneDocumentInfoUnitTest { +public class StandaloneDocumentInfo { private XMultiServiceFactory m_xMSF = null; -// public String[] getTestMethodNames() { -// return new String[] { -// "ExecuteTest01"}; -// } - -// public String[] getTestObjectNames() { -// return new String[] {"StandaloneDocumentInfoUnitTest"}; -// } - @Before public void before() { try { m_xMSF = getMSF(); @@ -82,15 +75,20 @@ public class StandaloneDocumentInfoUnitTest { } // setup and close connections - @BeforeClass public static void setUpConnection() throws Exception { - System.out.println("setUpConnection()"); + @BeforeClass public static void setUpConnection() throws Exception + { + System.out.println( "------------------------------------------------------------" ); + System.out.println( "starting class: " + StandaloneDocumentInfo.class.getName() ); + System.out.println( "------------------------------------------------------------" ); connection.setUp(); } @AfterClass public static void tearDownConnection() throws InterruptedException, com.sun.star.uno.Exception { - System.out.println("tearDownConnection()"); + System.out.println( "------------------------------------------------------------" ); + System.out.println( "finishing class: " + StandaloneDocumentInfo.class.getName() ); + System.out.println( "------------------------------------------------------------" ); connection.tearDown(); } diff --git a/sfx2/qa/complex/sfx2/UndoManager.java b/sfx2/qa/complex/sfx2/UndoManager.java new file mode 100755 index 000000000000..2e4c5abe2903 --- /dev/null +++ b/sfx2/qa/complex/sfx2/UndoManager.java @@ -0,0 +1,1470 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +package complex.sfx2; + +import com.sun.star.accessibility.XAccessible; +import com.sun.star.accessibility.XAccessibleAction; +import com.sun.star.awt.Point; +import com.sun.star.awt.Size; +import com.sun.star.awt.XControl; +import com.sun.star.awt.XControlModel; +import com.sun.star.beans.NamedValue; +import com.sun.star.beans.XPropertySet; +import com.sun.star.container.NoSuchElementException; +import com.sun.star.container.XChild; +import com.sun.star.container.XIndexContainer; +import com.sun.star.container.XNameContainer; +import com.sun.star.container.XNameReplace; +import com.sun.star.container.XSet; +import com.sun.star.document.EmptyUndoStackException; +import com.sun.star.document.UndoContextNotClosedException; +import com.sun.star.document.UndoFailedException; +import com.sun.star.document.UndoManagerEvent; +import com.sun.star.document.XEmbeddedScripts; +import com.sun.star.document.XEventsSupplier; +import com.sun.star.document.XUndoAction; +import com.sun.star.lang.EventObject; +import com.sun.star.lang.IndexOutOfBoundsException; +import com.sun.star.lang.XEventListener; +import java.lang.reflect.InvocationTargetException; +import org.openoffice.test.tools.OfficeDocument; +import com.sun.star.document.XUndoManagerSupplier; +import com.sun.star.document.XUndoManager; +import com.sun.star.document.XUndoManagerListener; +import com.sun.star.drawing.XControlShape; +import com.sun.star.drawing.XDrawPage; +import com.sun.star.drawing.XDrawPageSupplier; +import com.sun.star.drawing.XShapes; +import com.sun.star.lang.XComponent; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.lang.XServiceInfo; +import com.sun.star.lang.XSingleComponentFactory; +import com.sun.star.lang.XTypeProvider; +import com.sun.star.script.ScriptEventDescriptor; +import com.sun.star.script.XEventAttacherManager; +import com.sun.star.script.XLibraryContainer; +import com.sun.star.task.XJob; +import com.sun.star.uno.Type; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.uno.XComponentContext; +import com.sun.star.util.InvalidStateException; +import com.sun.star.util.NotLockedException; +import com.sun.star.view.XControlAccess; +import complex.sfx2.undo.CalcDocumentTest; +import complex.sfx2.undo.ChartDocumentTest; +import complex.sfx2.undo.DocumentTest; +import complex.sfx2.undo.DrawDocumentTest; +import complex.sfx2.undo.ImpressDocumentTest; +import complex.sfx2.undo.WriterDocumentTest; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.Stack; +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; +import static org.junit.Assert.*; +import org.openoffice.test.OfficeConnection; +import org.openoffice.test.tools.DocumentType; +import org.openoffice.test.tools.SpreadsheetDocument; + +/** + * Unit test for the UndoManager API + * + * @author frank.schoenheit@oracle.com + */ +public class UndoManager +{ + // ----------------------------------------------------------------------------------------------------------------- + @Before + public void beforeTest() throws com.sun.star.uno.Exception + { + m_currentTestCase = null; + m_currentDocument = null; + m_undoListener = null; + + // at our service factory, insert a new factory for our CallbackComponent + // this will allow the Basic code in our test documents to call back into this test case + // here, by just instantiating this service + final XSet globalFactory = UnoRuntime.queryInterface( XSet.class, getORB() ); + m_callbackFactory = new CallbackComponentFactory(); + globalFactory.insert( m_callbackFactory ); + } + + // ----------------------------------------------------------------------------------------------------------------- + @Test + public void checkWriterUndo() throws Exception + { + m_currentTestCase = new WriterDocumentTest( getORB() ); + impl_checkUndo( true ); + } + + // ----------------------------------------------------------------------------------------------------------------- + @Test + public void checkCalcUndo() throws Exception + { + m_currentTestCase = new CalcDocumentTest( getORB() ); + impl_checkUndo( false ); + } + + // ----------------------------------------------------------------------------------------------------------------- + @Test + public void checkDrawUndo() throws Exception + { + m_currentTestCase = new DrawDocumentTest( getORB() ); + impl_checkUndo( false ); + } + + // ----------------------------------------------------------------------------------------------------------------- + @Test + public void checkImpressUndo() throws Exception + { + m_currentTestCase = new ImpressDocumentTest( getORB() ); + impl_checkUndo( false ); + } + + // ----------------------------------------------------------------------------------------------------------------- + @Test + public void checkChartUndo() throws Exception + { + m_currentTestCase = new ChartDocumentTest( getORB() ); + impl_checkUndo( false ); + } + + // ----------------------------------------------------------------------------------------------------------------- + @Test + public void checkBrokenScripts() throws com.sun.star.uno.Exception, InterruptedException + { + System.out.println( "testing: broken scripts" ); + + m_currentDocument = OfficeDocument.blankDocument( getORB(), DocumentType.CALC ); + m_undoListener = new UndoListener(); + getUndoManager().addUndoManagerListener( m_undoListener ); + + impl_setupBrokenBasicScript(); + final String scriptURI = "vnd.sun.star.script:default.callbacks.brokenScript?language=Basic&location=document"; + + // ............................................................................................................. + // scenario 1: Pressing a button which is bound to execute the script + // (This is one of the many cases where SfxObjectShell::CallXScript is invoked) + + // set up the button + final XPropertySet buttonModel = impl_setupButton(); + buttonModel.setPropertyValue( "Label", "exec broken script" ); + impl_assignStarBasicScript( buttonModel, "XActionListener", "actionPerformed", + "document:default.callbacks.brokenScript" ); + + // switch the doc's view to form alive mode (so the button will actually work) + m_currentDocument.getCurrentView().dispatch( ".uno:SwitchControlDesignMode" ); + + // click the button + m_callbackCalled = false; + impl_clickButton( buttonModel ); + // the macro is executed asynchronously by the button, so wait at most 2 seconds for the callback to be + // triggered + impl_waitFor( m_callbackCondition, 2000 ); + // check the callback has actually been called + assertTrue( "clicking the test button did not work as expected - basic script not called", m_callbackCalled ); + + // again, since the script is executed asynchronously, we might arrive here while its execution + // is not completely finished. Give OOo another (at most) 2 seconds to finish it. + m_undoListener.waitForAllContextsClosed( 20000 ); + // assure that the Undo Context Depth of the doc is still "0": The Basic script entered such a + // context, and didn't close it (thus it is broken), but the application framework should have + // auto-closed the context after the macro finished. + assertEquals( "undo context was not auto-closed as expected", 0, m_undoListener.getCurrentUndoContextDepth() ); + + // ............................................................................................................. + // scenario 2: dispatching the script URL. Technically, this is equivalent to configuring the + // script into a menu or toolbar, and selecting the respective menu/toolbar item + m_callbackCalled = false; + m_currentDocument.getCurrentView().dispatch( scriptURI ); + assertTrue( "dispatching the Script URL did not work as expected - basic script not called", m_callbackCalled ); + // same as above: The script didn't close the context, but the OOo framework should have + assertEquals( "undo context was not auto-closed as expected", 0, m_undoListener.getCurrentUndoContextDepth() ); + + // ............................................................................................................. + // scenario 3: assigning the script to some document event, and triggering this event + final XEventsSupplier eventSupplier = UnoRuntime.queryInterface( XEventsSupplier.class, m_currentDocument.getDocument() ); + final XNameReplace events = UnoRuntime.queryInterface( XNameReplace.class, eventSupplier.getEvents() ); + final NamedValue[] scriptDescriptor = new NamedValue[] { + new NamedValue( "EventType", "Script" ), + new NamedValue( "Script", scriptURI ) + }; + events.replaceByName( "OnViewCreated", scriptDescriptor ); + + m_callbackCalled = false; + m_currentDocument.getCurrentView().dispatch( ".uno:NewWindow" ); + assertTrue( "triggering an event did not work as expected - basic script not called", m_callbackCalled ); + // same as above: The script didn't close the context, but the OOo framework should have + assertEquals( "undo context was not auto-closed as expected", 0, m_undoListener.getCurrentUndoContextDepth() ); + + // ............................................................................................................. + // scenario 4: let the script enter an Undo context, but not close it, as usual. + // Additionally, let the script close the document - the OOo framework code which cares for + // auto-closing of Undo contexts should survive this, ideally ... + m_closeAfterCallback = true; + m_callbackCalled = false; + m_currentDocument.getCurrentView().dispatch( scriptURI ); + assertTrue( m_callbackCalled ); + assertTrue( "The Basic script should have closed the document.", m_undoListener.isDisposed() ); + m_currentDocument = null; + } + + // ----------------------------------------------------------------------------------------------------------------- + @Test + public void checkSerialization() throws com.sun.star.uno.Exception, InterruptedException + { + System.out.println( "testing: request serialization" ); + + m_currentDocument = OfficeDocument.blankDocument( getORB(), DocumentType.CALC ); + final XUndoManager undoManager = getUndoManager(); + + final int threadCount = 10; + final int actionsPerThread = 10; + final int actionCount = threadCount * actionsPerThread; + + // add some actions to the UndoManager, each knowing its position on the stack + final Object lock = new Object(); + final Integer actionsUndone[] = new Integer[] { 0 }; + for ( int i=actionCount; i>0; ) + undoManager.addUndoAction( new CountingUndoAction( --i, lock, actionsUndone ) ); + + // some concurrent threads which undo the actions + Thread[] threads = new Thread[threadCount]; + for ( int i=0; i<threadCount; ++i ) + { + threads[i] = new Thread() + { + @Override + public void run() + { + for ( int j=0; j<actionsPerThread; ++j ) + { + try { undoManager.undo(); } + catch ( final Exception e ) + { + fail( "Those dummy actions are not expected to fail." ); + return; + } + } + } + }; + } + + // start the threads + for ( int i=0; i<threadCount; ++i ) + threads[i].start(); + + // wait for them to be finished + for ( int i=0; i<threadCount; ++i ) + threads[i].join(); + + // ensure all actions have been undone + assertEquals( "not all actions have been undone", actionCount, actionsUndone[0].intValue() ); + } + + // ----------------------------------------------------------------------------------------------------------------- + @After + public void afterTest() + { + if ( m_currentTestCase != null ) + m_currentTestCase.closeDocument(); + else if ( m_currentDocument != null ) + m_currentDocument.close(); + m_currentTestCase = null; + m_currentDocument = null; + m_callbackFactory.dispose(); + } + + // ----------------------------------------------------------------------------------------------------------------- + /** + * returns the undo manager belonging to a given document + * @return + */ + private XUndoManager getUndoManager() + { + final XUndoManagerSupplier suppUndo = UnoRuntime.queryInterface( XUndoManagerSupplier.class, m_currentDocument.getDocument() ); + final XUndoManager undoManager = suppUndo.getUndoManager(); + assertTrue( UnoRuntime.areSame( undoManager.getParent(), m_currentDocument.getDocument() ) ); + return undoManager; + } + + // ----------------------------------------------------------------------------------------------------------------- + private void impl_waitFor( final Object i_condition, final int i_milliSeconds ) throws InterruptedException + { + synchronized( i_condition ) + { + i_condition.wait( i_milliSeconds ); + } + } + + // ----------------------------------------------------------------------------------------------------------------- + private void impl_setupBrokenBasicScript() + { + try + { + final XEmbeddedScripts embeddedScripts = UnoRuntime.queryInterface( XEmbeddedScripts.class, m_currentDocument.getDocument() ); + final XLibraryContainer basicLibs = embeddedScripts.getBasicLibraries(); + final XNameContainer basicLib = basicLibs.createLibrary( "default" ); + + final String brokenScriptCode = + "Option Explicit\n" + + "\n" + + "Sub brokenScript\n" + + " Dim callback as Object\n" + + " ThisComponent.UndoManager.enterUndoContext( \"" + getCallbackUndoContextTitle() + "\"\n" + + "\n" + + " callback = createUnoService( \"" + getCallbackComponentServiceName() + "\" )\n" + + " Dim emptyArgs() as new com.sun.star.beans.NamedValue\n" + + " Dim result as String\n" + + " result = callback.execute( emptyArgs() )\n" + + " If result = \"close\" Then\n" + + " ThisComponent.close( TRUE )\n" + + " End If\n" + + "End Sub\n" + + "\n"; + + basicLib.insertByName( "callbacks", brokenScriptCode ); + } + catch( com.sun.star.uno.Exception e ) + { + fail( "caught an exception while setting up the script: " + e.toString() ); + } + } + + // ----------------------------------------------------------------------------------------------------------------- + private XPropertySet impl_setupButton() throws com.sun.star.uno.Exception + { + // let the document create a shape + final XMultiServiceFactory docAsFactory = UnoRuntime.queryInterface( XMultiServiceFactory.class, + m_currentDocument.getDocument() ); + final XControlShape xShape = UnoRuntime.queryInterface( XControlShape.class, + docAsFactory.createInstance( "com.sun.star.drawing.ControlShape" ) ); + + // position and size of the shape + xShape.setSize( new Size( 28 * 100, 10 * 100 ) ); + xShape.setPosition( new Point( 10 * 100, 10 * 100 ) ); + + // create the form component (the model of a form control) + final String sQualifiedComponentName = "com.sun.star.form.component.CommandButton"; + final XControlModel controlModel = UnoRuntime.queryInterface( XControlModel.class, + getORB().createInstance( sQualifiedComponentName ) ); + + // knitt both + xShape.setControl( controlModel ); + + // add the shape to the shapes collection of the document + SpreadsheetDocument spreadsheetDoc = (SpreadsheetDocument)m_currentDocument; + final XDrawPageSupplier suppDrawPage = UnoRuntime.queryInterface( XDrawPageSupplier.class, + spreadsheetDoc.getSheet( 0 ) ); + final XDrawPage insertIntoPage = suppDrawPage.getDrawPage(); + + final XShapes sheetShapes = UnoRuntime.queryInterface( XShapes.class, insertIntoPage ); + sheetShapes.add( xShape ); + + return UnoRuntime.queryInterface( XPropertySet.class, controlModel ); + } + + // ----------------------------------------------------------------------------------------------------------------- + private void impl_assignStarBasicScript( final XPropertySet i_controlModel, final String i_interfaceName, + final String i_interfaceMethod, final String i_scriptCode ) + { + try + { + final XChild modelAsChild = UnoRuntime.queryInterface( XChild.class, i_controlModel ); + final XIndexContainer parentForm = UnoRuntime.queryInterface( XIndexContainer.class, modelAsChild.getParent() ); + + final XEventAttacherManager manager = UnoRuntime.queryInterface( XEventAttacherManager.class, parentForm ); + + int containerPosition = -1; + for ( int i = 0; i < parentForm.getCount(); ++i ) + { + final XPropertySet child = UnoRuntime.queryInterface( XPropertySet.class, parentForm.getByIndex( i ) ); + if ( UnoRuntime.areSame( child, i_controlModel ) ) + { + containerPosition = i; + break; + } + } + assertFalse( "could not find the given control model within its parent", containerPosition == -1 ); + manager.registerScriptEvent( containerPosition, new ScriptEventDescriptor( + i_interfaceName, + i_interfaceMethod, + "", + "StarBasic", + i_scriptCode + ) ); + } + catch( com.sun.star.uno.Exception e ) + { + fail( "caught an exception while assigning the script event to the button: " + e.toString() ); + } + } + + // ----------------------------------------------------------------------------------------------------------------- + private void impl_clickButton( final XPropertySet i_buttonModel ) throws NoSuchElementException, IndexOutOfBoundsException + { + final XControlAccess controlAccess = UnoRuntime.queryInterface( XControlAccess.class, + m_currentDocument.getCurrentView().getController() ); + final XControl control = controlAccess.getControl( UnoRuntime.queryInterface( XControlModel.class, i_buttonModel ) ); + final XAccessible accessible = UnoRuntime.queryInterface( XAccessible.class, control ); + final XAccessibleAction controlActions = UnoRuntime.queryInterface( XAccessibleAction.class, accessible.getAccessibleContext() ); + for ( int i=0; i<controlActions.getAccessibleActionCount(); ++i ) + { + if ( controlActions.getAccessibleActionDescription(i).equals( "click" ) ) + { + controlActions.doAccessibleAction(i); + return; + } + } + fail( "did not find the accessible action named 'click'" ); + } + + // ----------------------------------------------------------------------------------------------------------------- + private static class UndoListener implements XUndoManagerListener + { + public void undoActionAdded( UndoManagerEvent i_event ) + { + assertFalse( "|undoActionAdded| called after document was disposed", m_isDisposed ); + + ++m_undoActionsAdded; + m_mostRecentlyAddedAction = i_event.UndoActionTitle; + } + + public void actionUndone( UndoManagerEvent i_event ) + { + assertFalse( "|actionUndone| called after document was disposed", m_isDisposed ); + + ++m_undoCount; + m_mostRecentlyUndone = i_event.UndoActionTitle; + } + + public void actionRedone( UndoManagerEvent i_event ) + { + assertFalse( "|actionRedone| called after document was disposed", m_isDisposed ); + + ++m_redoCount; + } + + public void allActionsCleared( EventObject eo ) + { + assertFalse( "|allActionsCleared| called after document was disposed", m_isDisposed ); + + m_wasCleared = true; + } + + public void redoActionsCleared( EventObject eo ) + { + assertFalse( "|redoActionsCleared| called after document was disposed", m_isDisposed ); + + m_redoWasCleared = true; + } + + public void resetAll( EventObject i_event ) + { + assertFalse( "|resetAll| called after document was disposed", m_isDisposed ); + + m_managerWasReset = true; + m_activeUndoContexts.clear(); + } + + public void enteredContext( UndoManagerEvent i_event ) + { + assertFalse( "|enteredContext| called after document was disposed", m_isDisposed ); + + m_activeUndoContexts.push( i_event.UndoActionTitle ); + assertEquals( "different opinions on the context nesting level (after entering)", + m_activeUndoContexts.size(), i_event.UndoContextDepth ); + } + + public void enteredHiddenContext( UndoManagerEvent i_event ) + { + assertFalse( "|enteredHiddenContext| called after document was disposed", m_isDisposed ); + + m_activeUndoContexts.push( i_event.UndoActionTitle ); + assertEquals( "different opinions on the context nesting level (after entering hidden)", + m_activeUndoContexts.size(), i_event.UndoContextDepth ); + } + + public void leftContext( UndoManagerEvent i_event ) + { + assertFalse( "|leftContext| called after document was disposed", m_isDisposed ); + + assertEquals( "nested undo context descriptions do not match", m_activeUndoContexts.pop(), i_event.UndoActionTitle ); + assertEquals( "different opinions on the context nesting level (after leaving)", + m_activeUndoContexts.size(), i_event.UndoContextDepth ); + m_leftContext = true; + impl_notifyContextDepth(); + } + + public void leftHiddenContext( UndoManagerEvent i_event ) + { + assertFalse( "|leftHiddenContext| called after document was disposed", m_isDisposed ); + assertEquals( "|leftHiddenContext| is not expected to notify an action title", 0, i_event.UndoActionTitle.length() ); + + m_activeUndoContexts.pop(); + assertEquals( "different opinions on the context nesting level (after leaving)", + m_activeUndoContexts.size(), i_event.UndoContextDepth ); + m_leftHiddenContext = true; + impl_notifyContextDepth(); + } + + public void cancelledContext( UndoManagerEvent i_event ) + { + assertFalse( "|cancelledContext| called after document was disposed", m_isDisposed ); + assertEquals( "|cancelledContext| is not expected to notify an action title", 0, i_event.UndoActionTitle.length() ); + + m_activeUndoContexts.pop(); + assertEquals( "different opinions on the context nesting level (after cancelling)", + m_activeUndoContexts.size(), i_event.UndoContextDepth ); + m_cancelledContext = true; + impl_notifyContextDepth(); + } + + public void disposing( EventObject i_event ) + { + m_isDisposed = true; + } + + public void waitForAllContextsClosed( final int i_milliSeconds ) throws InterruptedException + { + synchronized ( m_allContextsClosedCondition ) + { + if ( m_activeUndoContexts.empty() ) + return; + m_allContextsClosedCondition.wait( i_milliSeconds ); + } + } + + private void impl_notifyContextDepth() + { + synchronized ( m_allContextsClosedCondition ) + { + if ( m_activeUndoContexts.empty() ) + { + m_allContextsClosedCondition.notifyAll(); + } + } + } + + private int getUndoActionsAdded() { return m_undoActionsAdded; } + private int getUndoActionCount() { return m_undoCount; } + private int getRedoActionCount() { return m_redoCount; } + private String getCurrentUndoContextTitle() { return m_activeUndoContexts.peek(); } + private String getMostRecentlyAddedActionTitle() { return m_mostRecentlyAddedAction; }; + private String getMostRecentlyUndoneTitle() { return m_mostRecentlyUndone; } + private int getCurrentUndoContextDepth() { return m_activeUndoContexts.size(); } + private boolean isDisposed() { return m_isDisposed; } + private boolean wasContextLeft() { return m_leftContext; } + private boolean wasHiddenContextLeft() { return m_leftHiddenContext; } + private boolean hasContextBeenCancelled() { return m_cancelledContext; } + private boolean wereStacksCleared() { return m_wasCleared; } + private boolean wasRedoStackCleared() { return m_redoWasCleared; } + private boolean wasManagerReset() { return m_managerWasReset; } + + void reset() + { + m_undoActionsAdded = m_undoCount = m_redoCount = 0; + m_activeUndoContexts.clear(); + m_mostRecentlyAddedAction = m_mostRecentlyUndone = null; + // m_isDisposed is not cleared, intentionally + m_leftContext = m_leftHiddenContext = m_cancelledContext = m_wasCleared = m_redoWasCleared = m_managerWasReset = false; + } + + private int m_undoActionsAdded = 0; + private int m_undoCount = 0; + private int m_redoCount = 0; + private boolean m_isDisposed = false; + private boolean m_leftContext = false; + private boolean m_leftHiddenContext = false; + private boolean m_cancelledContext = false; + private boolean m_wasCleared = false; + private boolean m_redoWasCleared = false; + private boolean m_managerWasReset = false; + private Stack< String > + m_activeUndoContexts = new Stack<String>(); + private String m_mostRecentlyAddedAction = null; + private String m_mostRecentlyUndone = null; + private final Object m_allContextsClosedCondition = new Object(); + }; + + // ----------------------------------------------------------------------------------------------------------------- + private void impl_checkUndo( final boolean i_fakeTestForNow ) throws Exception + { + System.out.println( "testing: " + m_currentTestCase.getDocumentDescription() ); + m_currentDocument = m_currentTestCase.getDocument(); + m_currentTestCase.initializeDocument(); + m_currentTestCase.verifyInitialDocumentState(); + + if ( i_fakeTestForNow ) + { + // Writer does not yet have an UndoManager in the current phase of the implementation. Once it has, we + // this complete branch, which barely tests anything (except perhaps the DocumentTest implementation), + // can vanish. + m_currentTestCase.doSingleModification(); + m_currentTestCase.verifySingleModificationDocumentState(); + m_currentTestCase.getDocument().getCurrentView().dispatch( ".uno:Undo" ); + m_currentTestCase.verifyInitialDocumentState(); + final int expectedUndoSteps = m_currentTestCase.doMultipleModifications(); + for ( int i=0; i<expectedUndoSteps; ++i ) + m_currentTestCase.getDocument().getCurrentView().dispatch( ".uno:Undo" ); + m_currentTestCase.verifyInitialDocumentState(); + m_currentTestCase.getDocument().close(); + return; + } + + final XUndoManager undoManager = getUndoManager(); + undoManager.clear(); + assertFalse( "clearing the Undo manager should result in the impossibility to undo anything", undoManager.isUndoPossible() ); + assertFalse( "clearing the Undo manager should result in the impossibility to redo anything", undoManager.isRedoPossible() ); + + m_undoListener = new UndoListener(); + undoManager.addUndoManagerListener( m_undoListener ); + + impl_testSingleModification( undoManager ); + impl_testMultipleModifications( undoManager ); + impl_testCustomUndoActions( undoManager ); + impl_testLocking( undoManager ); + impl_testNestedContexts( undoManager ); + impl_testErrorHandling( undoManager ); + impl_testContextHandling( undoManager ); + impl_testStackHandling( undoManager ); + impl_testClearance( undoManager ); + impl_testHiddenContexts( undoManager ); + + // close the document, ensure the Undo manager listener gets notified + m_currentTestCase.closeDocument(); + m_currentTestCase = null; + m_currentDocument = null; + assertTrue( "document is closed, but the UndoManagerListener has not been notified of the disposal", m_undoListener.isDisposed() ); + } + + // ----------------------------------------------------------------------------------------------------------------- + private void impl_testSingleModification( final XUndoManager i_undoManager ) throws com.sun.star.uno.Exception + { + m_currentTestCase.doSingleModification(); + m_currentTestCase.verifySingleModificationDocumentState(); + + // undo the modification, ensure the listener got the proper notifications + assertEquals( "We did not yet do a undo!", 0, m_undoListener.getUndoActionCount() ); + i_undoManager.undo(); + assertEquals( "A simple undo does not result in the proper Undo count.", + 1, m_undoListener.getUndoActionCount() ); + + // verify the document is in its initial state, again + m_currentTestCase.verifyInitialDocumentState(); + + // redo the modification, ensure the listener got the proper notifications + assertEquals( "did not yet do a redo!", 0, m_undoListener.getRedoActionCount() ); + i_undoManager.redo(); + assertEquals( "did a redo, but got no notification of it!", 1, m_undoListener.getRedoActionCount() ); + // ensure the document is in the proper state, again + m_currentTestCase.verifySingleModificationDocumentState(); + + // now do an Undo via the UI (aka the dispatch API), and see if this works, and notifies the listener as + // expected + m_currentTestCase.getDocument().getCurrentView().dispatch( ".uno:Undo" ); + m_currentTestCase.verifyInitialDocumentState(); + assertEquals( "UI-Undo does not notify the listener", 2, m_undoListener.getUndoActionCount() ); + } + + // ----------------------------------------------------------------------------------------------------------------- + private void impl_testMultipleModifications( final XUndoManager i_undoManager ) throws com.sun.star.uno.Exception + { + m_undoListener.reset(); + assertEquals( "unexpected initial undo context depth", 0, m_undoListener.getCurrentUndoContextDepth() ); + i_undoManager.enterUndoContext( "Batch Changes" ); + assertEquals( "unexpected undo context depth after entering a context", + 1, m_undoListener.getCurrentUndoContextDepth() ); + assertEquals( "entering an Undo context has not been notified properly", + "Batch Changes", m_undoListener.getCurrentUndoContextTitle() ); + + final int modifications = m_currentTestCase.doMultipleModifications(); + assertEquals( "unexpected number of undo actions while doing batch changes to the document", + modifications, m_undoListener.getUndoActionsAdded() ); + assertEquals( "seems the document operations touched the undo context depth", + 1, m_undoListener.getCurrentUndoContextDepth() ); + + i_undoManager.leaveUndoContext(); + assertEquals( "unexpected undo context depth after leaving the last context", + 0, m_undoListener.getCurrentUndoContextDepth() ); + assertEquals( "no Undo done, yet - still the listener has been notified of an Undo action", + 0, m_undoListener.getUndoActionCount() ); + + i_undoManager.undo(); + assertEquals( "Just did an undo - the listener should have been notified", 1, m_undoListener.getUndoActionCount() ); + m_currentTestCase.verifyInitialDocumentState(); + } + + // ----------------------------------------------------------------------------------------------------------------- + private void impl_testCustomUndoActions( final XUndoManager i_undoManager ) throws com.sun.star.uno.Exception + { + i_undoManager.clear(); + m_undoListener.reset(); + assertFalse( "undo stack not empty after clearing the undo manager", i_undoManager.isUndoPossible() ); + assertFalse( "redo stack not empty after clearing the undo manager", i_undoManager.isRedoPossible() ); + assertArrayEquals( ">0 descriptions for an empty undo stack?", + new String[0], i_undoManager.getAllUndoActionTitles() ); + assertArrayEquals( ">0 descriptions for an empty redo stack?", + new String[0], i_undoManager.getAllRedoActionTitles() ); + + // add two actions, one directly, one within a context + final CustomUndoAction action1 = new CustomUndoAction( "UndoAction1" ); + i_undoManager.addUndoAction( action1 ); + assertEquals( "Adding an undo action not observed by the listener", 1, m_undoListener.getUndoActionsAdded() ); + assertEquals( "Adding an undo action did not notify the proper title", + action1.getTitle(), m_undoListener.getMostRecentlyAddedActionTitle() ); + final String contextTitle = "Undo Context"; + i_undoManager.enterUndoContext( contextTitle ); + final CustomUndoAction action2 = new CustomUndoAction( "UndoAction2" ); + i_undoManager.addUndoAction( action2 ); + assertEquals( "Adding an undo action not observed by the listener", + 2, m_undoListener.getUndoActionsAdded() ); + assertEquals( "Adding an undo action did not notify the proper title", + action2.getTitle(), m_undoListener.getMostRecentlyAddedActionTitle() ); + i_undoManager.leaveUndoContext(); + + // see if the manager has proper descriptions + assertArrayEquals( "unexpected Redo descriptions after adding two actions", + new String[0], i_undoManager.getAllRedoActionTitles() ); + assertArrayEquals( "unexpected Undo descriptions after adding two actions", + new String[]{contextTitle, action1.getTitle()}, i_undoManager.getAllUndoActionTitles() ); + + // undo one action + i_undoManager.undo(); + assertEquals( "improper action title notified during programmatic Undo", + contextTitle, m_undoListener.getMostRecentlyUndoneTitle() ); + assertTrue( "nested custom undo action has not been undone as expected", action2.undoCalled() ); + assertFalse( "nested custom undo action has not been undone as expected", action1.undoCalled() ); + assertArrayEquals( "unexpected Redo descriptions after undoing a nested custom action", + new String[]{contextTitle}, i_undoManager.getAllRedoActionTitles() ); + assertArrayEquals( "unexpected Undo descriptions after undoing a nested custom action", + new String[]{action1.getTitle()}, i_undoManager.getAllUndoActionTitles() ); + + // undo the second action, via UI dispatches + m_currentTestCase.getDocument().getCurrentView().dispatch( ".uno:Undo" ); + assertEquals( "improper action title notified during UI Undo", action1.getTitle(), m_undoListener.getMostRecentlyUndoneTitle() ); + assertTrue( "nested custom undo action has not been undone as expected", action1.undoCalled() ); + assertArrayEquals( "unexpected Redo descriptions after undoing the second custom action", + new String[]{action1.getTitle(), contextTitle}, i_undoManager.getAllRedoActionTitles() ); + assertArrayEquals( "unexpected Undo descriptions after undoing the second custom action", + new String[0], i_undoManager.getAllUndoActionTitles() ); + + // check the actions are disposed when the stacks are cleared + i_undoManager.clear(); + assertTrue( action1.disposed() && action2.disposed() ); + } + + // ----------------------------------------------------------------------------------------------------------------- + private void impl_testLocking( final XUndoManager i_undoManager ) throws com.sun.star.uno.Exception + { + i_undoManager.reset(); + m_undoListener.reset(); + + // implicit Undo actions, triggered by changes to the document + assertFalse( "unexpected initial locking state", i_undoManager.isLocked() ); + i_undoManager.lock(); + assertTrue( "just locked the manager, why does it lie?", i_undoManager.isLocked() ); + m_currentTestCase.doSingleModification(); + assertEquals( "when the Undo manager is locked, no implicit additions should happen", + 0, m_undoListener.getUndoActionsAdded() ); + i_undoManager.unlock(); + assertEquals( "unlock is not expected to add collected actions - they should be discarded", + 0, m_undoListener.getUndoActionsAdded() ); + assertFalse( "just unlocked the manager, why does it lie?", i_undoManager.isLocked() ); + + // explicit Undo actions + i_undoManager.lock(); + i_undoManager.addUndoAction( new CustomUndoAction() ); + i_undoManager.unlock(); + assertEquals( "explicit Undo actions are expected to be ignored when the manager is locked", + 0, m_undoListener.getUndoActionsAdded() ); + + // Undo contexts while being locked + i_undoManager.lock(); + i_undoManager.enterUndoContext( "Dummy Context" ); + i_undoManager.enterHiddenUndoContext(); + assertEquals( "entering Undo contexts should be ignored when the manager is locked", 0, m_undoListener.getCurrentUndoContextDepth() ); + i_undoManager.leaveUndoContext(); + i_undoManager.leaveUndoContext(); + i_undoManager.unlock(); + + // |unlock| error handling + assertFalse( "internal error: manager should not be locked at this point in time", i_undoManager.isLocked() ); + boolean caughtExpected = false; + try { i_undoManager.unlock(); } catch ( final NotLockedException e ) { caughtExpected = true; } + assertTrue( "unlocking the manager when it is not locked should throw", caughtExpected ); + } + + // ----------------------------------------------------------------------------------------------------------------- + private void impl_testContextHandling( final XUndoManager i_undoManager ) throws com.sun.star.uno.Exception + { + // ............................................................................................................. + // part I: non-empty contexts + i_undoManager.reset(); + m_undoListener.reset(); + + // put one action on the undo and one on the redo stack, as precondition for the following tests + XUndoAction undoAction1 = new CustomUndoAction( "Undo Action 1" ); + i_undoManager.addUndoAction( undoAction1 ); + XUndoAction undoAction2 = new CustomUndoAction( "Undo Action 2" ); + i_undoManager.addUndoAction( undoAction2 ); + i_undoManager.undo(); + assertTrue( "precondition for context handling tests not met (1)", i_undoManager.isUndoPossible() ); + assertTrue( "precondition for context handling tests not met (2)", i_undoManager.isRedoPossible() ); + assertArrayEquals( new String[] { undoAction1.getTitle() }, i_undoManager.getAllUndoActionTitles() ); + assertArrayEquals( new String[] { undoAction2.getTitle() }, i_undoManager.getAllRedoActionTitles() ); + + // enter a context, add a single action + i_undoManager.enterUndoContext( "Undo Context" ); + assertEquals( "unexpected undo context depth after entering a context", 1, m_undoListener.getCurrentUndoContextDepth() ); + XUndoAction undoAction3 = new CustomUndoAction( "Undo Action 3" ); + i_undoManager.addUndoAction( undoAction3 ); + + // while the context is open, its title should already contribute to the stack, ... + assertEquals( "Undo Context", i_undoManager.getCurrentUndoActionTitle() ); + // ... getAllUndo/RedoActionTitles should operate on the top level, not on the level defined by the open + // context, ... + assertArrayEquals( new String[] { "Undo Context", undoAction1.getTitle() }, + i_undoManager.getAllUndoActionTitles() ); + assertArrayEquals( new String[] {}, i_undoManager.getAllRedoActionTitles() ); + // (the redo stack has been cleared when a new context was entered) + // ... but Undo and Redo should be impossible as long as the context is open + assertFalse( i_undoManager.isUndoPossible() ); + assertFalse( i_undoManager.isRedoPossible() ); + + // leave the context, check the listener has been notified properly, and the notified context depth is correct + i_undoManager.leaveUndoContext(); + assertTrue( m_undoListener.wasContextLeft() ); + assertFalse( m_undoListener.wasHiddenContextLeft() ); + assertFalse( m_undoListener.hasContextBeenCancelled() ); + assertEquals( "unexpected undo context depth leaving a non-empty context", 0, m_undoListener.getCurrentUndoContextDepth() ); + + // ............................................................................................................. + // part II: empty contexts + i_undoManager.reset(); + m_undoListener.reset(); + + // enter a context, leave it immediately without adding an action to it + i_undoManager.enterUndoContext( "Undo Context" ); + i_undoManager.leaveUndoContext(); + assertFalse( m_undoListener.wasContextLeft() ); + assertFalse( m_undoListener.wasHiddenContextLeft() ); + assertTrue( m_undoListener.hasContextBeenCancelled() ); + assertFalse( "leaving an empty context should silently remove it, and not contribute to the stack", + i_undoManager.isUndoPossible() ); + } + + // ----------------------------------------------------------------------------------------------------------------- + private void impl_testNestedContexts( final XUndoManager i_undoManager ) throws com.sun.star.uno.Exception + { + i_undoManager.reset(); + m_undoListener.reset(); + i_undoManager.enterUndoContext( "context 1" ); + i_undoManager.enterUndoContext( "context 1.1" ); + final CustomUndoAction action1 = new CustomUndoAction( "action 1.1.1" ); + i_undoManager.addUndoAction( action1 ); + i_undoManager.enterUndoContext( "context 1.1.2" ); + final CustomUndoAction action2 = new CustomUndoAction( "action 1.1.2.1" ); + i_undoManager.addUndoAction( action2 ); + i_undoManager.leaveUndoContext(); + final CustomUndoAction action3 = new CustomUndoAction( "action 1.1.3" ); + i_undoManager.addUndoAction( action3 ); + i_undoManager.leaveUndoContext(); + i_undoManager.leaveUndoContext(); + final CustomUndoAction action4 = new CustomUndoAction( "action 1.2" ); + i_undoManager.addUndoAction( action4 ); + + i_undoManager.undo(); + assertEquals( "undoing a single action notifies a wrong title", action4.getTitle(), m_undoListener.getMostRecentlyUndoneTitle() ); + assertTrue( "custom Undo not called", action4.undoCalled() ); + assertFalse( "too many custom Undos called", action1.undoCalled() || action2.undoCalled() || action3.undoCalled() ); + i_undoManager.undo(); + assertTrue( "nested actions not properly undone", action1.undoCalled() && action2.undoCalled() && action3.undoCalled() ); + } + + // ----------------------------------------------------------------------------------------------------------------- + private void impl_testErrorHandling( final XUndoManager i_undoManager ) throws com.sun.star.uno.Exception + { + i_undoManager.reset(); + m_undoListener.reset(); + + // try retrieving the comments for the current Undo/Redo - this should fail + boolean caughtExpected = false; + try { i_undoManager.getCurrentUndoActionTitle(); } + catch( final EmptyUndoStackException e ) { caughtExpected = true; } + assertTrue( "trying the title of the current Undo action is expected to fail for an empty stack", caughtExpected ); + + caughtExpected = false; + try { i_undoManager.getCurrentRedoActionTitle(); } + catch( final EmptyUndoStackException e ) { caughtExpected = true; } + assertTrue( "trying the title of the current Redo action is expected to fail for an empty stack", caughtExpected ); + + caughtExpected = false; + try { i_undoManager.undo(); } catch ( final EmptyUndoStackException e ) { caughtExpected = true; } + assertTrue( "undo should throw if no Undo action is on the stack", caughtExpected ); + + caughtExpected = false; + try { i_undoManager.redo(); } catch ( final EmptyUndoStackException e ) { caughtExpected = true; } + assertTrue( "redo should throw if no Redo action is on the stack", caughtExpected ); + + caughtExpected = false; + try { i_undoManager.leaveUndoContext(); } catch ( final InvalidStateException e ) { caughtExpected = true; } + assertTrue( "leaveUndoContext should throw if no context is currently open", caughtExpected ); + + caughtExpected = false; + try { i_undoManager.addUndoAction( null ); } catch ( com.sun.star.lang.IllegalArgumentException e ) { caughtExpected = true; } + assertTrue( "adding a NULL action should be rejected", caughtExpected ); + + i_undoManager.reset(); + i_undoManager.addUndoAction( new CustomUndoAction() ); + i_undoManager.addUndoAction( new CustomUndoAction() ); + i_undoManager.undo(); + i_undoManager.enterUndoContext( "Undo Context" ); + // those methods should fail when a context is open: + final String[] methodNames = new String[] { "undo", "redo", "clear", "clearRedo" }; + for ( int i=0; i<methodNames.length; ++i ) + { + caughtExpected = false; + try + { + Method method = i_undoManager.getClass().getMethod( methodNames[i], new Class[0] ); + method.invoke( i_undoManager, new Object[0] ); + } + catch ( IllegalAccessException ex ) { } + catch ( IllegalArgumentException ex ) { } + catch ( InvocationTargetException ex ) + { + Throwable targetException = ex.getTargetException(); + caughtExpected = ( targetException instanceof UndoContextNotClosedException ); + } + catch ( NoSuchMethodException ex ) { } + catch ( SecurityException ex ) { } + + assertTrue( methodNames[i] + " should be rejected when there is an open context", caughtExpected ); + } + i_undoManager.leaveUndoContext(); + + // try Undo actions which fail in their Undo/Redo + for ( int i=0; i<4; ++i ) + { + final boolean undo = ( i < 2 ); + final boolean doByAPI = ( i % 2 ) == 0; + + i_undoManager.reset(); + i_undoManager.addUndoAction( new CustomUndoAction() ); + i_undoManager.addUndoAction( new FailingUndoAction( undo ? FAIL_UNDO : FAIL_REDO ) ); + i_undoManager.addUndoAction( new CustomUndoAction() ); + i_undoManager.undo(); + if ( !undo ) + i_undoManager.undo(); + // assert preconditions for the below test + assertTrue( i_undoManager.isUndoPossible() ); + assertTrue( i_undoManager.isRedoPossible() ); + + boolean caughtUndoFailed = false; + try + { + if ( undo ) + if ( doByAPI ) + i_undoManager.undo(); + else + m_currentTestCase.getDocument().getCurrentView().dispatch( ".uno:Undo" ); + else + if ( doByAPI ) + i_undoManager.redo(); + else + m_currentTestCase.getDocument().getCurrentView().dispatch( ".uno:Redo" ); + } + catch ( UndoFailedException e ) + { + caughtUndoFailed = true; + } + if ( doByAPI ) + assertTrue( "Exceptions in XUndoAction.undo should be propagated at the API", caughtUndoFailed ); + else + assertFalse( "Undo/Redo by UI should not let escape Exceptions", caughtUndoFailed ); + if ( undo ) + { + assertFalse( "a failing Undo should clear the Undo stack", i_undoManager.isUndoPossible() ); + assertTrue( "a failing Undo should /not/ clear the Redo stack", i_undoManager.isRedoPossible() ); + } + else + { + assertTrue( "a failing Redo should /not/ clear the Undo stack", i_undoManager.isUndoPossible() ); + assertFalse( "a failing Redo should clear the Redo stack", i_undoManager.isRedoPossible() ); + } + } + } + + // ----------------------------------------------------------------------------------------------------------------- + private void impl_testStackHandling( final XUndoManager i_undoManager ) throws com.sun.star.uno.Exception + { + i_undoManager.reset(); + m_undoListener.reset(); + + assertFalse( i_undoManager.isUndoPossible() ); + assertFalse( i_undoManager.isRedoPossible() ); + + i_undoManager.addUndoAction( new CustomUndoAction() ); + assertTrue( i_undoManager.isUndoPossible() ); + assertFalse( i_undoManager.isRedoPossible() ); + i_undoManager.addUndoAction( new CustomUndoAction() ); + assertTrue( i_undoManager.isUndoPossible() ); + assertFalse( i_undoManager.isRedoPossible() ); + i_undoManager.undo(); + assertTrue( i_undoManager.isUndoPossible() ); + assertTrue( i_undoManager.isRedoPossible() ); + i_undoManager.undo(); + assertFalse( i_undoManager.isUndoPossible() ); + assertTrue( i_undoManager.isRedoPossible() ); + i_undoManager.addUndoAction( new CustomUndoAction() ); + assertTrue( i_undoManager.isUndoPossible() ); + assertFalse( "adding a new action should have cleared the Redo stack", i_undoManager.isRedoPossible() ); + } + + // ----------------------------------------------------------------------------------------------------------------- + private void impl_testClearance( final XUndoManager i_undoManager ) throws com.sun.star.uno.Exception + { + i_undoManager.reset(); + m_undoListener.reset(); + + // add an action, clear the stack, verify the listener has been called + i_undoManager.addUndoAction( new CustomUndoAction() ); + assertFalse( "clearance listener unexpectedly called", m_undoListener.wereStacksCleared() ); + assertFalse( "redo-clearance listener unexpectedly called", m_undoListener.wasRedoStackCleared() ); + i_undoManager.clear(); + assertTrue( "clearance listener not called as expected", m_undoListener.wereStacksCleared() ); + assertFalse( "redo-clearance listener unexpectedly called (2)", m_undoListener.wasRedoStackCleared() ); + + // ensure the listener is also called if the stack is actually empty at the moment of the call + m_undoListener.reset(); + assertFalse( i_undoManager.isUndoPossible() ); + i_undoManager.clear(); + assertTrue( "clearance listener is also expected to be called if the stack was empty before", m_undoListener.wereStacksCleared() ); + + // ensure the proper listeners are called for clearRedo + m_undoListener.reset(); + i_undoManager.clearRedo(); + assertFalse( m_undoListener.wereStacksCleared() ); + assertTrue( m_undoListener.wasRedoStackCleared() ); + + // ensure the redo listener is also called upon implicit redo stack clearance + m_undoListener.reset(); + i_undoManager.addUndoAction( new CustomUndoAction() ); + i_undoManager.addUndoAction( new CustomUndoAction() ); + i_undoManager.undo(); + assertTrue( i_undoManager.isUndoPossible() ); + assertTrue( i_undoManager.isRedoPossible() ); + i_undoManager.addUndoAction( new CustomUndoAction() ); + assertFalse( i_undoManager.isRedoPossible() ); + assertTrue( "implicit clearance of the Redo stack does not notify listeners", m_undoListener.wasRedoStackCleared() ); + + // test resetting the manager + m_undoListener.reset(); + i_undoManager.addUndoAction( new CustomUndoAction() ); + i_undoManager.addUndoAction( new CustomUndoAction() ); + i_undoManager.undo(); + assertTrue( i_undoManager.isUndoPossible() ); + assertTrue( i_undoManager.isRedoPossible() ); + i_undoManager.reset(); + assertFalse( i_undoManager.isUndoPossible() ); + assertFalse( i_undoManager.isRedoPossible() ); + assertTrue( "|reset| does not properly notify", m_undoListener.wasManagerReset() ); + + // resetting the manager, with open undo contexts + m_undoListener.reset(); + i_undoManager.addUndoAction( new CustomUndoAction() ); + i_undoManager.enterUndoContext( "Undo Context" ); + i_undoManager.addUndoAction( new CustomUndoAction() ); + i_undoManager.enterHiddenUndoContext(); + i_undoManager.reset(); + assertTrue( "|reset| while contexts are open does not properly notify", m_undoListener.wasManagerReset() ); + // verify the manager really has the proper context depth now + i_undoManager.enterUndoContext( "Undo Context" ); + assertEquals( "seems that |reset| did not really close the open contexts", 1, m_undoListener.getCurrentUndoContextDepth() ); + } + + // ----------------------------------------------------------------------------------------------------------------- + private void impl_testHiddenContexts( final XUndoManager i_undoManager ) throws com.sun.star.uno.Exception + { + i_undoManager.reset(); + m_undoListener.reset(); + assertFalse( "precondition for testing hidden undo contexts not met", i_undoManager.isUndoPossible() ); + + // entering a hidden context should be rejected if the stack is empty + boolean caughtExpected = false; + try { i_undoManager.enterHiddenUndoContext(); } + catch ( final EmptyUndoStackException e ) { caughtExpected = true; } + assertTrue( "entering hidden contexts should be denied on an empty stack", caughtExpected ); + + // but it should be allowed if the context is not empty + final CustomUndoAction undoAction0 = new CustomUndoAction( "Step 0" ); + i_undoManager.addUndoAction( undoAction0 ); + final CustomUndoAction undoAction1 = new CustomUndoAction( "Step 1" ); + i_undoManager.addUndoAction( undoAction1 ); + i_undoManager.enterHiddenUndoContext(); + final CustomUndoAction hiddenUndoAction = new CustomUndoAction( "hidden context action" ); + i_undoManager.addUndoAction( hiddenUndoAction ); + i_undoManager.leaveUndoContext(); + assertFalse( "leaving a hidden should not call |leftUndocontext|", m_undoListener.wasContextLeft() ); + assertTrue( "leaving a hidden does not call |leftHiddenUndocontext|", m_undoListener.wasHiddenContextLeft() ); + assertFalse( "leaving a non-empty hidden context claims to have cancelled it", m_undoListener.hasContextBeenCancelled() ); + assertEquals( "leaving a hidden context is not properly notified", 0, m_undoListener.getCurrentUndoContextDepth() ); + assertArrayEquals( "unexpected Undo stack after leaving a hidden context", + new String[] { undoAction1.getTitle(), undoAction0.getTitle() }, + i_undoManager.getAllUndoActionTitles() ); + + // and then calling |undo| once should not only undo everything in the hidden context, but also + // the previous action - but not more + i_undoManager.undo(); + assertTrue( "Undo after leaving a hidden context does not actually undo the context actions", + hiddenUndoAction.undoCalled() ); + assertTrue( "Undo after leaving a hidden context does not undo the predecessor action", + undoAction1.undoCalled() ); + assertFalse( "Undo after leaving a hidden context undoes too much", + undoAction0.undoCalled() ); + + // leaving an empty hidden context should call the proper notification method + m_undoListener.reset(); + i_undoManager.enterHiddenUndoContext(); + i_undoManager.leaveUndoContext(); + assertFalse( m_undoListener.wasContextLeft() ); + assertFalse( m_undoListener.wasHiddenContextLeft() ); + assertTrue( m_undoListener.hasContextBeenCancelled() ); + + // nesting hidden and normal contexts + m_undoListener.reset(); + i_undoManager.reset(); + final CustomUndoAction action0 = new CustomUndoAction( "action 0" ); + i_undoManager.addUndoAction( action0 ); + i_undoManager.enterUndoContext( "context 1" ); + final CustomUndoAction action1 = new CustomUndoAction( "action 1" ); + i_undoManager.addUndoAction( action1 ); + i_undoManager.enterHiddenUndoContext(); + final CustomUndoAction action2 = new CustomUndoAction( "action 2" ); + i_undoManager.addUndoAction( action2 ); + i_undoManager.enterUndoContext( "context 2" ); + // is entering a hidden context rejected even at the nesting level > 0 (the above test was for nesting level == 0)? + caughtExpected = false; + try { i_undoManager.enterHiddenUndoContext(); } + catch( final EmptyUndoStackException e ) { caughtExpected = true; } + assertTrue( "at a nesting level > 0, denied hidden contexts does not work as expected", caughtExpected ); + final CustomUndoAction action3 = new CustomUndoAction( "action 3" ); + i_undoManager.addUndoAction( action3 ); + i_undoManager.enterHiddenUndoContext(); + assertEquals( "mixed hidden/normal context do are not properly notified", 4, m_undoListener.getCurrentUndoContextDepth() ); + i_undoManager.leaveUndoContext(); + assertTrue( "the left context was empty - why wasn't 'cancelled' notified?", m_undoListener.hasContextBeenCancelled() ); + assertFalse( m_undoListener.wasContextLeft() ); + assertFalse( m_undoListener.wasHiddenContextLeft() ); + i_undoManager.leaveUndoContext(); + i_undoManager.leaveUndoContext(); + i_undoManager.leaveUndoContext(); + i_undoManager.undo(); + assertFalse( "one action too much has been undone", action0.undoCalled() ); + assertTrue( action1.undoCalled() ); + assertTrue( action2.undoCalled() ); + assertTrue( action3.undoCalled() ); + } + + // ----------------------------------------------------------------------------------------------------------------- + private XComponentContext getContext() + { + return m_connection.getComponentContext(); + } + + // ----------------------------------------------------------------------------------------------------------------- + private XMultiServiceFactory getORB() + { + final XMultiServiceFactory xMSF1 = UnoRuntime.queryInterface( + XMultiServiceFactory.class, getContext().getServiceManager() ); + return xMSF1; + } + + // ----------------------------------------------------------------------------------------------------------------- + @BeforeClass + public static void setUpConnection() throws Exception + { + System.out.println( "--------------------------------------------------------------------------------" ); + System.out.println( "starting class: " + UndoManager.class.getName() ); + System.out.println( "connecting ..." ); + m_connection.setUp(); + } + + // ----------------------------------------------------------------------------------------------------------------- + @AfterClass + public static void tearDownConnection() throws InterruptedException, com.sun.star.uno.Exception + { + System.out.println(); + System.out.println( "tearing down connection" ); + m_connection.tearDown(); + System.out.println( "finished class: " + UndoManager.class.getName() ); + System.out.println( "--------------------------------------------------------------------------------" ); + } + + // ----------------------------------------------------------------------------------------------------------------- + private static class CustomUndoAction implements XUndoAction, XComponent + { + CustomUndoAction() + { + m_title = "Custom Undo Action"; + } + + CustomUndoAction( final String i_title ) + { + m_title = i_title; + } + + public String getTitle() + { + return m_title; + } + + public void undo() throws UndoFailedException + { + m_undoCalled = true; + } + + public void redo() throws UndoFailedException + { + m_redoCalled = true; + } + + public void dispose() + { + m_disposed = true; + } + + public void addEventListener( XEventListener xl ) + { + fail( "addEventListener is not expected to be called in the course of this test" ); + } + + public void removeEventListener( XEventListener xl ) + { + fail( "removeEventListener is not expected to be called in the course of this test" ); + } + + boolean undoCalled() { return m_undoCalled; } + boolean redoCalled() { return m_redoCalled; } + boolean disposed() { return m_disposed; } + + private final String m_title; + private boolean m_undoCalled = false; + private boolean m_redoCalled = false; + private boolean m_disposed = false; + } + + private static short FAIL_UNDO = 1; + private static short FAIL_REDO = 2; + + private static class FailingUndoAction implements XUndoAction + { + FailingUndoAction( final short i_failWhich ) + { + m_failWhich = i_failWhich; + } + + public String getTitle() + { + return "failing undo"; + } + + public void undo() throws UndoFailedException + { + if ( m_failWhich != FAIL_REDO ) + impl_throw(); + } + + public void redo() throws UndoFailedException + { + if ( m_failWhich != FAIL_UNDO ) + impl_throw(); + } + + private void impl_throw() throws UndoFailedException + { + throw new UndoFailedException(); + } + + private final short m_failWhich; + } + + // ----------------------------------------------------------------------------------------------------------------- + private static class CountingUndoAction implements XUndoAction + { + CountingUndoAction( final int i_expectedOrder, final Object i_lock, final Integer[] i_actionsUndoneCounter ) + { + m_expectedOrder = i_expectedOrder; + m_lock = i_lock; + m_actionsUndoneCounter = i_actionsUndoneCounter; + } + + public String getTitle() + { + return "Counting Undo Action"; + } + + public void undo() throws UndoFailedException + { + synchronized( m_lock ) + { + assertEquals( "Undo action called out of order", m_expectedOrder, m_actionsUndoneCounter[0].intValue() ); + ++m_actionsUndoneCounter[0]; + } + } + + public void redo() throws UndoFailedException + { + fail( "CountingUndoAction.redo is not expected to be called in this test." ); + } + private final int m_expectedOrder; + private final Object m_lock; + private Integer[] m_actionsUndoneCounter; + } + + // ----------------------------------------------------------------------------------------------------------------- + private static String getCallbackUndoContextTitle() + { + return "Some Unfinished Undo Context"; + } + + // ----------------------------------------------------------------------------------------------------------------- + private static String getCallbackComponentServiceName() + { + return "org.openoffice.complex.sfx2.Callback"; + } + + // ----------------------------------------------------------------------------------------------------------------- + /** + * a factory for a callback component which, at OOo runtime, is inserted into OOo's "component repository" + */ + private class CallbackComponentFactory implements XSingleComponentFactory, XServiceInfo, XComponent + { + public Object createInstanceWithContext( XComponentContext i_context ) throws com.sun.star.uno.Exception + { + return new CallbackComponent(); + } + + public Object createInstanceWithArgumentsAndContext( Object[] i_arguments, XComponentContext i_context ) throws com.sun.star.uno.Exception + { + return createInstanceWithContext( i_context ); + } + + public String getImplementationName() + { + return "org.openoffice.complex.sfx2.CallbackComponent"; + } + + public boolean supportsService( String i_serviceName ) + { + return i_serviceName.equals( getCallbackComponentServiceName() ); + } + + public String[] getSupportedServiceNames() + { + return new String[] { getCallbackComponentServiceName() }; + } + + public void dispose() + { + final EventObject event = new EventObject( this ); + + final ArrayList eventListenersCopy = (ArrayList)m_eventListeners.clone(); + final Iterator iter = eventListenersCopy.iterator(); + while ( iter.hasNext() ) + { + ((XEventListener)iter.next()).disposing( event ); + } + } + + public void addEventListener( XEventListener i_listener ) + { + if ( i_listener != null ) + m_eventListeners.add( i_listener ); + } + + public void removeEventListener( XEventListener i_listener ) + { + m_eventListeners.remove( i_listener ); + } + + private final ArrayList m_eventListeners = new ArrayList(); + }; + + // ----------------------------------------------------------------------------------------------------------------- + private class CallbackComponent implements XJob, XTypeProvider + { + CallbackComponent() + { + } + + public Object execute( NamedValue[] i_parameters ) throws com.sun.star.lang.IllegalArgumentException, com.sun.star.uno.Exception + { + // this method is called from within the Basic script which is to check whether the OOo framework + // properly cleans up unfinished Undo contexts. It is called immediately after the context has been + // entered, so verify the expected Undo manager state. + assertEquals( getCallbackUndoContextTitle(), m_undoListener.getCurrentUndoContextTitle() ); + assertEquals( 1, m_undoListener.getCurrentUndoContextDepth() ); + + synchronized( m_callbackCondition ) + { + m_callbackCalled = true; + m_callbackCondition.notifyAll(); + } + return m_closeAfterCallback ? "close" : ""; + } + + public Type[] getTypes() + { + final Class interfaces[] = getClass().getInterfaces(); + Type types[] = new Type[ interfaces.length ]; + for ( int i = 0; i < interfaces.length; ++i ) + types[i] = new Type(interfaces[i]); + return types; + } + + public byte[] getImplementationId() + { + return getClass().toString().getBytes(); + } + } + + private static final OfficeConnection m_connection = new OfficeConnection(); + private DocumentTest m_currentTestCase; + private OfficeDocument m_currentDocument; + private UndoListener m_undoListener; + private CallbackComponentFactory m_callbackFactory = null; + private boolean m_callbackCalled = false; + private boolean m_closeAfterCallback = false; + private final Object m_callbackCondition = new Object(); +} diff --git a/sfx2/qa/complex/framework/DocHelper/makefile.mk b/sfx2/qa/complex/sfx2/makefile.mk index ad614cfca3f8..95a483bf2497 100644 --- a/sfx2/qa/complex/framework/DocHelper/makefile.mk +++ b/sfx2/qa/complex/sfx2/makefile.mk @@ -25,25 +25,59 @@ # #************************************************************************* -PRJ = ../../../.. -TARGET = DocHelper -PRJNAME = $(TARGET) -PACKAGE = complex/framework/dochelper +.IF "$(OOO_JUNIT_JAR)" == "" +nothing .PHONY: + @echo ----------------------------------------------------- + @echo - JUnit not available, not building anything + @echo ----------------------------------------------------- +.ELSE # IF "$(OOO_JUNIT_JAR)" != "" + +PRJ = ../../.. +PRJNAME = sfx2 +TARGET = qa_complex +PACKAGE = complex/sfx2 # --- Settings ----------------------------------------------------- .INCLUDE: settings.mk - #----- compile .java files ----------------------------------------- -JARFILES = ridl.jar unoil.jar jurt.jar juh.jar java_uno.jar OOoRunner.jar -JAVAFILES = \ - DialogThread.java \ - WriterHelper.java +JARFILES = OOoRunner.jar ridl.jar test.jar test-tools.jar unoil.jar +EXTRAJARFILES = $(OOO_JUNIT_JAR) +JAVAFILES = $(shell @$(FIND) . -name "*.java") \ + +#----- create a jar from compiled files ---------------------------- + +JARTARGET = $(TARGET).jar -JAVACLASSFILES = $(foreach,i,$(JAVAFILES) $(CLASSDIR)/$(PACKAGE)/$(i:b).class) +#----- JUnit tests class ------------------------------------------- + +JAVATESTFILES = \ + DocumentInfo.java \ + DocumentProperties.java \ + StandaloneDocumentInfo.java \ + DocumentMetadataAccess.java \ + +# disabled: #i115674# +# GlobalEventBroadcaster.java \ # --- Targets ------------------------------------------------------ -.INCLUDE : target.mk +.INCLUDE: target.mk + +ALL : ALLTAR + +# --- subsequent tests --------------------------------------------- + +.IF "$(OOO_SUBSEQUENT_TESTS)" != "" + +.INCLUDE: installationtest.mk + +ALLTAR : javatest + + # Sample how to debug + # JAVAIFLAGS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=9003,suspend=y + +.END # "$(OOO_SUBSEQUENT_TESTS)" == "" +.END # ELSE "$(OOO_JUNIT_JAR)" != "" diff --git a/sfx2/qa/complex/standalonedocumentinfo/StandaloneDocumentInfoTest.java b/sfx2/qa/complex/sfx2/standalonedocinfo/StandaloneDocumentInfoTest.java index f5512bf9723b..d255f3d16822 100644 --- a/sfx2/qa/complex/standalonedocumentinfo/StandaloneDocumentInfoTest.java +++ b/sfx2/qa/complex/sfx2/standalonedocinfo/StandaloneDocumentInfoTest.java @@ -24,7 +24,7 @@ * for a copy of the LGPLv3 License. * ************************************************************************/ -package complex.standalonedocumentinfo; +package complex.sfx2.standalonedocinfo; public interface StandaloneDocumentInfoTest { boolean test(); diff --git a/sfx2/qa/complex/standalonedocumentinfo/Test01.java b/sfx2/qa/complex/sfx2/standalonedocinfo/Test01.java index 2f9a6266b4e2..bf54bb4ca90b 100644 --- a/sfx2/qa/complex/standalonedocumentinfo/Test01.java +++ b/sfx2/qa/complex/sfx2/standalonedocinfo/Test01.java @@ -24,8 +24,10 @@ * for a copy of the LGPLv3 License. * ************************************************************************/ -package complex.standalonedocumentinfo; +package complex.sfx2.standalonedocinfo; +import complex.sfx2.standalonedocinfo.TestHelper; +import complex.sfx2.standalonedocinfo.StandaloneDocumentInfoTest; import com.sun.star.lang.XMultiServiceFactory; import com.sun.star.document.XStandaloneDocumentInfo; import com.sun.star.io.XTempFile; diff --git a/sfx2/qa/complex/standalonedocumentinfo/TestHelper.java b/sfx2/qa/complex/sfx2/standalonedocinfo/TestHelper.java index f6d63e1b7793..a650ce9bb2e4 100644 --- a/sfx2/qa/complex/standalonedocumentinfo/TestHelper.java +++ b/sfx2/qa/complex/sfx2/standalonedocinfo/TestHelper.java @@ -24,7 +24,7 @@ * for a copy of the LGPLv3 License. * ************************************************************************/ -package complex.standalonedocumentinfo; +package complex.sfx2.standalonedocinfo; public class TestHelper { diff --git a/sfx2/qa/complex/framework/testdocuments/CUSTOM.odt b/sfx2/qa/complex/sfx2/testdocuments/CUSTOM.odt Binary files differindex 831a8f451dfd..831a8f451dfd 100644 --- a/sfx2/qa/complex/framework/testdocuments/CUSTOM.odt +++ b/sfx2/qa/complex/sfx2/testdocuments/CUSTOM.odt diff --git a/sfx2/qa/complex/framework/testdocuments/TEST.odt b/sfx2/qa/complex/sfx2/testdocuments/TEST.odt Binary files differindex 7c6f0b60f7b0..7c6f0b60f7b0 100644 --- a/sfx2/qa/complex/framework/testdocuments/TEST.odt +++ b/sfx2/qa/complex/sfx2/testdocuments/TEST.odt diff --git a/sfx2/qa/complex/framework/testdocuments/TESTRDFA.odt b/sfx2/qa/complex/sfx2/testdocuments/TESTRDFA.odt Binary files differindex d59739142df6..d59739142df6 100644 --- a/sfx2/qa/complex/framework/testdocuments/TESTRDFA.odt +++ b/sfx2/qa/complex/sfx2/testdocuments/TESTRDFA.odt diff --git a/sfx2/qa/complex/framework/testdocuments/empty.rdf b/sfx2/qa/complex/sfx2/testdocuments/empty.rdf index af62bab39dfa..af62bab39dfa 100644 --- a/sfx2/qa/complex/framework/testdocuments/empty.rdf +++ b/sfx2/qa/complex/sfx2/testdocuments/empty.rdf diff --git a/sfx2/qa/complex/framework/DialogThread.java b/sfx2/qa/complex/sfx2/tools/DialogThread.java index 7151ccbb292d..e67e65f218db 100644 --- a/sfx2/qa/complex/framework/DialogThread.java +++ b/sfx2/qa/complex/sfx2/tools/DialogThread.java @@ -24,7 +24,7 @@ * for a copy of the LGPLv3 License. * ************************************************************************/ -package complex.framework.DocHelper; +package complex.sfx2.tools; import com.sun.star.beans.PropertyValue; import com.sun.star.frame.XController; @@ -37,9 +37,6 @@ import com.sun.star.uno.UnoRuntime; import com.sun.star.util.URL; import com.sun.star.util.XURLTransformer; -import java.lang.Thread; - - /** * This class opens a given dialog in a separate Thread by dispatching an url * @@ -55,21 +52,17 @@ public class DialogThread extends Thread { this.m_url = url; } + @Override public void run() { - XModel aModel = (XModel) UnoRuntime.queryInterface(XModel.class, - m_xDoc); + XModel aModel = UnoRuntime.queryInterface( XModel.class, m_xDoc ); XController xController = aModel.getCurrentController(); //Opening Dialog try { - XDispatchProvider xDispProv = (XDispatchProvider) UnoRuntime.queryInterface( - XDispatchProvider.class, - xController.getFrame()); - XURLTransformer xParser = (com.sun.star.util.XURLTransformer) UnoRuntime.queryInterface( - XURLTransformer.class, - m_xMSF.createInstance( - "com.sun.star.util.URLTransformer")); + XDispatchProvider xDispProv = UnoRuntime.queryInterface( XDispatchProvider.class, xController.getFrame() ); + XURLTransformer xParser = UnoRuntime.queryInterface( XURLTransformer.class, + m_xMSF.createInstance( "com.sun.star.util.URLTransformer" ) ); // Because it's an in/out parameter // we must use an array of URL objects. diff --git a/sfx2/qa/complex/framework/TestDocument.java b/sfx2/qa/complex/sfx2/tools/TestDocument.java index 8cc6ef7756b1..120dca978bba 100644 --- a/sfx2/qa/complex/framework/TestDocument.java +++ b/sfx2/qa/complex/sfx2/tools/TestDocument.java @@ -25,12 +25,12 @@ * ************************************************************************/ -package complex.framework; +package complex.sfx2.tools; import java.io.File; import org.openoffice.test.OfficeFileUrl; -final class TestDocument { +public final class TestDocument { public static String getUrl(String name) { return OfficeFileUrl.getAbsolute(new File("testdocuments", name)); } diff --git a/sfx2/qa/complex/framework/WriterHelper.java b/sfx2/qa/complex/sfx2/tools/WriterHelper.java index d3f19703bb9d..4767028572bb 100644 --- a/sfx2/qa/complex/framework/WriterHelper.java +++ b/sfx2/qa/complex/sfx2/tools/WriterHelper.java @@ -24,7 +24,7 @@ * for a copy of the LGPLv3 License. * ************************************************************************/ -package complex.framework.DocHelper; +package complex.sfx2.tools; import com.sun.star.accessibility.AccessibleRole; import com.sun.star.accessibility.XAccessible; @@ -40,7 +40,6 @@ import com.sun.star.text.XTextDocument; import com.sun.star.uno.UnoRuntime; import com.sun.star.util.XCloseable; -import complex.framework.DocHelper.DialogThread; import java.io.PrintWriter; import util.AccessibilityTools; @@ -104,13 +103,12 @@ public class WriterHelper { if (createButton.length() > 1) { XExtendedToolkit tk = getToolkit(); - AccessibilityTools at = new AccessibilityTools(); Object atw = tk.getActiveTopWindow(); XWindow xWindow = UnoRuntime.queryInterface(XWindow.class, atw); - XAccessible xRoot = at.getAccessibleObject(xWindow); - XAccessibleContext buttonContext = at.getAccessibleObjectForRole( + XAccessible xRoot = AccessibilityTools.getAccessibleObject(xWindow); + XAccessibleContext buttonContext = AccessibilityTools.getAccessibleObjectForRole( xRoot, AccessibleRole.PUSH_BUTTON, createButton); @@ -154,28 +152,26 @@ public class WriterHelper { public XTextDocument DocByAutopilot(XMultiServiceFactory msf, int[] indexes, boolean destroyLocal, String bName) { - XTextDocument xLocalDoc = WriterTools.createTextDoc(m_xMSF); + XTextDocument xTextDoc = WriterTools.createTextDoc(m_xMSF); Object toolkit = null; try { toolkit = msf.createInstance("com.sun.star.awt.Toolkit"); } catch (com.sun.star.uno.Exception e) { - e.printStackTrace(); + e.printStackTrace( System.err ); } XExtendedToolkit tk = UnoRuntime.queryInterface(XExtendedToolkit.class, toolkit); shortWait(); - AccessibilityTools at = new AccessibilityTools(); - Object atw = tk.getActiveTopWindow(); XWindow xWindow = UnoRuntime.queryInterface(XWindow.class, atw); - XAccessible xRoot = at.getAccessibleObject(xWindow); + XAccessible xRoot = AccessibilityTools.getAccessibleObject(xWindow); - XAccessibleContext ARoot = at.getAccessibleObjectForRole(xRoot, + XAccessibleContext ARoot = AccessibilityTools.getAccessibleObjectForRole(xRoot, AccessibleRole.MENU_BAR); XAccessibleSelection sel = UnoRuntime.queryInterface(XAccessibleSelection.class, ARoot); @@ -196,11 +192,11 @@ public class WriterHelper { xWindow = UnoRuntime.queryInterface(XWindow.class, atw); - xRoot = at.getAccessibleObject(xWindow); + xRoot = AccessibilityTools.getAccessibleObject(xWindow); //at.printAccessibleTree(new PrintWriter(System.out),xRoot); - XAccessibleAction action = UnoRuntime.queryInterface(XAccessibleAction.class, at.getAccessibleObjectForRole(xRoot, AccessibleRole.PUSH_BUTTON, bName)); + XAccessibleAction action = UnoRuntime.queryInterface(XAccessibleAction.class, AccessibilityTools.getAccessibleObjectForRole(xRoot, AccessibleRole.PUSH_BUTTON, bName)); try { action.doAccessibleAction(0); @@ -213,11 +209,11 @@ public class WriterHelper { xWindow = UnoRuntime.queryInterface(XWindow.class, atw); - xRoot = at.getAccessibleObject(xWindow); + xRoot = AccessibilityTools.getAccessibleObject(xWindow); - at.printAccessibleTree(new PrintWriter(System.out),xRoot); + AccessibilityTools.printAccessibleTree(new PrintWriter(System.out),xRoot); - action = UnoRuntime.queryInterface(XAccessibleAction.class, at.getAccessibleObjectForRole(xRoot, AccessibleRole.PUSH_BUTTON, "Yes")); + action = UnoRuntime.queryInterface(XAccessibleAction.class, AccessibilityTools.getAccessibleObjectForRole(xRoot, AccessibleRole.PUSH_BUTTON, "Yes")); try { if (action != null) action.doAccessibleAction(0); @@ -231,7 +227,7 @@ public class WriterHelper { XTextDocument returnDoc = UnoRuntime.queryInterface(XTextDocument.class, xDesktop.getCurrentComponent()); if (destroyLocal) { - closeDoc(xLocalDoc); + closeDoc(xTextDoc); } return returnDoc; @@ -259,7 +255,7 @@ public class WriterHelper { toolkit = m_xMSF.createInstance("com.sun.star.awt.Toolkit"); } catch (com.sun.star.uno.Exception e) { System.out.println("Couldn't get toolkit"); - e.printStackTrace(); + e.printStackTrace( System.err ); } XExtendedToolkit tk = UnoRuntime.queryInterface(XExtendedToolkit.class, toolkit); @@ -277,7 +273,7 @@ public class WriterHelper { desk = m_xMSF.createInstance("com.sun.star.frame.Desktop"); } catch (com.sun.star.uno.Exception e) { System.out.println("Couldn't get desktop"); - e.printStackTrace(); + e.printStackTrace( System.err ); } XDesktop xDesktop = UnoRuntime.queryInterface(XDesktop.class, desk); diff --git a/sfx2/qa/complex/sfx2/undo/CalcDocumentTest.java b/sfx2/qa/complex/sfx2/undo/CalcDocumentTest.java new file mode 100755 index 000000000000..34825fdbada9 --- /dev/null +++ b/sfx2/qa/complex/sfx2/undo/CalcDocumentTest.java @@ -0,0 +1,96 @@ +package complex.sfx2.undo; + +import org.openoffice.test.tools.SpreadsheetDocument; +import com.sun.star.table.XCellRange; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.table.XCell; +import com.sun.star.uno.UnoRuntime; +import org.openoffice.test.tools.DocumentType; +import static org.junit.Assert.*; + +/** + * implements the {@link DocumentTest} interface on top of a spreadsheet document + * @author frank.schoenheit@oracle.com + */ +public class CalcDocumentTest extends DocumentTestBase +{ + public CalcDocumentTest( final XMultiServiceFactory i_orb ) throws Exception + { + super( i_orb, DocumentType.CALC ); + } + + public String getDocumentDescription() + { + return "spreadsheet document"; + } + + public void initializeDocument() throws com.sun.star.uno.Exception + { + final XCell cellA1 = getCellA1(); + cellA1.setValue( INIT_VALUE ); + assertEquals( "initializing the cell value didn't work", cellA1.getValue(), INIT_VALUE, 0 ); + + XCellRange range = UnoRuntime.queryInterface( XCellRange.class, + ((SpreadsheetDocument)m_document).getSheet(0) ); + + for ( int i=0; i<12; ++i ) + { + XCell cell = range.getCellByPosition( 1, i ); + cell.setFormula( "" ); + } + } + + public void doSingleModification() throws com.sun.star.uno.Exception + { + final XCell cellA1 = getCellA1(); + assertEquals( "initial cell value not as expected", INIT_VALUE, cellA1.getValue(), 0 ); + cellA1.setValue( MODIFIED_VALUE ); + assertEquals( "modified cell value not as expected", MODIFIED_VALUE, cellA1.getValue(), 0 ); + } + + public void verifyInitialDocumentState() throws com.sun.star.uno.Exception + { + final XCell cellA1 = getCellA1(); + assertEquals( "cell A1 doesn't have its initial value", INIT_VALUE, cellA1.getValue(), 0 ); + + XCellRange range = UnoRuntime.queryInterface( XCellRange.class, + ((SpreadsheetDocument)m_document).getSheet(0) ); + for ( int i=0; i<12; ++i ) + { + final XCell cell = range.getCellByPosition( 1, i ); + assertEquals( "Cell B" + (i+1) + " not having its initial value (an empty string)", "", cell.getFormula() ); + } + } + + public void verifySingleModificationDocumentState() throws com.sun.star.uno.Exception + { + final XCell cellA1 = getCellA1(); + assertEquals( "cell A1 doesn't have the value which we gave it", MODIFIED_VALUE, cellA1.getValue(), 0 ); + } + + public int doMultipleModifications() throws com.sun.star.uno.Exception + { + XCellRange range = UnoRuntime.queryInterface( XCellRange.class, + ((SpreadsheetDocument)m_document).getSheet(0) ); + + final String[] months = new String[] { + "January", "February", "March", "April", "May", "June", "July", "August", + "September", "October", "November", "December" }; + for ( int i=0; i<12; ++i ) + { + final XCell cell = range.getCellByPosition( 1, i ); + cell.setFormula( months[i] ); + } + return 12; + } + + private XCell getCellA1() throws com.sun.star.uno.Exception + { + XCellRange range = UnoRuntime.queryInterface( XCellRange.class, + ((SpreadsheetDocument)m_document).getSheet(0) ); + return range.getCellByPosition( 0, 0 ); + } + + private static final double INIT_VALUE = 100.0; + private static final double MODIFIED_VALUE = 200.0; +} diff --git a/sfx2/qa/complex/sfx2/undo/ChartDocumentTest.java b/sfx2/qa/complex/sfx2/undo/ChartDocumentTest.java new file mode 100755 index 000000000000..8dcabef8370e --- /dev/null +++ b/sfx2/qa/complex/sfx2/undo/ChartDocumentTest.java @@ -0,0 +1,322 @@ +/************************************************************************* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + *************************************************************************/ + +package complex.sfx2.undo; + +import com.sun.star.chart2.XAxis; +import com.sun.star.chart2.XCoordinateSystem; +import com.sun.star.chart2.XCoordinateSystemContainer; +import com.sun.star.awt.Size; +import com.sun.star.beans.NamedValue; +import com.sun.star.beans.XPropertySet; +import com.sun.star.chart2.XChartDocument; +import com.sun.star.chart2.XDiagram; +import com.sun.star.container.XIndexAccess; +import com.sun.star.document.UndoFailedException; +import com.sun.star.document.XUndoAction; +import com.sun.star.document.XUndoManager; +import com.sun.star.document.XUndoManagerSupplier; +import com.sun.star.drawing.XShape; +import com.sun.star.embed.EmbedStates; +import com.sun.star.embed.EmbedVerbs; +import com.sun.star.embed.VerbDescriptor; +import com.sun.star.embed.WrongStateException; +import com.sun.star.embed.XEmbeddedObject; +import com.sun.star.embed.XStateChangeBroadcaster; +import com.sun.star.embed.XStateChangeListener; +import com.sun.star.lang.EventObject; +import com.sun.star.lang.IndexOutOfBoundsException; +import com.sun.star.lang.WrappedTargetException; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.text.XTextContent; +import com.sun.star.text.XTextRange; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.view.XSelectionSupplier; +import org.openoffice.test.tools.DocumentType; +import org.openoffice.test.tools.OfficeDocument; +import static org.junit.Assert.*; + +/** + * @author frank.schoenheit@oracle.com + */ +public class ChartDocumentTest implements DocumentTest +{ + public ChartDocumentTest( final XMultiServiceFactory i_orb ) throws com.sun.star.uno.Exception, InterruptedException + { + m_textDocument = OfficeDocument.blankDocument( i_orb, DocumentType.WRITER ); + + // create a OLE shape in the document + final XMultiServiceFactory factory = UnoRuntime.queryInterface( XMultiServiceFactory.class, m_textDocument.getDocument() ); + final String shapeServiceName = "com.sun.star.text.TextEmbeddedObject"; + final XPropertySet shapeProps = UnoRuntime.queryInterface( XPropertySet.class, factory.createInstance( shapeServiceName ) ); + shapeProps.setPropertyValue("CLSID", "12dcae26-281f-416f-a234-c3086127382e"); + + final XShape shape = UnoRuntime.queryInterface( XShape.class, shapeProps ); + shape.setSize( new Size( 16000, 9000 ) ); + + final XTextContent chartTextContent = UnoRuntime.queryInterface( XTextContent.class, shapeProps ); + + final XSelectionSupplier selSupplier = UnoRuntime.queryInterface( XSelectionSupplier.class, + m_textDocument.getCurrentView().getController() ); + final Object selection = selSupplier.getSelection(); + final XTextRange textRange = getAssociatedTextRange( selection ); + if ( textRange == null ) + throw new RuntimeException( "can't locate a text range" ); + + // insert the chart + textRange.getText().insertTextContent(textRange, chartTextContent, false); + + // retrieve the chart model + XChartDocument chartDoc = UnoRuntime.queryInterface( XChartDocument.class, shapeProps.getPropertyValue( "Model" ) ); + m_chartDocument = new OfficeDocument( i_orb, chartDoc ); + + final XEmbeddedObject embeddedChart = UnoRuntime.queryInterface( XEmbeddedObject.class, + shapeProps.getPropertyValue( "EmbeddedObject" ) ); + final XStateChangeBroadcaster stateBroadcaster = UnoRuntime.queryInterface( XStateChangeBroadcaster.class, embeddedChart ); + stateBroadcaster.addStateChangeListener( new ChartStateListener() ); + + // activate the chart + selSupplier.select( shape ); + + // some Writer-internal processes, which are a pre-condition for being able to successfully dispatch + // the ObjectMenu command, run asynchronously, without a chance of being notified when they're finished :( + // So, wait a little, again ... + synchronized ( embeddedChart ) { embeddedChart.wait( 500 ); } + // ... and check if those processes are finished + final VerbDescriptor[] verbs = embeddedChart.getSupportedVerbs(); + boolean canActivate = true; + for ( int i=0; i<verbs.length && !canActivate; ++i ) + if ( verbs[i].VerbID == EmbedVerbs.MS_OLEVERB_SHOW ) + canActivate = true; + assertTrue( "cannot activate OLE object", canActivate ); + + // actually activate the object + //embeddedChart.doVerb( EmbedVerbs.MS_OLEVERB_SHOW ); + // if we could use XEmbeddedObject.setVerb, then we would not need the "select" thingie above, and also + // the asynchronous dispatch below would not be necessary. + // Sadly, doVerb at the moment reliably deadlocks ... :( + + m_textDocument.getCurrentView().dispatch( ".uno:ObjectMenue", new NamedValue[] { new NamedValue( "VerbID", EmbedVerbs.MS_OLEVERB_SHOW ) } ); + + // the dispatch happens asynchronously, so wait a little (at most 1 seconds) until the chart really has been activated + synchronized ( m_chartActivatedCondition ) { m_chartActivatedCondition.wait( 1000 ); } + final int state = embeddedChart.getCurrentState(); + if ( state != EmbedStates.UI_ACTIVE ) + fail( "unable to activate the embedded chart" ); + } + + public String getDocumentDescription() + { + return "chart document"; + } + + public void initializeDocument() throws com.sun.star.uno.Exception + { + final XPropertySet wallProperties = impl_getWallProperties(); + wallProperties.setPropertyValue( "FillStyle", com.sun.star.drawing.FillStyle.SOLID ); + wallProperties.setPropertyValue( "FillColor", 0x00FFFFFF ); + } + + public void closeDocument() + { + m_textDocument.close(); + } + + private XPropertySet impl_getWallProperties() + { + final XChartDocument chartDoc = UnoRuntime.queryInterface( XChartDocument.class, m_chartDocument.getDocument() ); + final XDiagram diagram = chartDoc.getFirstDiagram(); + final XPropertySet wallProperties = diagram.getWall(); + return wallProperties; + } + + private XPropertySet impl_getYAxisProperties() + { + XPropertySet axisProperties = null; + try + { + final XChartDocument chartDoc = UnoRuntime.queryInterface( XChartDocument.class, m_chartDocument.getDocument() ); + final XDiagram diagram = chartDoc.getFirstDiagram(); + final XCoordinateSystemContainer coordContainer = UnoRuntime.queryInterface( XCoordinateSystemContainer.class, diagram ); + final XCoordinateSystem[] coordSystems = coordContainer.getCoordinateSystems(); + final XCoordinateSystem coordSystem = coordSystems[0]; + final XAxis primaryYAxis = coordSystem.getAxisByDimension( 1, 0 ); + axisProperties = UnoRuntime.queryInterface( XPropertySet.class, primaryYAxis ); + } + catch ( Exception ex ) + { + fail( "internal error: could not retrieve primary Y axis properties" ); + } + return axisProperties; + } + + private XUndoManager impl_getUndoManager() + { + final XUndoManagerSupplier undoManagerSupp = UnoRuntime.queryInterface( XUndoManagerSupplier.class, m_chartDocument.getDocument() ); + final XUndoManager undoManager = undoManagerSupp.getUndoManager(); + return undoManager; + } + + public void doSingleModification() throws com.sun.star.uno.Exception + { + final XPropertySet wallProperties = impl_getWallProperties(); + + // simulate an Undo action, as long as the chart implementation doesn't add Undo actions itself + final XUndoManager undoManager = impl_getUndoManager(); + undoManager.addUndoAction( new PropertyUndoAction( wallProperties, "FillColor", 0xCCFF44 ) ); + // (the UndoAction will actually set the property value) + } + + public void verifyInitialDocumentState() throws com.sun.star.uno.Exception + { + final XPropertySet wallProperties = impl_getWallProperties(); + assertEquals( 0x00FFFFFF, ((Integer)wallProperties.getPropertyValue( "FillColor" )).intValue() ); + } + + public void verifySingleModificationDocumentState() throws com.sun.star.uno.Exception + { + final XPropertySet wallProperties = impl_getWallProperties(); + assertEquals( 0xCCFF44, ((Integer)wallProperties.getPropertyValue( "FillColor" )).intValue() ); + } + + public int doMultipleModifications() throws com.sun.star.uno.Exception + { + final XPropertySet axisProperties = impl_getYAxisProperties(); + + final XUndoManager undoManager = impl_getUndoManager(); + undoManager.addUndoAction( new PropertyUndoAction( axisProperties, "LineWidth", 300 ) ); + undoManager.addUndoAction( new PropertyUndoAction( axisProperties, "LineColor", 0x000000 ) ); + + return 2; + } + + public OfficeDocument getDocument() + { + return m_chartDocument; + } + + private XTextRange getAssociatedTextRange( final Object i_object ) throws WrappedTargetException, IndexOutOfBoundsException + { + // possible cases: + // 1. a container of other objects - e.g. selection of 0 to n text portions, or 1 to n drawing objects + final XIndexAccess indexer = UnoRuntime.queryInterface( XIndexAccess.class, i_object ); + if ((indexer != null) && indexer.getCount() > 0) { + final int count = indexer.getCount(); + for (int i = 0; i < count; ++i) { + final XTextRange range = getAssociatedTextRange( indexer.getByIndex(i) ); + if (range != null) { + return range; + } + } + } + // 2. another TextContent, having an anchor we can use + final XTextContent textContent = UnoRuntime.queryInterface(XTextContent.class, i_object); + if (textContent != null) { + final XTextRange range = textContent.getAnchor(); + if (range != null) { + return range; + } + } + + // an object which supports XTextRange directly + final XTextRange range = UnoRuntime.queryInterface(XTextRange.class, i_object); + if (range != null) { + return range; + } + + return null; + } + + private static class PropertyUndoAction implements XUndoAction + { + PropertyUndoAction( final XPropertySet i_component, final String i_propertyName, final Object i_newValue ) throws com.sun.star.uno.Exception + { + m_component = i_component; + m_propertyName = i_propertyName; + m_newValue = i_newValue; + + m_oldValue = i_component.getPropertyValue( m_propertyName ); + i_component.setPropertyValue( m_propertyName, m_newValue ); + } + + public String getTitle() + { + return "some dummy Undo Action"; + } + + public void undo() throws UndoFailedException + { + try + { + m_component.setPropertyValue( m_propertyName, m_oldValue ); + } + catch ( com.sun.star.uno.Exception ex ) + { + throw new UndoFailedException( "", this, ex ); + } + } + + public void redo() throws UndoFailedException + { + try + { + m_component.setPropertyValue( m_propertyName, m_newValue ); + } + catch ( com.sun.star.uno.Exception ex ) + { + throw new UndoFailedException( "", this, ex ); + } + } + + private final XPropertySet m_component; + private final String m_propertyName; + private final Object m_oldValue; + private final Object m_newValue; + } + + private class ChartStateListener implements XStateChangeListener + { + public void changingState( EventObject i_event, int i_oldState, int i_newState ) throws WrongStateException + { + } + + public void stateChanged( EventObject i_event, int i_oldState, int i_newState ) + { + if ( i_newState != EmbedStates.UI_ACTIVE ) + return; + synchronized ( m_chartActivatedCondition ) + { + m_chartActivatedCondition.notifyAll(); + } + } + + public void disposing( EventObject i_event ) { } + }; + + private final OfficeDocument m_textDocument; + private final OfficeDocument m_chartDocument; + private final Object m_chartActivatedCondition = new Object(); +} diff --git a/sfx2/qa/complex/sfx2/undo/DocumentTest.java b/sfx2/qa/complex/sfx2/undo/DocumentTest.java new file mode 100755 index 000000000000..d6de90884673 --- /dev/null +++ b/sfx2/qa/complex/sfx2/undo/DocumentTest.java @@ -0,0 +1,61 @@ +package complex.sfx2.undo; + +import org.openoffice.test.tools.OfficeDocument; + +/** + * wrapper around an OfficeDocument, for running a standardized test procedure (related do Undo functionality) + * on the document. + * + * @author frank.schoenheit@oracle.com + */ +public interface DocumentTest +{ + /** + * returns a human-readable description for the document/type which the tests operates on + */ + public String getDocumentDescription(); + + /** + * initializes the document to a state where the subsequent tests can be ran + */ + public void initializeDocument() throws com.sun.star.uno.Exception; + + /** + * closes the document which the test is based on + */ + public void closeDocument(); + + /** + * does a simple modification to the document, which results in one Undo action being auto-generated + * by the OOo implementation + */ + public void doSingleModification() throws com.sun.star.uno.Exception; + + /** + * verifies the document is in the same state as after {@link #initializeDocument} + */ + public void verifyInitialDocumentState() throws com.sun.star.uno.Exception; + + /** + * verifies the document is in the state as expected after {@link #doSingleModification} + * @throws com.sun.star.uno.Exception + */ + public void verifySingleModificationDocumentState() throws com.sun.star.uno.Exception; + + /** + * does multiple modifications do the document, which would normally result in multiple Undo actions. + * + * The test framework will encapsulate the call into an {@link XUndoManager.enterUndoContext()} and + * {@link XUndoManager.leaveUndoContext()} call. + * + * @return + * the number of modifications done to the document. The caller assumes (and asserts) that the number + * of actions on the Undo stack equals this number. + */ + public int doMultipleModifications() throws com.sun.star.uno.Exception; + + /** + * returns the document which the test operates on + */ + public OfficeDocument getDocument(); +} diff --git a/sfx2/qa/complex/sfx2/undo/DocumentTestBase.java b/sfx2/qa/complex/sfx2/undo/DocumentTestBase.java new file mode 100755 index 000000000000..11adc80c2e85 --- /dev/null +++ b/sfx2/qa/complex/sfx2/undo/DocumentTestBase.java @@ -0,0 +1,29 @@ +package complex.sfx2.undo; + +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.uno.Exception; +import org.openoffice.test.tools.DocumentType; +import org.openoffice.test.tools.OfficeDocument; + +/** + * @author frank.schoenheit@oracle.com + */ +abstract class DocumentTestBase implements DocumentTest +{ + DocumentTestBase( final XMultiServiceFactory i_orb, final DocumentType i_docType ) throws Exception + { + m_document = OfficeDocument.blankDocument( i_orb, i_docType ); + } + + public OfficeDocument getDocument() + { + return m_document; + } + + public void closeDocument() + { + m_document.close(); + } + + protected final OfficeDocument m_document; +} diff --git a/sfx2/inc/sfxbasic.hxx b/sfx2/qa/complex/sfx2/undo/DrawDocumentTest.java index ff5f097500a5..d98e1372dea5 100644..100755 --- a/sfx2/inc/sfxbasic.hxx +++ b/sfx2/qa/complex/sfx2/undo/DrawDocumentTest.java @@ -1,5 +1,4 @@ /************************************************************************* - * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * Copyright 2000, 2010 Oracle and/or its affiliates. @@ -23,20 +22,25 @@ * <http://www.openoffice.org/license.html> * for a copy of the LGPLv3 License. * - ************************************************************************/ -#ifndef _SFXBASIC_HXX -#define _SFXBASIC_HXX - -class BasicManager; -class SbMethod; - -//------------------------------------------------------------------ - -SbMethod* SfxQueryMacro( BasicManager* pMgr, const String& rMacro ); + *************************************************************************/ -ErrCode SfxCallMacro( BasicManager* pMgr, const String& rMacro, - SbxArray *pArgs = 0, SbxValue *pRet = 0 ); +package complex.sfx2.undo; +import com.sun.star.lang.XMultiServiceFactory; +import org.openoffice.test.tools.DocumentType; -#endif +/** + * @author frank.schoenheit@oracle.com + */ +public class DrawDocumentTest extends DrawingOrPresentationDocumentTest +{ + public DrawDocumentTest( XMultiServiceFactory i_orb ) throws com.sun.star.uno.Exception + { + super( i_orb, DocumentType.DRAWING ); + } + public String getDocumentDescription() + { + return "drawing document"; + } +} diff --git a/sfx2/qa/complex/sfx2/undo/DrawingOrPresentationDocumentTest.java b/sfx2/qa/complex/sfx2/undo/DrawingOrPresentationDocumentTest.java new file mode 100755 index 000000000000..916e1908e93d --- /dev/null +++ b/sfx2/qa/complex/sfx2/undo/DrawingOrPresentationDocumentTest.java @@ -0,0 +1,196 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +package complex.sfx2.undo; + +import com.sun.star.awt.Rectangle; +import com.sun.star.document.XUndoManager; +import com.sun.star.document.XUndoManagerSupplier; +import com.sun.star.document.XUndoAction; +import com.sun.star.awt.Point; +import com.sun.star.awt.Size; +import com.sun.star.beans.XPropertySet; +import com.sun.star.drawing.CircleKind; +import com.sun.star.drawing.XDrawPages; +import com.sun.star.drawing.XDrawPagesSupplier; +import com.sun.star.drawing.XShape; +import com.sun.star.drawing.XShapes; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.uno.UnoRuntime; +import org.openoffice.test.tools.DocumentType; +import static org.junit.Assert.*; + +/** + * implements the {@link DocumentTest} interface on top of a drawing document + * @author frank.schoenheit@oracle.com + */ +public abstract class DrawingOrPresentationDocumentTest extends DocumentTestBase +{ + public DrawingOrPresentationDocumentTest( XMultiServiceFactory i_orb, final DocumentType i_docType ) throws com.sun.star.uno.Exception + { + super( i_orb, i_docType ); + } + + public void initializeDocument() throws com.sun.star.uno.Exception + { + // remove all shapes - Impress has two default shapes in a new doc; just get rid of them + final XShapes firstPageShapes = getFirstPageShapes(); + while ( firstPageShapes.getCount() > 0 ) + firstPageShapes.remove( UnoRuntime.queryInterface( XShape.class, firstPageShapes.getByIndex( 0 ) ) ); + } + + public void doSingleModification() throws com.sun.star.uno.Exception + { + // add a simple centered shape to the first page + Rectangle pagePlayground = impl_getFirstPagePlayground(); + impl_createCircleShape( + ( pagePlayground.X + ( pagePlayground.Width - BIG_CIRCLE_SIZE ) / 2 ), + ( pagePlayground.Y + ( pagePlayground.Height - BIG_CIRCLE_SIZE ) / 2 ), + BIG_CIRCLE_SIZE, + FILL_COLOR + ); + } + + public void verifyInitialDocumentState() throws com.sun.star.uno.Exception + { + final XShapes firstPageShapes = getFirstPageShapes(); + assertEquals( "there should be no shapes at all", 0, firstPageShapes.getCount() ); + } + + public void verifySingleModificationDocumentState() throws com.sun.star.uno.Exception + { + final XShapes firstPageShapes = getFirstPageShapes(); + assertEquals( "there should be one shape, not more, not less", 1, firstPageShapes.getCount() ); + + final Object shape = firstPageShapes.getByIndex(0); + verifyShapeGeometry( shape, BIG_CIRCLE_SIZE, BIG_CIRCLE_SIZE ); + final XPropertySet shapeProps = UnoRuntime.queryInterface( XPropertySet.class, shape ); + assertEquals( "wrong circle tpye", CIRCLE_TYPE.getValue(), ((CircleKind)shapeProps.getPropertyValue( "CircleKind" )).getValue() ); + //assertEquals( "wrong circle fill color", FILL_COLOR, ((Integer)shapeProps.getPropertyValue( "FillColor" )).intValue() ); + // disable this particular check: A bug in the drawing layer API restores the FillColor to its + // default value upon re-insertion. This is issue #i115080# + } + + public int doMultipleModifications() throws com.sun.star.uno.Exception + { + // add a simple centered shape to the first page + Rectangle pagePlayground = impl_getFirstPagePlayground(); + impl_createCircleShape( + pagePlayground.X, + pagePlayground.Y, + SMALL_CIRCLE_SIZE, + ALTERNATE_FILL_COLOR + ); + impl_createCircleShape( + pagePlayground.X + pagePlayground.Width - SMALL_CIRCLE_SIZE, + pagePlayground.Y, + SMALL_CIRCLE_SIZE, + ALTERNATE_FILL_COLOR + ); + impl_createCircleShape( + pagePlayground.X, + pagePlayground.Y + pagePlayground.Height - SMALL_CIRCLE_SIZE, + SMALL_CIRCLE_SIZE, + ALTERNATE_FILL_COLOR + ); + impl_createCircleShape( + pagePlayground.X + pagePlayground.Width - SMALL_CIRCLE_SIZE, + pagePlayground.Y + pagePlayground.Height - SMALL_CIRCLE_SIZE, + SMALL_CIRCLE_SIZE, + ALTERNATE_FILL_COLOR + ); + return 4; + } + + private void impl_createCircleShape( final int i_x, final int i_y, final int i_size, final int i_color ) throws com.sun.star.uno.Exception + { + final XPropertySet shapeProps = getDocument().createInstance( "com.sun.star.drawing.EllipseShape", XPropertySet.class ); + shapeProps.setPropertyValue( "CircleKind", CIRCLE_TYPE ); + shapeProps.setPropertyValue( "FillColor", i_color ); + + final XShape shape = UnoRuntime.queryInterface( XShape.class, shapeProps ); + final Size shapeSize = new Size( i_size, i_size ); + shape.setSize( shapeSize ); + final Point shapePos = new Point( i_x, i_y ); + shape.setPosition( shapePos ); + + final XShapes pageShapes = UnoRuntime.queryInterface( XShapes.class, getFirstPageShapes() ); + pageShapes.add( shape ); + + // Sadly, Draw/Impress currently do not create Undo actions for programmatic changes to the document. + // Which renders the test here slightly useless ... unless we fake the Undo actions ourself. + final XUndoManagerSupplier suppUndoManager = UnoRuntime.queryInterface( XUndoManagerSupplier.class, getDocument().getDocument() ); + final XUndoManager undoManager = suppUndoManager.getUndoManager(); + undoManager.addUndoAction( new ShapeInsertionUndoAction( shape, pageShapes ) ); + } + + private Rectangle impl_getFirstPagePlayground() throws com.sun.star.uno.Exception + { + final XShapes firstPageShapes = getFirstPageShapes(); + final XPropertySet firstPageProps = UnoRuntime.queryInterface( XPropertySet.class, firstPageShapes ); + final int pageWidth = ((Integer)firstPageProps.getPropertyValue( "Width" )).intValue(); + final int pageHeight = ((Integer)firstPageProps.getPropertyValue( "Height" )).intValue(); + final int borderLeft = ((Integer)firstPageProps.getPropertyValue( "BorderLeft" )).intValue(); + final int borderTop = ((Integer)firstPageProps.getPropertyValue( "BorderTop" )).intValue(); + final int borderRight = ((Integer)firstPageProps.getPropertyValue( "BorderRight" )).intValue(); + final int borderBottom = ((Integer)firstPageProps.getPropertyValue( "BorderBottom" )).intValue(); + return new Rectangle( borderLeft, borderTop, pageWidth - borderLeft - borderRight, pageHeight - borderTop - borderBottom ); + } + + /** + * returns the XShapes interface of the first page of our drawing document + */ + private XShapes getFirstPageShapes() throws com.sun.star.uno.Exception + { + final XDrawPagesSupplier suppPages = UnoRuntime.queryInterface( XDrawPagesSupplier.class, getDocument().getDocument() ); + final XDrawPages pages = suppPages.getDrawPages(); + return UnoRuntime.queryInterface( XShapes.class, pages.getByIndex( 0 ) ); + } + + /** + * verifies the given shape has the given size + */ + private void verifyShapeGeometry( final Object i_shapeObject, final int i_expectedWidth, final int i_expectedHeight ) + throws com.sun.star.uno.Exception + { + final XShape shape = UnoRuntime.queryInterface( XShape.class, i_shapeObject ); + final Size shapeSize = shape.getSize(); + assertEquals( "unexpected shape width", i_expectedWidth, shapeSize.Width ); + assertEquals( "unexpected shape height", i_expectedHeight, shapeSize.Height ); + } + + private static class ShapeInsertionUndoAction implements XUndoAction + { + ShapeInsertionUndoAction( final XShape i_shape, final XShapes i_shapeCollection ) + { + m_shape = i_shape; + m_shapeCollection = i_shapeCollection; + } + + public String getTitle() + { + return "insert shape"; + } + + public void undo() + { + m_shapeCollection.remove( m_shape ); + } + + public void redo() + { + m_shapeCollection.add( m_shape ); + } + + private final XShape m_shape; + private final XShapes m_shapeCollection; + } + + private static CircleKind CIRCLE_TYPE = CircleKind.FULL; + private static int FILL_COLOR = 0xCC2244; + private static int ALTERNATE_FILL_COLOR = 0x44CC22; + private static int BIG_CIRCLE_SIZE = 5000; + private static int SMALL_CIRCLE_SIZE = 2000; +} diff --git a/sfx2/qa/complex/sfx2/undo/ImpressDocumentTest.java b/sfx2/qa/complex/sfx2/undo/ImpressDocumentTest.java new file mode 100755 index 000000000000..c15fc760e0c3 --- /dev/null +++ b/sfx2/qa/complex/sfx2/undo/ImpressDocumentTest.java @@ -0,0 +1,46 @@ +/************************************************************************* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + *************************************************************************/ + +package complex.sfx2.undo; + +import com.sun.star.lang.XMultiServiceFactory; +import org.openoffice.test.tools.DocumentType; + +/** + * @author frank.schoenheit@oracle.com + */ +public class ImpressDocumentTest extends DrawingOrPresentationDocumentTest +{ + public ImpressDocumentTest( XMultiServiceFactory i_orb ) throws com.sun.star.uno.Exception + { + super( i_orb, DocumentType.PRESENTATION ); + } + + public String getDocumentDescription() + { + return "presentation document"; + } +} diff --git a/sfx2/qa/complex/sfx2/undo/WriterDocumentTest.java b/sfx2/qa/complex/sfx2/undo/WriterDocumentTest.java new file mode 100755 index 000000000000..100d36382d39 --- /dev/null +++ b/sfx2/qa/complex/sfx2/undo/WriterDocumentTest.java @@ -0,0 +1,103 @@ +package complex.sfx2.undo; + +import com.sun.star.text.XTextRange; +import com.sun.star.beans.XPropertySet; +import com.sun.star.table.XCell; +import com.sun.star.table.XCellRange; +import com.sun.star.text.XTextCursor; +import com.sun.star.text.XTextTable; +import com.sun.star.text.XText; +import com.sun.star.text.XTextDocument; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.uno.UnoRuntime; +import org.openoffice.test.tools.DocumentType; +import static org.junit.Assert.*; + +/** + * implements the {@link DocumentTest} interface on top of a spreadsheet document + * @author frank.schoenheit@oracle.com + */ +public class WriterDocumentTest extends DocumentTestBase +{ + public WriterDocumentTest( final XMultiServiceFactory i_orb ) throws com.sun.star.uno.Exception + { + super( i_orb, DocumentType.WRITER ); + } + + public String getDocumentDescription() + { + return "text document"; + } + + public void initializeDocument() throws com.sun.star.uno.Exception + { + // TODO? + } + + public void doSingleModification() throws com.sun.star.uno.Exception + { + final XTextDocument textDoc = UnoRuntime.queryInterface( XTextDocument.class, getDocument().getDocument() ); + final XText docText = textDoc.getText(); + docText.setString( s_blindText ); + } + + public void verifyInitialDocumentState() throws com.sun.star.uno.Exception + { + final XTextDocument textDoc = UnoRuntime.queryInterface( XTextDocument.class, getDocument().getDocument() ); + final XText docText = textDoc.getText(); + assertEquals( "document should be empty", "", docText.getString() ); + } + + public void verifySingleModificationDocumentState() throws com.sun.star.uno.Exception + { + final XTextDocument textDoc = UnoRuntime.queryInterface( XTextDocument.class, getDocument().getDocument() ); + final XText docText = textDoc.getText(); + assertEquals( "blind text not found", s_blindText, docText.getString() ); + } + + public int doMultipleModifications() throws com.sun.star.uno.Exception + { + final XTextDocument textDoc = UnoRuntime.queryInterface( XTextDocument.class, getDocument().getDocument() ); + final XText docText = textDoc.getText(); + + int expectedUndoActions = 0; + + // create a cursor + final XTextCursor cursor = docText.createTextCursor(); + + // create a table + final XTextTable textTable = UnoRuntime.queryInterface( XTextTable.class, + getDocument().createInstance( "com.sun.star.text.TextTable" ) ); + textTable.initialize( 3, 3 ); + final XPropertySet tableProps = UnoRuntime.queryInterface( XPropertySet.class, textTable ); + tableProps.setPropertyValue( "BackColor", 0xCCFF44 ); + + // insert the table into the doc + docText.insertTextContent( cursor, textTable, false ); + ++expectedUndoActions; + + // write some content into the center cell + final XCellRange cellRange = UnoRuntime.queryInterface( XCellRange.class, textTable ); + final XCell centerCell = cellRange.getCellByPosition( 1, 1 ); + final XTextRange cellText = UnoRuntime.queryInterface( XTextRange.class, centerCell ); + cellText.setString( "Undo Manager API Test" ); + ++expectedUndoActions; + + // give it another color + final XPropertySet cellProps = UnoRuntime.queryInterface( XPropertySet.class, centerCell ); + cellProps.setPropertyValue( "BackColor", 0x44CCFF ); + ++expectedUndoActions; + + return expectedUndoActions; + } + + private static final String s_blindText = + "Lorem ipsum dolor. Sit amet penatibus. A cum turpis. Aenean ac eu. " + + "Ligula est urna nulla vestibulum ullamcorper. Nec sit in amet tincidunt mus. " + + "Tellus sagittis mi. Suscipit cursus in vestibulum in eros ipsum felis cursus lectus " + + "nunc quis condimentum in risus nec wisi aenean luctus hendrerit magna habitasse commodo orci. " + + "Nisl etiam quis. Vestibulum justo eleifend aliquet luctus sed turpis volutpat ullamcorper " + + "aliquam penatibus sagittis pede tincidunt egestas. Nibh massa lectus. Sem mattis purus morbi " + + "scelerisque turpis donec urna phasellus. Quis at lacus. Viverra mauris mollis. " + + "Dolor tincidunt condimentum."; +} diff --git a/sfx2/qa/complex/standalonedocumentinfo/makefile.mk b/sfx2/qa/complex/standalonedocumentinfo/makefile.mk deleted file mode 100644 index aade48dbd789..000000000000 --- a/sfx2/qa/complex/standalonedocumentinfo/makefile.mk +++ /dev/null @@ -1,56 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -.IF "$(OOO_SUBSEQUENT_TESTS)" == "" -nothing .PHONY: -.ELSE - -PRJ = ../../.. -PRJNAME = sfx2 -TARGET = qa_complex_standalonedocumentinfo - -.IF "$(OOO_JUNIT_JAR)" != "" -PACKAGE = complex/standalonedocumentinfo -JAVATESTFILES = \ - StandaloneDocumentInfoUnitTest.java - -JAVAFILES = $(JAVATESTFILES) \ - StandaloneDocumentInfoTest.java \ - Test01.java \ - TestHelper.java - -JARFILES = OOoRunner.jar ridl.jar test.jar unoil.jar -EXTRAJARFILES = $(OOO_JUNIT_JAR) -.END - -.INCLUDE: settings.mk -.INCLUDE: target.mk -.INCLUDE: installationtest.mk - -ALLTAR : javatest - -.END diff --git a/sfx2/qa/complex/tests.sce b/sfx2/qa/complex/tests.sce deleted file mode 100644 index c38852927ede..000000000000 --- a/sfx2/qa/complex/tests.sce +++ /dev/null @@ -1,3 +0,0 @@ --o complex.framework.DocumentMetaData --o complex.framework.DocumentMetadataAccessTest -#-o complex.framework.CheckGlobalEventBroadcaster_writer1 diff --git a/sfx2/sdi/docslots.sdi b/sfx2/sdi/docslots.sdi index d16239535193..0e4a302d9d13 100644 --- a/sfx2/sdi/docslots.sdi +++ b/sfx2/sdi/docslots.sdi @@ -171,11 +171,6 @@ interface OfficeDocument : Document [ StateMethod = StateProps_Impl ; ] - SID_PLAYMACRO // ole(no) api(final/play/norec) - [ - ExecMethod = ExecProps_Impl ; - StateMethod = StateProps_Impl ; - ] SID_VERSION [ ExecMethod = ExecFile_Impl; diff --git a/sfx2/sdi/sfx.sdi b/sfx2/sdi/sfx.sdi index 40d35ab4d702..a5dde7b25dbd 100755..100644 --- a/sfx2/sdi/sfx.sdi +++ b/sfx2/sdi/sfx.sdi @@ -4635,31 +4635,6 @@ SfxVoidItem PickList SID_PICKLIST ] //-------------------------------------------------------------------------- -SfxBoolItem PlayMacro SID_PLAYMACRO -(SfxStringItem Statement SID_STATEMENT,SfxBoolItem Asynchron SID_ASYNCHRON) -[ - /* flags: */ - AutoUpdate = TRUE, - Cachable = Cachable, - FastCall = FALSE, - HasCoreId = FALSE, - HasDialog = FALSE, - ReadOnlyDoc = TRUE, - Toggle = FALSE, - Container = TRUE, - RecordAbsolute = FALSE, - NoRecord; - Synchron; - - /* config: */ - AccelConfig = FALSE, - MenuConfig = FALSE, - StatusBarConfig = FALSE, - ToolBoxConfig = FALSE, - GroupId = GID_MACRO; -] - -//-------------------------------------------------------------------------- SfxBoolItem PlugInsActive SID_PLUGINS_ACTIVE [ @@ -5238,31 +5213,6 @@ SfxVoidItem RunBasic SID_BASICRUN ] //-------------------------------------------------------------------------- -SfxVoidItem RunStarWriter SID_STARTSW -() -[ - /* flags: */ - AutoUpdate = FALSE, - Cachable = Cachable, - FastCall = FALSE, - HasCoreId = FALSE, - HasDialog = FALSE, - ReadOnlyDoc = TRUE, - Toggle = FALSE, - Container = TRUE, - RecordAbsolute = FALSE, - RecordPerSet; - Asynchron; - - /* config: */ - AccelConfig = FALSE, - MenuConfig = FALSE, - StatusBarConfig = FALSE, - ToolBoxConfig = FALSE, - GroupId = GID_APPLICATION; -] - -//-------------------------------------------------------------------------- SfxBoolItem Save SID_SAVEDOC (SfxStringItem VersionComment SID_DOCINFO_COMMENTS,SfxStringItem Author SID_DOCINFO_AUTHOR) [ @@ -6570,31 +6520,6 @@ SfxVoidItem BasicIDEShowWindow SID_BASICIDE_SHOWWINDOW ] //-------------------------------------------------------------------------- -SfxVoidItem ToolsMacroEdit SID_EDITMACRO -() -[ - /* flags: */ - AutoUpdate = FALSE, - Cachable = Cachable, - FastCall = FALSE, - HasCoreId = FALSE, - HasDialog = TRUE, - ReadOnlyDoc = TRUE, - Toggle = FALSE, - Container = TRUE, - RecordAbsolute = FALSE, - RecordPerSet; - Synchron; - - /* config: */ - AccelConfig = TRUE, - MenuConfig = TRUE, - StatusBarConfig = FALSE, - ToolBoxConfig = TRUE, - GroupId = GID_MACRO; -] - -//-------------------------------------------------------------------------- SfxVoidItem Undo SID_UNDO ( SfxUInt16Item Undo SID_UNDO ) [ diff --git a/sfx2/source/appl/app.cxx b/sfx2/source/appl/app.cxx index 7e4e9921573a..1d71e1747bd1 100644 --- a/sfx2/source/appl/app.cxx +++ b/sfx2/source/appl/app.cxx @@ -41,6 +41,8 @@ #include <tools/simplerm.hxx> #include <tools/config.hxx> #include <basic/basrdll.hxx> +#include <basic/sbmeth.hxx> +#include <basic/sbmod.hxx> #include <svtools/asynclink.hxx> #include <svl/stritem.hxx> #ifndef _SOUND_HXX //autogen @@ -843,3 +845,7 @@ void SfxApplication::MacroOrganizer( INT16 nTabId ) pSymbol( nTabId ); } +ErrCode SfxApplication::CallBasic( const String& rCode, BasicManager* pMgr, SbxArray* pArgs, SbxValue* pRet ) +{ + return pMgr->ExecuteMacro( rCode, pArgs, pRet); +} diff --git a/sfx2/source/appl/app.hrc b/sfx2/source/appl/app.hrc index dca172269443..ff01fd358d4d 100644 --- a/sfx2/source/appl/app.hrc +++ b/sfx2/source/appl/app.hrc @@ -32,11 +32,6 @@ // #defines ***************************************************************** #define ACC_IBM (RID_SFX_APP_START+2) -#define MSG_ERR_WRITE_CFG (RID_SFX_APP_START+2) -#define MSG_ERR_READ_CFG (RID_SFX_APP_START+3) -#define MSG_ERR_OPEN_CFG (RID_SFX_APP_START+4) -#define MSG_ERR_FILETYPE_CFG (RID_SFX_APP_START+5) -#define MSG_ERR_VERSION_CFG (RID_SFX_APP_START+6) #define MSG_ERR_NO_WEBBROWSER_FOUND (RID_SFX_APP_START+7) // Note: no longer in use @@ -45,101 +40,22 @@ #define MSG_ISPRINTING_QUERYABORT (RID_SFX_APP_START+9) #define MSG_CANT_QUIT (RID_SFX_APP_START+10) #define STR_ISMODIFIED (RID_SFX_APP_START+11) -#define STR_AUTOSAVE (RID_SFX_APP_START+12) -#define STR_MAIL (RID_SFX_APP_START+13) -#define MSG_ERR_WRITE_SBL (RID_SFX_APP_START+14) -#define MSG_IS_SERVER (RID_SFX_APP_START+15) - -#define STR_RESEXCEPTION (RID_SFX_APP_START+21) -#define STR_SYSRESEXCEPTION (RID_SFX_APP_START+22) -#define STR_DOUBLEEXCEPTION (RID_SFX_APP_START+23) -#define STR_RESWARNING (RID_SFX_APP_START+24) -#define STR_ERR_NOTEMPLATE (RID_SFX_APP_START+27) -#define STR_RECOVER_TITLE (RID_SFX_APP_START+28) -#define STR_RECOVER_QUERY (RID_SFX_APP_START+29) -#define STR_RECOVER_PREPARED (RID_SFX_APP_START+30) -#define MSG_ERR_SOINIT (RID_SFX_APP_START+31) - -#define MSG_IOERR_FILE_NOT_FOUND (RID_SFX_APP_START+32) -#define MSG_IOERR_PATH_NOT_FOUND (RID_SFX_APP_START+33) -#define MSG_IOERR_TOO_MANY_OPEN_FILES (RID_SFX_APP_START+34) -#define MSG_IOERR_ACCESS_DENIED (RID_SFX_APP_START+35) -#define MSG_IOERR_INVALID_ACCESS (RID_SFX_APP_START+36) -#define MSG_IOERR_INVALID_HANDLE (RID_SFX_APP_START+37) -#define MSG_IOERR_CANNOT_MAKE (RID_SFX_APP_START+38) -#define MSG_IOERR_SHARING (RID_SFX_APP_START+39) -#define MSG_IOERR_INVALID_PARAMETER (RID_SFX_APP_START+40) -#define MSG_IOERR_GENERAL (RID_SFX_APP_START+41) #define RID_FULLSCREENTOOLBOX (RID_SFX_APP_START+42) #define RID_RECORDINGTOOLBOX (RID_SFX_APP_START+43) #define RID_ENVTOOLBOX (RID_SFX_APP_START+44) #define STR_QUITAPP (RID_SFX_APP_START+59) -#define STR_EXITANDRETURN (RID_SFX_APP_START+60) -#define STR_ERR_NOFILE (RID_SFX_APP_START+61) -#define STR_EXTHELPSTATUS (RID_SFX_APP_START+62) - -#define STR_ADDRESS_NAME (RID_SFX_APP_START+65) #define RID_STR_HLPFILENOTEXIST (RID_SFX_APP_START+68) -#define RID_STR_HLPAPPNOTSTARTED (RID_SFX_APP_START+69) - -#define STR_NODOUBLE (RID_SFX_APP_START+75) -#define STR_NOPRINTER (RID_SFX_APP_START+76) - -#define MSG_SIGNAL (RID_SFX_APP_START+77) #define RID_STR_HELP (RID_SFX_APP_START+79) #define RID_STR_NOAUTOSTARTHELPAGENT (RID_SFX_APP_START+80) #define RID_HELPBAR (RID_SFX_APP_START+81) #define RID_SPECIALCONFIG_ERROR (RID_SFX_APP_START+82) -#define STR_MEMINFO_HEADER (RID_SFX_APP_START+84) -#define STR_MEMINFO_FOOTER (RID_SFX_APP_START+85) -#define STR_MEMINFO_OBJINFO (RID_SFX_APP_START+86) - -#define RID_PLUGIN (RID_SFX_APP_START+87) - -#define RID_WARN_POST_MAILTO (RID_SFX_APP_START+88) - -#define RID_STR_NOWELCOMESCREEN (RID_SFX_APP_START+91) - -// --> PB 2004-08-20 #i33095# -/* obsolete -#define STR_EDITOBJECT (RID_SFX_APP_START+92) -#define STR_OPENOBJECT (RID_SFX_APP_START+93) -*/ - -#define STR_CORRUPT_INSTALLATION (RID_SFX_APP_START+94) -#define IDS_SBERR_STOREREF (RID_SFX_APP_START+97) - #define CONFIG_PATH_START (RID_SFX_APP_START+98) -#define STR_KEY_ADDINS_PATH (CONFIG_PATH_START+0) -#define STR_KEY_AUTOCORRECT_DIR (CONFIG_PATH_START+1) -#define STR_KEY_GLOSSARY_PATH (CONFIG_PATH_START+2) -#define STR_KEY_BACKUP_PATH (CONFIG_PATH_START+3) -#define STR_KEY_BASIC_PATH (CONFIG_PATH_START+4) -#define STR_KEY_BITMAP_PATH (CONFIG_PATH_START+5) -#define STR_KEY_CONFIG_DIR (CONFIG_PATH_START+6) -#define STR_KEY_DICTIONARY_PATH (CONFIG_PATH_START+7) -#define STR_KEY_FAVORITES_DIR (CONFIG_PATH_START+8) -#define STR_KEY_FILTER_PATH (CONFIG_PATH_START+9) -#define STR_KEY_GALLERY_DIR (CONFIG_PATH_START+10) -#define STR_KEY_GRAPHICS_PATH (CONFIG_PATH_START+11) -#define STR_KEY_HELP_DIR (CONFIG_PATH_START+12) -#define STR_KEY_LINGUISTIC_DIR (CONFIG_PATH_START+13) -#define STR_KEY_MODULES_PATH (CONFIG_PATH_START+14) -#define STR_KEY_PALETTE_PATH (CONFIG_PATH_START+15) -#define STR_KEY_PLUGINS_PATH (CONFIG_PATH_START+16) -#define STR_KEY_STORAGE_DIR (CONFIG_PATH_START+17) -#define STR_KEY_TEMP_PATH (CONFIG_PATH_START+18) -#define STR_KEY_TEMPLATE_PATH (CONFIG_PATH_START+19) -#define STR_KEY_USERCONFIG_PATH (CONFIG_PATH_START+20) -#define STR_KEY_USERDICTIONARY_DIR (CONFIG_PATH_START+21) -#define STR_KEY_WORK_PATH (CONFIG_PATH_START+22) - #define WIN_HELPINDEX (RID_SFX_APP_START+99) #define TP_HELP_CONTENT (RID_SFX_APP_START+100) #define TP_HELP_INDEX (RID_SFX_APP_START+101) @@ -168,11 +84,6 @@ #define IMG_HELP_CONTENT_DOC_HC (RID_SFX_APP_START+125) // image -#define IMG_MISSING_1 (RID_SFX_APP_START+126) // image -#define IMG_MISSING_2 (RID_SFX_APP_START+127) // image -#define IMG_MISSING_3 (RID_SFX_APP_START+128) // image -#define IMG_MISSING_4 (RID_SFX_APP_START+129) // image - #define STR_HELP_WINDOW_TITLE (RID_SFX_APP_START+125) // string #define STR_HELP_BUTTON_INDEX_ON (RID_SFX_APP_START+126) @@ -236,8 +147,6 @@ #define RID_SECURITY_WARNING_HYPERLINK (RID_SFX_APP_START + 180) #define RID_SECURITY_WARNING_TITLE (RID_SFX_APP_START + 181) -#define RID_INVALID_URL_MSG (RID_SFX_APP_START + 182) -#define RID_INVALID_URL_TITLE (RID_SFX_APP_START + 183) #define RID_DESKTOP (RID_SFX_APP_START + 184) // #define RID_XMLSEC_WARNING_BROKENSIGNATURE (RID_SFX_APP_START + 185) diff --git a/sfx2/source/appl/app.src b/sfx2/source/appl/app.src index 47750cd73f78..02552a1a5ec1 100644 --- a/sfx2/source/appl/app.src +++ b/sfx2/source/appl/app.src @@ -36,60 +36,6 @@ InfoBox RID_DOCALREADYLOADED_DLG Message [ en-US ] = "Document already open." ; }; -ErrorBox RID_CANTLOADDOC_DLG -{ - Message [ en-US ] = "Cannot open document." ; -}; - -ErrorBox MSG_ERR_READ_CFG -{ - BUTTONS = WB_OK ; - DEFBUTTON = WB_DEF_OK ; - Message [ en-US ] = "Error reading configuration file." ; -}; - -ErrorBox MSG_ERR_WRITE_CFG -{ - BUTTONS = WB_OK ; - DEFBUTTON = WB_DEF_OK ; - Message [ en-US ] = "Error writing configuration file." ; -}; - -ErrorBox MSG_ERR_OPEN_CFG -{ - BUTTONS = WB_OK ; - DEFBUTTON = WB_DEF_OK ; - Message [ en-US ] = "Error opening configuration file." ; -}; - -ErrorBox MSG_ERR_FILETYPE_CFG -{ - BUTTONS = WB_OK ; - DEFBUTTON = WB_DEF_OK ; - Message [ en-US ] = "File is not a configuration file." ; -}; - -ErrorBox MSG_ERR_VERSION_CFG -{ - BUTTONS = WB_OK ; - DEFBUTTON = WB_DEF_OK ; - Message [ en-US ] = "Configuration file contains the wrong version." ; -}; - -ErrorBox MSG_ERR_WRITE_SBL -{ - BUTTONS = WB_OK ; - DEFBUTTON = WB_DEF_OK ; - Message [ en-US ] = "Error recording BASIC library in\n'@'." ; -}; - -ErrorBox MSG_SIGNAL -{ - BUTTONS = WB_YES_NO ; - DEFBUTTON = WB_DEF_YES ; - Message [ en-US ] = "An unexpected program error has occurred.\n\nDo you want to try to save your changes in all open documents before the program is terminated?" ; -}; - ErrorBox MSG_ERR_NO_WEBBROWSER_FOUND { BUTTONS = WB_OK ; @@ -102,89 +48,6 @@ Resource SID_UNKNOWN String 1 "-" ; }; -Resource BMP_SFX_COLOR -{ - ExtraData = - { - SID_NEWDOC; // 043 - SID_OPENDOC; // 044 - SID_CLOSEDOC; // 045 - SID_RELOAD; // 046 - SID_SAVEASDOC; // 047 - SID_PRINTDOC; // 051 - SID_SETUPPRINTER; // 053 - SID_QUITAPP; // 054 - SID_UNDO; // 055 - SID_REDO; // 056 - SID_REPEAT; // 057 - SID_CUT; // 058 - SID_COPY; // 059 - SID_PASTE; // 060 - SID_DELETE; // 061 - SID_SELECTALL; // 062 - SID_SAVEDOC; // 063 vormals 046 - SID_EXITANDRETURN; // 064 vormals 054 - SID_RECORDMACRO; // 095 - SID_EDITMACRO; // 096 - SID_HELPMENU; // 098 - SID_CONFIG; // 123 - SID_CONFIGTOOLBOX; // 124 - 0; - }; - Bitmap BMP_SFX_SMALL { File = "sco.bmp" ; }; - Bitmap BMP_SFX_LARGE { File = "lco.bmp" ; }; -}; - -Resource BMP_SFX_MONO -{ - ExtraData = - { - SID_NEWDOC; // 043 - SID_OPENDOC; // 044 - SID_CLOSEDOC; // 045 - SID_RELOAD; // 046 - SID_SAVEASDOC; // 047 - SID_PRINTDOC; // 051 - SID_SETUPPRINTER; // 053 - SID_QUITAPP; // 054 - SID_UNDO; // 055 - SID_REDO; // 056 - SID_REPEAT; // 057 - SID_CUT; // 058 - SID_COPY; // 059 - SID_PASTE; // 060 - SID_DELETE; // 061 - SID_SELECTALL; // 062 - SID_SAVEDOC; // 063 vormals 046 - SID_EXITANDRETURN; // 064 vormals 054 - SID_RECORDMACRO; // 095 - SID_EDITMACRO; // 096 - SID_HELPMENU; // 098 - SID_CONFIG; // 123 - SID_CONFIGTOOLBOX; // 124 - 0; - }; - Bitmap BMP_SFX_SMALL { File = "smo.bmp" ; }; - Bitmap BMP_SFX_LARGE { File = "lmo.bmp" ; }; -}; - -WarningBox RID_WARN_POST_MAILTO -{ - BUTTONS = WB_OK_CANCEL ; - DEFBUTTON = WB_DEF_OK ; - Message [ en-US ] = "A form is to be sent by e-mail.\nThis means that the receiver will get to see your e-mail address." ; -}; - -String STR_RECOVER_TITLE -{ - Text [ en-US ] = "File Recovery" ; -}; - -String STR_RECOVER_QUERY -{ - Text [ en-US ] = "Should the file \"$1\" be restored?" ; -}; - String GID_INTERN { Text [ en-US ] = "Internal" ; @@ -315,155 +178,16 @@ String GID_CONTROLS Text [ en-US ] = "Controls" ; }; -TabDialog SID_OPTIONS -{ - OutputSize = TRUE ; - SVLook = TRUE ; - Size = MAP_APPFONT ( 244 , 155 ) ; - Text [ en-US ] = "Options" ; - Moveable = TRUE ; - Closeable = TRUE ; - TabControl 1 - { - SVLook = TRUE ; - Pos = MAP_APPFONT ( 3 , 15 ) ; - Size = MAP_APPFONT ( 221 , 130 ) ; - PageList = - { - PageItem - { - Identifier = RID_SFXPAGE_GENERAL ; - Text [ en-US ] = "General" ; - PageResID = 256 ; - }; - PageItem - { - Identifier = RID_SFXPAGE_SAVE ; - Text [ en-US ] = "Save" ; - PageResID = 257 ; - }; - PageItem - { - Identifier = RID_SFXPAGE_PATH ; - Text [ en-US ] = "Paths" ; - PageResID = 258 ; - }; - PageItem - { - Identifier = RID_SFXPAGE_SPELL ; - Text [ en-US ] = "Spellcheck" ; - PageResID = 259 ; - }; - }; - }; -}; - InfoBox MSG_CANT_QUIT { Message [ en-US ] = "The application cannot be terminated at the moment.\nPlease wait until all print jobs and/or\nOLE actions have finished and close all dialogs." ; }; -QueryBox MSG_IS_SERVER -{ - Buttons = WB_YES_NO ; - DefButton = WB_DEF_NO ; - Message [ en-US ] = "This application is as object or print server active.\nDo you want to terminate anyway?" ; -}; - -String STR_NODOUBLE -{ - Text [ en-US ] = "%PRODUCTNAME cannot be started more than once." ; -}; - -String STR_NOPRINTER -{ - Text [ en-US ] = "Some %PRODUCTNAME functions will not work properly without a printer driver.\nPlease install a printer driver." ; -}; - String STR_ISMODIFIED { Text [ en-US ] = "Do you want to save the changes to %1?" ; }; -String STR_AUTOSAVE -{ - Text [ en-US ] = "AutoSave" ; -}; - -String STR_RESWARNING -{ - Text [ en-US ] = "Limited system resources. Please quit other applications or close some windows before continuing." ; -}; -String STR_RESEXCEPTION -{ - Text [ en-US ] = "There are files missing. Please check application setup." ; -}; - -String STR_DOUBLEEXCEPTION -{ - Text [ en-US ] = "Another error occurred during the save recovery.\nPossibly, the data could not be entirely saved." ; -}; - -String STR_SYSRESEXCEPTION -{ - Text [ en-US ] = "System resources exhausted. Please restart the application." ; -}; - -ErrorBox MSG_ERR_SOINIT -{ - Message [ en-US ] = "Error initializing object-system." ; -}; - -String MSG_IOERR_FILE_NOT_FOUND -{ - Text [ en-US ] = "The file $(FILE) doesn't exist." ; -}; - -String MSG_IOERR_PATH_NOT_FOUND -{ - Text [ en-US ] = "The path to file $(FILE) doesn't exist." ; -}; - -String MSG_IOERR_TOO_MANY_OPEN_FILES -{ - Text [ en-US ] = "The file $(FILE) could not be opened,\nbecause too many files are open.\nPlease close some files and try again." ; -}; - -String MSG_IOERR_ACCESS_DENIED -{ - Text [ en-US ] = "The file $(FILE) could not be opened due to missing access rights." ; -}; - -String MSG_IOERR_INVALID_ACCESS -{ - Text [ en-US ] = "The file $(FILE) could not be accessed." ; -}; - -String MSG_IOERR_INVALID_HANDLE -{ - Text [ en-US ] = "The file $(FILE) could not be opened due to an invalid file handle." ; -}; - -String MSG_IOERR_CANNOT_MAKE -{ - Text [ en-US ] = "The file $(FILE) could not be created." ; -}; - -String MSG_IOERR_SHARING -{ - Text [ en-US ] = "Error by shared access to $(FILE)." ; -}; - -String MSG_IOERR_INVALID_PARAMETER -{ - Text [ en-US ] = "" ; -}; - -String MSG_IOERR_GENERAL -{ - Text [ en-US ] = "General I/O error accessing $(FILE)." ; -}; - String RID_FULLSCREENTOOLBOX { Text = "" ; @@ -499,41 +223,11 @@ ToolBox RID_FULLSCREENTOOLBOX }; }; -String STR_ERR_NOTEMPLATE -{ - Text [ en-US ] = "The selected template has an incorrect format" ; -}; - -String STR_ERR_NOFILE -{ - Text [ en-US ] = "Can't open file $." ; -}; - String STR_QUITAPP { Text [ en-US ] = "E~xit" ; }; -String STR_EXITANDRETURN -{ - Text [ en-US ] = "E~xit & return to " ; -}; - -String STR_EXTHELPSTATUS -{ - Text [ en-US ] = "Select a command or click to select a theme." ; -}; - -String STR_MAIL -{ - Text [ en-US ] = "Mail" ; -}; - -String STR_ADDRESS_NAME -{ - Text [ en-US ] = "Addresses" ; -}; - String RID_STR_HELP { Text [ en-US ] = "Help" ; @@ -544,11 +238,6 @@ String RID_STR_NOAUTOSTARTHELPAGENT Text [ en-US ] = "No automatic start at 'XX'" ; }; -String RID_STR_NOWELCOMESCREEN -{ - Text [ en-US ] = "Don't display tips" ; -}; - String RID_HELPBAR { Text [ en-US ] = "Help Bar" ; @@ -614,11 +303,6 @@ String RID_STR_HLPFILENOTEXIST Text [ en-US ] = "The help file for this topic is not installed." ; }; -String RID_STR_HLPAPPNOTSTARTED -{ - Text [ en-US ] = "The help system could not be started" ; -}; - //---------------------------------------------------------------------------- String RID_ENVTOOLBOX @@ -631,129 +315,6 @@ String RID_SPECIALCONFIG_ERROR Text [ en-US ] = "An error has occurred in the special configuration.\nPlease contact your administrator." ; }; -String STR_MEMINFO_HEADER -{ -}; - -String STR_MEMINFO_FOOTER -{ - Text = "</table>" ; -}; - -String STR_MEMINFO_OBJINFO -{ - Text = "<tr><td >$(VISIBLE)</td><td>$(CACHED)</td><td>$(EXPIRE)</td><td>$(JSDIRTY)</td><td>$(JSEXEC)</td><td>$(FORBID)</td><td>$(FACTORY)</td><td>$(URL)</td><td>$(ORIGURL)</td><td>$(POSTSTRING)</td></tr>" ; -}; - -String RID_PLUGIN -{ - Text [ en-US ] = "Enable plug-ins" ; -}; - -String STR_CORRUPT_INSTALLATION -{ - Text [ en-US ] = "Important program components could not be initialized correctly.\nPlease start the setup program with the option /Repair." ; -}; - -String IDS_SBERR_STOREREF -{ - Text [ en-US ] = "Reference will not be saved: " ; -}; - -String STR_KEY_CONFIG_DIR -{ - Text [ en-US ] = "Configuration" ; -}; -String STR_KEY_WORK_PATH -{ - Text [ en-US ] = "My Documents" ; -}; -String STR_KEY_GRAPHICS_PATH -{ - Text [ en-US ] = "Graphics" ; -}; -String STR_KEY_BITMAP_PATH -{ - Text [ en-US ] = "Icons" ; -}; -String STR_KEY_BASIC_PATH -{ - Text = "BASIC" ; -}; - -String STR_KEY_PALETTE_PATH -{ - Text [ en-US ] = "Palettes" ; -}; -String STR_KEY_BACKUP_PATH -{ - Text [ en-US ] = "Backups" ; -}; -String STR_KEY_MODULES_PATH -{ - Text [ en-US ] = "Modules" ; -}; -String STR_KEY_TEMPLATE_PATH -{ - Text [ en-US ] = "Templates" ; -}; -String STR_KEY_GLOSSARY_PATH -{ - Text [ en-US ] = "AutoText" ; -}; -String STR_KEY_DICTIONARY_PATH -{ - Text [ en-US ] = "Dictionaries" ; -}; -String STR_KEY_HELP_DIR -{ - Text [ en-US ] = "Help" ; -}; -String STR_KEY_GALLERY_DIR -{ - Text [ en-US ] = "Gallery" ; -}; - -String STR_KEY_STORAGE_DIR -{ - Text [ en-US ] = "Message Storage" ; -}; -String STR_KEY_TEMP_PATH -{ - Text [ en-US ] = "Temporary files" ; -}; -String STR_KEY_PLUGINS_PATH -{ - Text [ en-US ] = "Plug-ins" ; -}; -String STR_KEY_FAVORITES_DIR -{ - Text [ en-US ] = "Folder Bookmarks" ; -}; -String STR_KEY_FILTER_PATH -{ - Text [ en-US ] = "Filters" ; -}; -String STR_KEY_ADDINS_PATH -{ - Text [ en-US ] = "Add-ins" ; -}; -String STR_KEY_USERCONFIG_PATH -{ - Text [ en-US ] = "User Configuration" ; -}; -String STR_KEY_USERDICTIONARY_DIR -{ - Text [ en-US ] = "User-defined dictionaries" ; -}; -String STR_KEY_AUTOCORRECT_DIR -{ - Text [ en-US ] = "AutoCorrect" ; -}; -String STR_KEY_LINGUISTIC_DIR -{ - Text [ en-US ] = "Writing aids" ; -}; String STR_QUICKSTART_EXIT { Text [ en-US ] = "Exit Quickstarter" ; @@ -828,17 +389,6 @@ String RID_SECURITY_WARNING_TITLE Text [ en-US ] = "Security Warning" ; }; -ErrorBox RID_INVALID_URL_MSG -{ - Buttons = WB_OK ; - Message [ en-US ] = "The URL is not valid." ; -}; - -String RID_INVALID_URL_TITLE -{ - Text = "%PRODUCTNAME %PRODUCTVERSION" ; -}; - String RID_DESKTOP { Text = "%PRODUCTNAME" ; @@ -871,26 +421,6 @@ String RID_XMLSEC_DOCUMENTSIGNED Text [ en-US ] = " (Signed)" ; }; -Image IMG_MISSING_1 -{ - ImageBitmap = Bitmap { File = "sc05539.bmp" ; }; -}; - -Image IMG_MISSING_2 -{ - ImageBitmap = Bitmap { File = "sc05700.bmp" ; }; -}; - -Image IMG_MISSING_3 -{ - ImageBitmap = Bitmap { File = "sc06302.bmp" ; }; -}; - -Image IMG_MISSING_4 -{ - ImageBitmap = Bitmap { File = "sn064.bmp" ; }; -}; - String RID_SVXSTR_FILELINK { Text [ en-US ] = "Document" ; diff --git a/sfx2/source/appl/appbas.cxx b/sfx2/source/appl/appbas.cxx index 10c4a6bc6797..099dc12654a1 100644 --- a/sfx2/source/appl/appbas.cxx +++ b/sfx2/source/appl/appbas.cxx @@ -73,7 +73,6 @@ #include "minfitem.hxx" #include "app.hrc" #include <sfx2/evntconf.hxx> -#include <sfx2/macrconf.hxx> #include <sfx2/request.hxx> #include <sfx2/dinfdlg.hxx> #include "appdata.hxx" @@ -257,12 +256,6 @@ SbxVariable* MakeVariable( StarBASIC *pBas, SbxObject *pObject, BasicManager* SfxApplication::GetBasicManager() { -// DBG_ASSERT( pAppData_Impl->nBasicCallLevel != 0, -// "unnecessary call to GetBasicManager() - inefficient!" ); - if ( pAppData_Impl->nBasicCallLevel == 0 ) - // sicherheitshalber - EnterBasicCall(); - return BasicManagerRepository::getApplicationBasicManager( true ); } @@ -291,106 +284,6 @@ StarBASIC* SfxApplication::GetBasic() return GetBasicManager()->GetLib(0); } -//-------------------------------------------------------------------- - -FASTBOOL SfxApplication::IsInBasicCall() const -{ - return 0 != pAppData_Impl->nBasicCallLevel; -} - -//-------------------------------------------------------------------- - -void SfxApplication::EnterBasicCall() -{ - if ( 1 == ++pAppData_Impl->nBasicCallLevel ) - { - DBG_TRACE( "SfxShellObject: BASIC-on-demand" ); - - // das kann l"anger dauern, da Progress nicht geht, wenigstens Sanduhr -//(mba)/task SfxWaitCursor aWait; - - // zuerst das BASIC laden - GetBasic(); -/* - // als erstes SfxShellObject das SbxObject der SfxApplication erzeugen - SbxObject *pSbx = GetSbxObject(); - DBG_ASSERT( pSbx, "SfxShellObject: can't create SbxObject for SfxApplication" ); - - // die SbxObjects aller Module erzeugen - SfxModuleArr_Impl& rArr = GetModules_Impl(); - for ( sal_uInt16 n = 0; n < rArr.Count(); ++n ) - { - SfxModule *pMod = rArr.GetObject(n); - if ( pMod->IsLoaded() ) - { - pSbx = pMod->GetSbxObject(); - DBG_ASSERT( pSbx, "SfxModule: can't create SbxObject" ); - } - } - - // die SbxObjects aller Tasks erzeugen - for ( SfxTask *pTask = SfxTask::GetFirst(); pTask; pTask = SfxTask::GetNext( *pTask ) ) - pTask->GetSbxObject(); - - // die SbxObjects aller SfxObjectShells erzeugen (ggf. Frame-los!) - for ( SfxObjectShell *pObjSh = SfxObjectShell::GetFirst( NULL, sal_False ); - pObjSh; - pObjSh = SfxObjectShell::GetNext(*pObjSh, NULL, sal_False) ) - { - // kein IP-Object oder wenn doch dann initialisiert? - SvStorageRef aStorage; - if ( !pObjSh->IsHandsOff() ) - aStorage = pObjSh->GetStorage(); - if ( !pObjSh->GetInPlaceObject() || aStorage.Is() ) - { - DBG( DbgOutf( "SfxShellObject: BASIC-on-demand for %s", - pObjSh->SfxShell::GetName().GetBuffer() ) ); - pSbx = pObjSh->GetSbxObject(); - DBG_ASSERT( pSbx, "SfxShellObject: can't create SbxObject" ); - } - } - - // die SbxObjects der SfxShells auf den Stacks der Frames erzeugen - for ( SfxViewFrame *pFrame = SfxViewFrame::GetFirst(0,sal_False); - pFrame; - pFrame = SfxViewFrame::GetNext(*pFrame,0,0,sal_False) ) - { - // den Dispatcher des Frames rausholen - SfxDispatcher *pDispat = pFrame->GetDispatcher(); - pDispat->Flush(); - - // "uber alle SfxShells auf dem Stack des Dispatchers iterieren - // Frame selbst wird ausgespart, da er indirekt angezogen wird, - // sofern er ein Dokument enth"alt. - for ( sal_uInt16 nStackIdx = pDispat->GetShellLevel(*pFrame); - 0 != nStackIdx; - --nStackIdx ) - { - DBG( DbgOutf( "SfxShellObject: BASIC-on-demand for level %u", nStackIdx-1 ); ) - pSbx = pDispat->GetShell(nStackIdx - 1)->GetSbxObject(); - DBG_ASSERT( pSbx, "SfxShellObject: can't create SbxObject" ); - } - - if ( !pFrame->GetObjectShell() ) - { - DBG( DbgOutf( "SfxShellObject: BASIC-on-demand for empty frame" ); ) - pSbx = pFrame->GetSbxObject(); - DBG_ASSERT( pSbx, "SfxShellObject: can't create SbxObject" ); - } - } -*/ - // Factories anmelden -// SbxBase::AddFactory( new SfxSbxObjectFactory_Impl ); - } -} - -//-------------------------------------------------------------------- - -void SfxApplication::LeaveBasicCall() -{ - --pAppData_Impl->nBasicCallLevel; -} - //------------------------------------------------------------------------- void SfxApplication::PropExec_Impl( SfxRequest &rReq ) { @@ -445,10 +338,6 @@ void SfxApplication::PropExec_Impl( SfxRequest &rReq ) break; } - case SID_PLAYMACRO: - PlayMacro_Impl( rReq, GetBasic() ); - break; - case SID_OFFICE_PRIVATE_USE: case SID_OFFICE_COMMERCIAL_USE: { @@ -523,68 +412,3 @@ void SfxApplication::PropState_Impl( SfxItemSet &rSet ) } } -//-------------------------------------------------------------------- -void SfxApplication::MacroExec_Impl( SfxRequest& rReq ) -{ - DBG_MEMTEST(); - if ( SfxMacroConfig::IsMacroSlot( rReq.GetSlot() ) ) - { - // SlotId referenzieren, damit nicht im Execute der Slot abgeschossen - // werden kann - GetMacroConfig()->RegisterSlotId(rReq.GetSlot()); - SFX_REQUEST_ARG(rReq, pArgs, SfxStringItem, - rReq.GetSlot(), sal_False); - String aArgs; - if( pArgs ) aArgs = pArgs->GetValue(); - if ( GetMacroConfig()->ExecuteMacro(rReq.GetSlot(), aArgs ) ) - rReq.Done(); - GetMacroConfig()->ReleaseSlotId(rReq.GetSlot()); - } -} - -//-------------------------------------------------------------------- -void SfxApplication::MacroState_Impl( SfxItemSet& ) -{ - DBG_MEMTEST(); -} - -//------------------------------------------------------------------------- - -void SfxApplication::PlayMacro_Impl( SfxRequest &rReq, StarBASIC *pBasic ) -{ - EnterBasicCall(); - sal_Bool bOK = sal_False; - - // Makro und asynch-Flag - SFX_REQUEST_ARG(rReq,pMacro,SfxStringItem,SID_STATEMENT,sal_False); - SFX_REQUEST_ARG(rReq,pAsynch,SfxBoolItem,SID_ASYNCHRON,sal_False); - - if ( pAsynch && pAsynch->GetValue() ) - { - // asynchron ausf"uhren - GetDispatcher_Impl()->Execute( SID_PLAYMACRO, SFX_CALLMODE_ASYNCHRON, pMacro, 0L ); - rReq.Done(); - } - else if ( pMacro ) - { - // Statement aufbereiten - DBG_ASSERT( pBasic, "no BASIC found" ) ; - String aStatement( '[' ); - aStatement += pMacro->GetValue(); - aStatement += ']'; - - // P"aventiv den Request abschlie\sen, da er ggf. zerst"ort wird - rReq.Done(); - rReq.ReleaseArgs(); - - // Statement ausf"uhren - pBasic->Execute( aStatement ); - bOK = 0 == SbxBase::GetError(); - SbxBase::ResetError(); - } - - LeaveBasicCall(); - rReq.SetReturnValue(SfxBoolItem(0,bOK)); -} - - diff --git a/sfx2/source/appl/appcfg.cxx b/sfx2/source/appl/appcfg.cxx index 0b5e94ea24f0..4eba8285fd75 100644 --- a/sfx2/source/appl/appcfg.cxx +++ b/sfx2/source/appl/appcfg.cxx @@ -88,7 +88,6 @@ #include <sfx2/evntconf.hxx> #include "appdata.hxx" #include "workwin.hxx" -#include <sfx2/macrconf.hxx> #include "helper.hxx" // SfxContentHelper::... #include "app.hrc" #include "sfxresid.hxx" @@ -718,7 +717,7 @@ void SfxApplication::SetOptions_Impl( const SfxItemSet& rSet ) pSh; ++nIdx, pSh = pDispat->GetShell(nIdx) ) { - SfxUndoManager *pShUndoMgr = pSh->GetUndoManager(); + ::svl::IUndoManager *pShUndoMgr = pSh->GetUndoManager(); if ( pShUndoMgr ) pShUndoMgr->SetMaxUndoActionCount( nUndoCount ); } @@ -987,26 +986,9 @@ BOOL SfxApplication::SaveAll_Impl(BOOL bPrompt, BOOL bAutoSave) //-------------------------------------------------------------------- -SfxMacroConfig* SfxApplication::GetMacroConfig() const -{ - return SfxMacroConfig::GetOrCreate(); -} - -//-------------------------------------------------------------------- -SfxEventConfiguration* SfxApplication::GetEventConfig() const -{ - if (!pAppData_Impl->pEventConfig) - pAppData_Impl->pEventConfig = new SfxEventConfiguration; - return pAppData_Impl->pEventConfig; -} - -//-------------------------------------------------------------------- - //-------------------------------------------------------------------- void SfxApplication::NotifyEvent( const SfxEventHint& rEventHint, FASTBOOL bSynchron ) { - //DBG_ASSERT(pAppData_Impl->pEventConfig,"Keine Events angemeldet!"); - SfxObjectShell *pDoc = rEventHint.GetObjShell(); if ( pDoc && ( pDoc->IsPreview() || !pDoc->Get_Impl()->bInitialized ) ) return; diff --git a/sfx2/source/appl/appdata.cxx b/sfx2/source/appl/appdata.cxx index 38ea69280c49..002a785542d4 100644 --- a/sfx2/source/appl/appdata.cxx +++ b/sfx2/source/appl/appdata.cxx @@ -102,7 +102,6 @@ SfxAppData_Impl::SfxAppData_Impl( SfxApplication* ) : pAppDispatch(NULL), pTemplates( 0 ), pPool(0), - pEventConfig(0), pDisabledSlotList( 0 ), pSecureURLs(0), pSaveOptions( 0 ), @@ -112,7 +111,6 @@ SfxAppData_Impl::SfxAppData_Impl( SfxApplication* ) : pTemplateCommon( 0 ), nDocModalMode(0), nAutoTabPageId(0), - nBasicCallLevel(0), nRescheduleLocks(0), nInReschedule(0), nAsynchronCalls(0), diff --git a/sfx2/source/appl/appdde.cxx b/sfx2/source/appl/appdde.cxx index 808731f8bba8..55a8764ac0c5 100644 --- a/sfx2/source/appl/appdde.cxx +++ b/sfx2/source/appl/appdde.cxx @@ -38,6 +38,7 @@ #include <sfx2/linkmgr.hxx> #include <tools/urlobj.hxx> +#include <tools/diagnose_ex.h> #include <unotools/pathoptions.hxx> #ifndef GCC #endif @@ -197,11 +198,9 @@ long SfxApplication::DdeExecute else { // alle anderen per BASIC - EnterBasicCall(); StarBASIC* pBasic = GetBasic(); - DBG_ASSERT( pBasic, "Wo ist mein Basic???" ); + ENSURE_OR_RETURN( pBasic, "where's my basic?", 0 ); SbxVariable* pRet = pBasic->Execute( rCmd ); - LeaveBasicCall(); if( !pRet ) { SbxBase::ResetError(); diff --git a/sfx2/source/appl/appinit.cxx b/sfx2/source/appl/appinit.cxx index 08023c5414a6..fbd30a9bf42d 100644 --- a/sfx2/source/appl/appinit.cxx +++ b/sfx2/source/appl/appinit.cxx @@ -77,7 +77,6 @@ #include <sfx2/docfac.hxx> #include <sfx2/evntconf.hxx> #include "intro.hxx" -#include <sfx2/macrconf.hxx> #include <sfx2/mnumgr.hxx> #include <sfx2/msgpool.hxx> #include <sfx2/progress.hxx> diff --git a/sfx2/source/appl/appquit.cxx b/sfx2/source/appl/appquit.cxx index 7399742d1e94..e0516201bf03 100644 --- a/sfx2/source/appl/appquit.cxx +++ b/sfx2/source/appl/appquit.cxx @@ -44,6 +44,7 @@ #include "app.hrc" #include <sfx2/app.hxx> +#include <sfx2/evntconf.hxx> #include <sfx2/unoctitm.hxx> #include "appdata.hxx" #include <sfx2/viewsh.hxx> @@ -52,7 +53,6 @@ #include "arrdecl.hxx" #include "sfxresid.hxx" #include <sfx2/event.hxx> -#include <sfx2/macrconf.hxx> #include <sfx2/mnumgr.hxx> #include <sfx2/templdlg.hxx> #include <sfx2/msgpool.hxx> @@ -149,8 +149,6 @@ void SfxApplication::Deinitialize() delete pAppData_Impl->pLabelResMgr; DELETEX(pAppData_Impl->pSlotPool); - DELETEX(pAppData_Impl->pEventConfig); - SfxMacroConfig::Release_Impl(); DELETEX(pAppData_Impl->pFactArr); DELETEX(pAppData_Impl->pInitLinkList); diff --git a/sfx2/source/appl/appserv.cxx b/sfx2/source/appl/appserv.cxx index 439396d2ffa7..01258ac7a56b 100644 --- a/sfx2/source/appl/appserv.cxx +++ b/sfx2/source/appl/appserv.cxx @@ -111,7 +111,6 @@ #include <sfx2/new.hxx> #include <sfx2/templdlg.hxx> #include "sfxtypes.hxx" -#include "sfxbasic.hxx" #include <sfx2/tabdlg.hxx> #include "arrdecl.hxx" #include "fltfnc.hxx" @@ -122,7 +121,6 @@ #include "arrdecl.hxx" #include <sfx2/childwin.hxx> #include "appdata.hxx" -#include <sfx2/macrconf.hxx> #include "minfitem.hxx" #include <sfx2/event.hxx> #include <sfx2/module.hxx> diff --git a/sfx2/source/appl/appuno.cxx b/sfx2/source/appl/appuno.cxx index 5347aec0e99f..62038598a96f 100644 --- a/sfx2/source/appl/appuno.cxx +++ b/sfx2/source/appl/appuno.cxx @@ -96,6 +96,7 @@ #include <tools/cachestr.hxx> #include <osl/mutex.hxx> #include <comphelper/sequence.hxx> +#include <framework/documentundoguard.hxx> #include <rtl/ustrbuf.hxx> using namespace ::com::sun::star; @@ -120,7 +121,6 @@ using namespace ::com::sun::star::io; #include <sfx2/fcontnr.hxx> #include "frmload.hxx" #include <sfx2/frame.hxx> -#include "sfxbasic.hxx" #include <sfx2/objsh.hxx> #include <sfx2/objuno.hxx> #include <sfx2/unoctitm.hxx> @@ -1759,12 +1759,9 @@ void SAL_CALL SfxMacroLoader::removeStatusListener( { } -// ----------------------------------------------------------------------- ErrCode SfxMacroLoader::loadMacro( const ::rtl::OUString& rURL, com::sun::star::uno::Any& rRetval, SfxObjectShell* pSh ) throw ( ::com::sun::star::uno::RuntimeException ) { - SfxApplication* pApp = SFX_APP(); - pApp->EnterBasicCall(); SfxObjectShell* pCurrent = pSh; if ( !pCurrent ) // all not full qualified names use the BASIC of the given or current document @@ -1810,18 +1807,21 @@ ErrCode SfxMacroLoader::loadMacro( const ::rtl::OUString& rURL, com::sun::star:: if ( pBasMgr ) { - if ( pSh && pDoc ) + const bool bIsAppBasic = ( pBasMgr == pAppMgr ); + const bool bIsDocBasic = ( pBasMgr != pAppMgr ); + + if ( pDoc ) { - // security check for macros from document basic if an SFX context (pSh) is given + // security check for macros from document basic if an SFX doc is given if ( !pDoc->AdjustMacroMode( String() ) ) // check forbids execution return ERRCODE_IO_ACCESSDENIED; } - else if ( pSh && pSh->GetMedium() ) + else if ( pDoc && pDoc->GetMedium() ) { - pSh->AdjustMacroMode( String() ); - SFX_ITEMSET_ARG( pSh->GetMedium()->GetItemSet(), pUpdateDocItem, SfxUInt16Item, SID_UPDATEDOCMODE, sal_False); - SFX_ITEMSET_ARG( pSh->GetMedium()->GetItemSet(), pMacroExecModeItem, SfxUInt16Item, SID_MACROEXECMODE, sal_False); + pDoc->AdjustMacroMode( String() ); + SFX_ITEMSET_ARG( pDoc->GetMedium()->GetItemSet(), pUpdateDocItem, SfxUInt16Item, SID_UPDATEDOCMODE, sal_False); + SFX_ITEMSET_ARG( pDoc->GetMedium()->GetItemSet(), pMacroExecModeItem, SfxUInt16Item, SID_MACROEXECMODE, sal_False); if ( pUpdateDocItem && pMacroExecModeItem && pUpdateDocItem->GetValue() == document::UpdateDocMode::NO_UPDATE && pMacroExecModeItem->GetValue() == document::MacroExecMode::NEVER_EXECUTE ) @@ -1838,79 +1838,49 @@ ErrCode SfxMacroLoader::loadMacro( const ::rtl::OUString& rURL, com::sun::star:: aQualifiedMethod.Erase( nArgsPos - nHashPos - 1 ); } - SbxMethod *pMethod = SfxQueryMacro( pBasMgr, aQualifiedMethod ); - if ( pMethod ) + if ( pBasMgr->HasMacro( aQualifiedMethod ) ) { - // arguments must be quoted - String aQuotedArgs; - if ( aArgs.Len()<2 || aArgs.GetBuffer()[1] == '\"') - // no args or already quoted args - aQuotedArgs = aArgs; - else + Any aOldThisComponent; + const bool bSetDocMacroMode = ( pDoc != NULL ) && bIsDocBasic; + const bool bSetGlobalThisComponent = ( pDoc != NULL ) && bIsAppBasic; + if ( bSetDocMacroMode ) { - // quote parameters - aArgs.Erase(0,1); - aArgs.Erase( aArgs.Len()-1,1); - - aQuotedArgs = '('; - - sal_uInt16 nCount = aArgs.GetTokenCount(','); - for ( sal_uInt16 n=0; n<nCount; n++ ) - { - aQuotedArgs += '\"'; - aQuotedArgs += aArgs.GetToken( n, ',' ); - aQuotedArgs += '\"'; - if ( n<nCount-1 ) - aQuotedArgs += ','; - } - - aQuotedArgs += ')'; + // mark document: it executes an own macro, so it's in a modal mode + pDoc->SetMacroMode_Impl( TRUE ); } - Any aOldThisComponent; - if ( pSh ) + if ( bSetGlobalThisComponent ) { - if ( pBasMgr != pAppMgr ) - // mark document: it executes an own macro, so it's in a modal mode - pSh->SetMacroMode_Impl( TRUE ); - if ( pBasMgr == pAppMgr ) - { - // document is executed via AppBASIC, adjust ThisComponent variable - aOldThisComponent = pAppMgr->SetGlobalUNOConstant( "ThisComponent", makeAny( pSh->GetModel() ) ); - } + // document is executed via AppBASIC, adjust ThisComponent variable + aOldThisComponent = pAppMgr->SetGlobalUNOConstant( "ThisComponent", makeAny( pDoc->GetModel() ) ); } - // add quoted arguments and do the call - String aCall( '[' ); - aCall += pMethod->GetName(); - aCall += aQuotedArgs; - aCall += ']'; - // just to let the shell be alive - SfxObjectShellRef rSh = pSh; + SfxObjectShellRef xKeepDocAlive = pDoc; - // execute function using its Sbx parent, - //SbxVariable* pRet = pMethod->GetParent()->Execute( aCall ); - //rRetval = sbxToUnoValue( pRet ); - - SbxVariable* pRet = pMethod->GetParent()->Execute( aCall ); - if ( pRet ) { - USHORT nFlags = pRet->GetFlags(); - pRet->SetFlag( SBX_READWRITE | SBX_NO_BROADCAST ); - rRetval = sbxToUnoValue( pRet ); - pRet->SetFlags( nFlags ); + // attempt to protect the document against the script tampering with its Undo Context + ::std::auto_ptr< ::framework::DocumentUndoGuard > pUndoGuard; + if ( bIsDocBasic ) + pUndoGuard.reset( new ::framework::DocumentUndoGuard( pDoc->GetModel() ) ); + + // execute the method + SbxVariableRef retValRef = new SbxVariable; + nErr = pBasMgr->ExecuteMacro( aQualifiedMethod, aArgs, retValRef ); + if ( nErr == ERRCODE_NONE ) + rRetval = sbxToUnoValue( retValRef ); } - nErr = SbxBase::GetError(); - if ( ( pBasMgr == pAppMgr ) && pSh ) + if ( bSetGlobalThisComponent ) { pAppMgr->SetGlobalUNOConstant( "ThisComponent", aOldThisComponent ); } - if ( pSh && pSh->GetModel().is() ) - // remove flag for modal mode - pSh->SetMacroMode_Impl( FALSE ); + if ( bSetDocMacroMode ) + { + // remove flag for modal mode + pDoc->SetMacroMode_Impl( FALSE ); + } } else nErr = ERRCODE_BASIC_PROC_UNDEFINED; @@ -1929,7 +1899,6 @@ ErrCode SfxMacroLoader::loadMacro( const ::rtl::OUString& rURL, com::sun::star:: nErr = SbxBase::GetError(); } - pApp->LeaveBasicCall(); SbxBase::ResetError(); return nErr; } diff --git a/sfx2/source/bastyp/fltfnc.cxx b/sfx2/source/bastyp/fltfnc.cxx index d11b8b5130ed..ad26958036c1 100644 --- a/sfx2/source/bastyp/fltfnc.cxx +++ b/sfx2/source/bastyp/fltfnc.cxx @@ -111,7 +111,6 @@ using namespace ::vos; #include <unotools/syslocale.hxx> #include "sfxhelp.hxx" -#include "sfxbasic.hxx" #include <sfx2/docfilt.hxx> #include <sfx2/docfac.hxx> #include "sfxtypes.hxx" @@ -590,37 +589,6 @@ sal_uInt32 SfxFilterMatcher::DetectFilter( SfxMedium& rMedium, const SfxFilter** if( STRING_NOTFOUND != aFlags.Search( 'H' ) ) bHidden = sal_True; } -/* - if ( ( !pFilter || nErr == ERRCODE_SFX_CONSULTUSER ) && !bAPI && !bHidden ) - { - if ( !pFilter ) - pFilter = pOldFilter; - - String aTmpName; - if ( pFilter ) - aTmpName = pFilter->GetUIName(); - - SfxFilterMatcher *pMatcher; - if( bPlugIn && pFilter ) - pMatcher = new SfxFilterMatcher( (SfxFilterContainer *) pFilter->GetFilterContainer() ); - else - pMatcher = (SfxFilterMatcher*) this; - - SfxFilterDialog *pDlg = new SfxFilterDialog( 0, &rMedium, *pMatcher, pFilter ? &aTmpName: 0, 0 ); - const sal_Bool bOk = RET_OK == pDlg->Execute(); - if (bOk) - pFilter = pMatcher->GetFilter4UIName( pDlg->GetSelectEntry()); - - if( bPlugIn && pFilter ) - delete pMatcher; - delete pDlg; - - if ( !bOk) - nErr = ERRCODE_ABORT; - else - nErr = ERRCODE_NONE; - } -*/ *ppFilter = pFilter; if ( bHidden || (bAPI && nErr == ERRCODE_SFX_CONSULTUSER) ) @@ -773,22 +741,6 @@ const SfxFilter* SfxFilterMatcher::GetFilter4Extension( const String& rExt, SfxF const SfxFilter* SfxFilterMatcher::GetFilter4ClipBoardId( sal_uInt32 nId, SfxFilterFlags nMust, SfxFilterFlags nDont ) const { - /* - if ( pImpl->pList ) - { - sal_uInt16 nCount = ( sal_uInt16 ) pImpl->pList->Count(); - for( sal_uInt16 n = 0; n < nCount; n++ ) - { - const SfxFilter* pFilter = pImpl->pList->GetObject( n ); - SfxFilterFlags nFlags = pFilter->GetFilterFlags(); - if ( (nFlags & nMust) == nMust && !(nFlags & nDont ) && pFilter->GetFormat() == nId ) - return pFilter; - } - - return 0; - } - */ - if (nId == 0) return 0; diff --git a/sfx2/source/config/evntconf.cxx b/sfx2/source/config/evntconf.cxx index 9935c3a18c8b..f474bfb0838c 100644 --- a/sfx2/source/config/evntconf.cxx +++ b/sfx2/source/config/evntconf.cxx @@ -50,7 +50,6 @@ #include <sfx2/evntconf.hxx> -#include <sfx2/macrconf.hxx> #include <sfx2/docfile.hxx> #include <sfx2/app.hxx> #include <sfx2/objsh.hxx> diff --git a/sfx2/source/control/bindings.cxx b/sfx2/source/control/bindings.cxx index 40f6346de8ee..cf04de2cb3a4 100644 --- a/sfx2/source/control/bindings.cxx +++ b/sfx2/source/control/bindings.cxx @@ -64,7 +64,6 @@ #include <sfx2/objface.hxx> #include "sfxtypes.hxx" #include "workwin.hxx" -#include <sfx2/macrconf.hxx> #include <sfx2/unoctitm.hxx> #include <sfx2/sfx.hrc> #include <sfx2/sfxuno.hxx> @@ -1118,13 +1117,7 @@ void SfxBindings::Release( SfxControllerItem& rItem ) delete (*pImp->pCaches)[nPos]; pImp->pCaches->Remove(nPos, 1); #endif - if ( SfxMacroConfig::IsMacroSlot( nId ) ) - { - delete (*pImp->pCaches)[nPos]; - pImp->pCaches->Remove(nPos, 1); - } - else - pImp->bCtrlReleased = sal_True; + pImp->bCtrlReleased = sal_True; } } @@ -1474,7 +1467,7 @@ SfxItemSet* SfxBindings::CreateSet_Impl rFound.Insert( pFound ); USHORT nSlot = pRealSlot->GetSlotId(); - if ( !SfxMacroConfig::IsMacroSlot( nSlot ) && !(nSlot >= SID_VERB_START && nSlot <= SID_VERB_END) ) + if ( !(nSlot >= SID_VERB_START && nSlot <= SID_VERB_END) ) { pInterface = pInterface->GetRealInterfaceForSlot( pRealSlot ); DBG_ASSERT (pInterface,"Slot in angegebener Shell nicht gefunden!"); diff --git a/sfx2/source/control/dispatch.cxx b/sfx2/source/control/dispatch.cxx index 444be02127b3..fb5f6a3db062 100644..100755 --- a/sfx2/source/control/dispatch.cxx +++ b/sfx2/source/control/dispatch.cxx @@ -69,7 +69,6 @@ #include "slotserv.hxx" #include <sfx2/ipclient.hxx> #include "sfxtypes.hxx" -#include <sfx2/macrconf.hxx> #include <sfx2/viewfrm.hxx> #include <sfx2/viewsh.hxx> #include <sfx2/childwin.hxx> @@ -1029,10 +1028,6 @@ void SfxDispatcher::_Execute if ( IsLocked( rSlot.GetSlotId() ) ) return; - sal_uInt16 nSlot = rSlot.GetSlotId(); - if ( SfxMacroConfig::IsMacroSlot( nSlot ) ) - SFX_APP()->GetMacroConfig()->RegisterSlotId( nSlot ); - if ( (eCallMode & SFX_CALLMODE_ASYNCHRON) || ( !(eCallMode & SFX_CALLMODE_SYNCHRON) && rSlot.IsMode(SFX_SLOT_ASYNCHRON) ) ) @@ -1628,7 +1623,7 @@ void SfxDispatcher::EnterAction( const String& rName ) DBG_ASSERT( pImp->aStack.Count() > 0, "EnterAction on empty dispatcher stack" ); if ( ++pImp->nActionLevel == 1 ) { - SfxUndoManager *pUndoMgr = GetShell(0)->GetUndoManager(); + ::svl::IUndoManager *pUndoMgr = GetShell(0)->GetUndoManager(); if ( pUndoMgr ) pUndoMgr->EnterListAction( rName, rName HACK(RepeatComment), 0 HACK(ID) ); } @@ -1643,7 +1638,7 @@ void SfxDispatcher::LeaveAction() DBG_ASSERT( pImp->nActionLevel > 0, "EnterAction without LeaveAction" ); if ( --pImp->nActionLevel == 0 ) { - SfxUndoManager *pUndoMgr = GetShell(0)->GetUndoManager(); + ::svl::IUndoManager *pUndoMgr = GetShell(0)->GetUndoManager(); if ( pUndoMgr ) pUndoMgr->LeaveListAction(); } @@ -2298,7 +2293,6 @@ sal_Bool SfxDispatcher::_FindServer SFX_STACK(SfxDispatcher::_FindServer); // Dispatcher gelockt? (SID_HELP_PI trotzdem durchlassen) - SfxApplication *pSfxApp = SFX_APP(); if ( IsLocked(nSlot) ) { pImp->bInvalidateOnUnlock = sal_True; @@ -2318,25 +2312,8 @@ sal_Bool SfxDispatcher::_FindServer } } - // Makro-Slot? - if ( SfxMacroConfig::IsMacroSlot( nSlot ) ) - { - const SfxMacroInfo* pInfo = pSfxApp->GetMacroConfig()->GetMacroInfo(nSlot); - if ( pInfo ) - { - const SfxSlot* pSlot = pInfo->GetSlot(); - if ( pSlot ) - { - rServer.SetShellLevel(nTotCount-1); - rServer.SetSlot( pSlot ); - return sal_True; - } - } - - return sal_False; - } // Verb-Slot? - else if (nSlot >= SID_VERB_START && nSlot <= SID_VERB_END) + if (nSlot >= SID_VERB_START && nSlot <= SID_VERB_END) { for ( sal_uInt16 nShell = 0;; ++nShell ) { @@ -2474,10 +2451,7 @@ sal_Bool SfxDispatcher::HasSlot_Impl( sal_uInt16 nSlot ) nTotCount = nTotCount + pImp->aStack.Count(); } - if ( SfxMacroConfig::IsMacroSlot( nSlot ) ) - // Makro-Slot? - return sal_True; - else if (nSlot >= SID_VERB_START && nSlot <= SID_VERB_END) + if (nSlot >= SID_VERB_START && nSlot <= SID_VERB_END) { // Verb-Slot? for ( sal_uInt16 nShell = 0;; ++nShell ) @@ -2658,10 +2632,6 @@ const SfxPoolItem* SfxDispatcher::_Execute( const SfxSlotServer &rSvr ) { Flush(); - sal_uInt16 nSlot = pSlot->GetSlotId(); - if ( SfxMacroConfig::IsMacroSlot( nSlot ) ) - SFX_APP()->GetMacroConfig()->RegisterSlotId( nSlot ); - if ( pSlot->IsMode(SFX_SLOT_ASYNCHRON) ) //! ignoriert rSvr { diff --git a/sfx2/source/control/macrconf.cxx b/sfx2/source/control/macrconf.cxx deleted file mode 100644 index 9e8657ae0c82..000000000000 --- a/sfx2/source/control/macrconf.cxx +++ /dev/null @@ -1,874 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sfx2.hxx" -#include <basic/sbstar.hxx> -#include <basic/basmgr.hxx> -#ifndef _SBX_HXX //autogen -#include <basic/sbx.hxx> -#endif -#include <svl/intitem.hxx> -#include <basic/sbmeth.hxx> -#include <basic/sbmod.hxx> -#ifndef _BASIC_SBUNO_HXX -#include <basic/sbuno.hxx> -#endif - -#include <osl/mutex.hxx> - -#include <com/sun/star/script/XEngine.hpp> -#include <com/sun/star/document/MacroExecMode.hpp> - -#ifndef GCC -#endif - -#ifndef _UNOTOOLS_PROCESSFACTORY_HXX -#include <comphelper/processfactory.hxx> -#endif -#include <unotools/intlwrapper.hxx> - -#include <sfx2/msgpool.hxx> -#include <sfx2/macrconf.hxx> -#include "sfxbasic.hxx" -#include <sfx2/sfx.hrc> -#include <sfx2/app.hxx> -#include <sfx2/objsh.hxx> -#include <sfx2/dispatch.hxx> -#include "minfitem.hxx" -#include "imgmgr.hxx" -#include <sfx2/evntconf.hxx> -#include <sfx2/docfile.hxx> -#include <sfx2/genlink.hxx> -#include <sfx2/viewfrm.hxx> -#include <appdata.hxx> -#include "objshimp.hxx" -#include <sfx2/request.hxx> - -static const sal_uInt16 nCompatVersion = 2; -static const sal_uInt16 nVersion = 3; - -// Static member -SfxMacroConfig* SfxMacroConfig::pMacroConfig = NULL; - -SfxMacroConfig* SfxMacroConfig::GetOrCreate() -{ - ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() ); - if ( !pMacroConfig ) - pMacroConfig = new SfxMacroConfig; - return pMacroConfig; -} - -void SfxMacroConfig::Release_Impl() -{ - ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() ); - DELETEZ( pMacroConfig ); -} - -//========================================================================== - -struct SfxMacroConfig_Impl -{ - SfxMacroInfoArr_Impl aArr; - sal_uInt32 nEventId; - sal_Bool bWaitingForCallback; - - SfxMacroConfig_Impl() - : nEventId( 0 ) - , bWaitingForCallback( sal_False ) - {} -}; - -//========================================================================== - -SbMethod* SfxQueryMacro_Impl( BasicManager* pMgr , const String& rMacro, - const String &rLibName, const String& rModule ) -{ - IntlWrapper aIntlWrapper( ::comphelper::getProcessServiceFactory(), Application::GetSettings().GetLocale() ); - const CollatorWrapper* pCollator = aIntlWrapper.getCollator(); - sal_uInt16 nLibCount = pMgr->GetLibCount(); - for ( sal_uInt16 nLib = 0; nLib < nLibCount; ++nLib ) - { - if ( COMPARE_EQUAL == pCollator->compareString( pMgr->GetLibName( nLib ), rLibName ) ) - { - StarBASIC* pLib = pMgr->GetLib( nLib ); - if( !pLib ) - { - pMgr->LoadLib( nLib ); - pLib = pMgr->GetLib( nLib ); - } - - if( pLib ) - { - sal_uInt16 nModCount = pLib->GetModules()->Count(); - for( sal_uInt16 nMod = 0; nMod < nModCount; ++nMod ) - { - SbModule* pMod = (SbModule*)pLib->GetModules()->Get( nMod ); - if ( pMod && COMPARE_EQUAL == pCollator->compareString( pMod->GetName(), rModule ) ) - { - SbMethod* pMethod = (SbMethod*)pMod->Find( rMacro, SbxCLASS_METHOD ); - if( pMethod ) - return pMethod; - } - } - } - } - } - return 0; -} - -SbMethod* SfxQueryMacro( BasicManager* pMgr , const String& rMacro ) -{ - sal_uInt16 nLast = 0; - String aMacro = rMacro; - String aLibName = aMacro.GetToken( 0, '.', nLast ); - String aModule = aMacro.GetToken( 0, '.', nLast ); - aMacro.Erase( 0, nLast ); - - return SfxQueryMacro_Impl( pMgr, aMacro, aLibName, aModule ); -} - -ErrCode SfxCallMacro( BasicManager* pMgr, const String& rCode, - SbxArray *pArgs, SbxValue *pRet ) -{ - ErrCode nErr; - SfxApplication *pApp = SFX_APP(); - pApp->EnterBasicCall(); - SbMethod* pMethod = SfxQueryMacro( pMgr, rCode ); - if ( pMethod ) - { - if ( pArgs ) - pMethod->SetParameters( pArgs ); - nErr = pMethod->Call( pRet ); - } - else - nErr = ERRCODE_BASIC_PROC_UNDEFINED; - - pApp->LeaveBasicCall(); - return nErr; -} - -//========================================================================== - -SfxMacroInfo::SfxMacroInfo( const String& rURL ) : - pHelpText(0), - nRefCnt(0), - bAppBasic(TRUE), - nSlotId(0), - pSlot(0) -{ - if ( rURL.CompareToAscii( "macro:", 6 ) == COMPARE_EQUAL ) - { - String aTmp = rURL.Copy( 6 ); - if ( aTmp.GetTokenCount('/') > 3 ) - { - // 'macro:///lib.mod.proc(args)' => Macro via App-BASIC-Mgr - // 'macro://[docname|.]/lib.mod.proc(args)' => Macro via zugehoerigen Doc-BASIC-Mgr - if ( aTmp.CompareToAscii("///", 3 ) != COMPARE_EQUAL ) - bAppBasic = FALSE; - aTmp = rURL.GetToken( 3, '/' ); - if ( aTmp.GetTokenCount('.') == 3 ) - { - aLibName = aTmp.GetToken( 0, '.' ); - aModuleName = aTmp.GetToken( 1, '.' ); - aMethodName = aTmp.GetToken( 2, '.' ); - - // Remove arguments to be compatible - aMethodName.SearchAndReplaceAscii( "()", String(), sal::static_int_cast< xub_StrLen >(std::max( aMethodName.Len()-2, 0 ))); - } - } - - DBG_ASSERT( aLibName.Len() && aModuleName.Len() && aMethodName.Len(), "Wrong macro URL!" ); - } - else - aMethodName = rURL; -} - -SfxMacroInfo::SfxMacroInfo( bool _bAppBasic ) : - pHelpText(0), - nRefCnt(0), - bAppBasic(_bAppBasic), - nSlotId(0), - pSlot(0) -{} - -//========================================================================== - -SfxMacroInfo::SfxMacroInfo(bool _bAppBasic, const String& rLibName, - const String& rModuleName, const String& rMethodName) : - pHelpText(0), - nRefCnt(0), - bAppBasic(_bAppBasic), - aLibName(rLibName), - aModuleName(rModuleName), - aMethodName(rMethodName), - nSlotId(0), - pSlot(0) -{ -} - -//========================================================================== - -SfxMacroInfo::SfxMacroInfo(bool _bAppBasic, const String& rQualifiedName ) -: pHelpText(0), - nRefCnt(0), - bAppBasic(_bAppBasic), - nSlotId(0), - pSlot(0) -{ - sal_uInt16 nCount = rQualifiedName.GetTokenCount('.'); - aMethodName = rQualifiedName.GetToken( nCount-1, '.' ); - if ( nCount > 1 ) - aModuleName = rQualifiedName.GetToken( nCount-2, '.' ); - if ( nCount > 2 ) - aLibName = rQualifiedName.GetToken( 0, '.' ); -} - -//========================================================================== - -SfxMacroInfo::SfxMacroInfo(SfxMacroInfo& rOther) : - pHelpText(0), - nRefCnt(0), - bAppBasic(rOther.bAppBasic), - aLibName(rOther.aLibName), - aModuleName(rOther.aModuleName), - aMethodName(rOther.aMethodName), - nSlotId(rOther.nSlotId), - pSlot(0) -{} - -//========================================================================== - -SfxMacroInfo::~SfxMacroInfo() -{ - delete pSlot; - delete pHelpText; -} - -//========================================================================== - -sal_Bool SfxMacroInfo::operator==(const SfxMacroInfo& rOther) const -{ - if ( GetQualifiedName() == rOther.GetQualifiedName() && - bAppBasic == rOther.bAppBasic ) - return sal_True; - else - return sal_False; -} - -//========================================================================== - -String SfxMacroInfo::GetMacroName() const -{ - String aMacroName = aMethodName; - aMacroName += '('; - aMacroName += aLibName; - aMacroName += '.'; - aMacroName += aModuleName; - aMacroName += ')'; - return aMacroName; -} - -//========================================================================== - -String SfxMacroInfo::GetQualifiedName() const -{ - String aMacroName; - if( aMacroName.Len() || aLibName.Len() ) - { - // Altes Format - aMacroName = aLibName; - aMacroName += '.'; - aMacroName += aModuleName; - aMacroName += '.'; - } - - // Wg. ::com::sun::star::script::JavaScript kein Zerlegen des Strings mehr - aMacroName += aMethodName; - return aMacroName; -} - -String SfxMacroInfo::GetFullQualifiedName() const -{ - // Liefert nur Unsinn, wenn f"ur ein ::com::sun::star::script::JavaScript aufgerufen ! - String aRet; - if ( bAppBasic ) - aRet = SFX_APP()->GetName(); - aRet += '.'; - aRet += GetQualifiedName(); - return aRet; -} - -String SfxMacroInfo::GetURL() const -{ - if ( !aLibName.Len() ) - return aMethodName; - - // 'macro:///lib.mod.proc(args)' => Macro via App-BASIC-Mgr - // 'macro://[docname|.]/lib.mod.proc(args)' => Macro via zugehoerigen Doc-BASIC-Mgr - // 'macro://obj.method(args)' => Object via App-BASIC-Mgr - String aURL( String::CreateFromAscii("macro://") ); - if ( !bAppBasic ) - aURL += '.'; - aURL += '/'; - aURL += aLibName; - aURL += '.'; - aURL += aModuleName; - aURL += '.'; - aURL += aMethodName; - aURL += String::CreateFromAscii("()"); - - return aURL; -} - -//========================================================================== - -BasicManager* SfxMacroInfo::GetBasicManager() const -{ - if (bAppBasic) - { - return SFX_APP()->GetBasicManager(); - } - else - { - SfxObjectShell *pCurrDocShell = SfxObjectShell::Current(); - return pCurrDocShell ? pCurrDocShell->GetBasicManager() : - SFX_APP()->GetBasicManager(); - } -} - -//========================================================================== - -String SfxMacroInfo::GetBasicName() const -{ - if (bAppBasic) - { - return SFX_APP()->GetName(); - } - else - { - SfxObjectShell *pCurrDocShell = SfxObjectShell::Current(); - if ( pCurrDocShell ) - return pCurrDocShell->GetTitle(); - else - return SFX_APP()->GetName(); - } -} - -String SfxMacroInfo::GetHelpText() const -{ - if ( pHelpText ) - return *pHelpText; - return String(); -} - -String SfxMacroConfig::RequestHelp( sal_uInt16 nId ) -{ - SfxMacroInfo *pInfo = SFX_APP()->GetMacroConfig()->GetMacroInfo( nId ); - if ( !pInfo ) - return String(); - - if ( !pInfo->pHelpText ) - { - SbMethod *pMethod = - SfxQueryMacro_Impl( pInfo->GetBasicManager(), pInfo->aMethodName, - pInfo->aLibName, pInfo->aModuleName ); - if ( pMethod && pMethod->GetInfo() ) - pInfo->pHelpText = new String( pMethod->GetInfo()->GetComment() ); - } - - return pInfo->GetHelpText(); -} - -void SfxMacroInfo::SetHelpText( const String& rName ) -{ - if ( !pHelpText ) - pHelpText = new String; - *pHelpText = rName; -} - -//========================================================================== - -SvStream& operator >> (SvStream& rStream, SfxMacroInfo& rInfo) -{ - sal_uInt16 nAppBasic, nFileVersion; - String aDocName; - - rStream >> nFileVersion; - if ( nVersion < nCompatVersion ) - { - // In der 1.Version ohne Versionskennung - nAppBasic = nVersion; - nFileVersion = 1; - rStream.ReadByteString(aDocName,RTL_TEXTENCODING_UTF8); - rStream.ReadByteString(rInfo.aLibName,RTL_TEXTENCODING_UTF8); - rStream.ReadByteString(rInfo.aModuleName,RTL_TEXTENCODING_UTF8); - rStream.ReadByteString(rInfo.aMethodName,RTL_TEXTENCODING_UTF8); - } - else - { - String aInput; - rStream >> nAppBasic; - rStream.ReadByteString(aDocName,RTL_TEXTENCODING_UTF8); // Vorsicht: kann bei AppName Unsinn sein! - rStream.ReadByteString(rInfo.aLibName,RTL_TEXTENCODING_UTF8); - rStream.ReadByteString(rInfo.aModuleName,RTL_TEXTENCODING_UTF8); - rStream.ReadByteString(aInput,RTL_TEXTENCODING_UTF8); - - if ( nFileVersion == nCompatVersion ) - rInfo.aMethodName = aInput; - else - { - sal_uInt16 nCount = aInput.GetTokenCount('.'); - rInfo.aMethodName = aInput.GetToken( nCount-1, '.' ); - if ( nCount > 1 ) - rInfo.aModuleName = aInput.GetToken( nCount-2, '.' ); - if ( nCount > 2 ) - rInfo.aLibName = aInput.GetToken( 0, '.' ); - } - } - - rInfo.bAppBasic = (sal_Bool) nAppBasic; - return rStream; -} - -int SfxMacroInfo::Load( SvStream& rStream ) -{ - rStream >> (*this); - nSlotId = SFX_APP()->GetMacroConfig()->GetSlotId(this); - return 0; -} - -//========================================================================== - -SvStream& operator << (SvStream& rStream, const SfxMacroInfo& rInfo) -{ - if ( rInfo.bAppBasic ) - { - rStream << nVersion - << (sal_uInt16) rInfo.bAppBasic; - rStream.WriteByteString(rInfo.GetBasicName(),RTL_TEXTENCODING_UTF8); - rStream.WriteByteString(rInfo.aLibName,RTL_TEXTENCODING_UTF8); - rStream.WriteByteString(rInfo.aModuleName,RTL_TEXTENCODING_UTF8); - rStream.WriteByteString(rInfo.aMethodName,RTL_TEXTENCODING_UTF8); - } - else - { - rStream << nVersion - << (sal_uInt16) rInfo.bAppBasic; - rStream.WriteByteString(SFX_APP()->GetName(),RTL_TEXTENCODING_UTF8); - rStream.WriteByteString(rInfo.aLibName,RTL_TEXTENCODING_UTF8); - rStream.WriteByteString(rInfo.aModuleName,RTL_TEXTENCODING_UTF8); - rStream.WriteByteString(rInfo.aMethodName,RTL_TEXTENCODING_UTF8); - } - - return rStream; -} - -sal_Bool SfxMacroInfo::Compare( const SvxMacro& rMacro ) const -{ - String aName = rMacro.GetLibName(); - aName += '.'; - aName += rMacro.GetMacName(); - if ( GetFullQualifiedName() == aName ) - return sal_True; - return sal_False; -} - -//========================================================================== - -SfxMacroConfig::SfxMacroConfig() -{ - pImp = new SfxMacroConfig_Impl; -} - -//========================================================================== - -SfxMacroConfig::~SfxMacroConfig() -{ - if ( pImp->nEventId ) - Application::RemoveUserEvent( pImp->nEventId ); - delete pImp; -} - -//========================================================================== - -SFX_STATE_STUB( SfxApplication, MacroState_Impl ) -SFX_EXEC_STUB( SfxApplication, MacroExec_Impl ) - -sal_uInt16 SfxMacroConfig::GetSlotId(SfxMacroInfoPtr pInfo) -{ - sal_uInt16 nCount = pImp->aArr.Count(); // Macro suchen - sal_uInt16 i; - for (i=0; i<nCount; i++) - if ((*(pImp->aArr)[i]) == (*pInfo)) - break; - - if (i == nCount) - { // Macro noch unbekannt - nCount = aIdArray.Count(); - sal_uInt16 n; - for (n=0; n<nCount; n++) // freie SlotId suchen - if (aIdArray[n] > SID_MACRO_START + n) - break; - - sal_uInt16 nNewSlotId = SID_MACRO_START + n; - if ( nNewSlotId > SID_MACRO_END ) - return 0; - aIdArray.Insert( SID_MACRO_START + n, n ); - - SfxSlot *pNewSlot = new SfxSlot; - pNewSlot->nSlotId = SID_MACRO_START + n; - pNewSlot->nGroupId = 0; - pNewSlot->nFlags = SFX_SLOT_ASYNCHRON; - pNewSlot->nMasterSlotId = 0; - pNewSlot->nValue = 0; - pNewSlot->fnExec = SFX_STUB_PTR(SfxApplication,MacroExec_Impl); - pNewSlot->fnState = SFX_STUB_PTR(SfxApplication,MacroState_Impl); - pNewSlot->pType = 0; HACK(SFX_TYPE(SfxVoidItem)) - pNewSlot->pName = pNewSlot->pMethodName = U2S(pInfo->aMethodName).getStr(); - pNewSlot->pLinkedSlot = 0; - pNewSlot->nArgDefCount = 0; - pNewSlot->pFirstArgDef = 0; - pNewSlot->pUnoName = 0; - - if (nCount) - { - SfxSlot *pSlot = (pImp->aArr)[0]->pSlot; - pNewSlot->pNextSlot = pSlot->pNextSlot; - pSlot->pNextSlot = pNewSlot; - } - else - pNewSlot->pNextSlot = pNewSlot; - - // Macro uebernehmen - SfxMacroInfoPtr pNewInfo = new SfxMacroInfo(*pInfo); - pNewInfo->nSlotId = SID_MACRO_START + n; - pImp->aArr.Insert(pNewInfo,n); - pNewInfo->pSlot = pNewSlot; - pInfo->nSlotId = pNewInfo->nSlotId; - pNewInfo->nRefCnt++; - } - else - { - pInfo->nSlotId = (pImp->aArr)[i]->nSlotId; - (pImp->aArr)[i]->nRefCnt++; - } - - return pInfo->nSlotId; -} - -//========================================================================== - -void SfxMacroConfig::ReleaseSlotId(sal_uInt16 nId) -{ - DBG_ASSERT( IsMacroSlot( nId ), "SlotId ist kein Macro!"); - - sal_uInt16 nCount = pImp->aArr.Count(); - for (sal_uInt16 i=0; i<nCount; i++) - { - SfxMacroInfo *pInfo = (pImp->aArr)[i]; - if (pInfo->nSlotId == nId) - { - pInfo->nRefCnt--; - if (pInfo->nRefCnt == 0) - { - // Slot wird nicht mehr referenziert, also holen - SfxSlot *pSlot = pInfo->pSlot; - - // Slot aus der Verkettung rausnehmen - while (pSlot->pNextSlot != pInfo->pSlot) - pSlot = (SfxSlot*) pSlot->pNextSlot; - pSlot->pNextSlot = pInfo->pSlot->pNextSlot; - - // Slot selbst kurz schlie\sen - pSlot = pInfo->pSlot; - pSlot->pNextSlot = pSlot; - - // MacroInfo aus Array entfernen, damit sie kein Unheil - // anrichten kann - pImp->aArr.Remove(i); - - // SlotId wieder freigeben - sal_uInt16 nIdCount = aIdArray.Count(); - for (sal_uInt16 n=0; n<nIdCount; n++) - { - if (aIdArray[n] == nId) - { - aIdArray.Remove(n); - break; - } - } - - // Sofern nicht die Applikation heruntergefahren wird, mu\s - // der Slot asynchron gel"oscht werden, falls er in seinem - // eigenen Execute abgeschossen wird! - if ( !SFX_APP()->Get_Impl()->bInQuit ) - pImp->nEventId = Application::PostUserEvent( LINK(this, SfxMacroConfig, EventHdl_Impl), pInfo ); - else - EventHdl_Impl( pInfo ); - } - return; - } - } - - DBG_ERROR("Macro-SlotId nicht gefunden!"); -} - -//========================================================================== - -void SfxMacroConfig::RegisterSlotId(sal_uInt16 nId) -{ - DBG_ASSERT( IsMacroSlot( nId ), "SlotId ist kein Macro!"); - - sal_uInt16 nCount = pImp->aArr.Count(); - for (sal_uInt16 i=0; i<nCount; i++) - { - if ((pImp->aArr)[i]->nSlotId == nId) - { - (pImp->aArr)[i]->nRefCnt++; - return; - } - } - - DBG_ERROR("Macro-SlotId nicht gefunden!"); -} - -//========================================================================== - -SfxMacroInfo* SfxMacroConfig::GetMacroInfo(sal_uInt16 nId) const -{ - sal_uInt16 nCount = pImp->aArr.Count(); - for (sal_uInt16 i=0; i<nCount; i++) - if ((pImp->aArr)[i]->nSlotId == nId) - return (pImp->aArr)[i]; - - return 0; -} - -//========================================================================== - -const SfxMacroInfo* SfxMacroConfig::GetMacroInfo_Impl( const SvxMacro *pMacro ) const -{ - sal_uInt16 nCount = pImp->aArr.Count(); - for (sal_uInt16 i=0; i<nCount; i++) - if ((pImp->aArr)[i]->Compare(*pMacro) ) - return (pImp->aArr)[i]; - return 0; -} - -//========================================================================== - -sal_Bool SfxMacroConfig::ExecuteMacro( sal_uInt16 nId, const String& rArgs ) const -{ - const SfxMacroInfo* pInfo = GetMacroInfo( nId ); - if ( !pInfo ) - return sal_False; - - SfxObjectShell* pSh = SfxObjectShell::Current(); - - SvxMacro aMacro( pInfo->GetQualifiedName(), pInfo->GetBasicName(), STARBASIC ); - sal_Bool bRet = ExecuteMacro( pSh, &aMacro, rArgs ); - - // Release, da im Dispatcher-Execute ein Register gemacht wurde - ((SfxMacroConfig*)this)->ReleaseSlotId( nId ); - return bRet; -} - -sal_Bool SfxMacroConfig::ExecuteMacro( SfxObjectShell *pSh, const SvxMacro* pMacro, const String& /*rArgs*/ ) const -{ - SfxApplication *pApp = SFX_APP(); - - // Name des Macros oder Scripts bzw. ScriptCode - String aCode( pMacro->GetMacName() ); - ErrCode nErr = ERRCODE_NONE; - - // Ist es ein Basic-Macro ? - ScriptType eSType = pMacro->GetScriptType(); - sal_Bool bIsBasic = eSType == STARBASIC; - sal_Bool bIsStarScript = ( eSType == EXTENDED_STYPE && pMacro->GetLibName().SearchAscii( "StarScript" ) != STRING_NOTFOUND ); - sal_Bool bIsBasicLibBased = bIsBasic || bIsStarScript || !pSh; - - if ( bIsBasicLibBased ) - { - pApp->EnterBasicCall(); - BasicManager *pAppMgr = SFX_APP()->GetBasicManager(); - if( bIsBasic ) - { - // BasicManager von Document? - BasicManager *pMgr = pSh ? pSh->GetBasicManager() : NULL; - - // Da leider der Name zwischendurch h"aufig gewechselt hat ... - if( SFX_APP()->GetName() == pMacro->GetLibName() || - pMacro->GetLibName().EqualsAscii("StarDesktop") ) - pMgr = pAppMgr; - else if ( pMgr == pAppMgr ) - pMgr = NULL; - - if ( pSh && pMgr && pMgr != pAppMgr ) - { - if ( !pSh->AdjustMacroMode( String() ) ) - return sal_False; - } - - if ( pSh && pMgr && pMgr == pAppMgr ) - { - ::com::sun::star::uno::Any aOldThisComponent = pAppMgr->SetGlobalUNOConstant( "ThisComponent", makeAny( pSh->GetModel() ) ); - nErr = Call( 0, aCode, pMgr ); - pAppMgr->SetGlobalUNOConstant( "ThisComponent", aOldThisComponent ); - } - else if ( pMgr ) - nErr = Call( 0, aCode, pMgr ); - else - nErr = SbxERR_NO_METHOD; - - } - - pApp->LeaveBasicCall(); - } - else - { - nErr = SbxERR_NO_METHOD; - } - - return ( nErr == ERRCODE_NONE ); -} - -sal_Bool SfxMacroConfig::CheckMacro( SfxObjectShell *pSh, const SvxMacro* pMacro ) const -{ - SfxApplication *pApp = SFX_APP(); - - // Name des Macros oder Scripts bzw. ScriptCode - String aCode( pMacro->GetMacName() ); - ErrCode nErr = ERRCODE_NONE; - - // BasicManager von Document oder Application - pApp->EnterBasicCall(); - BasicManager *pAppMgr = SFX_APP()->GetBasicManager(); - BasicManager *pMgr = pSh ? pSh->GetBasicManager() : NULL; - - // Da leider der Name zwischendurch h"aufig gewechselt hat ... - if( SFX_APP()->GetName() == pMacro->GetLibName() || - pMacro->GetLibName().EqualsAscii("StarDesktop") ) - pMgr = pAppMgr; - else if ( pMgr == pAppMgr ) - pMgr = NULL; - - if ( !pMgr || !SfxQueryMacro( pMgr, aCode ) ) - nErr = SbxERR_NO_METHOD; - pApp->LeaveBasicCall(); - return ( nErr == ERRCODE_NONE ); -} - -//========================================================================== - -sal_Bool SfxMacroConfig::CheckMacro( sal_uInt16 nId ) const -{ - const SfxMacroInfo* pInfo = GetMacroInfo( nId ); - if ( !pInfo ) - return sal_False; - - // Basic nur initialisieren, wenn default nicht ::com::sun::star::script::JavaScript; dann mu\s - // in IsBasic() sowieso das Basic angelegt werden - SfxObjectShell* pSh = SfxObjectShell::Current(); - - SfxApplication *pApp = SFX_APP(); - pApp->EnterBasicCall(); - - // BasicManager von Document oder Application - BasicManager *pAppMgr = SFX_APP()->GetBasicManager(); - BasicManager *pMgr = pSh ? pSh->GetBasicManager() : NULL; - - if( SFX_APP()->GetName() == pInfo->GetBasicName() ) - pMgr = SFX_APP()->GetBasicManager(); - else if ( pMgr == pAppMgr ) - pMgr = NULL; - - String aFull( pInfo->GetQualifiedName() ); - sal_Bool bIsBasic = pMgr ? IsBasic( 0, aFull, pMgr ) : sal_False; - pApp->LeaveBasicCall(); - return bIsBasic; -} - -//========================================================================== - -IMPL_LINK( SfxMacroConfig, CallbackHdl_Impl, SfxMacroConfig*, pConfig ) -{ - (void)pConfig; // unused - pImp->bWaitingForCallback = sal_False; - return 0; -} - -IMPL_LINK( SfxMacroConfig, EventHdl_Impl, SfxMacroInfo*, pInfo ) -{ - delete pInfo; - pImp->nEventId = 0; - return 0; -} - -sal_Bool SfxMacroConfig::IsBasic( - SbxObject* /*pVCtrl*/, - const String& rCode, - BasicManager* pMgr ) -{ - sal_Bool bFound; - SFX_APP()->EnterBasicCall(); - bFound = SfxQueryMacro( pMgr, rCode ) != 0; - SFX_APP()->LeaveBasicCall(); - return bFound; -} - -ErrCode SfxMacroConfig::Call( - SbxObject* /*pVCtrl*/, - const String& rCode, - BasicManager* pMgr, - SbxArray *pArgs, - SbxValue *pRet ) -{ - SfxApplication *pApp = SFX_APP(); - pApp->EnterBasicCall(); - SbMethod* pMethod = SfxQueryMacro( pMgr, rCode ); - ErrCode nErr = 0; - if( pMethod ) - { - if ( pArgs ) - pMethod->SetParameters( pArgs ); - nErr = pMethod->Call( pRet ); - } - else - nErr = ERRCODE_BASIC_PROC_UNDEFINED; - - pApp->LeaveBasicCall(); - return nErr; -} - - -sal_Bool SfxMacroConfig::IsMacroSlot( sal_uInt16 nId ) -{ - return ( nId >= SID_MACRO_START && nId <= SID_MACRO_END ); -} - - diff --git a/sfx2/source/control/makefile.mk b/sfx2/source/control/makefile.mk index 86797589e3aa..7211bc409ca3 100644 --- a/sfx2/source/control/makefile.mk +++ b/sfx2/source/control/makefile.mk @@ -53,7 +53,6 @@ SLOFILES = \ $(SLO)$/bindings.obj \ $(SLO)$/ctrlitem.obj \ $(SLO)$/dispatch.obj \ - $(SLO)$/macrconf.obj \ $(SLO)$/macro.obj \ $(SLO)$/minfitem.obj \ $(SLO)$/msg.obj \ diff --git a/sfx2/source/control/msgpool.cxx b/sfx2/source/control/msgpool.cxx index f1abd25a5413..f9cd25331329 100644 --- a/sfx2/source/control/msgpool.cxx +++ b/sfx2/source/control/msgpool.cxx @@ -40,7 +40,6 @@ #include <sfx2/app.hxx> #include <sfx2/objface.hxx> #include "sfxtypes.hxx" -#include <sfx2/macrconf.hxx> #include "sfxresid.hxx" #include "arrdecl.hxx" #include <sfx2/module.hxx> diff --git a/sfx2/source/control/shell.cxx b/sfx2/source/control/shell.cxx index f3df5dc36d0c..d1605754680a 100644 --- a/sfx2/source/control/shell.cxx +++ b/sfx2/source/control/shell.cxx @@ -46,7 +46,6 @@ #include <sfx2/bindings.hxx> #include <sfx2/dispatch.hxx> #include <sfx2/viewfrm.hxx> -#include "sfxbasic.hxx" #include <sfx2/objface.hxx> #include <sfx2/objsh.hxx> #include <sfx2/viewsh.hxx> @@ -55,7 +54,6 @@ #include <sfx2/request.hxx> #include <sfx2/mnumgr.hxx> #include "statcach.hxx" -#include <sfx2/macrconf.hxx> #include <sfx2/msgpool.hxx> //==================================================================== @@ -483,7 +481,7 @@ SfxBroadcaster* SfxShell::GetBroadcaster() //-------------------------------------------------------------------- -SfxUndoManager* SfxShell::GetUndoManager() +::svl::IUndoManager* SfxShell::GetUndoManager() /* [Beschreibung] @@ -501,7 +499,7 @@ SfxUndoManager* SfxShell::GetUndoManager() //-------------------------------------------------------------------- -void SfxShell::SetUndoManager( SfxUndoManager *pNewUndoMgr ) +void SfxShell::SetUndoManager( ::svl::IUndoManager *pNewUndoMgr ) /* [Beschreibung] @@ -517,6 +515,12 @@ void SfxShell::SetUndoManager( SfxUndoManager *pNewUndoMgr ) */ { + OSL_ENSURE( ( pUndoMgr == NULL ) || ( pNewUndoMgr == NULL ) || ( pUndoMgr == pNewUndoMgr ), + "SfxShell::SetUndoManager: exchanging one non-NULL manager with another non-NULL manager? Suspicious!" ); + // there's at least one client of our UndoManager - the DocumentUndoManager at the SfxBaseModel - which + // caches the UndoManager, and registers itself as listener. If exchanging non-NULL UndoManagers is really + // a supported scenario (/me thinks it is not), then we would need to notify all such clients instances. + pUndoMgr = pNewUndoMgr; if ( pUndoMgr ) pUndoMgr->SetMaxUndoActionCount( (USHORT) SvtUndoOptions().GetUndoCount() ); @@ -947,13 +951,6 @@ const SfxPoolItem* SfxShell::ExecuteSlot pSlot = GetVerbSlot_Impl(nSlot); if ( !pSlot ) pSlot = pIF->GetSlot(nSlot); - if ( !pSlot && SfxMacroConfig::IsMacroSlot( nSlot ) ) - { - SfxMacroInfo* pInfo = SFX_APP()->GetMacroConfig()->GetMacroInfo(nSlot); - if ( pInfo ) - pSlot = pInfo->GetSlot(); - } - DBG_ASSERT( pSlot, "slot not supported" ); SfxExecFunc pFunc = pSlot->GetExecFnc(); @@ -1022,13 +1019,6 @@ const SfxPoolItem* SfxShell::GetSlotState pSlot = GetVerbSlot_Impl(nSlotId); if ( !pSlot ) pSlot = pIF->GetSlot(nSlotId); - if ( !pSlot && SfxMacroConfig::IsMacroSlot( nSlotId ) ) - { - SfxMacroInfo* pInfo = SFX_APP()->GetMacroConfig()->GetMacroInfo(nSlotId); - if ( pInfo ) - pSlot = pInfo->GetSlot(); - } - if ( pSlot ) // ggf. auf Which-Id mappen nSlotId = pSlot->GetWhich( rPool ); diff --git a/sfx2/source/doc/doc.hrc b/sfx2/source/doc/doc.hrc index 7e8fd688af52..c3cbf01cfc9a 100644 --- a/sfx2/source/doc/doc.hrc +++ b/sfx2/source/doc/doc.hrc @@ -146,11 +146,6 @@ #define RID_CNT_STR_WAITING (RID_SFX_DOC_START+ 83) #define STR_OBJECT (RID_SFX_DOC_START+ 84) -#define STR_EDITOBJECT (RID_SFX_DOC_START+ 85) -// --> PB 2004-08-20 #i33095# -/* obsolete -#define STR_OPENOBJECT (RID_SFX_DOC_START+ 86) -*/ #define DLOAD_URL 1 #define DLOAD_STATUS 2 diff --git a/sfx2/source/doc/doc.src b/sfx2/source/doc/doc.src index 497d4ccd7c97..bbf3ccb33253 100644 --- a/sfx2/source/doc/doc.src +++ b/sfx2/source/doc/doc.src @@ -371,19 +371,6 @@ String STR_OBJECT Text [ en-US ] = "Object" ; }; -String STR_EDITOBJECT -{ - Text [ en-US ] = "~Edit"; -}; - -// --> PB 2004-08-20 #i33095# -/* obsolete -String STR_OPENOBJECT -{ - Text [ en-US ] = "~Open"; -}; -*/ - QueryBox DLG_MACROQUERY { Buttons = WB_OK_CANCEL; diff --git a/sfx2/source/doc/docundomanager.cxx b/sfx2/source/doc/docundomanager.cxx new file mode 100755 index 000000000000..8fa7dd29ac39 --- /dev/null +++ b/sfx2/source/doc/docundomanager.cxx @@ -0,0 +1,457 @@ +/************************************************************************* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_sfx2.hxx" + +#include "docundomanager.hxx" +#include "sfx2/sfxbasemodel.hxx" +#include "sfx2/objsh.hxx" +#include "sfx2/viewfrm.hxx" +#include "sfx2/viewsh.hxx" +#include "sfx2/bindings.hxx" + +/** === begin UNO includes === **/ +#include <com/sun/star/lang/XComponent.hpp> +/** === end UNO includes === **/ + +#include <comphelper/anytostring.hxx> +#include <comphelper/flagguard.hxx> +#include <svl/undo.hxx> +#include <tools/diagnose_ex.h> +#include <framework/undomanagerhelper.hxx> + +#include <boost/noncopyable.hpp> +#include <stack> + +//...................................................................................................................... +namespace sfx2 +{ +//...................................................................................................................... + + /** === begin UNO using === **/ + using ::com::sun::star::uno::Reference; + using ::com::sun::star::uno::XInterface; + using ::com::sun::star::uno::UNO_QUERY; + using ::com::sun::star::uno::UNO_QUERY_THROW; + using ::com::sun::star::uno::UNO_SET_THROW; + using ::com::sun::star::uno::Exception; + using ::com::sun::star::uno::RuntimeException; + using ::com::sun::star::uno::Any; + using ::com::sun::star::uno::makeAny; + using ::com::sun::star::uno::Sequence; + using ::com::sun::star::uno::Type; + using ::com::sun::star::util::InvalidStateException; + using ::com::sun::star::document::EmptyUndoStackException; + using ::com::sun::star::util::NotLockedException; + using ::com::sun::star::document::UndoContextNotClosedException; + using ::com::sun::star::document::XUndoAction; + using ::com::sun::star::document::XUndoManagerSupplier; + using ::com::sun::star::lang::XComponent; + using ::com::sun::star::lang::IllegalArgumentException; + using ::com::sun::star::lang::NotInitializedException; + using ::com::sun::star::lang::EventObject; + using ::com::sun::star::document::UndoManagerEvent; + using ::com::sun::star::document::XUndoManagerListener; + using ::com::sun::star::document::UndoFailedException; + using ::com::sun::star::document::XUndoManager; + using ::com::sun::star::lang::NoSupportException; + using ::com::sun::star::frame::XModel; + /** === end UNO using === **/ + + using ::svl::IUndoManager; + + //================================================================================================================== + //= DocumentUndoManager_Impl + //================================================================================================================== + struct DocumentUndoManager_Impl : public ::framework::IUndoManagerImplementation + { + DocumentUndoManager& rAntiImpl; + IUndoManager* pUndoManager; + ::framework::UndoManagerHelper aUndoHelper; + + DocumentUndoManager_Impl( DocumentUndoManager& i_antiImpl ) + :rAntiImpl( i_antiImpl ) + ,pUndoManager( impl_retrieveUndoManager( i_antiImpl.getBaseModel() ) ) + // do this *before* the construction of aUndoHelper (which actually means: put pUndoManager before + // aUndoHelper in the member list)! + ,aUndoHelper( *this ) + { + } + + const SfxObjectShell* getObjectShell() const { return rAntiImpl.getBaseModel().GetObjectShell(); } + SfxObjectShell* getObjectShell() { return rAntiImpl.getBaseModel().GetObjectShell(); } + + // IUndoManagerImplementation + virtual ::svl::IUndoManager& getImplUndoManager(); + virtual Reference< XUndoManager > getThis(); + + void disposing() + { + aUndoHelper.disposing(); + ENSURE_OR_RETURN_VOID( pUndoManager, "DocumentUndoManager_Impl::disposing: already disposed!" ); + pUndoManager = NULL; + } + + void invalidateXDo_nolck(); + + private: + static IUndoManager* impl_retrieveUndoManager( SfxBaseModel& i_baseModel ) + { + IUndoManager* pUndoManager( NULL ); + SfxObjectShell* pObjectShell = i_baseModel.GetObjectShell(); + if ( pObjectShell != NULL ) + pUndoManager = pObjectShell->GetUndoManager(); + if ( !pUndoManager ) + throw NotInitializedException( ::rtl::OUString(), *&i_baseModel ); + return pUndoManager; + } + }; + + //------------------------------------------------------------------------------------------------------------------ + ::svl::IUndoManager& DocumentUndoManager_Impl::getImplUndoManager() + { + ENSURE_OR_THROW( pUndoManager != NULL, "DocumentUndoManager_Impl::getImplUndoManager: no access to the doc's UndoManager implementation!" ); + +#if OSL_DEBUG_LEVEL > 0 + // in a non-product build, assert if the current UndoManager at the shell is not the same we obtained + // (and cached) at construction time + SfxObjectShell* pObjectShell = rAntiImpl.getBaseModel().GetObjectShell(); + OSL_ENSURE( ( pObjectShell != NULL ) && ( pUndoManager == pObjectShell->GetUndoManager() ), + "DocumentUndoManager_Impl::getImplUndoManager: the UndoManager changed meanwhile - what about our listener?" ); +#endif + + return *pUndoManager; + } + + //------------------------------------------------------------------------------------------------------------------ + Reference< XUndoManager > DocumentUndoManager_Impl::getThis() + { + return static_cast< XUndoManager* >( &rAntiImpl ); + } + + //------------------------------------------------------------------------------------------------------------------ + void DocumentUndoManager_Impl::invalidateXDo_nolck() + { + SfxModelGuard aGuard( rAntiImpl ); + + const SfxObjectShell* pDocShell = getObjectShell(); + ENSURE_OR_THROW( pDocShell != NULL, "lcl_invalidateUndo: no access to the doc shell!" ); + SfxViewFrame* pViewFrame = SfxViewFrame::GetFirst( pDocShell ); + while ( pViewFrame ) + { + pViewFrame->GetBindings().Invalidate( SID_UNDO ); + pViewFrame->GetBindings().Invalidate( SID_REDO ); + pViewFrame = SfxViewFrame::GetNext( *pViewFrame, pDocShell ); + } + } + + //================================================================================================================== + //= SolarMutexFacade + //================================================================================================================== + /** a facade for the SolarMutex, implementing ::framework::IMutex (as opposed to ::vos::IMutex) + */ + class SolarMutexFacade : public ::framework::IMutex + { + public: + SolarMutexFacade() + { + } + + virtual void acquire() + { + Application::GetSolarMutex().acquire(); + } + + virtual void release() + { + Application::GetSolarMutex().release(); + } + }; + + //================================================================================================================== + //= UndoManagerGuard + //================================================================================================================== + class UndoManagerGuard :public ::framework::IMutexGuard + ,public ::boost::noncopyable + { + public: + UndoManagerGuard( DocumentUndoManager& i_undoManager ) + :m_guard( i_undoManager ) + ,m_solarMutexFacade() + { + } + + ~UndoManagerGuard() + { + } + + virtual void reset() + { + m_guard.reset(); + } + + virtual void clear() + { + m_guard.clear(); + } + + virtual ::framework::IMutex& getGuardedMutex() + { + // note that this means that we *know* that SfxModelGuard also locks the SolarMutex (nothing more, nothing less). + // If this ever changes, we need to adjust this code here, too. + return m_solarMutexFacade; + } + + private: + SfxModelGuard m_guard; + SolarMutexFacade m_solarMutexFacade; + }; + + //================================================================================================================== + //= DocumentUndoManager + //================================================================================================================== + //------------------------------------------------------------------------------------------------------------------ + DocumentUndoManager::DocumentUndoManager( SfxBaseModel& i_document ) + :SfxModelSubComponent( i_document ) + ,m_pImpl( new DocumentUndoManager_Impl( *this ) ) + { + } + + //------------------------------------------------------------------------------------------------------------------ + DocumentUndoManager::~DocumentUndoManager() + { + } + + //------------------------------------------------------------------------------------------------------------------ + void DocumentUndoManager::disposing() + { + m_pImpl->disposing(); + } + + //------------------------------------------------------------------------------------------------------------------ + bool DocumentUndoManager::isInContext() const + { + // No mutex locking within this method, no disposal check - this is the responsibility of the owner. + return m_pImpl->getImplUndoManager().IsInListAction(); + } + + //------------------------------------------------------------------------------------------------------------------ + void SAL_CALL DocumentUndoManager::acquire( ) throw () + { + SfxModelSubComponent::acquire(); + } + + //------------------------------------------------------------------------------------------------------------------ + void SAL_CALL DocumentUndoManager::release( ) throw () + { + SfxModelSubComponent::release(); + } + + //------------------------------------------------------------------------------------------------------------------ + void SAL_CALL DocumentUndoManager::enterUndoContext( const ::rtl::OUString& i_title ) throw (RuntimeException) + { + // SYNCHRONIZED ---> + UndoManagerGuard aGuard( *this ); + m_pImpl->aUndoHelper.enterUndoContext( i_title, aGuard ); + // <--- SYNCHRONIZED + m_pImpl->invalidateXDo_nolck(); + } + + //------------------------------------------------------------------------------------------------------------------ + void SAL_CALL DocumentUndoManager::enterHiddenUndoContext( ) throw (EmptyUndoStackException, RuntimeException) + { + // SYNCHRONIZED ---> + UndoManagerGuard aGuard( *this ); + m_pImpl->aUndoHelper.enterHiddenUndoContext( aGuard ); + // <--- SYNCHRONIZED + m_pImpl->invalidateXDo_nolck(); + } + + //------------------------------------------------------------------------------------------------------------------ + void SAL_CALL DocumentUndoManager::leaveUndoContext( ) throw (InvalidStateException, RuntimeException) + { + // SYNCHRONIZED ---> + UndoManagerGuard aGuard( *this ); + m_pImpl->aUndoHelper.leaveUndoContext( aGuard ); + // <--- SYNCHRONIZED + m_pImpl->invalidateXDo_nolck(); + } + + //------------------------------------------------------------------------------------------------------------------ + void SAL_CALL DocumentUndoManager::addUndoAction( const Reference< XUndoAction >& i_action ) throw (RuntimeException, IllegalArgumentException) + { + // SYNCHRONIZED ---> + UndoManagerGuard aGuard( *this ); + m_pImpl->aUndoHelper.addUndoAction( i_action, aGuard ); + // <--- SYNCHRONIZED + m_pImpl->invalidateXDo_nolck(); + } + + //------------------------------------------------------------------------------------------------------------------ + void SAL_CALL DocumentUndoManager::undo( ) throw (EmptyUndoStackException, UndoContextNotClosedException, UndoFailedException, RuntimeException) + { + // SYNCHRONIZED ---> + UndoManagerGuard aGuard( *this ); + m_pImpl->aUndoHelper.undo( aGuard ); + // <--- SYNCHRONIZED + m_pImpl->invalidateXDo_nolck(); + } + + //------------------------------------------------------------------------------------------------------------------ + void SAL_CALL DocumentUndoManager::redo( ) throw (EmptyUndoStackException, UndoContextNotClosedException, UndoFailedException, RuntimeException) + { + // SYNCHRONIZED ---> + UndoManagerGuard aGuard( *this ); + m_pImpl->aUndoHelper.redo( aGuard ); + // <--- SYNCHRONIZED + m_pImpl->invalidateXDo_nolck(); + } + + //------------------------------------------------------------------------------------------------------------------ + ::sal_Bool SAL_CALL DocumentUndoManager::isUndoPossible( ) throw (RuntimeException) + { + UndoManagerGuard aGuard( *this ); + return m_pImpl->aUndoHelper.isUndoPossible(); + } + + //------------------------------------------------------------------------------------------------------------------ + ::sal_Bool SAL_CALL DocumentUndoManager::isRedoPossible( ) throw (RuntimeException) + { + UndoManagerGuard aGuard( *this ); + return m_pImpl->aUndoHelper.isRedoPossible(); + } + + //------------------------------------------------------------------------------------------------------------------ + ::rtl::OUString SAL_CALL DocumentUndoManager::getCurrentUndoActionTitle( ) throw (EmptyUndoStackException, RuntimeException) + { + UndoManagerGuard aGuard( *this ); + return m_pImpl->aUndoHelper.getCurrentUndoActionTitle(); + } + + //------------------------------------------------------------------------------------------------------------------ + ::rtl::OUString SAL_CALL DocumentUndoManager::getCurrentRedoActionTitle( ) throw (EmptyUndoStackException, RuntimeException) + { + UndoManagerGuard aGuard( *this ); + return m_pImpl->aUndoHelper.getCurrentRedoActionTitle(); + } + + //------------------------------------------------------------------------------------------------------------------ + Sequence< ::rtl::OUString > SAL_CALL DocumentUndoManager::getAllUndoActionTitles( ) throw (RuntimeException) + { + UndoManagerGuard aGuard( *this ); + return m_pImpl->aUndoHelper.getAllUndoActionTitles(); + } + + //------------------------------------------------------------------------------------------------------------------ + Sequence< ::rtl::OUString > SAL_CALL DocumentUndoManager::getAllRedoActionTitles( ) throw (RuntimeException) + { + UndoManagerGuard aGuard( *this ); + return m_pImpl->aUndoHelper.getAllRedoActionTitles(); + } + + //------------------------------------------------------------------------------------------------------------------ + void SAL_CALL DocumentUndoManager::clear( ) throw (UndoContextNotClosedException, RuntimeException) + { + // SYNCHRONIZED ---> + UndoManagerGuard aGuard( *this ); + m_pImpl->aUndoHelper.clear( aGuard ); + // <--- SYNCHRONIZED + m_pImpl->invalidateXDo_nolck(); + } + + //------------------------------------------------------------------------------------------------------------------ + void SAL_CALL DocumentUndoManager::clearRedo( ) throw (UndoContextNotClosedException, RuntimeException) + { + // SYNCHRONIZED ---> + UndoManagerGuard aGuard( *this ); + m_pImpl->aUndoHelper.clearRedo( aGuard ); + // <--- SYNCHRONIZED + m_pImpl->invalidateXDo_nolck(); + } + + //------------------------------------------------------------------------------------------------------------------ + void SAL_CALL DocumentUndoManager::reset() throw (RuntimeException) + { + // SYNCHRONIZED ---> + UndoManagerGuard aGuard( *this ); + m_pImpl->aUndoHelper.reset( aGuard ); + // <--- SYNCHRONIZED + m_pImpl->invalidateXDo_nolck(); + } + + //------------------------------------------------------------------------------------------------------------------ + void SAL_CALL DocumentUndoManager::lock( ) throw (RuntimeException) + { + UndoManagerGuard aGuard( *this ); + m_pImpl->aUndoHelper.lock(); + } + + //------------------------------------------------------------------------------------------------------------------ + void SAL_CALL DocumentUndoManager::unlock( ) throw (RuntimeException, NotLockedException) + { + UndoManagerGuard aGuard( *this ); + m_pImpl->aUndoHelper.unlock(); + } + + //------------------------------------------------------------------------------------------------------------------ + ::sal_Bool SAL_CALL DocumentUndoManager::isLocked( ) throw (RuntimeException) + { + UndoManagerGuard aGuard( *this ); + return m_pImpl->aUndoHelper.isLocked(); + } + + //------------------------------------------------------------------------------------------------------------------ + void SAL_CALL DocumentUndoManager::addUndoManagerListener( const Reference< XUndoManagerListener >& i_listener ) throw (RuntimeException) + { + UndoManagerGuard aGuard( *this ); + return m_pImpl->aUndoHelper.addUndoManagerListener( i_listener ); + } + + //------------------------------------------------------------------------------------------------------------------ + void SAL_CALL DocumentUndoManager::removeUndoManagerListener( const Reference< XUndoManagerListener >& i_listener ) throw (RuntimeException) + { + UndoManagerGuard aGuard( *this ); + return m_pImpl->aUndoHelper.removeUndoManagerListener( i_listener ); + } + + //------------------------------------------------------------------------------------------------------------------ + Reference< XInterface > SAL_CALL DocumentUndoManager::getParent( ) throw (RuntimeException) + { + UndoManagerGuard aGuard( *this ); + return static_cast< XModel* >( &getBaseModel() ); + } + + //------------------------------------------------------------------------------------------------------------------ + void SAL_CALL DocumentUndoManager::setParent( const Reference< XInterface >& i_parent ) throw (NoSupportException, RuntimeException) + { + (void)i_parent; + throw NoSupportException( ::rtl::OUString(), m_pImpl->getThis() ); + } + +//...................................................................................................................... +} // namespace sfx2 +//...................................................................................................................... diff --git a/sfx2/source/doc/makefile.mk b/sfx2/source/doc/makefile.mk index d663d34cf5ba..5adf2320f13b 100644 --- a/sfx2/source/doc/makefile.mk +++ b/sfx2/source/doc/makefile.mk @@ -85,7 +85,8 @@ SLOFILES = \ $(SLO)$/docstoragemodifylistener.obj \ $(SLO)$/querytemplate.obj \ $(SLO)$/syspath.obj \ - $(SLO)$/syspathw32.obj + $(SLO)$/syspathw32.obj \ + $(SLO)$/docundomanager.obj .IF "$(GUI)" == "WNT" diff --git a/sfx2/source/doc/objmisc.cxx b/sfx2/source/doc/objmisc.cxx index e386b2382acf..7278baf816ee 100644 --- a/sfx2/source/doc/objmisc.cxx +++ b/sfx2/source/doc/objmisc.cxx @@ -118,6 +118,7 @@ using namespace ::com::sun::star::container; #include <rtl/bootstrap.hxx> #include <vcl/svapp.hxx> #include <framework/interaction.hxx> +#include <framework/documentundoguard.hxx> #include <comphelper/storagehelper.hxx> #include <comphelper/documentconstants.hxx> @@ -140,7 +141,6 @@ using namespace ::com::sun::star::container; #include <sfx2/ctrlitem.hxx> #include "arrdecl.hxx" #include <sfx2/module.hxx> -#include <sfx2/macrconf.hxx> #include <sfx2/docfac.hxx> #include "helper.hxx" #include "doc.hrc" @@ -1651,15 +1651,8 @@ SfxModule* SfxObjectShell::GetModule() const return GetFactory().GetModule(); } -sal_Bool SfxObjectShell::IsBasic( - const String & rCode, SbxObject * pVCtrl ) -{ - if( !rCode.Len() ) return sal_False; - return SfxMacroConfig::IsBasic( pVCtrl, rCode, GetBasicManager() ); -} - ErrCode SfxObjectShell::CallBasic( const String& rMacro, - const String& rBasic, SbxObject* pVCtrl, SbxArray* pArgs, + const String& rBasic, SbxArray* pArgs, SbxValue* pRet ) { SfxApplication* pApp = SFX_APP(); @@ -1669,23 +1662,13 @@ ErrCode SfxObjectShell::CallBasic( const String& rMacro, return ERRCODE_IO_ACCESSDENIED; } - pApp->EnterBasicCall(); BasicManager *pMgr = GetBasicManager(); if( pApp->GetName() == rBasic ) pMgr = pApp->GetBasicManager(); - ErrCode nRet = SfxMacroConfig::Call( pVCtrl, rMacro, pMgr, pArgs, pRet ); - pApp->LeaveBasicCall(); + ErrCode nRet = SfxApplication::CallBasic( rMacro, pMgr, pArgs, pRet ); return nRet; } -ErrCode SfxObjectShell::Call( const String & rCode, sal_Bool bIsBasicReturn, SbxObject * pVCtrl ) -{ - ErrCode nErr = ERRCODE_NONE; - if ( bIsBasicReturn ) - CallBasic( rCode, String(), pVCtrl ); - return nErr; -} - namespace { static bool lcl_isScriptAccessAllowed_nothrow( const Reference< XInterface >& _rxScriptContext ) @@ -1739,9 +1722,11 @@ ErrCode SfxObjectShell::CallXScript( const Reference< XInterface >& _rxScriptCon xScriptProvider.set( xScriptProviderFactory->createScriptProvider( makeAny( _rxScriptContext ) ), UNO_SET_THROW ); } + // ry to protect the invocation context's undo manager (if present), just in case the script tampers with it + ::framework::DocumentUndoGuard aUndoGuard( _rxScriptContext.get() ); + // obtain the script, and execute it Reference< provider::XScript > xScript( xScriptProvider->getScript( _rScriptURL ), UNO_QUERY_THROW ); - aRet = xScript->invoke( aParams, aOutParamIndex, aOutParam ); } catch ( const uno::Exception& ) @@ -1781,118 +1766,6 @@ ErrCode SfxObjectShell::CallXScript( const String& rScriptURL, } //------------------------------------------------------------------------- -namespace { - using namespace ::com::sun::star::uno; - - //..................................................................... - static SbxArrayRef lcl_translateUno2Basic( const void* _pAnySequence ) - { - SbxArrayRef xReturn; - if ( _pAnySequence ) - { - // in real it's a sequence of Any (by convention) - const Sequence< Any >* pArguments = static_cast< const Sequence< Any >* >( _pAnySequence ); - - // do we have arguments ? - if ( pArguments->getLength() ) - { - // yep - xReturn = new SbxArray; - String sEmptyName; - - // loop through the sequence - const Any* pArg = pArguments->getConstArray(); - const Any* pArgEnd = pArg + pArguments->getLength(); - - for ( sal_uInt16 nArgPos=1; pArg != pArgEnd; ++pArg, ++nArgPos ) - // and create a Sb object for every Any - xReturn->Put( GetSbUnoObject( sEmptyName, *pArg ), nArgPos ); - } - } - return xReturn; - } - //..................................................................... - void lcl_translateBasic2Uno( const SbxVariableRef& _rBasicValue, void* _pAny ) - { - if ( _pAny ) - *static_cast< Any* >( _pAny ) = sbxToUnoValue( _rBasicValue ); - } -} -//------------------------------------------------------------------------- -ErrCode SfxObjectShell::CallStarBasicScript( const String& _rMacroName, const String& _rLocation, - const void* _pArguments, void* _pReturn ) -{ - OSL_TRACE("in CallSBS"); - ::vos::OClearableGuard aGuard( Application::GetSolarMutex() ); - - // the arguments for the call - SbxArrayRef xMacroArguments = lcl_translateUno2Basic( _pArguments ); - - // the return value - SbxVariableRef xReturn = _pReturn ? new SbxVariable : NULL; - - // the location (document or application) - String sMacroLocation; - if ( _rLocation.EqualsAscii( "application" ) ) - sMacroLocation = SFX_APP()->GetName(); -#ifdef DBG_UTIL - else - DBG_ASSERT( _rLocation.EqualsAscii( "document" ), - "SfxObjectShell::CallStarBasicScript: invalid (unknown) location!" ); -#endif - - // call the script - ErrCode eError = CallBasic( _rMacroName, sMacroLocation, NULL, xMacroArguments, xReturn ); - - // translate the return value - lcl_translateBasic2Uno( xReturn, _pReturn ); - - // outta here - return eError; -} - -//------------------------------------------------------------------------- -ErrCode SfxObjectShell::CallScript( - const String & rScriptType, - const String & rCode, - const void *pArgs, - void *pRet -) -{ - ::vos::OClearableGuard aGuard( Application::GetSolarMutex() ); - ErrCode nErr = ERRCODE_NONE; - if( rScriptType.EqualsAscii( "StarBasic" ) ) - { - // the arguments for the call - SbxArrayRef xMacroArguments = lcl_translateUno2Basic( pArgs ); - - // the return value - SbxVariableRef xReturn = pRet ? new SbxVariable : NULL; - - // call the script - nErr = CallBasic( rCode, String(), NULL, xMacroArguments, xReturn ); - - // translate the return value - lcl_translateBasic2Uno( xReturn, pRet ); - - // did this fail because the method was not found? - if ( nErr == ERRCODE_BASIC_PROC_UNDEFINED ) - { // yep-> look in the application BASIC module - nErr = CallBasic( rCode, SFX_APP()->GetName(), NULL, xMacroArguments, xReturn ); - } - } - else if( rScriptType.EqualsAscii( "JavaScript" ) ) - { - DBG_ERROR( "JavaScript not allowed" ); - return 0; - } - else - { - DBG_ERROR( "StarScript not allowed" ); - } - return nErr; -} - SfxFrame* SfxObjectShell::GetSmartSelf( SfxFrame* pSelf, SfxMedium& /*rMedium*/ ) { return pSelf; @@ -1910,51 +1783,6 @@ void SfxObjectShell::SetFlags( SfxObjectShellFlags eFlags ) pImp->eFlags = eFlags; } -/* -void SfxObjectShell::SetBaseURL( const String& rURL ) -{ - pImp->aBaseURL = rURL; - pImp->bNoBaseURL = FALSE; -} - -const String& SfxObjectShell::GetBaseURLForSaving() const -{ - if ( pImp->bNoBaseURL ) - return String(); - return GetBaseURL(); -} - -const String& SfxObjectShell::GetBaseURL() const -{ - if ( pImp->aBaseURL.Len() ) - return pImp->aBaseURL; - return pMedium->GetBaseURL(); -} - -void SfxObjectShell::SetEmptyBaseURL() -{ - pImp->bNoBaseURL = TRUE; -} -*/ -String SfxObjectShell::QueryTitle( SfxTitleQuery eType ) const -{ - String aRet; - - switch( eType ) - { - case SFX_TITLE_QUERY_SAVE_NAME_PROPOSAL: - { - SfxMedium* pMed = GetMedium(); - const INetURLObject aObj( pMed->GetName() ); - aRet = aObj.GetMainURL( INetURLObject::DECODE_TO_IURI ); - if ( !aRet.Len() ) - aRet = GetTitle( SFX_TITLE_CAPTION ); - break; - } - } - return aRet; -} - void SfxHeaderAttributes_Impl::SetAttributes() { bAlert = sal_True; diff --git a/sfx2/source/doc/objserv.cxx b/sfx2/source/doc/objserv.cxx index bb0e6939ead8..252a37cf7ee1 100644 --- a/sfx2/source/doc/objserv.cxx +++ b/sfx2/source/doc/objserv.cxx @@ -1088,13 +1088,6 @@ void SfxObjectShell::ExecProps_Impl(SfxRequest &rReq) rReq.Done(); break; - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - case SID_PLAYMACRO: - { - SFX_APP()->PlayMacro_Impl( rReq, GetBasic() ); - break; - } - case SID_DOCINFO_AUTHOR : { ::rtl::OUString aStr = ( (SfxStringItem&)rReq.GetArgs()->Get(rReq.GetSlot())).GetValue(); diff --git a/sfx2/source/doc/sfxbasemodel.cxx b/sfx2/source/doc/sfxbasemodel.cxx index ee449d15b419..603887dc055c 100644 --- a/sfx2/source/doc/sfxbasemodel.cxx +++ b/sfx2/source/doc/sfxbasemodel.cxx @@ -127,6 +127,7 @@ #include "sfx2/docstoragemodifylistener.hxx" #include "brokenpackageint.hxx" #include "graphhelp.hxx" +#include "docundomanager.hxx" #include <sfx2/msgpool.hxx> #include <sfx2/DocumentMetadataAccess.hxx> @@ -153,6 +154,10 @@ using ::com::sun::star::lang::WrappedTargetException; using ::com::sun::star::uno::Type; using ::com::sun::star::uno::Sequence; using ::com::sun::star::document::XDocumentRecovery; +using ::com::sun::star::document::XUndoManager; +using ::com::sun::star::document::XUndoAction; +using ::com::sun::star::document::UndoFailedException; +using ::com::sun::star::frame::XModel; /** This Listener is used to get notified when the XDocumentProperties of the XModel change. @@ -226,10 +231,11 @@ struct IMPL_SfxBaseModel_DataContainer : public ::sfx2::IModifiableDocument uno::Reference< script::provider::XScriptProvider > m_xScriptProvider; uno::Reference< ui::XUIConfigurationManager > m_xUIConfigurationManager; ::rtl::Reference< ::sfx2::DocumentStorageModifyListener > m_pStorageModifyListen; - ::rtl::OUString m_sModuleIdentifier; + ::rtl::OUString m_sModuleIdentifier; css::uno::Reference< css::frame::XTitle > m_xTitleHelper; css::uno::Reference< css::frame::XUntitledNumbers > m_xNumberedControllers; - uno::Reference< rdf::XDocumentMetadataAccess> m_xDocumentMetadata; + uno::Reference< rdf::XDocumentMetadataAccess> m_xDocumentMetadata; + ::rtl::Reference< ::sfx2::DocumentUndoManager > m_pDocumentUndoManager; IMPL_SfxBaseModel_DataContainer( ::osl::Mutex& rMutex, SfxObjectShell* pObjectShell ) @@ -246,6 +252,7 @@ struct IMPL_SfxBaseModel_DataContainer : public ::sfx2::IModifiableDocument , m_xTitleHelper () , m_xNumberedControllers () , m_xDocumentMetadata () // lazy + , m_pDocumentUndoManager () { // increase global instance counter. ++g_nInstanceCounter; @@ -786,6 +793,12 @@ void SAL_CALL SfxBaseModel::dispose() throw(::com::sun::star::uno::RuntimeExcept m_pData->m_pStorageModifyListen = NULL; } + if ( m_pData->m_pDocumentUndoManager.is() ) + { + m_pData->m_pDocumentUndoManager->disposing(); + m_pData->m_pDocumentUndoManager = NULL; + } + lang::EventObject aEvent( (frame::XModel *)this ); m_pData->m_aInterfaceContainer.disposeAndClear( aEvent ); @@ -1181,6 +1194,51 @@ void SAL_CALL SfxBaseModel::disconnectController( const uno::Reference< frame::X m_pData->m_xCurrent = uno::Reference< frame::XController > (); } +namespace +{ + typedef ::cppu::WeakImplHelper1< XUndoAction > ControllerLockUndoAction_Base; + class ControllerLockUndoAction : public ControllerLockUndoAction_Base + { + public: + ControllerLockUndoAction( const Reference< XModel >& i_model, const bool i_undoIsUnlock ) + :m_xModel( i_model ) + ,m_bUndoIsUnlock( i_undoIsUnlock ) + { + } + + // XUndoAction + virtual ::rtl::OUString SAL_CALL getTitle() throw (RuntimeException); + virtual void SAL_CALL undo( ) throw (UndoFailedException, RuntimeException); + virtual void SAL_CALL redo( ) throw (UndoFailedException, RuntimeException); + + private: + const Reference< XModel > m_xModel; + const bool m_bUndoIsUnlock; + }; + + ::rtl::OUString SAL_CALL ControllerLockUndoAction::getTitle() throw (RuntimeException) + { + // this action is intended to be used within an UndoContext only, so nobody will ever see this title ... + return ::rtl::OUString(); + } + + void SAL_CALL ControllerLockUndoAction::undo( ) throw (UndoFailedException, RuntimeException) + { + if ( m_bUndoIsUnlock ) + m_xModel->unlockControllers(); + else + m_xModel->lockControllers(); + } + + void SAL_CALL ControllerLockUndoAction::redo( ) throw (UndoFailedException, RuntimeException) + { + if ( m_bUndoIsUnlock ) + m_xModel->lockControllers(); + else + m_xModel->unlockControllers(); + } +} + //________________________________________________________________________________________________________ // frame::XModel //________________________________________________________________________________________________________ @@ -1190,6 +1248,14 @@ void SAL_CALL SfxBaseModel::lockControllers() throw(::com::sun::star::uno::Runti SfxModelGuard aGuard( *this ); ++m_pData->m_nControllerLockCount ; + + if ( m_pData->m_pDocumentUndoManager.is() + && m_pData->m_pDocumentUndoManager->isInContext() + && !m_pData->m_pDocumentUndoManager->isLocked() + ) + { + m_pData->m_pDocumentUndoManager->addUndoAction( new ControllerLockUndoAction( this, true ) ); + } } //________________________________________________________________________________________________________ @@ -1201,6 +1267,14 @@ void SAL_CALL SfxBaseModel::unlockControllers() throw(::com::sun::star::uno::Run SfxModelGuard aGuard( *this ); --m_pData->m_nControllerLockCount ; + + if ( m_pData->m_pDocumentUndoManager.is() + && m_pData->m_pDocumentUndoManager->isInContext() + && !m_pData->m_pDocumentUndoManager->isLocked() + ) + { + m_pData->m_pDocumentUndoManager->addUndoAction( new ControllerLockUndoAction( this, false ) ); + } } //________________________________________________________________________________________________________ @@ -1637,6 +1711,17 @@ void SAL_CALL SfxBaseModel::storeAsURL( const ::rtl::OUString& } //________________________________________________________________________________________________________ +// XUndoManagerSupplier +//________________________________________________________________________________________________________ +Reference< XUndoManager > SAL_CALL SfxBaseModel::getUndoManager( ) throw (RuntimeException) +{ + SfxModelGuard aGuard( *this ); + if ( !m_pData->m_pDocumentUndoManager.is() ) + m_pData->m_pDocumentUndoManager.set( new ::sfx2::DocumentUndoManager( *this ) ); + return m_pData->m_pDocumentUndoManager.get(); +} + +//________________________________________________________________________________________________________ // XStorable //________________________________________________________________________________________________________ @@ -4310,3 +4395,16 @@ throw (uno::RuntimeException, lang::IllegalArgumentException, return xDMA->storeMetadataToMedium(i_rMedium); } +// ===================================================================================================================== +// = SfxModelSubComponent +// ===================================================================================================================== + +SfxModelSubComponent::~SfxModelSubComponent() +{ +} + +void SfxModelSubComponent::disposing() +{ + // nothing to do here +} + diff --git a/sfx2/source/inc/appdata.hxx b/sfx2/source/inc/appdata.hxx index bd12f3db80dc..1b3a943c4690 100644 --- a/sfx2/source/inc/appdata.hxx +++ b/sfx2/source/inc/appdata.hxx @@ -116,7 +116,6 @@ public: // global pointers SfxItemPool* pPool; - SfxEventConfiguration* pEventConfig; SvUShorts* pDisabledSlotList; SvStrings* pSecureURLs; SvtSaveOptions* pSaveOptions; @@ -129,7 +128,6 @@ public: USHORT nDocModalMode; // counts documents in modal mode USHORT nAutoTabPageId; - USHORT nBasicCallLevel; USHORT nRescheduleLocks; USHORT nInReschedule; USHORT nAsynchronCalls; diff --git a/sfx2/source/inc/docundomanager.hxx b/sfx2/source/inc/docundomanager.hxx new file mode 100755 index 000000000000..9b37671662fd --- /dev/null +++ b/sfx2/source/inc/docundomanager.hxx @@ -0,0 +1,116 @@ +/************************************************************************* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef DOCUMENT_UNDO_MANAGER_HXX +#define DOCUMENT_UNDO_MANAGER_HXX + +#include "sfx2/sfxbasemodel.hxx" + +/** === begin UNO includes === **/ +#include <com/sun/star/document/XUndoManager.hpp> +/** === end UNO includes === **/ + +#include <cppuhelper/implbase1.hxx> + +#include <boost/scoped_ptr.hpp> +#include <boost/noncopyable.hpp> + +namespace svl +{ + class IUndoManager; +} + +//...................................................................................................................... +namespace sfx2 +{ +//...................................................................................................................... + + //================================================================================================================== + //= DocumentUndoManager + //================================================================================================================== + typedef ::cppu::ImplHelper1 < ::com::sun::star::document::XUndoManager + > DocumentUndoManager_Base; + struct DocumentUndoManager_Impl; + class DocumentUndoManager :public DocumentUndoManager_Base + ,public SfxModelSubComponent + ,public ::boost::noncopyable + { + friend struct DocumentUndoManager_Impl; + + public: + DocumentUndoManager( SfxBaseModel& i_document ); + virtual ~DocumentUndoManager(); + + // SfxModelSubComponent overridables + virtual void disposing(); + + // non-UNO API for our owner + /** determines whether we have an open Undo context. No mutex locking within this method, no disposal check - this + is the responsibility of the owner. + */ + bool isInContext() const; + + // XInterface + virtual void SAL_CALL acquire( ) throw (); + virtual void SAL_CALL release( ) throw (); + + // XUndoManager + virtual void SAL_CALL enterUndoContext( const ::rtl::OUString& i_title ) throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL enterHiddenUndoContext( ) throw (::com::sun::star::document::EmptyUndoStackException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL leaveUndoContext( ) throw (::com::sun::star::util::InvalidStateException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL addUndoAction( const ::com::sun::star::uno::Reference< ::com::sun::star::document::XUndoAction >& i_action ) throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL undo( ) throw (::com::sun::star::document::EmptyUndoStackException, ::com::sun::star::document::UndoContextNotClosedException, ::com::sun::star::document::UndoFailedException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL redo( ) throw (::com::sun::star::document::EmptyUndoStackException, ::com::sun::star::document::UndoContextNotClosedException, ::com::sun::star::document::UndoFailedException, ::com::sun::star::uno::RuntimeException); + virtual ::sal_Bool SAL_CALL isUndoPossible( ) throw (::com::sun::star::uno::RuntimeException); + virtual ::sal_Bool SAL_CALL isRedoPossible( ) throw (::com::sun::star::uno::RuntimeException); + virtual ::rtl::OUString SAL_CALL getCurrentUndoActionTitle( ) throw (::com::sun::star::document::EmptyUndoStackException, ::com::sun::star::uno::RuntimeException); + virtual ::rtl::OUString SAL_CALL getCurrentRedoActionTitle( ) throw (::com::sun::star::document::EmptyUndoStackException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getAllUndoActionTitles( ) throw (::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getAllRedoActionTitles( ) throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL clear( ) throw (::com::sun::star::document::UndoContextNotClosedException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL clearRedo( ) throw (::com::sun::star::document::UndoContextNotClosedException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL reset( ) throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL addUndoManagerListener( const ::com::sun::star::uno::Reference< ::com::sun::star::document::XUndoManagerListener >& i_listener ) throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL removeUndoManagerListener( const ::com::sun::star::uno::Reference< ::com::sun::star::document::XUndoManagerListener >& i_listener ) throw (::com::sun::star::uno::RuntimeException); + + // XLockable, base of XUndoManager + virtual void SAL_CALL lock( ) throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL unlock( ) throw (::com::sun::star::util::NotLockedException, ::com::sun::star::uno::RuntimeException); + virtual ::sal_Bool SAL_CALL isLocked( ) throw (::com::sun::star::uno::RuntimeException); + + // XChild, base of XUndoManager + virtual ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL getParent( ) throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL setParent( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& Parent ) throw (::com::sun::star::lang::NoSupportException, ::com::sun::star::uno::RuntimeException); + + private: + ::boost::scoped_ptr< DocumentUndoManager_Impl > m_pImpl; + }; + +//...................................................................................................................... +} // namespace sfx2 +//...................................................................................................................... + +#endif // DOCUMENT_UNDO_MANAGER_HXX diff --git a/sfx2/source/inc/eventsupplier.hxx b/sfx2/source/inc/eventsupplier.hxx index e012eea39c2d..83ed69ccb78e 100644 --- a/sfx2/source/inc/eventsupplier.hxx +++ b/sfx2/source/inc/eventsupplier.hxx @@ -57,6 +57,11 @@ #include <svl/lstner.hxx> #include <unotools/eventcfg.hxx> +namespace comphelper +{ + class NamedValueCollection; +} + //-------------------------------------------------------------------------------------------------------- #define NOSUCHELEMENTEXCEPTION ::com::sun::star::container::NoSuchElementException @@ -125,8 +130,12 @@ public: virtual void SAL_CALL disposing( const EVENTOBJECT& Source ) throw( RUNTIMEEXCEPTION ); - static SvxMacro* ConvertToMacro( const ANY& rElement, SfxObjectShell* pDoc, BOOL bBlowUp ); - static void BlowUpMacro( const ANY& rIn, ANY& rOut, SfxObjectShell* pDoc ); + static SvxMacro* ConvertToMacro( const ANY& rElement, SfxObjectShell* pDoc, BOOL bNormalizeMacro ); + static void NormalizeMacro( const ANY& rIn, ANY& rOut, SfxObjectShell* pDoc ); + static void NormalizeMacro( + const ::comphelper::NamedValueCollection& i_eventDescriptor, + ::comphelper::NamedValueCollection& o_normalizedDescriptor, + SfxObjectShell* i_document ); }; //============================================================================= diff --git a/sfx2/source/menu/mnuitem.cxx b/sfx2/source/menu/mnuitem.cxx index 281b451d8098..6c62bc1fa88f 100644 --- a/sfx2/source/menu/mnuitem.cxx +++ b/sfx2/source/menu/mnuitem.cxx @@ -64,7 +64,6 @@ #include <sfx2/dispatch.hxx> #include "idpool.hxx" #include "sfxtypes.hxx" -#include <sfx2/macrconf.hxx> #include "virtmenu.hxx" #include <sfx2/mnuitem.hxx> #include <sfx2/tbxctrl.hxx> @@ -232,8 +231,6 @@ SfxMenuControl::SfxMenuControl(USHORT nSlotId, SfxBindings& rBindings): SfxMenuControl::~SfxMenuControl() { - if ( SfxMacroConfig::IsMacroSlot( GetId() ) ) - SFX_APP()->GetMacroConfig()->ReleaseSlotId(GetId()); delete pSubMenu; } diff --git a/sfx2/source/menu/mnumgr.cxx b/sfx2/source/menu/mnumgr.cxx index b3e5717dd7b6..dfad7e1a7132 100755 --- a/sfx2/source/menu/mnumgr.cxx +++ b/sfx2/source/menu/mnumgr.cxx @@ -77,7 +77,6 @@ #include <sfx2/bindings.hxx> #include "mnucfga.hxx" #include "sfxresid.hxx" -#include <sfx2/macrconf.hxx> #include <sfx2/msgpool.hxx> #include <sfx2/sfx.hrc> #include "menu.hrc" diff --git a/sfx2/source/menu/virtmenu.cxx b/sfx2/source/menu/virtmenu.cxx index 48ff6a3948c5..fd8da1c11e8a 100644 --- a/sfx2/source/menu/virtmenu.cxx +++ b/sfx2/source/menu/virtmenu.cxx @@ -59,7 +59,6 @@ #include <sfx2/sfx.hrc> #include <sfx2/viewsh.hxx> #include "sfxpicklist.hxx" -#include <sfx2/macrconf.hxx> #include "sfxresid.hxx" #include "menu.hrc" #include "imagemgr.hxx" @@ -481,24 +480,6 @@ void SfxVirtualMenu::CreateFromSVMenu() { SfxMenuControl *pMnuCtrl=0; String aCmd( pSVMenu->GetItemCommand( nSlotId ) ); - if ( aCmd.CompareToAscii("slot:", 5) == 0 ) - { - SfxMacroConfig* pCfg = SFX_APP()->GetMacroConfig(); - if ( pCfg->IsMacroSlot( nSlotId ) ) - { - if ( pCfg->GetMacroInfo( nSlotId ) ) - { - pCfg->RegisterSlotId( nSlotId ); - pSVMenu->SetItemCommand( nSlotId, String() ); - aCmd.Erase(); - } - else - { - pSVMenu->SetItemCommand( nSlotId, String::CreateFromAscii("macro:///macro.not.founc") ); - } - } - } - if ( aCmd.Len() && (( nSlotId < SID_SFX_START ) || ( nSlotId > SHRT_MAX )) ) { // try to create control via comand name diff --git a/sfx2/source/notify/eventsupplier.cxx b/sfx2/source/notify/eventsupplier.cxx index 32e6887f802c..e37f66ee6f20 100644 --- a/sfx2/source/notify/eventsupplier.cxx +++ b/sfx2/source/notify/eventsupplier.cxx @@ -48,6 +48,7 @@ #include <unotools/securityoptions.hxx> #include <comphelper/processfactory.hxx> +#include <comphelper/namedvaluecollection.hxx> #include "eventsupplier.hxx" #include <sfx2/app.hxx> @@ -88,9 +89,9 @@ void SAL_CALL SfxEvents_Impl::replaceByName( const OUSTRING & aName, const ANY & { if ( maEventNames[i] == aName ) { - Sequence< PropertyValue > aProperties; + const ::comphelper::NamedValueCollection aEventDescriptor( rElement ); // check for correct type of the element - if ( rElement.hasValue() && !( rElement >>= aProperties ) ) + if ( rElement.hasValue() && aEventDescriptor.empty() ) throw ILLEGALARGUMENTEXCEPTION(); // create Configuration at first, creation might call this method also and that would overwrite everything @@ -98,31 +99,27 @@ void SAL_CALL SfxEvents_Impl::replaceByName( const OUSTRING & aName, const ANY & if ( mpObjShell && !mpObjShell->IsLoading() ) mpObjShell->SetModified( TRUE ); - if ( aProperties.getLength() ) + ::comphelper::NamedValueCollection aNormalizedDescriptor; + NormalizeMacro( aEventDescriptor, aNormalizedDescriptor, mpObjShell ); + + ::rtl::OUString sType; + if ( ( aNormalizedDescriptor.size() == 1 ) + && ( aNormalizedDescriptor.has( PROP_EVENT_TYPE ) == 0 ) + && ( aNormalizedDescriptor.get( PROP_EVENT_TYPE ) >>= sType ) + && ( sType.getLength() == 0 ) + ) { - // "normalize" the macro descriptor - ANY aValue; - BlowUpMacro( rElement, aValue, mpObjShell ); - aValue >>= aProperties; - - ::rtl::OUString sType; - if ( ( aProperties.getLength() == 1 ) - && ( aProperties[0].Name.compareToAscii( PROP_EVENT_TYPE ) == 0 ) - && ( aProperties[0].Value >>= sType ) - && ( sType.getLength() == 0 ) - ) - { - // An empty event type means no binding. Therefore reset data - // to reflect that state. - // (that's for compatibility only. Nowadays, the Tools/Customize dialog should - // set an empty sequence to indicate the request for resetting the assignment.) - aProperties.realloc( 0 ); - } + // An empty event type means no binding. Therefore reset data + // to reflect that state. + // (that's for compatibility only. Nowadays, the Tools/Customize dialog should + // set an empty sequence to indicate the request for resetting the assignment.) + OSL_ENSURE( false, "legacy event assignment format detected" ); + aNormalizedDescriptor.clear(); } - if ( aProperties.getLength() ) + if ( !aNormalizedDescriptor.empty() ) { - maEventData[i] = makeAny( aProperties ); + maEventData[i] <<= aNormalizedDescriptor.getPropertyValues(); } else { @@ -378,13 +375,13 @@ SfxEvents_Impl::~SfxEvents_Impl() } //-------------------------------------------------------------------------------------------------------- -SvxMacro* SfxEvents_Impl::ConvertToMacro( const ANY& rElement, SfxObjectShell* pObjShell, BOOL bBlowUp ) +SvxMacro* SfxEvents_Impl::ConvertToMacro( const ANY& rElement, SfxObjectShell* pObjShell, BOOL bNormalizeMacro ) { SvxMacro* pMacro = NULL; SEQUENCE < PROPERTYVALUE > aProperties; ANY aAny; - if ( bBlowUp ) - BlowUpMacro( rElement, aAny, pObjShell ); + if ( bNormalizeMacro ) + NormalizeMacro( rElement, aAny, pObjShell ); else aAny = rElement; @@ -444,58 +441,38 @@ SvxMacro* SfxEvents_Impl::ConvertToMacro( const ANY& rElement, SfxObjectShell* p return pMacro; } -void SfxEvents_Impl::BlowUpMacro( const ANY& rEvent, ANY& rRet, SfxObjectShell* pDoc ) +void SfxEvents_Impl::NormalizeMacro( const ANY& rEvent, ANY& rRet, SfxObjectShell* pDoc ) { - if ( !pDoc ) - pDoc = SfxObjectShell::Current(); - - SEQUENCE < PROPERTYVALUE > aInProps; - SEQUENCE < PROPERTYVALUE > aOutProps(2); - - if ( !( rEvent >>= aInProps ) ) - return; + const ::comphelper::NamedValueCollection aEventDescriptor( rEvent ); + ::comphelper::NamedValueCollection aEventDescriptorOut; - sal_Int32 nCount = aInProps.getLength(); + NormalizeMacro( aEventDescriptor, aEventDescriptorOut, pDoc ); - if ( !nCount ) - return; + rRet <<= aEventDescriptorOut.getPropertyValues(); +} - OUSTRING aType; - OUSTRING aScript; - OUSTRING aLibrary; - OUSTRING aMacroName; +void SfxEvents_Impl::NormalizeMacro( const ::comphelper::NamedValueCollection& i_eventDescriptor, + ::comphelper::NamedValueCollection& o_normalizedDescriptor, SfxObjectShell* i_document ) +{ + SfxObjectShell* pDoc = i_document; + if ( !pDoc ) + pDoc = SfxObjectShell::Current(); - sal_Int32 nIndex = 0; + ::rtl::OUString aType = i_eventDescriptor.getOrDefault( PROP_EVENT_TYPE, ::rtl::OUString() ); + ::rtl::OUString aScript = i_eventDescriptor.getOrDefault( PROP_SCRIPT, ::rtl::OUString() ); + ::rtl::OUString aLibrary = i_eventDescriptor.getOrDefault( PROP_LIBRARY, ::rtl::OUString() ); + ::rtl::OUString aMacroName = i_eventDescriptor.getOrDefault( PROP_MACRO_NAME, ::rtl::OUString() ); - while ( nIndex < nCount ) - { - if ( aInProps[ nIndex ].Name.compareToAscii( PROP_EVENT_TYPE ) == 0 ) - { - aInProps[nIndex].Value >>= aType; - aOutProps[0] = aInProps[nIndex]; - } - else if ( aInProps[ nIndex ].Name.compareToAscii( PROP_SCRIPT ) == 0 ) - { - aInProps[nIndex].Value >>= aScript; - aOutProps[1] = aInProps[nIndex]; - } - else if ( aInProps[ nIndex ].Name.compareToAscii( PROP_LIBRARY ) == 0 ) - { - aInProps[ nIndex ].Value >>= aLibrary; - } - else if ( aInProps[ nIndex ].Name.compareToAscii( PROP_MACRO_NAME ) == 0 ) - { - aInProps[ nIndex ].Value >>= aMacroName; - } - nIndex += 1; - } + if ( aType.getLength() ) + o_normalizedDescriptor.put( PROP_EVENT_TYPE, aType ); + if ( aScript.getLength() ) + o_normalizedDescriptor.put( PROP_SCRIPT, aScript ); if ( aType.compareToAscii( STAR_BASIC ) == 0 ) { - aOutProps.realloc(4); if ( aScript.getLength() ) { - if( ! aMacroName.getLength() || ! aLibrary.getLength() ) + if ( !aMacroName.getLength() || !aLibrary.getLength() ) { sal_Int32 nHashPos = aScript.indexOf( '/', 8 ); sal_Int32 nArgsPos = aScript.indexOf( '(' ); @@ -542,22 +519,9 @@ void SfxEvents_Impl::BlowUpMacro( const ANY& rEvent, ANY& rRet, SfxObjectShell* aLibrary = String::CreateFromAscii("application"); } - aOutProps[1].Name = OUSTRING::createFromAscii( PROP_SCRIPT ); - aOutProps[1].Value <<= aScript; - aOutProps[2].Name = OUSTRING::createFromAscii( PROP_LIBRARY ); - aOutProps[2].Value <<= aLibrary; - aOutProps[3].Name = OUSTRING::createFromAscii( PROP_MACRO_NAME ); - aOutProps[3].Value <<= aMacroName; - rRet <<= aOutProps; - } - else if ( aType.compareToAscii( SVX_MACRO_LANGUAGE_JAVASCRIPT ) == 0 ) - { - aOutProps[1] = aInProps[1]; - rRet <<= aOutProps; - } - else - { - rRet <<= aOutProps; + o_normalizedDescriptor.put( PROP_SCRIPT, aScript ); + o_normalizedDescriptor.put( PROP_LIBRARY, aLibrary ); + o_normalizedDescriptor.put( PROP_MACRO_NAME, aMacroName ); } } diff --git a/sfx2/source/toolbox/tbxitem.cxx b/sfx2/source/toolbox/tbxitem.cxx index f5b38d5a8a18..dc4527665471 100644 --- a/sfx2/source/toolbox/tbxitem.cxx +++ b/sfx2/source/toolbox/tbxitem.cxx @@ -90,7 +90,6 @@ #include <sfx2/viewfrm.hxx> #include "arrdecl.hxx" #include "sfxtypes.hxx" -#include <sfx2/macrconf.hxx> #include <sfx2/genlink.hxx> #include "sfxresid.hxx" #include <sfx2/sfx.hrc> diff --git a/sfx2/source/view/viewfrm.cxx b/sfx2/source/view/viewfrm.cxx index 6222721d9b83..8e63753b00b5 100644 --- a/sfx2/source/view/viewfrm.cxx +++ b/sfx2/source/view/viewfrm.cxx @@ -960,7 +960,7 @@ void SfxViewFrame::ExecHistory_Impl( SfxRequest &rReq ) { // gibt es an der obersten Shell einen Undo-Manager? SfxShell *pSh = GetDispatcher()->GetShell(0); - SfxUndoManager* pShUndoMgr = pSh->GetUndoManager(); + ::svl::IUndoManager* pShUndoMgr = pSh->GetUndoManager(); sal_Bool bOK = sal_False; if ( pShUndoMgr ) { @@ -972,20 +972,20 @@ void SfxViewFrame::ExecHistory_Impl( SfxRequest &rReq ) break; case SID_UNDO: - pShUndoMgr->Undo(0); + pShUndoMgr->Undo(); GetBindings().InvalidateAll(sal_False); bOK = sal_True; break; case SID_REDO: - pShUndoMgr->Redo(0); + pShUndoMgr->Redo(); GetBindings().InvalidateAll(sal_False); bOK = sal_True; break; case SID_REPEAT: if ( pSh->GetRepeatTarget() ) - pShUndoMgr->Repeat( *pSh->GetRepeatTarget(), 0); + pShUndoMgr->Repeat( *pSh->GetRepeatTarget() ); bOK = sal_True; break; } @@ -1011,7 +1011,7 @@ void SfxViewFrame::StateHistory_Impl( SfxItemSet &rSet ) // Ich bin gerade am Reloaden und Yielde so vor mich hin ... return; - SfxUndoManager *pShUndoMgr = pSh->GetUndoManager(); + ::svl::IUndoManager *pShUndoMgr = pSh->GetUndoManager(); if ( !pShUndoMgr ) { // der SW hat eigenes Undo an der View @@ -1047,10 +1047,10 @@ void SfxViewFrame::StateHistory_Impl( SfxItemSet &rSet ) rSet.DisableItem( SID_REDO ); SfxRepeatTarget *pTarget = pSh->GetRepeatTarget(); if ( pShUndoMgr && pTarget && pShUndoMgr->GetRepeatActionCount() && - pShUndoMgr->CanRepeat(*pTarget, 0) ) + pShUndoMgr->CanRepeat(*pTarget) ) { String aTmp( SfxResId(STR_REPEAT) ); - aTmp += pShUndoMgr->GetRepeatActionComment(*pTarget, 0); + aTmp += pShUndoMgr->GetRepeatActionComment(*pTarget); rSet.Put( SfxStringItem( SID_REPEAT, aTmp ) ); } else @@ -2883,8 +2883,6 @@ void SfxViewFrame::AddDispatchMacroToBasic_Impl( const ::rtl::OUString& sMacro ) } } - pSfxApp->EnterBasicCall(); - BasicManager* pBasMgr = 0; if ( aLocation.EqualsIgnoreCaseAscii( "application" ) ) { @@ -3017,19 +3015,11 @@ void SfxViewFrame::AddDispatchMacroToBasic_Impl( const ::rtl::OUString& sMacro ) } } } - - pSfxApp->LeaveBasicCall(); } else { // add code for "session only" macro } - - /* - FILE* pFile = fopen( "macro.bas", "a" ); - fprintf( pFile, "%s", ::rtl::OUStringToOString(sBuffer.makeStringAndClear(),RTL_TEXTENCODING_UTF8).getStr() ); - fclose ( pFile ); - */ } void SfxViewFrame::MiscExec_Impl( SfxRequest& rReq ) diff --git a/svx/inc/svx/svdmodel.hxx b/svx/inc/svx/svdmodel.hxx index b1bb7d74887f..21e9b5c5a05f 100644 --- a/svx/inc/svx/svdmodel.hxx +++ b/svx/inc/svx/svdmodel.hxx @@ -632,6 +632,7 @@ public: /** application can set it's own undo manager, BegUndo, EndUndo and AddUndoAction calls are routet to this interface if given */ void SetSdrUndoManager( SfxUndoManager* pUndoManager ); + SfxUndoManager* GetSdrUndoManager() const; /** applications can set their own undo factory to overide creation of undo actions. The SdrModel will become owner of the given SdrUndoFactory diff --git a/svx/source/form/fmscriptingenv.cxx b/svx/source/form/fmscriptingenv.cxx index 154999333296..f351dba85815 100644 --- a/svx/source/form/fmscriptingenv.cxx +++ b/svx/source/form/fmscriptingenv.cxx @@ -28,7 +28,7 @@ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_svx.hxx" #include "fmscriptingenv.hxx" -#include <svx/fmmodel.hxx> +#include "svx/fmmodel.hxx" /** === begin UNO includes === **/ #include <com/sun/star/lang/IllegalArgumentException.hpp> @@ -37,6 +37,7 @@ #include <com/sun/star/reflection/XInterfaceMethodTypeDescription.hpp> #include <com/sun/star/lang/DisposedException.hpp> /** === end UNO includes === **/ + #include <tools/diagnose_ex.h> #include <cppuhelper/implbase1.hxx> #include <comphelper/implementationreference.hxx> @@ -45,6 +46,8 @@ #include <vcl/svapp.hxx> #include <vos/mutex.hxx> #include <sfx2/objsh.hxx> +#include <sfx2/app.hxx> +#include <basic/basmgr.hxx> #include <boost/shared_ptr.hpp> @@ -416,60 +419,6 @@ namespace svxform m_rObjectShell.CallXScript( m_sScriptCode, _rArguments, _rSynchronousResult, aOutArgsIndex, aOutArgs ); } - - //................................................................ - //. QualifiedBasicScript - //................................................................ - class QualifiedBasicScript : public IScript - { - SfxObjectShell& m_rObjectShell; - const ::rtl::OUString m_sMacroLocation; - const ::rtl::OUString m_sScriptCode; - - public: - QualifiedBasicScript( SfxObjectShell& _rObjectShell, const ::rtl::OUString& _rLocation, const ::rtl::OUString& _rScriptCode ) - :m_rObjectShell( _rObjectShell ) - ,m_sMacroLocation( _rLocation ) - ,m_sScriptCode( _rScriptCode ) - { - } - - // IScript - virtual void invoke( const Sequence< Any >& _rArguments, Any& _rSynchronousResult ); - }; - - //................................................................ - void QualifiedBasicScript::invoke( const Sequence< Any >& _rArguments, Any& _rSynchronousResult ) - { - m_rObjectShell.CallStarBasicScript( m_sScriptCode, m_sMacroLocation, - &_rArguments, &_rSynchronousResult ); - } - - //................................................................ - //. UnqualifiedBasicScript - //................................................................ - class UnqualifiedBasicScript : public IScript - { - SfxObjectShell& m_rObjectShell; - const ::rtl::OUString m_sScriptCode; - - public: - UnqualifiedBasicScript( SfxObjectShell& _rObjectShell, const ::rtl::OUString& _rScriptCode ) - :m_rObjectShell( _rObjectShell ) - ,m_sScriptCode( _rScriptCode ) - { - } - - // IScript - virtual void invoke( const Sequence< Any >& _rArguments, Any& _rSynchronousResult ); - }; - - //................................................................ - void UnqualifiedBasicScript::invoke( const Sequence< Any >& _rArguments, Any& _rSynchronousResult ) - { - m_rObjectShell.CallScript( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "StarBasic" ) ), m_sScriptCode, - &_rArguments, &_rSynchronousResult ); - } } //-------------------------------------------------------------------- @@ -513,14 +462,24 @@ namespace svxform sScriptCode = sScriptCode.copy( nPrefixLen + 1 ); } - if ( sMacroLocation.getLength() ) - { // we have a StarBasic macro with fully-qualified macro location - pScript.reset( new QualifiedBasicScript( *xObjectShell, sMacroLocation, sScriptCode ) ); - } - else - { // we have a StarBasic macro without qualified location - let the object shell gues .... - pScript.reset( new UnqualifiedBasicScript( *xObjectShell, sScriptCode ) ); + if ( !sMacroLocation.getLength() ) + { + // legacy format: use the app-wide Basic, if it has a respective method, otherwise fall back to the doc's Basic + if ( SFX_APP()->GetBasicManager()->HasMacro( sScriptCode ) ) + sMacroLocation = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "application" ) ); + else + sMacroLocation = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "document" ) ); } + + ::rtl::OUStringBuffer aScriptURI; + aScriptURI.appendAscii( "vnd.sun.star.script:" ); + aScriptURI.append( sScriptCode ); + aScriptURI.appendAscii( "?language=Basic" ); + aScriptURI.appendAscii( "&location=" ); + aScriptURI.append( sMacroLocation ); + + const ::rtl::OUString sScriptURI( aScriptURI.makeStringAndClear() ); + pScript.reset( new NewStyleUNOScript( *xObjectShell, sScriptURI ) ); } OSL_ENSURE( pScript.get(), "FormScriptingEnvironment::doFireScriptEvent: no script to execute!" ); diff --git a/svx/source/form/fmview.cxx b/svx/source/form/fmview.cxx index 22681d511b82..71eed4a0c60e 100644 --- a/svx/source/form/fmview.cxx +++ b/svx/source/form/fmview.cxx @@ -46,7 +46,6 @@ #include <sfx2/bindings.hxx> #include <sfx2/dispatch.hxx> #include <basic/sbuno.hxx> -#include <sfx2/macrconf.hxx> #include <basic/sbx.hxx> #include "fmitems.hxx" #include "fmobj.hxx" diff --git a/svx/source/form/formcontroller.cxx b/svx/source/form/formcontroller.cxx index f43233ae08ba..74d8e98e405d 100644 --- a/svx/source/form/formcontroller.cxx +++ b/svx/source/form/formcontroller.cxx @@ -81,7 +81,7 @@ #include <comphelper/property.hxx> #include <comphelper/sequence.hxx> #include <comphelper/uno3.hxx> -#include <comphelper/scopeguard.hxx> +#include <comphelper/flagguard.hxx> #include <cppuhelper/queryinterface.hxx> #include <cppuhelper/typeprovider.hxx> #include <toolkit/controls/unocontrol.hxx> diff --git a/svx/source/svdraw/svdmodel.cxx b/svx/source/svdraw/svdmodel.cxx index 8ab385fa329c..2f268db7910b 100644 --- a/svx/source/svdraw/svdmodel.cxx +++ b/svx/source/svdraw/svdmodel.cxx @@ -2113,6 +2113,11 @@ void SdrModel::SetSdrUndoManager( SfxUndoManager* pUndoManager ) mpImpl->mpUndoManager = pUndoManager; } +SfxUndoManager* SdrModel::GetSdrUndoManager() const +{ + return mpImpl->mpUndoManager; +} + SdrUndoFactory& SdrModel::GetSdrUndoFactory() const { if( !mpImpl->mpUndoFactory ) diff --git a/svx/source/unodraw/unopage.cxx b/svx/source/unodraw/unopage.cxx index 9d5e1695c5cb..61d92f1c8caf 100644 --- a/svx/source/unodraw/unopage.cxx +++ b/svx/source/unodraw/unopage.cxx @@ -58,6 +58,7 @@ #include <svx/extrud3d.hxx> #include <svx/lathe3d.hxx> #include <vcl/svapp.hxx> +#include <tools/diagnose_ex.h> using ::rtl::OUString; using namespace ::vos; @@ -306,7 +307,7 @@ void SAL_CALL SvxDrawPage::add( const uno::Reference< drawing::XShape >& xShape { OGuard aGuard( Application::GetSolarMutex() ); - if( (mpModel == 0) || (mpPage == 0) ) + if ( ( mpModel == NULL ) || ( mpPage == NULL ) ) throw lang::DisposedException(); SvxShape* pShape = SvxShape::getImplementation( xShape ); @@ -319,6 +320,7 @@ void SAL_CALL SvxDrawPage::add( const uno::Reference< drawing::XShape >& xShape if(!pObj) { pObj = CreateSdrObject( xShape ); + ENSURE_OR_RETURN_VOID( pObj != NULL, "SvxDrawPage::add: no SdrObject was created!" ); } else if ( !pObj->IsInserted() ) { @@ -326,14 +328,10 @@ void SAL_CALL SvxDrawPage::add( const uno::Reference< drawing::XShape >& xShape mpPage->InsertObject( pObj ); } - if(pObj == NULL) - return; - - if(pShape) - pShape->Create( pObj, this ); + pShape->Create( pObj, this ); + OSL_ENSURE( pShape->GetSdrObject() == pObj, "SvxDrawPage::add: shape does not know about its newly created SdrObject!" ); - if( mpModel ) - mpModel->SetChanged(); + mpModel->SetChanged(); } //---------------------------------------------------------------------- diff --git a/svx/source/unodraw/unoshape.cxx b/svx/source/unodraw/unoshape.cxx index afb8cbb8723a..b48a703c0964 100644 --- a/svx/source/unodraw/unoshape.cxx +++ b/svx/source/unodraw/unoshape.cxx @@ -147,7 +147,7 @@ struct SvxShapeImpl * SdrObject so a multiple call to SvxShape::Create() with same SdrObject * is prohibited. */ - SdrObject* mpCreatedObj; + ::tools::WeakReference< SdrObject > mpCreatedObj; // for xComponent ::cppu::OInterfaceContainerHelper maDisposeListeners; @@ -160,7 +160,7 @@ struct SvxShapeImpl ,mpMaster( NULL ) ,mbHasSdrObjectOwnership( false ) ,mbDisposing( false ) - ,mpCreatedObj( NULL ) + ,mpCreatedObj() ,maDisposeListeners( _rMutex ) ,maPropertyNotifier( _rAntiImpl, _rMutex ) { @@ -468,11 +468,12 @@ void SvxShape::Create( SdrObject* pNewObj, SvxDrawPage* /*pNewPage*/ ) if ( !pNewObj ) return; - OSL_ENSURE( ( mpImpl->mpCreatedObj == NULL ) || ( mpImpl->mpCreatedObj == pNewObj ), + SdrObject* pCreatedObj = mpImpl->mpCreatedObj.get(); + OSL_ENSURE( ( pCreatedObj == NULL ) || ( pCreatedObj == pNewObj ), "SvxShape::Create: the same shape used for two different objects?! Strange ..." ); // --> CL, OD 2005-07-19 #i52126# - correct condition - if ( mpImpl->mpCreatedObj != pNewObj ) + if ( pCreatedObj != pNewObj ) // <-- { DBG_ASSERT( pNewObj->GetModel(), "no model for SdrObject?" ); |