X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1a278e7befe2b9989526067dede645fb11ad779b..b70362998b8f562923f6ed6708f06537ac056cd4:/samples/exec/exec.cpp?ds=sidebyside diff --git a/samples/exec/exec.cpp b/samples/exec/exec.cpp index 969f242b46..5a85d67bf1 100644 --- a/samples/exec/exec.cpp +++ b/samples/exec/exec.cpp @@ -17,11 +17,6 @@ // headers // ---------------------------------------------------------------------------- -#if defined(__GNUG__) && !defined(__APPLE__) - #pragma implementation "exec.cpp" - #pragma interface "exec.cpp" -#endif - // For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" @@ -56,6 +51,7 @@ #include "wx/txtstrm.h" #include "wx/numdlg.h" +#include "wx/textdlg.h" #include "wx/ffile.h" #include "wx/process.h" @@ -110,6 +106,7 @@ public: void OnPOpen(wxCommandEvent& event); void OnFileExec(wxCommandEvent& event); + void OnOpenURL(wxCommandEvent& event); void OnAbout(wxCommandEvent& event); @@ -307,6 +304,7 @@ enum Exec_Shell, Exec_POpen, Exec_OpenFile, + Exec_OpenURL, Exec_DDEExec, Exec_DDERequest, Exec_Redirect, @@ -343,6 +341,7 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame) EVT_MENU(Exec_POpen, MyFrame::OnPOpen) EVT_MENU(Exec_OpenFile, MyFrame::OnFileExec) + EVT_MENU(Exec_OpenURL, MyFrame::OnOpenURL) #ifdef __WINDOWS__ EVT_MENU(Exec_DDEExec, MyFrame::OnDDEExec) @@ -387,6 +386,9 @@ IMPLEMENT_APP(MyApp) // `Main program' equivalent: the program execution "starts" here bool MyApp::OnInit() { + if ( !wxApp::OnInit() ) + return false; + // Create the main application window MyFrame *frame = new MyFrame(_T("Exec wxWidgets sample"), wxDefaultPosition, wxSize(500, 140)); @@ -423,7 +425,7 @@ MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size) #endif // create a menu bar - wxMenu *menuFile = new wxMenu(_T(""), wxMENU_TEAROFF); + wxMenu *menuFile = new wxMenu(wxEmptyString, wxMENU_TEAROFF); menuFile->Append(Exec_Kill, _T("&Kill process...\tCtrl-K"), _T("Kill a process by PID")); menuFile->AppendSeparator(); @@ -450,13 +452,15 @@ 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_OpenURL, _T("Open &URL...\tCtrl-U"), + _T("Launch the default browser with the given URL")); #ifdef __WINDOWS__ execMenu->AppendSeparator(); execMenu->Append(Exec_DDEExec, _T("Execute command via &DDE...\tCtrl-D")); execMenu->Append(Exec_DDERequest, _T("Send DDE &request...\tCtrl-R")); #endif - wxMenu *helpMenu = new wxMenu(_T(""), wxMENU_TEAROFF); + wxMenu *helpMenu = new wxMenu(wxEmptyString, wxMENU_TEAROFF); helpMenu->Append(Exec_About, _T("&About...\tF1"), _T("Show about dialog")); // now append the freshly created menu to the menu bar... @@ -499,7 +503,7 @@ void MyFrame::OnClear(wxCommandEvent& WXUNUSED(event)) void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event)) { - wxMessageBox(_T("Exec wxWidgets Sample\n© 2000-2002 Vadim Zeitlin"), + wxMessageBox(_T("Exec wxWidgets Sample\n(c) 2000-2002 Vadim Zeitlin"), _T("About Exec"), wxOK | wxICON_INFORMATION, this); } @@ -779,6 +783,8 @@ void MyFrame::OnPOpen(wxCommandEvent& WXUNUSED(event)) return; } + wxLogVerbose(_T("PID of the new process: %ld"), process->GetPid()); + wxOutputStream *out = process->GetOutputStream(); if ( !out ) { @@ -800,8 +806,16 @@ void MyFrame::OnFileExec(wxCommandEvent& WXUNUSED(event)) { static wxString s_filename; - wxString filename = wxLoadFileSelector(_T(""), _T(""), s_filename); - if ( !filename ) + wxString filename; + +#if wxUSE_FILEDLG + filename = wxLoadFileSelector(_T("any file"), NULL, s_filename, this); +#else // !wxUSE_FILEDLG + filename = wxGetTextFromUser(_T("Enter the file name"), _T("exec sample"), + s_filename, this); +#endif // wxUSE_FILEDLG/!wxUSE_FILEDLG + + if ( filename.empty() ) return; s_filename = filename; @@ -817,7 +831,7 @@ void MyFrame::OnFileExec(wxCommandEvent& WXUNUSED(event)) wxString cmd; bool ok = ft->GetOpenCommand(&cmd, - wxFileType::MessageParameters(filename, _T(""))); + wxFileType::MessageParameters(filename)); delete ft; if ( !ok ) { @@ -829,6 +843,27 @@ void MyFrame::OnFileExec(wxCommandEvent& WXUNUSED(event)) DoAsyncExec(cmd); } +void MyFrame::OnOpenURL(wxCommandEvent& WXUNUSED(event)) +{ + static wxString s_filename; + + wxString filename = wxGetTextFromUser + ( + _T("Enter the URL"), + _T("exec sample"), + s_filename, + this + ); + + if ( filename.empty() ) + return; + + s_filename = filename; + + if ( !wxLaunchDefaultBrowser(s_filename) ) + wxLogError(_T("Failed to open URL \"%s\""), s_filename.c_str()); +} + // ---------------------------------------------------------------------------- // DDE stuff // ---------------------------------------------------------------------------- @@ -865,7 +900,7 @@ void MyFrame::OnDDEExec(wxCommandEvent& WXUNUSED(event)) return; wxDDEClient client; - wxConnectionBase *conn = client.MakeConnection(_T(""), m_server, m_topic); + wxConnectionBase *conn = client.MakeConnection(wxEmptyString, m_server, m_topic); if ( !conn ) { wxLogError(_T("Failed to connect to the DDE server '%s'."), @@ -891,7 +926,7 @@ void MyFrame::OnDDERequest(wxCommandEvent& WXUNUSED(event)) return; wxDDEClient client; - wxConnectionBase *conn = client.MakeConnection(_T(""), m_server, m_topic); + wxConnectionBase *conn = client.MakeConnection(wxEmptyString, m_server, m_topic); if ( !conn ) { wxLogError(_T("Failed to connect to the DDE server '%s'."), @@ -1028,7 +1063,7 @@ void MyPipedProcess::OnTerminate(int pid, int status) bool MyPipedProcess2::HasInput() { - if ( !!m_input ) + if ( !m_input.empty() ) { wxTextOutputStream os(*GetOutputStream()); os.WriteString(m_input); @@ -1053,22 +1088,22 @@ MyPipeFrame::MyPipeFrame(wxFrame *parent, : wxFrame(parent, wxID_ANY, cmd), m_process(process), // in a real program we'd check that the streams are !NULL here + m_out(*process->GetOutputStream()), m_in(*process->GetInputStream()), - m_err(*process->GetErrorStream()), - m_out(*process->GetOutputStream()) + m_err(*process->GetErrorStream()) { m_process->SetNextHandler(this); wxPanel *panel = new wxPanel(this, wxID_ANY); - m_textOut = new wxTextCtrl(panel, wxID_ANY, _T(""), + m_textOut = new wxTextCtrl(panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER); - m_textIn = new wxTextCtrl(panel, wxID_ANY, _T(""), + m_textIn = new wxTextCtrl(panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE | wxTE_RICH); m_textIn->SetEditable(false); - m_textErr = new wxTextCtrl(panel, wxID_ANY, _T(""), + m_textErr = new wxTextCtrl(panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE | wxTE_RICH); m_textErr->SetEditable(false); @@ -1098,6 +1133,7 @@ MyPipeFrame::MyPipeFrame(wxFrame *parent, void MyPipeFrame::OnBtnSendFile(wxCommandEvent& WXUNUSED(event)) { +#if wxUSE_FILEDLG wxFileDialog filedlg(this, _T("Select file to send")); if ( filedlg.ShowModal() != wxID_OK ) return; @@ -1114,15 +1150,18 @@ void MyPipeFrame::OnBtnSendFile(wxCommandEvent& WXUNUSED(event)) while ( len ) { const size_t CHUNK_SIZE = 4096; - size_t lenChunk = len > CHUNK_SIZE ? CHUNK_SIZE : len; + m_out.Write(pc, len > CHUNK_SIZE ? CHUNK_SIZE : len); - m_out.Write(pc, lenChunk); + // note that not all data could have been written as we don't block on + // the write end of the pipe + const size_t lenChunk = m_out.LastWrite(); pc += lenChunk; len -= lenChunk; DoGet(); } +#endif // wxUSE_FILEDLG } void MyPipeFrame::DoGet()