Szontágh Ferenc
2025-03-12 77bc7063534ab317a2ef96249a4f78198d01ef01
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#ifndef WEBVIEWHANDLER_H
#define WEBVIEWHANDLER_H
#include <iostream>
#include <wx/log.h>
#include <wx/webview.h>
 
class WebViewHandler {
 
public:
  enum class CallbackType {
    OnNavigating,
    OnNavigated,
    OnLoaded,
    OnError,
    OnNewWindow,
    OnTitleChanged,
  };
 
  typedef std::function<void(CallbackType, const wxString, WebViewHandler *)>
      callback_t;
 
  WebViewHandler(wxWebView *webView, callback_t clb = nullptr)
      : m_webView(webView), callback(clb) {
    if (m_webView) {
      m_webView->Bind(wxEVT_WEBVIEW_NAVIGATING, &WebViewHandler::OnNavigating,
                      this);
      m_webView->Bind(wxEVT_WEBVIEW_NAVIGATED, &WebViewHandler::OnNavigated,
                      this);
      m_webView->Bind(wxEVT_WEBVIEW_LOADED, &WebViewHandler::OnLoaded, this);
      m_webView->Bind(wxEVT_WEBVIEW_ERROR, &WebViewHandler::OnError, this);
      m_webView->Bind(wxEVT_WEBVIEW_NEWWINDOW, &WebViewHandler::OnNewWindow,
                      this);
      m_webView->Bind(wxEVT_WEBVIEW_TITLE_CHANGED,
                      &WebViewHandler::OnTitleChanged, this);
    }
  }
 
  virtual ~WebViewHandler() {
    if (m_webView) {
      m_webView->Unbind(wxEVT_WEBVIEW_NAVIGATING, &WebViewHandler::OnNavigating,
                        this);
      m_webView->Unbind(wxEVT_WEBVIEW_NAVIGATED, &WebViewHandler::OnNavigated,
                        this);
      m_webView->Unbind(wxEVT_WEBVIEW_LOADED, &WebViewHandler::OnLoaded, this);
      m_webView->Unbind(wxEVT_WEBVIEW_ERROR, &WebViewHandler::OnError, this);
      m_webView->Unbind(wxEVT_WEBVIEW_NEWWINDOW, &WebViewHandler::OnNewWindow,
                        this);
    }
  }
 
  wxWebView *GetwebView() { return m_webView; }
 
protected:
  virtual void OnNavigating(wxWebViewEvent &event) {
    if (this->callback) {
      this->callback(CallbackType::OnNavigating, event.GetURL(), this);
    }
    std::cout << "Navigating to: " << event.GetURL() << std::endl;
  }
  virtual void OnTitleChanged(wxWebViewEvent &event) {
    wxString title = event.GetString();
    if (title.IsEmpty()) {
      title = m_webView->GetCurrentTitle();
    }
    if (title.IsEmpty()) {
      return;
    }
    if (this->callback) {
      this->callback(CallbackType::OnTitleChanged, title, this);
    }
    std::cout << "Title changed: " << title << std::endl;
  }
 
  virtual void OnNavigated(wxWebViewEvent &event) {
    if (this->callback) {
      this->callback(CallbackType::OnNavigated, event.GetURL(), this);
    }
    std::cout << "Navigating to: " << event.GetURL() << std::endl;
  }
 
  virtual void OnLoaded(wxWebViewEvent &event) {
    if (this->callback) {
      this->callback(CallbackType::OnLoaded, event.GetURL(), this);
    }
    std::cout << "Page loaded: " << event.GetURL() << std::endl;
  }
 
  virtual void OnError(wxWebViewEvent &event) {
    if (this->callback) {
      this->callback(CallbackType::OnError, event.GetString(), this);
    }
    std::cout << "Error loading page: " << event.GetString() << std::endl;
  }
 
  virtual void OnNewWindow(wxWebViewEvent &event) {
    if (this->callback) {
      this->callback(CallbackType::OnNewWindow, event.GetURL(), this);
    }
    std::cout << "New window requested: " << event.GetURL() << std::endl;
  }
 
private:
  wxWebView *m_webView;
  callback_t callback = nullptr;
};
 
#endif // WEBVIEWHANDLER_H