]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/docview.cpp
Added size event for status bar
[wxWidgets.git] / src / common / docview.cpp
index e22c78dd1421d27ef19b9fc53c6299415d674080..ae846c0c8fdac6793336c59e6a17bce2a063c2f2 100644 (file)
 #include "wx/defs.h"
 #endif
 
 #include "wx/defs.h"
 #endif
 
-#if USE_DOC_VIEW_ARCHITECTURE
+#if wxUSE_DOC_VIEW_ARCHITECTURE
 
 #ifndef WX_PRECOMP
 
 #ifndef WX_PRECOMP
+#include "wx/string.h"
 #include "wx/utils.h"
 #include "wx/app.h"
 #include "wx/dc.h"
 #include "wx/utils.h"
 #include "wx/app.h"
 #include "wx/dc.h"
 #include "wx/menu.h"
 #include "wx/list.h"
 #include "wx/filedlg.h"
 #include "wx/menu.h"
 #include "wx/list.h"
 #include "wx/filedlg.h"
+#include <wx/intl.h>
+#endif
+
+#ifdef __WXGTK__
+#include "wx/mdi.h"
 #endif
 
 #include "wx/msgdlg.h"
 #include "wx/choicdlg.h"
 #include "wx/docview.h"
 #include "wx/printdlg.h"
 #endif
 
 #include "wx/msgdlg.h"
 #include "wx/choicdlg.h"
 #include "wx/docview.h"
 #include "wx/printdlg.h"
-#include "wx/generic/prntdlgg.h"
-#include "wx/generic/printps.h"
-
-/*
-#ifdef __WINDOWS__
-#include "wx/mdi.h"
-#endif
-*/
+#include "wx/confbase.h"
 
 #include <stdio.h>
 #include <string.h>
 
 
 #include <stdio.h>
 #include <string.h>
 
-#if USE_IOSTREAMH
+#if wxUSE_IOSTREAMH
 #include <iostream.h>
 #include <iostream.h>
+#include <fstream.h>
 #else
 #include <iostream>
 #else
 #include <iostream>
+#include <fstream>
+#  ifdef _MSC_VER
+      using namespace std;
+#  endif
 #endif
 
 #endif
 
-#include "fstream.h"
-
 #if !USE_SHARED_LIBRARY
 IMPLEMENT_ABSTRACT_CLASS(wxDocument, wxEvtHandler)
 IMPLEMENT_ABSTRACT_CLASS(wxView, wxEvtHandler)
 #if !USE_SHARED_LIBRARY
 IMPLEMENT_ABSTRACT_CLASS(wxDocument, wxEvtHandler)
 IMPLEMENT_ABSTRACT_CLASS(wxView, wxEvtHandler)
@@ -67,7 +69,7 @@ IMPLEMENT_ABSTRACT_CLASS(wxDocTemplate, wxObject)
 IMPLEMENT_DYNAMIC_CLASS(wxDocManager, wxEvtHandler)
 IMPLEMENT_CLASS(wxDocChildFrame, wxFrame)
 IMPLEMENT_CLASS(wxDocParentFrame, wxFrame)
 IMPLEMENT_DYNAMIC_CLASS(wxDocManager, wxEvtHandler)
 IMPLEMENT_CLASS(wxDocChildFrame, wxFrame)
 IMPLEMENT_CLASS(wxDocParentFrame, wxFrame)
-#if USE_PRINTING_ARCHITECTURE
+#if wxUSE_PRINTING_ARCHITECTURE
 IMPLEMENT_DYNAMIC_CLASS(wxDocPrintout, wxPrintout)
 #endif
 IMPLEMENT_CLASS(wxCommand, wxObject)
 IMPLEMENT_DYNAMIC_CLASS(wxDocPrintout, wxPrintout)
 #endif
 IMPLEMENT_CLASS(wxCommand, wxObject)
@@ -86,7 +88,7 @@ wxDocument::wxDocument(wxDocument *parent)
   m_documentFile="";
   m_documentTitle="";
   m_documentParent=parent;
   m_documentFile="";
   m_documentTitle="";
   m_documentParent=parent;
-  m_documentTemplate = NULL;
+  m_documentTemplate = (wxDocTemplate *) NULL;
   m_documentTypeName = "";
   m_savedYet = FALSE;
 }
   m_documentTypeName = "";
   m_savedYet = FALSE;
 }
@@ -149,7 +151,7 @@ bool wxDocument::DeleteAllViews(void)
 wxView *wxDocument::GetFirstView(void) const
 {
   if (m_documentViews.Number() == 0)
 wxView *wxDocument::GetFirstView(void) const
 {
   if (m_documentViews.Number() == 0)
-    return NULL;
+    return (wxView *) NULL;
   return (wxView *)m_documentViews.First()->Data();
 }
 
   return (wxView *)m_documentViews.First()->Data();
 }
 
@@ -192,22 +194,37 @@ bool wxDocument::Save(void)
        
 bool wxDocument::SaveAs(void)
 {
        
 bool wxDocument::SaveAs(void)
 {
-  wxDocTemplate *docTemplate = GetDocumentTemplate();
-  if (!docTemplate)
-    return FALSE;
-  
-  char *tmp = wxFileSelector("Save as", docTemplate->GetDirectory(), GetFilename(),
-    docTemplate->GetDefaultExtension(), docTemplate->GetFileFilter(),
-    0, GetDocumentWindow());
+    wxDocTemplate *docTemplate = GetDocumentTemplate();
+    if (!docTemplate)
+        return FALSE;
     
     
-  if (!tmp)
-    return FALSE;
-  else
-  {
-    SetFilename(tmp);
-    SetTitle(wxFileNameFromPath(tmp));
+    wxString tmp = wxFileSelector(_("Save as"),
+                                  docTemplate->GetDirectory(),
+                                  GetFilename(),
+                                  docTemplate->GetDefaultExtension(),
+                                  docTemplate->GetFileFilter(),
+                                  wxSAVE | wxOVERWRITE_PROMPT,
+                                  GetDocumentWindow());
+    
+    if (tmp.IsEmpty())
+        return FALSE;
+
+    wxString fileName(tmp);
+    wxString path("");
+    wxString name("");
+    wxString ext("");
+    wxSplitPath(fileName, & path, & name, & ext);
+
+    if (ext.IsEmpty() || ext == "")
+    {
+        fileName += ".";
+        fileName += docTemplate->GetDefaultExtension();
+    }
+
+    SetFilename(fileName);
+    SetTitle(wxFileNameFromPath(fileName));
     
     
-    GetDocumentManager()->AddFileToHistory(tmp);
+    GetDocumentManager()->AddFileToHistory(fileName);
 
     // Notify the views that the filename has changed
     wxNode *node = m_documentViews.First();
 
     // Notify the views that the filename has changed
     wxNode *node = m_documentViews.First();
@@ -217,8 +234,8 @@ bool wxDocument::SaveAs(void)
       view->OnChangeFilename();
       node = node->Next();
     }
       view->OnChangeFilename();
       node = node->Next();
     }
-  }
-  return OnSaveDocument(m_documentFile);
+
+    return OnSaveDocument(m_documentFile);
 }
        
 bool wxDocument::OnSaveDocument(const wxString& file)
 }
        
 bool wxDocument::OnSaveDocument(const wxString& file)
@@ -230,19 +247,19 @@ bool wxDocument::OnSaveDocument(const wxString& file)
   if (wxTheApp->GetAppName() != "")
     msgTitle = wxTheApp->GetAppName();
   else
   if (wxTheApp->GetAppName() != "")
     msgTitle = wxTheApp->GetAppName();
   else
-    msgTitle = wxString("File error");
+    msgTitle = wxString(_("File error"));
 
   ofstream store(file);
   if (store.fail() || store.bad())
   {
 
   ofstream store(file);
   if (store.fail() || store.bad())
   {
-    (void)wxMessageBox("Sorry, could not open this file for saving.", msgTitle, wxOK | wxICON_EXCLAMATION,
+    (void)wxMessageBox(_("Sorry, could not open this file for saving."), msgTitle, wxOK | wxICON_EXCLAMATION,
       GetDocumentWindow());
     // Saving error
     return FALSE;
   }
   if (SaveObject(store)==FALSE)
   {
       GetDocumentWindow());
     // Saving error
     return FALSE;
   }
   if (SaveObject(store)==FALSE)
   {
-    (void)wxMessageBox("Sorry, could not save this file.", msgTitle, wxOK | wxICON_EXCLAMATION,
+    (void)wxMessageBox(_("Sorry, could not save this file."), msgTitle, wxOK | wxICON_EXCLAMATION,
       GetDocumentWindow());
     // Saving error
     return FALSE;
       GetDocumentWindow());
     // Saving error
     return FALSE;
@@ -261,23 +278,24 @@ bool wxDocument::OnOpenDocument(const wxString& file)
   if (wxTheApp->GetAppName() != "")
     msgTitle = wxTheApp->GetAppName();
   else
   if (wxTheApp->GetAppName() != "")
     msgTitle = wxTheApp->GetAppName();
   else
-    msgTitle = wxString("File error");
+    msgTitle = wxString(_("File error"));
 
   ifstream store(file);
   if (store.fail() || store.bad())
   {
 
   ifstream store(file);
   if (store.fail() || store.bad())
   {
-    (void)wxMessageBox("Sorry, could not open this file.", msgTitle, wxOK|wxICON_EXCLAMATION,
+    (void)wxMessageBox(_("Sorry, could not open this file."), msgTitle, wxOK|wxICON_EXCLAMATION,
      GetDocumentWindow());
     return FALSE;
   }
   if (LoadObject(store)==FALSE)
   {
      GetDocumentWindow());
     return FALSE;
   }
   if (LoadObject(store)==FALSE)
   {
-    (void)wxMessageBox("Sorry, could not open this file.", msgTitle, wxOK|wxICON_EXCLAMATION,
+    (void)wxMessageBox(_("Sorry, could not open this file."), msgTitle, wxOK|wxICON_EXCLAMATION,
       GetDocumentWindow());
     return FALSE;
   }
   SetFilename(file, TRUE);
   Modify(FALSE);
       GetDocumentWindow());
     return FALSE;
   }
   SetFilename(file, TRUE);
   Modify(FALSE);
+  m_savedYet = TRUE;
 
   UpdateAllViews();
   
 
   UpdateAllViews();
   
@@ -319,7 +337,7 @@ bool wxDocument::GetPrintableName(wxString& buf) const
   }
   else
   {
   }
   else
   {
-    buf = "unnamed";
+    buf = _("unnamed");
     return TRUE;
   }
 }
     return TRUE;
   }
 }
@@ -343,7 +361,6 @@ bool wxDocument::OnSaveModified(void)
 {
   if (IsModified())
   {
 {
   if (IsModified())
   {
-    char buf[400];
     wxString title;
     GetPrintableName(title);
 
     wxString title;
     GetPrintableName(title);
 
@@ -351,11 +368,14 @@ bool wxDocument::OnSaveModified(void)
     if (wxTheApp->GetAppName() != "")
       msgTitle = wxTheApp->GetAppName();
     else
     if (wxTheApp->GetAppName() != "")
       msgTitle = wxTheApp->GetAppName();
     else
-      msgTitle = wxString("Warning");
-
-    sprintf(buf, "Do you want to save changes to document %s?", (const char *)title);
-    int res = wxMessageBox(buf, msgTitle, wxYES_NO|wxCANCEL|wxICON_QUESTION,
-      GetDocumentWindow());
+      msgTitle = wxString(_("Warning"));
+
+    wxString prompt;
+    prompt.Printf(_("Do you want to save changes to document %s?"),
+                  (const char *)title);
+    int res = wxMessageBox(prompt, msgTitle,
+                           wxYES_NO|wxCANCEL|wxICON_QUESTION,
+                           GetDocumentWindow());
     if (res == wxNO)
     {
       Modify(FALSE);
     if (res == wxNO)
     {
       Modify(FALSE);
@@ -450,7 +470,7 @@ wxView::wxView(wxDocument *doc)
   SetDocument(doc);
   
   m_viewTypeName = "";
   SetDocument(doc);
   
   m_viewTypeName = "";
-  m_viewFrame = NULL;
+  m_viewFrame = (wxFrame *) NULL;
 }
 
 wxView::~wxView(void)
 }
 
 wxView::~wxView(void)
@@ -488,28 +508,7 @@ void wxView::OnChangeFilename(void)
     wxString name;
     GetDocument()->GetPrintableName(name);
 
     wxString name;
     GetDocument()->GetPrintableName(name);
 
-    // If the frame is an MDI child, just set the title
-    // to the name.
-    // Otherwise, append the document name to the name of the application
-#ifdef __WINDOWS__
-    if (GetFrame()->IsKindOf(CLASSINFO(wxMDIChildFrame)))
-#else
-    if (FALSE)
-#endif
-    {
-      GetFrame()->SetTitle(name);
-    }
-    else
-    {
-      if (wxTheApp->GetAppName() != "")
-      {
-        char buf[400];
-        sprintf(buf, "%s - %s", (const char *)wxTheApp->GetAppName(), (const char *)name);
-        GetFrame()->SetTitle(buf);
-      }
-      else
-        GetFrame()->SetTitle(name);
-    }
+    GetFrame()->SetTitle(name);
   }
 }
 
   }
 }
 
@@ -542,7 +541,7 @@ bool wxView::OnClose(bool WXUNUSED(deleteWindow))
   return GetDocument() ? GetDocument()->Close() : TRUE;
 }
 
   return GetDocument() ? GetDocument()->Close() : TRUE;
 }
 
-#if USE_PRINTING_ARCHITECTURE
+#if wxUSE_PRINTING_ARCHITECTURE
 wxPrintout *wxView::OnCreatePrintout(void)
 {
   return new wxDocPrintout(this);
 wxPrintout *wxView::OnCreatePrintout(void)
 {
   return new wxDocPrintout(this);
@@ -584,7 +583,7 @@ wxDocTemplate::~wxDocTemplate(void)
 wxDocument *wxDocTemplate::CreateDocument(const wxString& path, long flags)
 {
   if (!m_docClassInfo)
 wxDocument *wxDocTemplate::CreateDocument(const wxString& path, long flags)
 {
   if (!m_docClassInfo)
-    return NULL;
+    return (wxDocument *) NULL;
   wxDocument *doc = (wxDocument *)m_docClassInfo->CreateObject();
   doc->SetFilename(path);
   doc->SetDocumentTemplate(this);
   wxDocument *doc = (wxDocument *)m_docClassInfo->CreateObject();
   doc->SetFilename(path);
   doc->SetDocumentTemplate(this);
@@ -596,14 +595,14 @@ wxDocument *wxDocTemplate::CreateDocument(const wxString& path, long flags)
   else
   {
     delete doc;
   else
   {
     delete doc;
-    return NULL;
+    return (wxDocument *) NULL;
   }
 }
 
 wxView *wxDocTemplate::CreateView(wxDocument *doc, long flags)
 {
   if (!m_viewClassInfo)
   }
 }
 
 wxView *wxDocTemplate::CreateView(wxDocument *doc, long flags)
 {
   if (!m_viewClassInfo)
-    return NULL;
+    return (wxView *) NULL;
   wxView *view = (wxView *)m_viewClassInfo->CreateObject();
   view->SetDocument(doc);
   if (view->OnCreate(doc, flags))
   wxView *view = (wxView *)m_viewClassInfo->CreateObject();
   view->SetDocument(doc);
   if (view->OnCreate(doc, flags))
@@ -613,7 +612,7 @@ wxView *wxDocTemplate::CreateView(wxDocument *doc, long flags)
   else
   {
     delete view;
   else
   {
     delete view;
-    return NULL;
+    return (wxView *) NULL;
   }
 }
 
   }
 }
 
@@ -635,9 +634,9 @@ wxDocManager::wxDocManager(long flags, bool initialize)
 {
   m_defaultDocumentNameCounter = 1;
   m_flags = flags;
 {
   m_defaultDocumentNameCounter = 1;
   m_flags = flags;
-  m_currentView = NULL;
+  m_currentView = (wxView *) NULL;
   m_maxDocsOpen = 10000;
   m_maxDocsOpen = 10000;
-  m_fileHistory = NULL;
+  m_fileHistory = (wxFileHistory *) NULL;
   if (initialize)
     Initialize();
 }
   if (initialize)
     Initialize();
 }
@@ -751,20 +750,8 @@ void wxDocManager::OnPrint(wxCommandEvent& WXUNUSED(event))
   wxPrintout *printout = view->OnCreatePrintout();
   if (printout)
   {
   wxPrintout *printout = view->OnCreatePrintout();
   if (printout)
   {
-    // TODO: trouble about this is that it pulls in the postscript
-    // code unecessarily
-#ifdef __WINDOWS__
-    if ( wxTheApp->GetPrintMode() == wxPRINT_WINDOWS )
-    {
-      wxWindowsPrinter printer;
-      printer.Print(view->GetFrame(), printout, TRUE);
-    }
-    else
-#endif
-    {
-      wxPostScriptPrinter printer;
-      printer.Print(view->GetFrame(), printout, TRUE);
-    }
+    wxPrinter printer;
+    printer.Print(view->GetFrame(), printout, TRUE);
 
     delete printout;
   }
 
     delete printout;
   }
@@ -779,20 +766,9 @@ void wxDocManager::OnPrintSetup(wxCommandEvent& WXUNUSED(event))
 
   wxPrintData data;
 
 
   wxPrintData data;
 
-#ifdef __WINDOWS__
-  if ( wxTheApp->GetPrintMode() == wxPRINT_WINDOWS )
-  {
-    wxPrintDialog printerDialog(parentWin, & data);
-    printerDialog.GetPrintData().SetSetupDialog(TRUE);
-    printerDialog.ShowModal();
-  }
-  else
-#endif
-  {
-    wxGenericPrintDialog printerDialog(parentWin, & data);
-    printerDialog.GetPrintData().SetSetupDialog(TRUE);
-    printerDialog.ShowModal();
-  }
+  wxPrintDialog printerDialog(parentWin, & data);
+  printerDialog.GetPrintData().SetSetupDialog(TRUE);
+  printerDialog.ShowModal();
 }
 
 void wxDocManager::OnPreview(wxCommandEvent& WXUNUSED(event))
 }
 
 void wxDocManager::OnPreview(wxCommandEvent& WXUNUSED(event))
@@ -805,15 +781,10 @@ void wxDocManager::OnPreview(wxCommandEvent& WXUNUSED(event))
   if (printout)
   {
     // Pass two printout objects: for preview, and possible printing.
   if (printout)
   {
     // Pass two printout objects: for preview, and possible printing.
-    wxPrintPreviewBase *preview = NULL;
-#ifdef __WINDOWS__
-    if ( wxTheApp->GetPrintMode() == wxPRINT_WINDOWS )
-        preview = new wxWindowsPrintPreview(printout, view->OnCreatePrintout());
-    else
-#endif
-        preview = new wxPostScriptPrintPreview(printout, view->OnCreatePrintout());
+    wxPrintPreviewBase *preview = (wxPrintPreviewBase *) NULL;
+    preview = new wxPrintPreview(printout, view->OnCreatePrintout());
 
 
-    wxPreviewFrame *frame = new wxPreviewFrame(preview, (wxFrame *)wxTheApp->GetTopWindow(), "Print Preview",
+    wxPreviewFrame *frame = new wxPreviewFrame(preview, (wxFrame *)wxTheApp->GetTopWindow(), _("Print Preview"),
                wxPoint(100, 100), wxSize(600, 650));
     frame->Centre(wxBOTH);
     frame->Initialize();
                wxPoint(100, 100), wxSize(600, 650));
     frame->Centre(wxBOTH);
     frame->Initialize();
@@ -839,6 +810,30 @@ void wxDocManager::OnRedo(wxCommandEvent& WXUNUSED(event))
     doc->GetCommandProcessor()->Redo();
 }
 
     doc->GetCommandProcessor()->Redo();
 }
 
+wxView *wxDocManager::GetCurrentView(void) const
+{
+    if (m_currentView)
+        return m_currentView;
+    if (m_docs.Number() == 1)
+    {
+        wxDocument* doc = (wxDocument*) m_docs.First()->Data();
+        return doc->GetFirstView();
+    }
+    return (wxView *) NULL;
+}
+
+// Extend event processing to search the view's event table
+bool wxDocManager::ProcessEvent(wxEvent& event)
+{
+    wxView* view = GetCurrentView();
+    if (view)
+    {
+        if (view->ProcessEvent(event))
+            return TRUE;
+    }
+    return wxEvtHandler::ProcessEvent(event);
+}
+
 wxDocument *wxDocManager::CreateDocument(const wxString& path, long flags)
 {
   wxDocTemplate **templates = new wxDocTemplate *[m_templates.Number()];
 wxDocument *wxDocManager::CreateDocument(const wxString& path, long flags)
 {
   wxDocTemplate **templates = new wxDocTemplate *[m_templates.Number()];
@@ -856,7 +851,7 @@ wxDocument *wxDocManager::CreateDocument(const wxString& path, long flags)
   if (n == 0)
   {
     delete[] templates;
   if (n == 0)
   {
     delete[] templates;
-    return NULL;
+    return (wxDocument *) NULL;
   }
 
   // If we've reached the max number of docs, close the
   }
 
   // If we've reached the max number of docs, close the
@@ -875,7 +870,7 @@ wxDocument *wxDocManager::CreateDocument(const wxString& path, long flags)
         delete doc;
     }
     else
         delete doc;
     }
     else
-      return NULL;
+      return (wxDocument *) NULL;
   }
   
   // New document: user chooses a template, unless there's only one.
   }
   
   // New document: user chooses a template, unless there's only one.
@@ -909,11 +904,11 @@ wxDocument *wxDocManager::CreateDocument(const wxString& path, long flags)
       return newDoc;
     }
     else
       return newDoc;
     }
     else
-      return NULL;
+      return (wxDocument *) NULL;
   }
 
   // Existing document
   }
 
   // Existing document
-  wxDocTemplate *temp = NULL;
+  wxDocTemplate *temp = (wxDocTemplate *) NULL;
 
   wxString path2("");
   if (path != "")
 
   wxString path2("");
   if (path != "")
@@ -936,14 +931,14 @@ wxDocument *wxDocManager::CreateDocument(const wxString& path, long flags)
       if (!newDoc->OnOpenDocument(path2))
       {
         delete newDoc;
       if (!newDoc->OnOpenDocument(path2))
       {
         delete newDoc;
-        return NULL;
+        return (wxDocument *) NULL;
       }
       AddFileToHistory(path2);
     }
     return newDoc;
   }
   else
       }
       AddFileToHistory(path2);
     }
     return newDoc;
   }
   else
-    return NULL;
+    return (wxDocument *) NULL;
 }
 
 wxView *wxDocManager::CreateView(wxDocument *doc, long flags)
 }
 
 wxView *wxDocManager::CreateView(wxDocument *doc, long flags)
@@ -966,7 +961,7 @@ wxView *wxDocManager::CreateView(wxDocument *doc, long flags)
   if (n == 0)
   {
     delete[] templates;
   if (n == 0)
   {
     delete[] templates;
-    return NULL;
+    return (wxView *) NULL;
   }
   if (n == 1)
   {
   }
   if (n == 1)
   {
@@ -988,7 +983,7 @@ wxView *wxDocManager::CreateView(wxDocument *doc, long flags)
     return view;
   }
   else
     return view;
   }
   else
-    return NULL;
+    return (wxView *) NULL;
 }
 
 // Not yet implemented
 }
 
 // Not yet implemented
@@ -1007,23 +1002,22 @@ wxDocument *wxDocManager::GetCurrentDocument(void) const
   if (m_currentView)
     return m_currentView->GetDocument();
   else
   if (m_currentView)
     return m_currentView->GetDocument();
   else
-    return NULL;
+    return (wxDocument *) NULL;
 }
 
 // Make a default document name
 bool wxDocManager::MakeDefaultName(wxString& name)
 {
 }
 
 // Make a default document name
 bool wxDocManager::MakeDefaultName(wxString& name)
 {
-  char buf[256];
-  sprintf(buf, "unnamed%d", m_defaultDocumentNameCounter);
-  m_defaultDocumentNameCounter ++;
-  name = buf;
+  name.Printf(_("unnamed%d"), m_defaultDocumentNameCounter);
+  m_defaultDocumentNameCounter++;
+
   return TRUE;
 }
 
 // Not yet implemented
 wxDocTemplate *wxDocManager::MatchTemplate(const wxString& WXUNUSED(path))
 {
   return TRUE;
 }
 
 // Not yet implemented
 wxDocTemplate *wxDocManager::MatchTemplate(const wxString& WXUNUSED(path))
 {
-  return NULL;
+  return (wxDocTemplate *) NULL;
 }
 
 // File history management
 }
 
 // File history management
@@ -1044,19 +1038,39 @@ wxString wxDocManager::GetHistoryFile(int i) const
 void wxDocManager::FileHistoryUseMenu(wxMenu *menu)
 {
   if (m_fileHistory)
 void wxDocManager::FileHistoryUseMenu(wxMenu *menu)
 {
   if (m_fileHistory)
-    m_fileHistory->FileHistoryUseMenu(menu);
+    m_fileHistory->UseMenu(menu);
+}
+
+void wxDocManager::FileHistoryRemoveMenu(wxMenu *menu)
+{
+  if (m_fileHistory)
+    m_fileHistory->RemoveMenu(menu);
 }
 
 }
 
-void wxDocManager::FileHistoryLoad(const wxString& resourceFile, const wxString& section)
+#if wxUSE_CONFIG
+void wxDocManager::FileHistoryLoad(wxConfigBase& config)
 {
   if (m_fileHistory)
 {
   if (m_fileHistory)
-    m_fileHistory->FileHistoryLoad(resourceFile, section);
+    m_fileHistory->Load(config);
 }
 
 }
 
-void wxDocManager::FileHistorySave(const wxString& resourceFile, const wxString& section)
+void wxDocManager::FileHistorySave(wxConfigBase& config)
 {
   if (m_fileHistory)
 {
   if (m_fileHistory)
-    m_fileHistory->FileHistorySave(resourceFile, section);
+    m_fileHistory->Save(config);
+}
+#endif
+
+void wxDocManager::FileHistoryAddFilesToMenu(wxMenu* menu)
+{
+  if (m_fileHistory)
+    m_fileHistory->AddFilesToMenu(menu);
+}
+
+void wxDocManager::FileHistoryAddFilesToMenu()
+{
+  if (m_fileHistory)
+    m_fileHistory->AddFilesToMenu();
 }
 
 int wxDocManager::GetNoHistoryFiles(void) const
 }
 
 int wxDocManager::GetNoHistoryFiles(void) const
@@ -1086,9 +1100,9 @@ static char *FindExtension(char *path)
       return ext;
     }
     else
       return ext;
     }
     else
-      return NULL;
+      return (char *) NULL;
   }
   }
-  else return NULL;
+  else return (char *) NULL;
 }
 
 
 }
 
 
@@ -1098,8 +1112,8 @@ wxDocTemplate *wxDocManager::FindTemplateForPath(const wxString& path)
 {
   char *theExt = FindExtension((char *)(const char *)path);
   if (!theExt)
 {
   char *theExt = FindExtension((char *)(const char *)path);
   if (!theExt)
-    return NULL;
-  wxDocTemplate *theTemplate = NULL;
+    return (wxDocTemplate *) NULL;
+  wxDocTemplate *theTemplate = (wxDocTemplate *) NULL;
 
   if (m_templates.Number() == 1)
     return (wxDocTemplate *)m_templates.First()->Data();
 
   if (m_templates.Number() == 1)
     return (wxDocTemplate *)m_templates.First()->Data();
@@ -1122,40 +1136,46 @@ wxDocTemplate *wxDocManager::FindTemplateForPath(const wxString& path)
 // How to implement in wxWindows? Must extend the file selector
 // dialog or implement own; OR match the extension to the
 // template extension.
 // How to implement in wxWindows? Must extend the file selector
 // dialog or implement own; OR match the extension to the
 // template extension.
+
+#ifdef __WXMSW__
 wxDocTemplate *wxDocManager::SelectDocumentPath(wxDocTemplate **templates,
     int noTemplates, wxString& path, long WXUNUSED(flags), bool WXUNUSED(save))
 wxDocTemplate *wxDocManager::SelectDocumentPath(wxDocTemplate **templates,
     int noTemplates, wxString& path, long WXUNUSED(flags), bool WXUNUSED(save))
+#else
+wxDocTemplate *wxDocManager::SelectDocumentPath(wxDocTemplate **WXUNUSED(templates),
+    int WXUNUSED(noTemplates), wxString& path, long WXUNUSED(flags), bool WXUNUSED(save))
+#endif    
 {
   // We can only have multiple filters in Windows
 {
   // We can only have multiple filters in Windows
-#ifdef __WINDOWS__
-  char *descrBuf = new char[1000];
-  descrBuf[0] = 0;
-  int i;
-  for (i = 0; i < noTemplates; i++)
-  {
-    if (templates[i]->IsVisible())
+#ifdef __WXMSW__
+    wxString descrBuf;
+
+    int i;
+    for (i = 0; i < noTemplates; i++)
     {
     {
-      strcat(descrBuf, templates[i]->GetDescription());
-      strcat(descrBuf, " (");
-      strcat(descrBuf, templates[i]->GetFileFilter());
-      strcat(descrBuf, ") ");
-      strcat(descrBuf, "|");
-      strcat(descrBuf, templates[i]->GetFileFilter());
-      strcat(descrBuf, "|");
+        if (templates[i]->IsVisible())
+        {
+            // add a '|' to separate this filter from the previous one
+            if ( !descrBuf.IsEmpty() )
+                descrBuf << '|';
+
+            descrBuf << templates[i]->GetDescription()
+                     << " (" << templates[i]->GetFileFilter() << ") |"
+                     << templates[i]->GetFileFilter();
+        }
     }
     }
-  }
-  int len = strlen(descrBuf);
-  if (len > 0)
-    // Omit final "|"
-    descrBuf[len-1] = 0;
+#else
+  wxString descrBuf = "*.*";
+#endif
 
 
-  char *pathTmp = wxFileSelector("Select a file", "", "", "", descrBuf, 0, wxTheApp->GetTopWindow());
-  delete[] descrBuf;
-  if (pathTmp)
+  wxString pathTmp = wxFileSelector(_("Select a file"), "", "", "",
+                                    descrBuf, 0, wxTheApp->GetTopWindow());
+
+  if (!pathTmp.IsEmpty())
   {
     path = pathTmp;
     char *theExt = FindExtension((char *)(const char *)path);
     if (!theExt)
   {
     path = pathTmp;
     char *theExt = FindExtension((char *)(const char *)path);
     if (!theExt)
-      return NULL;
+      return (wxDocTemplate *) NULL;
 
     // This is dodgy in that we're selecting the template on the
     // basis of the file extension, which may not be a standard
 
     // This is dodgy in that we're selecting the template on the
     // basis of the file extension, which may not be a standard
@@ -1167,17 +1187,17 @@ wxDocTemplate *wxDocManager::SelectDocumentPath(wxDocTemplate **templates,
   else
   {
     path = "";
   else
   {
     path = "";
-    return NULL;
+    return (wxDocTemplate *) NULL;
   }
   }
-#else
+#if 0
   // In all other windowing systems, until we have more advanced
   // file selectors, we must select the document type (template) first, and
   // _then_ pop up the file selector.
   wxDocTemplate *temp = SelectDocumentType(templates, noTemplates);
   if (!temp)
   // In all other windowing systems, until we have more advanced
   // file selectors, we must select the document type (template) first, and
   // _then_ pop up the file selector.
   wxDocTemplate *temp = SelectDocumentType(templates, noTemplates);
   if (!temp)
-    return NULL;
+    return (wxDocTemplate *) NULL;
 
 
-  char *pathTmp = wxFileSelector("Select a file", "", "",
+  char *pathTmp = wxFileSelector(_("Select a file"), "", "",
      temp->GetDefaultExtension(),
      temp->GetFileFilter(),
      0, wxTheApp->GetTopWindow());
      temp->GetDefaultExtension(),
      temp->GetFileFilter(),
      0, wxTheApp->GetTopWindow());
@@ -1188,7 +1208,7 @@ wxDocTemplate *wxDocManager::SelectDocumentPath(wxDocTemplate **templates,
     return temp;
   }
   else
     return temp;
   }
   else
-    return NULL;
+    return (wxDocTemplate *) NULL;
 #endif
 }
 
 #endif
 }
 
@@ -1212,7 +1232,7 @@ wxDocTemplate *wxDocManager::SelectDocumentType(wxDocTemplate **templates,
   {
     delete[] strings;
     delete[] data;
   {
     delete[] strings;
     delete[] data;
-    return NULL;
+    return (wxDocTemplate *) NULL;
   }
   else if (n == 1)
   {
   }
   else if (n == 1)
   {
@@ -1222,7 +1242,7 @@ wxDocTemplate *wxDocManager::SelectDocumentType(wxDocTemplate **templates,
     return temp;
   }
   
     return temp;
   }
   
-  wxDocTemplate *theTemplate = (wxDocTemplate *)wxGetSingleChoiceData("Select a document template", "Templates", n,
+  wxDocTemplate *theTemplate = (wxDocTemplate *)wxGetSingleChoiceData(_("Select a document template"), _("Templates"), n,
     strings, data);
   delete[] strings;
   delete[] data;
     strings, data);
   delete[] strings;
   delete[] data;
@@ -1238,14 +1258,14 @@ wxDocTemplate *wxDocManager::SelectViewType(wxDocTemplate **templates,
   int n = 0;
   for (i = 0; i < noTemplates; i++)
   {
   int n = 0;
   for (i = 0; i < noTemplates; i++)
   {
-    if (templates[i]->IsVisible() && templates[i]->GetViewName())
+    if (templates[i]->IsVisible() && (templates[i]->GetViewName() != ""))
     {
       strings[n] = WXSTRINGCAST templates[i]->m_viewTypeName;
       data[n] = (char *)templates[i];
       n ++;
     }
   }
     {
       strings[n] = WXSTRINGCAST templates[i]->m_viewTypeName;
       data[n] = (char *)templates[i];
       n ++;
     }
   }
-  wxDocTemplate *theTemplate = (wxDocTemplate *)wxGetSingleChoiceData("Select a document view", "Views", n,
+  wxDocTemplate *theTemplate = (wxDocTemplate *)wxGetSingleChoiceData(_("Select a document view"), _("Views"), n,
     strings, data);
   delete[] strings;
   delete[] data;
     strings, data);
   delete[] strings;
   delete[] data;
@@ -1295,7 +1315,7 @@ void wxDocManager::ActivateView(wxView *view, bool activate, bool WXUNUSED(delet
     if (activate)
       m_currentView = view;
     else
     if (activate)
       m_currentView = view;
     else
-      m_currentView = NULL;
+      m_currentView = (wxView *) NULL;
   }
 }
 
   }
 }
 
@@ -1305,11 +1325,12 @@ void wxDocManager::ActivateView(wxView *view, bool activate, bool WXUNUSED(delet
 
 BEGIN_EVENT_TABLE(wxDocChildFrame, wxFrame)
     EVT_ACTIVATE(wxDocChildFrame::OnActivate)
 
 BEGIN_EVENT_TABLE(wxDocChildFrame, wxFrame)
     EVT_ACTIVATE(wxDocChildFrame::OnActivate)
+    EVT_CLOSE(wxDocChildFrame::OnCloseWindow)
 END_EVENT_TABLE()
 
 END_EVENT_TABLE()
 
-wxDocChildFrame::wxDocChildFrame(wxDocument *doc, wxView *view, wxFrame *frame, const wxString& title,
-  const wxPoint& pos, const wxSize& size, const long style, const wxString& name):
-    wxFrame(frame, -1, title, pos, size, style, name)
+wxDocChildFrame::wxDocChildFrame(wxDocument *doc, wxView *view, wxFrame *frame, wxWindowID id, const wxString& title,
+  const wxPoint& pos, const wxSize& size, long style, const wxString& name):
+    wxFrame(frame, id, title, pos, size, style, name)
 {
   m_childDocument = doc;
   m_childView = view;
 {
   m_childDocument = doc;
   m_childView = view;
@@ -1339,18 +1360,6 @@ bool wxDocChildFrame::ProcessEvent(wxEvent& event)
                return TRUE;
 }
 
                return TRUE;
 }
 
-/*
-// Intercept menu commands
-void wxDocChildFrame::OldOnMenuCommand(int id)
-{
-  if (m_childView)
-    m_childView->Activate(TRUE);
-
-  if (GetParent())
-    ((wxFrame *)GetParent())->OldOnMenuCommand(id);
-}
-*/
-
 void wxDocChildFrame::OnActivate(wxActivateEvent& event)
 {
   wxFrame::OnActivate(event);
 void wxDocChildFrame::OnActivate(wxActivateEvent& event)
 {
   wxFrame::OnActivate(event);
@@ -1359,24 +1368,30 @@ void wxDocChildFrame::OnActivate(wxActivateEvent& event)
     m_childView->Activate(event.GetActive());
 }
 
     m_childView->Activate(event.GetActive());
 }
 
-bool wxDocChildFrame::OnClose(void)
+void wxDocChildFrame::OnCloseWindow(wxCloseEvent& event)
 {
 {
-  // Close view but don't delete the frame while doing so!
-  // ...since it will be deleted by wxWindows if we return TRUE.
   if (m_childView)
   {
   if (m_childView)
   {
-    bool ans = m_childView->Close(FALSE); // FALSE means don't delete associated window
+    bool ans = FALSE;
+    if (!event.CanVeto())
+      ans = TRUE; // Must delete.
+    else
+      ans = m_childView->Close(FALSE); // FALSE means don't delete associated window
+
     if (ans)
     {
       m_childView->Activate(FALSE);
       delete m_childView;
     if (ans)
     {
       m_childView->Activate(FALSE);
       delete m_childView;
-      m_childView = NULL;
-      m_childDocument = NULL;
+      m_childView = (wxView *) NULL;
+      m_childDocument = (wxDocument *) NULL;
+
+      this->Destroy();
     }
     }
-    
-    return ans;
+    else
+      event.Veto();
   }
   }
-  else return TRUE;
+  else
+    event.Veto();
 }
 
 /*
 }
 
 /*
@@ -1385,12 +1400,13 @@ bool wxDocChildFrame::OnClose(void)
 
 BEGIN_EVENT_TABLE(wxDocParentFrame, wxFrame)
     EVT_MENU(wxID_EXIT, wxDocParentFrame::OnExit)
 
 BEGIN_EVENT_TABLE(wxDocParentFrame, wxFrame)
     EVT_MENU(wxID_EXIT, wxDocParentFrame::OnExit)
-    EVT_MENU_RANGE(wxID_FILE1, wxID_FILE2, wxDocParentFrame::OnMRUFile)
+    EVT_MENU_RANGE(wxID_FILE1, wxID_FILE9, wxDocParentFrame::OnMRUFile)
+    EVT_CLOSE(wxDocParentFrame::OnCloseWindow)
 END_EVENT_TABLE()
 
 END_EVENT_TABLE()
 
-wxDocParentFrame::wxDocParentFrame(wxDocManager *manager, wxFrame *frame, const wxString& title,
-  const wxPoint& pos, const wxSize& size, const long style, const wxString& name):
-  wxFrame(frame, -1, title, pos, size, style, name)
+wxDocParentFrame::wxDocParentFrame(wxDocManager *manager, wxFrame *frame, wxWindowID id, const wxString& title,
+  const wxPoint& pos, const wxSize& size, long style, const wxString& name):
+  wxFrame(frame, id, title, pos, size, style, name)
 {
   m_docManager = manager;
 }
 {
   m_docManager = manager;
 }
@@ -1417,48 +1433,19 @@ bool wxDocParentFrame::ProcessEvent(wxEvent& event)
         return TRUE;
 }
 
         return TRUE;
 }
 
-/*
-// Intercept menu commands
-void wxDocParentFrame::OldOnMenuCommand(int id)
-{
-  switch (id)
-  {
-    case wxID_EXIT:
-    {
-      Close();
-      break;
-    }
-    case wxID_FILE1:
-    case wxID_FILE2:
-    case wxID_FILE3:
-    case wxID_FILE4:
-    case wxID_FILE5:
-    case wxID_FILE6:
-    case wxID_FILE7:
-    case wxID_FILE8:
-    case wxID_FILE9:
-    {
-      wxString f(m_docManager->GetHistoryFile(id-wxID_FILE1));
-      if (f != "")
-        (void)m_docManager->CreateDocument(f, wxDOC_SILENT);
-      break;
-    }
-    default:
-    {
-      m_docManager->OldOnMenuCommand(id);
-    }
-  }
-}
-*/
-
 // Define the behaviour for the frame closing
 // - must delete all frames except for the main one.
 // Define the behaviour for the frame closing
 // - must delete all frames except for the main one.
-bool wxDocParentFrame::OnClose(void)
+void wxDocParentFrame::OnCloseWindow(wxCloseEvent& event)
 {
 {
-  return m_docManager->Clear(FALSE);
+  if (m_docManager->Clear(!event.CanVeto()))
+  {
+    this->Destroy();
+  }
+  else
+    event.Veto();
 }
 
 }
 
-#if USE_PRINTING_ARCHITECTURE
+#if wxUSE_PRINTING_ARCHITECTURE
 
 wxDocPrintout::wxDocPrintout(wxView *view, const wxString& title):
   wxPrintout(WXSTRINGCAST title)
 
 wxDocPrintout::wxDocPrintout(wxView *view, const wxString& title):
   wxPrintout(WXSTRINGCAST title)
@@ -1543,8 +1530,8 @@ wxCommand::~wxCommand(void)
 wxCommandProcessor::wxCommandProcessor(int maxCommands)
 {
   m_maxNoCommands = maxCommands;
 wxCommandProcessor::wxCommandProcessor(int maxCommands)
 {
   m_maxNoCommands = maxCommands;
-  m_currentCommand = NULL;
-  m_commandEditMenu = NULL;
+  m_currentCommand = (wxNode *) NULL;
+  m_commandEditMenu = (wxMenu *) NULL;
 }
 
 wxCommandProcessor::~wxCommandProcessor(void)
 }
 
 wxCommandProcessor::~wxCommandProcessor(void)
@@ -1612,8 +1599,8 @@ bool wxCommandProcessor::Undo(void)
 
 bool wxCommandProcessor::Redo(void)
 {
 
 bool wxCommandProcessor::Redo(void)
 {
-  wxCommand *redoCommand = NULL;
-  wxNode *redoNode = NULL;
+  wxCommand *redoCommand = (wxCommand *) NULL;
+  wxNode *redoNode = (wxNode *) NULL;
   if (m_currentCommand && m_currentCommand->Next())
   {
     redoCommand = (wxCommand *)m_currentCommand->Next()->Data();
   if (m_currentCommand && m_currentCommand->Next())
   {
     redoCommand = (wxCommand *)m_currentCommand->Next()->Data();
@@ -1641,13 +1628,27 @@ bool wxCommandProcessor::Redo(void)
   return FALSE;
 }
 
   return FALSE;
 }
 
-bool wxCommandProcessor::CanUndo(void)
+bool wxCommandProcessor::CanUndo(void) const
 {
   if (m_currentCommand)
     return ((wxCommand *)m_currentCommand->Data())->CanUndo();
   return FALSE;
 }
 
 {
   if (m_currentCommand)
     return ((wxCommand *)m_currentCommand->Data())->CanUndo();
   return FALSE;
 }
 
+bool wxCommandProcessor::CanRedo(void) const
+{
+    if ((m_currentCommand != (wxNode*) NULL) && (m_currentCommand->Next() == (wxNode*) NULL))
+        return FALSE;
+
+    if ((m_currentCommand != (wxNode*) NULL) && (m_currentCommand->Next() != (wxNode*) NULL))
+        return TRUE;
+
+    if ((m_currentCommand == (wxNode*) NULL) && (m_commands.Number() > 0))
+        return TRUE;
+
+    return FALSE;
+}
+
 void wxCommandProcessor::Initialize(void)
 {
   m_currentCommand = m_commands.Last();
 void wxCommandProcessor::Initialize(void)
 {
   m_currentCommand = m_commands.Last();
@@ -1663,12 +1664,12 @@ void wxCommandProcessor::SetMenuStrings(void)
     {
       wxCommand *command = (wxCommand *)m_currentCommand->Data();
       wxString commandName(command->GetName());
     {
       wxCommand *command = (wxCommand *)m_currentCommand->Data();
       wxString commandName(command->GetName());
-      if (commandName == "") commandName = "Unnamed command";
+      if (commandName == "") commandName = _("Unnamed command");
       bool canUndo = command->CanUndo();
       if (canUndo)
       bool canUndo = command->CanUndo();
       if (canUndo)
-        buf = wxString("&Undo ") + commandName;
+        buf = wxString(_("&Undo ")) + commandName;
       else
       else
-        buf = wxString("Can't &Undo ") + commandName;
+        buf = wxString(_("Can't &Undo ")) + commandName;
         
       m_commandEditMenu->SetLabel(wxID_UNDO, buf);
       m_commandEditMenu->Enable(wxID_UNDO, canUndo);
         
       m_commandEditMenu->SetLabel(wxID_UNDO, buf);
       m_commandEditMenu->Enable(wxID_UNDO, canUndo);
@@ -1678,25 +1679,25 @@ void wxCommandProcessor::SetMenuStrings(void)
       {
         wxCommand *redoCommand = (wxCommand *)m_currentCommand->Next()->Data();
         wxString redoCommandName(redoCommand->GetName());
       {
         wxCommand *redoCommand = (wxCommand *)m_currentCommand->Next()->Data();
         wxString redoCommandName(redoCommand->GetName());
-        if (redoCommandName == "") redoCommandName = "Unnamed command";
-        buf = wxString("&Redo ") + redoCommandName;
+        if (redoCommandName == "") redoCommandName = _("Unnamed command");
+        buf = wxString(_("&Redo ")) + redoCommandName;
         m_commandEditMenu->SetLabel(wxID_REDO, buf);
         m_commandEditMenu->Enable(wxID_REDO, TRUE);
       }
       else
       {
         m_commandEditMenu->SetLabel(wxID_REDO, buf);
         m_commandEditMenu->Enable(wxID_REDO, TRUE);
       }
       else
       {
-        m_commandEditMenu->SetLabel(wxID_REDO, "&Redo");
+        m_commandEditMenu->SetLabel(wxID_REDO, _("&Redo"));
         m_commandEditMenu->Enable(wxID_REDO, FALSE);
       }
     }
     else
     {
         m_commandEditMenu->Enable(wxID_REDO, FALSE);
       }
     }
     else
     {
-      m_commandEditMenu->SetLabel(wxID_UNDO, "&Undo");
+      m_commandEditMenu->SetLabel(wxID_UNDO, _("&Undo"));
       m_commandEditMenu->Enable(wxID_UNDO, FALSE);
 
       if (m_commands.Number() == 0)
       {
       m_commandEditMenu->Enable(wxID_UNDO, FALSE);
 
       if (m_commands.Number() == 0)
       {
-        m_commandEditMenu->SetLabel(wxID_REDO, "&Redo");
+        m_commandEditMenu->SetLabel(wxID_REDO, _("&Redo"));
         m_commandEditMenu->Enable(wxID_REDO, FALSE);
       }
       else
         m_commandEditMenu->Enable(wxID_REDO, FALSE);
       }
       else
@@ -1705,8 +1706,8 @@ void wxCommandProcessor::SetMenuStrings(void)
         // we've undone to the start of the list, but can redo the first.
         wxCommand *redoCommand = (wxCommand *)m_commands.First()->Data();
         wxString redoCommandName(redoCommand->GetName());
         // we've undone to the start of the list, but can redo the first.
         wxCommand *redoCommand = (wxCommand *)m_commands.First()->Data();
         wxString redoCommandName(redoCommand->GetName());
-        if (!redoCommandName) redoCommandName = "Unnamed command";
-        buf = wxString("&Redo ") + redoCommandName;
+        if (redoCommandName == "") redoCommandName = _("Unnamed command");
+        buf = wxString(_("&Redo ")) + redoCommandName;
         m_commandEditMenu->SetLabel(wxID_REDO, buf);
         m_commandEditMenu->Enable(wxID_REDO, TRUE);
       }
         m_commandEditMenu->SetLabel(wxID_REDO, buf);
         m_commandEditMenu->Enable(wxID_REDO, TRUE);
       }
@@ -1724,7 +1725,7 @@ void wxCommandProcessor::ClearCommands(void)
     delete node;
     node = m_commands.First();
   }
     delete node;
     node = m_commands.First();
   }
-  m_currentCommand = NULL;
+  m_currentCommand = (wxNode *) NULL;
 }
 
 
 }
 
 
@@ -1735,7 +1736,6 @@ void wxCommandProcessor::ClearCommands(void)
 wxFileHistory::wxFileHistory(int maxFiles)
 {
   m_fileMaxFiles = maxFiles;
 wxFileHistory::wxFileHistory(int maxFiles)
 {
   m_fileMaxFiles = maxFiles;
-  m_fileMenu = NULL;
   m_fileHistoryN = 0;
   m_fileHistory = new char *[m_fileMaxFiles];
 }
   m_fileHistoryN = 0;
   m_fileHistory = new char *[m_fileMaxFiles];
 }
@@ -1751,18 +1751,14 @@ wxFileHistory::~wxFileHistory(void)
 // File history management
 void wxFileHistory::AddFileToHistory(const wxString& file)
 {
 // File history management
 void wxFileHistory::AddFileToHistory(const wxString& file)
 {
-  if (!m_fileMenu)
-    return;
-    
   int i;
   int i;
-
   // Check we don't already have this file
   for (i = 0; i < m_fileHistoryN; i++)
   {
   // Check we don't already have this file
   for (i = 0; i < m_fileHistoryN; i++)
   {
-    if (m_fileHistory[i] && wxString(m_fileHistory[i]) == file)
-      return;
+      if (m_fileHistory[i] && wxString(m_fileHistory[i]) == file)
+          return;
   }
   }
-  
+
   // Add to the project file history:
   // Move existing files (if any) down so we can insert file at beginning.
   
   // Add to the project file history:
   // Move existing files (if any) down so we can insert file at beginning.
   
@@ -1770,13 +1766,19 @@ void wxFileHistory::AddFileToHistory(const wxString& file)
   if (m_fileHistoryN == m_fileMaxFiles)
   {
     delete[] m_fileHistory[m_fileMaxFiles-1];
   if (m_fileHistoryN == m_fileMaxFiles)
   {
     delete[] m_fileHistory[m_fileMaxFiles-1];
-    m_fileHistory[m_fileMaxFiles-1] = NULL;
+    m_fileHistory[m_fileMaxFiles-1] = (char *) NULL;
   }
   if (m_fileHistoryN < m_fileMaxFiles)
   {
   }
   if (m_fileHistoryN < m_fileMaxFiles)
   {
-    if (m_fileHistoryN == 0)
-      m_fileMenu->AppendSeparator();
-    m_fileMenu->Append(wxID_FILE1+m_fileHistoryN, "[EMPTY]");
+    wxNode* node = m_fileMenus.First();
+    while (node)
+    {
+        wxMenu* menu = (wxMenu*) node->Data();
+        if (m_fileHistoryN == 0)
+            menu->AppendSeparator();
+        menu->Append(wxID_FILE1+m_fileHistoryN, _("[EMPTY]"));
+        node = node->Next();
+    }
     m_fileHistoryN ++;
   }
   // Shuffle filenames down
     m_fileHistoryN ++;
   }
   // Shuffle filenames down
@@ -1789,9 +1791,15 @@ void wxFileHistory::AddFileToHistory(const wxString& file)
   for (i = 0; i < m_fileHistoryN; i++)
     if (m_fileHistory[i])
     {
   for (i = 0; i < m_fileHistoryN; i++)
     if (m_fileHistory[i])
     {
-      char buf[400];
-      sprintf(buf, "&%d %s", i+1, m_fileHistory[i]);
-      m_fileMenu->SetLabel(wxID_FILE1+i, buf);
+      wxString buf;
+      buf.Printf("&%d %s", i+1, m_fileHistory[i]);
+      wxNode* node = m_fileMenus.First();
+      while (node)
+      {
+        wxMenu* menu = (wxMenu*) node->Data();
+        menu->SetLabel(wxID_FILE1+i, buf);
+        node = node->Next();
+      }
     }
 }
 
     }
 }
 
@@ -1803,40 +1811,86 @@ wxString wxFileHistory::GetHistoryFile(int i) const
     return wxString("");
 }
 
     return wxString("");
 }
 
-void wxFileHistory::FileHistoryUseMenu(wxMenu *menu)
+void wxFileHistory::UseMenu(wxMenu *menu)
+{
+  if (!m_fileMenus.Member(menu))
+    m_fileMenus.Append(menu);
+}
+
+void wxFileHistory::RemoveMenu(wxMenu *menu)
 {
 {
-  m_fileMenu = menu;
+  m_fileMenus.DeleteObject(menu);
 }
 
 }
 
-void wxFileHistory::FileHistoryLoad(const wxString& resourceFile, const wxString& section)
+#if wxUSE_CONFIG
+void wxFileHistory::Load(wxConfigBase& config)
 {
 {
-#if USE_RESOURCES
   m_fileHistoryN = 0;
   m_fileHistoryN = 0;
-  char buf[400];
-  sprintf(buf, "file%d", m_fileHistoryN+1);
-  char *historyFile = NULL;
-  while ((m_fileHistoryN <= m_fileMaxFiles) && wxGetResource(section, buf, &historyFile, resourceFile) && historyFile)
+  wxString buf;
+  buf.Printf("file%d", m_fileHistoryN+1);
+  wxString historyFile;
+  while ((m_fileHistoryN <= m_fileMaxFiles) && config.Read(buf, &historyFile) && (historyFile != ""))
   {
   {
-    // wxGetResource allocates memory so this is o.k.
-    m_fileHistory[m_fileHistoryN] = historyFile;
+    m_fileHistory[m_fileHistoryN] = copystring((const char*) historyFile);
     m_fileHistoryN ++;
     m_fileHistoryN ++;
-    sprintf(buf, "file%d", m_fileHistoryN+1);
-    historyFile = NULL;
+    buf.Printf("file%d", m_fileHistoryN+1);
+    historyFile = "";
   }
   }
-#endif
+  AddFilesToMenu();
 }
 
 }
 
-void wxFileHistory::FileHistorySave(const wxString& resourceFile, const wxString& section)
+void wxFileHistory::Save(wxConfigBase& config)
 {
 {
-#if USE_RESOURCES
-  char buf[400];
   int i;
   for (i = 0; i < m_fileHistoryN; i++)
   {
   int i;
   for (i = 0; i < m_fileHistoryN; i++)
   {
-    sprintf(buf, "file%d", i+1);
-    wxWriteResource(section, buf, m_fileHistory[i], resourceFile);
+    wxString buf;
+    buf.Printf("file%d", i+1);
+    config.Write(buf, wxString(m_fileHistory[i]));
   }
   }
+}
 #endif
 #endif
+
+void wxFileHistory::AddFilesToMenu()
+{
+    if (m_fileHistoryN > 0)
+    {
+        wxNode* node = m_fileMenus.First();
+        while (node)
+        {
+            wxMenu* menu = (wxMenu*) node->Data();
+            menu->AppendSeparator();
+            int i;
+            for (i = 0; i < m_fileHistoryN; i++)
+            {
+                if (m_fileHistory[i])
+                {
+                    wxString buf;
+                    buf.Printf("&%d %s", i+1, m_fileHistory[i]);
+                    menu->Append(wxID_FILE1+i, buf);
+                }
+            }
+            node = node->Next();
+        }
+    }
+}
+
+void wxFileHistory::AddFilesToMenu(wxMenu* menu)
+{
+    if (m_fileHistoryN > 0)
+    {
+        menu->AppendSeparator();
+        int i;
+        for (i = 0; i < m_fileHistoryN; i++)
+        {
+            if (m_fileHistory[i])
+            {
+                wxString buf;
+                buf.Printf("&%d %s", i+1, m_fileHistory[i]);
+                menu->Append(wxID_FILE1+i, buf);
+            }
+        }
+    }
 }
 
 #if 0
 }
 
 #if 0
@@ -1895,4 +1949,4 @@ bool wxTransferStreamToFile(istream& stream, const wxString& filename)
 }
 
 #endif
 }
 
 #endif
-  // End USE_DOC_VIEW_ARCHITECTURE
+  // End wxUSE_DOC_VIEW_ARCHITECTURE