]>
git.saurik.com Git - wxWidgets.git/blob - src/html/m_list.cpp
1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: wxHtml module for lists
4 // Author: Vaclav Slavik
6 // Copyright: (c) 1999 Vaclav Slavik
7 // Licence: wxWindows licence
8 /////////////////////////////////////////////////////////////////////////////
9 #if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
10 #pragma implementation
13 #include "wx/wxprec.h"
17 #if wxUSE_HTML && wxUSE_STREAMS
28 #include "wx/html/forcelnk.h"
29 #include "wx/html/m_templ.h"
31 #include "wx/html/htmlcell.h"
36 //-----------------------------------------------------------------------------
38 //-----------------------------------------------------------------------------
40 class wxHtmlListmarkCell
: public wxHtmlCell
45 wxHtmlListmarkCell(wxDC
*dc
, const wxColour
& clr
);
46 void Draw(wxDC
& dc
, int x
, int y
, int view_y1
, int view_y2
,
47 wxHtmlRenderingInfo
& info
);
49 DECLARE_NO_COPY_CLASS(wxHtmlListmarkCell
)
52 wxHtmlListmarkCell::wxHtmlListmarkCell(wxDC
* dc
, const wxColour
& clr
) : wxHtmlCell(), m_Brush(clr
, wxSOLID
)
54 m_Width
= dc
->GetCharHeight();
55 m_Height
= dc
->GetCharHeight();
61 void wxHtmlListmarkCell::Draw(wxDC
& dc
, int x
, int y
,
62 int WXUNUSED(view_y1
), int view_y2
,
63 wxHtmlRenderingInfo
& WXUNUSED(info
))
65 if (y
+m_PosY
+m_Height
> view_y2
) return;
68 dc
.DrawEllipse(x
+ m_PosX
+ m_Width
/ 3, y
+ m_PosY
+ m_Height
/ 3,
69 (m_Width
/ 3), (m_Width
/ 3));
72 //-----------------------------------------------------------------------------
74 //-----------------------------------------------------------------------------
76 struct wxHtmlListItemStruct
78 wxHtmlContainerCell
*mark
;
79 wxHtmlContainerCell
*cont
;
84 class wxHtmlListCell
: public wxHtmlContainerCell
90 wxHtmlListItemStruct
*m_RowInfo
;
91 void ReallocRows(int rows
);
92 void ComputeMinMaxWidths();
96 wxHtmlListCell(wxHtmlContainerCell
*parent
);
97 virtual ~wxHtmlListCell();
98 void AddRow(wxHtmlContainerCell
*mark
, wxHtmlContainerCell
*cont
);
99 virtual void Layout(int w
);
101 DECLARE_NO_COPY_CLASS(wxHtmlListCell
)
104 wxHtmlListCell::wxHtmlListCell(wxHtmlContainerCell
*parent
) : wxHtmlContainerCell(parent
)
111 wxHtmlListCell::~wxHtmlListCell()
113 if (m_RowInfo
) free(m_RowInfo
);
116 void wxHtmlListCell::Layout(int w
)
118 wxHtmlCell::Layout(w
);
120 ComputeMinMaxWidths();
121 m_Width
= wxMax(m_Width
, wxMin(w
, GetMaxTotalWidth()));
123 int s_width
= m_Width
- m_IndentLeft
;
126 for (int r
= 0; r
< m_NumRows
; r
++)
128 m_RowInfo
[r
].mark
->Layout(m_ListmarkWidth
);
129 m_RowInfo
[r
].mark
->SetPos(m_IndentLeft
, vpos
);
130 m_RowInfo
[r
].cont
->Layout(s_width
- m_ListmarkWidth
);
131 m_RowInfo
[r
].cont
->SetPos(m_IndentLeft
+ m_ListmarkWidth
, vpos
);
132 vpos
+= wxMax(m_RowInfo
[r
].cont
->GetHeight(), m_RowInfo
[r
].mark
->GetHeight());
137 void wxHtmlListCell::AddRow(wxHtmlContainerCell
*mark
, wxHtmlContainerCell
*cont
)
139 ReallocRows(++m_NumRows
);
140 m_RowInfo
[m_NumRows
- 1].mark
= mark
;
141 m_RowInfo
[m_NumRows
- 1].cont
= cont
;
144 void wxHtmlListCell::ReallocRows(int rows
)
146 m_RowInfo
= (wxHtmlListItemStruct
*) realloc(m_RowInfo
, sizeof(wxHtmlListItemStruct
) * rows
);
147 m_RowInfo
[rows
- 1].mark
= 0;
148 m_RowInfo
[rows
- 1].cont
= 0;
149 m_RowInfo
[rows
- 1].minWidth
= 0;
150 m_RowInfo
[rows
- 1].maxWidth
= 0;
155 void wxHtmlListCell::ComputeMinMaxWidths()
157 if (m_NumRows
== 0) return;
162 for (int r
= 0; r
< m_NumRows
; r
++)
164 wxHtmlListItemStruct
& row
= m_RowInfo
[r
];
167 int maxWidth
= row
.cont
->GetMaxTotalWidth();
168 int width
= row
.cont
->GetWidth();
169 if (row
.mark
->GetWidth() > m_ListmarkWidth
)
170 m_ListmarkWidth
= row
.mark
->GetWidth();
171 if (maxWidth
> m_MaxTotalWidth
)
172 m_MaxTotalWidth
= maxWidth
;
176 m_Width
+= m_ListmarkWidth
+ m_IndentLeft
;
177 m_MaxTotalWidth
+= m_ListmarkWidth
+ m_IndentLeft
;
180 //-----------------------------------------------------------------------------
181 // wxHtmlListcontentCell
182 //-----------------------------------------------------------------------------
184 class wxHtmlListcontentCell
: public wxHtmlContainerCell
187 wxHtmlListcontentCell(wxHtmlContainerCell
*p
) : wxHtmlContainerCell(p
) {}
188 virtual void Layout(int w
) {
189 // Reset top indentation, fixes <li><p>
190 SetIndent(0, wxHTML_INDENT_TOP
);
191 wxHtmlContainerCell::Layout(w
);
195 //-----------------------------------------------------------------------------
197 //-----------------------------------------------------------------------------
200 TAG_HANDLER_BEGIN(OLULLI
, "OL,UL,LI")
203 wxHtmlListCell
*m_List
;
205 // this is number of actual item of list or 0 for dots
207 TAG_HANDLER_CONSTR(OLULLI
)
213 TAG_HANDLER_PROC(tag
)
215 wxHtmlContainerCell
*c
;
218 if (m_List
&& tag
.GetName() == wxT("LI"))
220 c
= m_WParser
->SetContainer(new wxHtmlContainerCell(m_List
));
221 c
->SetAlignVer(wxHTML_ALIGN_TOP
);
223 wxHtmlContainerCell
*mark
= c
;
224 c
->SetWidthFloat(2 * m_WParser
->GetCharWidth(), wxHTML_UNITS_PIXELS
);
225 if (m_Numbering
== 0)
227 // Centering gives more space after the bullet
228 c
->SetAlignHor(wxHTML_ALIGN_CENTER
);
229 c
->InsertCell(new wxHtmlListmarkCell(m_WParser
->GetDC(), m_WParser
->GetActualColor()));
233 c
->SetAlignHor(wxHTML_ALIGN_RIGHT
);
235 mark
.Printf(wxT("%i."), m_Numbering
);
236 c
->InsertCell(new wxHtmlWordCell(mark
, *(m_WParser
->GetDC())));
238 m_WParser
->CloseContainer();
240 c
= m_WParser
->OpenContainer();
242 m_List
->AddRow(mark
, c
);
243 c
= m_WParser
->OpenContainer();
244 m_WParser
->SetContainer(new wxHtmlListcontentCell(c
));
246 if (m_Numbering
!= 0) m_Numbering
++;
249 // Begin of List (not-numbered): "UL", "OL"
250 else if (tag
.GetName() == wxT("UL") || tag
.GetName() == wxT("OL"))
252 int oldnum
= m_Numbering
;
254 if (tag
.GetName() == wxT("UL")) m_Numbering
= 0;
255 else m_Numbering
= 1;
257 wxHtmlContainerCell
*oldcont
;
258 oldcont
= c
= m_WParser
->OpenContainer();
260 wxHtmlListCell
*oldList
= m_List
;
261 m_List
= new wxHtmlListCell(c
);
262 m_List
->SetIndent(2 * m_WParser
->GetCharWidth(), wxHTML_INDENT_LEFT
);
266 m_WParser
->SetContainer(oldcont
);
267 m_WParser
->CloseContainer();
269 m_Numbering
= oldnum
;
277 TAG_HANDLER_END(OLULLI
)
280 TAGS_MODULE_BEGIN(List
)
282 TAGS_MODULE_ADD(OLULLI
)
284 TAGS_MODULE_END(List
)