X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ce0822e1b9de6ce9cd9b828b807b7cf319cdfed0..cffda6922a7a7f205389e8002d0b7558ec2d36fb:/src/common/docview.cpp diff --git a/src/common/docview.cpp b/src/common/docview.cpp index 5dae19b52b..635a2529bb 100644 --- a/src/common/docview.cpp +++ b/src/common/docview.cpp @@ -233,6 +233,18 @@ wxView *wxDocument::GetFirstView() const return static_cast(m_documentViews.GetFirst()->GetData()); } +void wxDocument::Modify(bool mod) +{ + if (mod != m_documentModified) + { + m_documentModified = mod; + + // Allow views to append asterix to the title + wxView* view = GetFirstView(); + if (view) view->OnChangeFilename(); + } +} + wxDocManager *wxDocument::GetDocumentManager() const { return m_documentTemplate ? m_documentTemplate->GetDocumentManager() : NULL; @@ -327,15 +339,6 @@ bool wxDocument::SaveAs() if (fileName.empty()) return false; // cancelled by user - wxString ext; - wxFileName::SplitPath(fileName, NULL, NULL, &ext); - - if (ext.empty()) - { - fileName += wxT("."); - fileName += docTemplate->GetDefaultExtension(); - } - // Files that were not saved correctly are not added to the FileHistory. if (!OnSaveDocument(fileName)) return false; @@ -343,16 +346,16 @@ bool wxDocument::SaveAs() SetTitle(wxFileNameFromPath(fileName)); SetFilename(fileName, true); // will call OnChangeFileName automatically - // A file that doesn't use the default extension of its document template - // cannot be opened via the FileHistory, so we do not add it. - if (docTemplate->FileMatchesTemplate(fileName)) - { - GetDocumentManager()->AddFileToHistory(fileName); - } - //else: the user will probably not be able to open the file again, so we - // could warn about the wrong file-extension here + // A file that doesn't use the default extension of its document template + // cannot be opened via the FileHistory, so we do not add it. + if (docTemplate->FileMatchesTemplate(fileName)) + { + GetDocumentManager()->AddFileToHistory(fileName); + } + //else: the user will probably not be able to open the file again, so we + // could warn about the wrong file-extension here - return true; + return true; } bool wxDocument::OnSaveDocument(const wxString& file) @@ -415,7 +418,22 @@ wxOutputStream& wxDocument::SaveObject(wxOutputStream& stream) bool wxDocument::Revert() { - return false; + if ( wxMessageBox + ( + _("Discard changes and reload the last saved version?"), + wxTheApp->GetAppDisplayName(), + wxYES_NO | wxCANCEL | wxICON_QUESTION, + GetDocumentWindow() + ) != wxYES ) + return false; + + if ( !DoOpenDocument(GetFilename()) ) + return false; + + Modify(false); + UpdateAllViews(); + + return true; } @@ -648,7 +666,8 @@ wxView::wxView() wxView::~wxView() { - GetDocumentManager()->ActivateView(this, false); + if (m_viewDocument && GetDocumentManager()) + GetDocumentManager()->ActivateView(this, false); // reset our frame view first, before removing it from the document as // SetView(NULL) is a simple call while RemoveView() may result in user @@ -713,7 +732,12 @@ void wxView::OnChangeFilename() wxDocument *doc = GetDocument(); if (!doc) return; - win->SetLabel(doc->GetUserReadableName()); + wxString label = doc->GetUserReadableName(); + if (doc->IsModified()) + { + label += "*"; + } + win->SetLabel(label); } void wxView::SetDocument(wxDocument *doc) @@ -879,7 +903,7 @@ BEGIN_EVENT_TABLE(wxDocManager, wxEvtHandler) EVT_UPDATE_UI(wxID_OPEN, wxDocManager::OnUpdateFileOpen) EVT_UPDATE_UI(wxID_CLOSE, wxDocManager::OnUpdateDisableIfNoDoc) EVT_UPDATE_UI(wxID_CLOSE_ALL, wxDocManager::OnUpdateDisableIfNoDoc) - EVT_UPDATE_UI(wxID_REVERT, wxDocManager::OnUpdateDisableIfNoDoc) + EVT_UPDATE_UI(wxID_REVERT, wxDocManager::OnUpdateFileRevert) EVT_UPDATE_UI(wxID_NEW, wxDocManager::OnUpdateFileNew) EVT_UPDATE_UI(wxID_SAVE, wxDocManager::OnUpdateFileSave) EVT_UPDATE_UI(wxID_SAVEAS, wxDocManager::OnUpdateDisableIfNoDoc) @@ -899,8 +923,6 @@ wxDocManager* wxDocManager::sm_docManager = NULL; wxDocManager::wxDocManager(long WXUNUSED(flags), bool initialize) { - wxASSERT_MSG( !sm_docManager, "multiple wxDocManagers not allowed" ); - sm_docManager = this; m_defaultDocumentNameCounter = 1; @@ -991,9 +1013,9 @@ wxString wxDocManager::GetLastDirectory() const // this ensures that if the user opens a file, closes the program and // runs it again the "Open file" dialog will open in the directory of // the last file he used - wxString lastOpened = GetHistoryFile(0); - if ( !lastOpened.empty() ) + if ( m_fileHistory && m_fileHistory->GetCount() ) { + const wxString lastOpened = m_fileHistory->GetHistoryFile(0); const wxFileName fn(lastOpened); if ( fn.DirExists() ) { @@ -1001,6 +1023,7 @@ wxString wxDocManager::GetLastDirectory() const } //else: should we try the next one? } + //else: no history yet // if we don't have any files in the history (yet?), use the // system-dependent default location for the document files @@ -1091,9 +1114,19 @@ void wxDocManager::OnPrint(wxCommandEvent& WXUNUSED(event)) #endif // wxUSE_PRINTING_ARCHITECTURE } +#if wxUSE_PRINTING_ARCHITECTURE +wxPreviewFrame* wxDocManager::CreatePreviewFrame(wxPrintPreviewBase* preview, + wxWindow *parent, + const wxString& title) +{ + return new wxPreviewFrame(preview, parent, title); +} +#endif // wxUSE_PRINTING_ARCHITECTURE + void wxDocManager::OnPreview(wxCommandEvent& WXUNUSED(event)) { #if wxUSE_PRINTING_ARCHITECTURE + wxBusyCursor busy; wxView *view = GetActiveView(); if (!view) return; @@ -1111,9 +1144,11 @@ void wxDocManager::OnPreview(wxCommandEvent& WXUNUSED(event)) return; } - wxPreviewFrame * - frame = new wxPreviewFrame(preview, wxTheApp->GetTopWindow(), - _("Print Preview")); + wxPreviewFrame* frame = CreatePreviewFrame(preview, + wxTheApp->GetTopWindow(), + _("Print Preview")); + wxCHECK_RET( frame, "should create a print preview frame" ); + frame->Centre(wxBOTH); frame->Initialize(); frame->Show(true); @@ -1159,6 +1194,12 @@ void wxDocManager::OnUpdateDisableIfNoDoc(wxUpdateUIEvent& event) event.Enable( GetCurrentDocument() != NULL ); } +void wxDocManager::OnUpdateFileRevert(wxUpdateUIEvent& event) +{ + wxDocument* doc = GetCurrentDocument(); + event.Enable(doc && doc->IsModified() && doc->GetDocumentSaved()); +} + void wxDocManager::OnUpdateFileNew(wxUpdateUIEvent& event) { // CreateDocument() (which is called from OnFileNew) may succeed @@ -1584,7 +1625,8 @@ wxDocTemplate *wxDocManager::SelectDocumentPath(wxDocTemplate **templates, GetLastDirectory(), wxEmptyString, &FilterIndex, - descrBuf); + descrBuf, + wxFD_OPEN | wxFD_FILE_MUST_EXIST); wxDocTemplate *theTemplate = NULL; if (!pathTmp.empty()) @@ -1835,7 +1877,9 @@ bool wxDocChildFrameAnyBase::CloseView(wxCloseEvent& event) { if ( m_childView ) { - if ( event.CanVeto() && !m_childView->Close(false) ) + // notice that we must call wxView::Close() and OnClose() called from + // it in any case, even if we know that we are going to close anyhow + if ( !m_childView->Close(false) && event.CanVeto() ) { event.Veto(); return false;