diff options
author | Noel Grandin <noelgrandin@gmail.com> | 2021-08-08 21:08:37 +0200 |
---|---|---|
committer | Noel Grandin <noel.grandin@collabora.co.uk> | 2021-08-08 22:32:12 +0200 |
commit | 2c1ae17421af0fc0e398b66bc2a07f27977a5bf0 (patch) | |
tree | 3280843e618053ff16d8e8be9a4baf40cd42bb88 /include/vcl/ctrl.hxx | |
parent | 12dd1ce1dddc4ebad6be94ddec167cc7f6c45fe3 (diff) |
no need to allocate ControlLayoutData separately
Change-Id: I239befdaa05beea5200c81f23d0af861c9fc3baa
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/120177
Tested-by: Jenkins
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
Diffstat (limited to 'include/vcl/ctrl.hxx')
-rw-r--r-- | include/vcl/ctrl.hxx | 55 |
1 files changed, 52 insertions, 3 deletions
diff --git a/include/vcl/ctrl.hxx b/include/vcl/ctrl.hxx index cde59c6f9e0f..a6797cc734bb 100644 --- a/include/vcl/ctrl.hxx +++ b/include/vcl/ctrl.hxx @@ -20,19 +20,68 @@ #ifndef INCLUDED_VCL_CTRL_HXX #define INCLUDED_VCL_CTRL_HXX +#include <rtl/ustring.hxx> #include <tools/link.hxx> +#include <tools/gen.hxx> #include <vcl/dllapi.h> #include <vcl/window.hxx> -#include <memory> +#include <optional> +#include <vector> // forward class StyleSettings; -namespace vcl { struct ControlLayoutData; } +class Control; + +namespace vcl +{ + +struct VCL_DLLPUBLIC ControlLayoutData +{ + // contains the string really displayed + // there must be exactly one bounding rectangle in m_aUnicodeBoundRects + // for every character in m_aDisplayText + OUString m_aDisplayText; + // the bounding rectangle of every character + // where one character may consist of many glyphs + std::vector< tools::Rectangle > m_aUnicodeBoundRects; + // start indices of lines + std::vector< tools::Long > m_aLineIndices; + // notify parent control on destruction + VclPtr<const Control> m_pParent; + + ControlLayoutData(); + ~ControlLayoutData(); + + tools::Rectangle GetCharacterBounds( tools::Long nIndex ) const; + // returns the character index for corresponding to rPoint (in control coordinates) + // -1 is returned if no character is at that point + tools::Long GetIndexForPoint( const Point& rPoint ) const; + // returns the number of lines in the result of GetDisplayText() + tools::Long GetLineCount() const; + // returns the interval [start,end] of line nLine + // returns [-1,-1] for an invalid line + ::Pair GetLineStartEnd( tools::Long nLine ) const; + /** ToRelativeLineIndex changes a layout data index to a count relative to its line. + + This is equivalent to getting the line start/end pairs with + GetLineStartEnd until the index lies within [start,end] of a line + + @param nIndex + the absolute index inside the display text to be changed to a relative index + + @returns + the relative index inside the displayed line or -1 if the absolute index does + not match any line + */ + tools::Long ToRelativeLineIndex( tools::Long nIndex ) const; +}; + +} // namespace vcl class VCL_DLLPUBLIC Control : public vcl::Window { protected: - mutable std::unique_ptr<vcl::ControlLayoutData> mpLayoutData; + mutable std::optional<vcl::ControlLayoutData> mxLayoutData; VclPtr<OutputDevice> mpReferenceDevice; private: |