don't fall back to the only currently existing document in wxDocManager::GetCurrentView() as it breaks activation logic (#9518)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@58496 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2009-01-29 13:04:40 +00:00
parent f92ec19302
commit 575e4cd670
2 changed files with 29 additions and 12 deletions

View File

@@ -417,7 +417,7 @@ public:
// Views or windows should inform the document manager
// when a view is going in or out of focus
virtual void ActivateView(wxView *view, bool activate = true);
virtual wxView *GetCurrentView() const;
virtual wxView *GetCurrentView() const { return m_currentView; }
wxList& GetDocuments() { return m_docs; }
wxList& GetTemplates() { return m_templates; }
@@ -472,6 +472,11 @@ protected:
// return the command processor for the current document, if any
wxCommandProcessor *GetCurrentCommandProcessor() const;
// this method tries to find an active view harder than GetCurrentView():
// if the latter is NULL, it also checks if we don't have just a single
// view and returns it then
wxView *GetActiveView() const;
int m_defaultDocumentNameCounter;
int m_maxDocsOpen;

View File

@@ -1018,7 +1018,7 @@ void wxDocManager::OnFileSaveAs(wxCommandEvent& WXUNUSED(event))
void wxDocManager::OnPrint(wxCommandEvent& WXUNUSED(event))
{
#if wxUSE_PRINTING_ARCHITECTURE
wxView *view = GetCurrentView();
wxView *view = GetActiveView();
if (!view)
return;
@@ -1036,7 +1036,7 @@ void wxDocManager::OnPrint(wxCommandEvent& WXUNUSED(event))
void wxDocManager::OnPreview(wxCommandEvent& WXUNUSED(event))
{
#if wxUSE_PRINTING_ARCHITECTURE
wxView *view = GetCurrentView();
wxView *view = GetActiveView();
if (!view)
return;
@@ -1140,21 +1140,33 @@ void wxDocManager::OnUpdateRedo(wxUpdateUIEvent& event)
cmdproc->SetMenuStrings();
}
wxView *wxDocManager::GetCurrentView() const
wxView *wxDocManager::GetActiveView() const
{
if (m_currentView)
return m_currentView;
if (m_docs.GetCount() == 1)
wxView *view = GetCurrentView();
if ( !view && !m_docs.empty() )
{
wxDocument* doc = (wxDocument*) m_docs.GetFirst()->GetData();
return doc->GetFirstView();
// if we have exactly one document, consider its view to be the current
// one
//
// VZ: I'm not exactly sure why is this needed but this is how this
// code used to behave before the bug #9518 was fixed and it seems
// safer to preserve the old logic
wxList::compatibility_iterator node = m_docs.GetFirst();
if ( !node->GetNext() )
{
wxDocument *doc = static_cast<wxDocument *>(node->GetData());
view = doc->GetFirstView();
}
return NULL;
//else: we have more than one document
}
return view;
}
bool wxDocManager::TryValidator(wxEvent& event)
{
wxView * const view = GetCurrentView();
wxView * const view = GetActiveView();
return view && view->ProcessEventHere(event);
}
@@ -1329,7 +1341,7 @@ bool wxDocManager::FlushDoc(wxDocument *WXUNUSED(doc))
wxDocument *wxDocManager::GetCurrentDocument() const
{
wxView * const view = GetCurrentView();
wxView * const view = GetActiveView();
return view ? view->GetDocument() : NULL;
}