/////////////////////////////////////////////////////////////////////////////
-#ifdef __GNUG__
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
#pragma implementation "htmlwin.h"
#pragma implementation "htmlproc.h"
#endif
if (m_Cell) delete m_Cell;
+ if ( m_Processors )
+ {
+ WX_CLEAR_LIST(wxHtmlProcessorList, *m_Processors);
+ }
+
delete m_Parser;
delete m_FS;
delete m_History;
// pass HTML through registered processors:
if (m_Processors || m_GlobalProcessors)
{
- wxHtmlProcessorList::Node *nodeL, *nodeG;
+ wxHtmlProcessorList::compatibility_iterator nodeL, nodeG;
int prL, prG;
- nodeL = (m_Processors) ? m_Processors->GetFirst() : NULL;
- nodeG = (m_GlobalProcessors) ? m_GlobalProcessors->GetFirst() : NULL;
+ nodeL = (m_Processors) ? m_Processors->GetFirst() : wxHtmlProcessorList::compatibility_iterator();
+ nodeG = (m_GlobalProcessors) ? m_GlobalProcessors->GetFirst() : wxHtmlProcessorList::compatibility_iterator();
// VS: there are two lists, global and local, both of them sorted by
// priority. Since we have to go through _both_ lists with
else
{
- wxNode *node;
+ wxList::compatibility_iterator node;
wxString src = wxEmptyString;
if (m_RelatedStatusBar != -1)
if (!m_Processors)
{
m_Processors = new wxHtmlProcessorList;
- m_Processors->DeleteContents(TRUE);
}
- wxHtmlProcessorList::Node *node;
+ wxHtmlProcessorList::compatibility_iterator node;
for (node = m_Processors->GetFirst(); node; node = node->GetNext())
{
if (!m_GlobalProcessors)
{
m_GlobalProcessors = new wxHtmlProcessorList;
- m_GlobalProcessors->DeleteContents(TRUE);
}
- wxHtmlProcessorList::Node *node;
+ wxHtmlProcessorList::compatibility_iterator node;
for (node = m_GlobalProcessors->GetFirst(); node; node = node->GetNext())
{
void wxHtmlWindow::CleanUpStatics()
{
wxDELETE(m_DefaultFilter);
- m_Filters.DeleteContents(TRUE);
- m_Filters.Clear();
+ WX_CLEAR_LIST(wxList, m_Filters);
+ if (m_GlobalProcessors)
+ WX_CLEAR_LIST(wxHtmlProcessorList, *m_GlobalProcessors);
wxDELETE(m_GlobalProcessors);
}
// do nothing here
}
-void wxHtmlWindow::OnEraseBackground(wxEraseEvent& event)
+void wxHtmlWindow::OnEraseBackground(wxEraseEvent& WXUNUSED(event))
{
}
y * wxHTML_SCROLL_STEP + rect.GetTop(),
y * wxHTML_SCROLL_STEP + rect.GetBottom(),
rinfo);
+
+//#define DEBUG_HTML_SELECTION
+#ifdef DEBUG_HTML_SELECTION
+ {
+ int xc, yc, x, y;
+ wxGetMousePosition(&xc, &yc);
+ ScreenToClient(&xc, &yc);
+ CalcUnscrolledPosition(xc, yc, &x, &y);
+ wxHtmlCell *at = m_Cell->FindCellByPos(x, y);
+ wxHtmlCell *before =
+ m_Cell->FindCellByPos(x, y, wxHTML_FIND_NEAREST_BEFORE);
+ wxHtmlCell *after =
+ m_Cell->FindCellByPos(x, y, wxHTML_FIND_NEAREST_AFTER);
+
+ dcm.SetBrush(*wxTRANSPARENT_BRUSH);
+ dcm.SetPen(*wxBLACK_PEN);
+ if (at)
+ dcm.DrawRectangle(at->GetAbsPos(),
+ wxSize(at->GetWidth(),at->GetHeight()));
+ dcm.SetPen(*wxGREEN_PEN);
+ if (before)
+ dcm.DrawRectangle(before->GetAbsPos().x+1, before->GetAbsPos().y+1,
+ before->GetWidth()-2,before->GetHeight()-2);
+ dcm.SetPen(*wxRED_PEN);
+ if (after)
+ dcm.DrawRectangle(after->GetAbsPos().x+2, after->GetAbsPos().y+2,
+ after->GetWidth()-4,after->GetHeight()-4);
+ }
+#endif
dcm.SetDeviceOrigin(0,0);
dc.Blit(0, rect.GetTop(),
}
-void wxHtmlWindow::OnMouseMove(wxMouseEvent& event)
+void wxHtmlWindow::OnMouseMove(wxMouseEvent& WXUNUSED(event))
{
m_tmpMouseMoved = true;
}
-void wxHtmlWindow::OnIdle(wxIdleEvent& WXUNUSED(event))
-{
+void wxHtmlWindow::OnInternalIdle()
+{
+ wxWindow::OnInternalIdle();
+
if (m_tmpMouseMoved && (m_Cell != NULL))
{
+#ifdef DEBUG_HTML_SELECTION
+ Refresh();
+#endif
int xc, yc, x, y;
wxGetMousePosition(&xc, &yc);
ScreenToClient(&xc, &yc);
// handle selection update:
if ( m_makingSelection )
{
- bool goingDown = m_tmpSelFromPos.y < y ||
- m_tmpSelFromPos.y == y && m_tmpSelFromPos.x < x;
-
if ( !m_tmpSelFromCell )
m_tmpSelFromCell = m_Cell->FindCellByPos(
m_tmpSelFromPos.x,m_tmpSelFromPos.y);
+
+ // NB: a trick - we adjust selFromPos to be upper left or bottom
+ // right corner of the first cell of the selection depending
+ // on whether the mouse is moving to the right or to the left.
+ // This gives us more "natural" behaviour when selecting
+ // a line (specifically, first cell of the next line is not
+ // included if you drag selection from left to right over
+ // entire line):
+ wxPoint dirFromPos;
+ if ( !m_tmpSelFromCell )
+ {
+ dirFromPos = m_tmpSelFromPos;
+ }
+ else
+ {
+ dirFromPos = m_tmpSelFromCell->GetAbsPos();
+ if ( x < m_tmpSelFromPos.x )
+ {
+ dirFromPos.x += m_tmpSelFromCell->GetWidth();
+ dirFromPos.y += m_tmpSelFromCell->GetHeight();
+ }
+ }
+ bool goingDown = dirFromPos.y < y ||
+ (dirFromPos.y == y && dirFromPos.x < x);
+
+ // determine selection span:
if ( /*still*/ !m_tmpSelFromCell )
{
if (goingDown)
if (goingDown)
{
selcell = m_Cell->FindCellByPos(x, y,
- wxHTML_FIND_NEAREST_AFTER);
+ wxHTML_FIND_NEAREST_BEFORE);
if (!selcell)
selcell = m_Cell->GetLastTerminal();
}
else
{
selcell = m_Cell->FindCellByPos(x, y,
- wxHTML_FIND_NEAREST_BEFORE);
+ wxHTML_FIND_NEAREST_AFTER);
if (!selcell)
selcell = m_Cell->GetFirstTerminal();
}
}
}
-void wxHtmlWindow::OnCopy(wxCommandEvent& event)
+void wxHtmlWindow::OnCopy(wxCommandEvent& WXUNUSED(event))
{
if ( m_selection )
CopySelection();
IMPLEMENT_ABSTRACT_CLASS(wxHtmlProcessor,wxObject)
+#if wxUSE_EXTENDED_RTTI
+IMPLEMENT_DYNAMIC_CLASS_XTI(wxHtmlWindow, wxScrolledWindow,"wx/html/htmlwin.h")
+
+wxBEGIN_PROPERTIES_TABLE(wxHtmlWindow)
+/*
+ TODO PROPERTIES
+ style , wxHW_SCROLLBAR_AUTO
+ borders , (dimension)
+ url , string
+ htmlcode , string
+*/
+wxEND_PROPERTIES_TABLE()
+
+wxBEGIN_HANDLERS_TABLE(wxHtmlWindow)
+wxEND_HANDLERS_TABLE()
+
+wxCONSTRUCTOR_5( wxHtmlWindow , wxWindow* , Parent , wxWindowID , Id , wxPoint , Position , wxSize , Size , long , WindowStyle )
+#else
IMPLEMENT_DYNAMIC_CLASS(wxHtmlWindow,wxScrolledWindow)
+#endif
BEGIN_EVENT_TABLE(wxHtmlWindow, wxScrolledWindow)
EVT_SIZE(wxHtmlWindow::OnSize)
EVT_LEFT_UP(wxHtmlWindow::OnMouseUp)
EVT_RIGHT_UP(wxHtmlWindow::OnMouseUp)
EVT_MOTION(wxHtmlWindow::OnMouseMove)
- EVT_IDLE(wxHtmlWindow::OnIdle)
EVT_ERASE_BACKGROUND(wxHtmlWindow::OnEraseBackground)
EVT_PAINT(wxHtmlWindow::OnPaint)
#if wxUSE_CLIPBOARD