1
0
Fork 0
libreoffice/sfx2/source/sidebar/UnoDeck.cxx
Daniel Baumann 8e63e14cf6
Adding upstream version 4:25.2.3.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
2025-06-22 16:20:04 +02:00

280 lines
8.4 KiB
C++

/* -*- 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/.
*
*/
#include <sidebar/UnoDeck.hxx>
#include <sidebar/UnoPanels.hxx>
#include <sfx2/sidebar/ResourceManager.hxx>
#include <sfx2/sidebar/SidebarController.hxx>
#include <sidebar/DeckTitleBar.hxx>
#include <sfx2/sidebar/Deck.hxx>
#include <sidebar/DeckDescriptor.hxx>
#include <utility>
#include <vcl/svapp.hxx>
using namespace css;
using namespace ::sfx2::sidebar;
SfxUnoDeck::SfxUnoDeck(uno::Reference<frame::XFrame> _xFrame, OUString deckId):
xFrame(std::move(_xFrame)),
mDeckId(std::move(deckId))
{
}
SidebarController* SfxUnoDeck::getSidebarController()
{
return SidebarController::GetSidebarControllerForFrame(xFrame);
}
OUString SAL_CALL SfxUnoDeck::getId()
{
return mDeckId;
}
OUString SAL_CALL SfxUnoDeck::getTitle()
{
SolarMutexGuard aGuard;
SidebarController* pSidebarController = getSidebarController();
VclPtr<Deck> pDeck = pSidebarController->GetResourceManager()->GetDeckDescriptor(mDeckId)->mpDeck;
if (!pDeck)
{
pSidebarController->CreateDeck(mDeckId);
pDeck = pSidebarController->GetResourceManager()->GetDeckDescriptor(mDeckId)->mpDeck;
}
DeckTitleBar* pTitleBar = pDeck->GetTitleBar();
return pTitleBar->GetTitle();
}
void SAL_CALL SfxUnoDeck::setTitle( const OUString& newTitle )
{
SolarMutexGuard aGuard;
SidebarController* pSidebarController = getSidebarController();
pSidebarController->CreateDeck(mDeckId);
std::shared_ptr<DeckDescriptor> xDeckDescriptor = pSidebarController->GetResourceManager()->GetDeckDescriptor(mDeckId);
if (xDeckDescriptor)
{
Deck* pDeck = xDeckDescriptor->mpDeck;
DeckTitleBar* pTitleBar = pDeck->GetTitleBar();
pTitleBar->SetTitle(newTitle);
xDeckDescriptor->msTitle = newTitle;
xDeckDescriptor->msHelpText = newTitle;
pSidebarController->notifyDeckTitle(mDeckId);
}
}
sal_Bool SAL_CALL SfxUnoDeck::isActive()
{
SolarMutexGuard aGuard;
SidebarController* pSidebarController = getSidebarController();
return pSidebarController->IsDeckVisible(mDeckId);
}
void SAL_CALL SfxUnoDeck::activate( const sal_Bool bActivate )
{
SolarMutexGuard aGuard;
SidebarController* pSidebarController = getSidebarController();
// tdf#138160: OpenThenToggleDeck takes care of minimal width
if (bActivate)
pSidebarController->OpenThenToggleDeck(mDeckId);
else
{
pSidebarController->SwitchToDefaultDeck();
// update the sidebar
pSidebarController->NotifyResize();
}
}
uno::Reference<ui::XPanels> SAL_CALL SfxUnoDeck::getPanels()
{
SolarMutexGuard aGuard;
uno::Reference<ui::XPanels> panels = new SfxUnoPanels(xFrame, mDeckId);
return panels;
}
sal_Int32 SAL_CALL SfxUnoDeck::getOrderIndex()
{
SolarMutexGuard aGuard;
SidebarController* pSidebarController = getSidebarController();
sal_Int32 index = pSidebarController->GetResourceManager()->GetDeckDescriptor(mDeckId)->mnOrderIndex;
return index;
}
void SAL_CALL SfxUnoDeck::setOrderIndex( const sal_Int32 newOrderIndex )
{
SolarMutexGuard aGuard;
SidebarController* pSidebarController = getSidebarController();
std::shared_ptr<DeckDescriptor> xDeckDescriptor = pSidebarController->GetResourceManager()->GetDeckDescriptor(mDeckId);
if (xDeckDescriptor)
{
xDeckDescriptor->mnOrderIndex = newOrderIndex;
// update the sidebar
pSidebarController->NotifyResize();
}
}
void SAL_CALL SfxUnoDeck::moveFirst()
{
SolarMutexGuard aGuard;
SidebarController* pSidebarController = getSidebarController();
ResourceManager::DeckContextDescriptorContainer aDecks = pSidebarController->GetMatchingDecks();
sal_Int32 minIndex = GetMinOrderIndex(aDecks);
sal_Int32 curOrderIndex = getOrderIndex();
if (curOrderIndex != minIndex) // is deck already in place ?
{
minIndex -= 1;
std::shared_ptr<DeckDescriptor> xDeckDescriptor = pSidebarController->GetResourceManager()->GetDeckDescriptor(mDeckId);
if (xDeckDescriptor)
{
xDeckDescriptor->mnOrderIndex = minIndex;
// update the sidebar
pSidebarController->NotifyResize();
}
}
}
void SAL_CALL SfxUnoDeck::moveLast()
{
SolarMutexGuard aGuard;
SidebarController* pSidebarController = getSidebarController();
ResourceManager::DeckContextDescriptorContainer aDecks = pSidebarController->GetMatchingDecks();
sal_Int32 maxIndex = GetMaxOrderIndex(aDecks);
sal_Int32 curOrderIndex = getOrderIndex();
if (curOrderIndex != maxIndex) // is deck already in place ?
{
maxIndex += 1;
std::shared_ptr<DeckDescriptor> xDeckDescriptor = pSidebarController->GetResourceManager()->GetDeckDescriptor(mDeckId);
if (xDeckDescriptor)
{
xDeckDescriptor->mnOrderIndex = maxIndex;
// update the sidebar
pSidebarController->NotifyResize();
}
}
}
void SAL_CALL SfxUnoDeck::moveUp()
{
SolarMutexGuard aGuard;
SidebarController* pSidebarController = getSidebarController();
// Search for previous deck OrderIndex
ResourceManager::DeckContextDescriptorContainer aDecks = pSidebarController->GetMatchingDecks();
sal_Int32 curOrderIndex = getOrderIndex();
sal_Int32 previousIndex = GetMinOrderIndex(aDecks);
for (auto const& deck : aDecks)
{
sal_Int32 index = pSidebarController->GetResourceManager()->GetDeckDescriptor(deck.msId)->mnOrderIndex;
if( index < curOrderIndex && index > previousIndex)
previousIndex = index;
}
if (curOrderIndex != previousIndex) // is deck already in place ?
{
previousIndex -= 1;
std::shared_ptr<DeckDescriptor> xDeckDescriptor = pSidebarController->GetResourceManager()->GetDeckDescriptor(mDeckId);
if (xDeckDescriptor)
{
xDeckDescriptor->mnOrderIndex = previousIndex;
// update the sidebar
pSidebarController->NotifyResize();
}
}
}
void SAL_CALL SfxUnoDeck::moveDown()
{
SolarMutexGuard aGuard;
SidebarController* pSidebarController = getSidebarController();
ResourceManager::DeckContextDescriptorContainer aDecks = pSidebarController->GetMatchingDecks();
// Search for next deck OrderIndex
sal_Int32 curOrderIndex = getOrderIndex();
sal_Int32 nextIndex = GetMaxOrderIndex(aDecks);
for (auto const& deck : aDecks)
{
sal_Int32 index = pSidebarController->GetResourceManager()->GetDeckDescriptor(deck.msId)->mnOrderIndex;
if( index > curOrderIndex && index < nextIndex)
nextIndex = index;
}
if (curOrderIndex != nextIndex) // is deck already in place ?
{
nextIndex += 1;
std::shared_ptr<DeckDescriptor> xDeckDescriptor = pSidebarController->GetResourceManager()->GetDeckDescriptor(mDeckId);
if (xDeckDescriptor)
{
xDeckDescriptor->mnOrderIndex = nextIndex;
// update the sidebar
pSidebarController->NotifyResize();
}
}
}
sal_Int32 SfxUnoDeck::GetMinOrderIndex(const ResourceManager::DeckContextDescriptorContainer& rDecks)
{
SidebarController* pSidebarController = getSidebarController();
ResourceManager::DeckContextDescriptorContainer::const_iterator iDeck = rDecks.begin();
sal_Int32 minIndex = pSidebarController->GetResourceManager()->GetDeckDescriptor(iDeck->msId)->mnOrderIndex;
for (auto const& deck : rDecks)
{
sal_Int32 index = pSidebarController->GetResourceManager()->GetDeckDescriptor(deck.msId)->mnOrderIndex;
if(minIndex > index)
minIndex = index;
}
return minIndex;
}
sal_Int32 SfxUnoDeck::GetMaxOrderIndex(const ResourceManager::DeckContextDescriptorContainer& rDecks)
{
SidebarController* pSidebarController = getSidebarController();
sal_Int32 maxIndex = pSidebarController->GetResourceManager()->GetDeckDescriptor(rDecks.begin()->msId)->mnOrderIndex;
for (auto const& deck : rDecks)
{
sal_Int32 index = pSidebarController->GetResourceManager()->GetDeckDescriptor(deck.msId)->mnOrderIndex;
if(maxIndex < index)
maxIndex = index;
}
return maxIndex;
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */