]> 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 match {
17     case Some(file) => load(file)
18     case None =>
19   }
20
21   def load(file: File) {
22     var reports = _reports.empty
23     val src     = Source.fromFile(file, "UTF-8")
24
25     for (line <- src.getLines) {
26       if (!line.isEmpty) {
27         val task = new Task(line)
28         if (reports.isDefinedAt(task.date)) {
29           reports(task.date) += task
30         }
31         else {
32           val report = new Report(task.date)
33           report  += task
34           reports += (report.date -> report)
35         }
36       }
37     }
38
39     _file    = Some(file)
40     _reports = reports
41     _dirty   = false
42     fireTableDataChanged
43   }
44
45   def file  = _file
46   def dirty = _dirty
47
48   def save(file: File) {
49     _file = Some(file); save
50   }
51   def save {
52     // FIXME
53     _dirty = false
54   }
55
56   /* Method definitions for AbstractTableModel
57    */
58   def getColumnCount = 2
59   def getRowCount    = _reports.size
60
61   override def getColumnName(column: Int) : String = {
62     column match {
63       case 0 => "Date"
64       case 1 => "# Tasks"
65     }
66   }
67
68   def getValueAt(row: Int, column: Int) : Object = {
69     // THINKME: Any better way than this?
70     val report = _reports.values.toIndexedSeq(row)
71     column match {
72       case 0 => report.dateString
73       case 1 => report.size : Integer
74     }
75   }
76 }