diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-27 16:51:28 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-27 16:51:28 +0000 |
commit | 940b4d1848e8c70ab7642901a68594e8016caffc (patch) | |
tree | eb72f344ee6c3d9b80a7ecc079ea79e9fba8676d /include/framework | |
parent | Initial commit. (diff) | |
download | libreoffice-940b4d1848e8c70ab7642901a68594e8016caffc.tar.xz libreoffice-940b4d1848e8c70ab7642901a68594e8016caffc.zip |
Adding upstream version 1:7.0.4.upstream/1%7.0.4upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to '')
-rw-r--r-- | include/framework/ContextChangeEventMultiplexerTunnel.hxx | 28 | ||||
-rw-r--r-- | include/framework/actiontriggerhelper.hxx | 69 | ||||
-rw-r--r-- | include/framework/addonsoptions.hxx | 264 | ||||
-rw-r--r-- | include/framework/configimporter.hxx | 49 | ||||
-rw-r--r-- | include/framework/dispatchhelper.hxx | 123 | ||||
-rw-r--r-- | include/framework/documentundoguard.hxx | 61 | ||||
-rw-r--r-- | include/framework/framelistanalyzer.hxx | 204 | ||||
-rw-r--r-- | include/framework/fwedllapi.h | 34 | ||||
-rw-r--r-- | include/framework/imutex.hxx | 43 | ||||
-rw-r--r-- | include/framework/interaction.hxx | 92 | ||||
-rw-r--r-- | include/framework/sfxhelperfunctions.hxx | 91 | ||||
-rw-r--r-- | include/framework/titlehelper.hxx | 197 | ||||
-rw-r--r-- | include/framework/undomanagerhelper.hxx | 162 |
13 files changed, 1417 insertions, 0 deletions
diff --git a/include/framework/ContextChangeEventMultiplexerTunnel.hxx b/include/framework/ContextChangeEventMultiplexerTunnel.hxx new file mode 100644 index 000000000..9fd41166d --- /dev/null +++ b/include/framework/ContextChangeEventMultiplexerTunnel.hxx @@ -0,0 +1,28 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include <framework/fwedllapi.h> +#include <functional> + +#include <com/sun/star/uno/Reference.hxx> + +namespace com::sun::star::ui { class XContextChangeEventListener; } +namespace com::sun::star::uno { class XInterface; } + +namespace framework { + +// this is pretty horrible, don't use it! +FWE_DLLPUBLIC css::uno::Reference<css::ui::XContextChangeEventListener> +GetFirstListenerWith( + css::uno::Reference<css::uno::XInterface> const& xEventFocus, + std::function<bool (css::uno::Reference<css::ui::XContextChangeEventListener> const&)> const& rPredicate); + +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/framework/actiontriggerhelper.hxx b/include/framework/actiontriggerhelper.hxx new file mode 100644 index 000000000..9060fdc3b --- /dev/null +++ b/include/framework/actiontriggerhelper.hxx @@ -0,0 +1,69 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef INCLUDED_FRAMEWORK_ACTIONTRIGGERHELPER_HXX +#define INCLUDED_FRAMEWORK_ACTIONTRIGGERHELPER_HXX + +#include <framework/fwedllapi.h> +#include <com/sun/star/uno/Reference.hxx> + +namespace com::sun::star::container { class XIndexContainer; } +class Menu; + + +namespace framework +{ + class FWE_DLLPUBLIC ActionTriggerHelper + { + public: + // Fills the submitted menu with the structure contained in the second + // parameter rActionTriggerContainer + // @param pNewMenu = must be a valid and empty menu + // @param rActionTriggerContainer = must be an instance of service "com.sun.star.ui.ActionTriggerContainer" + static void + CreateMenuFromActionTriggerContainer( + Menu* pNewMenu, + const css::uno::Reference< css::container::XIndexContainer >& rActionTriggerContainer ); + + // Creates a "css::ui::ActionTriggerContainer" with the structure of the menu + // provided as a parameter. The implementation class stores the menu pointer + // to optimize the time of creation of a menu from an actiontrigger structure. + // IMPORTANT: The caller must ensure that the menu pointer is valid through the + // life time of the XIndexContainer object!!! + // @param pNewMenu = Must be a valid menu. Please be aware that this implementation is based on + // the above mentioned restriction!!! + + static css::uno::Reference< css::container::XIndexContainer > CreateActionTriggerContainerFromMenu( + const Menu* pMenu, const OUString* pMenuIdentifier ); + + // Fills the submitted rActionTriggerContainer with the structure of the menu + // provided as the second parameter + // @param rActionTriggerContainer = must be an instance of service "com.sun.star.ui.ActionTriggerContainer" + // @param pNewMenu = must be a valid menu + static void + FillActionTriggerContainerFromMenu( + css::uno::Reference< css::container::XIndexContainer > const & rActionTriggerContainer, + const Menu* pMenu ); + + }; +} + +#endif // INCLUDED_FRAMEWORK_ACTIONTRIGGERHELPER_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/framework/addonsoptions.hxx b/include/framework/addonsoptions.hxx new file mode 100644 index 000000000..deb53e2a1 --- /dev/null +++ b/include/framework/addonsoptions.hxx @@ -0,0 +1,264 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +#ifndef INCLUDED_FRAMEWORK_ADDONSOPTIONS_HXX +#define INCLUDED_FRAMEWORK_ADDONSOPTIONS_HXX + +#include <config_options.h> +#include <sal/types.h> +#include <vcl/image.hxx> +#include <com/sun/star/beans/PropertyValue.hpp> +#include <com/sun/star/uno/Sequence.h> +#include <framework/fwedllapi.h> +#include <memory> + +namespace osl { class Mutex; } + +/*-************************************************************************************************************ + @descr The method GetAddonsMenu() returns a list of property values. + Use follow defines to separate values by names. +*//*-*************************************************************************************************************/ +#define ADDONSMENUITEM_STRING_URL "URL" +#define ADDONSMENUITEM_STRING_TITLE "Title" +#define ADDONSMENUITEM_STRING_TARGET "Target" +#define ADDONSMENUITEM_STRING_IMAGEIDENTIFIER "ImageIdentifier" +#define ADDONSMENUITEM_STRING_CONTEXT "Context" +#define ADDONSMENUITEM_STRING_SUBMENU "Submenu" + +#define ADDONSPOPUPMENU_URL_PREFIX_STR "private:menu/Addon" + +namespace framework +{ + +struct FWE_DLLPUBLIC MergeMenuInstruction +{ + OUString aMergePoint; + OUString aMergeCommand; + OUString aMergeCommandParameter; + OUString aMergeFallback; + OUString aMergeContext; + css::uno::Sequence< css::uno::Sequence< css::beans::PropertyValue > > aMergeMenu; +}; +typedef ::std::vector< MergeMenuInstruction > MergeMenuInstructionContainer; + +struct FWE_DLLPUBLIC MergeToolbarInstruction +{ + OUString aMergeToolbar; + OUString aMergePoint; + OUString aMergeCommand; + OUString aMergeCommandParameter; + OUString aMergeFallback; + OUString aMergeContext; + css::uno::Sequence< css::uno::Sequence< css::beans::PropertyValue > > aMergeToolbarItems; +}; + +typedef ::std::vector< MergeToolbarInstruction > MergeToolbarInstructionContainer; + +struct FWE_DLLPUBLIC MergeNotebookBarInstruction +{ + OUString aMergeNotebookBar; + OUString aMergePoint; + OUString aMergeCommand; + OUString aMergeCommandParameter; + OUString aMergeFallback; + OUString aMergeContext; + css::uno::Sequence< css::uno::Sequence< css::beans::PropertyValue > > aMergeNotebookBarItems; +}; + +typedef ::std::vector< MergeNotebookBarInstruction > MergeNotebookBarInstructionContainer; + +struct FWE_DLLPUBLIC MergeStatusbarInstruction +{ + OUString aMergePoint; + OUString aMergeCommand; + OUString aMergeCommandParameter; + OUString aMergeContext; + css::uno::Sequence< css::uno::Sequence< css::beans::PropertyValue > > aMergeStatusbarItems; +}; + +typedef ::std::vector< MergeStatusbarInstruction > MergeStatusbarInstructionContainer; + +/*-************************************************************************************************************ + @short forward declaration to our private date container implementation + @descr We use these class as internal member to support small memory requirements. + You can create the container if it is necessary. The class which use these mechanism + is faster and smaller then a complete implementation! +*//*-*************************************************************************************************************/ + +class AddonsOptions_Impl; + +/*-************************************************************************************************************ + @short collect information about menu features + @devstatus ready to use +*//*-*************************************************************************************************************/ + +class UNLESS_MERGELIBS(FWE_DLLPUBLIC) AddonsOptions +{ + public: + AddonsOptions(); + ~AddonsOptions(); + + /*-**************************************************************************************************** + @short returns if an addons menu is available + @descr Call to retrieve if an addons menu is available + + @return true if there is a menu otherwise false + *//*-*****************************************************************************************************/ + + bool HasAddonsMenu() const; + + /*-**************************************************************************************************** + @short returns number of addons toolbars + @descr Call to retrieve the number of addons toolbars + + @return number of addons toolbars + *//*-*****************************************************************************************************/ + sal_Int32 GetAddonsToolBarCount() const ; + + /*-**************************************************************************************************** + @short returns number of addons notebookbar + @descr Call to retrieve the number of addons notebookbar + + @return number of addons notebookar + *//*-*****************************************************************************************************/ + sal_Int32 GetAddonsNotebookBarCount() const ; + + /*-**************************************************************************************************** + @short returns the complete addons menu + @descr Call it to get all entries of the addon menu. + We return a list of all nodes with its names and properties. + @return A list of menu items is returned. + + @onerror We return an empty list. + *//*-*****************************************************************************************************/ + + const css::uno::Sequence< css::uno::Sequence< css::beans::PropertyValue > >& GetAddonsMenu() const; + + /*-**************************************************************************************************** + @short Gets the menu bar part of all addon components registered + @return A complete + + @onerror We return sal_False + *//*-*****************************************************************************************************/ + + const css::uno::Sequence< css::uno::Sequence< css::beans::PropertyValue > >& GetAddonsMenuBarPart() const; + + /*-**************************************************************************************************** + @short Gets a toolbar part of a single addon + @return A complete + + @onerror We return sal_False + *//*-*****************************************************************************************************/ + + const css::uno::Sequence< css::uno::Sequence< css::beans::PropertyValue > >& GetAddonsToolBarPart( sal_uInt32 nIndex ) const; + + /*-**************************************************************************************************** + @short Gets a unique toolbar resource name of a single addon + @return A complete + + @onerror We return sal_False + *//*-*****************************************************************************************************/ + + OUString GetAddonsToolbarResourceName( sal_uInt32 nIndex ) const; + + /*-**************************************************************************************************** + @short Gets a NotebookBar part of a single addon + @return A complete + + @onerror We return sal_False + *//*-*****************************************************************************************************/ + + const css::uno::Sequence< css::uno::Sequence< css::beans::PropertyValue > >& GetAddonsNotebookBarPart( sal_uInt32 nIndex ) const; + + /*-**************************************************************************************************** + @short Gets a unique NotebookBar resource name of a single addon + @return A complete + + @onerror We return sal_False + *//*-*****************************************************************************************************/ + + OUString GetAddonsNotebookBarResourceName( sal_uInt32 ) const; + + /*-**************************************************************************************************** + @short Retrieves all available merge instructions for the Office menu bar + @return The filled MergeMenuDefinitionContaier + + @onerror We return sal_False + *//*-*****************************************************************************************************/ + + const MergeMenuInstructionContainer& GetMergeMenuInstructions() const; + + /*-**************************************************************************************************** + @short Retrieves all available merge instructions for a single toolbar + @return The filled + + @onerror We return sal_False + *//*-*****************************************************************************************************/ + bool GetMergeToolbarInstructions( const OUString& rToolbarName, MergeToolbarInstructionContainer& rToolbar ) const; + + /*-**************************************************************************************************** + @short Retrieves all available merge instructions for Notebookbar + @return The filled + + @onerror We return sal_False + *//*-*****************************************************************************************************/ + bool GetMergeNotebookBarInstructions( const OUString& rNotebookBarName, MergeNotebookBarInstructionContainer& rNotebookBar ) const; + + /*-**************************************************************************************************** + @short Gets the Add-On help menu part of all addon components registered + @return A complete + + @onerror We return sal_False + *//*-*****************************************************************************************************/ + const css::uno::Sequence< css::uno::Sequence< css::beans::PropertyValue > >& GetAddonsHelpMenu() const; + + const MergeStatusbarInstructionContainer& GetMergeStatusbarInstructions() const; + + /*-**************************************************************************************************** + @short Retrieve an image for a command URL which is defined inside the addon menu configuration + @descr Call it to retrieve an image for a command URL which is defined inside the addon menu configuration + @return An image which was defined in the configuration for the menu item. The image can be empty + no bitmap was defined for the request image properties. + + @onerror An empty image + *//*-*****************************************************************************************************/ + + Image GetImageFromURL( const OUString& aURL, bool bBig, bool bNoScale ) const; + Image GetImageFromURL( const OUString& aURL, bool bBig ) const; + + // private methods + + /*-**************************************************************************************************** + @short return a reference to a static mutex + @descr These class is partially threadsafe (for de-/initialization only). + All access methods aren't safe! + We create a static mutex only for one ime and use at different times. + @return A reference to a static mutex member. + *//*-*****************************************************************************************************/ + + static ::osl::Mutex& GetOwnStaticMutex(); + + private: + std::shared_ptr<AddonsOptions_Impl> m_pImpl; +}; + +} + +#endif // INCLUDED_FRAMEWORK_ADDONSOPTIONS_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/framework/configimporter.hxx b/include/framework/configimporter.hxx new file mode 100644 index 000000000..cb8996b90 --- /dev/null +++ b/include/framework/configimporter.hxx @@ -0,0 +1,49 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef INCLUDED_FRAMEWORK_CONFIGIMPORTER_HXX +#define INCLUDED_FRAMEWORK_CONFIGIMPORTER_HXX + +#include <config_options.h> +#include <framework/fwedllapi.h> +#include <vector> + +namespace com::sun::star::container { class XIndexContainer; } +namespace com::sun::star::embed { class XStorage; } +namespace com::sun::star::ui { class XUIConfigurationManager2; } +namespace com::sun::star::uno { class XComponentContext; } +namespace com::sun::star::uno { template <typename > class Reference; } + +namespace framework +{ + class UNLESS_MERGELIBS(FWE_DLLPUBLIC) UIConfigurationImporterOOo1x + { + public: + static bool ImportCustomToolbars( + const css::uno::Reference< css::ui::XUIConfigurationManager2 >& rContainerFactory, + std::vector< css::uno::Reference< css::container::XIndexContainer > >& rSeqContainer, + const css::uno::Reference< css::uno::XComponentContext >& rxContext, + const css::uno::Reference< css::embed::XStorage >& rToolbarStorage ); + }; + +} // namespace framework + +#endif // INCLUDED_FRAMEWORK_CONFIGIMPORTER_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/framework/dispatchhelper.hxx b/include/framework/dispatchhelper.hxx new file mode 100644 index 000000000..d767b1345 --- /dev/null +++ b/include/framework/dispatchhelper.hxx @@ -0,0 +1,123 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef INCLUDED_FRAMEWORK_INC_SERVICES_DISPATCHHELPER_HXX +#define INCLUDED_FRAMEWORK_INC_SERVICES_DISPATCHHELPER_HXX + +#include <config_options.h> +#include <com/sun/star/frame/XDispatchHelper.hpp> +#include <com/sun/star/frame/XDispatchResultListener.hpp> +#include <com/sun/star/lang/XServiceInfo.hpp> +#include <com/sun/star/uno/Any.hxx> + +#include <cppuhelper/implbase.hxx> +#include <framework/fwedllapi.h> +#include <osl/conditn.hxx> + +namespace com::sun::star::lang +{ +class XMultiServiceFactory; +} +namespace com::sun::star::lang +{ +class XSingleServiceFactory; +} +namespace com::sun::star::uno +{ +class XComponentContext; +} + +namespace framework +{ +/** + @short implements an easy way for dispatches + @descr Dispatches are split into different parts: + - parsing of the URL + - searching for a dispatch object + - dispatching of the URL + All these steps are done inside one method call here. +*/ +class UNLESS_MERGELIBS(FWE_DLLPUBLIC) DispatchHelper final + : public ::cppu::WeakImplHelper<css::lang::XServiceInfo, css::frame::XDispatchHelper, + css::frame::XDispatchResultListener> +{ + // member + +private: + osl::Mutex m_mutex; + + /** global uno service manager. + Can be used to create own needed services. */ + css::uno::Reference<css::uno::XComponentContext> m_xContext; + + /** used to wait for asynchronous listener callbacks. */ + ::osl::Condition m_aBlock; + + css::uno::Any m_aResult; + + css::uno::Reference<css::uno::XInterface> m_xBroadcaster; + + // interface + +public: + // ctor/dtor + + DispatchHelper(const css::uno::Reference<css::uno::XComponentContext>& xContext); + virtual ~DispatchHelper() override; + + // XServiceInfo + virtual OUString SAL_CALL getImplementationName() override; + virtual sal_Bool SAL_CALL supportsService(const OUString& sServiceName) override; + virtual css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override; + + static css::uno::Sequence<OUString> impl_getStaticSupportedServiceNames(); + static OUString impl_getStaticImplementationName(); + // Helper for initialization of service by using own reference! + void impl_initService(); + + // Helper for registry + /// @throws css::uno::Exception + static css::uno::Reference<css::uno::XInterface> SAL_CALL impl_createInstance( + const css::uno::Reference<css::lang::XMultiServiceFactory>& xServiceManager); + static css::uno::Reference<css::lang::XSingleServiceFactory> + impl_createFactory(const css::uno::Reference<css::lang::XMultiServiceFactory>& xServiceManager); + + // XDispatchHelper + virtual css::uno::Any SAL_CALL + executeDispatch(const css::uno::Reference<css::frame::XDispatchProvider>& xDispatchProvider, + const OUString& sURL, const OUString& sTargetFrameName, sal_Int32 nSearchFlags, + const css::uno::Sequence<css::beans::PropertyValue>& lArguments) override; + + // not a public XDispatchHelper-method, need in sfx2/source/control/statcach.cxx for extensions + /// @throws css::uno::RuntimeException + css::uno::Any executeDispatch(const css::uno::Reference<css::frame::XDispatch>& xDispatch, + const css::util::URL& aURL, bool SyncronFlag, + const css::uno::Sequence<css::beans::PropertyValue>& lArguments); + + // XDispatchResultListener + virtual void SAL_CALL dispatchFinished(const css::frame::DispatchResultEvent& aResult) override; + + // XEventListener + virtual void SAL_CALL disposing(const css::lang::EventObject& aEvent) override; +}; +} + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/framework/documentundoguard.hxx b/include/framework/documentundoguard.hxx new file mode 100644 index 000000000..c707257a4 --- /dev/null +++ b/include/framework/documentundoguard.hxx @@ -0,0 +1,61 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef INCLUDED_FRAMEWORK_DOCUMENTUNDOGUARD_HXX +#define INCLUDED_FRAMEWORK_DOCUMENTUNDOGUARD_HXX + +#include <framework/fwedllapi.h> + +#include <com/sun/star/uno/Reference.hxx> + +#include <memory> + +namespace com::sun::star::uno { class XInterface; } + +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="css::document">XUndoManager::leaveUndoContext</member> as are + necessary to restore the manager's initial state. + */ + class FWE_DLLPUBLIC DocumentUndoGuard + { + public: + DocumentUndoGuard( const css::uno::Reference< css::uno::XInterface >& i_undoSupplierComponent ); + ~DocumentUndoGuard(); + + private: + std::unique_ptr< DocumentUndoGuard_Data > m_xData; + }; + + +} // namespace framework + + +#endif // INCLUDED_FRAMEWORK_DOCUMENTUNDOGUARD_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/framework/framelistanalyzer.hxx b/include/framework/framelistanalyzer.hxx new file mode 100644 index 000000000..4e1797dff --- /dev/null +++ b/include/framework/framelistanalyzer.hxx @@ -0,0 +1,204 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef INCLUDED_FRAMEWORK_FRAMELISTANALYZER_HXX +#define INCLUDED_FRAMEWORK_FRAMELISTANALYZER_HXX + +#include <config_options.h> +#include <framework/fwedllapi.h> +#include <o3tl/typed_flags_set.hxx> +#include <com/sun/star/uno/Reference.hxx> + +#include <vector> + +namespace com::sun::star::frame { class XFrame; } +namespace com::sun::star::frame { class XFramesSupplier; } + +/** These enums can be combined as flags to enable/disable + special search algorithm during analyze phase. + see impl_analyze() for further information. + But note: To be usable as flags, these enums + must be values of range [2^n]! */ +enum class FrameAnalyzerFlags +{ + Model = 1, + Help = 2, + BackingComponent = 4, + Hidden = 8, + All = 15, + Zombie = 32768 // use it for special test scenarios only!!! +}; +namespace o3tl { + template<> struct typed_flags<FrameAnalyzerFlags> : is_typed_flags<FrameAnalyzerFlags, 32768+15> {}; +} + + +namespace framework{ + +/** analyze and split the current available frame list of a given frames supplier + into different parts. + + These analyzed information can be used e.g. to decide if it's necessary + to switch into the backing mode, close the current active frame only or + exit the whole application explicitly or implicitly. + */ +class UNLESS_MERGELIBS(FWE_DLLPUBLIC) FrameListAnalyzer final +{ + + // types + + public: + + // member + + public: + + /** provides access to the frame container, which should be analyzed. */ + const css::uno::Reference< css::frame::XFramesSupplier >& m_xSupplier; + + /** hold the reference frame, which is used e.g. to detect other frames with the same model. */ + const css::uno::Reference< css::frame::XFrame >& m_xReferenceFrame; + + /** enable/disable some special analyzing steps. + see impl_analyze() for further information. */ + FrameAnalyzerFlags m_eDetectMode; + + /** contains all frames, which uses the same model like the reference frame. + Will be filled only if m_eDetectMode has set the flag FrameAnalyzerFlags::Model. + The reference frame is never part of this list! */ + std::vector< css::uno::Reference< css::frame::XFrame > > m_lModelFrames; + + /** contains all frames, which does not contain the same model like the reference frame. + Filling of it can't be suppressed by m_eDetectMode. + The reference frame is never part of this list! + All frames inside this list are visible ones. */ + std::vector< css::uno::Reference< css::frame::XFrame > > m_lOtherVisibleFrames; + + /** contains all frames, which does not contain the same model like the reference frame. + Filling of it can't be suppressed by m_eDetectMode. + The reference frame is never part of this list! + All frames inside this list are hidden ones. */ + std::vector< css::uno::Reference< css::frame::XFrame > > m_lOtherHiddenFrames; + + /** points to the help frame. + Will be set only, if any other frame (means different from the reference frame) + contains the help component. If the reference frame itself includes the help module + it's not set ... but another member m_bIsHelp is used to safe this information. + See following example code: + + <listing> + if (m_xReferenceFrame == help) + { + m_xHelp = NULL; + m_bIsHelp = sal_True; + } + else + if (xOtherFrame == help) + { + m_xHelp = xOtherFrame; + m_bIsHelp = sal_False; + } + </listing> + + Analyzing of the help frame ignores the visible state of any frame. + But note: a hidden help frame indicates a wrong state! + */ + css::uno::Reference< css::frame::XFrame > m_xHelp; + + /** points to the frame, which contains the backing component. + Will be set only, if any other frame (means different from the reference frame) + contains the backing component. If the reference frame itself includes the + backing component it's not set ... but another member m_bIsBackingComponent + will used to safe this information. + See following example code: + + <listing> + if (m_xReferenceFrame == backing) + { + m_xBackingComponent = NULL; + m_bIsBackingComponent = sal_True; + } + else + if (xOtherFrame == backing) + { + m_xBackingComponent = xOtherFrame; + m_bIsBackingComponent = sal_False ; + } + </listing> + + Analyzing of the help frame ignores the visible state of any frame. + But note: a hidden backing mode frame indicates a wrong state! + */ + css::uno::Reference< css::frame::XFrame > m_xBackingComponent; + + /** is set to true only, if the reference frame is a hidden one. + This value is undefined if m_eDetectMode doesn't have set the flag FrameAnalyzerFlags::Hidden! */ + bool m_bReferenceIsHidden; + + /** is set to true only, if the reference frame contains the help component. + In this case the member m_xHelp is set to NULL every time. + This value is undefined if m_eDetectMode doesn't have set the flag FrameAnalyzerFlags::Help! */ + bool m_bReferenceIsHelp; + + /** is set to true only, if the reference frame contains the backing component. + In this case the member m_xBackingComponent is set to NULL every time. + This value is undefined if m_eDetectMode doesn't have set the flag FrameAnalyzerFlags::BackingComponent! */ + bool m_bReferenceIsBacking; + + + // interface + + public: + + /** starts analyze phase and fill all members with valid information. + + @param xSupplier + Must be a valid reference to a frames supplier, which provides + access to the frame list for analyzing. + + @param xReferenceFrame + This frame must(!) exist inside the analyzed frame list and + is used for some comparing functions. Further some member states + depends from the current state of this frame. + + @param eDetectMode + It represent a flag field, which can enable/disable special + analyze steps. Note: Some member values will be undefined, if + an analyze step will be disabled. + */ + FrameListAnalyzer( const css::uno::Reference< css::frame::XFramesSupplier >& xSupplier , + const css::uno::Reference< css::frame::XFrame >& xReferenceFrame , + FrameAnalyzerFlags eDetectMode ); + ~FrameListAnalyzer(); + + + // helper + + private: + + void impl_analyze(); + + +}; // class FrameListAnalyzer + +} // namespace framework + +#endif // INCLUDED_FRAMEWORK_FRAMELISTANALYZER_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/framework/fwedllapi.h b/include/framework/fwedllapi.h new file mode 100644 index 000000000..3fa4e42cb --- /dev/null +++ b/include/framework/fwedllapi.h @@ -0,0 +1,34 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef INCLUDED_FRAMEWORK_FWEDLLAPI_H +#define INCLUDED_FRAMEWORK_FWEDLLAPI_H + +#include <sal/types.h> + +#if defined(FWE_DLLIMPLEMENTATION) +#define FWE_DLLPUBLIC SAL_DLLPUBLIC_EXPORT +#else +#define FWE_DLLPUBLIC SAL_DLLPUBLIC_IMPORT +#endif +#define FWE_DLLPRIVATE SAL_DLLPRIVATE + +#endif // INCLUDED_FRAMEWORK_FWEDLLAPI_H + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/framework/imutex.hxx b/include/framework/imutex.hxx new file mode 100644 index 000000000..4b4668f8e --- /dev/null +++ b/include/framework/imutex.hxx @@ -0,0 +1,43 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef INCLUDED_FRAMEWORK_IMUTEX_HXX +#define INCLUDED_FRAMEWORK_IMUTEX_HXX + +#include <sal/types.h> + +namespace framework{ + +/// Interface to support different mutex implementations in a generic way. +class SAL_NO_VTABLE IMutex +{ + public: + /// try to register thread + virtual void acquire() = 0; + /// unregister thread + virtual void release() = 0; + + protected: + ~IMutex() {} +}; +} + +#endif // INCLUDED_FRAMEWORK_IMUTEX_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/framework/interaction.hxx b/include/framework/interaction.hxx new file mode 100644 index 000000000..ab2fc3eb2 --- /dev/null +++ b/include/framework/interaction.hxx @@ -0,0 +1,92 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef INCLUDED_FRAMEWORK_INTERACTION_HXX +#define INCLUDED_FRAMEWORK_INTERACTION_HXX + +#include <config_options.h> +#include <rtl/ref.hxx> +#include <rtl/ustring.hxx> +#include <com/sun/star/uno/Reference.hxx> +#include <framework/fwedllapi.h> + +namespace com::sun::star::task { class XInteractionContinuation; } +namespace com::sun::star::task { class XInteractionRequest; } +namespace com::sun::star::uno { template <class E> class Sequence; } + +namespace framework{ + +/*-************************************************************************************************************ + @short special request for interaction to ask user for right filter + @descr These helper can be used to ask user for right filter, if filter detection failed. + It capsulate communication with any interaction handler and supports an easy + access on interaction results for user of these class. + Use it and forget complex mechanism of interaction ... + + @example RequestFilterSelect* pRequest = new RequestFilterSelect; + Reference< XInteractionRequest > xRequest ( pRequest ); + xInteractionHandler->handle( xRequest ); + if( ! pRequest.isAbort() ) + { + OUString sFilter = pRequest->getFilter(); + } + + @implements XInteractionRequest + + @devstatus ready to use + @threadsafe no (used on once position only!) +*//*-*************************************************************************************************************/ +class RequestFilterSelect_Impl; +class UNLESS_MERGELIBS(FWE_DLLPUBLIC) RequestFilterSelect +{ + rtl::Reference<RequestFilterSelect_Impl> mxImpl; + +public: + RequestFilterSelect( const OUString& sURL ); + ~RequestFilterSelect(); + bool isAbort () const; + OUString getFilter() const; + css::uno::Reference < css::task::XInteractionRequest > GetRequest(); +}; + +/*-************************************************************************************************************ + @short special request for interaction + @descr User must decide between a preselected and another detected filter. + It capsulate communication with any interaction handler and supports an easy + access on interaction results for user of these class. + + @implements XInteractionRequest + + @devstatus ready to use + @threadsafe no (used on once position only!) +*//*-*************************************************************************************************************/ +class FWE_DLLPUBLIC InteractionRequest +{ +public: + static css::uno::Reference < css::task::XInteractionRequest > CreateRequest( + const css::uno::Any& aRequest, + const css::uno::Sequence< css::uno::Reference< css::task::XInteractionContinuation > >& lContinuations ); +}; + + +} // namespace framework + +#endif // #define INCLUDED_FRAMEWORK_INTERACTION_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/framework/sfxhelperfunctions.hxx b/include/framework/sfxhelperfunctions.hxx new file mode 100644 index 000000000..d0ef3ff11 --- /dev/null +++ b/include/framework/sfxhelperfunctions.hxx @@ -0,0 +1,91 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef INCLUDED_FRAMEWORK_SFXHELPERFUNCTIONS_HXX +#define INCLUDED_FRAMEWORK_SFXHELPERFUNCTIONS_HXX + +#include <framework/fwedllapi.h> +#include <rtl/ustring.hxx> + +namespace com::sun::star::frame { class XFrame; } +namespace com::sun::star::uno { template <typename > class Reference; } +namespace svt { class StatusbarController; } +namespace svt { class ToolboxController; } + +class StatusBar; +class ToolBox; + +typedef svt::ToolboxController* ( *pfunc_setToolBoxControllerCreator)( + const css::uno::Reference< css::frame::XFrame >& rFrame, + ToolBox* pToolbox, + unsigned short nID, + const OUString& aCommandURL ); + +typedef svt::StatusbarController* ( *pfunc_setStatusBarControllerCreator)( + const css::uno::Reference< css::frame::XFrame >& rFrame, + StatusBar* pStatusBar, + unsigned short nID, + const OUString& aCommandURL ); + +typedef void ( *pfunc_getRefreshToolbars)( + css::uno::Reference< css::frame::XFrame > const & rFrame ); + +typedef void ( *pfunc_createDockingWindow)( + const css::uno::Reference< css::frame::XFrame >& rFrame, + const OUString& rResourceURL ); + +typedef bool ( *pfunc_isDockingWindowVisible)( + const css::uno::Reference< css::frame::XFrame >& rFrame, + const OUString& rResourceURL ); + + +namespace framework +{ +FWE_DLLPUBLIC pfunc_setToolBoxControllerCreator SetToolBoxControllerCreator( pfunc_setToolBoxControllerCreator pSetToolBoxControllerCreator ); +FWE_DLLPUBLIC svt::ToolboxController* CreateToolBoxController( + const css::uno::Reference< css::frame::XFrame >& rFrame, + ToolBox* pToolbox, + unsigned short nID, + const OUString& aCommandURL ); + +FWE_DLLPUBLIC pfunc_setStatusBarControllerCreator SetStatusBarControllerCreator( pfunc_setStatusBarControllerCreator pSetStatusBarControllerCreator ); +FWE_DLLPUBLIC svt::StatusbarController* CreateStatusBarController( + const css::uno::Reference< css::frame::XFrame >& rFrame, + StatusBar* pStatusBar, + unsigned short nID, + const OUString& aCommandURL ); + +FWE_DLLPUBLIC pfunc_getRefreshToolbars SetRefreshToolbars( pfunc_getRefreshToolbars pRefreshToolbarsFunc ); +FWE_DLLPUBLIC void RefreshToolbars( + css::uno::Reference< css::frame::XFrame > const & rFrame ); + +FWE_DLLPUBLIC pfunc_createDockingWindow SetDockingWindowCreator( pfunc_createDockingWindow pCreateDockingWindow ); +FWE_DLLPUBLIC void CreateDockingWindow( + const css::uno::Reference< css::frame::XFrame >& rFrame, + const OUString& rResourceURL ); + +FWE_DLLPUBLIC pfunc_isDockingWindowVisible SetIsDockingWindowVisible( pfunc_isDockingWindowVisible pIsDockingWindowVisible ); +FWE_DLLPUBLIC bool IsDockingWindowVisible( + const css::uno::Reference< css::frame::XFrame >& rFrame, + const OUString& rResourceURL ); +} + +#endif // INCLUDED_FRAMEWORK_SFXHELPERFUNCTIONS_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/framework/titlehelper.hxx b/include/framework/titlehelper.hxx new file mode 100644 index 000000000..c18f5f502 --- /dev/null +++ b/include/framework/titlehelper.hxx @@ -0,0 +1,197 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef INCLUDED_FRAMEWORK_TITLEHELPER_HXX +#define INCLUDED_FRAMEWORK_TITLEHELPER_HXX + +#include <com/sun/star/uno/Reference.hxx> +#include <com/sun/star/frame/XTitle.hpp> +#include <com/sun/star/frame/XTitleChangeBroadcaster.hpp> +#include <com/sun/star/frame/XFrameActionListener.hpp> +#include <com/sun/star/document/XDocumentEventListener.hpp> + +#include <cppuhelper/basemutex.hxx> +#include <cppuhelper/weakref.hxx> +#include <cppuhelper/implbase.hxx> +#include <cppuhelper/interfacecontainer.hxx> + +#include <rtl/ustrbuf.hxx> + +#include <framework/fwedllapi.h> + +namespace com::sun::star::frame { class XController; } +namespace com::sun::star::frame { class XFrame; } +namespace com::sun::star::frame { class XModel; } +namespace com::sun::star::frame { class XUntitledNumbers; } +namespace com::sun::star::uno { class XComponentContext; } +namespace com::sun::star::uno { class XInterface; } + + +namespace framework{ + + +/** @short can be used as implementation helper of interface css.frame.XTitle + + @threadsafe + */ +class FWE_DLLPUBLIC TitleHelper final : private ::cppu::BaseMutex + , public ::cppu::WeakImplHelper< css::frame::XTitle , + css::frame::XTitleChangeBroadcaster, + css::frame::XTitleChangeListener , + css::frame::XFrameActionListener , + css::document::XDocumentEventListener > +{ + + // interface + public: + + + /** @short lightweight constructor. + */ + TitleHelper(const css::uno::Reference< css::uno::XComponentContext >& rxContext); + + + /** @short free all internally used resources. + */ + virtual ~TitleHelper() override; + + + /** set an outside component which uses this container and must be set + as source of all broadcasted messages, exceptions. + + It's holded weak only so we do not need any complex dispose sessions. + + Note: Passing NULL as parameter will be allowed. It will reset the internal + member reference only. + + @param xOwner + the new owner of this collection. + */ + void setOwner (const css::uno::Reference< css::uno::XInterface >& xOwner); + + + /** set an outside component which provides the right string and number for + an untitled component. + + It's holded weak only so we do not need any complex dispose sessions. + + Note: Passing NULL as parameter will be allowed. It will reset the internal + member reference only. + + @param xNumbers + the right numbered collection for this helper. + */ + void connectWithUntitledNumbers (const css::uno::Reference< css::frame::XUntitledNumbers >& xNumbers); + + + /** @see XTitle */ + virtual OUString SAL_CALL getTitle() override; + + + /** @see XTitle */ + virtual void SAL_CALL setTitle(const OUString& sTitle) override; + + + /** @see XTitleChangeBroadcaster */ + virtual void SAL_CALL addTitleChangeListener(const css::uno::Reference< css::frame::XTitleChangeListener >& xListener) override; + + + /** @see XTitleChangeBroadcaster */ + virtual void SAL_CALL removeTitleChangeListener(const css::uno::Reference< css::frame::XTitleChangeListener >& xListener) override; + + + /** @see XTitleChangeListener */ + virtual void SAL_CALL titleChanged(const css::frame::TitleChangedEvent& aEvent) override; + + + /** @see css.document.XDocumentEventListener */ + virtual void SAL_CALL documentEventOccured(const css::document::DocumentEvent& aEvent) override; + + + /** @see css.lang.XEventListener */ + virtual void SAL_CALL disposing(const css::lang::EventObject& aEvent) override; + + + /** @see css.frame.XFrameActionListener */ + virtual void SAL_CALL frameAction(const css::frame::FrameActionEvent& aEvent) override; + + + // internal + private: + + void impl_sendTitleChangedEvent (); + + void impl_updateTitle (bool init = false); + void impl_updateTitleForModel (const css::uno::Reference< css::frame::XModel >& xModel, bool init); + void impl_updateTitleForController (const css::uno::Reference< css::frame::XController >& xController, bool init); + void impl_updateTitleForFrame (const css::uno::Reference< css::frame::XFrame >& xFrame, bool init); + + void impl_startListeningForModel (const css::uno::Reference< css::frame::XModel >& xModel); + void impl_startListeningForController (const css::uno::Reference< css::frame::XController >& xController); + void impl_startListeningForFrame (const css::uno::Reference< css::frame::XFrame >& xFrame); + void impl_updateListeningForFrame (const css::uno::Reference< css::frame::XFrame >& xFrame); + + void impl_appendComponentTitle ( OUStringBuffer& sTitle , + const css::uno::Reference< css::uno::XInterface >& xComponent); + void impl_appendProductName (OUStringBuffer& sTitle); + void impl_appendModuleName (OUStringBuffer& sTitle); + void impl_appendDebugVersion (OUStringBuffer& sTitle); + void impl_appendSafeMode (OUStringBuffer& sTitle); + + void impl_setSubTitle (const css::uno::Reference< css::frame::XTitle >& xSubTitle); + + OUString impl_convertURL2Title(const OUString& sURL); + + + // member + private: + + /** points to the global uno service manager. */ + css::uno::Reference< css::uno::XComponentContext> m_xContext; + + /** reference to the outside UNO class using this helper. */ + css::uno::WeakReference< css::uno::XInterface > m_xOwner; + + /** used to know how an "Untitled X" string can be created right :-) */ + css::uno::WeakReference< css::frame::XUntitledNumbers > m_xUntitledNumbers; + + /** provides parts of our own title and we listen there for changes too. */ + css::uno::WeakReference< css::frame::XTitle > m_xSubTitle; + + /** if it's set to sal_True the member m_sTitle has not to be changed internally. + It was set from outside and so outside code has to make sure it will be + updated. + */ + bool m_bExternalTitle; + + /** the actual title value */ + OUString m_sTitle; + + /** knows the leased number which must be used for untitled components. */ + ::sal_Int32 m_nLeasedNumber; + + /** contains all title change listener */ + ::cppu::OMultiTypeInterfaceContainerHelper m_aListener; +}; + +} // namespace framework + +#endif // INCLUDED_FRAMEWORK_TITLEHELPER_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/framework/undomanagerhelper.hxx b/include/framework/undomanagerhelper.hxx new file mode 100644 index 000000000..07cbdd667 --- /dev/null +++ b/include/framework/undomanagerhelper.hxx @@ -0,0 +1,162 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef INCLUDED_FRAMEWORK_UNDOMANAGERHELPER_HXX +#define INCLUDED_FRAMEWORK_UNDOMANAGERHELPER_HXX + +#include <framework/fwedllapi.h> +#include <com/sun/star/uno/Sequence.hxx> +#include <com/sun/star/uno/Reference.hxx> + +#include <memory> + +namespace com::sun::star::document { class XUndoAction; } +namespace com::sun::star::document { class XUndoManager; } +namespace com::sun::star::document { class XUndoManagerListener; } +namespace com::sun::star::util { class XModifyListener; } +namespace framework { class IMutex; } + +class SfxUndoManager; + + +namespace framework +{ + + + //= IMutexGuard + + class SAL_NO_VTABLE IMutexGuard + { + public: + /** clears the lock. If the guard does not currently hold the lock, nothing happens. + */ + virtual void clear() = 0; + + /** 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; + + protected: + ~IMutexGuard() {} + }; + + + //= IUndoManagerImplementation + + class SAL_NO_VTABLE IUndoManagerImplementation + { + public: + /** returns the SfxUndoManager interface to the actual Undo stack + + @throws css::lang::DisposedException + when the instance is already disposed, and no SfxUndoManager can be provided + + @throws css::lang::NotInitializedException + when the instance is not initialized, yet, and no SfxUndoManager can be provided + */ + virtual SfxUndoManager& getImplUndoManager() = 0; + + /** provides access to a UNO interface for the XUndoManager implementation. Used when throwing exceptions. + */ + virtual css::uno::Reference< css::document::XUndoManager > + getThis() = 0; + + protected: + ~IUndoManagerImplementation() {} + }; + + + //= 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 mutex 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>SfxUndoManager</code> implementation is made without the mutex being locked. + Note that this implies that the <code>SfxUndoManager</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>SfxUndoManager::Undo</member> and + <member>SfxUndoManager::Redo</member> methods: They're called with the given external mutex being + locked.</li> + </ul> + + The reason for the exception for SfxUndoManager::Undo and SfxUndoManager::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 FWE_DLLPUBLIC UndoManagerHelper + { + public: + UndoManagerHelper( IUndoManagerImplementation& i_undoManagerImpl ); + ~UndoManagerHelper(); + + // life time control + void disposing(); + + // XUndoManager equivalents + void enterUndoContext( const OUString& i_title, IMutexGuard& i_instanceLock ); + void enterHiddenUndoContext( IMutexGuard& i_instanceLock ); + void leaveUndoContext( IMutexGuard& i_instanceLock ); + void addUndoAction( const css::uno::Reference< css::document::XUndoAction >& i_action, IMutexGuard& i_instanceLock ); + void undo( IMutexGuard& i_instanceLock ); + void redo( IMutexGuard& i_instanceLock ); + bool isUndoPossible() const; + bool isRedoPossible() const; + OUString getCurrentUndoActionTitle() const; + OUString getCurrentRedoActionTitle() const; + css::uno::Sequence< OUString > + getAllUndoActionTitles() const; + css::uno::Sequence< OUString > + getAllRedoActionTitles() const; + void clear( IMutexGuard& i_instanceLock ); + void clearRedo( IMutexGuard& i_instanceLock ); + void reset( IMutexGuard& i_instanceLock ); + void addUndoManagerListener( const css::uno::Reference< css::document::XUndoManagerListener >& i_listener ); + void removeUndoManagerListener( const css::uno::Reference< css::document::XUndoManagerListener >& i_listener ); + + // XLockable, base of XUndoManager, equivalents + void lock(); + void unlock(); + bool isLocked(); + + // XModifyBroadcaster equivalents + void addModifyListener( const css::uno::Reference< css::util::XModifyListener >& i_listener ); + void removeModifyListener( const css::uno::Reference< css::util::XModifyListener >& i_listener ); + + private: + std::unique_ptr< UndoManagerHelper_Impl > m_xImpl; + }; + + +} // namespace framework + + +#endif // INCLUDED_FRAMEWORK_UNDOMANAGERHELPER_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |