Coverage Report

Created: 2025-07-07 10:01

/src/libreoffice/sfx2/source/sidebar/UnoPanel.cxx
Line
Count
Source (jump to first uncovered line)
1
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2
/*
3
 * This file is part of the LibreOffice project.
4
 *
5
 * This Source Code Form is subject to the terms of the Mozilla Public
6
 * License, v. 2.0. If a copy of the MPL was not distributed with this
7
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8
 *
9
 */
10
11
#include <sidebar/UnoPanel.hxx>
12
13
#include <sfx2/sidebar/ResourceManager.hxx>
14
#include <sfx2/sidebar/SidebarController.hxx>
15
16
#include <sidebar/PanelDescriptor.hxx>
17
#include <sidebar/PanelTitleBar.hxx>
18
#include <sfx2/sidebar/Panel.hxx>
19
#include <sfx2/sidebar/Deck.hxx>
20
#include <sidebar/DeckDescriptor.hxx>
21
22
#include <utility>
23
#include <vcl/svapp.hxx>
24
25
using namespace css;
26
using namespace ::sfx2::sidebar;
27
28
SfxUnoPanel::SfxUnoPanel(uno::Reference<frame::XFrame> _xFrame, OUString panelId, OUString deckId):
29
0
xFrame(std::move(_xFrame)),
30
0
mPanelId(std::move(panelId)),
31
0
mDeckId(std::move(deckId))
32
0
{
33
0
    SidebarController* pSidebarController = getSidebarController();
34
35
0
    pSidebarController->CreateDeck(mDeckId); // creates deck object is not already
36
0
    mpDeck = pSidebarController->GetResourceManager()->GetDeckDescriptor(mDeckId)->mpDeck;
37
0
    mxPanel = mpDeck->GetPanel(mPanelId);
38
0
}
39
40
SidebarController* SfxUnoPanel::getSidebarController()
41
0
{
42
0
    return SidebarController::GetSidebarControllerForFrame(xFrame);
43
0
}
44
45
OUString SAL_CALL SfxUnoPanel::getId()
46
0
{
47
0
    SolarMutexGuard aGuard;
48
49
0
    return mPanelId;
50
0
}
51
52
OUString SAL_CALL SfxUnoPanel::getTitle()
53
0
{
54
0
    SolarMutexGuard aGuard;
55
56
0
    auto xPanel = mxPanel.lock();
57
0
    PanelTitleBar* pTitleBar = xPanel ? xPanel->GetTitleBar() : nullptr;
58
0
    if (pTitleBar)
59
0
        return pTitleBar->GetTitle();
60
0
    else
61
0
        return OUString();
62
0
}
63
64
void SAL_CALL SfxUnoPanel::setTitle( const OUString& newTitle )
65
0
{
66
0
    SolarMutexGuard aGuard;
67
68
0
    SidebarController* pSidebarController = getSidebarController();
69
0
    std::shared_ptr<PanelDescriptor> xPanelDescriptor = pSidebarController->GetResourceManager()->GetPanelDescriptor(mPanelId);
70
71
0
    if (xPanelDescriptor)
72
0
    {
73
0
        xPanelDescriptor->msTitle = newTitle;
74
0
        auto xPanel = mxPanel.lock();
75
0
        PanelTitleBar* pTitleBar = xPanel ? xPanel->GetTitleBar() : nullptr;
76
0
        if (pTitleBar)
77
0
            pTitleBar->SetTitle(newTitle);
78
0
    }
79
0
}
80
81
sal_Bool SAL_CALL SfxUnoPanel::isExpanded()
82
0
{
83
0
    SolarMutexGuard aGuard;
84
85
0
    auto xPanel = mxPanel.lock();
86
0
    return xPanel && xPanel->IsExpanded();
87
0
}
88
89
90
void SAL_CALL SfxUnoPanel::expand( const sal_Bool bCollapseOther )
91
0
{
92
93
0
    SolarMutexGuard aGuard;
94
95
0
    auto xPanel = mxPanel.lock();
96
0
    if (xPanel)
97
0
        xPanel->SetExpanded(true);
98
99
0
    if (bCollapseOther)
100
0
    {
101
0
        SharedPanelContainer aPanels = mpDeck->GetPanels();
102
0
        for (auto const& panel : aPanels)
103
0
        {
104
0
            if (! panel->HasIdPredicate(mPanelId))
105
0
                panel->SetExpanded(false);
106
0
        }
107
0
    }
108
109
0
    SidebarController* pSidebarController = getSidebarController();
110
0
    pSidebarController->NotifyResize();
111
112
0
}
113
114
void SAL_CALL SfxUnoPanel::collapse()
115
0
{
116
0
    SolarMutexGuard aGuard;
117
118
0
    auto xPanel = mxPanel.lock();
119
0
    if (xPanel)
120
0
        xPanel->SetExpanded(false);
121
0
    SidebarController* pSidebarController = getSidebarController();
122
0
    pSidebarController->NotifyResize();
123
0
}
124
125
uno::Reference<awt::XWindow> SAL_CALL SfxUnoPanel::getDialog()
126
0
{
127
0
    SolarMutexGuard aGuard;
128
129
0
    auto xPanel = mxPanel.lock();
130
0
    return xPanel ? xPanel->GetElementWindow() : nullptr;
131
0
}
132
133
sal_Int32 SAL_CALL SfxUnoPanel::getOrderIndex()
134
0
{
135
0
    SolarMutexGuard aGuard;
136
0
    SidebarController* pSidebarController = getSidebarController();
137
138
0
    sal_Int32 index = pSidebarController->GetResourceManager()->GetPanelDescriptor(mPanelId)->mnOrderIndex;
139
0
    return index;
140
0
}
141
142
void SAL_CALL SfxUnoPanel::setOrderIndex( const sal_Int32 newOrderIndex )
143
0
{
144
0
    SolarMutexGuard aGuard;
145
0
    SidebarController* pSidebarController = getSidebarController();
146
147
0
    std::shared_ptr<PanelDescriptor> xPanelDescriptor = pSidebarController->GetResourceManager()->GetPanelDescriptor(mPanelId);
148
149
0
    if (xPanelDescriptor)
150
0
    {
151
0
        xPanelDescriptor->mnOrderIndex = newOrderIndex;
152
        // update the sidebar
153
0
        pSidebarController->NotifyResize();
154
0
    }
155
0
}
156
157
void SAL_CALL SfxUnoPanel::moveFirst()
158
0
{
159
0
    SolarMutexGuard aGuard;
160
0
    SidebarController* pSidebarController = getSidebarController();
161
162
0
    ResourceManager::PanelContextDescriptorContainer aPanels = pSidebarController->GetMatchingPanels(mDeckId);
163
164
0
    sal_Int32 curOrderIndex = getOrderIndex();
165
0
    sal_Int32 minIndex = GetMinOrderIndex(aPanels);
166
167
0
    if (curOrderIndex != minIndex) // is current panel already in place ?
168
0
    {
169
0
        minIndex -= 1;
170
0
        std::shared_ptr<PanelDescriptor> xPanelDescriptor = pSidebarController->GetResourceManager()->GetPanelDescriptor(mPanelId);
171
0
        if (xPanelDescriptor)
172
0
        {
173
0
            xPanelDescriptor->mnOrderIndex = minIndex;
174
            // update the sidebar
175
0
            pSidebarController->NotifyResize();
176
0
        }
177
0
    }
178
0
}
179
180
void SAL_CALL SfxUnoPanel::moveLast()
181
0
{
182
0
    SolarMutexGuard aGuard;
183
0
    SidebarController* pSidebarController = getSidebarController();
184
185
0
    ResourceManager::PanelContextDescriptorContainer aPanels = pSidebarController->GetMatchingPanels(mDeckId);
186
187
0
    sal_Int32 curOrderIndex = getOrderIndex();
188
0
    sal_Int32 maxIndex = GetMaxOrderIndex(aPanels);
189
190
0
    if (curOrderIndex != maxIndex) // is current panel already in place ?
191
0
    {
192
0
        maxIndex += 1;
193
0
        std::shared_ptr<PanelDescriptor> xPanelDescriptor = pSidebarController->GetResourceManager()->GetPanelDescriptor(mPanelId);
194
0
        if (xPanelDescriptor)
195
0
        {
196
0
            xPanelDescriptor->mnOrderIndex = maxIndex;
197
            // update the sidebar
198
0
            pSidebarController->NotifyResize();
199
0
        }
200
0
    }
201
0
}
202
203
void SAL_CALL SfxUnoPanel::moveUp()
204
0
{
205
0
    SolarMutexGuard aGuard;
206
0
    SidebarController* pSidebarController = getSidebarController();
207
208
    // Search for previous panel OrderIndex
209
0
    ResourceManager::PanelContextDescriptorContainer aPanels = pSidebarController->GetMatchingPanels(mDeckId);
210
211
0
    sal_Int32 curOrderIndex = getOrderIndex();
212
0
    sal_Int32 previousIndex = GetMinOrderIndex(aPanels);
213
214
0
    for (auto const& panel : aPanels)
215
0
    {
216
0
        sal_Int32 index = pSidebarController->GetResourceManager()->GetPanelDescriptor(panel.msId)->mnOrderIndex;
217
0
        if( index < curOrderIndex && index > previousIndex)
218
0
            previousIndex = index;
219
0
    }
220
221
0
    if (curOrderIndex != previousIndex) // is current panel already in place ?
222
0
    {
223
0
        previousIndex -= 1;
224
0
        std::shared_ptr<PanelDescriptor> xPanelDescriptor = pSidebarController->GetResourceManager()->GetPanelDescriptor(mPanelId);
225
0
        if (xPanelDescriptor)
226
0
        {
227
0
            xPanelDescriptor->mnOrderIndex = previousIndex;
228
            // update the sidebar
229
0
            pSidebarController->NotifyResize();
230
0
        }
231
0
    }
232
0
}
233
234
void SAL_CALL SfxUnoPanel::moveDown()
235
0
{
236
0
    SolarMutexGuard aGuard;
237
0
    SidebarController* pSidebarController = getSidebarController();
238
239
0
    ResourceManager::PanelContextDescriptorContainer aPanels = pSidebarController->GetMatchingPanels(mDeckId);
240
241
    // Search for next panel OrderIndex
242
0
    sal_Int32 curOrderIndex = getOrderIndex();
243
0
    sal_Int32 nextIndex = GetMaxOrderIndex(aPanels);
244
245
0
    for (auto const& panel : aPanels)
246
0
    {
247
0
        sal_Int32 index = pSidebarController->GetResourceManager()->GetPanelDescriptor(panel.msId)->mnOrderIndex;
248
0
        if( index > curOrderIndex && index < nextIndex)
249
0
            nextIndex = index;
250
0
    }
251
252
0
    if (curOrderIndex != nextIndex) // is current panel already in place ?
253
0
    {
254
0
        nextIndex += 1;
255
0
        std::shared_ptr<PanelDescriptor> xPanelDescriptor = pSidebarController->GetResourceManager()->GetPanelDescriptor(mPanelId);
256
0
        if (xPanelDescriptor)
257
0
        {
258
0
            xPanelDescriptor->mnOrderIndex = nextIndex;
259
            // update the sidebar
260
0
            pSidebarController->NotifyResize();
261
0
        }
262
0
    }
263
0
}
264
265
sal_Int32 SfxUnoPanel::GetMinOrderIndex(const ResourceManager::PanelContextDescriptorContainer& rPanels)
266
0
{
267
0
    SidebarController* pSidebarController = getSidebarController();
268
269
0
    sal_Int32 minIndex = pSidebarController->GetResourceManager()->GetPanelDescriptor(rPanels.begin()->msId)->mnOrderIndex;
270
271
0
    for (auto const& panel : rPanels)
272
0
    {
273
0
        sal_Int32 index = pSidebarController->GetResourceManager()->GetPanelDescriptor(panel.msId)->mnOrderIndex;
274
0
        if(minIndex > index)
275
0
            minIndex = index;
276
0
    }
277
0
    return minIndex;
278
0
}
279
280
sal_Int32 SfxUnoPanel::GetMaxOrderIndex(const ResourceManager::PanelContextDescriptorContainer& rPanels)
281
0
{
282
0
    SidebarController* pSidebarController = getSidebarController();
283
284
0
    sal_Int32 maxIndex = pSidebarController->GetResourceManager()->GetPanelDescriptor(rPanels.begin()->msId)->mnOrderIndex;
285
286
0
    for (auto const& panel : rPanels)
287
0
    {
288
0
        sal_Int32 index = pSidebarController->GetResourceManager()->GetPanelDescriptor(panel.msId)->mnOrderIndex;
289
0
        if(maxIndex < index)
290
0
            maxIndex = index;
291
0
    }
292
0
    return maxIndex;
293
0
}
294
295
296
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */