xref: /haiku/src/apps/haikudepot/textview/TextDocument.h (revision 82bfaa954dcfd90582fb2c1a0e918971eea57091)
1 /*
2  * Copyright 2013-2014, Stephan Aßmus <superstippi@gmx.de>.
3  * All rights reserved. Distributed under the terms of the MIT License.
4  */
5 #ifndef TEXT_DOCUMENT_H
6 #define TEXT_DOCUMENT_H
7 
8 #include <Referenceable.h>
9 
10 #include "CharacterStyle.h"
11 #include "List.h"
12 #include "Paragraph.h"
13 #include "TextListener.h"
14 #include "UndoableEditListener.h"
15 
16 
17 class TextDocument;
18 typedef BReference<TextDocument> TextDocumentRef;
19 
20 
21 class TextDocument : public BReferenceable {
22 public:
23 								TextDocument();
24 								TextDocument(
25 									CharacterStyle characterStyle,
26 									ParagraphStyle paragraphStyle);
27 								TextDocument(const TextDocument& other);
28 
29 			TextDocument&		operator=(const TextDocument& other);
30 			bool				operator==(const TextDocument& other) const;
31 			bool				operator!=(const TextDocument& other) const;
32 
33 			// Text insertion and removing
34 			status_t			Insert(int32 textOffset, const BString& text);
35 			status_t			Insert(int32 textOffset, const BString& text,
36 									CharacterStyle style);
37 			status_t			Insert(int32 textOffset, const BString& text,
38 									CharacterStyle characterStyle,
39 									ParagraphStyle paragraphStyle);
40 
41 			status_t			Remove(int32 textOffset, int32 length);
42 
43 			status_t			Replace(int32 textOffset, int32 length,
44 									const BString& text);
45 			status_t			Replace(int32 textOffset, int32 length,
46 									const BString& text,
47 									CharacterStyle style);
48 			status_t			Replace(int32 textOffset, int32 length,
49 									const BString& text,
50 									CharacterStyle characterStyle,
51 									ParagraphStyle paragraphStyle);
52 			status_t			Replace(int32 textOffset, int32 length,
53 									TextDocumentRef document);
54 
55 			// Style access
56 			const CharacterStyle& CharacterStyleAt(int32 textOffset) const;
57 			const ParagraphStyle& ParagraphStyleAt(int32 textOffset) const;
58 			BCursor				CursorAt(int32 textOffset) const;
59 			const BMessage*		ClickMessageAt(int32 textOffset) const;
60 
61 			int32				CountParagraphs() const;
62 			const Paragraph&	ParagraphAtIndex(int32 index) const;
63 
64 			int32				ParagraphIndexFor(int32 textOffset,
65 									int32& paragraphOffset) const;
66 
67 			const Paragraph&	ParagraphAt(int32 textOffset,
68 									int32& paragraphOffset) const;
69 
70 			const Paragraph&	ParagraphAt(int32 index) const;
71 
72 			bool				Append(const Paragraph& paragraph);
73 
74 			// Query information
75 			int32				Length() const;
76 
77 			BString				Text() const;
78 			BString				Text(int32 textOffset, int32 length) const;
79 			TextDocumentRef		SubDocument(int32 textOffset,
80 									int32 length) const;
81 
82 			void				PrintToStream() const;
83 
84 			// Support
85 	static	TextDocumentRef		NormalizeText(const BString& text,
86 									CharacterStyle characterStyle,
87 									ParagraphStyle paragraphStyle);
88 
89 			// Listener support
90 			bool				AddListener(TextListenerRef listener);
91 			bool				RemoveListener(TextListenerRef listener);
92 			bool				AddUndoListener(
93 									UndoableEditListenerRef listener);
94 			bool				RemoveUndoListener(
95 									UndoableEditListenerRef listener);
96 
97 private:
98 			status_t			_Insert(int32 textOffset,
99 									TextDocumentRef document,
100 									int32& firstParagraph,
101 									int32& paragraphCount);
102 			status_t			_Remove(int32 textOffset, int32 length,
103 									int32& firstParagraph,
104 									int32& paragraphCount);
105 
106 private:
107 			void				_NotifyTextChanging(
108 									TextChangingEvent& event) const;
109 			void				_NotifyTextChanged(
110 									const TextChangedEvent& event) const;
111 			void				_NotifyUndoableEditHappened(
112 									const UndoableEditRef& edit) const;
113 
114 private:
115 			std::vector<Paragraph>
116 								fParagraphs;
117 			Paragraph			fEmptyLastParagraph;
118 			CharacterStyle		fDefaultCharacterStyle;
119 
120 			std::vector<TextListenerRef>
121 								fTextListeners;
122 			std::vector<UndoableEditListenerRef>
123 								fUndoListeners;
124 };
125 
126 
127 #endif // TEXT_DOCUMENT_H
128