X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/518ba66331d4e63376448802ce23fb7f7da82250..81051829457fc8fd271d16601d74218f345f9e6b:/include/wx/html/htmlwin.h diff --git a/include/wx/html/htmlwin.h b/include/wx/html/htmlwin.h index 388cc12010..a09c80c2fe 100644 --- a/include/wx/html/htmlwin.h +++ b/include/wx/html/htmlwin.h @@ -7,20 +7,16 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// - #ifndef _WX_HTMLWIN_H_ #define _WX_HTMLWIN_H_ -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) -#pragma interface "htmlwin.h" -#endif - #include "wx/defs.h" #if wxUSE_HTML #include "wx/window.h" #include "wx/scrolwin.h" #include "wx/config.h" +#include "wx/stopwatch.h" #include "wx/html/winpars.h" #include "wx/html/htmlcell.h" #include "wx/filesys.h" @@ -32,7 +28,9 @@ class wxHtmlProcessor; class wxHtmlWinModule; class wxHtmlHistoryArray; class wxHtmlProcessorList; -class WXDLLIMPEXP_HTML wxHtmlWinAutoScrollTimer; +class WXDLLIMPEXP_FWD_HTML wxHtmlWinAutoScrollTimer; +class WXDLLIMPEXP_FWD_HTML wxHtmlCellEvent; +class WXDLLIMPEXP_FWD_HTML wxHtmlLinkEvent; // wxHtmlWindow flags: @@ -42,15 +40,187 @@ class WXDLLIMPEXP_HTML wxHtmlWinAutoScrollTimer; #define wxHW_DEFAULT_STYLE wxHW_SCROLLBAR_AUTO - -// enums for wxHtmlWindow::OnOpeningURL +/// Enum for wxHtmlWindow::OnOpeningURL and wxHtmlWindowInterface::OnOpeningURL enum wxHtmlOpeningStatus { + /// Open the requested URL wxHTML_OPEN, + /// Do not open the URL wxHTML_BLOCK, + /// Redirect to another URL (returned from OnOpeningURL) wxHTML_REDIRECT }; +/** + Abstract interface to a HTML rendering window (such as wxHtmlWindow or + wxHtmlListBox) that is passed to wxHtmlWinParser. It encapsulates all + communication from the parser to the window. + */ +class WXDLLIMPEXP_HTML wxHtmlWindowInterface +{ +public: + /// Ctor + wxHtmlWindowInterface() {} + virtual ~wxHtmlWindowInterface() {} + + /** + Called by the parser to set window's title to given text. + */ + virtual void SetHTMLWindowTitle(const wxString& title) = 0; + + /** + Called when a link is clicked. + + @param link information about the clicked link + */ + virtual void OnHTMLLinkClicked(const wxHtmlLinkInfo& link) = 0; + + /** + Called when the parser needs to open another URL (e.g. an image). + + @param type Type of the URL request (e.g. image) + @param url URL the parser wants to open + @param redirect If the return value is wxHTML_REDIRECT, then the + URL to redirect to will be stored in this variable + (the pointer must never be NULL) + + @return indicator of how to treat the request + */ + virtual wxHtmlOpeningStatus OnHTMLOpeningURL(wxHtmlURLType type, + const wxString& url, + wxString *redirect) const = 0; + + /** + Converts coordinates @a pos relative to given @a cell to + physical coordinates in the window. + */ + virtual wxPoint HTMLCoordsToWindow(wxHtmlCell *cell, + const wxPoint& pos) const = 0; + + /// Returns the window used for rendering (may be NULL). + virtual wxWindow* GetHTMLWindow() = 0; + + /// Returns background colour to use by default. + virtual wxColour GetHTMLBackgroundColour() const = 0; + + /// Sets window's background to colour @a clr. + virtual void SetHTMLBackgroundColour(const wxColour& clr) = 0; + + /// Sets window's background to given bitmap. + virtual void SetHTMLBackgroundImage(const wxBitmap& bmpBg) = 0; + + /// Sets status bar text. + virtual void SetHTMLStatusText(const wxString& text) = 0; + + /// Type of mouse cursor + enum HTMLCursor + { + /// Standard mouse cursor (typically an arrow) + HTMLCursor_Default, + /// Cursor shown over links + HTMLCursor_Link, + /// Cursor shown over selectable text + HTMLCursor_Text + }; + + /** + Returns mouse cursor of given @a type. + */ + virtual wxCursor GetHTMLCursor(HTMLCursor type) const = 0; +}; + +/** + Helper class that implements part of mouse handling for wxHtmlWindow and + wxHtmlListBox. Cursor changes and clicking on links are handled, text + selection is not. + */ +class WXDLLIMPEXP_HTML wxHtmlWindowMouseHelper +{ +protected: + /** + Ctor. + + @param iface Interface to the owner window. + */ + wxHtmlWindowMouseHelper(wxHtmlWindowInterface *iface); + + /** + Virtual dtor. + + It is not really needed in this case but at leats it prevents gcc from + complaining about its absence. + */ + virtual ~wxHtmlWindowMouseHelper() { } + + /// Returns true if the mouse moved since the last call to HandleIdle + bool DidMouseMove() const { return m_tmpMouseMoved; } + + /// Call this from EVT_MOTION event handler + void HandleMouseMoved(); + + /** + Call this from EVT_LEFT_UP handler (or, alternatively, EVT_LEFT_DOWN). + + @param rootCell HTML cell inside which the click occured. This doesn't + have to be the leaf cell, it can be e.g. toplevel + container, but the mouse must be inside the container's + area, otherwise the event would be ignored. + @param pos Mouse position in coordinates relative to @a cell + @param event The event that triggered the call + */ + bool HandleMouseClick(wxHtmlCell *rootCell, + const wxPoint& pos, const wxMouseEvent& event); + + /** + Call this from OnInternalIdle of the HTML displaying window. Handles + mouse movements and must be used together with HandleMouseMoved. + + @param rootCell HTML cell inside which the click occured. This doesn't + have to be the leaf cell, it can be e.g. toplevel + container, but the mouse must be inside the container's + area, otherwise the event would be ignored. + @param pos Current mouse position in coordinates relative to + @a cell + */ + void HandleIdle(wxHtmlCell *rootCell, const wxPoint& pos); + + /** + Called by HandleIdle when the mouse hovers over a cell. Default + behaviour is to do nothing. + + @param cell the cell the mouse is over + @param x, y coordinates of mouse relative to the cell + */ + virtual void OnCellMouseHover(wxHtmlCell *cell, wxCoord x, wxCoord y); + + /** + Called by HandleMouseClick when the user clicks on a cell. + Default behavior is to call wxHtmlWindowInterface::OnLinkClicked() + if this cell corresponds to a hypertext link. + + @param cell the cell the mouse is over + @param x, y coordinates of mouse relative to the cell + @param event The event that triggered the call + + + @return true if a link was clicked, false otherwise. + */ + virtual bool OnCellClicked(wxHtmlCell *cell, + wxCoord x, wxCoord y, + const wxMouseEvent& event); + +protected: + // this flag indicates if the mouse moved (used by HandleIdle) + bool m_tmpMouseMoved; + // contains last link name + wxHtmlLinkInfo *m_tmpLastLink; + // contains the last (terminal) cell which contained the mouse + wxHtmlCell *m_tmpLastCell; + +private: + wxHtmlWindowInterface *m_interface; +}; + // ---------------------------------------------------------------------------- // wxHtmlWindow // (This is probably the only class you will directly use.) @@ -62,23 +232,26 @@ enum wxHtmlOpeningStatus // SetPage(text) or LoadPage(filename). // ---------------------------------------------------------------------------- -class WXDLLIMPEXP_HTML wxHtmlWindow : public wxScrolledWindow +class WXDLLIMPEXP_HTML wxHtmlWindow : public wxScrolledWindow, + public wxHtmlWindowInterface, + public wxHtmlWindowMouseHelper { DECLARE_DYNAMIC_CLASS(wxHtmlWindow) friend class wxHtmlWinModule; public: - wxHtmlWindow() { Init(); } + wxHtmlWindow() : wxHtmlWindowMouseHelper(this) { Init(); } wxHtmlWindow(wxWindow *parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxHW_DEFAULT_STYLE, const wxString& name = wxT("htmlWindow")) + : wxHtmlWindowMouseHelper(this) { Init(); Create(parent, id, pos, size, style, name); } - ~wxHtmlWindow(); + virtual ~wxHtmlWindow(); bool Create(wxWindow *parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, @@ -89,8 +262,8 @@ public: // 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); + // Return value : false if an error occurred, true otherwise + virtual bool SetPage(const wxString& source); // Append to current page bool AppendToPage(const wxString& source); @@ -128,7 +301,7 @@ public: #endif // wxUSE_STATUSBAR // Sets fonts to be used when displaying HTML page. - void SetFonts(wxString normal_face, wxString fixed_face, + void SetFonts(const wxString& normal_face, const wxString& fixed_face, const int *sizes = NULL); // Sets font sizes to be relative to the given size or the system @@ -182,16 +355,6 @@ public: // (depending on the information passed to SetRelatedFrame() method) virtual void OnSetTitle(const wxString& title); - // Called when the mouse hovers over a cell: (x, y) are logical coords - // Default behaviour is to do nothing at all - virtual void OnCellMouseHover(wxHtmlCell *cell, wxCoord x, wxCoord y); - - // Called when user clicks on a cell. Default behavior is to call - // OnLinkClicked() if this cell corresponds to a hypertext link - virtual void OnCellClicked(wxHtmlCell *cell, - wxCoord x, wxCoord y, - const wxMouseEvent& event); - // Called when user clicked on hypertext link. Default behavior is to // call LoadPage(loc) virtual void OnLinkClicked(const wxHtmlLinkInfo& link); @@ -218,6 +381,11 @@ public: wxString ToText(); #endif // wxUSE_CLIPBOARD + virtual void OnInternalIdle(); + + /// Returns standard HTML cursor as used by wxHtmlWindow + static wxCursor GetDefaultHTMLCursor(HTMLCursor type); + protected: void Init(); @@ -241,12 +409,12 @@ protected: void OnKeyUp(wxKeyEvent& event); void OnDoubleClick(wxMouseEvent& event); void OnCopy(wxCommandEvent& event); + void OnClipboardEvent(wxClipboardTextEvent& event); void OnMouseEnter(wxMouseEvent& event); void OnMouseLeave(wxMouseEvent& event); + void OnMouseCaptureLost(wxMouseCaptureLostEvent& event); #endif // wxUSE_CLIPBOARD - virtual void OnInternalIdle(); - // Returns new filter (will be stored into m_DefaultFilter variable) virtual wxHtmlFilter *GetDefaultFilter() {return new wxHtmlFilterPlainText;} @@ -273,9 +441,28 @@ protected: void StopAutoScrolling(); #endif // wxUSE_CLIPBOARD -protected: wxString DoSelectionToText(wxHtmlSelection *sel); +public: + // wxHtmlWindowInterface methods: + virtual void SetHTMLWindowTitle(const wxString& title); + virtual void OnHTMLLinkClicked(const wxHtmlLinkInfo& link); + virtual wxHtmlOpeningStatus OnHTMLOpeningURL(wxHtmlURLType type, + const wxString& url, + wxString *redirect) const; + virtual wxPoint HTMLCoordsToWindow(wxHtmlCell *cell, + const wxPoint& pos) const; + virtual wxWindow* GetHTMLWindow(); + virtual wxColour GetHTMLBackgroundColour() const; + virtual void SetHTMLBackgroundColour(const wxColour& clr); + virtual void SetHTMLBackgroundImage(const wxBitmap& bmpBg); + virtual void SetHTMLStatusText(const wxString& text); + virtual wxCursor GetHTMLCursor(HTMLCursor type) const; + + // implementation of SetPage() + bool DoSetPage(const wxString& source); + +protected: // This is pointer to the first cell in parsed data. (Note: the first cell // is usually top one = all other cells are sub-cells of this one) wxHtmlContainerCell *m_Cell; @@ -304,8 +491,6 @@ protected: // defaults to 10 pixels. int m_Borders; - int m_Style; - // current text selection or NULL wxHtmlSelection *m_selection; @@ -315,7 +500,7 @@ protected: #if wxUSE_CLIPBOARD // time of the last doubleclick event, used to detect tripleclicks // (tripleclicks are used to select whole line): - wxLongLong m_lastDoubleClick; + wxMilliClock_t m_lastDoubleClick; // helper class to automatically scroll the window if the user is selecting // text and the mouse leaves wxHtmlWindow: @@ -333,10 +518,6 @@ private: wxPoint m_tmpSelFromPos; wxHtmlCell *m_tmpSelFromCell; - // contains last link name - wxHtmlLinkInfo *m_tmpLastLink; - // contains the last (terminal) cell which contained the mouse - wxHtmlCell *m_tmpLastCell; // if >0 contents of the window is not redrawn // (in order to avoid ugly blinking) int m_tmpCanDrawLocks; @@ -356,19 +537,114 @@ private: // if this FLAG is false, items are not added to history bool m_HistoryOn; - // a flag indicated if mouse moved - // (if true we will try to change cursor in last call to OnIdle) - bool m_tmpMouseMoved; - // a flag set if we need to erase background in OnPaint() (otherwise this // is supposed to have been done in OnEraseBackground()) bool m_eraseBgInOnPaint; + // standard mouse cursors + static wxCursor *ms_cursorLink; + static wxCursor *ms_cursorText; + DECLARE_EVENT_TABLE() DECLARE_NO_COPY_CLASS(wxHtmlWindow) }; + + +BEGIN_DECLARE_EVENT_TYPES() + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_HTML, + wxEVT_COMMAND_HTML_CELL_CLICKED, 1000) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_HTML, + wxEVT_COMMAND_HTML_CELL_HOVER, 1001) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_HTML, + wxEVT_COMMAND_HTML_LINK_CLICKED, 1002) +END_DECLARE_EVENT_TYPES() + + +/*! + * Html cell window event + */ + +class WXDLLIMPEXP_HTML wxHtmlCellEvent : public wxCommandEvent +{ +public: + wxHtmlCellEvent() {} + wxHtmlCellEvent(wxEventType commandType, int id, + wxHtmlCell *cell, const wxPoint &pt, + const wxMouseEvent &ev) + : wxCommandEvent(commandType, id) + { + m_cell = cell; + m_pt = pt; + m_mouseEvent = ev; + m_bLinkWasClicked = false; + } + + wxHtmlCell* GetCell() const { return m_cell; } + wxPoint GetPoint() const { return m_pt; } + wxMouseEvent GetMouseEvent() const { return m_mouseEvent; } + + void SetLinkClicked(bool linkclicked) { m_bLinkWasClicked=linkclicked; } + bool GetLinkClicked() const { return m_bLinkWasClicked; } + + // default copy ctor, assignment operator and dtor are ok + virtual wxEvent *Clone() const { return new wxHtmlCellEvent(*this); } + +private: + wxHtmlCell *m_cell; + wxMouseEvent m_mouseEvent; + wxPoint m_pt; + + bool m_bLinkWasClicked; + + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxHtmlCellEvent) +}; + + + +/*! + * Html link event + */ + +class WXDLLIMPEXP_HTML wxHtmlLinkEvent : public wxCommandEvent +{ +public: + wxHtmlLinkEvent() {} + wxHtmlLinkEvent(int id, const wxHtmlLinkInfo &linkinfo) + : wxCommandEvent(wxEVT_COMMAND_HTML_LINK_CLICKED, id) + { + m_linkInfo = linkinfo; + } + + const wxHtmlLinkInfo &GetLinkInfo() const { return m_linkInfo; } + + // default copy ctor, assignment operator and dtor are ok + virtual wxEvent *Clone() const { return new wxHtmlLinkEvent(*this); } + +private: + wxHtmlLinkInfo m_linkInfo; + + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxHtmlLinkEvent) +}; + + +typedef void (wxEvtHandler::*wxHtmlCellEventFunction)(wxHtmlCellEvent&); +typedef void (wxEvtHandler::*wxHtmlLinkEventFunction)(wxHtmlLinkEvent&); + +#define wxHtmlCellEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxHtmlCellEventFunction, &func) +#define wxHtmlLinkEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxHtmlLinkEventFunction, &func) + +#define EVT_HTML_CELL_CLICKED(id, fn) \ + wx__DECLARE_EVT1(wxEVT_COMMAND_HTML_CELL_CLICKED, id, wxHtmlCellEventHandler(fn)) +#define EVT_HTML_CELL_HOVER(id, fn) \ + wx__DECLARE_EVT1(wxEVT_COMMAND_HTML_CELL_HOVER, id, wxHtmlCellEventHandler(fn)) +#define EVT_HTML_LINK_CLICKED(id, fn) \ + wx__DECLARE_EVT1(wxEVT_COMMAND_HTML_LINK_CLICKED, id, wxHtmlLinkEventHandler(fn)) + + #endif // wxUSE_HTML #endif // _WX_HTMLWIN_H_