Topcoder エディタプラグイン作成 メモ

TopcoderではいつもEclipseCoderを使っているが,ちょっと気になったのでArenaのエディタプラグインを作る方法を調べてみた.

参考URL:http://www.topcoder.com/contest/classes/How%20to%20create%20an%20Editor%20Plugin%20v3.htm


とりあえず最小限の実装が以下の通り.これをコンパイルしておく.

public class Main{
	public JPanel getEditorPanel(){
		return null;
	}
	
	public String getSource(){
		return "";
	}

	public void setSource(String source){
		
	}
}

使い方
1. アリーナを開く http://www.topcoder.com/contest/arena/ContestAppletProd.jnlp
2. アリーナ上部の「Options」の「Editor」を選択.
3. 「Ediror Preferences」が開かれたら左下の「Add」を選択する.
4. 「Name」はテキトーに,「EntryPoint」は作った実装のクラス名でいい.以上の実装ならばMainとだけ書けば良い.「ClassPath」は実装のクラスファイルのあるディレクトリを選択する.
5. あとは「Practices」でテキトーな部屋に入って問題開いて右上の「Choose your editor」でさっき「Name」のところに入力した名前を選択すれば動く.

上の実装だと何もされず,他のエディタプラグインを選んでも動かないと思うのでアリーナ自体を再起動すれば直る.

自分のエディタプラグインを動かしても他のエディタプラグインがちゃんと動くようにする版.

import javax.swing.JPanel;

public class Main{
	public JPanel getEditorPanel(){
		return new JPanel();
	}
	
	public String getSource(){
		return "";
	}

	public void setSource(String source){
		
	}
}

これを新しくコンパイルしても「Editor Preferences」ですでに設定してるならアリーナを再起動するだけでいいはず.
このエディタを起動してStandardと比べるとわかるけど,Standardのundoとかのボタンは自作エディタプラグインの方だと消えるはず.つまりStandardエディタプラグインの方に付属した機能ということがわかる.

テキトーに解説.
・getEditorPanel()は問題を開いたときの下半分の中身に相当する部分を返す必要がある.試しに「new JPanel(){{this.setBackground(java.awt.Color.red);}}」なんかを返して起動してみて,問題を開いたときの真ん中のディバイダを動かしてみると赤くなるはず.
・getSource()は「save」や「compile」などを選択したさいにTopcoderのサーバに送信されるソースコードを返す必要がある.この文字列をテキトーに入れて起動してみてcompileするとそのコードがエラーとして出力されるはず.
・setSource(String)はすでにTopcoderのサーバに「save」や「submit」などによって送信されているソースコードが存在する場合に引数の文字列に入って渡される.なにもないと空文字列.


組み込みのエディタを作ろうとするならAWT/Swingの知識が必要になると思う.たとえばJTextAreaとかJEditPaneとかJScrollPaneとかを使うとか,右クリックでポップアップ出すならMouseListenerの実装が必要だとか.まあ,大抵の場合は外部のエディタやIDEの方が高機能なので必要ないと思う.

自分がやろうとしてたのは問題とかサンプルケースとかを取得してきたかったのだけどうまくいかなかったので後で書くかも.現状は以下のとおり.
・問題やサンプルコードの文字列はsetProblem(String)を実装すれば引数にまとめて渡される.(ただし非推奨)
・public void setProblemComponent(com.topcoder.client.contestant.ProblemComponentModel, com.topcoder.shared.language.Language, com.topcoder.shared.problem.Renderer)
を実装するとProblemComponentModelが問題やサンプルケース相当データを持っているらしいが,このメソッドを実装していることをアリーナの方が認識してくれない.
ちなみにcom.topcoder.client.contestantパッケージなんかを使おうとしてコンパイルする場合はアリーナに含まれるクラスをクラスパスに渡せばいい.
取得URL:http://www.topcoder.com/contest/classes/ContestApplet.jar
自分はクラスパスに記述したりするのが面倒なので,これを同じディレクトリに解凍している.(これが認識してくれない原因?)
KawigiEditやEclipseCoderなどの実装を見てみてもこのメソッドを実装してちゃんと動いているようなのでちゃんとすれば動くと思うけどどうなんだろうか.

CodeProcessorとかを利用したほうがいいのかもしれないけどまあいいや.

現状以上.

>追記
どうやってアリーナがメソッドを実装してるかを確認してるかというと,ContestApplet.jarを解凍して実行するとログとして出力される.実行の仕方はContestAppletProd.jnlpのapplication-descタグのなかに書いてる.具体的には解凍したディレクトリで

java com.topcoder.client.contestApplet.runner.generic www.topcoder.com 5001 http://tunnel1.topcoder.com/tunnel?dummy TopCoder

と打つと良い.面倒くさい場合は上記の内容のシェルで起動すればいい.ログが出力されるタイミングは参考URLのライフサイクルのタイミング.