X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/02718e6af40552cb8ac97a8af70370698617386b..f352dd54f0c495798d73e54ec96be8d628a2c787:/src/common/docview.cpp diff --git a/src/common/docview.cpp b/src/common/docview.cpp index a49ef09a9b..84acf51fa9 100644 --- a/src/common/docview.cpp +++ b/src/common/docview.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: docview.cpp +// Name: src/common/docview.cpp // Purpose: Document/view classes // Author: Julian Smart // Modified by: @@ -40,8 +40,12 @@ #include "wx/list.h" #include "wx/filedlg.h" #include "wx/intl.h" + #include "wx/log.h" #endif +#ifdef __WXMAC__ + #include "wx/filename.h" +#endif #ifdef __WXGTK__ #include "wx/mdi.h" @@ -57,6 +61,7 @@ #include "wx/docview.h" #include "wx/confbase.h" #include "wx/file.h" +#include "wx/cmdproc.h" #include #include @@ -76,20 +81,18 @@ // wxWindows macros // ---------------------------------------------------------------------------- - IMPLEMENT_ABSTRACT_CLASS(wxDocument, wxEvtHandler) - IMPLEMENT_ABSTRACT_CLASS(wxView, wxEvtHandler) - IMPLEMENT_ABSTRACT_CLASS(wxDocTemplate, wxObject) - IMPLEMENT_DYNAMIC_CLASS(wxDocManager, wxEvtHandler) - IMPLEMENT_CLASS(wxDocChildFrame, wxFrame) - IMPLEMENT_CLASS(wxDocParentFrame, wxFrame) +IMPLEMENT_ABSTRACT_CLASS(wxDocument, wxEvtHandler) +IMPLEMENT_ABSTRACT_CLASS(wxView, wxEvtHandler) +IMPLEMENT_ABSTRACT_CLASS(wxDocTemplate, wxObject) +IMPLEMENT_DYNAMIC_CLASS(wxDocManager, wxEvtHandler) +IMPLEMENT_CLASS(wxDocChildFrame, wxFrame) +IMPLEMENT_CLASS(wxDocParentFrame, wxFrame) - #if wxUSE_PRINTING_ARCHITECTURE - IMPLEMENT_DYNAMIC_CLASS(wxDocPrintout, wxPrintout) - #endif +#if wxUSE_PRINTING_ARCHITECTURE + IMPLEMENT_DYNAMIC_CLASS(wxDocPrintout, wxPrintout) +#endif - IMPLEMENT_CLASS(wxCommand, wxObject) - IMPLEMENT_DYNAMIC_CLASS(wxCommandProcessor, wxObject) - IMPLEMENT_DYNAMIC_CLASS(wxFileHistory, wxObject) +IMPLEMENT_DYNAMIC_CLASS(wxFileHistory, wxObject) // ---------------------------------------------------------------------------- // function prototypes @@ -165,6 +168,8 @@ bool wxDocument::Close() bool wxDocument::OnCloseDocument() { + // Tell all views that we're about to close + NotifyClosing(); DeleteContents(); Modify(FALSE); return TRUE; @@ -176,14 +181,14 @@ bool wxDocument::DeleteAllViews() { wxDocManager* manager = GetDocumentManager(); - wxNode *node = m_documentViews.First(); + wxNode *node = m_documentViews.GetFirst(); while (node) { - wxView *view = (wxView *)node->Data(); + wxView *view = (wxView *)node->GetData(); if (!view->Close()) return FALSE; - wxNode *next = node->Next(); + wxNode *next = node->GetNext(); delete view; // Deletes node implicitly node = next; @@ -198,9 +203,9 @@ bool wxDocument::DeleteAllViews() wxView *wxDocument::GetFirstView() const { - if (m_documentViews.Number() == 0) + if (m_documentViews.GetCount() == 0) return (wxView *) NULL; - return (wxView *)m_documentViews.First()->Data(); + return (wxView *)m_documentViews.GetFirst()->GetData(); } wxDocManager *wxDocument::GetDocumentManager() const @@ -228,16 +233,13 @@ bool wxDocument::OnNewDocument() bool wxDocument::Save() { - bool ret = FALSE; + if (!IsModified() && m_savedYet) + return TRUE; - if (!IsModified()) return TRUE; - if (m_documentFile == wxT("") || !m_savedYet) - ret = SaveAs(); - else - ret = OnSaveDocument(m_documentFile); - if ( ret ) - SetDocumentSaved(TRUE); - return ret; + if ( m_documentFile.empty() || !m_savedYet ) + return SaveAs(); + + return OnSaveDocument(m_documentFile); } bool wxDocument::SaveAs() @@ -248,7 +250,7 @@ bool wxDocument::SaveAs() wxString tmp = wxFileSelector(_("Save as"), docTemplate->GetDirectory(), - GetFilename(), + wxFileNameFromPath(GetFilename()), docTemplate->GetDefaultExtension(), docTemplate->GetFileFilter(), wxSAVE | wxOVERWRITE_PROMPT, @@ -263,7 +265,7 @@ bool wxDocument::SaveAs() if (ext.IsEmpty() || ext == wxT("")) { - fileName += "."; + fileName += wxT("."); fileName += docTemplate->GetDefaultExtension(); } @@ -273,12 +275,12 @@ bool wxDocument::SaveAs() GetDocumentManager()->AddFileToHistory(fileName); // Notify the views that the filename has changed - wxNode *node = m_documentViews.First(); + wxNode *node = m_documentViews.GetFirst(); while (node) { - wxView *view = (wxView *)node->Data(); + wxView *view = (wxView *)node->GetData(); view->OnChangeFilename(); - node = node->Next(); + node = node->GetNext(); } return OnSaveDocument(m_documentFile); @@ -296,11 +298,11 @@ bool wxDocument::OnSaveDocument(const wxString& file) msgTitle = wxString(_("File error")); #if wxUSE_STD_IOSTREAM - ofstream store(wxString(file.fn_str()).mb_str()); + wxSTD ofstream store(wxString(file.fn_str()).mb_str()); // ????? if (store.fail() || store.bad()) #else - wxFileOutputStream store(wxString(file.fn_str())); - if (store.LastError() != wxSTREAM_NOERROR) + wxFileOutputStream store( file ); + if (store.GetLastError() != wxSTREAM_NO_ERROR) #endif { (void)wxMessageBox(_("Sorry, could not open this file for saving."), msgTitle, wxOK | wxICON_EXCLAMATION, @@ -317,6 +319,11 @@ bool wxDocument::OnSaveDocument(const wxString& file) } Modify(FALSE); SetFilename(file); + SetDocumentSaved(TRUE); +#ifdef __WXMAC__ + wxFileName fn(file) ; + fn.MacSetDefaultTypeAndCreator() ; +#endif return TRUE; } @@ -332,11 +339,11 @@ bool wxDocument::OnOpenDocument(const wxString& file) msgTitle = wxString(_("File error")); #if wxUSE_STD_IOSTREAM - ifstream store(wxString(file.fn_str()).mb_str()); + wxSTD ifstream store(wxString(file.fn_str()).mb_str()); // ???? if (store.fail() || store.bad()) #else - wxFileInputStream store(wxString(file.fn_str())); - if (store.LastError() != wxSTREAM_NOERROR) + wxFileInputStream store( file ); + if (store.GetLastError() != wxSTREAM_NO_ERROR) #endif { (void)wxMessageBox(_("Sorry, could not open this file."), msgTitle, wxOK|wxICON_EXCLAMATION, @@ -344,10 +351,11 @@ bool wxDocument::OnOpenDocument(const wxString& file) return FALSE; } #if wxUSE_STD_IOSTREAM - if (!LoadObject(store)) + LoadObject(store); + if ( !store && !store.eof() ) #else - int res = LoadObject(store).LastError(); - if ((res != wxSTREAM_NOERROR) && + int res = LoadObject(store).GetLastError(); + if ((res != wxSTREAM_NO_ERROR) && (res != wxSTREAM_EOF)) #endif { @@ -365,7 +373,7 @@ bool wxDocument::OnOpenDocument(const wxString& file) } #if wxUSE_STD_IOSTREAM -istream& wxDocument::LoadObject(istream& stream) +wxSTD istream& wxDocument::LoadObject(wxSTD istream& stream) #else wxInputStream& wxDocument::LoadObject(wxInputStream& stream) #endif @@ -374,7 +382,7 @@ wxInputStream& wxDocument::LoadObject(wxInputStream& stream) } #if wxUSE_STD_IOSTREAM -ostream& wxDocument::SaveObject(ostream& stream) +wxSTD ostream& wxDocument::SaveObject(wxSTD ostream& stream) #else wxOutputStream& wxDocument::SaveObject(wxOutputStream& stream) #endif @@ -490,7 +498,7 @@ bool wxDocument::OnCreate(const wxString& WXUNUSED(path), long flags) // there are no more views. void wxDocument::OnChangedViewList() { - if (m_documentViews.Number() == 0) + if (m_documentViews.GetCount() == 0) { if (OnSaveModified()) { @@ -501,12 +509,24 @@ void wxDocument::OnChangedViewList() void wxDocument::UpdateAllViews(wxView *sender, wxObject *hint) { - wxNode *node = m_documentViews.First(); + wxNode *node = m_documentViews.GetFirst(); + while (node) + { + wxView *view = (wxView *)node->GetData(); + if (view != sender) + view->OnUpdate(sender, hint); + node = node->GetNext(); + } +} + +void wxDocument::NotifyClosing() +{ + wxNode *node = m_documentViews.GetFirst(); while (node) { - wxView *view = (wxView *)node->Data(); - view->OnUpdate(sender, hint); - node = node->Next(); + wxView *view = (wxView *)node->GetData(); + view->OnClosingDocument(); + node = node->GetNext(); } } @@ -516,12 +536,12 @@ void wxDocument::SetFilename(const wxString& filename, bool notifyViews) if ( notifyViews ) { // Notify the views that the filename has changed - wxNode *node = m_documentViews.First(); + wxNode *node = m_documentViews.GetFirst(); while (node) { - wxView *view = (wxView *)node->Data(); + wxView *view = (wxView *)node->GetData(); view->OnChangeFilename(); - node = node->Next(); + node = node->GetNext(); } } } @@ -596,7 +616,7 @@ bool wxView::Close(bool deleteWindow) void wxView::Activate(bool activate) { - if (GetDocumentManager()) + if (GetDocument() && GetDocumentManager()) { OnActivateView(activate, this, GetDocumentManager()->GetCurrentView()); GetDocumentManager()->ActivateView(this, activate); @@ -701,6 +721,7 @@ bool wxDocTemplate::FileMatchesTemplate(const wxString& path) BEGIN_EVENT_TABLE(wxDocManager, wxEvtHandler) EVT_MENU(wxID_OPEN, wxDocManager::OnFileOpen) EVT_MENU(wxID_CLOSE, wxDocManager::OnFileClose) + EVT_MENU(wxID_CLOSE_ALL, wxDocManager::OnFileCloseAll) EVT_MENU(wxID_REVERT, wxDocManager::OnFileRevert) EVT_MENU(wxID_NEW, wxDocManager::OnFileNew) EVT_MENU(wxID_SAVE, wxDocManager::OnFileSave) @@ -710,6 +731,7 @@ BEGIN_EVENT_TABLE(wxDocManager, wxEvtHandler) EVT_UPDATE_UI(wxID_OPEN, wxDocManager::OnUpdateFileOpen) EVT_UPDATE_UI(wxID_CLOSE, wxDocManager::OnUpdateFileClose) + EVT_UPDATE_UI(wxID_CLOSE_ALL, wxDocManager::OnUpdateFileClose) EVT_UPDATE_UI(wxID_REVERT, wxDocManager::OnUpdateFileRevert) EVT_UPDATE_UI(wxID_NEW, wxDocManager::OnUpdateFileNew) EVT_UPDATE_UI(wxID_SAVE, wxDocManager::OnUpdateFileSave) @@ -750,13 +772,13 @@ wxDocManager::~wxDocManager() sm_docManager = (wxDocManager*) NULL; } -bool wxDocManager::Clear(bool force) +bool wxDocManager::CloseDocuments(bool force) { - wxNode *node = m_docs.First(); + wxNode *node = m_docs.GetFirst(); while (node) { - wxDocument *doc = (wxDocument *)node->Data(); - wxNode *next = node->Next(); + wxDocument *doc = (wxDocument *)node->GetData(); + wxNode *next = node->GetNext(); if (!doc->Close() && !force) return FALSE; @@ -774,11 +796,19 @@ bool wxDocManager::Clear(bool force) // delete another. node = next; } - node = m_templates.First(); + return TRUE; +} + +bool wxDocManager::Clear(bool force) +{ + if (!CloseDocuments(force)) + return FALSE; + + wxNode *node = m_templates.GetFirst(); while (node) { - wxDocTemplate *templ = (wxDocTemplate*) node->Data(); - wxNode* next = node->Next(); + wxDocTemplate *templ = (wxDocTemplate*) node->GetData(); + wxNode* next = node->GetNext(); delete templ; node = next; } @@ -809,14 +839,19 @@ void wxDocManager::OnFileClose(wxCommandEvent& WXUNUSED(event)) } } +void wxDocManager::OnFileCloseAll(wxCommandEvent& WXUNUSED(event)) +{ + CloseDocuments(FALSE); +} + void wxDocManager::OnFileNew(wxCommandEvent& WXUNUSED(event)) { - CreateDocument(wxString(""), wxDOC_NEW); + CreateDocument( wxT(""), wxDOC_NEW ); } void wxDocManager::OnFileOpen(wxCommandEvent& WXUNUSED(event)) { - if ( !CreateDocument(wxString(""), 0) ) + if ( !CreateDocument( wxT(""), 0) ) { OnOpenFileFailure(); } @@ -948,7 +983,7 @@ void wxDocManager::OnUpdateFileNew(wxUpdateUIEvent& event) void wxDocManager::OnUpdateFileSave(wxUpdateUIEvent& event) { wxDocument *doc = GetCurrentDocument(); - event.Enable( (doc != (wxDocument*) NULL) ); + event.Enable( doc && doc->IsModified() ); } void wxDocManager::OnUpdateFileSaveAs(wxUpdateUIEvent& event) @@ -961,12 +996,16 @@ void wxDocManager::OnUpdateUndo(wxUpdateUIEvent& event) { wxDocument *doc = GetCurrentDocument(); event.Enable( (doc && doc->GetCommandProcessor() && doc->GetCommandProcessor()->CanUndo()) ); + if (doc && doc->GetCommandProcessor()) + doc->GetCommandProcessor()->SetMenuStrings(); } void wxDocManager::OnUpdateRedo(wxUpdateUIEvent& event) { wxDocument *doc = GetCurrentDocument(); event.Enable( (doc && doc->GetCommandProcessor() && doc->GetCommandProcessor()->CanRedo()) ); + if (doc && doc->GetCommandProcessor()) + doc->GetCommandProcessor()->SetMenuStrings(); } void wxDocManager::OnUpdatePrint(wxUpdateUIEvent& event) @@ -990,9 +1029,9 @@ wxView *wxDocManager::GetCurrentView() const { if (m_currentView) return m_currentView; - if (m_docs.Number() == 1) + if (m_docs.GetCount() == 1) { - wxDocument* doc = (wxDocument*) m_docs.First()->Data(); + wxDocument* doc = (wxDocument*) m_docs.GetFirst()->GetData(); return doc->GetFirstView(); } return (wxView *) NULL; @@ -1012,12 +1051,12 @@ bool wxDocManager::ProcessEvent(wxEvent& event) wxDocument *wxDocManager::CreateDocument(const wxString& path, long flags) { - wxDocTemplate **templates = new wxDocTemplate *[m_templates.Number()]; - int i; - int n = 0; - for (i = 0; i < m_templates.Number(); i++) + wxDocTemplate **templates = new wxDocTemplate *[m_templates.GetCount()]; + int n = 0; + + for (size_t i = 0; i < m_templates.GetCount(); i++) { - wxDocTemplate *temp = (wxDocTemplate *)(m_templates.Nth(i)->Data()); + wxDocTemplate *temp = (wxDocTemplate *)(m_templates.Item(i)->GetData()); if (temp->IsVisible()) { templates[n] = temp; @@ -1032,9 +1071,9 @@ wxDocument *wxDocManager::CreateDocument(const wxString& path, long flags) // If we've reached the max number of docs, close the // first one. - if (GetDocuments().Number() >= m_maxDocsOpen) + if ( (int)GetDocuments().GetCount() >= m_maxDocsOpen ) { - wxDocument *doc = (wxDocument *)GetDocuments().First()->Data(); + wxDocument *doc = (wxDocument *)GetDocuments().GetFirst()->GetData(); if (doc->Close()) { // Implicitly deletes the document when @@ -1046,7 +1085,10 @@ wxDocument *wxDocManager::CreateDocument(const wxString& path, long flags) delete doc; } else + { + delete[] templates; return (wxDocument *) NULL; + } } // New document: user chooses a template, unless there's only one. @@ -1120,12 +1162,12 @@ wxDocument *wxDocManager::CreateDocument(const wxString& path, long flags) wxView *wxDocManager::CreateView(wxDocument *doc, long flags) { - wxDocTemplate **templates = new wxDocTemplate *[m_templates.Number()]; - int n =0; - int i; - for (i = 0; i < m_templates.Number(); i++) + wxDocTemplate **templates = new wxDocTemplate *[m_templates.GetCount()]; + int n =0; + + for (size_t i = 0; i < m_templates.GetCount(); i++) { - wxDocTemplate *temp = (wxDocTemplate *)(m_templates.Nth(i)->Data()); + wxDocTemplate *temp = (wxDocTemplate *)(m_templates.Item(i)->GetData()); if (temp->IsVisible()) { if (temp->GetDocumentName() == doc->GetDocumentName()) @@ -1176,8 +1218,9 @@ bool wxDocManager::FlushDoc(wxDocument *WXUNUSED(doc)) wxDocument *wxDocManager::GetCurrentDocument() const { - if (m_currentView) - return m_currentView->GetDocument(); + wxView *view = GetCurrentView(); + if (view) + return view->GetDocument(); else return (wxDocument *) NULL; } @@ -1292,10 +1335,9 @@ wxDocTemplate *wxDocManager::FindTemplateForPath(const wxString& path) wxDocTemplate *theTemplate = (wxDocTemplate *) NULL; // Find the template which this extension corresponds to - int i; - for (i = 0; i < m_templates.Number(); i++) + for (size_t i = 0; i < m_templates.GetCount(); i++) { - wxDocTemplate *temp = (wxDocTemplate *)m_templates.Nth(i)->Data(); + wxDocTemplate *temp = (wxDocTemplate *)m_templates.Item(i)->GetData(); if ( temp->FileMatchesTemplate(path) ) { theTemplate = temp; @@ -1333,7 +1375,7 @@ static wxWindow* wxFindSuitableParent() // template extension. wxDocTemplate *wxDocManager::SelectDocumentPath(wxDocTemplate **templates, -#if defined(__WXMSW__) || defined(__WXGTK__) +#if defined(__WXMSW__) || defined(__WXGTK__) || defined(__WXMAC__) int noTemplates, #else int WXUNUSED(noTemplates), @@ -1343,7 +1385,7 @@ wxDocTemplate *wxDocManager::SelectDocumentPath(wxDocTemplate **templates, bool WXUNUSED(save)) { // We can only have multiple filters in Windows and GTK -#if defined(__WXMSW__) || defined(__WXGTK__) +#if defined(__WXMSW__) || defined(__WXGTK__) || defined(__WXMAC__) wxString descrBuf; int i; @@ -1435,21 +1477,53 @@ wxDocTemplate *wxDocManager::SelectDocumentPath(wxDocTemplate **templates, } wxDocTemplate *wxDocManager::SelectDocumentType(wxDocTemplate **templates, - int noTemplates) + int noTemplates, bool sort) { - wxArrayString strings; + wxArrayString strings(sort); wxDocTemplate **data = new wxDocTemplate *[noTemplates]; int i; int n = 0; - for (i = 0; i < noTemplates; i++) - { - if (templates[i]->IsVisible()) - { - strings.Add(templates[i]->m_description); - data[n] = templates[i]; - n ++; - } - } + + for (i = 0; i < noTemplates; i++) + { + if (templates[i]->IsVisible()) + { + int j; + bool want = TRUE; + for (j = 0; j < n; j++) + { + //filter out NOT unique documents + view combinations + if ( templates[i]->m_docTypeName == data[j]->m_docTypeName && + templates[i]->m_viewTypeName == data[j]->m_viewTypeName + ) + want = FALSE; + } + + if ( want ) + { + strings.Add(templates[i]->m_description); + + data[n] = templates[i]; + n ++; + } + } + } // for + + if (sort) + { + // Yes, this will be slow, but template lists + // are typically short. + int j; + n = strings.Count(); + for (i = 0; i < n; i++) + { + for (j = 0; j < noTemplates; j++) + { + if (strings[i] == templates[j]->m_description) + data[i] = templates[j]; + } + } + } wxDocTemplate *theTemplate; @@ -1483,23 +1557,52 @@ wxDocTemplate *wxDocManager::SelectDocumentType(wxDocTemplate **templates, } wxDocTemplate *wxDocManager::SelectViewType(wxDocTemplate **templates, - int noTemplates) + int noTemplates, bool sort) { - wxArrayString strings; + wxArrayString strings(sort); wxDocTemplate **data = new wxDocTemplate *[noTemplates]; int i; int n = 0; + for (i = 0; i < noTemplates; i++) { wxDocTemplate *templ = templates[i]; if ( templ->IsVisible() && !templ->GetViewName().empty() ) { - strings.Add(templ->m_viewTypeName); - data[n] = templ; - n ++; + int j; + bool want = TRUE; + for (j = 0; j < n; j++) + { + //filter out NOT unique views + if ( templates[i]->m_viewTypeName == data[j]->m_viewTypeName ) + want = FALSE; + } + + if ( want ) + { + strings.Add(templ->m_viewTypeName); + data[n] = templ; + n ++; + } } } + if (sort) + { + // Yes, this will be slow, but template lists + // are typically short. + int j; + n = strings.Count(); + for (i = 0; i < n; i++) + { + for (j = 0; j < noTemplates; j++) + { + if (strings[i] == templates[j]->m_viewTypeName) + data[i] = templates[j]; + } + } + } + wxDocTemplate *theTemplate; // the same logic as above @@ -1704,7 +1807,7 @@ void wxDocParentFrame::OnMRUFile(wxCommandEvent& event) // about it m_docManager->RemoveFileFromHistory(n); - wxLogError(_("The file '%s' doesn't exist and couldn't be opened.\nIt has been also removed from the MRU files list."), + wxLogError(_("The file '%s' doesn't exist and couldn't be opened.\nIt has been removed from the most recently used files list."), filename.c_str()); } } @@ -1799,224 +1902,6 @@ void wxDocPrintout::GetPageInfo(int *minPage, int *maxPage, int *selPageFrom, in #endif // wxUSE_PRINTING_ARCHITECTURE -// ---------------------------------------------------------------------------- -// Command processing framework -// ---------------------------------------------------------------------------- - -wxCommand::wxCommand(bool canUndoIt, const wxString& name) -{ - m_canUndo = canUndoIt; - m_commandName = name; -} - -wxCommand::~wxCommand() -{ -} - -// Command processor -wxCommandProcessor::wxCommandProcessor(int maxCommands) -{ - m_maxNoCommands = maxCommands; - m_currentCommand = (wxNode *) NULL; - m_commandEditMenu = (wxMenu *) NULL; - m_undoAccelerator = wxT("\tCtrl+Z"); - m_redoAccelerator = wxT("\tCtrl+Y"); -} - -wxCommandProcessor::~wxCommandProcessor() -{ - ClearCommands(); -} - -// Pass a command to the processor. The processor calls Do(); -// if successful, is appended to the command history unless -// storeIt is FALSE. -bool wxCommandProcessor::Submit(wxCommand *command, bool storeIt) -{ - bool success = command->Do(); - if (success && storeIt) - { - if (m_commands.Number() == m_maxNoCommands) - { - wxNode *firstNode = m_commands.First(); - wxCommand *firstCommand = (wxCommand *)firstNode->Data(); - delete firstCommand; - delete firstNode; - } - - // Correct a bug: we must chop off the current 'branch' - // so that we're at the end of the command list. - if (!m_currentCommand) - ClearCommands(); - else - { - wxNode *node = m_currentCommand->Next(); - while (node) - { - wxNode *next = node->Next(); - delete (wxCommand *)node->Data(); - delete node; - node = next; - } - } - - m_commands.Append(command); - m_currentCommand = m_commands.Last(); - SetMenuStrings(); - } - return success; -} - -bool wxCommandProcessor::Undo() -{ - if (m_currentCommand) - { - wxCommand *command = (wxCommand *)m_currentCommand->Data(); - if (command->CanUndo()) - { - bool success = command->Undo(); - if (success) - { - m_currentCommand = m_currentCommand->Previous(); - SetMenuStrings(); - return TRUE; - } - } - } - return FALSE; -} - -bool wxCommandProcessor::Redo() -{ - wxCommand *redoCommand = (wxCommand *) NULL; - wxNode *redoNode = (wxNode *) NULL; - if (m_currentCommand && m_currentCommand->Next()) - { - redoCommand = (wxCommand *)m_currentCommand->Next()->Data(); - redoNode = m_currentCommand->Next(); - } - else - { - if (m_commands.Number() > 0) - { - redoCommand = (wxCommand *)m_commands.First()->Data(); - redoNode = m_commands.First(); - } - } - - if (redoCommand) - { - bool success = redoCommand->Do(); - if (success) - { - m_currentCommand = redoNode; - SetMenuStrings(); - return TRUE; - } - } - return FALSE; -} - -bool wxCommandProcessor::CanUndo() const -{ - if (m_currentCommand) - return ((wxCommand *)m_currentCommand->Data())->CanUndo(); - return FALSE; -} - -bool wxCommandProcessor::CanRedo() const -{ - if ((m_currentCommand != (wxNode*) NULL) && (m_currentCommand->Next() == (wxNode*) NULL)) - return FALSE; - - if ((m_currentCommand != (wxNode*) NULL) && (m_currentCommand->Next() != (wxNode*) NULL)) - return TRUE; - - if ((m_currentCommand == (wxNode*) NULL) && (m_commands.Number() > 0)) - return TRUE; - - return FALSE; -} - -void wxCommandProcessor::Initialize() -{ - m_currentCommand = m_commands.Last(); - SetMenuStrings(); -} - -void wxCommandProcessor::SetMenuStrings() -{ - if (m_commandEditMenu) - { - wxString buf; - if (m_currentCommand) - { - wxCommand *command = (wxCommand *)m_currentCommand->Data(); - wxString commandName(command->GetName()); - if (commandName == wxT("")) commandName = _("Unnamed command"); - bool canUndo = command->CanUndo(); - if (canUndo) - buf = wxString(_("&Undo ")) + commandName + m_undoAccelerator; - else - buf = wxString(_("Can't &Undo ")) + commandName + m_undoAccelerator; - - m_commandEditMenu->SetLabel(wxID_UNDO, buf); - m_commandEditMenu->Enable(wxID_UNDO, canUndo); - - // We can redo, if we're not at the end of the history. - if (m_currentCommand->Next()) - { - wxCommand *redoCommand = (wxCommand *)m_currentCommand->Next()->Data(); - wxString redoCommandName(redoCommand->GetName()); - if (redoCommandName == wxT("")) redoCommandName = _("Unnamed command"); - buf = wxString(_("&Redo ")) + redoCommandName + m_redoAccelerator; - m_commandEditMenu->SetLabel(wxID_REDO, buf); - m_commandEditMenu->Enable(wxID_REDO, TRUE); - } - else - { - m_commandEditMenu->SetLabel(wxID_REDO, _("&Redo") + m_redoAccelerator); - m_commandEditMenu->Enable(wxID_REDO, FALSE); - } - } - else - { - m_commandEditMenu->SetLabel(wxID_UNDO, _("&Undo") + m_undoAccelerator); - m_commandEditMenu->Enable(wxID_UNDO, FALSE); - - if (m_commands.Number() == 0) - { - m_commandEditMenu->SetLabel(wxID_REDO, _("&Redo") + m_redoAccelerator); - m_commandEditMenu->Enable(wxID_REDO, FALSE); - } - else - { - // currentCommand is NULL but there are commands: this means that - // we've undone to the start of the list, but can redo the first. - wxCommand *redoCommand = (wxCommand *)m_commands.First()->Data(); - wxString redoCommandName(redoCommand->GetName()); - if (redoCommandName == wxT("")) redoCommandName = _("Unnamed command"); - buf = wxString(_("&Redo ")) + redoCommandName + m_redoAccelerator; - m_commandEditMenu->SetLabel(wxID_REDO, buf); - m_commandEditMenu->Enable(wxID_REDO, TRUE); - } - } - } -} - -void wxCommandProcessor::ClearCommands() -{ - wxNode *node = m_commands.First(); - while (node) - { - wxCommand *command = (wxCommand *)node->Data(); - delete command; - delete node; - node = m_commands.First(); - } - m_currentCommand = (wxNode *) NULL; -} - // ---------------------------------------------------------------------------- // File history processor // ---------------------------------------------------------------------------- @@ -2065,14 +1950,16 @@ void wxFileHistory::AddFileToHistory(const wxString& file) // Move existing files (if any) down so we can insert file at beginning. if (m_fileHistoryN < m_fileMaxFiles) { - wxNode* node = m_fileMenus.First(); + wxNode* node = m_fileMenus.GetFirst(); while (node) { - wxMenu* menu = (wxMenu*) node->Data(); - if (m_fileHistoryN == 0) + wxMenu* menu = (wxMenu*) node->GetData(); + if ( m_fileHistoryN == 0 && menu->GetMenuItemCount() ) + { menu->AppendSeparator(); + } menu->Append(wxID_FILE1+m_fileHistoryN, _("[EMPTY]")); - node = node->Next(); + node = node->GetNext(); } m_fileHistoryN ++; } @@ -2108,12 +1995,12 @@ void wxFileHistory::AddFileToHistory(const wxString& file) wxString buf; buf.Printf(s_MRUEntryFormat, i + 1, pathInMenu.c_str()); - wxNode* node = m_fileMenus.First(); + wxNode* node = m_fileMenus.GetFirst(); while (node) { - wxMenu* menu = (wxMenu*) node->Data(); + wxMenu* menu = (wxMenu*) node->GetData(); menu->SetLabel(wxID_FILE1 + i, buf); - node = node->Next(); + node = node->GetNext(); } } } @@ -2124,11 +2011,6 @@ void wxFileHistory::RemoveFileFromHistory(int i) wxCHECK_RET( i < m_fileHistoryN, wxT("invalid index in wxFileHistory::RemoveFileFromHistory") ); - wxNode* node = m_fileMenus.First(); - while ( node ) - { - wxMenu* menu = (wxMenu*) node->Data(); - // delete the element from the array (could use memmove() too...) delete [] m_fileHistory[i]; @@ -2138,6 +2020,12 @@ void wxFileHistory::RemoveFileFromHistory(int i) m_fileHistory[j] = m_fileHistory[j + 1]; } + wxNode* node = m_fileMenus.GetFirst(); + while ( node ) + { + wxMenu* menu = (wxMenu*) node->GetData(); + + // shuffle filenames up wxString buf; for ( j = i; j < m_fileHistoryN - 1; j++ ) @@ -2146,9 +2034,10 @@ void wxFileHistory::RemoveFileFromHistory(int i) menu->SetLabel(wxID_FILE1 + j, buf); } - node = node->Next(); + node = node->GetNext(); // delete the last menu item which is unused now + if (menu->FindItem(wxID_FILE1 + m_fileHistoryN - 1)) menu->Delete(wxID_FILE1 + m_fileHistoryN - 1); // delete the last separator too if no more files are left @@ -2204,7 +2093,7 @@ void wxFileHistory::Load(wxConfigBase& config) wxString buf; buf.Printf(wxT("file%d"), m_fileHistoryN+1); wxString historyFile; - while ((m_fileHistoryN <= m_fileMaxFiles) && config.Read(buf, &historyFile) && (historyFile != wxT(""))) + while ((m_fileHistoryN < m_fileMaxFiles) && config.Read(buf, &historyFile) && (historyFile != wxT(""))) { m_fileHistory[m_fileHistoryN] = copystring((const wxChar*) historyFile); m_fileHistoryN ++; @@ -2230,11 +2119,15 @@ void wxFileHistory::AddFilesToMenu() { if (m_fileHistoryN > 0) { - wxNode* node = m_fileMenus.First(); + wxNode* node = m_fileMenus.GetFirst(); while (node) { - wxMenu* menu = (wxMenu*) node->Data(); - menu->AppendSeparator(); + wxMenu* menu = (wxMenu*) node->GetData(); + if (menu->GetMenuItemCount()) + { + menu->AppendSeparator(); + } + int i; for (i = 0; i < m_fileHistoryN; i++) { @@ -2245,7 +2138,7 @@ void wxFileHistory::AddFilesToMenu() menu->Append(wxID_FILE1+i, buf); } } - node = node->Next(); + node = node->GetNext(); } } } @@ -2254,7 +2147,11 @@ void wxFileHistory::AddFilesToMenu(wxMenu* menu) { if (m_fileHistoryN > 0) { - menu->AppendSeparator(); + if (menu->GetMenuItemCount()) + { + menu->AppendSeparator(); + } + int i; for (i = 0; i < m_fileHistoryN; i++) { @@ -2274,7 +2171,7 @@ void wxFileHistory::AddFilesToMenu(wxMenu* menu) // ---------------------------------------------------------------------------- #if wxUSE_STD_IOSTREAM -bool wxTransferFileToStream(const wxString& filename, ostream& stream) +bool wxTransferFileToStream(const wxString& filename, wxSTD ostream& stream) { FILE *fd1; int ch; @@ -2289,7 +2186,7 @@ bool wxTransferFileToStream(const wxString& filename, ostream& stream) return TRUE; } -bool wxTransferStreamToFile(istream& stream, const wxString& filename) +bool wxTransferStreamToFile(wxSTD istream& stream, const wxString& filename) { FILE *fd1; int ch; @@ -2334,7 +2231,7 @@ bool wxTransferStreamToFile(wxInputStream& stream, const wxString& filename) return FALSE; } - int len = stream.StreamSize(); + int len = stream.GetSize(); // TODO: is this the correct test for EOF? while (stream.TellI() < (len - 1)) {