The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
%module{Wx};

##/////////////////////////////////////////////////////////////////////////////
##// Name:        webview.h
##// Purpose:     interface of wxWebView
##// Author:      wxWidgets team
##// RCS-ID:      $Id$
##// Licence:     wxWindows licence
##/////////////////////////////////////////////////////////////////////////////

#if wxUSE_WEBVIEW

%loadplugin{build::Wx::XSP::Overload};
%loadplugin{build::Wx::XSP::Enum};
%loadplugin{build::Wx::XSP::Event};

%Event{%EVT_WEB_VIEW_NAVIGATING(id, func)%}
      {wxEVT_COMMAND_WEB_VIEW_NAVIGATING};
%Event{%EVT_WEB_VIEW_NAVIGATED(id, func)%}
      {wxEVT_COMMAND_WEB_VIEW_NAVIGATED};
%Event{%EVT_WEB_VIEW_LOADED(id, func)%}
      {wxEVT_COMMAND_WEB_VIEW_LOADED};
%Event{%EVT_WEB_VIEW_ERROR(id, func)%}
      {wxEVT_COMMAND_WEB_VIEW_ERROR};
%Event{%EVT_WEB_VIEW_NEWWINDOW(id, func)%}
      {wxEVT_COMMAND_WEB_VIEW_NEWWINDOW};
%Event{%EVT_WEB_VIEW_TITLE_CHANGED(id, func)%}
      {wxEVT_COMMAND_WEB_VIEW_TITLE_CHANGED};      

%name{Wx::WebViewHistoryItem} class wxWebViewHistoryItem
{
    
%{
static void
wxWebViewHistoryItem::CLONE()
  CODE:
    wxPli_thread_sv_clone( aTHX_ CLASS, (wxPliCloneSV)wxPli_detach_object );
%}

public:

    wxWebViewHistoryItem(const wxString& url, const wxString& title);
    
    ~wxWebViewHistoryItem()
        %code%{  wxPli_thread_sv_unregister( aTHX_ "Wx::WebViewHistoryItem", THIS, ST(0) );
                 delete THIS;
               %};    
    
    wxString GetUrl();
    
    wxString GetTitle();
};

%name{Wx::WebViewHandler} class wxWebViewHandler
{
public:

    virtual wxFSFile* GetFile(const wxString &uri);

    virtual wxString GetName() const;
};

%name{Wx::WebView} class wxWebView : public %name{Wx::Control} wxControl
{
public:

    static wxWebView* NewDefault(wxWebViewBackend backend = wxWEB_VIEW_BACKEND_DEFAULT)
        %code{% RETVAL = wxWebView::New( backend ); %}
        %postcall{% wxPli_create_evthandler( aTHX_ RETVAL, "Wx::WebView" ); %};

    static wxWebView* New(wxWindow* parent,
           wxWindowID id,
           const wxString& url = wxWebViewDefaultURLStr,
           const wxPoint& pos = wxDefaultPosition,
           const wxSize& size = wxDefaultSize,
           wxWebViewBackend backend = wxWEB_VIEW_BACKEND_DEFAULT,
           long style = 0,
           const wxString& name = wxWebViewNameStr)
        %postcall{% wxPli_create_evthandler( aTHX_ RETVAL, "Wx::WebView" ); %};

    virtual bool Create(wxWindow* parent,
                        wxWindowID id,
                        const wxString& url = wxWebViewDefaultURLStr,
                        const wxPoint& pos = wxDefaultPosition,
                        const wxSize& size = wxDefaultSize,
                        long style = 0,
                        const wxString& name = wxWebViewNameStr);

    virtual wxString GetCurrentTitle() const;
    
    virtual wxString GetCurrentURL() const;
    
    virtual wxString GetPageSource() const;
  
    virtual wxString GetPageText() const;
    
    virtual bool IsBusy() const;

    virtual bool IsEditable() const;

    virtual void LoadURL(const wxString& url);

    virtual void Print();
 
    /* TODO : IMP  virtual void RegisterHandler(wxSharedPtr<wxWebViewHandler> handler) = 0; */
    
    virtual void Reload(wxWebViewReloadFlags flags = wxWEB_VIEW_RELOAD_DEFAULT);
    
    virtual void RunScript(const wxString& javascript);
    
    virtual void SetEditable(bool enable = true);

    virtual void SetPage(const wxString& html, const wxString& baseUrl);

    %name{SetPageFH} virtual void SetPage(SV* fh, wxString baseUrl)
        %code{% wxInputStream* stream = wxPliInputStream_ctor( fh );
                THIS->SetPage( *stream, baseUrl );
                delete stream;
                %};

    virtual void Stop();

    virtual bool CanCopy() const;

    virtual bool CanCut() const;

    virtual bool CanPaste() const;

    virtual void Copy();

    virtual void Cut();

    virtual void Paste();

    virtual bool CanGoBack();

    virtual bool CanGoForward() const;

    virtual void ClearHistory();
    
    virtual void EnableHistory(bool enable = true);

#if WXPERL_W_VERSION_GE( 2, 9, 5 )

    virtual long Find(const wxString& text, int flags = wxWEB_VIEW_FIND_DEFAULT);

#endif
    
%{

void
wxWebView::GetBackwardHistory()
  PPCODE:
    wxVector<wxSharedPtr<wxWebViewHistoryItem> > back = THIS->GetBackwardHistory();
    size_t num = back.size();
    EXTEND( SP, (IV)num );
    for( size_t i = 0; i < num; ++i )
    {
        PUSHs( wxPli_non_object_2_sv( aTHX_ sv_newmortal(),
                                      new wxWebViewHistoryItem(
                                          back[i]->GetUrl(), back[i]->GetTitle()
                                          ),
                                      "Wx::WebViewHistoryItem" ) );
    }


void
wxWebView::GetForwardHistory()
  PPCODE:
    wxVector<wxSharedPtr<wxWebViewHistoryItem> > forward = THIS->GetForwardHistory();
    size_t num = forward.size();
    EXTEND( SP, (IV)num );
    for( size_t i = 0; i < num; ++i )
    {
        PUSHs( wxPli_non_object_2_sv( aTHX_ sv_newmortal(),
                                      new wxWebViewHistoryItem(
                                          forward[i]->GetUrl(), forward[i]->GetTitle()
                                          ),
                                      "Wx::WebViewHistoryItem" ) );
    }

%}    

    virtual void GoBack();

    virtual void GoForward();

    /* not quite the standard implementation but it makes
      wxWebViewHistoryItem simpler */
      
    virtual void LoadHistoryItem( wxWebViewHistoryItem* item )
        %code{% THIS->LoadURL( item->GetUrl() ); %};
    
    virtual void ClearSelection();
   
    virtual void DeleteSelection();
 
    virtual wxString GetSelectedSource() const;
  
    virtual wxString GetSelectedText() const;

    virtual bool HasSelection() const;

    virtual void SelectAll();

    virtual bool CanRedo() const;

    virtual bool CanUndo() const;

    virtual void Redo();

    virtual void Undo();

    virtual bool CanSetZoomType(wxWebViewZoomType type) const;

    virtual wxWebViewZoom GetZoom() const;

    virtual wxWebViewZoomType GetZoomType() const;

    virtual void SetZoom(wxWebViewZoom zoom);

    virtual void SetZoomType(wxWebViewZoomType zoomType);
};


%name{Wx::WebViewEvent} class wxWebViewEvent : public %name{Wx::NotifyEvent} wxNotifyEvent
{
public:
    
    %name{newDefault} wxWebViewEvent() %Overload;
    
    %name{newFull} wxWebViewEvent(wxEventType type, int id, const wxString& href,
                   const wxString& target) %Overload;

    const wxString& GetTarget() const;
    
    const wxString& GetURL() const;
};

/*
wxEventType wxEVT_COMMAND_WEB_VIEW_NAVIGATING;
wxEventType wxEVT_COMMAND_WEB_VIEW_NAVIGATED;
wxEventType wxEVT_COMMAND_WEB_VIEW_LOADED;
wxEventType wxEVT_COMMAND_WEB_VIEW_ERROR;
wxEventType wxEVT_COMMAND_WEB_VIEW_NEWWINDOW;
wxEventType wxEVT_COMMAND_WEB_VIEW_TITLE_CHANGED;
*/

%name{Wx::WebViewArchiveHandler} class wxWebViewArchiveHandler : public %name{Wx::WebViewHandler} wxWebViewHandler
{
public:
    
    wxWebViewArchiveHandler(const wxString& scheme);
    
    virtual wxFSFile* GetFile(const wxString &uri);
};

#endif