xref: /haiku/headers/os/interface/TextView.h (revision e81a954787e50e56a7f06f72705b7859b6ab06d1)
1 /*
2  * Copyright 2007-2009, Haiku, Inc. All rights reserved.
3  * Distributed under the terms of the MIT License.
4  */
5 #ifndef _TEXTVIEW_H
6 #define _TEXTVIEW_H
7 
8 
9 #include <Locker.h>
10 #include <View.h>
11 
12 
13 class BBitmap;
14 class BClipboard;
15 class BFile;
16 class BList;
17 class BMessageRunner;
18 
19 struct text_run {
20 	int32		offset;
21 	BFont		font;
22 	rgb_color	color;
23 };
24 
25 struct text_run_array {
26 	int32		count;
27 	text_run	runs[1];
28 };
29 
30 enum undo_state {
31 	B_UNDO_UNAVAILABLE,
32 	B_UNDO_TYPING,
33 	B_UNDO_CUT,
34 	B_UNDO_PASTE,
35 	B_UNDO_CLEAR,
36 	B_UNDO_DROP
37 };
38 
39 namespace BPrivate {
40 	class TextGapBuffer;
41 }
42 
43 
44 class BTextView : public BView {
45 public:
46 								BTextView(BRect frame, const char* name,
47 									BRect textRect, uint32 resizeMask,
48 									uint32 flags
49 										= B_WILL_DRAW | B_PULSE_NEEDED);
50 								BTextView(BRect	frame, const char* name,
51 									BRect textRect, const BFont* initialFont,
52 									const rgb_color* initialColor,
53 									uint32 resizeMask, uint32 flags);
54 
55 								BTextView(const char* name,
56 									uint32 flags
57 										= B_WILL_DRAW | B_PULSE_NEEDED);
58 								BTextView(const char* name,
59 									const BFont* initialFont,
60 									const rgb_color* initialColor,
61 									uint32 flags);
62 
63 								BTextView(BMessage* archive);
64 
65 	virtual						~BTextView();
66 
67 	static	BArchivable*		Instantiate(BMessage* archive);
68 	virtual	status_t			Archive(BMessage* archive,
69 									bool deep = true) const;
70 
71 	virtual	void				AttachedToWindow();
72 	virtual	void				DetachedFromWindow();
73 	virtual	void				Draw(BRect updateRect);
74 	virtual	void				MouseDown(BPoint where);
75 	virtual	void				MouseUp(BPoint where);
76 	virtual	void				MouseMoved(BPoint where, uint32 code,
77 									const BMessage* dragMessage);
78 	virtual	void				WindowActivated(bool active);
79 	virtual	void				KeyDown(const char* bytes, int32 numBytes);
80 	virtual	void				Pulse();
81 	virtual	void				FrameResized(float newWidth, float newHeight);
82 	virtual	void				MakeFocus(bool focus = true);
83 	virtual	void				MessageReceived(BMessage* message);
84 
85 	virtual	BHandler*			ResolveSpecifier(BMessage* message,
86 									int32 index, BMessage* specifier,
87 									int32 form, const char* property);
88 	virtual	status_t			GetSupportedSuites(BMessage* data);
89 	virtual	status_t			Perform(perform_code code, void* data);
90 
91 			void				SetText(const char* text,
92 									const text_run_array* runs = NULL);
93 			void				SetText(const char* text, int32 length,
94 									const text_run_array* runs = NULL);
95 			void				SetText(BFile* file, int32 offset,
96 									int32 length,
97 									const text_run_array* runs = NULL);
98 
99 			void				Insert(const char* text,
100 									const text_run_array* runs = NULL);
101 			void				Insert(const char* text, int32 length,
102 									const text_run_array* runs = NULL);
103 			void				Insert(int32 offset, const char* text,
104 									int32 length,
105 									const text_run_array* runs = NULL);
106 
107 			void				Delete();
108 			void				Delete(int32 startOffset, int32 endOffset);
109 
110 			const char*			Text() const;
111 			int32				TextLength() const;
112 			void				GetText(int32 offset, int32 length,
113 									char* buffer) const;
114 			uint8				ByteAt(int32 offset) const;
115 
116 			int32				CountLines() const;
117 			int32				CurrentLine() const;
118 			void				GoToLine(int32 lineNumber);
119 
120 	virtual	void				Cut(BClipboard* clipboard);
121 	virtual	void				Copy(BClipboard* clipboard);
122 	virtual	void				Paste(BClipboard* clipboard);
123 			void				Clear();
124 
125 	virtual	bool				AcceptsPaste(BClipboard* clipboard);
126 	virtual	bool				AcceptsDrop(const BMessage* message);
127 
128 	virtual	void				Select(int32 startOffset, int32 endOffset);
129 			void				SelectAll();
130 			void				GetSelection(int32* _start, int32* _end) const;
131 
132 			void				SetFontAndColor(const BFont* font,
133 									uint32 mode = B_FONT_ALL,
134 									const rgb_color* color = NULL);
135 			void				SetFontAndColor(int32 startOffset,
136 									int32 endOffset, const BFont* font,
137 									uint32 mode = B_FONT_ALL,
138 									const rgb_color* color = NULL);
139 
140 			void				GetFontAndColor(int32 offset, BFont* _font,
141 									rgb_color* _color = NULL) const;
142 			void				GetFontAndColor(BFont* _font, uint32* _mode,
143 									rgb_color* _color = NULL,
144 									bool* _sameColor = NULL) const;
145 
146 			void				SetRunArray(int32 startOffset, int32 endOffset,
147 									const text_run_array* runs);
148 			text_run_array*		RunArray(int32 startOffset, int32 endOffset,
149 									int32* _size = NULL) const;
150 
151 			int32				LineAt(int32 offset) const;
152 			int32				LineAt(BPoint point) const;
153 			BPoint				PointAt(int32 offset,
154 									float* _height = NULL) const;
155 			int32				OffsetAt(BPoint point) const;
156 			int32				OffsetAt(int32 line) const;
157 
158 	virtual	void				FindWord(int32 offset, int32* _fromOffset,
159 									int32* _toOffset);
160 
161 	virtual	bool				CanEndLine(int32 offset);
162 
163 			float				LineWidth(int32 lineNumber = 0) const;
164 			float				LineHeight(int32 lineNumber = 0) const;
165 			float				TextHeight(int32 startLine,
166 									int32 endLine) const;
167 
168 			void				GetTextRegion(int32 startOffset,
169 									int32 endOffset, BRegion* outRegion) const;
170 
171 	virtual	void				ScrollToOffset(int32 offset);
172 			void				ScrollToSelection();
173 
174 			void				Highlight(int32 startOffset, int32 endOffset);
175 
176 			void				SetTextRect(BRect rect);
177 			BRect				TextRect() const;
178 			void				SetInsets(float left, float top, float right,
179 									float bottom);
180 			void				GetInsets(float* _left, float* _top,
181 									float* _right, float* _bottom) const;
182 
183 			void				SetStylable(bool stylable);
184 			bool				IsStylable() const;
185 			void				SetTabWidth(float width);
186 			float				TabWidth() const;
187 			void				MakeSelectable(bool selectable = true);
188 			bool				IsSelectable() const;
189 			void				MakeEditable(bool editable = true);
190 			bool				IsEditable() const;
191 			void				SetWordWrap(bool wrap);
192 			bool				DoesWordWrap() const;
193 			void				SetMaxBytes(int32 max);
194 			int32				MaxBytes() const;
195 			void				DisallowChar(uint32 character);
196 			void				AllowChar(uint32 character);
197 			void				SetAlignment(alignment align);
198 			alignment			Alignment() const;
199 			void				SetAutoindent(bool state);
200 			bool				DoesAutoindent() const;
201 			void				SetColorSpace(color_space colors);
202 			color_space			ColorSpace() const;
203 			void				MakeResizable(bool resize,
204 									BView* resizeView = NULL);
205 			bool				IsResizable() const;
206 			void				SetDoesUndo(bool undo);
207 			bool				DoesUndo() const;
208 			void				HideTyping(bool enabled);
209 			bool				IsTypingHidden() const;
210 
211 	virtual	void				ResizeToPreferred();
212 	virtual	void				GetPreferredSize(float* _width, float* _height);
213 
214 	virtual	void				AllAttached();
215 	virtual	void				AllDetached();
216 
217 	static	text_run_array*		AllocRunArray(int32 entryCount,
218 									int32* outSize = NULL);
219 	static	text_run_array*		CopyRunArray(const text_run_array* orig,
220 									int32 countDelta = 0);
221 	static	void				FreeRunArray(text_run_array* array);
222 	static	void*				FlattenRunArray(const text_run_array* runArray,
223 									int32* _size = NULL);
224 	static	text_run_array*		UnflattenRunArray(const void* data,
225 									int32* _size = NULL);
226 
227 protected:
228 	virtual	void				InsertText(const char* text, int32 length,
229 									int32 offset, const text_run_array* runs);
230 	virtual	void				DeleteText(int32 fromOffset, int32 toOffset);
231 
232 public:
233 	virtual	void				Undo(BClipboard* clipboard);
234 			undo_state			UndoState(bool* isRedo) const;
235 
236 protected:
237 	virtual	void				GetDragParameters(BMessage* drag,
238 									BBitmap** _bitmap, BPoint* point,
239 									BHandler** _handler);
240 
241 	virtual	void				LayoutInvalidated(bool descendants);
242 	virtual	void				DoLayout();
243 
244 public:
245 	virtual	BSize				MinSize();
246 	virtual	BSize				MaxSize();
247 	virtual	BSize				PreferredSize();
248 
249 	virtual	bool				HasHeightForWidth();
250 	virtual	void				GetHeightForWidth(float width, float* min,
251 									float* max, float* preferred);
252 
253 private:
254 	// FBC padding and forbidden methods
255 	virtual	void				_ReservedTextView3();
256 	virtual	void				_ReservedTextView4();
257 	virtual	void				_ReservedTextView5();
258 	virtual	void				_ReservedTextView6();
259 	virtual	void				_ReservedTextView7();
260 	virtual	void				_ReservedTextView8();
261 	virtual	void				_ReservedTextView9();
262 	virtual	void				_ReservedTextView10();
263 	virtual	void				_ReservedTextView11();
264 	virtual	void				_ReservedTextView12();
265 
266 private:
267 			class InlineInput;
268 			struct LayoutData;
269 			class LineBuffer;
270 			class StyleBuffer;
271 			class TextTrackState;
272 			class UndoBuffer;
273 
274 			// UndoBuffer derivatives
275 			class CutUndoBuffer;
276 			class PasteUndoBuffer;
277 			class ClearUndoBuffer;
278 			class DropUndoBuffer;
279 			class TypingUndoBuffer;
280 
281 			friend class TextTrackState;
282 
283 			void				_InitObject(BRect textRect,
284 									const BFont* initialFont,
285 									const rgb_color* initialColor);
286 
287 			void				_ValidateLayoutData();
288 			void				_ResetTextRect();
289 
290 			void				_HandleBackspace();
291 			void				_HandleArrowKey(uint32 arrowKey,
292 									int32 modifiers = -1);
293 			void				_HandleDelete();
294 			void				_HandlePageKey(uint32 pageKey,
295 									int32 modifiers = -1);
296 			void				_HandleAlphaKey(const char* bytes,
297 									int32 numBytes);
298 
299 			void				_Refresh(int32 fromOffset, int32 toOffset,
300 									bool scroll);
301 			void				_RecalculateLineBreaks(int32* startLine,
302 									int32* endLine);
303 			int32				_FindLineBreak(int32 fromOffset,
304 									float* _ascent, float* _descent,
305 									float* inOutWidth);
306 
307 			float				_StyledWidth(int32 fromOffset, int32 length,
308 									float* _ascent = NULL,
309 									float* _descent = NULL) const;
310 			float				_TabExpandedStyledWidth(int32 offset,
311 									int32 length, float* _ascent = NULL,
312 									float* _descent = NULL) const;
313 
314 			float				_ActualTabWidth(float location) const;
315 
316 			void				_DoInsertText(const char* text, int32 length,
317 									int32 offset, const text_run_array* runs);
318 
319 			void				_DoDeleteText(int32 fromOffset,
320 									int32 toOffset);
321 
322 			void				_DrawLine(BView* view, const int32 &startLine,
323 									const int32& startOffset,
324 									const bool& erase, BRect& eraseRect,
325 									BRegion& inputRegion);
326 
327 			void				_DrawLines(int32 startLine, int32 endLine,
328 									int32 startOffset = -1,
329 									bool erase = false);
330 			void				_RequestDrawLines(int32 startLine,
331 									int32 endLine);
332 
333 			void				_DrawCaret(int32 offset, bool visible);
334 			void				_ShowCaret();
335 			void				_HideCaret();
336 			void				_InvertCaret();
337 			void				_DragCaret(int32 offset);
338 
339 			void				_StopMouseTracking();
340 			bool				_PerformMouseUp(BPoint where);
341 			bool				_PerformMouseMoved(BPoint where, uint32 code);
342 
343 			void				_TrackMouse(BPoint where,
344 									const BMessage* message,
345 									bool force = false);
346 
347 			void				_TrackDrag(BPoint where);
348 			void				_InitiateDrag();
349 			bool				_MessageDropped(BMessage* message,
350 									BPoint where, BPoint offset);
351 
352 			void				_PerformAutoScrolling();
353 			void				_UpdateScrollbars();
354 			void				_ScrollBy(float horizontalStep,
355 									float verticalStep);
356 			void				_ScrollTo(float x, float y);
357 
358 			void				_AutoResize(bool doRedraw = true);
359 
360 			void				_NewOffscreen(float padding = 0.0);
361 			void				_DeleteOffscreen();
362 
363 			void				_Activate();
364 			void				_Deactivate();
365 
366 			void				_NormalizeFont(BFont* font);
367 
368 			void				_SetRunArray(int32 startOffset, int32 endOffset,
369 									const text_run_array* runs);
370 
371 			void				_ApplyStyleRange(int32 fromOffset,
372 									int32 toOffset,
373 									uint32 mode = B_FONT_ALL,
374 									const BFont* font = NULL,
375 									const rgb_color* color = NULL,
376 									bool syncNullStyle = true);
377 
378 			uint32				_CharClassification(int32 offset) const;
379 			int32				_NextInitialByte(int32 offset) const;
380 			int32				_PreviousInitialByte(int32 offset) const;
381 
382 			int32				_PreviousLineStart(int32 offset);
383 			int32				_NextLineEnd(int32 offset);
384 
385 			int32				_PreviousWordBoundary(int32 offset);
386 			int32				_NextWordBoundary(int32 offset);
387 
388 			int32				_PreviousWordStart(int32 offset);
389 			int32				_NextWordEnd(int32 offset);
390 
391 			bool				_GetProperty(BMessage* specifier, int32 form,
392 									const char* property, BMessage* reply);
393 			bool				_SetProperty(BMessage* specifier, int32 form,
394 									const char* property, BMessage* reply);
395 			bool				_CountProperties(BMessage* specifier,
396 									int32 form, const char* property,
397 									BMessage* reply);
398 
399 			void				_HandleInputMethodChanged(BMessage* message);
400 			void				_HandleInputMethodLocationRequest();
401 			void				_CancelInputMethod();
402 
403 			int32				_LineAt(int32 offset) const;
404 			int32				_LineAt(const BPoint& point) const;
405 			bool				_IsOnEmptyLastLine(int32 offset) const;
406 
407 			float				_NullStyleHeight() const;
408 
409 			void				_ShowContextMenu(BPoint where);
410 
411 			void				_FilterDisallowedChars(char* text,
412 									ssize_t& length, text_run_array* runArray);
413 
414 private:
415 			BPrivate::TextGapBuffer*	fText;
416 			LineBuffer*			fLines;
417 			StyleBuffer*		fStyles;
418 			BRect				fTextRect;
419 			int32				fSelStart;
420 			int32				fSelEnd;
421 			bool				fCaretVisible;
422 			bigtime_t			fCaretTime;
423 			int32				fCaretOffset;
424 			int32				fClickCount;
425 			bigtime_t			fClickTime;
426 			int32				fDragOffset;
427 			uint8				fCursor;
428 			bool				fActive;
429 			bool				fStylable;
430 			float				fTabWidth;
431 			bool				fSelectable;
432 			bool				fEditable;
433 			bool				fWrap;
434 			int32				fMaxBytes;
435 			BList*				fDisallowedChars;
436 			alignment			fAlignment;
437 			bool				fAutoindent;
438 			BBitmap* 			fOffscreen;
439 			color_space			fColorSpace;
440 			bool				fResizable;
441 			BView*				fContainerView;
442 			UndoBuffer*			fUndo;
443 			InlineInput*		fInline;
444 			BMessageRunner*		fDragRunner;
445 			BMessageRunner*		fClickRunner;
446 			BPoint				fWhere;
447 			TextTrackState*		fTrackingMouse;
448 
449 			float				fMinTextRectWidth;
450 			LayoutData*			fLayoutData;
451 			int32				fLastClickOffset;
452 
453 			bool				fInstalledNavigateCommandWordwiseShortcuts;
454 			bool				fInstalledNavigateOptionWordwiseShortcuts;
455 			bool				fInstalledNavigateOptionLinewiseShortcuts;
456 			bool				fInstalledNavigateHomeEndDocwiseShortcuts;
457 
458 			bool				fInstalledSelectCommandWordwiseShortcuts;
459 			bool				fInstalledSelectOptionWordwiseShortcuts;
460 			bool				fInstalledSelectOptionLinewiseShortcuts;
461 			bool				fInstalledSelectHomeEndDocwiseShortcuts;
462 
463 			uint32				_reserved[5];
464 };
465 
466 #endif	// _TEXTVIEW_H
467