diff options
-rw-r--r-- | sd/source/ui/func/fusel.cxx | 13 | ||||
-rw-r--r-- | svx/inc/svx/svdmrkv.hxx | 2 | ||||
-rw-r--r-- | svx/source/svdraw/svdmrkv.cxx | 19 |
3 files changed, 32 insertions, 2 deletions
diff --git a/sd/source/ui/func/fusel.cxx b/sd/source/ui/func/fusel.cxx index a421cb86afae..2a009430d4fc 100644 --- a/sd/source/ui/func/fusel.cxx +++ b/sd/source/ui/func/fusel.cxx @@ -642,6 +642,8 @@ sal_Bool FuSelection::MouseButtonUp(const MouseEvent& rMEvt) // (and deselect others) as a preparation for showing the context // menu. const bool bSelectionOnly = rMEvt.IsRight(); + SdrObject* pObj; + SdrPageView* pPV; if (bHideAndAnimate) { @@ -693,6 +695,17 @@ sal_Bool FuSelection::MouseButtonUp(const MouseEvent& rMEvt) Abs(aPnt.X() - aMDPos.X()) < nDrgLog && Abs(aPnt.Y() - aMDPos.Y()) < nDrgLog) { + /************************************************************* + * If a user wants to click on an object in front of a masked + * one, he releases the mouse button immediately + **************************************************************/ + if (mpView->PickObj(aMDPos, mpView->getHitTolLog(), pObj, pPV, SDRSEARCH_ALSOONMASTER | SDRSEARCH_BEFOREMARK)) + { + //not Needed in the ordinary pick routine for some reason... + mpView->UnmarkAllObj(); + mpView->MarkObj(pObj,pPV,false,false); + return (bReturn); + } /************************************************************** * Toggle between selection and rotation **************************************************************/ diff --git a/svx/inc/svx/svdmrkv.hxx b/svx/inc/svx/svdmrkv.hxx index 37c31345e4eb..944d3bdab432 100644 --- a/svx/inc/svx/svdmrkv.hxx +++ b/svx/inc/svx/svdmrkv.hxx @@ -53,6 +53,7 @@ #define SDRSEARCH_MARKED 0x0400 /* Nur markierte Objekte/Punkte/... */ #define SDRSEARCH_PASS2BOUND 0x0800 /* Wenn nix gefunden, dann neuer 2. Versuch mit BoundRectHit */ #define SDRSEARCH_PASS3NEAREST 0x1000 /* Wenn nix gefunden, dann neuer 3. Versuch mit NearestBoundRectHit */ +#define SDRSEARCH_BEFOREMARK 0x2000 /* if one marked one found, ignore all behind that */ #define SDRSEARCH_PICKMARKABLE (SDRSEARCH_TESTMARKABLE) #define SDRSEARCH_PICKTEXTEDIT (SDRSEARCH_DEEP|SDRSEARCH_TESTMARKABLE|SDRSEARCH_TESTTEXTEDIT) @@ -181,6 +182,7 @@ protected: //HMHvoid ImpShowMarkHdl(bool bNoRefHdl); virtual SdrObject* CheckSingleSdrObjectHit(const Point& rPnt, sal_uInt16 nTol, SdrObject* pObj, SdrPageView* pPV, sal_uIntPtr nOptions, const SetOfByte* pMVisLay) const; virtual SdrObject* CheckSingleSdrObjectHit(const Point& rPnt, sal_uInt16 nTol, SdrObjList* pOL, SdrPageView* pPV, sal_uIntPtr nOptions, const SetOfByte* pMVisLay, SdrObject*& rpRootObj) const; + virtual SdrObject* CheckSingleSdrObjectHit(const Point& rPnt, sal_uInt16 nTol, SdrObjList* pOL, SdrPageView* pPV, sal_uIntPtr nOptions, const SetOfByte* pMVisLay, SdrObject*& rpRootObj,const SdrMarkList * pMarkList) const; sal_Bool ImpIsFrameHandles() const; void ImpTakeDescriptionStr(sal_uInt16 nStrCacheID, String& rStr, sal_uInt16 nVal=0, sal_uInt16 nOpt=0) const; diff --git a/svx/source/svdraw/svdmrkv.cxx b/svx/source/svdraw/svdmrkv.cxx index 2f16e1d1ec97..2bb822113efc 100644 --- a/svx/source/svdraw/svdmrkv.cxx +++ b/svx/source/svdraw/svdmrkv.cxx @@ -1573,7 +1573,12 @@ SdrObject* SdrMarkView::CheckSingleSdrObjectHit(const Point& rPnt, sal_uInt16 nT SdrObject* SdrMarkView::CheckSingleSdrObjectHit(const Point& rPnt, sal_uInt16 nTol, SdrObjList* pOL, SdrPageView* pPV, sal_uIntPtr nOptions, const SetOfByte* pMVisLay, SdrObject*& rpRootObj) const { + return (*this).CheckSingleSdrObjectHit(rPnt,nTol,pOL,pPV,nOptions,pMVisLay,rpRootObj,NULL); +} +SdrObject* SdrMarkView::CheckSingleSdrObjectHit(const Point& rPnt, sal_uInt16 nTol, SdrObjList* pOL, SdrPageView* pPV, sal_uIntPtr nOptions, const SetOfByte* pMVisLay, SdrObject*& rpRootObj,const SdrMarkList * pMarkList) const +{ sal_Bool bBack=(nOptions & SDRSEARCH_BACKWARD)!=0; + sal_Bool bBefMrk=(nOptions & SDRSEARCH_BEFOREMARK)!=0; SdrObject* pRet=NULL; rpRootObj=NULL; if (pOL!=NULL) @@ -1595,7 +1600,16 @@ SdrObject* SdrMarkView::CheckSingleSdrObjectHit(const Point& rPnt, sal_uInt16 nT { pObj = pOL->GetObj(nObjNum); } - + if (bBefMrk) + { + if ((pMarkList)!=NULL) + { + if ((*pMarkList).FindObject(pObj)!=CONTAINER_ENTRY_NOTFOUND) + { + return NULL; + } + } + } pRet=CheckSingleSdrObjectHit(rPnt,nTol,pObj,pPV,nOptions,pMVisLay); if (pRet!=NULL) rpRootObj=pObj; if (bBack) nObjNum++; @@ -1689,7 +1703,7 @@ sal_Bool SdrMarkView::PickObj(const Point& rPnt, short nTol, SdrObject*& rpObj, if (pnPassNum!=NULL) *pnPassNum|=SDRSEARCHPASS_MASTERPAGE; nTmpOptions=nTmpOptions | SDRSEARCH_IMPISMASTER; } - pHitObj=CheckSingleSdrObjectHit(aPt,nTol,pObjList,pPV,nTmpOptions,pMVisLay,pObj); + pHitObj=CheckSingleSdrObjectHit(aPt,nTol,pObjList,pPV,nTmpOptions,pMVisLay,pObj,&(GetMarkedObjectList())); if (bBack) nPgNum++; } } @@ -1796,6 +1810,7 @@ sal_Bool SdrMarkView::PickMarkedObj(const Point& rPnt, SdrObject*& rpObj, SdrPag return bFnd; } + void SdrMarkView::UnmarkAllObj(SdrPageView* pPV) { if (GetMarkedObjectCount()!=0) { |