1 ///////////////////////////////////////////////////////////////////////////// 2 // Name: htmlwin.h 3 // Purpose: wxHtmlWindow class for parsing & displaying HTML 4 // Author: Vaclav Slavik 5 // RCS-ID: $Id: htmlwin.h,v 1.1 2006/12/02 15:58:29 scara Exp $ 6 // Copyright: (c) 1999 Vaclav Slavik 7 // Licence: wxWindows Licence 8 ///////////////////////////////////////////////////////////////////////////// 9 10 11 #ifndef _WX_HTMLWIN_H_ 12 #define _WX_HTMLWIN_H_ 13 14 #if defined(__GNUG__) && !defined(__APPLE__) 15 #pragma interface "htmlwin.h" 16 #endif 17 18 #include "wx/defs.h" 19 #if wxUSE_HTML 20 21 #include "wx/window.h" 22 #include "wx/scrolwin.h" 23 #include "wx/config.h" 24 #include "wx/treectrl.h" 25 #include "wx/html/winpars.h" 26 #include "wx/html/htmlcell.h" 27 #include "wx/filesys.h" 28 #include "wx/html/htmlfilt.h" 29 30 class wxHtmlProcessor; 31 class wxHtmlWinModule; 32 class wxHtmlHistoryArray; 33 class wxHtmlProcessorList; 34 35 36 // wxHtmlWindow flags: 37 #define wxHW_SCROLLBAR_NEVER 0x0002 38 #define wxHW_SCROLLBAR_AUTO 0x0004 39 40 // enums for wxHtmlWindow::OnOpeningURL 41 enum wxHtmlOpeningStatus 42 { 43 wxHTML_OPEN, 44 wxHTML_BLOCK, 45 wxHTML_REDIRECT 46 }; 47 48 //-------------------------------------------------------------------------------- 49 // wxHtmlWindow 50 // (This is probably the only class you will directly use.) 51 // Purpose of this class is to display HTML page (either local 52 // file or downloaded via HTTP protocol) in a window. Width 53 // of window is constant - given in constructor - virtual height 54 // is changed dynamicly depending on page size. 55 // Once the window is created you can set it's content by calling 56 // SetPage(text) or LoadPage(filename). 57 //-------------------------------------------------------------------------------- 58 59 class WXDLLEXPORT wxHtmlWindow : public wxScrolledWindow 60 { DECLARE_DYNAMIC_CLASS(wxHtmlWindow)61 DECLARE_DYNAMIC_CLASS(wxHtmlWindow) 62 friend class wxHtmlWinModule; 63 64 public: 65 wxHtmlWindow() { Init(); } 66 wxHtmlWindow(wxWindow *parent, wxWindowID id = -1, 67 const wxPoint& pos = wxDefaultPosition, 68 const wxSize& size = wxDefaultSize, 69 long style = wxHW_SCROLLBAR_AUTO, 70 const wxString& name = wxT("htmlWindow")) 71 { 72 Init(); 73 Create(parent, id, pos, size, style, name); 74 } 75 ~wxHtmlWindow(); 76 77 bool Create(wxWindow *parent, wxWindowID id = -1, 78 const wxPoint& pos = wxDefaultPosition, 79 const wxSize& size = wxDefaultSize, 80 long style = wxHW_SCROLLBAR_AUTO, 81 const wxString& name = wxT("htmlWindow")); 82 83 // Set HTML page and display it. !! source is HTML document itself, 84 // it is NOT address/filename of HTML document. If you want to 85 // specify document location, use LoadPage() istead 86 // Return value : FALSE if an error occured, TRUE otherwise 87 bool SetPage(const wxString& source); 88 89 // Append to current page 90 bool AppendToPage(const wxString& source); 91 92 // Load HTML page from given location. Location can be either 93 // a) /usr/wxGTK2/docs/html/wx.htm 94 // b) http://www.somewhere.uk/document.htm 95 // c) ftp://ftp.somesite.cz/pub/something.htm 96 // In case there is no prefix (http:,ftp:), the method 97 // will try to find it itself (1. local file, then http or ftp) 98 // After the page is loaded, the method calls SetPage() to display it. 99 // Note : you can also use path relative to previously loaded page 100 // Return value : same as SetPage 101 virtual bool LoadPage(const wxString& location); 102 103 // Returns full location of opened page GetOpenedPage()104 wxString GetOpenedPage() const {return m_OpenedPage;} 105 // Returns anchor within opened page GetOpenedAnchor()106 wxString GetOpenedAnchor() const {return m_OpenedAnchor;} 107 // Returns <TITLE> of opened page or empty string otherwise GetOpenedPageTitle()108 wxString GetOpenedPageTitle() const {return m_OpenedPageTitle;} 109 110 // Sets frame in which page title will be displayed. Format is format of 111 // frame title, e.g. "HtmlHelp : %s". It must contain exactly one %s 112 void SetRelatedFrame(wxFrame* frame, const wxString& format); GetRelatedFrame()113 wxFrame* GetRelatedFrame() const {return m_RelatedFrame;} 114 115 // After(!) calling SetRelatedFrame, this sets statusbar slot where messages 116 // will be displayed. Default is -1 = no messages. 117 void SetRelatedStatusBar(int bar); 118 119 // Sets fonts to be used when displaying HTML page. 120 void SetFonts(wxString normal_face, wxString fixed_face, const int *sizes); 121 122 // Sets space between text and window borders. SetBorders(int b)123 void SetBorders(int b) {m_Borders = b;} 124 125 // Saves custom settings into cfg config. it will use the path 'path' 126 // if given, otherwise it will save info into currently selected path. 127 // saved values : things set by SetFonts, SetBorders. 128 virtual void ReadCustomization(wxConfigBase *cfg, wxString path = wxEmptyString); 129 // ... 130 virtual void WriteCustomization(wxConfigBase *cfg, wxString path = wxEmptyString); 131 132 // Goes to previous/next page (in browsing history) 133 // Returns TRUE if successful, FALSE otherwise 134 bool HistoryBack(); 135 bool HistoryForward(); 136 bool HistoryCanBack(); 137 bool HistoryCanForward(); 138 // Resets history 139 void HistoryClear(); 140 141 // Returns pointer to conteiners/cells structure. 142 // It should be used ONLY when printing GetInternalRepresentation()143 wxHtmlContainerCell* GetInternalRepresentation() const {return m_Cell;} 144 145 // Adds input filter 146 static void AddFilter(wxHtmlFilter *filter); 147 148 // Returns a pointer to the parser. GetParser()149 wxHtmlWinParser *GetParser() const { return m_Parser; } 150 151 // Adds HTML processor to this instance of wxHtmlWindow: 152 void AddProcessor(wxHtmlProcessor *processor); 153 // Adds HTML processor to wxHtmlWindow class as whole: 154 static void AddGlobalProcessor(wxHtmlProcessor *processor); 155 156 // what would we do with it? AcceptsFocusFromKeyboard()157 virtual bool AcceptsFocusFromKeyboard() const { return FALSE; } 158 159 // -- Callbacks -- 160 161 // Sets the title of the window 162 // (depending on the information passed to SetRelatedFrame() method) 163 virtual void OnSetTitle(const wxString& title); 164 165 // Called when the mouse hovers over a cell: (x, y) are logical coords 166 // Default behaviour is to do nothing at all 167 virtual void OnCellMouseHover(wxHtmlCell *cell, wxCoord x, wxCoord y); 168 169 // Called when user clicks on a cell. Default behavior is to call 170 // OnLinkClicked() if this cell corresponds to a hypertext link 171 virtual void OnCellClicked(wxHtmlCell *cell, 172 wxCoord x, wxCoord y, 173 const wxMouseEvent& event); 174 175 // Called when user clicked on hypertext link. Default behavior is to 176 // call LoadPage(loc) 177 virtual void OnLinkClicked(const wxHtmlLinkInfo& link); 178 179 // Called when wxHtmlWindow wants to fetch data from an URL (e.g. when 180 // loading a page or loading an image). The data are downloaded if and only if 181 // OnOpeningURL returns TRUE. If OnOpeningURL returns wxHTML_REDIRECT, 182 // it must set *redirect to the new URL OnOpeningURL(wxHtmlURLType WXUNUSED (type),const wxString & WXUNUSED (url),wxString * WXUNUSED (redirect))183 virtual wxHtmlOpeningStatus OnOpeningURL(wxHtmlURLType WXUNUSED(type), 184 const wxString& WXUNUSED(url), 185 wxString *WXUNUSED(redirect)) const 186 { return wxHTML_OPEN; } 187 188 protected: 189 void Init(); 190 191 // Scrolls to anchor of this name. (Anchor is #news 192 // or #features etc. it is part of address sometimes: 193 // http://www.ms.mff.cuni.cz/~vsla8348/wxhtml/index.html#news) 194 // Return value : TRUE if anchor exists, FALSE otherwise 195 bool ScrollToAnchor(const wxString& anchor); 196 197 // Prepares layout (= fill m_PosX, m_PosY for fragments) based on 198 // actual size of window. This method also setup scrollbars 199 void CreateLayout(); 200 201 void OnDraw(wxDC& dc); 202 void OnSize(wxSizeEvent& event); 203 void OnMouseEvent(wxMouseEvent& event); 204 void OnIdle(wxIdleEvent& event); 205 206 // Returns new filter (will be stored into m_DefaultFilter variable) GetDefaultFilter()207 virtual wxHtmlFilter *GetDefaultFilter() {return new wxHtmlFilterPlainText;} 208 209 // cleans static variables 210 static void CleanUpStatics(); 211 212 protected: 213 // This is pointer to the first cell in parsed data. 214 // (Note: the first cell is usually top one = all other cells are sub-cells of this one) 215 wxHtmlContainerCell *m_Cell; 216 // parser which is used to parse HTML input. 217 // Each wxHtmlWindow has it's own parser because sharing one global 218 // parser would be problematic (because of reentrancy) 219 wxHtmlWinParser *m_Parser; 220 // contains name of actualy opened page or empty string if no page opened 221 wxString m_OpenedPage; 222 // contains name of current anchor within m_OpenedPage 223 wxString m_OpenedAnchor; 224 // contains title of actualy opened page or empty string if no <TITLE> tag 225 wxString m_OpenedPageTitle; 226 // class for opening files (file system) 227 wxFileSystem* m_FS; 228 229 wxFrame *m_RelatedFrame; 230 wxString m_TitleFormat; 231 // frame in which page title should be displayed & number of it's statusbar 232 // reserved for usage with this html window 233 int m_RelatedStatusBar; 234 235 // borders (free space between text and window borders) 236 // defaults to 10 pixels. 237 int m_Borders; 238 239 int m_Style; 240 241 private: 242 // a flag indicated if mouse moved 243 // (if TRUE we will try to change cursor in last call to OnIdle) 244 bool m_tmpMouseMoved; 245 // contains last link name 246 wxHtmlLinkInfo *m_tmpLastLink; 247 // contains the last (terminal) cell which contained the mouse 248 wxHtmlCell *m_tmpLastCell; 249 // if >0 contents of the window is not redrawn 250 // (in order to avoid ugly blinking) 251 int m_tmpCanDrawLocks; 252 253 // list of HTML filters 254 static wxList m_Filters; 255 // this filter is used when no filter is able to read some file 256 static wxHtmlFilter *m_DefaultFilter; 257 258 static wxCursor *s_cur_hand; 259 static wxCursor *s_cur_arrow; 260 261 wxHtmlHistoryArray *m_History; 262 // browser history 263 int m_HistoryPos; 264 // if this FLAG is false, items are not added to history 265 bool m_HistoryOn; 266 267 // html processors array: 268 wxHtmlProcessorList *m_Processors; 269 static wxHtmlProcessorList *m_GlobalProcessors; 270 271 DECLARE_EVENT_TABLE() 272 }; 273 274 275 #endif 276 277 #endif // _WX_HTMLWIN_H_ 278 279