bump product version to 7.2.5.1
[LibreOffice.git] / svx / source / sidebar / SelectionAnalyzer.cxx
blob7d0cb4d1696712bf677a324d45112b5b4a291919
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3 * This file is part of the LibreOffice project.
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/.
9 * This file incorporates work covered by the following license notice:
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 .
20 #include <svx/sidebar/SelectionAnalyzer.hxx>
21 #include <svx/svdmark.hxx>
22 #include <svx/svdobj.hxx>
23 #include <svx/svdotext.hxx>
24 #include <svx/svdpage.hxx>
25 #include <svx/fontworkbar.hxx>
27 using vcl::EnumContext;
29 namespace svx::sidebar
31 EnumContext::Context SelectionAnalyzer::GetContextForSelection_SC(const SdrMarkList& rMarkList)
33 EnumContext::Context eContext = EnumContext::Context::Unknown;
35 switch (rMarkList.GetMarkCount())
37 case 0:
38 // Empty selection. Return Context::Unknown to let the caller
39 // substitute it with the default context.
40 break;
42 case 1:
44 SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
45 auto pTextObj = dynamic_cast<SdrTextObj*>(pObj);
46 if (pTextObj && pTextObj->IsInEditMode())
48 eContext = EnumContext::Context::DrawText;
50 else if (svx::checkForFontWork(pObj))
52 eContext = EnumContext::Context::DrawFontwork;
54 else
56 const SdrInventor nInv = pObj->GetObjInventor();
57 const sal_uInt16 nObjId = pObj->GetObjIdentifier();
58 if (nInv == SdrInventor::Default)
59 eContext = GetContextForObjectId_SC(nObjId);
60 else if (nInv == SdrInventor::FmForm)
61 eContext = EnumContext::Context::Form;
63 break;
66 default:
68 // Multi selection.
69 switch (GetInventorTypeFromMark(rMarkList))
71 case SdrInventor::Default:
73 const sal_uInt16 nObjId(GetObjectTypeFromMark(rMarkList));
74 if (nObjId == 0)
75 eContext = EnumContext::Context::MultiObject;
76 else
77 eContext = GetContextForObjectId_SC(nObjId);
78 break;
81 case SdrInventor::FmForm:
82 eContext = EnumContext::Context::Form;
83 break;
85 case SdrInventor::Unknown:
86 eContext = EnumContext::Context::MultiObject;
87 break;
89 default:
90 break;
95 return eContext;
98 EnumContext::Context SelectionAnalyzer::GetContextForSelection_SD(const SdrMarkList& rMarkList,
99 const ViewType eViewType)
101 EnumContext::Context eContext = EnumContext::Context::Unknown;
103 // Note that some cases are handled by the caller. They rely on
104 // sd specific data.
105 switch (rMarkList.GetMarkCount())
107 case 0:
108 switch (eViewType)
110 case ViewType::Standard:
111 eContext = EnumContext::Context::DrawPage;
112 break;
113 case ViewType::Master:
114 eContext = EnumContext::Context::MasterPage;
115 break;
116 case ViewType::Handout:
117 eContext = EnumContext::Context::HandoutPage;
118 break;
119 case ViewType::Notes:
120 eContext = EnumContext::Context::NotesPage;
121 break;
123 break;
125 case 1:
127 SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
128 auto pTextObj = dynamic_cast<SdrTextObj*>(pObj);
129 if (pTextObj && pTextObj->IsInEditMode())
131 if (pObj->GetObjIdentifier() == OBJ_TABLE)
133 // Let a table object take precedence over text
134 // edit mode. The panels for text editing are
135 // present for table context as well, anyway.
136 eContext = EnumContext::Context::Table;
138 else
139 eContext = EnumContext::Context::DrawText;
141 else if (svx::checkForFontWork(pObj))
143 eContext = EnumContext::Context::DrawFontwork;
145 else
147 const SdrInventor nInv = pObj->GetObjInventor();
148 sal_uInt16 nObjId = pObj->GetObjIdentifier();
149 if (nInv == SdrInventor::Default)
151 if (nObjId == OBJ_GRUP)
153 nObjId = GetObjectTypeFromGroup(pObj);
154 if (nObjId == 0)
155 nObjId = OBJ_GRUP;
157 eContext = GetContextForObjectId_SD(nObjId, eViewType);
159 else if (nInv == SdrInventor::E3d)
161 eContext = EnumContext::Context::ThreeDObject;
163 else if (nInv == SdrInventor::FmForm)
165 eContext = EnumContext::Context::Form;
168 break;
171 default:
173 switch (GetInventorTypeFromMark(rMarkList))
175 case SdrInventor::Default:
177 const sal_uInt16 nObjId = GetObjectTypeFromMark(rMarkList);
178 if (nObjId == 0)
179 eContext = EnumContext::Context::MultiObject;
180 else
181 eContext = GetContextForObjectId_SD(nObjId, eViewType);
182 break;
185 case SdrInventor::E3d:
186 eContext = EnumContext::Context::ThreeDObject;
187 break;
189 case SdrInventor::FmForm:
190 eContext = EnumContext::Context::Form;
191 break;
193 case SdrInventor::Unknown:
194 eContext = EnumContext::Context::MultiObject;
195 break;
197 default:
198 break;
200 break;
204 return eContext;
207 EnumContext::Context SelectionAnalyzer::GetContextForObjectId_SC(const sal_uInt16 nObjectId)
209 switch (nObjectId)
211 case OBJ_CAPTION:
212 case OBJ_TITLETEXT:
213 case OBJ_OUTLINETEXT:
214 case OBJ_TEXT:
215 case OBJ_MEASURE:
216 case OBJ_RECT:
217 case OBJ_CIRC:
218 case OBJ_FREEFILL:
219 case OBJ_PATHFILL:
220 case OBJ_POLY:
221 case OBJ_SECT:
222 case OBJ_CARC:
223 case OBJ_CCUT:
224 case OBJ_CUSTOMSHAPE:
225 case OBJ_GRUP:
226 return EnumContext::Context::Draw;
228 case OBJ_PLIN:
229 case OBJ_PATHLINE:
230 case OBJ_FREELINE:
231 case OBJ_LINE:
232 case OBJ_EDGE:
233 return EnumContext::Context::DrawLine;
235 case OBJ_GRAF:
236 return EnumContext::Context::Graphic;
238 case OBJ_OLE2:
239 return EnumContext::Context::OLE;
241 case OBJ_MEDIA:
242 return EnumContext::Context::Media;
244 default:
245 return EnumContext::Context::Unknown;
249 EnumContext::Context SelectionAnalyzer::GetContextForObjectId_SD(const sal_uInt16 nObjectId,
250 const ViewType eViewType)
252 switch (nObjectId)
254 case OBJ_CAPTION:
255 case OBJ_MEASURE:
256 case OBJ_RECT:
257 case OBJ_CIRC:
258 case OBJ_FREEFILL:
259 case OBJ_PATHFILL:
260 case OBJ_POLY:
261 case OBJ_SECT:
262 case OBJ_CARC:
263 case OBJ_CCUT:
264 case OBJ_CUSTOMSHAPE:
265 case OBJ_GRUP:
266 return EnumContext::Context::Draw;
268 case OBJ_EDGE:
269 case OBJ_PATHLINE:
270 case OBJ_FREELINE:
271 case OBJ_PLIN:
272 case OBJ_LINE:
273 return EnumContext::Context::DrawLine;
275 case OBJ_TITLETEXT:
276 case OBJ_OUTLINETEXT:
277 case OBJ_TEXT:
278 return EnumContext::Context::TextObject;
280 case OBJ_GRAF:
281 return EnumContext::Context::Graphic;
283 case OBJ_OLE2:
284 return EnumContext::Context::OLE;
286 case OBJ_MEDIA:
287 return EnumContext::Context::Media;
289 case OBJ_TABLE:
290 return EnumContext::Context::Table;
292 case OBJ_PAGE:
293 switch (eViewType)
295 case ViewType::Handout:
296 return EnumContext::Context::HandoutPage;
297 case ViewType::Notes:
298 return EnumContext::Context::NotesPage;
299 default:
300 return EnumContext::Context::Unknown;
303 default:
304 return EnumContext::Context::Unknown;
308 SdrInventor SelectionAnalyzer::GetInventorTypeFromMark(const SdrMarkList& rMarkList)
310 const size_t nMarkCount(rMarkList.GetMarkCount());
312 if (nMarkCount < 1)
313 return SdrInventor::Unknown;
315 SdrMark* pMark = rMarkList.GetMark(0);
316 SdrObject* pObj = pMark->GetMarkedSdrObj();
317 const SdrInventor nFirstInv = pObj->GetObjInventor();
319 for (size_t nIndex = 1; nIndex < nMarkCount; ++nIndex)
321 pMark = rMarkList.GetMark(nIndex);
322 pObj = pMark->GetMarkedSdrObj();
323 const SdrInventor nInv(pObj->GetObjInventor());
325 if (nInv != nFirstInv)
326 return SdrInventor::Unknown;
329 return nFirstInv;
332 sal_uInt16 SelectionAnalyzer::GetObjectTypeFromGroup(const SdrObject* pObj)
334 SdrObjList* pObjList = pObj->GetSubList();
335 if (pObjList)
337 const size_t nSubObjCount(pObjList->GetObjCount());
339 if (nSubObjCount > 0)
341 SdrObject* pSubObj = pObjList->GetObj(0);
342 sal_uInt16 nResultType = pSubObj->GetObjIdentifier();
344 if (nResultType == OBJ_GRUP)
345 nResultType = GetObjectTypeFromGroup(pSubObj);
347 if (IsShapeType(nResultType))
348 nResultType = OBJ_CUSTOMSHAPE;
350 if (IsTextObjType(nResultType))
351 nResultType = OBJ_TEXT;
353 for (size_t nIndex = 1; nIndex < nSubObjCount; ++nIndex)
355 pSubObj = pObjList->GetObj(nIndex);
356 sal_uInt16 nType(pSubObj->GetObjIdentifier());
358 if (nType == OBJ_GRUP)
359 nType = GetObjectTypeFromGroup(pSubObj);
361 if (IsShapeType(nType))
362 nType = OBJ_CUSTOMSHAPE;
364 if ((nType == OBJ_CUSTOMSHAPE) && (nResultType == OBJ_TEXT))
365 nType = OBJ_TEXT;
367 if (IsTextObjType(nType))
368 nType = OBJ_TEXT;
370 if ((nType == OBJ_TEXT) && (nResultType == OBJ_CUSTOMSHAPE))
371 nResultType = OBJ_TEXT;
373 if (nType != nResultType)
374 return 0;
377 return nResultType;
381 return 0;
384 sal_uInt16 SelectionAnalyzer::GetObjectTypeFromMark(const SdrMarkList& rMarkList)
386 const size_t nMarkCount(rMarkList.GetMarkCount());
388 if (nMarkCount < 1)
389 return 0;
391 SdrMark* pMark = rMarkList.GetMark(0);
392 SdrObject* pObj = pMark->GetMarkedSdrObj();
393 sal_uInt16 nResultType = pObj->GetObjIdentifier();
395 if (nResultType == OBJ_GRUP)
396 nResultType = GetObjectTypeFromGroup(pObj);
398 if (IsShapeType(nResultType))
399 nResultType = OBJ_CUSTOMSHAPE;
401 if (IsTextObjType(nResultType))
402 nResultType = OBJ_TEXT;
404 for (size_t nIndex = 1; nIndex < nMarkCount; ++nIndex)
406 pMark = rMarkList.GetMark(nIndex);
407 pObj = pMark->GetMarkedSdrObj();
408 sal_uInt16 nType = pObj->GetObjIdentifier();
410 if (nType == OBJ_GRUP)
411 nType = GetObjectTypeFromGroup(pObj);
413 if (IsShapeType(nType))
414 nType = OBJ_CUSTOMSHAPE;
416 if ((nType == OBJ_CUSTOMSHAPE) && (nResultType == OBJ_TEXT))
417 nType = OBJ_TEXT;
419 if (IsTextObjType(nType))
420 nType = OBJ_TEXT;
422 if ((nType == OBJ_TEXT) && (nResultType == OBJ_CUSTOMSHAPE))
423 nResultType = OBJ_TEXT;
425 if (nType != nResultType)
426 return 0;
429 return nResultType;
432 bool SelectionAnalyzer::IsShapeType(const sal_uInt16 nType)
434 switch (nType)
436 case OBJ_LINE:
437 case OBJ_CARC:
438 case OBJ_PLIN:
439 case OBJ_PATHLINE:
440 case OBJ_RECT:
441 case OBJ_CIRC:
442 case OBJ_SECT:
443 case OBJ_CCUT:
444 case OBJ_PATHFILL:
445 case OBJ_CUSTOMSHAPE:
446 case OBJ_CAPTION:
447 case OBJ_MEASURE:
448 case OBJ_EDGE:
449 case OBJ_POLY:
450 case OBJ_FREELINE:
451 case OBJ_FREEFILL:
453 // #122145# adding OBJ_OLE2 since these also allow line/fill style and may
454 // be multiselected/grouped with normal draw objects, e.g. math OLE objects
455 case OBJ_OLE2:
456 return true;
458 default:
459 return false;
463 bool SelectionAnalyzer::IsTextObjType(const sal_uInt16 nType)
465 switch (nType)
467 case OBJ_TEXT:
468 case OBJ_TITLETEXT:
469 case OBJ_OUTLINETEXT:
470 return true;
472 default:
473 return false;
477 } // end of namespace svx::sidebar
479 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */