X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/427716213fefc0e28ae515c13977abfa76f1a2f0..a4de7e8ccf4bf69d150c29c9a3d53e5754c8b8a9:/src/common/docview.cpp diff --git a/src/common/docview.cpp b/src/common/docview.cpp index 0616423329..38dd2f9363 100644 --- a/src/common/docview.cpp +++ b/src/common/docview.cpp @@ -17,7 +17,7 @@ // headers // ---------------------------------------------------------------------------- -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "docview.h" #endif @@ -80,7 +80,7 @@ #endif // ---------------------------------------------------------------------------- -// wxWindows macros +// wxWidgets macros // ---------------------------------------------------------------------------- IMPLEMENT_ABSTRACT_CLASS(wxDocument, wxEvtHandler) @@ -183,18 +183,20 @@ bool wxDocument::OnCloseDocument() bool wxDocument::DeleteAllViews() { wxDocManager* manager = GetDocumentManager(); + wxList::iterator it, en; - wxNode *node = m_documentViews.GetFirst(); - while (node) + for ( it = m_documentViews.begin(), en = m_documentViews.end(); + it != en; + ) { - wxView *view = (wxView *)node->GetData(); + wxView *view = (wxView *)*it; if (!view->Close()) return FALSE; - wxNode *next = node->GetNext(); + wxList::iterator next = it; ++next; delete view; // Deletes node implicitly - node = next; + it = next; } // If we haven't yet deleted the document (for example // if there were no views) then delete it. @@ -251,11 +253,42 @@ bool wxDocument::SaveAs() if (!docTemplate) return FALSE; +#if defined(__WXMSW__) || defined(__WXGTK__) || defined(__WXMAC__) + wxString filter = docTemplate->GetDescription() + wxT(" (") + docTemplate->GetFileFilter() + wxT(")|") + docTemplate->GetFileFilter(); + + // Now see if there are some other template with identical view and document + // classes, whose filters may also be used. + + if (docTemplate->GetViewClassInfo() && docTemplate->GetDocClassInfo()) + { + wxList::compatibility_iterator node = wxDocManager::GetDocumentManager()->GetTemplates().GetFirst(); + while (node) + { + wxDocTemplate *t = (wxDocTemplate*) node->GetData(); + + if (t->IsVisible() && t != docTemplate && + t->GetViewClassInfo() == docTemplate->GetViewClassInfo() && + t->GetDocClassInfo() == docTemplate->GetDocClassInfo()) + { + // add a '|' to separate this filter from the previous one + if ( !filter.IsEmpty() ) + filter << wxT('|'); + + filter << t->GetDescription() << wxT(" (") << t->GetFileFilter() << wxT(") |") + << t->GetFileFilter(); + } + + node = node->GetNext(); + } + } +#else + wxString filter = docTemplate->GetFileFilter() ; +#endif wxString tmp = wxFileSelector(_("Save as"), docTemplate->GetDirectory(), wxFileNameFromPath(GetFilename()), docTemplate->GetDefaultExtension(), - docTemplate->GetFileFilter(), + filter, wxSAVE | wxOVERWRITE_PROMPT, GetDocumentWindow()); @@ -276,7 +309,7 @@ bool wxDocument::SaveAs() SetTitle(wxFileNameFromPath(fileName)); // Notify the views that the filename has changed - wxNode *node = m_documentViews.GetFirst(); + wxList::compatibility_iterator node = m_documentViews.GetFirst(); while (node) { wxView *view = (wxView *)node->GetData(); @@ -525,7 +558,7 @@ void wxDocument::OnChangedViewList() void wxDocument::UpdateAllViews(wxView *sender, wxObject *hint) { - wxNode *node = m_documentViews.GetFirst(); + wxList::compatibility_iterator node = m_documentViews.GetFirst(); while (node) { wxView *view = (wxView *)node->GetData(); @@ -537,7 +570,7 @@ void wxDocument::UpdateAllViews(wxView *sender, wxObject *hint) void wxDocument::NotifyClosing() { - wxNode *node = m_documentViews.GetFirst(); + wxList::compatibility_iterator node = m_documentViews.GetFirst(); while (node) { wxView *view = (wxView *)node->GetData(); @@ -552,7 +585,7 @@ void wxDocument::SetFilename(const wxString& filename, bool notifyViews) if ( notifyViews ) { // Notify the views that the filename has changed - wxNode *node = m_documentViews.GetFirst(); + wxList::compatibility_iterator node = m_documentViews.GetFirst(); while (node) { wxView *view = (wxView *)node->GetData(); @@ -568,16 +601,14 @@ void wxDocument::SetFilename(const wxString& filename, bool notifyViews) wxView::wxView() { - // SetDocument(doc); m_viewDocument = (wxDocument*) NULL; - m_viewTypeName = wxT(""); m_viewFrame = (wxFrame *) NULL; } wxView::~wxView() { -// GetDocumentManager()->ActivateView(this, FALSE, TRUE); + GetDocumentManager()->ActivateView(this, FALSE); m_viewDocument->RemoveView(this); } @@ -586,8 +617,8 @@ bool wxView::ProcessEvent(wxEvent& event) { if ( !GetDocument() || !GetDocument()->ProcessEvent(event) ) return wxEvtHandler::ProcessEvent(event); - else - return TRUE; + + return TRUE; } void wxView::OnActivateView(bool WXUNUSED(activate), wxView *WXUNUSED(activeView), wxView *WXUNUSED(deactiveView)) @@ -691,18 +722,31 @@ wxDocument *wxDocTemplate::CreateDocument(const wxString& path, long flags) if (!m_docClassInfo) return (wxDocument *) NULL; wxDocument *doc = (wxDocument *)m_docClassInfo->CreateObject(); + + if (InitDocument(doc, path, flags)) + { + return doc; + } + else + { + return (wxDocument *) NULL; + } +} + +bool wxDocTemplate::InitDocument(wxDocument* doc, const wxString& path, long flags) +{ doc->SetFilename(path); doc->SetDocumentTemplate(this); GetDocumentManager()->AddDocument(doc); doc->SetCommandProcessor(doc->OnCreateCommandProcessor()); if (doc->OnCreate(path, flags)) - return doc; + return true; else { if (GetDocumentManager()->GetDocuments().Member(doc)) doc->DeleteAllViews(); - return (wxDocument *) NULL; + return false; } } @@ -808,12 +852,12 @@ bool wxDocManager::CloseDocument(wxDocument* doc, bool force) bool wxDocManager::CloseDocuments(bool force) { - wxNode *node = m_docs.GetFirst(); + wxList::compatibility_iterator node = m_docs.GetFirst(); while (node) { wxDocument *doc = (wxDocument *)node->GetData(); - wxNode *next = node->GetNext(); - + wxList::compatibility_iterator next = node->GetNext(); + if (!CloseDocument(doc, force)) return FALSE; @@ -830,11 +874,11 @@ bool wxDocManager::Clear(bool force) if (!CloseDocuments(force)) return FALSE; - wxNode *node = m_templates.GetFirst(); + wxList::compatibility_iterator node = m_templates.GetFirst(); while (node) { wxDocTemplate *templ = (wxDocTemplate*) node->GetData(); - wxNode* next = node->GetNext(); + wxList::compatibility_iterator next = node->GetNext(); delete templ; node = next; } @@ -952,8 +996,13 @@ void wxDocManager::OnPreview(wxCommandEvent& WXUNUSED(event)) if (printout) { // Pass two printout objects: for preview, and possible printing. - wxPrintPreviewBase *preview = (wxPrintPreviewBase *) NULL; - preview = new wxPrintPreview(printout, view->OnCreatePrintout()); + wxPrintPreviewBase *preview = new wxPrintPreview(printout, view->OnCreatePrintout()); + if ( !preview->Ok() ) + { + delete preview; + wxMessageBox( _("Sorry, print preview needs a printer to be installed.") ); + return; + } wxPreviewFrame *frame = new wxPreviewFrame(preview, (wxFrame *)wxTheApp->GetTopWindow(), _("Print Preview"), wxPoint(100, 100), wxSize(600, 650)); @@ -1175,7 +1224,7 @@ wxDocument *wxDocManager::CreateDocument(const wxString& path, long flags) } // Existing document - wxDocTemplate *temp = (wxDocTemplate *) NULL; + wxDocTemplate *temp; wxString path2(wxT("")); if (path != wxT("")) @@ -1532,7 +1581,7 @@ wxDocTemplate *wxDocManager::SelectDocumentPath(wxDocTemplate **templates, wxDocTemplate *wxDocManager::SelectDocumentType(wxDocTemplate **templates, int noTemplates, bool sort) { - wxArrayString strings(sort); + wxArrayString strings; wxDocTemplate **data = new wxDocTemplate *[noTemplates]; int i; int n = 0; @@ -1564,6 +1613,7 @@ wxDocTemplate *wxDocManager::SelectDocumentType(wxDocTemplate **templates, if (sort) { + strings.Sort(wxStringSortAscending); // Yes, this will be slow, but template lists // are typically short. int j; @@ -1612,7 +1662,7 @@ wxDocTemplate *wxDocManager::SelectDocumentType(wxDocTemplate **templates, wxDocTemplate *wxDocManager::SelectViewType(wxDocTemplate **templates, int noTemplates, bool sort) { - wxArrayString strings(sort); + wxArrayString strings; wxDocTemplate **data = new wxDocTemplate *[noTemplates]; int i; int n = 0; @@ -1642,6 +1692,7 @@ wxDocTemplate *wxDocManager::SelectViewType(wxDocTemplate **templates, if (sort) { + strings.Sort(wxStringSortAscending); // Yes, this will be slow, but template lists // are typically short. int j; @@ -1710,25 +1761,19 @@ void wxDocManager::RemoveDocument(wxDocument *doc) // Views or windows should inform the document manager // when a view is going in or out of focus -void wxDocManager::ActivateView(wxView *view, bool activate, bool WXUNUSED(deleting)) -{ - // If we're deactiving, and if we're not actually deleting the view, then - // don't reset the current view because we may be going to - // a window without a view. - // WHAT DID I MEAN BY THAT EXACTLY? - /* - if (deleting) - { - if (m_currentView == view) - m_currentView = NULL; - } - else - */ - { - if (activate) - m_currentView = view; - else +void wxDocManager::ActivateView(wxView *view, bool activate) +{ + if ( activate ) + { + m_currentView = view; + } + else // deactivate + { + if ( m_currentView == view ) + { + // don't keep stale pointer m_currentView = (wxView *) NULL; + } } } @@ -1792,11 +1837,9 @@ void wxDocChildFrame::OnCloseWindow(wxCloseEvent& event) { if (m_childView) { - bool ans = FALSE; - if (!event.CanVeto()) - ans = TRUE; // Must delete. - else - ans = m_childView->Close(FALSE); // FALSE means don't delete associated window + bool ans = event.CanVeto() + ? m_childView->Close(FALSE) // FALSE means don't delete associated window + : TRUE; // Must delete. if (ans) { @@ -1910,8 +1953,10 @@ bool wxDocPrintout::OnPrintPage(int WXUNUSED(page)) // Get the logical pixels per inch of screen and printer int ppiScreenX, ppiScreenY; GetPPIScreen(&ppiScreenX, &ppiScreenY); + wxUnusedVar(ppiScreenY); int ppiPrinterX, ppiPrinterY; GetPPIPrinter(&ppiPrinterX, &ppiPrinterY); + wxUnusedVar(ppiPrinterY); // This scales the DC so that the printout roughly represents the // the screen scaling. The text point size _should_ be the right size @@ -1926,6 +1971,7 @@ bool wxDocPrintout::OnPrintPage(int WXUNUSED(page)) int w, h; dc->GetSize(&w, &h); GetPageSizePixels(&pageWidth, &pageHeight); + wxUnusedVar(pageHeight); // If printer pageWidth == current DC width, then this doesn't // change. But w might be the preview bitmap width, so scale down. @@ -2030,7 +2076,7 @@ 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.GetFirst(); + wxList::compatibility_iterator node = m_fileMenus.GetFirst(); while (node) { wxMenu* menu = (wxMenu*) node->GetData(); @@ -2075,7 +2121,7 @@ void wxFileHistory::AddFileToHistory(const wxString& file) wxString buf; buf.Printf(s_MRUEntryFormat, i + 1, pathInMenu.c_str()); - wxNode* node = m_fileMenus.GetFirst(); + wxList::compatibility_iterator node = m_fileMenus.GetFirst(); while (node) { wxMenu* menu = (wxMenu*) node->GetData(); @@ -2100,7 +2146,7 @@ void wxFileHistory::RemoveFileFromHistory(size_t i) m_fileHistory[j] = m_fileHistory[j + 1]; } - wxNode* node = m_fileMenus.GetFirst(); + wxList::compatibility_iterator node = m_fileMenus.GetFirst(); while ( node ) { wxMenu* menu = (wxMenu*) node->GetData(); @@ -2125,7 +2171,7 @@ void wxFileHistory::RemoveFileFromHistory(size_t i) // delete the last separator too if no more files are left if ( m_fileHistoryN == 1 ) { - wxMenuItemList::Node *node = menu->GetMenuItems().GetLast(); + wxMenuItemList::compatibility_iterator node = menu->GetMenuItems().GetLast(); if ( node ) { wxMenuItem *menuItem = node->GetData(); @@ -2204,7 +2250,7 @@ void wxFileHistory::AddFilesToMenu() { if (m_fileHistoryN > 0) { - wxNode* node = m_fileMenus.GetFirst(); + wxList::compatibility_iterator node = m_fileMenus.GetFirst(); while (node) { wxMenu* menu = (wxMenu*) node->GetData();