From f560b71b0ab48a2a46ead14d9466a541cf43f2d1 Mon Sep 17 00:00:00 2001 From: Matthias Melcher Date: Sat, 27 Nov 2010 21:15:52 +0000 Subject: [PATCH] Fixed Fl_Text_Display Tabulator calculations (STR #2450) git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3@7897 ea41ed52-d2ee-0310-a9c1-e6b18d33e121 --- CHANGES | 1 + src/Fl_Text_Display.cxx | 43 ++++++++++++----------------------------- test/editor.cxx | 14 ++------------ 3 files changed, 15 insertions(+), 43 deletions(-) diff --git a/CHANGES b/CHANGES index 447266289..7cef1a91d 100644 --- a/CHANGES +++ b/CHANGES @@ -1,5 +1,6 @@ CHANGES IN FLTK 1.3.0 + - Fixed Fl_Text_Display Tabulator calculations (STR #2450) - Fixed file access code to use UTF-8 strings (STR #2440) - Fixed ARM Unicode cross compilation issue (STR #2432) - Improved support for faulty X11 clients (STR #2385) diff --git a/src/Fl_Text_Display.cxx b/src/Fl_Text_Display.cxx index cd3ff4e67..e22f89710 100644 --- a/src/Fl_Text_Display.cxx +++ b/src/Fl_Text_Display.cxx @@ -25,10 +25,6 @@ // http://www.fltk.org/str.php // -// TODO: fix all fixme's and todo's -// TODO: blinking selection when moving mouse outside of widget area -// TODO: line wrapping - scroll bars -// TODO: rendering of the Tab character // TODO: rendering of the "optional hyphen" // TODO: make line numbering work again @@ -1744,6 +1740,7 @@ int Fl_Text_Display::handle_vline( for (i=0; inext_char(b); colNum = 0; width = 0; - // TODO: we should have a much more efficient function already available! int iMax = buf->next_char(p); for (i=buf->next_char(b); inext_char(i)) { - width += measure_proportional_character(buf->address(i), colNum, + width += measure_proportional_character(buf->address(i), width, i+styleBufOffset); colNum++; } @@ -3165,7 +3141,7 @@ void Fl_Text_Display::wrapped_line_counter(Fl_Text_Buffer *buf, int startPos, newLineStart = max(p, buf->next_char(lineStart)); const char *s = buf->address(b); colNum++; - width = measure_proportional_character(s, colNum, p+styleBufOffset); + width = measure_proportional_character(s, 0, p+styleBufOffset); } if (p >= maxPos) { *retPos = maxPos; @@ -3214,13 +3190,18 @@ void Fl_Text_Display::wrapped_line_counter(Fl_Text_Buffer *buf, int startPos, should now be solid because they are now used for online help display. \param s text string - \param colNum unused + \param xPix x pixel position needed for calculating tab widths \param pos offset within string \return width of character in pixels */ -double Fl_Text_Display::measure_proportional_character(const char *s, int colNum, int pos) const { +double Fl_Text_Display::measure_proportional_character(const char *s, int xPix, int pos) const { IS_UTF8_ALIGNED(s) + if (*s=='\t') { + int tab = col_to_x(8); + return (((xPix/tab)+1)*tab) - xPix; + } + int charLen = fl_utf8len(*s), style = 0; if (mStyleBuffer) { style = mStyleBuffer->byte_at(pos); diff --git a/test/editor.cxx b/test/editor.cxx index ff4829eed..fbbc0e406 100644 --- a/test/editor.cxx +++ b/test/editor.cxx @@ -775,22 +775,12 @@ Fl_Window* new_view() { w->editor = new Fl_Text_Editor(0, 30, 660, 370); w->editor->textfont(FL_COURIER); w->editor->textsize(TS); - w->editor->wrap_mode(Fl_Text_Editor::WRAP_AT_BOUNDS, 250); + //w->editor->wrap_mode(Fl_Text_Editor::WRAP_AT_BOUNDS, 250); w->editor->buffer(textbuf); - w->editor->textfont(FL_HELVETICA); - textbuf->text( - "12345678912345678901234567890\n" - "\tqwertyuiop\n" - "WWWWWWWW\tqwertyuiop\n" - "iiiiiiii\tqwertyuiop\n" - "\tasdfghjkl\n" - "\t\tasdfghjkl\t\n" - "\t\t\tzxcvbnm,\t\t\n" - "a\tb\tc\td\te\n" - "nvfdnv"); w->editor->highlight_data(stylebuf, styletable, sizeof(styletable) / sizeof(styletable[0]), 'A', style_unfinished_cb, 0); + textbuf->text(); style_init(); w->end(); w->resizable(w->editor);