#if WXWIN_COMPATIBILITY_2_8
bool wxDocument::GetPrintableName(wxString& buf) const
{
- // this function can not only be overridden by the user code but also
+ // this function cannot only be overridden by the user code but also
// called by it so we need to ensure that we return the same thing as
// GetUserReadableName() but we can't call it because this would result in
// an infinite recursion, hence we use the helper DoGetUserReadableName()
EVT_MENU(wxID_UNDO, wxDocManager::OnUndo)
EVT_MENU(wxID_REDO, wxDocManager::OnRedo)
+ // We don't know in advance how many items can there be in the MRU files
+ // list so set up OnMRUFile() as a handler for all menu events and do the
+ // check for the id of the menu item clicked inside it.
+ EVT_MENU(wxID_ANY, wxDocManager::OnMRUFile)
+
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_PRINT, wxDocManager::OnUpdateDisableIfNoDoc)
EVT_UPDATE_UI(wxID_PREVIEW, wxDocManager::OnUpdateDisableIfNoDoc)
- EVT_UPDATE_UI(wxID_PRINT_SETUP, wxDocManager::OnUpdateDisableIfNoDoc)
+ // NB: we keep "Print setup" menu item always enabled as it can be used
+ // even without an active document
#endif // wxUSE_PRINTING_ARCHITECTURE
END_EVENT_TABLE()
void wxDocManager::OnFileClose(wxCommandEvent& WXUNUSED(event))
{
wxDocument *doc = GetCurrentDocument();
- if (!doc)
- return;
- if (doc->Close())
- {
- doc->DeleteAllViews();
- if (m_docs.Member(doc))
- delete doc;
- }
+ if (doc)
+ CloseDocument(doc);
}
void wxDocManager::OnFileCloseAll(wxCommandEvent& WXUNUSED(event))
doc->SaveAs();
}
+void wxDocManager::OnMRUFile(wxCommandEvent& event)
+{
+ // Check if the id is in the range assigned to MRU list entries.
+ const int id = event.GetId();
+ if ( id >= wxID_FILE1 &&
+ id < wxID_FILE1 + static_cast<int>(m_fileHistory->GetCount()) )
+ {
+ DoOpenMRUFile(id - wxID_FILE1);
+ }
+ else
+ {
+ event.Skip();
+ }
+}
+
+void wxDocManager::DoOpenMRUFile(unsigned n)
+{
+ wxString filename(GetHistoryFile(n));
+ if ( filename.empty() )
+ return;
+
+ wxString errMsg; // must contain exactly one "%s" if non-empty
+ if ( wxFile::Exists(filename) )
+ {
+ // try to open it
+ if ( CreateDocument(filename, wxDOC_SILENT) )
+ return;
+
+ errMsg = _("The file '%s' couldn't be opened.");
+ }
+ else // file doesn't exist
+ {
+ errMsg = _("The file '%s' doesn't exist and couldn't be opened.");
+ }
+
+
+ wxASSERT_MSG( !errMsg.empty(), "should have an error message" );
+
+ // remove the file which we can't open from the MRU list
+ RemoveFileFromHistory(n);
+
+ // and tell the user about it
+ wxLogError(errMsg + '\n' +
+ _("It has been removed from the most recently used files list."),
+ filename);
+}
+
#if wxUSE_PRINTING_ARCHITECTURE
void wxDocManager::OnPrint(wxCommandEvent& WXUNUSED(event))
} // anonymous namespace
+void wxDocManager::ActivateDocument(wxDocument *doc)
+{
+ wxView * const view = doc->GetFirstView();
+ if ( !view )
+ return;
+
+ view->Activate(true);
+ if ( wxWindow *win = view->GetFrame() )
+ win->SetFocus();
+}
+
wxDocument *wxDocManager::CreateDocument(const wxString& pathOrig, long flags)
{
// this ought to be const but SelectDocumentType/Path() are not
if ( fn == doc->GetFilename() )
{
// file already open, just activate it and return
- if ( doc->GetFirstView() )
- {
- ActivateView(doc->GetFirstView());
- if ( doc->GetDocumentWindow() )
- doc->GetDocumentWindow()->SetFocus();
- return doc;
- }
+ ActivateDocument(doc);
+ return doc;
}
}
}
if ( !(flags & wxDOC_NEW) && temp->FileMatchesTemplate(path) )
AddFileToHistory(path);
+ // at least under Mac (where views are top level windows) it seems to be
+ // necessary to manually activate the new document to bring it to the
+ // forefront -- and it shouldn't hurt doing this under the other platforms
+ ActivateDocument(docNew);
+
return docNew;
}
m_templates.DeleteObject(temp);
}
+wxDocTemplate* wxDocManager::FindTemplate(const wxClassInfo* classinfo)
+{
+ for ( wxList::compatibility_iterator node = m_templates.GetFirst();
+ node;
+ node = node->GetNext() )
+ {
+ wxDocTemplate* t = wxStaticCast(node->GetData(), wxDocTemplate);
+ if ( t->GetDocClassInfo() == classinfo )
+ return t;
+ }
+
+ return NULL;
+}
+
// Add and remove a document from the manager's list
void wxDocManager::AddDocument(wxDocument *doc)
{
// deleted directly not by us as indicated by its doc child frame
// pointer still being set
m_childView->SetDocChildFrame(NULL);
- delete m_childView;
- m_childView = NULL;
+ wxDELETE(m_childView);
}
m_childDocument = NULL;
// wxDocParentFrameAnyBase
// ----------------------------------------------------------------------------
-void wxDocParentFrameAnyBase::DoOpenMRUFile(unsigned n)
-{
- wxString filename(m_docManager->GetHistoryFile(n));
- if ( filename.empty() )
- return;
+#if wxUSE_PRINTING_ARCHITECTURE
- wxString errMsg; // must contain exactly one "%s" if non-empty
- if ( wxFile::Exists(filename) )
- {
- // try to open it
- if ( m_docManager->CreateDocument(filename, wxDOC_SILENT) )
- return;
+namespace
+{
- errMsg = _("The file '%s' couldn't be opened.");
- }
- else // file doesn't exist
+wxString GetAppropriateTitle(const wxView *view, const wxString& titleGiven)
+{
+ wxString title(titleGiven);
+ if ( title.empty() )
{
- errMsg = _("The file '%s' doesn't exist and couldn't be opened.");
+ if ( view && view->GetDocument() )
+ title = view->GetDocument()->GetUserReadableName();
+ else
+ title = _("Printout");
}
-
- wxASSERT_MSG( !errMsg.empty(), "should have an error message" );
-
- // remove the file which we can't open from the MRU list
- m_docManager->RemoveFileFromHistory(n);
-
- // and tell the user about it
- wxLogError(errMsg + '\n' +
- _("It has been removed from the most recently used files list."),
- filename);
+ return title;
}
-#if wxUSE_PRINTING_ARCHITECTURE
+} // anonymous namespace
wxDocPrintout::wxDocPrintout(wxView *view, const wxString& title)
- : wxPrintout(title)
+ : wxPrintout(GetAppropriateTitle(view, title))
{
m_printoutView = view;
}