]> git.saurik.com Git - wxWidgets.git/blame - samples/oleauto/oleauto.cpp
Fix, or at least make less common, deadlock in the thread sample.
[wxWidgets.git] / samples / oleauto / oleauto.cpp
CommitLineData
8d7dafc9
JS
1/////////////////////////////////////////////////////////////////////////////
2// Name: oleauto.cpp
be5a51fb 3// Purpose: OLE Automation wxWidgets sample
8d7dafc9
JS
4// Author: Julian Smart
5// Modified by:
6// Created: 08/12/98
7// RCS-ID: $Id$
8// Copyright: (c) Julian Smart
9// Licence: wxWindows licence
10/////////////////////////////////////////////////////////////////////////////
11
12// ============================================================================
13// declarations
14// ============================================================================
15
16// ----------------------------------------------------------------------------
17// headers
18// ----------------------------------------------------------------------------
8d7dafc9
JS
19
20// For compilers that support precompilation, includes "wx/wx.h".
21#include "wx/wxprec.h"
22
23#ifdef __BORLANDC__
24 #pragma hdrstop
25#endif
26
27// for all others, include the necessary headers (this file is usually all you
be5a51fb 28// need because it includes almost all "standard" wxWidgets headers
8d7dafc9
JS
29#ifndef WX_PRECOMP
30 #include "wx/wx.h"
31#endif
32
b20edf8b 33#include "wx/msw/ole/automtn.h"
8d7dafc9 34
bb5a9514 35#ifndef __WINDOWS__
8d7dafc9
JS
36#error "Sorry, this sample works under Windows only."
37#endif
38
39// ----------------------------------------------------------------------------
40// ressources
41// ----------------------------------------------------------------------------
42// the application icon
e7092398 43#ifndef wxHAS_IMAGES_IN_RESOURCES
3cb332c1 44 #include "../sample.xpm"
8d7dafc9
JS
45#endif
46
47// ----------------------------------------------------------------------------
48// private classes
49// ----------------------------------------------------------------------------
50
51// Define a new application type, each program should derive a class from wxApp
52class MyApp : public wxApp
53{
54public:
55 // override base class virtuals
56 // ----------------------------
57
58 // this one is called on application startup and is a good place for the app
59 // initialization (doing it here and not in the ctor allows to have an error
60 // return: if OnInit() returns false, the application terminates)
61 virtual bool OnInit();
62};
63
64// Define a new frame type: this is going to be our main frame
65class MyFrame : public wxFrame
66{
67public:
68 // ctor(s)
69 MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size);
70
71 // event handlers (these functions should _not_ be virtual)
72 void OnQuit(wxCommandEvent& event);
73 void OnAbout(wxCommandEvent& event);
74 void OnTest(wxCommandEvent& event);
75
76private:
be5a51fb 77 // any class wishing to process wxWidgets events must use this macro
8d7dafc9
JS
78 DECLARE_EVENT_TABLE()
79};
80
81// ----------------------------------------------------------------------------
82// constants
83// ----------------------------------------------------------------------------
84
85// IDs for the controls and the menu commands
86enum
87{
88 // menu items
89 OleAuto_Quit = 1,
90 OleAuto_About,
91 OleAuto_Test,
92
93 // controls start here (the numbers are, of course, arbitrary)
004f4002 94 OleAuto_Text = 1000
8d7dafc9
JS
95};
96
97// ----------------------------------------------------------------------------
be5a51fb 98// event tables and other macros for wxWidgets
8d7dafc9
JS
99// ----------------------------------------------------------------------------
100
be5a51fb 101// the event tables connect the wxWidgets events with the functions (event
8d7dafc9
JS
102// handlers) which process them. It can be also done at run-time, but for the
103// simple menu events like this the static method is much simpler.
104BEGIN_EVENT_TABLE(MyFrame, wxFrame)
105 EVT_MENU(OleAuto_Quit, MyFrame::OnQuit)
106 EVT_MENU(OleAuto_About, MyFrame::OnAbout)
107 EVT_MENU(OleAuto_Test, MyFrame::OnTest)
108END_EVENT_TABLE()
109
be5a51fb 110// Create a new application object: this macro will allow wxWidgets to create
8d7dafc9
JS
111// the application object during program execution (it's better than using a
112// static object for many reasons) and also declares the accessor function
113// wxGetApp() which will return the reference of the right type (i.e. MyApp and
114// not wxApp)
115IMPLEMENT_APP(MyApp)
116
117// ============================================================================
118// implementation
119// ============================================================================
120
121// ----------------------------------------------------------------------------
122// the application class
123// ----------------------------------------------------------------------------
124
125// `Main program' equivalent: the program execution "starts" here
126bool MyApp::OnInit()
127{
45e6e6f8
VZ
128 if ( !wxApp::OnInit() )
129 return false;
130
8d7dafc9 131 // Create the main application window
9a83f860 132 MyFrame *frame = new MyFrame(wxT("OleAuto wxWidgets App"),
8d7dafc9
JS
133 wxPoint(50, 50), wxSize(450, 340));
134
18f42b94 135 // Show it
7cdd78f6 136 frame->Show(true);
8d7dafc9
JS
137
138 // success: wxApp::OnRun() will be called which will enter the main message
7cdd78f6 139 // loop and the application will run. If we returned false here, the
8d7dafc9 140 // application would exit immediately.
7cdd78f6 141 return true;
8d7dafc9
JS
142}
143
144// ----------------------------------------------------------------------------
145// main frame
146// ----------------------------------------------------------------------------
147
148// frame constructor
149MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
7cdd78f6 150 : wxFrame((wxFrame *)NULL, wxID_ANY, title, pos, size)
8d7dafc9
JS
151{
152 // set the frame icon
3cb332c1 153 SetIcon(wxICON(sample));
8d7dafc9
JS
154
155 // create a menu bar
156 wxMenu *menuFile = new wxMenu;
157
9a83f860 158 menuFile->Append(OleAuto_Test, wxT("&Test Excel Automation..."));
2d143b66 159 menuFile->Append(OleAuto_About, wxT("&About"));
8d7dafc9 160 menuFile->AppendSeparator();
9a83f860 161 menuFile->Append(OleAuto_Quit, wxT("E&xit"));
8d7dafc9
JS
162
163 // now append the freshly created menu to the menu bar...
164 wxMenuBar *menuBar = new wxMenuBar;
9a83f860 165 menuBar->Append(menuFile, wxT("&File"));
8d7dafc9
JS
166
167 // ... and attach this menu bar to the frame
168 SetMenuBar(menuBar);
169
8520f137 170#if wxUSE_STATUSBAR
8d7dafc9
JS
171 // create a status bar just for fun (by default with 1 pane only)
172 CreateStatusBar(2);
9a83f860 173 SetStatusText(wxT("Welcome to wxWidgets!"));
8520f137 174#endif // wxUSE_STATUSBAR
8d7dafc9
JS
175}
176
177
178// event handlers
179
180void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
181{
7cdd78f6
WS
182 // true is to force the frame to close
183 Close(true);
8d7dafc9
JS
184}
185
186void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
187{
9a83f860
VZ
188 wxMessageBox(wxT("This is an OLE Automation sample"),
189 wxT("About OleAuto"), wxOK | wxICON_INFORMATION, this);
8d7dafc9
JS
190}
191
192/* Tests OLE automation by making the active Excel cell bold,
193 * and changing the text.
194 */
195void MyFrame::OnTest(wxCommandEvent& WXUNUSED(event))
196{
6eefca4f
VZ
197 wxMessageBox(wxT("Excel will be started if it is not running after you have pressed OK button.")
198 wxT("\nThe active cell should then say 'wxWidgets automation test!' in bold."),
199 wxT("Excel start"));
8d7dafc9 200
6eefca4f
VZ
201 wxAutomationObject excelObject;
202 if ( !excelObject.GetInstance(wxT("Excel.Application")) )
2f6c54eb 203 {
6eefca4f
VZ
204 wxLogError(wxT("Could not create Excel object."));
205 return;
2f6c54eb 206 }
56270af4
VZ
207
208 // Ensure that Excel is visible
9a83f860 209 if (!excelObject.PutProperty(wxT("Visible"), true))
56270af4 210 {
6eefca4f 211 wxLogError(wxT("Could not make Excel object visible"));
56270af4 212 }
9a83f860 213 const wxVariant workbooksCountVariant = excelObject.GetProperty(wxT("Workbooks.Count"));
56270af4
VZ
214 if (workbooksCountVariant.IsNull())
215 {
6eefca4f 216 wxLogError(wxT("Could not get workbooks count"));
56270af4
VZ
217 return;
218 }
219 const long workbooksCount = workbooksCountVariant;
220 if (workbooksCount == 0)
221 {
9a83f860 222 const wxVariant workbook = excelObject.CallMethod(wxT("Workbooks.Add"));
56270af4
VZ
223 if (workbook.IsNull())
224 {
6eefca4f 225 wxLogError(wxT("Could not create new Workbook"));
56270af4
VZ
226 return;
227 }
228 }
229
9a83f860 230 if (!excelObject.PutProperty(wxT("ActiveCell.Value"), wxT("wxWidgets automation test!")))
2f6c54eb 231 {
6eefca4f 232 wxLogError(wxT("Could not set active cell value."));
2f6c54eb
VZ
233 return;
234 }
9a83f860 235 if (!excelObject.PutProperty(wxT("ActiveCell.Font.Bold"), wxVariant(true)) )
2f6c54eb 236 {
6eefca4f 237 wxLogError(wxT("Could not put Bold property to active cell."));
2f6c54eb
VZ
238 return;
239 }
8d7dafc9 240}