changeset 284:6956821fe8ed

Fixes for StyledText
author Frank Benoit <benoit@tionex.de>
date Mon, 04 Aug 2008 02:06:13 +0200
parents 05e48e1e65d1
children 75cb516e281e
files dwt/custom/StyledText.d dwt/custom/StyledTextContent.d dwt/graphics/TextLayout.d dwt/internal/c/pango.d
diffstat 4 files changed, 46 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/dwt/custom/StyledText.d	Mon Aug 04 02:05:58 2008 +0200
+++ b/dwt/custom/StyledText.d	Mon Aug 04 02:06:13 2008 +0200
@@ -471,7 +471,7 @@
             printerRenderer = null;
         }
     }
-    void init() {
+    void init_() {
         Rectangle trim = printer.computeTrim(0, 0, 0, 0);
         Point dpi = printer.getDPI();
 
@@ -723,7 +723,7 @@
             jobName = "Printing";
         }
         if (printer.startJob(jobName)) {
-            init();
+            init_();
             print();
             dispose();
             printer.endJob();
@@ -5008,6 +5008,7 @@
                 case DWT.COMPOSITION_SELECTION: handleCompositionSelection(event); break;
                 case DWT.COMPOSITION_CHANGED: handleCompositionChanged(event); break;
                 case DWT.COMPOSITION_OFFSET: handleCompositionOffset(event); break;
+                default:
             }
         }
     });
--- a/dwt/custom/StyledTextContent.d	Mon Aug 04 02:05:58 2008 +0200
+++ b/dwt/custom/StyledTextContent.d	Mon Aug 04 02:06:13 2008 +0200
@@ -143,7 +143,7 @@
  * <p>
  *
  * @param listener the listener which should no longer be notified
- * 
+ *
  * @exception IllegalArgumentException <ul>
  *    <li>ERROR_NULL_ARGUMENT when listener is null</li>
  * </ul>
--- a/dwt/graphics/TextLayout.d	Mon Aug 04 02:05:58 2008 +0200
+++ b/dwt/graphics/TextLayout.d	Mon Aug 04 02:06:13 2008 +0200
@@ -140,7 +140,7 @@
     if (styles.length is 2 && styles[0].style is null && ascent is -1 && descent is -1 && segments is null) return;
     auto ptr = OS.pango_layout_get_text(layout);
     attrList = OS.pango_attr_list_new();
-    //PangoAttribute* attribute = new PangoAttribute();
+    PangoAttribute* attribute;
     char[] chars = null;
     int segementsLength = segmentsText.length;
     if ((ascent !is -1  || descent !is -1) && segementsLength > 0) {
@@ -156,12 +156,14 @@
             /* Note: The length in bytes of ZWS and ZWNBS are both equals to 3 */
             int offset = lineIndex * 6;
             PangoAttribute* attr = OS.pango_attr_shape_new (&rect, &rect);
-            attr.start_index = bytePos + offset;
-            attr.end_index = bytePos + offset + 3;
+            attribute = attr;
+            attribute.start_index = bytePos + offset;
+            attribute.end_index = bytePos + offset + 3;
             OS.pango_attr_list_insert(attrList, attr);
             attr = OS.pango_attr_shape_new (&rect, &rect);
-            attr.start_index = bytePos + offset + 3;
-            attr.end_index = bytePos + offset + 6;
+            attribute = attr;
+            attribute.start_index = bytePos + offset + 3;
+            attribute.end_index = bytePos + offset + 6;
             OS.pango_attr_list_insert(attrList, attr);
             int pos = bytePos;//OS.g_utf8_pointer_to_offset(ptr, ptr + bytePos);
             chars[pos + lineIndex * 6 +0 .. pos + lineIndex * 6 + 3] = STR_ZWS;
@@ -1347,28 +1349,31 @@
     }
     PangoLogAttr* attrs;
     int nAttrs;
+    // return one attr per codepoint (=char in pango)
     OS.pango_layout_get_log_attrs(layout, &attrs, &nAttrs);
     if (attrs is null) return offset + step;
-    length_ = OS.g_utf8_strlen(cont, -1);
+    length_ = dcont.length;//OS.g_utf8_strlen(cont, -1);
     offset = translateOffset(offset);
     offset = dcont.utf8AdjustOffset( offset );
-    PangoLogAttr* logAttr = new PangoLogAttr();
+
+    PangoLogAttr* logAttr;
     offset = validateOffset( dcont, offset, step);
+    // the loop is byte oriented
     while (0 < offset && offset < length_) {
-        *logAttr = attrs[ offset ];
-        if (((movement & DWT.MOVEMENT_CLUSTER) !is 0) && ( logAttr.bitfield0 & (1<<4/*is_cursor_position*/))) break;
+        logAttr = & attrs[ OS.g_utf8_pointer_to_offset( cont, cont+offset) ];
+        if (((movement & DWT.MOVEMENT_CLUSTER) !is 0) && logAttr.is_cursor_position ) break;
         if ((movement & DWT.MOVEMENT_WORD) !is 0) {
             if (forward) {
-                if (logAttr.bitfield0 & (1<<6/*is_word_end*/)) break;
+                if (logAttr.is_word_end ) break;
             } else {
-                if (logAttr.bitfield0 & (1<<5/*is_word_start*/)) break;
+                if (logAttr.is_word_start ) break;
             }
         }
         if ((movement & DWT.MOVEMENT_WORD_START) !is 0) {
-            if (logAttr.bitfield0 & (1<<5/*is_word_start*/)) break;
+            if (logAttr.is_word_start ) break;
         }
         if ((movement & DWT.MOVEMENT_WORD_END) !is 0) {
-            if (logAttr.bitfield0 & (1<<6/*is_word_end*/)) break;
+            if (logAttr.is_word_end ) break;
         }
         offset = validateOffset( dcont, offset, step);
     }
--- a/dwt/internal/c/pango.d	Mon Aug 04 02:05:58 2008 +0200
+++ b/dwt/internal/c/pango.d	Mon Aug 04 02:06:13 2008 +0200
@@ -531,6 +531,30 @@
 }
 struct _PangoLogAttr {
 uint bitfield0;
+bool is_line_break              (){ return (bitfield0 & (1<< 0)) !is 0; }
+bool is_mandatory_break         (){ return (bitfield0 & (1<< 1)) !is 0; }
+bool is_char_break              (){ return (bitfield0 & (1<< 2)) !is 0; }
+bool is_white                   (){ return (bitfield0 & (1<< 3)) !is 0; }
+bool is_cursor_position         (){ return (bitfield0 & (1<< 4)) !is 0; }
+bool is_word_start              (){ return (bitfield0 & (1<< 5)) !is 0; }
+bool is_word_end                (){ return (bitfield0 & (1<< 6)) !is 0; }
+bool is_sentence_boundary       (){ return (bitfield0 & (1<< 7)) !is 0; }
+bool is_sentence_start          (){ return (bitfield0 & (1<< 8)) !is 0; }
+bool is_sentence_end            (){ return (bitfield0 & (1<< 9)) !is 0; }
+bool backspace_deletes_character(){ return (bitfield0 & (1<<10)) !is 0; }
+bool is_expandable_space        (){ return (bitfield0 & (1<<11)) !is 0; }
+bool is_line_break              (bool v){ if(v) bitfield0 |= (1<< 0); else bitfield0 &= ~(1<< 0); return v; }
+bool is_mandatory_break         (bool v){ if(v) bitfield0 |= (1<< 1); else bitfield0 &= ~(1<< 1); return v; }
+bool is_char_break              (bool v){ if(v) bitfield0 |= (1<< 2); else bitfield0 &= ~(1<< 2); return v; }
+bool is_white                   (bool v){ if(v) bitfield0 |= (1<< 3); else bitfield0 &= ~(1<< 3); return v; }
+bool is_cursor_position         (bool v){ if(v) bitfield0 |= (1<< 4); else bitfield0 &= ~(1<< 4); return v; }
+bool is_word_start              (bool v){ if(v) bitfield0 |= (1<< 5); else bitfield0 &= ~(1<< 5); return v; }
+bool is_word_end                (bool v){ if(v) bitfield0 |= (1<< 6); else bitfield0 &= ~(1<< 6); return v; }
+bool is_sentence_boundary       (bool v){ if(v) bitfield0 |= (1<< 7); else bitfield0 &= ~(1<< 7); return v; }
+bool is_sentence_start          (bool v){ if(v) bitfield0 |= (1<< 8); else bitfield0 &= ~(1<< 8); return v; }
+bool is_sentence_end            (bool v){ if(v) bitfield0 |= (1<< 9); else bitfield0 &= ~(1<< 9); return v; }
+bool backspace_deletes_character(bool v){ if(v) bitfield0 |= (1<<10); else bitfield0 &= ~(1<<10); return v; }
+bool is_expandable_space        (bool v){ if(v) bitfield0 |= (1<<11); else bitfield0 &= ~(1<<11); return v; }
 // uint is_line_break // bits 0 .. 1
 // uint is_mandatory_break // bits 1 .. 2
 // uint is_char_break // bits 2 .. 3