1 /*
2  * This file is part of the Code::Blocks IDE and licensed under the GNU General Public License, version 3
3  * http://www.gnu.org/licenses/gpl-3.0.html
4  *
5  * $Revision: 10268 $
6  * $Id: EmbeddedHtmlPanel.cpp 10268 2015-05-15 10:56:55Z jenslody $
7  * $HeadURL: svn://svn.code.sf.net/p/codeblocks/code/branches/release-20.xx/src/plugins/defaultmimehandler/EmbeddedHtmlPanel.cpp $
8  */
9 
10 #include "sdk.h"
11 #include "EmbeddedHtmlPanel.h"
12 
13 #ifndef CB_PRECOMP
14     //(*InternalHeadersPCH(EmbeddedHtmlPanel)
15     #include <wx/bmpbuttn.h>
16     #include <wx/sizer.h>
17     #include <wx/string.h>
18     #include <wx/intl.h>
19     #include <wx/stattext.h>
20     //*)
21 #endif
22 //(*InternalHeaders(EmbeddedHtmlPanel)
23 #include <wx/bitmap.h>
24 #include <wx/image.h>
25 #include <wx/html/htmlwin.h>
26 #include <wx/artprov.h>
27 //*)
28 
29 //(*IdInit(EmbeddedHtmlPanel)
30 const long EmbeddedHtmlPanel::ID_BITMAPBUTTON2 = wxNewId();
31 const long EmbeddedHtmlPanel::ID_BITMAPBUTTON3 = wxNewId();
32 const long EmbeddedHtmlPanel::ID_STATICTEXT1 = wxNewId();
33 const long EmbeddedHtmlPanel::ID_PANEL1 = wxNewId();
34 const long EmbeddedHtmlPanel::ID_HTMLWINDOW1 = wxNewId();
35 //*)
36 
37 // (shamelessly stolen from help plugin)
38 // build all HTML font sizes (1..7) from the given base size
wxBuildFontSizes(int * sizes,int size)39 inline void wxBuildFontSizes(int *sizes, int size)
40 {
41     // using a fixed factor (1.2, from CSS2) is a bad idea as explained at
42     // http://www.w3.org/TR/CSS21/fonts.html#font-size-props but this is by far
43     // simplest thing to do so still do it like this for now
44     sizes[0] = int(size * 0.75); // exception to 1.2 rule, otherwise too small
45     sizes[1] = int(size * 0.83);
46     sizes[2] = size;
47     sizes[3] = int(size * 1.2);
48     sizes[4] = int(size * 1.44);
49     sizes[5] = int(size * 1.73);
50     sizes[6] = int(size * 2);
51 }
52 
53 // (shamelessly stolen from help plugin)
wxGetDefaultHTMLFontSize()54 inline int wxGetDefaultHTMLFontSize()
55 {
56     // base the default font size on the size of the default system font but
57     // also ensure that we have a font of reasonable size, otherwise small HTML
58     // fonts are unreadable
59     int size = wxNORMAL_FONT->GetPointSize();
60     if ( size < 10 )
61         size = 10;
62 
63     return size;
64 }
65 
BEGIN_EVENT_TABLE(EmbeddedHtmlPanel,wxPanel)66 BEGIN_EVENT_TABLE(EmbeddedHtmlPanel,wxPanel)
67     //(*EventTable(EmbeddedHtmlPanel)
68     //*)
69     EVT_UPDATE_UI(-1, EmbeddedHtmlPanel::OnUpdateUI)
70     EVT_HTML_LINK_CLICKED(ID_HTMLWINDOW1, EmbeddedHtmlPanel::OnLinkClicked)
71 END_EVENT_TABLE()
72 
73 EmbeddedHtmlPanel::EmbeddedHtmlPanel(wxWindow* parent)
74 {
75     //(*Initialize(EmbeddedHtmlPanel)
76     wxBoxSizer* BoxSizer2;
77     wxBoxSizer* BoxSizer1;
78 
79     Create(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL, _T("wxID_ANY"));
80     BoxSizer1 = new wxBoxSizer(wxVERTICAL);
81     Panel1 = new wxPanel(this, ID_PANEL1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL, _T("ID_PANEL1"));
82     BoxSizer2 = new wxBoxSizer(wxHORIZONTAL);
83     btnBack = new wxBitmapButton(Panel1, ID_BITMAPBUTTON2, wxArtProvider::GetBitmap(wxART_MAKE_ART_ID_FROM_STR(_T("wxART_GO_BACK")),wxART_BUTTON), wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW, wxDefaultValidator, _T("ID_BITMAPBUTTON2"));
84     BoxSizer2->Add(btnBack, 0, wxALIGN_CENTER_VERTICAL, 5);
85     btnForward = new wxBitmapButton(Panel1, ID_BITMAPBUTTON3, wxArtProvider::GetBitmap(wxART_MAKE_ART_ID_FROM_STR(_T("wxART_GO_FORWARD")),wxART_BUTTON), wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW, wxDefaultValidator, _T("ID_BITMAPBUTTON3"));
86     BoxSizer2->Add(btnForward, 0, wxALIGN_CENTER_VERTICAL, 5);
87     lblStatus = new wxStaticText(Panel1, ID_STATICTEXT1, _("Label"), wxDefaultPosition, wxDefaultSize, 0, _T("ID_STATICTEXT1"));
88     BoxSizer2->Add(lblStatus, 1, wxLEFT|wxALIGN_CENTER_VERTICAL, 5);
89     Panel1->SetSizer(BoxSizer2);
90     BoxSizer2->Fit(Panel1);
91     BoxSizer2->SetSizeHints(Panel1);
92     BoxSizer1->Add(Panel1, 0, wxEXPAND, 5);
93     winHtml = new wxHtmlWindow(this, ID_HTMLWINDOW1, wxDefaultPosition, wxSize(340,180), wxHW_SCROLLBAR_AUTO, _T("ID_HTMLWINDOW1"));
94     BoxSizer1->Add(winHtml, 1, wxEXPAND, 5);
95     SetSizer(BoxSizer1);
96     BoxSizer1->Fit(this);
97     BoxSizer1->SetSizeHints(this);
98 
99     Connect(ID_BITMAPBUTTON2,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&EmbeddedHtmlPanel::OnbtnBackClick);
100     Connect(ID_BITMAPBUTTON3,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&EmbeddedHtmlPanel::OnbtnForwardClick);
101     //*)
102 
103     int sizes[7] = {};
104     wxBuildFontSizes(sizes, wxGetDefaultHTMLFontSize());
105     winHtml->SetFonts(wxEmptyString, wxEmptyString, &sizes[0]);
106 
107     lblStatus->SetLabel(wxEmptyString);
108 }
109 
~EmbeddedHtmlPanel()110 EmbeddedHtmlPanel::~EmbeddedHtmlPanel()
111 {
112     //(*Destroy(EmbeddedHtmlPanel)
113     //*)
114 }
115 
OnLinkClicked(wxHtmlLinkEvent & event)116 void EmbeddedHtmlPanel::OnLinkClicked(wxHtmlLinkEvent &event)
117 {
118     Open(event.GetLinkInfo().GetHref());
119 }
120 
OnUpdateUI(wxUpdateUIEvent & event)121 void EmbeddedHtmlPanel::OnUpdateUI(wxUpdateUIEvent& event)
122 {
123     btnBack->Enable(winHtml->HistoryCanBack());
124     btnForward->Enable(winHtml->HistoryCanForward());
125 
126     event.Skip();
127 }
128 
OnbtnBackClick(cb_unused wxCommandEvent & event)129 void EmbeddedHtmlPanel::OnbtnBackClick(cb_unused wxCommandEvent& event)
130 {
131     if (winHtml->HistoryCanBack())
132     {
133         lblStatus->SetLabel(_("Going back..."));
134         Update();
135 
136         winHtml->HistoryBack();
137 
138         lblStatus->SetLabel(_("Ready"));
139     }
140 }
141 
OnbtnForwardClick(cb_unused wxCommandEvent & event)142 void EmbeddedHtmlPanel::OnbtnForwardClick(cb_unused wxCommandEvent& event)
143 {
144     if (winHtml->HistoryCanForward())
145     {
146         lblStatus->SetLabel(_("Going forward..."));
147         Update();
148 
149         winHtml->HistoryForward();
150 
151         lblStatus->SetLabel(_("Ready"));
152     }
153 }
154 
Open(const wxString & url)155 void EmbeddedHtmlPanel::Open(const wxString& url)
156 {
157     lblStatus->SetLabel(_("Opening ") + url);
158     Update();
159 
160     winHtml->LoadPage(url);
161 
162     lblStatus->SetLabel(_("Ready"));
163 }
164