Wicket で、Tiny-MCE (1)

Wikcet で、Tiny-MCE を使ったページを生成する方法
  (長いので2回に分けて投稿)
Wicket Stuff が配布している Wicket-contrib-tinymce を sourceforge のサイト
   http://sourceforge.net/projects/wicket-stuff/files/
から、wicket-contrib-tinymce-1.0.jar をダウンロードしてこれを使用してみたが、

この中に梱包されてる Tiny-MCE は古くバージョンが、2.0.6.1 である。
さらに日本語未対応なのでこれを使うのはやめる。

Tiny-MCE は、以下から入手
http://tinymce.moxiecode.com/download.php → tinymce_3_3_9_2.zip
日本語化パックを以下で入手
http://tinymce.moxiecode.com/download_i18n.php → tinymce_lang_pack.zip

tinymce_3_3_9_2.zip を解凍してできるフォルダ tinymce/jscripts/tiny_mce
を起点に必要なものが存在する。

WebContent に、これら tiny_mce/ の下,全てを置くフォルダを WebContent/js/tinymce とするなら、
Wicketorg.apache.wicket.markup.html.IHeaderResponse
renderJavascriptReference は、"js/tinymce/tiny_mce.js" で実行する。
つまり、元の tinymce/jscripts/tiny_mce に存在した tiny_mce.js を指定する。

この、renderJavascriptReference 実行は、Wicket の WebPageクラスで、
<textarea> タグのコンポーネント org.apache.wicket.markup.html.form.TextArea に、
ビヘビアで行う。

ビヘビアは org.apache.wicket.ajax.AbstractDefaultAjaxBehaviorを継承したビヘビアで

renderHead(org.apache.wicket.markup.html.IHeaderResponse)をオーバライドして上記と JavaScript の初期化を行う。
また、onComponentRendered メソッドをオーバライドして、JavaScript をロードするようにする。

このままだと、画面の編集エリア(textarea部分)で文字を入力して改行をすると、
<p> タグで囲まれてしまい改行幅が大きくて使いにくい。
<p>タグで囲まれてしまうことを回避するために、
JavaScript Tiny-MCE 初期化の処理で、tinyMCE.init の中に、
  force_br_newlines : true,
  forced_root_block : '',
  force_p_newlines : false,
を追加する。

用意するビヘビアクラスは、、

import org.apache.wicket.Response;
import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.markup.html.IHeaderResponse;
import org.apache.wicket.util.string.JavascriptUtils;
/**
 * Tiny-MCE ビヘビア
 */

public class TinyMceBehavior extends AbstractDefaultAjaxBehavior {
   private static final long serialVersionUID = 1L;
   boolean ajax;
   public TinyMceBehavior(boolean ajax){
       this.ajax = ajax;
   }
   @Override
   public void renderHead(IHeaderResponse response){

      super.renderHead(response);
      // Tiny-MCE JavaScript path
      response.renderJavascriptReference("js/tinymce/tiny_mce.js");
      // initialize tinyMCE
      StringBuilder initBuilder = new StringBuilder();
      initBuilder.append("tinyMCE.init({\n")
      .append("theme: \"advanced\",\n")
      .append("theme_advanced_toolbar_location : \"top\",\n")
      .append("theme_advanced_toolbar_align : \"left\",\n")
      .append("theme_advanced_buttons1 :\"")
      .append("fontselect,fontsizeselect,undo,redo,separator")
      .append(",forecolor,separator,bold,italic,underline,separator")
      .append(",link,unlink,separator")
      .append(",justifyleft,justifycenter,justifyright,separator")
      .append(",bullist,numlist,separator,outdent,indent")
      .append("\",\n")
      .append("theme_advanced_buttons2 : \"\",\n")
      .append("theme_advanced_buttons3 : \"\",\n")
      .append("force_br_newlines : true,\n")
      .append("forced_root_block : '',\n")
      .append("force_p_newlines : false,\n")

      .append("mode : \"exact\"\n")
      .append("});");
      response.renderJavascript(initBuilder.toString(), "init");
   }

   @Override
   protected void onComponentRendered(){

       super.onComponentRendered();
       if (this.ajax) {
           // load editor script
           Response response = getComponent().getResponse();
           JavascriptUtils.writeJavascript(response,getCallbackScript(),"load");
       } else {
           Response response = getComponent().getResponse();
           JavascriptUtils.writeJavascript(response
,"tinyMCE.execCommand('mceAddControl',true,'"+getComponent().getMarkupId()+"');");
       }

   }
   @Override
   protected void respond(AjaxRequestTarget target){

       StringBuilder builder = new StringBuilder();
       builder.append("\ntinyMCE.execCommand(
'mceAddControl',true,'"+getComponent().getMarkupId()+"');");


       //target.appendJavascript(JavascriptUtils.SCRIPT_OPEN_TAG);
       target.appendJavascript(builder.toString());
       //target.appendJavascript(JavascriptUtils.SCRIPT_CLOSE_TAG);
   }
}

=======================
次回は、日本語化の設定方法