diff options
Diffstat (limited to '')
-rw-r--r-- | include/svx/svddrag.hxx | 177 |
1 files changed, 177 insertions, 0 deletions
diff --git a/include/svx/svddrag.hxx b/include/svx/svddrag.hxx new file mode 100644 index 000000000..5a1d8d16a --- /dev/null +++ b/include/svx/svddrag.hxx @@ -0,0 +1,177 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * 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 . + */ + +#ifndef INCLUDED_SVX_SVDDRAG_HXX +#define INCLUDED_SVX_SVDDRAG_HXX + + +#include <tools/gen.hxx> +#include <tools/fract.hxx> +#include <svx/svxdllapi.h> + +#include <memory> +#include <vector> + +// Status information for specialized object dragging. In order for the model +// to stay status free, the status data is kept on the View +// and handed over to the object at the appropriate time as a parameter. +// This also includes the status of the operation and Interactive +// Object creation. In this case, pHdl is null. +class SdrHdl; +class SdrView; +class SdrPageView; +class SdrDragMethod; + +struct SdrDragStatUserData +{ + virtual ~SdrDragStatUserData() = 0; +}; + +class SVXCORE_DLLPUBLIC SdrDragStat final +{ + SdrHdl* pHdl; // The Handle for the User + SdrView* pView; + SdrPageView* pPageView; + std::vector<Point> mvPnts; // All previous Points: [0]=Start, [Count()-2]=Prev + Point aRef1; // Referencepoint: Resize fixed point, (axis of rotation, + Point aRef2; // axis of reflection, ...) + Point aPos0; // Position at the last Event + Point aRealNow; // Current dragging position without Snap, Ortho and Limit + tools::Rectangle aActionRect; + + bool bEndDragChangesAttributes; + bool bEndDragChangesGeoAndAttributes; + /// Table row drag: table will re-layout itself later. + bool mbEndDragChangesLayout; + bool bMouseIsUp; + + bool bShown; // Xor visible? + sal_uInt16 nMinMov; // So much has to be minimally moved first + bool bMinMoved; // MinMove surpassed? + + bool bHorFixed; // Dragging only vertical + bool bVerFixed; // Dragging only horizontal + bool bWantNoSnap; // To decide if pObj-> MovCreate () should use NoSnapPos or not. + // Therefore, NoSnapPos is written into the buffer. + bool bOrtho4; + bool bOrtho8; + + SdrDragMethod* pDragMethod; + std::unique_ptr<SdrDragStatUserData> mpUserData; // Userdata + + void Clear(); + + sal_Int32 GetPrevPos() const { return mvPnts.size()-(mvPnts.size()>1 ? 2 : 1); } + + // This is passed all the way through to ApplySpecialDrag of the Edge Object + // For LOK, we cannot really specify which gluepoint to select by default + // It selects the nearest gluepoints after DragEnd event. + // When multiple objects are on top of each other or somehow their gluepoints + // collide, the gluepoint is selected from the lowest order numbered object + // We can pass the ord number information inside the draginfo and choose the correct shape + struct { + sal_Int32 objectOrdNum = -1; + } mGlueOptions; + +public: + SdrDragStat() { Reset(); } + ~SdrDragStat(); + void Reset(); + SdrView* GetView() const { return pView; } + void SetView(SdrView* pV) { pView=pV; } + SdrPageView* GetPageView() const { return pPageView; } + void SetPageView(SdrPageView* pPV) { pPageView=pPV; } + const Point& GetPoint(sal_Int32 nNum) const { return mvPnts[nNum]; } + sal_Int32 GetPointCount() const { return mvPnts.size(); } + const Point& GetStart() const { return mvPnts[0]; } + const Point& GetPrev() const { return mvPnts[GetPrevPos()]; } + const Point& GetPos0() const { return aPos0; } + const Point& GetNow() const { return mvPnts.back(); } + void SetNow(Point const &pt) { mvPnts.back() = pt; } + const Point& GetRef1() const { return aRef1; } + void SetRef1(const Point &pt) { aRef1 = pt; } + const Point& GetRef2() const { return aRef2; } + void SetRef2(const Point &pt) { aRef2 = pt; } + const SdrHdl* GetHdl() const { return pHdl; } + void SetHdl(SdrHdl* pH) { pHdl=pH; } + SdrDragStatUserData* GetUser() const { return mpUserData.get(); } + void SetUser(std::unique_ptr<SdrDragStatUserData> pU) { mpUserData = std::move(pU); } + bool IsShown() const { return bShown; } + void SetShown(bool bOn) { bShown=bOn; } + + bool IsMinMoved() const { return bMinMoved; } + void SetMinMoved() { bMinMoved=true; } + void ResetMinMoved() { bMinMoved=false; } + void SetMinMove(sal_uInt16 nDist) { nMinMov=nDist; if (nMinMov<1) nMinMov=1; } + + bool IsHorFixed() const { return bHorFixed; } + void SetHorFixed(bool bOn) { bHorFixed=bOn; } + bool IsVerFixed() const { return bVerFixed; } + void SetVerFixed(bool bOn) { bVerFixed=bOn; } + + // Here, the object can say: "I do not want to snap to coordinates!" + // for example, the angle of the arc ... + bool IsNoSnap() const { return bWantNoSnap; } + void SetNoSnap(bool bOn = true) { bWantNoSnap=bOn; } + + // And here the Obj say which Ortho (if there is one) can be usefully applied to him. + // Ortho4 means Ortho in four directions (for Rect and CIRT) + bool IsOrtho4Possible() const { return bOrtho4; } + void SetOrtho4Possible(bool bOn = true) { bOrtho4=bOn; } + // Ortho8 means Ortho in 8 directions (for lines) + bool IsOrtho8Possible() const { return bOrtho8; } + void SetOrtho8Possible(bool bOn = true) { bOrtho8=bOn; } + + // Is set by an object that was dragged. + bool IsEndDragChangesAttributes() const { return bEndDragChangesAttributes; } + void SetEndDragChangesAttributes(bool bOn) { bEndDragChangesAttributes=bOn; } + bool IsEndDragChangesGeoAndAttributes() const { return bEndDragChangesGeoAndAttributes; } + void SetEndDragChangesGeoAndAttributes(bool bOn) { bEndDragChangesGeoAndAttributes=bOn; } + bool IsEndDragChangesLayout() const { return mbEndDragChangesLayout; } + void SetEndDragChangesLayout(bool bOn) { mbEndDragChangesLayout=bOn; } + + // Is set by the view and can be evaluated by Obj + bool IsMouseDown() const { return !bMouseIsUp; } + void SetMouseDown(bool bDown) { bMouseIsUp=!bDown; } + + void Reset(const Point& rPnt); + void NextMove(const Point& rPnt); + void NextPoint(); + void PrevPoint(); + bool CheckMinMoved(const Point& rPnt); + tools::Long GetDX() const { return GetNow().X()-GetPrev().X(); } + tools::Long GetDY() const { return GetNow().Y()-GetPrev().Y(); } + Fraction GetXFact() const; + Fraction GetYFact() const; + + SdrDragMethod* GetDragMethod() const { return pDragMethod; } + void SetDragMethod(SdrDragMethod* pMth) { pDragMethod=pMth; } + + const tools::Rectangle& GetActionRect() const { return aActionRect; } + void SetActionRect(const tools::Rectangle& rR) { aActionRect=rR; } + + // Also considering 1stPointAsCenter + void TakeCreateRect(tools::Rectangle& rRect) const; + + auto& GetGlueOptions() { return mGlueOptions; } +}; + +#endif // INCLUDED_SVX_SVDDRAG_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |