X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/223867913bcf4e52a29a5ef75683c731cacb5f22..c9cc9a2f3e41341a4c04c67137b58faaeaa55366:/samples/exec/exec.cpp diff --git a/samples/exec/exec.cpp b/samples/exec/exec.cpp index c871883726..a1e6531af8 100644 --- a/samples/exec/exec.cpp +++ b/samples/exec/exec.cpp @@ -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.AfterFirst(_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);