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"); %} //----------------------------------------------------------------------