LCOV - code coverage report
Current view: top level - libreoffice/svx/source/svdraw - svdmrkv1.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 31 347 8.9 %
Date: 2012-12-27 Functions: 4 23 17.4 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       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/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      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 .
      18             :  */
      19             : 
      20             : 
      21             : #include <svx/svdmrkv.hxx>
      22             : #include <svx/svdetc.hxx>
      23             : #include <svx/svdoedge.hxx>
      24             : #include "svx/svdglob.hxx"
      25             : #include <svx/svdpagv.hxx>
      26             : #include <svx/svdpage.hxx>
      27             : #include "svddrgm1.hxx"
      28             : 
      29             : ////////////////////////////////////////////////////////////////////////////////////////////////////
      30             : // Point Selection
      31             : ////////////////////////////////////////////////////////////////////////////////////////////////////
      32             : 
      33           0 : sal_Bool SdrMarkView::HasMarkablePoints() const
      34             : {
      35           0 :     ForceUndirtyMrkPnt();
      36           0 :     bool bRet=false;
      37           0 :     if (!ImpIsFrameHandles()) {
      38           0 :         sal_uIntPtr nMarkAnz=GetMarkedObjectCount();
      39           0 :         if (nMarkAnz<=nFrameHandlesLimit) {
      40           0 :             for (sal_uIntPtr nMarkNum=0; nMarkNum<nMarkAnz && !bRet; nMarkNum++) {
      41           0 :                 const SdrMark* pM=GetSdrMarkByIndex(nMarkNum);
      42           0 :                 const SdrObject* pObj=pM->GetMarkedSdrObj();
      43           0 :                 bRet=pObj->IsPolyObj();
      44             :             }
      45             :         }
      46             :     }
      47           0 :     return bRet;
      48             : }
      49             : 
      50           0 : sal_uIntPtr SdrMarkView::GetMarkablePointCount() const
      51             : {
      52           0 :     ForceUndirtyMrkPnt();
      53           0 :     sal_uIntPtr nAnz=0;
      54           0 :     if (!ImpIsFrameHandles()) {
      55           0 :         sal_uIntPtr nMarkAnz=GetMarkedObjectCount();
      56           0 :         if (nMarkAnz<=nFrameHandlesLimit) {
      57           0 :             for (sal_uIntPtr nMarkNum=0; nMarkNum<nMarkAnz; nMarkNum++) {
      58           0 :                 const SdrMark* pM=GetSdrMarkByIndex(nMarkNum);
      59           0 :                 const SdrObject* pObj=pM->GetMarkedSdrObj();
      60           0 :                 if (pObj->IsPolyObj()) {
      61           0 :                     nAnz+=pObj->GetPointCount();
      62             :                 }
      63             :             }
      64             :         }
      65             :     }
      66           0 :     return nAnz;
      67             : }
      68             : 
      69          22 : sal_Bool SdrMarkView::HasMarkedPoints() const
      70             : {
      71          22 :     ForceUndirtyMrkPnt();
      72          22 :     sal_Bool bRet=sal_False;
      73          22 :     if (!ImpIsFrameHandles()) {
      74          10 :         sal_uIntPtr nMarkAnz=GetMarkedObjectCount();
      75          10 :         if (nMarkAnz<=nFrameHandlesLimit) {
      76          20 :             for (sal_uIntPtr nMarkNum=0; nMarkNum<nMarkAnz && !bRet; nMarkNum++) {
      77          10 :                 const SdrMark* pM=GetSdrMarkByIndex(nMarkNum);
      78          10 :                 const SdrUShortCont* pPts=pM->GetMarkedPoints();
      79          10 :                 bRet=pPts!=NULL && !pPts->empty();
      80             :             }
      81             :         }
      82             :     }
      83          22 :     return bRet;
      84             : }
      85             : 
      86           0 : sal_uIntPtr SdrMarkView::GetMarkedPointCount() const
      87             : {
      88           0 :     ForceUndirtyMrkPnt();
      89           0 :     sal_uIntPtr nAnz=0;
      90           0 :     if (!ImpIsFrameHandles()) {
      91           0 :         sal_uIntPtr nMarkAnz=GetMarkedObjectCount();
      92           0 :         if (nMarkAnz<=nFrameHandlesLimit) {
      93           0 :             for (sal_uIntPtr nMarkNum=0; nMarkNum<nMarkAnz; nMarkNum++) {
      94           0 :                 const SdrMark* pM=GetSdrMarkByIndex(nMarkNum);
      95           0 :                 const SdrUShortCont* pPts=pM->GetMarkedPoints();
      96           0 :                 if (pPts!=NULL) nAnz+=pPts->size();
      97             :             }
      98             :         }
      99             :     }
     100           0 :     return nAnz;
     101             : }
     102             : 
     103           0 : sal_Bool SdrMarkView::IsPointMarkable(const SdrHdl& rHdl) const
     104             : {
     105           0 :     return !ImpIsFrameHandles() && &rHdl!=NULL && !rHdl.IsPlusHdl() && rHdl.GetKind()!=HDL_GLUE && rHdl.GetKind()!=HDL_SMARTTAG && rHdl.GetObj()!=NULL && rHdl.GetObj()->IsPolyObj();
     106             : }
     107             : 
     108           0 : sal_Bool SdrMarkView::MarkPointHelper(SdrHdl* pHdl, SdrMark* pMark, sal_Bool bUnmark)
     109             : {
     110           0 :     return ImpMarkPoint( pHdl, pMark, bUnmark );
     111             : }
     112             : 
     113           0 : sal_Bool SdrMarkView::ImpMarkPoint(SdrHdl* pHdl, SdrMark* pMark, sal_Bool bUnmark)
     114             : {
     115           0 :     if (pHdl==NULL || pHdl->IsPlusHdl() || pHdl->GetKind()==HDL_GLUE)
     116           0 :         return sal_False;
     117             : 
     118           0 :     if (pHdl->IsSelected() != bUnmark)
     119           0 :         return sal_False;
     120             : 
     121           0 :     SdrObject* pObj=pHdl->GetObj();
     122           0 :     if (pObj==NULL || !pObj->IsPolyObj())
     123           0 :         return sal_False;
     124             : 
     125           0 :     if (pMark==NULL)
     126             :     {
     127           0 :         sal_uIntPtr nMarkNum=TryToFindMarkedObject(pObj);
     128           0 :         if (nMarkNum==CONTAINER_ENTRY_NOTFOUND)
     129           0 :             return sal_False;
     130           0 :         pMark=GetSdrMarkByIndex(nMarkNum);
     131             :     }
     132           0 :     const sal_uInt32 nHdlNum(pHdl->GetObjHdlNum());
     133           0 :     SdrUShortCont* pPts=pMark->ForceMarkedPoints();
     134           0 :     if (!bUnmark)
     135             :     {
     136           0 :         pPts->insert((sal_uInt16)nHdlNum);
     137             :     }
     138             :     else
     139             :     {
     140           0 :         SdrUShortCont::const_iterator it = pPts->find( (sal_uInt16)nHdlNum );
     141           0 :         if (it != pPts->end())
     142             :         {
     143           0 :             pPts->erase(it);
     144             :         }
     145             :         else
     146             :         {
     147           0 :             return sal_False; // error case!
     148             :         }
     149             :     }
     150             : 
     151           0 :     pHdl->SetSelected(!bUnmark);
     152           0 :     if (!bPlusHdlAlways)
     153             :     {
     154           0 :         if (!bUnmark)
     155             :         {
     156           0 :             sal_uInt32 nAnz(pObj->GetPlusHdlCount(*pHdl));
     157           0 :             for (sal_uInt32 i=0; i<nAnz; i++)
     158             :             {
     159           0 :                 SdrHdl* pPlusHdl=pObj->GetPlusHdl(*pHdl,i);
     160           0 :                 if (pPlusHdl!=NULL)
     161             :                 {
     162           0 :                     pPlusHdl->SetObj(pObj);
     163           0 :                     pPlusHdl->SetPageView(pMark->GetPageView());
     164           0 :                     pPlusHdl->SetPlusHdl(sal_True);
     165           0 :                     aHdl.AddHdl(pPlusHdl);
     166             :                 }
     167             :             }
     168             :         }
     169             :         else
     170             :         {
     171           0 :             for (sal_uIntPtr i = aHdl.GetHdlCount(); i>0;)
     172             :             {
     173           0 :                 i--;
     174           0 :                 SdrHdl* pPlusHdl=aHdl.GetHdl(i);
     175           0 :                 if (pPlusHdl->IsPlusHdl() && pPlusHdl->GetSourceHdlNum()==nHdlNum)
     176             :                 {
     177           0 :                     aHdl.RemoveHdl(i);
     178           0 :                     delete pPlusHdl;
     179             :                 }
     180             :             }
     181             :         }
     182             :     }
     183             : 
     184           0 :     aHdl.Sort();
     185             : 
     186           0 :     return sal_True;
     187             : }
     188             : 
     189             : 
     190           0 : sal_Bool SdrMarkView::MarkPoint(SdrHdl& rHdl, sal_Bool bUnmark)
     191             : {
     192           0 :     if (&rHdl==NULL) return sal_False;
     193           0 :     ForceUndirtyMrkPnt();
     194           0 :     sal_Bool bRet=sal_False;
     195           0 :     const SdrObject* pObj=rHdl.GetObj();
     196           0 :     if (IsPointMarkable(rHdl) && rHdl.IsSelected()==bUnmark) {
     197           0 :         sal_uIntPtr nMarkNum=TryToFindMarkedObject(pObj);
     198           0 :         if (nMarkNum!=CONTAINER_ENTRY_NOTFOUND) {
     199           0 :             SdrMark* pM=GetSdrMarkByIndex(nMarkNum);
     200           0 :             pM->ForceMarkedPoints();
     201           0 :             if (ImpMarkPoint(&rHdl,pM,bUnmark)) {
     202           0 :                 MarkListHasChanged();
     203           0 :                 bRet=sal_True;
     204             :             }
     205             :         }
     206             :     }
     207             : 
     208           0 :     return bRet;
     209             : }
     210             : 
     211           0 : sal_Bool SdrMarkView::MarkPoints(const Rectangle* pRect, sal_Bool bUnmark)
     212             : {
     213           0 :     ForceUndirtyMrkPnt();
     214           0 :     sal_Bool bChgd=sal_False;
     215           0 :     SortMarkedObjects();
     216           0 :     const SdrObject* pObj0=NULL;
     217           0 :     const SdrPageView* pPV0=NULL;
     218           0 :     SdrMark* pM=NULL;
     219           0 :     aHdl.Sort();
     220           0 :     sal_uIntPtr nHdlAnz=aHdl.GetHdlCount();
     221           0 :     for (sal_uIntPtr nHdlNum=nHdlAnz; nHdlNum>0;) {
     222           0 :         nHdlNum--;
     223           0 :         SdrHdl* pHdl=aHdl.GetHdl(nHdlNum);
     224           0 :         if (IsPointMarkable(*pHdl) && pHdl->IsSelected()==bUnmark) {
     225           0 :             const SdrObject* pObj=pHdl->GetObj();
     226           0 :             const SdrPageView* pPV=pHdl->GetPageView();
     227           0 :             if (pObj!=pObj0 || pPV!=pPV0 || pM==NULL) { // This section is for optimization,
     228           0 :                 sal_uIntPtr nMarkNum=TryToFindMarkedObject(pObj);  // so ImpMarkPoint() doesn't always
     229           0 :                 if (nMarkNum!=CONTAINER_ENTRY_NOTFOUND) { // have to search the object in the MarkList.
     230           0 :                     pM=GetSdrMarkByIndex(nMarkNum);
     231           0 :                     pObj0=pObj;
     232           0 :                     pPV0=pPV;
     233           0 :                     pM->ForceMarkedPoints();
     234             :                 } else {
     235             : #ifdef DBG_UTIL
     236             :                     if (pObj->IsInserted()) {
     237             :                         OSL_FAIL("SdrMarkView::MarkPoints(const Rectangle* pRect): Selected object not found.");
     238             :                     }
     239             : #endif
     240           0 :                     pM=NULL;
     241             :                 }
     242             :             }
     243           0 :             Point aPos(pHdl->GetPos());
     244           0 :             if (pM!=NULL && (pRect==NULL || pRect->IsInside(aPos))) {
     245           0 :                 if (ImpMarkPoint(pHdl,pM,bUnmark)) bChgd=sal_True;
     246             :             }
     247             :         }
     248             :     }
     249           0 :     if (bChgd) {
     250           0 :         MarkListHasChanged();
     251             :     }
     252             : 
     253           0 :     return bChgd;
     254             : }
     255             : 
     256           0 : sal_Bool SdrMarkView::MarkNextPoint(const Point& /*rPnt*/, sal_Bool /*bPrev*/)
     257             : {
     258           0 :     ForceUndirtyMrkPnt();
     259           0 :     sal_Bool bChgd=sal_False;
     260           0 :     SortMarkedObjects();
     261             :     // ...
     262           0 :     if (bChgd) {
     263           0 :         MarkListHasChanged();
     264             :     }
     265           0 :     return bChgd;
     266             : }
     267             : 
     268           0 : const Rectangle& SdrMarkView::GetMarkedPointsRect() const
     269             : {
     270           0 :     ForceUndirtyMrkPnt();
     271           0 :     if (bMarkedPointsRectsDirty) ImpSetPointsRects();
     272           0 :     return aMarkedPointsRect;
     273             : }
     274             : 
     275           9 : void SdrMarkView::SetPlusHandlesAlwaysVisible(sal_Bool bOn)
     276             : { // TODO: Optimize HandlePaint!
     277           9 :     ForceUndirtyMrkPnt();
     278           9 :     if (bOn!=bPlusHdlAlways) {
     279           0 :         bPlusHdlAlways=bOn;
     280           0 :         SetMarkHandles();
     281           0 :         MarkListHasChanged();
     282             :     }
     283           9 : }
     284             : 
     285             : ////////////////////////////////////////////////////////////////////////////////////////////////////
     286             : // ImpSetPointsRects() is for PolyPoints and GluePoints!
     287             : ////////////////////////////////////////////////////////////////////////////////////////////////////
     288             : 
     289           0 : void SdrMarkView::ImpSetPointsRects() const
     290             : {
     291           0 :     Rectangle aPnts;
     292           0 :     Rectangle aGlue;
     293           0 :     sal_uIntPtr nHdlAnz=aHdl.GetHdlCount();
     294           0 :     for (sal_uIntPtr nHdlNum=0; nHdlNum<nHdlAnz; nHdlNum++) {
     295           0 :         const SdrHdl* pHdl=aHdl.GetHdl(nHdlNum);
     296           0 :         SdrHdlKind eKind=pHdl->GetKind();
     297           0 :         if ((eKind==HDL_POLY && pHdl->IsSelected()) || eKind==HDL_GLUE) {
     298           0 :             Point aPt(pHdl->GetPos());
     299           0 :             Rectangle& rR=eKind==HDL_GLUE ? aGlue : aPnts;
     300           0 :             if (rR.IsEmpty()) {
     301           0 :                 rR=Rectangle(aPt,aPt);
     302             :             } else {
     303           0 :                 if (aPt.X()<rR.Left  ()) rR.Left  ()=aPt.X();
     304           0 :                 if (aPt.X()>rR.Right ()) rR.Right ()=aPt.X();
     305           0 :                 if (aPt.Y()<rR.Top   ()) rR.Top   ()=aPt.Y();
     306           0 :                 if (aPt.Y()>rR.Bottom()) rR.Bottom()=aPt.Y();
     307             :             }
     308             :         }
     309             :     }
     310           0 :     ((SdrMarkView*)this)->aMarkedPointsRect=aPnts;
     311           0 :     ((SdrMarkView*)this)->aMarkedGluePointsRect=aGlue;
     312           0 :     ((SdrMarkView*)this)->bMarkedPointsRectsDirty=sal_False;
     313           0 : }
     314             : 
     315             : ////////////////////////////////////////////////////////////////////////////////////////////////////
     316             : // UndirtyMrkPnt() is for PolyPoints and GluePoints!
     317             : ////////////////////////////////////////////////////////////////////////////////////////////////////
     318             : 
     319         182 : void SdrMarkView::UndirtyMrkPnt() const
     320             : {
     321         182 :     sal_Bool bChg=sal_False;
     322         182 :     sal_uIntPtr nMarkAnz=GetMarkedObjectCount();
     323         182 :     for (sal_uIntPtr nMarkNum=0; nMarkNum<nMarkAnz; nMarkNum++) {
     324           0 :         SdrMark* pM=GetSdrMarkByIndex(nMarkNum);
     325           0 :         const SdrObject* pObj=pM->GetMarkedSdrObj();
     326             :         // PolyPoints
     327           0 :         SdrUShortCont* pPts=pM->GetMarkedPoints();
     328           0 :         if (pPts!=NULL) {
     329           0 :             if (pObj->IsPolyObj()) {
     330             :                 // Remove invalid selected points, that is, all
     331             :                 // entries above the number of points in the object.
     332           0 :                 sal_uInt32 nMax(pObj->GetPointCount());
     333             : 
     334           0 :                 SdrUShortCont::const_iterator it = pPts->lower_bound(nMax);
     335           0 :                 if( it != pPts->end() )
     336             :                 {
     337           0 :                     pPts->erase(it, pPts->end() );
     338           0 :                     bChg = sal_True;
     339             :                 }
     340             :             }
     341             :             else
     342             :             {
     343             :                 OSL_FAIL("SdrMarkView::UndirtyMrkPnt(): Selected points on an object that is not a PolyObj!");
     344           0 :                 if(pPts && !pPts->empty())
     345             :                 {
     346           0 :                     pPts->clear();
     347           0 :                     bChg = sal_True;
     348             :                 }
     349             :             }
     350             :         }
     351             : 
     352             :         // GluePoints
     353           0 :         pPts=pM->GetMarkedGluePoints();
     354           0 :         const SdrGluePointList* pGPL=pObj->GetGluePointList();
     355           0 :         if (pPts!=NULL) {
     356           0 :             if (pGPL!=NULL) {
     357             :                 // Remove invalid selected glue points, that is, all entries
     358             :                 // (IDs) that aren't contained in the GluePointList of the
     359             :                 // object
     360           0 :                 for(SdrUShortCont::const_iterator it = pPts->begin(); it != pPts->end(); )
     361             :                 {
     362           0 :                     sal_uInt16 nId=*it;
     363           0 :                     if (pGPL->FindGluePoint(nId)==SDRGLUEPOINT_NOTFOUND) {
     364           0 :                         pPts->erase(it++);
     365           0 :                         bChg=sal_True;
     366             :                     }
     367             :                     else
     368           0 :                         ++it;
     369             :                 }
     370             :             } else {
     371           0 :                 if (pPts!=NULL && !pPts->empty()) {
     372           0 :                     pPts->clear(); // object doesn't have any glue points (any more)
     373           0 :                     bChg=sal_True;
     374             :                 }
     375             :             }
     376             :         }
     377             :     }
     378         182 :     if (bChg) ((SdrMarkView*)this)->bMarkedPointsRectsDirty=sal_True;
     379         182 :     ((SdrMarkView*)this)->bMrkPntDirty=sal_False;
     380         182 : }
     381             : 
     382             : ////////////////////////////////////////////////////////////////////////////////////////////////////
     383             : 
     384           0 : sal_Bool SdrMarkView::HasMarkableGluePoints() const
     385             : {
     386           0 :     sal_Bool bRet=sal_False;
     387           0 :     if (IsGluePointEditMode()) {
     388           0 :         ForceUndirtyMrkPnt();
     389           0 :         sal_uIntPtr nMarkAnz=GetMarkedObjectCount();
     390           0 :         for (sal_uIntPtr nMarkNum=0; nMarkNum<nMarkAnz && !bRet; nMarkNum++) {
     391           0 :             const SdrMark* pM=GetSdrMarkByIndex(nMarkNum);
     392           0 :             const SdrObject* pObj=pM->GetMarkedSdrObj();
     393           0 :             const SdrGluePointList* pGPL=pObj->GetGluePointList();
     394             : 
     395             :             // #i38892#
     396           0 :             if(pGPL && pGPL->GetCount())
     397             :             {
     398           0 :                 for(sal_uInt16 a(0); !bRet && a < pGPL->GetCount(); a++)
     399             :                 {
     400           0 :                     if((*pGPL)[a].IsUserDefined())
     401             :                     {
     402           0 :                         bRet = sal_True;
     403             :                     }
     404             :                 }
     405             :             }
     406             :         }
     407             :     }
     408           0 :     return bRet;
     409             : }
     410             : 
     411          22 : sal_Bool SdrMarkView::HasMarkedGluePoints() const
     412             : {
     413          22 :     ForceUndirtyMrkPnt();
     414          22 :     sal_Bool bRet=sal_False;
     415          22 :     sal_uIntPtr nMarkAnz=GetMarkedObjectCount();
     416          35 :     for (sal_uIntPtr nMarkNum=0; nMarkNum<nMarkAnz && !bRet; nMarkNum++) {
     417          13 :         const SdrMark* pM=GetSdrMarkByIndex(nMarkNum);
     418          13 :         const SdrUShortCont* pPts=pM->GetMarkedGluePoints();
     419          13 :         bRet=pPts!=NULL && !pPts->empty();
     420             :     }
     421          22 :     return bRet;
     422             : }
     423             : 
     424           0 : sal_Bool SdrMarkView::MarkGluePoints(const Rectangle* pRect, sal_Bool bUnmark)
     425             : {
     426           0 :     if (!IsGluePointEditMode() && !bUnmark) return sal_False;
     427           0 :     ForceUndirtyMrkPnt();
     428           0 :     sal_Bool bChgd=sal_False;
     429           0 :     SortMarkedObjects();
     430           0 :     sal_uIntPtr nMarkAnz=GetMarkedObjectCount();
     431           0 :     for (sal_uIntPtr nMarkNum=0; nMarkNum<nMarkAnz; nMarkNum++) {
     432           0 :         SdrMark* pM=GetSdrMarkByIndex(nMarkNum);
     433           0 :         const SdrObject* pObj=pM->GetMarkedSdrObj();
     434           0 :         const SdrGluePointList* pGPL=pObj->GetGluePointList();
     435           0 :         SdrUShortCont* pPts=pM->GetMarkedGluePoints();
     436           0 :         if (bUnmark && pRect==NULL) { // UnmarkAll
     437           0 :             if (pPts!=NULL && !pPts->empty()) {
     438           0 :                 pPts->clear();
     439           0 :                 bChgd=sal_True;
     440             :             }
     441             :         } else {
     442           0 :             if (pGPL!=NULL && (pPts!=NULL || !bUnmark)) {
     443           0 :                 sal_uInt16 nGPAnz=pGPL->GetCount();
     444           0 :                 for (sal_uInt16 nGPNum=0; nGPNum<nGPAnz; nGPNum++) {
     445           0 :                     const SdrGluePoint& rGP=(*pGPL)[nGPNum];
     446             : 
     447             :                     // #i38892#
     448           0 :                     if(rGP.IsUserDefined())
     449             :                     {
     450           0 :                         Point aPos(rGP.GetAbsolutePos(*pObj));
     451           0 :                         if (pRect==NULL || pRect->IsInside(aPos)) {
     452           0 :                             if (pPts==NULL)
     453           0 :                                 pPts=pM->ForceMarkedGluePoints();
     454           0 :                             bool bContains = pPts->find( rGP.GetId() ) != pPts->end();
     455           0 :                             if (!bUnmark && !bContains) {
     456           0 :                                 bChgd=sal_True;
     457           0 :                                 pPts->insert(rGP.GetId());
     458             :                             }
     459           0 :                             if (bUnmark && bContains) {
     460           0 :                                 bChgd=sal_True;
     461           0 :                                 pPts->erase(rGP.GetId());
     462             :                             }
     463             :                         }
     464             :                     }
     465             :                 }
     466             :             }
     467             :         }
     468             :     }
     469           0 :     if (bChgd) {
     470           0 :         AdjustMarkHdl();
     471           0 :         MarkListHasChanged();
     472             :     }
     473           0 :     return bChgd;
     474             : }
     475             : 
     476           0 : sal_Bool SdrMarkView::PickGluePoint(const Point& rPnt, SdrObject*& rpObj, sal_uInt16& rnId, SdrPageView*& rpPV, sal_uIntPtr nOptions) const
     477             : {
     478           0 :     SdrObject* pObj0=rpObj;
     479           0 :     sal_uInt16 nId0=rnId;
     480           0 :     rpObj=NULL; rpPV=NULL; rnId=0;
     481           0 :     if (!IsGluePointEditMode()) return sal_False;
     482           0 :     sal_Bool bBack=(nOptions & SDRSEARCH_BACKWARD) !=0;
     483           0 :     sal_Bool bNext=(nOptions & SDRSEARCH_NEXT) !=0;
     484           0 :     OutputDevice* pOut=(OutputDevice*)pActualOutDev;
     485           0 :     if (pOut==NULL) pOut=GetFirstOutputDevice();
     486           0 :     if (pOut==NULL) return sal_False;
     487           0 :     SortMarkedObjects();
     488           0 :     sal_uIntPtr nMarkAnz=GetMarkedObjectCount();
     489           0 :     sal_uIntPtr nMarkNum=bBack ? 0 : nMarkAnz;
     490           0 :     if (bNext) {
     491           0 :         nMarkNum=((SdrMarkView*)this)->TryToFindMarkedObject(pObj0);
     492           0 :         if (nMarkNum==CONTAINER_ENTRY_NOTFOUND) return sal_False;
     493           0 :         if (!bBack) nMarkNum++;
     494             :     }
     495           0 :     while (bBack ? nMarkNum<nMarkAnz : nMarkNum>0) {
     496           0 :         if (!bBack) nMarkNum--;
     497           0 :         const SdrMark* pM=GetSdrMarkByIndex(nMarkNum);
     498           0 :         SdrObject* pObj=pM->GetMarkedSdrObj();
     499           0 :         SdrPageView* pPV=pM->GetPageView();
     500           0 :         const SdrGluePointList* pGPL=pObj->GetGluePointList();
     501           0 :         if (pGPL!=NULL) {
     502           0 :             sal_uInt16 nNum=pGPL->HitTest(rPnt,*pOut,pObj,bBack,bNext,nId0);
     503           0 :             if (nNum!=SDRGLUEPOINT_NOTFOUND)
     504             :             {
     505             :                 // #i38892#
     506           0 :                 const SdrGluePoint& rCandidate = (*pGPL)[nNum];
     507             : 
     508           0 :                 if(rCandidate.IsUserDefined())
     509             :                 {
     510           0 :                     rpObj=pObj;
     511           0 :                     rnId=(*pGPL)[nNum].GetId();
     512           0 :                     rpPV=pPV;
     513           0 :                     return sal_True;
     514             :                 }
     515             :             }
     516             :         }
     517           0 :         bNext=sal_False; // HitNextGluePoint only for the first Obj
     518           0 :         if (bBack) nMarkNum++;
     519             :     }
     520           0 :     return sal_False;
     521             : }
     522             : 
     523           0 : sal_Bool SdrMarkView::MarkGluePoint(const SdrObject* pObj, sal_uInt16 nId, const SdrPageView* /*pPV*/, sal_Bool bUnmark)
     524             : {
     525           0 :     if (!IsGluePointEditMode()) return sal_False;
     526           0 :     ForceUndirtyMrkPnt();
     527           0 :     sal_Bool bChgd=sal_False;
     528           0 :     if (pObj!=NULL) {
     529           0 :         sal_uIntPtr nMarkPos=TryToFindMarkedObject(pObj);
     530           0 :         if (nMarkPos!=CONTAINER_ENTRY_NOTFOUND) {
     531           0 :             SdrMark* pM=GetSdrMarkByIndex(nMarkPos);
     532           0 :             SdrUShortCont* pPts=bUnmark ? pM->GetMarkedGluePoints() : pM->ForceMarkedGluePoints();
     533           0 :             if (pPts!=NULL) {
     534           0 :                 bool bContains = pPts->find( nId ) != pPts->end();
     535           0 :                 if (!bUnmark && !bContains) {
     536           0 :                     bChgd=sal_True;
     537           0 :                     pPts->insert(nId);
     538             :                 }
     539           0 :                 if (bUnmark && bContains) {
     540           0 :                     bChgd=sal_True;
     541           0 :                     pPts->erase(nId);
     542             :                 }
     543             :             }
     544             :         } else {
     545             :             // TODO: implement implicit selection of objects
     546             :         }
     547             :     }
     548           0 :     if (bChgd) {
     549           0 :         AdjustMarkHdl();
     550           0 :         MarkListHasChanged();
     551             :     }
     552           0 :     return bChgd;
     553             : }
     554             : 
     555           0 : sal_Bool SdrMarkView::IsGluePointMarked(const SdrObject* pObj, sal_uInt16 nId) const
     556             : {
     557           0 :     ForceUndirtyMrkPnt();
     558           0 :     sal_Bool bRet=sal_False;
     559           0 :     sal_uIntPtr nPos=((SdrMarkView*)this)->TryToFindMarkedObject(pObj); // casting to NonConst
     560           0 :     if (nPos!=CONTAINER_ENTRY_NOTFOUND) {
     561           0 :         const SdrMark* pM=GetSdrMarkByIndex(nPos);
     562           0 :         const SdrUShortCont* pPts=pM->GetMarkedGluePoints();
     563           0 :         if (pPts!=NULL) {
     564           0 :             bRet = pPts->find( nId ) != pPts->end();
     565             :         }
     566             :     }
     567           0 :     return bRet;
     568             : }
     569             : 
     570           0 : SdrHdl* SdrMarkView::GetGluePointHdl(const SdrObject* pObj, sal_uInt16 nId) const
     571             : {
     572           0 :     ForceUndirtyMrkPnt();
     573           0 :     sal_uIntPtr nHdlAnz=aHdl.GetHdlCount();
     574           0 :     for (sal_uIntPtr nHdlNum=0; nHdlNum<nHdlAnz; nHdlNum++) {
     575           0 :         SdrHdl* pHdl=aHdl.GetHdl(nHdlNum);
     576           0 :         if (pHdl->GetObj()==pObj &&
     577           0 :             pHdl->GetKind()==HDL_GLUE &&
     578           0 :             pHdl->GetObjHdlNum()==nId ) return pHdl;
     579             :     }
     580           0 :     return NULL;
     581             : }
     582             : 
     583           0 : sal_Bool SdrMarkView::MarkNextGluePoint(const Point& /*rPnt*/, sal_Bool /*bPrev*/)
     584             : {
     585           0 :     ForceUndirtyMrkPnt();
     586           0 :     sal_Bool bChgd=sal_False;
     587           0 :     SortMarkedObjects();
     588             :     // ...
     589           0 :     if (bChgd) {
     590           0 :         MarkListHasChanged();
     591             :     }
     592           0 :     return bChgd;
     593             : }
     594             : 
     595           0 : const Rectangle& SdrMarkView::GetMarkedGluePointsRect() const
     596             : {
     597           0 :     ForceUndirtyMrkPnt();
     598           0 :     if (bMarkedPointsRectsDirty) ImpSetPointsRects();
     599           0 :     return aMarkedGluePointsRect;
     600             : }
     601             : 
     602             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10