]> git.saurik.com Git - wxWidgets.git/blame - wxPython/demo/ActiveXWrapper_IE.py
mention ShouldInheritColours() change
[wxWidgets.git] / wxPython / demo / ActiveXWrapper_IE.py
CommitLineData
f6bcfd97
BP
1"""
2<html><body>
3This demo shows how to embed an ActiveX control in a wxPython
4application, (Win32 only.)
5
6<p>
7The MakeActiveXClass function dynamically builds a new Class on the
8fly, that has the same signature and semantics as wxWindow. This
9means that when you call the function you get back a new class that
10you can use just like wxWindow, (set the size and position, use in a
11sizer, etc.) except its contents will be the COM control.
12
13<p>
8b9a4190 14This demo embeds the Internet Explorer WebBrowser control, and shows
f6bcfd97
BP
15how to receive events from the COM control. (The title bar and status
16bar are updated as pages change, in addition to the log messages being
17shown.)
18</body></html>
19"""
20
21from wxPython.wx import *
22
23if wxPlatform == '__WXMSW__':
24 from wxPython.lib.activexwrapper import MakeActiveXClass
25 import win32com.client.gencache
26
27 try:
28 browserModule = win32com.client.gencache.EnsureModule("{EAB22AC0-30C1-11CF-A7EB-0000C05BAE0B}", 0, 1, 1)
29 except:
30 raise ImportError("IE4 or greater does not appear to be installed.")
31
32
33#----------------------------------------------------------------------
34
35class TestPanel(wxWindow):
36 def __init__(self, parent, log, frame=None):
c2dac736
RD
37 wxWindow.__init__(self, parent, -1,
38 style=wxCLIP_CHILDREN|wxNO_FULL_REPAINT_ON_RESIZE)
f6bcfd97
BP
39 self.ie = None
40 self.log = log
c368d904 41 self.current = "http://wxPython.org/"
f6bcfd97
BP
42 self.frame = frame
43 if frame:
44 self.titleBase = frame.GetTitle()
45
46
47 sizer = wxBoxSizer(wxVERTICAL)
48 btnSizer = wxBoxSizer(wxHORIZONTAL)
49
50 # Make a new class that derives from the WebBrowser class in the
51 # COM module imported above. This class also derives from wxWindow and
52 # implements the machinery needed to integrate the two worlds.
53 theClass = MakeActiveXClass(browserModule.WebBrowser,
54 eventObj = self)
55
56 # Create an instance of that class
c2dac736 57 self.ie = theClass(self, -1) ##, style=wxSUNKEN_BORDER)
f6bcfd97
BP
58
59
c2dac736
RD
60 btn = wxButton(self, wxNewId(), "Open", style=wxBU_EXACTFIT)
61 EVT_BUTTON(self, btn.GetId(), self.OnOpenButton)
62 btnSizer.Add(btn, 0, wxEXPAND|wxALL, 2)
f6bcfd97 63
c2dac736 64 btn = wxButton(self, wxNewId(), "Home", style=wxBU_EXACTFIT)
f6bcfd97 65 EVT_BUTTON(self, btn.GetId(), self.OnHomeButton)
c2dac736 66 btnSizer.Add(btn, 0, wxEXPAND|wxALL, 2)
f6bcfd97 67
c2dac736 68 btn = wxButton(self, wxNewId(), "<--", style=wxBU_EXACTFIT)
f6bcfd97 69 EVT_BUTTON(self, btn.GetId(), self.OnPrevPageButton)
c2dac736 70 btnSizer.Add(btn, 0, wxEXPAND|wxALL, 2)
f6bcfd97 71
c2dac736 72 btn = wxButton(self, wxNewId(), "-->", style=wxBU_EXACTFIT)
f6bcfd97 73 EVT_BUTTON(self, btn.GetId(), self.OnNextPageButton)
c2dac736
RD
74 btnSizer.Add(btn, 0, wxEXPAND|wxALL, 2)
75
76 btn = wxButton(self, wxNewId(), "Stop", style=wxBU_EXACTFIT)
77 EVT_BUTTON(self, btn.GetId(), self.OnStopButton)
78 btnSizer.Add(btn, 0, wxEXPAND|wxALL, 2)
79
80 btn = wxButton(self, wxNewId(), "Search", style=wxBU_EXACTFIT)
81 EVT_BUTTON(self, btn.GetId(), self.OnSearchPageButton)
82 btnSizer.Add(btn, 0, wxEXPAND|wxALL, 2)
83
84 btn = wxButton(self, wxNewId(), "Refresh", style=wxBU_EXACTFIT)
85 EVT_BUTTON(self, btn.GetId(), self.OnRefreshPageButton)
86 btnSizer.Add(btn, 0, wxEXPAND|wxALL, 2)
f6bcfd97
BP
87
88 txt = wxStaticText(self, -1, "Location:")
c2dac736 89 btnSizer.Add(txt, 0, wxCENTER|wxALL, 2)
f6bcfd97
BP
90
91 self.location = wxComboBox(self, wxNewId(), "", style=wxCB_DROPDOWN)
92 EVT_COMBOBOX(self, self.location.GetId(), self.OnLocationSelect)
93 EVT_KEY_UP(self.location, self.OnLocationKey)
342639eb 94 EVT_CHAR(self.location, self.IgnoreReturn)
c2dac736 95 btnSizer.Add(self.location, 1, wxEXPAND|wxALL, 2)
f6bcfd97
BP
96
97 sizer.Add(btnSizer, 0, wxEXPAND)
98 sizer.Add(self.ie, 1, wxEXPAND)
99
100 self.ie.Navigate(self.current)
101 self.location.Append(self.current)
102
103 self.SetSizer(sizer)
1e4a197e 104 self.SetAutoLayout(True)
f6bcfd97
BP
105 EVT_SIZE(self, self.OnSize)
106
63b6646e 107 EVT_WINDOW_DESTROY(self, self.OnDestroy)
f6bcfd97 108
f6bcfd97 109
1e4a197e
RD
110 def ShutdownDemo(self):
111 # put the frame title back
112 if self.frame:
113 self.frame.SetTitle(self.titleBase)
114
115
63b6646e 116 def OnDestroy(self, evt):
f6bcfd97
BP
117 if self.ie:
118 self.ie.Cleanup()
119 self.ie = None
47eea71e 120 self.frame = None
f6bcfd97 121
63b6646e
RD
122
123 def OnSize(self, evt):
124 self.Layout()
125
126
f6bcfd97
BP
127 def OnLocationSelect(self, evt):
128 url = self.location.GetStringSelection()
129 self.log.write('OnLocationSelect: %s\n' % url)
130 self.ie.Navigate(url)
131
132 def OnLocationKey(self, evt):
133 if evt.KeyCode() == WXK_RETURN:
134 URL = self.location.GetValue()
135 self.location.Append(URL)
136 self.ie.Navigate(URL)
137 else:
138 evt.Skip()
139
140 def IgnoreReturn(self, evt):
141 print 'IgnoreReturn'
142 if evt.KeyCode() != WXK_RETURN:
143 evt.Skip()
144
145 def OnOpenButton(self, event):
146 dlg = wxTextEntryDialog(self, "Open Location",
147 "Enter a full URL or local path",
148 self.current, wxOK|wxCANCEL)
149 dlg.CentreOnParent()
150 if dlg.ShowModal() == wxID_OK:
151 self.current = dlg.GetValue()
152 self.ie.Navigate(self.current)
153 dlg.Destroy()
154
155 def OnHomeButton(self, event):
156 self.ie.GoHome() ## ET Phone Home!
157
158 def OnPrevPageButton(self, event):
159 self.ie.GoBack()
160
f6bcfd97
BP
161 def OnNextPageButton(self, event):
162 self.ie.GoForward()
163
c2dac736
RD
164 def OnStopButton(self, evt):
165 self.ie.Stop()
166
167 def OnSearchPageButton(self, evt):
168 self.ie.GoSearch()
169
170 def OnRefreshPageButton(self, evt):
171 self.ie.Refresh2(3)
172
173
f6bcfd97
BP
174
175 # The following event handlers are called by the web browser COM
176 # control since we passed self to MakeActiveXClass. It will look
177 # here for matching attributes and call them if they exist. See the
178 # module generated by makepy for details of method names, etc.
179 def OnBeforeNavigate2(self, pDisp, URL, *args):
180 self.log.write('OnBeforeNavigate2: %s\n' % URL)
181
182 def OnNavigateComplete2(self, pDisp, URL):
183 self.log.write('OnNavigateComplete2: %s\n' % URL)
184 self.current = URL
185 self.location.SetValue(URL)
186
187 def OnTitleChange(self, text):
188 self.log.write('OnTitleChange: %s\n' % text)
189 if self.frame:
190 self.frame.SetTitle(self.titleBase + ' -- ' + text)
191
192 def OnStatusTextChange(self, text):
193 self.log.write('OnStatusTextChange: %s\n' % text)
194 if self.frame:
195 self.frame.SetStatusText(text)
196
197
198#----------------------------------------------------------------------
199# for the demo framework...
200
201def runTest(frame, nb, log):
202 if wxPlatform == '__WXMSW__':
203 win = TestPanel(nb, log, frame)
204 return win
205 else:
206 dlg = wxMessageDialog(frame, 'This demo only works on MSW.',
207 'Sorry', wxOK | wxICON_INFORMATION)
208 dlg.ShowModal()
209 dlg.Destroy()
210
211
212overview = __doc__
213
214#----------------------------------------------------------------------
215
216
217if __name__ == '__main__':
218 class TestFrame(wxFrame):
219 def __init__(self):
220 wxFrame.__init__(self, None, -1, "ActiveX test -- Internet Explorer",
221 size=(640, 480),
222 style=wxDEFAULT_FRAME_STYLE|wxNO_FULL_REPAINT_ON_RESIZE)
223 self.CreateStatusBar()
224 self.tp = TestPanel(self, sys.stdout, self)
47eea71e 225 EVT_CLOSE(self, self.OnCloseWindow)
f6bcfd97 226
47eea71e
RD
227 def OnCloseWindow(self, evt):
228 self.tp.Destroy()
229 self.Destroy()
f6bcfd97
BP
230
231 app = wxPySimpleApp()
232 frame = TestFrame()
1e4a197e 233 frame.Show(True)
f6bcfd97
BP
234 app.MainLoop()
235
236
237