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 INCLUDED_SVX_SVDMARK_HXX
21 : #define INCLUDED_SVX_SVDMARK_HXX
22 :
23 : #include <rtl/ustring.hxx>
24 : #include <svx/svxdllapi.h>
25 : #include <svx/sdrobjectuser.hxx>
26 : #include <tools/solar.h>
27 :
28 : #include <set>
29 : #include <vector>
30 :
31 : class Rectangle;
32 : class SdrPage;
33 : class SdrObjList;
34 : class SdrObject;
35 : class SdrPageView;
36 :
37 : typedef std::set<sal_uInt16> SdrUShortCont;
38 :
39 :
40 : // Everything a View needs to know about a selected object
41 : class SVX_DLLPUBLIC SdrMark : public sdr::ObjectUser
42 : {
43 : protected:
44 : SdrObject* mpSelectedSdrObject; // the selected object
45 : SdrPageView* mpPageView;
46 : SdrUShortCont* mpPoints; // Selected Points
47 : SdrUShortCont* mpLines; // Selected Line
48 : SdrUShortCont* mpGluePoints; // Selected Gluepoints (their Id's)
49 : bool mbCon1; // for Connectors
50 : bool mbCon2; // for Connectors
51 : sal_uInt16 mnUser; // E.g. for CopyObjects, also copy Edges
52 :
53 : public:
54 : explicit SdrMark(SdrObject* pNewObj = 0L, SdrPageView* pNewPageView = 0L);
55 : SdrMark(const SdrMark& rMark);
56 : virtual ~SdrMark();
57 :
58 : // Derived from ObjectUser
59 : virtual void ObjectInDestruction(const SdrObject& rObject) SAL_OVERRIDE;
60 :
61 : SdrMark& operator=(const SdrMark& rMark);
62 : bool operator==(const SdrMark& rMark) const;
63 : bool operator!=(const SdrMark& rMark) const
64 : {
65 : return !(operator==(rMark));
66 : }
67 :
68 : void SetMarkedSdrObj(SdrObject* pNewObj);
69 9469 : SdrObject* GetMarkedSdrObj() const { return mpSelectedSdrObject;}
70 :
71 4161 : SdrPageView* GetPageView() const
72 : {
73 4161 : return mpPageView;
74 : }
75 :
76 0 : void SetPageView(SdrPageView* pNewPageView)
77 : {
78 0 : mpPageView = pNewPageView;
79 0 : }
80 :
81 0 : void SetCon1(bool bOn)
82 : {
83 0 : mbCon1 = bOn;
84 0 : }
85 :
86 0 : bool IsCon1() const
87 : {
88 0 : return mbCon1;
89 : }
90 :
91 0 : void SetCon2(bool bOn)
92 : {
93 0 : mbCon2 = bOn;
94 0 : }
95 :
96 0 : bool IsCon2() const
97 : {
98 0 : return mbCon2;
99 : }
100 :
101 0 : void SetUser(sal_uInt16 nVal)
102 : {
103 0 : mnUser = nVal;
104 0 : }
105 :
106 0 : sal_uInt16 GetUser() const
107 : {
108 0 : return mnUser;
109 : }
110 :
111 427 : const SdrUShortCont* GetMarkedPoints() const
112 : {
113 427 : return mpPoints;
114 : }
115 :
116 : const SdrUShortCont* GetMarkedLines() const
117 : {
118 : return mpLines;
119 : }
120 :
121 775 : const SdrUShortCont* GetMarkedGluePoints() const
122 : {
123 775 : return mpGluePoints;
124 : }
125 :
126 5 : SdrUShortCont* GetMarkedPoints()
127 : {
128 5 : return mpPoints;
129 : }
130 :
131 : SdrUShortCont* GetMarkedLines()
132 : {
133 : return mpLines;
134 : }
135 :
136 781 : SdrUShortCont* GetMarkedGluePoints()
137 : {
138 781 : return mpGluePoints;
139 : }
140 :
141 0 : SdrUShortCont* ForceMarkedPoints()
142 : {
143 0 : if(!mpPoints)
144 0 : mpPoints = new SdrUShortCont;
145 :
146 0 : return mpPoints;
147 : }
148 :
149 : SdrUShortCont* ForceMarkedLines()
150 : {
151 : if(!mpLines)
152 : mpLines = new SdrUShortCont;
153 :
154 : return mpLines;
155 : }
156 :
157 0 : SdrUShortCont* ForceMarkedGluePoints()
158 : {
159 0 : if(!mpGluePoints)
160 0 : mpGluePoints = new SdrUShortCont;
161 :
162 0 : return mpGluePoints;
163 : }
164 : };
165 :
166 : class SVX_DLLPUBLIC SdrMarkList
167 : {
168 : protected:
169 : std::vector<SdrMark*> maList;
170 :
171 : OUString maMarkName;
172 : OUString maPointName;
173 : OUString maGluePointName;
174 :
175 : bool mbPointNameOk;
176 : bool mbGluePointNameOk;
177 : bool mbNameOk;
178 : bool mbSorted;
179 :
180 : private:
181 : SVX_DLLPRIVATE bool operator==(const SdrMarkList& rCmpMarkList) const;
182 : SVX_DLLPRIVATE void ImpForceSort();
183 :
184 : private:
185 : SVX_DLLPRIVATE const OUString& GetPointMarkDescription(bool bGlue) const;
186 :
187 : public:
188 44860 : SdrMarkList()
189 : : maList(),
190 : mbPointNameOk(false),
191 : mbGluePointNameOk(false),
192 : mbNameOk(false),
193 44860 : mbSorted(true)
194 : {
195 44860 : }
196 :
197 11 : SdrMarkList(const SdrMarkList& rLst)
198 11 : : maList()
199 : {
200 11 : *this = rLst;
201 11 : }
202 :
203 44600 : ~SdrMarkList()
204 44600 : {
205 44600 : Clear();
206 44600 : }
207 :
208 : void Clear();
209 : void ForceSort() const;
210 3699 : void SetUnsorted()
211 : {
212 3699 : mbSorted = false;
213 3699 : }
214 :
215 685949 : size_t GetMarkCount() const
216 : {
217 685949 : return maList.size();
218 : }
219 :
220 : SdrMark* GetMark(size_t nNum) const;
221 : // returns SAL_MAX_SIZE if not found
222 : size_t FindObject(const SdrObject* pObj) const;
223 : void InsertEntry(const SdrMark& rMark, bool bChkSort = true);
224 : void DeleteMark(size_t nNum);
225 : void ReplaceMark(const SdrMark& rNewMark, size_t nNum);
226 : void Merge(const SdrMarkList& rSrcList, bool bReverse = false);
227 : bool DeletePageView(const SdrPageView& rPV);
228 : bool InsertPageView(const SdrPageView& rPV);
229 :
230 68923 : void SetNameDirty()
231 : {
232 68923 : mbNameOk = false;
233 68923 : mbPointNameOk = false;
234 68923 : mbGluePointNameOk = false;
235 68923 : }
236 :
237 : // A verbal description of selected objects e.g.:
238 : // "27 Lines", "12 Objects", "Polygon" or even "Not an object"
239 : const OUString& GetMarkDescription() const;
240 0 : const OUString& GetPointMarkDescription() const
241 : {
242 0 : return GetPointMarkDescription(false);
243 : }
244 :
245 0 : const OUString& GetGluePointMarkDescription() const
246 : {
247 0 : return GetPointMarkDescription(true);
248 : }
249 :
250 : // pPage=0L: Selection of everything! Respect Pages
251 : bool TakeBoundRect(SdrPageView* pPageView, Rectangle& rRect) const;
252 : bool TakeSnapRect(SdrPageView* pPageView, Rectangle& rRect) const;
253 :
254 : // Es werden saemtliche Entries kopiert!
255 : void operator=(const SdrMarkList& rLst);
256 : };
257 :
258 :
259 : // migrate selections
260 :
261 : namespace sdr
262 : {
263 9438 : class SVX_DLLPUBLIC ViewSelection
264 : {
265 : SdrMarkList maMarkedObjectList;
266 : SdrMarkList maEdgesOfMarkedNodes;
267 : SdrMarkList maMarkedEdgesOfMarkedNodes;
268 : std::vector<SdrObject*> maAllMarkedObjects;
269 :
270 : // bitfield
271 : bool mbEdgesOfMarkedNodesDirty : 1;
272 :
273 : SVX_DLLPRIVATE void ImpForceEdgesOfMarkedNodes();
274 : SVX_DLLPRIVATE void ImplCollectCompleteSelection(SdrObject* pObj);
275 :
276 : public:
277 : ViewSelection();
278 :
279 : void SetEdgesOfMarkedNodesDirty();
280 :
281 636870 : const SdrMarkList& GetMarkedObjectList() const
282 : {
283 636870 : return maMarkedObjectList;
284 : }
285 :
286 : const SdrMarkList& GetEdgesOfMarkedNodes() const;
287 : const SdrMarkList& GetMarkedEdgesOfMarkedNodes() const;
288 : const std::vector<SdrObject*>& GetAllMarkedObjects() const;
289 :
290 18088 : SdrMarkList& GetMarkedObjectListWriteAccess()
291 : {
292 18088 : return maMarkedObjectList;
293 : }
294 : };
295 : } // end of namespace sdr
296 :
297 : #endif // INCLUDED_SVX_SVDMARK_HXX
298 :
299 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|