[Libreoffice-commits] core.git: officecfg/registry sw/inc sw/sdi sw/source sw/uiconfig sw/util

James Raykowski raykowj at gmail.com
Thu Aug 10 06:44:47 UTC 2017


 officecfg/registry/data/org/openoffice/Office/UI/Controller.xcu     |   33 
 officecfg/registry/data/org/openoffice/Office/UI/WriterCommands.xcu |    4 
 sw/inc/cmdid.h                                                      |    4 
 sw/sdi/_viewsh.sdi                                                  |    9 
 sw/sdi/swriter.sdi                                                  |   38 
 sw/source/uibase/inc/workctrl.hxx                                   |    2 
 sw/source/uibase/ribbar/workctrl.cxx                                |  480 +++++++++-
 sw/source/uibase/uiview/view2.cxx                                   |   16 
 sw/source/uibase/uiview/viewstat.cxx                                |    4 
 sw/uiconfig/swriter/toolbar/findbar.xml                             |    2 
 sw/util/sw.component                                                |   12 
 11 files changed, 554 insertions(+), 50 deletions(-)

New commits:
commit 0e8208057d098f961a62efa5318a80b0d3372d2a
Author: James Raykowski <raykowj at gmail.com>
Date:   Fri Aug 4 06:48:42 2017 -0800

    tdf#79167 Change search type through a drop down control
    
    drop down control to change 'navigate by' search element
    small navigation popup relationally linked to drop down control
    dynamic tool tips added to previous and next 'navigate by' toolbar
    controls
    
    Change-Id: I4b1215b74b488f2571b529d9946f6574de6e270a
    Reviewed-on: https://gerrit.libreoffice.org/40776
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Samuel Mehrbrodt <Samuel.Mehrbrodt at cib.de>

diff --git a/officecfg/registry/data/org/openoffice/Office/UI/Controller.xcu b/officecfg/registry/data/org/openoffice/Office/UI/Controller.xcu
index 35c874fdfb1b..64fbbf30f4fc 100644
--- a/officecfg/registry/data/org/openoffice/Office/UI/Controller.xcu
+++ b/officecfg/registry/data/org/openoffice/Office/UI/Controller.xcu
@@ -441,6 +441,39 @@
       </node>
     </node>
     <node oor:name="ToolBar">
+      <node oor:name="lo.writer.ScrollToPrevious" oor:op="replace">
+        <prop oor:name="Command">
+          <value>.uno:ScrollToPrevious</value>
+        </prop>
+        <prop oor:name="Module">
+          <value/>
+        </prop>
+        <prop oor:name="Controller">
+          <value>lo.writer.PreviousScrollToolboxController</value>
+        </prop>
+      </node>
+      <node oor:name="lo.writer.ScrollToNext" oor:op="replace">
+        <prop oor:name="Command">
+          <value>.uno:ScrollToNext</value>
+        </prop>
+        <prop oor:name="Module">
+          <value/>
+        </prop>
+        <prop oor:name="Controller">
+          <value>lo.writer.NextScrollToolboxController</value>
+        </prop>
+      </node>
+      <node oor:name="lo.writer.NavElement" oor:op="replace">
+        <prop oor:name="Command">
+          <value>.uno:NavElement</value>
+        </prop>
+        <prop oor:name="Module">
+          <value/>
+        </prop>
+        <prop oor:name="Controller">
+          <value>lo.writer.NavElementToolBoxController</value>
+        </prop>
+      </node>
       <node oor:name="ZoomToolBox" oor:op="replace">
         <prop oor:name="Command">
           <value>.uno:ZoomToolBox</value>
diff --git a/officecfg/registry/data/org/openoffice/Office/UI/WriterCommands.xcu b/officecfg/registry/data/org/openoffice/Office/UI/WriterCommands.xcu
index cf0e0cb1f400..adedee8965f2 100644
--- a/officecfg/registry/data/org/openoffice/Office/UI/WriterCommands.xcu
+++ b/officecfg/registry/data/org/openoffice/Office/UI/WriterCommands.xcu
@@ -2718,9 +2718,9 @@
           <value xml:lang="en-US">Continue previous numbering</value>
         </prop>
       </node>
-      <node oor:name=".uno:NavigationPopup" oor:op="replace">
+      <node oor:name=".uno:NavElement" oor:op="replace">
         <prop oor:name="Label" oor:type="xs:string">
-          <value xml:lang="en-US">Navigate by</value>
+          <value xml:lang="en-US">Navigate By</value>
         </prop>
       </node>
       <node oor:name=".uno:ScrollToPrevious" oor:op="replace">
diff --git a/sw/inc/cmdid.h b/sw/inc/cmdid.h
index 4edb28028e82..e48346f25124 100644
--- a/sw/inc/cmdid.h
+++ b/sw/inc/cmdid.h
@@ -173,8 +173,8 @@
 #define FN_SET_MODOPT_TBLNUMFMT  (FN_VIEW + 52) /* Number recognition in tables */
 #define FN_HSCROLL_METRIC        (FN_VIEW + 53) /* Metric horizontal scrollbar */
 #define FN_VSCROLL_METRIC        (FN_VIEW + 54) /* Metric vertical scrollbar */
-// 55 is free
-#define FN_NAVIGATION_POPUP     (FN_VIEW + 56)  /* Navigation Popup */
+
+#define FN_NAV_ELEMENT          (FN_VIEW + 55)  /* Navigate By drop down controller */
 #define FN_SCROLL_PREV          (FN_VIEW + 57)  /* uno:ScrollToPrevious */
 #define FN_SCROLL_NEXT          (FN_VIEW + 58)  /* uno:ScrollToNext */
 #define FN_VIEW_HIDE_WHITESPACE (FN_VIEW + 59)  /* Hide header, footer, and pagebreak */
diff --git a/sw/sdi/_viewsh.sdi b/sw/sdi/_viewsh.sdi
index 361d6818a8b9..62e67f6b0d5c 100644
--- a/sw/sdi/_viewsh.sdi
+++ b/sw/sdi/_viewsh.sdi
@@ -67,15 +67,16 @@ interface BaseTextEditView
         ExecMethod = Execute ;
         StateMethod = NoState ;
     ]
+    FN_NAV_ELEMENT
+    [
+        ExecMethod = Execute ;
+        StateMethod = GetState ;
+    ]
     FN_SCROLL_NAVIGATION
     [
         ExecMethod = NoExec ;
         StateMethod = NoState ;
     ]
-    FN_NAVIGATION_POPUP
-    [
-        ExecMethod = Execute;
-    ]
     FN_SCROLL_PREV
     [
         ExecMethod = Execute;
diff --git a/sw/sdi/swriter.sdi b/sw/sdi/swriter.sdi
index ed71f495a8cc..999b03c166ad 100644
--- a/sw/sdi/swriter.sdi
+++ b/sw/sdi/swriter.sdi
@@ -4940,23 +4940,6 @@ SfxBoolItem ScrollNavigation FN_SCROLL_NAVIGATION
     GroupId = SfxGroupId::View;
 ]
 
-SfxVoidItem NavigationPopup FN_NAVIGATION_POPUP
-()
-[
-    AutoUpdate = FALSE,
-    FastCall = FALSE,
-    ReadOnlyDoc = TRUE,
-    Toggle = FALSE,
-    Container = FALSE,
-    RecordAbsolute = FALSE,
-    RecordPerSet;
-
-    AccelConfig = FALSE,
-    MenuConfig = FALSE,
-    ToolBoxConfig = FALSE,
-    GroupId = SfxGroupId::Navigator;
-]
-
 SfxVoidItem ScrollToPrevious FN_SCROLL_PREV
 ()
 [
@@ -4970,7 +4953,7 @@ SfxVoidItem ScrollToPrevious FN_SCROLL_PREV
 
     AccelConfig = FALSE,
     MenuConfig = FALSE,
-    ToolBoxConfig = FALSE,
+    ToolBoxConfig = TRUE,
     GroupId = SfxGroupId::Navigator;
 ]
 
@@ -4987,7 +4970,7 @@ SfxVoidItem ScrollToNext FN_SCROLL_NEXT
 
     AccelConfig = FALSE,
     MenuConfig = FALSE,
-    ToolBoxConfig = FALSE,
+    ToolBoxConfig = TRUE,
     GroupId = SfxGroupId::Navigator;
 ]
 
@@ -7613,3 +7596,20 @@ SfxUInt16Item JumpToSpecificPage SID_JUMP_TO_SPECIFIC_PAGE
     ToolBoxConfig = TRUE,
     GroupId = SfxGroupId::Navigator;
 ]
+
+SfxVoidItem NavElement FN_NAV_ELEMENT
+
+[
+    AutoUpdate = TRUE,
+    FastCall = FALSE,
+    ReadOnlyDoc = FALSE,
+    Toggle = FALSE,
+    Container = FALSE,
+    RecordAbsolute = FALSE,
+    RecordPerSet;
+
+    AccelConfig = FALSE,
+    MenuConfig = FALSE,
+    ToolBoxConfig = TRUE,
+    GroupId = SfxGroupId::Navigator;
+]
diff --git a/sw/source/uibase/inc/workctrl.hxx b/sw/source/uibase/inc/workctrl.hxx
index 64f93e9ace5d..8ed649b63a69 100644
--- a/sw/source/uibase/inc/workctrl.hxx
+++ b/sw/source/uibase/inc/workctrl.hxx
@@ -104,6 +104,8 @@ public:
     static OUString     GetToolTip(bool bNext);
 
     void                GrabFocus() { m_pToolBox->GrabFocus(); }
+
+    virtual void statusChanged( const css::frame::FeatureStateEvent& rEvent ) override;
 };
 
 class SwPreviewZoomControl : public SfxToolBoxControl
diff --git a/sw/source/uibase/ribbar/workctrl.cxx b/sw/source/uibase/ribbar/workctrl.cxx
index d8bb9811fe9a..2e39915a9743 100644
--- a/sw/source/uibase/ribbar/workctrl.cxx
+++ b/sw/source/uibase/ribbar/workctrl.cxx
@@ -49,6 +49,7 @@
 #include <svx/dialogs.hrc>
 #include <svx/strings.hrc>
 #include "bitmaps.hlst"
+#include <toolkit/helper/vclunohelper.hxx>
 
 // Size check
 #define NAVI_ENTRIES 20
@@ -345,6 +346,8 @@ SwScrollNaviPopup::SwScrollNaviPopup(sal_uInt16 nId, const Reference< XFrame >&
     m_pToolBox->SetSelectHdl(LINK(this, SwScrollNaviPopup, SelectHdl));
     m_pToolBox->StartSelection();
     m_pToolBox->Show();
+
+    AddStatusListener(".uno:NavElement");
 }
 
 SwScrollNaviPopup::~SwScrollNaviPopup()
@@ -364,16 +367,10 @@ IMPL_LINK(SwScrollNaviPopup, SelectHdl, ToolBox*, pSet, void)
     sal_uInt16 nSet = pSet->GetCurItemId();
     if( nSet != NID_PREV && nSet != NID_NEXT )
     {
-        SwView::SetMoveType(nSet);
-        m_pToolBox->SetItemText(NID_NEXT, sQuickHelp[nSet - NID_START]);
-        m_pToolBox->SetItemText(NID_PREV, sQuickHelp[nSet - NID_START + NID_COUNT]);
-        m_pInfoField->SetText(m_pToolBox->GetItemText(nSet));
-        // check the current button only
-        for(ToolBox::ImplToolItems::size_type i = 0; i < NID_COUNT; i++)
-        {
-            sal_uInt16 nItemId = m_pToolBox->GetItemId( i );
-            m_pToolBox->CheckItem( nItemId, nItemId == nSet );
-        }
+        SwView::SetMoveType( nSet );
+        Sequence< PropertyValue > aArgs;
+        SfxToolBoxControl::Dispatch( Reference< XDispatchProvider >( GetFrame()->getController(), UNO_QUERY ),
+                                     ".uno:NavElement", aArgs );
     }
     else
     {
@@ -416,10 +413,27 @@ OUString SwScrollNaviPopup::GetToolTip(bool bNext)
     sal_uInt16 nResId = SwView::GetMoveType();
     if (!bNext)
         nResId += NID_COUNT;
-    const char* id = STR_IMGBTN_ARY[nResId];
+    const char* id = STR_IMGBTN_ARY[nResId - NID_START];
     return id ? SwResId(id): OUString();
 }
 
+void SwScrollNaviPopup::statusChanged( const css::frame::FeatureStateEvent& rEvent )
+{
+    if ( rEvent.FeatureURL.Path == "NavElement" )
+    {
+        sal_uInt16 nSet = SwView::GetMoveType();
+        m_pToolBox->SetItemText( NID_NEXT, sQuickHelp[nSet - NID_START] );
+        m_pToolBox->SetItemText( NID_PREV, sQuickHelp[nSet - NID_START + NID_COUNT] );
+        m_pInfoField->SetText( m_pToolBox->GetItemText( nSet ) );
+        // check the current button only
+        for( ToolBox::ImplToolItems::size_type i = 0; i < NID_COUNT; i++ )
+        {
+            sal_uInt16 nItemId = m_pToolBox->GetItemId( i );
+            m_pToolBox->CheckItem( nItemId, nItemId == nSet );
+        }
+    }
+}
+
 class SwZoomBox_Impl : public ComboBox
 {
     sal_uInt16          nSlotId;
@@ -636,4 +650,448 @@ VclPtr<vcl::Window> SwJumpToSpecificPageControl::CreateItemWindow( vcl::Window *
     return pRet.get();
 }
 
+class NavElementBox_Impl;
+class NavElementToolBoxControl : public svt::ToolboxController,
+                                 public lang::XServiceInfo
+{
+    public:
+        explicit NavElementToolBoxControl(
+            const css::uno::Reference< css::uno::XComponentContext >& rServiceManager );
+
+        // XInterface
+        virtual css::uno::Any SAL_CALL queryInterface( const css::uno::Type& aType ) override;
+        virtual void SAL_CALL acquire() throw () override;
+        virtual void SAL_CALL release() throw () override;
+
+        // XServiceInfo
+        virtual OUString SAL_CALL getImplementationName() override;
+        virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override;
+        virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override;
+
+        // XComponent
+        virtual void SAL_CALL dispose() override;
+
+        // XStatusListener
+        virtual void SAL_CALL statusChanged( const css::frame::FeatureStateEvent& Event ) override;
+
+        // XToolbarController
+        virtual void SAL_CALL execute( sal_Int16 KeyModifier ) override;
+        virtual void SAL_CALL click() override;
+        virtual void SAL_CALL doubleClick() override;
+        virtual css::uno::Reference< css::awt::XWindow > SAL_CALL createPopupWindow() override;
+        virtual css::uno::Reference< css::awt::XWindow > SAL_CALL createItemWindow( const css::uno::Reference< css::awt::XWindow >& Parent ) override;
+
+        void dispatchCommand( const css::uno::Sequence< css::beans::PropertyValue >& rArgs );
+        using svt::ToolboxController::dispatchCommand;
+
+    private:
+        VclPtr<NavElementBox_Impl>           m_pBox;
+};
+
+class NavElementBox_Impl : public ListBox
+{
+public:
+                        NavElementBox_Impl( vcl::Window* pParent,
+                                             const uno::Reference< frame::XFrame >& _xFrame,
+                                             NavElementToolBoxControl& rCtrl );
+
+    void                Update();
+
+    virtual bool        EventNotify( NotifyEvent& rNEvt ) override;
+
+protected:
+    virtual void        Select() override;
+
+private:
+    NavElementToolBoxControl*                  m_pCtrl;
+    bool                                       m_bRelease;
+    uno::Reference< frame::XFrame >            m_xFrame;
+
+    void                ReleaseFocus_Impl();
+};
+
+NavElementBox_Impl::NavElementBox_Impl(
+    vcl::Window*                                      _pParent,
+    const uno::Reference< frame::XFrame >&            _xFrame,
+    NavElementToolBoxControl&                         _rCtrl ) :
+
+    ListBox( _pParent, WinBits( WB_DROPDOWN ) ),
+
+    m_pCtrl             ( &_rCtrl ),
+    m_bRelease          ( true ),
+    m_xFrame            ( _xFrame )
+{
+    SetSizePixel( Size( 150, 260 ) );
+
+    sal_uInt16 i;
+    for ( i = 0; i < NID_COUNT; i++ )
+    {
+        sal_uInt16 nNaviId = aNavigationInsertIds[i];
+        if ( ( NID_PREV != nNaviId ) && ( NID_NEXT != nNaviId ) )
+            InsertEntry( SwResId( aNavigationStrIds[i] ), Image( BitmapEx( aNavigationImgIds[i] ) ) );
+    }
+}
+
+void NavElementBox_Impl::ReleaseFocus_Impl()
+{
+    if ( !m_bRelease )
+    {
+        m_bRelease = true;
+        return;
+    }
+
+    if ( m_xFrame.is() && m_xFrame->getContainerWindow().is() )
+        m_xFrame->getContainerWindow()->setFocus();
+}
+
+void NavElementBox_Impl::Select()
+{
+    ListBox::Select();
+
+    if ( !IsTravelSelect() )
+    {
+        sal_uInt16 nPos = GetSelectEntryPos();
+        // adjust array index for Ids after NID_PREV in aNavigationInsterIds
+        if ( nPos >= NID_COUNT/2 - 1 )
+            ++nPos;
+
+        sal_uInt16 nMoveType = aNavigationInsertIds[nPos];
+        SwView::SetMoveType( nMoveType );
+
+        css::uno::Sequence< css::beans::PropertyValue > aArgs;
+
+        /*  #i33380# DR 2004-09-03 Moved the following line above the Dispatch() call.
+            This instance may be deleted in the meantime (i.e. when a dialog is opened
+            while in Dispatch()), accessing members will crash in this case. */
+        ReleaseFocus_Impl();
+
+        m_pCtrl->dispatchCommand( aArgs );
+    }
+}
+
+void NavElementBox_Impl::Update()
+{
+    sal_uInt16 nMoveType = SwView::GetMoveType();
+    sal_uInt16 i;
+    for ( i = 0; i < SAL_N_ELEMENTS( aNavigationInsertIds ); ++i )
+    {
+        if ( nMoveType == aNavigationInsertIds[i] )
+        {
+            const char* id = aNavigationStrIds[i];
+            OUString sText = SwResId( id );
+            SelectEntry( sText );
+            break;
+        }
+    }
+}
+
+bool NavElementBox_Impl::EventNotify( NotifyEvent& rNEvt )
+{
+    bool bHandled = false;
+
+    if ( rNEvt.GetType() == MouseNotifyEvent::KEYINPUT )
+    {
+        sal_uInt16 nCode = rNEvt.GetKeyEvent()->GetKeyCode().GetCode();
+
+        switch ( nCode )
+        {
+            case KEY_RETURN:
+            case KEY_TAB:
+            {
+                if ( KEY_TAB == nCode )
+                    m_bRelease = false;
+                else
+                    bHandled = true;
+                Select();
+                break;
+            }
+
+            case KEY_ESCAPE:
+                ReleaseFocus_Impl();
+                bHandled = true;
+                break;
+        }
+    }
+    else if( MouseNotifyEvent::LOSEFOCUS == rNEvt.GetType() )
+    {
+    }
+
+    return bHandled || ListBox::EventNotify( rNEvt );
+}
+
+NavElementToolBoxControl::NavElementToolBoxControl( const uno::Reference< uno::XComponentContext >& rxContext )
+ : svt::ToolboxController( rxContext,
+                           uno::Reference< frame::XFrame >(),
+                           ".uno:NavElement" ),
+   m_pBox( nullptr )
+{
+}
+
+// XInterface
+css::uno::Any SAL_CALL NavElementToolBoxControl::queryInterface( const css::uno::Type& aType )
+{
+    uno::Any a = ToolboxController::queryInterface( aType );
+    if ( a.hasValue() )
+        return a;
+
+    return ::cppu::queryInterface( aType, static_cast< lang::XServiceInfo* >( this ) );
+}
+
+void SAL_CALL NavElementToolBoxControl::acquire() throw ()
+{
+    ToolboxController::acquire();
+}
+
+void SAL_CALL NavElementToolBoxControl::release() throw ()
+{
+    ToolboxController::release();
+}
+
+// XServiceInfo
+sal_Bool SAL_CALL NavElementToolBoxControl::supportsService( const OUString& ServiceName )
+{
+    return cppu::supportsService( this, ServiceName );
+}
+
+OUString SAL_CALL NavElementToolBoxControl::getImplementationName()
+{
+    return OUString("lo.writer.NavElementToolBoxController");
+}
+
+uno::Sequence< OUString > SAL_CALL NavElementToolBoxControl::getSupportedServiceNames()
+{
+    uno::Sequence<OUString> aSNS { "com.sun.star.frame.ToolbarController" };
+    return aSNS;
+}
+
+// XComponent
+void SAL_CALL NavElementToolBoxControl::dispose()
+{
+    svt::ToolboxController::dispose();
+
+    SolarMutexGuard aSolarMutexGuard;
+    m_pBox.disposeAndClear();
+}
+
+// XStatusListener
+void SAL_CALL NavElementToolBoxControl::statusChanged( const frame::FeatureStateEvent& rEvent )
+{
+    if ( m_pBox )
+    {
+        SolarMutexGuard aSolarMutexGuard;
+        if ( rEvent.FeatureURL.Path == "NavElement" )
+        {
+            if ( rEvent.IsEnabled )
+            {
+                m_pBox->Enable();
+                m_pBox->Update();
+            }
+            else
+                m_pBox->Disable();
+        }
+    }
+}
+
+// XToolbarController
+void SAL_CALL NavElementToolBoxControl::execute( sal_Int16 /*KeyModifier*/ )
+{
+}
+
+void SAL_CALL NavElementToolBoxControl::click()
+{
+}
+
+void SAL_CALL NavElementToolBoxControl::doubleClick()
+{
+}
+
+uno::Reference< awt::XWindow > SAL_CALL NavElementToolBoxControl::createPopupWindow()
+{
+    return uno::Reference< awt::XWindow >();
+}
+
+uno::Reference< awt::XWindow > SAL_CALL NavElementToolBoxControl::createItemWindow(
+    const uno::Reference< awt::XWindow >& xParent )
+{
+    uno::Reference< awt::XWindow > xItemWindow;
+
+    VclPtr<vcl::Window> pParent = VCLUnoHelper::GetWindow( xParent );
+    if ( pParent )
+    {
+        SolarMutexGuard aSolarMutexGuard;
+        m_pBox = VclPtr<NavElementBox_Impl>::Create( pParent, m_xFrame, *this );
+        xItemWindow = VCLUnoHelper::GetInterface( m_pBox );
+    }
+
+    uno::Reference< util::XURLTransformer > xURLTransformer = getURLTransformer();
+
+    return xItemWindow;
+}
+
+void NavElementToolBoxControl::dispatchCommand(
+    const uno::Sequence< beans::PropertyValue >& rArgs )
+{
+    uno::Reference< frame::XDispatchProvider > xDispatchProvider( m_xFrame, uno::UNO_QUERY );
+    if ( xDispatchProvider.is() )
+    {
+        util::URL                               aURL;
+        uno::Reference< frame::XDispatch >      xDispatch;
+        uno::Reference< util::XURLTransformer > xURLTransformer = getURLTransformer();
+
+        aURL.Complete = ".uno:NavElement";
+        xURLTransformer->parseStrict( aURL );
+        xDispatch = xDispatchProvider->queryDispatch( aURL, OUString(), 0 );
+        if ( xDispatch.is() )
+            xDispatch->dispatch( aURL, rArgs );
+    }
+}
+
+extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface * SAL_CALL
+lo_writer_NavElementToolBoxController_get_implementation(
+    css::uno::XComponentContext *rxContext,
+    css::uno::Sequence<css::uno::Any> const &)
+{
+    return cppu::acquire( new NavElementToolBoxControl( rxContext ) );
+}
+
+class PrevNextScrollToolboxController : public svt::ToolboxController,
+                                      public css::lang::XServiceInfo
+{
+public:
+    enum Type { PREVIOUS, NEXT };
+
+    PrevNextScrollToolboxController( const css::uno::Reference< css::uno::XComponentContext >& rxContext, Type eType );
+
+    // XInterface
+    virtual css::uno::Any SAL_CALL queryInterface( const css::uno::Type& aType ) override;
+    virtual void SAL_CALL acquire() throw () override;
+    virtual void SAL_CALL release() throw () override;
+
+    // XServiceInfo
+    virtual OUString SAL_CALL getImplementationName() override;
+    virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override;
+    virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override;
+
+    // XComponent
+    virtual void SAL_CALL dispose() override;
+
+    // XToolbarController
+    virtual void SAL_CALL execute( sal_Int16 /* KeyModifier */ ) override;
+    virtual void SAL_CALL click() override;
+
+    // XStatusListener
+    virtual void SAL_CALL statusChanged( const css::frame::FeatureStateEvent& rEvent ) override;
+
+private:
+    Type                     meType;
+};
+
+PrevNextScrollToolboxController::PrevNextScrollToolboxController( const css::uno::Reference< css::uno::XComponentContext > & rxContext, Type eType )
+    : svt::ToolboxController( rxContext,
+            css::uno::Reference< css::frame::XFrame >(),
+            (eType == PREVIOUS) ? OUString( ".uno:ScrollToPrevious" ): OUString( ".uno:ScrollToNext" ) ),
+      meType( eType )
+{
+    addStatusListener(".uno:NavElement");
+}
+
+// XInterface
+css::uno::Any SAL_CALL PrevNextScrollToolboxController::queryInterface( const css::uno::Type& aType )
+{
+    css::uno::Any a = ToolboxController::queryInterface( aType );
+    if ( a.hasValue() )
+        return a;
+
+    return ::cppu::queryInterface( aType, static_cast< css::lang::XServiceInfo* >( this ) );
+}
+
+void SAL_CALL PrevNextScrollToolboxController::acquire() throw ()
+{
+    ToolboxController::acquire();
+}
+
+void SAL_CALL PrevNextScrollToolboxController::release() throw ()
+{
+    ToolboxController::release();
+}
+
+// XServiceInfo
+OUString SAL_CALL PrevNextScrollToolboxController::getImplementationName()
+{
+    return meType == PrevNextScrollToolboxController::PREVIOUS?
+        OUString( "lo.writer.PreviousScrollToolboxController" ) :
+        OUString( "lo.writer.NextScrollToolboxController" );
+}
+
+sal_Bool SAL_CALL PrevNextScrollToolboxController::supportsService( const OUString& ServiceName )
+{
+    return cppu::supportsService(this, ServiceName);
+}
+
+css::uno::Sequence< OUString > SAL_CALL PrevNextScrollToolboxController::getSupportedServiceNames()
+{
+    return { "com.sun.star.frame.ToolbarController" };
+}
+
+// XComponent
+void SAL_CALL PrevNextScrollToolboxController::dispose()
+{
+    SolarMutexGuard aSolarMutexGuard;
+
+    svt::ToolboxController::dispose();
+}
+
+// XToolbarController
+void SAL_CALL PrevNextScrollToolboxController::execute( sal_Int16 /* KeyModifier */ )
+{
+}
+
+void SAL_CALL PrevNextScrollToolboxController::click()
+{
+    uno::Sequence< beans::PropertyValue > rArgs;
+
+    uno::Reference< frame::XDispatchProvider > xDispatchProvider( m_xFrame, uno::UNO_QUERY );
+    if ( xDispatchProvider.is() )
+    {
+        util::URL                               aURL;
+        uno::Reference< frame::XDispatch >      xDispatch;
+        uno::Reference< util::XURLTransformer > xURLTransformer = getURLTransformer();
+
+        aURL.Complete = getCommandURL();
+        xURLTransformer->parseStrict( aURL );
+        xDispatch = xDispatchProvider->queryDispatch( aURL, OUString(), 0 );
+        if ( xDispatch.is() )
+            xDispatch->dispatch( aURL, rArgs );
+    }
+}
+
+// XStatusListener
+void SAL_CALL PrevNextScrollToolboxController::statusChanged( const css::frame::FeatureStateEvent& rEvent )
+{
+    if ( rEvent.FeatureURL.Path == "NavElement" )
+    {
+        ToolBox* pToolBox = nullptr;
+        sal_uInt16 nId = 0;
+        if ( getToolboxId( nId, &pToolBox ) )
+            pToolBox->SetQuickHelpText( nId, ( meType == PrevNextScrollToolboxController::PREVIOUS?SwScrollNaviPopup::GetToolTip( false ):
+                                                                                                   SwScrollNaviPopup::GetToolTip( true ) ) );
+    }
+}
+
+extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface * SAL_CALL
+lo_writer_PreviousScrollToolboxController_get_implementation(
+    css::uno::XComponentContext *context,
+    css::uno::Sequence<css::uno::Any> const &)
+{
+    return cppu::acquire( new PrevNextScrollToolboxController( context, PrevNextScrollToolboxController::PREVIOUS ) );
+}
+
+extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface * SAL_CALL
+lo_writer_NextScrollToolboxController_get_implementation(
+    css::uno::XComponentContext *context,
+    css::uno::Sequence<css::uno::Any> const &)
+{
+    return cppu::acquire( new PrevNextScrollToolboxController( context, PrevNextScrollToolboxController::NEXT ) );
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/uibase/uiview/view2.cxx b/sw/source/uibase/uiview/view2.cxx
index ceedd12dd57b..1aa16d537050 100644
--- a/sw/source/uibase/uiview/view2.cxx
+++ b/sw/source/uibase/uiview/view2.cxx
@@ -1011,6 +1011,11 @@ void SwView::Execute(SfxRequest &rReq)
             lcl_SetAllTextToDefaultLanguage( *m_pWrtShell, RES_CHRATR_CJK_LANGUAGE );
         }
         break;
+        case FN_NAV_ELEMENT:
+        {
+            // nothing here on purpose - if removed only the listbox that changed is changed
+        }
+        break;
         case FN_SCROLL_PREV:
         case FN_SCROLL_NEXT:
         {
@@ -1022,17 +1027,6 @@ void SwView::Execute(SfxRequest &rReq)
             Application::PostUserEvent( LINK(this, SwView, MoveNavigationHdl), pbNext );
         }
         break;
-        case FN_NAVIGATION_POPUP:
-        {
-            // First make sure that the sidebar is visible
-            GetViewFrame()->ShowChildWindow(SID_SIDEBAR);
-
-            ::sfx2::sidebar::Sidebar::ShowPanel(
-                "SwNavigatorPanel",
-                GetViewFrame()->GetFrame().GetFrameInterface());
-
-        }
-        break;
         case SID_JUMPTOMARK:
             if( pArgs && SfxItemState::SET == pArgs->GetItemState(SID_JUMPTOMARK, false, &pItem))
                 JumpToSwMark( static_cast<const SfxStringItem*>(pItem)->GetValue() );
diff --git a/sw/source/uibase/uiview/viewstat.cxx b/sw/source/uibase/uiview/viewstat.cxx
index 522503c58b56..e5387497133d 100644
--- a/sw/source/uibase/uiview/viewstat.cxx
+++ b/sw/source/uibase/uiview/viewstat.cxx
@@ -77,6 +77,10 @@ void SwView::GetState(SfxItemSet &rSet)
     {
         switch(nWhich)
         {
+        case FN_NAV_ELEMENT:
+            // used to update all instances of this control
+            rSet.InvalidateItem( nWhich );
+        break;
         case FN_EDIT_LINK_DLG:
             if( m_pWrtShell->GetLinkManager().GetLinks().empty() )
                 rSet.DisableItem(nWhich);
diff --git a/sw/uiconfig/swriter/toolbar/findbar.xml b/sw/uiconfig/swriter/toolbar/findbar.xml
index 7305b61d01e8..733055ba688e 100644
--- a/sw/uiconfig/swriter/toolbar/findbar.xml
+++ b/sw/uiconfig/swriter/toolbar/findbar.xml
@@ -27,7 +27,7 @@
   <toolbar:toolbarseparator/>
   <toolbar:toolbaritem xlink:href=".uno:SearchDialog"/>
   <toolbar:toolbarseparator/>
-  <toolbar:toolbaritem xlink:href=".uno:NavigationPopup"/>
+  <toolbar:toolbaritem xlink:href=".uno:NavElement"/>
   <toolbar:toolbaritem xlink:href=".uno:ScrollToPrevious"/>
   <toolbar:toolbaritem xlink:href=".uno:ScrollToNext"/>
   <toolbar:toolbarseparator/>
diff --git a/sw/util/sw.component b/sw/util/sw.component
index c069d632ecbe..1bbc6766d913 100644
--- a/sw/util/sw.component
+++ b/sw/util/sw.component
@@ -18,6 +18,18 @@
  -->
 <component loader="com.sun.star.loader.SharedLibrary" environment="@CPPU_ENV@"
     prefix="sw" xmlns="http://openoffice.org/2010/uno-components">
+  <implementation name="lo.writer.NavElementToolBoxController"
+      constructor="lo_writer_NavElementToolBoxController_get_implementation">
+    <service name="com.sun.star.frame.ToolbarController"/>
+  </implementation>
+  <implementation name="lo.writer.PreviousScrollToolboxController"
+      constructor="lo_writer_PreviousScrollToolboxController_get_implementation">
+    <service name="com.sun.star.frame.ToolbarController"/>
+  </implementation>
+  <implementation name="lo.writer.NextScrollToolboxController"
+      constructor="lo_writer_NextScrollToolboxController_get_implementation">
+    <service name="com.sun.star.frame.ToolbarController"/>
+  </implementation>
   <implementation name="SwXAutoTextContainer"
       constructor="SwXAutoTextContainer_get_implementation">
     <service name="com.sun.star.text.AutoTextContainer"/>


More information about the Libreoffice-commits mailing list