summaryrefslogtreecommitdiff
path: root/svx/source/svdraw/svdedtv.cxx
diff options
context:
space:
mode:
authorRüdiger Timm <rt@openoffice.org>2003-04-24 13:48:25 +0000
committerRüdiger Timm <rt@openoffice.org>2003-04-24 13:48:25 +0000
commitcda3f63222cf8d41550983b6d2c850320c68a9c3 (patch)
tree608ff2c0cfcdc8867b2eb664c2dad1690ef6785c /svx/source/svdraw/svdedtv.cxx
parent1c5b973ed290add0e94169a58e52a927fb63bb29 (diff)
INTEGRATION: CWS draw9 (1.8.142); FILE MERGED
2003/04/09 13:38:35 aw 1.8.142.1: #i13033# New mechanism to search for necessary disconnections for changed connectors inside the transitive hull of all at the beginning of UNDO selected objects
Diffstat (limited to 'svx/source/svdraw/svdedtv.cxx')
-rw-r--r--svx/source/svdraw/svdedtv.cxx139
1 files changed, 65 insertions, 74 deletions
diff --git a/svx/source/svdraw/svdedtv.cxx b/svx/source/svdraw/svdedtv.cxx
index f647f9c2e296..b1ff7579fd8e 100644
--- a/svx/source/svdraw/svdedtv.cxx
+++ b/svx/source/svdraw/svdedtv.cxx
@@ -2,9 +2,9 @@
*
* $RCSfile: svdedtv.cxx,v $
*
- * $Revision: 1.8 $
+ * $Revision: 1.9 $
*
- * last change: $Author: aw $ $Date: 2002-12-09 15:53:33 $
+ * last change: $Author: rt $ $Date: 2003-04-24 14:48:25 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@@ -75,6 +75,11 @@
#include "svdstr.hrc" // Namen aus der Resource
#include "svdglob.hxx" // StringCache
+// #i13033#
+#ifndef _CLONELIST_HXX_
+#include <clonelist.hxx>
+#endif
+
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
//
@@ -325,29 +330,58 @@ void SdrEditView::MoveLayer(const XubString& rName, USHORT nNewPos)
void SdrEditView::EndUndo()
{
- pMod->EndUndo();
- if (pMod->GetUndoBracketLevel()==0) {
+ // #i13033#
+ // Comparison changed to 1L since EndUndo() is called later now
+ // and EndUndo WILL change count to count-1
+ if(1L == pMod->GetUndoBracketLevel())
+ {
ImpBroadcastEdgesOfMarkedNodes();
}
+
+ // #i13033#
+ // moved to bottom to still have access to UNDOs inside of
+ // ImpBroadcastEdgesOfMarkedNodes()
+ pMod->EndUndo();
}
void SdrEditView::ImpBroadcastEdgesOfMarkedNodes()
{
ForceEdgesOfMarkedNodes();
- ULONG nMarkedEdgeAnz=aMarkedEdges.GetMarkCount();
- USHORT i;
- for (i=0; i<nMarkedEdgeAnz; i++) {
- SdrMark* pEM=aMarkedEdges.GetMark(i);
- SdrObject* pEdgeTmp=pEM->GetObj();
- SdrEdgeObj* pEdge=PTR_CAST(SdrEdgeObj,pEdgeTmp);
- if (pEdge!=NULL && TRUE) {
- SdrObject* pObj1=pEdge->GetConnectedNode(FALSE);
- SdrObject* pObj2=pEdge->GetConnectedNode(TRUE);
- if (pObj1!=NULL && !IsObjMarked(pObj1) && !pEdge->CheckNodeConnection(FALSE)) pEdge->DisconnectFromNode(FALSE);
- if (pObj2!=NULL && !IsObjMarked(pObj2) && !pEdge->CheckNodeConnection(TRUE)) pEdge->DisconnectFromNode(TRUE);
+
+ // #i13033#
+ // New mechanism to search for necessary disconnections for
+ // changed connectors inside the transitive hull of all at
+ // the beginning of UNDO selected objects
+ for(sal_uInt32 a(0L); a < maAllMarkedObjects.Count(); a++)
+ {
+ SdrEdgeObj* pEdge = PTR_CAST(SdrEdgeObj, (SdrObject*)maAllMarkedObjects.GetObject(a));
+
+ if(pEdge)
+ {
+ SdrObject* pObj1 = pEdge->GetConnectedNode(sal_False);
+ SdrObject* pObj2 = pEdge->GetConnectedNode(sal_True);
+
+ if(pObj1
+ && LIST_ENTRY_NOTFOUND == maAllMarkedObjects.GetPos(pObj1)
+ && !pEdge->CheckNodeConnection(sal_False))
+ {
+ AddUndo(new SdrUndoGeoObj(*pEdge));
+ pEdge->DisconnectFromNode(sal_False);
+ }
+
+ if(pObj2
+ && LIST_ENTRY_NOTFOUND == maAllMarkedObjects.GetPos(pObj2)
+ && !pEdge->CheckNodeConnection(sal_True))
+ {
+ AddUndo(new SdrUndoGeoObj(*pEdge));
+ pEdge->DisconnectFromNode(sal_True);
+ }
}
}
- nMarkedEdgeAnz=aMarkedEdgesOfMarkedNodes.GetMarkCount();
+
+ ULONG nMarkedEdgeAnz=aMarkedEdgesOfMarkedNodes.GetMarkCount();
+ USHORT i;
+
for (i=0; i<nMarkedEdgeAnz; i++) {
SdrMark* pEM=aMarkedEdgesOfMarkedNodes.GetMark(i);
SdrObject* pEdgeTmp=pEM->GetObj();
@@ -740,7 +774,10 @@ void SdrEditView::CopyMarkedObj()
}
aSourceObjectsForCopy.ForceSort();
- SdrMarkList aCopiedObjects;
+ // #i13033#
+ // New mechanism to re-create the connections of cloned connectors
+ CloneList aCloneList;
+
aMark.Clear();
ULONG nCloneErrCnt=0;
ULONG nMarkAnz=aSourceObjectsForCopy.GetMarkCount();
@@ -754,7 +791,10 @@ void SdrEditView::CopyMarkedObj()
AddUndo(new SdrUndoCopyObj(*pO));
SdrMark aME(*pM);
aME.SetObj(pO);
- aCopiedObjects.InsertEntry(aME);
+
+ // aCopiedObjects.InsertEntry(aME);
+ aCloneList.AddPair(pM->GetObj(), pO);
+
if (pM->GetUser()==0) { // Sonst war's nur eine mitzukierende Edge
aMark.InsertEntry(aME);
}
@@ -762,62 +802,13 @@ void SdrEditView::CopyMarkedObj()
nCloneErrCnt++;
}
}
- // und nun zu den Konnektoren
- // Die Objekte der MarkList aCopiedObjects werden auf die MarkList
- // aSourceObjectsForCopy abgebildet und so die Objektverbindungen
- // hergestellt.
- // Aehnliche Implementation an folgenden Stellen:
- // void SdrObjList::CopyObjects(const SdrObjList& rSrcList)
- // SdrModel* SdrExchangeView::GetMarkedObjModel() const
- // BOOL SdrExchangeView::Paste(const SdrModel& rMod,...)
- // void SdrEditView::CopyMarkedObj()
- if (nCloneErrCnt==0) {
- for (nm=0; nm<nMarkAnz; nm++) {
- SdrMark* pM=aSourceObjectsForCopy.GetMark(nm);
- SdrObject* pO=pM->GetObj();
- SdrEdgeObj* pSrcEdge=PTR_CAST(SdrEdgeObj,pO);
- if (pSrcEdge!=NULL) {
- SdrObject* pSrcNode1=pSrcEdge->GetConnectedNode(TRUE);
- SdrObject* pSrcNode2=pSrcEdge->GetConnectedNode(FALSE);
- if (pSrcNode1!=NULL && pSrcNode1->GetObjList()!=pSrcEdge->GetObjList()) pSrcNode1=NULL; // Listenuebergreifend
- if (pSrcNode2!=NULL && pSrcNode2->GetObjList()!=pSrcEdge->GetObjList()) pSrcNode2=NULL; // ist (noch) nicht
- if (pSrcNode1!=NULL || pSrcNode2!=NULL) {
- SdrMark* pEdgeMark=aCopiedObjects.GetMark(nm);
- BOOL bMitkopiert=pEdgeMark->GetUser()!=0;
- SdrObject* pDstEdgeTmp=pEdgeMark->GetObj();
- SdrEdgeObj* pDstEdge=PTR_CAST(SdrEdgeObj,pDstEdgeTmp);
- if (pDstEdge!=NULL) {
- if (pSrcNode1!=NULL) {
- ULONG nDstNode1=aSourceObjectsForCopy.FindObject(pSrcNode1);
- SdrObject* pDstNode1=NULL;
- if (nDstNode1!=CONTAINER_ENTRY_NOTFOUND) {
- pDstNode1=aCopiedObjects.GetMark(nDstNode1)->GetObj();
- } else if (bMitkopiert) {
- pDstNode1=pSrcNode1; // an den SourceNode Connekten wenn Edge mitkopiert
- }
- if (pDstNode1!=NULL) { // Node war sonst wohl nicht markiert
- pDstEdge->ConnectToNode(TRUE,pDstNode1);
- }
- }
- if (pSrcNode2!=NULL) {
- ULONG nDstNode2=aSourceObjectsForCopy.FindObject(pSrcNode2);
- SdrObject* pDstNode2=NULL;
- if (nDstNode2!=CONTAINER_ENTRY_NOTFOUND) {
- pDstNode2=aCopiedObjects.GetMark(nDstNode2)->GetObj();
- } else if (bMitkopiert) {
- pDstNode2=pSrcNode2; // an den SourceNode Connekten wenn Edge mitkopiert
- }
- if (pDstNode2!=NULL) { // Node war sonst wohl nicht markiert
- pDstEdge->ConnectToNode(FALSE,pDstNode2);
- }
- }
- } else {
- DBG_ERROR("SdrEditView::CopyMarkedObj(): pDstEdge==NULL!");
- }
- }
- }
- }
- } else {
+
+ // #i13033#
+ // New mechanism to re-create the connections of cloned connectors
+ aCloneList.CopyConnections();
+
+ if(0L != nCloneErrCnt)
+ {
#ifdef DBG_UTIL
ByteString aStr("SdrEditView::CopyMarkedObj(): Fehler beim Clonen ");