Alexandre Julliard : comctl32/syslink: Wrap the link text on \n characters.

Alexandre Julliard julliard at winehq.org
Fri Nov 18 10:19:05 CST 2011


Module: wine
Branch: master
Commit: 11c2150dd9e696a7fd2be629bf4af3ece0a7ed75
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=11c2150dd9e696a7fd2be629bf4af3ece0a7ed75

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Fri Nov 18 11:57:07 2011 +0100

comctl32/syslink: Wrap the link text on \n characters.

---

 dlls/comctl32/syslink.c |   64 ++++++++++++++++++----------------------------
 1 files changed, 25 insertions(+), 39 deletions(-)

diff --git a/dlls/comctl32/syslink.c b/dlls/comctl32/syslink.c
index b2dfdad..823c7ac 100644
--- a/dlls/comctl32/syslink.c
+++ b/dlls/comctl32/syslink.c
@@ -609,35 +609,26 @@ static PDOC_ITEM SYSLINK_GetPrevLink (const SYSLINK_INFO *infoPtr, PDOC_ITEM Cur
 static BOOL SYSLINK_WrapLine (LPWSTR Text, WCHAR BreakChar, int *LineLen,
                              int nFit, LPSIZE Extent)
 {
-    WCHAR *Current;
+    int i;
 
-    if(nFit == *LineLen)
-    {
-        return FALSE;
-    }
+    for (i = 0; i < nFit; i++) if (Text[i] == '\n') break;
 
-    *LineLen = nFit;
+    if (i == *LineLen) return FALSE;
 
-    Current = Text + nFit;
-    
     /* check if we're in the middle of a word */
-    if((*Current) != BreakChar)
+    if (Text[i] != '\n' && Text[i] != BreakChar)
     {
         /* search for the beginning of the word */
-        while(Current > Text && (*(Current - 1)) != BreakChar)
-        {
-            Current--;
-            (*LineLen)--;
-        }
-        
-        if((*LineLen) == 0)
+        while (i && Text[i - 1] != BreakChar) i--;
+
+        if (i == 0)
         {
             Extent->cx = 0;
             Extent->cy = 0;
+            i = max( nFit, 1 );
         }
-        return TRUE;
     }
-
+    *LineLen = i;
     return TRUE;
 }
 
@@ -652,6 +643,7 @@ static VOID SYSLINK_Render (const SYSLINK_INFO *infoPtr, HDC hdc, PRECT pRect)
     HGDIOBJ hOldFont;
     int x, y, LineHeight;
     SIZE szDoc;
+    TEXTMETRICW tm;
 
     szDoc.cx = szDoc.cy = 0;
 
@@ -668,8 +660,9 @@ static VOID SYSLINK_Render (const SYSLINK_INFO *infoPtr, HDC hdc, PRECT pRect)
     
     x = SL_LEFTMARGIN;
     y = SL_TOPMARGIN;
-    LineHeight = 0;
-    
+    GetTextMetricsW( hdc, &tm );
+    LineHeight = tm.tmHeight + tm.tmExternalLeading;
+
     for(Current = infoPtr->Items; Current != NULL; Current = Current->Next)
     {
         int n, nBlocks;
@@ -677,6 +670,7 @@ static VOID SYSLINK_Render (const SYSLINK_INFO *infoPtr, HDC hdc, PRECT pRect)
         PDOC_TEXTBLOCK bl, cbl;
         INT nFit;
         SIZE szDim;
+        int SkipChars = 0;
 
         if(Current->nText == 0)
         {
@@ -702,11 +696,15 @@ static VOID SYSLINK_Render (const SYSLINK_INFO *infoPtr, HDC hdc, PRECT pRect)
         
         while(n > 0)
         {
-            int SkipChars = 0;
-
             /* skip break characters unless they're the first of the doc item */
             if(tx != Current->Text || x == SL_LEFTMARGIN)
             {
+                if (n && *tx == '\n')
+                {
+                    tx++;
+                    SkipChars++;
+                    n--;
+                }
                 while(n > 0 && (*tx) == infoPtr->BreakChar)
                 {
                     tx++;
@@ -728,20 +726,10 @@ static VOID SYSLINK_Render (const SYSLINK_INFO *infoPtr, HDC hdc, PRECT pRect)
 
                     if(LineLen == 0)
                     {
-                        if(x > SL_LEFTMARGIN)
-                        {
-                            /* move one line down, the word didn't fit into the line */
-                            x = SL_LEFTMARGIN;
-                            y += LineHeight;
-                            LineHeight = 0;
-                            continue;
-                        }
-                        else
-                        {
-                            /* the word starts at the beginning of the line and doesn't
-                               fit into the line, so break it at the last character that fits */
-                            LineLen = max(nFit, 1);
-                        }
+                        /* move one line down, the word didn't fit into the line */
+                        x = SL_LEFTMARGIN;
+                        y += LineHeight;
+                        continue;
                     }
 
                     if(LineLen != n)
@@ -782,13 +770,10 @@ static VOID SYSLINK_Render (const SYSLINK_INFO *infoPtr, HDC hdc, PRECT pRect)
                     if(LineLen != 0)
                     {
                         x += szDim.cx;
-                        LineHeight = max(LineHeight, szDim.cy);
-
                         if(Wrap)
                         {
                             x = SL_LEFTMARGIN;
                             y += LineHeight;
-                            LineHeight = 0;
                         }
                     }
                 }
@@ -803,6 +788,7 @@ static VOID SYSLINK_Render (const SYSLINK_INFO *infoPtr, HDC hdc, PRECT pRect)
                 }
                 n -= LineLen;
                 tx += LineLen;
+                SkipChars = 0;
             }
             else
             {




More information about the wine-cvs mailing list