summaryrefslogtreecommitdiff
path: root/svx/source/svdraw/svdcrtv.cxx
diff options
context:
space:
mode:
authorIvo Hinkelmann <ihi@openoffice.org>2006-11-14 12:39:39 +0000
committerIvo Hinkelmann <ihi@openoffice.org>2006-11-14 12:39:39 +0000
commit586c65f9225c1cbb1365b2d21d32927cb6779c19 (patch)
tree98267f46b753eb0a2918df27f397525924440b13 /svx/source/svdraw/svdcrtv.cxx
parent26e03be8aaa83a5eb12f87f253de715b7333106c (diff)
INTEGRATION: CWS aw024 (1.16.20); FILE MERGED
2006/11/13 14:36:11 aw 1.16.20.13: changes after resync 2006/10/27 12:14:09 aw 1.16.20.12: #i39528# ::basegfx -> basegfx adaption 2006/09/21 19:25:37 aw 1.16.20.11: RESYNC: (1.19-1.20); FILE MERGED 2006/07/07 16:03:15 aw 1.16.20.10: adaptions after resync SRC680m171->SRC680m174 2006/07/04 13:13:10 aw 1.16.20.9: RESYNC: (1.17-1.18); FILE MERGED 2006/06/27 13:16:15 aw 1.16.20.8: #114408# errors corrected, some extensions added 2005/09/18 05:00:31 aw 1.16.20.7: RESYNC: (1.16-1.17); FILE MERGED 2005/05/26 11:28:01 aw 1.16.20.6: #i39531# 2005/05/25 09:50:52 aw 1.16.20.5: #i39529# 2005/05/19 12:31:27 aw 1.16.20.4: #i39529# 2005/05/12 16:39:30 aw 1.16.20.3: #i39529# 2005/04/26 15:04:23 aw 1.16.20.2: #i39528# 2004/12/23 16:52:43 aw 1.16.20.1: #i39525
Diffstat (limited to 'svx/source/svdraw/svdcrtv.cxx')
-rw-r--r--svx/source/svdraw/svdcrtv.cxx1058
1 files changed, 386 insertions, 672 deletions
diff --git a/svx/source/svdraw/svdcrtv.cxx b/svx/source/svdraw/svdcrtv.cxx
index a8fe447c06f9..89244a5696e6 100644
--- a/svx/source/svdraw/svdcrtv.cxx
+++ b/svx/source/svdraw/svdcrtv.cxx
@@ -4,9 +4,9 @@
*
* $RCSfile: svdcrtv.cxx,v $
*
- * $Revision: 1.21 $
+ * $Revision: 1.22 $
*
- * last change: $Author: obo $ $Date: 2006-10-12 13:07:02 $
+ * last change: $Author: ihi $ $Date: 2006-11-14 13:39:39 $
*
* The Contents of this file are made available subject to
* the terms of GNU Lesser General Public License Version 2.1.
@@ -41,8 +41,6 @@
#include "svdxout.hxx"
#include "svdundo.hxx"
#include "svdocapt.hxx" // Spezialbehandlung: Nach dem Create transparente Fuellung
-#include "svdcrtmt.hxx"
-#include "svdvmark.hxx"
#include "svdoedge.hxx"
#include "svdpagv.hxx"
#include "svdpage.hxx"
@@ -66,79 +64,166 @@
#include <svx/sdr/contact/displayinfo.hxx>
#endif
+//#ifndef _SVX_FMGLOB_HXX
+//#include "fmglob.hxx"
+//#endif
+
+#ifndef _SVDOUNO_HXX
+#include "svdouno.hxx"
+#endif
+
#define XOR_CREATE_PEN PEN_SOLID
+#ifndef _SVDOPATH_HXX
+#include "svdopath.hxx"
+#endif
+
////////////////////////////////////////////////////////////////////////////////////////////////////
-class ImpSdrConnectMarker: public SdrViewUserMarker
+#ifndef _SDR_OVERLAY_OVERLAYPOLYPOLYGON_HXX
+#include <svx/sdr/overlay/overlaypolypolygon.hxx>
+#endif
+
+#ifndef _SDR_OVERLAY_OVERLAYMANAGER_HXX
+#include <svx/sdr/overlay/overlaymanager.hxx>
+#endif
+
+#ifndef _SDR_OVERLAY_OVERLAYSDROBJECT_HXX
+#include <svx/sdr/overlay/overlaysdrobject.hxx>
+#endif
+
+#ifndef _SDRPAINTWINDOW_HXX
+#include <sdrpaintwindow.hxx>
+#endif
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+class ImplConnectMarkerOverlay
{
- const SdrObject* pAktObj;
- const SdrPageView* pAktPV;
+ // The OverlayObjects
+ ::sdr::overlay::OverlayObjectList maObjects;
- virtual void Draw(OutputDevice* pOut, FASTBOOL bHiding, FASTBOOL bNoSaveDC);
+ // The remembered target object
+ const SdrObject& mrObject;
public:
- ImpSdrConnectMarker(SdrCreateView* _pView): SdrViewUserMarker(_pView),pAktObj(NULL),pAktPV(NULL) {}
- ~ImpSdrConnectMarker() {}
- void SetTargetObject(const SdrObject* pObj);
-}; // svdvmark
+ ImplConnectMarkerOverlay(const SdrCreateView& rView, SdrObject& rObject);
+ ~ImplConnectMarkerOverlay();
-void ImpSdrConnectMarker::Draw(OutputDevice* pOut, FASTBOOL bHiding, FASTBOOL bNoSaveDC)
-{
- SdrViewUserMarker::Draw(pOut,bHiding,bNoSaveDC);
+ const SdrObject& GetTargetObject() const { return mrObject; }
+};
- const SdrCreateView* pView2=(SdrCreateView*)GetView();
- const SdrObject* pObj=pAktObj;
- const SdrPageView* pPV=pAktPV;
+ImplConnectMarkerOverlay::ImplConnectMarkerOverlay(const SdrCreateView& rView, SdrObject& rObject)
+: mrObject(rObject)
+{
+ basegfx::B2DPolyPolygon aB2DPolyPolygon(rObject.TakeXorPoly(true));
- if (pObj!=NULL && pView2!=NULL && pOut!=NULL)
+ for(sal_uInt32 a(0L); a < rView.PaintWindowCount(); a++)
{
- RasterOp eRop0=pOut->GetRasterOp();
- BOOL bMap0=pOut->IsMapModeEnabled();
- pOut->SetRasterOp(ROP_INVERT);
+ SdrPaintWindow* pCandidate = rView.GetPaintWindow(a);
+ ::sdr::overlay::OverlayManager* pTargetOverlay = pCandidate->GetOverlayManager();
- Color aOldLineColor, aOldFillColor;
-
- if (!bNoSaveDC)
- {
- aOldLineColor = pOut->GetLineColor();
- aOldFillColor = pOut->GetFillColor();
- }
- Point aPvOfs; if (pPV!=NULL) aPvOfs=pPV->GetOffset();
- if (pView2->IsAutoVertexConnectors())
+ if(pTargetOverlay)
{
- for (USHORT i=0; i<4; i++) {
- SdrGluePoint aGluePoint(pObj->GetVertexGluePoint(i));
- aGluePoint.Draw(*pOut,pObj);
+ Size aHalfLogicSize(pTargetOverlay->getOutputDevice().PixelToLogic(Size(4, 4)));
+
+ // object
+ ::sdr::overlay::OverlayPolyPolygonStriped* pNew = new ::sdr::overlay::OverlayPolyPolygonStriped(aB2DPolyPolygon);
+ pTargetOverlay->add(*pNew);
+ maObjects.append(*pNew);
+
+ // gluepoints
+ if(rView.IsAutoVertexConnectors())
+ {
+ for(sal_uInt16 i(0); i < 4; i++)
+ {
+ SdrGluePoint aGluePoint(rObject.GetVertexGluePoint(i));
+ const Point& rPosition = aGluePoint.GetAbsolutePos(rObject);
+
+ basegfx::B2DPoint aTopLeft(rPosition.X() - aHalfLogicSize.Width(), rPosition.Y() - aHalfLogicSize.Height());
+ basegfx::B2DPoint aBottomRight(rPosition.X() + aHalfLogicSize.Width(), rPosition.Y() + aHalfLogicSize.Height());
+
+ basegfx::B2DPolygon aTempPoly;
+ aTempPoly.append(aTopLeft);
+ aTempPoly.append(basegfx::B2DPoint(aBottomRight.getX(), aTopLeft.getY()));
+ aTempPoly.append(aBottomRight);
+ aTempPoly.append(basegfx::B2DPoint(aTopLeft.getX(), aBottomRight.getY()));
+ aTempPoly.setClosed(true);
+
+ basegfx::B2DPolyPolygon aTempPolyPoly;
+ aTempPolyPoly.append(aTempPoly);
+
+ pNew = new ::sdr::overlay::OverlayPolyPolygonStriped(aTempPolyPoly);
+ pTargetOverlay->add(*pNew);
+ maObjects.append(*pNew);
+ }
}
}
- if (pView2->IsAutoCornerConnectors())
+ }
+}
+
+ImplConnectMarkerOverlay::~ImplConnectMarkerOverlay()
+{
+ // The OverlayObjects are cleared using the destructor of OverlayObjectList.
+ // That destructor calls clear() at the list which removes all objects from the
+ // OverlayManager and deletes them.
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+class ImpSdrCreateViewExtraData
+{
+ // The OverlayObjects for XOR replacement
+ ::sdr::overlay::OverlayObjectList maObjects;
+
+public:
+ ImpSdrCreateViewExtraData();
+ ~ImpSdrCreateViewExtraData();
+
+ void CreateAndShowOverlay(const SdrCreateView& rView, const SdrObject* pObject, const basegfx::B2DPolyPolygon& rPolyPoly);
+ void HideOverlay();
+};
+
+ImpSdrCreateViewExtraData::ImpSdrCreateViewExtraData()
+{
+}
+
+ImpSdrCreateViewExtraData::~ImpSdrCreateViewExtraData()
+{
+ HideOverlay();
+}
+
+void ImpSdrCreateViewExtraData::CreateAndShowOverlay(const SdrCreateView& rView, const SdrObject* pObject, const basegfx::B2DPolyPolygon& rPolyPoly)
+{
+ for(sal_uInt32 a(0L); a < rView.PaintWindowCount(); a++)
+ {
+ SdrPaintWindow* pCandidate = rView.GetPaintWindow(a);
+ ::sdr::overlay::OverlayManager* pOverlayManager = pCandidate->GetOverlayManager();
+
+ if(pOverlayManager)
{
- for (USHORT i=0; i<4; i++)
+ if(pObject)
{
- SdrGluePoint aGluePoint(pObj->GetVertexGluePoint(i));
- aGluePoint.Draw(*pOut,pObj);
+ ::sdr::overlay::OverlaySdrObject* pNew = new ::sdr::overlay::OverlaySdrObject(basegfx::B2DPoint(), *pObject);
+ pOverlayManager->add(*pNew);
+ maObjects.append(*pNew);
+ }
+
+ if(rPolyPoly.count())
+ {
+ ::sdr::overlay::OverlayPolyPolygonStriped* pNew = new ::sdr::overlay::OverlayPolyPolygonStriped(rPolyPoly);
+ pOverlayManager->add(*pNew);
+ maObjects.append(*pNew);
}
}
- if (!bNoSaveDC)
- {
- pOut->SetLineColor( aOldLineColor );
- if ( aOldFillColor != pOut->GetFillColor() )
- pOut->SetFillColor( aOldFillColor );
- }
- pOut->SetRasterOp(eRop0);
- pOut->EnableMapMode(bMap0);
}
}
-void ImpSdrConnectMarker::SetTargetObject(const SdrObject* pObj)
+void ImpSdrCreateViewExtraData::HideOverlay()
{
- if (pAktObj!=pObj) {
- bool bVisible2=IsVisible();
- if (bVisible2) Hide();
- pAktObj=pObj;
- if (bVisible2) Show();
- }
+ // the clear() call at the list removes all objects from the
+ // OverlayManager and deletes them.
+ maObjects.clear();
}
////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -155,15 +240,19 @@ void ImpSdrConnectMarker::SetTargetObject(const SdrObject* pObj)
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
+void SdrCreateView::ImpClearConnectMarker()
+{
+ if(mpCoMaOverlay)
+ {
+ delete mpCoMaOverlay;
+ mpCoMaOverlay = 0L;
+ }
+}
+
void SdrCreateView::ImpClearVars()
{
nAktInvent=SdrInventor;
nAktIdent=OBJ_NONE;
- pCurrentLibObj=NULL;
- bCurrentLibObjMoveNoResize=FALSE;
- bCurrentLibObjSetDefAttr=FALSE;
- bCurrentLibObjSetDefLayer=FALSE;
- pLibObjDragMeth=NULL;
pAktCreate=NULL;
pCreatePV=NULL;
bAutoTextEdit=FALSE;
@@ -174,27 +263,17 @@ void SdrCreateView::ImpClearVars()
nAutoCloseDistPix=5;
nFreeHandMinDistPix=10;
- pConnectMarker=new ImpSdrConnectMarker(this);
- pConnectMarker->SetLineWidth(2);
- pConnectMarker->SetAnimateDelay(500);
- pConnectMarker->SetAnimateCount(3);
- pConnectMarker->SetAnimateSpeed(100);
- pConnectMarker->SetAnimateToggle(TRUE);
+ ImpClearConnectMarker();
}
void SdrCreateView::ImpMakeCreateAttr()
{
}
-SdrCreateView::SdrCreateView(SdrModel* pModel1, OutputDevice* pOut):
- SdrDragView(pModel1,pOut)
-{
- ImpClearVars();
- ImpMakeCreateAttr();
-}
-
-SdrCreateView::SdrCreateView(SdrModel* pModel1, XOutputDevice* _pXOut):
- SdrDragView(pModel1,_pXOut)
+SdrCreateView::SdrCreateView(SdrModel* pModel1, OutputDevice* pOut)
+: SdrDragView(pModel1,pOut),
+ mpCoMaOverlay(0L),
+ mpCreateViewExtraData(new ImpSdrCreateViewExtraData())
{
ImpClearVars();
ImpMakeCreateAttr();
@@ -202,8 +281,8 @@ SdrCreateView::SdrCreateView(SdrModel* pModel1, XOutputDevice* _pXOut):
SdrCreateView::~SdrCreateView()
{
- delete pConnectMarker;
- delete pCurrentLibObj;
+ ImpClearConnectMarker();
+ delete mpCreateViewExtraData;
delete pAktCreate;
}
@@ -254,14 +333,6 @@ void SdrCreateView::TakeActionRect(Rectangle& rRect) const
}
}
-void SdrCreateView::ToggleShownXor(OutputDevice* pOut, const Region* pRegion) const
-{
- SdrDragView::ToggleShownXor(pOut,pRegion);
- if (pAktCreate!=NULL && aDragStat.IsShown()) {
- DrawCreateObj(pOut,TRUE);
- }
-}
-
BOOL SdrCreateView::CheckEdgeMode()
{
UINT32 nInv=nAktInvent;
@@ -272,68 +343,59 @@ BOOL SdrCreateView::CheckEdgeMode()
// wird vom EdgeObj gemanaged
if (nAktInvent==SdrInventor && nAktIdent==OBJ_EDGE) return FALSE;
}
- if (!IsCreateMode() || nAktInvent!=SdrInventor || nAktIdent!=OBJ_EDGE || pCurrentLibObj!=NULL) {
- if (pConnectMarker->IsVisible()) pConnectMarker->Hide();
- pConnectMarker->SetTargetObject(NULL);
+
+ if (!IsCreateMode() || nAktInvent!=SdrInventor || nAktIdent!=OBJ_EDGE)
+ {
+ ImpClearConnectMarker();
return FALSE;
- } else {
+ }
+ else
+ {
// TRUE heisst: MouseMove soll Connect checken
return !IsAction();
}
}
-void SdrCreateView::SetConnectMarker(const SdrObjConnection& rCon, const SdrPageView& rPV)
+void SdrCreateView::SetConnectMarker(const SdrObjConnection& rCon, const SdrPageView& /*rPV*/)
{
- if (rCon.pObj!=NULL) {
- Rectangle aNewRect;
- USHORT nNewDist=0;
- if (rCon.bBestConn || rCon.bBestVertex) {
- aNewRect=rCon.pObj->GetCurrentBoundRect();
- nNewDist=2;
- } else {
- nNewDist=aHdl.GetHdlSize()+2;
- SdrGluePoint aGP;
- rCon.TakeGluePoint(aGP,TRUE);
- Point aPt(aGP.GetPos());
- aNewRect=Rectangle(aPt,aPt);
+ SdrObject* pTargetObject = rCon.pObj;
+
+ if(pTargetObject)
+ {
+ // if target object changes, throw away overlay object to make room for changes
+ if(mpCoMaOverlay && pTargetObject != &mpCoMaOverlay->GetTargetObject())
+ {
+ ImpClearConnectMarker();
}
- Point aPvOfs(rPV.GetOffset());
- aNewRect.Move(aPvOfs.X(),aPvOfs.Y());
- if (!pConnectMarker->IsVisible() ||
- pConnectMarker->GetRectangle()==NULL ||
- *pConnectMarker->GetRectangle()!=aNewRect ||
- pConnectMarker->GetPixelDistance()!=nNewDist)
+
+ if(!mpCoMaOverlay)
{
- pConnectMarker->Hide();
- pConnectMarker->SetRectangle(aNewRect);
- pConnectMarker->SetPixelDistance(nNewDist);
- pConnectMarker->SetAnimate(TRUE);
- pConnectMarker->SetTargetObject(rCon.pObj);
- pConnectMarker->Show();
+ mpCoMaOverlay = new ImplConnectMarkerOverlay(*this, *pTargetObject);
}
- } else {
- HideConnectMarker();
+ }
+ else
+ {
+ ImpClearConnectMarker();
}
}
void SdrCreateView::HideConnectMarker()
{
- pConnectMarker->Hide();
- pConnectMarker->SetTargetObject(NULL);
- pConnectMarker->SetAnimate(FALSE);
+ ImpClearConnectMarker();
}
BOOL SdrCreateView::MouseMove(const MouseEvent& rMEvt, Window* pWin)
{
- if (CheckEdgeMode() && pWin!=NULL) {
- Point aPos(pWin->PixelToLogic(rMEvt.GetPosPixel()));
- SdrPageView* pPV=GetPageView(aPos);
- if (pPV!=NULL) {
+ if(CheckEdgeMode() && pWin)
+ {
+ SdrPageView* pPV = GetSdrPageView();
+
+ if(pPV)
+ {
// Defaultete Hit-Toleranz bei IsMarkedHit() mal aendern !!!!
- BOOL bMarkHit=HitHandle(aPos,*pWin)!=NULL || IsMarkedObjHit(aPos);
+ Point aPos(pWin->PixelToLogic(rMEvt.GetPosPixel()));
+ BOOL bMarkHit=PickHandle(aPos)!=NULL || IsMarkedObjHit(aPos);
SdrObjConnection aCon;
- Point aPvOfs(pPV->GetOffset());
- aPos-=aPvOfs;
if (!bMarkHit) SdrEdgeObj::ImpFindConnector(aPos,*pPV,aCon,NULL,pWin);
SetConnectMarker(aCon,*pPV);
}
@@ -343,25 +405,21 @@ BOOL SdrCreateView::MouseMove(const MouseEvent& rMEvt, Window* pWin)
BOOL SdrCreateView::IsTextTool() const
{
- return eEditMode==SDREDITMODE_CREATE && pCurrentLibObj==NULL && nAktInvent==SdrInventor && (nAktIdent==OBJ_TEXT || nAktIdent==OBJ_TEXTEXT || nAktIdent==OBJ_TITLETEXT || nAktIdent==OBJ_OUTLINETEXT);
+ return eEditMode==SDREDITMODE_CREATE && nAktInvent==SdrInventor && (nAktIdent==OBJ_TEXT || nAktIdent==OBJ_TEXTEXT || nAktIdent==OBJ_TITLETEXT || nAktIdent==OBJ_OUTLINETEXT);
}
BOOL SdrCreateView::IsEdgeTool() const
{
- return eEditMode==SDREDITMODE_CREATE && pCurrentLibObj==NULL && nAktInvent==SdrInventor && (nAktIdent==OBJ_EDGE);
+ return eEditMode==SDREDITMODE_CREATE && nAktInvent==SdrInventor && (nAktIdent==OBJ_EDGE);
}
BOOL SdrCreateView::IsMeasureTool() const
{
- return eEditMode==SDREDITMODE_CREATE && pCurrentLibObj==NULL && nAktInvent==SdrInventor && (nAktIdent==OBJ_MEASURE);
+ return eEditMode==SDREDITMODE_CREATE && nAktInvent==SdrInventor && (nAktIdent==OBJ_MEASURE);
}
void SdrCreateView::SetCurrentObj(UINT16 nIdent, UINT32 nInvent)
{
- if (pCurrentLibObj!=NULL) {
- delete pCurrentLibObj;
- pCurrentLibObj=NULL;
- }
if (nAktInvent!=nInvent || nAktIdent!=nIdent) {
nAktInvent=nInvent;
nAktIdent=nIdent;
@@ -393,37 +451,25 @@ void SdrCreateView::SetCurrentObj(UINT16 nIdent, UINT32 nInvent)
ImpSetGlueVisible3(IsEdgeTool());
}
-void SdrCreateView::SetCurrentLibObj(SdrObject* pObj, BOOL bMoveNoResize, BOOL bSetDefAttr, BOOL bSetDefLayer)
-{
- if (pCurrentLibObj!=NULL && pObj!=pCurrentLibObj) delete pCurrentLibObj;
- pCurrentLibObj=pObj;
- bCurrentLibObjMoveNoResize=bMoveNoResize;
- bCurrentLibObjSetDefAttr=bSetDefAttr;
- bCurrentLibObjSetDefLayer=bSetDefLayer;
- if (pCurrentLibObj!=NULL) {
- pCurrentLibObj->SetModel(pMod);
- }
- aAktCreatePointer=Pointer(POINTER_CROSS);
- nAktInvent=SdrInventor;
- nAktIdent=OBJ_NONE;
- pConnectMarker->Hide();
- ImpSetGlueVisible3(FALSE);
-}
-
BOOL SdrCreateView::ImpBegCreateObj(UINT32 nInvent, UINT16 nIdent, const Point& rPnt, OutputDevice* pOut,
- short nMinMov, SdrPageView* pPV, const Rectangle& rLogRect)
+ short nMinMov, SdrPageView* pPV, const Rectangle& rLogRect, SdrObject* pPreparedFactoryObject)
{
BOOL bRet=FALSE;
- SetSolidDraggingNow(IsSolidDragging());
- SetSolidDraggingCheck(FALSE);
UnmarkAllObj();
BrkAction();
- pConnectMarker->Hide();
- DBG_ASSERT(pLibObjDragMeth==NULL,"SdrCreateView::ImpBegCreateObj(): pLibObjDragMeth!=NULL");
- pLibObjDragMeth=NULL;
- if (pPV!=NULL) pCreatePV=pPV;
- else pCreatePV=GetPageView(rPnt);
- if (pCreatePV!=NULL) { // ansonsten keine Seite angemeldet!
+
+ ImpClearConnectMarker();
+
+ if (pPV!=NULL)
+ {
+ pCreatePV=pPV;
+ }
+ else
+ {
+ pCreatePV = GetSdrPageView();
+ }
+ if (pCreatePV!=NULL)
+ { // ansonsten keine Seite angemeldet!
String aLay(aAktLayer);
if(nInvent == SdrInventor && nIdent == OBJ_MEASURE && aMeasureLayer.Len())
@@ -433,9 +479,27 @@ BOOL SdrCreateView::ImpBegCreateObj(UINT32 nInvent, UINT16 nIdent, const Point&
SdrLayerID nLayer=pCreatePV->GetPage()->GetLayerAdmin().GetLayerID(aLay,TRUE);
if (nLayer==SDRLAYER_NOTFOUND) nLayer=0;
- if (!pCreatePV->GetLockedLayers().IsSet(nLayer) && pCreatePV->GetVisibleLayers().IsSet(nLayer)) {
- pAktCreate=SdrObjFactory::MakeNewObject(nInvent,nIdent,pCreatePV->GetPage(),pMod);
- Point aPnt(rPnt-pCreatePV->GetOffset());
+ if (!pCreatePV->GetLockedLayers().IsSet(nLayer) && pCreatePV->GetVisibleLayers().IsSet(nLayer))
+ {
+ if(pPreparedFactoryObject)
+ {
+ pAktCreate = pPreparedFactoryObject;
+
+ if(pCreatePV->GetPage())
+ {
+ pAktCreate->SetPage(pCreatePV->GetPage());
+ }
+ else if (pMod)
+ {
+ pAktCreate->SetModel(pMod);
+ }
+ }
+ else
+ {
+ pAktCreate = SdrObjFactory::MakeNewObject(nInvent, nIdent, pCreatePV->GetPage(), pMod);
+ }
+
+ Point aPnt(rPnt);
if (nAktInvent!=SdrInventor || (nAktIdent!=USHORT(OBJ_EDGE) &&
nAktIdent!=USHORT(OBJ_FREELINE) &&
nAktIdent!=USHORT(OBJ_FREEFILL) )) { // Kein Fang fuer Edge und Freihand!
@@ -512,7 +576,7 @@ BOOL SdrCreateView::ImpBegCreateObj(UINT32 nInvent, UINT16 nIdent, const Point&
aDragStat.SetMinMove(ImpGetMinMovLogic(nMinMov,pOut));
pDragWin=pOut;
if (pAktCreate->BegCreate(aDragStat)) {
- ShowCreateObj(pOut,TRUE);
+ ShowCreateObj(/*pOut,TRUE*/);
bRet=TRUE;
} else {
delete pAktCreate;
@@ -527,115 +591,34 @@ BOOL SdrCreateView::ImpBegCreateObj(UINT32 nInvent, UINT16 nIdent, const Point&
BOOL SdrCreateView::BegCreateObj(const Point& rPnt, OutputDevice* pOut, short nMinMov, SdrPageView* pPV)
{
- if ( !pCurrentLibObj )
- return ImpBegCreateObj(nAktInvent,nAktIdent,rPnt,pOut,nMinMov,pPV,Rectangle());
- else
- return BegCreateLibObj(rPnt,pCurrentLibObj->Clone(),bCurrentLibObjMoveNoResize,
- bCurrentLibObjSetDefAttr,bCurrentLibObjSetDefLayer,pOut,nMinMov,pPV);
+ return ImpBegCreateObj(nAktInvent,nAktIdent,rPnt,pOut,nMinMov,pPV,Rectangle(), 0L);
}
-BOOL SdrCreateView::BegCreateCaptionObj(const Point& rPnt, const Size& rObjSiz,
- OutputDevice* pOut, short nMinMov, SdrPageView* pPV)
+sal_Bool SdrCreateView::BegCreatePreparedObject(const Point& rPnt, sal_Int16 nMinMov, SdrObject* pPreparedFactoryObject)
{
- return ImpBegCreateObj(SdrInventor,OBJ_CAPTION,rPnt,pOut,nMinMov,pPV,
- Rectangle(rPnt,Size(rObjSiz.Width()+1,rObjSiz.Height()+1)));
+ sal_uInt32 nInvent(nAktInvent);
+ sal_uInt16 nIdent(nAktIdent);
+
+ if(pPreparedFactoryObject)
+ {
+ nInvent = pPreparedFactoryObject->GetObjInventor();
+ nIdent = pPreparedFactoryObject->GetObjIdentifier();
+ }
+
+ return ImpBegCreateObj(nInvent, nIdent, rPnt, 0L, nMinMov, 0L, Rectangle(), pPreparedFactoryObject);
}
-BOOL SdrCreateView::BegCreateLibObj(const Point& rPnt, SdrObject* pObj, BOOL bMoveNoResize,
- BOOL bSetDefAttr, BOOL bSetDefLayer,
+BOOL SdrCreateView::BegCreateCaptionObj(const Point& rPnt, const Size& rObjSiz,
OutputDevice* pOut, short nMinMov, SdrPageView* pPV)
{
- SetSolidDraggingNow(FALSE); // noch kein SolidDragging bei LibObjs
- bool bRet=false;
- UnmarkAllObj();
- BrkAction();
- pConnectMarker->Hide();
- DBG_ASSERT(pLibObjDragMeth==NULL,"SdrCreateView::BegCreateLibObj(): pLibObjDragMeth!=NULL");
- pLibObjDragMeth=NULL;
- if (pPV!=NULL) pCreatePV=pPV;
- else pCreatePV=GetPageView(rPnt);
- if (pObj!=NULL && pCreatePV!=NULL) {
- bRet=TRUE;
- pObj->SetModel(pMod);
- if (bSetDefAttr) {
- if (pDefaultStyleSheet!=NULL) pObj->NbcSetStyleSheet(pDefaultStyleSheet, sal_False);
-
- pObj->SetMergedItemSet(aDefaultAttr);
- }
- if (bSetDefLayer) {
- SdrLayerID nLayer=pCreatePV->GetPage()->GetLayerAdmin().GetLayerID(aAktLayer,TRUE);
- if (nLayer==SDRLAYER_NOTFOUND) nLayer=0;
- if (pCreatePV->GetLockedLayers().IsSet(nLayer) || !pCreatePV->GetVisibleLayers().IsSet(nLayer)) {
- bRet=FALSE; // Layer gesperrt oder nicht sichtbar!
- }
- }
- if (bRet) {
- pAktCreate=pObj;
- Point aPnt(rPnt-pCreatePV->GetOffset());
- aPnt=GetSnapPos(aPnt,pCreatePV);
-
- // #90129# make sure drag start point is inside WorkArea
- const Rectangle& rWorkArea = ((SdrDragView*)this)->GetWorkArea();
-
- if(!rWorkArea.IsEmpty())
- {
- if(aPnt.X() < rWorkArea.Left())
- {
- aPnt.X() = rWorkArea.Left();
- }
-
- if(aPnt.X() > rWorkArea.Right())
- {
- aPnt.X() = rWorkArea.Right();
- }
-
- if(aPnt.Y() < rWorkArea.Top())
- {
- aPnt.Y() = rWorkArea.Top();
- }
-
- if(aPnt.Y() > rWorkArea.Bottom())
- {
- aPnt.Y() = rWorkArea.Bottom();
- }
- }
-
- aDragStat.Reset(aPnt);
- aDragStat.SetView((SdrView*)this);
- aDragStat.SetPageView(pCreatePV);
- aDragStat.SetMinMove(ImpGetMinMovLogic(nMinMov,pOut));
- pDragWin=pOut;
- if (bMoveNoResize) {
- pLibObjDragMeth=new ImpSdrCreateLibObjMove(*this);
- } else {
- pLibObjDragMeth=new ImpSdrCreateLibObjResize(*this);
- }
- bRet=pLibObjDragMeth->Beg();
- }
- }
- if (!bRet) {
- if (pObj!=NULL) delete pObj;
- if (pLibObjDragMeth!=NULL) { delete pLibObjDragMeth; pLibObjDragMeth=NULL; }
- pAktCreate=NULL;
- pCreatePV=NULL;
- }
- return bRet;
+ return ImpBegCreateObj(SdrInventor,OBJ_CAPTION,rPnt,pOut,nMinMov,pPV,
+ Rectangle(rPnt,Size(rObjSiz.Width()+1,rObjSiz.Height()+1)), 0L);
}
void SdrCreateView::MovCreateObj(const Point& rPnt)
{
if (pAktCreate!=NULL) {
- if (IsSolidDraggingNow() && !IsSolidDraggingCheck()) {
- // Z.B. fuer Fill+Linelose Textrahmen bei SolidDragging
- SetSolidDraggingCheck(TRUE);
- const SfxItemSet& rSet = pAktCreate->GetMergedItemSet();
- XFillStyle eFill=((XFillStyleItem&)(rSet.Get(XATTR_FILLSTYLE))).GetValue();
- XLineStyle eLine=((XLineStyleItem&)(rSet.Get(XATTR_LINESTYLE))).GetValue();
- if (eLine==XLINE_NONE && eFill==XFILL_NONE) {
- SetSolidDraggingNow(FALSE);
- }
- }
- Point aPnt(rPnt-pCreatePV->GetOffset());
+ Point aPnt(rPnt);
if (!aDragStat.IsNoSnap()) {
aPnt=GetSnapPos(aPnt,pCreatePV);
}
@@ -646,7 +629,7 @@ void SdrCreateView::MovCreateObj(const Point& rPnt)
// #77734# If the drag point was limited and Ortho is active, do
// the small ortho correction (reduction) -> last parameter to FALSE.
- sal_Bool bDidLimit(ImpLimitToWorkArea(aPnt,pCreatePV));
+ sal_Bool bDidLimit(ImpLimitToWorkArea(aPnt));
if(bDidLimit && IsOrtho())
{
if(aDragStat.IsOrtho8Possible())
@@ -656,114 +639,16 @@ void SdrCreateView::MovCreateObj(const Point& rPnt)
}
if (aPnt==aDragStat.GetNow()) return;
- if (pLibObjDragMeth==NULL) {
- bool bMerk=aDragStat.IsMinMoved();
- if (aDragStat.CheckMinMoved(aPnt)) {
- Rectangle aBound;
- if (IsSolidDraggingNow()) aBound=pAktCreate->GetCurrentBoundRect();
- XPolyPolygon aXPP1;
- if (!bMerk) aDragStat.NextPoint();
- aDragStat.NextMove(aPnt);
- pAktCreate->MovCreate(aDragStat);
- pAktCreate->TakeCreatePoly(aDragStat,aXPP1);
- XPolyPolygon aXPP2(aXPP1); // kopieren, weil wird in DrawCreateDiff geaendert
- if (!IsSolidDraggingNow()) {
- DrawCreateObjDiff(pCreatePV->DragPoly(),aXPP1);
- }
- pCreatePV->DragPoly()=aXPP2;
- if (IsSolidDraggingNow()) {
- aBound.Union(pAktCreate->GetCurrentBoundRect());
- // #116425#
- // Do not add the in-creation object, this would cause a RePaint
- //
- //SdrObjList* pOL=pCreatePV->GetObjList();
- //SdrInsertReason aReason(SDRREASON_VIEWCALL);
- //pOL->NbcInsertObject(pAktCreate,CONTAINER_APPEND,&aReason);
-
- Point aPvOfs(pCreatePV->GetOffset());
- USHORT nAnz=pDragWin==NULL ? GetWinCount() : 1;
- for (USHORT i=0; i<nAnz; i++) {
- USHORT nWinNum=SDRVIEWWIN_NOTFOUND;
- OutputDevice* pOut=pDragWin;
- if (pOut==NULL) {
- nWinNum=i;
- pOut=GetWin(nWinNum);
- } else {
- nWinNum=aWinList.Find(pOut);
- }
-
- // #116425#
- // Do not do a complete RePaint into a VDev
- //
- //VirtualDevice aVDev(*pOut);
- //Size a2Pix(pOut->PixelToLogic(Size(2,2)));
- //MapMode aMap(pOut->GetMapMode());
- //aVDev.SetMapMode(aMap);
- //
- // #109585#
- //Color aMixedColor = pCreatePV->GetApplicationBackgroundColor();
- //
- //aVDev.SetBackground( Wallpaper( aMixedColor ) );
- //aVDev.SetOutputSize(pOut->GetOutputSize());
- Rectangle aDirtyArea(aBound);
- aDirtyArea.Move(aPvOfs.X(),aPvOfs.Y());
- //CompleteRedraw(&aVDev,aDirtyArea);
-
- // #116425#
- // Do direct paint of dirty area
- CompleteRedraw(pOut, aDirtyArea);
-
- // #116425#
- // paint in-creation object over it using a ObjectContactOfObjListPainter
- {
- sdr::contact::SdrObjectVector aObjectVector;
- aObjectVector.push_back(pAktCreate);
-
- sdr::contact::ObjectContactOfObjListPainter aPainter(aObjectVector);
- sdr::contact::DisplayInfo aDisplayInfo;
- XOutputDevice aExtOut(pOut);
- SdrPaintInfoRec aInfoRec;
-
- aDisplayInfo.SetExtendedOutputDevice(&aExtOut);
- aDisplayInfo.SetPaintInfoRec(&aInfoRec);
- aDisplayInfo.SetOutputDevice(pOut);
-
- // keep draw hierarchy up-to-date
- aPainter.PreProcessDisplay(aDisplayInfo);
-
- // do processing
- aPainter.ProcessDisplay(aDisplayInfo);
-
- // prepare delete
- aPainter.PrepareDelete();
- }
-
- if (nWinNum!=SDRVIEWWIN_NOTFOUND) {
- if (IsShownXorVisibleWinNum(nWinNum)) {
- //ToggleShownXor(&aVDev,NULL);
- ToggleShownXor(pOut, 0L);
- }
- }
-
- // #116425#
- // Do not remove the object and do not copy from some VDev
- //
- //Point aCopyOfs(aDirtyArea.TopLeft());
- //aCopyOfs.X()-=a2Pix.Width();
- //aCopyOfs.Y()-=a2Pix.Height();
- //Size aCopySize(aBound.Right()-aBound.Left(),aBound.Bottom()-aBound.Top());
- //aCopySize.Width()+=2*a2Pix.Width();
- //aCopySize.Height()+=2*a2Pix.Height();
- //pOut->DrawOutDev(aCopyOfs,aCopySize,aCopyOfs,aCopySize,aVDev);
- }
- //pOL->NbcRemoveObject(pOL->GetObjCount()-1);
- // Die Page brauchen die Objekte
- // hier mal bitte eine Optimierung vornehmen
- //pAktCreate->SetPage(pCreatePV->GetPage());
- }
- }
- } else {
- pLibObjDragMeth->Mov(aPnt);
+ bool bMerk(aDragStat.IsMinMoved());
+ if (aDragStat.CheckMinMoved(aPnt)) {
+ Rectangle aBound;
+ if (!bMerk) aDragStat.NextPoint();
+ aDragStat.NextMove(aPnt);
+ pAktCreate->MovCreate(aDragStat);
+
+ // replace for DrawCreateObjDiff
+ HideCreateObj();
+ ShowCreateObj();
}
}
}
@@ -773,81 +658,53 @@ BOOL SdrCreateView::EndCreateObj(SdrCreateCmd eCmd)
BOOL bRet=FALSE;
SdrObject* pObjMerk=pAktCreate;
SdrPageView* pPVMerk=pCreatePV;
- if (pAktCreate!=NULL) {
- if (pLibObjDragMeth==NULL) {
- ULONG nAnz=aDragStat.GetPointAnz();
- if (nAnz<=1 && eCmd==SDRCREATE_FORCEEND) {
- BrkCreateObj(); // Objekte mit nur einem Punkt gibt's nicht (zumindest noch nicht)
- return FALSE; // FALSE=Event nicht ausgewertet
- }
- BOOL bPntsEq=nAnz>1;
- ULONG i=1;
- Point aP0=aDragStat.GetPoint(0);
- while (bPntsEq && i<nAnz) { bPntsEq=aP0==aDragStat.GetPoint(i); i++; }
- if (pAktCreate->EndCreate(aDragStat,eCmd)) {
- if (!IsSolidDraggingNow()) HideCreateObj(pDragWin,TRUE);
- if (!bPntsEq) { // sonst Brk, weil alle Punkte gleich sind.
- SdrObject* pObj=pAktCreate;
- pAktCreate=NULL;
- SdrLayerAdmin& rAd=pCreatePV->GetPage()->GetLayerAdmin();
- SdrLayerID nLayer=rAd.GetLayerID(aAktLayer,TRUE);
- if (nLayer==SDRLAYER_NOTFOUND) nLayer=0;
- pObj->SetLayer(nLayer);
- // #i37462# Always insert with broadcasting (leads to ActionChanged() here),
- // else the refreshes will be wrong
- InsertObject(pObj, *pCreatePV);
+ if (pAktCreate!=NULL)
+ {
+ ULONG nAnz=aDragStat.GetPointAnz();
- pCreatePV=NULL;
- bRet=TRUE; // TRUE=Event ausgewertet
- } else {
- BrkCreateObj();
- }
- } else { // Mehr Punkte
- if (eCmd==SDRCREATE_FORCEEND || // nix da, Ende erzwungen
- nAnz==0 || // keine Punkte da (kann eigentlich nicht vorkommen)
- (nAnz<=1 && !aDragStat.IsMinMoved())) { // MinMove nicht erfuellt
- BrkCreateObj();
- } else {
- XPolyPolygon aXPP1;
- pAktCreate->TakeCreatePoly(aDragStat,aXPP1);
- XPolyPolygon aXPP2(aXPP1); // kopieren, weil wird in DrawCreateDiff geaendert
- if (!IsSolidDraggingNow()) DrawCreateObjDiff(pCreatePV->DragPoly(),aXPP1);
- pCreatePV->DragPoly()=aXPP2;
- aDragStat.ResetMinMoved(); // NextPoint gibt's bei MovCreateObj()
- bRet=TRUE;
- }
- }
- if (bRet && pObjMerk!=NULL && IsTextEditAfterCreate()) {
- SdrTextObj* pText=PTR_CAST(SdrTextObj,pObjMerk);
- if (pText!=NULL && pText->IsTextFrame()) {
- BegTextEdit(pText,pPVMerk,(Window*)NULL,TRUE,(SdrOutliner*)NULL,(OutlinerView*)NULL);
- }
- }
- } else {
- if (pLibObjDragMeth->End(FALSE)) {
+ if (nAnz<=1 && eCmd==SDRCREATE_FORCEEND)
+ {
+ BrkCreateObj(); // Objekte mit nur einem Punkt gibt's nicht (zumindest noch nicht)
+ return FALSE; // FALSE=Event nicht ausgewertet
+ }
+
+ BOOL bPntsEq=nAnz>1;
+ ULONG i=1;
+ Point aP0=aDragStat.GetPoint(0);
+ while (bPntsEq && i<nAnz) { bPntsEq=aP0==aDragStat.GetPoint(i); i++; }
+
+ if (pAktCreate->EndCreate(aDragStat,eCmd))
+ {
+ HideCreateObj();
+
+ if (!bPntsEq)
+ {
+ // sonst Brk, weil alle Punkte gleich sind.
+ SdrObject* pObj=pAktCreate;
pAktCreate=NULL;
- pCreatePV=NULL;
- SdrLayerAdmin& rAd=pPVMerk->GetPage()->GetLayerAdmin();
+ SdrLayerAdmin& rAd=pCreatePV->GetPage()->GetLayerAdmin();
SdrLayerID nLayer=rAd.GetLayerID(aAktLayer,TRUE);
if (nLayer==SDRLAYER_NOTFOUND) nLayer=0;
- pObjMerk->SetLayer(nLayer);
+ pObj->SetLayer(nLayer);
// #83403# recognize creation of a new 3D object inside a 3D scene
BOOL bSceneIntoScene(FALSE);
if(pObjMerk
&& pObjMerk->ISA(E3dScene)
- && pPVMerk
- && pPVMerk->GetAktGroup()
- && pPVMerk->GetAktGroup()->ISA(E3dScene))
+ && pCreatePV
+ && pCreatePV->GetAktGroup()
+ && pCreatePV->GetAktGroup()->ISA(E3dScene))
{
BOOL bDidInsert = ((E3dView*)this)->ImpCloneAll3DObjectsToDestScene(
- (E3dScene*)pObjMerk, (E3dScene*)pPVMerk->GetAktGroup(), Point(0, 0));
+ (E3dScene*)pObjMerk, (E3dScene*)pCreatePV->GetAktGroup(), Point(0, 0));
+
if(bDidInsert)
{
// delete object, it's content is cloned and inserted
- delete pAktCreate;
+ delete pObjMerk;
+ pObjMerk = 0L;
bRet = FALSE;
bSceneIntoScene = TRUE;
}
@@ -856,22 +713,37 @@ BOOL SdrCreateView::EndCreateObj(SdrCreateCmd eCmd)
if(!bSceneIntoScene)
{
// do the same as before
- InsertObject(pObjMerk,*pPVMerk);
+ InsertObjectAtView(pObj, *pCreatePV);
}
- bRet=TRUE;
+ pCreatePV=NULL;
+ bRet=TRUE; // TRUE=Event ausgewertet
+ }
+ else
+ {
+ BrkCreateObj();
+ }
+ }
+ else
+ { // Mehr Punkte
+ if (eCmd==SDRCREATE_FORCEEND || // nix da, Ende erzwungen
+ nAnz==0 || // keine Punkte da (kann eigentlich nicht vorkommen)
+ (nAnz<=1 && !aDragStat.IsMinMoved())) { // MinMove nicht erfuellt
+ BrkCreateObj();
} else {
- delete pAktCreate;
- bRet=FALSE;
+ // replace for DrawCreateObjDiff
+ HideCreateObj();
+ ShowCreateObj();
+ aDragStat.ResetMinMoved(); // NextPoint gibt's bei MovCreateObj()
+ bRet=TRUE;
}
- delete pLibObjDragMeth;
- pLibObjDragMeth=NULL;
- pAktCreate=NULL;
- pCreatePV=NULL;
}
- if (pAktCreate==NULL) {
- SetSolidDraggingNow(FALSE);
- SetSolidDraggingCheck(FALSE);
+ if (bRet && pObjMerk!=NULL && IsTextEditAfterCreate()) {
+ SdrTextObj* pText=PTR_CAST(SdrTextObj,pObjMerk);
+ if (pText!=NULL && pText->IsTextFrame())
+ {
+ SdrBeginTextEdit(pText, pPVMerk, (Window*)0L, sal_True, (SdrOutliner*)0L, (OutlinerView*)0L);
+ }
}
}
return bRet;
@@ -880,13 +752,13 @@ BOOL SdrCreateView::EndCreateObj(SdrCreateCmd eCmd)
void SdrCreateView::BckCreateObj()
{
if (pAktCreate!=NULL) {
- if (aDragStat.GetPointAnz()<=2 || pLibObjDragMeth!=NULL) {
+ if (aDragStat.GetPointAnz()<=2 ) {
BrkCreateObj();
} else {
- HideCreateObj(pDragWin,TRUE);
+ HideCreateObj();
aDragStat.PrevPoint();
if (pAktCreate->BckCreate(aDragStat)) {
- ShowCreateObj(pDragWin,TRUE);
+ ShowCreateObj();
} else {
BrkCreateObj();
}
@@ -896,205 +768,104 @@ void SdrCreateView::BckCreateObj()
void SdrCreateView::BrkCreateObj()
{
- if (pAktCreate!=NULL) {
- if (pLibObjDragMeth==NULL) {
- if (!IsSolidDraggingNow()) {
- HideCreateObj(pDragWin,TRUE);
- } else {
- Rectangle aBound(pAktCreate->GetCurrentBoundRect());
- Point aPvOfs(pCreatePV->GetOffset());
- aBound.Move(aPvOfs.X(),aPvOfs.Y());
- InvalidateAllWin(aBound);
- }
- pAktCreate->BrkCreate(aDragStat);
- } else {
- pLibObjDragMeth->Brk();
- delete pLibObjDragMeth;
- pLibObjDragMeth=NULL;
- }
+ if (pAktCreate!=NULL)
+ {
+ HideCreateObj();
+ pAktCreate->BrkCreate(aDragStat);
delete pAktCreate;
pAktCreate=NULL;
pCreatePV=NULL;
- SetSolidDraggingNow(FALSE);
- SetSolidDraggingCheck(FALSE);
}
}
-void SdrCreateView::DrawCreateObjDiff(XPolyPolygon& rXPP0, XPolyPolygon& rXPP1)
+void SdrCreateView::ShowCreateObj(/*OutputDevice* pOut, BOOL bFull*/)
{
- if (IsSolidDraggingNow()) return;
- USHORT nPolyAnz0=rXPP0.Count();
- USHORT nPolyAnz1=rXPP1.Count();
- USHORT nMinPolyAnz=Min(nPolyAnz0,nPolyAnz1);
- USHORT nPolyNum;
- for (nPolyNum=nMinPolyAnz; nPolyNum>0;) { // unveraenderte Polygone entfernen
- nPolyNum--;
- if (rXPP0[nPolyNum]==rXPP1[nPolyNum]) {
- rXPP0.Remove(nPolyNum);
- rXPP1.Remove(nPolyNum);
- }
- }
- nPolyAnz0=rXPP0.Count();
- nPolyAnz1=rXPP1.Count();
- nMinPolyAnz=Min(nPolyAnz0,nPolyAnz1);
- BOOL bNeedDot=FALSE;
- for (nPolyNum=nMinPolyAnz; nPolyNum>0;) { // unveraenderte Polygonteile entfernen
- nPolyNum--;
- const XPolygon& rXP0=rXPP0[nPolyNum];
- const XPolygon& rXP1=rXPP1[nPolyNum];
- USHORT nPntAnz0=rXP0.GetPointCount();
- USHORT nPntAnz1=rXP1.GetPointCount();
- USHORT nMinPntAnz=Min(nPntAnz0,nPntAnz1);
- USHORT nEquCnt0=0;
- USHORT nEquCnt1=0;
- for (USHORT nPntNum=0; nPntNum<nMinPntAnz; nPntNum++) {
- if (rXP0[nPntNum]==rXP1[nPntNum]) {
- nEquCnt0=nEquCnt1;
- BOOL bCtrl0=(nPntNum<nMinPntAnz) && rXP0.IsControl(nPntNum+1);
- BOOL bCtrl1=(nPntNum<nMinPntAnz) && rXP1.IsControl(nPntNum+1);
- if (bCtrl0==bCtrl1) {
- nEquCnt1=nPntNum+1;
- if (bCtrl0) {
- nPntNum++;
- if (rXP0[nPntNum]==rXP1[nPntNum]) {
- nPntNum++;
- if (rXP0[nPntNum]==rXP1[nPntNum]) {
- nEquCnt1=nPntNum+1;
- } else nPntNum=nMinPntAnz; // sowas wie break.
- } else nPntNum=nMinPntAnz; // sowas wie break.
- }
- } else nPntNum=nMinPntAnz; // sowas wie break.
- } else nPntNum=nMinPntAnz; // sowas wie break.
- }
- if (nEquCnt0!=0) {
- rXPP0[nPolyNum].Remove(0,nEquCnt0);
- rXPP1[nPolyNum].Remove(0,nEquCnt0);
-#ifndef MAC // anderes Polygonpainting beim Mac
- if (nPolyNum==nMinPolyAnz-1 &&
- (rXPP0[nPolyNum].GetPointCount()<=1 ||
- rXPP1[nPolyNum].GetPointCount()<=1)) bNeedDot=TRUE;
-#endif
- }
- }
- aDragStat.SetShown(TRUE);
- USHORT nOutNum=0;
- do {
- Window* pO= (Window*)pDragWin;
- if (pO==NULL) {
- pO=(Window*)GetWin(nOutNum);
- nOutNum++;
- }
- if (pO!=NULL) {
- ImpSdrHdcMerk aHDCMerk(*pO,SDRHDC_SAVEALL,bRestoreColors);
- RasterOp eRop0=pO->GetRasterOp();
- pO->SetRasterOp(ROP_INVERT);
- pXOut->SetOutDev(pO);
-
- Color aBlackColor( COL_BLACK );
- Color aTranspColor( COL_TRANSPARENT );
- pXOut->OverrideLineColor( aBlackColor );
- pXOut->OverrideFillColor( aTranspColor );
- pXOut->SetOffset(pCreatePV->GetOffset());
- USHORT nAnz=rXPP0.Count();
- USHORT i;
- for (i=0; i<nAnz; i++) {
- pXOut->DrawXPolyLine(rXPP0[i]);
- }
- nAnz=rXPP1.Count();
- for (i=0; i<nAnz; i++) {
- pXOut->DrawXPolyLine(rXPP1[i]);
- if (bNeedDot && nPolyNum==nMinPolyAnz-1) {
- Point aPt(rXPP1[i][0]);
- //pO->InvertRect(Rectangle(aPt,aPt));
- pO->Invert( Rectangle( aPt, aPt ) );
+ if(IsCreateObj() && !aDragStat.IsShown())
+ {
+ if(pAktCreate)
+ {
+ // for migration from XOR, replace DrawDragObj here to create
+ // overlay objects instead.
+ sal_Bool bUseSolidDragging(IsSolidDragging());
+
+ // check for objects with no fill and no line
+ if(bUseSolidDragging)
+ {
+ const SfxItemSet& rSet = pAktCreate->GetMergedItemSet();
+ const XFillStyle eFill(((XFillStyleItem&)(rSet.Get(XATTR_FILLSTYLE))).GetValue());
+ const XLineStyle eLine(((XLineStyleItem&)(rSet.Get(XATTR_LINESTYLE))).GetValue());
+
+ if(XLINE_NONE == eLine && XFILL_NONE == eFill)
+ {
+ bUseSolidDragging = sal_False;
}
}
- pXOut->SetOffset(Point(0,0));
- pO->SetRasterOp(eRop0);
- if (bRestoreColors) aHDCMerk.Restore(*pO);
- }
- } while (pDragWin==NULL && nOutNum<GetWinCount());
-}
-void SdrCreateView::DrawCreateObj(OutputDevice* pOut, BOOL /*bFull*/) const
-{
- if (IsSolidDraggingNow()) return;
- if (IsCreateObj()) {
- USHORT i=0;
- do {
- OutputDevice* pO=pOut;
- if (pO==NULL) {
- pO=GetWin(i);
- i++;
- }
- if (pO!=NULL) {
- ImpSdrHdcMerk aHDCMerk(*pO,SDRHDC_SAVEALL,bRestoreColors);
- RasterOp eRop0=pO->GetRasterOp();
- pO->SetRasterOp(ROP_INVERT);
- pXOut->SetOutDev(pO);
- Color aBlackColor( COL_BLACK );
- Color aTranspColor( COL_TRANSPARENT );
- pXOut->OverrideLineColor( aBlackColor );
- pXOut->OverrideFillColor( aTranspColor );
- pXOut->SetOffset(pCreatePV->GetOffset());
- XPolyPolygon aXPP(pCreatePV->DragPoly());
- USHORT nAnz=aXPP.Count();
- for (USHORT j=0; j<nAnz; j++) {
- pXOut->DrawXPolyLine(aXPP[j]);
+ // check for form controls
+ if(bUseSolidDragging)
+ {
+ if(pAktCreate->ISA(SdrUnoObj)) // OBJ_FM_CONTROL == pAktCreate->GetObjIdentifier())
+ {
+ bUseSolidDragging = sal_False;
}
- pXOut->SetOffset(Point(0,0));
- pO->SetRasterOp(eRop0);
- if (bRestoreColors) aHDCMerk.Restore(*pO);
}
- } while (pOut==NULL && i<GetWinCount());
- }
-}
-void SdrCreateView::ShowCreateObj(OutputDevice* pOut, BOOL bFull)
-{
- if (IsCreateObj() && !aDragStat.IsShown()) {
- XPolyPolygon aXPP;
- if (pLibObjDragMeth==NULL) {
- pAktCreate->TakeCreatePoly(aDragStat,pCreatePV->DragPoly());
- }
- DrawCreateObj(pOut,bFull);
- aDragStat.SetShown(TRUE);
+ if(bUseSolidDragging)
+ {
+ basegfx::B2DPolyPolygon aDragPolyPolygon;
- // #i3705# set shown state at views
- if(pOut)
- {
- sal_uInt16 nw(aWinList.Find(pOut));
+ if(pAktCreate->ISA(SdrRectObj))
+ {
+ // ensure object has some size, necessary for SdrTextObj because
+ // there are still untested divisions by that sizes in DoPaintObject
+ // stuff (see assert in SdrRectObj::DoPaintObject).
+ Rectangle aCurrentSnapRect(pAktCreate->GetSnapRect());
- if(nw < GetWinCount() && SDRVIEWWIN_NOTFOUND != nw)
- {
- if(!IsShownXorVisibleWinNum(nw))
+ if(!(aCurrentSnapRect.GetWidth() > 1 && aCurrentSnapRect.GetHeight() > 1))
+ {
+ Rectangle aNewRect(aDragStat.GetStart(), aDragStat.GetStart() + Point(2, 2));
+ pAktCreate->NbcSetSnapRect(aNewRect);
+ }
+ }
+
+ if(pAktCreate->ISA(SdrPathObj))
{
- SetShownXorVisible(nw, TRUE);
+ // The up-to-now created path needs to be set at the object to have something
+ // that can be visualized
+ SdrPathObj& rPathObj((SdrPathObj&)(*pAktCreate));
+ const basegfx::B2DPolyPolygon aCurrentPolyPolygon(rPathObj.getObjectPolyPolygon(aDragStat));
+
+ if(aCurrentPolyPolygon.count())
+ {
+ rPathObj.NbcSetPathPoly(aCurrentPolyPolygon);
+ }
+
+ aDragPolyPolygon = rPathObj.getDragPolyPolygon(aDragStat);
}
+
+ // use directly the SdrObject for overlay
+ mpCreateViewExtraData->CreateAndShowOverlay(*this, pAktCreate, aDragPolyPolygon);
+ }
+ else
+ {
+ mpCreateViewExtraData->CreateAndShowOverlay(*this, 0, pAktCreate->TakeCreatePoly(aDragStat));
}
}
+
+ aDragStat.SetShown(TRUE);
}
}
-void SdrCreateView::HideCreateObj(OutputDevice* pOut, BOOL bFull)
+void SdrCreateView::HideCreateObj()
{
- if (IsCreateObj() && aDragStat.IsShown()) {
- DrawCreateObj(pOut,bFull);
- aDragStat.SetShown(FALSE);
-
- // #i3705# clear shown state at views
- if(pOut)
- {
- sal_uInt16 nw(aWinList.Find(pOut));
+ if(IsCreateObj() && aDragStat.IsShown())
+ {
+ // for migration from XOR, replace DrawDragObj here to create
+ // overlay objects instead.
+ mpCreateViewExtraData->HideOverlay();
- if(nw < GetWinCount() && SDRVIEWWIN_NOTFOUND != nw)
- {
- if(IsShownXorVisibleWinNum(nw))
- {
- SetShownXorVisible(nw, FALSE);
- }
- }
- }
+ //DrawCreateObj(pOut,bFull);
+ aDragStat.SetShown(FALSE);
}
}
@@ -1118,7 +889,6 @@ BOOL SdrCreateView::SetAttributes(const SfxItemSet& rSet, BOOL bReplaceAll)
{
if(pAktCreate)
{
- //pAktCreate->SetItemSetAndBroadcast(rSet, bReplaceAll);
pAktCreate->SetMergedItemSetAndBroadcast(rSet, bReplaceAll);
return TRUE;
@@ -1149,59 +919,3 @@ BOOL SdrCreateView::SetStyleSheet(SfxStyleSheet* pStyleSheet, BOOL bDontRemoveHa
}
}
-////////////////////////////////////////////////////////////////////////////////////////////////////
-
-//BFS01void SdrCreateView::WriteRecords(SvStream& rOut) const
-//BFS01{
-//BFS01 SdrDragView::WriteRecords(rOut);
-//BFS01 {
-//BFS01 SdrNamedSubRecord aSubRecord(rOut,STREAM_WRITE,SdrInventor,SDRIORECNAME_VIEWCROBJECT);
-//BFS01 rOut<<nAktInvent;
-//BFS01 rOut<<nAktIdent;
-//BFS01 } {
-//BFS01 SdrNamedSubRecord aSubRecord(rOut,STREAM_WRITE,SdrInventor,SDRIORECNAME_VIEWCRFLAGS);
-//BFS01 rOut<<BOOL(b1stPointAsCenter);
-//BFS01 } {
-//BFS01 // in der CreateView (statt ObjEditView) weil sonst inkompatibel.
-//BFS01 SdrNamedSubRecord aSubRecord(rOut,STREAM_WRITE,SdrInventor,SDRIORECNAME_VIEWTEXTEDIT);
-//BFS01 rOut<<BOOL(bQuickTextEditMode);
-//BFS01 } {
-//BFS01 // in der CreateView (statt ObjEditView) weil sonst inkompatibel.
-//BFS01 SdrNamedSubRecord aSubRecord(rOut,STREAM_WRITE,SdrInventor,SDRIORECNAME_VIEWMACRO);
-//BFS01 rOut<<BOOL(bMacroMode);
-//BFS01 }
-//BFS01}
-
-//BFS01BOOL SdrCreateView::ReadRecord(const SdrIOHeader& rViewHead,
-//BFS01 const SdrNamedSubRecord& rSubHead,
-//BFS01 SvStream& rIn)
-//BFS01{
-//BFS01 BOOL bRet=FALSE;
-//BFS01 if (rSubHead.GetInventor()==SdrInventor) {
-//BFS01 bRet=TRUE;
-//BFS01 switch (rSubHead.GetIdentifier()) {
-//BFS01 case SDRIORECNAME_VIEWCROBJECT: {
-//BFS01 UINT32 nInvent;
-//BFS01 UINT16 nIdent;
-//BFS01 rIn>>nInvent;
-//BFS01 rIn>>nIdent;
-//BFS01 SetCurrentObj(nIdent,nInvent);
-//BFS01 } break;
-//BFS01 case SDRIORECNAME_VIEWCRFLAGS: {
-//BFS01 BOOL bTmp; rIn>>bTmp; b1stPointAsCenter=bTmp;
-//BFS01 } break;
-//BFS01 case SDRIORECNAME_VIEWTEXTEDIT: {
-//BFS01 // in der CreateView (statt ObjEditView) weil sonst inkompatibel.
-//BFS01 BOOL bTmp; rIn>>bTmp; bQuickTextEditMode=bTmp;
-//BFS01 } break;
-//BFS01 case SDRIORECNAME_VIEWMACRO: {
-//BFS01 // in der CreateView (statt ObjEditView) weil sonst inkompatibel.
-//BFS01 BOOL bTmp; rIn>>bTmp; bMacroMode=bTmp;
-//BFS01 } break;
-//BFS01 default: bRet=FALSE;
-//BFS01 }
-//BFS01 }
-//BFS01 if (!bRet) bRet=SdrDragView::ReadRecord(rViewHead,rSubHead,rIn);
-//BFS01 return bRet;
-//BFS01}
-