Added wxHtmlFilter

Also some minor tweaks and additions


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_2_4_BRANCH@17422 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robin Dunn
2002-10-02 00:24:38 +00:00
parent 8d5e66bc14
commit 970a937c34
6 changed files with 180 additions and 19 deletions

View File

@@ -2,8 +2,21 @@ CHANGES.txt for wxPython
---------------------------------------------------------------------- ----------------------------------------------------------------------
2.3.3 2.3.3.2
----- -------
Updated XRCed and wxTimeCtrl contribs.
Show a couple new wxGrid features in the demo.
Several bug fixes in wxWindows.
Added wxHtmlFilter.
2.3.3.1
-------
Added wxSplashScreen. Added wxSplashScreen.
Added wxGenericDirCtrl. Added wxGenericDirCtrl.

View File

@@ -43,6 +43,23 @@ class MyHtmlWindow(wxHtmlWindow):
self.base_OnCellClicked(cell, x, y, evt) self.base_OnCellClicked(cell, x, y, evt)
# This filter doesn't really do anything but show how to use filters
class MyHtmlFilter(wxHtmlFilter):
def __init__(self, log):
wxHtmlFilter.__init__(self)
self.log = log
# This method decides if this filter is able to read the file
def CanRead(self, fsfile):
self.log.write("CanRead: %s\n" % fsfile.GetMimeType())
return FALSE
# If CanRead returns true then this method is called to actually
# read the file and return the contents.
def ReadFile(self, fsfile):
return ""
class TestHtmlPanel(wxPanel): class TestHtmlPanel(wxPanel):
def __init__(self, parent, frame, log): def __init__(self, parent, frame, log):
wxPanel.__init__(self, parent, -1, style=wxNO_FULL_REPAINT_ON_RESIZE) wxPanel.__init__(self, parent, -1, style=wxNO_FULL_REPAINT_ON_RESIZE)
@@ -52,6 +69,8 @@ class TestHtmlPanel(wxPanel):
if not self.cwd: if not self.cwd:
self.cwd = os.getcwd() self.cwd = os.getcwd()
wxHtmlWindow_AddFilter(MyHtmlFilter(log))
self.html = MyHtmlWindow(self, -1, log) self.html = MyHtmlWindow(self, -1, log)
self.html.SetRelatedFrame(frame, "wxPython: (A Demonstration) -- %s") self.html.SetRelatedFrame(frame, "wxPython: (A Demonstration) -- %s")
self.html.SetRelatedStatusBar(0) self.html.SetRelatedStatusBar(0)
@@ -168,15 +187,27 @@ def runTest(frame, nb, log):
overview = """\ overview = """<html><body>
wxHtmlWindow is capable of parsing and rendering most simple HTML tags. <h2>wxHtmlWindow</h2>
It is not intended to be a high-end HTML browser. If you're looking for something like that try http://www.mozilla.org - there's a chance you'll be able to make their widget wxWindows-compatible. I'm sure everyone will enjoy your work in that case... <p>wxHtmlWindow is capable of parsing and rendering most
simple HTML tags.
<p>It is not intended to be a high-end HTML browser. If you're
looking for something like that try http://www.mozilla.org - there's a
chance you'll be able to make their widget wxWindows-compatible. I'm
sure everyone will enjoy your work in that case...
</body></html>
""" """
if __name__ == '__main__':
import sys,os
import run
run.main(['', os.path.basename(sys.argv[0])])

View File

@@ -322,11 +322,11 @@ elif os.name == 'posix' and sys.platform[:6] == "darwin":
elif os.name == 'posix': elif os.name == 'posix':
# Set flags for Unix type platforms # Set flags for other Unix type platforms
WXDIR = '..' # assumes IN_CVS_TREE WXDIR = '..' # assumes IN_CVS_TREE
WXPLAT = '__WXGTK__' # and assumes GTK... WXPLAT = '__WXGTK__' # and assumes GTK...
GENDIR = 'gtk' # Need to allow for Motif eventually too GENDIR = 'gtk' # Need to allow for X11 and/or Motif eventually too
includes = ['src'] includes = ['src']
defines = [('SWIG_GLOBAL', None), defines = [('SWIG_GLOBAL', None),
@@ -357,7 +357,9 @@ else:
# Check if the version file needs updated # Check if the version file needs updated
#---------------------------------------------------------------------- #----------------------------------------------------------------------
#if IN_CVS_TREE and newer('setup.py', 'src/__version__.py'): # Always do it since the version string can change based on the UNICODE flag
##if IN_CVS_TREE and newer('setup.py', 'src/__version__.py'):
open('src/__version__.py', 'w').write("ver = '%s'\n" % VERSION) open('src/__version__.py', 'w').write("ver = '%s'\n" % VERSION)

View File

@@ -11,4 +11,5 @@ wx.wxHtmlContainerCellPtr = wxHtmlContainerCellPtr
wx.wxHtmlWidgetCellPtr = wxHtmlWidgetCellPtr wx.wxHtmlWidgetCellPtr = wxHtmlWidgetCellPtr
wx.wxHtmlWindowPtr = wxHtmlWindowPtr wx.wxHtmlWindowPtr = wxHtmlWindowPtr
wx.wxHtmlLinkInfoPtr = wxHtmlLinkInfoPtr wx.wxHtmlLinkInfoPtr = wxHtmlLinkInfoPtr
wx.wxHtmlFilterPtr = wxHtmlFilterPtr

View File

@@ -700,6 +700,14 @@ public:
'''get the currently focused item or -1 if none''' '''get the currently focused item or -1 if none'''
return self.GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_FOCUSED) return self.GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_FOCUSED)
def GetFirstSelected(self, item):
'''return first selected item, or -1 when none'''
return self.GetNextSelected(-1)
def GetNextSelected(self, item):
'''return subsequent selected items, or -1 when no more'''
return self.GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED)
def IsSelected(self, idx): def IsSelected(self, idx):
'''return TRUE if the item is selected''' '''return TRUE if the item is selected'''
return self.GetItemState(idx, wxLIST_STATE_SELECTED) != 0 return self.GetItemState(idx, wxLIST_STATE_SELECTED) != 0

View File

@@ -21,6 +21,7 @@
#include <wx/fs_zip.h> #include <wx/fs_zip.h>
#include <wx/fs_inet.h> #include <wx/fs_inet.h>
#include <wx/wfstream.h> #include <wx/wfstream.h>
#include <wx/filesys.h>
#include "printfw.h" #include "printfw.h"
%} %}
@@ -37,8 +38,10 @@
%extern controls.i %extern controls.i
%extern controls2.i %extern controls2.i
%extern printfw.i %extern printfw.i
%extern utils.i %extern utils.i
%extern filesys.i
%extern streams.i
%pragma(python) code = "import wx" %pragma(python) code = "import wx"
@@ -442,9 +445,73 @@ public:
}; };
//---------------------------------------------------------------------------
// wxHtmlFilter
//---------------------------------------------------------------------------
%{ // here's the C++ version
class wxPyHtmlFilter : public wxHtmlFilter {
DECLARE_ABSTRACT_CLASS(wxPyHtmlFilter);
public:
wxPyHtmlFilter() : wxHtmlFilter() {}
// returns TRUE if this filter is able to open&read given file
virtual bool CanRead(const wxFSFile& file) const {
bool rval = FALSE;
bool found;
wxPyBeginBlockThreads();
if ((found = wxPyCBH_findCallback(m_myInst, "CanRead"))) {
PyObject* obj = wxPyMake_wxObject((wxFSFile*)&file); // cast away const
rval = wxPyCBH_callCallback(m_myInst, Py_BuildValue("(O)", obj));
Py_DECREF(obj);
}
wxPyEndBlockThreads();
return rval;
}
// Reads given file and returns HTML document.
// Returns empty string if opening failed
virtual wxString ReadFile(const wxFSFile& file) const {
wxString rval;
bool found;
wxPyBeginBlockThreads();
if ((found = wxPyCBH_findCallback(m_myInst, "ReadFile"))) {
PyObject* obj = wxPyMake_wxObject((wxFSFile*)&file); // cast away const
PyObject* ro;
ro = wxPyCBH_callCallbackObj(m_myInst, Py_BuildValue("(O)", obj));
Py_DECREF(obj);
if (ro) {
rval = Py2wxString(ro);
Py_DECREF(ro);
}
}
wxPyEndBlockThreads();
return rval;
}
PYPRIVATE;
};
IMPLEMENT_ABSTRACT_CLASS(wxPyHtmlFilter, wxHtmlFilter);
%}
// And now the version seen by SWIG
%name(wxHtmlFilter) class wxPyHtmlFilter : wxObject {
public:
wxPyHtmlFilter();
void _setCallbackInfo(PyObject* self, PyObject* _class);
%pragma(python) addtomethod = "__init__:self._setCallbackInfo(self, wxHtmlFilter)"
};
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
//--------------------------------------------------------------------------- // wxHtmlWindow
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
%{ %{
@@ -478,7 +545,6 @@ public:
DEC_PYCALLBACK__STRING(OnSetTitle); DEC_PYCALLBACK__STRING(OnSetTitle);
DEC_PYCALLBACK__CELLINTINT(OnCellMouseHover); DEC_PYCALLBACK__CELLINTINT(OnCellMouseHover);
DEC_PYCALLBACK__CELLINTINTME(OnCellClicked); DEC_PYCALLBACK__CELLINTINTME(OnCellClicked);
// DEC_PYCALLBACK_BOOL_STRING(OnOpeningURL);
PYPRIVATE; PYPRIVATE;
}; };
@@ -486,7 +552,6 @@ IMPLEMENT_ABSTRACT_CLASS( wxPyHtmlWindow, wxHtmlWindow );
IMP_PYCALLBACK__STRING(wxPyHtmlWindow, wxHtmlWindow, OnSetTitle); IMP_PYCALLBACK__STRING(wxPyHtmlWindow, wxHtmlWindow, OnSetTitle);
IMP_PYCALLBACK__CELLINTINT(wxPyHtmlWindow, wxHtmlWindow, OnCellMouseHover); IMP_PYCALLBACK__CELLINTINT(wxPyHtmlWindow, wxHtmlWindow, OnCellMouseHover);
IMP_PYCALLBACK__CELLINTINTME(wxPyHtmlWindow, wxHtmlWindow, OnCellClicked); IMP_PYCALLBACK__CELLINTINTME(wxPyHtmlWindow, wxHtmlWindow, OnCellClicked);
// IMP_PYCALLBACK_BOOL_STRING(wxPyHtmlWindow, wxHtmlWindow, OnOpeningURL);
void wxPyHtmlWindow::OnLinkClicked(const wxHtmlLinkInfo& link) { void wxPyHtmlWindow::OnLinkClicked(const wxHtmlLinkInfo& link) {
@@ -564,18 +629,45 @@ public:
%pragma(python) addtomethod = "__init__:self._setOORInfo(self)" %pragma(python) addtomethod = "__init__:self._setOORInfo(self)"
%pragma(python) addtomethod = "wxPreHtmlWindow:val._setOORInfo(val)" %pragma(python) addtomethod = "wxPreHtmlWindow:val._setOORInfo(val)"
// Set HTML page and display it. !! source is HTML document itself,
// it is NOT address/filename of HTML document. If you want to
// specify document location, use LoadPage() istead
// Return value : FALSE if an error occured, TRUE otherwise
bool SetPage(const wxString& source); bool SetPage(const wxString& source);
// Load HTML page from given location. Location can be either
// a) /usr/wxGTK2/docs/html/wx.htm
// b) http://www.somewhere.uk/document.htm
// c) ftp://ftp.somesite.cz/pub/something.htm
// In case there is no prefix (http:,ftp:), the method
// will try to find it itself (1. local file, then http or ftp)
// After the page is loaded, the method calls SetPage() to display it.
// Note : you can also use path relative to previously loaded page
// Return value : same as SetPage
bool LoadPage(const wxString& location); bool LoadPage(const wxString& location);
// Append to current page
bool AppendToPage(const wxString& source); bool AppendToPage(const wxString& source);
// Returns full location of opened page
wxString GetOpenedPage(); wxString GetOpenedPage();
// Returns anchor within opened page
wxString GetOpenedAnchor(); wxString GetOpenedAnchor();
// Returns <TITLE> of opened page or empty string otherwise
wxString GetOpenedPageTitle(); wxString GetOpenedPageTitle();
// Sets frame in which page title will be displayed. Format is format of
// frame title, e.g. "HtmlHelp : %s". It must contain exactly one %s
void SetRelatedFrame(wxFrame* frame, const wxString& format); void SetRelatedFrame(wxFrame* frame, const wxString& format);
wxFrame* GetRelatedFrame(); wxFrame* GetRelatedFrame();
// After(!) calling SetRelatedFrame, this sets statusbar slot where messages
// will be displayed. Default is -1 = no messages.
void SetRelatedStatusBar(int bar); void SetRelatedStatusBar(int bar);
//void SetFonts(wxString normal_face, wxString fixed_face, int *LIST); // Sets fonts to be used when displaying HTML page.
%addmethods { %addmethods {
void SetFonts(wxString normal_face, wxString fixed_face, PyObject* sizes) { void SetFonts(wxString normal_face, wxString fixed_face, PyObject* sizes) {
int* temp = int_LIST_helper(sizes); int* temp = int_LIST_helper(sizes);
@@ -587,20 +679,39 @@ public:
} }
void SetTitle(const wxString& title); void SetTitle(const wxString& title);
// Sets space between text and window borders.
void SetBorders(int b); void SetBorders(int b);
// Saves custom settings into cfg config. it will use the path 'path'
// if given, otherwise it will save info into currently selected path.
// saved values : things set by SetFonts, SetBorders.
void ReadCustomization(wxConfigBase *cfg, wxString path = wxPyEmptyString); void ReadCustomization(wxConfigBase *cfg, wxString path = wxPyEmptyString);
void WriteCustomization(wxConfigBase *cfg, wxString path = wxPyEmptyString); void WriteCustomization(wxConfigBase *cfg, wxString path = wxPyEmptyString);
// Goes to previous/next page (in browsing history)
// Returns TRUE if successful, FALSE otherwise
bool HistoryBack(); bool HistoryBack();
bool HistoryForward(); bool HistoryForward();
bool HistoryCanBack(); bool HistoryCanBack();
bool HistoryCanForward(); bool HistoryCanForward();
// Resets History
void HistoryClear(); void HistoryClear();
// Returns pointer to conteiners/cells structure.
wxHtmlContainerCell* GetInternalRepresentation(); wxHtmlContainerCell* GetInternalRepresentation();
// Returns a pointer to the parser.
wxHtmlWinParser* GetParser(); wxHtmlWinParser* GetParser();
bool ScrollToAnchor(const wxString& anchor); bool ScrollToAnchor(const wxString& anchor);
bool HasAnchor(const wxString& anchor); bool HasAnchor(const wxString& anchor);
//Adds input filter
static void AddFilter(wxPyHtmlFilter *filter);
void base_OnLinkClicked(const wxHtmlLinkInfo& link); void base_OnLinkClicked(const wxHtmlLinkInfo& link);
void base_OnSetTitle(const wxString& title); void base_OnSetTitle(const wxString& title);
void base_OnCellMouseHover(wxHtmlCell *cell, wxCoord x, wxCoord y); void base_OnCellMouseHover(wxHtmlCell *cell, wxCoord x, wxCoord y);
@@ -609,12 +720,6 @@ public:
const wxMouseEvent& event); const wxMouseEvent& event);
}; };
// Static methods are mapped to stand-alone functions
%inline %{
void wxHtmlWindow_AddFilter(wxHtmlFilter *filter) {
wxHtmlWindow::AddFilter(filter);
}
%}
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
@@ -702,6 +807,7 @@ public:
wxPyPtrTypeMap_Add("wxHtmlTagHandler", "wxPyHtmlTagHandler"); wxPyPtrTypeMap_Add("wxHtmlTagHandler", "wxPyHtmlTagHandler");
wxPyPtrTypeMap_Add("wxHtmlWinTagHandler", "wxPyHtmlWinTagHandler"); wxPyPtrTypeMap_Add("wxHtmlWinTagHandler", "wxPyHtmlWinTagHandler");
wxPyPtrTypeMap_Add("wxHtmlWindow", "wxPyHtmlWindow"); wxPyPtrTypeMap_Add("wxHtmlWindow", "wxPyHtmlWindow");
wxPyPtrTypeMap_Add("wxHtmlFilter", "wxPyHtmlFilter");
%} %}
//---------------------------------------------------------------------- //----------------------------------------------------------------------