]> gitweb @ CieloNegro.org - task-reporter.git/blob - src/main/scala/jp/ymir/taskReporter/ui/MainFrame.scala
24b60046b12b120358104e5dfb13d985e54041a6
[task-reporter.git] / src / main / scala / jp / ymir / taskReporter / ui / MainFrame.scala
1 package jp.ymir.taskReporter.ui
2 import java.awt.Dimension
3 import java.awt.event.ComponentAdapter
4 import java.awt.event.ComponentEvent
5 import java.io._
6 import javax.swing.JOptionPane
7 import javax.swing.KeyStroke
8 import javax.swing.event.MenuListener
9 import javax.swing.event.MenuEvent
10 import javax.swing.filechooser.FileNameExtensionFilter
11 import jp.ymir.taskReporter._
12 import jp.ymir.taskReporter.core._
13 import scala.swing._
14 import scala.swing.event._
15
16 class MainFrame(reportFile: Option[File]) extends Frame {
17   private var reportSet = new ReportSet(reportFile)
18
19   title = "Task Reporter " + Main.getVersion
20
21   size = Preferences.mainFrameSize()
22   centerOnScreen
23
24   peer.addComponentListener(new ComponentAdapter() {
25     override def componentResized(e: ComponentEvent) {
26       Preferences.mainFrameSize() = size
27     }
28   })
29
30   override def closeOperation {
31     if (dirty) {
32       val r = JOptionPane.showConfirmDialog(
33         peer,
34         "The report file \"" + reportSet.file.get.getName + "\" has been modified.\n" +
35           "Do you want to save it before closing?",
36         "Confirmation",
37         JOptionPane.YES_NO_CANCEL_OPTION);
38
39       r match {
40         case JOptionPane.YES_OPTION => save; dispose
41         case JOptionPane.NO_OPTION  => dispose
42         case _ =>
43       }
44     }
45     else {
46       dispose
47     }
48   }
49
50   def dirty : Boolean = {
51     return reportSet.dirty
52   }
53
54   def save {
55     if (reportSet.file.isEmpty) {
56       val chooser = new FileChooser(Preferences.lastChosenDir())
57       val r = chooser.showSaveDialog(null)
58       if (r != FileChooser.Result.Approve) {
59         return
60       }
61
62       if (chooser.selectedFile.exists) {
63         val r = JOptionPane.showConfirmDialog(
64           peer,
65           "The chosen file or directory \"" + chooser.selectedFile.getName + "\" already exists.\n" +
66             "Do you want to overwrite it?",
67           "Confirmation",
68           JOptionPane.YES_NO_OPTION)
69
70         r match {
71           case JOptionPane.YES_OPTION =>
72           case JOptionPane.NO_OPTION  => return
73         }
74       }
75
76       Preferences.lastChosenDir() = chooser.selectedFile.getParentFile
77       reportSet.file = Some(chooser.selectedFile)
78     }
79
80     reportSet.save
81   }
82
83   menuBar = new MenuBar {
84     contents += new Menu("File") {
85       mnemonic = Key.F
86
87       val miOpen = new MenuItem(new Action("Open...") {
88         accelerator = Some(KeyStroke.getKeyStroke("control O"))
89         def apply {
90           val chooser = new FileChooser(Preferences.lastChosenDir()) {
91             fileSelectionMode = FileChooser.SelectionMode.FilesOnly
92             fileFilter        = new FileNameExtensionFilter("TSV files", "tsv")
93             title             = "Select a report file to open..."
94             peer.setAcceptAllFileFilterUsed(false)
95           }
96           val r = chooser.showOpenDialog(null)
97           if (r == FileChooser.Result.Approve) {
98             Preferences.lastChosenDir() = chooser.selectedFile.getParentFile
99             reportSet = new ReportSet(Some(chooser.selectedFile))
100           }
101         }
102       })
103       contents += miOpen
104
105       val miSave = new MenuItem(new Action("Save") {
106         accelerator = Some(KeyStroke.getKeyStroke("control S"));
107         def apply { save }
108       })
109       contents += miSave
110
111       contents += new Separator
112
113       contents += new MenuItem(new Action("Quit") {
114         accelerator = Some(KeyStroke.getKeyStroke("control Q"))
115         def apply { closeOperation }
116       })
117
118       peer.addMenuListener(new MenuListener {
119         def menuSelected(e: MenuEvent) {
120           miOpen.enabled = !dirty
121           miSave.enabled = dirty
122           miSave.text    =
123             if (reportSet.file.isEmpty)
124               "Save..."
125             else
126               "Save"
127         }
128         def menuDeselected(e: MenuEvent) {}
129         def menuCanceled(e: MenuEvent) {}
130       })
131     }
132   }
133
134   visible = true
135 }