Browse Source

Starting to rework Fl_Text_Display from scratch to make wrapping work correctly. Fixed a few issues that made wrapping crash. Using ASCII range only with fixed character sizes should still wrap as expected?!

git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3@7794 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
pull/49/head
Matthias Melcher 15 years ago
parent
commit
38dcb5a463
  1. 14
      FL/Fl_Text_Buffer.H
  2. 536
      FL/Fl_Text_Display.H
  3. 13
      src/Fl_Text_Buffer.cxx
  4. 2233
      src/Fl_Text_Display.cxx
  5. 2
      test/editor.cxx

14
FL/Fl_Text_Buffer.H

@ -39,7 +39,7 @@
?? "length" is the number of characters in a string ?? "length" is the number of characters in a string
?? "size" is the number of bytes ?? "size" is the number of bytes
?? "index" is the position in a string in number of characters ?? "index" is the position in a string in number of characters
?? "offset" is the position in a strin in bytes (and must be kept on a charater boundary) ?? "offset" is the position in a string in bytes (and must be kept on a charater boundary)
(there seems to be no standard in Uncode documents, howevere "length" is commonly (there seems to be no standard in Uncode documents, howevere "length" is commonly
referencing the number of bytes. Maybe "bytes" and "glyphs" would be the most referencing the number of bytes. Maybe "bytes" and "glyphs" would be the most
obvious way to describe sizes?) obvious way to describe sizes?)
@ -154,6 +154,11 @@ typedef void (*Fl_Text_Predelete_Cb)(int pos, int nDeleted, void* cbArg);
/** /**
\brief This class manages unicode displayed in one or more Fl_Text_Display widgets. \brief This class manages unicode displayed in one or more Fl_Text_Display widgets.
All text in Fl_Text_Buffermust be encoded in UTF-8. All indices used in the
function calls must be aligned to the start of a UTF-8 sequence. All indices
and pointers returned will be aligned. All functions that return a single
character will return that in an unsiged int in UCS-4 encoding.
The Fl_Text_Buffer class is used by the Fl_Text_Display The Fl_Text_Buffer class is used by the Fl_Text_Display
and Fl_Text_Editor to manage complex text data and is based upon the and Fl_Text_Editor to manage complex text data and is based upon the
excellent NEdit text editor engine - see http://www.nedit.org/. excellent NEdit text editor engine - see http://www.nedit.org/.
@ -193,7 +198,7 @@ public:
/** /**
Replaces the entire contents of the text buffer. Replaces the entire contents of the text buffer.
Text must be valid utf8. \param text Text must be valid utf8.
\todo unicode check \todo unicode check
*/ */
void text(const char* text); void text(const char* text);
@ -228,12 +233,16 @@ public:
/** /**
Convert a byte offset in buffer into a memory address. Convert a byte offset in buffer into a memory address.
\param pos byte offset into buffer
\return byte offset converted to a memory address
*/ */
const char *address(int pos) const const char *address(int pos) const
{ return (pos < mGapStart) ? mBuf+pos : mBuf+pos+mGapEnd-mGapStart; } { return (pos < mGapStart) ? mBuf+pos : mBuf+pos+mGapEnd-mGapStart; }
/** /**
Convert a byte offset in buffer into a memory address. Convert a byte offset in buffer into a memory address.
\param pos byte offset into buffer
\return byte offset converted to a memory address
*/ */
char *address(int pos) char *address(int pos)
{ return (pos < mGapStart) ? mBuf+pos : mBuf+pos+mGapEnd-mGapStart; } { return (pos < mGapStart) ? mBuf+pos : mBuf+pos+mGapEnd-mGapStart; }
@ -748,6 +757,7 @@ protected:
expensive and the length will be required by any caller who will continue expensive and the length will be required by any caller who will continue
on to call redisplay). \p pos must be contiguous with the existing text in on to call redisplay). \p pos must be contiguous with the existing text in
the buffer (i.e. not past the end). the buffer (i.e. not past the end).
\return the number of bytes inserted
\todo unicode check \todo unicode check
*/ */
int insert_(int pos, const char* text); int insert_(int pos, const char* text);

536
FL/Fl_Text_Display.H

@ -28,7 +28,7 @@
// //
/* \file /* \file
Fl_Text_Display widget . */ Fl_Text_Display widget . */
#ifndef FL_TEXT_DISPLAY_H #ifndef FL_TEXT_DISPLAY_H
#define FL_TEXT_DISPLAY_H #define FL_TEXT_DISPLAY_H
@ -40,377 +40,405 @@
#include "Fl_Text_Buffer.H" #include "Fl_Text_Buffer.H"
/** /**
This is the FLTK text display widget. It allows the user to \brief Rich text display widget.
view multiple lines of text and supports highlighting and
scrolling. The buffer that is displayed in the widget is managed This is the FLTK text display widget. It allows the user to view multiple lines
by the Fl_Text_Buffer of text and supports highlighting and scrolling. The buffer that is displayed
class. in the widget is managed by the Fl_Text_Buffer class. A single Text Buffer
*/ can be displayed by multiple Text Displays.
*/
class FL_EXPORT Fl_Text_Display: public Fl_Group class FL_EXPORT Fl_Text_Display: public Fl_Group
{ {
public: public:
/** /**
text display cursor shapes enumeration text display cursor shapes enumeration
*/ */
enum { enum {
NORMAL_CURSOR, CARET_CURSOR, DIM_CURSOR, NORMAL_CURSOR, /**< I-beam */
BLOCK_CURSOR, HEAVY_CURSOR CARET_CURSOR, /**< caret under the text */
}; DIM_CURSOR, /**< dim I-beam */
BLOCK_CURSOR, /**< unfille box under the current character */
HEAVY_CURSOR /**< thick I-beam */
};
/** /**
the character position is the left edge of a character wheras the character position is the left edge of a character wheras
the cursor is thought to be between the centers of to consecutive the cursor is thought to be between the centers of to consecutive
characters. characters.
*/ */
enum { enum {
CURSOR_POS, CHARACTER_POS CURSOR_POS,
}; CHARACTER_POS
};
/** /**
drag types- they match Fl::event_clicks() so that single clicking to drag types - they match Fl::event_clicks() so that single clicking to
start a collection selects by character, double clicking selects by start a collection selects by character, double clicking selects by
word and triple clicking selects by line. word and triple clicking selects by line.
*/ */
enum { enum {
DRAG_CHAR = 0, DRAG_WORD = 1, DRAG_LINE = 2 DRAG_CHAR = 0,
}; DRAG_WORD = 1,
DRAG_LINE = 2
friend void fl_text_drag_me(int pos, Fl_Text_Display* d); };
typedef void (*Unfinished_Style_Cb)(int, void *); friend void fl_text_drag_me(int pos, Fl_Text_Display* d);
/** typedef void (*Unfinished_Style_Cb)(int, void *);
style attributes - currently not implemented!
*/
enum {
ATTR_NONE = 0,
ATTR_UNDERLINE = 1,
ATTR_HIDDEN = 2
};
/** /**
This structure associates the color,font,size of a string to draw This structure associates the color,font,size of a string to draw
with an attribute mask matching attr with an attribute mask matching attr
*/ */
struct Style_Table_Entry { struct Style_Table_Entry {
Fl_Color color; Fl_Color color;
Fl_Font font; Fl_Font font;
int size; Fl_Fontsize size;
unsigned attr; unsigned attr;
}; };
Fl_Text_Display(int X, int Y, int W, int H, const char *l = 0);
~Fl_Text_Display();
Fl_Text_Display(int X, int Y, int W, int H, const char *l = 0); virtual int handle(int e);
~Fl_Text_Display();
virtual int handle(int e); void buffer(Fl_Text_Buffer* buf);
void buffer(Fl_Text_Buffer* buf);
/**
Sets the current text buffer associated with the text widget.
Multiple text widgets can be associated with the same text buffer.
\param buf new text buffer
*/
void buffer(Fl_Text_Buffer& buf) { buffer(&buf); }
/** /**
Sets or gets the current text buffer associated with the text widget. Gets the current text buffer associated with the text widget.
Multiple text widgets can be associated with the same text buffer. Multiple text widgets can be associated with the same text buffer.
*/ \return current text buffer
void buffer(Fl_Text_Buffer& buf) { buffer(&buf); } */
Fl_Text_Buffer* buffer() const { return mBuffer; }
/**
Gets the current text buffer associated with the text widget. void redisplay_range(int start, int end);
Multiple text widgets can be associated with the same text buffer. void scroll(int topLineNum, int horizOffset);
*/ void insert(const char* text);
Fl_Text_Buffer* buffer() const { return mBuffer; } void overstrike(const char* text);
void insert_position(int newPos);
void redisplay_range(int start, int end);
void scroll(int topLineNum, int horizOffset);
void insert(const char* text);
void overstrike(const char* text);
void insert_position(int newPos);
/** /**
Gets the position of the text insertion cursor for text display Gets the position of the text insertion cursor for text display
\return insert position index into text buffer
*/ */
int insert_position() const { return mCursorPos; } int insert_position() const { return mCursorPos; }
int in_selection(int x, int y) const; int in_selection(int x, int y) const;
void show_insert_position(); void show_insert_position();
int move_right();
int move_left(); int move_right();
int move_up(); int move_left();
int move_down(); int move_up();
int count_lines(int start, int end, bool start_pos_is_line_start) const; int move_down();
int line_start(int pos) const; int count_lines(int start, int end, bool start_pos_is_line_start) const;
int line_end(int pos, bool start_pos_is_line_start) const; int line_start(int pos) const;
int skip_lines(int startPos, int nLines, bool startPosIsLineStart); int line_end(int pos, bool start_pos_is_line_start) const;
int rewind_lines(int startPos, int nLines); int skip_lines(int startPos, int nLines, bool startPosIsLineStart);
void next_word(void); int rewind_lines(int startPos, int nLines);
void previous_word(void); void next_word(void);
void show_cursor(int b = 1); void previous_word(void);
void show_cursor(int b = 1);
/** /**
Hides the text cursor Hides the text cursor
*/ */
void hide_cursor() { show_cursor(0); } void hide_cursor() { show_cursor(0); }
void cursor_style(int style); void cursor_style(int style);
/** /**
Sets or gets the text cursor color. Gets the text cursor color.
\return cursor color
*/ */
Fl_Color cursor_color() const {return mCursor_color;} Fl_Color cursor_color() const {return mCursor_color;}
/** /**
Sets or gets the text cursor color. Sets the text cursor color.
\param n new cursor color
*/ */
void cursor_color(Fl_Color n) {mCursor_color = n;} void cursor_color(Fl_Color n) {mCursor_color = n;}
/** /**
Sets or gets the width/height of the scrollbars. Gets the width/height of the scrollbars.
/return width of scrollbars
*/ */
int scrollbar_width() const { return scrollbar_width_; } int scrollbar_width() const { return scrollbar_width_; }
/** /**
Sets or gets the width/height of the scrollbars. Sets the width/height of the scrollbars.
\param W width of scrollbars
*/ */
void scrollbar_width(int W) { scrollbar_width_ = W; } void scrollbar_width(int W) { scrollbar_width_ = W; }
/** /**
Gets the scrollbar alignment type Gets the scrollbar alignment type
\return scrollbar alignment
*/ */
Fl_Align scrollbar_align() const { return scrollbar_align_; } Fl_Align scrollbar_align() const { return scrollbar_align_; }
/** /**
Sets the scrollbar alignment type Sets the scrollbar alignment type
\param a new scrollbar alignment
*/ */
void scrollbar_align(Fl_Align a) { scrollbar_align_ = a; } void scrollbar_align(Fl_Align a) { scrollbar_align_ = a; }
/** /**
Moves the insert position to the beginning of the current word. Moves the insert position to the beginning of the current word.
\param pos start calculation at this index
\return beginning of the wors
*/ */
int word_start(int pos) const { return buffer()->word_start(pos); } int word_start(int pos) const { return buffer()->word_start(pos); }
/** /**
Moves the insert position to the end of the current word. Moves the insert position to the end of the current word.
\param pos start calculation at this index
\return index of first character after the end of the word
*/ */
int word_end(int pos) const { return buffer()->word_end(pos); } int word_end(int pos) const { return buffer()->word_end(pos); }
void highlight_data(Fl_Text_Buffer *styleBuffer, void highlight_data(Fl_Text_Buffer *styleBuffer,
const Style_Table_Entry *styleTable, const Style_Table_Entry *styleTable,
int nStyles, char unfinishedStyle, int nStyles, char unfinishedStyle,
Unfinished_Style_Cb unfinishedHighlightCB, Unfinished_Style_Cb unfinishedHighlightCB,
void *cbArg); void *cbArg);
int position_style(int lineStartPos, int lineLen, int lineIndex) const; int position_style(int lineStartPos, int lineLen, int lineIndex) const;
/** /**
\todo FIXME : get set methods pointing on shortcut_ \todo FIXME : get set methods pointing on shortcut_
have no effects as shortcut_ is unused in this class and derived! have no effects as shortcut_ is unused in this class and derived!
\return the current shortcut key
*/ */
int shortcut() const {return shortcut_;} int shortcut() const {return shortcut_;}
/** /**
\todo FIXME : get set methods pointing on shortcut_ \todo FIXME : get set methods pointing on shortcut_
have no effects as shortcut_ is unused in this class and derived! have no effects as shortcut_ is unused in this class and derived!
\param s the new shortcut key
*/ */
void shortcut(int s) {shortcut_ = s;} void shortcut(int s) {shortcut_ = s;}
/** /**
Gets the default font used when drawing text in the widget. Gets the default font used when drawing text in the widget.
\return current text font face unless overriden by a style
*/ */
Fl_Font textfont() const {return textfont_;} Fl_Font textfont() const {return textfont_;}
/** /**
Sets the default font used when drawing text in the widget. Sets the default font used when drawing text in the widget.
\param s default text font face
*/ */
void textfont(Fl_Font s) {textfont_ = s;} void textfont(Fl_Font s) {textfont_ = s;}
/** /**
Gets the default size of text in the widget. Gets the default size of text in the widget.
\return current text height unless overriden by a style
*/ */
Fl_Fontsize textsize() const {return textsize_;} Fl_Fontsize textsize() const {return textsize_;}
/** /**
Sets the default size of text in the widget. Sets the default size of text in the widget.
\param s new text size
*/ */
void textsize(Fl_Fontsize s) {textsize_ = s;} void textsize(Fl_Fontsize s) {textsize_ = s;}
/** /**
Gets the default color of text in the widget. Gets the default color of text in the widget.
\return text color unless overriden by a style
*/ */
Fl_Color textcolor() const {return textcolor_;} Fl_Color textcolor() const {return textcolor_;}
/** /**
Sets the default color of text in the widget. Sets the default color of text in the widget.
\param n new text color
*/ */
void textcolor(Fl_Color n) {textcolor_ = n;} void textcolor(Fl_Color n) {textcolor_ = n;}
int wrapped_column(int row, int column) const; int wrapped_column(int row, int column) const;
int wrapped_row(int row) const; int wrapped_row(int row) const;
void wrap_mode(int wrap, int wrap_margin); void wrap_mode(int wrap, int wrap_margin);
virtual void resize(int X, int Y, int W, int H); virtual void resize(int X, int Y, int W, int H);
protected: protected:
// Most (all?) of this stuff should only be called from resize() or // Most (all?) of this stuff should only be called from resize() or
// draw(). // draw().
// Anything with "vline" indicates thats it deals with currently // Anything with "vline" indicates thats it deals with currently
// visible lines. // visible lines.
virtual void draw(); virtual void draw();
void draw_text(int X, int Y, int W, int H); void draw_text(int X, int Y, int W, int H);
void draw_range(int start, int end); void draw_range(int start, int end);
void draw_cursor(int, int); void draw_cursor(int, int);
void draw_string(int style, int x, int y, int toX, const char *string, void draw_string(int style, int x, int y, int toX, const char *string,
int nChars) const; int nChars) const;
void draw_vline(int visLineNum, int leftClip, int rightClip, void draw_vline(int visLineNum, int leftClip, int rightClip,
int leftCharIndex, int rightCharIndex); int leftCharIndex, int rightCharIndex);
int find_x(const char *s, int len, int style, int x) const; int find_x(const char *s, int len, int style, int x) const;
enum { DRAW_LINE, FIND_INDEX, GET_WIDTH };
enum {
DRAW_LINE,
FIND_INDEX,
GET_WIDTH
};
int handle_vline(int mode, int handle_vline(int mode,
int lineStart, int lineLen, int leftChar, int rightChar, int lineStart, int lineLen, int leftChar, int rightChar,
int topClip, int bottomClip, int topClip, int bottomClip,
int leftClip, int rightClip) const; int leftClip, int rightClip) const;
void draw_line_numbers(bool clearAll); void draw_line_numbers(bool clearAll);
void clear_rect(int style, int x, int y, int width, int height) const; void clear_rect(int style, int x, int y, int width, int height) const;
void display_insert(); void display_insert();
void offset_line_starts(int newTopLineNum); void offset_line_starts(int newTopLineNum);
void calc_line_starts(int startLine, int endLine); void calc_line_starts(int startLine, int endLine);
void update_line_starts(int pos, int charsInserted, int charsDeleted, void update_line_starts(int pos, int charsInserted, int charsDeleted,
int linesInserted, int linesDeleted, int *scrolled); int linesInserted, int linesDeleted, int *scrolled);
void calc_last_char(); void calc_last_char();
int position_to_line( int pos, int* lineNum ) const; int position_to_line( int pos, int* lineNum ) const;
int string_width(const char* string, int length, int style) const; int string_width(const char* string, int length, int style) const;
static void scroll_timer_cb(void*); static void scroll_timer_cb(void*);
static void buffer_predelete_cb(int pos, int nDeleted, void* cbArg); static void buffer_predelete_cb(int pos, int nDeleted, void* cbArg);
static void buffer_modified_cb(int pos, int nInserted, int nDeleted, static void buffer_modified_cb(int pos, int nInserted, int nDeleted,
int nRestyled, const char* deletedText, int nRestyled, const char* deletedText,
void* cbArg); void* cbArg);
static void h_scrollbar_cb(Fl_Scrollbar* w, Fl_Text_Display* d); static void h_scrollbar_cb(Fl_Scrollbar* w, Fl_Text_Display* d);
static void v_scrollbar_cb( Fl_Scrollbar* w, Fl_Text_Display* d); static void v_scrollbar_cb( Fl_Scrollbar* w, Fl_Text_Display* d);
void update_v_scrollbar(); void update_v_scrollbar();
void update_h_scrollbar(); void update_h_scrollbar();
int measure_vline(int visLineNum) const; int measure_vline(int visLineNum) const;
int longest_vline() const; int longest_vline() const;
int empty_vlines() const; int empty_vlines() const;
int vline_length(int visLineNum) const; int vline_length(int visLineNum) const;
int xy_to_position(int x, int y, int PosType = CHARACTER_POS) const; int xy_to_position(int x, int y, int PosType = CHARACTER_POS) const;
void xy_to_rowcol(int x, int y, int* row, int* column, void xy_to_rowcol(int x, int y, int* row, int* column,
int PosType = CHARACTER_POS) const; int PosType = CHARACTER_POS) const;
int position_to_xy(int pos, int* x, int* y) const; int position_to_xy(int pos, int* x, int* y) const;
void maintain_absolute_top_line_number(int state); void maintain_absolute_top_line_number(int state);
int get_absolute_top_line_number() const; int get_absolute_top_line_number() const;
void absolute_top_line_number(int oldFirstChar); void absolute_top_line_number(int oldFirstChar);
int maintaining_absolute_top_line_number() const; int maintaining_absolute_top_line_number() const;
void reset_absolute_top_line_number(); void reset_absolute_top_line_number();
int position_to_linecol(int pos, int* lineNum, int* column) const; int position_to_linecol(int pos, int* lineNum, int* column) const;
void scroll_(int topLineNum, int horizOffset); void scroll_(int topLineNum, int horizOffset);
void extend_range_for_styles(int* start, int* end); void extend_range_for_styles(int* start, int* end);
void find_wrap_range(const char *deletedText, int pos, int nInserted, void find_wrap_range(const char *deletedText, int pos, int nInserted,
int nDeleted, int *modRangeStart, int *modRangeEnd, int nDeleted, int *modRangeStart, int *modRangeEnd,
int *linesInserted, int *linesDeleted); int *linesInserted, int *linesDeleted);
void measure_deleted_lines(int pos, int nDeleted); void measure_deleted_lines(int pos, int nDeleted);
void wrapped_line_counter(Fl_Text_Buffer *buf, int startPos, int maxPos, void wrapped_line_counter(Fl_Text_Buffer *buf, int startPos, int maxPos,
int maxLines, bool startPosIsLineStart, int maxLines, bool startPosIsLineStart,
int styleBufOffset, int *retPos, int *retLines, int styleBufOffset, int *retPos, int *retLines,
int *retLineStart, int *retLineEnd, int *retLineStart, int *retLineEnd,
bool countLastLineMissingNewLine = true) const; bool countLastLineMissingNewLine = true) const;
void find_line_end(int pos, bool start_pos_is_line_start, int *lineEnd, void find_line_end(int pos, bool start_pos_is_line_start, int *lineEnd,
int *nextLineStart) const; int *nextLineStart) const;
int measure_proportional_character(const char *s, int colNum, int pos) const; int measure_proportional_character(const char *s, int colNum, int pos) const;
int wrap_uses_character(int lineEndPos) const; int wrap_uses_character(int lineEndPos) const;
int damage_range1_start, damage_range1_end; int damage_range1_start, damage_range1_end;
int damage_range2_start, damage_range2_end; int damage_range2_start, damage_range2_end;
int mCursorPos; int mCursorPos;
int mCursorOn; int mCursorOn;
int mCursorOldY; /* Y pos. of cursor for blanking */ int mCursorOldY; /* Y pos. of cursor for blanking */
int mCursorToHint; /* Tells the buffer modified callback int mCursorToHint; /* Tells the buffer modified callback
where to move the cursor, to reduce where to move the cursor, to reduce
the number of redraw calls */ the number of redraw calls */
int mCursorStyle; /* One of enum cursorStyles above */ int mCursorStyle; /* One of enum cursorStyles above */
int mCursorPreferredCol; /* Column for vert. cursor movement */ int mCursorPreferredCol; /* Column for vert. cursor movement */
int mNVisibleLines; /* # of visible (displayed) lines */ int mNVisibleLines; /* # of visible (displayed) lines */
int mNBufferLines; /* # of newlines in the buffer */ int mNBufferLines; /* # of newlines in the buffer */
Fl_Text_Buffer* mBuffer; /* Contains text to be displayed */ Fl_Text_Buffer* mBuffer; /* Contains text to be displayed */
Fl_Text_Buffer* mStyleBuffer; /* Optional parallel buffer containing Fl_Text_Buffer* mStyleBuffer; /* Optional parallel buffer containing
color and font information */ color and font information */
int mFirstChar, mLastChar; /* Buffer positions of first and last int mFirstChar, mLastChar; /* Buffer positions of first and last
displayed character (lastChar points displayed character (lastChar points
either to a newline or one character either to a newline or one character
beyond the end of the buffer) */ beyond the end of the buffer) */
int mContinuousWrap; /* Wrap long lines when displaying */ int mContinuousWrap; /* Wrap long lines when displaying */
int mWrapMargin; /* Margin in # of char positions for int mWrapMargin; /* Margin in # of char positions for
wrapping in continuousWrap mode */ wrapping in continuousWrap mode */
int* mLineStarts; int* mLineStarts;
int mTopLineNum; /* Line number of top displayed line int mTopLineNum; /* Line number of top displayed line
of file (first line of file is 1) */ of file (first line of file is 1) */
int mAbsTopLineNum; /* In continuous wrap mode, the line int mAbsTopLineNum; /* In continuous wrap mode, the line
number of the top line if the text number of the top line if the text
were not wrapped (note that this is were not wrapped (note that this is
only maintained as needed). */ only maintained as needed). */
int mNeedAbsTopLineNum; /* Externally settable flag to continue int mNeedAbsTopLineNum; /* Externally settable flag to continue
maintaining absTopLineNum even if maintaining absTopLineNum even if
it isn't needed for line # display */ it isn't needed for line # display */
int mHorizOffset; /* Horizontal scroll pos. in pixels */ int mHorizOffset; /* Horizontal scroll pos. in pixels */
int mTopLineNumHint; /* Line number of top displayed line int mTopLineNumHint; /* Line number of top displayed line
of file (first line of file is 1) */ of file (first line of file is 1) */
int mHorizOffsetHint; /* Horizontal scroll pos. in pixels */ int mHorizOffsetHint; /* Horizontal scroll pos. in pixels */
int mNStyles; /* Number of entries in styleTable */ int mNStyles; /* Number of entries in styleTable */
const Style_Table_Entry *mStyleTable; /* Table of fonts and colors for const Style_Table_Entry *mStyleTable; /* Table of fonts and colors for
coloring/syntax-highlighting */ coloring/syntax-highlighting */
char mUnfinishedStyle; /* Style buffer entry which triggers char mUnfinishedStyle; /* Style buffer entry which triggers
on-the-fly reparsing of region */ on-the-fly reparsing of region */
Unfinished_Style_Cb mUnfinishedHighlightCB; /* Callback to parse "unfinished" */ Unfinished_Style_Cb mUnfinishedHighlightCB; /* Callback to parse "unfinished" */
/* regions */ /* regions */
void* mHighlightCBArg; /* Arg to unfinishedHighlightCB */ void* mHighlightCBArg; /* Arg to unfinishedHighlightCB */
int mMaxsize; int mMaxsize;
int mSuppressResync; /* Suppress resynchronization of line int mSuppressResync; /* Suppress resynchronization of line
starts during buffer updates */ starts during buffer updates */
int mNLinesDeleted; /* Number of lines deleted during int mNLinesDeleted; /* Number of lines deleted during
buffer modification (only used buffer modification (only used
when resynchronization is suppressed) */ when resynchronization is suppressed) */
int mModifyingTabDistance; /* Whether tab distance is being int mModifyingTabDistance; /* Whether tab distance is being
modified */ modified */
Fl_Color mCursor_color; Fl_Color mCursor_color;
Fl_Scrollbar* mHScrollBar; Fl_Scrollbar* mHScrollBar;
Fl_Scrollbar* mVScrollBar; Fl_Scrollbar* mVScrollBar;
int scrollbar_width_; int scrollbar_width_;
Fl_Align scrollbar_align_; Fl_Align scrollbar_align_;
int dragPos, dragType, dragging; int dragPos, dragType, dragging;
int display_insert_position_hint; int display_insert_position_hint;
struct { int x, y, w, h; } text_area; struct { int x, y, w, h; } text_area;
int shortcut_; int shortcut_;
Fl_Font textfont_; Fl_Font textfont_;
Fl_Fontsize textsize_; Fl_Fontsize textsize_;
Fl_Color textcolor_; Fl_Color textcolor_;
// The following are not presently used from the original NEdit code, // The following are not presently used from the original NEdit code,
// but are being put here so that future versions of Fl_Text_Display // but are being put here so that future versions of Fl_Text_Display
// can implement line numbers without breaking binary compatibility. // can implement line numbers without breaking binary compatibility.
/* Line number margin and width */ /* Line number margin and width */
int mLineNumLeft, mLineNumWidth; int mLineNumLeft, mLineNumWidth;
}; };
#endif #endif

13
src/Fl_Text_Buffer.cxx

@ -270,6 +270,10 @@ char Fl_Text_Buffer::byte_at(int pos) const {
*/ */
void Fl_Text_Buffer::insert(int pos, const char *text) void Fl_Text_Buffer::insert(int pos, const char *text)
{ {
/* check if there is actually any text */
if (!text || !*text)
return;
/* if pos is not contiguous to existing text, make it */ /* if pos is not contiguous to existing text, make it */
if (pos > mLength) if (pos > mLength)
pos = mLength; pos = mLength;
@ -1010,7 +1014,7 @@ int Fl_Text_Buffer::search_forward(int startPos, const char *searchString,
return 1; return 1;
} }
// FIXME: character is ucs-4 // FIXME: character is ucs-4
} while ((matchCase ? char_at(bp++) == *sp++ : } while ((matchCase ? char_at(bp++) == (unsigned int)*sp++ :
toupper(char_at(bp++)) == toupper(*sp++)) toupper(char_at(bp++)) == toupper(*sp++))
&& bp < length()); && bp < length());
startPos++; startPos++;
@ -1040,7 +1044,7 @@ int Fl_Text_Buffer::search_backward(int startPos, const char *searchString,
return 1; return 1;
} }
// FIXME: character is ucs-4 // FIXME: character is ucs-4
} while ((matchCase ? char_at(bp--) == *sp-- : } while ((matchCase ? char_at(bp--) == (unsigned int)*sp-- :
toupper(char_at(bp--)) == toupper(*sp--)) toupper(char_at(bp--)) == toupper(*sp--))
&& bp >= 0); && bp >= 0);
startPos--; startPos--;
@ -1128,6 +1132,9 @@ int Fl_Text_Buffer::findchars_backward(int startPos, const char *searchChars,
*/ */
int Fl_Text_Buffer::insert_(int pos, const char *text) int Fl_Text_Buffer::insert_(int pos, const char *text)
{ {
if (!text || !*text)
return 0;
int insertedLength = strlen(text); int insertedLength = strlen(text);
/* Prepare the buffer to receive the new text. If the new text fits in /* Prepare the buffer to receive the new text. If the new text fits in
@ -1246,7 +1253,7 @@ int Fl_Text_Selection::position(int *startpos, int *endpos) const {
*/ */
int Fl_Text_Selection::includes(int pos) const { int Fl_Text_Selection::includes(int pos) const {
return (selected() && pos >= start() && pos < end() ); return (selected() && pos >= start() && pos < end() );
} }
/* /*

2233
src/Fl_Text_Display.cxx

File diff suppressed because it is too large Load Diff

2
test/editor.cxx

@ -785,6 +785,7 @@ Fl_Window* new_view() {
Fl_Menu_Bar* m = new Fl_Menu_Bar(0, 0, 660, 30); Fl_Menu_Bar* m = new Fl_Menu_Bar(0, 0, 660, 30);
m->copy(menuitems, w); m->copy(menuitems, w);
w->editor = new Fl_Text_Editor(0, 30, 660, 370); w->editor = new Fl_Text_Editor(0, 30, 660, 370);
w->editor->wrap_mode(1, 32);
w->editor->textfont(FL_COURIER); w->editor->textfont(FL_COURIER);
w->editor->textsize(TS); w->editor->textsize(TS);
w->editor->buffer(textbuf); w->editor->buffer(textbuf);
@ -812,6 +813,7 @@ int main(int argc, char **argv) {
" if ( fnfc.show() ) return;\n" " if ( fnfc.show() ) return;\n"
" save_file(fnfc.filename());\n" " save_file(fnfc.filename());\n"
"}\n\n" "}\n\n"
" 2 4 6 8 0 2 4 6 8 0 2 4 6 8 0 2 4 6 8 0\n\n"
"// Falsches Üben von Xylophonmusik quält jeden größeren Zwerg\n" "// Falsches Üben von Xylophonmusik quält jeden größeren Zwerg\n"
"// (= Wrongful practicing of xylophone music tortures every larger dwarf)\n" "// (= Wrongful practicing of xylophone music tortures every larger dwarf)\n"
"\n" "\n"

Loading…
Cancel
Save