]> git.saurik.com Git - wxWidgets.git/blame - utils/emulator/src/emulator.cpp
more GTK-ish toolbar drawing
[wxWidgets.git] / utils / emulator / src / emulator.cpp
CommitLineData
3373d6bf
JS
1/////////////////////////////////////////////////////////////////////////////
2// Name: emulator.cpp
3// Purpose: Emulator wxWindows sample
4// Author: Julian Smart
5// Modified by:
6// Created: 04/01/98
7// RCS-ID: $Id$
8// Copyright: (c) Julian Smart
9// Licence: wxWindows licence
10/////////////////////////////////////////////////////////////////////////////
11
12// ============================================================================
13// declarations
14// ============================================================================
15
16#ifdef __GNUG__
17 #pragma implementation "emulator.h"
18#endif
19
20// ----------------------------------------------------------------------------
21// headers
22// ----------------------------------------------------------------------------
23
24// For compilers that support precompilation, includes "wx/wx.h".
25#include "wx/wxprec.h"
26
27#ifdef __BORLANDC__
28 #pragma hdrstop
29#endif
30
31// for all others, include the necessary headers (this file is usually all you
32// need because it includes almost all "standard" wxWindows headers)
33#ifndef WX_PRECOMP
34 #include "wx/wx.h"
35#endif
36
3373d6bf
JS
37#ifdef __WXX11__
38#include "wx/x11/reparent.h"
39#endif
40
0470b382
JS
41#include "emulator.h"
42
3373d6bf
JS
43// ----------------------------------------------------------------------------
44// resources
45// ----------------------------------------------------------------------------
46
47// the application icon (under Windows and OS/2 it is in resources)
48#if defined(__WXGTK__) || defined(__WXMOTIF__) || defined(__WXMAC__) || defined(__WXMGL__) || defined(__WXX11__)
49 #include "mondrian.xpm"
50#endif
51
52// ----------------------------------------------------------------------------
53// event tables and other macros for wxWindows
54// ----------------------------------------------------------------------------
55
56// the event tables connect the wxWindows events with the functions (event
57// handlers) which process them. It can be also done at run-time, but for the
58// simple menu events like this the static method is much simpler.
59BEGIN_EVENT_TABLE(wxEmulatorFrame, wxFrame)
60 EVT_MENU(Emulator_Quit, wxEmulatorFrame::OnQuit)
61 EVT_MENU(Emulator_About, wxEmulatorFrame::OnAbout)
62END_EVENT_TABLE()
63
64// Create a new application object: this macro will allow wxWindows to create
65// the application object during program execution (it's better than using a
66// static object for many reasons) and also declares the accessor function
67// wxGetApp() which will return the reference of the right type (i.e. wxEmulatorApp and
68// not wxApp)
69IMPLEMENT_APP(wxEmulatorApp)
70
71// ============================================================================
72// implementation
73// ============================================================================
74
75// ----------------------------------------------------------------------------
76// the application class
77// ----------------------------------------------------------------------------
78
79wxEmulatorApp::wxEmulatorApp()
80{
81 m_xnestWindow = NULL;
82 m_containerWindow = NULL;
83}
84
85// 'Main program' equivalent: the program execution "starts" here
86bool wxEmulatorApp::OnInit()
87{
88 wxInitAllImageHandlers();
89
90 // create the main application window
91 wxEmulatorFrame *frame = new wxEmulatorFrame(_T("wxEmulator"),
92 wxPoint(50, 50), wxSize(450, 340));
93
94 m_containerWindow = new wxEmulatorContainer(frame, -1);
95
96 // Load the emulation info
97 if (!LoadEmulator())
98 {
99 frame->Destroy();
100 wxMessageBox(wxT("Sorry, could not load this emulator. Please check bitmaps are valid."));
101 return FALSE;
102 }
103
104 if (m_emulatorInfo.m_emulatorBackgroundBitmap.Ok())
105 frame->SetClientSize(m_emulatorInfo.m_emulatorBackgroundBitmap.GetWidth(),
106 m_emulatorInfo.m_emulatorBackgroundBitmap.GetHeight());
107
108 // and show it (the frames, unlike simple controls, are not shown when
109 // created initially)
110 frame->Show(TRUE);
111
112#ifdef __WXX11__
113 m_xnestWindow = new wxAdoptedWindow;
114
115 wxString cmd;
0470b382
JS
116 // cmd.Printf(wxT("Xnest :100 -geometry %dx%d+50+50"),
117 cmd.Printf(wxT("Xnest :100 -geometry %dx%d"),
118 (int) m_emulatorInfo.m_emulatorScreenSize.x, (int) m_emulatorInfo.m_emulatorScreenSize.y);
3373d6bf
JS
119
120 // Asynchronously executes Xnest
121 if (0 == wxExecute(cmd))
122 {
123 frame->Destroy();
124 wxMessageBox(wxT("Sorry, could not run Xnest. Please check your PATH."));
125 return FALSE;
126 }
127
128 wxReparenter reparenter;
129 if (!reparenter.WaitAndReparent(m_containerWindow, m_xnestWindow, wxT("Xnest")))
130 {
131 wxMessageBox(wxT("Sorry, could not reparent Xnest.."));
132 frame->Destroy();
133 return FALSE;
134 }
0470b382
JS
135
136 m_containerWindow->DoResize();
3373d6bf
JS
137#endif
138
139 // success: wxApp::OnRun() will be called which will enter the main message
140 // loop and the application will run. If we returned FALSE here, the
141 // application would exit immediately.
142 return TRUE;
143}
144
145// Load the specified emulator.
146// For now, hard-wired. TODO: make this configurable
147bool wxEmulatorApp::LoadEmulator()
148{
149 m_emulatorInfo.m_emulatorTitle = wxT("iPAQ Emulator");
150
151 m_emulatorInfo.m_emulatorDescription = wxT("No description yet");
152
153 // The offset from the top-left of the main emulator
154 // bitmap and the virtual screen (where Xnest is
155 // positioned)
0470b382 156 m_emulatorInfo.m_emulatorScreenPosition = wxPoint(56, 69);
3373d6bf
JS
157
158 // The emulated screen size
159 m_emulatorInfo.m_emulatorScreenSize = wxSize(240, 320);
160
161 m_emulatorInfo.m_emulatorBackgroundBitmapName = wxT("ipaq01.jpg");
162
163 m_emulatorInfo.m_emulatorBackgroundColour = * wxBLACK;
164
165 return m_emulatorInfo.Load();
166}
167
168// ----------------------------------------------------------------------------
169// main frame
170// ----------------------------------------------------------------------------
171
172// frame constructor
173wxEmulatorFrame::wxEmulatorFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
174 : wxFrame(NULL, -1, title, pos, size)
175{
176 // set the frame icon
177 SetIcon(wxICON(mondrian));
178
179#if wxUSE_MENUS
180 // create a menu bar
181 wxMenu *menuFile = new wxMenu;
182
183 // the "About" item should be in the help menu
184 wxMenu *helpMenu = new wxMenu;
185 helpMenu->Append(Emulator_About, _T("&About...\tF1"), _T("Show about dialog"));
186
187 menuFile->Append(Emulator_Quit, _T("E&xit\tAlt-X"), _T("Quit this program"));
188
189 // now append the freshly created menu to the menu bar...
190 wxMenuBar *menuBar = new wxMenuBar();
191 menuBar->Append(menuFile, _T("&File"));
192 menuBar->Append(helpMenu, _T("&Help"));
193
194 // ... and attach this menu bar to the frame
195 SetMenuBar(menuBar);
196#endif // wxUSE_MENUS
197
198#if wxUSE_STATUSBAR
199 // create a status bar just for fun (by default with 1 pane only)
200 CreateStatusBar(2);
201 SetStatusText(_T("Welcome to wxWindows!"));
202#endif // wxUSE_STATUSBAR
203}
204
205
206// event handlers
207
208void wxEmulatorFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
209{
210 // TRUE is to force the frame to close
211 Close(TRUE);
212}
213
214void wxEmulatorFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
215{
216 wxString msg;
217 msg.Printf( _T("wxEmulator is an environment for testing embedded X11 apps.\n"));
218
219 wxMessageBox(msg, _T("About wxEmulator"), wxOK | wxICON_INFORMATION, this);
220}
221
222IMPLEMENT_CLASS(wxEmulatorContainer, wxWindow)
223
224BEGIN_EVENT_TABLE(wxEmulatorContainer, wxWindow)
225 EVT_SIZE(wxEmulatorContainer::OnSize)
226 EVT_PAINT(wxEmulatorContainer::OnPaint)
227 EVT_ERASE_BACKGROUND(wxEmulatorContainer::OnEraseBackground)
228END_EVENT_TABLE()
229
230wxEmulatorContainer::wxEmulatorContainer(wxWindow* parent, wxWindowID id):
231 wxWindow(parent, id, wxDefaultPosition, wxDefaultSize)
232{
233}
234
235void wxEmulatorContainer::OnSize(wxSizeEvent& event)
0470b382
JS
236{
237 DoResize();
238}
239
240void wxEmulatorContainer::DoResize()
3373d6bf
JS
241{
242 wxSize sz = GetClientSize();
243 if (wxGetApp().m_emulatorInfo.m_emulatorBackgroundBitmap.Ok() &&
244 wxGetApp().m_xnestWindow)
245 {
246 int bitmapWidth = wxGetApp().m_emulatorInfo.m_emulatorBackgroundBitmap.GetWidth();
247 int bitmapHeight = wxGetApp().m_emulatorInfo.m_emulatorBackgroundBitmap.GetHeight();
248
0470b382
JS
249 int x = wxMax(0, (int) ((sz.x - bitmapWidth)/2.0));
250 int y = wxMax(0, (int) ((sz.y - bitmapHeight)/2.0));
3373d6bf
JS
251
252 x += wxGetApp().m_emulatorInfo.m_emulatorScreenPosition.x;
253 y += wxGetApp().m_emulatorInfo.m_emulatorScreenPosition.y;
254
255 wxGetApp().m_xnestWindow->Move(x, y);
256 }
257 Refresh();
258}
259
260void wxEmulatorContainer::OnPaint(wxPaintEvent& event)
261{
262 wxPaintDC dc(this);
263
264 wxSize sz = GetClientSize();
265 if (wxGetApp().m_emulatorInfo.m_emulatorBackgroundBitmap.Ok())
266 {
267 int bitmapWidth = wxGetApp().m_emulatorInfo.m_emulatorBackgroundBitmap.GetWidth();
268 int bitmapHeight = wxGetApp().m_emulatorInfo.m_emulatorBackgroundBitmap.GetHeight();
269
0470b382
JS
270 int x = wxMax(0, (int) ((sz.x - bitmapWidth)/2.0));
271 int y = wxMax(0, (int) ((sz.y - bitmapHeight)/2.0));
3373d6bf
JS
272
273 dc.DrawBitmap(wxGetApp().m_emulatorInfo.m_emulatorBackgroundBitmap, x, y);
274 }
275}
276
277void wxEmulatorContainer::OnEraseBackground(wxEraseEvent& event)
278{
279 wxDC* dc = NULL;
280
281 if (event.GetDC())
282 {
283 dc = event.GetDC();
284 }
285 else
286 {
287 dc = new wxClientDC(this);
288 }
289
290 dc->SetBackground(wxBrush(wxGetApp().m_emulatorInfo.m_emulatorBackgroundColour, wxSOLID));
291 dc->Clear();
292
293 if (!event.GetDC())
294 delete dc;
295}
296
297// Information about the emulator decorations
298
299void wxEmulatorInfo::Copy(const wxEmulatorInfo& info)
300{
301 m_emulatorTitle = info.m_emulatorTitle;
302 m_emulatorDescription = info.m_emulatorDescription;
303 m_emulatorScreenPosition = info.m_emulatorScreenPosition;
304 m_emulatorScreenSize = info.m_emulatorScreenSize;
305 m_emulatorBackgroundBitmap = info.m_emulatorBackgroundBitmap;
306 m_emulatorBackgroundBitmapName = info.m_emulatorBackgroundBitmapName;
307 m_emulatorBackgroundColour = info.m_emulatorBackgroundColour;
308}
309
310// Initialisation
311void wxEmulatorInfo::Init()
312{
313}
314
315// Loads bitmaps
316bool wxEmulatorInfo::Load()
317{
318 if (m_emulatorBackgroundBitmapName.IsEmpty())
319 return FALSE;
320
321 // TODO: prepend current directory if relative name
322 int type = wxDetermineImageType(m_emulatorBackgroundBitmapName);
323 if (type == -1)
324 return FALSE;
325
326 return m_emulatorBackgroundBitmap.LoadFile(m_emulatorBackgroundBitmapName, type);
327}
328
329// Returns the image type, or -1, determined from the extension.
330int wxDetermineImageType(const wxString& filename)
331{
332 wxString path, name, ext;
333
334 wxSplitPath(filename, & path, & name, & ext);
335
336 ext.MakeLower();
337 if (ext == "jpg" || ext == "jpeg")
338 return wxBITMAP_TYPE_JPEG;
339 else if (ext == "gif")
340 return wxBITMAP_TYPE_GIF;
341 else if (ext == "bmp")
342 return wxBITMAP_TYPE_BMP;
343 else if (ext == "png")
344 return wxBITMAP_TYPE_PNG;
345 else if (ext == "pcx")
346 return wxBITMAP_TYPE_PCX;
347 else if (ext == "tif" || ext == "tiff")
348 return wxBITMAP_TYPE_TIF;
349 else
350 return -1;
351}
352
353