X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0106a2262834510023555cda6b4d05affb36a29e..02a1dfbae942c883d8651e34dcfbc5153aabc56e:/mobile/wxedit/wxedit.cpp diff --git a/mobile/wxedit/wxedit.cpp b/mobile/wxedit/wxedit.cpp index c27370b10e..d9e0c53c4e 100644 --- a/mobile/wxedit/wxedit.cpp +++ b/mobile/wxedit/wxedit.cpp @@ -16,33 +16,108 @@ #pragma hdrstop #endif +#include "wx/filename.h" +#include "wx/config.h" + // Include private headers #include "wxedit.h" +//------------------------------------------------------------------------------ +// constants +//------------------------------------------------------------------------------ + +#define HISTORY_ENTRIES 3 + //------------------------------------------------------------------------------ // MyFrame //------------------------------------------------------------------------------ BEGIN_EVENT_TABLE(MyFrame,wxFrame) EVT_MENU(ID_ABOUT, MyFrame::OnAbout) + EVT_MENU(ID_NEW, MyFrame::OnNew) EVT_MENU(ID_OPEN, MyFrame::OnOpen) EVT_MENU(ID_SAVE, MyFrame::OnSave) EVT_MENU(ID_SAVEAS, MyFrame::OnSaveAs) EVT_MENU(ID_QUIT, MyFrame::OnQuit) + + EVT_MENU(ID_COPY, MyFrame::OnCopy) + EVT_MENU(ID_CUT, MyFrame::OnCut) + EVT_MENU(ID_PASTE, MyFrame::OnPaste) + EVT_MENU(ID_DELETE, MyFrame::OnDelete) + + EVT_MENU_RANGE(ID_LAST_1, ID_LAST_3, MyFrame::OnLastFiles) + EVT_CLOSE(MyFrame::OnCloseWindow) + EVT_UPDATE_UI(-1,MyFrame::OnUpdateUI) END_EVENT_TABLE() MyFrame::MyFrame( wxWindow *parent, wxWindowID id, const wxString &title, const wxPoint &position, const wxSize& size, long style ) : wxFrame( parent, id, title, position, size, style ) { + // Create menu and status bar. CreateMyMenuBar(); - CreateStatusBar(1); - SetStatusText( "Welcome!" ); + SetStatusText( "Welcome to wxEdit!" ); + // Create edit control. Since it is the only + // control in the frame, it will be resized + // to file it out. m_text = new wxTextCtrl( this, -1, "", wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE ); + + // Read .ini file for file history etc. + wxConfig *conf = (wxConfig*) wxConfig::Get(); + + int entries = 0; + conf->Read( "/History/Count", &entries ); + + for (int i = 0; i < entries; i++) + { + wxString tmp; + tmp.Printf( "/History/File%d", (int)i ); + + wxString res; + conf->Read( tmp, &res ); + + if (!res.empty()) + AddToHistory( res ); + } +} + +void MyFrame::MakeHistory() +{ + wxMenuBar *mb = GetMenuBar(); + + wxASSERT( mb ); + + int max = m_history.GetCount(); + if (max > HISTORY_ENTRIES) + max = HISTORY_ENTRIES; + + for (int i = 0; i < max; i++) + { + wxMenu *menu = NULL; + mb->FindItem( ID_LAST_1 + i, &menu ); + wxASSERT( menu ); + + wxFileName fname( m_history[(size_t)i] ); + menu->SetLabel( ID_LAST_1 + i, fname.GetFullName() ); + } +} + +void MyFrame::AddToHistory( const wxString &fname ) +{ + // Fill menu with history index + int index = m_history.Index( fname ); + + if (index != wxNOT_FOUND) + m_history.Remove( (size_t) index ); + + m_history.Insert( fname, 0 ); + + // Update menu + MakeHistory(); } void MyFrame::CreateMyMenuBar() @@ -56,39 +131,149 @@ void MyFrame::CreateMyMenuBar() file_menu->Append( ID_SAVEAS, "Save as...", "Save text as..." ); file_menu->AppendSeparator(); file_menu->Append( ID_QUIT, "Quit...", "Quit program" ); + + wxMenu *edit_menu = new wxMenu; + edit_menu->Append( ID_COPY, "Copy" ); + edit_menu->Append( ID_CUT, "Cut" ); + edit_menu->Append( ID_PASTE, "Paste" ); + edit_menu->AppendSeparator(); + edit_menu->Append( ID_DELETE, "Delete" ); + + wxMenu *history_menu = new wxMenu; + history_menu->Append( ID_LAST_1, "No file." ); + history_menu->Append( ID_LAST_2, "No file." ); + history_menu->Append( ID_LAST_3, "No file." ); wxMenuBar *menu_bar = new wxMenuBar(); - menu_bar->Append( file_menu, "File" ); + menu_bar->Append( file_menu, "&File" ); + menu_bar->Append( edit_menu, "&Edit" ); + menu_bar->Append( history_menu, "&History" ); SetMenuBar( menu_bar ); } +void MyFrame::OnCopy( wxCommandEvent &event ) +{ +} + +void MyFrame::OnCut( wxCommandEvent &event ) +{ +} + +void MyFrame::OnPaste( wxCommandEvent &event ) +{ +} + +void MyFrame::OnDelete( wxCommandEvent &event ) +{ +} + +void MyFrame::OnLastFiles( wxCommandEvent &event ) +{ + if (!Discard()) return; + + if (!m_filename.empty()) + AddToHistory( m_filename ); + + size_t index = event.GetId() - ID_LAST_1; + + wxASSERT( index < m_history.GetCount() ); + + m_filename = m_history[index]; + + m_text->Clear(); + m_text->LoadFile( m_filename ); + + SetStatusText( m_filename ); +} + void MyFrame::OnNew( wxCommandEvent &event ) { + if (!Discard()) return; + m_text->Clear(); + + if (!m_filename.empty()) + AddToHistory( m_filename ); + + m_filename = wxEmptyString; + + SetStatusText( "" ); } void MyFrame::OnOpen( wxCommandEvent &event ) { + if (!Discard()) return; + wxFileDialog dialog( this, "Open text", "", "", "Text file (*.txt)|*.txt|" "Any file (*)|*", wxOPEN|wxFILE_MUST_EXIST ); - dialog.ShowModal(); + if (dialog.ShowModal() == wxID_OK) + { + m_text->Clear(); + +#ifdef __WXX11__ + wxFileName fname( dialog.GetPath() ); + if ((fname.GetExt() == "cpp") || + (fname.GetExt() == "c") || + (fname.GetExt() == "h") || + (fname.GetExt() == "cxx") || + (fname.GetExt() == "hxx")) + { + m_text->SetLanguage( wxSOURCE_LANG_CPP ); + } + else + if (fname.GetExt() == "py") + { + m_text->SetLanguage( wxSOURCE_LANG_PYTHON ); + } + else + if ((fname.GetExt() == "pl") || + (fname.GetExt() == "pm")) + { + m_text->SetLanguage( wxSOURCE_LANG_PYTHON ); + } + else + { + m_text->SetLanguage( wxSOURCE_LANG_NONE ); + } +#endif + + m_filename = dialog.GetPath(); + m_text->LoadFile( m_filename ); + + SetStatusText( m_filename ); + } } void MyFrame::OnSave( wxCommandEvent &event ) { + if (m_filename.empty()) + OnSaveAs( event ); + else + m_text->SaveFile( m_filename ); } void MyFrame::OnSaveAs( wxCommandEvent &event ) { + wxFileDialog dialog( this, "Open text", "", "", + "Text file (*.txt)|*.txt|" + "Any file (*)|*", + wxSAVE|wxOVERWRITE_PROMPT ); + if (dialog.ShowModal() == wxID_OK) + { + m_filename = dialog.GetPath(); + m_text->SaveFile( m_filename ); + + SetStatusText( m_filename ); + } } void MyFrame::OnAbout( wxCommandEvent &event ) { - wxMessageDialog dialog( this, "Welcome to SuperApp 1.0\n(C)opyright Joe Hacker", - "About SuperApp", wxOK|wxICON_INFORMATION ); + wxMessageDialog dialog( this, "Welcome to wxEdit\n(C)opyright Robert Roebling", + "About wxEdit", wxOK|wxICON_INFORMATION ); dialog.ShowModal(); } @@ -97,10 +282,86 @@ void MyFrame::OnQuit( wxCommandEvent &event ) Close( TRUE ); } +bool MyFrame::Save() +{ + m_text->SaveFile(); + + return TRUE; +} + +bool MyFrame::Discard() +{ + if (m_text->IsModified()) + { + wxMessageDialog dialog( this, "Text has been\nmodified! Save?", + "wxEdit", wxYES_NO|wxCANCEL|wxICON_EXCLAMATION ); + + int ret = dialog.ShowModal(); + + if (ret == wxID_CANCEL) + return FALSE; + + if (ret == wxID_YES) + { + if (!Save()) + return FALSE; + } + } + + return TRUE; +} + +void MyFrame::OnUpdateUI( wxUpdateUIEvent &event ) +{ + switch (event.GetId()) + { + case ID_COPY: + event.Enable( FALSE ); + break; + case ID_CUT: + event.Enable( FALSE ); + break; + case ID_PASTE: + event.Enable( FALSE ); + break; + case ID_DELETE: + event.Enable( m_text->HasSelection() ); + break; + default: + break; + } +} + void MyFrame::OnCloseWindow( wxCloseEvent &event ) { - // if ! saved changes -> return + // Save changes? + if (!Discard()) return; + + // Add current to history + if (!m_filename.empty()) + AddToHistory( m_filename ); + + // Write .ini file + wxConfig *conf = (wxConfig*) wxConfig::Get(); + int max = HISTORY_ENTRIES; + if (m_history.GetCount() < (size_t)max) + max = m_history.GetCount(); + + conf->Write( "/History/Count", max ); + + for (int i = 0; i < max; i++) + { + wxString tmp; + tmp.Printf( "/History/File%d", (int)i ); + + conf->Write( tmp, m_history[(size_t)i] ); + } + + // Flush and delete config + delete wxConfig::Set( NULL ); + + // Finally destroy window and quit Destroy(); } @@ -116,7 +377,10 @@ MyApp::MyApp() bool MyApp::OnInit() { - MyFrame *frame = new MyFrame( NULL, -1, "SuperApp", wxPoint(20,20), wxSize(500,340) ); + SetVendorName("Free world"); + SetAppName("wxEdit"); + + MyFrame *frame = new MyFrame( NULL, -1, "wxEdit", wxPoint(20,20), wxSize(500,340) ); frame->Show( TRUE ); return TRUE;