]> git.saurik.com Git - wxWidgets.git/blob - wxPython/contrib/activex/wxie/wxIEFrm.cpp
fixed wxVsnprintf() to write as much as it can if the output buffer is too short
[wxWidgets.git] / wxPython / contrib / activex / wxie / wxIEFrm.cpp
1 /*
2 wxActiveX Library Licence, Version 3
3 ====================================
4
5 Copyright (C) 2003 Lindsay Mathieson [, ...]
6
7 Everyone is permitted to copy and distribute verbatim copies
8 of this licence document, but changing it is not allowed.
9
10 wxActiveX LIBRARY LICENCE
11 TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
12
13 This library is free software; you can redistribute it and/or modify it
14 under the terms of the GNU Library General Public Licence as published by
15 the Free Software Foundation; either version 2 of the Licence, or (at
16 your option) any later version.
17
18 This library is distributed in the hope that it will be useful, but
19 WITHOUT ANY WARRANTY; without even the implied warranty of
20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library
21 General Public Licence for more details.
22
23 You should have received a copy of the GNU Library General Public Licence
24 along with this software, usually in a file named COPYING.LIB. If not,
25 write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
26 Boston, MA 02111-1307 USA.
27
28 EXCEPTION NOTICE
29
30 1. As a special exception, the copyright holders of this library give
31 permission for additional uses of the text contained in this release of
32 the library as licenced under the wxActiveX Library Licence, applying
33 either version 3 of the Licence, or (at your option) any later version of
34 the Licence as published by the copyright holders of version 3 of the
35 Licence document.
36
37 2. The exception is that you may use, copy, link, modify and distribute
38 under the user's own terms, binary object code versions of works based
39 on the Library.
40
41 3. If you copy code from files distributed under the terms of the GNU
42 General Public Licence or the GNU Library General Public Licence into a
43 copy of this library, as this licence permits, the exception does not
44 apply to the code that you add in this way. To avoid misleading anyone as
45 to the status of such modified files, you must delete this exception
46 notice from such code and/or adjust the licensing conditions notice
47 accordingly.
48
49 4. If you write modifications of your own for this library, it is your
50 choice whether to permit this exception to apply to your modifications.
51 If you do not wish that, you must delete the exception notice from such
52 code and/or adjust the licensing conditions notice accordingly.
53 */
54
55 // ----------------------------------------------------------------------------
56 // headers
57 // ----------------------------------------------------------------------------
58 // For compilers that support precompilation, includes "wx/wx.h".
59 #if defined(__WXGTK__) || defined(__WXMOTIF__)
60 #include "wx/wx.h"
61 #endif
62 #include "wx/wxprec.h"
63 #include "wx/filedlg.h"
64 #include "wxIEApp.h"
65 #include "wxIEFrm.h"
66 #include "wxActiveXFrame.h"
67 #include <istream>
68 #include <fstream>
69 using namespace std;
70 #include <exdispid.h>
71
72 // ----------------------------------------------------------------------------
73 // resources
74 // ----------------------------------------------------------------------------
75 // the application icon
76 #if defined(__WXGTK__) || defined(__WXMOTIF__)
77 #include "wxIE.xpm"
78 #endif
79
80 // ----------------------------------------------------------------------------
81 // constants
82 // ----------------------------------------------------------------------------
83
84 // IDs for the controls and the menu commands
85 enum
86 {
87 // menu items
88 FILE_QUIT = 1,
89 FILE_OPEN,
90 FILE_BROWSE,
91 FILE_HTML_EDITMODE,
92 FILE_TEST_HTML,
93 FILE_TEST_SELECT,
94 FILE_TEST_HTMLSELECT,
95 FILE_TEST_GETTEXT,
96 FILE_TEST_HTMLGETTEXT,
97 FILE_TEST_HOME,
98 FILE_TEST_ACTIVEX,
99 FILE_ABOUT,
100
101 // controls
102 ID_MSHTML = 501,
103 ID_PROGRESS_GAUGE
104 };
105
106 // ----------------------------------------------------------------------------
107 // event tables and other macros for wxWindows
108 // ----------------------------------------------------------------------------
109
110 // the event tables connect the wxWindows events with the functions (event
111 // handlers) which process them. It can be also done at run-time, but for the
112 // simple menu events like this the static method is much simpler.
113 BEGIN_EVENT_TABLE(wxIEFrame, wxFrame)
114 EVT_SIZE(wxIEFrame::OnSize)
115 EVT_MENU(FILE_QUIT, wxIEFrame::OnQuit)
116 EVT_MENU(FILE_BROWSE, wxIEFrame::OnBrowse)
117 EVT_MENU(FILE_OPEN, wxIEFrame::OnOpen)
118 EVT_MENU(FILE_HTML_EDITMODE, wxIEFrame::OnEditMode)
119 EVT_UPDATE_UI(FILE_HTML_EDITMODE, wxIEFrame::OnEditModeUI)
120 EVT_MENU(FILE_TEST_HTML, wxIEFrame::OnTestHTML)
121 EVT_MENU(FILE_TEST_SELECT, wxIEFrame::OnTestSelect)
122 EVT_MENU(FILE_TEST_HTMLSELECT, wxIEFrame::OnTestHTMLSelect)
123 EVT_MENU(FILE_TEST_GETTEXT, wxIEFrame::OnTestGetText)
124 EVT_MENU(FILE_TEST_HTMLGETTEXT, wxIEFrame::OnTestHTMLGetText)
125 EVT_MENU(FILE_TEST_HOME, wxIEFrame::OnTestHome)
126 EVT_MENU(FILE_TEST_ACTIVEX, wxIEFrame::OnTestActiveX)
127 EVT_MENU(FILE_ABOUT, wxIEFrame::OnAbout)
128
129 // ActiveX Events
130 EVT_ACTIVEX_DISPID(ID_MSHTML, DISPID_STATUSTEXTCHANGE, OnMSHTMLStatusTextChangeX)
131 EVT_ACTIVEX(ID_MSHTML, "BeforeNavigate2", OnMSHTMLBeforeNavigate2X)
132 EVT_ACTIVEX(ID_MSHTML, "TitleChange", OnMSHTMLTitleChangeX)
133 EVT_ACTIVEX(ID_MSHTML, "NewWindow2", OnMSHTMLNewWindow2X)
134 EVT_ACTIVEX(ID_MSHTML, "ProgressChange", OnMSHTMLProgressChangeX)
135 END_EVENT_TABLE()
136
137 // ----------------------------------------------------------------------------
138 // main frame
139 // ----------------------------------------------------------------------------
140
141 // frame constructor
142 wxIEFrame::wxIEFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
143 : wxFrame((wxFrame *)NULL, -1, title, pos, size)
144 {
145 // set the frame icon
146 SetIcon(wxICON(wxIE));
147
148 // create a menu bar
149 wxMenu *menuFile = new wxMenu("", wxMENU_TEAROFF);
150
151 // the "About" item should be in the help menu
152 wxMenu *helpMenu = new wxMenu;
153 helpMenu->Append(FILE_ABOUT, "&About...\tCtrl-A", "Show about dialog");
154
155 menuFile->Append(FILE_TEST_HTML, "Test HTML", "Demonstrates LoadString()");
156 menuFile->Append(FILE_OPEN, "Open HTML File", "Demonstrates LoadStream(istream *)");
157 menuFile->Append(FILE_BROWSE, "Browse Web Page", "Demonstrates LoadUrl(url)");
158 menuFile->Append(FILE_HTML_EDITMODE, "Edit Mode", "Demonstrates editing html", true);
159 menuFile->AppendSeparator();
160 menuFile->Append(FILE_TEST_SELECT, "Get Selected Text", "Demonstrates GetStringSelection(false)");
161 menuFile->Append(FILE_TEST_HTMLSELECT, "Get HTML Selected Text", "Demonstrates GetStringSelection(true)");
162 menuFile->AppendSeparator();
163 menuFile->Append(FILE_TEST_GETTEXT, "Get Text", "Demonstrates GetText(false)");
164 menuFile->Append(FILE_TEST_HTMLGETTEXT, "Get HTML Text", "Demonstrates GetText(true)");
165 menuFile->Append(FILE_TEST_HOME, "Open Home Page", "Demonstrates GoHome()");
166 menuFile->AppendSeparator();
167 menuFile->Append(FILE_TEST_ACTIVEX, "Display a ActiveX control", "Demonstrates the Generic ActiveX Container");
168 menuFile->AppendSeparator();
169 menuFile->Append(FILE_QUIT, "E&xit\tAlt-X", "Quit this program");
170
171 // now append the freshly created menu to the menu bar...
172 wxMenuBar *menuBar = new wxMenuBar();
173 menuBar->Append(menuFile, "&File");
174 menuBar->Append(helpMenu, "&Help");
175
176 // ... and attach this menu bar to the frame
177 SetMenuBar(menuBar);
178
179 // create a status bar just for fun (by default with 1 pane only)
180 wxStatusBar * sb = CreateStatusBar(2);
181 SetStatusText("Ready");
182
183 // progress gauge (belongs to status bar)
184 m_gauge = new wxGauge(sb, ID_PROGRESS_GAUGE, 100);
185
186 // IE Control
187 m_ie = new wxIEHtmlWin(this, ID_MSHTML);
188
189 }
190
191
192 // event handlers
193
194 void wxIEFrame::OnSize(wxSizeEvent& event)
195 {
196 wxFrame::OnSize(event);
197
198 wxStatusBar* sb = GetStatusBar();
199 if (! sb)
200 return;
201
202 wxRect rc;
203 sb->GetFieldRect(1, rc);
204
205 m_gauge->SetSize(rc);
206 };
207
208 void wxIEFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
209 {
210 // TRUE is to force the frame to close
211 Close(TRUE);
212 }
213
214 void wxIEFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
215 {
216 wxString msg;
217 msg.Printf( _T("About wxIE...\n"));
218 wxMessageBox(msg, "About wxIE", wxOK | wxICON_INFORMATION, this);
219 }
220
221 void wxIEFrame::OnTestHTML(wxCommandEvent& WXUNUSED(event))
222 {
223 wxString html =
224 "<HTML><BODY><H1>Hello World</H1>Plain Text</body></html>";
225 m_ie->LoadString(html);
226 }
227
228
229 void wxIEFrame::OnTestSelect(wxCommandEvent& WXUNUSED(event))
230 {
231 wxString s = m_ie->GetStringSelection();
232
233 wxMessageBox(s);
234 }
235
236 void wxIEFrame::OnTestHTMLSelect(wxCommandEvent& WXUNUSED(event))
237 {
238 wxString s = m_ie->GetStringSelection(true);
239
240 wxMessageBox(s);
241 }
242
243 void wxIEFrame::OnTestGetText(wxCommandEvent& WXUNUSED(event))
244 {
245 wxString s = m_ie->GetText();
246
247 wxMessageBox(s);
248 }
249
250 void wxIEFrame::OnTestHTMLGetText(wxCommandEvent& WXUNUSED(event))
251 {
252 wxString s = m_ie->GetText(true);
253
254 wxMessageBox(s);
255 }
256
257 void wxIEFrame::OnTestHome(wxCommandEvent& WXUNUSED(event))
258 {
259 m_ie->GoHome();
260 };
261
262
263 void wxIEFrame::OnOpen(wxCommandEvent& WXUNUSED(event))
264 {
265 wxFileDialog dlg(this, "Chooose a HTML File", "", "", "HTML files (*.html; *.htm)|*.html;*.htm|",wxOPEN);
266
267 if (dlg.ShowModal() == wxID_OK)
268 {
269 wxString fname = dlg.GetPath();
270
271 ifstream *is = new ifstream(fname.mb_str());
272 m_ie->LoadStream(is);
273 };
274 }
275
276 void wxIEFrame::OnEditMode(wxCommandEvent& WXUNUSED(event))
277 {
278 m_ie->SetEditMode(! m_ie->GetEditMode());
279 }
280
281 void wxIEFrame::OnEditModeUI(wxUpdateUIEvent& event)
282 {
283 if (m_ie)
284 event.Check(m_ie->GetEditMode());
285 }
286
287 void wxIEFrame::OnBrowse(wxCommandEvent& WXUNUSED(event))
288 {
289 wxString url = wxGetTextFromUser("Enter URL:", "Browse", "", this);
290
291 m_ie->LoadUrl(url);
292 }
293
294 void wxIEFrame::OnMSHTMLStatusTextChangeX(wxActiveXEvent& event)
295 {
296 SetStatusText(event["Text"]);
297 };
298
299
300 void wxIEFrame::OnMSHTMLBeforeNavigate2X(wxActiveXEvent& event)
301 {
302 wxString url = event["Url"];
303 if (url == "about:blank")
304 return;
305
306 int rc = wxMessageBox(url, "Allow open url ?", wxYES_NO);
307
308 if (rc != wxYES)
309 event["Cancel"] = true;
310 };
311
312 void wxIEFrame::OnMSHTMLTitleChangeX(wxActiveXEvent& event)
313 {
314 SetTitle(event["Text"]);
315 };
316
317
318 void wxIEFrame::OnMSHTMLNewWindow2X(wxActiveXEvent& event)
319 {
320 int rc = wxMessageBox("New Window requested", "Allow New Window ?", wxYES_NO);
321
322 if (rc != wxYES)
323 event["Cancel"] = true;
324 };
325
326
327 void wxIEFrame::OnMSHTMLProgressChangeX(wxActiveXEvent& event)
328 {
329 if ((long) event["ProgressMax"] != m_gauge->GetRange())
330 m_gauge->SetRange((long) event["ProgressMax"]);
331
332 m_gauge->SetValue((long) event["Progress"]);
333 };
334
335 void wxIEFrame::OnTestActiveX(wxCommandEvent& WXUNUSED(event))
336 {
337 // Some known prog ids
338 //#define PROGID "Shell.Explorer"
339 //#define PROGID CLSID_WebBrowser
340 //#define PROGID CLSID_MozillaBrowser
341 //#define PROGID CLSID_HTMLDocument
342 //#define PROGID "MSCAL.Calendar"
343 //#define PROGID "WordPad.Document"
344 //#define PROGID "SoftwareFX.ChartFX"
345 //#define PROGID "PDF.PdfCtrl"
346 #define PROGID "ShockwaveFlash.ShockwaveFlash"
347
348 wxDialog dlg(this, -1, wxString(wxT("Test ActiveX")));
349
350 wxFlexGridSizer *sz = new wxFlexGridSizer(2);
351 sz->Add(new wxStaticText(&dlg, -1, wxT("Enter a ActiveX ProgId")), 0, wxALL, 5 );
352
353 wxComboBox *cb = new wxComboBox(&dlg, 101, "");
354 cb->Append(wxT("ShockwaveFlash.ShockwaveFlash"));
355 cb->Append(wxT("MSCAL.Calendar"));
356 cb->Append(wxT("Shell.Explorer"));
357 cb->Append(wxT("WordPad.Document.1"));
358 cb->Append(wxT("SoftwareFX.ChartFX.20"));
359 cb->Append(wxT("PDF.PdfCtrl.5"));
360 cb->SetSelection(0);
361
362 sz->Add(cb, 0, wxALL, 5 );
363
364 // next row
365 sz->Add(new wxButton(&dlg, wxID_CANCEL, "Cancel"), 0, wxALIGN_RIGHT|wxALL, 5 );
366 sz->Add(new wxButton(&dlg, wxID_OK, "Ok"), 0, wxALIGN_RIGHT|wxALL, 5 );
367
368 dlg.SetAutoLayout( TRUE );
369 dlg.SetSizer(sz);
370 sz->Fit(&dlg);
371 sz->SetSizeHints(&dlg);
372
373
374 if (dlg.ShowModal() == wxID_OK)
375 {
376 wxString progId = cb->GetValue();
377 wxActiveXFrame *frame = new wxActiveXFrame(this, progId);
378 frame->Show();
379 };
380 }
381