]> 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           }
48         }
49       })
50       contents += miOpen
51
52       val miSave = new MenuItem(new Action("Save") {
53         accelerator = Some(KeyStroke.getKeyStroke("control S"));
54         def apply = save
55       })
56       contents += miSave
57
58       contents += new Separator
59
60       contents += new MenuItem(new Action("Quit") {
61         accelerator = Some(KeyStroke.getKeyStroke("control Q"))
62         def apply = closeOperation
63       })
64
65       peer.addMenuListener(new MenuListener {
66         def menuSelected(e: MenuEvent) {
67           miOpen.enabled = !dirty
68           miSave.enabled = dirty
69           miSave.text    =
70             if (reportSet.file.isEmpty)
71               "Save..."
72             else
73               "Save"
74         }
75         def menuDeselected(e: MenuEvent) {}
76         def menuCanceled(e: MenuEvent) {}
77       })
78     }
79   }
80
81   val rootSplit = new SplitPane {
82     peer.setOrientation(JSplitPane.HORIZONTAL_SPLIT)
83     continuousLayout   = true
84     oneTouchExpandable = true
85     resizeWeight       = 0.3
86
87     leftComponent = new BorderPanel {
88       border = BorderFactory.createEmptyBorder(5, 5, 5, 5)
89
90       val scroll = new ScrollPane(
91         new Table() {
92           peer.setModel(reportSet)
93         })
94       layout(scroll) = BorderPanel.Position.Center
95     }
96   }
97   contents = rootSplit
98
99   // This can only be done after putting the pane on the frame.
100   rootSplit.dividerLocation = 0.3
101
102   centerOnScreen
103   visible = true
104
105   override def closeOperation {
106     if (dirty) {
107       val r = JOptionPane.showConfirmDialog(
108         peer,
109         "The report file \"" + reportSet.file.get.getName + "\" has been modified.\n" +
110           "Do you want to save it before closing?",
111         "Confirmation",
112         JOptionPane.YES_NO_CANCEL_OPTION);
113
114       r match {
115         case JOptionPane.YES_OPTION => save; dispose
116         case JOptionPane.NO_OPTION  => dispose
117         case _ =>
118       }
119     }
120     else {
121       dispose
122     }
123   }
124
125   def dirty : Boolean = {
126     return reportSet.dirty
127   }
128
129   def save {
130     if (reportSet.file.isEmpty) {
131       val chooser = new FileChooser(Preferences.lastChosenDir())
132       val r = chooser.showSaveDialog(null)
133       if (r != FileChooser.Result.Approve) {
134         return
135       }
136
137       if (chooser.selectedFile.exists) {
138         val r = JOptionPane.showConfirmDialog(
139           peer,
140           "The chosen file or directory \"" + chooser.selectedFile.getName + "\" already exists.\n" +
141             "Do you want to overwrite it?",
142           "Confirmation",
143           JOptionPane.YES_NO_OPTION)
144
145         r match {
146           case JOptionPane.YES_OPTION =>
147           case JOptionPane.NO_OPTION  => return
148         }
149       }
150
151       Preferences.lastChosenDir() = chooser.selectedFile.getParentFile
152       reportSet.save(chooser.selectedFile)
153     }
154     else {
155       reportSet.save
156     }
157   }
158 }