]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/docview.cpp
basic support for encodings for wxMSW::wxFont
[wxWidgets.git] / src / common / docview.cpp
index a6687e39a6eb591034f0fc768267e769e82c4712..0f169724392468f9070c80abe4ad020aef9db955 100644 (file)
@@ -42,6 +42,7 @@
     #include "wx/intl.h"
 #endif
 
+
 #ifdef __WXGTK__
     #include "wx/mdi.h"
 #endif
@@ -55,6 +56,7 @@
 #include "wx/choicdlg.h"
 #include "wx/docview.h"
 #include "wx/confbase.h"
+#include "wx/file.h"
 
 #include <stdio.h>
 #include <string.h>
 
 static inline wxString FindExtension(const wxChar *path);
 
+// ----------------------------------------------------------------------------
+// local constants
+// ----------------------------------------------------------------------------
+
+static const char *s_MRUEntryFormat = _T("&%d %s");
+
 // ============================================================================
 // implementation
 // ============================================================================
@@ -281,10 +289,10 @@ bool wxDocument::OnSaveDocument(const wxString& file)
         msgTitle = wxString(_("File error"));
 
 #if wxUSE_STD_IOSTREAM
-    ofstream store(file.fn_str());
+    ofstream store(wxString(file.fn_str()));
     if (store.fail() || store.bad())
 #else
-    wxFileOutputStream store(file.fn_str());
+    wxFileOutputStream store(wxString(file.fn_str()));
     if (store.LastError() != 0)
 #endif
     {
@@ -293,7 +301,7 @@ bool wxDocument::OnSaveDocument(const wxString& file)
         // Saving error
         return FALSE;
     }
-    if (SaveObject(store)==FALSE)
+    if (!SaveObject(store))
     {
         (void)wxMessageBox(_("Sorry, could not save this file."), msgTitle, wxOK | wxICON_EXCLAMATION,
                            GetDocumentWindow());
@@ -317,10 +325,10 @@ bool wxDocument::OnOpenDocument(const wxString& file)
         msgTitle = wxString(_("File error"));
 
 #if wxUSE_STD_IOSTREAM
-    ifstream store(file.fn_str());
+    ifstream store(wxString(file.fn_str()));
     if (store.fail() || store.bad())
 #else
-    wxFileInputStream store(file.fn_str());
+    wxFileInputStream store(wxString(file.fn_str()));
     if (store.LastError() != 0)
 #endif
     {
@@ -328,7 +336,7 @@ bool wxDocument::OnOpenDocument(const wxString& file)
                            GetDocumentWindow());
         return FALSE;
     }
-    if (LoadObject(store)==FALSE)
+    if (!LoadObject(store))
     {
         (void)wxMessageBox(_("Sorry, could not open this file."), msgTitle, wxOK|wxICON_EXCLAMATION,
                            GetDocumentWindow());
@@ -345,25 +353,21 @@ bool wxDocument::OnOpenDocument(const wxString& file)
 
 #if wxUSE_STD_IOSTREAM
 istream& wxDocument::LoadObject(istream& stream)
+#else
+wxInputStream& wxDocument::LoadObject(wxInputStream& stream)
+#endif
 {
     return stream;
 }
 
+#if wxUSE_STD_IOSTREAM
 ostream& wxDocument::SaveObject(ostream& stream)
-{
-    return stream;
-}
 #else
-bool wxDocument::LoadObject(wxInputStream& stream)
-{
-    return TRUE;
-}
-
-bool wxDocument::SaveObject(wxOutputStream& stream)
+wxOutputStream& wxDocument::SaveObject(wxOutputStream& stream)
+#endif
 {
-    return TRUE;
+    return stream;
 }
-#endif
 
 bool wxDocument::Revert()
 {
@@ -834,7 +838,7 @@ void wxDocManager::OnPrintSetup(wxCommandEvent& WXUNUSED(event))
 
     wxPrintDialogData data;
 
-    wxPrintDialog printerDialog(parentWin, & data);
+    wxPrintDialog printerDialog(parentWin, &data);
     printerDialog.GetPrintDialogData().SetSetupDialog(TRUE);
     printerDialog.ShowModal();
 #endif // wxUSE_PRINTING_ARCHITECTURE
@@ -1098,6 +1102,12 @@ void wxDocManager::AddFileToHistory(const wxString& file)
         m_fileHistory->AddFileToHistory(file);
 }
 
+void wxDocManager::RemoveFileFromHistory(int i)
+{
+    if (m_fileHistory)
+        m_fileHistory->RemoveFileFromHistory(i);
+}
+
 wxString wxDocManager::GetHistoryFile(int i) const
 {
     wxString histFile;
@@ -1297,7 +1307,7 @@ wxDocTemplate *wxDocManager::SelectDocumentType(wxDocTemplate **templates,
     }
 
     wxDocTemplate *theTemplate = (wxDocTemplate *)wxGetSingleChoiceData(_("Select a document template"), _("Templates"), n,
-            strings, data);
+            strings, (char **)data);
     delete[] strings;
     delete[] data;
     return theTemplate;
@@ -1320,7 +1330,7 @@ wxDocTemplate *wxDocManager::SelectViewType(wxDocTemplate **templates,
         }
     }
     wxDocTemplate *theTemplate = (wxDocTemplate *)wxGetSingleChoiceData(_("Select a document view"), _("Views"), n,
-            strings, data);
+            strings, (char **)data);
     delete[] strings;
     delete[] data;
     return theTemplate;
@@ -1485,9 +1495,27 @@ void wxDocParentFrame::OnExit(wxCommandEvent& WXUNUSED(event))
 
 void wxDocParentFrame::OnMRUFile(wxCommandEvent& event)
 {
-    wxString f(m_docManager->GetHistoryFile(event.GetSelection() - wxID_FILE1));
-    if (f != _T(""))
-        (void)m_docManager->CreateDocument(f, wxDOC_SILENT);
+    int n = event.GetSelection() - wxID_FILE1;  // the index in MRU list
+    wxString filename(m_docManager->GetHistoryFile(n));
+    if ( !filename.IsEmpty() )
+    {
+        // verify that the file exists before doing anything else
+        if ( wxFile::Exists(filename) )
+        {
+            // try to open it
+            (void)m_docManager->CreateDocument(filename, wxDOC_SILENT);
+        }
+        else
+        {
+            // remove the bogus filename from the MRU list and notify the user
+            // about it
+            m_docManager->RemoveFileFromHistory(n);
+
+            wxLogError(_("The file '%s' doesn't exist and couldn't be opened.\n"
+                         "It has been also removed from the MRU files list."),
+                       filename.c_str());
+        }
+    }
 }
 
 // Extend event processing to search the view's event table
@@ -1858,7 +1886,7 @@ void wxFileHistory::AddFileToHistory(const wxString& file)
         if (m_fileHistory[i])
         {
             wxString buf;
-            buf.Printf(_T("&%d %s"), i+1, m_fileHistory[i]);
+            buf.Printf(s_MRUEntryFormat, i+1, m_fileHistory[i]);
             wxNode* node = m_fileMenus.First();
             while (node)
             {
@@ -1869,6 +1897,49 @@ void wxFileHistory::AddFileToHistory(const wxString& file)
         }
 }
 
+void wxFileHistory::RemoveFileFromHistory(int i)
+{
+    wxCHECK_RET( i < m_fileHistoryN,
+                 _T("invalid index in wxFileHistory::RemoveFileFromHistory") );
+
+    wxNode* node = m_fileMenus.First();
+    while ( node )
+    {
+        wxMenu* menu = (wxMenu*) node->Data();
+
+        // wxMenu::Delete() is missing from wxGTK, so this can't be done :-(
+#if 0
+        // delete the menu items
+        menu->Delete(wxID_FILE1 + i);
+#endif
+
+        // delete the element from the array (could use memmove() too...)
+        delete [] m_fileHistory[i];
+
+        int j;
+        for ( j = i; j < m_fileHistoryN - 1; j++ )
+        {
+            m_fileHistory[j] = m_fileHistory[j + 1];
+        }
+
+        // shuffle filenames up
+        wxString buf;
+        for ( j = i; j < m_fileHistoryN - 1; j++ )
+        {
+            buf.Printf(s_MRUEntryFormat, j + 1, m_fileHistory[j]);
+            menu->SetLabel(wxID_FILE1 + j, buf);
+        }
+
+        // to be removed as soon as wxMenu::Delete() is implemented
+#if 1
+        menu->SetLabel(wxID_FILE1 + m_fileHistoryN - 1, _T(""));
+#endif
+
+        node = node->Next();
+    }
+    m_fileHistoryN--;
+}
+
 wxString wxFileHistory::GetHistoryFile(int i) const
 {
     if (i < m_fileHistoryN)
@@ -1932,7 +2003,7 @@ void wxFileHistory::AddFilesToMenu()
                 if (m_fileHistory[i])
                 {
                     wxString buf;
-                    buf.Printf(_T("&%d %s"), i+1, m_fileHistory[i]);
+                    buf.Printf(s_MRUEntryFormat, i+1, m_fileHistory[i]);
                     menu->Append(wxID_FILE1+i, buf);
                 }
             }
@@ -1952,7 +2023,7 @@ void wxFileHistory::AddFilesToMenu(wxMenu* menu)
             if (m_fileHistory[i])
             {
                 wxString buf;
-                buf.Printf(_T("&%d %s"), i+1, m_fileHistory[i]);
+                buf.Printf(s_MRUEntryFormat, i+1, m_fileHistory[i]);
                 menu->Append(wxID_FILE1+i, buf);
             }
         }