[Libreoffice-commits] .: sd/source svx/inc svx/source

Libreoffice Gerrit user logerrit at kemper.freedesktop.org
Tue Nov 6 05:50:42 PST 2012


 sd/source/ui/func/fusel.cxx   |   13 +++++++++++++
 svx/inc/svx/svdmrkv.hxx       |    2 ++
 svx/source/svdraw/svdmrkv.cxx |   19 +++++++++++++++++--
 3 files changed, 32 insertions(+), 2 deletions(-)

New commits:
commit 85ea03ae536831649b104694d08dced4d4c8663f
Author: Lennard <Wasserthal at nefkom.net>
Date:   Sat Oct 27 18:59:14 2012 +0200

    fdo#55430 allow clicking objects in front of selected ones
    
    Prevents that selected objects shadow selecting others in front of them.
    
    Change-Id: Iee4abf4eddf79ef7ed331221b0a0b23d3370ae2b
    Signed-off-by: Lennard <Wasserthal at nefkom.net>
    Reviewed-on: https://gerrit.libreoffice.org/927
    Reviewed-by: Thorsten Behrens <tbehrens at suse.com>
    Tested-by: Thorsten Behrens <tbehrens at suse.com>

diff --git a/sd/source/ui/func/fusel.cxx b/sd/source/ui/func/fusel.cxx
index a421cb8..2a00943 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 37c3134..944d3bd 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 2f16e1d..2bb8221 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) {


More information about the Libreoffice-commits mailing list