1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 25 #ifndef _TEXTDAT2_HXX 26 #define _TEXTDAT2_HXX 27 28 #include <svl/svarray.hxx> 29 #include <tools/list.hxx> 30 #include <vcl/seleng.hxx> 31 #include <vcl/virdev.hxx> 32 #include <vcl/cursor.hxx> 33 34 class TextNode; 35 class TextView; 36 37 #define PORTIONKIND_TEXT 0 38 #define PORTIONKIND_TAB 1 39 40 #define DELMODE_SIMPLE 0 41 #define DELMODE_RESTOFWORD 1 42 #define DELMODE_RESTOFCONTENT 2 43 44 #define DEL_LEFT 1 45 #define DEL_RIGHT 2 46 #define TRAVEL_X_DONTKNOW 0xFFFF 47 #define MAXCHARSINPARA 0x3FFF-CHARPOSGROW 48 49 #define LINE_SEP 0x0A 50 51 52 class TETextPortion 53 { 54 private: 55 sal_uInt16 nLen; 56 long nWidth; 57 sal_uInt8 nKind; 58 sal_uInt8 nRightToLeft; 59 60 TETextPortion() { nLen = 0; nKind = PORTIONKIND_TEXT; nWidth = -1; nRightToLeft = 0;} 61 62 public: 63 TETextPortion( sal_uInt16 nL ) { 64 nLen = nL; 65 nKind = PORTIONKIND_TEXT; 66 nWidth= -1; 67 nRightToLeft = 0; 68 } 69 70 sal_uInt16 GetLen() const { return nLen; } 71 sal_uInt16& GetLen() { return nLen; } 72 73 long GetWidth()const { return nWidth; } 74 long& GetWidth() { return nWidth; } 75 76 sal_uInt8 GetKind() const { return nKind; } 77 sal_uInt8& GetKind() { return nKind; } 78 79 sal_uInt8 GetRightToLeft() const { return nRightToLeft; } 80 sal_uInt8& GetRightToLeft() { return nRightToLeft; } 81 sal_Bool IsRightToLeft() const { return (nRightToLeft&1); } 82 83 sal_Bool HasValidSize() const { return nWidth != (-1); } 84 }; 85 86 87 88 typedef TETextPortion* TextPortionPtr; 89 SV_DECL_PTRARR( TextPortionArray, TextPortionPtr, 0, 8 ) 90 91 class TETextPortionList : public TextPortionArray 92 { 93 public: 94 TETextPortionList(); 95 ~TETextPortionList(); 96 97 void Reset(); 98 sal_uInt16 FindPortion( sal_uInt16 nCharPos, sal_uInt16& rPortionStart, sal_Bool bPreferStartingPortion = sal_False ); 99 sal_uInt16 GetPortionStartIndex( sal_uInt16 nPortion ); 100 void DeleteFromPortion( sal_uInt16 nDelFrom ); 101 }; 102 103 struct TEWritingDirectionInfo 104 { 105 sal_uInt8 nType; 106 sal_uInt16 nStartPos; 107 sal_uInt16 nEndPos; 108 TEWritingDirectionInfo( sal_uInt8 _Type, sal_uInt16 _Start, sal_uInt16 _End ) 109 { 110 nType = _Type; 111 nStartPos = _Start; 112 nEndPos = _End; 113 } 114 }; 115 116 SV_DECL_VARARR( TEWritingDirectionInfos, TEWritingDirectionInfo, 0, 4 ) 117 118 class TextLine 119 { 120 private: 121 sal_uInt16 mnStart; 122 sal_uInt16 mnEnd; 123 sal_uInt16 mnStartPortion; 124 sal_uInt16 mnEndPortion; 125 126 short mnStartX; 127 128 sal_Bool mbInvalid; // fuer geschickte Formatierung/Ausgabe 129 130 public: 131 TextLine() { 132 mnStart = mnEnd = 0; 133 mnStartPortion = mnEndPortion = 0; 134 mnStartX = 0; 135 mbInvalid = sal_True; 136 } 137 138 sal_Bool IsIn( sal_uInt16 nIndex ) const 139 { return ( (nIndex >= mnStart ) && ( nIndex < mnEnd ) ); } 140 141 sal_Bool IsIn( sal_uInt16 nIndex, sal_Bool bInclEnd ) const 142 { return ( ( nIndex >= mnStart ) && ( bInclEnd ? ( nIndex <= mnEnd ) : ( nIndex < mnEnd ) ) ); } 143 144 void SetStart( sal_uInt16 n ) { mnStart = n; } 145 sal_uInt16 GetStart() const { return mnStart; } 146 sal_uInt16& GetStart() { return mnStart; } 147 148 void SetEnd( sal_uInt16 n ) { mnEnd = n; } 149 sal_uInt16 GetEnd() const { return mnEnd; } 150 sal_uInt16& GetEnd() { return mnEnd; } 151 152 void SetStartPortion( sal_uInt16 n ) { mnStartPortion = n; } 153 sal_uInt16 GetStartPortion() const { return mnStartPortion; } 154 sal_uInt16& GetStartPortion() { return mnStartPortion; } 155 156 void SetEndPortion( sal_uInt16 n ) { mnEndPortion = n; } 157 sal_uInt16 GetEndPortion() const { return mnEndPortion; } 158 sal_uInt16& GetEndPortion() { return mnEndPortion; } 159 160 sal_uInt16 GetLen() const { return mnEnd - mnStart; } 161 162 sal_Bool IsInvalid() const { return mbInvalid; } 163 sal_Bool IsValid() const { return !mbInvalid; } 164 void SetInvalid() { mbInvalid = sal_True; } 165 void SetValid() { mbInvalid = sal_False; } 166 167 sal_Bool IsEmpty() const { return (mnEnd > mnStart) ? sal_False : sal_True; } 168 169 short GetStartX() const { return mnStartX; } 170 void SetStartX( short n ) { mnStartX = n; } 171 172 inline sal_Bool operator == ( const TextLine& rLine ) const; 173 inline sal_Bool operator != ( const TextLine& rLine ) const; 174 }; 175 176 typedef TextLine* TextLinePtr; 177 SV_DECL_PTRARR_DEL( TextLines, TextLinePtr, 1, 4 ) 178 179 inline sal_Bool TextLine::operator == ( const TextLine& rLine ) const 180 { 181 return ( ( mnStart == rLine.mnStart ) && 182 ( mnEnd == rLine.mnEnd ) && 183 ( mnStartPortion == rLine.mnStartPortion ) && 184 ( mnEndPortion == rLine.mnEndPortion ) ); 185 } 186 187 inline sal_Bool TextLine::operator != ( const TextLine& rLine ) const 188 { 189 return !( *this == rLine ); 190 } 191 192 193 194 class TEParaPortion 195 { 196 private: 197 TextNode* mpNode; 198 199 TextLines maLines; 200 TETextPortionList maTextPortions; 201 TEWritingDirectionInfos maWritingDirectionInfos; 202 203 204 sal_uInt16 mnInvalidPosStart; 205 short mnInvalidDiff; 206 207 sal_Bool mbInvalid; 208 sal_Bool mbSimple; // nur lineares Tippen 209 210 211 TEParaPortion( const TEParaPortion& ) {;} 212 213 public: 214 TEParaPortion( TextNode* pNode ); 215 ~TEParaPortion(); 216 217 218 sal_Bool IsInvalid() const { return mbInvalid; } 219 sal_Bool IsSimpleInvalid() const { return mbSimple; } 220 void SetNotSimpleInvalid() { mbSimple = sal_False; } 221 void SetValid() { mbInvalid = sal_False; mbSimple = sal_True;} 222 223 void MarkInvalid( sal_uInt16 nStart, short nDiff); 224 void MarkSelectionInvalid( sal_uInt16 nStart, sal_uInt16 nEnd ); 225 226 sal_uInt16 GetInvalidPosStart() const { return mnInvalidPosStart; } 227 short GetInvalidDiff() const { return mnInvalidDiff; } 228 229 TextNode* GetNode() const { return mpNode; } 230 TextLines& GetLines() { return maLines; } 231 TETextPortionList& GetTextPortions() { return maTextPortions; } 232 TEWritingDirectionInfos& GetWritingDirectionInfos() { return maWritingDirectionInfos; } 233 234 235 sal_uInt16 GetLineNumber( sal_uInt16 nIndex, sal_Bool bInclEnd ); 236 void CorrectValuesBehindLastFormattedLine( sal_uInt16 nLastFormattedLine ); 237 }; 238 239 240 class TEParaPortions : public ToolsList<TEParaPortion*> 241 { 242 public: 243 TEParaPortions(); 244 ~TEParaPortions(); 245 void Reset(); 246 }; 247 248 249 class TextSelFunctionSet: public FunctionSet 250 { 251 private: 252 TextView* mpView; 253 254 public: 255 TextSelFunctionSet( TextView* pView ); 256 257 virtual void BeginDrag(); 258 259 virtual void CreateAnchor(); 260 261 virtual sal_Bool SetCursorAtPoint( const Point& rPointPixel, sal_Bool bDontSelectAtCursor = sal_False ); 262 263 virtual sal_Bool IsSelectionAtPoint( const Point& rPointPixel ); 264 virtual void DeselectAll(); 265 266 virtual void DeselectAtPoint( const Point& ); 267 virtual void DestroyAnchor(); 268 }; 269 270 271 class IdleFormatter : public Timer 272 { 273 private: 274 TextView* mpView; 275 sal_uInt16 mnRestarts; 276 277 public: 278 IdleFormatter(); 279 ~IdleFormatter(); 280 281 void DoIdleFormat( TextView* pV, sal_uInt16 nMaxRestarts ); 282 void ForceTimeout(); 283 TextView* GetView() { return mpView; } 284 }; 285 286 struct TextDDInfo 287 { 288 Cursor maCursor; 289 TextPaM maDropPos; 290 291 sal_Bool mbStarterOfDD; 292 sal_Bool mbVisCursor; 293 294 TextDDInfo() 295 { 296 maCursor.SetStyle( CURSOR_SHADOW ); 297 mbStarterOfDD = sal_False; 298 mbVisCursor = sal_False; 299 } 300 }; 301 302 #endif // _TEXTDAT2_HXX 303