1 package jp.ymir.taskReporter.ui
2 import java.awt.Dimension
3 import java.awt.event.ComponentAdapter
4 import java.awt.event.ComponentEvent
6 import javax.swing.BorderFactory
7 import javax.swing.JOptionPane
8 import javax.swing.JSplitPane
9 import javax.swing.KeyStroke
10 import javax.swing.event.MenuListener
11 import javax.swing.event.MenuEvent
12 import javax.swing.filechooser.FileNameExtensionFilter
13 import jp.ymir.taskReporter._
14 import jp.ymir.taskReporter.core._
16 import scala.swing.event._
18 class MainFrame(reportFile: Option[File]) extends Frame {
19 private val reportSet = new ReportSet(reportFile)
21 title = "Task Reporter " + Main.getVersion
22 preferredSize = Preferences.mainFrameSize()
24 peer.addComponentListener(new ComponentAdapter() {
25 override def componentResized(e: ComponentEvent) {
26 Preferences.mainFrameSize() = size
30 menuBar = new MenuBar {
31 contents += new Menu("File") {
34 val miOpen = new MenuItem(new Action("Open...") {
35 accelerator = Some(KeyStroke.getKeyStroke("control O"))
37 val chooser = new FileChooser(Preferences.lastChosenDir()) {
38 fileSelectionMode = FileChooser.SelectionMode.FilesOnly
39 fileFilter = new FileNameExtensionFilter("TSV files", "tsv")
40 title = "Select a report file to open..."
41 peer.setAcceptAllFileFilterUsed(false)
43 val r = chooser.showOpenDialog(null)
44 if (r == FileChooser.Result.Approve) {
45 Preferences.lastChosenDir() = chooser.selectedFile.getParentFile
46 reportSet.load(chooser.selectedFile)
47 // FIXME: select the last report
53 val miSave = new MenuItem(new Action("Save") {
54 accelerator = Some(KeyStroke.getKeyStroke("control S"));
59 contents += new Separator
61 contents += new MenuItem(new Action("Quit") {
62 accelerator = Some(KeyStroke.getKeyStroke("control Q"))
63 def apply = closeOperation
66 peer.addMenuListener(new MenuListener {
67 def menuSelected(e: MenuEvent) {
68 miOpen.enabled = !dirty
69 miSave.enabled = dirty
71 if (reportSet.file.isEmpty)
76 def menuDeselected(e: MenuEvent) {}
77 def menuCanceled(e: MenuEvent) {}
82 contents = new SplitPane {
83 peer.setOrientation(JSplitPane.HORIZONTAL_SPLIT)
84 continuousLayout = true
85 oneTouchExpandable = true
86 resizeWeight = 0 // Let the left pane be fixed
88 rightComponent = new SplitPane {
89 peer.setOrientation(JSplitPane.VERTICAL_SPLIT)
90 continuousLayout = true
91 oneTouchExpandable = true
94 leftComponent = new ScrollPane(
96 peer.setModel(new Report()) // Empty report
100 leftComponent = new BorderPanel {
101 border = BorderFactory.createEmptyBorder(5, 5, 5, 5)
103 val reportsScroll = new ScrollPane(
105 peer.setModel(reportSet)
107 selection.rows += rowCount - 1 // Select the last report
109 selection.reactions += {
110 case TableRowsSelected(_, _, false) =>
114 layout(reportsScroll) = BorderPanel.Position.Center
116 val buttons = new FlowPanel(FlowPanel.Alignment.Left)() {
117 contents += new Button(new Action("Add") {
118 def apply = {} // FIXME
120 contents += new Button(new Action("Delete...") {
121 def apply = {} // FIXME
124 layout(buttons) = BorderPanel.Position.South
126 preferredSize = minimumSize
133 override def closeOperation {
135 val r = JOptionPane.showConfirmDialog(
137 "The report file \"" + reportSet.file.get.getName + "\" has been modified.\n" +
138 "Do you want to save it before closing?",
140 JOptionPane.YES_NO_CANCEL_OPTION);
143 case JOptionPane.YES_OPTION => save; dispose
144 case JOptionPane.NO_OPTION => dispose
153 def dirty : Boolean = {
154 return reportSet.dirty
158 if (reportSet.file.isEmpty) {
159 val chooser = new FileChooser(Preferences.lastChosenDir())
160 val r = chooser.showSaveDialog(null)
161 if (r != FileChooser.Result.Approve) {
165 if (chooser.selectedFile.exists) {
166 val r = JOptionPane.showConfirmDialog(
168 "The chosen file or directory \"" + chooser.selectedFile.getName + "\" already exists.\n" +
169 "Do you want to overwrite it?",
171 JOptionPane.YES_NO_OPTION)
174 case JOptionPane.YES_OPTION =>
175 case JOptionPane.NO_OPTION => return
179 Preferences.lastChosenDir() = chooser.selectedFile.getParentFile
180 reportSet.save(chooser.selectedFile)