Files
wxWidgets/src/html/m_list.cpp
Vadim Zeitlin 3f66f6a5b3 Remove all lines containing cvs/svn "$Id$" keyword.
This keyword is not expanded by Git which means it's not replaced with the
correct revision value in the releases made using git-based scripts and it's
confusing to have lines with unexpanded "$Id$" in the released files. As
expanding them with Git is not that simple (it could be done with git archive
and export-subst attribute) and there are not many benefits in having them in
the first place, just remove all these lines.

If nothing else, this will make an eventual transition to Git simpler.

Closes #14487.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@74602 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
2013-07-26 16:02:46 +00:00

307 lines
8.4 KiB
C++

/////////////////////////////////////////////////////////////////////////////
// Name: src/html/m_list.cpp
// Purpose: wxHtml module for lists
// Author: Vaclav Slavik
// Copyright: (c) 1999 Vaclav Slavik
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#if wxUSE_HTML && wxUSE_STREAMS
#ifndef WX_PRECOMP
#include "wx/brush.h"
#include "wx/dc.h"
#endif
#include "wx/html/forcelnk.h"
#include "wx/html/m_templ.h"
#include "wx/html/htmlcell.h"
FORCE_LINK_ME(m_list)
//-----------------------------------------------------------------------------
// wxHtmlListmarkCell
//-----------------------------------------------------------------------------
class wxHtmlListmarkCell : public wxHtmlCell
{
private:
wxBrush m_Brush;
public:
wxHtmlListmarkCell(wxDC *dc, const wxColour& clr);
void Draw(wxDC& dc, int x, int y, int view_y1, int view_y2,
wxHtmlRenderingInfo& info);
wxDECLARE_NO_COPY_CLASS(wxHtmlListmarkCell);
};
wxHtmlListmarkCell::wxHtmlListmarkCell(wxDC* dc, const wxColour& clr) : wxHtmlCell(), m_Brush(clr, wxBRUSHSTYLE_SOLID)
{
m_Width = dc->GetCharHeight();
m_Height = dc->GetCharHeight();
// 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 WXUNUSED(view_y2),
wxHtmlRenderingInfo& WXUNUSED(info))
{
dc.SetBrush(m_Brush);
dc.DrawEllipse(x + m_PosX + m_Width / 3, y + m_PosY + m_Height / 3,
(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 ComputeMaxBase(wxHtmlCell *cell);
int m_ListmarkWidth;
public:
wxHtmlListCell(wxHtmlContainerCell *parent);
virtual ~wxHtmlListCell();
void AddRow(wxHtmlContainerCell *mark, wxHtmlContainerCell *cont);
virtual void Layout(int w);
wxDECLARE_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);
}
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);
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++)
{
// do layout first time to layout contents and adjust pos
m_RowInfo[r].mark->Layout(m_ListmarkWidth);
m_RowInfo[r].cont->Layout(s_width - m_ListmarkWidth);
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::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 = NULL;
m_RowInfo[rows - 1].cont = NULL;
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 <li><p>
SetIndent(0, wxHTML_INDENT_TOP);
wxHtmlContainerCell::Layout(w);
}
};
//-----------------------------------------------------------------------------
// The list handler:
//-----------------------------------------------------------------------------
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
TAG_HANDLER_CONSTR(OLULLI)
{
m_List = NULL;
m_Numbering = 0;
}
TAG_HANDLER_PROC(tag)
{
wxHtmlContainerCell *c;
// List Item:
if (m_List && tag.GetName() == wxT("LI"))
{
c = m_WParser->SetContainer(new wxHtmlContainerCell(m_List));
c->SetAlignVer(wxHTML_ALIGN_TOP);
wxHtmlContainerCell *mark = c;
c->SetWidthFloat(2 * m_WParser->GetCharWidth(), wxHTML_UNITS_PIXELS);
if (m_Numbering == 0)
{
// Centering gives more space after the bullet
c->SetAlignHor(wxHTML_ALIGN_CENTER);
c->InsertCell(new wxHtmlListmarkCell(m_WParser->GetDC(), m_WParser->GetActualColor()));
}
else
{
c->SetAlignHor(wxHTML_ALIGN_RIGHT);
wxString markStr;
markStr.Printf(wxT("%i. "), m_Numbering);
c->InsertCell(new wxHtmlWordCell(markStr, *(m_WParser->GetDC())));
}
m_WParser->CloseContainer();
c = m_WParser->OpenContainer();
m_List->AddRow(mark, c);
c = m_WParser->OpenContainer();
m_WParser->SetContainer(new wxHtmlListcontentCell(c));
if (m_Numbering != 0) m_Numbering++;
}
// Begin of List (not-numbered): "UL", "OL"
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;
wxHtmlContainerCell *oldcont;
oldcont = c = 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->SetContainer(oldcont);
m_WParser->CloseContainer();
m_Numbering = oldnum;
m_List = oldList;
return true;
}
return false;
}
TAG_HANDLER_END(OLULLI)
TAGS_MODULE_BEGIN(List)
TAGS_MODULE_ADD(OLULLI)
TAGS_MODULE_END(List)
#endif