18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#!/usr/bin/python
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# Copyright (C) 2007 Kevin Ollivier  All rights reserved.
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# Redistribution and use in source and binary forms, with or without
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# modification, are permitted provided that the following conditions
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# are met:
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# 1. Redistributions of source code must retain the above copyright
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#    notice, this list of conditions and the following disclaimer.
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# 2. Redistributions in binary form must reproduce the above copyright
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#    notice, this list of conditions and the following disclaimer in the
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#    documentation and/or other materials provided with the distribution.
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectimport wx
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectimport wx.webview
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass TestPanel(wx.Panel):
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    def __init__(self, parent, log, frame=None):
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        wx.Panel.__init__(
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            self, parent, -1,
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            style=wx.TAB_TRAVERSAL|wx.CLIP_CHILDREN|wx.NO_FULL_REPAINT_ON_RESIZE
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            )
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        self.log = log
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        self.current = "http://wxPython.org/"
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        self.frame = frame
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if frame:
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            self.titleBase = frame.GetTitle()
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        sizer = wx.BoxSizer(wx.VERTICAL)
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        btnSizer = wx.BoxSizer(wx.HORIZONTAL)
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        self.webview = wx.webview.WebView(self, -1)
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        btn = wx.Button(self, -1, "Open", style=wx.BU_EXACTFIT)
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        self.Bind(wx.EVT_BUTTON, self.OnOpenButton, btn)
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        btnSizer.Add(btn, 0, wx.EXPAND|wx.ALL, 2)
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        btn = wx.Button(self, -1, "<--", style=wx.BU_EXACTFIT)
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        self.Bind(wx.EVT_BUTTON, self.OnPrevPageButton, btn)
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        btnSizer.Add(btn, 0, wx.EXPAND|wx.ALL, 2)
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        btn = wx.Button(self, -1, "-->", style=wx.BU_EXACTFIT)
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        self.Bind(wx.EVT_BUTTON, self.OnNextPageButton, btn)
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        btnSizer.Add(btn, 0, wx.EXPAND|wx.ALL, 2)
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        btn = wx.Button(self, -1, "Stop", style=wx.BU_EXACTFIT)
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        self.Bind(wx.EVT_BUTTON, self.OnStopButton, btn)
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        btnSizer.Add(btn, 0, wx.EXPAND|wx.ALL, 2)
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        btn = wx.Button(self, -1, "Refresh", style=wx.BU_EXACTFIT)
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        self.Bind(wx.EVT_BUTTON, self.OnRefreshPageButton, btn)
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        btnSizer.Add(btn, 0, wx.EXPAND|wx.ALL, 2)
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        txt = wx.StaticText(self, -1, "Location:")
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        btnSizer.Add(txt, 0, wx.CENTER|wx.ALL, 2)
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        self.location = wx.ComboBox(
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            self, -1, "", style=wx.CB_DROPDOWN|wx.PROCESS_ENTER
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            )
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        self.Bind(wx.EVT_COMBOBOX, self.OnLocationSelect, self.location)
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        self.location.Bind(wx.EVT_KEY_UP, self.OnLocationKey)
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        self.location.Bind(wx.EVT_CHAR, self.IgnoreReturn)
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        btnSizer.Add(self.location, 1, wx.EXPAND|wx.ALL, 2)
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        sizer.Add(btnSizer, 0, wx.EXPAND)
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        sizer.Add(self.webview, 1, wx.EXPAND)
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        self.webview.LoadURL(self.current)
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        self.location.Append(self.current)
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        self.webview.Bind(wx.webview.EVT_WEBVIEW_LOAD, self.OnStateChanged)
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        self.SetSizer(sizer)
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    def OnStateChanged(self, event):
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        statusbar = self.GetParent().GetStatusBar()
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if statusbar:
95cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block            if event.GetState() == wx.webview.WEBVIEW_LOAD_NEGOTIATING:
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                statusbar.SetStatusText("Contacting " + event.GetURL())
97cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block            elif event.GetState() == wx.webview.WEBVIEW_LOAD_TRANSFERRING:
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                statusbar.SetStatusText("Loading " + event.GetURL())
99cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block            elif event.GetState() == wx.webview.WEBVIEW_LOAD_DOC_COMPLETED:
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                statusbar.SetStatusText("")
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                self.location.SetValue(event.GetURL())
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                self.GetParent().SetTitle("wxWebView - " + self.webview.GetPageTitle())
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    def OnLocationKey(self, evt):
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if evt.GetKeyCode() == wx.WXK_RETURN:
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            URL = self.location.GetValue()
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            self.location.Append(URL)
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            self.webview.LoadURL(URL)
1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else:
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            evt.Skip()
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    def IgnoreReturn(self, evt):
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if evt.GetKeyCode() != wx.WXK_RETURN:
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            evt.Skip()
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    def OnLocationSelect(self, evt):
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        url = self.location.GetStringSelection()
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        self.webview.LoadURL(url)
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    def OnOpenButton(self, event):
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        dlg = wx.TextEntryDialog(self, "Open Location",
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                "Enter a full URL or local path",
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                self.current, wx.OK|wx.CANCEL)
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        dlg.CentreOnParent()
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if dlg.ShowModal() == wx.ID_OK:
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            self.current = dlg.GetValue()
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            self.webview.LoadURL(self.current)
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        dlg.Destroy()
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    def OnPrevPageButton(self, event):
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        self.webview.GoBack()
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    def OnNextPageButton(self, event):
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        self.webview.GoForward()
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    def OnStopButton(self, evt):
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        self.webview.Stop()
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    def OnRefreshPageButton(self, evt):
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        self.webview.Reload()
1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass wkFrame(wx.Frame):
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    def __init__(self):
1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        wx.Frame.__init__(self, None, -1, "WebKit in wxPython!")
1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        self.panel = TestPanel(self, -1)
1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        self.panel.webview.LoadURL("http://www.wxwidgets.org/")
1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        self.CreateStatusBar()
1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass wkApp(wx.App):
1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    def OnInit(self):
1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        self.webFrame = wkFrame()
1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        self.SetTopWindow(self.webFrame)
1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        self.webFrame.Show()
1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return True
1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectapp = wkApp(redirect=False)
1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectapp.MainLoop()
163