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