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

@@ -0,0 +1,56 @@
/////////////////////////////////////////////////////////////////////////////
// Name: htmlprep.h
// Purpose: HTML processor
// Author: Vaclav Slavik
// RCS-ID: $Id$
// Copyright: (c) 2001 Vaclav Slavik
// Licence: wxWindows Licence
/////////////////////////////////////////////////////////////////////////////
#ifndef _WX_HTMLPREP_H_
#define _WX_HTMLPREP_H_
#ifdef __GNUG__
#pragma interface "htmlprep.h"
// (implementation is in htmlwin.cpp, there's no htmlprep.cpp!)
#endif
#include "wx/defs.h"
#if wxUSE_HTML
#include "wx/string.h"
// Priority of preprocessor in the chain. The higher, the earlier it is used
enum
{
wxHTML_PRIORITY_DONTCARE = 128, // if the order doesn't matter, use this
// priority
wxHTML_PRIORITY_SYSTEM = 256 // >=256 is only for wxHTML's internals
};
// Classes derived from this class serve as simple text processors for
// wxHtmlWindow. wxHtmlWindow runs HTML markup through all registered
// processors before displaying it, thus allowing for on-the-fly
// modifications of the markup.
class WXDLLEXPORT wxHtmlProcessor : public wxObject
{
DECLARE_ABSTRACT_CLASS(wxHtmlProcessor)
public:
wxHtmlProcessor() : wxObject() {}
virtual ~wxHtmlProcessor() {}
// Process input text and return processed result
virtual wxString Process(const wxString& text) const = 0;
// Return priority value of this processor. The higher, the sooner
// is the processor applied to the text.
virtual int GetPriority() const { return wxHTML_PRIORITY_DONTCARE; }
};
#endif // wxUSE_HTML
#endif // _WX_HTMLPROC_H_

View File

@@ -27,6 +27,11 @@
#include "wx/filesys.h"
#include "wx/html/htmlfilt.h"
class WXDLLEXPORT wxHtmlProcessor;
class wxHtmlWinModule;
class wxHtmlHistoryArray;
class wxHtmlProcessorList;
//--------------------------------------------------------------------------------
// wxHtmlWindow
@@ -39,28 +44,6 @@
// SetPage(text) or LoadPage(filename).
//--------------------------------------------------------------------------------
// item of history list
class WXDLLEXPORT HtmlHistoryItem : public wxObject
{
public:
HtmlHistoryItem(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;
};
WX_DECLARE_EXPORTED_OBJARRAY(HtmlHistoryItem, HtmlHistoryArray);
class wxHtmlWinModule;
class WXDLLEXPORT wxHtmlWindow : public wxScrolledWindow
{
DECLARE_DYNAMIC_CLASS(wxHtmlWindow)
@@ -148,6 +131,11 @@ public:
// Returns a pointer to the parser.
wxHtmlWinParser *GetParser() const { return m_Parser; }
// Adds HTML processor to this instance of wxHtmlWindow:
void AddProcessor(wxHtmlProcessor *processor);
// Adds HTML processor to wxHtmlWindow class as whole:
static void AddSharedProcessor(wxHtmlProcessor *processor);
protected:
// Scrolls to anchor of this name. (Anchor is #news
// or #features etc. it is part of address sometimes:
@@ -167,63 +155,65 @@ protected:
// Returns new filter (will be stored into m_DefaultFilter variable)
virtual wxHtmlFilter *GetDefaultFilter() {return new wxHtmlFilterPlainText;}
static void CleanUpStatics();
// cleans static variables
static void CleanUpStatics();
protected:
wxHtmlContainerCell *m_Cell;
// This is pointer to the first cell in parsed data.
// (Note: the first cell is usually top one = all other cells are sub-cells of this one)
wxHtmlWinParser *m_Parser;
wxHtmlContainerCell *m_Cell;
// parser which is used to parse HTML input.
// Each wxHtmlWindow has it's own parser because sharing one global
// parser would be problematic (because of reentrancy)
wxString m_OpenedPage;
wxHtmlWinParser *m_Parser;
// contains name of actualy opened page or empty string if no page opened
wxString m_OpenedAnchor;
wxString m_OpenedPage;
// contains name of current anchor within m_OpenedPage
wxString m_OpenedPageTitle;
wxString m_OpenedAnchor;
// contains title of actualy opened page or empty string if no <TITLE> tag
wxFileSystem* m_FS;
wxString m_OpenedPageTitle;
// class for opening files (file system)
wxFileSystem* m_FS;
wxFrame *m_RelatedFrame;
wxString m_TitleFormat;
int m_RelatedStatusBar;
// frame in which page title should be displayed & number of it's statusbar
// reserved for usage with this html window
int m_RelatedStatusBar;
int m_Borders;
// borders (free space between text and window borders)
// defaults to 10 pixels.
int m_Borders;
int m_Style;
private:
bool m_tmpMouseMoved;
// a flag indicated if mouse moved
// (if TRUE we will try to change cursor in last call to OnIdle)
wxHtmlLinkInfo *m_tmpLastLink;
bool m_tmpMouseMoved;
// contains last link name
int m_tmpCanDrawLocks;
wxHtmlLinkInfo *m_tmpLastLink;
// if >0 contents of the window is not redrawn
// (in order to avoid ugly blinking)
int m_tmpCanDrawLocks;
static wxList m_Filters;
// list of HTML filters
static wxHtmlFilter *m_DefaultFilter;
static wxList m_Filters;
// this filter is used when no filter is able to read some file
static wxHtmlFilter *m_DefaultFilter;
static wxCursor *s_cur_hand;
static wxCursor *s_cur_arrow;
HtmlHistoryArray m_History;
int m_HistoryPos;
wxHtmlHistoryArray *m_History;
// browser history
bool m_HistoryOn;
int m_HistoryPos;
// if this FLAG is false, items are not added to history
bool m_HistoryOn;
// html processors array:
wxHtmlProcessorList *m_Processors;
static wxHtmlProcessorList *m_SharedProcessors;
DECLARE_EVENT_TABLE()
};

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,9 +406,9 @@ 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);
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);
@@ -369,9 +433,9 @@ 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);
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);
@@ -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;
}