|
1 #!/usr/bin/python |
|
2 |
|
3 # Copyright (C) 2007 Kevin Ollivier All rights reserved. |
|
4 # |
|
5 # Redistribution and use in source and binary forms, with or without |
|
6 # modification, are permitted provided that the following conditions |
|
7 # are met: |
|
8 # 1. Redistributions of source code must retain the above copyright |
|
9 # notice, this list of conditions and the following disclaimer. |
|
10 # 2. Redistributions in binary form must reproduce the above copyright |
|
11 # notice, this list of conditions and the following disclaimer in the |
|
12 # documentation and/or other materials provided with the distribution. |
|
13 # |
|
14 # THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY |
|
15 # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
|
16 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
|
17 # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR |
|
18 # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
|
19 # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
|
20 # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
|
21 # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY |
|
22 # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
|
23 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
|
24 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|
25 |
|
26 |
|
27 import wx |
|
28 import wx.webview |
|
29 |
|
30 class TestPanel(wx.Panel): |
|
31 def __init__(self, parent, log, frame=None): |
|
32 wx.Panel.__init__( |
|
33 self, parent, -1, |
|
34 style=wx.TAB_TRAVERSAL|wx.CLIP_CHILDREN|wx.NO_FULL_REPAINT_ON_RESIZE |
|
35 ) |
|
36 |
|
37 self.log = log |
|
38 self.current = "http://wxPython.org/" |
|
39 self.frame = frame |
|
40 |
|
41 if frame: |
|
42 self.titleBase = frame.GetTitle() |
|
43 |
|
44 sizer = wx.BoxSizer(wx.VERTICAL) |
|
45 btnSizer = wx.BoxSizer(wx.HORIZONTAL) |
|
46 |
|
47 self.webview = wx.webview.WebView(self, -1) |
|
48 |
|
49 |
|
50 btn = wx.Button(self, -1, "Open", style=wx.BU_EXACTFIT) |
|
51 self.Bind(wx.EVT_BUTTON, self.OnOpenButton, btn) |
|
52 btnSizer.Add(btn, 0, wx.EXPAND|wx.ALL, 2) |
|
53 |
|
54 btn = wx.Button(self, -1, "<--", style=wx.BU_EXACTFIT) |
|
55 self.Bind(wx.EVT_BUTTON, self.OnPrevPageButton, btn) |
|
56 btnSizer.Add(btn, 0, wx.EXPAND|wx.ALL, 2) |
|
57 |
|
58 btn = wx.Button(self, -1, "-->", style=wx.BU_EXACTFIT) |
|
59 self.Bind(wx.EVT_BUTTON, self.OnNextPageButton, btn) |
|
60 btnSizer.Add(btn, 0, wx.EXPAND|wx.ALL, 2) |
|
61 |
|
62 btn = wx.Button(self, -1, "Stop", style=wx.BU_EXACTFIT) |
|
63 self.Bind(wx.EVT_BUTTON, self.OnStopButton, btn) |
|
64 btnSizer.Add(btn, 0, wx.EXPAND|wx.ALL, 2) |
|
65 |
|
66 btn = wx.Button(self, -1, "Refresh", style=wx.BU_EXACTFIT) |
|
67 self.Bind(wx.EVT_BUTTON, self.OnRefreshPageButton, btn) |
|
68 btnSizer.Add(btn, 0, wx.EXPAND|wx.ALL, 2) |
|
69 |
|
70 txt = wx.StaticText(self, -1, "Location:") |
|
71 btnSizer.Add(txt, 0, wx.CENTER|wx.ALL, 2) |
|
72 |
|
73 self.location = wx.ComboBox( |
|
74 self, -1, "", style=wx.CB_DROPDOWN|wx.PROCESS_ENTER |
|
75 ) |
|
76 |
|
77 self.Bind(wx.EVT_COMBOBOX, self.OnLocationSelect, self.location) |
|
78 self.location.Bind(wx.EVT_KEY_UP, self.OnLocationKey) |
|
79 self.location.Bind(wx.EVT_CHAR, self.IgnoreReturn) |
|
80 btnSizer.Add(self.location, 1, wx.EXPAND|wx.ALL, 2) |
|
81 |
|
82 sizer.Add(btnSizer, 0, wx.EXPAND) |
|
83 sizer.Add(self.webview, 1, wx.EXPAND) |
|
84 |
|
85 self.webview.LoadURL(self.current) |
|
86 self.location.Append(self.current) |
|
87 |
|
88 self.webview.Bind(wx.webview.EVT_WEBVIEW_LOAD, self.OnStateChanged) |
|
89 |
|
90 self.SetSizer(sizer) |
|
91 |
|
92 def OnStateChanged(self, event): |
|
93 statusbar = self.GetParent().GetStatusBar() |
|
94 if statusbar: |
|
95 if event.GetState() == wx.webview.WEBVIEW_LOAD_NEGOTIATING: |
|
96 statusbar.SetStatusText("Contacting " + event.GetURL()) |
|
97 elif event.GetState() == wx.webview.WEBVIEW_LOAD_TRANSFERRING: |
|
98 statusbar.SetStatusText("Loading " + event.GetURL()) |
|
99 elif event.GetState() == wx.webview.WEBVIEW_LOAD_DOC_COMPLETED: |
|
100 statusbar.SetStatusText("") |
|
101 self.location.SetValue(event.GetURL()) |
|
102 self.GetParent().SetTitle("wxWebView - " + self.webview.GetPageTitle()) |
|
103 |
|
104 def OnLocationKey(self, evt): |
|
105 if evt.GetKeyCode() == wx.WXK_RETURN: |
|
106 URL = self.location.GetValue() |
|
107 self.location.Append(URL) |
|
108 self.webview.LoadURL(URL) |
|
109 else: |
|
110 evt.Skip() |
|
111 |
|
112 def IgnoreReturn(self, evt): |
|
113 if evt.GetKeyCode() != wx.WXK_RETURN: |
|
114 evt.Skip() |
|
115 |
|
116 def OnLocationSelect(self, evt): |
|
117 url = self.location.GetStringSelection() |
|
118 self.webview.LoadURL(url) |
|
119 |
|
120 def OnOpenButton(self, event): |
|
121 dlg = wx.TextEntryDialog(self, "Open Location", |
|
122 "Enter a full URL or local path", |
|
123 self.current, wx.OK|wx.CANCEL) |
|
124 dlg.CentreOnParent() |
|
125 |
|
126 if dlg.ShowModal() == wx.ID_OK: |
|
127 self.current = dlg.GetValue() |
|
128 self.webview.LoadURL(self.current) |
|
129 |
|
130 dlg.Destroy() |
|
131 |
|
132 def OnPrevPageButton(self, event): |
|
133 self.webview.GoBack() |
|
134 |
|
135 def OnNextPageButton(self, event): |
|
136 self.webview.GoForward() |
|
137 |
|
138 def OnStopButton(self, evt): |
|
139 self.webview.Stop() |
|
140 |
|
141 def OnRefreshPageButton(self, evt): |
|
142 self.webview.Reload() |
|
143 |
|
144 |
|
145 class wkFrame(wx.Frame): |
|
146 def __init__(self): |
|
147 wx.Frame.__init__(self, None, -1, "WebKit in wxPython!") |
|
148 |
|
149 self.panel = TestPanel(self, -1) |
|
150 self.panel.webview.LoadURL("http://www.wxwidgets.org/") |
|
151 self.CreateStatusBar() |
|
152 |
|
153 class wkApp(wx.App): |
|
154 def OnInit(self): |
|
155 self.webFrame = wkFrame() |
|
156 self.SetTopWindow(self.webFrame) |
|
157 self.webFrame.Show() |
|
158 |
|
159 return True |
|
160 |
|
161 app = wkApp(redirect=False) |
|
162 app.MainLoop() |