Coverage Report

Created: 2026-09-28 10:59

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libreoffice/sd/source/ui/unoidl/SdUnoDrawView.cxx
Line
Count
Source
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
 * This file incorporates work covered by the following license notice:
10
 *
11
 *   Licensed to the Apache Software Foundation (ASF) under one or more
12
 *   contributor license agreements. See the NOTICE file distributed
13
 *   with this work for additional information regarding copyright
14
 *   ownership. The ASF licenses this file to you under the Apache
15
 *   License, Version 2.0 (the "License"); you may not use this file
16
 *   except in compliance with the License. You may obtain a copy of
17
 *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
18
 */
19
20
#include <SdUnoDrawView.hxx>
21
22
#include <DrawController.hxx>
23
#include <DrawDocShell.hxx>
24
#include <DrawViewShell.hxx>
25
#include <drawdoc.hxx>
26
#include <unolayer.hxx>
27
#include <unomodel.hxx>
28
#include <Window.hxx>
29
#include <pres.hxx>
30
31
#include <comphelper/processfactory.hxx>
32
#include <cppuhelper/supportsservice.hxx>
33
#include <sfx2/dispatch.hxx>
34
#include <sfx2/viewfrm.hxx>
35
#include <svx/svdpagv.hxx>
36
#include <svx/unopage.hxx>
37
#include <sfx2/zoomitem.hxx>
38
#include <com/sun/star/drawing/DrawViewMode.hpp>
39
#include <com/sun/star/drawing/ShapeCollection.hpp>
40
#include <com/sun/star/drawing/XLayerManager.hpp>
41
#include <com/sun/star/view/DocumentZoomType.hpp>
42
43
#include <vector>
44
45
using namespace ::com::sun::star;
46
using namespace ::com::sun::star::uno;
47
using namespace ::com::sun::star::drawing;
48
49
namespace sd {
50
51
SdUnoDrawView::SdUnoDrawView(
52
    DrawViewShell& rViewShell,
53
    View& rView) noexcept
54
0
    :   mrDrawViewShell(rViewShell),
55
0
        mrView(rView)
56
0
{
57
0
}
Unexecuted instantiation: sd::SdUnoDrawView::SdUnoDrawView(sd::DrawViewShell&, sd::View&)
Unexecuted instantiation: sd::SdUnoDrawView::SdUnoDrawView(sd::DrawViewShell&, sd::View&)
58
59
SdUnoDrawView::~SdUnoDrawView() noexcept
60
0
{
61
0
}
62
63
bool SdUnoDrawView::getMasterPageMode() const noexcept
64
0
{
65
0
    return (mrDrawViewShell.GetEditMode() == EditMode::MasterPage);
66
0
}
67
68
void SdUnoDrawView::setMasterPageMode (bool bMasterPageMode) noexcept
69
0
{
70
0
    if ((mrDrawViewShell.GetEditMode() == EditMode::MasterPage) != bMasterPageMode)
71
0
    {
72
0
        mrDrawViewShell.ChangeEditMode (
73
0
            bMasterPageMode ? EditMode::MasterPage : EditMode::Page,
74
0
            mrDrawViewShell.IsLayerModeActive());
75
0
    }
76
0
}
77
78
bool SdUnoDrawView::getLayerMode() const noexcept
79
0
{
80
0
    return mrDrawViewShell.IsLayerModeActive();
81
0
}
82
83
void SdUnoDrawView::setLayerMode (bool bLayerMode) noexcept
84
0
{
85
0
    if (mrDrawViewShell.IsLayerModeActive() != bLayerMode)
86
0
    {
87
0
        mrDrawViewShell.ChangeEditMode (
88
0
            mrDrawViewShell.GetEditMode(),
89
0
            bLayerMode);
90
0
    }
91
0
}
92
93
rtl::Reference<SdLayer> SdUnoDrawView::getActiveLayer() const
94
0
{
95
    // Retrieve the layer manager from the model.
96
0
    SdXImpressDocument* pModel = GetModel();
97
0
    if (pModel == nullptr)
98
0
        return nullptr;
99
100
0
    SdDrawDocument* pSdModel = pModel->GetDoc();
101
0
    if (pSdModel == nullptr)
102
0
        return nullptr;
103
104
    // From the model get the current SdrLayer object via the layer admin.
105
0
    SdrLayerAdmin& rLayerAdmin = pSdModel->GetLayerAdmin ();
106
0
    SdrLayer* pLayer = rLayerAdmin.GetLayer (mrView.GetActiveLayer());
107
0
    if (pLayer == nullptr)
108
0
        return nullptr;
109
110
    // Get the corresponding XLayer object from the implementation
111
    // object of the layer manager.
112
0
    Reference<drawing::XLayerManager> xManager (pModel->getLayerManager(), uno::UNO_QUERY);
113
0
    SdLayerManager* pManager = dynamic_cast<SdLayerManager*> (xManager.get());
114
0
    if (!pManager)
115
0
        return nullptr;
116
117
0
    return pManager->GetLayer (pLayer);
118
0
}
119
120
void SdUnoDrawView::setActiveLayer (const Reference<drawing::XLayer>& rxLayer)
121
0
{
122
    // Get the SdrLayer object corresponding to the given reference.
123
0
    if ( ! rxLayer.is())
124
0
        return;
125
126
0
    SdLayer* pLayer = dynamic_cast<SdLayer*> (rxLayer.get());
127
0
    if (pLayer == nullptr)
128
0
        return;
129
130
0
    SdrLayer* pSdrLayer = pLayer->GetSdrLayer();
131
0
    if (pSdrLayer == nullptr)
132
0
        return;
133
134
    // Set the new active layer and make the change visible.
135
0
    mrView.SetActiveLayer (pSdrLayer->GetName());
136
0
    mrDrawViewShell.ResetActualLayer ();
137
0
}
138
139
// XSelectionSupplier
140
141
sal_Bool SAL_CALL SdUnoDrawView::select( const Any& aSelection )
142
0
{
143
0
    bool bOk = true;
144
145
0
    ::std::vector<SdrObject*> aObjects;
146
147
0
    SdrPage* pSdrPage = nullptr;
148
149
0
    Reference< drawing::XShape > xShape;
150
0
    aSelection >>= xShape;
151
152
0
    if(xShape.is())
153
0
    {
154
0
        SdrObject* pObj = SdrObject::getSdrObjectFromXShape( xShape );
155
0
        if( pObj )
156
0
        {
157
0
            pSdrPage = pObj->getSdrPageFromSdrObject();
158
0
            aObjects.push_back( pObj );
159
0
        }
160
0
        else
161
0
        {
162
0
            bOk = false;
163
0
        }
164
0
    }
165
0
    else
166
0
    {
167
0
        Reference< drawing::XShapes > xShapes;
168
0
        aSelection >>= xShapes;
169
0
        if( xShapes.is() )
170
0
        {
171
0
            const sal_uInt32 nCount = xShapes->getCount();
172
0
            for( sal_uInt32 i = 0; i < nCount; i++ )
173
0
            {
174
0
                xShapes->getByIndex(i) >>= xShape;
175
0
                if( xShape.is() )
176
0
                {
177
0
                    SdrObject* pObj = SdrObject::getSdrObjectFromXShape(xShape);
178
0
                    if( !pObj )
179
0
                    {
180
0
                        bOk = false;
181
0
                        break;
182
0
                    }
183
184
0
                    if( pSdrPage == nullptr )
185
0
                    {
186
0
                        pSdrPage = pObj->getSdrPageFromSdrObject();
187
0
                    }
188
0
                    else if( pSdrPage != pObj->getSdrPageFromSdrObject() )
189
0
                    {
190
0
                        bOk = false;
191
0
                        break;
192
0
                    }
193
194
0
                    aObjects.push_back( pObj );
195
0
                }
196
0
            }
197
0
        }
198
0
    }
199
200
0
    if( bOk )
201
0
    {
202
0
        if( pSdrPage )
203
0
        {
204
0
            setMasterPageMode( pSdrPage->IsMasterPage() );
205
0
            mrDrawViewShell.SwitchPage( (pSdrPage->GetPageNum() - 1) >> 1 );
206
0
            mrDrawViewShell.WriteFrameViewData();
207
0
        }
208
209
0
        SdrPageView *pPV = mrView.GetSdrPageView();
210
211
0
        if(pPV)
212
0
        {
213
            // first deselect all
214
0
            mrView.UnmarkAllObj( pPV );
215
216
0
            for( SdrObject* pObj : aObjects )
217
0
            {
218
0
                mrView.MarkObj( pObj, pPV );
219
0
            }
220
0
        }
221
0
        else
222
0
        {
223
0
            bOk = false;
224
0
        }
225
0
    }
226
227
0
    return bOk;
228
0
}
229
230
Any SAL_CALL SdUnoDrawView::getSelection()
231
0
{
232
0
    Any aAny;
233
234
0
    if( mrView.IsTextEdit() )
235
0
        mrView.getTextSelection( aAny );
236
237
0
    if( !aAny.hasValue() )
238
0
    {
239
0
        const SdrMarkList& rMarkList = mrView.GetMarkedObjectList();
240
0
        const size_t nCount = rMarkList.GetMarkCount();
241
0
        if( nCount )
242
0
        {
243
0
            Reference< drawing::XShapes > xShapes = drawing::ShapeCollection::create(
244
0
                        comphelper::getProcessComponentContext());
245
0
            for( size_t nNum = 0; nNum < nCount; ++nNum)
246
0
            {
247
0
                SdrMark *pMark = rMarkList.GetMark(nNum);
248
0
                if(pMark==nullptr)
249
0
                    continue;
250
251
0
                SdrObject *pObj = pMark->GetMarkedSdrObj();
252
0
                if(pObj==nullptr || pObj->getSdrPageFromSdrObject() == nullptr)
253
0
                    continue;
254
255
0
                Reference< drawing::XDrawPage > xPage( pObj->getSdrPageFromSdrObject()->getUnoPage(), UNO_QUERY);
256
257
0
                if(!xPage.is())
258
0
                    continue;
259
260
0
                SvxDrawPage* pDrawPage = comphelper::getFromUnoTunnel<SvxDrawPage>( xPage );
261
262
0
                if(pDrawPage==nullptr)
263
0
                    continue;
264
265
0
                Reference< drawing::XShape > xShape( pObj->getUnoShape(), UNO_QUERY );
266
267
0
                if(xShape.is())
268
0
                    xShapes->add(xShape);
269
0
            }
270
0
            aAny <<= xShapes;
271
0
        }
272
0
    }
273
274
0
    return aAny;
275
0
}
276
277
void SAL_CALL SdUnoDrawView::addSelectionChangeListener (
278
    const css::uno::Reference<css::view::XSelectionChangeListener>&)
279
0
{}
280
281
void SAL_CALL SdUnoDrawView::removeSelectionChangeListener (
282
    const css::uno::Reference<css::view::XSelectionChangeListener>&)
283
0
{}
284
285
void SdUnoDrawView::setFastPropertyValue (
286
    sal_Int32 nHandle,
287
        const Any& rValue)
288
0
{
289
0
    switch( nHandle )
290
0
    {
291
0
        case DrawController::PROPERTY_CURRENTPAGE:
292
0
            {
293
0
                Reference< drawing::XDrawPage > xPage;
294
0
                rValue >>= xPage;
295
0
                setCurrentPage( xPage );
296
0
            }
297
0
            break;
298
299
0
        case DrawController::PROPERTY_MASTERPAGEMODE:
300
0
            {
301
0
                bool bValue = false;
302
0
                rValue >>= bValue;
303
0
                setMasterPageMode( bValue );
304
0
            }
305
0
            break;
306
307
0
        case DrawController::PROPERTY_LAYERMODE:
308
0
            {
309
0
                bool bValue = false;
310
0
                rValue >>= bValue;
311
0
                setLayerMode( bValue );
312
0
            }
313
0
            break;
314
0
        case DrawController::PROPERTY_ACTIVE_LAYER:
315
0
            {
316
0
                Reference<drawing::XLayer> xLayer;
317
0
                rValue >>= xLayer;
318
0
                setActiveLayer (xLayer);
319
0
            }
320
0
            break;
321
0
        case DrawController::PROPERTY_ZOOMVALUE:
322
0
            {
323
0
                sal_Int16 nZoom = 0;
324
0
                rValue >>= nZoom;
325
0
                SetZoom( nZoom );
326
0
            }
327
0
            break;
328
0
        case DrawController::PROPERTY_ZOOMTYPE:
329
0
            {
330
0
                sal_Int16 nType = 0;
331
0
                rValue >>= nType;
332
0
                SetZoomType( nType );
333
0
            }
334
0
            break;
335
0
        case DrawController::PROPERTY_VIEWOFFSET:
336
0
            {
337
0
                awt::Point aOffset;
338
0
                rValue >>= aOffset;
339
0
                SetViewOffset( aOffset );
340
0
            }
341
0
            break;
342
0
        default:
343
0
            throw beans::UnknownPropertyException( OUString::number(nHandle), static_cast<cppu::OWeakObject*>(this));
344
0
    }
345
0
}
346
347
Any SAL_CALL SdUnoDrawView::getFastPropertyValue (
348
    sal_Int32 nHandle)
349
0
{
350
0
    Any aValue;
351
0
    switch( nHandle )
352
0
    {
353
0
        case DrawController::PROPERTY_CURRENTPAGE:
354
0
            aValue <<= getCurrentPage();
355
0
            break;
356
357
0
        case DrawController::PROPERTY_MASTERPAGEMODE:
358
0
            aValue <<= getMasterPageMode();
359
0
            break;
360
361
0
        case DrawController::PROPERTY_LAYERMODE:
362
0
            aValue <<= getLayerMode();
363
0
            break;
364
365
0
        case DrawController::PROPERTY_ACTIVE_LAYER:
366
0
            aValue <<= Reference<XLayer>(getActiveLayer());
367
0
            break;
368
369
0
        case DrawController::PROPERTY_ZOOMVALUE:
370
0
            aValue <<= GetZoom();
371
0
            break;
372
0
        case DrawController::PROPERTY_ZOOMTYPE:
373
0
            aValue <<= sal_Int16(css::view::DocumentZoomType::BY_VALUE);
374
0
            break;
375
0
        case DrawController::PROPERTY_VIEWOFFSET:
376
0
            aValue <<= GetViewOffset();
377
0
            break;
378
379
0
        case DrawController::PROPERTY_DRAWVIEWMODE:
380
0
            aValue = getDrawViewMode();
381
0
            break;
382
383
0
        default:
384
0
            throw beans::UnknownPropertyException( OUString::number(nHandle), static_cast<cppu::OWeakObject*>(this));
385
0
    }
386
387
0
    return aValue;
388
0
}
389
390
// XDrawView
391
392
void SAL_CALL SdUnoDrawView::setCurrentPage (
393
    const Reference< drawing::XDrawPage >& xPage )
394
0
{
395
0
    SvxDrawPage* pDrawPage = comphelper::getFromUnoTunnel<SvxDrawPage>( xPage );
396
0
    SdrPage *pSdrPage = pDrawPage ? pDrawPage->GetSdrPage() : nullptr;
397
398
0
    if(pSdrPage)
399
0
    {
400
        // End editing of text.  Otherwise the edited text object would
401
        // still be visible on the new page.
402
0
        mrDrawViewShell.GetView()->SdrEndTextEdit();
403
404
0
        setMasterPageMode( pSdrPage->IsMasterPage() );
405
0
        mrDrawViewShell.SwitchPage( (pSdrPage->GetPageNum() - 1) >> 1 );
406
0
        mrDrawViewShell.WriteFrameViewData();
407
0
    }
408
0
}
409
410
Reference< drawing::XDrawPage > SAL_CALL SdUnoDrawView::getCurrentPage()
411
0
{
412
0
    Reference< drawing::XDrawPage >  xPage;
413
414
0
    SdrPageView *pPV = mrView.GetSdrPageView();
415
0
    SdrPage* pPage = pPV ? pPV->GetPage() : nullptr;
416
417
0
    if(pPage)
418
0
        xPage.set( pPage->getUnoPage(), UNO_QUERY );
419
420
0
    return xPage;
421
0
}
422
423
sal_Int16 SdUnoDrawView::GetZoom() const
424
0
{
425
0
    if (mrDrawViewShell.GetActiveWindow() )
426
0
    {
427
0
        return static_cast<sal_Int16>(mrDrawViewShell.GetActiveWindow()->GetZoom());
428
0
    }
429
0
    else
430
0
    {
431
0
        return 0;
432
0
    }
433
0
}
434
435
void SdUnoDrawView::SetZoom( sal_Int16 nZoom )
436
0
{
437
0
    SvxZoomItem aZoomItem( SvxZoomType::PERCENT, nZoom );
438
439
0
    SfxViewFrame* pViewFrame = mrDrawViewShell.GetViewFrame();
440
0
    if( pViewFrame )
441
0
    {
442
0
        SfxDispatcher* pDispatcher = pViewFrame->GetDispatcher();
443
0
        if( pDispatcher )
444
0
        {
445
0
            pDispatcher->ExecuteList(SID_ATTR_ZOOM, SfxCallMode::SYNCHRON,
446
0
                    { &aZoomItem });
447
0
        }
448
0
    }
449
0
}
450
451
void SdUnoDrawView::SetViewOffset(const awt::Point& rWinPos )
452
0
{
453
0
    Point aWinPos( rWinPos.X, rWinPos.Y );
454
0
    aWinPos += mrDrawViewShell.GetViewOrigin();
455
0
    mrDrawViewShell.SetWinViewPos( aWinPos );
456
0
}
457
458
awt::Point SdUnoDrawView::GetViewOffset() const
459
0
{
460
0
    Point aRet = mrDrawViewShell.GetWinViewPos();
461
0
    aRet -= mrDrawViewShell.GetViewOrigin();
462
463
0
    return awt::Point( aRet.X(), aRet.Y() );
464
0
}
465
466
void SdUnoDrawView::SetZoomType ( sal_Int16 nType )
467
0
{
468
0
    SfxViewFrame* pViewFrame = mrDrawViewShell.GetViewFrame();
469
0
    if( !pViewFrame )
470
0
        return;
471
472
0
    SfxDispatcher* pDispatcher = pViewFrame->GetDispatcher();
473
0
    if( !pDispatcher )
474
0
        return;
475
476
0
    SvxZoomType eZoomType;
477
0
    switch( nType )
478
0
    {
479
0
        case css::view::DocumentZoomType::OPTIMAL:
480
0
            eZoomType = SvxZoomType::OPTIMAL;
481
0
            break;
482
483
0
        case css::view::DocumentZoomType::PAGE_WIDTH:
484
0
        case css::view::DocumentZoomType::PAGE_WIDTH_EXACT:
485
0
            eZoomType = SvxZoomType::PAGEWIDTH;
486
0
            break;
487
488
0
        case css::view::DocumentZoomType::ENTIRE_PAGE:
489
0
            eZoomType = SvxZoomType::WHOLEPAGE;
490
0
            break;
491
492
0
        default:
493
0
            return;
494
0
    }
495
0
    SvxZoomItem aZoomItem( eZoomType );
496
0
    pDispatcher->ExecuteList(SID_ATTR_ZOOM, SfxCallMode::SYNCHRON,
497
0
            { &aZoomItem });
498
0
}
499
500
SdXImpressDocument* SdUnoDrawView::GetModel() const noexcept
501
0
{
502
0
    if (mrView.GetDocSh()!=nullptr)
503
0
    {
504
0
        Reference<frame::XModel> xModel (mrView.GetDocSh()->GetModel());
505
0
        return comphelper::getFromUnoTunnel<SdXImpressDocument>(xModel);
506
0
    }
507
0
    else
508
0
        return nullptr;
509
0
}
510
511
Any SdUnoDrawView::getDrawViewMode() const
512
0
{
513
0
    Any aRet;
514
0
    switch( mrDrawViewShell.GetPageKind() )
515
0
    {
516
0
    case PageKind::Notes:  aRet <<= DrawViewMode_NOTES; break;
517
0
    case PageKind::Handout: aRet <<= DrawViewMode_HANDOUT; break;
518
0
    case PageKind::Standard: aRet <<= DrawViewMode_DRAW; break;
519
0
    }
520
0
    return aRet;
521
0
}
522
523
// XServiceInfo
524
OUString SAL_CALL SdUnoDrawView::getImplementationName(  )
525
0
{
526
0
    return u"com.sun.star.comp.sd.SdUnoDrawView"_ustr ;
527
0
}
528
529
sal_Bool SAL_CALL SdUnoDrawView::supportsService( const OUString& ServiceName )
530
0
{
531
0
    return cppu::supportsService( this, ServiceName );
532
0
}
533
534
Sequence< OUString > SAL_CALL SdUnoDrawView::getSupportedServiceNames(  )
535
0
{
536
0
    return { u"com.sun.star.drawing.DrawingDocumentDrawView"_ustr };
537
0
}
538
539
} // end of namespace sd
540
541
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */