#endif
#ifndef WXPRECOMP
-#include "wx/wx.h"
+ #include "wx/log.h"
+ #include "wx/intl.h"
+ #include "wx/dcclient.h"
+ #include "wx/frame.h"
#endif
#include "wx/html/htmlwin.h"
#include "wx/html/forcelnk.h"
#include "wx/html/htmlproc.h"
-#include "wx/log.h"
-#include "wx/arrimpl.cpp"
#include "wx/list.h"
+
+#include "wx/arrimpl.cpp"
#include "wx/listimpl.cpp"
//-----------------------------------------------------------------------------
wxString newsrc(source);
// pass HTML through registered processors:
- if (m_Processors || m_SharedProcessors)
+ if (m_Processors || m_GlobalProcessors)
{
- wxHtmlProcessorList::Node *nodeL, *nodeS;
- int prL, prS;
+ wxHtmlProcessorList::Node *nodeL, *nodeG;
+ int prL, prG;
nodeL = (m_Processors) ? m_Processors->GetFirst() : NULL;
- nodeS = (m_SharedProcessors) ? m_SharedProcessors->GetFirst() : NULL;
-
- while (nodeL || nodeS)
+ nodeG = (m_GlobalProcessors) ? m_GlobalProcessors->GetFirst() : NULL;
+
+ // VS: there are two lists, global and local, both of them sorted by
+ // priority. Since we have to go through _both_ lists with
+ // decreasing priority, we "merge-sort" the lists on-line by
+ // processing that one of the two heads that has higher priority
+ // in every iteration
+ while (nodeL || nodeG)
{
prL = (nodeL) ? nodeL->GetData()->GetPriority() : -1;
- prS = (nodeS) ? nodeS->GetData()->GetPriority() : -1;
- if (prL > prS)
+ prG = (nodeG) ? nodeG->GetData()->GetPriority() : -1;
+ if (prL > prG)
{
- newsrc = nodeL->GetData()->Process(newsrc);
+ if (nodeL->GetData()->IsEnabled())
+ newsrc = nodeL->GetData()->Process(newsrc);
nodeL = nodeL->GetNext();
}
- else // prL <= prS
+ else // prL <= prG
{
- newsrc = nodeS->GetData()->Process(newsrc);
- nodeS = nodeS->GetNext();
+ if (nodeG->GetData()->IsEnabled())
+ newsrc = nodeG->GetData()->Process(newsrc);
+ nodeG = nodeG->GetNext();
}
}
}
wxYield(); Refresh(FALSE);
m_tmpCanDrawLocks++;
- if (m_HistoryOn && (m_HistoryPos != -1)) // store scroll position into history item
+ if (m_HistoryOn && (m_HistoryPos != -1))
{
+ // store scroll position into history item:
int x, y;
- ViewStart(&x, &y);
+ GetViewStart(&x, &y);
(*m_History)[m_HistoryPos].SetPos(y);
}
- if (location[0] == wxT('#')) // local anchor
+ if (location[0] == wxT('#'))
{
+ // local anchor:
wxString anch = location.Mid(1) /*1 to end*/;
m_tmpCanDrawLocks--;
rt_val = ScrollToAnchor(anch);
}
else if (location.Find(wxT('#')) != wxNOT_FOUND &&
(m_FS->GetPath() + location.BeforeFirst(wxT('#'))) == m_OpenedPage)
- {
+ {
wxString anch = location.AfterFirst(wxT('#'));
m_tmpCanDrawLocks--;
rt_val = ScrollToAnchor(anch);
needs_refresh = TRUE;
// load&display it:
if (m_RelatedStatusBar != -1)
- {
+ {
m_RelatedFrame->SetStatusText(_("Connecting..."), m_RelatedStatusBar);
Refresh(FALSE);
}
f = m_FS->OpenFile(location);
if (f == NULL)
- {
- wxString err;
-
+ {
wxLogError(_("Unable to open requested HTML document: %s"), location.c_str());
m_tmpCanDrawLocks--;
}
else
- {
+ {
wxNode *node;
wxString src = wxEmptyString;
if (m_RelatedStatusBar != -1)
- {
+ {
wxString msg = _("Loading : ") + location;
m_RelatedFrame->SetStatusText(msg, m_RelatedStatusBar);
Refresh(FALSE);
node = m_Filters.GetFirst();
while (node)
- {
+ {
wxHtmlFilter *h = (wxHtmlFilter*) node->GetData();
if (h->CanRead(*f))
- {
+ {
src = h->ReadFile(*f);
break;
}
node = node->GetNext();
}
if (src == wxEmptyString)
- {
+ {
if (m_DefaultFilter == NULL) m_DefaultFilter = GetDefaultFilter();
src = m_DefaultFilter->ReadFile(*f);
}
rt_val = SetPage(src);
m_OpenedPage = f->GetLocation();
if (f->GetAnchor() != wxEmptyString)
- {
+ {
wxYield();
ScrollToAnchor(f->GetAnchor());
}
{
int c = m_History->GetCount() - (m_HistoryPos + 1);
- m_HistoryPos++;
- for (int i = 0; i < c; i++)
- m_History->Remove(m_HistoryPos);
- m_History->Add(new wxHtmlHistoryItem(m_OpenedPage, m_OpenedAnchor));
+ if (m_HistoryPos < 0 ||
+ (*m_History)[m_HistoryPos].GetPage() != m_OpenedPage ||
+ (*m_History)[m_HistoryPos].GetAnchor() != m_OpenedAnchor)
+ {
+ m_HistoryPos++;
+ for (int i = 0; i < c; i++)
+ m_History->RemoveAt(m_HistoryPos);
+ m_History->Add(new wxHtmlHistoryItem(m_OpenedPage, m_OpenedAnchor));
+ }
}
if (m_OpenedPageTitle == wxEmptyString)
GetClientSize(&ClientWidth, &ClientHeight);
m_Cell->Layout(ClientWidth);
if (ClientHeight < m_Cell->GetHeight() + GetCharHeight())
- {
+ {
SetScrollbars(
wxHTML_SCROLL_STEP, wxHTML_SCROLL_STEP,
m_Cell->GetWidth() / wxHTML_SCROLL_STEP,
/*cheat: top-level frag is always container*/);
}
else /* we fit into window, no need for scrollbars */
- {
+ {
SetScrollbars(wxHTML_SCROLL_STEP, 1, m_Cell->GetWidth() / wxHTML_SCROLL_STEP, 0); // disable...
GetClientSize(&ClientWidth, &ClientHeight);
m_Cell->Layout(ClientWidth); // ...and relayout
// store scroll position into history item:
int x, y;
- ViewStart(&x, &y);
+ GetViewStart(&x, &y);
(*m_History)[m_HistoryPos].SetPos(y);
// go to previous position:
if (processor->GetPriority() > node->GetData()->GetPriority())
{
m_Processors->Insert(node, processor);
- break;
+ return;
}
}
+ m_Processors->Append(processor);
}
-/*static */ void wxHtmlWindow::AddSharedProcessor(wxHtmlProcessor *processor)
+/*static */ void wxHtmlWindow::AddGlobalProcessor(wxHtmlProcessor *processor)
{
- if (!m_SharedProcessors)
+ if (!m_GlobalProcessors)
{
- m_SharedProcessors = new wxHtmlProcessorList;
- m_SharedProcessors->DeleteContents(TRUE);
+ m_GlobalProcessors = new wxHtmlProcessorList;
+ m_GlobalProcessors->DeleteContents(TRUE);
}
wxHtmlProcessorList::Node *node;
- for (node = m_SharedProcessors->GetFirst(); node; node = node->GetNext())
+ for (node = m_GlobalProcessors->GetFirst(); node; node = node->GetNext())
{
if (processor->GetPriority() > node->GetData()->GetPriority())
{
- m_SharedProcessors->Insert(node, processor);
- break;
+ m_GlobalProcessors->Insert(node, processor);
+ return;
}
}
+ m_GlobalProcessors->Append(processor);
}
wxHtmlFilter *wxHtmlWindow::m_DefaultFilter = NULL;
wxCursor *wxHtmlWindow::s_cur_hand = NULL;
wxCursor *wxHtmlWindow::s_cur_arrow = NULL;
-wxHtmlProcessorList *wxHtmlWindow::m_SharedProcessors = NULL;
+wxHtmlProcessorList *wxHtmlWindow::m_GlobalProcessors = NULL;
void wxHtmlWindow::CleanUpStatics()
{
m_DefaultFilter = NULL;
m_Filters.DeleteContents(TRUE);
m_Filters.Clear();
-
- delete m_SharedProcessors;
- m_SharedProcessors = NULL;
-
+ delete m_GlobalProcessors;
+ m_GlobalProcessors = NULL;
delete s_cur_hand;
delete s_cur_arrow;
}
#endif
#endif
dc.SetBackgroundMode(wxTRANSPARENT);
- ViewStart(&x, &y);
+ GetViewStart(&x, &y);
while (upd)
{
wxPoint pos;
wxString lnk;
- ViewStart(&sx, &sy); sx *= wxHTML_SCROLL_STEP; sy *= wxHTML_SCROLL_STEP;
+ GetViewStart(&sx, &sy); sx *= wxHTML_SCROLL_STEP; sy *= wxHTML_SCROLL_STEP;
pos = event.GetPosition();
if (m_Cell)
int x, y;
wxHtmlLinkInfo *lnk;
- ViewStart(&sx, &sy); sx *= wxHTML_SCROLL_STEP; sy *= wxHTML_SCROLL_STEP;
+ GetViewStart(&sx, &sy); sx *= wxHTML_SCROLL_STEP; sy *= wxHTML_SCROLL_STEP;
wxGetMousePosition(&x, &y);
ScreenToClient(&x, &y);
lnk = m_Cell->GetLink(sx + x, sy + y);
if (lnk != m_tmpLastLink)
- {
+ {
if (lnk == NULL)
- {
+ {
SetCursor(*s_cur_arrow);
if (m_RelatedStatusBar != -1) m_RelatedFrame->SetStatusText(wxEmptyString, m_RelatedStatusBar);
}
else
- {
+ {
SetCursor(*s_cur_hand);
if (m_RelatedStatusBar != -1)
m_RelatedFrame->SetStatusText(lnk->GetHref(), m_RelatedStatusBar);