webview.cpp 34 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040
  1. /////////////////////////////////////////////////////////////////////////////
  2. // Name: webview.cpp
  3. // Purpose: wxWebView sample
  4. // Author: Marianne Gagnon
  5. // Copyright: (c) 2010 Marianne Gagnon, Steven Lamerton
  6. // Licence: wxWindows licence
  7. /////////////////////////////////////////////////////////////////////////////
  8. // ----------------------------------------------------------------------------
  9. // headers
  10. // ----------------------------------------------------------------------------
  11. // For compilers that support precompilation, includes "wx/wx.h".
  12. #include "wx/wxprec.h"
  13. #ifdef __BORLANDC__
  14. #pragma hdrstop
  15. #endif
  16. #ifndef WX_PRECOMP
  17. #include "wx/wx.h"
  18. #endif
  19. #if !wxUSE_WEBVIEW_WEBKIT && !wxUSE_WEBVIEW_IE
  20. #error "A wxWebView backend is required by this sample"
  21. #endif
  22. #include "wx/artprov.h"
  23. #include "wx/cmdline.h"
  24. #include "wx/notifmsg.h"
  25. #include "wx/settings.h"
  26. #include "wx/webview.h"
  27. #include "wx/webviewarchivehandler.h"
  28. #include "wx/webviewfshandler.h"
  29. #include "wx/infobar.h"
  30. #include "wx/filesys.h"
  31. #include "wx/fs_arc.h"
  32. #include "wx/fs_mem.h"
  33. #ifndef wxHAS_IMAGES_IN_RESOURCES
  34. #include "../sample.xpm"
  35. #endif
  36. #if wxUSE_STC
  37. #include "wx/stc/stc.h"
  38. #else
  39. #error "wxStyledTextControl is needed by this sample"
  40. #endif
  41. #if defined(__WXMSW__) || defined(__WXOSX__)
  42. #include "stop.xpm"
  43. #include "refresh.xpm"
  44. #endif
  45. #include "wxlogo.xpm"
  46. //We map menu items to their history items
  47. WX_DECLARE_HASH_MAP(int, wxSharedPtr<wxWebViewHistoryItem>,
  48. wxIntegerHash, wxIntegerEqual, wxMenuHistoryMap);
  49. class WebApp : public wxApp
  50. {
  51. public:
  52. WebApp() :
  53. m_url("http://www.wxwidgets.org")
  54. {
  55. }
  56. virtual bool OnInit();
  57. #if wxUSE_CMDLINE_PARSER
  58. virtual void OnInitCmdLine(wxCmdLineParser& parser)
  59. {
  60. wxApp::OnInitCmdLine(parser);
  61. parser.AddParam("URL to open",
  62. wxCMD_LINE_VAL_STRING,
  63. wxCMD_LINE_PARAM_OPTIONAL);
  64. }
  65. virtual bool OnCmdLineParsed(wxCmdLineParser& parser)
  66. {
  67. if ( !wxApp::OnCmdLineParsed(parser) )
  68. return false;
  69. if ( parser.GetParamCount() )
  70. m_url = parser.GetParam(0);
  71. return true;
  72. }
  73. #endif // wxUSE_CMDLINE_PARSER
  74. private:
  75. wxString m_url;
  76. };
  77. class WebFrame : public wxFrame
  78. {
  79. public:
  80. WebFrame(const wxString& url);
  81. virtual ~WebFrame();
  82. void UpdateState();
  83. void OnIdle(wxIdleEvent& evt);
  84. void OnUrl(wxCommandEvent& evt);
  85. void OnBack(wxCommandEvent& evt);
  86. void OnForward(wxCommandEvent& evt);
  87. void OnStop(wxCommandEvent& evt);
  88. void OnReload(wxCommandEvent& evt);
  89. void OnClearHistory(wxCommandEvent& evt);
  90. void OnEnableHistory(wxCommandEvent& evt);
  91. void OnNavigationRequest(wxWebViewEvent& evt);
  92. void OnNavigationComplete(wxWebViewEvent& evt);
  93. void OnDocumentLoaded(wxWebViewEvent& evt);
  94. void OnNewWindow(wxWebViewEvent& evt);
  95. void OnTitleChanged(wxWebViewEvent& evt);
  96. void OnViewSourceRequest(wxCommandEvent& evt);
  97. void OnToolsClicked(wxCommandEvent& evt);
  98. void OnSetZoom(wxCommandEvent& evt);
  99. void OnError(wxWebViewEvent& evt);
  100. void OnPrint(wxCommandEvent& evt);
  101. void OnCut(wxCommandEvent& evt);
  102. void OnCopy(wxCommandEvent& evt);
  103. void OnPaste(wxCommandEvent& evt);
  104. void OnUndo(wxCommandEvent& evt);
  105. void OnRedo(wxCommandEvent& evt);
  106. void OnMode(wxCommandEvent& evt);
  107. void OnZoomLayout(wxCommandEvent& evt);
  108. void OnHistory(wxCommandEvent& evt);
  109. void OnScrollLineUp(wxCommandEvent&) { m_browser->LineUp(); }
  110. void OnScrollLineDown(wxCommandEvent&) { m_browser->LineDown(); }
  111. void OnScrollPageUp(wxCommandEvent&) { m_browser->PageUp(); }
  112. void OnScrollPageDown(wxCommandEvent&) { m_browser->PageDown(); }
  113. void OnRunScript(wxCommandEvent& evt);
  114. void OnClearSelection(wxCommandEvent& evt);
  115. void OnDeleteSelection(wxCommandEvent& evt);
  116. void OnSelectAll(wxCommandEvent& evt);
  117. void OnLoadScheme(wxCommandEvent& evt);
  118. void OnUseMemoryFS(wxCommandEvent& evt);
  119. void OnFind(wxCommandEvent& evt);
  120. void OnFindDone(wxCommandEvent& evt);
  121. void OnFindText(wxCommandEvent& evt);
  122. void OnFindOptions(wxCommandEvent& evt);
  123. void OnEnableContextMenu(wxCommandEvent& evt);
  124. private:
  125. wxTextCtrl* m_url;
  126. wxWebView* m_browser;
  127. wxToolBar* m_toolbar;
  128. wxToolBarToolBase* m_toolbar_back;
  129. wxToolBarToolBase* m_toolbar_forward;
  130. wxToolBarToolBase* m_toolbar_stop;
  131. wxToolBarToolBase* m_toolbar_reload;
  132. wxToolBarToolBase* m_toolbar_tools;
  133. wxToolBarToolBase* m_find_toolbar_done;
  134. wxToolBarToolBase* m_find_toolbar_next;
  135. wxToolBarToolBase* m_find_toolbar_previous;
  136. wxToolBarToolBase* m_find_toolbar_options;
  137. wxMenuItem* m_find_toolbar_wrap;
  138. wxMenuItem* m_find_toolbar_highlight;
  139. wxMenuItem* m_find_toolbar_matchcase;
  140. wxMenuItem* m_find_toolbar_wholeword;
  141. wxMenu* m_tools_menu;
  142. wxMenu* m_tools_history_menu;
  143. wxMenuItem* m_tools_layout;
  144. wxMenuItem* m_tools_tiny;
  145. wxMenuItem* m_tools_small;
  146. wxMenuItem* m_tools_medium;
  147. wxMenuItem* m_tools_large;
  148. wxMenuItem* m_tools_largest;
  149. wxMenuItem* m_tools_handle_navigation;
  150. wxMenuItem* m_tools_handle_new_window;
  151. wxMenuItem* m_tools_enable_history;
  152. wxMenuItem* m_edit_cut;
  153. wxMenuItem* m_edit_copy;
  154. wxMenuItem* m_edit_paste;
  155. wxMenuItem* m_edit_undo;
  156. wxMenuItem* m_edit_redo;
  157. wxMenuItem* m_edit_mode;
  158. wxMenuItem* m_scroll_line_up;
  159. wxMenuItem* m_scroll_line_down;
  160. wxMenuItem* m_scroll_page_up;
  161. wxMenuItem* m_scroll_page_down;
  162. wxMenuItem* m_selection_clear;
  163. wxMenuItem* m_selection_delete;
  164. wxMenuItem* m_find;
  165. wxMenuItem* m_context_menu;
  166. wxInfoBar *m_info;
  167. wxStaticText* m_info_text;
  168. wxTextCtrl* m_find_ctrl;
  169. wxToolBar* m_find_toolbar;
  170. wxMenuHistoryMap m_histMenuItems;
  171. wxString m_findText;
  172. int m_findFlags, m_findCount;
  173. };
  174. class SourceViewDialog : public wxDialog
  175. {
  176. public:
  177. SourceViewDialog(wxWindow* parent, wxString source);
  178. };
  179. IMPLEMENT_APP(WebApp)
  180. // ============================================================================
  181. // implementation
  182. // ============================================================================
  183. bool WebApp::OnInit()
  184. {
  185. if ( !wxApp::OnInit() )
  186. return false;
  187. //Required for virtual file system archive and memory support
  188. wxFileSystem::AddHandler(new wxArchiveFSHandler);
  189. wxFileSystem::AddHandler(new wxMemoryFSHandler);
  190. // Create the memory files
  191. wxImage::AddHandler(new wxPNGHandler);
  192. wxMemoryFSHandler::AddFile("logo.png",
  193. wxBitmap(wxlogo_xpm), wxBITMAP_TYPE_PNG);
  194. wxMemoryFSHandler::AddFile("page1.htm",
  195. "<html><head><title>File System Example</title>"
  196. "<link rel='stylesheet' type='text/css' href='memory:test.css'>"
  197. "</head><body><h1>Page 1</h1>"
  198. "<p><img src='memory:logo.png'></p>"
  199. "<p>Some text about <a href='memory:page2.htm'>Page 2</a>.</p></body>");
  200. wxMemoryFSHandler::AddFile("page2.htm",
  201. "<html><head><title>File System Example</title>"
  202. "<link rel='stylesheet' type='text/css' href='memory:test.css'>"
  203. "</head><body><h1>Page 2</h1>"
  204. "<p><a href='memory:page1.htm'>Page 1</a> was better.</p></body>");
  205. wxMemoryFSHandler::AddFile("test.css", "h1 {color: red;}");
  206. WebFrame *frame = new WebFrame(m_url);
  207. frame->Show();
  208. return true;
  209. }
  210. WebFrame::WebFrame(const wxString& url) :
  211. wxFrame(NULL, wxID_ANY, "wxWebView Sample")
  212. {
  213. // set the frame icon
  214. SetIcon(wxICON(sample));
  215. SetTitle("wxWebView Sample");
  216. wxBoxSizer* topsizer = new wxBoxSizer(wxVERTICAL);
  217. // Create the toolbar
  218. m_toolbar = CreateToolBar(wxTB_TEXT);
  219. m_toolbar->SetToolBitmapSize(wxSize(32, 32));
  220. wxBitmap back = wxArtProvider::GetBitmap(wxART_GO_BACK , wxART_TOOLBAR);
  221. wxBitmap forward = wxArtProvider::GetBitmap(wxART_GO_FORWARD , wxART_TOOLBAR);
  222. #ifdef __WXGTK__
  223. wxBitmap stop = wxArtProvider::GetBitmap("gtk-stop", wxART_TOOLBAR);
  224. #else
  225. wxBitmap stop = wxBitmap(stop_xpm);
  226. #endif
  227. #ifdef __WXGTK__
  228. wxBitmap refresh = wxArtProvider::GetBitmap("gtk-refresh", wxART_TOOLBAR);
  229. #else
  230. wxBitmap refresh = wxBitmap(refresh_xpm);
  231. #endif
  232. m_toolbar_back = m_toolbar->AddTool(wxID_ANY, _("Back"), back);
  233. m_toolbar_forward = m_toolbar->AddTool(wxID_ANY, _("Forward"), forward);
  234. m_toolbar_stop = m_toolbar->AddTool(wxID_ANY, _("Stop"), stop);
  235. m_toolbar_reload = m_toolbar->AddTool(wxID_ANY, _("Reload"), refresh);
  236. m_url = new wxTextCtrl(m_toolbar, wxID_ANY, wxT(""), wxDefaultPosition, wxSize(400, -1), wxTE_PROCESS_ENTER );
  237. m_toolbar->AddControl(m_url, _("URL"));
  238. m_toolbar_tools = m_toolbar->AddTool(wxID_ANY, _("Menu"), wxBitmap(wxlogo_xpm));
  239. m_toolbar->Realize();
  240. // Set find values.
  241. m_findFlags = wxWEBVIEW_FIND_DEFAULT;
  242. m_findText = wxEmptyString;
  243. m_findCount = 0;
  244. // Create panel for find toolbar.
  245. wxPanel* panel = new wxPanel(this);
  246. topsizer->Add(panel, wxSizerFlags().Expand());
  247. // Create sizer for panel.
  248. wxBoxSizer* panel_sizer = new wxBoxSizer(wxVERTICAL);
  249. panel->SetSizer(panel_sizer);
  250. // Create the find toolbar.
  251. m_find_toolbar = new wxToolBar(panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTB_HORIZONTAL|wxTB_TEXT|wxTB_HORZ_LAYOUT);
  252. m_find_toolbar->Hide();
  253. panel_sizer->Add(m_find_toolbar, wxSizerFlags().Expand());
  254. // Create find control.
  255. m_find_ctrl = new wxTextCtrl(m_find_toolbar, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(140,-1), wxTE_PROCESS_ENTER);
  256. //Find options menu
  257. wxMenu* findmenu = new wxMenu;
  258. m_find_toolbar_wrap = findmenu->AppendCheckItem(wxID_ANY,"Wrap");
  259. m_find_toolbar_matchcase = findmenu->AppendCheckItem(wxID_ANY,"Match Case");
  260. m_find_toolbar_wholeword = findmenu->AppendCheckItem(wxID_ANY,"Entire Word");
  261. m_find_toolbar_highlight = findmenu->AppendCheckItem(wxID_ANY,"Highlight");
  262. // Add find toolbar tools.
  263. m_find_toolbar->SetToolSeparation(7);
  264. m_find_toolbar_done = m_find_toolbar->AddTool(wxID_ANY, "Close", wxArtProvider::GetBitmap(wxART_CROSS_MARK));
  265. m_find_toolbar->AddSeparator();
  266. m_find_toolbar->AddControl(m_find_ctrl, "Find");
  267. m_find_toolbar->AddSeparator();
  268. m_find_toolbar_next = m_find_toolbar->AddTool(wxID_ANY, "Next", wxArtProvider::GetBitmap(wxART_GO_DOWN, wxART_TOOLBAR, wxSize(16,16)));
  269. m_find_toolbar_previous = m_find_toolbar->AddTool(wxID_ANY, "Previous", wxArtProvider::GetBitmap(wxART_GO_UP, wxART_TOOLBAR, wxSize(16,16)));
  270. m_find_toolbar->AddSeparator();
  271. m_find_toolbar_options = m_find_toolbar->AddTool(wxID_ANY, "Options", wxArtProvider::GetBitmap(wxART_PLUS, wxART_TOOLBAR, wxSize(16,16)), "", wxITEM_DROPDOWN);
  272. m_find_toolbar_options->SetDropdownMenu(findmenu);
  273. m_find_toolbar->Realize();
  274. // Create the info panel
  275. m_info = new wxInfoBar(this);
  276. topsizer->Add(m_info, wxSizerFlags().Expand());
  277. // Create the webview
  278. m_browser = wxWebView::New(this, wxID_ANY, url);
  279. topsizer->Add(m_browser, wxSizerFlags().Expand().Proportion(1));
  280. //We register the wxfs:// protocol for testing purposes
  281. m_browser->RegisterHandler(wxSharedPtr<wxWebViewHandler>(new wxWebViewArchiveHandler("wxfs")));
  282. //And the memory: file system
  283. m_browser->RegisterHandler(wxSharedPtr<wxWebViewHandler>(new wxWebViewFSHandler("memory")));
  284. SetSizer(topsizer);
  285. //Set a more sensible size for web browsing
  286. SetSize(wxSize(800, 600));
  287. // Create a log window
  288. new wxLogWindow(this, _("Logging"), true, false);
  289. // Create the Tools menu
  290. m_tools_menu = new wxMenu();
  291. wxMenuItem* print = m_tools_menu->Append(wxID_ANY , _("Print"));
  292. wxMenuItem* viewSource = m_tools_menu->Append(wxID_ANY , _("View Source"));
  293. m_tools_menu->AppendSeparator();
  294. m_tools_layout = m_tools_menu->AppendCheckItem(wxID_ANY, _("Use Layout Zoom"));
  295. m_tools_tiny = m_tools_menu->AppendCheckItem(wxID_ANY, _("Tiny"));
  296. m_tools_small = m_tools_menu->AppendCheckItem(wxID_ANY, _("Small"));
  297. m_tools_medium = m_tools_menu->AppendCheckItem(wxID_ANY, _("Medium"));
  298. m_tools_large = m_tools_menu->AppendCheckItem(wxID_ANY, _("Large"));
  299. m_tools_largest = m_tools_menu->AppendCheckItem(wxID_ANY, _("Largest"));
  300. m_tools_menu->AppendSeparator();
  301. m_tools_handle_navigation = m_tools_menu->AppendCheckItem(wxID_ANY, _("Handle Navigation"));
  302. m_tools_handle_new_window = m_tools_menu->AppendCheckItem(wxID_ANY, _("Handle New Windows"));
  303. m_tools_menu->AppendSeparator();
  304. //Find
  305. m_find = m_tools_menu->Append(wxID_ANY, _("Find"));
  306. m_tools_menu->AppendSeparator();
  307. //History menu
  308. m_tools_history_menu = new wxMenu();
  309. wxMenuItem* clearhist = m_tools_history_menu->Append(wxID_ANY, _("Clear History"));
  310. m_tools_enable_history = m_tools_history_menu->AppendCheckItem(wxID_ANY, _("Enable History"));
  311. m_tools_history_menu->AppendSeparator();
  312. m_tools_menu->AppendSubMenu(m_tools_history_menu, "History");
  313. //Create an editing menu
  314. wxMenu* editmenu = new wxMenu();
  315. m_edit_cut = editmenu->Append(wxID_ANY, _("Cut"));
  316. m_edit_copy = editmenu->Append(wxID_ANY, _("Copy"));
  317. m_edit_paste = editmenu->Append(wxID_ANY, _("Paste"));
  318. editmenu->AppendSeparator();
  319. m_edit_undo = editmenu->Append(wxID_ANY, _("Undo"));
  320. m_edit_redo = editmenu->Append(wxID_ANY, _("Redo"));
  321. editmenu->AppendSeparator();
  322. m_edit_mode = editmenu->AppendCheckItem(wxID_ANY, _("Edit Mode"));
  323. m_tools_menu->AppendSeparator();
  324. m_tools_menu->AppendSubMenu(editmenu, "Edit");
  325. wxMenu* scroll_menu = new wxMenu;
  326. m_scroll_line_up = scroll_menu->Append(wxID_ANY, "Line &up");
  327. m_scroll_line_down = scroll_menu->Append(wxID_ANY, "Line &down");
  328. m_scroll_page_up = scroll_menu->Append(wxID_ANY, "Page u&p");
  329. m_scroll_page_down = scroll_menu->Append(wxID_ANY, "Page d&own");
  330. m_tools_menu->AppendSubMenu(scroll_menu, "Scroll");
  331. wxMenuItem* script = m_tools_menu->Append(wxID_ANY, _("Run Script"));
  332. //Selection menu
  333. wxMenu* selection = new wxMenu();
  334. m_selection_clear = selection->Append(wxID_ANY, _("Clear Selection"));
  335. m_selection_delete = selection->Append(wxID_ANY, _("Delete Selection"));
  336. wxMenuItem* selectall = selection->Append(wxID_ANY, _("Select All"));
  337. editmenu->AppendSubMenu(selection, "Selection");
  338. wxMenuItem* loadscheme = m_tools_menu->Append(wxID_ANY, _("Custom Scheme Example"));
  339. wxMenuItem* usememoryfs = m_tools_menu->Append(wxID_ANY, _("Memory File System Example"));
  340. m_context_menu = m_tools_menu->AppendCheckItem(wxID_ANY, _("Enable Context Menu"));
  341. //By default we want to handle navigation and new windows
  342. m_tools_handle_navigation->Check();
  343. m_tools_handle_new_window->Check();
  344. m_tools_enable_history->Check();
  345. if(!m_browser->CanSetZoomType(wxWEBVIEW_ZOOM_TYPE_LAYOUT))
  346. m_tools_layout->Enable(false);
  347. // Connect the toolbar events
  348. Connect(m_toolbar_back->GetId(), wxEVT_TOOL,
  349. wxCommandEventHandler(WebFrame::OnBack), NULL, this );
  350. Connect(m_toolbar_forward->GetId(), wxEVT_TOOL,
  351. wxCommandEventHandler(WebFrame::OnForward), NULL, this );
  352. Connect(m_toolbar_stop->GetId(), wxEVT_TOOL,
  353. wxCommandEventHandler(WebFrame::OnStop), NULL, this );
  354. Connect(m_toolbar_reload->GetId(), wxEVT_TOOL,
  355. wxCommandEventHandler(WebFrame::OnReload),NULL, this );
  356. Connect(m_toolbar_tools->GetId(), wxEVT_TOOL,
  357. wxCommandEventHandler(WebFrame::OnToolsClicked), NULL, this );
  358. Connect(m_url->GetId(), wxEVT_TEXT_ENTER,
  359. wxCommandEventHandler(WebFrame::OnUrl), NULL, this );
  360. // Connect find toolbar events.
  361. Connect(m_find_toolbar_done->GetId(), wxEVT_TOOL,
  362. wxCommandEventHandler(WebFrame::OnFindDone), NULL, this );
  363. Connect(m_find_toolbar_next->GetId(), wxEVT_TOOL,
  364. wxCommandEventHandler(WebFrame::OnFindText), NULL, this );
  365. Connect(m_find_toolbar_previous->GetId(), wxEVT_TOOL,
  366. wxCommandEventHandler(WebFrame::OnFindText), NULL, this );
  367. // Connect find control events.
  368. Connect(m_find_ctrl->GetId(), wxEVT_TEXT,
  369. wxCommandEventHandler(WebFrame::OnFindText), NULL, this );
  370. Connect(m_find_ctrl->GetId(), wxEVT_TEXT_ENTER,
  371. wxCommandEventHandler(WebFrame::OnFindText), NULL, this );
  372. // Connect the webview events
  373. Connect(m_browser->GetId(), wxEVT_WEBVIEW_NAVIGATING,
  374. wxWebViewEventHandler(WebFrame::OnNavigationRequest), NULL, this);
  375. Connect(m_browser->GetId(), wxEVT_WEBVIEW_NAVIGATED,
  376. wxWebViewEventHandler(WebFrame::OnNavigationComplete), NULL, this);
  377. Connect(m_browser->GetId(), wxEVT_WEBVIEW_LOADED,
  378. wxWebViewEventHandler(WebFrame::OnDocumentLoaded), NULL, this);
  379. Connect(m_browser->GetId(), wxEVT_WEBVIEW_ERROR,
  380. wxWebViewEventHandler(WebFrame::OnError), NULL, this);
  381. Connect(m_browser->GetId(), wxEVT_WEBVIEW_NEWWINDOW,
  382. wxWebViewEventHandler(WebFrame::OnNewWindow), NULL, this);
  383. Connect(m_browser->GetId(), wxEVT_WEBVIEW_TITLE_CHANGED,
  384. wxWebViewEventHandler(WebFrame::OnTitleChanged), NULL, this);
  385. // Connect the menu events
  386. Connect(viewSource->GetId(), wxEVT_MENU,
  387. wxCommandEventHandler(WebFrame::OnViewSourceRequest), NULL, this );
  388. Connect(print->GetId(), wxEVT_MENU,
  389. wxCommandEventHandler(WebFrame::OnPrint), NULL, this );
  390. Connect(m_tools_layout->GetId(), wxEVT_MENU,
  391. wxCommandEventHandler(WebFrame::OnZoomLayout), NULL, this );
  392. Connect(m_tools_tiny->GetId(), wxEVT_MENU,
  393. wxCommandEventHandler(WebFrame::OnSetZoom), NULL, this );
  394. Connect(m_tools_small->GetId(), wxEVT_MENU,
  395. wxCommandEventHandler(WebFrame::OnSetZoom), NULL, this );
  396. Connect(m_tools_medium->GetId(), wxEVT_MENU,
  397. wxCommandEventHandler(WebFrame::OnSetZoom), NULL, this );
  398. Connect(m_tools_large->GetId(), wxEVT_MENU,
  399. wxCommandEventHandler(WebFrame::OnSetZoom), NULL, this );
  400. Connect(m_tools_largest->GetId(), wxEVT_MENU,
  401. wxCommandEventHandler(WebFrame::OnSetZoom), NULL, this );
  402. Connect(clearhist->GetId(), wxEVT_MENU,
  403. wxCommandEventHandler(WebFrame::OnClearHistory), NULL, this );
  404. Connect(m_tools_enable_history->GetId(), wxEVT_MENU,
  405. wxCommandEventHandler(WebFrame::OnEnableHistory), NULL, this );
  406. Connect(m_edit_cut->GetId(), wxEVT_MENU,
  407. wxCommandEventHandler(WebFrame::OnCut), NULL, this );
  408. Connect(m_edit_copy->GetId(), wxEVT_MENU,
  409. wxCommandEventHandler(WebFrame::OnCopy), NULL, this );
  410. Connect(m_edit_paste->GetId(), wxEVT_MENU,
  411. wxCommandEventHandler(WebFrame::OnPaste), NULL, this );
  412. Connect(m_edit_undo->GetId(), wxEVT_MENU,
  413. wxCommandEventHandler(WebFrame::OnUndo), NULL, this );
  414. Connect(m_edit_redo->GetId(), wxEVT_MENU,
  415. wxCommandEventHandler(WebFrame::OnRedo), NULL, this );
  416. Connect(m_edit_mode->GetId(), wxEVT_MENU,
  417. wxCommandEventHandler(WebFrame::OnMode), NULL, this );
  418. Connect(m_scroll_line_up->GetId(), wxEVT_MENU,
  419. wxCommandEventHandler(WebFrame::OnScrollLineUp), NULL, this );
  420. Connect(m_scroll_line_down->GetId(), wxEVT_MENU,
  421. wxCommandEventHandler(WebFrame::OnScrollLineDown), NULL, this );
  422. Connect(m_scroll_page_up->GetId(), wxEVT_MENU,
  423. wxCommandEventHandler(WebFrame::OnScrollPageUp), NULL, this );
  424. Connect(m_scroll_page_down->GetId(), wxEVT_MENU,
  425. wxCommandEventHandler(WebFrame::OnScrollPageDown), NULL, this );
  426. Connect(script->GetId(), wxEVT_MENU,
  427. wxCommandEventHandler(WebFrame::OnRunScript), NULL, this );
  428. Connect(m_selection_clear->GetId(), wxEVT_MENU,
  429. wxCommandEventHandler(WebFrame::OnClearSelection), NULL, this );
  430. Connect(m_selection_delete->GetId(), wxEVT_MENU,
  431. wxCommandEventHandler(WebFrame::OnDeleteSelection), NULL, this );
  432. Connect(selectall->GetId(), wxEVT_MENU,
  433. wxCommandEventHandler(WebFrame::OnSelectAll), NULL, this );
  434. Connect(loadscheme->GetId(), wxEVT_MENU,
  435. wxCommandEventHandler(WebFrame::OnLoadScheme), NULL, this );
  436. Connect(usememoryfs->GetId(), wxEVT_MENU,
  437. wxCommandEventHandler(WebFrame::OnUseMemoryFS), NULL, this );
  438. Connect(m_find->GetId(), wxEVT_MENU,
  439. wxCommandEventHandler(WebFrame::OnFind), NULL, this );
  440. Connect(m_context_menu->GetId(), wxEVT_MENU,
  441. wxCommandEventHandler(WebFrame::OnEnableContextMenu), NULL, this );
  442. //Connect the idle events
  443. Connect(wxID_ANY, wxEVT_IDLE, wxIdleEventHandler(WebFrame::OnIdle), NULL, this);
  444. }
  445. WebFrame::~WebFrame()
  446. {
  447. delete m_tools_menu;
  448. }
  449. /**
  450. * Method that retrieves the current state from the web control and updates the GUI
  451. * the reflect this current state.
  452. */
  453. void WebFrame::UpdateState()
  454. {
  455. m_toolbar->EnableTool( m_toolbar_back->GetId(), m_browser->CanGoBack() );
  456. m_toolbar->EnableTool( m_toolbar_forward->GetId(), m_browser->CanGoForward() );
  457. if (m_browser->IsBusy())
  458. {
  459. m_toolbar->EnableTool( m_toolbar_stop->GetId(), true );
  460. }
  461. else
  462. {
  463. m_toolbar->EnableTool( m_toolbar_stop->GetId(), false );
  464. }
  465. SetTitle( m_browser->GetCurrentTitle() );
  466. m_url->SetValue( m_browser->GetCurrentURL() );
  467. }
  468. void WebFrame::OnIdle(wxIdleEvent& WXUNUSED(evt))
  469. {
  470. if(m_browser->IsBusy())
  471. {
  472. wxSetCursor(wxCURSOR_ARROWWAIT);
  473. m_toolbar->EnableTool(m_toolbar_stop->GetId(), true);
  474. }
  475. else
  476. {
  477. wxSetCursor(wxNullCursor);
  478. m_toolbar->EnableTool(m_toolbar_stop->GetId(), false);
  479. }
  480. }
  481. /**
  482. * Callback invoked when user entered an URL and pressed enter
  483. */
  484. void WebFrame::OnUrl(wxCommandEvent& WXUNUSED(evt))
  485. {
  486. m_browser->LoadURL( m_url->GetValue() );
  487. m_browser->SetFocus();
  488. UpdateState();
  489. }
  490. /**
  491. * Callback invoked when user pressed the "back" button
  492. */
  493. void WebFrame::OnBack(wxCommandEvent& WXUNUSED(evt))
  494. {
  495. m_browser->GoBack();
  496. UpdateState();
  497. }
  498. /**
  499. * Callback invoked when user pressed the "forward" button
  500. */
  501. void WebFrame::OnForward(wxCommandEvent& WXUNUSED(evt))
  502. {
  503. m_browser->GoForward();
  504. UpdateState();
  505. }
  506. /**
  507. * Callback invoked when user pressed the "stop" button
  508. */
  509. void WebFrame::OnStop(wxCommandEvent& WXUNUSED(evt))
  510. {
  511. m_browser->Stop();
  512. UpdateState();
  513. }
  514. /**
  515. * Callback invoked when user pressed the "reload" button
  516. */
  517. void WebFrame::OnReload(wxCommandEvent& WXUNUSED(evt))
  518. {
  519. m_browser->Reload();
  520. UpdateState();
  521. }
  522. void WebFrame::OnClearHistory(wxCommandEvent& WXUNUSED(evt))
  523. {
  524. m_browser->ClearHistory();
  525. UpdateState();
  526. }
  527. void WebFrame::OnEnableHistory(wxCommandEvent& WXUNUSED(evt))
  528. {
  529. m_browser->EnableHistory(m_tools_enable_history->IsChecked());
  530. UpdateState();
  531. }
  532. void WebFrame::OnCut(wxCommandEvent& WXUNUSED(evt))
  533. {
  534. m_browser->Cut();
  535. }
  536. void WebFrame::OnCopy(wxCommandEvent& WXUNUSED(evt))
  537. {
  538. m_browser->Copy();
  539. }
  540. void WebFrame::OnPaste(wxCommandEvent& WXUNUSED(evt))
  541. {
  542. m_browser->Paste();
  543. }
  544. void WebFrame::OnUndo(wxCommandEvent& WXUNUSED(evt))
  545. {
  546. m_browser->Undo();
  547. }
  548. void WebFrame::OnRedo(wxCommandEvent& WXUNUSED(evt))
  549. {
  550. m_browser->Redo();
  551. }
  552. void WebFrame::OnMode(wxCommandEvent& WXUNUSED(evt))
  553. {
  554. m_browser->SetEditable(m_edit_mode->IsChecked());
  555. }
  556. void WebFrame::OnLoadScheme(wxCommandEvent& WXUNUSED(evt))
  557. {
  558. wxFileName helpfile("../help/doc.zip");
  559. helpfile.MakeAbsolute();
  560. wxString path = helpfile.GetFullPath();
  561. //Under MSW we need to flip the slashes
  562. path.Replace("\\", "/");
  563. path = "wxfs:///" + path + ";protocol=zip/doc.htm";
  564. m_browser->LoadURL(path);
  565. }
  566. void WebFrame::OnUseMemoryFS(wxCommandEvent& WXUNUSED(evt))
  567. {
  568. m_browser->LoadURL("memory:page1.htm");
  569. }
  570. void WebFrame::OnEnableContextMenu(wxCommandEvent& evt)
  571. {
  572. m_browser->EnableContextMenu(evt.IsChecked());
  573. }
  574. void WebFrame::OnFind(wxCommandEvent& WXUNUSED(evt))
  575. {
  576. wxString value = m_browser->GetSelectedText();
  577. if(value.Len() > 150)
  578. {
  579. value.Truncate(150);
  580. }
  581. m_find_ctrl->SetValue(value);
  582. if(!m_find_toolbar->IsShown()){
  583. m_find_toolbar->Show(true);
  584. SendSizeEvent();
  585. }
  586. m_find_ctrl->SelectAll();
  587. }
  588. void WebFrame::OnFindDone(wxCommandEvent& WXUNUSED(evt))
  589. {
  590. m_browser->Find("");
  591. m_find_toolbar->Show(false);
  592. SendSizeEvent();
  593. }
  594. void WebFrame::OnFindText(wxCommandEvent& evt)
  595. {
  596. int flags = 0;
  597. if(m_find_toolbar_wrap->IsChecked())
  598. flags |= wxWEBVIEW_FIND_WRAP;
  599. if(m_find_toolbar_wholeword->IsChecked())
  600. flags |= wxWEBVIEW_FIND_ENTIRE_WORD;
  601. if(m_find_toolbar_matchcase->IsChecked())
  602. flags |= wxWEBVIEW_FIND_MATCH_CASE;
  603. if(m_find_toolbar_highlight->IsChecked())
  604. flags |= wxWEBVIEW_FIND_HIGHLIGHT_RESULT;
  605. if(m_find_toolbar_previous->GetId() == evt.GetId())
  606. flags |= wxWEBVIEW_FIND_BACKWARDS;
  607. wxString find_text = m_find_ctrl->GetValue();
  608. long count = m_browser->Find(find_text, flags);
  609. if(m_findText != find_text)
  610. {
  611. m_findCount = count;
  612. m_findText = find_text;
  613. }
  614. if(count != wxNOT_FOUND || find_text.IsEmpty())
  615. {
  616. m_find_ctrl->SetBackgroundColour(*wxWHITE);
  617. }
  618. else
  619. {
  620. m_find_ctrl->SetBackgroundColour(wxColour(255, 101, 101));
  621. }
  622. m_find_ctrl->Refresh();
  623. //Log the result, note that count is zero indexed.
  624. if(count != m_findCount)
  625. {
  626. count++;
  627. }
  628. wxLogMessage("Searching for:%s current match:%i/%i", m_findText.c_str(), count, m_findCount);
  629. }
  630. /**
  631. * Callback invoked when there is a request to load a new page (for instance
  632. * when the user clicks a link)
  633. */
  634. void WebFrame::OnNavigationRequest(wxWebViewEvent& evt)
  635. {
  636. if(m_info->IsShown())
  637. {
  638. m_info->Dismiss();
  639. }
  640. wxLogMessage("%s", "Navigation request to '" + evt.GetURL() + "' (target='" +
  641. evt.GetTarget() + "')");
  642. wxASSERT(m_browser->IsBusy());
  643. //If we don't want to handle navigation then veto the event and navigation
  644. //will not take place, we also need to stop the loading animation
  645. if(!m_tools_handle_navigation->IsChecked())
  646. {
  647. evt.Veto();
  648. m_toolbar->EnableTool( m_toolbar_stop->GetId(), false );
  649. }
  650. else
  651. {
  652. UpdateState();
  653. }
  654. }
  655. /**
  656. * Callback invoked when a navigation request was accepted
  657. */
  658. void WebFrame::OnNavigationComplete(wxWebViewEvent& evt)
  659. {
  660. wxLogMessage("%s", "Navigation complete; url='" + evt.GetURL() + "'");
  661. UpdateState();
  662. }
  663. /**
  664. * Callback invoked when a page is finished loading
  665. */
  666. void WebFrame::OnDocumentLoaded(wxWebViewEvent& evt)
  667. {
  668. //Only notify if the document is the main frame, not a subframe
  669. if(evt.GetURL() == m_browser->GetCurrentURL())
  670. {
  671. wxLogMessage("%s", "Document loaded; url='" + evt.GetURL() + "'");
  672. }
  673. UpdateState();
  674. }
  675. /**
  676. * On new window, we veto to stop extra windows appearing
  677. */
  678. void WebFrame::OnNewWindow(wxWebViewEvent& evt)
  679. {
  680. wxLogMessage("%s", "New window; url='" + evt.GetURL() + "'");
  681. //If we handle new window events then just load them in this window as we
  682. //are a single window browser
  683. if(m_tools_handle_new_window->IsChecked())
  684. m_browser->LoadURL(evt.GetURL());
  685. UpdateState();
  686. }
  687. void WebFrame::OnTitleChanged(wxWebViewEvent& evt)
  688. {
  689. SetTitle(evt.GetString());
  690. wxLogMessage("%s", "Title changed; title='" + evt.GetString() + "'");
  691. }
  692. /**
  693. * Invoked when user selects the "View Source" menu item
  694. */
  695. void WebFrame::OnViewSourceRequest(wxCommandEvent& WXUNUSED(evt))
  696. {
  697. SourceViewDialog dlg(this, m_browser->GetPageSource());
  698. dlg.ShowModal();
  699. }
  700. /**
  701. * Invoked when user selects the "Menu" item
  702. */
  703. void WebFrame::OnToolsClicked(wxCommandEvent& WXUNUSED(evt))
  704. {
  705. if(m_browser->GetCurrentURL() == "")
  706. return;
  707. m_tools_tiny->Check(false);
  708. m_tools_small->Check(false);
  709. m_tools_medium->Check(false);
  710. m_tools_large->Check(false);
  711. m_tools_largest->Check(false);
  712. wxWebViewZoom zoom = m_browser->GetZoom();
  713. switch (zoom)
  714. {
  715. case wxWEBVIEW_ZOOM_TINY:
  716. m_tools_tiny->Check();
  717. break;
  718. case wxWEBVIEW_ZOOM_SMALL:
  719. m_tools_small->Check();
  720. break;
  721. case wxWEBVIEW_ZOOM_MEDIUM:
  722. m_tools_medium->Check();
  723. break;
  724. case wxWEBVIEW_ZOOM_LARGE:
  725. m_tools_large->Check();
  726. break;
  727. case wxWEBVIEW_ZOOM_LARGEST:
  728. m_tools_largest->Check();
  729. break;
  730. }
  731. m_edit_cut->Enable(m_browser->CanCut());
  732. m_edit_copy->Enable(m_browser->CanCopy());
  733. m_edit_paste->Enable(m_browser->CanPaste());
  734. m_edit_undo->Enable(m_browser->CanUndo());
  735. m_edit_redo->Enable(m_browser->CanRedo());
  736. m_selection_clear->Enable(m_browser->HasSelection());
  737. m_selection_delete->Enable(m_browser->HasSelection());
  738. m_context_menu->Check(m_browser->IsContextMenuEnabled());
  739. //Firstly we clear the existing menu items, then we add the current ones
  740. wxMenuHistoryMap::const_iterator it;
  741. for( it = m_histMenuItems.begin(); it != m_histMenuItems.end(); ++it )
  742. {
  743. m_tools_history_menu->Destroy(it->first);
  744. }
  745. m_histMenuItems.clear();
  746. wxVector<wxSharedPtr<wxWebViewHistoryItem> > back = m_browser->GetBackwardHistory();
  747. wxVector<wxSharedPtr<wxWebViewHistoryItem> > forward = m_browser->GetForwardHistory();
  748. wxMenuItem* item;
  749. unsigned int i;
  750. for(i = 0; i < back.size(); i++)
  751. {
  752. item = m_tools_history_menu->AppendRadioItem(wxID_ANY, back[i]->GetTitle());
  753. m_histMenuItems[item->GetId()] = back[i];
  754. Connect(item->GetId(), wxEVT_MENU,
  755. wxCommandEventHandler(WebFrame::OnHistory), NULL, this );
  756. }
  757. wxString title = m_browser->GetCurrentTitle();
  758. if ( title.empty() )
  759. title = "(untitled)";
  760. item = m_tools_history_menu->AppendRadioItem(wxID_ANY, title);
  761. item->Check();
  762. //No need to connect the current item
  763. m_histMenuItems[item->GetId()] = wxSharedPtr<wxWebViewHistoryItem>(new wxWebViewHistoryItem(m_browser->GetCurrentURL(), m_browser->GetCurrentTitle()));
  764. for(i = 0; i < forward.size(); i++)
  765. {
  766. item = m_tools_history_menu->AppendRadioItem(wxID_ANY, forward[i]->GetTitle());
  767. m_histMenuItems[item->GetId()] = forward[i];
  768. Connect(item->GetId(), wxEVT_TOOL,
  769. wxCommandEventHandler(WebFrame::OnHistory), NULL, this );
  770. }
  771. wxPoint position = ScreenToClient( wxGetMousePosition() );
  772. PopupMenu(m_tools_menu, position.x, position.y);
  773. }
  774. /**
  775. * Invoked when user selects the zoom size in the menu
  776. */
  777. void WebFrame::OnSetZoom(wxCommandEvent& evt)
  778. {
  779. if (evt.GetId() == m_tools_tiny->GetId())
  780. {
  781. m_browser->SetZoom(wxWEBVIEW_ZOOM_TINY);
  782. }
  783. else if (evt.GetId() == m_tools_small->GetId())
  784. {
  785. m_browser->SetZoom(wxWEBVIEW_ZOOM_SMALL);
  786. }
  787. else if (evt.GetId() == m_tools_medium->GetId())
  788. {
  789. m_browser->SetZoom(wxWEBVIEW_ZOOM_MEDIUM);
  790. }
  791. else if (evt.GetId() == m_tools_large->GetId())
  792. {
  793. m_browser->SetZoom(wxWEBVIEW_ZOOM_LARGE);
  794. }
  795. else if (evt.GetId() == m_tools_largest->GetId())
  796. {
  797. m_browser->SetZoom(wxWEBVIEW_ZOOM_LARGEST);
  798. }
  799. else
  800. {
  801. wxFAIL;
  802. }
  803. }
  804. void WebFrame::OnZoomLayout(wxCommandEvent& WXUNUSED(evt))
  805. {
  806. if(m_tools_layout->IsChecked())
  807. m_browser->SetZoomType(wxWEBVIEW_ZOOM_TYPE_LAYOUT);
  808. else
  809. m_browser->SetZoomType(wxWEBVIEW_ZOOM_TYPE_TEXT);
  810. }
  811. void WebFrame::OnHistory(wxCommandEvent& evt)
  812. {
  813. m_browser->LoadHistoryItem(m_histMenuItems[evt.GetId()]);
  814. }
  815. void WebFrame::OnRunScript(wxCommandEvent& WXUNUSED(evt))
  816. {
  817. wxTextEntryDialog dialog(this, "Enter JavaScript to run.", wxGetTextFromUserPromptStr, "", wxOK|wxCANCEL|wxCENTRE|wxTE_MULTILINE);
  818. if(dialog.ShowModal() == wxID_OK)
  819. {
  820. m_browser->RunScript(dialog.GetValue());
  821. }
  822. }
  823. void WebFrame::OnClearSelection(wxCommandEvent& WXUNUSED(evt))
  824. {
  825. m_browser->ClearSelection();
  826. }
  827. void WebFrame::OnDeleteSelection(wxCommandEvent& WXUNUSED(evt))
  828. {
  829. m_browser->DeleteSelection();
  830. }
  831. void WebFrame::OnSelectAll(wxCommandEvent& WXUNUSED(evt))
  832. {
  833. m_browser->SelectAll();
  834. }
  835. /**
  836. * Callback invoked when a loading error occurs
  837. */
  838. void WebFrame::OnError(wxWebViewEvent& evt)
  839. {
  840. #define WX_ERROR_CASE(type) \
  841. case type: \
  842. category = #type; \
  843. break;
  844. wxString category;
  845. switch (evt.GetInt())
  846. {
  847. WX_ERROR_CASE(wxWEBVIEW_NAV_ERR_CONNECTION);
  848. WX_ERROR_CASE(wxWEBVIEW_NAV_ERR_CERTIFICATE);
  849. WX_ERROR_CASE(wxWEBVIEW_NAV_ERR_AUTH);
  850. WX_ERROR_CASE(wxWEBVIEW_NAV_ERR_SECURITY);
  851. WX_ERROR_CASE(wxWEBVIEW_NAV_ERR_NOT_FOUND);
  852. WX_ERROR_CASE(wxWEBVIEW_NAV_ERR_REQUEST);
  853. WX_ERROR_CASE(wxWEBVIEW_NAV_ERR_USER_CANCELLED);
  854. WX_ERROR_CASE(wxWEBVIEW_NAV_ERR_OTHER);
  855. }
  856. wxLogMessage("%s", "Error; url='" + evt.GetURL() + "', error='" + category + " (" + evt.GetString() + ")'");
  857. //Show the info bar with an error
  858. m_info->ShowMessage(_("An error occurred loading ") + evt.GetURL() + "\n" +
  859. "'" + category + "'", wxICON_ERROR);
  860. UpdateState();
  861. }
  862. /**
  863. * Invoked when user selects "Print" from the menu
  864. */
  865. void WebFrame::OnPrint(wxCommandEvent& WXUNUSED(evt))
  866. {
  867. m_browser->Print();
  868. }
  869. SourceViewDialog::SourceViewDialog(wxWindow* parent, wxString source) :
  870. wxDialog(parent, wxID_ANY, "Source Code",
  871. wxDefaultPosition, wxSize(700,500),
  872. wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)
  873. {
  874. wxStyledTextCtrl* text = new wxStyledTextCtrl(this, wxID_ANY);
  875. text->SetMarginWidth(1, 30);
  876. text->SetMarginType(1, wxSTC_MARGIN_NUMBER);
  877. text->SetText(source);
  878. text->StyleClearAll();
  879. text->SetLexer(wxSTC_LEX_HTML);
  880. text->StyleSetForeground(wxSTC_H_DOUBLESTRING, wxColour(255,0,0));
  881. text->StyleSetForeground(wxSTC_H_SINGLESTRING, wxColour(255,0,0));
  882. text->StyleSetForeground(wxSTC_H_ENTITY, wxColour(255,0,0));
  883. text->StyleSetForeground(wxSTC_H_TAG, wxColour(0,150,0));
  884. text->StyleSetForeground(wxSTC_H_TAGUNKNOWN, wxColour(0,150,0));
  885. text->StyleSetForeground(wxSTC_H_ATTRIBUTE, wxColour(0,0,150));
  886. text->StyleSetForeground(wxSTC_H_ATTRIBUTEUNKNOWN, wxColour(0,0,150));
  887. text->StyleSetForeground(wxSTC_H_COMMENT, wxColour(150,150,150));
  888. wxBoxSizer* sizer = new wxBoxSizer(wxVERTICAL);
  889. sizer->Add(text, 1, wxEXPAND);
  890. SetSizer(sizer);
  891. }