Merge toolbar popup classes
Now that all popups are welded. Change-Id: I5ad8a4eb6b9512ea9dd075b56d0ae6ee201fff19 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/100597 Tested-by: Jenkins Reviewed-by: Maxim Monastirsky <momonasmon@gmail.com>
This commit is contained in:
@@ -33,45 +33,7 @@ namespace com :: sun :: star :: frame { class XFrame; }
|
|||||||
namespace com :: sun :: star :: frame { struct FeatureStateEvent; }
|
namespace com :: sun :: star :: frame { struct FeatureStateEvent; }
|
||||||
namespace svt { class FrameStatusListener; }
|
namespace svt { class FrameStatusListener; }
|
||||||
|
|
||||||
namespace svtools {
|
class SVT_DLLPUBLIC WeldToolbarPopup
|
||||||
|
|
||||||
class SVT_DLLPUBLIC ToolbarPopupBase
|
|
||||||
{
|
|
||||||
friend class ToolbarPopupStatusListener;
|
|
||||||
public:
|
|
||||||
ToolbarPopupBase(const css::uno::Reference<css::frame::XFrame>& rFrame);
|
|
||||||
virtual ~ToolbarPopupBase();
|
|
||||||
|
|
||||||
protected:
|
|
||||||
void AddStatusListener( const OUString& rCommandURL );
|
|
||||||
|
|
||||||
// Forwarded from XStatusListener (subclasses must override this one to get the status updates):
|
|
||||||
/// @throws css::uno::RuntimeException
|
|
||||||
virtual void statusChanged(const css::frame::FeatureStateEvent& Event );
|
|
||||||
|
|
||||||
css::uno::Reference<css::frame::XFrame> mxFrame;
|
|
||||||
rtl::Reference<svt::FrameStatusListener> mxStatusListener;
|
|
||||||
};
|
|
||||||
|
|
||||||
class UNLESS_MERGELIBS(SVT_DLLPUBLIC) ToolbarPopup : public DockingWindow, public ToolbarPopupBase
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
ToolbarPopup(const css::uno::Reference<css::frame::XFrame>& rFrame,
|
|
||||||
vcl::Window* pParentWindow,
|
|
||||||
const OString& rID, const OUString& rUIXMLDescription );
|
|
||||||
virtual ~ToolbarPopup() override;
|
|
||||||
virtual void dispose() override;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
void EndPopupMode();
|
|
||||||
|
|
||||||
private:
|
|
||||||
void init();
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace svtools
|
|
||||||
|
|
||||||
class SVT_DLLPUBLIC WeldToolbarPopup : public svtools::ToolbarPopupBase
|
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
DECL_LINK(FocusHdl, weld::Widget&, void);
|
DECL_LINK(FocusHdl, weld::Widget&, void);
|
||||||
@@ -80,14 +42,20 @@ protected:
|
|||||||
std::unique_ptr<weld::Builder> m_xBuilder;
|
std::unique_ptr<weld::Builder> m_xBuilder;
|
||||||
std::unique_ptr<weld::Container> m_xTopLevel;
|
std::unique_ptr<weld::Container> m_xTopLevel;
|
||||||
std::unique_ptr<weld::Container> m_xContainer;
|
std::unique_ptr<weld::Container> m_xContainer;
|
||||||
|
css::uno::Reference<css::frame::XFrame> m_xFrame;
|
||||||
|
rtl::Reference<svt::FrameStatusListener> m_xStatusListener;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
WeldToolbarPopup(const css::uno::Reference<css::frame::XFrame>& rFrame,
|
WeldToolbarPopup(const css::uno::Reference<css::frame::XFrame>& rFrame,
|
||||||
weld::Widget* pParent, const OUString& rUIFile, const OString& rId);
|
weld::Widget* pParent, const OUString& rUIFile, const OString& rId);
|
||||||
virtual ~WeldToolbarPopup() override;
|
virtual ~WeldToolbarPopup();
|
||||||
weld::Container* getTopLevel() { return m_xTopLevel.get(); }
|
weld::Container* getTopLevel() { return m_xTopLevel.get(); }
|
||||||
weld::Container* getContainer() { return m_xContainer.get(); }
|
weld::Container* getContainer() { return m_xContainer.get(); }
|
||||||
|
void AddStatusListener(const OUString& rCommandURL);
|
||||||
|
|
||||||
|
// Forwarded from XStatusListener (subclasses must override this one to get the status updates):
|
||||||
|
/// @throws css::uno::RuntimeException
|
||||||
|
virtual void statusChanged(const css::frame::FeatureStateEvent& Event);
|
||||||
virtual void GrabFocus() = 0;
|
virtual void GrabFocus() = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -116,10 +84,11 @@ public:
|
|||||||
void unsetPopover();
|
void unsetPopover();
|
||||||
};
|
};
|
||||||
|
|
||||||
class SVT_DLLPUBLIC InterimToolbarPopup final : public svtools::ToolbarPopup
|
class SVT_DLLPUBLIC InterimToolbarPopup final : public DockingWindow
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
VclPtr<vcl::Window> m_xBox;
|
VclPtr<vcl::Window> m_xBox;
|
||||||
|
css::uno::Reference<css::frame::XFrame> m_xFrame;
|
||||||
std::unique_ptr<weld::Builder> m_xBuilder;
|
std::unique_ptr<weld::Builder> m_xBuilder;
|
||||||
std::unique_ptr<weld::Container> m_xContainer;
|
std::unique_ptr<weld::Container> m_xContainer;
|
||||||
std::unique_ptr<WeldToolbarPopup> m_xPopup;
|
std::unique_ptr<WeldToolbarPopup> m_xPopup;
|
||||||
@@ -132,7 +101,7 @@ public:
|
|||||||
|
|
||||||
virtual void GetFocus() override;
|
virtual void GetFocus() override;
|
||||||
|
|
||||||
using ToolbarPopup::EndPopupMode;
|
void EndPopupMode();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -170,9 +170,9 @@ LayoutToolbarMenu::LayoutToolbarMenu(SlideLayoutController* pControl, weld::Widg
|
|||||||
DrawViewMode eMode = DrawViewMode_DRAW;
|
DrawViewMode eMode = DrawViewMode_DRAW;
|
||||||
|
|
||||||
// find out which view is running
|
// find out which view is running
|
||||||
if( mxFrame.is() ) try
|
if( m_xFrame.is() ) try
|
||||||
{
|
{
|
||||||
Reference< XPropertySet > xControllerSet( mxFrame->getController(), UNO_QUERY_THROW );
|
Reference< XPropertySet > xControllerSet( m_xFrame->getController(), UNO_QUERY_THROW );
|
||||||
xControllerSet->getPropertyValue( "DrawViewMode" ) >>= eMode;
|
xControllerSet->getPropertyValue( "DrawViewMode" ) >>= eMode;
|
||||||
}
|
}
|
||||||
catch( Exception& )
|
catch( Exception& )
|
||||||
@@ -220,7 +220,7 @@ LayoutToolbarMenu::LayoutToolbarMenu(SlideLayoutController* pControl, weld::Widg
|
|||||||
if( eMode != DrawViewMode_DRAW )
|
if( eMode != DrawViewMode_DRAW )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if( !mxFrame.is() )
|
if( !m_xFrame.is() )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
OUString sSlotStr;
|
OUString sSlotStr;
|
||||||
@@ -230,7 +230,7 @@ LayoutToolbarMenu::LayoutToolbarMenu(SlideLayoutController* pControl, weld::Widg
|
|||||||
else
|
else
|
||||||
sSlotStr = ".uno:Undo";
|
sSlotStr = ".uno:Undo";
|
||||||
|
|
||||||
css::uno::Reference<css::graphic::XGraphic> xSlotImage = vcl::CommandInfoProvider::GetXGraphicForCommand(sSlotStr, mxFrame);
|
css::uno::Reference<css::graphic::XGraphic> xSlotImage = vcl::CommandInfoProvider::GetXGraphicForCommand(sSlotStr, m_xFrame);
|
||||||
|
|
||||||
OUString sSlotTitle;
|
OUString sSlotTitle;
|
||||||
if( bInsertPage )
|
if( bInsertPage )
|
||||||
|
@@ -36,9 +36,9 @@ using namespace ::com::sun::star::lang;
|
|||||||
using namespace ::com::sun::star::frame;
|
using namespace ::com::sun::star::frame;
|
||||||
using namespace ::com::sun::star::accessibility;
|
using namespace ::com::sun::star::accessibility;
|
||||||
|
|
||||||
namespace svtools {
|
namespace {
|
||||||
|
|
||||||
static vcl::Window* GetTopMostParentSystemWindow( vcl::Window* pWindow )
|
vcl::Window* GetTopMostParentSystemWindow( vcl::Window* pWindow )
|
||||||
{
|
{
|
||||||
OSL_ASSERT( pWindow );
|
OSL_ASSERT( pWindow );
|
||||||
if ( pWindow )
|
if ( pWindow )
|
||||||
@@ -65,18 +65,18 @@ class ToolbarPopupStatusListener : public svt::FrameStatusListener
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
ToolbarPopupStatusListener( const css::uno::Reference< css::frame::XFrame >& xFrame,
|
ToolbarPopupStatusListener( const css::uno::Reference< css::frame::XFrame >& xFrame,
|
||||||
ToolbarPopupBase& rToolbarPopup );
|
WeldToolbarPopup& rToolbarPopup );
|
||||||
|
|
||||||
virtual void SAL_CALL dispose() override;
|
virtual void SAL_CALL dispose() override;
|
||||||
virtual void SAL_CALL statusChanged( const css::frame::FeatureStateEvent& Event ) override;
|
virtual void SAL_CALL statusChanged( const css::frame::FeatureStateEvent& Event ) override;
|
||||||
|
|
||||||
ToolbarPopupBase* mpPopup;
|
WeldToolbarPopup* mpPopup;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
ToolbarPopupStatusListener::ToolbarPopupStatusListener(
|
ToolbarPopupStatusListener::ToolbarPopupStatusListener(
|
||||||
const css::uno::Reference< css::frame::XFrame >& xFrame,
|
const css::uno::Reference< css::frame::XFrame >& xFrame,
|
||||||
ToolbarPopupBase& rToolbarPopup )
|
WeldToolbarPopup& rToolbarPopup )
|
||||||
: svt::FrameStatusListener( ::comphelper::getProcessComponentContext(), xFrame )
|
: svt::FrameStatusListener( ::comphelper::getProcessComponentContext(), xFrame )
|
||||||
, mpPopup( &rToolbarPopup )
|
, mpPopup( &rToolbarPopup )
|
||||||
{
|
{
|
||||||
@@ -96,89 +96,40 @@ void SAL_CALL ToolbarPopupStatusListener::statusChanged( const css::frame::Featu
|
|||||||
mpPopup->statusChanged( Event );
|
mpPopup->statusChanged( Event );
|
||||||
}
|
}
|
||||||
|
|
||||||
ToolbarPopupBase::ToolbarPopupBase(const css::uno::Reference<css::frame::XFrame>& rFrame)
|
}
|
||||||
: mxFrame(rFrame)
|
|
||||||
|
void WeldToolbarPopup::AddStatusListener(const OUString& rCommandURL)
|
||||||
|
{
|
||||||
|
if (!m_xStatusListener.is())
|
||||||
|
m_xStatusListener.set(new ToolbarPopupStatusListener(m_xFrame, *this));
|
||||||
|
|
||||||
|
m_xStatusListener->addStatusListener(rCommandURL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void WeldToolbarPopup::statusChanged(const css::frame::FeatureStateEvent& /*Event*/)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
ToolbarPopupBase::~ToolbarPopupBase()
|
void InterimToolbarPopup::EndPopupMode()
|
||||||
{
|
|
||||||
if (mxStatusListener.is())
|
|
||||||
{
|
|
||||||
mxStatusListener->dispose();
|
|
||||||
mxStatusListener.clear();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ToolbarPopup::ToolbarPopup( const css::uno::Reference<css::frame::XFrame>& rFrame, vcl::Window* pParentWindow,
|
|
||||||
const OString& rID, const OUString& rUIXMLDescription )
|
|
||||||
: DockingWindow(pParentWindow, rID, rUIXMLDescription, rFrame)
|
|
||||||
, ToolbarPopupBase(rFrame)
|
|
||||||
{
|
|
||||||
init();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ToolbarPopup::init()
|
|
||||||
{
|
|
||||||
vcl::Window* pWindow = GetTopMostParentSystemWindow( this );
|
|
||||||
if ( pWindow )
|
|
||||||
static_cast<SystemWindow*>(pWindow)->GetTaskPaneList()->AddWindow( this );
|
|
||||||
}
|
|
||||||
|
|
||||||
ToolbarPopup::~ToolbarPopup()
|
|
||||||
{
|
|
||||||
disposeOnce();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ToolbarPopup::dispose()
|
|
||||||
{
|
|
||||||
vcl::Window* pWindow = GetTopMostParentSystemWindow( this );
|
|
||||||
if ( pWindow )
|
|
||||||
static_cast<SystemWindow*>(pWindow)->GetTaskPaneList()->RemoveWindow( this );
|
|
||||||
|
|
||||||
if ( mxStatusListener.is() )
|
|
||||||
{
|
|
||||||
mxStatusListener->dispose();
|
|
||||||
mxStatusListener.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
mxFrame.clear();
|
|
||||||
DockingWindow::dispose();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ToolbarPopupBase::AddStatusListener( const OUString& rCommandURL )
|
|
||||||
{
|
|
||||||
if( !mxStatusListener.is() )
|
|
||||||
mxStatusListener.set( new ToolbarPopupStatusListener( mxFrame, *this ) );
|
|
||||||
|
|
||||||
mxStatusListener->addStatusListener( rCommandURL );
|
|
||||||
}
|
|
||||||
|
|
||||||
void ToolbarPopupBase::statusChanged( const css::frame::FeatureStateEvent& /*Event*/ )
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void ToolbarPopup::EndPopupMode()
|
|
||||||
{
|
{
|
||||||
GetDockingManager()->EndPopupMode(this);
|
GetDockingManager()->EndPopupMode(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
WeldToolbarPopup::WeldToolbarPopup(const css::uno::Reference<css::frame::XFrame>& rFrame,
|
WeldToolbarPopup::WeldToolbarPopup(const css::uno::Reference<css::frame::XFrame>& rFrame,
|
||||||
weld::Widget* pParent, const OUString& rUIFile,
|
weld::Widget* pParent, const OUString& rUIFile,
|
||||||
const OString& rId)
|
const OString& rId)
|
||||||
: ToolbarPopupBase(rFrame)
|
: m_xBuilder(Application::CreateBuilder(pParent, rUIFile))
|
||||||
, m_xBuilder(Application::CreateBuilder(pParent, rUIFile))
|
|
||||||
, m_xTopLevel(m_xBuilder->weld_container(rId))
|
, m_xTopLevel(m_xBuilder->weld_container(rId))
|
||||||
, m_xContainer(m_xBuilder->weld_container("container"))
|
, m_xContainer(m_xBuilder->weld_container("container"))
|
||||||
|
, m_xFrame(rFrame)
|
||||||
{
|
{
|
||||||
m_xTopLevel->connect_focus_in(LINK(this, WeldToolbarPopup, FocusHdl));
|
m_xTopLevel->connect_focus_in(LINK(this, WeldToolbarPopup, FocusHdl));
|
||||||
}
|
}
|
||||||
|
|
||||||
WeldToolbarPopup::~WeldToolbarPopup()
|
WeldToolbarPopup::~WeldToolbarPopup()
|
||||||
{
|
{
|
||||||
|
if (m_xStatusListener.is())
|
||||||
|
m_xStatusListener->dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
IMPL_LINK_NOARG(WeldToolbarPopup, FocusHdl, weld::Widget&, void)
|
IMPL_LINK_NOARG(WeldToolbarPopup, FocusHdl, weld::Widget&, void)
|
||||||
@@ -224,19 +175,24 @@ IMPL_LINK_NOARG(ToolbarPopupContainer, FocusHdl, weld::Widget&, void)
|
|||||||
|
|
||||||
InterimToolbarPopup::InterimToolbarPopup(const css::uno::Reference<css::frame::XFrame>& rFrame, vcl::Window* pParent,
|
InterimToolbarPopup::InterimToolbarPopup(const css::uno::Reference<css::frame::XFrame>& rFrame, vcl::Window* pParent,
|
||||||
std::unique_ptr<WeldToolbarPopup> xPopup)
|
std::unique_ptr<WeldToolbarPopup> xPopup)
|
||||||
: ToolbarPopup(rFrame, pParent, "InterimDockParent", "svx/ui/interimdockparent.ui")
|
: DockingWindow(pParent, "InterimDockParent", "svx/ui/interimdockparent.ui", rFrame)
|
||||||
, m_xBox(get("box"))
|
, m_xBox(get("box"))
|
||||||
|
, m_xFrame(rFrame)
|
||||||
, m_xBuilder(Application::CreateInterimBuilder(m_xBox.get(), "svx/ui/interimparent.ui"))
|
, m_xBuilder(Application::CreateInterimBuilder(m_xBox.get(), "svx/ui/interimparent.ui"))
|
||||||
, m_xContainer(m_xBuilder->weld_container("container"))
|
, m_xContainer(m_xBuilder->weld_container("container"))
|
||||||
, m_xPopup(std::move(xPopup))
|
, m_xPopup(std::move(xPopup))
|
||||||
{
|
{
|
||||||
|
vcl::Window* pWindow = GetTopMostParentSystemWindow(this);
|
||||||
|
if (pWindow)
|
||||||
|
static_cast<SystemWindow*>(pWindow)->GetTaskPaneList()->AddWindow(this);
|
||||||
|
|
||||||
// move the WeldToolbarPopup contents into this interim toolbar so welded contents can appear as a dropdown in an unwelded toolbar
|
// move the WeldToolbarPopup contents into this interim toolbar so welded contents can appear as a dropdown in an unwelded toolbar
|
||||||
m_xPopup->getTopLevel()->move(m_xPopup->getContainer(), m_xContainer.get());
|
m_xPopup->getTopLevel()->move(m_xPopup->getContainer(), m_xContainer.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
void InterimToolbarPopup::GetFocus()
|
void InterimToolbarPopup::GetFocus()
|
||||||
{
|
{
|
||||||
ToolbarPopup::GetFocus();
|
DockingWindow::GetFocus();
|
||||||
if (!m_xPopup)
|
if (!m_xPopup)
|
||||||
return;
|
return;
|
||||||
m_xPopup->GrabFocus();
|
m_xPopup->GrabFocus();
|
||||||
@@ -244,11 +200,15 @@ void InterimToolbarPopup::GetFocus()
|
|||||||
|
|
||||||
void InterimToolbarPopup::dispose()
|
void InterimToolbarPopup::dispose()
|
||||||
{
|
{
|
||||||
|
vcl::Window* pWindow = GetTopMostParentSystemWindow(this);
|
||||||
|
if (pWindow)
|
||||||
|
static_cast<SystemWindow*>(pWindow)->GetTaskPaneList()->RemoveWindow(this);
|
||||||
|
|
||||||
// if we have focus when disposed, pick the document window as destination
|
// if we have focus when disposed, pick the document window as destination
|
||||||
// for focus rather than let it go to an arbitrary windows
|
// for focus rather than let it go to an arbitrary windows
|
||||||
if (HasFocus())
|
if (HasFocus())
|
||||||
{
|
{
|
||||||
if (auto xWindow = mxFrame->getContainerWindow())
|
if (auto xWindow = m_xFrame->getContainerWindow())
|
||||||
xWindow->setFocus();
|
xWindow->setFocus();
|
||||||
}
|
}
|
||||||
// move the contents back where it belongs
|
// move the contents back where it belongs
|
||||||
@@ -256,7 +216,8 @@ void InterimToolbarPopup::dispose()
|
|||||||
m_xPopup.reset();
|
m_xPopup.reset();
|
||||||
m_xContainer.reset();
|
m_xContainer.reset();
|
||||||
m_xBox.clear();
|
m_xBox.clear();
|
||||||
ToolbarPopup::dispose();
|
m_xFrame.clear();
|
||||||
|
DockingWindow::dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
InterimToolbarPopup::~InterimToolbarPopup()
|
InterimToolbarPopup::~InterimToolbarPopup()
|
||||||
|
@@ -2413,7 +2413,7 @@ SvxLineWindow_Impl::SvxLineWindow_Impl(SvxFrameToolBoxControl* pControl, weld::W
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
Reference< lang::XServiceInfo > xServices(mxFrame->getController()->getModel(), UNO_QUERY_THROW);
|
Reference< lang::XServiceInfo > xServices(m_xFrame->getController()->getModel(), UNO_QUERY_THROW);
|
||||||
m_bIsWriter = xServices->supportsService("com.sun.star.text.TextDocument");
|
m_bIsWriter = xServices->supportsService("com.sun.star.text.TextDocument");
|
||||||
}
|
}
|
||||||
catch(const uno::Exception& )
|
catch(const uno::Exception& )
|
||||||
|
Reference in New Issue
Block a user