[Libreoffice-commits] core.git: framework/Library_fwk.mk framework/source
Maxim Monastirsky
momonasmon at gmail.com
Fri Jan 29 03:18:11 PST 2016
framework/Library_fwk.mk | 1
framework/source/uielement/resourcemenucontroller.cxx | 92 +++-
framework/source/uielement/toolbarasmenucontroller.cxx | 363 -----------------
3 files changed, 84 insertions(+), 372 deletions(-)
New commits:
commit 1d0f08cdf1b9396e97e068f97fd78f31b5906748
Author: Maxim Monastirsky <momonasmon at gmail.com>
Date: Fri Jan 29 12:21:45 2016 +0200
Use ResourceMenuController for toolbar-based menus too
No need for yet another controller that does similar things.
Change-Id: I4ad79d82ea34a90a43e36082d1fb834201dba3a1
diff --git a/framework/Library_fwk.mk b/framework/Library_fwk.mk
index ce85848..0c78fc4 100644
--- a/framework/Library_fwk.mk
+++ b/framework/Library_fwk.mk
@@ -156,7 +156,6 @@ $(eval $(call gb_Library_add_exception_objects,fwk,\
framework/source/uielement/subtoolbarcontroller \
framework/source/uielement/thesaurusmenucontroller \
framework/source/uielement/togglebuttontoolbarcontroller \
- framework/source/uielement/toolbarasmenucontroller \
framework/source/uielement/toolbarmanager \
framework/source/uielement/toolbarmerger \
framework/source/uielement/toolbarwrapper \
diff --git a/framework/source/uielement/resourcemenucontroller.cxx b/framework/source/uielement/resourcemenucontroller.cxx
index 581c227..4477516 100644
--- a/framework/source/uielement/resourcemenucontroller.cxx
+++ b/framework/source/uielement/resourcemenucontroller.cxx
@@ -16,6 +16,7 @@
#include <com/sun/star/embed/VerbDescriptor.hpp>
#include <com/sun/star/frame/ModuleManager.hpp>
#include <com/sun/star/frame/XStorable.hpp>
+#include <com/sun/star/ui/ItemType.hpp>
#include <com/sun/star/ui/theModuleUIConfigurationManagerSupplier.hpp>
#include <com/sun/star/ui/XUIConfigurationManagerSupplier.hpp>
#include <com/sun/star/util/URL.hpp>
@@ -26,7 +27,7 @@ class ResourceMenuController : public cppu::ImplInheritanceHelper< svt::PopupMen
{
public:
ResourceMenuController( const css::uno::Reference< css::uno::XComponentContext >& rxContext,
- const css::uno::Sequence< css::uno::Any >& rxArgs );
+ const css::uno::Sequence< css::uno::Any >& rxArgs, bool bToolbarContainer );
virtual ~ResourceMenuController();
// XPopupMenuController
@@ -55,20 +56,23 @@ private:
OUString m_aMenuURL;
bool m_bContextMenu;
bool m_bInToolbar;
+ bool m_bToolbarContainer;
sal_uInt16 m_nNewMenuId;
rtl::Reference< framework::MenuBarManager > m_xMenuBarManager;
css::uno::Reference< css::container::XIndexAccess > m_xMenuContainer;
css::uno::Reference< css::uno::XComponentContext > m_xContext;
css::uno::Reference< css::ui::XUIConfigurationManager > m_xConfigManager, m_xModuleConfigManager;
void addVerbs( const css::uno::Sequence< css::embed::VerbDescriptor >& rVerbs );
+ void fillToolbarData();
virtual void SAL_CALL disposing() override;
};
ResourceMenuController::ResourceMenuController( const css::uno::Reference< css::uno::XComponentContext >& rxContext,
- const css::uno::Sequence< css::uno::Any >& rxArgs ) :
+ const css::uno::Sequence< css::uno::Any >& rxArgs, bool bToolbarContainer ) :
ImplInheritanceHelper( rxContext ),
m_bContextMenu( false ),
m_bInToolbar( false ),
+ m_bToolbarContainer( bToolbarContainer ),
m_nNewMenuId( 1 ),
m_xContext( rxContext )
{
@@ -81,7 +85,10 @@ ResourceMenuController::ResourceMenuController( const css::uno::Reference< css::
{
OUString aMenuName;
aPropValue.Value >>= aMenuName;
- m_aMenuURL = "private:resource/popupmenu/" + aMenuName;
+ if ( m_bToolbarContainer )
+ m_aMenuURL = "private:resource/toolbar/" + aMenuName;
+ else
+ m_aMenuURL = "private:resource/popupmenu/" + aMenuName;
}
else if ( aPropValue.Name == "Frame" )
aPropValue.Value >>= m_xFrame;
@@ -184,9 +191,11 @@ void ResourceMenuController::updatePopupMenu()
m_nNewMenuId = 1;
// Now fill the menu with the configuration data.
- VCLXMenu* pAwtMenu = VCLXMenu::GetImplementation( m_xPopupMenu );
css::uno::Reference< css::frame::XDispatchProvider > xDispatchProvider( m_xFrame, css::uno::UNO_QUERY );
- framework::MenuBarManager::FillMenu( m_nNewMenuId, pAwtMenu->GetMenu(), m_aModuleName, m_xMenuContainer, xDispatchProvider );
+ if ( m_bToolbarContainer )
+ fillToolbarData();
+ else
+ framework::MenuBarManager::FillMenu( m_nNewMenuId, VCLXMenu::GetImplementation( m_xPopupMenu )->GetMenu(), m_aModuleName, m_xMenuContainer, xDispatchProvider );
// For context menus, add object verbs.
if ( m_bContextMenu )
@@ -235,6 +244,63 @@ void ResourceMenuController::addVerbs( const css::uno::Sequence< css::embed::Ver
}
}
+void ResourceMenuController::fillToolbarData()
+{
+ if ( !m_xMenuContainer.is() )
+ return;
+
+ VCLXMenu* pAwtMenu = VCLXMenu::GetImplementation( m_xPopupMenu );
+ Menu* pVCLMenu = pAwtMenu->GetMenu();
+
+ css::uno::Sequence< css::beans::PropertyValue > aPropSequence;
+ for ( sal_Int32 i = 0; i < m_xMenuContainer->getCount(); ++i )
+ {
+ try
+ {
+ if ( m_xMenuContainer->getByIndex( i ) >>= aPropSequence )
+ {
+ OUString aCommandURL;
+ OUString aLabel;
+ sal_uInt16 nType = css::ui::ItemType::DEFAULT;
+ bool bVisible = true;
+
+ for ( const auto& aProp: aPropSequence )
+ {
+ if ( aProp.Name == "CommandURL" )
+ aProp.Value >>= aCommandURL;
+ else if ( aProp.Name == "Label" )
+ aProp.Value >>= aLabel;
+ else if ( aProp.Name == "Type" )
+ aProp.Value >>= nType;
+ else if ( aProp.Name == "IsVisible" )
+ aProp.Value >>= bVisible;
+ }
+
+ switch ( nType )
+ {
+ case css::ui::ItemType::DEFAULT:
+ if ( bVisible )
+ {
+ pVCLMenu->InsertItem( m_nNewMenuId, aLabel );
+ pVCLMenu->SetItemCommand( m_nNewMenuId++, aCommandURL );
+ }
+ break;
+ case css::ui::ItemType::SEPARATOR_LINE:
+ case css::ui::ItemType::SEPARATOR_LINEBREAK:
+ if ( bVisible && pVCLMenu->GetItemId( pVCLMenu->GetItemCount() - 1 ) != 0 )
+ pVCLMenu->InsertSeparator();
+ break;
+ default: ;
+ }
+ }
+ }
+ catch ( const css::uno::Exception& )
+ {
+ break;
+ }
+ }
+}
+
void ResourceMenuController::itemActivated( const css::awt::MenuEvent& /*rEvent*/ )
throw ( css::uno::RuntimeException, std::exception )
{
@@ -316,14 +382,16 @@ void ResourceMenuController::disposing()
OUString ResourceMenuController::getImplementationName()
throw ( css::uno::RuntimeException, std::exception )
{
+ if ( m_bToolbarContainer )
+ return OUString( "com.sun.star.comp.framework.ToolbarAsMenuController" );
+
return OUString( "com.sun.star.comp.framework.ResourceMenuController" );
}
css::uno::Sequence< OUString > ResourceMenuController::getSupportedServiceNames()
throw ( css::uno::RuntimeException, std::exception )
{
- css::uno::Sequence< OUString > aRet { "com.sun.star.frame.PopupMenuController" };
- return aRet;
+ return { "com.sun.star.frame.PopupMenuController" };
}
}
@@ -333,7 +401,15 @@ com_sun_star_comp_framework_ResourceMenuController_get_implementation(
css::uno::XComponentContext* context,
css::uno::Sequence< css::uno::Any > const & args )
{
- return cppu::acquire( new ResourceMenuController( context, args ) );
+ return cppu::acquire( new ResourceMenuController( context, args, false ) );
+}
+
+extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface * SAL_CALL
+com_sun_star_comp_framework_ToolbarAsMenuController_get_implementation(
+ css::uno::XComponentContext* context,
+ css::uno::Sequence< css::uno::Any > const & args )
+{
+ return cppu::acquire( new ResourceMenuController( context, args, true ) );
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/framework/source/uielement/toolbarasmenucontroller.cxx b/framework/source/uielement/toolbarasmenucontroller.cxx
deleted file mode 100644
index 9ea8d0b..0000000
--- a/framework/source/uielement/toolbarasmenucontroller.cxx
+++ /dev/null
@@ -1,363 +0,0 @@
-/* -*- 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 <cppuhelper/implbase.hxx>
-#include <svtools/popupmenucontrollerbase.hxx>
-#include <vcl/menu.hxx>
-
-#include <com/sun/star/ui/ItemType.hpp>
-#include <com/sun/star/ui/theModuleUIConfigurationManagerSupplier.hpp>
-#include <com/sun/star/ui/XUIConfigurationManagerSupplier.hpp>
-#include <com/sun/star/util/URLTransformer.hpp>
-
-namespace framework {
-
-class CommandStatusHelper : public cppu::WeakImplHelper< css::frame::XStatusListener >
-{
-public:
- CommandStatusHelper( const css::uno::Reference< css::uno::XComponentContext >& rxContext,
- const css::uno::Reference< css::frame::XFrame >& rxFrame,
- const OUString& rCommandURL );
- virtual ~CommandStatusHelper();
-
- // XStatusListener
- virtual void SAL_CALL statusChanged( const css::frame::FeatureStateEvent& rEvent ) throw ( css::uno::RuntimeException, std::exception ) override;
-
- // XEventListener
- virtual void SAL_CALL disposing( const css::lang::EventObject& rEvent ) throw ( css::uno::RuntimeException, std::exception ) override;
-
- void updateCommand();
- bool isCommandEnabled() { return m_bEnabled; }
- bool isCommandChecked() { return m_bChecked; }
-
-private:
- bool m_bEnabled;
- bool m_bChecked;
- OUString m_aCommandURL;
- css::uno::Reference< css::frame::XFrame > m_xFrame;
- css::uno::Reference< css::util::XURLTransformer > m_xURLTransformer;
-};
-
-CommandStatusHelper::CommandStatusHelper( const css::uno::Reference< css::uno::XComponentContext >& rxContext,
- const css::uno::Reference< css::frame::XFrame >& rxFrame,
- const OUString& rCommandURL ) :
- m_bEnabled( true ),
- m_bChecked( false ),
- m_aCommandURL( rCommandURL ),
- m_xFrame( rxFrame ),
- m_xURLTransformer( css::util::URLTransformer::create( rxContext ) )
-{
-}
-
-CommandStatusHelper::~CommandStatusHelper()
-{
-}
-
-void CommandStatusHelper::updateCommand()
-{
- css::uno::Reference< css::frame::XDispatchProvider > xDispatchProvider( m_xFrame, css::uno::UNO_QUERY );
- if ( xDispatchProvider.is() )
- {
- css::util::URL aTargetURL;
- aTargetURL.Complete = m_aCommandURL;
- m_xURLTransformer->parseStrict( aTargetURL );
-
- css::uno::Reference< css::frame::XDispatch > xDispatch( xDispatchProvider->queryDispatch( aTargetURL, OUString(), 0 ) );
- if ( xDispatch.is() )
- {
- xDispatch->addStatusListener( this, aTargetURL );
- xDispatch->removeStatusListener( this, aTargetURL );
- }
- }
-}
-
-void CommandStatusHelper::statusChanged( const css::frame::FeatureStateEvent& rEvent )
- throw ( css::uno::RuntimeException, std::exception )
-{
- OUString aStringStatus;
- if ( rEvent.State >>= aStringStatus )
- {
- const OUString aEnumPart( rEvent.FeatureURL.Complete.getToken( 2, '.' ) );
- if ( !aEnumPart.isEmpty() && rEvent.FeatureURL.Protocol == ".uno:" )
- m_bChecked = aStringStatus == aEnumPart;
- }
- rEvent.State >>= m_bChecked;
- m_bEnabled = rEvent.IsEnabled;
-}
-
-void CommandStatusHelper::disposing( const css::lang::EventObject& /*rEvent*/ )
- throw ( css::uno::RuntimeException, std::exception )
-{
- // We aren't holding reference to the dispatcher, so nothing to do here.
-}
-
-
-class ToolbarAsMenuController : public cppu::ImplInheritanceHelper< svt::PopupMenuControllerBase, css::ui::XUIConfigurationListener >
-{
-public:
- ToolbarAsMenuController( const css::uno::Reference< css::uno::XComponentContext >& rxContext,
- const css::uno::Sequence< css::uno::Any >& rxArgs );
- virtual ~ToolbarAsMenuController();
-
- // XPopupMenuController
- virtual void SAL_CALL updatePopupMenu() throw ( css::uno::RuntimeException, std::exception ) override;
-
- // XStatusListener
- virtual void SAL_CALL statusChanged( const css::frame::FeatureStateEvent& rEvent ) throw ( css::uno::RuntimeException, std::exception ) override;
-
- // XEventListener
- virtual void SAL_CALL disposing( const css::lang::EventObject& rEvent ) throw ( css::uno::RuntimeException, std::exception ) override;
-
- // XUIConfigurationListener
- virtual void SAL_CALL elementInserted( const css::ui::ConfigurationEvent& rEvent ) throw ( css::uno::RuntimeException, std::exception ) override;
- virtual void SAL_CALL elementRemoved( const css::ui::ConfigurationEvent& rEvent ) throw ( css::uno::RuntimeException, std::exception ) override;
- virtual void SAL_CALL elementReplaced( const css::ui::ConfigurationEvent& rEvent ) throw ( css::uno::RuntimeException, std::exception ) override;
-
- // XServiceInfo
- virtual OUString SAL_CALL getImplementationName() throw ( css::uno::RuntimeException, std::exception ) override;
- virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() throw ( css::uno::RuntimeException, std::exception ) override;
-
-private:
- OUString m_aToolbarURL;
- css::uno::Reference< css::container::XIndexAccess > m_xToolbarContainer;
- css::uno::Reference< css::uno::XComponentContext > m_xContext;
- css::uno::Reference< css::ui::XUIConfigurationManager > m_xConfigManager, m_xModuleConfigManager;
- void fillPopupMenu();
- virtual void SAL_CALL disposing() override;
- virtual void impl_setPopupMenu() override;
-};
-
-ToolbarAsMenuController::ToolbarAsMenuController( const css::uno::Reference< css::uno::XComponentContext >& rxContext,
- const css::uno::Sequence< css::uno::Any >& rxArgs ) :
- ImplInheritanceHelper( rxContext ),
- m_xContext( rxContext )
-{
- css::beans::PropertyValue aPropValue;
- for ( const auto& arg: rxArgs )
- {
- if ( ( arg >>= aPropValue ) && aPropValue.Name == "Value" )
- {
- OUString aToolbarName;
- aPropValue.Value >>= aToolbarName;
- m_aToolbarURL = "private:resource/toolbar/" + aToolbarName;
- break;
- }
- }
-}
-
-ToolbarAsMenuController::~ToolbarAsMenuController()
-{
-}
-
-void ToolbarAsMenuController::impl_setPopupMenu()
-{
- if ( m_aToolbarURL.isEmpty() )
- return;
-
- if ( !m_xConfigManager.is() )
- {
- try
- {
- css::uno::Reference< css::frame::XController > xController( m_xFrame->getController() );
- css::uno::Reference< css::frame::XModel > xModel( xController->getModel() );
- css::uno::Reference< css::ui::XUIConfigurationManagerSupplier > xSupplier( xModel, css::uno::UNO_QUERY_THROW );
- m_xConfigManager.set( xSupplier->getUIConfigurationManager() );
- css::uno::Reference< css::ui::XUIConfiguration > xConfig( m_xConfigManager, css::uno::UNO_QUERY_THROW );
- xConfig->addConfigurationListener( this );
- }
- catch( const css::uno::RuntimeException& )
- {}
- }
-
- if ( !m_xModuleConfigManager.is() )
- {
- try
- {
- css::uno::Reference< css::ui::XModuleUIConfigurationManagerSupplier > xModuleCfgMgrSupplier(
- css::ui::theModuleUIConfigurationManagerSupplier::get( m_xContext ) );
- m_xModuleConfigManager.set( xModuleCfgMgrSupplier->getUIConfigurationManager( m_aModuleName ) );
- css::uno::Reference< css::ui::XUIConfiguration > xConfig( m_xModuleConfigManager, css::uno::UNO_QUERY_THROW );
- xConfig->addConfigurationListener( this );
- }
- catch ( const css::container::NoSuchElementException& )
- {
- SAL_WARN( "fwk.uielement", "Invalid module identifier: " << m_aModuleName );
- }
- catch( const css::uno::RuntimeException& )
- {}
- }
-
- try
- {
- if ( m_xConfigManager.is() && m_xConfigManager->hasSettings( m_aToolbarURL ) )
- m_xToolbarContainer.set( m_xConfigManager->getSettings( m_aToolbarURL, sal_False ) );
- else if ( m_xModuleConfigManager.is() && m_xModuleConfigManager->hasSettings( m_aToolbarURL ) )
- m_xToolbarContainer.set( m_xModuleConfigManager->getSettings( m_aToolbarURL, sal_False ) );
- }
- catch ( const css::container::NoSuchElementException& )
- {
- SAL_WARN( "fwk.uielement", "Can not find settings for " << m_aToolbarURL );
- }
- catch ( const css::lang::IllegalArgumentException& )
- {
- SAL_WARN( "fwk.uielement", "The given URL is not valid: " << m_aToolbarURL );
- }
-
- fillPopupMenu();
-}
-
-void ToolbarAsMenuController::fillPopupMenu()
-{
- resetPopupMenu( m_xPopupMenu );
- if ( !m_xToolbarContainer.is() )
- return;
-
- VCLXMenu* pAwtMenu = VCLXMenu::GetImplementation( m_xPopupMenu );
- Menu* pVCLMenu = pAwtMenu->GetMenu();
-
- css::uno::Sequence< css::beans::PropertyValue > aPropSequence;
- for ( sal_Int32 i = 0; i < m_xToolbarContainer->getCount(); ++i )
- {
- try
- {
- if ( m_xToolbarContainer->getByIndex( i ) >>= aPropSequence )
- {
- OUString aCommandURL;
- sal_uInt16 nType = css::ui::ItemType::DEFAULT;
- bool bVisible = true;
-
- for ( const auto& aProp: aPropSequence )
- {
- if ( aProp.Name == "CommandURL" )
- aProp.Value >>= aCommandURL;
- else if ( aProp.Name == "Type" )
- aProp.Value >>= nType;
- else if ( aProp.Name == "IsVisible" )
- aProp.Value >>= bVisible;
- }
-
- switch ( nType )
- {
- case css::ui::ItemType::DEFAULT:
- if ( bVisible )
- pVCLMenu->InsertItem( aCommandURL, m_xFrame );
- break;
- case css::ui::ItemType::SEPARATOR_LINE:
- case css::ui::ItemType::SEPARATOR_LINEBREAK:
- if ( bVisible && pVCLMenu->GetItemId( pVCLMenu->GetItemCount() - 1 ) != 0 )
- pVCLMenu->InsertSeparator();
- break;
- default: ;
- }
- }
- }
- catch ( const css::uno::Exception& )
- {
- break;
- }
- }
-}
-
-void ToolbarAsMenuController::updatePopupMenu()
- throw ( css::uno::RuntimeException, std::exception )
-{
- VCLXMenu* pAwtMenu = VCLXMenu::GetImplementation( m_xPopupMenu );
- Menu* pVCLMenu = pAwtMenu->GetMenu();
-
- for ( sal_uInt16 i = 0; i < pVCLMenu->GetItemCount(); ++i )
- {
- const sal_uInt16 nItemId( pVCLMenu->GetItemId( i ) );
- const OUString aCommandURL( pVCLMenu->GetItemCommand( nItemId ) );
- if ( !aCommandURL.isEmpty() )
- {
- rtl::Reference< CommandStatusHelper > xHelper( new CommandStatusHelper( m_xContext, m_xFrame, aCommandURL ) );
- xHelper->updateCommand();
- pVCLMenu->EnableItem( nItemId, xHelper->isCommandEnabled() );
- pVCLMenu->CheckItem( nItemId, xHelper->isCommandChecked() );
- }
- }
-}
-
-void ToolbarAsMenuController::disposing()
-{
- svt::PopupMenuControllerBase::disposing();
-
- css::uno::Reference< css::ui::XUIConfiguration > xConfig( m_xConfigManager, css::uno::UNO_QUERY );
- if ( xConfig.is() )
- xConfig->removeConfigurationListener( this );
-
- css::uno::Reference< css::ui::XUIConfiguration > xModuleConfig( m_xModuleConfigManager, css::uno::UNO_QUERY );
- if ( xModuleConfig.is() )
- xModuleConfig->removeConfigurationListener( this );
-
- m_xConfigManager.clear();
- m_xModuleConfigManager.clear();
-}
-
-void ToolbarAsMenuController::statusChanged( const css::frame::FeatureStateEvent& /*rEvent*/ )
- throw ( css::uno::RuntimeException, std::exception )
-{
-}
-
-void ToolbarAsMenuController::disposing( const css::lang::EventObject& rEvent )
- throw ( css::uno::RuntimeException, std::exception )
-{
- if ( rEvent.Source == m_xConfigManager )
- m_xConfigManager.clear();
- else if ( rEvent.Source == m_xModuleConfigManager )
- m_xModuleConfigManager.clear();
- else
- svt::PopupMenuControllerBase::disposing( rEvent );
-}
-
-void ToolbarAsMenuController::elementInserted( const css::ui::ConfigurationEvent& rEvent )
- throw ( css::uno::RuntimeException, std::exception )
-{
- if ( rEvent.ResourceURL == m_aToolbarURL )
- impl_setPopupMenu();
-}
-
-void ToolbarAsMenuController::elementRemoved( const css::ui::ConfigurationEvent& rEvent )
- throw ( css::uno::RuntimeException, std::exception )
-{
- if ( rEvent.ResourceURL == m_aToolbarURL )
- impl_setPopupMenu();
-}
-
-void ToolbarAsMenuController::elementReplaced( const css::ui::ConfigurationEvent& rEvent )
- throw ( css::uno::RuntimeException, std::exception )
-{
- if ( rEvent.ResourceURL == m_aToolbarURL )
- impl_setPopupMenu();
-}
-
-OUString ToolbarAsMenuController::getImplementationName()
- throw ( css::uno::RuntimeException, std::exception )
-{
- return OUString( "com.sun.star.comp.framework.ToolbarAsMenuController" );
-}
-
-css::uno::Sequence< OUString > ToolbarAsMenuController::getSupportedServiceNames()
- throw ( css::uno::RuntimeException, std::exception )
-{
- css::uno::Sequence< OUString > aRet { "com.sun.star.frame.PopupMenuController" };
- return aRet;
-}
-
-}
-
-extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface * SAL_CALL
-com_sun_star_comp_framework_ToolbarAsMenuController_get_implementation(
- css::uno::XComponentContext* xContext,
- css::uno::Sequence< css::uno::Any > const & args )
-{
- return cppu::acquire( new framework::ToolbarAsMenuController( xContext, args ) );
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
More information about the Libreoffice-commits
mailing list