From f2fd2019b37d1a3fabffab46c476c552f0ec6c25 Mon Sep 17 00:00:00 2001 From: Maxim Monastirsky Date: Tue, 12 Apr 2016 20:27:20 +0300 Subject: Yet another SaveToolbarController refactoring Nothing changed for the end user. Change-Id: Ib5833ae81e94a7cc9aa9ac0eba29702364ea755c --- .../source/uielement/popuptoolbarcontroller.cxx | 83 ++++++++++++---------- 1 file changed, 44 insertions(+), 39 deletions(-) (limited to 'framework/source') diff --git a/framework/source/uielement/popuptoolbarcontroller.cxx b/framework/source/uielement/popuptoolbarcontroller.cxx index 4575f2175429..91e1a514e7ae 100644 --- a/framework/source/uielement/popuptoolbarcontroller.cxx +++ b/framework/source/uielement/popuptoolbarcontroller.cxx @@ -328,6 +328,9 @@ public: // XInitialization virtual void SAL_CALL initialize( const css::uno::Sequence< css::uno::Any >& aArguments ) throw ( css::uno::Exception, css::uno::RuntimeException, std::exception ) override; + // XUpdatable + virtual void SAL_CALL update() throw ( css::uno::RuntimeException, std::exception ) override; + // XSubToolbarController // Ugly HACK to cause ToolBarManager ask our controller for updated image, in case of icon theme change. virtual sal_Bool SAL_CALL opensSubToolbar() throw ( css::uno::RuntimeException, std::exception ) override; @@ -353,15 +356,17 @@ public: virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() throw ( css::uno::RuntimeException ) override; private: - bool m_bSplitButton; - TriState m_eModified; + bool m_bSaveAsModeAllowed; + bool m_bSaveAsModeActive; + bool m_bModified; css::uno::Reference< css::util::XModifiable > m_xModifiable; }; SaveToolbarController::SaveToolbarController( const css::uno::Reference< css::uno::XComponentContext >& rxContext ) : ImplInheritanceHelper( rxContext, ".uno:SaveAsMenu" ) - , m_bSplitButton( true ) - , m_eModified( TRISTATE_FALSE ) + , m_bSaveAsModeAllowed( true ) + , m_bSaveAsModeActive( false ) + , m_bModified( false ) { } @@ -374,9 +379,32 @@ void SaveToolbarController::initialize( const css::uno::Sequence< css::uno::Any sal_uInt16 nId = 0; if ( getToolboxId( nId, &pToolBox ) && pToolBox->GetItemCommand( nId ) != m_aCommandURL ) { - m_bSplitButton = false; + m_bSaveAsModeAllowed = false; pToolBox->SetItemBits( nId, pToolBox->GetItemBits( nId ) & ~ ToolBoxItemBits::DROPDOWN ); } + + css::uno::Reference< css::frame::XController > xController( m_xFrame->getController(), css::uno::UNO_QUERY ); + if ( xController.is() ) + m_xModifiable.set( xController->getModel(), css::uno::UNO_QUERY ); + + if ( !m_xModifiable.is() ) + { + // Can be in table/query design. + m_bSaveAsModeAllowed = false; + m_xModifiable.set( xController, css::uno::UNO_QUERY ); + } +} + +void SaveToolbarController::update() + throw ( css::uno::RuntimeException, std::exception ) +{ + PopupMenuToolbarController::update(); + + if ( m_xModifiable.is() ) + { + m_xModifiable->addModifyListener( this ); + modified( css::lang::EventObject() ); + } } sal_Bool SaveToolbarController::opensSubToolbar() @@ -408,11 +436,11 @@ void SaveToolbarController::updateImage() bool bLargeIcons = pToolBox->GetToolboxButtonSize() == TOOLBOX_BUTTONSIZE_LARGE; Image aImage; - if ( m_bSplitButton && m_eModified == TRISTATE_INDET ) + if ( m_bSaveAsModeActive ) { aImage = vcl::CommandInfoProvider::Instance().GetImageForCommand( ".uno:SaveAs", bLargeIcons, m_xFrame ); } - else if ( m_eModified == TRISTATE_TRUE ) + else if ( m_bModified ) { Image aResImage( bLargeIcons ? FwkResId( IMG_SAVEMODIFIED_LARGE ) : FwkResId( IMG_SAVEMODIFIED_SMALL ) ); aImage = aResImage; @@ -433,52 +461,29 @@ void SaveToolbarController::statusChanged( const css::frame::FeatureStateEvent& if ( !getToolboxId( nId, &pToolBox ) ) return; - css::uno::Reference< css::frame::XModel > xModel; - css::uno::Reference< css::frame::XController > xController( m_xFrame->getController(), css::uno::UNO_QUERY ); - if ( xController.is() ) - xModel.set( xController->getModel(), css::uno::UNO_QUERY ); - - if ( !m_xModifiable.is() ) - { - m_xModifiable.set( xModel, css::uno::UNO_QUERY ); - - if ( !m_xModifiable.is() ) - // Can be in table/query design. - m_xModifiable.set( xController, css::uno::UNO_QUERY ); - - if ( m_xModifiable.is() ) - m_xModifiable->addModifyListener( this ); - } - - m_eModified = m_xModifiable.is() && m_xModifiable->isModified() ? TRISTATE_TRUE : TRISTATE_FALSE; - - // xModel is nullptr in table/query design, so use that to exclude them from - // the save as only mode, as they disable also the save as command when not in - // edit mode, or with empty table/query. - if ( m_bSplitButton && xModel.is() ) + if ( m_bSaveAsModeAllowed ) { pToolBox->SetQuickHelpText( nId, vcl::CommandInfoProvider::Instance().GetTooltipForCommand( rEvent.IsEnabled ? m_aCommandURL : OUString( ".uno:SaveAs" ), m_xFrame ) ); pToolBox->SetItemBits( nId, pToolBox->GetItemBits( nId ) & ~( rEvent.IsEnabled ? ToolBoxItemBits::DROPDOWNONLY : ToolBoxItemBits::DROPDOWN ) ); pToolBox->SetItemBits( nId, pToolBox->GetItemBits( nId ) | ( rEvent.IsEnabled ? ToolBoxItemBits::DROPDOWN : ToolBoxItemBits::DROPDOWNONLY ) ); - if ( !rEvent.IsEnabled ) - m_eModified = TRISTATE_INDET; + if ( m_bSaveAsModeActive == rEvent.IsEnabled ) + { + m_bSaveAsModeActive = !rEvent.IsEnabled; + updateImage(); + } } else pToolBox->EnableItem( nId, rEvent.IsEnabled ); - - updateImage(); } void SaveToolbarController::modified( const css::lang::EventObject& /*rEvent*/ ) throw ( css::uno::RuntimeException, std::exception ) { - TriState eModified = m_xModifiable->isModified() ? TRISTATE_TRUE : TRISTATE_FALSE; - if ( eModified != m_eModified && TRISTATE_INDET != m_eModified ) - { - m_eModified = eModified; + bool bLastModified = m_bModified; + m_bModified = m_xModifiable->isModified(); + if ( bLastModified != m_bModified ) updateImage(); - } } void SaveToolbarController::disposing( const css::lang::EventObject& rEvent ) -- cgit