diff options
author | Armin Le Grand <alg@apache.org> | 2013-09-12 11:17:45 +0000 |
---|---|---|
committer | Armin Le Grand <alg@apache.org> | 2013-09-12 11:17:45 +0000 |
commit | ff6a9f07d740c9a15c4d498db4cec6b99b4c14b4 (patch) | |
tree | 8f4bcec9250534ea5f8838bf9daeeb8fa39647d2 | |
parent | bcb0630dd609dbf890558a719f77d3da44bcbcac (diff) |
in-between work commit
-rw-r--r-- | chart2/source/controller/drawinglayer/DrawViewWrapper.cxx | 7 | ||||
-rw-r--r-- | sc/source/ui/inc/drawview.hxx | 2 | ||||
-rw-r--r-- | sc/source/ui/view/drawview.cxx | 4 | ||||
-rw-r--r-- | sd/source/ui/func/fusel.cxx | 32 | ||||
-rw-r--r-- | sd/source/ui/inc/View.hxx | 2 | ||||
-rw-r--r-- | sd/source/ui/view/sdview.cxx | 4 | ||||
-rw-r--r-- | sd/source/ui/view/sdview3.cxx | 11 | ||||
-rw-r--r-- | svx/inc/svx/sdr/overlay/overlayobjectlist.hxx | 1 | ||||
-rw-r--r-- | svx/inc/svx/svdhdl.hxx | 16 | ||||
-rw-r--r-- | svx/inc/svx/svdmrkv.hxx | 32 | ||||
-rw-r--r-- | svx/source/svdraw/sdrselection.cxx | 7 | ||||
-rw-r--r-- | svx/source/svdraw/svddrgv.cxx | 4 | ||||
-rw-r--r-- | svx/source/svdraw/svdedtv.cxx | 3 | ||||
-rw-r--r-- | svx/source/svdraw/svdedxv.cxx | 14 | ||||
-rw-r--r-- | svx/source/svdraw/svdhdl.cxx | 37 | ||||
-rw-r--r-- | svx/source/svdraw/svdmrkv.cxx | 51 | ||||
-rw-r--r-- | svx/source/svdraw/svdmrkv1.cxx | 21 | ||||
-rw-r--r-- | svx/source/svdraw/svdopath.cxx | 96 | ||||
-rw-r--r-- | svx/source/svdraw/svdview.cxx | 5 | ||||
-rw-r--r-- | sw/source/core/draw/dview.cxx | 10 | ||||
-rw-r--r-- | sw/source/core/inc/dview.hxx | 2 |
21 files changed, 222 insertions, 139 deletions
diff --git a/chart2/source/controller/drawinglayer/DrawViewWrapper.cxx b/chart2/source/controller/drawinglayer/DrawViewWrapper.cxx index 88562114947a..b29f752cc689 100644 --- a/chart2/source/controller/drawinglayer/DrawViewWrapper.cxx +++ b/chart2/source/controller/drawinglayer/DrawViewWrapper.cxx @@ -222,7 +222,12 @@ SdrPageView* DrawViewWrapper::GetPageView() const //virtual void DrawViewWrapper::SetMarkHandles() { - if( m_pMarkHandleProvider && m_pMarkHandleProvider->getMarkHandles( maViewHandleList ) ) + // hack for chart: It creates ominous own handles, and that by directly manipulating + // the normally not accessible maViewHandleList. For now, allow access to it by casting + // it to non-const + const SdrHdlList& rHdlList = GetHdlList(); + + if( m_pMarkHandleProvider && m_pMarkHandleProvider->getMarkHandles( const_cast< SdrHdlList& >(rHdlList) ) ) return; else SdrView::SetMarkHandles(); diff --git a/sc/source/ui/inc/drawview.hxx b/sc/source/ui/inc/drawview.hxx index 9a416421e699..1759e6c8e7e6 100644 --- a/sc/source/ui/inc/drawview.hxx +++ b/sc/source/ui/inc/drawview.hxx @@ -54,7 +54,7 @@ protected: virtual void LazyReactOnObjectChanges(); // add custom handles (used by other apps, e.g. AnchorPos) - virtual void AddCustomHdl(); + virtual void AddCustomHdl(SdrHdlList& rTarget); void ImplClearCalcDropMarker(); diff --git a/sc/source/ui/view/drawview.cxx b/sc/source/ui/view/drawview.cxx index 3621ef78d88c..9d58c6d1f266 100644 --- a/sc/source/ui/view/drawview.cxx +++ b/sc/source/ui/view/drawview.cxx @@ -152,7 +152,7 @@ __EXPORT ScDrawView::~ScDrawView() ImplClearCalcDropMarker(); } -void ScDrawView::AddCustomHdl() +void ScDrawView::AddCustomHdl(SdrHdlList& rTarget) { sal_Bool bNegativePage = pDoc->IsNegativePage( nTab ); const SdrObjectVector aSelection(getSelectedSdrObjectVectorFromSdrMarkView()); @@ -193,7 +193,7 @@ void ScDrawView::AddCustomHdl() ScTabView* pView = pViewData->GetView(); ScAddress aScAddress(nCol, nRow, nTab); - pView->CreateAnchorHandles(maViewHandleList, aScAddress); + pView->CreateAnchorHandles(rTarget, aScAddress); } } } diff --git a/sd/source/ui/func/fusel.cxx b/sd/source/ui/func/fusel.cxx index a9106776c2f7..479e1b68cfb7 100644 --- a/sd/source/ui/func/fusel.cxx +++ b/sd/source/ui/func/fusel.cxx @@ -403,6 +403,12 @@ bool FuSelection::MouseButtonDown(const MouseEvent& rMEvt) } } + // refresh mbMoveAllowedOnSelection when selection has changed + if(mpView->isSelectionChangePending()) + { + mpView->forceSelectionChange(); + } + if( !bDeactivateOLE ) { if ( !bReadOnly && @@ -495,8 +501,13 @@ bool FuSelection::MouseButtonDown(const MouseEvent& rMEvt) { if (!rMEvt.IsShift()) { - mpView->MarkPoints(0, true); // unmarkall + // unmarkall + mpView->MarkPoints(0, true); + + // update all SdrHdl before getting one mpView->forceSelectionChange(); + + // get one pHdl = mpView->PickHandle(aMDPos); } else @@ -520,14 +531,12 @@ bool FuSelection::MouseButtonDown(const MouseEvent& rMEvt) if ( ! rMEvt.IsRight()) { - // here HAVE to check for pending selection change; if this - // is the case, pHdl WILL be deleted on the next execution of this - // pending change and a new one will be created. Need to force - // that change to get the new created pHdl to not continue - // processing on the dying one - if(mpView->isSelectionChangePending()) // TTTT: Check again: Is this needed? + if(mpView->isSelectionChangePending()) { + // trigger evtl. outstanding selection change + // to get a valid SdrHdl with the next call mpView->forceSelectionChange(); + pHdl = mpView->PickHandle(aMDPos); } @@ -697,12 +706,9 @@ bool FuSelection::MouseButtonUp(const MouseEvent& rMEvt) if( !mpView ) return false; - if(mpView->isSelectionChangePending()) - { - // force trigger selection change to get bSelectionChanged - // set in FuSelection::SelectionHasChanged() call eventually - mpView->forceSelectionChange(); - } + // force trigger selection change to get bSelectionChanged + // set in FuSelection::SelectionHasChanged() call eventually + mpView->forceSelectionChange(); const double fHitLog(basegfx::B2DVector(mpWindow->GetInverseViewTransformation() * basegfx::B2DVector(HITPIX, 0.0)).getLength()); const double fDrgLog(basegfx::B2DVector(mpWindow->GetInverseViewTransformation() * basegfx::B2DVector(DRGPIX, 0.0)).getLength()); diff --git a/sd/source/ui/inc/View.hxx b/sd/source/ui/inc/View.hxx index 7a409edcfe68..80eede3f028e 100644 --- a/sd/source/ui/inc/View.hxx +++ b/sd/source/ui/inc/View.hxx @@ -167,7 +167,7 @@ public: /** returns true if we have an undo manager and there is an open list undo action */ bool isRecordingUndo() const; - virtual void AddCustomHdl(); + virtual void AddCustomHdl(SdrHdlList& rTarget); SmartTagSet& getSmartTags() { return maSmartTags; } void selectSmartTag( const SmartTagReference& xTag ); diff --git a/sd/source/ui/view/sdview.cxx b/sd/source/ui/view/sdview.cxx index f2fe021c292f..8d749637cece 100644 --- a/sd/source/ui/view/sdview.cxx +++ b/sd/source/ui/view/sdview.cxx @@ -1199,9 +1199,9 @@ bool View::isRecordingUndo() const } } -void View::AddCustomHdl() +void View::AddCustomHdl(SdrHdlList& rTarget) { - maSmartTags.addCustomHandles(maViewHandleList); + maSmartTags.addCustomHandles(rTarget); } SdrViewContext View::GetContext() const diff --git a/sd/source/ui/view/sdview3.cxx b/sd/source/ui/view/sdview3.cxx index 0b5fadfe3640..814edcda2f79 100644 --- a/sd/source/ui/view/sdview3.cxx +++ b/sd/source/ui/view/sdview3.cxx @@ -612,8 +612,17 @@ bool View::InsertData( const TransferableDataHelper& rDataHelper, } else { + const basegfx::B2DVector aDelta(maDropPos - pOwnData->GetStartPos()); + const double fMoveLength(aDelta.getLength()); + pOwnData->SetInternalMove( true ); - MoveMarkedObj(maDropPos - pOwnData->GetStartPos(), bCopy ); + + // only move when the minimum move distance is travelled + if(fMoveLength > getMinMovLog()) + { + MoveMarkedObj(maDropPos - pOwnData->GetStartPos(), bCopy ); + } + bReturn = true; } } diff --git a/svx/inc/svx/sdr/overlay/overlayobjectlist.hxx b/svx/inc/svx/sdr/overlay/overlayobjectlist.hxx index 433df5d78a1a..473612e7fe6a 100644 --- a/svx/inc/svx/sdr/overlay/overlayobjectlist.hxx +++ b/svx/inc/svx/sdr/overlay/overlayobjectlist.hxx @@ -59,6 +59,7 @@ namespace sdr void remove(OverlayObject& rOverlayObject); // access to objects + bool isEmpty() const { return maVector.empty(); } sal_uInt32 count() const { return maVector.size(); } OverlayObject& getOverlayObject(sal_uInt32 nIndex) const { return *(maVector[nIndex]); } diff --git a/svx/inc/svx/svdhdl.hxx b/svx/inc/svx/svdhdl.hxx index e31f49be209e..1de173faaf56 100644 --- a/svx/inc/svx/svdhdl.hxx +++ b/svx/inc/svx/svdhdl.hxx @@ -43,9 +43,11 @@ class SdrHdlList; class SdrMarkView; class SdrObject; -//class SdrPageView; class MouseEvent; +#define SDR_HANDLE_COLOR_SIZE_NORMAL Size(13, 13) +#define SDR_HANDLE_COLOR_SIZE_SELECTED Size(17, 17) + //////////////////////////////////////////////////////////////////////////////////////////////////// // Jedes Objekt muss in der Lage seine Handles zu erzeugen. Diese werden dann // bei einer Selektion abgeholt, bei der View angemeldet und sichtbar gemacht. @@ -271,7 +273,7 @@ public: //////////////////////////////////////////////////////////////////////////////////////////////////// -class SVX_DLLPUBLIC SdrHdlList : private boost::noncopyable, public Timer +class SVX_DLLPUBLIC SdrHdlList : private boost::noncopyable { private: typedef ::std::vector< SdrHdl* > SdrHdlContainerType; @@ -280,12 +282,6 @@ private: SVX_DLLPRIVATE bool operator==(const SdrHdlList&); SVX_DLLPRIVATE bool operator!=(const SdrHdlList&); - // derived from Timer; starts timer to call a delayed Timeout - // which then calls CreateB2dIAObject for each handle. Only to be called - // from SdrHdl itself - virtual void Timeout(); - void SdrHdlVisualisationChanged(); - protected: sal_uInt32 mnFocusIndex; SdrMarkView& mrView; @@ -303,6 +299,7 @@ public: ~SdrHdlList(); void Clear(); + void CreateVisualizations(); // #97016# II void TravelFocusHdl(bool bForward); @@ -344,9 +341,6 @@ public: //////////////////////////////////////////////////////////////////////////////////////////////////// -#define SDR_HANDLE_COLOR_SIZE_NORMAL Size(13, 13) -#define SDR_HANDLE_COLOR_SIZE_SELECTED Size(17, 17) - class SVX_DLLPUBLIC SdrHdlColor : public SdrHdl { private: diff --git a/svx/inc/svx/svdmrkv.hxx b/svx/inc/svx/svdmrkv.hxx index 5790dc102832..77c4cce5ebc0 100644 --- a/svx/inc/svx/svdmrkv.hxx +++ b/svx/inc/svx/svdmrkv.hxx @@ -113,9 +113,12 @@ protected: basegfx::B2DPoint maRef2; // Persistent basegfx::B2DPoint maLastCrookCenter; // Persistent +private: + // make private; access should be limited since it is dependent of selection and thus from + // the selection to be up-to-date. Before using a call to isSelectionChangePending() and + // evtl. to forceSelectionChange() may be done which will potentially recreate all SdrHdl objects SdrHdlList maViewHandleList; -private: // new selection abstraction. Private to guarantee isolation sdr::selection::Selection maSelection; @@ -137,7 +140,7 @@ protected: virtual bool MouseMove(const MouseEvent& rMEvt, Window* pWin); // add custom handles (used by other apps, e.g. AnchorPos) - virtual void AddCustomHdl(); + virtual void AddCustomHdl(SdrHdlList& rTarget); void ForceRefToMarked(); virtual SdrObject* CheckSingleSdrObjectHit(const basegfx::B2DPoint& rPnt, double fTol, SdrObject* pObj, sal_uInt32 nOptions, const SetOfByte* pMVisLay) const; @@ -209,31 +212,24 @@ public: //////////////////////////////////////////////////////////////////////////////////////////////////// // new interface to selection, a direct wrapper to sdr::selection::Selection + // validity of selection check and force + bool isSelectionChangePending() const { return maSelection.isSelectionChangePending(); } + void forceSelectionChange() { maSelection.forceSelectionChange(); } + // selection const accesses SdrObjectVector getSelectedSdrObjectVectorFromSdrMarkView() const { return maSelection.getVector(); } SdrObject* getSelectedIfSingle() const { return maSelection.getSingle(); } bool areSdrObjectsSelected() const { return !maSelection.empty(); } sal_uInt32 getSelectedSdrObjectCount() const { return maSelection.size(); } bool isSdrObjectSelected(const SdrObject& rObject) const { return maSelection.isSdrObject(rObject); } - - // selection const accesses: possibility to ask for pending SelectionChange and to force it - bool isSelectionChangePending() const { return maSelection.isSelectionChangePending(); } - void forceSelectionChange() { maSelection.forceSelectionChange(); } - - // selection const accesses: point selection sdr::selection::Indices getSelectedPointsForSelectedSdrObject(const SdrObject& rObject) const { return maSelection.getIndicesForSdrObject(rObject, true); } String getSelectedPointsDescription() const { return maSelection.getIndexDescription(true); } bool arePointsSelected() const { return maSelection.hasIndices(true); } - - // selection const accesses: gluepoint selection sdr::selection::Indices getSelectedGluesForSelectedSdrObject(const SdrObject& rObject) const { return maSelection.getIndicesForSdrObject(rObject, false); } String getSelectedGluesDescription() const { return maSelection.getIndexDescription(false); } bool areGluesSelected() const { return maSelection.hasIndices(false); } - // selection changers. These will trigger a delayedSelectionChanged() which will - // on forceSelectionChange() or timer event trigger handleSelectionChange(). This will - // recreate e.g. the SdrHdl. This means that ALL code which works with SdrHdl and selection - // has to take care of working woith valid SdrHdl when changing the selection (!) + // selection changers. These will trigger a delayedSelectionChanged() void removeSdrObjectFromSelection(const SdrObject& rObject) { maSelection.removeSdrObject(rObject); } void addSdrObjectToSelection(const SdrObject& rObject) { maSelection.addSdrObject(rObject); } void setSdrObjectSelection(const SdrObjectVector& rSdrObjectVector) { maSelection.setSdrObjects(rSdrObjectVector); } @@ -307,7 +303,7 @@ public: // Dazu muessen die Handles ggf. verkleinert dargestellt werden. Mit der // MinMarkHdlSize kann man hierfuer eine Mindestgroesse angeben. // Defaultwert ist 3, Mindestwert 3 Pixel. - bool IsSolidMarkHdl() const { return maViewHandleList.IsFineHdl(); } + bool IsSolidMarkHdl() const; void SetSolidMarkHdl(bool bOn); virtual bool HasMarkablePoints() const; @@ -341,9 +337,9 @@ public: // Die Nummer des passenden Handles raussuchen. Nicht gefunden // liefert CONTAINER_ENTRY_NOTFOUND. - sal_uInt32 GetHdlNum(SdrHdl* pHdl) const { return maViewHandleList.GetHdlNum(pHdl); } - SdrHdl* GetHdlByIndex(sal_uInt32 nHdlNum) const { if(nHdlNum < maViewHandleList.GetHdlCount()) return maViewHandleList.GetHdlByIndex(nHdlNum); return 0; } - const SdrHdlList& GetHdlList() const { return maViewHandleList; } + sal_uInt32 GetHdlNum(SdrHdl* pHdl) const; + SdrHdl* GetHdlByIndex(sal_uInt32 nHdlNum) const; + const SdrHdlList& GetHdlList() const; // Selektionsrahmen fuer Punktmarkierung aufziehen. // Wird nur gestartet, wenn HasMarkablePoints() true liefert. diff --git a/svx/source/svdraw/sdrselection.cxx b/svx/source/svdraw/sdrselection.cxx index 2035df406108..f987d1c147e0 100644 --- a/svx/source/svdraw/sdrselection.cxx +++ b/svx/source/svdraw/sdrselection.cxx @@ -159,8 +159,11 @@ namespace sdr void Selection::delayedSelectionChanged() { // trigger a delayed selection change - SetTimeout(1); - Start(); + if(!IsActive()) + { + SetTimeout(1); + Start(); + } } bool Selection::isSelectionChangePending() const diff --git a/svx/source/svdraw/svddrgv.cxx b/svx/source/svdraw/svddrgv.cxx index c2d987adb9d9..1d1ae57a8260 100644 --- a/svx/source/svdraw/svddrgv.cxx +++ b/svx/source/svdraw/svddrgv.cxx @@ -767,9 +767,9 @@ bool SdrDragView::ImpBegInsObjPoint(bool bIdxZwang, sal_uInt32 /*nIdx*/, const b { mbInsPolyPoint = true; MarkPoints(0, true); // unmarkall - SetMarkHandles(); + // SetMarkHandles(); TTTT should be triggered by GetHdlList() below - bRetval = BegDragObj(rPnt, maViewHandleList.GetHdlByIndex(mnInsPointNum), 0.0); + bRetval = BegDragObj(rPnt, GetHdlList().GetHdlByIndex(mnInsPointNum), 0.0); if (bRetval) { diff --git a/svx/source/svdraw/svdedtv.cxx b/svx/source/svdraw/svdedtv.cxx index 7f725d46bed2..db54722a6909 100644 --- a/svx/source/svdraw/svdedtv.cxx +++ b/svx/source/svdraw/svdedtv.cxx @@ -879,9 +879,6 @@ void SdrEditView::CheckPossibilities() void SdrEditView::ForcePossibilities() const { - // trigger evtl. delayed selection changes - const_cast< SdrEditView* >(this)->forceSelectionChange(); - if(mbPossibilitiesDirty) { const_cast< SdrEditView* >(this)->CheckPossibilities(); diff --git a/svx/source/svdraw/svdedxv.cxx b/svx/source/svdraw/svdedxv.cxx index a48efa197e0f..314cc9858f79 100644 --- a/svx/source/svdraw/svdedxv.cxx +++ b/svx/source/svdraw/svdedxv.cxx @@ -547,7 +547,7 @@ OutlinerView* SdrObjEditView::ImpMakeOutlinerView(Window* pWin, bool /*bNoPaint* if(bTextFrame) { - sal_uInt16 nPixSiz = maViewHandleList.GetHdlSize() * 2 + 1; + sal_uInt16 nPixSiz = GetHdlList().GetHdlSize() * 2 + 1; nStat|=EV_CNTRL_INVONEMORE; pOutlView->SetInvalidateMore(nPixSiz); } @@ -808,8 +808,8 @@ bool SdrObjEditView::SdrBeginTextEdit( maMinTextEditArea.transform(aTextEditOffsetTransform); mpTextEditCursorMerker = pWin->GetCursor(); - maViewHandleList.SetMoveOutside(true); - SetMarkHandles(); + SetMoveOutside(true); + // SetMarkHandles(); TTTT: Should be triggered by SetMoveOutside directly mpTextEditOutlinerView = ImpMakeOutlinerView(pWin, !bEmpty, pGivenOutlinerView); @@ -829,8 +829,8 @@ bool SdrObjEditView::SdrBeginTextEdit( GetTextEditOutliner()->InsertView(GetTextEditOutlinerView(), 0); } - maViewHandleList.SetMoveOutside(false); - maViewHandleList.SetMoveOutside(true); + SetMoveOutside(false); + SetMoveOutside(true); // alle Wins als OutlinerView beim Outliner anmelden if(!bOnlyOneView) @@ -959,7 +959,7 @@ bool SdrObjEditView::SdrBeginTextEdit( mpTextEditOutlinerView = 0; mxTextEditObj.reset(0); mpTextEditWin = 0; - maViewHandleList.SetMoveOutside(false); + SetMoveOutside(false); return false; } @@ -1208,7 +1208,7 @@ SdrEndTextEditKind SdrObjEditView::SdrEndTextEdit(bool bDontDeleteReally) pTEWin->SetCursor(pTECursorMerker); } - maViewHandleList.SetMoveOutside(false); + SetMoveOutside(false); #ifdef DBG_UTIL if(GetItemBrowser()) diff --git a/svx/source/svdraw/svdhdl.cxx b/svx/source/svdraw/svdhdl.cxx index 0e8fb07bf78c..b3ed65362a6a 100644 --- a/svx/source/svdraw/svdhdl.cxx +++ b/svx/source/svdraw/svdhdl.cxx @@ -312,10 +312,6 @@ SdrHdl::SdrHdl( { // add to owning list mrHdlList.maList.push_back(this); - - // make sure graphical representation gets created. Cannot call - // CreateB2dIAObject() here since it's a virtual function - mrHdlList.SdrHdlVisualisationChanged(); } SdrHdl::~SdrHdl() @@ -377,8 +373,14 @@ void SdrHdl::SetSelected(bool bJa) void SdrHdl::Touch() { - // force update of graphic representation - CreateB2dIAObject(); + // force update of graphic representation, but only when not empty. When + // it is empty, the finishing call to CreateVisualizations() is not yet + // done but can be expected. If not empty, attributes are changed outside + // handle creation (SdrMarkView::SetMarkHandles()), e.g. blinking or MouseOver + if(!getOverlayObjectList().isEmpty()) + { + CreateB2dIAObject(); + } } void SdrHdl::GetRidOfIAObject() @@ -1084,23 +1086,8 @@ extern "C" int __LOADONCALLAPI ImplSortHdlFunc( const void* pVoid1, const void* //////////////////////////////////////////////////////////////////////////////////////////////////// -void SdrHdlList::Timeout() -{ - for(sal_uInt32 a(0); a < maList.size(); a++) - { - maList[a]->CreateB2dIAObject(); - } -} - -void SdrHdlList::SdrHdlVisualisationChanged() -{ - SetTimeout(1); - Start(); -} - SdrHdlList::SdrHdlList(SdrMarkView& rV) : boost::noncopyable(), - Timer(), mnFocusIndex(CONTAINER_ENTRY_NOTFOUND), mrView(rV), maList(), @@ -1117,6 +1104,14 @@ SdrHdlList::~SdrHdlList() Clear(); } +void SdrHdlList::CreateVisualizations() +{ + for(sal_uInt32 a(0); a < maList.size(); a++) + { + maList[a]->CreateB2dIAObject(); + } +} + SdrHdl* SdrHdlList::GetHdlByIndex(sal_uInt32 nNum) const { if(nNum < maList.size()) diff --git a/svx/source/svdraw/svdmrkv.cxx b/svx/source/svdraw/svdmrkv.cxx index 32d08ac218b4..03999b7a9f3a 100644 --- a/svx/source/svdraw/svdmrkv.cxx +++ b/svx/source/svdraw/svdmrkv.cxx @@ -400,6 +400,30 @@ void SdrMarkView::BrkMarkObj() //////////////////////////////////////////////////////////////////////////////////////////////////// +sal_uInt32 SdrMarkView::GetHdlNum(SdrHdl* pHdl) const +{ + return GetHdlList().GetHdlNum(pHdl); +} + +SdrHdl* SdrMarkView::GetHdlByIndex(sal_uInt32 nHdlNum) const +{ + const SdrHdlList& rHdlList = GetHdlList(); + + if(nHdlNum < rHdlList.GetHdlCount()) + { + return rHdlList.GetHdlByIndex(nHdlNum); + } + + return 0; +} + +const SdrHdlList& SdrMarkView::GetHdlList() const +{ + return maViewHandleList; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// + bool SdrMarkView::BegMarkPoints(const basegfx::B2DPoint& rPnt, bool bUnmark) { if(HasMarkablePoints()) @@ -873,7 +897,7 @@ void SdrMarkView::SetMarkHandles() AddDragModeHdl(GetDragMode()); // add custom handles (used by other apps, e.g. AnchorPos) - AddCustomHdl(); + AddCustomHdl(maViewHandleList); // sort handles maViewHandleList.Sort(); @@ -896,9 +920,12 @@ void SdrMarkView::SetMarkHandles() } } } + + // create overlay objects + maViewHandleList.CreateVisualizations(); } -void SdrMarkView::AddCustomHdl() +void SdrMarkView::AddCustomHdl(SdrHdlList& /*rTarget*/) { // add custom handles (used by other apps, e.g. AnchorPos) } @@ -1039,7 +1066,9 @@ void SdrMarkView::AddDragModeHdl(SdrDragMode eMode) bool SdrMarkView::MouseMove(const MouseEvent& rMEvt, Window* pWin) { - if(maViewHandleList.GetHdlCount()) + const SdrHdlList& rHdlList = GetHdlList(); + + if(rHdlList.GetHdlCount()) { SdrHdl* pMouseOverHdl(0); @@ -1052,7 +1081,7 @@ bool SdrMarkView::MouseMove(const MouseEvent& rMEvt, Window* pWin) } // notify last mouse over handle that he lost the mouse - const sal_uInt32 nHdlCount(maViewHandleList.GetHdlCount()); + const sal_uInt32 nHdlCount(rHdlList.GetHdlCount()); for(sal_uInt32 nHdl(0); nHdl < nHdlCount; nHdl++) { @@ -1208,7 +1237,7 @@ void SdrMarkView::SetRef1(const basegfx::B2DPoint& rPt) if(SDRDRAG_ROTATE == GetDragMode() || SDRDRAG_MIRROR == GetDragMode()) { maRef1 = rPt; - SdrHdl* pH = maViewHandleList.GetHdlByKind(HDL_REF1); + SdrHdl* pH = GetHdlList().GetHdlByKind(HDL_REF1); if(pH) { @@ -1222,7 +1251,7 @@ void SdrMarkView::SetRef2(const basegfx::B2DPoint& rPt) if(SDRDRAG_MIRROR == GetDragMode()) { maRef2 = rPt; - SdrHdl* pH = maViewHandleList.GetHdlByKind(HDL_REF2); + SdrHdl* pH = GetHdlList().GetHdlByKind(HDL_REF2); if(pH) { @@ -1314,7 +1343,7 @@ bool SdrMarkView::IsMarkedObjHit(const basegfx::B2DPoint& rPnt, double fTol) con SdrHdl* SdrMarkView::PickHandle(const basegfx::B2DPoint& rPnt) const { - return maViewHandleList.IsHdlListHit(rPnt); + return GetHdlList().IsHdlListHit(rPnt); } bool SdrMarkView::MarkObj(const basegfx::B2DPoint& rPnt, double fTol, bool bToggle, bool bDeep) @@ -1602,11 +1631,17 @@ sal_uInt16 SdrMarkView::GetMarkHdlSizePixel() const return maViewHandleList.GetHdlSize()*2+1; } +bool SdrMarkView::IsSolidMarkHdl() const +{ + return maViewHandleList.IsFineHdl(); +} + void SdrMarkView::SetSolidMarkHdl(bool bOn) { if(bOn != maViewHandleList.IsFineHdl()) { maViewHandleList.SetFineHdl(bOn); + SetMarkHandles(); } } @@ -1617,6 +1652,7 @@ void SdrMarkView::SetMarkHdlSizePixel(sal_uInt16 nSiz) if (nSiz!=maViewHandleList.GetHdlSize()) { maViewHandleList.SetHdlSize(nSiz); + SetMarkHandles(); } } @@ -2146,6 +2182,7 @@ void SdrMarkView::handleSelectionChange() void SdrMarkView::SetMoveOutside(bool bOn) { maViewHandleList.SetMoveOutside(bOn); + SetMarkHandles(); } bool SdrMarkView::IsMoveOutside() const diff --git a/svx/source/svdraw/svdmrkv1.cxx b/svx/source/svdraw/svdmrkv1.cxx index d99e49321a43..cd0e7a902186 100644 --- a/svx/source/svdraw/svdmrkv1.cxx +++ b/svx/source/svdraw/svdmrkv1.cxx @@ -158,7 +158,7 @@ bool SdrMarkView::ImpMarkPoint(SdrHdl* pHdl, bool bUnmark) } setSelectedPointsForSelectedSdrObject(*pObj, aMarkedPoints); - pHdl->SetSelected(!bUnmark); + // pHdl->SetSelected(!bUnmark); TTTT: not needed, setSelectedPointsForSelectedSdrObject already triggers selection change and starts recreation return true; } @@ -175,7 +175,7 @@ bool SdrMarkView::MarkPoint(SdrHdl& rHdl, bool bUnmark) if(IsPointMarkable(rHdl) && rHdl.IsSelected() == bUnmark) { - const SdrObject* pObj=rHdl.GetObj(); + const SdrObject* pObj = rHdl.GetObj(); if(isSdrObjectSelected(*pObj)) { @@ -192,14 +192,15 @@ bool SdrMarkView::MarkPoint(SdrHdl& rHdl, bool bUnmark) void SdrMarkView::MarkPoints(const basegfx::B2DRange* pRange, bool bUnmark) { const SdrObject* pObj0 = 0; + const SdrHdlList& rHdlList = GetHdlList(); + const sal_uInt32 nHdlAnz(rHdlList.GetHdlCount()); maViewHandleList.Sort(); - const sal_uInt32 nHdlAnz(maViewHandleList.GetHdlCount()); for(sal_uInt32 nHdlNum(nHdlAnz); nHdlNum > 0;) { nHdlNum--; - SdrHdl* pHdl = maViewHandleList.GetHdlByIndex(nHdlNum); + SdrHdl* pHdl = rHdlList.GetHdlByIndex(nHdlNum); if(IsPointMarkable(*pHdl) && pHdl->IsSelected() == bUnmark) { @@ -234,11 +235,12 @@ void SdrMarkView::impCreatePointRanges() const { basegfx::B2DRange aNewMarkedPointRange; basegfx::B2DRange aNewMarkedGluePointRange; - const sal_uInt32 nCount(maViewHandleList.GetHdlCount()); + const SdrHdlList& rHdlList = GetHdlList(); + const sal_uInt32 nCount(rHdlList.GetHdlCount()); for(sal_uInt32 a(0); a < nCount; a++) - { - const SdrHdl* pHdl = maViewHandleList.GetHdlByIndex(a); + { + const SdrHdl* pHdl = rHdlList.GetHdlByIndex(a); const SdrHdlKind eKind(pHdl->GetKind()); if(HDL_POLY == eKind && pHdl->IsSelected()) @@ -515,11 +517,12 @@ bool SdrMarkView::UnmarkGluePoint(const SdrHdl& rHdl) SdrHdl* SdrMarkView::GetGluePointHdl(const SdrObject* pObj, sal_uInt32 nId) const { - const sal_uInt32 nHdlAnz(maViewHandleList.GetHdlCount()); + const SdrHdlList& rHdlList = GetHdlList(); + const sal_uInt32 nHdlAnz(rHdlList.GetHdlCount()); for(sal_uInt32 nHdlNum(0); nHdlNum < nHdlAnz; nHdlNum++) { - SdrHdl* pHdl = maViewHandleList.GetHdlByIndex(nHdlNum); + SdrHdl* pHdl = rHdlList.GetHdlByIndex(nHdlNum); if (pHdl->GetObj()==pObj && HDL_GLUE == pHdl->GetKind() && diff --git a/svx/source/svdraw/svdopath.cxx b/svx/source/svdraw/svdopath.cxx index 4085a0e13827..80efe9aaadfb 100644 --- a/svx/source/svdraw/svdopath.cxx +++ b/svx/source/svdraw/svdopath.cxx @@ -402,9 +402,8 @@ public: bool IsCreating() const { return mbCreating; } // get the polygon - basegfx::B2DPolyPolygon TakeObjectPolyPolygon(const SdrDragStat& rDrag) const; + basegfx::B2DPolyPolygon TakeObjectPolyPolygon(const SdrDragStat& rDrag, bool bAdaptToSdrPathObjType) const; basegfx::B2DPolyPolygon TakeDragPolyPolygon(const SdrDragStat& rDrag) const; - basegfx::B2DPolyPolygon getModifiedPolyPolygon() const { return aPathPolygon.getB2DPolyPolygon(); } }; ImpPathForDragAndCreate::ImpPathForDragAndCreate(const SdrPathObj& rSdrPathObject, SdrPathObjType ePathType, bool bFreehandMode) @@ -1208,6 +1207,13 @@ bool ImpPathForDragAndCreate::BegCreate(SdrDragStat& rDrag) bool ImpPathForDragAndCreate::MovCreate(SdrDragStat& rDrag) { ImpPathCreateUser* pU=(ImpPathCreateUser*)rDrag.GetUser(); + + if(!pU) + { + OSL_ENSURE(false, "MovCreate but no ImpPathCreateUser instance in pU, probably BegCreate call missing (!)"); + return false; + } + SdrView& rView = rDrag.GetSdrViewFromSdrDragStat(); XPolygon& rXPoly=aPathPolygon[aPathPolygon.Count()-1]; sal_uInt16 nActPoint=rXPoly.GetPointCount(); @@ -1321,6 +1327,13 @@ bool ImpPathForDragAndCreate::MovCreate(SdrDragStat& rDrag) bool ImpPathForDragAndCreate::EndCreate(SdrDragStat& rDrag, SdrCreateCmd eCmd) { ImpPathCreateUser* pU=(ImpPathCreateUser*)rDrag.GetUser(); + + if(!pU) + { + OSL_ENSURE(false, "EndCreate but no ImpPathCreateUser instance in pU, probably BegCreate call missing (!)"); + return false; + } + bool bRet(false); XPolygon& rXPoly=aPathPolygon[aPathPolygon.Count()-1]; sal_uInt16 nActPoint=rXPoly.GetPointCount()-1; @@ -1459,6 +1472,12 @@ bool ImpPathForDragAndCreate::BckCreate(SdrDragStat& rDrag) { ImpPathCreateUser* pU=(ImpPathCreateUser*)rDrag.GetUser(); + if(!pU) + { + OSL_ENSURE(false, "BckCreate but no ImpPathCreateUser instance in pU, probably BegCreate call missing (!)"); + return false; + } + if (aPathPolygon.Count()>0) { XPolygon& rXPoly=aPathPolygon[aPathPolygon.Count()-1]; @@ -1524,38 +1543,55 @@ void ImpPathForDragAndCreate::BrkCreate(SdrDragStat& rDrag) rDrag.SetUser(NULL); } -basegfx::B2DPolyPolygon ImpPathForDragAndCreate::TakeObjectPolyPolygon(const SdrDragStat& rDrag) const +basegfx::B2DPolyPolygon ImpPathForDragAndCreate::TakeObjectPolyPolygon(const SdrDragStat& rDrag, bool bAdaptToSdrPathObjType) const { basegfx::B2DPolyPolygon aRetval(aPathPolygon.getB2DPolyPolygon()); - ImpPathCreateUser* pU = (ImpPathCreateUser*)rDrag.GetUser(); - basegfx::B2DPolygon aNewPolygon(aRetval.count() ? aRetval.getB2DPolygon(aRetval.count() - 1L) : basegfx::B2DPolygon()); - if(pU->IsFormFlag() && aNewPolygon.count() > 1L) + if(aRetval.count()) { - // remove last segment and replace with current - // do not forget to rescue the previous control point which will be lost when - // the point it's associated with is removed - const sal_uInt32 nChangeIndex(aNewPolygon.count() - 2); - const basegfx::B2DPoint aSavedPrevCtrlPoint(aNewPolygon.getPrevControlPoint(nChangeIndex)); - - aNewPolygon.remove(nChangeIndex, 2L); - aNewPolygon.append(pU->GetFormPoly().getB2DPolygon()); + ImpPathCreateUser* pU = static_cast< ImpPathCreateUser* >(rDrag.GetUser()); - if(nChangeIndex < aNewPolygon.count()) + if(pU && pU->IsFormFlag()) { - // if really something was added, set the saved prev control point at the - // point where it belongs - aNewPolygon.setPrevControlPoint(nChangeIndex, aSavedPrevCtrlPoint); + basegfx::B2DPolygon aNewPolygon(aRetval.getB2DPolygon(aRetval.count() - 1)); + + if(aNewPolygon.count() > 1) + { + // remove last segment and replace with current + // do not forget to rescue the previous control point which will be lost when + // the point it's associated with is removed + const sal_uInt32 nChangeIndex(aNewPolygon.count() - 2); + const basegfx::B2DPoint aSavedPrevCtrlPoint(aNewPolygon.getPrevControlPoint(nChangeIndex)); + + aNewPolygon.remove(nChangeIndex, 2L); + aNewPolygon.append(pU->GetFormPoly().getB2DPolygon()); + + if(nChangeIndex < aNewPolygon.count()) + { + // if really something was added, set the saved prev control point at the + // point where it belongs + aNewPolygon.setPrevControlPoint(nChangeIndex, aSavedPrevCtrlPoint); + } + + aRetval.setB2DPolygon(aRetval.count() - 1, aNewPolygon); + } } - } - if(aRetval.count()) - { - aRetval.setB2DPolygon(aRetval.count() - 1L, aNewPolygon); - } - else - { - aRetval.append(aNewPolygon); + if(bAdaptToSdrPathObjType) + { + const bool bShouldBeClosed(isClosed()); + + for(sal_uInt32 a(0); a < aRetval.count(); a++) + { + if(aRetval.getB2DPolygon(a).isClosed() != bShouldBeClosed) + { + basegfx::B2DPolygon aCandidate(aRetval.getB2DPolygon(a)); + + aCandidate.setClosed(bShouldBeClosed); + aRetval.setB2DPolygon(a, aCandidate); + } + } + } } return aRetval; @@ -2164,7 +2200,7 @@ bool SdrPathObj::applySpecialDrag(SdrDragStat& rDrag) if(bRetval) { - setB2DPolyPolygonInObjectCoordinates(aDragAndCreate.getModifiedPolyPolygon()); + setB2DPolyPolygonInObjectCoordinates(aDragAndCreate.TakeObjectPolyPolygon(rDrag, false)); } return bRetval; @@ -2230,7 +2266,7 @@ bool SdrPathObj::EndCreate(SdrDragStat& rDrag, SdrCreateCmd eCmd) if(bRetval && mpDAC) { - setB2DPolyPolygonInObjectCoordinates(mpDAC->getModifiedPolyPolygon()); + setB2DPolyPolygonInObjectCoordinates(mpDAC->TakeObjectPolyPolygon(rDrag, true)); // #i75974# Check for AutoClose feature. Moved here from ImpPathForDragAndCreate::EndCreate // to be able to use the type-changing ImpSetClosed method @@ -2288,7 +2324,7 @@ basegfx::B2DPolyPolygon SdrPathObj::TakeCreatePoly(const SdrDragStat& rDrag) con if(mpDAC) { - aRetval = mpDAC->TakeObjectPolyPolygon(rDrag); + aRetval = mpDAC->TakeObjectPolyPolygon(rDrag, false); aRetval.append(mpDAC->TakeDragPolyPolygon(rDrag)); } @@ -2302,7 +2338,7 @@ basegfx::B2DPolyPolygon SdrPathObj::getObjectPolyPolygon(const SdrDragStat& rDra if(mpDAC) { - aRetval = mpDAC->TakeObjectPolyPolygon(rDrag); + aRetval = mpDAC->TakeObjectPolyPolygon(rDrag, true); } return aRetval; diff --git a/svx/source/svdraw/svdview.cxx b/svx/source/svdraw/svdview.cxx index 05e6aec69b62..abd31d7bcee5 100644 --- a/svx/source/svdraw/svdview.cxx +++ b/svx/source/svdraw/svdview.cxx @@ -1536,8 +1536,9 @@ Pointer SdrView::GetPreferedPointer(const basegfx::B2DPoint& rMousePos, const Ou { if(bCorner || bVertex || bMov) { - SdrHdl* pH1 = maViewHandleList.GetHdlByKind(HDL_REF1); - SdrHdl* pH2 = maViewHandleList.GetHdlByKind(HDL_REF2); + const SdrHdlList& rHdlList = GetHdlList(); + SdrHdl* pH1 = rHdlList.GetHdlByKind(HDL_REF1); + SdrHdl* pH2 = rHdlList.GetHdlByKind(HDL_REF2); bool b90(false); bool b45(false); basegfx::B2DPoint aDif(0.0, 0.0); diff --git a/sw/source/core/draw/dview.cxx b/sw/source/core/draw/dview.cxx index dae35d73de67..4983cc04e431 100644 --- a/sw/source/core/draw/dview.cxx +++ b/sw/source/core/draw/dview.cxx @@ -237,7 +237,7 @@ SdrObject* SwDrawView::CheckSingleSdrObjectHit(const basegfx::B2DPoint& rPnt, do /************************************************************************* |* -|* SwDrawView::AddCustomHdl() +|* SwDrawView::AddCustomHdl(SdrHdlList& rTarget) |* |* Gets called every time the handles need to be build |* @@ -246,7 +246,7 @@ SdrObject* SwDrawView::CheckSingleSdrObjectHit(const basegfx::B2DPoint& rPnt, do |* *************************************************************************/ -void SwDrawView::AddCustomHdl() +void SwDrawView::AddCustomHdl(SdrHdlList& rTarget) { SdrObject *pObj = getSelectedIfSingle(); @@ -288,7 +288,7 @@ void SwDrawView::AddCustomHdl() // add anchor handle: //Badaa: 2008-04-18 * Support for Classical Mongolian Script (SCMS) joint with Jiayanmin new SwSdrHdl( - maViewHandleList, + rTarget, *pObj, basegfx::B2DPoint(aPos.X(),aPos.Y()), ( pAnch->IsVertical() && !pAnch->IsVertLR() ) || pAnch->IsRightToLeft()); @@ -898,9 +898,9 @@ const SwFrm* SwDrawView::CalcAnchor() void SwDrawView::ShowDragAnchor() { - SdrHdl* pHdl = maViewHandleList.GetHdlByKind(HDL_ANCHOR); + SdrHdl* pHdl = GetHdlList().GetHdlByKind(HDL_ANCHOR); if ( ! pHdl ) - pHdl = maViewHandleList.GetHdlByKind(HDL_ANCHOR_TR); + pHdl = GetHdlList().GetHdlByKind(HDL_ANCHOR_TR); if(pHdl) { diff --git a/sw/source/core/inc/dview.hxx b/sw/source/core/inc/dview.hxx index 1a8be03420b6..59725841ad50 100644 --- a/sw/source/core/inc/dview.hxx +++ b/sw/source/core/inc/dview.hxx @@ -82,7 +82,7 @@ class SwDrawView : public FmFormView protected: // add custom handles (used by other apps, e.g. AnchorPos) - virtual void AddCustomHdl(); + virtual void AddCustomHdl(SdrHdlList& rTarget); // overloaded to allow extra handling when picking SwVirtFlyDrawObj's using FmFormView::CheckSingleSdrObjectHit; |