なんじゃくにっき

プログラミングの話題中心。

Scalaでメモ帳(2) Redo Undoを付けてみる

 昨日書いたScalaのメモ帳は最低限の機能しかなかったので、
Redo、Undo機能を付けてみた。
とは言ってもRedoManagerを使ってるだけっす。
 
 アプリケーション本体にではなくて、JTextPaneにUndo、Redoの機能を追加した。
どうもScalaでActionMapみたいなことをする方法が分からなかったので、javax.swing.AbstractActionを使ってる。
 
 

object ScalaTextEditor extends SimpleSwingApplication {
class UndoAction(title0: String) extends AbstractAction(title0: String) {
var undoManager: UndoManager = null
def this(manager: UndoManager) = {
this("undo")
undoManager = manager
}
def actionPerformed(e: ActionEvent) = {
try{
undoManager.undo()
} catch {
case e: CannotUndoException =>
}
}
}

class RedoAction(title0: String) extends AbstractAction(title0: String) {
var undoManager: UndoManager = null
def this(manager: UndoManager) = {
this("redo")
undoManager = manager
}
def actionPerformed(e: ActionEvent) = {
try{
undoManager.redo()
} catch {
case e: CannotRedoException =>
}
}
}

class TextPane extends Component {
override lazy val peer = new JTextPane {
val manager = new UndoManager
getDocument.addUndoableEditListener(manager)

val actionMap = getActionMap
actionMap.put("undo", new UndoAction(manager));
actionMap.put("redo", new RedoAction(manager));

val inputMap = getInputMap()
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_Z,
InputEvent.CTRL_DOWN_MASK), "undo");
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_Z,
InputEvent.CTRL_DOWN_MASK + InputEvent.SHIFT_DOWN_MASK), "redo");
}
}
//略