diff --git a/wxPython/CHANGES.txt b/wxPython/CHANGES.txt
index d48e6a7950..d6767d3b4e 100644
--- a/wxPython/CHANGES.txt
+++ b/wxPython/CHANGES.txt
@@ -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 wxGenericDirCtrl.
diff --git a/wxPython/demo/wxHtmlWindow.py b/wxPython/demo/wxHtmlWindow.py
index 5692a76b0b..621c3959c8 100644
--- a/wxPython/demo/wxHtmlWindow.py
+++ b/wxPython/demo/wxHtmlWindow.py
@@ -43,6 +43,23 @@ class MyHtmlWindow(wxHtmlWindow):
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):
def __init__(self, parent, frame, log):
wxPanel.__init__(self, parent, -1, style=wxNO_FULL_REPAINT_ON_RESIZE)
@@ -52,6 +69,8 @@ class TestHtmlPanel(wxPanel):
if not self.cwd:
self.cwd = os.getcwd()
+ wxHtmlWindow_AddFilter(MyHtmlFilter(log))
+
self.html = MyHtmlWindow(self, -1, log)
self.html.SetRelatedFrame(frame, "wxPython: (A Demonstration) -- %s")
self.html.SetRelatedStatusBar(0)
@@ -168,15 +187,27 @@ def runTest(frame, nb, log):
-overview = """\
-wxHtmlWindow is capable of parsing and rendering most simple HTML tags.
+overview = """
+wxHtmlWindow
-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...
+wxHtmlWindow is capable of parsing and rendering most
+simple HTML tags.
+
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...
+
+
"""
+if __name__ == '__main__':
+ import sys,os
+ import run
+ run.main(['', os.path.basename(sys.argv[0])])
+
diff --git a/wxPython/setup.py b/wxPython/setup.py
index 47778ff0e9..efcf300f04 100755
--- a/wxPython/setup.py
+++ b/wxPython/setup.py
@@ -322,11 +322,11 @@ elif os.name == 'posix' and sys.platform[:6] == "darwin":
elif os.name == 'posix':
- # Set flags for Unix type platforms
+ # Set flags for other Unix type platforms
WXDIR = '..' # assumes IN_CVS_TREE
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']
defines = [('SWIG_GLOBAL', None),
@@ -357,7 +357,9 @@ else:
# 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)
diff --git a/wxPython/src/_htmlextras.py b/wxPython/src/_htmlextras.py
index 88f8b12ba6..c538da3162 100644
--- a/wxPython/src/_htmlextras.py
+++ b/wxPython/src/_htmlextras.py
@@ -11,4 +11,5 @@ wx.wxHtmlContainerCellPtr = wxHtmlContainerCellPtr
wx.wxHtmlWidgetCellPtr = wxHtmlWidgetCellPtr
wx.wxHtmlWindowPtr = wxHtmlWindowPtr
wx.wxHtmlLinkInfoPtr = wxHtmlLinkInfoPtr
+wx.wxHtmlFilterPtr = wxHtmlFilterPtr
diff --git a/wxPython/src/controls2.i b/wxPython/src/controls2.i
index 194a5ddb68..0921bfb962 100644
--- a/wxPython/src/controls2.i
+++ b/wxPython/src/controls2.i
@@ -700,6 +700,14 @@ public:
'''get the currently focused item or -1 if none'''
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):
'''return TRUE if the item is selected'''
return self.GetItemState(idx, wxLIST_STATE_SELECTED) != 0
diff --git a/wxPython/src/html.i b/wxPython/src/html.i
index 9d757ed813..2ed6aa0b47 100644
--- a/wxPython/src/html.i
+++ b/wxPython/src/html.i
@@ -21,6 +21,7 @@
#include
#include
#include
+#include
#include "printfw.h"
%}
@@ -37,8 +38,10 @@
%extern controls.i
%extern controls2.i
%extern printfw.i
-
%extern utils.i
+%extern filesys.i
+%extern streams.i
+
%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__CELLINTINT(OnCellMouseHover);
DEC_PYCALLBACK__CELLINTINTME(OnCellClicked);
-// DEC_PYCALLBACK_BOOL_STRING(OnOpeningURL);
PYPRIVATE;
};
@@ -486,7 +552,6 @@ IMPLEMENT_ABSTRACT_CLASS( wxPyHtmlWindow, wxHtmlWindow );
IMP_PYCALLBACK__STRING(wxPyHtmlWindow, wxHtmlWindow, OnSetTitle);
IMP_PYCALLBACK__CELLINTINT(wxPyHtmlWindow, wxHtmlWindow, OnCellMouseHover);
IMP_PYCALLBACK__CELLINTINTME(wxPyHtmlWindow, wxHtmlWindow, OnCellClicked);
-// IMP_PYCALLBACK_BOOL_STRING(wxPyHtmlWindow, wxHtmlWindow, OnOpeningURL);
void wxPyHtmlWindow::OnLinkClicked(const wxHtmlLinkInfo& link) {
@@ -564,18 +629,45 @@ public:
%pragma(python) addtomethod = "__init__:self._setOORInfo(self)"
%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);
+
+ // 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);
+
+ // Append to current page
bool AppendToPage(const wxString& source);
+
+ // Returns full location of opened page
wxString GetOpenedPage();
+
+ // Returns anchor within opened page
wxString GetOpenedAnchor();
+
+ // Returns of opened page or empty string otherwise
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);
wxFrame* GetRelatedFrame();
+
+ // After(!) calling SetRelatedFrame, this sets statusbar slot where messages
+ // will be displayed. Default is -1 = no messages.
void SetRelatedStatusBar(int bar);
- //void SetFonts(wxString normal_face, wxString fixed_face, int *LIST);
+ // Sets fonts to be used when displaying HTML page.
%addmethods {
void SetFonts(wxString normal_face, wxString fixed_face, PyObject* sizes) {
int* temp = int_LIST_helper(sizes);
@@ -587,20 +679,39 @@ public:
}
void SetTitle(const wxString& title);
+
+ // Sets space between text and window borders.
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 WriteCustomization(wxConfigBase *cfg, wxString path = wxPyEmptyString);
+
+ // Goes to previous/next page (in browsing history)
+ // Returns TRUE if successful, FALSE otherwise
bool HistoryBack();
bool HistoryForward();
bool HistoryCanBack();
bool HistoryCanForward();
+
+ // Resets History
void HistoryClear();
+
+ // Returns pointer to conteiners/cells structure.
wxHtmlContainerCell* GetInternalRepresentation();
+
+ // Returns a pointer to the parser.
wxHtmlWinParser* GetParser();
bool ScrollToAnchor(const wxString& anchor);
bool HasAnchor(const wxString& anchor);
+ //Adds input filter
+ static void AddFilter(wxPyHtmlFilter *filter);
+
+
void base_OnLinkClicked(const wxHtmlLinkInfo& link);
void base_OnSetTitle(const wxString& title);
void base_OnCellMouseHover(wxHtmlCell *cell, wxCoord x, wxCoord y);
@@ -609,12 +720,6 @@ public:
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("wxHtmlWinTagHandler", "wxPyHtmlWinTagHandler");
wxPyPtrTypeMap_Add("wxHtmlWindow", "wxPyHtmlWindow");
+ wxPyPtrTypeMap_Add("wxHtmlFilter", "wxPyHtmlFilter");
%}
//----------------------------------------------------------------------