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

Reply via email to