From cac69ad60a6bf6df341e65e3309b7700e14741df Mon Sep 17 00:00:00 2001 From: PHO Date: Mon, 29 Sep 2014 15:44:46 +0900 Subject: [PATCH] initial commit --- .gitignore | 1 + build.sbt | 8 ++ project/plugin.sbt | 7 ++ .../scala/jp/ymir/taskReporter/Main.scala | 29 +++++++ .../jp/ymir/taskReporter/core/ReportSet.scala | 14 ++++ .../jp/ymir/taskReporter/ui/MainFrame.scala | 83 +++++++++++++++++++ 6 files changed, 142 insertions(+) create mode 100644 .gitignore create mode 100644 build.sbt create mode 100644 project/plugin.sbt create mode 100644 src/main/scala/jp/ymir/taskReporter/Main.scala create mode 100644 src/main/scala/jp/ymir/taskReporter/core/ReportSet.scala create mode 100644 src/main/scala/jp/ymir/taskReporter/ui/MainFrame.scala diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..eb5a316 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +target diff --git a/build.sbt b/build.sbt new file mode 100644 index 0000000..db126ad --- /dev/null +++ b/build.sbt @@ -0,0 +1,8 @@ +name := "task-reporter" + +version := "0.0.1" + +libraryDependencies <+= + scalaVersion { "org.scala-lang" % "scala-swing" % _ } + +assemblySettings diff --git a/project/plugin.sbt b/project/plugin.sbt new file mode 100644 index 0000000..f1b8d42 --- /dev/null +++ b/project/plugin.sbt @@ -0,0 +1,7 @@ +resolvers += + Resolver.url( + "artifactory", + url("http://scalasbt.artifactoryonline.com/scalasbt/sbt-plugin-releases") + )(Resolver.ivyStylePatterns) + +addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.11.2") diff --git a/src/main/scala/jp/ymir/taskReporter/Main.scala b/src/main/scala/jp/ymir/taskReporter/Main.scala new file mode 100644 index 0000000..7f05460 --- /dev/null +++ b/src/main/scala/jp/ymir/taskReporter/Main.scala @@ -0,0 +1,29 @@ +package jp.ymir.taskReporter +import java.io._ +import javax.swing._ +import jp.ymir.taskReporter.ui._ + +object Main { + def getVersion : String = { + // FIXME: Read it from the MANIFEST.MF + return "0.0.1" + } + + def main(args: Array[String]) { + try { + // FIXME: Provide a way to configure this. + UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel") + JFrame.setDefaultLookAndFeelDecorated(true) + JDialog.setDefaultLookAndFeelDecorated(true) + } + catch { + case e: Exception => + e.printStackTrace + } + + args.length match { + case 0 => new MainFrame(None) + case 1 => new MainFrame(Some(new File(args(0)))) + } + } +} diff --git a/src/main/scala/jp/ymir/taskReporter/core/ReportSet.scala b/src/main/scala/jp/ymir/taskReporter/core/ReportSet.scala new file mode 100644 index 0000000..f4392b7 --- /dev/null +++ b/src/main/scala/jp/ymir/taskReporter/core/ReportSet.scala @@ -0,0 +1,14 @@ +package jp.ymir.taskReporter.core +import java.io._; + +class ReportSet(private var _file: Option[File]) { + private var _dirty : Boolean = false + + def file: Option[File] = { + return _file + } + + def dirty: Boolean = { + return _dirty + } +} diff --git a/src/main/scala/jp/ymir/taskReporter/ui/MainFrame.scala b/src/main/scala/jp/ymir/taskReporter/ui/MainFrame.scala new file mode 100644 index 0000000..4b31c01 --- /dev/null +++ b/src/main/scala/jp/ymir/taskReporter/ui/MainFrame.scala @@ -0,0 +1,83 @@ +package jp.ymir.taskReporter.ui +import java.awt.Dimension +import java.io._ +import javax.swing.JOptionPane +import javax.swing.KeyStroke +import javax.swing.event.MenuListener +import javax.swing.event.MenuEvent +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) + + title = "Task Reporter" + Main.getVersion + + // FIXME: Provide a way to configure this. + size = new Dimension(640, 480) + 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 _ => + } + } + else { + dispose + } + } + + def dirty : Boolean = { + return reportSet.dirty + } + + menuBar = new MenuBar { + contents += new Menu("File") { + mnemonic = Key.F + + contents += new MenuItem(new Action("Open...") { + accelerator = Some(KeyStroke.getKeyStroke("control O")) + def apply { + // FIXME + } + }) + + val save = new MenuItem(new Action("Save") { + accelerator = Some(KeyStroke.getKeyStroke("control S")); + def apply { + // FIXME + } + }) + contents += save + peer.addMenuListener(new MenuListener { + def menuSelected(e: MenuEvent) { + save.enabled = dirty + save.text = + if (reportSet.file.isEmpty) + "Save..." + else + "Save" + } + def menuDeselected(e: MenuEvent) {} + def menuCanceled(e: MenuEvent) {} + }) + } + } + + visible = true +} -- 2.40.0