1) some cleanup in wxHtmlWindow, moved private structures out of headers

2) added wxHtmlProcessor


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@9978 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Václav Slavík
2001-05-02 23:08:47 +00:00
parent 75e0142942
commit 892aeafc2a
3 changed files with 237 additions and 84 deletions

View File

@@ -9,7 +9,8 @@
#ifdef __GNUG__
#pragma implementation
#pragma implementation "htmlwin.h"
#pragma implementation "htmlproc.h"
#endif
#include "wx/wxprec.h"
@@ -27,19 +28,48 @@
#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/listimpl.cpp"
//-----------------------------------------------------------------------------
// wxHtmlHistoryItem
//-----------------------------------------------------------------------------
// item of history list
class WXDLLEXPORT wxHtmlHistoryItem : public wxObject
{
public:
wxHtmlHistoryItem(const wxString& p, const wxString& a) {m_Page = p, m_Anchor = a, m_Pos = 0;}
int GetPos() const {return m_Pos;}
void SetPos(int p) {m_Pos = p;}
const wxString& GetPage() const {return m_Page;}
const wxString& GetAnchor() const {return m_Anchor;}
private:
wxString m_Page;
wxString m_Anchor;
int m_Pos;
};
//-----------------------------------------------------------------------------
// our private arrays:
//-----------------------------------------------------------------------------
WX_DECLARE_OBJARRAY(wxHtmlHistoryItem, wxHtmlHistoryArray);
WX_DEFINE_OBJARRAY(wxHtmlHistoryArray);
WX_DECLARE_LIST(wxHtmlProcessor, wxHtmlProcessorList);
WX_DEFINE_LIST(wxHtmlProcessorList);
//-----------------------------------------------------------------------------
// wxHtmlWindow
//-----------------------------------------------------------------------------
#include "wx/arrimpl.cpp"
WX_DEFINE_OBJARRAY(HtmlHistoryArray)
wxHtmlWindow::wxHtmlWindow(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size,
long style, const wxString& name) : wxScrolledWindow(parent, id, pos, size, style | wxVSCROLL | wxHSCROLL, name)
{
@@ -49,7 +79,7 @@ wxHtmlWindow::wxHtmlWindow(wxWindow *parent, wxWindowID id, const wxPoint& pos,
m_FS = new wxFileSystem();
m_RelatedStatusBar = -1;
m_RelatedFrame = NULL;
m_TitleFormat = "%s";
m_TitleFormat = wxT("%s");
m_OpenedPage = m_OpenedAnchor = m_OpenedPageTitle = wxEmptyString;
m_Cell = NULL;
m_Parser = new wxHtmlWinParser(this);
@@ -57,6 +87,8 @@ wxHtmlWindow::wxHtmlWindow(wxWindow *parent, wxWindowID id, const wxPoint& pos,
SetBorders(10);
m_HistoryPos = -1;
m_HistoryOn = TRUE;
m_History = new wxHtmlHistoryArray;
m_Processors = NULL;
m_Style = style;
SetPage(wxT("<html><body></body></html>"));
}
@@ -71,6 +103,8 @@ wxHtmlWindow::~wxHtmlWindow()
delete m_Parser;
delete m_FS;
delete m_History;
delete m_Processors;
}
@@ -95,7 +129,8 @@ void wxHtmlWindow::SetFonts(wxString normal_face, wxString fixed_face, const int
wxString op = m_OpenedPage;
m_Parser->SetFonts(normal_face, fixed_face, sizes);
SetPage(wxT("<html><body></body></html>")); // fonts changed => contents invalid
// fonts changed => contents invalid, so reload the page:
SetPage(wxT("<html><body></body></html>"));
if (!op.IsEmpty()) LoadPage(op);
}
@@ -103,8 +138,36 @@ void wxHtmlWindow::SetFonts(wxString normal_face, wxString fixed_face, const int
bool wxHtmlWindow::SetPage(const wxString& source)
{
wxClientDC *dc = new wxClientDC(this);
wxString newsrc(source);
// pass HTML through registered processors:
if (m_Processors || m_SharedProcessors)
{
wxHtmlProcessorList::Node *nodeL, *nodeS;
int prL, prS;
nodeL = (m_Processors) ? m_Processors->GetFirst() : NULL;
nodeS = (m_SharedProcessors) ? m_SharedProcessors->GetFirst() : NULL;
while (nodeL || nodeS)
{
prL = (nodeL) ? nodeL->GetData()->GetPriority() : -1;
prS = (nodeS) ? nodeS->GetData()->GetPriority() : -1;
if (prL > prS)
{
newsrc = nodeL->GetData()->Process(newsrc);
nodeL = nodeL->GetNext();
}
else // prL <= prS
{
newsrc = nodeS->GetData()->Process(newsrc);
nodeS = nodeS->GetNext();
}
}
}
// ...and run the parser on it:
wxClientDC *dc = new wxClientDC(this);
dc->SetMapMode(wxMM_TEXT);
SetBackgroundColour(wxColour(0xFF, 0xFF, 0xFF));
m_OpenedPage = m_OpenedAnchor = m_OpenedPageTitle = wxEmptyString;
@@ -114,12 +177,13 @@ bool wxHtmlWindow::SetPage(const wxString& source)
delete m_Cell;
m_Cell = NULL;
}
m_Cell = (wxHtmlContainerCell*) m_Parser->Parse(source);
m_Cell = (wxHtmlContainerCell*) m_Parser->Parse(newsrc);
delete dc;
m_Cell->SetIndent(m_Borders, wxHTML_INDENT_ALL, wxHTML_UNITS_PIXELS);
m_Cell->SetAlignHor(wxHTML_ALIGN_CENTER);
CreateLayout();
if (m_tmpCanDrawLocks == 0) Refresh();
if (m_tmpCanDrawLocks == 0)
Refresh();
return TRUE;
}
@@ -138,7 +202,7 @@ bool wxHtmlWindow::LoadPage(const wxString& location)
{
int x, y;
ViewStart(&x, &y);
m_History[m_HistoryPos].SetPos(y);
(*m_History)[m_HistoryPos].SetPos(y);
}
if (location[0] == wxT('#')) // local anchor
@@ -233,12 +297,12 @@ bool wxHtmlWindow::LoadPage(const wxString& location)
if (m_HistoryOn) // add this page to history there:
{
int c = m_History.GetCount() - (m_HistoryPos + 1);
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 HtmlHistoryItem(m_OpenedPage, m_OpenedAnchor));
m_History->Remove(m_HistoryPos);
m_History->Add(new wxHtmlHistoryItem(m_OpenedPage, m_OpenedAnchor));
}
if (m_OpenedPageTitle == wxEmptyString)
@@ -342,10 +406,10 @@ void wxHtmlWindow::ReadCustomization(wxConfigBase *cfg, wxString path)
cfg->SetPath(path);
}
m_Borders = cfg->Read("wxHtmlWindow/Borders", m_Borders);
p_fff = cfg->Read("wxHtmlWindow/FontFaceFixed", m_Parser->m_FontFaceFixed);
p_ffn = cfg->Read("wxHtmlWindow/FontFaceNormal", m_Parser->m_FontFaceNormal);
for (int i = 0; i < 7; i++)
m_Borders = cfg->Read(wxT("wxHtmlWindow/Borders"), m_Borders);
p_fff = cfg->Read(wxT("wxHtmlWindow/FontFaceFixed"), m_Parser->m_FontFaceFixed);
p_ffn = cfg->Read(wxT("wxHtmlWindow/FontFaceNormal"), m_Parser->m_FontFaceNormal);
for (int i = 0; i < 7; i++)
{
tmp.Printf(wxT("wxHtmlWindow/FontsSize%i"), i);
p_fontsizes[i] = cfg->Read(tmp, m_Parser->m_FontsSizes[i]);
@@ -369,10 +433,10 @@ void wxHtmlWindow::WriteCustomization(wxConfigBase *cfg, wxString path)
cfg->SetPath(path);
}
cfg->Write("wxHtmlWindow/Borders", (long) m_Borders);
cfg->Write("wxHtmlWindow/FontFaceFixed", m_Parser->m_FontFaceFixed);
cfg->Write("wxHtmlWindow/FontFaceNormal", m_Parser->m_FontFaceNormal);
for (int i = 0; i < 7; i++)
cfg->Write(wxT("wxHtmlWindow/Borders"), (long) m_Borders);
cfg->Write(wxT("wxHtmlWindow/FontFaceFixed"), m_Parser->m_FontFaceFixed);
cfg->Write(wxT("wxHtmlWindow/FontFaceNormal"), m_Parser->m_FontFaceNormal);
for (int i = 0; i < 7; i++)
{
tmp.Printf(wxT("wxHtmlWindow/FontsSize%i"), i);
cfg->Write(tmp, (long) m_Parser->m_FontsSizes[i]);
@@ -393,13 +457,13 @@ bool wxHtmlWindow::HistoryBack()
// store scroll position into history item:
int x, y;
ViewStart(&x, &y);
m_History[m_HistoryPos].SetPos(y);
(*m_History)[m_HistoryPos].SetPos(y);
// go to previous position:
m_HistoryPos--;
l = m_History[m_HistoryPos].GetPage();
a = m_History[m_HistoryPos].GetAnchor();
l = (*m_History)[m_HistoryPos].GetPage();
a = (*m_History)[m_HistoryPos].GetAnchor();
m_HistoryOn = FALSE;
m_tmpCanDrawLocks++;
if (a == wxEmptyString) LoadPage(l);
@@ -407,7 +471,7 @@ bool wxHtmlWindow::HistoryBack()
m_HistoryOn = TRUE;
wxYield();
m_tmpCanDrawLocks--;
Scroll(0, m_History[m_HistoryPos].GetPos());
Scroll(0, (*m_History)[m_HistoryPos].GetPos());
Refresh();
return TRUE;
}
@@ -424,13 +488,13 @@ bool wxHtmlWindow::HistoryForward()
wxString a, l;
if (m_HistoryPos == -1) return FALSE;
if (m_HistoryPos >= (int)m_History.GetCount() - 1)return FALSE;
if (m_HistoryPos >= (int)m_History->GetCount() - 1)return FALSE;
m_OpenedPage = wxEmptyString; // this will disable adding new entry into history in LoadPage()
m_HistoryPos++;
l = m_History[m_HistoryPos].GetPage();
a = m_History[m_HistoryPos].GetAnchor();
l = (*m_History)[m_HistoryPos].GetPage();
a = (*m_History)[m_HistoryPos].GetAnchor();
m_HistoryOn = FALSE;
m_tmpCanDrawLocks++;
if (a == wxEmptyString) LoadPage(l);
@@ -438,7 +502,7 @@ bool wxHtmlWindow::HistoryForward()
m_HistoryOn = TRUE;
wxYield();
m_tmpCanDrawLocks--;
Scroll(0, m_History[m_HistoryPos].GetPos());
Scroll(0, (*m_History)[m_HistoryPos].GetPos());
Refresh();
return TRUE;
}
@@ -446,32 +510,75 @@ bool wxHtmlWindow::HistoryForward()
bool wxHtmlWindow::HistoryCanForward()
{
if (m_HistoryPos == -1) return FALSE;
if (m_HistoryPos >= (int)m_History.GetCount() - 1)return FALSE;
if (m_HistoryPos >= (int)m_History->GetCount() - 1)return FALSE;
return TRUE ;
}
void wxHtmlWindow::HistoryClear()
{
m_History.Empty();
m_History->Empty();
m_HistoryPos = -1;
}
void wxHtmlWindow::AddProcessor(wxHtmlProcessor *processor)
{
if (!m_Processors)
{
m_Processors = new wxHtmlProcessorList;
m_Processors->DeleteContents(TRUE);
}
wxHtmlProcessorList::Node *node;
for (node = m_Processors->GetFirst(); node; node = node->GetNext())
{
if (processor->GetPriority() > node->GetData()->GetPriority())
{
m_Processors->Insert(node, processor);
break;
}
}
}
/*static */ void wxHtmlWindow::AddSharedProcessor(wxHtmlProcessor *processor)
{
if (!m_SharedProcessors)
{
m_SharedProcessors = new wxHtmlProcessorList;
m_SharedProcessors->DeleteContents(TRUE);
}
wxHtmlProcessorList::Node *node;
for (node = m_SharedProcessors->GetFirst(); node; node = node->GetNext())
{
if (processor->GetPriority() > node->GetData()->GetPriority())
{
m_SharedProcessors->Insert(node, processor);
break;
}
}
}
wxList wxHtmlWindow::m_Filters;
wxHtmlFilter *wxHtmlWindow::m_DefaultFilter = NULL;
wxCursor *wxHtmlWindow::s_cur_hand = NULL;
wxCursor *wxHtmlWindow::s_cur_arrow = NULL;
wxHtmlProcessorList *wxHtmlWindow::m_SharedProcessors = NULL;
void wxHtmlWindow::CleanUpStatics()
{
if (m_DefaultFilter) delete m_DefaultFilter;
delete m_DefaultFilter;
m_DefaultFilter = NULL;
m_Filters.DeleteContents(TRUE);
m_Filters.Clear();
if (s_cur_hand) delete s_cur_hand;
if (s_cur_arrow) delete s_cur_arrow;
delete m_SharedProcessors;
m_SharedProcessors = NULL;
delete s_cur_hand;
delete s_cur_arrow;
}