Talk:Embedding/NewApi/Win32: Difference between revisions

Line 27: Line 27:
</pre>
</pre>
But it did not have example for wxWidget. Here I give you a simple example (learned from the QT sample project) to help you getting started with the MozView (embeded API)
But it did not have example for wxWidget. Here I give you a simple example (learned from the QT sample project) to help you getting started with the MozView (embeded API)
==Using embeded API in wxWidget application==
===Setup system environment===
Please refer to https://wiki.mozilla.org/Embedding/NewApi/Win32
===Extended wxWidgets using embeded API===
====Create an new Class wxMozView inheriting wxWindows====
Header file wxMozView.h
<pre>
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The code follows the example of embeded API QT project.
* Contact: Jiez <MagicDesign.CN@Gmail.Com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#ifndef _EXTERN_WXWIDGET_EMBEDED_MOZILLA_WXMOZVIE_H_
#define _EXTERN_WXWIDGET_EMBEDED_MOZILLA_WXMOZVIE_H_
#include "embed.h"
#include <wx/window.h>
#include <wx/string.h>
class wxMozViewListener;
class nsIInterfaceRequestor;
/////////////////////////////////////////////////////
///Class wxMozView
/////////////////////////////////////////////////////
class wxMozView :
      public wxWindow
{
public:
    explicit wxMozView(wxWindow* parent = NULL,
                      wxWindowID id = wxID_ANY,
                      const wxPoint& pos = wxDefaultPosition,
                      const wxSize& size = wxDefaultSize, 
                      long style = 0,
                      const wxString& name = wxPanelNameStr);
    virtual ~wxMozView();
    void LoadUri(const wxString& uri);
    void GetInterfaceRequestor(nsIInterfaceRequestor** aRequestor);
    wxString EvaluateJavaScript(const wxString& script);
    void GetSize(int *width, int *height);
protected:
    virtual void OnSize(wxSizeEvent& e);
    virtual wxMozView* OpenWindow(unsigned int flags);
private:
    //here I am using the QT way to create the private members for the class wxMozView.
    //It is really a good way to hide private info of a class. :)
    //I love QT!
    class Private;
    Private * const m_private;
    friend class wxMozViewListener;
};
/////////////////////////////////////////////////////
///Class wxMozViewListener
/////////////////////////////////////////////////////
class wxMozViewListener :
      public MozViewListener
{
public:
    wxMozViewListener(wxMozView* awxMozView) : pwxMozView(awxMozView) {}
    virtual ~wxMozViewListener() {}
    void StatusChanged(const char* newStatus, PRUint32 statusType);
    void LocationChanged(const char* newLocation);
    MozView* OpenWindow(PRUint32 flags);
    void SizeTo(PRUint32 width, PRUint32 height);
private:
    wxMozView* pwxMozView;
};
#endif // _EXTERN_WXWIDGET_EMBEDED_MOZILLA_WXMOZVIE_H_
</pre>
File wxMozView.cpp
<pre>
#include "wxMozView.h"
///////////////////////////////////////////
//Class Private
class wxMozView::Private
{
public:
    Private(wxMozView* awxMozView) :
        listener(awxMozView)
    {
        mozView.SetListener(&listener);
    }
    MozView mozView;
    wxMozViewListener listener;
    wxSize preferredSize;
};
////////////////////////////////////////////
//Implement class wxMozViewListener
void wxMozViewListener::StatusChanged(const char* newStatus, PRUint32 statusType)
{
    //add your own code to deal with the status changed events
    pwxMozView->Refresh();
}
void wxMozViewListener::LocationChanged(const char* newLocation)
{
    //add your own code to deal with the location changed events
    pwxMozView->Refresh();
}
MozView* wxMozViewListener::OpenWindow(PRUint32 flags)
{
    wxMozView* newwxMozView = pwxMozView->OpenWindow(flags);
    if(!newwxMozView)
        return 0;
    return &(newwxMozView->m_private->mozView);
}
void wxMozViewListener::SizeTo(PRUint32 width, PRUint32 height)
{
    pwxMozView->m_private->preferredSize = wxSize(width, height);
    pwxMozView->Update();
    pwxMozView->GetParent()->Fit();
}
///////////////////////////////////////////////////
//Implement class wxMozView
wxMozView::wxMozView(wxWindow* parent,
                    wxWindowID id,
                    const wxPoint& pos,
                    const wxSize& size,
                    long style,
                    const wxString& name) :
    wxWindow(parent, id, pos, size, style, name),
    m_private(new Private(this))
{
    m_private->mozView.CreateBrowser(
                      (void*)parent->GetHandle(),
                      parent->GetRect().GetLeft(),
                      parent->GetRect().GetTop(),
                      parent->GetRect().GetRight() - parent->GetRect().GetLeft(),
                      parent->GetRect().GetBottom() - parent->GetRect().GetTop(),
                      1);
}
wxMozView::~wxMozView()
{
    delete m_private;
}
void wxMozView::OnSize(wxSizeEvent& e)
{
    int width = 0, height = 0;
    GetSize(&width, &height);
    m_private->mozView.SetPositionAndSize(0, 0, width, height);
}
void wxMozView::LoadUri(const wxString &uri)
{
    m_private->mozView.LoadURI(uri.char_str(wxMBConvUTF8()));
}
void wxMozView::GetInterfaceRequestor(nsIInterfaceRequestor** aRequestor)
{
    *aRequestor = 0;
    m_private->mozView.GetInterfaceRequestor(aRequestor);
}
wxString wxMozView::EvaluateJavaScript(const wxString& script)
{
    return wxString::FromUTF8(m_private->mozView.EvaluateJavaScript(script.char_str(wxMBConvUTF8())));
}
wxMozView* wxMozView::OpenWindow(unsigned int flags)
{
    return 0;
}
void wxMozView::GetSize(int *width, int *height)
{
    *width = m_private->preferredSize.GetWidth();
    *height = m_private->preferredSize.GetHeight();
}
//
// (C) 2009 Copyrights
// All rights opened under MPL/GPL
</pre>
14

edits