X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/af49c4b8a2d3553e733e71c7dd3911881f4c1a2a..11e3c6ef36393fb5863ea2f9601d8facd73acb12:/include/wx/html/htmlwin.h diff --git a/include/wx/html/htmlwin.h b/include/wx/html/htmlwin.h index 14ed7b410b..b95e7d6267 100644 --- a/include/wx/html/htmlwin.h +++ b/include/wx/html/htmlwin.h @@ -1,80 +1,259 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: htmlwin.h +// Name: wx/html/htmlwin.h // Purpose: wxHtmlWindow class for parsing & displaying HTML // Author: Vaclav Slavik // RCS-ID: $Id$ // Copyright: (c) 1999 Vaclav Slavik -// Licence: wxWindows Licence +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// - #ifndef _WX_HTMLWIN_H_ #define _WX_HTMLWIN_H_ -#if defined(__GNUG__) && !defined(__APPLE__) -#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/treectrl.h" +#include "wx/stopwatch.h" #include "wx/html/winpars.h" #include "wx/html/htmlcell.h" #include "wx/filesys.h" #include "wx/html/htmlfilt.h" +#include "wx/filename.h" +#include "wx/bitmap.h" class wxHtmlProcessor; class wxHtmlWinModule; class wxHtmlHistoryArray; class wxHtmlProcessorList; - +class WXDLLIMPEXP_FWD_HTML wxHtmlWinAutoScrollTimer; +class WXDLLIMPEXP_FWD_HTML wxHtmlCellEvent; +class WXDLLIMPEXP_FWD_HTML wxHtmlLinkEvent; +class WXDLLIMPEXP_FWD_CORE wxStatusBar; // wxHtmlWindow flags: #define wxHW_SCROLLBAR_NEVER 0x0002 #define wxHW_SCROLLBAR_AUTO 0x0004 +#define wxHW_NO_SELECTION 0x0008 + +#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 behaviour 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.) // Purpose of this class is to display HTML page (either local -// file or downloaded via HTTP protocol) in a window. Width -// of window is constant - given in constructor - virtual height -// is changed dynamicly depending on page size. -// Once the window is created you can set it's content by calling +// file or downloaded via HTTP protocol) in a window. Width of +// window is constant - given in constructor - virtual height +// is changed dynamicly depending on page size. Once the +// window is created you can set it's content by calling // SetPage(text) or LoadPage(filename). -//-------------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- -class WXDLLEXPORT wxHtmlWindow : public wxScrolledWindow +class WXDLLIMPEXP_HTML wxHtmlWindow : public wxScrolledWindow, + public wxHtmlWindowInterface, + public wxHtmlWindowMouseHelper { DECLARE_DYNAMIC_CLASS(wxHtmlWindow) friend class wxHtmlWinModule; public: - wxHtmlWindow() { Init(); } - wxHtmlWindow(wxWindow *parent, wxWindowID id = -1, + wxHtmlWindow() : wxHtmlWindowMouseHelper(this) { Init(); } + wxHtmlWindow(wxWindow *parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, - long style = wxHW_SCROLLBAR_AUTO, + 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 = -1, + bool Create(wxWindow *parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxHW_SCROLLBAR_AUTO, @@ -83,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); @@ -100,6 +279,9 @@ public: // Return value : same as SetPage virtual bool LoadPage(const wxString& location); + // Loads HTML page from file + bool LoadFile(const wxFileName& filename); + // Returns full location of opened page wxString GetOpenedPage() const {return m_OpenedPage;} // Returns anchor within opened page @@ -112,25 +294,41 @@ public: void SetRelatedFrame(wxFrame* frame, const wxString& format); wxFrame* GetRelatedFrame() const {return m_RelatedFrame;} +#if wxUSE_STATUSBAR // After(!) calling SetRelatedFrame, this sets statusbar slot where messages // will be displayed. Default is -1 = no messages. - void SetRelatedStatusBar(int bar); + void SetRelatedStatusBar(int index); + void SetRelatedStatusBar(wxStatusBar*, int index = 0); +#endif // wxUSE_STATUSBAR // Sets fonts to be used when displaying HTML page. - void SetFonts(wxString normal_face, wxString fixed_face, const int *sizes); + 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 + // default size; use either specified or default font + void SetStandardFonts(int size = -1, + const wxString& normal_face = wxEmptyString, + const wxString& fixed_face = wxEmptyString); // Sets space between text and window borders. void SetBorders(int b) {m_Borders = b;} + // Sets the bitmap to use for background (currnetly it will be tiled, + // when/if we have CSS support we could add other possibilities...) + void SetBackgroundImage(const wxBitmap& bmpBg) { m_bmpBg = bmpBg; } + +#if wxUSE_CONFIG // 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 ReadCustomization(wxConfigBase *cfg, wxString path = wxEmptyString); // ... virtual void WriteCustomization(wxConfigBase *cfg, wxString path = wxEmptyString); +#endif // wxUSE_CONFIG // Goes to previous/next page (in browsing history) - // Returns TRUE if successful, FALSE otherwise + // Returns true if successful, false otherwise bool HistoryBack(); bool HistoryForward(); bool HistoryCanBack(); @@ -153,8 +351,6 @@ public: // Adds HTML processor to wxHtmlWindow class as whole: static void AddGlobalProcessor(wxHtmlProcessor *processor); - // what would we do with it? - virtual bool AcceptsFocusFromKeyboard() const { return FALSE; } // -- Callbacks -- @@ -162,46 +358,65 @@ 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 + // Called when user clicked on hypertext link. Default behaviour is to // call LoadPage(loc) virtual void OnLinkClicked(const wxHtmlLinkInfo& link); // Called when wxHtmlWindow wants to fetch data from an URL (e.g. when // loading a page or loading an image). The data are downloaded if and only if - // OnOpeningURL returns TRUE. If OnOpeningURL returns wxHTML_REDIRECT, + // OnOpeningURL returns true. If OnOpeningURL returns wxHTML_REDIRECT, // it must set *redirect to the new URL virtual wxHtmlOpeningStatus OnOpeningURL(wxHtmlURLType WXUNUSED(type), const wxString& WXUNUSED(url), wxString *WXUNUSED(redirect)) const { return wxHTML_OPEN; } +#if wxUSE_CLIPBOARD + // Helper functions to select parts of page: + void SelectWord(const wxPoint& pos); + void SelectLine(const wxPoint& pos); + void SelectAll(); + + // Convert selection to text: + wxString SelectionToText() { return DoSelectionToText(m_selection); } + + // Converts current page to text: + wxString ToText(); +#endif // wxUSE_CLIPBOARD + + virtual void OnInternalIdle(); + + /// Returns standard HTML cursor as used by wxHtmlWindow + static wxCursor GetDefaultHTMLCursor(HTMLCursor type); + protected: void Init(); // Scrolls to anchor of this name. (Anchor is #news // or #features etc. it is part of address sometimes: // http://www.ms.mff.cuni.cz/~vsla8348/wxhtml/index.html#news) - // Return value : TRUE if anchor exists, FALSE otherwise + // Return value : true if anchor exists, false otherwise bool ScrollToAnchor(const wxString& anchor); // Prepares layout (= fill m_PosX, m_PosY for fragments) based on // actual size of window. This method also setup scrollbars void CreateLayout(); - void OnDraw(wxDC& dc); + void OnPaint(wxPaintEvent& event); + void OnEraseBackground(wxEraseEvent& event); void OnSize(wxSizeEvent& event); - void OnMouseEvent(wxMouseEvent& event); - void OnIdle(wxIdleEvent& event); + void OnMouseMove(wxMouseEvent& event); + void OnMouseDown(wxMouseEvent& event); + void OnMouseUp(wxMouseEvent& event); +#if wxUSE_CLIPBOARD + 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 // Returns new filter (will be stored into m_DefaultFilter variable) virtual wxHtmlFilter *GetDefaultFilter() {return new wxHtmlFilterPlainText;} @@ -209,43 +424,109 @@ protected: // cleans static variables static void CleanUpStatics(); + // Returns true if text selection is enabled (wxClipboard must be available + // and wxHW_NO_SELECTION not used) + bool IsSelectionEnabled() const; + + enum ClipboardType + { + Primary, + Secondary + }; + + // Copies selection to clipboard if the clipboard support is available + // + // returns true if anything was copied to clipboard, false otherwise + bool CopySelection(ClipboardType t = Secondary); + +#if wxUSE_CLIPBOARD + // Automatic scrolling during selection: + void StopAutoScrolling(); +#endif // wxUSE_CLIPBOARD + + 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) + // 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; // parser which is used to parse HTML input. - // Each wxHtmlWindow has it's own parser because sharing one global + // Each wxHtmlWindow has its own parser because sharing one global // parser would be problematic (because of reentrancy) wxHtmlWinParser *m_Parser; - // contains name of actualy opened page or empty string if no page opened + // contains name of actually opened page or empty string if no page opened wxString m_OpenedPage; // contains name of current anchor within m_OpenedPage wxString m_OpenedAnchor; - // contains title of actualy opened page or empty string if no