]> git.saurik.com Git - wxWidgets.git/blobdiff - samples/exec/exec.cpp
Dispatch pending events without waiting for idle time (closes #10994).
[wxWidgets.git] / samples / exec / exec.cpp
index 34a8ff5c6269e2a8e844d2e13720d1650de72ef0..a1e6531af8a771c68e66d24bee22928dffcfba98 100644 (file)
@@ -115,12 +115,13 @@ public:
     void OnPOpen(wxCommandEvent& event);
 
     void OnFileExec(wxCommandEvent& event);
+    void OnFileLaunch(wxCommandEvent& event);
     void OnOpenURL(wxCommandEvent& event);
 
     void OnAbout(wxCommandEvent& event);
 
     // polling output of async processes
-    void OnTimer(wxTimerEvent& event);
+    void OnIdleTimer(wxTimerEvent& event);
     void OnIdle(wxIdleEvent& event);
 
     // for MyPipedProcess
@@ -130,6 +131,9 @@ public:
     // for MyProcess
     void OnAsyncTermination(MyProcess *process);
 
+    // timer updating a counter in the background
+    void OnBgTimer(wxTimerEvent& event);
+
 private:
     void ShowOutput(const wxString& cmd,
                     const wxArrayString& output,
@@ -172,6 +176,10 @@ private:
     // the idle event wake up timer
     wxTimer m_timerIdleWakeUp;
 
+    // a background timer allowing to easily check visually whether the
+    // messages are processed or not
+    wxTimer m_timerBg;
+
     // any class wishing to process wxWidgets events must use this macro
     DECLARE_EVENT_TABLE()
 };
@@ -292,6 +300,10 @@ private:
 // IDs for the controls and the menu commands
 enum
 {
+    // timer ids
+    Exec_TimerIdle = 10,
+    Exec_TimerBg,
+
     // menu items
     Exec_Quit = 100,
     Exec_Kill,
@@ -304,12 +316,13 @@ enum
     Exec_Shell,
     Exec_POpen,
     Exec_OpenFile,
+    Exec_LaunchFile,
     Exec_OpenURL,
     Exec_DDEExec,
     Exec_DDERequest,
     Exec_Redirect,
     Exec_Pipe,
-    Exec_About = 300,
+    Exec_About = wxID_ABOUT,
 
     // control ids
     Exec_Btn_Send = 1000,
@@ -344,6 +357,7 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame)
     EVT_MENU(Exec_POpen, MyFrame::OnPOpen)
 
     EVT_MENU(Exec_OpenFile, MyFrame::OnFileExec)
+    EVT_MENU(Exec_LaunchFile, MyFrame::OnFileLaunch)
     EVT_MENU(Exec_OpenURL, MyFrame::OnOpenURL)
 
 #ifdef __WINDOWS__
@@ -355,7 +369,8 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame)
 
     EVT_IDLE(MyFrame::OnIdle)
 
-    EVT_TIMER(wxID_ANY, MyFrame::OnTimer)
+    EVT_TIMER(Exec_TimerIdle, MyFrame::OnIdleTimer)
+    EVT_TIMER(Exec_TimerBg, MyFrame::OnBgTimer)
 END_EVENT_TABLE()
 
 BEGIN_EVENT_TABLE(MyPipeFrame, wxFrame)
@@ -417,7 +432,8 @@ bool MyApp::OnInit()
 // frame constructor
 MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
        : wxFrame((wxFrame *)NULL, wxID_ANY, title, pos, size),
-         m_timerIdleWakeUp(this)
+         m_timerIdleWakeUp(this, Exec_TimerIdle),
+         m_timerBg(this, Exec_TimerBg)
 {
     m_pidLast = 0;
 
@@ -460,6 +476,8 @@ MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
     execMenu->AppendSeparator();
     execMenu->Append(Exec_OpenFile, _T("Open &file...\tCtrl-F"),
                      _T("Launch the command to open this kind of files"));
+    execMenu->Append(Exec_LaunchFile, _T("La&unch file...\tShift-Ctrl-F"),
+                     _T("Launch the default application associated with the file"));
     execMenu->Append(Exec_OpenURL, _T("Open &URL...\tCtrl-U"),
                      _T("Launch the default browser with the given URL"));
 #ifdef __WINDOWS__
@@ -489,9 +507,11 @@ MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
 
 #if wxUSE_STATUSBAR
     // create a status bar just for fun (by default with 1 pane only)
-    CreateStatusBar();
+    CreateStatusBar(2);
     SetStatusText(_T("Welcome to wxWidgets exec sample!"));
 #endif // wxUSE_STATUSBAR
+
+    m_timerBg.Start(1000);
 }
 
 MyFrame::~MyFrame()
@@ -867,25 +887,33 @@ void MyFrame::OnPOpen(wxCommandEvent& WXUNUSED(event))
     new MyPipeFrame(this, cmd, process);
 }
 
-void MyFrame::OnFileExec(wxCommandEvent& WXUNUSED(event))
-{
-    static wxString s_filename;
+static wxString gs_lastFile;
 
+static bool AskUserForFileName()
+{
     wxString filename;
 
 #if wxUSE_FILEDLG
-    filename = wxLoadFileSelector(_T("any file"), wxEmptyString, s_filename, this);
+    filename = wxLoadFileSelector(_T("any"), wxEmptyString, gs_lastFile);
 #else // !wxUSE_FILEDLG
     filename = wxGetTextFromUser(_T("Enter the file name"), _T("exec sample"),
-                                 s_filename, this);
+                                 gs_lastFile);
 #endif // wxUSE_FILEDLG/!wxUSE_FILEDLG
 
     if ( filename.empty() )
-        return;
+        return false;
+
+    gs_lastFile = filename;
+
+    return true;
+}
 
-    s_filename = filename;
+void MyFrame::OnFileExec(wxCommandEvent& WXUNUSED(event))
+{
+    if ( !AskUserForFileName() )
+        return;
 
-    wxString ext = filename.AfterLast(_T('.'));
+    wxString ext = gs_lastFile.AfterLast(_T('.'));
     wxFileType *ft = wxTheMimeTypesManager->GetFileTypeFromExtension(ext);
     if ( !ft )
     {
@@ -896,7 +924,7 @@ void MyFrame::OnFileExec(wxCommandEvent& WXUNUSED(event))
 
     wxString cmd;
     bool ok = ft->GetOpenCommand(&cmd,
-                                 wxFileType::MessageParameters(filename));
+                                 wxFileType::MessageParameters(gs_lastFile));
     delete ft;
     if ( !ok )
     {
@@ -908,25 +936,36 @@ void MyFrame::OnFileExec(wxCommandEvent& WXUNUSED(event))
     DoAsyncExec(cmd);
 }
 
+void MyFrame::OnFileLaunch(wxCommandEvent& WXUNUSED(event))
+{
+    if ( !AskUserForFileName() )
+        return;
+
+    if ( !wxLaunchDefaultApplication(gs_lastFile) )
+    {
+        wxLogError("Opening \"%s\" in default application failed.", gs_lastFile);
+    }
+}
+
 void MyFrame::OnOpenURL(wxCommandEvent& WXUNUSED(event))
 {
-    static wxString s_filename(_T("http://www.wxwidgets.org/"));
+    static wxString s_url(_T("http://www.wxwidgets.org/"));
 
     wxString filename = wxGetTextFromUser
                         (
                             _T("Enter the URL"),
                             _T("exec sample"),
-                            s_filename,
+                            s_url,
                             this
                         );
 
     if ( filename.empty() )
         return;
 
-    s_filename = filename;
+    s_url = filename;
 
-    if ( !wxLaunchDefaultBrowser(s_filename) )
-        wxLogError(_T("Failed to open URL \"%s\""), s_filename.c_str());
+    if ( !wxLaunchDefaultBrowser(s_url) )
+        wxLogError(_T("Failed to open URL \"%s\""), s_url.c_str());
 }
 
 // ----------------------------------------------------------------------------
@@ -1030,11 +1069,17 @@ void MyFrame::OnIdle(wxIdleEvent& event)
     }
 }
 
-void MyFrame::OnTimer(wxTimerEvent& WXUNUSED(event))
+void MyFrame::OnIdleTimer(wxTimerEvent& WXUNUSED(event))
 {
     wxWakeUpIdle();
 }
 
+void MyFrame::OnBgTimer(wxTimerEvent& WXUNUSED(event))
+{
+    static unsigned long s_ticks = 0;
+    SetStatusText(wxString::Format("%lu ticks", s_ticks++), 1);
+}
+
 void MyFrame::OnProcessTerminated(MyPipedProcess *process)
 {
     RemovePipedProcess(process);