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