/* -*- 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 .
*/
SystemWindow* GetTopMostParentSystemWindow(const vcl::Window& rWindow)
{ // ->manually search topmost system window // required because their might be another system window between this and the top window
vcl::Window* pWindow = rWindow.GetParent();
SystemWindow* pTopMostSysWin = nullptr; while ( pWindow )
{ if ( pWindow->IsSystemWindow() )
pTopMostSysWin = static_cast<SystemWindow*>(pWindow);
pWindow = pWindow->GetParent();
} return pTopMostSysWin;
}
class ToolbarPopupStatusListener : public svt::FrameStatusListener
{ public:
ToolbarPopupStatusListener( const css::uno::Reference< css::frame::XFrame >& xFrame,
WeldToolbarPopup& rToolbarPopup );
void ToolbarPopupContainer::setPopover(std::unique_ptr<WeldToolbarPopup> xPopup)
{
m_xPopup = std::move(xPopup); // move the WeldToolbarPopup contents into this toolbar so on-demand contents can appear inside a preexisting gtk popover // because the arrow for the popover is only enabled if there's a popover set
m_xPopup->getTopLevel()->move(m_xPopup->getContainer(), m_xContainer.get());
// in online LoseFocus event is fired due to this line and popup is closed // when first time opened any popup from not focused sidebar if (!comphelper::LibreOfficeKit::isActive())
m_xPopup->GrabFocus();
}
void ToolbarPopupContainer::unsetPopover()
{ if (!m_xPopup) return;
m_xContainer->move(m_xPopup->getContainer(), m_xPopup->getTopLevel());
m_xPopup.reset();
}
// 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());
}
void InterimToolbarPopup::GetFocus()
{
DropdownDockingWindow::GetFocus(); if (!m_xPopup) return;
m_xPopup->GrabFocus();
}
void InterimToolbarPopup::dispose()
{ if (SystemWindow* pWindow = GetTopMostParentSystemWindow(*this))
pWindow->GetTaskPaneList()->RemoveWindow(this);
// if we have focus when disposed, pick the document window as destination // for focus rather than let it go to an arbitrary windows if (HasFocus())
{ if (auto xWindow = m_xFrame->getContainerWindow())
xWindow->setFocus();
} // move the contents back where it belongs
m_xContainer->move(m_xPopup->getContainer(), m_xPopup->getTopLevel());
m_xPopup.reset();
m_xContainer.reset();
m_xBuilder.reset();
m_xFrame.clear();
DropdownDockingWindow::dispose();
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.