Processingに独自のモードを追加する方法

2014-05-30

最近の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

他にexamples/やformatter/というディレクトリが使われるが、なくても動くみたい。

クラスの実装

FoobarMode.jar には、FoobarMode という、Modeクラスを継承したクラスを作り、抽象メソッドを実装する。実装する必要があるメソッドは、

  • getTitle
  • createEditor
  • getDefaultExtension
  • getExtensions
  • getIgnorable

createEditorEditorクラスを継承した実体を返す必要があって、楽をして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を再起動すると、モードのプルダウンメニューに新しいモードが追加される。実際に切り替えてみると、一応は動くが、エディタでなぜか改行が効かないけど…。また当然のことながら、実行はまだできない。