X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/59cf2e4999e9ae9bcdc2a3093dec4ec27b50df5b..69659fd770f615210efac4b4fa741b3ad6223616:/src/common/docview.cpp diff --git a/src/common/docview.cpp b/src/common/docview.cpp index e33a33c339..34cbdbadaf 100644 --- a/src/common/docview.cpp +++ b/src/common/docview.cpp @@ -41,6 +41,7 @@ #include "wx/log.h" #include "wx/msgdlg.h" #include "wx/mdi.h" + #include "wx/choicdlg.h" #endif #include "wx/ffile.h" @@ -54,11 +55,11 @@ #include "wx/printdlg.h" #endif -#include "wx/choicdlg.h" #include "wx/confbase.h" #include "wx/file.h" #include "wx/cmdproc.h" #include "wx/tokenzr.h" +#include "wx/filename.h" #include #include @@ -95,7 +96,6 @@ IMPLEMENT_DYNAMIC_CLASS(wxFileHistory, wxObject) // function prototypes // ---------------------------------------------------------------------------- -static inline wxString FindExtension(const wxChar *path); static wxWindow* wxFindSuitableParent(void); // ---------------------------------------------------------------------------- @@ -112,7 +112,7 @@ static const wxChar *s_MRUEntryFormat = wxT("&%d %s"); // local functions // ---------------------------------------------------------------------------- -static wxString FindExtension(const wxChar *path) +static wxString FindExtension(const wxString& path) { wxString ext; wxSplitPath(path, NULL, NULL, &ext); @@ -241,8 +241,7 @@ bool wxDocument::OnNewDocument() Modify(false); SetDocumentSaved(false); - wxString name; - GetDocumentManager()->MakeDefaultName(name); + const wxString name = GetDocumentManager()->MakeNewDocumentName(); SetTitle(name); SetFilename(name, true); @@ -274,7 +273,7 @@ bool wxDocument::SaveAs() if (docTemplate->GetViewClassInfo() && docTemplate->GetDocClassInfo()) { - wxList::compatibility_iterator node = wxDocManager::GetDocumentManager()->GetTemplates().GetFirst(); + wxList::compatibility_iterator node = docTemplate->GetDocumentManager()->GetTemplates().GetFirst(); while (node) { wxDocTemplate *t = (wxDocTemplate*) node->GetData(); @@ -408,23 +407,41 @@ bool wxDocument::Revert() // Get title, or filename if no title, else unnamed +#if WXWIN_COMPATIBILITY_2_8 bool wxDocument::GetPrintableName(wxString& buf) const { - if (!m_documentTitle.empty()) - { - buf = m_documentTitle; - return true; - } - else if (!m_documentFile.empty()) - { - buf = wxFileNameFromPath(m_documentFile); - return true; - } - else - { - buf = _("unnamed"); - return true; - } + // this function can not 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() + buf = DoGetUserReadableName(); + + return true; +} +#endif // WXWIN_COMPATIBILITY_2_8 + +wxString wxDocument::GetUserReadableName() const +{ +#if WXWIN_COMPATIBILITY_2_8 + // we need to call the old virtual function to ensure that the overridden + // version of it is still called + wxString name; + if ( GetPrintableName(name) ) + return name; +#endif // WXWIN_COMPATIBILITY_2_8 + + return DoGetUserReadableName(); +} + +wxString wxDocument::DoGetUserReadableName() const +{ + if ( !m_documentTitle.empty() ) + return m_documentTitle; + + if ( !m_documentFile.empty() ) + return wxFileNameFromPath(m_documentFile); + + return _("unnamed"); } wxWindow *wxDocument::GetDocumentWindow() const @@ -446,8 +463,7 @@ bool wxDocument::OnSaveModified() { if (IsModified()) { - wxString title; - GetPrintableName(title); + wxString title = GetUserReadableName(); wxString msgTitle; if (!wxTheApp->GetAppName().empty()) @@ -456,8 +472,7 @@ bool wxDocument::OnSaveModified() msgTitle = wxString(_("Warning")); wxString prompt; - prompt.Printf(_("Do you want to save changes to document %s?"), - (const wxChar *)title); + prompt.Printf(_("Do you want to save changes to document %s?"), title); int res = wxMessageBox(prompt, msgTitle, wxYES_NO|wxCANCEL|wxICON_QUESTION, GetDocumentWindow()); @@ -664,9 +679,7 @@ void wxView::OnChangeFilename() wxDocument *doc = GetDocument(); if (!doc) return; - wxString name; - doc->GetPrintableName(name); - win->SetLabel(name); + win->SetLabel(doc->GetUserReadableName()); } void wxView::SetDocument(wxDocument *doc) @@ -1405,13 +1418,30 @@ wxDocument *wxDocManager::GetCurrentDocument() const return (wxDocument *) NULL; } -// Make a default document name -bool wxDocManager::MakeDefaultName(wxString& name) +// Make a default name for a new document +#if WXWIN_COMPATIBILITY_2_8 +bool wxDocManager::MakeDefaultName(wxString& WXUNUSED(name)) +{ + // we consider that this function can only be overridden by the user code, + // not called by it as it only makes sense to call it internally, so we + // don't bother to return anything from here + return false; +} +#endif // WXWIN_COMPATIBILITY_2_8 + +wxString wxDocManager::MakeNewDocumentName() { - name.Printf(_("unnamed%d"), m_defaultDocumentNameCounter); - m_defaultDocumentNameCounter++; + wxString name; - return true; +#if WXWIN_COMPATIBILITY_2_8 + if ( !MakeDefaultName(name) ) +#endif // WXWIN_COMPATIBILITY_2_8 + { + name.Printf(_("unnamed%d"), m_defaultDocumentNameCounter); + m_defaultDocumentNameCounter++; + } + + return name; } // Make a frame title (override this to do something different) @@ -1424,8 +1454,7 @@ wxString wxDocManager::MakeFrameTitle(wxDocument* doc) title = appName; else { - wxString docName; - doc->GetPrintableName(docName); + wxString docName = doc->GetUserReadableName(); title = docName + wxString(_(" - ")) + appName; } return title; @@ -1923,6 +1952,11 @@ BEGIN_EVENT_TABLE(wxDocParentFrame, wxFrame) EVT_CLOSE(wxDocParentFrame::OnCloseWindow) END_EVENT_TABLE() +wxDocParentFrame::wxDocParentFrame() +{ + m_docManager = NULL; +} + wxDocParentFrame::wxDocParentFrame(wxDocManager *manager, wxFrame *frame, wxWindowID id, @@ -1936,6 +1970,19 @@ wxDocParentFrame::wxDocParentFrame(wxDocManager *manager, m_docManager = manager; } +bool wxDocParentFrame::Create(wxDocManager *manager, + wxFrame *frame, + wxWindowID id, + const wxString& title, + const wxPoint& pos, + const wxSize& size, + long style, + const wxString& name) +{ + m_docManager = manager; + return base_type::Create(frame, id, title, pos, size, style, name); +} + void wxDocParentFrame::OnExit(wxCommandEvent& WXUNUSED(event)) { Close(); @@ -2068,50 +2115,28 @@ void wxDocPrintout::GetPageInfo(int *minPage, int *maxPage, int *selPageFrom, in // File history processor // ---------------------------------------------------------------------------- -static inline wxChar* MYcopystring(const wxString& s) -{ - wxChar* copy = new wxChar[s.length() + 1]; - return wxStrcpy(copy, s.c_str()); -} - -static inline wxChar* MYcopystring(const wxChar* s) -{ - wxChar* copy = new wxChar[wxStrlen(s) + 1]; - return wxStrcpy(copy, s); -} - wxFileHistory::wxFileHistory(size_t maxFiles, wxWindowID idBase) { m_fileMaxFiles = maxFiles; m_idBase = idBase; - m_fileHistoryN = 0; - m_fileHistory = new wxChar *[m_fileMaxFiles]; } wxFileHistory::~wxFileHistory() { - size_t i; - for (i = 0; i < m_fileHistoryN; i++) - delete[] m_fileHistory[i]; - delete[] m_fileHistory; } -// File history management void wxFileHistory::AddFileToHistory(const wxString& file) { + wxFileName fn(file); size_t i; // Check we don't already have this file - for (i = 0; i < m_fileHistoryN; i++) + for (i = 0; i < m_fileHistory.GetCount(); i++) { -#if defined( __WXMSW__ ) // Add any other OSes with case insensitive file names - wxString testString; - if ( m_fileHistory[i] ) - testString = m_fileHistory[i]; - if ( m_fileHistory[i] && ( file.Lower() == testString.Lower() ) ) -#else - if ( m_fileHistory[i] && ( file == m_fileHistory[i] ) ) -#endif + // we need to do a comparison using wxFileNames because it knows + // how to exactly compare files on the different platforms + // (e.g. handle case [in]sensitive filesystems) + if ( fn == wxFileName(m_fileHistory[i]) ) { // we do have it, move it to the top of the history RemoveFileFromHistory (i); @@ -2121,43 +2146,36 @@ void wxFileHistory::AddFileToHistory(const wxString& file) } // if we already have a full history, delete the one at the end - if ( m_fileMaxFiles == m_fileHistoryN ) + if ( m_fileMaxFiles == m_fileHistory.GetCount() ) { - RemoveFileFromHistory (m_fileHistoryN - 1); + RemoveFileFromHistory (m_fileHistory.GetCount() - 1); AddFileToHistory (file); return; } // Add to the project file history: // Move existing files (if any) down so we can insert file at beginning. - if (m_fileHistoryN < m_fileMaxFiles) + if (m_fileHistory.GetCount() < m_fileMaxFiles) { wxList::compatibility_iterator node = m_fileMenus.GetFirst(); while (node) { wxMenu* menu = (wxMenu*) node->GetData(); - if ( m_fileHistoryN == 0 && menu->GetMenuItemCount() ) + if ( m_fileHistory.IsEmpty() && menu->GetMenuItemCount() ) { menu->AppendSeparator(); } - menu->Append(m_idBase+m_fileHistoryN, _("[EMPTY]")); + menu->Append(m_idBase+m_fileHistory.GetCount(), _("[EMPTY]")); node = node->GetNext(); } - m_fileHistoryN ++; - } - // Shuffle filenames down - for (i = (m_fileHistoryN-1); i > 0; i--) - { - m_fileHistory[i] = m_fileHistory[i-1]; } - m_fileHistory[0] = MYcopystring(file); + + m_fileHistory.Insert(file, 0); // this is the directory of the last opened file wxString pathCurrent; wxSplitPath( m_fileHistory[0], &pathCurrent, NULL, NULL ); - for (i = 0; i < m_fileHistoryN; i++) - { - if ( m_fileHistory[i] ) + for (i = 0; i < m_fileHistory.GetCount(); i++) { // if in same directory just show the filename; otherwise the full // path @@ -2177,8 +2195,10 @@ void wxFileHistory::AddFileToHistory(const wxString& file) // we need to quote '&' characters which are used for mnemonics pathInMenu.Replace(_T("&"), _T("&&")); + wxString buf; buf.Printf(s_MRUEntryFormat, i + 1, pathInMenu.c_str()); + wxList::compatibility_iterator node = m_fileMenus.GetFirst(); while (node) { @@ -2187,22 +2207,15 @@ void wxFileHistory::AddFileToHistory(const wxString& file) node = node->GetNext(); } } - } } void wxFileHistory::RemoveFileFromHistory(size_t i) { - wxCHECK_RET( i < m_fileHistoryN, + wxCHECK_RET( i < m_fileHistory.GetCount(), wxT("invalid index in wxFileHistory::RemoveFileFromHistory") ); - // delete the element from the array (could use memmove() too...) - delete [] m_fileHistory[i]; - - size_t j; - for ( j = i; j < m_fileHistoryN - 1; j++ ) - { - m_fileHistory[j] = m_fileHistory[j + 1]; - } + // delete the element from the array + m_fileHistory.RemoveAt(i); wxList::compatibility_iterator node = m_fileMenus.GetFirst(); while ( node ) @@ -2211,23 +2224,23 @@ void wxFileHistory::RemoveFileFromHistory(size_t i) // shuffle filenames up wxString buf; - for ( j = i; j < m_fileHistoryN - 1; j++ ) + for ( size_t j = i; j < m_fileHistory.GetCount(); j++ ) { - buf.Printf(s_MRUEntryFormat, j + 1, m_fileHistory[j]); + buf.Printf(s_MRUEntryFormat, j + 1, m_fileHistory[j].c_str()); menu->SetLabel(m_idBase + j, buf); } node = node->GetNext(); // delete the last menu item which is unused now - wxWindowID lastItemId = m_idBase + wx_truncate_cast(wxWindowID, m_fileHistoryN) - 1; + wxWindowID lastItemId = m_idBase + wx_truncate_cast(wxWindowID, m_fileHistory.GetCount()); if (menu->FindItem(lastItemId)) { menu->Delete(lastItemId); } // delete the last separator too if no more files are left - if ( m_fileHistoryN == 1 ) + if ( m_fileHistory.GetCount() == 0 ) { wxMenuItemList::compatibility_iterator nodeLast = menu->GetMenuItems().GetLast(); if ( nodeLast ) @@ -2242,23 +2255,6 @@ void wxFileHistory::RemoveFileFromHistory(size_t i) //else: menu is empty somehow } } - - m_fileHistoryN--; -} - -wxString wxFileHistory::GetHistoryFile(size_t i) const -{ - wxString s; - if ( i < m_fileHistoryN ) - { - s = m_fileHistory[i]; - } - else - { - wxFAIL_MSG( wxT("bad index in wxFileHistory::GetHistoryFile") ); - } - - return s; } void wxFileHistory::UseMenu(wxMenu *menu) @@ -2275,17 +2271,21 @@ void wxFileHistory::RemoveMenu(wxMenu *menu) #if wxUSE_CONFIG void wxFileHistory::Load(wxConfigBase& config) { - m_fileHistoryN = 0; + m_fileHistory.Clear(); + wxString buf; - buf.Printf(wxT("file%d"), (int)m_fileHistoryN+1); + buf.Printf(wxT("file%d"), 1); + wxString historyFile; - while ((m_fileHistoryN < m_fileMaxFiles) && config.Read(buf, &historyFile) && (!historyFile.empty())) + while ((m_fileHistory.GetCount() < m_fileMaxFiles) && + config.Read(buf, &historyFile) && !historyFile.empty()) { - m_fileHistory[m_fileHistoryN] = MYcopystring((const wxChar*) historyFile); - m_fileHistoryN ++; - buf.Printf(wxT("file%d"), (int)m_fileHistoryN+1); + m_fileHistory.Add(historyFile); + + buf.Printf(wxT("file%d"), (int)m_fileHistory.GetCount()+1); historyFile = wxEmptyString; } + AddFilesToMenu(); } @@ -2296,7 +2296,7 @@ void wxFileHistory::Save(wxConfigBase& config) { wxString buf; buf.Printf(wxT("file%d"), (int)i+1); - if (i < m_fileHistoryN) + if (i < m_fileHistory.GetCount()) config.Write(buf, wxString(m_fileHistory[i])); else config.Write(buf, wxEmptyString); @@ -2306,7 +2306,7 @@ void wxFileHistory::Save(wxConfigBase& config) void wxFileHistory::AddFilesToMenu() { - if (m_fileHistoryN > 0) + if (m_fileHistory.GetCount() > 0) { wxList::compatibility_iterator node = m_fileMenus.GetFirst(); while (node) @@ -2318,15 +2318,12 @@ void wxFileHistory::AddFilesToMenu() } size_t i; - for (i = 0; i < m_fileHistoryN; i++) - { - if (m_fileHistory[i]) + for (i = 0; i < m_fileHistory.GetCount(); i++) { wxString buf; - buf.Printf(s_MRUEntryFormat, i+1, m_fileHistory[i]); + buf.Printf(s_MRUEntryFormat, i+1, m_fileHistory[i].c_str()); menu->Append(m_idBase+i, buf); } - } node = node->GetNext(); } } @@ -2334,7 +2331,7 @@ void wxFileHistory::AddFilesToMenu() void wxFileHistory::AddFilesToMenu(wxMenu* menu) { - if (m_fileHistoryN > 0) + if (m_fileHistory.GetCount() > 0) { if (menu->GetMenuItemCount()) { @@ -2342,16 +2339,13 @@ void wxFileHistory::AddFilesToMenu(wxMenu* menu) } size_t i; - for (i = 0; i < m_fileHistoryN; i++) - { - if (m_fileHistory[i]) + for (i = 0; i < m_fileHistory.GetCount(); i++) { wxString buf; - buf.Printf(s_MRUEntryFormat, i+1, m_fileHistory[i]); + buf.Printf(s_MRUEntryFormat, i+1, m_fileHistory[i].c_str()); menu->Append(m_idBase+i, buf); } } - } } // ----------------------------------------------------------------------------