]> git.saurik.com Git - wxWidgets.git/blobdiff - src/html/m_list.cpp
Fixes for parsing invalid HTML without tag ends.
[wxWidgets.git] / src / html / m_list.cpp
index 9669682592a46aafa1d58f9b7c096076b0dc6856..a008562b9f2e0c998182b2034d9adde8a345f08a 100644 (file)
@@ -1,26 +1,21 @@
 /////////////////////////////////////////////////////////////////////////////
-// Name:        m_list.cpp
+// Name:        src/html/m_list.cpp
 // Purpose:     wxHtml module for lists
 // Author:      Vaclav Slavik
 // RCS-ID:      $Id$
 // Copyright:   (c) 1999 Vaclav Slavik
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
-#pragma implementation
-#endif
 
 #include "wx/wxprec.h"
 
-
-#include "wx/defs.h"
-#if wxUSE_HTML && wxUSE_STREAMS
-
 #ifdef __BORLANDC__
-#pragma hdrstop
+    #pragma hdrstop
 #endif
 
-#ifndef WXPRECOMP
+#if wxUSE_HTML && wxUSE_STREAMS
+
+#ifndef WX_PRECOMP
     #include "wx/brush.h"
     #include "wx/dc.h"
 #endif
@@ -46,24 +41,23 @@ class wxHtmlListmarkCell : public wxHtmlCell
         void Draw(wxDC& dc, int x, int y, int view_y1, int view_y2,
                   wxHtmlRenderingInfo& info);
 
-    DECLARE_NO_COPY_CLASS(wxHtmlListmarkCell)
+    wxDECLARE_NO_COPY_CLASS(wxHtmlListmarkCell);
 };
 
-wxHtmlListmarkCell::wxHtmlListmarkCell(wxDC* dc, const wxColour& clr) : wxHtmlCell(), m_Brush(clr, wxSOLID)
+wxHtmlListmarkCell::wxHtmlListmarkCell(wxDC* dc, const wxColour& clr) : wxHtmlCell(), m_Brush(clr, wxBRUSHSTYLE_SOLID)
 {
     m_Width =  dc->GetCharHeight();
     m_Height = dc->GetCharHeight();
-    m_Descent = 0;
+    // bottom of list mark is lined with bottom of letters in next cell
+    m_Descent = m_Height / 3;
 }
 
 
 
 void wxHtmlListmarkCell::Draw(wxDC& dc, int x, int y,
-                              int WXUNUSED(view_y1), int view_y2,
+                              int WXUNUSED(view_y1), int WXUNUSED(view_y2),
                               wxHtmlRenderingInfo& WXUNUSED(info))
 {
-    if (y+m_PosY+m_Height > view_y2) return;
-
     dc.SetBrush(m_Brush);
     dc.DrawEllipse(x + m_PosX + m_Width / 3, y + m_PosY + m_Height / 3,
                    (m_Width / 3), (m_Width / 3));
@@ -90,6 +84,7 @@ class wxHtmlListCell : public wxHtmlContainerCell
         wxHtmlListItemStruct *m_RowInfo;
         void ReallocRows(int rows);
         void ComputeMinMaxWidths();
+        int ComputeMaxBase(wxHtmlCell *cell);
         int m_ListmarkWidth;
 
     public:
@@ -98,7 +93,7 @@ class wxHtmlListCell : public wxHtmlContainerCell
         void AddRow(wxHtmlContainerCell *mark, wxHtmlContainerCell *cont);
         virtual void Layout(int w);
 
-    DECLARE_NO_COPY_CLASS(wxHtmlListCell)
+    wxDECLARE_NO_COPY_CLASS(wxHtmlListCell);
 };
 
 wxHtmlListCell::wxHtmlListCell(wxHtmlContainerCell *parent) : wxHtmlContainerCell(parent)
@@ -113,6 +108,23 @@ wxHtmlListCell::~wxHtmlListCell()
     if (m_RowInfo) free(m_RowInfo);
 }
 
+int wxHtmlListCell::ComputeMaxBase(wxHtmlCell *cell)
+{
+    if(!cell)
+        return 0;
+
+    wxHtmlCell *child = cell->GetFirstChild();
+
+    while(child)
+    {
+        int base = ComputeMaxBase( child );
+        if ( base > 0 ) return base + child->GetPosY();
+        child = child->GetNext();
+    }
+
+    return cell->GetHeight() - cell->GetDescent();
+}
+
 void wxHtmlListCell::Layout(int w)
 {
     wxHtmlCell::Layout(w);
@@ -125,11 +137,20 @@ void wxHtmlListCell::Layout(int w)
     int vpos = 0;
     for (int r = 0; r < m_NumRows; r++)
     {
+        // do layout first time to layout contents and adjust pos
         m_RowInfo[r].mark->Layout(m_ListmarkWidth);
-        m_RowInfo[r].mark->SetPos(m_IndentLeft, vpos);
         m_RowInfo[r].cont->Layout(s_width - m_ListmarkWidth);
-        m_RowInfo[r].cont->SetPos(m_IndentLeft + m_ListmarkWidth, vpos);
-        vpos += wxMax(m_RowInfo[r].cont->GetHeight(), m_RowInfo[r].mark->GetHeight());
+
+        const int base_mark = ComputeMaxBase( m_RowInfo[r].mark );
+        const int base_cont = ComputeMaxBase( m_RowInfo[r].cont );
+        const int adjust_mark = vpos + wxMax(base_cont-base_mark,0);
+        const int adjust_cont = vpos + wxMax(base_mark-base_cont,0);
+
+        m_RowInfo[r].mark->SetPos(m_IndentLeft, adjust_mark);
+        m_RowInfo[r].cont->SetPos(m_IndentLeft + m_ListmarkWidth, adjust_cont);
+
+        vpos = wxMax(adjust_mark + m_RowInfo[r].mark->GetHeight(),
+                     adjust_cont + m_RowInfo[r].cont->GetHeight());
     }
     m_Height = vpos;
 }
@@ -144,8 +165,8 @@ void wxHtmlListCell::AddRow(wxHtmlContainerCell *mark, wxHtmlContainerCell *cont
 void wxHtmlListCell::ReallocRows(int rows)
 {
     m_RowInfo = (wxHtmlListItemStruct*) realloc(m_RowInfo, sizeof(wxHtmlListItemStruct) * rows);
-    m_RowInfo[rows - 1].mark = 0;
-    m_RowInfo[rows - 1].cont = 0;
+    m_RowInfo[rows - 1].mark = NULL;
+    m_RowInfo[rows - 1].cont = NULL;
     m_RowInfo[rows - 1].minWidth = 0;
     m_RowInfo[rows - 1].maxWidth = 0;
 
@@ -231,9 +252,9 @@ TAG_HANDLER_BEGIN(OLULLI, "OL,UL,LI")
             else
             {
                 c->SetAlignHor(wxHTML_ALIGN_RIGHT);
-                wxString mark;
-                mark.Printf(wxT("%i."), m_Numbering);
-                c->InsertCell(new wxHtmlWordCell(mark, *(m_WParser->GetDC())));
+                wxString markStr;
+                markStr.Printf(wxT("%i. "), m_Numbering);
+                c->InsertCell(new wxHtmlWordCell(markStr, *(m_WParser->GetDC())));
             }
             m_WParser->CloseContainer();