]> 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.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   preferredSize = Preferences.mainFrameSize()
22
23   peer.addComponentListener(new ComponentAdapter() {
24     override def componentResized(e: ComponentEvent) {
25       Preferences.mainFrameSize() = size
26     }
27   })
28
29   menuBar = new MenuBar {
30     contents += new Menu("File") {
31       mnemonic = Key.F
32
33       val miOpen = new MenuItem(new Action("Open...") {
34         accelerator = Some(KeyStroke.getKeyStroke("control O"))
35         def apply {
36           val chooser = new FileChooser(Preferences.lastChosenDir()) {
37             fileSelectionMode = FileChooser.SelectionMode.FilesOnly
38             fileFilter        = new FileNameExtensionFilter("TSV files", "tsv")
39             title             = "Select a report file to open..."
40             peer.setAcceptAllFileFilterUsed(false)
41           }
42           val r = chooser.showOpenDialog(null)
43           if (r == FileChooser.Result.Approve) {
44             Preferences.lastChosenDir() = chooser.selectedFile.getParentFile
45             reportSet = new ReportSet(Some(chooser.selectedFile))
46           }
47         }
48       })
49       contents += miOpen
50
51       val miSave = new MenuItem(new Action("Save") {
52         accelerator = Some(KeyStroke.getKeyStroke("control S"));
53         def apply = save
54       })
55       contents += miSave
56
57       contents += new Separator
58
59       contents += new MenuItem(new Action("Quit") {
60         accelerator = Some(KeyStroke.getKeyStroke("control Q"))
61         def apply = closeOperation
62       })
63
64       peer.addMenuListener(new MenuListener {
65         def menuSelected(e: MenuEvent) {
66           miOpen.enabled = !dirty
67           miSave.enabled = dirty
68           miSave.text    =
69             if (reportSet.file.isEmpty)
70               "Save..."
71             else
72               "Save"
73         }
74         def menuDeselected(e: MenuEvent) {}
75         def menuCanceled(e: MenuEvent) {}
76       })
77     }
78   }
79
80   contents = new SplitPane {
81     peer.setOrientation(JSplitPane.HORIZONTAL_SPLIT)
82     resizeWeight = 0.3
83
84     leftComponent = new BorderPanel {
85       val title = new Label("Report date") {
86         horizontalAlignment = Alignment.Leading
87       }
88       layout(title) = BorderPanel.Position.North
89
90       val scroll = new ScrollPane {
91         horizontalScrollBarPolicy = ScrollPane.BarPolicy.Never
92         verticalScrollBarPolicy   = ScrollPane.BarPolicy.Always
93         contents = new ListView[String] {
94           // FIXME
95           // listData =
96         }
97       }
98       layout(scroll) = BorderPanel.Position.Center
99     }
100   }
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.file = Some(chooser.selectedFile)
153     }
154
155     reportSet.save
156   }
157 }