/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_svx.hxx" #include #include "svx/xattr.hxx" #include #include // Spezialbehandlung: Nach dem Create transparente Fuellung #include #include #include #include #include #include #include #include #include #define XOR_CREATE_PEN PEN_SOLID #include #include #include #include #include "fmobj.hxx" #include #include #include #include //////////////////////////////////////////////////////////////////////////////////////////////////// class ImplConnectMarkerOverlay { // The OverlayObjects ::sdr::overlay::OverlayObjectList maObjects; // The remembered target object const SdrObject& mrObject; public: ImplConnectMarkerOverlay(const SdrCreateView& rView, SdrObject& rObject); ~ImplConnectMarkerOverlay(); const SdrObject& GetTargetObject() const { return mrObject; } }; ImplConnectMarkerOverlay::ImplConnectMarkerOverlay(const SdrCreateView& rView, SdrObject& rObject) : mrObject(rObject) { basegfx::B2DPolyPolygon aB2DPolyPolygon(rObject.TakeXorPoly()); for(sal_uInt32 a(0L); a < rView.PaintWindowCount(); a++) { SdrPaintWindow* pCandidate = rView.GetPaintWindow(a); ::sdr::overlay::OverlayManager* pTargetOverlay = pCandidate->GetOverlayManager(); if(pTargetOverlay) { Size aHalfLogicSize(pTargetOverlay->getOutputDevice().PixelToLogic(Size(4, 4))); // object ::sdr::overlay::OverlayPolyPolygonStripedAndFilled* pNew = new ::sdr::overlay::OverlayPolyPolygonStripedAndFilled( 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::OverlayPolyPolygonStripedAndFilled( aTempPolyPoly); pTargetOverlay->add(*pNew); maObjects.append(*pNew); } } } } } 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) { if(pObject) { const sdr::contact::ViewContact& rVC = pObject->GetViewContact(); const drawinglayer::primitive2d::Primitive2DSequence aSequence = rVC.getViewIndependentPrimitive2DSequence(); sdr::overlay::OverlayObject* pNew = new sdr::overlay::OverlayPrimitive2DSequenceObject(aSequence); pOverlayManager->add(*pNew); maObjects.append(*pNew); } if(rPolyPoly.count()) { ::sdr::overlay::OverlayPolyPolygonStripedAndFilled* pNew = new ::sdr::overlay::OverlayPolyPolygonStripedAndFilled( rPolyPoly); pOverlayManager->add(*pNew); maObjects.append(*pNew); } } } } void ImpSdrCreateViewExtraData::HideOverlay() { // the clear() call at the list removes all objects from the // OverlayManager and deletes them. maObjects.clear(); } //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////// // // @@@@ @@@@@ @@@@@ @@@@ @@@@@@ @@@@@ @@ @@ @@ @@@@@ @@ @@ // @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ // @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @ @@ // @@ @@@@@ @@@@ @@@@@@ @@ @@@@ @@@@@ @@ @@@@ @@@@@@@ // @@ @@ @@ @@ @@ @@ @@ @@ @@@ @@ @@ @@@@@@@ // @@ @@ @@ @@ @@ @@ @@ @@ @@ @@@ @@ @@ @@@ @@@ // @@@@ @@ @@ @@@@@ @@ @@ @@ @@@@@ @ @@ @@@@@ @@ @@ // //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////// void SdrCreateView::ImpClearConnectMarker() { if(mpCoMaOverlay) { delete mpCoMaOverlay; mpCoMaOverlay = 0L; } } void SdrCreateView::ImpClearVars() { nAktInvent=SdrInventor; nAktIdent=OBJ_NONE; pAktCreate=NULL; pCreatePV=NULL; bAutoTextEdit=sal_False; b1stPointAsCenter=sal_False; aAktCreatePointer=Pointer(POINTER_CROSS); bUseIncompatiblePathCreateInterface=sal_False; bAutoClosePolys=sal_True; nAutoCloseDistPix=5; nFreeHandMinDistPix=10; ImpClearConnectMarker(); } void SdrCreateView::ImpMakeCreateAttr() { } SdrCreateView::SdrCreateView(SdrModel* pModel1, OutputDevice* pOut) : SdrDragView(pModel1,pOut), mpCoMaOverlay(0L), mpCreateViewExtraData(new ImpSdrCreateViewExtraData()) { ImpClearVars(); ImpMakeCreateAttr(); } SdrCreateView::~SdrCreateView() { ImpClearConnectMarker(); delete mpCreateViewExtraData; SdrObject::Free( pAktCreate ); } void SdrCreateView::ImpDelCreateAttr() { } sal_Bool SdrCreateView::IsAction() const { return SdrDragView::IsAction() || pAktCreate!=NULL; } void SdrCreateView::MovAction(const Point& rPnt) { SdrDragView::MovAction(rPnt); if (pAktCreate!=NULL) { MovCreateObj(rPnt); } } void SdrCreateView::EndAction() { if (pAktCreate!=NULL) EndCreateObj(SDRCREATE_FORCEEND); SdrDragView::EndAction(); } void SdrCreateView::BckAction() { if (pAktCreate!=NULL) BckCreateObj(); SdrDragView::BckAction(); } void SdrCreateView::BrkAction() { SdrDragView::BrkAction(); BrkCreateObj(); } void SdrCreateView::TakeActionRect(Rectangle& rRect) const { if (pAktCreate!=NULL) { rRect=aDragStat.GetActionRect(); if (rRect.IsEmpty()) { rRect=Rectangle(aDragStat.GetPrev(),aDragStat.GetNow()); } } else { SdrDragView::TakeActionRect(rRect); } } sal_Bool SdrCreateView::CheckEdgeMode() { sal_uInt32 nInv=nAktInvent; sal_uInt16 nIdn=nAktIdent; if (pAktCreate!=NULL) { nInv=pAktCreate->GetObjInventor(); nIdn=pAktCreate->GetObjIdentifier(); // wird vom EdgeObj gemanaged if (nAktInvent==SdrInventor && nAktIdent==OBJ_EDGE) return sal_False; } if (!IsCreateMode() || nAktInvent!=SdrInventor || nAktIdent!=OBJ_EDGE) { ImpClearConnectMarker(); return sal_False; } else { // sal_True heisst: MouseMove soll Connect checken return !IsAction(); } } void SdrCreateView::SetConnectMarker(const SdrObjConnection& rCon, const SdrPageView& /*rPV*/) { 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(); } if(!mpCoMaOverlay) { mpCoMaOverlay = new ImplConnectMarkerOverlay(*this, *pTargetObject); } } else { ImpClearConnectMarker(); } } void SdrCreateView::HideConnectMarker() { ImpClearConnectMarker(); } sal_Bool SdrCreateView::MouseMove(const MouseEvent& rMEvt, Window* pWin) { if(CheckEdgeMode() && pWin) { SdrPageView* pPV = GetSdrPageView(); if(pPV) { // Defaultete Hit-Toleranz bei IsMarkedHit() mal aendern !!!! Point aPos(pWin->PixelToLogic(rMEvt.GetPosPixel())); sal_Bool bMarkHit=PickHandle(aPos)!=NULL || IsMarkedObjHit(aPos); SdrObjConnection aCon; if (!bMarkHit) SdrEdgeObj::ImpFindConnector(aPos,*pPV,aCon,NULL,pWin); SetConnectMarker(aCon,*pPV); } } return SdrDragView::MouseMove(rMEvt,pWin); } sal_Bool SdrCreateView::IsTextTool() const { return eEditMode==SDREDITMODE_CREATE && nAktInvent==SdrInventor && (nAktIdent==OBJ_TEXT || nAktIdent==OBJ_TEXTEXT || nAktIdent==OBJ_TITLETEXT || nAktIdent==OBJ_OUTLINETEXT); } sal_Bool SdrCreateView::IsEdgeTool() const { return eEditMode==SDREDITMODE_CREATE && nAktInvent==SdrInventor && (nAktIdent==OBJ_EDGE); } sal_Bool SdrCreateView::IsMeasureTool() const { return eEditMode==SDREDITMODE_CREATE && nAktInvent==SdrInventor && (nAktIdent==OBJ_MEASURE); } void SdrCreateView::SetCurrentObj(sal_uInt16 nIdent, sal_uInt32 nInvent) { if (nAktInvent!=nInvent || nAktIdent!=nIdent) { nAktInvent=nInvent; nAktIdent=nIdent; SdrObject* pObj = SdrObjFactory::MakeNewObject(nInvent,nIdent,NULL,NULL); if(pObj) { // Auf pers. Wunsch von Marco: // Mauszeiger bei Textwerkzeug immer I-Beam. Fadenkreuz // mit kleinem I-Beam erst bai MouseButtonDown if(IsTextTool()) { // #81944# AW: Here the correct pointer needs to be used // if the default is set to vertical writing aAktCreatePointer = POINTER_TEXT; } else aAktCreatePointer = pObj->GetCreatePointer(); SdrObject::Free( pObj ); } else { aAktCreatePointer = Pointer(POINTER_CROSS); } } CheckEdgeMode(); ImpSetGlueVisible3(IsEdgeTool()); } sal_Bool SdrCreateView::ImpBegCreateObj(sal_uInt32 nInvent, sal_uInt16 nIdent, const Point& rPnt, OutputDevice* pOut, short nMinMov, SdrPageView* pPV, const Rectangle& rLogRect, SdrObject* pPreparedFactoryObject) { sal_Bool bRet=sal_False; UnmarkAllObj(); BrkAction(); 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()) { aLay = aMeasureLayer; } SdrLayerID nLayer=pCreatePV->GetPage()->GetLayerAdmin().GetLayerID(aLay,sal_True); if (nLayer==SDRLAYER_NOTFOUND) nLayer=0; 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!=sal_uInt16(OBJ_EDGE) && nAktIdent!=sal_uInt16(OBJ_FREELINE) && nAktIdent!=sal_uInt16(OBJ_FREEFILL) )) { // Kein Fang fuer Edge und Freihand! aPnt=GetSnapPos(aPnt,pCreatePV); } if (pAktCreate!=NULL) { sal_Bool bStartEdit=sal_False; // nach Ende von Create automatisch TextEdit starten if (pDefaultStyleSheet!=NULL) pAktCreate->NbcSetStyleSheet(pDefaultStyleSheet, sal_False); // #101618# SW uses a naked SdrObject for frame construction. Normally, such an // object should not be created. Since it is possible to use it as a helper // object (e.g. in letting the user define an area with the interactive // construction) at least no items should be set at that object. if(nInvent != SdrInventor || nIdent != OBJ_NONE) { pAktCreate->SetMergedItemSet(aDefaultAttr); } if (HAS_BASE(SdrCaptionObj,pAktCreate)) { SfxItemSet aSet(pMod->GetItemPool()); aSet.Put(XFillColorItem(String(),Color(COL_WHITE))); // Falls einer auf Solid umschaltet aSet.Put(XFillStyleItem(XFILL_NONE)); pAktCreate->SetMergedItemSet(aSet); bStartEdit=sal_True; } if (nInvent==SdrInventor && (nIdent==OBJ_TEXT || nIdent==OBJ_TEXTEXT || nIdent==OBJ_TITLETEXT || nIdent==OBJ_OUTLINETEXT)) { // Fuer alle Textrahmen default keinen Hintergrund und keine Umrandung SfxItemSet aSet(pMod->GetItemPool()); aSet.Put(XFillColorItem(String(),Color(COL_WHITE))); // Falls einer auf Solid umschaltet aSet.Put(XFillStyleItem(XFILL_NONE)); aSet.Put(XLineColorItem(String(),Color(COL_BLACK))); // Falls einer auf Solid umschaltet aSet.Put(XLineStyleItem(XLINE_NONE)); pAktCreate->SetMergedItemSet(aSet); bStartEdit=sal_True; } if (!rLogRect.IsEmpty()) pAktCreate->NbcSetLogicRect(rLogRect); // #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 (pAktCreate->BegCreate(aDragStat)) { ShowCreateObj(/*pOut,sal_True*/); bRet=sal_True; } else { SdrObject::Free( pAktCreate ); pAktCreate=NULL; pCreatePV=NULL; } } } } return bRet; } sal_Bool SdrCreateView::BegCreateObj(const Point& rPnt, OutputDevice* pOut, short nMinMov, SdrPageView* pPV) { return ImpBegCreateObj(nAktInvent,nAktIdent,rPnt,pOut,nMinMov,pPV,Rectangle(), 0L); } sal_Bool SdrCreateView::BegCreatePreparedObject(const Point& rPnt, sal_Int16 nMinMov, SdrObject* pPreparedFactoryObject) { 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); } sal_Bool SdrCreateView::BegCreateCaptionObj(const Point& rPnt, const Size& rObjSiz, OutputDevice* pOut, short nMinMov, SdrPageView* pPV) { 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) { Point aPnt(rPnt); if (!aDragStat.IsNoSnap()) { aPnt=GetSnapPos(aPnt,pCreatePV); } if (IsOrtho()) { if (aDragStat.IsOrtho8Possible()) OrthoDistance8(aDragStat.GetPrev(),aPnt,IsBigOrtho()); else if (aDragStat.IsOrtho4Possible()) OrthoDistance4(aDragStat.GetPrev(),aPnt,IsBigOrtho()); } // #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)); if(bDidLimit && IsOrtho()) { if(aDragStat.IsOrtho8Possible()) OrthoDistance8(aDragStat.GetPrev(), aPnt, sal_False); else if(aDragStat.IsOrtho4Possible()) OrthoDistance4(aDragStat.GetPrev(), aPnt, sal_False); } if (aPnt==aDragStat.GetNow()) return; bool bMerk(aDragStat.IsMinMoved()); if (aDragStat.CheckMinMoved(aPnt)) { Rectangle aBound; if (!bMerk) aDragStat.NextPoint(); aDragStat.NextMove(aPnt); pAktCreate->MovCreate(aDragStat); // MovCreate changes the object, so use ActionChanged() on it pAktCreate->ActionChanged(); // replace for DrawCreateObjDiff HideCreateObj(); ShowCreateObj(); } } } sal_Bool SdrCreateView::EndCreateObj(SdrCreateCmd eCmd) { sal_Bool bRet=sal_False; SdrObject* pObjMerk=pAktCreate; SdrPageView* pPVMerk=pCreatePV; if (pAktCreate!=NULL) { sal_uIntPtr nAnz=aDragStat.GetPointAnz(); if (nAnz<=1 && eCmd==SDRCREATE_FORCEEND) { BrkCreateObj(); // Objekte mit nur einem Punkt gibt's nicht (zumindest noch nicht) return sal_False; // sal_False=Event nicht ausgewertet } sal_Bool bPntsEq=nAnz>1; sal_uIntPtr i=1; Point aP0=aDragStat.GetPoint(0); while (bPntsEq && iEndCreate(aDragStat,eCmd)) { HideCreateObj(); if (!bPntsEq) { // sonst Brk, weil alle Punkte gleich sind. SdrObject* pObj=pAktCreate; pAktCreate=NULL; const SdrLayerAdmin& rAd = pCreatePV->GetPage()->GetLayerAdmin(); SdrLayerID nLayer(0); // #i72535# if(pObj->ISA(FmFormObj)) { // for FormControls, force to form layer nLayer = rAd.GetLayerID(rAd.GetControlLayerName(), true); } else { nLayer = rAd.GetLayerID(aAktLayer, sal_True); } if(SDRLAYER_NOTFOUND == nLayer) { nLayer=0; } pObj->SetLayer(nLayer); // #83403# recognize creation of a new 3D object inside a 3D scene sal_Bool bSceneIntoScene(sal_False); if(pObjMerk && pObjMerk->ISA(E3dScene) && pCreatePV && pCreatePV->GetAktGroup() && pCreatePV->GetAktGroup()->ISA(E3dScene)) { sal_Bool bDidInsert = ((E3dView*)this)->ImpCloneAll3DObjectsToDestScene( (E3dScene*)pObjMerk, (E3dScene*)pCreatePV->GetAktGroup(), Point(0, 0)); if(bDidInsert) { // delete object, it's content is cloned and inserted SdrObject::Free( pObjMerk ); pObjMerk = 0L; bRet = sal_False; bSceneIntoScene = sal_True; } } if(!bSceneIntoScene) { // do the same as before InsertObjectAtView(pObj, *pCreatePV); } pCreatePV=NULL; bRet=sal_True; // sal_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 { // replace for DrawCreateObjDiff HideCreateObj(); ShowCreateObj(); aDragStat.ResetMinMoved(); // NextPoint gibt's bei MovCreateObj() bRet=sal_True; } } 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; } void SdrCreateView::BckCreateObj() { if (pAktCreate!=NULL) { if (aDragStat.GetPointAnz()<=2 ) { BrkCreateObj(); } else { HideCreateObj(); aDragStat.PrevPoint(); if (pAktCreate->BckCreate(aDragStat)) { ShowCreateObj(); } else { BrkCreateObj(); } } } } void SdrCreateView::BrkCreateObj() { if (pAktCreate!=NULL) { HideCreateObj(); pAktCreate->BrkCreate(aDragStat); SdrObject::Free( pAktCreate ); pAktCreate=NULL; pCreatePV=NULL; } } void SdrCreateView::ShowCreateObj(/*OutputDevice* pOut, sal_Bool bFull*/) { if(IsCreateObj() && !aDragStat.IsShown()) { if(pAktCreate) { // for migration from XOR, replace DrawDragObj here to create // overlay objects instead. sal_Bool bUseSolidDragging(IsSolidDragging()); // #i101648# check if dragged object is a naked SdrObject (no // derivation of). This is e.g. used in SW Frame construction // as placeholder. Do not use SolidDragging for naked SDrObjects, // they cannot have a valid optical representation if(bUseSolidDragging && OBJ_NONE == pAktCreate->GetObjIdentifier()) { bUseSolidDragging = false; } // 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; } } // check for form controls if(bUseSolidDragging) { if(pAktCreate->ISA(SdrUnoObj)) { bUseSolidDragging = sal_False; } } // #i101781# force to non-solid dragging when not creating a full circle if(bUseSolidDragging) { SdrCircObj* pCircObj = dynamic_cast< SdrCircObj* >(pAktCreate); if(pCircObj && OBJ_CIRC != pCircObj->GetObjIdentifier()) { // #i103058# Allow SolidDragging with four points if(aDragStat.GetPointAnz() < 4) { bUseSolidDragging = false; } } } if(bUseSolidDragging) { basegfx::B2DPolyPolygon aDragPolyPolygon; if(pAktCreate->ISA(SdrRectObj)) { // ensure object has some size, necessary for SdrTextObj because // there are still untested divisions by that sizes Rectangle aCurrentSnapRect(pAktCreate->GetSnapRect()); if(!(aCurrentSnapRect.GetWidth() > 1 && aCurrentSnapRect.GetHeight() > 1)) { Rectangle aNewRect(aDragStat.GetStart(), aDragStat.GetStart() + Point(2, 2)); pAktCreate->NbcSetSnapRect(aNewRect); } } if(pAktCreate->ISA(SdrPathObj)) { // 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)); } // #i101679# Force changed overlay to be shown for(sal_uInt32 a(0); a < PaintWindowCount(); a++) { SdrPaintWindow* pCandidate = GetPaintWindow(a); sdr::overlay::OverlayManager* pOverlayManager = pCandidate->GetOverlayManager(); if(pOverlayManager) { pOverlayManager->flush(); } } } aDragStat.SetShown(sal_True); } } void SdrCreateView::HideCreateObj() { if(IsCreateObj() && aDragStat.IsShown()) { // for migration from XOR, replace DrawDragObj here to create // overlay objects instead. mpCreateViewExtraData->HideOverlay(); //DrawCreateObj(pOut,bFull); aDragStat.SetShown(sal_False); } } //////////////////////////////////////////////////////////////////////////////////////////////////// /* new interface src537 */ sal_Bool SdrCreateView::GetAttributes(SfxItemSet& rTargetSet, sal_Bool bOnlyHardAttr) const { if(pAktCreate) { rTargetSet.Put(pAktCreate->GetMergedItemSet()); return sal_True; } else { return SdrDragView::GetAttributes(rTargetSet, bOnlyHardAttr); } } sal_Bool SdrCreateView::SetAttributes(const SfxItemSet& rSet, sal_Bool bReplaceAll) { if(pAktCreate) { pAktCreate->SetMergedItemSetAndBroadcast(rSet, bReplaceAll); return sal_True; } else { return SdrDragView::SetAttributes(rSet,bReplaceAll); } } SfxStyleSheet* SdrCreateView::GetStyleSheet() const // SfxStyleSheet* SdrCreateView::GetStyleSheet(sal_Bool& rOk) const { if (pAktCreate!=NULL) { //rOk=sal_True; return pAktCreate->GetStyleSheet(); } else { return SdrDragView::GetStyleSheet(); // SdrDragView::GetStyleSheet(rOk); } } sal_Bool SdrCreateView::SetStyleSheet(SfxStyleSheet* pStyleSheet, sal_Bool bDontRemoveHardAttr) { if (pAktCreate!=NULL) { pAktCreate->SetStyleSheet(pStyleSheet,bDontRemoveHardAttr); return sal_True; } else { return SdrDragView::SetStyleSheet(pStyleSheet,bDontRemoveHardAttr); } }