]> gitweb @ CieloNegro.org - task-reporter.git/blob - src/main/scala/jp/ymir/taskReporter/core/ReportSet.scala
wip
[task-reporter.git] / src / main / scala / jp / ymir / taskReporter / core / ReportSet.scala
1 package jp.ymir.taskReporter.core
2 import java.io._
3 import java.text.SimpleDateFormat
4 import java.util.Calendar
5 import javax.swing.table.AbstractTableModel
6 import jp.ymir.taskReporter.core._
7 import scala.collection.immutable._
8 import scala.io._
9
10 class ReportSet(private var _file: Option[File])
11     extends AbstractTableModel {
12
13   private var _reports : SortedMap[Calendar, Report] = TreeMap()
14   private var _dirty = false
15
16   _file.foreach { file => load(file) }
17
18   def load(file: File) {
19     var reports = _reports.empty
20     val src     = Source.fromFile(file, "UTF-8")
21
22     for (line <- src.getLines) {
23       if (!line.isEmpty) {
24         val task = new Task(line)
25         if (reports.isDefinedAt(task.date)) {
26           reports(task.date) += task
27         }
28         else {
29           val report = new Report(task.date)
30           report  += task
31           reports += (report.date -> report)
32         }
33       }
34     }
35
36     _file    = Some(file)
37     _reports = reports
38     _dirty   = false
39     fireTableDataChanged
40   }
41
42   def file  = _file
43   def dirty = _dirty
44
45   def apply(n: Int) : Report =
46     // THINKME: Any better way than this?
47     _reports.values.toIndexedSeq(n)
48
49   def save(file: File) {
50     _file = Some(file); save
51   }
52   def save {
53     // FIXME
54     _dirty = false
55   }
56
57   /* Method definitions for AbstractTableModel
58    */
59   def getColumnCount = 2
60   def getRowCount    = _reports.size
61
62   override def getColumnName(column: Int) : String = {
63     column match {
64       case 0 => "Date"
65       case 1 => "# Tasks"
66     }
67   }
68
69   def getValueAt(row: Int, column: Int) : Object = {
70     column match {
71       case 0 => this(row).dateString
72       case 1 => this(row).size : Integer
73     }
74   }
75 }