X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/3a0958b1657f6105b1efcf04032070143b87af80..4e1c35f810f574af79e649fa37171dfa7fc775ee:/wxPython/src/html.i?ds=inline diff --git a/wxPython/src/html.i b/wxPython/src/html.i index cd25bc6dd7..9fc0835024 100644 --- a/wxPython/src/html.i +++ b/wxPython/src/html.i @@ -43,6 +43,22 @@ %pragma(python) code = "import wx" +//---------------------------------------------------------------------- + +%{ + // Put some wx default wxChar* values into wxStrings. + static const wxChar* wxHtmlWindowNameStr = wxT("htmlWindow"); + DECLARE_DEF_STRING(HtmlWindowNameStr); + + static const wxChar* wxHtmlPrintoutTitleStr = wxT("Printout"); + DECLARE_DEF_STRING(HtmlPrintoutTitleStr); + + static const wxChar* wxHtmlPrintingTitleStr = wxT("Printing"); + DECLARE_DEF_STRING(HtmlPrintingTitleStr); + + static const wxString wxPyEmptyString(wxT("")); +%} + //--------------------------------------------------------------------------- enum { @@ -73,11 +89,32 @@ 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 : public wxObject { public: - wxHtmlLinkInfo(const wxString& href, const wxString& target = wxEmptyString); + wxHtmlLinkInfo(const wxString& href, const wxString& target = wxPyEmptyString); wxString GetHref(); wxString GetTarget(); wxMouseEvent* GetEvent(); @@ -127,6 +164,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); @@ -137,13 +175,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) { @@ -172,9 +210,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(); @@ -212,8 +250,8 @@ IMP_PYCALLBACK_BOOL_TAG_pure(wxPyHtmlTagHandler, wxHtmlTagHandler, HandleTag); 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(); @@ -250,8 +288,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(); @@ -273,25 +311,25 @@ public: } void OnExit() { - bool doSave = wxPyRestoreThread(); + 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); } - wxPySaveThread(doSave); + 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; @@ -411,6 +449,7 @@ public: %{ class wxPyHtmlWindow : public wxHtmlWindow { + DECLARE_ABSTRACT_CLASS(wxPyHtmlWindow); public: wxPyHtmlWindow(wxWindow *parent, wxWindowID id = -1, const wxPoint& pos = wxDefaultPosition, @@ -418,31 +457,86 @@ public: long style = wxHW_SCROLLBAR_AUTO, const wxString& name = "htmlWindow") : wxHtmlWindow(parent, id, pos, size, style, name) {}; + wxPyHtmlWindow() : wxHtmlWindow() {}; + + bool ScrollToAnchor(const wxString& anchor) { + return wxHtmlWindow::ScrollToAnchor(anchor); + } + + bool HasAnchor(const wxString& anchor) { + const wxHtmlCell *c = m_Cell->Find(wxHTML_COND_ISANCHOR, &anchor); + return c!=NULL; + } 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); +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 doSave = wxPyRestoreThread(); - if (wxPyCBH_findCallback(m_myInst, "OnLinkClicked")) { + 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("(iO)", type, wx2PyString(url))); + if (PyString_Check(ro) +#if PYTHON_API_VERSION >= 1009 + || PyUnicode_Check(ro) +#endif + ) { + *redirect = Py2wxString(ro); + 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; +} + + %} @@ -452,22 +546,30 @@ public: wxPyHtmlWindow(wxWindow *parent, int id = -1, wxPoint& pos = wxDefaultPosition, wxSize& size = wxDefaultSize, - int flags=wxHW_SCROLLBAR_AUTO, - char* name = "htmlWindow"); + int style=wxHW_SCROLLBAR_AUTO, + const wxString& name = wxPyHtmlWindowNameStr); + %name(wxPreHtmlWindow)wxPyHtmlWindow(); - 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)" + bool Create(wxWindow *parent, int id = -1, + wxPoint& pos = wxDefaultPosition, + wxSize& size = wxDefaultSize, + int style=wxHW_SCROLLBAR_AUTO, + const wxString& name = wxPyHtmlWindowNameStr); + 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 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); + void SetRelatedFrame(wxFrame* frame, const wxString& format); wxFrame* GetRelatedFrame(); void SetRelatedStatusBar(int bar); @@ -484,8 +586,8 @@ public: void SetTitle(const wxString& title); void SetBorders(int b); - void ReadCustomization(wxConfigBase *cfg, wxString path = wxEmptyString); - void WriteCustomization(wxConfigBase *cfg, wxString path = wxEmptyString); + void ReadCustomization(wxConfigBase *cfg, wxString path = wxPyEmptyString); + void WriteCustomization(wxConfigBase *cfg, wxString path = wxPyEmptyString); bool HistoryBack(); bool HistoryForward(); bool HistoryCanBack(); @@ -494,8 +596,15 @@ public: wxHtmlContainerCell* GetInternalRepresentation(); wxHtmlWinParser* GetParser(); + bool ScrollToAnchor(const wxString& anchor); + bool HasAnchor(const wxString& anchor); + void base_OnLinkClicked(const wxHtmlLinkInfo& link); - void base_OnSetTitle(const char* title); + void base_OnSetTitle(const wxString& 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 @@ -518,7 +627,7 @@ public: void SetDC(wxDC *dc, int maxwidth); void SetSize(int width, int height); void SetHtmlText(const wxString& html, - const wxString& basepath = wxEmptyString, + const wxString& basepath = wxPyEmptyString, bool isdir = TRUE); int Render(int x, int y, int from = 0, int dont_render = FALSE); int GetTotalHeight(); @@ -535,11 +644,11 @@ enum { class wxHtmlPrintout : public wxPyPrintout { public: - wxHtmlPrintout(const char* title = "Printout"); + wxHtmlPrintout(const wxString& title = wxPyHtmlPrintoutTitleStr); //~wxHtmlPrintout(); wxPrintPreview object takes ownership... void SetHtmlText(const wxString& html, - const wxString &basepath = wxEmptyString, + const wxString &basepath = wxPyEmptyString, bool isdir = TRUE); void SetHtmlFile(const wxString &htmlfile); void SetHeader(const wxString& header, int pg = wxPAGE_ALL); @@ -553,14 +662,14 @@ public: class wxHtmlEasyPrinting : public wxObject { public: - wxHtmlEasyPrinting(const char* name = "Printing", + wxHtmlEasyPrinting(const wxString& name = wxPyHtmlPrintingTitleStr, wxFrame *parent_frame = NULL); ~wxHtmlEasyPrinting(); void PreviewFile(const wxString &htmlfile); - void PreviewText(const wxString &htmltext, const wxString& basepath = wxEmptyString); + void PreviewText(const wxString &htmltext, const wxString& basepath = wxPyEmptyString); void PrintFile(const wxString &htmlfile); - void PrintText(const wxString &htmltext, const wxString& basepath = wxEmptyString); + void PrintText(const wxString &htmltext, const wxString& basepath = wxPyEmptyString); void PrinterSetup(); void PageSetup(); void SetHeader(const wxString& header, int pg = wxPAGE_ALL);