LibreOffice Module vcl (master)  1
textdat2.hxx
Go to the documentation of this file.
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3  * This file is part of the LibreOffice project.
4  *
5  * This Source Code Form is subject to the terms of the Mozilla Public
6  * License, v. 2.0. If a copy of the MPL was not distributed with this
7  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8  *
9  * This file incorporates work covered by the following license notice:
10  *
11  * Licensed to the Apache Software Foundation (ASF) under one or more
12  * contributor license agreements. See the NOTICE file distributed
13  * with this work for additional information regarding copyright
14  * ownership. The ASF licenses this file to you under the Apache
15  * License, Version 2.0 (the "License"); you may not use this file
16  * except in compliance with the License. You may obtain a copy of
17  * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18  */
19 
20 #ifndef INCLUDED_VCL_SOURCE_EDIT_TEXTDAT2_HXX
21 #define INCLUDED_VCL_SOURCE_EDIT_TEXTDAT2_HXX
22 
23 #include <vcl/seleng.hxx>
24 #include <vcl/cursor.hxx>
25 #include <vcl/idle.hxx>
26 #include <vcl/textdata.hxx>
27 
28 #include <cstddef>
29 #include <limits>
30 #include <vector>
31 
32 class TextNode;
33 class TextView;
34 
35 #define PORTIONKIND_TEXT 0
36 #define PORTIONKIND_TAB 1
37 
38 #define DELMODE_SIMPLE 0
39 #define DELMODE_RESTOFWORD 1
40 #define DELMODE_RESTOFCONTENT 2
41 
42 #define DEL_LEFT 1
43 #define DEL_RIGHT 2
44 #define TRAVEL_X_DONTKNOW 0xFFFF
45 #define MAXCHARSINPARA 0x3FFF-CHARPOSGROW
46 
47 #define LINE_SEP 0x0A
48 
50 {
51 private:
52  sal_Int32 nLen;
53  long nWidth;
56 
57 public:
58  TETextPortion( sal_Int32 nL )
59  : nLen {nL}
60  , nWidth {-1}
61  , nKind {PORTIONKIND_TEXT}
62  , bRightToLeft {false}
63  {}
64 
65  sal_Int32& GetLen() { return nLen; }
66  long& GetWidth() { return nWidth; }
67  sal_uInt8& GetKind() { return nKind; }
68  void SetRightToLeft(bool b) { bRightToLeft = b; }
69  bool IsRightToLeft() const { return bRightToLeft; }
70 };
71 
73 {
74 private:
75  std::vector<std::unique_ptr<TETextPortion>> maPortions;
76 
77 public:
78  static constexpr auto npos = std::numeric_limits<std::size_t>::max();
79 
82 
83  TETextPortion* operator[]( std::size_t nPos );
84  std::vector<std::unique_ptr<TETextPortion>>::iterator begin();
85  std::vector<std::unique_ptr<TETextPortion>>::const_iterator begin() const;
86  std::vector<std::unique_ptr<TETextPortion>>::iterator end();
87  std::vector<std::unique_ptr<TETextPortion>>::const_iterator end() const;
88  bool empty() const;
89  std::size_t size() const;
90  std::vector<std::unique_ptr<TETextPortion>>::iterator erase( const std::vector<std::unique_ptr<TETextPortion>>::iterator& aIter );
91  std::vector<std::unique_ptr<TETextPortion>>::iterator insert( const std::vector<std::unique_ptr<TETextPortion>>::iterator& aIter,
92  std::unique_ptr<TETextPortion> pTP );
93  void push_back( std::unique_ptr<TETextPortion> pTP );
94 
95  void Reset();
96  std::size_t FindPortion( sal_Int32 nCharPos, sal_Int32& rPortionStart, bool bPreferStartingPortion = false );
97  void DeleteFromPortion( std::size_t nDelFrom );
98 };
99 
101 {
102  bool const bLeftToRight;
103  sal_Int32 const nStartPos;
104  sal_Int32 const nEndPos;
105  TEWritingDirectionInfo( bool LeftToRight, sal_Int32 Start, sal_Int32 End )
106  : bLeftToRight {LeftToRight}
107  , nStartPos {Start}
108  , nEndPos {End}
109  {}
110 };
111 
112 class TextLine
113 {
114 private:
115  sal_Int32 mnStart;
116  sal_Int32 mnEnd;
117  std::size_t mnStartPortion;
118  std::size_t mnEndPortion;
119 
120  short mnStartX;
121 
122  bool mbInvalid; // for clever formatting/output
123 
124 public:
126  : mnStart {0}
127  , mnEnd {0}
128  , mnStartPortion {0}
129  , mnEndPortion {0}
130  , mnStartX {0}
131  , mbInvalid {true}
132  {}
133 
134  bool IsIn( sal_Int32 nIndex, bool bInclEnd ) const
135  { return nIndex >= mnStart && ( bInclEnd ? nIndex <= mnEnd : nIndex < mnEnd ); }
136 
137  void SetStart( sal_Int32 n ) { mnStart = n; }
138  sal_Int32 GetStart() const { return mnStart; }
139 
140  void SetEnd( sal_Int32 n ) { mnEnd = n; }
141  sal_Int32 GetEnd() const { return mnEnd; }
142 
143  void SetStartPortion( std::size_t n ) { mnStartPortion = n; }
144  std::size_t GetStartPortion() const { return mnStartPortion; }
145 
146  void SetEndPortion( std::size_t n ) { mnEndPortion = n; }
147  std::size_t GetEndPortion() const { return mnEndPortion; }
148 
149  sal_Int32 GetLen() const { return mnEnd - mnStart; }
150 
151  bool IsInvalid() const { return mbInvalid; }
152  bool IsValid() const { return !mbInvalid; }
153  void SetInvalid() { mbInvalid = true; }
154  void SetValid() { mbInvalid = false; }
155 
156  short GetStartX() const { return mnStartX; }
157  void SetStartX( short n ) { mnStartX = n; }
158 
159  inline bool operator == ( const TextLine& rLine ) const;
160 };
161 
162 inline bool TextLine::operator == ( const TextLine& rLine ) const
163 {
164  return mnStart == rLine.mnStart &&
165  mnEnd == rLine.mnEnd &&
166  mnStartPortion == rLine.mnStartPortion &&
167  mnEndPortion == rLine.mnEndPortion;
168 }
169 
171 {
172 private:
173  TextNode* const mpNode;
174 
175  std::vector<TextLine> maLines;
177  std::vector<TEWritingDirectionInfo> maWritingDirectionInfos;
178 
179  sal_Int32 mnInvalidPosStart;
180  sal_Int32 mnInvalidDiff;
181 
182  bool mbInvalid;
183  bool mbSimple; // only type linearly
184 
185 public:
186  TEParaPortion( TextNode* pNode );
187  ~TEParaPortion();
188 
189  TEParaPortion( const TEParaPortion& ) = delete;
190  void operator=( const TEParaPortion& ) = delete;
191 
192  bool IsInvalid() const { return mbInvalid; }
193  bool IsSimpleInvalid() const { return mbSimple; }
194  void SetNotSimpleInvalid() { mbSimple = false; }
195  void SetValid() { mbInvalid = false; mbSimple = true;}
196 
197  void MarkInvalid( sal_Int32 nStart, sal_Int32 nDiff );
198  void MarkSelectionInvalid( sal_Int32 nStart );
199 
200  sal_Int32 GetInvalidPosStart() const { return mnInvalidPosStart; }
201  sal_Int32 GetInvalidDiff() const { return mnInvalidDiff; }
202 
203  TextNode* GetNode() const { return mpNode; }
204  std::vector<TextLine>& GetLines() { return maLines; }
206  std::vector<TEWritingDirectionInfo>& GetWritingDirectionInfos() { return maWritingDirectionInfos; }
207 
208  std::vector<TextLine>::size_type GetLineNumber( sal_Int32 nIndex, bool bInclEnd );
209  void CorrectValuesBehindLastFormattedLine( sal_uInt16 nLastFormattedLine );
210 };
211 
213 {
214 private:
215  std::vector<std::unique_ptr<TEParaPortion>> mvData;
216 
217 public:
218  TEParaPortions() : mvData() {}
219  ~TEParaPortions();
220 
221  sal_uInt32 Count() const { return static_cast<sal_uInt32>(mvData.size()); }
222  TEParaPortion* GetObject( sal_uInt32 nIndex ) { return mvData[nIndex].get(); }
223  void Insert( TEParaPortion* pObject, sal_uInt32 nPos ) { mvData.emplace( mvData.begin()+nPos, pObject ); }
224  void Remove( sal_uInt32 nPos ) { mvData.erase( mvData.begin()+nPos ); }
225 };
226 
228 {
229 private:
231 
232 public:
233  TextSelFunctionSet( TextView* pView );
234 
235  virtual void BeginDrag() override;
236 
237  virtual void CreateAnchor() override;
238 
239  virtual void SetCursorAtPoint( const Point& rPointPixel, bool bDontSelectAtCursor = false ) override;
240 
241  virtual bool IsSelectionAtPoint( const Point& rPointPixel ) override;
242  virtual void DeselectAll() override;
243 
244  virtual void DeselectAtPoint( const Point& ) override;
245  virtual void DestroyAnchor() override;
246 };
247 
248 class IdleFormatter : public Idle
249 {
250 private:
252  sal_uInt16 mnRestarts;
253 
254 public:
255  IdleFormatter();
256  virtual ~IdleFormatter() override;
257 
258  void DoIdleFormat( TextView* pV, sal_uInt16 nMaxRestarts );
259  void ForceTimeout();
260  TextView* GetView() { return mpView; }
261 };
262 
264 {
267 
270 
272  : maCursor()
273  , maDropPos()
274  , mbStarterOfDD {false}
275  , mbVisCursor {false}
276  {
277  maCursor.SetStyle( CURSOR_SHADOW );
278  }
279 };
280 
281 #endif // INCLUDED_VCL_SOURCE_EDIT_TEXTDAT2_HXX
282 
283 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
std::vector< std::unique_ptr< TEParaPortion > > mvData
Definition: textdat2.hxx:215
virtual void DestroyAnchor() override
Definition: textview.cxx:2139
virtual ~IdleFormatter() override
Definition: textdata.cxx:277
TextNode *const mpNode
Definition: textdat2.hxx:173
std::size_t GetStartPortion() const
Definition: textdat2.hxx:144
TETextPortion * operator[](std::size_t nPos)
Definition: textdata.cxx:63
TextSelFunctionSet(TextView *pView)
Definition: textview.cxx:2099
sal_Int32 GetInvalidDiff() const
Definition: textdat2.hxx:201
std::vector< std::unique_ptr< TETextPortion > >::iterator insert(const std::vector< std::unique_ptr< TETextPortion >>::iterator &aIter, std::unique_ptr< TETextPortion > pTP)
Definition: textdata.cxx:103
bool mbVisCursor
Definition: textdat2.hxx:269
TextView * mpView
Definition: textdat2.hxx:251
std::size_t mnStartPortion
Definition: textdat2.hxx:117
TETextPortion(sal_Int32 nL)
Definition: textdat2.hxx:58
sal_Int32 GetLen() const
Definition: textdat2.hxx:149
std::vector< std::unique_ptr< TETextPortion > >::iterator begin()
Definition: textdata.cxx:68
void SetNotSimpleInvalid()
Definition: textdat2.hxx:194
short mnStartX
Definition: textdat2.hxx:120
TEParaPortion * GetObject(sal_uInt32 nIndex)
Definition: textdat2.hxx:222
TextView * mpView
Definition: textdat2.hxx:230
void SetStart(sal_Int32 n)
Definition: textdat2.hxx:137
sal_Int32 mnInvalidDiff
Definition: textdat2.hxx:180
bool IsSimpleInvalid() const
Definition: textdat2.hxx:193
bool IsRightToLeft() const
Definition: textdat2.hxx:69
void SetEndPortion(std::size_t n)
Definition: textdat2.hxx:146
sal_uInt32 Count() const
Definition: textdat2.hxx:221
long & GetWidth()
Definition: textdat2.hxx:66
bool operator==(const TextLine &rLine) const
Definition: textdat2.hxx:162
virtual void SetCursorAtPoint(const Point &rPointPixel, bool bDontSelectAtCursor=false) override
Definition: textview.cxx:2119
sal_Int32 mnInvalidPosStart
Definition: textdat2.hxx:179
bool IsInvalid() const
Definition: textdat2.hxx:192
TextView * GetView()
Definition: textdat2.hxx:260
std::vector< std::unique_ptr< TETextPortion > >::iterator end()
Definition: textdata.cxx:78
std::vector< TextLine > maLines
Definition: textdat2.hxx:175
static constexpr auto npos
Definition: textdat2.hxx:78
bool IsInvalid() const
Definition: textdat2.hxx:151
void CorrectValuesBehindLastFormattedLine(sal_uInt16 nLastFormattedLine)
Definition: textdata.cxx:231
TEParaPortion(TextNode *pNode)
Definition: textdata.cxx:147
void ForceTimeout()
Definition: textdata.cxx:300
#define CURSOR_SHADOW
Definition: cursor.hxx:36
bool IsIn(sal_Int32 nIndex, bool bInclEnd) const
Definition: textdat2.hxx:134
void SetStyle(sal_uInt16 nStyle)
Definition: cursor.cxx:353
bool empty() const
Definition: textdata.cxx:88
void Remove(sal_uInt32 nPos)
Definition: textdat2.hxx:224
sal_Int32 GetEnd() const
Definition: textdat2.hxx:141
TETextPortionList maTextPortions
Definition: textdat2.hxx:176
sal_Int32 mnEnd
Definition: textdat2.hxx:116
void SetRightToLeft(bool b)
Definition: textdat2.hxx:68
sal_uInt8 & GetKind()
Definition: textdat2.hxx:67
sal_Int32 & GetLen()
Definition: textdat2.hxx:65
sal_uInt8 nKind
Definition: textdat2.hxx:54
void MarkInvalid(sal_Int32 nStart, sal_Int32 nDiff)
Definition: textdata.cxx:160
void SetValid()
Definition: textdat2.hxx:195
virtual void CreateAnchor() override
Definition: textview.cxx:2108
vcl::Cursor maCursor
Definition: textdat2.hxx:265
sal_uInt16 mnRestarts
Definition: textdat2.hxx:252
std::vector< std::unique_ptr< TETextPortion > > maPortions
Definition: textdat2.hxx:75
void MarkSelectionInvalid(sal_Int32 nStart)
Definition: textdata.cxx:195
virtual bool IsSelectionAtPoint(const Point &rPointPixel) override
Definition: textview.cxx:2124
void operator=(const TEParaPortion &)=delete
bool bRightToLeft
Definition: textdat2.hxx:55
bool mbInvalid
Definition: textdat2.hxx:122
void DoIdleFormat(TextView *pV, sal_uInt16 nMaxRestarts)
Definition: textdata.cxx:282
virtual void BeginDrag() override
Definition: textview.cxx:2104
sal_Int32 mnStart
Definition: textdat2.hxx:115
bool IsValid() const
Definition: textdat2.hxx:152
void SetEnd(sal_Int32 n)
Definition: textdat2.hxx:140
std::vector< TextLine >::size_type GetLineNumber(sal_Int32 nIndex, bool bInclEnd)
Definition: textdata.cxx:213
std::size_t FindPortion(sal_Int32 nCharPos, sal_Int32 &rPortionStart, bool bPreferStartingPortion=false)
Definition: textdata.cxx:125
void DeleteFromPortion(std::size_t nDelFrom)
Definition: textdata.cxx:119
TextPaM maDropPos
Definition: textdat2.hxx:266
short GetStartX() const
Definition: textdat2.hxx:156
void SetStartPortion(std::size_t n)
Definition: textdat2.hxx:143
sal_Int32 nLen
Definition: textdat2.hxx:52
std::vector< TEWritingDirectionInfo > & GetWritingDirectionInfos()
Definition: textdat2.hxx:206
virtual void DeselectAtPoint(const Point &) override
Definition: textview.cxx:2134
unsigned char sal_uInt8
std::vector< TEWritingDirectionInfo > maWritingDirectionInfos
Definition: textdat2.hxx:177
sal_Int32 const nEndPos
Definition: textdat2.hxx:104
void push_back(std::unique_ptr< TETextPortion > pTP)
Definition: textdata.cxx:109
std::size_t mnEndPortion
Definition: textdat2.hxx:118
std::size_t size() const
Definition: textdata.cxx:93
void SetStartX(short n)
Definition: textdat2.hxx:157
TextNode * GetNode() const
Definition: textdat2.hxx:203
void SetInvalid()
Definition: textdat2.hxx:153
virtual void DeselectAll() override
Definition: textview.cxx:2129
sal_Int32 GetStart() const
Definition: textdat2.hxx:138
sal_Int32 GetInvalidPosStart() const
Definition: textdat2.hxx:200
std::vector< std::unique_ptr< TETextPortion > >::iterator erase(const std::vector< std::unique_ptr< TETextPortion >>::iterator &aIter)
Definition: textdata.cxx:98
TETextPortionList & GetTextPortions()
Definition: textdat2.hxx:205
TEWritingDirectionInfo(bool LeftToRight, sal_Int32 Start, sal_Int32 End)
Definition: textdat2.hxx:105
std::size_t GetEndPortion() const
Definition: textdat2.hxx:147
std::vector< TextLine > & GetLines()
Definition: textdat2.hxx:204
An idle is a timer to be scheduled immediately.
Definition: idle.hxx:30
bool const bLeftToRight
Definition: textdat2.hxx:102
bool mbStarterOfDD
Definition: textdat2.hxx:268
void SetValid()
Definition: textdat2.hxx:154
#define PORTIONKIND_TEXT
Definition: textdat2.hxx:35
void Insert(TEParaPortion *pObject, sal_uInt32 nPos)
Definition: textdat2.hxx:223
sal_Int32 const nStartPos
Definition: textdat2.hxx:103