From 5b2b456fb14036d5d7456b7f42c746ed87799f02 Mon Sep 17 00:00:00 2001 From: =?utf8?q?V=C3=A1clav=20Slav=C3=ADk?= Date: Sun, 21 Mar 2004 10:37:21 +0000 Subject: [PATCH] lists rendering fixes (second part of patch 911377) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@26289 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/changes.txt | 2 +- samples/html/test/Makefile.in | 2 +- samples/html/test/listtest.htm | 28 ++++++ samples/html/test/makefile.bcc | 2 +- samples/html/test/makefile.gcc | 2 +- samples/html/test/makefile.vc | 2 +- samples/html/test/makefile.wat | 2 +- samples/html/test/test.bkl | 3 +- samples/html/test/test.htm | 6 +- src/html/m_list.cpp | 172 +++++++++++++++++++++++++++------ 10 files changed, 180 insertions(+), 41 deletions(-) create mode 100644 samples/html/test/listtest.htm diff --git a/docs/changes.txt b/docs/changes.txt index a6e35f23d5..95a5a05651 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -95,7 +95,7 @@ wxMSW: wxHTML: -- improved tables layout algorithm (Tim Kosse) +- improved tables and lists layout algorithms (Tim Kosse) -
handling fix (Xavier Nodet) diff --git a/samples/html/test/Makefile.in b/samples/html/test/Makefile.in index 2cae7d0c04..7c4bc56cef 100644 --- a/samples/html/test/Makefile.in +++ b/samples/html/test/Makefile.in @@ -159,7 +159,7 @@ test.app/Contents/PkgInfo: test$(EXEEXT) $(top_srcdir)/src/mac/Info.plist.in $(L data: @mkdir -p . - @for f in f.html fft.html imagemap.htm imagemap.png pic.png pic2.bmp tables.htm test.htm i18n.gif 8859_2.htm cp1250.htm regres.htm; do \ + @for f in f.html fft.html imagemap.htm imagemap.png pic.png pic2.bmp tables.htm test.htm listtest.htm i18n.gif 8859_2.htm cp1250.htm regres.htm; do \ if test \( ! -s ./$$f \) -o \( $(srcdir)/$$f -nt ./$$f \) ; then \ cp -pRf $(srcdir)/$$f . ; \ fi; \ diff --git a/samples/html/test/listtest.htm b/samples/html/test/listtest.htm new file mode 100644 index 0000000000..be6c89f30d --- /dev/null +++ b/samples/html/test/listtest.htm @@ -0,0 +1,28 @@ + + + +------ + + + + + + + + + +
+
  • Simple list in a table. This table cell may wrap.
+
+ Second column, unimportant +
+
  • List in a table, this cell should not wrap
+
+ Second column, unimportant +
+ + + \ No newline at end of file diff --git a/samples/html/test/makefile.bcc b/samples/html/test/makefile.bcc index 1989cdf585..e31ac8d962 100644 --- a/samples/html/test/makefile.bcc +++ b/samples/html/test/makefile.bcc @@ -179,7 +179,7 @@ $(OBJS)\test.exe: $(TEST_OBJECTS) $(OBJS)\test_test.res data: if not exist $(OBJS) mkdir $(OBJS) - for %f in (f.html fft.html imagemap.htm imagemap.png pic.png pic2.bmp tables.htm test.htm i18n.gif 8859_2.htm cp1250.htm regres.htm) do if not exist $(OBJS)\%f copy .\%f $(OBJS) + for %f in (f.html fft.html imagemap.htm imagemap.png pic.png pic2.bmp tables.htm test.htm listtest.htm i18n.gif 8859_2.htm cp1250.htm regres.htm) do if not exist $(OBJS)\%f copy .\%f $(OBJS) $(OBJS)\test_test.obj: .\test.cpp $(CXX) -q -c -P -o$@ $(TEST_CXXFLAGS) $** diff --git a/samples/html/test/makefile.gcc b/samples/html/test/makefile.gcc index 67d483d4e9..a7c84bf680 100644 --- a/samples/html/test/makefile.gcc +++ b/samples/html/test/makefile.gcc @@ -176,7 +176,7 @@ $(OBJS)\test.exe: $(TEST_OBJECTS) $(OBJS)\test_test_rc.o data: if not exist $(OBJS) mkdir $(OBJS) - for %%f in (f.html fft.html imagemap.htm imagemap.png pic.png pic2.bmp tables.htm test.htm i18n.gif 8859_2.htm cp1250.htm regres.htm) do if not exist $(OBJS)\%%f copy .\%%f $(OBJS) + for %%f in (f.html fft.html imagemap.htm imagemap.png pic.png pic2.bmp tables.htm test.htm listtest.htm i18n.gif 8859_2.htm cp1250.htm regres.htm) do if not exist $(OBJS)\%%f copy .\%%f $(OBJS) $(OBJS)\test_test.o: ./test.cpp $(CXX) -c -o $@ $(TEST_CXXFLAGS) $< diff --git a/samples/html/test/makefile.vc b/samples/html/test/makefile.vc index 27f0c73290..76fe2fbd36 100644 --- a/samples/html/test/makefile.vc +++ b/samples/html/test/makefile.vc @@ -262,7 +262,7 @@ $(OBJS)\test.exe: $(TEST_OBJECTS) $(OBJS)\test_test.res data: if not exist $(OBJS) mkdir $(OBJS) - for %f in (f.html fft.html imagemap.htm imagemap.png pic.png pic2.bmp tables.htm test.htm i18n.gif 8859_2.htm cp1250.htm regres.htm) do if not exist $(OBJS)\%f copy .\%f $(OBJS) + for %f in (f.html fft.html imagemap.htm imagemap.png pic.png pic2.bmp tables.htm test.htm listtest.htm i18n.gif 8859_2.htm cp1250.htm regres.htm) do if not exist $(OBJS)\%f copy .\%f $(OBJS) $(OBJS)\test_test.obj: .\test.cpp $(CXX) /c /nologo /TP /Fo$@ $(TEST_CXXFLAGS) $** diff --git a/samples/html/test/makefile.wat b/samples/html/test/makefile.wat index 8505202dbf..c02ea171bf 100644 --- a/samples/html/test/makefile.wat +++ b/samples/html/test/makefile.wat @@ -216,7 +216,7 @@ $(OBJS)\test.exe : $(TEST_OBJECTS) $(OBJS)\test_test.res data : .SYMBOLIC if not exist $(OBJS) mkdir $(OBJS) - for %f in (f.html fft.html imagemap.htm imagemap.png pic.png pic2.bmp tables.htm test.htm i18n.gif 8859_2.htm cp1250.htm regres.htm) do if not exist $(OBJS)\%f copy .\%f $(OBJS) + for %f in (f.html fft.html imagemap.htm imagemap.png pic.png pic2.bmp tables.htm test.htm listtest.htm i18n.gif 8859_2.htm cp1250.htm regres.htm) do if not exist $(OBJS)\%f copy .\%f $(OBJS) $(OBJS)\test_test.obj : .AUTODEPEND .\test.cpp $(CXX) -zq -fo=$^@ $(TEST_CXXFLAGS) $< diff --git a/samples/html/test/test.bkl b/samples/html/test/test.bkl index cc108142e9..0cea07bf90 100644 --- a/samples/html/test/test.bkl +++ b/samples/html/test/test.bkl @@ -17,7 +17,8 @@ f.html fft.html imagemap.htm imagemap.png pic.png pic2.bmp - tables.htm test.htm i18n.gif 8859_2.htm cp1250.htm regres.htm + tables.htm test.htm listtest.htm i18n.gif 8859_2.htm cp1250.htm + regres.htm diff --git a/samples/html/test/test.htm b/samples/html/test/test.htm index 825ebb7ea2..8b6955bd1f 100644 --- a/samples/html/test/test.htm +++ b/samples/html/test/test.htm @@ -7,9 +7,11 @@ -click here to go to tables test page! +click here to go to tables test page

-click here to go to IMAGEMAPs test page! +click here to go to lists test page +

+click here to go to IMAGEMAPs test page

i18n demo 1 (iso8859-2)

diff --git a/src/html/m_list.cpp b/src/html/m_list.cpp index 4050ee9cc0..38a9826824 100644 --- a/src/html/m_list.cpp +++ b/src/html/m_list.cpp @@ -67,8 +67,128 @@ void wxHtmlListmarkCell::Draw(wxDC& dc, int x, int y, (m_Width / 3), (m_Width / 3)); } +//----------------------------------------------------------------------------- +// wxHtmlListCell +//----------------------------------------------------------------------------- + +struct wxHtmlListItemStruct +{ + wxHtmlContainerCell *mark; + wxHtmlContainerCell *cont; + int minWidth; + int maxWidth; +}; + +class wxHtmlListCell : public wxHtmlContainerCell +{ + private: + wxBrush m_Brush; + + int m_NumRows; + wxHtmlListItemStruct *m_RowInfo; + void ReallocRows(int rows); + void ComputeMinMaxWidths(); + int m_ListmarkWidth; + + public: + wxHtmlListCell(wxHtmlContainerCell *parent); + virtual ~wxHtmlListCell(); + void AddRow(wxHtmlContainerCell *mark, wxHtmlContainerCell *cont); + virtual void Layout(int w); + + DECLARE_NO_COPY_CLASS(wxHtmlListCell) +}; + +wxHtmlListCell::wxHtmlListCell(wxHtmlContainerCell *parent) : wxHtmlContainerCell(parent) +{ + m_NumRows = 0; + m_RowInfo = 0; + m_ListmarkWidth = 0; +} + +wxHtmlListCell::~wxHtmlListCell() +{ + if (m_RowInfo) free(m_RowInfo); +} + +void wxHtmlListCell::Layout(int w) +{ + wxHtmlCell::Layout(w); + + ComputeMinMaxWidths(); + m_Width = wxMax(m_Width, wxMin(w, GetMaxTotalWidth())); + + int s_width = m_Width - m_IndentLeft; + + int vpos = 0; + for (int r = 0; r < m_NumRows; r++) + { + 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()); + } + m_Height = vpos; +} + +void wxHtmlListCell::AddRow(wxHtmlContainerCell *mark, wxHtmlContainerCell *cont) +{ + ReallocRows(++m_NumRows); + m_RowInfo[m_NumRows - 1].mark = mark; + m_RowInfo[m_NumRows - 1].cont = 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].minWidth = 0; + m_RowInfo[rows - 1].maxWidth = 0; + m_NumRows = rows; +} +void wxHtmlListCell::ComputeMinMaxWidths() +{ + if (m_NumRows == 0) return; + + m_MaxTotalWidth = 0; + m_Width = 0; + + for (int r = 0; r < m_NumRows; r++) + { + wxHtmlListItemStruct& row = m_RowInfo[r]; + row.mark->Layout(1); + row.cont->Layout(1); + int maxWidth = row.cont->GetMaxTotalWidth(); + int width = row.cont->GetWidth(); + if (row.mark->GetWidth() > m_ListmarkWidth) + m_ListmarkWidth = row.mark->GetWidth(); + if (maxWidth > m_MaxTotalWidth) + m_MaxTotalWidth = maxWidth; + if (width > m_Width) + m_Width = width; + } + m_Width += m_ListmarkWidth + m_IndentLeft; + m_MaxTotalWidth += m_ListmarkWidth + m_IndentLeft; +} + +//----------------------------------------------------------------------------- +// wxHtmlListcontentCell +//----------------------------------------------------------------------------- + +class wxHtmlListcontentCell : public wxHtmlContainerCell +{ +public: + wxHtmlListcontentCell(wxHtmlContainerCell *p) : wxHtmlContainerCell(p) {} + virtual void Layout(int w) { + // Reset top indentation, fixes

  • + SetIndent(0, wxHTML_INDENT_TOP); + wxHtmlContainerCell::Layout(w); + } +}; //----------------------------------------------------------------------------- // The list handler: @@ -78,6 +198,7 @@ void wxHtmlListmarkCell::Draw(wxDC& dc, int x, int y, TAG_HANDLER_BEGIN(OLULLI, "OL,UL,LI") TAG_HANDLER_VARS + wxHtmlListCell *m_List; int m_Numbering; // this is number of actual item of list or 0 for dots @@ -91,14 +212,12 @@ TAG_HANDLER_BEGIN(OLULLI, "OL,UL,LI") wxHtmlContainerCell *c; // List Item: - if (tag.GetName() == wxT("LI")) + if (m_List && tag.GetName() == wxT("LI")) { - m_WParser->GetContainer()->SetIndent(0, wxHTML_INDENT_TOP); - // this is to prevent indetation in

  • case - m_WParser->CloseContainer(); - m_WParser->CloseContainer(); + c = m_WParser->SetContainer(new wxHtmlContainerCell(m_List)); + c->SetAlignVer(wxHTML_ALIGN_TOP); - c = m_WParser->OpenContainer(); + wxHtmlContainerCell *mark = c; c->SetWidthFloat(2 * m_WParser->GetCharWidth(), wxHTML_UNITS_PIXELS); if (m_Numbering == 0) { @@ -116,51 +235,40 @@ TAG_HANDLER_BEGIN(OLULLI, "OL,UL,LI") m_WParser->CloseContainer(); c = m_WParser->OpenContainer(); - c->SetIndent(m_WParser->GetCharWidth() / 4, wxHTML_INDENT_LEFT); - c->SetWidthFloat(-2 * m_WParser->GetCharWidth(), wxHTML_UNITS_PIXELS); - - m_WParser->OpenContainer(); + m_List->AddRow(mark, c); + c = m_WParser->OpenContainer(); + m_WParser->SetContainer(new wxHtmlListcontentCell(c)); + if (m_Numbering != 0) m_Numbering++; - - return FALSE; } // Begin of List (not-numbered): "UL", "OL" - else + else if (tag.GetName() == wxT("UL") || tag.GetName() == wxT("OL")) { int oldnum = m_Numbering; if (tag.GetName() == wxT("UL")) m_Numbering = 0; else m_Numbering = 1; - c = m_WParser->GetContainer(); - if (c->GetFirstChild() != NULL) - { - m_WParser->CloseContainer(); - m_WParser->OpenContainer(); - c = m_WParser->GetContainer(); - } - c->SetAlignHor(wxHTML_ALIGN_LEFT); - c->SetIndent(2 * m_WParser->GetCharWidth(), wxHTML_INDENT_LEFT); - m_WParser->OpenContainer()->SetAlignVer(wxHTML_ALIGN_TOP); + wxHtmlContainerCell *oldcont; + oldcont = c = m_WParser->OpenContainer(); - m_WParser->OpenContainer(); - m_WParser->OpenContainer(); + wxHtmlListCell *oldList = m_List; + m_List = new wxHtmlListCell(c); + m_List->SetIndent(2 * m_WParser->GetCharWidth(), wxHTML_INDENT_LEFT); + ParseInner(tag); - m_WParser->GetContainer()->SetIndent(0, wxHTML_INDENT_TOP); - // this is to prevent indetation in

  • case + m_WParser->SetContainer(oldcont); m_WParser->CloseContainer(); - m_WParser->CloseContainer(); - m_WParser->CloseContainer(); - m_WParser->CloseContainer(); - m_WParser->OpenContainer(); - m_Numbering = oldnum; + m_List = oldList; return TRUE; } + return false; + } TAG_HANDLER_END(OLULLI) -- 2.45.2