Coverage Report

Created: 2026-07-10 11:04

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libreoffice/sd/source/ui/sidebar/MasterPageContainer.hxx
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
#pragma once
21
22
#include <vcl/image.hxx>
23
24
#include <memory>
25
26
class SdPage;
27
28
template <typename Arg, typename Ret> class Link;
29
30
namespace sd::sidebar
31
{
32
class MasterPageDescriptor;
33
class MasterPageContainerChangeEvent;
34
35
/** This container manages the master pages used by the MasterPagesSelector
36
    controls.  It uses internally a singleton implementation object.
37
    Therefore, all MasterPageContainer object operator on the same set of
38
    master pages.  Each MasterPageContainer, however, has its own
39
    PreviewSize value and thus can independently switch between large and
40
    small previews.
41
42
    The container maintains its own document to store master page objects.
43
44
    For each master page container stores its URL, preview bitmap, page
45
    name, and, if available, the page object.
46
47
    Entries are accessed via a Token, which is mostly a numerical index but
48
    whose values do not necessarily have to be consecutive.
49
*/
50
class MasterPageContainer final
51
{
52
public:
53
    typedef int Token;
54
    static const Token NIL_TOKEN = -1;
55
56
    MasterPageContainer();
57
    ~MasterPageContainer();
58
59
    void AddChangeListener(const Link<MasterPageContainerChangeEvent&, void>& rLink);
60
    void RemoveChangeListener(const Link<MasterPageContainerChangeEvent&, void>& rLink);
61
62
    enum PreviewSize
63
    {
64
        SMALL,
65
        LARGE
66
    };
67
    /** There are two different preview sizes, a small one and a large one.
68
        Which one is used by the called container can be changed with this
69
        method.
70
        When the preview size is changed then all change listeners are
71
        notified of this.
72
    */
73
    void SetPreviewSize(PreviewSize eSize);
74
75
    /** Returns the preview size.
76
    */
77
0
    PreviewSize GetPreviewSize() const { return mePreviewSize; }
78
79
    enum PreviewState
80
    {
81
        PS_AVAILABLE,
82
        PS_CREATABLE,
83
        PS_PREPARING,
84
        PS_NOT_AVAILABLE
85
    };
86
    PreviewState GetPreviewState(Token aToken);
87
88
    const Size& GetPreviewSizePixel();
89
90
    /** This method is typically called for entries in the container for
91
        which GetPreviewState() returns OS_CREATABLE.  The creation of the
92
        preview is then scheduled to be executed asynchronously at a later
93
        point in time.  When the preview is available the change listeners
94
        will be notified.
95
    */
96
    bool RequestPreview(Token aToken);
97
98
    /** Each entry of the container is either the first page of a template
99
        document or is a master page of an Impress document.
100
    */
101
    enum Origin
102
    {
103
        MASTERPAGE, // Master page of a document.
104
        TEMPLATE, // First page of a template file.
105
        DEFAULT, // Empty master page with default style.
106
        UNKNOWN
107
    };
108
109
    /** Put the master page identified and described by the given parameters
110
        into the container.  When there already is a master page with the
111
        given URL, page name, or object pointer (when that is not NULL) then
112
        the existing entry is replaced/updated by the given one.  Otherwise
113
        a new entry is inserted.
114
    */
115
    Token PutMasterPage(const std::shared_ptr<MasterPageDescriptor>& rDescriptor);
116
    void AcquireToken(Token aToken);
117
    void ReleaseToken(Token aToken);
118
119
    /** This and the GetTokenForIndex() methods can be used to iterate over
120
        all members of the container.
121
    */
122
    int GetTokenCount() const;
123
124
    /** Determine whether the container has a member for the given token.
125
    */
126
    bool HasToken(Token aToken) const;
127
128
    /** Return a token for an index in the range
129
        0 <= index < GetTokenCount().
130
    */
131
    Token GetTokenForIndex(int nIndex);
132
133
    Token GetTokenForURL(const OUString& sURL);
134
    Token GetTokenForStyleName(const OUString& sStyleName);
135
    Token GetTokenForPageObject(const SdPage* pPage);
136
137
    OUString GetURLForToken(Token aToken);
138
    OUString GetPageNameForToken(Token aToken);
139
    OUString GetStyleNameForToken(Token aToken);
140
    SdPage* GetPageObjectForToken(Token aToken, bool bLoad);
141
    Origin GetOriginForToken(Token aToken);
142
    sal_Int32 GetTemplateIndexForToken(Token aToken);
143
    std::shared_ptr<MasterPageDescriptor> GetDescriptorForToken(Token aToken);
144
145
    void InvalidatePreview(Token aToken);
146
147
    /** Return a preview for the specified token.  When the preview is not
148
        present then the PreviewProvider associated with the token is
149
        executed only when that is not expensive.  It is the responsibility
150
        of the caller to call RequestPreview() to do the same
151
        (asynchronously) for expensive PreviewProviders.
152
        Call GetPreviewState() to find out if that is necessary.
153
        @param aToken
154
            This token specifies for which master page to return the preview.
155
            Tokens are returned for example by the GetTokenFor...() methods.
156
        @return
157
            The returned image is the requested preview or a substitution.
158
    */
159
    Image GetPreviewForToken(Token aToken);
160
161
private:
162
    class Implementation;
163
    std::shared_ptr<Implementation> mpImpl;
164
    PreviewSize mePreviewSize;
165
};
166
167
/** For some changes to the set of master pages in a MasterPageContainer or
168
    to the data stored for each master page one or more events are sent to
169
    registered listeners.
170
    Each event has an event type and a token that tells the listener where
171
    the change took place.
172
*/
173
class MasterPageContainerChangeEvent
174
{
175
public:
176
    enum class EventType
177
    {
178
        // A master page was added to the container.
179
        CHILD_ADDED,
180
        // A master page was removed from the container.
181
        CHILD_REMOVED,
182
        // The preview of a master page has changed.
183
        PREVIEW_CHANGED,
184
        // The size of a preview has changed.
185
        SIZE_CHANGED,
186
        // Some of the data stored for a master page has changed.
187
        DATA_CHANGED,
188
        // The TemplateIndex of a master page has changed.
189
        INDEX_CHANGED,
190
    } meEventType;
191
192
    // Token of the container entry whose data changed or which was added or
193
    // removed.
194
    MasterPageContainer::Token maChildToken;
195
};
196
197
} // end of namespace sd::sidebar
198
199
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */