/* -*- 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 .
*/
class SdrHdlList; class SdrMarkView; class SdrObject; class SdrPageView; class MouseEvent;
namespace sdr::contact { class ObjectContact;
}
// Every object must be able to create its handles. They will be fetched on // selection, registered at the View and made visible. // When a handle is touched by the mouse (IsHit()), from the view the matching mouse pointer // is picked up from the handle and passed to the app (on demand) to be switched on // Handles like e.g. rotation center or the mirror axis are generated by // the view if the correct transformation mode was selected by the controller. // SdrHdlKind::Move...SdrHdlKind::LowerRight should always be consecutive in the enum!
enumclass SdrHdlKind
{
Move, // Handle to move the object
UpperLeft, // Upper left
Upper, // Upper
UpperRight, // Upper right
Left, // Left
Right, // Right
LowerLeft, // Bottom left
Lower, // Bottom
LowerRight, // Bottom right
Poly, // Select point in polygon or beziercurve
BezierWeight, // Weight of a beziercurve
Circle, // Angle to circle segment, corner radius to rectangle
Ref1, // Reference point 1, e.g. rotation center
Ref2, // Reference point 2, e.g. endpoint of mirror axis
MirrorAxis, // Mirror axis
Glue, // GluePoint
Anchor, // Anchor symbol (SD, SW)
Transparence, // Interactive transparence
Gradient, // Interactive gradient
Color, // Interactive color
User,
Anchor_TR, // #101688# Anchor handle with (0,0) at top right for SW
// for SJ and the CustomShapeHandles:
CustomShape1,
// #98388# add AnchorPressed to be able to animate anchor control, too.
AnchorPressed,
// #101688# AnchorTR for SW
AnchorTR,
AnchorPressedTR,
// for SJ and the CustomShapeHandles:
Customshape_7x7,
Customshape_9x9,
Customshape_11x11
};
class SVXCORE_DLLPUBLIC SdrHdl
{ friendclass SdrMarkView; // for the access to nObjHdlNum friendclass SdrHdlList;
protected:
SdrObject* m_pObj; // does handle belong to an object?
SdrPageView* m_pPV; // does handle belong to an object in certain pageview?
SdrHdlList* m_pHdlList; // to store the handlesize // OVERLAYMANAGER
sdr::overlay::OverlayObjectList maOverlayGroup;
Point m_aPos;
SdrHdlKind m_eKind;
Degree100 m_nRotationAngle; // turn handle or mousepointer
sal_uInt32 m_nObjHdlNum; // required by MarkView
sal_uInt32 m_nPolyNum; // Polygonpoint
sal_uInt32 m_nPPntNum; // Point number of the polygon
sal_uInt32 m_nSourceHdlNum; // still to implement
bool m_bSelect : 1; // is a polygon point selected? bool m_b1PixMore : 1; // True=handle is shown 1 pixel larger bool m_bPlusHdl : 1; // for Hld-Paint optimisation at MarkPoint/UnmarkPoint, and other ...
bool mbMoveOutside; // forces this handle to be moved outside of the selection rectangle
// create marker for this kind virtualvoid CreateB2dIAObject();
// cleanup marker if one exists void GetRidOfIAObject();
private: bool mbMouseOver; // is true if the mouse is over this handle
// Helper to support inserting a new OverlayObject. It will do all // necessary stuff involved with that: // - add GridOffset for non-linear ViewToDevice transformation (calc) // - add to OverlayManager // - add to local OverlayObjectList - ownership change (!) // It is centralized here (and protected) to avoid that new usages/ // implementations forget one of these needed steps. void insertNewlyCreatedOverlayObjectForSdrHdl(
std::unique_ptr<sdr::overlay::OverlayObject> pOverlayObject, const sdr::contact::ObjectContact& rObjectContact,
sdr::overlay::OverlayManager& rOverlayManager);
/** is called when the mouse enters the area of this handle. If the handle changes his
visualisation during mouse over it must override this method and call Touch(). */ virtualvoid onMouseEnter(const MouseEvent& rMEvt);
/** is called when help is requested for the area of this handle */ virtualvoid onHelpRequest();
/** is called when the mouse leaves the area of this handle. If the handle changes his
visualisation during mouse over it must override this method and call Touch(). */ virtualvoid onMouseLeave();
// a SdrHdlBezWgt knows about its "base handle". Its draw method // draws additionally a line from its position to the position // of the base handle class SdrHdlBezWgt final : public SdrHdl
{ public: // this is not a Copy-Ctor!!!
SdrHdlBezWgt(const SdrHdl* pRefHdl1, SdrHdlKind eNewKind=SdrHdlKind::BezierWeight) { m_eKind=eNewKind; m_pHdl1=pRefHdl1; } virtual ~SdrHdlBezWgt() override;
private: // create marker for this kind virtualvoid CreateB2dIAObject() override;
const SdrHdl* m_pHdl1;
};
class E3dVolumeMarker final : public SdrHdl
{
basegfx::B2DPolyPolygon m_aWireframePoly;
// create marker for this kind virtualvoid CreateB2dIAObject() override;
// AddHdl takes ownership of the handle. It should be on the Heap // as Clear() deletes it. void AddHdl(std::unique_ptr<SdrHdl> pHdl);
SAL_DLLPRIVATE std::unique_ptr<SdrHdl> RemoveHdl(size_t nNum); void RemoveAllByKind(SdrHdlKind eKind);
// move the ownership of all the SdrHdl to rOther void MoveTo(SdrHdlList& rOther);
// Last inserted handles are likely hit (if the handles are above each other)
SAL_DLLPRIVATE SdrHdl* IsHdlListHit(const Point& rPnt) const;
SdrHdl* GetHdl(SdrHdlKind eKind1) const;
};
class SVXCORE_DLLPUBLIC SdrCropHdl final : public SdrHdl
{ public:
SdrCropHdl( const Point& rPnt,
SdrHdlKind eNewKind, double fShearX, double fRotation);
private: // create marker for this kind virtualvoid CreateB2dIAObject() override;
BitmapEx GetBitmapForHandle( const BitmapEx& rBitmap, int nSize );
// evtl. shear and rotation, equal to the object's one to allow adaptation of // the visualization handles double mfShearX; double mfRotation;
};
class SdrCropViewHdl final : public SdrHdl
{ private:
basegfx::B2DHomMatrix maObjectTransform;
Graphic maGraphic; double mfCropLeft; double mfCropTop; double mfCropRight; double mfCropBottom;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.