]> git.saurik.com Git - wxWidgets.git/blobdiff - src/html/m_list.cpp
corrected event type for standalone scrollbars (patch 1240385)
[wxWidgets.git] / src / html / m_list.cpp
index 646baa8163cf91ee7f6a9e83b8165720d787352e..9dc8f018a94cb11a24034a1a60a312819c969fa8 100644 (file)
@@ -53,7 +53,8 @@ wxHtmlListmarkCell::wxHtmlListmarkCell(wxDC* dc, const wxColour& clr) : wxHtmlCe
 {
     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;
 }
 
 
@@ -63,7 +64,7 @@ void wxHtmlListmarkCell::Draw(wxDC& dc, int x, int y,
                               wxHtmlRenderingInfo& WXUNUSED(info))
 {
     dc.SetBrush(m_Brush);
-    dc.DrawEllipse(x + m_PosX + m_Width / 3, y + m_PosY + m_Height / 3, 
+    dc.DrawEllipse(x + m_PosX + m_Width / 3, y + m_PosY + m_Height / 3,
                    (m_Width / 3), (m_Width / 3));
 }
 
@@ -88,6 +89,7 @@ class wxHtmlListCell : public wxHtmlContainerCell
         wxHtmlListItemStruct *m_RowInfo;
         void ReallocRows(int rows);
         void ComputeMinMaxWidths();
+        int ComputeMaxBase(wxHtmlCell *cell);
         int m_ListmarkWidth;
 
     public:
@@ -95,7 +97,7 @@ class wxHtmlListCell : public wxHtmlContainerCell
         virtual ~wxHtmlListCell();
         void AddRow(wxHtmlContainerCell *mark, wxHtmlContainerCell *cont);
         virtual void Layout(int w);
-        
+
     DECLARE_NO_COPY_CLASS(wxHtmlListCell)
 };
 
@@ -111,6 +113,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);
@@ -123,11 +142,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;
 }
@@ -142,8 +170,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;
 
@@ -153,7 +181,7 @@ void wxHtmlListCell::ReallocRows(int rows)
 void wxHtmlListCell::ComputeMinMaxWidths()
 {
     if (m_NumRows == 0) return;
-    
+
     m_MaxTotalWidth = 0;
     m_Width = 0;
 
@@ -183,7 +211,7 @@ class wxHtmlListcontentCell : public wxHtmlContainerCell
 {
 public:
     wxHtmlListcontentCell(wxHtmlContainerCell *p) : wxHtmlContainerCell(p) {}
-    virtual void Layout(int w) { 
+    virtual void Layout(int w) {
         // Reset top indentation, fixes <li><p>
         SetIndent(0, wxHTML_INDENT_TOP);
         wxHtmlContainerCell::Layout(w);
@@ -204,6 +232,7 @@ TAG_HANDLER_BEGIN(OLULLI, "OL,UL,LI")
 
     TAG_HANDLER_CONSTR(OLULLI)
     {
+        m_List = NULL;
         m_Numbering = 0;
     }
 
@@ -239,7 +268,7 @@ TAG_HANDLER_BEGIN(OLULLI, "OL,UL,LI")
             m_List->AddRow(mark, c);
             c = m_WParser->OpenContainer();
             m_WParser->SetContainer(new wxHtmlListcontentCell(c));
-            
+
             if (m_Numbering != 0) m_Numbering++;
         }
 
@@ -257,7 +286,7 @@ TAG_HANDLER_BEGIN(OLULLI, "OL,UL,LI")
             wxHtmlListCell *oldList = m_List;
             m_List = new wxHtmlListCell(c);
             m_List->SetIndent(2 * m_WParser->GetCharWidth(), wxHTML_INDENT_LEFT);
-            
+
             ParseInner(tag);
 
             m_WParser->SetContainer(oldcont);
@@ -265,7 +294,7 @@ TAG_HANDLER_BEGIN(OLULLI, "OL,UL,LI")
 
             m_Numbering = oldnum;
             m_List = oldList;
-            return TRUE;
+            return true;
         }
         return false;