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で書かれたコードを参考に書いていっていたのでした。
もっと早く気づいていれば・・・