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 #ifndef _TEXTENG_HXX 24 #define _TEXTENG_HXX 25 26 #include "svtools/svtdllapi.h" 27 28 class TextDoc; 29 class TextView; 30 class TextPaM; 31 class TextSelection; 32 class TextViews; 33 class TEParaPortions; 34 class TextAttrib; 35 class TextCharAttrib; 36 class TextUndo; 37 class TextUndoManager; 38 class EditSelFunctionSet; 39 class EditSelEngine; 40 class IdleFormatter; 41 class TextNode; 42 class OutputDevice; 43 class SfxUndoAction; 44 class KeyEvent; 45 class Timer; 46 47 namespace svl 48 { 49 class IUndoManager; 50 } 51 52 class TextLine; 53 class TETextPortion; 54 #include <svl/brdcst.hxx> 55 #include <tools/link.hxx> 56 #include <vcl/font.hxx> 57 #include <tools/string.hxx> 58 #include <tools/gen.hxx> 59 60 #ifndef _COM_SUN_STAR_LOCALE_LOCALE_HPP_ 61 #include <com/sun/star/lang/Locale.hpp> 62 #endif 63 #include <com/sun/star/uno/Reference.hxx> 64 65 struct TEIMEInfos; 66 class SvtCTLOptions; 67 68 namespace com { 69 namespace sun { 70 namespace star { 71 namespace i18n { 72 class XBreakIterator; 73 class XExtendedInputSequenceChecker; 74 }}}} 75 76 class LocaleDataWrapper; 77 78 enum TxtAlign { TXTALIGN_LEFT, TXTALIGN_CENTER, TXTALIGN_RIGHT }; 79 80 class SVT_DLLPUBLIC TextEngine : public SfxBroadcaster 81 { 82 friend class TextView; 83 friend class TextSelFunctionSet; 84 friend class ExtTextEngine; 85 friend class ExtTextView; 86 87 friend class TextUndo; 88 friend class TextUndoManager; 89 friend class TextUndoDelPara; 90 friend class TextUndoConnectParas; 91 friend class TextUndoSplitPara; 92 friend class TextUndoInsertChars; 93 friend class TextUndoRemoveChars; 94 friend class TextUndoSetAttribs; 95 96 private: 97 TextDoc* mpDoc; 98 TEParaPortions* mpTEParaPortions; 99 OutputDevice* mpRefDev; 100 101 TextViews* mpViews; 102 TextView* mpActiveView; 103 104 TextUndoManager* mpUndoManager; 105 106 IdleFormatter* mpIdleFormatter; 107 108 TEIMEInfos* mpIMEInfos; 109 110 ::com::sun::star::lang::Locale maLocale; 111 ::com::sun::star::uno::Reference< ::com::sun::star::i18n::XBreakIterator > mxBreakIterator; 112 113 Rectangle maInvalidRec; 114 Range maInvalidRange; 115 116 LocaleDataWrapper* mpLocaleDataWrapper; 117 118 Font maFont; 119 Color maTextColor; 120 sal_uInt16 mnCharHeight; 121 sal_uInt16 mnFixCharWidth100; 122 123 sal_uLong mnMaxTextLen; 124 sal_uLong mnMaxTextWidth; 125 sal_uLong mnCurTextWidth; 126 sal_uLong mnCurTextHeight; 127 sal_uLong mnDefTab; 128 129 TxtAlign meAlign; 130 131 sal_Bool mbIsFormatting : 1; // Semaphore wegen der Hook's 132 sal_Bool mbFormatted : 1; 133 sal_Bool mbUpdate : 1; 134 sal_Bool mbModified : 1; 135 sal_Bool mbUndoEnabled : 1; 136 sal_Bool mbIsInUndo : 1; 137 sal_Bool mbDowning : 1; 138 sal_Bool mbRightToLeft : 1; 139 sal_Bool mbHasMultiLineParas : 1; 140 141 TextEngine( const TextEngine& ) : SfxBroadcaster() {} 142 TextEngine& operator=( const TextEngine& ) { return *this; } 143 144 protected: 145 146 void CursorMoved( sal_uLong nNode ); 147 void TextModified(); 148 149 void ImpInitDoc(); 150 void ImpRemoveText(); 151 TextPaM ImpDeleteText( const TextSelection& rSel ); 152 TextPaM ImpInsertText( const TextSelection& rSel, sal_Unicode c, sal_Bool bOverwrite = sal_False ); 153 TextPaM ImpInsertText( const TextSelection& rSel, const String& rText ); 154 TextPaM ImpInsertParaBreak( const TextSelection& rTextSelection, sal_Bool bKeepEndingAttribs = sal_True ); 155 TextPaM ImpInsertParaBreak( const TextPaM& rPaM, sal_Bool bKeepEndingAttribs = sal_True ); 156 void ImpRemoveChars( const TextPaM& rPaM, sal_uInt16 nChars, SfxUndoAction* pCurUndo = 0 ); 157 TextPaM ImpConnectParagraphs( sal_uLong nLeft, sal_uLong nRight ); 158 void ImpRemoveParagraph( sal_uLong nPara ); 159 void ImpInitWritingDirections( sal_uLong nPara ); 160 LocaleDataWrapper* ImpGetLocaleDataWrapper(); 161 162 // to remain compatible in the minor release we copy the above ImpInsertText 163 // function and add the extra parameter we need but make sure this function 164 // gets not exported. First and seconf parameter swapped to have a different signatur. 165 SAL_DLLPRIVATE TextPaM ImpInsertText( sal_Unicode c, const TextSelection& rSel, sal_Bool bOverwrite = sal_False, sal_Bool bIsUserInput = sal_False ); 166 // some other new functions needed that must not be exported to remain compatible 167 SAL_DLLPRIVATE ::com::sun::star::uno::Reference < ::com::sun::star::i18n::XExtendedInputSequenceChecker > GetInputSequenceChecker() const; 168 SAL_DLLPRIVATE sal_Bool IsInputSequenceCheckingRequired( sal_Unicode c, const TextSelection& rCurSel ) const; 169 170 // Broadcasten bzw. Selektionen anpassen: 171 void ImpParagraphInserted( sal_uLong nPara ); 172 void ImpParagraphRemoved( sal_uLong nPara ); 173 void ImpCharsRemoved( sal_uLong nPara, sal_uInt16 nPos, sal_uInt16 nChars ); 174 void ImpCharsInserted( sal_uLong nPara, sal_uInt16 nPos, sal_uInt16 nChars ); 175 void ImpFormattingParagraph( sal_uLong nPara ); 176 void ImpTextHeightChanged(); 177 void ImpTextFormatted(); 178 179 DECL_LINK( IdleFormatHdl, Timer * ); 180 void CheckIdleFormatter(); 181 void IdleFormatAndUpdate( TextView* pCurView = 0, sal_uInt16 nMaxTimerRestarts = 5 ); 182 183 sal_Bool CreateLines( sal_uLong nPara ); 184 void CreateAndInsertEmptyLine( sal_uLong nPara ); 185 void ImpBreakLine( sal_uLong nPara, TextLine* pLine, TETextPortion* pPortion, sal_uInt16 nPortionStart, long nRemainingWidth ); 186 sal_uInt16 SplitTextPortion( sal_uLong nPara, sal_uInt16 nPos ); 187 void CreateTextPortions( sal_uLong nPara, sal_uInt16 nStartPos ); 188 void RecalcTextPortion( sal_uLong nPara, sal_uInt16 nStartPos, short nNewChars ); 189 void SeekCursor( sal_uLong nNode, sal_uInt16 nPos, Font& rFont, OutputDevice* pOutDev ); 190 191 void FormatDoc(); 192 void FormatFullDoc(); 193 void FormatAndUpdate( TextView* pCurView = 0 ); 194 sal_Bool IsFormatting() const { return mbIsFormatting; } 195 void UpdateViews( TextView* pCurView = 0 ); 196 void SetUpdateMode( sal_Bool bUp, TextView* pCurView, sal_Bool bForceUpdate ); 197 198 void ImpPaint( OutputDevice* pOut, const Point& rStartPos, Rectangle const* pPaintArea, TextSelection const* pPaintRange = 0, TextSelection const* pSelection = 0 ); 199 200 void UpdateSelections(); 201 202 sal_Bool IsFormatted() const { return mbFormatted; } 203 204 sal_uInt16 GetCharPos( sal_uLong nPara, sal_uInt16 nLine, long nDocPosX, sal_Bool bSmart = sal_False ); 205 Rectangle GetEditCursor( const TextPaM& rPaM, sal_Bool bSpecial, sal_Bool bPreferPortionStart = sal_False ); 206 sal_uInt16 ImpFindIndex( sal_uLong nPortion, const Point& rPosInPara, sal_Bool bSmart ); 207 long ImpGetPortionXOffset( sal_uLong nPara, TextLine* pLine, sal_uInt16 nTextPortion ); 208 long ImpGetXPos( sal_uLong nPara, TextLine* pLine, sal_uInt16 nIndex, sal_Bool bPreferPortionStart = sal_False ); 209 long ImpGetOutputOffset( sal_uLong nPara, TextLine* pLine, sal_uInt16 nIndex, sal_uInt16 nIndex2 ); 210 sal_uInt8 ImpGetRightToLeft( sal_uLong nPara, sal_uInt16 nPos, sal_uInt16* pStart = NULL, sal_uInt16* pEnd = NULL ); 211 void ImpInitLayoutMode( OutputDevice* pOutDev, sal_Bool bDrawingR2LPortion = sal_False ); 212 TxtAlign ImpGetAlign() const; 213 214 sal_uLong CalcTextHeight(); 215 sal_uLong CalcParaHeight( sal_uLong nParagraph ) const; 216 sal_uLong CalcTextWidth( sal_uLong nPara ); 217 sal_uLong CalcTextWidth( sal_uLong nPara, sal_uInt16 nPortionStart, sal_uInt16 nPortionLen, const Font* pFont = 0 ); 218 Range GetInvalidYOffsets( sal_uLong nPortion ); 219 220 // Fuer Undo/Redo 221 void InsertContent( TextNode* pNode, sal_uLong nPara ); 222 TextPaM SplitContent( sal_uLong nNode, sal_uInt16 nSepPos ); 223 TextPaM ConnectContents( sal_uLong nLeftNode ); 224 225 // Ans API uebergebene PaM's und Selektionen auf einen gueltigen Bereich einstellen 226 void ValidateSelection( TextSelection& rSel ) const; 227 void ValidatePaM( TextPaM& rPaM ) const; 228 229 public: 230 TextEngine(); 231 ~TextEngine(); 232 233 void SetText( const String& rStr ); 234 String GetText( LineEnd aSeparator = LINEEND_LF ) const; 235 String GetText( const TextSelection& rSel, LineEnd aSeparator = LINEEND_LF ) const; 236 String GetTextLines( LineEnd aSeparator = LINEEND_LF ) const; 237 void ReplaceText(const TextSelection& rSel, const String& rText); 238 239 sal_uLong GetTextLen( LineEnd aSeparator = LINEEND_LF ) const; 240 sal_uLong GetTextLen( const TextSelection& rSel, LineEnd aSeparator = LINEEND_LF ) const; 241 242 void SetFont( const Font& rFont ); 243 const Font& GetFont() const { return maFont; } 244 245 void SetDefTab( sal_uInt16 nDefTab ); 246 sal_uInt16 GetDefTab() const; 247 248 void SetLeftMargin( sal_uInt16 n ); 249 sal_uInt16 GetLeftMargin() const; 250 251 void SetUpdateMode( sal_Bool bUpdate ); 252 sal_Bool GetUpdateMode() const { return mbUpdate; } 253 254 sal_uInt16 GetViewCount() const; 255 TextView* GetView( sal_uInt16 nView ) const; 256 void InsertView( TextView* pTextView ); 257 void RemoveView( TextView* pTextView ); 258 TextView* GetActiveView() const; 259 void SetActiveView( TextView* pView ); 260 261 void SetMaxTextLen( sal_uLong nLen ); 262 sal_uLong GetMaxTextLen() const { return mnMaxTextLen; } 263 264 void SetMaxTextWidth( sal_uLong nWidth ); 265 sal_uLong GetMaxTextWidth() const { return mnMaxTextWidth; } 266 267 sal_uLong GetTextHeight() const; 268 sal_uLong CalcTextWidth(); 269 sal_uInt16 GetCharHeight() const { return mnCharHeight; } 270 271 sal_uLong GetParagraphCount() const; 272 String GetText( sal_uLong nParagraph ) const; 273 sal_uInt16 GetTextLen( sal_uLong nParagraph ) const; 274 sal_uLong GetTextHeight( sal_uLong nParagraph ) const; 275 276 sal_uInt16 GetLineCount( sal_uLong nParagraph ) const; 277 sal_uInt16 GetLineLen( sal_uLong nParagraph, sal_uInt16 nLine ) const; 278 279 void SetRightToLeft( sal_Bool bR2L ); 280 sal_Bool IsRightToLeft() const { return mbRightToLeft; } 281 282 sal_Bool HasUndoManager() const { return mpUndoManager ? sal_True : sal_False; } 283 ::svl::IUndoManager& 284 GetUndoManager(); 285 void UndoActionStart( sal_uInt16 nId = 0 ); 286 void UndoActionEnd(); 287 void InsertUndo( TextUndo* pUndo, sal_Bool bTryMerge = sal_False ); 288 sal_Bool IsInUndo() { return mbIsInUndo; } 289 void SetIsInUndo( sal_Bool bInUndo ) { mbIsInUndo = bInUndo; } 290 void ResetUndo(); 291 292 void EnableUndo( sal_Bool bEnable ); 293 sal_Bool IsUndoEnabled() { return mbUndoEnabled; } 294 295 void SetModified( sal_Bool bModified ) { mbModified = bModified; } 296 sal_Bool IsModified() const { return mbModified; } 297 298 sal_Bool Read( SvStream& rInput, const TextSelection* pSel = NULL ); 299 300 sal_Bool Write( SvStream& rOutput, const TextSelection* pSel = NULL, sal_Bool bHTML = sal_False ); 301 302 TextPaM GetPaM( const Point& rDocPos, sal_Bool bSmart = sal_True ); 303 Rectangle PaMtoEditCursor( const TextPaM& rPaM, sal_Bool bSpecial = sal_False ); 304 String GetWord( const TextPaM& rCursorPos, TextPaM* pStartOfWord = 0 ); 305 306 sal_Bool HasAttrib( sal_uInt16 nWhich ) const; 307 const TextAttrib* FindAttrib( const TextPaM& rPaM, sal_uInt16 nWhich ) const; 308 const TextCharAttrib* FindCharAttrib( const TextPaM& rPaM, sal_uInt16 nWhich ) const; 309 310 void RemoveAttribs( sal_uLong nPara, sal_uInt16 nWhich, sal_Bool bIdleFormatAndUpdate ); 311 void RemoveAttrib( sal_uLong nPara, const TextCharAttrib& rAttrib ); 312 void RemoveAttribs( sal_uLong nPara, sal_Bool bIdleFormatAndUpdate = sal_True ); 313 void SetAttrib( const TextAttrib& rAttr, sal_uLong nPara, sal_uInt16 nStart, sal_uInt16 nEnd, sal_Bool bIdleFormatAndUpdate = sal_True ); 314 315 TxtAlign GetTextAlign() const { return meAlign; } 316 void SetTextAlign( TxtAlign eAlign ); 317 318 void Draw( OutputDevice* pDev, const Point& rPos ); 319 320 void SetLocale( const ::com::sun::star::lang::Locale& rLocale ); 321 ::com::sun::star::lang::Locale GetLocale(); 322 ::com::sun::star::uno::Reference< ::com::sun::star::i18n::XBreakIterator > GetBreakIterator(); 323 324 static sal_Bool DoesKeyChangeText( const KeyEvent& rKeyEvent ); 325 static sal_Bool DoesKeyMoveCursor( const KeyEvent& rKeyEvent ); 326 static sal_Bool IsSimpleCharInput( const KeyEvent& rKeyEvent ); 327 }; 328 329 #endif // _TEXTENG_HXX 330 331