]> git.saurik.com Git - wxWidgets.git/blobdiff - samples/docview/doc.cpp
Workaround for Ctrl-A giving a keycode of 1 in EVT_KEY_DOWN on wxGTK
[wxWidgets.git] / samples / docview / doc.cpp
index 5e871203a659285fae6eeb820f9e0475b2fb7e62..725d39d68548b9436efe74b28289d279d2ecdc04 100644 (file)
 #ifndef WX_PRECOMP
 #include "wx/wx.h"
 #endif
 #ifndef WX_PRECOMP
 #include "wx/wx.h"
 #endif
+#include "wx/txtstrm.h"
 
 
-#if !USE_DOC_VIEW_ARCHITECTURE
-#error You must set USE_DOC_VIEW_ARCHITECTURE to 1 in wx_setup.h!
+#if !wxUSE_DOC_VIEW_ARCHITECTURE
+#error You must set wxUSE_DOC_VIEW_ARCHITECTURE to 1 in setup.h!
 #endif
 
 #include "doc.h"
 #endif
 
 #include "doc.h"
@@ -39,42 +40,90 @@ DrawingDocument::DrawingDocument(void)
 
 DrawingDocument::~DrawingDocument(void)
 {
 
 DrawingDocument::~DrawingDocument(void)
 {
-  doodleSegments.DeleteContents(TRUE);
+    doodleSegments.DeleteContents(TRUE);
 }
 
 }
 
-ostream& DrawingDocument::SaveObject(ostream& stream)
+#if wxUSE_STD_IOSTREAM
+wxSTD ostream& DrawingDocument::SaveObject(wxSTD ostream& stream)
 {
 {
-  wxDocument::SaveObject(stream);
-
-  stream << doodleSegments.Number() << '\n';
-  wxNode *node = doodleSegments.First();
-  while (node)
-  {
-    DoodleSegment *segment = (DoodleSegment *)node->Data();
-    segment->SaveObject(stream);
-    stream << '\n';
+    wxDocument::SaveObject(stream);
+    
+    wxInt32 n = doodleSegments.Number();
+    stream << n << '\n';
+    
+    wxNode *node = doodleSegments.First();
+    while (node)
+    {
+        DoodleSegment *segment = (DoodleSegment *)node->Data();
+        segment->SaveObject(stream);
+        stream << '\n';
+        
+        node = node->Next();
+    }
     
     
-    node = node->Next();
-  }
-  return stream;
+    return stream;
 }
 }
-
-istream& DrawingDocument::LoadObject(istream& stream)
+#else
+wxOutputStream& DrawingDocument::SaveObject(wxOutputStream& stream)
 {
 {
-  wxDocument::LoadObject(stream);
-
-  int n = 0;
-  stream >> n;
-
-  for (int i = 0; i < n; i++)
-  {
-    DoodleSegment *segment = new DoodleSegment;
-    segment->LoadObject(stream);
-    doodleSegments.Append(segment);
-  }
+    wxDocument::SaveObject(stream);
+    
+    wxTextOutputStream text_stream( stream );
+    
+    wxInt32 n = doodleSegments.Number();
+    text_stream << n << '\n';
+    
+    wxNode *node = doodleSegments.First();
+    while (node)
+    {
+        DoodleSegment *segment = (DoodleSegment *)node->Data();
+        segment->SaveObject(stream);
+        text_stream << '\n';
+        
+        node = node->Next();
+    }
+    
+    return stream;
+}
+#endif
 
 
-  return stream;
+#if wxUSE_STD_IOSTREAM
+wxSTD istream& DrawingDocument::LoadObject(wxSTD istream& stream)
+{
+    wxDocument::LoadObject(stream);
+    
+    wxInt32 n = 0;
+    stream >> n;
+    
+    for (int i = 0; i < n; i++)
+    {
+        DoodleSegment *segment = new DoodleSegment;
+        segment->LoadObject(stream);
+        doodleSegments.Append(segment);
+    }
+    
+    return stream;
 }
 }
+#else
+wxInputStream& DrawingDocument::LoadObject(wxInputStream& stream)
+{
+    wxDocument::LoadObject(stream);
+    
+    wxTextInputStream text_stream( stream );
+    
+    wxInt32 n = 0;
+    text_stream >> n;
+    
+    for (int i = 0; i < n; i++)
+    {
+        DoodleSegment *segment = new DoodleSegment;
+        segment->LoadObject(stream);
+        doodleSegments.Append(segment);
+    }
+    
+    return stream;
+}
+#endif
 
 DoodleSegment::DoodleSegment(void)
 {
 
 DoodleSegment::DoodleSegment(void)
 {
@@ -82,149 +131,204 @@ DoodleSegment::DoodleSegment(void)
 
 DoodleSegment::DoodleSegment(DoodleSegment& seg)
 {
 
 DoodleSegment::DoodleSegment(DoodleSegment& seg)
 {
-  wxNode *node = seg.lines.First();
-  while (node)
-  {
-    DoodleLine *line = (DoodleLine *)node->Data();
-    DoodleLine *newLine = new DoodleLine;
-    newLine->x1 = line->x1;
-    newLine->y1 = line->y1;
-    newLine->x2 = line->x2;
-    newLine->y2 = line->y2;
-
-    lines.Append(newLine);
-
-    node = node->Next();
-  }
+    wxNode *node = seg.lines.First();
+    while (node)
+    {
+        DoodleLine *line = (DoodleLine *)node->Data();
+        DoodleLine *newLine = new DoodleLine;
+        newLine->x1 = line->x1;
+        newLine->y1 = line->y1;
+        newLine->x2 = line->x2;
+        newLine->y2 = line->y2;
+        
+        lines.Append(newLine);
+        
+        node = node->Next();
+    }
 }
 
 DoodleSegment::~DoodleSegment(void)
 {
 }
 
 DoodleSegment::~DoodleSegment(void)
 {
-  lines.DeleteContents(TRUE);
+    lines.DeleteContents(TRUE);
 }
 
 }
 
-ostream& DoodleSegment::SaveObject(ostream& stream)
+#if wxUSE_STD_IOSTREAM
+wxSTD ostream& DoodleSegment::SaveObject(wxSTD ostream& stream)
 {
 {
-  stream << lines.Number() << '\n';
-  wxNode *node = lines.First();
-  while (node)
-  {
-    DoodleLine *line = (DoodleLine *)node->Data();
-    stream << line->x1 << " " << line->y1 << " " << line->x2 << " " << line->y2 << "\n";
-    node = node->Next();
-  }
-  return stream;
+    wxInt32 n = lines.Number();
+    stream << n << '\n';
+    
+    wxNode *node = lines.First();
+    while (node)
+    {
+        DoodleLine *line = (DoodleLine *)node->Data();
+        stream << line->x1 << " " << 
+            line->y1 << " " << 
+            line->x2 << " " << 
+            line->y2 << "\n";
+        node = node->Next();
+    }
+    
+    return stream;
 }
 }
-
-istream& DoodleSegment::LoadObject(istream& stream)
+#else
+wxOutputStream &DoodleSegment::SaveObject(wxOutputStream& stream)
 {
 {
-  int n = 0;
-  stream >> n;
+    wxTextOutputStream text_stream( stream );
+    
+    wxInt32 n = lines.Number();
+    text_stream << n << '\n';
+    
+    wxNode *node = lines.First();
+    while (node)
+    {
+        DoodleLine *line = (DoodleLine *)node->Data();
+        text_stream << line->x1 << " " << 
+            line->y1 << " " << 
+            line->x2 << " " << 
+            line->y2 << "\n";
+        node = node->Next();
+    }
+    
+    return stream;
+}
+#endif
 
 
-  for (int i = 0; i < n; i++)
-  {
-    DoodleLine *line = new DoodleLine;
-    stream >> line->x1 >> line->y1 >> line->x2 >> line->y2;
-    lines.Append(line);
-  }
-  return stream;
+#if wxUSE_STD_IOSTREAM
+wxSTD istream& DoodleSegment::LoadObject(wxSTD istream& stream)
+{
+    wxInt32 n = 0;
+    stream >> n;
+    
+    for (int i = 0; i < n; i++)
+    {
+        DoodleLine *line = new DoodleLine;
+        stream >> line->x1 >> 
+            line->y1 >> 
+            line->x2 >> 
+            line->y2;
+        lines.Append(line);
+    }
+    
+    return stream;
+}
+#else
+wxInputStream &DoodleSegment::LoadObject(wxInputStream& stream)
+{
+    wxTextInputStream text_stream( stream );
+    
+    wxInt32 n = 0;
+    text_stream >> n;
+    
+    for (int i = 0; i < n; i++)
+    {
+        DoodleLine *line = new DoodleLine;
+        text_stream >> line->x1 >> 
+            line->y1 >> 
+            line->x2 >> 
+            line->y2;
+        lines.Append(line);
+    }
+    
+    return stream;
 }
 }
+#endif
 
 void DoodleSegment::Draw(wxDC *dc)
 {
 
 void DoodleSegment::Draw(wxDC *dc)
 {
-  wxNode *node = lines.First();
-  while (node)
-  {
-    DoodleLine *line = (DoodleLine *)node->Data();
-    dc->DrawLine(line->x1, line->y1, line->x2, line->y2);
-    node = node->Next();
-  }
+    wxNode *node = lines.First();
+    while (node)
+    {
+        DoodleLine *line = (DoodleLine *)node->Data();
+        dc->DrawLine(line->x1, line->y1, line->x2, line->y2);
+        node = node->Next();
+    }
 }
 
 /*
 }
 
 /*
- * Implementation of drawing command
- */
+* Implementation of drawing command
+*/
 
 DrawingCommand::DrawingCommand(const wxString& name, int command, DrawingDocument *ddoc, DoodleSegment *seg):
 
 DrawingCommand::DrawingCommand(const wxString& name, int command, DrawingDocument *ddoc, DoodleSegment *seg):
-  wxCommand(TRUE, name)
+wxCommand(TRUE, name)
 {
 {
-  doc = ddoc;
-  segment = seg;
-  cmd = command;
+    doc = ddoc;
+    segment = seg;
+    cmd = command;
 }
 
 DrawingCommand::~DrawingCommand(void)
 {
 }
 
 DrawingCommand::~DrawingCommand(void)
 {
-  if (segment)
-    delete segment;
+    if (segment)
+        delete segment;
 }
 
 bool DrawingCommand::Do(void)
 {
 }
 
 bool DrawingCommand::Do(void)
 {
-  switch (cmd)
-  {
-    case DOODLE_CUT:
+    switch (cmd)
     {
     {
-      // Cut the last segment
-      if (doc->GetDoodleSegments().Number() > 0)
-      {
-        wxNode *node = doc->GetDoodleSegments().Last();
-        if (segment)
-          delete segment;
-          
-        segment = (DoodleSegment *)node->Data();
-        delete node;
-
-        doc->Modify(TRUE);
-        doc->UpdateAllViews();
-      }
-      break;
-    }
+    case DOODLE_CUT:
+        {
+            // Cut the last segment
+            if (doc->GetDoodleSegments().Number() > 0)
+            {
+                wxNode *node = doc->GetDoodleSegments().Last();
+                if (segment)
+                    delete segment;
+                
+                segment = (DoodleSegment *)node->Data();
+                delete node;
+                
+                doc->Modify(TRUE);
+                doc->UpdateAllViews();
+            }
+            break;
+        }
     case DOODLE_ADD:
     case DOODLE_ADD:
-    {
-      doc->GetDoodleSegments().Append(new DoodleSegment(*segment));
-      doc->Modify(TRUE);
-      doc->UpdateAllViews();
-      break;
+        {
+            doc->GetDoodleSegments().Append(new DoodleSegment(*segment));
+            doc->Modify(TRUE);
+            doc->UpdateAllViews();
+            break;
+        }
     }
     }
-  }
-  return TRUE;
+    return TRUE;
 }
 
 bool DrawingCommand::Undo(void)
 {
 }
 
 bool DrawingCommand::Undo(void)
 {
-  switch (cmd)
-  {
-    case DOODLE_CUT:
+    switch (cmd)
     {
     {
-      // Paste the segment
-      if (segment)
-      {
-        doc->GetDoodleSegments().Append(segment);
-        doc->Modify(TRUE);
-        doc->UpdateAllViews();
-        segment = NULL;
-      }
-      doc->Modify(TRUE);
-      doc->UpdateAllViews();
-      break;
-    }
+    case DOODLE_CUT:
+        {
+            // Paste the segment
+            if (segment)
+            {
+                doc->GetDoodleSegments().Append(segment);
+                doc->Modify(TRUE);
+                doc->UpdateAllViews();
+                segment = (DoodleSegment *) NULL;
+            }
+            doc->Modify(TRUE);
+            doc->UpdateAllViews();
+            break;
+        }
     case DOODLE_ADD:
     case DOODLE_ADD:
-    {
-      // Cut the last segment
-      if (doc->GetDoodleSegments().Number() > 0)
-      {
-        wxNode *node = doc->GetDoodleSegments().Last();
-        DoodleSegment *seg = (DoodleSegment *)node->Data();
-        delete seg;
-        delete node;
-
-        doc->Modify(TRUE);
-        doc->UpdateAllViews();
-      }
+        {
+            // Cut the last segment
+            if (doc->GetDoodleSegments().Number() > 0)
+            {
+                wxNode *node = doc->GetDoodleSegments().Last();
+                DoodleSegment *seg = (DoodleSegment *)node->Data();
+                delete seg;
+                delete node;
+                
+                doc->Modify(TRUE);
+                doc->UpdateAllViews();
+            }
+        }
     }
     }
-  }
-  return TRUE;
+    return TRUE;
 }
 
 IMPLEMENT_DYNAMIC_CLASS(TextEditDocument, wxDocument)
 }
 
 IMPLEMENT_DYNAMIC_CLASS(TextEditDocument, wxDocument)
@@ -234,7 +338,7 @@ IMPLEMENT_DYNAMIC_CLASS(TextEditDocument, wxDocument)
 bool TextEditDocument::OnSaveDocument(const wxString& filename)
 {
     TextEditView *view = (TextEditView *)GetFirstView();
 bool TextEditDocument::OnSaveDocument(const wxString& filename)
 {
     TextEditView *view = (TextEditView *)GetFirstView();
-
+    
     if (!view->textsw->SaveFile(filename))
         return FALSE;
     Modify(FALSE);
     if (!view->textsw->SaveFile(filename))
         return FALSE;
     Modify(FALSE);
@@ -246,7 +350,7 @@ bool TextEditDocument::OnOpenDocument(const wxString& filename)
     TextEditView *view = (TextEditView *)GetFirstView();
     if (!view->textsw->LoadFile(filename))
         return FALSE;
     TextEditView *view = (TextEditView *)GetFirstView();
     if (!view->textsw->LoadFile(filename))
         return FALSE;
-
+    
     SetFilename(filename, TRUE);
     Modify(FALSE);
     UpdateAllViews();
     SetFilename(filename, TRUE);
     Modify(FALSE);
     UpdateAllViews();
@@ -255,21 +359,21 @@ bool TextEditDocument::OnOpenDocument(const wxString& filename)
 
 bool TextEditDocument::IsModified(void) const
 {
 
 bool TextEditDocument::IsModified(void) const
 {
-  TextEditView *view = (TextEditView *)GetFirstView();
-  if (view)
-  {
-    return (wxDocument::IsModified() || view->textsw->Modified());
-  }
-  else
-    return wxDocument::IsModified();
+    TextEditView *view = (TextEditView *)GetFirstView();
+    if (view)
+    {
+        return (wxDocument::IsModified() || view->textsw->IsModified());
+    }
+    else
+        return wxDocument::IsModified();
 }
 
 void TextEditDocument::Modify(bool mod)
 {
 }
 
 void TextEditDocument::Modify(bool mod)
 {
-  TextEditView *view = (TextEditView *)GetFirstView();
-
-  wxDocument::Modify(mod);
-
-  if (!mod && view && view->textsw)
-    view->textsw->DiscardEdits();
+    TextEditView *view = (TextEditView *)GetFirstView();
+    
+    wxDocument::Modify(mod);
+    
+    if (!mod && view && view->textsw)
+        view->textsw->DiscardEdits();
 }
 }