]> gitweb @ CieloNegro.org - task-reporter.git/blob - src/main/scala/jp/ymir/taskReporter/ui/MainFrame.scala
wip
[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.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._
15 import scala.swing._
16 import scala.swing.event._
17
18 class MainFrame(reportFile: Option[File]) extends Frame {
19   private val reportSet = new ReportSet(reportFile)
20
21   title         = "Task Reporter " + Main.getVersion
22   preferredSize = Preferences.mainFrameSize()
23
24   peer.addComponentListener(new ComponentAdapter() {
25     override def componentResized(e: ComponentEvent) {
26       Preferences.mainFrameSize() = size
27     }
28   })
29
30   menuBar = new MenuBar {
31     contents += new Menu("File") {
32       mnemonic = Key.F
33
34       val miOpen = new MenuItem(new Action("Open...") {
35         accelerator = Some(KeyStroke.getKeyStroke("control O"))
36         def apply {
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)
42           }
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
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     continuousLayout   = true
85     oneTouchExpandable = true
86     resizeWeight       = 0 // Let the left pane be fixed
87
88     rightComponent = new SplitPane {
89       peer.setOrientation(JSplitPane.VERTICAL_SPLIT)
90       continuousLayout   = true
91       oneTouchExpandable = true
92       resizeWeight       = 0.5
93
94       leftComponent = new ScrollPane(
95         new Table() {
96           peer.setModel(new Report()) // Empty report
97         })
98     }
99
100     leftComponent = new BorderPanel {
101       border = BorderFactory.createEmptyBorder(5, 5, 5, 5)
102
103       val reportsScroll = new ScrollPane(
104         new Table() {
105           peer.setModel(reportSet)
106           if (rowCount > 0) {
107             selection.rows += rowCount - 1 // Select the last report
108           }
109           selection.reactions += {
110             case TableRowsSelected(_, _, false) =>
111               // FIXME
112           }
113         })
114       layout(reportsScroll) = BorderPanel.Position.Center
115
116       val buttons = new FlowPanel(FlowPanel.Alignment.Left)() {
117         contents += new Button(new Action("Add") {
118           def apply = {} // FIXME
119         })
120         contents += new Button(new Action("Delete...") {
121           def apply = {} // FIXME
122         })
123       }
124       layout(buttons) = BorderPanel.Position.South
125
126       preferredSize = minimumSize
127     }
128   }
129
130   centerOnScreen
131   visible = true
132
133   override def closeOperation {
134     if (dirty) {
135       val r = JOptionPane.showConfirmDialog(
136         peer,
137         "The report file \"" + reportSet.file.get.getName + "\" has been modified.\n" +
138           "Do you want to save it before closing?",
139         "Confirmation",
140         JOptionPane.YES_NO_CANCEL_OPTION);
141
142       r match {
143         case JOptionPane.YES_OPTION => save; dispose
144         case JOptionPane.NO_OPTION  => dispose
145         case _ =>
146       }
147     }
148     else {
149       dispose
150     }
151   }
152
153   def dirty : Boolean = {
154     return reportSet.dirty
155   }
156
157   def save {
158     if (reportSet.file.isEmpty) {
159       val chooser = new FileChooser(Preferences.lastChosenDir())
160       val r = chooser.showSaveDialog(null)
161       if (r != FileChooser.Result.Approve) {
162         return
163       }
164
165       if (chooser.selectedFile.exists) {
166         val r = JOptionPane.showConfirmDialog(
167           peer,
168           "The chosen file or directory \"" + chooser.selectedFile.getName + "\" already exists.\n" +
169             "Do you want to overwrite it?",
170           "Confirmation",
171           JOptionPane.YES_NO_OPTION)
172
173         r match {
174           case JOptionPane.YES_OPTION =>
175           case JOptionPane.NO_OPTION  => return
176         }
177       }
178
179       Preferences.lastChosenDir() = chooser.selectedFile.getParentFile
180       reportSet.save(chooser.selectedFile)
181     }
182     else {
183       reportSet.save
184     }
185   }
186 }