Scala2.8のSwingでエディタ

Scala@東北 第1回BootCamp&HackathonでのHackathonでScala2.8のSwingでシンプルなエディタを作ってみました。
ファイル関係の開く、保存等のメニュー以外はまだ未実装です。
メニューアイテムへのダイレクトショートカットキーが、MacではControllキーがコマンドキーになるので、Java Development Guide for Mac OS Xを参考に対応してみました。
以下コード

import scala.swing._
import scala.swing.event._
import scala.swing.Swing._
import scala.swing.FileChooser.Result._
import java.awt.event.{KeyEvent=>JKeyEvent,InputEvent=>JInputEvent}
import java.awt.Toolkit.getDefaultToolkit
import java.io.{File,FileOutputStream,OutputStreamWriter,BufferedWriter}
import javax.swing.{KeyStroke,UIManager}
import javax.swing.filechooser.FileNameExtensionFilter

object SPlainEditor extends SimpleSwingApplication {

  UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName)
  def top = new  MainFrame {
    title = "ScalaPlainEditor"
    //Macでは、コントロールキーがコマンドキーに変わる。Macでもキーボードショートカットが
    //使えるように用意
    val mask =  getDefaultToolkit.getMenuShortcutKeyMask
    val textArea = new TextArea
    var editFile:File = _

    val scrollPane = new ScrollPane{
      viewportView = textArea
      import ScrollPane.BarPolicy._
      verticalScrollBarPolicy= Always
    }

    def fileChooser(f:File = null) = {
      new FileChooser(f) {
        fileFilter = new FileNameExtensionFilter("テキストファイル", "txt")
      }
    }

    def saveFile(f:FileChooser):Unit ={
      f.showSaveDialog(null) match {
        case Approve =>{
            val file = f.selectedFile
            if (file.exists){
              Dialog.showConfirmation(null,
                                      "ファイル「%s」は存在します\n上書きしますか?".format(file.getName),
                                      "ファイル保存") match {
                case Dialog.Result.No => return
                case _ => 
              }
            }
            val buf = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file),"UTF-8"))
            buf.write(textArea.text);
            buf.flush
            buf.close 
          }
        case _=>
      }
    }
    val newFileAction = new Action("新規(N)") {
      accelerator = Some(KeyStroke.getKeyStroke(JKeyEvent.VK_N,mask))
      mnemonic = JKeyEvent.VK_N
      def apply() {
        editFile = null
        textArea.text =""
      }
    }
    val openFileAction = new Action("開く(O)") {
      accelerator = Some(KeyStroke.getKeyStroke(JKeyEvent.VK_O, mask))
      mnemonic = JKeyEvent.VK_O
      def apply(){
        val chooser = fileChooser(editFile)
        chooser.selectedFile = editFile
        chooser.showOpenDialog(null) match {
          case Approve => {
              editFile = chooser.selectedFile
              import scala.io._
              val src = Source.fromFile(chooser.selectedFile,"UTF-8")  //UTF-8決めうち
              textArea.text = src.getLines.mkString("\n")
              src.close
            }
          case _ =>
        }
      }
    }
    val saveAction = new Action("保存(S)") {
      accelerator = Some(KeyStroke.getKeyStroke(JKeyEvent.VK_S, mask))
      mnemonic = JKeyEvent.VK_S
      def apply() { 
        val chooser = fileChooser(editFile)
        chooser.selectedFile = editFile
        saveFile(chooser)
      }
    }
    val saveAsAction = new Action("別名で保存..."){
      accelerator = Some(KeyStroke.getKeyStroke(JKeyEvent.VK_S, (JInputEvent.SHIFT_DOWN_MASK | (mask))))
//      mnemonic = JKeyEvent.VK_S
      def apply(){
        val chooser = fileChooser(editFile)
        saveFile(chooser)
      }
    }
    //Macの場合は上部にシステムデフォルトが出ているので盲腸。
    val exitAction = new Action("終了(Q)") {
      accelerator = Some(KeyStroke.getKeyStroke(JKeyEvent.VK_Q, mask))
      mnemonic = JKeyEvent.VK_Q
      def apply() { exit }
    }
    contents = new BorderPanel {
      import BorderPanel.Position._
      add(scrollPane, Center)
    }
    menuBar = new MenuBar{
      contents += new Menu("ファイル(F)"){
        //不要?
        mnemonic = Key.F
        contents += new MenuItem(newFileAction)
        contents += new MenuItem(openFileAction)
        contents += new MenuItem(saveAction)
        contents += new MenuItem(saveAsAction)
        contents += new MenuItem("印刷")
        contents += new MenuItem(exitAction)
      }
      contents += new Menu("編集(E)")
      contents += new Menu("表示(V)")
      contents += new Menu("ヘルプ(H)"){
        contents += new MenuItem(title+"について")
      }
    }
    size = (600,500);
  }
}

できあがりはこんな感じ。

作成に当たっては途中より下記サイトを参考にさせていただきました。
最初Java+エディタでなぜかググって、Scalaでエディタ作ってる人いないなあと思いながら、JavaのSwingで書かれたコードを参考に書いていっていたのでした。
もっと早く気づいていれば・・・