X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f6bcfd974ef26faf6f91a62cac09827e09463fd1..f9ee64b1356530b7f5c957d250d2a1dcbef60f60:/wxPython/src/html.i diff --git a/wxPython/src/html.i b/wxPython/src/html.i index 17db361382..59e6dc9c33 100644 --- a/wxPython/src/html.i +++ b/wxPython/src/html.i @@ -14,7 +14,7 @@ %module html %{ -#include "helpers.h" +#include "export.h" #include #include #include @@ -40,16 +40,6 @@ %extern utils.i -//--------------------------------------------------------------------------- - -%{ -// #ifdef __WXMSW__ -// wxString wxPyEmptyStr(""); -// wxPoint wxPyDefaultPosition(wxDefaultPosition); -// wxSize wxPyDefaultSize(wxDefaultSize); -// #endif -%} - %pragma(python) code = "import wx" @@ -83,20 +73,44 @@ enum { }; +enum { + wxHW_SCROLLBAR_NEVER, + wxHW_SCROLLBAR_AUTO, +}; + + +// enums for wxHtmlWindow::OnOpeningURL +enum wxHtmlOpeningStatus +{ + wxHTML_OPEN, + wxHTML_BLOCK, + wxHTML_REDIRECT +}; + +enum wxHtmlURLType +{ + wxHTML_URL_PAGE, + wxHTML_URL_IMAGE, + wxHTML_URL_OTHER +}; + //--------------------------------------------------------------------------- -class wxHtmlLinkInfo { +class wxHtmlLinkInfo : public wxObject { public: wxHtmlLinkInfo(const wxString& href, const wxString& target = wxEmptyString); wxString GetHref(); wxString GetTarget(); wxMouseEvent* GetEvent(); wxHtmlCell* GetHtmlCell(); + + void SetEvent(const wxMouseEvent *e); + void SetHtmlCell(const wxHtmlCell * e); }; //--------------------------------------------------------------------------- -class wxHtmlTag { +class wxHtmlTag : public wxObject { public: // Never need to create a new tag from Python... //wxHtmlTag(const wxString& source, int pos, int end_pos, wxHtmlTagsCache* cache); @@ -109,7 +123,6 @@ public: //int ScanParam(const wxString& par, const char *format, void* param); wxString GetAllParams(); - bool IsEnding(); bool HasEnding(); int GetBeginPos(); int GetEndPos1(); @@ -119,7 +132,7 @@ public: //--------------------------------------------------------------------------- -class wxHtmlParser { +class wxHtmlParser : public wxObject { public: // wxHtmlParser(); This is an abstract base class... @@ -135,6 +148,7 @@ public: void PushTagHandler(wxHtmlTagHandler* handler, wxString tags); void PopTagHandler(); + // virtual wxFSFile *OpenURL(wxHtmlURLType type, const wxString& url) const; // void AddText(const char* txt) = 0; // void AddTag(const wxHtmlTag& tag); @@ -145,13 +159,13 @@ public: class wxHtmlWinParser : public wxHtmlParser { public: - wxHtmlWinParser(wxWindow *wnd); + wxHtmlWinParser(wxHtmlWindow *wnd = NULL); void SetDC(wxDC *dc); wxDC* GetDC(); int GetCharHeight(); int GetCharWidth(); - wxWindow* GetWindow(); + wxHtmlWindow* GetWindow(); //void SetFonts(wxString normal_face, wxString fixed_face, int *LIST); %addmethods { void SetFonts(wxString normal_face, wxString fixed_face, PyObject* sizes) { @@ -180,9 +194,9 @@ public: void SetFontFixed(int x); int GetAlign(); void SetAlign(int a); - const wxColour& GetLinkColor(); + wxColour GetLinkColor(); void SetLinkColor(const wxColour& clr); - const wxColour& GetActualColor(); + wxColour GetActualColor(); void SetActualColor(const wxColour& clr); void SetLink(const wxString& link); wxFont* CreateCurrentFont(); @@ -196,6 +210,7 @@ public: %{ class wxPyHtmlTagHandler : public wxHtmlTagHandler { + DECLARE_DYNAMIC_CLASS(wxPyHtmlTagHandler); public: wxPyHtmlTagHandler() : wxHtmlTagHandler() {}; @@ -208,17 +223,19 @@ public: PYPRIVATE; }; +IMPLEMENT_DYNAMIC_CLASS(wxPyHtmlTagHandler, wxHtmlTagHandler); + IMP_PYCALLBACK_STRING__pure(wxPyHtmlTagHandler, wxHtmlTagHandler, GetSupportedTags); IMP_PYCALLBACK_BOOL_TAG_pure(wxPyHtmlTagHandler, wxHtmlTagHandler, HandleTag); %} -%name(wxHtmlTagHandler) class wxPyHtmlTagHandler { +%name(wxHtmlTagHandler) class wxPyHtmlTagHandler : public wxObject { public: wxPyHtmlTagHandler(); - void _setSelf(PyObject* self, PyObject* _class); - %pragma(python) addtomethod = "__init__:self._setSelf(self, wxHtmlTagHandler)" + void _setCallbackInfo(PyObject* self, PyObject* _class); + %pragma(python) addtomethod = "__init__:self._setCallbackInfo(self, wxHtmlTagHandler)" void SetParser(wxHtmlParser *parser); wxHtmlParser* GetParser(); @@ -230,6 +247,7 @@ public: %{ class wxPyHtmlWinTagHandler : public wxHtmlWinTagHandler { + DECLARE_DYNAMIC_CLASS(wxPyHtmlWinTagHandler); public: wxPyHtmlWinTagHandler() : wxHtmlWinTagHandler() {}; @@ -243,6 +261,8 @@ public: PYPRIVATE; }; +IMPLEMENT_DYNAMIC_CLASS( wxPyHtmlWinTagHandler, wxHtmlWinTagHandler); + IMP_PYCALLBACK_STRING__pure(wxPyHtmlWinTagHandler, wxHtmlWinTagHandler, GetSupportedTags); IMP_PYCALLBACK_BOOL_TAG_pure(wxPyHtmlWinTagHandler, wxHtmlWinTagHandler, HandleTag); %} @@ -252,8 +272,8 @@ IMP_PYCALLBACK_BOOL_TAG_pure(wxPyHtmlWinTagHandler, wxHtmlWinTagHandler, HandleT public: wxPyHtmlWinTagHandler(); - void _setSelf(PyObject* self, PyObject* _class); - %pragma(python) addtomethod = "__init__:self._setSelf(self, wxHtmlWinTagHandler)" + void _setCallbackInfo(PyObject* self, PyObject* _class); + %pragma(python) addtomethod = "__init__:self._setCallbackInfo(self, wxHtmlWinTagHandler)" void SetParser(wxHtmlParser *parser); wxHtmlWinParser* GetParser(); @@ -275,23 +295,25 @@ public: } void OnExit() { + wxPyBeginBlockThreads(); Py_DECREF(m_tagHandlerClass); m_tagHandlerClass = NULL; for (size_t x=0; x < m_objArray.GetCount(); x++) { PyObject* obj = (PyObject*)m_objArray.Item(x); Py_DECREF(obj); } + wxPyEndBlockThreads(); }; void FillHandlersTable(wxHtmlWinParser *parser) { // Wave our magic wand... (if it works it's a miracle! ;-) // First, make a new instance of the tag handler - bool doSave = wxPyRestoreThread(); + wxPyBeginBlockThreads(); PyObject* arg = Py_BuildValue("()"); PyObject* obj = PyInstance_New(m_tagHandlerClass, arg, NULL); Py_DECREF(arg); - wxPySaveThread(doSave); + wxPyEndBlockThreads(); // now figure out where it's C++ object is... wxPyHtmlWinTagHandler* thPtr; @@ -326,7 +348,7 @@ private: //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- -class wxHtmlCell { +class wxHtmlCell : public wxObject { public: wxHtmlCell(); @@ -353,6 +375,13 @@ public: }; +class wxHtmlWordCell : public wxHtmlCell +{ +public: + wxHtmlWordCell(const wxString& word, wxDC& dc); +}; + + class wxHtmlContainerCell : public wxHtmlCell { public: wxHtmlContainerCell(wxHtmlContainerCell *parent); @@ -383,6 +412,12 @@ public: }; +class wxHtmlFontCell : public wxHtmlCell +{ +public: + wxHtmlFontCell(wxFont *font); +}; + class wxHtmlWidgetCell : public wxHtmlCell { public: @@ -396,21 +431,9 @@ public: //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- -// item of history list -class HtmlHistoryItem { -public: - HtmlHistoryItem(const char* p, const char* a); - - int GetPos(); - void SetPos(int p); - const wxString& GetPage(); - const wxString& GetAnchor(); -}; - - -//--------------------------------------------------------------------------- %{ class wxPyHtmlWindow : public wxHtmlWindow { + DECLARE_ABSTRACT_CLASS(wxPyHtmlWindow); public: wxPyHtmlWindow(wxWindow *parent, wxWindowID id = -1, const wxPoint& pos = wxDefaultPosition, @@ -418,30 +441,79 @@ public: long style = wxHW_SCROLLBAR_AUTO, const wxString& name = "htmlWindow") : wxHtmlWindow(parent, id, pos, size, style, name) {}; + wxPyHtmlWindow() : wxHtmlWindow() {}; void OnLinkClicked(const wxHtmlLinkInfo& link); void base_OnLinkClicked(const wxHtmlLinkInfo& link); + wxHtmlOpeningStatus OnOpeningURL(wxHtmlURLType type, + const wxString& url, + wxString *redirect) const; + DEC_PYCALLBACK__STRING(OnSetTitle); + DEC_PYCALLBACK__CELLINTINT(OnCellMouseHover); + DEC_PYCALLBACK__CELLINTINTME(OnCellClicked); +// DEC_PYCALLBACK_BOOL_STRING(OnOpeningURL); PYPRIVATE; }; - +IMPLEMENT_ABSTRACT_CLASS( wxPyHtmlWindow, wxHtmlWindow ); IMP_PYCALLBACK__STRING(wxPyHtmlWindow, wxHtmlWindow, OnSetTitle); - - void wxPyHtmlWindow::OnLinkClicked(const wxHtmlLinkInfo& link) { - bool doSave = wxPyRestoreThread(); - if (m_myInst.findCallback("OnLinkClicked")) { - PyObject* obj = wxPyConstructObject((void*)&link, "wxHtmlLinkInfo"); - m_myInst.callCallback(Py_BuildValue("(O)", obj)); +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) { + bool found; + wxPyBeginBlockThreads(); + if ((found = wxPyCBH_findCallback(m_myInst, "OnLinkClicked"))) { + PyObject* obj = wxPyConstructObject((void*)&link, "wxHtmlLinkInfo", 0); + wxPyCBH_callCallback(m_myInst, Py_BuildValue("(O)", obj)); + Py_DECREF(obj); } - else + wxPyEndBlockThreads(); + if (! found) wxHtmlWindow::OnLinkClicked(link); - wxPySaveThread(doSave); } void wxPyHtmlWindow::base_OnLinkClicked(const wxHtmlLinkInfo& link) { wxHtmlWindow::OnLinkClicked(link); } + + +wxHtmlOpeningStatus wxPyHtmlWindow::OnOpeningURL(wxHtmlURLType type, + const wxString& url, + wxString *redirect) const { + bool found; + wxHtmlOpeningStatus rval; + wxPyBeginBlockThreads(); + if ((found = wxPyCBH_findCallback(m_myInst, "OnOpeningURL"))) { + PyObject* ro; + ro = wxPyCBH_callCallbackObj(m_myInst, Py_BuildValue("(is)", type, url.c_str())); + if (PyString_Check(ro) +#if PYTHON_API_VERSION >= 1009 + || PyUnicode_Check(ro) +#endif + ) { + PyObject* str = PyObject_Str(ro); + *redirect = PyString_AsString(str); + Py_DECREF(str); + rval = wxHTML_REDIRECT; + } + else { + PyObject* num = PyNumber_Int(ro); + rval = (wxHtmlOpeningStatus)PyInt_AsLong(num); + Py_DECREF(num); + } + Py_DECREF(ro); + } + wxPyEndBlockThreads(); + if (! found) + rval = wxHtmlWindow::OnOpeningURL(type, url, redirect); + return rval; +} + + %} @@ -449,20 +521,31 @@ void wxPyHtmlWindow::base_OnLinkClicked(const wxHtmlLinkInfo& link) { %name(wxHtmlWindow) class wxPyHtmlWindow : public wxScrolledWindow { public: wxPyHtmlWindow(wxWindow *parent, int id = -1, - wxPoint& pos = wxPyDefaultPosition, - wxSize& size = wxPyDefaultSize, + wxPoint& pos = wxDefaultPosition, + wxSize& size = wxDefaultSize, int flags=wxHW_SCROLLBAR_AUTO, char* name = "htmlWindow"); + %name(wxPreHtmlWindow)wxPyHtmlWindow(); + + bool Create(wxWindow *parent, int id = -1, + wxPoint& pos = wxDefaultPosition, + wxSize& size = wxDefaultSize, + int flags=wxHW_SCROLLBAR_AUTO, + char* name = "htmlWindow"); - void _setSelf(PyObject* self, PyObject* _class); - %pragma(python) addtomethod = "__init__:self._setSelf(self, wxHtmlWindow)" - %pragma(python) addtomethod = "__init__:#wx._StdWindowCallbacks(self)" - %pragma(python) addtomethod = "__init__:#wx._StdOnScrollCallbacks(self)" + void _setCallbackInfo(PyObject* self, PyObject* _class); + %pragma(python) addtomethod = "__init__:self._setCallbackInfo(self, wxHtmlWindow)" + %pragma(python) addtomethod = "__init__:self._setOORInfo(self)" + %pragma(python) addtomethod = "wxPreHtmlWindow:val._setOORInfo(val)" - bool SetPage(const char* source); - bool LoadPage(const char* location); + bool SetPage(const wxString& source); + bool LoadPage(const wxString& location); + bool AppendToPage(const wxString& source); wxString GetOpenedPage(); + wxString GetOpenedAnchor(); + wxString GetOpenedPageTitle(); + void SetRelatedFrame(wxFrame* frame, const char* format); wxFrame* GetRelatedFrame(); void SetRelatedStatusBar(int bar); @@ -478,18 +561,24 @@ public: } } - void SetTitle(const char* title); + void SetTitle(const wxString& title); void SetBorders(int b); - void ReadCustomization(wxConfigBase *cfg, char* path = ""); - void WriteCustomization(wxConfigBase *cfg, char* path = ""); + void ReadCustomization(wxConfigBase *cfg, wxString path = wxEmptyString); + void WriteCustomization(wxConfigBase *cfg, wxString path = wxEmptyString); bool HistoryBack(); bool HistoryForward(); + bool HistoryCanBack(); + bool HistoryCanForward(); void HistoryClear(); wxHtmlContainerCell* GetInternalRepresentation(); wxHtmlWinParser* GetParser(); void base_OnLinkClicked(const wxHtmlLinkInfo& link); void base_OnSetTitle(const char* title); + void base_OnCellMouseHover(wxHtmlCell *cell, wxCoord x, wxCoord y); + void base_OnCellClicked(wxHtmlCell *cell, + wxCoord x, wxCoord y, + const wxMouseEvent& event); }; // Static methods are mapped to stand-alone functions @@ -504,7 +593,7 @@ public: //--------------------------------------------------------------------------- -class wxHtmlDCRenderer { +class wxHtmlDCRenderer : public wxObject { public: wxHtmlDCRenderer(); ~wxHtmlDCRenderer(); @@ -530,7 +619,7 @@ enum { class wxHtmlPrintout : public wxPyPrintout { public: wxHtmlPrintout(const char* title = "Printout"); - ~wxHtmlPrintout(); + //~wxHtmlPrintout(); wxPrintPreview object takes ownership... void SetHtmlText(const wxString& html, const wxString &basepath = wxEmptyString, @@ -545,7 +634,7 @@ public: -class wxHtmlEasyPrinting { +class wxHtmlEasyPrinting : public wxObject { public: wxHtmlEasyPrinting(const char* name = "Printing", wxFrame *parent_frame = NULL); @@ -582,13 +671,9 @@ public: wxClassInfo::CleanUpClasses(); wxClassInfo::InitializeClasses(); - // Until wxFileSystem is wrapped... - #if wxUSE_FS_ZIP - wxFileSystem::AddHandler(new wxZipFSHandler); - #endif - #if wxUSE_FS_INET -// wxFileSystem::AddHandler(new wxInternetFSHandler); - #endif + wxPyPtrTypeMap_Add("wxHtmlTagHandler", "wxPyHtmlTagHandler"); + wxPyPtrTypeMap_Add("wxHtmlWinTagHandler", "wxPyHtmlWinTagHandler"); + wxPyPtrTypeMap_Add("wxHtmlWindow", "wxPyHtmlWindow"); %} //---------------------------------------------------------------------- @@ -598,4 +683,3 @@ public: %pragma(python) include="_htmlextras.py"; //--------------------------------------------------------------------------- -