]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/docview.cpp
Version 0.4 of wxPython for MSW.
[wxWidgets.git] / src / common / docview.cpp
index cc94f2fd0432e5eae5f498ebf91471a295508fda..2ab0f4cd24503c7ea0344a52205b6d84f466d6c2 100644 (file)
@@ -24,7 +24,7 @@
 #include "wx/defs.h"
 #endif
 
-#if USE_DOC_VIEW_ARCHITECTURE
+#if wxUSE_DOC_VIEW_ARCHITECTURE
 
 #ifndef WX_PRECOMP
 #include "wx/string.h"
 #include "wx/printdlg.h"
 #include "wx/generic/prntdlgg.h"
 #include "wx/generic/printps.h"
+#include "wx/confbase.h"
 
 #include <stdio.h>
 #include <string.h>
 
-#if USE_IOSTREAMH
+#if wxUSE_IOSTREAMH
 #include <iostream.h>
 #else
 #include <iostream>
@@ -67,7 +68,7 @@ IMPLEMENT_ABSTRACT_CLASS(wxDocTemplate, wxObject)
 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)
@@ -86,7 +87,7 @@ wxDocument::wxDocument(wxDocument *parent)
   m_documentFile="";
   m_documentTitle="";
   m_documentParent=parent;
-  m_documentTemplate = NULL;
+  m_documentTemplate = (wxDocTemplate *) NULL;
   m_documentTypeName = "";
   m_savedYet = FALSE;
 }
@@ -149,7 +150,7 @@ bool wxDocument::DeleteAllViews(void)
 wxView *wxDocument::GetFirstView(void) const
 {
   if (m_documentViews.Number() == 0)
-    return NULL;
+    return (wxView *) NULL;
   return (wxView *)m_documentViews.First()->Data();
 }
 
@@ -290,6 +291,7 @@ bool wxDocument::OnOpenDocument(const wxString& file)
   }
   SetFilename(file, TRUE);
   Modify(FALSE);
+  m_savedYet = TRUE;
 
   UpdateAllViews();
   
@@ -462,7 +464,7 @@ wxView::wxView(wxDocument *doc)
   SetDocument(doc);
   
   m_viewTypeName = "";
-  m_viewFrame = NULL;
+  m_viewFrame = (wxFrame *) NULL;
 }
 
 wxView::~wxView(void)
@@ -533,7 +535,7 @@ bool wxView::OnClose(bool WXUNUSED(deleteWindow))
   return GetDocument() ? GetDocument()->Close() : TRUE;
 }
 
-#if USE_PRINTING_ARCHITECTURE
+#if wxUSE_PRINTING_ARCHITECTURE
 wxPrintout *wxView::OnCreatePrintout(void)
 {
   return new wxDocPrintout(this);
@@ -575,7 +577,7 @@ wxDocTemplate::~wxDocTemplate(void)
 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);
@@ -587,14 +589,14 @@ wxDocument *wxDocTemplate::CreateDocument(const wxString& path, long flags)
   else
   {
     delete doc;
-    return NULL;
+    return (wxDocument *) NULL;
   }
 }
 
 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))
@@ -604,7 +606,7 @@ wxView *wxDocTemplate::CreateView(wxDocument *doc, long flags)
   else
   {
     delete view;
-    return NULL;
+    return (wxView *) NULL;
   }
 }
 
@@ -626,9 +628,9 @@ wxDocManager::wxDocManager(long flags, bool initialize)
 {
   m_defaultDocumentNameCounter = 1;
   m_flags = flags;
-  m_currentView = NULL;
+  m_currentView = (wxView *) NULL;
   m_maxDocsOpen = 10000;
-  m_fileHistory = NULL;
+  m_fileHistory = (wxFileHistory *) NULL;
   if (initialize)
     Initialize();
 }
@@ -796,7 +798,7 @@ void wxDocManager::OnPreview(wxCommandEvent& WXUNUSED(event))
   if (printout)
   {
     // Pass two printout objects: for preview, and possible printing.
-    wxPrintPreviewBase *preview = NULL;
+    wxPrintPreviewBase *preview = (wxPrintPreviewBase *) NULL;
 #ifdef __WXMSW__
     if ( wxTheApp->GetPrintMode() == wxPRINT_WINDOWS )
         preview = new wxWindowsPrintPreview(printout, view->OnCreatePrintout());
@@ -839,7 +841,7 @@ wxView *wxDocManager::GetCurrentView(void) const
         wxDocument* doc = (wxDocument*) m_docs.First()->Data();
         return doc->GetFirstView();
     }
-    return NULL;
+    return (wxView *) NULL;
 }
 
 // Extend event processing to search the view's event table
@@ -871,7 +873,7 @@ wxDocument *wxDocManager::CreateDocument(const wxString& path, long flags)
   if (n == 0)
   {
     delete[] templates;
-    return NULL;
+    return (wxDocument *) NULL;
   }
 
   // If we've reached the max number of docs, close the
@@ -890,7 +892,7 @@ wxDocument *wxDocManager::CreateDocument(const wxString& path, long flags)
         delete doc;
     }
     else
-      return NULL;
+      return (wxDocument *) NULL;
   }
   
   // New document: user chooses a template, unless there's only one.
@@ -924,11 +926,11 @@ wxDocument *wxDocManager::CreateDocument(const wxString& path, long flags)
       return newDoc;
     }
     else
-      return NULL;
+      return (wxDocument *) NULL;
   }
 
   // Existing document
-  wxDocTemplate *temp = NULL;
+  wxDocTemplate *temp = (wxDocTemplate *) NULL;
 
   wxString path2("");
   if (path != "")
@@ -951,14 +953,14 @@ wxDocument *wxDocManager::CreateDocument(const wxString& path, long flags)
       if (!newDoc->OnOpenDocument(path2))
       {
         delete newDoc;
-        return NULL;
+        return (wxDocument *) NULL;
       }
       AddFileToHistory(path2);
     }
     return newDoc;
   }
   else
-    return NULL;
+    return (wxDocument *) NULL;
 }
 
 wxView *wxDocManager::CreateView(wxDocument *doc, long flags)
@@ -981,7 +983,7 @@ wxView *wxDocManager::CreateView(wxDocument *doc, long flags)
   if (n == 0)
   {
     delete[] templates;
-    return NULL;
+    return (wxView *) NULL;
   }
   if (n == 1)
   {
@@ -1003,7 +1005,7 @@ wxView *wxDocManager::CreateView(wxDocument *doc, long flags)
     return view;
   }
   else
-    return NULL;
+    return (wxView *) NULL;
 }
 
 // Not yet implemented
@@ -1022,7 +1024,7 @@ wxDocument *wxDocManager::GetCurrentDocument(void) const
   if (m_currentView)
     return m_currentView->GetDocument();
   else
-    return NULL;
+    return (wxDocument *) NULL;
 }
 
 // Make a default document name
@@ -1038,7 +1040,7 @@ bool wxDocManager::MakeDefaultName(wxString& name)
 // Not yet implemented
 wxDocTemplate *wxDocManager::MatchTemplate(const wxString& WXUNUSED(path))
 {
-  return NULL;
+  return (wxDocTemplate *) NULL;
 }
 
 // File history management
@@ -1059,19 +1061,37 @@ wxString wxDocManager::GetHistoryFile(int i) const
 void wxDocManager::FileHistoryUseMenu(wxMenu *menu)
 {
   if (m_fileHistory)
-    m_fileHistory->FileHistoryUseMenu(menu);
+    m_fileHistory->UseMenu(menu);
 }
 
-void wxDocManager::FileHistoryLoad(const wxString& resourceFile, const wxString& section)
+void wxDocManager::FileHistoryRemoveMenu(wxMenu *menu)
 {
   if (m_fileHistory)
-    m_fileHistory->FileHistoryLoad(resourceFile, section);
+    m_fileHistory->RemoveMenu(menu);
 }
 
-void wxDocManager::FileHistorySave(const wxString& resourceFile, const wxString& section)
+void wxDocManager::FileHistoryLoad(wxConfigBase& config)
 {
   if (m_fileHistory)
-    m_fileHistory->FileHistorySave(resourceFile, section);
+    m_fileHistory->Load(config);
+}
+
+void wxDocManager::FileHistorySave(wxConfigBase& config)
+{
+  if (m_fileHistory)
+    m_fileHistory->Save(config);
+}
+
+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
@@ -1101,9 +1121,9 @@ static char *FindExtension(char *path)
       return ext;
     }
     else
-      return NULL;
+      return (char *) NULL;
   }
-  else return NULL;
+  else return (char *) NULL;
 }
 
 
@@ -1113,8 +1133,8 @@ wxDocTemplate *wxDocManager::FindTemplateForPath(const wxString& path)
 {
   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();
@@ -1170,7 +1190,7 @@ wxDocTemplate *wxDocManager::SelectDocumentPath(wxDocTemplate **templates,
     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
@@ -1182,7 +1202,7 @@ wxDocTemplate *wxDocManager::SelectDocumentPath(wxDocTemplate **templates,
   else
   {
     path = "";
-    return NULL;
+    return (wxDocTemplate *) NULL;
   }
 #else
   // In all other windowing systems, until we have more advanced
@@ -1190,7 +1210,7 @@ wxDocTemplate *wxDocManager::SelectDocumentPath(wxDocTemplate **templates,
   // _then_ pop up the file selector.
   wxDocTemplate *temp = SelectDocumentType(templates, noTemplates);
   if (!temp)
-    return NULL;
+    return (wxDocTemplate *) NULL;
 
   char *pathTmp = wxFileSelector(_("Select a file"), "", "",
      temp->GetDefaultExtension(),
@@ -1203,7 +1223,7 @@ wxDocTemplate *wxDocManager::SelectDocumentPath(wxDocTemplate **templates,
     return temp;
   }
   else
-    return NULL;
+    return (wxDocTemplate *) NULL;
 #endif
 }
 
@@ -1227,7 +1247,7 @@ wxDocTemplate *wxDocManager::SelectDocumentType(wxDocTemplate **templates,
   {
     delete[] strings;
     delete[] data;
-    return NULL;
+    return (wxDocTemplate *) NULL;
   }
   else if (n == 1)
   {
@@ -1310,7 +1330,7 @@ void wxDocManager::ActivateView(wxView *view, bool activate, bool WXUNUSED(delet
     if (activate)
       m_currentView = view;
     else
-      m_currentView = NULL;
+      m_currentView = (wxView *) NULL;
   }
 }
 
@@ -1373,8 +1393,8 @@ bool wxDocChildFrame::OnClose(void)
     {
       m_childView->Activate(FALSE);
       delete m_childView;
-      m_childView = NULL;
-      m_childDocument = NULL;
+      m_childView = (wxView *) NULL;
+      m_childDocument = (wxDocument *) NULL;
     }
     
     return ans;
@@ -1427,7 +1447,7 @@ bool wxDocParentFrame::OnClose(void)
   return m_docManager->Clear(FALSE);
 }
 
-#if USE_PRINTING_ARCHITECTURE
+#if wxUSE_PRINTING_ARCHITECTURE
 
 wxDocPrintout::wxDocPrintout(wxView *view, const wxString& title):
   wxPrintout(WXSTRINGCAST title)
@@ -1512,8 +1532,8 @@ wxCommand::~wxCommand(void)
 wxCommandProcessor::wxCommandProcessor(int maxCommands)
 {
   m_maxNoCommands = maxCommands;
-  m_currentCommand = NULL;
-  m_commandEditMenu = NULL;
+  m_currentCommand = (wxNode *) NULL;
+  m_commandEditMenu = (wxMenu *) NULL;
 }
 
 wxCommandProcessor::~wxCommandProcessor(void)
@@ -1581,8 +1601,8 @@ bool wxCommandProcessor::Undo(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();
@@ -1610,13 +1630,27 @@ bool wxCommandProcessor::Redo(void)
   return FALSE;
 }
 
-bool wxCommandProcessor::CanUndo(void)
+bool wxCommandProcessor::CanUndo(void) const
 {
   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();
@@ -1693,7 +1727,7 @@ void wxCommandProcessor::ClearCommands(void)
     delete node;
     node = m_commands.First();
   }
-  m_currentCommand = NULL;
+  m_currentCommand = (wxNode *) NULL;
 }
 
 
@@ -1704,7 +1738,6 @@ void wxCommandProcessor::ClearCommands(void)
 wxFileHistory::wxFileHistory(int maxFiles)
 {
   m_fileMaxFiles = maxFiles;
-  m_fileMenu = NULL;
   m_fileHistoryN = 0;
   m_fileHistory = new char *[m_fileMaxFiles];
 }
@@ -1720,18 +1753,14 @@ wxFileHistory::~wxFileHistory(void)
 // File history management
 void wxFileHistory::AddFileToHistory(const wxString& file)
 {
-  if (!m_fileMenu)
-    return;
-    
   int 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.
   
@@ -1739,13 +1768,19 @@ void wxFileHistory::AddFileToHistory(const wxString& file)
   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 == 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
@@ -1760,7 +1795,13 @@ void wxFileHistory::AddFileToHistory(const wxString& file)
     {
       char buf[400];
       sprintf(buf, "&%d %s", i+1, m_fileHistory[i]);
-      m_fileMenu->SetLabel(wxID_FILE1+i, buf);
+      wxNode* node = m_fileMenus.First();
+      while (node)
+      {
+        wxMenu* menu = (wxMenu*) node->Data();
+        menu->SetLabel(wxID_FILE1+i, buf);
+        node = node->Next();
+      }
     }
 }
 
@@ -1772,40 +1813,84 @@ wxString wxFileHistory::GetHistoryFile(int i) const
     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)
+void wxFileHistory::Load(wxConfigBase& config)
 {
-#if USE_RESOURCES
   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 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 ++;
     sprintf(buf, "file%d", m_fileHistoryN+1);
-    historyFile = NULL;
+    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++)
   {
-    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
+}
+
+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
@@ -1864,4 +1949,4 @@ bool wxTransferStreamToFile(istream& stream, const wxString& filename)
 }
 
 #endif
-  // End USE_DOC_VIEW_ARCHITECTURE
+  // End wxUSE_DOC_VIEW_ARCHITECTURE