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
This commit is contained in:
parent
644fe62283
commit
38dcb5a463
@ -39,7 +39,7 @@
|
||||
?? "length" is the number of characters in a string
|
||||
?? "size" is the number of bytes
|
||||
?? "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
|
||||
referencing the number of bytes. Maybe "bytes" and "glyphs" would be the most
|
||||
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.
|
||||
|
||||
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
|
||||
and Fl_Text_Editor to manage complex text data and is based upon the
|
||||
excellent NEdit text editor engine - see http://www.nedit.org/.
|
||||
@ -193,7 +198,7 @@ public:
|
||||
|
||||
/**
|
||||
Replaces the entire contents of the text buffer.
|
||||
Text must be valid utf8.
|
||||
\param text Text must be valid utf8.
|
||||
\todo unicode check
|
||||
*/
|
||||
void text(const char* text);
|
||||
@ -228,12 +233,16 @@ public:
|
||||
|
||||
/**
|
||||
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
|
||||
{ return (pos < mGapStart) ? mBuf+pos : mBuf+pos+mGapEnd-mGapStart; }
|
||||
|
||||
/**
|
||||
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)
|
||||
{ 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
|
||||
on to call redisplay). \p pos must be contiguous with the existing text in
|
||||
the buffer (i.e. not past the end).
|
||||
\return the number of bytes inserted
|
||||
\todo unicode check
|
||||
*/
|
||||
int insert_(int pos, const char* text);
|
||||
|
||||
@ -28,7 +28,7 @@
|
||||
//
|
||||
|
||||
/* \file
|
||||
Fl_Text_Display widget . */
|
||||
Fl_Text_Display widget . */
|
||||
|
||||
#ifndef FL_TEXT_DISPLAY_H
|
||||
#define FL_TEXT_DISPLAY_H
|
||||
@ -40,377 +40,405 @@
|
||||
#include "Fl_Text_Buffer.H"
|
||||
|
||||
/**
|
||||
This is the FLTK text display widget. It allows the user to
|
||||
view multiple lines of text and supports highlighting and
|
||||
scrolling. The buffer that is displayed in the widget is managed
|
||||
by the Fl_Text_Buffer
|
||||
class.
|
||||
*/
|
||||
\brief Rich text display widget.
|
||||
|
||||
This is the FLTK text display widget. It allows the user to view multiple lines
|
||||
of text and supports highlighting and scrolling. The buffer that is displayed
|
||||
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
|
||||
{
|
||||
public:
|
||||
public:
|
||||
|
||||
/**
|
||||
text display cursor shapes enumeration
|
||||
*/
|
||||
enum {
|
||||
NORMAL_CURSOR, CARET_CURSOR, DIM_CURSOR,
|
||||
BLOCK_CURSOR, HEAVY_CURSOR
|
||||
};
|
||||
|
||||
enum {
|
||||
NORMAL_CURSOR, /**< I-beam */
|
||||
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 cursor is thought to be between the centers of to consecutive
|
||||
characters.
|
||||
*/
|
||||
enum {
|
||||
CURSOR_POS, CHARACTER_POS
|
||||
};
|
||||
|
||||
/**
|
||||
drag types- they match Fl::event_clicks() so that single clicking to
|
||||
start a collection selects by character, double clicking selects by
|
||||
word and triple clicking selects by line.
|
||||
*/
|
||||
enum {
|
||||
DRAG_CHAR = 0, DRAG_WORD = 1, DRAG_LINE = 2
|
||||
};
|
||||
enum {
|
||||
CURSOR_POS,
|
||||
CHARACTER_POS
|
||||
};
|
||||
|
||||
friend void fl_text_drag_me(int pos, Fl_Text_Display* d);
|
||||
|
||||
typedef void (*Unfinished_Style_Cb)(int, void *);
|
||||
|
||||
/**
|
||||
style attributes - currently not implemented!
|
||||
drag types - they match Fl::event_clicks() so that single clicking to
|
||||
start a collection selects by character, double clicking selects by
|
||||
word and triple clicking selects by line.
|
||||
*/
|
||||
enum {
|
||||
ATTR_NONE = 0,
|
||||
ATTR_UNDERLINE = 1,
|
||||
ATTR_HIDDEN = 2
|
||||
};
|
||||
enum {
|
||||
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 *);
|
||||
|
||||
/**
|
||||
This structure associates the color,font,size of a string to draw
|
||||
with an attribute mask matching attr
|
||||
*/
|
||||
struct Style_Table_Entry {
|
||||
Fl_Color color;
|
||||
Fl_Font font;
|
||||
int size;
|
||||
unsigned attr;
|
||||
};
|
||||
|
||||
Fl_Text_Display(int X, int Y, int W, int H, const char *l = 0);
|
||||
~Fl_Text_Display();
|
||||
|
||||
virtual int handle(int e);
|
||||
void buffer(Fl_Text_Buffer* buf);
|
||||
struct Style_Table_Entry {
|
||||
Fl_Color color;
|
||||
Fl_Font font;
|
||||
Fl_Fontsize size;
|
||||
unsigned attr;
|
||||
};
|
||||
|
||||
Fl_Text_Display(int X, int Y, int W, int H, const char *l = 0);
|
||||
~Fl_Text_Display();
|
||||
|
||||
virtual int handle(int e);
|
||||
|
||||
void buffer(Fl_Text_Buffer* buf);
|
||||
|
||||
/**
|
||||
Sets or gets the current text buffer associated with the text widget.
|
||||
Multiple text widgets can be associated with the same text buffer.
|
||||
*/
|
||||
void buffer(Fl_Text_Buffer& buf) { 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); }
|
||||
|
||||
/**
|
||||
Gets the current text buffer associated with the text widget.
|
||||
Multiple text widgets can be associated with the same text buffer.
|
||||
*/
|
||||
Fl_Text_Buffer* buffer() const { return mBuffer; }
|
||||
/**
|
||||
Gets the current text buffer associated with the text widget.
|
||||
Multiple text widgets can be associated with the same text buffer.
|
||||
\return current text buffer
|
||||
*/
|
||||
Fl_Text_Buffer* buffer() const { return mBuffer; }
|
||||
|
||||
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);
|
||||
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
|
||||
\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;
|
||||
void show_insert_position();
|
||||
int move_right();
|
||||
int move_left();
|
||||
int move_up();
|
||||
int move_down();
|
||||
int count_lines(int start, int end, bool start_pos_is_line_start) const;
|
||||
int line_start(int pos) const;
|
||||
int line_end(int pos, bool start_pos_is_line_start) const;
|
||||
int skip_lines(int startPos, int nLines, bool startPosIsLineStart);
|
||||
int rewind_lines(int startPos, int nLines);
|
||||
void next_word(void);
|
||||
void previous_word(void);
|
||||
void show_cursor(int b = 1);
|
||||
int in_selection(int x, int y) const;
|
||||
void show_insert_position();
|
||||
|
||||
int move_right();
|
||||
int move_left();
|
||||
int move_up();
|
||||
int move_down();
|
||||
int count_lines(int start, int end, bool start_pos_is_line_start) const;
|
||||
int line_start(int pos) const;
|
||||
int line_end(int pos, bool start_pos_is_line_start) const;
|
||||
int skip_lines(int startPos, int nLines, bool startPosIsLineStart);
|
||||
int rewind_lines(int startPos, int nLines);
|
||||
void next_word(void);
|
||||
void previous_word(void);
|
||||
|
||||
void show_cursor(int b = 1);
|
||||
|
||||
/**
|
||||
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
|
||||
\return scrollbar alignment
|
||||
*/
|
||||
Fl_Align scrollbar_align() const { return scrollbar_align_; }
|
||||
Fl_Align scrollbar_align() const { return scrollbar_align_; }
|
||||
|
||||
/**
|
||||
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.
|
||||
\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); }
|
||||
|
||||
|
||||
void highlight_data(Fl_Text_Buffer *styleBuffer,
|
||||
const Style_Table_Entry *styleTable,
|
||||
int nStyles, char unfinishedStyle,
|
||||
Unfinished_Style_Cb unfinishedHighlightCB,
|
||||
void *cbArg);
|
||||
|
||||
int word_end(int pos) const { return buffer()->word_end(pos); }
|
||||
|
||||
|
||||
void highlight_data(Fl_Text_Buffer *styleBuffer,
|
||||
const Style_Table_Entry *styleTable,
|
||||
int nStyles, char unfinishedStyle,
|
||||
Unfinished_Style_Cb unfinishedHighlightCB,
|
||||
void *cbArg);
|
||||
|
||||
int position_style(int lineStartPos, int lineLen, int lineIndex) const;
|
||||
|
||||
/**
|
||||
\todo FIXME : get set methods pointing on shortcut_
|
||||
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_
|
||||
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.
|
||||
\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.
|
||||
\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.
|
||||
\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.
|
||||
\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.
|
||||
\param n new text color
|
||||
*/
|
||||
void textcolor(Fl_Color n) {textcolor_ = n;}
|
||||
|
||||
int wrapped_column(int row, int column) const;
|
||||
int wrapped_row(int row) const;
|
||||
void wrap_mode(int wrap, int wrap_margin);
|
||||
|
||||
virtual void resize(int X, int Y, int W, int H);
|
||||
|
||||
protected:
|
||||
// Most (all?) of this stuff should only be called from resize() or
|
||||
// draw().
|
||||
// Anything with "vline" indicates thats it deals with currently
|
||||
// visible lines.
|
||||
|
||||
virtual void draw();
|
||||
void draw_text(int X, int Y, int W, int H);
|
||||
void draw_range(int start, int end);
|
||||
void draw_cursor(int, int);
|
||||
|
||||
void draw_string(int style, int x, int y, int toX, const char *string,
|
||||
void textcolor(Fl_Color n) {textcolor_ = n;}
|
||||
|
||||
int wrapped_column(int row, int column) const;
|
||||
int wrapped_row(int row) const;
|
||||
void wrap_mode(int wrap, int wrap_margin);
|
||||
|
||||
virtual void resize(int X, int Y, int W, int H);
|
||||
|
||||
protected:
|
||||
// Most (all?) of this stuff should only be called from resize() or
|
||||
// draw().
|
||||
// Anything with "vline" indicates thats it deals with currently
|
||||
// visible lines.
|
||||
|
||||
virtual void draw();
|
||||
void draw_text(int X, int Y, int W, int H);
|
||||
void draw_range(int start, int end);
|
||||
void draw_cursor(int, int);
|
||||
|
||||
void draw_string(int style, int x, int y, int toX, const char *string,
|
||||
int nChars) const;
|
||||
|
||||
void draw_vline(int visLineNum, int leftClip, int rightClip,
|
||||
int leftCharIndex, int rightCharIndex);
|
||||
|
||||
|
||||
void draw_vline(int visLineNum, int leftClip, int rightClip,
|
||||
int leftCharIndex, int rightCharIndex);
|
||||
|
||||
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 lineStart, int lineLen, int leftChar, int rightChar,
|
||||
int topClip, int bottomClip,
|
||||
int leftClip, int rightClip) const;
|
||||
|
||||
void draw_line_numbers(bool clearAll);
|
||||
|
||||
void clear_rect(int style, int x, int y, int width, int height) const;
|
||||
void display_insert();
|
||||
|
||||
void offset_line_starts(int newTopLineNum);
|
||||
|
||||
void calc_line_starts(int startLine, int endLine);
|
||||
|
||||
void update_line_starts(int pos, int charsInserted, int charsDeleted,
|
||||
int linesInserted, int linesDeleted, int *scrolled);
|
||||
|
||||
void calc_last_char();
|
||||
|
||||
int position_to_line( int pos, int* lineNum ) const;
|
||||
int string_width(const char* string, int length, int style) const;
|
||||
|
||||
static void scroll_timer_cb(void*);
|
||||
|
||||
static void buffer_predelete_cb(int pos, int nDeleted, void* cbArg);
|
||||
static void buffer_modified_cb(int pos, int nInserted, int nDeleted,
|
||||
int nRestyled, const char* deletedText,
|
||||
void* cbArg);
|
||||
|
||||
static void h_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_h_scrollbar();
|
||||
int measure_vline(int visLineNum) const;
|
||||
int longest_vline() const;
|
||||
int empty_vlines() const;
|
||||
int vline_length(int visLineNum) 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,
|
||||
int PosType = CHARACTER_POS) const;
|
||||
|
||||
int position_to_xy(int pos, int* x, int* y) const;
|
||||
void maintain_absolute_top_line_number(int state);
|
||||
int get_absolute_top_line_number() const;
|
||||
void absolute_top_line_number(int oldFirstChar);
|
||||
int maintaining_absolute_top_line_number() const;
|
||||
void reset_absolute_top_line_number();
|
||||
int position_to_linecol(int pos, int* lineNum, int* column) const;
|
||||
void scroll_(int topLineNum, int horizOffset);
|
||||
|
||||
void extend_range_for_styles(int* start, int* end);
|
||||
|
||||
void find_wrap_range(const char *deletedText, int pos, int nInserted,
|
||||
int nDeleted, int *modRangeStart, int *modRangeEnd,
|
||||
int *linesInserted, int *linesDeleted);
|
||||
void measure_deleted_lines(int pos, int nDeleted);
|
||||
void wrapped_line_counter(Fl_Text_Buffer *buf, int startPos, int maxPos,
|
||||
int maxLines, bool startPosIsLineStart,
|
||||
int styleBufOffset, int *retPos, int *retLines,
|
||||
int *retLineStart, int *retLineEnd,
|
||||
bool countLastLineMissingNewLine = true) const;
|
||||
void find_line_end(int pos, bool start_pos_is_line_start, int *lineEnd,
|
||||
int *nextLineStart) const;
|
||||
int measure_proportional_character(const char *s, int colNum, int pos) const;
|
||||
int wrap_uses_character(int lineEndPos) const;
|
||||
void draw_line_numbers(bool clearAll);
|
||||
|
||||
int damage_range1_start, damage_range1_end;
|
||||
int damage_range2_start, damage_range2_end;
|
||||
int mCursorPos;
|
||||
int mCursorOn;
|
||||
int mCursorOldY; /* Y pos. of cursor for blanking */
|
||||
int mCursorToHint; /* Tells the buffer modified callback
|
||||
where to move the cursor, to reduce
|
||||
the number of redraw calls */
|
||||
int mCursorStyle; /* One of enum cursorStyles above */
|
||||
int mCursorPreferredCol; /* Column for vert. cursor movement */
|
||||
int mNVisibleLines; /* # of visible (displayed) lines */
|
||||
int mNBufferLines; /* # of newlines in the buffer */
|
||||
Fl_Text_Buffer* mBuffer; /* Contains text to be displayed */
|
||||
Fl_Text_Buffer* mStyleBuffer; /* Optional parallel buffer containing
|
||||
color and font information */
|
||||
int mFirstChar, mLastChar; /* Buffer positions of first and last
|
||||
displayed character (lastChar points
|
||||
either to a newline or one character
|
||||
beyond the end of the buffer) */
|
||||
int mContinuousWrap; /* Wrap long lines when displaying */
|
||||
int mWrapMargin; /* Margin in # of char positions for
|
||||
wrapping in continuousWrap mode */
|
||||
int* mLineStarts;
|
||||
int mTopLineNum; /* Line number of top displayed line
|
||||
of file (first line of file is 1) */
|
||||
int mAbsTopLineNum; /* In continuous wrap mode, the line
|
||||
number of the top line if the text
|
||||
were not wrapped (note that this is
|
||||
only maintained as needed). */
|
||||
int mNeedAbsTopLineNum; /* Externally settable flag to continue
|
||||
maintaining absTopLineNum even if
|
||||
it isn't needed for line # display */
|
||||
int mHorizOffset; /* Horizontal scroll pos. in pixels */
|
||||
int mTopLineNumHint; /* Line number of top displayed line
|
||||
of file (first line of file is 1) */
|
||||
int mHorizOffsetHint; /* Horizontal scroll pos. in pixels */
|
||||
int mNStyles; /* Number of entries in styleTable */
|
||||
const Style_Table_Entry *mStyleTable; /* Table of fonts and colors for
|
||||
coloring/syntax-highlighting */
|
||||
char mUnfinishedStyle; /* Style buffer entry which triggers
|
||||
on-the-fly reparsing of region */
|
||||
Unfinished_Style_Cb mUnfinishedHighlightCB; /* Callback to parse "unfinished" */
|
||||
/* regions */
|
||||
void* mHighlightCBArg; /* Arg to unfinishedHighlightCB */
|
||||
|
||||
int mMaxsize;
|
||||
|
||||
int mSuppressResync; /* Suppress resynchronization of line
|
||||
starts during buffer updates */
|
||||
int mNLinesDeleted; /* Number of lines deleted during
|
||||
buffer modification (only used
|
||||
when resynchronization is suppressed) */
|
||||
int mModifyingTabDistance; /* Whether tab distance is being
|
||||
modified */
|
||||
|
||||
Fl_Color mCursor_color;
|
||||
|
||||
Fl_Scrollbar* mHScrollBar;
|
||||
Fl_Scrollbar* mVScrollBar;
|
||||
int scrollbar_width_;
|
||||
Fl_Align scrollbar_align_;
|
||||
int dragPos, dragType, dragging;
|
||||
int display_insert_position_hint;
|
||||
struct { int x, y, w, h; } text_area;
|
||||
|
||||
int shortcut_;
|
||||
|
||||
Fl_Font textfont_;
|
||||
Fl_Fontsize textsize_;
|
||||
Fl_Color textcolor_;
|
||||
|
||||
// The following are not presently used from the original NEdit code,
|
||||
// but are being put here so that future versions of Fl_Text_Display
|
||||
// can implement line numbers without breaking binary compatibility.
|
||||
void clear_rect(int style, int x, int y, int width, int height) const;
|
||||
void display_insert();
|
||||
|
||||
void offset_line_starts(int newTopLineNum);
|
||||
|
||||
void calc_line_starts(int startLine, int endLine);
|
||||
|
||||
void update_line_starts(int pos, int charsInserted, int charsDeleted,
|
||||
int linesInserted, int linesDeleted, int *scrolled);
|
||||
|
||||
void calc_last_char();
|
||||
|
||||
int position_to_line( int pos, int* lineNum ) const;
|
||||
int string_width(const char* string, int length, int style) const;
|
||||
|
||||
static void scroll_timer_cb(void*);
|
||||
|
||||
static void buffer_predelete_cb(int pos, int nDeleted, void* cbArg);
|
||||
static void buffer_modified_cb(int pos, int nInserted, int nDeleted,
|
||||
int nRestyled, const char* deletedText,
|
||||
void* cbArg);
|
||||
|
||||
static void h_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_h_scrollbar();
|
||||
int measure_vline(int visLineNum) const;
|
||||
int longest_vline() const;
|
||||
int empty_vlines() const;
|
||||
int vline_length(int visLineNum) 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,
|
||||
int PosType = CHARACTER_POS) const;
|
||||
|
||||
int position_to_xy(int pos, int* x, int* y) const;
|
||||
void maintain_absolute_top_line_number(int state);
|
||||
int get_absolute_top_line_number() const;
|
||||
void absolute_top_line_number(int oldFirstChar);
|
||||
int maintaining_absolute_top_line_number() const;
|
||||
void reset_absolute_top_line_number();
|
||||
int position_to_linecol(int pos, int* lineNum, int* column) const;
|
||||
void scroll_(int topLineNum, int horizOffset);
|
||||
|
||||
void extend_range_for_styles(int* start, int* end);
|
||||
|
||||
void find_wrap_range(const char *deletedText, int pos, int nInserted,
|
||||
int nDeleted, int *modRangeStart, int *modRangeEnd,
|
||||
int *linesInserted, int *linesDeleted);
|
||||
void measure_deleted_lines(int pos, int nDeleted);
|
||||
void wrapped_line_counter(Fl_Text_Buffer *buf, int startPos, int maxPos,
|
||||
int maxLines, bool startPosIsLineStart,
|
||||
int styleBufOffset, int *retPos, int *retLines,
|
||||
int *retLineStart, int *retLineEnd,
|
||||
bool countLastLineMissingNewLine = true) const;
|
||||
void find_line_end(int pos, bool start_pos_is_line_start, int *lineEnd,
|
||||
int *nextLineStart) const;
|
||||
int measure_proportional_character(const char *s, int colNum, int pos) const;
|
||||
int wrap_uses_character(int lineEndPos) const;
|
||||
|
||||
int damage_range1_start, damage_range1_end;
|
||||
int damage_range2_start, damage_range2_end;
|
||||
int mCursorPos;
|
||||
int mCursorOn;
|
||||
int mCursorOldY; /* Y pos. of cursor for blanking */
|
||||
int mCursorToHint; /* Tells the buffer modified callback
|
||||
where to move the cursor, to reduce
|
||||
the number of redraw calls */
|
||||
int mCursorStyle; /* One of enum cursorStyles above */
|
||||
int mCursorPreferredCol; /* Column for vert. cursor movement */
|
||||
int mNVisibleLines; /* # of visible (displayed) lines */
|
||||
int mNBufferLines; /* # of newlines in the buffer */
|
||||
Fl_Text_Buffer* mBuffer; /* Contains text to be displayed */
|
||||
Fl_Text_Buffer* mStyleBuffer; /* Optional parallel buffer containing
|
||||
color and font information */
|
||||
int mFirstChar, mLastChar; /* Buffer positions of first and last
|
||||
displayed character (lastChar points
|
||||
either to a newline or one character
|
||||
beyond the end of the buffer) */
|
||||
int mContinuousWrap; /* Wrap long lines when displaying */
|
||||
int mWrapMargin; /* Margin in # of char positions for
|
||||
wrapping in continuousWrap mode */
|
||||
int* mLineStarts;
|
||||
int mTopLineNum; /* Line number of top displayed line
|
||||
of file (first line of file is 1) */
|
||||
int mAbsTopLineNum; /* In continuous wrap mode, the line
|
||||
number of the top line if the text
|
||||
were not wrapped (note that this is
|
||||
only maintained as needed). */
|
||||
int mNeedAbsTopLineNum; /* Externally settable flag to continue
|
||||
maintaining absTopLineNum even if
|
||||
it isn't needed for line # display */
|
||||
int mHorizOffset; /* Horizontal scroll pos. in pixels */
|
||||
int mTopLineNumHint; /* Line number of top displayed line
|
||||
of file (first line of file is 1) */
|
||||
int mHorizOffsetHint; /* Horizontal scroll pos. in pixels */
|
||||
int mNStyles; /* Number of entries in styleTable */
|
||||
const Style_Table_Entry *mStyleTable; /* Table of fonts and colors for
|
||||
coloring/syntax-highlighting */
|
||||
char mUnfinishedStyle; /* Style buffer entry which triggers
|
||||
on-the-fly reparsing of region */
|
||||
Unfinished_Style_Cb mUnfinishedHighlightCB; /* Callback to parse "unfinished" */
|
||||
/* regions */
|
||||
void* mHighlightCBArg; /* Arg to unfinishedHighlightCB */
|
||||
|
||||
int mMaxsize;
|
||||
|
||||
int mSuppressResync; /* Suppress resynchronization of line
|
||||
starts during buffer updates */
|
||||
int mNLinesDeleted; /* Number of lines deleted during
|
||||
buffer modification (only used
|
||||
when resynchronization is suppressed) */
|
||||
int mModifyingTabDistance; /* Whether tab distance is being
|
||||
modified */
|
||||
|
||||
Fl_Color mCursor_color;
|
||||
|
||||
Fl_Scrollbar* mHScrollBar;
|
||||
Fl_Scrollbar* mVScrollBar;
|
||||
int scrollbar_width_;
|
||||
Fl_Align scrollbar_align_;
|
||||
int dragPos, dragType, dragging;
|
||||
int display_insert_position_hint;
|
||||
struct { int x, y, w, h; } text_area;
|
||||
|
||||
int shortcut_;
|
||||
|
||||
Fl_Font textfont_;
|
||||
Fl_Fontsize textsize_;
|
||||
Fl_Color textcolor_;
|
||||
|
||||
// The following are not presently used from the original NEdit code,
|
||||
// but are being put here so that future versions of Fl_Text_Display
|
||||
// can implement line numbers without breaking binary compatibility.
|
||||
|
||||
/* Line number margin and width */
|
||||
int mLineNumLeft, mLineNumWidth;
|
||||
int mLineNumLeft, mLineNumWidth;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@ -270,6 +270,10 @@ char Fl_Text_Buffer::byte_at(int pos) const {
|
||||
*/
|
||||
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 > mLength)
|
||||
pos = mLength;
|
||||
@ -1010,7 +1014,7 @@ int Fl_Text_Buffer::search_forward(int startPos, const char *searchString,
|
||||
return 1;
|
||||
}
|
||||
// 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++))
|
||||
&& bp < length());
|
||||
startPos++;
|
||||
@ -1040,7 +1044,7 @@ int Fl_Text_Buffer::search_backward(int startPos, const char *searchString,
|
||||
return 1;
|
||||
}
|
||||
// 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--))
|
||||
&& bp >= 0);
|
||||
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)
|
||||
{
|
||||
if (!text || !*text)
|
||||
return 0;
|
||||
|
||||
int insertedLength = strlen(text);
|
||||
|
||||
/* 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 {
|
||||
return (selected() && pos >= start() && pos < end() );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -785,6 +785,7 @@ Fl_Window* new_view() {
|
||||
Fl_Menu_Bar* m = new Fl_Menu_Bar(0, 0, 660, 30);
|
||||
m->copy(menuitems, w);
|
||||
w->editor = new Fl_Text_Editor(0, 30, 660, 370);
|
||||
w->editor->wrap_mode(1, 32);
|
||||
w->editor->textfont(FL_COURIER);
|
||||
w->editor->textsize(TS);
|
||||
w->editor->buffer(textbuf);
|
||||
@ -812,6 +813,7 @@ int main(int argc, char **argv) {
|
||||
" if ( fnfc.show() ) return;\n"
|
||||
" save_file(fnfc.filename());\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"
|
||||
"// (= Wrongful practicing of xylophone music tortures every larger dwarf)\n"
|
||||
"\n"
|
||||
|
||||
Loading…
Reference in New Issue
Block a user