Kaydet (Commit) 5bd2931b authored tarafından Szymon Kłos's avatar Szymon Kłos Kaydeden (comit) Christian Lohmaier

tdf#102063 Notebookbar wont appear on launch

* removed static members from SfxNotebookBar to avoid crashes
* Updating Notebookbar state after module load

Change-Id: Ia4e3dcb0b6e2c5aa7c5205992dbf3575e72fa354
Reviewed-on: https://gerrit.libreoffice.org/28841Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarSamuel Mehrbrodt <Samuel.Mehrbrodt@cib.de>
üst 808ba5ac
...@@ -44,8 +44,6 @@ public: ...@@ -44,8 +44,6 @@ public:
private: private:
static bool m_bLock; static bool m_bLock;
static css::uno::Reference<css::frame::XLayoutManager> m_xLayoutManager;
static css::uno::Reference<css::frame::XFrame> m_xFrame;
DECL_STATIC_LINK_TYPED(SfxNotebookBar, OpenNotebookbarPopupMenu, NotebookBar*, void); DECL_STATIC_LINK_TYPED(SfxNotebookBar, OpenNotebookbarPopupMenu, NotebookBar*, void);
}; };
......
...@@ -1344,6 +1344,12 @@ void SfxDispatcher::Update_Impl( bool bForce ) ...@@ -1344,6 +1344,12 @@ void SfxDispatcher::Update_Impl( bool bForce )
if ( xLayoutManager.is() ) if ( xLayoutManager.is() )
xLayoutManager->unlock(); xLayoutManager->unlock();
if ( SfxViewShell::Current() && SfxViewShell::Current()->GetDispatcher() )
{
const SfxPoolItem *pItem;
SfxViewShell::Current()->GetDispatcher()->QueryState(SID_NOTEBOOKBAR, pItem);
}
return; return;
} }
......
...@@ -52,7 +52,7 @@ NotebookBarPopupMenu::NotebookBarPopupMenu() ...@@ -52,7 +52,7 @@ NotebookBarPopupMenu::NotebookBarPopupMenu()
} }
void NotebookBarPopupMenu::Execute(NotebookBar* pNotebookbar, void NotebookBarPopupMenu::Execute(NotebookBar* pNotebookbar,
css::uno::Reference<css::frame::XFrame>& xFrame) const Reference<css::frame::XFrame>& xFrame)
{ {
if (pNotebookbar) if (pNotebookbar)
{ {
......
...@@ -17,7 +17,7 @@ class NotebookBarPopupMenu : public PopupMenu ...@@ -17,7 +17,7 @@ class NotebookBarPopupMenu : public PopupMenu
public: public:
explicit NotebookBarPopupMenu(); explicit NotebookBarPopupMenu();
void Execute(NotebookBar* pNotebookbar, void Execute(NotebookBar* pNotebookbar,
css::uno::Reference<css::frame::XFrame>& xFrame); const css::uno::Reference<css::frame::XFrame>& xFrame);
}; };
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
...@@ -35,8 +35,24 @@ using namespace css; ...@@ -35,8 +35,24 @@ using namespace css;
#define MENUBAR_STR "private:resource/menubar/menubar" #define MENUBAR_STR "private:resource/menubar/menubar"
bool SfxNotebookBar::m_bLock = false; bool SfxNotebookBar::m_bLock = false;
Reference<css::frame::XLayoutManager> SfxNotebookBar::m_xLayoutManager;
css::uno::Reference<css::frame::XFrame> SfxNotebookBar::m_xFrame; static Reference<frame::XLayoutManager> lcl_getLayoutManager( const Reference<frame::XFrame>& xFrame )
{
css::uno::Reference<css::frame::XLayoutManager> xLayoutManager;
if (xFrame.is())
{
Reference<css::beans::XPropertySet> xPropSet(xFrame, UNO_QUERY);
if (xPropSet.is())
{
Any aValue = xPropSet->getPropertyValue("LayoutManager");
aValue >>= xLayoutManager;
}
}
return xLayoutManager;
}
static OUString lcl_getAppName( vcl::EnumContext::Application eApp ) static OUString lcl_getAppName( vcl::EnumContext::Application eApp )
{ {
...@@ -149,15 +165,21 @@ void SfxNotebookBar::CloseMethod(SystemWindow* pSysWindow) ...@@ -149,15 +165,21 @@ void SfxNotebookBar::CloseMethod(SystemWindow* pSysWindow)
pSysWindow->CloseNotebookBar(); pSysWindow->CloseNotebookBar();
} }
SfxNotebookBar::ShowMenubar(true); SfxNotebookBar::ShowMenubar(true);
m_xLayoutManager.clear();
m_xFrame.clear();
} }
bool SfxNotebookBar::IsActive() bool SfxNotebookBar::IsActive()
{ {
const Reference<frame::XModuleManager> xModuleManager = frame::ModuleManager::create( ::comphelper::getProcessComponentContext() ); vcl::EnumContext::Application eApp = vcl::EnumContext::Application::Application_Any;
vcl::EnumContext::Application eApp = vcl::EnumContext::GetApplicationEnum(xModuleManager->identify(m_xFrame));
if (SfxViewFrame::Current())
{
const Reference<frame::XFrame>& xFrame = SfxViewFrame::Current()->GetFrame().GetFrameInterface();
if (!xFrame.is())
return false;
const Reference<frame::XModuleManager> xModuleManager = frame::ModuleManager::create( ::comphelper::getProcessComponentContext() );
eApp = vcl::EnumContext::GetApplicationEnum(xModuleManager->identify(xFrame));
}
OUStringBuffer aPath("org.openoffice.Office.UI.ToolbarMode/Applications/"); OUStringBuffer aPath("org.openoffice.Office.UI.ToolbarMode/Applications/");
aPath.append( lcl_getAppName( eApp ) ); aPath.append( lcl_getAppName( eApp ) );
...@@ -194,11 +216,15 @@ bool SfxNotebookBar::IsActive() ...@@ -194,11 +216,15 @@ bool SfxNotebookBar::IsActive()
void SfxNotebookBar::ExecMethod(SfxBindings& rBindings, const OUString& rUIName) void SfxNotebookBar::ExecMethod(SfxBindings& rBindings, const OUString& rUIName)
{ {
// Save active UI file name // Save active UI file name
if ( !rUIName.isEmpty() ) if ( !rUIName.isEmpty() && SfxViewFrame::Current() )
{ {
const Reference<frame::XModuleManager> xModuleManager = frame::ModuleManager::create( ::comphelper::getProcessComponentContext() ); const Reference<frame::XFrame>& xFrame = SfxViewFrame::Current()->GetFrame().GetFrameInterface();
vcl::EnumContext::Application eApp = vcl::EnumContext::GetApplicationEnum(xModuleManager->identify(m_xFrame)); if (xFrame.is())
lcl_setNotebookbarFileName( eApp, rUIName ); {
const Reference<frame::XModuleManager> xModuleManager = frame::ModuleManager::create( ::comphelper::getProcessComponentContext() );
vcl::EnumContext::Application eApp = vcl::EnumContext::GetApplicationEnum(xModuleManager->identify(xFrame));
lcl_setNotebookbarFileName( eApp, rUIName );
}
} }
// trigger the StateMethod // trigger the StateMethod
...@@ -218,25 +244,12 @@ bool SfxNotebookBar::StateMethod(SystemWindow* pSysWindow, ...@@ -218,25 +244,12 @@ bool SfxNotebookBar::StateMethod(SystemWindow* pSysWindow,
{ {
assert(pSysWindow); assert(pSysWindow);
m_xFrame = xFrame;
if (!m_xLayoutManager.is())
{
Reference<css::beans::XPropertySet> xPropSet(xFrame, UNO_QUERY);
if (xPropSet.is())
{
Any aValue = xPropSet->getPropertyValue("LayoutManager");
aValue >>= m_xLayoutManager;
}
}
if (IsActive()) if (IsActive())
{ {
RemoveListeners(pSysWindow); RemoveListeners(pSysWindow);
const Reference<frame::XModuleManager> xModuleManager = frame::ModuleManager::create( ::comphelper::getProcessComponentContext() ); const Reference<frame::XModuleManager> xModuleManager = frame::ModuleManager::create( ::comphelper::getProcessComponentContext() );
vcl::EnumContext::Application eApp = vcl::EnumContext::GetApplicationEnum(xModuleManager->identify(m_xFrame)); vcl::EnumContext::Application eApp = vcl::EnumContext::GetApplicationEnum(xModuleManager->identify(xFrame));
OUString sFile = lcl_getNotebookbarFileName( eApp ); OUString sFile = lcl_getNotebookbarFileName( eApp );
OUString sNewFile = rUIFile + sFile; OUString sNewFile = rUIFile + sFile;
OUString sCurrentFile; OUString sCurrentFile;
...@@ -313,38 +326,67 @@ IMPL_STATIC_LINK_TYPED(SfxNotebookBar, OpenNotebookbarPopupMenu, NotebookBar*, p ...@@ -313,38 +326,67 @@ IMPL_STATIC_LINK_TYPED(SfxNotebookBar, OpenNotebookbarPopupMenu, NotebookBar*, p
if (pNotebookbar) if (pNotebookbar)
{ {
ScopedVclPtrInstance<NotebookBarPopupMenu> pMenu; ScopedVclPtrInstance<NotebookBarPopupMenu> pMenu;
pMenu->Execute(pNotebookbar, m_xFrame); if (SfxViewFrame::Current())
{
const Reference<frame::XFrame>& xFrame = SfxViewFrame::Current()->GetFrame().GetFrameInterface();
if (xFrame.is())
pMenu->Execute(pNotebookbar, xFrame);
}
} }
} }
void SfxNotebookBar::ShowMenubar(bool bShow) void SfxNotebookBar::ShowMenubar(bool bShow)
{ {
if (!m_bLock && m_xLayoutManager.is()) if (!m_bLock)
{ {
m_bLock = true; m_bLock = true;
m_xLayoutManager->lock();
if (m_xLayoutManager->getElement(MENUBAR_STR).is()) if (SfxViewFrame::Current())
{ {
if (m_xLayoutManager->isElementVisible(MENUBAR_STR) && !bShow) const Reference<frame::XFrame>& xFrame = SfxViewFrame::Current()->GetFrame().GetFrameInterface();
m_xLayoutManager->hideElement(MENUBAR_STR); if (xFrame.is())
else if(!m_xLayoutManager->isElementVisible(MENUBAR_STR) && bShow) {
m_xLayoutManager->showElement(MENUBAR_STR); const Reference<frame::XLayoutManager>& xLayoutManager =
} lcl_getLayoutManager(xFrame);
if (xLayoutManager.is())
{
xLayoutManager->lock();
m_xLayoutManager->unlock(); if (xLayoutManager->getElement(MENUBAR_STR).is())
{
if (xLayoutManager->isElementVisible(MENUBAR_STR) && !bShow)
xLayoutManager->hideElement(MENUBAR_STR);
else if(!xLayoutManager->isElementVisible(MENUBAR_STR) && bShow)
xLayoutManager->showElement(MENUBAR_STR);
}
xLayoutManager->unlock();
}
}
}
m_bLock = false; m_bLock = false;
} }
} }
void SfxNotebookBar::ToggleMenubar() void SfxNotebookBar::ToggleMenubar()
{ {
if (m_xLayoutManager.is() && m_xLayoutManager->getElement(MENUBAR_STR).is()) if (SfxViewFrame::Current())
{ {
if (m_xLayoutManager->isElementVisible(MENUBAR_STR)) const Reference<frame::XFrame>& xFrame = SfxViewFrame::Current()->GetFrame().GetFrameInterface();
SfxNotebookBar::ShowMenubar(false); if (xFrame.is())
else {
SfxNotebookBar::ShowMenubar(true); const Reference<frame::XLayoutManager>& xLayoutManager =
lcl_getLayoutManager(xFrame);
if (xLayoutManager.is() && xLayoutManager->getElement(MENUBAR_STR).is())
{
if (xLayoutManager->isElementVisible(MENUBAR_STR))
SfxNotebookBar::ShowMenubar(false);
else
SfxNotebookBar::ShowMenubar(true);
}
}
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment