]> git.saurik.com Git - wxWidgets.git/blobdiff - utils/emulator/src/emulator.cpp
Support using GetTextExtent() with empty string to get descent in wxOSX.
[wxWidgets.git] / utils / emulator / src / emulator.cpp
index 15c5ee95d4a54dd7a0901572561364185711d704..41ef3eec8fa66e316e815f025671ac02e766d4bb 100644 (file)
@@ -1,6 +1,6 @@
 /////////////////////////////////////////////////////////////////////////////
 // Name:        emulator.cpp
-// Purpose:     Emulator wxWindows sample
+// Purpose:     Emulator wxWidgets sample
 // Author:      Julian Smart
 // Modified by:
 // Created:     04/01/98
 // declarations
 // ============================================================================
 
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
-    #pragma implementation "emulator.h"
-#endif
-
 // ----------------------------------------------------------------------------
 // headers
 // ----------------------------------------------------------------------------
@@ -29,7 +25,7 @@
 #endif
 
 // for all others, include the necessary headers (this file is usually all you
-// need because it includes almost all "standard" wxWindows headers)
+// need because it includes almost all "standard" wxWidgets headers)
 #ifndef WX_PRECOMP
     #include "wx/wx.h"
 #endif
 #include "wx/fileconf.h"
 #include "wx/cmdline.h"
 #include "wx/image.h"
+#include "wx/file.h"
+#include "wx/filename.h"
 
-#ifdef __WXX11__    
+#ifdef __WXX11__
 #include "wx/x11/reparent.h"
 #endif
 
 // ----------------------------------------------------------------------------
 
 // the application icon (under Windows and OS/2 it is in resources)
-#if defined(__WXGTK__) || defined(__WXMOTIF__) || defined(__WXMAC__) || defined(__WXMGL__) || defined(__WXX11__)
+#ifndef wxHAS_IMAGES_IN_RESOURCES
     #include "emulator.xpm"
 #endif
 
 // ----------------------------------------------------------------------------
-// event tables and other macros for wxWindows
+// event tables and other macros for wxWidgets
 // ----------------------------------------------------------------------------
 
-// the event tables connect the wxWindows events with the functions (event
+// the event tables connect the wxWidgets events with the functions (event
 // handlers) which process them. It can be also done at run-time, but for the
 // simple menu events like this the static method is much simpler.
 BEGIN_EVENT_TABLE(wxEmulatorFrame, wxFrame)
@@ -67,7 +65,7 @@ BEGIN_EVENT_TABLE(wxEmulatorFrame, wxFrame)
     EVT_CLOSE(wxEmulatorFrame::OnCloseWindow)
 END_EVENT_TABLE()
 
-// Create a new application object: this macro will allow wxWindows to create
+// Create a new application object: this macro will allow wxWidgets to create
 // the application object during program execution (it's better than using a
 // static object for many reasons) and also declares the accessor function
 // wxGetApp() which will return the reference of the right type (i.e. wxEmulatorApp and
@@ -76,14 +74,14 @@ IMPLEMENT_APP(wxEmulatorApp)
 
 static const wxCmdLineEntryDesc sg_cmdLineDesc[] =
 {
-    { wxCMD_LINE_OPTION, _T("u"), _T("use-display"),   _T("display number to use (default 100)") },
+    { wxCMD_LINE_OPTION, "u", "use-display", "display number to use (default 100)" },
 
-    { wxCMD_LINE_SWITCH, _T("h"), _T("help"),   _T("displays help on the command line parameters") },
-    { wxCMD_LINE_SWITCH, _T("v"), _T("version"),    _T("print version") },
+    { wxCMD_LINE_SWITCH, "h", "help", "displays help on the command line parameters" },
+    { wxCMD_LINE_SWITCH, "v", "version", "print version" },
 
-    { wxCMD_LINE_PARAM,  NULL, NULL, _T("config file 1"), wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL },
+    { wxCMD_LINE_PARAM,  NULL, NULL, "config file 1", wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL },
 
-    { wxCMD_LINE_NONE }
+    wxCMD_LINE_DESC_END
 };
 
 
@@ -107,20 +105,22 @@ wxEmulatorApp::wxEmulatorApp()
 // 'Main program' equivalent: the program execution "starts" here
 bool wxEmulatorApp::OnInit()
 {
-    wxLog::SetTimestamp(NULL);
+#if wxUSE_LOG
+    wxLog::DisableTimestamp();
+#endif // wxUSE_LOG
     wxInitAllImageHandlers();
 
     wxString currentDir = wxGetCwd();
 
     // Use argv to get current app directory
     m_appDir = wxFindAppPath(argv[0], currentDir, wxT("WXEMUDIR"));
-    
+
     // If the development version, go up a directory.
 #ifdef __WXMSW__
-    if ((m_appDir.Right(5).CmpNoCase(_T("DEBUG")) == 0) ||
-        (m_appDir.Right(11).CmpNoCase(_T("DEBUGSTABLE")) == 0) ||
-        (m_appDir.Right(7).CmpNoCase(_T("RELEASE")) == 0) ||
-        (m_appDir.Right(13).CmpNoCase(_T("RELEASESTABLE")) == 0)
+    if ((m_appDir.Right(5).CmpNoCase(wxT("DEBUG")) == 0) ||
+        (m_appDir.Right(11).CmpNoCase(wxT("DEBUGSTABLE")) == 0) ||
+        (m_appDir.Right(7).CmpNoCase(wxT("RELEASE")) == 0) ||
+        (m_appDir.Right(13).CmpNoCase(wxT("RELEASESTABLE")) == 0)
         )
         m_appDir = wxPathOnly(m_appDir);
 #endif
@@ -138,7 +138,7 @@ bool wxEmulatorApp::OnInit()
         wxLog::SetActiveTarget(new wxLogStderr);
 #endif
         parser.Usage();
-        return FALSE;
+        return false;
     }
     if (parser.Found(wxT("v")))
     {
@@ -146,9 +146,9 @@ bool wxEmulatorApp::OnInit()
         wxLog::SetActiveTarget(new wxLogStderr);
 #endif
         wxString msg;
-        msg.Printf(wxT("wxWindows PDA Emulator (c) Julian Smart, 2002 Version %.2f, %s"), wxEMULATOR_VERSION, __DATE__);
+        msg.Printf(wxT("wxWidgets PDA Emulator (c) Julian Smart, 2002 Version %.2f, %s"), wxEMULATOR_VERSION, __DATE__);
         wxLogMessage(msg);
-        return FALSE;
+        return false;
     }
     if (parser.Found(wxT("u"), & m_displayNumber))
     {
@@ -172,30 +172,32 @@ bool wxEmulatorApp::OnInit()
     if (!LoadEmulator(m_appDir))
     {
         //wxMessageBox(wxT("Sorry, could not load this emulator. Please check bitmaps are valid."));
-        return FALSE;        
+        return false;
     }
-    
+
     // create the main application window
-    wxEmulatorFrame *frame = new wxEmulatorFrame(_T("wxEmulator"),
+    wxEmulatorFrame *frame = new wxEmulatorFrame(wxT("wxEmulator"),
                                  wxPoint(50, 50), wxSize(450, 340));
-                                
+
+#if wxUSE_STATUSBAR
     frame->SetStatusText(m_emulatorInfo.m_emulatorTitle, 0);
 
     wxString sizeStr;
     sizeStr.Printf(wxT("Screen: %dx%d"), (int) m_emulatorInfo.m_emulatorScreenSize.x,
             (int) m_emulatorInfo.m_emulatorScreenSize.y);
     frame->SetStatusText(sizeStr, 1);
+#endif // wxUSE_STATUSBAR
 
-    m_containerWindow = new wxEmulatorContainer(frame, -1);
+    m_containerWindow = new wxEmulatorContainer(frame, wxID_ANY);
 
     frame->SetClientSize(m_emulatorInfo.m_emulatorDeviceSize.x,
                          m_emulatorInfo.m_emulatorDeviceSize.y);
-    
+
     // and show it (the frames, unlike simple controls, are not shown when
     // created initially)
-    frame->Show(TRUE);
-    
-#ifdef __WXX11__    
+    frame->Show(true);
+
+#ifdef __WXX11__
     m_xnestWindow = new wxAdoptedWindow;
 
     wxString cmd;
@@ -210,24 +212,24 @@ bool wxEmulatorApp::OnInit()
     {
         frame->Destroy();
         wxMessageBox(wxT("Sorry, could not run Xnest. Please check your PATH."));
-        return FALSE;
+        return false;
     }
-    
+
     wxReparenter reparenter;
     if (!reparenter.WaitAndReparent(m_containerWindow, m_xnestWindow, wxT("Xnest")))
     {
         wxMessageBox(wxT("Sorry, could not reparent Xnest.."));
         frame->Destroy();
-        return FALSE;
+        return false;
     }
 
 #endif
     m_containerWindow->DoResize();
 
     // success: wxApp::OnRun() will be called which will enter the main message
-    // loop and the application will run. If we returned FALSE here, the
+    // loop and the application will run. If we returned false here, the
     // application would exit immediately.
-    return TRUE;
+    return true;
 }
 
 // Prepend the current program directory to the name
@@ -241,7 +243,7 @@ wxString wxEmulatorApp::GetFullAppPath(const wxString& filename) const
         path += '\\';
 #endif
     path += filename;
-    
+
     return path;
 }
 
@@ -259,8 +261,9 @@ bool wxEmulatorApp::LoadEmulator(const wxString& appDir)
 // ----------------------------------------------------------------------------
 
 // frame constructor
-wxEmulatorFrame::wxEmulatorFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
-       : wxFrame(NULL, -1, title, pos, size)
+wxEmulatorFrame::wxEmulatorFrame(const wxString& title,
+    const wxPoint& pos, const wxSize& size)
+    : wxFrame(NULL, wxID_ANY, title, pos, size)
 {
     // set the frame icon
     SetIcon(wxICON(emulator));
@@ -271,14 +274,14 @@ wxEmulatorFrame::wxEmulatorFrame(const wxString& title, const wxPoint& pos, cons
 
     // the "About" item should be in the help menu
     wxMenu *helpMenu = new wxMenu;
-    helpMenu->Append(Emulator_About, _T("&About...\tF1"), _T("Show about dialog"));
+    helpMenu->Append(Emulator_About, wxT("&About\tF1"), wxT("Show about dialog"));
 
-    menuFile->Append(Emulator_Quit, _T("E&xit\tAlt-X"), _T("Quit this program"));
+    menuFile->Append(Emulator_Quit, wxT("E&xit\tAlt-X"), wxT("Quit this program"));
 
     // now append the freshly created menu to the menu bar...
     wxMenuBar *menuBar = new wxMenuBar();
-    menuBar->Append(menuFile, _T("&File"));
-    menuBar->Append(helpMenu, _T("&Help"));
+    menuBar->Append(menuFile, wxT("&File"));
+    menuBar->Append(helpMenu, wxT("&Help"));
 
     // ... and attach this menu bar to the frame
     SetMenuBar(menuBar);
@@ -295,16 +298,16 @@ wxEmulatorFrame::wxEmulatorFrame(const wxString& title, const wxPoint& pos, cons
 
 void wxEmulatorFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
 {
-    // TRUE is to force the frame to close
-    Close(TRUE);
+    // true is to force the frame to close
+    Close(true);
 }
 
 void wxEmulatorFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
 {
     wxString msg;
-    msg.Printf( _T("wxEmulator is an environment for testing embedded X11 apps.\n"));
+    msg.Printf( wxT("wxEmulator is an environment for testing embedded X11 apps.\n"));
 
-    wxMessageBox(msg, _T("About wxEmulator"), wxOK | wxICON_INFORMATION, this);
+    wxMessageBox(msg, wxT("About wxEmulator"), wxOK | wxICON_INFORMATION, this);
 }
 
 void wxEmulatorFrame::OnCloseWindow(wxCloseEvent& WXUNUSED(event))
@@ -346,19 +349,19 @@ void wxEmulatorContainer::DoResize()
     wxSize sz = GetClientSize();
     if (wxGetApp().m_xnestWindow
 #ifdef __WXX11__
-        && wxGetApp().m_xnestWindow->GetMainWindow()
+        && wxGetApp().m_xnestWindow->X11GetMainWindow()
 #endif
         )
     {
         int deviceWidth = wxGetApp().m_emulatorInfo.m_emulatorDeviceSize.x;
         int deviceHeight = wxGetApp().m_emulatorInfo.m_emulatorDeviceSize.y;
-        
+
         int x = wxMax(0, (int) ((sz.x - deviceWidth)/2.0));
         int y = wxMax(0, (int) ((sz.y - deviceHeight)/2.0));
-        
+
         x += wxGetApp().m_emulatorInfo.m_emulatorScreenPosition.x;
         y += wxGetApp().m_emulatorInfo.m_emulatorScreenPosition.y;
-        
+
         wxGetApp().m_xnestWindow->Move(x, y);
     }
     Refresh();
@@ -367,24 +370,24 @@ void wxEmulatorContainer::DoResize()
 void wxEmulatorContainer::OnPaint(wxPaintEvent& WXUNUSED(event))
 {
     wxPaintDC dc(this);
-    
+
     wxSize sz = GetClientSize();
-    if (wxGetApp().m_emulatorInfo.m_emulatorBackgroundBitmap.Ok())
+    if (wxGetApp().m_emulatorInfo.m_emulatorBackgroundBitmap.IsOk())
     {
         int deviceWidth = wxGetApp().m_emulatorInfo.m_emulatorDeviceSize.x;
         int deviceHeight = wxGetApp().m_emulatorInfo.m_emulatorDeviceSize.y;
-        
+
         int x = wxMax(0, (int) ((sz.x - deviceWidth)/2.0));
         int y = wxMax(0, (int) ((sz.y - deviceHeight)/2.0));
-        
+
         dc.DrawBitmap(wxGetApp().m_emulatorInfo.m_emulatorBackgroundBitmap, x, y);
     }
 }
 
 void wxEmulatorContainer::OnEraseBackground(wxEraseEvent& event)
 {
-    wxDC* dc = NULL;
-    
+    wxDC* dc wxDUMMY_INITIALIZE(NULL);
+
     if (event.GetDC())
     {
         dc = event.GetDC();
@@ -393,10 +396,10 @@ void wxEmulatorContainer::OnEraseBackground(wxEraseEvent& event)
     {
         dc = new wxClientDC(this);
     }
-    
+
     dc->SetBackground(wxBrush(wxGetApp().m_emulatorInfo.m_emulatorBackgroundColour, wxSOLID));
     dc->Clear();
-    
+
     if (!event.GetDC())
         delete dc;
 }
@@ -428,27 +431,31 @@ bool wxEmulatorInfo::Load(const wxString& appDir)
 {
     // Try to find absolute path
     wxString absoluteConfigPath = m_emulatorFilename;
-    if (!wxIsAbsolutePath(absoluteConfigPath))
+    if ( !::wxIsAbsolutePath(absoluteConfigPath) )
     {
         wxString currDir = wxGetCwd();
         absoluteConfigPath = currDir + wxString(wxFILE_SEP_PATH) + m_emulatorFilename;
-        if (!wxFileExists(absoluteConfigPath))
+        if ( !wxFile::Exists(absoluteConfigPath) )
         {
-            absoluteConfigPath = appDir + wxString(wxFILE_SEP_PATH) + m_emulatorFilename;
+            absoluteConfigPath = appDir + wxString(wxFILE_SEP_PATH)
+                + m_emulatorFilename;
         }
     }
-    if (!wxFileExists(absoluteConfigPath))
+
+    if ( !wxFile::Exists(absoluteConfigPath) )
     {
         wxString str;
-        str.Printf(wxT("Could not find config file %s"), absoluteConfigPath.c_str()), 
+        str.Printf( wxT("Could not find config file %s"),
+            absoluteConfigPath.c_str() );
+
         wxMessageBox(str);
-        return FALSE;
+        return false;
     }
 
     wxString rootPath = wxPathOnly(absoluteConfigPath);
 
     {
-        wxFileConfig config(wxT("wxEmulator"), wxT("wxWindows"),
+        wxFileConfig config(wxT("wxEmulator"), wxT("wxWidgets"),
             absoluteConfigPath, wxEmptyString, wxCONFIG_USE_LOCAL_FILE);
 
         config.Read(wxT("/General/title"), & m_emulatorTitle);
@@ -476,33 +483,36 @@ bool wxEmulatorInfo::Load(const wxString& appDir)
         m_emulatorScreenPosition = wxPoint(x, y);
         m_emulatorScreenSize = wxSize(w, h);
     }
-    
-    if (!m_emulatorBackgroundBitmapName.IsEmpty())
+
+    if (!m_emulatorBackgroundBitmapName.empty())
     {
         wxString absoluteBackgroundBitmapName = rootPath + wxString(wxFILE_SEP_PATH) + m_emulatorBackgroundBitmapName;
-        if (!wxFileExists(absoluteBackgroundBitmapName))
+        if ( !wxFile::Exists(absoluteBackgroundBitmapName) )
         {
             wxString str;
-            str.Printf(wxT("Could not find bitmap %s"), absoluteBackgroundBitmapName.c_str()), 
+            str.Printf( wxT("Could not find bitmap %s"),
+                absoluteBackgroundBitmapName.c_str() );
             wxMessageBox(str);
-            return FALSE;
+            return false;
         }
-        
+
         wxBitmapType type = wxDetermineImageType(m_emulatorBackgroundBitmapName);
         if (type == wxBITMAP_TYPE_INVALID)
-            return FALSE;
-        
+            return false;
+
         if (!m_emulatorBackgroundBitmap.LoadFile(m_emulatorBackgroundBitmapName, type))
         {
             wxString str;
-            str.Printf(wxT("Could not load bitmap file %s"), m_emulatorBackgroundBitmapName.c_str()), 
+            str.Printf( wxT("Could not load bitmap file %s"),
+                m_emulatorBackgroundBitmapName.c_str() );
             wxMessageBox(str);
-            return FALSE;
+            return false;
         }
+
         m_emulatorDeviceSize = wxSize(m_emulatorBackgroundBitmap.GetWidth(),
             m_emulatorBackgroundBitmap.GetHeight());
     }
-    return TRUE;
+    return true;
 }
 
 // Returns the image type, or -1, determined from the extension.
@@ -510,22 +520,22 @@ wxBitmapType wxDetermineImageType(const wxString& filename)
 {
     wxString path, name, ext;
 
-    wxSplitPath(filename, & path, & name, & ext);
+    wxFileName::SplitPath(filename, & path, & name, & ext);
 
     ext.MakeLower();
-    if (ext == _T("jpg") || ext == _T("jpeg"))
+    if (ext == wxT("jpg") || ext == wxT("jpeg"))
         return wxBITMAP_TYPE_JPEG;
-    if (ext == _T("gif"))
+    if (ext == wxT("gif"))
         return wxBITMAP_TYPE_GIF;
-    if (ext == _T("bmp"))
+    if (ext == wxT("bmp"))
         return wxBITMAP_TYPE_BMP;
-    if (ext == _T("png"))
+    if (ext == wxT("png"))
         return wxBITMAP_TYPE_PNG;
-    if (ext == _T("pcx"))
+    if (ext == wxT("pcx"))
         return wxBITMAP_TYPE_PCX;
-    if (ext == _T("tif") || ext == _T("tiff"))
-        return wxBITMAP_TYPE_TIF;
-    
+    if (ext == wxT("tif") || ext == wxT("tiff"))
+        return wxBITMAP_TYPE_TIFF;
+
     return wxBITMAP_TYPE_INVALID;
 }
 
@@ -544,12 +554,9 @@ wxString wxColourToHexString(const wxColour& col)
 // Convert 6-digit hex string to a colour
 wxColour wxHexStringToColour(const wxString& hex)
 {
-    unsigned int r = 0;
-    unsigned int g = 0;
-    unsigned int b = 0;
-    r = wxHexToDec(hex.Mid(0, 2));
-    g = wxHexToDec(hex.Mid(2, 2));
-    b = wxHexToDec(hex.Mid(4, 2));
+    unsigned char r = (unsigned char)wxHexToDec(hex.Mid(0, 2));
+    unsigned char g = (unsigned char)wxHexToDec(hex.Mid(2, 2));
+    unsigned char b = (unsigned char)wxHexToDec(hex.Mid(4, 2));
 
     return wxColour(r, g, b);
 }
@@ -565,10 +572,10 @@ wxString wxFindAppPath(const wxString& argv0, const wxString& cwd, const wxStrin
     wxString str;
 
     // Try appVariableName
-    if (!appVariableName.IsEmpty())
+    if (!appVariableName.empty())
     {
         str = wxGetenv(appVariableName);
-        if (!str.IsEmpty())
+        if (!str.empty())
             return str;
     }
 
@@ -582,7 +589,7 @@ wxString wxFindAppPath(const wxString& argv0, const wxString& cwd, const wxStrin
             currentDir += wxFILE_SEP_PATH;
 
         str = currentDir + argv0;
-        if (wxFileExists(str))
+        if ( wxFile::Exists(str) )
             return wxPathOnly(str);
     }
 
@@ -592,7 +599,7 @@ wxString wxFindAppPath(const wxString& argv0, const wxString& cwd, const wxStrin
     wxPathList pathList;
     pathList.AddEnvList(wxT("PATH"));
     str = pathList.FindAbsoluteValidPath(argv0);
-    if (!str.IsEmpty())
+    if (!str.empty())
         return wxPathOnly(str);
 
     // Failed