]> gitweb @ CieloNegro.org - task-reporter.git/commitdiff
wip
authorPHO <pho@cielonegro.org>
Sun, 5 Oct 2014 09:32:45 +0000 (18:32 +0900)
committerPHO <pho@cielonegro.org>
Sun, 5 Oct 2014 09:32:45 +0000 (18:32 +0900)
.gitignore
src/main/scala/jp/ymir/taskReporter/core/Report.scala
src/main/scala/jp/ymir/taskReporter/core/ReportSet.scala
src/main/scala/jp/ymir/taskReporter/ui/MainFrame.scala

index eb5a316cbd195d26e3f768c7dd8e1b47299e17f8..404053b347103f14cd1465129e85be716fc009f9 100644 (file)
@@ -1 +1,2 @@
 target
+*.tsv
index 5fa1ceb4efa3e845b3768077972bc5f2cdd39c17..54942607e052fbf6dc44c7bac7ddbe739098abba 100644 (file)
@@ -1,14 +1,21 @@
 package jp.ymir.taskReporter.core
 import java.util.Calendar
+import java.text.SimpleDateFormat
 import scala.collection.immutable._
 
 class Report(private val _date: Calendar) {
   private var _tasks : Seq[Task] = Vector()
 
-  def date = _date
+  def date : Calendar = _date
+  def size : Int      = _tasks.size
 
   def +=(task: Task) {
     require(task.date == _date)
     _tasks = _tasks :+ task
   }
+
+  def dateString : String = {
+    val fmt = new SimpleDateFormat("yyyy-MM-dd")
+    fmt.format(_date.getTime)
+  }
 }
index 0bbd67276261c34bf6d645337ef1708c2ecc5987..f90071dd1c65a74b584eda74969aa176bac8724e 100644 (file)
@@ -1,38 +1,75 @@
 package jp.ymir.taskReporter.core
 import java.io._
 import java.util.Calendar
+import javax.swing.table.AbstractTableModel
 import jp.ymir.taskReporter.core._
 import scala.collection.immutable._
 import scala.io._
 
-class ReportSet(private var _file: Option[File]) {
-  private var _dirty = false
+class ReportSet(private var _file: Option[File])
+    extends AbstractTableModel {
+
   private var _reports : SortedMap[Calendar, Report] = TreeMap()
+  private var _dirty = false
+
+  _file match {
+    case Some(file) => load(file)
+    case None =>
+  }
+
+  def load(file: File) {
+    var reports = _reports.empty
+    val src     = Source.fromFile(file, "UTF-8")
 
-  if (!_file.isEmpty) {
-    val src = Source.fromFile(_file.get, "UTF-8")
     for (line <- src.getLines) {
       if (!line.isEmpty) {
         val task = new Task(line)
-        if (_reports.isDefinedAt(task.date)) {
-          _reports(task.date) += task
+        if (reports.isDefinedAt(task.date)) {
+          reports(task.date) += task
         }
         else {
           val report = new Report(task.date)
-          report += task
-          _reports = _reports + (report.date -> report)
+          report  += task
+          reports += (report.date -> report)
         }
       }
     }
-  }
 
-  def file = _file
-  def file_=(f: Option[File]) { _file = f }
+    _file    = Some(file)
+    _reports = reports
+    _dirty   = false
+    fireTableDataChanged
+  }
 
+  def file  = _file
   def dirty = _dirty
 
+  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"
+    }
+  }
+
+  def getValueAt(row: Int, column: Int) : Object = {
+    // THINKME: Any better way than this?
+    val report = _reports.values.toIndexedSeq(row)
+    column match {
+      case 0 => report.dateString
+      case 1 => report.size : Integer
+    }
+  }
 }
index 957afae23826dbf8ee6b8ba8e84b273cbd58e9ab..94897af964a7dd3920c1286603d7eca46034705f 100644 (file)
@@ -3,6 +3,7 @@ import java.awt.Dimension
 import java.awt.event.ComponentAdapter
 import java.awt.event.ComponentEvent
 import java.io._
+import javax.swing.BorderFactory
 import javax.swing.JOptionPane
 import javax.swing.JSplitPane
 import javax.swing.KeyStroke
@@ -15,7 +16,7 @@ import scala.swing._
 import scala.swing.event._
 
 class MainFrame(reportFile: Option[File]) extends Frame {
-  private var reportSet = new ReportSet(reportFile)
+  private val reportSet = new ReportSet(reportFile)
 
   title         = "Task Reporter " + Main.getVersion
   preferredSize = Preferences.mainFrameSize()
@@ -42,7 +43,7 @@ class MainFrame(reportFile: Option[File]) extends Frame {
           val r = chooser.showOpenDialog(null)
           if (r == FileChooser.Result.Approve) {
             Preferences.lastChosenDir() = chooser.selectedFile.getParentFile
-            reportSet = new ReportSet(Some(chooser.selectedFile))
+            reportSet.load(chooser.selectedFile)
           }
         }
       })
@@ -77,27 +78,26 @@ class MainFrame(reportFile: Option[File]) extends Frame {
     }
   }
 
-  contents = new SplitPane {
+  val rootSplit = new SplitPane {
     peer.setOrientation(JSplitPane.HORIZONTAL_SPLIT)
-    resizeWeight = 0.3
+    continuousLayout   = true
+    oneTouchExpandable = true
+    resizeWeight       = 0.3
 
     leftComponent = new BorderPanel {
-      val title = new Label("Report date") {
-        horizontalAlignment = Alignment.Leading
-      }
-      layout(title) = BorderPanel.Position.North
-
-      val scroll = new ScrollPane {
-        horizontalScrollBarPolicy = ScrollPane.BarPolicy.Never
-        verticalScrollBarPolicy   = ScrollPane.BarPolicy.Always
-        contents = new ListView[String] {
-          // FIXME
-          // listData =
-        }
-      }
+      border = BorderFactory.createEmptyBorder(5, 5, 5, 5)
+
+      val scroll = new ScrollPane(
+        new Table() {
+          peer.setModel(reportSet)
+        })
       layout(scroll) = BorderPanel.Position.Center
     }
   }
+  contents = rootSplit
+
+  // This can only be done after putting the pane on the frame.
+  rootSplit.dividerLocation = 0.3
 
   centerOnScreen
   visible = true
@@ -149,9 +149,10 @@ class MainFrame(reportFile: Option[File]) extends Frame {
       }
 
       Preferences.lastChosenDir() = chooser.selectedFile.getParentFile
-      reportSet.file = Some(chooser.selectedFile)
+      reportSet.save(chooser.selectedFile)
+    }
+    else {
+      reportSet.save
     }
-
-    reportSet.save
   }
 }