+ private var _reports : SortedMap[Calendar, Report] = TreeMap()
+ private var _dirty = false
+
+ _file.foreach { file => load(file) }
+
+ def load(file: File) {
+ import Task._
+
+ var reports = _reports.empty
+ val src = Source.fromFile(file, "UTF-8")
+
+ LTSV.decode[Task](src.mkString).foreach { task =>
+ if (reports.isDefinedAt(task.date)) {
+ reports(task.date) += task
+ }
+ else {
+ val report = new Report(task.date)
+ report += task
+ reports += (report.date -> report)
+ }
+ }
+
+ _file = Some(file)
+ _reports = reports
+ _dirty = false
+ fireTableDataChanged
+ }
+
+ def file = _file
+ def dirty = _dirty
+
+ def apply(n: Int) : Report =
+ // THINKME: Any better way than this?
+ _reports.values.toIndexedSeq(n)
+
+ def save(file: File) {
+ _file = Some(file); save
+ }
+ def save {
+ // FIXME
+ _dirty = false
+ }
+
+ /* Method definitions for AbstractTableModel
+ */
+ def getColumnCount = 2
+ def getRowCount = _reports.size
+
+ override def getColumnName(column: Int) : String = {
+ column match {
+ case 0 => "Date"
+ case 1 => "# Tasks"
+ }