最近のProcessingには通常のモードに加えて、JavaScriptモードやAndroidモードなど様々なモードが付いている。またツールバーのモードのプルダウンメニューから「Add Mode…」で、標準以外のモードも追加することができるようになっている。
モードといっても動作は様々で、JavaScriptモードはスケッチのソースを通常のJavaモードと同じくJavaの文法で書いて、実行した時やエクスポート時にブラウザ上で動くコードを出力するようになっている。どうやってブラウザで動しているかというと、エクスポート時にはProcessingのコードをコンパイルせずにそのままhtmlに埋め込んでいて、ブラウザで読み込んだ時にProcessing.jsを使ってJavaScript上でコンパイル、実行している。
Pythonモードでは、スケッチ上でコードをPythonで書いて、実行するとPythonのコードがそのままJythonに渡されて、JythonからPAppletなどを呼び出して動作している。
という機能があるので、自分で独自のモードを追加したい。がProcessingのWikiを見てもそういう情報はない。なのでソースを参考にしつつ勝手にやってみる。
ディレクトリ構成
まず追加したいモードを、Processingが参照するディレクトリのmodes(Macの場合、~/Documents/Processing/modes)以下にディレクトリを作り、その中に必要なファイルを入れる。例えば新たに追加するモードをFoobarModeとした場合、
- FoobarMode/
- mode/
- FoobarMode.jar
- theme/
- mode.properties
- keywords.txt
- mode/
他にexamples/やformatter/というディレクトリが使われるが、なくても動くみたい。
クラスの実装
FoobarMode.jar には、FoobarMode
という、Modeクラスを継承したクラスを作り、抽象メソッドを実装する。実装する必要があるメソッドは、
getTitle
createEditor
getDefaultExtension
getExtensions
getIgnorable
createEditor
でEditorクラスを継承した実体を返す必要があって、楽をしてJavaEditorを拝借したいと思うのだけど、コンストラクタがprotected
になっていて外部から生成できないため、しかたがないのでそれも実装してやる。実装する必要があるメソッドは、
createToolbar
createFormatter
buildFileMenu
buildSketchMenu
handleImportLibrary
buildHelpMenu
getCommentPrefix
internalCloseRunner
deactivateRun
createFormatter
では、JavaモードのAutoFormatをとりあえずそのまま使える。
Javaのコンパイル時にjarファイルを指定する
上記のクラスをコンパイルするためには、Processingのクラスを参照する必要がある。Processingが実行時に使用しているjarファイルがどこかにあると思うので(Macの場合、/Applications/Processing.app/Contents/Java/pde.jar)、それをjavac -cp
で指定してやる:
$ javac -cp .../pde.jar ソースファイル |
以上でProcessingを再起動すると、モードのプルダウンメニューに新しいモードが追加される。実際に切り替えてみると、一応は動くが、エディタでなぜか改行が効かないけど…。また当然のことながら、実行はまだできない。