summaryrefslogtreecommitdiff
path: root/include/svx/svdlayer.hxx
blob: 2289efb32975e747f1d1006c7005c44c2d713835 (plain)
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
/* -*- 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 .
 */

#ifndef INCLUDED_SVX_SVDLAYER_HXX
#define INCLUDED_SVX_SVDLAYER_HXX

#include <svx/svdsob.hxx>
#include <svx/svdtypes.hxx>
#include <svx/svxdllapi.h>
#include <memory>
#include <vector>

/**
 * Note on the layer mix with symbolic/ID-based interface:
 * You create a new layer with
 *    pLayerAdmin->NewLayer("A new layer");
 * This layer is automatically appended to the end of the list.
 *
 * The same holds true for layer sets.
 *
 * The interface for SdrLayerSet is based on LayerIDs. The app must get
 * an ID for it at the SdrLayerAdmin, like so:
 *   SdrLayerID nLayerID=pLayerAdmin->GetLayerID("A new layer");
 *
 * If the layer cannot be found, SDRLAYER_NOTFOUND is returned.
 * The methods with the ID interface usually handle that error in a
 * meaningful way.
 * If you not only got a name, but even a SdrLayer*, you can get the ID
 * much faster via the layer directly.
 *
 * @param bInherited:
 * TRUE If the layer/layer set cannot be found, we examine the parent layer admin,
 *      whether there's a corresponding definition
 * FALSE We only search this layer admin
 *
 * Every page's layer admin has a parent layer admin (the model's). The model
 * itself does not have a parent.
 */

class SdrModel;

class SVX_DLLPUBLIC SdrLayer
{
    friend class SdrLayerAdmin;

    OUString maName;
    OUString maTitle;
    OUString maDescription;
    bool mbVisibleODF; // corresponds to ODF draw:display
    bool mbPrintableODF; // corresponds to ODF draw:display
    bool mbLockedODF; // corresponds to ODF draw:protected
    SdrModel*  pModel; // For broadcasting
    SdrLayerID const nID;

    SdrLayer(SdrLayerID nNewID, const OUString& rNewName);

public:
    bool operator==(const SdrLayer& rCmpLayer) const;

    void SetName(const OUString& rNewName);
    const OUString& GetName() const { return maName; }

    void SetTitle(const OUString& rTitle) { maTitle = rTitle; }
    const OUString& GetTitle() const { return maTitle; }

    void SetDescription(const OUString& rDesc) { maDescription = rDesc; }
    const OUString& GetDescription() const { return maDescription; }

    void SetVisibleODF(bool bVisibleODF) { mbVisibleODF = bVisibleODF; }
    bool IsVisibleODF() const { return mbVisibleODF; }

    void SetPrintableODF(bool bPrintableODF) { mbPrintableODF = bPrintableODF; }
    bool IsPrintableODF() const { return mbPrintableODF; }

    void SetLockedODF(bool bLockedODF) { mbLockedODF = bLockedODF; }
    bool IsLockedODF() const { return mbLockedODF; }

    SdrLayerID    GetID() const                               { return nID; }
    void          SetModel(SdrModel* pNewModel)               { pModel=pNewModel; }
};

#define SDRLAYER_MAXCOUNT 255
#define SDRLAYERPOS_NOTFOUND 0xffff

// When Changing the layer data you currently have to set the Modify flag manually
class SVX_DLLPUBLIC SdrLayerAdmin {
friend class SdrView;
friend class SdrModel;
friend class SdrPage;

protected:
    std::vector<std::unique_ptr<SdrLayer>> maLayers;
    SdrLayerAdmin* pParent; // The page's admin knows the doc's admin
    SdrModel* pModel; // For broadcasting
    OUString maControlLayerName;
protected:
    // Find a LayerID which is not in use yet. If all have been used up,
    // we return 0.
    // If you want to play safe, check GetLayerCount()<SDRLAYER_MAXCOUNT
    // first, else all are given away already.
    SdrLayerID         GetUniqueLayerID() const;
    void               Broadcast() const;
public:
    explicit SdrLayerAdmin(SdrLayerAdmin* pNewParent=nullptr);
    SdrLayerAdmin(const SdrLayerAdmin& rSrcLayerAdmin);
    ~SdrLayerAdmin();
    SdrLayerAdmin& operator=(const SdrLayerAdmin& rSrcLayerAdmin);

    void               SetModel(SdrModel* pNewModel);

    void               InsertLayer(std::unique_ptr<SdrLayer> pLayer, sal_uInt16 nPos);
    std::unique_ptr<SdrLayer> RemoveLayer(sal_uInt16 nPos);

    // Delete all layers
    void               ClearLayers();

    // New layer is created and inserted
    SdrLayer*          NewLayer(const OUString& rName, sal_uInt16 nPos=0xFFFF);

    // Iterate over all layers
    sal_uInt16         GetLayerCount() const                                         { return sal_uInt16(maLayers.size()); }

    SdrLayer*          GetLayer(sal_uInt16 i)                                        { return maLayers[i].get(); }
    const SdrLayer*    GetLayer(sal_uInt16 i) const                                  { return maLayers[i].get(); }

    sal_uInt16         GetLayerPos(const SdrLayer* pLayer) const;

    SdrLayer*          GetLayer(const OUString& rName);
    const SdrLayer*    GetLayer(const OUString& rName) const;
    SdrLayerID         GetLayerID(const OUString& rName) const;
    SdrLayer*          GetLayerPerID(SdrLayerID nID) { return const_cast<SdrLayer*>(const_cast<const SdrLayerAdmin*>(this)->GetLayerPerID(nID)); }
    const SdrLayer*    GetLayerPerID(SdrLayerID nID) const;

    void               SetControlLayerName(const OUString& rNewName);
    const OUString&    GetControlLayerName() const { return maControlLayerName; }

    // Removes all elements in rOutSet and then adds all IDs of layers from member aLayer
    // that fulfill the criterion visible, printable, or locked respectively.
    void               getVisibleLayersODF( SdrLayerIDSet& rOutSet) const;
    void               getPrintableLayersODF( SdrLayerIDSet& rOutSet) const;
    void               getLockedLayersODF( SdrLayerIDSet& rOutSet) const;

    // Generates a bitfield for settings.xml from the SdrLayerIDSet.
    // Output is a UNO sequence of BYTE (which is 'short' in API).
    void               QueryValue(const SdrLayerIDSet& rViewLayerSet, css::uno::Any& rAny);
};

#endif // INCLUDED_SVX_SVDLAYER_HXX

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */