/////////////////////////////////////////////////////////////////////////////
-// 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
{
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;
}
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));
}
wxHtmlListItemStruct *m_RowInfo;
void ReallocRows(int rows);
void ComputeMinMaxWidths();
+ int ComputeMaxBase(wxHtmlCell *cell);
int m_ListmarkWidth;
public:
virtual ~wxHtmlListCell();
void AddRow(wxHtmlContainerCell *mark, wxHtmlContainerCell *cont);
virtual void Layout(int w);
-
+
DECLARE_NO_COPY_CLASS(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);
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;
}
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;
void wxHtmlListCell::ComputeMinMaxWidths()
{
if (m_NumRows == 0) return;
-
+
m_MaxTotalWidth = 0;
m_Width = 0;
{
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);
TAG_HANDLER_CONSTR(OLULLI)
{
+ m_List = NULL;
m_Numbering = 0;
}
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();
m_List->AddRow(mark, c);
c = m_WParser->OpenContainer();
m_WParser->SetContainer(new wxHtmlListcontentCell(c));
-
+
if (m_Numbering != 0) m_Numbering++;
}
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);
m_Numbering = oldnum;
m_List = oldList;
- return TRUE;
+ return true;
}
return false;