summaryrefslogtreecommitdiffstats
path: root/framework/source/layoutmanager/toolbarlayoutmanager.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'framework/source/layoutmanager/toolbarlayoutmanager.hxx')
-rw-r--r--framework/source/layoutmanager/toolbarlayoutmanager.hxx285
1 files changed, 285 insertions, 0 deletions
diff --git a/framework/source/layoutmanager/toolbarlayoutmanager.hxx b/framework/source/layoutmanager/toolbarlayoutmanager.hxx
new file mode 100644
index 0000000000..5e21438c8c
--- /dev/null
+++ b/framework/source/layoutmanager/toolbarlayoutmanager.hxx
@@ -0,0 +1,285 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <sal/config.h>
+
+#include <string_view>
+#include <vector>
+
+#include <uiconfiguration/globalsettings.hxx>
+#include <framework/addonsoptions.hxx>
+#include <uielement/uielement.hxx>
+#include <services/layoutmanager.hxx>
+
+#include <com/sun/star/ui/XUIConfigurationManager.hpp>
+#include <com/sun/star/awt/XWindowListener.hpp>
+#include <com/sun/star/ui/XUIElementFactory.hpp>
+#include <com/sun/star/ui/DockingArea.hpp>
+#include <com/sun/star/awt/XWindow2.hpp>
+#include <com/sun/star/awt/XDockableWindow.hpp>
+#include <com/sun/star/awt/XDockableWindowListener.hpp>
+
+#include <cppuhelper/implbase.hxx>
+
+namespace framework
+{
+
+class ToolbarLayoutManager : public ::cppu::WeakImplHelper< css::awt::XDockableWindowListener,
+ css::ui::XUIConfigurationListener,
+ css::awt::XWindowListener >
+{
+ public:
+ enum { DOCKINGAREAS_COUNT = 4 };
+
+ enum PreviewFrameDetection
+ {
+ PREVIEWFRAME_UNKNOWN,
+ PREVIEWFRAME_NO,
+ PREVIEWFRAME_YES
+ };
+
+ ToolbarLayoutManager( css::uno::Reference< css::uno::XComponentContext > xContext,
+ css::uno::Reference< css::ui::XUIElementFactory > xUIElementFactory,
+ LayoutManager* pParentLayouter );
+ virtual ~ToolbarLayoutManager() override;
+
+ void reset();
+ void attach( const css::uno::Reference< css::frame::XFrame >& xFrame,
+ const css::uno::Reference< css::ui::XUIConfigurationManager >& xModuleCfgMgr,
+ const css::uno::Reference< css::ui::XUIConfigurationManager >& xDocCfgMgr,
+ const css::uno::Reference< css::container::XNameAccess >& xPersistentWindowState );
+
+ void setParentWindow( const css::uno::Reference< css::awt::XVclWindowPeer >& xParentWindow );
+ void setDockingAreaOffsets(const ::tools::Rectangle& rOffsets);
+
+ void resetDockingArea();
+
+ css::awt::Rectangle getDockingArea();
+ void setDockingArea( const css::awt::Rectangle& rDockingArea );
+
+ bool isPreviewFrame();
+
+ // layouting
+ bool isLayoutDirty() const { return m_bLayoutDirty;}
+ void doLayout(const ::Size& aContainerSize);
+
+ // creation/destruction
+ void createStaticToolbars();
+ void destroyToolbars();
+
+ bool requestToolbar( const OUString& rResourceURL );
+ bool createToolbar( const OUString& rResourceURL );
+ bool destroyToolbar( std::u16string_view rResourceURL );
+
+ // visibility
+ bool showToolbar( std::u16string_view rResourceURL );
+ bool hideToolbar( std::u16string_view rResourceURL );
+
+ void refreshToolbarsVisibility( bool bAutomaticToolbars );
+ void setFloatingToolbarsVisibility( bool bVisible );
+ void setVisible(bool bVisible);
+
+ // docking and further functions
+ bool dockToolbar( std::u16string_view rResourceURL, css::ui::DockingArea eDockingArea, const css::awt::Point& aPos );
+ bool dockAllToolbars();
+ bool floatToolbar( std::u16string_view rResourceURL );
+ bool lockToolbar( std::u16string_view rResourceURL );
+ bool unlockToolbar( std::u16string_view rResourceURL );
+ void setToolbarPos( std::u16string_view rResourceURL, const css::awt::Point& aPos );
+ void setToolbarSize( std::u16string_view rResourceURL, const css::awt::Size& aSize );
+ void setToolbarPosSize( std::u16string_view rResourceURL, const css::awt::Point& aPos, const css::awt::Size& aSize );
+ bool isToolbarVisible( std::u16string_view rResourceURL );
+ bool isToolbarFloating( std::u16string_view rResourceURL );
+ bool isToolbarDocked( std::u16string_view rResourceURL );
+ bool isToolbarLocked( std::u16string_view rResourceURL );
+ css::awt::Point getToolbarPos( std::u16string_view rResourceURL );
+ css::awt::Size getToolbarSize( std::u16string_view rResourceURL );
+ css::uno::Reference< css::ui::XUIElement > getToolbar( std::u16string_view aName );
+ css::uno::Sequence< css::uno::Reference< css::ui::XUIElement > > getToolbars();
+
+ void updateToolbarsTips();
+
+ // child window notifications
+ void childWindowEvent( VclSimpleEvent const * pEvent );
+
+ // XInterface
+
+ virtual void SAL_CALL acquire() noexcept override;
+ virtual void SAL_CALL release() noexcept override;
+ virtual css::uno::Any SAL_CALL queryInterface( const css::uno::Type & rType ) override;
+
+ // XEventListener
+ virtual void SAL_CALL disposing( const css::lang::EventObject& aEvent ) override;
+
+ // XWindowListener
+ virtual void SAL_CALL windowResized( const css::awt::WindowEvent& aEvent ) override;
+ virtual void SAL_CALL windowMoved( const css::awt::WindowEvent& aEvent ) override;
+ virtual void SAL_CALL windowShown( const css::lang::EventObject& aEvent ) override;
+ virtual void SAL_CALL windowHidden( const css::lang::EventObject& aEvent ) override;
+
+ // XDockableWindowListener
+ virtual void SAL_CALL startDocking( const css::awt::DockingEvent& e ) override;
+ virtual css::awt::DockingData SAL_CALL docking( const css::awt::DockingEvent& e ) override;
+ virtual void SAL_CALL endDocking( const css::awt::EndDockingEvent& e ) override;
+ virtual sal_Bool SAL_CALL prepareToggleFloatingMode( const css::lang::EventObject& e ) override;
+ virtual void SAL_CALL toggleFloatingMode( const css::lang::EventObject& e ) override;
+ virtual void SAL_CALL closed( const css::lang::EventObject& e ) override;
+ virtual void SAL_CALL endPopupMode( const css::awt::EndPopupModeEvent& e ) override;
+
+ // XUIConfigurationListener
+ virtual void SAL_CALL elementInserted( const css::ui::ConfigurationEvent& Event ) override;
+ virtual void SAL_CALL elementRemoved( const css::ui::ConfigurationEvent& Event ) override;
+ virtual void SAL_CALL elementReplaced( const css::ui::ConfigurationEvent& Event ) override;
+
+ private:
+ enum DockingOperation
+ {
+ DOCKOP_BEFORE_COLROW,
+ DOCKOP_ON_COLROW,
+ DOCKOP_AFTER_COLROW
+ };
+
+ typedef std::vector< UIElement > UIElementVector;
+ struct SingleRowColumnWindowData
+ {
+ SingleRowColumnWindowData()
+ : nVarSize(0)
+ , nStaticSize(0)
+ , nSpace(0)
+ , nRowColumn(0)
+ {}
+
+ std::vector< OUString > aUIElementNames;
+ std::vector< css::uno::Reference< css::awt::XWindow > > aRowColumnWindows;
+ std::vector< css::awt::Rectangle > aRowColumnWindowSizes;
+ std::vector< sal_Int32 > aRowColumnSpace;
+ css::awt::Rectangle aRowColumnRect;
+ sal_Int32 nVarSize;
+ sal_Int32 nStaticSize;
+ sal_Int32 nSpace;
+ sal_Int32 nRowColumn;
+ };
+
+ // internal helper methods
+
+ bool implts_isParentWindowVisible() const;
+ ::tools::Rectangle implts_calcDockingArea();
+ void implts_sortUIElements();
+ void implts_reparentToolbars();
+ OUString implts_generateGenericAddonToolbarTitle( sal_Int32 nNumber ) const;
+ void implts_setElementData( UIElement& rUIElement, const css::uno::Reference< css::awt::XDockableWindow >& rDockWindow );
+ void implts_destroyDockingAreaWindows();
+
+ // layout methods
+
+ void implts_setDockingAreaWindowSizes( const css::awt::Rectangle& rBorderSpace );
+ css::awt::Point implts_findNextCascadeFloatingPos();
+ void implts_renumberRowColumnData( css::ui::DockingArea eDockingArea, const UIElement& rUIElement );
+ void implts_calcWindowPosSizeOnSingleRowColumn( sal_Int32 nDockingArea,
+ sal_Int32 nOffset,
+ SingleRowColumnWindowData& rRowColumnWindowData,
+ const ::Size& rContainerSize );
+ void implts_setLayoutDirty();
+ void implts_setLayoutInProgress( bool bInProgress = true );
+
+ // lookup/container methods
+
+ UIElement implts_findToolbar( std::u16string_view aName );
+ UIElement implts_findToolbar( const css::uno::Reference< css::uno::XInterface >& xToolbar );
+ UIElement& impl_findToolbar( std::u16string_view aName );
+ css::uno::Reference< css::awt::XWindow > implts_getXWindow( std::u16string_view aName );
+ vcl::Window* implts_getWindow( std::u16string_view aName );
+ bool implts_insertToolbar( const UIElement& rUIElement );
+ void implts_setToolbar( const UIElement& rUIElement );
+ ::Size implts_getTopBottomDockingAreaSizes();
+ void implts_getUIElementVectorCopy( UIElementVector& rCopy );
+
+ // internal docking methods
+
+ ::tools::Rectangle implts_calcHotZoneRect( const ::tools::Rectangle& rRect, sal_Int32 nHotZoneOffset );
+ void implts_calcDockingPosSize( UIElement& aUIElement, DockingOperation& eDockOperation, ::tools::Rectangle& rTrackingRect, const Point& rMousePos );
+ DockingOperation implts_determineDockingOperation( css::ui::DockingArea DockingArea, const ::tools::Rectangle& rRowColRect, const Point& rMousePos );
+ ::tools::Rectangle implts_getWindowRectFromRowColumn( css::ui::DockingArea DockingArea, const SingleRowColumnWindowData& rRowColumnWindowData, const ::Point& rMousePos, std::u16string_view rExcludeElementName );
+ ::tools::Rectangle implts_determineFrontDockingRect( css::ui::DockingArea eDockingArea,
+ sal_Int32 nRowCol,
+ const ::tools::Rectangle& rDockedElementRect,
+ std::u16string_view rMovedElementName,
+ const ::tools::Rectangle& rMovedElementRect );
+ ::tools::Rectangle implts_calcTrackingAndElementRect( css::ui::DockingArea eDockingArea,
+ sal_Int32 nRowCol,
+ UIElement& rUIElement,
+ const ::tools::Rectangle& rTrackingRect,
+ const ::tools::Rectangle& rRowColumnRect,
+ const ::Size& rContainerWinSize );
+
+ void implts_getDockingAreaElementInfos( css::ui::DockingArea DockingArea, std::vector< SingleRowColumnWindowData >& rRowColumnsWindowData );
+ void implts_getDockingAreaElementInfoOnSingleRowCol( css::ui::DockingArea, sal_Int32 nRowCol, SingleRowColumnWindowData& rRowColumnWindowData );
+ void implts_findNextDockingPos( css::ui::DockingArea DockingArea, const ::Size& aUIElementSize, css::awt::Point& rVirtualPos, ::Point& rPixelPos );
+ void implts_setTrackingRect( css::ui::DockingArea eDockingArea, const ::Point& rMousePos, ::tools::Rectangle& rTrackingRect );
+
+ // creation methods
+
+ void implts_createAddonsToolBars();
+ void implts_createCustomToolBars();
+ void implts_createNonContextSensitiveToolBars();
+ void implts_createCustomToolBars( const css::uno::Sequence< css::uno::Sequence< css::beans::PropertyValue > >& aCustomTbxSeq );
+ void implts_createCustomToolBar( const OUString& aTbxResName, const OUString& aTitle );
+ void implts_setToolbarCreation( bool bStart = true );
+ bool implts_isToolbarCreationActive();
+
+ // persistence methods
+
+ bool implts_readWindowStateData( const OUString& aName, UIElement& rElementData );
+ void implts_writeWindowStateData( const UIElement& rElementData );
+
+ // members
+
+ css::uno::Reference< css::uno::XComponentContext > m_xContext;
+ css::uno::Reference< css::frame::XFrame > m_xFrame;
+ css::uno::Reference< css::awt::XWindow2 > m_xContainerWindow;
+ css::uno::Reference< css::awt::XWindow > m_xDockAreaWindows[DOCKINGAREAS_COUNT];
+ css::uno::Reference< css::ui::XUIElementFactory > m_xUIElementFactoryManager;
+ css::uno::Reference< css::ui::XUIConfigurationManager > m_xModuleCfgMgr;
+ css::uno::Reference< css::ui::XUIConfigurationManager > m_xDocCfgMgr;
+ css::uno::Reference< css::container::XNameAccess > m_xPersistentWindowState;
+ LayoutManager* m_pParentLayouter;
+
+ UIElementVector m_aUIElements;
+ UIElement m_aDockUIElement;
+ tools::Rectangle m_aDockingArea;
+ tools::Rectangle m_aDockingAreaOffsets;
+ DockingOperation m_eDockOperation;
+ PreviewFrameDetection m_ePreviewDetection;
+
+ std::unique_ptr<AddonsOptions> m_pAddonOptions;
+ std::unique_ptr<GlobalSettings> m_pGlobalSettings;
+
+ bool m_bComponentAttached;
+ bool m_bLayoutDirty;
+ bool m_bGlobalSettings;
+ bool m_bDockingInProgress;
+ bool m_bLayoutInProgress;
+ bool m_bToolbarCreation;
+};
+
+} // namespace framework
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */