91f0846f8a
This fixes #7022 and is mostly based on the patch attached to that ticket, with these changes: - The patch was adding this to the private _TextInput_ class, not BTextView. - The patch had a Clear menu item too. I removed that due to the different semantics between Clear in a BTextView and in a TextInput. The former just clears the selection where the latter clears the whole view. We could later add a virtual callback for adding menu items to this context menu which could be used to add Clear with the two semantics in each class (this is mainly needed for the enabling logic...each class could handle a clear message in its own way.) This callback could also obviously be used for other things, like a spell-check menu or whatever an application would want to add. Since BTextView has 10 free virtual slots it seems reasonable to add. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@40305 a95241bf-73f2-0310-859d-f6bbb57e9c96
457 lines
13 KiB
C++
457 lines
13 KiB
C++
/*
|
|
* Copyright 2007-2009, Haiku, Inc. All rights reserved.
|
|
* Distributed under the terms of the MIT License.
|
|
*/
|
|
#ifndef _TEXTVIEW_H
|
|
#define _TEXTVIEW_H
|
|
|
|
|
|
#include <Locker.h>
|
|
#include <View.h>
|
|
|
|
|
|
class BBitmap;
|
|
class BClipboard;
|
|
class BFile;
|
|
class BList;
|
|
class BMessageRunner;
|
|
|
|
struct text_run {
|
|
int32 offset;
|
|
BFont font;
|
|
rgb_color color;
|
|
};
|
|
|
|
struct text_run_array {
|
|
int32 count;
|
|
text_run runs[1];
|
|
};
|
|
|
|
enum undo_state {
|
|
B_UNDO_UNAVAILABLE,
|
|
B_UNDO_TYPING,
|
|
B_UNDO_CUT,
|
|
B_UNDO_PASTE,
|
|
B_UNDO_CLEAR,
|
|
B_UNDO_DROP
|
|
};
|
|
|
|
namespace BPrivate {
|
|
class TextGapBuffer;
|
|
}
|
|
|
|
|
|
class BTextView : public BView {
|
|
public:
|
|
BTextView(BRect frame, const char* name,
|
|
BRect textRect, uint32 resizeMask,
|
|
uint32 flags
|
|
= B_WILL_DRAW | B_PULSE_NEEDED);
|
|
BTextView(BRect frame, const char* name,
|
|
BRect textRect, const BFont* initialFont,
|
|
const rgb_color* initialColor,
|
|
uint32 resizeMask, uint32 flags);
|
|
|
|
BTextView(const char* name,
|
|
uint32 flags
|
|
= B_WILL_DRAW | B_PULSE_NEEDED);
|
|
BTextView(const char* name,
|
|
const BFont* initialFont,
|
|
const rgb_color* initialColor,
|
|
uint32 flags);
|
|
|
|
BTextView(BMessage* archive);
|
|
|
|
virtual ~BTextView();
|
|
|
|
static BArchivable* Instantiate(BMessage* archive);
|
|
virtual status_t Archive(BMessage* archive,
|
|
bool deep = true) const;
|
|
|
|
virtual void AttachedToWindow();
|
|
virtual void DetachedFromWindow();
|
|
virtual void Draw(BRect updateRect);
|
|
virtual void MouseDown(BPoint where);
|
|
virtual void MouseUp(BPoint where);
|
|
virtual void MouseMoved(BPoint where, uint32 code,
|
|
const BMessage* dragMessage);
|
|
virtual void WindowActivated(bool state);
|
|
virtual void KeyDown(const char* bytes, int32 numBytes);
|
|
virtual void Pulse();
|
|
virtual void FrameResized(float width, float height);
|
|
virtual void MakeFocus(bool focusState = true);
|
|
virtual void MessageReceived(BMessage* message);
|
|
|
|
virtual BHandler* ResolveSpecifier(BMessage* message,
|
|
int32 index, BMessage* specifier,
|
|
int32 form, const char* property);
|
|
virtual status_t GetSupportedSuites(BMessage* data);
|
|
|
|
void SetText(const char* inText,
|
|
const text_run_array* inRuns = NULL);
|
|
void SetText(const char* inText, int32 inLength,
|
|
const text_run_array* inRuns = NULL);
|
|
void SetText(BFile* inFile,
|
|
int32 startOffset, int32 inLength,
|
|
const text_run_array* inRuns = NULL);
|
|
|
|
void Insert(const char* inText,
|
|
const text_run_array* inRuns = NULL);
|
|
void Insert(const char* inText, int32 inLength,
|
|
const text_run_array* inRuns = NULL);
|
|
void Insert(int32 startOffset,
|
|
const char* inText, int32 inLength,
|
|
const text_run_array* inRuns = NULL);
|
|
|
|
void Delete();
|
|
void Delete(int32 startOffset, int32 endOffset);
|
|
|
|
const char* Text() const;
|
|
int32 TextLength() const;
|
|
void GetText(int32 offset, int32 length,
|
|
char* buffer) const;
|
|
uint8 ByteAt(int32 offset) const;
|
|
|
|
int32 CountLines() const;
|
|
int32 CurrentLine() const;
|
|
void GoToLine(int32 lineIndex);
|
|
|
|
virtual void Cut(BClipboard* clipboard);
|
|
virtual void Copy(BClipboard* clipboard);
|
|
virtual void Paste(BClipboard* clipboard);
|
|
void Clear();
|
|
|
|
virtual bool AcceptsPaste(BClipboard* clipboard);
|
|
virtual bool AcceptsDrop(const BMessage* inMessage);
|
|
|
|
virtual void Select(int32 startOffset, int32 endOffset);
|
|
void SelectAll();
|
|
void GetSelection(int32* outStart,
|
|
int32* outEnd) const;
|
|
|
|
void SetFontAndColor(const BFont* inFont,
|
|
uint32 inMode = B_FONT_ALL,
|
|
const rgb_color* inColor = NULL);
|
|
void SetFontAndColor(int32 startOffset,
|
|
int32 endOffset, const BFont* inFont,
|
|
uint32 inMode = B_FONT_ALL,
|
|
const rgb_color* inColor = NULL);
|
|
|
|
void GetFontAndColor(int32 inOffset, BFont* outFont,
|
|
rgb_color* outColor = NULL) const;
|
|
void GetFontAndColor(BFont* outFont,
|
|
uint32* sameProperties,
|
|
rgb_color* outColor = NULL,
|
|
bool* sameColor = NULL) const;
|
|
|
|
void SetRunArray(int32 startOffset, int32 endOffset,
|
|
const text_run_array* inRuns);
|
|
text_run_array* RunArray(int32 startOffset, int32 endOffset,
|
|
int32* outSize = NULL) const;
|
|
|
|
int32 LineAt(int32 offset) const;
|
|
int32 LineAt(BPoint point) const;
|
|
BPoint PointAt(int32 inOffset,
|
|
float* outHeight = NULL) const;
|
|
int32 OffsetAt(BPoint point) const;
|
|
int32 OffsetAt(int32 line) const;
|
|
|
|
virtual void FindWord(int32 inOffset, int32* outFromOffset,
|
|
int32* outToOffset);
|
|
|
|
virtual bool CanEndLine(int32 offset);
|
|
|
|
float LineWidth(int32 lineIndex = 0) const;
|
|
float LineHeight(int32 lineIndex = 0) const;
|
|
float TextHeight(int32 startLine,
|
|
int32 endLine) const;
|
|
|
|
void GetTextRegion(int32 startOffset,
|
|
int32 endOffset, BRegion* outRegion) const;
|
|
|
|
virtual void ScrollToOffset(int32 inOffset);
|
|
void ScrollToSelection();
|
|
|
|
void Highlight(int32 startOffset, int32 endOffset);
|
|
|
|
void SetTextRect(BRect rect);
|
|
BRect TextRect() const;
|
|
void SetInsets(float left, float top, float right,
|
|
float bottom);
|
|
void GetInsets(float* _left, float* _top,
|
|
float* _right, float* _bottom) const;
|
|
|
|
void SetStylable(bool stylable);
|
|
bool IsStylable() const;
|
|
void SetTabWidth(float width);
|
|
float TabWidth() const;
|
|
void MakeSelectable(bool selectable = true);
|
|
bool IsSelectable() const;
|
|
void MakeEditable(bool editable = true);
|
|
bool IsEditable() const;
|
|
void SetWordWrap(bool wrap);
|
|
bool DoesWordWrap() const;
|
|
void SetMaxBytes(int32 max);
|
|
int32 MaxBytes() const;
|
|
void DisallowChar(uint32 aChar);
|
|
void AllowChar(uint32 aChar);
|
|
void SetAlignment(alignment flag);
|
|
alignment Alignment() const;
|
|
void SetAutoindent(bool state);
|
|
bool DoesAutoindent() const;
|
|
void SetColorSpace(color_space colors);
|
|
color_space ColorSpace() const;
|
|
void MakeResizable(bool resize,
|
|
BView* resizeView = NULL);
|
|
bool IsResizable() const;
|
|
void SetDoesUndo(bool undo);
|
|
bool DoesUndo() const;
|
|
void HideTyping(bool enabled);
|
|
bool IsTypingHidden() const;
|
|
|
|
virtual void ResizeToPreferred();
|
|
virtual void GetPreferredSize(float* _width, float* _height);
|
|
|
|
virtual BSize MinSize();
|
|
virtual BSize MaxSize();
|
|
virtual BSize PreferredSize();
|
|
|
|
virtual bool HasHeightForWidth();
|
|
virtual void GetHeightForWidth(float width, float* min,
|
|
float* max, float* preferred);
|
|
|
|
virtual void InvalidateLayout(bool descendants = false);
|
|
|
|
protected:
|
|
virtual void DoLayout();
|
|
|
|
public:
|
|
virtual void AllAttached();
|
|
virtual void AllDetached();
|
|
|
|
static text_run_array* AllocRunArray(int32 entryCount,
|
|
int32* outSize = NULL);
|
|
static text_run_array* CopyRunArray(const text_run_array* orig,
|
|
int32 countDelta = 0);
|
|
static void FreeRunArray(text_run_array* array);
|
|
static void* FlattenRunArray(const text_run_array* inArray,
|
|
int32* outSize = NULL);
|
|
static text_run_array* UnflattenRunArray(const void* data,
|
|
int32* outSize = NULL);
|
|
|
|
protected:
|
|
virtual void InsertText(const char* inText, int32 inLength,
|
|
int32 inOffset,
|
|
const text_run_array* inRuns);
|
|
virtual void DeleteText(int32 fromOffset, int32 toOffset);
|
|
|
|
public:
|
|
virtual void Undo(BClipboard* clipboard);
|
|
undo_state UndoState(bool* isRedo) const;
|
|
|
|
protected:
|
|
virtual void GetDragParameters(BMessage* drag,
|
|
BBitmap** _bitmap, BPoint* point,
|
|
BHandler** _handler);
|
|
|
|
// FBC padding and forbidden methods
|
|
public:
|
|
virtual status_t Perform(perform_code code, void* data);
|
|
|
|
private:
|
|
virtual void _ReservedTextView3();
|
|
virtual void _ReservedTextView4();
|
|
virtual void _ReservedTextView5();
|
|
virtual void _ReservedTextView6();
|
|
virtual void _ReservedTextView7();
|
|
virtual void _ReservedTextView8();
|
|
virtual void _ReservedTextView9();
|
|
virtual void _ReservedTextView10();
|
|
virtual void _ReservedTextView11();
|
|
virtual void _ReservedTextView12();
|
|
|
|
private:
|
|
class InlineInput;
|
|
struct LayoutData;
|
|
class LineBuffer;
|
|
class StyleBuffer;
|
|
class TextTrackState;
|
|
class UndoBuffer;
|
|
|
|
// UndoBuffer derivatives
|
|
class CutUndoBuffer;
|
|
class PasteUndoBuffer;
|
|
class ClearUndoBuffer;
|
|
class DropUndoBuffer;
|
|
class TypingUndoBuffer;
|
|
|
|
friend class TextTrackState;
|
|
|
|
void _InitObject(BRect textRect,
|
|
const BFont* initialFont,
|
|
const rgb_color* initialColor);
|
|
|
|
void _ValidateLayoutData();
|
|
void _ResetTextRect();
|
|
|
|
void _HandleBackspace();
|
|
void _HandleArrowKey(uint32 inArrowKey);
|
|
void _HandleDelete();
|
|
void _HandlePageKey(uint32 inPageKey);
|
|
void _HandleAlphaKey(const char* bytes,
|
|
int32 numBytes);
|
|
|
|
void _Refresh(int32 fromOffset, int32 toOffset,
|
|
bool scroll);
|
|
void _RecalculateLineBreaks(int32* startLine,
|
|
int32* endLine);
|
|
int32 _FindLineBreak(int32 fromOffset,
|
|
float* outAscent, float* outDescent,
|
|
float* inOutWidth);
|
|
|
|
float _StyledWidth(int32 fromOffset, int32 length,
|
|
float* outAscent = NULL,
|
|
float* outDescent = NULL) const;
|
|
float _TabExpandedStyledWidth(int32 offset,
|
|
int32 length, float* outAscent = NULL,
|
|
float* outDescent = NULL) const;
|
|
|
|
float _ActualTabWidth(float location) const;
|
|
|
|
void _DoInsertText(const char* inText,
|
|
int32 inLength, int32 inOffset,
|
|
const text_run_array* inRuns);
|
|
|
|
void _DoDeleteText(int32 fromOffset,
|
|
int32 toOffset);
|
|
|
|
void _DrawLine(BView* view, const int32 &startLine,
|
|
const int32& startOffset,
|
|
const bool& erase, BRect& eraseRect,
|
|
BRegion& inputRegion);
|
|
|
|
void _DrawLines(int32 startLine, int32 endLine,
|
|
int32 startOffset = -1,
|
|
bool erase = false);
|
|
void _RequestDrawLines(int32 startLine,
|
|
int32 endLine);
|
|
|
|
void _DrawCaret(int32 offset, bool visible);
|
|
void _ShowCaret();
|
|
void _HideCaret();
|
|
void _InvertCaret();
|
|
void _DragCaret(int32 offset);
|
|
|
|
void _StopMouseTracking();
|
|
bool _PerformMouseUp(BPoint where);
|
|
bool _PerformMouseMoved(BPoint where, uint32 code);
|
|
|
|
void _TrackMouse(BPoint where,
|
|
const BMessage* message,
|
|
bool force = false);
|
|
|
|
void _TrackDrag(BPoint where);
|
|
void _InitiateDrag();
|
|
bool _MessageDropped(BMessage* inMessage,
|
|
BPoint where, BPoint offset);
|
|
|
|
void _PerformAutoScrolling();
|
|
void _UpdateScrollbars();
|
|
void _ScrollBy(float horizontalStep,
|
|
float verticalStep);
|
|
void _ScrollTo(float x, float y);
|
|
|
|
void _AutoResize(bool doRedraw = true);
|
|
|
|
void _NewOffscreen(float padding = 0.0);
|
|
void _DeleteOffscreen();
|
|
|
|
void _Activate();
|
|
void _Deactivate();
|
|
|
|
void _NormalizeFont(BFont* font);
|
|
|
|
void _SetRunArray(int32 startOffset, int32 endOffset,
|
|
const text_run_array* inRuns);
|
|
|
|
void _ApplyStyleRange(int32 fromOffset,
|
|
int32 toOffset,
|
|
uint32 inMode = B_FONT_ALL,
|
|
const BFont *inFont = NULL,
|
|
const rgb_color *inColor = NULL,
|
|
bool syncNullStyle = true);
|
|
|
|
uint32 _CharClassification(int32 offset) const;
|
|
int32 _NextInitialByte(int32 offset) const;
|
|
int32 _PreviousInitialByte(int32 offset) const;
|
|
|
|
int32 _PreviousWordBoundary(int32 offset);
|
|
int32 _NextWordBoundary(int32 offset);
|
|
|
|
int32 _PreviousWordStart(int32 offset);
|
|
int32 _NextWordEnd(int32 offset);
|
|
|
|
bool _GetProperty(BMessage* specifier, int32 form,
|
|
const char* property, BMessage* reply);
|
|
bool _SetProperty(BMessage* specifier, int32 form,
|
|
const char* property, BMessage* reply);
|
|
bool _CountProperties(BMessage* specifier,
|
|
int32 form, const char* property,
|
|
BMessage* reply);
|
|
|
|
void _HandleInputMethodChanged(BMessage* message);
|
|
void _HandleInputMethodLocationRequest();
|
|
void _CancelInputMethod();
|
|
|
|
int32 _LineAt(int32 offset) const;
|
|
int32 _LineAt(const BPoint& point) const;
|
|
bool _IsOnEmptyLastLine(int32 offset) const;
|
|
|
|
float _NullStyleHeight() const;
|
|
|
|
void _ShowContextMenu(BPoint where);
|
|
|
|
private:
|
|
BPrivate::TextGapBuffer* fText;
|
|
LineBuffer* fLines;
|
|
StyleBuffer* fStyles;
|
|
BRect fTextRect;
|
|
int32 fSelStart;
|
|
int32 fSelEnd;
|
|
bool fCaretVisible;
|
|
bigtime_t fCaretTime;
|
|
int32 fCaretOffset;
|
|
int32 fClickCount;
|
|
bigtime_t fClickTime;
|
|
int32 fDragOffset;
|
|
uint8 fCursor;
|
|
bool fActive;
|
|
bool fStylable;
|
|
float fTabWidth;
|
|
bool fSelectable;
|
|
bool fEditable;
|
|
bool fWrap;
|
|
int32 fMaxBytes;
|
|
BList* fDisallowedChars;
|
|
alignment fAlignment;
|
|
bool fAutoindent;
|
|
BBitmap* fOffscreen;
|
|
color_space fColorSpace;
|
|
bool fResizable;
|
|
BView* fContainerView;
|
|
UndoBuffer* fUndo;
|
|
InlineInput* fInline;
|
|
BMessageRunner* fDragRunner;
|
|
BMessageRunner* fClickRunner;
|
|
BPoint fWhere;
|
|
TextTrackState* fTrackingMouse;
|
|
|
|
float fMinTextRectWidth;
|
|
LayoutData* fLayoutData;
|
|
int32 fLastClickOffset;
|
|
|
|
uint32 _reserved[7];
|
|
};
|
|
|
|
#endif // _TEXTVIEW_H
|