Author: matt
Date: 2010-11-27 12:13:10 -0800 (Sat, 27 Nov 2010)
New Revision: 7895
Log:
Preliminary implementation of Tab characters insisde Fl_Text-*. We still need
to test wrapping, etc.
Modified:
branches/branch-1.3/src/Fl_Text_Buffer.cxx
branches/branch-1.3/src/Fl_Text_Display.cxx
branches/branch-1.3/test/editor.cxx
Modified: branches/branch-1.3/src/Fl_Text_Buffer.cxx
===================================================================
--- branches/branch-1.3/src/Fl_Text_Buffer.cxx 2010-11-26 10:22:40 UTC (rev
7894)
+++ branches/branch-1.3/src/Fl_Text_Buffer.cxx 2010-11-27 20:13:10 UTC (rev
7895)
@@ -197,7 +197,7 @@
*/
char *Fl_Text_Buffer::text_range(int start, int end) const {
IS_UTF8_ALIGNED2(this, (start))
- IS_UTF8_ALIGNED2(this, (start))
+ IS_UTF8_ALIGNED2(this, (end))
char *s = NULL;
Modified: branches/branch-1.3/src/Fl_Text_Display.cxx
===================================================================
--- branches/branch-1.3/src/Fl_Text_Display.cxx 2010-11-26 10:22:40 UTC (rev
7894)
+++ branches/branch-1.3/src/Fl_Text_Display.cxx 2010-11-27 20:13:10 UTC (rev
7895)
@@ -1738,44 +1738,70 @@
return 0;
}
+ char currChar = 0, prevChar = 0;
// draw the line
style = position_style(lineStartPos, lineLen, 0);
for (i=0; i<lineLen; ) {
- int len = fl_utf8len(lineStr[i]);
+ currChar = lineStr[i]; // one byte is enough to handele tabs and other
cases
+ int len = fl_utf8len(currChar);
charStyle = position_style(lineStartPos, lineLen, i);
- // FIXME: if the character is a tab, we need to do the correct indenting
- // FIXME: if the character is an optional hyphen, we need to ignore it
unless we wrap the text
- if (charStyle!=style) {
- // draw a segment whenever the style changes
- int w = int( string_width( lineStr+startIndex, i-startIndex, style ) );
- if (mode==DRAW_LINE)
- draw_string( style, startX, Y, startX+w, lineStr+startIndex,
i-startIndex );
- if (mode==FIND_INDEX && startX+w>rightClip) {
- // find x pos inside block
- int di = find_x(lineStr+startIndex, i-startIndex, style,
rightClip-startX);
- free(lineStr);
- IS_UTF8_ALIGNED2(buffer(), (lineStartPos+startIndex+di))
- return lineStartPos + startIndex + di;
+ if (charStyle!=style || currChar=='\t' || prevChar=='\t') {
+ // draw a segment whenever the style changes or a Tab is found
+ int w = 0;
+ if (prevChar=='\t') {
+ // draw a single Tab space
+ int xAbs = (mode==GET_WIDTH) ? startX :
startX+mHorizOffset-text_area.x;
+ w = (((xAbs/100)+1)*100) - xAbs;
+ if (mode==DRAW_LINE)
+ draw_string( style|BG_ONLY_MASK, startX, Y, startX+w, 0, 0 );
+ if (mode==FIND_INDEX && startX+w>rightClip) {
+ // find x pos inside block
+ free(lineStr);
+ return lineStartPos + startIndex;
+ }
+ } else {
+ // draw a text segment
+ w = int( string_width( lineStr+startIndex, i-startIndex, style ) );
+ if (mode==DRAW_LINE)
+ draw_string( style, startX, Y, startX+w, lineStr+startIndex,
i-startIndex );
+ if (mode==FIND_INDEX && startX+w>rightClip) {
+ // find x pos inside block
+ int di = find_x(lineStr+startIndex, i-startIndex, style,
rightClip-startX);
+ free(lineStr);
+ IS_UTF8_ALIGNED2(buffer(), (lineStartPos+startIndex+di))
+ return lineStartPos + startIndex + di;
+ }
}
style = charStyle;
startX += w;
startIndex = i;
}
- if (len==-1) {
- // FIXME: what happened? Is there an illegal charater, or an illegal
index?
- len = 1;
- }
i += len;
+ prevChar = currChar;
}
- int w = int( string_width( lineStr+startIndex, i-startIndex, style ) );
- if (mode==DRAW_LINE)
- draw_string( style, startX, Y, startX+w, lineStr+startIndex, i-startIndex
);
- if (mode==FIND_INDEX) {
- // find x pos inside block
- int di = find_x(lineStr+startIndex, i-startIndex, style, rightClip-startX);
- free(lineStr);
- IS_UTF8_ALIGNED2(buffer(), (lineStartPos+startIndex+di))
- return lineStartPos + startIndex + di;
+ int w = 0;
+ if (currChar=='\t') {
+ // draw a single Tab space
+ int xAbs = (mode==GET_WIDTH) ? startX : startX+mHorizOffset-text_area.x;
+ w = (((xAbs/100)+1)*100) - xAbs;
+ if (mode==DRAW_LINE)
+ draw_string( style|BG_ONLY_MASK, startX, Y, startX+w, 0, 0 );
+ if (mode==FIND_INDEX) {
+ // find x pos inside block
+ free(lineStr);
+ return lineStartPos + startIndex + ( rightClip-startX>w ? 1 : 0 );
+ }
+ } else {
+ w = int( string_width( lineStr+startIndex, i-startIndex, style ) );
+ if (mode==DRAW_LINE)
+ draw_string( style, startX, Y, startX+w, lineStr+startIndex,
i-startIndex );
+ if (mode==FIND_INDEX) {
+ // find x pos inside block
+ int di = find_x(lineStr+startIndex, i-startIndex, style,
rightClip-startX);
+ free(lineStr);
+ IS_UTF8_ALIGNED2(buffer(), (lineStartPos+startIndex+di))
+ return lineStartPos + startIndex + di;
+ }
}
if (mode==GET_WIDTH) {
free(lineStr);
@@ -1944,7 +1970,17 @@
if (!(style & BG_ONLY_MASK)) {
fl_color( foreground );
fl_font( font, fsize );
- fl_draw( string, nChars, X, Y + mMaxsize - fl_descent());
+
+ // FIXME: remove this again!
+ char *buf = (char*)malloc(nChars);
+ memcpy(buf, string, nChars);
+ int i = 0;
+ for (i=0; i<nChars; i++) {
+ if (buf[i]=='\t') buf[i] = '$';
+ }
+ fl_draw( buf, nChars, X, Y + mMaxsize - fl_descent());
+
+ //fl_draw( string, nChars, X, Y + mMaxsize - fl_descent());
}
// CET - FIXME
@@ -2157,6 +2193,15 @@
fsize = textsize();
}
fl_font( font, fsize );
+
+ // FIXME: remove this again!
+ char *buf = (char*)malloc(length);
+ memcpy(buf, string, length);
+ int i = 0;
+ for (i=0; i<length; i++) {
+ if (buf[i]=='\t') buf[i] = '$';
+ }
+ return fl_width( buf, length);
return fl_width( string, length );
}
Modified: branches/branch-1.3/test/editor.cxx
===================================================================
--- branches/branch-1.3/test/editor.cxx 2010-11-26 10:22:40 UTC (rev 7894)
+++ branches/branch-1.3/test/editor.cxx 2010-11-27 20:13:10 UTC (rev 7895)
@@ -304,7 +304,6 @@
style_init(void) {
char *style = new char[textbuf->length() + 1];
char *text = textbuf->text();
-
memset(style, 'A', textbuf->length());
style[textbuf->length()] = '\0';
@@ -778,9 +777,21 @@
w->editor->textsize(TS);
//w->editor->wrap_mode(Fl_Text_Editor::WRAP_AT_BOUNDS, 100);
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);
+ style_init();
w->end();
w->resizable(w->editor);
w->callback((Fl_Callback *)close_cb, w);
_______________________________________________
fltk-commit mailing list
[email protected]
http://lists.easysw.com/mailman/listinfo/fltk-commit