Line data Source code
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 : #ifndef _SVDLAYER_HXX
21 : #define _SVDLAYER_HXX
22 :
23 : #include <tools/string.hxx>
24 : #include <tools/stream.hxx>
25 : #include <svx/svdsob.hxx>
26 : #include <svx/svdtypes.hxx> // fuer typedef SdrLayerID
27 : #include "svx/svxdllapi.h"
28 : #include <algorithm>
29 :
30 : class SdrModel;
31 :
32 : class SVX_DLLPUBLIC SdrLayer
33 : {
34 : friend class SdrLayerAdmin;
35 : protected:
36 : String aName;
37 : String maTitle;
38 : String maDescription;
39 : SdrModel* pModel; // zum Broadcasten
40 : sal_uInt16 nType; // 0=Userdefined,1=Standardlayer
41 : SdrLayerID nID;
42 : protected:
43 : SdrLayer(SdrLayerID nNewID, const String& rNewName) { nID=nNewID; aName=rNewName; nType=0; pModel=NULL; }
44 : void SetID(SdrLayerID nNewID) { nID=nNewID; }
45 : public:
46 : SdrLayer(): pModel(NULL),nType(0),nID(0) {}
47 : bool operator==(const SdrLayer& rCmpLayer) const;
48 : bool operator!=(const SdrLayer& rCmpLayer) const { return !operator==(rCmpLayer); }
49 :
50 : void SetName(const String& rNewName);
51 0 : const String& GetName() const { return aName; }
52 :
53 10 : void SetTitle(const String& rTitle) { maTitle = rTitle; }
54 0 : const String& GetTitle() const { return maTitle; }
55 :
56 10 : void SetDescription(const String& rDesc) { maDescription = rDesc; }
57 0 : const String& GetDescription() const { return maDescription; }
58 :
59 1572 : SdrLayerID GetID() const { return nID; }
60 : void SetModel(SdrModel* pNewModel) { pModel=pNewModel; }
61 : SdrModel* GetModel() const { return pModel; }
62 : // Einem SdrLayer kann man sagen dass er ein (der) Standardlayer sein soll.
63 : // Es wird dann laenderspeziefisch der passende Name gesetzt. SetName()
64 : // setzt das Flag "StandardLayer" ggf. zurueck auf "Userdefined".
65 : void SetStandardLayer(bool bStd = true);
66 : bool IsStandardLayer() const { return nType==1; }
67 : };
68 :
69 : // Beim Aendern von Layerdaten muss man derzeit
70 : // noch selbst das Modify-Flag am Model setzen.
71 : #define SDRLAYER_MAXCOUNT 255
72 : class SVX_DLLPUBLIC SdrLayerAdmin {
73 : friend class SdrView;
74 : friend class SdrModel;
75 : friend class SdrPage;
76 :
77 : protected:
78 : std::vector<SdrLayer*> aLayer;
79 : SdrLayerAdmin* pParent; // Der Admin der Seite kennt den Admin des Docs
80 : SdrModel* pModel; // zum Broadcasten
81 : String aControlLayerName;
82 : protected:
83 : // Eine noch nicht verwendete LayerID raussuchen. Sind bereits alle
84 : // verbraucht, so gibt's 'ne 0. Wer sicher gehen will, muss vorher
85 : // GetLayerCount()<SDRLAYER_MAXCOUNT abfragen, denn sonst sind alle
86 : // vergeben.
87 : SdrLayerID GetUniqueLayerID() const;
88 : void Broadcast() const;
89 : public:
90 : explicit SdrLayerAdmin(SdrLayerAdmin* pNewParent=NULL);
91 : SdrLayerAdmin(const SdrLayerAdmin& rSrcLayerAdmin);
92 : ~SdrLayerAdmin();
93 : const SdrLayerAdmin& operator=(const SdrLayerAdmin& rSrcLayerAdmin);
94 : bool operator==(const SdrLayerAdmin& rCmpLayerAdmin) const;
95 : bool operator!=(const SdrLayerAdmin& rCmpLayerAdmin) const { return !operator==(rCmpLayerAdmin); }
96 : SdrLayerAdmin* GetParent() const { return pParent; }
97 : void SetParent(SdrLayerAdmin* pNewParent) { pParent=pNewParent; }
98 : void SetModel(SdrModel* pNewModel);
99 : SdrModel* GetModel() const { return pModel; }
100 : void InsertLayer(SdrLayer* pLayer)
101 : {
102 : aLayer.push_back(pLayer);
103 : pLayer->SetModel(pModel);
104 : Broadcast();
105 : }
106 : void InsertLayer(SdrLayer* pLayer, sal_uInt16 nPos)
107 : {
108 : if(nPos==0xFFFF)
109 : aLayer.push_back(pLayer);
110 : else
111 : aLayer.insert(aLayer.begin() + nPos, pLayer);
112 : pLayer->SetModel(pModel);
113 : Broadcast();
114 : }
115 : SdrLayer* RemoveLayer(sal_uInt16 nPos);
116 : // Alle Layer loeschen
117 : void ClearLayer();
118 : // Neuer Layer wird angelegt und eingefuegt
119 : SdrLayer* NewLayer(const String& rName, sal_uInt16 nPos=0xFFFF);
120 : void DeleteLayer(SdrLayer* pLayer)
121 : {
122 : std::vector<SdrLayer*>::iterator it = std::find(aLayer.begin(), aLayer.end(), pLayer);
123 : if( it == aLayer.end() )
124 : return;
125 : aLayer.erase(it);
126 : delete pLayer;
127 : Broadcast();
128 : }
129 : // Neuer Layer, Name wird aus der Resource geholt
130 : SdrLayer* NewStandardLayer(sal_uInt16 nPos=0xFFFF);
131 :
132 : // Iterieren ueber alle Layer
133 0 : sal_uInt16 GetLayerCount() const { return sal_uInt16(aLayer.size()); }
134 0 : SdrLayer* GetLayer(sal_uInt16 i) { return aLayer[i]; }
135 0 : const SdrLayer* GetLayer(sal_uInt16 i) const { return aLayer[i]; }
136 :
137 : sal_uInt16 GetLayerPos(SdrLayer* pLayer) const;
138 :
139 20 : SdrLayer* GetLayer(const String& rName, bool bInherited) { return (SdrLayer*)(((const SdrLayerAdmin*)this)->GetLayer(rName,bInherited)); }
140 : const SdrLayer* GetLayer(const String& rName, bool bInherited) const;
141 : SdrLayerID GetLayerID(const String& rName, bool bInherited) const;
142 0 : SdrLayer* GetLayerPerID(sal_uInt16 nID) { return (SdrLayer*)(((const SdrLayerAdmin*)this)->GetLayerPerID(nID)); }
143 : const SdrLayer* GetLayerPerID(sal_uInt16 nID) const;
144 :
145 20 : void SetControlLayerName(const String& rNewName) { aControlLayerName=rNewName; }
146 0 : const String& GetControlLayerName() const { return aControlLayerName; }
147 : };
148 :
149 : /*
150 : Anmerkung zu den Layer - Gemischt symbolisch/ID-basierendes Interface
151 : Einen neuen Layer macht man sich mit:
152 : pLayerAdmin->NewLayer("Der neue Layer");
153 : Der Layer wird dann automatisch an das Ende der Liste angehaengt.
154 : Entsprechdes gilt fuer Layersets gleichermassen.
155 : Das Interface am SdrLayerSet basiert auf LayerID's. Die App muss sich
156 : dafuer am SdrLayerAdmin eine ID abholen:
157 : SdrLayerID nLayerID=pLayerAdmin->GetLayerID("Der neue Layer");
158 : Wird der Layer nicht gefunden, so liefert die Methode SDRLAYER_NOTFOUND
159 : zurueck. Die Methoden mit ID-Interface fangen diesen Wert jedoch i.d.R
160 : sinnvoll ab.
161 : Hat man nicht nur den Namen, sondern gar einen SdrLayer*, so kann man
162 : sich die ID natuerlich wesentlich schneller direkt vom Layer abholen.
163 : bInherited:
164 : TRUE: Wird der Layer/LayerSet nicht gefunden, so wird im Parent-LayerAdmin
165 : nachgesehen, ob es dort einen entsprechende Definition gibt.
166 : FALSE: Es wird nur dieser LayerAdmin durchsucht.
167 : Jeder LayerAdmin einer Seite hat einen Parent-LayerAdmin, n�mlich den des
168 : Model. Das Model selbst hat keinen Parent.
169 : */
170 :
171 : #endif //_SVDLAYER_HXX
172 :
173 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|