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