summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArmin Le Grand <alg@apache.org>2013-09-12 11:17:45 +0000
committerArmin Le Grand <alg@apache.org>2013-09-12 11:17:45 +0000
commitff6a9f07d740c9a15c4d498db4cec6b99b4c14b4 (patch)
tree8f4bcec9250534ea5f8838bf9daeeb8fa39647d2
parentbcb0630dd609dbf890558a719f77d3da44bcbcac (diff)
in-between work commit
-rw-r--r--chart2/source/controller/drawinglayer/DrawViewWrapper.cxx7
-rw-r--r--sc/source/ui/inc/drawview.hxx2
-rw-r--r--sc/source/ui/view/drawview.cxx4
-rw-r--r--sd/source/ui/func/fusel.cxx32
-rw-r--r--sd/source/ui/inc/View.hxx2
-rw-r--r--sd/source/ui/view/sdview.cxx4
-rw-r--r--sd/source/ui/view/sdview3.cxx11
-rw-r--r--svx/inc/svx/sdr/overlay/overlayobjectlist.hxx1
-rw-r--r--svx/inc/svx/svdhdl.hxx16
-rw-r--r--svx/inc/svx/svdmrkv.hxx32
-rw-r--r--svx/source/svdraw/sdrselection.cxx7
-rw-r--r--svx/source/svdraw/svddrgv.cxx4
-rw-r--r--svx/source/svdraw/svdedtv.cxx3
-rw-r--r--svx/source/svdraw/svdedxv.cxx14
-rw-r--r--svx/source/svdraw/svdhdl.cxx37
-rw-r--r--svx/source/svdraw/svdmrkv.cxx51
-rw-r--r--svx/source/svdraw/svdmrkv1.cxx21
-rw-r--r--svx/source/svdraw/svdopath.cxx96
-rw-r--r--svx/source/svdraw/svdview.cxx5
-rw-r--r--sw/source/core/draw/dview.cxx10
-rw-r--r--sw/source/core/inc/dview.hxx2
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;