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