]> gitweb @ CieloNegro.org - task-reporter.git/blobdiff - src/main/scala/jp/ymir/taskReporter/ui/MainFrame.scala
wip
[task-reporter.git] / src / main / scala / jp / ymir / taskReporter / ui / MainFrame.scala
index 4b31c01270822fe6476d1756514a2a991e8245a2..4e7edbf578613c230a31676af9b46b7f9e110493 100644 (file)
@@ -1,73 +1,73 @@
 package jp.ymir.taskReporter.ui
 import java.awt.Dimension
+import java.awt.event.ComponentAdapter
+import java.awt.event.ComponentEvent
 import java.io._
 import javax.swing.JOptionPane
+import javax.swing.JSplitPane
 import javax.swing.KeyStroke
 import javax.swing.event.MenuListener
 import javax.swing.event.MenuEvent
+import javax.swing.filechooser.FileNameExtensionFilter
 import jp.ymir.taskReporter._
 import jp.ymir.taskReporter.core._
 import scala.swing._
 import scala.swing.event._
 
 class MainFrame(reportFile: Option[File]) extends Frame {
-  private val reportSet: ReportSet = new ReportSet(reportFile)
+  private var reportSet = new ReportSet(reportFile)
 
-  title = "Task Reporter" + Main.getVersion
+  title = "Task Reporter " + Main.getVersion
 
-  // FIXME: Provide a way to configure this.
-  size = new Dimension(640, 480)
+  size = Preferences.mainFrameSize()
   centerOnScreen
 
-  override def closeOperation {
-    if (dirty) {
-      val r = JOptionPane.showConfirmDialog(
-        peer,
-        "The report file \"" + reportSet.file.get.getName + "\" has been modified.\n" +
-          "Do you want to save it before closing?",
-        "Confirmation",
-        JOptionPane.YES_NO_CANCEL_OPTION);
-
-      r match {
-        case JOptionPane.YES_OPTION =>
-          // FIXME
-          dispose
-        case JOptionPane.NO_OPTION =>
-          dispose
-        case _ =>
-      }
+  peer.addComponentListener(new ComponentAdapter() {
+    override def componentResized(e: ComponentEvent) {
+      Preferences.mainFrameSize() = size
     }
-    else {
-      dispose
-    }
-  }
-
-  def dirty : Boolean = {
-    return reportSet.dirty
-  }
+  })
 
   menuBar = new MenuBar {
     contents += new Menu("File") {
       mnemonic = Key.F
 
-      contents += new MenuItem(new Action("Open...") {
+      val miOpen = new MenuItem(new Action("Open...") {
         accelerator = Some(KeyStroke.getKeyStroke("control O"))
         def apply {
-          // FIXME
+          val chooser = new FileChooser(Preferences.lastChosenDir()) {
+            fileSelectionMode = FileChooser.SelectionMode.FilesOnly
+            fileFilter        = new FileNameExtensionFilter("TSV files", "tsv")
+            title             = "Select a report file to open..."
+            peer.setAcceptAllFileFilterUsed(false)
+          }
+          val r = chooser.showOpenDialog(null)
+          if (r == FileChooser.Result.Approve) {
+            Preferences.lastChosenDir() = chooser.selectedFile.getParentFile
+            reportSet = new ReportSet(Some(chooser.selectedFile))
+          }
         }
       })
+      contents += miOpen
 
-      val save = new MenuItem(new Action("Save") {
+      val miSave = new MenuItem(new Action("Save") {
         accelerator = Some(KeyStroke.getKeyStroke("control S"));
-        def apply {
-          // FIXME
-        }
+        def apply = save
       })
-      contents += save
+      contents += miSave
+
+      contents += new Separator
+
+      contents += new MenuItem(new Action("Quit") {
+        accelerator = Some(KeyStroke.getKeyStroke("control Q"))
+        def apply = closeOperation
+      })
+
       peer.addMenuListener(new MenuListener {
         def menuSelected(e: MenuEvent) {
-          save.enabled = dirty
-          save.text    =
+          miOpen.enabled = !dirty
+          miSave.enabled = dirty
+          miSave.text    =
             if (reportSet.file.isEmpty)
               "Save..."
             else
@@ -79,5 +79,80 @@ class MainFrame(reportFile: Option[File]) extends Frame {
     }
   }
 
+  contents = new SplitPane {
+    peer.setOrientation(JSplitPane.HORIZONTAL_SPLIT)
+    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 =
+        }
+      }
+      layout(scroll) = BorderPanel.Position.Center
+    }
+  }
+
   visible = true
+
+  override def closeOperation {
+    if (dirty) {
+      val r = JOptionPane.showConfirmDialog(
+        peer,
+        "The report file \"" + reportSet.file.get.getName + "\" has been modified.\n" +
+          "Do you want to save it before closing?",
+        "Confirmation",
+        JOptionPane.YES_NO_CANCEL_OPTION);
+
+      r match {
+        case JOptionPane.YES_OPTION => save; dispose
+        case JOptionPane.NO_OPTION  => dispose
+        case _ =>
+      }
+    }
+    else {
+      dispose
+    }
+  }
+
+  def dirty : Boolean = {
+    return reportSet.dirty
+  }
+
+  def save {
+    if (reportSet.file.isEmpty) {
+      val chooser = new FileChooser(Preferences.lastChosenDir())
+      val r = chooser.showSaveDialog(null)
+      if (r != FileChooser.Result.Approve) {
+        return
+      }
+
+      if (chooser.selectedFile.exists) {
+        val r = JOptionPane.showConfirmDialog(
+          peer,
+          "The chosen file or directory \"" + chooser.selectedFile.getName + "\" already exists.\n" +
+            "Do you want to overwrite it?",
+          "Confirmation",
+          JOptionPane.YES_NO_OPTION)
+
+        r match {
+          case JOptionPane.YES_OPTION =>
+          case JOptionPane.NO_OPTION  => return
+        }
+      }
+
+      Preferences.lastChosenDir() = chooser.selectedFile.getParentFile
+      reportSet.file = Some(chooser.selectedFile)
+    }
+
+    reportSet.save
+  }
 }