]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/docview.cpp
another fix for wxUSE_DRAG_AND_DROP==0 build
[wxWidgets.git] / src / common / docview.cpp
index 4d2d3c49e89968f6e1971d0e9b09d000b6f5975c..459ce5585ccc8fe77119f9203ce74cdc7b51c20c 100644 (file)
@@ -56,6 +56,7 @@
 #include "wx/cmdproc.h"
 #include "wx/tokenzr.h"
 #include "wx/filename.h"
+#include "wx/stdpaths.h"
 #include "wx/vector.h"
 #include "wx/ptr_scpd.h"
 
@@ -112,7 +113,7 @@ wxWindow *wxFindSuitableParent()
 wxString FindExtension(const wxString& path)
 {
     wxString ext;
-    wxSplitPath(path, NULL, NULL, &ext);
+    wxFileName::SplitPath(path, NULL, NULL, &ext);
 
     // VZ: extensions are considered not case sensitive - is this really a good
     //     idea?
@@ -307,10 +308,14 @@ bool wxDocument::SaveAs()
     wxString filter = docTemplate->GetFileFilter() ;
 #endif
     wxString defaultDir = docTemplate->GetDirectory();
-    if (defaultDir.IsEmpty())
+    if ( defaultDir.empty() )
+    {
         defaultDir = wxPathOnly(GetFilename());
+        if ( defaultDir.empty() )
+            defaultDir = GetDocumentManager()->GetLastDirectory();
+    }
 
-    wxString tmp = wxFileSelector(_("Save As"),
+    wxString fileName = wxFileSelector(_("Save As"),
             defaultDir,
             wxFileNameFromPath(GetFilename()),
             docTemplate->GetDefaultExtension(),
@@ -318,12 +323,11 @@ bool wxDocument::SaveAs()
             wxFD_SAVE | wxFD_OVERWRITE_PROMPT,
             GetDocumentWindow());
 
-    if (tmp.empty())
+    if (fileName.empty())
         return false;
 
-    wxString fileName(tmp);
-    wxString path, name, ext;
-    wxSplitPath(fileName, & path, & name, & ext);
+    wxString ext;
+    wxFileName::SplitPath(fileName, NULL, NULL, &ext);
 
     if (ext.empty())
     {
@@ -331,22 +335,13 @@ bool wxDocument::SaveAs()
         fileName += docTemplate->GetDefaultExtension();
     }
 
-    SetFilename(fileName);
-    SetTitle(wxFileNameFromPath(fileName));
-
-    // Notify the views that the filename has changed
-    wxList::compatibility_iterator node = m_documentViews.GetFirst();
-    while (node)
-    {
-        wxView *view = (wxView *)node->GetData();
-        view->OnChangeFilename();
-        node = node->GetNext();
-    }
-
     // Files that were not saved correctly are not added to the FileHistory.
-    if (!OnSaveDocument(m_documentFile))
+    if (!OnSaveDocument(fileName))
         return false;
 
+    SetTitle(wxFileNameFromPath(fileName));
+    SetFilename(fileName, true);    // will call OnChangeFileName automatically
+
    // A file that doesn't use the default extension of its document template cannot be opened
    // via the FileHistory, so we do not add it.
    if (docTemplate->FileMatchesTemplate(fileName))
@@ -481,12 +476,12 @@ bool wxDocument::OnSaveModified()
                  (
                     wxString::Format
                     (
-                     _("Do you want to save changes to document %s?"),
+                     _("Do you want to save changes to %s?"),
                      GetUserReadableName()
                     ),
                     wxTheApp->GetAppDisplayName(),
-                    wxYES_NO | wxCANCEL | wxICON_QUESTION,
-                    GetDocumentWindow()
+                    wxYES_NO | wxCANCEL | wxICON_QUESTION | wxCENTRE,
+                    wxFindSuitableParent()
                  ) )
         {
             case wxNO:
@@ -566,6 +561,11 @@ void wxDocument::NotifyClosing()
 void wxDocument::SetFilename(const wxString& filename, bool notifyViews)
 {
     m_documentFile = filename;
+    OnChangeFilename(notifyViews);
+}
+
+void wxDocument::OnChangeFilename(bool notifyViews)
+{
     if ( notifyViews )
     {
         // Notify the views that the filename has changed
@@ -609,7 +609,7 @@ bool wxDocument::DoOpenDocument(const wxString& file)
     if ( !store )
 #else
     wxFileInputStream store(file);
-    if (store.GetLastError() != wxSTREAM_NO_ERROR)
+    if (store.GetLastError() != wxSTREAM_NO_ERROR || !store.IsOk())
 #endif
     {
         wxLogError(_("File \"%s\" could not be opened for reading."), file);
@@ -943,6 +943,19 @@ bool wxDocManager::Initialize()
     return true;
 }
 
+wxString wxDocManager::GetLastDirectory() const
+{
+    // use the system-dependent default location for the document files if
+    // we're being opened for the first time
+    if ( m_lastDirectory.empty() )
+    {
+        wxDocManager * const self = const_cast<wxDocManager *>(this);
+        self->m_lastDirectory = wxStandardPaths::Get().GetAppDocumentsDir();
+    }
+
+    return m_lastDirectory;
+}
+
 wxFileHistory *wxDocManager::OnCreateFileHistory()
 {
     return new wxFileHistory;
@@ -1075,7 +1088,9 @@ void wxDocManager::OnRedo(wxCommandEvent& event)
 
 void wxDocManager::OnUpdateFileOpen(wxUpdateUIEvent& event)
 {
-    event.Enable( true );
+    // CreateDocument() (which is called from OnFileOpen) may succeed
+    // only when there is at least a template:
+    event.Enable( GetTemplates().GetCount()>0 );
 }
 
 void wxDocManager::OnUpdateDisableIfNoDoc(wxUpdateUIEvent& event)
@@ -1085,7 +1100,9 @@ void wxDocManager::OnUpdateDisableIfNoDoc(wxUpdateUIEvent& event)
 
 void wxDocManager::OnUpdateFileNew(wxUpdateUIEvent& event)
 {
-    event.Enable( true );
+    // CreateDocument() (which is called from OnFileNew) may succeed
+    // only when there is at least a template:
+    event.Enable( GetTemplates().GetCount()>0 );
 }
 
 void wxDocManager::OnUpdateFileSave(wxUpdateUIEvent& event)
@@ -1491,7 +1508,7 @@ wxDocTemplate *wxDocManager::SelectDocumentPath(wxDocTemplate **templates,
     wxWindow* parent = wxFindSuitableParent();
 
     wxString pathTmp = wxFileSelectorEx(_("Open File"),
-                                        m_lastDirectory,
+                                        GetLastDirectory(),
                                         wxEmptyString,
                                         &FilterIndex,
                                         descrBuf,
@@ -1509,13 +1526,14 @@ wxDocTemplate *wxDocManager::SelectDocumentPath(wxDocTemplate **templates,
             else
                 msgTitle = wxString(_("File error"));
 
-            (void)wxMessageBox(_("Sorry, could not open this file."), msgTitle, wxOK | wxICON_EXCLAMATION,
+            (void)wxMessageBox(_("Sorry, could not open this file."), msgTitle, wxOK | wxICON_EXCLAMATION | wxCENTRE,
                 parent);
 
             path = wxEmptyString;
             return NULL;
         }
-        m_lastDirectory = wxPathOnly(pathTmp);
+
+        SetLastDirectory(wxPathOnly(pathTmp));
 
         path = pathTmp;
 
@@ -1531,7 +1549,7 @@ wxDocTemplate *wxDocManager::SelectDocumentPath(wxDocTemplate **templates,
             // can only happen if the application changes the allowed templates in runtime.
             (void)wxMessageBox(_("Sorry, the format for this file is unknown."),
                                 _("Open File"),
-                                wxOK | wxICON_EXCLAMATION, wxFindSuitableParent());
+                                wxOK | wxICON_EXCLAMATION | wxCENTRE, wxFindSuitableParent());
         }
     }
     else