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