X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/6de2f8b9da9c738da63e1a431b4d53f070b1599a..b9b3ccd9ea9bf892369a6fa2c8e28e0ceca18527:/src/common/docview.cpp diff --git a/src/common/docview.cpp b/src/common/docview.cpp index cb1ddc4380..0f16972439 100644 --- a/src/common/docview.cpp +++ b/src/common/docview.cpp @@ -25,11 +25,7 @@ #include "wx/wxprec.h" #ifdef __BORLANDC__ - #pragma hdrstop -#endif - -#ifndef WX_PRECOMP - #include "wx/defs.h" + #pragma hdrstop #endif #if wxUSE_DOC_VIEW_ARCHITECTURE @@ -46,25 +42,34 @@ #include "wx/intl.h" #endif + #ifdef __WXGTK__ #include "wx/mdi.h" #endif +#if wxUSE_PRINTING_ARCHITECTURE + #include "wx/prntbase.h" + #include "wx/printdlg.h" +#endif + #include "wx/msgdlg.h" #include "wx/choicdlg.h" #include "wx/docview.h" -#include "wx/printdlg.h" #include "wx/confbase.h" +#include "wx/file.h" #include #include -#include "wx/ioswrap.h" - -#if wxUSE_IOSTREAMH +#if wxUSE_STD_IOSTREAM + #include "wx/ioswrap.h" + #if wxUSE_IOSTREAMH #include -#else + #else #include + #endif +#else + #include "wx/wfstream.h" #endif // ---------------------------------------------------------------------------- @@ -94,6 +99,12 @@ static inline wxString FindExtension(const wxChar *path); +// ---------------------------------------------------------------------------- +// local constants +// ---------------------------------------------------------------------------- + +static const char *s_MRUEntryFormat = _T("&%d %s"); + // ============================================================================ // implementation // ============================================================================ @@ -240,9 +251,7 @@ bool wxDocument::SaveAs() return FALSE; wxString fileName(tmp); - wxString path(""); - wxString name(""); - wxString ext(""); + wxString path, name, ext; wxSplitPath(fileName, & path, & name, & ext); if (ext.IsEmpty() || ext == _T("")) @@ -279,15 +288,20 @@ bool wxDocument::OnSaveDocument(const wxString& file) else msgTitle = wxString(_("File error")); - ofstream store(file.fn_str()); +#if wxUSE_STD_IOSTREAM + ofstream store(wxString(file.fn_str())); if (store.fail() || store.bad()) +#else + wxFileOutputStream store(wxString(file.fn_str())); + if (store.LastError() != 0) +#endif { (void)wxMessageBox(_("Sorry, could not open this file for saving."), msgTitle, wxOK | wxICON_EXCLAMATION, GetDocumentWindow()); // Saving error return FALSE; } - if (SaveObject(store)==FALSE) + if (!SaveObject(store)) { (void)wxMessageBox(_("Sorry, could not save this file."), msgTitle, wxOK | wxICON_EXCLAMATION, GetDocumentWindow()); @@ -310,14 +324,19 @@ bool wxDocument::OnOpenDocument(const wxString& file) else msgTitle = wxString(_("File error")); - ifstream store(file.fn_str()); +#if wxUSE_STD_IOSTREAM + ifstream store(wxString(file.fn_str())); if (store.fail() || store.bad()) +#else + wxFileInputStream store(wxString(file.fn_str())); + if (store.LastError() != 0) +#endif { (void)wxMessageBox(_("Sorry, could not open this file."), msgTitle, wxOK|wxICON_EXCLAMATION, GetDocumentWindow()); return FALSE; } - if (LoadObject(store)==FALSE) + if (!LoadObject(store)) { (void)wxMessageBox(_("Sorry, could not open this file."), msgTitle, wxOK|wxICON_EXCLAMATION, GetDocumentWindow()); @@ -332,17 +351,21 @@ bool wxDocument::OnOpenDocument(const wxString& file) return TRUE; } +#if wxUSE_STD_IOSTREAM istream& wxDocument::LoadObject(istream& stream) +#else +wxInputStream& wxDocument::LoadObject(wxInputStream& stream) +#endif { - // wxObject::LoadObject(stream); - return stream; } +#if wxUSE_STD_IOSTREAM ostream& wxDocument::SaveObject(ostream& stream) +#else +wxOutputStream& wxDocument::SaveObject(wxOutputStream& stream) +#endif { - // wxObject::SaveObject(stream); - return stream; } @@ -669,9 +692,11 @@ BEGIN_EVENT_TABLE(wxDocManager, wxEvtHandler) EVT_MENU(wxID_SAVEAS, wxDocManager::OnFileSaveAs) EVT_MENU(wxID_UNDO, wxDocManager::OnUndo) EVT_MENU(wxID_REDO, wxDocManager::OnRedo) +#if wxUSE_PRINTING_ARCHITECTURE EVT_MENU(wxID_PRINT, wxDocManager::OnPrint) EVT_MENU(wxID_PRINT_SETUP, wxDocManager::OnPrintSetup) EVT_MENU(wxID_PREVIEW, wxDocManager::OnPreview) +#endif END_EVENT_TABLE() wxDocManager::wxDocManager(long flags, bool initialize) @@ -787,6 +812,7 @@ void wxDocManager::OnFileSaveAs(wxCommandEvent& WXUNUSED(event)) void wxDocManager::OnPrint(wxCommandEvent& WXUNUSED(event)) { +#if wxUSE_PRINTING_ARCHITECTURE wxView *view = GetCurrentView(); if (!view) return; @@ -799,10 +825,12 @@ void wxDocManager::OnPrint(wxCommandEvent& WXUNUSED(event)) delete printout; } +#endif // wxUSE_PRINTING_ARCHITECTURE } void wxDocManager::OnPrintSetup(wxCommandEvent& WXUNUSED(event)) { +#if wxUSE_PRINTING_ARCHITECTURE wxWindow *parentWin = wxTheApp->GetTopWindow(); wxView *view = GetCurrentView(); if (view) @@ -810,13 +838,15 @@ void wxDocManager::OnPrintSetup(wxCommandEvent& WXUNUSED(event)) wxPrintDialogData data; - wxPrintDialog printerDialog(parentWin, & data); + wxPrintDialog printerDialog(parentWin, &data); printerDialog.GetPrintDialogData().SetSetupDialog(TRUE); printerDialog.ShowModal(); +#endif // wxUSE_PRINTING_ARCHITECTURE } void wxDocManager::OnPreview(wxCommandEvent& WXUNUSED(event)) { +#if wxUSE_PRINTING_ARCHITECTURE wxView *view = GetCurrentView(); if (!view) return; @@ -834,6 +864,7 @@ void wxDocManager::OnPreview(wxCommandEvent& WXUNUSED(event)) frame->Initialize(); frame->Show(TRUE); } +#endif // wxUSE_PRINTING_ARCHITECTURE } void wxDocManager::OnUndo(wxCommandEvent& WXUNUSED(event)) @@ -1071,6 +1102,12 @@ void wxDocManager::AddFileToHistory(const wxString& file) m_fileHistory->AddFileToHistory(file); } +void wxDocManager::RemoveFileFromHistory(int i) +{ + if (m_fileHistory) + m_fileHistory->RemoveFileFromHistory(i); +} + wxString wxDocManager::GetHistoryFile(int i) const { wxString histFile; @@ -1154,7 +1191,11 @@ wxDocTemplate *wxDocManager::FindTemplateForPath(const wxString& path) // template extension. wxDocTemplate *wxDocManager::SelectDocumentPath(wxDocTemplate **templates, +#ifdef __WXMSW__ int noTemplates, +#else + int WXUNUSED(noTemplates), +#endif wxString& path, long WXUNUSED(flags), bool WXUNUSED(save)) @@ -1183,9 +1224,12 @@ wxDocTemplate *wxDocManager::SelectDocumentPath(wxDocTemplate **templates, int FilterIndex = 0; wxString pathTmp = wxFileSelectorEx(_("Select a file"), - _T(""), _T(""), _T(""), + _T(""), + _T(""), &FilterIndex, - descrBuf, 0, wxTheApp->GetTopWindow()); + descrBuf, + 0, + wxTheApp->GetTopWindow()); if (!pathTmp.IsEmpty()) { @@ -1263,7 +1307,7 @@ wxDocTemplate *wxDocManager::SelectDocumentType(wxDocTemplate **templates, } wxDocTemplate *theTemplate = (wxDocTemplate *)wxGetSingleChoiceData(_("Select a document template"), _("Templates"), n, - strings, data); + strings, (char **)data); delete[] strings; delete[] data; return theTemplate; @@ -1286,7 +1330,7 @@ wxDocTemplate *wxDocManager::SelectViewType(wxDocTemplate **templates, } } wxDocTemplate *theTemplate = (wxDocTemplate *)wxGetSingleChoiceData(_("Select a document view"), _("Views"), n, - strings, data); + strings, (char **)data); delete[] strings; delete[] data; return theTemplate; @@ -1451,9 +1495,27 @@ void wxDocParentFrame::OnExit(wxCommandEvent& WXUNUSED(event)) void wxDocParentFrame::OnMRUFile(wxCommandEvent& event) { - wxString f(m_docManager->GetHistoryFile(event.GetSelection() - wxID_FILE1)); - if (f != _T("")) - (void)m_docManager->CreateDocument(f, wxDOC_SILENT); + int n = event.GetSelection() - wxID_FILE1; // the index in MRU list + wxString filename(m_docManager->GetHistoryFile(n)); + if ( !filename.IsEmpty() ) + { + // verify that the file exists before doing anything else + if ( wxFile::Exists(filename) ) + { + // try to open it + (void)m_docManager->CreateDocument(filename, wxDOC_SILENT); + } + else + { + // remove the bogus filename from the MRU list and notify the user + // about it + m_docManager->RemoveFileFromHistory(n); + + wxLogError(_("The file '%s' doesn't exist and couldn't be opened.\n" + "It has been also removed from the MRU files list."), + filename.c_str()); + } + } } // Extend event processing to search the view's event table @@ -1824,7 +1886,7 @@ void wxFileHistory::AddFileToHistory(const wxString& file) if (m_fileHistory[i]) { wxString buf; - buf.Printf(_T("&%d %s"), i+1, m_fileHistory[i]); + buf.Printf(s_MRUEntryFormat, i+1, m_fileHistory[i]); wxNode* node = m_fileMenus.First(); while (node) { @@ -1835,6 +1897,49 @@ void wxFileHistory::AddFileToHistory(const wxString& file) } } +void wxFileHistory::RemoveFileFromHistory(int i) +{ + wxCHECK_RET( i < m_fileHistoryN, + _T("invalid index in wxFileHistory::RemoveFileFromHistory") ); + + wxNode* node = m_fileMenus.First(); + while ( node ) + { + wxMenu* menu = (wxMenu*) node->Data(); + + // wxMenu::Delete() is missing from wxGTK, so this can't be done :-( +#if 0 + // delete the menu items + menu->Delete(wxID_FILE1 + i); +#endif + + // delete the element from the array (could use memmove() too...) + delete [] m_fileHistory[i]; + + int j; + for ( j = i; j < m_fileHistoryN - 1; j++ ) + { + m_fileHistory[j] = m_fileHistory[j + 1]; + } + + // shuffle filenames up + wxString buf; + for ( j = i; j < m_fileHistoryN - 1; j++ ) + { + buf.Printf(s_MRUEntryFormat, j + 1, m_fileHistory[j]); + menu->SetLabel(wxID_FILE1 + j, buf); + } + + // to be removed as soon as wxMenu::Delete() is implemented +#if 1 + menu->SetLabel(wxID_FILE1 + m_fileHistoryN - 1, _T("")); +#endif + + node = node->Next(); + } + m_fileHistoryN--; +} + wxString wxFileHistory::GetHistoryFile(int i) const { if (i < m_fileHistoryN) @@ -1898,7 +2003,7 @@ void wxFileHistory::AddFilesToMenu() if (m_fileHistory[i]) { wxString buf; - buf.Printf(_T("&%d %s"), i+1, m_fileHistory[i]); + buf.Printf(s_MRUEntryFormat, i+1, m_fileHistory[i]); menu->Append(wxID_FILE1+i, buf); } } @@ -1918,7 +2023,7 @@ void wxFileHistory::AddFilesToMenu(wxMenu* menu) if (m_fileHistory[i]) { wxString buf; - buf.Printf(_T("&%d %s"), i+1, m_fileHistory[i]); + buf.Printf(s_MRUEntryFormat, i+1, m_fileHistory[i]); menu->Append(wxID_FILE1+i, buf); } } @@ -1930,6 +2035,7 @@ void wxFileHistory::AddFilesToMenu(wxMenu* menu) // manipulate files directly // ---------------------------------------------------------------------------- +#if wxUSE_STD_IOSTREAM bool wxTransferFileToStream(const wxString& filename, ostream& stream) { FILE *fd1; @@ -1964,6 +2070,7 @@ bool wxTransferStreamToFile(istream& stream, const wxString& filename) fclose (fd1); return TRUE; } +#endif #endif // wxUSE_DOC_VIEW_ARCHITECTURE