Eric Pouech : winhelp: Generate the proper RTF data for a table formatting.

Alexandre Julliard julliard at winehq.org
Wed Apr 30 06:57:34 CDT 2008


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

Author: Eric Pouech <eric.pouech at orange.fr>
Date:   Wed Apr 30 08:31:19 2008 +0200

winhelp: Generate the proper RTF data for a table formatting.

---

 programs/winhelp/hlpfile.c |   60 ++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 58 insertions(+), 2 deletions(-)

diff --git a/programs/winhelp/hlpfile.c b/programs/winhelp/hlpfile.c
index e7ae75e..312d932 100644
--- a/programs/winhelp/hlpfile.c
+++ b/programs/winhelp/hlpfile.c
@@ -1201,6 +1201,7 @@ static BOOL HLPFILE_BrowseParagraph(HLPFILE_PAGE* page, struct RtfData* rd, BYTE
     long               size, blocksize, datalen;
     unsigned short     bits;
     unsigned           nc, ncol = 1;
+    short              table_width;
     BOOL               in_table = FALSE;
     char               tmp[256];
     BOOL               ret = FALSE;
@@ -1250,21 +1251,59 @@ static BOOL HLPFILE_BrowseParagraph(HLPFILE_PAGE* page, struct RtfData* rd, BYTE
         in_table = TRUE;
         ncol = *format++;
 
-        WINE_TRACE("#cols %u\n", ncol);
+        if (!HLPFILE_RtfAddControl(rd, "\\trowd")) goto done;
         type = *format++;
         if (type == 0 || type == 2)
+        {
+            table_width = GET_SHORT(format, 0);
             format += 2;
+        }
+        else
+            table_width = 32767;
+        WINE_TRACE("New table: cols=%d type=%x width=%d\n",
+                   ncol, type, table_width);
+        if (ncol > 1)
+        {
+            int     pos;
+            sprintf(tmp, "\\trgaph%d\\trleft%d",
+                    HLPFILE_HalfPointsToTwips(MulDiv(GET_SHORT(format, 6), table_width, 32767)),
+                    HLPFILE_HalfPointsToTwips(MulDiv(GET_SHORT(format, 0), table_width, 32767)));
+            if (!HLPFILE_RtfAddControl(rd, tmp)) goto done;
+            pos = HLPFILE_HalfPointsToTwips(MulDiv(GET_SHORT(format, 6) / 2, table_width, 32767));
+            for (nc = 0; nc < ncol; nc++)
+            {
+                WINE_TRACE("column(%d/%d) gap=%d width=%d\n",
+                           nc, ncol, GET_SHORT(format, nc*4),
+                           GET_SHORT(format, nc*4+2));
+                pos += GET_SHORT(format, nc * 4) + GET_SHORT(format, nc * 4 + 2);
+                sprintf(tmp, "\\cellx%d",
+                        HLPFILE_HalfPointsToTwips(MulDiv(pos, table_width, 32767)));
+                if (!HLPFILE_RtfAddControl(rd, tmp)) goto done;
+            }
+        }
+        else
+        {
+            WINE_TRACE("column(0/%d) gap=%d width=%d\n",
+                       ncol, GET_SHORT(format, 0), GET_SHORT(format, 2));
+            sprintf(tmp, "\\trleft%d\\cellx%d ",
+                    HLPFILE_HalfPointsToTwips(MulDiv(GET_SHORT(format, 0), table_width, 32767)),
+                    HLPFILE_HalfPointsToTwips(MulDiv(GET_SHORT(format, 0) + GET_SHORT(format, 2),
+                                      table_width, 32767)));
+            if (!HLPFILE_RtfAddControl(rd, tmp)) goto done;
+        }
         format += ncol * 4;
     }
 
     for (nc = 0; nc < ncol; /**/)
     {
         WINE_TRACE("looking for format at offset %lu in column %d\n", (SIZE_T)(format - (buf + 0x15)), nc);
+        if (!HLPFILE_RtfAddControl(rd, "\\pard")) goto done;
         if (in_table)
         {
             nc = GET_SHORT(format, 0);
             if (nc == -1) break;
             format += 5;
+            if (!HLPFILE_RtfAddControl(rd, "\\intbl")) goto done;
         }
         else nc++;
         if (buf[0x14] == 0x01)
@@ -1453,7 +1492,18 @@ static BOOL HLPFILE_BrowseParagraph(HLPFILE_PAGE* page, struct RtfData* rd, BYTE
                 break;
 
 	    case 0x82:
-                if (!HLPFILE_RtfAddControl(rd, "\\par\\pard")) goto done;
+                if (in_table)
+                {
+                    if (format[1] != 0xFF)
+                    {
+                        if (!HLPFILE_RtfAddControl(rd, "\\par\\intbl")) goto done;
+                    }
+                    else
+                    {
+                        if (!HLPFILE_RtfAddControl(rd, "\\cell\\pard\\intbl")) goto done;
+                    }
+                }
+                else if (!HLPFILE_RtfAddControl(rd, "\\par")) goto done;
                 attributes.wVSpace++;
                 attributes.wIndent = 0;
                 format += 1;
@@ -1655,8 +1705,14 @@ static BOOL HLPFILE_BrowseParagraph(HLPFILE_PAGE* page, struct RtfData* rd, BYTE
 	    }
 	}
     }
+    if (in_table)
+    {
+        if (!HLPFILE_RtfAddControl(rd, "\\row\\par\\pard\\plain")) goto done;
+        rd->char_pos += 2;
+    }
     ret = TRUE;
 done:
+
     HeapFree(GetProcessHeap(), 0, text_base);
     return ret;
 }




More information about the wine-cvs mailing list