1 /* 2 * Copyright 2014, Stephan Aßmus <superstippi@gmx.de>. 3 * All rights reserved. Distributed under the terms of the MIT License. 4 */ 5 #ifndef TEXT_EDITOR_H 6 #define TEXT_EDITOR_H 7 8 9 #include <Point.h> 10 #include <Referenceable.h> 11 12 #include "CharacterStyle.h" 13 #include "TextDocument.h" 14 #include "TextDocumentLayout.h" 15 #include "TextSelection.h" 16 17 18 class KeyEvent { 19 public: 20 const char* bytes; 21 int32 length; 22 int32 key; 23 int32 modifiers; 24 }; 25 26 27 class TextEditor : public BReferenceable { 28 public: 29 TextEditor(); 30 TextEditor(const TextEditor& other); 31 virtual ~TextEditor(); 32 33 TextEditor& operator=(const TextEditor& other); 34 bool operator==(const TextEditor& other) const; 35 bool operator!=(const TextEditor& other) const; 36 37 void SetDocument(const TextDocumentRef& ref); 38 TextDocumentRef Document() const 39 { return fDocument; } 40 41 void SetLayout( 42 const TextDocumentLayoutRef& ref); 43 TextDocumentLayoutRef Layout() const 44 { return fLayout; } 45 46 void SetEditingEnabled(bool enabled); 47 inline bool IsEditingEnabled() const 48 { return fEditingEnabled; } 49 50 void SetCaret(BPoint location, bool extendSelection); 51 void SelectAll(); 52 void SetSelection(TextSelection selection); 53 inline TextSelection Selection() const 54 { return fSelection; } 55 56 void SetCharacterStyle(::CharacterStyle style); 57 ::CharacterStyle CharacterStyle() const 58 { return fStyleAtCaret; } 59 60 virtual void KeyDown(KeyEvent event); 61 62 virtual status_t Insert(int32 offset, const BString& string); 63 virtual status_t Remove(int32 offset, int32 length); 64 virtual status_t Replace(int32 offset, int32 length, 65 const BString& string); 66 67 void LineUp(bool select); 68 void LineDown(bool select); 69 void LineStart(bool select); 70 void LineEnd(bool select); 71 72 bool HasSelection() const; 73 int32 SelectionStart() const; 74 int32 SelectionEnd() const; 75 int32 SelectionLength() const; 76 inline int32 CaretOffset() const 77 { return fSelection.Caret(); } 78 79 private: 80 void _MoveToLine(int32 lineIndex, bool select); 81 void _SetCaretOffset(int32 offset, 82 bool updateAnchor, 83 bool lockSelectionAnchor, 84 bool updateSelectionStyle); 85 void _SetSelection(int32 caret, int32 anchor, 86 bool updateAnchor, 87 bool updateSelectionStyle); 88 89 void _UpdateStyleAtCaret(); 90 91 private: 92 TextDocumentRef fDocument; 93 TextDocumentLayoutRef fLayout; 94 TextSelection fSelection; 95 float fCaretAnchorX; 96 ::CharacterStyle fStyleAtCaret; 97 bool fEditingEnabled; 98 }; 99 100 101 typedef BReference<TextEditor> TextEditorRef; 102 103 104 #endif // TEXT_EDITOR_H 105