Kaydet (Commit) a87a3160 authored tarafından Jochen Nitschke's avatar Jochen Nitschke

merge SdrPageView::IsObjSelectable and SdrPageView::IsObjMarkable

These member functions have the same purpose and share same
functionality in great parts.
The checks are rewritten for better readability and merged
into IsObjMarkable.
This adds IsInserted and a same page check to the function.

Tested selection of nested grouped objects.
Tested selection of objects in front of objects on master pages.

The fix for #i43302# doesn't seem nessasary (saw no way to create
empty groups) but leaving it on for now.

Change-Id: I35d84c66dfd832d626ba2700f22d4c437593cac7
Reviewed-on: https://gerrit.libreoffice.org/27786Reviewed-by: 's avatarJochen Nitschke <j.nitschke+logerrit@ok.de>
Tested-by: 's avatarJochen Nitschke <j.nitschke+logerrit@ok.de>
üst 2f6f851a
......@@ -232,14 +232,9 @@ public:
/// At least one member must be visible for the Group object and
/// it must not be locked
/// @returns
// true, if the object's layer is visible and not locked
/// true, if the object's layer is visible and not locked
bool IsObjMarkable(SdrObject* pObj) const;
/// Hmm, selectable is surely the same as markable, now that I
/// see this as I look for a place to put it.
/// TODO: merge these
bool IsObjSelectable(SdrObject *pObj) const;
/// Entering (editing) an object group
/// After that, we have direct access to all member objects of the group.
/// All other objects are not editable in the meantime (until the next
......
......@@ -673,7 +673,7 @@ bool FuSelection::MouseButtonUp(const MouseEvent& rMEvt)
SdrObject* pObj;
if (mpView->PickObj(aMDPos, mpView->getHitTolLog(), pObj, pPV, SdrSearchOptions::ALSOONMASTER | SdrSearchOptions::BEFOREMARK))
{
if (pPV->IsObjSelectable(pObj))
if (pPV->IsObjMarkable(pObj))
{
mpView->UnmarkAllObj();
mpView->MarkObj(pObj,pPV);
......
......@@ -660,7 +660,7 @@ bool FuText::MouseButtonUp(const MouseEvent& rMEvt)
SdrPageView* pPV;
if (mpView->PickObj(aMDPos, mpView->getHitTolLog(), pObj, pPV, SdrSearchOptions::ALSOONMASTER | SdrSearchOptions::BEFOREMARK))
{
if (pPV->IsObjSelectable(pObj))
if (pPV->IsObjMarkable(pObj))
{
mpView->UnmarkAllObj();
mpView->MarkObj(pObj,pPV);
......
......@@ -1270,33 +1270,6 @@ SfxViewShell* SdrMarkView::GetSfxViewShell() const
return SfxViewShell::Current();
}
bool SdrPageView::IsObjSelectable(SdrObject *pObj) const
{
SdrLayerID nLay=pObj->GetLayer();
bool bRaus=!pObj->IsInserted(); // Obj deleted?
if (!pObj->Is3DObj()) {
bRaus=bRaus || pObj->GetPage()!=GetPage(); // Obj suddenly in different Page or Group
}
bRaus=bRaus || GetLockedLayers().IsSet(nLay) || // Layer locked?
!GetVisibleLayers().IsSet(nLay); // Layer invisible?
if( !bRaus )
bRaus = !pObj->IsVisible(); // invisible objects can not be selected
if (!bRaus) {
// Grouped objects can now be selected.
// After EnterGroup the higher-level objects,
// have to be deselected, though.
const SdrObjList* pOOL=pObj->GetObjList();
const SdrObjList* pVOL=GetObjList();
while (pOOL!=nullptr && pOOL!=pVOL) {
pOOL=pOOL->GetUpList();
}
bRaus=pOOL!=pVOL;
}
return !bRaus;
}
void SdrMarkView::CheckMarked()
{
for (size_t nm=GetMarkedObjectCount(); nm>0;) {
......@@ -1304,7 +1277,7 @@ void SdrMarkView::CheckMarked()
SdrMark* pM = GetSdrMarkByIndex(nm);
SdrObject* pObj = pM->GetMarkedSdrObj();
SdrPageView* pPV = pM->GetPageView();
bool bRaus = !pObj || !pPV->IsObjSelectable(pObj);
bool bRaus = !pObj || !pPV->IsObjMarkable(pObj);
if (bRaus)
{
GetMarkedObjectListWriteAccess().DeleteMark(nm);
......
......@@ -647,59 +647,47 @@ bool SdrPageView::IsLayer(const OUString& rName, const SetOfByte& rBS) const
bool SdrPageView::IsObjMarkable(SdrObject* pObj) const
{
if(pObj)
if (!pObj)
return false;
if (pObj->IsMarkProtect())
return false; // excluded from selection?
if (!pObj->IsVisible())
return false; // only visible are selectable
if (!pObj->IsInserted())
return false; // Obj deleted?
if (dynamic_cast<const SdrObjGroup*>(pObj) != nullptr)
{
// excluded from selection?
if(pObj->IsMarkProtect())
{
return false;
}
// only visible are selectable
if( !pObj->IsVisible() )
{
return false;
}
// If object is a Group object, visibility may depend on
// multiple layers. If one object is markable, Group is markable.
SdrObjList* pObjList = static_cast<SdrObjGroup*>(pObj)->GetSubList();
if(dynamic_cast<const SdrObjGroup*>( pObj) != nullptr)
if (pObjList && pObjList->GetObjCount())
{
// If object is a Group object, visibility may depend on
// multiple layers. If one object is markable, Group is markable.
SdrObjList* pObjList = static_cast<SdrObjGroup*>(pObj)->GetSubList();
if(pObjList && pObjList->GetObjCount())
for (size_t a = 0; a < pObjList->GetObjCount(); ++a)
{
bool bGroupIsMarkable(false);
for(size_t a = 0; !bGroupIsMarkable && a < pObjList->GetObjCount(); ++a)
{
SdrObject* pCandidate = pObjList->GetObj(a);
// call recursively
if(IsObjMarkable(pCandidate))
{
bGroupIsMarkable = true;
}
}
return bGroupIsMarkable;
}
else
{
// #i43302#
// Allow empty groups to be selected to be able to delete them
return true;
SdrObject* pCandidate = pObjList->GetObj(a);
// call recursively
if (IsObjMarkable(pCandidate))
return true;
}
return false;
}
else
{
// the layer has to be visible and must not be locked
SdrLayerID nL = pObj->GetLayer();
return (aLayerVisi.IsSet(sal_uInt8(nL)) && !aLayerLock.IsSet(sal_uInt8(nL)));
// #i43302#
// Allow empty groups to be selected to be able to delete them
return true;
}
}
return false;
if (!pObj->Is3DObj() && pObj->GetPage()!=GetPage())
return false; // Obj suddenly in different Page
// the layer has to be visible and must not be locked
SdrLayerID nL = pObj->GetLayer();
if (!aLayerVisi.IsSet(sal_uInt8(nL)))
return false;
if (aLayerLock.IsSet(sal_uInt8(nL)))
return false;
return true;
}
void SdrPageView::SetPageOrigin(const Point& rOrg)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment