X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/18759f7850414f46b15a8ed989951e3bc346f830..a3c15d892d21e938f3e53dfa81c62eb5da4ce3c8:/src/common/docview.cpp diff --git a/src/common/docview.cpp b/src/common/docview.cpp index e0720053f1..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(); @@ -689,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; } } @@ -806,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; @@ -828,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; } @@ -950,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)); @@ -1173,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("")) @@ -1530,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; @@ -1562,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; @@ -1610,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; @@ -1640,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; @@ -1784,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) { @@ -1902,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 @@ -1918,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. @@ -2022,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(); @@ -2067,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(); @@ -2092,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(); @@ -2117,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(); @@ -2196,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();