#include "BrowserFrame.h"
|
#include "handlers/CurlHttpHandler.h"
|
#include "handlers/CurlHttpsHandler.h"
|
|
BrowserFrame::BrowserFrame(wxWindow *parent) : wxBrowserBase(parent) {
|
wxCommandEvent event;
|
event.SetString("https://www.google.com");
|
this->OnNewTab(event);
|
}
|
|
BrowserFrame::~BrowserFrame() { webViews.clear(); }
|
|
void BrowserFrame::OnPageClose(wxAuiNotebookEvent &event) { event.Skip(); }
|
void BrowserFrame::OnPageClosed(wxAuiNotebookEvent &event) {
|
|
// get the closed tab index
|
int closed = event.GetSelection();
|
// remove the tab from the map
|
this->webViewtabMap.erase(closed);
|
// remove the webview from the map
|
this->webViews.erase(this->webViewtabMap[closed]);
|
if (this->currentWebView == this->webViewtabMap[closed]) {
|
this->currentWebView = nullptr;
|
}
|
if (this->webViewtabMap.size() == 0) {
|
wxCommandEvent event = wxCommandEvent();
|
event.SetString("https://www.google.com");
|
this->OnNewTab(event);
|
}
|
event.Skip();
|
}
|
void BrowserFrame::OnPageChanging(wxAuiNotebookEvent &event) { event.Skip(); }
|
void BrowserFrame::OnPageChanged(wxAuiNotebookEvent &event) { event.Skip(); }
|
|
void BrowserFrame::OnUrlEnter(wxCommandEvent &event) {
|
wxString url = m_urlbar->GetValue();
|
if (!url.StartsWith("http://") && !url.StartsWith("https://")) {
|
wxRegEx domainRegex("^([a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}$");
|
url = domainRegex.Matches(url) ? "https://" + url
|
: "https://www.google.com/search?q=" + url;
|
this->m_urlbar->SetValue(url);
|
}
|
|
if (this->currentWebView) {
|
url.Prepend("p");
|
this->currentWebView->LoadURL(url);
|
}
|
}
|
void BrowserFrame::OnNewTab(wxCommandEvent &event) {
|
wxPanel *panel = new wxPanel(m_auinotebook1);
|
wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
|
|
wxString url = "https://www.google.com";
|
if (!event.GetString().IsEmpty()) {
|
url = event.GetString();
|
}
|
|
wxWebView *webView = wxWebView::New(panel, wxID_ANY, url);
|
webView->RegisterHandler(
|
wxSharedPtr<wxWebViewHandler>(new CurlHttpHandler()));
|
webView->RegisterHandler(
|
wxSharedPtr<wxWebViewHandler>(new CurlHttpsHandler()));
|
sizer->Add(webView, 1, wxEXPAND);
|
panel->SetSizer(sizer);
|
m_auinotebook1->AddPage(panel, "New Tab", true);
|
m_auinotebook1->SetSelection(m_auinotebook1->GetPageCount() - 1);
|
this->m_urlbar->SetValue(url);
|
this->currentWebView = webView;
|
this->webViews[webView] = std::make_shared<WebViewHandler>(
|
webView, std::bind(&BrowserFrame::WebViewHandlerCallback, this,
|
std::placeholders::_1, std::placeholders::_2,
|
std::placeholders::_3));
|
this->webViewtabMap[m_auinotebook1->GetPageCount() - 1] = webView;
|
}
|
void BrowserFrame::OnReload(wxCommandEvent &event) {
|
if (this->currentWebView) {
|
this->currentWebView->Reload();
|
}
|
}
|
|
void BrowserFrame::OnBack(wxCommandEvent &event) {
|
if (this->currentWebView) {
|
this->currentWebView->GoBack();
|
}
|
}
|
|
void BrowserFrame::OnForward(wxCommandEvent &event) {
|
if (this->currentWebView) {
|
this->currentWebView->GoForward();
|
}
|
}
|
void BrowserFrame::OnHome(wxCommandEvent &event) {
|
if (this->currentWebView) {
|
this->currentWebView->LoadURL("https://www.google.com");
|
}
|
}
|
void BrowserFrame::m_urlbarOnSetFocus(wxFocusEvent &event) {
|
this->m_urlbar->SetSelection(0, this->m_urlbar->GetValue().size());
|
}
|
|
void BrowserFrame::m_urlbarOnLeftUp(wxMouseEvent &event) {
|
this->m_urlbar->SetSelection(0, this->m_urlbar->GetValue().size());
|
}
|
|
size_t BrowserFrame::GetTabIndex(wxWebView *webView) {
|
for (auto &pair : this->webViewtabMap) {
|
if (pair.second == webView) {
|
return pair.first;
|
}
|
}
|
return wxNOT_FOUND;
|
}
|
|
void BrowserFrame::ChangeTabIndex(wxWebView *webView, int index) {
|
auto it = this->webViewtabMap.find(index);
|
if (it != this->webViewtabMap.end()) {
|
this->webViewtabMap[index] = webView;
|
this->webViewtabMap.erase(it);
|
}
|
}
|
|
void BrowserFrame::WebViewHandlerCallback(WebViewHandler::CallbackType type,
|
const wxString data,
|
WebViewHandler *handler) {
|
switch (type) {
|
case WebViewHandler::CallbackType::OnTitleChanged: {
|
const auto index = this->GetTabIndex(handler->GetwebView());
|
if (index == wxNOT_FOUND) {
|
return;
|
}
|
wxString title = data;
|
if (data.size() > 50) {
|
title = data.substr(0, 50) + "...";
|
this->m_auinotebook1->SetPageToolTip(index, data);
|
}
|
this->m_auinotebook1->SetPageText(index, data);
|
|
} break;
|
case WebViewHandler::CallbackType::OnNavigated:
|
this->m_urlbar->SetValue(data);
|
break;
|
case WebViewHandler::CallbackType::OnNewWindow: {
|
wxCommandEvent event = wxCommandEvent();
|
event.SetString(data);
|
this->OnNewTab(event);
|
} break;
|
default:
|
break;
|
}
|
}
|