X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/25c71cccb5da62d2e56668030d7947d5219aaebc..79cb759dc8580da2e82e880cd94a08cd38bb814e:/src/html/m_tables.cpp diff --git a/src/html/m_tables.cpp b/src/html/m_tables.cpp index 6c9d5062d5..8540af13f2 100644 --- a/src/html/m_tables.cpp +++ b/src/html/m_tables.cpp @@ -1,25 +1,22 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: m_tables.cpp +// Name: src/html/m_tables.cpp // Purpose: wxHtml module for tables // Author: Vaclav Slavik // RCS-ID: $Id$ // Copyright: (c) 1999 Vaclav Slavik -// Licence: wxWindows Licence +// 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/wxcrtvararg.h" #endif #include "wx/html/forcelnk.h" @@ -102,7 +99,10 @@ private: public: wxHtmlTableCell(wxHtmlContainerCell *parent, const wxHtmlTag& tag, double pixel_scale = 1.0); - ~wxHtmlTableCell(); + virtual ~wxHtmlTableCell(); + + virtual void RemoveExtraSpacing(bool top, bool bottom); + virtual void Layout(int w); void AddRow(const wxHtmlTag& tag); @@ -137,7 +137,11 @@ wxHtmlTableCell::wxHtmlTableCell(wxHtmlContainerCell *parent, const wxHtmlTag& t /* scan params: */ if (tag.HasParam(wxT("BGCOLOR"))) + { tag.GetParamAsColour(wxT("BGCOLOR"), &m_tBkg); + if (m_tBkg.Ok()) + SetBackgroundColour(m_tBkg); + } if (tag.HasParam(wxT("VALIGN"))) m_tValign = tag.GetParam(wxT("VALIGN")); else @@ -167,6 +171,15 @@ wxHtmlTableCell::~wxHtmlTableCell() } +void wxHtmlTableCell::RemoveExtraSpacing(bool WXUNUSED(top), + bool WXUNUSED(bottom)) +{ + // Don't remove any spacing in the table -- it's always desirable, + // because it's part of table's definition. + // (If wxHtmlContainerCell::RemoveExtraSpacing() was applied to tables, + // then upper left cell of a table would be positioned above other cells + // if the table was the first element on the page.) +} void wxHtmlTableCell::ReallocCols(int cols) { @@ -267,16 +280,21 @@ void wxHtmlTableCell::AddCell(wxHtmlContainerCell *cell, const wxHtmlTag& tag) { wxString wd = tag.GetParam(wxT("WIDTH")); - if (wd[wd.Length()-1] == wxT('%')) + if (wd[wd.length()-1] == wxT('%')) { - wxSscanf(wd.c_str(), wxT("%i%%"), &m_ColsInfo[c].width); - m_ColsInfo[c].units = wxHTML_UNITS_PERCENT; + if ( wxSscanf(wd.c_str(), wxT("%i%%"), &m_ColsInfo[c].width) == 1 ) + { + m_ColsInfo[c].units = wxHTML_UNITS_PERCENT; + } } else { - wxSscanf(wd.c_str(), wxT("%i"), &m_ColsInfo[c].width); - m_ColsInfo[c].width = (int)(m_PixelScale * (double)m_ColsInfo[c].width); - m_ColsInfo[c].units = wxHTML_UNITS_PIXELS; + long width; + if ( wd.ToLong(&width) ) + { + m_ColsInfo[c].width = (int)(m_PixelScale * (double)width); + m_ColsInfo[c].units = wxHTML_UNITS_PIXELS; + } } } } @@ -350,7 +368,7 @@ void wxHtmlTableCell::AddCell(wxHtmlContainerCell *cell, const wxHtmlTag& tag) void wxHtmlTableCell::ComputeMinMaxWidths() { - if (m_NumCols == 0 || m_ColsInfo[0].minWidth != -1) return; + if (m_NumCols == 0 || m_ColsInfo[0].minWidth != wxDefaultCoord) return; m_MaxTotalWidth = 0; int percentage = 0; @@ -563,6 +581,10 @@ void wxHtmlTableCell::Layout(int w) m_ColsInfo[i].leftpos = wpos; wpos += m_ColsInfo[i].pixwidth + m_Spacing; } + + // add the remaining space to the last column + if (m_NumCols > 0 && wpos < m_Width) + m_ColsInfo[m_NumCols-1].pixwidth += m_Width - wpos; } /* 3. sub-layout all cells: */ @@ -644,10 +666,12 @@ TAG_HANDLER_BEGIN(TABLE, "TABLE,TR,TD,TH") TAG_HANDLER_VARS wxHtmlTableCell* m_Table; wxString m_tAlign, m_rAlign; + wxHtmlContainerCell *m_enclosingContainer; TAG_HANDLER_CONSTR(TABLE) { m_Table = NULL; + m_enclosingContainer = NULL; m_tAlign = m_rAlign = wxEmptyString; } @@ -660,11 +684,10 @@ TAG_HANDLER_BEGIN(TABLE, "TABLE,TR,TD,TH") if (tag.GetName() == wxT("TABLE")) { wxHtmlTableCell *oldt = m_Table; - wxHtmlContainerCell *oldcont; - oldcont = c = m_WParser->OpenContainer(); + m_enclosingContainer = c = m_WParser->OpenContainer(); - m_Table = new wxHtmlTableCell(c, tag); + m_Table = new wxHtmlTableCell(c, tag, m_WParser->GetPixelScale()); // width: { @@ -672,7 +695,7 @@ TAG_HANDLER_BEGIN(TABLE, "TABLE,TR,TD,TH") { wxString wd = tag.GetParam(wxT("WIDTH")); - if (wd[wd.Length()-1] == wxT('%')) + if (wd[wd.length()-1] == wxT('%')) { int width = 0; wxSscanf(wd.c_str(), wxT("%i%%"), &width); @@ -696,11 +719,12 @@ TAG_HANDLER_BEGIN(TABLE, "TABLE,TR,TD,TH") ParseInner(tag); m_WParser->SetAlign(oldAlign); - m_WParser->SetContainer(oldcont); + m_WParser->SetContainer(m_enclosingContainer); m_WParser->CloseContainer(); m_Table = oldt; - return TRUE; + + return true; // ParseInner() called } @@ -742,9 +766,20 @@ TAG_HANDLER_BEGIN(TABLE, "TABLE,TR,TD,TH") m_WParser->SetAlign(wxHTML_ALIGN_CENTER); m_WParser->OpenContainer(); + + ParseInner(tag); + + // set the current container back to the enclosing one so that + // text outside of and isn't included in any cell + // (this happens often enough in practice because it's common + // to use whitespace between and the next ): + m_WParser->SetContainer(m_enclosingContainer); + + return true; // ParseInner() called } } - return FALSE; + + return false; } TAG_HANDLER_END(TABLE)