X-Git-Url: http://git.cielonegro.org/gitweb.cgi?a=blobdiff_plain;f=src%2Fmain%2Fscala%2Fjp%2Fymir%2FtaskReporter%2Fui%2FMainFrame.scala;h=d59493b8f93b33020b282f8ace109bd3ca82a329;hb=9a2bae84c21afd16791243f5c36f52e3a283712f;hp=3759437c664d32886a537faa6705fe0b79fdae03;hpb=f35a6ee198f3f2dba8dc60ae969c4ce1c5c8c22b;p=task-reporter.git diff --git a/src/main/scala/jp/ymir/taskReporter/ui/MainFrame.scala b/src/main/scala/jp/ymir/taskReporter/ui/MainFrame.scala index 3759437..d59493b 100644 --- a/src/main/scala/jp/ymir/taskReporter/ui/MainFrame.scala +++ b/src/main/scala/jp/ymir/taskReporter/ui/MainFrame.scala @@ -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,12 +16,18 @@ import scala.swing._ import scala.swing.event._ class MainFrame(reportFile: Option[File]) extends Frame { - private var reportSet = new ReportSet(reportFile) + frame => - title = "Task Reporter " + Main.getVersion + private val reportSet = new ReportSet(reportFile) - size = Preferences.mainFrameSize() - centerOnScreen + title = "Task Reporter " + Main.getVersion + preferredSize = Preferences.mainFrameSize() + + case class FileOpened(file: File) extends Event + case class ReportSelected(report: Report) extends Event + case class ReportDeselected() extends Event + case class TaskSelected(task: Task) extends Event + case class TaskDeselected() extends Event peer.addComponentListener(new ComponentAdapter() { override def componentResized(e: ComponentEvent) { @@ -28,65 +35,12 @@ class MainFrame(reportFile: Option[File]) extends Frame { } }) - 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 - } - menuBar = new MenuBar { contents += new Menu("File") { mnemonic = Key.F val miOpen = new MenuItem(new Action("Open...") { - accelerator = Some(KeyStroke.getKeyStroke("control O")) + accelerator = Some(KeyStroke getKeyStroke "control O") def apply { val chooser = new FileChooser(Preferences.lastChosenDir()) { fileSelectionMode = FileChooser.SelectionMode.FilesOnly @@ -96,8 +50,10 @@ 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)) + val file = chooser.selectedFile + Preferences.lastChosenDir() = file.getParentFile + reportSet load file + frame publish FileOpened(file) } } }) @@ -134,25 +90,146 @@ class MainFrame(reportFile: Option[File]) extends Frame { contents = new SplitPane { peer.setOrientation(JSplitPane.HORIZONTAL_SPLIT) - resizeWeight = 0.3 + continuousLayout = true + oneTouchExpandable = true + resizeWeight = 0 // Let the left pane be fixed + + rightComponent = new SplitPane { + peer.setOrientation(JSplitPane.VERTICAL_SPLIT) + continuousLayout = true + oneTouchExpandable = true + resizeWeight = 0.5 + + leftComponent = new ScrollPane( + new Table() { + peer setFillsViewportHeight true + listenTo(frame) + + override def model : Report = super.model.asInstanceOf[Report] + + reactions += { + case ReportSelected(report) => + model = report + if (rowCount > 0) { + selection.rows += rowCount - 1 // Select the last report + } + case ReportDeselected() => + model = new Report() // Empty report + } + + selection.reactions += { + case TableRowsSelected(_, _, false) => + selection.rows.size match { + case 1 => + val task = model(selection.rows.head) + frame publish TaskSelected(task) + case _ => + frame publish TaskDeselected() + } + } + }) + } 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 reportsScroll = new ScrollPane( + new Table() { + peer setFillsViewportHeight true + peer setModel reportSet + listenTo(frame) + reactions += { + case FileOpened(f) => + if (rowCount > 0) { + selection.rows += rowCount - 1 // Select the last report + } + } + selection.reactions += { + case TableRowsSelected(_, _, false) => + selection.rows.size match { + case 1 => + val report = reportSet(selection.rows.head) + frame publish ReportSelected(report) + case _ => + frame publish ReportDeselected() + } + } + }) + layout(reportsScroll) = BorderPanel.Position.Center + + val buttons = new FlowPanel(FlowPanel.Alignment.Left)() { + contents += new Button(new Action("Add") { + def apply = {} // FIXME + }) + contents += new Button(new Action("Delete...") { + def apply = {} // FIXME + }) } - layout(scroll) = BorderPanel.Position.Center + layout(buttons) = BorderPanel.Position.South + + preferredSize = minimumSize } } + reportSet.file match { + case Some(file) => frame publish FileOpened(file) + case None => frame publish ReportDeselected() + } + + centerOnScreen 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.save(chooser.selectedFile) + } + else { + reportSet.save + } + } }