#include <wx/image.h>
#include <wx/fs_zip.h>
#include <wx/fs_inet.h>
+#include <wx/wfstream.h>
%}
//---------------------------------------------------------------------------
%extern windows.i
%extern _defs.i
%extern events.i
-//%extern windows2.i
-//%extern windows3.i
-//%extern frames.i
-//%extern misc.i
-//%extern gdi.i
-//%extern controls.i
+%extern controls.i
+%extern controls2.i
+%extern utils.i
+
+//---------------------------------------------------------------------------
%{
#ifdef __WXMSW__
-static wxString wxPyEmptyStr("");
-static wxPoint wxPyDefaultPosition(wxDefaultPosition);
-static wxSize wxPyDefaultSize(wxDefaultSize);
+wxString wxPyEmptyStr("");
+wxPoint wxPyDefaultPosition(wxDefaultPosition);
+wxSize wxPyDefaultSize(wxDefaultSize);
#endif
-static PyThreadState* wxPyThreadState;
%}
-%pragma(python) code = "import wx,htmlhelper"
+%pragma(python) code = "import wx"
%pragma(python) code = "widget = htmlc"
%{
+#if 0
static PyObject* mod_dict = NULL; // will be set by init
#include <wx/html/mod_templ.h>
TAG_HANDLER_BEGIN(PYTHONTAG, "PYTHON")
TAG_HANDLER_PROC(tag)
{
- wxWindow *wnd;
- wxString errmsg;
- char pbuf[256];
-
- int fl = 0;
-
- while (1) {
- #ifdef WXP_WITH_THREAD
- PyEval_RestoreThread(wxPyThreadState);
- #endif
- if (tag.HasParam("FLOAT"))
- tag.ScanParam("FLOAT", "%i", &fl);
- PyObject* pyfunc = PyDict_GetItemString(mod_dict, "WidgetStarter");
- if (pyfunc == NULL) {
- errmsg = "Could not find object WidgetStarter";
- break;
- }
- if (! PyCallable_Check(pyfunc)) {
- errmsg = "WidgetStarter does not appear to be callable";
- break;
- }
- SWIG_MakePtr(pbuf, m_WParser->GetWindow(), "_wxHtmlWindow_p");
+ wxWindow *wnd;
+ wxString errmsg;
+ char pbuf[256];
+
+ int fl = 0;
+
+ bool doSave = wxPyRestoreThread();
+ while (1) {
+ if (tag.HasParam("FLOAT"))
+ tag.ScanParam("FLOAT", "%i", &fl);
+ PyObject* pyfunc = PyDict_GetItemString(mod_dict, "WidgetStarter");
+ if (pyfunc == NULL) {
+ errmsg = "Could not find object WidgetStarter";
+ break;
+ }
+ if (! PyCallable_Check(pyfunc)) {
+ errmsg = "WidgetStarter does not appear to be callable";
+ break;
+ }
+ SWIG_MakePtr(pbuf, m_WParser->GetWindow(), "_wxPyHtmlWindow_p");
PyObject* arglist = Py_BuildValue("(s,s)", pbuf,
- (const char*)tag.GetAllParams());
- if (! arglist) {
- errmsg = "Failed making argument list";
- break;
- }
- PyObject* ret = PyEval_CallObject(pyfunc, arglist);
- Py_DECREF(arglist);
- if (ret == NULL) {
+ (const char*)tag.GetAllParams());
+ if (! arglist) {
+ errmsg = "Failed making argument list";
+ break;
+ }
+ PyObject* ret = PyEval_CallObject(pyfunc, arglist);
+ Py_DECREF(arglist);
+ if (ret == NULL) {
errmsg = "An error occured while calling WidgetStarter";
- if (PyErr_Occurred())
- PyErr_Print();
- break;
- }
- wnd = NULL;
- if (PyString_Check(ret)) {
- char* thisc = PyString_AsString(ret);
- SWIG_GetPtr(thisc, (void**)&wnd, "_wxWindow_p");
- }
- Py_DECREF(ret);
- if (! wnd) {
+ if (PyErr_Occurred())
+ PyErr_Print();
+ break;
+ }
+ wnd = NULL;
+ if (PyString_Check(ret)) {
+ char* thisc = PyString_AsString(ret);
+ SWIG_GetPtr(thisc, (void**)&wnd, "_wxWindow_p");
+ }
+ Py_DECREF(ret);
+ if (! wnd) {
errmsg = "Could not make a wxWindow pointer from return ptr";
- break;
- }
- #ifdef WXP_WITH_THREAD
- PyEval_SaveThread();
- #endif
- wnd -> Show(TRUE);
- m_WParser->OpenContainer()->InsertCell(new wxHtmlWidgetCell(wnd, fl));
- return FALSE;
- }
-
- /* we got out of the loop. Must be an error. Show a box stating it. */
-
- #ifdef WXP_WITH_THREAD
- PyEval_SaveThread();
- #endif
-
+ break;
+ }
+ wxPySaveThread(doSave);
+ wnd -> Show(TRUE);
+ m_WParser->OpenContainer()->InsertCell(new wxHtmlWidgetCell(wnd, fl));
+ return FALSE;
+ }
+
+ wxPySaveThread(doSave);
+
+ /* we got out of the loop. Must be an error. Show a box stating it. */
wnd = new wxTextCtrl( m_WParser -> GetWindow(), -1,
- errmsg, wxPoint(0,0),
- wxSize(300, 100), wxTE_MULTILINE );
- wnd -> Show(TRUE);
- m_WParser->OpenContainer()->InsertCell(new wxHtmlWidgetCell(wnd, 100));
+ errmsg, wxPoint(0,0),
+ wxSize(300, 100), wxTE_MULTILINE );
+ wnd -> Show(TRUE);
+ m_WParser->OpenContainer()->InsertCell(new wxHtmlWidgetCell(wnd, 100));
return FALSE;
}
-
+
TAG_HANDLER_END(PYTHONTAG)
TAGS_MODULE_BEGIN(PythonTag)
TAGS_MODULE_ADD(PYTHONTAG)
-
+
TAGS_MODULE_END(PythonTag)
// Note: see also the init function where we add the module!
+#endif
+%}
+
+//---------------------------------------------------------------------------
+
+enum {
+ HTML_ALIGN_LEFT,
+ HTML_ALIGN_CENTER,
+ HTML_ALIGN_RIGHT,
+ HTML_ALIGN_BOTTOM,
+ HTML_ALIGN_TOP,
+
+ HTML_CLR_FOREGROUND,
+ HTML_CLR_BACKGROUND,
+
+ HTML_UNITS_PIXELS,
+ HTML_UNITS_PERCENT,
+
+ HTML_INDENT_LEFT,
+ HTML_INDENT_RIGHT,
+ HTML_INDENT_TOP,
+ HTML_INDENT_BOTTOM,
+
+ HTML_INDENT_HORIZONTAL,
+ HTML_INDENT_VERTICAL,
+ HTML_INDENT_ALL,
+
+ HTML_COND_ISANCHOR,
+ HTML_COND_ISIMAGEMAP,
+ HTML_COND_USER,
+};
+
+
+//---------------------------------------------------------------------------
+
+class wxHtmlTag {
+public:
+ // Never need to create a new tag from Python...
+ //wxHtmlTag(const wxString& source, int pos, int end_pos, wxHtmlTagsCache* cache);
+
+ wxString GetName();
+ bool HasParam(const wxString& par);
+ wxString GetParam(const wxString& par, int with_commas = FALSE);
+
+ // Can't do this one as-is, but GetParam should be enough...
+ //int ScanParam(const wxString& par, const char *format, void* param);
+
+ wxString GetAllParams();
+ bool IsEnding();
+ bool HasEnding();
+ int GetBeginPos();
+ int GetEndPos1();
+ int GetEndPos2();
+};
+
+
+//---------------------------------------------------------------------------
+
+class wxHtmlParser {
+public:
+ // wxHtmlParser(); This is an abstract base class...
+
+ void SetFS(wxFileSystem *fs);
+ wxFileSystem* GetFS();
+ wxObject* Parse(const wxString& source);
+ void InitParser(const wxString& source);
+ void DoneParser();
+ void DoParsing(int begin_pos, int end_pos);
+ // wxObject* GetProduct();
+ void AddTagHandler(wxHtmlTagHandler *handler);
+ wxString* GetSource();
+
+
+ // void AddText(const char* txt) = 0;
+ // void AddTag(const wxHtmlTag& tag);
+};
+
+//---------------------------------------------------------------------------
+
+class wxHtmlWinParser : public wxHtmlParser {
+public:
+ wxHtmlWinParser(wxWindow *wnd);
+
+ void SetDC(wxDC *dc);
+ wxDC* GetDC();
+ int GetCharHeight();
+ int GetCharWidth();
+ wxWindow* GetWindow();
+ void SetFonts(wxString normal_face, int normal_italic_mode,
+ wxString fixed_face, int fixed_italic_mode, int *LIST);
+
+ wxHtmlContainerCell* GetContainer();
+ wxHtmlContainerCell* OpenContainer();
+ wxHtmlContainerCell* CloseContainer();
+ int GetFontSize();
+ void SetFontSize(int s);
+ int GetFontBold();
+ void SetFontBold(int x);
+ int GetFontItalic();
+ void SetFontItalic(int x);
+ int GetFontUnderlined();
+ void SetFontUnderlined(int x);
+ int GetFontFixed();
+ void SetFontFixed(int x);
+ int GetAlign();
+ void SetAlign(int a);
+ const wxColour& GetLinkColor();
+ void SetLinkColor(const wxColour& clr);
+ const wxColour& GetActualColor();
+ void SetActualColor(const wxColour& clr);
+ const wxString& GetLink();
+ void SetLink(const wxString& link);
+ wxFont* CreateCurrentFont();
+};
+
+
+
+//---------------------------------------------------------------------------
+
+%{
+class wxPyHtmlTagHandler : public wxHtmlTagHandler {
+public:
+ wxPyHtmlTagHandler() : wxHtmlTagHandler() {};
+
+ wxHtmlParser* GetParser() { return m_Parser; }
+ void ParseInner(const wxHtmlTag& tag) { wxHtmlTagHandler::ParseInner(tag); }
+
+ DEC_PYCALLBACK_STRING__pure(GetSupportedTags);
+ DEC_PYCALLBACK_BOOL_TAG_pure(HandleTag);
+
+ PYPRIVATE;
+};
+
+IMP_PYCALLBACK_STRING__pure(wxPyHtmlTagHandler, wxHtmlTagHandler, GetSupportedTags);
+IMP_PYCALLBACK_BOOL_TAG_pure(wxPyHtmlTagHandler, wxHtmlTagHandler, HandleTag);
%}
+
+%name(wxHtmlTagHandler) class wxPyHtmlTagHandler {
+public:
+ wxPyHtmlTagHandler();
+
+ void _setSelf(PyObject* self);
+ %pragma(python) addtomethod = "__init__:self._setSelf(self)"
+
+ void SetParser(wxHtmlParser *parser);
+ wxHtmlParser* GetParser();
+ void ParseInner(const wxHtmlTag& tag);
+};
+
+
+//---------------------------------------------------------------------------
+
+%{
+class wxPyHtmlWinTagHandler : public wxHtmlWinTagHandler {
+public:
+ wxPyHtmlWinTagHandler() : wxHtmlWinTagHandler() {};
+
+ wxHtmlWinParser* GetParser() { return m_WParser; }
+ void ParseInner(const wxHtmlTag& tag)
+ { wxHtmlWinTagHandler::ParseInner(tag); }
+
+ DEC_PYCALLBACK_STRING__pure(GetSupportedTags);
+ DEC_PYCALLBACK_BOOL_TAG_pure(HandleTag);
+
+ PYPRIVATE;
+};
+
+IMP_PYCALLBACK_STRING__pure(wxPyHtmlWinTagHandler, wxHtmlWinTagHandler, GetSupportedTags);
+IMP_PYCALLBACK_BOOL_TAG_pure(wxPyHtmlWinTagHandler, wxHtmlWinTagHandler, HandleTag);
+%}
+
+
+%name(wxHtmlWinTagHandler) class wxPyHtmlWinTagHandler : public wxPyHtmlTagHandler {
+public:
+ wxPyHtmlWinTagHandler();
+
+ void _setSelf(PyObject* self);
+ %pragma(python) addtomethod = "__init__:self._setSelf(self)"
+
+ void SetParser(wxHtmlParser *parser);
+ wxHtmlWinParser* GetParser();
+ void ParseInner(const wxHtmlTag& tag);
+};
+
+
+//---------------------------------------------------------------------------
+
+%{
+
+class wxPyHtmlTagsModule : public wxHtmlTagsModule {
+public:
+ wxPyHtmlTagsModule(PyObject* thc) : wxHtmlTagsModule() {
+ m_tagHandlerClass = thc;
+ Py_INCREF(m_tagHandlerClass);
+ RegisterModule(this);
+ wxHtmlWinParser::AddModule(this);
+ }
+
+ void OnExit() {
+ Py_DECREF(m_tagHandlerClass);
+ m_tagHandlerClass = NULL;
+ for (int x=0; x < m_objArray.GetCount(); x++) {
+ PyObject* obj = (PyObject*)m_objArray.Item(x);
+ Py_DECREF(obj);
+ }
+ };
+
+ 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();
+ PyObject* arg = Py_BuildValue("()");
+ PyObject* obj = PyInstance_New(m_tagHandlerClass, arg, NULL);
+ Py_DECREF(arg);
+ wxPySaveThread(doSave);
+
+ // now figure out where it's C++ object is...
+ wxPyHtmlWinTagHandler* thPtr;
+ if (SWIG_GetPtrObj(obj, (void **)&thPtr, "_wxPyHtmlWinTagHandler_p"))
+ return;
+
+ // add it,
+ parser->AddTagHandler(thPtr);
+
+ // and track it.
+ m_objArray.Add(obj);
+ }
+
+private:
+ PyObject* m_tagHandlerClass;
+ wxArrayPtrVoid m_objArray;
+
+};
+%}
+
+
+
+%inline %{
+ void wxHtmlWinParser_AddTagHandler(PyObject* tagHandlerClass) {
+ // Dynamically create a new wxModule. Refcounts tagHandlerClass
+ // and adds itself to the wxModules list and to the wxHtmlWinParser.
+ new wxPyHtmlTagsModule(tagHandlerClass);
+ }
+%}
+
+//---------------------------------------------------------------------------
+//---------------------------------------------------------------------------
+
+class wxHtmlCell {
+public:
+ wxHtmlCell();
+
+ void SetParent(wxHtmlContainerCell *p);
+ wxHtmlContainerCell* GetParent();
+ int GetPosX();
+ int GetPosY();
+ int GetWidth();
+ int GetHeight();
+ int GetDescent();
+ wxString GetLink(int x = 0, int y = 0);
+ wxHtmlCell* GetNext();
+ void SetPos(int x, int y);
+ void SetLink(const wxString& link);
+ void SetNext(wxHtmlCell *cell);
+ void Layout(int w);
+ void Draw(wxDC& dc, int x, int y, int view_y1, int view_y2);
+ void DrawInvisible(wxDC& dc, int x, int y);
+ const wxHtmlCell* Find(int condition, const void* param);
+};
+
+
+class wxHtmlContainerCell : public wxHtmlCell {
+public:
+ wxHtmlContainerCell(wxHtmlContainerCell *parent);
+
+ void InsertCell(wxHtmlCell *cell);
+ void SetAlignHor(int al);
+ int GetAlignHor();
+ void SetAlignVer(int al);
+ int GetAlignVer();
+ void SetIndent(int i, int what, int units = HTML_UNITS_PIXELS);
+ int GetIndent(int ind);
+ int GetIndentUnits(int ind);
+ void SetAlign(const wxHtmlTag& tag);
+ void SetWidthFloat(int w, int units);
+ %name(SetWidthFloatFromTag)void SetWidthFloat(const wxHtmlTag& tag);
+ void SetMinHeight(int h, int align = HTML_ALIGN_TOP);
+ int GetMaxLineWidth();
+ void SetBackgroundColour(const wxColour& clr);
+ void SetBorder(const wxColour& clr1, const wxColour& clr2);
+ wxHtmlCell* GetFirstCell();
+};
+
+
+
+
+class wxHtmlWidgetCell : public wxHtmlCell {
+public:
+ wxHtmlWidgetCell(wxWindow* wnd, int w = 0);
+
+};
+
+
+
+//---------------------------------------------------------------------------
+//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// item of history list
-class HtmlHistoryItem
-{
- public:
- HtmlHistoryItem(const char* p, const char* a);
- int GetPos() const {return m_Pos;}
- void SetPos(int p) {m_Pos = p;}
- const wxString& GetPage() const ;
- const wxString& GetAnchor() const ;
+class HtmlHistoryItem {
+public:
+ HtmlHistoryItem(const char* p, const char* a);
+
+ int GetPos();
+ void SetPos(int p);
+ const wxString& GetPage();
+ const wxString& GetAnchor();
};
-class wxHtmlWindow : public wxScrolledWindow
-{
- public:
- wxHtmlWindow(wxWindow *parent, wxWindowID id = -1,
- const wxPoint& pos = wxPyDefaultPosition,
- const wxSize& size = wxPyDefaultSize,
- int flags=wxHW_SCROLLBAR_AUTO,
- const char* name = "htmlWindow");
- %pragma(python) addtomethod = "__init__:wx._StdWindowCallbacks(self)"
- %pragma(python) addtomethod = "__init__:wx._StdOnScrollCallbacks(self)"
-
- bool SetPage(const char* source);
- // 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 LoadPage(const char* location);
- // 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
-
- wxString GetOpenedPage() const {return m_OpenedPage;}
- // Returns full location of opened page
-
- void SetRelatedFrame(wxFrame* frame, const char* format);
- // 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
- wxFrame* GetRelatedFrame() const;
-
- void SetRelatedStatusBar(int bar);
- // after(!) calling SetRelatedFrame, this sets statusbar slot where messages
- // will be displayed. Default is -1 = no messages.
-
- void SetFonts(wxString normal_face, int normal_italic_mode, wxString fixed_face, int fixed_italic_mode, int *sizes);
- // sets fonts to be used when displaying HTML page.
- // *_italic_mode can be either wxSLANT or wxITALIC
-
- void SetTitle(const char* title);
- // Sets the title of the window
- // (depending on the information passed to SetRelatedFrame() method)
-
- void SetBorders(int b);
- // Sets space between text and window borders.
-
- //virtual void ReadCustomization(wxConfigBase *cfg, wxString path = wxEmptyString);
- // 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.
- //virtual void WriteCustomization(wxConfigBase *cfg, wxString path = wxEmptyString);
- // ...
-
- bool HistoryBack();
- bool HistoryForward();
- // Goes to previous/next page (in browsing history)
- // Returns TRUE if successful, FALSE otherwise
- void HistoryClear();
- // Resets history
-
- //wxHtmlContainerCell* GetInternalRepresentation() const;
- // Returns pointer to conteiners/cells structure.
- // It should be used ONLY when printing
-
- //static void AddFilter(wxHtmlFilter *filter);
- // Adds input filter
-
- /* This function needs to be eventified! */
- //virtual void OnLinkClicked(const char* link);
- // called when users clicked on hypertext link. Default behavior is to
- // call LoadPage(loc)
-
- //static void CleanUpStatics();
- // cleans static variables
+//---------------------------------------------------------------------------
+%{
+class wxPyHtmlWindow : public wxHtmlWindow {
+public:
+ wxPyHtmlWindow(wxWindow *parent, wxWindowID id = -1,
+ const wxPoint& pos = wxDefaultPosition,
+ const wxSize& size = wxDefaultSize,
+ long style = wxHW_SCROLLBAR_AUTO,
+ const wxString& name = "htmlWindow")
+ : wxHtmlWindow(parent, id, pos, size, style, name) {};
+
+ DEC_PYCALLBACK__STRING(OnLinkClicked);
+
+ PYPRIVATE;
+};
+
+IMP_PYCALLBACK__STRING(wxPyHtmlWindow, wxHtmlWindow, OnLinkClicked);
+
+%}
+
+
+%name(wxHtmlWindow) class wxPyHtmlWindow : public wxScrolledWindow {
+public:
+ wxPyHtmlWindow(wxWindow *parent, int id = -1,
+ wxPoint& pos = wxPyDefaultPosition,
+ wxSize& size = wxPyDefaultSize,
+ int flags=wxHW_SCROLLBAR_AUTO,
+ char* name = "htmlWindow");
+
+ void _setSelf(PyObject* self);
+ %pragma(python) addtomethod = "__init__:self._setSelf(self)"
+ %pragma(python) addtomethod = "__init__:wx._StdWindowCallbacks(self)"
+ %pragma(python) addtomethod = "__init__:wx._StdOnScrollCallbacks(self)"
+
+
+ bool SetPage(const char* source);
+ bool LoadPage(const char* location);
+ wxString GetOpenedPage();
+ void SetRelatedFrame(wxFrame* frame, const char* format);
+ wxFrame* GetRelatedFrame();
+ void SetRelatedStatusBar(int bar);
+ void SetFonts(wxString normal_face, int normal_italic_mode,
+ wxString fixed_face, int fixed_italic_mode, int *LIST);
+ void SetTitle(const char* title);
+ void SetBorders(int b);
+ void ReadCustomization(wxConfigBase *cfg, char* path = "");
+ void WriteCustomization(wxConfigBase *cfg, char* path = "");
+ bool HistoryBack();
+ bool HistoryForward();
+ void HistoryClear();
+ wxHtmlContainerCell* GetInternalRepresentation();
+ wxHtmlWinParser* GetParser();
+
+
+ void base_OnLinkClicked(const char* link);
};
+// Static methods are mapped to stand-alone functions
+%inline %{
+ void wxHtmlWindow_AddFilter(wxHtmlFilter *filter) {
+ wxHtmlWindow::AddFilter(filter);
+ }
+%}
+
+//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
+%{
+ extern "C" SWIGEXPORT(void) inithtmlhelpc();
+%}
+
+
%init %{
- /* This is a bit cheesy. SWIG happens to call the dictionary d...
+#if 0
+ /* This is a bit cheesy. SWIG happens to call the dictionary d...
* I save it here, 'cause I don't know how to get it back later! */
mod_dict = d;
- wxPyThreadState = PyThreadState_Get();
+#endif
+
+ inithtmlhelpc();
+
wxClassInfo::CleanUpClasses();
wxClassInfo::InitializeClasses();
+#if 0
/* specifically add our python tag handler; it doesn't seem to
* happen by itself... */
wxHtmlWinParser::AddModule(new HTML_ModulePythonTag());
-
+#endif
+
// Until wxFileSystem is wrapped...
#if wxUSE_FS_ZIP
wxFileSystem::AddHandler(new wxZipFSHandler);
#endif
%}
+//----------------------------------------------------------------------
+// And this gets appended to the shadow class file.
+//----------------------------------------------------------------------
+
+%pragma(python) include="_extras.py";
+
//---------------------------------------------------------------------------
+