Line data Source code
1 : /*
2 : * This file is part of the LibreOffice project.
3 : *
4 : * This Source Code Form is subject to the terms of the Mozilla Public
5 : * License, v. 2.0. If a copy of the MPL was not distributed with this
6 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
7 : *
8 : * This file incorporates work covered by the following license notice:
9 : *
10 : * Licensed to the Apache Software Foundation (ASF) under one or more
11 : * contributor license agreements. See the NOTICE file distributed
12 : * with this work for additional information regarding copyright
13 : * ownership. The ASF licenses this file to you under the Apache
14 : * License, Version 2.0 (the "License"); you may not use this file
15 : * except in compliance with the License. You may obtain a copy of
16 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
17 : */
18 :
19 : #include "svx/sidebar/SelectionAnalyzer.hxx"
20 : #include "svx/svdmrkv.hxx"
21 : #include "svx/svdobj.hxx"
22 : #include "svx/svdotext.hxx"
23 : #include "svx/svdpage.hxx"
24 : #include "svx/fmglob.hxx"
25 : #include "svx/globl3d.hxx"
26 :
27 : using sfx2::sidebar::EnumContext;
28 :
29 :
30 : namespace svx { namespace sidebar {
31 :
32 0 : EnumContext::Context SelectionAnalyzer::GetContextForSelection_SC (const SdrMarkList& rMarkList)
33 : {
34 0 : EnumContext::Context eContext = EnumContext::Context_Unknown;
35 :
36 0 : switch (rMarkList.GetMarkCount())
37 : {
38 : case 0:
39 : // Empty selection. Return Context_Unknown to let the caller
40 : // substitute it with the default context.
41 0 : break;
42 :
43 : case 1:
44 : {
45 0 : SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
46 0 : if ( pObj->ISA(SdrTextObj) && ((SdrTextObj*)pObj)->IsInEditMode() )
47 : {
48 0 : eContext = EnumContext::Context_DrawText;
49 : }
50 : else
51 : {
52 0 : const sal_uInt32 nInv = pObj->GetObjInventor();
53 0 : const sal_uInt16 nObjId = pObj->GetObjIdentifier();
54 0 : if (nInv == SdrInventor)
55 0 : eContext = GetContextForObjectId_SC(nObjId);
56 0 : else if (nInv == FmFormInventor)
57 0 : eContext = EnumContext::Context_Form;
58 : }
59 0 : break;
60 : }
61 :
62 : default:
63 : {
64 : // Multi selection.
65 0 : switch (GetInventorTypeFromMark(rMarkList))
66 : {
67 : case SdrInventor:
68 : {
69 0 : const sal_uInt16 nObjId (GetObjectTypeFromMark(rMarkList));
70 0 : if (nObjId == 0)
71 0 : eContext = EnumContext::Context_MultiObject;
72 : else
73 0 : eContext = GetContextForObjectId_SC(nObjId);
74 0 : break;
75 : }
76 :
77 : case FmFormInventor:
78 0 : eContext = EnumContext::Context_Form;
79 0 : break;
80 :
81 : case 0:
82 0 : eContext = EnumContext::Context_MultiObject;
83 0 : break;
84 : }
85 : }
86 : }
87 :
88 0 : return eContext;
89 : }
90 :
91 :
92 :
93 :
94 0 : EnumContext::Context SelectionAnalyzer::GetContextForSelection_SD (
95 : const SdrMarkList& rMarkList,
96 : const ViewType eViewType)
97 : {
98 0 : EnumContext::Context eContext = EnumContext::Context_Unknown;
99 :
100 : // Note that some cases are handled by the caller. They rely on
101 : // sd specific data.
102 0 : switch (rMarkList.GetMarkCount())
103 : {
104 : case 0:
105 0 : switch(eViewType)
106 : {
107 : case VT_Standard:
108 0 : eContext = EnumContext::Context_DrawPage;
109 0 : break;
110 : case VT_Master:
111 0 : eContext = EnumContext::Context_MasterPage;
112 0 : break;
113 : case VT_Handout:
114 0 : eContext = EnumContext::Context_HandoutPage;
115 0 : break;
116 : case VT_Notes:
117 0 : eContext = EnumContext::Context_NotesPage;
118 0 : break;
119 : case VT_Outline:
120 0 : eContext = EnumContext::Context_OutlineText;
121 0 : break;
122 : }
123 0 : break;
124 :
125 : case 1:
126 : {
127 0 : SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
128 0 : if (pObj->ISA(SdrTextObj) && ((SdrTextObj*)pObj)->IsInEditMode())
129 : {
130 0 : if (pObj->GetObjIdentifier() == OBJ_TABLE)
131 : {
132 : // Let a table object take precedence over text
133 : // edit mode. The panels for text editing are
134 : // present for table context as well, anyway.
135 0 : eContext = EnumContext::Context_Table;
136 : }
137 : else
138 0 : eContext = EnumContext::Context_DrawText;
139 : }
140 : else
141 : {
142 0 : const sal_uInt32 nInv = pObj->GetObjInventor();
143 0 : sal_uInt16 nObjId = pObj->GetObjIdentifier();
144 0 : if (nInv == SdrInventor)
145 : {
146 0 : if (nObjId == OBJ_GRUP)
147 : {
148 0 : nObjId = GetObjectTypeFromGroup(pObj);
149 0 : if (nObjId == 0)
150 0 : nObjId = OBJ_GRUP;
151 : }
152 0 : eContext = GetContextForObjectId_SD(nObjId, eViewType);
153 : }
154 0 : else if (nInv == E3dInventor)
155 : {
156 0 : eContext = EnumContext::Context_3DObject;
157 : }
158 0 : else if (nInv == FmFormInventor)
159 : {
160 0 : eContext = EnumContext::Context_Form;
161 : }
162 : }
163 0 : break;
164 : }
165 :
166 : default:
167 : {
168 0 : switch (GetInventorTypeFromMark(rMarkList))
169 : {
170 : case SdrInventor:
171 : {
172 0 : const sal_uInt16 nObjId = GetObjectTypeFromMark(rMarkList);
173 0 : if (nObjId == 0)
174 0 : eContext = EnumContext::Context_MultiObject;
175 : else
176 0 : eContext = GetContextForObjectId_SD(nObjId, eViewType);
177 0 : break;
178 : }
179 :
180 : case E3dInventor:
181 0 : eContext = EnumContext::Context_3DObject;
182 0 : break;
183 :
184 : case FmFormInventor:
185 0 : eContext = EnumContext::Context_Form;
186 0 : break;
187 :
188 : case 0:
189 0 : eContext = EnumContext::Context_MultiObject;
190 0 : break;
191 : }
192 0 : break;
193 : }
194 : }
195 :
196 0 : return eContext;
197 : }
198 :
199 :
200 :
201 :
202 0 : EnumContext::Context SelectionAnalyzer::GetContextForObjectId_SC (const sal_uInt16 nObjectId)
203 : {
204 0 : switch (nObjectId)
205 : {
206 : case OBJ_CAPTION:
207 : case OBJ_TITLETEXT:
208 : case OBJ_OUTLINETEXT:
209 : case OBJ_TEXT:
210 : case OBJ_TEXTEXT:
211 : case OBJ_PATHLINE:
212 : case OBJ_PLIN:
213 : case OBJ_FREELINE:
214 : case OBJ_EDGE:
215 : case OBJ_LINE:
216 : case OBJ_MEASURE:
217 : case OBJ_RECT:
218 : case OBJ_CIRC:
219 : case OBJ_FREEFILL:
220 : case OBJ_PATHFILL:
221 : case OBJ_POLY:
222 : case OBJ_SECT:
223 : case OBJ_CARC:
224 : case OBJ_CCUT:
225 : case OBJ_CUSTOMSHAPE:
226 : case OBJ_GRUP:
227 0 : return EnumContext::Context_Draw;
228 :
229 : case OBJ_GRAF:
230 0 : return EnumContext::Context_Graphic;
231 :
232 : case OBJ_OLE2:
233 0 : return EnumContext::Context_OLE;
234 :
235 : case OBJ_MEDIA:
236 0 : return EnumContext::Context_Media;
237 : break;
238 :
239 : default:
240 0 : return EnumContext::Context_Unknown;
241 : }
242 : }
243 :
244 :
245 :
246 :
247 0 : EnumContext::Context SelectionAnalyzer::GetContextForObjectId_SD (
248 : const sal_uInt16 nObjectId,
249 : const ViewType eViewType)
250 : {
251 0 : switch (nObjectId)
252 : {
253 : case OBJ_CAPTION:
254 : case OBJ_PATHLINE:
255 : case OBJ_PLIN:
256 : case OBJ_FREELINE:
257 : case OBJ_EDGE:
258 : case OBJ_LINE:
259 : case OBJ_MEASURE:
260 : case OBJ_RECT:
261 : case OBJ_CIRC:
262 : case OBJ_FREEFILL:
263 : case OBJ_PATHFILL:
264 : case OBJ_POLY:
265 : case OBJ_SECT:
266 : case OBJ_CARC:
267 : case OBJ_CCUT:
268 : case OBJ_CUSTOMSHAPE:
269 : case OBJ_GRUP:
270 0 : return EnumContext::Context_Draw;
271 :
272 : case OBJ_TITLETEXT:
273 : case OBJ_OUTLINETEXT:
274 : case OBJ_TEXT:
275 : case OBJ_TEXTEXT:
276 0 : return EnumContext::Context_TextObject;
277 :
278 : case OBJ_GRAF:
279 0 : return EnumContext::Context_Graphic;
280 :
281 : case OBJ_OLE2:
282 0 : return EnumContext::Context_OLE;
283 :
284 : case OBJ_MEDIA:
285 0 : return EnumContext::Context_Media;
286 :
287 : case OBJ_TABLE:
288 0 : return EnumContext::Context_Table;
289 :
290 : case OBJ_PAGE:
291 0 : switch (eViewType)
292 : {
293 : case VT_Handout:
294 0 : return EnumContext::Context_HandoutPage;
295 : case VT_Notes:
296 0 : return EnumContext::Context_NotesPage;
297 : case VT_Outline:
298 0 : return EnumContext::Context_OutlineText;
299 : default:
300 0 : return EnumContext::Context_Unknown;
301 : }
302 :
303 : default:
304 0 : return EnumContext::Context_Unknown;
305 : }
306 : }
307 :
308 :
309 :
310 :
311 0 : sal_uInt32 SelectionAnalyzer::GetInventorTypeFromMark (const SdrMarkList& rMarkList)
312 : {
313 0 : const sal_uLong nMarkCount (rMarkList.GetMarkCount());
314 :
315 0 : if (nMarkCount < 1)
316 0 : return 0;
317 :
318 0 : SdrMark* pMark = rMarkList.GetMark(0);
319 0 : SdrObject* pObj = pMark->GetMarkedSdrObj();
320 0 : const sal_uInt32 nFirstInv = pObj->GetObjInventor();
321 :
322 0 : for (sal_uLong nIndex=1; nIndex<nMarkCount; ++nIndex)
323 : {
324 0 : pMark = rMarkList.GetMark(nIndex);
325 0 : pObj = pMark->GetMarkedSdrObj();
326 0 : const sal_uInt32 nInv (pObj->GetObjInventor());
327 :
328 0 : if (nInv != nFirstInv)
329 0 : return 0;
330 : }
331 :
332 0 : return nFirstInv;
333 : }
334 :
335 :
336 :
337 :
338 0 : sal_uInt16 SelectionAnalyzer::GetObjectTypeFromGroup (const SdrObject* pObj)
339 : {
340 0 : SdrObjList* pObjList = pObj->GetSubList();
341 0 : if (pObjList)
342 : {
343 0 : const sal_uLong nSubObjCount (pObjList->GetObjCount());
344 :
345 0 : if (nSubObjCount>0)
346 : {
347 0 : SdrObject* pSubObj = pObjList->GetObj(0);
348 0 : sal_uInt16 nResultType = pSubObj->GetObjIdentifier();
349 :
350 0 : if (nResultType == OBJ_GRUP)
351 0 : nResultType = GetObjectTypeFromGroup(pSubObj);
352 :
353 0 : if (IsShapeType(nResultType))
354 0 : nResultType = OBJ_CUSTOMSHAPE;
355 :
356 0 : if (IsTextObjType(nResultType))
357 0 : nResultType = OBJ_TEXT;
358 :
359 0 : for (sal_uInt16 nIndex=1; nIndex<nSubObjCount; ++nIndex)
360 : {
361 0 : pSubObj = pObjList->GetObj(nIndex);
362 0 : sal_uInt16 nType (pSubObj->GetObjIdentifier());
363 :
364 0 : if(nType == OBJ_GRUP)
365 0 : nType = GetObjectTypeFromGroup(pSubObj);
366 :
367 0 : if (IsShapeType(nType))
368 0 : nType = OBJ_CUSTOMSHAPE;
369 :
370 0 : if ((nType == OBJ_CUSTOMSHAPE) && (nResultType == OBJ_TEXT))
371 0 : nType = OBJ_TEXT;
372 :
373 0 : if (IsTextObjType(nType))
374 0 : nType = OBJ_TEXT;
375 :
376 0 : if ((nType == OBJ_TEXT) && (nResultType == OBJ_CUSTOMSHAPE))
377 0 : nResultType = OBJ_TEXT;
378 :
379 0 : if (nType != nResultType)
380 0 : return 0;
381 : }
382 :
383 0 : return nResultType;
384 : }
385 : }
386 :
387 0 : return 0;
388 : }
389 :
390 :
391 :
392 :
393 0 : sal_uInt16 SelectionAnalyzer::GetObjectTypeFromMark (const SdrMarkList& rMarkList)
394 : {
395 0 : const sal_uLong nMarkCount (rMarkList.GetMarkCount());
396 :
397 0 : if (nMarkCount < 1)
398 0 : return 0;
399 :
400 0 : SdrMark* pMark = rMarkList.GetMark(0);
401 0 : SdrObject* pObj = pMark->GetMarkedSdrObj();
402 0 : sal_uInt16 nResultType = pObj->GetObjIdentifier();
403 :
404 0 : if(nResultType == OBJ_GRUP)
405 0 : nResultType = GetObjectTypeFromGroup(pObj);
406 :
407 0 : if (IsShapeType(nResultType))
408 0 : nResultType = OBJ_CUSTOMSHAPE;
409 :
410 0 : if (IsTextObjType(nResultType))
411 0 : nResultType = OBJ_TEXT;
412 :
413 0 : for (sal_uLong nIndex=1; nIndex<nMarkCount; ++nIndex)
414 : {
415 0 : pMark = rMarkList.GetMark(nIndex);
416 0 : pObj = pMark->GetMarkedSdrObj();
417 0 : sal_uInt16 nType = pObj->GetObjIdentifier();
418 :
419 0 : if(nType == OBJ_GRUP)
420 0 : nType = GetObjectTypeFromGroup(pObj);
421 :
422 0 : if (IsShapeType(nType))
423 0 : nType = OBJ_CUSTOMSHAPE;
424 :
425 0 : if ((nType == OBJ_CUSTOMSHAPE) && (nResultType == OBJ_TEXT))
426 0 : nType = OBJ_TEXT;
427 :
428 0 : if (IsTextObjType(nType))
429 0 : nType = OBJ_TEXT;
430 :
431 0 : if ((nType == OBJ_TEXT) && (nResultType == OBJ_CUSTOMSHAPE))
432 0 : nResultType = OBJ_TEXT;
433 :
434 0 : if (nType != nResultType)
435 0 : return 0;
436 : }
437 :
438 0 : return nResultType;
439 : }
440 :
441 :
442 :
443 :
444 0 : bool SelectionAnalyzer::IsShapeType (const sal_uInt16 nType)
445 : {
446 0 : switch (nType)
447 : {
448 : case OBJ_LINE:
449 : case OBJ_CARC:
450 : case OBJ_PLIN:
451 : case OBJ_PATHLINE:
452 : case OBJ_RECT:
453 : case OBJ_CIRC:
454 : case OBJ_SECT:
455 : case OBJ_CCUT:
456 : case OBJ_PATHFILL:
457 : case OBJ_CUSTOMSHAPE:
458 : case OBJ_CAPTION:
459 : case OBJ_MEASURE:
460 : case OBJ_EDGE:
461 : case OBJ_POLY:
462 : case OBJ_FREELINE:
463 : case OBJ_FREEFILL:
464 :
465 : // #122145# adding OBJ_OLE2 since these also allow line/fill style and may
466 : // be multiselected/grouped with normal draw objects, e.g. math OLE objects
467 : case OBJ_OLE2:
468 0 : return true;
469 :
470 : default:
471 0 : return false;
472 : }
473 : }
474 :
475 :
476 :
477 :
478 0 : bool SelectionAnalyzer::IsTextObjType (const sal_uInt16 nType)
479 : {
480 0 : switch(nType)
481 : {
482 : case OBJ_TEXT:
483 : case OBJ_TEXTEXT:
484 : case OBJ_TITLETEXT:
485 : case OBJ_OUTLINETEXT:
486 0 : return true;
487 :
488 : default:
489 0 : return false;
490 : }
491 : }
492 :
493 :
494 :
495 : } } // end of namespace ::svx::sidebar
|