Changed file format to include dependency table.
[ttodo.git] / tddoc.cc
blobbd91841a1470c42f72b93f2424d05fbc670e25ad
1 // Copyright (c) 2006 by Mike Sharov <msharov@users.sourceforge.net>
2 //
3 // tddoc.cc
4 //
6 #include "tddoc.h"
7 #include <iff.h>
9 //----------------------------------------------------------------------
11 static const uint32_t c_RootItemId = 0;
12 static const iff::fmt_t fmt_TodoList = IFF_SFMT("TODO");
13 static const iff::fmt_t fmt_Item = IFF_SFMT("TITM");
14 static const iff::fmt_t fmt_Dep = IFF_SFMT("TDEP");
16 static const uint32_t c_CurrentVersion = 1;
18 //----------------------------------------------------------------------
20 class DLL_LOCAL CTodoHeader {
21 public:
22 inline CTodoHeader (void) : m_Version (c_CurrentVersion), m_Flags (0) { }
23 inline void read (istream& is) { is >> m_Version >> m_Flags; }
24 inline void write (ostream& os) const { os << m_Version << m_Flags; }
25 inline size_t stream_size (void) const { return (stream_size_of (m_Version) + stream_size_of (m_Flags)); }
26 public:
27 uint32_t m_Version; ///< File format's version number.
28 bitset<32> m_Flags; ///< Various flags. None for now.
31 STD_STREAMABLE (CTodoHeader)
33 //----------------------------------------------------------------------
35 /// Default constructor.
36 CTodoDocument::CTodoDocument (void)
37 : CDocument (),
38 m_Todos (),
39 m_Deps (),
40 m_Selection (SIZE_MAX),
41 m_ItemId (c_RootItemId)
45 /// Reads the object from stream \p is.
46 void CTodoDocument::read (istream& is)
48 CTodoHeader h;
49 iff::ReadChunk (is, h, fmt_TodoList);
50 iff::ReadVector (is, m_Todos, fmt_Item);
51 iff::ReadVector (is, m_Deps, fmt_Dep);
54 /// Writes the object to stream \p os.
55 void CTodoDocument::write (ostream& os) const
57 CTodoHeader h;
58 iff::WriteChunk (os, h, fmt_TodoList);
59 iff::WriteVector (os, m_Todos, fmt_Item);
60 iff::WriteVector (os, m_Deps, fmt_Dep);
63 /// Returns the size of the written object.
64 size_t CTodoDocument::stream_size (void) const
66 return (iff::chunk_size_of (CTodoHeader()) +
67 iff::vector_size_of (m_Todos) +
68 iff::vector_size_of (m_Deps));
71 void CTodoDocument::LoadData (void)
73 memblock buf;
74 buf.read_file (".todo");
75 istream is (buf);
76 read (is);
77 SetList (c_RootItemId);
78 SetSelection (0);
81 void CTodoDocument::SaveData (void) const
83 memblock buf (stream_size_of (*this));
84 ostream os (buf);
85 write (os);
86 buf.write_file (".todo");
89 void CTodoDocument::SetList (itemid_t lid)
91 m_ItemId = lid;
94 void CTodoDocument::UpdateCurrentEntry (rcentry_t e)
96 m_Todos[m_Selection] = e;
97 SetFlag (flag_Changed);
100 CTodoDocument::rcentry_t CTodoDocument::CurrentEntry (void) const
102 static const CTodoEntry s_NullEntry;
103 return (m_Selection < m_Todos.size() ? m_Todos[m_Selection] : s_NullEntry);
106 void CTodoDocument::RemoveCurrentEntry (void)
108 m_Todos.erase (m_Todos.iat (m_Selection));
109 SetSelection (min (m_Selection, uoff_t (m_Todos.size() - 1)));
112 void CTodoDocument::AppendEntry (void)
114 m_Todos.insert (m_Todos.iat (m_Selection + 1));
115 SetSelection (m_Selection + 1);
118 void CTodoDocument::MarkEntryComplete (void)
120 m_Todos[m_Selection].MarkComplete (!m_Todos[m_Selection].Complete() * 100);
121 SetSelection (m_Selection);